summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/asn1/c_src/Makefile5
-rw-r--r--lib/asn1/c_src/asn1_erl_nif.c8
-rw-r--r--lib/asn1/doc/src/notes.xml8
-rw-r--r--lib/asn1/examples/ecn_internaldoc.txt2
-rw-r--r--lib/asn1/examples/encode_decode_formats.txt2
-rw-r--r--lib/asn1/notes.html10
-rw-r--r--lib/asn1/src/Makefile4
-rw-r--r--lib/asn1/src/asn1ct.erl10
-rw-r--r--lib/asn1/src/asn1ct_check.erl18
-rw-r--r--lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl14
-rw-r--r--lib/asn1/src/asn1ct_gen.erl2
-rw-r--r--lib/asn1/src/asn1ct_gen_ber_bin_v2.erl6
-rw-r--r--lib/asn1/src/asn1ct_gen_jer.erl2
-rw-r--r--lib/asn1/src/asn1ct_imm.erl16
-rw-r--r--lib/asn1/src/asn1ct_parser2.erl4
-rw-r--r--lib/asn1/src/asn1ct_pretty_format.erl4
-rw-r--r--lib/asn1/src/asn1ct_tok.erl2
-rw-r--r--lib/asn1/src/asn1rtt_ber.erl6
-rw-r--r--lib/asn1/src/asn1rtt_real_common.erl4
-rw-r--r--lib/asn1/test/Makefile4
-rw-r--r--lib/asn1/test/asn1_SUITE.erl17
-rw-r--r--lib/asn1/test/asn1_SUITE_data/Comment.asn2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/CommonDataTypes.py6
-rw-r--r--lib/asn1/test/asn1_SUITE_data/EUTRA-RRC-Definitions.asn2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/H235-SECURITY-MESSAGES.asn2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/IN-CS-1-Datatypes.asn2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/Mvrasn-11-4.asn4
-rw-r--r--lib/asn1/test/asn1_SUITE_data/Nortel.asn4
-rw-r--r--lib/asn1/test/asn1_SUITE_data/PKIX1Explicit93.asn12
-rw-r--r--lib/asn1/test/asn1_SUITE_data/RANAP.asn14
-rw-r--r--lib/asn1/test/asn1_SUITE_data/SwCDR.py2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/nbapsystem/NBAP-PDU-Contents.asn6
-rw-r--r--lib/asn1/test/asn1_SUITE_data/rfcs/AlgorithmInformation-2009.asn12
-rw-r--r--lib/asn1/test/asn1_SUITE_data/rfcs/ISO8571-FTAM.asn16
-rw-r--r--lib/asn1/test/asn1_SUITE_data/tcapsystem/MAP-MS-DataTypes.asn2
-rw-r--r--lib/asn1/test/asn1_SUITE_data/testobj.erl12
-rw-r--r--lib/asn1/test/syntax_SUITE.erl2
-rw-r--r--lib/common_test/Makefile1
-rwxr-xr-xlib/common_test/configure1047
-rw-r--r--lib/common_test/configure.ac14
-rw-r--r--lib/common_test/configure.in14
-rw-r--r--lib/common_test/doc/src/ct.xml4
-rw-r--r--lib/common_test/doc/src/ct_hooks.xml4
-rw-r--r--lib/common_test/doc/src/ct_hooks_chapter.xml4
-rw-r--r--lib/common_test/doc/src/ct_netconfc.xml4
-rw-r--r--lib/common_test/doc/src/ct_property_test.xml2
-rw-r--r--lib/common_test/doc/src/ct_ssh.xml4
-rw-r--r--lib/common_test/doc/src/ct_suite.xml4
-rw-r--r--lib/common_test/doc/src/dependencies_chapter.xml2
-rw-r--r--lib/common_test/doc/src/event_handler_chapter.xml4
-rw-r--r--lib/common_test/doc/src/notes.xml22
-rw-r--r--lib/common_test/doc/src/unix_telnet.xml4
-rw-r--r--lib/common_test/doc/src/write_test_chapter.xml2
-rw-r--r--lib/common_test/include/ct.hrl11
-rwxr-xr-xlib/common_test/priv/auxdir/config.guess1700
-rwxr-xr-xlib/common_test/priv/auxdir/config.sub1860
-rwxr-xr-xlib/common_test/priv/auxdir/install-sh541
-rw-r--r--lib/common_test/src/Makefile4
-rw-r--r--lib/common_test/src/common_test.app.src14
-rw-r--r--lib/common_test/src/ct.erl6
-rw-r--r--lib/common_test/src/ct_config.erl2
-rw-r--r--lib/common_test/src/ct_framework.erl6
-rw-r--r--lib/common_test/src/ct_gen_conn.erl2
-rw-r--r--lib/common_test/src/ct_groups.erl2
-rw-r--r--lib/common_test/src/ct_hooks.erl8
-rw-r--r--lib/common_test/src/ct_hooks_lock.erl8
-rw-r--r--lib/common_test/src/ct_logs.erl2
-rw-r--r--lib/common_test/src/ct_netconfc.erl2
-rw-r--r--lib/common_test/src/ct_release_test.erl12
-rw-r--r--lib/common_test/src/ct_run.erl8
-rw-r--r--lib/common_test/src/ct_slave.erl4
-rw-r--r--lib/common_test/src/ct_snmp.erl4
-rw-r--r--lib/common_test/src/ct_telnet.erl6
-rw-r--r--lib/common_test/src/cth_surefire.erl173
-rw-r--r--lib/common_test/src/erl2html2.erl4
-rw-r--r--lib/common_test/src/test_server.erl150
-rw-r--r--lib/common_test/src/test_server_ctrl.erl163
-rw-r--r--lib/common_test/src/test_server_node.erl246
-rw-r--r--lib/common_test/src/test_server_sup.erl4
-rw-r--r--lib/common_test/test/Makefile4
-rw-r--r--lib/common_test/test/ct_auto_clean_SUITE_data/cth_auto_clean.erl4
-rw-r--r--lib/common_test/test/ct_error_SUITE.erl2
-rw-r--r--lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_8_SUITE.erl6
-rw-r--r--lib/common_test/test/ct_group_leader_SUITE_data/group_leader_SUITE.erl4
-rw-r--r--lib/common_test/test/ct_hooks_SUITE.erl4
-rw-r--r--lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl4
-rw-r--r--lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl2
-rw-r--r--lib/common_test/test/ct_surefire_SUITE.erl62
-rw-r--r--lib/common_test/test/ct_surefire_SUITE_data/surefire_SUITE.erl12
-rw-r--r--lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_basic_SUITE.erl2
-rw-r--r--lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_timetrap_SUITE.erl2
-rw-r--r--lib/common_test/test/erl2html2_SUITE.erl4
-rw-r--r--lib/common_test/test_server/Makefile9
-rwxr-xr-xlib/common_test/test_server/configure3075
-rw-r--r--lib/common_test/test_server/configure.ac (renamed from lib/common_test/test_server/configure.in)99
-rw-r--r--lib/common_test/test_server/ts.erl15
-rw-r--r--lib/common_test/test_server/ts.hrl6
-rw-r--r--lib/common_test/test_server/ts_install.erl4
-rw-r--r--lib/common_test/test_server/ts_run.erl4
-rw-r--r--lib/compiler/Makefile8
-rw-r--r--lib/compiler/doc/src/compile.xml10
-rw-r--r--lib/compiler/doc/src/notes.xml14
-rw-r--r--lib/compiler/internal_doc/beam_ssa.md107
-rw-r--r--lib/compiler/src/Makefile24
-rw-r--r--lib/compiler/src/beam_asm.erl82
-rw-r--r--lib/compiler/src/beam_asm.hrl44
-rw-r--r--lib/compiler/src/beam_block.erl79
-rw-r--r--lib/compiler/src/beam_call_types.erl312
-rw-r--r--lib/compiler/src/beam_clean.erl145
-rw-r--r--lib/compiler/src/beam_dict.erl84
-rw-r--r--lib/compiler/src/beam_disasm.erl177
-rw-r--r--lib/compiler/src/beam_flatten.erl2
-rw-r--r--lib/compiler/src/beam_jump.erl74
-rw-r--r--lib/compiler/src/beam_kernel_to_ssa.erl281
-rw-r--r--lib/compiler/src/beam_listing.erl27
-rw-r--r--lib/compiler/src/beam_peep.erl223
-rw-r--r--lib/compiler/src/beam_ssa.erl32
-rw-r--r--lib/compiler/src/beam_ssa_bc_size.erl75
-rw-r--r--lib/compiler/src/beam_ssa_bool.erl4
-rw-r--r--lib/compiler/src/beam_ssa_bsm.erl25
-rw-r--r--lib/compiler/src/beam_ssa_codegen.erl298
-rw-r--r--lib/compiler/src/beam_ssa_dead.erl477
-rw-r--r--lib/compiler/src/beam_ssa_funs.erl152
-rw-r--r--lib/compiler/src/beam_ssa_opt.erl914
-rw-r--r--lib/compiler/src/beam_ssa_pp.erl149
-rw-r--r--lib/compiler/src/beam_ssa_pre_codegen.erl584
-rw-r--r--lib/compiler/src/beam_ssa_recv.erl46
-rw-r--r--lib/compiler/src/beam_ssa_share.erl47
-rw-r--r--lib/compiler/src/beam_ssa_throw.erl18
-rw-r--r--lib/compiler/src/beam_ssa_type.erl857
-rw-r--r--lib/compiler/src/beam_trim.erl709
-rw-r--r--lib/compiler/src/beam_types.erl156
-rw-r--r--lib/compiler/src/beam_types.hrl19
-rw-r--r--lib/compiler/src/beam_utils.erl35
-rw-r--r--lib/compiler/src/beam_validator.erl496
-rw-r--r--lib/compiler/src/beam_z.erl52
-rw-r--r--lib/compiler/src/cerl_inline.erl10
-rw-r--r--lib/compiler/src/compile.erl172
-rw-r--r--lib/compiler/src/compiler.app.src8
-rwxr-xr-xlib/compiler/src/genop.tab41
-rw-r--r--lib/compiler/src/rec_env.erl2
-rw-r--r--lib/compiler/src/sys_core_bsm.erl2
-rw-r--r--lib/compiler/src/sys_core_fold.erl64
-rw-r--r--lib/compiler/src/v3_core.erl569
-rw-r--r--lib/compiler/src/v3_kernel.erl158
-rw-r--r--lib/compiler/src/v3_kernel.hrl4
-rw-r--r--lib/compiler/src/v3_kernel_pp.erl7
-rw-r--r--lib/compiler/test/Makefile39
-rw-r--r--lib/compiler/test/beam_except_SUITE.erl26
-rw-r--r--lib/compiler/test/beam_jump_SUITE.erl9
-rw-r--r--lib/compiler/test/beam_ssa_SUITE.erl38
-rw-r--r--lib/compiler/test/beam_type_SUITE.erl164
-rw-r--r--lib/compiler/test/beam_utils_SUITE.erl8
-rw-r--r--lib/compiler/test/beam_validator_SUITE.erl6
-rw-r--r--lib/compiler/test/bs_bincomp_SUITE.erl12
-rw-r--r--lib/compiler/test/bs_construct_SUITE.erl6
-rw-r--r--lib/compiler/test/bs_match_SUITE.erl30
-rw-r--r--lib/compiler/test/compilation_SUITE_data/compiler_1.erl10
-rw-r--r--lib/compiler/test/compilation_SUITE_data/convopts.erl4
-rw-r--r--lib/compiler/test/compilation_SUITE_data/opt_crash.erl4
-rw-r--r--lib/compiler/test/compilation_SUITE_data/otp_4790.erl4
-rw-r--r--lib/compiler/test/compile_SUITE.erl354
-rw-r--r--lib/compiler/test/compile_SUITE_data/asm_labels.erl (renamed from lib/diameter/test/diameter_ct.hrl)31
-rw-r--r--lib/compiler/test/compile_SUITE_data/big.erl10
-rw-r--r--lib/compiler/test/compile_SUITE_data/bigE.erl22
-rw-r--r--lib/compiler/test/compile_SUITE_data/funs.erl8
-rw-r--r--lib/compiler/test/compile_SUITE_data/types_pp.erl127
-rw-r--r--lib/compiler/test/core_fold_SUITE.erl2
-rw-r--r--lib/compiler/test/fun_SUITE.erl236
-rw-r--r--lib/compiler/test/guard_SUITE.erl178
-rw-r--r--lib/compiler/test/inline_SUITE.erl4
-rw-r--r--lib/compiler/test/lc_SUITE.erl4
-rw-r--r--lib/compiler/test/match_SUITE.erl10
-rw-r--r--lib/compiler/test/maybe_SUITE.erl278
-rw-r--r--lib/compiler/test/misc_SUITE.erl11
-rw-r--r--lib/compiler/test/receive_SUITE.erl2
-rw-r--r--lib/compiler/test/receive_SUITE_data/ref_opt/yes_10.erl2
-rw-r--r--lib/compiler/test/receive_SUITE_data/ref_opt/yes_11.erl2
-rw-r--r--lib/compiler/test/record_SUITE.erl24
-rw-r--r--lib/compiler/test/record_SUITE_data/record_access_in_guards.erl4
-rw-r--r--lib/compiler/test/test_lib.erl11
-rw-r--r--lib/compiler/test/trycatch_SUITE.erl8
-rw-r--r--lib/compiler/test/warnings_SUITE.erl28
-rw-r--r--lib/crypto/c_src/Makefile.in5
-rw-r--r--lib/crypto/c_src/bn.c41
-rw-r--r--lib/crypto/c_src/bn.h8
-rw-r--r--lib/crypto/c_src/common.h4
-rw-r--r--lib/crypto/c_src/crypto.c9
-rw-r--r--lib/crypto/c_src/dh.c370
-rw-r--r--lib/crypto/c_src/dss.c117
-rw-r--r--lib/crypto/c_src/ec.c26
-rw-r--r--lib/crypto/c_src/ec.h4
-rw-r--r--lib/crypto/c_src/ecdh.c41
-rw-r--r--lib/crypto/c_src/evp.c69
-rw-r--r--lib/crypto/c_src/hash.c186
-rw-r--r--lib/crypto/c_src/hash_equals.c51
-rw-r--r--lib/crypto/c_src/hash_equals.h28
-rw-r--r--lib/crypto/c_src/pbkdf2_hmac.c38
-rw-r--r--lib/crypto/c_src/pkey.c1438
-rw-r--r--lib/crypto/c_src/rsa.c320
-rwxr-xr-xlib/crypto/configure5688
-rw-r--r--lib/crypto/configure.ac971
-rw-r--r--lib/crypto/configure.in871
-rw-r--r--lib/crypto/doc/src/crypto.xml171
-rw-r--r--lib/crypto/src/Makefile4
-rw-r--r--lib/crypto/src/crypto.app.src4
-rw-r--r--lib/crypto/src/crypto.erl183
-rw-r--r--lib/crypto/test/Makefile3
-rw-r--r--lib/crypto/test/crypto.spec4
-rw-r--r--lib/crypto/test/crypto_SUITE.erl64
-rw-r--r--lib/crypto/test/crypto_gh.spec5
-rw-r--r--lib/crypto/test/engine_SUITE.erl4
-rw-r--r--lib/debugger/doc/src/notes.xml4
-rw-r--r--lib/debugger/priv/Makefile4
-rw-r--r--lib/debugger/src/Makefile4
-rw-r--r--lib/debugger/src/dbg_icmd.erl34
-rw-r--r--lib/debugger/src/dbg_ieval.erl17
-rw-r--r--lib/debugger/src/dbg_iload.erl2
-rw-r--r--lib/debugger/src/dbg_wx_break_win.erl6
-rw-r--r--lib/debugger/src/dbg_wx_settings.erl59
-rw-r--r--lib/debugger/src/i.erl4
-rw-r--r--lib/debugger/test/Makefile4
-rw-r--r--lib/debugger/test/bs_match_int_SUITE.erl4
-rw-r--r--lib/debugger/test/dbg_ui_SUITE.erl8
-rw-r--r--lib/debugger/test/dbg_ui_SUITE_data/manual_data/src/lists1.erl6
-rw-r--r--lib/debugger/test/exception_SUITE.erl2
-rw-r--r--lib/debugger/test/fun_SUITE.erl4
-rw-r--r--lib/debugger/test/guard_SUITE.erl6
-rw-r--r--lib/debugger/test/int_SUITE_data/lists1.erl6
-rw-r--r--lib/debugger/test/int_SUITE_data/my_lists.erl18
-rw-r--r--lib/debugger/test/int_eval_SUITE.erl2
-rw-r--r--lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl2
-rw-r--r--lib/debugger/test/trycatch_SUITE.erl4
-rw-r--r--lib/dialyzer/RELEASE_NOTES2
-rw-r--r--lib/dialyzer/doc/src/dialyzer.xml27
-rw-r--r--lib/dialyzer/doc/src/dialyzer_chapter.xml8
-rw-r--r--lib/dialyzer/doc/src/typer_cmd.xml6
-rw-r--r--lib/dialyzer/src/Makefile15
-rw-r--r--lib/dialyzer/src/cerl_closurean.erl856
-rw-r--r--lib/dialyzer/src/cerl_lib.erl457
-rw-r--r--lib/dialyzer/src/cerl_pmatch.erl620
-rw-r--r--lib/dialyzer/src/cerl_typean.erl994
-rw-r--r--lib/dialyzer/src/dialyzer.app.src20
-rw-r--r--lib/dialyzer/src/dialyzer.erl4
-rw-r--r--lib/dialyzer/src/dialyzer.hrl8
-rw-r--r--lib/dialyzer/src/dialyzer_analysis_callgraph.erl37
-rw-r--r--lib/dialyzer/src/dialyzer_behaviours.erl8
-rw-r--r--lib/dialyzer/src/dialyzer_callgraph.erl236
-rw-r--r--lib/dialyzer/src/dialyzer_cl.erl27
-rw-r--r--lib/dialyzer/src/dialyzer_cl_parse.erl2
-rw-r--r--lib/dialyzer/src/dialyzer_clean_core.erl12
-rw-r--r--lib/dialyzer/src/dialyzer_codeserver.erl21
-rw-r--r--lib/dialyzer/src/dialyzer_contracts.erl127
-rw-r--r--lib/dialyzer/src/dialyzer_coordinator.erl253
-rw-r--r--lib/dialyzer/src/dialyzer_dataflow.erl1293
-rw-r--r--lib/dialyzer/src/dialyzer_dep.erl72
-rw-r--r--lib/dialyzer/src/dialyzer_dot.erl8
-rw-r--r--lib/dialyzer/src/dialyzer_gui_wx.erl3
-rw-r--r--lib/dialyzer/src/dialyzer_gui_wx.hrl5
-rw-r--r--lib/dialyzer/src/dialyzer_options.erl38
-rw-r--r--lib/dialyzer/src/dialyzer_plt.erl45
-rw-r--r--lib/dialyzer/src/dialyzer_race_data_server.erl127
-rw-r--r--lib/dialyzer/src/dialyzer_races.erl2483
-rw-r--r--lib/dialyzer/src/dialyzer_succ_typings.erl533
-rw-r--r--lib/dialyzer/src/dialyzer_typegraph.erl109
-rw-r--r--lib/dialyzer/src/dialyzer_typesig.erl673
-rw-r--r--lib/dialyzer/src/dialyzer_utils.erl185
-rw-r--r--lib/dialyzer/src/dialyzer_worker.erl119
-rw-r--r--lib/dialyzer/src/erl_bif_types.erl34
-rw-r--r--lib/dialyzer/src/erl_types.erl703
-rw-r--r--lib/dialyzer/src/typer.erl978
-rw-r--r--lib/dialyzer/src/typer_core.erl1031
-rw-r--r--lib/dialyzer/test/Makefile3
-rw-r--r--lib/dialyzer/test/behaviour_SUITE_data/results/gen_server_incorrect_args2
-rw-r--r--lib/dialyzer/test/dialyzer.spec6
-rw-r--r--lib/dialyzer/test/dialyzer_SUITE.erl6
-rw-r--r--lib/dialyzer/test/dialyzer_cl_SUITE.erl129
-rw-r--r--lib/dialyzer/test/dialyzer_cl_SUITE_data/call_to_missing_example.erl5
-rw-r--r--lib/dialyzer/test/dialyzer_cl_SUITE_data/previously_defined.erl5
-rw-r--r--lib/dialyzer/test/dialyzer_cl_SUITE_data/unknown_function_example.erl5
-rw-r--r--lib/dialyzer/test/dialyzer_common.erl17
-rw-r--r--lib/dialyzer/test/erl_types_SUITE.erl75
-rw-r--r--lib/dialyzer/test/indent_SUITE_data/dialyzer_options2
-rw-r--r--lib/dialyzer/test/indent_SUITE_data/results/whereis_control_flow14
-rw-r--r--lib/dialyzer/test/indent_SUITE_data/src/whereis_control_flow1.erl17
-rw-r--r--lib/dialyzer/test/map_SUITE_data/results/opaque_key4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/para32
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/big_external_type.erl4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/big_local_type.erl4
-rw-r--r--lib/dialyzer/test/plt_SUITE.erl481
-rw-r--r--lib/dialyzer/test/plt_SUITE_data/type_deps.erl18
-rw-r--r--lib/dialyzer/test/property_test/erl_types_prop.erl230
-rw-r--r--lib/dialyzer/test/race_SUITE_data/dialyzer_options1
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args102
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args30
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_args82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow33
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow43
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow55
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_double14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_double24
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_new0
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_param5
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/ets_insert_public2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/extract_translations5
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow43
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race0
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race0
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_param2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module2
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch3
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars10
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars102
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars110
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars122
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars132
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars142
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars152
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars162
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars172
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars180
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars190
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars200
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars210
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars222
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars42
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars52
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars62
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars72
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars82
-rw-r--r--lib/dialyzer/test/race_SUITE_data/results/whereis_vars92
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args10.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1_suppressed.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl26
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl31
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl31
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl34
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl28
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl28
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl15
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl26
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl293
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl33
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl37
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl34
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl30
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl20
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl21
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl32
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl29
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl26
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl12
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl21
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl11
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl14
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl16
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl8
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl13
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl24
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl21
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl24
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl19
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl25
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl17
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl23
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl27
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl18
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl22
-rw-r--r--lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl22
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/fun_hangs2
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/gencall8
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/guards4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/results/try21
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/big_external_type.erl4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/big_local_type.erl4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/binary_redef.erl22
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/fun_named.erl10
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/gencall.erl4
-rw-r--r--lib/dialyzer/test/small_SUITE_data/src/guards.erl21
-rw-r--r--lib/diameter/Makefile1
-rw-r--r--lib/diameter/doc/src/notes.xml8
-rw-r--r--lib/diameter/src/Makefile6
-rw-r--r--lib/diameter/src/base/diameter_callback.erl4
-rw-r--r--lib/diameter/src/base/diameter_reg.erl4
-rw-r--r--lib/diameter/src/base/diameter_service.erl6
-rw-r--r--lib/diameter/src/base/diameter_types.erl12
-rw-r--r--lib/diameter/src/diameter.app.src4
-rw-r--r--lib/diameter/src/diameter.appup.src16
-rw-r--r--lib/diameter/src/info/diameter_info.erl2
-rw-r--r--lib/diameter/src/transport/diameter_tcp.erl19
-rw-r--r--lib/diameter/test/Makefile41
-rw-r--r--lib/diameter/test/diameter.spec1
-rw-r--r--lib/diameter/test/diameter_3xxx_SUITE.erl152
-rw-r--r--lib/diameter/test/diameter_app_SUITE.erl118
-rw-r--r--lib/diameter/test/diameter_capx_SUITE.erl208
-rw-r--r--lib/diameter/test/diameter_codec_SUITE.erl167
-rw-r--r--lib/diameter/test/diameter_codec_test.erl4
-rw-r--r--lib/diameter/test/diameter_compiler_SUITE.erl135
-rw-r--r--lib/diameter/test/diameter_config_SUITE.erl74
-rw-r--r--lib/diameter/test/diameter_dist_SUITE.erl156
-rw-r--r--lib/diameter/test/diameter_distribution_SUITE.erl185
-rw-r--r--lib/diameter/test/diameter_dpr_SUITE.erl125
-rw-r--r--lib/diameter/test/diameter_event_SUITE.erl78
-rw-r--r--lib/diameter/test/diameter_examples_SUITE.erl290
-rw-r--r--lib/diameter/test/diameter_failover_SUITE.erl102
-rw-r--r--lib/diameter/test/diameter_gen_sctp_SUITE.erl39
-rw-r--r--lib/diameter/test/diameter_gen_tcp_SUITE.erl37
-rw-r--r--lib/diameter/test/diameter_gh.spec2
-rw-r--r--lib/diameter/test/diameter_length_SUITE.erl84
-rw-r--r--lib/diameter/test/diameter_pool_SUITE.erl97
-rw-r--r--lib/diameter/test/diameter_reg_SUITE.erl82
-rw-r--r--lib/diameter/test/diameter_relay_SUITE.erl161
-rw-r--r--lib/diameter/test/diameter_stats_SUITE.erl71
-rw-r--r--lib/diameter/test/diameter_sync_SUITE.erl81
-rw-r--r--lib/diameter/test/diameter_tls_SUITE.erl190
-rw-r--r--lib/diameter/test/diameter_traffic_SUITE.erl519
-rw-r--r--lib/diameter/test/diameter_transport_SUITE.erl123
-rw-r--r--lib/diameter/test/diameter_util.erl241
-rw-r--r--lib/diameter/test/diameter_watchdog_SUITE.erl129
-rw-r--r--lib/diameter/test/modules.mk7
-rw-r--r--lib/edoc/bin/Makefile4
-rw-r--r--lib/edoc/doc/Makefile2
-rw-r--r--lib/edoc/include/Makefile2
-rw-r--r--lib/edoc/priv/Makefile2
-rw-r--r--lib/edoc/src/Makefile2
-rw-r--r--lib/edoc/src/edoc.app.src2
-rw-r--r--lib/edoc/src/edoc.erl2
-rw-r--r--lib/edoc/src/edoc_doclet_chunks.erl16
-rw-r--r--lib/edoc/src/edoc_layout_chunks.erl87
-rw-r--r--lib/edoc/src/edoc_tags.erl1
-rw-r--r--lib/edoc/src/edoc_types.erl28
-rw-r--r--lib/edoc/src/edoc_wiki.erl2
-rw-r--r--lib/edoc/test/Makefile2
-rw-r--r--lib/eldap/doc/src/eldap.xml1
-rw-r--r--lib/eldap/src/Makefile6
-rw-r--r--lib/eldap/src/eldap.app.src2
-rw-r--r--lib/eldap/test/Makefile4
-rw-r--r--lib/erl_docgen/doc/src/doc_storage.xml2
-rw-r--r--lib/erl_docgen/priv/bin/Makefile4
-rwxr-xr-xlib/erl_docgen/priv/bin/github_link.escript4
-rwxr-xr-xlib/erl_docgen/priv/bin/validate_links.escript23
-rw-r--r--lib/erl_docgen/priv/css/Makefile4
-rw-r--r--lib/erl_docgen/priv/dtd/Makefile4
-rw-r--r--lib/erl_docgen/priv/dtd_html_entities/Makefile4
-rw-r--r--lib/erl_docgen/priv/dtd_man_entities/Makefile4
-rw-r--r--lib/erl_docgen/priv/images/Makefile4
-rw-r--r--lib/erl_docgen/priv/js/flipmenu/Makefile4
-rw-r--r--lib/erl_docgen/priv/xsl/Makefile4
-rw-r--r--lib/erl_docgen/priv/xsl/db_html.xsl2
-rw-r--r--lib/erl_docgen/src/Makefile4
-rw-r--r--lib/erl_docgen/src/docgen_edoc_xml_cb.erl6
-rw-r--r--lib/erl_docgen/src/docgen_otp_specs.erl2
-rw-r--r--lib/erl_docgen/src/docgen_xml_to_chunk.erl49
-rw-r--r--lib/erl_docgen/src/erl_docgen.app.src2
-rw-r--r--lib/erl_docgen/test/Makefile2
-rw-r--r--lib/erl_interface/config.h.in35
-rwxr-xr-xlib/erl_interface/configure6233
-rw-r--r--lib/erl_interface/configure.ac (renamed from lib/erl_interface/configure.in)76
-rw-r--r--lib/erl_interface/doc/src/ei_connect.xml30
-rw-r--r--lib/erl_interface/doc/src/ei_users_guide.xml4
-rw-r--r--lib/erl_interface/doc/src/notes.xml4
-rw-r--r--lib/erl_interface/include/ei.h8
-rw-r--r--lib/erl_interface/src/Makefile6
-rw-r--r--lib/erl_interface/src/Makefile.in7
-rw-r--r--lib/erl_interface/src/README.internal14
-rwxr-xr-xlib/erl_interface/src/auxdir/config.guess1700
-rwxr-xr-xlib/erl_interface/src/auxdir/config.sub1860
-rwxr-xr-xlib/erl_interface/src/auxdir/install-sh541
-rw-r--r--lib/erl_interface/src/connect/ei_connect.c77
-rw-r--r--lib/erl_interface/src/connect/ei_connect_int.h38
-rw-r--r--lib/erl_interface/src/connect/eirecv.c6
-rw-r--r--lib/erl_interface/src/connect/send_exit.c4
-rw-r--r--lib/erl_interface/src/decode/decode_atom.c4
-rw-r--r--lib/erl_interface/src/decode/decode_fun.c4
-rw-r--r--lib/erl_interface/src/encode/encode_atom.c4
-rw-r--r--lib/erl_interface/src/epmd/epmd_unpublish.c4
-rw-r--r--lib/erl_interface/src/misc/ei_compat.c8
-rw-r--r--lib/erl_interface/src/misc/ei_internal.h4
-rw-r--r--lib/erl_interface/src/misc/ei_pthreads.c2
-rw-r--r--lib/erl_interface/src/misc/eimd5.c2
-rw-r--r--lib/erl_interface/src/misc/show_msg.c18
-rw-r--r--lib/erl_interface/src/prog/erl_call.c14
-rw-r--r--lib/erl_interface/test/Makefile4
-rw-r--r--lib/erl_interface/test/all_SUITE_data/ei_runner.c2
-rw-r--r--lib/erl_interface/test/all_SUITE_data/reclaim.h152
-rw-r--r--lib/erl_interface/test/ei_accept_SUITE.erl28
-rw-r--r--lib/erl_interface/test/ei_accept_SUITE_data/eiaccnode.c4
-rw-r--r--lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c2
-rw-r--r--lib/erl_interface/test/ei_connect_SUITE_data/einode.c2
-rw-r--r--lib/erl_interface/test/ei_decode_SUITE.erl4
-rw-r--r--lib/erl_interface/test/ei_encode_SUITE.erl2
-rw-r--r--lib/erl_interface/test/ei_global_SUITE_data/ei_global_test.c2
-rw-r--r--lib/erl_interface/test/ei_tmo_SUITE.erl169
-rw-r--r--lib/et/doc/src/et_desc.xmlsrc4
-rw-r--r--lib/et/examples/Makefile4
-rw-r--r--lib/et/src/Makefile6
-rw-r--r--lib/et/src/et.erl4
-rw-r--r--lib/et/src/et_selector.erl4
-rw-r--r--lib/et/src/et_wx_viewer.erl2
-rw-r--r--lib/et/test/Makefile4
-rw-r--r--lib/eunit/examples/Makefile2
-rw-r--r--lib/eunit/src/Makefile4
-rw-r--r--lib/eunit/src/eunit_data.erl9
-rw-r--r--lib/eunit/src/eunit_lib.erl23
-rw-r--r--lib/eunit/test/Makefile4
-rw-r--r--lib/ftp/src/Makefile4
-rw-r--r--lib/ftp/src/ftp.erl4
-rw-r--r--lib/ftp/src/ftp_progress.erl6
-rw-r--r--lib/ftp/src/ftp_response.erl10
-rw-r--r--lib/ftp/test/Makefile5
-rw-r--r--lib/ftp/test/erl_make_certs.erl474
-rw-r--r--lib/ftp/test/ftp_SUITE.erl16
-rw-r--r--lib/ftp/test/ftp_SUITE_data/vsftpd.conf2
-rw-r--r--lib/ftp/test/ftp_format_SUITE.erl22
-rw-r--r--lib/ftp/test/ftp_test_lib.erl33
-rw-r--r--lib/ftp/test/property_test/ftp_simple_client_server_data/vsftpd.conf2
-rw-r--r--lib/inets/doc/src/http_uri.xml91
-rw-r--r--lib/inets/doc/src/httpd_util.xml5
-rw-r--r--lib/inets/doc/src/notes.xml3
-rw-r--r--lib/inets/examples/httpd_load_test/Makefile6
-rw-r--r--lib/inets/examples/server_root/Makefile4
-rw-r--r--lib/inets/priv/Makefile4
-rw-r--r--lib/inets/src/http_client/Makefile4
-rw-r--r--lib/inets/src/http_client/httpc_handler.erl4
-rw-r--r--lib/inets/src/http_lib/Makefile4
-rw-r--r--lib/inets/src/http_lib/http_request.erl8
-rw-r--r--lib/inets/src/http_lib/http_uri.erl258
-rw-r--r--lib/inets/src/http_server/Makefile4
-rw-r--r--lib/inets/src/http_server/httpd_util.erl9
-rw-r--r--lib/inets/src/inets_app/Makefile4
-rw-r--r--lib/inets/src/inets_app/inets.app.src6
-rw-r--r--lib/inets/test/Makefile2
-rw-r--r--lib/inets/test/httpc_SUITE.erl40
-rw-r--r--lib/inets/test/httpd_1_1.erl2
-rw-r--r--lib/inets/test/httpd_SUITE.erl8
-rw-r--r--lib/inets/test/httpd_all.erl2
-rw-r--r--lib/inets/test/httpd_basic_SUITE.erl4
-rw-r--r--lib/inets/test/httpd_mod.erl2
-rw-r--r--lib/inets/test/httpd_test_data/server_root/Makefile4
-rw-r--r--lib/inets/test/uri_SUITE.erl257
-rw-r--r--lib/jinterface/doc/src/jinterface_users_guide.xml58
-rw-r--r--lib/jinterface/doc/src/notes.xml6
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java91
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractNode.java83
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile12
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpConnection.java6
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpCookedConnection.java2
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpEpmd.java2
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangAtom.java4
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangDouble.java4
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangLong.java4
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPid.java5
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPort.java6
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java9
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpGenericTransportFactory.java87
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpInputStream.java4
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java8
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java2
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java2
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpNode.java97
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpSelf.java20
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/OtpServer.java4
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/java_files9
-rw-r--r--lib/jinterface/java_src/com/ericsson/otp/erlang/package.html4
-rw-r--r--lib/jinterface/test/Makefile4
-rw-r--r--lib/jinterface/test/jinterface_SUITE.erl32
-rw-r--r--lib/jinterface/test/jinterface_SUITE_data/GenericTransportFactoryTest.java104
-rw-r--r--lib/jinterface/test/jinterface_SUITE_data/Makefile.src8
-rw-r--r--lib/jinterface/test/jinterface_SUITE_data/MboxLinkUnlink.java4
-rw-r--r--lib/jinterface/test/nc_SUITE.erl40
-rw-r--r--lib/jinterface/test/nc_SUITE_data/Makefile.src7
-rw-r--r--lib/kernel/Makefile1
-rw-r--r--lib/kernel/doc/src/config.xml2
-rw-r--r--lib/kernel/doc/src/erl_ddll.xml6
-rw-r--r--lib/kernel/doc/src/erpc.xml703
-rw-r--r--lib/kernel/doc/src/gen_sctp.xml52
-rw-r--r--lib/kernel/doc/src/gen_tcp.xml11
-rw-r--r--lib/kernel/doc/src/global.xml50
-rw-r--r--lib/kernel/doc/src/heart.xml2
-rw-r--r--lib/kernel/doc/src/inet.xml40
-rw-r--r--lib/kernel/doc/src/inet_res.xml4
-rw-r--r--lib/kernel/doc/src/kernel_app.xml52
-rw-r--r--lib/kernel/doc/src/logger.xml2
-rw-r--r--lib/kernel/doc/src/logger_chapter.xml4
-rw-r--r--lib/kernel/doc/src/logger_std_h.xml4
-rw-r--r--lib/kernel/doc/src/net.xml8
-rw-r--r--lib/kernel/doc/src/net_kernel.xml3
-rw-r--r--lib/kernel/doc/src/notes.xml20
-rw-r--r--lib/kernel/doc/src/os.xml2
-rw-r--r--lib/kernel/doc/src/rpc.xml6
-rw-r--r--lib/kernel/doc/src/seq_trace.xml4
-rw-r--r--lib/kernel/doc/src/socket.xml34
-rw-r--r--lib/kernel/doc/src/socket_usage.xml6
-rw-r--r--lib/kernel/examples/Makefile2
-rw-r--r--lib/kernel/examples/erl_uds_dist/src/erl_uds_dist.erl13
-rw-r--r--lib/kernel/examples/gen_tcp_dist/src/gen_tcp_dist.erl14
-rw-r--r--lib/kernel/examples/uds_dist/c_src/uds_drv.c2
-rw-r--r--lib/kernel/examples/uds_dist/src/uds_server.erl2
-rw-r--r--lib/kernel/include/dist.hrl107
-rw-r--r--lib/kernel/include/inet_sctp.hrl4
-rw-r--r--lib/kernel/src/Makefile4
-rw-r--r--lib/kernel/src/application_controller.erl6
-rw-r--r--lib/kernel/src/auth.erl94
-rw-r--r--lib/kernel/src/code.erl35
-rw-r--r--lib/kernel/src/code_server.erl8
-rw-r--r--lib/kernel/src/disk_log.erl4
-rw-r--r--lib/kernel/src/disk_log.hrl2
-rw-r--r--lib/kernel/src/dist_ac.erl8
-rw-r--r--lib/kernel/src/dist_util.erl47
-rw-r--r--lib/kernel/src/erl_boot_server.erl6
-rw-r--r--lib/kernel/src/erl_erts_errors.erl94
-rw-r--r--lib/kernel/src/erpc.erl351
-rw-r--r--lib/kernel/src/erts_debug.erl4
-rw-r--r--lib/kernel/src/file_io_server.erl2
-rw-r--r--lib/kernel/src/gen_sctp.erl180
-rw-r--r--lib/kernel/src/gen_tcp_socket.erl2
-rw-r--r--lib/kernel/src/gen_udp_socket.erl6
-rw-r--r--lib/kernel/src/global.erl33
-rw-r--r--lib/kernel/src/global_group.erl10
-rw-r--r--lib/kernel/src/heart.erl2
-rw-r--r--lib/kernel/src/inet.erl32
-rw-r--r--lib/kernel/src/inet6_sctp.erl10
-rw-r--r--lib/kernel/src/inet_config.erl4
-rw-r--r--lib/kernel/src/inet_db.erl447
-rw-r--r--lib/kernel/src/inet_dns.hrl12
-rw-r--r--lib/kernel/src/inet_gethost_native.erl155
-rw-r--r--lib/kernel/src/inet_int.hrl24
-rw-r--r--lib/kernel/src/inet_res.erl284
-rw-r--r--lib/kernel/src/inet_res.hrl4
-rw-r--r--lib/kernel/src/inet_sctp.erl18
-rw-r--r--lib/kernel/src/inet_tcp_dist.erl7
-rw-r--r--lib/kernel/src/kernel.app.src6
-rw-r--r--lib/kernel/src/logger.erl14
-rw-r--r--lib/kernel/src/logger_disk_log_h.erl115
-rw-r--r--lib/kernel/src/logger_h_common.erl4
-rw-r--r--lib/kernel/src/logger_olp.erl8
-rw-r--r--lib/kernel/src/logger_server.erl2
-rw-r--r--lib/kernel/src/net.erl4
-rw-r--r--lib/kernel/src/net_kernel.erl40
-rw-r--r--lib/kernel/src/os.erl17
-rw-r--r--lib/kernel/src/ram_file.erl4
-rw-r--r--lib/kernel/src/rpc.erl477
-rw-r--r--lib/kernel/src/socket.erl37
-rw-r--r--lib/kernel/test/Makefile16
-rw-r--r--lib/kernel/test/application_SUITE.erl10
-rw-r--r--lib/kernel/test/bif_SUITE.erl67
-rw-r--r--lib/kernel/test/code_SUITE.erl105
-rw-r--r--lib/kernel/test/code_SUITE_data/upgrade_client.erl406
-rw-r--r--lib/kernel/test/disk_log_SUITE.erl12
-rw-r--r--lib/kernel/test/erl_distribution_SUITE.erl177
-rw-r--r--lib/kernel/test/erl_distribution_wb_SUITE.erl159
-rw-r--r--lib/kernel/test/erl_prim_loader_SUITE.erl132
-rw-r--r--lib/kernel/test/erpc_SUITE.erl1337
-rw-r--r--lib/kernel/test/erpc_SUITE_data/Makefile.src39
-rw-r--r--lib/kernel/test/erpc_SUITE_data/fwd_node.c221
-rw-r--r--lib/kernel/test/error_logger_SUITE.erl8
-rw-r--r--lib/kernel/test/file_SUITE.erl32
-rw-r--r--lib/kernel/test/file_SUITE_data/realmen.html6
-rw-r--r--lib/kernel/test/file_name_SUITE.erl6
-rw-r--r--lib/kernel/test/gen_sctp_SUITE.erl112
-rw-r--r--lib/kernel/test/gen_tcp_api_SUITE.erl24
-rw-r--r--lib/kernel/test/gen_tcp_misc_SUITE.erl60
-rw-r--r--lib/kernel/test/gen_udp_SUITE.erl49
-rw-r--r--lib/kernel/test/global_SUITE.erl125
-rw-r--r--lib/kernel/test/global_SUITE_data/global_trace.erl82
-rw-r--r--lib/kernel/test/global_group_SUITE.erl712
-rw-r--r--lib/kernel/test/heart_SUITE.erl574
-rw-r--r--lib/kernel/test/ignore_cores.erl4
-rw-r--r--lib/kernel/test/inet_SUITE.erl112
-rw-r--r--lib/kernel/test/inet_res_SUITE.erl395
-rw-r--r--lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone2
-rw-r--r--lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone1
-rw-r--r--lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone3
-rw-r--r--lib/kernel/test/init_SUITE.erl228
-rw-r--r--lib/kernel/test/interactive_shell_SUITE.erl1364
-rw-r--r--lib/kernel/test/kernel.spec3
-rw-r--r--lib/kernel/test/kernel_SUITE.erl110
-rw-r--r--lib/kernel/test/kernel_smoke.spec3
-rw-r--r--lib/kernel/test/kernel_test_global_sys_monitor.erl6
-rw-r--r--lib/kernel/test/logger_SUITE.erl95
-rw-r--r--lib/kernel/test/logger_disk_log_h_SUITE.erl5
-rw-r--r--lib/kernel/test/logger_env_var_SUITE.erl126
-rw-r--r--lib/kernel/test/logger_proxy_SUITE.erl17
-rw-r--r--lib/kernel/test/logger_simple_h_SUITE.erl17
-rw-r--r--lib/kernel/test/logger_std_h_SUITE.erl27
-rw-r--r--lib/kernel/test/logger_test_lib.erl56
-rw-r--r--lib/kernel/test/loose_node.erl202
-rw-r--r--lib/kernel/test/pg_SUITE.erl479
-rw-r--r--lib/kernel/test/prim_file_SUITE.erl8
-rw-r--r--lib/kernel/test/prim_file_SUITE_data/realmen.html10
-rw-r--r--lib/kernel/test/ram_file_SUITE_data/realmen.html10
-rw-r--r--lib/kernel/test/rpc_SUITE.erl390
-rw-r--r--lib/kernel/test/seq_trace_SUITE.erl123
-rw-r--r--lib/kernel/test/socket_SUITE.erl2572
-rw-r--r--lib/kernel/test/socket_test_evaluator.erl6
-rw-r--r--lib/kernel/test/socket_test_lib.erl9
-rw-r--r--lib/kernel/test/socket_test_ttest_tcp_server.erl4
-rw-r--r--lib/kernel/test/socket_test_ttest_tcp_socket.erl2
-rw-r--r--lib/megaco/Makefile1
-rwxr-xr-xlib/megaco/configure4081
-rw-r--r--lib/megaco/configure.ac (renamed from lib/megaco/configure.in)32
-rw-r--r--lib/megaco/examples/meas/Makefile.in4
-rw-r--r--lib/megaco/examples/simple/Makefile6
-rw-r--r--lib/megaco/src/app/Makefile6
-rw-r--r--lib/megaco/src/binary/Makefile6
-rw-r--r--lib/megaco/src/engine/Makefile6
-rw-r--r--lib/megaco/src/flex/Makefile.in6
-rw-r--r--lib/megaco/src/tcp/Makefile6
-rw-r--r--lib/megaco/src/text/Makefile6
-rw-r--r--lib/megaco/src/udp/Makefile6
-rw-r--r--lib/megaco/test/Makefile4
-rw-r--r--lib/megaco/test/megaco_examples_SUITE.erl20
-rw-r--r--lib/megaco/test/megaco_test_lib.erl56
-rw-r--r--lib/megaco/test/megaco_test_lib.hrl1
-rw-r--r--lib/mnesia/doc/src/Mnesia_chap3.xmlsrc2
-rw-r--r--lib/mnesia/doc/src/Mnesia_chap4.xmlsrc4
-rw-r--r--lib/mnesia/doc/src/Mnesia_chap7.xmlsrc4
-rw-r--r--lib/mnesia/doc/src/mnesia.xml2
-rw-r--r--lib/mnesia/examples/Makefile4
-rw-r--r--lib/mnesia/examples/bench/README6
-rw-r--r--lib/mnesia/examples/mnesia_tpcb.erl4
-rw-r--r--lib/mnesia/include/Makefile4
-rw-r--r--lib/mnesia/src/Makefile6
-rw-r--r--lib/mnesia/src/mnesia.erl2
-rw-r--r--lib/mnesia/src/mnesia_backup.erl4
-rw-r--r--lib/mnesia/src/mnesia_bup.erl4
-rw-r--r--lib/mnesia/src/mnesia_checkpoint.erl4
-rw-r--r--lib/mnesia/src/mnesia_controller.erl12
-rw-r--r--lib/mnesia/src/mnesia_dumper.erl12
-rw-r--r--lib/mnesia/src/mnesia_frag.erl4
-rw-r--r--lib/mnesia/src/mnesia_lib.erl8
-rw-r--r--lib/mnesia/src/mnesia_loader.erl6
-rw-r--r--lib/mnesia/src/mnesia_locker.erl16
-rw-r--r--lib/mnesia/src/mnesia_log.erl6
-rw-r--r--lib/mnesia/src/mnesia_monitor.erl4
-rw-r--r--lib/mnesia/src/mnesia_recover.erl14
-rw-r--r--lib/mnesia/src/mnesia_schema.erl20
-rw-r--r--lib/mnesia/src/mnesia_snmp_hook.erl6
-rw-r--r--lib/mnesia/src/mnesia_subscr.erl6
-rw-r--r--lib/mnesia/src/mnesia_tm.erl16
-rw-r--r--lib/mnesia/test/Makefile4
-rw-r--r--lib/mnesia/test/mnesia_SUITE.erl2
-rw-r--r--lib/mnesia/test/mnesia_atomicity_test.erl24
-rw-r--r--lib/mnesia/test/mnesia_config_backup.erl4
-rw-r--r--lib/mnesia/test/mnesia_config_test.erl2
-rw-r--r--lib/mnesia/test/mnesia_consistency_test.erl4
-rw-r--r--lib/mnesia/test/mnesia_durability_test.erl18
-rw-r--r--lib/mnesia/test/mnesia_evil_coverage_test.erl6
-rw-r--r--lib/mnesia/test/mnesia_isolation_test.erl16
-rw-r--r--lib/mnesia/test/mnesia_recovery_test.erl6
-rw-r--r--lib/mnesia/test/mnesia_test_lib.erl4
-rw-r--r--lib/mnesia/test/mnesia_tpcb.erl4
-rw-r--r--lib/mnesia/test/mnesia_trans_access_test.erl4
-rw-r--r--lib/observer/doc/src/observer_ug.xml6
-rw-r--r--lib/observer/doc/src/ttb_ug.xml2
-rw-r--r--lib/observer/src/Makefile4
-rw-r--r--lib/observer/src/cdv_proc_cb.erl2
-rw-r--r--lib/observer/src/crashdump_viewer.erl4
-rw-r--r--lib/observer/src/crashdump_viewer.hrl4
-rw-r--r--lib/observer/src/etop.erl4
-rw-r--r--lib/observer/src/observer.app.src2
-rw-r--r--lib/observer/src/observer_procinfo.erl2
-rw-r--r--lib/observer/src/observer_trace_wx.erl6
-rw-r--r--lib/observer/src/observer_wx.erl29
-rw-r--r--lib/observer/src/ttb.erl4
-rw-r--r--lib/observer/src/ttb_et.erl4
-rw-r--r--lib/observer/test/Makefile2
-rw-r--r--lib/observer/test/crashdump_helper.erl2
-rw-r--r--lib/observer/test/crashdump_viewer_SUITE.erl2
-rw-r--r--lib/observer/test/etop_SUITE.erl64
-rw-r--r--lib/observer/test/observer_SUITE.erl6
-rw-r--r--lib/observer/test/ttb_SUITE.erl1096
-rwxr-xr-xlib/odbc/configure4130
-rw-r--r--lib/odbc/configure.ac (renamed from lib/odbc/configure.in)106
-rw-r--r--lib/odbc/src/Makefile4
-rw-r--r--lib/odbc/test/Makefile4
-rw-r--r--lib/odbc/test/mysql.erl4
-rw-r--r--lib/odbc/test/postgres.erl4
-rw-r--r--lib/os_mon/c_src/memsup.c4
-rw-r--r--lib/os_mon/c_src/nteventlog/elog_format.h4
-rw-r--r--lib/os_mon/c_src/nteventlog/elog_main.c2
-rw-r--r--lib/os_mon/c_src/nteventlog/elog_pipe_stdin.c4
-rw-r--r--lib/os_mon/c_src/nteventlog/elog_pipe_stdin.h8
-rw-r--r--lib/os_mon/c_src/win32sysinfo.c4
-rw-r--r--lib/os_mon/doc/src/notes.xml2
-rw-r--r--lib/os_mon/src/Makefile4
-rw-r--r--lib/os_mon/src/os_mon.app.src2
-rw-r--r--lib/os_mon/test/Makefile4
-rw-r--r--lib/os_mon/test/cpu_sup_SUITE.erl4
-rw-r--r--lib/os_mon/test/disksup_SUITE.erl6
-rw-r--r--lib/os_mon/test/memsup_SUITE.erl31
-rw-r--r--lib/os_mon/test/os_mon_SUITE.erl4
-rw-r--r--lib/os_mon/test/os_sup_SUITE.erl6
-rw-r--r--lib/parsetools/doc/src/leex.xml6
-rw-r--r--lib/parsetools/doc/src/notes.xml4
-rw-r--r--lib/parsetools/doc/src/yecc.xml4
-rw-r--r--lib/parsetools/include/leexinc.hrl2
-rw-r--r--lib/parsetools/src/Makefile4
-rw-r--r--lib/parsetools/src/leex.erl6
-rw-r--r--lib/parsetools/src/parsetools.app.src2
-rw-r--r--lib/parsetools/src/yecc.erl44
-rw-r--r--lib/parsetools/test/Makefile4
-rw-r--r--lib/parsetools/test/leex_SUITE.erl17
-rw-r--r--lib/parsetools/test/yecc_SUITE.erl21
-rw-r--r--lib/public_key/.gitignore8
-rw-r--r--lib/public_key/asn1/ECPrivateKey.asn12
-rw-r--r--lib/public_key/asn1/Makefile35
-rw-r--r--lib/public_key/doc/src/notes.xml18
-rw-r--r--lib/public_key/doc/src/public_key.xml116
-rw-r--r--lib/public_key/doc/src/using_public_key.xml117
-rw-r--r--lib/public_key/src/Makefile4
-rw-r--r--lib/public_key/src/pubkey_cert.erl6
-rw-r--r--lib/public_key/src/pubkey_cert_records.erl2
-rw-r--r--lib/public_key/src/pubkey_crl.erl4
-rw-r--r--lib/public_key/src/pubkey_pbe.erl6
-rw-r--r--lib/public_key/src/pubkey_pem.erl4
-rw-r--r--lib/public_key/src/pubkey_ssh.erl595
-rw-r--r--lib/public_key/src/public_key.app.src2
-rw-r--r--lib/public_key/src/public_key.erl156
-rw-r--r--lib/public_key/test/Makefile7
-rw-r--r--lib/public_key/test/erl_make_certs.erl4
-rw-r--r--lib/public_key/test/pkits_SUITE.erl10
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE.erl457
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/auth_keys7
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/known_hosts8
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_pub1
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_with_comment_pub3
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/openssh_ecdsa_pub1
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/openssh_rsa_pub1
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_auth_keys9
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_known_hosts3
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_comment_pub13
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_pub12
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_ecdsa_pub6
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_comment_pub7
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_pub13
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_subject_pub8
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_comment_pub9
-rw-r--r--lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_header_pub9
-rw-r--r--lib/public_key/test/public_key_SUITE.erl10
-rw-r--r--lib/reltool/Makefile1
-rw-r--r--lib/reltool/doc/src/notes.xml6
-rw-r--r--lib/reltool/doc/src/reltool.xml6
-rw-r--r--lib/reltool/doc/src/reltool_examples.xml13
-rw-r--r--lib/reltool/doc/src/reltool_usage.xml4
-rw-r--r--lib/reltool/examples/Makefile4
-rw-r--r--lib/reltool/src/Makefile6
-rw-r--r--lib/reltool/src/reltool_server.erl2
-rw-r--r--lib/reltool/src/reltool_target.erl2
-rw-r--r--lib/reltool/test/Makefile4
-rw-r--r--lib/reltool/test/reltool_server_SUITE.erl2
-rw-r--r--lib/runtime_tools/c_src/trace_file_drv.c4
-rw-r--r--lib/runtime_tools/c_src/trace_ip_drv.c10
-rw-r--r--lib/runtime_tools/doc/src/LTTng.xml2
-rw-r--r--lib/runtime_tools/doc/src/dbg.xml18
-rw-r--r--lib/runtime_tools/doc/src/dyntrace.xml2
-rw-r--r--lib/runtime_tools/doc/src/erts_alloc_config.xml12
-rw-r--r--lib/runtime_tools/doc/src/system_information.xml2
-rw-r--r--lib/runtime_tools/src/Makefile4
-rw-r--r--lib/runtime_tools/src/appmon_info.erl10
-rw-r--r--lib/runtime_tools/src/dbg.erl18
-rw-r--r--lib/runtime_tools/src/erts_alloc_config.erl9
-rw-r--r--lib/runtime_tools/src/system_information.erl2
-rw-r--r--lib/runtime_tools/test/Makefile3
-rw-r--r--lib/runtime_tools/test/dbg_SUITE.erl53
-rw-r--r--lib/runtime_tools/test/dbg_SUITE_data/dbg_test.erl6
-rw-r--r--lib/runtime_tools/test/erts_alloc_config_SUITE.erl33
-rw-r--r--lib/runtime_tools/test/system_information_SUITE.erl13
-rw-r--r--lib/sasl/Makefile1
-rw-r--r--lib/sasl/doc/src/release_handler.xml22
-rw-r--r--lib/sasl/examples/src/Makefile4
-rw-r--r--lib/sasl/examples/src/target_system.erl28
-rw-r--r--lib/sasl/src/Makefile4
-rw-r--r--lib/sasl/src/release_handler.erl163
-rw-r--r--lib/sasl/src/release_handler_1.erl20
-rw-r--r--lib/sasl/src/sasl.app.src4
-rw-r--r--lib/sasl/src/systools.erl8
-rw-r--r--lib/sasl/src/systools_make.erl40
-rw-r--r--lib/sasl/test/Makefile12
-rw-r--r--lib/sasl/test/installer.erl14
-rw-r--r--lib/sasl/test/otp_vsns.erl160
-rw-r--r--lib/sasl/test/release_handler_SUITE.erl376
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/lib/installer-1.0/ebin/installer.app2
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-A.rel.src8
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-B.rel.src8
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/Emakefile2
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/.gitignore1
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/hello_server.app7
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/app_callback_module.erl26
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/hello_server.erl20
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/Emakefile2
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/.gitignore1
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.app7
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.appup3
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/app_callback_module.erl26
-rw-r--r--lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/hello_server.erl20
-rw-r--r--lib/sasl/test/rh_test_lib.erl24
-rw-r--r--lib/sasl/test/sasl_SUITE.erl109
-rw-r--r--lib/sasl/test/sasl_report_SUITE.erl10
-rw-r--r--lib/sasl/test/systools_SUITE.erl22
-rw-r--r--lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/ebin/db.app2
-rw-r--r--lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/src/sub/db3.erl3
-rw-r--r--lib/sasl/test/test_lib.hrl3
-rw-r--r--lib/snmp/bin/snmp-v2tov1.pl2
-rwxr-xr-xlib/snmp/configure1057
-rw-r--r--lib/snmp/configure.ac (renamed from lib/snmp/configure.in)17
-rw-r--r--lib/snmp/doc/src/notes.xml20
-rw-r--r--lib/snmp/doc/src/notes_history.xml12
-rw-r--r--lib/snmp/doc/src/snmp.xml2
-rw-r--r--lib/snmp/doc/src/snmp_app.xml6
-rw-r--r--lib/snmp/doc/src/snmp_config.xml2
-rw-r--r--lib/snmp/doc/src/snmp_def_instr_functions.xml8
-rw-r--r--lib/snmp/doc/src/snmp_index.xml4
-rw-r--r--lib/snmp/doc/src/snmp_manager_netif.xml6
-rw-r--r--lib/snmp/doc/src/snmpa.xml12
-rw-r--r--lib/snmp/doc/src/snmpa_mib_data.xml4
-rw-r--r--lib/snmp/doc/src/snmpa_mpd.xml4
-rw-r--r--lib/snmp/doc/src/snmpm.xml345
-rw-r--r--lib/snmp/doc/src/structure.fig2
-rw-r--r--lib/snmp/examples/ex1/Makefile4
-rw-r--r--lib/snmp/examples/ex2/Makefile4
-rw-r--r--lib/snmp/mibs/Makefile.in4
-rw-r--r--lib/snmp/priv/conf/agent/Makefile4
-rw-r--r--lib/snmp/priv/conf/manager/Makefile4
-rw-r--r--lib/snmp/src/agent/Makefile6
-rw-r--r--lib/snmp/src/agent/modules.mk6
-rw-r--r--lib/snmp/src/agent/snmp_framework_mib.erl4
-rw-r--r--lib/snmp/src/agent/snmp_generic.erl6
-rw-r--r--lib/snmp/src/agent/snmp_generic_mnesia.erl4
-rw-r--r--lib/snmp/src/agent/snmp_shadow_table.erl6
-rw-r--r--lib/snmp/src/agent/snmp_target_mib.erl6
-rw-r--r--lib/snmp/src/agent/snmp_user_based_sm_mib.erl6
-rw-r--r--lib/snmp/src/agent/snmp_view_based_acm_mib.erl8
-rw-r--r--lib/snmp/src/agent/snmpa.erl15
-rw-r--r--lib/snmp/src/agent/snmpa_acm.erl4
-rw-r--r--lib/snmp/src/agent/snmpa_agent.erl246
-rw-r--r--lib/snmp/src/agent/snmpa_general_db.erl4
-rw-r--r--lib/snmp/src/agent/snmpa_get.erl6
-rw-r--r--lib/snmp/src/agent/snmpa_local_db.erl6
-rw-r--r--lib/snmp/src/agent/snmpa_mib.erl24
-rw-r--r--lib/snmp/src/agent/snmpa_mib_data_ttln.erl6
-rw-r--r--lib/snmp/src/agent/snmpa_mib_data_tttn.erl6
-rw-r--r--lib/snmp/src/agent/snmpa_mib_lib.erl4
-rw-r--r--lib/snmp/src/agent/snmpa_mib_storage.erl4
-rw-r--r--lib/snmp/src/agent/snmpa_mpd.erl6
-rw-r--r--lib/snmp/src/agent/snmpa_net_if.erl20
-rw-r--r--lib/snmp/src/agent/snmpa_network_interface_filter.erl4
-rw-r--r--lib/snmp/src/agent/snmpa_set_lib.erl6
-rw-r--r--lib/snmp/src/agent/snmpa_supervisor.erl4
-rw-r--r--lib/snmp/src/agent/snmpa_svbl.erl6
-rw-r--r--lib/snmp/src/agent/snmpa_target_cache.erl8
-rw-r--r--lib/snmp/src/agent/snmpa_trap.erl30
-rw-r--r--lib/snmp/src/agent/snmpa_usm.erl4
-rw-r--r--lib/snmp/src/agent/snmpa_vacm.erl4
-rw-r--r--lib/snmp/src/app/Makefile6
-rw-r--r--lib/snmp/src/app/snmp.app.src2
-rw-r--r--lib/snmp/src/app/snmp.config8
-rw-r--r--lib/snmp/src/app/snmp.erl4
-rw-r--r--lib/snmp/src/compile/Makefile6
-rw-r--r--lib/snmp/src/compile/snmpc.erl4
-rw-r--r--lib/snmp/src/compile/snmpc.src4
-rw-r--r--lib/snmp/src/compile/snmpc_lib.erl4
-rw-r--r--lib/snmp/src/compile/snmpc_mib_gram.yrl6
-rw-r--r--lib/snmp/src/compile/snmpc_mib_to_hrl.erl2
-rw-r--r--lib/snmp/src/compile/snmpc_tok.erl4
-rw-r--r--lib/snmp/src/manager/Makefile6
-rw-r--r--lib/snmp/src/manager/snmpm.erl263
-rw-r--r--lib/snmp/src/manager/snmpm_config.erl90
-rw-r--r--lib/snmp/src/manager/snmpm_mpd.erl10
-rw-r--r--lib/snmp/src/manager/snmpm_net_if.erl2
-rw-r--r--lib/snmp/src/manager/snmpm_network_interface_filter.erl4
-rw-r--r--lib/snmp/src/manager/snmpm_server.erl264
-rw-r--r--lib/snmp/src/manager/snmpm_usm.erl4
-rw-r--r--lib/snmp/src/misc/Makefile6
-rw-r--r--lib/snmp/src/misc/snmp_conf.erl8
-rw-r--r--lib/snmp/src/misc/snmp_config.erl22
-rw-r--r--lib/snmp/src/misc/snmp_log.erl4
-rw-r--r--lib/snmp/src/misc/snmp_misc.erl2
-rw-r--r--lib/snmp/src/misc/snmp_note_store.erl10
-rw-r--r--lib/snmp/src/misc/snmp_usm.erl4
-rw-r--r--lib/snmp/test/Makefile4
-rw-r--r--lib/snmp/test/exp/.gitignore0
-rw-r--r--lib/snmp/test/exp/snmp_agent_bl_test.erl5634
-rw-r--r--lib/snmp/test/exp/snmp_agent_ms_test.erl5636
-rw-r--r--lib/snmp/test/exp/snmp_agent_mt_test.erl5636
-rw-r--r--lib/snmp/test/exp/snmp_agent_v1_test.erl2674
-rw-r--r--lib/snmp/test/exp/snmp_agent_v2_test.erl5636
-rw-r--r--lib/snmp/test/exp/snmp_agent_v3_test.erl5635
-rw-r--r--lib/snmp/test/klas3.erl4
-rw-r--r--lib/snmp/test/snmp_agent_SUITE.erl1940
-rw-r--r--lib/snmp/test/snmp_agent_mibs_SUITE.erl164
-rw-r--r--lib/snmp/test/snmp_agent_test_lib.erl190
-rw-r--r--lib/snmp/test/snmp_compiler_SUITE.erl48
-rw-r--r--lib/snmp/test/snmp_conf_SUITE.erl336
-rw-r--r--lib/snmp/test/snmp_log_SUITE.erl100
-rw-r--r--lib/snmp/test/snmp_manager_SUITE.erl944
-rw-r--r--lib/snmp/test/snmp_manager_config_SUITE.erl654
-rw-r--r--lib/snmp/test/snmp_manager_user_SUITE.erl280
-rw-r--r--lib/snmp/test/snmp_note_store_SUITE.erl4
-rw-r--r--lib/snmp/test/snmp_test_data/RFC1213-MIB.mib6
-rw-r--r--lib/snmp/test/snmp_test_data/SNMPv2-MIB.mib2
-rw-r--r--lib/snmp/test/snmp_test_data/Test-LLDP-MIB.mib4
-rw-r--r--lib/snmp/test/snmp_test_data/TestTrapv2.mib4
-rw-r--r--lib/snmp/test/snmp_test_global_sys_monitor.erl8
-rw-r--r--lib/snmp/test/snmp_test_lib.erl40
-rw-r--r--lib/snmp/test/snmp_test_lib.hrl8
-rw-r--r--lib/snmp/test/snmp_test_manager.erl2
-rw-r--r--lib/snmp/test/snmp_test_mgr_counter_server.erl4
-rw-r--r--lib/snmp/test/snmp_test_mgr_misc.erl4
-rw-r--r--lib/snmp/test/snmp_test_server.erl4
-rw-r--r--lib/snmp/test/snmp_to_snmpnet_SUITE.erl2
-rw-r--r--lib/snmp/test/snmp_to_snmpnet_SUITE_data/TestTrapv2.mib4
-rw-r--r--lib/snmp/test/test-mibs/RFC1213-MIB.mib6
-rw-r--r--lib/snmp/test/test-mibs/SNMPv2-MIB.mib4
-rw-r--r--lib/snmp/test/test-mibs/SNMPv2-TC.mib2
-rw-r--r--lib/snmp/test/test-mibs/SNMPv2-test.mib4
-rw-r--r--lib/snmp/test/test_config/Makefile4
-rw-r--r--lib/ssh/doc/src/SSH_app.xml2
-rw-r--r--lib/ssh/doc/src/configurations.xml4
-rw-r--r--lib/ssh/doc/src/configure_algos.xml16
-rw-r--r--lib/ssh/doc/src/hardening.xml6
-rw-r--r--lib/ssh/doc/src/notes.xml26
-rw-r--r--lib/ssh/doc/src/ssh.xml20
-rw-r--r--lib/ssh/doc/src/ssh_agent.xml2
-rw-r--r--lib/ssh/doc/src/ssh_client_key_api.xml12
-rw-r--r--lib/ssh/doc/src/ssh_connection.xml4
-rw-r--r--lib/ssh/doc/src/ssh_file.xml13
-rw-r--r--lib/ssh/doc/src/ssh_sftp.xml4
-rw-r--r--lib/ssh/doc/src/terminology.xml8
-rw-r--r--lib/ssh/doc/src/using_ssh.xml4
-rw-r--r--lib/ssh/examples/Makefile4
-rw-r--r--lib/ssh/src/Makefile2
-rw-r--r--lib/ssh/src/ssh.app.src4
-rw-r--r--lib/ssh/src/ssh.erl2
-rw-r--r--lib/ssh/src/ssh_auth.hrl4
-rw-r--r--lib/ssh/src/ssh_client_key_api.erl2
-rw-r--r--lib/ssh/src/ssh_connection.erl4
-rw-r--r--lib/ssh/src/ssh_connection_handler.erl14
-rw-r--r--lib/ssh/src/ssh_daemon_channel.erl4
-rw-r--r--lib/ssh/src/ssh_dbg.erl10
-rw-r--r--lib/ssh/src/ssh_file.erl17
-rw-r--r--lib/ssh/src/ssh_fsm_userauth_client.erl6
-rw-r--r--lib/ssh/src/ssh_info.erl2
-rw-r--r--lib/ssh/src/ssh_message.erl172
-rw-r--r--lib/ssh/src/ssh_options.erl6
-rw-r--r--lib/ssh/src/ssh_server_channel.erl2
-rw-r--r--lib/ssh/src/ssh_server_key_api.erl2
-rw-r--r--lib/ssh/src/ssh_sftp.erl10
-rw-r--r--lib/ssh/src/ssh_sftpd.erl2
-rw-r--r--lib/ssh/src/ssh_shell.erl4
-rw-r--r--lib/ssh/src/ssh_system_sup.erl4
-rw-r--r--lib/ssh/src/ssh_transport.erl53
-rw-r--r--lib/ssh/src/ssh_transport.hrl4
-rw-r--r--lib/ssh/src/ssh_xfer.hrl4
-rw-r--r--lib/ssh/test/Makefile4
-rw-r--r--lib/ssh/test/property_test/ssh_eqc_client_server.erl4
-rw-r--r--lib/ssh/test/property_test/ssh_eqc_encode_decode.erl4
-rw-r--r--lib/ssh/test/ssh_basic_SUITE.erl59
-rw-r--r--lib/ssh/test/ssh_chan_behaviours_SUITE.erl4
-rw-r--r--lib/ssh/test/ssh_compat_SUITE.erl10
-rw-r--r--lib/ssh/test/ssh_connection_SUITE.erl6
-rw-r--r--lib/ssh/test/ssh_options_SUITE.erl31
-rw-r--r--lib/ssh/test/ssh_protocol_SUITE.erl10
-rw-r--r--lib/ssh/test/ssh_pubkey_SUITE.erl4
-rw-r--r--lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_comment_pub2
-rw-r--r--lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_header_pub2
-rw-r--r--lib/ssh/test/ssh_relay.erl2
-rw-r--r--lib/ssh/test/ssh_sftpd_SUITE.erl8
-rw-r--r--lib/ssh/test/ssh_test_lib.erl6
-rw-r--r--lib/ssh/test/ssh_to_openssh_SUITE.erl2
-rw-r--r--lib/ssh/test/ssh_trpt_test_lib.erl16
-rw-r--r--lib/ssh/test/ssh_upgrade_SUITE.erl4
-rw-r--r--lib/ssl/doc/src/ssl.xml12
-rw-r--r--lib/ssl/examples/certs/Makefile4
-rw-r--r--lib/ssl/examples/src/Makefile4
-rw-r--r--lib/ssl/src/Makefile2
-rw-r--r--lib/ssl/src/inet_tls_dist.erl4
-rw-r--r--lib/ssl/src/ssl.app.src2
-rw-r--r--lib/ssl/src/ssl.erl18
-rw-r--r--lib/ssl/src/ssl_gen_statem.erl16
-rw-r--r--lib/ssl/src/ssl_handshake.erl2
-rw-r--r--lib/ssl/src/ssl_internal.hrl4
-rw-r--r--lib/ssl/src/tls_gen_connection.erl25
-rw-r--r--lib/ssl/src/tls_socket.erl4
-rw-r--r--lib/ssl/test/Makefile6
-rw-r--r--lib/ssl/test/ssl_basic_SUITE.erl32
-rw-r--r--lib/ssl/test/ssl_dist_SUITE.erl45
-rw-r--r--lib/ssl/test/ssl_gh.spec15
-rw-r--r--lib/stdlib/Makefile11
-rw-r--r--lib/stdlib/doc/src/Makefile1
-rw-r--r--lib/stdlib/doc/src/array.xml2
-rw-r--r--lib/stdlib/doc/src/beam_lib.xml7
-rw-r--r--lib/stdlib/doc/src/calendar.xml20
-rw-r--r--lib/stdlib/doc/src/erl_eval.xml13
-rw-r--r--lib/stdlib/doc/src/erl_pp.xml33
-rw-r--r--lib/stdlib/doc/src/ets.xml209
-rw-r--r--lib/stdlib/doc/src/filelib.xml19
-rw-r--r--lib/stdlib/doc/src/filename.xml16
-rw-r--r--lib/stdlib/doc/src/gen_event.xml684
-rw-r--r--lib/stdlib/doc/src/gen_server.xml2000
-rw-r--r--lib/stdlib/doc/src/gen_statem.xml635
-rw-r--r--lib/stdlib/doc/src/lists.xml81
-rw-r--r--lib/stdlib/doc/src/maps.xml38
-rw-r--r--lib/stdlib/doc/src/ms_transform.xml6
-rw-r--r--lib/stdlib/doc/src/peer.xml608
-rw-r--r--lib/stdlib/doc/src/rand.xml6
-rw-r--r--lib/stdlib/doc/src/ref_man.xml1
-rw-r--r--lib/stdlib/doc/src/shell.xml10
-rw-r--r--lib/stdlib/doc/src/specs.xml1
-rw-r--r--lib/stdlib/doc/src/timer.xml33
-rw-r--r--lib/stdlib/doc/src/uri_string.xml79
-rw-r--r--lib/stdlib/doc/src/uri_string_usage.xml11
-rw-r--r--lib/stdlib/examples/Makefile2
-rw-r--r--lib/stdlib/examples/erl_id_trans.erl11
-rwxr-xr-xlib/stdlib/scripts/generate_ryu_table.escript108
-rwxr-xr-xlib/stdlib/scripts/update_deprecations8
-rw-r--r--lib/stdlib/src/Makefile7
-rw-r--r--lib/stdlib/src/beam_lib.erl5
-rw-r--r--lib/stdlib/src/c.erl7
-rw-r--r--lib/stdlib/src/calendar.erl35
-rw-r--r--lib/stdlib/src/dets.erl8
-rw-r--r--lib/stdlib/src/digraph.erl8
-rw-r--r--lib/stdlib/src/epp.erl216
-rw-r--r--lib/stdlib/src/erl_compile.erl85
-rw-r--r--lib/stdlib/src/erl_error.erl2
-rw-r--r--lib/stdlib/src/erl_eval.erl1082
-rw-r--r--lib/stdlib/src/erl_expand_records.erl19
-rw-r--r--lib/stdlib/src/erl_features.erl572
-rw-r--r--lib/stdlib/src/erl_lint.erl197
-rw-r--r--lib/stdlib/src/erl_parse.yrl24
-rw-r--r--lib/stdlib/src/erl_posix_msg.erl4
-rw-r--r--lib/stdlib/src/erl_pp.erl84
-rw-r--r--lib/stdlib/src/erl_scan.erl77
-rw-r--r--lib/stdlib/src/erl_stdlib_errors.erl28
-rw-r--r--lib/stdlib/src/erl_tar.erl59
-rw-r--r--lib/stdlib/src/ets.erl531
-rw-r--r--lib/stdlib/src/eval_bits.erl150
-rw-r--r--lib/stdlib/src/filelib.erl59
-rw-r--r--lib/stdlib/src/gb_sets.erl2
-rw-r--r--lib/stdlib/src/gen.erl318
-rw-r--r--lib/stdlib/src/gen_event.erl273
-rw-r--r--lib/stdlib/src/gen_server.erl735
-rw-r--r--lib/stdlib/src/gen_statem.erl391
-rw-r--r--lib/stdlib/src/io.erl3
-rw-r--r--lib/stdlib/src/io_lib_format.erl260
-rw-r--r--lib/stdlib/src/io_lib_format_ryu_table.erl686
-rw-r--r--lib/stdlib/src/lists.erl349
-rw-r--r--lib/stdlib/src/maps.erl68
-rw-r--r--lib/stdlib/src/ms_transform.erl28
-rw-r--r--lib/stdlib/src/otp_internal.erl132
-rw-r--r--lib/stdlib/src/peer.erl1050
-rw-r--r--lib/stdlib/src/pool.erl4
-rw-r--r--lib/stdlib/src/proc_lib.erl83
-rw-r--r--lib/stdlib/src/qlc.erl21
-rw-r--r--lib/stdlib/src/queue.erl12
-rw-r--r--lib/stdlib/src/rand.erl49
-rw-r--r--lib/stdlib/src/sets.erl16
-rw-r--r--lib/stdlib/src/shell.erl29
-rw-r--r--lib/stdlib/src/slave.erl4
-rw-r--r--lib/stdlib/src/stdlib.app.src7
-rw-r--r--lib/stdlib/src/supervisor.erl23
-rw-r--r--lib/stdlib/src/sys.erl2
-rw-r--r--lib/stdlib/src/timer.erl695
-rw-r--r--lib/stdlib/src/unicode.erl2
-rw-r--r--lib/stdlib/src/uri_string.erl55
-rw-r--r--lib/stdlib/src/zip.erl18
-rw-r--r--lib/stdlib/test/Makefile17
-rw-r--r--lib/stdlib/test/beam_lib_SUITE.erl70
-rw-r--r--lib/stdlib/test/c_SUITE.erl2
-rw-r--r--lib/stdlib/test/calendar_SUITE.erl70
-rw-r--r--lib/stdlib/test/dets_SUITE.erl24
-rw-r--r--lib/stdlib/test/dummy_h.erl9
-rw-r--r--lib/stdlib/test/epp_SUITE.erl46
-rw-r--r--lib/stdlib/test/erl_eval_SUITE.erl314
-rw-r--r--lib/stdlib/test/erl_expand_records_SUITE.erl34
-rw-r--r--lib/stdlib/test/erl_internal_SUITE.erl14
-rw-r--r--lib/stdlib/test/erl_lint_SUITE.erl190
-rw-r--r--lib/stdlib/test/erl_pp_SUITE.erl98
-rw-r--r--lib/stdlib/test/error_logger_h_SUITE.erl20
-rw-r--r--lib/stdlib/test/ets_SUITE.erl521
-rw-r--r--lib/stdlib/test/ets_SUITE_data/visualize_throughput.html18
-rw-r--r--lib/stdlib/test/filelib_SUITE.erl112
-rw-r--r--lib/stdlib/test/gen_event_SUITE.erl388
-rw-r--r--lib/stdlib/test/gen_fsm_SUITE.erl12
-rw-r--r--lib/stdlib/test/gen_server_SUITE.erl627
-rw-r--r--lib/stdlib/test/gen_server_SUITE_data/format_status_server.erl55
-rw-r--r--lib/stdlib/test/gen_statem_SUITE.erl568
-rw-r--r--lib/stdlib/test/gen_statem_SUITE_data/format_status_statem.erl40
-rw-r--r--lib/stdlib/test/id_transform_SUITE.erl4
-rw-r--r--lib/stdlib/test/io_SUITE.erl57
-rw-r--r--lib/stdlib/test/io_proto_SUITE.erl10
-rw-r--r--lib/stdlib/test/lists_SUITE.erl48
-rw-r--r--lib/stdlib/test/maps_SUITE.erl25
-rw-r--r--lib/stdlib/test/ms_transform_SUITE.erl99
-rw-r--r--lib/stdlib/test/peer_SUITE.erl537
-rw-r--r--lib/stdlib/test/pool_SUITE.erl19
-rw-r--r--lib/stdlib/test/proc_lib_SUITE.erl43
-rw-r--r--lib/stdlib/test/qlc_SUITE.erl54
-rw-r--r--lib/stdlib/test/rand_SUITE.erl219
-rw-r--r--lib/stdlib/test/re_SUITE.erl4
-rw-r--r--lib/stdlib/test/shell_SUITE.erl51
-rw-r--r--lib/stdlib/test/shell_docs_SUITE.erl23
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v12
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/file.docs_v12
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_altname_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_copy_opened_3_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_1_func.txt3
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_2_func.txt3
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_3_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_int_3_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_open_2_func.txt9
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_path_eval_3_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_read_file_info_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_write_file_info_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_2_func.txt8
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_5_func.txt9
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_cb.txt3
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_interfaces_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_3_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_0_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_3_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_type.txt3
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/re.docs_v12
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v11
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/sofs.docs_v12
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/stdlib_re.txt9
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_grun_3_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_internal_run_4_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_ucompile_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_urun_3_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_fam2rel_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_rel2fam_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang.txt13
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_!_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_++_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_--_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_0_func.txt35
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_1_func.txt35
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_info_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_sizes_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_and_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_any_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_append_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_arity_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_atom_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_band_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_atom_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_1_func.txt7
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_2_func.txt10
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bitstring_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bnot_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_boolean_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bor_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsl_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsr_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bxor_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_byte_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_call_on_load_function_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_char_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_delay_trap_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_nl_0_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_string_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_1_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_notification_1_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_opt_2_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_input_handler_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_put_data_2_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_set_opt_3_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_get_stat_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_handle_0_type.txt2
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_div_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dmonitor_node_3_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_append_vm_tag_data_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_0_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_data_0_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_prepend_vm_tag_data_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_put_tag_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_restore_tag_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_spread_tag_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqcoloneq_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqeq_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqlt_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqslasheq_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_1_func.txt17
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_2_func.txt26
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_3_func.txt37
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_1_func.txt18
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_signal_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_after_on_load_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_loading_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_binary_2_func.txt8
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_list_2_func.txt16
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_format_cpu_topology_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_info_mfa_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_to_list_1_func.txt2
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_exported_3_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_garbage_collect_message_area_0_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gather_gc_info_result_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_cookie_1_func.txt9
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_group_leader_2_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gt_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gteq_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_has_prepared_code_on_load_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt3
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_identifier_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_integer_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iodata_0_type.txt11
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_0_type.txt10
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_to_iovec_1_func.txt25
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_is_process_alive_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_link_1_func.txt60
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_1_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_atom_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_existing_atom_1_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_load_module_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_lt_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_fun_3_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_ref_0_func.txt2
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_map_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_2_type.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_memory_0_func.txt7
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_message_queue_data_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_mfa_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_module_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_3_func.txt80
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_node_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_neg_integer_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nif_resource_0_type.txt2
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nil_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_no_return_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_node_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_non_neg_integer_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_none_0_type.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_binary_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_bitstring_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_improper_list_2_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_1_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_2_type.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_string_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_not_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_number_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_open_port_2_func.txt2
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_or_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pid_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_call_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_get_data_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_set_data_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pos_integer_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_posixtime_to_universaltime_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pre_loaded_0_func.txt8
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_prepare_loading_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt8
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_info_2_func.txt16
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_raise_3_func.txt17
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_reference_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_register_2_func.txt13
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_rem_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_send_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_info_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_2_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_1_func.txt12
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_2_func.txt9
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cpu_topology_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_3_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slash_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slasheq_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_spawn_opt_4_func.txt11
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_0_type.txt10
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_extrainfo_0_type.txt10
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_star_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_statistics_1_func.txt20
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_string_0_type.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_subtract_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_suspend_process_2_func.txt2
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_info_1_func.txt8
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_binary_2_func.txt17
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_iovec_2_func.txt1
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_timeout_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_3_func.txt9
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_info_2_func.txt2
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_tuple_0_type.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_type.txt108
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unalias_1_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_universaltime_to_posixtime_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unlink_1_func.txt51
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unregister_1_func.txt9
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_whereis_1_func.txt6
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_xor_2_func.txt5
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE.txt4
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_cb.txt3
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_type.txt3
-rw-r--r--lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v11
-rw-r--r--lib/stdlib/test/stdlib_SUITE.erl112
-rw-r--r--lib/stdlib/test/stdlib_bench_SUITE.erl46
-rw-r--r--lib/stdlib/test/supervisor_SUITE.erl4
-rw-r--r--lib/stdlib/test/tar_SUITE.erl62
-rw-r--r--lib/stdlib/test/timer_SUITE.erl12
-rw-r--r--lib/stdlib/test/timer_simple_SUITE.erl319
-rw-r--r--lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt6
-rw-r--r--lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt60
-rw-r--r--lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt849
-rw-r--r--lib/stdlib/test/uri_string_SUITE.erl189
-rw-r--r--lib/stdlib/uc_spec/CaseFolding.txt46
-rw-r--r--lib/stdlib/uc_spec/CompositionExclusions.txt12
-rw-r--r--lib/stdlib/uc_spec/GraphemeBreakProperty.txt33
-rw-r--r--lib/stdlib/uc_spec/PropList.txt100
-rw-r--r--lib/stdlib/uc_spec/README-UPDATE.txt52
-rw-r--r--lib/stdlib/uc_spec/SpecialCasing.txt6
-rw-r--r--lib/stdlib/uc_spec/UnicodeData.txt837
-rw-r--r--lib/stdlib/uc_spec/emoji-data.txt96
-rw-r--r--lib/stdlib/uc_spec/gen_unicode_mod.escript4
-rw-r--r--lib/syntax_tools/doc/Makefile2
-rw-r--r--lib/syntax_tools/doc/src/notes.xml4
-rw-r--r--lib/syntax_tools/examples/Makefile2
-rw-r--r--lib/syntax_tools/src/Makefile2
-rw-r--r--lib/syntax_tools/src/epp_dodger.erl20
-rw-r--r--lib/syntax_tools/src/erl_prettypr.erl36
-rw-r--r--lib/syntax_tools/src/erl_syntax.erl245
-rw-r--r--lib/syntax_tools/src/erl_syntax_lib.erl11
-rw-r--r--lib/syntax_tools/src/prettypr.erl2
-rw-r--r--lib/syntax_tools/src/syntax_tools.app.src2
-rw-r--r--lib/syntax_tools/test/Makefile2
-rw-r--r--lib/syntax_tools/test/syntax_tools_SUITE.erl28
-rw-r--r--lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl47
-rw-r--r--lib/tftp/src/Makefile4
-rw-r--r--lib/tftp/src/tftp.erl6
-rw-r--r--lib/tftp/src/tftp_file.erl12
-rw-r--r--lib/tftp/test/Makefile4
-rw-r--r--lib/tools/Makefile5
-rw-r--r--lib/tools/bin/.gitignore0
-rw-r--r--lib/tools/c_src/Makefile6
-rw-r--r--lib/tools/c_src/Makefile.in221
-rw-r--r--lib/tools/c_src/depend.mk17
-rw-r--r--lib/tools/c_src/erl_memory.c2947
-rw-r--r--lib/tools/c_src/erl_memory_trace_block_table.c762
-rw-r--r--lib/tools/c_src/erl_memory_trace_block_table.h74
-rw-r--r--lib/tools/doc/src/cover.xml4
-rw-r--r--lib/tools/doc/src/cprof_chapter.xml4
-rw-r--r--lib/tools/doc/src/fprof.xml6
-rw-r--r--lib/tools/doc/src/fprof_chapter.xml4
-rw-r--r--lib/tools/doc/src/instrument.xml50
-rw-r--r--lib/tools/doc/src/lcnt_chapter.xml4
-rw-r--r--lib/tools/doc/src/notes_history.xml4
-rw-r--r--lib/tools/emacs/Makefile2
-rw-r--r--lib/tools/emacs/README8
-rw-r--r--lib/tools/emacs/erlang-eunit.el4
-rw-r--r--lib/tools/emacs/erlang-skels-old.el4
-rw-r--r--lib/tools/emacs/erlang-start.el4
-rw-r--r--lib/tools/emacs/erlang.el39
-rw-r--r--lib/tools/emacs/erlang_appwiz.el10
-rw-r--r--lib/tools/examples/Makefile2
-rw-r--r--lib/tools/obj/.gitignore0
-rw-r--r--lib/tools/src/Makefile4
-rw-r--r--lib/tools/src/cover.erl16
-rw-r--r--lib/tools/src/fprof.erl4
-rw-r--r--lib/tools/src/tags.erl4
-rw-r--r--lib/tools/test/Makefile5
-rw-r--r--lib/tools/test/cover_SUITE.erl185
-rw-r--r--lib/tools/test/cprof_SUITE.erl10
-rw-r--r--lib/tools/test/emacs_SUITE_data/comments6
-rw-r--r--lib/tools/test/emacs_SUITE_data/funcs2
-rw-r--r--lib/tools/test/emacs_SUITE_data/highlight4
-rw-r--r--lib/tools/test/emacs_SUITE_data/icr39
-rw-r--r--lib/tools/test/emem_SUITE.erl654
-rw-r--r--lib/tools/test/eprof_SUITE_data/eprof_suite_test.erl4
-rw-r--r--lib/tools/test/instrument_SUITE.erl35
-rw-r--r--lib/tools/test/make_SUITE.erl16
-rw-r--r--lib/tools/test/tools.spec.win1
-rw-r--r--lib/tools/test/xref_SUITE.erl4
-rw-r--r--lib/wx/Makefile7
-rw-r--r--lib/wx/api_gen/README2
-rw-r--r--lib/wx/api_gen/apidiff.escript2
-rw-r--r--lib/wx/api_gen/gl_gen_erl.erl4
-rw-r--r--lib/wx/api_gen/wx_doxygen.conf2
-rw-r--r--lib/wx/api_gen/wx_extra/added_func.h4
-rw-r--r--lib/wx/api_gen/wx_extra/wxEvtHandler.erl7
-rw-r--r--lib/wx/api_gen/wx_extra/wxe_evth.h2
-rw-r--r--lib/wx/api_gen/wx_gen.erl4
-rw-r--r--lib/wx/api_gen/wx_gen.hrl4
-rw-r--r--lib/wx/api_gen/wx_gen_erl.erl5
-rw-r--r--lib/wx/api_gen/wxapi.conf20
-rwxr-xr-xlib/wx/autoconf/config.guess1700
-rwxr-xr-xlib/wx/autoconf/config.sub1860
-rwxr-xr-xlib/wx/autoconf/install-sh541
-rw-r--r--lib/wx/c_src/Makefile.in20
-rw-r--r--lib/wx/c_src/egl_impl.c6
-rw-r--r--lib/wx/c_src/gen/wxe_func_table.cpp1966
-rw-r--r--lib/wx/c_src/gen/wxe_init.cpp8
-rw-r--r--lib/wx/c_src/gen/wxe_wrapper_5.cpp86
-rw-r--r--lib/wx/c_src/wxe_callback_impl.cpp4
-rw-r--r--lib/wx/c_src/wxe_helpers.cpp6
-rw-r--r--lib/wx/c_src/wxe_impl.cpp27
-rw-r--r--lib/wx/c_src/wxe_nif.h4
-rw-r--r--lib/wx/c_src/wxe_return.cpp8
-rw-r--r--lib/wx/config.mk.in10
-rwxr-xr-xlib/wx/configure4284
-rw-r--r--lib/wx/configure.ac (renamed from lib/wx/configure.in)160
-rw-r--r--lib/wx/doc/src/notes.xml8
-rw-r--r--lib/wx/doc/src/wxEvtHandler.xml4
-rw-r--r--lib/wx/doc/src/wxMouseEvent.xml44
-rw-r--r--lib/wx/examples/demo/Makefile4
-rw-r--r--lib/wx/examples/demo/demo.erl2
-rw-r--r--lib/wx/examples/demo/demo_html_tagger.erl4
-rw-r--r--lib/wx/examples/demo/ex_sashWindow.erl4
-rw-r--r--lib/wx/examples/demo/ex_sizers.erl6
-rw-r--r--lib/wx/examples/demo/ex_splitterWindow.erl8
-rw-r--r--lib/wx/examples/simple/Makefile4
-rw-r--r--lib/wx/examples/simple/menu.erl4
-rw-r--r--lib/wx/examples/simple/minimal.erl4
-rw-r--r--lib/wx/examples/sudoku/Makefile4
-rw-r--r--lib/wx/include/wx.hrl11
-rw-r--r--lib/wx/src/Makefile4
-rw-r--r--lib/wx/src/gen/glu.erl4
-rw-r--r--lib/wx/src/gen/wxEvtHandler.erl9
-rw-r--r--lib/wx/src/gen/wxMouseEvent.erl53
-rw-r--r--lib/wx/src/gen/wxe_funcs.hrl1786
-rw-r--r--lib/wx/src/wx.app.src4
-rw-r--r--lib/wx/src/wx.erl12
-rw-r--r--lib/wx/src/wxe_master.erl17
-rw-r--r--lib/wx/src/wxe_server.erl6
-rw-r--r--lib/wx/src/wxe_util.erl4
-rw-r--r--lib/wx/test/wx_basic_SUITE.erl2
-rw-r--r--lib/wx/test/wx_class_SUITE.erl2
-rw-r--r--lib/wx/test/wx_opengl_SUITE.erl4
-rw-r--r--lib/wx/test/wx_xtra_SUITE.erl8
-rw-r--r--lib/xmerl/doc/examples/xml/xmerl.xml4
-rw-r--r--lib/xmerl/doc/src/xmerl_examples.html4
-rw-r--r--lib/xmerl/include/xmerl_xsd.hrl10
-rw-r--r--lib/xmerl/src/Makefile4
-rw-r--r--lib/xmerl/src/xmerl_regexp.erl6
-rw-r--r--lib/xmerl/src/xmerl_sax_parser.erl4
-rw-r--r--lib/xmerl/src/xmerl_sax_parser.hrl6
-rw-r--r--lib/xmerl/src/xmerl_sax_parser_base.erlsrc12
-rw-r--r--lib/xmerl/src/xmerl_sax_parser_list.erlsrc4
-rw-r--r--lib/xmerl/src/xmerl_scan.erl28
-rw-r--r--lib/xmerl/src/xmerl_ucs.erl4
-rw-r--r--lib/xmerl/src/xmerl_validate.erl4
-rw-r--r--lib/xmerl/src/xmerl_xpath.erl4
-rw-r--r--lib/xmerl/src/xmerl_xsd.erl118
-rw-r--r--lib/xmerl/src/xmerl_xsd_type.erl4
-rw-r--r--lib/xmerl/test/Makefile4
-rw-r--r--lib/xmerl/test/xmerl_SUITE.erl12
-rw-r--r--lib/xmerl/test/xmerl_sax_std_SUITE.erl32
1736 files changed, 66821 insertions, 105028 deletions
diff --git a/lib/asn1/c_src/Makefile b/lib/asn1/c_src/Makefile
index 8fb3360f83..82a6b6e87a 100644
--- a/lib/asn1/c_src/Makefile
+++ b/lib/asn1/c_src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2002-2021. All Rights Reserved.
+# Copyright Ericsson AB 2002-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -99,7 +99,8 @@ _create_dirs := $(shell mkdir -p $(OBJDIR) $(LIBDIR))
opt: $(NIF_SHARED_OBJ_FILE)
-debug: opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
static_lib: $(NIF_LIB_FILE)
diff --git a/lib/asn1/c_src/asn1_erl_nif.c b/lib/asn1/c_src/asn1_erl_nif.c
index 0258f7fbd2..8dc0dfedcf 100644
--- a/lib/asn1/c_src/asn1_erl_nif.c
+++ b/lib/asn1/c_src/asn1_erl_nif.c
@@ -228,7 +228,7 @@ static int per_complete(ErlNifBinary *out_binary, unsigned char *in_buf,
case 30:
/* If we call the following bytes, in the buffer in_ptr points at,
- By1,By2,Rest then Rest is the value that will be transfered to
+ By1,By2,Rest then Rest is the value that will be transferred to
the completed buffer. By1 tells how many of the rightmost bits in
Rest that should not be used. By2 is the length of Rest in bytes.*/
in_unused = (int) *(++in_ptr);
@@ -245,7 +245,7 @@ static int per_complete(ErlNifBinary *out_binary, unsigned char *in_buf,
case 31:
/* If we call the following bytes, in the buffer in_ptr points at,
- By1,By2,By3,Rest then Rest is the value that will be transfered to
+ By1,By2,By3,Rest then Rest is the value that will be transferred to
the completed buffer. By1 tells how many of the rightmost bits in
Rest that should not be used. By2 and By3 is the length of
Rest in bytes.*/
@@ -834,7 +834,7 @@ static int per_insert_octets_except_unused(int no_bytes, unsigned char **input_p
* List is like: [{TagNo,Value},{TagNo,Value},...]
* Rest is a binary, i.e. the undecoded part of the buffer. Most often Rest
* is the empty binary.
- * If some error occured during the decoding of the in_buf an error is returned.
+ * If some error occurred during the decoding of the in_buf an error is returned.
*/
static int ber_decode_begin(ErlNifEnv* env, ERL_NIF_TERM *term, unsigned char *in_buf,
int in_buf_len, unsigned int *err_pos) {
@@ -1087,7 +1087,7 @@ static int ber_encode(ErlNifEnv *env, ERL_NIF_TERM term, mem_chunk_t **curr, uns
}
}
- // We need atleast 5 bytes to encode the next tlv
+ // We need at least 5 bytes to encode the next tlv
if (ber_check_memory(curr, 3))
return ASN1_ERROR;
diff --git a/lib/asn1/doc/src/notes.xml b/lib/asn1/doc/src/notes.xml
index 257d3bcc80..15ffa64736 100644
--- a/lib/asn1/doc/src/notes.xml
+++ b/lib/asn1/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2021</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -343,7 +343,7 @@
decoding a recursively enclosed term the length was not
propagated to that term decoding, so if the length of the
enclosed term was longer than the enclosing that error
- was not dectected</p> <p>A hard coded C stack limitation
+ was not detected</p> <p>A hard coded C stack limitation
for decoding recursive ASN.1 terms has been introduced.
This is currently set to 8 kWords giving a nesting depth
of about 1000 levels. Deeper terms can not be decoded,
@@ -405,7 +405,7 @@
<item>
<p>
Compiling an ASN.1 module using the option {n2n,
- EnumTypeName} when EnumTypeName contains a hypen like for
+ EnumTypeName} when EnumTypeName contains a hyphen like for
example Cause-Misc caused syntax errors when compiling
the generated Erlang code. This is now corrected.</p>
<p>
@@ -1060,7 +1060,7 @@
<item>
<p>The ASN.1 compiler will now always include necessary
run-time functions in the generated Erlang modules
- (except for <c>asn1rt_nif</c> which is still neeeded). If
+ (except for <c>asn1rt_nif</c> which is still needed). If
the option '<c>inline</c>' is used the ASN.1 compiler
will generate a warning. But if
'<c>{inline,OutputFile}</c>' is use, the ASN.1 compiler
diff --git a/lib/asn1/examples/ecn_internaldoc.txt b/lib/asn1/examples/ecn_internaldoc.txt
index 71e2b7a2f1..909adc6fe8 100644
--- a/lib/asn1/examples/ecn_internaldoc.txt
+++ b/lib/asn1/examples/ecn_internaldoc.txt
@@ -27,7 +27,7 @@ enable the use of ECN in the OTP ASN1 compiler.
- Unaligned PER backend. Often seems the unaligned PER encoding
as the prefferred main method in ECN applications. One of the
goals with ECN is to use less space for encoding to decrease
- the use of bandwith in transmission. This goal is highly
+ the use of bandwidth in transmission. This goal is highly
supported by unaligned PER.
diff --git a/lib/asn1/examples/encode_decode_formats.txt b/lib/asn1/examples/encode_decode_formats.txt
index 62774cf13b..5b5748c196 100644
--- a/lib/asn1/examples/encode_decode_formats.txt
+++ b/lib/asn1/examples/encode_decode_formats.txt
@@ -13,4 +13,4 @@ per_bin, optimize | binary | binary |
-iolist: deep list with binaries and lists as componets \ No newline at end of file
+iolist: deep list with binaries and lists as components \ No newline at end of file
diff --git a/lib/asn1/notes.html b/lib/asn1/notes.html
index c7da5496c8..9e3feefef7 100644
--- a/lib/asn1/notes.html
+++ b/lib/asn1/notes.html
@@ -52,7 +52,7 @@
<li>An error due to unchecked referenced imported type resulted
in missing tag in some table constraint cases. This error is
- now corrected. Error occured during decode in
+ now corrected. Error occurred during decode in
<c>ber_bin optimized</c> version.
(Own Id: OTP-5022)<p>
</li>
@@ -103,7 +103,7 @@
</li>
<li>
- Object Identifier values with two components and teh first was a
+ Object Identifier values with two components and the first was a
value reference failed due to parsing conflicts. Now it is
corrected.
(Own Id: OTP-4895)<p>
@@ -195,12 +195,12 @@
<ul>
<li>
- The <c>{internal_error,...,{ unrecognized_type,...}}</c> error occuring for a SET type when compiling with options <c>[ber_bin,optimize,der]</c> is now corrected.
+ The <c>{internal_error,...,{ unrecognized_type,...}}</c> error occurring for a SET type when compiling with options <c>[ber_bin,optimize,der]</c> is now corrected.
(Own Id: OTP-4866)<p>
</li>
<li>
- False encode of BIT STRING in PER (per_bin,optimize) is fixed. The error occured when there was a type like BIT STRING (SIZE(C)) and C > 16.
+ False encode of BIT STRING in PER (per_bin,optimize) is fixed. The error occurred when there was a type like BIT STRING (SIZE(C)) and C > 16.
(Own Id: OTP-4869)<p>
</li>
@@ -222,7 +222,7 @@
</li>
<li>
- Bug causing duplicated fuction definitions using exclusive decode is removed.<br>
+ Bug causing duplicated function definitions using exclusive decode is removed.<br>
(Own Id: OTP-4833)<p>
</li>
diff --git a/lib/asn1/src/Makefile b/lib/asn1/src/Makefile
index 60a2020dbf..6d02075576 100644
--- a/lib/asn1/src/Makefile
+++ b/lib/asn1/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2020. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -108,7 +108,7 @@ YRL_FLAGS =
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
clean:
diff --git a/lib/asn1/src/asn1ct.erl b/lib/asn1/src/asn1ct.erl
index b8cc102654..de10339c41 100644
--- a/lib/asn1/src/asn1ct.erl
+++ b/lib/asn1/src/asn1ct.erl
@@ -394,7 +394,7 @@ remove_name_collisions(Modules) ->
remove_name_collisions2(Modules,[]).
%% For each definition in the first module in module list, find
-%% all definitons with same name and rename both definitions in
+%% all definitions with same name and rename both definitions in
%% the first module and in rest of modules
remove_name_collisions2([M|Ms],Acc) ->
TypeOrVal = M#module.typeorval,
@@ -721,7 +721,7 @@ save_automatic_tagged_types([_M|Ms]) ->
%% remove_in_set_imports/3 :
%% input: list with tuples of each module's imports and module name
%% respectively.
-%% output: one list with same format but each occured import from a
+%% output: one list with same format but each occurred import from a
%% module in the input set (IMNameL) is removed.
remove_in_set_imports([{{imports,ImpL},_ModName}|Rest],InputMNameL,Acc) ->
NewImpL = remove_in_set_imports1(ImpL,InputMNameL,[]),
@@ -1454,12 +1454,12 @@ special_decode_prepare_1(#gen{options=Options}=Gen, M) ->
%% create_partial_inc_decode_gen_info/2
%%
-%% Creats a list of tags out of the information in TypeNameList that
+%% Creates a list of tags out of the information in TypeNameList that
%% tells which value will be incomplete decoded, i.e. each end
%% component/type in TypeNameList. The significant types/components in
%% the path from the toptype must be specified in the
%% TypeNameList. Significant elements are all constructed types that
-%% branches the path to the leaf and the leaf it selfs.
+%% branches the path to the leaf and the leaf it self.
%%
%% Returns a list of elements, where an element may be one of
%% mandatory|[opt,Tag]|[bin,Tag]. mandatory correspond to a mandatory
@@ -1621,7 +1621,7 @@ partial_inc_dec_toptype(_) ->
throw({error,{"no top type found for partial incomplete decode"}}).
-%% Creats a list of tags out of the information in TypeList and Types
+%% Creates a list of tags out of the information in TypeList and Types
%% that tells which value will be decoded. Each constructed type that
%% is in the TypeList will get a "choosen" command. Only the last
%% type/component in the TypeList may be a primitive type. Components
diff --git a/lib/asn1/src/asn1ct_check.erl b/lib/asn1/src/asn1ct_check.erl
index 16c9292012..12db184b4e 100644
--- a/lib/asn1/src/asn1ct_check.erl
+++ b/lib/asn1/src/asn1ct_check.erl
@@ -695,7 +695,7 @@ check_object(S,_ObjDef,#'Object'{classname=ClassRef,def=ObjectDef}) ->
{po,{object,DefObj},ArgsList} ->
{_,Object} = get_referenced_type(S,DefObj),%DefObj is a
%%#'Externalvaluereference' or a #'Externaltypereference'
- %% Maybe this call should be catched and in case of an exception
+ %% Maybe this call should be caught and in case of an exception
%% a not initialized parameterized object should be returned.
instantiate_po(S,ClassDef,Object,ArgsList);
{pv,{simpledefinedvalue,ObjRef},ArgList} ->
@@ -1170,7 +1170,7 @@ gen_incl1(_,_,[]) ->
gen_incl1(S,Fields,[C|CFields]) ->
case element(1,C) of
typefield ->
- true; %% should check that field is OPTIONAL or DEFUALT if
+ true; %% should check that field is OPTIONAL or DEFAULT if
%% the object lacks this field
objectfield ->
case lists:keysearch(element(2,C),1,Fields) of
@@ -2409,7 +2409,7 @@ normalize_s_of(SorS,S,Value,Type,NameList)
%% character string list case
normalize_restrictedstring(S,[H|T],CType) when is_list(H);is_tuple(H) ->
[normalize_restrictedstring(S,H,CType)|normalize_restrictedstring(S,T,CType)];
-%% character sting case
+%% character string case
normalize_restrictedstring(_S,CString,_) when is_list(CString) ->
CString;
%% definedvalue case or argument in a parameterized type
@@ -2816,7 +2816,7 @@ check_type(S=#state{recordtopname=TopName},Type,Ts) when is_record(Ts,type) ->
inlined=yes};
#'ObjectClassFieldType'{classname=ClRef0}=OCFT0 ->
- %% this case occures in a SEQUENCE when
+ %% this case occurs in a SEQUENCE when
%% the type of the component is a ObjectClassFieldType
ClRef = match_parameter(S, ClRef0),
OCFT = OCFT0#'ObjectClassFieldType'{classname=ClRef},
@@ -3427,10 +3427,10 @@ check_componentrelation(S, {objectset,Opos,Objset0}, Id) ->
%%% creating sets, and maintained by the intersection and union
%%% operators.
%%%
-%%% Example of invalid set representaions:
+%%% Example of invalid set representations:
%%%
%%% [{range,0,10},{range,5,10}] %Overlapping ranges
-%%% [{range,0,5},{range,6,10}] %Adjancent ranges
+%%% [{range,0,5},{range,6,10}] %Adjacent ranges
%%% [{range,10,20},{a_range,100}] %Not sorted
%%%
@@ -4388,7 +4388,7 @@ check_sequence(S,Type,Comps) ->
%% type
{CRelInf,NewComps2} = componentrelation_leadingattr(S,NewComps),
- %% CompListWithTblInf has got a lot unecessary info about
+ %% CompListWithTblInf has got a lot unnecessary info about
%% the involved class removed, as the class of the object
%% set.
CompListWithTblInf = get_tableconstraint_info(S,Type,NewComps2),
@@ -5183,7 +5183,7 @@ any_component_relation(_,[],_,_,Acc) ->
%% evaluate_atpath/4 finds out whether the at notation refers to the
%% search level. The list of referenced names in the AtNot list shall
%% begin with a name that exists on the level it refers to. If the
-%% found AtPath is refering to the same sub-branch as the simple table
+%% found AtPath is referring to the same sub-branch as the simple table
%% has, then there shall not be any leading attribute info on this
%% level.
evaluate_atpath(_,[],Cnames,{innermost,AtPath=[Ref|_Refs]}) ->
@@ -5354,7 +5354,7 @@ innertype_comprel1(S,T = #type{def=Def,constraint=Cons,tablecinf=TCI},Path) ->
case lists:keyfind(componentrelation, 1, Cons) of
{_,{_,_,ObjectSet},AtList} ->
%% This AtList must have an "outermost" at sign to be
- %% relevent here.
+ %% relevant here.
[{_,AL=[#'Externalvaluereference'{value=_Attr}|_R1]}|_R2]
= AtList,
ClassDef = get_ObjectClassFieldType_classdef(S,Def),
diff --git a/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl b/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl
index 35cf9691c7..8468010726 100644
--- a/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl
+++ b/lib/asn1/src/asn1ct_constructed_ber_bin_v2.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -463,8 +463,8 @@ gen_decode_set(Gen, Typename, #type{}=D) ->
emit(["SetFun = fun(FunTlv) ->", nl]),
emit(["case FunTlv of ",nl]),
NextNum = gen_dec_set_cases(Gen, Typename, CompList, 1),
- emit([indent(6), {curr,else}," -> ",nl,
- indent(9),"{",NextNum,", ",{curr,else},"}",nl]),
+ emit([indent(6), {curr,'else'}," -> ",nl,
+ indent(9),"{",NextNum,", ",{curr,'else'},"}",nl]),
emit([indent(3),"end",nl]),
emit([indent(3),"end,",nl]),
@@ -906,18 +906,18 @@ gen_dec_choice(Erules,TopType, _ChTag, CompList, Ext) ->
asn1ct_name:new(choTags),
asn1ct_name:new(res),
gen_dec_choice_cases(Erules,TopType,CompList),
- emit([indent(6), {curr,else}," -> ",nl]),
+ emit([indent(6), {curr,'else'}," -> ",nl]),
case Ext of
noext ->
emit([indent(9),"exit({error,{asn1,{invalid_choice_tag,",
- {curr,else},"}}})",nl]);
+ {curr,'else'},"}}})",nl]);
_ ->
emit([indent(9),"{asn1_ExtAlt,",
- {call,ber,ber_encode,[{curr,else}]},"}",nl])
+ {call,ber,ber_encode,[{curr,'else'}]},"}",nl])
end,
emit([indent(3),"end",nl]),
asn1ct_name:new(tag),
- asn1ct_name:new(else).
+ asn1ct_name:new('else').
gen_dec_choice_cases(_Erules,_TopType, []) ->
ok;
diff --git a/lib/asn1/src/asn1ct_gen.erl b/lib/asn1/src/asn1ct_gen.erl
index f759f6783f..7f83ae63fd 100644
--- a/lib/asn1/src/asn1ct_gen.erl
+++ b/lib/asn1/src/asn1ct_gen.erl
@@ -264,7 +264,7 @@ gen_partial_inc_dec_refed_funcs(Rtmod, #gen{erule=ber}=Gen) ->
pgen_partial_dec(_Rtmod,Erules,_Module) ->
Type_pattern = asn1ct:get_gen_state_field(type_pattern),
- %% Get the typedef of the top type and follow into the choosen
+ %% Get the typedef of the top type and follow into the chosen
%% components until the last type/component.
pgen_partial_types(Erules,Type_pattern),
ok.
diff --git a/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl b/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl
index 446f508998..0e7d07e92a 100644
--- a/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl
+++ b/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -764,7 +764,7 @@ gen_encode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
EmitFuncClause("Val"),
gen_encode_default_call(ClassName,Name,DefaultType);
{{Name,TypeSpec},_} ->
- %% A specified field owerwrites any 'DEFAULT' or
+ %% A specified field overwrites any 'DEFAULT' or
%% 'OPTIONAL' field in the class
EmitFuncClause("Val"),
gen_encode_field_call(ObjName,Name,TypeSpec)
@@ -912,7 +912,7 @@ gen_decode_objectfields(ClassName,[{typefield,Name,OptOrMand}|Rest],
emit_tlv_format("Bytes"),
gen_decode_default_call(ClassName,Name,"Tlv",DefaultType);
{{Name,TypeSpec},_} ->
- %% A specified field owerwrites any 'DEFAULT' or
+ %% A specified field overwrites any 'DEFAULT' or
%% 'OPTIONAL' field in the class
EmitFuncClause("Bytes"),
emit_tlv_format("Bytes"),
diff --git a/lib/asn1/src/asn1ct_gen_jer.erl b/lib/asn1/src/asn1ct_gen_jer.erl
index 2e7e300e1c..7f6152ad80 100644
--- a/lib/asn1/src/asn1ct_gen_jer.erl
+++ b/lib/asn1/src/asn1ct_gen_jer.erl
@@ -527,7 +527,7 @@ maybe_legacy_bit_string(BitStrType,SizeConstraint) ->
%%===========================================================================
%% Generate DECODING
%%===========================================================================
-%% dummy functions beause we don't generate anything special for decode
+%% dummy functions because we don't generate anything special for decode
%%===========================================================================
gen_decode(_,_) -> ok.
diff --git a/lib/asn1/src/asn1ct_imm.erl b/lib/asn1/src/asn1ct_imm.erl
index 231048694a..2596b26b60 100644
--- a/lib/asn1/src/asn1ct_imm.erl
+++ b/lib/asn1/src/asn1ct_imm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1344,7 +1344,7 @@ eval_cond([[Cond|Actions]=H|T], Seen0) ->
eval_cond(T, Seen);
true ->
[['_'|Actions]];
- maybe ->
+ 'maybe' ->
[H|eval_cond(T, Seen)]
end;
true ->
@@ -1362,7 +1362,7 @@ eval_cond_1({ge,I,N}) when is_integer(I), is_integer(N) ->
I >= N;
eval_cond_1({lt,I,N}) when is_integer(I), is_integer(N) ->
I < N;
-eval_cond_1(_) -> maybe.
+eval_cond_1(_) -> 'maybe'.
prepend_to_cond([H|T], Code) ->
[prepend_to_cond_1(H, Code)|prepend_to_cond(T, Code)];
@@ -2067,7 +2067,7 @@ enc_opt_cs([{Cond,Imm0}|T], St0) ->
true ->
{Imm,#ost{t=Type}} = enc_opt(Imm0, St0),
[{'_',Imm,Type}];
- maybe ->
+ 'maybe' ->
St = update_type_info(Cond, St0),
{Imm,#ost{t=Type}} = enc_opt(Imm0, St),
[{Cond,Imm,Type}|enc_opt_cs(T, St0)]
@@ -2079,18 +2079,18 @@ eo_eval_cond('_', _) ->
eo_eval_cond({Op,{var,_}=Var,Val}, St) ->
Type = get_type(Var, St),
case t_range(Type) of
- any -> maybe;
+ any -> 'maybe';
{_,_}=Range -> eval_cond_range(Op, Range, Val)
end;
-eo_eval_cond({_Op,{expr,_},_Val}, _St) -> maybe.
+eo_eval_cond({_Op,{expr,_},_Val}, _St) -> 'maybe'.
eval_cond_range(lt, {Lb,Ub}, Val) ->
if
Ub < Val -> true;
Val =< Lb -> false;
- true -> maybe
+ true -> 'maybe'
end;
-eval_cond_range(_Op, _Range, _Val) -> maybe.
+eval_cond_range(_Op, _Range, _Val) -> 'maybe'.
update_type_info({ult,{var,_}=Var,Val}, St) ->
Int = t_integer({0,Val-1}),
diff --git a/lib/asn1/src/asn1ct_parser2.erl b/lib/asn1/src/asn1ct_parser2.erl
index 35c921e98d..2bdc284b12 100644
--- a/lib/asn1/src/asn1ct_parser2.erl
+++ b/lib/asn1/src/asn1ct_parser2.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1106,7 +1106,7 @@ parse_ObjectAssignment([#identifier{pos=L1,val=ObjName}|Rest]) ->
%% Ret = {object,_} | {object, _, _}
parse_Object(Tokens) ->
%% The ObjectFromObject production is not included here,
- %% since it will have been catched by the ValueFromObject
+ %% since it will have been caught by the ValueFromObject
%% before we reach this point.
Flist = [fun parse_ObjectDefn/1,
fun parse_DefinedObject/1],
diff --git a/lib/asn1/src/asn1ct_pretty_format.erl b/lib/asn1/src/asn1ct_pretty_format.erl
index f4669f7eb0..adf13aef3b 100644
--- a/lib/asn1/src/asn1ct_pretty_format.erl
+++ b/lib/asn1/src/asn1ct_pretty_format.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ term(Term) ->
%%______________________________________________________________________
%% pretty_format:term(Term, Indent} -> {Indent', Chars}
%% Format <Term> -- use <Indent> to indent the *next* line
-%% Note: Indent' is a new indentaion level (sometimes printing <Term>
+%% Note: Indent' is a new indentation level (sometimes printing <Term>
%% the next line to need an "extra" indent!).
term([], Indent) ->
diff --git a/lib/asn1/src/asn1ct_tok.erl b/lib/asn1/src/asn1ct_tok.erl
index 517b5582f5..7b98714e39 100644
--- a/lib/asn1/src/asn1ct_tok.erl
+++ b/lib/asn1/src/asn1ct_tok.erl
@@ -171,7 +171,7 @@ collect_string([], _, _) ->
throw({error,missing_quote_at_eof}).
%% <name> is letters digits hyphens.
-%% Hypen is not the last character. Hypen hyphen is NOT allowed.
+%% Hyphen is not the last character. Hyphen hyphen is NOT allowed.
%%
%% <identifier> ::= <lowercase> <name>
diff --git a/lib/asn1/src/asn1rtt_ber.erl b/lib/asn1/src/asn1rtt_ber.erl
index d1cd22579b..f2458d25c5 100644
--- a/lib/asn1/src/asn1rtt_ber.erl
+++ b/lib/asn1/src/asn1rtt_ber.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -774,7 +774,7 @@ do_encode_named_bit_string(Size, [FirstVal | RestVal], NamedBitList, TagIn) ->
%%
%% bitstring NamedBitList
%% Val can be of:
-%% - [identifiers] where only named identifers are set to one,
+%% - [identifiers] where only named identifiers are set to one,
%% the Constraint must then have some information of the
%% bitlength.
%% - [list of ones and zeroes] all bits
@@ -1133,7 +1133,7 @@ e_object_identifier(V) when is_tuple(V) ->
e_object_identifier(tuple_to_list(V));
%%%%%%%%%%%%%%%
-%% e_object_identifier([List of Obect Identifiers]) ->
+%% e_object_identifier([List of Object Identifiers]) ->
%% {[Encoded Octetlist of ObjIds], IntLength}
%%
e_object_identifier([E1,E2|Tail]) ->
diff --git a/lib/asn1/src/asn1rtt_real_common.erl b/lib/asn1/src/asn1rtt_real_common.erl
index 0d53447eb7..88ad15cf84 100644
--- a/lib/asn1/src/asn1rtt_real_common.erl
+++ b/lib/asn1/src/asn1rtt_real_common.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -222,7 +222,7 @@ decode_real2(Buffer0, _C, Len, RemBytes1) ->
First =:= 2#01000000 -> {'PLUS-INFINITY', Buffer2};
First =:= 2#01000001 -> {'MINUS-INFINITY', Buffer2};
First =:= 1 orelse First =:= 2 orelse First =:= 3 ->
- %% charcter string encoding of base 10
+ %% character string encoding of base 10
{NRx,Rest} = split_binary(Buffer2,Len-1),
{binary_to_list(NRx),Rest,Len};
true ->
diff --git a/lib/asn1/test/Makefile b/lib/asn1/test/Makefile
index a9dd66251c..58f7b294f3 100644
--- a/lib/asn1/test/Makefile
+++ b/lib/asn1/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2020. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -147,7 +147,7 @@ EBIN = .
$(EMAKEFILE): $(ERL_FILES) $(HRL_FILES)
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) $(ERL_FILES) >$(EMAKEFILE)
-tests debug opt: $(EMAKEFILE)
+tests $(TYPES): $(EMAKEFILE)
clean:
rm -f core
diff --git a/lib/asn1/test/asn1_SUITE.erl b/lib/asn1/test/asn1_SUITE.erl
index 90d6dd24b6..eeb5253c32 100644
--- a/lib/asn1/test/asn1_SUITE.erl
+++ b/lib/asn1/test/asn1_SUITE.erl
@@ -731,18 +731,17 @@ ber_decode_error(Config, Rule, Opts) ->
ber_decode_error:run(Opts).
otp_14440(_Config) ->
- Args = " -pa \"" ++ filename:dirname(code:which(?MODULE)) ++ "\"",
- {ok,N} = slave:start(hostname(), otp_14440, Args),
+ {ok, Peer, N} = ?CT_PEER(),
Result = rpc:call(N, ?MODULE, otp_14440_decode, []),
io:format("Decode result = ~p~n", [Result]),
+ peer:stop(Peer),
case Result of
{exit,{error,{asn1,{invalid_value,5}}}} ->
- ok = slave:stop(N);
+ ok;
%% We get this if stack depth limit kicks in:
{exit,{error,{asn1,{unknown,_}}}} ->
- ok = slave:stop(N);
+ ok;
_ ->
- _ = slave:stop(N),
ct:fail(Result)
end.
%%
@@ -1411,11 +1410,3 @@ all_called_1([F|T]) when is_atom(F) ->
L ++ all_called_1(T);
all_called_1([]) ->
[].
-
-hostname() ->
- hostname(atom_to_list(node())).
-
-hostname([$@ | Hostname]) ->
- list_to_atom(Hostname);
-hostname([_C | Cs]) ->
- hostname(Cs).
diff --git a/lib/asn1/test/asn1_SUITE_data/Comment.asn b/lib/asn1/test/asn1_SUITE_data/Comment.asn
index c2a5abd633..af439a1ce4 100644
--- a/lib/asn1/test/asn1_SUITE_data/Comment.asn
+++ b/lib/asn1/test/asn1_SUITE_data/Comment.asn
@@ -4,7 +4,7 @@ BEGIN
/* comments as to the 2002 standard
-this is the new added way of commenting multile lines */
+this is the new added way of commenting multiple lines */
/* it is also allowed to have -- old kind of comment signs inside
this new variant. The two dashes will lose their meaning as a comment
diff --git a/lib/asn1/test/asn1_SUITE_data/CommonDataTypes.py b/lib/asn1/test/asn1_SUITE_data/CommonDataTypes.py
index 2c25f81235..67cd9eae96 100644
--- a/lib/asn1/test/asn1_SUITE_data/CommonDataTypes.py
+++ b/lib/asn1/test/asn1_SUITE_data/CommonDataTypes.py
@@ -923,7 +923,7 @@ ConnectUUIE ::= SEQUENCE
-- @prop dataType
--
-- @descr This parameter holds connection data that are specific for
--- certain types of Equipments.
+-- certain types of Equipment.
-- @
--
-- ---------------------------------
@@ -958,7 +958,7 @@ ConnectionIdentifier ::= ObjectIdentifier
-- @prop dataType
--
-- @descr This parameter specifies information that are of interest for
--- the functionallity handled by component Connection Handler.
+-- the functionality handled by component Connection Handler.
-- @
--
-- ---------------------------------
@@ -1541,7 +1541,7 @@ EquipmentAddressLAN ::= SEQUENCE
--
-- @prop dataType
--
--- @descr Contains the retreived data.
+-- @descr Contains the retrieved data.
--
-- @
--
diff --git a/lib/asn1/test/asn1_SUITE_data/EUTRA-RRC-Definitions.asn b/lib/asn1/test/asn1_SUITE_data/EUTRA-RRC-Definitions.asn
index 3b811dafe6..24dd8e85e8 100644
--- a/lib/asn1/test/asn1_SUITE_data/EUTRA-RRC-Definitions.asn
+++ b/lib/asn1/test/asn1_SUITE_data/EUTRA-RRC-Definitions.asn
@@ -3124,7 +3124,7 @@ maxCellMeas INTEGER ::= 32 -- Maximum number of entries in each of the neigh
-- cell lists in a measurement object
maxCellReport INTEGER ::= 8 -- Maximum number of reported cells
maxDRB INTEGER ::= 11 -- Maximum number of Data Radio Bearers
-maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier fequency
+maxEARFCN INTEGER ::= 65535 -- Maximum value of EUTRA carrier frequency
maxFreq INTEGER ::= 8 -- Maximum number of EUTRA carrier frequencies
maxCellInfo-GERAN-r9 INTEGER ::= 32 -- Maximum number of GERAN cells for which system in-
-- formation can be provided as redirection assistance
diff --git a/lib/asn1/test/asn1_SUITE_data/H235-SECURITY-MESSAGES.asn b/lib/asn1/test/asn1_SUITE_data/H235-SECURITY-MESSAGES.asn
index 3401f9599f..76eedc0d2c 100644
--- a/lib/asn1/test/asn1_SUITE_data/H235-SECURITY-MESSAGES.asn
+++ b/lib/asn1/test/asn1_SUITE_data/H235-SECURITY-MESSAGES.asn
@@ -135,7 +135,7 @@ KeySignedMaterial ::= SEQUENCE {
generalId Identifier, -- slave's alias
mrandom RandomVal, -- master's random value
srandom RandomVal OPTIONAL, -- slave's random value
- timeStamp TimeStamp OPTIONAL, -- master's timestamp for unsolicted EU
+ timeStamp TimeStamp OPTIONAL, -- master's timestamp for unsolicited EU
encrptval ENCRYPTED {EncodedKeySyncMaterial }
}
EncodedKeySignedMaterial ::= TYPE-IDENTIFIER.&Type (KeySignedMaterial)
diff --git a/lib/asn1/test/asn1_SUITE_data/IN-CS-1-Datatypes.asn b/lib/asn1/test/asn1_SUITE_data/IN-CS-1-Datatypes.asn
index fb092f3f9c..9cd8fbea84 100644
--- a/lib/asn1/test/asn1_SUITE_data/IN-CS-1-Datatypes.asn
+++ b/lib/asn1/test/asn1_SUITE_data/IN-CS-1-Datatypes.asn
@@ -1431,7 +1431,7 @@ ServiceInteractionIndicators ::=
-- The following example is listed to illustrate the use of this parameter:
-- CallToBeDiverted Allowed/NotAllowed Indicator
-- If the CallToBeDiverted indicator is set to NotAllowed, the destination exchange shall not allow any
--- divertion on the subjected call. By this, each service can pass the applicable indicators to inform the
+-- diversion on the subjected call. By this, each service can pass the applicable indicators to inform the
-- destination exchange of how specific services are to be handled.
ServiceKey ::=
Integer4
diff --git a/lib/asn1/test/asn1_SUITE_data/Mvrasn-11-4.asn b/lib/asn1/test/asn1_SUITE_data/Mvrasn-11-4.asn
index 81c07a2dab..fca635bb1f 100644
--- a/lib/asn1/test/asn1_SUITE_data/Mvrasn-11-4.asn
+++ b/lib/asn1/test/asn1_SUITE_data/Mvrasn-11-4.asn
@@ -140,8 +140,8 @@ InsertSubscriberDataArg ::= SEQUENCE {
-- compiler. Instead of this line the complete definition of
-- "Subscriberdata" has been inserted.
--
--- This results in the same behaviour of the deocder/encoder but
--- means only a replication of the ASN.1 definiton here.
+-- This results in the same behaviour of the decoder/encoder but
+-- means only a replication of the ASN.1 definition here.
--
msisdn [1] ISDN-AddressString OPTIONAL,
category [2] Category OPTIONAL,
diff --git a/lib/asn1/test/asn1_SUITE_data/Nortel.asn b/lib/asn1/test/asn1_SUITE_data/Nortel.asn
index a27c78a0b5..57a4434f2e 100644
--- a/lib/asn1/test/asn1_SUITE_data/Nortel.asn
+++ b/lib/asn1/test/asn1_SUITE_data/Nortel.asn
@@ -153,7 +153,7 @@ LocationAreaCode ::= OCTET STRING (SIZE(2))
CallEventRecord ::= CHOICE
{
--- Record values 0..16 are 3G curcuit switch specifick
+-- Record values 0..16 are 3G circuit switch specifick
--
-- sgsnPDPRecord [20] SGSNPDPRecord,
ggsnPDPRecord [21] GGSNPDPRecord
@@ -372,7 +372,7 @@ FFDAppendIndicator ::= BOOLEAN
FreeFormatData ::= OCTET STRING (SIZE(1..160))
--
- -- Free formated data as sent in the FurnishChargingInformationGPRS
+ -- Free formatted data as sent in the FurnishChargingInformationGPRS
-- see TS 29.078
--
diff --git a/lib/asn1/test/asn1_SUITE_data/PKIX1Explicit93.asn1 b/lib/asn1/test/asn1_SUITE_data/PKIX1Explicit93.asn1
index 714a682160..01c5be2166 100644
--- a/lib/asn1/test/asn1_SUITE_data/PKIX1Explicit93.asn1
+++ b/lib/asn1/test/asn1_SUITE_data/PKIX1Explicit93.asn1
@@ -172,7 +172,7 @@ EntryExtensionSet EXTENSION ::= { reasonCode |
invalidityDate |
certificateIssuer }
- -- information object classes used in the defintion --
+ -- information object classes used in the definition --
-- of certificates and CRLs --
-- Parameterized Type SIGNED --
diff --git a/lib/asn1/test/asn1_SUITE_data/RANAP.asn1 b/lib/asn1/test/asn1_SUITE_data/RANAP.asn1
index 55fb58b163..e821703036 100644
--- a/lib/asn1/test/asn1_SUITE_data/RANAP.asn1
+++ b/lib/asn1/test/asn1_SUITE_data/RANAP.asn1
@@ -872,7 +872,7 @@ RAB-Parameters ::= SEQUENCE {
transferDelay TransferDelay OPTIONAL
-- This IE is only present when traffic class indicates Conversational or Streaming --,
trafficHandlingPriority TrafficHandlingPriority OPTIONAL
- -- This IE is only present when traffic class indicates Interactiv --,
+ -- This IE is only present when traffic class indicates Interactive --,
allocationOrRetentionPriority AllocationOrRetentionPriority OPTIONAL,
sourceStatisticsDescriptor SourceStatisticsDescriptor OPTIONAL
-- This IE is only present when traffic class indicates Conversational or Streaming --,
@@ -1640,7 +1640,7 @@ RelocationCancelAcknowledgeExtensions RANAP-PROTOCOL-EXTENSION ::= {
-- **************************************************************
--
--- SRNS CONTEXT TRANSFER OPEARATION
+-- SRNS CONTEXT TRANSFER OPERATION
--
-- **************************************************************
diff --git a/lib/asn1/test/asn1_SUITE_data/SwCDR.py b/lib/asn1/test/asn1_SUITE_data/SwCDR.py
index 9492183cdf..1ed9c32aba 100644
--- a/lib/asn1/test/asn1_SUITE_data/SwCDR.py
+++ b/lib/asn1/test/asn1_SUITE_data/SwCDR.py
@@ -199,7 +199,7 @@ StartDate ::= OCTET STRING (SIZE (8))
StartTime ::= OCTET STRING (SIZE (6))
CallDuration ::= INTEGER
--- Expressed as number of millseconds
+-- Expressed as number of milliseconds
Cellrate ::= INTEGER
-- Value range 0-2^64
diff --git a/lib/asn1/test/asn1_SUITE_data/nbapsystem/NBAP-PDU-Contents.asn b/lib/asn1/test/asn1_SUITE_data/nbapsystem/NBAP-PDU-Contents.asn
index 9ecfa688a2..b614e86bba 100644
--- a/lib/asn1/test/asn1_SUITE_data/nbapsystem/NBAP-PDU-Contents.asn
+++ b/lib/asn1/test/asn1_SUITE_data/nbapsystem/NBAP-PDU-Contents.asn
@@ -5606,13 +5606,13 @@ DL-CCTrCH-InformationAddItem-RL-ReconfPrepTDD-ExtIEs NBAP-PROTOCOL-EXTENSION ::
{ ID id-DL-DPCH-LCR-InformationAddList-RL-ReconfPrepTDD CRITICALITY reject EXTENSION DL-DPCH-LCR-InformationAddList-RL-ReconfPrepTDD PRESENCE optional }| -- Applicable to 1.28Mcps TDD only
-- This DPCH Information is the for the first RL repetition, DPCH information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
{ ID id-CCTrCH-Initial-DL-Power-RL-ReconfPrepTDD CRITICALITY ignore EXTENSION DL-Power PRESENCE optional }|
--- This DL Power inforrmation is the for the first RL repetition, DL power information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
+-- This DL Power information is the for the first RL repetition, DL power information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
{ ID id-TDD-TPC-DownlinkStepSize-InformationAdd-RL-ReconfPrepTDD CRITICALITY reject EXTENSION TDD-TPC-DownlinkStepSize PRESENCE optional}|
-- This DL step size is the for the first RL repetition, DL step size information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
{ ID id-CCTrCH-Maximum-DL-Power-InformationAdd-RL-ReconfPrepTDD CRITICALITY ignore EXTENSION DL-Power PRESENCE optional }|
--- This DL Power inforrmation is the for the first RL repetition, DL power information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
+-- This DL Power information is the for the first RL repetition, DL power information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
{ ID id-CCTrCH-Minimum-DL-Power-InformationAdd-RL-ReconfPrepTDD CRITICALITY ignore EXTENSION DL-Power PRESENCE optional }|
--- This DL Power inforrmation is the for the first RL repetition, DL power information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
+-- This DL Power information is the for the first RL repetition, DL power information for RL repetitions 2 and on, should be defined in MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD
{ ID id-RL-ID CRITICALITY ignore EXTENSION RL-ID PRESENCE optional }|
-- This is the RL ID for the first RL repetition
{ ID id-multipleRL-ul-DPCH-InformationList CRITICALITY reject EXTENSION MultipleRL-DL-DPCH-InformationAddList-RL-ReconfPrepTDD PRESENCE optional },
diff --git a/lib/asn1/test/asn1_SUITE_data/rfcs/AlgorithmInformation-2009.asn1 b/lib/asn1/test/asn1_SUITE_data/rfcs/AlgorithmInformation-2009.asn1
index f912966c72..7da299c789 100644
--- a/lib/asn1/test/asn1_SUITE_data/rfcs/AlgorithmInformation-2009.asn1
+++ b/lib/asn1/test/asn1_SUITE_data/rfcs/AlgorithmInformation-2009.asn1
@@ -50,7 +50,7 @@ ParamOptions ::= ENUMERATED {
-- Additional information such as the length of the hash could have
-- been encoded. Without a clear understanding of what information
-- is needed by applications, such extraneous information was not
--- considered to be of sufficent importance.
+-- considered to be of sufficient importance.
--
-- Example:
-- mda-sha1 DIGEST-ALGORITHM ::= {
diff --git a/lib/asn1/test/asn1_SUITE_data/rfcs/ISO8571-FTAM.asn1 b/lib/asn1/test/asn1_SUITE_data/rfcs/ISO8571-FTAM.asn1
index a57a276704..3765eb5b65 100644
--- a/lib/asn1/test/asn1_SUITE_data/rfcs/ISO8571-FTAM.asn1
+++ b/lib/asn1/test/asn1_SUITE_data/rfcs/ISO8571-FTAM.asn1
@@ -286,7 +286,7 @@ F-OPEN-response ::= SEQUENCE {
-- This flag is set if the responder is going to follow this response
-- by a P-ALTER-CONTEXT exchange.
--The following are conditional on the negotiation of the concecutive access
- -- or concurent access functional units.
+ -- or concurrent access functional units.
degree-of-overlap Degree-Of-Overlap OPTIONAL,
transfer-window [7] IMPLICIT INTEGER OPTIONAL
}
@@ -571,7 +571,7 @@ Change-Attributes ::= [APPLICATION 8] IMPLICIT SEQUENCE {
-- This Parameter tan only be sent when the
-- enhanced-filestore-management functional unit is available.
--- Atleast one attribute shall be present in the Change-Attributes
+-- At least one attribute shall be present in the Change-Attributes
-- Parameter on the request PDU.
Charging ::=
[APPLICATION 9] IMPLICIT
@@ -1350,7 +1350,7 @@ Attribute-Extensions-Pattern ::=
{@.extension-attribute-identifier})
}}
--- conjunction with the extention attribute in Order to
+-- conjunction with the extension attribute in Order to
-- perform Pattern matthing operations on it. it may be
-- defined in terms of other Patterns within this
-- Standard.
diff --git a/lib/asn1/test/asn1_SUITE_data/tcapsystem/MAP-MS-DataTypes.asn b/lib/asn1/test/asn1_SUITE_data/tcapsystem/MAP-MS-DataTypes.asn
index e905c44077..46c919b772 100644
--- a/lib/asn1/test/asn1_SUITE_data/tcapsystem/MAP-MS-DataTypes.asn
+++ b/lib/asn1/test/asn1_SUITE_data/tcapsystem/MAP-MS-DataTypes.asn
@@ -2100,7 +2100,7 @@ LocationInformation ::= SEQUENCE {
-- sai-Present indicates that the cellGlobalIdOrServiceAreaIdOrLAI parameter contains
-- a Service Area Identity.
-- currentLocationRetrieved shall be present
--- if the location information were retrieved after a successfull paging.
+-- if the location information were retrieved after a successful paging.
LocationInformationGPRS ::= SEQUENCE {
cellGlobalIdOrServiceAreaIdOrLAI [0] CellGlobalIdOrServiceAreaIdOrLAI OPTIONAL,
diff --git a/lib/asn1/test/asn1_SUITE_data/testobj.erl b/lib/asn1/test/asn1_SUITE_data/testobj.erl
index b582935f73..c358c26623 100644
--- a/lib/asn1/test/asn1_SUITE_data/testobj.erl
+++ b/lib/asn1/test/asn1_SUITE_data/testobj.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -427,7 +427,7 @@ run_sm_cmd() ->
{_ProtIEField2,11,_Crit2,DecEI},
{_ProtIEField3,75,_Crit3,DecKS}],
_ASN1novalue} ->
- io:format("Integrity Protection Algoritm: ~w~n~n", [DecIPI]),
+ io:format("Integrity Protection Algorithm: ~w~n~n", [DecIPI]),
io:format("Encryption Information: ~w~n~n", [DecEI]),
io:format("Key Status: ~w~n~n", [DecKS])
end,
@@ -452,7 +452,7 @@ run_sm_cmp() ->
[{_ProtIEField1,6,_Crit1,DecIPA},
{_ProtIEField2,5,_Crit2,DecEI}],
_ASN1novalue} ->
- io:format("Integrity Protection Algoritm: ~w~n~n", [DecIPA]),
+ io:format("Integrity Protection Algorithm: ~w~n~n", [DecIPA]),
io:format("Encryption Information: ~w~n~n", [DecEI])
end,
ok.
@@ -480,7 +480,7 @@ run_sm_rej() ->
% io:format("Value2: ~w~n~n", [Value2]),
% {ok,DecIPA} = wrapper_decode(?ranap, 'IntegrityProtectionAlgorithm', Value1),
% {ok,DecEI} = wrapper_decode(?ranap, 'EncryptionAlgorithm', Value2),
-% io:format("Integrity Protection Algoritm: ~w~n~n", [DecIPA]),
+% io:format("Integrity Protection Algorithm: ~w~n~n", [DecIPA]),
% io:format("Encryption Information: ~w~n~n", [DecEI])
% end,
ok.
@@ -563,7 +563,7 @@ run_reset() ->
run_reset_res() ->
IUP = reset_res([12,13,14,15,16,17,18,19,20]),
- io:format("Reset Rsource: ~w~n~n", [IUP]),
+ io:format("Reset Resource: ~w~n~n", [IUP]),
RanapIUP = ranap_pdu_contents(IUP, 27), % 27 = Reset Res
{ok, Tmp2} = wrapper_encode(?ranap, 'RANAP-PDU', RanapIUP),
EncRanapIUP = lists:flatten(Tmp2),
@@ -1390,7 +1390,7 @@ reset_res_ack(IuSCId) ->
reset_res_ack_ies(IuSCId) ->
[
cn_domain_ind() % Se initial Ue
- ,reset_res_list(IuSCId) % Se Reset Ressource
+ ,reset_res_list(IuSCId) % Se Reset Resource
].
diff --git a/lib/asn1/test/syntax_SUITE.erl b/lib/asn1/test/syntax_SUITE.erl
index e78161fbfe..ab3cf2cad0 100644
--- a/lib/asn1/test/syntax_SUITE.erl
+++ b/lib/asn1/test/syntax_SUITE.erl
@@ -187,7 +187,7 @@ objects(Config) ->
{"{&min 1, Max 10}",3,{syntax_error,'Max'}},
{"{min 1, &max 10}",3,{syntax_error,'&max'}},
{"{min 1, &Max 10}",3,{syntax_error,'&Max'}},
- {"{RESERVERD WORD BIT}",3,{syntax_error,'BIT'}},
+ {"{RESERVED WORD BIT}",3,{syntax_error,'BIT'}},
{"{&min 1",4,{syntax_error,'END'}}
],
L = [{Head++S++End,Line,E} || {S,Line,E} <- L0],
diff --git a/lib/common_test/Makefile b/lib/common_test/Makefile
index ea8506b34a..ca7baaa959 100644
--- a/lib/common_test/Makefile
+++ b/lib/common_test/Makefile
@@ -47,5 +47,6 @@ include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=compiler tools crypto runtime_tools syntax_tools ftp inets \
debugger sasl snmp ssh reltool observer xmerl
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/common_test/configure b/lib/common_test/configure
index 73b2a2d156..567e5a5f24 100755
--- a/lib/common_test/configure
+++ b/lib/common_test/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,41 +167,52 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -227,14 +220,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -252,18 +252,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -290,6 +291,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -307,6 +309,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -321,7 +331,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -330,7 +340,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -369,12 +379,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -386,18 +397,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -409,9 +429,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -438,7 +458,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -482,7 +502,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -496,6 +516,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -509,6 +533,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -574,16 +605,20 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
ac_subst_vars='LTLIBOBJS
LIBOBJS
TARGET
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -706,8 +741,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -748,9 +781,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -774,9 +807,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -987,9 +1020,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1003,9 +1036,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1049,9 +1082,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1067,7 +1100,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1131,7 +1164,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1249,6 +1282,7 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1272,9 +1306,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1302,7 +1336,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1310,7 +1345,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1320,9 +1355,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1332,14 +1367,34 @@ fi
## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -1372,8 +1427,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -1408,7 +1467,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -1443,11 +1502,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -1458,8 +1519,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -1483,7 +1544,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -1491,14 +1552,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -1506,15 +1567,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -1522,8 +1583,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -1537,63 +1598,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -1603,19 +1649,117 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${ERL_TOP}/make/autoconf"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -1626,12 +1770,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -1640,24 +1784,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -1667,11 +1811,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -1685,57 +1830,124 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_aux_dir=
-for ac_dir in priv/auxdir "$srcdir"/priv/auxdir; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in priv/auxdir \"$srcdir\"/priv/auxdir" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -1754,21 +1966,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -1787,9 +2000,107 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
else
- host_os=win32
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ # Adjust for local legacy windows hack...
+ case $host in #(
+ local-*-windows) :
+
+ host=win32
+ host_os=win32
+ host_vendor=
+ host_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $build in #(
+ local-*-windows) :
+
+ build=win32
+ build_os=win32
+ build_vendor=
+ build_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $target in #(
+ local-*-windows) :
+
+ target=win32
+ target_os=win32
+ target_vendor=
+ target_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+ if test "$cross_compiling" = "yes" -a "$build" = "$host"
+then :
+ as_fn_error $? "
+ Cross compiling with the same canonicalized 'host' value
+ as the canonicalized 'build' value.
+
+ We are cross compiling since the '--host=$host_alias'
+ and the '--build=$build_alias' arguments differ. When
+ cross compiling Erlang/OTP, also the canonicalized values of
+ the '--build' and the '--host' arguments *must* differ. The
+ canonicalized values of these arguments however both equals:
+ $host
+
+ You can check the canonical value by passing a value as
+ argument to the 'make/autoconf/config.sub' script.
+ " "$LINENO" 5
+fi
+
TARGET=$host
@@ -1823,8 +2134,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -1854,15 +2165,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -1876,8 +2187,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -1930,7 +2241,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -1946,8 +2257,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -1970,14 +2281,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -1987,46 +2300,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -2035,13 +2348,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -2050,8 +2356,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -2063,30 +2373,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -2099,13 +2389,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -2132,18 +2423,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -2155,12 +2448,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -2191,7 +2485,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -2213,6 +2507,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -2226,6 +2524,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -2267,7 +2571,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -2276,7 +2580,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -2339,7 +2643,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -2388,14 +2692,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -2432,21 +2738,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -2474,7 +2780,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -2488,7 +2794,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -2513,7 +2819,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -2741,7 +3047,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -2749,17 +3055,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -2776,7 +3082,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -2800,9 +3106,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -2855,8 +3161,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -2898,9 +3204,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -2947,7 +3253,8 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
diff --git a/lib/common_test/configure.ac b/lib/common_test/configure.ac
new file mode 100644
index 0000000000..490a64328d
--- /dev/null
+++ b/lib/common_test/configure.ac
@@ -0,0 +1,14 @@
+AC_INIT
+AC_PREREQ([2.71])
+
+m4_include([otp.m4])
+
+AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf])
+
+ERL_CANONICAL_SYSTEM_TYPE
+
+TARGET=$host
+AC_SUBST(TARGET)
+
+AC_CONFIG_FILES([priv/$host/Makefile:priv/Makefile.in])
+AC_OUTPUT
diff --git a/lib/common_test/configure.in b/lib/common_test/configure.in
deleted file mode 100644
index b2e6ad997a..0000000000
--- a/lib/common_test/configure.in
+++ /dev/null
@@ -1,14 +0,0 @@
-AC_INIT()
-
-AC_CONFIG_AUX_DIR(priv/auxdir)
-
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- AC_CANONICAL_HOST
-else
- host_os=win32
-fi
-
-TARGET=$host
-AC_SUBST(TARGET)
-
-AC_OUTPUT(priv/$host/Makefile:priv/Makefile.in)
diff --git a/lib/common_test/doc/src/ct.xml b/lib/common_test/doc/src/ct.xml
index a7a953fa4c..bc0e60f9a3 100644
--- a/lib/common_test/doc/src/ct.xml
+++ b/lib/common_test/doc/src/ct.xml
@@ -649,7 +649,7 @@
case. <c>Scaling</c> indicates if <c>Common Test</c> will attempt
to compensate timetraps automatically for runtime delays
introduced by, for example, tools like cover. <c>ScaleVal</c> is
- the value of the current scaling multipler (always 1 if scaling is
+ the value of the current scaling multiplier (always 1 if scaling is
disabled). Note the <c>Time</c> is not the scaled result.</p>
</desc>
</func>
@@ -1192,7 +1192,7 @@
{machine,[{node,[{telnet,IpAddr},{ftp,IpAddr}]}]}.</pre>
<note><p>The behavior of this function changed radically in
- <c>Common Test</c> 1.6.2. To keep some backwards compatability,
+ <c>Common Test</c> 1.6.2. To keep some backwards compatibility,
it is still possible to do:<br/>
<c>ct:require(a,{node,[telnet,ftp]}).</c><br/>
This associates the name <c>a</c> with the top-level <c>node</c>
diff --git a/lib/common_test/doc/src/ct_hooks.xml b/lib/common_test/doc/src/ct_hooks.xml
index 875efec305..666ed70c69 100644
--- a/lib/common_test/doc/src/ct_hooks.xml
+++ b/lib/common_test/doc/src/ct_hooks.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2010</year><year>2020</year>
+ <year>2010</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -679,7 +679,7 @@
<list type="bulleted">
<item><p>If <c>init_per_suite</c> fails, this function is called after
<seemfa marker="#Module:post_init_per_suite/4"><c>post_init_per_suite</c></seemfa>.</p></item>
- <item><p>If a test case fails, this funcion is called after
+ <item><p>If a test case fails, this function is called after
<seemfa marker="#Module:post_end_per_testcase/5"><c>post_end_per_testcase</c></seemfa>.</p></item>
</list>
diff --git a/lib/common_test/doc/src/ct_hooks_chapter.xml b/lib/common_test/doc/src/ct_hooks_chapter.xml
index 0318387d3c..aab8671f9e 100644
--- a/lib/common_test/doc/src/ct_hooks_chapter.xml
+++ b/lib/common_test/doc/src/ct_hooks_chapter.xml
@@ -317,7 +317,7 @@
{proplists:delete(tc_status, Config), CTHState};
false ->
%% DB is not good, mark as skipped instead of failing
- {{skip, "DB is inconsisten!"}, CTHState}
+ {{skip, "DB is inconsistent!"}, CTHState}
end;
post_end_per_testcase(_Suite, _TC, Config, Return, CTHState) -&gt;
%% Do nothing if tc does not crash.
@@ -505,7 +505,7 @@
logger handler, and prints them to the current test case log.
If an event cannot be associated with a test case, it is printed in
the <c>Common Test</c> framework log.
- This happens for test cases running in parallel and events occuring
+ This happens for test cases running in parallel and events occurring
in-between test cases.</p>
<p>The log events are handled using a <seeerl marker="kernel:logger">Logger</seeerl>
handler called cth_log_redirect. The formatting and level is copied from
diff --git a/lib/common_test/doc/src/ct_netconfc.xml b/lib/common_test/doc/src/ct_netconfc.xml
index 3f764a49d8..f5fd2165c9 100644
--- a/lib/common_test/doc/src/ct_netconfc.xml
+++ b/lib/common_test/doc/src/ct_netconfc.xml
@@ -505,7 +505,7 @@
Specify a <c>receiver</c> option at session creation to
provide a destination for incoming notifications independently
of a call to &create_subscription;, and use &send_rpc; to send
- establish-subscription and other arbirary RPCs.</p>
+ establish-subscription and other arbitrary RPCs.</p>
</note>
</desc>
</func>
@@ -697,7 +697,7 @@
<p>Which target parameters that can be used depends on if
<c>:candidate</c> and/or <c>:startup</c> are supported by the
- server. If successfull, the configuration system of the device is
+ server. If successful, the configuration system of the device is
unavailable to other clients (NETCONF, CORBA, SNMP, and so on).
Locks are intended to be short-lived.</p>
diff --git a/lib/common_test/doc/src/ct_property_test.xml b/lib/common_test/doc/src/ct_property_test.xml
index 5a1f6ab979..01c06501ae 100644
--- a/lib/common_test/doc/src/ct_property_test.xml
+++ b/lib/common_test/doc/src/ct_property_test.xml
@@ -236,7 +236,7 @@ ct_property_test:present_result(?MODULE, Cmds, RunResult, Config)
</item>
<item><c>FrequencyFun/0</c> returns a fun/1 which is supposed to take a list of items as input,
- and return an iolist wich will be printed as the table. Per default, the number of each item is counted
+ and return an iolist which will be printed as the table. Per default, the number of each item is counted
and the percentage is printed for each. The list [a,b,a,a,c] could for example return
<pre>
["a 60%\n","b 20%\n","c 20%\n"]</pre>
diff --git a/lib/common_test/doc/src/ct_ssh.xml b/lib/common_test/doc/src/ct_ssh.xml
index 7659dc986d..5e1385aac4 100644
--- a/lib/common_test/doc/src/ct_ssh.xml
+++ b/lib/common_test/doc/src/ct_ssh.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2010</year><year>2020</year>
+ <year>2010</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -171,7 +171,7 @@
<func>
<name since="">aread(SSH, Server, Handle, Len) -&gt; Result</name>
- <fsummary>For inforamtion and other types, see ssh_sftp(3).</fsummary>
+ <fsummary>For information and other types, see ssh_sftp(3).</fsummary>
<type>
<v>SSH = connection()</v>
<v>Result = ssh_sftp_return() | {error, Reason}</v>
diff --git a/lib/common_test/doc/src/ct_suite.xml b/lib/common_test/doc/src/ct_suite.xml
index 0289a569f0..8740a3ff79 100644
--- a/lib/common_test/doc/src/ct_suite.xml
+++ b/lib/common_test/doc/src/ct_suite.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2020</year>
+ <year>2020</year><year>2021</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -206,7 +206,7 @@
required by test cases (or configuration functions)
in the suite. If the required configuration variables are not found
in any of the configuration files, all test cases are skipped.
- For details about the <c>require</c> functionality, see funtion
+ For details about the <c>require</c> functionality, see function
<seemfa marker="ct#require/1"><c>ct:require/1,2</c></seemfa>.</p>
<p>With <c>userdata</c>, the user can
diff --git a/lib/common_test/doc/src/dependencies_chapter.xml b/lib/common_test/doc/src/dependencies_chapter.xml
index 236ce99f61..f5d409686e 100644
--- a/lib/common_test/doc/src/dependencies_chapter.xml
+++ b/lib/common_test/doc/src/dependencies_chapter.xml
@@ -78,7 +78,7 @@
</list>
<p>There are obvious dependencies between the listed functions. The server cannot
- be configured if it has not first been started, a client connot be connectd until
+ be configured if it has not first been started, a client cannot be connected until
the server is properly configured, and so on. If we want to have one test
case for each function, we might be tempted to try to always run the
test cases in the stated order and carry possible data (identities, handles,
diff --git a/lib/common_test/doc/src/event_handler_chapter.xml b/lib/common_test/doc/src/event_handler_chapter.xml
index ee758c3199..dd704ef04d 100644
--- a/lib/common_test/doc/src/event_handler_chapter.xml
+++ b/lib/common_test/doc/src/event_handler_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2006</year><year>2020</year>
+ <year>2006</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -290,7 +290,7 @@
<p><c>FailedCaseInSequence = atom()</c>, the name of a case that failed in a sequence.</p>
<p><c>RunTimeError = term()</c>, a runtime error, for example <c>badmatch</c> or
<c>undef</c>.</p>
- <p><c>StackTrace = list()</c>, list of function calls preceeding a runtime error.</p>
+ <p><c>StackTrace = list()</c>, list of function calls preceding a runtime error.</p>
<p><c>UserTerm = term()</c>, any data specified by user, or <c>exit/1</c> information.</p>
<p>This event is sent for every test case or configuration function that <c>Common Test</c>
has skipped automatically because of either a failed <c>init_per_suite</c> or
diff --git a/lib/common_test/doc/src/notes.xml b/lib/common_test/doc/src/notes.xml
index c6fc5575b6..69d12e1e3e 100644
--- a/lib/common_test/doc/src/notes.xml
+++ b/lib/common_test/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2021</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -273,7 +273,7 @@
<item>
<p>
A race condition could cause ct_netconfc:open/* to return
- a disfunctional handle, resulting in errors when invoking
+ a dysfunctional handle, resulting in errors when invoking
other api functions on it, and making it impossible to
establish a new connection to the server in question.
Similar symptoms were possible with open/* in modules
@@ -2287,7 +2287,7 @@
<c>{end_per_group,GroupName}</c>.</item> <item>When
<c>require</c> fails in an info function, such as suite/0
or group/1, the init configuration function is now
- reported as <c>auto_skipped</c> intead of <c>skipped</c>,
+ reported as <c>auto_skipped</c> instead of <c>skipped</c>,
with the <c>tc_done</c> event.</item> <item>When
<c>require</c> fails in an info function because of a
configuration name already in use, the <c>tc_done</c>
@@ -2588,7 +2588,7 @@
<list>
<item>
<p>
- Removed depricated run_test program, use ct_run instead.</p>
+ Removed deprecated run_test program, use ct_run instead.</p>
<p>
*** POTENTIAL INCOMPATIBILITY ***</p>
<p>
@@ -3081,7 +3081,7 @@
reference manual pages for details about which keys are
allowed.</p>
<p>
- This change introduces a backwards incompatability in the
+ This change introduces a backwards incompatibility in the
<c>ct:require/2</c> interface. Previously when doing
<c>ct:require(a_name,{key,subkey})</c>, a_name would be
associated with key. This has been changed to that
@@ -3428,7 +3428,7 @@
Common Test will now print error information (with a time
stamp) in the test case log file immediately when a test
case fails. This makes it easier to see when, in time,
- the fault actually occured, and aid the job of locating
+ the fault actually occurred, and aid the job of locating
relevant trace and debug printouts in the log.</p>
<p>
Own Id: OTP-9904 Aux Id: seq11985, OTP-9900 </p>
@@ -3714,7 +3714,7 @@
</item>
<item>
<p>
- If a timetrap timeout occured during execution of of a
+ If a timetrap timeout occurred during execution of of a
function in a lib module (i.e. a function called directly
or indirectly from a test case), the Suite argument in
the end_tc/3 framework callback function would not
@@ -3981,11 +3981,11 @@
<item>
<p>
Alpha release of Common Test Hooks (CTH). CTHs allow the
- users of common test to abtract out common behaviours
+ users of common test to abstract out common behaviours
from test suites in a much more elegant and flexible way
than was possible before. Note that the addition of this
feature may introduce minor changes in the undocumented
- behaviour of the interface inbetween common_test and
+ behaviour of the interface between common_test and
test_server.</p>
<p>
*** POTENTIAL INCOMPATIBILITY ***</p>
@@ -4133,7 +4133,7 @@
<p>
It is now possible for the user to provide specific
callback modules that handle test configuration data, so
- that data on arbitray form can be accessed (e.g. by
+ that data on arbitrary form can be accessed (e.g. by
reading files or by communicating with a configuration
server process). Two default callback modules have been
introduced in Common Test: ct_config_plain and
@@ -4554,7 +4554,7 @@
definitions). The properties make it possible to execute
test cases in parallel, in sequence and in shuffled
order. It is also possible to repeat test cases according
- to different criterias. The properties can be combined,
+ to different criteria. The properties can be combined,
making it possible to e.g. repeat a conf case a certain
number of times and execute the test cases in different
(random) order every time. Available properties are:
diff --git a/lib/common_test/doc/src/unix_telnet.xml b/lib/common_test/doc/src/unix_telnet.xml
index d9905aec32..1f54d2bef1 100644
--- a/lib/common_test/doc/src/unix_telnet.xml
+++ b/lib/common_test/doc/src/unix_telnet.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2010</year><year>2020</year>
+ <year>2010</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -75,7 +75,7 @@
<p>The <c>{port,PortNum}</c> tuple is optional and if omitted, default
Telnet port 23 is used. Also the <c>keep_alive</c> tuple is optional,
- and the value defauls to <c>true</c> (enabled).</p>
+ and the value default to <c>true</c> (enabled).</p>
</description>
<funcs>
diff --git a/lib/common_test/doc/src/write_test_chapter.xml b/lib/common_test/doc/src/write_test_chapter.xml
index ea5e54f73e..cf9dc426c8 100644
--- a/lib/common_test/doc/src/write_test_chapter.xml
+++ b/lib/common_test/doc/src/write_test_chapter.xml
@@ -917,7 +917,7 @@
can be enabled with start option <c>scale_timetraps</c>.</p>
<p>If a test case needs to suspend itself for a time that also gets
- multipled by <c>multiply_timetraps</c> (and possibly also scaled up if
+ multiplied by <c>multiply_timetraps</c> (and possibly also scaled up if
<c>scale_timetraps</c> is enabled), the function
<seemfa marker="ct#sleep/1"><c>ct:sleep/1</c></seemfa>
can be used (instead of, for example, <c>timer:sleep/1</c>).</p>
diff --git a/lib/common_test/include/ct.hrl b/lib/common_test/include/ct.hrl
index 2c947020e7..f478c193e7 100644
--- a/lib/common_test/include/ct.hrl
+++ b/lib/common_test/include/ct.hrl
@@ -36,6 +36,17 @@
-define(CT_HOOK_INIT_PROCESS, ct_util_server).
-define(CT_HOOK_TERMINATE_PROCESS, ct_util_server).
+%% Peer node names generated for Common Test purposes:
+-define(CT_PEER_NAME(TestCase), test_server:peer_name(?MODULE_STRING, TestCase)).
+-define(CT_PEER_NAME(), ?CT_PEER_NAME(?FUNCTION_NAME)).
+
+%% Start nodes with command line arguments or extended options
+-define(CT_PEER(Opts), test_server:start_peer(Opts, ?MODULE, ?FUNCTION_NAME)).
+%% Start a peer with name prefix of current ?MODULE and ?FUNCTION_NAME
+-define(CT_PEER(), ?CT_PEER([])).
+%% Start a compatibility node - for OTP test suites only
+-define(CT_PEER(Opts, Release, PrivDir), test_server:start_peer(Opts, ?MODULE, ?FUNCTION_NAME, Release, PrivDir)).
+
%% Backward compatibility for test_server test suites.
%% DO NOT USE IN NEW TEST SUITES.
-define(line,).
diff --git a/lib/common_test/priv/auxdir/config.guess b/lib/common_test/priv/auxdir/config.guess
deleted file mode 100755
index 1972fda8eb..0000000000
--- a/lib/common_test/priv/auxdir/config.guess
+++ /dev/null
@@ -1,1700 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright 1992-2021 Free Software Foundation, Inc.
-
-timestamp='2021-01-25'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <https://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program. This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-#
-# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
-#
-# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
-#
-# Please send patches to <config-patches@gnu.org>.
-
-
-me=$(echo "$0" | sed -e 's,.*/,,')
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Options:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright 1992-2021 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-tmp=
-# shellcheck disable=SC2172
-trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
-
-set_cc_for_build() {
- # prevent multiple calls if $tmp is already set
- test "$tmp" && return 0
- : "${TMPDIR=/tmp}"
- # shellcheck disable=SC2039
- { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
- dummy=$tmp/dummy
- case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
- ,,) echo "int x;" > "$dummy.c"
- for driver in cc gcc c89 c99 ; do
- if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$driver"
- break
- fi
- done
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
- esac
-}
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if test -f /.attbin/uname ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown
-UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown
-UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown
-UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown
-
-case "$UNAME_SYSTEM" in
-Linux|GNU|GNU/*)
- LIBC=unknown
-
- set_cc_for_build
- cat <<-EOF > "$dummy.c"
- #include <features.h>
- #if defined(__UCLIBC__)
- LIBC=uclibc
- #elif defined(__dietlibc__)
- LIBC=dietlibc
- #elif defined(__GLIBC__)
- LIBC=gnu
- #else
- #include <stdarg.h>
- /* First heuristic to detect musl libc. */
- #ifdef __DEFINED_va_list
- LIBC=musl
- #endif
- #endif
- EOF
- eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"
-
- # Second heuristic to detect musl libc.
- if [ "$LIBC" = unknown ] &&
- command -v ldd >/dev/null &&
- ldd --version 2>&1 | grep -q ^musl; then
- LIBC=musl
- fi
-
- # If the system lacks a compiler, then just pick glibc.
- # We could probably try harder.
- if [ "$LIBC" = unknown ]; then
- LIBC=gnu
- fi
- ;;
-esac
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \
- /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
- /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
- echo unknown))
- case "$UNAME_MACHINE_ARCH" in
- aarch64eb) machine=aarch64_be-unknown ;;
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- sh5el) machine=sh5le-unknown ;;
- earmv*)
- arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,')
- endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p')
- machine="${arch}${endian}"-unknown
- ;;
- *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently (or will in the future) and ABI.
- case "$UNAME_MACHINE_ARCH" in
- earm*)
- os=netbsdelf
- ;;
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ELF__
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # Determine ABI tags.
- case "$UNAME_MACHINE_ARCH" in
- earm*)
- expr='s/^earmv[0-9]/-eabi/;s/eb$//'
- abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr")
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "$UNAME_VERSION" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2)
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "$machine-${os}${release}${abi-}"
- exit ;;
- *:Bitrig:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
- exit ;;
- *:LibertyBSD:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
- exit ;;
- *:MidnightBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
- exit ;;
- *:ekkoBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
- exit ;;
- *:SolidBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
- exit ;;
- *:OS108:*:*)
- echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
- *:MirBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
- *:Sortix:*:*)
- echo "$UNAME_MACHINE"-unknown-sortix
- exit ;;
- *:Twizzler:*:*)
- echo "$UNAME_MACHINE"-unknown-twizzler
- exit ;;
- *:Redox:*:*)
- echo "$UNAME_MACHINE"-unknown-redox
- exit ;;
- mips:OSF1:*.*)
- echo mips-dec-osf1
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')
- ;;
- *5.*)
- UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1)
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE=alpha ;;
- "EV4.5 (21064)")
- UNAME_MACHINE=alpha ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE=alpha ;;
- "EV5 (21164)")
- UNAME_MACHINE=alphaev5 ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE=alphaev56 ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE=alphapca56 ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE=alphapca57 ;;
- "EV6 (21264)")
- UNAME_MACHINE=alphaev6 ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE=alphaev67 ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE=alphaev69 ;;
- "EV7 (21364)")
- UNAME_MACHINE=alphaev7 ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE=alphaev79 ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"
- # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
- exitcode=$?
- trap '' 0
- exit $exitcode ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix"$UNAME_RELEASE"
- exit ;;
- arm*:riscos:*:*|arm*:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "$( (/bin/universe) 2>/dev/null)" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case $(/usr/bin/uname -p) in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- s390x:SunOS:*:*)
- echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
- exit ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
- exit ;;
- i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux"$UNAME_RELEASE"
- exit ;;
- i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- set_cc_for_build
- SUN_ARCH=i386
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH=x86_64
- fi
- fi
- echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:*:*)
- case "$(/usr/bin/arch -k)" in
- Series*|S4*)
- UNAME_RELEASE=$(uname -v)
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos"$UNAME_RELEASE"
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)
- test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
- case "$(/bin/arch)" in
- sun3)
- echo m68k-sun-sunos"$UNAME_RELEASE"
- ;;
- sun4)
- echo sparc-sun-sunos"$UNAME_RELEASE"
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos"$UNAME_RELEASE"
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint"$UNAME_RELEASE"
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint"$UNAME_RELEASE"
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint"$UNAME_RELEASE"
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten"$UNAME_RELEASE"
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten"$UNAME_RELEASE"
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix"$UNAME_RELEASE"
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix"$UNAME_RELEASE"
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix"$UNAME_RELEASE"
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
- dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&
- SYSTEM_NAME=$("$dummy" "$dummyarg") &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos"$UNAME_RELEASE"
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=$(/usr/bin/uname -p)
- if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
- then
- if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
- test "$TARGET_BINARY_INTERFACE"x = x
- then
- echo m88k-dg-dgux"$UNAME_RELEASE"
- else
- echo m88k-dg-dguxbcs"$UNAME_RELEASE"
- fi
- else
- echo i586-dg-dgux"$UNAME_RELEASE"
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if test -x /usr/bin/oslevel ; then
- IBM_REV=$(/usr/bin/oslevel)
- else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
- fi
- echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[4567])
- IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')
- if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if test -x /usr/bin/lslpp ; then
- IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |
- awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)
- else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
- fi
- echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
- case "$UNAME_MACHINE" in
- 9000/31?) HP_ARCH=m68000 ;;
- 9000/[34]??) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if test -x /usr/bin/getconf; then
- sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)
- sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)
- case "$sc_cpu_version" in
- 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
- 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "$sc_kernel_bits" in
- 32) HP_ARCH=hppa2.0n ;;
- 64) HP_ARCH=hppa2.0w ;;
- '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if test "$HP_ARCH" = ""; then
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if test "$HP_ARCH" = hppa2.0w
- then
- set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
- grep -q __LP64__
- then
- HP_ARCH=hppa2.0w
- else
- HP_ARCH=hppa64
- fi
- fi
- echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
- echo ia64-hp-hpux"$HPUX_REV"
- exit ;;
- 3050*:HI-UX:*:*)
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if test -x /usr/sbin/sysversion ; then
- echo "$UNAME_MACHINE"-unknown-osf1mk
- else
- echo "$UNAME_MACHINE"-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
- FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
- FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
- FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
- *:BSD/OS:*:*)
- echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
- arm:FreeBSD:*:*)
- UNAME_PROCESSOR=$(uname -p)
- set_cc_for_build
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi
- else
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf
- fi
- exit ;;
- *:FreeBSD:*:*)
- UNAME_PROCESSOR=$(/usr/bin/uname -p)
- case "$UNAME_PROCESSOR" in
- amd64)
- UNAME_PROCESSOR=x86_64 ;;
- i386)
- UNAME_PROCESSOR=i586 ;;
- esac
- echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
- exit ;;
- i*:CYGWIN*:*)
- echo "$UNAME_MACHINE"-pc-cygwin
- exit ;;
- *:MINGW64*:*)
- echo "$UNAME_MACHINE"-pc-mingw64
- exit ;;
- *:MINGW*:*)
- echo "$UNAME_MACHINE"-pc-mingw32
- exit ;;
- *:MSYS*:*)
- echo "$UNAME_MACHINE"-pc-msys
- exit ;;
- i*:PW*:*)
- echo "$UNAME_MACHINE"-pc-pw32
- exit ;;
- *:Interix*:*)
- case "$UNAME_MACHINE" in
- x86)
- echo i586-pc-interix"$UNAME_RELEASE"
- exit ;;
- authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix"$UNAME_RELEASE"
- exit ;;
- IA64)
- echo ia64-unknown-interix"$UNAME_RELEASE"
- exit ;;
- esac ;;
- i*:UWIN*:*)
- echo "$UNAME_MACHINE"-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-pc-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"
- exit ;;
- *:Minix:*:*)
- echo "$UNAME_MACHINE"-unknown-minix
- exit ;;
- aarch64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- aarch64_be:Linux:*:*)
- UNAME_MACHINE=aarch64_be
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- alpha:Linux:*:*)
- case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- arc:Linux:*:* | arceb:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- arm*:Linux:*:*)
- set_cc_for_build
- if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_EABI__
- then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- else
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
- else
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
- fi
- fi
- exit ;;
- avr32*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- cris:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
- crisv32:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
- e2k:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- frv:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- hexagon:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- i*86:Linux:*:*)
- echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
- exit ;;
- ia64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- k1om:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- m32r*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- m68*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- mips:Linux:*:* | mips64:Linux:*:*)
- set_cc_for_build
- IS_GLIBC=0
- test x"${LIBC}" = xgnu && IS_GLIBC=1
- sed 's/^ //' << EOF > "$dummy.c"
- #undef CPU
- #undef mips
- #undef mipsel
- #undef mips64
- #undef mips64el
- #if ${IS_GLIBC} && defined(_ABI64)
- LIBCABI=gnuabi64
- #else
- #if ${IS_GLIBC} && defined(_ABIN32)
- LIBCABI=gnuabin32
- #else
- LIBCABI=${LIBC}
- #endif
- #endif
-
- #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
- CPU=mipsisa64r6
- #else
- #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
- CPU=mipsisa32r6
- #else
- #if defined(__mips64)
- CPU=mips64
- #else
- CPU=mips
- #endif
- #endif
- #endif
-
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- MIPS_ENDIAN=el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- MIPS_ENDIAN=
- #else
- MIPS_ENDIAN=
- #endif
- #endif
-EOF
- eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"
- test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
- ;;
- mips64el:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- openrisc*:Linux:*:*)
- echo or1k-unknown-linux-"$LIBC"
- exit ;;
- or32:Linux:*:* | or1k*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- padre:Linux:*:*)
- echo sparc-unknown-linux-"$LIBC"
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-"$LIBC"
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in
- PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
- PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
- *) echo hppa-unknown-linux-"$LIBC" ;;
- esac
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-"$LIBC"
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-"$LIBC"
- exit ;;
- ppc64le:Linux:*:*)
- echo powerpc64le-unknown-linux-"$LIBC"
- exit ;;
- ppcle:Linux:*:*)
- echo powerpcle-unknown-linux-"$LIBC"
- exit ;;
- riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
- exit ;;
- sh64*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- sh*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- tile*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- vax:Linux:*:*)
- echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
- exit ;;
- x86_64:Linux:*:*)
- set_cc_for_build
- LIBCABI=$LIBC
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_X32 >/dev/null
- then
- LIBCABI="$LIBC"x32
- fi
- fi
- echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI"
- exit ;;
- xtensa*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo "$UNAME_MACHINE"-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo "$UNAME_MACHINE"-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo "$UNAME_MACHINE"-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo "$UNAME_MACHINE"-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- i*86:*DOS:*:*)
- echo "$UNAME_MACHINE"-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:*)
- UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
- else
- echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case $(/bin/uname -X | grep "^Machine") in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)
- echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
- else
- echo "$UNAME_MACHINE"-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
- # Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configure will decide that
- # this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- NCR*:*:4.2:* | MPRAS*:*:4.2:*)
- OS_REL='.3'
- test -r /etc/.relid \
- && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv"$UNAME_RELEASE"
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=$( (uname -p) 2>/dev/null)
- echo "$UNAME_MACHINE"-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes@openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo "$UNAME_MACHINE"-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux"$UNAME_RELEASE"
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if test -d /usr/nec; then
- echo mips-nec-sysv"$UNAME_RELEASE"
- else
- echo mips-unknown-sysv"$UNAME_RELEASE"
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
- x86_64:Haiku:*:*)
- echo x86_64-unknown-haiku
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-ACE:SUPER-UX:*:*)
- echo sxace-nec-superux"$UNAME_RELEASE"
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
- *:Rhapsody:*:*)
- echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
- arm64:Darwin:*:*)
- echo aarch64-apple-darwin"$UNAME_RELEASE"
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=$(uname -p)
- case $UNAME_PROCESSOR in
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- if command -v xcode-select > /dev/null 2> /dev/null && \
- ! xcode-select --print-path > /dev/null 2> /dev/null ; then
- # Avoid executing cc if there is no toolchain installed as
- # cc will be a stub that puts up a graphical alert
- # prompting the user to install developer tools.
- CC_FOR_BUILD=no_compiler_found
- else
- set_cc_for_build
- fi
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- case $UNAME_PROCESSOR in
- i386) UNAME_PROCESSOR=x86_64 ;;
- powerpc) UNAME_PROCESSOR=powerpc64 ;;
- esac
- fi
- # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
- if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_PPC >/dev/null
- then
- UNAME_PROCESSOR=powerpc
- fi
- elif test "$UNAME_PROCESSOR" = i386 ; then
- # uname -m returns i386 or x86_64
- UNAME_PROCESSOR=$UNAME_MACHINE
- fi
- echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=$(uname -p)
- if test "$UNAME_PROCESSOR" = x86; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NEO-*:NONSTOP_KERNEL:*:*)
- echo neo-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSE-*:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSR-*:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSV-*:NONSTOP_KERNEL:*:*)
- echo nsv-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSX-*:NONSTOP_KERNEL:*:*)
- echo nsx-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- # shellcheck disable=SC2154
- if test "$cputype" = 386; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo "$UNAME_MACHINE"-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux"$UNAME_RELEASE"
- exit ;;
- *:DragonFly:*:*)
- echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=$( (uname -p) 2>/dev/null)
- case "$UNAME_MACHINE" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"
- exit ;;
- i*86:rdos:*:*)
- echo "$UNAME_MACHINE"-pc-rdos
- exit ;;
- *:AROS:*:*)
- echo "$UNAME_MACHINE"-unknown-aros
- exit ;;
- x86_64:VMkernel:*:*)
- echo "$UNAME_MACHINE"-unknown-esx
- exit ;;
- amd64:Isilon\ OneFS:*:*)
- echo x86_64-unknown-onefs
- exit ;;
- *:Unleashed:*:*)
- echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
- exit ;;
-esac
-
-# No uname command or uname output not recognized.
-set_cc_for_build
-cat > "$dummy.c" <<EOF
-#ifdef _SEQUENT_
-#include <sys/types.h>
-#include <sys/utsname.h>
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#include <signal.h>
-#if defined(_SIZE_T_) || defined(SIGLOST)
-#include <sys/utsname.h>
-#endif
-#endif
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null);
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-#endif
-
-#if defined (vax)
-#if !defined (ultrix)
-#include <sys/param.h>
-#if defined (BSD)
-#if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-#else
-#if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#else
- printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#endif
-#else
- printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#else
-#if defined(_SIZE_T_) || defined(SIGLOST)
- struct utsname un;
- uname (&un);
- printf ("vax-dec-ultrix%s\n", un.release); exit (0);
-#else
- printf ("vax-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#if defined(_SIZE_T_) || defined(SIGLOST)
- struct utsname *un;
- uname (&un);
- printf ("mips-dec-ultrix%s\n", un.release); exit (0);
-#else
- printf ("mips-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
-
-echo "$0: unable to guess system type" >&2
-
-case "$UNAME_MACHINE:$UNAME_SYSTEM" in
- mips:Linux | mips64:Linux)
- # If we got here on MIPS GNU/Linux, output extra information.
- cat >&2 <<EOF
-
-NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
-the system type. Please install a C compiler and try again.
-EOF
- ;;
-esac
-
-cat >&2 <<EOF
-
-This script (version $timestamp), has failed to recognize the
-operating system you are using. If your script is old, overwrite *all*
-copies of config.guess and config.sub with the latest versions from:
-
- https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
-and
- https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
-EOF
-
-year=$(echo $timestamp | sed 's,-.*,,')
-# shellcheck disable=SC2003
-if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then
- cat >&2 <<EOF
-
-If $0 has already been updated, send the following data and any
-information you think might be pertinent to config-patches@gnu.org to
-provide the necessary information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = $( (uname -m) 2>/dev/null || echo unknown)
-uname -r = $( (uname -r) 2>/dev/null || echo unknown)
-uname -s = $( (uname -s) 2>/dev/null || echo unknown)
-uname -v = $( (uname -v) 2>/dev/null || echo unknown)
-
-/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)
-/bin/uname -X = $( (/bin/uname -X) 2>/dev/null)
-
-hostinfo = $( (hostinfo) 2>/dev/null)
-/bin/universe = $( (/bin/universe) 2>/dev/null)
-/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null)
-/bin/arch = $( (/bin/arch) 2>/dev/null)
-/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null)
-/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)
-
-UNAME_MACHINE = "$UNAME_MACHINE"
-UNAME_RELEASE = "$UNAME_RELEASE"
-UNAME_SYSTEM = "$UNAME_SYSTEM"
-UNAME_VERSION = "$UNAME_VERSION"
-EOF
-fi
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/lib/common_test/priv/auxdir/config.sub b/lib/common_test/priv/auxdir/config.sub
deleted file mode 100755
index 63c1f1c8b5..0000000000
--- a/lib/common_test/priv/auxdir/config.sub
+++ /dev/null
@@ -1,1860 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright 1992-2021 Free Software Foundation, Inc.
-
-timestamp='2021-01-08'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <https://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program. This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-
-
-# Please send patches to <config-patches@gnu.org>.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=$(echo "$0" | sed -e 's,.*/,,')
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
-
-Canonicalize a configuration name.
-
-Options:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright 1992-2021 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo "$1"
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Split fields of configuration type
-# shellcheck disable=SC2162
-IFS="-" read field1 field2 field3 field4 <<EOF
-$1
-EOF
-
-# Separate into logical components for further validation
-case $1 in
- *-*-*-*-*)
- echo Invalid configuration \`"$1"\': more than four components >&2
- exit 1
- ;;
- *-*-*-*)
- basic_machine=$field1-$field2
- basic_os=$field3-$field4
- ;;
- *-*-*)
- # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
- # parts
- maybe_os=$field2-$field3
- case $maybe_os in
- nto-qnx* | linux-* | uclinux-uclibc* \
- | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
- | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
- | storm-chaos* | os2-emx* | rtmk-nova*)
- basic_machine=$field1
- basic_os=$maybe_os
- ;;
- android-linux)
- basic_machine=$field1-unknown
- basic_os=linux-android
- ;;
- *)
- basic_machine=$field1-$field2
- basic_os=$field3
- ;;
- esac
- ;;
- *-*)
- # A lone config we happen to match not fitting any pattern
- case $field1-$field2 in
- decstation-3100)
- basic_machine=mips-dec
- basic_os=
- ;;
- *-*)
- # Second component is usually, but not always the OS
- case $field2 in
- # Prevent following clause from handling this valid os
- sun*os*)
- basic_machine=$field1
- basic_os=$field2
- ;;
- # Manufacturers
- dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
- | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
- | unicom* | ibm* | next | hp | isi* | apollo | altos* \
- | convergent* | ncr* | news | 32* | 3600* | 3100* \
- | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
- | ultra | tti* | harris | dolphin | highlevel | gould \
- | cbm | ns | masscomp | apple | axis | knuth | cray \
- | microblaze* | sim | cisco \
- | oki | wec | wrs | winbond)
- basic_machine=$field1-$field2
- basic_os=
- ;;
- *)
- basic_machine=$field1
- basic_os=$field2
- ;;
- esac
- ;;
- esac
- ;;
- *)
- # Convert single-component short-hands not valid as part of
- # multi-component configurations.
- case $field1 in
- 386bsd)
- basic_machine=i386-pc
- basic_os=bsd
- ;;
- a29khif)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- basic_os=scout
- ;;
- alliant)
- basic_machine=fx80-alliant
- basic_os=
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- basic_os=
- ;;
- am29k)
- basic_machine=a29k-none
- basic_os=bsd
- ;;
- amdahl)
- basic_machine=580-amdahl
- basic_os=sysv
- ;;
- amiga)
- basic_machine=m68k-unknown
- basic_os=
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- basic_os=amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- basic_os=sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- basic_os=sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- basic_os=bsd
- ;;
- aros)
- basic_machine=i386-pc
- basic_os=aros
- ;;
- aux)
- basic_machine=m68k-apple
- basic_os=aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- basic_os=dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- basic_os=linux
- ;;
- cegcc)
- basic_machine=arm-unknown
- basic_os=cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- basic_os=bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- basic_os=bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- basic_os=bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- basic_os=bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- basic_os=bsd
- ;;
- cray)
- basic_machine=j90-cray
- basic_os=unicos
- ;;
- crds | unos)
- basic_machine=m68k-crds
- basic_os=
- ;;
- da30)
- basic_machine=m68k-da30
- basic_os=
- ;;
- decstation | pmax | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- basic_os=
- ;;
- delta88)
- basic_machine=m88k-motorola
- basic_os=sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- basic_os=dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- basic_os=msdosdjgpp
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- basic_os=ebmon
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- basic_os=ose
- ;;
- gmicro)
- basic_machine=tron-gmicro
- basic_os=sysv
- ;;
- go32)
- basic_machine=i386-pc
- basic_os=go32
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- basic_os=hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- basic_os=xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- basic_os=hms
- ;;
- harris)
- basic_machine=m88k-harris
- basic_os=sysv3
- ;;
- hp300 | hp300hpux)
- basic_machine=m68k-hp
- basic_os=hpux
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- basic_os=bsd
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- basic_os=osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- basic_os=proelf
- ;;
- i386mach)
- basic_machine=i386-mach
- basic_os=mach
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- basic_os=sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- basic_os=linux
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- basic_os=sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- basic_os=sysv
- ;;
- mingw64)
- basic_machine=x86_64-pc
- basic_os=mingw64
- ;;
- mingw32)
- basic_machine=i686-pc
- basic_os=mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- basic_os=mingw32ce
- ;;
- monitor)
- basic_machine=m68k-rom68k
- basic_os=coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- basic_os=morphos
- ;;
- moxiebox)
- basic_machine=moxie-unknown
- basic_os=moxiebox
- ;;
- msdos)
- basic_machine=i386-pc
- basic_os=msdos
- ;;
- msys)
- basic_machine=i686-pc
- basic_os=msys
- ;;
- mvs)
- basic_machine=i370-ibm
- basic_os=mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- basic_os=nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- basic_os=sysv4
- ;;
- netbsd386)
- basic_machine=i386-pc
- basic_os=netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- basic_os=linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- basic_os=newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- basic_os=newsos
- ;;
- necv70)
- basic_machine=v70-nec
- basic_os=sysv
- ;;
- nh3000)
- basic_machine=m68k-harris
- basic_os=cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- basic_os=cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- basic_os=nindy
- ;;
- mon960)
- basic_machine=i960-intel
- basic_os=mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- basic_os=nonstopux
- ;;
- os400)
- basic_machine=powerpc-ibm
- basic_os=os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- basic_os=ose
- ;;
- os68k)
- basic_machine=m68k-none
- basic_os=os68k
- ;;
- paragon)
- basic_machine=i860-intel
- basic_os=osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- basic_os=linux
- ;;
- psp)
- basic_machine=mipsallegrexel-sony
- basic_os=psp
- ;;
- pw32)
- basic_machine=i586-unknown
- basic_os=pw32
- ;;
- rdos | rdos64)
- basic_machine=x86_64-pc
- basic_os=rdos
- ;;
- rdos32)
- basic_machine=i386-pc
- basic_os=rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- basic_os=coff
- ;;
- sa29200)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- sei)
- basic_machine=mips-sei
- basic_os=seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- basic_os=
- ;;
- sps7)
- basic_machine=m68k-bull
- basic_os=sysv2
- ;;
- st2000)
- basic_machine=m68k-tandem
- basic_os=
- ;;
- stratus)
- basic_machine=i860-stratus
- basic_os=sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- basic_os=
- ;;
- sun2os3)
- basic_machine=m68000-sun
- basic_os=sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- basic_os=sunos4
- ;;
- sun3)
- basic_machine=m68k-sun
- basic_os=
- ;;
- sun3os3)
- basic_machine=m68k-sun
- basic_os=sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- basic_os=sunos4
- ;;
- sun4)
- basic_machine=sparc-sun
- basic_os=
- ;;
- sun4os3)
- basic_machine=sparc-sun
- basic_os=sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- basic_os=sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- basic_os=solaris2
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- basic_os=
- ;;
- sv1)
- basic_machine=sv1-cray
- basic_os=unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- basic_os=dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- basic_os=unicos
- ;;
- t90)
- basic_machine=t90-cray
- basic_os=unicos
- ;;
- toad1)
- basic_machine=pdp10-xkl
- basic_os=tops20
- ;;
- tpf)
- basic_machine=s390x-ibm
- basic_os=tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- basic_os=sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- basic_os=none
- ;;
- vaxv)
- basic_machine=vax-dec
- basic_os=sysv
- ;;
- vms)
- basic_machine=vax-dec
- basic_os=vms
- ;;
- vsta)
- basic_machine=i386-pc
- basic_os=vsta
- ;;
- vxworks960)
- basic_machine=i960-wrs
- basic_os=vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- basic_os=vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- basic_os=vxworks
- ;;
- xbox)
- basic_machine=i686-pc
- basic_os=mingw32
- ;;
- ymp)
- basic_machine=ymp-cray
- basic_os=unicos
- ;;
- *)
- basic_machine=$1
- basic_os=
- ;;
- esac
- ;;
-esac
-
-# Decode 1-component or ad-hoc basic machines
-case $basic_machine in
- # Here we handle the default manufacturer of certain CPU types. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- w89k)
- cpu=hppa1.1
- vendor=winbond
- ;;
- op50n)
- cpu=hppa1.1
- vendor=oki
- ;;
- op60c)
- cpu=hppa1.1
- vendor=oki
- ;;
- ibm*)
- cpu=i370
- vendor=ibm
- ;;
- orion105)
- cpu=clipper
- vendor=highlevel
- ;;
- mac | mpw | mac-mpw)
- cpu=m68k
- vendor=apple
- ;;
- pmac | pmac-mpw)
- cpu=powerpc
- vendor=apple
- ;;
-
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- cpu=m68000
- vendor=att
- ;;
- 3b*)
- cpu=we32k
- vendor=att
- ;;
- bluegene*)
- cpu=powerpc
- vendor=ibm
- basic_os=cnk
- ;;
- decsystem10* | dec10*)
- cpu=pdp10
- vendor=dec
- basic_os=tops10
- ;;
- decsystem20* | dec20*)
- cpu=pdp10
- vendor=dec
- basic_os=tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- cpu=m68k
- vendor=motorola
- ;;
- dpx2*)
- cpu=m68k
- vendor=bull
- basic_os=sysv3
- ;;
- encore | umax | mmax)
- cpu=ns32k
- vendor=encore
- ;;
- elxsi)
- cpu=elxsi
- vendor=elxsi
- basic_os=${basic_os:-bsd}
- ;;
- fx2800)
- cpu=i860
- vendor=alliant
- ;;
- genix)
- cpu=ns32k
- vendor=ns
- ;;
- h3050r* | hiux*)
- cpu=hppa1.1
- vendor=hitachi
- basic_os=hiuxwe2
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- cpu=m68000
- vendor=hp
- ;;
- hp9k3[2-9][0-9])
- cpu=m68k
- vendor=hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- i*86v32)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv32
- ;;
- i*86v4*)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv4
- ;;
- i*86v)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv
- ;;
- i*86sol2)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=solaris2
- ;;
- j90 | j90-cray)
- cpu=j90
- vendor=cray
- basic_os=${basic_os:-unicos}
- ;;
- iris | iris4d)
- cpu=mips
- vendor=sgi
- case $basic_os in
- irix*)
- ;;
- *)
- basic_os=irix4
- ;;
- esac
- ;;
- miniframe)
- cpu=m68000
- vendor=convergent
- ;;
- *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
- cpu=m68k
- vendor=atari
- basic_os=mint
- ;;
- news-3600 | risc-news)
- cpu=mips
- vendor=sony
- basic_os=newsos
- ;;
- next | m*-next)
- cpu=m68k
- vendor=next
- case $basic_os in
- openstep*)
- ;;
- nextstep*)
- ;;
- ns2*)
- basic_os=nextstep2
- ;;
- *)
- basic_os=nextstep3
- ;;
- esac
- ;;
- np1)
- cpu=np1
- vendor=gould
- ;;
- op50n-* | op60c-*)
- cpu=hppa1.1
- vendor=oki
- basic_os=proelf
- ;;
- pa-hitachi)
- cpu=hppa1.1
- vendor=hitachi
- basic_os=hiuxwe2
- ;;
- pbd)
- cpu=sparc
- vendor=tti
- ;;
- pbb)
- cpu=m68k
- vendor=tti
- ;;
- pc532)
- cpu=ns32k
- vendor=pc532
- ;;
- pn)
- cpu=pn
- vendor=gould
- ;;
- power)
- cpu=power
- vendor=ibm
- ;;
- ps2)
- cpu=i386
- vendor=ibm
- ;;
- rm[46]00)
- cpu=mips
- vendor=siemens
- ;;
- rtpc | rtpc-*)
- cpu=romp
- vendor=ibm
- ;;
- sde)
- cpu=mipsisa32
- vendor=sde
- basic_os=${basic_os:-elf}
- ;;
- simso-wrs)
- cpu=sparclite
- vendor=wrs
- basic_os=vxworks
- ;;
- tower | tower-32)
- cpu=m68k
- vendor=ncr
- ;;
- vpp*|vx|vx-*)
- cpu=f301
- vendor=fujitsu
- ;;
- w65)
- cpu=w65
- vendor=wdc
- ;;
- w89k-*)
- cpu=hppa1.1
- vendor=winbond
- basic_os=proelf
- ;;
- none)
- cpu=none
- vendor=none
- ;;
- leon|leon[3-9])
- cpu=sparc
- vendor=$basic_machine
- ;;
- leon-*|leon[3-9]-*)
- cpu=sparc
- vendor=$(echo "$basic_machine" | sed 's/-.*//')
- ;;
-
- *-*)
- # shellcheck disable=SC2162
- IFS="-" read cpu vendor <<EOF
-$basic_machine
-EOF
- ;;
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- cpu=$basic_machine
- vendor=pc
- ;;
- # These rules are duplicated from below for sake of the special case above;
- # i.e. things that normalized to x86 arches should also default to "pc"
- pc98)
- cpu=i386
- vendor=pc
- ;;
- x64 | amd64)
- cpu=x86_64
- vendor=pc
- ;;
- # Recognize the basic CPU types without company name.
- *)
- cpu=$basic_machine
- vendor=unknown
- ;;
-esac
-
-unset -v basic_machine
-
-# Decode basic machines in the full and proper CPU-Company form.
-case $cpu-$vendor in
- # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- craynv-unknown)
- vendor=cray
- basic_os=${basic_os:-unicosmp}
- ;;
- c90-unknown | c90-cray)
- vendor=cray
- basic_os=${Basic_os:-unicos}
- ;;
- fx80-unknown)
- vendor=alliant
- ;;
- romp-unknown)
- vendor=ibm
- ;;
- mmix-unknown)
- vendor=knuth
- ;;
- microblaze-unknown | microblazeel-unknown)
- vendor=xilinx
- ;;
- rs6000-unknown)
- vendor=ibm
- ;;
- vax-unknown)
- vendor=dec
- ;;
- pdp11-unknown)
- vendor=dec
- ;;
- we32k-unknown)
- vendor=att
- ;;
- cydra-unknown)
- vendor=cydrome
- ;;
- i370-ibm*)
- vendor=ibm
- ;;
- orion-unknown)
- vendor=highlevel
- ;;
- xps-unknown | xps100-unknown)
- cpu=xps100
- vendor=honeywell
- ;;
-
- # Here we normalize CPU types with a missing or matching vendor
- dpx20-unknown | dpx20-bull)
- cpu=rs6000
- vendor=bull
- basic_os=${basic_os:-bosx}
- ;;
-
- # Here we normalize CPU types irrespective of the vendor
- amd64-*)
- cpu=x86_64
- ;;
- blackfin-*)
- cpu=bfin
- basic_os=linux
- ;;
- c54x-*)
- cpu=tic54x
- ;;
- c55x-*)
- cpu=tic55x
- ;;
- c6x-*)
- cpu=tic6x
- ;;
- e500v[12]-*)
- cpu=powerpc
- basic_os=${basic_os}"spe"
- ;;
- mips3*-*)
- cpu=mips64
- ;;
- ms1-*)
- cpu=mt
- ;;
- m68knommu-*)
- cpu=m68k
- basic_os=linux
- ;;
- m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
- cpu=s12z
- ;;
- openrisc-*)
- cpu=or32
- ;;
- parisc-*)
- cpu=hppa
- basic_os=linux
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- cpu=i586
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
- cpu=i686
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- cpu=i686
- ;;
- pentium4-*)
- cpu=i786
- ;;
- pc98-*)
- cpu=i386
- ;;
- ppc-* | ppcbe-*)
- cpu=powerpc
- ;;
- ppcle-* | powerpclittle-*)
- cpu=powerpcle
- ;;
- ppc64-*)
- cpu=powerpc64
- ;;
- ppc64le-* | powerpc64little-*)
- cpu=powerpc64le
- ;;
- sb1-*)
- cpu=mipsisa64sb1
- ;;
- sb1el-*)
- cpu=mipsisa64sb1el
- ;;
- sh5e[lb]-*)
- cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')
- ;;
- spur-*)
- cpu=spur
- ;;
- strongarm-* | thumb-*)
- cpu=arm
- ;;
- tx39-*)
- cpu=mipstx39
- ;;
- tx39el-*)
- cpu=mipstx39el
- ;;
- x64-*)
- cpu=x86_64
- ;;
- xscale-* | xscalee[bl]-*)
- cpu=$(echo "$cpu" | sed 's/^xscale/arm/')
- ;;
- arm64-*)
- cpu=aarch64
- ;;
-
- # Recognize the canonical CPU Types that limit and/or modify the
- # company names they are paired with.
- cr16-*)
- basic_os=${basic_os:-elf}
- ;;
- crisv32-* | etraxfs*-*)
- cpu=crisv32
- vendor=axis
- ;;
- cris-* | etrax*-*)
- cpu=cris
- vendor=axis
- ;;
- crx-*)
- basic_os=${basic_os:-elf}
- ;;
- neo-tandem)
- cpu=neo
- vendor=tandem
- ;;
- nse-tandem)
- cpu=nse
- vendor=tandem
- ;;
- nsr-tandem)
- cpu=nsr
- vendor=tandem
- ;;
- nsv-tandem)
- cpu=nsv
- vendor=tandem
- ;;
- nsx-tandem)
- cpu=nsx
- vendor=tandem
- ;;
- mipsallegrexel-sony)
- cpu=mipsallegrexel
- vendor=sony
- ;;
- tile*-*)
- basic_os=${basic_os:-linux-gnu}
- ;;
-
- *)
- # Recognize the canonical CPU types that are allowed with any
- # company name.
- case $cpu in
- 1750a | 580 \
- | a29k \
- | aarch64 | aarch64_be \
- | abacus \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
- | alphapca5[67] | alpha64pca5[67] \
- | am33_2.0 \
- | amdgcn \
- | arc | arceb \
- | arm | arm[lb]e | arme[lb] | armv* \
- | avr | avr32 \
- | asmjs \
- | ba \
- | be32 | be64 \
- | bfin | bpf | bs2000 \
- | c[123]* | c30 | [cjt]90 | c4x \
- | c8051 | clipper | craynv | csky | cydra \
- | d10v | d30v | dlx | dsp16xx \
- | e2k | elxsi | epiphany \
- | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
- | h8300 | h8500 \
- | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i*86 | i860 | i960 | ia16 | ia64 \
- | ip2k | iq2000 \
- | k1om \
- | le32 | le64 \
- | lm32 \
- | loongarch32 | loongarch64 | loongarchx32 \
- | m32c | m32r | m32rle \
- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
- | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
- | m88110 | m88k | maxq | mb | mcore | mep | metag \
- | microblaze | microblazeel \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64eb | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa32r6 | mipsisa32r6el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64r6 | mipsisa64r6el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipsr5900 | mipsr5900el \
- | mipstx39 | mipstx39el \
- | mmix \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nfp \
- | nios | nios2 | nios2eb | nios2el \
- | none | np1 | ns16k | ns32k | nvptx \
- | open8 \
- | or1k* \
- | or32 \
- | orion \
- | picochip \
- | pdp10 | pdp11 | pj | pjl | pn | power \
- | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
- | pru \
- | pyramid \
- | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
- | rl78 | romp | rs6000 | rx \
- | s390 | s390x \
- | score \
- | sh | shl \
- | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
- | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
- | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
- | spu \
- | tahoe \
- | thumbv7* \
- | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
- | tron \
- | ubicom32 \
- | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
- | vax \
- | visium \
- | w65 \
- | wasm32 | wasm64 \
- | we32k \
- | x86 | x86_64 | xc16x | xgate | xps100 \
- | xstormy16 | xtensa* \
- | ymp \
- | z8k | z80)
- ;;
-
- *)
- echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
- exit 1
- ;;
- esac
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $vendor in
- digital*)
- vendor=dec
- ;;
- commodore*)
- vendor=cbm
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if test x$basic_os != x
-then
-
-# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
-# set os.
-case $basic_os in
- gnu/linux*)
- kernel=linux
- os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')
- ;;
- os2-emx)
- kernel=os2
- os=$(echo $basic_os | sed -e 's|os2-emx|emx|')
- ;;
- nto-qnx*)
- kernel=nto
- os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')
- ;;
- *-*)
- # shellcheck disable=SC2162
- IFS="-" read kernel os <<EOF
-$basic_os
-EOF
- ;;
- # Default OS when just kernel was specified
- nto*)
- kernel=nto
- os=$(echo $basic_os | sed -e 's|nto|qnx|')
- ;;
- linux*)
- kernel=linux
- os=$(echo $basic_os | sed -e 's|linux|gnu|')
- ;;
- *)
- kernel=
- os=$basic_os
- ;;
-esac
-
-# Now, normalize the OS (knowing we just have one component, it's not a kernel,
-# etc.)
-case $os in
- # First match some system type aliases that might get confused
- # with valid system types.
- # solaris* is a basic system type, with this one exception.
- auroraux)
- os=auroraux
- ;;
- bluegene*)
- os=cnk
- ;;
- solaris1 | solaris1.*)
- os=$(echo $os | sed -e 's|solaris1|sunos4|')
- ;;
- solaris)
- os=solaris2
- ;;
- unixware*)
- os=sysv4.2uw
- ;;
- # es1800 is here to avoid being matched by es* (a different OS)
- es1800*)
- os=ose
- ;;
- # Some version numbers need modification
- chorusos*)
- os=chorusos
- ;;
- isc)
- os=isc2.2
- ;;
- sco6)
- os=sco5v6
- ;;
- sco5)
- os=sco3.2v5
- ;;
- sco4)
- os=sco3.2v4
- ;;
- sco3.2.[4-9]*)
- os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')
- ;;
- sco*v* | scout)
- # Don't match below
- ;;
- sco*)
- os=sco3.2v2
- ;;
- psos*)
- os=psos
- ;;
- qnx*)
- os=qnx
- ;;
- hiux*)
- os=hiuxwe2
- ;;
- lynx*178)
- os=lynxos178
- ;;
- lynx*5)
- os=lynxos5
- ;;
- lynxos*)
- # don't get caught up in next wildcard
- ;;
- lynx*)
- os=lynxos
- ;;
- mac[0-9]*)
- os=$(echo "$os" | sed -e 's|mac|macos|')
- ;;
- opened*)
- os=openedition
- ;;
- os400*)
- os=os400
- ;;
- sunos5*)
- os=$(echo "$os" | sed -e 's|sunos5|solaris2|')
- ;;
- sunos6*)
- os=$(echo "$os" | sed -e 's|sunos6|solaris3|')
- ;;
- wince*)
- os=wince
- ;;
- utek*)
- os=bsd
- ;;
- dynix*)
- os=bsd
- ;;
- acis*)
- os=aos
- ;;
- atheos*)
- os=atheos
- ;;
- syllable*)
- os=syllable
- ;;
- 386bsd)
- os=bsd
- ;;
- ctix* | uts*)
- os=sysv
- ;;
- nova*)
- os=rtmk-nova
- ;;
- ns2)
- os=nextstep2
- ;;
- # Preserve the version number of sinix5.
- sinix5.*)
- os=$(echo $os | sed -e 's|sinix|sysv|')
- ;;
- sinix*)
- os=sysv4
- ;;
- tpf*)
- os=tpf
- ;;
- triton*)
- os=sysv3
- ;;
- oss*)
- os=sysv3
- ;;
- svr4*)
- os=sysv4
- ;;
- svr3)
- os=sysv3
- ;;
- sysvr4)
- os=sysv4
- ;;
- ose*)
- os=ose
- ;;
- *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
- os=mint
- ;;
- dicos*)
- os=dicos
- ;;
- pikeos*)
- # Until real need of OS specific support for
- # particular features comes up, bare metal
- # configurations are quite functional.
- case $cpu in
- arm*)
- os=eabi
- ;;
- *)
- os=elf
- ;;
- esac
- ;;
- *)
- # No normalization, but not necessarily accepted, that comes below.
- ;;
-esac
-
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-kernel=
-case $cpu-$vendor in
- score-*)
- os=elf
- ;;
- spu-*)
- os=elf
- ;;
- *-acorn)
- os=riscix1.2
- ;;
- arm*-rebel)
- kernel=linux
- os=gnu
- ;;
- arm*-semi)
- os=aout
- ;;
- c4x-* | tic4x-*)
- os=coff
- ;;
- c8051-*)
- os=elf
- ;;
- clipper-intergraph)
- os=clix
- ;;
- hexagon-*)
- os=elf
- ;;
- tic54x-*)
- os=coff
- ;;
- tic55x-*)
- os=coff
- ;;
- tic6x-*)
- os=coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=tops20
- ;;
- pdp11-*)
- os=none
- ;;
- *-dec | vax-*)
- os=ultrix4.2
- ;;
- m68*-apollo)
- os=domain
- ;;
- i386-sun)
- os=sunos4.0.2
- ;;
- m68000-sun)
- os=sunos3
- ;;
- m68*-cisco)
- os=aout
- ;;
- mep-*)
- os=elf
- ;;
- mips*-cisco)
- os=elf
- ;;
- mips*-*)
- os=elf
- ;;
- or32-*)
- os=coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=sysv3
- ;;
- sparc-* | *-sun)
- os=sunos4.1.1
- ;;
- pru-*)
- os=elf
- ;;
- *-be)
- os=beos
- ;;
- *-ibm)
- os=aix
- ;;
- *-knuth)
- os=mmixware
- ;;
- *-wec)
- os=proelf
- ;;
- *-winbond)
- os=proelf
- ;;
- *-oki)
- os=proelf
- ;;
- *-hp)
- os=hpux
- ;;
- *-hitachi)
- os=hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=sysv
- ;;
- *-cbm)
- os=amigaos
- ;;
- *-dg)
- os=dgux
- ;;
- *-dolphin)
- os=sysv3
- ;;
- m68k-ccur)
- os=rtu
- ;;
- m88k-omron*)
- os=luna
- ;;
- *-next)
- os=nextstep
- ;;
- *-sequent)
- os=ptx
- ;;
- *-crds)
- os=unos
- ;;
- *-ns)
- os=genix
- ;;
- i370-*)
- os=mvs
- ;;
- *-gould)
- os=sysv
- ;;
- *-highlevel)
- os=bsd
- ;;
- *-encore)
- os=bsd
- ;;
- *-sgi)
- os=irix
- ;;
- *-siemens)
- os=sysv4
- ;;
- *-masscomp)
- os=rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=uxpv
- ;;
- *-rom68k)
- os=coff
- ;;
- *-*bug)
- os=coff
- ;;
- *-apple)
- os=macos
- ;;
- *-atari*)
- os=mint
- ;;
- *-wrs)
- os=vxworks
- ;;
- *)
- os=none
- ;;
-esac
-
-fi
-
-# Now, validate our (potentially fixed-up) OS.
-case $os in
- # Sometimes we do "kernel-libc", so those need to count as OSes.
- musl* | newlib* | uclibc*)
- ;;
- # Likewise for "kernel-abi"
- eabi* | gnueabi*)
- ;;
- # VxWorks passes extra cpu info in the 4th filed.
- simlinux | simwindows | spe)
- ;;
- # Now accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST end in a * to match a version number.
- gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
- | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
- | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
- | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
- | hiux* | abug | nacl* | netware* | windows* \
- | os9* | macos* | osx* | ios* \
- | mpw* | magic* | mmixware* | mon960* | lnews* \
- | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
- | aos* | aros* | cloudabi* | sortix* | twizzler* \
- | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
- | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
- | mirbsd* | netbsd* | dicos* | openedition* | ose* \
- | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
- | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
- | udi* | lites* | ieee* | go32* | aux* | hcos* \
- | chorusrdb* | cegcc* | glidix* \
- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
- | midipix* | mingw32* | mingw64* | mint* \
- | uxpv* | beos* | mpeix* | udk* | moxiebox* \
- | interix* | uwin* | mks* | rhapsody* | darwin* \
- | openstep* | oskit* | conix* | pw32* | nonstopux* \
- | storm-chaos* | tops10* | tenex* | tops20* | its* \
- | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
- | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
- | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
- | skyos* | haiku* | rdos* | toppers* | drops* | es* \
- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
- | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
- | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
- ;;
- # This one is extra strict with allowed versions
- sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- ;;
- none)
- ;;
- *)
- echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# As a final step for OS-related things, validate the OS-kernel combination
-# (given a valid OS), if there is a kernel.
-case $kernel-$os in
- linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
- ;;
- uclinux-uclibc* )
- ;;
- -dietlibc* | -newlib* | -musl* | -uclibc* )
- # These are just libc implementations, not actual OSes, and thus
- # require a kernel.
- echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
- exit 1
- ;;
- kfreebsd*-gnu* | kopensolaris*-gnu*)
- ;;
- vxworks-simlinux | vxworks-simwindows | vxworks-spe)
- ;;
- nto-qnx*)
- ;;
- os2-emx)
- ;;
- *-eabi* | *-gnueabi*)
- ;;
- -*)
- # Blank kernel with real OS is always fine.
- ;;
- *-*)
- echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
- exit 1
- ;;
-esac
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-case $vendor in
- unknown)
- case $cpu-$os in
- *-riscix*)
- vendor=acorn
- ;;
- *-sunos*)
- vendor=sun
- ;;
- *-cnk* | *-aix*)
- vendor=ibm
- ;;
- *-beos*)
- vendor=be
- ;;
- *-hpux*)
- vendor=hp
- ;;
- *-mpeix*)
- vendor=hp
- ;;
- *-hiux*)
- vendor=hitachi
- ;;
- *-unos*)
- vendor=crds
- ;;
- *-dgux*)
- vendor=dg
- ;;
- *-luna*)
- vendor=omron
- ;;
- *-genix*)
- vendor=ns
- ;;
- *-clix*)
- vendor=intergraph
- ;;
- *-mvs* | *-opened*)
- vendor=ibm
- ;;
- *-os400*)
- vendor=ibm
- ;;
- s390-* | s390x-*)
- vendor=ibm
- ;;
- *-ptx*)
- vendor=sequent
- ;;
- *-tpf*)
- vendor=ibm
- ;;
- *-vxsim* | *-vxworks* | *-windiss*)
- vendor=wrs
- ;;
- *-aux*)
- vendor=apple
- ;;
- *-hms*)
- vendor=hitachi
- ;;
- *-mpw* | *-macos*)
- vendor=apple
- ;;
- *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
- vendor=atari
- ;;
- *-vos*)
- vendor=stratus
- ;;
- esac
- ;;
-esac
-
-echo "$cpu-$vendor-${kernel:+$kernel-}$os"
-exit
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/lib/common_test/priv/auxdir/install-sh b/lib/common_test/priv/auxdir/install-sh
deleted file mode 100755
index ec298b5374..0000000000
--- a/lib/common_test/priv/auxdir/install-sh
+++ /dev/null
@@ -1,541 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2020-11-14.01; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-tab=' '
-nl='
-'
-IFS=" $tab$nl"
-
-# Set DOITPROG to "echo" to test this script.
-
-doit=${DOITPROG-}
-doit_exec=${doit:-exec}
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-# Create dirs (including intermediate dirs) using mode 755.
-# This is like GNU 'install' as of coreutils 8.32 (2020).
-mkdir_umask=22
-
-backupsuffix=
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-is_target_a_directory=possibly
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
- or: $0 [OPTION]... SRCFILES... DIRECTORY
- or: $0 [OPTION]... -t DIRECTORY SRCFILES...
- or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
- --help display this help and exit.
- --version display version info and exit.
-
- -c (ignored)
- -C install only if different (preserve data modification time)
- -d create directories instead of installing files.
- -g GROUP $chgrpprog installed files to GROUP.
- -m MODE $chmodprog installed files to MODE.
- -o USER $chownprog installed files to USER.
- -p pass -p to $cpprog.
- -s $stripprog installed files.
- -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
- -t DIRECTORY install into DIRECTORY.
- -T report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
- RMPROG STRIPPROG
-
-By default, rm is invoked with -f; when overridden with RMPROG,
-it's up to you to specify -f if you want it.
-
-If -S is not specified, no backups are attempted.
-
-Email bug reports to bug-automake@gnu.org.
-Automake home page: https://www.gnu.org/software/automake/
-"
-
-while test $# -ne 0; do
- case $1 in
- -c) ;;
-
- -C) copy_on_change=true;;
-
- -d) dir_arg=true;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift;;
-
- --help) echo "$usage"; exit $?;;
-
- -m) mode=$2
- case $mode in
- *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
-
- -o) chowncmd="$chownprog $2"
- shift;;
-
- -p) cpprog="$cpprog -p";;
-
- -s) stripcmd=$stripprog;;
-
- -S) backupsuffix="$2"
- shift;;
-
- -t)
- is_target_a_directory=always
- dst_arg=$2
- # Protect names problematic for 'test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- shift;;
-
- -T) is_target_a_directory=never;;
-
- --version) echo "$0 $scriptversion"; exit $?;;
-
- --) shift
- break;;
-
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
-
- *) break;;
- esac
- shift
-done
-
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
- if test -n "$dst_arg"; then
- echo "$0: target directory not allowed when installing a directory." >&2
- exit 1
- fi
-fi
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
- # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dst_arg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dst_arg"
- shift # fnord
- fi
- shift # arg
- dst_arg=$arg
- # Protect names problematic for 'test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- done
-fi
-
-if test $# -eq 0; then
- if test -z "$dir_arg"; then
- echo "$0: no input file specified." >&2
- exit 1
- fi
- # It's OK to call 'install-sh -d' without argument.
- # This can happen when creating conditional directories.
- exit 0
-fi
-
-if test -z "$dir_arg"; then
- if test $# -gt 1 || test "$is_target_a_directory" = always; then
- if test ! -d "$dst_arg"; then
- echo "$0: $dst_arg: Is not a directory." >&2
- exit 1
- fi
- fi
-fi
-
-if test -z "$dir_arg"; then
- do_exit='(exit $ret); exit $ret'
- trap "ret=129; $do_exit" 1
- trap "ret=130; $do_exit" 2
- trap "ret=141; $do_exit" 13
- trap "ret=143; $do_exit" 15
-
- # Set umask so as not to create temps with too-generous modes.
- # However, 'strip' requires both read and write access to temps.
- case $mode in
- # Optimize common cases.
- *644) cp_umask=133;;
- *755) cp_umask=22;;
-
- *[0-7])
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw='% 200'
- fi
- cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
- *)
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw=,u+rw
- fi
- cp_umask=$mode$u_plus_rw;;
- esac
-fi
-
-for src
-do
- # Protect names problematic for 'test' and other utilities.
- case $src in
- -* | [=\(\)!]) src=./$src;;
- esac
-
- if test -n "$dir_arg"; then
- dst=$src
- dstdir=$dst
- test -d "$dstdir"
- dstdir_status=$?
- # Don't chown directories that already exist.
- if test $dstdir_status = 0; then
- chowncmd=""
- fi
- else
-
- # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
- # might cause directories to be created, which would be especially bad
- # if $src (and thus $dsttmp) contains '*'.
- if test ! -f "$src" && test ! -d "$src"; then
- echo "$0: $src does not exist." >&2
- exit 1
- fi
-
- if test -z "$dst_arg"; then
- echo "$0: no destination specified." >&2
- exit 1
- fi
- dst=$dst_arg
-
- # If destination is a directory, append the input filename.
- if test -d "$dst"; then
- if test "$is_target_a_directory" = never; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
- fi
- dstdir=$dst
- dstbase=`basename "$src"`
- case $dst in
- */) dst=$dst$dstbase;;
- *) dst=$dst/$dstbase;;
- esac
- dstdir_status=0
- else
- dstdir=`dirname "$dst"`
- test -d "$dstdir"
- dstdir_status=$?
- fi
- fi
-
- case $dstdir in
- */) dstdirslash=$dstdir;;
- *) dstdirslash=$dstdir/;;
- esac
-
- obsolete_mkdir_used=false
-
- if test $dstdir_status != 0; then
- case $posix_mkdir in
- '')
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
- else
- mkdir_mode=
- fi
-
- posix_mkdir=false
- # The $RANDOM variable is not portable (e.g., dash). Use it
- # here however when possible just to lower collision chance.
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-
- trap '
- ret=$?
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
- exit $ret
- ' 0
-
- # Because "mkdir -p" follows existing symlinks and we likely work
- # directly in world-writeable /tmp, make sure that the '$tmpdir'
- # directory is successfully created first before we actually test
- # 'mkdir -p'.
- if (umask $mkdir_umask &&
- $mkdirprog $mkdir_mode "$tmpdir" &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- test_tmpdir="$tmpdir/a"
- ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
- fi
- trap '' 0;;
- esac
-
- if
- $posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
- )
- then :
- else
-
- # mkdir does not conform to POSIX,
- # or it failed possibly due to a race condition. Create the
- # directory the slow way, step by step, checking for races as we go.
-
- case $dstdir in
- /*) prefix='/';;
- [-=\(\)!]*) prefix='./';;
- *) prefix='';;
- esac
-
- oIFS=$IFS
- IFS=/
- set -f
- set fnord $dstdir
- shift
- set +f
- IFS=$oIFS
-
- prefixes=
-
- for d
- do
- test X"$d" = X && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
- done
-
- if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
- fi
- fi
- fi
-
- if test -n "$dir_arg"; then
- { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
- { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
- test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
- else
-
- # Make a couple of temp file names in the proper directory.
- dsttmp=${dstdirslash}_inst.$$_
- rmtmp=${dstdirslash}_rm.$$_
-
- # Trap to clean up those temp files at exit.
- trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
- # Copy the file name to the temp name.
- (umask $cp_umask &&
- { test -z "$stripcmd" || {
- # Create $dsttmp read-write so that cp doesn't create it read-only,
- # which would cause strip to fail.
- if test -z "$doit"; then
- : >"$dsttmp" # No need to fork-exec 'touch'.
- else
- $doit touch "$dsttmp"
- fi
- }
- } &&
- $doit_exec $cpprog "$src" "$dsttmp") &&
-
- # and set any options; do chmod last to preserve setuid bits.
- #
- # If any of these fail, we abort the whole thing. If we want to
- # ignore errors from any of these, just make sure not to ignore
- # errors from the above "$doit $cpprog $src $dsttmp" command.
- #
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
- { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
- { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
- # If -C, don't bother to copy if it wouldn't change the file.
- if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
- set -f &&
- set X $old && old=:$2:$4:$5:$6 &&
- set X $new && new=:$2:$4:$5:$6 &&
- set +f &&
- test "$old" = "$new" &&
- $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
- then
- rm -f "$dsttmp"
- else
- # If $backupsuffix is set, and the file being installed
- # already exists, attempt a backup. Don't worry if it fails,
- # e.g., if mv doesn't support -f.
- if test -n "$backupsuffix" && test -f "$dst"; then
- $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
- fi
-
- # Rename the file to the real destination.
- $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
- {
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
- }
- fi || exit 1
-
- trap '' 0
- fi
-done
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/lib/common_test/src/Makefile b/lib/common_test/src/Makefile
index 7d7b5ed203..00f13589f3 100644
--- a/lib/common_test/src/Makefile
+++ b/lib/common_test/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2020. All Rights Reserved.
+# Copyright Ericsson AB 2003-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -133,7 +133,7 @@ APPUP_FILE= common_test.appup
APPUP_SRC= $(APPUP_FILE).src
APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
-tests debug opt: $(TARGET_FILES)
+tests $(TYPES): $(TARGET_FILES)
docs:
diff --git a/lib/common_test/src/common_test.app.src b/lib/common_test/src/common_test.app.src
index 8aa15efa7e..fd6daf7d93 100644
--- a/lib/common_test/src/common_test.app.src
+++ b/lib/common_test/src/common_test.app.src
@@ -1,7 +1,7 @@
% This is an -*- erlang -*- file.
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -79,20 +79,20 @@
{env, []},
{runtime_dependencies,
["compiler-6.0",
- "crypto-3.6",
+ "crypto-4.5",
"debugger-4.1",
"erts-7.0",
- "ftp-1.0.0",
+ "ftp-1.0",
"inets-6.0",
- "kernel-4.0",
+ "kernel-@OTP-17720@",
"observer-2.1",
"runtime_tools-1.8.16",
- "sasl-2.4.2",
+ "sasl-2.5",
"snmp-5.1.2",
"ssh-4.0",
- "stdlib-3.5",
+ "stdlib-@OTP-17720@",
"syntax_tools-1.7",
- "tools-2.8",
+ "tools-3.2",
"xmerl-1.3.8"
]}]}.
diff --git a/lib/common_test/src/ct.erl b/lib/common_test/src/ct.erl
index bfa7b25862..02c14651d9 100644
--- a/lib/common_test/src/ct.erl
+++ b/lib/common_test/src/ct.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -296,6 +296,8 @@ capture_get([ExclCat | ExclCategories]) ->
capture_get([]) ->
test_server:capture_get().
+-spec fail(term()) -> no_return().
+
fail(Reason) ->
try
exit({test_case_failed,Reason})
@@ -308,6 +310,8 @@ fail(Reason) ->
erlang:raise(Class, R, Stk)
end.
+-spec fail(io:format(), [term()]) -> no_return().
+
fail(Format, Args) ->
try io_lib:format(Format, Args) of
Str ->
diff --git a/lib/common_test/src/ct_config.erl b/lib/common_test/src/ct_config.erl
index 439b941806..7cec4fbfdf 100644
--- a/lib/common_test/src/ct_config.erl
+++ b/lib/common_test/src/ct_config.erl
@@ -347,7 +347,7 @@ get_config(KeyOrName,Default,Opts) when is_atom(KeyOrName) ->
Else
end;
-%% This useage of get_config is only used by internal ct functions
+%% This usage of get_config is only used by internal ct functions
%% and may change at any time
get_config({DeepKey,SubKey}, Default, Opts) when is_tuple(DeepKey) ->
get_config(erlang:append_element(DeepKey, SubKey), Default, Opts);
diff --git a/lib/common_test/src/ct_framework.erl b/lib/common_test/src/ct_framework.erl
index 41e9734731..765a90103c 100644
--- a/lib/common_test/src/ct_framework.erl
+++ b/lib/common_test/src/ct_framework.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -735,7 +735,7 @@ end_tc(Mod,Func00,TCPid,Result,Args,Return) ->
%% clean up any saved comments
ct_util:match_delete_testdata({comment,'_'});
true ->
- %% attemp to delete any saved comment for this TC
+ %% attempt to delete any saved comment for this TC
case process_info(TCPid, group_leader) of
{group_leader,TCGL} ->
ct_util:delete_testdata({comment,TCGL});
@@ -1412,7 +1412,7 @@ end_per_group(GroupName, _) ->
report(What,Data) ->
case What of
loginfo ->
- %% logfiles and direcories have been created for a test and the
+ %% logfiles and directories have been created for a test and the
%% top level test index page needs to be refreshed
TestName = filename:basename(?val(topdir, Data), ".logs"),
RunDir = ?val(rundir, Data),
diff --git a/lib/common_test/src/ct_gen_conn.erl b/lib/common_test/src/ct_gen_conn.erl
index 6e0cc76582..e501d60686 100644
--- a/lib/common_test/src/ct_gen_conn.erl
+++ b/lib/common_test/src/ct_gen_conn.erl
@@ -332,7 +332,7 @@ call(Pid, Msg, infinity = Tmo) ->
gen_call(Pid, Msg, Tmo);
%% Spawn a middleman process if the call can timeout to avoid the
-%% possibilty of a reply being left in the caller's mailbox after a
+%% possibility of a reply being left in the caller's mailbox after a
%% timeout.
call(Pid, Msg, Tmo) ->
{_, MRef} = spawn_monitor(fun() -> exit(gen_call(Pid, Msg, Tmo)) end),
diff --git a/lib/common_test/src/ct_groups.erl b/lib/common_test/src/ct_groups.erl
index 11b0f9e665..ee851d5103 100644
--- a/lib/common_test/src/ct_groups.erl
+++ b/lib/common_test/src/ct_groups.erl
@@ -229,7 +229,7 @@ find(Mod, GrNames, TCs, [TC | Gs], Known, Defs, FindAll)
[Case | find(Mod, GrNames, TCs, Gs, Known, Defs, FindAll)]
end;
-%% Unexpeted term in group list
+%% Unexpected term in group list
find(Mod, _GrNames, _TCs, [BadTerm | _Gs], Known, _Defs, _FindAll) ->
Where = if length(Known) == 0 ->
atom_to_list(Mod)++":groups/0";
diff --git a/lib/common_test/src/ct_hooks.erl b/lib/common_test/src/ct_hooks.erl
index 57c32c17a3..23fadcbc2c 100644
--- a/lib/common_test/src/ct_hooks.erl
+++ b/lib/common_test/src/ct_hooks.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -63,7 +63,7 @@ groups(Mod, Groups) ->
%% since this might be the first time Mod:suite()
%% is called, and it might just fail or return
%% something bad, we allow any failure here - it
- %% will be catched later if there is something
+ %% will be caught later if there is something
%% really wrong.
[{?config_name,[]}]
end,
@@ -82,7 +82,7 @@ all(Mod, Tests) ->
CTHook when is_atom(CTHook) ->
[{?config_name,[CTHook]}]
catch _:_ ->
- %% just allow any failure here - it will be catched
+ %% just allow any failure here - it will be caught
%% later if there is something really wrong.
[{?config_name,[]}]
end,
@@ -210,7 +210,7 @@ call_init(#ct_hook_config{ module = Mod, opts = Opts, id = Id, prio = P} = Hook,
{Config, Hook#ct_hook_config{ state = NewState, prio = Prio } };
{ok, NewState, _} ->
{Config, Hook#ct_hook_config{ state = NewState } };
- NewState -> %% Keep for backward compatability reasons
+ NewState -> %% Keep for backward compatibility reasons
{Config, Hook#ct_hook_config{ state = NewState } }
end.
diff --git a/lib/common_test/src/ct_hooks_lock.erl b/lib/common_test/src/ct_hooks_lock.erl
index be50a33e01..ebae37bc82 100644
--- a/lib/common_test/src/ct_hooks_lock.erl
+++ b/lib/common_test/src/ct_hooks_lock.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -109,7 +109,11 @@ handle_info({'DOWN',Ref,process,Pid,_},
gen_server:reply(NextFrom, locked),
NextRef = monitor(process, NextPid),
{noreply,State#state{ locked = {true, NextPid, NextRef},
- requests = Rest } }.
+ requests = Rest } };
+handle_info({'DOWN',Ref,process,Pid,_},
+ #state{ locked = {true, Pid, Ref},
+ requests = [] } = State) ->
+ {noreply, State#state{ locked = false } }.
terminate(_Reason, _State) ->
ok.
diff --git a/lib/common_test/src/ct_logs.erl b/lib/common_test/src/ct_logs.erl
index 39ce2ea9d4..679d910942 100644
--- a/lib/common_test/src/ct_logs.erl
+++ b/lib/common_test/src/ct_logs.erl
@@ -2574,7 +2574,7 @@ sort_and_filter_logdirs2(_,[],Groups) ->
%% new rundir for Test found, add to (not sorted) list of prev rundirs
insert_test(Test,IxDir,[{Test,IxDirs}|Groups]) ->
[{Test,[IxDir|IxDirs]}|Groups];
-%% first occurance of Test
+%% first occurrence of Test
insert_test(Test,IxDir,[]) ->
[{Test,[IxDir]}];
insert_test(Test,IxDir,[TestDir|Groups]) ->
diff --git a/lib/common_test/src/ct_netconfc.erl b/lib/common_test/src/ct_netconfc.erl
index da169236d5..07f6cc1b8f 100644
--- a/lib/common_test/src/ct_netconfc.erl
+++ b/lib/common_test/src/ct_netconfc.erl
@@ -1943,7 +1943,7 @@ indent_line("></"++Rest,Indent,Line) ->
{Indent++lists:reverse(Line)++">","</"++Rest,Indent--" "}
end;
indent_line("><"++Rest,Indent,Line) ->
- %% Stop tag completed, and new tag comming -> keep indentation
+ %% Stop tag completed, and new tag coming -> keep indentation
{Indent++lists:reverse(Line)++">","<"++Rest," "++Indent};
indent_line("</"++Rest,Indent,Line) ->
%% Stop tag starting -> search for end of this tag
diff --git a/lib/common_test/src/ct_release_test.erl b/lib/common_test/src/ct_release_test.erl
index 6e6ea4086f..da556e1481 100644
--- a/lib/common_test/src/ct_release_test.erl
+++ b/lib/common_test/src/ct_release_test.erl
@@ -21,7 +21,7 @@
%% EXPERIMENTAL support for testing of upgrade.
%%
%% This is a library module containing support for test of release
-%% related activities in one or more applications. Currenty it
+%% related activities in one or more applications. Currently it
%% supports upgrade only.
%%
%% == Configuration ==
@@ -57,7 +57,7 @@
%% CtData = ct_data()
%% State = NewState = cb_state()
%%
-%% Initialyze system before upgrade test starts.
+%% Initialize system before upgrade test starts.
%%
%% This function is called before the upgrade is started. All
%% applications given in upgrade/4 are already started by
@@ -154,7 +154,7 @@
%%
%% If the initialization fails, e.g. if a required release
%% cannot be found, the function returns `{skip,Reason}'. In
-%% this case the other test support functions in this mudule
+%% this case the other test support functions in this module
%% cannot be used.
%%
%% Example:
@@ -230,20 +230,20 @@ init(Config) ->
%% `Level' specifies which OTP release to
%% pick the "From" versions from.
%% major
-%% From verions are picked from the previous major
+%% From versions are picked from the previous major
%% release. For example, if the test is run on an OTP-17
%% node, ct_release_test will pick the application
%% "From" versions from an OTP installation running OTP
%% R16B.
%%
%% minor
-%% From verions are picked from the current major
+%% From versions are picked from the current major
%% release. For example, if the test is run on an OTP-17
%% node, ct_release_test will pick the application
%% "From" versions from an OTP installation running an
%% earlier patch level of OTP-17.
%%
-%% The application "To" versions are allways picked from the
+%% The application "To" versions are always picked from the
%% current node, i.e. the common_test node.
%%
%% `Callback' specifies the module (normally the
diff --git a/lib/common_test/src/ct_run.erl b/lib/common_test/src/ct_run.erl
index a80d2476f5..4ce0d562d3 100644
--- a/lib/common_test/src/ct_run.erl
+++ b/lib/common_test/src/ct_run.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -212,10 +212,10 @@ finish(Tracing, ExitStatus, Args) ->
case get_start_opt(halt_with,
fun([HaltMod,HaltFunc]) ->
{list_to_atom(HaltMod),
- list_to_atom(HaltFunc)} end,
- Args) of
+ list_to_atom(HaltFunc)}
+ end, Args) of
undefined ->
- halt(ExitStatus);
+ halt(ExitStatus, [{flush, false}]);
{M,F} ->
apply(M, F, [ExitStatus])
end
diff --git a/lib/common_test/src/ct_slave.erl b/lib/common_test/src/ct_slave.erl
index dde33440be..b3cb20f48a 100644
--- a/lib/common_test/src/ct_slave.erl
+++ b/lib/common_test/src/ct_slave.erl
@@ -1,7 +1,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -29,6 +29,8 @@
-export([slave_started/2, slave_ready/2, monitor_master/1]).
+-deprecated([{'_','_',"use ?CT_PEER(), or the 'peer' module instead"}]).
+
-record(options, {username, password, boot_timeout, init_timeout,
startup_timeout, startup_functions, monitor_master,
kill_if_fail, erl_flags, env, ssh_port, ssh_opts,
diff --git a/lib/common_test/src/ct_snmp.erl b/lib/common_test/src/ct_snmp.erl
index 27b74dd04e..1e9333f656 100644
--- a/lib/common_test/src/ct_snmp.erl
+++ b/lib/common_test/src/ct_snmp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -237,7 +237,7 @@ prepare_snmp_env() ->
_ = application:load(snmp),
%% Fix for older versions of snmp where there are some
- %% inappropriate default values for alway starting an
+ %% inappropriate default values for always starting an
%% agent.
application:unset_env(snmp, agent).
%%%---------------------------------------------------------------------------
diff --git a/lib/common_test/src/ct_telnet.erl b/lib/common_test/src/ct_telnet.erl
index 6b237787cd..d6c69329ad 100644
--- a/lib/common_test/src/ct_telnet.erl
+++ b/lib/common_test/src/ct_telnet.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1019,7 +1019,7 @@ seq_expect(Name,Pid,Data,Patterns,Acc,EO) ->
end.
%% seq_expect1: For one prompt-chunk, match each pattern - line by
-%% line if it is other than the prompt we are seaching for.
+%% line if it is other than the prompt we are searching for.
seq_expect1(Name,Pid,Data,[prompt|Patterns],Acc,Rest,EO) ->
case EO#eo.found_prompt of
false ->
@@ -1253,7 +1253,7 @@ split_prompt_string([Ch|Rest],_Start,End,N,UptoPrompt,Prompt) when N==End ->
{noprompt,[Ch|Prompt]++UptoPrompt,Rest};
[$\s,$t,$s,$a|_] when Prompt==":nigol" ->
%% This is probably the "Last login:" statement which is
- %% written when telnet connection is openend.
+ %% written when telnet connection is opened.
{noprompt,[Ch|Prompt]++UptoPrompt,Rest};
_ ->
{prompt,[Ch|Prompt]++UptoPrompt,[Ch|Prompt],Rest}
diff --git a/lib/common_test/src/cth_surefire.erl b/lib/common_test/src/cth_surefire.erl
index c9b4cb10c6..50858c4e64 100644
--- a/lib/common_test/src/cth_surefire.erl
+++ b/lib/common_test/src/cth_surefire.erl
@@ -1,7 +1,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -46,13 +46,15 @@
-export([terminate/1]).
+%% Gen server callbacks
+-export([init/1, handle_call/3]).
+
-record(state, { filepath, axis, properties, package, hostname,
- curr_suite, curr_suite_ts, curr_group = [],
+ curr_suite, curr_suite_file, curr_suite_ast, curr_suite_ts, curr_group = [],
curr_log_dir, timer, tc_log, url_base,
- test_cases = [],
- test_suites = [] }).
+ test_cases = [], test_suites = []}).
--record(testcase, { log, url, group, classname, name, time, result, timestamp }).
+-record(testcase, { log, url, group, file, line, classname, name, time, result, timestamp }).
-record(testsuite, { errors, failures, skipped, hostname, name, tests,
time, timestamp, id, package,
properties, testcases, log, url }).
@@ -66,22 +68,47 @@
%% ct_run.<node>.<timestamp>/<test_name>/run.<timestamp>/<tc_log>.html
-define(log_depth,3).
+%% The gen server proxy wrapper API
+%% The state of this hook can become very large for large test suites
+%% for example diameter_traffic_SUITE
+%% so we keep the state in a separate process in order to not have to
+%% copy the full state to each testcase process. Doing it this way cuts
+%% the execution time of diameter_traffic_SUITE from 30 min to 5 min.
+init(Path, Opts) ->
+ {ok, Pid} = gen_server:start(?MODULE, [Path, Opts], []),
+ Pid.
+
+init([Path, Opts]) ->
+ ct_util:mark_process(),
+ {ok, Host} = inet:gethostname(),
+ {ok, #state{ filepath = Path,
+ hostname = proplists:get_value(hostname,Opts,Host),
+ package = proplists:get_value(package,Opts),
+ axis = proplists:get_value(axis,Opts,[]),
+ properties = proplists:get_value(properties,Opts,[]),
+ url_base = proplists:get_value(url_base,Opts),
+ timer = ?now }}.
+
+handle_call({terminate, Args}, _From, State) ->
+ Res = apply(?MODULE, terminate, Args ++ [State]),
+ {stop, normal, Res, State};
+handle_call({Function, Args}, _From, State)
+ when Function =:= on_tc_fail;
+ Function =:= on_tc_skip ->
+ NewState = apply(?MODULE, Function, Args ++ [State]),
+ {reply, ok, NewState};
+handle_call({Function, Args}, _From, State) ->
+ {Reply,NewState} = apply(?MODULE, Function, Args ++ [State]),
+ {reply,Reply,NewState}.
+
id(Opts) ->
case proplists:get_value(path, Opts) of
undefined -> ?default_report;
Path -> filename:absname(Path)
end.
-init(Path, Opts) ->
- {ok, Host} = inet:gethostname(),
- #state{ filepath = Path,
- hostname = proplists:get_value(hostname,Opts,Host),
- package = proplists:get_value(package,Opts),
- axis = proplists:get_value(axis,Opts,[]),
- properties = proplists:get_value(properties,Opts,[]),
- url_base = proplists:get_value(url_base,Opts),
- timer = ?now }.
-
+pre_init_per_suite(Suite,SkipOrFail,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, SkipOrFail]}),Proxy};
pre_init_per_suite(Suite,SkipOrFail,#state{ test_cases = [] } = State)
when is_tuple(SkipOrFail) ->
{SkipOrFail, init_tc(State#state{curr_suite = Suite,
@@ -98,8 +125,20 @@ pre_init_per_suite(Suite,Config,#state{ test_cases = [] } = State) ->
P ->
P
end,
+ Ast =
+ case beam_lib:chunks(code:which(Suite),[debug_info]) of
+ {ok,{Suite,[{debug_info,
+ {debug_info_v1,
+ erl_abstract_code,
+ {Abstr,_Opts}}}]}} ->
+ Abstr;
+ _ ->
+ undefined
+ end,
{Config, init_tc(State#state{ filepath = Path,
curr_suite = Suite,
+ curr_suite_file = get_file(Suite),
+ curr_suite_ast = Ast,
curr_suite_ts = ?now,
curr_log_dir = CurrLogDir},
Config) };
@@ -107,45 +146,101 @@ pre_init_per_suite(Suite,Config,State) ->
%% Have to close the previous suite
pre_init_per_suite(Suite,Config,close_suite(State)).
+get_file(Suite) ->
+ case beam_lib:chunks(code:which(Suite),["CInf"]) of
+ {ok,{_,[{"CInf",Bin}]}} ->
+ Source = proplists:get_value(source,binary_to_term(Bin)),
+ case filelib:is_file(Source) of
+ true ->
+ Source;
+ false ->
+ undefined
+ end;
+ _ ->
+ undefined
+ end.
+
+post_init_per_suite(Suite,Config, Result, Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Config, Result]}),Proxy};
post_init_per_suite(_Suite,Config, Result, State) ->
{Result, end_tc(init_per_suite,Config,Result,State)}.
+pre_end_per_suite(Suite,Config,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Config]}),Proxy};
pre_end_per_suite(_Suite,Config,State) ->
{Config, init_tc(State, Config)}.
+post_end_per_suite(Suite,Config,Result,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Config, Result]}),Proxy};
post_end_per_suite(_Suite,Config,Result,State) ->
{Result, end_tc(end_per_suite,Config,Result,State)}.
+pre_init_per_group(Suite,Group,Config,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Group, Config]}),Proxy};
pre_init_per_group(_Suite,Group,Config,State) ->
{Config, init_tc(State#state{ curr_group = [Group|State#state.curr_group]},
Config)}.
+post_init_per_group(Suite,Group,Config,Result,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Group, Config, Result]}),Proxy};
post_init_per_group(_Suite,_Group,Config,Result,State) ->
{Result, end_tc(init_per_group,Config,Result,State)}.
+pre_end_per_group(Suite,Group,Config,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, Group, Config]}),Proxy};
pre_end_per_group(_Suite,_Group,Config,State) ->
{Config, init_tc(State, Config)}.
+post_end_per_group(Suite,Group,Config,Result,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite,Group,Config,Result]}),Proxy};
post_end_per_group(_Suite,_Group,Config,Result,State) ->
NewState = end_tc(end_per_group, Config, Result, State),
{Result, NewState#state{ curr_group = tl(NewState#state.curr_group)}}.
+pre_init_per_testcase(Suite,TC,Config,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite,TC,Config]}),Proxy};
pre_init_per_testcase(_Suite,_TC,Config,State) ->
{Config, init_tc(State, Config)}.
+post_end_per_testcase(Suite,TC,Config,Result,Proxy) when is_pid(Proxy) ->
+ {gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, TC, Config, Result]}),Proxy};
post_end_per_testcase(_Suite,TC,Config,Result,State) ->
{Result, end_tc(TC,Config, Result,State)}.
+on_tc_fail(Suite,TC,Result,Proxy) when is_pid(Proxy) ->
+ _ = gen_server:call(Proxy,{?FUNCTION_NAME, [Suite, TC, Result]}),
+ Proxy;
on_tc_fail(_Suite,_TC, _Res, State = #state{test_cases = []}) ->
State;
-on_tc_fail(_Suite,_TC, Res, State) ->
+on_tc_fail(Suite, _TC, Res, State) ->
TCs = State#state.test_cases,
TC = hd(TCs),
+ Line = case get_line_from_result(Suite, Res) of
+ undefined ->
+ TC#testcase.line;
+ L -> L
+ end,
NewTC = TC#testcase{
+ line = Line,
result =
{fail,lists:flatten(io_lib:format("~tp",[Res]))} },
State#state{ test_cases = [NewTC | tl(TCs)]}.
+get_line_from_result(Suite, {_Error, [{__M,__F,__A,__I}|_] = StackTrace}) ->
+ case lists:filter(fun({Mod, _Func, _Arity, _Info}) ->
+ Mod =:= Suite
+ end, StackTrace) of
+ [{Suite,_F,_A, Info} | _ ] ->
+ proplists:get_value(line, Info);
+ _ ->
+ undefined
+ end;
+get_line_from_result(_, _) ->
+ undefined.
+
+on_tc_skip(Suite,TC,Result,Proxy) when is_pid(Proxy) ->
+ _ = gen_server:call(Proxy,{?FUNCTION_NAME, [Suite,TC,Result]}),
+ Proxy;
on_tc_skip(Suite,{ConfigFunc,_GrName}, Res, State) ->
on_tc_skip(Suite,ConfigFunc, Res, State);
on_tc_skip(Suite,Tc, Res, State0) ->
@@ -171,23 +266,29 @@ init_tc(State, Config) when is_list(Config) == false ->
State#state{ timer = ?now, tc_log = "" };
init_tc(State, Config) ->
State#state{ timer = ?now,
- tc_log = proplists:get_value(tc_logfile, Config, [])}.
+ tc_log = proplists:get_value(tc_logfile, Config, [])}.
end_tc(Func, Config, Res, State) when is_atom(Func) ->
end_tc(atom_to_list(Func), Config, Res, State);
+end_tc(Func, Config, Res, State = #state{ tc_log = "" }) ->
+ end_tc(Func, Config, Res, State#state{ tc_log = proplists:get_value(tc_logfile, Config) });
end_tc(Name, _Config, _Res, State = #state{ curr_suite = Suite,
curr_group = Groups,
curr_log_dir = CurrLogDir,
timer = TS,
- tc_log = Log0,
url_base = UrlBase } ) ->
Log =
- case Log0 of
- "" ->
+ case State#state.tc_log of
+ undefined ->
LowerSuiteName = string:lowercase(atom_to_list(Suite)),
- filename:join(CurrLogDir,LowerSuiteName++"."++Name++".html");
- _ ->
- Log0
+ case filelib:wildcard(filename:join(CurrLogDir,LowerSuiteName++"."++Name++".*html")) of
+ [] ->
+ "";
+ [LogFile|_] ->
+ LogFile
+ end;
+ LogFile ->
+ LogFile
end,
Url = make_url(UrlBase,Log),
ClassName = atom_to_list(Suite),
@@ -200,6 +301,9 @@ end_tc(Name, _Config, _Res, State = #state{ curr_suite = Suite,
group = PGroup,
name = Name,
time = TimeTakes,
+ file = State#state.curr_suite_file,
+ line = get_line_from_suite(
+ State#state.curr_suite_ast, Name),
result = passed }|
State#state.test_cases],
tc_log = ""}. % so old tc_log is not set if next is on_tc_skip
@@ -232,6 +336,9 @@ close_suite(#state{ test_cases = TCs, url_base = UrlBase } = State) ->
test_cases = [],
test_suites = [Suite | State#state.test_suites]}.
+terminate(Proxy) when is_pid(Proxy) ->
+ gen_server:call(Proxy,{?FUNCTION_NAME, []}),
+ ok;
terminate(State = #state{ test_cases = [] }) ->
{ok,D} = file:open(State#state.filepath,[write,{encoding,utf8}]),
io:format(D, "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>", []),
@@ -242,15 +349,33 @@ terminate(State) ->
%% Have to close the last suite
terminate(close_suite(State)).
+get_line_from_suite(undefined, _TC) ->
+ undefined;
+get_line_from_suite(Abstr, TC) ->
+ case [Anno || {function,Anno,Name,1,_} <- Abstr, TC =:= atom_to_list(Name)] of
+ [{Line,_Col}] ->
+ Line;
+ _ ->
+ case [Anno || {function,Anno,Name,_,_} <- Abstr, TC =:= atom_to_list(Name)] of
+ [{Line,_}|_] ->
+ Line;
+ _ ->
+ undefined
+ end
+ end.
-to_xml(#testcase{ group = Group, classname = CL, log = L, url = U, name = N, time = T, timestamp = TS, result = R}) ->
+to_xml(#testcase{ group = Group, classname = CL, log = L, url = U,
+ file = File, line = Line,
+ name = N, time = T, timestamp = TS, result = R}) ->
["<testcase ",
[["group=\"",Group,"\" "]||Group /= ""],
"name=\"",N,"\" "
"time=\"",T,"\" "
"timestamp=\"",TS,"\" ",
[["url=\"",U,"\" "]||U /= undefined],
+ [["file=\"",File,"\" "]||File /= undefined],
+ [["line=\"",integer_to_list(Line),"\" "]||Line /= undefined],
"log=\"",L,"\">",
case R of
passed ->
diff --git a/lib/common_test/src/erl2html2.erl b/lib/common_test/src/erl2html2.erl
index 7f3eb699de..cb000bafd6 100644
--- a/lib/common_test/src/erl2html2.erl
+++ b/lib/common_test/src/erl2html2.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -287,7 +287,7 @@ encoding(File) ->
end.
%%%-----------------------------------------------------------------
-%%% Covert encoding atom to string for use in HTML header
+%%% Convert encoding atom to string for use in HTML header
html_encoding(latin1) ->
"iso-8859-1";
html_encoding(utf8) ->
diff --git a/lib/common_test/src/test_server.erl b/lib/common_test/src/test_server.erl
index 1f7c565d09..6c383b04d0 100644
--- a/lib/common_test/src/test_server.erl
+++ b/lib/common_test/src/test_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -39,10 +39,10 @@
-export([m_out_of_n/3,do_times/4,do_times/2]).
-export([call_crash/3,call_crash/4,call_crash/5]).
-export([temp_name/1]).
--export([start_node/3, stop_node/1, wait_for_node/1, is_release_available/1]).
+-export([start_node/3, stop_node/1, wait_for_node/1, is_release_available/1, find_release/1]).
+-export([peer_name/2, start_peer/3, start_peer/5]).
-export([app_test/1, app_test/2, appup_test/1]).
-export([comment/1, make_priv_dir/0]).
--export([os_type/0]).
-export([run_on_shielded_node/2]).
-export([is_cover/0,is_debug/0,is_commercial/0]).
@@ -347,8 +347,7 @@ stick_all_sticky(Node,Sticky) ->
%% Returns a tuple with the time spent (in seconds) in the test case,
%% the return value from the test case or an {'EXIT',Reason} if the case
%% failed, Loc points out where the test case crashed (if it did). Loc
-%% is either the name of the function, or {<Module>,<Line>} of the last
-%% line executed that had a ?line macro. If the test case did execute
+%% is the name of the function. If the test case did execute
%% erase/0 or similar, it may be empty. Comment is the last comment added
%% by test_server:comment/1, the reason if test_server:fail has been
%% called or the comment given by the return value {comment,Comment} from
@@ -360,7 +359,7 @@ stick_all_sticky(Node,Sticky) ->
%% TimetrapData = {MultiplyTimetrap,ScaleTimetrap}, which indicates a
%% possible extension of all timetraps. Timetraps will be multiplied by
%% MultiplyTimetrap. If it is infinity, no timetraps will be started at all.
-%% ScaleTimetrap indicates if test_server should attemp to automatically
+%% ScaleTimetrap indicates if test_server should attempt to automatically
%% compensate timetraps for runtime delays introduced by e.g. tools like
%% cover.
@@ -1889,7 +1888,7 @@ capture_stop() ->
%% Note that since output arrive as messages to the process, it takes
%% a short while from the call to io:format until all output is available
%% by capture_get/0. It is not necessary to call capture_stop/0 before
-%% retreiving the output.
+%% retrieving the output.
capture_get() ->
test_server_sup:capture_get([]).
@@ -1970,6 +1969,9 @@ adjusted_sleep(MSecs) ->
%%
%% Immediately calls exit. Included because test suites are easier
%% to read when using this function, rather than exit directly.
+
+-spec fail(term()) -> no_return().
+
fail(Reason) ->
comment(cast_to_list(Reason)),
try
@@ -1994,6 +1996,9 @@ cast_to_list(X) -> lists:flatten(io_lib:format("~tp", [X])).
%%
%% Immediately calls exit. Included because test suites are easier
%% to read when using this function, rather than exit directly.
+
+-spec fail() -> no_return().
+
fail() ->
try
exit(suite_failed)
@@ -2553,10 +2558,10 @@ m_out_of_n(M,N,Fun) ->
%% Time - integer() in milliseconds.
%% Crash - term()
%%
-%% Spaws a new process that calls MFA. The call is considered
+%% Spawns a new process that calls MFA. The call is considered
%% successful if the call crashes with the given reason (Crash),
%% or any other reason if Crash is not specified.
-%% ** The call must terminate withing the given Time (defaults
+%% ** The call must terminate within the given Time (defaults
%% to infinity), or it is considered a failure (exit with reason
%% 'call_crash_timeout' is generated).
@@ -2575,14 +2580,12 @@ call_crash(Time,Crash,M,F,A) ->
%% Type = slave | peer
%% Options = [{tuple(), term()}]
%%
-%% OptionList is a tuplelist wich may contain one
+%% OptionList is a tuplelist which may contain one
%% or more of these members:
%%
%% Slave and Peer:
%% {remote, true} - Start the node on a remote host. If not specified,
-%% the node will be started on the local host (with
-%% some exceptions, for instance VxWorks,
-%% where all nodes are started on a remote host).
+%% the node will be started on the local host.
%% {args, Arguments} - Arguments passed directly to the node.
%% {cleanup, false} - Nodes started with this option will not be killed
%% by the test server after completion of the test case
@@ -2687,6 +2690,7 @@ wait_for_node(Slave) ->
end,
Result.
+-compile([{nowarn_deprecated_function, [{slave, stop, 1}]}]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% stop_node(Name) -> true|false
@@ -2766,6 +2770,117 @@ is_release_available(Release) ->
{test_server_ctrl,is_release_available,[Release]}},
receive {sync_result,R} -> R end.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% find_release(Release) -> PathToReleaseErlFile | not_available
+%% Release -> string()
+%%
+%% Test if a release (such as "r10b") and if so return the path to the
+%% release's erl file
+
+find_release(Release) ->
+ group_leader() ! {sync_apply,
+ self(),
+ {test_server_ctrl,find_release,[Release]}},
+ receive {sync_result,R} -> R end.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% API for starting peer nodes according to Common Test conventions
+peer_name(Module, TestCase) ->
+ peer:random_name(lists:concat([Module, "-", TestCase])).
+
+%% Command line arguments passed
+-spec start_peer([string()] | peer:start_options(), atom() | string(), TestCase :: atom() | string()) ->
+ {ok, gen_statem:server_ref(), node()} | {error, term()}.
+start_peer(Args, Module, TestCase) when is_list(Args) ->
+ start_peer(#{args => Args, name => peer_name(Module, TestCase)}, Module);
+
+%% Full set of options passed
+start_peer(#{name := _Name} = Opts, Module, _TestCase) ->
+ start_peer(Opts, Module);
+start_peer(Opts, Module, TestCase) ->
+ start_peer(Opts#{name => peer_name(Module, TestCase)}, Module).
+
+%% Release compatibility testing
+-spec start_peer([string()] | peer:start_options(), atom() | string(), TestCase :: atom() | string(),
+ Release :: string(), OutDir :: file:filename()) ->
+ {ok, gen_statem:server_ref(), node()} | {error, term()} | not_available.
+start_peer(Args, Module, TestCase, Release, OutDir) when is_list(Args) ->
+ start_peer(#{args => Args}, Module, TestCase, Release, OutDir);
+start_peer(Opts, Module, TestCase, Release, OutDir) ->
+ case find_release(Release) of
+ not_available ->
+ not_available;
+ Erl ->
+ %% remove ERL_AFLAGS, because they may contain "-emu_type debug" which does not exist
+ %% for old releases. Keep ERL_FLAGS, and ERL_ZFLAGS for sometimes you might need it...
+ Env = maps:get(env, Opts, []) ++ [{"ERL_AFLAGS", false}],
+ NewArgs = ["-pa", peer_compile(Erl, code:which(peer), OutDir) | maps:get(args, Opts, [])],
+ start_peer(Opts#{exec => Erl, args => NewArgs,
+ env => Env}, Module, TestCase)
+ end.
+
+%% Internal implementation
+start_peer(#{name := Name} = Opts, Module) ->
+ CrashDir = test_server_sup:crash_dump_dir(),
+ CrashFile = filename:join([CrashDir, lists:concat(["erl_crash_dump.", Name])]),
+ Args = maps:get(args, Opts, []),
+ CookieArg =
+ case lists:member("-setcookie", Args) of
+ false ->
+ ["-setcookie", atom_to_list(erlang:get_cookie())];
+ true ->
+ []
+ end,
+ FullArgs = CookieArg ++ ["-pa", filename:dirname(code:which(Module)),
+ "-env", "ERL_CRASH_DUMP", CrashFile] ++ Args,
+ %% start_cover => false is intentionally undocumented, and is not
+ %% expected to be used by anything but cover_SUITE test.
+ case maps:get(start_cover, Opts, true) andalso test_server:is_cover() of
+ true ->
+ %% when cover is active, node must shut down gracefully, otherwise
+ %% coverage information won't be sent to cover master
+ CoverMain = cover:get_main_node(),
+ %% next line is a way to trick Dialyzer into not complaining over undocumented type
+ Shutdown = binary_to_term(term_to_binary({10000, CoverMain})),
+ case peer:start_link(Opts#{args => FullArgs, shutdown => Shutdown}) of
+ {ok, Peer, Node} ->
+ do_cover_for_node(Node, start),
+ {ok, Peer, Node};
+ Other ->
+ Other
+ end;
+ false ->
+ peer:start_link(Opts#{args => FullArgs})
+ end.
+
+%% When a different release is requested, peer.erl needs to be compiled for
+%% that specific release using the path supplied for 'erl'
+peer_compile(Erl, cover_compiled, OutDir) ->
+ {file, Path} = cover:is_compiled(peer),
+ peer_compile(Erl, Path, OutDir);
+peer_compile(Erl, ModPath, OutDir) ->
+ {ok, ModSrc} = filelib:find_source(ModPath),
+ Erlc = filename:join(filename:dirname(Erl), "erlc"),
+ cmd(Erlc, ["-o", OutDir, ModSrc]),
+ OutDir.
+
+%% This should really be implemented as os:cmd.
+cmd(Exec, Args) ->
+ %% remove all ERL_AFLAGS to drop "-emu_type debug" and similar
+ Env = [{"ERL_AFLAGS", false}],
+ Port = open_port({spawn_executable, Exec}, [{args, Args}, {env, Env},
+ stream, binary, exit_status, stderr_to_stdout]),
+ read_std(Port, lists:join(" ", [Exec|Args]), <<>>).
+
+read_std(Port, Exec, Out) ->
+ receive
+ {Port, {data, More}} ->
+ read_std(Port, Exec, <<Out/binary, More/binary>>);
+ {Port, {exit_status, 0}} ->
+ Out;
+ {Port, {exit_status, Status}} ->
+ erlang:error({exit, Status, Exec, Out})
+ end.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% run_on_shielded_node(Fun, CArgs) -> term()
@@ -2911,15 +3026,6 @@ make_priv_dir() ->
tc_supervisor_req(make_priv_dir).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% os_type() -> OsType
-%%
-%% Returns the OsType of the target node. OsType is
-%% the same as returned from os:type()
-os_type() ->
- os:type().
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% is_cover() -> boolean()
%%
%% Returns true if cover is running, else false
diff --git a/lib/common_test/src/test_server_ctrl.erl b/lib/common_test/src/test_server_ctrl.erl
index e80e899c44..538ea0de44 100644
--- a/lib/common_test/src/test_server_ctrl.erl
+++ b/lib/common_test/src/test_server_ctrl.erl
@@ -54,15 +54,14 @@
-export([multiply_timetraps/1, scale_timetraps/1, get_timetrap_parameters/0]).
-export([create_priv_dir/1]).
-export([cover/1, cover/2, cover/3,
- cover_compile/7, cover_analyse/2, cross_cover_analyse/2,
- trc/1, stop_trace/0]).
+ cover_compile/7, cover_analyse/2, cross_cover_analyse/2]).
-export([testcase_callback/1]).
-export([set_random_seed/1]).
-export([kill_slavenodes/0]).
%%% TEST_SERVER INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-export([print/2, print/3, print/4, print_timestamp/2]).
--export([start_node/3, stop_node/1, wait_for_node/1, is_release_available/1]).
+-export([start_node/3, stop_node/1, wait_for_node/1, is_release_available/1, find_release/1]).
-export([format/1, format/2, format/3, to_string/1]).
-export([get_target_info/0]).
-export([get_hosts/0]).
@@ -115,7 +114,7 @@
-record(state,{jobs=[], levels={1,19,10}, reject_io_reqs=false,
multiply_timetraps=1, scale_timetraps=true,
create_priv_dir=auto_per_run, finish=false,
- target_info, trc=false, cover=false, wait_for_node=[],
+ target_info, cover=false, wait_for_node=[],
testcase_callback=undefined, idle_notify=[],
get_totals=false, random_seed=undefined}).
@@ -224,55 +223,53 @@ add_tests_with_skip(LogDir, Tests, Skip) ->
%% COMMAND LINE INTERFACE
parse_cmd_line(Cmds) ->
- parse_cmd_line(Cmds, [], [], local, false, false, undefined).
+ parse_cmd_line(Cmds, [], [], local, false, undefined).
-parse_cmd_line(['SPEC',Spec|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) ->
+parse_cmd_line(['SPEC',Spec|Cmds], SpecList, Names, Param, Cov, TCCB) ->
case file:consult(Spec) of
{ok, TermList} ->
Name = filename:rootname(Spec),
parse_cmd_line(Cmds, TermList++SpecList, [Name|Names], Param,
- Trc, Cov, TCCB);
+ Cov, TCCB);
{error,Reason} ->
io:format("Can't open ~tw: ~tp\n",[Spec, file:format_error(Reason)]),
- parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov, TCCB)
+ parse_cmd_line(Cmds, SpecList, Names, Param, Cov, TCCB)
end;
-parse_cmd_line(['NAME',Name|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) ->
+parse_cmd_line(['NAME',Name|Cmds], SpecList, Names, Param, Cov, TCCB) ->
parse_cmd_line(Cmds, SpecList, [{name,atom_to_list(Name)}|Names],
- Param, Trc, Cov, TCCB);
-parse_cmd_line(['SKIPMOD',Mod|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) ->
+ Param, Cov, TCCB);
+parse_cmd_line(['SKIPMOD',Mod|Cmds], SpecList, Names, Param, Cov, TCCB) ->
parse_cmd_line(Cmds, [{skip,{Mod,"by command line"}}|SpecList], Names,
- Param, Trc, Cov, TCCB);
-parse_cmd_line(['SKIPCASE',Mod,Case|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) ->
+ Param, Cov, TCCB);
+parse_cmd_line(['SKIPCASE',Mod,Case|Cmds], SpecList, Names, Param, Cov, TCCB) ->
parse_cmd_line(Cmds, [{skip,{Mod,Case,"by command line"}}|SpecList], Names,
- Param, Trc, Cov, TCCB);
-parse_cmd_line(['DIR',Dir|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) ->
+ Param, Cov, TCCB);
+parse_cmd_line(['DIR',Dir|Cmds], SpecList, Names, Param, Cov, TCCB) ->
Name = filename:basename(Dir),
parse_cmd_line(Cmds, [{topcase,{dir,Name}}|SpecList], [Name|Names],
- Param, Trc, Cov, TCCB);
-parse_cmd_line(['MODULE',Mod|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) ->
+ Param, Cov, TCCB);
+parse_cmd_line(['MODULE',Mod|Cmds], SpecList, Names, Param, Cov, TCCB) ->
parse_cmd_line(Cmds,[{topcase,{Mod,all}}|SpecList],[atom_to_list(Mod)|Names],
- Param, Trc, Cov, TCCB);
-parse_cmd_line(['CASE',Mod,Case|Cmds], SpecList, Names, Param, Trc, Cov, TCCB) ->
+ Param, Cov, TCCB);
+parse_cmd_line(['CASE',Mod,Case|Cmds], SpecList, Names, Param, Cov, TCCB) ->
parse_cmd_line(Cmds,[{topcase,{Mod,Case}}|SpecList],[atom_to_list(Mod)|Names],
- Param, Trc, Cov, TCCB);
-parse_cmd_line(['TRACE',Trc|Cmds], SpecList, Names, Param, _Trc, Cov, TCCB) ->
- parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov, TCCB);
-parse_cmd_line(['COVER',App,CF,Analyse|Cmds], SpecList, Names, Param, Trc, _Cov, TCCB) ->
- parse_cmd_line(Cmds, SpecList, Names, Param, Trc, {{App,CF}, Analyse}, TCCB);
-parse_cmd_line(['TESTCASE_CALLBACK',Mod,Func|Cmds], SpecList, Names, Param, Trc, Cov, _) ->
- parse_cmd_line(Cmds, SpecList, Names, Param, Trc, Cov, {Mod,Func});
-parse_cmd_line([Obj|_Cmds], _SpecList, _Names, _Param, _Trc, _Cov, _TCCB) ->
+ Param, Cov, TCCB);
+parse_cmd_line(['COVER',App,CF,Analyse|Cmds], SpecList, Names, Param, _Cov, TCCB) ->
+ parse_cmd_line(Cmds, SpecList, Names, Param, {{App,CF}, Analyse}, TCCB);
+parse_cmd_line(['TESTCASE_CALLBACK',Mod,Func|Cmds], SpecList, Names, Param, Cov, _) ->
+ parse_cmd_line(Cmds, SpecList, Names, Param, Cov, {Mod,Func});
+parse_cmd_line([Obj|_Cmds], _SpecList, _Names, _Param, __Cov, _TCCB) ->
io:format("~w: Bad argument: ~tw\n", [?MODULE,Obj]),
io:format(" Use the `ts' module to start tests.\n", []),
io:format(" (If you ARE using `ts', there is a bug in `ts'.)\n", []),
halt(1);
-parse_cmd_line([], SpecList, Names, Param, Trc, Cov, TCCB) ->
+parse_cmd_line([], SpecList, Names, Param, Cov, TCCB) ->
NameList = lists:reverse(Names, ["suite"]),
Name = case lists:keysearch(name, 1, NameList) of
{value,{name,N}} -> N;
false -> hd(NameList)
end,
- {lists:reverse(SpecList), Name, Param, Trc, Cov, TCCB}.
+ {lists:reverse(SpecList), Name, Param, Cov, TCCB}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% cast_to_list(X) -> string()
@@ -311,12 +308,8 @@ start_link() ->
run_test(CommandLine) ->
process_flag(trap_exit,true),
- {SpecList,Name,Param,Trc,Cov,TCCB} = parse_cmd_line(CommandLine),
+ {SpecList,Name,Param,Cov,TCCB} = parse_cmd_line(CommandLine),
{ok,_TSPid} = start_link(Param),
- case Trc of
- false -> ok;
- File -> trc(File)
- end,
case Cov of
false -> ok;
{{App,CoverFile},Analyse} -> cover(App, maybe_file(CoverFile), Analyse)
@@ -399,12 +392,6 @@ get_timetrap_parameters() ->
create_priv_dir(Value) ->
controller_call({create_priv_dir,Value}).
-trc(TraceFile) ->
- controller_call({trace,TraceFile}, 2*?ACCEPT_TIMEOUT).
-
-stop_trace() ->
- controller_call(stop_trace).
-
node_started(Node) ->
gen_server:cast(?MODULE, {node_started,Node}).
@@ -696,7 +683,7 @@ handle_call({finish,Fini}, _From, State) ->
%% handle_call({idle_notify,Fun}, From, State) -> {ok,Pid}
%%
%% Lets a test client subscribe to receive a notification when the
-%% test server becomes idle (can be used to syncronize jobs).
+%% test server becomes idle (can be used to synchronize jobs).
%% test_server calls Fun(From) when idle.
handle_call({idle_notify,Fun}, {Cli,_Ref}, State) ->
@@ -721,7 +708,7 @@ handle_call({start_get_totals,Fun}, {Cli,_Ref}, State) ->
%% handle_call(stop_get_totals, From, State) -> ok
%%
%% Lets a test client subscribe to receive a notification when the
-%% test server becomes idle (can be used to syncronize jobs).
+%% test server becomes idle (can be used to synchronize jobs).
%% test_server calls Fun(From) when idle.
handle_call(stop_get_totals, {_Cli,_Ref}, State) ->
@@ -796,45 +783,6 @@ handle_call(get_timetrap_parameters, _From, State) ->
{reply,{State#state.multiply_timetraps,State#state.scale_timetraps},State};
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% handle_call({trace,TraceFile}, _, State) -> ok | {error,Reason}
-%%
-%% Starts a separate node (trace control node) which
-%% starts tracing on target and all slave nodes
-%%
-%% TraceFile is a text file with elements of type
-%% {Trace,Mod,TracePattern}.
-%% {Trace,Mod,Func,TracePattern}.
-%% {Trace,Mod,Func,Arity,TracePattern}.
-%%
-%% Trace = tp | tpl; local or global call trace
-%% Mod,Func = atom(), Arity=integer(); defines what to trace
-%% TracePattern = [] | match_spec()
-%%
-%% The 'call' trace flag is set on all processes, and then
-%% the given trace patterns are set.
-
-handle_call({trace,TraceFile}, _From, State=#state{trc=false}) ->
- TI = State#state.target_info,
- case test_server_node:start_tracer_node(TraceFile, TI) of
- {ok,Tracer} -> {reply,ok,State#state{trc=Tracer}};
- Error -> {reply,Error,State}
- end;
-handle_call({trace,_TraceFile}, _From, State) ->
- {reply,{error,already_tracing},State};
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% handle_call(stop_trace, _, State) -> ok | {error,Reason}
-%%
-%% Stops tracing on target and all slave nodes and
-%% terminates trace control node
-
-handle_call(stop_trace, _From, State=#state{trc=false}) ->
- {reply,{error,not_tracing},State};
-handle_call(stop_trace, _From, State) ->
- R = test_server_node:stop_tracer_node(State#state.trc),
- {reply,R,State#state{trc=false}};
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% handle_call({cover,CoverInfo}, _, State) -> ok | {error,Reason}
%%
%% Set specification of cover analysis to be used when running tests
@@ -962,6 +910,19 @@ handle_call({stop_node, Name}, _From, State) ->
handle_call({is_release_available, Release}, _From, State) ->
R = test_server_node:is_release_available(Release),
+ {reply, R, State};
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% handle_call({find_release,Name}, _, State) -> PathToReleaseErlFile | not_available
+%%
+%% Find the path of the release's erl file if available
+
+handle_call({find_release, Release}, _From, State) ->
+ R =
+ case test_server_node:is_release_available(Release) of
+ true -> test_server_node:find_release(Release);
+ _ -> not_available
+ end,
{reply, R, State}.
%%--------------------------------------------------------------------
@@ -974,10 +935,6 @@ set_hosts(Hosts) ->
%% Called by test_server_node when a slave/peer node is fully started.
handle_cast({node_started,Node}, State) ->
- case State#state.trc of
- false -> ok;
- Trc -> test_server_node:trace_nodes(Trc, [Node])
- end,
NewWaitList =
case lists:keysearch(Node,1,State#state.wait_for_node) of
{value,{Node,From}} ->
@@ -1052,14 +1009,8 @@ handle_info({'EXIT',Pid,Reason}, State) ->
%% handle_info({tcp_closed,Sock}, State)
%%
%% A Socket was closed. This indicates that a node died.
-%% This can be
-%% *Slave or peer node started by a test suite
-%% *Trace controll node
-
-handle_info({tcp_closed,Sock}, State=#state{trc=Sock}) ->
- %% Tracer node died - can't really do anything
- %%! Maybe print something???
- {noreply,State#state{trc=false}};
+%% This can be a slave or peer node started by a test suite
+
handle_info({tcp_closed,Sock}, State) ->
test_server_node:nodedown(Sock),
{noreply,State};
@@ -1076,10 +1027,6 @@ handle_info(_, State) ->
terminate(_Reason, State) ->
test_server_sup:util_stop(),
- case State#state.trc of
- false -> ok;
- Sock -> test_server_node:stop_tracer_node(Sock)
- end,
ok = kill_all_jobs(State#state.jobs),
_ = test_server_node:kill_nodes(),
ok.
@@ -1293,12 +1240,12 @@ do_spec(SpecName, TimetrapSpec) when is_list(SpecName) ->
%% cannot be granted during the test run. Skip has the syntax specified
%% by collect_cases/3.
%%
-%% {nodes,Nodes} Lists node names avaliable to the test suites. Nodes have
+%% {nodes,Nodes} Lists node names available to the test suites. Nodes have
%% the syntax specified by collect_cases/3.
%%
%% {require_nodenames, Num} Specifies how many nodenames the test suite will
-%% need. Theese are automaticly generated and inserted into the Config by the
-%% test_server. The caller may specify other hosts to run theese nodes by
+%% need. These are automatically generated and inserted into the Config by the
+%% test_server. The caller may specify other hosts to run these nodes by
%% using the {hosts, Hosts} option. If there are no hosts specified, all
%% nodenames will be generated from the local host.
%%
@@ -1309,7 +1256,7 @@ do_spec(SpecName, TimetrapSpec) when is_list(SpecName) ->
%% all hosts given in this Hosts list. The hostnames are given as atoms or
%% strings.
%%
-%% {diskless, true}</c></tag> is kept for backwards compatiblilty and
+%% {diskless, true}</c></tag> is kept for backwards compatibility and
%% should not be used. Use a configuration test case instead.
%%
%% This function is meant to be called by a process created by
@@ -2659,7 +2606,7 @@ run_test_cases_loop([{conf,Ref,Props,{Mod,Func}}|_Cases]=Cs0,
case get_repeat(Props) of
undefined ->
%% we *must* have a status entry for every conf since we
- %% will continously update status with test case results
+ %% will continuously update status with test case results
%% without knowing the Ref (but update hd(Status))
{false,new_status(Ref, Status1),Cases1,?void_fun};
{_RepType,N} when N =< 1 ->
@@ -4728,7 +4675,7 @@ update_config(Config, []) ->
%% Configuration manipulation functions are called with the current
%% configuration list as only argument, and are expected to return a new
%% configuration list. Such a pair of function may, for example, start a
-%% server and stop it after a serie of test cases.
+%% server and stop it after a series of test cases.
%%
%% SkipCases is expected to be in the format:
%%
@@ -5172,6 +5119,14 @@ is_release_available(Release) ->
controller_call({is_release_available,Release}).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% handle_call({find_release,Name}, _, State) -> PathToReleaseErlFile | not_available
+%%
+%% Find the path of the release's erl file if available
+
+find_release(Release) ->
+ controller_call({find_release,Release}).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% stop_node(Name) -> ok | {error,Reason}
%%
%% Clean up - test_server will stop this node
@@ -5406,7 +5361,7 @@ check_cross([]) ->
%% This analysis is executed on the target node once the test is
%% completed for an application. This is not the same as the cross
%% cover analysis, which can be executed on any node after the tests
-%% are finshed.
+%% are finished.
%%
%% This per application analysis writes the file cover.html in the
%% application's run.<timestamp> directory.
diff --git a/lib/common_test/src/test_server_node.erl b/lib/common_test/src/test_server_node.erl
index 5b63a497d7..c8dc0fb27c 100644
--- a/lib/common_test/src/test_server_node.erl
+++ b/lib/common_test/src/test_server_node.erl
@@ -18,20 +18,14 @@
%% %CopyrightEnd%
%%
-module(test_server_node).
--compile(r20).
-
-%%%
-%%% The same compiled code for this module must be possible to load
-%%% in R16B and later.
-%%%
+-compile(r22).
%% Test Controller interface
--export([is_release_available/1]).
--export([start_tracer_node/2,trace_nodes/2,stop_tracer_node/1]).
+-export([is_release_available/1, find_release/1]).
-export([start_node/5, stop_node/1]).
-export([kill_nodes/0, nodedown/1]).
%% Internal export
--export([node_started/1,trc/1,handle_debug/4]).
+-export([node_started/1]).
-include("test_server_internal.hrl").
-record(slave_info, {name,socket,client}).
@@ -39,7 +33,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% %%%
%%% All code in this module executes on the test_server_ctrl process %%%
-%%% except for node_started/1 and trc/1 which execute on a new node. %%%
+%%% except for node_started/1 which execute on a new node. %%%
%%% %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -68,212 +62,6 @@ nodedown(Sock) ->
ok
end.
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% Start trace node
-%%%
-start_tracer_node(TraceFile,TI) ->
- Match = #slave_info{name='$1',_='_'},
- SlaveNodes = lists:map(fun([N]) -> [" ",N] end,
- ets:match(slave_tab,Match)),
- TargetNode = node(),
- Cookie = TI#target_info.cookie,
- {ok,LSock} = gen_tcp:listen(0,[binary,{reuseaddr,true},{packet,2}]),
- {ok,TracePort} = inet:port(LSock),
- {false, Prog0} = pick_erl_program(default),
- Prog = quote_progname(Prog0),
- Cmd = lists:concat([Prog, " -sname tracer -hidden -setcookie ", Cookie,
- " -s ", ?MODULE, " trc ", TraceFile, " ",
- TracePort, " ", TI#target_info.os_family]),
- spawn(fun() -> print_data(open_port({spawn,Cmd},[stream])) end),
-%! open_port({spawn,Cmd},[stream]),
- case gen_tcp:accept(LSock,?ACCEPT_TIMEOUT) of
- {ok,Sock} ->
- gen_tcp:close(LSock),
- receive
- {tcp,Sock,Result} when is_binary(Result) ->
- case unpack(Result) of
- error ->
- gen_tcp:close(Sock),
- {error,timeout};
- {ok,started} ->
- trace_nodes(Sock,[TargetNode | SlaveNodes]),
- {ok,Sock};
- {ok,Error} -> Error
- end;
- {tcp_closed,Sock} ->
- gen_tcp:close(Sock),
- {error,could_not_start_tracernode}
- after ?ACCEPT_TIMEOUT ->
- gen_tcp:close(Sock),
- {error,timeout}
- end;
- Error ->
- gen_tcp:close(LSock),
- {error,{could_not_start_tracernode,Error}}
- end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% Start a tracer on each of these nodes and set flags and patterns
-%%%
-trace_nodes(Sock,Nodes) ->
- Bin = term_to_binary({add_nodes,Nodes}),
- ok = gen_tcp:send(Sock, tag_trace_message(Bin)),
- receive_ack(Sock).
-
-
-receive_ack(Sock) ->
- receive
- {tcp,Sock,Bin} when is_binary(Bin) ->
- case unpack(Bin) of
- error -> receive_ack(Sock);
- {ok,_} -> ok
- end;
- _ ->
- receive_ack(Sock)
- end.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%% Stop trace node
-%%%
-stop_tracer_node(Sock) ->
- Bin = term_to_binary(id(stop)),
- ok = gen_tcp:send(Sock, tag_trace_message(Bin)),
- receive {tcp_closed,Sock} -> gen_tcp:close(Sock) end,
- ok.
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% trc([TraceFile,Nodes]) -> ok
-%%
-%% Start tracing on the given nodes
-%%
-%% This function executes on the new node
-%%
-trc([TraceFile, PortAtom, Type]) ->
- {Result,Patterns} =
- case file:consult(TraceFile) of
- {ok,TI} ->
- Pat = parse_trace_info(lists:flatten(TI)),
- {started,Pat};
- Error ->
- {Error,[]}
- end,
- Port = list_to_integer(atom_to_list(PortAtom)),
- case catch gen_tcp:connect("localhost", Port, [binary,
- {reuseaddr,true},
- {packet,2}]) of
- {ok,Sock} ->
- BinResult = term_to_binary(Result),
- ok = gen_tcp:send(Sock,tag_trace_message(BinResult)),
- trc_loop(Sock,Patterns,Type);
- _else ->
- ok
- end,
- erlang:halt().
-trc_loop(Sock,Patterns,Type) ->
- receive
- {tcp,Sock,Bin} ->
- case unpack(Bin) of
- error ->
- ttb:stop(),
- gen_tcp:close(Sock);
- {ok,{add_nodes,Nodes}} ->
- add_nodes(Nodes,Patterns,Type),
- Bin = term_to_binary(id(ok)),
- ok = gen_tcp:send(Sock, tag_trace_message(Bin)),
- trc_loop(Sock,Patterns,Type);
- {ok,stop} ->
- ttb:stop(),
- gen_tcp:close(Sock)
- end;
- {tcp_closed,Sock} ->
- ttb:stop(),
- gen_tcp:close(Sock)
- end.
-add_nodes(Nodes,Patterns,_Type) ->
- {ok, _} = ttb:tracer(Nodes,[{file,{local, test_server}},
- {handler, {{?MODULE,handle_debug},initial}}]),
- {ok, _} = ttb:p(all,[call,timestamp]),
- lists:foreach(fun({TP,M,F,A,Pat}) -> ttb:TP(M,F,A,Pat);
- ({CTP,M,F,A}) -> ttb:CTP(M,F,A)
- end,
- Patterns).
-
-parse_trace_info([{TP,M,Pat}|Pats]) when TP=:=tp; TP=:=tpl ->
- [{TP,M,'_','_',Pat}|parse_trace_info(Pats)];
-parse_trace_info([{TP,M,F,Pat}|Pats]) when TP=:=tp; TP=:=tpl ->
- [{TP,M,F,'_',Pat}|parse_trace_info(Pats)];
-parse_trace_info([{TP,M,F,A,Pat}|Pats]) when TP=:=tp; TP=:=tpl ->
- [{TP,M,F,A,Pat}|parse_trace_info(Pats)];
-parse_trace_info([CTP|Pats]) when CTP=:=ctp; CTP=:=ctpl; CTP=:=ctpg ->
- [{CTP,'_','_','_'}|parse_trace_info(Pats)];
-parse_trace_info([{CTP,M}|Pats]) when CTP=:=ctp; CTP=:=ctpl; CTP=:=ctpg ->
- [{CTP,M,'_','_'}|parse_trace_info(Pats)];
-parse_trace_info([{CTP,M,F}|Pats]) when CTP=:=ctp; CTP=:=ctpl; CTP=:=ctpg ->
- [{CTP,M,F,'_'}|parse_trace_info(Pats)];
-parse_trace_info([{CTP,M,F,A}|Pats]) when CTP=:=ctp; CTP=:=ctpl; CTP=:=ctpg ->
- [{CTP,M,F,A}|parse_trace_info(Pats)];
-parse_trace_info([]) ->
- [];
-parse_trace_info([_other|Pats]) -> % ignore
- parse_trace_info(Pats).
-
-handle_debug(Out,Trace,TI,initial) ->
- handle_debug(Out,Trace,TI,0);
-handle_debug(_Out,end_of_trace,_TI,N) ->
- N;
-handle_debug(Out,Trace,_TI,N) ->
- print_trc(Out,Trace,N),
- N+1.
-
-print_trc(Out,{trace_ts,P,call,{M,F,A},C,Ts},N) ->
- io:format(Out,
- "~w: ~s~n"
- "Process : ~w~n"
- "Call : ~w:~tw/~w~n"
- "Arguments : ~tp~n"
- "Caller : ~tw~n~n",
- [N,ts(Ts),P,M,F,length(A),A,C]);
-print_trc(Out,{trace_ts,P,call,{M,F,A},Ts},N) ->
- io:format(Out,
- "~w: ~s~n"
- "Process : ~w~n"
- "Call : ~w:~tw/~w~n"
- "Arguments : ~tp~n~n",
- [N,ts(Ts),P,M,F,length(A),A]);
-print_trc(Out,{trace_ts,P,return_from,{M,F,A},R,Ts},N) ->
- io:format(Out,
- "~w: ~s~n"
- "Process : ~w~n"
- "Return from : ~w:~tw/~w~n"
- "Return value : ~tp~n~n",
- [N,ts(Ts),P,M,F,A,R]);
-print_trc(Out,{drop,X},N) ->
- io:format(Out,
- "~w: Tracer dropped ~w messages - too busy~n~n",
- [N,X]);
-print_trc(Out,Trace,N) ->
- Ts = element(size(Trace),Trace),
- io:format(Out,
- "~w: ~s~n"
- "Trace : ~tp~n~n",
- [N,ts(Ts),Trace]).
-ts({_, _, Micro} = Now) ->
- {{Y,M,D},{H,Min,S}} = calendar:now_to_local_time(Now),
- io_lib:format("~4.4.0w-~2.2.0w-~2.2.0w ~2.2.0w:~2.2.0w:~2.2.0w,~6.6.0w",
- [Y,M,D,H,Min,S,Micro]).
-
-
-
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Start slave/peer nodes (initiated by test_server:start_node/5)
%%%
@@ -395,6 +183,9 @@ start_node_slave(SlaveName, OptList, From, _TI) ->
end,
gen_server:reply(From,Ret).
+%% Temporary suppression, to avoid a warning calling undocumented
+%% but deprecated function.
+-compile([{nowarn_deprecated_function,[{slave,start,5}]}]).
do_start_node_slave(Host0, SlaveName, Args, Prog, Cleanup, ClearAFlags) ->
Host =
@@ -645,7 +436,7 @@ pick_erl_program(L) ->
%% path and spaces that separate arguments. The program is quoted to
%% allow spaces in the path.
%%
-%% Arguments could exist either if the executable is excplicitly given
+%% Arguments could exist either if the executable is explicitly given
%% ({prog,String}) or if the -program switch to beam is used and
%% includes arguments (typically done by cerl in OTP test environment
%% in order to ensure that slave/peer nodes are started with the same
@@ -912,24 +703,3 @@ unpack(Bin) ->
_ -> error
end.
-id(I) -> I.
-
-print_data(Port) ->
- ct_util:mark_process(),
- receive
- {Port, {data, Bytes}} ->
- io:put_chars(Bytes),
- print_data(Port);
- {Port, eof} ->
- Port ! {self(), close},
- receive
- {Port, closed} ->
- true
- end,
- receive
- {'EXIT', Port, _} ->
- ok
- after 1 -> % force context switch
- ok
- end
- end.
diff --git a/lib/common_test/src/test_server_sup.erl b/lib/common_test/src/test_server_sup.erl
index 01d2ff3baa..dc8b4eeea9 100644
--- a/lib/common_test/src/test_server_sup.erl
+++ b/lib/common_test/src/test_server_sup.erl
@@ -510,8 +510,8 @@ check_change({advanced, _}) -> ok;
check_change(Change) -> throw({error, {bad_change, Change}}).
%% Given two sorted lists, L1 and L2, returns {NotInL2, NotInL1},
-%% NotInL2 is the elements of L1 which don't occurr in L2,
-%% NotInL1 is the elements of L2 which don't ocurr in L1.
+%% NotInL2 is the elements of L1 which don't occur in L2,
+%% NotInL1 is the elements of L2 which don't occur in L1.
common(L1, L2) ->
common(L1, L2, [], []).
diff --git a/lib/common_test/test/Makefile b/lib/common_test/test/Makefile
index 8b4222f79f..4cc10cbdcc 100644
--- a/lib/common_test/test/Makefile
+++ b/lib/common_test/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2020. All Rights Reserved.
+# Copyright Ericsson AB 2008-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -112,7 +112,7 @@ EBIN = .
# $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES)\
# > $(EMAKEFILE)
-tests debug opt:
+tests $(TYPES):
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/common_test/test/ct_auto_clean_SUITE_data/cth_auto_clean.erl b/lib/common_test/test/ct_auto_clean_SUITE_data/cth_auto_clean.erl
index 3f8d3957cc..cf8a346764 100644
--- a/lib/common_test/test/ct_auto_clean_SUITE_data/cth_auto_clean.erl
+++ b/lib/common_test/test/ct_auto_clean_SUITE_data/cth_auto_clean.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -62,7 +62,7 @@ post_end_per_suite(_Suite, _Config, Return, State) ->
AllProcs = processes(),
Remaining = AllProcs--proplists:get_value(all_procs, State),
ct:pal("Final remaining processes = ~p", [Remaining]),
- %% only the end_per_suite process shoud remain at this point!
+ %% only the end_per_suite process should remain at this point!
Remaining = [self()],
{Return, State}.
diff --git a/lib/common_test/test/ct_error_SUITE.erl b/lib/common_test/test/ct_error_SUITE.erl
index 5df5b52a48..3b62380f87 100644
--- a/lib/common_test/test/ct_error_SUITE.erl
+++ b/lib/common_test/test/ct_error_SUITE.erl
@@ -614,7 +614,7 @@ test_events(cfg_error) ->
{?eh,test_stats,{9,1,{0,18}}},
{?eh,tc_start,{cfg_error_9_SUITE,tc6}},
%%! we get ok with tc_done since it's only afterwards
- %%! end_tc failes the testcase
+ %%! end_tc fails the testcase
{?eh,tc_done,{cfg_error_9_SUITE,tc6,ok}},
{?eh,test_stats,{9,2,{0,18}}},
{?eh,tc_start,{cfg_error_9_SUITE,tc7}},
diff --git a/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_8_SUITE.erl b/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_8_SUITE.erl
index eb5df8c45d..fa7b4507f0 100644
--- a/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_8_SUITE.erl
+++ b/lib/common_test/test/ct_error_SUITE_data/error/test/timetrap_8_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -130,8 +130,8 @@ groups() ->
{pg9,[parallel],[tc5,tc0]}, % exit during testcase
{pg10,[parallel],[tc0,tc5]},% exit during testcase
{pg11,[parallel],[tc3,tc2]},% suite is valid if nothing else is specified
- {sg1,[sequence],[tc5,tc0,tc1,tc2]}, % exit during sequencial testcase
- {sg2,[sequence],[tc5,tc0,tc1,tc2]}].% timeout during sequencial testcase
+ {sg1,[sequence],[tc5,tc0,tc1,tc2]}, % exit during sequential testcase
+ {sg2,[sequence],[tc5,tc0,tc1,tc2]}].% timeout during sequential testcase
group(g0) ->
[{timetrap,{timetrap_utils,timetrap_val,[{seconds,1}]}}];
diff --git a/lib/common_test/test/ct_group_leader_SUITE_data/group_leader_SUITE.erl b/lib/common_test/test/ct_group_leader_SUITE_data/group_leader_SUITE.erl
index 4bed60e895..7f082c0a9d 100644
--- a/lib/common_test/test/ct_group_leader_SUITE_data/group_leader_SUITE.erl
+++ b/lib/common_test/test/ct_group_leader_SUITE_data/group_leader_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -148,7 +148,7 @@ p1(_) ->
%% respond to IO messages. The process is still group leader for the
%% external app, however, which is wrong. It's the IO process for the
%% parallel test case that should be group leader - but only for the
- %% particular invokation, since other parallel test cases could be
+ %% particular invocation, since other parallel test cases could be
%% invoking the external app too.
print("hej\n").
diff --git a/lib/common_test/test/ct_hooks_SUITE.erl b/lib/common_test/test/ct_hooks_SUITE.erl
index 08f0c751dd..0133d8f371 100644
--- a/lib/common_test/test/ct_hooks_SUITE.erl
+++ b/lib/common_test/test/ct_hooks_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -2109,7 +2109,7 @@ test_events(callbacks_on_skip) ->
[]]}},
%% skip_fail_SUITE is auto-skipped since the suite/0 function
- %% retuns a faluty format.
+ %% returns a faluty format.
%% No group- or testcase-functions shall be called.
{?eh,tc_start,{skip_fail_SUITE,init_per_suite}},
{?eh,tc_done,{skip_fail_SUITE,init_per_suite,
diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl
index f36092713e..ff0909d725 100644
--- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl
+++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl
@@ -179,7 +179,7 @@ hello_configured_extraopts() ->
[{require, netconf1}].
hello_configured_extraopts(Config) ->
SshDir = ?config(ssh_dir,Config),
- %% Test that the cofiguration overwrites the ExtraOpts parameter
+ %% Test that the configuration overwrites the ExtraOpts parameter
%% to ct_netconfc:open/2.
{ok,Client} = open_configured_success(netconf1,SshDir,[{password,"faulty"}]),
?NS:expect_do_reply('close-session',close,ok),
@@ -1268,7 +1268,7 @@ open_success(Dir) ->
open_success(Dir,[]).
%% Open a netconf session which is not specified in a config file, and
-%% give som extra options in addition to the test defaults.
+%% give some extra options in addition to the test defaults.
open_success(Dir,ExtraOpts) when is_list(Dir), is_list(ExtraOpts) ->
?NS:hello(1), % tell server to send hello with session id 1
?NS:expect(hello), % tell server to expect a hello message from client
diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl
index 12c250457e..c641704b10 100644
--- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl
+++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl
@@ -120,7 +120,7 @@ open_success(Node,Dir) ->
open_success(Node,Dir,[]).
%% Open a netconf session which is not specified in a config file, and
-%% give som extra options in addition to the test defaults.
+%% give some extra options in addition to the test defaults.
open_success(Node,Dir,ExtraOpts) when is_list(Dir), is_list(ExtraOpts) ->
ns(Node,hello,[1]), % tell server to send hello with session id 1
ns(Node,expect,[hello]), % tell server to expect a hello message from client
diff --git a/lib/common_test/test/ct_surefire_SUITE.erl b/lib/common_test/test/ct_surefire_SUITE.erl
index a71288fb12..e80e5a37b2 100644
--- a/lib/common_test/test/ct_surefire_SUITE.erl
+++ b/lib/common_test/test/ct_surefire_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -34,6 +34,7 @@
-include_lib("xmerl/include/xmerl.hrl").
-include_lib("kernel/include/file.hrl").
+-include_lib("stdlib/include/assert.hrl").
-define(eh, ct_test_support_eh).
@@ -234,28 +235,36 @@ test_suite_events(Test) ->
{?eh,tc_start,{surefire_SUITE,tc_fail}},
{?eh,tc_done,{surefire_SUITE,tc_fail,
{failed,{error,{test_case_failed,"this test should fail"}}}}},
- {?eh,test_stats,{1,1,{0,0}}}] ++
+ {?eh,test_stats,{1,1,{0,0}}},
+ {?eh,tc_start,{surefire_SUITE,tc_badmatch}},
+ {?eh,tc_done,{surefire_SUITE,tc_badmatch,
+ {failed,{error,{{badmatch,nok},'_'}}}}},
+ {?eh,test_stats,{1,2,{0,0}}}] ++
tc_skip_events(Test,undefined) ++
- [{?eh,test_stats,{1,1,{1,0}}},
+ [{?eh,test_stats,{1,2,{1,0}}},
{?eh,tc_start,{surefire_SUITE,tc_autoskip_require}},
{?eh,tc_done,{surefire_SUITE,tc_autoskip_require,
{auto_skipped,{require_failed,'_'}}}},
- {?eh,test_stats,{1,1,{1,1}}},
+ {?eh,test_stats,{1,2,{1,1}}},
[{?eh,tc_start,{surefire_SUITE,{init_per_group,g,[]}}},
{?eh,tc_done,{surefire_SUITE,{init_per_group,g,[]},ok}},
{?eh,tc_start,{surefire_SUITE,tc_ok}},
{?eh,tc_done,{surefire_SUITE,tc_ok,ok}},
- {?eh,test_stats,{2,1,{1,1}}},
+ {?eh,test_stats,{2,2,{1,1}}},
{?eh,tc_start,{surefire_SUITE,tc_fail}},
{?eh,tc_done,{surefire_SUITE,tc_fail,
{failed,{error,{test_case_failed,"this test should fail"}}}}},
- {?eh,test_stats,{2,2,{1,1}}}] ++
+ {?eh,test_stats,{2,3,{1,1}}},
+ {?eh,tc_start,{surefire_SUITE,tc_badmatch}},
+ {?eh,tc_done,{surefire_SUITE,tc_badmatch,
+ {failed,{error,{{badmatch,nok},'_'}}}}},
+ {?eh,test_stats,{2,4,{1,1}}}] ++
tc_skip_events(Test,g) ++
- [{?eh,test_stats,{2,2,{2,1}}},
+ [{?eh,test_stats,{2,4,{2,1}}},
{?eh,tc_start,{surefire_SUITE,tc_autoskip_require}},
{?eh,tc_done,{surefire_SUITE,tc_autoskip_require,
{auto_skipped,{require_failed,'_'}}}},
- {?eh,test_stats,{2,2,{2,2}}},
+ {?eh,test_stats,{2,4,{2,2}}},
{?eh,tc_start,{surefire_SUITE,{end_per_group,g,[]}}},
{?eh,tc_done,{surefire_SUITE,{end_per_group,g,[]},ok}}],
[{?eh,tc_start,{surefire_SUITE,{init_per_group,g_fail,[]}}},
@@ -265,7 +274,7 @@ test_suite_events(Test) ->
{failed,
{surefire_SUITE,init_per_group,
{'EXIT',all_cases_should_be_skipped}}}}},
- {?eh,test_stats,{2,2,{2,3}}},
+ {?eh,test_stats,{2,4,{2,3}}},
{?eh,tc_auto_skip,{surefire_SUITE,{end_per_group,g_fail},
{failed,
{surefire_SUITE,init_per_group,
@@ -295,7 +304,7 @@ test_events(skip_suite_in_spec) ->
test_suite_events(skip_all_surefire_SUITE) ++
[{?eh,stop_logging,[]}];
test_events(Test) ->
- [{?eh,start_logging,'_'}, {?eh,start_info,{1,1,9}}] ++
+ [{?eh,start_logging,'_'}, {?eh,start_info,{1,1,11}}] ++
test_suite_events(Test) ++
[{?eh,stop_logging,[]}].
@@ -363,6 +372,7 @@ testsuite(_Case,[]) ->
testcase(url=Case,[#xmlElement{name=testcase,attributes=A,content=C}|TC]) ->
R = failed_or_skipped(C),
+ assert_lines(Case,A),
case R of
[s] ->
case lists:keyfind(url,#xmlAttribute.name,A) of
@@ -379,6 +389,7 @@ testcase(url=Case,[#xmlElement{name=testcase,attributes=A,content=C}|TC]) ->
[R|testcase(Case,TC)];
testcase(Case,[#xmlElement{name=testcase,attributes=A,content=C}|TC]) ->
false = lists:keyfind(url,#xmlAttribute.name,A),
+ assert_lines(Case,A),
R = failed_or_skipped(C),
[R|testcase(Case,TC)];
testcase(_Case,[]) ->
@@ -393,6 +404,37 @@ failed_or_skipped([#xmlElement{name=skipped}|E]) ->
failed_or_skipped([]) ->
[].
+assert_lines(Case, A) when Case =/= fail_pre_init_per_suite,
+ Case =/= skip_case_in_spec,
+ Case =/= skip_suite_in_spec ->
+ Name = lists:keyfind(name,#xmlAttribute.name,A),
+ File = lists:keyfind(file,#xmlAttribute.name,A),
+ Line = lists:keyfind(line,#xmlAttribute.name,A),
+ ?assertMatch("surefire_SUITE.erl",filename:basename(File#xmlAttribute.value)),
+ case Name#xmlAttribute.value of
+ "init_per_suite" ->
+ ?assertMatch("51", Line#xmlAttribute.value);
+ "end_per_suite" ->
+ ?assertMatch("54", Line#xmlAttribute.value);
+ "tc_ok" ->
+ ?assertMatch("80", Line#xmlAttribute.value);
+ "tc_fail" ->
+ ?assertMatch("85", Line#xmlAttribute.value);
+ "tc_badmatch" ->
+ ?assertMatch("89", Line#xmlAttribute.value);
+ "tc_skip" ->
+ ?assertMatch("91", Line#xmlAttribute.value);
+ "tc_autoskip_require" ->
+ ?assertMatch("96", Line#xmlAttribute.value);
+ "init_per_group" ->
+ ?assertMatch("57", Line#xmlAttribute.value);
+ "end_per_group" ->
+ ?assertMatch("62", Line#xmlAttribute.value)
+ end;
+assert_lines(_, _) ->
+ ok.
+
+
%% Using the expected events to produce the expected result of the XML scanning.
%% The result is a list of test suites:
%% Testsuites = [Testsuite]
diff --git a/lib/common_test/test/ct_surefire_SUITE_data/surefire_SUITE.erl b/lib/common_test/test/ct_surefire_SUITE_data/surefire_SUITE.erl
index 4644355ca9..eb5f5a4217 100644
--- a/lib/common_test/test/ct_surefire_SUITE_data/surefire_SUITE.erl
+++ b/lib/common_test/test/ct_surefire_SUITE_data/surefire_SUITE.erl
@@ -1,7 +1,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -44,6 +44,7 @@ groups() ->
testcases() ->
[tc_ok,
tc_fail,
+ tc_badmatch,
tc_skip,
tc_autoskip_require].
@@ -76,12 +77,17 @@ break(_Config) ->
test_server:break(""),
ok.
-tc_ok(_Config) ->
- ok.
+tc_ok(Config) when is_list(Config) ->
+ ok;
+tc_ok(_) ->
+ ct:fail("This should never fail").
tc_fail(_Config) ->
ct:fail("this test should fail").
+tc_badmatch(_Config) ->
+ ok = nok.
+
tc_skip(_Config) ->
{skip,"this test is skipped"}.
diff --git a/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_basic_SUITE.erl b/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_basic_SUITE.erl
index 3885c1991d..ec9431c3f0 100644
--- a/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_basic_SUITE.erl
+++ b/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_basic_SUITE.erl
@@ -131,7 +131,7 @@ sendf(Config) ->
no_newline(Config) ->
{ok, Handle} = ct_telnet:open(?conn_name(?get_n(Config))),
- IAC = 255, % interprete as command
+ IAC = 255, % interpreted as command
AYT = 246, % are you there
ok = ct_telnet:send(Handle, [IAC,AYT], [{newline,false}]),
{ok,_} = ct_telnet:expect(Handle,"yes",[no_prompt_check]),
diff --git a/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_timetrap_SUITE.erl b/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_timetrap_SUITE.erl
index c45a4f0984..afb2031f9a 100644
--- a/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_timetrap_SUITE.erl
+++ b/lib/common_test/test/ct_telnet_SUITE_data/ct_telnet_timetrap_SUITE.erl
@@ -53,7 +53,7 @@ end_per_testcase(_,_Config) ->
%% The long timetrap timeout and timeout option in the expect call
%% also causes the telnet client to hang so long that the attempt at
%% closing it (in end_per_testcase) will time out (close timeout is 5
-%% sec) without a timetrap timeout occuring in end_per_testcase.
+%% sec) without a timetrap timeout occurring in end_per_testcase.
%%
%% The point is to see that the connection is thoroughly removed and
%% unregistered anyway so that the next test case can successfully
diff --git a/lib/common_test/test/erl2html2_SUITE.erl b/lib/common_test/test/erl2html2_SUITE.erl
index b2336ff0bc..bac028350a 100644
--- a/lib/common_test/test/erl2html2_SUITE.erl
+++ b/lib/common_test/test/erl2html2_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -262,7 +262,7 @@ sax_event({startElement,_Uri,"a",_QN,Attrs},{Exports,LastExprFuncs,PrevLine}) ->
{match,[FStr,EndStr]} =
re:run(Name,"^(.*)-(last_expr|[0-9]+)$",
[{capture,all_but_first,list}]),
- F = list_to_atom(http_uri:decode(FStr)),
+ F = list_to_atom(uri_string:unquote(FStr)),
case EndStr of
"last_expr" ->
true = lists:member(F,LastExprFuncs),
diff --git a/lib/common_test/test_server/Makefile b/lib/common_test/test_server/Makefile
index f015064b39..4ff5e678ee 100644
--- a/lib/common_test/test_server/Makefile
+++ b/lib/common_test/test_server/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2016. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -47,7 +47,7 @@ TS_TARGET_MODULES= $(TS_MODULES:%=$(EBIN)/%)
TS_ERL_FILES = $(TS_MODULES:=.erl)
TS_HRL_FILES = ts.hrl
-AUTOCONF_FILES = configure.in conf_vars.in
+AUTOCONF_FILES = conf_vars.in
PROGRAMS = configure config.sub config.guess install-sh
CONFIG = ts.config ts.unix.config ts.win32.config
@@ -64,7 +64,7 @@ ERL_COMPILE_FLAGS += -I../include -Werror
# Targets
# ----------------------------------------------------
-tests debug opt: $(TS_TARGETS)
+tests $(TYPES): $(TS_TARGETS)
clean:
rm -f $(TS_TARGET_FILES)
@@ -72,9 +72,6 @@ clean:
docs:
-configure: configure.in
- autoconf configure.in > configure
-
# ----------------------------------------------------
# Special Build Targets
# ----------------------------------------------------
diff --git a/lib/common_test/test_server/configure b/lib/common_test/test_server/configure
index d190f0250b..38a17b2fab 100755
--- a/lib/common_test/test_server/configure
+++ b/lib/common_test/test_server/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,42 +167,52 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
- test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
-test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -228,14 +220,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -253,18 +252,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -291,6 +291,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -308,6 +309,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -322,7 +331,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -331,7 +340,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -370,12 +379,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -387,18 +397,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -410,9 +429,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -439,7 +458,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -483,7 +502,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -497,6 +516,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -510,6 +533,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -575,50 +605,46 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
ac_unique_file="conf_vars.in"
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
+ac_header_c_list=
ac_subst_vars='LTLIBOBJS
LIBOBJS
test_c_compiler
@@ -640,9 +666,6 @@ SHLIB_CFLAGS
SHLIB_LDLIBS
SHLIB_LDFLAGS
SHLIB_LD
-EGREP
-GREP
-CPP
DEBUG_FLAGS
OBJEXT
EXEEXT
@@ -713,8 +736,7 @@ CC
CFLAGS
LDFLAGS
LIBS
-CPPFLAGS
-CPP'
+CPPFLAGS'
# Initialize some variables set by options.
@@ -783,8 +805,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -825,9 +845,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -851,9 +871,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1064,9 +1084,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1080,9 +1100,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1126,9 +1146,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1144,7 +1164,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1208,7 +1228,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1350,7 +1370,6 @@ Some influential environment variables:
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
- CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -1371,9 +1390,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1401,7 +1420,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1409,7 +1429,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1419,9 +1439,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1438,14 +1458,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1453,14 +1473,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1476,14 +1497,14 @@ fi
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1491,17 +1512,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1516,172 +1538,6 @@ fi
} # ac_fn_c_try_link
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
@@ -1689,26 +1545,28 @@ fi
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
@@ -1719,11 +1577,12 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
@@ -1731,16 +1590,9 @@ else
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ which can conflict with char $2 (); below. */
+#include <limits.h>
#undef $2
/* Override any GCC internal prototype to avoid an error.
@@ -1758,35 +1610,56 @@ choke me
#endif
int
-main ()
+main (void)
{
return $2 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -1819,8 +1692,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -1855,7 +1732,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -1890,11 +1767,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -1905,8 +1784,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -1930,7 +1809,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -1938,14 +1817,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -1953,15 +1832,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -1969,8 +1848,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -1984,63 +1863,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -2050,19 +1914,434 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.."
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2073,12 +2352,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2087,24 +2366,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2114,11 +2393,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2132,55 +2412,32 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2199,21 +2456,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2233,6 +2491,15 @@ case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+
+
+
+
+
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2241,11 +2508,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2253,11 +2521,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2268,11 +2540,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2281,11 +2553,12 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2293,11 +2566,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2308,11 +2585,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -2320,8 +2597,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2334,11 +2611,12 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2346,11 +2624,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2361,11 +2643,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2374,11 +2656,12 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2387,15 +2670,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2411,18 +2698,18 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2433,11 +2720,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2445,11 +2733,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2460,11 +2752,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2477,11 +2769,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2489,11 +2782,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2504,11 +2801,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2520,34 +2817,138 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
+else
+ CC="$ac_cv_prog_CC"
fi
fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -2557,7 +2958,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -2565,7 +2966,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -2577,9 +2978,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -2600,11 +3001,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
@@ -2621,7 +3023,7 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
@@ -2637,44 +3039,46 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
+else $as_nop
ac_file=''
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -2688,15 +3092,15 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -2705,7 +3109,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
@@ -2717,8 +3121,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -2726,10 +3130,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -2737,39 +3141,40 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -2783,11 +3188,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -2796,31 +3202,32 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -2830,29 +3237,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
@@ -2861,57 +3272,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
+else $as_nop
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -2926,94 +3340,144 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
-
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
fi
ac_ext=c
@@ -3030,7 +3494,8 @@ fi
# Check whether --enable-debug-mode was given.
-if test "${enable_debug_mode+set}" = set; then :
+if test ${enable_debug_mode+y}
+then :
enableval=$enable_debug_mode; case "$enableval" in
no) ;;
*) CFLAGS=$DEBUG_FLAGS ;;
@@ -3039,25 +3504,27 @@ fi
# Check whether --enable-m64-build was given.
-if test "${enable_m64_build+set}" = set; then :
+if test ${enable_m64_build+y}
+then :
enableval=$enable_m64_build; case "$enableval" in
no) enable_m64_build=no ;;
*) enable_m64_build=yes ;;
esac
-else
+else $as_nop
enable_m64_build=no
fi
# Check whether --enable-m32-build was given.
-if test "${enable_m32_build+set}" = set; then :
+if test ${enable_m32_build+y}
+then :
enableval=$enable_m32_build; case "$enableval" in
no) enable_m32_build=no ;;
*) enable_m32_build=yes ;;
esac
-else
+else $as_nop
enable_m32_build=no
fi
@@ -3074,11 +3541,12 @@ if test X${enable_m32_build} = Xyes; then
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
-$as_echo_n "checking for sin in -lm... " >&6; }
-if ${ac_cv_lib_m_sin+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5
+printf %s "checking for sin in -lm... " >&6; }
+if test ${ac_cv_lib_m_sin+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lm $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3087,33 +3555,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char sin ();
int
-main ()
+main (void)
{
return sin ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_m_sin=yes
-else
+else $as_nop
ac_cv_lib_m_sin=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
-$as_echo "$ac_cv_lib_m_sin" >&6; }
-if test "x$ac_cv_lib_m_sin" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBM 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5
+printf "%s\n" "$ac_cv_lib_m_sin" >&6; }
+if test "x$ac_cv_lib_m_sin" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBM 1" >>confdefs.h
LIBS="-lm $LIBS"
@@ -3125,11 +3590,12 @@ fi
# needs net/errno.h to define the socket-related error codes.
#--------------------------------------------------------------------
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5
-$as_echo_n "checking for main in -linet... " >&6; }
-if ${ac_cv_lib_inet_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5
+printf %s "checking for main in -linet... " >&6; }
+if test ${ac_cv_lib_inet_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-linet $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3137,446 +3603,80 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
int
-main ()
+main (void)
{
return main ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_inet_main=yes
-else
+else $as_nop
ac_cv_lib_inet_main=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5
-$as_echo "$ac_cv_lib_inet_main" >&6; }
-if test "x$ac_cv_lib_inet_main" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5
+printf "%s\n" "$ac_cv_lib_inet_main" >&6; }
+if test "x$ac_cv_lib_inet_main" = xyes
+then :
LIBS="$LIBS -linet"
fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
+done
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-fi
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-fi
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
fi
-
-done
-
-
-ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default"
-if test "x$ac_cv_header_net_errno_h" = xyes; then :
- $as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h
+ac_fn_c_check_header_compile "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default"
+if test "x$ac_cv_header_net_errno_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NET_ERRNO_H 1" >>confdefs.h
fi
-
#--------------------------------------------------------------------
# Linux/tcp.h may be needed for sockopt test in kernel
#--------------------------------------------------------------------
-ac_fn_c_check_header_mongrel "$LINENO" "linux/tcp.h" "ac_cv_header_linux_tcp_h" "$ac_includes_default"
-if test "x$ac_cv_header_linux_tcp_h" = xyes; then :
- $as_echo "#define HAVE_LINUX_TCP_H 1" >>confdefs.h
+ac_fn_c_check_header_compile "$LINENO" "linux/tcp.h" "ac_cv_header_linux_tcp_h" "$ac_includes_default"
+if test "x$ac_cv_header_linux_tcp_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LINUX_TCP_H 1" >>confdefs.h
fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sane linux/tcp.h" >&5
-$as_echo_n "checking for sane linux/tcp.h... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sane linux/tcp.h" >&5
+printf %s "checking for sane linux/tcp.h... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
@@ -3591,29 +3691,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#include <netinet/in.h>
#include <netdb.h>
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
have_sane_linux_tcp_h=yes
-else
+else $as_nop
have_sane_linux_tcp_h=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
if test $have_sane_linux_tcp_h = yes; then
-$as_echo "#define HAVE_SANE_LINUX_TCP_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_SANE_LINUX_TCP_H 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3621,26 +3722,26 @@ fi
#--------------------------------------------------------------------
# Linux requires sys/socketio.h instead of sys/sockio.h
#--------------------------------------------------------------------
-ac_fn_c_check_header_mongrel "$LINENO" "sys/socketio.h" "ac_cv_header_sys_socketio_h" "$ac_includes_default"
-if test "x$ac_cv_header_sys_socketio_h" = xyes; then :
- $as_echo "#define HAVE_SOCKETIO_H 1" >>confdefs.h
+ac_fn_c_check_header_compile "$LINENO" "sys/socketio.h" "ac_cv_header_sys_socketio_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_socketio_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SOCKETIO_H 1" >>confdefs.h
fi
-
#--------------------------------------------------------------------
# Misc
#--------------------------------------------------------------------
-ac_fn_c_check_header_mongrel "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default"
-if test "x$ac_cv_header_poll_h" = xyes; then :
- $as_echo "#define HAVE_POLL_H 1" >>confdefs.h
+ac_fn_c_check_header_compile "$LINENO" "poll.h" "ac_cv_header_poll_h" "$ac_includes_default"
+if test "x$ac_cv_header_poll_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_POLL_H 1" >>confdefs.h
fi
-
#--------------------------------------------------------------------
# The statements below define a collection of symbols related to
# dynamic loading and shared libraries:
@@ -3658,20 +3759,21 @@ fi
# Step 1: set the variable "system" to hold the name and version number
# for the system.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking system version (for dynamic loading)" >&5
-$as_echo_n "checking system version (for dynamic loading)... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking system version (for dynamic loading)" >&5
+printf %s "checking system version (for dynamic loading)... " >&6; }
system=`./config.sub $host`
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $system" >&5
-$as_echo "$system" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $system" >&5
+printf "%s\n" "$system" >&6; }
# Step 2: check for existence of -ldl library. This is needed because
# Linux can use either -ldl or -ldld for dynamic loading.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
-$as_echo_n "checking for dlopen in -ldl... " >&6; }
-if ${ac_cv_lib_dl_dlopen+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+printf %s "checking for dlopen in -ldl... " >&6; }
+if test ${ac_cv_lib_dl_dlopen+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3680,32 +3782,31 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char dlopen ();
int
-main ()
+main (void)
{
return dlopen ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_dl_dlopen=yes
-else
+else $as_nop
ac_cv_lib_dl_dlopen=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
-$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
-if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes
+then :
have_dl=yes
-else
+else $as_nop
have_dl=no
fi
@@ -3714,8 +3815,9 @@ fi
SHLIB_LDLIBS=
fullSrcDir=`cd $srcdir; pwd`
-case $system in
- *-linux-*)
+case $system in #(
+ *-linux-*) :
+
SHLIB_CFLAGS="-fPIC"
SHLIB_SUFFIX=".so"
if test "$have_dl" = yes; then
@@ -3723,14 +3825,14 @@ case $system in
SHLIB_LDFLAGS="$LDFLAGS -shared"
LD_FLAGS="-rdynamic"
else
- ac_fn_c_check_header_mongrel "$LINENO" "dld.h" "ac_cv_header_dld_h" "$ac_includes_default"
-if test "x$ac_cv_header_dld_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "dld.h" "ac_cv_header_dld_h" "$ac_includes_default"
+if test "x$ac_cv_header_dld_h" = xyes
+then :
SHLIB_LD="ld"
SHLIB_LDFLAGS="-shared"
fi
-
if test X${enable_m64_build} = Xyes; then
as_fn_error $? "don't know how to link 64-bit dynamic drivers" "$LINENO" 5
fi
@@ -3739,11 +3841,13 @@ fi
fi
fi
SHLIB_EXTRACT_ALL=""
- ;;
- *-openbsd*|*-netbsd*|*-freebsd*|*-dragonfly*)
+ ;; #(
+ *-openbsd*|*-netbsd*|*-freebsd*|*-dragonfly*) :
+
# Not available on all versions: check for include file.
- ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default"
-if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default"
+if test "x$ac_cv_header_dlfcn_h" = xyes
+then :
SHLIB_CFLAGS="-fpic"
SHLIB_LD="${CC}"
@@ -3756,7 +3860,7 @@ if test "x$ac_cv_header_dlfcn_h" = xyes; then :
as_fn_error $? "don't know how to link 32-bit dynamic drivers" "$LINENO" 5
fi
-else
+else $as_nop
# No dynamic loading.
SHLIB_CFLAGS=""
@@ -3767,10 +3871,10 @@ else
fi
-
SHLIB_EXTRACT_ALL=""
- ;;
- *-solaris2*|*-sysv4*)
+ ;; #(
+ *-solaris2*|*-sysv4*) :
+
SHLIB_CFLAGS="-KPIC"
SHLIB_LD="/usr/ccs/bin/ld"
SHLIB_LDFLAGS="$no_mXX_LDFLAGS -G -z text"
@@ -3782,15 +3886,17 @@ fi
fi
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL="-z allextract"
- ;;
- *darwin*)
+ ;; #(
+ *darwin*) :
+
SHLIB_CFLAGS="-fno-common"
SHLIB_LD="cc"
SHLIB_LDFLAGS="$LDFLAGS -bundle -flat_namespace -undefined suppress"
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL=""
- ;;
- *osf1*)
+ ;; #(
+ *osf1*) :
+
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="ld"
SHLIB_LDFLAGS="$LDFLAGS -shared"
@@ -3802,15 +3908,17 @@ fi
fi
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL=""
- ;;
- *osf5*)
+ ;; #(
+ *osf5*) :
+
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="${CC} -shared"
SHLIB_LDFLAGS="$LDFLAGS"
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL=""
- ;;
- *)
+ ;; #(
+ *) :
+
# No dynamic loading.
SHLIB_CFLAGS=""
SHLIB_LD="ld"
@@ -3819,7 +3927,7 @@ fi
SHLIB_SUFFIX=""
SHLIB_EXTRACT_ALL=""
as_fn_error $? "don't know how to compile and link dynamic drivers" "$LINENO" 5
- ;;
+ ;;
esac
# If we're running gcc, then change the C flags for compiling shared
@@ -3853,7 +3961,8 @@ EI_CFLAGS="$CFLAGS"
# Add thread-safety flags if requested
# Check whether --enable-shlib-thread-safety was given.
-if test "${enable_shlib_thread_safety+set}" = set; then :
+if test ${enable_shlib_thread_safety+y}
+then :
enableval=$enable_shlib_thread_safety; case "$enableval" in
no) ;;
*) SHLIB_CFLAGS="$SHLIB_CFLAGS -D_THREAD_SAFE -D_REENTRANT"
@@ -3895,18 +4004,22 @@ SHLIB_CFLAGS="$SHLIB_CFLAGS $CFLAGS"
erl_checkBoth=0
ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
-if test "x$ac_cv_func_connect" = xyes; then :
+if test "x$ac_cv_func_connect" = xyes
+then :
erl_checkSocket=0
-else
+else $as_nop
erl_checkSocket=1
fi
-if test "$erl_checkSocket" = 1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lsocket" >&5
-$as_echo_n "checking for main in -lsocket... " >&6; }
-if ${ac_cv_lib_socket_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test "$erl_checkSocket" = 1
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lsocket" >&5
+printf %s "checking for main in -lsocket... " >&6; }
+if test ${ac_cv_lib_socket_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3914,51 +4027,60 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
int
-main ()
+main (void)
{
return main ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_socket_main=yes
-else
+else $as_nop
ac_cv_lib_socket_main=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_main" >&5
-$as_echo "$ac_cv_lib_socket_main" >&6; }
-if test "x$ac_cv_lib_socket_main" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_main" >&5
+printf "%s\n" "$ac_cv_lib_socket_main" >&6; }
+if test "x$ac_cv_lib_socket_main" = xyes
+then :
LIBS="$LIBS -lsocket"
-else
+else $as_nop
erl_checkBoth=1
fi
+
fi
-if test "$erl_checkBoth" = 1; then
+if test "$erl_checkBoth" = 1
+then :
+
tk_oldLibs=$LIBS
LIBS="$LIBS -lsocket -lnsl"
ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept"
-if test "x$ac_cv_func_accept" = xyes; then :
+if test "x$ac_cv_func_accept" = xyes
+then :
erl_checkNsl=0
-else
+else $as_nop
LIBS=$tk_oldLibs
fi
+
fi
ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
-if test "x$ac_cv_func_gethostbyname" = xyes; then :
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lnsl" >&5
-$as_echo_n "checking for main in -lnsl... " >&6; }
-if ${ac_cv_lib_nsl_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test "x$ac_cv_func_gethostbyname" = xyes
+then :
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lnsl" >&5
+printf %s "checking for main in -lnsl... " >&6; }
+if test ${ac_cv_lib_nsl_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lnsl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3966,72 +4088,63 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
int
-main ()
+main (void)
{
return main ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_nsl_main=yes
-else
+else $as_nop
ac_cv_lib_nsl_main=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_main" >&5
-$as_echo "$ac_cv_lib_nsl_main" >&6; }
-if test "x$ac_cv_lib_nsl_main" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_main" >&5
+printf "%s\n" "$ac_cv_lib_nsl_main" >&6; }
+if test "x$ac_cv_lib_nsl_main" = xyes
+then :
LIBS="$LIBS -lnsl"
fi
fi
-for ac_func in strerror
-do :
- ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror"
-if test "x$ac_cv_func_strerror" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_STRERROR 1
-_ACEOF
+ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror"
+if test "x$ac_cv_func_strerror" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h
fi
-done
-for ac_func in vsnprintf
-do :
- ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
-if test "x$ac_cv_func_vsnprintf" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_VSNPRINTF 1
-_ACEOF
+ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
+if test "x$ac_cv_func_vsnprintf" = xyes
+then :
+ printf "%s\n" "#define HAVE_VSNPRINTF 1" >>confdefs.h
fi
-done
-for ac_func in usleep
-do :
- ac_fn_c_check_func "$LINENO" "usleep" "ac_cv_func_usleep"
-if test "x$ac_cv_func_usleep" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_USLEEP 1
-_ACEOF
+ac_fn_c_check_func "$LINENO" "usleep" "ac_cv_func_usleep"
+if test "x$ac_cv_func_usleep" = xyes
+then :
+ printf "%s\n" "#define HAVE_USLEEP 1" >>confdefs.h
fi
-done
# First check if the library is available, then if we can choose between
# two versions of gethostbyname
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lresolv" >&5
-$as_echo_n "checking for main in -lresolv... " >&6; }
-if ${ac_cv_lib_resolv_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lresolv" >&5
+printf %s "checking for main in -lresolv... " >&6; }
+if test ${ac_cv_lib_resolv_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lresolv $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4039,39 +4152,40 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
int
-main ()
+main (void)
{
return main ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_resolv_main=yes
-else
+else $as_nop
ac_cv_lib_resolv_main=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_main" >&5
-$as_echo "$ac_cv_lib_resolv_main" >&6; }
-if test "x$ac_cv_lib_resolv_main" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBRESOLV 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_main" >&5
+printf "%s\n" "$ac_cv_lib_resolv_main" >&6; }
+if test "x$ac_cv_lib_resolv_main" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBRESOLV 1" >>confdefs.h
LIBS="-lresolv $LIBS"
fi
ac_cv_lib_resolv=ac_cv_lib_resolv_main
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_gethostbyname in -lresolv" >&5
-$as_echo_n "checking for res_gethostbyname in -lresolv... " >&6; }
-if ${ac_cv_lib_resolv_res_gethostbyname+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_gethostbyname in -lresolv" >&5
+printf %s "checking for res_gethostbyname in -lresolv... " >&6; }
+if test ${ac_cv_lib_resolv_res_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lresolv $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4080,31 +4194,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char res_gethostbyname ();
int
-main ()
+main (void)
{
return res_gethostbyname ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_resolv_res_gethostbyname=yes
-else
+else $as_nop
ac_cv_lib_resolv_res_gethostbyname=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_gethostbyname" >&5
-$as_echo "$ac_cv_lib_resolv_res_gethostbyname" >&6; }
-if test "x$ac_cv_lib_resolv_res_gethostbyname" = xyes; then :
- $as_echo "#define HAVE_RES_GETHOSTBYNAME 1" >>confdefs.h
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_gethostbyname" >&5
+printf "%s\n" "$ac_cv_lib_resolv_res_gethostbyname" >&6; }
+if test "x$ac_cv_lib_resolv_res_gethostbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_RES_GETHOSTBYNAME 1" >>confdefs.h
fi
@@ -4113,37 +4226,38 @@ fi
# Check for isfinite
#--------------------------------------------------------------------
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isfinite" >&5
-$as_echo_n "checking for isfinite... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for isfinite" >&5
+printf %s "checking for isfinite... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <math.h>
int
-main ()
+main (void)
{
isfinite(0);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
have_isfinite=yes
-else
+else $as_nop
have_isfinite=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
if test $have_isfinite = yes; then
- $as_echo "#define HAVE_ISFINITE 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_ISFINITE 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- $as_echo "#define HAVE_FINITE 1" >>confdefs.h
+ printf "%s\n" "#define HAVE_FINITE 1" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
#--------------------------------------------------------------------
@@ -4225,11 +4339,12 @@ for ac_prog in javac guavac gcj jikes bock
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_JAVAC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_JAVAC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$JAVAC"; then
ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test.
else
@@ -4237,11 +4352,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_JAVAC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4252,23 +4371,26 @@ fi
fi
JAVAC=$ac_cv_prog_JAVAC
if test -n "$JAVAC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
-$as_echo "$JAVAC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5
+printf "%s\n" "$JAVAC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
test -n "$JAVAC" && break
done
-if test -n "$JAVAC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for JDK version 1.5" >&5
-$as_echo_n "checking for JDK version 1.5... " >&6; }
-if ${ac_cv_prog_javac_ver_1_5+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test -n "$JAVAC"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for JDK version 1.5" >&5
+printf %s "checking for JDK version 1.5... " >&6; }
+if test ${ac_cv_prog_javac_ver_1_5+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
java_link='$JAVAC conftest.java 1>&5'
cat > conftest.java <<EOF
@@ -4279,24 +4401,30 @@ EOF
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$java_link\""; } >&5
(eval $java_link) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && test -s conftest.class; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && test -s conftest.class
+then :
+
rm -rf conftest*
ac_cv_prog_javac_ver_1_5=yes
-else
+
+else $as_nop
+
echo "configure: failed program was:" 1>&5
cat conftest.java 1>&5
echo "configure: PATH was $PATH" 1>&5
rm -rf conftest*
ac_cv_prog_javac_ver_1_5=no
+
fi
rm -f conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_javac_ver_1_5" >&5
-$as_echo "$ac_cv_prog_javac_ver_1_5" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_javac_ver_1_5" >&5
+printf "%s\n" "$ac_cv_prog_javac_ver_1_5" >&6; }
if test $ac_cv_prog_javac_ver_1_5 = no; then
unset -v JAVAC
fi
+
fi
if test -n "$JAVAC"; then
@@ -4307,11 +4435,12 @@ for ac_prog in make gmake
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_make_command+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_make_command+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$make_command"; then
ac_cv_prog_make_command="$make_command" # Let the user override the test.
else
@@ -4319,11 +4448,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_make_command="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4334,11 +4467,11 @@ fi
fi
make_command=$ac_cv_prog_make_command
if test -n "$make_command"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $make_command" >&5
-$as_echo "$make_command" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $make_command" >&5
+printf "%s\n" "$make_command" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4384,8 +4517,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -4415,15 +4548,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -4437,8 +4570,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -4491,7 +4624,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -4507,8 +4640,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -4531,14 +4664,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -4548,46 +4683,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -4596,13 +4731,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -4611,8 +4739,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -4624,30 +4756,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -4660,13 +4772,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -4693,18 +4806,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -4716,12 +4831,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -4752,7 +4868,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -4774,6 +4890,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -4787,6 +4907,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -4828,7 +4954,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -4837,7 +4963,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -4900,7 +5026,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -4949,14 +5075,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -4993,21 +5121,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -5035,7 +5163,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -5049,7 +5177,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -5074,7 +5202,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -5302,7 +5430,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -5310,17 +5438,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -5337,7 +5465,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -5361,9 +5489,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -5416,8 +5544,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -5459,9 +5587,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -5508,7 +5636,8 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
diff --git a/lib/common_test/test_server/configure.in b/lib/common_test/test_server/configure.ac
index d58b4fc51b..da5c1b1608 100644
--- a/lib/common_test/test_server/configure.in
+++ b/lib/common_test/test_server/configure.ac
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script for Erlang.
dnl
dnl %CopyrightBegin%
dnl
-dnl Copyright Ericsson AB 1997-2020. All Rights Reserved.
+dnl Copyright Ericsson AB 1997-2021. All Rights Reserved.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
@@ -19,7 +19,9 @@ dnl
dnl %CopyrightEnd%
dnl
-AC_INIT(conf_vars.in)
+AC_INIT
+AC_CONFIG_SRCDIR([conf_vars.in])
+AC_PREREQ([2.71])
AC_CANONICAL_HOST
@@ -84,7 +86,7 @@ AC_CHECK_HEADER(net/errno.h, AC_DEFINE(HAVE_NET_ERRNO_H))
AC_CHECK_HEADER(linux/tcp.h, AC_DEFINE(HAVE_LINUX_TCP_H))
AC_MSG_CHECKING(for sane linux/tcp.h)
-AC_TRY_COMPILE([#include <stdio.h>
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -94,10 +96,7 @@ AC_TRY_COMPILE([#include <stdio.h>
#include <sys/wait.h>
#include <linux/tcp.h>
#include <netinet/in.h>
- #include <netdb.h>],
- [return 0;],
- have_sane_linux_tcp_h=yes,
- have_sane_linux_tcp_h=no)
+ #include <netdb.h>]], [[return 0;]])],[have_sane_linux_tcp_h=yes],[have_sane_linux_tcp_h=no])
if test $have_sane_linux_tcp_h = yes; then
AC_DEFINE(HAVE_SANE_LINUX_TCP_H,[1],
@@ -150,8 +149,10 @@ AC_CHECK_LIB(dl, dlopen, have_dl=yes, have_dl=no)
SHLIB_LDLIBS=
fullSrcDir=`cd $srcdir; pwd`
-case $system in
- *-linux-*)
+AS_CASE([$system],
+
+ [*-linux-*],
+ [
SHLIB_CFLAGS="-fPIC"
SHLIB_SUFFIX=".so"
if test "$have_dl" = yes; then
@@ -170,8 +171,10 @@ case $system in
fi
fi
SHLIB_EXTRACT_ALL=""
- ;;
- *-openbsd*|*-netbsd*|*-freebsd*|*-dragonfly*)
+ ],
+
+ [*-openbsd*|*-netbsd*|*-freebsd*|*-dragonfly*],
+ [
# Not available on all versions: check for include file.
AC_CHECK_HEADER(dlfcn.h, [
SHLIB_CFLAGS="-fpic"
@@ -193,8 +196,10 @@ case $system in
AC_MSG_ERROR(don't know how to compile and link dynamic drivers)
])
SHLIB_EXTRACT_ALL=""
- ;;
- *-solaris2*|*-sysv4*)
+ ],
+
+ [*-solaris2*|*-sysv4*],
+ [
SHLIB_CFLAGS="-KPIC"
SHLIB_LD="/usr/ccs/bin/ld"
SHLIB_LDFLAGS="$no_mXX_LDFLAGS -G -z text"
@@ -206,15 +211,19 @@ case $system in
fi
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL="-z allextract"
- ;;
- *darwin*)
+ ],
+
+ [*darwin*],
+ [
SHLIB_CFLAGS="-fno-common"
SHLIB_LD="cc"
SHLIB_LDFLAGS="$LDFLAGS -bundle -flat_namespace -undefined suppress"
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL=""
- ;;
- *osf1*)
+ ],
+
+ [*osf1*],
+ [
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="ld"
SHLIB_LDFLAGS="$LDFLAGS -shared"
@@ -226,15 +235,18 @@ case $system in
fi
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL=""
- ;;
- *osf5*)
+ ],
+
+ [*osf5*],
+ [
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="${CC} -shared"
SHLIB_LDFLAGS="$LDFLAGS"
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL=""
- ;;
- *)
+ ],
+
+ [
# No dynamic loading.
SHLIB_CFLAGS=""
SHLIB_LD="ld"
@@ -243,8 +255,7 @@ case $system in
SHLIB_SUFFIX=""
SHLIB_EXTRACT_ALL=""
AC_MSG_ERROR(don't know how to compile and link dynamic drivers)
- ;;
-esac
+ ])
# If we're running gcc, then change the C flags for compiling shared
# libraries to the right flags for gcc, instead of those for the
@@ -317,14 +328,16 @@ AC_SUBST(EI_CFLAGS)
erl_checkBoth=0
AC_CHECK_FUNC(connect, erl_checkSocket=0, erl_checkSocket=1)
-if test "$erl_checkSocket" = 1; then
+AS_IF([test "$erl_checkSocket" = 1],
+ [
AC_CHECK_LIB(socket, main, LIBS="$LIBS -lsocket", erl_checkBoth=1)
-fi
-if test "$erl_checkBoth" = 1; then
+ ])
+AS_IF([test "$erl_checkBoth" = 1],
+ [
tk_oldLibs=$LIBS
LIBS="$LIBS -lsocket -lnsl"
AC_CHECK_FUNC(accept, erl_checkNsl=0, [LIBS=$tk_oldLibs])
-fi
+ ])
AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main, [LIBS="$LIBS -lnsl"]))
dnl Checks for library functions.
@@ -334,7 +347,8 @@ AC_CHECK_FUNCS(usleep)
# First check if the library is available, then if we can choose between
# two versions of gethostbyname
-AC_HAVE_LIBRARY(resolv)
+AC_CHECK_LIB([resolv],[main],[],[],[])ac_cv_lib_resolv=ac_cv_lib_resolv_main
+
AC_CHECK_LIB(resolv, res_gethostbyname,[AC_DEFINE(HAVE_RES_GETHOSTBYNAME,1)])
#--------------------------------------------------------------------
@@ -342,8 +356,7 @@ AC_CHECK_LIB(resolv, res_gethostbyname,[AC_DEFINE(HAVE_RES_GETHOSTBYNAME,1)])
#--------------------------------------------------------------------
AC_MSG_CHECKING([for isfinite])
-AC_TRY_LINK([#include <math.h>],
- [isfinite(0);], have_isfinite=yes, have_isfinite=no)
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <math.h>]], [[isfinite(0);]])],[have_isfinite=yes],[have_isfinite=no])
if test $have_isfinite = yes; then
AC_DEFINE(HAVE_ISFINITE,1)
@@ -438,10 +451,10 @@ SSLEAY_ROOT=$TARGET
#
dnl ERL_TRY_LINK_JAVA(CLASSES, FUNCTION-BODY
dnl [ACTION_IF_FOUND [, ACTION-IF-NOT-FOUND]])
-dnl Freely inspired by AC_TRY_LINK. (Maybe better to create a
+dnl Freely inspired by AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],[],[]). (Maybe better to create a
dnl AC_LANG_JAVA instead...)
AC_DEFUN(ERL_TRY_LINK_JAVA,
-[java_link='$JAVAC conftest.java 1>&AC_FD_CC'
+[java_link='$JAVAC conftest.java 1>&AS_MESSAGE_LOG_FD'
changequote(, )dnl
cat > conftest.java <<EOF
$1
@@ -450,21 +463,24 @@ class conftest { public static void main(String[] args) {
; return; }}
EOF
changequote([, ])dnl
-if AC_TRY_EVAL(java_link) && test -s conftest.class; then
+AS_IF([AC_TRY_EVAL(java_link) && test -s conftest.class],
+ [
ifelse([$3], , :, [rm -rf conftest*
$3])
-else
- echo "configure: failed program was:" 1>&AC_FD_CC
- cat conftest.java 1>&AC_FD_CC
- echo "configure: PATH was $PATH" 1>&AC_FD_CC
+ ],
+ [
+ echo "configure: failed program was:" 1>&AS_MESSAGE_LOG_FD
+ cat conftest.java 1>&AS_MESSAGE_LOG_FD
+ echo "configure: PATH was $PATH" 1>&AS_MESSAGE_LOG_FD
ifelse([$4], , , [ rm -rf conftest*
$4
])dnl
-fi
+ ])
rm -f conftest*])
dnl
AC_CHECK_PROGS(JAVAC, javac guavac gcj jikes bock)
-if test -n "$JAVAC"; then
+AS_IF([test -n "$JAVAC"],
+ [
dnl Make sure it's at least JDK 1.5
AC_CACHE_CHECK(for JDK version 1.5,
ac_cv_prog_javac_ver_1_5,
@@ -473,7 +489,7 @@ if test -n "$JAVAC"; then
if test $ac_cv_prog_javac_ver_1_5 = no; then
unset -v JAVAC
fi
-fi
+ ])
if test -n "$JAVAC"; then
AC_SUBST(JAVAC)
:
@@ -489,4 +505,5 @@ else
fi
AC_SUBST(test_c_compiler)
-AC_OUTPUT(conf_vars)
+AC_CONFIG_FILES([conf_vars])
+AC_OUTPUT
diff --git a/lib/common_test/test_server/ts.erl b/lib/common_test/test_server/ts.erl
index 179380a562..702d0a4f03 100644
--- a/lib/common_test/test_server/ts.erl
+++ b/lib/common_test/test_server/ts.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -33,6 +33,7 @@
estone/0, estone/1,
cross_cover_analyse/1,
compile_testcases/0, compile_testcases/1,
+ compile_datadirs/2,
help/0]).
%% Functions kept for backwards compatibility
@@ -75,9 +76,9 @@
%%% system running in a git repository/source tree.
%%% ts_make Interface to run the `make' program on Unix
%%% and other platforms.
-%%% ts_make_erl A corrected version of the standar Erlang module
+%%% ts_make_erl A corrected version of the standard Erlang module
%%% make (used for rebuilding test suites).
-%%% ts_lib Miscellanous utility functions, each used by several
+%%% ts_lib Miscellaneous utility functions, each used by several
%%% other modules.
%%% ts_benchmark Supervises otp benchmarks and collects results.
%%%----------------------------------------------------------------------
@@ -310,7 +311,7 @@ cl_run([App,Cat|Options0]) when is_atom(App) ->
false ->
Options0 -- [batch]
end,
- %% Make sure there is exactly one occurence of 'batch'
+ %% Make sure there is exactly one occurrence of 'batch'
Options2 = [batch|Options1],
Result =
@@ -871,7 +872,7 @@ run_test(File, Args, Options, Vars) ->
%% r(Mod, Case, Opts)
%% Each of these functions starts the test server if it
%% isn't already running, then runs the test case(s) selected
-%% by the aguments.
+%% by the arguments.
%% SpecOrMod can be a module name or the name of a test spec file,
%% with the extension .spec or .spec.OsType. The module Mod will
%% be reloaded before running the test cases.
@@ -1011,7 +1012,9 @@ compile_testcases([]) ->
ok.
compile_datadirs(DataDirs) ->
- {ok,Variables} = file:consult("variables"),
+ compile_datadirs("variables", DataDirs).
+compile_datadirs(VariablesFile, DataDirs) ->
+ {ok,Variables} = file:consult(VariablesFile),
lists:foreach(fun(Dir) ->
ts_lib:make_non_erlang(Dir, Variables)
diff --git a/lib/common_test/test_server/ts.hrl b/lib/common_test/test_server/ts.hrl
index 403c62d22e..7fb7b0a0a2 100644
--- a/lib/common_test/test_server/ts.hrl
+++ b/lib/common_test/test_server/ts.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -30,9 +30,7 @@
-define(cover_total,"total_cover.log").
-define(variables, "variables").
-define(cross_variables, "variables-cross").
--define(LF, [10]). % Newline in VxWorks script
--define(CHAR_PER_LINE, 60). % Characters per VxWorks script building line
-define(CROSS_COOKIE, "cross"). % cookie used when cross platform testing
-define(TS_PORT, 7887).
--define(TEST_SERVER_SCRIPT, "test_server_vx.script").
+
diff --git a/lib/common_test/test_server/ts_install.erl b/lib/common_test/test_server/ts_install.erl
index 87c2664af6..3e7a95a141 100644
--- a/lib/common_test/test_server/ts_install.erl
+++ b/lib/common_test/test_server/ts_install.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -183,7 +183,7 @@ get_xcomp_flag(Flag, Flags) ->
get_xcomp_flag(Flag, Tag, Flags) ->
case proplists:get_value(Flag,Flags) of
undefined -> "";
- "guess" -> [" --",Tag,"=",os:cmd("$ERL_TOP/erts/autoconf/config.guess")];
+ "guess" -> [" --",Tag,"=",os:cmd("$ERL_TOP/make/autoconf/config.guess")];
HostVal -> [" --",Tag,"=",HostVal]
end.
diff --git a/lib/common_test/test_server/ts_run.erl b/lib/common_test/test_server/ts_run.erl
index 702e5dea50..a1d20df69d 100644
--- a/lib/common_test/test_server/ts_run.erl
+++ b/lib/common_test/test_server/ts_run.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -255,6 +255,8 @@ make_command(Vars, Spec, State) ->
%% " -test_server_format_exception false",
" -boot start_sasl -sasl errlog_type error",
" -pz \"",Cwd,"\"",
+ %% FIXME This is too far away from where it is needed.
+ " -enable-feature maybe_expr",
" -ct_test_vars ",TestVars,
" -eval \"ts_run:ct_run_test(\\\"",TestDir,"\\\", ",
backslashify(lists:flatten(State#state.test_server_args)),")\""
diff --git a/lib/compiler/Makefile b/lib/compiler/Makefile
index 2edc743677..a7d896f258 100644
--- a/lib/compiler/Makefile
+++ b/lib/compiler/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -39,3 +39,9 @@ include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=crypto
include $(ERL_TOP)/make/app_targets.mk
+
+# Enable feature maybe_expr in runtime when running tests
+# Note: this overrides, and uses, test target in app_targets.mk
+.PHONY: test
+test:
+ $(MAKE) ERL_ARGS="-enable-feature maybe_expr $(ERL_ARGS)" -f $(ERL_TOP)/make/app_targets.mk $@
diff --git a/lib/compiler/doc/src/compile.xml b/lib/compiler/doc/src/compile.xml
index b2d9a143ab..28fc79e671 100644
--- a/lib/compiler/doc/src/compile.xml
+++ b/lib/compiler/doc/src/compile.xml
@@ -255,7 +255,7 @@ module.beam: module.erl \
<tag><c>makedep_side_effect</c></tag>
<item>
- <p>The dependecies are created as a side effect to the
+ <p>The dependencies are created as a side effect to the
normal compilation process. This means that the object
file will also be produced. This option override the
<c>makedep</c> option.
@@ -395,6 +395,14 @@ module.beam: module.erl \
<c>module_info(compile)</c> and stack traces.</p>
</item>
+ <tag><c>absolute_source</c></tag>
+ <item>
+ <p>Turns the source file name (as presented in
+ <c>module_info(compile)</c> and stack traces) into an absolute
+ path, which helps external tools like <c>perf</c> and <c>gdb</c>
+ find Erlang source code.</p>
+ </item>
+
<tag><c>{outdir,Dir}</c></tag>
<item>
<p>Sets a new directory for the object code. The current
diff --git a/lib/compiler/doc/src/notes.xml b/lib/compiler/doc/src/notes.xml
index 42319dfaed..9e5b8d4a4f 100644
--- a/lib/compiler/doc/src/notes.xml
+++ b/lib/compiler/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2021</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -1132,7 +1132,7 @@
<item>
<p>The type optimization pass of the compiler could hang
or loop for a long time when analyzing a
- <c>setelement/3</c> call with a varible position.</p>
+ <c>setelement/3</c> call with a variable position.</p>
<p>
Own Id: OTP-15828 Aux Id: ERL-948 </p>
</item>
@@ -1849,7 +1849,7 @@
<item>
<p>The compiler could issue an incorrect internal
consistency failure diagnostic for some complicated bit
- syntax maches.</p>
+ syntax matches.</p>
<p>
Own Id: OTP-14640 Aux Id: ERL-490 </p>
</item>
@@ -3590,7 +3590,7 @@
Own Id: OTP-8579</p>
</item>
<item>
- <p>The undocumented, unsupport, and deprecated function
+ <p>The undocumented, unsupported, and deprecated function
<c>lists:flat_length/1</c> has been removed.</p>
<p>
Own Id: OTP-8584</p>
@@ -3639,7 +3639,7 @@
<item>
<p>
Using complex boolean expressions in ifs could cause the
- compiler to either crash or teminate with an internal
+ compiler to either crash or terminate with an internal
error. (Thanks to Simon Cornish.)</p>
<p>
Own Id: OTP-8338</p>
@@ -3839,7 +3839,7 @@
<p>Using <c>andalso</c>/<c>orelse</c> or record access in
a <c>try</c>...<c>catch</c> could cause a compiler
crash.</p>
- <p>Som large and complex functions could require
+ <p>Some large and complex functions could require
extremely long compilation times (hours or days).</p>
<p>
Own Id: OTP-7905</p>
@@ -4739,7 +4739,7 @@
string could cause the compiler to generate dangerous
code that could cause a crash at run-time (e.g.
<c><![CDATA[R#r{a="abc",b=1}]]></c>). (Thanks to Mikael Karlsson.)</p>
- <p>Unecessary tests (such as a 'case' with two case
+ <p>Unnecessary tests (such as a 'case' with two case
branches that were identical) could cause the compiler to
crash. (Thanks to Fredrik Thulin.)</p>
<p>The validation pass of the compiler could generate an
diff --git a/lib/compiler/internal_doc/beam_ssa.md b/lib/compiler/internal_doc/beam_ssa.md
index 29ad019194..d32431ecff 100644
--- a/lib/compiler/internal_doc/beam_ssa.md
+++ b/lib/compiler/internal_doc/beam_ssa.md
@@ -1,6 +1,113 @@
Invariants on the Structure and Format of BEAM SSA
==================================================
+Exception Handling
+------------------
+
+The translation of a `try`-`catch` expression into BEAM SSA has the
+following structure:
+
+ @tag = new_try_tag `try`
+ br @tag, ^protected_block0, ^landing_pad_block
+
+ protected_block0:
+ @success0 = ... % Something that could raise an exception
+ br @success0, ^protected_block1, ^landing_pad_block
+
+ ...
+
+ protected_blockN:
+ % The end of the protected code
+ @ignored0 = kill_try_tag @tag
+ br ^after_try_catch
+
+ landing_pad_block:
+ @aggregate = landingpad try, @tag
+ @class = extract @aggregate, `0` % The error class
+ @reason = extract @aggregate, `1` % The reason
+ @stk = extract @aggregate, `2` % The stack trace
+ @ignored1 = kill_try_tag @tag
+ %% Pattern matching on @class, @reason, and @stk is done here
+ %% to send control to the appropriate catch clause
+ br ^after_try_catch
+
+ after_try_catch:
+ % Normal execution continues
+
+The following invariants must hold for the SSA:
+
+ * All code that can cause an exception in one of the protected blocks
+ must have explicit control flow edges to the landing pad block. If
+ there are no edges to the landing pad block except from the block
+ containing the `new_try_tag`, the compiler will remove the
+ redundant exception handler.
+ * The extraction of the class, reason and stack trace from the result
+ of the `landingpad` instruction must be done in that
+ order. Omitting the extraction of elements which are unused is
+ allowed.
+ * Both the landing pad block and the final protected block must end
+ with a `kill_try_tag` instruction. Trying to share the
+ `kill_try_tag` epilogue between the last protected block and the
+ landing pad is unlikely to work.
+
+The translation of an old-style `catch` expression into BEAM SSA has
+the following structure:
+
+ @tag = new_try_tag `try`
+ br @tag, ^protected_block0, ^landing_pad_block
+
+ protected_block0:
+ @success0 = ... % Something that could raise an exception
+ br @success0, ^protected_block1, ^landing_pad_block
+
+ ...
+
+ protected_blockN:
+ % The end of the protected code
+ @successful_result = .... % The result of a successful computation
+ br ^common_end_of_catch
+
+ landing_pad_block:
+ @aggregate = landingpad catch, @tag
+ @catched_val = extract @ssa_agg, `0`
+ br ^common_end_of_catch
+
+ common_end_of_catch:
+ @tmp = phi { @catched_val, ^landing_pad_block },
+ { @successful_result, ^protected_blockN }
+ @result_of_catch_expr = catch_end @tag, @tmp
+
+Just as for a `try`-`catch` expression all code that can cause an
+exception in one of the protected blocks must have explicit control
+flow edges to the landing pad block.
+
+Exception Re-issuing
+--------------------
+
+A typical user-written `try`-`catch` expression will catch a subset of
+all possible exception classes and reasons and leave unhandled
+exceptions to a handler further up the call stack. Re-issuing an
+exception is done with the `resume` instruction. The `resume` must
+come after the `kill_try_tag` instruction in the program flow. For
+example, if the [example in the Exception Handling Section](#exception-handling)
+was to only handle user `throws`, the relevant blocks would look like this:
+
+ landing_pad_block:
+ @aggregate = landingpad `try`, @tag
+ @class = extract @aggregate, `0` % The error class
+ @reason = extract @aggregate, `1` % The reason
+ @stk = extract @aggregate, `2` % The stack trace
+ @ignored1 = kill_try_tag @tag
+ @is_throw = bif:'=:=' @class, `throw`
+ br @is_throw ^first_block_of_throw_handler, ^reissue
+
+ first_block_of_throw_handler:
+ %% Handle the user-defined throw
+
+ reissue:
+ @tmp = resume @stk, @reason
+ ret @tmp
+
Function Calls
--------------
diff --git a/lib/compiler/src/Makefile b/lib/compiler/src/Makefile
index f050e134f8..d5a463b6c7 100644
--- a/lib/compiler/src/Makefile
+++ b/lib/compiler/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -58,14 +58,12 @@ MODULES = \
beam_jump \
beam_listing \
beam_opcodes \
- beam_peep \
beam_ssa \
beam_ssa_bc_size \
beam_ssa_bool \
beam_ssa_bsm \
beam_ssa_codegen \
beam_ssa_dead \
- beam_ssa_funs \
beam_ssa_lint \
beam_ssa_opt \
beam_ssa_pp \
@@ -107,6 +105,7 @@ MODULES = \
BEAM_H = $(wildcard ../priv/beam_h/*.h)
HRL_FILES= \
+ beam_asm.hrl \
beam_disasm.hrl \
beam_ssa_opt.hrl \
beam_ssa.hrl \
@@ -142,7 +141,7 @@ ERL_COMPILE_FLAGS += +inline +warn_unused_import \
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
docs:
@@ -193,25 +192,29 @@ release_docs_spec:
# Dependencies -- alphabetically, please
# ----------------------------------------------------
+$(EBIN)/beam_asm.beam: beam_asm.hrl
$(EBIN)/beam_call_types.beam: beam_types.hrl
-$(EBIN)/beam_disasm.beam: $(EGEN)/beam_opcodes.hrl beam_disasm.hrl
-$(EBIN)/beam_listing.beam: core_parse.hrl v3_kernel.hrl beam_ssa.hrl
+$(EBIN)/beam_block.beam: beam_asm.hrl
+$(EBIN)/beam_disasm.beam: $(EGEN)/beam_opcodes.hrl beam_disasm.hrl beam_asm.hrl
+$(EBIN)/beam_jump.beam: beam_asm.hrl
$(EBIN)/beam_kernel_to_ssa.beam: v3_kernel.hrl beam_ssa.hrl
+$(EBIN)/beam_listing.beam: core_parse.hrl v3_kernel.hrl beam_ssa.hrl beam_asm.hrl
$(EBIN)/beam_ssa.beam: beam_ssa.hrl
$(EBIN)/beam_ssa_bsm.beam: beam_ssa.hrl
-$(EBIN)/beam_ssa_codegen.beam: beam_ssa.hrl
+$(EBIN)/beam_ssa_bool.beam: beam_ssa.hrl
+$(EBIN)/beam_ssa_codegen.beam: beam_ssa.hrl beam_asm.hrl
$(EBIN)/beam_ssa_dead.beam: beam_ssa.hrl
-$(EBIN)/beam_ssa_funs.beam: beam_ssa.hrl
$(EBIN)/beam_ssa_lint.beam: beam_ssa.hrl
$(EBIN)/beam_ssa_opt.beam: beam_ssa.hrl
$(EBIN)/beam_ssa_pp.beam: beam_ssa.hrl
-$(EBIN)/beam_ssa_pre_codegen.beam: beam_ssa.hrl
+$(EBIN)/beam_ssa_pre_codegen.beam: beam_ssa.hrl beam_asm.hrl
$(EBIN)/beam_ssa_recv.beam: beam_ssa.hrl
$(EBIN)/beam_ssa_share.beam: beam_ssa.hrl
$(EBIN)/beam_ssa_throw.beam: beam_ssa.hrl
$(EBIN)/beam_ssa_type.beam: beam_ssa.hrl beam_types.hrl
+$(EBIN)/beam_trim.beam: beam_asm.hrl
$(EBIN)/beam_types.beam: beam_types.hrl
-$(EBIN)/beam_validator.beam: beam_types.hrl
+$(EBIN)/beam_validator.beam: beam_types.hrl beam_asm.hrl
$(EBIN)/cerl.beam: core_parse.hrl
$(EBIN)/compile.beam: core_parse.hrl ../../stdlib/include/erl_compile.hrl
$(EBIN)/core_lib.beam: core_parse.hrl
@@ -219,6 +222,7 @@ $(EBIN)/core_lint.beam: core_parse.hrl
$(EBIN)/core_parse.beam: core_parse.hrl $(EGEN)/core_parse.erl
$(EBIN)/core_pp.beam: core_parse.hrl
$(EBIN)/sys_core_alias.beam: core_parse.hrl
+$(EBIN)/sys_core_bsm.beam: core_parse.hrl
$(EBIN)/sys_core_fold.beam: core_parse.hrl
$(EBIN)/sys_core_fold_lists.beam: core_parse.hrl
$(EBIN)/sys_core_inline.beam: core_parse.hrl
diff --git a/lib/compiler/src/beam_asm.erl b/lib/compiler/src/beam_asm.erl
index e22604e57b..f69a16b484 100644
--- a/lib/compiler/src/beam_asm.erl
+++ b/lib/compiler/src/beam_asm.erl
@@ -24,15 +24,15 @@
-export([module/4]).
-export([encode/2]).
--export_type([fail/0,label/0,reg/0,reg_num/0,src/0,module_code/0,function_name/0]).
+-export_type([fail/0,label/0,src/0,module_code/0,function_name/0]).
-import(lists, [map/2,member/2,keymember/3,duplicate/2,splitwith/2]).
+
-include("beam_opcodes.hrl").
+-include("beam_asm.hrl").
%% Common types for describing operands for BEAM instructions.
--type reg_num() :: 0..1023.
--type reg() :: {'x',reg_num()} | {'y',reg_num()}.
--type src() :: reg() |
+-type src() :: beam_reg() |
{'literal',term()} |
{'atom',atom()} |
{'integer',integer()} |
@@ -64,11 +64,12 @@ module(Code, ExtraChunks, CompileInfo, CompilerOpts) ->
assemble({Mod,Exp0,Attr0,Asm0,NumLabels}, ExtraChunks, CompileInfo, CompilerOpts) ->
{1,Dict0} = beam_dict:atom(Mod, beam_dict:new()),
{0,Dict1} = beam_dict:fname(atom_to_list(Mod) ++ ".erl", Dict0),
- Dict2 = shared_fun_wrappers(CompilerOpts, Dict1),
+ {0,Dict2} = beam_dict:type(any, Dict1),
+ Dict3 = shared_fun_wrappers(CompilerOpts, Dict2),
NumFuncs = length(Asm0),
{Asm,Attr} = on_load(Asm0, Attr0),
Exp = sets:from_list(Exp0, [{version, 2}]),
- {Code,Dict} = assemble_1(Asm, Exp, Dict2, []),
+ {Code,Dict} = assemble_1(Asm, Exp, Dict3, []),
build_file(Code, Attr, Dict, NumLabels, NumFuncs,
ExtraChunks, CompileInfo, CompilerOpts).
@@ -142,9 +143,8 @@ build_file(Code, Attr, Dict, NumLabels, NumFuncs, ExtraChunks, CompileInfo, Comp
Code),
%% Create the atom table chunk.
- AtomEncoding = atom_encoding(CompilerOpts),
- {NumAtoms, AtomTab} = beam_dict:atom_table(Dict, AtomEncoding),
- AtomChunk = chunk(atom_chunk_name(AtomEncoding), <<NumAtoms:32>>, AtomTab),
+ {NumAtoms, AtomTab} = beam_dict:atom_table(Dict),
+ AtomChunk = chunk(<<"AtU8">>, <<NumAtoms:32>>, AtomTab),
%% Create the import table chunk.
@@ -191,9 +191,14 @@ build_file(Code, Attr, Dict, NumLabels, NumFuncs, ExtraChunks, CompileInfo, Comp
end,
%% Create the line chunk.
-
LineChunk = chunk(<<"Line">>, build_line_table(Dict)),
+ %% Create the type table chunk.
+ {NumTypes, TypeTab} = beam_dict:type_table(Dict),
+ TypeChunk = chunk(<<"Type">>,
+ <<?BEAM_TYPES_VERSION:32, NumTypes:32>>,
+ TypeTab),
+
%% Create the attributes and compile info chunks.
Essentials0 = [AtomChunk,CodeChunk,StringChunk,ImportChunk,
@@ -212,23 +217,16 @@ build_file(Code, Attr, Dict, NumLabels, NumFuncs, ExtraChunks, CompileInfo, Comp
%% Create IFF chunk.
Chunks = case member(slim, CompilerOpts) of
- true ->
- [Essentials,AttrChunk];
- false ->
- [Essentials,LocChunk,AttrChunk,
- CompileChunk,CheckedChunks,LineChunk]
- end,
+ true when NumTypes > 0 ->
+ [Essentials,AttrChunk,TypeChunk];
+ true when NumTypes =:= 0 ->
+ [Essentials,AttrChunk];
+ false ->
+ [Essentials,LocChunk,AttrChunk,
+ CompileChunk,CheckedChunks,LineChunk,TypeChunk]
+ end,
build_form(<<"BEAM">>, Chunks).
-atom_encoding(Opts) ->
- case proplists:get_bool(no_utf8_atoms, Opts) of
- false -> utf8;
- true -> latin1
- end.
-
-atom_chunk_name(utf8) -> <<"AtU8">>;
-atom_chunk_name(latin1) -> <<"Atom">>.
-
%% finalize_fun_table(Essentials, MD5) -> FinalizedEssentials
%% Update the 'old_uniq' field in the entry for each fun in the
%% 'FunT' chunk. We'll use part of the MD5 for the module as a
@@ -391,6 +389,12 @@ make_op({make_fun3,{f,Lbl},_Index,_OldUniq,Dst,{list,Env}}, Dict0) ->
NumFree = length(Env),
{Fun,Dict} = beam_dict:lambda(Lbl, NumFree, Dict0),
make_op({make_fun3,Fun,Dst,{list,Env}}, Dict);
+make_op({call_fun2,{f,Lbl},Arity,Func}, Dict0) ->
+ %% call_fun with known target, fill in the fun entry.
+ #tr{t=#t_fun{target={_Name, TotalArity}}} = Func, %Assertion.
+ NumFree = TotalArity - Arity,
+ {Lambda,Dict} = beam_dict:lambda(Lbl, NumFree, Dict0),
+ make_op({call_fun2,Lambda,Arity,Func}, Dict);
make_op({kill,Y}, Dict) ->
make_op({init,Y}, Dict);
make_op({Name,Arg1}, Dict) ->
@@ -401,14 +405,9 @@ make_op({Name,Arg1,Arg2,Arg3}, Dict) ->
encode_op(Name, [Arg1,Arg2,Arg3], Dict);
make_op({Name,Arg1,Arg2,Arg3,Arg4}, Dict) ->
encode_op(Name, [Arg1,Arg2,Arg3,Arg4], Dict);
-make_op({Name,Arg1,Arg2,Arg3,Arg4,Arg5}, Dict) ->
- encode_op(Name, [Arg1,Arg2,Arg3,Arg4,Arg5], Dict);
-make_op({Name,Arg1,Arg2,Arg3,Arg4,Arg5,Arg6}, Dict) ->
- encode_op(Name, [Arg1,Arg2,Arg3,Arg4,Arg5,Arg6], Dict);
-%% make_op({Name,Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7}, Dict) ->
-%% encode_op(Name, [Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7], Dict);
-make_op({Name,Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8}, Dict) ->
- encode_op(Name, [Arg1,Arg2,Arg3,Arg4,Arg5,Arg6,Arg7,Arg8], Dict);
+make_op(Instr, Dict) when tuple_size(Instr) >= 6 ->
+ [Name|Args] = tuple_to_list(Instr),
+ encode_op(Name, Args, Dict);
make_op(Op, Dict) when is_atom(Op) ->
encode_op(Op, [], Dict).
@@ -422,6 +421,23 @@ encode_op_1([A0|As], Dict0, Acc) ->
encode_op_1(As, Dict, [Acc,A]);
encode_op_1([], Dict, Acc) -> {Acc,Dict}.
+encode_arg(#tr{r={x, X},t=Type}, Dict0) when is_integer(X), X >= 0 ->
+ %% Gracefully prevent this module from being loaded in OTP 24 and below by
+ %% forcing an opcode it doesn't understand. It would of course fail to load
+ %% without this, but the error message wouldn't be very helpful.
+ Canary = beam_opcodes:opcode(call_fun2, 3),
+ {Index, Dict} = beam_dict:type(Type, beam_dict:opcode(Canary, Dict0)),
+ Data = [encode(?tag_z, 5),
+ encode(?tag_x, X),
+ encode(?tag_u, Index)],
+ {Data, Dict};
+encode_arg(#tr{r={y, Y},t=Type}, Dict0) when is_integer(Y), Y >= 0 ->
+ Canary = beam_opcodes:opcode(call_fun2, 3),
+ {Index, Dict} = beam_dict:type(Type, beam_dict:opcode(Canary, Dict0)),
+ Data = [encode(?tag_z, 5),
+ encode(?tag_y, Y),
+ encode(?tag_u, Index)],
+ {Data, Dict};
encode_arg({x, X}, Dict) when is_integer(X), X >= 0 ->
{encode(?tag_x, X), Dict};
encode_arg({y, Y}, Dict) when is_integer(Y), Y >= 0 ->
diff --git a/lib/compiler/src/beam_asm.hrl b/lib/compiler/src/beam_asm.hrl
new file mode 100644
index 0000000000..5e557bbe74
--- /dev/null
+++ b/lib/compiler/src/beam_asm.hrl
@@ -0,0 +1,44 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2021. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-include("beam_types.hrl").
+
+-type reg_num() :: 0 .. 1023.
+
+-type xreg() :: {'x', reg_num()}.
+-type yreg() :: {'y', reg_num()}.
+-type freg() :: {'fr', reg_num()}.
+-type zreg() :: {'z', reg_num()}.
+
+-type beam_reg() :: xreg() | yreg() | freg().
+
+-type beam_literal() :: {atom, [] | atom()} |
+ {float, [] | float()} |
+ {integer, [] | integer()} |
+ {literal, term()} |
+ nil.
+
+%% Type-tagged beam register. Assembly passes that care about registers (e.g.
+%% beam_trim) must be prepared to handle these whenever they inspect a
+%% register.
+%%
+%% To aid in the above, the validator will explode upon encountering them in an
+%% unfamiliar context.
+-record(tr, {r :: beam_reg(), t :: type()}).
diff --git a/lib/compiler/src/beam_block.erl b/lib/compiler/src/beam_block.erl
index a38fb51b96..b2d0cd84a0 100644
--- a/lib/compiler/src/beam_block.erl
+++ b/lib/compiler/src/beam_block.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,8 +21,11 @@
-module(beam_block).
+-include("beam_asm.hrl").
+
-export([module/2]).
--import(lists, [keysort/2,reverse/1,reverse/2,splitwith/2]).
+-import(lists, [keysort/2,member/2,reverse/1,reverse/2,
+ splitwith/2,usort/1]).
-spec module(beam_utils:module_code(), [compile:option()]) ->
{'ok',beam_utils:module_code()}.
@@ -35,7 +38,8 @@ function({function,Name,Arity,CLabel,Is0}) ->
try
Is1 = swap_opt(Is0),
Is2 = blockify(Is1),
- Is = embed_lines(Is2),
+ Is3 = embed_lines(Is2),
+ Is = opt_maps(Is3),
{function,Name,Arity,CLabel,Is}
catch
Class:Error:Stack ->
@@ -152,8 +156,6 @@ collect({bif,N,{f,0},As,D}) -> {set,[D],As,{bif,N,{f,0}}};
collect({gc_bif,N,{f,0},R,As,D}) -> {set,[D],As,{alloc,R,{gc_bif,N,{f,0}}}};
collect({move,S,D}) -> {set,[D],[S],move};
collect({put_list,S1,S2,D}) -> {set,[D],[S1,S2],put_list};
-collect({put_tuple,A,D}) -> {set,[D],[],{put_tuple,A}};
-collect({put,S}) -> {set,[],[S],put};
collect({put_tuple2,D,{list,Els}}) -> {set,[D],Els,put_tuple2};
collect({get_tuple_element,S,I,D}) -> {set,[D],[S],{get_tuple_element,I}};
collect({set_tuple_element,S,D,I}) -> {set,[],[S,D],{set_tuple_element,I}};
@@ -216,3 +218,70 @@ sort_on_yreg([{set,[Dst],[Src],move}|_]=Moves) ->
{{x,_},{y,_}} ->
keysort(3, Moves)
end.
+
+%%%
+%%% Coalesce adjacent get_map_elements and has_map_fields instructions.
+%%%
+
+opt_maps(Is) ->
+ opt_maps(Is, []).
+
+opt_maps([{get_map_elements,Fail,Src,List}=I|Is], Acc0) ->
+ case simplify_get_map_elements(Fail, Src, List, Acc0) of
+ {ok,Acc} ->
+ opt_maps(Is, Acc);
+ error ->
+ opt_maps(Is, [I|Acc0])
+ end;
+opt_maps([{test,has_map_fields,Fail,Ops}=I|Is], Acc0) ->
+ case simplify_has_map_fields(Fail, Ops, Acc0) of
+ {ok,Acc} ->
+ opt_maps(Is, Acc);
+ error ->
+ opt_maps(Is, [I|Acc0])
+ end;
+opt_maps([I|Is], Acc) ->
+ opt_maps(Is, [I|Acc]);
+opt_maps([], Acc) -> reverse(Acc).
+
+simplify_get_map_elements(Fail, Src, {list,[Key,Dst]},
+ [{get_map_elements,Fail,Src,{list,List1}}|Acc]) ->
+ case are_keys_literals([Key]) andalso are_keys_literals(List1) andalso
+ not is_reg_overwritten(Src, List1) andalso
+ not is_reg_overwritten(Dst, List1) of
+ true ->
+ case member(Key, List1) of
+ true ->
+ %% The key is already in the other list. That is
+ %% very unusual, because there are optimizations to get
+ %% rid of duplicate keys. Therefore, don't try to
+ %% do anything smart here; just keep the
+ %% get_map_elements instructions separate.
+ error;
+ false ->
+ List = [Key,Dst|List1],
+ {ok,[{get_map_elements,Fail,Src,{list,List}}|Acc]}
+ end;
+ false ->
+ error
+ end;
+simplify_get_map_elements(_, _, _, _) -> error.
+
+simplify_has_map_fields(Fail, [Src|Keys0],
+ [{test,has_map_fields,Fail,[Src|Keys1]}|Acc]) ->
+ case are_keys_literals(Keys0) andalso are_keys_literals(Keys1) of
+ true ->
+ Keys = usort(Keys0 ++ Keys1),
+ {ok,[{test,has_map_fields,Fail,[Src|Keys]}|Acc]};
+ false ->
+ error
+ end;
+simplify_has_map_fields(_, _, _) -> error.
+
+are_keys_literals([#tr{}|_]) -> false;
+are_keys_literals([{x,_}|_]) -> false;
+are_keys_literals([{y,_}|_]) -> false;
+are_keys_literals([_|_]) -> true.
+
+is_reg_overwritten(Src, [_Key,Src]) -> true;
+is_reg_overwritten(_, _) -> false.
diff --git a/lib/compiler/src/beam_call_types.erl b/lib/compiler/src/beam_call_types.erl
index 57739f43a0..d8c78722ce 100644
--- a/lib/compiler/src/beam_call_types.erl
+++ b/lib/compiler/src/beam_call_types.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2019-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2019-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
-import(lists, [duplicate/2,foldl/3]).
--export([will_succeed/3, types/3]).
+-export([will_succeed/3, types/3, arith_type/2]).
%%
%% Returns whether a call will succeed or not.
@@ -38,31 +38,43 @@
Mod :: atom(),
Func :: atom(),
ArgTypes :: [normal_type()],
- Result :: yes | no | maybe.
-
+ Result :: 'yes' | 'no' | 'maybe'.
+
+will_succeed(erlang, Op, [LHS, RHS])
+ when Op =:= '+'; Op =:= '-'; Op =:= '*' ->
+ succeeds_if_smallish(LHS, RHS);
+will_succeed(erlang, Op, [#t_integer{elements={_,_}},
+ #t_integer{elements={Div,_}}])
+ when (Op =:= 'div' orelse Op =:= 'rem'), Div > 0 ->
+ yes;
+will_succeed(erlang, 'bsr', [#t_integer{elements={_,_}},
+ #t_integer{elements={S,_}}])
+ when S >= 0 ->
+ yes;
+will_succeed(erlang, 'bsl', [#t_integer{}=LHS,#t_integer{elements={S,_}}])
+ when S < 64 ->
+ succeeds_if_smallish(LHS);
will_succeed(erlang, '++', [LHS, _RHS]) ->
succeeds_if_type(LHS, proper_list());
-will_succeed(erlang, '--', [LHS, RHS]) ->
- case {succeeds_if_type(LHS, proper_list()),
- succeeds_if_type(RHS, proper_list())} of
- {yes, yes} -> yes;
- {no, _} -> no;
- {_, no} -> no;
- {_, _} -> maybe
- end;
-will_succeed(erlang, BoolOp, [LHS, RHS]) when BoolOp =:= 'and';
- BoolOp =:= 'or' ->
- case {succeeds_if_type(LHS, beam_types:make_boolean()),
- succeeds_if_type(RHS, beam_types:make_boolean())} of
- {yes, yes} -> yes;
- {no, _} -> no;
- {_, no} -> no;
- {_, _} -> maybe
- end;
+will_succeed(erlang, '--', [_, _] = Args) ->
+ succeeds_if_types(Args, proper_list());
+will_succeed(erlang, BoolOp, [_, _] = Args) when BoolOp =:= 'and';
+ BoolOp =:= 'or' ->
+ succeeds_if_types(Args, beam_types:make_boolean());
+will_succeed(erlang, Op, [_, _] = Args) when Op =:= 'band'; Op =:= 'bor'; Op =:= 'bxor' ->
+ succeeds_if_types(Args, #t_integer{});
will_succeed(erlang, bit_size, [Arg]) ->
succeeds_if_type(Arg, #t_bitstring{});
will_succeed(erlang, byte_size, [Arg]) ->
succeeds_if_type(Arg, #t_bitstring{});
+will_succeed(erlang, element, [Pos, #t_tuple{size=Sz}] = Args) when Sz > 0 ->
+ SizeType = #t_integer{elements={1,Sz}},
+ case beam_types:meet(Pos, SizeType) of
+ Pos ->
+ yes;
+ _ ->
+ fails_on_conflict(Args, [#t_integer{}, #t_tuple{}])
+ end;
will_succeed(erlang, hd, [Arg]) ->
succeeds_if_type(Arg, #t_cons{});
will_succeed(erlang, is_function, [_,#t_integer{elements={Min,_}}])
@@ -78,10 +90,15 @@ will_succeed(erlang, 'not', [Arg]) ->
succeeds_if_type(Arg, beam_types:make_boolean());
will_succeed(erlang, setelement, [#t_integer{elements={Min,Max}},
#t_tuple{exact=Exact,size=Size}, _]) ->
- case Min >= 1 andalso Max =< Size of
- true -> yes;
- false when Exact -> no;
- false -> maybe
+ if
+ 1 =< Min, Max =< Size ->
+ %% The index is always in range.
+ yes;
+ Max < 1; Exact, Size < Min ->
+ %% The index is always out of range.
+ no;
+ true ->
+ 'maybe'
end;
will_succeed(erlang, size, [Arg]) ->
ArgType = beam_types:join(#t_tuple{}, #t_bitstring{}),
@@ -90,6 +107,12 @@ will_succeed(erlang, tuple_size, [Arg]) ->
succeeds_if_type(Arg, #t_tuple{});
will_succeed(erlang, tl, [Arg]) ->
succeeds_if_type(Arg, #t_cons{});
+will_succeed(erlang, raise, [Class, _Reason, nil]) ->
+ case beam_types:meet(Class, #t_atom{elements=[error,exit,throw]}) of
+ Class -> no;
+ none -> yes;
+ _ -> 'maybe'
+ end;
will_succeed(Mod, Func, Args) ->
Arity = length(Args),
case erl_bifs:is_safe(Mod, Func, Arity) of
@@ -117,16 +140,47 @@ fails_on_conflict([ArgType | Args], [Required | Types]) ->
_ -> fails_on_conflict(Args, Types)
end;
fails_on_conflict([], []) ->
- maybe.
+ 'maybe'.
+
+succeeds_if_types([LHS, RHS], Required) ->
+ case {succeeds_if_type(LHS, Required),
+ succeeds_if_type(RHS, Required)} of
+ {yes, yes} -> yes;
+ {no, _} -> no;
+ {_, no} -> no;
+ {_, _} -> 'maybe'
+ end.
succeeds_if_type(ArgType, Required) ->
case beam_types:meet(ArgType, Required) of
ArgType -> yes;
none -> no;
- _ -> maybe
+ _ -> 'maybe'
+ end.
+
+succeeds_if_smallish(#t_integer{elements={Min,Max}})
+ when abs(Min) bsr 128 =:= 0, abs(Max) bsr 128 =:= 0 ->
+ yes;
+succeeds_if_smallish(_) ->
+ 'maybe'.
+
+succeeds_if_smallish(LHS, RHS) ->
+ case {succeeds_if_smallish(LHS),
+ succeeds_if_smallish(RHS)} of
+ {yes, yes} -> yes;
+ {_, _} -> 'maybe'
end.
%%
+%% Define an upper limit for functions that return sizes of data
+%% structures. The chosen value is about half the maxium size of a
+%% smallnum. That means that adding a small constant to it will result
+%% in a smallnum, but still the value is still sufficiently high to
+%% make it impossible to reach in the foreseeable future.
+%%
+-define(SIZE_UPPER_LIMIT, ((1 bsl 58) - 1)).
+
+%%
%% Returns the inferred return and argument types for known functions, and
%% whether it's safe to subtract argument types on failure.
%%
@@ -147,13 +201,18 @@ succeeds_if_type(ArgType, Required) ->
%% Note that these are all from the erlang module; suitable functions in other
%% modules could fail due to the module not being loaded.
types(erlang, 'map_size', [_]) ->
- sub_safe(#t_integer{}, [#t_map{}]);
-types(erlang, 'tuple_size', [_]) ->
- sub_safe(#t_integer{}, [#t_tuple{}]);
+ sub_safe(#t_integer{elements={0,?SIZE_UPPER_LIMIT}}, [#t_map{}]);
+types(erlang, 'tuple_size', [Src]) ->
+ Min = case Src of
+ #t_tuple{size=Sz} -> Sz;
+ _ -> 0
+ end,
+ Max = (1 bsl 24) - 1, %Documented max size of a tuple.
+ sub_safe(#t_integer{elements={Min,Max}}, [#t_tuple{}]);
types(erlang, 'bit_size', [_]) ->
- sub_safe(#t_integer{}, [#t_bitstring{}]);
+ sub_safe(#t_integer{elements={0,?SIZE_UPPER_LIMIT}}, [#t_bitstring{}]);
types(erlang, 'byte_size', [_]) ->
- sub_safe(#t_integer{}, [#t_bitstring{}]);
+ sub_safe(#t_integer{elements={0,?SIZE_UPPER_LIMIT}}, [#t_bitstring{}]);
types(erlang, hd, [Src]) ->
RetType = erlang_hd_type(Src),
sub_safe(RetType, [#t_cons{}]);
@@ -163,8 +222,12 @@ types(erlang, tl, [Src]) ->
types(erlang, 'not', [_]) ->
Bool = beam_types:make_boolean(),
sub_safe(Bool, [Bool]);
-types(erlang, 'length', [_]) ->
- sub_safe(#t_integer{}, [proper_list()]);
+types(erlang, 'length', [Src]) ->
+ Min = case Src of
+ #t_cons{} -> 1;
+ _ -> 0
+ end,
+ sub_safe(#t_integer{elements={Min,?SIZE_UPPER_LIMIT}}, [proper_list()]);
%% Boolean ops
types(erlang, 'and', [_,_]) ->
@@ -180,14 +243,21 @@ types(erlang, 'xor', [_,_]) ->
%% Bitwise ops
types(erlang, 'band', [_,_]=Args) ->
sub_unsafe(erlang_band_type(Args), [#t_integer{}, #t_integer{}]);
-types(erlang, 'bor', [_,_]) ->
- sub_unsafe(#t_integer{}, [#t_integer{}, #t_integer{}]);
+types(erlang, 'bor', [_,_]=Args) ->
+ sub_unsafe(erlang_bor_type(Args), [#t_integer{}, #t_integer{}]);
types(erlang, 'bxor', [_,_]) ->
sub_unsafe(#t_integer{}, [#t_integer{}, #t_integer{}]);
types(erlang, 'bsl', [_,_]) ->
sub_unsafe(#t_integer{}, [#t_integer{}, #t_integer{}]);
-types(erlang, 'bsr', [_,_]) ->
- sub_unsafe(#t_integer{}, [#t_integer{}, #t_integer{}]);
+types(erlang, 'bsr', [_,_]=Types) ->
+ ArgTypes = [#t_integer{}, #t_integer{}],
+ case Types of
+ [#t_integer{elements={Min,Max}},#t_integer{elements={S,S}}] when S > 0 ->
+ T = #t_integer{elements={Min bsr S,Max bsr S}},
+ sub_unsafe(T, ArgTypes);
+ _ ->
+ sub_unsafe(#t_integer{}, ArgTypes)
+ end;
types(erlang, 'bnot', [_]) ->
sub_unsafe(#t_integer{}, [#t_integer{}]);
@@ -204,10 +274,12 @@ types(erlang, 'trunc', [_]) ->
sub_unsafe(#t_integer{}, [number]);
types(erlang, '/', [_,_]) ->
sub_unsafe(#t_float{}, [number, number]);
-types(erlang, 'div', [_,_]) ->
- sub_unsafe(#t_integer{}, [#t_integer{}, #t_integer{}]);
-types(erlang, 'rem', [_,_]) ->
- sub_unsafe(#t_integer{}, [#t_integer{}, #t_integer{}]);
+types(erlang, 'div', [_,_]=Args) ->
+ ArgTypes = [#t_integer{}, #t_integer{}],
+ sub_unsafe(erlang_div_type(Args), ArgTypes);
+types(erlang, 'rem', Args) ->
+ ArgTypes = [#t_integer{}, #t_integer{}],
+ sub_unsafe(erlang_rem_type(Args), ArgTypes);
%% Mixed-type arithmetic; '+'/2 and friends are handled in the catch-all
%% clause for the 'erlang' module.
@@ -228,6 +300,11 @@ types(erlang, 'iolist_to_binary', [_]) ->
%% Arg is an iodata(), despite its name.
ArgType = beam_types:join(#t_list{}, #t_bitstring{size_unit=8}),
sub_unsafe(#t_bitstring{size_unit=8}, [ArgType]);
+types(erlang, 'iolist_size', [_]) ->
+ %% Arg is an iodata(), despite its name. The size is NOT limited
+ %% by the size of memory.
+ ArgType = beam_types:join(#t_list{}, #t_bitstring{size_unit=8}),
+ sub_unsafe(#t_integer{}, [ArgType]);
types(erlang, 'list_to_binary', [_]) ->
%% Arg is an iolist(), despite its name.
sub_unsafe(#t_bitstring{size_unit=8}, [#t_list{}]);
@@ -235,6 +312,35 @@ types(erlang, 'list_to_bitstring', [_]) ->
%% As list_to_binary but with bitstrings rather than binaries.
sub_unsafe(#t_bitstring{}, [proper_list()]);
+%% Process operations
+types(erlang, alias, [_]) ->
+ sub_unsafe(reference, [any]);
+types(erlang, alias, [_, _]) ->
+ sub_unsafe(reference, [any, proper_list()]);
+types(erlang, monitor, [_, _]) ->
+ sub_unsafe(reference, [any, any]);
+types(erlang, monitor, [_, _, _]) ->
+ sub_unsafe(reference, [any, any, proper_list()]);
+types(erlang, 'spawn', [_]) ->
+ sub_unsafe(pid, [#t_fun{arity=0}]);
+types(erlang, 'spawn', [_, _]) ->
+ sub_unsafe(pid, [#t_atom{}, #t_fun{arity=0}]);
+types(erlang, 'spawn', [_, _, _]) ->
+ sub_unsafe(pid, [#t_atom{}, #t_atom{}, proper_list()]);
+types(erlang, 'spawn_link', Args) ->
+ types(erlang, 'spawn', Args);
+types(erlang, 'spawn_monitor', [_]) ->
+ RetType = make_two_tuple(pid, reference),
+ sub_unsafe(RetType, [#t_fun{arity=0}]);
+types(erlang, 'spawn_monitor', [_, _]) ->
+ RetType = make_two_tuple(pid, reference),
+ sub_unsafe(RetType, [#t_atom{}, #t_fun{arity=0}]);
+types(erlang, 'spawn_monitor', [_, _, _]) ->
+ RetType = make_two_tuple(pid, reference),
+ sub_unsafe(RetType, [#t_atom{}, #t_atom{}, proper_list()]);
+types(erlang, 'spawn_request', [_ | _]=Args) when length(Args) =< 5 ->
+ sub_unsafe(reference, [any || _ <- Args]);
+
%% Misc ops.
types(erlang, 'binary_part', [_, _]) ->
PosLen = make_two_tuple(#t_integer{}, #t_integer{}),
@@ -249,6 +355,8 @@ types(erlang, 'is_map_key', [Key, Map]) ->
_ -> beam_types:make_boolean()
end,
sub_unsafe(RetType, [any, #t_map{}]);
+types(erlang, make_ref, []) ->
+ sub_unsafe(reference, []);
types(erlang, 'map_get', [Key, Map]) ->
RetType = erlang_map_get_type(Key, Map),
sub_unsafe(RetType, [any, #t_map{}]);
@@ -320,7 +428,8 @@ types(erlang, setelement, [PosType, TupleType, ArgType]) ->
types(erlang, make_fun, [_,_,Arity0]) ->
Type = case Arity0 of
- #t_integer{elements={Arity,Arity}} when Arity >= 0 ->
+ #t_integer{elements={Arity,Arity}}
+ when Arity >= 0, Arity =< ?MAX_FUNC_ARGS ->
#t_fun{arity=Arity};
_ ->
#t_fun{}
@@ -567,8 +676,11 @@ types(maps, fold, [Fun, Init, _Map]) ->
end,
sub_unsafe(RetType, [#t_fun{arity=3}, any, #t_map{}]);
types(maps, from_keys, [Keys, Value]) ->
- RetType = #t_map{super_key=erlang_hd_type(Keys),
- super_value=Value},
+ KeyType = erlang_hd_type(Keys),
+ RetType = case KeyType of
+ none -> #t_map{super_key=none,super_value=none};
+ _ -> #t_map{super_key=KeyType,super_value=Value}
+ end,
sub_unsafe(RetType, [proper_list(), any]);
types(maps, from_list, [Pairs]) ->
PairType = erlang_hd_type(Pairs),
@@ -577,6 +689,8 @@ types(maps, from_list, [Pairs]) ->
SKey = beam_types:get_tuple_element(1, Es),
SValue = beam_types:get_tuple_element(2, Es),
#t_map{super_key=SKey,super_value=SValue};
+ none ->
+ #t_map{super_key=none,super_value=none};
_ ->
#t_map{}
end,
@@ -670,14 +784,16 @@ types(maps, values, [Map]) ->
end,
sub_unsafe(RetType, [#t_map{}]);
types(maps, with, [Keys, Map]) ->
- RetType = case Map of
- #t_map{super_key=SKey0} ->
+ RetType = case {erlang_hd_type(Keys), Map} of
+ {none, _} ->
+ #t_map{super_key=none,super_value=none};
+ {KeysType, #t_map{super_key=SKey0}} ->
%% Since we know that the Map will only contain the pairs
%% pointed out by Keys, we can restrict the types to
%% those in the list.
- SKey = beam_types:meet(erlang_hd_type(Keys), SKey0),
+ SKey = beam_types:meet(KeysType, SKey0),
Map#t_map{super_key=SKey};
- _ ->
+ {_, _} ->
#t_map{}
end,
sub_unsafe(RetType, [proper_list(), #t_map{}]);
@@ -690,6 +806,50 @@ types(maps, without, [Keys, Map]) ->
types(_, _, Args) ->
sub_unsafe(any, [any || _ <- Args]).
+
+-spec arith_type(Op, ArgTypes) -> RetType when
+ Op :: beam_ssa:op(),
+ ArgTypes :: [normal_type()],
+ RetType :: type().
+
+arith_type({bif,'+'}, [#t_integer{elements={Min1,Max1}},
+ #t_integer{elements={Min2,Max2}}]) ->
+ check_range(#t_integer{elements={Min1+Min2,Max1+Max2}});
+arith_type({bif,'-'}, [#t_integer{elements={Min1,Max1}},
+ #t_integer{elements={Min2,Max2}}]) ->
+ check_range(#t_integer{elements={Min1-Max2,Max1-Min2}});
+arith_type({bif,'*'}, [#t_integer{elements={Min1,Max1}},
+ #t_integer{elements={Min2,Max2}}])
+ when (abs(Max1) + abs(Max2)) bsr 128 =:= 0 ->
+ All = [A * B || A <- [Min1,Max1], B <- [Min2,Max2]],
+ Min = lists:min(All),
+ Max = lists:max(All),
+ check_range(#t_integer{elements={Min,Max}});
+arith_type({bif,'div'}, ArgTypes) ->
+ erlang_div_type(ArgTypes);
+arith_type({bif,'rem'}, ArgTypes) ->
+ erlang_rem_type(ArgTypes);
+arith_type({bif,'band'}, ArgTypes) ->
+ erlang_band_type(ArgTypes);
+arith_type({bif,'bor'}, Args) ->
+ erlang_bor_type(Args);
+arith_type({bif,'bsr'}, [#t_integer{elements={Min0,Max0}},
+ #t_integer{elements={S1,S2}}])
+ when 0 < S1 ->
+ Min = min(Min0 bsr S1, Min0 bsr S2),
+ Max = max(Max0 bsr S1, Max0 bsr S2),
+ check_range(#t_integer{elements={Min,Max}});
+arith_type({bif,'bsl'}, [#t_integer{elements={Min0,Max0}},
+ #t_integer{elements={S1,S2}}])
+ when 0 < S1, S2 < 128, abs(Max0) bsr 128 =:= 0 ->
+ Min = min(Min0 bsl S1, Min0 bsl S2),
+ Max = max(Max0 bsl S1, Max0 bsl S2),
+ check_range(#t_integer{elements={Min,Max}});
+arith_type(_Op, _Args) ->
+ any.
+
+check_range(#t_integer{elements={Min,Max}}=T) when Min =< Max -> T.
+
%%
%% Function-specific helpers.
%%
@@ -712,12 +872,14 @@ mixed_arith_types([FirstType | _]=Args0) ->
erlang_hd_type(Src) ->
case beam_types:meet(Src, #t_cons{}) of
#t_cons{type=Type} -> Type;
+ none -> none;
_ -> any
end.
erlang_tl_type(Src) ->
case beam_types:meet(Src, #t_cons{}) of
#t_cons{terminator=Term}=Cons -> beam_types:join(Cons, Term);
+ none -> none;
_ -> any
end.
@@ -737,13 +899,12 @@ erlang_band_type_1(LHS, Int) ->
Max = max(Min, min(Max0, Union band Int)),
#t_integer{elements={Min,Max}};
- #t_integer{} when Int >= 0 ->
+ _ when Int > 0 ->
%% The range is either unknown or too wide, conservatively assume
- %% that the new range is 0 .. Int.
- %%
- %% NOTE: We must not produce a singleton type unless we are sure
- %% that the operation can't fail. Therefore, we only do this
- %% inference if LHS is known to be an integer.
+ %% that the new range is 0 .. Int. Note that since Int > 0, we
+ %% will never produce a singleton value. Producing a singleton value
+ %% is probably harmless, but will produce worse code when it
+ %% is not known that the operation will succeed.
beam_types:meet(LHS, #t_integer{elements={0,Int}});
_ ->
%% We can't infer boundaries when LHS is not an integer or
@@ -754,6 +915,47 @@ erlang_band_type_1(LHS, Int) ->
beam_types:meet(LHS, #t_integer{})
end.
+erlang_bor_type([#t_integer{elements={Int,Int}}, RHS]) when is_integer(Int) ->
+ erlang_bor_type_1(RHS, Int);
+erlang_bor_type([LHS, #t_integer{elements={Int,Int}}]) when is_integer(Int) ->
+ erlang_bor_type_1(LHS, Int);
+erlang_bor_type(_) ->
+ #t_integer{}.
+
+erlang_bor_type_1(LHS, Int) ->
+ case LHS of
+ #t_integer{elements={Min0,Max0}} when Min0 >= 0, Max0 - Min0 < 1 bsl 256 ->
+ {_Intersection, Union} = range_masks(Min0, Max0),
+
+ Min = max(Min0, Int),
+ Max = Union bor Int,
+
+ #t_integer{elements={Min,Max}};
+ _ ->
+ beam_types:meet(LHS, #t_integer{})
+ end.
+
+erlang_div_type(ArgTypes) ->
+ case ArgTypes of
+ [#t_integer{elements={Min,Max}},#t_integer{elements={D,D}}] when D > 0 ->
+ #t_integer{elements={Min div D,Max div D}};
+ _ ->
+ #t_integer{}
+ end.
+
+erlang_rem_type([T1,T2]) ->
+ case T2 of
+ #t_integer{elements={D,D}} when D > 0 ->
+ Max = abs(D) - 1,
+ Min = case T1 of
+ #t_integer{elements={N,_}} when N >= 0 -> 0;
+ _ -> -Max
+ end,
+ #t_integer{elements={Min,Max}};
+ _ ->
+ #t_integer{}
+ end.
+
erlang_map_get_type(Key, Map) ->
case Map of
#t_map{super_key=SKey,super_value=SValue} ->
diff --git a/lib/compiler/src/beam_clean.erl b/lib/compiler/src/beam_clean.erl
index 0a4db000ae..76d86d116c 100644
--- a/lib/compiler/src/beam_clean.erl
+++ b/lib/compiler/src/beam_clean.erl
@@ -22,7 +22,6 @@
-module(beam_clean).
-export([module/2]).
--export([clean_labels/1]).
-spec module(beam_utils:module_code(), [compile:option()]) ->
{'ok',beam_utils:module_code()}.
@@ -35,7 +34,8 @@ module({Mod,Exp,Attr,Fs0,_}, Opts) ->
Fs1 = remove_unused(Order, Used, All),
{Fs2,Lc} = clean_labels(Fs1),
Fs3 = fix_swap(Fs2, Opts),
- Fs = maybe_remove_lines(Fs3, Opts),
+ Fs4 = fix_bs_create_bin(Fs3, Opts),
+ Fs = maybe_remove_lines(Fs4, Opts),
{ok,{Mod,Exp,Attr,Fs,Lc}}.
%% Determine the rootset, i.e. exported functions and
@@ -98,9 +98,6 @@ add_to_work_list(F, {Fs,Used}=Sets) ->
lc :: non_neg_integer() %Label counter
}).
--spec clean_labels([beam_utils:instruction()]) ->
- {[beam_utils:instruction()],pos_integer()}.
-
clean_labels(Fs0) ->
St0 = #st{lmap=[],entry=1,lc=1},
{Fs1,#st{lmap=Lmap0,lc=Lc}} = function_renumber(Fs0, St0, []),
@@ -182,6 +179,144 @@ remove_lines_block([I|Is]) ->
[I|remove_lines_block(Is)];
remove_lines_block([]) -> [].
+%%%
+%%% If compatibility with a previous release (OTP 24 or earlier) has
+%%% been requested, eliminate bs_create_bin instructions by translating
+%%% them to the old binary syntax instructions.
+%%%
+
+fix_bs_create_bin(Fs, Opts) ->
+ case proplists:get_bool(no_bs_create_bin, Opts) of
+ false -> Fs;
+ true -> fold_functions(fun fix_bs_create_bin/1, Fs)
+ end.
+
+fix_bs_create_bin([{bs_create_bin,Fail,Alloc,Live,Unit,Dst,{list,List}}|Is]) ->
+ Tail = fix_bs_create_bin(Is),
+ Flags = {field_flags,[]},
+ try bs_pre_size_calc(List) of
+ SizeCalc0 ->
+ SizeCalc = fold_size_calc(SizeCalc0, 0, []),
+ TmpDst = SizeReg = {x,Live},
+ SizeIs0 = bs_size_calc(SizeCalc, Fail, SizeReg, {x,Live+1}),
+ SizeIs = [{move,{integer,0},SizeReg}|SizeIs0],
+ RestIs = bs_puts(List, Fail) ++ [{move,TmpDst,Dst}|Tail],
+ case List of
+ [{atom,append},_,_,_,Src|_] ->
+ SizeIs ++ [{bs_append,Fail,SizeReg,Alloc,Live+1,Unit,Src,Flags,TmpDst}|RestIs];
+ [{atom,private_append},_,_,_,Src|_] ->
+ TestHeap = {test_heap,Alloc,Live+1},
+ SizeIs ++ [TestHeap,{bs_private_append,Fail,SizeReg,Unit,Src,Flags,TmpDst}|RestIs];
+ _ ->
+ SizeIs ++ [{bs_init_bits,Fail,SizeReg,Alloc,Live+1,Flags,TmpDst}|RestIs]
+ end
+ catch
+ throw:invalid_size ->
+ [{move,{atom,badarg},{x,0}},
+ {call_ext_only,1,{extfunc,erlang,error,1}}|Tail]
+ end;
+fix_bs_create_bin([I|Is]) ->
+ [I|fix_bs_create_bin(Is)];
+fix_bs_create_bin([]) -> [].
+
+bs_pre_size_calc([Type,_Seg,Unit,_Flags,Src,Size|Segs]) ->
+ case Type of
+ {atom,T} when T =:= append; T =:= private_append ->
+ bs_pre_size_calc(Segs);
+ _ ->
+ [bs_pre_size_calc_1(Type, Unit, Src, Size)|bs_pre_size_calc(Segs)]
+ end;
+bs_pre_size_calc([]) -> [].
+
+bs_pre_size_calc_1({atom,Type}, Unit, Src, Size) ->
+ case {Unit,Size} of
+ {0,{atom,undefined}} ->
+ %% No size/unit given.
+ {8,case Type of
+ utf8 -> {{instr,bs_utf8_size},Src};
+ utf16 -> {{instr,bs_utf16_size},Src};
+ utf32 -> {term,{integer,4}}
+ end};
+ {Unit,_} ->
+ case {Type,Size} of
+ {binary,{atom,all}} ->
+ case Unit rem 8 of
+ 0 -> {8,{{bif,byte_size},Src}};
+ _ -> {1,{{bif,bit_size},Src}}
+ end;
+ {_,_} ->
+ ensure_valid_size(Size),
+ {Unit,{term,Size}}
+ end
+ end.
+
+ensure_valid_size({x,_}) -> ok;
+ensure_valid_size({y,_}) -> ok;
+ensure_valid_size({integer,Size}) when Size >= 0 -> ok;
+ensure_valid_size(_) -> throw(invalid_size).
+
+fold_size_calc([{Unit,{term,{integer,Size}}}|T], Bits, Acc) ->
+ fold_size_calc(T, Bits + Unit*Size, Acc);
+fold_size_calc([{Unit,{{bif,Bif},{literal,Lit}}}=H|T], Bits, Acc) ->
+ try erlang:Bif(Lit) of
+ Result ->
+ fold_size_calc([{Unit,{term,{integer,Result}}}|T], Bits, Acc)
+ catch
+ _:_ ->
+ fold_size_calc(T, Bits, [H|Acc])
+ end;
+fold_size_calc([{U,_}=H|T], Bits, Acc) when U =:= 1; U =:= 8 ->
+ fold_size_calc(T, Bits, [H|Acc]);
+fold_size_calc([{U,Var}|T], Bits, Acc) ->
+ fold_size_calc(T, Bits, [{1,{'*',{term,{integer,U}},Var}}|Acc]);
+fold_size_calc([], Bits, Acc) ->
+ Bytes = Bits div 8,
+ RemBits = Bits rem 8,
+ Sizes = [{1,{term,{integer,RemBits}}},{8,{term,{integer,Bytes}}}|Acc],
+ [Pair || {_,Sz}=Pair <- Sizes, Sz =/= {term,{integer,0}}].
+
+bs_size_calc([{Unit,{{bif,Bif},Reg}}|T], Fail, SizeReg, TmpReg) ->
+ Live = element(2, SizeReg) + 1,
+ [{gc_bif,Bif,Fail,Live,[Reg],TmpReg},
+ {bs_add,Fail,[SizeReg,TmpReg,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)];
+bs_size_calc([{Unit,{'*',{term,Term1},{term,Term2}}}|T], Fail, SizeReg, TmpReg) ->
+ Live = element(2, SizeReg) + 1,
+ [{gc_bif,'*',Fail,Live,[Term1,Term2],TmpReg},
+ {bs_add,Fail,[SizeReg,TmpReg,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)];
+bs_size_calc([{Unit,{{instr,Instr},Reg}}|T], Fail, SizeReg, TmpReg) ->
+ [{Instr,Fail,Reg,TmpReg},
+ {bs_add,Fail,[SizeReg,TmpReg,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)];
+bs_size_calc([{Unit,{term,Term}}|T], Fail, SizeReg, TmpReg) ->
+ [{bs_add,Fail,[SizeReg,Term,Unit],SizeReg}|bs_size_calc(T, Fail, SizeReg, TmpReg)];
+bs_size_calc([], _Fail, _SizeReg, _TmpReg) -> [].
+
+bs_puts([{atom,string},_Seg,_Unit,_Flags,{string,_}=Str,{integer,Size}|Is], Fail) ->
+ [{bs_put_string,Size,Str}|bs_puts(Is, Fail)];
+bs_puts([{atom,append},_,_,_,_,_|Is], Fail) ->
+ bs_puts(Is, Fail);
+bs_puts([{atom,private_append},_,_,_,_,_|Is], Fail) ->
+ bs_puts(Is, Fail);
+bs_puts([{atom,Type},_Seg,Unit,Flags0,Src,Size|Is], Fail) ->
+ Op = case Type of
+ integer -> bs_put_integer;
+ float -> bs_put_float;
+ binary -> bs_put_binary;
+ utf8 -> bs_put_utf8;
+ utf16 -> bs_put_utf16;
+ utf32 -> bs_put_utf32
+ end,
+ Flags = case Flags0 of
+ nil -> [];
+ {literal,Fs} -> Fs
+ end,
+ I = if
+ Unit =:= 0 ->
+ {bs_put,Fail,{Op,{field_flags,Flags}},[Src]};
+ true ->
+ {bs_put,Fail,{Op,Unit,{field_flags,Flags}},[Size,Src]}
+ end,
+ [I|bs_puts(Is, Fail)];
+bs_puts([], _Fail) -> [].
%%%
%%% Helpers.
diff --git a/lib/compiler/src/beam_dict.erl b/lib/compiler/src/beam_dict.erl
index dda7eb310d..36bdb01df5 100644
--- a/lib/compiler/src/beam_dict.erl
+++ b/lib/compiler/src/beam_dict.erl
@@ -23,10 +23,12 @@
-export([new/0,opcode/2,highest_opcode/1,
atom/2,local/4,export/4,import/4,
- string/2,lambda/3,literal/2,line/2,fname/2,
- atom_table/2,local_table/1,export_table/1,import_table/1,
+ string/2,lambda/3,literal/2,line/2,fname/2,type/2,
+ atom_table/1,local_table/1,export_table/1,import_table/1,
string_table/1,lambda_table/1,literal_table/1,
- line_table/1]).
+ line_table/1,type_table/1]).
+
+-include("beam_types.hrl").
-type label() :: beam_asm:label().
@@ -37,28 +39,31 @@
-type fname_tab() :: #{Name :: term() => index()}.
-type line_tab() :: #{{Fname :: index(), Line :: term()} => index()}.
-type literal_tab() :: #{Literal :: term() => index()}.
+-type type_tab() :: #{ Type :: binary() => index()}.
-type lambda_info() :: {label(),{index(),label(),non_neg_integer()}}.
-type lambda_tab() :: {non_neg_integer(),[lambda_info()]}.
-type wrapper() :: #{label() => index()}.
-record(asm,
- {atoms = #{} :: atom_tab(),
- exports = [] :: [{label(), arity(), label()}],
- locals = [] :: [{label(), arity(), label()}],
- imports = gb_trees:empty() :: import_tab(),
- strings = <<>> :: binary(), %String pool
- lambdas = {0,[]} :: lambda_tab(),
+ {atoms = #{} :: atom_tab(),
+ exports = [] :: [{label(), arity(), label()}],
+ locals = [] :: [{label(), arity(), label()}],
+ imports = gb_trees:empty() :: import_tab(),
+ strings = <<>> :: binary(), %String pool
+ lambdas = {0,[]} :: lambda_tab(),
+ types = #{} :: type_tab(),
wrappers = #{} :: wrapper(),
- literals = #{} :: literal_tab(),
- fnames = #{} :: fname_tab(),
- lines = #{} :: line_tab(),
- num_lines = 0 :: non_neg_integer(), %Number of line instructions
- next_import = 0 :: non_neg_integer(),
- string_offset = 0 :: non_neg_integer(),
- next_literal = 0 :: non_neg_integer(),
- highest_opcode = 0 :: non_neg_integer()
- }).
+ literals = #{} :: literal_tab(),
+ fnames = #{} :: fname_tab(),
+ lines = #{} :: line_tab(),
+ num_lines = 0 :: non_neg_integer(), %Number of line instructions
+ next_import = 0 :: non_neg_integer(),
+ string_offset = 0 :: non_neg_integer(),
+ next_literal = 0 :: non_neg_integer(),
+ highest_opcode = 0 :: non_neg_integer()
+ }).
+
-type bdict() :: #asm{}.
%%-----------------------------------------------------------------------------
@@ -225,28 +230,41 @@ fname(Name, #asm{fnames=Fnames}=Dict) ->
{Index,Dict#asm{fnames=Fnames#{Name=>Index}}}
end.
+-spec type(type(), bdict()) -> {non_neg_integer(), bdict()} | none.
+
+type(Type, #asm{types=Types0}=Dict) ->
+ ExtType = beam_types:encode_ext(Type),
+ case Types0 of
+ #{ ExtType := Index } ->
+ {Index, Dict};
+ #{} ->
+ Index = map_size(Types0),
+ Types = Types0#{ ExtType => Index },
+ {Index, Dict#asm{types=Types}}
+ end.
+
%% Returns the atom table.
%% atom_table(Dict, Encoding) -> {LastIndex,[Length,AtomString...]}
--spec atom_table(bdict(), latin1 | utf8) -> {non_neg_integer(), [[non_neg_integer(),...]]}.
+-spec atom_table(bdict()) -> {non_neg_integer(), [[non_neg_integer(),...]]}.
-atom_table(#asm{atoms=Atoms}, Encoding) ->
+atom_table(#asm{atoms=Atoms}) ->
NumAtoms = maps:size(Atoms),
Sorted = lists:keysort(2, maps:to_list(Atoms)),
{NumAtoms,[begin
- L = atom_to_binary(A, Encoding),
+ L = atom_to_binary(A, utf8),
[byte_size(L),L]
end || {A,_} <- Sorted]}.
%% Returns the table of local functions.
%% local_table(Dict) -> {NumLocals, [{Function, Arity, Label}...]}
--spec local_table(bdict()) -> {non_neg_integer(), [{label(),arity(),label()}]}.
+-spec local_table(bdict()) -> {non_neg_integer(), [{index(),arity(),label()}]}.
local_table(#asm{locals = Locals}) ->
{length(Locals),Locals}.
%% Returns the export table.
%% export_table(Dict) -> {NumExports, [{Function, Arity, Label}...]}
--spec export_table(bdict()) -> {non_neg_integer(), [{label(),arity(),label()}]}.
+-spec export_table(bdict()) -> {non_neg_integer(), [{index(),arity(),label()}]}.
export_table(#asm{exports = Exports}) ->
{length(Exports),Exports}.
@@ -267,15 +285,17 @@ string_table(#asm{strings=Strings,string_offset=Size}) ->
-spec lambda_table(bdict()) -> {non_neg_integer(), [<<_:192>>]}.
-lambda_table(#asm{locals=Loc0,lambdas={NumLambdas,Lambdas0}}) ->
+lambda_table(#asm{locals=Loc0,exports=Ext0,lambdas={NumLambdas,Lambdas0}}) ->
Lambdas1 = sofs:relation(Lambdas0),
Loc = sofs:relation([{Lbl,{F,A}} || {F,A,Lbl} <- Loc0]),
- Lambdas2 = sofs:relative_product1(Lambdas1, Loc),
+ Ext = sofs:relation([{Lbl,{F,A}} || {F,A,Lbl} <- Ext0]),
+ All = sofs:union(Loc, Ext),
+ Lambdas2 = sofs:relative_product1(Lambdas1, All),
%% Initialize OldUniq to 0. It will be set to an unique value
%% based on the MD5 checksum of the BEAM code for the module.
OldUniq = 0,
Lambdas = [<<F:32,A:32,Lbl:32,Index:32,NumFree:32,OldUniq:32>> ||
- {{Index,Lbl,NumFree},{F,A}} <- sofs:to_external(Lambdas2)],
+ {{Index,Lbl,NumFree},{F,A}} <- sofs:to_external(Lambdas2)],
{NumLambdas,Lambdas}.
%% Returns the literal table.
@@ -301,6 +321,18 @@ my_term_to_binary(Term) ->
term_to_binary(Term, [{minor_version,2},deterministic]).
+%% Returns the type table.
+-spec type_table(bdict()) -> {non_neg_integer(), binary()}.
+
+type_table(#asm{types=Types}) ->
+ Sorted = lists:keysort(2, maps:to_list(Types)),
+ {map_size(Types), build_type_table(Sorted, <<>>)}.
+
+build_type_table([{ExtType, _} | Sorted], Acc) ->
+ build_type_table(Sorted, <<Acc/binary, ExtType/binary>>);
+build_type_table([], Acc) ->
+ Acc.
+
%% Return the line table.
-spec line_table(bdict()) ->
{non_neg_integer(), %Number of line instructions.
diff --git a/lib/compiler/src/beam_disasm.erl b/lib/compiler/src/beam_disasm.erl
index ec4a006e33..381d3a54b5 100644
--- a/lib/compiler/src/beam_disasm.erl
+++ b/lib/compiler/src/beam_disasm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -35,15 +35,25 @@
-include("beam_opcodes.hrl").
-include("beam_disasm.hrl").
+-include("beam_asm.hrl").
%%-----------------------------------------------------------------------
-type index() :: non_neg_integer().
-type literals() :: 'none' | gb_trees:tree(index(), term()).
+-type types() :: 'none' | gb_trees:tree(index(), term()).
-type symbolic_tag() :: 'a' | 'f' | 'h' | 'i' | 'u' | 'x' | 'y' | 'z'.
-type disasm_tag() :: symbolic_tag() | 'fr' | 'atom' | 'float' | 'literal'.
-type disasm_term() :: 'nil' | {disasm_tag(), _}.
+-type asm_form() :: {module(),
+ [{atom(), arity()}],
+ [beam_lib:attrib_entry()],
+ [#function{}],
+ beam_lib:label()}.
+
+-export_type([asm_form/0]).
+
%%-----------------------------------------------------------------------
-define(NO_DEBUG(Str,Xs), ok).
@@ -182,8 +192,10 @@ process_chunks(F) ->
Lambdas = beam_disasm_lambdas(LambdaBin, Atoms),
LiteralBin = optional_chunk(F, "LitT"),
Literals = beam_disasm_literals(LiteralBin),
+ TypeBin = optional_chunk(F, "Type"),
+ Types = beam_disasm_types(TypeBin),
Code = beam_disasm_code(CodeBin, Atoms, mk_imports(ImportsList),
- StrBin, Lambdas, Literals, Module),
+ StrBin, Lambdas, Literals, Types, Module),
Attributes =
case optional_chunk(F, attributes) of
none -> [];
@@ -247,6 +259,24 @@ disasm_literals(<<Sz:32,Ext:Sz/binary,T/binary>>, Index) ->
disasm_literals(<<>>, _) -> [].
%%-----------------------------------------------------------------------
+%% Disassembles the type table of a BEAM file.
+%%-----------------------------------------------------------------------
+
+-spec beam_disasm_types('none' | binary()) -> literals().
+
+beam_disasm_types(none) ->
+ none;
+beam_disasm_types(<<?BEAM_TYPES_VERSION:32,Count:32,Table/binary>>) ->
+ Res = gb_trees:from_orddict(disasm_types(Table, 0)),
+ Count = gb_trees:size(Res), %Assertion.
+ Res.
+
+disasm_types(<<Type:18/binary,Rest/binary>>, Index) ->
+ [{Index,beam_types:decode_ext(Type)}|disasm_types(Rest, Index+1)];
+disasm_types(<<>>, _) ->
+ [].
+
+%%-----------------------------------------------------------------------
%% Disassembles the code chunk of a BEAM file:
%% - The code is first disassembled into a long list of instructions.
%% - This list is then split into functions and all names are resolved.
@@ -257,9 +287,9 @@ beam_disasm_code(<<_SS:32, % Sub-Size (length of information before code)
_OM:32, % Opcode Max
_L:32,_F:32,
CodeBin/binary>>, Atoms, Imports,
- Str, Lambdas, Literals, M) ->
+ Str, Lambdas, Literals, Types, M) ->
Code = binary_to_list(CodeBin),
- try disasm_code(Code, Atoms, Literals) of
+ try disasm_code(Code, Atoms, Literals, Types) of
DisasmCode ->
Functions = get_function_chunks(DisasmCode),
Labels = mk_labels(local_labels(Functions)),
@@ -275,10 +305,11 @@ beam_disasm_code(<<_SS:32, % Sub-Size (length of information before code)
%%-----------------------------------------------------------------------
-disasm_code([B|Bs], Atoms, Literals) ->
- {Instr,RestBs} = disasm_instr(B, Bs, Atoms, Literals),
- [Instr|disasm_code(RestBs, Atoms, Literals)];
-disasm_code([], _, _) -> [].
+disasm_code([B|Bs], Atoms, Literals, Types) ->
+ {Instr,RestBs} = disasm_instr(B, Bs, Atoms, Literals, Types),
+ [Instr|disasm_code(RestBs, Atoms, Literals, Types)];
+disasm_code([], _, _, _) ->
+ [].
%%-----------------------------------------------------------------------
%% Splits the code stream into chunks representing the code of functions.
@@ -358,29 +389,31 @@ local_labels_2(_, R, _) -> R.
%% in a generic way; indexing instructions are handled separately.
%%-----------------------------------------------------------------------
-disasm_instr(B, Bs, Atoms, Literals) ->
+disasm_instr(B, Bs, Atoms, Literals, Types) ->
{SymOp, Arity} = beam_opcodes:opname(B),
case SymOp of
select_val ->
- disasm_select_inst(select_val, Bs, Atoms, Literals);
+ disasm_select_inst(select_val, Bs, Atoms, Literals, Types);
select_tuple_arity ->
- disasm_select_inst(select_tuple_arity, Bs, Atoms, Literals);
+ disasm_select_inst(select_tuple_arity, Bs, Atoms, Literals, Types);
put_map_assoc ->
- disasm_map_inst(put_map_assoc, Arity, Bs, Atoms, Literals);
+ disasm_map_inst(put_map_assoc, Arity, Bs, Atoms, Literals, Types);
put_map_exact ->
- disasm_map_inst(put_map_exact, Arity, Bs, Atoms, Literals);
+ disasm_map_inst(put_map_exact, Arity, Bs, Atoms, Literals, Types);
get_map_elements ->
- disasm_map_inst(get_map_elements, Arity, Bs, Atoms, Literals);
+ disasm_map_inst(get_map_elements, Arity, Bs, Atoms, Literals, Types);
has_map_fields ->
- disasm_map_inst(has_map_fields, Arity, Bs, Atoms, Literals);
+ disasm_map_inst(has_map_fields, Arity, Bs, Atoms, Literals, Types);
put_tuple2 ->
- disasm_put_tuple2(Bs, Atoms, Literals);
+ disasm_put_tuple2(Bs, Atoms, Literals, Types);
make_fun3 ->
- disasm_make_fun3(Bs, Atoms, Literals);
+ disasm_make_fun3(Bs, Atoms, Literals, Types);
init_yregs ->
- disasm_init_yregs(Bs, Atoms, Literals);
+ disasm_init_yregs(Bs, Atoms, Literals, Types);
+ bs_create_bin ->
+ disasm_bs_create_bin(Bs, Atoms, Literals, Types);
_ ->
- try decode_n_args(Arity, Bs, Atoms, Literals) of
+ try decode_n_args(Arity, Bs, Atoms, Literals, Types) of
{Args, RestBs} ->
?NO_DEBUG("instr ~p~n", [{SymOp, Args}]),
{{SymOp, Args}, RestBs}
@@ -400,49 +433,61 @@ disasm_instr(B, Bs, Atoms, Literals) ->
%% where each case is of the form [symbol,{f,Label}].
%%-----------------------------------------------------------------------
-disasm_select_inst(Inst, Bs, Atoms, Literals) ->
- {X, Bs1} = decode_arg(Bs, Atoms, Literals),
- {F, Bs2} = decode_arg(Bs1, Atoms, Literals),
- {Z, Bs3} = decode_arg(Bs2, Atoms, Literals),
- {U, Bs4} = decode_arg(Bs3, Atoms, Literals),
+disasm_select_inst(Inst, Bs, Atoms, Literals, Types) ->
+ {X, Bs1} = decode_arg(Bs, Atoms, Literals, Types),
+ {F, Bs2} = decode_arg(Bs1, Atoms, Literals, Types),
+ {Z, Bs3} = decode_arg(Bs2, Atoms, Literals, Types),
+ {U, Bs4} = decode_arg(Bs3, Atoms, Literals, Types),
{u, Len} = U,
- {List, RestBs} = decode_n_args(Len, Bs4, Atoms, Literals),
+ {List, RestBs} = decode_n_args(Len, Bs4, Atoms, Literals, Types),
{{Inst, [X,F,{Z,U,List}]}, RestBs}.
-disasm_map_inst(Inst, Arity, Bs0, Atoms, Literals) ->
- {Args0,Bs1} = decode_n_args(Arity, Bs0, Atoms, Literals),
+disasm_map_inst(Inst, Arity, Bs0, Atoms, Literals, Types) ->
+ {Args0,Bs1} = decode_n_args(Arity, Bs0, Atoms, Literals, Types),
%% no droplast ..
[Z|Args1] = lists:reverse(Args0),
Args = lists:reverse(Args1),
- {U, Bs2} = decode_arg(Bs1, Atoms, Literals),
+ {U, Bs2} = decode_arg(Bs1, Atoms, Literals, Types),
{u, Len} = U,
- {List, RestBs} = decode_n_args(Len, Bs2, Atoms, Literals),
+ {List, RestBs} = decode_n_args(Len, Bs2, Atoms, Literals, Types),
{{Inst, Args ++ [{Z,U,List}]}, RestBs}.
-disasm_put_tuple2(Bs, Atoms, Literals) ->
- {X, Bs1} = decode_arg(Bs, Atoms, Literals),
- {Z, Bs2} = decode_arg(Bs1, Atoms, Literals),
- {U, Bs3} = decode_arg(Bs2, Atoms, Literals),
+disasm_put_tuple2(Bs, Atoms, Literals, Types) ->
+ {X, Bs1} = decode_arg(Bs, Atoms, Literals, Types),
+ {Z, Bs2} = decode_arg(Bs1, Atoms, Literals, Types),
+ {U, Bs3} = decode_arg(Bs2, Atoms, Literals, Types),
{u, Len} = U,
- {List, RestBs} = decode_n_args(Len, Bs3, Atoms, Literals),
+ {List, RestBs} = decode_n_args(Len, Bs3, Atoms, Literals, Types),
{{put_tuple2, [X,{Z,U,List}]}, RestBs}.
-disasm_make_fun3(Bs, Atoms, Literals) ->
- {Fun, Bs1} = decode_arg(Bs, Atoms, Literals),
- {Dst, Bs2} = decode_arg(Bs1, Atoms, Literals),
- {Z, Bs3} = decode_arg(Bs2, Atoms, Literals),
- {U, Bs4} = decode_arg(Bs3, Atoms, Literals),
+disasm_make_fun3(Bs, Atoms, Literals, Types) ->
+ {Fun, Bs1} = decode_arg(Bs, Atoms, Literals, Types),
+ {Dst, Bs2} = decode_arg(Bs1, Atoms, Literals, Types),
+ {Z, Bs3} = decode_arg(Bs2, Atoms, Literals, Types),
+ {U, Bs4} = decode_arg(Bs3, Atoms, Literals, Types),
{u, Len} = U,
- {List, RestBs} = decode_n_args(Len, Bs4, Atoms, Literals),
+ {List, RestBs} = decode_n_args(Len, Bs4, Atoms, Literals, Types),
{{make_fun3, [Fun,Dst,{Z,U,List}]}, RestBs}.
-disasm_init_yregs(Bs1, Atoms, Literals) ->
- {Z, Bs2} = decode_arg(Bs1, Atoms, Literals),
- {U, Bs3} = decode_arg(Bs2, Atoms, Literals),
+disasm_init_yregs(Bs1, Atoms, Literals, Types) ->
+ {Z, Bs2} = decode_arg(Bs1, Atoms, Literals, Types),
+ {U, Bs3} = decode_arg(Bs2, Atoms, Literals, Types),
{u, Len} = U,
- {List, RestBs} = decode_n_args(Len, Bs3, Atoms, Literals),
+ {List, RestBs} = decode_n_args(Len, Bs3, Atoms, Literals, Types),
{{init_yregs, [{Z,U,List}]}, RestBs}.
+disasm_bs_create_bin(Bs0, Atoms, Literals, Types) ->
+ {A1, Bs1} = decode_arg(Bs0, Atoms, Literals, Types),
+ {A2, Bs2} = decode_arg(Bs1, Atoms, Literals, Types),
+ {A3, Bs3} = decode_arg(Bs2, Atoms, Literals, Types),
+ {A4, Bs4} = decode_arg(Bs3, Atoms, Literals, Types),
+ {A5, Bs5} = decode_arg(Bs4, Atoms, Literals, Types),
+ {Z, Bs6} = decode_arg(Bs5, Atoms, Literals, Types),
+ {U, Bs7} = decode_arg(Bs6, Atoms, Literals, Types),
+ {u, Len} = U,
+ {List, RestBs} = decode_n_args(Len, Bs7, Atoms, Literals, Types),
+ {{bs_create_bin, [{A1,A2,A3,A4,A5,Z,U,List}]}, RestBs}.
+
%%-----------------------------------------------------------------------
%% decode_arg([Byte]) -> {Arg, [Byte]}
%%
@@ -459,21 +504,22 @@ decode_arg([B|Bs]) ->
?NO_DEBUG('Tag = ~p, B = ~p, Bs = ~p~n', [Tag, B, Bs]),
case Tag of
z ->
- decode_z_tagged(Tag, B, Bs, no_literals);
+ decode_z_tagged(Tag, B, Bs, no_literals, no_types);
_ ->
%% all other cases are handled as if they were integers
decode_int(Tag, B, Bs)
end.
--spec decode_arg([byte(),...], gb_trees:tree(index(), _), literals()) ->
+-spec decode_arg([byte(),...],
+ gb_trees:tree(index(), _), literals(), types()) ->
{disasm_term(), [byte()]}.
-decode_arg([B|Bs0], Atoms, Literals) ->
+decode_arg([B|Bs0], Atoms, Literals, Types) ->
Tag = decode_tag(B band 2#111),
?NO_DEBUG('Tag = ~p, B = ~p, Bs = ~p~n', [Tag, B, Bs0]),
case Tag of
z ->
- decode_z_tagged(Tag, B, Bs0, Literals);
+ decode_z_tagged(Tag, B, Bs0, Literals, Types);
a ->
%% atom or nil
case decode_int(Tag, B, Bs0) of
@@ -548,7 +594,7 @@ decode_negative(N, Len) ->
%% Decodes lists and floating point numbers.
%%-----------------------------------------------------------------------
-decode_z_tagged(Tag,B,Bs,Literals) when (B band 16#08) =:= 0 ->
+decode_z_tagged(Tag,B,Bs,Literals,Types) when (B band 16#08) =:= 0 ->
N = B bsr 4,
case N of
0 -> % float
@@ -567,10 +613,12 @@ decode_z_tagged(Tag,B,Bs,Literals) when (B band 16#08) =:= 0 ->
Literal ->
{{literal,Literal},RestBs}
end;
+ 5 -> % type-tagged register
+ decode_tr(Bs, Types);
_ ->
?exit({decode_z_tagged,{invalid_extended_tag,N}})
end;
-decode_z_tagged(_,B,_,_) ->
+decode_z_tagged(_,B,_,_,_) ->
?exit({decode_z_tagged,{weird_value,B}}).
-spec decode_float([byte(),...]) -> {{'float', float()}, [byte()]}.
@@ -580,6 +628,12 @@ decode_float(Bs) ->
<<Float:64/float>> = list_to_binary(FL),
{{float,Float},RestBs}.
+-spec decode_tr([byte(),...], term()) -> {#tr{}, [byte()]}.
+decode_tr(Bs, Types) ->
+ {Reg, RestBs0} = decode_arg(Bs),
+ {{u, TypeIdx}, RestBs} = decode_arg(RestBs0),
+ {#tr{r=Reg,t=gb_trees:get(TypeIdx, Types)}, RestBs}.
+
-spec decode_fr([byte(),...]) -> {{'fr', non_neg_integer()}, [byte()]}.
decode_fr(Bs) ->
@@ -633,13 +687,13 @@ build_arg([], N) ->
%% Decodes a bunch of arguments and returns them in a list
%%-----------------------------------------------------------------------
-decode_n_args(N, Bs, Atoms, Literals) when N >= 0 ->
- decode_n_args(N, [], Bs, Atoms, Literals).
+decode_n_args(N, Bs, Atoms, Literals, Types) when N >= 0 ->
+ decode_n_args(N, [], Bs, Atoms, Literals, Types).
-decode_n_args(N, Acc, Bs0, Atoms, Literals) when N > 0 ->
- {A1,Bs} = decode_arg(Bs0, Atoms, Literals),
- decode_n_args(N-1, [A1|Acc], Bs, Atoms, Literals);
-decode_n_args(0, Acc, Bs, _, _) ->
+decode_n_args(N, Acc, Bs0, Atoms, Literals, Types) when N > 0 ->
+ {A1,Bs} = decode_arg(Bs0, Atoms, Literals, Types),
+ decode_n_args(N-1, [A1|Acc], Bs, Atoms, Literals, Types);
+decode_n_args(0, Acc, Bs, _, _, _) ->
{lists:reverse(Acc),Bs}.
%%-----------------------------------------------------------------------
@@ -1173,6 +1227,16 @@ resolve_inst({recv_marker_reserve,[Reg]},_,_,_) ->
resolve_inst({recv_marker_use,[Reg]},_,_,_) ->
{recv_marker_use,Reg};
+%%
+%% OTP 25.
+%%
+
+resolve_inst({bs_create_bin,Args},_,_,_) ->
+ {bs_create_bin,Args};
+resolve_inst({call_fun2,[Tag,{u,Arity},Func]},_,_,_) ->
+ {call_fun2,Tag,Arity,Func};
+resolve_inst({badrecord,[Arg]},_,_,_) ->
+ {badrecord,resolve_arg(Arg)};
%%
%% Catches instructions that are not yet handled.
@@ -1185,6 +1249,7 @@ resolve_inst(X,_,_,_) -> ?exit({resolve_inst,X}).
resolve_args(Args) -> [resolve_arg(A) || A <- Args].
+resolve_arg(#tr{r=Reg} = Arg) -> _ = resolve_arg(Reg), Arg;
resolve_arg({x,N} = Arg) when is_integer(N), N >= 0 -> Arg;
resolve_arg({y,N} = Arg) when is_integer(N), N >= 0 -> Arg;
resolve_arg({fr,N} = Arg) when is_integer(N), N >= 0 -> Arg;
diff --git a/lib/compiler/src/beam_flatten.erl b/lib/compiler/src/beam_flatten.erl
index 95eba25bfc..c8298d5e6f 100644
--- a/lib/compiler/src/beam_flatten.erl
+++ b/lib/compiler/src/beam_flatten.erl
@@ -55,8 +55,6 @@ norm({set,[D],[S],fmove}) -> {fmove,S,D};
norm({set,[D],[S],fconv}) -> {fconv,S,D};
norm({set,[D],[S1,S2],put_list}) -> {put_list,S1,S2,D};
norm({set,[D],Els,put_tuple2}) -> {put_tuple2,D,{list,Els}};
-norm({set,[D],[],{put_tuple,A}}) -> {put_tuple,A,D};
-norm({set,[],[S],put}) -> {put,S};
norm({set,[D],[S],{get_tuple_element,I}}) -> {get_tuple_element,S,I,D};
norm({set,[],[S,D],{set_tuple_element,I}}) -> {set_tuple_element,S,D,I};
norm({set,[D],[S],get_hd}) -> {get_hd,S,D};
diff --git a/lib/compiler/src/beam_jump.erl b/lib/compiler/src/beam_jump.erl
index aaf327c6a6..c961fdabf6 100644
--- a/lib/compiler/src/beam_jump.erl
+++ b/lib/compiler/src/beam_jump.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -107,7 +107,7 @@
%%% Note: This modules depends on (almost) all branches and jumps only
%%% going forward, so that we can remove instructions (including definition
%%% of labels) after any label that has not been referenced by the code
-%%% preceeding the labels. Regarding the few instructions that have backward
+%%% preceding the labels. Regarding the few instructions that have backward
%%% references to labels, we assume that they only transfer control back
%%% to an instruction that has already been executed. That is, code such as
%%%
@@ -135,7 +135,7 @@
-type instruction() :: beam_utils:instruction().
--include("beam_types.hrl").
+-include("beam_asm.hrl").
-spec module(beam_utils:module_code(), [compile:option()]) ->
{'ok',beam_utils:module_code()}.
@@ -184,9 +184,10 @@ eliminate_moves([{select,select_val,Reg,{f,Fail},List}=I|Is], D0, Acc) ->
D1 = add_unsafe_label(Fail, D0),
D = update_value_dict(List, Reg, D1),
eliminate_moves(Is, D, [I|Acc]);
-eliminate_moves([{test,is_eq_exact,_,[Reg,Val]}=I,
+eliminate_moves([{test,is_eq_exact,_,[Reg0,Val]}=I,
{block,BlkIs0}|Is], D0, Acc) ->
D = update_unsafe_labels(I, D0),
+ Reg = unpack_typed_reg(Reg0),
RegVal = {Reg,Val},
BlkIs = eliminate_moves_blk(BlkIs0, RegVal),
eliminate_moves([{block,BlkIs}|Is], D, [I|Acc]);
@@ -269,7 +270,8 @@ value_to_literal(F) when is_float(F) -> {float,F};
value_to_literal(I) when is_integer(I) -> {integer,I};
value_to_literal(Other) -> {literal,Other}.
-update_value_dict([Lit,{f,Lbl}|T], Reg, D0) ->
+update_value_dict([Lit,{f,Lbl}|T], Reg0, D0) ->
+ Reg = unpack_typed_reg(Reg0),
D = case D0 of
#{Lbl:=unsafe} -> D0;
#{Lbl:={Reg,Lit}} -> D0;
@@ -279,6 +281,9 @@ update_value_dict([Lit,{f,Lbl}|T], Reg, D0) ->
update_value_dict(T, Reg, D);
update_value_dict([], _, D) -> D.
+unpack_typed_reg(#tr{r=Reg}) -> Reg;
+unpack_typed_reg(Reg) -> Reg.
+
add_unsafe_label(L, D) ->
D#{L=>unsafe}.
@@ -406,7 +411,7 @@ unambigous_exit_call([{call_ext,A,{extfunc,M,F,A}}|Is]) ->
case erl_bifs:is_exit_bif(M, F, A) of
true ->
%% beam_validator requires that the size of the stack
- %% frame is unambigously known when a function is called.
+ %% frame is unambiguously known when a function is called.
%%
%% That means that we must be careful when sharing function
%% calls.
@@ -416,7 +421,7 @@ unambigous_exit_call([{call_ext,A,{extfunc,M,F,A}}|Is]) ->
%% rare circumstances. (See the undecided_allocation_1/1
%% function in beam_jump_SUITE.)
%%
- %% To ensure that the frame size is unambigous, only allow
+ %% To ensure that the frame size is unambiguous, only allow
%% sharing of a call to exit BIFs if the call is followed
%% by an instruction that indicates the size of the stack
%% frame (that is almost always the case in real-world
@@ -466,7 +471,7 @@ is_shareable([]) -> true.
%%
%% Classify labels according to where the instructions that branch to
%% the labels are located. Each label is assigned a set of scope
-%% identifers (but usually just one). If two labels have different
+%% identifiers (but usually just one). If two labels have different
%% scope identfiers, sharing a sequence that raises an exception
%% between the labels may not be safe, because one label is inside a
%% try/catch, and the other label is outside. Note that we don't care
@@ -597,21 +602,9 @@ find_fixpoint(OptFun, Is0) ->
Is -> find_fixpoint(OptFun, Is)
end.
-opt([{test,_,{f,L}=Lbl,_}=I|[{jump,{f,L}}|_]=Is], Acc, St) ->
- %% We have
- %% Test Label Ops
- %% jump Label
- %% The test instruction is not needed if the test is pure
- %% (it modifies neither registers nor bit syntax state).
- case beam_utils:is_pure_test(I) of
- false ->
- %% Test is not pure; we must keep it.
- opt(Is, [I|Acc], label_used(Lbl, St));
- true ->
- %% The test is pure and its failure label is the same
- %% as in the jump that follows -- thus it is not needed.
- opt(Is, Acc, St)
- end;
+opt([{test,is_eq_exact,{f,L},_}|[{jump,{f,L}}|_]=Is], Acc, St) ->
+ %% The is_eq_exact test is not needed.
+ opt(Is, Acc, St);
opt([{test,Test0,{f,L}=Lbl,Ops}=I|[{jump,To}|Is]=Is0], Acc, St) ->
case is_label_defined(Is, L) of
false ->
@@ -629,6 +622,28 @@ opt([{test,_,{f,_}=Lbl,_}=I|Is], Acc, St) ->
opt(Is, [I|Acc], label_used(Lbl, St));
opt([{test,_,{f,_}=Lbl,_,_,_}=I|Is], Acc, St) ->
opt(Is, [I|Acc], label_used(Lbl, St));
+opt([{select,select_val,R,F,Vls0}|Is], Acc, St) ->
+ case prune_redundant_values(Vls0, F) of
+ [] ->
+ %% No values left. Must convert to plain jump.
+ I = {jump,F},
+ opt([I|Is], Acc, St);
+ [{atom,_}=Value,Lbl] ->
+ %% Single value left. Convert to regular test.
+ Is1 = [{test,is_eq_exact,F,[R,Value]},{jump,Lbl}|Is],
+ opt(Is1, Acc, St);
+ [{integer,_}=Value,Lbl] ->
+ %% Single value left. Convert to regular test.
+ Is1 = [{test,is_eq_exact,F,[R,Value]},{jump,Lbl}|Is],
+ opt(Is1, Acc, St);
+ [{atom,B1},Lbl,{atom,B2},Lbl] when B1 =:= not B2 ->
+ %% Replace with is_boolean test.
+ Is1 = [{test,is_boolean,F,[R]},{jump,Lbl}|Is],
+ opt(Is1, Acc, St);
+ [_|_]=Vls ->
+ I = {select,select_val,R,F,Vls},
+ skip_unreachable(Is, [I|Acc], label_used([F|Vls], St))
+ end;
opt([{select,_,_R,Fail,Vls}=I|Is], Acc, St) ->
skip_unreachable(Is, [I|Acc], label_used([Fail|Vls], St));
opt([{label,From}=I,{label,To}|Is], Acc, #st{replace=Replace}=St) ->
@@ -664,6 +679,12 @@ opt([], Acc, #st{replace=Replace0}) when Replace0 =/= #{} ->
opt([], Acc, #st{replace=Replace}) when Replace =:= #{} ->
reverse(Acc).
+prune_redundant_values([_Val,F|Vls], F) ->
+ prune_redundant_values(Vls, F);
+prune_redundant_values([Val,Lbl|Vls], F) ->
+ [Val,Lbl|prune_redundant_values(Vls, F)];
+prune_redundant_values([], _) -> [].
+
normalize_replace([{From,To0}|Rest], Replace, Acc) ->
case Replace of
#{To0 := To} ->
@@ -687,7 +708,7 @@ collect_labels_1(Is, _Label, _Entry, Acc, St) ->
%% label_defined(Is, Label) -> true | false.
%% Test whether the label Label is defined at the start of the instruction
-%% sequence, possibly preceeded by other label definitions.
+%% sequence, possibly preceded by other label definitions.
%%
is_label_defined([{label,L}|_], L) -> true;
is_label_defined([{label,_}|Is], L) -> is_label_defined(Is, L);
@@ -756,6 +777,7 @@ is_exit_instruction(if_end) -> true;
is_exit_instruction({case_end,_}) -> true;
is_exit_instruction({try_case_end,_}) -> true;
is_exit_instruction({badmatch,_}) -> true;
+is_exit_instruction({badrecord,_}) -> true;
is_exit_instruction(_) -> false.
%% remove_unused_labels(Instructions0) -> Instructions
@@ -800,7 +822,7 @@ drop_upto_label([]) -> [].
%% unshare([Instruction]) -> [Instruction].
%% Replace a jump to a return sequence (a `return` instruction
-%% optionally preced by a `deallocate` instruction) with the return
+%% optionally precede by a `deallocate` instruction) with the return
%% sequence. This always saves execution time and may also save code
%% space (depending on the architecture). Eliminating `jump`
%% instructions also gives beam_trim more opportunities to trim the
@@ -880,6 +902,8 @@ instr_labels({bif,_Name,Lbl,_As,_R}) ->
do_instr_labels(Lbl);
instr_labels({gc_bif,_Name,Lbl,_Live,_As,_R}) ->
do_instr_labels(Lbl);
+instr_labels({bs_create_bin,Lbl,_,_,_,_,_}) ->
+ do_instr_labels(Lbl);
instr_labels({bs_init,Lbl,_,_,_,_}) ->
do_instr_labels(Lbl);
instr_labels({bs_put,Lbl,_,_}) ->
diff --git a/lib/compiler/src/beam_kernel_to_ssa.erl b/lib/compiler/src/beam_kernel_to_ssa.erl
index cc2c901a68..52a68efbb6 100644
--- a/lib/compiler/src/beam_kernel_to_ssa.erl
+++ b/lib/compiler/src/beam_kernel_to_ssa.erl
@@ -25,8 +25,8 @@
-export([module/2]).
-import(lists, [all/2,append/1,flatmap/2,foldl/3,
- keysort/2,mapfoldl/3,map/2,member/2,
- reverse/1,reverse/2,sort/1]).
+ keyfind/3,keysort/2,mapfoldl/3,member/2,
+ reverse/1,sort/1]).
-include("v3_kernel.hrl").
-include("beam_ssa.hrl").
@@ -133,20 +133,31 @@ cg(#k_return{args=[Ret0]}, St) ->
cg(#k_break{args=Bs}, #cg{break=Br}=St) ->
Args = ssa_args(Bs, St),
{[#cg_break{args=Args,phi=Br}],St};
-cg(#k_letrec_goto{label=Label,first=First,then=Then,ret=Rs},
+cg(#k_letrec_goto{label=Label,vars=Vs0,first=First,then=Then,ret=Rs},
#cg{break=OldBreak,labels=Labels0}=St0) ->
{Tf,St1} = new_label(St0),
{B,St2} = new_label(St1),
Labels = Labels0#{Label=>Tf},
- {Fis,St3} = cg(First, St2#cg{labels=Labels,break=B}),
- {Sis,St4} = cg(Then, St3),
- St5 = St4#cg{labels=Labels0},
- {BreakVars,St} = new_ssa_vars(Rs, St5),
- Phi = #cg_phi{vars=BreakVars},
- {Fis ++ [{label,Tf}] ++ Sis ++ [{label,B},Phi],St#cg{break=OldBreak}};
-cg(#k_goto{label=Label}, #cg{labels=Labels}=St) ->
+ {Vs,St3} = new_ssa_vars(Vs0, St2),
+ {Fis,St4} = cg(First, St3#cg{labels=Labels,break=B}),
+ {Sis,St5} = cg(Then, St4),
+ St6 = St5#cg{labels=Labels0},
+ {BreakVars,St} = new_ssa_vars(Rs, St6),
+ PostPhi = #cg_phi{vars=BreakVars},
+ FailPhi = case Vs of
+ [] -> [];
+ [_|_] -> [#cg_phi{vars=Vs}]
+ end,
+ {Fis ++ [{label,Tf}] ++ FailPhi ++ Sis ++ [{label,B},PostPhi],
+ St#cg{break=OldBreak}};
+cg(#k_goto{label=Label,args=[]}, #cg{labels=Labels}=St) ->
Branch = map_get(Label, Labels),
- {[make_uncond_branch(Branch)],St}.
+ {[make_uncond_branch(Branch)],St};
+cg(#k_goto{label=Label,args=As0}, #cg{labels=Labels}=St) ->
+ As = ssa_args(As0, St),
+ Branch = map_get(Label, Labels),
+ Break = #cg_break{args=As,phi=Branch},
+ {[Break],St}.
%% match_cg(Matc, [Ret], State) -> {[Ainstr],State}.
%% Generate code for a match.
@@ -683,43 +694,52 @@ call_cg(Func, As, [#k_var{name=R}|MoreRs]=Rs, Le, St0) ->
end.
enter_cg(Func, As0, Le, St0) ->
+ {no_catch,_} = FailCtx = fail_context(St0), %Assertion.
+
As = ssa_args([Func|As0], St0),
- {Ret,St} = new_ssa_var('@ssa_ret', St0),
+ {Ret,St2} = new_ssa_var('@ssa_ret', St0),
Call = #b_set{anno=line_anno(Le),op=call,dst=Ret,args=As},
- {[Call,#b_ret{arg=Ret}],St}.
+
+ {TestIs,St} = make_succeeded(Ret, FailCtx, St2),
+ {[Call | TestIs] ++ [#b_ret{arg=Ret}],St}.
%% bif_cg(#k_bif{}, Le,State) -> {[Ainstr],State}.
%% Generate code for a guard BIF or primop.
bif_cg(#k_bif{anno=A,op=#k_internal{name=Name},args=As,ret=Rs}, _Le, St) ->
- internal_cg(line_anno(A), Name, As, Rs, St);
+ internal_cg(internal_anno(A), Name, As, Rs, St);
bif_cg(#k_bif{op=#k_remote{mod=#k_literal{val=erlang},name=#k_literal{val=Name}},
args=As,ret=Rs}, Le, St) ->
bif_cg(Name, As, Rs, Le, St).
+internal_anno(Le) ->
+ Anno = line_anno(Le),
+ case keyfind(inlined, 1, Le) of
+ false -> Anno;
+ {inlined, NameArity} -> Anno#{ inlined => NameArity }
+ end.
+
%% internal_cg(Bif, [Arg], [Ret], Le, State) ->
%% {[Ainstr],State}.
+internal_cg(Anno, Op, As, Rs, St0)
+ when Op =:= match_fail; Op =:= raise; Op =:= raw_raise ->
+ {Dst, St1} = case Rs of
+ [#k_var{name=Dst0} | Rest] ->
+ {Var, StV} = new_ssa_var(Dst0, St0),
+ {Var, set_unused_ssa_vars(Rest, StV)};
+ [] ->
+ new_ssa_var('@exception', St0)
+ end,
-internal_cg(_Anno, Op0, As, [#k_var{name=Dst0}], St0)
- when Op0 =:= raise; Op0 =:= raw_raise ->
- Args = ssa_args(As, St0),
- Op = fix_op(Op0, St0),
- {Dst,St} = new_ssa_var(Dst0, St0),
- Set = #b_set{op=Op,dst=Dst,args=Args},
- case fail_context(St) of
- {no_catch,_Fail} ->
- %% No current catch in this function. Follow the raw_raise/resume
- %% instruction by a return (instead of branching to
- %% ?EXCEPTION_MARKER) to ensure that the trim optimization can be
- %% applied. (Allowing control to pass through to the next
- %% instruction would mean that the type for the try/catch construct
- %% would be `any`.)
- Is = [Set,#b_ret{arg=Dst},#cg_unreachable{}],
- {Is,St};
- {in_catch,Fail} ->
- Is = [Set,make_uncond_branch(Fail),#cg_unreachable{}],
- {Is,St}
- end;
+ {Kind, _Fail} = Context = fail_context(St1),
+ true = (Kind =/= guard) orelse (Op =:= match_fail), %Assertion.
+
+ Args = ssa_args(As, St1),
+
+ Set = #b_set{anno=Anno,op=fix_op(Op, St1),dst=Dst,args=Args},
+
+ {TestIs, St} = make_succeeded(Dst, Context, St1),
+ {[Set | TestIs], St};
internal_cg(Anno, recv_peek_message, [], [#k_var{name=Succeeded0},
#k_var{name=Dst0}], St0) ->
{Dst,St1} = new_ssa_var(Dst0, St0),
@@ -1048,167 +1068,54 @@ put_cg_map(LineAnno, Op, SrcMap, Dst, List, St0) ->
%%%
cg_binary(Dst, Segs0, FailCtx, Le, St0) ->
- {PutCode0,SzCalc0,St1} = cg_bin_put(Segs0, FailCtx, St0),
+ Segs1 = cg_bin_segments(Segs0, St0),
+ Segs = case Segs1 of
+ [#b_literal{val=binary},UnitFlags,Val,#b_literal{val=all}|Segs2] ->
+ Op = case member(single_use, Le) of
+ true -> private_append;
+ false -> append
+ end,
+ [#b_literal{val=Op},UnitFlags,Val,#b_literal{val=all}|Segs2];
+ _ ->
+ Segs1
+ end,
LineAnno = line_anno(Le),
- Anno = Le,
- case PutCode0 of
- [#b_set{op=bs_put,dst=Bin,args=[_,_,Src,#b_literal{val=all}|_]},
- #b_set{op={succeeded,_},dst=Bool,args=[Bin]},
- #b_br{bool=Bool},
- {label,_}|_] ->
- #k_bin_seg{unit=Unit0,next=Segs} = Segs0,
- Unit = #b_literal{val=Unit0},
- {PutCode,SzCalc1,St2} = cg_bin_put(Segs, FailCtx, St1),
- {_,SzVar,SzCode0,St3} = cg_size_calc(1, SzCalc1, FailCtx, St2),
- SzCode = cg_bin_anno(SzCode0, LineAnno),
- Args = case member(single_use, Anno) of
- true ->
- [#b_literal{val=private_append},Src,SzVar,Unit];
- false ->
- [#b_literal{val=append},Src,SzVar,Unit]
- end,
- BsInit = #b_set{anno=LineAnno,op=bs_init,dst=Dst,args=Args},
- {TestIs,St} = make_succeeded(Dst, FailCtx, St3),
- {SzCode ++ [BsInit] ++ TestIs ++ PutCode,St};
- [#b_set{op=bs_put}|_] ->
- {Unit,SzVar,SzCode0,St2} = cg_size_calc(8, SzCalc0, FailCtx, St1),
- SzCode = cg_bin_anno(SzCode0, LineAnno),
- Args = [#b_literal{val=new},SzVar,Unit],
- BsInit = #b_set{anno=LineAnno,op=bs_init,dst=Dst,args=Args},
- {TestIs,St} = make_succeeded(Dst, FailCtx, St2),
- {SzCode ++ [BsInit] ++ TestIs ++ PutCode0,St}
- end.
-
-cg_bin_anno([Set|Sets], Anno) ->
- [Set#b_set{anno=Anno}|Sets];
-cg_bin_anno([], _) -> [].
-
-%% cg_size_calc(PreferredUnit, SzCalc, FailCtx, St0) ->
-%% {ActualUnit,SizeVariable,SizeCode,St}.
-%% Generate size calculation code.
-
-cg_size_calc(Unit, error, _FailCtx, St) ->
- {#b_literal{val=Unit},#b_literal{val=badarg},[],St};
-cg_size_calc(8, [{1,_}|_]=SzCalc, FailCtx, St) ->
- cg_size_calc(1, SzCalc, FailCtx, St);
-cg_size_calc(8, SzCalc, FailCtx, St0) ->
- {Var,Pre,St} = cg_size_calc_1(SzCalc, FailCtx, St0),
- {#b_literal{val=8},Var,Pre,St};
-cg_size_calc(1, SzCalc0, FailCtx, St0) ->
- SzCalc = map(fun({8,#b_literal{val=Size}}) ->
- {1,#b_literal{val=8*Size}};
- ({8,{{bif,byte_size},Src}}) ->
- {1,{{bif,bit_size},Src}};
- ({8,{_,_}=UtfCalc}) ->
- {1,{'*',#b_literal{val=8},UtfCalc}};
- ({_,_}=Pair) ->
- Pair
- end, SzCalc0),
- {Var,Pre,St} = cg_size_calc_1(SzCalc, FailCtx, St0),
- {#b_literal{val=1},Var,Pre,St}.
-
-cg_size_calc_1(SzCalc, FailCtx, St0) ->
- cg_size_calc_2(SzCalc, #b_literal{val=0}, FailCtx, St0).
-
-cg_size_calc_2([{_,{'*',Unit,{_,_}=Bif}}|T], Sum0, FailCtx, St0) ->
- {Sum1,Pre0,St1} = cg_size_calc_2(T, Sum0, FailCtx, St0),
- {BifDst,Pre1,St2} = cg_size_bif(Bif, FailCtx, St1),
- {Sum,Pre2,St} = cg_size_add(Sum1, BifDst, Unit, FailCtx, St2),
- {Sum,Pre0++Pre1++Pre2,St};
-cg_size_calc_2([{_,#b_literal{}=Sz}|T], Sum0, FailCtx, St0) ->
- {Sum1,Pre0,St1} = cg_size_calc_2(T, Sum0, FailCtx, St0),
- {Sum,Pre,St} = cg_size_add(Sum1, Sz, #b_literal{val=1}, FailCtx, St1),
- {Sum,Pre0++Pre,St};
-cg_size_calc_2([{_,#b_var{}=Sz}|T], Sum0, FailCtx, St0) ->
- {Sum1,Pre0,St1} = cg_size_calc_2(T, Sum0, FailCtx, St0),
- {Sum,Pre,St} = cg_size_add(Sum1, Sz, #b_literal{val=1}, FailCtx, St1),
- {Sum,Pre0++Pre,St};
-cg_size_calc_2([{_,{_,_}=Bif}|T], Sum0, FailCtx, St0) ->
- {Sum1,Pre0,St1} = cg_size_calc_2(T, Sum0, FailCtx, St0),
- {BifDst,Pre1,St2} = cg_size_bif(Bif, FailCtx, St1),
- {Sum,Pre2,St} = cg_size_add(Sum1, BifDst, #b_literal{val=1}, FailCtx, St2),
- {Sum,Pre0++Pre1++Pre2,St};
-cg_size_calc_2([], Sum, _FailCtx, St) ->
- {Sum,[],St}.
-
-cg_size_bif(#b_var{}=Var, _FailCtx, St) ->
- {Var,[],St};
-cg_size_bif({Name,Src}, FailCtx, St0) ->
- {Dst,St1} = new_ssa_var('@ssa_bif', St0),
- Bif = #b_set{op=Name,dst=Dst,args=[Src]},
- {TestIs,St} = make_succeeded(Dst, FailCtx, St1),
- {Dst,[Bif|TestIs],St}.
-
-cg_size_add(#b_literal{val=0}, Val, #b_literal{val=1}, _FailCtx, St) ->
- {Val,[],St};
-cg_size_add(#b_literal{val=A}, #b_literal{val=B}, #b_literal{val=U}, _FailCtx, St) ->
- {#b_literal{val=A+B*U},[],St};
-cg_size_add(A, B, Unit, FailCtx, St0) ->
- {Dst,St1} = new_ssa_var('@ssa_sum', St0),
- {TestIs,St} = make_succeeded(Dst, FailCtx, St1),
- BsAdd = #b_set{op=bs_add,dst=Dst,args=[A,B,Unit]},
- {Dst,[BsAdd|TestIs],St}.
-
-cg_bin_put(Seg, FailCtx, St) ->
- cg_bin_put_1(Seg, FailCtx, [], [], St).
-
-cg_bin_put_1(#k_bin_seg{size=Size0,unit=U,type=T,flags=Fs,seg=Src0,next=Next},
- FailCtx, Acc, SzCalcAcc, St0) ->
- [Src,Size] = ssa_args([Src0,Size0], St0),
- NeedSize = bs_need_size(T),
- TypeArg = #b_literal{val=T},
- Flags = #b_literal{val=Fs},
- Unit = #b_literal{val=U},
- Args = case NeedSize of
- true -> [TypeArg,Flags,Src,Size,Unit];
- false -> [TypeArg,Flags,Src]
+ Build = #b_set{anno=LineAnno,op=bs_create_bin,args=Segs,dst=Dst},
+ {TestIs,St} = make_succeeded(Dst, FailCtx, St0),
+ {[Build|TestIs],St}.
+
+cg_bin_segments(#k_bin_seg{anno=Anno,type=Type,flags=Flags0,seg=Src0,size=Size0,unit=U,next=Next}, St) ->
+ Seg = case lists:keyfind(segment, 1,Anno) of
+ false -> [];
+ {segment,_}=Seg0 -> [Seg0]
+ end,
+ [Src,Size] = ssa_args([Src0,Size0], St),
+ TypeArg = #b_literal{val=Type},
+ Unit = case U of
+ undefined -> 0;
+ _ -> U
end,
- {Dst,St1} = new_ssa_var('@ssa_bs_put', St0),
- {TestIs,St} = make_succeeded(Dst, FailCtx, St1),
- Is = [#b_set{op=bs_put,dst=Dst,args=Args}|TestIs],
- SzCalc = bin_size_calc(T, Src, Size, U),
- cg_bin_put_1(Next, FailCtx, reverse(Is, Acc), [SzCalc|SzCalcAcc], St);
-cg_bin_put_1(#k_bin_end{}, _, Acc, SzCalcAcc, St) ->
- SzCalc = fold_size_calc(SzCalcAcc, 0, []),
- {reverse(Acc),SzCalc,St}.
+ Flags = strip_bs_construct_flags(Flags0),
+ UnitFlags = #b_literal{val=[Unit|Flags++Seg]},
+ [TypeArg,UnitFlags,Src,Size|cg_bin_segments(Next, St)];
+cg_bin_segments(#k_bin_end{}, _St) -> [].
bs_need_size(utf8) -> false;
bs_need_size(utf16) -> false;
bs_need_size(utf32) -> false;
bs_need_size(_) -> true.
-bin_size_calc(utf8, Src, _Size, _Unit) ->
- {8,{bs_utf8_size,Src}};
-bin_size_calc(utf16, Src, _Size, _Unit) ->
- {8,{bs_utf16_size,Src}};
-bin_size_calc(utf32, _Src, _Size, _Unit) ->
- {8,#b_literal{val=4}};
-bin_size_calc(binary, Src, #b_literal{val=all}, Unit) ->
- case Unit rem 8 of
- 0 -> {8,{{bif,byte_size},Src}};
- _ -> {1,{{bif,bit_size},Src}}
- end;
-bin_size_calc(_Type, _Src, Size, Unit) ->
- {Unit,Size}.
-
-fold_size_calc([{Unit,#b_literal{val=Size}}|T], Bits, Acc) ->
- if
- is_integer(Size) ->
- fold_size_calc(T, Bits + Unit*Size, Acc);
- true ->
- error
- end;
-fold_size_calc([{U,#b_var{}}=H|T], Bits, Acc) when U =:= 1; U =:= 8 ->
- fold_size_calc(T, Bits, [H|Acc]);
-fold_size_calc([{U,#b_var{}=Var}|T], Bits, Acc) ->
- fold_size_calc(T, Bits, [{1,{'*',#b_literal{val=U},Var}}|Acc]);
-fold_size_calc([{_,_}=H|T], Bits, Acc) ->
- fold_size_calc(T, Bits, [H|Acc]);
-fold_size_calc([], Bits, Acc) ->
- Bytes = Bits div 8,
- RemBits = Bits rem 8,
- Sizes = sort([{1,#b_literal{val=RemBits}},{8,#b_literal{val=Bytes}}|Acc]),
- [Pair || {_,Sz}=Pair <- Sizes, Sz =/= #b_literal{val=0}].
+%% Only keep the flags that have a meaning for binary construction and
+%% are distinct from the default value.
+strip_bs_construct_flags(Flags) ->
+ [Flag || Flag <- Flags,
+ case Flag of
+ little -> true;
+ native -> true;
+ big -> false;
+ signed -> false;
+ unsigned -> false
+ end].
%%%
%%% Utilities for creating the SSA types.
diff --git a/lib/compiler/src/beam_listing.erl b/lib/compiler/src/beam_listing.erl
index 6121593b11..ac21f1a1ab 100644
--- a/lib/compiler/src/beam_listing.erl
+++ b/lib/compiler/src/beam_listing.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
-include("beam_ssa.hrl").
-include("beam_disasm.hrl").
--import(lists, [foreach/2]).
+-import(lists, [foldl/3, foreach/2]).
-type code() :: cerl:c_module()
| beam_utils:module_code()
@@ -55,18 +55,29 @@ module(Stream, {Mod,Exp,Attr,Code,NumLabels}) ->
io:format(Stream, "\n{exports, ~p}.\n", [Exp]),
io:format(Stream, "\n{attributes, ~p}.\n", [Attr]),
io:format(Stream, "\n{labels, ~p}.\n", [NumLabels]),
+ Lbl2Fun = foldl(fun({function,Name,Arity,Entry,_}, Map) ->
+ Map#{ Entry => {Name,Arity} }
+ end, #{}, Code),
foreach(
fun ({function,Name,Arity,Entry,Asm}) ->
io:format(Stream, "\n\n{function, ~w, ~w, ~w}.\n",
[Name, Arity, Entry]),
- io:put_chars(Stream, format_asm(Asm))
+ io:put_chars(Stream, format_asm(Asm, Lbl2Fun))
end, Code);
module(Stream, [_|_]=Fs) ->
%% Form-based abstract format.
foreach(fun (F) -> io:format(Stream, "~p.\n", [F]) end, Fs).
-format_asm([{label,L}|Is]) ->
- [io_lib:format(" {label,~p}.\n", [L])|format_asm(Is)];
-format_asm([I|Is]) ->
- [io_lib:format(" ~p", [I]),".\n"|format_asm(Is)];
-format_asm([]) -> [].
+format_asm([{label,L}|Is], Lbl2Fun) ->
+ [io_lib:format(" {label,~p}.\n", [L])|format_asm(Is, Lbl2Fun)];
+format_asm([I={Call,_,L}|Is], Lbl2Fun) when Call =:= call; Call =:= call_only ->
+ format_asm_call(L, I, Is, Lbl2Fun);
+format_asm([I={call_last,_,L,_}|Is], Lbl2Fun) ->
+ format_asm_call(L, I, Is, Lbl2Fun);
+format_asm([I|Is], Lbl2Fun) ->
+ [io_lib:format(" ~p", [I]),".\n"|format_asm(Is, Lbl2Fun)];
+format_asm([], _) -> [].
+
+format_asm_call({f,L}, I, Is, Lbl2Fun) ->
+ {N,A} = map_get(L, Lbl2Fun),
+ [io_lib:format(" ~p. % ~p/~p\n", [I, N, A])|format_asm(Is, Lbl2Fun)].
diff --git a/lib/compiler/src/beam_peep.erl b/lib/compiler/src/beam_peep.erl
deleted file mode 100644
index da59aea2bd..0000000000
--- a/lib/compiler/src/beam_peep.erl
+++ /dev/null
@@ -1,223 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(beam_peep).
-
--export([module/2]).
-
--import(lists, [reverse/1,member/2,usort/1]).
-
--spec module(beam_utils:module_code(), [compile:option()]) ->
- {'ok',beam_utils:module_code()}.
-
-module({Mod,Exp,Attr,Fs0,_}, _Opts) ->
- %% First coalesce adjacent labels.
- {Fs1,Lc} = beam_clean:clean_labels(Fs0),
-
- %% Do the peep hole optimizations.
- Fs = [function(F) || F <- Fs1],
- {ok,{Mod,Exp,Attr,Fs,Lc}}.
-
-function({function,Name,Arity,CLabel,Is0}) ->
- try
- Is1 = peep(Is0),
- Is = beam_jump:remove_unused_labels(Is1),
- {function,Name,Arity,CLabel,Is}
- catch
- Class:Error:Stack ->
- io:fwrite("Function: ~w/~w\n", [Name,Arity]),
- erlang:raise(Class, Error, Stack)
- end.
-
-
-%% Peep-hole optimizations suitable to perform when most of the
-%% optimations passes have been run.
-%%
-%% (1) In a sequence of tests, we can remove any test instruction
-%% that has been previously seen, because it will certainly
-%% succeed.
-%%
-%% For instance, in the following code sequence
-%%
-%% is_eq_exact _Fail SomeRegister SomeLiteral
-%% is_ne_exact _Fail SomeOtherRegister SomeOtherLiteral
-%% is_eq_exact _Fail SomeRegister SomeLiteral
-%% is_ne_exact _Fail SomeOtherRegister StillSomeOtherLiteral
-%%
-%% the third test is redundant. The code sequence will be produced
-%% by a combination of semicolon and command guards, such as
-%%
-%% InEncoding =:= latin1, OutEncoding =:= unicode;
-%% InEncoding =:= latin1, OutEncoding =:= utf8 ->
-%%
-
-peep(Is) ->
- peep(Is, gb_sets:empty(), []).
-
-peep([{bif,tuple_size,_,[_]=Ops,Dst}=I|Is], SeenTests0, Acc) ->
- %% Pretend that we have seen {test,is_tuple,_,Ops}.
- SeenTests1 = gb_sets:add({is_tuple,Ops}, SeenTests0),
- %% Kill all remembered tests that depend on the destination register.
- SeenTests = kill_seen(Dst, SeenTests1),
- peep(Is, SeenTests, [I|Acc]);
-peep([{bif,map_get,_,[Key,Map],Dst}=I|Is], SeenTests0, Acc) ->
- %% Pretend that we have seen {test,has_map_fields,_,[Map,Key]}
- SeenTests1 = gb_sets:add({has_map_fields,[Map,Key]}, SeenTests0),
- %% Kill all remembered tests that depend on the destination register.
- SeenTests = kill_seen(Dst, SeenTests1),
- peep(Is, SeenTests, [I|Acc]);
-peep([{bif,_,_,_,Dst}=I|Is], SeenTests0, Acc) ->
- %% Kill all remembered tests that depend on the destination register.
- SeenTests = kill_seen(Dst, SeenTests0),
- peep(Is, SeenTests, [I|Acc]);
-peep([{gc_bif,_,_,_,_,Dst}=I|Is], SeenTests0, Acc) ->
- %% Kill all remembered tests that depend on the destination register.
- SeenTests = kill_seen(Dst, SeenTests0),
- peep(Is, SeenTests, [I|Acc]);
-peep([{jump,{f,L}},{label,L}=I|Is], _, Acc) ->
- %% Sometimes beam_jump has missed this optimization.
- peep(Is, gb_sets:empty(), [I|Acc]);
-peep([{select,select_val,R,F,Vls0}|Is], SeenTests0, Acc0) ->
- case prune_redundant_values(Vls0, F) of
- [] ->
- %% No values left. Must convert to plain jump.
- I = {jump,F},
- peep([I|Is], gb_sets:empty(), Acc0);
- [{atom,_}=Value,Lbl] ->
- %% Single value left. Convert to regular test.
- Is1 = [{test,is_eq_exact,F,[R,Value]},{jump,Lbl}|Is],
- peep(Is1, SeenTests0, Acc0);
- [{integer,_}=Value,Lbl] ->
- %% Single value left. Convert to regular test.
- Is1 = [{test,is_eq_exact,F,[R,Value]},{jump,Lbl}|Is],
- peep(Is1, SeenTests0, Acc0);
- [{atom,B1},Lbl,{atom,B2},Lbl] when B1 =:= not B2 ->
- %% Replace with is_boolean test.
- Is1 = [{test,is_boolean,F,[R]},{jump,Lbl}|Is],
- peep(Is1, SeenTests0, Acc0);
- [_|_]=Vls ->
- I = {select,select_val,R,F,Vls},
- peep(Is, gb_sets:empty(), [I|Acc0])
- end;
-peep([{get_map_elements,Fail,Src,List}=I|Is], _SeenTests, Acc0) ->
- SeenTests = gb_sets:empty(),
- case simplify_get_map_elements(Fail, Src, List, Acc0) of
- {ok,Acc} ->
- peep(Is, SeenTests, Acc);
- error ->
- peep(Is, SeenTests, [I|Acc0])
- end;
-peep([{test,has_map_fields,Fail,Ops}=I|Is], SeenTests, Acc0) ->
- case simplify_has_map_fields(Fail, Ops, Acc0) of
- {ok,Acc} ->
- peep(Is, SeenTests, Acc);
- error ->
- peep(Is, SeenTests, [I|Acc0])
- end;
-peep([{test,Op,_,Ops}=I|Is], SeenTests0, Acc) ->
- case beam_utils:is_pure_test(I) of
- false ->
- %% Bit syntax matching, which may modify registers and/or
- %% match state. Clear all information about tests that
- %% has succeeded.
- peep(Is, gb_sets:empty(), [I|Acc]);
- true ->
- case is_test_redundant(Op, Ops, SeenTests0) of
- true ->
- %% This test or a similar test has already succeeded and
- %% is therefore redundant.
- peep(Is, SeenTests0, Acc);
- false ->
- %% Remember that we have seen this test.
- Test = {Op,Ops},
- SeenTests = gb_sets:insert(Test, SeenTests0),
- peep(Is, SeenTests, [I|Acc])
- end
- end;
-peep([I|Is], _, Acc) ->
- %% An unknown instruction. Throw away all information we
- %% have collected about test instructions.
- peep(Is, gb_sets:empty(), [I|Acc]);
-peep([], _, Acc) -> reverse(Acc).
-
-is_test_redundant(Op, Ops, Seen) ->
- gb_sets:is_element({Op,Ops}, Seen) orelse
- is_test_redundant_1(Op, Ops, Seen).
-
-is_test_redundant_1(is_boolean, [R], Seen) ->
- gb_sets:is_element({is_eq_exact,[R,{atom,false}]}, Seen) orelse
- gb_sets:is_element({is_eq_exact,[R,{atom,true}]}, Seen);
-is_test_redundant_1(_, _, _) -> false.
-
-kill_seen(Dst, Seen0) ->
- gb_sets:from_ordset(kill_seen_1(gb_sets:to_list(Seen0), Dst)).
-
-kill_seen_1([{_,Ops}=Test|T], Dst) ->
- case member(Dst, Ops) of
- true -> kill_seen_1(T, Dst);
- false -> [Test|kill_seen_1(T, Dst)]
- end;
-kill_seen_1([], _) -> [].
-
-prune_redundant_values([_Val,F|Vls], F) ->
- prune_redundant_values(Vls, F);
-prune_redundant_values([Val,Lbl|Vls], F) ->
- [Val,Lbl|prune_redundant_values(Vls, F)];
-prune_redundant_values([], _) -> [].
-
-simplify_get_map_elements(Fail, Src, {list,[Key,Dst]},
- [{get_map_elements,Fail,Src,{list,List1}}|Acc]) ->
- case are_keys_literals([Key]) andalso are_keys_literals(List1) andalso
- not is_source_overwritten(Src, List1) of
- true ->
- case member(Key, List1) of
- true ->
- %% The key is already in the other list. That is
- %% very unusual, because there are optimizations to get
- %% rid of duplicate keys. Therefore, don't try to
- %% do anything smart here; just keep the
- %% get_map_elements instructions separate.
- error;
- false ->
- List = [Key,Dst|List1],
- {ok,[{get_map_elements,Fail,Src,{list,List}}|Acc]}
- end;
- false ->
- error
- end;
-simplify_get_map_elements(_, _, _, _) -> error.
-
-simplify_has_map_fields(Fail, [Src|Keys0],
- [{test,has_map_fields,Fail,[Src|Keys1]}|Acc]) ->
- case are_keys_literals(Keys0) andalso are_keys_literals(Keys1) of
- true ->
- Keys = usort(Keys0 ++ Keys1),
- {ok,[{test,has_map_fields,Fail,[Src|Keys]}|Acc]};
- false ->
- error
- end;
-simplify_has_map_fields(_, _, _) -> error.
-
-are_keys_literals([{x,_}|_]) -> false;
-are_keys_literals([{y,_}|_]) -> false;
-are_keys_literals([_|_]) -> true.
-
-is_source_overwritten(Src, [_Key,Src]) -> true;
-is_source_overwritten(_, _) -> false.
diff --git a/lib/compiler/src/beam_ssa.erl b/lib/compiler/src/beam_ssa.erl
index f3fe0c8c9e..e07a38ca85 100644
--- a/lib/compiler/src/beam_ssa.erl
+++ b/lib/compiler/src/beam_ssa.erl
@@ -105,10 +105,9 @@
%% To avoid the collapsing, change the value of SET_LIMIT to 50 in the
%% file erl_types.erl in the dialyzer application.
--type prim_op() :: 'bs_add' | 'bs_extract' | 'bs_get_tail' |
- 'bs_init' | 'bs_init_writable' |
- 'bs_match' | 'bs_put' | 'bs_start_match' | 'bs_test_tail' |
- 'bs_utf16_size' | 'bs_utf8_size' | 'build_stacktrace' |
+-type prim_op() :: 'bs_extract' | 'bs_get_tail' | 'bs_init_writable' |
+ 'bs_match' | 'bs_start_match' | 'bs_test_tail' |
+ 'build_stacktrace' |
'call' | 'catch_end' |
'extract' |
'get_hd' | 'get_map_element' | 'get_tl' | 'get_tuple_element' |
@@ -116,7 +115,7 @@
'is_nonempty_list' | 'is_tagged_tuple' |
'kill_try_tag' |
'landingpad' |
- 'make_fun' | 'new_try_tag' | 'old_make_fun' |
+ 'make_fun' | 'match_fail' | 'new_try_tag' | 'old_make_fun' |
'peek_message' | 'phi' | 'put_list' | 'put_map' | 'put_tuple' |
'raw_raise' | 'recv_next' | 'remove_message' | 'resume' |
'wait_timeout'.
@@ -133,9 +132,10 @@
-import(lists, [foldl/3,mapfoldl/3,member/2,reverse/1,sort/1]).
--spec add_anno(Key, Value, Construct) -> Construct when
+-spec add_anno(Key, Value, Construct0) -> Construct when
Key :: atom(),
Value :: any(),
+ Construct0 :: construct(),
Construct :: construct().
add_anno(Key, Val, #b_function{anno=Anno}=Bl) ->
@@ -156,7 +156,7 @@ add_anno(Key, Val, #b_switch{anno=Anno}=Bl) ->
get_anno(Key, Construct) ->
map_get(Key, get_anno(Construct)).
--spec get_anno(atom(), construct(),any()) -> any().
+-spec get_anno(atom(), construct(), any()) -> any().
get_anno(Key, Construct, Default) ->
maps:get(Key, get_anno(Construct), Default).
@@ -197,17 +197,13 @@ no_side_effect(#b_set{op=Op}) ->
case Op of
{bif,_} -> true;
{float,get} -> true;
- bs_add -> true;
- bs_init -> true;
+ bs_create_bin -> true;
bs_init_writable -> true;
bs_extract -> true;
bs_match -> true;
bs_start_match -> true;
bs_test_tail -> true;
bs_get_tail -> true;
- bs_put -> true;
- bs_utf16_size -> true;
- bs_utf8_size -> true;
build_stacktrace -> true;
extract -> true;
get_hd -> true;
@@ -218,10 +214,12 @@ no_side_effect(#b_set{op=Op}) ->
is_nonempty_list -> true;
is_tagged_tuple -> true;
make_fun -> true;
+ match_fail -> true;
phi -> true;
put_map -> true;
put_list -> true;
put_tuple -> true;
+ raw_raise -> true;
{succeeded,guard} -> true;
_ -> false
end.
@@ -372,7 +370,7 @@ successors(#b_blk{last=Terminator}) ->
%% switch list to a #b_br{}.
-spec normalize(b_set() | terminator()) ->
- b_set() | terminator().
+ b_set() | terminator().
normalize(#b_set{op={bif,Bif},args=Args}=Set) ->
case {is_commutative(Bif),Args} of
@@ -490,7 +488,7 @@ common_dominators(Ls, Dom, Numbering) ->
dom_intersection(Doms, Numbering).
-spec fold_instrs(Fun, Labels, Acc0, Blocks) -> any() when
- Fun :: fun((b_blk()|terminator(), any()) -> any()),
+ Fun :: fun((b_set()|terminator(), any()) -> any()),
Labels :: [label()],
Acc0 :: any(),
Blocks :: block_map().
@@ -520,7 +518,7 @@ mapfold_blocks_1(Fun, Lbl, {Blocks0, Acc0}) ->
{Blocks, Acc}.
-spec mapfold_instrs(Fun, Labels, Acc0, Blocks0) -> {Blocks,Acc} when
- Fun :: fun((b_blk()|terminator(), any()) -> any()),
+ Fun :: fun((b_set()|terminator(), any()) -> any()),
Labels :: [label()],
Acc0 :: any(),
Acc :: any(),
@@ -531,7 +529,7 @@ mapfold_instrs(Fun, Labels, Acc0, Blocks) ->
mapfold_instrs_1(Labels, Fun, Blocks, Acc0).
-spec flatmapfold_instrs(Fun, Labels, Acc0, Blocks0) -> {Blocks,Acc} when
- Fun :: fun((b_blk()|terminator(), any()) -> any()),
+ Fun :: fun((b_set()|terminator(), any()) -> any()),
Labels :: [label()],
Acc0 :: any(),
Acc :: any(),
@@ -607,7 +605,7 @@ between(From, To, Preds, Blocks) ->
%% skipping the blocks that don't precede `To`.
%%
%% As an optimization we initialize the predecessor set with `From` to stop
- %% gathering once seen since we're only interested in the blocks inbetween.
+ %% gathering once seen since we're only interested in the blocks in between.
%% Uninteresting blocks can still be added if `From` doesn't dominate `To`,
%% but that has no effect on the final result.
Filter = between_make_filter([To], Preds, sets:from_list([From], [{version, 2}])),
diff --git a/lib/compiler/src/beam_ssa_bc_size.erl b/lib/compiler/src/beam_ssa_bc_size.erl
index 11c1adc190..c48a7c8cf6 100644
--- a/lib/compiler/src/beam_ssa_bc_size.erl
+++ b/lib/compiler/src/beam_ssa_bc_size.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -276,32 +276,13 @@ calc_size_is([I|Is], Bs0) ->
calc_size_is(Is, Bs);
calc_size_is([], Bs) -> Bs.
-calc_size_instr(#b_set{op=bs_add,args=[A,B,U],dst=Dst}, Bs) ->
- %% We must make sure that the value of bs_add only depends on literals
- %% and arguments passed from the function that created the writable
- %% binary.
- case {get_value(A, Bs),get_arg_value(B, Bs)} of
- {#b_literal{}=Lit,Val} ->
- Bs#{Dst => {expr,{{bif,'+'},[Lit,{{bif,'*'},[Val,U]}]}}};
- {{expr,Expr},Val} ->
- Bs#{Dst => {expr,{{bif,'+'},[Expr,{{bif,'*'},[Val,U]}]}}};
- {_,_} ->
- %% The value depends on a variable of which we know nothing.
- Bs#{Dst => any}
- end;
-calc_size_instr(#b_set{op=bs_init,args=[#b_literal{val=private_append},
- Writable,Size,Unit],
+calc_size_instr(#b_set{op=bs_create_bin,
+ args=[#b_literal{val=private_append},_,Writable,_|Args],
dst=Dst}, Bs) ->
- case get_value(Size, Bs) of
- {arg,SizeOrigin} ->
- Expr = {{bif,'*'},[SizeOrigin,Unit]},
- update_writable(Dst, Writable, Expr, Bs);
- #b_literal{} ->
- Expr = {{bif,'*'},[Size,Unit]},
- update_writable(Dst, Writable, Expr, Bs);
+ case calc_create_bin_size(Args, Bs) of
{expr,Expr} ->
update_writable(Dst, Writable, Expr, Bs);
- _ ->
+ any ->
Bs#{Dst => any}
end;
calc_size_instr(#b_set{op=bs_match,args=[_Type,Ctx,_Flags,
@@ -347,6 +328,26 @@ calc_size_instr(#b_set{op={succeeded,_},args=[Arg],dst=Dst}, Bs) ->
calc_size_instr(#b_set{dst=Dst}, Bs) ->
Bs#{Dst => any}.
+calc_create_bin_size(Args, Bs) ->
+ calc_create_bin_size(Args, Bs, #b_literal{val=0}).
+
+calc_create_bin_size([_,#b_literal{val=[0|_]},_,_|_], _Bs, _Acc) ->
+ %% Construction without size (utf8/utf16/utf32).
+ any;
+calc_create_bin_size([_,#b_literal{val=[U|_]},_,Size|T], Bs, Acc0) when is_integer(U) ->
+ case get_value(Size, Bs) of
+ #b_literal{val=Val} when is_integer(Val) ->
+ Acc = {{bif,'+'},[Acc0,#b_literal{val=U*Val}]},
+ calc_create_bin_size(T, Bs, Acc);
+ {arg,Var} ->
+ Acc = {{bif,'+'},[Acc0,{{bif,'*'},[Var,#b_literal{val=U}]}]},
+ calc_create_bin_size(T, Bs, Acc);
+ _ ->
+ any
+ end;
+calc_create_bin_size([], _Bs, Acc) ->
+ {expr,Acc}.
+
update_writable(Dst, Writable, Expr, Bs) ->
case get_value(Writable, Bs) of
{writable,#b_literal{val=0}} ->
@@ -585,7 +586,8 @@ cg_bad_generator([Arg|_], Annos, CallLast, FailBlk, Count) ->
cg_bad_generator_1(Anno, Arg, CallLast, FailBlk, Count0) ->
{L,Count1} = new_block(Count0),
{TupleDst,Count2} = new_var('@ssa_tuple', Count1),
- {Ret,Count3} = new_var('@ssa_ret', Count2),
+ {SuccDst,Count3} = new_var('@ssa_bool', Count2),
+ {Ret,Count4} = new_var('@ssa_ret', Count3),
MFA = #b_remote{mod=#b_literal{val=erlang},
name=#b_literal{val=error},
arity=1},
@@ -593,21 +595,18 @@ cg_bad_generator_1(Anno, Arg, CallLast, FailBlk, Count0) ->
args=[#b_literal{val=bad_generator},Arg],
dst=TupleDst},
CallI = #b_set{anno=Anno,op=call,args=[MFA,TupleDst],dst=Ret},
- Is = [TupleI,CallI],
-
- %% When the generator is called within try/catch, the `bad_generator` call
- %% must refer to the same landing pad or else we'll break optimizations
- %% that assume exceptions are always reflected in the control flow.
- Last = case CallLast of
- #b_br{fail=CatchLbl} when CatchLbl =/= ?EXCEPTION_BLOCK ->
- #b_br{bool=#b_literal{val=true},
- succ=CatchLbl,fail=CatchLbl};
- _ ->
- #b_ret{arg=Ret}
- end,
+ SuccI = #b_set{op={succeeded,body},args=[Ret],dst=SuccDst},
+ Is = [TupleI,CallI,SuccI],
+
+ %% The `bad_generator` call must refer to the same fail label (either a
+ %% landing pad or ?EXCEPTION_BLOCK) as the caller, or else we'll break
+ %% optimizations that assume exceptions are always reflected in the control
+ %% flow.
+ #b_br{fail=FailLbl} = CallLast, %Assertion.
+ Last = #b_br{bool=SuccDst,succ=FailLbl,fail=FailLbl},
Blk = #b_blk{is=Is,last=Last},
- {L,[{L,Blk}|FailBlk],Count3}.
+ {L,[{L,Blk}|FailBlk],Count4}.
cg_succeeded(#b_set{dst=OpDst}=I, Succ, Fail, Count0) ->
{Bool,Count} = new_var('@ssa_bool', Count0),
diff --git a/lib/compiler/src/beam_ssa_bool.erl b/lib/compiler/src/beam_ssa_bool.erl
index 7ad38dc3ca..cc91e336e0 100644
--- a/lib/compiler/src/beam_ssa_bool.erl
+++ b/lib/compiler/src/beam_ssa_bool.erl
@@ -938,7 +938,7 @@ opt_digraph_instr(#b_set{dst=Dst}=I, G0, St) ->
%% 'xor' is almost never used in practice.
not_possible();
#b_set{op={bif,'not'}} ->
- %% This is suprisingly rare. The previous attempt to
+ %% This is surprisingly rare. The previous attempt to
%% optimize it was broken, which wasn't noticed because
%% very few test cases triggered this code.
not_possible();
@@ -1030,7 +1030,7 @@ eaten_by_phi(V, G) ->
%% order_args([Arg1,Arg2], G, St) -> {First,Second}.
%% Order arguments for a boolean operator so that there is path in the
%% digraph from the instruction referered to by the first operand to
-%% the instruction refered to by the second operand.
+%% the instruction referred to by the second operand.
order_args([#b_var{}=VarA,#b_var{}=VarB], G, St) ->
{VA,VB} = {get_vertex(VarA, St),get_vertex(VarB, St)},
diff --git a/lib/compiler/src/beam_ssa_bsm.erl b/lib/compiler/src/beam_ssa_bsm.erl
index 59872290a6..fb852e9936 100644
--- a/lib/compiler/src/beam_ssa_bsm.erl
+++ b/lib/compiler/src/beam_ssa_bsm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -128,15 +128,20 @@ has_bsm_ops(#b_function{bs=Blocks}) ->
hbo_blocks([{_,#b_blk{is=Is}} | Blocks]) ->
case hbo_is(Is) of
- false -> hbo_blocks(Blocks);
- true -> true
+ no -> hbo_blocks(Blocks);
+ yes -> true;
+ nif_start ->
+ %% Disable optimizations for declared -nifs()
+ %% to avoid leaking match contexts as NIF arguments.
+ false
end;
hbo_blocks([]) ->
false.
-hbo_is([#b_set{op=bs_start_match} | _]) -> true;
+hbo_is([#b_set{op=bs_start_match} | _]) -> yes;
+hbo_is([#b_set{op=nif_start} | _]) -> nif_start;
hbo_is([_I | Is]) -> hbo_is(Is);
-hbo_is([]) -> false.
+hbo_is([]) -> no.
%% Checks whether it's legal to make a call with the given argument as a match
%% context, returning the param_info() of the relevant parameter.
@@ -422,7 +427,7 @@ is_var_in_args(_Var, []) -> false.
%%% Subpasses
%%%
-%% Removes superflous chained bs_start_match instructions in the same
+%% Removes superfluous chained bs_start_match instructions in the same
%% function. When matching on an extracted tail binary, or on a binary we've
%% already matched on, we reuse the original match context.
%%
@@ -991,13 +996,7 @@ add_unopt_binary_info(#b_set{op=Follow,dst=Dst}, Nested, Where, UseMap, Acc0)
foldl(fun(Use, Acc) ->
add_unopt_binary_info(Use, Nested, Where, UseMap, Acc)
end, Acc0, Uses);
-add_unopt_binary_info(#b_set{op=call,
- args=[#b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error}} |
- _Ignored]},
- _Nested, _Where, _UseMap, Acc) ->
- %% There's no nice way to tell compiler-generated exceptions apart from
- %% user ones so we ignore them all. I doubt anyone cares.
+add_unopt_binary_info(#b_set{op=match_fail}, _Nested, _Where, _UseMap, Acc) ->
Acc;
add_unopt_binary_info(#b_switch{anno=Anno}=I, Nested, Where, _UseMap, Acc) ->
[make_promotion_warning(I, Nested, Anno, Where) | Acc];
diff --git a/lib/compiler/src/beam_ssa_codegen.erl b/lib/compiler/src/beam_ssa_codegen.erl
index 1830f9647e..52874abd19 100644
--- a/lib/compiler/src/beam_ssa_codegen.erl
+++ b/lib/compiler/src/beam_ssa_codegen.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
-export_type([ssa_register/0]).
-include("beam_ssa.hrl").
+-include("beam_asm.hrl").
-import(lists, [foldl/3,keymember/3,keysort/2,map/2,mapfoldl/3,
member/2,reverse/1,reverse/2,sort/1,
@@ -104,11 +105,7 @@ module(#b_module{name=Mod,exports=Es,attributes=Attrs,body=Fs}, _Opts) ->
-type sw_list_item() :: {b_literal(),ssa_label()}.
--type reg_num() :: beam_asm:reg_num().
--type xreg() :: {'x',reg_num()}.
--type yreg() :: {'y',reg_num()}.
-
--type ssa_register() :: xreg() | yreg() | {'fr',reg_num()} | {'z',reg_num()}.
+-type ssa_register() :: xreg() | yreg() | freg() | zreg().
functions(Forms, AtomMod) ->
mapfoldl(fun (F, St) -> function(F, AtomMod, St) end,
@@ -252,7 +249,7 @@ need_heap_blks([], H, Acc) ->
need_heap_is([#cg_alloc{words=Words}=Alloc0|Is], N, Acc) ->
Alloc = Alloc0#cg_alloc{words=add_heap_words(N, Words)},
need_heap_is(Is, #need{}, [Alloc|Acc]);
-need_heap_is([#cg_set{anno=Anno,op=bs_init}=I0|Is], N, Acc) ->
+need_heap_is([#cg_set{anno=Anno,op=bs_create_bin}=I0|Is], N, Acc) ->
Alloc = case need_heap_need(N) of
[#cg_alloc{words=Need}] -> alloc(Need);
[] -> 0
@@ -284,13 +281,11 @@ need_heap_terminator([{_,#cg_blk{is=Is,last=#cg_br{succ=L}}}|_], L, N) ->
[] ->
{[],#need{}};
[_|_]=Alloc ->
- %% If the preceding instructions are a binary construction,
- %% hoist the allocation and incorporate into the bs_init
+ %% If the preceding instruction is a bs_create_bin instruction,
+ %% hoist the allocation and incorporate into the bs_create_bin
%% instruction.
case reverse(Is) of
- [#cg_set{op=succeeded},#cg_set{op=bs_init}|_] ->
- {[],N};
- [#cg_set{op=succeeded},#cg_set{op=bs_put}|_] ->
+ [#cg_set{op=succeeded},#cg_set{op=bs_create_bin}|_] ->
{[],N};
_ ->
%% Not binary construction. Must emit an allocation
@@ -342,8 +337,6 @@ add_heap_float(#need{f=F}=N) ->
classify_heap_need(put_list, _) ->
{put,2};
-classify_heap_need(put_tuple_arity, [#b_literal{val=Words}]) ->
- {put,Words+1};
classify_heap_need(put_tuple, Elements) ->
{put,length(Elements)+1};
classify_heap_need(make_fun, Args) ->
@@ -373,22 +366,16 @@ classify_heap_need(Name, _Args) ->
%% Note: Only handle operations in this function that are not handled
%% by classify_heap_need/2.
-classify_heap_need(bs_add) -> gc;
classify_heap_need(bs_get) -> gc;
classify_heap_need(bs_get_tail) -> gc;
-classify_heap_need(bs_init) -> gc;
classify_heap_need(bs_init_writable) -> gc;
classify_heap_need(bs_match_string) -> gc;
-classify_heap_need(bs_put) -> neutral;
-classify_heap_need(bs_restore) -> neutral;
-classify_heap_need(bs_save) -> neutral;
+classify_heap_need(bs_create_bin) -> gc;
classify_heap_need(bs_get_position) -> gc;
classify_heap_need(bs_set_position) -> neutral;
classify_heap_need(bs_skip) -> gc;
classify_heap_need(bs_start_match) -> gc;
classify_heap_need(bs_test_tail) -> neutral;
-classify_heap_need(bs_utf16_size) -> neutral;
-classify_heap_need(bs_utf8_size) -> neutral;
classify_heap_need(build_stacktrace) -> gc;
classify_heap_need(call) -> gc;
classify_heap_need(catch_end) -> gc;
@@ -404,12 +391,12 @@ classify_heap_need(is_tagged_tuple) -> neutral;
classify_heap_need(kill_try_tag) -> gc;
classify_heap_need(landingpad) -> gc;
classify_heap_need(match_fail) -> gc;
+classify_heap_need(nif_start) -> neutral;
classify_heap_need(nop) -> neutral;
-classify_heap_need(new_try_tag) -> gc;
+classify_heap_need(new_try_tag) -> neutral;
classify_heap_need(old_make_fun) -> gc;
classify_heap_need(peek_message) -> gc;
classify_heap_need(put_map) -> gc;
-classify_heap_need(put_tuple_elements) -> neutral;
classify_heap_need(raw_raise) -> gc;
classify_heap_need(recv_marker_bind) -> neutral;
classify_heap_need(recv_marker_clear) -> neutral;
@@ -682,8 +669,8 @@ get_live(#cg_set{anno=#{live:=Live}}) ->
need_live_anno(Op) ->
case Op of
{bif,_} -> true;
+ bs_create_bin -> true;
bs_get -> true;
- bs_init -> true;
bs_get_position -> true;
bs_get_tail -> true;
bs_start_match -> true;
@@ -806,7 +793,7 @@ need_y_init(#cg_set{anno=#{clobbers:=Clobbers}}) -> Clobbers;
need_y_init(#cg_set{op=bs_get}) -> true;
need_y_init(#cg_set{op=bs_get_position}) -> true;
need_y_init(#cg_set{op=bs_get_tail}) -> true;
-need_y_init(#cg_set{op=bs_init}) -> true;
+need_y_init(#cg_set{op=bs_create_bin}) -> true;
need_y_init(#cg_set{op=bs_skip,args=[#b_literal{val=Type}|_]}) ->
case Type of
utf8 -> true;
@@ -892,7 +879,7 @@ opt_allocate_is([]) -> none.
%% fix_wait_timeout([Block]) -> [Block].
%% In SSA code, the `wait_timeout` instruction is a three-way branch
%% (because there will be an exception for a bad timeout value). In
-%% BEAM code, the potential rasing of an exception for a bad timeout
+%% BEAM code, the potential raising of an exception for a bad timeout
%% duration is not explicitly represented. Thus we will need to
%% rewrite the following code:
%%
@@ -1052,7 +1039,8 @@ cg_block([#cg_set{op=new_try_tag,dst=Tag,args=Args}], {Tag,Fail0}, St) ->
{[{Kind,Reg,Fail}],St};
cg_block([#cg_set{anno=Anno,op={bif,Name},dst=Dst0,args=Args0}=I,
#cg_set{op=succeeded,dst=Bool}], {Bool,Fail0}, St) ->
- [Dst|Args] = beam_args([Dst0|Args0], St),
+ Args = typed_args(Args0, Anno, St),
+ Dst = beam_arg(Dst0, St),
Line0 = call_line(body, {extfunc,erlang,Name,length(Args)}, Anno),
Fail = bif_fail(Fail0),
Line = case Fail of
@@ -1083,9 +1071,10 @@ cg_block([#cg_set{op={bif,tuple_size},dst=Arity0,args=[Tuple0]},
{Is,St} = cg_block([Eq], Context, St0),
{[TupleSize|Is],St}
end;
-cg_block([#cg_set{op={bif,Name},dst=Dst0,args=Args0}]=Is0, {Dst0,Fail}, St0) ->
- [Dst|Args] = beam_args([Dst0|Args0], St0),
- case Dst of
+cg_block([#cg_set{anno=Anno,op={bif,Name},dst=Dst0,args=Args0}]=Is0,
+ {Dst0,Fail}, St0) ->
+ Args = typed_args(Args0, Anno, St0),
+ case beam_arg(Dst0, St0) of
{z,_} ->
%% The result of the BIF call will only be used once. Convert to
%% a test instruction.
@@ -1100,7 +1089,8 @@ cg_block([#cg_set{op={bif,Name},dst=Dst0,args=Args0}]=Is0, {Dst0,Fail}, St0) ->
end;
cg_block([#cg_set{anno=Anno,op={bif,Name},dst=Dst0,args=Args0}=I|T],
Context, St0) ->
- [Dst|Args] = beam_args([Dst0|Args0], St0),
+ Args = typed_args(Args0, Anno, St0),
+ Dst = beam_arg(Dst0, St0),
{Is0,St} = cg_block(T, Context, St0),
case is_gc_bif(Name, Args) of
true ->
@@ -1113,47 +1103,31 @@ cg_block([#cg_set{anno=Anno,op={bif,Name},dst=Dst0,args=Args0}=I|T],
Is = [{bif,Name,{f,0},Args,Dst}|Is0],
{Is,St}
end;
-cg_block([#cg_set{op=bs_init,dst=Dst0,args=Args0,anno=Anno}=I,
+cg_block([#cg_set{op=bs_create_bin,dst=Dst0,args=Args0,anno=Anno}=I,
#cg_set{op=succeeded,dst=Bool}], {Bool,Fail0}, St) ->
+ Args1 = typed_args(Args0, Anno, St),
Fail = bif_fail(Fail0),
Line = line(Anno),
Alloc = map_get(alloc, Anno),
- [#b_literal{val=Kind}|Args1] = Args0,
Live = get_live(I),
- case Kind of
- new ->
- [Dst,Size,{integer,Unit}] = beam_args([Dst0|Args1], St),
- {[Line|cg_bs_init(Dst, Size, Alloc, Unit, Live, Fail)],St};
- private_append ->
- [Dst,Src,Bits,{integer,Unit}] = beam_args([Dst0|Args1], St),
- Flags = {field_flags,[]},
- TestHeap = {test_heap,Alloc,Live},
- BsPrivateAppend = {bs_private_append,Fail,Bits,Unit,Src,Flags,Dst},
- Is = [TestHeap,Line,BsPrivateAppend],
- {Is,St};
- append ->
- [Dst,Src,Bits,{integer,Unit}] = beam_args([Dst0|Args1], St),
- Flags = {field_flags,[]},
- Is = [Line,{bs_append,Fail,Bits,Alloc,Live,Unit,Src,Flags,Dst}],
- {Is,St}
- end;
-cg_block([#cg_set{anno=Anno,
- op=bs_start_match,
+ Dst = beam_arg(Dst0, St),
+ Args = bs_args(Args1),
+ Unit = case Args of
+ [{atom,append},_Seg,U|_] -> U;
+ [{atom,private_append},_Seg,U|_] -> U;
+ _ -> 1
+ end,
+ Is = [Line,{bs_create_bin,Fail,Alloc,Live,Unit,Dst,{list,Args}}],
+ {Is,St};
+cg_block([#cg_set{op=bs_start_match,
dst=Ctx0,
args=[#b_literal{val=new},Bin0]}=I,
#cg_set{op=succeeded,dst=Bool}], {Bool,Fail}, St) ->
[Dst,Bin1] = beam_args([Ctx0,Bin0], St),
{Bin,Pre} = force_reg(Bin1, Dst),
Live = get_live(I),
- %% num_slots is only set when using the old instructions.
- case maps:find(num_slots, Anno) of
- {ok, Slots} ->
- Is = Pre ++ [{test,bs_start_match2,Fail,Live,[Bin,Slots],Dst}],
- {Is,St};
- error ->
- Is = Pre ++ [{test,bs_start_match3,Fail,Live,[Bin],Dst}],
- {Is,St}
- end;
+ Is = Pre ++ [{test,bs_start_match3,Fail,Live,[Bin],Dst}],
+ {Is,St};
cg_block([#cg_set{op=bs_get}=Set,
#cg_set{op=succeeded,dst=Bool}], {Bool,Fail}, St) ->
{cg_bs_get(Fail, Set, St),St};
@@ -1169,10 +1143,6 @@ cg_block([#cg_set{op=bs_match_string,args=[CtxVar,#b_literal{val=String0}]},
Is = [{test,bs_match_string,Fail,[CtxReg,Bits,{string,String}]}],
{Is,St};
-cg_block([#cg_set{op=bs_put,args=Args0},
- #cg_set{op=succeeded,dst=Bool}], {Bool,Fail}, St) ->
- Args = beam_args(Args0, St),
- {cg_bs_put(bif_fail(Fail), Args),St};
cg_block([#cg_set{dst=Dst0,op=landingpad,args=Args0}|T], Context, St0) ->
[Dst,{atom,Kind},Tag] = beam_args([Dst0|Args0], St0),
case Kind of
@@ -1197,11 +1167,18 @@ cg_block([#cg_set{op=match_fail}=I,
#cg_set{op=succeeded,dst=Bool}], {Bool,_Fail}, St) ->
%% A match_fail instruction in a try/catch block.
cg_block([I], none, St);
-cg_block([#cg_set{op=get_map_element,dst=Dst0,args=Args0},
+cg_block([#cg_set{op=get_map_element,dst=Dst0,args=Args0,anno=Anno},
#cg_set{op=succeeded,dst=Bool}], {Bool,Fail0}, St) ->
- [Dst,Map,Key] = beam_args([Dst0|Args0], St),
+ [Map,Key] = typed_args(Args0, Anno, St),
+ Dst = beam_arg(Dst0, St),
Fail = ensure_label(Fail0, St),
{[{get_map_elements,Fail,Map,{list,[Key,Dst]}}],St};
+cg_block([#cg_set{op={float,convert},dst=Dst0,args=Args0,anno=Anno},
+ #cg_set{op=succeeded,dst=Bool}], {Bool,Fail}, St) ->
+ {f,0} = bif_fail(Fail), %Assertion.
+ [Src] = typed_args(Args0, Anno, St),
+ Dst = beam_arg(Dst0, St),
+ {[line(Anno),{fconv,Src,Dst}], St};
cg_block([#cg_set{op=Op,dst=Dst0,args=Args0}=I,
#cg_set{op=succeeded,dst=Bool}], {Bool,Fail}, St) ->
[Dst|Args] = beam_args([Dst0|Args0], St),
@@ -1209,9 +1186,19 @@ cg_block([#cg_set{op=Op,dst=Dst0,args=Args0}=I,
cg_block([#cg_set{op=bs_test_tail,dst=Bool,args=Args0}], {Bool,Fail}, St) ->
[Ctx,{integer,Bits}] = beam_args(Args0, St),
{[{test,bs_test_tail2,bif_fail(Fail),[Ctx,Bits]}],St};
-cg_block([#cg_set{op=is_tagged_tuple,dst=Bool,args=Args0}], {Bool,Fail}, St) ->
- [Src,{integer,Arity},Tag] = beam_args(Args0, St),
- {[{test,is_tagged_tuple,ensure_label(Fail, St),[Src,Arity,Tag]}],St};
+cg_block([#cg_set{op=is_tagged_tuple,anno=Anno,dst=Bool,args=Args0}], {Bool,Fail}, St) ->
+ case Anno of
+ #{constraints := arity} ->
+ [Src,{integer,Arity},_Tag] = beam_args(Args0, St),
+ {[{test,test_arity,ensure_label(Fail, St),[Src,Arity]}],St};
+ #{constraints := tuple_arity} ->
+ [Src,{integer,Arity},_Tag] = beam_args(Args0, St),
+ {[{test,is_tuple,ensure_label(Fail, St),[Src]},
+ {test,test_arity,ensure_label(Fail, St),[Src,Arity]}],St};
+ #{} ->
+ [Src,{integer,Arity},Tag] = typed_args(Args0, Anno, St),
+ {[{test,is_tagged_tuple,ensure_label(Fail, St),[Src,Arity,Tag]}],St}
+ end;
cg_block([#cg_set{op=is_nonempty_list,dst=Bool,args=Args0}], {Bool,Fail}, St) ->
Args = beam_args(Args0, St),
{[{test,is_nonempty_list,ensure_label(Fail, St),Args}],St};
@@ -1332,6 +1319,32 @@ cg_block([], {Bool0,Fail}, St) ->
[Bool] = beam_args([Bool0], St),
{[{test,is_eq_exact,Fail,[Bool,{atom,true}]}],St}.
+bs_args([{atom,binary},{literal,[1|_]},{literal,Bs},{atom,all}|Args])
+ when bit_size(Bs) =:= 0 ->
+ bs_args(Args);
+bs_args([{atom,binary},{literal,[1|_]}=UFs,{literal,Bs},{atom,all}|Args0])
+ when is_bitstring(Bs) ->
+ Bits = bit_size(Bs),
+ Bytes = Bits div 8,
+ case Bits rem 8 of
+ 0 ->
+ [{atom,string},0,8,nil,{string,Bs},{integer,byte_size(Bs)}|bs_args(Args0)];
+ Rem ->
+ <<Binary:Bytes/bytes,Int:Rem>> = Bs,
+ Args = [{atom,binary},UFs,{literal,Binary},{atom,all},
+ {atom,integer},{literal,[1]},{integer,Int},{integer,Rem}|Args0],
+ bs_args(Args)
+ end;
+bs_args([Type,{literal,[Unit|Fs0]},Val,Size|Args]) ->
+ Segment = proplists:get_value(segment, Fs0, 0),
+ Fs1 = proplists:delete(segment, Fs0),
+ Fs = case Fs1 of
+ [] -> nil;
+ [_|_] -> {literal,Fs1}
+ end,
+ [Type,Segment,Unit,Fs,Val,Size|bs_args(Args)];
+bs_args([]) -> [].
+
cg_copy(T0, St) ->
{Copies,T} = splitwith(fun(#cg_set{op=copy}) -> true;
(_) -> false
@@ -1564,13 +1577,20 @@ cg_call(#cg_set{anno=Anno0,op=call,dst=Dst0,args=[#b_remote{}=Func0|Args0]},
[line(Anno0)] ++ Apply,
{Is,St}
end;
-cg_call(#cg_set{anno=Anno,op=call,dst=Dst0,args=Args0},
- Where, Context, St) ->
- [Dst,Func|Args] = beam_args([Dst0|Args0], St),
+cg_call(#cg_set{anno=Anno,op=call,dst=Dst0,args=[Func | Args0]},
+ Where, Context, St0) ->
Line = call_line(Where, Func, Anno),
- Arity = length(Args),
- Call = build_call(call_fun, Arity, Func, Context, Dst),
- Is = setup_args(Args++[Func], Anno, Context, St) ++ Line ++ Call,
+ Args = beam_args(Args0 ++ [Func], St0),
+
+ Arity = length(Args0),
+ Dst = beam_arg(Dst0, St0),
+
+ %% Note that we only inspect the (possible) type of the fun while building
+ %% the call, we don't want the arguments to be typed.
+ [TypedFunc] = typed_args([Func], Anno, St0),
+ {Call, St} = build_fun_call(Arity, TypedFunc, Context, Dst, St0),
+
+ Is = setup_args(Args, Anno, Context, St) ++ Line ++ Call,
case Anno of
#{ result_type := Type } ->
Info = {var_info, Dst, [{type,Type}]},
@@ -1615,12 +1635,6 @@ build_stk([V|Vs], TmpReg, Tail) ->
build_stk([], _TmpReg, nil) ->
[{move,nil,{x,1}}].
-build_call(call_fun, Arity, _Func, none, Dst) ->
- [{call_fun,Arity}|copy({x,0}, Dst)];
-build_call(call_fun, Arity, _Func, {return,Dst,N}, Dst) when is_integer(N) ->
- [{call_fun,Arity},{deallocate,N},return];
-build_call(call_fun, Arity, _Func, {return,Val,N}, _Dst) when is_integer(N) ->
- [{call_fun,Arity},{move,Val,{x,0}},{deallocate,N},return];
build_call(call_ext, 2, {extfunc,erlang,'!',2}, none, Dst) ->
[send|copy({x,0}, Dst)];
build_call(call_ext, 2, {extfunc,erlang,'!',2}, {return,Dst,N}, Dst)
@@ -1646,6 +1660,42 @@ build_call(I, Arity, Func, {return,Val,N}, _Dst) when is_integer(N) ->
build_call(I, Arity, Func, none, Dst) ->
[{I,Arity,Func}|copy({x,0}, Dst)].
+build_fun_call(Arity, #tr{}=Func0, none, Dst, St0) ->
+ %% Func0 was the source register prior to copying arguments, and has been
+ %% moved to {x, Arity}. Update it to match.
+ Func = Func0#tr{r={x,Arity}},
+ {Tag, St} = fun_call_tag(Arity, Func, St0),
+ Is = [{call_fun2,Tag,Arity,Func}|copy({x,0}, Dst)],
+ {Is, St};
+build_fun_call(Arity, #tr{}=Func0, {return,Dst,N}, Dst, St0)
+ when is_integer(N) ->
+ Func = Func0#tr{r={x,Arity}},
+ {Tag, St} = fun_call_tag(Arity, Func, St0),
+ Is = [{call_fun2,Tag,Arity,Func},{deallocate,N},return],
+ {Is, St};
+build_fun_call(Arity, #tr{}=Func0, {return,Val,N}, _Dst, St0)
+ when is_integer(N) ->
+ Func = Func0#tr{r={x,Arity}},
+ {Tag, St} = fun_call_tag(Arity, Func, St0),
+ Is = [{call_fun2,Tag,Arity,Func},
+ {move,Val,{x,0}},
+ {deallocate,N},return],
+ {Is, St};
+build_fun_call(Arity, _Func, none, Dst, St) ->
+ {[{call_fun,Arity}|copy({x,0}, Dst)], St};
+build_fun_call(Arity, _Func, {return,Dst,N}, Dst, St) when is_integer(N) ->
+ {[{call_fun,Arity},{deallocate,N},return], St};
+build_fun_call(Arity, _Func, {return,Val,N}, _Dst, St) when is_integer(N) ->
+ {[{call_fun,Arity},{move,Val,{x,0}},{deallocate,N},return], St}.
+
+fun_call_tag(Arity, #tr{t=#t_fun{arity=Arity,target={Name,TotalArity}}}, St0) ->
+ {FuncLbl, St} = local_func_label(Name, TotalArity, St0),
+ {{f,FuncLbl}, St};
+fun_call_tag(Arity, #tr{t=#t_fun{arity=Arity}}, St) ->
+ {{atom,safe}, St};
+fun_call_tag(_Arity, _Func, St) ->
+ {{atom,unsafe}, St}.
+
build_apply(Arity, {return,Dst,N}, Dst) when is_integer(N) ->
[{apply_last,Arity,N}];
build_apply(Arity, {return,Val,N}, _Dst) when is_integer(N) ->
@@ -1669,21 +1719,19 @@ cg_instr(bs_get_position, [Ctx], Dst, Set) ->
cg_instr(put_map, [{atom,assoc},SrcMap|Ss], Dst, Set) ->
Live = get_live(Set),
[{put_map_assoc,{f,0},SrcMap,Dst,Live,{list,Ss}}];
+cg_instr(is_nonempty_list, Ss, Dst, Set) ->
+ #cg_set{anno=#{was_bif_is_list := true}} = Set, %Assertion.
+
+ %% This instruction was a call to is_list/1, which was rewritten
+ %% to an is_nonempty_list test by beam_ssa_type. BEAM has no
+ %% is_nonempty_list instruction that will return a boolean, so
+ %% we must revert it to an is_list/1 call.
+ [{bif,is_list,{f,0},Ss,Dst}];
cg_instr(Op, Args, Dst, _Set) ->
cg_instr(Op, Args, Dst).
cg_instr(bs_init_writable, Args, Dst) ->
setup_args(Args) ++ [bs_init_writable|copy({x,0}, Dst)];
-cg_instr(bs_restore, [Ctx,Slot], _Dst) ->
- case Slot of
- {integer,N} ->
- [{bs_restore2,Ctx,N}];
- {atom,start} ->
- [{bs_restore2,Ctx,Slot}]
- end;
-cg_instr(bs_save, [Ctx,Slot], _Dst) ->
- {integer,N} = Slot,
- [{bs_save2,Ctx,N}];
cg_instr(bs_set_position, [Ctx,Pos], _Dst) ->
[{bs_set_position,Ctx,Pos}];
cg_instr(build_stacktrace, Args, Dst) ->
@@ -1702,16 +1750,14 @@ cg_instr(get_tuple_element=Op, [Src,{integer,N}], Dst) ->
[{Op,Src,N,Dst}];
cg_instr(has_map_field, [Map,Key], Dst) ->
[{bif,is_map_key,{f,0},[Key,Map],Dst}];
+cg_instr(nif_start, [], _Dst) ->
+ [nif_start];
cg_instr(put_list=Op, [Hd,Tl], Dst) ->
[{Op,Hd,Tl,Dst}];
cg_instr(nop, [], _Dst) ->
[];
cg_instr(put_tuple, Elements, Dst) ->
[{put_tuple2,Dst,{list,Elements}}];
-cg_instr(put_tuple_arity, [{integer,Arity}], Dst) ->
- [{put_tuple,Arity,Dst}];
-cg_instr(put_tuple_elements, Elements, _Dst) ->
- [{put,E} || E <- Elements];
cg_instr(raw_raise, Args, Dst) ->
setup_args(Args) ++ [raw_raise|copy({x,0}, Dst)];
cg_instr(recv_marker_bind, [Mark, Ref], _Dst) ->
@@ -1725,17 +1771,8 @@ cg_instr(remove_message, [], _Dst) ->
cg_instr(resume, [A,B], _Dst) ->
[{bif,raise,{f,0},[A,B],{x,0}}].
-cg_test(bs_add=Op, Fail, [Src1,Src2,{integer,Unit}], Dst, _I) ->
- [{Op,Fail,[Src1,Src2,Unit],Dst}];
cg_test(bs_skip, Fail, Args, _Dst, I) ->
cg_bs_skip(Fail, Args, I);
-cg_test(bs_utf8_size=Op, Fail, [Src], Dst, _I) ->
- [{Op,Fail,Src,Dst}];
-cg_test(bs_utf16_size=Op, Fail, [Src], Dst, _I) ->
- [{Op,Fail,Src,Dst}];
-cg_test({float,convert}, Fail, [Src], Dst, #cg_set{anno=Anno}) ->
- {f,0} = Fail, %Assertion.
- [line(Anno),{fconv,Src,Dst}];
cg_test({float,Op0}, Fail, Args, Dst, #cg_set{anno=Anno}) ->
Op = case Op0 of
'+' -> fadd;
@@ -1749,7 +1786,11 @@ cg_test(peek_message, Fail, [], Dst, _I) ->
[{loop_rec,Fail,{x,0}}|copy({x,0}, Dst)];
cg_test(put_map, Fail, [{atom,exact},SrcMap|Ss], Dst, #cg_set{anno=Anno}=Set) ->
Live = get_live(Set),
- [line(Anno),{put_map_exact,Fail,SrcMap,Dst,Live,{list,Ss}}].
+ [line(Anno),{put_map_exact,Fail,SrcMap,Dst,Live,{list,Ss}}];
+cg_test(raw_raise, _Fail, Args, Dst, _I) ->
+ cg_instr(raw_raise, Args, Dst);
+cg_test(resume, _Fail, [_,_]=Args, Dst, _I) ->
+ cg_instr(resume, Args, Dst).
cg_bs_get(Fail, #cg_set{dst=Dst0,args=[#b_literal{val=Type}|Ss0]}=Set, St) ->
Op = case Type of
@@ -1802,34 +1843,6 @@ field_flags(Flags, #cg_set{anno=#{location:={File,Line}}}) ->
field_flags(Flags, _) ->
{field_flags,Flags}.
-cg_bs_put(Fail, [{atom,Type},{literal,Flags}|Args]) ->
- Op = case Type of
- integer -> bs_put_integer;
- float -> bs_put_float;
- binary -> bs_put_binary;
- utf8 -> bs_put_utf8;
- utf16 -> bs_put_utf16;
- utf32 -> bs_put_utf32
- end,
- case Args of
- [Src,Size,{integer,Unit}] ->
- [{Op,Fail,Size,Unit,{field_flags,Flags},Src}];
- [Src] ->
- [{Op,Fail,{field_flags,Flags},Src}]
- end.
-
-cg_bs_init(Dst, Size0, Alloc, Unit, Live, Fail) ->
- Op = case Unit of
- 1 -> bs_init_bits;
- 8 -> bs_init2
- end,
- Size = cg_bs_init_size(Size0),
- [{Op,Fail,Size,Alloc,Live,{field_flags,[]},Dst}].
-
-cg_bs_init_size({x,_}=R) -> R;
-cg_bs_init_size({y,_}=R) -> R;
-cg_bs_init_size({integer,Int}) -> Int.
-
cg_catch(Agg, T0, Context, St0) ->
{Moves,T1} = cg_extract(T0, Agg, St0),
{T,St} = cg_block(T1, Context, St0),
@@ -1855,6 +1868,9 @@ cg_extract([#cg_set{op=extract,dst=Dst0,args=Args0}|Is0], Agg, St) ->
cg_extract(Is, _, _) ->
{[],Is}.
+-spec copy(Src, Dst) -> [{move,Src,Dst}] when
+ Src :: beam_reg() | beam_literal(),
+ Dst :: beam_reg().
copy(Src, Src) -> [];
copy(Src, Dst) -> [{move,Src,Dst}].
@@ -2094,6 +2110,20 @@ get_register(V, Regs) ->
false -> maps:get(V, Regs)
end.
+typed_args(As, Anno, St) ->
+ typed_args_1(As, Anno, St, 0).
+
+typed_args_1([Arg | Args], Anno, St, Index) ->
+ case Anno of
+ #{ arg_types := #{ Index := Type } } ->
+ Typed = #tr{r=beam_arg(Arg, St),t=Type},
+ [Typed | typed_args_1(Args, Anno, St, Index + 1)];
+ #{} ->
+ [beam_arg(Arg, St) | typed_args_1(Args, Anno, St, Index + 1)]
+ end;
+typed_args_1([], _Anno, _St, _Index) ->
+ [].
+
beam_args(As, St) ->
[beam_arg(A, St) || A <- As].
diff --git a/lib/compiler/src/beam_ssa_dead.erl b/lib/compiler/src/beam_ssa_dead.erl
index abf287601c..2c0384704e 100644
--- a/lib/compiler/src/beam_ssa_dead.erl
+++ b/lib/compiler/src/beam_ssa_dead.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,24 +27,24 @@
-export([opt/1]).
-include("beam_ssa.hrl").
--import(lists, [append/1,keymember/3,last/1,member/2,
- reverse/1,takewhile/2]).
+-import(lists, [append/1,foldl/3,keymember/3,last/1,member/2,
+ reverse/1,reverse/2,takewhile/2]).
-type used_vars() :: #{beam_ssa:label():=sets:set(beam_ssa:var_name())}.
-type basic_type_test() :: atom() | {'is_tagged_tuple',pos_integer(),atom()}.
-type type_test() :: basic_type_test() | {'not',basic_type_test()}.
-type op_name() :: atom().
--type basic_rel_op() :: {op_name(),beam_ssa:b_var(),beam_ssa:value()} |
- {basic_type_test(),beam_ssa:value()}.
--type rel_op() :: {op_name(),beam_ssa:b_var(),beam_ssa:value()} |
- {type_test(),beam_ssa:value()}.
+-type basic_test() :: {op_name(),beam_ssa:b_var(),beam_ssa:value()} |
+ {basic_type_test(),beam_ssa:value()}.
+-type test() :: {op_name(),beam_ssa:b_var(),beam_ssa:value()} |
+ {type_test(),beam_ssa:value()}.
-record(st,
{bs :: beam_ssa:block_map(),
us :: used_vars(),
skippable :: #{beam_ssa:label():='true'},
- rel_op=none :: 'none' | rel_op(),
+ test=none :: 'none' | test(),
target=any :: 'any' | 'one_way' | beam_ssa:label()
}).
@@ -54,13 +54,13 @@
Label :: beam_ssa:label(),
Block :: beam_ssa:b_blk().
-opt(Linear) ->
- {Used,Skippable} = used_vars(Linear),
- Blocks0 = maps:from_list(Linear),
+opt(Linear0) ->
+ {Used,Skippable} = used_vars(Linear0),
+ Blocks0 = maps:from_list(Linear0),
St0 = #st{bs=Blocks0,us=Used,skippable=Skippable},
St = shortcut_opt(St0),
#st{bs=Blocks} = combine_eqs(St#st{us=#{}}),
- beam_ssa:linearize(Blocks).
+ opt_redundant_tests(Blocks).
%%%
%%% Shortcut br/switch targets.
@@ -116,20 +116,20 @@ shortcut_opt([], St) -> St.
shortcut_terminator(#b_br{bool=#b_literal{val=true},succ=Succ0},
_Is, From, St0) ->
- St = St0#st{rel_op=none},
+ St = St0#st{test=none},
shortcut(Succ0, From, #{}, St);
shortcut_terminator(#b_br{bool=#b_var{}=Bool,succ=Succ0,fail=Fail0}=Br,
Is, From, St0) ->
St = St0#st{target=one_way},
- RelOp = get_rel_op(Bool, Is),
+ Test = get_test(Bool, Is),
%% The boolean in a `br` is seldom used by the successors. By
%% not binding its value unless it is actually used we might be able
%% to skip some work in shortcut/4 and sub/2.
SuccBs = bind_var_if_used(Succ0, Bool, #b_literal{val=true}, St),
- BrSucc = shortcut(Succ0, From, SuccBs, St#st{rel_op=RelOp}),
+ BrSucc = shortcut(Succ0, From, SuccBs, St#st{test=Test}),
FailBs = bind_var_if_used(Fail0, Bool, #b_literal{val=false}, St),
- BrFail = shortcut(Fail0, From, FailBs, St#st{rel_op=invert_op(RelOp)}),
+ BrFail = shortcut(Fail0, From, FailBs, St#st{test=invert_test(Test)}),
case {BrSucc,BrFail} of
{#b_br{bool=#b_literal{val=true},succ=Succ},
@@ -158,8 +158,8 @@ shortcut_sw_fail(Fail0, List, Bool, From, St0) ->
case List of
[{#b_literal{val=false},_},
{#b_literal{val=true},_}] ->
- RelOp = {{'not',is_boolean},Bool},
- St = St0#st{rel_op=RelOp,target=one_way},
+ Test = {{'not',is_boolean},Bool},
+ St = St0#st{test=Test,target=one_way},
#b_br{bool=#b_literal{val=true},succ=Fail} =
shortcut(Fail0, From, #{}, St),
Fail;
@@ -168,18 +168,19 @@ shortcut_sw_fail(Fail0, List, Bool, From, St0) ->
end.
shortcut_sw_list([{Lit,L0}|T], Bool, From, St0) ->
- RelOp = {'=:=',Bool,Lit},
- St = St0#st{rel_op=RelOp},
+ Test = {'=:=',Bool,Lit},
+ St = St0#st{test=Test},
#b_br{bool=#b_literal{val=true},succ=L} =
shortcut(L0, From, bind_var(Bool, Lit, #{}), St#st{target=one_way}),
[{Lit,L}|shortcut_sw_list(T, Bool, From, St0)];
shortcut_sw_list([], _, _, _) -> [].
-shortcut(L, _From, Bs, #st{rel_op=none,target=one_way}) when map_size(Bs) =:= 0 ->
- %% There is no way that we can find a suitable branch, because there is no
- %% relational operator stored, there are no bindings, and the block L can't
- %% have any phi nodes from which we could pick bindings because when the target
- %% is `one_way`, it implies the From block has a two-way `br` terminator.
+shortcut(L, _From, Bs, #st{test=none,target=one_way}) when map_size(Bs) =:= 0 ->
+ %% There is no way that we can find a suitable branch, because
+ %% there are no stored tests, there are no bindings, and the block
+ %% L can't have any phi nodes from which we could pick bindings
+ %% because when the target is `one_way`, it implies that the From
+ %% block has a two-way `br` terminator.
#b_br{bool=#b_literal{val=true},succ=L,fail=L};
shortcut(L, From, Bs, St) ->
shortcut_1(L, From, Bs, sets:new([{version, 2}]), St).
@@ -463,7 +464,7 @@ eval_is([#b_set{op={bif,_},dst=Dst}=I0|Is], From, Bs, St) ->
eval_is([#b_set{op=Op,dst=Dst}=I|Is], From, Bs, St)
when Op =:= is_tagged_tuple; Op =:= is_nonempty_list ->
#b_set{args=Args} = sub(I, Bs),
- case eval_rel_op(Op, Args, St) of
+ case eval_test(Op, Args, St) of
#b_literal{}=Val ->
eval_is(Is, From, bind_var(Dst, Val, Bs), St);
none ->
@@ -524,7 +525,7 @@ eval_terminator(#b_switch{arg=Arg,fail=Fail,list=List}=Sw, Bs, St) ->
eval_terminator(#b_ret{}, _Bs, _St) ->
none.
-eval_switch(List, Arg, #st{rel_op={_,Arg,_}=PrevOp}, Fail) ->
+eval_switch(List, Arg, #st{test={_,Arg,_}=PrevOp}, Fail) ->
%% There is a previous relational operator testing the same variable.
%% Optimization may be possible.
eval_switch_1(List, Arg, PrevOp, Fail);
@@ -534,15 +535,15 @@ eval_switch(_, _, _, _) ->
none.
eval_switch_1([{Lit,Lbl}|T], Arg, PrevOp, Fail) ->
- RelOp = {'=:=',Arg,Lit},
- case will_succeed(PrevOp, RelOp) of
+ Test = {'=:=',Arg,Lit},
+ case will_succeed(PrevOp, Test) of
yes ->
%% Success. This branch will always be taken.
Lbl;
no ->
%% This branch will never be taken.
eval_switch_1(T, Arg, PrevOp, Fail);
- maybe ->
+ 'maybe' ->
%% This label could be reached.
eval_switch_1(T, Arg, PrevOp, none)
end;
@@ -577,7 +578,7 @@ eval_bif(#b_set{op={bif,Bif},args=Args}, St) ->
none ->
%% Not literal arguments. Try to evaluate
%% it based on a previous relational operator.
- eval_rel_op({bif,Bif}, Args, St);
+ eval_test({bif,Bif}, Args, St);
LitArgs ->
try apply(erlang, Bif, LitArgs) of
Val -> #b_literal{val=Val}
@@ -602,61 +603,61 @@ get_lit_args(_) -> none.
%%% Handling of relational operators.
%%%
-get_rel_op(Bool, [_|_]=Is) ->
+get_test(Bool, [_|_]=Is) ->
case last(Is) of
#b_set{op=Op,dst=Bool,args=Args} ->
- normalize_op(Op, Args);
+ normalize_test(Op, Args);
#b_set{} ->
none
end;
-get_rel_op(_, []) -> none.
+get_test(_, []) -> none.
-%% normalize_op(Instruction) -> {Normalized,FailLabel} | error
+%% normalize_test(Instruction) -> {Normalized,FailLabel} | error
%% Normalized = {Operator,Variable,Variable|Literal} |
%% {TypeTest,Variable}
-%% Operation = '<' | '=<' | '=:=' | '=/=' | '>=' | '>'
+%% Operation = '<' | '=<' | '=:=' | '=/=' | '>=' | '>' | '==' | '/='
%% TypeTest = is_atom | is_integer ...
%% Variable = #b_var{}
%% Literal = #b_literal{}
%%
-%% Normalize a relational operator to facilitate further
-%% comparisons between operators. Always make the register
-%% operand the first operand. If there are two registers,
-%% order the registers in lexical order.
+%% Normalize type tests and relational operators to facilitate
+%% further comparisons between test. Always make the register
+%% operand the first operand. If there are two registers, order the
+%% registers in lexical order.
%%
%% For example, this instruction:
%%
-%% #b_set{op={bif,=<},args=[#b_literal{}, #b_var{}}
+%% #b_set{op={bif,'<'},args=[#b_literal{}, #b_var{}}
%%
%% will be normalized to:
%%
-%% {'=<',#b_var{},#b_literal{}}
+%% {'>',#b_var{},#b_literal{}}
--spec normalize_op(Op, Args) -> NormalizedOp | 'none' when
+-spec normalize_test(Op, Args) -> NormalizedTest | 'none' when
Op :: beam_ssa:op(),
Args :: [beam_ssa:value()],
- NormalizedOp :: basic_rel_op().
+ NormalizedTest :: basic_test().
-normalize_op(is_tagged_tuple, [Arg,#b_literal{val=Size},#b_literal{val=Tag}])
+normalize_test(is_tagged_tuple, [Arg,#b_literal{val=Size},#b_literal{val=Tag}])
when is_integer(Size), is_atom(Tag) ->
{{is_tagged_tuple,Size,Tag},Arg};
-normalize_op(is_nonempty_list, [Arg]) ->
+normalize_test(is_nonempty_list, [Arg]) ->
{is_nonempty_list,Arg};
-normalize_op({bif,Bif}, [Arg]) ->
+normalize_test({bif,Bif}, [Arg]) ->
case erl_internal:new_type_test(Bif, 1) of
true -> {Bif,Arg};
false -> none
end;
-normalize_op({bif,Bif}, [_,_]=Args) ->
+normalize_test({bif,Bif}, [_,_]=Args) ->
case erl_internal:comp_op(Bif, 2) of
true ->
- normalize_op_1(Bif, Args);
+ normalize_test_1(Bif, Args);
false ->
none
end;
-normalize_op(_, _) -> none.
+normalize_test(_, _) -> none.
-normalize_op_1(Bif, Args) ->
+normalize_test_1(Bif, Args) ->
case Args of
[#b_literal{}=Arg1,#b_var{}=Arg2] ->
{turn_op(Bif),Arg2,Arg1};
@@ -670,22 +671,22 @@ normalize_op_1(Bif, Args) ->
none
end.
--spec invert_op(basic_rel_op() | 'none') -> rel_op() | 'none'.
+-spec invert_test(basic_test() | 'none') -> test() | 'none'.
-invert_op({Op,Arg1,Arg2}) ->
- {invert_op_1(Op),Arg1,Arg2};
-invert_op({TypeTest,Arg}) ->
+invert_test({Op,Arg1,Arg2}) ->
+ {invert_op(Op),Arg1,Arg2};
+invert_test({TypeTest,Arg}) ->
{{'not',TypeTest},Arg};
-invert_op(none) -> none.
+invert_test(none) -> none.
-invert_op_1('>=') -> '<';
-invert_op_1('<') -> '>=';
-invert_op_1('=<') -> '>';
-invert_op_1('>') -> '=<';
-invert_op_1('=:=') -> '=/=';
-invert_op_1('=/=') -> '=:=';
-invert_op_1('==') -> '/=';
-invert_op_1('/=') -> '=='.
+invert_op('>=') -> '<';
+invert_op('<') -> '>=';
+invert_op('=<') -> '>';
+invert_op('>') -> '=<';
+invert_op('=:=') -> '=/=';
+invert_op('=/=') -> '=:=';
+invert_op('==') -> '/=';
+invert_op('/=') -> '=='.
turn_op('<') -> '>';
turn_op('=<') -> '>=';
@@ -696,21 +697,21 @@ turn_op('=/='=Op) -> Op;
turn_op('=='=Op) -> Op;
turn_op('/='=Op) -> Op.
-eval_rel_op(_Bif, _Args, #st{rel_op=none}) ->
+eval_test(_Bif, _Args, #st{test=none}) ->
none;
-eval_rel_op(Bif, Args, #st{rel_op=Prev}) ->
- case normalize_op(Bif, Args) of
+eval_test(Bif, Args, #st{test=Prev}) ->
+ case normalize_test(Bif, Args) of
none ->
none;
- RelOp ->
- case will_succeed(Prev, RelOp) of
+ Test ->
+ case will_succeed(Prev, Test) of
yes -> #b_literal{val=true};
no -> #b_literal{val=false};
- maybe -> none
+ 'maybe' -> none
end
end.
-%% will_succeed(PrevCondition, Condition) -> yes | no | maybe
+%% will_succeed(PrevCondition, Condition) -> yes | no | 'maybe'
%% PrevCondition is a condition known to be true. This function
%% will tell whether Condition will succeed.
@@ -732,29 +733,29 @@ will_succeed({{'not',is_boolean},Var}, {'=:=',Var,#b_literal{val=Lit}})
when is_boolean(Lit) ->
no;
will_succeed({_,_}, {_,_}) ->
- maybe;
+ 'maybe';
will_succeed({_,_}, {_,_,_}) ->
- maybe;
+ 'maybe';
will_succeed({_,_,_}, {_,_}) ->
- maybe;
+ 'maybe';
will_succeed({_,_,_}, {_,_,_}) ->
- maybe.
+ 'maybe'.
will_succeed_test({'not',Test1}, Test2) ->
case Test1 =:= Test2 of
true -> no;
- false -> maybe
+ false -> 'maybe'
end;
will_succeed_test(is_tuple, {is_tagged_tuple,_,_}) ->
- maybe;
+ 'maybe';
will_succeed_test({is_tagged_tuple,_,_}, is_tuple) ->
yes;
will_succeed_test(is_list, is_nonempty_list) ->
- maybe;
+ 'maybe';
will_succeed_test(is_nonempty_list, is_list) ->
yes;
will_succeed_test(_T1, _T2) ->
- maybe.
+ 'maybe'.
will_succeed_1('=:=', A, '<', B) ->
if
@@ -823,7 +824,7 @@ will_succeed_1('==', A, '/=', B) ->
will_succeed_1('/=', A, '/=', B) when A == B -> yes;
will_succeed_1('/=', A, '==', B) when A == B -> no;
-will_succeed_1(_, _, _, _) -> maybe.
+will_succeed_1(_, _, _, _) -> 'maybe'.
will_succeed_vars('=/=', Val, '=:=', Val) -> no;
will_succeed_vars('=:=', Val, '=/=', Val) -> no;
@@ -833,7 +834,7 @@ will_succeed_vars('=:=', Val, '=<', Val) -> yes;
will_succeed_vars('/=', Val1, '==', Val2) when Val1 == Val2 -> no;
will_succeed_vars('==', Val1, '/=', Val2) when Val1 == Val2 -> no;
-will_succeed_vars(_, _, _, _) -> maybe.
+will_succeed_vars(_, _, _, _) -> 'maybe'.
eval_type_test(Test, Arg) ->
case eval_type_test_1(Test, Arg) of
@@ -1049,6 +1050,320 @@ lit_type(Val) ->
true -> none
end.
+
+%%%
+%%% Remove redundant tests.
+%%%
+%%% Repeated tests can be introduced by inlining, macros, or
+%%% complex guards such as:
+%%%
+%%% is_head(M, S) when M =:= <<1>>, S =:= <<2>> ->
+%%% true;
+%%% is_head(M, S) when M =:= <<1>>, S =:= <<3>> ->
+%%% false.
+%%%
+%%% The repeated test is not removed by any of the other optimizing
+%%% passes:
+%%%
+%%% 0:
+%%% _2 = bif:'=:=' _0, `<<1>>`
+%%% br _2, ^19, ^3
+%%%
+%%% 19:
+%%% _3 = bif:'=:=' _1, `<<2>>`
+%%% br _3, ^7, ^4
+%%%
+%%% 7:
+%%% ret `true`
+%%%
+%%% 4:
+%%% _4 = bif:'=:=' _0, `<<1>>`
+%%% br _4, ^15, ^3
+%%%
+%%% 15:
+%%% _5 = bif:'=:=' _1, `<<3>>`
+%%% br _5, ^11, ^3
+%%%
+%%% 11:
+%%% ret `false`
+%%%
+%%% 3:
+%%% %% Generate function clause error.
+%%% . . .
+%%%
+%%% This sub pass will keep track of all tests that are known to have
+%%% been executed at each block in the SSA code. If a repeated or
+%%% inverted test is seen, it can be eliminated. For the example
+%%% above, this sub pass will rewrite block 4 like this:
+%%%
+%%% 4:
+%%% _4 = bif:'=:=' `true`, `true`
+%%% br ^15
+%%%
+%%% This sub pass also removes redundant inverted test such as the
+%%% last test in this code:
+%%%
+%%% if
+%%% A < B -> . . . ;
+%%% A >= B -> . . .
+%%% end
+%%%
+%%% and this code:
+%%%
+%%% if
+%%% A < B -> . . . ;
+%%% A > B -> . . . ;
+%%% A == B -> . . .
+%%% end
+%%%
+
+opt_redundant_tests(Blocks) ->
+ All = #{0 => #{}, ?EXCEPTION_BLOCK => #{}},
+ RPO = beam_ssa:rpo(Blocks),
+ Linear = opt_redundant_tests(RPO, Blocks, All),
+ beam_ssa:trim_unreachable(Linear).
+
+opt_redundant_tests([L|Ls], Blocks, All0) ->
+ case All0 of
+ #{L := Tests} ->
+ Blk0 = map_get(L, Blocks),
+ Tests = map_get(L, All0),
+ Blk1 = opt_switch(Blk0, Tests),
+ #b_blk{is=Is0} = Blk1,
+ case opt_redundant_tests_is(Is0, Tests, []) of
+ none ->
+ All = update_successors(Blk1, Tests, All0),
+ [{L,Blk1}|opt_redundant_tests(Ls, Blocks, All)];
+ {new_test,Bool,Test,MustInvert} ->
+ All = update_successors(Blk1, Bool, Test, MustInvert,
+ Tests, All0),
+ [{L,Blk1}|opt_redundant_tests(Ls, Blocks, All)];
+ {old_test,Is,BoolVar,BoolValue} ->
+ Blk = case Blk1 of
+ #b_blk{last=#b_br{bool=BoolVar}=Br0} ->
+ Br = beam_ssa:normalize(Br0#b_br{bool=BoolValue}),
+ Blk1#b_blk{is=Is,last=Br};
+ #b_blk{}=Blk2 ->
+ Blk2#b_blk{is=Is}
+ end,
+ All = update_successors(Blk, Tests, All0),
+ [{L,Blk}|opt_redundant_tests(Ls, Blocks, All)]
+ end;
+ #{} ->
+ opt_redundant_tests(Ls, Blocks, All0)
+ end;
+opt_redundant_tests([], _Blocks, _All) -> [].
+
+opt_switch(#b_blk{last=#b_switch{arg=Arg,list=List0}=Sw}=Blk, Tests)
+ when map_size(Tests) =/= 0 ->
+ List = opt_switch_1(List0, Arg, Tests),
+ Blk#b_blk{last=Sw#b_switch{list=List}};
+opt_switch(Blk, _Tests) -> Blk.
+
+opt_switch_1([{Lit,_}=H|T], Arg, Tests) ->
+ case Tests of
+ #{{'=:=',Arg,Lit} := false} ->
+ opt_switch_1(T, Arg, Tests);
+ #{} ->
+ [H|opt_switch_1(T, Arg, Tests)]
+ end;
+opt_switch_1([], _, _) -> [].
+
+opt_redundant_tests_is([#b_set{op=Op,args=Args,dst=Bool}=I0], Tests, Acc) ->
+ case canonical_test(Op, Args) of
+ none ->
+ none;
+ {Test,MustInvert} ->
+ case old_result(Test, Tests) of
+ Result0 when is_boolean(Result0) ->
+ Result = #b_literal{val=Result0 xor MustInvert},
+ I = I0#b_set{op={bif,'=:='},args=[Result,#b_literal{val=true}]},
+ {old_test,reverse(Acc, [I]),Bool,Result};
+ none ->
+ {new_test,Bool,Test,MustInvert}
+ end
+ end;
+opt_redundant_tests_is([I|Is], Tests, Acc) ->
+ opt_redundant_tests_is(Is, Tests, [I|Acc]);
+opt_redundant_tests_is([], _Tests, _Acc) -> none.
+
+old_result(Test, Tests) ->
+ case Tests of
+ #{Test := Val} -> Val;
+ #{} -> old_result_1(Test, Tests)
+ end.
+
+%%
+%% Remove the last test in a sequence of tests (in any order):
+%%
+%% if
+%% Val1 < Val2 -> . . .
+%% Val1 > Val2 -> . . .
+%% Val1 == Val2 -> . . .
+%% end
+%%
+%% NOTE: The same optimization is not possible to do with `=:=`, unless
+%% we have type information so that we know that `==` and `=:=` produces
+%% the same result.
+%%
+
+old_result_1({'==',A,B}, Tests) ->
+ case Tests of
+ #{{'<',A,B} := false, {'=<',A,B} := true} ->
+ %% not A < B, not A > B ==> A == B
+ true;
+ #{} ->
+ none
+ end;
+old_result_1({'=<',A,B}, Tests) ->
+ case Tests of
+ #{{'<',A,B} := false, {'==',A,B} := false} ->
+ %% not A < B, not A == B ==> A > B
+ false;
+ #{} ->
+ none
+ end;
+old_result_1({'<',A,B}, Tests) ->
+ case Tests of
+ #{{'=<',A,B} := true, {'==',A,B} := false} ->
+ %% not A < B, not A == B ==> A < B
+ true;
+ #{} ->
+ none
+ end;
+old_result_1({is_nonempty_list,A}, Tests) ->
+ case Tests of
+ #{{is_list,A} := false} -> false;
+ #{} -> none
+ end;
+old_result_1(_, _) -> none.
+
+%% canonical_test(Op0, Args0) -> {CanonicalTest, MustInvert}
+%% CanonicalTest = {Operator,Variable,Variable|Literal} |
+%% {TypeTest,Variable}
+%% Operation = '<' | '=<' | '=:=' | '=='
+%% TypeTest = is_atom | is_integer ...
+%% Variable = #b_var{}
+%% Literal = #b_literal{}
+%% MustInvert = true | false
+%%
+%% Canonicalize a test. Always make the register
+%% operand the first operand. If there are two registers,
+%% order the registers in lexical order. Invert four of
+%% the relation operators and indicate with MustInvert
+%% whether the operator was inverted.
+%%
+%% For example, this instruction:
+%%
+%% #b_set{op={bif,'=:='},args=[#b_literal{}, #b_var{}}
+%%
+%% will be canonicalized to:
+%%
+%% {{'=:=',#b_var{},#b_literal{}}, false}
+%%
+%% while:
+%%
+%% #b_set{op={bif,'>'},args=[#b_var{}, #b_literal{}}}
+%%
+%% will be canonicalized to:
+%%
+%% {{'=<',#b_var{},#b_literal{}}, true}
+%%
+canonical_test(Op, Args) ->
+ case normalize_test(Op, Args) of
+ none ->
+ none;
+ Test ->
+ Inv = case Test of
+ {'=/=',_,_} -> true;
+ {'/=',_,_} -> true;
+ {'>',_,_} -> true;
+ {'>=',_,_} -> true;
+ _ -> false
+ end,
+ case Inv of
+ true -> {invert_test(Test),true};
+ false -> {Test,false}
+ end
+ end.
+
+update_successors(#b_blk{last=#b_br{bool=Bool,succ=Succ,fail=Fail}},
+ Bool, Test, MustInvert, Tests, All0) ->
+ All1 = update_successor(Succ, Tests#{Test => not MustInvert}, All0),
+ update_successor(Fail, Tests#{Test => MustInvert}, All1);
+update_successors(Blk, _, _, _, TestsA, All) ->
+ update_successors(Blk, TestsA, All).
+
+update_successors(#b_blk{last=#b_ret{}}, _Tests, All) ->
+ All;
+update_successors(#b_blk{last=#b_switch{arg=Arg,fail=Fail,list=List}},
+ Tests, All0) ->
+ All1 = update_successors_sw_fail(List, Arg, Fail, Tests, All0),
+ update_successors_sw(List, Arg, Tests, All1);
+update_successors(Blk, Tests, All) ->
+ foldl(fun(L, A) ->
+ update_successor(L, Tests, A)
+ end, All, beam_ssa:successors(Blk)).
+
+update_successors_sw_fail(List, Arg, Fail, Tests0, All) ->
+ Tests = foldl(fun({Lit,_}, A) ->
+ A#{{'=:=',Arg,Lit} => false}
+ end, Tests0, List),
+ update_successor(Fail, Tests, All).
+
+update_successors_sw([{Lit,L}|T], Arg, Tests, All0) ->
+ All = update_successor(L, Tests#{{'=:=',Arg,Lit} => true}, All0),
+ update_successors_sw(T, Arg, Tests, All);
+update_successors_sw([], _, _, All) -> All.
+
+update_successor(?EXCEPTION_BLOCK, _Tests, All) ->
+ All;
+update_successor(L, TestsA, All0) ->
+ case All0 of
+ #{L := TestsB} ->
+ All0#{L := maps_intersect_kv(TestsA, TestsB)};
+ #{} ->
+ All0#{L => TestsA}
+ end.
+
+maps_intersect_kv(Map, Map) ->
+ Map;
+maps_intersect_kv(Map1, Map2) ->
+ if
+ map_size(Map1) < map_size(Map2) ->
+ map_intersect_kv_1(Map1, Map2);
+ true ->
+ map_intersect_kv_1(Map2, Map1)
+ end.
+
+map_intersect_kv_1(SmallMap, BigMap) ->
+ Next = maps:next(maps:iterator(SmallMap)),
+ case maps_is_subset_kv(Next, BigMap) of
+ true -> SmallMap;
+ false -> map_intersect_kv_2(Next, BigMap, [])
+ end.
+
+map_intersect_kv_2({K, V, Iterator}, BigMap, Acc) ->
+ Next = maps:next(Iterator),
+ case BigMap of
+ #{K := V} ->
+ map_intersect_kv_2(Next, BigMap, [{K,V}|Acc]);
+ #{} ->
+ map_intersect_kv_2(Next, BigMap, Acc)
+ end;
+map_intersect_kv_2(none, _BigMap, Acc) ->
+ maps:from_list(Acc).
+
+maps_is_subset_kv({K, V, Iterator}, BigMap) ->
+ Next = maps:next(Iterator),
+ case BigMap of
+ #{K := V} ->
+ maps_is_subset_kv(Next, BigMap);
+ #{} ->
+ false
+ end;
+maps_is_subset_kv(none, _BigMap) -> true.
+
%%%
%%% Calculate used variables for each block.
%%%
diff --git a/lib/compiler/src/beam_ssa_funs.erl b/lib/compiler/src/beam_ssa_funs.erl
deleted file mode 100644
index a7b648bc47..0000000000
--- a/lib/compiler/src/beam_ssa_funs.erl
+++ /dev/null
@@ -1,152 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%%%
-%%% If a fun is defined locally and only used for calls, it can be replaced
-%%% with direct calls to the relevant function. This greatly speeds up "named
-%%% functions" (which rely on make_fun to recreate themselves) and macros that
-%%% wrap their body in a fun.
-%%%
-
--module(beam_ssa_funs).
-
--export([module/2]).
-
--include("beam_ssa.hrl").
-
--import(lists, [foldl/3]).
-
--spec module(Module, Options) -> Result when
- Module :: beam_ssa:b_module(),
- Options :: [compile:option()],
- Result :: {ok, beam_ssa:b_module()}.
-
-module(#b_module{body=Fs0}=Module, _Opts) ->
- Trampolines = foldl(fun find_trampolines/2, #{}, Fs0),
- Fs = [lfo(F, Trampolines) || F <- Fs0],
- {ok, Module#b_module{body=Fs}}.
-
-%% If a function does absolutely nothing beyond calling another function with
-%% the same arguments in the same order, we can shave off a call by short-
-%% circuiting it.
-find_trampolines(#b_function{args=Args,bs=Blocks}=F, Trampolines) ->
- case map_get(0, Blocks) of
- #b_blk{is=[#b_set{op=call,
- args=[#b_local{}=Actual | Args],
- dst=Dst}],
- last=#b_ret{arg=Dst}} ->
- {_, Name, Arity} = beam_ssa:get_anno(func_info, F),
- Trampoline = #b_local{name=#b_literal{val=Name},arity=Arity},
- Trampolines#{Trampoline => Actual};
- _ ->
- Trampolines
- end.
-
-lfo(#b_function{bs=Blocks0}=F, Trampolines) ->
- Linear0 = beam_ssa:linearize(Blocks0),
- Linear = lfo_optimize(Linear0, lfo_analyze(Linear0, #{}), Trampolines),
- F#b_function{bs=maps:from_list(Linear)}.
-
-%% Gather a map of the locally defined funs that are only used for calls.
-lfo_analyze([{_L,#b_blk{is=Is,last=Last}}|Bs], LFuns0) ->
- LFuns = lfo_analyze_last(Last, lfo_analyze_is(Is, LFuns0)),
- lfo_analyze(Bs, LFuns);
-lfo_analyze([], LFuns) ->
- LFuns.
-
-lfo_analyze_is([#b_set{op=make_fun,
- dst=Dst,
- args=[#b_local{} | FreeVars]}=Def | Is],
- LFuns0) ->
- LFuns = maps:put(Dst, Def, maps:without(FreeVars, LFuns0)),
- lfo_analyze_is(Is, LFuns);
-lfo_analyze_is([#b_set{op=call,
- args=[Fun | CallArgs]} | Is],
- LFuns) when is_map_key(Fun, LFuns) ->
- #b_set{args=[#b_local{arity=Arity} | FreeVars]} = map_get(Fun, LFuns),
- case length(CallArgs) + length(FreeVars) of
- Arity ->
- lfo_analyze_is(Is, maps:without(CallArgs, LFuns));
- _ ->
- %% This will `badarity` at runtime, and it's easier to disable the
- %% optimization than to simulate it.
- lfo_analyze_is(Is, maps:without([Fun | CallArgs], LFuns))
- end;
-lfo_analyze_is([#b_set{args=Args} | Is], LFuns) when map_size(LFuns) =/= 0 ->
- %% We disqualify funs that are used outside calls because this forces them
- %% to be created anyway, and the slight performance gain from direct calls
- %% is not enough to offset the potential increase in stack frame size (the
- %% free variables need to be kept alive until the call).
- lfo_analyze_is(Is, maps:without(Args, LFuns));
-lfo_analyze_is([_ | Is], LFuns) ->
- lfo_analyze_is(Is, LFuns);
-lfo_analyze_is([], LFuns) ->
- LFuns.
-
-lfo_analyze_last(#b_switch{arg=Arg}, LFuns) ->
- maps:remove(Arg, LFuns);
-lfo_analyze_last(#b_ret{arg=Arg}, LFuns) ->
- maps:remove(Arg, LFuns);
-lfo_analyze_last(_, LFuns) ->
- LFuns.
-
-%% Replace all calls of suitable funs with a direct call to their
-%% implementation. Liveness optimization will get rid of the make_fun
-%% instruction.
-lfo_optimize(Linear, LFuns, _Trampolines) when map_size(LFuns) =:= 0 ->
- Linear;
-lfo_optimize(Linear, LFuns, Trampolines) ->
- lfo_optimize_1(Linear, LFuns, Trampolines).
-
-lfo_optimize_1([{L,#b_blk{is=Is0}=Blk}|Bs], LFuns, Trampolines) ->
- Is = lfo_optimize_is(Is0, LFuns, Trampolines),
- [{L,Blk#b_blk{is=Is}} | lfo_optimize_1(Bs, LFuns, Trampolines)];
-lfo_optimize_1([], _LFuns, _Trampolines) ->
- [].
-
-lfo_optimize_is([#b_set{op=call,
- args=[Fun | CallArgs]}=Call0 | Is],
- LFuns, Trampolines) when is_map_key(Fun, LFuns) ->
- #b_set{args=[Local | FreeVars]} = map_get(Fun, LFuns),
- Args = [lfo_short_circuit(Local, Trampolines) | CallArgs ++ FreeVars],
- Call = beam_ssa:add_anno(local_fun_opt, Fun, Call0#b_set{args=Args}),
- [Call | lfo_optimize_is(Is, LFuns, Trampolines)];
-lfo_optimize_is([I | Is], LFuns, Trampolines) ->
- [I | lfo_optimize_is(Is, LFuns, Trampolines)];
-lfo_optimize_is([], _LFuns, _Trampolines) ->
- [].
-
-lfo_short_circuit(Call, Trampolines) ->
- lfo_short_circuit(Call, Trampolines, sets:new([{version, 2}])).
-
-lfo_short_circuit(Call, Trampolines, Seen0) ->
- %% Beware of infinite loops! Get out if this call has been seen before.
- case sets:is_element(Call, Seen0) of
- true ->
- Call;
- false ->
- case Trampolines of
- #{Call := Other} ->
- Seen = sets:add_element(Call, Seen0),
- lfo_short_circuit(Other, Trampolines, Seen);
- #{} ->
- Call
- end
- end.
diff --git a/lib/compiler/src/beam_ssa_opt.erl b/lib/compiler/src/beam_ssa_opt.erl
index eadbb3cc2b..da9ebc0118 100644
--- a/lib/compiler/src/beam_ssa_opt.erl
+++ b/lib/compiler/src/beam_ssa_opt.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@
-include("beam_ssa_opt.hrl").
--import(lists, [all/2,append/1,duplicate/2,flatten/1,foldl/3,
+-import(lists, [all/2,append/1,droplast/1,duplicate/2,flatten/1,foldl/3,
keyfind/3,last/1,mapfoldl/3,member/2,
partition/2,reverse/1,reverse/2,
splitwith/2,sort/1,takewhile/2,unzip/1]).
@@ -124,93 +124,79 @@ phase([], _Ps, StMap, FuncDb) ->
{StMap, FuncDb}.
changed(PrevIds, FuncDb0, FuncDb, StMap0, StMap) ->
- %% Find all functions in FuncDb that can be reached by changes
- %% of argument and/or return types. Those are the functions that
- %% may gain from running the optimization passes again.
- %%
- %% Note that we examine all functions in FuncDb, not only functions
- %% optimized in the previous run, because the argument types can
- %% have been updated for functions not included in the previous run.
-
- F = fun(Id, A) ->
- case sets:is_element(Id, A) of
- true ->
- A;
- false ->
- {#func_info{arg_types=ATs0,succ_types=ST0},
- #func_info{arg_types=ATs1,succ_types=ST1}} =
- {map_get(Id, FuncDb0),map_get(Id, FuncDb)},
-
- %% If the argument types have changed for this
- %% function, re-optimize this function and all
- %% functions it calls directly or indirectly.
- %%
- %% If the return type has changed, re-optimize
- %% this function and all functions that call
- %% this function directly or indirectly.
- Opts = case ATs0 =:= ATs1 of
- true -> [];
- false -> [called]
- end ++
- case ST0 =:= ST1 of
- true -> [];
- false -> [callers]
- end,
- case Opts of
- [] -> A;
- [_|_] -> add_changed([Id], Opts, FuncDb, A)
- end
- end
- end,
- Ids = foldl(F, sets:new([{version, 2}]), maps:keys(FuncDb)),
-
- %% From all functions that were optimized in the previous run,
- %% find the functions that had any change in the SSA code. Those
- %% functions might gain from being optimized again. (For example,
- %% when beam_ssa_dead has shortcut branches, the types for some
- %% variables could become narrower, giving beam_ssa_type new
- %% opportunities for optimization.)
+ EmptySet = sets:new([{version,2}]),
+ Changed0 = changed_types(PrevIds, FuncDb0, FuncDb, EmptySet, EmptySet),
+
+ %% From all functions that were optimized in the previous run, find the
+ %% functions that had any change in the SSA code. Those functions might
+ %% gain from being optimized again. (For example, when beam_ssa_dead has
+ %% shortcut branches, the types for some variables could become narrower,
+ %% giving beam_ssa_type new opportunities for optimization.)
%%
%% Note that the functions examined could be functions with module-level
%% optimization turned off (and thus not included in FuncDb).
-
- foldl(fun(Id, A) ->
- case sets:is_element(Id, A) of
+ foldl(fun(Id, Changed) ->
+ case sets:is_element(Id, Changed) of
true ->
%% Already scheduled for another optimization.
%% No need to compare the SSA code.
- A;
+ Changed;
false ->
%% Compare the SSA code before and after optimization.
- case {map_get(Id, StMap0),map_get(Id, StMap)} of
- {Same,Same} -> A;
- {_,_} -> sets:add_element(Id, A)
+ case {map_get(Id, StMap0), map_get(Id, StMap)} of
+ {Same, Same} -> Changed;
+ {_,_} -> sets:add_element(Id, Changed)
end
end
- end, Ids, PrevIds).
+ end, Changed0, PrevIds).
-add_changed([Id|Ids], Opts, FuncDb, S0) when is_map_key(Id, FuncDb) ->
- case sets:is_element(Id, S0) of
+%% Find all functions in FuncDb that can be reached by changes of argument
+%% and/or return types. Those are the functions that may gain from running the
+%% optimization passes again.
+%%
+%% Note that we examine all functions in FuncDb, not only functions optimized
+%% in the previous run, because the argument types may have been updated for
+%% functions not included in the previous run.
+changed_types([Id | Ids], Fdb0, Fdb, In0, Out0) ->
+ case {Fdb0, Fdb} of
+ {#{ Id := #func_info{arg_types=ATs0,succ_types=ST0} },
+ #{ Id := #func_info{arg_types=ATs,succ_types=ST} }} ->
+ In = case ST0 =:= ST of
+ true -> In0;
+ false -> changed_types_1([Id], #func_info.in, Fdb, In0)
+ end,
+ Out = case ATs0 =:= ATs of
+ true -> Out0;
+ false -> changed_types_1([Id], #func_info.out, Fdb, Out0)
+ end,
+ changed_types(Ids, Fdb0, Fdb, In, Out);
+ _ ->
+ %% This function is exempt from module-level optimization and will
+ %% not provide any more information.
+ changed_types(Ids, Fdb0, Fdb, In0, Out0)
+ end;
+changed_types([], _Fdb0, _Fdb, In, Out) ->
+ sets:union(In, Out).
+
+changed_types_1([Id | Ids], Direction, Fdb, Seen0) ->
+ case sets:is_element(Id, Seen0) of
true ->
- add_changed(Ids, Opts, FuncDb, S0);
+ changed_types_1(Ids, Direction, Fdb, Seen0);
false ->
- S1 = sets:add_element(Id, S0),
- #func_info{in=In,out=Out} = map_get(Id, FuncDb),
- S2 = case member(callers, Opts) of
- true -> add_changed(In, Opts, FuncDb, S1);
- false -> S1
- end,
- S = case member(called, Opts) of
- true -> add_changed(Out, Opts, FuncDb, S2);
- false -> S2
- end,
- add_changed(Ids, Opts, FuncDb, S)
+ case Fdb of
+ #{ Id := FuncInfo } ->
+ Next = element(Direction, FuncInfo),
+
+ Seen1 = sets:add_element(Id, Seen0),
+ Seen2 = changed_types_1(Next, Direction, Fdb, Seen1),
+ changed_types_1(Ids, Direction, Fdb, Seen2);
+ #{} ->
+ changed_types_1(Ids, Direction, Fdb, Seen0)
+ end
end;
-add_changed([_|Ids], Opts, FuncDb, S) ->
- %% This function is exempt from module-level optimization and will not
- %% provide any more information.
- add_changed(Ids, Opts, FuncDb, S);
-add_changed([], _, _, S) -> S.
+changed_types_1([], _, _, Seen) ->
+ Seen.
+
%%
@@ -277,7 +263,7 @@ module_passes(Opts) ->
repeated_passes(Opts) ->
Ps = [?PASS(ssa_opt_live),
?PASS(ssa_opt_ne),
- ?PASS(ssa_opt_bs_puts),
+ ?PASS(ssa_opt_bs_create_bin),
?PASS(ssa_opt_dead),
?PASS(ssa_opt_cse),
?PASS(ssa_opt_tail_phis),
@@ -301,11 +287,13 @@ epilogue_passes(Opts) ->
?PASS(ssa_opt_bsm_shortcut),
?PASS(ssa_opt_sink),
?PASS(ssa_opt_blockify),
+ ?PASS(ssa_opt_redundant_br),
?PASS(ssa_opt_merge_blocks),
?PASS(ssa_opt_get_tuple_element),
- ?PASS(ssa_opt_tail_calls),
+ ?PASS(ssa_opt_tail_literals),
?PASS(ssa_opt_trim_unreachable),
- ?PASS(ssa_opt_unfold_literals)],
+ ?PASS(ssa_opt_unfold_literals),
+ ?PASS(ssa_opt_ranges)],
passes_1(Ps, Opts).
passes_1(Ps, Opts0) ->
@@ -407,12 +395,7 @@ fdb_update(Caller, Callee, FuncDb) ->
get_call_order_po(StMap, FuncDb) ->
Order = gco_po(FuncDb),
- Order ++ maps:fold(fun(K, _V, Acc) ->
- case is_map_key(K, FuncDb) of
- false -> [K | Acc];
- true -> Acc
- end
- end, [], StMap).
+ Order ++ sort([K || K <- maps:keys(StMap), not is_map_key(K, FuncDb)]).
gco_po(FuncDb) ->
All = sort(maps:keys(FuncDb)),
@@ -461,6 +444,9 @@ ssa_opt_merge_blocks({#opt_st{ssa=Blocks0}=St, FuncDb}) ->
Blocks = beam_ssa:merge_blocks(RPO, Blocks0),
{St#opt_st{ssa=Blocks}, FuncDb}.
+ssa_opt_ranges({#opt_st{ssa=Blocks}=St, FuncDb}) ->
+ {St#opt_st{ssa=beam_ssa_type:opt_ranges(Blocks)}, FuncDb}.
+
%%%
%%% Split blocks before certain instructions to enable more optimizations.
%%%
@@ -1070,7 +1056,7 @@ cse_suitable(#b_set{}) -> false.
%%% will take special care to keep not using them in guards. Using
%%% them in guards would require a new version of the 'fconv'
%%% instruction that would take a failure label. Since it is unlikely
-%%% that using float instructions in guards would be benefical, why
+%%% that using float instructions in guards would be beneficial, why
%%% bother implementing a new instruction?
%%%
@@ -1122,7 +1108,7 @@ float_opt_1(L, #b_blk{is=Is0}=Blk0, Bs0, Count0, Fs0) ->
end.
%% Split out {float,convert} instructions into separate blocks, number
-%% the blocks, and add {succeded,body} in each {float,convert} block.
+%% the blocks, and add {succeeded,body} in each {float,convert} block.
float_fixup_conv(L, Is, Blk, Count0) ->
Split = float_split_conv(Is, Blk),
{Blks,Count} = float_number(Split, L, Count0),
@@ -1232,9 +1218,12 @@ float_opt_is([#b_set{op={succeeded,_},args=[Src]}=I0],
float_opt_is([#b_set{anno=Anno0}=I0|Is0], Fs0, Count0, Acc) ->
case Anno0 of
#{float_op:=FTypes} ->
- Anno = maps:remove(float_op, Anno0),
+ ArgTypes0 = maps:get(arg_types, Anno0, #{}),
+ ArgTypes = float_arg_types(FTypes, 0, ArgTypes0),
+ Anno1 = maps:remove(float_op, Anno0),
+ Anno = maps:remove(arg_types, Anno1),
I1 = I0#b_set{anno=Anno},
- {Is,Fs,Count} = float_make_op(I1, FTypes, Fs0, Count0),
+ {Is,Fs,Count} = float_make_op(I1, FTypes, ArgTypes, Fs0, Count0),
float_opt_is(Is0, Fs, Count, reverse(Is, Acc));
#{} ->
float_opt_is(Is0, Fs0, Count0, [I0|Acc])
@@ -1242,9 +1231,18 @@ float_opt_is([#b_set{anno=Anno0}=I0|Is0], Fs0, Count0, Acc) ->
float_opt_is([], _Fs, _Count, _Acc) ->
none.
+float_arg_types([_|As], Index, ArgTypes) ->
+ case ArgTypes of
+ #{Index := ArgType} ->
+ [ArgType|float_arg_types(As, Index + 1, ArgTypes)];
+ #{} ->
+ [any|float_arg_types(As, Index + 1, ArgTypes)]
+ end;
+float_arg_types([], _, _) -> [].
+
float_make_op(#b_set{op={bif,Op},dst=Dst,args=As0,anno=Anno}=I0,
- Ts, #fs{regs=Rs0}=Fs, Count0) ->
- {As1,Rs1,Count1} = float_load(As0, Ts, Anno, Rs0, Count0, []),
+ Ts, ArgTypes, #fs{regs=Rs0}=Fs, Count0) ->
+ {As1,Rs1,Count1} = float_load(As0, Ts, ArgTypes, Anno, Rs0, Count0, []),
{As,Is0} = unzip(As1),
{FrDst,Count2} = new_var('@fr', Count1),
I = I0#b_set{op={float,Op},dst=FrDst,args=As},
@@ -1252,19 +1250,23 @@ float_make_op(#b_set{op={bif,Op},dst=Dst,args=As0,anno=Anno}=I0,
Is = append(Is0) ++ [I],
{Is,Fs#fs{regs=Rs},Count2}.
-float_load([A|As], [T|Ts], Anno, Rs0, Count0, Acc) ->
- {Load,Rs,Count} = float_reg_arg(A, T, Anno, Rs0, Count0),
- float_load(As, Ts, Anno, Rs, Count, [Load|Acc]);
-float_load([], [], _Anno, Rs, Count, Acc) ->
+float_load([A|As], [T|Ts], [AT|ATs], Anno, Rs0, Count0, Acc) ->
+ {Load,Rs,Count} = float_reg_arg(A, T, AT, Anno, Rs0, Count0),
+ float_load(As, Ts, ATs, Anno, Rs, Count, [Load|Acc]);
+float_load([], [], [], _Anno, Rs, Count, Acc) ->
{reverse(Acc),Rs,Count}.
-float_reg_arg(A, T, Anno, Rs, Count0) ->
+float_reg_arg(A, T, AT, Anno0, Rs, Count0) ->
case Rs of
#{A:=Fr} ->
{{Fr,[]},Rs,Count0};
#{} ->
{Dst,Count} = new_var('@fr_copy', Count0),
I0 = float_load_reg(T, A, Dst),
+ Anno = case AT of
+ any-> Anno0;
+ _ -> Anno0#{arg_types => #{0 => AT}}
+ end,
I = I0#b_set{anno=Anno},
{{Dst,[I]},Rs#{A=>Dst},Count}
end.
@@ -1419,18 +1421,96 @@ live_opt_is([], Live, Acc) ->
%%%
%%% try/catch optimization.
%%%
-%%% Attemps to rewrite try/catches as guards when we know the exception won't
+%%% Attempts to rewrite try/catches as guards when we know the exception won't
%%% be inspected in any way, and removes try/catches whose expressions will
%%% never throw.
%%%
-ssa_opt_try({#opt_st{ssa=Linear0}=St, FuncDb}) ->
- RevLinear = reduce_try(Linear0, []),
+ssa_opt_try({#opt_st{ssa=Linear,cnt=Count0}=St, FuncDb}) ->
+ {Count, Shrunk} = shrink_try(Linear, Count0, []),
+
+ Reduced = reduce_try(Shrunk, []),
EmptySet = sets:new([{version, 2}]),
- Linear = trim_try(RevLinear, EmptySet, EmptySet, []),
+ Trimmed = trim_try(Reduced, EmptySet, EmptySet, []),
- {St#opt_st{ssa=Linear}, FuncDb}.
+ {St#opt_st{ssa=Trimmed,cnt=Count}, FuncDb}.
+
+%% Moves all leading/trailing instructions that cannot fail out of try/catch
+%% expressions. For example, we can move the tuple constructions `{defg,Arg}`
+%% and `{hijk,A}` out of the `try` in the code below:
+%%
+%% try
+%% A = abcd({defg,Arg}),
+%% ... snip ...
+%% {hijk,A}
+%% catch
+%% ... snip ...
+%% end.
+shrink_try([{TryLbl0, #b_blk{is=[#b_set{op=new_try_tag,dst=Dst}],
+ last=#b_br{bool=Dst,succ=SuccLbl}}=TryBlk},
+ {SuccLbl, #b_blk{is=SuccIs0,last=SuccLast}=SuccBlk0} | Bs],
+ Count0, Acc0) ->
+ %% Hoist leading known-safe instructions before `new_try_tag` instructions.
+ {HoistIs, SuccIs} = hoist_try_is(SuccIs0, SuccLast, []),
+
+ HoistLbl = TryLbl0,
+ TryLbl = Count0,
+ Count = Count0 + 1,
+
+ HoistBlk = #b_blk{is=HoistIs,
+ last=#b_br{bool=#b_literal{val=true},
+ succ=TryLbl,
+ fail=TryLbl}},
+ SuccBlk = SuccBlk0#b_blk{is=SuccIs},
+
+ Acc = [{TryLbl, TryBlk},
+ {HoistLbl, HoistBlk} | Acc0],
+
+ shrink_try([{SuccLbl, SuccBlk} | Bs], Count, Acc);
+shrink_try([{L, #b_blk{is=Is}=Blk0} | Bs], Count, Acc) ->
+ Blk = Blk0#b_blk{is=sink_try_is(Is)},
+ shrink_try(Bs, Count, [{L, Blk} | Acc]);
+shrink_try([], Count, Acc) ->
+ {Count, reverse(Acc)}.
+
+hoist_try_is([#b_set{dst=Dst},
+ #b_set{op={succeeded,_},args=[Dst]}]=Is,
+ #b_br{}, HoistIs) ->
+ {reverse(HoistIs), Is};
+hoist_try_is([#b_set{dst=Dst}]=Is, #b_br{bool=Dst}, HoistIs) ->
+ {reverse(HoistIs), Is};
+hoist_try_is([#b_set{op=new_try_tag}]=Is, _Last, HoistIs) ->
+ {reverse(HoistIs), Is};
+hoist_try_is([#b_set{op=landingpad}]=Is, _Last, HoistIs) ->
+ {reverse(HoistIs), Is};
+hoist_try_is([#b_set{op=kill_try_tag}]=Is, _Last, HoistIs) ->
+ {reverse(HoistIs), Is};
+hoist_try_is([#b_set{}=I | Is], Last, HoistIs) ->
+ %% Note that we hoist instructions regardless of whether they side-effect
+ %% or not: as long as they don't throw an exception, we don't need to care
+ %% about side-effects as long as their order is unchanged.
+ hoist_try_is(Is, Last, [I | HoistIs]);
+hoist_try_is([], _Last, HoistIs) ->
+ {reverse(HoistIs), []}.
+
+%% Moves trailing known-safe instructions past `kill_try_tag` instructions.
+sink_try_is([#b_set{op=landingpad} | _]=Is) ->
+ Is;
+sink_try_is([#b_set{op=phi}=Phi | Is]) ->
+ [Phi | sink_try_is(Is)];
+sink_try_is(Is) ->
+ sink_try_is_1(Is, []).
+
+sink_try_is_1([#b_set{op=kill_try_tag}=Kill | Is], Acc) ->
+ [Kill | reverse(Acc, Is)];
+sink_try_is_1([I | Is], Acc) ->
+ case beam_ssa:no_side_effect(I) of
+ true -> sink_try_is_1(Is, [I | Acc]);
+ false -> reverse(Acc, [I | Is])
+ end;
+sink_try_is_1([], Acc) ->
+ reverse(Acc).
%% Does a strength reduction of try/catch and catch.
%%
@@ -1787,105 +1867,73 @@ bsm_shortcut([], _PosMap) -> [].
%%% If an integer segment or a float segment has a literal size and
%%% a literal value, convert to a binary segment. Coalesce adjacent
%%% literal binary segments. Literal binary segments will be converted
-%%% to bs_put_string instructions in later pass.
+%%% to bs_put_string instructions in a later pass.
%%%
-ssa_opt_bs_puts({#opt_st{ssa=Linear0,cnt=Count0}=St, FuncDb}) ->
- {Linear,Count} = opt_bs_puts(Linear0, Count0, []),
- {St#opt_st{ssa=Linear,cnt=Count}, FuncDb}.
-
-opt_bs_puts([{L,#b_blk{is=Is}=Blk0}|Bs], Count0, Acc0) ->
- case Is of
- [#b_set{op=bs_put},#b_set{op={succeeded,_}}]=Is ->
- case opt_bs_put(L, Is, Blk0, Count0, Acc0) of
- not_possible ->
- opt_bs_puts(Bs, Count0, [{L,Blk0}|Acc0]);
- {Count,Acc1} ->
- Acc = opt_bs_puts_merge(Acc1),
- opt_bs_puts(Bs, Count, Acc)
- end;
- _ ->
- opt_bs_puts(Bs, Count0, [{L,Blk0}|Acc0])
- end;
-opt_bs_puts([], Count, Acc) ->
- {reverse(Acc),Count}.
-
-opt_bs_puts_merge([{L1,#b_blk{is=Is}=Blk0},{L2,#b_blk{is=AccIs}}=BAcc|Acc]) ->
- case {AccIs,Is} of
- {[#b_set{op=bs_put,
- args=[#b_literal{val=binary},
- #b_literal{},
- #b_literal{val=Bin0},
- #b_literal{val=all},
- #b_literal{val=1}]},
- #b_set{op={succeeded,_}}],
- [#b_set{op=bs_put,
- args=[#b_literal{val=binary},
- #b_literal{},
- #b_literal{val=Bin1},
- #b_literal{val=all},
- #b_literal{val=1}]}=I0,
- #b_set{op={succeeded,_}}=Succeeded]} ->
- %% Coalesce the two segments to one.
- Bin = <<Bin0/bitstring,Bin1/bitstring>>,
- I = I0#b_set{args=bs_put_args(binary, Bin, all)},
- Blk = Blk0#b_blk{is=[I,Succeeded]},
- [{L2,Blk}|Acc];
- {_,_} ->
- [{L1,Blk0},BAcc|Acc]
- end.
+ssa_opt_bs_create_bin({#opt_st{ssa=Linear0}=St, FuncDb}) ->
+ Linear = opt_create_bin_fs(Linear0),
+ {St#opt_st{ssa=Linear}, FuncDb}.
-opt_bs_put(L, [I0,Succeeded], #b_blk{last=Br0}=Blk0, Count0, Acc) ->
- case opt_bs_put(I0) of
- [Bin] when is_bitstring(Bin) ->
- Args = bs_put_args(binary, Bin, all),
- I = I0#b_set{args=Args},
- Blk = Blk0#b_blk{is=[I,Succeeded]},
- {Count0,[{L,Blk}|Acc]};
- [{int,Int,Size},Bin] when is_bitstring(Bin) ->
- %% Construct a bs_put_integer instruction following
- %% by a bs_put_binary instruction.
- IntArgs = bs_put_args(integer, Int, Size),
- BinArgs = bs_put_args(binary, Bin, all),
-
- {BinL,BinVarNum,BinBoolNum} = {Count0,Count0+1,Count0+2},
- Count = Count0 + 3,
- BinVar = #b_var{name={'@ssa_bs_put',BinVarNum}},
- BinBool = #b_var{name={'@ssa_bool',BinBoolNum}},
-
- BinI = I0#b_set{dst=BinVar,args=BinArgs},
- BinSucceeded = Succeeded#b_set{dst=BinBool,args=[BinVar]},
- BinBlk = Blk0#b_blk{is=[BinI,BinSucceeded],
- last=Br0#b_br{bool=BinBool}},
-
- IntI = I0#b_set{args=IntArgs},
- IntBlk = Blk0#b_blk{is=[IntI,Succeeded],last=Br0#b_br{succ=BinL}},
-
- {Count,[{BinL,BinBlk},{L,IntBlk}|Acc]};
+opt_create_bin_fs([{L,#b_blk{is=Is0}=Blk0}|Bs]) ->
+ Is = opt_create_bin_is(Is0),
+ Blk = Blk0#b_blk{is=Is},
+ [{L,Blk}|opt_create_bin_fs(Bs)];
+opt_create_bin_fs([]) -> [].
+
+opt_create_bin_is([#b_set{op=bs_create_bin,args=Args0}=I0|Is]) ->
+ Args = opt_create_bin_args(Args0),
+ I = I0#b_set{args=Args},
+ [I|opt_create_bin_is(Is)];
+opt_create_bin_is([I|Is]) ->
+ [I|opt_create_bin_is(Is)];
+opt_create_bin_is([]) -> [].
+
+opt_create_bin_args([#b_literal{val=binary},#b_literal{val=[1|_]},
+ #b_literal{val=Bin0},#b_literal{val=all},
+ #b_literal{val=binary},#b_literal{val=[1|_]},
+ #b_literal{val=Bin1},#b_literal{val=all}|Args0]) ->
+ %% Coalesce two litary binary segments to one.
+ Bin = <<Bin0/bitstring,Bin1/bitstring>>,
+ Args = [#b_literal{val=binary},#b_literal{val=[1]},
+ #b_literal{val=Bin},#b_literal{val=all}|Args0],
+ opt_create_bin_args(Args);
+opt_create_bin_args([#b_literal{val=Type}=Type0,#b_literal{val=UFs}=UFs0,Val,Size|Args0]) ->
+ [Unit|Flags] = UFs,
+ case opt_create_bin_arg(Type, Unit, UFs, Val, Size) of
not_possible ->
- not_possible
- end.
-
-opt_bs_put(#b_set{args=[#b_literal{val=binary},_,#b_literal{val=Val},
- #b_literal{val=all},#b_literal{val=Unit}]})
- when is_bitstring(Val) ->
- if
- bit_size(Val) rem Unit =:= 0 ->
- [Val];
- true ->
- not_possible
- end;
-opt_bs_put(#b_set{args=[#b_literal{val=Type},#b_literal{val=Flags},
- #b_literal{val=Val},#b_literal{val=Size},
- #b_literal{val=Unit}]}=I0) when is_integer(Size) ->
+ [Type0,UFs0,Val,Size|opt_create_bin_args(Args0)];
+ [Bin] when is_bitstring(Bin) ->
+ Args = [#b_literal{val=binary},#b_literal{val=[1]},
+ #b_literal{val=Bin},#b_literal{val=all}|Args0],
+ opt_create_bin_args(Args);
+ [{int,Int,IntSize},Bin] when is_bitstring(Bin) ->
+ Args = [#b_literal{val=integer},#b_literal{val=[1|Flags]},
+ #b_literal{val=Int},#b_literal{val=IntSize},
+ #b_literal{val=binary},#b_literal{val=[1]},
+ #b_literal{val=Bin},#b_literal{val=all}|Args0],
+ opt_create_bin_args(Args)
+ end;
+opt_create_bin_args([]) -> [].
+
+opt_create_bin_arg(binary, Unit, _Flags, #b_literal{val=Val}, #b_literal{val=all})
+ when Unit =/= 1, bit_size(Val) rem Unit =:= 0 ->
+ [Val];
+opt_create_bin_arg(Type, Unit, Flags, #b_literal{val=Val}, #b_literal{val=Size})
+ when is_integer(Size), is_integer(Unit) ->
EffectiveSize = Size * Unit,
if
EffectiveSize > 0 ->
- case {Type,opt_bs_put_endian(Flags)} of
+ case {Type,opt_create_bin_endian(Flags)} of
{integer,big} when is_integer(Val) ->
if
EffectiveSize < 64 ->
[<<Val:EffectiveSize>>];
+ EffectiveSize > 1 bsl 24 ->
+ %% The binary construction could fail with a
+ %% system_limit. Don't optimize to ensure that
+ %% the extended error information will be
+ %% accurate.
+ not_possible;
true ->
opt_bs_put_split_int(Val, EffectiveSize)
end;
@@ -1893,9 +1941,8 @@ opt_bs_put(#b_set{args=[#b_literal{val=Type},#b_literal{val=Flags},
%% To avoid an explosion in code size, we only try
%% to optimize relatively small fields.
<<Int:EffectiveSize>> = <<Val:EffectiveSize/little>>,
- Args = bs_put_args(Type, Int, EffectiveSize),
- I = I0#b_set{args=Args},
- opt_bs_put(I);
+ opt_create_bin_arg(Type, 1, [], #b_literal{val=Int},
+ #b_literal{val=EffectiveSize});
{binary,_} when is_bitstring(Val) ->
case Val of
<<Bitstring:EffectiveSize/bits,_/bits>> ->
@@ -1906,8 +1953,14 @@ opt_bs_put(#b_set{args=[#b_literal{val=Type},#b_literal{val=Flags},
end;
{float,Endian} ->
try
- [opt_bs_put_float(Val, EffectiveSize, Endian)]
- catch error:_ ->
+ case Endian of
+ big ->
+ [<<Val:EffectiveSize/big-float-unit:1>>];
+ little ->
+ [<<Val:EffectiveSize/little-float-unit:1>>]
+ end
+ catch
+ error:_ ->
not_possible
end;
{_,_} ->
@@ -1916,25 +1969,12 @@ opt_bs_put(#b_set{args=[#b_literal{val=Type},#b_literal{val=Flags},
true ->
not_possible
end;
-opt_bs_put(#b_set{}) -> not_possible.
+opt_create_bin_arg(_, _, _, _, _) -> not_possible.
-opt_bs_put_float(N, Sz, Endian) ->
- case Endian of
- big -> <<N:Sz/big-float-unit:1>>;
- little -> <<N:Sz/little-float-unit:1>>
- end.
-
-bs_put_args(Type, Val, Size) ->
- [#b_literal{val=Type},
- #b_literal{val=[unsigned,big]},
- #b_literal{val=Val},
- #b_literal{val=Size},
- #b_literal{val=1}].
-
-opt_bs_put_endian([big=E|_]) -> E;
-opt_bs_put_endian([little=E|_]) -> E;
-opt_bs_put_endian([native=E|_]) -> E;
-opt_bs_put_endian([_|Fs]) -> opt_bs_put_endian(Fs).
+opt_create_bin_endian([little=E|_]) -> E;
+opt_create_bin_endian([native=E|_]) -> E;
+opt_create_bin_endian([_|Fs]) -> opt_create_bin_endian(Fs);
+opt_create_bin_endian([]) -> big.
opt_bs_put_split_int(Int, Size) ->
Pos = opt_bs_put_split_int_1(Int, 0, Size - 1),
@@ -2285,7 +2325,7 @@ do_ssa_opt_sink(Defs, #opt_st{ssa=Linear}=St) ->
%% It is not safe to move get_tuple_element instructions to blocks
%% that begin with certain instructions. It is also unsafe to move
%% the instructions into any part of a receive.
- Unsuitable = unsuitable(Linear, Blocks0),
+ Unsuitable = unsuitable(Linear, Blocks0, Preds),
%% Calculate new positions for get_tuple_element instructions. The new
%% position is a block that dominates all uses of the variable.
@@ -2467,13 +2507,12 @@ is_on_stack(From, Var, Blocks) ->
is_on_stack([L|Ls], Var, Blocks, WillGC0) ->
#b_blk{is=Is} = Blk = map_get(L, Blocks),
GC0 = map_get(L, WillGC0),
- try is_on_stack_is(Is, Var, GC0) of
+ case is_on_stack_is(Is, Var, GC0) of
+ {done,GC} ->
+ GC;
GC ->
WillGC = gc_update_successors(Blk, GC, WillGC0),
is_on_stack(Ls, Var, Blocks, WillGC)
- catch
- throw:{done,GC} ->
- GC
end;
is_on_stack([], _Var, _, _) -> false.
@@ -2482,7 +2521,7 @@ is_on_stack_is([#b_set{op=get_tuple_element}|Is], Var, GC) ->
is_on_stack_is([I|Is], Var, GC0) ->
case GC0 andalso member(Var, beam_ssa:used(I)) of
true ->
- throw({done,GC0});
+ {done,GC0};
false ->
GC = GC0 orelse beam_ssa:clobbers_xregs(I),
is_on_stack_is(Is, Var, GC)
@@ -2498,12 +2537,11 @@ gc_update_successors(Blk, GC, WillGC) ->
end
end, WillGC, beam_ssa:successors(Blk)).
-%% unsuitable(Linear, Blocks) -> Unsuitable.
-%% Return an ordset of block labels for the blocks that are not
+%% unsuitable(Linear, Blocks, Predecessors) -> Unsuitable.
+%% Return an gbset of block labels for the blocks that are not
%% suitable for sinking of get_tuple_element instructions.
-unsuitable(Linear, Blocks) ->
- Predecessors = beam_ssa:predecessors(Blocks),
+unsuitable(Linear, Blocks, Predecessors) ->
Unsuitable0 = unsuitable_1(Linear),
Unsuitable1 = unsuitable_recv(Linear, Blocks, Predecessors),
gb_sets:from_list(Unsuitable0 ++ Unsuitable1).
@@ -2511,7 +2549,6 @@ unsuitable(Linear, Blocks) ->
unsuitable_1([{L,#b_blk{is=[#b_set{op=Op}=I|_]}}|Bs]) ->
Unsuitable = case Op of
bs_extract -> true;
- bs_put -> true;
{float,_} -> true;
landingpad -> true;
_ -> beam_ssa:is_loop_header(I)
@@ -2740,33 +2777,21 @@ collect_get_tuple_element(Is, _Src, Acc) ->
%%% of the constant if the original variable is known to be in an x
%%% register.
%%%
-%%% This optimization sub pass will also undo constant folding of the
-%%% list of arguments in the call to error/2 in the last clause of a
-%%% function. For example:
-%%%
-%%% bar(X, Y) ->
-%%% error(function_clause, [X,42]).
-%%%
-%%% will be rewritten to:
-%%%
-%%% bar(X, Y) ->
-%%% error(function_clause, [X,Y]).
-%%%
ssa_opt_unfold_literals({St,FuncDb}) ->
- #opt_st{ssa=Blocks0,args=Args,anno=Anno,cnt=Count0} = St,
+ #opt_st{ssa=Blocks0,args=Args,anno=Anno} = St,
ParamInfo = maps:get(parameter_info, Anno, #{}),
LitMap = collect_arg_literals(Args, ParamInfo, 0, #{}),
case map_size(LitMap) of
0 ->
%% None of the arguments for this function are known
%% literals. Nothing to do.
- {St,FuncDb};
+ {St, FuncDb};
_ ->
SafeMap = #{0 => true},
- {Blocks,Count} = unfold_literals(beam_ssa:rpo(Blocks0),
- LitMap, SafeMap, Count0, Blocks0),
- {St#opt_st{ssa=Blocks,cnt=Count},FuncDb}
+ Blocks = unfold_literals(beam_ssa:rpo(Blocks0),
+ LitMap, SafeMap, Blocks0),
+ {St#opt_st{ssa=Blocks}, FuncDb}
end.
collect_arg_literals([V|Vs], Info, X, Acc0) ->
@@ -2784,72 +2809,51 @@ collect_arg_literals([V|Vs], Info, X, Acc0) ->
#{} ->
collect_arg_literals(Vs, Info, X + 1, Acc0)
end;
-collect_arg_literals([], _Info, _X, Acc) -> Acc.
+collect_arg_literals([], _Info, _X, Acc) ->
+ Acc.
-unfold_literals([L|Ls], LitMap, SafeMap0, Count0, Blocks0) ->
- {Blocks,Safe,Count} =
+unfold_literals([L|Ls], LitMap, SafeMap0, Blocks0) ->
+ {Blocks,Safe} =
case map_get(L, SafeMap0) of
false ->
%% Before reaching this block, an instruction that
- %% clobbers x registers has been executed. *If* we
+ %% clobbers x registers has been executed. *If* we
%% would use an argument variable instead of literal,
%% it would force the value to be saved to a y
%% register. This is not what we want.
- {Blocks0,false,Count0};
+ {Blocks0,false};
true ->
%% All x registers live when entering the function
%% are still live. Using the variable instead of
%% the substituted value will eliminate a `move`
%% instruction.
#b_blk{is=Is0} = Blk = map_get(L, Blocks0),
- {Is,Safe0,Count1} = unfold_lit_is(Is0, LitMap, Count0, []),
- {Blocks0#{L:=Blk#b_blk{is=Is}},Safe0,Count1}
+ {Is, Safe0} = unfold_lit_is(Is0, LitMap, []),
+ {Blocks0#{ L := Blk#b_blk{is=Is} }, Safe0}
end,
%% Propagate safeness to successors.
Successors = beam_ssa:successors(L, Blocks),
SafeMap = unfold_update_succ(Successors, Safe, SafeMap0),
- unfold_literals(Ls, LitMap, SafeMap, Count,Blocks);
-unfold_literals([], _, _, Count, Blocks) ->
- {Blocks,Count}.
+ unfold_literals(Ls, LitMap, SafeMap,Blocks);
+unfold_literals([], _, _, Blocks) ->
+ Blocks.
unfold_update_succ([S|Ss], Safe, SafeMap0) ->
F = fun(Prev) -> Prev and Safe end,
SafeMap = maps:update_with(S, F, Safe, SafeMap0),
unfold_update_succ(Ss, Safe, SafeMap);
-unfold_update_succ([], _, SafeMap) -> SafeMap.
-
-unfold_lit_is([#b_set{op=call,
- args=[#b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error},
- arity=2},
- #b_literal{val=function_clause},
- ArgumentList]}=I0|Is], LitMap, Count0, Acc0) ->
- %% This is a call to error/2 that raises a function_clause
- %% exception in the final clause of a function. Try to undo
- %% constant folding in the list of arguments (the second argument
- %% for error/2).
- case unfold_arg_list(Acc0, ArgumentList, LitMap, Count0, 0, []) of
- {[FinalPutList|_]=Acc,Count} ->
- %% Acc now contains the possibly rewritten code that
- %% creates the argument list. All that remains is to
- %% rewrite the call to error/2 itself so that is will
- %% refer to rewritten argument list. This is essential
- %% when all arguments have known literal values as in this
- %% example:
- %%
- %% foo(X, Y) -> error(function_clause, [0,1]).
- %%
- #b_set{op=put_list,dst=ListVar} = FinalPutList,
- #b_set{args=[ErlangError,Fc,_]} = I0,
- I = I0#b_set{args=[ErlangError,Fc,ListVar]},
- {reverse(Acc, [I|Is]),false,Count};
- {[],_} ->
- %% Handle code such as:
- %%
- %% bar(KnownValue, Stk) -> error(function_clause, Stk).
- {reverse(Acc0, [I0|Is]),false,Count0}
- end;
-unfold_lit_is([#b_set{op=Op,args=Args0}=I0|Is], LitMap, Count, Acc) ->
+unfold_update_succ([], _, SafeMap) ->
+ SafeMap.
+
+unfold_lit_is([#b_set{op=match_fail,
+ args=[#b_literal{val=function_clause} | Args0]}=I0 | Is],
+ LitMap, Acc) ->
+ %% Undoing constant folding for this kind of failure lets us jump
+ %% directly to the `func_info` instruction.
+ Args = unfold_call_args(Args0, LitMap, 0),
+ I = I0#b_set{args=[#b_literal{val=function_clause} | Args]},
+ {reverse(Acc, [I | Is]), false};
+unfold_lit_is([#b_set{op=Op,args=Args0}=I0|Is], LitMap, Acc) ->
%% Using a register instead of a literal is a clear win only for
%% `call` and `old_make_fun` instructions. Substituting into other
%% instructions is unlikely to be an improvement.
@@ -2870,56 +2874,18 @@ unfold_lit_is([#b_set{op=Op,args=Args0}=I0|Is], LitMap, Count, Acc) ->
%% This instruction clobbers x register. Don't do
%% any substitutions in rest of this block or in any
%% of its successors.
- {reverse(Acc, [I|Is]),false,Count};
+ {reverse(Acc, [I|Is]), false};
false ->
- unfold_lit_is(Is, LitMap, Count, [I|Acc])
+ unfold_lit_is(Is, LitMap, [I|Acc])
end;
-unfold_lit_is([], _LitMap, Count, Acc) ->
- {reverse(Acc),true,Count}.
-
-%% unfold_arg_list(Is, ArgumentList, LitMap, Count0, X, Acc) ->
-%% {UpdatedAcc, Count}.
-%%
-%% Unfold the arguments in the argument list (second argument for error/2).
-%%
-%% Note that Is is the reversed list of instructions before the
-%% call to error/2. Because of the way the list is built in reverse,
-%% it means that the first put_list instruction found will add the first
-%% argument (x0) to the list, the second the second argument (x1), and
-%% so on.
-
-unfold_arg_list(Is, #b_literal{val=[Hd|Tl]}, LitMap, Count0, X, Acc) ->
- %% Handle the case that the entire argument list (the second argument
- %% for error/2) is a literal.
- {PutListDst,Count} = new_var('@put_list', Count0),
- PutList = #b_set{op=put_list,dst=PutListDst,
- args=[#b_literal{val=Hd},#b_literal{val=Tl}]},
- unfold_arg_list([PutList|Is], PutListDst, LitMap, Count, X, Acc);
-unfold_arg_list([#b_set{op=put_list,dst=List,
- args=[Hd0,#b_literal{val=[Hd|Tl]}]}=I0|Is0],
- List, LitMap, Count0, X, Acc) ->
- %% The rest of the argument list is a literal list.
- {PutListDst,Count} = new_var('@put_list', Count0),
- PutList = #b_set{op=put_list,dst=PutListDst,
- args=[#b_literal{val=Hd},#b_literal{val=Tl}]},
- I = I0#b_set{args=[Hd0,PutListDst]},
- unfold_arg_list([I,PutList|Is0], List, LitMap, Count, X, Acc);
-unfold_arg_list([#b_set{op=put_list,dst=List,args=[Hd0,Tl]}=I0|Is],
- List, LitMap, Count, X, Acc) ->
- %% Unfold the head of the list.
- Hd = unfold_arg(Hd0, LitMap, X),
- I = I0#b_set{args=[Hd,Tl]},
- unfold_arg_list(Is, Tl, LitMap, Count, X + 1, [I|Acc]);
-unfold_arg_list([I|Is], List, LitMap, Count, X, Acc) ->
- %% Some other instruction, such as bs_get_tail.
- unfold_arg_list(Is, List, LitMap, Count, X, [I|Acc]);
-unfold_arg_list([], _, _, Count, _, Acc) ->
- {reverse(Acc),Count}.
+unfold_lit_is([], _LitMap, Acc) ->
+ {reverse(Acc), true}.
unfold_call_args([A0|As], LitMap, X) ->
A = unfold_arg(A0, LitMap, X),
- [A|unfold_call_args(As, LitMap, X + 1)];
-unfold_call_args([], _, _) -> [].
+ [A | unfold_call_args(As, LitMap, X + 1)];
+unfold_call_args([], _, _) ->
+ [].
unfold_arg(#b_literal{val=Val}=Lit, LitMap, X) ->
case LitMap of
@@ -2935,10 +2901,11 @@ unfold_arg(#b_literal{val=Val}=Lit, LitMap, X) ->
end;
#{} -> Lit
end;
-unfold_arg(Expr, _LitMap, _X) -> Expr.
+unfold_arg(Expr, _LitMap, _X) ->
+ Expr.
%%%
-%%% Optimize tail calls created as the result of optimizations.
+%%% Restore tail calls that were damaged by optimizations.
%%%
%%% Consider the following example of a tail call in Erlang code:
%%%
@@ -2947,159 +2914,202 @@ unfold_arg(Expr, _LitMap, _X) -> Expr.
%%%
%%% The SSA code for the call will look like this:
%%%
-%%% @ssa_ret = call (`foo`/0)
-%%% ret @ssa_ret
-%%%
-%%% Sometimes optimizations create new tail calls. Consider this
-%%% slight variation of the example:
-%%%
-%%% bar() ->
-%%% {_,_} = foo().
-%%%
-%%% foo() -> {a,b}.
-%%%
-%%% If beam_ssa_type can figure out that `foo/0` always returns a tuple
-%%% of size two, the test for a tuple is no longer needed and the call
-%%% to `foo/0` will become a tail call. However, the resulting SSA
-%%% code will look like this:
-%%%
-%%% @ssa_ret = call (`foo`/0)
-%%% @ssa_bool = succeeded:body @ssa_ret
+%%% @ssa_result = call (`foo`/0)
+%%% @ssa_bool = succeeded:body @ssa_result
%%% br @ssa_bool, ^999, ^1
%%%
%%% 999:
-%%% ret @ssa_ret
-%%%
-%%% The beam_ssa_codegen pass will not recognize this code as a tail
-%%% call and will generate an unncessary stack frame. It may also
-%%% generate unecessary `kill` instructions.
+%%% ret @ssa_result
%%%
-%%% To avoid those extra instructions, this optimization will
-%%% eliminate the `succeeded:body` and `br` instructions and insert
-%%% the `ret` in the same block as the call:
-%%%
-%%% @ssa_ret = call (`foo`/0)
-%%% ret @ssa_ret
-%%%
-%%% Finally, consider this example:
-%%%
-%%% bar() ->
-%%% foo_ok(),
-%%% ok.
-%%%
-%%% foo_ok() -> ok.
-%%%
-%%% The SSA code for the call to `foo_ok/0` will look like:
+%%% Now imagine that an optimization has figured out that `foo/0` always
+%%% returns the atom `ok` and substituted the result everywhere, resulting in
+%%% the following SSA:
%%%
%%% %% Result type: `ok`
-%%% @ssa_ignored = call (`foo_ok`/0)
+%%% @ssa_ignored = call (`foo`/0)
%%% @ssa_bool = succeeded:body @ssa_ignored
%%% br @ssa_bool, ^999, ^1
%%%
%%% 999:
%%% ret `ok`
%%%
-%%% Since the call to `foo_ok/0` has an annotation indicating that the
-%%% call will always return the atom `ok`, the code can be simplified
-%%% like this:
-%%%
-%%% @ssa_ignored = call (`foo_ok`/0)
-%%% ret @ssa_ignored
+%%% The `beam_ssa_pre_codegen` pass will not recognize this code as a tail call
+%%% and will generate an unnecessary stack frame, and may also generate
+%%% unnecessary `kill` instructions.
%%%
%%% The beam_jump pass does the same optimization, but it does it too
%%% late to avoid creating an uncessary stack frame or unnecessary
%%% `kill` instructions.
%%%
-ssa_opt_tail_calls({St,FuncDb}) ->
- #opt_st{ssa=Blocks0} = St,
- Blocks = opt_tail_calls(beam_ssa:rpo(Blocks0), Blocks0),
- {St#opt_st{ssa=Blocks},FuncDb}.
+ssa_opt_tail_literals({St,FuncDb}) ->
+ #opt_st{cnt=Count0,ssa=Blocks0} = St,
+ {Count, Blocks} = opt_tail_literals(beam_ssa:rpo(Blocks0), Count0, Blocks0),
+ {St#opt_st{cnt=Count,ssa=Blocks},FuncDb}.
-opt_tail_calls([L|Ls], Blocks0) ->
+opt_tail_literals([L | Ls], Count, Blocks0) ->
#b_blk{is=Is0,last=Last} = Blk0 = map_get(L, Blocks0),
- %% Does this block end with a two-way branch whose success
- %% label targets an empty block with a `ret` terminator?
- case is_potential_tail_call(Last, Blocks0) of
- {yes,Bool,Ret} ->
- %% Yes, `Ret` is the value returned from that block
- %% (either a variable or literal). Do the instructions
- %% in this block end with a `call` instruction that
- %% returns the same value as `Ret`, followed by a
- %% `succeeded:body` instruction?
- case is_tail_call_is(Is0, Bool, Ret, []) of
- {yes,Is,Var} ->
- %% Yes, this is a tail call. `Is` is the instructions
- %% in the block with `succeeded:body` removed, and
- %% `Var` is the destination variable for the return
- %% value of the call. Rewrite this block to directly
- %% return `Var`.
- Blk = Blk0#b_blk{is=Is,last=#b_ret{arg=Var}},
- Blocks = Blocks0#{L:=Blk},
- opt_tail_calls(Ls, Blocks);
- no ->
- %% No, the block does not end with a call, or the
- %% the call instruction has not the same value
- %% as `Ret`.
- opt_tail_calls(Ls, Blocks0)
- end;
+ case is_tail_literal(Is0, Last, Blocks0) of
+ {yes, Var} ->
+ %% Yes, this is a call followed by a block returning the same value
+ %% as the call itself. Create a new block that returns the result
+ %% directly, as the successor block may be reachable from
+ %% elsewhere.
+ RetBlk = #b_blk{is=[],last=#b_ret{arg=Var}},
+ RetLbl = Count,
+
+ Blk = Blk0#b_blk{last=Last#b_br{succ=RetLbl}},
+
+ Blocks = Blocks0#{ L := Blk, RetLbl => RetBlk },
+ opt_tail_literals(Ls, Count + 1, Blocks);
no ->
- opt_tail_calls(Ls, Blocks0)
+ opt_tail_literals(Ls, Count, Blocks0)
end;
-opt_tail_calls([], Blocks) -> Blocks.
+opt_tail_literals([], Count, Blocks) ->
+ {Count, Blocks}.
-is_potential_tail_call(#b_br{bool=#b_var{}=Bool,succ=Succ}, Blocks) ->
+is_tail_literal([#b_set{op=call,dst=Dst}=Call,
+ #b_set{op={succeeded,body},dst=Bool}],
+ #b_br{bool=#b_var{}=Bool,succ=Succ}, Blocks) ->
case Blocks of
- #{Succ := #b_blk{is=[],last=#b_ret{arg=Arg}}} ->
- %% This could be a tail call.
- {yes,Bool,Arg};
+ #{ Succ := #b_blk{is=[],last=#b_ret{arg=#b_literal{val=Val}}} } ->
+ %% Our success block does nothing but return a literal. Now we'll
+ %% check whether it's the same literal as the one returned by the
+ %% call itself.
+ Type = beam_ssa:get_anno(result_type, Call, any),
+ case beam_types:get_singleton_value(Type) of
+ {ok, Val} -> {yes, Dst};
+ _ -> no
+ end;
#{} ->
- %% The block is not empty or does not have a `ret` terminator.
no
end;
-is_potential_tail_call(_, _) ->
- %% Not a two-way branch (a `succeeded:body` instruction must be
- %% followed by a two-way branch).
+is_tail_literal([_ | Is], #b_br{}=Last, Blocks) ->
+ is_tail_literal(Is, Last, Blocks);
+is_tail_literal(_Is, _Last, _Blocks) ->
no.
-is_tail_call_is([#b_set{op=call,dst=Dst}=Call,
- #b_set{op={succeeded,body},dst=Bool}],
- Bool, Ret, Acc) ->
- IsTailCall =
- case Ret of
- #b_literal{val=Val} ->
- %% The return value for this function is a literal.
- %% Now test whether it is the same literal that the
- %% `call` instruction returns.
- Type = beam_ssa:get_anno(result_type, Call, any),
- case beam_types:get_singleton_value(Type) of
- {ok,Val} ->
- %% Same value.
- true;
- {ok,_} ->
- %% Wrong value.
- false;
- error ->
- %% The type for the return value is not a singleton value.
- false
- end;
- #b_var{} ->
- %% It is a tail call if the variable set by the `call` instruction
- %% is the same variable as the argument for the `ret` terminator.
- Ret =:= Dst
- end,
- case IsTailCall of
- true ->
- %% Return the instructions in the block with `succeeded:body` removed.
- Is = reverse(Acc, [Call]),
- {yes,Is,Dst};
- false ->
- no
+%%%
+%%% Eliminate redundant branches.
+%%%
+%%% Redundant `br` instructions following calls to guard BIFs such as:
+%%%
+%%% @bif_result = bif:Bif ...
+%%% br @bif_result, ^100, ^200
+%%%
+%%% 100:
+%%% ret `true`
+%%%
+%%% 200:
+%%% ret `false`
+%%%
+%%% can can be rewritten to:
+%%%
+%%% @bif_result = bif:Bif ...
+%%% ret @bif_result
+%%%
+%%% A similar rewriting is possible if the true and false branches end
+%%% up at a phi node.
+%%%
+%%% A code sequence such as:
+%%%
+%%% @ssa_bool = bif:'=:=' Var, Other
+%%% br @ssa_bool, ^100, ^200
+%%%
+%%% 100:
+%%% ret Other
+%%%
+%%% 200:
+%%% ret Var
+%%%
+%%% can be rewritten to:
+%%%
+%%% ret Var
+%%%
+
+ssa_opt_redundant_br({#opt_st{ssa=Blocks0}=St, FuncDb}) ->
+ Blocks = redundant_br(beam_ssa:rpo(Blocks0), Blocks0),
+ {St#opt_st{ssa=Blocks}, FuncDb}.
+
+redundant_br([L|Ls], Blocks0) ->
+ Blk0 = map_get(L, Blocks0),
+ case Blk0 of
+ #b_blk{is=Is,
+ last=#b_br{bool=#b_var{}=Bool,
+ succ=Succ,
+ fail=Fail}} ->
+ case Blocks0 of
+ #{Succ := #b_blk{is=[],last=#b_ret{arg=#b_literal{val=true}}},
+ Fail := #b_blk{is=[],last=#b_ret{arg=#b_literal{val=false}}}} ->
+ case redundant_br_safe_bool(Is, Bool) of
+ true ->
+ Blk = Blk0#b_blk{last=#b_ret{arg=Bool}},
+ Blocks = Blocks0#{L => Blk},
+ redundant_br(Ls, Blocks);
+ false ->
+ redundant_br(Ls, Blocks0)
+ end;
+ #{Succ := #b_blk{is=[],last=#b_br{succ=PhiL,fail=PhiL}},
+ Fail := #b_blk{is=[],last=#b_br{succ=PhiL,fail=PhiL}}} ->
+ case redundant_br_safe_bool(Is, Bool) of
+ true ->
+ Blocks = redundant_br_phi(L, Blk0, PhiL, Blocks0),
+ redundant_br(Ls, Blocks);
+ false ->
+ redundant_br(Ls, Blocks0)
+ end;
+ #{Succ := #b_blk{is=[],last=#b_ret{arg=Other}},
+ Fail := #b_blk{is=[],last=#b_ret{arg=Var}}} when Is =/= [] ->
+ case last(Is) of
+ #b_set{op={bif,'=:='},args=[Var,Other]} ->
+ Blk = Blk0#b_blk{is=droplast(Is),
+ last=#b_ret{arg=Var}},
+ Blocks = Blocks0#{L => Blk},
+ redundant_br(Ls, Blocks);
+ #b_set{} ->
+ redundant_br(Ls, Blocks0)
+ end;
+ #{} ->
+ redundant_br(Ls, Blocks0)
+ end;
+ _ ->
+ redundant_br(Ls, Blocks0)
end;
-is_tail_call_is([I|Is], Bool, Ret, Acc) ->
- is_tail_call_is(Is, Bool, Ret, [I|Acc]);
-is_tail_call_is([], _Bool, _Ret, _Acc) -> no.
+redundant_br([], Blocks) -> Blocks.
+
+redundant_br_phi(L, Blk0, PhiL, Blocks) ->
+ #b_blk{is=Is0} = PhiBlk0 = map_get(PhiL, Blocks),
+ case Is0 of
+ [#b_set{op=phi},#b_set{op=phi}|_] ->
+ Blocks;
+ [#b_set{op=phi,args=PhiArgs0}=I0|Is] ->
+ #b_blk{last=#b_br{succ=Succ,fail=Fail}} = Blk0,
+ BoolPhiArgs = [{#b_literal{val=false},Fail},
+ {#b_literal{val=true},Succ}],
+ PhiArgs1 = ordsets:from_list(PhiArgs0),
+ case ordsets:is_subset(BoolPhiArgs, PhiArgs1) of
+ true ->
+ #b_blk{last=#b_br{bool=Bool}} = Blk0,
+ PhiArgs = ordsets:add_element({Bool,L}, PhiArgs1),
+ I = I0#b_set{args=PhiArgs},
+ PhiBlk = PhiBlk0#b_blk{is=[I|Is]},
+ Br = #b_br{bool=#b_literal{val=true},succ=PhiL,fail=PhiL},
+ Blk = Blk0#b_blk{last=Br},
+ Blocks#{L := Blk, PhiL := PhiBlk};
+ false ->
+ Blocks
+ end
+ end.
+
+redundant_br_safe_bool([], _Bool) ->
+ true;
+redundant_br_safe_bool(Is, Bool) ->
+ case last(Is) of
+ #b_set{op={bif,_}} -> true;
+ #b_set{op=has_map_field} -> true;
+ #b_set{dst=Dst} -> Dst =/= Bool
+ end.
%%%
%%% Common utilities.
diff --git a/lib/compiler/src/beam_ssa_pp.erl b/lib/compiler/src/beam_ssa_pp.erl
index b290d49e5f..4e6974385e 100644
--- a/lib/compiler/src/beam_ssa_pp.erl
+++ b/lib/compiler/src/beam_ssa_pp.erl
@@ -22,6 +22,7 @@
-export([format_function/1,format_instr/1,format_var/1]).
-include("beam_ssa.hrl").
+-include("beam_types.hrl").
-spec format_function(beam_ssa:b_function()) -> iolist().
@@ -115,7 +116,7 @@ format_param_info([], _Break) ->
format_type(T, Break) ->
%% Gross hack, but it's short and simple.
- Indented = lists:flatten(io_lib:format("~p", [T])),
+ Indented = unicode:characters_to_list(format_type(T)),
string:replace(Indented, [$\n], Break, all).
format_blocks(Ls, Blocks, Anno) ->
@@ -142,7 +143,7 @@ format_instrs([], _FuncAnno, _First) ->
format_instr(#b_set{anno=Anno,op=Op,dst=Dst,args=Args},
FuncAnno, First) ->
- AnnoStr = format_anno(Anno),
+ AnnoStr = format_instr_anno(Anno, FuncAnno, Args),
LiveIntervalStr = format_live_interval(Dst, FuncAnno),
[if
First ->
@@ -241,20 +242,37 @@ format_switch_list(List, FuncAnno) ->
format_label(L) ->
io_lib:format("^~w", [L]).
-format_anno(#{n:=_}=Anno) ->
- format_anno(maps:remove(n, Anno));
-format_anno(#{location:={File,Line}}=Anno0) ->
+format_instr_anno(#{n:=_}=Anno, FuncAnno, Args) ->
+ format_instr_anno(maps:remove(n, Anno), FuncAnno, Args);
+format_instr_anno(#{location:={File,Line}}=Anno0, FuncAnno, Args) ->
Anno = maps:remove(location, Anno0),
- [io_lib:format(" %% ~ts:~p\n", [File,Line])|format_anno(Anno)];
-format_anno(#{result_type:=T}=Anno0) ->
+ [io_lib:format(" %% ~ts:~p\n", [File,Line]) |
+ format_instr_anno(Anno, FuncAnno, Args)];
+format_instr_anno(#{result_type:=T}=Anno0, FuncAnno, Args) ->
Anno = maps:remove(result_type, Anno0),
Break = "\n %% ",
[io_lib:format(" %% Result type:~s~s\n",
- [Break, format_type(T, Break)]) | format_anno(Anno)];
-format_anno(Anno) ->
- format_anno_1(Anno).
+ [Break, format_type(T, Break)]) |
+ format_instr_anno(Anno, FuncAnno, Args)];
+format_instr_anno(#{arg_types:=Ts}=Anno0, FuncAnno, Args) ->
+ Anno = maps:remove(arg_types, Anno0),
-format_anno_1(Anno) ->
+ Break = "\n %% ",
+
+ Iota = lists:seq(0, length(Args) - 1),
+ Formatted0 = [[format_arg(Arg, FuncAnno), " => ",
+ format_type(map_get(Idx, Ts),
+ Break)]
+ || {Idx, Arg} <- lists:zip(Iota, Args), is_map_key(Idx, Ts)],
+ Formatted = lists:join(Break, Formatted0),
+
+ [io_lib:format(" %% Argument types:~s~ts\n",
+ [Break, unicode:characters_to_list(Formatted)]) |
+ format_instr_anno(Anno, FuncAnno, Args)];
+format_instr_anno(Anno, _FuncAnno, _Args) ->
+ format_instr_anno_1(Anno).
+
+format_instr_anno_1(Anno) ->
case map_size(Anno) of
0 ->
[];
@@ -274,3 +292,112 @@ format_live_interval(#b_var{}=Dst, #{live_intervals:=Intervals}) ->
end;
format_live_interval(_, _) -> [].
+format_type(any) ->
+ "any()";
+format_type(#t_atom{elements=any}) ->
+ "atom()";
+format_type(#t_atom{elements=Es}) ->
+ string:join([io_lib:format("'~p'", [E])
+ || E <- ordsets:to_list(Es)], " | ");
+format_type(#t_bs_matchable{tail_unit=U}) ->
+ io_lib:format("bs_matchable(~p)", [U]);
+format_type(#t_bitstring{size_unit=S}) ->
+ io_lib:format("bitstring(~p)", [S]);
+format_type(#t_bs_context{tail_unit=U}) ->
+ io_lib:format("bs_context(~p)", [U]);
+format_type(#t_fun{arity=any,type=any}) ->
+ "fun()";
+format_type(#t_fun{arity=any,type=T}) ->
+ ["fun((...) -> ", format_type(T), ")"];
+format_type(#t_fun{arity=A,type=any}) ->
+ ["fun((", format_fun_args(A), "))"];
+format_type(#t_fun{arity=A,type=T}) ->
+ ["fun((", format_fun_args(A), ") -> ", format_type(T), ")"];
+format_type(#t_map{super_key=any,super_value=any}) ->
+ "map()";
+format_type(#t_map{super_key=none,super_value=none}) ->
+ "#{}";
+format_type(#t_map{super_key=K,super_value=V}) ->
+ ["#{", format_type(K), "=>", format_type(V), "}"];
+format_type(number) ->
+ "number()";
+format_type(#t_float{elements=any}) ->
+ "float()";
+format_type(#t_float{elements={X,X}}) ->
+ io_lib:format("~p", [X]);
+format_type(#t_float{elements={Low,High}}) ->
+ io_lib:format("~p..~p", [Low,High]);
+format_type(#t_integer{elements=any}) ->
+ "integer()";
+format_type(#t_integer{elements={X,X}}) ->
+ io_lib:format("~p", [X]);
+format_type(#t_integer{elements={Low,High}}) ->
+ io_lib:format("~p..~p", [Low,High]);
+format_type(#t_list{type=ET,terminator=nil}) ->
+ ["list(", format_type(ET), ")"];
+format_type(#t_list{type=ET,terminator=TT}) ->
+ ["maybe_improper_list(", format_type(ET), ", ", format_type(TT), ")"];
+format_type(#t_cons{type=ET,terminator=nil}) ->
+ ["nonempty_list(", format_type(ET), ")"];
+format_type(#t_cons{type=ET,terminator=TT}) ->
+ ["nonempty_improper_list(", format_type(ET), ", ", format_type(TT), ")"];
+format_type(nil) ->
+ "nil()";
+format_type(#t_tuple{elements=Es,exact=Ex,size=S}) ->
+ ["{",
+ string:join(format_tuple_elems(S, Ex, Es, 1), ", "),
+ "}"];
+format_type(pid) ->
+ "pid()";
+format_type(port) ->
+ "pid()";
+format_type(reference) ->
+ "reference()";
+format_type(none) ->
+ "none()";
+format_type(#t_union{atom=A,list=L,number=N,tuple_set=Ts,other=O}) ->
+ Es = case A of
+ none -> [];
+ _ -> [format_type(A)]
+ end
+ ++ case L of
+ none -> [];
+ _ -> [format_type(L)]
+ end
+ ++ case N of
+ none -> [];
+ _ -> [format_type(N)]
+ end
+ ++ case Ts of
+ none -> [];
+ _ -> [format_tuple_set(Ts)]
+ end
+ ++ case O of
+ none -> [];
+ _ -> [format_type(O)]
+ end,
+ string:join(Es, " | ").
+
+format_fun_args(A) ->
+ string:join(lists:duplicate(A, "_"), ", ").
+
+format_tuple_elems(Size, true, _Elems, Idx) when Idx > Size ->
+ [];
+format_tuple_elems(Size, false, _Elems, Idx) when Idx > Size ->
+ ["..."];
+format_tuple_elems(Size, Exact, Elems, Idx) ->
+ T = case Elems of
+ #{ Idx := Ty} -> Ty;
+ _ -> any
+ end,
+ [format_type(T)|format_tuple_elems(Size, Exact, Elems, Idx + 1)].
+
+format_tuple_set(#t_tuple{}=T) ->
+ format_type(T);
+format_tuple_set(RecordSet) ->
+ string:join([format_tuple_set_1(T) || T <- ordsets:to_list(RecordSet)],
+ " | ").
+
+format_tuple_set_1({{Arity,Key},#t_tuple{size=Arity,elements=Elems}=Tuple}) ->
+ Key = map_get(1, Elems), % Assertion
+ format_type(Tuple).
diff --git a/lib/compiler/src/beam_ssa_pre_codegen.erl b/lib/compiler/src/beam_ssa_pre_codegen.erl
index 878c830fba..46ed12490f 100644
--- a/lib/compiler/src/beam_ssa_pre_codegen.erl
+++ b/lib/compiler/src/beam_ssa_pre_codegen.erl
@@ -69,31 +69,30 @@
-export([module/2]).
-include("beam_ssa.hrl").
+-include("beam_asm.hrl").
-import(lists, [all/2,any/2,append/1,duplicate/2,
foldl/3,last/1,member/2,partition/2,
- reverse/1,reverse/2,sort/1,splitwith/2,zip/2]).
+ reverse/1,reverse/2,seq/2,sort/1,
+ splitwith/2,usort/1,zip/2]).
-spec module(beam_ssa:b_module(), [compile:option()]) ->
{'ok',beam_ssa:b_module()}.
module(#b_module{body=Fs0}=Module, Opts) ->
- UseBSM3 = not proplists:get_bool(no_bsm3, Opts),
Ps = passes(Opts),
- Fs = functions(Fs0, Ps, UseBSM3),
+ Fs1 = functions(Fs0, Ps),
+ Fs = create_fc_stubs(Fs1, Module),
{ok,Module#b_module{body=Fs}}.
-functions([F|Fs], Ps, UseBSM3) ->
- [function(F, Ps, UseBSM3)|functions(Fs, Ps, UseBSM3)];
-functions([], _Ps, _UseBSM3) -> [].
+functions([F|Fs], Ps) ->
+ [function(F, Ps)|functions(Fs, Ps)];
+functions([], _Ps) -> [].
-type b_var() :: beam_ssa:b_var().
-type var_name() :: beam_ssa:var_name().
-type instr_number() :: pos_integer().
-type range() :: {instr_number(),instr_number()}.
--type reg_num() :: beam_asm:reg_num().
--type xreg() :: {'x',reg_num()}.
--type yreg() :: {'y',reg_num()}.
-type ypool() :: {'y',beam_ssa:label()}.
-type reservation() :: 'fr' | {'prefer',xreg()} | 'x' | {'x',xreg()} |
ypool() | {yreg(),ypool()} | 'z'.
@@ -103,7 +102,6 @@ functions([], _Ps, _UseBSM3) -> [].
-record(st, {ssa :: beam_ssa:block_map(),
args :: [b_var()],
cnt :: beam_ssa:label(),
- use_bsm3 :: boolean(),
frames=[] :: [beam_ssa:label()],
intervals=[] :: [{b_var(),[range()]}],
res=[] :: [{b_var(),reservation()}] | #{b_var():=reservation()},
@@ -115,17 +113,12 @@ functions([], _Ps, _UseBSM3) -> [].
passes(Opts) ->
AddPrecgAnnos = proplists:get_bool(dprecg, Opts),
- FixTuples = proplists:get_bool(no_put_tuple2, Opts),
Ps = [?PASS(assert_no_critical_edges),
%% Preliminaries.
?PASS(fix_bs),
?PASS(sanitize),
- ?PASS(match_fail_instructions),
- case FixTuples of
- false -> ignore;
- true -> ?PASS(fix_tuples)
- end,
+ ?PASS(expand_match_fail),
?PASS(use_set_tuple_element),
?PASS(place_frames),
?PASS(fix_receives),
@@ -134,10 +127,6 @@ passes(Opts) ->
?PASS(find_yregs),
?PASS(reserve_yregs),
- %% Handle legacy binary match instruction that don't
- %% accept a Y register as destination.
- ?PASS(legacy_bs),
-
%% Improve reuse of Y registers to potentially
%% reduce the size of the stack frame.
?PASS(copy_retval),
@@ -163,11 +152,10 @@ passes(Opts) ->
?PASS(assert_no_critical_edges)],
[P || P <- Ps, P =/= ignore].
-function(#b_function{anno=Anno,args=Args,bs=Blocks0,cnt=Count0}=F0,
- Ps, UseBSM3) ->
+function(#b_function{anno=Anno,args=Args,bs=Blocks0,cnt=Count0}=F0, Ps) ->
try
Location = maps:get(location, Anno, none),
- St0 = #st{ssa=Blocks0,args=Args,use_bsm3=UseBSM3,
+ St0 = #st{ssa=Blocks0,args=Args,
cnt=Count0,location=Location},
St = compile:run_sub_passes(Ps, St0),
#st{ssa=Blocks,cnt=Count,regs=Regs,extra_annos=ExtraAnnos} = St,
@@ -210,14 +198,9 @@ assert_no_ces(_, #b_blk{is=[#b_set{op=phi,args=[_,_]=Phis}|_]}, Blocks) ->
assert_no_ces(_, _, Blocks) -> Blocks.
%% fix_bs(St0) -> St.
-%% Fix up the binary matching instructions:
-%%
-%% * Insert bs_save and bs_restore instructions where needed.
-%%
-%% * Combine bs_match and bs_extract instructions to bs_get
-%% instructions.
+%% Combine bs_match and bs_extract instructions to bs_get instructions.
-fix_bs(#st{ssa=Blocks,cnt=Count0,use_bsm3=UseBSM3}=St) ->
+fix_bs(#st{ssa=Blocks,cnt=Count0}=St) ->
F = fun(#b_set{op=bs_start_match,dst=Dst}, A) ->
%% Mark the root of the match context list.
[{Dst,{context,Dst}}|A];
@@ -237,12 +220,7 @@ fix_bs(#st{ssa=Blocks,cnt=Count0,use_bsm3=UseBSM3}=St) ->
Linear0 = beam_ssa:linearize(Blocks),
%% Insert position instructions where needed.
- {Linear1,Count} = case UseBSM3 of
- true ->
- bs_pos_bsm3(Linear0, CtxChain, Count0);
- false ->
- bs_pos_bsm2(Linear0, CtxChain, Count0)
- end,
+ {Linear1,Count} = bs_pos_bsm3(Linear0, CtxChain, Count0),
%% Rename instructions.
Linear = bs_instrs(Linear1, CtxChain, []),
@@ -296,60 +274,6 @@ make_bs_pos_dict_1([H|T], Ctx, I, Acc) ->
make_bs_pos_dict_1([], Ctx, I, Acc) ->
{[{Ctx,I}|Acc], I}.
-%% As bs_position but without OTP-22 instructions. This is only used when
-%% cross-compiling to older versions.
-bs_pos_bsm2(Linear0, CtxChain, Count0) ->
- Rs0 = bs_restores(Linear0, CtxChain, #{}, #{}),
- Rs = maps:values(Rs0),
- S0 = sofs:relation(Rs, [{context,save_point}]),
- S1 = sofs:relation_to_family(S0),
- S = sofs:to_external(S1),
- Slots = make_save_point_dict(S, []),
- {Saves,Count1} = make_save_map(Rs, Slots, Count0, []),
- {Restores,Count} = make_restore_map(maps:to_list(Rs0), Slots, Count1, []),
-
- %% Now insert all saves and restores.
- {bs_insert_bsm2(Linear0, Saves, Restores, Slots),Count}.
-
-make_save_map([{Ctx,Save}=Ps|T], Slots, Count, Acc) ->
- Ignored = #b_var{name={'@ssa_ignored',Count}},
- case make_slot(Ps, Slots) of
- #b_literal{val=start} ->
- make_save_map(T, Slots, Count, Acc);
- Slot ->
- I = #b_set{op=bs_save,dst=Ignored,args=[Ctx,Slot]},
- make_save_map(T, Slots, Count+1, [{Save,I}|Acc])
- end;
-make_save_map([], _, Count, Acc) ->
- {maps:from_list(Acc),Count}.
-
-make_restore_map([{Bef,{Ctx,_}=Ps}|T], Slots, Count, Acc) ->
- Ignored = #b_var{name={'@ssa_ignored',Count}},
- I = #b_set{op=bs_restore,dst=Ignored,args=[Ctx,make_slot(Ps, Slots)]},
- make_restore_map(T, Slots, Count+1, [{Bef,I}|Acc]);
-make_restore_map([], _, Count, Acc) ->
- {maps:from_list(Acc),Count}.
-
-make_slot({Same,Same}, _Slots) ->
- #b_literal{val=start};
-make_slot({_,_}=Ps, Slots) ->
- #b_literal{val=map_get(Ps, Slots)}.
-
-make_save_point_dict([{Ctx,Pts}|T], Acc0) ->
- Acc = make_save_point_dict_1(Pts, Ctx, 0, Acc0),
- make_save_point_dict(T, Acc);
-make_save_point_dict([], Acc) ->
- maps:from_list(Acc).
-
-make_save_point_dict_1([Ctx|T], Ctx, I, Acc) ->
- %% Special {atom,start} save point. Does not need a
- %% bs_save instruction.
- make_save_point_dict_1(T, Ctx, I, Acc);
-make_save_point_dict_1([H|T], Ctx, I, Acc) ->
- make_save_point_dict_1(T, Ctx, I+1, [{{Ctx,H},I}|Acc]);
-make_save_point_dict_1([], Ctx, I, Acc) ->
- [{Ctx,I}|Acc].
-
bs_restores([{L,#b_blk{is=Is,last=Last}}|Bs], CtxChain, D0, Rs0) ->
InPos = maps:get(L, D0, #{}),
{SuccPos, FailPos, Rs} = bs_restores_is(Is, CtxChain, InPos, InPos, Rs0),
@@ -561,20 +485,6 @@ bs_restore_args([], Pos, _CtxChain, _Dst, Rs) ->
bs_insert_bsm3(Blocks, Saves, Restores) ->
bs_insert_1(Blocks, [], Saves, Restores, fun(I) -> I end).
-bs_insert_bsm2(Blocks, Saves, Restores, Slots) ->
- %% The old instructions require bs_start_match to be annotated with the
- %% number of position slots it needs.
- bs_insert_1(Blocks, [], Saves, Restores,
- fun(#b_set{op=bs_start_match,dst=Dst}=I0) ->
- NumSlots = case Slots of
- #{Dst:=NumSlots0} -> NumSlots0;
- #{} -> 0
- end,
- beam_ssa:add_anno(num_slots, NumSlots, I0);
- (I) ->
- I
- end).
-
bs_insert_1([{L,#b_blk{is=Is0}=Blk} | Bs], Deferred0, Saves, Restores, XFrm) ->
Is1 = bs_insert_deferred(Is0, Deferred0),
{Is, Deferred} = bs_insert_is(Is1, Saves, Restores, XFrm, []),
@@ -668,59 +578,6 @@ bs_subst_ctx(#b_var{}=Var, CtxChain) ->
bs_subst_ctx(Other, _CtxChain) ->
Other.
-%% legacy_bs(St0) -> St.
-%% Binary matching instructions in OTP 21 and earlier don't support
-%% a Y register as destination. If St#st.use_bsm3 is false,
-%% we will need to rewrite those instructions so that the result
-%% is first put in an X register and then moved to a Y register
-%% if the operation succeeded.
-
-legacy_bs(#st{use_bsm3=false,ssa=Blocks0,cnt=Count0,res=Res}=St) ->
- IsYreg = maps:from_list([{V,true} || {V,{y,_}} <- Res]),
- Linear0 = beam_ssa:linearize(Blocks0),
- {Linear,Count} = legacy_bs(Linear0, IsYreg, Count0, #{}, []),
- Blocks = maps:from_list(Linear),
- St#st{ssa=Blocks,cnt=Count};
-legacy_bs(#st{use_bsm3=true}=St) -> St.
-
-legacy_bs([{L,Blk}|Bs], IsYreg, Count0, Copies0, Acc) ->
- #b_blk{is=Is0,last=Last} = Blk,
- Is1 = case Copies0 of
- #{L:=Copy} -> [Copy|Is0];
- #{} -> Is0
- end,
- {Is,Count,Copies} = legacy_bs_is(Is1, Last, IsYreg, Count0, Copies0, []),
- legacy_bs(Bs, IsYreg, Count, Copies, [{L,Blk#b_blk{is=Is}}|Acc]);
-legacy_bs([], _IsYreg, Count, _Copies, Acc) ->
- {Acc,Count}.
-
-legacy_bs_is([#b_set{op=Op,dst=Dst}=I0,
- #b_set{op=succeeded,dst=SuccDst,args=[Dst]}=SuccI0],
- Last, IsYreg, Count0, Copies0, Acc) ->
- NeedsFix = is_map_key(Dst, IsYreg) andalso
- case Op of
- bs_get -> true;
- bs_init -> true;
- _ -> false
- end,
- case NeedsFix of
- true ->
- TempDst = #b_var{name={'@bs_temp_dst',Count0}},
- Count = Count0 + 1,
- I = I0#b_set{dst=TempDst},
- SuccI = SuccI0#b_set{args=[TempDst]},
- Copy = #b_set{op=copy,dst=Dst,args=[TempDst]},
- #b_br{bool=SuccDst,succ=SuccL} = Last,
- Copies = Copies0#{SuccL=>Copy},
- legacy_bs_is([], Last, IsYreg, Count, Copies, [SuccI,I|Acc]);
- false ->
- legacy_bs_is([], Last, IsYreg, Count0, Copies0, [SuccI0,I0|Acc])
- end;
-legacy_bs_is([I|Is], Last, IsYreg, Count, Copies, Acc) ->
- legacy_bs_is(Is, Last, IsYreg, Count, Copies, [I|Acc]);
-legacy_bs_is([], _Last, _IsYreg, Count, Copies, Acc) ->
- {reverse(Acc),Count,Copies}.
-
%% sanitize(St0) -> St.
%% Remove constructs that can cause problems later:
%%
@@ -732,82 +589,84 @@ legacy_bs_is([], _Last, _IsYreg, Count, Copies, Acc) ->
sanitize(#st{ssa=Blocks0,cnt=Count0}=St) ->
Ls = beam_ssa:rpo(Blocks0),
- {Blocks,Count} = sanitize(Ls, Count0, Blocks0, #{}),
+ {Blocks,Count} = sanitize(Ls, Blocks0, Count0, #{}),
St#st{ssa=Blocks,cnt=Count}.
-sanitize([L|Ls], Count0, Blocks0, Values0) ->
+sanitize([L|Ls], Blocks0, Count0, Values0) ->
#b_blk{is=Is0,last=Last0} = Blk0 = map_get(L, Blocks0),
- case sanitize_is(Is0, Last0, Count0, Values0, false, []) of
+ case sanitize_is(Is0, Last0, Blocks0, Count0, Values0, false, []) of
no_change ->
- sanitize(Ls, Count0, Blocks0, Values0);
+ sanitize(Ls, Blocks0, Count0, Values0);
{Is,Last,Count,Values} ->
Blk = Blk0#b_blk{is=Is,last=Last},
Blocks = Blocks0#{L:=Blk},
- sanitize(Ls, Count, Blocks, Values)
+ sanitize(Ls, Blocks, Count, Values)
end;
-sanitize([], Count, Blocks0, Values) ->
+sanitize([], Blocks0, Count, Values) ->
Blocks = if
- map_size(Values) =:= 0 ->
- Blocks0;
- true ->
- RPO = beam_ssa:rpo(Blocks0),
- beam_ssa:rename_vars(Values, RPO, Blocks0)
- end,
+ map_size(Values) =:= 0 ->
+ Blocks0;
+ true ->
+ RPO = beam_ssa:rpo(Blocks0),
+ beam_ssa:rename_vars(Values, RPO, Blocks0)
+ end,
%% Unreachable blocks can cause problems for the dominator calculations.
Ls = beam_ssa:rpo(Blocks),
Reachable = gb_sets:from_list(Ls),
{case map_size(Blocks) =:= gb_sets:size(Reachable) of
- true -> Blocks;
- false -> remove_unreachable(Ls, Blocks, Reachable, [])
- end,Count}.
+ true -> Blocks;
+ false -> remove_unreachable(Ls, Blocks, Reachable, [])
+ end, Count}.
sanitize_is([#b_set{op=get_map_element,args=Args0}=I0|Is],
- Last, Count0, Values, Changed, Acc) ->
+ Last, Blocks, Count0, Values, Changed, Acc) ->
case sanitize_args(Args0, Values) of
[#b_literal{}=Map,Key] ->
%% Bind the literal map to a variable.
{MapVar,Count} = new_var('@ssa_map', Count0),
I = I0#b_set{args=[MapVar,Key]},
Copy = #b_set{op=copy,dst=MapVar,args=[Map]},
- sanitize_is(Is, Last, Count, Values, true, [I,Copy|Acc]);
+ sanitize_is(Is, Last, Blocks, Count, Values, true, [I,Copy|Acc]);
[_,_]=Args0 ->
- sanitize_is(Is, Last, Count0, Values, Changed, [I0|Acc]);
+ sanitize_is(Is, Last, Blocks, Count0, Values, Changed, [I0|Acc]);
[_,_]=Args ->
I = I0#b_set{args=Args},
- sanitize_is(Is, Last, Count0, Values, true, [I|Acc])
- end;
-sanitize_is([#b_set{op={succeeded,guard},dst=Dst,args=[Arg0]}=I0],
- #b_br{bool=Dst}=Last, Count, Values, _Changed, Acc0) ->
- %% We no longer need to distinguish between guard and body checks, so we'll
- %% rewrite this as a plain 'succeeded'.
- case sanitize_arg(Arg0, Values) of
- #b_var{}=Arg ->
- case Acc0 of
- [#b_set{op=call,
- args=[#b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error},
- arity=1},_],
- dst=Arg0}|Acc] ->
- %% This erlang:error/1 is the result from a
- %% sanitized bs_add or bs_init instruction. Calls
- %% to erlang:error/1 in receive is not allowed, so
- %% we will have to rewrite this instruction
- %% sequence to an unconditional branch to the
- %% failure label.
- Fail = Last#b_br.fail,
- Br = #b_br{bool=#b_literal{val=true},succ=Fail,fail=Fail},
- {reverse(Acc), Br, Count, Values};
- _ ->
- I = I0#b_set{op=succeeded,args=[Arg]},
- {reverse(Acc0, [I]), Last, Count, Values}
- end;
- #b_literal{} ->
- Value = #b_literal{val=true},
- {reverse(Acc0), Last, Count, Values#{ Dst => Value }}
- end;
-sanitize_is([#b_set{op={succeeded,body},dst=Dst,args=[Arg0]}=I0],
- #b_br{bool=Dst}=Last, Count, Values, _Changed, Acc) ->
+ sanitize_is(Is, Last, Blocks, Count0, Values, true, [I|Acc])
+ end;
+sanitize_is([#b_set{op=call,dst=CallDst}=Call,
+ #b_set{op={succeeded,body},dst=SuccDst,args=[CallDst]}=Succ],
+ #b_br{bool=SuccDst,succ=SuccLbl,fail=?EXCEPTION_BLOCK}=Last0,
+ Blocks, Count, Values, Changed, Acc) ->
+ case Blocks of
+ #{ SuccLbl := #b_blk{is=[],last=#b_ret{arg=CallDst}=Last} } ->
+ %% Tail call that may fail, translate the terminator to an ordinary
+ %% return to simplify code generation.
+ do_sanitize_is(Call, [], Last, Blocks, Count, Values,
+ true, Acc);
+ #{} ->
+ do_sanitize_is(Call, [Succ], Last0, Blocks, Count, Values,
+ Changed, Acc)
+ end;
+sanitize_is([#b_set{op=Op,dst=Dst}=Fail,
+ #b_set{op={succeeded,body},args=[Dst]}],
+ #b_br{fail=?EXCEPTION_BLOCK},
+ Blocks, Count, Values, _Changed, Acc)
+ when Op =:= match_fail; Op =:= resume ->
+ %% Match failure or rethrow without a local handler. Translate the
+ %% terminator to an ordinary return to simplify code generation.
+ Last = #b_ret{arg=Dst},
+ do_sanitize_is(Fail, [], Last, Blocks, Count, Values, true, Acc);
+sanitize_is([#b_set{op=match_fail,dst=RaiseDst},
+ #b_set{op={succeeded,guard},dst=SuccDst,args=[RaiseDst]}],
+ #b_br{bool=SuccDst}=Last0,
+ Blocks, Count, Values, _Changed, Acc) ->
+ %% Match failures may be present in guards when optimizations are turned
+ %% off. They must be treated as if they always fail.
+ Last = beam_ssa:normalize(Last0#b_br{bool=#b_literal{val=false}}),
+ sanitize_is([], Last, Blocks, Count, Values, true, Acc);
+sanitize_is([#b_set{op={succeeded,_Kind},dst=Dst,args=[Arg0]}=I0],
+ #b_br{bool=Dst}=Last, _Blocks, Count, Values, _Changed, Acc) ->
%% We no longer need to distinguish between guard and body checks, so we'll
%% rewrite this as a plain 'succeeded'.
case sanitize_arg(Arg0, Values) of
@@ -819,7 +678,7 @@ sanitize_is([#b_set{op={succeeded,body},dst=Dst,args=[Arg0]}=I0],
{reverse(Acc), Last, Count, Values#{ Dst => Value }}
end;
sanitize_is([#b_set{op={succeeded,Kind},args=[Arg0]} | Is],
- Last, Count, Values, _Changed, Acc) ->
+ Last, Blocks, Count, Values, _Changed, Acc) ->
%% We're no longer branching on this instruction and can safely remove it.
[] = Is, #b_br{succ=Same,fail=Same} = Last, %Assertion.
if
@@ -828,23 +687,24 @@ sanitize_is([#b_set{op={succeeded,Kind},args=[Arg0]} | Is],
%% in a try/catch; rewrite the terminator to a return.
body = Kind, %Assertion.
Arg = sanitize_arg(Arg0, Values),
- sanitize_is(Is, #b_ret{arg=Arg}, Count, Values, true, Acc);
+ sanitize_is(Is, #b_ret{arg=Arg}, Blocks, Count, Values, true, Acc);
Same =/= ?EXCEPTION_BLOCK ->
%% We either always succeed, or always fail to somewhere other than
%% the exception block.
true = Kind =:= guard orelse Kind =:= body, %Assertion.
- sanitize_is(Is, Last, Count, Values, true, Acc)
+ sanitize_is(Is, Last, Blocks, Count, Values, true, Acc)
end;
-sanitize_is([#b_set{op=bs_test_tail}=I], Last, Count, Values, Changed, Acc) ->
+sanitize_is([#b_set{op=bs_test_tail}=I], Last, Blocks, Count, Values,
+ Changed, Acc) ->
case Last of
#b_br{succ=Same,fail=Same} ->
- sanitize_is([], Last, Count, Values, true, Acc);
+ sanitize_is([], Last, Blocks, Count, Values, true, Acc);
_ ->
- do_sanitize_is(I, [], Last, Count, Values, Changed, Acc)
+ do_sanitize_is(I, [], Last, Blocks, Count, Values, Changed, Acc)
end;
-sanitize_is([#b_set{}=I|Is], Last, Count, Values, Changed, Acc) ->
- do_sanitize_is(I, Is, Last, Count, Values, Changed, Acc);
-sanitize_is([], Last, Count, Values, Changed, Acc) ->
+sanitize_is([#b_set{}=I|Is], Last, Blocks, Count, Values, Changed, Acc) ->
+ do_sanitize_is(I, Is, Last, Blocks, Count, Values, Changed, Acc);
+sanitize_is([], Last, _Blocks, Count, Values, Changed, Acc) ->
case Changed of
true ->
{reverse(Acc), Last, Count, Values};
@@ -853,18 +713,19 @@ sanitize_is([], Last, Count, Values, Changed, Acc) ->
end.
do_sanitize_is(#b_set{op=Op,dst=Dst,args=Args0}=I0,
- Is, Last, Count, Values, Changed0, Acc) ->
+ Is, Last, Blocks, Count, Values, Changed0, Acc) ->
Args = sanitize_args(Args0, Values),
case sanitize_instr(Op, Args, I0) of
{value,Value0} ->
Value = #b_literal{val=Value0},
- sanitize_is(Is, Last, Count, Values#{Dst=>Value}, true, Acc);
+ sanitize_is(Is, Last, Blocks, Count, Values#{Dst=>Value},
+ true, Acc);
{ok,I} ->
- sanitize_is(Is, Last, Count, Values, true, [I|Acc]);
+ sanitize_is(Is, Last, Blocks, Count, Values, true, [I|Acc]);
ok ->
I = I0#b_set{args=Args},
Changed = Changed0 orelse Args =/= Args0,
- sanitize_is(Is, Last, Count, Values, Changed, [I|Acc])
+ sanitize_is(Is, Last, Blocks, Count, Values, Changed, [I|Acc])
end.
sanitize_args(Args, Values) ->
@@ -886,7 +747,7 @@ sanitize_instr(phi, PhiArgs, _I) ->
%% turned off.)
%%
%% This phi node always produces the same literal value.
- %% We must do constant progation of the value to ensure
+ %% We must do constant propagation of the value to ensure
%% that we can sanitize any instructions that don't accept
%% literals (such as `get_hd`). This is necessary for
%% correctness, because beam_ssa_codegen:prefer_xregs/2
@@ -946,31 +807,9 @@ sanitize_instr(is_tagged_tuple, [#b_literal{val=Tuple},
true ->
{value,false}
end;
-sanitize_instr(bs_add, [Arg1,Arg2,_|_], I0) ->
- case all(fun(#b_literal{val=Size}) -> is_integer(Size) andalso Size >= 0;
- (#b_var{}) -> true
- end, [Arg1,Arg2]) of
- true -> ok;
- false -> {ok,sanitize_badarg(I0)}
- end;
-sanitize_instr(bs_init, [#b_literal{val=new},#b_literal{val=Sz}|_], I0) ->
- if
- is_integer(Sz), Sz >= 0 -> ok;
- true -> {ok,sanitize_badarg(I0)}
- end;
-sanitize_instr(bs_init, [#b_literal{},_,#b_literal{val=Sz}|_], I0) ->
- if
- is_integer(Sz), Sz >= 0 -> ok;
- true -> {ok,sanitize_badarg(I0)}
- end;
sanitize_instr(_, _, _) ->
ok.
-sanitize_badarg(I) ->
- Func = #b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error},arity=1},
- I#b_set{op=call,args=[Func,#b_literal{val=badarg}]}.
-
remove_unreachable([L|Ls], Blocks, Reachable, Acc) ->
#b_blk{is=Is0} = Blk0 = map_get(L, Blocks),
case split_phis(Is0) of
@@ -1014,123 +853,142 @@ phi_all_same_literal_1(_Phis, _Arg) ->
%%% instruction with the name of the BEAM instruction as the first
%%% argument.
-match_fail_instructions(#st{ssa=Blocks0,args=Args,location=Location}=St) ->
- Ls = maps:to_list(Blocks0),
- Info = {length(Args),Location},
- Blocks = match_fail_instrs_1(Ls, Info, Blocks0),
- St#st{ssa=Blocks}.
+expand_match_fail(#st{ssa=Blocks0,
+ cnt=Count0,
+ args=Args,
+ location=Location}=St) ->
+ Bs = maps:to_list(Blocks0),
+ {Blocks, Count} = expand_mf_bs(Bs, length(Args), Location, Blocks0, Count0),
+ St#st{ssa=Blocks,cnt=Count}.
-match_fail_instrs_1([{L,#b_blk{is=Is0}=Blk}|Bs], Arity, Blocks0) ->
- case match_fail_instrs_blk(Is0, Arity, []) of
+expand_mf_bs([{L,#b_blk{is=Is0}=Blk} | Bs], Arity, Location, Blocks0, Count0) ->
+ case expand_mf_is(Is0, Arity, Location, Count0, []) of
none ->
- match_fail_instrs_1(Bs, Arity, Blocks0);
- Is ->
+ expand_mf_bs(Bs, Arity, Location, Blocks0, Count0);
+ {Is, Count} ->
Blocks = Blocks0#{L:=Blk#b_blk{is=Is}},
- match_fail_instrs_1(Bs, Arity, Blocks)
- end;
-match_fail_instrs_1([], _Arity, Blocks) -> Blocks.
-
-match_fail_instrs_blk([#b_set{op=put_tuple,dst=Dst,
- args=[#b_literal{val=Tag},Val]},
- #b_set{op=call,
- args=[#b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error}},
- Dst]}=Call|Is],
- _Arity, Acc) ->
- match_fail_instr(Call, Tag, Val, Is, Acc);
-match_fail_instrs_blk([#b_set{op=call,
- args=[#b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error}},
- #b_literal{val={Tag,Val}}]}=Call|Is],
- _Arity, Acc) ->
- match_fail_instr(Call, Tag, #b_literal{val=Val}, Is, Acc);
-match_fail_instrs_blk([#b_set{op=call,
- args=[#b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error}},
- #b_literal{val=if_clause}]}=Call|Is],
- _Arity, Acc) ->
- I = Call#b_set{op=match_fail,args=[#b_literal{val=if_end}]},
- reverse(Acc, [I|Is]);
-match_fail_instrs_blk([#b_set{op=call,anno=Anno,
- args=[#b_remote{mod=#b_literal{val=erlang},
- name=#b_literal{val=error}},
- #b_literal{val=function_clause},
- Stk]}=Call],
- {Arity,Location}, Acc) ->
- case match_fail_stk(Stk, Acc, [], []) of
- {[_|_]=Vars,Is} when length(Vars) =:= Arity ->
- case maps:get(location, Anno, none) of
- Location ->
- I = Call#b_set{op=match_fail,
- args=[#b_literal{val=function_clause}|Vars]},
- Is ++ [I];
- _ ->
- %% erlang:error/2 has a different location than the
- %% func_info instruction at the beginning of the function
- %% (probably because of inlining). Keep the original call.
- reverse(Acc, [Call])
- end;
- _ ->
- %% Either the stacktrace could not be picked apart (for example,
- %% if the call to erlang:error/2 was handwritten) or the number
- %% of arguments in the stacktrace was different from the arity
- %% of the host function (because it is the implementation of a
- %% fun). Keep the original call.
- reverse(Acc, [Call])
- end;
-match_fail_instrs_blk([I|Is], Arity, Acc) ->
- match_fail_instrs_blk(Is, Arity, [I|Acc]);
-match_fail_instrs_blk(_, _, _) ->
- none.
+ expand_mf_bs(Bs, Arity, Location, Blocks, Count)
+ end;
+expand_mf_bs([], _Arity, _Location, Blocks, Count) ->
+ {Blocks, Count}.
-match_fail_instr(Call, Tag, Val, Is, Acc) ->
- Op = case Tag of
- badmatch -> Tag;
- case_clause -> case_end;
- try_clause -> try_case_end;
- _ -> none
- end,
- case Op of
- none ->
+expand_mf_is([#b_set{op=match_fail,
+ anno=Anno,
+ args=[#b_literal{val=function_clause} | Args]}=I0 | Is],
+ Arity, Location, Count0, Acc) ->
+ case Anno of
+ #{ location := Location } when length(Args) =:= Arity ->
+ %% We have the same location as the `func_info` instruction at the
+ %% beginning of the function; keep the instruction.
+ none;
+ #{ inlined := {Name,InlinedArity} } ->
+ %% We're raising this for an inlined function, convert it to a call
+ %% to a stub function that will raise a proper `function_clause`
+ %% exception. The stub function will be created later by
+ %% `create_fc_stubs/2`.
+ Target = #b_local{name=#b_literal{val=Name},arity=InlinedArity},
+ I = I0#b_set{op=call,args=[Target | Args]},
+ {reverse(Acc, [I | Is]), Count0};
+ #{} when Location =:= none, length(Args) =:= Arity ->
none;
_ ->
- I = Call#b_set{op=match_fail,args=[#b_literal{val=Op},Val]},
- reverse(Acc, [I|Is])
- end.
-
-match_fail_stk(#b_var{}=V, [#b_set{op=put_list,dst=V,args=[H,T]}|Is], IAcc, VAcc) ->
- match_fail_stk(T, Is, IAcc, [H|VAcc]);
-match_fail_stk(#b_literal{val=[H|T]}, Is, IAcc, VAcc) ->
- match_fail_stk(#b_literal{val=T}, Is, IAcc, [#b_literal{val=H}|VAcc]);
-match_fail_stk(#b_literal{val=[]}, [], IAcc, VAcc) ->
- {reverse(VAcc),IAcc};
-match_fail_stk(T, [#b_set{op=Op}=I|Is], IAcc, VAcc)
- when Op =:= bs_get_tail; Op =:= bs_set_position ->
- match_fail_stk(T, Is, [I|IAcc], VAcc);
-match_fail_stk(_, _, _, _) -> none.
-
-%%%
-%%% Fix tuples.
-%%%
+ expand_mf_instr(I0, Is, Count0, Acc)
+ end;
+expand_mf_is([#b_set{op=match_fail}=I | Is], _Arity, _Location, Count, Acc) ->
+ expand_mf_instr(I, Is, Count, Acc);
+expand_mf_is([I | Is], Arity, Location, Count, Acc) ->
+ expand_mf_is(Is, Arity, Location, Count, [I | Acc]);
+expand_mf_is(_, _, _, _, _) ->
+ none.
-%% fix_tuples(St0) -> St.
-%% If compatibility with a previous version of Erlang has been
-%% requested, tuple creation must be split into two instruction to
-%% mirror the the way tuples are created in BEAM prior to OTP 22.
-%% Each put_tuple instruction is split into put_tuple_arity followed
-%% by put_tuple_elements.
-
-fix_tuples(#st{ssa=Blocks0,cnt=Count0}=St) ->
- F = fun (#b_set{op=put_tuple,args=Args}=Put, C0) ->
- Arity = #b_literal{val=length(Args)},
- {Ignore,C} = new_var('@ssa_ignore', C0),
- {[Put#b_set{op=put_tuple_arity,args=[Arity]},
- #b_set{dst=Ignore,op=put_tuple_elements,args=Args}],C};
- (I, C) -> {[I],C}
+expand_mf_instr(#b_set{args=[#b_literal{val=case_clause} | Args]}=I0,
+ Is, Count, Acc) ->
+ I = I0#b_set{args=[#b_literal{val=case_end} | Args]},
+ {reverse(Acc, [I | Is]), Count};
+expand_mf_instr(#b_set{args=[#b_literal{val=if_clause} | Args]}=I0,
+ Is, Count, Acc) ->
+ I = I0#b_set{args=[#b_literal{val=if_end} | Args]},
+ {reverse(Acc, [I | Is]), Count};
+expand_mf_instr(#b_set{args=[#b_literal{val=try_clause} | Args]}=I0,
+ Is, Count, Acc) ->
+ I = I0#b_set{args=[#b_literal{val=try_case_end} | Args]},
+ {reverse(Acc, [I | Is]), Count};
+expand_mf_instr(#b_set{args=[#b_literal{val=badmatch} | _Args]}=I,
+ Is, Count, Acc) ->
+ {reverse(Acc, [I | Is]), Count};
+expand_mf_instr(#b_set{args=[#b_literal{val=badrecord} | _Args]}=I,
+ Is, Count, Acc) ->
+ {reverse(Acc, [I | Is]), Count};
+expand_mf_instr(#b_set{args=[#b_literal{val=function_clause} | Args]}=I0,
+ Is, Count0, Acc0) ->
+ %% We can't make a direct jump to `func_info` or an inlined stub: simulate
+ %% it with `erlang:error/2` instead.
+ {List, Count, Acc} = expand_mf_args(Args, Count0, Acc0),
+ Call = I0#b_set{op=call,
+ args=[#b_remote{mod=#b_literal{val=erlang},
+ name=#b_literal{val=error},
+ arity=2},
+ #b_literal{val=function_clause},
+ List]},
+ {reverse(Acc, [Call | Is]), Count};
+expand_mf_instr(#b_set{args=[#b_literal{}|_]=Args}=I0, Is, Count0, Acc) ->
+ %% We don't have a specialized instruction for this: simulate it with
+ %% `erlang:error/1` instead.
+ {Tuple, Count} = new_var('@match_fail', Count0),
+ Put = #b_set{op=put_tuple,dst=Tuple,args=Args},
+ Call = I0#b_set{op=call,
+ args=[#b_remote{mod=#b_literal{val=erlang},
+ name=#b_literal{val=error},
+ arity=1},
+ Tuple]},
+ {reverse(Acc, [Put, Call | Is]), Count}.
+
+expand_mf_args([Arg | Args], Count0, Acc0) ->
+ {List, Count1} = new_var('@match_fail', Count0),
+ {Next, Count, Acc} = expand_mf_args(Args, Count1, Acc0),
+ {List, Count, [#b_set{op=put_list,dst=List,args=[Arg, Next]} | Acc]};
+expand_mf_args([], Count, Acc) ->
+ {#b_literal{val=[]}, Count, Acc}.
+
+%% Create stubs for `function_clause` exceptions generated by
+%% inlined code.
+create_fc_stubs(Fs, #b_module{name=Mod}) ->
+ Stubs0 = usort(find_fc_errors(Fs, [])),
+ Stubs = [begin
+ Seq = seq(0, Arity-1),
+ Args = [#b_var{name=V} || V <- Seq],
+ XRegs = [{x,V} || V <- Seq],
+ Ret = #b_var{name='@ssa_ret'},
+ Regs = maps:from_list([{Ret,{x,0}}|zip(Args, XRegs)]),
+ Anno = #{func_info => {Mod,Name,Arity},
+ location => Location,
+ parameter_info => #{},
+ registers => Regs},
+ Fc = #b_set{op=match_fail,dst=Ret,
+ args=[#b_literal{val=function_clause}|Args]},
+ Blk = #b_blk{is=[Fc],last=#b_ret{arg=Ret}},
+ #b_function{anno=Anno,args=Args,
+ bs=#{0 => Blk},
+ cnt=1}
+ end || {{Name,Arity},Location} <- Stubs0],
+ Fs ++ Stubs.
+
+find_fc_errors([#b_function{bs=Blocks}|Fs], Acc0) ->
+ F = fun(#b_set{anno=Anno,op=call,args=[#b_local{} | _]}, A) ->
+ case Anno of
+ #{ inlined := FA } ->
+ [{FA, maps:get(location, Anno, [])} | A];
+ #{} ->
+ A
+ end;
+ (_, A) ->
+ A
end,
- RPO = beam_ssa:rpo(Blocks0),
- {Blocks,Count} = beam_ssa:flatmapfold_instrs(F, RPO, Count0, Blocks0),
- St#st{ssa=Blocks,cnt=Count}.
+ Acc = beam_ssa:fold_instrs(F, maps:keys(Blocks), Acc0, Blocks),
+ find_fc_errors(Fs, Acc);
+find_fc_errors([], Acc) ->
+ Acc.
+
%%%
%%% Introduce the set_tuple_element instructions to make
@@ -1315,7 +1173,7 @@ place_frames_1([], _, _, Tried, Frames) ->
%% do_place_frame(Label, Blocks, Dominators, Tried0, Frames0) -> {Frames,Tried}.
%% Try to place a frame in this block. This function returns
-%% successfully if it either succeds at placing a frame in this
+%% successfully if it either succeeds at placing a frame in this
%% block, if an ancestor that dominates this block has already placed
%% a frame, or if we have already tried to put a frame in this block.
%%
@@ -2021,10 +1879,6 @@ copy_retval_2([L|Ls], Yregs, Copy0, Blocks0, Count0) ->
copy_retval_2([], _Yregs, none, Blocks, Count) ->
{Blocks,Count}.
-copy_retval_is([#b_set{op=put_tuple_elements,args=Args0}=I0], false, _Yregs,
- Copy, Count, Acc) ->
- I = I0#b_set{args=copy_sub_args(Args0, Copy)},
- {reverse(Acc, [I|acc_copy([], Copy)]),Count};
copy_retval_is([#b_set{op=Op}=I0], false, Yregs, Copy, Count0, Acc0)
when Op =:= call; Op =:= old_make_fun ->
{I,Count,Acc} = place_retval_copy(I0, Yregs, Copy, Count0, Acc0),
@@ -2655,7 +2509,7 @@ reserve_zreg([#b_set{op=Op,dst=Dst}], #b_br{bool=Dst}, ShortLived, A) ->
case use_zreg(Op) of
yes -> [{Dst,z} | A];
no -> A;
- maybe -> reserve_test_zreg(Dst, ShortLived, A)
+ 'maybe' -> reserve_test_zreg(Dst, ShortLived, A)
end;
reserve_zreg([#b_set{op=Op,dst=Dst} | Is], Last, ShortLived, A) ->
case use_zreg(Op) of
@@ -2665,12 +2519,9 @@ reserve_zreg([#b_set{op=Op,dst=Dst} | Is], Last, ShortLived, A) ->
reserve_zreg([], _, _, A) -> A.
use_zreg(bs_match_string) -> yes;
-use_zreg(bs_save) -> yes;
-use_zreg(bs_restore) -> yes;
use_zreg(bs_set_position) -> yes;
use_zreg(kill_try_tag) -> yes;
use_zreg(landingpad) -> yes;
-use_zreg(put_tuple_elements) -> yes;
use_zreg(recv_marker_bind) -> yes;
use_zreg(recv_marker_clear) -> yes;
use_zreg(remove_message) -> yes;
@@ -2680,6 +2531,7 @@ use_zreg(wait_timeout) -> yes;
%% There's no way we can combine these into a test instruction, so we must
%% avoid using a z register if their result is used directly in a branch.
use_zreg(call) -> no;
+use_zreg({bif,element}) -> no;
use_zreg({bif,is_map_key}) -> no;
use_zreg({bif,is_record}) -> no;
use_zreg({bif,map_get}) -> no;
@@ -2689,7 +2541,7 @@ use_zreg(get_tl) -> no;
use_zreg(get_tuple_element) -> no;
%% Assume the instruction can use a z register, provided it's the last in its
%% block and that the result is only used in the terminator.
-use_zreg(_) -> maybe.
+use_zreg(_) -> 'maybe'.
%% If V is defined just before a branch, we may be able to combine it into a
%% test instruction.
@@ -2867,6 +2719,12 @@ reserve_terminator(L, Is, #b_br{bool=#b_var{},succ=Succ,fail=Fail},
#{Arg:=Reg} -> #{Arg=>Reg};
#{} -> #{}
end;
+ #b_set{op=new_try_tag} ->
+ %% We know that no X registers will be used at the
+ %% failure label (a block starting with the
+ %% landingpad instruction), so we can pick up
+ %% register hints from the success label.
+ reserve_terminator_1(L, Succ, Is, Blocks, XsMap, Res);
_ ->
%% Register hints from the success block may not
%% be safe at the failure block, and vice versa.
diff --git a/lib/compiler/src/beam_ssa_recv.erl b/lib/compiler/src/beam_ssa_recv.erl
index 9d6e749fb7..ec45780aea 100644
--- a/lib/compiler/src/beam_ssa_recv.erl
+++ b/lib/compiler/src/beam_ssa_recv.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -217,25 +217,37 @@ scan_is([#b_set{op=new_try_tag,dst=Dst}], Blk, Lbl, _Blocks, FuncId, State) ->
%% ignore that branch.
#b_br{bool=Dst,succ=Succ} = Blk#b_blk.last, %Assertion.
scan_add_edge({FuncId, Lbl}, {FuncId, Succ}, State);
-scan_is([#b_set{op=call,dst=Dst,args=[#b_remote{} | _]}=Call | Is],
- Blk, Lbl, Blocks, FuncId, State0) ->
- case {Is, Blk#b_blk.last} of
- {[], #b_ret{arg=Dst}} ->
- scan_is(Is, Blk, Lbl, Blocks, FuncId, State0);
- {[#b_set{op={succeeded,body}}], #b_br{bool=Bool,succ=Succ}} ->
- #b_var{} = Bool, %Assertion.
+scan_is([#b_set{op=call,dst=Dst,args=[#b_remote{} | _]}=Call,
+ #b_set{op={succeeded,body}}],
+ #b_blk{last=#b_br{succ=Succ}}, Lbl, Blocks, FuncId, State0) ->
+ case Blocks of
+ #{ Succ := #b_blk{is=[],last=#b_ret{arg=Dst}}} ->
+ %% External tail call, ignore it altogether.
+ State0;
+ #{} ->
State = si_remote_call(Call, Lbl, Succ, Blocks, FuncId, State0),
- scan_is(Is, Blk, Lbl, Blocks, FuncId, State);
- _ ->
- State = si_remote_call(Call, Lbl, Lbl, Blocks, FuncId, State0),
- scan_is(Is, Blk, Lbl, Blocks, FuncId, State)
+ scan_add_edge({FuncId, Lbl}, {FuncId, Succ}, State)
+ end;
+scan_is([#b_set{op=call,args=[#b_remote{} | _]}=Call | Is],
+ Blk, Lbl, Blocks, FuncId, State0) ->
+ %% Remote call that always succeeds.
+ State = si_remote_call(Call, Lbl, Lbl, Blocks, FuncId, State0),
+ scan_is(Is, Blk, Lbl, Blocks, FuncId, State);
+scan_is([#b_set{op=call,dst=Dst,args=[#b_local{}=Callee | Args]},
+ #b_set{op={succeeded,body},args=[Dst]}],
+ #b_blk{last=#b_br{succ=Succ}},
+ Lbl, Blocks, FuncId, State0) ->
+ case Blocks of
+ #{ Succ := #b_blk{is=[],last=#b_ret{arg=Dst}}} ->
+ %% Local tail call, don't add any edges.
+ scan_add_call(tail, Args, Callee, Lbl, FuncId, State0);
+ #{} ->
+ State = scan_add_call(body, Args, Callee, Lbl, FuncId, State0),
+ scan_add_edge({FuncId, Lbl}, {FuncId, Succ}, State)
end;
-scan_is([#b_set{op=call,dst=Dst,args=[#b_local{}=Callee | Args]}],
- #b_blk{last=#b_ret{arg=Dst}}, Lbl, _Blocks, FuncId, State) ->
- scan_add_call(tail, Args, Callee, Lbl, FuncId, State);
-scan_is([#b_set{op=call,dst=Dst,args=[#b_local{}=Callee | Args]} | Is],
+scan_is([#b_set{op=call,args=[#b_local{}=Callee | Args]} | Is],
Blk, Lbl, Blocks, FuncId, State0) ->
- [#b_set{op={succeeded,body},args=[Dst]}] = Is, %Assertion.
+ %% Local call that always succeeds.
State = scan_add_call(body, Args, Callee, Lbl, FuncId, State0),
scan_is(Is, Blk, Lbl, Blocks, FuncId, State);
scan_is([_I | Is], Blk, Lbl, Blocks, FuncId, State) ->
diff --git a/lib/compiler/src/beam_ssa_share.erl b/lib/compiler/src/beam_ssa_share.erl
index ae8f582430..bd21655914 100644
--- a/lib/compiler/src/beam_ssa_share.erl
+++ b/lib/compiler/src/beam_ssa_share.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -59,11 +59,10 @@ block(#b_blk{is=Is0,last=Last0}=Blk, Blocks) ->
%% The terminator was reduced from a two-way branch to a
%% one-way branch.
case reverse(Is0) of
- [#b_set{op={succeeded,Kind},args=[Dst]},#b_set{dst=Dst}|Is] ->
- %% A succeeded instruction must not be followed by a
- %% one-way branch. We must remove both the succeeded
+ [#b_set{op={succeeded,guard},args=[Dst]},#b_set{dst=Dst}|Is] ->
+ %% A {succeeded,guard} instruction must not be followed by
+ %% a one-way branch. We must remove both the succeeded
%% instruction and the instruction preceding it.
- guard = Kind, %Assertion.
Blk#b_blk{is=reverse(Is),last=beam_ssa:normalize(Last)};
_ ->
Blk#b_blk{last=beam_ssa:normalize(Last)}
@@ -151,7 +150,7 @@ are_equivalent(_Succ, #b_blk{is=Is1,last=#b_ret{arg=RetVal1}=Ret1},
false
end;
{#b_var{},#b_var{}} ->
- %% The return values are varibles. We must canonicalize
+ %% The return values are variables. We must canonicalize
%% the blocks (including returns) and compare them.
Can1 = canonical_is(Is1 ++ [Ret1]),
Can2 = canonical_is(Is2 ++ [Ret2]),
@@ -298,7 +297,7 @@ canonical_is(Is) ->
Can.
canonical_is([#b_set{op=Op,dst=Dst,args=Args0}=I|Is], VarMap0, Acc) ->
- Args = [canonical_arg(Arg, VarMap0) || Arg <-Args0],
+ Args = [canonical_arg(Arg, VarMap0) || Arg <- Args0],
Var = {var,map_size(VarMap0)},
VarMap = VarMap0#{Dst=>Var},
LineAnno = case Op of
@@ -313,17 +312,8 @@ canonical_is([#b_set{op=Op,dst=Dst,args=Args0}=I|Is], VarMap0, Acc) ->
beam_ssa:get_anno(location, I, none)
end,
canonical_is(Is, VarMap, {Op,LineAnno,Var,Args,Acc});
-canonical_is([#b_ret{arg=Arg}], VarMap, Acc0) ->
- Acc1 = case Acc0 of
- {call,_Anno,Var,[#b_local{}|_]=Args,PrevAcc} ->
- %% This is a tail-recursive call to a local function.
- %% There will be no line instruction generated;
- %% thus, the annotation is not significant.
- {call,[],Var,Args,PrevAcc};
- _ ->
- Acc0
- end,
- {{ret,canonical_arg(Arg, VarMap),Acc1},VarMap};
+canonical_is([#b_ret{arg=Arg}], VarMap, Acc) ->
+ {{ret,canonical_arg(Arg, VarMap),Acc},VarMap};
canonical_is([#b_br{bool=#b_var{}=Arg,fail=Fail}], VarMap, Acc) ->
%% A previous buggy version of this code omitted the canonicalized
%% argument in the return value. Unfortunately, that worked most
@@ -332,6 +322,19 @@ canonical_is([#b_br{bool=#b_var{}=Arg,fail=Fail}], VarMap, Acc) ->
{{br,canonical_arg(Arg, VarMap),succ,Fail,Acc},VarMap};
canonical_is([#b_br{succ=Succ}], VarMap, Acc) ->
{{br,Succ,Acc},VarMap};
+canonical_is([{tail_br,Arg0,Ret0}], VarMap, Acc0) ->
+ Arg = canonical_arg(Arg0, VarMap),
+ Ret = canonical_arg(Ret0, VarMap),
+ case Acc0 of
+ {{succeeded,body},_,Arg,[Ret],{call,_,Ret,CallArgs,PrevAcc}} ->
+ %% This is a tail-recursive call to a local function.
+ %% There will be no line instruction generated; thus, the
+ %% annotation is not significant.
+ {{tail_call,Ret,CallArgs,PrevAcc},VarMap};
+ _ ->
+ %% Not a tail-recursive call.
+ {{br_ret,Arg,Ret,Acc0},VarMap}
+ end;
canonical_is([], VarMap, Acc) ->
{Acc,VarMap}.
@@ -345,6 +348,14 @@ canonical_terminator(L, #b_br{bool=#b_literal{val=true},succ=Succ}=Br, Blocks) -
[_|_]=Phis ->
{Phis ++ [Br],done}
end;
+canonical_terminator(_L, #b_br{bool=#b_var{}=Arg,succ=Succ,fail=?EXCEPTION_BLOCK}=Br,
+ Blocks) ->
+ case Blocks of
+ #{Succ := #b_blk{is=[],last=#b_ret{arg=Ret}}} ->
+ {[{tail_br,Arg,Ret}],done};
+ #{} ->
+ {[Br],Succ}
+ end;
canonical_terminator(_L, #b_br{bool=#b_var{},succ=Succ}=Br, _Blocks) ->
{[Br],Succ};
canonical_terminator(_, _, _) -> none.
diff --git a/lib/compiler/src/beam_ssa_throw.erl b/lib/compiler/src/beam_ssa_throw.erl
index 8ec64bcd9f..c2dc552119 100644
--- a/lib/compiler/src/beam_ssa_throw.erl
+++ b/lib/compiler/src/beam_ssa_throw.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -170,16 +170,13 @@ si_is([#b_set{op=call,
dst=Dst,
args=[#b_remote{mod=#b_literal{val=erlang},
name=#b_literal{val=throw},
- arity=1}, _Term]}],
- Id, _Lbl, #b_ret{arg=Dst}, Lst, Gst) ->
+ arity=1}, _Term]},
+ #b_set{op={succeeded,body},args=[Dst]}],
+ Id, _Lbl, #b_br{fail=?EXCEPTION_BLOCK}, Lst, Gst) ->
%% Tail throw, handled by caller. We'll need to visit this function again.
#gst{throws=Throws0} = Gst,
Throws = sets:add_element(Id, Throws0),
{Lst, Gst#gst{throws=Throws}};
-si_is([#b_set{op=call,dst=Dst,args=[#b_local{}=Callee | _]}],
- Id, _Lbl, #b_ret{arg=Dst}, Lst, Gst) ->
- %% Tail call, inherit our caller's handler.
- {Lst, inherit_tlh(Id, Callee, Gst)};
si_is([#b_set{op=call,dst=Dst,args=[#b_local{}=Callee | _]},
#b_set{op={succeeded,body},args=[Dst]}],
Id, _Lbl, #b_br{fail=?EXCEPTION_BLOCK}, Lst, Gst) ->
@@ -333,11 +330,12 @@ opt_is([#b_set{op=call,
dst=Dst,
args=[#b_remote{mod=#b_literal{val=erlang},
name=#b_literal{val=throw},
- arity=1}, _Term]}=I0],
- #b_ret{arg=Dst}, Hs) ->
+ arity=1}, _Term]}=I0,
+ #b_set{op={succeeded,body},args=[Dst]}=Succ],
+ #b_br{}, Hs) ->
ThrownType = beam_ssa:get_anno(thrown_type, I0, any),
I = opt_throw(Hs, ThrownType, I0),
- [I];
+ [I, Succ];
opt_is([I | Is], Last, Hs) ->
[I | opt_is(Is, Last, Hs)];
opt_is([], _Last, _Hs) ->
diff --git a/lib/compiler/src/beam_ssa_type.erl b/lib/compiler/src/beam_ssa_type.erl
index 4ecfdaae8a..0f06a89b8e 100644
--- a/lib/compiler/src/beam_ssa_type.erl
+++ b/lib/compiler/src/beam_ssa_type.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,12 +27,12 @@
%%
-module(beam_ssa_type).
--export([opt_start/2, opt_continue/4, opt_finish/3]).
+-export([opt_start/2, opt_continue/4, opt_finish/3, opt_ranges/1]).
-include("beam_ssa_opt.hrl").
-include("beam_types.hrl").
--import(lists, [all/2,any/2,duplicate/2,foldl/3,member/2,
+-import(lists, [any/2,duplicate/2,foldl/3,member/2,
keyfind/3,reverse/1,split/2,zip/2]).
%% The maximum number of #b_ret{} terminators a function can have before
@@ -60,35 +60,44 @@
{ func_id :: func_id(),
limit_return :: boolean(),
params :: [beam_ssa:b_var()],
- used_once :: sets:set(beam_ssa:b_var()) }).
+ used_once :: #{ beam_ssa:b_var() => _ } }).
--type type_db() :: #{ beam_ssa:var_name() := type() }.
+-type metadata() :: #metadata{}.
+-type meta_cache() :: #{ func_id() => metadata() }.
+-type type_db() :: #{ beam_ssa:var_name() := ssa_type() }.
+
+%% The types are the same as in 'beam_types.hrl', with the addition of
+%% `(fun(type_db()) -> type())` that defers figuring out the type until it's
+%% actually used. Mainly used to coax more type information out of
+%% `get_tuple_element` where a test on one element (e.g. record tag) may
+%% affect the type of another.
+-type ssa_type() :: fun((type_db()) -> type()) | type().
%%
-spec opt_start(term(), term()) -> term().
opt_start(StMap, FuncDb0) when FuncDb0 =/= #{} ->
- {ArgDb, FuncDb} = signatures(StMap, FuncDb0),
+ {ArgDb, MetaCache, FuncDb} = signatures(StMap, FuncDb0),
- opt_start_1(maps:keys(StMap), ArgDb, StMap, FuncDb);
+ opt_start_1(maps:keys(StMap), ArgDb, StMap, FuncDb, MetaCache);
opt_start(StMap, FuncDb) ->
%% Module-level analysis is disabled, likely because of a call to
%% load_nif/2 or similar. opt_continue/4 will assume that all arguments and
%% return types are 'any'.
{StMap, FuncDb}.
-opt_start_1([Id | Ids], ArgDb, StMap0, FuncDb0) ->
+opt_start_1([Id | Ids], ArgDb, StMap0, FuncDb0, MetaCache) ->
case ArgDb of
#{ Id := ArgTypes } ->
#opt_st{ssa=Linear0,args=Args} = St0 = map_get(Id, StMap0),
Ts = maps:from_list(zip(Args, ArgTypes)),
- {Linear, FuncDb} = opt_function(Linear0, Args, Id, Ts, FuncDb0),
+ {Linear, FuncDb} = opt_function(Linear0, Args, Id, Ts, FuncDb0, MetaCache),
St = St0#opt_st{ssa=Linear},
StMap = StMap0#{ Id := St },
- opt_start_1(Ids, ArgDb, StMap, FuncDb);
+ opt_start_1(Ids, ArgDb, StMap, FuncDb, MetaCache);
#{} ->
%% Unreachable functions must be removed so that opt_continue/4
%% won't process them and potentially taint the argument types of
@@ -96,9 +105,9 @@ opt_start_1([Id | Ids], ArgDb, StMap0, FuncDb0) ->
StMap = maps:remove(Id, StMap0),
FuncDb = maps:remove(Id, FuncDb0),
- opt_start_1(Ids, ArgDb, StMap, FuncDb)
+ opt_start_1(Ids, ArgDb, StMap, FuncDb, MetaCache)
end;
-opt_start_1([], _CommittedArgs, StMap, FuncDb) ->
+opt_start_1([], _CommittedArgs, StMap, FuncDb, _MetaCache) ->
{StMap, FuncDb}.
%%
@@ -124,12 +133,13 @@ opt_start_1([], _CommittedArgs, StMap, FuncDb) ->
-record(sig_st,
{ wl = wl_new() :: worklist(),
committed = #{} :: #{ func_id() => [type()] },
- updates = #{} :: #{ func_id() => [type()] }}).
+ updates = #{} :: #{ func_id() => [type()] },
+ meta_cache = #{} :: meta_cache()}).
signatures(StMap, FuncDb0) ->
State0 = init_sig_st(StMap, FuncDb0),
{State, FuncDb} = signatures_1(StMap, FuncDb0, State0),
- {State#sig_st.committed, FuncDb}.
+ {State#sig_st.committed, State#sig_st.meta_cache, FuncDb}.
signatures_1(StMap, FuncDb0, State0) ->
case wl_next(State0#sig_st.wl) of
@@ -203,11 +213,11 @@ sig_function_1(Id, StMap, State0, FuncDb) ->
Ls = #{ ?EXCEPTION_BLOCK => {incoming, Ts},
0 => {incoming, Ts} },
- Meta = init_metadata(Id, Linear, Args),
+ {Meta, State2} = sig_init_metadata(Id, Linear, Args, State1),
Wl0 = State1#sig_st.wl,
- {State, SuccTypes} = sig_bs(Linear, Ds, Ls, FuncDb, #{}, [], Meta, State1),
+ {State, SuccTypes} = sig_bs(Linear, Ds, Ls, FuncDb, #{}, [], Meta, State2),
WlChanged = wl_changed(Wl0, State#sig_st.wl),
#{ Id := #func_info{succ_types=SuccTypes0}=Entry0 } = FuncDb,
@@ -220,6 +230,17 @@ sig_function_1(Id, StMap, State0, FuncDb) ->
{true, WlChanged, State, FuncDb#{ Id := Entry }}
end.
+%% Get the metadata for a function. If this function has been analysed
+%% previously, retrieve the previously calculated metadata.
+sig_init_metadata(Id, Linear, Args, #sig_st{meta_cache=MetaCache} = State) ->
+ case MetaCache of
+ #{Id := Meta} ->
+ {Meta, State};
+ #{} ->
+ Meta = init_metadata(Id, Linear, Args),
+ {Meta, State#sig_st{meta_cache=MetaCache#{Id => Meta}}}
+ end.
+
sig_bs([{L, #b_blk{is=Is,last=Last0}} | Bs],
Ds0, Ls0, Fdb, Sub0, SuccTypes0, Meta, State0) ->
case Ls0 of
@@ -253,7 +274,7 @@ sig_is([#b_set{op=call,
dst=Dst}=I0 | Is],
Ts0, Ds0, Ls, Fdb, Sub, State0) ->
Args = simplify_args(Args0, Ts0, Sub),
- I1 = beam_ssa:normalize(I0#b_set{args=Args}),
+ I1 = I0#b_set{args=Args},
[_ | CallArgs] = Args,
{I, State} = sig_local_call(I1, Callee, CallArgs, Ts0, Fdb, State0),
@@ -264,15 +285,11 @@ sig_is([#b_set{op=call,
sig_is([#b_set{op=call,
args=[#b_var{} | _]=Args0,
dst=Dst}=I0 | Is],
- Ts0, Ds0, Ls, Fdb, Sub, State) ->
+ Ts0, Ds0, Ls, Fdb, Sub, State0) ->
Args = simplify_args(Args0, Ts0, Sub),
- I1 = beam_ssa:normalize(I0#b_set{args=Args}),
+ I1 = I0#b_set{args=Args},
- [Fun | _] = Args,
- I = case normalized_type(Fun, Ts0) of
- #t_fun{type=Type} -> beam_ssa:add_anno(result_type, Type, I1);
- _ -> I1
- end,
+ {I, State} = sig_fun_call(I1, Args, Ts0, Ds0, Fdb, Sub, State0),
Ts = update_types(I, Ts0, Ds0),
Ds = Ds0#{ Dst => I },
@@ -281,7 +298,7 @@ sig_is([#b_set{op=MakeFun,args=Args0,dst=Dst}=I0|Is],
Ts0, Ds0, Ls, Fdb, Sub0, State0) when MakeFun =:= make_fun;
MakeFun =:= old_make_fun ->
Args = simplify_args(Args0, Ts0, Sub0),
- I1 = beam_ssa:normalize(I0#b_set{args=Args}),
+ I1 = I0#b_set{args=Args},
{I, State} = sig_make_fun(I1, Ts0, Fdb, State0),
@@ -298,6 +315,33 @@ sig_is([I0 | Is], Ts0, Ds0, Ls, Fdb, Sub0, State) ->
sig_is([], Ts, Ds, _Ls, _Fdb, Sub, State) ->
{Ts, Ds, Sub, State}.
+sig_fun_call(I0, Args, Ts, Ds, Fdb, Sub, State0) ->
+ [Fun | CallArgs0] = Args,
+ FunType = normalized_type(Fun, Ts),
+ Arity = length(CallArgs0),
+
+ case {FunType, Ds} of
+ {_, #{ Fun := #b_set{op=make_fun,
+ args=[#b_local{arity=TotalArity}=Callee | Env]} }}
+ when TotalArity =:= Arity + length(Env) ->
+ %% When a fun is used and defined in the same function, we can make
+ %% a direct call since the environment is still available.
+ CallArgs = CallArgs0 ++ simplify_args(Env, Ts, Sub),
+ I = I0#b_set{args=[Callee | CallArgs]},
+ sig_local_call(I, Callee, CallArgs, Ts, Fdb, State0);
+ {#t_fun{target={Name,Arity}}, _} ->
+ %% When a fun lacks free variables, we can make a direct call even
+ %% when we don't know where it was defined.
+ Callee = #b_local{name=#b_literal{val=Name},
+ arity=Arity},
+ I = I0#b_set{args=[Callee | CallArgs0]},
+ sig_local_call(I, Callee, CallArgs0, Ts, Fdb, State0);
+ {#t_fun{type=Type}, _} when Type =/= any ->
+ {beam_ssa:add_anno(result_type, Type, I0), State0};
+ _ ->
+ {I0, State0}
+ end.
+
sig_local_call(I0, Callee, Args, Ts, Fdb, State) ->
ArgTypes = argument_types(Args, Ts),
I = sig_local_return(I0, Callee, ArgTypes, Fdb),
@@ -312,7 +356,7 @@ sig_make_fun(#b_set{op=MakeFun,
MakeFun =:= old_make_fun ->
ArgCount = Callee#b_local.arity - length(FreeVars),
- FVTypes = [raw_type(FreeVar, Ts) || FreeVar <- FreeVars],
+ FVTypes = [concrete_type(FreeVar, Ts) || FreeVar <- FreeVars],
ArgTypes = duplicate(ArgCount, any) ++ FVTypes,
I = sig_local_return(I0, Callee, ArgTypes, Fdb),
@@ -413,23 +457,28 @@ join_arg_types([], [], Ts) ->
%%
%% Optimizes a function based on the type information inferred by signatures/2
-%% and earlier runs of opt_function/5.
+%% and earlier runs of opt_function/5,6.
%%
%% This is pretty straightforward as it only walks through each function once,
%% and because it only makes types narrower it's safe to optimize the functions
%% in any order or not at all.
%%
--spec opt_function(Linear, Args, Id, Ts, FuncDb) -> Result when
+opt_function(Linear, Args, Id, Ts, FuncDb) ->
+ MetaCache = #{},
+ opt_function(Linear, Args, Id, Ts, FuncDb, MetaCache).
+
+-spec opt_function(Linear, Args, Id, Ts, FuncDb, MetaCache) -> Result when
Linear :: [{non_neg_integer(), beam_ssa:b_blk()}],
Args :: [beam_ssa:b_var()],
Id :: func_id(),
Ts :: type_db(),
FuncDb :: func_info_db(),
- Result :: {Linear, FuncDb}.
-opt_function(Linear, Args, Id, Ts, FuncDb) ->
+ Result :: {Linear, FuncDb},
+ MetaCache :: meta_cache().
+opt_function(Linear, Args, Id, Ts, FuncDb, MetaCache) ->
try
- do_opt_function(Linear, Args, Id, Ts, FuncDb)
+ do_opt_function(Linear, Args, Id, Ts, FuncDb, MetaCache)
catch
Class:Error:Stack ->
#b_local{name=#b_literal{val=Name},arity=Arity} = Id,
@@ -437,7 +486,7 @@ opt_function(Linear, Args, Id, Ts, FuncDb) ->
erlang:raise(Class, Error, Stack)
end.
-do_opt_function(Linear0, Args, Id, Ts, FuncDb0) ->
+do_opt_function(Linear0, Args, Id, Ts, FuncDb0, MetaCache) ->
FakeCall = #b_set{op=call,args=[#b_remote{mod=#b_literal{val=unknown},
name=#b_literal{val=unknown},
arity=0}]},
@@ -448,7 +497,12 @@ do_opt_function(Linear0, Args, Id, Ts, FuncDb0) ->
Ls = #{ ?EXCEPTION_BLOCK => {incoming, Ts},
0 => {incoming, Ts} },
- Meta = init_metadata(Id, Linear0, Args),
+ Meta = case MetaCache of
+ #{Id := Meta0} ->
+ Meta0;
+ #{} ->
+ init_metadata(Id, Linear0, Args)
+ end,
{Linear, FuncDb, SuccTypes} =
opt_bs(Linear0, Ds, Ls, FuncDb0, #{}, [], Meta, []),
@@ -473,7 +527,7 @@ opt_bs([{L, #b_blk{is=Is0,last=Last0}=Blk0} | Bs],
{incoming, Ts0} = Incoming, %Assertion.
{Is, Ts, Ds, Fdb, Sub} =
- opt_is(Is0, Ts0, Ds0, Ls0, Fdb0, Sub0, Meta, []),
+ opt_is(Is0, Ts0, Ds0, Ls0, Fdb0, Sub0, Meta, []),
Last1 = simplify_terminator(Last0, Ts, Ds, Sub),
SuccTypes = update_success_types(Last1, Ts, Ds, Meta, SuccTypes0),
@@ -497,7 +551,7 @@ opt_is([#b_set{op=call,
dst=Dst}=I0 | Is],
Ts0, Ds0, Ls, Fdb0, Sub, Meta, Acc) ->
Args = simplify_args(Args0, Ts0, Sub),
- I1 = beam_ssa:normalize(I0#b_set{args=Args}),
+ I1 = I0#b_set{args=Args},
[_ | CallArgs] = Args,
{I, Fdb} = opt_local_call(I1, Callee, CallArgs, Dst, Ts0, Fdb0, Meta),
@@ -508,17 +562,12 @@ opt_is([#b_set{op=call,
opt_is([#b_set{op=call,
args=[#b_var{} | _]=Args0,
dst=Dst}=I0 | Is],
- Ts0, Ds0, Ls, Fdb, Sub, Meta, Acc) ->
+ Ts0, Ds0, Ls, Fdb0, Sub, Meta, Acc) ->
Args = simplify_args(Args0, Ts0, Sub),
- I1 = beam_ssa:normalize(I0#b_set{args=Args}),
- [Fun | _] = Args,
- I = case normalized_type(Fun, Ts0) of
- #t_fun{type=Type} when Type =/= any ->
- beam_ssa:add_anno(result_type, Type, I1);
- _ ->
- I1
- end,
+ I1 = opt_anno_types(I0#b_set{args=Args}, Ts0),
+
+ {I, Fdb} = opt_fun_call(I1, Args, Ts0, Ds0, Fdb0, Sub, Meta),
Ts = update_types(I, Ts0, Ds0),
Ds = Ds0#{ Dst => I },
@@ -527,7 +576,7 @@ opt_is([#b_set{op=MakeFun,args=Args0,dst=Dst}=I0|Is],
Ts0, Ds0, Ls, Fdb0, Sub0, Meta, Acc) when MakeFun =:= make_fun;
MakeFun =:= old_make_fun ->
Args = simplify_args(Args0, Ts0, Sub0),
- I1 = beam_ssa:normalize(I0#b_set{args=Args}),
+ I1 = I0#b_set{args=Args},
{I, Fdb} = opt_make_fun(I1, Ts0, Fdb0, Meta),
@@ -536,7 +585,8 @@ opt_is([#b_set{op=MakeFun,args=Args0,dst=Dst}=I0|Is],
opt_is(Is, Ts, Ds, Ls, Fdb, Sub0, Meta, [I|Acc]);
opt_is([I0 | Is], Ts0, Ds0, Ls, Fdb, Sub0, Meta, Acc) ->
case simplify(I0, Ts0, Ds0, Ls, Sub0) of
- {#b_set{}=I, Ts, Ds} ->
+ {#b_set{}=I1, Ts, Ds} ->
+ I = opt_anno_types(I1, Ts),
opt_is(Is, Ts, Ds, Ls, Fdb, Sub0, Meta, [I | Acc]);
Sub when is_map(Sub) ->
opt_is(Is, Ts0, Ds0, Ls, Fdb, Sub, Meta, Acc)
@@ -544,6 +594,86 @@ opt_is([I0 | Is], Ts0, Ds0, Ls, Fdb, Sub0, Meta, Acc) ->
opt_is([], Ts, Ds, _Ls, Fdb, Sub, _Meta, Acc) ->
{reverse(Acc), Ts, Ds, Fdb, Sub}.
+opt_anno_types(#b_set{op=Op,args=Args}=I, Ts) ->
+ case benefits_from_type_anno(Op, Args) of
+ true -> opt_anno_types_1(I, Args, Ts, 0, #{});
+ false -> I
+ end.
+
+opt_anno_types_1(I, [#b_var{}=Var | Args], Ts, Index, Acc0) ->
+ case concrete_type(Var, Ts) of
+ any ->
+ opt_anno_types_1(I, Args, Ts, Index + 1, Acc0);
+ Type ->
+ %% Note that we annotate arguments by their index instead of their
+ %% variable name, as they may be renamed by `beam_ssa_pre_codegen`.
+ Acc = Acc0#{ Index => Type },
+ opt_anno_types_1(I, Args, Ts, Index + 1, Acc)
+ end;
+opt_anno_types_1(I, [_Arg | Args], Ts, Index, Acc) ->
+ opt_anno_types_1(I, Args, Ts, Index + 1, Acc);
+opt_anno_types_1(#b_set{}=I, [], _Ts, _Index, Acc) when Acc =:= #{} ->
+ I;
+opt_anno_types_1(#b_set{anno=Anno0}=I, [], _Ts, _Index, Acc) ->
+ case Anno0 of
+ #{ arg_types := Acc } ->
+ I;
+ #{} ->
+ Anno = Anno0#{ arg_types => Acc },
+ I#b_set{anno=Anno}
+ end.
+
+%% Only add type annotations when we know we'll make good use of them.
+benefits_from_type_anno({bif,'=:='}, _Args) ->
+ true;
+benefits_from_type_anno({bif,'=/='}, _Args) ->
+ true;
+benefits_from_type_anno({bif,Op}, Args) ->
+ not erl_internal:bool_op(Op, length(Args));
+benefits_from_type_anno(bs_create_bin, _Args) ->
+ true;
+benefits_from_type_anno(is_tagged_tuple, _Args) ->
+ true;
+benefits_from_type_anno(call, [#b_var{} | _]) ->
+ true;
+benefits_from_type_anno({float,convert}, _Args) ->
+ %% Note: The {float,convert} instruction does not exist when
+ %% the main type optimizer pass is run. It is created and
+ %% annotated by ssa_opt_float1 in beam_ssa_opt, and can also
+ %% be annotated by opt_ranges/1.
+ true;
+benefits_from_type_anno(get_map_element, _Args) ->
+ true;
+benefits_from_type_anno(has_map_field, _Args) ->
+ true;
+benefits_from_type_anno(_Op, _Args) ->
+ false.
+
+opt_fun_call(#b_set{dst=Dst}=I0, [Fun | CallArgs0], Ts, Ds, Fdb, Sub, Meta) ->
+ FunType = normalized_type(Fun, Ts),
+ Arity = length(CallArgs0),
+ case {FunType, Ds} of
+ {_, #{ Fun := #b_set{op=make_fun,
+ args=[#b_local{arity=TotalArity}=Callee | Env]} }}
+ when TotalArity =:= Arity + length(Env) ->
+ %% When a fun is used and defined in the same function, we can make
+ %% a direct call since the environment is still available.
+ CallArgs = CallArgs0 ++ simplify_args(Env, Ts, Sub),
+ I = I0#b_set{args=[Callee | CallArgs]},
+ opt_local_call(I, Callee, CallArgs, Dst, Ts, Fdb, Meta);
+ {#t_fun{target={Name,Arity}}, _} ->
+ %% When a fun lacks free variables, we can make a direct call even
+ %% when we don't know where it was defined.
+ Callee = #b_local{name=#b_literal{val=Name},
+ arity=Arity},
+ I = I0#b_set{args=[Callee | CallArgs0]},
+ opt_local_call(I, Callee, CallArgs0, Dst, Ts, Fdb, Meta);
+ {#t_fun{type=Type}, _} when Type =/= any ->
+ {beam_ssa:add_anno(result_type, Type, I0), Fdb};
+ _ ->
+ {I0, Fdb}
+ end.
+
opt_local_call(I0, Callee, Args, Dst, Ts, Fdb, Meta) ->
ArgTypes = argument_types(Args, Ts),
I = opt_local_return(I0, Callee, ArgTypes, Fdb),
@@ -571,7 +701,7 @@ opt_make_fun(#b_set{op=MakeFun,
Ts, Fdb, Meta) when MakeFun =:= make_fun;
MakeFun =:= old_make_fun ->
ArgCount = Callee#b_local.arity - length(FreeVars),
- FVTypes = [raw_type(FreeVar, Ts) || FreeVar <- FreeVars],
+ FVTypes = [concrete_type(FreeVar, Ts) || FreeVar <- FreeVars],
ArgTypes = duplicate(ArgCount, any) ++ FVTypes,
I = opt_local_return(I0, Callee, ArgTypes, Fdb),
@@ -636,6 +766,153 @@ opt_finish_1([], [], Acc) ->
Acc.
%%%
+%%% This sub pass is run once after the main type sub pass
+%%% to annotate more instructions with integer ranges.
+%%%
+%%% The main type sub pass annotates certain instructions with
+%%% their types to help the JIT generate better code.
+%%%
+%%% Example:
+%%%
+%%% foo(N0) ->
+%%% N1 = N0 band 3,
+%%% N = N1 + 1, % N1 is in 0..3
+%%% element(N,
+%%% {zero,one,two,three}).
+%%%
+%%% The main type pass is able to figure out the range for `N1` but
+%%% not for `N`. The reason is that the type pass iterates until it
+%%% reaches a fixpoint. To guarantee that it will converge, ranges for
+%%% results must only be calculated for operations that retain or
+%%% shrink the ranges of their arguments.
+%%%
+%%% Therefore, to ensure convergence, the main type pass can only
+%%% safely calculate ranges for results of operations such as `and`,
+%%% `bsr`, and `rem`, but not for operations such as `+`, '-', '*',
+%%% and `bsl`.
+%%%
+%%% This sub pass will start from the types found in the annotations
+%%% and propagate them forward through arithmetic instructions within
+%%% the same function.
+%%%
+%%% For the example, this sub pass adds a new annotation for `N`:
+%%%
+%%% foo(N0) ->
+%%% N1 = N0 band 3,
+%%% N = N1 + 1, % N1 is in 0..3
+%%% element(N, % N is in 1..4
+%%% {zero,one,two,three}).
+%%%
+%%% With a known range and known tuple size, the JIT is able to remove
+%%% all range checks for the `element/2` instruction.
+%%%
+
+-spec opt_ranges(Blocks0) -> Blocks when
+ Blocks0 :: beam_ssa:block_map(),
+ Blocks :: beam_ssa:block_map().
+
+opt_ranges(Blocks) ->
+ RPO = beam_ssa:rpo(Blocks),
+ Tss = #{0 => #{}, ?EXCEPTION_BLOCK => #{}},
+ ranges(RPO, Tss, Blocks).
+
+ranges([L|Ls], Tss0, Blocks0) ->
+ #b_blk{is=Is0} = Blk0 = map_get(L, Blocks0),
+ Ts0 = map_get(L, Tss0),
+ {Is,Ts} = ranges_is(Is0, Ts0, []),
+ Blk = Blk0#b_blk{is=Is},
+ Blocks = Blocks0#{L := Blk},
+ Tss = ranges_successors(beam_ssa:successors(Blk), Ts, Tss0),
+ ranges(Ls, Tss, Blocks);
+ranges([], _Tss, Blocks) -> Blocks.
+
+ranges_is([#b_set{op=Op,args=Args}=I0|Is], Ts0, Acc) ->
+ case benefits_from_type_anno(Op, Args) of
+ false ->
+ ranges_is(Is, Ts0, [I0|Acc]);
+ true ->
+ I = update_anno_types(I0, Ts0),
+ Ts = ranges_propagate_types(I, Ts0),
+ ranges_is(Is, Ts, [I|Acc])
+ end;
+ranges_is([], Ts, Acc) ->
+ {reverse(Acc),Ts}.
+
+ranges_successors([?EXCEPTION_BLOCK|Ls], Ts, Tss) ->
+ ranges_successors(Ls, Ts, Tss);
+ranges_successors([L|Ls], Ts0, Tss0) ->
+ case Tss0 of
+ #{L := Ts1} ->
+ Ts = join_types(Ts0, Ts1),
+ Tss = Tss0#{L := Ts},
+ ranges_successors(Ls, Ts0, Tss);
+ #{} ->
+ Tss = Tss0#{L => Ts0},
+ ranges_successors(Ls, Ts0, Tss)
+ end;
+ranges_successors([], _, Tss) -> Tss.
+
+ranges_propagate_types(#b_set{anno=Anno,op={bif,_}=Op,args=Args,dst=Dst}, Ts) ->
+ case Anno of
+ #{arg_types := ArgTypes0} ->
+ ArgTypes = ranges_get_arg_types(Args, 0, ArgTypes0),
+ case beam_call_types:arith_type(Op, ArgTypes) of
+ any -> Ts;
+ T -> Ts#{Dst => T}
+ end;
+ #{} ->
+ Ts
+ end;
+ranges_propagate_types(_, Ts) -> Ts.
+
+ranges_get_arg_types([#b_var{}|As], Index, ArgTypes) ->
+ case ArgTypes of
+ #{Index := Type} ->
+ [Type|ranges_get_arg_types(As, Index + 1, ArgTypes)];
+ #{} ->
+ [any|ranges_get_arg_types(As, Index + 1, ArgTypes)]
+ end;
+ranges_get_arg_types([#b_literal{val=Value}|As], Index, ArgTypes) ->
+ Type = beam_types:make_type_from_value(Value),
+ [Type|ranges_get_arg_types(As, Index + 1, ArgTypes)];
+ranges_get_arg_types([], _, _) -> [].
+
+update_anno_types(#b_set{anno=Anno,args=Args}=I, Ts) ->
+ ArgTypes1 = case Anno of
+ #{arg_types := ArgTypes0} -> ArgTypes0;
+ #{} -> #{}
+ end,
+ ArgTypes = update_anno_types_1(Args, Ts, 0, ArgTypes1),
+ case Anno of
+ #{arg_types := ArgTypes} ->
+ I;
+ #{} when map_size(ArgTypes) =/= 0 ->
+ I#b_set{anno=Anno#{arg_types => ArgTypes}};
+ #{} ->
+ I
+ end.
+
+update_anno_types_1([#b_var{}=V|As], Ts, Index, ArgTypes) ->
+ T0 = case ArgTypes of
+ #{Index := T00} -> T00;
+ #{} -> any
+ end,
+ T1 = case Ts of
+ #{V := T11} -> T11;
+ #{} -> any
+ end,
+ case beam_types:meet(T0, T1) of
+ any ->
+ update_anno_types_1(As, Ts, Index + 1, ArgTypes);
+ T ->
+ true = T =/= none, %Assertion.
+ update_anno_types_1(As, Ts, Index + 1, ArgTypes#{Index => T})
+ end;
+update_anno_types_1([_|As], Ts, Index, ArgTypes) ->
+ update_anno_types_1(As, Ts, Index + 1, ArgTypes);
+update_anno_types_1([], _, _, ArgTypes) -> ArgTypes.
+
+%%%
%%% Optimization helpers
%%%
@@ -650,7 +927,7 @@ simplify_terminator(#b_switch{arg=Arg0,fail=Fail,list=List0}=Sw0,
List = [{Val,Lbl} || {Val,Lbl} <- List0, Lbl =/= Fail],
case beam_ssa:normalize(Sw0#b_switch{arg=Arg,list=List}) of
#b_switch{}=Sw ->
- case beam_types:is_boolean_type(raw_type(Arg, Ts)) of
+ case beam_types:is_boolean_type(concrete_type(Arg, Ts)) of
true -> simplify_switch_bool(Sw, Ts, Ds, Sub);
false -> Sw
end;
@@ -688,12 +965,12 @@ simplify(#b_set{op=phi,dst=Dst,args=Args0}=I0, Ts0, Ds0, Ls, Sub) ->
Ds = Ds0#{ Dst => I },
{I, Ts, Ds}
end;
-simplify(#b_set{op={succeeded,Kind},args=[Arg],dst=Dst}=I0,
+simplify(#b_set{op={succeeded,Kind},args=[Arg],dst=Dst}=I,
Ts0, Ds0, _Ls, Sub) ->
- Type = case will_succeed(I0, Ts0, Ds0, Sub) of
+ Type = case will_succeed(I, Ts0, Ds0, Sub) of
yes -> beam_types:make_atom(true);
no -> beam_types:make_atom(false);
- maybe -> beam_types:make_boolean()
+ 'maybe' -> beam_types:make_boolean()
end,
case Type of
#t_atom{elements=[true]} ->
@@ -711,14 +988,13 @@ simplify(#b_set{op={succeeded,Kind},args=[Arg],dst=Dst}=I0,
%% Note that we never simplify args; this instruction is specific
%% to the operation being checked, and simplifying could break that
%% connection.
- I = beam_ssa:normalize(I0),
Ts = Ts0#{ Dst => Type },
Ds = Ds0#{ Dst => I },
{I, Ts, Ds}
end;
simplify(#b_set{op=bs_match,dst=Dst,args=Args0}=I0, Ts0, Ds0, _Ls, Sub) ->
Args = simplify_args(Args0, Ts0, Sub),
- I1 = beam_ssa:normalize(I0#b_set{args=Args}),
+ I1 = I0#b_set{args=Args},
I2 = case {Args0,Args} of
{[_,_,_,#b_var{},_],[Type,Val,Flags,#b_literal{val=all},Unit]} ->
%% The size `all` is used for the size of the final binary
@@ -730,8 +1006,7 @@ simplify(#b_set{op=bs_match,dst=Dst,args=Args0}=I0, Ts0, Ds0, _Ls, Sub) ->
end,
%% We KNOW that simplify/2 will return a #b_set{} record when called with
%% a bs_match instruction.
- #b_set{} = I3 = simplify(I2, Ts0),
- I = beam_ssa:normalize(I3),
+ #b_set{} = I = simplify(I2, Ts0),
Ts = update_types(I, Ts0, Ds0),
Ds = Ds0#{ Dst => I },
{I, Ts, Ds};
@@ -739,8 +1014,7 @@ simplify(#b_set{dst=Dst,args=Args0}=I0, Ts0, Ds0, _Ls, Sub) ->
Args = simplify_args(Args0, Ts0, Sub),
I1 = beam_ssa:normalize(I0#b_set{args=Args}),
case simplify(I1, Ts0) of
- #b_set{}=I2 ->
- I = beam_ssa:normalize(I2),
+ #b_set{}=I ->
Ts = update_types(I, Ts0, Ds0),
Ds = Ds0#{ Dst => I },
{I, Ts, Ds};
@@ -817,7 +1091,7 @@ simplify(#b_set{op={bif,tuple_size},args=[Term]}=I, Ts) ->
I
end;
simplify(#b_set{op={bif,is_function},args=[Fun,#b_literal{val=Arity}]}=I, Ts)
- when is_integer(Arity), Arity >= 0 ->
+ when is_integer(Arity), Arity >= 0, Arity =< ?MAX_FUNC_ARGS ->
case normalized_type(Fun, Ts) of
#t_fun{arity=any} ->
I;
@@ -860,8 +1134,8 @@ simplify(#b_set{op={bif,Op0},args=Args}=I, Ts) when Op0 =:= '==';
simplify(#b_set{op={bif,'=:='},args=[Same,Same]}, _Ts) ->
#b_literal{val=true};
simplify(#b_set{op={bif,'=:='},args=[LHS,RHS]}=I, Ts) ->
- LType = raw_type(LHS, Ts),
- RType = raw_type(RHS, Ts),
+ LType = concrete_type(LHS, Ts),
+ RType = concrete_type(RHS, Ts),
case beam_types:meet(LType, RType) of
none ->
#b_literal{val=false};
@@ -886,6 +1160,19 @@ simplify(#b_set{op={bif,'=:='},args=[LHS,RHS]}=I, Ts) ->
eval_bif(I, Ts)
end
end;
+simplify(#b_set{op={bif,is_list},args=[Src]}=I0, Ts) ->
+ case concrete_type(Src, Ts) of
+ #t_union{list=#t_cons{}} ->
+ I = I0#b_set{op=is_nonempty_list,args=[Src]},
+ %% We might need to convert back to is_list/1 if it turns
+ %% out that this instruction is followed by a #b_ret{}
+ %% terminator.
+ beam_ssa:add_anno(was_bif_is_list, true, I);
+ #t_union{list=nil} ->
+ I0#b_set{op={bif,'=:='},args=[Src,#b_literal{val=[]}]};
+ _ ->
+ eval_bif(I0, Ts)
+ end;
simplify(#b_set{op={bif,Op},args=Args}=I, Ts) ->
Types = normalized_types(Args, Ts),
case is_float_op(Op, Types) of
@@ -896,7 +1183,7 @@ simplify(#b_set{op={bif,Op},args=Args}=I, Ts) ->
eval_bif(beam_ssa:add_anno(float_op, AnnoArgs, I), Ts)
end;
simplify(#b_set{op=bs_extract,args=[Ctx]}=I, Ts) ->
- case raw_type(Ctx, Ts) of
+ case concrete_type(Ctx, Ts) of
#t_bitstring{} ->
%% This is a bs_match that has been rewritten as a bs_get_tail;
%% just return the input as-is.
@@ -910,7 +1197,7 @@ simplify(#b_set{op=bs_match,
#b_literal{val=OpUnit}]}=I, Ts) ->
%% <<..., Foo/binary>> can be rewritten as <<..., Foo/bits>> if we know the
%% unit is correct.
- #t_bs_context{tail_unit=CtxUnit} = raw_type(Ctx, Ts),
+ #t_bs_context{tail_unit=CtxUnit} = concrete_type(Ctx, Ts),
if
CtxUnit rem OpUnit =:= 0 ->
I#b_set{op=bs_get_tail,args=[Ctx]};
@@ -918,7 +1205,7 @@ simplify(#b_set{op=bs_match,
I
end;
simplify(#b_set{op=bs_start_match,args=[#b_literal{val=new}, Src]}=I, Ts) ->
- case raw_type(Src, Ts) of
+ case concrete_type(Src, Ts) of
#t_bs_context{} ->
I#b_set{op=bs_start_match,args=[#b_literal{val=resume}, Src]};
_ ->
@@ -945,7 +1232,51 @@ simplify(#b_set{op=is_nonempty_list,args=[Src]}=I, Ts) ->
end;
simplify(#b_set{op=is_tagged_tuple,
args=[Src,#b_literal{val=Size},#b_literal{}=Tag]}=I, Ts) ->
- simplify_is_record(I, normalized_type(Src, Ts), Size, Tag, Ts);
+ case concrete_type(Src, Ts) of
+ #t_union{tuple_set=TupleSet}=U ->
+ %% A union of different types, one of them (probably)
+ %% a tuple. Dig out the tuple type from the union and
+ %% find out whether it will match.
+ TupleOnlyType = #t_union{tuple_set=TupleSet},
+ TT = beam_types:normalize(TupleOnlyType),
+ case simplify_is_record(I, TT, Size, Tag, Ts) of
+ #b_literal{val=true} ->
+ %% The tuple part of the union will always match.
+ %% A simple is_tuple/1 test will be sufficient to
+ %% distinguish the tuple from the other types in
+ %% the union.
+ I#b_set{op={bif,is_tuple},args=[Src]};
+ #b_literal{val=false}=False ->
+ %% Src is never a tuple.
+ False;
+ _ ->
+ %% More than one type of tuple can match. Find out
+ %% whether the possible tuples can be
+ %% distinguished by size.
+ TupleArityType = #t_tuple{size=Size,exact=true},
+ TTT = beam_types:meet(TupleArityType, TupleOnlyType),
+ case simplify_is_record(I, TTT, Size, Tag, Ts) of
+ #b_literal{val=true} ->
+ %% The possible tuple types have different sizes.
+ %% Example: {ok, _} | {error, _, _}.
+ case beam_types:normalize(U) of
+ #t_tuple{} ->
+ %% Src is known to be a tuple, so it will
+ %% be sufficient to test the arity.
+ beam_ssa:add_anno(constraints, arity, I);
+ any ->
+ %% Src might not be a tuple. Must
+ %% test for a tuple with a given
+ %% arity.
+ beam_ssa:add_anno(constraints, tuple_arity, I)
+ end;
+ _ ->
+ I
+ end
+ end;
+ SimpleType ->
+ simplify_is_record(I, SimpleType, Size, Tag, Ts)
+ end;
simplify(#b_set{op=put_list,args=[#b_literal{val=H},
#b_literal{val=T}]}, _Ts) ->
#b_literal{val=[H|T]};
@@ -997,7 +1328,7 @@ will_succeed(#b_set{args=[Src]}, Ts, Ds, Sub) ->
%% There can't be any substitution because the instruction
%% is still there.
false = is_map_key(Src, Sub), %Assertion.
- will_succeed_1(I, Src, Ts, Sub);
+ will_succeed_1(I, Src, Ts);
{#{}, #{}} ->
%% The checked instruction has been removed and substituted, so we
%% can assume it always succeeds.
@@ -1005,10 +1336,10 @@ will_succeed(#b_set{args=[Src]}, Ts, Ds, Sub) ->
yes
end.
-will_succeed_1(#b_set{op=bs_get_tail}, _Src, _Ts, _Sub) ->
+will_succeed_1(#b_set{op=bs_get_tail}, _Src, _Ts) ->
yes;
-will_succeed_1(#b_set{op=bs_start_match,args=[_, Arg]}, _Src, Ts, _Sub) ->
- ArgType = raw_type(Arg, Ts),
+will_succeed_1(#b_set{op=bs_start_match,args=[_, Arg]}, _Src, Ts) ->
+ ArgType = concrete_type(Arg, Ts),
case beam_types:is_bs_matchable_type(ArgType) of
true ->
%% In the future we may be able to remove this instruction
@@ -1019,90 +1350,66 @@ will_succeed_1(#b_set{op=bs_start_match,args=[_, Arg]}, _Src, Ts, _Sub) ->
%% Is it at all possible to match?
case beam_types:meet(ArgType, #t_bs_matchable{}) of
none -> no;
- _ -> maybe
+ _ -> 'maybe'
end
end;
-will_succeed_1(#b_set{op={bif,Bif},args=BifArgs}, _Src, Ts, _Sub) ->
+will_succeed_1(#b_set{op={bif,Bif},args=BifArgs}, _Src, Ts) ->
ArgTypes = normalized_types(BifArgs, Ts),
beam_call_types:will_succeed(erlang, Bif, ArgTypes);
will_succeed_1(#b_set{op=call,
args=[#b_remote{mod=#b_literal{val=Mod},
- name=#b_literal{val=Func}} |
+ name=#b_literal{val=Func}} |
CallArgs]},
- _Src, Ts, _Sub) ->
- ArgTypes = normalized_types(CallArgs, Ts),
- beam_call_types:will_succeed(Mod, Func, ArgTypes);
+ _Src, Ts) ->
+ ArgTypes = normalized_types(CallArgs, Ts),
+ beam_call_types:will_succeed(Mod, Func, ArgTypes);
-will_succeed_1(#b_set{op=get_hd}, _Src, _Ts, _Sub) ->
+will_succeed_1(#b_set{op=get_hd}, _Src, _Ts) ->
yes;
-will_succeed_1(#b_set{op=get_tl}, _Src, _Ts, _Sub) ->
+will_succeed_1(#b_set{op=get_tl}, _Src, _Ts) ->
yes;
-will_succeed_1(#b_set{op=has_map_field}, _Src, _Ts, _Sub) ->
+will_succeed_1(#b_set{op=has_map_field}, _Src, _Ts) ->
yes;
-will_succeed_1(#b_set{op=get_tuple_element}, _Src, _Ts, _Sub) ->
+will_succeed_1(#b_set{op=get_tuple_element}, _Src, _Ts) ->
yes;
-will_succeed_1(#b_set{op=put_tuple}, _Src, _Ts, _Sub) ->
+will_succeed_1(#b_set{op=put_tuple}, _Src, _Ts) ->
yes;
-
-%% Remove the success branch from binary operations with invalid
-%% sizes. That will remove subsequent bs_put and bs_match instructions,
-%% which are probably not loadable.
-will_succeed_1(#b_set{op=bs_add,args=[Arg1,Arg2,_]},
- _Src, _Ts, _Sub) ->
- case all(fun(#b_literal{val=Size}) -> is_integer(Size) andalso Size >= 0;
- (#b_var{}) -> true
- end, [Arg1,Arg2]) of
- true -> maybe;
- false -> no
- end;
-will_succeed_1(#b_set{op=bs_init,
- args=[#b_literal{val=new},#b_literal{val=Size},_Unit]},
- _Src, _Ts, _Sub) ->
- if
- is_integer(Size), Size >= 0 ->
- maybe;
- true ->
- no
- end;
-will_succeed_1(#b_set{op=bs_init,
- args=[#b_literal{},_,#b_literal{val=Size},_Unit]},
- _Src, _Ts, _Sub) ->
- if
- is_integer(Size), Size >= 0 ->
- maybe;
- true ->
- no
- end;
+will_succeed_1(#b_set{op=bs_create_bin}, _Src, _Ts) ->
+ %% Intentionally don't try to determine whether construction will
+ %% fail. Construction is unlikely to fail, and if it fails, the
+ %% instruction in the runtime system will generate an exception with
+ %% better information of what went wrong.
+ 'maybe';
will_succeed_1(#b_set{op=bs_match,
args=[#b_literal{val=Type},_,_,#b_literal{val=Size},_]},
- _Src, _Ts, _Sub) ->
+ _Src, _Ts) ->
if
is_integer(Size), Size >= 0 ->
- maybe;
+ 'maybe';
Type =:= binary, Size =:= all ->
%% `all` is a legal size for binary segments at the end of
%% a binary pattern.
- maybe;
+ 'maybe';
true ->
%% Invalid size. Matching will fail.
no
end;
%% These operations may fail even though we know their return value on success.
-will_succeed_1(#b_set{op=call}, _Src, _Ts, _Sub) ->
- maybe;
-will_succeed_1(#b_set{op=get_map_element}, _Src, _Ts, _Sub) ->
- maybe;
-will_succeed_1(#b_set{op=wait_timeout}, _Src, _Ts, _Sub) ->
+will_succeed_1(#b_set{op=call}, _Src, _Ts) ->
+ 'maybe';
+will_succeed_1(#b_set{op=get_map_element}, _Src, _Ts) ->
+ 'maybe';
+will_succeed_1(#b_set{op=wait_timeout}, _Src, _Ts) ->
%% It is essential to keep the {succeeded,body} instruction to
%% ensure that the failure edge, which potentially leads to a
%% landingpad, is preserved. If the failure edge is removed, a Y
%% register holding a `try` tag could be reused prematurely.
- maybe;
+ 'maybe';
-will_succeed_1(#b_set{}, _Src, _Ts, _Sub) ->
- maybe.
+will_succeed_1(#b_set{}, _Src, _Ts) ->
+ 'maybe'.
simplify_is_record(I, #t_tuple{exact=Exact,
size=Size,
@@ -1114,9 +1421,9 @@ simplify_is_record(I, #t_tuple{exact=Exact,
{ok, _} -> no;
error ->
%% Is it at all possible for the tag to match?
- case beam_types:meet(raw_type(RecTag, Ts), TagType) of
+ case beam_types:meet(concrete_type(RecTag, Ts), TagType) of
none -> no;
- _ -> maybe
+ _ -> 'maybe'
end
end,
if
@@ -1144,7 +1451,7 @@ simplify_switch_bool(#b_switch{arg=B,fail=Fail,list=List0}, Ts, Ds, Sub) ->
simplify_not(#b_br{bool=#b_var{}=V,succ=Succ,fail=Fail}=Br0, Ts, Ds, Sub) ->
case Ds of
#{V:=#b_set{op={bif,'not'},args=[Bool]}} ->
- case beam_types:is_boolean_type(raw_type(Bool, Ts)) of
+ case beam_types:is_boolean_type(concrete_type(Bool, Ts)) of
true ->
Br = Br0#b_br{bool=Bool,succ=Fail,fail=Succ},
simplify_terminator(Br, Ts, Ds, Sub);
@@ -1163,7 +1470,7 @@ simplify_phi_args([{Arg0, From} | Rest], Ls, Sub, Type0, Args) ->
{outgoing, Ts} = Outgoing, %Assertion.
Arg = simplify_arg(Arg0, Ts, Sub),
- Type = beam_types:join(raw_type(Arg, Ts), Type0),
+ Type = beam_types:join(concrete_type(Arg, Ts), Type0),
Phi = {Arg, From},
simplify_phi_args(Rest, Ls, Sub, Type, [Phi | Args]);
@@ -1239,7 +1546,8 @@ simplify_pure_call(Mod, Name, Args0, I) ->
any_non_numeric_argument([#b_literal{val=Lit}|_], _Ts) ->
is_non_numeric(Lit);
any_non_numeric_argument([#b_var{}=V|T], Ts) ->
- is_non_numeric_type(raw_type(V, Ts)) orelse any_non_numeric_argument(T, Ts);
+ is_non_numeric_type(concrete_type(V, Ts)) orelse
+ any_non_numeric_argument(T, Ts);
any_non_numeric_argument([], _Ts) -> false.
is_non_numeric([H|T]) ->
@@ -1292,8 +1600,8 @@ make_literal_list([], Acc) ->
reverse(Acc).
is_safe_bool_op([LHS, RHS], Ts) ->
- LType = raw_type(LHS, Ts),
- RType = raw_type(RHS, Ts),
+ LType = concrete_type(LHS, Ts),
+ RType = concrete_type(RHS, Ts),
beam_types:is_boolean_type(LType) andalso
beam_types:is_boolean_type(RType).
@@ -1305,7 +1613,7 @@ eval_bif(#b_set{op={bif,Bif},args=Args}=I, Ts) ->
true ->
case make_literal_list(Args) of
none ->
- eval_type_test_bif(I, Bif, raw_types(Args, Ts));
+ eval_type_test_bif(I, Bif, concrete_types(Args, Ts));
LitArgs ->
try apply(erlang, Bif, LitArgs) of
Val -> #b_literal{val=Val}
@@ -1341,6 +1649,9 @@ eval_type_test_bif(I, is_boolean, [Type]) ->
end;
eval_type_test_bif(I, is_float, [Type]) ->
eval_type_test_bif_1(I, Type, #t_float{});
+eval_type_test_bif(I, is_function, [Type, #t_integer{elements={Arity,Arity}}])
+ when Arity >= 0, Arity =< ?MAX_FUNC_ARGS ->
+ eval_type_test_bif_1(I, Type, #t_fun{arity=Arity});
eval_type_test_bif(I, is_function, [Type]) ->
eval_type_test_bif_1(I, Type, #t_fun{});
eval_type_test_bif(I, is_integer, [Type]) ->
@@ -1351,6 +1662,12 @@ eval_type_test_bif(I, is_map, [Type]) ->
eval_type_test_bif_1(I, Type, #t_map{});
eval_type_test_bif(I, is_number, [Type]) ->
eval_type_test_bif_1(I, Type, number);
+eval_type_test_bif(I, is_pid, [Type]) ->
+ eval_type_test_bif_1(I, Type, pid);
+eval_type_test_bif(I, is_port, [Type]) ->
+ eval_type_test_bif_1(I, Type, port);
+eval_type_test_bif(I, is_reference, [Type]) ->
+ eval_type_test_bif_1(I, Type, reference);
eval_type_test_bif(I, is_tuple, [Type]) ->
eval_type_test_bif_1(I, Type, #t_tuple{});
eval_type_test_bif(I, Op, Types) ->
@@ -1414,7 +1731,7 @@ simplify_arg(#b_var{}=Arg0, Ts, Sub) ->
#b_literal{}=LitArg ->
LitArg;
#b_var{}=Arg ->
- case beam_types:get_singleton_value(raw_type(Arg, Ts)) of
+ case beam_types:get_singleton_value(concrete_type(Arg, Ts)) of
{ok, Val} -> #b_literal{val=Val};
error -> Arg
end
@@ -1564,7 +1881,7 @@ update_successors(#b_br{bool=#b_literal{val=true},succ=Succ}=Last,
{Last, update_successor(Succ, Ts, Ls)};
update_successors(#b_br{bool=#b_var{}=Bool,succ=Succ,fail=Fail}=Last0,
Ts, Ds, Ls0, UsedOnce) ->
- IsTempVar = sets:is_element(Bool, UsedOnce),
+ IsTempVar = is_map_key(Bool, UsedOnce),
case infer_types_br(Bool, Ts, IsTempVar, Ds) of
{#{}=SuccTs, #{}=FailTs} ->
Ls1 = update_successor(Succ, SuccTs, Ls0),
@@ -1579,10 +1896,11 @@ update_successors(#b_br{bool=#b_var{}=Bool,succ=Succ,fail=Fail}=Last0,
end;
update_successors(#b_switch{arg=#b_var{}=V,fail=Fail0,list=List0}=Last0,
Ts, Ds, Ls0, UsedOnce) ->
- IsTempVar = sets:is_element(V, UsedOnce),
+ IsTempVar = is_map_key(V, UsedOnce),
{List1, FailTs, Ls1} =
- update_switch(List0, V, raw_type(V, Ts), Ts, Ds, Ls0, IsTempVar, []),
+ update_switch(List0, V, concrete_type(V, Ts),
+ Ts, Ds, Ls0, IsTempVar, []),
case FailTs of
none ->
@@ -1611,7 +1929,7 @@ update_successors(#b_ret{}=Last, _Ts, _Ds, Ls, _UsedOnce) ->
update_switch([{Val, Lbl}=Sw | List],
V, FailType0, Ts, Ds, Ls0, IsTempVar, Acc) ->
- FailType = beam_types:subtract(FailType0, raw_type(Val, Ts)),
+ FailType = beam_types:subtract(FailType0, concrete_type(Val, Ts)),
case infer_types_switch(V, Val, Ts, IsTempVar, Ds) of
none ->
update_switch(List, V, FailType, Ts, Ds, Ls0, IsTempVar, Acc);
@@ -1630,11 +1948,19 @@ update_switch([], V, FailType, Ts, Ds, Ls, IsTempVar, Acc) ->
%% we can infer types as if we matched it directly.
Lit = #b_literal{val=Value},
infer_types_switch(V, Lit, Ts, IsTempVar, Ds);
- error when IsTempVar ->
- ts_remove_var(V, Ts);
error ->
- Ts#{ V := FailType }
+ %% There's more than one possible value, try a weaker
+ %% variant of the inference for case labels.
+ #{ V := Def } = Ds,
+ PosTypes = [{V, FailType} | infer_eq_type(Def, FailType)],
+
+ case meet_types(PosTypes, Ts) of
+ none -> none;
+ FailTs0 when IsTempVar -> ts_remove_var(V, FailTs0);
+ FailTs0 -> FailTs0
+ end
end,
+
{reverse(Acc), FailTs, Ls}.
update_successor(?EXCEPTION_BLOCK, _Ts, Ls) ->
@@ -1657,19 +1983,29 @@ update_successor(S, Ts0, Ls) ->
update_types(#b_set{op=Op,dst=Dst,anno=Anno,args=Args}, Ts, Ds) ->
T = type(Op, Args, Anno, Ts, Ds),
- Ts#{Dst=>T}.
+ Ts#{ Dst => T }.
type({bif,Bif}, Args, _Anno, Ts, _Ds) ->
ArgTypes = normalized_types(Args, Ts),
- {RetType, _, _} = beam_call_types:types(erlang, Bif, ArgTypes),
- RetType;
-type(bs_init, _Args, _Anno, _Ts, _Ds) ->
+ case beam_call_types:types(erlang, Bif, ArgTypes) of
+ {any, _, _} ->
+ case {Bif, Args} of
+ {element, [_,#b_literal{val=Tuple}]}
+ when tuple_size(Tuple) > 0 ->
+ join_tuple_elements(Tuple);
+ {_, _} ->
+ any
+ end;
+ {RetType, _, _} ->
+ RetType
+ end;
+type(bs_create_bin, _Args, _Anno, _Ts, _Ds) ->
#t_bitstring{};
type(bs_extract, [Ctx], _Anno, _Ts, Ds) ->
#b_set{op=bs_match,args=Args} = map_get(Ctx, Ds),
bs_match_type(Args);
type(bs_start_match, [_, Src], _Anno, Ts, _Ds) ->
- case beam_types:meet(#t_bs_matchable{}, raw_type(Src, Ts)) of
+ case beam_types:meet(#t_bs_matchable{}, concrete_type(Src, Ts)) of
none ->
none;
T ->
@@ -1682,7 +2018,7 @@ type(bs_match, [#b_literal{val=binary}, Ctx, _Flags,
%% This is an explicit tail unit test which does not advance the match
%% position.
- CtxType = raw_type(Ctx, Ts),
+ CtxType = concrete_type(Ctx, Ts),
OpType = #t_bs_context{tail_unit=OpUnit},
beam_types:meet(CtxType, OpType);
@@ -1692,30 +2028,41 @@ type(bs_match, Args, _Anno, Ts, _Ds) ->
%% Matches advance the current position without testing the tail unit. We
%% try to retain unit information by taking the GCD of our current unit and
%% the increments we know the match will advance by.
- #t_bs_context{tail_unit=CtxUnit} = raw_type(Ctx, Ts),
+ #t_bs_context{tail_unit=CtxUnit} = concrete_type(Ctx, Ts),
OpUnit = bs_match_stride(Args, Ts),
#t_bs_context{tail_unit=gcd(OpUnit, CtxUnit)};
type(bs_get_tail, [Ctx], _Anno, Ts, _Ds) ->
- #t_bs_context{tail_unit=Unit} = raw_type(Ctx, Ts),
+ #t_bs_context{tail_unit=Unit} = concrete_type(Ctx, Ts),
#t_bitstring{size_unit=Unit};
type(call, [#b_remote{mod=#b_literal{val=Mod},
- name=#b_literal{val=Name}}|Args], _Anno, Ts, _Ds) ->
+ name=#b_literal{val=Name}}|Args], _Anno, Ts, _Ds)
+ when is_atom(Mod), is_atom(Name) ->
ArgTypes = normalized_types(Args, Ts),
{RetType, _, _} = beam_call_types:types(Mod, Name, ArgTypes),
RetType;
-type(call, [#b_remote{} | _Args], _Anno, _Ts, _Ds) ->
- %% Remote call with variable Module and/or Function.
- any;
+type(call, [#b_remote{mod=Mod,name=Name} | _Args], _Anno, Ts, _Ds) ->
+ %% Remote call with variable Module and/or Function, we can't say much
+ %% about it other than that it will crash when either of the two is not an
+ %% atom.
+ ModType = beam_types:meet(concrete_type(Mod, Ts), #t_atom{}),
+ NameType = beam_types:meet(concrete_type(Name, Ts), #t_atom{}),
+ case {ModType, NameType} of
+ {none, _} -> none;
+ {_, none} -> none;
+ {_, _} -> any
+ end;
type(call, [#b_local{} | _Args], Anno, _Ts, _Ds) ->
case Anno of
#{ result_type := Type } -> Type;
#{} -> any
end;
-type(call, [#b_var{} | _Args], Anno, _Ts, _Ds) ->
- case Anno of
- #{ result_type := Type } -> Type;
- #{} -> any
+type(call, [#b_var{}=Fun | Args], Anno, Ts, _Ds) ->
+ FunType = concrete_type(Fun, Ts),
+ case {beam_types:meet(FunType, #t_fun{arity=length(Args)}), Anno} of
+ {#t_fun{}, #{ result_type := Type }} -> Type;
+ {#t_fun{}, #{}} -> any;
+ {none, #{}} -> none
end;
type(call, [#b_literal{val=Fun} | Args], _Anno, _Ts, _Ds) ->
case is_function(Fun, length(Args)) of
@@ -1751,11 +2098,16 @@ type(get_map_element, [_, _]=Args0, _Anno, Ts, _Ds) ->
[#t_map{}=Map, Key] = normalized_types(Args0, Ts), %Assertion.
{RetType, _, _} = beam_call_types:types(erlang, map_get, [Key, Map]),
RetType;
-type(get_tuple_element, [Tuple, Offset], _Anno, Ts, _Ds) ->
- #t_tuple{size=Size,elements=Es} = normalized_type(Tuple, Ts),
+type(get_tuple_element, [Tuple, Offset], _Anno, _Ts, _Ds) ->
#b_literal{val=N} = Offset,
- true = Size > N, %Assertion.
- beam_types:get_tuple_element(N + 1, Es);
+ Index = N + 1,
+ %% Defer our type until our first use (concrete_type/2), as our type may
+ %% depend on another value extracted from the same container.
+ fun(Ts) ->
+ #t_tuple{size=Size,elements=Es} = normalized_type(Tuple, Ts),
+ true = Index =< Size, %Assertion.
+ beam_types:get_tuple_element(Index, Es)
+ end;
type(has_map_field, [_, _]=Args0, _Anno, Ts, _Ds) ->
[#t_map{}=Map, Key] = normalized_types(Args0, Ts), %Assertion.
{RetType, _, _} = beam_call_types:types(erlang, is_map_key, [Key, Map]),
@@ -1764,27 +2116,41 @@ type(is_nonempty_list, [_], _Anno, _Ts, _Ds) ->
beam_types:make_boolean();
type(is_tagged_tuple, [_,#b_literal{},#b_literal{}], _Anno, _Ts, _Ds) ->
beam_types:make_boolean();
-type(MakeFun, [#b_local{arity=TotalArity} | Env], Anno, _Ts, _Ds)
- when MakeFun =:= make_fun;
- MakeFun =:= old_make_fun ->
+type(MakeFun, Args, Anno, _Ts, _Ds) when MakeFun =:= make_fun;
+ MakeFun =:= old_make_fun ->
RetType = case Anno of
#{ result_type := Type } -> Type;
#{} -> any
end,
- #t_fun{arity=TotalArity - length(Env), type=RetType};
+ [#b_local{name=#b_literal{val=Name},arity=TotalArity} | Env] = Args,
+ Arity = TotalArity - length(Env),
+ #t_fun{arity=Arity,target={Name,TotalArity},type=RetType};
+type(match_fail, _, _Anno, _Ts, _Ds) ->
+ none;
type(put_map, [_Kind, Map | Ss], _Anno, Ts, _Ds) ->
put_map_type(Map, Ss, Ts);
type(put_list, [Head, Tail], _Anno, Ts, _Ds) ->
- HeadType = raw_type(Head, Ts),
- TailType = raw_type(Tail, Ts),
+ HeadType = concrete_type(Head, Ts),
+ TailType = concrete_type(Tail, Ts),
beam_types:make_cons(HeadType, TailType);
type(put_tuple, Args, _Anno, Ts, _Ds) ->
{Es, _} = foldl(fun(Arg, {Es0, Index}) ->
- Type = raw_type(Arg, Ts),
+ Type = concrete_type(Arg, Ts),
Es = beam_types:set_tuple_element(Index, Type, Es0),
{Es, Index + 1}
end, {#{}, 1}, Args),
#t_tuple{exact=true,size=length(Args),elements=Es};
+type(raw_raise, [Class, _, _], _Anno, Ts, _Ds) ->
+ ClassType = concrete_type(Class, Ts),
+ case beam_types:meet(ClassType, #t_atom{elements=[error,exit,throw]}) of
+ ClassType ->
+ %% Unlike erlang:raise/3, the stack argument is always correct as
+ %% it's generated by the emulator, so we KNOW that it will raise an
+ %% exception when the class is correct.
+ none;
+ _ ->
+ beam_types:make_atom(badarg)
+ end;
type(resume, [_, _], _Anno, _Ts, _Ds) ->
none;
type(wait_timeout, [#b_literal{val=infinity}], _Anno, _Ts, _Ds) ->
@@ -1793,6 +2159,16 @@ type(wait_timeout, [#b_literal{val=infinity}], _Anno, _Ts, _Ds) ->
type(_, _, _, _, _) ->
any.
+join_tuple_elements(Tuple) ->
+ join_tuple_elements(tuple_size(Tuple), Tuple, none).
+
+join_tuple_elements(0, _Tuple, Type) ->
+ Type;
+join_tuple_elements(I, Tuple, Type0) ->
+ Type1 = beam_types:make_type_from_value(element(I, Tuple)),
+ Type = beam_types:join(Type0, Type1),
+ join_tuple_elements(I - 1, Tuple, Type).
+
put_map_type(Map, Ss, Ts) ->
pmt_1(Ss, Ts, normalized_type(Map, Ts)).
@@ -1810,7 +2186,7 @@ bs_match_stride([#b_literal{val=Type} | Args], Ts) ->
bs_match_stride(Type, Args, Ts).
bs_match_stride(_, [_,_,Size,#b_literal{val=Unit}], Ts) ->
- case raw_type(Size, Ts) of
+ case concrete_type(Size, Ts) of
#t_integer{elements={Sz, Sz}} when is_integer(Sz) ->
Sz * Unit;
_ ->
@@ -1844,12 +2220,13 @@ bs_match_type(integer, Args) ->
#b_literal{val=Size},
#b_literal{val=Unit}] when Size * Unit < 64 ->
NumBits = Size * Unit,
+ Max = (1 bsl NumBits) - 1,
case member(unsigned, Flags) of
true ->
- beam_types:make_integer(0, (1 bsl NumBits)-1);
+ beam_types:make_integer(0, Max);
false ->
- %% Signed integer. Don't bother.
- #t_integer{}
+ Min = -(Max + 1),
+ beam_types:make_integer(Min, Max)
end;
[_|_] ->
#t_integer{}
@@ -1868,8 +2245,10 @@ bs_match_type(utf32, _) ->
normalized_types(Values, Ts) ->
[normalized_type(Val, Ts) || Val <- Values].
+-spec normalized_type(beam_ssa:value(), type_db()) -> normal_type().
+
normalized_type(V, Ts) ->
- beam_types:normalize(raw_type(V, Ts)).
+ beam_types:normalize(concrete_type(V, Ts)).
argument_types(Values, Ts) ->
[argument_type(Val, Ts) || Val <- Values].
@@ -1877,17 +2256,21 @@ argument_types(Values, Ts) ->
-spec argument_type(beam_ssa:value(), type_db()) -> type().
argument_type(V, Ts) ->
- beam_types:limit_depth(raw_type(V, Ts)).
+ beam_types:limit_depth(concrete_type(V, Ts)).
-raw_types(Values, Ts) ->
- [raw_type(Val, Ts) || Val <- Values].
+concrete_types(Values, Ts) ->
+ [concrete_type(Val, Ts) || Val <- Values].
--spec raw_type(beam_ssa:value(), type_db()) -> type().
+-spec concrete_type(beam_ssa:value(), type_db()) -> type().
-raw_type(#b_literal{val=Value}, _Ts) ->
+concrete_type(#b_literal{val=Value}, _Ts) ->
beam_types:make_type_from_value(Value);
-raw_type(V, Ts) ->
- map_get(V, Ts).
+concrete_type(#b_var{}=Var, Ts) ->
+ #{ Var := Type } = Ts,
+ case is_function(Type) of
+ true -> Type(Ts);
+ false -> Type
+ end.
%% infer_types(Var, Types, #d{}) -> {SuccTypes,FailTypes}
%% Looking at the expression that defines the variable Var, infer
@@ -1965,48 +2348,72 @@ infer_type({succeeded,_}, [#b_var{}=Src], Ts, Ds) ->
%% not branching on 'succeeded'.
infer_type(is_tagged_tuple, [#b_var{}=Src,#b_literal{val=Size},
#b_literal{}=Tag], _Ts, _Ds) ->
- Es = beam_types:set_tuple_element(1, raw_type(Tag, #{}), #{}),
+ Es = beam_types:set_tuple_element(1, concrete_type(Tag, #{}), #{}),
T = {Src,#t_tuple{exact=true,size=Size,elements=Es}},
{[T], [T]};
infer_type(is_nonempty_list, [#b_var{}=Src], _Ts, _Ds) ->
T = {Src,#t_cons{}},
{[T], [T]};
-infer_type({bif,is_atom}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_atom}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_atom{}},
{[T], [T]};
-infer_type({bif,is_binary}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_binary}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_bitstring{size_unit=8}},
{[T], [T]};
-infer_type({bif,is_bitstring}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_bitstring}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_bitstring{}},
{[T], [T]};
-infer_type({bif,is_boolean}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_boolean}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, beam_types:make_boolean()},
{[T], [T]};
-infer_type({bif,is_float}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_float}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_float{}},
{[T], [T]};
-infer_type({bif,is_integer}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_function}, [#b_var{}=Arg], _Ts, _Ds) ->
+ T = {Arg, #t_fun{}},
+ {[T], [T]};
+infer_type({bif,is_function}, [#b_var{}=Arg, Arity], _Ts, _Ds) ->
+ case Arity of
+ #b_literal{val=V} when is_integer(V), V >= 0, V =< ?MAX_FUNC_ARGS ->
+ T = {Arg, #t_fun{arity=V}},
+ {[T], [T]};
+ _ ->
+ %% We cannot subtract the function type when the arity is unknown:
+ %% `Arg` may still be a function if the arity is outside the
+ %% allowed range.
+ T = {Arg, #t_fun{}},
+ {[T], []}
+ end;
+infer_type({bif,is_integer}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_integer{}},
{[T], [T]};
-infer_type({bif,is_list}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_list}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_list{}},
{[T], [T]};
-infer_type({bif,is_map}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_map}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_map{}},
{[T], [T]};
-infer_type({bif,is_number}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_number}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, number},
{[T], [T]};
-infer_type({bif,is_tuple}, [Arg], _Ts, _Ds) ->
+infer_type({bif,is_pid}, [#b_var{}=Arg], _Ts, _Ds) ->
+ T = {Arg, pid},
+ {[T], [T]};
+infer_type({bif,is_port}, [#b_var{}=Arg], _Ts, _Ds) ->
+ T = {Arg, port},
+ {[T], [T]};
+infer_type({bif,is_reference}, [#b_var{}=Arg], _Ts, _Ds) ->
+ T = {Arg, reference},
+ {[T], [T]};
+infer_type({bif,is_tuple}, [#b_var{}=Arg], _Ts, _Ds) ->
T = {Arg, #t_tuple{}},
{[T], [T]};
infer_type({bif,'=:='}, [#b_var{}=LHS,#b_var{}=RHS], Ts, _Ds) ->
%% As an example, assume that L1 is known to be 'list', and L2 is
%% known to be 'cons'. Then if 'L1 =:= L2' evaluates to 'true', it can
%% be inferred that L1 is 'cons' (the meet of 'cons' and 'list').
- LType = raw_type(LHS, Ts),
- RType = raw_type(RHS, Ts),
+ LType = concrete_type(LHS, Ts),
+ RType = concrete_type(RHS, Ts),
Type = beam_types:meet(LType, RType),
PosTypes = [{V,Type} || {V, OrigType} <- [{LHS, LType}, {RHS, RType}],
@@ -2032,13 +2439,13 @@ infer_type({bif,'=:='}, [#b_var{}=LHS,#b_var{}=RHS], Ts, _Ds) ->
{PosTypes, NegTypes};
infer_type({bif,'=:='}, [#b_var{}=Src,#b_literal{}=Lit], Ts, Ds) ->
Def = maps:get(Src, Ds),
- LitType = raw_type(Lit, Ts),
- PosTypes = [{Src, LitType} | infer_eq_lit(Def, LitType)],
+ LitType = concrete_type(Lit, Ts),
+ PosTypes = [{Src, LitType} | infer_eq_type(Def, LitType)],
%% Subtraction is only safe if LitType is single-valued.
NegTypes = case beam_types:is_singleton_type(LitType) of
- true -> PosTypes;
- false -> []
+ true -> PosTypes;
+ false -> []
end,
{PosTypes, NegTypes};
@@ -2073,21 +2480,21 @@ infer_success_type(bs_match, [#b_literal{val=binary},
infer_success_type(_Op, _Args, _Ts, _Ds) ->
{[], []}.
-infer_eq_lit(#b_set{op={bif,tuple_size},args=[#b_var{}=Tuple]},
- #t_integer{elements={Size,Size}}) ->
+infer_eq_type(#b_set{op={bif,tuple_size},args=[#b_var{}=Tuple]},
+ #t_integer{elements={Size,Size}}) ->
[{Tuple,#t_tuple{exact=true,size=Size}}];
-infer_eq_lit(#b_set{op=get_tuple_element,
- args=[#b_var{}=Tuple,#b_literal{val=N}]},
- LitType) ->
+infer_eq_type(#b_set{op=get_tuple_element,
+ args=[#b_var{}=Tuple,#b_literal{val=N}]},
+ ElementType) ->
Index = N + 1,
- case beam_types:set_tuple_element(Index, LitType, #{}) of
+ case beam_types:set_tuple_element(Index, ElementType, #{}) of
#{ Index := _ }=Es ->
[{Tuple,#t_tuple{size=Index,elements=Es}}];
#{} ->
%% Index was above the element limit; subtraction is not safe.
[]
end;
-infer_eq_lit(_, _) ->
+infer_eq_type(_, _) ->
[].
join_types(Ts, Ts) ->
@@ -2105,7 +2512,16 @@ join_types_1([V | Vs], Bigger, Smaller) ->
case {Bigger, Smaller} of
{#{ V := Same }, #{ V := Same }} ->
join_types_1(Vs, Bigger, Smaller);
- {#{ V := LHS }, #{ V := RHS }} ->
+ {#{ V := LHS0 }, #{ V := RHS0 }} ->
+ %% Inlined concrete_type/2 for performance.
+ LHS = case is_function(LHS0) of
+ true -> LHS0(Bigger);
+ false -> LHS0
+ end,
+ RHS = case is_function(RHS0) of
+ true -> RHS0(Smaller);
+ false -> RHS0
+ end,
T = beam_types:join(LHS, RHS),
join_types_1(Vs, Bigger, Smaller#{ V := T });
{#{}, #{ V := _ }} ->
@@ -2115,22 +2531,24 @@ join_types_1([], _Bigger, Smaller) ->
Smaller.
meet_types([{V,T0}|Vs], Ts) ->
- #{V:=T1} = Ts,
+ T1 = concrete_type(V, Ts),
case beam_types:meet(T0, T1) of
none -> none;
T1 -> meet_types(Vs, Ts);
- T -> meet_types(Vs, Ts#{V:=T})
+ T -> meet_types(Vs, Ts#{ V := T })
end;
-meet_types([], Ts) -> Ts.
+meet_types([], Ts) ->
+ Ts.
subtract_types([{V,T0}|Vs], Ts) ->
- #{V:=T1} = Ts,
+ T1 = concrete_type(V, Ts),
case beam_types:subtract(T1, T0) of
none -> none;
T1 -> subtract_types(Vs, Ts);
- T -> subtract_types(Vs, Ts#{V:=T})
+ T -> subtract_types(Vs, Ts#{ V:= T })
end;
-subtract_types([], Ts) -> Ts.
+subtract_types([], Ts) ->
+ Ts.
parallel_join([A | As], [B | Bs]) ->
[beam_types:join(A, B) | parallel_join(As, Bs)];
@@ -2148,9 +2566,8 @@ gcd(A, B) ->
%%%
init_metadata(FuncId, Linear, Params) ->
- {RetCounter, Map0} = init_metadata_1(reverse(Linear), 0, #{}),
- Map = maps:without(Params, Map0),
- UsedOnce = sets:from_list(maps:keys(Map), [{version, 2}]),
+ {RetCounter, UsedOnce0} = init_metadata_1(reverse(Linear), 0, #{}),
+ UsedOnce = maps:without(Params, UsedOnce0),
#metadata{ func_id = FuncId,
limit_return = (RetCounter >= ?RETURN_LIMIT),
@@ -2165,11 +2582,11 @@ init_metadata_1([{L,#b_blk{is=Is,last=Last}} | Bs], RetCounter0, Uses0) ->
_ -> RetCounter0
end,
- %% Calculate the set of variables that are only used once in the terminator
- %% of the block that defines them. That will allow us to discard type
- %% information discard type information for variables that will never be
- %% referenced by the successor blocks, potentially improving compilation
- %% times.
+ %% Calculate the set of variables that are only used once in the
+ %% terminator of the block that defines them. That will allow us
+ %% to discard type information for variables that will never be
+ %% referenced by the successor blocks, potentially improving
+ %% compilation times.
Uses1 = used_once_last_uses(beam_ssa:used(Last), L, Uses0),
Uses = used_once_2(reverse(Is), L, Uses1),
@@ -2180,7 +2597,7 @@ init_metadata_1([], RetCounter, Uses) ->
used_once_2([#b_set{dst=Dst}=I|Is], L, Uses0) ->
Uses = used_once_uses(beam_ssa:used(I), L, Uses0),
case Uses of
- #{Dst:=[L]} ->
+ #{Dst:=L} ->
used_once_2(Is, L, Uses);
#{} ->
%% Used more than once or used once in
@@ -2202,15 +2619,15 @@ used_once_uses([], _, Uses) -> Uses.
used_once_last_uses([V|Vs], L, Uses) ->
case Uses of
- #{V:=[_]} ->
- %% Second time this variable is used.
- used_once_last_uses(Vs, L, Uses#{V:=more_than_once});
#{V:=more_than_once} ->
%% Used at least twice before.
used_once_last_uses(Vs, L, Uses);
+ #{V:=_} ->
+ %% Second time this variable is used.
+ used_once_last_uses(Vs, L, Uses#{V:=more_than_once});
#{} ->
%% First time this variable is used.
- used_once_last_uses(Vs, L, Uses#{V=>[L]})
+ used_once_last_uses(Vs, L, Uses#{V=>L})
end;
used_once_last_uses([], _, Uses) -> Uses.
@@ -2256,7 +2673,7 @@ wl_changed(#worklist{counter=Same}, #worklist{counter=Same}) -> false;
wl_changed(#worklist{}, #worklist{}) -> true.
%% Adds the given elements to the back of the worklist, skipping the elements
-%% that are already present. This lets us append elements arbitrarly after the
+%% that are already present. This lets us append elements arbitrarily after the
%% current front without changing the work order.
wl_defer_list(Elements, #worklist{counter=Counter,elements=Es,indexes=Is}) ->
wl_defer_list_1(Elements, Counter, Es, Is).
diff --git a/lib/compiler/src/beam_trim.erl b/lib/compiler/src/beam_trim.erl
index 0dbe2bb18a..4fb141251d 100644
--- a/lib/compiler/src/beam_trim.erl
+++ b/lib/compiler/src/beam_trim.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,10 +21,13 @@
-module(beam_trim).
-export([module/2]).
--import(lists, [any/2,member/2,reverse/1,reverse/2,sort/1]).
+-import(lists, [any/2,reverse/1,reverse/2,seq/2,sort/1]).
+
+-include("beam_asm.hrl").
-record(st,
- {safe :: sets:set(beam_asm:label()) %Safe labels.
+ {safe :: sets:set(beam_asm:label()), %Safe labels.
+ fsz :: non_neg_integer()
}).
-spec module(beam_utils:module_code(), [compile:option()]) ->
@@ -36,8 +39,9 @@ module({Mod,Exp,Attr,Fs0,Lc}, _Opts) ->
function({function,Name,Arity,CLabel,Is0}) ->
try
- St = #st{safe=safe_labels(Is0, [])},
- Is = trim(Is0, St, []),
+ St = #st{safe=safe_labels(Is0, []),fsz=0},
+ Usage = none,
+ Is = trim(Is0, Usage, St),
{function,Name,Arity,CLabel,Is}
catch
Class:Error:Stack ->
@@ -45,43 +49,45 @@ function({function,Name,Arity,CLabel,Is0}) ->
erlang:raise(Class, Error, Stack)
end.
-trim([{init_yregs,{list,Kills0}}=I|Is0], St, Acc) ->
- Kills = [{kill,Y} || Y <- Kills0],
- try
- %% Find out the size and layout of the stack frame.
- %% Example of a layout:
- %%
- %% [{kill,{y,0}},{dead,{y,1},{live,{y,2}},{kill,{y,3}}]
- %%
- %% That means that y0 and y3 are to be killed, that y1
- %% has been killed previously, and that y2 is live.
- {FrameSize,Layout} = frame_layout(Is0, Kills, St),
-
- %% Calculate all recipes that are not worse in terms
- %% of estimated execution time. The recipes are ordered
- %% in descending order from how much they trim.
- IsNotRecursive = is_not_recursive(Is0),
- Recipes = trim_recipes(Layout, IsNotRecursive),
-
- %% Try the recipes in order. A recipe may not work out because
- %% a register that was previously killed may be
- %% resurrected. If that happens, the next recipe, which trims
- %% less, will be tried.
- try_remap(Recipes, Is0, FrameSize)
- of
- {Is,TrimInstr} ->
- %% One of the recipes was applied.
- trim(Is, St, reverse(TrimInstr)++Acc)
- catch
- not_possible ->
+trim([{init_yregs,_}=I|Is], none, St0) ->
+ case usage(Is, St0) of
+ none ->
+ [I|trim(Is, none, St0)];
+ {FrameSize,Us} ->
+ St = St0#st{fsz=FrameSize},
+ trim([I|Is], Us, St)
+ end;
+trim([{init_yregs,{list,Killed}}=I|Is0], [U|Us], St) ->
+ FrameSize = St#st.fsz,
+
+ %% Find out layout of the stack frame. Example of a layout:
+ %%
+ %% [{kill,{y,0}},{dead,{y,1},{live,{y,2}},{kill,{y,3}}]
+ %%
+ %% That means that y0 and y3 are to be killed, that y1
+ %% has been killed previously, and that y2 is live.
+ Layout = frame_layout(FrameSize, Killed, U),
+
+ %% Find a trim recipe.
+ IsNotRecursive = is_not_recursive(Is0),
+ case trim_recipe(Layout, IsNotRecursive, U) of
+ none ->
%% No recipe worked out. Use the original init_yregs/1
%% instruction.
- trim(Is0, St, [I|Acc])
+ [I|trim(Is0, Us, St)];
+ R ->
+ %% Apply the recipe.
+ {TrimInstr,Remap} = expand_recipe(R, FrameSize),
+ Is = remap(Is0, Remap),
+ TrimInstr ++ trim(Is, none, St)
end;
-trim([I|Is], St, Acc) ->
- trim(Is, St, [I|Acc]);
-trim([], _, Acc) ->
- reverse(Acc).
+trim([I|Is], [_|Us], St) ->
+ [I|trim(Is, Us, St)];
+trim([I|Is], none, St) ->
+ [I|trim(Is, none, St)];
+trim([I|Is], [], St) ->
+ [I|trim(Is, none, St)];
+trim([], _, _) -> [].
%% is_not_recursive([Instruction]) -> true|false.
%% Test whether the next call or apply instruction may
@@ -98,21 +104,26 @@ is_not_recursive([{block,_}|Is]) -> is_not_recursive(Is);
is_not_recursive([{line,_}|Is]) -> is_not_recursive(Is);
is_not_recursive(_) -> false.
-%% trim_recipes([{kill,R}|{live,R}|{dead,R}]) -> [Recipe].
+%% trim_recipe([{kill,R}|{live,R}|{dead,R}]) -> Recipe | none.
%% Recipe = {Kills,NumberToTrim,Moves}
%% Kills = [{kill,Y}]
%% Moves = [{move,SrcY,DstY}]
%%
%% Calculate how to best trim the stack and kill the correct
-%% Y registers. Return a list of possible recipes. The best
-%% recipe (the one that trims the most) is first in the list.
+%% Y registers. Return the recipe that trims the most.
-trim_recipes(Layout, IsNotRecursive) ->
+trim_recipe(Layout, IsNotRecursive, {Us,Ns}) ->
+ UsedRegs = ordsets:union(Us, Ns),
Recipes = construct_recipes(Layout, 0, [], []),
NumOrigKills = length([I || {kill,_}=I <- Layout]),
IsTooExpensive = is_too_expensive_fun(IsNotRecursive),
- [R || R <- Recipes,
- not is_too_expensive(R, NumOrigKills, IsTooExpensive)].
+ Rs = [R || R <- Recipes,
+ is_recipe_viable(R, UsedRegs),
+ not is_too_expensive(R, NumOrigKills, IsTooExpensive)],
+ case Rs of
+ [] -> none;
+ [R|_] -> R
+ end.
construct_recipes([{kill,{y,Trim0}}|Ks], Trim0, Moves, Acc) ->
Trim = Trim0 + 1,
@@ -133,11 +144,14 @@ construct_recipes([{live,{y,Trim0}=Src}|Ks0], Trim0, Moves0, Acc) ->
Recipe = {Ks,Trim,Moves},
construct_recipes(Ks, Trim, Moves, [Recipe|Acc])
end;
-construct_recipes([], _, _, Acc) -> Acc.
+construct_recipes(_, _, _, Acc) ->
+ Acc.
take_last_dead(L) ->
take_last_dead_1(reverse(L)).
+take_last_dead_1([{live,_}|Is]) ->
+ take_last_dead_1(Is);
take_last_dead_1([{kill,Reg}|Is]) ->
{Reg,reverse(Is)};
take_last_dead_1([{dead,Reg}|Is]) ->
@@ -181,142 +195,140 @@ is_too_expensive_fun(false) ->
NumKills + NumMoves > NumOrigKills
end.
-%% try_remap([Recipe], [Instruction], FrameSize) ->
-%% {[Instruction],[TrimInstruction]}.
-%% Try to renumber Y registers in the instruction stream. The
-%% first recipe that works will be used.
-%%
-%% This function will issue a `not_possible` exception if none
-%% of the recipes were possible to apply.
-
-try_remap([R|Rs], Is, FrameSize) ->
- {TrimInstr,Map} = expand_recipe(R, FrameSize),
- try
- {remap(Is, Map, []),TrimInstr}
- catch
- throw:not_possible ->
- try_remap(Rs, Is, FrameSize)
- end;
-try_remap([], _, _) -> throw(not_possible).
+is_recipe_viable({_,Trim,Moves}, UsedRegs) ->
+ Moved = ordsets:from_list([Src || {move,Src,_} <- Moves]),
+ Illegal = ordsets:from_list([Dst || {move,_,Dst} <- Moves]),
+ Eliminated = [{y,N} || N <- seq(0, Trim - 1)],
+ %% All eliminated registers that are also in the used set must be moved.
+ UsedEliminated = ordsets:intersection(Eliminated, UsedRegs),
+ case ordsets:is_subset(UsedEliminated, Moved) andalso
+ ordsets:is_disjoint(Illegal, UsedRegs) of
+ true ->
+ UsedEliminated = Moved, %Assertion.
+ true;
+ _ ->
+ false
+ end.
expand_recipe({Layout,Trim,Moves}, FrameSize) ->
Is = reverse(Moves, [{trim,Trim,FrameSize-Trim}]),
- Map = create_map(Trim, Moves),
+ Map0 = [{Src,Dst-Trim} || {move,{y,Src},{y,Dst}} <- Moves],
+ Map = maps:from_list(Map0),
+ Remap = {Trim,Map},
case [Y || {kill,Y} <- Layout] of
[] ->
- {Is,Map};
+ {Is,Remap};
[_|_]=Yregs ->
- {[{init_yregs,{list,Yregs}}|Is],Map}
- end.
-
-create_map(Trim, []) ->
- fun({y,Y}) when Y < Trim -> throw(not_possible);
- ({y,Y}) -> {y,Y-Trim};
- ({frame_size,N}) -> N - Trim;
- (Any) -> Any
- end;
-create_map(Trim, Moves) ->
- Map0 = [{Src,Dst-Trim} || {move,{y,Src},{y,Dst}} <- Moves],
- Map = maps:from_list(Map0),
- IllegalTargets = sets:from_list([Dst || {move,_,{y,Dst}} <- Moves], [{version, 2}]),
- fun({y,Y0}) when Y0 < Trim ->
- case Map of
- #{Y0:=Y} -> {y,Y};
- #{} -> throw(not_possible)
- end;
- ({y,Y}) ->
- case sets:is_element(Y, IllegalTargets) of
- true -> throw(not_possible);
- false -> {y,Y-Trim}
- end;
- ({frame_size,N}) -> N - Trim;
- (Any) -> Any
+ {[{init_yregs,{list,Yregs}}|Is],Remap}
end.
-remap([{'%',Comment}=I|Is], Map, Acc) ->
+remap([{'%',Comment}=I0|Is], Remap) ->
case Comment of
- {var_info,Var,Type} ->
- remap(Is, Map, [{'%',{var_info,Map(Var),Type}}|Acc]);
+ {var_info,{y,_}=Var,Type} ->
+ I = {'%',{var_info,remap_arg(Var, Remap),Type}},
+ [I|remap(Is, Remap)];
_ ->
- remap(Is, Map, [I|Acc])
+ [I0|remap(Is, Remap)]
end;
-remap([{block,Bl0}|Is], Map, Acc) ->
- Bl = remap_block(Bl0, Map, []),
- remap(Is, Map, [{block,Bl}|Acc]);
-remap([{bs_get_tail,Src,Dst,Live}|Is], Map, Acc) ->
- I = {bs_get_tail,Map(Src),Map(Dst),Live},
- remap(Is, Map, [I|Acc]);
-remap([{bs_start_match4,Fail,Live,Src,Dst}|Is], Map, Acc) ->
- I = {bs_start_match4,Fail,Live,Map(Src),Map(Dst)},
- remap(Is, Map, [I|Acc]);
-remap([{bs_set_position,Src1,Src2}|Is], Map, Acc) ->
- I = {bs_set_position,Map(Src1),Map(Src2)},
- remap(Is, Map, [I|Acc]);
-remap([{call_fun,_}=I|Is], Map, Acc) ->
- remap(Is, Map, [I|Acc]);
-remap([{call,_,_}=I|Is], Map, Acc) ->
- remap(Is, Map, [I|Acc]);
-remap([{call_ext,_,_}=I|Is], Map, Acc) ->
- remap(Is, Map, [I|Acc]);
-remap([{apply,_}=I|Is], Map, Acc) ->
- remap(Is, Map, [I|Acc]);
-remap([{bif,Name,Fail,Ss,D}|Is], Map, Acc) ->
- I = {bif,Name,Fail,[Map(S) || S <- Ss],Map(D)},
- remap(Is, Map, [I|Acc]);
-remap([{gc_bif,Name,Fail,Live,Ss,D}|Is], Map, Acc) ->
- I = {gc_bif,Name,Fail,Live,[Map(S) || S <- Ss],Map(D)},
- remap(Is, Map, [I|Acc]);
-remap([{get_map_elements,Fail,M,{list,L0}}|Is], Map, Acc) ->
- L = [Map(E) || E <- L0],
- I = {get_map_elements,Fail,Map(M),{list,L}},
- remap(Is, Map, [I|Acc]);
-remap([{bs_init,Fail,Info,Live,Ss0,Dst0}|Is], Map, Acc) ->
- Ss = [Map(Src) || Src <- Ss0],
- Dst = Map(Dst0),
- I = {bs_init,Fail,Info,Live,Ss,Dst},
- remap(Is, Map, [I|Acc]);
-remap([{bs_put=Op,Fail,Info,Ss}|Is], Map, Acc) ->
- I = {Op,Fail,Info,[Map(S) || S <- Ss]},
- remap(Is, Map, [I|Acc]);
-remap([{init_yregs,{list,Yregs0}}|Is], Map, Acc) ->
- Yregs = sort([Map(Y) || Y <- Yregs0]),
+remap([{block,Bl0}|Is], Remap) ->
+ Bl = remap_block(Bl0, Remap),
+ I = {block,Bl},
+ [I|remap(Is, Remap)];
+remap([{bs_create_bin,Fail,Alloc,Live,Unit,Dst0,{list,Ss0}}|Is], Remap) ->
+ Dst = remap_arg(Dst0, Remap),
+ Ss = remap_args(Ss0, Remap),
+ I = {bs_create_bin,Fail,Alloc,Live,Unit,Dst,{list,Ss}},
+ [I|remap(Is, Remap)];
+remap([{bs_get_tail,Src,Dst,Live}|Is], Remap) ->
+ I = {bs_get_tail,remap_arg(Src, Remap),remap_arg(Dst, Remap),Live},
+ [I|remap(Is, Remap)];
+remap([{bs_start_match4,Fail,Live,Src,Dst}|Is], Remap) ->
+ I = {bs_start_match4,Fail,Live,remap_arg(Src, Remap),remap_arg(Dst, Remap)},
+ [I|remap(Is, Remap)];
+remap([{bs_set_position,Src1,Src2}|Is], Remap) ->
+ I = {bs_set_position,remap_arg(Src1, Remap),remap_arg(Src2, Remap)},
+ [I|remap(Is, Remap)];
+remap([{call_fun,_}=I|Is], Remap) ->
+ [I|remap(Is, Remap)];
+remap([{call_fun2,Tag,Arity,Func}=I|Is], Remap) ->
+ I = {call_fun2,Tag,Arity,remap_arg(Func, Remap)},
+ [I|remap(Is, Remap)];
+remap([{call,_,_}=I|Is], Remap) ->
+ [I|remap(Is, Remap)];
+remap([{call_ext,_,_}=I|Is], Remap) ->
+ [I|remap(Is, Remap)];
+remap([{apply,_}=I|Is], Remap) ->
+ [I|remap(Is, Remap)];
+remap([{bif,Name,Fail,Ss,D}|Is], Remap) ->
+ I = {bif,Name,Fail,remap_args(Ss, Remap),remap_arg(D, Remap)},
+ [I|remap(Is, Remap)];
+remap([{gc_bif,Name,Fail,Live,Ss,D}|Is], Remap) ->
+ I = {gc_bif,Name,Fail,Live,remap_args(Ss, Remap),remap_arg(D, Remap)},
+ [I|remap(Is, Remap)];
+remap([{get_map_elements,Fail,M,{list,L0}}|Is], Remap) ->
+ L = remap_args(L0, Remap),
+ I = {get_map_elements,Fail,remap_arg(M, Remap),{list,L}},
+ [I|remap(Is, Remap)];
+remap([{init_yregs,{list,Yregs0}}|Is], Remap) ->
+ Yregs = sort(remap_args(Yregs0, Remap)),
I = {init_yregs,{list,Yregs}},
- remap(Is, Map, [I|Acc]);
-remap([{make_fun2,_,_,_,_}=I|T], Map, Acc) ->
- remap(T, Map, [I|Acc]);
-remap([{make_fun3,F,Index,OldUniq,Dst0,{list,Env0}}|T], Map, Acc) ->
- Env = [Map(E) || E <- Env0],
- Dst = Map(Dst0),
+ [I|remap(Is, Remap)];
+remap([{make_fun3,F,Index,OldUniq,Dst0,{list,Env0}}|Is], Remap) ->
+ Env = remap_args(Env0, Remap),
+ Dst = remap_arg(Dst0, Remap),
I = {make_fun3,F,Index,OldUniq,Dst,{list,Env}},
- remap(T, Map, [I|Acc]);
-remap([{deallocate,N}|Is], Map, Acc) ->
- I = {deallocate,Map({frame_size,N})},
- remap(Is, Map, [I|Acc]);
-remap([{recv_marker_clear,Ref}|Is], Map, Acc) ->
- I = {recv_marker_clear,Map(Ref)},
- remap(Is, Map, [I|Acc]);
-remap([{recv_marker_reserve,Mark}|Is], Map, Acc) ->
- I = {recv_marker_reserve,Map(Mark)},
- remap(Is, Map, [I|Acc]);
-remap([{swap,Reg1,Reg2}|Is], Map, Acc) ->
- I = {swap,Map(Reg1),Map(Reg2)},
- remap(Is, Map, [I|Acc]);
-remap([{test,Name,Fail,Ss}|Is], Map, Acc) ->
- I = {test,Name,Fail,[Map(S) || S <- Ss]},
- remap(Is, Map, [I|Acc]);
-remap([{test,Name,Fail,Live,Ss,Dst}|Is], Map, Acc) ->
- I = {test,Name,Fail,Live,[Map(S) || S <- Ss],Map(Dst)},
- remap(Is, Map, [I|Acc]);
-remap([return|_]=Is, _, Acc) ->
- reverse(Acc, Is);
-remap([{line,_}=I|Is], Map, Acc) ->
- remap(Is, Map, [I|Acc]).
-
-remap_block([{set,Ds0,Ss0,Info}|Is], Map, Acc) ->
- Ds = [Map(D) || D <- Ds0],
- Ss = [Map(S) || S <- Ss0],
- remap_block(Is, Map, [{set,Ds,Ss,Info}|Acc]);
-remap_block([], _, Acc) -> reverse(Acc).
+ [I|remap(Is, Remap)];
+remap([{deallocate,N}|Is], {Trim,_}=Remap) ->
+ I = {deallocate,N-Trim},
+ [I|remap(Is, Remap)];
+remap([{recv_marker_clear,Ref}|Is], Remap) ->
+ I = {recv_marker_clear,remap_arg(Ref, Remap)},
+ [I|remap(Is, Remap)];
+remap([{recv_marker_reserve,Mark}|Is], Remap) ->
+ I = {recv_marker_reserve,remap_arg(Mark, Remap)},
+ [I|remap(Is, Remap)];
+remap([{swap,Reg1,Reg2}|Is], Remap) ->
+ I = {swap,remap_arg(Reg1, Remap),remap_arg(Reg2, Remap)},
+ [I|remap(Is, Remap)];
+remap([{test,Name,Fail,Ss}|Is], Remap) ->
+ I = {test,Name,Fail,remap_args(Ss, Remap)},
+ [I|remap(Is, Remap)];
+remap([{test,Name,Fail,Live,Ss,Dst}|Is], Remap) ->
+ I = {test,Name,Fail,Live,remap_args(Ss, Remap),remap_arg(Dst, Remap)},
+ [I|remap(Is, Remap)];
+remap([return|_]=Is, _) ->
+ Is;
+remap([{line,_}=I|Is], Remap) ->
+ [I|remap(Is, Remap)].
+
+remap_block([{set,[{x,_}]=Ds,Ss0,Info}|Is], Remap) ->
+ Ss = remap_args(Ss0, Remap),
+ [{set,Ds,Ss,Info}|remap_block(Is, Remap)];
+remap_block([{set,Ds0,Ss0,Info}|Is], Remap) ->
+ Ds = remap_args(Ds0, Remap),
+ Ss = remap_args(Ss0, Remap),
+ [{set,Ds,Ss,Info}|remap_block(Is, Remap)];
+remap_block([], _) -> [].
+
+remap_args(Args, {Trim,Map}) ->
+ [remap_arg(Arg, Trim, Map) || Arg <- Args].
+
+remap_arg(Arg, {Trim,Map}) ->
+ remap_arg(Arg, Trim, Map).
+
+remap_arg(Arg, Trim, Map) ->
+ case Arg of
+ {y,Y} when Y < Trim ->
+ {y,map_get(Y, Map)};
+ {y,Y} ->
+ {y,Y-Trim};
+ #tr{r={y,Y},t=Type} when Y < Trim ->
+ #tr{r={y,map_get(Y, Map)},t=Type};
+ #tr{r={y,Y},t=Type} ->
+ #tr{r={y,Y-Trim},t=Type};
+ Other ->
+ Other
+ end.
%% safe_labels([Instruction], Accumulator) -> gb_set()
%% Build a gb_set of safe labels. The code at a safe
@@ -350,6 +362,8 @@ is_safe_label([{try_case_end,{Tag,_}}|_]) ->
Tag =/= y;
is_safe_label([if_end|_]) ->
true;
+is_safe_label([{badrecord,{Tag,_}}|_]) ->
+ Tag =/= y;
is_safe_label([{block,Bl}|Is]) ->
is_safe_label_block(Bl) andalso is_safe_label(Is);
is_safe_label([{call_ext,_,{extfunc,M,F,A}}|_]) ->
@@ -357,7 +371,8 @@ is_safe_label([{call_ext,_,{extfunc,M,F,A}}|_]) ->
is_safe_label(_) -> false.
is_safe_label_block([{set,Ds,Ss,_}|Is]) ->
- IsYreg = fun({y,_}) -> true;
+ IsYreg = fun(#tr{r={y,_}}) -> true;
+ ({y,_}) -> true;
(_) -> false
end,
%% This instruction is safe if the instruction
@@ -370,176 +385,210 @@ is_safe_label_block([]) -> true.
%% [{kill,Reg} | {live,Reg} | {dead,Reg}]
%% Figure out the layout of the stack frame.
-frame_layout(Is, Kills, #st{safe=Safe}) ->
- N = frame_size(Is, Safe),
- IsKilled = fun(R) -> is_not_used(R, Is) end,
- {N,frame_layout_1(Kills, 0, N, IsKilled, [])}.
-
-frame_layout_1([{kill,{y,Y}}=I|Ks], Y, N, IsKilled, Acc) ->
- frame_layout_1(Ks, Y+1, N, IsKilled, [I|Acc]);
-frame_layout_1(Ks, Y, N, IsKilled, Acc) when Y < N ->
- R = {y,Y},
- I = case IsKilled(R) of
- false -> {live,R};
- true -> {dead,R}
- end,
- frame_layout_1(Ks, Y+1, N, IsKilled, [I|Acc]);
-frame_layout_1([], Y, Y, _, Acc) ->
- frame_layout_2(Acc).
-
-frame_layout_2([{live,_}|Is]) -> frame_layout_2(Is);
-frame_layout_2(Is) -> reverse(Is).
-
-%% frame_size([Instruction], SafeLabels) -> FrameSize
-%% Find out the frame size by looking at the code that follows.
+frame_layout(N, Killed, {U,_}) ->
+ Dead0 = [{y,R} || R <- seq(0, N - 1)],
+ Dead = ordsets:subtract(Dead0, ordsets:union(U, Killed)),
+ Is = [[{R,{live,R}} || R <- U],
+ [{R,{dead,R}} || R <- Dead],
+ [{R,{kill,R}} || R <- Killed]],
+ [I || {_,I} <- lists:merge(Is)].
+
+%% usage([Instruction], SafeLabels) -> {FrameSize,[UsedYRegs]}
+%% Find out the frame size and usage information by looking at the
+%% code that follows.
%%
%% Implicitly, also check that the instructions are a straight
%% sequence of code that ends in a return. Any branches are
%% to safe labels (i.e., the code at those labels don't depend
%% on the contents of any Y register).
-frame_size([{'%',_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{block,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{call_fun,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{call,_,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{call_ext,_,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{apply,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{bif,_,{f,L},_,_}|Is], Safe) ->
- frame_size_branch(L, Is, Safe);
-frame_size([{gc_bif,_,{f,L},_,_,_}|Is], Safe) ->
- frame_size_branch(L, Is, Safe);
-frame_size([{test,_,{f,L},_}|Is], Safe) ->
- frame_size_branch(L, Is, Safe);
-frame_size([{test,_,{f,L},_,_,_}|Is], Safe) ->
- frame_size_branch(L, Is, Safe);
-frame_size([{bs_init,{f,L},_,_,_,_}|Is], Safe) ->
- frame_size_branch(L, Is, Safe);
-frame_size([{bs_put,{f,L},_,_}|Is], Safe) ->
- frame_size_branch(L, Is, Safe);
-frame_size([{init_yregs,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{make_fun2,_,_,_,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{make_fun3,_,_,_,_,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{recv_marker_clear,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{recv_marker_reserve,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{get_map_elements,{f,L},_,_}|Is], Safe) ->
- frame_size_branch(L, Is, Safe);
-frame_size([{deallocate,N}|_], _) ->
- N;
-frame_size([{line,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{bs_start_match4,Fail,_,_,_}|Is], Safe) ->
- case Fail of
- {f,L} -> frame_size_branch(L, Is, Safe);
- _ -> frame_size(Is, Safe)
- end;
-frame_size([{bs_set_position,_,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{bs_get_tail,_,_,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size([{swap,_,_}|Is], Safe) ->
- frame_size(Is, Safe);
-frame_size(_, _) -> throw(not_possible).
-
-frame_size_branch(0, Is, Safe) ->
- frame_size(Is, Safe);
-frame_size_branch(L, Is, Safe) ->
- case sets:is_element(L, Safe) of
- false -> throw(not_possible);
- true -> frame_size(Is, Safe)
+usage(Is0, St) ->
+ Is = usage_1(Is0, []),
+ do_usage(Is, St).
+
+usage_1([{label,_}|_], Acc) ->
+ Acc;
+usage_1([I|Is], Acc) ->
+ usage_1(Is, [I|Acc]);
+usage_1([], Acc) ->
+ Acc.
+
+do_usage(Is0, #st{safe=Safe}) ->
+ case Is0 of
+ [return,{deallocate,N}|Is] ->
+ Regs = [],
+ case do_usage(Is, Safe, Regs, [], []) of
+ none ->
+ none;
+ Us ->
+ {N,Us}
+ end;
+ _ ->
+ none
end.
-%% is_not_used(Y, [Instruction]) -> true|false.
-%% Test whether the value of Y is unused in the instruction sequence.
-%% Return true if the value of Y is not used, and false if it is used.
-%%
-%% This function handles the same instructions as frame_size/2. It
-%% assumes that any labels in the instructions are safe labels.
-
-is_not_used(Y, [{'%',_}|Is]) ->
- is_not_used(Y, Is);
-is_not_used(Y, [{apply,_}|Is]) ->
- is_not_used(Y, Is);
-is_not_used(Y, [{bif,_,{f,_},Ss,Dst}|Is]) ->
- is_not_used_ss_dst(Y, Ss, Dst, Is);
-is_not_used(Y, [{block,Bl}|Is]) ->
- case is_not_used_block(Y, Bl) of
- used -> false;
- killed -> true;
- transparent -> is_not_used(Y, Is)
+do_usage([{'%',_}|Is], Safe, Regs, Ns, Acc) ->
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{apply,_}|Is], Safe, Regs, Ns, Acc) ->
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{block,Blk}|Is], Safe, Regs0, Ns0, Acc) ->
+ {Regs,Ns} = U = do_usage_blk(Blk, Regs0, Ns0),
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{bs_create_bin,Fail,_,_,_,Dst,{list,Args}}|Is], Safe, Regs0, Ns0, Acc) ->
+ case is_safe_branch(Fail, Safe) of
+ true ->
+ Regs1 = ordsets:del_element(Dst, Regs0),
+ Regs = ordsets:union(Regs1, yregs(Args)),
+ Ns = ordsets:union(yregs([Dst]), Ns0),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+ false ->
+ none
end;
-is_not_used(Y, [{bs_get_tail,Src,Dst,_}|Is]) ->
- is_not_used_ss_dst(Y, [Src], Dst, Is);
-is_not_used(Y, [{bs_init,_,_,_,Ss,Dst}|Is]) ->
- is_not_used_ss_dst(Y, Ss, Dst, Is);
-is_not_used(Y, [{bs_put,{f,_},_,Ss}|Is]) ->
- not member(Y, Ss) andalso is_not_used(Y, Is);
-is_not_used(Y, [{bs_start_match4,_Fail,_Live,Src,Dst}|Is]) ->
- Y =/= Src andalso Y =/= Dst andalso
- is_not_used(Y, Is);
-is_not_used(Y, [{bs_set_position,Src1,Src2}|Is]) ->
- Y =/= Src1 andalso Y =/= Src2 andalso
- is_not_used(Y, Is);
-is_not_used(Y, [{call,_,_}|Is]) ->
- is_not_used(Y, Is);
-is_not_used(Y, [{call_ext,_,_}|Is]) ->
- is_not_used(Y, Is);
-is_not_used(Y, [{call_fun,_}|Is]) ->
- is_not_used(Y, Is);
-is_not_used(_Y, [{deallocate,_}|_]) ->
- true;
-is_not_used(Y, [{gc_bif,_,{f,_},_Live,Ss,Dst}|Is]) ->
- is_not_used_ss_dst(Y, Ss, Dst, Is);
-is_not_used(Y, [{get_map_elements,{f,_},S,{list,List}}|Is]) ->
- {Ss,Ds} = beam_utils:split_even(List),
- case member(Y, [S|Ss]) of
- true ->
- false;
- false ->
- member(Y, Ds) orelse is_not_used(Y, Is)
+do_usage([{bs_get_tail,Src,Dst,_}|Is], Safe, Regs0, Ns0, Acc) ->
+ Regs1 = ordsets:del_element(Dst, Regs0),
+ Regs = ordsets:union(Regs1, yregs([Src])),
+ Ns = ordsets:union(yregs([Dst]), Ns0),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{bs_set_position,Src1,Src2}|Is], Safe, Regs0, Ns, Acc) ->
+ Regs = ordsets:union(Regs0, yregs([Src1,Src2])),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{bs_start_match4,Fail,_Live,Src,Dst}|Is], Safe, Regs0, Ns, Acc) ->
+ case (Fail =:= {atom,no_fail} orelse
+ Fail =:= {atom,resume} orelse
+ is_safe_branch(Fail, Safe)) of
+ true ->
+ Regs = ordsets:union(Regs0, yregs([Src,Dst])),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+ false ->
+ none
end;
-is_not_used(Y, [{init_yregs,{list,Yregs}}|Is]) ->
- member(Y, Yregs) orelse is_not_used(Y, Is);
-is_not_used(Y, [{line,_}|Is]) ->
- is_not_used(Y, Is);
-is_not_used(Y, [{make_fun2,_,_,_,_}|Is]) ->
- is_not_used(Y, Is);
-is_not_used(Y, [{make_fun3,_,_,_,Dst,{list,Env}}|Is]) ->
- is_not_used_ss_dst(Y, Env, Dst, Is);
-is_not_used(Y, [{recv_marker_clear,Ref}|Is]) ->
- Y =/= Ref andalso is_not_used(Y, Is);
-is_not_used(Y, [{recv_marker_reserve,Dst}|Is]) ->
- Y =/= Dst andalso is_not_used(Y, Is);
-is_not_used(Y, [{swap,Reg1,Reg2}|Is]) ->
- Y =/= Reg1 andalso Y =/= Reg2 andalso is_not_used(Y, Is);
-is_not_used(Y, [{test,_,_,Ss}|Is]) ->
- not member(Y, Ss) andalso is_not_used(Y, Is);
-is_not_used(Y, [{test,_Op,{f,_},_Live,Ss,Dst}|Is]) ->
- is_not_used_ss_dst(Y, Ss, Dst, Is).
-
-is_not_used_block(Y, [{set,Ds,Ss,_}|Is]) ->
- case member(Y, Ss) of
+do_usage([{call,_,_}|Is], Safe, Regs, Ns, Acc) ->
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{call_ext,_,_}|Is], Safe, Regs, Ns, Acc) ->
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{call_fun,_}|Is], Safe, Regs, Ns, Acc) ->
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{call_fun2,_,_,Ss}|Is], Safe, Regs0, Ns, Acc) ->
+ Regs = ordsets:union(Regs0, yregs([Ss])),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{bif,_,Fail,Ss,Dst}|Is], Safe, Regs0, Ns0, Acc) ->
+ case is_safe_branch(Fail, Safe) of
true ->
- used;
+ Regs1 = ordsets:del_element(Dst, Regs0),
+ Regs = ordsets:union(Regs1, yregs(Ss)),
+ Ns = ordsets:union(yregs([Dst]), Ns0),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
false ->
- case member(Y, Ds) of
- true ->
- killed;
- false ->
- is_not_used_block(Y, Is)
- end
+ none
end;
-is_not_used_block(_Y, []) -> transparent.
-
-is_not_used_ss_dst(Y, Ss, Dst, Is) ->
- not member(Y, Ss) andalso (Y =:= Dst orelse is_not_used(Y, Is)).
+do_usage([{gc_bif,_,Fail,_,Ss,Dst}|Is], Safe, Regs0, Ns0, Acc) ->
+ case is_safe_branch(Fail, Safe) of
+ true ->
+ Regs1 = ordsets:del_element(Dst, Regs0),
+ Regs = ordsets:union(Regs1, yregs(Ss)),
+ Ns = ordsets:union(yregs([Dst]), Ns0),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+ false ->
+ none
+ end;
+do_usage([{get_map_elements,Fail,S,{list,List}}|Is], Safe, Regs0, Ns0, Acc) ->
+ case is_safe_branch(Fail, Safe) of
+ true ->
+ {Ss,Ds1} = beam_utils:split_even(List),
+ Ds = yregs(Ds1),
+ Regs1 = ordsets:subtract(Regs0, Ds),
+ Regs = ordsets:union(Regs1, yregs([S|Ss])),
+ Ns = ordsets:union(Ns0, Ds),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+ false ->
+ none
+ end;
+do_usage([{init_yregs,{list,Ds}}|Is], Safe, Regs0, Ns0, Acc) ->
+ Regs = ordsets:subtract(Regs0, Ds),
+ Ns = ordsets:union(Ns0, Ds),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{make_fun3,_,_,_,Dst,{list,Ss}}|Is], Safe, Regs0, Ns0, Acc) ->
+ Regs1 = ordsets:del_element(Dst, Regs0),
+ Regs = ordsets:union(Regs1, yregs(Ss)),
+ Ns = ordsets:union(yregs([Dst]), Ns0),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{line,_}|Is], Safe, Regs, Ns, Acc) ->
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{recv_marker_clear,Src}|Is], Safe, Regs0, Ns, Acc) ->
+ Regs = ordsets:union(Regs0, yregs([Src])),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{recv_marker_reserve,Src}|Is], Safe, Regs0, Ns, Acc) ->
+ Regs = ordsets:union(Regs0, yregs([Src])),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{swap,R1,R2}|Is], Safe, Regs0, Ns0, Acc) ->
+ Ds = yregs([R1,R2]),
+ Regs = ordsets:union(Regs0, Ds),
+ Ns = ordsets:union(Ns0, Ds),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{test,_,Fail,Ss}|Is], Safe, Regs0, Ns, Acc) ->
+ case is_safe_branch(Fail, Safe) of
+ true ->
+ Regs = ordsets:union(Regs0, yregs(Ss)),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+ false ->
+ none
+ end;
+do_usage([{test,_,Fail,_,Ss,Dst}|Is], Safe, Regs0, Ns0, Acc) ->
+ case is_safe_branch(Fail, Safe) of
+ true ->
+ Regs1 = ordsets:del_element(Dst, Regs0),
+ Regs = ordsets:union(Regs1, yregs(Ss)),
+ Ns = ordsets:union(yregs([Dst]), Ns0),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+ false ->
+ none
+ end;
+do_usage([_I|_], _, _, _, _) ->
+ none;
+do_usage([], _Safe, _Regs, _Ns, Acc) -> Acc.
+
+do_usage_blk([{set,Ds0,Ss,_}|Is], Regs0, Ns0) ->
+ Ds = yregs(Ds0),
+ {Regs1,Ns1} = do_usage_blk(Is, Regs0, Ns0),
+ Regs2 = ordsets:subtract(Regs1, Ds),
+ Regs = ordsets:union(Regs2, yregs(Ss)),
+ Ns = ordsets:union(Ns1, Ds),
+ {Regs,Ns};
+do_usage_blk([], Regs, Ns) -> {Regs,Ns}.
+
+is_safe_branch({f,0}, _Safe) ->
+ true;
+is_safe_branch({f,L}, Safe) ->
+ sets:is_element(L, Safe).
+
+yregs(Rs) ->
+ ordsets:from_list(yregs_1(Rs)).
+
+yregs_1([{y,_}=Y|Rs]) ->
+ [Y|yregs_1(Rs)];
+yregs_1([{tr,{y,_}=Y,_}|Rs]) ->
+ [Y|yregs_1(Rs)];
+yregs_1([_|Rs]) ->
+ yregs_1(Rs);
+yregs_1([]) -> [].
diff --git a/lib/compiler/src/beam_types.erl b/lib/compiler/src/beam_types.erl
index 730af42424..ce03aff7d3 100644
--- a/lib/compiler/src/beam_types.erl
+++ b/lib/compiler/src/beam_types.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2019-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2019-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,6 +49,8 @@
-export([limit_depth/1]).
+-export([decode_ext/1, encode_ext/1]).
+
%% This is exported to help catch errors in property test generators and is not
%% meant to be used outside of test suites.
-export([verified_type/1]).
@@ -615,6 +617,8 @@ make_integer(Min, Max) when is_integer(Min), is_integer(Max), Min =< Max ->
limit_depth(Type) ->
limit_depth(Type, ?MAX_TYPE_DEPTH).
+-spec limit_depth(type(), non_neg_integer()) -> type().
+
limit_depth(#t_cons{}=T, Depth) ->
limit_depth_list(T, Depth);
limit_depth(#t_list{}=T, Depth) ->
@@ -723,20 +727,9 @@ glb(#t_bitstring{size_unit=U1}, #t_bitstring{size_unit=U2}) ->
glb(#t_bitstring{size_unit=UnitA}=T, #t_bs_matchable{tail_unit=UnitB}) ->
Unit = UnitA * UnitB div gcd(UnitA, UnitB),
T#t_bitstring{size_unit=Unit};
-glb(#t_bs_context{tail_unit=UnitA,slots=SlotCountA,valid=ValidSlotsA},
- #t_bs_context{tail_unit=UnitB,slots=SlotCountB,valid=ValidSlotsB}) ->
- CommonSlotMask = (1 bsl min(SlotCountA, SlotCountB)) - 1,
- CommonSlotsA = ValidSlotsA band CommonSlotMask,
- CommonSlotsB = ValidSlotsB band CommonSlotMask,
+glb(#t_bs_context{tail_unit=UnitA}, #t_bs_context{tail_unit=UnitB}) ->
Unit = UnitA * UnitB div gcd(UnitA, UnitB),
- if
- CommonSlotsA =:= CommonSlotsB ->
- #t_bs_context{tail_unit=Unit,
- slots=max(SlotCountA, SlotCountB),
- valid=ValidSlotsA bor ValidSlotsB};
- CommonSlotsA =/= CommonSlotsB ->
- none
- end;
+ #t_bs_context{tail_unit=Unit};
glb(#t_bs_context{tail_unit=UnitA}=T, #t_bs_matchable{tail_unit=UnitB}) ->
Unit = UnitA * UnitB div gcd(UnitA, UnitB),
T#t_bs_context{tail_unit=Unit};
@@ -773,12 +766,17 @@ glb(#t_float{elements={MinA,MaxA}}, #t_float{elements={MinB,MaxB}})
MinB >= MinA, MinB =< MaxA ->
true = MinA =< MaxA andalso MinB =< MaxB, %Assertion.
#t_float{elements={max(MinA, MinB),min(MaxA, MaxB)}};
-glb(#t_fun{arity=Same,type=TypeA}, #t_fun{arity=Same,type=TypeB}=T) ->
- T#t_fun{type=meet(TypeA, TypeB)};
-glb(#t_fun{arity=any,type=TypeA}, #t_fun{type=TypeB}=T) ->
- T#t_fun{type=meet(TypeA, TypeB)};
-glb(#t_fun{type=TypeA}=T, #t_fun{arity=any,type=TypeB}) ->
+glb(#t_fun{arity=SameArity,target=SameTarget,type=TypeA},
+ #t_fun{arity=SameArity,target=SameTarget,type=TypeB}=T) ->
T#t_fun{type=meet(TypeA, TypeB)};
+glb(#t_fun{target=TargetA}=A, #t_fun{target=any}=B) when TargetA =/= any ->
+ glb(A, B#t_fun{target=TargetA});
+glb(#t_fun{target=any}=A, #t_fun{target=TargetB}=B) when TargetB =/= any ->
+ glb(A#t_fun{target=TargetB}, B);
+glb(#t_fun{arity=any}=A, #t_fun{arity=ArityB}=B) when ArityB =/= any->
+ glb(A#t_fun{arity=ArityB}, B);
+glb(#t_fun{arity=ArityA}=A, #t_fun{arity=any}=B) when ArityA =/= any ->
+ glb(A, B#t_fun{arity=ArityA});
glb(#t_integer{elements={_,_}}=T, #t_integer{elements=any}) ->
T;
glb(#t_integer{elements=any}, #t_integer{elements={_,_}}=T) ->
@@ -899,11 +897,8 @@ lub(#t_bitstring{size_unit=U1}, #t_bs_context{tail_unit=U2}) ->
#t_bs_matchable{tail_unit=gcd(U1, U2)};
lub(#t_bitstring{size_unit=UnitA}, #t_bs_matchable{tail_unit=UnitB}) ->
lub_bs_matchable(UnitA, UnitB);
-lub(#t_bs_context{tail_unit=UnitA,slots=SlotsA,valid=ValidA},
- #t_bs_context{tail_unit=UnitB,slots=SlotsB,valid=ValidB}) ->
- #t_bs_context{tail_unit=gcd(UnitA, UnitB),
- slots=min(SlotsA, SlotsB),
- valid=ValidA band ValidB};
+lub(#t_bs_context{tail_unit=UnitA}, #t_bs_context{tail_unit=UnitB}) ->
+ #t_bs_context{tail_unit=gcd(UnitA, UnitB)};
lub(#t_bs_context{tail_unit=U1}, #t_bitstring{size_unit=U2}) ->
#t_bs_matchable{tail_unit=gcd(U1, U2)};
lub(#t_bs_context{tail_unit=UnitA}, #t_bs_matchable{tail_unit=UnitB}) ->
@@ -932,8 +927,11 @@ lub(#t_float{}, #t_integer{}) ->
number;
lub(#t_float{}, number) ->
number;
-lub(#t_fun{arity=Same,type=TypeA}, #t_fun{arity=Same,type=TypeB}) ->
- #t_fun{arity=Same,type=join(TypeA, TypeB)};
+lub(#t_fun{arity=SameArity,target=SameTarget,type=TypeA},
+ #t_fun{arity=SameArity,target=SameTarget,type=TypeB}) ->
+ #t_fun{arity=SameArity,target=SameTarget,type=join(TypeA, TypeB)};
+lub(#t_fun{arity=SameArity,type=TypeA}, #t_fun{arity=SameArity,type=TypeB}) ->
+ #t_fun{arity=SameArity,type=join(TypeA, TypeB)};
lub(#t_fun{type=TypeA}, #t_fun{type=TypeB}) ->
#t_fun{type=join(TypeA, TypeB)};
lub(#t_integer{elements={MinA,MaxA}},
@@ -1109,7 +1107,18 @@ verified_normal_type(#t_cons{type=Type,terminator=Term}=T) ->
_ = verified_type(Type),
_ = verified_type(Term),
T;
-verified_normal_type(#t_fun{arity=Arity,type=ReturnType}=T)
+verified_normal_type(#t_fun{arity=Arity,
+ target={Name,TotalArity},
+ type=ReturnType}=T)
+ when is_integer(Arity),
+ is_atom(Name),
+ is_integer(TotalArity),
+ TotalArity >= Arity ->
+ _ = verified_type(ReturnType),
+ T;
+verified_normal_type(#t_fun{arity=Arity,
+ target=any,
+ type=ReturnType}=T)
when Arity =:= any; is_integer(Arity) ->
_ = verified_type(ReturnType),
T;
@@ -1125,6 +1134,9 @@ verified_normal_type(#t_list{type=Type,terminator=Term}=T) ->
verified_normal_type(#t_map{}=T) -> T;
verified_normal_type(nil=T) -> T;
verified_normal_type(number=T) -> T;
+verified_normal_type(pid=T) -> T;
+verified_normal_type(port=T) -> T;
+verified_normal_type(reference=T) -> T;
verified_normal_type(#t_tuple{size=Size,elements=Es}=T) ->
%% All known elements must have a valid index and type (which may be a
%% union). 'any' is prohibited since it's implicit and should never be
@@ -1137,3 +1149,93 @@ verified_normal_type(#t_tuple{size=Size,elements=Es}=T) ->
verified_type(Element)
end, [], Es),
T.
+
+%%%
+%%% External type format
+%%%
+%%% This is a stripped-down version of our internal format, focusing solely on
+%%% primary types and unions thereof. The idea is to help the JIT skip minor
+%%% details inside instructions when we know they're pointless, such as
+%%% checking whether the source of `is_tagged_tuple` is boxed, or reducing an
+%%% equality check to a single machine compare instruction when we know that
+%%% both arguments are immediates.
+%%%
+
+-define(BEAM_TYPE_ATOM, (1 bsl 0)).
+-define(BEAM_TYPE_BITSTRING, (1 bsl 1)).
+-define(BEAM_TYPE_BS_MATCHSTATE, (1 bsl 2)).
+-define(BEAM_TYPE_CONS, (1 bsl 3)).
+-define(BEAM_TYPE_FLOAT, (1 bsl 4)).
+-define(BEAM_TYPE_FUN, (1 bsl 5)).
+-define(BEAM_TYPE_INTEGER, (1 bsl 6)).
+-define(BEAM_TYPE_MAP, (1 bsl 7)).
+-define(BEAM_TYPE_NIL, (1 bsl 8)).
+-define(BEAM_TYPE_PID, (1 bsl 9)).
+-define(BEAM_TYPE_PORT, (1 bsl 10)).
+-define(BEAM_TYPE_REFERENCE, (1 bsl 11)).
+-define(BEAM_TYPE_TUPLE, (1 bsl 12)).
+
+ext_type_mapping() ->
+ [{?BEAM_TYPE_ATOM, #t_atom{}},
+ {?BEAM_TYPE_BITSTRING, #t_bitstring{}},
+ {?BEAM_TYPE_BS_MATCHSTATE, #t_bs_context{}},
+ {?BEAM_TYPE_CONS, #t_cons{}},
+ {?BEAM_TYPE_FLOAT, #t_float{}},
+ {?BEAM_TYPE_FUN, #t_fun{}},
+ {?BEAM_TYPE_INTEGER, #t_integer{}},
+ {?BEAM_TYPE_MAP, #t_map{}},
+ {?BEAM_TYPE_NIL, nil},
+ {?BEAM_TYPE_PID, pid},
+ {?BEAM_TYPE_PORT, port},
+ {?BEAM_TYPE_REFERENCE, reference},
+ {?BEAM_TYPE_TUPLE, #t_tuple{}}].
+
+-spec decode_ext(binary()) -> type().
+decode_ext(<<TypeBits:16/big,Min:64,Max:64>>) ->
+ Res = foldl(fun({Id, Type}, Acc) ->
+ decode_ext_bits(TypeBits, Id, Type, Acc)
+ end, none, ext_type_mapping()),
+ {Res,Min,Max}.
+
+decode_ext_bits(Input, TypeBit, Type, Acc) ->
+ case Input band TypeBit of
+ 0 -> Acc;
+ _ -> join(Type, Acc)
+ end.
+
+-spec encode_ext(type()) -> binary().
+encode_ext(Input) ->
+ TypeBits = foldl(fun({Id, Type}, Acc) ->
+ encode_ext_bits(Input, Id, Type, Acc)
+ end, 0, ext_type_mapping()),
+ case get_integer_range(Input) of
+ none ->
+ <<TypeBits:16/big,0:64,-1:64>>;
+ {Min,Max} ->
+ <<TypeBits:16/big,Min:64,Max:64>>
+ end.
+
+encode_ext_bits(Input, TypeBit, Type, Acc) ->
+ case meet(Input, Type) of
+ none -> Acc;
+ _ -> Acc bor TypeBit
+ end.
+
+get_integer_range(#t_integer{elements={Min,Max}}) ->
+ case is_small(Min) andalso is_small(Max) of
+ true ->
+ {Min,Max};
+ false ->
+ %% Not an integer with range, or at least one of the
+ %% endpoints is a bignum.
+ none
+ end;
+get_integer_range(#t_union{number=N}) ->
+ get_integer_range(N);
+get_integer_range(_) -> none.
+
+%% Test whether the number is a small on a 64-bit machine.
+%% (Normally the compiler doesn't know/doesn't care whether something is
+%% bignum, but because the type representation is versioned this is safe.)
+is_small(N) ->
+ -(1 bsl 59) =< N andalso N =< (1 bsl 59) - 1.
diff --git a/lib/compiler/src/beam_types.hrl b/lib/compiler/src/beam_types.hrl
index 58ffd18110..18f7e29074 100644
--- a/lib/compiler/src/beam_types.hrl
+++ b/lib/compiler/src/beam_types.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2019-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2019-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,6 +18,9 @@
%% %CopyrightEnd%
%%
+%% Type version, must be bumped whenever the external type format changes.
+-define(BEAM_TYPES_VERSION, 1).
+
%% Common term types for passes operating on beam SSA and assembly. Helper
%% functions for wrangling these can be found in beam_types.erl
%%
@@ -37,6 +40,9 @@
%% - #t_list{} Any list.
%% -- #t_cons{} Cons (nonempty list).
%% -- nil The empty list.
+%% - pid
+%% - port
+%% - reference
%% - #t_tuple{} Tuple.
%%
%% none No type (bottom element).
@@ -75,15 +81,15 @@
%% [1] https://en.wikipedia.org/wiki/Lattice_(order)#General_lattice
-define(ATOM_SET_SIZE, 5).
+-define(MAX_FUNC_ARGS, 255).
-record(t_atom, {elements=any :: 'any' | ordsets:ordset(atom())}).
-record(t_bitstring, {size_unit=1 :: pos_integer()}).
--record(t_bs_context, {tail_unit=1 :: pos_integer(),
- slots=0 :: non_neg_integer(),
- valid=0 :: non_neg_integer()}).
--record(t_bs_matchable, {tail_unit=1}).
+-record(t_bs_context, {tail_unit=1 :: pos_integer()}).
+-record(t_bs_matchable, {tail_unit=1 :: pos_integer()}).
-record(t_float, {elements=any :: 'any' | {float(),float()}}).
-record(t_fun, {arity=any :: arity() | 'any',
+ target=any :: {atom(), non_neg_integer()} | 'any',
type=any :: type() }).
-record(t_integer, {elements=any :: 'any' | {integer(),integer()}}).
@@ -133,6 +139,9 @@
#t_fun{} |
#t_list{} | #t_cons{} | nil |
#t_map{} |
+ pid |
+ port |
+ reference |
#t_tuple{}.
-type record_key() :: {Arity :: integer(), Tag :: normal_type() }.
diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl
index 19cd6282ca..904e1f3e82 100644
--- a/lib/compiler/src/beam_utils.erl
+++ b/lib/compiler/src/beam_utils.erl
@@ -21,7 +21,7 @@
%%
-module(beam_utils).
--export([replace_labels/4,is_pure_test/1,split_even/1]).
+-export([replace_labels/4,split_even/1]).
-export_type([code_index/0,module_code/0,instruction/0]).
@@ -39,11 +39,6 @@
-type module_code() ::
{module(),[_],[_],[int_function()],pos_integer()}.
-%% Internal types.
--type fail() :: beam_asm:fail() | 'fail'.
--type test() :: {'test',atom(),fail(),[beam_asm:src()]} |
- {'test',atom(),fail(),integer(),list(),beam_asm:reg()}.
-
%% replace_labels(FunctionIs, Tail, ReplaceDb, Fallback) -> FunctionIs.
%% Replace all labels in instructions according to the ReplaceDb.
%% If label is not found the Fallback is called with the label to
@@ -56,28 +51,6 @@
replace_labels(Is, Acc, D, Fb) ->
replace_labels_1(Is, Acc, D, Fb).
-%% is_pure_test({test,Op,Fail,Ops}) -> true|false.
-%% Return 'true' if the test instruction does not modify any
-%% registers and/or bit syntax matching state.
-%%
-
--spec is_pure_test(test()) -> boolean().
-
-is_pure_test({test,is_eq,_,[_,_]}) -> true;
-is_pure_test({test,is_ne,_,[_,_]}) -> true;
-is_pure_test({test,is_eq_exact,_,[_,_]}) -> true;
-is_pure_test({test,is_ne_exact,_,[_,_]}) -> true;
-is_pure_test({test,is_ge,_,[_,_]}) -> true;
-is_pure_test({test,is_lt,_,[_,_]}) -> true;
-is_pure_test({test,is_nonempty_list,_,[_]}) -> true;
-is_pure_test({test,is_tagged_tuple,_,[_,_,_]}) -> true;
-is_pure_test({test,test_arity,_,[_,_]}) -> true;
-is_pure_test({test,has_map_fields,_,[_|_]}) -> true;
-is_pure_test({test,is_bitstr,_,[_]}) -> true;
-is_pure_test({test,is_function2,_,[_,_]}) -> true;
-is_pure_test({test,Op,_,Ops}) ->
- erl_internal:new_type_test(Op, length(Ops)).
-
%% split_even/1
%% [1,2,3,4,5,6] -> {[1,3,5],[2,4,6]}
@@ -120,10 +93,16 @@ replace_labels_1([{gc_bif,Name,{f,Lbl},Live,As,R}|Is], Acc, D, Fb) when Lbl =/=
replace_labels_1(Is, [{gc_bif,Name,{f,label(Lbl, D, Fb)},Live,As,R}|Acc], D, Fb);
replace_labels_1([{call,Ar,{f,Lbl}}|Is], Acc, D, Fb) ->
replace_labels_1(Is, [{call,Ar,{f,label(Lbl, D, Fb)}}|Acc], D, Fb);
+replace_labels_1([{call_fun2,{f,Lbl},Ar,Func}|Is], Acc, D, Fb) ->
+ replace_labels_1(Is, [{call_fun2,{f,label(Lbl, D, Fb)},Ar,Func}|Acc], D, Fb);
replace_labels_1([{make_fun2,{f,Lbl},U1,U2,U3}|Is], Acc, D, Fb) ->
replace_labels_1(Is, [{make_fun2,{f,label(Lbl, D, Fb)},U1,U2,U3}|Acc], D, Fb);
replace_labels_1([{make_fun3,{f,Lbl},U1,U2,U3,U4}|Is], Acc, D, Fb) ->
replace_labels_1(Is, [{make_fun3,{f,label(Lbl, D, Fb)},U1,U2,U3,U4}|Acc], D, Fb);
+replace_labels_1([{bs_create_bin,{f,Lbl},Alloc,Live,Unit,Dst,{list,List}}|Is], Acc, D, Fb)
+ when Lbl =/= 0 ->
+ replace_labels_1(Is, [{bs_create_bin,{f,label(Lbl, D, Fb)},
+ Alloc,Live,Unit,Dst,{list,List}}|Acc], D, Fb);
replace_labels_1([{bs_init,{f,Lbl},Info,Live,Ss,Dst}|Is], Acc, D, Fb) when Lbl =/= 0 ->
replace_labels_1(Is, [{bs_init,{f,label(Lbl, D, Fb)},Info,Live,Ss,Dst}|Acc], D, Fb);
replace_labels_1([{bs_put,{f,Lbl},Info,Ss}|Is], Acc, D, Fb) when Lbl =/= 0 ->
diff --git a/lib/compiler/src/beam_validator.erl b/lib/compiler/src/beam_validator.erl
index d61722e0b4..604d4b641c 100644
--- a/lib/compiler/src/beam_validator.erl
+++ b/lib/compiler/src/beam_validator.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
-module(beam_validator).
--include("beam_types.hrl").
+-include("beam_asm.hrl").
-define(UNICODE_MAX, (16#10FFFF)).
@@ -126,24 +126,24 @@ validate_0([{function, Name, Arity, Entry, Code} | Fs], Module, Level, Ft) ->
-record(t_abstract, {kind}).
-%% The types are the same as in 'beam_types.hrl', with the addition of
-%% #t_abstract{} that describes tuples under construction, match context
-%% positions, and so on.
--type validator_type() :: #t_abstract{} | type().
+%% The types are the same as in 'beam_types.hrl', with the addition of:
+%%
+%% * `#t_abstract{}` which describes tuples under construction, match context
+%% positions, and so on.
+%% * `(fun(values()) -> type())` that defers figuring out the type until it's
+%% actually used. Mainly used to coax more type information out of
+%% `get_tuple_element` where a test on one element (e.g. record tag) may
+%% affect the type of another.
+-type validator_type() :: #t_abstract{} | fun((values()) -> type()) | type().
-record(value_ref, {id :: index()}).
-record(value, {op :: term(), args :: [argument()], type :: validator_type()}).
--type argument() :: #value_ref{} | literal().
+-type argument() :: #value_ref{} | beam_literal().
+-type values() :: #{ #value_ref{} => #value{} }.
-type index() :: non_neg_integer().
--type literal() :: {atom, [] | atom()} |
- {float, [] | float()} |
- {integer, [] | integer()} |
- {literal, term()} |
- nil.
-
%% Register tags describe the state of the register rather than the value they
%% contain (if any).
%%
@@ -173,7 +173,7 @@ validate_0([{function, Name, Arity, Entry, Code} | Fs], Module, Level, Ft) ->
%% Emulation state
-record(st,
{%% All known values.
- vs=#{} :: #{ #value_ref{} => #value{} },
+ vs=#{} :: values(),
%% Register states.
xs=#{} :: x_regs(),
ys=#{} :: y_regs(),
@@ -235,7 +235,7 @@ validate_0([{function, Name, Arity, Entry, Code} | Fs], Module, Level, Ft) ->
ref_ctr=0 :: index()
}).
-build_function_table([{function,_,Arity,Entry,Code0}|Fs], Acc) ->
+build_function_table([{function,Name,Arity,Entry,Code0}|Fs], Acc) ->
Code = dropwhile(fun({label,L}) when L =:= Entry ->
false;
(_) ->
@@ -243,8 +243,10 @@ build_function_table([{function,_,Arity,Entry,Code0}|Fs], Acc) ->
end, Code0),
case Code of
[{label,Entry} | Is] ->
- Info = #{ arity => Arity,
- parameter_info => find_parameter_info(Is, #{}) },
+ Info = #{ name => Name,
+ arity => Arity,
+ parameter_info => find_parameter_info(Is, #{}),
+ always_fails => always_fails(Is) },
build_function_table(Fs, Acc#{ Entry => Info });
_ ->
%% Something is seriously wrong. Ignore it for now.
@@ -261,6 +263,9 @@ find_parameter_info([{'%', _} | Is], Acc) ->
find_parameter_info(_, Acc) ->
Acc.
+always_fails([{jump,_}|_]) -> true;
+always_fails(_) -> false.
+
validate_1(Is, MFA0, Entry, Level, Ft) ->
{Offset, MFA, Header, Body} = extract_header(Is, MFA0, Entry, 1, []),
@@ -274,7 +279,7 @@ validate_1(Is, MFA0, Entry, Level, Ft) ->
validate_branches(MFA, Vst).
extract_header([{func_info, {atom,Mod}, {atom,Name}, Arity}=I | Is],
- MFA0, Entry, Offset, Acc) ->
+ MFA0, Entry, Offset, Acc) ->
{_, Name, Arity} = MFA0, %Assertion.
MFA = {Mod, Name, Arity},
@@ -367,7 +372,8 @@ vi({'%',_}, Vst) ->
Vst;
vi({line,_}, Vst) ->
Vst;
-
+vi(nif_start, Vst) ->
+ Vst;
%%
%% Moves
%%
@@ -425,7 +431,9 @@ vi({select_val,Src,{f,Fail},{list,Choices}}, Vst) ->
assert_term(Src, Vst),
assert_choices(Choices),
validate_select_val(Fail, Choices, Src, Vst);
-vi({select_tuple_arity,Tuple,{f,Fail},{list,Choices}}, Vst) ->
+vi({select_tuple_arity,Tuple0,{f,Fail},{list,Choices}}, Vst) ->
+ Tuple = unpack_typed_arg(Tuple0),
+
assert_type(#t_tuple{}, Tuple, Vst),
assert_arities(Choices),
validate_select_tuple_arity(Fail, Choices, Tuple, Vst);
@@ -441,6 +449,24 @@ vi({test,is_boolean,{f,Lbl},[Src]}, Vst) ->
type_test(Lbl, beam_types:make_boolean(), Src, Vst);
vi({test,is_float,{f,Lbl},[Src]}, Vst) ->
type_test(Lbl, #t_float{}, Src, Vst);
+vi({test,is_function,{f,Lbl},[Src]}, Vst) ->
+ type_test(Lbl, #t_fun{}, Src, Vst);
+vi({test,is_function2,{f,Lbl},[Src,{integer,Arity}]}, Vst)
+ when Arity >= 0, Arity =< ?MAX_FUNC_ARGS ->
+ type_test(Lbl, #t_fun{arity=Arity}, Src, Vst);
+vi({test,is_function2,{f,Lbl},[Src0,_Arity]}, Vst) ->
+ Src = unpack_typed_arg(Src0),
+ assert_term(Src, Vst),
+ branch(Lbl, Vst,
+ fun(FailVst) ->
+ %% We cannot subtract the function type when the arity is
+ %% unknown: `Src` may still be a function if the arity is
+ %% outside the allowed range.
+ FailVst
+ end,
+ fun(SuccVst) ->
+ update_type(fun meet/2, #t_fun{}, Src, SuccVst)
+ end);
vi({test,is_tuple,{f,Lbl},[Src]}, Vst) ->
type_test(Lbl, #t_tuple{}, Src, Vst);
vi({test,is_integer,{f,Lbl},[Src]}, Vst) ->
@@ -453,9 +479,10 @@ vi({test,is_list,{f,Lbl},[Src]}, Vst) ->
type_test(Lbl, #t_list{}, Src, Vst);
vi({test,is_map,{f,Lbl},[Src]}, Vst) ->
type_test(Lbl, #t_map{}, Src, Vst);
-vi({test,is_nil,{f,Lbl},[Src]}, Vst) ->
+vi({test,is_nil,{f,Lbl},[Src0]}, Vst) ->
%% is_nil is an exact check against the 'nil' value, and should not be
%% treated as a simple type test.
+ Src = unpack_typed_arg(Src0),
assert_term(Src, Vst),
branch(Lbl, Vst,
fun(FailVst) ->
@@ -464,18 +491,28 @@ vi({test,is_nil,{f,Lbl},[Src]}, Vst) ->
fun(SuccVst) ->
update_eq_types(Src, nil, SuccVst)
end);
+vi({test,is_pid,{f,Lbl},[Src]}, Vst) ->
+ type_test(Lbl, pid, Src, Vst);
+vi({test,is_port,{f,Lbl},[Src]}, Vst) ->
+ type_test(Lbl, port, Src, Vst);
+vi({test,is_reference,{f,Lbl},[Src]}, Vst) ->
+ type_test(Lbl, reference, Src, Vst);
vi({test,test_arity,{f,Lbl},[Tuple,Sz]}, Vst) when is_integer(Sz) ->
assert_type(#t_tuple{}, Tuple, Vst),
Type = #t_tuple{exact=true,size=Sz},
type_test(Lbl, Type, Tuple, Vst);
-vi({test,is_tagged_tuple,{f,Lbl},[Src,Sz,Atom]}, Vst) ->
+vi({test,is_tagged_tuple,{f,Lbl},[Src0,Sz,Atom]}, Vst) ->
+ Src = unpack_typed_arg(Src0),
assert_term(Src, Vst),
Es = #{ 1 => get_literal_type(Atom) },
Type = #t_tuple{exact=true,size=Sz,elements=Es},
type_test(Lbl, Type, Src, Vst);
-vi({test,is_eq_exact,{f,Lbl},[Src,Val]=Ss}, Vst) ->
+vi({test,is_eq_exact,{f,Lbl},[Src0,Val0]}, Vst) ->
assert_no_exception(Lbl),
- validate_src(Ss, Vst),
+ Src = unpack_typed_arg(Src0),
+ assert_term(Src, Vst),
+ Val = unpack_typed_arg(Val0),
+ assert_term(Val, Vst),
branch(Lbl, Vst,
fun(FailVst) ->
update_ne_types(Src, Val, FailVst)
@@ -483,9 +520,12 @@ vi({test,is_eq_exact,{f,Lbl},[Src,Val]=Ss}, Vst) ->
fun(SuccVst) ->
update_eq_types(Src, Val, SuccVst)
end);
-vi({test,is_ne_exact,{f,Lbl},[Src,Val]=Ss}, Vst) ->
+vi({test,is_ne_exact,{f,Lbl},[Src0,Val0]}, Vst) ->
assert_no_exception(Lbl),
- validate_src(Ss, Vst),
+ Src = unpack_typed_arg(Src0),
+ assert_term(Src, Vst),
+ Val = unpack_typed_arg(Val0),
+ assert_term(Val, Vst),
branch(Lbl, Vst,
fun(FailVst) ->
update_eq_types(Src, Val, FailVst)
@@ -529,8 +569,14 @@ vi({get_tuple_element,Src,N,Dst}, Vst) ->
Index = N+1,
assert_not_literal(Src),
assert_type(#t_tuple{size=Index}, Src, Vst),
- #t_tuple{elements=Es} = normalize(get_term_type(Src, Vst)),
- Type = beam_types:get_tuple_element(Index, Es),
+
+ VRef = get_reg_vref(Src, Vst),
+ Type = fun(Vs) ->
+ #value{type=T} = map_get(VRef, Vs),
+ #t_tuple{elements=Es} = normalize(concrete_type(T, Vs)),
+ beam_types:get_tuple_element(Index, Es)
+ end,
+
extract_term(Type, {bif,element}, [{integer,Index}, Src], Dst, Vst);
%%
@@ -644,6 +690,33 @@ vi({call_last,Live,Func,N}, Vst) ->
validate_tail_call(N, Func, Live, Vst);
vi({call_ext_last,Live,Func,N}, Vst) ->
validate_tail_call(N, Func, Live, Vst);
+vi({call_fun2,{f,Lbl},Live,Fun0}, #vst{ft=Ft}=Vst) ->
+ %% Fun call with known target. Verify that the target exists, agrees with
+ %% the type annotation for `Fun`, and that it has environment variables.
+ %%
+ %% Direct fun calls without environment variables must be expressed as
+ %% local fun calls.
+ #{ name := Name, arity := TotalArity } = map_get(Lbl, Ft),
+ #tr{t=#t_fun{target={Name,TotalArity}},r=Fun} = Fun0, %Assertion.
+ true = Live < TotalArity, %Assertion.
+ assert_term(Fun, Vst),
+ validate_body_call('fun', Live, Vst);
+vi({call_fun2,Tag,Live,Fun0}, Vst) ->
+ Fun = unpack_typed_arg(Fun0),
+ assert_term(Fun, Vst),
+
+ case Tag of
+ {atom,safe} -> ok;
+ {atom,unsafe} -> ok;
+ _ -> error({invalid_tag,Tag})
+ end,
+
+ branch(?EXCEPTION_LABEL, Vst,
+ fun(SuccVst0) ->
+ SuccVst = update_type(fun meet/2, #t_fun{arity=Live},
+ Fun, SuccVst0),
+ validate_body_call('fun', Live, SuccVst)
+ end);
vi({call_fun,Live}, Vst) ->
Fun = {x,Live},
assert_term(Fun, Vst),
@@ -655,26 +728,30 @@ vi({call_fun,Live}, Vst) ->
validate_body_call('fun', Live+1, SuccVst)
end);
vi({make_fun2,{f,Lbl},_,_,NumFree}, #vst{ft=Ft}=Vst0) ->
- #{ arity := Arity0 } = map_get(Lbl, Ft),
- Arity = Arity0 - NumFree,
+ #{ name := Name, arity := TotalArity } = map_get(Lbl, Ft),
+ Arity = TotalArity - NumFree,
true = Arity >= 0, %Assertion.
Vst = prune_x_regs(NumFree, Vst0),
verify_call_args(make_fun, NumFree, Vst),
verify_y_init(Vst),
- Type = #t_fun{arity=Arity},
+
+ Type = #t_fun{target={Name,TotalArity},arity=Arity},
+
create_term(Type, make_fun, [], {x,0}, Vst);
vi({make_fun3,{f,Lbl},_,_,Dst,{list,Env}}, #vst{ft=Ft}=Vst0) ->
_ = [assert_term(E, Vst0) || E <- Env],
NumFree = length(Env),
- #{ arity := Arity0 } = map_get(Lbl, Ft),
- Arity = Arity0 - NumFree,
+ #{ name := Name, arity := TotalArity } = map_get(Lbl, Ft),
+ Arity = TotalArity - NumFree,
true = Arity >= 0, %Assertion.
Vst = eat_heap_fun(Vst0),
- Type = #t_fun{arity=Arity},
+
+ Type = #t_fun{target={Name,TotalArity},arity=Arity},
+
create_term(Type, make_fun, [], Dst, Vst);
vi(return, Vst) ->
assert_durable_term({x,0}, Vst),
@@ -684,7 +761,10 @@ vi(return, Vst) ->
%% BIF calls
%%
-vi({bif,Op,{f,Fail},Ss,Dst}, Vst0) ->
+vi({bif,Op,{f,Fail},Ss0,Dst0}, Vst0) ->
+ Ss = [unpack_typed_arg(Arg) || Arg <- Ss0],
+ Dst = unpack_typed_arg(Dst0),
+
case is_float_arith_bif(Op, Ss) of
true ->
?EXCEPTION_LABEL = Fail, %Assertion.
@@ -693,7 +773,10 @@ vi({bif,Op,{f,Fail},Ss,Dst}, Vst0) ->
validate_src(Ss, Vst0),
validate_bif(bif, Op, Fail, Ss, Dst, Vst0, Vst0)
end;
-vi({gc_bif,Op,{f,Fail},Live,Ss,Dst}, Vst0) ->
+vi({gc_bif,Op,{f,Fail},Live,Ss0,Dst0}, Vst0) ->
+ Ss = [unpack_typed_arg(Arg) || Arg <- Ss0],
+ Dst = unpack_typed_arg(Dst0),
+
validate_src(Ss, Vst0),
verify_live(Live, Vst0),
verify_y_init(Vst0),
@@ -822,7 +905,8 @@ vi(build_stacktrace, Vst0) ->
%% Map instructions.
%%
-vi({get_map_elements,{f,Fail},Src,{list,List}}, Vst) ->
+vi({get_map_elements,{f,Fail},Src0,{list,List}}, Vst) ->
+ Src = unpack_typed_arg(Src0),
verify_get_map(Fail, Src, List, Vst);
vi({put_map_assoc=Op,{f,Fail},Src,Dst,Live,{list,List}}, Vst) ->
verify_put_map(Op, Fail, Src, Dst, Live, List, Vst);
@@ -838,24 +922,22 @@ vi({bs_get_tail,Ctx,Dst,Live}, Vst0) ->
verify_live(Live, Vst0),
verify_y_init(Vst0),
- #t_bs_context{tail_unit=Unit} = get_raw_type(Ctx, Vst0),
+ #t_bs_context{tail_unit=Unit} = get_concrete_type(Ctx, Vst0),
Vst = prune_x_regs(Live, Vst0),
extract_term(#t_bitstring{size_unit=Unit}, bs_get_tail, [Ctx], Dst,
Vst, Vst0);
vi({bs_start_match4,Fail,Live,Src,Dst}, Vst) ->
- validate_bs_start_match(Fail, Live, 0, Src, Dst, Vst);
+ validate_bs_start_match(Fail, Live, Src, Dst, Vst);
vi({test,bs_start_match3,{f,_}=Fail,Live,[Src],Dst}, Vst) ->
- validate_bs_start_match(Fail, Live, 0, Src, Dst, Vst);
-vi({test,bs_start_match2,{f,_}=Fail,Live,[Src,Slots],Dst}, Vst) ->
- validate_bs_start_match(Fail, Live, Slots, Src, Dst, Vst);
+ validate_bs_start_match(Fail, Live, Src, Dst, Vst);
vi({test,bs_match_string,{f,Fail},[Ctx,Stride,{string,String}]}, Vst) ->
true = is_bitstring(String), %Assertion.
validate_bs_skip(Fail, Ctx, Stride, Vst);
vi({test,bs_skip_bits2,{f,Fail},[Ctx,Size,Unit,_Flags]}, Vst) ->
assert_term(Size, Vst),
- Stride = case get_raw_type(Size, Vst) of
+ Stride = case get_concrete_type(Size, Vst) of
#t_integer{elements={Same,Same}} -> Same * Unit;
_ -> Unit
end,
@@ -897,11 +979,18 @@ vi({test,bs_get_integer2=Op,{f,Fail},Live,
NumBits = Unit * Sz,
Stride = NumBits,
- Type = case member(unsigned, Flags) of
- true when 0 =< NumBits, NumBits =< 64 ->
- beam_types:make_integer(0, (1 bsl NumBits)-1);
- _ ->
- %% Signed integer, way too large, or negative size.
+ Type = if
+ 0 =< NumBits, NumBits =< 64 ->
+ Max = (1 bsl NumBits) - 1,
+ case member(unsigned, Flags) of
+ true ->
+ beam_types:make_integer(0, Max);
+ false ->
+ Min = -(Max + 1),
+ beam_types:make_integer(Min, Max)
+ end;
+ true ->
+ %% Way too large or negative size.
#t_integer{}
end,
@@ -920,26 +1009,22 @@ vi({test,bs_get_utf16=Op,{f,Fail},Live,[Ctx,_],Dst}, Vst) ->
vi({test,bs_get_utf32=Op,{f,Fail},Live,[Ctx,_],Dst}, Vst) ->
Type = beam_types:make_integer(0, ?UNICODE_MAX),
validate_bs_get(Op, Fail, Ctx, Live, 32, Type, Dst, Vst);
-vi({test,_Op,{f,Lbl},Src}, Vst) ->
- %% is_pid, is_reference, et cetera.
- validate_src(Src, Vst),
+vi({test,_Op,{f,Lbl},Ss}, Vst) ->
+ %% is_lt, is_gt, et cetera.
+ validate_src([unpack_typed_arg(Arg) || Arg <- Ss], Vst),
branch(Lbl, Vst);
%%
%% Bit syntax positioning
%%
-vi({bs_save2,Ctx,SavePoint}, Vst) ->
- bsm_save(Ctx, SavePoint, Vst);
-vi({bs_restore2,Ctx,SavePoint}, Vst) ->
- bsm_restore(Ctx, SavePoint, Vst);
vi({bs_get_position, Ctx, Dst, Live}, Vst0) ->
assert_type(#t_bs_context{}, Ctx, Vst0),
verify_live(Live, Vst0),
verify_y_init(Vst0),
- #t_bs_context{tail_unit=Unit} = get_raw_type(Ctx, Vst0),
+ #t_bs_context{tail_unit=Unit} = get_concrete_type(Ctx, Vst0),
Vst1 = prune_x_regs(Live, Vst0),
Vst = create_term(#t_abstract{kind={ms_position, Unit}},
@@ -950,7 +1035,7 @@ vi({bs_set_position, Ctx, Pos}, Vst0) ->
assert_type(#t_bs_context{}, Ctx, Vst0),
assert_type(#t_abstract{kind={ms_position,1}}, Pos, Vst0),
- #t_abstract{kind={ms_position,Unit}} = get_raw_type(Pos, Vst0),
+ #t_abstract{kind={ms_position,Unit}} = get_concrete_type(Pos, Vst0),
Vst = override_type(#t_bs_context{tail_unit=Unit}, Ctx, Vst0),
mark_current_ms_position(Ctx, Pos, Vst);
@@ -958,7 +1043,9 @@ vi({bs_set_position, Ctx, Pos}, Vst0) ->
%%
%% Floating-point instructions (excluding BIFs)
%%
-vi({fconv,Src,{fr,_}=Dst}, Vst) ->
+vi({fconv,Src0,{fr,_}=Dst}, Vst) ->
+ Src = unpack_typed_arg(Src0),
+
assert_term(Src, Vst),
branch(?EXCEPTION_LABEL, Vst,
fun(SuccVst0) ->
@@ -992,6 +1079,9 @@ vi(if_end, Vst) ->
vi({try_case_end,Src}, Vst) ->
assert_durable_term(Src, Vst),
branch(?EXCEPTION_LABEL, Vst, fun kill_state/1);
+vi({badrecord,Src}, Vst) ->
+ assert_durable_term(Src, Vst),
+ branch(?EXCEPTION_LABEL, Vst, fun kill_state/1);
vi(raw_raise=I, Vst0) ->
validate_body_call(I, 3, Vst0);
@@ -1001,6 +1091,22 @@ vi(raw_raise=I, Vst0) ->
vi(bs_init_writable=I, Vst) ->
validate_body_call(I, 1, Vst);
+vi({bs_create_bin,{f,Fail},Heap,Live,Unit,Dst,{list,List0}}, Vst0) ->
+ verify_live(Live, Vst0),
+ verify_y_init(Vst0),
+ List = [unpack_typed_arg(Arg) || Arg <- List0],
+ verify_create_bin_list(List, Vst0),
+ Vst = prune_x_regs(Live, Vst0),
+ branch(Fail, Vst,
+ fun(FailVst0) ->
+ heap_alloc(0, FailVst0)
+ end,
+ fun(SuccVst0) ->
+ SuccVst1 = update_create_bin_list(List, SuccVst0),
+ SuccVst = heap_alloc(Heap, SuccVst1),
+ create_term(#t_bitstring{size_unit=Unit}, bs_create_bin, [], Dst,
+ SuccVst)
+ end);
vi({bs_init2,{f,Fail},Sz,Heap,Live,_,Dst}, Vst0) ->
verify_live(Live, Vst0),
verify_y_init(Vst0),
@@ -1144,7 +1250,7 @@ validate_tail_call(Deallocate, Func, Live, #vst{current=#st{numy=NumY}}=Vst0) ->
%% The call cannot fail; we don't need to handle exceptions
Vst = deallocate(Vst0),
verify_return(Vst);
- maybe when Deallocate =:= NumY ->
+ 'maybe' when Deallocate =:= NumY ->
%% The call may fail; make sure we update exception state
Vst = deallocate(Vst0),
branch(?EXCEPTION_LABEL, Vst, fun verify_return/1);
@@ -1177,7 +1283,7 @@ validate_body_call(Func, Live,
case will_call_succeed(Func, Vst) of
yes ->
SuccFun(Vst);
- maybe ->
+ 'maybe' ->
branch(?EXCEPTION_LABEL, Vst, SuccFun);
no ->
branch(?EXCEPTION_LABEL, Vst, fun kill_state/1)
@@ -1223,7 +1329,7 @@ verify_get_map(Fail, Src, List, Vst0) ->
fun(SuccVst) ->
Keys = extract_map_keys(List),
assert_unique_map_keys(Keys),
- extract_map_vals(List, Src, SuccVst, SuccVst)
+ extract_map_vals(List, Src, SuccVst)
end).
%% get_map_elements may leave its destinations in an inconsistent state when
@@ -1235,7 +1341,8 @@ verify_get_map(Fail, Src, List, Vst0) ->
%%
%% We must be careful to preserve the uninitialized status for Y registers
%% that have been allocated but not yet defined.
-clobber_map_vals([Key,Dst|T], Map, Vst0) ->
+clobber_map_vals([Key0, Dst | T], Map, Vst0) ->
+ Key = unpack_typed_arg(Key0),
case is_reg_initialized(Dst, Vst0) of
true ->
Vst = extract_term(any, {bif,map_get}, [Key, Map], Dst, Vst0),
@@ -1257,20 +1364,35 @@ is_reg_initialized({y,_}=Reg, #vst{current=#st{ys=Ys}}) ->
end;
is_reg_initialized(V, #vst{}) -> error({not_a_register, V}).
-extract_map_keys([Key,_Val|T]) ->
- [Key|extract_map_keys(T)];
-extract_map_keys([]) -> [].
-
-extract_map_vals([Key, Dst | Vs], Map, Vst0, Vsti0) ->
- assert_term(Key, Vst0),
- case bif_types(map_get, [Key, Map], Vst0) of
- {none, _, _} ->
- kill_state(Vsti0);
- {DstType, _, _} ->
- Vsti = extract_term(DstType, {bif,map_get}, [Key, Map], Dst, Vsti0),
- extract_map_vals(Vs, Map, Vst0, Vsti)
+extract_map_keys([Key,_Val | T]) ->
+ [unpack_typed_arg(Key) | extract_map_keys(T)];
+extract_map_keys([]) ->
+ [].
+
+
+extract_map_vals(List, Src, SuccVst) ->
+ Seen = sets:new([{version, 2}]),
+ extract_map_vals(List, Src, Seen, SuccVst, SuccVst).
+
+extract_map_vals([Key0, Dst | Vs], Map, Seen0, Vst0, Vsti0) ->
+ case sets:is_element(Dst, Seen0) of
+ true ->
+ %% The destinations must not overwrite each other.
+ error(conflicting_destinations);
+ false ->
+ Key = unpack_typed_arg(Key0),
+ assert_term(Key, Vst0),
+ case bif_types(map_get, [Key, Map], Vst0) of
+ {none, _, _} ->
+ kill_state(Vsti0);
+ {DstType, _, _} ->
+ Vsti = extract_term(DstType, {bif,map_get},
+ [Key, Map], Dst, Vsti0),
+ Seen = sets:add_element(Dst, Seen0),
+ extract_map_vals(Vs, Map, Seen, Vst0, Vsti)
+ end
end;
-extract_map_vals([], _Map, _Vst0, Vst) ->
+extract_map_vals([], _Map, _Seen, _Vst0, Vst) ->
Vst.
verify_put_map(Op, Fail, Src, Dst, Live, List, Vst0) ->
@@ -1311,6 +1433,54 @@ pmt_1([Key0, Value0 | List], Vst, Acc0) ->
pmt_1([], _Vst, Acc) ->
Acc.
+verify_create_bin_list([{atom,string},_Seg,Unit,Flags,Val,Size|Args], Vst) ->
+ assert_bs_unit({atom,string}, Unit),
+ assert_term(Flags, Vst),
+ case Val of
+ {string,Bs} when is_binary(Bs) -> ok;
+ _ -> error({not_string,Val})
+ end,
+ assert_term(Flags, Vst),
+ assert_term(Size, Vst),
+ verify_create_bin_list(Args, Vst);
+verify_create_bin_list([Type,_Seg,Unit,Flags,Val,Size|Args], Vst) ->
+ assert_term(Type, Vst),
+ assert_bs_unit(Type, Unit),
+ assert_term(Flags, Vst),
+ assert_term(Val, Vst),
+ assert_term(Size, Vst),
+ verify_create_bin_list(Args, Vst);
+verify_create_bin_list([], _Vst) -> ok.
+
+update_create_bin_list([{atom,string},_Seg,_Unit,_Flags,_Val,_Size|T], Vst) ->
+ update_create_bin_list(T, Vst);
+update_create_bin_list([{atom,Op},_Seg,_Unit,_Flags,Val,_Size|T], Vst0) ->
+ Type = update_create_bin_type(Op),
+ Vst = update_type(fun meet/2, Type, Val, Vst0),
+ update_create_bin_list(T, Vst);
+update_create_bin_list([], Vst) -> Vst.
+
+update_create_bin_type(append) -> #t_bitstring{};
+update_create_bin_type(private_append) -> #t_bitstring{};
+update_create_bin_type(binary) -> #t_bitstring{};
+update_create_bin_type(float) -> #t_float{};
+update_create_bin_type(integer) -> #t_integer{};
+update_create_bin_type(utf8) -> #t_integer{};
+update_create_bin_type(utf16) -> #t_integer{};
+update_create_bin_type(utf32) -> #t_integer{}.
+
+assert_bs_unit({atom,Type}, 0) ->
+ case Type of
+ utf8 -> ok;
+ utf16 -> ok;
+ utf32 -> ok;
+ _ -> error({zero_unit_invalid_for_type,Type})
+ end;
+assert_bs_unit({atom,_Type}, Unit) when is_integer(Unit), 0 < Unit, Unit =< 256 ->
+ ok;
+assert_bs_unit(_, Unit) ->
+ error({invalid,Unit}).
+
%%
%% Common code for validating returns, whether naked or as part of a tail call.
%%
@@ -1342,7 +1512,7 @@ validate_bif(Kind, Op, Fail, Ss, Dst, OrigVst, Vst) ->
%% This BIF always fails; jump directly to the fail block or
%% exception handler.
branch(Fail, Vst, fun kill_state/1);
- maybe ->
+ 'maybe' ->
validate_bif_1(Kind, Op, Fail, Ss, Dst, OrigVst, Vst)
end.
@@ -1388,14 +1558,14 @@ validate_bif_1(Kind, Op, Fail, Ss, Dst, OrigVst, Vst) ->
%% Common code for validating bs_start_match* instructions.
%%
-validate_bs_start_match({atom,resume}, Live, 0, Src, Dst, Vst0) ->
+validate_bs_start_match({atom,resume}, Live, Src, Dst, Vst0) ->
assert_type(#t_bs_context{}, Src, Vst0),
verify_live(Live, Vst0),
verify_y_init(Vst0),
Vst = assign(Src, Dst, Vst0),
prune_x_regs(Live, Vst);
-validate_bs_start_match({atom,no_fail}, Live, Slots, Src, Dst, Vst0) ->
+validate_bs_start_match({atom,no_fail}, Live, Src, Dst, Vst0) ->
verify_live(Live, Vst0),
verify_y_init(Vst0),
@@ -1405,11 +1575,10 @@ validate_bs_start_match({atom,no_fail}, Live, Slots, Src, Dst, Vst0) ->
SrcType = get_movable_term_type(Src, Vst1),
TailUnit = beam_types:get_bs_matchable_unit(SrcType),
- CtxType = #t_bs_context{slots=Slots,tail_unit=TailUnit},
-
Vst = prune_x_regs(Live, Vst1),
- extract_term(CtxType, bs_start_match, [Src], Dst, Vst, Vst0);
-validate_bs_start_match({f,Fail}, Live, Slots, Src, Dst, Vst) ->
+ extract_term(#t_bs_context{tail_unit=TailUnit}, bs_start_match,
+ [Src], Dst, Vst, Vst0);
+validate_bs_start_match({f,Fail}, Live, Src, Dst, Vst) ->
assert_no_exception(Fail),
branch(Fail, Vst,
@@ -1417,14 +1586,16 @@ validate_bs_start_match({f,Fail}, Live, Slots, Src, Dst, Vst) ->
update_type(fun subtract/2, #t_bs_matchable{}, Src, FailVst)
end,
fun(SuccVst) ->
- validate_bs_start_match({atom,no_fail}, Live, Slots,
+ validate_bs_start_match({atom,no_fail}, Live,
Src, Dst, SuccVst)
end).
%%
%% Common code for validating bs_get* instructions.
%%
-validate_bs_get(Op, Fail, Ctx, Live, Stride, Type, Dst, Vst) ->
+validate_bs_get(Op, Fail, Ctx0, Live, Stride, Type, Dst, Vst) ->
+ Ctx = unpack_typed_arg(Ctx0),
+
assert_no_exception(Fail),
assert_type(#t_bs_context{}, Ctx, Vst),
@@ -1438,7 +1609,9 @@ validate_bs_get(Op, Fail, Ctx, Live, Stride, Type, Dst, Vst) ->
extract_term(Type, Op, [Ctx], Dst, SuccVst, SuccVst0)
end).
-validate_bs_get_all(Op, Fail, Ctx, Live, Stride, Type, Dst, Vst) ->
+validate_bs_get_all(Op, Fail, Ctx0, Live, Stride, Type, Dst, Vst) ->
+ Ctx = unpack_typed_arg(Ctx0),
+
assert_no_exception(Fail),
assert_type(#t_bs_context{}, Ctx, Vst),
@@ -1492,11 +1665,7 @@ advance_bs_context(_Ctx, Stride, _Vst) when Stride < 0 ->
%% We _KNOW_ we'll fail at runtime.
throw({invalid_argument, {negative_stride, Stride}});
advance_bs_context(Ctx, Stride, Vst0) ->
- %% slots/valid must remain untouched to support +r21.
- CtxType0 = get_raw_type(Ctx, Vst0),
- CtxType = CtxType0#t_bs_context{ tail_unit=Stride },
-
- Vst = update_type(fun join/2, CtxType, Ctx, Vst0),
+ Vst = update_type(fun join/2, #t_bs_context{tail_unit=Stride}, Ctx, Vst0),
%% The latest saved position (if any) is no longer current, make sure
%% it isn't updated on the next match operation.
@@ -1541,7 +1710,9 @@ invalidate_current_ms_position(Ctx, #vst{current=St0}=Vst) ->
%%
%% Common code for is_$type instructions.
%%
-type_test(Fail, Type, Reg, Vst) ->
+type_test(Fail, Type, Reg0, Vst) ->
+ Reg = unpack_typed_arg(Reg0),
+
assert_term(Reg, Vst),
assert_no_exception(Fail),
branch(Fail, Vst,
@@ -1749,10 +1920,10 @@ schedule_out(Live, Vst0) when is_integer(Live) ->
prune_x_regs(Live, #vst{current=St0}=Vst) when is_integer(Live) ->
#st{fragile=Fragile0,xs=Xs0} = St0,
Fragile = sets:filter(fun({x,X}) ->
- X < Live;
- ({y,_}) ->
- true
- end, Fragile0),
+ X < Live;
+ ({y,_}) ->
+ true
+ end, Fragile0),
Xs = maps:filter(fun({x,X}, _) ->
X < Live
end, Xs0),
@@ -1839,43 +2010,8 @@ assert_unique_map_keys([_,_|_]=Ls) ->
L
end || L <- Ls],
case length(Vs) =:= sets:size(sets:from_list(Vs, [{version, 2}])) of
- true -> ok;
- false -> error(keys_not_unique)
- end.
-
-%%%
-%%% New binary matching instructions.
-%%%
-
-bsm_save(Reg, {atom,start}, Vst) ->
- %% Save point refering to where the match started.
- %% It is always valid. But don't forget to validate the context register.
- assert_type(#t_bs_context{}, Reg, Vst),
- Vst;
-bsm_save(Reg, SavePoint, Vst) ->
- case get_movable_term_type(Reg, Vst) of
- #t_bs_context{valid=Bits,slots=Slots}=Ctxt0 when SavePoint < Slots ->
- Ctx = Ctxt0#t_bs_context{valid=Bits bor (1 bsl SavePoint),
- slots=Slots},
- override_type(Ctx, Reg, Vst);
- _ ->
- error({illegal_save, SavePoint})
- end.
-
-bsm_restore(Reg, {atom,start}, Vst) ->
- %% (Mostly) automatic save point refering to where the match started.
- %% It is always valid. But don't forget to validate the context register.
- assert_type(#t_bs_context{}, Reg, Vst),
- Vst;
-bsm_restore(Reg, SavePoint, Vst) ->
- case get_movable_term_type(Reg, Vst) of
- #t_bs_context{valid=Bits,slots=Slots} when SavePoint < Slots ->
- case Bits band (1 bsl SavePoint) of
- 0 -> error({illegal_restore, SavePoint, not_set});
- _ -> Vst
- end;
- _ ->
- error({illegal_restore, SavePoint, range})
+ true -> ok;
+ false -> error(keys_not_unique)
end.
bsm_stride({integer, Size}, Unit) ->
@@ -1980,6 +2116,22 @@ infer_types_1(#value{op={bif,is_bitstring},args=[Src]}, Val, Op, Vst) ->
infer_type_test_bif(#t_bitstring{}, Src, Val, Op, Vst);
infer_types_1(#value{op={bif,is_float},args=[Src]}, Val, Op, Vst) ->
infer_type_test_bif(#t_float{}, Src, Val, Op, Vst);
+infer_types_1(#value{op={bif,is_function},args=[Src,{integer,Arity}]},
+ Val, Op, Vst)
+ when Arity >= 0, Arity =< ?MAX_FUNC_ARGS ->
+ infer_type_test_bif(#t_fun{arity=Arity}, Src, Val, Op, Vst);
+infer_types_1(#value{op={bif,is_function},args=[Src,_Arity]}, Val, Op, Vst) ->
+ case Val of
+ {atom, Bool} when Op =:= eq_exact, Bool; Op =:= ne_exact, not Bool ->
+ update_type(fun meet/2, #t_fun{}, Src, Vst);
+ _ ->
+ %% We cannot subtract the function type when the arity is unknown:
+ %% `Src` may still be a function if the arity is outside the
+ %% allowed range.
+ Vst
+ end;
+infer_types_1(#value{op={bif,is_function},args=[Src]}, Val, Op, Vst) ->
+ infer_type_test_bif(#t_fun{}, Src, Val, Op, Vst);
infer_types_1(#value{op={bif,is_integer},args=[Src]}, Val, Op, Vst) ->
infer_type_test_bif(#t_integer{}, Src, Val, Op, Vst);
infer_types_1(#value{op={bif,is_list},args=[Src]}, Val, Op, Vst) ->
@@ -1988,6 +2140,12 @@ infer_types_1(#value{op={bif,is_map},args=[Src]}, Val, Op, Vst) ->
infer_type_test_bif(#t_map{}, Src, Val, Op, Vst);
infer_types_1(#value{op={bif,is_number},args=[Src]}, Val, Op, Vst) ->
infer_type_test_bif(number, Src, Val, Op, Vst);
+infer_types_1(#value{op={bif,is_pid},args=[Src]}, Val, Op, Vst) ->
+ infer_type_test_bif(pid, Src, Val, Op, Vst);
+infer_types_1(#value{op={bif,is_port},args=[Src]}, Val, Op, Vst) ->
+ infer_type_test_bif(port, Src, Val, Op, Vst);
+infer_types_1(#value{op={bif,is_reference},args=[Src]}, Val, Op, Vst) ->
+ infer_type_test_bif(reference, Src, Val, Op, Vst);
infer_types_1(#value{op={bif,is_tuple},args=[Src]}, Val, Op, Vst) ->
infer_type_test_bif(#t_tuple{}, Src, Val, Op, Vst);
infer_types_1(#value{op={bif,tuple_size}, args=[Tuple]},
@@ -2137,7 +2295,7 @@ update_type(Merge, With, #value_ref{}=Ref, Vst0) ->
%% We therefore throw a 'type_conflict' error instead, which causes
%% validation to fail unless we're in a context where such errors can be
%% handled, such as in a branch handler.
- Current = get_raw_type(Ref, Vst0),
+ Current = get_concrete_type(Ref, Vst0),
case Merge(Current, With) of
none ->
throw({type_conflict, Current, With});
@@ -2390,6 +2548,17 @@ validate_src(Ss, Vst) when is_list(Ss) ->
_ = [assert_term(S, Vst) || S <- Ss],
ok.
+unpack_typed_arg(#tr{r=Reg}) ->
+ Reg;
+unpack_typed_arg(Arg) ->
+ Arg.
+
+%% get_term_type(Src, ValidatorState) -> Type
+%% Gets the type of the source Src, resolving deferred types into
+%% a concrete type.
+get_concrete_type(Src, #vst{current=#st{vs=Vs}}=Vst) ->
+ concrete_type(get_raw_type(Src, Vst), Vs).
+
%% get_term_type(Src, ValidatorState) -> Type
%% Get the type of the source Src. The returned type Type will be
%% a standard Erlang type (no catch/try tags or match contexts).
@@ -2406,7 +2575,7 @@ get_term_type(Src, Vst) ->
%% a standard Erlang type (no catch/try tags). Match contexts are OK.
get_movable_term_type(Src, Vst) ->
- case get_raw_type(Src, Vst) of
+ case get_concrete_type(Src, Vst) of
#t_abstract{kind=unfinished_tuple=Kind} -> error({Kind,Src});
initialized -> error({unassigned,Src});
uninitialized -> error({uninitialized_reg,Src});
@@ -2677,24 +2846,31 @@ merge_values(Merge, VsA, VsB) ->
mv_1(Same, Same, VsA, VsB, Acc0) ->
%% We're merging different versions of the same value, so it's safe to
%% reuse old entries if the type's unchanged.
- #value{type=TypeA,args=Args}=EntryA = map_get(Same, VsA),
- #value{type=TypeB,args=Args}=EntryB = map_get(Same, VsB),
-
- Entry = case join(TypeA, TypeB) of
- TypeA -> EntryA;
- TypeB -> EntryB;
- JoinedType -> EntryA#value{type=JoinedType}
+ Entry = case {VsA, VsB} of
+ {#{ Same := Entry0 }, #{ Same := Entry0 } } ->
+ Entry0;
+ {#{ Same := #value{type=TypeA}=Entry0 },
+ #{ Same := #value{type=TypeB} } } ->
+ ConcreteA = concrete_type(TypeA, VsA),
+ ConcreteB = concrete_type(TypeB, VsB),
+ Entry0#value{type=join(ConcreteA, ConcreteB)}
end,
Acc = Acc0#{ Same => Entry },
%% Type inference may depend on values that are no longer reachable from a
%% register, so all arguments must be merged into the new state.
- mv_args(Args, VsA, VsB, Acc);
+ mv_args(Entry#value.args, VsA, VsB, Acc);
mv_1({RefA, RefB}, New, VsA, VsB, Acc) ->
#value{type=TypeA} = map_get(RefA, VsA),
#value{type=TypeB} = map_get(RefB, VsB),
- Acc#{ New => #value{op=join,args=[],type=join(TypeA, TypeB)} }.
+
+ ConcreteA = concrete_type(TypeA, VsA),
+ ConcreteB = concrete_type(TypeB, VsB),
+ Acc#{ New => #value{op=join,args=[],type=join(ConcreteA, ConcreteB)} }.
+
+concrete_type(T, Vs) when is_function(T) -> T(Vs);
+concrete_type(T, _Vs) -> T.
mv_args([#value_ref{}=Arg | Args], VsA, VsB, Acc0) ->
case Acc0 of
@@ -2930,7 +3106,28 @@ assert_not_fragile(Lit, #vst{}) ->
bif_types(Op, Ss, Vst) ->
Args = [normalize(get_term_type(Arg, Vst)) || Arg <- Ss],
- beam_call_types:types(erlang, Op, Args).
+ case {Op,Ss} of
+ {element,[_,{literal,Tuple}]} when tuple_size(Tuple) > 0 ->
+ case beam_call_types:types(erlang, Op, Args) of
+ {any,ArgTypes,Safe} ->
+ RetType = join_tuple_elements(Tuple),
+ {RetType,ArgTypes,Safe};
+ Other ->
+ Other
+ end;
+ {_,_} ->
+ beam_call_types:types(erlang, Op, Args)
+ end.
+
+join_tuple_elements(Tuple) ->
+ join_tuple_elements(tuple_size(Tuple), Tuple, none).
+
+join_tuple_elements(0, _Tuple, Type) ->
+ Type;
+join_tuple_elements(I, Tuple, Type0) ->
+ Type1 = beam_types:make_type_from_value(element(I, Tuple)),
+ Type = beam_types:join(Type0, Type1),
+ join_tuple_elements(I - 1, Tuple, Type).
call_types({extfunc,M,F,A}, A, Vst) ->
Args = get_call_args(A, Vst),
@@ -2945,7 +3142,7 @@ will_bif_succeed(raise, [_,_], _Vst) ->
will_bif_succeed(Op, Ss, Vst) ->
case is_float_arith_bif(Op, Ss) of
true ->
- maybe;
+ 'maybe';
false ->
Args = [normalize(get_term_type(Arg, Vst)) || Arg <- Ss],
beam_call_types:will_succeed(erlang, Op, Args)
@@ -2957,8 +3154,15 @@ will_call_succeed(bs_init_writable, _Vst) ->
yes;
will_call_succeed(raw_raise, _Vst) ->
no;
+will_call_succeed({f,Lbl}, #vst{ft=Ft}) ->
+ case Ft of
+ #{Lbl := #{always_fails := true}} ->
+ no;
+ #{} ->
+ 'maybe'
+ end;
will_call_succeed(_Call, _Vst) ->
- maybe.
+ 'maybe'.
get_call_args(Arity, Vst) ->
get_call_args_1(0, Arity, Vst).
diff --git a/lib/compiler/src/beam_z.erl b/lib/compiler/src/beam_z.erl
index 9f467676e5..852000aa3a 100644
--- a/lib/compiler/src/beam_z.erl
+++ b/lib/compiler/src/beam_z.erl
@@ -24,23 +24,21 @@
-export([module/2]).
--import(lists, [dropwhile/2,map/2,sort/1]).
+-import(lists, [dropwhile/2,sort/1]).
-spec module(beam_utils:module_code(), [compile:option()]) ->
{'ok',beam_asm:module_code()}.
module({Mod,Exp,Attr,Fs0,Lc}, Opts) ->
- NoGetHdTl = proplists:get_bool(no_get_hd_tl, Opts),
NoInitYregs = proplists:get_bool(no_init_yregs, Opts),
- Fs = [function(F, NoGetHdTl, NoInitYregs) || F <- Fs0],
+ Fs = [function(F, NoInitYregs) || F <- Fs0],
{ok,{Mod,Exp,Attr,Fs,Lc}}.
-function({function,Name,Arity,CLabel,Is0}, NoGetHdTl, NoInitYregs) ->
+function({function,Name,Arity,CLabel,Is0}, NoInitYregs) ->
try
Is1 = undo_renames(Is0),
- Is2 = maybe_eliminate_get_hd_tl(Is1, NoGetHdTl),
- Is3 = maybe_eliminate_init_yregs(Is2, NoInitYregs),
- Is = remove_redundant_lines(Is3),
+ Is2 = maybe_eliminate_init_yregs(Is1, NoInitYregs),
+ Is = remove_redundant_lines(Is2),
{function,Name,Arity,CLabel,Is}
catch
Class:Error:Stack ->
@@ -89,32 +87,6 @@ undo_renames([{get_hd,Src,Hd},{get_tl,Src,Tl}|Is]) ->
get_list(Src, Hd, Tl, Is);
undo_renames([{get_tl,Src,Tl},{get_hd,Src,Hd}|Is]) ->
get_list(Src, Hd, Tl, Is);
-undo_renames([{bs_put,_,{bs_put_binary,1,_},
- [{atom,all},{literal,<<>>}]}|Is]) ->
- undo_renames(Is);
-undo_renames([{bs_put,Fail,{bs_put_binary,1,_Flags},
- [{atom,all},{literal,BinString}]}|Is0])
- when is_bitstring(BinString)->
- Bits = bit_size(BinString),
- Bytes = Bits div 8,
- case Bits rem 8 of
- 0 ->
- I = {bs_put_string,byte_size(BinString),
- {string,BinString}},
- [undo_rename(I)|undo_renames(Is0)];
- Rem ->
- <<Binary:Bytes/bytes,Int:Rem>> = BinString,
- PutInt = {bs_put_integer,Fail,{integer,Rem},1,
- {field_flags,[unsigned,big]},{integer,Int}},
- Is = [PutInt|undo_renames(Is0)],
- case Binary of
- <<>> ->
- Is;
- _ ->
- [{bs_put_string,byte_size(Binary),
- {string,Binary}}|Is]
- end
- end;
undo_renames([I|Is]) ->
[undo_rename(I)|undo_renames(Is)];
undo_renames([]) -> [].
@@ -162,20 +134,6 @@ undo_rename({select,I,Reg,Fail,List}) ->
undo_rename(I) -> I.
%%%
-%%% Eliminate get_hd/get_tl instructions if requested by
-%%% the no_get_hd_tl option.
-%%%
-
-maybe_eliminate_get_hd_tl(Is, true) ->
- map(fun({get_hd,Cons,Hd}) ->
- {get_list,Cons,Hd,{x,1022}};
- ({get_tl,Cons,Tl}) ->
- {get_list,Cons,{x,1022},Tl};
- (I) -> I
- end, Is);
-maybe_eliminate_get_hd_tl(Is, false) -> Is.
-
-%%%
%%% Eliminate the init_yreg/1 instruction if requested by
%%% the no_init_yregs option.
%%%
diff --git a/lib/compiler/src/cerl_inline.erl b/lib/compiler/src/cerl_inline.erl
index 3f3d162302..54b56d2449 100644
--- a/lib/compiler/src/cerl_inline.erl
+++ b/lib/compiler/src/cerl_inline.erl
@@ -615,7 +615,7 @@ i_case(E, Ctxt, Ren, Env, S) ->
%% the arguments of the application to be evaluated *after* the
%% switch expression, but *before* the body of the selected clause.
%% Such interleaving is not allowed in general, and it does not seem
- %% worthwile to make a more powerful transformation here. Therefore,
+ %% worthwhile to make a more powerful transformation here. Therefore,
%% the clause bodies are conservatively visited for value if the
%% context is `application'.
Ctxt1 = safe_context(Ctxt),
@@ -967,7 +967,7 @@ i_letrec(Es, B, Xs, Ctxt, Ren, Env, NoInline, S) ->
%% Finally, we create new letrec-bindings for any and all
%% residualised definitions. All referenced functions should have
- %% been visited; the call to `visit' below is expected to retreive a
+ %% been visited; the call to `visit' below is expected to retrieve a
%% cached expression.
Rs1 = keep_referenced(Rs, S4),
{Es1, S5} = mapfoldl(fun (R, S) ->
@@ -1013,7 +1013,7 @@ i_apply(E, Ctxt, Ren, Env, S) ->
%% location could be recycled after the flag has been tested, but
%% there is no real advantage to that, because in practice, only
%% 4-5% of all created store locations will ever be reused, while
- %% there will be a noticable overhead for managing the free list.)
+ %% there will be a noticeable overhead for managing the free list.)
case st__get_app_inlined(L, S3) of
true ->
%% The application was inlined, so we have the final
@@ -1124,7 +1124,7 @@ i_call_2(M, F, As, E, S) ->
%% to rewrite the expression.
i_call_3(M, F, As, E, Ctxt, Env, S) ->
- %% Note that we extract the results of argument expessions here; the
+ %% Note that we extract the results of argument expressions here; the
%% expressions could still be sequences with side effects.
Vs = [concrete(result(A)) || A <- As],
try apply(atom_val(M), atom_val(F), Vs) of
@@ -2096,7 +2096,7 @@ residualize_operand(Opnd, E, S) ->
case st__get_opnd_effect(Opnd#opnd.loc, S) of
true ->
%% The operand has not been visited, so we do that now, but
- %% in `effect' context. (Waddell's algoritm does some stuff
+ %% in `effect' context. (Waddell's algorithm does some stuff
%% here to account specially for the operand size, which
%% appears unnecessary.)
{E1, S1} = i(Opnd#opnd.expr, effect, Opnd#opnd.ren,
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index 4fc24c43d7..d82f53d772 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,9 +49,7 @@
-type abstract_code() :: [erl_parse:abstract_form()].
-%% Internal representations used for 'from_asm' compilation can also be valid,
-%% but have no relevant types defined.
--type forms() :: abstract_code() | cerl:c_module().
+-type forms() :: abstract_code() | cerl:c_module() | beam_disasm:asm_form().
-type option() :: atom() | {atom(), term()} | {'d', atom(), term()}.
@@ -271,18 +269,15 @@ expand_opt(no_bsm4, Os) ->
%% bsm4 instructions are only used when type optimization has determined
%% that a match instruction won't fail.
expand_opt(no_type_opt, Os);
-expand_opt(r18, Os) ->
- expand_opt_before_21(Os);
-expand_opt(r19, Os) ->
- expand_opt_before_21(Os);
-expand_opt(r20, Os) ->
- expand_opt_before_21(Os);
-expand_opt(r21, Os) ->
- expand_opt(r22, [no_put_tuple2 | expand_opt(no_bsm3, Os)]);
expand_opt(r22, Os) ->
- expand_opt(r23, [no_shared_fun_wrappers, no_swap | expand_opt(no_bsm4, Os)]);
+ expand_opt(r23, [no_bs_create_bin, no_shared_fun_wrappers,
+ no_swap | expand_opt(no_bsm4, Os)]);
expand_opt(r23, Os) ->
- expand_opt(no_make_fun3, [no_ssa_opt_float, no_recv_opt, no_init_yregs | Os]);
+ expand_opt(no_make_fun3, [no_bs_create_bin, no_ssa_opt_float,
+ no_recv_opt, no_init_yregs |
+ expand_opt(r24, Os)]);
+expand_opt(r24, Os) ->
+ expand_opt(no_type_opt, [no_bs_create_bin, no_ssa_opt_ranges | Os]);
expand_opt(no_make_fun3, Os) ->
[no_make_fun3, no_fun_opt | Os];
expand_opt({debug_info_key,_}=O, Os) ->
@@ -298,15 +293,10 @@ expand_opt(no_module_opt=O, Os) ->
[O,no_recv_opt | Os];
expand_opt(O, Os) -> [O|Os].
-expand_opt_before_21(Os) ->
- [no_init_yregs, no_make_fun3, no_fun_opt,
- no_shared_fun_wrappers, no_swap,
- no_put_tuple2, no_get_hd_tl, no_ssa_opt_record,
- no_utf8_atoms, no_recv_opt | expand_opt(no_bsm3, Os)].
-
-
-spec format_error(error_description()) -> iolist().
+format_error({obsolete_option,Ver}) ->
+ io_lib:fwrite("the ~p option is no longer supported", [Ver]);
format_error(no_crypto) ->
"this system is not configured with crypto support.";
format_error(bad_crypto_key) ->
@@ -817,6 +807,7 @@ abstr_passes(AbstrStatus) ->
?pass(expand_records),
{iff,'dexp',{listing,"expand"}},
+ {iff,'E',?pass(legalize_vars)},
{iff,'E',{src_listing,"E"}},
{iff,'to_exp',{done,"E"}},
@@ -885,10 +876,6 @@ kernel_passes() ->
{iff,dssabsm,{listing,"ssabsm"}},
{unless,no_bsm_opt,{iff,ssalint,{pass,beam_ssa_lint}}},
- {unless,no_fun_opt,{pass,beam_ssa_funs}},
- {iff,dssafuns,{listing,"ssafuns"}},
- {unless,no_fun_opt,{iff,ssalint,{pass,beam_ssa_lint}}},
-
{unless,no_ssa_opt,{pass,beam_ssa_opt}},
{iff,dssaopt,{listing,"ssaopt"}},
{unless,no_ssa_opt,{iff,ssalint,{pass,beam_ssa_lint}}},
@@ -916,8 +903,6 @@ asm_passes() ->
{iff,dblk,{listing,"block"}},
{unless,no_jopt,{pass,beam_jump}},
{iff,djmp,{listing,"jump"}},
- {unless,no_peep_opt,{pass,beam_peep}},
- {iff,dpeep,{listing,"peep"}},
{pass,beam_clean},
{iff,dclean,{listing,"clean"}},
{unless,no_stack_trimming,{pass,beam_trim}},
@@ -1019,8 +1004,13 @@ parse_module(_Code, St) ->
do_parse_module(DefEncoding, #compile{ifile=File,options=Opts,dir=Dir}=St) ->
SourceName0 = proplists:get_value(source, Opts, File),
SourceName = case member(deterministic, Opts) of
- true -> filename:basename(SourceName0);
- false -> SourceName0
+ true ->
+ filename:basename(SourceName0);
+ false ->
+ case member(absolute_source, Opts) of
+ true -> paranoid_absname(SourceName0);
+ false -> SourceName0
+ end
end,
StartLocation = case with_columns(Opts) of
true ->
@@ -1028,28 +1018,65 @@ do_parse_module(DefEncoding, #compile{ifile=File,options=Opts,dir=Dir}=St) ->
false ->
1
end,
- R = epp:parse_file(File,
- [{includes,[".",Dir|inc_paths(Opts)]},
- {source_name, SourceName},
- {macros,pre_defs(Opts)},
- {default_encoding,DefEncoding},
- {location,StartLocation},
- extra]),
- case R of
- {ok,Forms0,Extra} ->
- Encoding = proplists:get_value(encoding, Extra),
- Forms = case with_columns(Opts ++ compile_options(Forms0)) of
- true ->
- Forms0;
- false ->
- strip_columns(Forms0)
- end,
- {ok,Forms,St#compile{encoding=Encoding}};
- {error,E} ->
- Es = [{St#compile.ifile,[{none,?MODULE,{epp,E}}]}],
- {error,St#compile{errors=St#compile.errors ++ Es}}
+ case erl_features:keyword_fun(Opts, fun erl_scan:f_reserved_word/1) of
+ {ok, {Features, ResWordFun}} ->
+ R = epp:parse_file(File,
+ [{includes,[".",Dir|inc_paths(Opts)]},
+ {source_name, SourceName},
+ {macros,pre_defs(Opts)},
+ {default_encoding,DefEncoding},
+ {location,StartLocation},
+ {reserved_word_fun, ResWordFun},
+ {features, Features},
+ extra]),
+ case R of
+ %% FIXME Extra should include used features as well
+ {ok,Forms0,Extra} ->
+ Encoding = proplists:get_value(encoding, Extra),
+ %% Get features used in the module, indicated by
+ %% enabling features with
+ %% -compile({enable_feature, ..}).
+ UsedFtrs = proplists:get_value(features, Extra),
+ St1 = metadata_add_features(UsedFtrs, St),
+ Forms = case with_columns(Opts ++ compile_options(Forms0)) of
+ true ->
+ Forms0;
+ false ->
+ strip_columns(Forms0)
+ end,
+ {ok,Forms,St1#compile{encoding=Encoding}};
+ {error,E} ->
+ Es = [{St#compile.ifile,[{none,?MODULE,{epp,E}}]}],
+ {error,St#compile{errors=St#compile.errors ++ Es}}
+ end;
+ {error, {Mod, Reason}} ->
+ Es = [{St#compile.ifile,[{none, Mod, Reason}]}],
+ {error, St#compile{errors = St#compile.errors ++ Es}}
end.
+%% The atom to be used in the proplist of the meta chunk indicating
+%% the features used when compiling the module.
+-define(META_USED_FEATURES, enabled_features).
+-define(META_CHUNK_NAME, <<"Meta">>).
+
+metadata_add_features(Ftrs, #compile{extra_chunks = Extra} = St) ->
+ MetaData =
+ case proplists:get_value(?META_CHUNK_NAME, Extra) of
+ undefined ->
+ [];
+ Bin ->
+ erlang:binary_to_term(Bin)
+ end,
+ OldFtrs = proplists:get_value(?META_USED_FEATURES, MetaData, []),
+ NewFtrs = (Ftrs -- OldFtrs) ++ OldFtrs,
+ MetaData1 =
+ proplists:from_map(maps:put(?META_USED_FEATURES, NewFtrs,
+ proplists:to_map(MetaData))),
+ Extra1 = proplists:from_map(maps:put(?META_CHUNK_NAME,
+ erlang:term_to_binary(MetaData1),
+ proplists:to_map(Extra))),
+ St#compile{extra_chunks = Extra1}.
+
with_columns(Opts) ->
case proplists:get_value(error_location, Opts, column) of
column -> true;
@@ -1406,7 +1433,7 @@ makedep_output(Code, #compile{options=Opts,ofile=Ofile}=St) ->
if
is_list(Output) ->
- %% Write the depedencies to a file.
+ %% Write the dependencies to a file.
case file:write_file(Output, Code) of
ok ->
{ok,Code,St};
@@ -1415,7 +1442,7 @@ makedep_output(Code, #compile{options=Opts,ofile=Ofile}=St) ->
{error,St#compile{errors=St#compile.errors++[Err]}}
end;
true ->
- %% Write the depedencies to a device.
+ %% Write the dependencies to a device.
try io:fwrite(Output, "~ts", [Code]) of
ok ->
{ok,Code,St}
@@ -1430,9 +1457,43 @@ expand_records(Code0, #compile{options=Opts}=St) ->
Code = erl_expand_records:module(Code0, Opts),
{ok,Code,St}.
-compile_directives(Forms, #compile{options=Opts0}=St) ->
- Opts = expand_opts(flatten([C || {attribute,_,compile,C} <- Forms])),
- {ok, Forms, St#compile{options=Opts ++ Opts0}}.
+legalize_vars(Code0, St) ->
+ Code = map(fun(F={function,_,_,_,_}) ->
+ erl_pp:legalize_vars(F);
+ (F) ->
+ F
+ end, Code0),
+ {ok,Code,St}.
+
+compile_directives(Forms, #compile{options=Opts0}=St0) ->
+ Opts1 = expand_opts(flatten([C || {attribute,_,compile,C} <- Forms])),
+ Opts = Opts1 ++ Opts0,
+ St1 = St0#compile{options=Opts},
+ case any_obsolete_option(Opts) of
+ {yes,Opt} ->
+ Error = {St1#compile.ifile,[{none,?MODULE,{obsolete_option,Opt}}]},
+ St = St1#compile{errors=[Error|St1#compile.errors]},
+ {error,St};
+ no ->
+ {ok,Forms,St1}
+ end.
+
+any_obsolete_option([Opt|Opts]) ->
+ case is_obsolete(Opt) of
+ true -> {yes,Opt};
+ false -> any_obsolete_option(Opts)
+ end;
+any_obsolete_option([]) -> no.
+
+is_obsolete(r18) -> true;
+is_obsolete(r19) -> true;
+is_obsolete(r20) -> true;
+is_obsolete(r21) -> true;
+is_obsolete(no_bsm3) -> true;
+is_obsolete(no_get_hd_tl) -> true;
+is_obsolete(no_put_tuple2) -> true;
+is_obsolete(no_utf8_atoms) -> true;
+is_obsolete(_) -> false.
core(Forms, #compile{options=Opts}=St) ->
{ok,Core,Ws} = v3_core:module(Forms, Opts),
@@ -2020,14 +2081,12 @@ pre_load() ->
beam_jump,
beam_kernel_to_ssa,
beam_opcodes,
- beam_peep,
beam_ssa,
beam_ssa_bc_size,
beam_ssa_bool,
beam_ssa_bsm,
beam_ssa_codegen,
beam_ssa_dead,
- beam_ssa_funs,
beam_ssa_opt,
beam_ssa_pre_codegen,
beam_ssa_recv,
@@ -2046,6 +2105,7 @@ pre_load() ->
epp,
erl_bifs,
erl_expand_records,
+ erl_features,
erl_lint,
erl_parse,
erl_scan,
diff --git a/lib/compiler/src/compiler.app.src b/lib/compiler/src/compiler.app.src
index b180f5ab33..02d33dd611 100644
--- a/lib/compiler/src/compiler.app.src
+++ b/lib/compiler/src/compiler.app.src
@@ -1,7 +1,7 @@
% This is an -*- erlang -*- file.
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -34,14 +34,12 @@
beam_kernel_to_ssa,
beam_listing,
beam_opcodes,
- beam_peep,
beam_ssa,
beam_ssa_bc_size,
beam_ssa_bool,
beam_ssa_bsm,
beam_ssa_codegen,
beam_ssa_dead,
- beam_ssa_funs,
beam_ssa_lint,
beam_ssa_opt,
beam_ssa_pp,
@@ -82,5 +80,5 @@
{registered, []},
{applications, [kernel, stdlib]},
{env, []},
- {runtime_dependencies, ["stdlib-3.13","kernel-7.0","erts-11.0",
- "crypto-3.6"]}]}.
+ {runtime_dependencies, ["stdlib-@OTP-17742@","kernel-@OTP-17742@","erts-@OTP-17742@",
+ "crypto-@OTP-17742@"]}]}.
diff --git a/lib/compiler/src/genop.tab b/lib/compiler/src/genop.tab
index 2b795e8509..e1e36fa4dc 100755
--- a/lib/compiler/src/genop.tab
+++ b/lib/compiler/src/genop.tab
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1998-2021. All Rights Reserved.
+# Copyright Ericsson AB 1998-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -170,7 +170,7 @@ BEAM_FORMAT_NUMBER=0
## receive loop at Label.
25: wait/1
-## @spec wait_timeout Lable Time
+## @spec wait_timeout Label Time
## @doc Sets up a timeout of Time milliseconds and saves the address of the
## following instruction as the entry point if the timeout triggers.
26: wait_timeout/2
@@ -192,7 +192,7 @@ BEAM_FORMAT_NUMBER=0
38: -int_bnot/3
#
-# Comparision operators.
+# Comparison operators.
#
## @spec is_lt Lbl Arg1 Arg2
@@ -332,8 +332,8 @@ BEAM_FORMAT_NUMBER=0
#
68: -put_string/3
69: put_list/3
-70: put_tuple/2
-71: put/1
+70: -put_tuple/2
+71: -put/1
#
# Raising errors.
@@ -438,14 +438,14 @@ BEAM_FORMAT_NUMBER=0
# New bit syntax matching in R11B.
-116: bs_start_match2/5
+116: -bs_start_match2/5
117: bs_get_integer2/7
118: bs_get_float2/7
119: bs_get_binary2/7
120: bs_skip_bits2/5
121: bs_test_tail2/3
-122: bs_save2/2
-123: bs_restore2/2
+122: -bs_save2/2
+123: -bs_restore2/2
# New GC bifs introduced in R11B.
@@ -478,7 +478,7 @@ BEAM_FORMAT_NUMBER=0
129: is_bitstr/2
# R12B
-130: bs_context_to_binary/1
+130: -bs_context_to_binary/1
131: bs_test_unit/3
132: bs_match_string/4
133: bs_init_writable/0
@@ -647,3 +647,26 @@ BEAM_FORMAT_NUMBER=0
## @doc Sets the current receive cursor to the marker associated with
## the given Reference.
176: recv_marker_use/1
+
+# OTP 25
+
+## @spec bs_create_bin Fail Alloc Live Unit Dst OpList
+## @doc Builda a new binary using the binary syntax.
+177: bs_create_bin/6
+
+## @spec call_fun2 Tag Arity Func
+## @doc Calls the fun Func with arity Arity. Assume arguments in registers x(0)
+## to x(Arity-1). Tag can be one of:
+##
+## * FunIndex - `Func` is always a local fun identified by `FunIndex`
+## * {atom,safe} - `Func` is known to be a fun of correct arity.
+## * {atom,unsafe} - Nothing is known about `Func`.
+178: call_fun2/3
+
+## @spec nif_start
+## @doc No-op at start of each function declared in -nifs().
+179: nif_start/0
+
+## @spec badrecord Value
+## @doc Raises a {badrecord,Value} error exception.
+180: badrecord/1
diff --git a/lib/compiler/src/rec_env.erl b/lib/compiler/src/rec_env.erl
index 48d39776dc..753eca4c66 100644
--- a/lib/compiler/src/rec_env.erl
+++ b/lib/compiler/src/rec_env.erl
@@ -478,7 +478,7 @@ get(Key, Env) ->
-define(MINIMUM_RANGE, 1000).
-define(START_RANGE_FACTOR, 50).
-define(MAX_RETRIES, 2). % retries before enlarging range
--define(ENLARGE_FACTOR, 10). % range enlargment factor
+-define(ENLARGE_FACTOR, 10). % range enlargement factor
-ifdef(DEBUG).
%% If you want to use these process dictionary counters, make sure to
diff --git a/lib/compiler/src/sys_core_bsm.erl b/lib/compiler/src/sys_core_bsm.erl
index 11bba79155..6e97a05f40 100644
--- a/lib/compiler/src/sys_core_bsm.erl
+++ b/lib/compiler/src/sys_core_bsm.erl
@@ -41,7 +41,7 @@ function([{#c_var{name={F,Arity}}=Name,B0}|Fs]) ->
function([]) ->
[].
-%%% Reorder bit syntax matching to faciliate optimization in further passes.
+%%% Reorder bit syntax matching to facilitate optimization in further passes.
bsm_reorder(#c_case{arg=#c_var{}=V}=Case) ->
bsm_reorder_1([V], Case);
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index 1c26fc301d..d79753068f 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -324,19 +324,16 @@ expr(#c_case{}=Case0, Ctxt, Sub) ->
%% (in addition to any warnings that may have been emitted
%% according to the rules above).
%%
- case opt_bool_case(Case0, Sub) of
- #c_case{anno=Anno,arg=Arg0,clauses=Cs0}=Case1 ->
- Arg1 = body(Arg0, value, Sub),
- LitExpr = cerl:is_literal(Arg1),
- {Arg2,Cs1} = case_opt(Arg1, Cs0, Sub),
- Cs2 = clauses(Arg2, Cs1, Ctxt, Sub, LitExpr, Anno),
- Case = Case1#c_case{arg=Arg2,clauses=Cs2},
- warn_no_clause_match(Case1, Case),
- Expr = eval_case(Case, Sub),
- move_case_into_arg(Expr, Sub);
- Other ->
- expr(Other, Ctxt, Sub)
- end;
+ Case1 = opt_bool_case(Case0, Sub),
+ #c_case{anno=Anno,arg=Arg0,clauses=Cs0} = Case1,
+ Arg1 = body(Arg0, value, Sub),
+ LitExpr = cerl:is_literal(Arg1),
+ {Arg2,Cs1} = case_opt(Arg1, Cs0, Sub),
+ Cs2 = clauses(Arg2, Cs1, Ctxt, Sub, LitExpr, Anno),
+ Case = Case1#c_case{arg=Arg2,clauses=Cs2},
+ warn_no_clause_match(Case1, Case),
+ Expr = eval_case(Case, Sub),
+ move_case_into_arg(Expr, Sub);
expr(#c_apply{anno=Anno,op=Op0,args=As0}=Apply0, _, Sub) ->
Op1 = expr(Op0, value, Sub),
As1 = expr_list(As0, value, Sub),
@@ -604,10 +601,7 @@ eval_binary(#c_binary{anno=Anno,segments=Ss}=Bin) ->
Bin;
throw:{badarg,Warning} ->
add_warning(Bin, {failed,Warning}),
- #c_call{anno=Anno,
- module=#c_literal{val=erlang},
- name=#c_literal{val=error},
- args=[#c_literal{val=badarg}]}
+ Bin
end.
eval_binary_1([#c_bitstr{val=#c_literal{val=Val},size=#c_literal{val=Sz},
@@ -1439,15 +1433,15 @@ shadow_warning([C|Cs], Line, Anno) ->
shadow_warning(Cs, Line, Anno);
shadow_warning([], _, _) -> ok.
-%% will_succeed(Guard) -> yes | maybe | no.
+%% will_succeed(Guard) -> yes | 'maybe' | no.
%% Test if we know whether a guard will succeed/fail or just don't
%% know. Be VERY conservative!
will_succeed(#c_literal{val=true}) -> yes;
will_succeed(#c_literal{val=false}) -> no;
-will_succeed(_Guard) -> maybe.
+will_succeed(_Guard) -> 'maybe'.
-%% will_match(Expr, [Pattern]) -> yes | maybe.
+%% will_match(Expr, [Pattern]) -> yes | 'maybe'.
%% We KNOW that this function is only used after optimizations
%% in case_opt/4. Therefore clauses that can definitely not match
%% have already been pruned.
@@ -1457,7 +1451,7 @@ will_match(#c_values{es=Es}, Ps) ->
will_match(E, [P]) ->
will_match_1(cerl_clauses:match(P, E)).
-will_match_1({false,_}) -> maybe;
+will_match_1({false,_}) -> 'maybe';
will_match_1({true,_}) -> yes.
%% opt_bool_case(CoreExpr, Sub) - CoreExpr'.
@@ -1591,34 +1585,12 @@ opt_bool_not(#c_case{arg=Arg,clauses=Cs0}=Case0) ->
Case = Case0#c_case{arg=Expr,clauses=Cs},
opt_bool_not(Case);
_ ->
- opt_bool_case_redundant(Case0)
+ Case0
end.
opt_bool_not_invert(#c_clause{pats=[#c_literal{val=Bool}]}=C) ->
C#c_clause{pats=[#c_literal{val=not Bool}]}.
-%% opt_bool_case_redundant(Core) -> Core'.
-%% If the sole purpose of the case is to verify that the case
-%% expression is indeed boolean, we do not need the case
-%% (since we have already verified that the case expression is
-%% boolean).
-%%
-%% case BoolExpr of
-%% true -> true ==> BoolExpr
-%% false -> false
-%% end.
-%%
-opt_bool_case_redundant(#c_case{arg=Arg,clauses=Cs}=Case) ->
- case all(fun opt_bool_case_redundant_1/1, Cs) of
- true -> Arg;
- false -> Case
- end.
-
-opt_bool_case_redundant_1(#c_clause{pats=[#c_literal{val=B}],
- body=#c_literal{val=B}}) ->
- true;
-opt_bool_case_redundant_1(_) -> false.
-
%% eval_case(Case) -> #c_case{} | #c_let{}.
%% If possible, evaluate a case at compile time. We know that the
%% last clause is guaranteed to match so if there is only one clause
@@ -2773,7 +2745,7 @@ void() -> #c_literal{val=ok}.
%%% While optimizing this code fragment, two warnings for useless
%%% building will be generated: one for the list and one for the tuple
%%% inside. Before the introduction of column numbers, those two warnings
-%%% would be coalesced to one becuase they had the same line number.
+%%% would be coalesced to one because they had the same line number.
%%%
%%% With column numbers, we will need a more sophisticated solution to
%%% avoid emitting annoying duplicate warnings.
diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl
index 2fd31656ca..974d3413b1 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -109,6 +109,7 @@
-record(ifun, {anno=#a{},id,vars,clauses,fc,name=unnamed}).
-record(iletrec, {anno=#a{},defs,body}).
-record(imatch, {anno=#a{},pat,guard=[],arg,fc}).
+-record(iexprs, {anno=#a{},bodies=[]}).
-record(imap, {anno=#a{},arg=#c_literal{val=#{}},es,is_pat=false}).
-record(imappair, {anno=#a{},op,key,val}).
-record(iprimop, {anno=#a{},name,args}).
@@ -170,6 +171,7 @@
-record(imodule, {name = [],
exports = ordsets:new(),
+ nifs = sets:new([{version, 2}]),
attrs = [],
defs = [],
file = [],
@@ -194,9 +196,8 @@ module(Forms0, Opts) ->
Kfs = reverse(Kfs0),
{ok,#c_module{name=#c_literal{val=Mod},exports=Cexp,attrs=As,defs=Kfs},Ws}.
-form({function,_,_,_,_}=F0, Module, Opts) ->
- #imodule{file=File,defs=Defs,ws=Ws0} = Module,
- {F,Ws} = function(F0, Ws0, File, Opts),
+form({function,_,_,_,_}=F0, #imodule{defs=Defs}=Module, Opts) ->
+ {F,Ws} = function(F0, Module, Opts),
Module#imodule{defs=[F|Defs],ws=Ws};
form({attribute,_,module,Mod}, Module, _Opts) ->
true = is_atom(Mod),
@@ -204,11 +205,14 @@ form({attribute,_,module,Mod}, Module, _Opts) ->
form({attribute,_,file,{File,_Line}}=F, #imodule{attrs=As}=Module, _Opts) ->
Module#imodule{file=File, attrs=[attribute(F)|As]};
form({attribute,_,import,_}, Module, _Opts) ->
- %% Ignore. We have no futher use for imports.
+ %% Ignore. We have no further use for imports.
Module;
form({attribute,_,export,Es}, #imodule{exports=Exp0}=Module, _Opts) ->
Exp = ordsets:union(ordsets:from_list(Es), Exp0),
Module#imodule{exports=Exp};
+form({attribute,_,nifs,Ns}, #imodule{nifs=Nifs0}=Module, _Opts) ->
+ Nifs = sets:union(sets:from_list(Ns, [{version,2}]), Nifs0),
+ Module#imodule{nifs=Nifs};
form({attribute,_,_,_}=F, #imodule{attrs=As}=Module, _Opts) ->
Module#imodule{attrs=[attribute(F)|As]};
form(_, Module, _Opts) ->
@@ -232,7 +236,8 @@ defined_functions(Forms) ->
%% io:format("~w/~w " ++ Format,[Name,Arity]++Terms),
%% ok.
-function({function,_,Name,Arity,Cs0}, Ws0, File, Opts) ->
+function({function,_,Name,Arity,Cs0}, Module, Opts) ->
+ #imodule{file=File, ws=Ws0, nifs=Nifs} = Module,
try
St0 = #core{vcount=0,function={Name,Arity},opts=Opts,
dialyzer=member(dialyzer, Opts),
@@ -241,7 +246,7 @@ function({function,_,Name,Arity,Cs0}, Ws0, File, Opts) ->
%% ok = function_dump(Name, Arity, "body:~n~p~n",[B0]),
{B1,St2} = ubody(B0, St1),
%% ok = function_dump(Name, Arity, "ubody:~n~p~n",[B1]),
- {B2,St3} = cbody(B1, St2),
+ {B2,St3} = cbody(B1, Nifs, St2),
%% ok = function_dump(Name, Arity, "cbody:~n~p~n",[B2]),
{B3,#core{ws=Ws}} = lbody(B2, St3),
%% ok = function_dump(Name, Arity, "lbody:~n~p~n",[B3]),
@@ -259,7 +264,7 @@ body(Cs0, Name, Arity, St0) ->
Args = reverse(Args0), %Nicer order
{Cs1,St2} = clauses(Cs0, St1),
{Ps,St3} = new_vars(Arity, St2), %Need new variables here
- Fc = function_clause(Ps, Anno),
+ Fc = function_clause(Ps, FunAnno),
{#ifun{anno=#a{anno=FunAnno},id=[],vars=Args,clauses=Cs1,fc=Fc},St3}.
%% clause(Clause, State) -> {Cclause,State}.
@@ -282,7 +287,7 @@ clause({clause,Lc,H0,G0,B0}, St0) ->
catch
throw:nomatch ->
%% This pattern can't possibly match. If we simply remove
- %% the clause, varibles that are used later might not be
+ %% the clause, variables that are used later might not be
%% bound. Therefore, we must keep the clause, but rewrite
%% the pattern to a pattern that will bind the same
%% variables and ensure that the clause can't be executed
@@ -303,7 +308,7 @@ head(Ps, St) ->
pattern_list(Ps, St).
%% guard([Expr], State) -> {[Cexpr],State}.
-%% Build an explict and/or tree of guard alternatives, then traverse
+%% Build an explicit and/or tree of guard alternatives, then traverse
%% top-level and/or tree and "protect" inner tests.
guard([], St) -> {[],St};
@@ -422,7 +427,7 @@ gexpr_not(A, Bools0, St0, Line) ->
%% which will produce the same result, but may eliminate
%% redundant is_boolean/1 tests (see unforce/3).
%%
- %% Note that this tranformation would not be safe if the
+ %% Note that this transformation would not be safe if the
%% original expression had been:
%%
%% not(Expr =:= true)
@@ -565,6 +570,8 @@ unforce(E, Eps, Vs) ->
Tree = unforce_tree(Eps++[E], gb_trees:empty()),
unforce(Tree, Vs).
+unforce_tree([#iexprs{bodies=Exprs}|Es], D0) ->
+ unforce_tree(lists:append(Exprs) ++ Es, D0);
unforce_tree([#iset{var=#c_var{name=V},arg=Arg0}|Es], D0) ->
Arg = unforce_tree_subst(Arg0, D0),
D = gb_trees:insert(V, Arg, D0),
@@ -616,6 +623,34 @@ exprs([E0|Es0], St0) ->
{Eps ++ [E1] ++ Es1,St2};
exprs([], St) -> {[],St}.
+%% exprs([Expr], State) -> {[Cexpr],State}.
+%% Flatten top-level exprs while handling maybe_match operators.
+
+maybe_match_exprs([{maybe_match,L,P0,E0}|Es0], Fail, St0) ->
+ {Es1,St1} = maybe_match_exprs(Es0, Fail, St0),
+ {C,St2} =
+ case Es1 of
+ [] ->
+ {AllName,StInt} = new_var_name(St1),
+ All = {var,L,AllName},
+ clause({clause,L,[{match,L,P0,All}],[],[All]}, StInt);
+ [_|_] ->
+ {C0,StInt} = clause({clause,L,[P0],[],[{nil,0}]}, St1),
+ {C0#iclause{body=Es1},StInt}
+ end,
+ {E1,Eps,St3} = novars(E0, St2),
+ {Fpat,St4} = new_var(St3),
+ Lanno = lineno_anno(L, St4),
+ Fc = #iclause{anno=#a{anno=[dialyzer_ignore,compiler_generated|Lanno]},pats=[Fpat],guard=[],
+ body=[#iapply{op=Fail,args=[Fpat]}]},
+ {Eps ++ [#icase{anno=#a{anno=Lanno},args=[E1],clauses=[C],fc=Fc}],St4};
+maybe_match_exprs([E0|Es0], Fail, St0) ->
+ {E1,Eps,St1} = expr(E0, St0),
+ {Es1,St2} = maybe_match_exprs(Es0, Fail, St1),
+ {Eps ++ [E1|Es1],St2};
+maybe_match_exprs([], _Fail, St) ->
+ {[],St}.
+
%% expr(Expr, State) -> {Cexpr,[PreExp],State}.
%% Generate an internal core expression.
@@ -627,10 +662,9 @@ expr({atom,L,A}, St) -> {#c_literal{anno=full_anno(L, St),val=A},[],St};
expr({nil,L}, St) -> {#c_literal{anno=full_anno(L, St),val=[]},[],St};
expr({string,L,S}, St) -> {#c_literal{anno=full_anno(L, St),val=S},[],St};
expr({cons,L,H0,T0}, St0) ->
- {H1,Hps,St1} = safe(H0, St0),
- {T1,Tps,St2} = safe(T0, St1),
- A = full_anno(L, St2),
- {annotate_cons(A, H1, T1, St2),Hps ++ Tps,St2};
+ {[H1,T1],Eps,St1} = safe_list([H0,T0], St0),
+ A = full_anno(L, St1),
+ {annotate_cons(A, H1, T1, St1),Eps,St1};
expr({lc,L,E,Qs0}, St0) ->
{Qs1,St1} = preprocess_quals(L, Qs0, St0),
lc_tq(L, E, Qs1, #c_literal{anno=lineno_anno(L, St1),val=[]}, St1);
@@ -662,6 +696,84 @@ expr({block,_,Es0}, St0) ->
{Es1,St1} = exprs(droplast(Es0), St0),
{E1,Eps,St2} = expr(last(Es0), St1),
{E1,Es1 ++ Eps,St2};
+expr({'maybe',L,Es}, St0) ->
+ {V,St1} = new_var_name(St0),
+ Var = {var,L,V},
+ Cs = [{clause,L,[Var],[],[Var]}],
+ expr({'maybe',L,Es,{'else',L,Cs}}, St1);
+expr({'maybe',L,Es0,{'else',_,Cs0}}, St0) ->
+ %% Translate the maybe ... else ... end construct.
+ %%
+ %% As an example, the following Erlang code:
+ %%
+ %% foo(A) ->
+ %% maybe
+ %% {ok, V} ?= A,
+ %% V
+ %% else
+ %% Other ->
+ %% {error, Other}
+ %% end.
+ %%
+ %% is translated into Core Erlang like this:
+ %%
+ %% 'foo'/1 =
+ %% fun (_0) ->
+ %% case _0 of
+ %% <A> when 'true' ->
+ %% ( letrec
+ %% 'maybe_else_fail'/1 =
+ %% fun (_3) ->
+ %% case _3 of
+ %% <_2> when 'true' ->
+ %% case _2 of
+ %% <Other> when 'true' ->
+ %% {'error',Other}
+ %% ( <_1> when 'true' ->
+ %% primop 'match_fail'({'else_clause',_1})
+ %% -| ['compiler_generated'] )
+ %% end
+ %% ( <_1> when 'true' ->
+ %% primop 'match_fail'('never_fails')
+ %% -| ['compiler_generated'] )
+ %% end
+ %% in
+ %% case A of
+ %% <{'ok',V}> when 'true' ->
+ %% V
+ %% ( <_4> when 'true' ->
+ %% apply 'maybe_else_fail'/1(_4)
+ %% -| ['dialyzer_ignore','compiler_generated'] )
+ %% end
+ %% -| ['letrec_goto','no_inline'] )
+ %% ( <_5> when 'true' ->
+ %% primop 'match_fail'({'function_clause',_5})
+ %% -| ['compiler_generated'] )
+ %% end
+ {[V1,V2,FailVar],St1} = new_vars(3, St0),
+
+ %% Translate the body of the letrec.
+ Fail = {maybe_else_fail,1},
+ Lanno = lineno_anno(L, St1),
+ {Es1,St2} = maybe_match_exprs(Es0, #c_var{name=Fail}, St1),
+
+ %% Translate the 'else' clauses. Note that we must not put the clauses
+ %% as the top-level clauses in the fun, because all shawdowing variables
+ %% in a fun head will be renamed.
+ {Cs1,St3} = clauses(Cs0, St2),
+ Fc1 = fail_clause([FailVar], Lanno, c_tuple([#c_literal{val=else_clause},FailVar])),
+ FailCase = #icase{args=[V2],clauses=Cs1,fc=Fc1},
+ FailFunCs = [#iclause{pats=[V2],guard=[#c_literal{val=true}],
+ body=[FailCase]}],
+ Anno = #a{anno=[letrec_goto,no_inline|Lanno]},
+ Fc2 = fail_clause([FailVar], Lanno, #c_literal{val=never_fails}),
+ FailFun = #ifun{id=[],vars=[V1],
+ clauses=FailFunCs,
+ fc=Fc2},
+
+ %% Construct the letrec.
+ Letrec = #iletrec{anno=Anno,defs=[{Fail,FailFun}],body=Es1},
+ {Letrec,[],St3};
expr({'if',L,Cs0}, St0) ->
{Cs1,St1} = clauses(Cs0, St0),
Lanno = lineno_anno(L, St1),
@@ -717,6 +829,8 @@ expr({'catch',L,E0}, St0) ->
Lanno = lineno_anno(L, St1),
{#icatch{anno=#a{anno=Lanno},body=Eps ++ [E1]},[],St1};
expr({'fun',L,{function,F,A}}, St0) ->
+ %% Generate a new name for eta conversion of local funs (`fun local/123`)
+ %% in case `no_shared_fun_wrappers` is given.
{Fname,St1} = new_fun_name(St0),
Lanno = full_anno(L, St1),
Id = {0,0,Fname},
@@ -734,10 +848,20 @@ expr({named_fun,L,'_',Cs}, St) ->
fun_tq(Cs, L, St, unnamed);
expr({named_fun,L,Name,Cs}, St) ->
fun_tq(Cs, L, St, {named,Name});
-expr({call,L,{remote,_,M,F},As0}, St0) ->
- {[M1,F1|As1],Aps,St1} = safe_list([M,F|As0], St0),
+expr({call,L,{remote,_,M0,F0},As0}, St0) ->
+ {[M1,F1|As1],Aps,St1} = safe_list([M0,F0|As0], St0),
Anno = full_anno(L, St1),
- {#icall{anno=#a{anno=Anno},module=M1,name=F1,args=As1},Aps,St1};
+ case {M1,F1,As1} of
+ {#c_literal{val=erlang},
+ #c_literal{val=error},
+ [#c_tuple{es=[#c_literal{val=badrecord},_]}=Tuple]} ->
+ Fail = #iprimop{anno=#a{anno=Anno},
+ name=#c_literal{val=match_fail},
+ args=[Tuple]},
+ {Fail,Aps,St1};
+ {_,_,_} ->
+ {#icall{anno=#a{anno=Anno},module=M1,name=F1,args=As1},Aps,St1}
+ end;
expr({call,Lc,{atom,Lf,F},As0}, St0) ->
{As1,Aps,St1} = safe_list(As0, St0),
Op = #c_var{anno=lineno_anno(Lf, St1),name={F,length(As1)}},
@@ -1162,7 +1286,7 @@ is_iexprs_small_2(_, Threshold) ->
%% record whereas c_literal should not have a wrapped annotation
expr_bin(Es0, Anno, St0) ->
- Es1 = [bin_element(E) || E <- Es0],
+ Es1 = bin_elements(Es0, 1),
case constant_bin(Es1) of
error ->
case expr_bin_1(Es1, St0) of
@@ -1202,12 +1326,12 @@ bitstrs([E0|Es0], St0) ->
bitstrs([], St) ->
{[],[],St}.
-bitstr({bin_element,Line,{string,_,S},{integer,_,8},_}, St) ->
- bitstrs(bin_expand_string(S, Line, 0, 0, []), St);
-bitstr({bin_element,Line,{string,_,[]},Sz0,Ts}, St0) ->
+bitstr({bin_element,{sl,_,Line},{string,_,S},{integer,_,8},_}, St) ->
+ bitstrs(bin_expand_string(S, {sl,0,Line}, 0, 0, []), St);
+bitstr({bin_element,{sl,_,Line},{string,_,[]},Sz0,Ts}, St0) ->
%% Empty string. We must make sure that the type is correct.
{[#c_bitstr{size=Sz}],Eps0,St1} =
- bitstr({bin_element,Line,{char,Line,0},Sz0,Ts}, St0),
+ bitstr({bin_element,{sl,0,Line},{char,Line,0},Sz0,Ts}, St0),
%% At this point, the type is either a correct literal or
%% an expression.
@@ -1234,12 +1358,12 @@ bitstr({bin_element,Line,{string,_,[]},Sz0,Ts}, St0) ->
Eps = Eps0 ++ Eps1,
{[],Eps,St2}
end;
-bitstr({bin_element,Line,{string,_,S},Sz0,Ts}, St0) ->
- {[Bitstr],Eps,St1} = bitstr({bin_element,Line,{char,Line,0},Sz0,Ts}, St0),
+bitstr({bin_element,{sl,_,Line},{string,_,S},Sz0,Ts}, St0) ->
+ {[Bitstr],Eps,St1} = bitstr({bin_element,{sl,0,Line},{char,Line,0},Sz0,Ts}, St0),
Es = [Bitstr#c_bitstr{val=#c_literal{anno=full_anno(Line, St1),val=C}} ||
C <- S],
{Es,Eps,St1};
-bitstr({bin_element,Line,E0,Size0,[Type,{unit,Unit}|Flags]}, St0) ->
+bitstr({bin_element,{sl,Seg,Line},E0,Size0,[Type,{unit,Unit}|Flags]}, St0) ->
{E1,Eps0,St1} = safe(E0, St0),
{Size1,Eps1,St2} = safe(Size0, St1),
Eps = Eps0 ++ Eps1,
@@ -1263,16 +1387,30 @@ bitstr({bin_element,Line,E0,Size0,[Type,{unit,Unit}|Flags]}, St0) ->
#c_literal{val=all} -> ok;
_ -> throw({bad_binary,Eps,St2})
end,
- {[#c_bitstr{anno=lineno_anno(Line, St2),
+ Anno0 = lineno_anno(Line, St2),
+
+ %% We will add a 'segment' annotation to segments that could
+ %% fail. There is no need to add it to literal segments of fixed
+ %% sized. The annotation will be used by the runtime system to
+ %% provide extended error information if construction of the
+ %% binary fails.
+ Anno = if Seg =:= 0 ->
+ Anno0;
+ true ->
+ [{segment,Seg}|Anno0]
+ end,
+
+ {[#c_bitstr{anno=Anno,
val=E1,size=Size1,
unit=#c_literal{val=Unit},
type=#c_literal{val=Type},
flags=#c_literal{val=Flags}}],
Eps,St2}.
-bin_element({bin_element,Line,Expr,Size0,Type0}) ->
+bin_elements([{bin_element,Line,Expr,Size0,Type0}|Es], Seg) ->
{Size,Type} = make_bit_type(Line, Size0, Type0),
- {bin_element,Line,Expr,Size,Type}.
+ [{bin_element,{sl,Seg,Line},Expr,Size,Type}|bin_elements(Es, Seg+1)];
+bin_elements([], _) -> [].
make_bit_type(Line, default, Type0) ->
case erl_bits:set_bit_type(default, Type0) of
@@ -1392,8 +1530,12 @@ bin_expand_string([H|T], Line, Val, Size, Last) ->
bin_expand_string([], Line, Val, Size, Last) ->
[make_combined(Line, Val, Size) | Last].
-make_combined(Line, Val, Size) ->
- {bin_element,Line,{integer,Line,Val},
+make_combined(SegLine, Val, Size) ->
+ Line = case SegLine of
+ {sl,_,Line0} -> Line0;
+ _ -> SegLine
+ end,
+ {bin_element,SegLine,{integer,Line,Val},
{integer,Line,Size},
[integer,{unit,1},unsigned,big]}.
@@ -1777,6 +1919,33 @@ force_novars(#c_map{}=Bin, St) -> {Bin,[],St};
force_novars(Ce, St) ->
force_safe(Ce, St).
+
+%% safe_list(Expr, State) -> {Safe,[PreExpr],State}.
+%% Generate an internal safe expression for a list of
+%% expressions.
+
+safe_list(Es, St0) ->
+ {Vs,Eps0,St} =
+ foldr(fun (E, {Ces,Eps,Sti0}) ->
+ {Ce,Ep,Sti1} = safe(E, Sti0),
+ case Eps of
+ [[#iexprs{bodies=Bs}]|T] ->
+ %% A cons within a cons.
+ {[Ce|Ces],[Ep|Bs]++T,Sti1};
+ _ ->
+ {[Ce|Ces],[Ep|Eps],Sti1}
+ end
+ end, {[],[],St0}, Es),
+ case [Ep || [_|_]=Ep <- Eps0] of
+ [] ->
+ {Vs,[],St};
+ [Ep] ->
+ {Vs,Ep,St};
+ [_|_]=Eps ->
+ %% Two or more bodies. They see the same variables.
+ {Vs,[#iexprs{bodies=Eps}],St}
+ end.
+
%% safe(Expr, State) -> {Safe,[PreExpr],State}.
%% Generate an internal safe expression. These are simples without
%% binaries which can fail. At this level we do not need to do a
@@ -1787,12 +1956,6 @@ safe(E0, St0) ->
{Se,Sps,St2} = force_safe(E1, St1),
{Se,Eps ++ Sps,St2}.
-safe_list(Es, St) ->
- foldr(fun (E, {Ces,Esp,St0}) ->
- {Ce,Ep,St1} = safe(E, St0),
- {[Ce|Ces],Ep ++ Esp,St1}
- end, {[],[],St}, Es).
-
force_safe(#imatch{pat=P,arg=E}=Imatch, St0) ->
{Le,Lps0,St1} = force_safe(E, St0),
Lps = Lps0 ++ [Imatch#imatch{arg=Le}],
@@ -2092,7 +2255,12 @@ new_vars_1(0, _, St, Vs) -> {Vs,St}.
bad_generator(Ps, Generator, Arg) ->
Anno = get_anno(Arg),
Tuple = ann_c_tuple(Anno, [#c_literal{val=bad_generator},Generator]),
- fail_clause(Ps, Anno, Tuple).
+ Call = #icall{anno=#a{anno=Anno}, %Must have an #a{}
+ module=#c_literal{anno=Anno,val=erlang},
+ name=#c_literal{anno=Anno,val=error},
+ args=[Tuple]},
+ #iclause{anno=#a{anno=[compiler_generated]},
+ pats=Ps,guard=[],body=[Call]}.
function_clause(Ps, LineAnno) ->
fail_clause(Ps, LineAnno,
@@ -2129,7 +2297,155 @@ annotate_cons(A, H, T, #core{dialyzer=Dialyzer}) ->
ann_c_cons(A, H, T)
end.
-ubody(B, St) -> uexpr(B, [], St).
+%%%
+%%% Here follows an abstract data structure to help us handle Erlang's
+%%% implicit matching that occurs when a variable is bound more than
+%%% once:
+%%%
+%%% X = Expr1(),
+%%% X = Expr2()
+%%%
+%%% What is implicit in Erlang, must be explicit in Core Erlang; that
+%%% is, repeated variables must be eliminated and explicit matching
+%%% must be added. For simplicity, examples that follow will be given
+%%% in Erlang and not in Core Erlang. Here is how the example can be
+%%% rewritten in Erlang to eliminate the repeated variable:
+%%%
+%%% X = Expr1(),
+%%% X1 = Expr2(),
+%%% if
+%%% X1 =:= X -> X;
+%%% true -> error({badmatch,X1})
+%%% end
+%%%
+%%% To implement the renaming, keeping a set of the variables that
+%%% have been bound so far is **almost** sufficient. When a variable
+%%% in the set is bound a again, it will be renamed and a `case` with
+%%% guard test will be added.
+%%%
+%%% Here is another example:
+%%%
+%%% (X=A) + (X=B)
+%%%
+%%% Note that the operands for a binary operands are allowed to be
+%%% evaluated in any order. Therefore, variables bound on the left
+%%% hand side must not referenced on the right hand side, and vice
+%%% versa. If a variable is bound on both sides, it must be bound
+%%% to the same value.
+%%%
+%%% Using the simple scheme of keeping track of known variables,
+%%% the example can be rewritten like this:
+%%%
+%%% X = A,
+%%% X1 = B,
+%%% if
+%%% X1 =:= X -> ok;
+%%% true -> error({badmatch,X1})
+%%% end,
+%%% X + X1
+%%%
+%%% However, this simple scheme of keeping all previously bound variables in
+%%% a set breaks down for this example:
+%%%
+%%% (X=A) + fun() -> X = B end()
+%%%
+%%% The rewritten code would be:
+%%%
+%%% X = A,
+%%% Tmp = fun() ->
+%%% X1 = B,
+%%% if
+%%% X1 =:= X -> ok;
+%%% true -> error({badmatch,X1})
+%%% end
+%%% end(),
+%%% X + Tmp
+%%%
+%%% That is wrong, because the binding of `X` created on the left hand
+%%% side of `+` must not be seen inside the fun. The correct rewrite
+%%% would be like this:
+%%%
+%%% X = A,
+%%% Tmp = fun() ->
+%%% X1 = B
+%%% end(),
+%%% X + Tmp
+%%%
+%%% To correctly rewrite fun bodies, we will need to keep addtional
+%%% information in a record so that we can remove `X` from the known
+%%% variables when rewriting the body of the fun.
+%%%
+
+-record(known, {base=[],ks=[],prev_ks=[]}).
+
+known_init() ->
+ #known{}.
+
+%% known_get(#known{}) -> [KnownVar].
+%% Get the currently known variables.
+
+known_get(#known{ks=Ks}) ->
+ Ks.
+
+%% known_start_group(#known{}) -> #known{}.
+
+known_start_group(#known{base=OldBase,ks=Ks,prev_ks=PrevKs}=K) ->
+ K#known{base=[Ks|OldBase],prev_ks=[[]|PrevKs]}.
+
+%% known_end_body(#known{}) -> #known{}.
+
+known_end_body(#known{ks=Ks,prev_ks=[_|OldPrevKs]}=K) ->
+ K#known{prev_ks=[Ks|OldPrevKs]}.
+
+%% known_end_group(#known{}) -> #known{}.
+%% Consolidate the known variables after having processed the
+%% last body in a group of bodies that see the same bindings.
+
+known_end_group(#known{base=[_|OldBase],prev_ks=[_|OldPrevKs]}=K) ->
+ K#known{base=OldBase,prev_ks=OldPrevKs}.
+
+%% known_union(#known{}, KnownVarsSet) -> #known{}.
+%% Update the known variables to be the union of the previous
+%% known variables and the set KnownVarsSet.
+
+known_union(#known{ks=Ks}=K, Set) ->
+ K#known{ks=union(Ks, Set)}.
+
+%% known_bind(#known{}, BoundVarsSet) -> #known{}.
+%% Add variables that are known to be bound in the current
+%% body.
+
+known_bind(#known{prev_ks=[PrevKs0|OldPrevKs]}=K, BoundVs) ->
+ PrevKs = subtract(PrevKs0, BoundVs),
+ K#known{prev_ks=[PrevKs|OldPrevKs]};
+known_bind(#known{}=K, _) -> K.
+
+%% known_in_fun(#known{}) -> #known{}.
+%% Update the known variables to only the set of variables that
+%% should be known when entering the fun.
+
+known_in_fun(#known{base=[BaseKs|_],ks=Ks0,prev_ks=[PrevKs|_]}=K) ->
+ %% Within a group of bodies that see the same bindings, calculate
+ %% the known variables for a fun. Example:
+ %%
+ %% A = 1,
+ %% {X = 2, fun() -> X = 99, A = 1 end()}.
+ %%
+ %% In this example:
+ %%
+ %% BaseKs = ['A'], Ks0 = ['A','X'], PrevKs = ['A','X']
+ %%
+ %% Thus, only `A` is known when entering the fun.
+
+ Ks = union(BaseKs, subtract(Ks0, PrevKs)),
+ K#known{base=[],ks=Ks,prev_ks=[]};
+known_in_fun(#known{}=K) -> K.
+
+%%%
+%%% End of abstract data type for known variables.
+%%%
+
+ubody(B, St) -> uexpr(B, known_init(), St).
%% ufun_clauses([Lclause], [KnownVar], State) -> {[Lclause],State}.
@@ -2189,15 +2505,41 @@ do_uclause(#iclause{anno=A0,pats=Ps0,guard=G0,body=B0}, Ks0, St0) ->
false ->
{Pg0,A0}
end,
- Pu = union(Pus, intersection(Pvs, Ks0)),
+ Pu = union(Pus, intersection(Pvs, known_get(Ks0))),
Pn = subtract(Pvs, Pu),
- Ks1 = union(Pn, Ks0),
+ Ks1 = known_union(Ks0, Pn),
{G1,St2} = uguard(Pg, G0, Ks1, St1),
Gu = used_in_any(G1),
Gn = new_in_any(G1),
- Ks2 = union(Gn, Ks1),
- {B1,St3} = uexprs(B0, Ks2, St2),
- Used = intersection(union([Pu,Gu,used_in_any(B1)]), Ks0),
+ Ks2 = known_union(Ks1, Gn),
+
+ %% Consider this example:
+ %%
+ %% {X = A,
+ %% begin X = B, fun() -> X = C end() end}.
+ %%
+ %% At this point it has been rewritten to something similar
+ %% like this (the fun body has not been rewritten yet):
+ %%
+ %% {X = A,
+ %% begin
+ %% X1 = B,
+ %% if
+ %% X1 =:= X -> ok;
+ %% true -> error({badmatch,X1})
+ %% end,
+ %% fun() -> ... end() end
+ %% end}.
+ %%
+ %% In this example, the variable `X` is a known variable that must
+ %% be passed into the fun body (because of `X = B` above). To ensure
+ %% that it is, we must call known_bind/2 with the variables used
+ %% in the guard (`X1` and `X`; any variables used must surely be
+ %% bound).
+
+ Ks3 = known_bind(Ks2, Gu),
+ {B1,_,St3} = uexprs(B0, Ks3, St2),
+ Used = intersection(union([Pu,Gu,used_in_any(B1)]), known_get(Ks0)),
New = union([Pn,Gn,new_in_any(B1)]),
{#iclause{anno=A,pats=Ps1,guard=G1,body=B1},Pvs,Used,New,St3}.
@@ -2222,10 +2564,31 @@ uguard(Pg, Gs0, Ks, St0) ->
St3}
end, {Gs0,St0}, Pg),
%%ok = io:fwrite("core ~w: ~p~n", [?LINE,Gs3]),
- uexprs(Gs3, Ks, St5).
+ {Gs4,_,St6} = uexprs(Gs3, Ks, St5),
+ {Gs4,St6}.
+
+%% ulinearize_exprs([[Kexpr]], [Kexpr]) -> [Kexpr].
+%% Linearize a group of bodies to a linear list of Kernel expressions
+%% while inserting markers for the end of each body and the group
+%% itself.
+
+ulinearize_exprs([Bs|Bss], Les) ->
+ [known_end_body|Bs] ++ ulinearize_exprs(Bss, Les);
+ulinearize_exprs([], Les) ->
+ [known_end_group|Les].
%% uexprs([Kexpr], [KnownVar], State) -> {[Kexpr],State}.
+uexprs([known_end_body|Les], Ks0, St0) ->
+ Ks1 = known_end_body(Ks0),
+ uexprs(Les, Ks1, St0);
+uexprs([known_end_group|Les], Ks0, St0) ->
+ Ks1 = known_end_group(Ks0),
+ uexprs(Les, Ks1, St0);
+uexprs([#iexprs{bodies=Es0}|Les], Ks0, St0) ->
+ Es = ulinearize_exprs(Es0, Les),
+ Ks1 = known_start_group(Ks0),
+ uexprs(Es, Ks1, St0);
uexprs([#imatch{anno=A,pat=P0,arg=Arg,fc=Fc}|Les], Ks, St0) ->
case upat_is_new_var(P0, Ks) of
true ->
@@ -2244,18 +2607,54 @@ uexprs([#imatch{anno=A,pat=P0,arg=Arg,fc=Fc}|Les], Ks, St0) ->
uexprs([#icase{anno=A,args=[Arg],
clauses=[Mc],fc=Fc}], Ks, St0)
end;
-uexprs([Le0|Les0], Ks, St0) ->
- {Le1,St1} = uexpr(Le0, Ks, St0),
- {Les1,St2} = uexprs(Les0, union((get_anno(Le1))#a.ns, Ks), St1),
- {[Le1|Les1],St2};
-uexprs([], _, St) -> {[],St}.
+uexprs([#iset{}|_]=Les0, Ks0, St0) ->
+ uexprs_iset(Les0, [], Ks0, St0);
+uexprs([Le0|Les0], Ks0, St0) ->
+ {Le1,St1} = uexpr(Le0, Ks0, St0),
+ {Les1,Ks,St2} = uexprs(Les0, known_union(Ks0, (get_anno(Le1))#a.ns), St1),
+ {[Le1|Les1],Ks,St2};
+uexprs([], Ks, St) -> {[],Ks,St}.
+
+%% Since the set of known variables can grow quite large, try minimize
+%% the number of union operations on it.
+uexprs_iset([#iset{anno=A0,var=V,arg=Arg0}=Le0|Les0], New0, Ks0, St0) ->
+ case uexpr_need_known(Arg0) of
+ true ->
+ Ks1 = known_union(Ks0, New0),
+ {Le1,St1} = uexpr(Le0, Ks1, St0),
+ New = (get_anno(Le1))#a.ns,
+ {Les1,Ks,St2} = uexprs_iset(Les0, New, Ks1, St1),
+ {[Le1|Les1],Ks,St2};
+ false ->
+ %% We don't need the set of known variables when processing
+ %% Arg0, so we can postpone the call to known_union/2. This
+ %% will save time for functions with a huge number of variables.
+ {Arg,St1} = uexpr(Arg0, none, St0),
+ #a{us=Us,ns=Ns} = get_anno(Arg),
+ A = A0#a{us=del_element(V#c_var.name, Us),
+ ns=add_element(V#c_var.name, Ns)},
+ Le1 = Le0#iset{anno=A,arg=Arg},
+ New = union(New0, A#a.ns),
+ {Les1,Ks,St2} = uexprs_iset(Les0, New, Ks0, St1),
+ {[Le1|Les1],Ks,St2}
+ end;
+uexprs_iset(Les, New, Ks0, St) ->
+ Ks = known_union(Ks0, New),
+ uexprs(Les, Ks, St).
+
+uexpr_need_known(#icall{}) -> false;
+uexpr_need_known(#iapply{}) -> false;
+uexpr_need_known(#ibinary{}) -> false;
+uexpr_need_known(#iprimop{}) -> false;
+uexpr_need_known(#c_literal{}) -> false;
+uexpr_need_known(Core) -> not is_simple(Core).
%% upat_is_new_var(Pattern, [KnownVar]) -> true|false.
%% Test whether the pattern is a single, previously unknown
%% variable.
upat_is_new_var(#c_var{name=V}, Ks) ->
- not is_element(V, Ks);
+ not is_element(V, known_get(Ks));
upat_is_new_var(_, _) ->
false.
@@ -2283,7 +2682,7 @@ uexpr(#iletrec{anno=A,defs=Fs0,body=B0}, Ks, St0) ->
{F1,S1} = uexpr(F0, Ks, S0),
{{Name,F1},S1}
end, St0, Fs0),
- {B1,St2} = uexprs(B0, Ks, St1),
+ {B1,_,St2} = uexprs(B0, Ks, St1),
Used = used_in_any(map(fun ({_,F}) -> F end, Fs1) ++ B1),
{#iletrec{anno=A#a{us=Used,ns=[]},defs=Fs1,body=B1},St2};
uexpr(#icase{anno=#a{anno=Anno}=A,args=As0,clauses=Cs0,fc=Fc0}, Ks, St0) ->
@@ -2298,7 +2697,7 @@ uexpr(#icase{anno=#a{anno=Anno}=A,args=As0,clauses=Cs0,fc=Fc0}, Ks, St0) ->
end,
{#icase{anno=A#a{us=Used,ns=New},args=As1,clauses=Cs1,fc=Fc1},St3};
uexpr(#ifun{anno=A0,id=Id,vars=As,clauses=Cs0,fc=Fc0,name=Name}=Fun0, Ks0, St0) ->
- {Fun1,St2} = case Ks0 of
+ {Fun1,St2} = case known_get(Ks0) of
[] ->
{Fun0,St0};
[_|_] ->
@@ -2309,12 +2708,13 @@ uexpr(#ifun{anno=A0,id=Id,vars=As,clauses=Cs0,fc=Fc0,name=Name}=Fun0, Ks0, St0)
Avs = lit_list_vars(As),
Ks1 = case Name of
unnamed -> Ks0;
- {named,FName} -> union(subtract([FName], Avs), Ks0)
+ {named,FName} -> known_union(Ks0, subtract([FName], Avs))
end,
- Ks2 = union(Avs, Ks1),
- {Cs3,St3} = ufun_clauses(Cs2, Ks2, St2),
- {Fc1,St4} = ufun_clause(Fc0, Ks2, St3),
- Used = subtract(intersection(used_in_any(Cs3), Ks1), Avs),
+ Ks2 = known_union(Ks1, Avs),
+ KnownInFun = known_in_fun(Ks2),
+ {Cs3,St3} = ufun_clauses(Cs2, KnownInFun, St2),
+ {Fc1,St4} = ufun_clause(Fc0, KnownInFun, St3),
+ Used = subtract(intersection(used_in_any(Cs3), known_get(Ks1)), Avs),
A1 = A0#a{us=Used,ns=[]},
{#ifun{anno=A1,id=Id,vars=As,clauses=Cs3,fc=Fc1,name=Name},St4};
uexpr(#iapply{anno=A,op=Op,args=As}, _, St) ->
@@ -2331,15 +2731,15 @@ uexpr(#itry{anno=A,args=As0,vars=Vs,body=Bs0,evars=Evs,handler=Hs0}, Ks, St0) ->
%% variables bound in the argument (the code between the 'try' and
%% the 'of' keywords) are exported to the body (the code following
%% the 'of' keyword).
- {As1,St1} = uexprs(As0, Ks, St0),
- ArgKs = union(Ks, new_in_any(As1)),
- {Bs1,St2} = uexprs(Bs0, ArgKs, St1),
- {Hs1,St3} = uexprs(Hs0, Ks, St2),
- Used = intersection(used_in_any(Bs1++Hs1++As1), Ks),
+ {As1,_,St1} = uexprs(As0, Ks, St0),
+ ArgKs = known_union(Ks, new_in_any(As1)),
+ {Bs1,_,St2} = uexprs(Bs0, ArgKs, St1),
+ {Hs1,_,St3} = uexprs(Hs0, Ks, St2),
+ Used = intersection(used_in_any(Bs1++Hs1++As1), known_get(Ks)),
{#itry{anno=A#a{us=Used,ns=[]},
args=As1,vars=Vs,body=Bs1,evars=Evs,handler=Hs1},St3};
uexpr(#icatch{anno=A,body=Es0}, Ks, St0) ->
- {Es1,St1} = uexprs(Es0, Ks, St0),
+ {Es1,_,St1} = uexprs(Es0, Ks, St0),
{#icatch{anno=A#a{us=used_in_any(Es1)},body=Es1},St1};
uexpr(#ireceive1{anno=A,clauses=Cs0}, Ks, St0) ->
{Cs1,St1} = uclauses(Cs0, Ks, St0),
@@ -2349,7 +2749,7 @@ uexpr(#ireceive2{anno=A,clauses=Cs0,timeout=Te0,action=Tes0}, Ks, St0) ->
%% Te0 will never generate new variables.
{Te1,St1} = uexpr(Te0, Ks, St0),
{Cs1,St2} = uclauses(Cs0, Ks, St1),
- {Tes1,St3} = uexprs(Tes0, Ks, St2),
+ {Tes1,_,St3} = uexprs(Tes0, Ks, St2),
Used = union([used_in_any(Cs1),used_in_any(Tes1),(get_anno(Te1))#a.us]),
New = case Cs1 of
[] -> new_in_any(Tes1);
@@ -2358,7 +2758,7 @@ uexpr(#ireceive2{anno=A,clauses=Cs0,timeout=Te0,action=Tes0}, Ks, St0) ->
{#ireceive2{anno=A#a{us=Used,ns=New},
clauses=Cs1,timeout=Te1,action=Tes1},St3};
uexpr(#iprotect{anno=A,body=Es0}, Ks, St0) ->
- {Es1,St1} = uexprs(Es0, Ks, St0),
+ {Es1,_,St1} = uexprs(Es0, Ks, St0),
Used = used_in_any(Es1),
{#iprotect{anno=A#a{us=Used},body=Es1},St1}; %No new variables escape!
uexpr(#ibinary{anno=A,segments=Ss}, _, St) ->
@@ -2383,7 +2783,7 @@ upattern(#c_var{name='_'}, _, St0) ->
{New,St1} = new_var_name(St0),
{#c_var{name=New},[],[New],[],St1};
upattern(#c_var{name=V}=Var, Ks, St0) ->
- case is_element(V, Ks) of
+ case is_element(V, known_get(Ks)) of
true ->
{N,St1} = new_var_name(St0),
New = #c_var{name=N},
@@ -2398,7 +2798,7 @@ upattern(#c_var{name=V}=Var, Ks, St0) ->
end;
upattern(#c_cons{hd=H0,tl=T0}=Cons, Ks, St0) ->
{H1,Hg,Hv,Hu,St1} = upattern(H0, Ks, St0),
- {T1,Tg,Tv,Tu,St2} = upattern(T0, union(Hv, Ks), St1),
+ {T1,Tg,Tv,Tu,St2} = upattern(T0, known_union(Ks, Hv), St1),
{Cons#c_cons{hd=H1,tl=T1},Hg ++ Tg,union(Hv, Tv),union(Hu, Tu),St2};
upattern(#c_tuple{es=Es0}=Tuple, Ks, St0) ->
{Es1,Esg,Esv,Eus,St1} = upattern_list(Es0, Ks, St0),
@@ -2408,7 +2808,7 @@ upattern(#imap{es=Es0}=Map, Ks, St0) ->
{Map#imap{es=Es1},Esg,Esv,Eus,St1};
upattern(#imappair{op=#c_literal{val=exact},key=K0,val=V0}=Pair,Ks,St0) ->
{V,Vg,Vn,Vu,St1} = upattern(V0, Ks, St0),
- {K,St2} = uexprs(K0, Ks, St1),
+ {K,_,St2} = uexprs(K0, Ks, St1),
Ku = used_in_expr(K),
{Pair#imappair{key=K,val=V},Vg,Vn,union(Ku, Vu),St2};
upattern(#ibinary{segments=Es0}=Bin, Ks, St0) ->
@@ -2416,7 +2816,7 @@ upattern(#ibinary{segments=Es0}=Bin, Ks, St0) ->
{Bin#ibinary{segments=Es1},Esg,Esv,Eus,St1};
upattern(#c_alias{var=V0,pat=P0}=Alias, Ks, St0) ->
{V1,Vg,Vv,Vu,St1} = upattern(V0, Ks, St0),
- {P1,Pg,Pv,Pu,St2} = upattern(P0, union(Vv, Ks), St1),
+ {P1,Pg,Pv,Pu,St2} = upattern(P0, known_union(Ks, Vv), St1),
{Alias#c_alias{var=V1,pat=P1},Vg ++ Pg,union(Vv, Pv),union(Vu, Pu),St2};
upattern(Other, _, St) -> {Other,[],[],[],St}. %Constants
@@ -2425,7 +2825,7 @@ upattern(Other, _, St) -> {Other,[],[],[],St}. %Constants
upattern_list([P0|Ps0], Ks, St0) ->
{P1,Pg,Pv,Pu,St1} = upattern(P0, Ks, St0),
- {Ps1,Psg,Psv,Psu,St2} = upattern_list(Ps0, union(Pv, Ks), St1),
+ {Ps1,Psg,Psv,Psu,St2} = upattern_list(Ps0, known_union(Ks, Pv), St1),
{[P1|Ps1],Pg ++ Psg,union(Pv, Psv),union(Pu, Psu),St2};
upattern_list([], _, St) -> {[],[],[],[],St}.
@@ -2452,7 +2852,7 @@ upat_bin(Es0, Ks, St0) ->
%% {[Pat],[GuardTest],[NewVar],[UsedVar],State}.
upat_bin([P0|Ps0], Ks, Bs, St0) ->
{P1,Pg,Pv,Pu,Bs1,St1} = upat_element(P0, Ks, Bs, St0),
- {Ps1,Psg,Psv,Psu,St2} = upat_bin(Ps0, union(Pv, Ks), Bs1, St1),
+ {Ps1,Psg,Psv,Psu,St2} = upat_bin(Ps0, known_union(Ks, Pv), Bs1, St1),
{[P1|Ps1],Pg ++ Psg,union(Pv, Psv),union(Pu, Psu),St2};
upat_bin([], _, _, St) -> {[],[],[],[],St}.
@@ -2475,16 +2875,16 @@ upat_element(#ibitstr{val=H0,size=Sz0}=Seg, Ks, Bs0, St0) ->
case Sz0 of
[#c_var{name=Vname}] ->
{Sz1,Us} = rename_bitstr_size(Vname, Bs0),
- {Sz2,St2} = uexprs([Sz1], Ks, St1),
+ {Sz2,_,St2} = uexprs([Sz1], Ks, St1),
{Seg#ibitstr{val=H1,size=Sz2},Hg,Hv,Us,Bs1,St2};
[#c_literal{}] ->
- {Sz1,St2} = uexprs(Sz0, Ks, St1),
+ {Sz1,_,St2} = uexprs(Sz0, Ks, St1),
Us = [],
{Seg#ibitstr{val=H1,size=Sz1},Hg,Hv,Us,Bs1,St2};
Expr when is_list(Expr) ->
Sz1 = [#iset{var=#c_var{name=Old},arg=#c_var{name=New}} ||
{Old,New} <- Bs0] ++ Expr,
- {Sz2,St2} = uexprs(Sz1, Ks, St1),
+ {Sz2,_,St2} = uexprs(Sz1, Ks, St1),
Us = used_in_expr(Sz2),
{Seg#ibitstr{val=H1,size=Sz2},Hg,Hv,Us,Bs1,St2}
end.
@@ -2558,7 +2958,7 @@ ren_pats([], _Ks, {_,_}=Subs, St) ->
ren_pat(#c_var{name='_'}=P, _Ks, Subs, St) ->
{P,Subs,St};
ren_pat(#c_var{name=V}=Old, Ks, {Isub0,Osub0}=Subs, St0) ->
- case member(V, Ks) of
+ case member(V, known_get(Ks)) of
true ->
case ren_is_subst(V, Osub0) of
{yes,New} ->
@@ -2630,9 +3030,19 @@ ren_is_subst(_V, []) -> no.
%% from case/receive. In subblocks/clauses the AfterVars of the block
%% are just the exported variables.
-cbody(B0, St0) ->
+cbody(B0, Nifs, St0) ->
{B1,_,_,St1} = cexpr(B0, [], St0),
- {B1,St1}.
+ B2 = case sets:is_element(St1#core.function,Nifs) of
+ true ->
+ #c_fun{body=Body0} = B1,
+ Body1 = #c_seq{arg=#c_primop{name=#c_literal{val=nif_start},
+ args=[]},
+ body=Body0},
+ B1#c_fun{body=Body1};
+ false ->
+ B1
+ end,
+ {B2,St1}.
%% cclause(Lclause, [AfterVar], State) -> {Cclause,State}.
%% The AfterVars are the exported variables.
@@ -2916,8 +3326,7 @@ c_add_dummy_export(C, [], St) ->
%%% primop 'recv_wait_timeout'(Timeout)
%%% in case TimedOut of
%%% <'true'> when 'true' ->
-%%% do primop 'timeout'()
-%%% 'no_message'
+%%% 'no_message'
%%% <'false'> when 'true' ->
%%% apply 'recv$^0'/0()
%%% end
diff --git a/lib/compiler/src/v3_kernel.erl b/lib/compiler/src/v3_kernel.erl
index 79352e33ad..b2ddf1afd5 100644
--- a/lib/compiler/src/v3_kernel.erl
+++ b/lib/compiler/src/v3_kernel.erl
@@ -78,10 +78,9 @@
-export([module/2,format_error/1]).
-import(lists, [all/2,droplast/1,flatten/1,foldl/3,foldr/3,
- map/2,mapfoldl/3,member/2,
- keyfind/3,keyreplace/4,
- last/1,partition/2,reverse/1,
- sort/1,sort/2,splitwith/2]).
+ map/2,mapfoldl/3,member/2,keyfind/3,last/1,
+ partition/2,reverse/1,sort/1,sort/2,
+ splitwith/2]).
-import(ordsets, [add_element/2,intersection/2,
subtract/2,union/2,union/1]).
@@ -234,25 +233,19 @@ gexpr_test_add(Ke, St0) ->
%% expr(Cexpr, Sub, State) -> {Kexpr,[PreKexpr],State}.
%% Convert a Core expression, flattening it at the same time.
-expr(#c_var{anno=A0,name={Name,Arity}}=Fname, Sub, St) ->
- Vs = [#c_var{name=list_to_atom("V" ++ integer_to_list(V))} ||
- V <- integers(1, Arity)],
+expr(#c_var{anno=A,name={Name0,Arity}}=Fname, Sub, St) ->
case St#kern.no_shared_fun_wrappers of
false ->
- %% Generate a (possibly shared) wrapper function for calling
- %% this function.
- Wrapper0 = ["-fun.",atom_to_list(Name),"/",integer_to_list(Arity),"-"],
- Wrapper = list_to_atom(flatten(Wrapper0)),
- Id = {id,{0,0,Wrapper}},
- A = keyreplace(id, 1, A0, Id),
- Fun = #c_fun{anno=A,vars=Vs,body=#c_apply{anno=A,op=Fname,args=Vs}},
- expr(Fun, Sub, St);
+ Name = get_fsub(Name0, Arity, Sub),
+ {#k_local{anno=A,name=Name,arity=Arity},[],St};
true ->
%% For backward compatibility with OTP 22 and earlier,
%% use the pre-generated name for the fun wrapper.
%% There will be one wrapper function for each occurrence
%% of `fun F/A`.
- Fun = #c_fun{anno=A0,vars=Vs,body=#c_apply{anno=A0,op=Fname,args=Vs}},
+ Vs = [#c_var{name=list_to_atom("V" ++ integer_to_list(V))} ||
+ V <- integers(1, Arity)],
+ Fun = #c_fun{anno=A,vars=Vs,body=#c_apply{anno=A,op=Fname,args=Vs}},
expr(Fun, Sub, St)
end;
expr(#c_var{anno=A,name=V}, Sub, St) ->
@@ -337,7 +330,7 @@ expr(#c_call{anno=A,module=M0,name=F0,args=Cargs}, Sub, St0) ->
{#k_call{anno=A,op=Remote,args=Kargs},Ap,St1};
error ->
%% Invalid call (e.g. M:42/3). Issue a warning, and let
- %% the generated code use the old explict apply.
+ %% the generated code use the old explicit apply.
St = add_warning(get_location(A), {failed,bad_call}, A, St0),
Call = #c_call{anno=A,
module=#c_literal{val=erlang},
@@ -392,57 +385,74 @@ letrec_local_function(A, Cfs, Cb, Sub0, St0) ->
%% Implement letrec with the single definition as a label and each
%% apply of it as a goto.
-letrec_goto([{#c_var{name={Label,0}},Cfail}], Cb, Sub0,
+letrec_goto([{#c_var{name={Label,_Arity}},Cfail}], Cb, Sub0,
#kern{labels=Labels0}=St0) ->
+ #c_fun{vars=FunVars,body=FunBody} = Cfail,
+ {Kvars,{FunSub,St1}} =
+ mapfoldl(fun(#c_var{anno=A,name=V}, {SubInt,StInt0}) ->
+ {New,StInt1} = new_var_name(StInt0),
+ {#k_var{anno=A,name=New},
+ {set_vsub(V, New, SubInt),
+ StInt1#kern{ds=sets:add_element(New, StInt1#kern.ds)}}}
+ end, {Sub0,St0}, FunVars),
Labels = sets:add_element(Label, Labels0),
- {Kb,Pb,St1} = body(Cb, Sub0, St0#kern{labels=Labels}),
- #c_fun{body=FailBody} = Cfail,
- {Kfail,Fb,St2} = body(FailBody, Sub0, St1),
+ {Kb,Pb,St2} = body(Cb, Sub0, St1#kern{labels=Labels}),
+ {Kfail,Fb,St3} = body(FunBody, FunSub, St2),
case {Kb,Kfail,Fb} of
{#k_goto{label=Label},#k_goto{}=InnerGoto,[]} ->
- {InnerGoto,Pb,St2};
+ {InnerGoto,Pb,St3};
{_,_,_} ->
- St3 = St2#kern{labels=Labels0},
- Alt = #k_letrec_goto{label=Label,first=Kb,then=pre_seq(Fb, Kfail)},
- {Alt,Pb,St3}
+ St4 = St3#kern{labels=Labels0},
+ Alt = #k_letrec_goto{label=Label,vars=Kvars,
+ first=Kb,then=pre_seq(Fb, Kfail)},
+ {Alt,Pb,St4}
end.
%% translate_match_fail(Arg, Sub, Anno, St) -> {Kexpr,[PreKexpr],State}.
-%% Translate a match_fail primop to a call erlang:error/1 or
-%% erlang:error/2.
+%% Translate match_fail primops, paying extra attention to `function_clause`
+%% errors that may have been inlined from other functions.
translate_match_fail(Arg, Sub, Anno, St0) ->
- Cargs = case {cerl:data_type(Arg),cerl:data_es(Arg)} of
- {tuple,[#c_literal{val=function_clause}|As]} ->
- translate_fc_args(As, Sub, St0);
- {_,_} ->
- [Arg]
- end,
- {Kargs,Ap,St} = atomic_list(Cargs, Sub, St0),
+ {Cargs,ExtraAnno,St1} =
+ case {cerl:data_type(Arg),cerl:data_es(Arg)} of
+ {tuple,[#c_literal{val=function_clause} | _]=As} ->
+ translate_fc_args(As, Sub, Anno, St0);
+ {tuple,[#c_literal{} | _]=As} ->
+ {As,[],St0};
+ {{atomic,Reason}, []} ->
+ {[#c_literal{val=Reason}],[],St0}
+ end,
+ {Kargs,Ap,St} = atomic_list(Cargs, Sub, St1),
Ar = length(Cargs),
- Call = #k_call{anno=Anno,
- op=#k_remote{mod=#k_literal{val=erlang},
- name=#k_literal{val=error},
- arity=Ar},args=Kargs},
- {Call,Ap,St}.
-
-translate_fc_args(As, Sub, #kern{fargs=Fargs}) ->
- case same_args(As, Fargs, Sub) of
- true ->
- %% The arguments for the `function_clause` exception are
- %% the arguments for the current function in the correct
- %% order.
- [#c_literal{val=function_clause},cerl:make_list(As)];
- false ->
- %% The arguments in the `function_clause` exception don't
- %% match the arguments for the current function because
- %% of inlining. Keeping the `function_clause`
- %% exception reason would be confusing. Rewrite it to
- %% a `case_clause` exception with the arguments in a
- %% tuple.
- [cerl:c_tuple([#c_literal{val=case_clause},
- cerl:c_tuple(As)])]
- end.
+ Primop = #k_bif{anno=ExtraAnno ++ Anno,
+ op=#k_internal{name=match_fail,arity=Ar},
+ args=Kargs},
+ {Primop,Ap,St}.
+
+translate_fc_args(As, Sub, Anno, #kern{fargs=Fargs}=St0) ->
+ {ExtraAnno, St} =
+ case same_args(As, Fargs, Sub) of
+ true ->
+ %% The arguments for the `function_clause` exception are
+ %% the arguments for the current function in the correct
+ %% order.
+ {[], St0};
+ false ->
+ %% The arguments in the `function_clause` exception don't
+ %% match the arguments for the current function because of
+ %% inlining.
+ case keyfind(function, 1, Anno) of
+ false ->
+ {Name, St1} = new_fun_name("inlined", St0),
+ {[{inlined,{Name,length(As) - 1}}], St1};
+ {_,{Name0,Arity}} ->
+ %% This is function that has been inlined.
+ Name1 = ["-inlined-",Name0,"/",Arity,"-"],
+ Name = list_to_atom(lists:concat(Name1)),
+ {[{inlined,{Name,Arity}}], St0}
+ end
+ end,
+ {As, ExtraAnno, St}.
same_args([#c_var{name=Cv}|Vs], [#k_var{name=Kv}|As], Sub) ->
get_vsub(Cv, Sub) =:= Kv andalso same_args(Vs, As, Sub);
@@ -559,10 +569,11 @@ match_vars(Ka, St0) ->
%% Transform application.
c_apply(A, #c_var{anno=Ra,name={F0,Ar}}, Cargs, Sub, #kern{labels=Labels}=St0) ->
- case Ar =:= 0 andalso sets:is_element(F0, Labels) of
+ case sets:is_element(F0, Labels) of
true ->
%% This is a goto to a label in a letrec_goto construct.
- {#k_goto{label=F0},[],St0};
+ {Kargs,Ap,St1} = atomic_list(Cargs, Sub, St0),
+ {#k_goto{label=F0,args=Kargs},Ap,St1};
false ->
{Kargs,Ap,St1} = atomic_list(Cargs, Sub, St0),
F1 = get_fsub(F0, Ar, Sub), %Has it been rewritten
@@ -1216,7 +1227,7 @@ expand_pat_lit(Lit, A) ->
%% comparing with the literal (that is especially true for binaries).
%%
%% It is important not to do this transformation for atomic literals
-%% (such as `[]`), since that would cause the test for an emtpy list
+%% (such as `[]`), since that would cause the test for an empty list
%% to be executed before the test for a nonempty list.
opt_single_valued(Ttcs) ->
@@ -1610,7 +1621,7 @@ new_clauses(Cs0, U, St) ->
%% will be grouped next.
%%
%% We also try to not create too large groups. If we have too many clauses,
-%% it is preferrable to match on 8-bits, select a branch, then match on the
+%% it is preferable to match on 8-bits, select a branch, then match on the
%% next 8-bits, rather than match on 16-bits which would force us to have
%% to select to many values at the same time, which would not be efficient.
%%
@@ -1991,11 +2002,21 @@ uexpr(#ifun{anno=A,vars=Vs,body=B0}, {break,Rs}, St0) ->
args=[Local|Fvs],
ret=Rs},
Free,add_local_function(Fun, St)};
-uexpr(#k_letrec_goto{anno=A,first=F0,then=T0}=MatchAlt, Br, St0) ->
+uexpr(#k_local{anno=A,name=Name,arity=Arity}, {break,Rs}, St) ->
+ Free = lit_list_vars(get_free(Name, Arity, St)),
+ Fvs = make_vars(Free),
+ FreeCount = length(Fvs),
+ Bif = #k_bif{anno=A,
+ op=#k_internal{name=make_fun,arity=FreeCount+1},
+ args=[#k_local{name=Name,arity=Arity+FreeCount} | Fvs],
+ ret=Rs},
+ {Bif,Free,St};
+uexpr(#k_letrec_goto{anno=A,vars=Vs,first=F0,then=T0}=MatchAlt, Br, St0) ->
Rs = break_rets(Br),
+ Ns = lit_list_vars(Vs),
{F1,Fu,St1} = ubody(F0, Br, St0),
{T1,Tu,St2} = ubody(T0, Br, St1),
- Used = union(Fu, Tu),
+ Used = subtract(union(Fu, Tu), Ns),
{MatchAlt#k_letrec_goto{anno=A,first=F1,then=T1,ret=Rs},Used,St2};
uexpr(Lit, {break,Rs0}, St0) ->
%% Transform literals to puts here.
@@ -2048,13 +2069,16 @@ break_rets(return) -> [].
%% bif_returns(Op, [Ret], State) -> {[Ret],State}.
-bif_returns(#k_remote{mod=M,name=N,arity=Ar}, Rs, St0) ->
- %%ok = io:fwrite("uexpr ~w:~p~n", [?LINE,{M,N,Ar,Rs}]),
- {Ns,St1} = new_vars(bif_vals(M, N, Ar) - length(Rs), St0),
- {Rs ++ Ns,St1};
+bif_returns(#k_internal{name=match_fail}, Rs, St) ->
+ %% This is only used for effect, and may have any number of returns.
+ {Rs,St};
bif_returns(#k_internal{name=N,arity=Ar}, Rs, St0) ->
%%ok = io:fwrite("uexpr ~w:~p~n", [?LINE,{N,Ar,Rs}]),
{Ns,St1} = new_vars(bif_vals(N, Ar) - length(Rs), St0),
+ {Rs ++ Ns,St1};
+bif_returns(#k_remote{mod=M,name=N,arity=Ar}, Rs, St0) ->
+ %%ok = io:fwrite("uexpr ~w:~p~n", [?LINE,{M,N,Ar,Rs}]),
+ {Ns,St1} = new_vars(bif_vals(M, N, Ar) - length(Rs), St0),
{Rs ++ Ns,St1}.
%% ensure_return_vars([Ret], State) -> {[Ret],State}.
diff --git a/lib/compiler/src/v3_kernel.hrl b/lib/compiler/src/v3_kernel.hrl
index 76987640e8..8d3e5dd7e7 100644
--- a/lib/compiler/src/v3_kernel.hrl
+++ b/lib/compiler/src/v3_kernel.hrl
@@ -56,8 +56,8 @@
-record(k_try_enter, {anno=[],arg,vars,body,evars,handler}).
-record(k_catch, {anno=[],body,ret=[]}).
--record(k_letrec_goto, {anno=[],label,first,then,ret=[]}).
--record(k_goto, {anno=[],label}).
+-record(k_letrec_goto, {anno=[],label,vars=[],first,then,ret=[]}).
+-record(k_goto, {anno=[],label,args=[]}).
-record(k_match, {anno=[],body,ret=[]}).
-record(k_alt, {anno=[],first,then}).
diff --git a/lib/compiler/src/v3_kernel_pp.erl b/lib/compiler/src/v3_kernel_pp.erl
index 2c2bd498a9..d1b075ce0f 100644
--- a/lib/compiler/src/v3_kernel_pp.erl
+++ b/lib/compiler/src/v3_kernel_pp.erl
@@ -173,10 +173,11 @@ format_1(#k_alt{first=O,then=T}, Ctxt) ->
format(O, Ctxt1),
nl_indent(Ctxt1),
format(T, Ctxt1)];
-format_1(#k_letrec_goto{label=Label,first=First,then=Then,ret=Rs}, Ctxt) ->
+format_1(#k_letrec_goto{label=Label,vars=Vs,first=First,then=Then,ret=Rs}, Ctxt) ->
Ctxt1 = ctxt_bump_indent(Ctxt, Ctxt#ctxt.item_indent),
["letrec_goto ",
atom_to_list(Label),
+ format_args(Vs, Ctxt),
nl_indent(Ctxt1),
format(Then, Ctxt1),
nl_indent(Ctxt1),
@@ -185,8 +186,8 @@ format_1(#k_letrec_goto{label=Label,first=First,then=Then,ret=Rs}, Ctxt) ->
"end",
format_ret(Rs, Ctxt1)
];
-format_1(#k_goto{label=Label}, _Ctxt) ->
- ["goto ",atom_to_list(Label)];
+format_1(#k_goto{label=Label,args=As}, Ctxt) ->
+ ["goto ",atom_to_list(Label),format_args(As, Ctxt)];
format_1(#k_select{var=V,types=Cs}, Ctxt) ->
Ctxt1 = ctxt_bump_indent(Ctxt, 2),
["select ",
diff --git a/lib/compiler/test/Makefile b/lib/compiler/test/Makefile
index 9019429414..9e57a36bd5 100644
--- a/lib/compiler/test/Makefile
+++ b/lib/compiler/test/Makefile
@@ -38,6 +38,7 @@ MODULES= \
lc_SUITE \
map_SUITE \
match_SUITE \
+ maybe_SUITE \
misc_SUITE \
overridden_bif_SUITE \
random_code_SUITE \
@@ -72,6 +73,7 @@ NO_OPT= \
lc \
map \
match \
+ maybe \
misc \
overridden_bif \
receive \
@@ -98,16 +100,20 @@ INLINE= \
lc \
map \
match \
+ maybe \
misc \
overridden_bif \
receive \
record
-R21= \
- bs_construct \
- bs_match \
+R23= \
fun
+R24= \
+ bs_construct \
+ bs_utf \
+ bs_bincomp
+
DIALYZER = bs_match
CORE_MODULES = \
@@ -128,8 +134,10 @@ NO_CORE_OPT_MODULES= $(NO_OPT:%=%_no_copt_SUITE)
NO_CORE_OPT_ERL_FILES= $(NO_CORE_OPT_MODULES:%=%.erl)
INLINE_MODULES= $(INLINE:%=%_inline_SUITE)
INLINE_ERL_FILES= $(INLINE_MODULES:%=%.erl)
-R21_MODULES= $(R21:%=%_r21_SUITE)
-R21_ERL_FILES= $(R21_MODULES:%=%.erl)
+R23_MODULES= $(R23:%=%_r23_SUITE)
+R23_ERL_FILES= $(R23_MODULES:%=%.erl)
+R24_MODULES= $(R24:%=%_r24_SUITE)
+R24_ERL_FILES= $(R24_MODULES:%=%.erl)
NO_MOD_OPT_MODULES= $(NO_MOD_OPT:%=%_no_module_opt_SUITE)
NO_MOD_OPT_ERL_FILES= $(NO_MOD_OPT_MODULES:%=%.erl)
NO_SSA_OPT_MODULES= $(NO_SSA_OPT:%=%_no_ssa_opt_SUITE)
@@ -169,9 +177,9 @@ EBIN = .
DISABLE_SSA_OPT = +no_bool_opt +no_share_opt +no_bsm_opt +no_fun_opt +no_ssa_opt +no_recv_opt
make_emakefile: $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) $(NO_SSA_OPT_ERL_FILES) \
- $(NO_CORE_OPT_ERL_FILES) $(INLINE_ERL_FILES) $(R21_ERL_FILES) \
+ $(NO_CORE_OPT_ERL_FILES) $(INLINE_ERL_FILES) $(R23_ERL_FILES) \
$(NO_MOD_OPT_ERL_FILES) $(NO_TYPE_OPT_ERL_FILES) \
- $(DIALYZER_ERL_FILES)
+ $(DIALYZER_ERL_FILES) $(R24_ERL_FILES)
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) \
> $(EMAKEFILE)
$(ERL_TOP)/make/make_emakefile +no_copt $(DISABLE_SSA_OPT) +no_postopt \
@@ -184,8 +192,10 @@ make_emakefile: $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) $(NO_SSA_OPT_ERL_FILES
-o$(EBIN) $(NO_CORE_OPT_MODULES) >> $(EMAKEFILE)
$(ERL_TOP)/make/make_emakefile +inline $(ERL_COMPILE_FLAGS) \
-o$(EBIN) $(INLINE_MODULES) >> $(EMAKEFILE)
- $(ERL_TOP)/make/make_emakefile +r21 $(ERL_COMPILE_FLAGS) \
- -o$(EBIN) $(R21_MODULES) >> $(EMAKEFILE)
+ $(ERL_TOP)/make/make_emakefile +r23 $(ERL_COMPILE_FLAGS) \
+ -o$(EBIN) $(R23_MODULES) >> $(EMAKEFILE)
+ $(ERL_TOP)/make/make_emakefile +r24 $(ERL_COMPILE_FLAGS) \
+ -o$(EBIN) $(R24_MODULES) >> $(EMAKEFILE)
$(ERL_TOP)/make/make_emakefile +no_module_opt $(ERL_COMPILE_FLAGS) \
-o$(EBIN) $(NO_MOD_OPT_MODULES) >> $(EMAKEFILE)
$(ERL_TOP)/make/make_emakefile +from_core $(ERL_COMPILE_FLAGS) \
@@ -195,7 +205,7 @@ make_emakefile: $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) $(NO_SSA_OPT_ERL_FILES
$(ERL_TOP)/make/make_emakefile +dialyzer $(ERL_COMPILE_FLAGS) \
-o$(EBIN) $(DIALYZER_MODULES) >> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
@@ -224,7 +234,10 @@ docs:
%_inline_SUITE.erl: %_SUITE.erl
sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@
-%_r21_SUITE.erl: %_SUITE.erl
+%_r23_SUITE.erl: %_SUITE.erl
+ sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@
+
+%_r24_SUITE.erl: %_SUITE.erl
sed -e 's;-module($(basename $<));-module($(basename $@));' $< > $@
%_no_module_opt_SUITE.erl: %_SUITE.erl
@@ -248,7 +261,9 @@ release_tests_spec: make_emakefile
$(INSTALL_DATA) compiler.spec compiler.cover \
$(EMAKEFILE) $(ERL_FILES) "$(RELSYSDIR)"
$(INSTALL_DATA) $(NO_OPT_ERL_FILES) $(POST_OPT_ERL_FILES) \
- $(INLINE_ERL_FILES) $(R21_ERL_FILES) \
+ $(INLINE_ERL_FILES) \
+ $(R23_ERL_FILES) \
+ $(R24_ERL_FILES) \
$(NO_CORE_OPT_ERL_FILES) \
$(NO_MOD_OPT_ERL_FILES) \
$(NO_SSA_OPT_ERL_FILES) \
diff --git a/lib/compiler/test/beam_except_SUITE.erl b/lib/compiler/test/beam_except_SUITE.erl
index ec29659f66..9a90c1b676 100644
--- a/lib/compiler/test/beam_except_SUITE.erl
+++ b/lib/compiler/test/beam_except_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2011-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2011-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,8 +57,8 @@ multiple_allocs(_Config) ->
ok.
-could(Coupons = pda, Favorite = _pleasure = 0.0, {_, true}, {Presents}) ->
- (0 = true) = #{true => [Presents]}.
+could(_Coupons = pda, _Favorite = _pleasure = 0.0, {_, true}, {Presents}) ->
+ (0 = true) = #{true => [Presents]}.
place(lee) ->
(pregnancy = presentations) = [hours | [purchase || _ <- 0]] + wine.
@@ -114,8 +114,16 @@ coverage(_) ->
{'EXIT',{undef,[{erlang,error,[a,b,c,d],_}|_]}} =
(catch erlang:error(a, b, c, d)),
- {'EXIT',{badarith,[{?MODULE,bar,1,[File,{line,9}]}|_]}} =
- (catch bar(x)),
+ %% The stacktrace for operators such a '+' can vary depending on
+ %% whether the JIT is used or not.
+ case catch bar(x) of
+ {'EXIT',{badarith,[{erlang,'+',[x,1],[_|_]},
+ {?MODULE,bar,1,[File,{line,9}]}|_]}} ->
+ ok;
+ {'EXIT',{badarith,[{?MODULE,bar,1,[File,{line,9}]}|_]}} ->
+ ok
+ end,
+
{'EXIT',{{case_clause,{1}},[{?MODULE,bar,1,[File,{line,9}]}|_]}} =
(catch bar(0)),
@@ -127,14 +135,18 @@ coverage(_) ->
{'EXIT',{function_clause,[{?MODULE,foobar,[[fail],1,2],
[{file,"fake.erl"},{line,16}]}|_]}} =
(catch foobar([fail], 1, 2)),
+
{'EXIT',{function_clause,[{?MODULE,fake_function_clause1,[{a,b},42.0],_}|_]}} =
(catch fake_function_clause1({a,b})),
{'EXIT',{function_clause,[{?MODULE,fake_function_clause2,[42|bad_tl],_}|_]}} =
(catch fake_function_clause2(42, bad_tl)),
+
{'EXIT',{function_clause,[{?MODULE,fake_function_clause3,[x,y],_}|_]}} =
(catch fake_function_clause3(42, id([x,y]))),
+ {'EXIT',{{function_clause,a,b,c}, _}} = catch fake_function_clause4(),
+
{'EXIT',{{badmatch,0.0},_}} = (catch coverage_1(id(42))),
{'EXIT',{badarith,_}} = (catch coverage_1(id(a))),
@@ -145,9 +157,13 @@ coverage_1(X) ->
true = 0 / X.
fake_function_clause1(A) -> error(function_clause, [A,42.0]).
+
fake_function_clause2(A, Tl) -> error(function_clause, [A|Tl]).
+
fake_function_clause3(_, Stk) -> error(function_clause, Stk).
+fake_function_clause4() -> error({function_clause,a,b,c}).
+
binary_construction_allocation(_Config) ->
ok = do_binary_construction_allocation("PUT"),
ok.
diff --git a/lib/compiler/test/beam_jump_SUITE.erl b/lib/compiler/test/beam_jump_SUITE.erl
index b199c175b3..cf331b67c9 100644
--- a/lib/compiler/test/beam_jump_SUITE.erl
+++ b/lib/compiler/test/beam_jump_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2016-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2016-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -169,7 +169,7 @@ expects_h(7, Atom) ->
ok.
%% When compiled with +no_copt, beam_validator would complain about
-%% ambigous try/catch state.
+%% ambiguous try/catch state.
ambiguous_catch_try_state_1(<<42:false>>) ->
%% The beam_ssa_bsm pass will duplicate the entire second clause.
%% beam_jump will share the blocks with the build_stacktrace
@@ -232,7 +232,8 @@ ambiguous_catch_try_state_3() ->
-record(message3, {id, p1, p2}).
build_tuple(_Config) ->
- {'EXIT',{{badrecord,message3},_}} = (catch do_build_tuple(#message2{})),
+ Message2 = #message2{},
+ {'EXIT',{{badrecord,Message2},_}} = (catch do_build_tuple(#message2{})),
ok.
do_build_tuple(Message) ->
@@ -319,7 +320,7 @@ cs_2(I) -> I.
undecided_allocation(_Config) ->
ok = catch undecided_allocation_1(<<10:(3*7)>>),
- {'EXIT',{{badrecord,rec},_}} = catch undecided_allocation_1(8),
+ {'EXIT',{{badrecord,<<0>>},_}} = catch undecided_allocation_1(8),
ok.
-record(rec, {}).
diff --git a/lib/compiler/test/beam_ssa_SUITE.erl b/lib/compiler/test/beam_ssa_SUITE.erl
index a3de26524f..2f29ee27f9 100644
--- a/lib/compiler/test/beam_ssa_SUITE.erl
+++ b/lib/compiler/test/beam_ssa_SUITE.erl
@@ -25,7 +25,8 @@
cover_ssa_dead/1,combine_sw/1,share_opt/1,
beam_ssa_dead_crash/1,stack_init/1,
mapfoldl/0,mapfoldl/1,
- grab_bag/1,coverage/1]).
+ grab_bag/1,redundant_br/1,
+ coverage/1]).
suite() -> [{ct_hooks,[ts_install_cth]}].
@@ -45,6 +46,7 @@ groups() ->
beam_ssa_dead_crash,
stack_init,
grab_bag,
+ redundant_br,
coverage
]}].
@@ -178,7 +180,7 @@ recv(_Config) ->
self() ! 1,
{1,yes} = tricky_recv_2(),
self() ! 2,
- {2,maybe} = tricky_recv_2(),
+ {2,'maybe'} = tricky_recv_2(),
%% Test 'receive after infinity' in try/catch.
Pid = spawn(fun recv_after_inf_in_try/0),
@@ -282,7 +284,7 @@ tricky_recv_2() ->
end,
a;
X=2 ->
- Y = maybe,
+ Y = 'maybe',
b
end,
{X,Y}.
@@ -667,6 +669,7 @@ do_comb_sw_2(X) ->
share_opt(_Config) ->
ok = do_share_opt_1(0),
ok = do_share_opt_2(),
+ ok = do_share_opt_3(),
ok.
do_share_opt_1(A) ->
@@ -697,7 +700,16 @@ sopt_2({Flags, Opts}, ok) ->
[] ->
ok
end.
-
+
+do_share_opt_3() ->
+ true = sopt_3(id(ok)),
+ false = sopt_3(id(nok)),
+ ok.
+
+sopt_3(X) ->
+ %% Must be one line to trigger bug.
+ case X of ok -> id(?LINE), true; _ -> id(?LINE), false end.
+
beam_ssa_dead_crash(_Config) ->
not_A_B = do_beam_ssa_dead_crash(id(false), id(true)),
not_A_not_B = do_beam_ssa_dead_crash(false, false),
@@ -712,7 +724,7 @@ do_beam_ssa_dead_crash(A, B) ->
%% paths happens to end up in the same place.
%%
%% During the simulated execution of this function, the boolean
- %% varible for a `br` instruction would be replaced with the
+ %% variable for a `br` instruction would be replaced with the
%% literal atom `nil`, which is not allowed, and would crash the
%% compiler. In practice, during the actual execution, control
%% would never be transferred to that `br` instruction when the
@@ -933,7 +945,7 @@ grab_bag_4() ->
end
end.
-grab_bag_5(A, B) when <<business:(node(power))>> ->
+grab_bag_5(_A, _B) when <<business:(node(power))>> ->
true.
grab_bag_6(face) ->
@@ -997,7 +1009,7 @@ grab_bag_11() ->
_ -> other
catch
_:_ ->
- catched
+ caught
end.
grab_bag_12() ->
@@ -1084,6 +1096,18 @@ grab_bag_17() ->
[]
end.
+redundant_br(_Config) ->
+ {false,{x,y,z}} = redundant_br_1(id({x,y,z})),
+ {true,[[a,b,c]]} = redundant_br_1(id([[[a,b,c]]])),
+ ok.
+
+redundant_br_1(Specs0) ->
+ {Join,Specs} =
+ if
+ is_list(hd(hd(Specs0))) -> {true,hd(Specs0)};
+ true -> {false,Specs0}
+ end,
+ id({Join,Specs}).
coverage(_Config) ->
diff --git a/lib/compiler/test/beam_type_SUITE.erl b/lib/compiler/test/beam_type_SUITE.erl
index 0b0e337d24..ca072a89e5 100644
--- a/lib/compiler/test/beam_type_SUITE.erl
+++ b/lib/compiler/test/beam_type_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2015-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2015-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,7 +26,8 @@
arity_checks/1,elixir_binaries/1,find_best/1,
test_size/1,cover_lists_functions/1,list_append/1,bad_binary_unit/1,
none_argument/1,success_type_oscillation/1,type_subtraction/1,
- container_subtraction/1]).
+ container_subtraction/1,is_list_opt/1,connected_tuple_elements/1,
+ switch_fail_inference/1]).
%% Force id/1 to return 'any'.
-export([id/1]).
@@ -58,7 +59,10 @@ groups() ->
none_argument,
success_type_oscillation,
type_subtraction,
- container_subtraction
+ container_subtraction,
+ is_list_opt,
+ connected_tuple_elements,
+ switch_fail_inference
]}].
init_per_suite(Config) ->
@@ -271,10 +275,10 @@ booleans(_Config) ->
true = is_atom(AnyAtom),
false = is_boolean(AnyAtom),
- MaybeBool = id(maybe),
+ MaybeBool = id('maybe'),
case MaybeBool of
true -> ok;
- maybe -> ok;
+ 'maybe' -> ok;
false -> ok
end,
false = is_boolean(MaybeBool),
@@ -383,11 +387,43 @@ tuple(_Config) ->
[] = [X || X <- [], #bird{b = b} == {bird,X}],
[] = [X || X <- [], 3 == X#bird.a],
+ 1 = do_literal_tuple_1(1),
+ 1 = do_literal_tuple_1(20),
+ {'EXIT', _} = catch do_literal_tuple_1(id(0)),
+ {'EXIT', _} = catch do_literal_tuple_1(id(bad)),
+
+ 2 = do_literal_tuple_2(1),
+ 2 = do_literal_tuple_2(15),
+ 2 = do_literal_tuple_2(20),
+
+ Counters0 = id({0,0,0}), %Inexact size.
+ {1,0,0} = Counters1 = increment_element(1, Counters0),
+ {1,1,0} = increment_element(2, Counters1),
+
+ Counters10 = {id(0),id(0),id(0)}, %Exact size.
+ {0,-1,0} = decrement_element(2, Counters10),
+ {0,0,-1} = decrement_element(3, Counters10),
+ {'EXIT',{badarg,_}} = catch decrement_element(4, Counters10),
+
ok.
do_tuple() ->
{0, _} = {necessary}.
+do_literal_tuple_1(X) ->
+ element(X, {1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1, 1,1,1,1,1}).
+
+do_literal_tuple_2(X) ->
+ element(X, {2,2,2,2,2, 2,2,2,2,2, 2,2,2,2,2, 2,2,2,2,2}).
+
+increment_element(Pos, Cs) ->
+ Ns = element(Pos, Cs),
+ setelement(Pos, Cs, Ns + 1).
+
+decrement_element(Pos, Cs) ->
+ Ns = element(Pos, Cs),
+ setelement(Pos, Cs, Ns - 1).
+
-record(x, {a}).
record_float(_Config) ->
@@ -661,5 +697,123 @@ cs_1({_,_}=Other) ->
cs_2({bar,baz}) ->
ok.
+is_list_opt(_Config) ->
+ true = is_list_opt_1(id(<<"application/a2l">>)),
+ false = is_list_opt_1(id(<<"">>)),
+ ok.
+
+is_list_opt_1(Type) ->
+ %% The call to is_list/1 would be optimized to an is_nonempty_list
+ %% instruction, which is illegal in a return context. That would
+ %% crash beam_ssa_codegen.
+ is_list(is_list_opt_2(Type)).
+
+is_list_opt_2(<<"application/a2l">>) -> [<<"a2l">>];
+is_list_opt_2(_Type) -> nil.
+
+%% We used to determine the type of `get_tuple_element` at the time of
+%% extraction, which is simple but sometimes throws away type information when
+%% on tuple unions.
+%%
+%% This normally doesn't cause any issues other than slightly less optimized
+%% code, but would crash the type pass in rare cases. Consider the following
+%% SSA:
+%%
+%% ----
+%% %% (Assume _0 is either `{a, 1}`, {b, 2}, or `{c, {d}}`)
+%% 0:
+%% _1 = get_tuple_element _0, `0`
+%% _2 = get_tuple_element _0, `1`
+%% switch _1, ^3, [
+%% { `a`, ^1 },
+%% { `b`, ^2 }
+%% ]
+%% 1: ... snip ...
+%% 2: ... snip ...
+%% 3:
+%% _3 = get_tuple_element _0, `1`
+%% @ssa_bool = is_tagged_tuple _3, 1, `d`
+%% br @ssa_bool ^4, ^1234
+%% 4:
+%% _4 = get_tuple_element _3, `0`
+%% ----
+%%
+%% In block 0 we determine that the type of _1 is `a | b | c` and that _2
+%% is `1 | 2 | {d}`. From this, we know that _0 is `{a, 1}` in block 1,
+%% `{b, 2}` in block 2, and `{c, {d}}` in block 3.
+%%
+%% In block 3, we remove the `is_tagged_tuple` test since it's redundant.
+%%
+%% ... but then the compiler replaces _3 with _2 since they're the same value.
+%% However, the type is still the same old `1 | 2 | {d}` we got in block 0,
+%% which is not safe for `get_tuple_element`, crashing the type pass.
+%%
+%% We fixed this by determining the type of `get_tuple_element` when the result
+%% is used instead of when it was extracted, giving the correct type `{d}` in
+%% block 4.
+connected_tuple_elements(_Config) ->
+ {c, 1, 2, 3} = cte_match(id(gurka), cte_generate(id(2))),
+ ok.
+
+cte_match(_, {a, A, B}) ->
+ {a, id(A), id(B)};
+cte_match(_, {b, A, B}) ->
+ {b, id(A), id(B)};
+cte_match(gurka, {c, A, {{B}, {C}}}) ->
+ {c, id(A), id(B), id(C)}.
+
+cte_generate(0) ->
+ {a, id(1), id(2)};
+cte_generate(1) ->
+ {b, id(1), id(2)};
+cte_generate(2) ->
+ {c, id(1), {{id(2)}, {id(3)}}}.
+
+%% ERIERL-799: Type inference for the fail label on switch terminators was
+%% weaker than that of the case labels, sometimes causing the compiler to crash
+%% when they were inverted.
+switch_fail_inference(_Config) ->
+ ok = sfi(id([])),
+ ok = sfi(id([{twiddle,frobnitz}, eof])),
+ {error, gaffel, gurka} = sfi(id([{twiddle, frobnitz}, {error, gurka}])),
+ {error, gaffel, gurka} = sfi(id([{ok, frobnitz}, {error, gurka}])),
+ ok.
+
+sfi(Things) ->
+ case sfi_1(Things) of
+ {ok, _} -> ok;
+ {error, {Left, Right}} -> {error, Left, Right}
+ end.
+
+sfi_1(Things) ->
+ case sfi_2(Things) of
+ {ok, Value} -> {ok, Value};
+ {error, Reason} -> {error, Reason}
+ end.
+
+sfi_2([Thing | Rest]) ->
+ case sfi_3(Thing) of
+ {ok, _} -> sfi_2(Rest);
+ {error, Reason} -> {error, Reason}
+ end;
+sfi_2([]) ->
+ {ok, done}.
+
+sfi_3({twiddle, _}) ->
+ {ok, twiddle};
+sfi_3(Thing) ->
+ case sfi_4(Thing) of
+ {twiddle, _}=More -> sfi_3(More);
+ {ok, Value} -> {ok, Value};
+ {error, Reason} -> {error, Reason}
+ end.
+
+sfi_4(eof) ->
+ {ok, eof};
+sfi_4({ok, IgnoredLater}) ->
+ {twiddle, IgnoredLater};
+sfi_4({error, Reason}) ->
+ {error, {gaffel, Reason}}.
+
id(I) ->
I.
diff --git a/lib/compiler/test/beam_utils_SUITE.erl b/lib/compiler/test/beam_utils_SUITE.erl
index eb0af59f9d..3c1f986b30 100644
--- a/lib/compiler/test/beam_utils_SUITE.erl
+++ b/lib/compiler/test/beam_utils_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2015-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2015-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -392,9 +392,9 @@ merchant([Merchant, Laws, Electric]) ->
if true; Electric -> Laws end) + 42.
oklahoma([], Int) -> Int.
-town(overall, {{If}, Healing = alcohol})
- when Healing#{[] => Healing}; include ->
- [If || Healing <- awareness].
+town(overall, {{If}, _Healing = alcohol})
+ when _Healing#{[] => _Healing}; include ->
+ [If || _Healing <- awareness].
%% Cover is_reg_used_at/3.
resulting([Conservation], stone) ->
diff --git a/lib/compiler/test/beam_validator_SUITE.erl b/lib/compiler/test/beam_validator_SUITE.erl
index 08ebec289f..e1aa134677 100644
--- a/lib/compiler/test/beam_validator_SUITE.erl
+++ b/lib/compiler/test/beam_validator_SUITE.erl
@@ -803,7 +803,7 @@ bs_saved_position_units(Config) when is_list(Config) ->
{'%',
{var_info,
{x,0},
- [{type,{t_bs_context,8,0,0}},accepts_match_context]}},
+ [{type,{t_bs_context,8}},accepts_match_context]}},
{move,nil,{x,0}},
return]},
{function,no_errors,1,4,
@@ -864,8 +864,8 @@ bs_saved_position_units(Config) when is_list(Config) ->
{{call_only,1,{f,2}},
14,
{bad_arg_type,{x,0},
- {t_bs_context,12,0,0},
- {t_bs_context,8,0,0}}}}] = Errors,
+ {t_bs_context,12},
+ {t_bs_context,8}}}}] = Errors,
ok.
diff --git a/lib/compiler/test/bs_bincomp_SUITE.erl b/lib/compiler/test/bs_bincomp_SUITE.erl
index a0e2345025..c3324b64dc 100644
--- a/lib/compiler/test/bs_bincomp_SUITE.erl
+++ b/lib/compiler/test/bs_bincomp_SUITE.erl
@@ -387,6 +387,12 @@ sizes(Config) when is_list(Config) ->
<<>> = Fun6([], 42),
<<42,43:20>> = Fun6([42], 20),
+ Fun7 = fun(B) ->
+ cs_default(<< <<C/utf8>> || C <- B >>)
+ end,
+ <<"Foundation"/utf8>> = Fun7("Foundation"),
+ <<"ОÑнование"/utf8>> = Fun7("ОÑнование"),
+
%% Binary generators.
Fun10 = fun(Bin) ->
@@ -437,6 +443,12 @@ sizes(Config) when is_list(Config) ->
<<$a:32,$b:32,$c:32,($a bsl 8 bor $b):32>> = Fun14([8,16], <<"abc">>),
<<$a:32,$b:32,$c:32>> = Fun14([8,bad], <<"abc">>),
+ Fun15 = fun(B) ->
+ cs_default(<< <<C/utf8>> || << C:32 >> <= id(B) >>)
+ end,
+ <<"Foundation"/utf8>> = Fun15(<<"Foundation"/utf32>>),
+ <<"ОÑнование"/utf8>> = Fun15(<<"ОÑнование"/utf32>>),
+
{'EXIT',_} = (catch << <<C:4>> || <<C:8>> <= {1,2,3} >>),
cs_end(),
diff --git a/lib/compiler/test/bs_construct_SUITE.erl b/lib/compiler/test/bs_construct_SUITE.erl
index bb9fcb033b..d8498efdfb 100644
--- a/lib/compiler/test/bs_construct_SUITE.erl
+++ b/lib/compiler/test/bs_construct_SUITE.erl
@@ -72,10 +72,10 @@ end_per_testcase(Case, Config) when is_atom(Case), is_list(Config) ->
verify_highest_opcode(_Config) ->
case ?MODULE of
- bs_construct_r21_SUITE ->
+ bs_construct_r24_SUITE ->
{ok,Beam} = file:read_file(code:which(?MODULE)),
case test_lib:highest_opcode(Beam) of
- Highest when Highest =< 163 ->
+ Highest when Highest =< 176 ->
ok;
TooHigh ->
ct:fail({too_high_opcode_for_21,TooHigh})
@@ -164,7 +164,7 @@ l(I_13, I_big1, I_16, Bin) ->
?T(<<869:16/little,3479:I_13,Bin/binary,7:1/unit:3,Bin/binary>>,
[101,3,108,189,42,214,31,165,90,195]),
- %% Test of aligment flag.
+ %% Test of alignment flag.
?T(<<0:I_13/unit:8,1:6,0:2>>,
[0,0,0,0,0,0,0,0,0,0,0,0,0,4]),
diff --git a/lib/compiler/test/bs_match_SUITE.erl b/lib/compiler/test/bs_match_SUITE.erl
index e935fe98ff..96b9a41b33 100644
--- a/lib/compiler/test/bs_match_SUITE.erl
+++ b/lib/compiler/test/bs_match_SUITE.erl
@@ -48,7 +48,8 @@
exceptions_after_match_failure/1,
bad_phi_paths/1,many_clauses/1,
combine_empty_segments/1,hangs_forever/1,
- bs_saved_position_units/1,empty_matches/1]).
+ bs_saved_position_units/1,empty_matches/1,
+ trim_bs_start_match_resume/1]).
-export([coverage_id/1,coverage_external_ignore/2]).
@@ -87,7 +88,8 @@ groups() ->
matching_meets_apply,bs_start_match2_defs,
exceptions_after_match_failure,bad_phi_paths,
many_clauses,combine_empty_segments,hangs_forever,
- bs_saved_position_units,empty_matches]}].
+ bs_saved_position_units,empty_matches,
+ trim_bs_start_match_resume]}].
init_per_suite(Config) ->
test_lib:recompile(?MODULE),
@@ -1478,10 +1480,11 @@ haystack_2(Haystack) ->
fc({'EXIT',{function_clause,_}}) -> ok;
fc({'EXIT',{{case_clause,_},_}}) when ?MODULE =:= bs_match_inline_SUITE -> ok.
-fc(Name, Args, {'EXIT',{function_clause,[{?MODULE,Name,Args,_}|_]}}) -> ok;
-fc(_, Args, {'EXIT',{{case_clause,ActualArgs},_}})
+fc(Name, Args, {'EXIT',{function_clause,[{?MODULE,Name,Args,_}|_]}}) ->
+ ok;
+fc(Name, Args, {'EXIT',{function_clause,[{?MODULE,_,Args,_}|_]}})
when ?MODULE =:= bs_match_inline_SUITE ->
- Args = tuple_to_list(ActualArgs).
+ ok.
%% Cover the clause handling bs_context to binary in
%% beam_block:initialized_regs/2.
@@ -1633,9 +1636,9 @@ mos_int_receive(Msg) ->
Res.
mos_int_fun(B) ->
- L = ignore_me,
- F = fun ([<<L,I:L,X:32>>]) -> {I,X};
- ([<<L,I:L,X:64>>]) -> {I,X}
+ _L = ignore_me,
+ F = fun ([<<_L,I:_L,X:32>>]) -> {I,X};
+ ([<<_L,I:_L,X:64>>]) -> {I,X}
end,
F(B).
@@ -2457,6 +2460,17 @@ em_3(<<V:0/binary,Rest/bits>>) ->
em_3_1(I) -> I.
+%% beam_trim would sometimes crash when bs_start_match4 had {atom,resume} as
+%% its fail label.
+trim_bs_start_match_resume(Config) when is_list(Config) ->
+ <<Context/binary>> = id(<<>>),
+ <<>> = trim_bs_start_match_resume_1(Context),
+ ok.
+
+trim_bs_start_match_resume_1(<<Context/binary>>) ->
+ _ = id(Context),
+ Context.
+
id(I) -> I.
expand_and_squeeze(Config) when is_list(Config) ->
diff --git a/lib/compiler/test/compilation_SUITE_data/compiler_1.erl b/lib/compiler/test/compilation_SUITE_data/compiler_1.erl
index 87985bdf80..a182e494b5 100644
--- a/lib/compiler/test/compilation_SUITE_data/compiler_1.erl
+++ b/lib/compiler/test/compilation_SUITE_data/compiler_1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -116,13 +116,13 @@ compiler_1() -> ok.
%%% test/0
%%%
%%% Run the complete test suite.
-%%% Reads Nodes from nodes.profile and starts them if neccessary.
+%%% Reads Nodes from nodes.profile and starts them if necessary.
%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
%%%
%%% test/1
%%%
%%% Run parts of the test suite.
-%%% Reads Nodes from nodes.profile and starts them if neccessary.
+%%% Reads Nodes from nodes.profile and starts them if necessary.
%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
%%%
%%% test/2
@@ -615,7 +615,7 @@ replica_management(Nodes) ->
done.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Add and drop indecies
+%% Add and drop indices
index_lifecycle(suite) ->
[ add_table_index, create_live_table_index, del_table_index ].
@@ -689,7 +689,7 @@ del_table_index(Nodes) ->
done.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Syncronize table with log or disc
+%% Synchronize table with log or disc
%%
table_sync(suite) ->
[ dump_tables, dump_log, change_dump_log_config, wait_for_tables, force_load_table ].
diff --git a/lib/compiler/test/compilation_SUITE_data/convopts.erl b/lib/compiler/test/compilation_SUITE_data/convopts.erl
index 8404eb82fd..31bd3db4a1 100644
--- a/lib/compiler/test/compilation_SUITE_data/convopts.erl
+++ b/lib/compiler/test/compilation_SUITE_data/convopts.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -108,7 +108,7 @@ convopts(Opts) ->
%% This undocumented clause uses an undocumented
%% feature of the TIPC socket interface that takes
%% advantage of some gory internals of the protocol.
- %% It is protocol implementation dependant and
+ %% It is protocol implementation dependent and
%% breaks the whole idea of location transparency
%% for name addressed messages. Therefore it should
%% only be used when all other possibilities are
diff --git a/lib/compiler/test/compilation_SUITE_data/opt_crash.erl b/lib/compiler/test/compilation_SUITE_data/opt_crash.erl
index 4643ce61f6..05b817dbc4 100644
--- a/lib/compiler/test/compilation_SUITE_data/opt_crash.erl
+++ b/lib/compiler/test/compilation_SUITE_data/opt_crash.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -45,7 +45,7 @@ test() ->
nil},
{query,nil}}} = URI_Before,
- %% ... some funky code ommitted, not relevant ...
+ %% ... some funky code omitted, not relevant ...
{absoluteURI,
{scheme,_},
diff --git a/lib/compiler/test/compilation_SUITE_data/otp_4790.erl b/lib/compiler/test/compilation_SUITE_data/otp_4790.erl
index 08769c5303..f1173da97c 100644
--- a/lib/compiler/test/compilation_SUITE_data/otp_4790.erl
+++ b/lib/compiler/test/compilation_SUITE_data/otp_4790.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -32,7 +32,7 @@
% causing a crash at run-time.
% The same error could cause tuple tests to be removed,
-% but that would propbably only cause a crash if the
+% but that would probably only cause a crash if the
% Erlang code was incorrect or if it depended on a catch
% to catch exceptions. Therefore, I consider it unlikely
% that Erlang programs that don't use floating point
diff --git a/lib/compiler/test/compile_SUITE.erl b/lib/compiler/test/compile_SUITE.erl
index 0e785b3bd9..4e20162c7b 100644
--- a/lib/compiler/test/compile_SUITE.erl
+++ b/lib/compiler/test/compile_SUITE.erl
@@ -26,19 +26,19 @@
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2,
- app_test/1,appup_test/1,
+ app_test/1,appup_test/1,bigE_roundtrip/1,
debug_info/4, custom_debug_info/1, custom_compile_info/1,
file_1/1, forms_2/1, module_mismatch/1, outdir/1,
binary/1, makedep/1, cond_and_ifdef/1, listings/1, listings_big/1,
other_output/1, kernel_listing/1, encrypted_abstr/1,
strict_record/1, utf8_atoms/1, utf8_functions/1, extra_chunks/1,
cover/1, env/1, core_pp/1, tuple_calls/1,
- core_roundtrip/1, asm/1,
+ core_roundtrip/1, asm/1, asm_labels/1,
sys_pre_attributes/1, dialyzer/1, no_core_prepare/1,
warnings/1, pre_load_check/1, env_compiler_options/1,
bc_options/1, deterministic_include/1, deterministic_paths/1,
compile_attribute/1, message_printing/1, other_options/1,
- transforms/1, erl_compile_api/1
+ transforms/1, erl_compile_api/1, types_pp/1
]).
suite() -> [{ct_hooks,[ts_install_cth]}].
@@ -48,16 +48,17 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
-spec all() -> all_return_type().
all() ->
- [app_test, appup_test, file_1, forms_2, module_mismatch, outdir,
+ [app_test, appup_test, bigE_roundtrip, file_1,
+ forms_2, module_mismatch, outdir,
binary, makedep, cond_and_ifdef, listings, listings_big,
other_output, kernel_listing, encrypted_abstr, tuple_calls,
strict_record, utf8_atoms, utf8_functions, extra_chunks,
- cover, env, core_pp, core_roundtrip, asm, no_core_prepare,
+ cover, env, core_pp, core_roundtrip, asm, asm_labels, no_core_prepare,
sys_pre_attributes, dialyzer, warnings, pre_load_check,
env_compiler_options, custom_debug_info, bc_options,
custom_compile_info, deterministic_include, deterministic_paths,
compile_attribute, message_printing, other_options, transforms,
- erl_compile_api].
+ erl_compile_api, types_pp].
groups() ->
[].
@@ -85,6 +86,37 @@ app_test(Config) when is_list(Config) ->
appup_test(Config) when is_list(Config) ->
ok = test_server:appup_test(compiler).
+%% Check that a file compiled to the abstract form and dumped with -E
+%% can be compiled. We use a file constructed to produce errors if the
+%% dumping fails to legalize compiler generated variable names.
+bigE_roundtrip(Config) when is_list(Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
+ Source = filename:join(DataDir, "bigE.erl"),
+ TargetDir = filename:join(PrivDir, "bigE"),
+ Target = filename:join(TargetDir, "bigE.E"),
+ TargetSource = filename:join(TargetDir, "bigE.erl"),
+ ok = file:make_dir(TargetDir),
+ io:format("Source: ~p~nTargetDir: ~p~nTarget: ~p\n",
+ [Source, TargetDir, Target]),
+ case compile:file(Source,
+ ['E', warnings_as_errors, {outdir, TargetDir}]) of
+ {ok, _} -> ok;
+ Other -> ct:fail({unexpected_result, Other})
+ end,
+ %% Rename the output to .erl so that the compiler accepts it and
+ %% we won't get a warning due to the filename not matching the
+ %% module name.
+ ok = file:rename(Target, TargetSource),
+ case compile:file(TargetSource,
+ [warnings_as_errors, {outdir, TargetDir}]) of
+ {ok, _} -> ok;
+ Other1 -> ct:fail({unexpected_result, Other1})
+ end,
+ file:delete(TargetSource),
+ file:del_dir(TargetDir),
+ ok.
+
%% Tests that we can compile and run a simple Erlang program,
%% using compile:file/1.
@@ -396,7 +428,7 @@ makedep_canonicalize_result(Mf, DataDir) ->
%% Replace the Datadir by "$(srcdir)".
Mf1 = re:replace(Mf0, DataDir, "$(srcdir)/",
[global,multiline,{return,list}]),
- %% Long lines are splitted, put back everything on one line.
+ %% Long lines are split, put back everything on one line.
Mf2 = re:replace(Mf1, "\\\\\n ", "", [global,multiline,{return,list}]),
list_to_binary(Mf2).
@@ -486,7 +518,6 @@ do_file_listings(DataDir, PrivDir, [File|Files]) ->
{dblk, ".block"},
{djmp, ".jump"},
{dclean, ".clean"},
- {dpeep, ".peep"},
{dopt, ".optimize"},
{diffable, ".S"}],
p_listings(List, Simple, TargetDir),
@@ -495,16 +526,15 @@ do_file_listings(DataDir, PrivDir, [File|Files]) ->
do_listing(Simple, TargetDir, to_pp, ".P"),
do_listing(Simple, TargetDir, to_exp, ".E"),
do_listing(Simple, TargetDir, to_core0, ".core"),
- Listings = filename:join(PrivDir, listings),
- ok = file:delete(filename:join(Listings, File ++ ".core")),
+ ok = file:delete(filename:join(TargetDir, File ++ ".core")),
do_listing(Simple, TargetDir, to_core, ".core"),
do_listing(Simple, TargetDir, to_kernel, ".kernel"),
do_listing(Simple, TargetDir, to_dis, ".dis"),
%% Final clean up.
lists:foreach(fun(F) -> ok = file:delete(F) end,
- filelib:wildcard(filename:join(Listings, "*"))),
- ok = file:del_dir(Listings),
+ filelib:wildcard(filename:join(TargetDir, "*"))),
+ ok = file:del_dir(TargetDir),
do_file_listings(DataDir,PrivDir,Files).
@@ -636,7 +666,7 @@ encrypted_abstr(Config) when is_list(Config) ->
%% Now run the tests that require crypto.
encrypted_abstr_1(Simple, Target),
ok = file:delete(Target),
- ok = file:del_dir(filename:dirname(Target))
+ ok = file:del_dir_r(filename:dirname(Target))
end,
%% Cleanup.
@@ -680,22 +710,77 @@ encrypted_abstr_1(Simple, Target) ->
error = compile:file(Simple,
[debug_info,{debug_info_key,42},report]),
- %% Place the crypto key in .erlang.crypt.
beam_lib:clear_crypto_key_fun(),
- {ok,OldCwd} = file:get_cwd(),
- ok = file:set_cwd(TargetDir),
-
- error = compile:file(Simple, [encrypt_debug_info,report]),
- NewKey = "better use another key here",
- write_crypt_file(["[{debug_info,des3_cbc,simple,\"",NewKey,"\"}].\n"]),
- {ok,simple} = compile:file(Simple, [encrypt_debug_info,report]),
- verify_abstract("simple.beam", erl_abstract_code),
- ok = file:delete(".erlang.crypt"),
- beam_lib:clear_crypto_key_fun(),
- {error,beam_lib,{key_missing_or_invalid,"simple.beam",abstract_code}} =
- beam_lib:chunks("simple.beam", [abstract_code]),
- ok = file:set_cwd(OldCwd),
+ %% Test to place the crypto file on disk. The test is dependent on the
+ %% $HOME of the emulator, so we do this test in another node.
+ TestHome = filename:join(TargetDir, "home"),
+ filelib:ensure_dir(TestHome),
+ HomeEnv = case os:type() of
+ {win32, _} ->
+ [Drive | Path] = filename:split(TestHome),
+ [{"APPDATA", filename:join(TestHome,"AppData")},
+ {"HOMEDRIVE", Drive}, {"HOMEPATH", filename:join(Path)}];
+ _ ->
+ [{"HOME", TestHome}]
+ end,
+
+ {ok, Peer, Node} = ?CT_PEER(#{ env => HomeEnv }),
+
+ erpc:call(
+ Node,
+ fun() ->
+ {ok,OldCwd} = file:get_cwd(),
+ ok = file:set_cwd(TargetDir),
+
+ error = compile:file(Simple, [encrypt_debug_info,report]),
+
+ CWDKey = "better use another key here",
+ CWDFile = ".erlang.crypt",
+ XDGKey = "better use yet another key here",
+ XDGFile = filename:join(
+ filename:basedir(user_config,"erlang"),
+ ".erlang.crypt"),
+ HOMEKey = "better use the home key here",
+ HOMEFile = filename:join(TestHome,".erlang.crypt"),
+
+ write_crypt_file(CWDFile, CWDKey),
+ write_crypt_file(XDGFile, XDGKey),
+ write_crypt_file(HOMEFile, HOMEKey),
+
+ %% First we test that .erlang.crypt in cwd works
+ {ok,simple} = compile:file(Simple, [encrypt_debug_info,report]),
+ verify_abstract("simple.beam", erl_abstract_code),
+ ok = file:delete(CWDFile),
+ beam_lib:clear_crypto_key_fun(),
+
+ %% Then we test that .erlang.crypt in HOME does **not** work
+ {error,beam_lib,{key_missing_or_invalid,"simple.beam",abstract_code}} =
+ beam_lib:chunks("simple.beam", [abstract_code]),
+
+ %% Then we test that .erlang.crypt in HOME does work
+ {ok,simple} = compile:file(Simple, [encrypt_debug_info,report]),
+ verify_abstract("simple.beam", erl_abstract_code),
+ ok = file:delete(HOMEFile),
+ beam_lib:clear_crypto_key_fun(),
+
+ %% Then we test that .erlang.crypt in XDG does **not** work
+ {error,beam_lib,{key_missing_or_invalid,"simple.beam",abstract_code}} =
+ beam_lib:chunks("simple.beam", [abstract_code]),
+
+
+ %% Then we test that .erlang.crypt in XDG does work
+ {ok,simple} = compile:file(Simple, [encrypt_debug_info,report]),
+ verify_abstract("simple.beam", erl_abstract_code),
+ ok = file:delete(XDGFile),
+
+ beam_lib:clear_crypto_key_fun(),
+ {error,beam_lib,{key_missing_or_invalid,"simple.beam",abstract_code}} =
+ beam_lib:chunks("simple.beam", [abstract_code])
+
+ end),
+
+ peer:stop(Peer),
%% Test key compatibility by reading a BEAM file produced before
%% the update to the new crypto functions.
@@ -708,11 +793,11 @@ encrypted_abstr_1(Simple, Target) ->
ok.
-
-write_crypt_file(Contents0) ->
- Contents = list_to_binary([Contents0]),
- io:format("~s\n", [binary_to_list(Contents)]),
- ok = file:write_file(".erlang.crypt", Contents).
+write_crypt_file(File, Key) ->
+ Contents = ["[{debug_info,des3_cbc,simple,\"",Key,"\"}].\n"],
+ io:format("~s: ~s\n", [File, Contents]),
+ ok = filelib:ensure_dir(File),
+ ok = file:write_file(File, Contents).
encrypted_abstr_no_crypto(Simple, Target) ->
io:format("simpe: ~p~n", [Simple]),
@@ -744,7 +829,7 @@ install_crypto_key(Key) ->
end,
ok = beam_lib:crypto_key_fun(F).
-%% Miscellanous tests, mainly to get better coverage.
+%% Miscellaneous tests, mainly to get better coverage.
debug_info(erlang_v1, Module, ok, _Opts) ->
{ok, [Module]};
debug_info(erlang_v1, _Module, error, _Opts) ->
@@ -846,21 +931,21 @@ strict_record(Config) when is_list(Config) ->
%% Default (possibly influenced by ERL_COMPILER_OPTIONS).
{ok,M} = c:c(M, [{outdir,Priv},report_errors]),
try
- {1,2} = record_access:test(Turtle),
- {comment,"Default: no_strict_record_tests"}
- catch
- error:{badrecord,tortoise} ->
- {comment,"Default: strict_record_tests"}
- end.
+ {1,2} = record_access:test(Turtle),
+ {comment,"Default: no_strict_record_tests"}
+ catch
+ error:{badrecord,Turtle} ->
+ {comment,"Default: strict_record_tests"}
+ end.
test_strict() ->
Turtle = record_access:turtle(),
try
- record_access:test(Turtle)
- catch
- error:{badrecord,tortoise} ->
- ok
- end,
+ record_access:test(Turtle)
+ catch
+ error:{badrecord,Turtle} ->
+ ok
+ end,
Turtle.
test_sloppy() ->
@@ -881,9 +966,8 @@ utf8_atoms(Config) when is_list(Config) ->
beam_lib:chunks(Utf8AtomBin, [atoms]),
code:load_binary(utf8_atom, "compile_SUITE", Utf8AtomBin),
Atom = utf8_atom:atom(),
-
- NoUtf8AtomForms = [{attribute,Anno,module,no_utf8_atom}|Forms],
- error = compile:forms(NoUtf8AtomForms, [binary, r19]).
+ true = is_atom(Atom),
+ ok.
utf8_functions(Config) when is_list(Config) ->
Anno = erl_anno:new(1),
@@ -1283,6 +1367,26 @@ do_asm(Beam, Outdir) ->
error
end.
+%% Compile a crafted file which produces the three call instructions
+%% which should have a comment with the called function in clear
+%% text. We check that the expected functions and comments occur in
+%% the listing.
+
+asm_labels(Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
+ InFile = filename:join(DataDir, "asm_labels.erl"),
+ OutDir = filename:join(PrivDir, "asm_labels"),
+ OutFile = filename:join(OutDir, "asm_labels.S"),
+ ok = file:make_dir(OutDir),
+ {ok,asm_labels} = compile:file(InFile, ['S',{outdir,OutDir}]),
+ {ok,Listing} = file:read_file(OutFile),
+ Os = [global,multiline,{capture,all_but_first,list}],
+ {match,[_]} = re:run(Listing, "({call,.+,{f,.+}}\\. % foo/1)", Os),
+ {match,[_]} = re:run(Listing, "({call_only,.+,{f,.+}}\\. % foo/1)", Os),
+ {match,[_]} = re:run(Listing, "({call_last,.+,{f,.+},.+}\\. % bar/1)", Os),
+ ok = file:del_dir_r(OutDir).
+
sys_pre_attributes(Config) ->
DataDir = proplists:get_value(data_dir, Config),
File = filename:join(DataDir, "attributes.erl"),
@@ -1335,7 +1439,8 @@ warnings(_Config) ->
test_lib:p_run(fun do_warnings/1, Files).
do_warnings(F) ->
- {ok,_,_,Ws} = compile:file(F, [binary,bin_opt_info,recv_opt_info,return]),
+ Options = [{enable_feature,maybe_expr},binary,bin_opt_info,recv_opt_info,return],
+ {ok,_,_,Ws} = compile:file(F, Options),
do_warnings_1(Ws, F).
do_warnings_1([{"no_file",Ws}|_], F) ->
@@ -1553,46 +1658,50 @@ env_compiler_options(_Config) ->
bc_options(Config) ->
DataDir = proplists:get_value(data_dir, Config),
- L = [{101, small_float, [no_shared_fun_wrappers,
- no_get_hd_tl,no_line_info]},
- {125, small_float, [no_shared_fun_wrappers,no_get_hd_tl,
- no_line_info,
- no_ssa_opt_float]},
-
- {132, small, [no_init_yregs,no_shared_fun_wrappers,
- no_put_tuple2,no_get_hd_tl,no_ssa_opt_record,
- no_ssa_opt_float,no_line_info,no_bsm3]},
+ DataDir = proplists:get_value(data_dir, Config),
- {153, small, [r20]},
- {153, small, [r21]},
+ L = [{101, small_float, [no_shared_fun_wrappers,no_line_info]},
+ {125, small_float, [no_shared_fun_wrappers,
+ no_line_info,
+ no_ssa_opt_float,
+ no_type_opt]},
- {153, big, [r18]},
- {153, big, [r19]},
{153, small_float, [no_shared_fun_wrappers]},
- {158, small_maps, [r18]},
- {158, small_maps, [r19]},
- {158, small_maps, [r20]},
- {158, small_maps, [r21]},
-
- {164, small_maps, [no_init_yregs,no_shared_fun_wrappers]},
+ {164, small_maps, [no_init_yregs,no_shared_fun_wrappers,no_type_opt]},
{164, small_maps, [r22]},
{164, big, [r22]},
+ {164, funs, [r22]},
+ {164, funs, [no_init_yregs,no_shared_fun_wrappers,
+ no_ssa_opt_record,
+ no_line_info,no_stack_trimming,
+ no_make_fun3,no_type_opt]},
{168, small, [r22]},
+ {168, small, [no_init_yregs,no_shared_fun_wrappers,
+ no_ssa_opt_record,no_make_fun3,
+ no_ssa_opt_float,no_line_info,no_type_opt]},
+ {169, small, [r23]},
{169, big, [no_init_yregs,no_shared_fun_wrappers,
- no_put_tuple2,no_get_hd_tl,no_ssa_opt_record,
+ no_ssa_opt_record,
no_line_info,no_stack_trimming,
- no_make_fun3]},
+ no_make_fun3,no_type_opt]},
{169, big, [r23]},
- {169, small_maps, [no_init_yregs]},
+ {169, small_maps, [no_init_yregs,no_type_opt]},
- {170, small, [no_shared_fun_wrappers,no_init_yregs]},
+ {171, big, [no_init_yregs,no_shared_fun_wrappers,
+ no_ssa_opt_record,
+ no_ssa_opt_float,no_line_info,
+ no_type_opt]},
+ {171, funs, [no_init_yregs,no_shared_fun_wrappers,
+ no_ssa_opt_record,
+ no_ssa_opt_float,no_line_info,
+ no_type_opt]},
- {171, big, [no_init_yregs]},
- {172, big, []}
+ {178, funs, []},
+ {178, big, []}
],
Test = fun({Expected,Mod,Options}) ->
@@ -1610,7 +1719,7 @@ bc_options(Config) ->
highest_opcode(DataDir, Mod, Opt) ->
Src = filename:join(DataDir, atom_to_list(Mod)++".erl"),
- {ok,Mod,Beam} = compile:file(Src, [binary|Opt]),
+ {ok,Mod,Beam} = compile:file(Src, [binary,report_errors|Opt]),
test_lib:highest_opcode(Beam).
deterministic_include(Config) when is_list(Config) ->
@@ -1685,10 +1794,15 @@ forms_to_terms(Forms) ->
other_options(Config) ->
DataDir = proplists:get_value(data_dir, Config),
- %% Smoke test of no_spawn_compiler_process and brief options.
+ %% Smoke test of no_spawn_compiler_process, brief, and absolute_source
+ %% options.
Big = filename:join(DataDir, "big"),
{ok,big,<<_/binary>>} =
- compile:file(Big, [binary, no_spawn_compiler_process, brief, report]),
+ compile:file(Big, [binary,
+ no_spawn_compiler_process,
+ brief,
+ absolute_source,
+ report]),
%% Test generating a compressed BEAM file. Also cover the redundant
%% `beam` option and the `no_inline` option.
@@ -1852,6 +1966,94 @@ erl_compile_api(Config) ->
ok.
+%% Check that an ssa dump contains the pretty printed types we expect.
+%% The module we compile and dump, types_pp, is crafted so it contains
+%% calls to functions which have the result types we want to check the
+%% pretty printer for. We check all types except for bs_context,
+%% bs_matchable and the interval form of float as the first two never
+%% seem to appear in result types and the latter doesn't appear in any
+%% module compiled by diffable.
+types_pp(Config) when is_list(Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
+ TargetDir = filename:join(PrivDir, types_pp),
+ File = filename:join(DataDir, "types_pp.erl"),
+ Listing = filename:join(TargetDir, "types_pp.ssaopt"),
+ ok = file:make_dir(TargetDir),
+
+ {ok,_} = compile:file(File, [dssaopt, {outdir, TargetDir}]),
+ {ok, Data} = file:read_file(Listing),
+ Lines = string:split(binary_to_list(Data), "\n", all),
+ ResultTypes = get_result_types(Lines),
+ io:format("Calls: ~p~n", [ResultTypes]),
+
+ TypesToCheck = [{make_atom, "'an_atom'"},
+ {make_number, "number()"},
+ {make_float, "3.14"},
+ {make_integer, "17"},
+ {make_integer_range, "0..3"},
+ {make_nil, "nil()"},
+ {make_list, "list(any())"},
+ {make_list_of_ints, "list(integer())"},
+ {make_maybe_improper_list,
+ "maybe_improper_list(any(), any())"},
+ {make_nonempty_list, "nonempty_list(any())"},
+ {make_nonempty_improper_list,
+ "nonempty_improper_list(any(), ''end'')"},
+ {make_empty_map, "#{}"},
+ {make_map, "map()"},
+ {make_map_known_types, "#{integer()=>float()}"},
+ {make_fun_unknown_arity_known_type,
+ "fun((...) -> number())"},
+ {make_fun_known_arity_known_type,
+ "fun((_, _) -> number())"},
+ {make_fun_unknown_arity_unknown_type,
+ "fun()"},
+ {make_fun_known_arity_unknown_type,
+ "fun((_, _))"},
+ {make_unconstrained_tuple, "{...}"},
+ {make_known_size_tuple,
+ "{any(), any(), any(), any(), any()}"},
+ {make_inexact_tuple, "{any(), any(), any(), ...}"},
+ {make_union,
+ "'foo' | nonempty_list(1..3) | number() |"
+ " {'tag0', 1, 2} | {'tag1', 3, 4} | bitstring(24)"},
+ {make_bitstring, "bitstring(24)"},
+ {make_none, "none()"}],
+ lists:foreach(fun({FunName, Expected}) ->
+ Actual = map_get(atom_to_list(FunName), ResultTypes),
+ case Actual of
+ Expected ->
+ ok;
+ _ ->
+ ct:fail("Expected type of ~p is ~s, found ~s",
+ [FunName, Expected, Actual])
+ end
+ end, TypesToCheck),
+ ok = file:del_dir_r(TargetDir),
+ ok.
+
+%% We assume that a call starts with a "Result type:"-line followed by
+%% a type line, which is followed by an optional annotation before the
+%% actual call.
+get_result_types(Lines) ->
+ get_result_types(Lines, #{}).
+
+get_result_types([" %% Result type:"++_," %% "++TypeLine|Lines], Acc) ->
+ get_result_types(Lines, TypeLine, Acc);
+get_result_types([_|Lines], Acc) ->
+ get_result_types(Lines, Acc);
+get_result_types([], Acc) ->
+ Acc.
+
+get_result_types([" %% Anno: "++_|Lines], TypeLine, Acc) ->
+ get_result_types(Lines, TypeLine, Acc);
+get_result_types([CallLine|Lines], TypeLine, Acc) ->
+ [_,Callee,_] = string:split(CallLine, "`", all),
+ get_result_types(Lines, Acc#{ Callee => TypeLine }).
+
+
+
%%%
%%% Utilities.
%%%
diff --git a/lib/diameter/test/diameter_ct.hrl b/lib/compiler/test/compile_SUITE_data/asm_labels.erl
index fdf8782456..59571f5539 100644
--- a/lib/diameter/test/diameter_ct.hrl
+++ b/lib/compiler/test/compile_SUITE_data/asm_labels.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,5 +18,30 @@
%% %CopyrightEnd%
%%
--define(APP, diameter).
--define(ERROR(T), erlang:error({?MODULE, ?LINE, T})).
+%% A module which when compiled to a BEAM assembly listing will
+%% contain call instructions with comments containing the called
+%% function in clear text.
+
+-module(asm_labels).
+
+-export([foo/0, bar/0]).
+
+%% Expected to generate a `call_only` instruction
+foo() ->
+ foo(10).
+
+%% Expected to generate a `call` instruction
+foo(0) ->
+ 17;
+foo(N) ->
+ foo(N-1) + 1.
+
+%% Expected to generate a `call_last` instruction
+bar() ->
+ receive
+ X ->
+ bar(X)
+ end.
+
+bar([]) ->
+ ok.
diff --git a/lib/compiler/test/compile_SUITE_data/big.erl b/lib/compiler/test/compile_SUITE_data/big.erl
index 765c71c07d..f96aed7615 100644
--- a/lib/compiler/test/compile_SUITE_data/big.erl
+++ b/lib/compiler/test/compile_SUITE_data/big.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -116,13 +116,13 @@ compiler_1() -> ok.
%%% test/0
%%%
%%% Run the complete test suite.
-%%% Reads Nodes from nodes.profile and starts them if neccessary.
+%%% Reads Nodes from nodes.profile and starts them if necessary.
%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
%%%
%%% test/1
%%%
%%% Run parts of the test suite.
-%%% Reads Nodes from nodes.profile and starts them if neccessary.
+%%% Reads Nodes from nodes.profile and starts them if necessary.
%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
%%%
%%% test/2
@@ -615,7 +615,7 @@ replica_management(Nodes) ->
done.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Add and drop indecies
+%% Add and drop indices
index_lifecycle(suite) ->
[ add_table_index, create_live_table_index, del_table_index ].
@@ -689,7 +689,7 @@ del_table_index(Nodes) ->
done.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Syncronize table with log or disc
+%% Synchronize table with log or disc
%%
table_sync(suite) ->
[ dump_tables, dump_log, change_dump_log_config, wait_for_tables, force_load_table ].
diff --git a/lib/compiler/test/compile_SUITE_data/bigE.erl b/lib/compiler/test/compile_SUITE_data/bigE.erl
new file mode 100644
index 0000000000..598b8fc965
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/bigE.erl
@@ -0,0 +1,22 @@
+-module(bigE).
+
+-export([f/1]).
+
+-record(r, {a, b}).
+
+f(#r{b = B} = C) ->
+ receive
+ B ->
+ X = C#r.a,
+ %% The compiler will do a case to extract the `a` field
+ %% using a pattern variable named `rec0`. Without
+ %% legalization the variable will be output as an atom and
+ %% the compiler will report an error as the following `X +
+ %% X` will always fail.
+ REC0 = X + X,
+ %% If the legalization fails to detect that the default
+ %% legalization of uppercasing the pattern variable would
+ %% collide with the `REC0` below, we will get a warning
+ %% for an unsafe use.
+ REC0
+ end.
diff --git a/lib/compiler/test/compile_SUITE_data/funs.erl b/lib/compiler/test/compile_SUITE_data/funs.erl
new file mode 100644
index 0000000000..d605128ef4
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/funs.erl
@@ -0,0 +1,8 @@
+-module(funs).
+-export([go/0]).
+
+go() ->
+ Id = id(fun id/1),
+ {Id(ok), Id(42)}.
+
+id(I) -> I.
diff --git a/lib/compiler/test/compile_SUITE_data/types_pp.erl b/lib/compiler/test/compile_SUITE_data/types_pp.erl
new file mode 100644
index 0000000000..bcbd93a835
--- /dev/null
+++ b/lib/compiler/test/compile_SUITE_data/types_pp.erl
@@ -0,0 +1,127 @@
+-module(types_pp).
+
+-export([doit/0]).
+
+make_atom() ->
+ an_atom.
+
+make_number(X, Y) ->
+ X + Y.
+
+make_float() ->
+ 3.14.
+
+make_integer_range(X) ->
+ case X of
+ a -> 0;
+ b -> 1;
+ c -> 2;
+ _ -> 3
+ end.
+
+make_integer() ->
+ 17.
+
+make_nil() ->
+ [].
+
+make_list(X) when is_list(X) ->
+ X ++ [1, 2, 3].
+
+make_list_of_ints(X) when is_list(X) ->
+ [ Y || Y <- X, is_integer(Y)].
+
+make_maybe_improper_list(X) when is_list(X) ->
+ X.
+
+make_nonempty_list(X) ->
+ [X].
+
+make_nonempty_improper_list(X) ->
+ [X|'end'].
+
+make_empty_map() ->
+ #{}.
+
+make_map(X) when is_map(X) ->
+ X.
+
+make_map_known_types(K, V) when is_integer(K), is_float(V) ->
+ #{ K => V }.
+
+make_fun_unknown_arity_known_type() ->
+ case ext:f() of
+ 0 -> fun(X) -> X + 1 end;
+ 1 -> fun(X, Y) -> X + Y end
+ end.
+
+make_fun_known_arity_known_type() ->
+ fun(Y, Z) ->
+ Y + Z
+ end.
+
+make_fun_unknown_arity_unknown_type() ->
+ case ext:f() of
+ 0 -> fun(X) -> ext:f(X) end;
+ 1 -> fun(X, Y) -> ext:f(X, Y) end
+ end.
+
+make_fun_known_arity_unknown_type() ->
+ fun(Y, Z) ->
+ ext:f(Y, Z)
+ end.
+
+make_none() ->
+ exit(foo).
+
+make_unconstrained_tuple(X) when is_tuple(X) ->
+ X.
+
+make_known_size_tuple(X) when is_tuple(X), tuple_size(X) =:= 5 ->
+ X.
+
+make_inexact_tuple({X1,X2,X3,_X4,_X5,_X6,_X7,_X8,_X9,_X10,_X11,_X12,_X13}=X)
+ when is_integer(X1), is_float(X2), is_integer(X3) ->
+ case ext:f() of
+ 0 ->
+ {1, 2, 3};
+ _ ->
+ X
+ end.
+
+make_union() ->
+ case ext:f() of
+ 0 -> foo;
+ 1 -> [1, 2, 3];
+ 2 -> 7;
+ 3 -> 3.14;
+ 4 -> {tag0,1,2};
+ 5 -> {tag1,3,4};
+ 6 -> <<1,2,3>>
+ end.
+
+make_bitstring() ->
+ <<1, 2, 3>>.
+
+doit() ->
+ {make_number(ext:f(), ext:f()), make_atom(),
+ make_float(),
+ make_integer(), make_integer_range(ext:f()),
+ make_nil(), make_list(ext:f()), make_list_of_ints(ext:f()),
+ make_maybe_improper_list(ext:f()),
+ make_nonempty_list( ext:f()), make_nonempty_improper_list( ext:f()),
+ make_empty_map(), make_map(ext:f()),
+ make_map_known_types(ext:f(), ext:f()),
+ make_fun_unknown_arity_known_type(),
+ make_fun_known_arity_known_type(),
+ make_fun_unknown_arity_unknown_type(),
+ make_fun_known_arity_unknown_type(),
+ make_unconstrained_tuple(ext:f()),
+ make_known_size_tuple(ext:f()),
+ make_inexact_tuple(ext:f()),
+ make_union(),
+ make_bitstring(),
+ make_none()
+ }.
+
+
diff --git a/lib/compiler/test/core_fold_SUITE.erl b/lib/compiler/test/core_fold_SUITE.erl
index bfe8bfd168..5bb7ed4af8 100644
--- a/lib/compiler/test/core_fold_SUITE.erl
+++ b/lib/compiler/test/core_fold_SUITE.erl
@@ -566,7 +566,7 @@ configuration(_Config) ->
ok.
configuration() ->
- [forgotten || Components <- enemy, is_tuple(fun art/0)].
+ [forgotten || _Components <- enemy, is_tuple(fun art/0)].
art() ->
creating.
diff --git a/lib/compiler/test/fun_SUITE.erl b/lib/compiler/test/fun_SUITE.erl
index 387ed90ee6..d9608ef7d1 100644
--- a/lib/compiler/test/fun_SUITE.erl
+++ b/lib/compiler/test/fun_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -23,7 +23,8 @@
init_per_group/2,end_per_group/2,
test1/1,overwritten_fun/1,otp_7202/1,bif_fun/1,
external/1,eep37/1,eep37_dup/1,badarity/1,badfun/1,
- duplicated_fun/1,unused_fun/1,coverage/1]).
+ duplicated_fun/1,unused_fun/1,parallel_scopes/1,
+ coverage/1]).
%% Internal exports.
-export([call_me/1,dup1/0,dup2/0]).
@@ -39,6 +40,7 @@ groups() ->
[{p,[parallel],
[test1,overwritten_fun,otp_7202,bif_fun,external,eep37,
eep37_dup,badarity,badfun,duplicated_fun,unused_fun,
+ parallel_scopes,
coverage]}].
init_per_suite(Config) ->
@@ -60,7 +62,7 @@ end_per_group(_GroupName, Config) ->
l1() ->
[
- ?T((begin A = 3, F = fun(A) -> 1; (_) -> 2 end, F(2) end), 1),
+ ?T((begin _A = 3, F = fun(_A) -> 1; (_) -> 2 end, F(2) end), 1),
?T((begin G = fun(1=0) -> ok end, {'EXIT',_} = (catch G(2)), ok end), ok),
?T((begin F = fun(_, 1) -> 1; (F, N) -> N * F(F, N-1) end, F(F, 5) end), 120),
?T((begin F = fun(_, 1) -> 1; (F, N) -> N * F(F, N-1) end, F(F, 1), ok end), ok)
@@ -224,7 +226,7 @@ bad_external_fun() ->
eep37(Config) when is_list(Config) ->
F = fun Fact(N) when N > 0 -> N * Fact(N - 1); Fact(0) -> 1 end,
Add = fun _(N) -> N + 1 end,
- UnusedName = fun BlackAdder(N) -> N + 42 end,
+ UnusedName = fun _BlackAdder(N) -> N + 42 end,
720 = F(6),
10 = Add(9),
50 = UnusedName(8),
@@ -296,6 +298,230 @@ unused_fun(_Config) ->
catch _ -> ok end,
ok.
+parallel_scopes(_Config) ->
+ 1 = parallel_scopes_1a(),
+ 1 = parallel_scopes_1b(),
+ {'EXIT',{{badmatch,99},_}} = catch parallel_scopes_1c(),
+
+ 10 = parallel_scopes_2a(),
+ {'EXIT',{{badmatch,15},_}} = catch parallel_scopes_2b(),
+ 500 = parallel_scopes_2c(500, 500),
+ {'EXIT',{{badmatch,1000},_}} = catch parallel_scopes_2c(500, 1000),
+ 600 = parallel_scopes_2d(600, 600),
+ {'EXIT',{{badmatch,1000},_}} = catch parallel_scopes_2d(600, 1000),
+ {a,20} = parallel_scopes_2e(20, 20),
+ {'EXIT',{{badmatch,{a,25}},_}} = catch parallel_scopes_2e(20, 25),
+
+ {[42,2],42,a} = parallel_scopes_3(a),
+
+ 42 = parallel_scopes_4a(id(42), id(42)),
+ {'EXIT',{{badmatch,77},_}} = catch parallel_scopes_4a(42, 77),
+ 42 = parallel_scopes_4b(id(42), id(42)),
+ {'EXIT',{{badmatch,77},_}} = catch parallel_scopes_4b(42, 77),
+ [same,2,same,2] = parallel_scopes_4c(id(same), id(same)),
+ {'EXIT',{{badmatch,55},_}} = catch parallel_scopes_4c(42, 55),
+
+ 33 = parallel_scopes_5(id(33), id(33)),
+ {'EXIT',{{badmatch,44},_}} = catch parallel_scopes_5(33, 44),
+
+ 99 = parallel_scopes_6(id(99), id(99)),
+ {'EXIT',{{badmatch,88},_}} = catch parallel_scopes_6(77, 88),
+
+ 99 = parallel_scopes_7(id(99), id(99)),
+ {'EXIT',{{badmatch,88},_}} = catch parallel_scopes_7(77, 88),
+
+ 199 = parallel_scopes_8(id(199), id(199)),
+ {'EXIT',{{badmatch,200},_}} = catch parallel_scopes_8(id(199), id(200)),
+
+ {299,299+299} = parallel_scopes_9(id(299), id(299), id(299+299)),
+ {'EXIT',{{badmatch,300},_}} = catch parallel_scopes_9(id(299), id(300), id(0)),
+ {'EXIT',{{badmatch,0},_}} = catch parallel_scopes_9(id(299), id(299), id(0)),
+
+ 999 = parallel_scopes_10(false, 999, ignored, 999),
+ {'EXIT',{{badmatch,999},_}} = catch parallel_scopes_10(false, 700, ignored, 700),
+ {'EXIT',{{badmatch,1000},_}} = catch parallel_scopes_10(false, 999, ignored, 1000),
+ 999 = parallel_scopes_10(true, 999, 999, ignored),
+ 333 = parallel_scopes_10(true, 333, 333, ignored),
+ {'EXIT',{{badmatch,901},_}} = catch parallel_scopes_10(true, 900, 901, ignored),
+
+ 889 = parallel_scopes_11(889, 889, 889),
+ {'EXIT',{{badmatch,800},_}} = catch parallel_scopes_11(889, 800, 889),
+ {'EXIT',{{badmatch,810},_}} = catch parallel_scopes_11(889, 889, 810),
+ {'EXIT',{{badmatch,889},_}} = catch parallel_scopes_11(a, a, a),
+
+ 333 = parallel_scopes_12(333, 333, 333),
+ {'EXIT',{{badmatch,other},_}} = catch parallel_scopes_12(333, other, 333),
+ {'EXIT',{{badmatch,nope},_}} = catch parallel_scopes_12(333, 333, nope),
+
+ [1,100] = parallel_scopes_13(99, 100),
+ {'EXIT',{{badmatch,no},_}} = catch parallel_scopes_13(no, 100),
+ {'EXIT',{{badmatch,nope},_}} = catch parallel_scopes_13(99, nope),
+
+ ok.
+
+parallel_scopes_1a() ->
+ (begin X=1, true end
+ and
+ begin F=(fun () -> X=2 end), F(), true end) andalso X.
+
+parallel_scopes_1b() ->
+ (begin X=1, true end
+ and
+ begin F=(fun () -> X=2 end), F(), true end) andalso (X = 1).
+
+parallel_scopes_1c() ->
+ (begin X=1, true end
+ and
+ begin F=(fun () -> X=2 end), F(), true end) andalso (X = 99).
+
+parallel_scopes_2a() ->
+ begin X=10, true end
+ and
+ begin F=(fun () -> X=20 end), F(), true end
+ and
+ begin X=10, true end andalso X.
+
+parallel_scopes_2b() ->
+ begin X=10, true end
+ and
+ begin F=(fun () -> X=20 end), F(), true end
+ and
+ begin X=15, true end andalso X.
+
+parallel_scopes_2c(A, B) ->
+ begin X=A, true end
+ and
+ begin F = (fun () -> X = make_ref() end), F(), true end
+ and
+ begin X=B, true end andalso X.
+
+parallel_scopes_2d(A, B) ->
+ begin X=A, true end
+ and
+ begin F = (fun () -> X = make_ref() end), F(), true end
+ and
+ begin X=B, true end andalso (X = A).
+
+parallel_scopes_2e(A, B) ->
+ begin X = {a,A}, true end
+ and
+ begin F=(fun () -> X = 20 end), F(), true end
+ and
+ begin X = {a,B}, true end andalso X.
+
+parallel_scopes_3(A) ->
+ L = [X = id(42),
+ fun() -> X = 2 end()],
+ {L,X,A}.
+
+parallel_scopes_4a(A, B) ->
+ 4 = length([X = A,
+ fun() -> X = 2 end(),
+ X = B,
+ fun() -> X = 2 end()]),
+ X.
+
+parallel_scopes_4b(A, B) ->
+ 4 = length([X = A,
+ case id(true) of
+ true ->
+ fun() -> X = 2 end()
+ end,
+ X = B,
+ case id(false) of
+ false ->
+ fun() -> X = 2 end()
+ end]),
+ X.
+
+parallel_scopes_4c(A, B) ->
+ [X = A,
+ fun() -> X = 2 end(),
+ X = B,
+ fun() -> X = 2 end()].
+
+parallel_scopes_5(A, B) ->
+ 4 = length([X = A,
+ [fun() -> X = 2 end()],
+ X = B |
+ case id(false) of
+ false ->
+ [fun() -> X = 2 end()]
+ end]),
+ X.
+
+parallel_scopes_6(A, B) ->
+ 4 = tuple_size({X = A,
+ fun() -> X = 40 end(),
+ X = B,
+ fun() -> X = 50 end()}),
+ X.
+
+parallel_scopes_7(A, B) ->
+ 4 = tuple_size({X = A,
+ [fun() -> X = 40 end()],
+ X = B,
+ [fun() -> X = 50 end()]}),
+ X.
+
+parallel_scopes_8(A, B) ->
+ _ = [X = id(A),
+ begin fun() -> X = 2 end(), X = id(B) end],
+ X.
+
+parallel_scopes_9(A, B, C) ->
+ 3 = length([begin X = id(A), Y = id(A+B) end,
+ fun() -> X = 2 end(),
+ X = id(B)]),
+ {X,Y=C}.
+
+parallel_scopes_10(Bool, A, B, C) ->
+ T = {X = A,
+ case id(Bool) of
+ true ->
+ fun() -> X = 999 end(),
+ X = B;
+ false ->
+ X = C,
+ fun() -> X = 999 end()
+ end},
+ 2 = tuple_size(T),
+ X.
+
+parallel_scopes_11(A, B, C) ->
+ T = {X = A,
+ case id(true) of
+ true ->
+ X = B,
+ 2 = length([X = C, X = C]),
+ fun() -> X = 889 end();
+ false ->
+ X = cannot_happen
+ end},
+ 2 = tuple_size(T),
+ X.
+
+parallel_scopes_12(A, B, C) ->
+ T = {X = A,
+ case id(true) of
+ true ->
+ fun() -> X = whatever end(),
+ 2 = length([X = B, X = B]),
+ X = C;
+ false ->
+ X = cannot_happen
+ end},
+ 2 = tuple_size(T),
+ X.
+
+parallel_scopes_13(A, B) ->
+ [X = 1,
+ fun() ->
+ X = id(whatever),
+ 99 = A,
+ 100 = B
+ end()].
+
coverage(_Config) ->
ok = coverage_1(),
ok.
@@ -308,7 +534,5 @@ coverage_1() ->
("abc") -> party
end,
ok.
-
-
id(I) ->
I.
diff --git a/lib/compiler/test/guard_SUITE.erl b/lib/compiler/test/guard_SUITE.erl
index 5f45eb3f68..c02ee131e7 100644
--- a/lib/compiler/test/guard_SUITE.erl
+++ b/lib/compiler/test/guard_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -19,6 +19,10 @@
%%
-module(guard_SUITE).
+%% Warnings for obsolete guards are generated by erl_lint, so we will not
+%% any less testing of the compiler by suppressing them.
+-compile([nowarn_obsolete_guard]).
+
-include_lib("syntax_tools/include/merl.hrl").
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
@@ -1254,8 +1258,30 @@ is_function_2(Config) when is_list(Config) ->
F = fun(_) -> ok end,
if
- is_function(F, 1) -> ok
- end.
+ is_function(F, 1) -> ok
+ end,
+
+ variable_is_function_2(),
+
+ ok.
+
+variable_is_function_2() ->
+ F = fun() -> ok end,
+ [F] = vif_1([id(F)], id(0), []),
+ [F] = vif_2([id(F)], id(0) band 15, []),
+ ok.
+
+%% Completely unknown arity
+vif_1([F | Fs], Arity, Acc) when is_function(F, Arity) ->
+ vif_1(Fs, Arity, [F | Acc]);
+vif_1([], _Arity, Acc) ->
+ Acc.
+
+%% Arity known to be between 0 and 15
+vif_2([F | Fs], Arity, Acc) when is_function(F, Arity) ->
+ vif_2(Fs, Arity, [F | Acc]);
+vif_2([], _Arity, Acc) ->
+ Acc.
tricky(Config) when is_list(Config) ->
not_ok = tricky_1(1, 2),
@@ -1420,7 +1446,9 @@ rel_op_combinations(Config) when is_list(Config) ->
Red = gb_trees:from_orddict(Red0),
rel_op_combinations_3(100, Red),
- rel_op_combinations_4().
+ rel_op_combinations_4(),
+
+ rel_op_combinations_5().
rel_op_combinations_1(0, _) ->
ok;
@@ -1673,6 +1701,145 @@ rel_op_vars_1(X, N) when X =< N -> le.
rel_op_vars_2(X, N) when X =/= N -> ne;
rel_op_vars_2(X, N) when X >= N -> ge.
+rel_op_combinations_5() ->
+ lt = lt_gt_eq(a, b),
+ lt = lt_gt_eq(1.0, 42),
+ lt = lt_gt_eq(1, 42.0),
+
+ eq = lt_gt_eq(a, a),
+ eq = lt_gt_eq(42, 42),
+ eq = lt_gt_eq(42.0, 42),
+ eq = lt_gt_eq(42, 42.0),
+ eq = lt_gt_eq(42.0, 42.0),
+
+ gt = lt_gt_eq(b, a),
+ gt = lt_gt_eq(42.0, 1),
+ gt = lt_gt_eq(42, 1.0),
+
+ lt = eq_exact_lt_gt(a, b),
+ lt = eq_exact_lt_gt(1.0, 42),
+ lt = eq_exact_lt_gt(1, 42.0),
+
+ eq = eq_exact_lt_gt(a, a),
+ eq = eq_exact_lt_gt(42, 42),
+ none = eq_exact_lt_gt(42, 42.0),
+
+ gt = eq_exact_lt_gt(b, a),
+ gt = eq_exact_lt_gt(42.0, 1),
+ gt = eq_exact_lt_gt(42, 1.0),
+
+ ok.
+
+lt_gt_eq(A, B) ->
+ Res = lt_gt_eq_1(A, B),
+ Res = lt_gt_eq_2(A, B),
+ Res = lt_gt_eq_3(A, B),
+ Res = lt_gt_eq_4(A, B),
+ Res = lt_gt_eq_5(A, B),
+ lt_gt_eq_6(A, B).
+
+%% The last test in each 'if' is unnecessary.
+lt_gt_eq_1(A, B) ->
+ if
+ A < B -> lt;
+ A == B -> eq;
+ A > B -> gt
+ end.
+
+lt_gt_eq_2(A, B) ->
+ if
+ A > B -> gt;
+ A == B -> eq;
+ A < B -> lt
+ end.
+
+lt_gt_eq_3(A, B) ->
+ if
+ A == B -> eq;
+ A < B -> lt;
+ A > B -> gt
+ end.
+
+lt_gt_eq_4(A, B) ->
+ if
+ A == B -> eq;
+ A > B -> gt;
+ A < B -> lt
+ end.
+
+lt_gt_eq_5(A, B) ->
+ if
+ A < B -> lt;
+ A > B -> gt;
+ A == B -> eq
+ end.
+
+lt_gt_eq_6(A, B) ->
+ if
+ A > B -> gt;
+ A < B -> lt;
+ A == B -> eq
+ end.
+
+eq_exact_lt_gt(A, B) ->
+ Res = eq_exact_lt_gt_1(A, B),
+ Res = eq_exact_lt_gt_2(A, B),
+ Res = eq_exact_lt_gt_3(A, B),
+ Res = eq_exact_lt_gt_4(A, B),
+ Res = eq_exact_lt_gt_5(A, B),
+ Res = eq_exact_lt_gt_6(A, B).
+
+%% Not possible to optimize (unless we have type information so we
+%% know that A == B and A =:= B produces the same result).
+
+eq_exact_lt_gt_1(A, B) ->
+ if
+ A < B -> lt;
+ A =:= B -> eq;
+ A > B -> gt;
+ true -> none
+ end.
+
+eq_exact_lt_gt_2(A, B) ->
+ if
+ A > B -> gt;
+ A =:= B -> eq;
+ A < B -> lt;
+ true -> none
+ end.
+
+eq_exact_lt_gt_3(A, B) ->
+ if
+ A =:= B -> eq;
+ A < B -> lt;
+ A > B -> gt;
+ true -> none
+ end.
+
+eq_exact_lt_gt_4(A, B) ->
+ if
+ A =:= B -> eq;
+ A > B -> gt;
+ A < B -> lt;
+ true -> none
+ end.
+
+eq_exact_lt_gt_5(A, B) ->
+ if
+ A < B -> lt;
+ A > B -> gt;
+ A =:= B -> eq;
+ true -> none
+ end.
+
+eq_exact_lt_gt_6(A, B) ->
+ if
+ A > B -> gt;
+ A < B -> lt;
+ A =:= B -> eq;
+ true -> none
+ end.
+
%% Exhaustively test all combinations of relational operators
%% to ensure the correctness of the optimizations in beam_ssa_dead.
@@ -2925,5 +3092,4 @@ check(F, Result) ->
ct:fail(check_failed)
end.
-fc({'EXIT',{function_clause,_}}) -> ok;
-fc({'EXIT',{{case_clause,_},_}}) when ?MODULE =:= guard_inline_SUITE -> ok.
+fc({'EXIT',{function_clause,_}}) -> ok.
diff --git a/lib/compiler/test/inline_SUITE.erl b/lib/compiler/test/inline_SUITE.erl
index 7482f53ed4..dd93202a38 100644
--- a/lib/compiler/test/inline_SUITE.erl
+++ b/lib/compiler/test/inline_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -332,7 +332,7 @@ badarg(Reply, _A) ->
Reply.
otp_7223(Config) when is_list(Config) ->
- {'EXIT', {{case_clause,{1}},_}} = (catch otp_7223_1(1)),
+ {'EXIT', {function_clause, [{?MODULE,_,[1],_}|_]}} = (catch otp_7223_1(1)),
ok.
-compile({inline,[{otp_7223_1,1}]}).
diff --git a/lib/compiler/test/lc_SUITE.erl b/lib/compiler/test/lc_SUITE.erl
index fdb93d4b47..7d30f1c74f 100644
--- a/lib/compiler/test/lc_SUITE.erl
+++ b/lib/compiler/test/lc_SUITE.erl
@@ -90,8 +90,8 @@ basic(Config) when is_list(Config) ->
"abc123" = alphanum("?abc123.;"),
%% Aliased patterns.
- [] = [t || {C=D}={_,_} <- []],
- [] = [X || {X,{Y}={X,X}} <- []],
+ [] = [t || {_C=_D}={_,_} <- []],
+ [] = [X || {X,{_Y}={X,X}} <- []],
[t] = [t || "a"++"b" = "ab" <- ["ab"]],
%% Strange filter block.
diff --git a/lib/compiler/test/match_SUITE.erl b/lib/compiler/test/match_SUITE.erl
index 422d3a6cf9..5fc487e7a9 100644
--- a/lib/compiler/test/match_SUITE.erl
+++ b/lib/compiler/test/match_SUITE.erl
@@ -351,8 +351,8 @@ entirely() ->
[receive _ -> Voice end || banking <- printer].
printer() ->
- {[Indoor] = [] = associates},
- [ireland || Indoor <- Indoor].
+ {[_Indoor] = [] = associates},
+ [ireland || _Indoor <- _Indoor].
tench() ->
E = begin
@@ -364,7 +364,7 @@ tench() ->
perch(X) ->
begin
put(perch, get(perch)+1),
- [A] = [] = {spine,X}
+ [_A] = [] = {spine,X}
end.
salmon() ->
@@ -497,7 +497,7 @@ untuplify_2(V1, V2) ->
shortcut_boolean(Config) when is_list(Config) ->
false = shortcut_boolean_1([0]),
true = shortcut_boolean_1({42}),
- maybe = shortcut_boolean_1(self()),
+ 'maybe' = shortcut_boolean_1(self()),
{'EXIT',_} = (catch shortcut_boolean_1([a,b])),
{'EXIT',_} = (catch shortcut_boolean_1({a,b})),
ok.
@@ -511,7 +511,7 @@ shortcut_boolean_1(X) ->
end,
not V;
false ->
- maybe
+ 'maybe'
end,
id(Outer).
diff --git a/lib/compiler/test/maybe_SUITE.erl b/lib/compiler/test/maybe_SUITE.erl
new file mode 100644
index 0000000000..905bc33584
--- /dev/null
+++ b/lib/compiler/test/maybe_SUITE.erl
@@ -0,0 +1,278 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(maybe_SUITE).
+-include_lib("common_test/include/ct.hrl").
+
+%% Note: also require the feature to be set during runtime as long as
+%% the feature is experimental. This is currently done in ../Makefile
+%% by overriding the test target. Ugly and very non local.
+-feature(enable, maybe_expr).
+
+-export([all/0, groups/0, init_per_suite/1, end_per_suite/1]).
+-export([basic/1, nested/1]).
+
+all() ->
+ [{group,p}].
+
+groups() ->
+ [{p,[parallel],
+ [basic,nested]}].
+
+init_per_suite(Config) ->
+ test_lib:recompile(?MODULE),
+ Config.
+
+end_per_suite(_Config) ->
+ ok.
+
+-record(value, {v}).
+
+basic(_Config) ->
+ {ok,42,fish} = basic_1(0, #{0 => {ok,42}, 42 => {ok,fish}}),
+ error = basic_1(0, #{0 => {ok,42}, 42 => {error,whatever}}),
+ error = basic_1(0, #{0 => {ok,42}, 42 => error}),
+ error = basic_1(0, #{0 => error}),
+ error = basic_1(0, #{0 => {error,whatever}}),
+ some_value = basic_1(0, #{0 => #value{v=some_value}}),
+ {'EXIT',{{else_clause,something_wrong},[_|_]}} = catch basic_1(0, #{0 => something_wrong}),
+
+ {ok,life,"universe",everything} = basic_2(0, #{0 => {ok,life},
+ life => "universe",
+ "universe" => {ok,everything}}),
+ error = basic_2(0, #{0 => {ok,life},
+ life => "universe",
+ "universe" => error}),
+ {'EXIT',{{badmatch,not_a_list},[_|_]}} = catch basic_2(0, #{0 => {ok,life},
+ life => not_a_list}),
+ {'EXIT',{{else_clause,not_ok},[_|_]}} = catch basic_2(0, #{0 => {ok,life},
+ life => "universe",
+ "universe" => not_ok}),
+ {'EXIT',{{else_clause,not_ok},[_|_]}} = catch basic_2(0, #{0 => not_ok}),
+
+ {ok,42,fish,dolphins} = basic_3(0, #{0 => {ok,42}, 42 => {ok,fish},
+ fish => {ok,#value{v=dolphins}}}),
+ {error,whatever} = basic_3(0, #{0 => {ok,42}, 42 => {error,whatever}}),
+ failed = basic_3(0, #{0 => {ok,42}, 42 => failed}),
+ failed_early = basic_3(0, #{0 => failed_early}),
+
+ y = maybe nomatch ?= id(x) else _ -> y end,
+ y = maybe nomatch ?= id(x) else _ -> x, y end,
+
+ x = maybe nomatch ?= id(x) else E1 -> E1 end,
+
+ 6 = maybe X1 = 2+2, X1+2 end,
+ 6 = maybe X2 = 2+2, X2+2 else {error, T} -> T end,
+ {"llo", "hello", "hello"} = maybe Y1 = "he"++X3=Z1 ?= "hello", {X3,Y1,Z1} end,
+ {"llo", "hello", "llo"} = maybe Y2 = "he"++(X4=Z2) ?= "hello", {X4,Y2,Z2} end,
+
+ whatever = maybe
+ AlwaysMatching ?= id(whatever),
+ AlwaysMatching
+ else
+ E2 -> E2
+ end,
+
+ ok.
+
+basic_1(V0, M) ->
+ Res = basic_1a(V0, M),
+ {wrapped,Res} = basic_1b(V0, M),
+ {wrapped,Res} = basic_1c(V0, M),
+ Res.
+
+basic_1a(V0, M) ->
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ {ok,V2} ?= do_something(V1, M),
+ {ok,V1,V2}
+ else
+ {error,_} ->
+ error;
+ error ->
+ error;
+ #value{v=V} ->
+ V
+ end.
+
+basic_1b(V0, M) ->
+ Result =
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ {ok,V2} ?= do_something(V1, M),
+ {ok,V1,V2}
+ else
+ {error,_} ->
+ error;
+ error ->
+ error;
+ #value{v=V} ->
+ V
+ end,
+ {wrapped,Result}.
+
+basic_1c(V0, M) ->
+ OK = id(ok),
+ Error = id(error),
+ Result =
+ maybe
+ {OK,V1} ?= do_something(V0, M),
+ {OK,V2} ?= do_something(V1, M),
+ {OK,V1,V2}
+ else
+ {Error,_} ->
+ Error;
+ Error ->
+ Error;
+ #value{v=V} ->
+ V
+ end,
+ {wrapped,Result}.
+
+basic_2(V0, M) ->
+ Res = basic_2a(V0, M),
+ {wrapped,Res} = basic_2b(V0, M),
+ Res.
+
+basic_2a(V0, M) ->
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ V2 = [_|_] = do_something(V1, M),
+ {ok,V3} ?= do_something(V2, M),
+ {ok,V1,V2,V3}
+ else
+ {error,_} ->
+ error;
+ error ->
+ error;
+ #value{v=V} ->
+ V
+ end.
+
+basic_2b(V0, M) ->
+ Result =
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ V2 = [_|_] = do_something(V1, M),
+ {ok,V3} ?= do_something(V2, M),
+ {ok,V1,V2,V3}
+ else
+ {error,_} ->
+ error;
+ error ->
+ error;
+ #value{v=V} ->
+ V
+ end,
+ _ = id(0),
+ {wrapped,Result}.
+
+basic_3(V0, M) ->
+ Res = basic_3a(V0, M),
+ {wrapped,Res} = basic_3b(V0, M),
+ Res.
+
+basic_3a(V0, M) ->
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ {ok,V2} ?= do_something(V1, M),
+ {ok,#value{v=V3}} ?= do_something(V2, M),
+ {ok,V1,V2,V3}
+ end.
+
+basic_3b(V0, M) ->
+ Result =
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ {ok,V2} ?= do_something(V1, M),
+ {ok,#value{v=V3}} ?= do_something(V2, M),
+ {ok,V1,V2,V3}
+ end,
+ {wrapped,Result}.
+
+nested(_Config) ->
+ {outer_fail,not_ok} = nested_1(0, #{0 => not_ok}),
+ {x,{error,inner}} = nested_1(0, #{0 => {ok,x}, x => {error,inner}}),
+ {outer_fail,{unexpected,not_error}} = nested_1(0, #{0 => {ok,x}, x => not_error}),
+ ok.
+
+nested_1(V0, M) ->
+ Res = nested_1a(V0, M),
+ {wrapped,Res} = nested_1b(V0, M),
+ {wrapped,Res} = nested_1c(V0, M),
+ Res.
+
+nested_1a(V0, M) ->
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ V2 = {error,_} ?=
+ maybe
+ {error, _} ?= id(do_something(V1, M))
+ else
+ Unexpected -> {unexpected, Unexpected}
+ end,
+ {V1,V2}
+ else
+ Res -> {outer_fail,Res}
+ end.
+
+nested_1b(V0, M) ->
+ Result =
+ maybe
+ {ok,V1} ?= do_something(V0, M),
+ V2 = {error,_} ?=
+ maybe
+ {error, _} ?= id(do_something(V1, M))
+ else
+ Unexpected -> {unexpected, Unexpected}
+ end,
+ {V1,V2}
+ else
+ Res -> {outer_fail,Res}
+ end,
+ {wrapped,Result}.
+
+nested_1c(V0, M) ->
+ Result =
+ maybe
+ R ?= maybe
+ {ok,V1} ?= do_something(V0, M),
+ {error,_} = V2 ?=
+ maybe
+ {error, _} ?= id(do_something(V1, M))
+ else
+ Unexpected -> {unexpected, Unexpected}
+ end,
+ {V1,V2}
+ else
+ Res -> {outer_fail,Res}
+ end,
+ R
+ else
+ Var -> Var
+ end,
+ {wrapped,Result}.
+
+%% Utility functions.
+
+do_something(V, M) ->
+ map_get(id(V), M).
+
+id(X) -> X.
diff --git a/lib/compiler/test/misc_SUITE.erl b/lib/compiler/test/misc_SUITE.erl
index f0115008fc..7fb925cc54 100644
--- a/lib/compiler/test/misc_SUITE.erl
+++ b/lib/compiler/test/misc_SUITE.erl
@@ -257,17 +257,6 @@ silly_coverage(Config) when is_list(Config) ->
TrimInput = BlockInput,
expect_error(fun() -> beam_trim:module(TrimInput, []) end),
- %% beam_peep. This is tricky. Use a select instruction with
- %% an odd number of elements in the list to crash
- %% prune_redundant_values/2 but not beam_clean:clean_labels/1.
- PeepInput = {?MODULE,[{foo,0}],[],
- [{function,foo,0,2,
- [{label,1},
- {func_info,{atom,?MODULE},{atom,foo},0},
- {label,2},{select,select_val,r,{f,2},[{f,2}]}]}],
- 2},
- expect_error(fun() -> beam_peep:module(PeepInput, []) end),
-
BeamZInput = {?MODULE,[{foo,0}],[],
[{function,foo,0,2,
[{label,1},
diff --git a/lib/compiler/test/receive_SUITE.erl b/lib/compiler/test/receive_SUITE.erl
index 5ddabe9346..ce2f82942c 100644
--- a/lib/compiler/test/receive_SUITE.erl
+++ b/lib/compiler/test/receive_SUITE.erl
@@ -527,7 +527,7 @@ recv_in_try_1(Timeout, Format) ->
%% {test,test_arity,{f,148},[{x,0},2]}.
%% {get_tuple_element,{x,0},0,{y,1}}. %y1 is fragile.
%%
- %% %% Here the fragility of y1 would be be progated to
+ %% %% Here the fragility of y1 would be be propagated to
%% %% the 'catch' below. Incorrect, since get_tuple_element
%% %% can't fail.
%% {get_tuple_element,{x,0},1,{x,2}}.
diff --git a/lib/compiler/test/receive_SUITE_data/ref_opt/yes_10.erl b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_10.erl
index 7ce6e6103c..ea228d4ac6 100644
--- a/lib/compiler/test/receive_SUITE_data/ref_opt/yes_10.erl
+++ b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_10.erl
@@ -7,7 +7,7 @@
f() ->
Ref = make_ref(),
receive
- %% Artifical example to cover more code in beam_receive.
+ %% Artificial example to cover more code in beam_receive.
{X,Y} when Ref =/= X, Ref =:= Y ->
ok
end.
diff --git a/lib/compiler/test/receive_SUITE_data/ref_opt/yes_11.erl b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_11.erl
index 62f439fc42..b58d9f7561 100644
--- a/lib/compiler/test/receive_SUITE_data/ref_opt/yes_11.erl
+++ b/lib/compiler/test/receive_SUITE_data/ref_opt/yes_11.erl
@@ -4,7 +4,7 @@
?MODULE() ->
ok.
-%% Artifical example to cover more code in beam_receive.
+%% Artificial example to cover more code in beam_receive.
do_call(Process, Request) ->
Mref = erlang:monitor(process, Process),
Process ! Request,
diff --git a/lib/compiler/test/record_SUITE.erl b/lib/compiler/test/record_SUITE.erl
index 2dd40e6a77..cd60525691 100644
--- a/lib/compiler/test/record_SUITE.erl
+++ b/lib/compiler/test/record_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -73,17 +73,17 @@ errors(Config) when is_list(Config) ->
Foo = #foo{a=1,b=2,c=3,d=4},
#foo{a=19,b=42,c=3,d=4} = update_foo(Foo, 19, 42),
- {'EXIT',{{badrecord,bar},_}} = (catch update_foo_bar(Foo, 19)),
- {'EXIT',{{badrecord,bar},_}} = (catch update_foo_bar(Foo, 19, 35)),
- {'EXIT',{{badrecord,bar},_}} = (catch update_foo_bar(Foo, 19, 35, 17)),
- {'EXIT',{{badrecord,bar},_}} = (catch update_foo_bar(Foo, 19, 35, 17, 42)),
-
- {'EXIT',{{badrecord,barf},_}} = (catch update_foo_barf(Foo, 19)),
- {'EXIT',{{badrecord,barf},_}} = (catch update_foo_barf(Foo, 19, 35)),
- {'EXIT',{{badrecord,barf},_}} = (catch update_foo_barf(Foo, 19, 35, 17)),
- {'EXIT',{{badrecord,barf},_}} = (catch update_foo_barf(Foo, 19, 35, 17, 42)),
- {'EXIT',{{badrecord,barf},_}} = (catch update_foo_barf(Foo, 19,
- 35, 17, 42, -2)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_bar(Foo, 19)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_bar(Foo, 19, 35)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_bar(Foo, 19, 35, 17)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_bar(Foo, 19, 35, 17, 42)),
+
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_barf(Foo, 19)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_barf(Foo, 19, 35)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_barf(Foo, 19, 35, 17)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_barf(Foo, 19, 35, 17, 42)),
+ {'EXIT',{{badrecord,Foo},_}} = (catch update_foo_barf(Foo, 19,
+ 35, 17, 42, -2)),
ok.
diff --git a/lib/compiler/test/record_SUITE_data/record_access_in_guards.erl b/lib/compiler/test/record_SUITE_data/record_access_in_guards.erl
index dbd2419ad2..26c5c74986 100644
--- a/lib/compiler/test/record_SUITE_data/record_access_in_guards.erl
+++ b/lib/compiler/test/record_SUITE_data/record_access_in_guards.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -172,7 +172,7 @@ t() ->
ok = F(R, 42, tab),
error = F(R, 42, a),
error = F(R, 0, tab),
- {'EXIT',{{badrecord,r},_}} = (catch F({x,y,z}, 4, 5)),
+ {'EXIT',{{badrecord,{x,y,z}},_}} = (catch F({x,y,z}, 4, 5)),
ok
end(#r{a=42,b=tab}),
diff --git a/lib/compiler/test/test_lib.erl b/lib/compiler/test/test_lib.erl
index 5ed222fc54..01d7bd5853 100644
--- a/lib/compiler/test/test_lib.erl
+++ b/lib/compiler/test/test_lib.erl
@@ -86,8 +86,9 @@ opt_opts(Mod) ->
lists:filter(fun
(debug_info) -> true;
(dialyzer) -> true;
+ ({enable_feature,_}) -> true;
(inline) -> true;
- (no_bsm3) -> true;
+ (no_bs_create_bin) -> true;
(no_bsm_opt) -> true;
(no_copt) -> true;
(no_fun_opt) -> true;
@@ -95,11 +96,11 @@ opt_opts(Mod) ->
(no_make_fun3) -> true;
(no_module_opt) -> true;
(no_postopt) -> true;
- (no_put_tuple2) -> true;
(no_recv_opt) -> true;
(no_share_opt) -> true;
(no_shared_fun_wrappers) -> true;
- (no_ssa_float) -> true;
+ (no_ssa_opt_float) -> true;
+ (no_ssa_opt_ranges) -> true;
(no_ssa_opt) -> true;
(no_stack_trimming) -> true;
(no_swap) -> true;
@@ -118,7 +119,6 @@ get_data_dir(Config) ->
"_no_copt_SUITE",
"_post_opt_SUITE",
"_inline_SUITE",
- "_r21_SUITE",
"_no_module_opt_SUITE",
"_no_type_opt_SUITE",
"_no_ssa_opt_SUITE"],
@@ -137,7 +137,8 @@ is_cloned_mod_1("_no_copt_SUITE") -> true;
is_cloned_mod_1("_no_ssa_opt_SUITE") -> true;
is_cloned_mod_1("_post_opt_SUITE") -> true;
is_cloned_mod_1("_inline_SUITE") -> true;
-is_cloned_mod_1("_21_SUITE") -> true;
+is_cloned_mod_1("_23_SUITE") -> true;
+is_cloned_mod_1("_24_SUITE") -> true;
is_cloned_mod_1("_no_module_opt_SUITE") -> true;
is_cloned_mod_1([_|T]) -> is_cloned_mod_1(T);
is_cloned_mod_1([]) -> false.
diff --git a/lib/compiler/test/trycatch_SUITE.erl b/lib/compiler/test/trycatch_SUITE.erl
index 8ba8e39d89..9933db36b0 100644
--- a/lib/compiler/test/trycatch_SUITE.erl
+++ b/lib/compiler/test/trycatch_SUITE.erl
@@ -121,7 +121,7 @@ basic(Conf) when is_list(Conf) ->
%% Try/of
ok = try V of
{a,variable} -> ok
- catch nisse -> erro
+ catch nisse -> error
end,
%% Unmatchable clauses.
@@ -1015,7 +1015,7 @@ do_plain_catch_list(X) ->
andalso_orelse(Config) when is_list(Config) ->
{2,{a,42}} = andalso_orelse_1(true, {a,42}),
{b,{b}} = andalso_orelse_1(false, {b}),
- {catched,no_tuple} = andalso_orelse_1(false, no_tuple),
+ {caught,no_tuple} = andalso_orelse_1(false, no_tuple),
ok = andalso_orelse_2({type,[a]}),
also_ok = andalso_orelse_2({type,[]}),
@@ -1031,7 +1031,7 @@ andalso_orelse_1(A, B) ->
element(1, B)
end
catch error:_ ->
- catched
+ caught
end,B}.
andalso_orelse_2({Type,Keyval}) ->
@@ -1259,7 +1259,7 @@ stacktrace(_Config) ->
try
throw(x)
catch
- throw:x:IntentionallyUnused ->
+ throw:x:_IntentionallyUnused ->
ok
end.
diff --git a/lib/compiler/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl
index 53f21fcbbe..8ab46fed09 100644
--- a/lib/compiler/test/warnings_SUITE.erl
+++ b/lib/compiler/test/warnings_SUITE.erl
@@ -43,7 +43,8 @@
redundant_boolean_clauses/1,
underscore/1,no_warnings/1,
bit_syntax/1,inlining/1,tuple_calls/1,
- recv_opt_info/1,opportunistic_warnings/1]).
+ recv_opt_info/1,opportunistic_warnings/1,
+ eep49/1]).
init_per_testcase(_Case, Config) ->
Config.
@@ -66,7 +67,8 @@ groups() ->
maps_bin_opt_info,
redundant_boolean_clauses,
underscore,no_warnings,bit_syntax,inlining,
- tuple_calls,recv_opt_info,opportunistic_warnings]}].
+ tuple_calls,recv_opt_info,opportunistic_warnings,
+ eep49]}].
init_per_suite(Config) ->
test_lib:recompile(?MODULE),
@@ -1165,6 +1167,28 @@ opportunistic_warnings(Config) ->
ok.
+%% Test value-based error handling (EEP 49).
+eep49(Config) ->
+ Ts = [{basic,
+ <<"foo(X) ->
+ maybe
+ %% There should be no warning.
+ Always ?= X,
+ Always
+ end.
+ ">>,
+ [{enable_feature,maybe_expr}],
+ []},
+ {disabled,
+ <<"foo() -> maybe. %Atom maybe.
+ ">>,
+ [{disable_feature,maybe_expr}],
+ []}
+ ],
+ run(Config, Ts),
+ ok.
+
+
%%%
%%% End of test cases.
%%%
diff --git a/lib/crypto/c_src/Makefile.in b/lib/crypto/c_src/Makefile.in
index 4478ed7d9c..ec5cb32973 100644
--- a/lib/crypto/c_src/Makefile.in
+++ b/lib/crypto/c_src/Makefile.in
@@ -112,6 +112,7 @@ CRYPTO_OBJS = $(OBJDIR)/crypto$(TYPEMARKER).o \
$(OBJDIR)/rand$(TYPEMARKER).o \
$(OBJDIR)/rsa$(TYPEMARKER).o \
$(OBJDIR)/srp$(TYPEMARKER).o \
+ $(OBJDIR)/hash_equals$(TYPEMARKER).o \
$(OBJDIR)/pbkdf2_hmac$(TYPEMARKER).o
CALLBACK_OBJS = $(OBJDIR)/crypto_callback$(TYPEMARKER).o
@@ -150,7 +151,7 @@ CRYPTO_LINK_LIB=$(SSL_DED_LD_RUNTIME_LIBRARY_PATH) -L$(SSL_LIBDIR) -l$(SSL_CRYPT
EXTRA_FLAGS = -DHAVE_DYNAMIC_CRYPTO_LIB
else
SSL_DED_LD_RUNTIME_LIBRARY_PATH=
-CRYPTO_LINK_LIB=$(SSL_LIBDIR)/lib$(SSL_CRYPTO_LIBNAME).a
+CRYPTO_LINK_LIB=$(SSL_LIBDIR)/lib$(SSL_CRYPTO_LIBNAME).a
EXTRA_FLAGS =
CRYPTO_OBJS := $(CRYPTO_OBJS) $(CALLBACK_OBJS)
CALLBACK_OBJS =
@@ -255,7 +256,7 @@ docs:
# ----------------------------------------------------
# Release Target
-# ----------------------------------------------------
+# ----------------------------------------------------
include $(ERL_TOP)/make/otp_release_targets.mk
release_spec: opt
diff --git a/lib/crypto/c_src/bn.c b/lib/crypto/c_src/bn.c
index 4c2167703a..838173c5e8 100644
--- a/lib/crypto/c_src/bn.c
+++ b/lib/crypto/c_src/bn.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -192,3 +192,42 @@ ERL_NIF_TERM bn2term(ErlNifEnv* env, size_t size, const BIGNUM *bn)
return enif_make_badarg(env);
}
#endif
+
+
+#ifdef HAS_3_0_API
+
+int get_ossl_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest)
+{
+ BIGNUM *bn = NULL;
+ ErlNifBinary tmp;
+
+ if (!get_bn_from_bin(env, bin, &bn) ||
+ !enif_inspect_binary(env, bin_from_bn(env,bn), &tmp) || // Allocate buf
+ BN_bn2nativepad(bn, tmp.data, tmp.size) < 0) {// Fill with BN in right endianity
+ if (bn) BN_free(bn);
+ return 0;
+ }
+
+ *dest = OSSL_PARAM_construct_BN(key, tmp.data, tmp.size);
+ if (bn) BN_free(bn);
+ return 1;
+}
+
+int get_ossl_param_from_bin_in_list(ErlNifEnv* env, char* key, ERL_NIF_TERM *listcell, OSSL_PARAM *dest)
+{
+ ERL_NIF_TERM head;
+
+ return
+ enif_get_list_cell(env, *listcell, &head, listcell) &&
+ get_ossl_param_from_bin(env, key, head, dest);
+}
+
+#endif
+
+
+
+
+
+
+
+
diff --git a/lib/crypto/c_src/bn.h b/lib/crypto/c_src/bn.h
index 8b309db089..f0b447970f 100644
--- a/lib/crypto/c_src/bn.h
+++ b/lib/crypto/c_src/bn.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,4 +34,10 @@ int get_bn_from_mpint(ErlNifEnv* env, ERL_NIF_TERM term, BIGNUM** bnp);
int get_bn_from_bin(ErlNifEnv* env, ERL_NIF_TERM term, BIGNUM** bnp);
int get_bn_from_bin_sz(ErlNifEnv* env, ERL_NIF_TERM term, BIGNUM** bnp, size_t* binsize);
+#ifdef HAS_3_0_API
+int get_ossl_param_from_bin(ErlNifEnv* env, char* key, ERL_NIF_TERM bin, OSSL_PARAM *dest);
+int get_ossl_param_from_bin_in_list(ErlNifEnv* env, char* key, ERL_NIF_TERM *listcell, OSSL_PARAM *dest);
+#endif
+
#endif /* E_BN_H__ */
+
diff --git a/lib/crypto/c_src/common.h b/lib/crypto/c_src/common.h
index 593a58373f..5da20fd0c8 100644
--- a/lib/crypto/c_src/common.h
+++ b/lib/crypto/c_src/common.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,4 +46,6 @@ ERL_NIF_TERM raise_exception(ErlNifEnv* env, ERL_NIF_TERM id, int arg_num, char*
#define EXCP_NOTSUP_N(Env, ArgNum, Str) raise_exception((Env), atom_notsup, (ArgNum), (Str), __FILE__, __LINE__)
#define EXCP_BADARG_N(Env, ArgNum, Str) raise_exception((Env), atom_badarg, (ArgNum), (Str), __FILE__, __LINE__)
+#define assign_goto(Var, Goto, CALL) {Var = (CALL); goto Goto;}
+
#endif /* E_COMMON_H__ */
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index 5d1c1b306e..042d122f53 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -42,6 +42,7 @@
#include "evp.h"
#include "fips.h"
#include "hash.h"
+#include "hash_equals.h"
#include "hmac.h"
#include "info.h"
#include "math.h"
@@ -91,6 +92,9 @@ static ErlNifFunc nif_funcs[] = {
{"rand_uniform_nif", 2, rand_uniform_nif, 0},
{"mod_exp_nif", 4, mod_exp_nif, 0},
{"do_exor", 2, do_exor, 0},
+
+ {"hash_equals_nif", 2, hash_equals_nif, 0},
+
{"pbkdf2_hmac_nif", 5, pbkdf2_hmac_nif, 0},
{"pkey_sign_nif", 5, pkey_sign_nif, 0},
{"pkey_verify_nif", 6, pkey_verify_nif, 0},
@@ -105,7 +109,7 @@ static ErlNifFunc nif_funcs[] = {
{"srp_user_secret_nif", 7, srp_user_secret_nif, 0},
{"srp_host_secret_nif", 5, srp_host_secret_nif, 0},
- {"ec_key_generate", 2, ec_key_generate, 0},
+ {"ec_generate_key_nif", 2, ec_generate_key_nif, 0},
{"ecdh_compute_key_nif", 3, ecdh_compute_key_nif, 0},
{"rand_seed_nif", 1, rand_seed_nif, 0},
@@ -332,3 +336,4 @@ static void unload(ErlNifEnv* env, void* priv_data)
#endif
}
+
diff --git a/lib/crypto/c_src/dh.c b/lib/crypto/c_src/dh.c
index 67be0c81f0..ebf47cae3c 100644
--- a/lib/crypto/c_src/dh.c
+++ b/lib/crypto/c_src/dh.c
@@ -21,9 +21,248 @@
#include "dh.h"
#include "bn.h"
+
+#if !defined(HAVE_DH)
+ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+ return enif_raise_exception(env, atom_notsup);
+}
+
+ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+ return enif_raise_exception(env, atom_notsup);
+}
+
+#else /* HAVE_DH */
+
+
+# ifdef HAS_3_0_API
+
+/* Has 3_0 */
+ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{/* (PrivKey|undefined, DHParams=[P,G], 0, Len|0) */
+ unsigned long len = 0;
+ int i = 0;
+ OSSL_PARAM params[8];
+ EVP_PKEY *pkey = NULL, *pkey_gen = NULL;
+ EVP_PKEY_CTX *pctx = NULL, *pctx_gen = NULL;
+ BIGNUM *pub_key_gen = NULL, *priv_key_gen = NULL;
+ unsigned char *pub_ptr, *prv_ptr;
+ int pub_len, prv_len;
+ ERL_NIF_TERM ret_pub, ret_prv, ret = atom_undefined;
+
+ /* Fetch parameters and assign them to params[] */
+ if (argv[0] != atom_undefined)
+ if (!get_ossl_param_from_bin(env, "priv", argv[0], &params[i++])) {
+ ret = EXCP_BADARG_N(env, 0, "PrivKeyIn");
+ goto done;
+ }
+
+ { /*argv[1] - the lists [P,G] */
+ ERL_NIF_TERM head, tail;
+
+ head = argv[1];
+ if (!get_ossl_param_from_bin_in_list(env, "p", &head, &params[i++]) ) {
+ ret = EXCP_BADARG_N(env, 1, "Bad value of 'p'");
+ goto done;
+ }
+
+ if (!get_ossl_param_from_bin_in_list(env, "g", &head, &params[i++]) ) {
+ ret = EXCP_BADARG_N(env, 1, "Bad value of 'g'");
+ goto done;
+ }
+
+ tail = head;
+ if (!enif_is_empty_list(env,tail)) {
+ ret = EXCP_BADARG_N(env, 1, "Not a two-element list");
+ goto done;
+ }
+ }
+
+ /* argv[2] is always hardcoded to 0 in crypto.erl. A left over from some older version?
+ Let's skip that one
+ */
+
+ /* argv[3] is the length of the private key that is to be generated */
+ if (!enif_get_ulong(env, argv[3], &len) ||
+ (len > LONG_MAX) ) {
+ ret = EXCP_BADARG_N(env, 3, "Bad value of length element");
+ goto done;
+ }
+ else if (len)
+ params[i++] = OSSL_PARAM_construct_uint64("priv_len", &len);
+
+ /* End of parameter fetching */
+ params[i++] = OSSL_PARAM_construct_end();
+
+ pctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL);
+
+ if (EVP_PKEY_fromdata_init(pctx) <= 0) {
+ ret = EXCP_ERROR(env, "Can't init fromdata");
+ goto done;
+ }
+ if (EVP_PKEY_fromdata(pctx, &pkey, EVP_PKEY_KEYPAIR, params) <= 0) {
+ ret = EXCP_ERROR(env, "Can't do fromdata");
+ goto done;
+ }
+
+ /* Generate a new pkey from the data in the old */
+
+ pctx_gen = EVP_PKEY_CTX_new_from_pkey(NULL, pkey, NULL);
+
+ if (!EVP_PKEY_keygen_init(pctx_gen)) {
+ ret = EXCP_ERROR(env, "Can't init DH generation");
+ goto done;
+ }
+
+ if (!EVP_PKEY_CTX_set_params(pctx_gen, params)) {
+ ret = EXCP_ERROR(env, "Can't set params");
+ goto done;
+ }
+
+ if (!EVP_PKEY_generate(pctx_gen, &pkey_gen)) {
+ ret = EXCP_ERROR(env, "Can't generate DH key pair");
+ goto done;
+ }
+
+ /* Finally return the OTP representation of the keys: */
+
+ if (!EVP_PKEY_get_bn_param(pkey_gen, "pub", &pub_key_gen)) {
+ ret = EXCP_ERROR(env, "Can't get public key");
+ goto done;
+ }
+ if ((pub_len = BN_num_bytes(pub_key_gen)) < 0 ||
+ (pub_ptr = enif_make_new_binary(env, (size_t)pub_len, &ret_pub)) == NULL ||
+ BN_bn2bin(pub_key_gen, pub_ptr) < 0)
+ {
+ ret = EXCP_ERROR(env, "Can't convert public key");
+ goto done;
+ }
+
+ if (!EVP_PKEY_get_bn_param(pkey_gen, "priv", &priv_key_gen)) {
+ ret = EXCP_ERROR(env, "Can't get private key");
+ goto done;
+ }
+ if ((prv_len = BN_num_bytes(priv_key_gen)) < 0 ||
+ (prv_ptr = enif_make_new_binary(env, (size_t)prv_len, &ret_prv)) == NULL ||
+ BN_bn2bin(priv_key_gen, prv_ptr) < 0)
+ {
+ ret = EXCP_ERROR(env, "Can't convert private key");
+ goto done;
+ }
+
+ ERL_VALGRIND_MAKE_MEM_DEFINED(pub_ptr, pub_len);
+ ERL_VALGRIND_MAKE_MEM_DEFINED(prv_ptr, prv_len);
+
+ ret = enif_make_tuple2(env, ret_pub, ret_prv);
+
+ done:
+ if (pub_key_gen) BN_free(pub_key_gen);
+ if (priv_key_gen) BN_free(priv_key_gen);
+ if (pkey) EVP_PKEY_free(pkey);
+ if (pkey_gen) EVP_PKEY_free(pkey_gen);
+ if (pctx) EVP_PKEY_CTX_free(pctx);
+ if (pctx_gen) EVP_PKEY_CTX_free(pctx_gen);
+
+ return ret;
+}
+
+/* Has 3_0 */
+ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{/* (OthersPublicKey, MyPrivateKey, DHParams=[P,G]) */
+ ERL_NIF_TERM ret;
+ ErlNifBinary ret_bin;
+ size_t sz;
+ int ret_bin_alloc = 0;
+ int i = 0;
+ OSSL_PARAM params[5];
+ EVP_PKEY_CTX *own_pctx = NULL, *peer_pctx = NULL, *pctx_gen = NULL;
+ EVP_PKEY *own_pkey = NULL, *peer_pkey = NULL;
+
+ /* Fetch parameters */
+
+ /* Build peer_pkey */
+
+ if (!get_ossl_param_from_bin(env, "pub", argv[0], &params[i++]))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad peer public key; binary expected"));
+
+ { /*argv[2] - the lists [P,G] */
+ ERL_NIF_TERM head, tail;
+
+ head = argv[2];
+ if (!get_ossl_param_from_bin_in_list(env, "p", &head, &params[i++]))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Bad value of 'p'"));
+
+ if (!get_ossl_param_from_bin_in_list(env, "g", &head, &params[i++]))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Bad value of 'g'"));
+
+ tail = head;
+ if (!enif_is_empty_list(env,tail))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Not a two-element list"));
+ }
+
+ params[i++] = OSSL_PARAM_construct_end();
+
+ peer_pctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL);
+
+ if (EVP_PKEY_fromdata_init(peer_pctx) <= 0)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't init fromdata"));
+ if (EVP_PKEY_fromdata(peer_pctx, &peer_pkey, EVP_PKEY_KEYPAIR, params) <= 0)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't do fromdata"));
+
+ /* Build own_pkey. Just replace the pub key with the priv key in params */
+ if (!get_ossl_param_from_bin(env, "priv", argv[1], &params[0]))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad peer public key; binary expected"));
+
+ own_pctx = EVP_PKEY_CTX_new_from_name(NULL, "DH", NULL);
+
+ if (EVP_PKEY_fromdata_init(own_pctx) <= 0)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't init fromdata"));
+
+ if (EVP_PKEY_fromdata(own_pctx, &own_pkey, EVP_PKEY_KEYPAIR, params) <= 0)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't do fromdata"));
+
+
+ /* Derive the common secret */
+ pctx_gen = EVP_PKEY_CTX_new(own_pkey, NULL);
+
+ if (!EVP_PKEY_derive_init(pctx_gen))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_derive_init"));
+
+ if (!EVP_PKEY_derive_set_peer(pctx_gen, peer_pkey))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't derive secret or set peer"));
+
+ if (!EVP_PKEY_derive(pctx_gen, NULL, &sz))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't get result size"));
+
+ if (!enif_alloc_binary(sz, &ret_bin))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allcate binary"));
+ ret_bin_alloc = 1;
+
+ if (!EVP_PKEY_derive(pctx_gen, ret_bin.data, &ret_bin.size))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't get result"));
+
+ if (sz != ret_bin.size)
+ if (!enif_realloc_binary(&ret_bin, ret_bin.size))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't realloc binary"));
+
+ ret = enif_make_binary(env, &ret_bin);
+ ret_bin_alloc = 0;
+
+ err:
+ if (ret_bin_alloc) enif_release_binary(&ret_bin);
+ if (peer_pctx) EVP_PKEY_CTX_free(peer_pctx);
+ if (peer_pkey) EVP_PKEY_free(peer_pkey);
+ if (own_pctx) EVP_PKEY_CTX_free(own_pctx);
+ if (own_pkey) EVP_PKEY_free(own_pkey);
+ if (pctx_gen) EVP_PKEY_CTX_free(pctx_gen);
+ return ret;
+}
+
+# else
+/* Has not 3.0 */
ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (PrivKey|undefined, DHParams=[P,G], Mpint, Len|0) */
-#ifdef HAVE_DH
DH *dh_params = NULL;
unsigned int mpint; /* 0 or 4 */
ERL_NIF_TERM head, tail;
@@ -36,52 +275,52 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
int pub_len, prv_len;
ERL_NIF_TERM ret_pub, ret_prv, ret;
const BIGNUM *pub_key_gen, *priv_key_gen;
-#if defined(HAS_EVP_PKEY_CTX) && (! DISABLE_EVP_DH)
+# if defined(HAS_EVP_PKEY_CTX) && (! DISABLE_EVP_DH)
EVP_PKEY_CTX *ctx = NULL;
EVP_PKEY *dhkey = NULL, *params = NULL;
-#endif
+# endif
ASSERT(argc == 4);
if (argv[0] != atom_undefined) {
if (!get_bn_from_bin(env, argv[0], &priv_key_in))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Can't get bignum from binary"));
}
if (!enif_get_list_cell(env, argv[1], &head, &tail))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "List with exactly two elements expected"));
if (!get_bn_from_bin(env, head, &dh_p))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Can't get bignum from binary"));
if (!enif_get_list_cell(env, tail, &head, &tail))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "List with exactly two elements expected"));
if (!get_bn_from_bin(env, head, &dh_g))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Can't get bignum from binary"));
if (!enif_is_empty_list(env, tail))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "List with exactly two elements expected"));
if (!enif_get_uint(env, argv[2], &mpint))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Integer expected"));
if (mpint != 0 && mpint != 4)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Integer 0 or 4 expected"));
if (!enif_get_ulong(env, argv[3], &len))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Integer expected"));
if (len > LONG_MAX)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Too big integer"));
/* Load dh_params with values to use by the generator.
Mem mgmnt transferred from dh_p etc to dh_params */
if ((dh_params = DH_new()) == NULL)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't do DH_new"));
if (priv_key_in) {
if (!DH_set0_key(dh_params, NULL, priv_key_in))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Not accepted as private key"));
/* On success, dh_params owns priv_key_in */
priv_key_in = NULL;
}
if (!DH_set0_pqg(dh_params, dh_p, NULL, dh_g))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "P and/or G not accepted"));
dh_p_shared = dh_p; /* Don't free this because dh_params owns it */
/* On success, dh_params owns dh_p and dh_g */
dh_p = NULL;
@@ -91,56 +330,56 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
int bn_len;
if ((bn_len = BN_num_bits(dh_p_shared)) < 0)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR(env, "BN_num_bits < 0"));
dh_p_shared = NULL; /* dh_params owns the reference */
if (len >= (size_t)bn_len)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 3, "Too big length"));
if (!DH_set_length(dh_params, (long)len))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 3, "The length is not accepted"));
}
-#if defined(HAS_EVP_PKEY_CTX) && (! DISABLE_EVP_DH)
+# if defined(HAS_EVP_PKEY_CTX) && (! DISABLE_EVP_DH)
if ((params = EVP_PKEY_new()) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_new"));
/* set the key referenced by params to dh_params... */
if (EVP_PKEY_set1_DH(params, dh_params) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_set1_DH"));
if ((ctx = EVP_PKEY_CTX_new(params, NULL)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_new"));
if (EVP_PKEY_keygen_init(ctx) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_keygen_init"));
if ((dhkey = EVP_PKEY_new()) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_new"));
/* key gen op, key written to ppkey (=last arg) */
if (EVP_PKEY_keygen(ctx, &dhkey) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_keygen"));
DH_free(dh_params);
if ((dh_params = EVP_PKEY_get1_DH(dhkey)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_get1_DH"));
-#else
+# else
if (!DH_generate_key(dh_params))
- goto err;
-#endif
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't DH_generate_key"));
+# endif
DH_get0_key(dh_params, &pub_key_gen, &priv_key_gen);
if ((pub_len = BN_num_bytes(pub_key_gen)) < 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't get public key length"));
if ((prv_len = BN_num_bytes(priv_key_gen)) < 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't get private key length"));
if ((pub_ptr = enif_make_new_binary(env, (size_t)pub_len+mpint, &ret_pub)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate pub_ptr"));
if ((prv_ptr = enif_make_new_binary(env, (size_t)prv_len+mpint, &ret_prv)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate prv_ptr"));
if (mpint) {
put_uint32(pub_ptr, (unsigned int)pub_len);
@@ -151,9 +390,9 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
}
if (BN_bn2bin(pub_key_gen, pub_ptr) < 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't BN_bn2bin"));
if (BN_bn2bin(priv_key_gen, prv_ptr) < 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't BN_bn2bin"));
ERL_VALGRIND_MAKE_MEM_DEFINED(pub_ptr, pub_len);
ERL_VALGRIND_MAKE_MEM_DEFINED(prv_ptr, prv_len);
@@ -161,13 +400,7 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
ret = enif_make_tuple2(env, ret_pub, ret_prv);
goto done;
- bad_arg:
- ret = enif_make_badarg(env);
- goto done;
-
err:
- ret = atom_error;
-
done:
if (priv_key_in)
BN_free(priv_key_in);
@@ -178,24 +411,21 @@ ERL_NIF_TERM dh_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
if (dh_params)
DH_free(dh_params);
-#if defined(HAS_EVP_PKEY_CTX) && (! DISABLE_EVP_DH)
+# if defined(HAS_EVP_PKEY_CTX) && (! DISABLE_EVP_DH)
if (ctx)
EVP_PKEY_CTX_free(ctx);
if (dhkey)
EVP_PKEY_free(dhkey);
if (params)
EVP_PKEY_free(params);
-#endif
+# endif
return ret;
-#else
- return enif_raise_exception(env, atom_notsup);
-#endif
}
+
ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (OthersPublicKey, MyPrivateKey, DHParams=[P,G]) */
-#ifdef HAVE_DH
BIGNUM *other_pub_key = NULL;
BIGNUM *dh_p = NULL;
BIGNUM *dh_g = NULL;
@@ -216,22 +446,22 @@ ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
ASSERT(argc == 3);
if (!get_bn_from_bin(env, argv[0], &other_pub_key))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Can't get bignum from binary"));
if (!get_bn_from_bin(env, argv[1], &priv_key))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Can't get bignum from binary"));
if (!enif_get_list_cell(env, argv[2], &head, &tail))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "List with exactly two elements expected"));
if (!get_bn_from_bin(env, head, &dh_p))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Can't get bignum from binary"));
if (!enif_get_list_cell(env, tail, &head, &tail))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "List with exactly two elements expected"));
if (!get_bn_from_bin(env, head, &dh_g))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Can't get bignum from binary"));
if (!enif_is_empty_list(env, tail))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "List with exactly two elements expected"));
/* Note: DH_set0_key() does not allow setting only the
* private key, although DH_compute_key() does not use the
@@ -239,48 +469,45 @@ ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
* the public key to a copy of the private key.
*/
if ((dummy_pub_key = BN_dup(priv_key)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't BN_dup"));
if ((dh_priv = DH_new()) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't DH_new"));
if (!DH_set0_key(dh_priv, dummy_pub_key, priv_key))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't DH_set0_key"));
/* dh_priv owns dummy_pub_key and priv_key now */
dummy_pub_key = NULL;
priv_key = NULL;
if (!DH_set0_pqg(dh_priv, dh_p, NULL, dh_g))
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "P and/or G not accepted"));
/* dh_priv owns dh_p and dh_g now */
dh_p = NULL;
dh_g = NULL;
if ((dh_size = DH_size(dh_priv)) < 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't DH_size"));
if (!enif_alloc_binary((size_t)dh_size, &ret_bin))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allcate binary"));
ret_bin_alloc = 1;
if ((size = DH_compute_key(ret_bin.data, other_pub_key, dh_priv)) < 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't DH_compute_key"));
if (size == 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "size == 0"));
if ((size_t)size != ret_bin.size) {
if (!enif_realloc_binary(&ret_bin, (size_t)size))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't realloc binary"));
}
ret = enif_make_binary(env, &ret_bin);
ret_bin_alloc = 0;
goto done;
- bad_arg:
err:
if (ret_bin_alloc)
enif_release_binary(&ret_bin);
- ret = enif_make_badarg(env);
-
done:
if (other_pub_key)
BN_free(other_pub_key);
@@ -296,7 +523,10 @@ ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
DH_free(dh_priv);
return ret;
-#else
- return enif_raise_exception(env, atom_notsup);
-#endif
}
+
+# endif /* else part of HAS_3_0_API */
+
+
+
+#endif /* HAVE_DH */
diff --git a/lib/crypto/c_src/dss.c b/lib/crypto/c_src/dss.c
index 7669155db6..2e19453e50 100644
--- a/lib/crypto/c_src/dss.c
+++ b/lib/crypto/c_src/dss.c
@@ -23,6 +23,117 @@
#ifdef HAVE_DSA
+# ifdef HAS_3_0_API
+
+int get_dss_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
+// HAS_3_0_API
+{
+ /* key=[P,Q,G,PRIV_KEY] */
+ ERL_NIF_TERM head, tail;
+ OSSL_PARAM params[5];
+ EVP_PKEY_CTX *ctx = NULL;
+ int i = 0;
+
+ head = key;
+
+ // https://www.openssl.org/docs/man3.0/man7/EVP_PKEY-FFC.html
+ if (!get_ossl_param_from_bin_in_list(env, "p", &head, &params[i++]) ||
+ !get_ossl_param_from_bin_in_list(env, "q", &head, &params[i++]) ||
+ !get_ossl_param_from_bin_in_list(env, "g", &head, &params[i++]) ||
+ !get_ossl_param_from_bin_in_list(env, "priv", &head, &params[i++]))
+ goto bad_arg;
+
+ params[i++] = OSSL_PARAM_construct_end();
+
+ tail = head;
+ if (!enif_is_empty_list(env,tail))
+ goto err;
+
+ if ((ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)) == NULL)
+ goto err;
+ if (EVP_PKEY_fromdata_init(ctx) <= 0)
+ goto err;
+ if (EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_KEYPAIR, params) <= 0)
+ goto bad_arg;
+
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 1;
+
+bad_arg:
+err:
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 0;
+}
+
+int get_dss_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
+// HAS_3_0_API
+{
+ /* key=[P, Q, G, PUB_KEY (=Y)] */
+ ERL_NIF_TERM head, tail;
+ OSSL_PARAM params[5];
+ EVP_PKEY_CTX *ctx = NULL;
+ int i = 0;
+
+ head = key;
+
+ // https://www.openssl.org/docs/man3.0/man7/EVP_PKEY-FFC.html
+ if (!get_ossl_param_from_bin_in_list(env, "p", &head, &params[i++]) ||
+ !get_ossl_param_from_bin_in_list(env, "q", &head, &params[i++]) ||
+ !get_ossl_param_from_bin_in_list(env, "g", &head, &params[i++]) ||
+ !get_ossl_param_from_bin_in_list(env, "pub", &head, &params[i++]))
+ goto bad_arg;
+
+ params[i++] = OSSL_PARAM_construct_end();
+
+ tail = head;
+ if (!enif_is_empty_list(env,tail))
+ goto err;
+
+ if ((ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)) == NULL)
+ goto err;
+ if (EVP_PKEY_fromdata_init(ctx) <= 0)
+ goto err;
+ if (EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_PUBLIC_KEY, params) <= 0)
+ goto bad_arg;
+
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 1;
+
+bad_arg:
+err:
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 0;
+}
+
+
+int dss_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret)
+// HAS_3_0_API
+{
+ ERL_NIF_TERM result[5];
+ BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL;
+
+ if (
+ !EVP_PKEY_get_bn_param(pkey, "p", &p)
+ || !EVP_PKEY_get_bn_param(pkey, "q", &q)
+ || !EVP_PKEY_get_bn_param(pkey, "g", &g)
+ || !EVP_PKEY_get_bn_param(pkey, "pub", &pub)
+ || ((result[0] = bin_from_bn(env, p)) == atom_error)
+ || ((result[1] = bin_from_bn(env, q)) == atom_error)
+ || ((result[1] = bin_from_bn(env, g)) == atom_error)
+ || ((result[1] = bin_from_bn(env, pub)) == atom_error)
+ )
+ goto err;
+
+ *ret = enif_make_list_from_array(env, result, 4);
+ return 1;
+
+ err:
+ return 0;
+}
+
+# else
+/* Has NOT 3.0 API */
+
int get_dss_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
{
/* key=[P,Q,G,KEY] */
@@ -78,6 +189,7 @@ int get_dss_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
dummy_pub_key = NULL;
priv_key = NULL;
+ *pkey = EVP_PKEY_new();
if (EVP_PKEY_assign_DSA(*pkey, dsa) != 1)
goto err;
/* On success, result owns dsa */
@@ -144,6 +256,7 @@ int get_dss_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
/* dsa takes ownership on success */
dsa_y = NULL;
+ *pkey = EVP_PKEY_new();
if (EVP_PKEY_assign_DSA(*pkey, dsa) != 1)
goto err;
/* On success, result owns dsa */
@@ -195,4 +308,6 @@ int dss_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret)
return 0;
}
-#endif
+# endif /* HAS_3_0_API */
+
+#endif /* HAVE_DSA */
diff --git a/lib/crypto/c_src/ec.c b/lib/crypto/c_src/ec.c
index b52aeed6ea..e1e002aeaa 100644
--- a/lib/crypto/c_src/ec.c
+++ b/lib/crypto/c_src/ec.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -310,6 +310,7 @@ int get_ec_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
if (!get_ec_key_sz(env, tpl_terms[0], tpl_terms[1], atom_undefined, &ec, NULL))
goto err;
+ *pkey = EVP_PKEY_new();
if (EVP_PKEY_assign_EC_KEY(*pkey, ec) != 1)
goto err;
/* On success, result owns ec */
@@ -339,6 +340,7 @@ int get_ec_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
if (!get_ec_key_sz(env, tpl_terms[0], atom_undefined, tpl_terms[1], &ec, NULL))
goto err;
+ *pkey = EVP_PKEY_new();
if (EVP_PKEY_assign_EC_KEY(*pkey, ec) != 1)
goto err;
/* On success, result owns ec */
@@ -424,11 +426,9 @@ int get_ec_key_sz(ErlNifEnv* env,
return 1;
}
-#endif /* HAVE_EC */
-ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+ERL_NIF_TERM ec_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{ /* (Curve, PrivKey) */
-#if defined(HAVE_EC)
EC_KEY *key = NULL;
const EC_GROUP *group;
const EC_POINT *public_key;
@@ -438,11 +438,11 @@ ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
size_t size;
if (!get_ec_key_sz(env, argv[0], argv[1], atom_undefined, &key, &size))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Couldn't get EC key"));
if (argv[1] == atom_undefined) {
if (!EC_KEY_generate_key(key))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't generate EC key"));
}
group = EC_KEY_get0_group(key);
@@ -461,15 +461,17 @@ ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
goto done;
err:
- bad_arg:
- ret = make_badarg_maybe(env);
-
done:
if (key)
EC_KEY_free(key);
return ret;
+}
+#endif /* HAVE_EC */
-#else
- return atom_notsup;
-#endif
+
+#if ! defined(HAVE_EC)
+ERL_NIF_TERM ec_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{ /* (Curve, PrivKey) */
+ return EXCP_NOTSUP_N(env, 0, "EC not supported");
}
+#endif
diff --git a/lib/crypto/c_src/ec.h b/lib/crypto/c_src/ec.h
index e7b885cb0f..a3827c3a74 100644
--- a/lib/crypto/c_src/ec.h
+++ b/lib/crypto/c_src/ec.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,6 +33,6 @@ int term2point(ErlNifEnv* env, ERL_NIF_TERM term, EC_GROUP *group, EC_POINT **pp
ERL_NIF_TERM make_badarg_maybe(ErlNifEnv* env);
#endif
-ERL_NIF_TERM ec_key_generate(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
+ERL_NIF_TERM ec_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
#endif /* E_EC_H__ */
diff --git a/lib/crypto/c_src/ecdh.c b/lib/crypto/c_src/ecdh.c
index 041c658808..9133878b58 100644
--- a/lib/crypto/c_src/ecdh.c
+++ b/lib/crypto/c_src/ecdh.c
@@ -29,7 +29,7 @@ ERL_NIF_TERM ecdh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
/* (OtherPublicKey, Curve, My) */
{
#if defined(HAVE_EC)
- ERL_NIF_TERM ret;
+ ERL_NIF_TERM ret = atom_undefined;
unsigned char *p;
EC_KEY* key = NULL;
int degree;
@@ -39,44 +39,37 @@ ERL_NIF_TERM ecdh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
EC_POINT *my_ecpoint = NULL;
EC_KEY *other_ecdh = NULL;
- ASSERT(argc == 3);
-
if (!get_ec_key_sz(env, argv[1], argv[2], atom_undefined, &key, NULL)) // my priv key
- goto bad_arg;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Couldn't get local key"));
+
if ((group = EC_GROUP_dup(EC_KEY_get0_group(key))) == NULL)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't duplicate EC key"));
+
priv_key = EC_KEY_get0_private_key(key);
- if (!term2point(env, argv[0], group, &my_ecpoint)) {
- goto err;
- }
+ if (!term2point(env, argv[0], group, &my_ecpoint))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Couldn't get ecpoint"));
if ((other_ecdh = EC_KEY_new()) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't allocate EC_KEY"));
+
if (!EC_KEY_set_group(other_ecdh, group))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't set group"));
+
if (!EC_KEY_set_private_key(other_ecdh, priv_key))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't set private key"));
if ((degree = EC_GROUP_get_degree(group)) <= 0)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't get degree"));
field_size = (size_t)degree;
if ((p = enif_make_new_binary(env, (field_size+7)/8, &ret)) == NULL)
- goto err;
- if (ECDH_compute_key(p, (field_size+7)/8, my_ecpoint, other_ecdh, NULL) < 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't allocate binary"));
- goto done;
-
- bad_arg:
- ret = make_badarg_maybe(env);
- goto done;
+ if (ECDH_compute_key(p, (field_size+7)/8, my_ecpoint, other_ecdh, NULL) < 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't compute key"));
err:
- ret = enif_make_badarg(env);
-
- done:
if (group)
EC_GROUP_free(group);
if (my_ecpoint)
@@ -89,6 +82,6 @@ ERL_NIF_TERM ecdh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
return ret;
#else
- return atom_notsup;
+ return EXCP_NOTSUP_N(env, 0, "EC not supported");
#endif
}
diff --git a/lib/crypto/c_src/evp.c b/lib/crypto/c_src/evp.c
index 7491db3d57..3a3f384a60 100644
--- a/lib/crypto/c_src/evp.c
+++ b/lib/crypto/c_src/evp.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2020. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,43 +34,53 @@ ERL_NIF_TERM evp_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
ASSERT(argc == 3);
+ /* Arg 0, Curve */
if (argv[0] == atom_x25519)
type = EVP_PKEY_X25519;
else if (argv[0] == atom_x448)
type = EVP_PKEY_X448;
else
- goto bad_arg;
+ assign_goto(ret, bad_arg, EXCP_BADARG_N(env, 0, "Bad curve"));
- if (!enif_inspect_binary(env, argv[1], &peer_bin))
- goto bad_arg;
+ /* Arg 2, MyBin (My private key) */
if (!enif_inspect_binary(env, argv[2], &my_bin))
- goto bad_arg;
+ assign_goto(ret, bad_arg, EXCP_BADARG_N(env, 2, "Binary expected"));
if ((my_key = EVP_PKEY_new_raw_private_key(type, NULL, my_bin.data, my_bin.size)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Not a valid raw private key"));
+
if ((ctx = EVP_PKEY_CTX_new(my_key, NULL)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 2, "Can't make context"));
if (EVP_PKEY_derive_init(ctx) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_derive_init"));
+
+ /* Arg 1, PeerBin (Peer public key) */
+ if (!enif_inspect_binary(env, argv[1], &peer_bin))
+ assign_goto(ret, bad_arg, EXCP_BADARG_N(env, 1, "Binary expected"));
if ((peer_key = EVP_PKEY_new_raw_public_key(type, NULL, peer_bin.data, peer_bin.size)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Not a raw public peer key"));
+
if (EVP_PKEY_derive_set_peer(ctx, peer_key) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 1, "Can't EVP_PKEY_derive_set_peer"));
+ /* Find max size of the common key */
if (EVP_PKEY_derive(ctx, NULL, &max_size) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 1, "Can't get max size"));
if (!enif_alloc_binary(max_size, &key_bin))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate"));
+
key_bin_alloc = 1;
+
+ /* Derive the common key */
if (EVP_PKEY_derive(ctx, key_bin.data, &key_bin.size) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_derive"));
if (key_bin.size < max_size) {
if (!enif_realloc_binary(&key_bin, (size_t)key_bin.size))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't shrink binary"));
}
ret = enif_make_binary(env, &key_bin);
@@ -81,7 +91,6 @@ ERL_NIF_TERM evp_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
err:
if (key_bin_alloc)
enif_release_binary(&key_bin);
- ret = enif_make_badarg(env);
done:
if (my_key)
@@ -98,6 +107,7 @@ ERL_NIF_TERM evp_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
#endif
}
+
ERL_NIF_TERM evp_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
/* (Curve) */
{
@@ -119,46 +129,41 @@ ERL_NIF_TERM evp_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
else if (argv[0] == atom_ed448)
type = EVP_PKEY_ED448;
else
- goto bad_arg;
+ assign_goto(ret, bad_arg, EXCP_BADARG_N(env, 0, "Bad curve"));
if (argv[1] == atom_undefined) {
if ((ctx = EVP_PKEY_CTX_new_id(type, NULL)) == NULL)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't make context"));
if (EVP_PKEY_keygen_init(ctx) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_keygen_init"));
if (EVP_PKEY_keygen(ctx, &pkey) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_keygen"));
} else {
if (!enif_inspect_binary(env, argv[1], &prv_key))
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 1, "Can't get max size"));
if ((pkey = EVP_PKEY_new_raw_private_key(type, NULL, prv_key.data, prv_key.size)) == NULL)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 1, "Can't EVP_PKEY_new_raw_private_key"));
}
if (EVP_PKEY_get_raw_public_key(pkey, NULL, &key_len) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 1, "Can't get max size"));
if ((out_pub = enif_make_new_binary(env, key_len, &ret_pub)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate"));
if (EVP_PKEY_get_raw_public_key(pkey, out_pub, &key_len) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_get_raw_public_key"));
if (EVP_PKEY_get_raw_private_key(pkey, NULL, &key_len) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR_N(env, 1, "Can't get max size"));
if ((out_priv = enif_make_new_binary(env, key_len, &ret_prv)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate"));
if (EVP_PKEY_get_raw_private_key(pkey, out_priv, &key_len) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_get_raw_private_key"));
ret = enif_make_tuple2(env, ret_pub, ret_prv);
goto done;
bad_arg:
- ret = enif_make_badarg(env);
- goto done;
-
err:
- ret = atom_error;
-
done:
if (pkey)
EVP_PKEY_free(pkey);
diff --git a/lib/crypto/c_src/hash.c b/lib/crypto/c_src/hash.c
index 92f599fc61..ba454f5062 100644
--- a/lib/crypto/c_src/hash.c
+++ b/lib/crypto/c_src/hash.c
@@ -104,39 +104,30 @@ ERL_NIF_TERM hash_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
unsigned ret_size;
unsigned char *outp;
- ASSERT(argc == 2);
-
if ((digp = get_digest_type(argv[0])) == NULL)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad digest type");
if (DIGEST_FORBIDDEN_IN_FIPS(digp))
- goto notsup;
+ return EXCP_NOTSUP_N(env, 0, "Bad digest type in FIPS");
+ if ((md = digp->md.p) == NULL)
+ return EXCP_NOTSUP_N(env, 0, "Digest type not supported in this cryptolib");
+
if (!enif_inspect_iolist_as_binary(env, argv[1], &data))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 1, "Not iolist");
- if ((md = digp->md.p) == NULL)
- goto err;
ret_size = (unsigned)EVP_MD_size(md);
ASSERT(0 < ret_size && ret_size <= EVP_MAX_MD_SIZE);
if ((outp = enif_make_new_binary(env, ret_size, &ret)) == NULL)
- goto err;
+ return EXCP_ERROR(env, "Can't allocate binary");
+
if (EVP_Digest(data.data, data.size, outp, &ret_size, md, NULL) != 1)
- goto err;
+ return EXCP_ERROR(env, "Low-level call failed");
ASSERT(ret_size == (unsigned)EVP_MD_size(md));
CONSUME_REDS(env, data);
return ret;
-
- bad_arg:
- return enif_make_badarg(env);
-
- notsup:
- return atom_notsup;
-
- err:
- return atom_notsup;
}
#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(1,0,0)
@@ -147,31 +138,22 @@ ERL_NIF_TERM hash_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
struct evp_md_ctx *ctx = NULL;
ERL_NIF_TERM ret;
- ASSERT(argc == 1);
-
if ((digp = get_digest_type(argv[0])) == NULL)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad digest type");
+
if (DIGEST_FORBIDDEN_IN_FIPS(digp))
- goto notsup;
+ return EXCP_NOTSUP_N(env, 0, "Digest type not supported in FIPS");
if (digp->md.p == NULL)
- goto err;
+ return EXCP_NOTSUP_N(env, 0, "Unsupported digest type");
if ((ctx = enif_alloc_resource(evp_md_ctx_rtype, sizeof(struct evp_md_ctx))) == NULL)
- goto err;
+ return EXCP_ERROR(env, "Can't allocate nif resource");
if ((ctx->ctx = EVP_MD_CTX_new()) == NULL)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_MD_CTX_new failed"));
if (EVP_DigestInit(ctx->ctx, digp->md.p) != 1)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_DigestInit failed"));
ret = enif_make_resource(env, ctx);
- goto done;
-
- bad_arg:
- return enif_make_badarg(env);
-
- notsup:
- err:
- ret = atom_notsup;
done:
if (ctx)
@@ -185,31 +167,23 @@ ERL_NIF_TERM hash_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
ErlNifBinary data;
ERL_NIF_TERM ret;
- ASSERT(argc == 2);
-
if (!enif_get_resource(env, argv[0], evp_md_ctx_rtype, (void**)&ctx))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
+
if (!enif_inspect_iolist_as_binary(env, argv[1], &data))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 1, "Not iolist");
if ((new_ctx = enif_alloc_resource(evp_md_ctx_rtype, sizeof(struct evp_md_ctx))) == NULL)
- goto err;
+ return EXCP_ERROR(env, "Can't allocate nif resource");
if ((new_ctx->ctx = EVP_MD_CTX_new()) == NULL)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_MD_CTX_new failed"));
if (EVP_MD_CTX_copy(new_ctx->ctx, ctx->ctx) != 1)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_MD_CTX_copy failed"));
if (EVP_DigestUpdate(new_ctx->ctx, data.data, data.size) != 1)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_DigestUpdate failed"));
ret = enif_make_resource(env, new_ctx);
CONSUME_REDS(env, data);
- goto done;
-
- bad_arg:
- return enif_make_badarg(env);
-
- err:
- ret = atom_notsup;
done:
if (new_ctx)
@@ -228,28 +202,21 @@ ERL_NIF_TERM hash_final_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ASSERT(argc == 1);
if (!enif_get_resource(env, argv[0], evp_md_ctx_rtype, (void**)&ctx))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
ret_size = (unsigned)EVP_MD_CTX_size(ctx->ctx);
ASSERT(0 < ret_size && ret_size <= EVP_MAX_MD_SIZE);
if ((new_ctx = EVP_MD_CTX_new()) == NULL)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_MD_CTX_new failed"));
if (EVP_MD_CTX_copy(new_ctx, ctx->ctx) != 1)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_MD_CTX_copy failed"));
if ((outp = enif_make_new_binary(env, ret_size, &ret)) == NULL)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Can't make a new binary"));
if (EVP_DigestFinal(new_ctx, outp, &ret_size) != 1)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Low-level call EVP_DigestFinal failed"));
ASSERT(ret_size == (unsigned)EVP_MD_CTX_size(ctx->ctx));
- goto done;
-
- bad_arg:
- return enif_make_badarg(env);
-
- err:
- ret = atom_notsup;
done:
if (new_ctx)
@@ -271,11 +238,12 @@ ERL_NIF_TERM hash_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
ASSERT(argc == 1);
if ((digp = get_digest_type(argv[0])) == NULL)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad digest type");
+
if (DIGEST_FORBIDDEN_IN_FIPS(digp))
- goto notsup;
+ return EXCP_NOTSUP_N(env, 0, "Digest type not supported in FIPS");
if (digp->md.p == NULL)
- goto err;
+ return EXCP_NOTSUP_N(env, 0, "Unsupported digest type");
switch (EVP_MD_type(digp->md.p))
{
@@ -326,27 +294,18 @@ ERL_NIF_TERM hash_init_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
break;
#endif
default:
- goto err;
+ return EXCP_NOTSUP_N(env, 0, "Unsupported digest type");
}
ASSERT(ctx_size);
ASSERT(ctx_init);
if ((outp = enif_make_new_binary(env, ctx_size, &ctx)) == NULL)
- goto err;
+ return EXCP_ERROR(env, "Can't allocate binary");
if (ctx_init(outp) != 1)
- goto err;
+ return EXCP_ERROR(env, "Can't init ctx");
return enif_make_tuple2(env, argv[0], ctx);
-
- bad_arg:
- return enif_make_badarg(env);
-
- notsup:
- return atom_notsup;
-
- err:
- return atom_notsup;
}
ERL_NIF_TERM hash_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
@@ -361,23 +320,21 @@ ERL_NIF_TERM hash_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
size_t ctx_size = 0;
update_fun ctx_update = 0;
- ASSERT(argc == 2);
-
if (!enif_get_tuple(env, argv[0], &arity, &tuple))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if (arity != 2)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if ((digp = get_digest_type(tuple[0])) == NULL)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if (DIGEST_FORBIDDEN_IN_FIPS(digp))
- goto notsup;
+ return EXCP_BADARG_N(env, 0, "Bad state");
+ if (digp->md.p == NULL)
+ return EXCP_BADARG_N(env, 0, "Bad state");
if (!enif_inspect_binary(env, tuple[1], &ctx))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
+
if (!enif_inspect_iolist_as_binary(env, argv[1], &data))
- goto bad_arg;
-
- if (digp->md.p == NULL)
- goto err;
+ return EXCP_BADARG_N(env, 0, "Bad data");
switch (EVP_MD_type(digp->md.p))
{
@@ -428,32 +385,24 @@ ERL_NIF_TERM hash_update_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]
break;
#endif
default:
- goto err;
+ return EXCP_BADARG_N(env, 0, "Bad state");
}
ASSERT(ctx_size);
ASSERT(ctx_update);
if (ctx.size != ctx_size)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if ((ctx_buff = enif_make_new_binary(env, ctx_size, &new_ctx)) == NULL)
- goto err;
+ return EXCP_ERROR(env, "Can't allocate binary");
+
memcpy(ctx_buff, ctx.data, ctx_size);
if (ctx_update(ctx_buff, data.data, data.size) != 1)
- goto err;
+ return EXCP_ERROR(env, "Can't update");
CONSUME_REDS(env, data);
return enif_make_tuple2(env, tuple[0], new_ctx);
-
- bad_arg:
- return enif_make_badarg(env);
-
- notsup:
- return atom_notsup;
-
- err:
- return atom_notsup;
}
ERL_NIF_TERM hash_final_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
@@ -470,21 +419,19 @@ ERL_NIF_TERM hash_final_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
final_fun ctx_final = 0;
unsigned char *outp;
- ASSERT(argc == 1);
-
if (!enif_get_tuple(env, argv[0], &arity, &tuple))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if (arity != 2)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if ((digp = get_digest_type(tuple[0])) == NULL)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if (DIGEST_FORBIDDEN_IN_FIPS(digp))
- goto notsup;
- if (!enif_inspect_binary(env, tuple[1], &ctx))
- goto bad_arg;
-
+ return EXCP_BADARG_N(env, 0, "Bad state");
if ((md = digp->md.p) == NULL)
- goto err;
+ return EXCP_BADARG_N(env, 0, "Bad state");
+
+ if (!enif_inspect_binary(env, tuple[1], &ctx))
+ return EXCP_BADARG_N(env, 0, "Bad data");
switch (EVP_MD_type(md))
{
@@ -535,33 +482,24 @@ ERL_NIF_TERM hash_final_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
break;
#endif
default:
- goto err;
+ return EXCP_BADARG_N(env, 0, "Bad state");
}
ASSERT(ctx_size);
ASSERT(ctx_final);
if (ctx.size != ctx_size)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad state");
if ((new_ctx = enif_alloc(ctx_size)) == NULL)
- goto err;
+ return EXCP_ERROR(env, "Can't allocate");
memcpy(new_ctx, ctx.data, ctx_size);
if ((outp = enif_make_new_binary(env, (size_t)EVP_MD_size(md), &ret)) == NULL)
- goto err;
+ assign_goto(ret, done, EXCP_ERROR(env, "Can't allocate binary"));
if (ctx_final(outp, new_ctx) != 1)
- goto err;
-
- goto done;
-
- bad_arg:
- return enif_make_badarg(env);
-
- notsup:
- err:
- ret = atom_notsup;
+ assign_goto(ret, done, EXCP_ERROR(env, "Can't do final"));
done:
if (new_ctx)
diff --git a/lib/crypto/c_src/hash_equals.c b/lib/crypto/c_src/hash_equals.c
new file mode 100644
index 0000000000..85f54b14eb
--- /dev/null
+++ b/lib/crypto/c_src/hash_equals.c
@@ -0,0 +1,51 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %CopyrightEnd%
+
+ */
+
+#include "common.h"
+#include "hash_equals.h"
+
+ERL_NIF_TERM hash_equals_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+#ifdef HAVE_OPENSSL_CRYPTO_MEMCMP
+ ErlNifBinary s1, s2;
+
+ ASSERT(argc == 2);
+
+ if (!enif_inspect_binary(env, argv[0], &s1))
+ goto bad_arg;
+ if (!enif_inspect_binary(env, argv[1], &s2))
+ goto bad_arg;
+
+ if (s1.size != s2.size)
+ goto err;
+
+ if (CRYPTO_memcmp(s1.data, s2.data, s1.size) == 0)
+ return enif_make_atom(env, "true");
+
+ return enif_make_atom(env, "false");
+
+ bad_arg:
+ err:
+ return enif_make_badarg(env);
+#else
+ return EXCP_NOTSUP(env, "Unsupported CRYPTO_memcmp");
+#endif
+}
diff --git a/lib/crypto/c_src/hash_equals.h b/lib/crypto/c_src/hash_equals.h
new file mode 100644
index 0000000000..966862c828
--- /dev/null
+++ b/lib/crypto/c_src/hash_equals.h
@@ -0,0 +1,28 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+#ifndef E_HASH_EQUALS_H__
+#define E_HASH_EQUALS_H__ 1
+
+#include "common.h"
+
+ERL_NIF_TERM hash_equals_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
+
+#endif /* E_HASH_EQUALS_H__ */
diff --git a/lib/crypto/c_src/pbkdf2_hmac.c b/lib/crypto/c_src/pbkdf2_hmac.c
index 7eec603d9c..08360ed558 100644
--- a/lib/crypto/c_src/pbkdf2_hmac.c
+++ b/lib/crypto/c_src/pbkdf2_hmac.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2010-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2010-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -30,45 +30,41 @@ ERL_NIF_TERM pbkdf2_hmac_nif(ErlNifEnv* env, int argc,
ErlNifUInt64 iter, keylen;
struct digest_type_t* digp = NULL;
- ASSERT(argc == 5);
-
if ((digp = get_digest_type(argv[0])) == NULL)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 0, "Bad digest type");
if (digp->md.p == NULL)
- goto bad_arg;
- if ((digp->flags & PBKDF2_ELIGIBLE_DIGEST) == 0) {
- goto bad_arg;
- }
+ return EXCP_BADARG_N(env, 0, "md.p is not NULL");
+ if ((digp->flags & PBKDF2_ELIGIBLE_DIGEST) == 0)
+ return EXCP_BADARG_N(env, 0, "Not eligible digest type");
if (!enif_inspect_binary(env, argv[1], &pass))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 1, "Not binary");
+
if (!enif_inspect_binary(env, argv[2], &salt))
- goto bad_arg;
- if (!enif_get_uint64(env, argv[3], &iter))
- goto bad_arg;
- if (!enif_get_uint64(env, argv[4], &keylen))
- goto bad_arg;
+ return EXCP_BADARG_N(env, 2, "Not binary");
+ if (!enif_get_uint64(env, argv[3], &iter))
+ return EXCP_BADARG_N(env, 3, "Not integer");
if (iter < 1)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 3, "Must be > 0");
+
+ if (!enif_get_uint64(env, argv[4], &keylen))
+ return EXCP_BADARG_N(env, 4, "Not integer");
if (keylen < 1)
- goto bad_arg;
+ return EXCP_BADARG_N(env, 4, "Must be > 0");
if (!enif_alloc_binary(keylen, &out))
- goto err;
+ return EXCP_ERROR(env, "Can't allocate binary");
if (!PKCS5_PBKDF2_HMAC((const char *)pass.data, pass.size,
salt.data, salt.size, iter,
digp->md.p,
keylen, out.data)) {
enif_release_binary(&out);
- goto err;
+ return EXCP_ERROR(env, "Low-level call failed");
}
return enif_make_binary(env, &out);
- bad_arg:
- err:
- return enif_make_badarg(env);
#else
return EXCP_NOTSUP(env, "Unsupported CRYPTO_PKCS5_PBKDF2_HMAC");
#endif
diff --git a/lib/crypto/c_src/pkey.c b/lib/crypto/c_src/pkey.c
index 70c6d1bbe4..da39b70932 100644
--- a/lib/crypto/c_src/pkey.c
+++ b/lib/crypto/c_src/pkey.c
@@ -27,10 +27,6 @@
#include "engine.h"
#include "rsa.h"
-#define PKEY_BADARG -1
-#define PKEY_NOTSUP 0
-#define PKEY_OK 1
-
typedef struct PKeyCryptOptions {
const EVP_MD *rsa_mgf1_md;
ErlNifBinary rsa_oaep_label;
@@ -46,55 +42,123 @@ typedef struct PKeySignOptions {
} PKeySignOptions;
-static int get_pkey_digest_type(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM type,
- const EVP_MD **md);
-static int get_pkey_sign_digest(ErlNifEnv *env, ERL_NIF_TERM algorithm,
- ERL_NIF_TERM type, ERL_NIF_TERM data,
+static int check_pkey_algorithm_type(ErlNifEnv *env,
+ int alg_arg_num, ERL_NIF_TERM algorithm,
+ ERL_NIF_TERM *err_return);
+static int get_pkey_digest_type(ErlNifEnv *env, ERL_NIF_TERM algorithm,
+ int type_arg_num, ERL_NIF_TERM type,
+ const EVP_MD **md,
+ ERL_NIF_TERM *err_return);
+static int get_pkey_sign_digest(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int type_arg_num, int data_arg_num,
unsigned char *md_value, const EVP_MD **mdp,
- unsigned char **tbsp, size_t *tbslenp);
-static int get_pkey_sign_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM options,
- const EVP_MD *md, PKeySignOptions *opt);
-static int get_pkey_private_key(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM key, EVP_PKEY **pkey);
-static int get_pkey_public_key(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM key,
- EVP_PKEY **pkey);
-static int get_pkey_crypt_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM options,
- PKeyCryptOptions *opt);
+ unsigned char **tbsp, size_t *tbslenp,
+ ERL_NIF_TERM *err_return);
+static int get_pkey_sign_options(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int options_arg_num,
+ const EVP_MD *md, PKeySignOptions *opt,
+ ERL_NIF_TERM *err_return);
+static int get_pkey_private_key(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int key_arg_num,
+ EVP_PKEY **pkey,
+ ERL_NIF_TERM *err_return);
+static int get_pkey_public_key(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int key_arg_num,
+ EVP_PKEY **pkey,
+ ERL_NIF_TERM *err_return);
+static int get_pkey_crypt_options(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int options_arg_num,
+ PKeyCryptOptions *opt,
+ ERL_NIF_TERM *err_return);
#ifdef HAVE_RSA_SSLV23_PADDING
static size_t size_of_RSA(EVP_PKEY *pkey);
#endif
-static int get_pkey_digest_type(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM type,
- const EVP_MD **md)
+static int check_pkey_algorithm_type(ErlNifEnv *env,
+ int alg_arg_num, ERL_NIF_TERM algorithm,
+ ERL_NIF_TERM *err_return)
+{
+ if (
+#ifndef HAVE_EDDSA
+ (algorithm == atom_eddsa) ||
+#endif
+
+#ifndef HAVE_DSA
+ (algorithm == atom_dss) ||
+#endif
+
+#ifndef HAVE_EC
+ (algorithm == atom_ecdsa) ||
+#endif
+ 0)
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, alg_arg_num, "Unsupported algorithm"));
+
+
+#ifdef HAVE_EDDSA
+ if (FIPS_MODE())
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, alg_arg_num, "Unsupported algorithm in FIPS mode"));
+#endif
+
+ if ((algorithm != atom_rsa) &&
+ (algorithm != atom_dss) &&
+ (algorithm != atom_ecdsa) &&
+ (algorithm != atom_eddsa)
+ )
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, alg_arg_num, "Bad algorithm"));
+
+ return 1;
+
+ err:
+ return 0;
+}
+
+
+static int get_pkey_digest_type(ErlNifEnv *env, ERL_NIF_TERM algorithm,
+ int type_arg_num, ERL_NIF_TERM type,
+ const EVP_MD **md,
+ ERL_NIF_TERM *err_return)
{
struct digest_type_t *digp = NULL;
*md = NULL;
if (type == atom_none && algorithm == atom_rsa)
- return PKEY_OK;
- if (algorithm == atom_eddsa) {
-#ifdef HAVE_EDDSA
- if (!FIPS_MODE()) return PKEY_OK;
-#else
- return PKEY_NOTSUP;
-#endif
- }
+ return 1;
+
+ if (type == atom_undefined && algorithm == atom_eddsa)
+ return 1;
+
+ if (type == atom_none && algorithm == atom_eddsa)
+ return 1;
+
if ((digp = get_digest_type(type)) == NULL)
- return PKEY_BADARG;
+ assign_goto(*err_return, notsup, EXCP_BADARG_N(env, type_arg_num, "Bad digest type"));
+
if (DIGEST_FORBIDDEN_IN_FIPS(digp))
- return PKEY_NOTSUP;
+ assign_goto(*err_return, notsup, EXCP_BADARG_N(env, type_arg_num, "Digest type forbidden in FIPS"));
+
if (digp->md.p == NULL)
- return PKEY_NOTSUP;
+ assign_goto(*err_return, notsup, EXCP_BADARG_N(env, type_arg_num, "Digest type not supported"));
*md = digp->md.p;
- return PKEY_OK;
+ return 1;
+
+ notsup:
+ return 0;
}
-static int get_pkey_sign_digest(ErlNifEnv *env, ERL_NIF_TERM algorithm,
- ERL_NIF_TERM type, ERL_NIF_TERM data,
+static int get_pkey_sign_digest(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int type_arg_num, int data_arg_num,
unsigned char *md_value, const EVP_MD **mdp,
- unsigned char **tbsp, size_t *tbslenp)
+ unsigned char **tbsp, size_t *tbslenp,
+ ERL_NIF_TERM *err_return)
{
- int i, ret;
+ int ret;
const ERL_NIF_TERM *tpl_terms;
int tpl_arity;
ErlNifBinary tbs_bin;
@@ -108,50 +172,55 @@ static int get_pkey_sign_digest(ErlNifEnv *env, ERL_NIF_TERM algorithm,
tbs = *tbsp;
tbslen = *tbslenp;
- if ((i = get_pkey_digest_type(env, algorithm, type, &md)) != PKEY_OK)
- return i;
+ if (!check_pkey_algorithm_type(env, algorithm_arg_num, argv[algorithm_arg_num], err_return))
+ goto err; /* An exception is present in ret */
+
+ if (!get_pkey_digest_type(env, argv[algorithm_arg_num],
+ type_arg_num, argv[type_arg_num],
+ &md, err_return))
+ goto err; /* An exception is present in ret */
- if (enif_get_tuple(env, data, &tpl_arity, &tpl_terms)) {
+ if (enif_get_tuple(env, argv[data_arg_num], &tpl_arity, &tpl_terms)) {
if (tpl_arity != 2)
- goto bad_arg;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, data_arg_num, "Bad list"));
if (tpl_terms[0] != atom_digest)
- goto bad_arg;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, data_arg_num, "Expected 'digest' as head"));
if (!enif_inspect_iolist_as_binary(env, tpl_terms[1], &tbs_bin))
- goto bad_arg;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, data_arg_num, "Bad 2nd element in list"));
if (tbs_bin.size > INT_MAX)
- goto bad_arg;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, data_arg_num, "Too large binary"));
if (md != NULL) {
if ((int)tbs_bin.size != EVP_MD_size(md))
- goto bad_arg;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, data_arg_num, "Bad binary size for the algorithm"));
}
/* We have a digest (= hashed text) in tbs_bin */
tbs = tbs_bin.data;
tbslen = tbs_bin.size;
} else if (md == NULL) {
- if (!enif_inspect_iolist_as_binary(env, data, &tbs_bin))
- goto bad_arg;
+ if (!enif_inspect_iolist_as_binary(env, argv[data_arg_num], &tbs_bin))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, data_arg_num, "Expected a binary or a list"));
/* md == NULL, that is no hashing because DigestType argument was atom_none */
tbs = tbs_bin.data;
tbslen = tbs_bin.size;
} else {
- if (!enif_inspect_iolist_as_binary(env, data, &tbs_bin))
- goto bad_arg;
+ if (!enif_inspect_iolist_as_binary(env, argv[data_arg_num], &tbs_bin))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, data_arg_num, "Expected a binary or a list"));
/* We have the cleartext in tbs_bin and the hash algo info in md */
tbs = md_value;
if ((mdctx = EVP_MD_CTX_create()) == NULL)
- goto err;
+ assign_goto(*err_return, err, EXCP_ERROR(env, "Can't create MD_CTX"));
/* Looks well, now hash the plain text into a digest according to md */
if (EVP_DigestInit_ex(mdctx, md, NULL) != 1)
- goto err;
+ assign_goto(*err_return, err, EXCP_ERROR(env, "Can't create EVP_DigestInit_ex"));
if (EVP_DigestUpdate(mdctx, tbs_bin.data, tbs_bin.size) != 1)
- goto err;
+ assign_goto(*err_return, err, EXCP_ERROR(env, "Can't create EVP_DigestUpdate"));
if (EVP_DigestFinal_ex(mdctx, tbs, &tbsleni) != 1)
- goto err;
+ assign_goto(*err_return, err, EXCP_ERROR(env, "Can't create EVP_DigestFinal_ex"));
tbslen = (size_t)tbsleni;
}
@@ -160,32 +229,33 @@ static int get_pkey_sign_digest(ErlNifEnv *env, ERL_NIF_TERM algorithm,
*tbsp = tbs;
*tbslenp = tbslen;
- ret = PKEY_OK;
+ ret = 1;
goto done;
- bad_arg:
err:
- ret = PKEY_BADARG;
-
+ ret = 0;
done:
if (mdctx)
EVP_MD_CTX_destroy(mdctx);
return ret;
}
-static int get_pkey_sign_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM options,
- const EVP_MD *md, PKeySignOptions *opt)
+static int get_pkey_sign_options(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int options_arg_num,
+ const EVP_MD *md, PKeySignOptions *opt,
+ ERL_NIF_TERM *err_return)
{
ERL_NIF_TERM head, tail;
const ERL_NIF_TERM *tpl_terms;
int tpl_arity;
const EVP_MD *opt_md;
- if (!enif_is_list(env, options))
- goto bad_arg;
+ if (!enif_is_list(env, argv[options_arg_num]))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Expected a list"));
/* defaults */
- if (algorithm == atom_rsa) {
+ if (argv[algorithm_arg_num] == atom_rsa) {
opt->rsa_mgf1_md = NULL;
opt->rsa_padding = RSA_PKCS1_PADDING;
opt->rsa_pss_saltlen = -2;
@@ -195,26 +265,27 @@ static int get_pkey_sign_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF
opt->rsa_pss_saltlen = 0;
}
- if (enif_is_empty_list(env, options))
- return PKEY_OK;
+ if (enif_is_empty_list(env, argv[options_arg_num]))
+ return 1;
- if (algorithm != atom_rsa)
- goto bad_arg;
+ if (argv[algorithm_arg_num] != atom_rsa)
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Only RSA supports Options"));
- tail = options;
+ tail = argv[options_arg_num];
while (enif_get_list_cell(env, tail, &head, &tail)) {
- if (!enif_get_tuple(env, head, &tpl_arity, &tpl_terms))
- goto bad_arg;
- if (tpl_arity != 2)
- goto bad_arg;
-
- if (tpl_terms[0] == atom_rsa_mgf1_md && enif_is_atom(env, tpl_terms[1])) {
- int result;
-
- result = get_pkey_digest_type(env, algorithm, tpl_terms[1], &opt_md);
- if (result != PKEY_OK)
- return result;
-
+ if (!enif_get_tuple(env, head, &tpl_arity, &tpl_terms) ||
+ (tpl_arity != 2))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Expects only two-tuples in the list"));
+
+ if (tpl_terms[0] == atom_rsa_mgf1_md) {
+ if (!enif_is_atom(env, tpl_terms[1]))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Atom expected as argument to option rsa_mgf1_md"));
+
+ if (!get_pkey_digest_type(env, argv[algorithm_arg_num],
+ options_arg_num, tpl_terms[1],
+ &opt_md, err_return))
+ goto err; /* An exception is present in ret */
+
opt->rsa_mgf1_md = opt_md;
} else if (tpl_terms[0] == atom_rsa_padding) {
@@ -227,7 +298,7 @@ static int get_pkey_sign_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF
if (opt->rsa_mgf1_md == NULL)
opt->rsa_mgf1_md = md;
#else
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, options_arg_num, "rsa_pkcs1_pss_padding not supported"));
#endif
} else if (tpl_terms[1] == atom_rsa_x931_padding) {
@@ -237,172 +308,163 @@ static int get_pkey_sign_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF
opt->rsa_padding = RSA_NO_PADDING;
} else {
- goto bad_arg;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Bad value in option rsa_padding"));
}
} else if (tpl_terms[0] == atom_rsa_pss_saltlen) {
- if (!enif_get_int(env, tpl_terms[1], &(opt->rsa_pss_saltlen)))
- goto bad_arg;
- if (opt->rsa_pss_saltlen < -2)
- goto bad_arg;
+ if (!enif_get_int(env, tpl_terms[1], &(opt->rsa_pss_saltlen)) ||
+ (opt->rsa_pss_saltlen < -2) )
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Bad value in option rsa_pss_saltlen"));
} else {
- goto bad_arg;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Bad option"));
}
}
- return PKEY_OK;
+ return 1;
- bad_arg:
- return PKEY_BADARG;
+ err:
+ return 0;
}
-static int get_pkey_private_key(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM key, EVP_PKEY **pkey)
+static int get_pkey_private_key(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int key_arg_num,
+ EVP_PKEY **pkey,
+ ERL_NIF_TERM *err_return)
{
- EVP_PKEY *result = NULL;
char *id = NULL;
char *password = NULL;
+ int ret;
- if (enif_is_map(env, key)) {
+ if (enif_is_map(env, argv[key_arg_num])) {
#ifdef HAS_ENGINE_SUPPORT
/* Use key stored in engine */
ENGINE *e;
- if (!get_engine_and_key_id(env, key, &id, &e))
- goto err;
-
- password = get_key_password(env, key);
- result = ENGINE_load_private_key(e, id, NULL, password);
+ if (!get_engine_and_key_id(env, argv[key_arg_num], &id, &e))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get engine and/or key id"));
+ password = get_key_password(env, argv[key_arg_num]);
+ *pkey = ENGINE_load_private_key(e, id, NULL, password);
+ if (!*pkey)
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get private key from engine"));
#else
- return PKEY_BADARG;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "No engine support"));
#endif
- } else if (algorithm == atom_rsa) {
- if ((result = EVP_PKEY_new()) == NULL)
- goto err;
- if (!get_rsa_private_key(env, key, &result))
- goto err;
+ } else if (argv[algorithm_arg_num] == atom_rsa) {
+ if (!get_rsa_private_key(env, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get RSA private key"));
- } else if (algorithm == atom_ecdsa) {
+ } else if (argv[algorithm_arg_num] == atom_ecdsa) {
#if defined(HAVE_EC)
- if ((result = EVP_PKEY_new()) == NULL)
- goto err;
- if (!get_ec_private_key(env, key, &result))
- goto err;
+ if (!get_ec_private_key(env, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get ECDSA private key"));
#else
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "ECDSA not supported"));
#endif
- } else if (algorithm == atom_eddsa) {
+ } else if (argv[algorithm_arg_num] == atom_eddsa) {
#ifdef HAVE_EDDSA
- if (FIPS_MODE())
- return PKEY_NOTSUP;
- if (!get_eddsa_key(env, 0, key, &result))
- goto err;
+ if (!FIPS_MODE()) {
+ if (!get_eddsa_key(env, 0, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get EDDSA private key"));
+ } else
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "EDDSA not supported in FIPS mode"));
#else
- return PKEY_NOTSUP;
-#endif
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "EDDSA not supported"));
+#endif
- } else if (algorithm == atom_dss) {
+ } else if (argv[algorithm_arg_num] == atom_dss) {
#ifdef HAVE_DSA
- if ((result = EVP_PKEY_new()) == NULL)
- goto err;
- if (!get_dss_private_key(env, key, &result))
- goto err;
+ if (!get_dss_private_key(env, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get DSA private key"));
#else
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "DSA not supported"));
#endif
} else
- return PKEY_BADARG;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, algorithm_arg_num, "Bad algorithm"));
-
- free_and_return:
+ ret = 1;
+ done:
if (password)
enif_free(password);
if (id)
enif_free(id);
- if (result == NULL) {
- return PKEY_BADARG;
- } else {
- *pkey = result;
- return PKEY_OK;
- }
+ return ret;
err:
- if (result)
- EVP_PKEY_free(result);
- result = NULL;
- goto free_and_return;
+ if (*pkey)
+ EVP_PKEY_free(*pkey);
+ *pkey = NULL;
+ ret = 0;
+ goto done;
}
-static int get_pkey_public_key(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM key,
- EVP_PKEY **pkey)
+static int get_pkey_public_key(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int key_arg_num,
+ EVP_PKEY **pkey,
+ ERL_NIF_TERM *err_return)
{
- EVP_PKEY *result = NULL;
char *id = NULL;
char *password = NULL;
+ int ret;
- if (enif_is_map(env, key)) {
+ if (enif_is_map(env, argv[key_arg_num])) {
#ifdef HAS_ENGINE_SUPPORT
/* Use key stored in engine */
ENGINE *e;
- if (!get_engine_and_key_id(env, key, &id, &e))
- goto err;
-
- password = get_key_password(env, key);
- result = ENGINE_load_public_key(e, id, NULL, password);
+ if (!get_engine_and_key_id(env, argv[key_arg_num], &id, &e))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get engine and/or key id"));
+ password = get_key_password(env, argv[key_arg_num]);
+ *pkey = ENGINE_load_public_key(e, id, NULL, password);
+ if (!pkey)
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get public key from engine"));
#else
- return PKEY_BADARG;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "No engine support"));
#endif
- } else if (algorithm == atom_rsa) {
- if ((result = EVP_PKEY_new()) == NULL)
- goto err;
- if (!get_rsa_public_key(env, key, &result))
- goto err;
- } else if (algorithm == atom_ecdsa) {
+ } else if (argv[algorithm_arg_num] == atom_rsa) {
+ if (!get_rsa_public_key(env, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get RSA public key"));
+
+ } else if (argv[algorithm_arg_num] == atom_ecdsa) {
#if defined(HAVE_EC)
- if ((result = EVP_PKEY_new()) == NULL)
- goto err;
- if (!get_ec_public_key(env, key, &result))
- goto err;
+ if (!get_ec_public_key(env, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get ECDSA public key"));
#else
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "ECDSA not supported"));
#endif
- } else if (algorithm == atom_eddsa) {
+
+ } else if (argv[algorithm_arg_num] == atom_eddsa) {
#ifdef HAVE_EDDSA
if (!FIPS_MODE()) {
- if (!get_eddsa_key(env, 1, key, &result))
- goto err;
- }
+ if (!get_eddsa_key(env, 1, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get EDDSA public key"));
+ } else
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "EDDSA not supported in FIPS mode"));
#else
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "EDDSA not supported"));
#endif
- } else if (algorithm == atom_dss) {
+
+ } else if (argv[algorithm_arg_num] == atom_dss) {
#ifdef HAVE_DSA
- if ((result = EVP_PKEY_new()) == NULL)
- goto err;
- if (!get_dss_public_key(env, key, &result))
- goto err;
+ if (!get_dss_public_key(env, argv[key_arg_num], pkey))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, key_arg_num, "Couldn't get DSA public key"));
#else
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, algorithm_arg_num, "DSA not supported"));
#endif
- } else {
- return PKEY_BADARG;
- }
-
- goto done;
+ } else
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, algorithm_arg_num, "Bad algorithm"));
- err:
- if (result)
- EVP_PKEY_free(result);
- result = NULL;
+ ret = 1;
done:
if (password)
@@ -410,440 +472,431 @@ static int get_pkey_public_key(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_T
if (id)
enif_free(id);
- if (result == NULL) {
- return PKEY_BADARG;
- } else {
- *pkey = result;
- return PKEY_OK;
- }
+ return ret;
+
+ err:
+ if (*pkey)
+ EVP_PKEY_free(*pkey);
+ *pkey = NULL;
+ ret = 0;
+ goto done;
}
ERL_NIF_TERM pkey_sign_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{/* (Algorithm, Type, Data|{digest,Digest}, Key|#{}, Options) */
- int i;
int sig_bin_alloc = 0;
- ERL_NIF_TERM ret;
+ ERL_NIF_TERM ret = atom_undefined;
const EVP_MD *md = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
EVP_PKEY *pkey = NULL;
-#ifdef HAVE_EDDSA
- EVP_MD_CTX *mdctx = NULL;
-#endif
#ifdef HAS_EVP_PKEY_CTX
EVP_PKEY_CTX *ctx = NULL;
size_t siglen;
#else
int len;
unsigned int siglen;
+ RSA *rsa = NULL;
+# ifdef HAVE_DSA
+ DSA *dsa = NULL;
+# endif
+# if defined(HAVE_EC)
+ EC_KEY *ec = NULL;
+# endif
#endif
PKeySignOptions sig_opt;
ErlNifBinary sig_bin; /* signature */
unsigned char *tbs = NULL; /* data to be signed */
size_t tbslen = 0;
- RSA *rsa = NULL;
-#ifdef HAVE_DSA
- DSA *dsa = NULL;
-#endif
-#if defined(HAVE_EC)
- EC_KEY *ec = NULL;
-#endif
-/*char buf[1024];
-enif_get_atom(env,argv[0],buf,1024,ERL_NIF_LATIN1); printf("algo=%s ",buf);
-enif_get_atom(env,argv[1],buf,1024,ERL_NIF_LATIN1); printf("hash=%s ",buf);
-*/
#ifndef HAS_ENGINE_SUPPORT
if (enif_is_map(env, argv[3]))
- return atom_notsup;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "No engine support"));
#endif
+ if (!get_pkey_sign_digest(env, argv, 0, 1, 2, md_value, &md, &tbs, &tbslen, &ret))
+ goto err; /* An exception is present in ret */
- i = get_pkey_sign_digest(env, argv[0], argv[1], argv[2], md_value, &md, &tbs, &tbslen);
- switch (i) {
- case PKEY_OK:
- break;
- case PKEY_NOTSUP:
- goto notsup;
- default:
- goto bad_arg;
- }
-
- i = get_pkey_sign_options(env, argv[0], argv[4], md, &sig_opt);
- switch (i) {
- case PKEY_OK:
- break;
- case PKEY_NOTSUP:
- goto notsup;
- default:
- goto bad_arg;
- }
-
- if (get_pkey_private_key(env, argv[0], argv[3], &pkey) != PKEY_OK)
- goto bad_arg;
+ if (!get_pkey_sign_options(env, argv, 0, 4, md, &sig_opt, &ret))
+ goto err; /* An exception is present in ret */
#ifdef HAS_EVP_PKEY_CTX
- if ((ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL)
- goto err;
-
- if (argv[0] != atom_eddsa) {
- if (EVP_PKEY_sign_init(ctx) != 1)
- goto err;
- if (md != NULL) {
- if (EVP_PKEY_CTX_set_signature_md(ctx, md) != 1)
- goto err;
+ { /* EVP_MD_CTX */
+ if (!get_pkey_private_key(env, argv, 0, 3, &pkey, &ret))
+ goto err; /* An exception is present in ret */
+
+ if ((ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate new EVP_PKEY_CTX"));
+
+ if (argv[0] != atom_eddsa) {
+ if (EVP_PKEY_sign_init(ctx) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_sign_init"));
+ if (md != NULL) {
+ if (EVP_PKEY_CTX_set_signature_md(ctx, md) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_set_signature_md"));
+ }
}
- }
- if (argv[0] == atom_rsa) {
- if (EVP_PKEY_CTX_set_rsa_padding(ctx, sig_opt.rsa_padding) != 1)
- goto err;
+ if (argv[0] == atom_rsa) {
+ if (EVP_PKEY_CTX_set_rsa_padding(ctx, sig_opt.rsa_padding) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_set_rsa_padding"));
# ifdef HAVE_RSA_PKCS1_PSS_PADDING
- if (sig_opt.rsa_padding == RSA_PKCS1_PSS_PADDING) {
- if (sig_opt.rsa_mgf1_md != NULL) {
+ if (sig_opt.rsa_padding == RSA_PKCS1_PSS_PADDING) {
+ if (sig_opt.rsa_mgf1_md != NULL) {
# ifdef HAVE_RSA_MGF1_MD
- if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, sig_opt.rsa_mgf1_md) != 1)
- goto err;
+ if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, sig_opt.rsa_mgf1_md) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_set_rsa_mgf1_md"));
# else
- goto notsup;
+ assign_goto(ret, err, EXCP_NOTSUP_N(env, 4, "rsa_mgf1_md unavailable with this cryptolib"));
# endif
+ }
+ if (sig_opt.rsa_pss_saltlen > -2) {
+ if (EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, sig_opt.rsa_pss_saltlen) != 1)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 4, "Bad rsa_pss_saltlen"));
+ }
}
- if (sig_opt.rsa_pss_saltlen > -2) {
- if (EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, sig_opt.rsa_pss_saltlen) != 1)
- goto err;
- }
- }
# endif
- }
+ }
- if (argv[0] == atom_eddsa) {
+ if (argv[0] == atom_eddsa) {
# ifdef HAVE_EDDSA
- if (!FIPS_MODE()) {
- if ((mdctx = EVP_MD_CTX_new()) == NULL)
- goto err;
+ if (!FIPS_MODE()) {
+ EVP_MD_CTX *mdctx = NULL;
+ if ((mdctx = EVP_MD_CTX_new()) == NULL)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_MD_CTX_new"));
+
+ if (EVP_DigestSignInit(mdctx, NULL, NULL, NULL, pkey) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_DigestSignInit"));
+ if (EVP_DigestSign(mdctx, NULL, &siglen, tbs, tbslen) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_DigestSign"));
+ if (!enif_alloc_binary(siglen, &sig_bin))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
+ sig_bin_alloc = 1;
+
+ if (EVP_DigestSign(mdctx, sig_bin.data, &siglen, tbs, tbslen) != 1) {
+ if (mdctx)
+ EVP_MD_CTX_free(mdctx);
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_DigestSign"));
+ }
+ if (mdctx)
+ EVP_MD_CTX_free(mdctx);
+ }
+ else
+# endif
+ assign_goto(ret, err, EXCP_NOTSUP_N(env, 0, "eddsa not supported"));
+ } else {
+
+# ifndef HAVE_DSA
+ if (argv[0] == atom_dss) assign_goto(ret, err, EXCP_NOTSUP_N(env, 0, "dsa not supported"));
+ } else {
+# endif
+ if (EVP_PKEY_sign(ctx, NULL, &siglen, tbs, tbslen) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_sign"));
- if (EVP_DigestSignInit(mdctx, NULL, NULL, NULL, pkey) != 1)
- goto err;
- if (EVP_DigestSign(mdctx, NULL, &siglen, tbs, tbslen) != 1)
- goto err;
if (!enif_alloc_binary(siglen, &sig_bin))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
sig_bin_alloc = 1;
- if (EVP_DigestSign(mdctx, sig_bin.data, &siglen, tbs, tbslen) != 1)
- goto bad_key;
+ if (md != NULL) {
+ ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, EVP_MD_size(md));
+ }
+ if (EVP_PKEY_sign(ctx, sig_bin.data, &siglen, tbs, tbslen) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_sign"));
}
- else
-# endif
- goto notsup;
- } else {
- if (EVP_PKEY_sign(ctx, NULL, &siglen, tbs, tbslen) != 1)
- goto err;
- if (!enif_alloc_binary(siglen, &sig_bin))
- goto err;
- sig_bin_alloc = 1;
-
- if (md != NULL) {
- ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, EVP_MD_size(md));
- }
- if (EVP_PKEY_sign(ctx, sig_bin.data, &siglen, tbs, tbslen) != 1)
- goto bad_key;
- }
-#else
-/*printf("Old interface\r\n");
- */
- if (argv[0] == atom_rsa) {
- if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
- goto err;
- if ((len = RSA_size(rsa)) < 0)
- goto err;
- if (!enif_alloc_binary((size_t)len, &sig_bin))
- goto err;
- sig_bin_alloc = 1;
-
- if ((len = EVP_MD_size(md)) < 0)
- goto err;
- ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, len);
-
- if (RSA_sign(md->type, tbs, (unsigned int)len, sig_bin.data, &siglen, rsa) != 1)
- goto bad_key;
- } else if (argv[0] == atom_dss) {
- if ((dsa = EVP_PKEY_get1_DSA(pkey)) == NULL)
- goto err;
- if ((len = DSA_size(dsa)) < 0)
- goto err;
- if (!enif_alloc_binary((size_t)len, &sig_bin))
- goto err;
- sig_bin_alloc = 1;
-
- if ((len = EVP_MD_size(md)) < 0)
- goto err;
- ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, len);
-
- if (DSA_sign(md->type, tbs, len, sig_bin.data, &siglen, dsa) != 1)
- goto bad_key;
- } else if (argv[0] == atom_ecdsa) {
-#if defined(HAVE_EC)
- if ((ec = EVP_PKEY_get1_EC_KEY(pkey)) == NULL)
- goto err;
- if ((len = ECDSA_size(ec)) < 0)
- goto err;
- if (!enif_alloc_binary((size_t)len, &sig_bin))
- goto err;
- sig_bin_alloc = 1;
-
- len = EVP_MD_size(md);
- ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, len);
-
- if (ECDSA_sign(md->type, tbs, len, sig_bin.data, &siglen, ec) != 1)
- goto bad_key;
-#else
- goto notsup;
-#endif
- } else {
- goto bad_arg;
- }
-#endif
ERL_VALGRIND_MAKE_MEM_DEFINED(sig_bin.data, siglen);
if (siglen != sig_bin.size) {
if (!enif_realloc_binary(&sig_bin, siglen))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't reallocate binary"));
ERL_VALGRIND_ASSERT_MEM_DEFINED(sig_bin.data, siglen);
}
+
ret = enif_make_binary(env, &sig_bin);
sig_bin_alloc = 0;
- goto done;
-
- bad_key:
- ret = atom_error;
- goto done;
-
- notsup:
- ret = atom_notsup;
- goto done;
-
- bad_arg:
- err:
- ret = enif_make_badarg(env);
- goto done;
- done:
+ err:
if (sig_bin_alloc)
enif_release_binary(&sig_bin);
- if (rsa)
- RSA_free(rsa);
-#ifdef HAVE_DSA
- if (dsa)
- DSA_free(dsa);
-#endif
-#ifdef HAVE_EC
- if (ec)
- EC_KEY_free(ec);
-#endif
-#ifdef HAS_EVP_PKEY_CTX
if (ctx)
EVP_PKEY_CTX_free(ctx);
-#endif
if (pkey)
EVP_PKEY_free(pkey);
+ return ret;
+ }
+ /* End of HAS_EVP_PKEY_CTX */
+#else
+ /* Old interface - before EVP_PKEY_CTX */
+ {
+ if (!get_pkey_private_key(env, argv, 0, 3, &pkey, &ret))
+ goto err; /* An exception is present in ret */
+
+ if (argv[0] == atom_rsa) {
+ if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Not an RSA private key"));
+ if ((len = RSA_size(rsa)) < 0)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Bad RSA private key length"));
+ if (!enif_alloc_binary((size_t)len, &sig_bin))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
+ sig_bin_alloc = 1;
-#ifdef HAVE_EDDSA
- if (mdctx)
- EVP_MD_CTX_free(mdctx);
+ if ((len = EVP_MD_size(md)) < 0)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't get md length"));
+ ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, len);
+
+ if (RSA_sign(md->type, tbs, (unsigned int)len, sig_bin.data, &siglen, rsa) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't sign"));
+
+ } else if (argv[0] == atom_dss) {
+ if ((dsa = EVP_PKEY_get1_DSA(pkey)) == NULL)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Not an DSA private key"));
+ if ((len = DSA_size(dsa)) < 0)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Bad DSA private key length"));
+ if (!enif_alloc_binary((size_t)len, &sig_bin))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
+ sig_bin_alloc = 1;
+
+ if ((len = EVP_MD_size(md)) < 0)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't get md length"));
+ ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, len);
+
+ if (DSA_sign(md->type, tbs, len, sig_bin.data, &siglen, dsa) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't sign"));
+ } else if (argv[0] == atom_ecdsa) {
+# if defined(HAVE_EC)
+ if ((ec = EVP_PKEY_get1_EC_KEY(pkey)) == NULL)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Not an ECDSA private key"));
+ if ((len = ECDSA_size(ec)) < 0)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't get size"));
+ if (!enif_alloc_binary((size_t)len, &sig_bin))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
+ sig_bin_alloc = 1;
+
+ len = EVP_MD_size(md);
+ ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, len);
+
+ if (ECDSA_sign(md->type, tbs, len, sig_bin.data, &siglen, ec) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't sign"));
+# else
+ assign_goto(ret, notsup, EXCP_NOTSUP_N(env, 0, "ecdsa not supported"));
+# endif /* HAVE_EC */
+ } else {
+ assign_goto(ret, notsup, EXCP_BADARG_N(env, 0, "Unknown algorithm"));
+ }
+
+ ERL_VALGRIND_MAKE_MEM_DEFINED(sig_bin.data, siglen);
+ if (siglen != sig_bin.size) {
+ if (!enif_realloc_binary(&sig_bin, siglen))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't re-allocate binary"));
+ ERL_VALGRIND_ASSERT_MEM_DEFINED(sig_bin.data, siglen);
+ }
+ ret = enif_make_binary(env, &sig_bin);
+ sig_bin_alloc = 0;
+
+ notsup:
+ err:
+ if (sig_bin_alloc)
+ enif_release_binary(&sig_bin);
+ if (rsa)
+ RSA_free(rsa);
+# ifdef HAVE_DSA
+ if (dsa)
+ DSA_free(dsa);
+# endif
+# ifdef HAVE_EC
+ if (ec)
+ EC_KEY_free(ec);
+# endif
+# ifdef HAS_EVP_PKEY_CTX
+ if (ctx)
+ EVP_PKEY_CTX_free(ctx);
+# endif
+ if (pkey)
+ EVP_PKEY_free(pkey);
+
+ return ret;
+ }
#endif
- return ret;
}
+
+
ERL_NIF_TERM pkey_verify_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{/* (Algorithm, Type, Data|{digest,Digest}, Signature, Key, Options) */
- int i;
int result;
const EVP_MD *md = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
EVP_PKEY *pkey = NULL;
-#ifdef HAS_EVP_PKEY_CTX
- EVP_PKEY_CTX *ctx = NULL;
-#else
-#endif
PKeySignOptions sig_opt;
ErlNifBinary sig_bin; /* signature */
unsigned char *tbs = NULL; /* data to be signed */
size_t tbslen = 0;
- ERL_NIF_TERM ret;
+ ERL_NIF_TERM ret = atom_undefined;
+
+#ifdef HAS_EVP_PKEY_CTX
+ EVP_PKEY_CTX *ctx = NULL;
+#else
RSA *rsa = NULL;
-#ifdef HAVE_DSA
- DSA *dsa = NULL;
-#endif
-#ifdef HAVE_EC
- EC_KEY *ec = NULL;
-#endif
-#ifdef HAVE_EDDSA
- EVP_MD_CTX *mdctx = NULL;
-#endif
+# ifdef HAVE_DSA
+ DSA *dsa = NULL;
+# endif
+# ifdef HAVE_EC
+ EC_KEY *ec = NULL;
+# endif
+#endif // HAS_EVP_PKEY_CTX
+
#ifndef HAS_ENGINE_SUPPORT
- if (enif_is_map(env, argv[4]))
- return atom_notsup;
+ if (enif_is_map(env, argv[3]))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "No engine support"));
#endif
- if (!enif_inspect_binary(env, argv[3], &sig_bin))
- return enif_make_badarg(env);
-
- i = get_pkey_sign_digest(env, argv[0], argv[1], argv[2], md_value, &md, &tbs, &tbslen);
- switch (i) {
- case PKEY_OK:
- break;
- case PKEY_NOTSUP:
- goto notsup;
- default:
- goto bad_arg;
- }
+ if (!get_pkey_sign_digest(env, argv, 0, 1, 2, md_value, &md, &tbs, &tbslen, &ret))
+ goto err; /* An exception is present in ret */
- i = get_pkey_sign_options(env, argv[0], argv[5], md, &sig_opt);
- switch (i) {
- case PKEY_OK:
- break;
- case PKEY_NOTSUP:
- goto notsup;
- default:
- goto bad_arg;
- }
+ if (!get_pkey_sign_options(env, argv, 0, 5, md, &sig_opt, &ret))
+ goto err; /* An exception is present in ret */
- if (get_pkey_public_key(env, argv[0], argv[4], &pkey) != PKEY_OK) {
- goto bad_arg;
- }
+ if (!enif_inspect_binary(env, argv[3], &sig_bin))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Expected a binary"));
#ifdef HAS_EVP_PKEY_CTX
-/* printf("EVP interface\r\n");
- */
- if ((ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL)
- goto err;
-
- if (argv[0] != atom_eddsa) {
- if (EVP_PKEY_verify_init(ctx) != 1)
- goto err;
- if (md != NULL) {
- if (EVP_PKEY_CTX_set_signature_md(ctx, md) != 1)
- goto err;
+ /* EVP_PKEY_CTX */
+ {
+ if (!get_pkey_public_key(env, argv, 0, 4, &pkey, &ret))
+ goto err; /* An exception is present in ret */
+
+ if ((ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate new EVP_PKEY_CTX"));
+
+ if (argv[0] != atom_eddsa) {
+ if (EVP_PKEY_verify_init(ctx) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_sign_init"));
+ if (md != NULL) {
+ if (EVP_PKEY_CTX_set_signature_md(ctx, md) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_set_signature_md"));
+ }
}
- }
- if (argv[0] == atom_rsa) {
- if (EVP_PKEY_CTX_set_rsa_padding(ctx, sig_opt.rsa_padding) != 1)
- goto err;
- if (sig_opt.rsa_padding == RSA_PKCS1_PSS_PADDING) {
- if (sig_opt.rsa_mgf1_md != NULL) {
-# ifdef HAVE_RSA_MGF1_MD
- if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, sig_opt.rsa_mgf1_md) != 1)
- goto err;
-# else
- goto notsup;
-# endif
- }
- if (sig_opt.rsa_pss_saltlen > -2) {
- if (EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, sig_opt.rsa_pss_saltlen) != 1)
- goto err;
+ if (argv[0] == atom_rsa) {
+ if (EVP_PKEY_CTX_set_rsa_padding(ctx, sig_opt.rsa_padding) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_set_rsa_padding"));
+# ifdef HAVE_RSA_PKCS1_PSS_PADDING
+ if (sig_opt.rsa_padding == RSA_PKCS1_PSS_PADDING) {
+ if (sig_opt.rsa_mgf1_md != NULL) {
+# ifdef HAVE_RSA_MGF1_MD
+ if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, sig_opt.rsa_mgf1_md) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_set_rsa_mgf1_md"));
+# else
+ assign_goto(ret, err, EXCP_NOTSUP_N(env, 5, "rsa_mgf1_md unavailable with this cryptolib"));
+# endif
+ }
+ if (sig_opt.rsa_pss_saltlen > -2) {
+ if (EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, sig_opt.rsa_pss_saltlen) != 1)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 5, "Bad rsa_pss_saltlen"));
+ }
}
+# endif
}
- }
- if (argv[0] == atom_eddsa) {
-#ifdef HAVE_EDDSA
- if (!FIPS_MODE()) {
- if ((mdctx = EVP_MD_CTX_new()) == NULL)
- goto err;
+ if (argv[0] == atom_eddsa) {
+# ifdef HAVE_EDDSA
+ EVP_MD_CTX *mdctx = NULL;
+ if (!FIPS_MODE()) {
+ if ((mdctx = EVP_MD_CTX_new()) == NULL)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_MD_CTX_new"));
- if (EVP_DigestVerifyInit(mdctx, NULL, NULL, NULL, pkey) != 1)
- goto err;
+ if (EVP_DigestVerifyInit(mdctx, NULL, NULL, NULL, pkey) != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_DigestVerifyInit"));
- result = EVP_DigestVerify(mdctx, sig_bin.data, sig_bin.size, tbs, tbslen);
- }
- else
-#endif
- goto notsup;
- } else {
- if (md != NULL) {
- ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, EVP_MD_size(md));
+ result = EVP_DigestVerify(mdctx, sig_bin.data, sig_bin.size, tbs, tbslen);
+ if (mdctx)
+ EVP_MD_CTX_free(mdctx);
+ }
+ else
+# endif /* HAVE_EDDSA */
+ assign_goto(ret, err, EXCP_NOTSUP_N(env, 0, "eddsa not supported"));
+ } else {
+ /* RSA or DSS */
+ if (md != NULL) {
+ ERL_VALGRIND_ASSERT_MEM_DEFINED(tbs, EVP_MD_size(md));
+ }
+ result = EVP_PKEY_verify(ctx, sig_bin.data, sig_bin.size, tbs, tbslen);
}
- result = EVP_PKEY_verify(ctx, sig_bin.data, sig_bin.size, tbs, tbslen);
- }
-#else
-/*printf("Old interface\r\n");
-*/
- if (tbslen > INT_MAX)
- goto bad_arg;
- if (sig_bin.size > INT_MAX)
- goto bad_arg;
- if (argv[0] == atom_rsa) {
- if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
- goto err;
- result = RSA_verify(md->type, tbs, (unsigned int)tbslen, sig_bin.data, (unsigned int)sig_bin.size, rsa);
- } else if (argv[0] == atom_dss) {
- if ((dsa = EVP_PKEY_get1_DSA(pkey)) == NULL)
- goto err;
- result = DSA_verify(0, tbs, (int)tbslen, sig_bin.data, (int)sig_bin.size, dsa);
- } else if (argv[0] == atom_ecdsa) {
-#if defined(HAVE_EC)
- if ((ec = EVP_PKEY_get1_EC_KEY(pkey)) == NULL)
- goto err;
- result = ECDSA_verify(EVP_MD_type(md), tbs, (int)tbslen, sig_bin.data, (int)sig_bin.size, ec);
-#else
- goto notsup;
-#endif
- } else {
- goto bad_arg;
- }
-#endif
- ret = (result == 1 ? atom_true : atom_false);
- goto done;
+ ret = (result == 1 ? atom_true : atom_false);
- bad_arg:
- err:
- ret = enif_make_badarg(env);
- goto done;
+ err:
+ if (ctx)
+ EVP_PKEY_CTX_free(ctx);
+ if (pkey)
+ EVP_PKEY_free(pkey);
- notsup:
- ret = atom_notsup;
+ return ret;
+ }
+ /* End of HAS_EVP_PKEY_CTX */
+#else
+ /* Old interface - before EVP_PKEY_CTX */
+ {
+ if (!get_pkey_public_key(env, argv, 0, 4, &pkey, &ret))
+ goto err; /* An exception is present in ret */
+
+ if (argv[0] == atom_rsa) {
+ if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 4, "Not an RSA public key"));
+ result = RSA_verify(md->type, tbs, (unsigned int)tbslen, sig_bin.data, (unsigned int)sig_bin.size, rsa);
+ } else if (argv[0] == atom_dss) {
+ if ((dsa = EVP_PKEY_get1_DSA(pkey)) == NULL)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 4, "Not an DSA public key"));
+ result = DSA_verify(0, tbs, (int)tbslen, sig_bin.data, (int)sig_bin.size, dsa);
+ } else if (argv[0] == atom_ecdsa) {
+# if defined(HAVE_EC)
+ if ((ec = EVP_PKEY_get1_EC_KEY(pkey)) == NULL)
+ assign_goto(ret, err, EXCP_BADARG_N(env, 4, "Not an ECDSA private key"));
+ result = ECDSA_verify(EVP_MD_type(md), tbs, (int)tbslen, sig_bin.data, (int)sig_bin.size, ec);
+# else
+ assign_goto(ret, err, EXCP_NOTSUP_N(env, 0, "ecdsa not supported"));
+# endif /* HAVE_EC */
+ } else {
+ assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Unknown algorithm"));
+ }
+ ret = (result == 1 ? atom_true : atom_false);
+
+ err:
+ if (rsa)
+ RSA_free(rsa);
+# ifdef HAVE_DSA
+ if (dsa)
+ DSA_free(dsa);
+# endif
+# ifdef HAVE_EC
+ if (ec)
+ EC_KEY_free(ec);
+# endif
+ if (pkey)
+ EVP_PKEY_free(pkey);
- done:
-#ifdef HAS_EVP_PKEY_CTX
- if (ctx)
- EVP_PKEY_CTX_free(ctx);
-#endif
-#ifdef HAVE_EDDSA
- if (mdctx)
- EVP_MD_CTX_free(mdctx);
-#endif
- if (pkey)
- EVP_PKEY_free(pkey);
- if (rsa)
- RSA_free(rsa);
-#ifdef HAVE_DSA
- if (dsa)
- DSA_free(dsa);
-#endif
-#ifdef HAVE_EC
- if (ec)
- EC_KEY_free(ec);
-#endif
+ return ret;
+ }
+#endif /* Pre EVP_PKEY_CTX */
- return ret;
}
-static int get_pkey_crypt_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NIF_TERM options,
- PKeyCryptOptions *opt)
+
+static int get_pkey_crypt_options(ErlNifEnv *env,
+ const ERL_NIF_TERM argv[],
+ int algorithm_arg_num, int options_arg_num,
+ PKeyCryptOptions *opt,
+ ERL_NIF_TERM *err_return)
{
ERL_NIF_TERM head, tail;
const ERL_NIF_TERM *tpl_terms;
int tpl_arity;
const EVP_MD *opt_md;
- if (!enif_is_list(env, options))
- goto bad_arg;
+ if (!enif_is_list(env, argv[options_arg_num]))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Expected a list"));
/* defaults */
- if (algorithm == atom_rsa) {
+ if (argv[algorithm_arg_num] == atom_rsa) {
opt->rsa_mgf1_md = NULL;
opt->rsa_oaep_label.data = NULL;
opt->rsa_oaep_label.size = 0;
@@ -859,18 +912,17 @@ static int get_pkey_crypt_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NI
opt->signature_md = NULL;
}
- if (enif_is_empty_list(env, options))
- return PKEY_OK;
+ if (enif_is_empty_list(env, argv[options_arg_num]))
+ return 1; /* There are no options to fetch. Return OK */
- if (algorithm != atom_rsa)
- goto bad_arg;
+ if (argv[algorithm_arg_num] != atom_rsa)
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Only RSA supports Options"));
- tail = options;
+ tail = argv[options_arg_num];
while (enif_get_list_cell(env, tail, &head, &tail)) {
- if (!enif_get_tuple(env, head, &tpl_arity, &tpl_terms))
- goto bad_arg;
- if (tpl_arity != 2)
- goto bad_arg;
+ if (!enif_get_tuple(env, head, &tpl_arity, &tpl_terms) ||
+ (tpl_arity != 2))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Expect only two-tuples in the list"));
if (tpl_terms[0] == atom_rsa_padding
|| tpl_terms[0] == atom_rsa_pad /* Compatibility */
@@ -894,59 +946,62 @@ static int get_pkey_crypt_options(ErlNifEnv *env, ERL_NIF_TERM algorithm, ERL_NI
} else if (tpl_terms[1] == atom_rsa_no_padding) {
opt->rsa_padding = RSA_NO_PADDING;
- } else {
- goto bad_arg;
- }
+ } else
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Bad padding type in option rsa_padding"));
+
+ } else if (tpl_terms[0] == atom_signature_md) {
+ if (!enif_is_atom(env, tpl_terms[1]))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Atom expected as argument to option signature_md"));
+
+ if (!get_pkey_digest_type(env, argv[algorithm_arg_num],
+ options_arg_num, tpl_terms[1],
+ &opt_md, err_return))
+ goto err; /* An exception is present in ret */
- } else if (tpl_terms[0] == atom_signature_md && enif_is_atom(env, tpl_terms[1])) {
- int i;
- i = get_pkey_digest_type(env, algorithm, tpl_terms[1], &opt_md);
- if (i != PKEY_OK) {
- return i;
- }
opt->signature_md = opt_md;
- } else if (tpl_terms[0] == atom_rsa_mgf1_md && enif_is_atom(env, tpl_terms[1])) {
- int i;
+ } else if (tpl_terms[0] == atom_rsa_mgf1_md) {
+ if (!enif_is_atom(env, tpl_terms[1]))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Atom expected as argument to option rsa_mgf1_md"));
#ifndef HAVE_RSA_MGF1_MD
if (tpl_terms[1] != atom_sha)
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Only 'sha' is supported in option rsa_mgf1_md"));
#endif
- i = get_pkey_digest_type(env, algorithm, tpl_terms[1], &opt_md);
- if (i != PKEY_OK) {
- return i;
- }
+ if (!get_pkey_digest_type(env, argv[algorithm_arg_num],
+ options_arg_num, tpl_terms[1],
+ &opt_md, err_return))
+ goto err; /* An exception is present in ret */
opt->rsa_mgf1_md = opt_md;
- } else if (tpl_terms[0] == atom_rsa_oaep_label
- && enif_inspect_binary(env, tpl_terms[1], &(opt->rsa_oaep_label))) {
+ } else if (tpl_terms[0] == atom_rsa_oaep_label) {
#ifdef HAVE_RSA_OAEP_MD
+ if (!enif_inspect_binary(env, tpl_terms[1], &(opt->rsa_oaep_label)))
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Binary expected for option rsa_oaep_label"));
continue;
#else
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, options_arg_num, "Option rsa_oaep_label is not supported"));
#endif
- } else if (tpl_terms[0] == atom_rsa_oaep_md && enif_is_atom(env, tpl_terms[1])) {
- int i;
+ } else if (tpl_terms[0] == atom_rsa_oaep_md) {
+ if (!enif_is_atom(env, tpl_terms[1]))
+ assign_goto(*err_return, err, EXCP_NOTSUP_N(env, options_arg_num, "Atom expected as argument to option rsa_oaep_md"));
#ifndef HAVE_RSA_OAEP_MD
if (tpl_terms[1] != atom_sha)
- return PKEY_NOTSUP;
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Only 'sha' is supported in option rsa_oaep_md"));
#endif
- i = get_pkey_digest_type(env, algorithm, tpl_terms[1], &opt_md);
- if (i != PKEY_OK) {
- return i;
- }
+ if (!get_pkey_digest_type(env, argv[algorithm_arg_num],
+ options_arg_num, tpl_terms[1],
+ &opt_md, err_return))
+ goto err; /* An exception is present in ret */
opt->rsa_oaep_md = opt_md;
-
- } else {
- goto bad_arg;
- }
+ } else
+ assign_goto(*err_return, err, EXCP_BADARG_N(env, options_arg_num, "Unknown option"))
}
- return PKEY_OK;
+ return 1;
- bad_arg:
- return PKEY_BADARG;
+ err:
+ return 0;
}
#ifdef HAVE_RSA_SSLV23_PADDING
@@ -968,8 +1023,7 @@ static size_t size_of_RSA(EVP_PKEY *pkey) {
ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{/* (Algorithm, Data, PublKey=[E,N]|[E,N,D]|[E,N,D,P1,P2,E1,E2,C], Options, IsPrivate, IsEncrypt) */
- ERL_NIF_TERM ret;
- int i;
+ ERL_NIF_TERM ret = atom_undefined;
int result = 0;
int tmp_bin_alloc = 0;
int out_bin_alloc = 0;
@@ -987,74 +1041,61 @@ ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
size_t tmplen;
#endif
int is_private, is_encrypt;
- int algo_init = 0;
unsigned char *label_copy = NULL;
- ASSERT(argc == 6);
-
is_private = (argv[4] == atom_true);
is_encrypt = (argv[5] == atom_true);
-/* char algo[1024]; */
+ if (!check_pkey_algorithm_type(env, 0, argv[0], &ret))
+ goto err; /* An exception is present in ret */
+
+ if (!enif_inspect_binary(env, argv[1], &in_bin))
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Binary expected"));
#ifndef HAS_ENGINE_SUPPORT
if (enif_is_map(env, argv[2]))
- return atom_notsup;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "No engine support"));
#endif
- if (!enif_inspect_binary(env, argv[1], &in_bin))
- goto bad_arg;
-
- i = get_pkey_crypt_options(env, argv[0], argv[3], &crypt_opt);
- switch (i) {
- case PKEY_OK:
- break;
- case PKEY_NOTSUP:
- goto notsup;
- default:
- goto bad_arg;
- }
-
if (is_private) {
- if (get_pkey_private_key(env, argv[0], argv[2], &pkey) != PKEY_OK)
- goto bad_arg;
+ if (!get_pkey_private_key(env, argv, 0, 2, &pkey, &ret))
+ goto err; /* An exception is present in ret */
} else {
- if (get_pkey_public_key(env, argv[0], argv[2], &pkey) != PKEY_OK)
- goto bad_arg;
+ if (!get_pkey_public_key(env, argv, 0, 2, &pkey, &ret))
+ goto err; /* An exception is present in ret */
}
+ if (!get_pkey_crypt_options(env, argv, 0, 3, &crypt_opt, &ret))
+ goto err; /* An exception is present in ret */
+
#ifdef HAS_EVP_PKEY_CTX
- if ((ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL)
- goto err;
+ {
+ int algo_init = 0;
-/* enif_get_atom(env,argv[0],algo,1024,ERL_NIF_LATIN1); */
+ if ((ctx = EVP_PKEY_CTX_new(pkey, NULL)) == NULL)
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate new EVP_PKEY_CTX"));
- if (is_private) {
- if (is_encrypt) {
- /* private encrypt */
- if ((algo_init = EVP_PKEY_sign_init(ctx)) != 1)
- goto bad_arg;
- } else {
- /* private decrypt */
- if ((algo_init = EVP_PKEY_decrypt_init(ctx)) != 1)
- goto bad_arg;
- }
- } else {
- if (is_encrypt) {
- /* public encrypt */
- if ((algo_init = EVP_PKEY_encrypt_init(ctx)) != 1)
- goto bad_arg;
- } else {
- /* public decrypt */
- if ((algo_init = EVP_PKEY_verify_recover_init(ctx)) != 1)
- goto bad_arg;
- }
+ if (is_private) {
+ if (is_encrypt)
+ algo_init = EVP_PKEY_sign_init(ctx);
+ else
+ algo_init = EVP_PKEY_decrypt_init(ctx);
+
+ } else {
+ if (is_encrypt)
+ algo_init = EVP_PKEY_encrypt_init(ctx);
+ else
+ algo_init = EVP_PKEY_verify_recover_init(ctx);
+ }
+
+ if (algo_init != 1)
+ assign_goto(ret, err, EXCP_NOTSUP(env, "Can't initiate encrypt/decrypt"));
}
if (argv[0] == atom_rsa) {
if (crypt_opt.signature_md != NULL) {
if (EVP_PKEY_CTX_set_signature_md(ctx, crypt_opt.signature_md) != 1)
- goto bad_arg;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't EVP_PKEY_CTX_set_signature_md"));
}
# ifdef HAVE_RSA_SSLV23_PADDING
@@ -1062,40 +1103,38 @@ ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
if (is_encrypt) {
tmplen = size_of_RSA(pkey);
if (tmplen < 1 || tmplen > INT_MAX)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "RSA key of wrong size"));
if (!enif_alloc_binary(tmplen, &tmp_bin))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
tmp_bin_alloc = 1;
if (in_bin.size > INT_MAX)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Binary too large"));
if (!RSA_padding_add_SSLv23(tmp_bin.data, (int)tmplen, in_bin.data, (int)in_bin.size))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't RSA_padding_add_SSLv23"));
in_bin = tmp_bin;
}
if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_NO_PADDING) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't set RSA_NO_PADDING"));
} else
# endif
- {
if (EVP_PKEY_CTX_set_rsa_padding(ctx, crypt_opt.rsa_padding) != 1)
- goto err;
- }
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't set rsa padding"));
# ifdef HAVE_RSA_OAEP_MD
if (crypt_opt.rsa_padding == RSA_PKCS1_OAEP_PADDING) {
if (crypt_opt.rsa_oaep_md != NULL) {
if (EVP_PKEY_CTX_set_rsa_oaep_md(ctx, crypt_opt.rsa_oaep_md) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't EVP_PKEY_CTX_set_rsa_oaep_md"));
}
if (crypt_opt.rsa_mgf1_md != NULL) {
if (EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, crypt_opt.rsa_mgf1_md) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't EVP_PKEY_CTX_set_rsa_mgf1_md"));
}
if (crypt_opt.rsa_oaep_label.data != NULL && crypt_opt.rsa_oaep_label.size > 0) {
if (crypt_opt.rsa_oaep_label.size > INT_MAX)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "RSA oep label too large"));
if ((label_copy = OPENSSL_malloc(crypt_opt.rsa_oaep_label.size)) == NULL)
goto err;
@@ -1104,7 +1143,7 @@ ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
if (EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, label_copy,
(int)crypt_opt.rsa_oaep_label.size) != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't set RSA oaep label"));
/* On success, label_copy is owned by ctx */
label_copy = NULL;
}
@@ -1112,105 +1151,77 @@ ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
# endif
}
- if (is_private) {
- if (is_encrypt) {
- /* private_encrypt */
- result = EVP_PKEY_sign(ctx, NULL, &outlen, in_bin.data, in_bin.size);
- } else {
- /* private_decrypt */
- result = EVP_PKEY_decrypt(ctx, NULL, &outlen, in_bin.data, in_bin.size);
- }
- } else {
- if (is_encrypt) {
- /* public_encrypt */
- result = EVP_PKEY_encrypt(ctx, NULL, &outlen, in_bin.data, in_bin.size);
- } else {
- /* public_decrypt */
- result = EVP_PKEY_verify_recover(ctx, NULL, &outlen, in_bin.data, in_bin.size);
- }
- }
-
+ /* Get the size of the result */
+ if (is_private)
+ result =
+ is_encrypt ? EVP_PKEY_sign(ctx, NULL, &outlen, in_bin.data, in_bin.size)
+ : EVP_PKEY_decrypt(ctx, NULL, &outlen, in_bin.data, in_bin.size);
+ else
+ result =
+ is_encrypt ? EVP_PKEY_encrypt(ctx, NULL, &outlen, in_bin.data, in_bin.size)
+ : EVP_PKEY_verify_recover(ctx, NULL, &outlen, in_bin.data, in_bin.size);
+
+ /* Check */
if (result != 1)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't get size of result"));
+ /* Allocate */
if (!enif_alloc_binary(outlen, &out_bin))
- goto err;
- out_bin_alloc = 1;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
- if (is_private) {
- if (is_encrypt) {
- /* private_encrypt */
- result = EVP_PKEY_sign(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size);
- } else {
- /* private_decrypt */
- result = EVP_PKEY_decrypt(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size);
- }
- } else {
- if (is_encrypt) {
- /* public_encrypt */
- result = EVP_PKEY_encrypt(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size);
- } else {
- /* public_decrypt */
- result = EVP_PKEY_verify_recover(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size);
- }
- }
+ out_bin_alloc = 1; /* Flag de-allocation */
+
+ /* Get the result into the newly allocated binary */
+ if (is_private)
+ result =
+ is_encrypt ? EVP_PKEY_sign(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size)
+ : EVP_PKEY_decrypt(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size);
+ else
+ result=
+ is_encrypt ? EVP_PKEY_encrypt(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size)
+ : EVP_PKEY_verify_recover(ctx, out_bin.data, &outlen, in_bin.data, in_bin.size);
+
+ if (result != 1)
+ assign_goto(ret, err, EXCP_ERROR(env, "Couldn't get the result"));
#else
- /* Non-EVP cryptolib. Only support RSA */
+ /* Non-EVP cryptolib. Only supports RSA */
- if (argv[0] != atom_rsa) {
- algo_init = -2; /* exitcode: notsup */
- goto bad_arg;
- }
+ if (argv[0] != atom_rsa)
+ assign_goto(ret, err, EXCP_NOTSUP_N(env, 0, "Only RSA is supported"));
if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "Not RSA key"));
if ((len = RSA_size(rsa)) < 0)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 3, "Bad RSA key length"));
if (!enif_alloc_binary((size_t)len, &out_bin))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
out_bin_alloc = 1;
if (in_bin.size > INT_MAX)
- goto err;
- if (is_private) {
- if (is_encrypt) {
- /* non-evp rsa private encrypt */
- ERL_VALGRIND_ASSERT_MEM_DEFINED(in_bin.data,in_bin.size);
- result = RSA_private_encrypt((int)in_bin.size, in_bin.data,
- out_bin.data, rsa, crypt_opt.rsa_padding);
- if (result > 0) {
- ERL_VALGRIND_MAKE_MEM_DEFINED(out_bin.data, result);
- }
- } else {
- /* non-evp rsa private decrypt */
- result = RSA_private_decrypt((int)in_bin.size, in_bin.data,
- out_bin.data, rsa, crypt_opt.rsa_padding);
- if (result > 0) {
- ERL_VALGRIND_MAKE_MEM_DEFINED(out_bin.data, result);
- if (!enif_realloc_binary(&out_bin, (size_t)result))
- goto err;
- }
- }
- } else {
- if (is_encrypt) {
- /* non-evp rsa public encrypt */
- ERL_VALGRIND_ASSERT_MEM_DEFINED(in_bin.data,in_bin.size);
- result = RSA_public_encrypt((int)in_bin.size, in_bin.data,
- out_bin.data, rsa, crypt_opt.rsa_padding);
- if (result > 0) {
- ERL_VALGRIND_MAKE_MEM_DEFINED(out_bin.data, result);
- }
- } else {
- /* non-evp rsa public decrypt */
- result = RSA_public_decrypt((int)in_bin.size, in_bin.data,
- out_bin.data, rsa, crypt_opt.rsa_padding);
- if (result > 0) {
- ERL_VALGRIND_MAKE_MEM_DEFINED(out_bin.data, result);
- if (!enif_realloc_binary(&out_bin, (size_t)result))
- goto err;
- }
- }
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Bad indata length"));
+
+ if (is_encrypt) {
+ ERL_VALGRIND_ASSERT_MEM_DEFINED(in_bin.data,in_bin.size);
+ }
+
+ if (is_private)
+ result =
+ is_encrypt ? RSA_private_encrypt((int)in_bin.size, in_bin.data,
+ out_bin.data, rsa, crypt_opt.rsa_padding)
+ : RSA_private_decrypt((int)in_bin.size, in_bin.data,
+ out_bin.data, rsa, crypt_opt.rsa_padding);
+ else
+ result =
+ is_encrypt ? RSA_public_encrypt((int)in_bin.size, in_bin.data,
+ out_bin.data, rsa, crypt_opt.rsa_padding)
+ : RSA_public_decrypt((int)in_bin.size, in_bin.data,
+ out_bin.data, rsa, crypt_opt.rsa_padding);
+ if (result > 0) {
+ ERL_VALGRIND_MAKE_MEM_DEFINED(out_bin.data, result);
+ if (!is_encrypt &&
+ !enif_realloc_binary(&out_bin, (size_t)result))
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't re-allocate binary"));
}
outlen = (size_t)result;
@@ -1223,12 +1234,12 @@ ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
tmplen = size_of_RSA(pkey);
if (tmplen < 1 || tmplen > INT_MAX)
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 2, "RSA key of wrong size"));
if (!enif_alloc_binary(tmplen, &tmp_bin))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't allocate binary"));
tmp_bin_alloc = 1;
if (out_bin.size > INT_MAX)
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Result too large"));
p = out_bin.data;
p++;
@@ -1249,28 +1260,16 @@ ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
ERL_VALGRIND_MAKE_MEM_DEFINED(out_bin.data, outlen);
if (outlen != out_bin.size) {
if (!enif_realloc_binary(&out_bin, outlen))
- goto err;
+ assign_goto(ret, err, EXCP_ERROR(env, "Can't re-allocate binary"));
ERL_VALGRIND_ASSERT_MEM_DEFINED(out_bin.data, outlen);
}
ret = enif_make_binary(env, &out_bin);
out_bin_alloc = 0;
} else {
- ret = atom_error;
+ assign_goto(ret, err, EXCP_ERROR(env, "RSA encrypt/decrypt failed"));
}
- goto done;
-
- notsup:
- ret = atom_notsup;
- goto done;
- bad_arg:
err:
- if (algo_init == -2)
- ret = atom_notsup;
- else
- ret = enif_make_badarg(env);
-
- done:
if (out_bin_alloc)
enif_release_binary(&out_bin);
if (tmp_bin_alloc)
@@ -1290,7 +1289,7 @@ ERL_NIF_TERM pkey_crypt_nif(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
OPENSSL_free(label_copy);
return ret;
-}
+ }
ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{ /* (Algorithm, PrivKey | KeyMap) */
@@ -1299,17 +1298,20 @@ ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
ASSERT(argc == 2);
- if (get_pkey_private_key(env, argv[0], argv[1], &pkey) != PKEY_OK) // handles engine
- goto bad_arg;
+ if (!check_pkey_algorithm_type(env, 0, argv[0], &ret))
+ goto err; /* An exception is present in ret */
+
+ if (!get_pkey_private_key(env, argv, 0, 1, &pkey, &ret)) // handles engine
+ goto err; /* An exception is present in ret */
if (argv[0] == atom_rsa) {
if (!rsa_privkey_to_pubkey(env, pkey, &ret))
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Couldn't get RSA public key from private key"));
#ifdef HAVE_DSA
} else if (argv[0] == atom_dss) {
if (!dss_privkey_to_pubkey(env, pkey, &ret))
- goto err;
+ assign_goto(ret, err, EXCP_BADARG_N(env, 1, "Couldn't get DSA public key from private key"));
#endif
} else if (argv[0] == atom_ecdsa) {
#if defined(HAVE_EC)
@@ -1346,18 +1348,12 @@ ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
return enif_make_list_from_array(env, ..., ...);
*/
#endif
- goto bad_arg;
+ assign_goto(ret, err, EXCP_NOTSUP_N(env, 0, "ECDSA not implemented"));
} else {
- goto bad_arg;
+ ret = EXCP_BADARG_N(env, 0, "Bad algorithm");
}
- goto done;
-
- bad_arg:
err:
- ret = enif_make_badarg(env);
-
- done:
if (pkey)
EVP_PKEY_free(pkey);
diff --git a/lib/crypto/c_src/rsa.c b/lib/crypto/c_src/rsa.c
index 5ee389467d..0a543fe6e5 100644
--- a/lib/crypto/c_src/rsa.c
+++ b/lib/crypto/c_src/rsa.c
@@ -21,16 +21,93 @@
#include "rsa.h"
#include "bn.h"
-//#define(CHK_RSA_3_0)
-
static ERL_NIF_TERM rsa_generate_key(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
-#if !defined(HAS_3_0_API) || defined(CHK_RSA_3_0)
+#if !defined(HAS_3_0_API)
static ERL_NIF_TERM put_rsa_private_key(ErlNifEnv* env, const RSA *rsa);
#endif
#if !defined(HAS_3_0_API)
static int check_erlang_interrupt(int maj, int min, BN_GENCB *ctxt);
#endif
+#define PUT1(env,bn,t) \
+ if (bn) {if ((t = bin_from_bn(env, bn)) == atom_error) goto err;} \
+ else t = atom_undefined
+
+
+// ERL_NIF_TERM debug_put_pkey(ErlNifEnv* env, EVP_PKEY *pkey);
+// ERL_NIF_TERM debug_put_pkey(ErlNifEnv* env, EVP_PKEY *pkey)
+// {
+// const BIGNUM *e1 = NULL, *n1 = NULL, *d1 = NULL;
+// RSA *rsa = NULL;
+// ERL_NIF_TERM result[3];
+//
+// rsa = EVP_PKEY_get1_RSA(pkey);
+// RSA_get0_key(rsa, &n1, &e1, &d1);
+//
+// PUT1(env, e1, result[0]); // Exponent E
+// PUT1(env, n1, result[1]); // Modulus N = p*q
+// PUT1(env, d1, result[2]);
+//
+// return enif_make_list_from_array(env,result,3);
+//
+// err:
+// return atom_error;
+// }
+
+
+#if !defined(HAS_3_0_API)
+/* Creates a term which can be parsed by get_rsa_private_key(). This is a list of plain integer binaries (not mpints). */
+static ERL_NIF_TERM put_rsa_private_key(ErlNifEnv* env, const RSA *rsa)
+{
+ ERL_NIF_TERM result[8];
+ const BIGNUM *n = NULL, *e = NULL, *d = NULL, *p = NULL, *q = NULL, *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL;
+
+ /* Return at least [E,N,D] */
+ RSA_get0_key(rsa, &n, &e, &d);
+
+ if ((result[0] = bin_from_bn(env, e)) == atom_error) // Exponent E
+ goto err;
+ if ((result[1] = bin_from_bn(env, n)) == atom_error) // Modulus N = p*q
+ goto err;
+ if ((result[2] = bin_from_bn(env, d)) == atom_error) // Exponent D
+ goto err;
+
+ /* Check whether the optional additional parameters are available */
+ RSA_get0_factors(rsa, &p, &q);
+ RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
+
+ if (p && q && dmp1 && dmq1 && iqmp) {
+ if ((result[3] = bin_from_bn(env, p)) == atom_error) // Factor p
+ goto err;
+ if ((result[4] = bin_from_bn(env, q)) == atom_error) // Factor q
+ goto err;
+ if ((result[5] = bin_from_bn(env, dmp1)) == atom_error) // D mod (p-1)
+ goto err;
+ if ((result[6] = bin_from_bn(env, dmq1)) == atom_error) // D mod (q-1)
+ goto err;
+ if ((result[7] = bin_from_bn(env, iqmp)) == atom_error) // (1/q) mod p
+ goto err;
+
+ return enif_make_list_from_array(env, result, 8);
+ } else {
+ return enif_make_list_from_array(env, result, 3);
+ }
+
+ err:
+ return enif_make_badarg(env);
+}
+
+static int check_erlang_interrupt(int maj, int min, BN_GENCB *ctxt)
+{
+ ErlNifEnv *env = BN_GENCB_get_arg(ctxt);
+
+ if (!enif_is_current_process_alive(env)) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
int get_rsa_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
{
/* key=[E,N,D]|[E,N,D,P1,P2,E1,E2,C] */
@@ -56,6 +133,7 @@ int get_rsa_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
if ((rsa = RSA_new()) == NULL)
goto err;
+ *pkey = EVP_PKEY_new();
if (!RSA_set0_key(rsa, n, e, d))
goto err;
/* rsa now owns n, e, and d */
@@ -135,6 +213,7 @@ int get_rsa_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
return 0;
}
+
int get_rsa_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
{
/* key=[E,N] */
@@ -162,9 +241,11 @@ int get_rsa_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
n = NULL;
e = NULL;
+ *pkey = EVP_PKEY_new();
if (EVP_PKEY_assign_RSA(*pkey, rsa) != 1)
goto err;
+ // enif_fprintf(stderr, "pkey = %T\r\n", debug_put_pkey(env,*pkey));
return 1;
bad_arg:
@@ -179,63 +260,6 @@ int get_rsa_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
return 0;
}
-#if !defined(HAS_3_0_API) || defined(CHK_RSA_3_0)
-/* Creates a term which can be parsed by get_rsa_private_key(). This is a list of plain integer binaries (not mpints). */
-static ERL_NIF_TERM put_rsa_private_key(ErlNifEnv* env, const RSA *rsa)
-{
- ERL_NIF_TERM result[8];
- const BIGNUM *n = NULL, *e = NULL, *d = NULL, *p = NULL, *q = NULL, *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL;
-
- /* Return at least [E,N,D] */
- RSA_get0_key(rsa, &n, &e, &d);
-
- if ((result[0] = bin_from_bn(env, e)) == atom_error) // Exponent E
- goto err;
- if ((result[1] = bin_from_bn(env, n)) == atom_error) // Modulus N = p*q
- goto err;
- if ((result[2] = bin_from_bn(env, d)) == atom_error) // Exponent D
- goto err;
-
- /* Check whether the optional additional parameters are available */
- RSA_get0_factors(rsa, &p, &q);
- RSA_get0_crt_params(rsa, &dmp1, &dmq1, &iqmp);
-
- if (p && q && dmp1 && dmq1 && iqmp) {
- if ((result[3] = bin_from_bn(env, p)) == atom_error) // Factor p
- goto err;
- if ((result[4] = bin_from_bn(env, q)) == atom_error) // Factor q
- goto err;
- if ((result[5] = bin_from_bn(env, dmp1)) == atom_error) // D mod (p-1)
- goto err;
- if ((result[6] = bin_from_bn(env, dmq1)) == atom_error) // D mod (q-1)
- goto err;
- if ((result[7] = bin_from_bn(env, iqmp)) == atom_error) // (1/q) mod p
- goto err;
-
- return enif_make_list_from_array(env, result, 8);
- } else {
- return enif_make_list_from_array(env, result, 3);
- }
-
- err:
- return enif_make_badarg(env);
-}
-#endif
-
-#if !defined(HAS_3_0_API)
-/* Legacy API deprecated from 3.0 is used */
-
-static int check_erlang_interrupt(int maj, int min, BN_GENCB *ctxt)
-{
- ErlNifEnv *env = BN_GENCB_get_arg(ctxt);
-
- if (!enif_is_current_process_alive(env)) {
- return 0;
- } else {
- return 1;
- }
-}
-
static ERL_NIF_TERM rsa_generate_key(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (ModulusSize, PublicExponent) */
ERL_NIF_TERM ret;
@@ -303,9 +327,127 @@ static ERL_NIF_TERM rsa_generate_key(ErlNifEnv* env, int argc, const ERL_NIF_TER
return ret;
}
+int rsa_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret)
+{
+ const BIGNUM *n = NULL, *e = NULL, *d = NULL;
+ ERL_NIF_TERM result[2];
+ RSA *rsa = NULL;
+
+ if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
+ goto err;
+
+ RSA_get0_key(rsa, &n, &e, &d);
+
+ // Exponent E
+ if ((result[0] = bin_from_bn(env, e)) == atom_error)
+ goto err;
+ // Modulus N = p*q
+ if ((result[1] = bin_from_bn(env, n)) == atom_error)
+ goto err;
+
+ *ret = enif_make_list_from_array(env, result, 2);
+ RSA_free(rsa);
+ return 1;
+
+ err:
+ if (rsa)
+ RSA_free(rsa);
+ return 0;
+}
+
+
#else
/* New 3.0 API is used */
+int get_rsa_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
+{
+ /* key=[E,N,D]|[E,N,D,P1,P2,E1,E2,C] */
+ ERL_NIF_TERM head, tail;
+ OSSL_PARAM params[9];
+ EVP_PKEY_CTX *ctx = NULL;
+ int i = 0;
+
+ head = key;
+
+ if (!get_ossl_param_from_bin_in_list(env, "e", &head, &params[i++]) || // Exponent E
+ !get_ossl_param_from_bin_in_list(env, "n", &head, &params[i++]) || // N = p*q
+ !get_ossl_param_from_bin_in_list(env, "d", &head, &params[i++])) // Exponent D
+ goto bad_arg;
+
+ tail = head;
+
+ if (!enif_is_empty_list(env, tail)) {
+ if (!get_ossl_param_from_bin_in_list(env, "rsa-factor1", &head, &params[i++]) || // p, Factor p
+ !get_ossl_param_from_bin_in_list(env, "rsa-factor2", &head, &params[i++]) || // q, Factor q
+ !get_ossl_param_from_bin_in_list(env, "rsa-exponent1", &head, &params[i++]) || // dmp1, D mod (p-1)
+ !get_ossl_param_from_bin_in_list(env, "rsa-exponent2", &head, &params[i++]) || // dmq1, D mod (q-1)
+ !get_ossl_param_from_bin_in_list(env, "rsa-coefficient1", &head, &params[i++]) ) // iqmp, (1/q) mod p
+ goto bad_arg;
+
+ tail = head;
+
+ if (!enif_is_empty_list(env, tail))
+ goto bad_arg;
+ }
+
+ params[i++] = OSSL_PARAM_construct_end();
+
+ if ((ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL)) == NULL)
+ goto err;
+ if (EVP_PKEY_fromdata_init(ctx) <= 0)
+ goto err;
+ if (EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_KEYPAIR, params) <= 0)
+ goto bad_arg;
+
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 1;
+
+ bad_arg:
+ err:
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 0;
+}
+
+
+int get_rsa_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
+{
+ ERL_NIF_TERM head, tail;
+ OSSL_PARAM params[3];
+ EVP_PKEY_CTX *ctx = NULL;
+
+ head = key;
+ if (!get_ossl_param_from_bin_in_list(env, "e", &head, &params[0]) )
+ goto bad_arg;
+
+ if (!get_ossl_param_from_bin_in_list(env, "n", &head, &params[1]) )
+ goto bad_arg;
+
+ tail = head;
+ if (!enif_is_empty_list(env, tail))
+ goto bad_arg;
+
+ params[2] = OSSL_PARAM_construct_end();
+
+ if ((ctx = EVP_PKEY_CTX_new_from_name(NULL, "RSA", NULL)) == NULL)
+ goto err;
+ if (EVP_PKEY_fromdata_init(ctx) <= 0)
+ goto err;
+ if (EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_PUBLIC_KEY, params) <= 0)
+ goto bad_arg;
+
+ /* enif_fprintf(stderr, "pkey = %T\r\nn = %T\r\n", */
+ /* debug_put_pkey(env,*pkey), */
+ /* enif_make_binary(env,&tmp) */
+ /* ); */
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 1;
+
+ bad_arg:
+ err:
+ if (ctx) EVP_PKEY_CTX_free(ctx);
+ return 0;
+}
+
static ERL_NIF_TERM rsa_generate_key(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (ModulusSize, PublicExponent/binary, PublicExponent) */
ERL_NIF_TERM ret;
@@ -378,58 +520,56 @@ static ERL_NIF_TERM rsa_generate_key(ErlNifEnv* env, int argc, const ERL_NIF_TER
|| ((result[7] = bin_from_bn(env, iqmp)) == atom_error)
) {
ret = EXCP_ERROR(env, "Can't get RSA keys");
- goto ret;
+ goto local_ret;
}
-
ret = enif_make_list_from_array(env, result, 8);
-
-#ifdef CHK_RSA_3_0
- {RSA *rsa = EVP_PKEY_get1_RSA(pkey);
- if (!rsa)
- ret = enif_make_tuple2(env, ret, atom_error);
- else
- ret = enif_make_tuple2(env, ret, put_rsa_private_key(env,rsa));
- }
-#endif
+ local_ret:
+ if (e) BN_free(e);
+ if (n) BN_free(n);
+ if (d) BN_free(d);
+ if (p) BN_free(p);
+ if (q) BN_free(q);
+ if (dmp1) BN_free(dmp1);
+ if (dmq1) BN_free(dmq1);
+ if (iqmp) BN_free(iqmp);
}
ret:
+ if (pkey) EVP_PKEY_free(pkey);
if (pctx) EVP_PKEY_CTX_free(pctx);
return ret;
}
-#endif /* #else-part of #if !defined(HAS_3_0_API) */
-
-
int rsa_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret)
{
- const BIGNUM *n = NULL, *e = NULL, *d = NULL;
+ BIGNUM *e = NULL, *n = NULL;
ERL_NIF_TERM result[2];
- RSA *rsa = NULL;
-
- if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
- goto err;
-
- RSA_get0_key(rsa, &n, &e, &d);
- // Exponent E
- if ((result[0] = bin_from_bn(env, e)) == atom_error)
- goto err;
- // Modulus N = p*q
- if ((result[1] = bin_from_bn(env, n)) == atom_error)
+ /* https://www.openssl.org/docs/man3.0/man7/EVP_PKEY-RSA.html */
+ if (
+ !EVP_PKEY_get_bn_param(pkey, "e", &e) // Exponent E
+ || !EVP_PKEY_get_bn_param(pkey, "n", &n) // Modulus N = p*q
+ || ((result[0] = bin_from_bn(env, e)) == atom_error)
+ || ((result[1] = bin_from_bn(env, n)) == atom_error)
+ )
goto err;
- *ret = enif_make_list_from_array(env, result, 2);
- RSA_free(rsa);
+ *ret = enif_make_list_from_array(env, result, 2);
+ if (e) BN_free(e);
+ if (n) BN_free(n);
return 1;
err:
- if (rsa)
- RSA_free(rsa);
+ if (e) BN_free(e);
+ if (n) BN_free(n);
return 0;
+
}
+#endif /* #else-part of #if !defined(HAS_3_0_API) (That is, end of defined(HAS_3_0_API)) */
+
+
ERL_NIF_TERM rsa_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
/* RSA key generation can take a long time (>1 sec for a large
diff --git a/lib/crypto/configure b/lib/crypto/configure
index 5033d0a33b..f3f24c77e0 100755
--- a/lib/crypto/configure
+++ b/lib/crypto/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,42 +167,53 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -228,14 +221,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -253,18 +253,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -291,6 +292,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -308,6 +310,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -322,7 +332,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -331,7 +341,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -370,12 +380,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -387,18 +398,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -410,9 +430,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -439,7 +459,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -483,7 +503,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -497,6 +517,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -510,6 +534,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -575,50 +606,46 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
ac_unique_file="vsn.mk"
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
+ac_header_c_list=
ac_subst_vars='LTLIBOBJS
LIBOBJS
DISABLE_OTP_TEST_ENGINE
@@ -633,6 +660,8 @@ SSL_FLAGS
SSL_LIBDIR
SSL_INCDIR
SSL_INCLUDE
+EGREP
+GREP
DED_OSTYPE
DED_LIBS
DED_WERRORFLAGS
@@ -646,8 +675,6 @@ DED_EXT
DED_GCC
DED_CC
DED_THR_DEFS
-EGREP
-GREP
MIXED_MINGW
MIXED_VC
OBJEXT
@@ -690,6 +717,10 @@ STATIC_CFLAGS
CFLAGS
CC
ERL_TOP
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -860,8 +891,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -902,9 +931,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -928,9 +957,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1141,9 +1170,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1157,9 +1186,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1203,9 +1232,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1221,7 +1250,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1285,7 +1314,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1403,6 +1432,7 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1550,9 +1580,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1580,7 +1610,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1588,7 +1619,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1598,9 +1629,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1617,14 +1648,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1632,14 +1663,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1655,14 +1687,14 @@ fi
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1670,17 +1702,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1701,11 +1734,12 @@ fi
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
@@ -1713,16 +1747,9 @@ else
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ which can conflict with char $2 (); below. */
+#include <limits.h>
#undef $2
/* Override any GCC internal prototype to avoid an error.
@@ -1740,156 +1767,66 @@ choke me
#endif
int
-main ()
+main (void)
{
return $2 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-} # ac_fn_c_check_header_mongrel
+} # ac_fn_c_check_header_compile
# ac_fn_c_try_run LINENO
# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
ac_fn_c_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
@@ -1899,25 +1836,26 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
@@ -1928,37 +1866,6 @@ fi
} # ac_fn_c_try_run
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
@@ -1973,7 +1880,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
@@ -1983,14 +1890,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=0 ac_mid=0
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -2000,9 +1908,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid; break
-else
+else $as_nop
as_fn_arith $ac_mid + 1 && ac_lo=$as_val
if test $ac_lo -le $ac_mid; then
ac_lo= ac_hi=
@@ -2010,14 +1919,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
@@ -2027,14 +1936,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=-1 ac_mid=-1
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
@@ -2044,9 +1954,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=$ac_mid; break
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
if test $ac_mid -le $ac_hi; then
ac_lo= ac_hi=
@@ -2054,14 +1965,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
ac_lo= ac_hi=
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
@@ -2069,7 +1980,7 @@ while test "x$ac_lo" != "x$ac_hi"; do
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -2079,12 +1990,13 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
@@ -2094,12 +2006,12 @@ esac
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.val", "w");
@@ -2127,9 +2039,10 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
+else $as_nop
ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -2141,14 +2054,124 @@ rm -f conftest.val
as_fn_set_status $ac_retval
} # ac_fn_c_compute_int
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } > conftest.i && {
+ test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR
+# ------------------------------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR.
+ac_fn_check_decl ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ as_decl_name=`echo $2|sed 's/ *(.*//'`
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+printf %s "checking whether $as_decl_name is declared... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+ eval ac_save_FLAGS=\$$6
+ as_fn_append $6 " $5"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+int
+main (void)
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+ (void) $as_decl_use;
+#else
+ (void) $as_decl_name;
+#endif
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ eval $6=\$ac_save_FLAGS
+
+fi
+eval ac_res=\$$3
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_check_decl
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -2181,8 +2204,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -2217,7 +2244,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -2252,11 +2279,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -2267,8 +2296,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -2292,7 +2321,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -2300,14 +2329,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -2315,15 +2344,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -2331,8 +2360,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -2346,63 +2375,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -2412,19 +2426,434 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${ERL_TOP}/make/autoconf"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2435,12 +2864,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2449,24 +2878,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2476,11 +2905,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2494,62 +2924,125 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-## Delete previous failed configure results
-if test -f ./CONF_INFO; then
- rm ./CONF_INFO
-fi
-ac_aux_dir=
-for ac_dir in ${ERL_TOP}/erts/autoconf; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in ${ERL_TOP}/erts/autoconf" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2568,21 +3061,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2601,10 +3095,108 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
else
- host_os=win32
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ # Adjust for local legacy windows hack...
+ case $host in #(
+ local-*-windows) :
+
+ host=win32
+ host_os=win32
+ host_vendor=
+ host_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $build in #(
+ local-*-windows) :
+
+ build=win32
+ build_os=win32
+ build_vendor=
+ build_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $target in #(
+ local-*-windows) :
+
+ target=win32
+ target_os=win32
+ target_vendor=
+ target_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+ if test "$cross_compiling" = "yes" -a "$build" = "$host"
+then :
+ as_fn_error $? "
+ Cross compiling with the same canonicalized 'host' value
+ as the canonicalized 'build' value.
+
+ We are cross compiling since the '--host=$host_alias'
+ and the '--build=$build_alias' arguments differ. When
+ cross compiling Erlang/OTP, also the canonicalized values of
+ the '--build' and the '--host' arguments *must* differ. The
+ canonicalized values of these arguments however both equals:
+ $host
+
+ You can check the canonical value by passing a value as
+ argument to the 'make/autoconf/config.sub' script.
+ " "$LINENO" 5
+fi
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2657,6 +3249,11 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+## Delete previous failed configure results
+if test -f ./CONF_INFO; then
+ rm ./CONF_INFO
+fi
+
if test "$cross_compiling" = "yes"; then
CROSS_COMPILING=yes
else
@@ -2675,6 +3272,15 @@ else
fi
+
+
+
+
+
+
+
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2683,11 +3289,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2695,11 +3302,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2710,11 +3321,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2723,11 +3334,12 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2735,11 +3347,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2750,11 +3366,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -2762,8 +3378,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2776,11 +3392,12 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2788,11 +3405,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2803,11 +3424,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2816,11 +3437,12 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2829,15 +3451,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2853,18 +3479,18 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2875,11 +3501,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2887,11 +3514,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2902,11 +3533,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2919,11 +3550,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2931,11 +3563,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2946,11 +3582,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2962,34 +3598,138 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
+else
+ CC="$ac_cv_prog_CC"
fi
fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -2999,7 +3739,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -3007,7 +3747,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3019,9 +3759,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -3042,11 +3782,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
@@ -3063,7 +3804,7 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
@@ -3079,44 +3820,46 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
+else $as_nop
ac_file=''
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -3130,15 +3873,15 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -3147,7 +3890,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
@@ -3159,8 +3902,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -3168,10 +3911,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -3179,39 +3922,40 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3225,11 +3969,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -3238,31 +3983,32 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3272,29 +4018,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
@@ -3303,57 +4053,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
+else $as_nop
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -3368,94 +4121,144 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
-
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
fi
ac_ext=c
@@ -3475,543 +4278,180 @@ MIXED_VSL=no
MIXED_VC=no
MIXED_MINGW=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
-$as_echo_n "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
+printf %s "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" != "xyes"; then
if test -x /usr/bin/msys-?.0.dll; then
CFLAGS="$CFLAGS -O2"
MIXED_MSYS=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
-$as_echo "MSYS and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
+printf "%s\n" "MSYS and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
MIXED_CYGWIN=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
-$as_echo "Cygwin and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
+printf "%s\n" "Cygwin and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /bin/wslpath; then
CFLAGS="$CFLAGS -O2"
MIXED_WSL=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
-$as_echo "WSL and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
+printf "%s\n" "WSL and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not within any known env" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$MIXED_MSYS" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
-$as_echo_n "checking for mixed cygwin and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
+printf %s "checking for mixed cygwin and native MinGW environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" = x"yes"; then
if test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with cygwin" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
-$as_echo_n "checking for mixed MSYS and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
+printf %s "checking for mixed MSYS and native MinGW environment... " >&6; }
if test "x$GCC" = x"yes"; then
if test -x /usr/bin/msys-=.0.dll; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with msys" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
-$as_echo_n "checking if we mix cygwin with any native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
+printf %s "checking if we mix cygwin with any native compiler... " >&6; }
if test "X$MIXED_CYGWIN" = "Xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
-$as_echo_n "checking if we mix msys with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
+printf %s "checking if we mix msys with another native compiler... " >&6; }
if test "X$MIXED_MSYS" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
-$as_echo_n "checking if we mix WSL with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
+printf %s "checking if we mix WSL with another native compiler... " >&6; }
if test "X$MIXED_WSL" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-fi
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
- done
- ac_cv_prog_CPP=$CPP
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
+done
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-fi
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-fi
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
fi
-done
-
-
-
NEED_NPTL_PTHREAD_H=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
-$as_echo_n "checking for native win32 threads... " >&6; }
-if test "X$host_os" = "Xwin32"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
+printf %s "checking for native win32 threads... " >&6; }
+if test "X$host_os" = "Xwin32"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
THR_DEFS="-DWIN32_THREADS"
THR_LIBS=
THR_LIB_NAME=win32_threads
THR_LIB_TYPE=win32_threads
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
THR_DEFS=
THR_LIBS=
THR_LIB_NAME=
THR_LIB_TYPE=posix_unknown
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
-$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+printf %s "checking for pthread_create in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4020,40 +4460,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_pthread_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_pthread_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = xyes
+then :
THR_LIBS="-lpthread"
fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
-$as_echo_n "checking for pthread_create in -lc_r... " >&6; }
-if ${ac_cv_lib_c_r_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
+printf %s "checking for pthread_create in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc_r $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4062,96 +4504,112 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_r_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_c_r_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
-$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
-if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_create" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_create" = xyes
+then :
THR_LIBS="-lc_r"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
-if test "x$ac_cv_func_pthread_create" = xyes; then :
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
+if test "x$ac_cv_func_pthread_create" = xyes
+then :
THR_LIBS="none_needed"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
-$as_echo_n "checking if the '-pthread' switch can be used... " >&6; }
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
+printf %s "checking if the '-pthread' switch can be used... " >&6; }
saved_cflags=$CFLAGS
CFLAGS="$CFLAGS -pthread"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
-main ()
+main (void)
{
pthread_create((void*)0,(void*)0,(void*)0,(void*)0);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
THR_DEFS="-pthread"
THR_LIBS="-pthread"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS=$saved_cflags
if test "x$THR_LIBS" != "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- fi
- if test "x$THR_LIBS" != "x"; then
+fi
+
+ if test "x$THR_LIBS" != "x"
+then :
+
THR_DEFS="$THR_DEFS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS"
THR_LIB_NAME=pthread
if test "x$THR_LIBS" = "xnone_needed"; then
THR_LIBS=
fi
- case $host_os in
- solaris*)
- THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS" ;;
- linux*)
+ case $host_os in #(
+ solaris*) :
+
+ THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS"
+ ;; #(
+ linux*) :
+
THR_DEFS="$THR_DEFS -D_POSIX_THREAD_SAFE_FUNCTIONS"
-if test "$cross_compiling" != "yes"; then
+if test "$cross_compiling" != "yes"
+then :
+
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -4159,11 +4617,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4175,23 +4637,26 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-else
+
+else $as_nop
+
host_getconf="$host_alias-getconf"
# Extract the first word of "$host_getconf", so it can be a program name with args.
set dummy $host_getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -4199,11 +4664,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="$host_getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4215,25 +4684,28 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""; then
+ if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""
+then :
+
GETCONF=
prfx="$erl_xcomp_sysroot"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}getconf", so it can be a program name with args.
set dummy ${ac_tool_prefix}getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_GETCONF="$GETCONF" # Let the user override the test with a path.
@@ -4244,11 +4716,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4260,11 +4736,11 @@ esac
fi
GETCONF=$ac_cv_path_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4273,11 +4749,12 @@ if test -z "$ac_cv_path_GETCONF"; then
ac_pt_GETCONF=$GETCONF
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $ac_pt_GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_GETCONF="$ac_pt_GETCONF" # Let the user override the test with a path.
@@ -4288,11 +4765,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4304,11 +4785,11 @@ esac
fi
ac_pt_GETCONF=$ac_cv_path_ac_pt_GETCONF
if test -n "$ac_pt_GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
-$as_echo "$ac_pt_GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
+printf "%s\n" "$ac_pt_GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_pt_GETCONF" = x; then
@@ -4316,8 +4797,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
GETCONF=$ac_pt_GETCONF
@@ -4326,11 +4807,13 @@ else
GETCONF="$ac_cv_path_GETCONF"
fi
- fi
+
+fi
+
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
-$as_echo_n "checking for Native POSIX Thread Library... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
+printf %s "checking for Native POSIX Thread Library... " >&6; }
libpthr_vsn=`$GETCONF GNU_LIBPTHREAD_VERSION 2>/dev/null`
if test $? -eq 0; then
case "$libpthr_vsn" in
@@ -4346,24 +4829,28 @@ $as_echo_n "checking for Native POSIX Thread Library... " >&6; }
else
nptl=no
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
-$as_echo "$nptl" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
+printf "%s\n" "$nptl" >&6; }
if test $nptl = cross; then
nptl=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
-$as_echo "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
+printf "%s\n" "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
fi
- if test $nptl = yes; then
+ if test $nptl = yes
+then :
+
THR_LIB_TYPE=posix_nptl
need_nptl_incldir=no
- ac_fn_c_check_header_mongrel "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_nptl_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_nptl_pthread_h" = xyes
+then :
need_nptl_incldir=yes
NEED_NPTL_PTHREAD_H=yes
fi
+ if test $need_nptl_incldir = yes
+then :
- if test $need_nptl_incldir = yes; then
# Ahh...
nptl_path="$C_INCLUDE_PATH:$CPATH"
if test X$cross_compiling != Xyes; then
@@ -4384,13 +4871,13 @@ fi
IFS=$save_ifs
nptl_incldir=
for dir in $nptl_ws_path; do
- as_ac_Header=`$as_echo "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ as_ac_Header=`printf "%s\n" "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
nptl_incldir=$dir/nptl
fi
-
if test "x$nptl_incldir" != "x"; then
THR_DEFS="$THR_DEFS -isystem $nptl_incldir"
break
@@ -4399,38 +4886,43 @@ fi
if test "x$nptl_incldir" = "x"; then
as_fn_error $? "Failed to locate nptl system include directory" "$LINENO" 5
fi
- fi
- fi
- ;;
- *) ;;
- esac
+
+fi
+
+fi
+ ;; #(
+ *) :
+ ;;
+esac
saved_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $THR_DEFS"
- ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
-$as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h
fi
-
- ac_fn_c_check_header_mongrel "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes
+then :
\
-$as_echo "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
fi
-
CPPFLAGS=$saved_cppflags
- fi
+
+fi
+
fi
@@ -4474,181 +4966,253 @@ case "$host_cpu" in
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WARN_FLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=return-type $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=implicit $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=implicit $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+else $as_nop
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=undef $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=undef $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
DED_SYS_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host -I${ERL_TOP}/erts/include/internal -I${ERL_TOP}/erts/include/internal/$host -I${ERL_TOP}/erts/emulator/sys/$DED_OSTYPE -I${ERL_TOP}/erts/emulator/sys/common"
DED_INCLUDE=$DED_SYS_INCLUDE
DED_CFLAGS="$CFLAGS $CPPFLAGS $DED_CFLAGS"
-if test "x$GCC" = xyes; then
+if test "x$GCC" = xyes
+then :
+
# Use -fno-common for gcc, that is link error if multiple definitions of
# global variables are encountered. This is ISO C compliant.
# Until version 10, gcc has had -fcommon as default, which allows and merges
# such dubious duplicates.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-fno-common $DED_CFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_CFLAGS="-fno-common $DED_CFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-strict-aliasing to DED_CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-strict-aliasing to DED_CFLAGS (via CFLAGS)... " >&6; }
+ saved_CFLAGS=$CFLAGS;
+ CFLAGS="-fno-strict-aliasing $DED_CFLAGS";
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ can_enable_flag=true
+else $as_nop
+ can_enable_flag=false
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS=$saved_CFLAGS;
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ DED_CFLAGS="-fno-strict-aliasing $DED_CFLAGS"
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
DED_STATIC_CFLAGS="$DED_CFLAGS"
DED_CFLAGS="$DED_CFLAGS -fPIC"
# Remove -fPIE and -fno-PIE
DED_CFLAGS=`echo $DED_CFLAGS | sed 's/-f\(no-\)\?PIE//g'`
+
fi
DED_EXT=so
@@ -4735,17 +5299,19 @@ case $host_os in
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -4754,14 +5320,12 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
case "$ac_cv_sizeof_void_p" in
@@ -4828,11 +5392,12 @@ test "$DED_LDFLAGS_CONFTEST" != "" || DED_LDFLAGS_CONFTEST="$DED_LDFLAGS"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DED_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DED_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DED_LD"; then
ac_cv_prog_DED_LD="$DED_LD" # Let the user override the test.
else
@@ -4840,11 +5405,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DED_LD="${ac_tool_prefix}ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4855,11 +5424,11 @@ fi
fi
DED_LD=$ac_cv_prog_DED_LD
if test -n "$DED_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
-$as_echo "$DED_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
+printf "%s\n" "$DED_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4868,11 +5437,12 @@ if test -z "$ac_cv_prog_DED_LD"; then
ac_ct_DED_LD=$DED_LD
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DED_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DED_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_DED_LD"; then
ac_cv_prog_ac_ct_DED_LD="$ac_ct_DED_LD" # Let the user override the test.
else
@@ -4880,11 +5450,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DED_LD="ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4895,11 +5469,11 @@ fi
fi
ac_ct_DED_LD=$ac_cv_prog_ac_ct_DED_LD
if test -n "$ac_ct_DED_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DED_LD" >&5
-$as_echo "$ac_ct_DED_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DED_LD" >&5
+printf "%s\n" "$ac_ct_DED_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_DED_LD" = x; then
@@ -4907,8 +5481,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DED_LD=$ac_ct_DED_LD
@@ -4919,37 +5493,37 @@ fi
test "$DED_LD" != "false" || as_fn_error $? "No linker found" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for static compiler flags" >&5
-$as_echo_n "checking for static compiler flags... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for static compiler flags" >&5
+printf %s "checking for static compiler flags... " >&6; }
DED_STATIC_CFLAGS="$DED_WERRORFLAGS $DED_WFLAGS $DED_THR_DEFS $DED_STATIC_CFLAGS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_STATIC_CFLAGS" >&5
-$as_echo "$DED_STATIC_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for basic compiler flags for loadable drivers" >&5
-$as_echo_n "checking for basic compiler flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_STATIC_CFLAGS" >&5
+printf "%s\n" "$DED_STATIC_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for basic compiler flags for loadable drivers" >&5
+printf %s "checking for basic compiler flags for loadable drivers... " >&6; }
DED_BASIC_CFLAGS=$DED_CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
-$as_echo "$DED_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler flags for loadable drivers" >&5
-$as_echo_n "checking for compiler flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
+printf "%s\n" "$DED_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler flags for loadable drivers" >&5
+printf %s "checking for compiler flags for loadable drivers... " >&6; }
DED_CFLAGS="$DED_WERRORFLAGS $DED_WARN_FLAGS $DED_THR_DEFS $DED_CFLAGS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
-$as_echo "$DED_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker for loadable drivers" >&5
-$as_echo_n "checking for linker for loadable drivers... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
-$as_echo "$DED_LD" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable drivers" >&5
-$as_echo_n "checking for linker flags for loadable drivers... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LDFLAGS" >&5
-$as_echo "$DED_LDFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'runtime library path' linker flag" >&5
-$as_echo_n "checking for 'runtime library path' linker flag... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
+printf "%s\n" "$DED_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker for loadable drivers" >&5
+printf %s "checking for linker for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
+printf "%s\n" "$DED_LD" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable drivers" >&5
+printf %s "checking for linker flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LDFLAGS" >&5
+printf "%s\n" "$DED_LDFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 'runtime library path' linker flag" >&5
+printf %s "checking for 'runtime library path' linker flag... " >&6; }
if test "x$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" != "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&5
-$as_echo "$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&5
+printf "%s\n" "$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+printf "%s\n" "not found" >&6; }
fi
@@ -4972,8 +5546,8 @@ fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for multiarch directory" >&5
-$as_echo_n "checking for multiarch directory... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for multiarch directory" >&5
+printf %s "checking for multiarch directory... " >&6; }
multiarch_dir=
if test "$GCC" = "yes"; then
multiarch_dir=`$CC $CFLAGS -print-multiarch 2>/dev/null`
@@ -4982,11 +5556,11 @@ if test "$GCC" = "yes"; then
fi
fi
if test "$multiarch_dir" = ""; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+printf "%s\n" "not found" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $multiarch_dir" >&5
-$as_echo "$multiarch_dir" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $multiarch_dir" >&5
+printf "%s\n" "$multiarch_dir" >&6; }
fi
@@ -4994,17 +5568,19 @@ fi
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -5013,29 +5589,43 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
-std_ssl_locations="/usr/local /usr/sfw /usr /opt/local /usr/pkg /usr/local/openssl /usr/local/opt/openssl /usr/lib/openssl /usr/openssl /usr/local/ssl /usr/lib/ssl /usr/ssl /"
+std_ssl_locations="\
+/usr/local \
+/usr/sfw \
+/usr \
+/opt/local \
+/usr/pkg \
+/usr/local/openssl \
+/usr/local/opt/openssl \
+/opt/homebrew/opt/openssl \
+/usr/lib/openssl \
+/usr/openssl \
+/usr/local/ssl \
+/usr/lib/ssl \
+/usr/ssl \
+/"
# Check whether --with-ssl was given.
-if test "${with_ssl+set}" = set; then :
+if test ${with_ssl+y}
+then :
withval=$with_ssl;
fi
# Check whether --with-ssl-lib-subdir was given.
-if test "${with_ssl_lib_subdir+set}" = set; then :
+if test ${with_ssl_lib_subdir+y}
+then :
withval=$with_ssl_lib_subdir;
case "$with_ssl_lib_subdir" in
yes|no)
@@ -5045,100 +5635,107 @@ case "$with_ssl_lib_subdir" in
;;
esac
-else
+else $as_nop
with_ssl_lib_subdir=
fi
#default
# Check whether --with-ssl-incl was given.
-if test "${with_ssl_incl+set}" = set; then :
+if test ${with_ssl_incl+y}
+then :
withval=$with_ssl_incl;
case X$with_ssl in
X | Xyes | Xno) as_fn_error $? "--with-ssl-incl=PATH set without --with-ssl=PATH" "$LINENO" 5;;
esac
-else
+else $as_nop
with_ssl_incl=$with_ssl
fi
#default
# Check whether --with-ssl-zlib was given.
-if test "${with_ssl_zlib+set}" = set; then :
+if test ${with_ssl_zlib+y}
+then :
withval=$with_ssl_zlib;
-else
+else $as_nop
with_ssl_zlib=default
fi
#default
# Check whether --with-ssl-rpath was given.
-if test "${with_ssl_rpath+set}" = set; then :
+if test ${with_ssl_rpath+y}
+then :
withval=$with_ssl_rpath;
case X$with_ssl in
Xno) as_fn_error $? "--with-ssl-rpath set without --with-ssl" "$LINENO" 5;;
esac
-else
+else $as_nop
with_ssl_rpath=default
fi
#default
# Check whether --enable-dynamic-ssl-lib was given.
-if test "${enable_dynamic_ssl_lib+set}" = set; then :
+if test ${enable_dynamic_ssl_lib+y}
+then :
enableval=$enable_dynamic_ssl_lib; case "$enableval" in
no) enable_dynamic_ssl=no ;;
*) enable_dynamic_ssl=yes ;;
esac
-else
+else $as_nop
enable_dynamic_ssl=undefined
fi
# Check whether --enable-evp-dh was given.
-if test "${enable_evp_dh+set}" = set; then :
+if test ${enable_evp_dh+y}
+then :
enableval=$enable_evp_dh; case "$enableval" in
no) DISABLE_EVP_DH=1;;
*) DISABLE_EVP_DH=0;;
esac
-else
+else $as_nop
DISABLE_EVP_DH=0
fi
# Check whether --enable-evp-hmac was given.
-if test "${enable_evp_hmac+set}" = set; then :
+if test ${enable_evp_hmac+y}
+then :
enableval=$enable_evp_hmac; case "$enableval" in
no) DISABLE_EVP_HMAC=1;;
*) DISABLE_EVP_HMAC=0;;
esac
-else
+else $as_nop
DISABLE_EVP_HMAC=0
fi
-
# Check whether --enable-otp-test-engine was given.
-if test "${enable_otp_test_engine+set}" = set; then :
+if test ${enable_otp_test_engine+y}
+then :
enableval=$enable_otp_test_engine; case "$enableval" in
no) DISABLE_OTP_TEST_ENGINE=yes;;
*) DISABLE_OTP_TEST_ENGINE=no;;
esac
-else
+else $as_nop
DISABLE_OTP_TEST_ENGINE=default
fi
# Check whether --enable-deprecated_warnings was given.
-if test "${enable_deprecated_warnings+set}" = set; then :
+if test ${enable_deprecated_warnings+y}
+then :
enableval=$enable_deprecated_warnings; case "$enableval" in
no) deprecated_warnings=no;;
*) deprecated_warnings=yes;;
esac
-else
+else $as_nop
deprecated_warnings=default_yes
fi
@@ -5170,8 +5767,8 @@ case "$with_ssl_zlib" in
no)
;;
default | yes)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for static zlib" >&5
-$as_echo_n "checking for static zlib... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for static zlib" >&5
+printf %s "checking for static zlib... " >&6; }
for dir in $std_ssl_locations; do
for sdir in $search_subdirs; do
if test -f "$erl_xcomp_sysroot$dir/$sdir/libz.a"; then
@@ -5181,8 +5778,8 @@ $as_echo_n "checking for static zlib... " >&6; }
done
test "$static_zlib" = "no" || break
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $static_zlib" >&5
-$as_echo "$static_zlib" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $static_zlib" >&5
+printf "%s\n" "$static_zlib" >&6; }
if test $with_ssl_zlib = yes; then
if test $static_zlib = no; then
as_fn_error $? "linking with zlib requested by user, but no such library was found" "$LINENO" 5
@@ -5191,8 +5788,8 @@ $as_echo "$static_zlib" >&6; }
static_zlib=no
fi;;
*) # PATH
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for static zlib" >&5
-$as_echo_n "checking for static zlib... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for static zlib" >&5
+printf %s "checking for static zlib... " >&6; }
if test -f "$with_ssl_zlib/libz.a"; then
forced_static_zlib="$with_ssl_zlib/libz.a"
else
@@ -5206,8 +5803,8 @@ $as_echo_n "checking for static zlib... " >&6; }
if test "$forced_static_zlib" = ""; then
as_fn_error $? "linking with zlib requested by user, but no such library was found in $with_ssl_zlib" "$LINENO" 5
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $forced_static_zlib" >&5
-$as_echo "$forced_static_zlib" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $forced_static_zlib" >&5
+printf "%s\n" "$forced_static_zlib" >&6; }
;;
esac
@@ -5226,43 +5823,332 @@ case $enable_dynamic_ssl in
SSL_DYNAMIC_ONLY=no;;
esac
-case "$erl_xcomp_without_sysroot-$with_ssl" in
- yes-* | no-no)
- SSL_APP=
- CRYPTO_APP=
- SSH_APP=
- if test "$with_ssl" != "no"; then
- skip="Cannot search for ssl; missing cross system root (erl_xcomp_sysroot)."
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <limits.h>
+ Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+
+else $as_nop
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether nonexistent headers
+ # can be detected and how.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"
+then :
+ # Broken: success on invalid input.
+continue
+else $as_nop
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok
+then :
+
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
fi
- for a in ssl crypto ssh; do
- echo "$skip" > $ERL_TOP/lib/$a/SKIP
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
done
- ;;
- no-yes | no- )
- # We search for OpenSSL in the common OS standard locations.
- SSL_APP=ssl
- CRYPTO_APP=crypto
- SSH_APP=ssh
-
- if test "$host_os" = "win32" ; then
- if test "x$ac_cv_sizeof_void_p" = "x8"; then
- std_win_ssl_locations="/mnt/c/OpenSSL-Win64 /c/OpenSSL-Win64 /mnt/c/opt/local64/pgm/OpenSSL /opt/local64/pgm/OpenSSL /cygdrive/c/OpenSSL-Win64"
- lib_bits=64
- else
- std_win_ssl_locations="/mnt/c/OpenSSL-Win32 /c/OpenSSL-Win32 /mnt/c/OpenSSL /c/OpenSSL /cygdrive/c/OpenSSL /opt/local/pgm/OpenSSL /opt/local32/pgm/OpenSSL /mnt/c/opt/local/pgm/OpenSSL /mnt/c/opt/local32/pgm/OpenSSL /cygdrive/c/OpenSSL-Win32"
- lib_bits=32
- fi
- else
- std_win_ssl_locations=""
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+case "$erl_xcomp_without_sysroot-$with_ssl" in #(
+ yes-* | no-no) :
+
+ SSL_APP=
+ CRYPTO_APP=
+ SSH_APP=
+ if test "$with_ssl" != "no"; then
+ skip="Cannot search for ssl; missing cross system root (erl_xcomp_sysroot)."
+ fi
+ for a in ssl crypto ssh; do
+ echo "$skip" > $ERL_TOP/lib/$a/SKIP
+ done
+ ;; #(
+ no-yes | no-) :
+
+ # We search for OpenSSL in the common OS standard locations.
+ SSL_APP=ssl
+ CRYPTO_APP=crypto
+ SSH_APP=ssh
+
+ if test "$host_os" != "win32"
+then :
+
+ std_win_ssl_locations=
- usable_crypto=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL crypto library with version >= 0.9.8c in standard locations" >&5
-$as_echo_n "checking for OpenSSL crypto library with version >= 0.9.8c in standard locations... " >&6; }
- for rdir in $std_win_ssl_locations $std_ssl_locations; do
- if test -f "$erl_xcomp_isysroot$rdir/include/openssl/opensslv.h"; then
- SSL_INCDIR="$erl_xcomp_isysroot$rdir"
- SSL_INCLUDE="-I$SSL_INCDIR/include"
+else $as_nop
+
+ if test "x$ac_cv_sizeof_void_p" = "x8"
+then :
+
+ std_win_ssl_locations="/mnt/c/OpenSSL-Win64 /c/OpenSSL-Win64 /mnt/c/opt/local64/pgm/OpenSSL /opt/local64/pgm/OpenSSL /cygdrive/c/OpenSSL-Win64"
+ lib_bits=64
+
+else $as_nop
+
+ std_win_ssl_locations="/mnt/c/OpenSSL-Win32 /c/OpenSSL-Win32 /mnt/c/OpenSSL /c/OpenSSL /cygdrive/c/OpenSSL /opt/local/pgm/OpenSSL /opt/local32/pgm/OpenSSL /mnt/c/opt/local/pgm/OpenSSL /mnt/c/opt/local32/pgm/OpenSSL /cygdrive/c/OpenSSL-Win32"
+ lib_bits=32
+
+fi
+
+fi
+
+ usable_crypto=no
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL crypto library with version >= 0.9.8c in standard locations" >&5
+printf %s "checking for OpenSSL crypto library with version >= 0.9.8c in standard locations... " >&6; }
+ for rdir in $std_win_ssl_locations $std_ssl_locations; do
+ if test -f "$erl_xcomp_isysroot$rdir/include/openssl/opensslv.h"
+then :
+
+ SSL_INCDIR="$erl_xcomp_isysroot$rdir"
+ SSL_INCLUDE="-I$SSL_INCDIR/include"
# Check for static and dynamic crypto library in the directory
# given as argument...
@@ -5296,12 +6182,13 @@ yes
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "^yes.?$" >/dev/null 2>&1; then :
+ $EGREP "^yes.?$" >/dev/null 2>&1
+then :
valid_include=yes
-else
+else $as_nop
valid_include=no
fi
-rm -f conftest*
+rm -rf conftest*
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5313,15 +6200,17 @@ yes
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "^yes.?$" >/dev/null 2>&1; then :
+ $EGREP "^yes.?$" >/dev/null 2>&1
+then :
v3_include=yes
-else
+else $as_nop
v3_include=no
fi
-rm -f conftest*
+rm -rf conftest*
+
-if test "x$DISABLE_OTP_TEST_ENGINE" = "xdefault"; then
+ if test "x$DISABLE_OTP_TEST_ENGINE" = "xdefault"; then
# Get default value for the --disable-otp-test-engine. Depends on cryptolib version
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5333,74 +6222,105 @@ yes
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "^yes.?$" >/dev/null 2>&1; then :
+ $EGREP "^yes.?$" >/dev/null 2>&1
+then :
DISABLE_OTP_TEST_ENGINE=yes
-else
+else $as_nop
DISABLE_OTP_TEST_ENGINE=no
fi
-rm -f conftest*
+rm -rf conftest*
fi
CPPFLAGS="$save_CPPFLAGS"
- if test $valid_include != yes; then
- static_crypto_lib_name=
- static_ssl_lib_name=
- static_extra_libs=
- static_lib_dir=
- dynamic_crypto_lib_name=
- dynamic_ssl_lib_name=
- dynamic_extra_libs=
- dynamic_lib_dir=
- dynamic_runtime_lib_dir=
- elif test "$host_os" = "win32" ; then
- if test -f "$dir/lib/VC/static/libcrypto${lib_bits}MD.lib"; then
- static_crypto_lib_name=libcrypto${lib_bits}MD
- static_ssl_lib_name="libssl${lib_bits}MD"
- static_extra_libs="$static_extra_libs -lCRYPT32 -lWS2_32"
- static_lib_dir="$dir/lib/VC/static"
- found_static_lib=yes
- fi
- if test -f "$dir/lib/VC/libcrypto${lib_bits}MD.lib"; then
- dynamic_crypto_lib_name=libcrypto${lib_bits}MD
- dynamic_ssl_lib_name="libssl${lib_bits}MD"
- dynamic_runtime_lib_dir="$rdir/lib/VC"
- dynamic_lib_dir="$dir/lib/VC"
- found_dynamic_lib=yes
- fi
- else # Non windows...
-
- case "$host_os" in
- darwin*)
- static_ext=.a
- dynamic_ext=.dylib;;
- *)
- static_ext=.a
- dynamic_ext=.so;;
- esac
- for sdir in $search_subdirs; do
- if test -f "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"; then
- found_dynlib=yes
- else
- found_dynlib=no
- case $host_os in
- openbsd*)
- # libcrypto.so got a suffix on (at least some) openbsd.
- # If we find libcrypto.so with suffix, we try to link
- # to it using -lcrypto ...
- for f in "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"*; do
- test -f "$f" && found_dynlib=yes
- break
- done;;
- *)
- ;;
- esac
- fi
- if test $found_dynlib = yes; then
- # Found dynamic library; check if it links...
- dynamic_lib_dir="$dir/$sdir"
- dynamic_runtime_lib_dir="$rdir/$sdir"
+ if test $valid_include != yes
+then :
+
+ # Not a valid include...
+ static_crypto_lib_name=
+ static_ssl_lib_name=
+ static_extra_libs=
+ static_lib_dir=
+ dynamic_crypto_lib_name=
+ dynamic_ssl_lib_name=
+ dynamic_extra_libs=
+ dynamic_lib_dir=
+ dynamic_runtime_lib_dir=
+
+elif test "$host_os" = "win32"
+then :
+
+ # Windows...
+ if test -f "$dir/lib/VC/static/libcrypto${lib_bits}MD.lib"
+then :
+
+ static_crypto_lib_name=libcrypto${lib_bits}MD
+ static_ssl_lib_name="libssl${lib_bits}MD"
+ static_extra_libs="$static_extra_libs -lCRYPT32 -lWS2_32"
+ static_lib_dir="$dir/lib/VC/static"
+ found_static_lib=yes
+
+fi
+ if test -f "$dir/lib/VC/libcrypto${lib_bits}MD.lib"
+then :
+
+ dynamic_crypto_lib_name=libcrypto${lib_bits}MD
+ dynamic_ssl_lib_name="libssl${lib_bits}MD"
+ dynamic_runtime_lib_dir="$rdir/lib/VC"
+ dynamic_lib_dir="$dir/lib/VC"
+ found_dynamic_lib=yes
+
+fi
+
+else $as_nop
+
+ # Not windows...
+ case "$host_os" in #(
+ darwin*) :
+
+ static_ext=.a
+ dynamic_ext=.dylib
+ ;; #(
+ *) :
+
+ static_ext=.a
+ dynamic_ext=.so
+ ;;
+esac
+ for sdir in $search_subdirs; do
+ if test -f "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"
+then :
+
+ found_dynlib=yes
+
+else $as_nop
+
+ found_dynlib=no
+ case $host_os in #(
+ openbsd*) :
+
+ # libcrypto.so got a suffix on (at least some) openbsd.
+ # If we find libcrypto.so with suffix, we try to link
+ # to it using -lcrypto ...
+ for f in "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"*; do
+ if test -f "$f"
+then :
+ found_dynlib=yes; break
+fi
+ done
+ ;; #(
+ *) :
+ ;;
+esac
+
+fi
+ if test $found_dynlib = yes
+then :
+
+ # Found dynamic library; check if it links...
+ dynamic_lib_dir="$dir/$sdir"
+ dynamic_runtime_lib_dir="$rdir/$sdir"
test_cflags="-I$idir/include"
test_ldflags="-L$dynamic_lib_dir"
@@ -5420,7 +6340,7 @@ rm -f conftest*
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5429,25 +6349,28 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_dynamic_lib=yes
-else
+else $as_nop
found_dynamic_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- if test $found_dynamic_lib = no -a $static_zlib != no; then
- # No, but linking with zlib as well might help...
- dynamic_extra_libs="$dynamic_extra_libs $static_zlib"
+ if test $found_dynamic_lib = no -a $static_zlib != no
+then :
+
+ # No, but linking with zlib as well might help...
+ dynamic_extra_libs="$dynamic_extra_libs $static_zlib"
test_cflags="-I$idir/include"
test_ldflags="-L$dynamic_lib_dir"
@@ -5467,7 +6390,7 @@ rm -f core conftest.err conftest.$ac_objext \
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5476,27 +6399,32 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_dynamic_lib=yes
-else
+else $as_nop
found_dynamic_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- fi
- fi
- if test -f "$dir/$sdir/lib$static_crypto_lib_name$static_ext"; then
- # Found static library; check if it links...
- static_lib_dir="$dir/$sdir"
+
+fi
+
+fi
+ if test -f "$dir/$sdir/lib$static_crypto_lib_name$static_ext"
+then :
+
+ # Found static library; check if it links...
+ static_lib_dir="$dir/$sdir"
test_cflags="-I$idir/include"
test_ldflags=
@@ -5516,7 +6444,7 @@ rm -f core conftest.err conftest.$ac_objext \
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5525,25 +6453,28 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_static_lib=yes
-else
+else $as_nop
found_static_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- if test $found_static_lib = no -a $static_zlib != no; then
- # No, but inking with zlib as well might help...
- static_extra_libs="$static_extra_libs $static_zlib"
+ if test $found_static_lib = no -a $static_zlib != no
+then :
+
+ # No, but inking with zlib as well might help...
+ static_extra_libs="$static_extra_libs $static_zlib"
test_cflags="-I$idir/include"
test_ldflags=
@@ -5563,7 +6494,7 @@ rm -f core conftest.err conftest.$ac_objext \
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5572,124 +6503,156 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_static_lib=yes
-else
+else $as_nop
found_static_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- fi
- fi
- if test $found_static_lib = yes -o $found_dynamic_lib = yes; then
- break
- fi
- done
- fi
- case $enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib in
- no-*-no)
- ;; # Dynamic linking against ssl library disabled by user, and no static library found
- yes-no-*)
- ;; # Static linking against ssl library disabled by user, and no dynamic library found
- *-no-no)
- ;; # Neither static nor dynamic ssl library found
- no-*-yes | default_no-*-yes | default_yes-no-yes)
- # Link statically...
- SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
- SSL_SSL_LIBNAME=$static_ssl_lib_name
- SSL_LIBDIR="$static_lib_dir"
- SSL_EXTRA_LIBS="$static_extra_libs"
- SSL_RUNTIME_LIBDIR=
- SSL_DYNAMIC_ONLY=no
- usable_crypto=yes
- break;;
- *-yes-*)
- # Link dynamically...
- SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
- SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
- SSL_EXTRA_LIBS="$dynamic_extra_libs"
- SSL_LIBDIR="$dynamic_lib_dir"
- SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
- SSL_DYNAMIC_ONLY=yes
- usable_crypto=yes
- break;;
- esac
- fi
- done
+fi
- if test $usable_crypto = yes ; then
- if test $SSL_DYNAMIC_ONLY = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
-$as_echo "dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
-$as_echo "static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
- fi
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- SSL_APP=
- CRYPTO_APP=
- SSH_APP=
-
- SSL_INCDIR=
- SSL_INCLUDE=
- SSL_CRYPTO_LIBNAME=
- SSL_SSL_LIBNAME=
- SSL_INCDIR=
- SSL_RUNTIME_LIBDIR=
- SSL_LIBDIR=
-
- case "$with_ssl-$enable_dynamic_ssl" in
- yes-yes)
- as_fn_error $? "crypto library with dynamic linking requested by user, but no such library was found" "$LINENO" 5
- ;;
- yes-no)
- as_fn_error $? "crypto library with static linking requested by user, but no such library was found" "$LINENO" 5
- ;;
- yes-*)
- as_fn_error $? "crypto library requested by user, but no such library was found" "$LINENO" 5
- ;;
- *)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No (usable) OpenSSL found, skipping ssl, ssh and crypto applications" >&5
-$as_echo "$as_me: WARNING: No (usable) OpenSSL found, skipping ssl, ssh and crypto applications" >&2;}
- ;;
- esac
+fi
+ if test $found_static_lib = yes -o $found_dynamic_lib = yes
+then :
+ break
+fi
+ done
+
+fi
+
+ case $enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib in #(
+ no-*-no) :
+
+ # Dynamic linking against ssl library disabled by user,
+ # and no static library found...
+ ;; #(
+ yes-no-*) :
+
+ # Static linking against ssl library disabled by user,
+ # and no dynamic library found...
+ ;; #(
+ *-no-no) :
+
+ # Neither static nor dynamic ssl library found...
+ ;; #(
+ no-*-yes | default_no-*-yes | default_yes-no-yes) :
+
+ # Link statically...
+ SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
+ SSL_SSL_LIBNAME=$static_ssl_lib_name
+ SSL_LIBDIR="$static_lib_dir"
+ SSL_EXTRA_LIBS="$static_extra_libs"
+ SSL_RUNTIME_LIBDIR=
+ SSL_DYNAMIC_ONLY=no
+ usable_crypto=yes
+ break
+ ;; #(
+ *-yes-*) :
+
+ # Link dynamically...
+ SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
+ SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
+ SSL_EXTRA_LIBS="$dynamic_extra_libs"
+ SSL_LIBDIR="$dynamic_lib_dir"
+ SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
+ SSL_DYNAMIC_ONLY=yes
+ usable_crypto=yes
+ break
+ ;; #(
+ *) :
+ ;;
+esac
- for a in ssl crypto ssh; do
- echo "No usable OpenSSL found" > $ERL_TOP/lib/$a/SKIP
- done
- fi
- ;;
- *)
- # Option given with PATH to package
- if test ! -d "$with_ssl" ; then
- as_fn_error $? "Invalid path to option --with-ssl=PATH" "$LINENO" 5
- fi
- if test ! -d "$with_ssl_incl" ; then
- as_fn_error $? "Invalid path to option --with-ssl-incl=PATH" "$LINENO" 5
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL header in $with_ssl_incl" >&5
-$as_echo_n "checking for OpenSSL header in $with_ssl_incl... " >&6; }
- if test -f "$with_ssl_incl/include/openssl/opensslv.h"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- else
- as_fn_error $? "no OpenSSL header found in $with_ssl_incl" "$LINENO" 5
- fi
- SSL_INCDIR="$with_ssl_incl"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OpenSSL in $with_ssl" >&5
-$as_echo_n "checking for OpenSSL in $with_ssl... " >&6; }
+fi
+ done
+
+ if test $usable_crypto = yes
+then :
+ if test $SSL_DYNAMIC_ONLY = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
+printf "%s\n" "dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
+printf "%s\n" "static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
+fi
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ SSL_APP=
+ CRYPTO_APP=
+ SSH_APP=
+
+ SSL_INCDIR=
+ SSL_INCLUDE=
+ SSL_CRYPTO_LIBNAME=
+ SSL_SSL_LIBNAME=
+ SSL_INCDIR=
+ SSL_RUNTIME_LIBDIR=
+ SSL_LIBDIR=
+
+ case "$with_ssl-$enable_dynamic_ssl" in #(
+ yes-yes) :
+
+ as_fn_error $? "crypto library with dynamic linking requested by user, but no such library was found" "$LINENO" 5
+ ;; #(
+ yes-no) :
+
+ as_fn_error $? "crypto library with static linking requested by user, but no such library was found" "$LINENO" 5
+ ;; #(
+ yes-*) :
+
+ as_fn_error $? "crypto library requested by user, but no such library was found" "$LINENO" 5
+ ;; #(
+ *) :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: No (usable) OpenSSL found, skipping ssl, ssh and crypto applications" >&5
+printf "%s\n" "$as_me: WARNING: No (usable) OpenSSL found, skipping ssl, ssh and crypto applications" >&2;}
+ ;;
+esac
+
+ for a in ssl crypto ssh; do
+ echo "No usable OpenSSL found" > $ERL_TOP/lib/$a/SKIP
+ done
+
+fi
+ ;; #(
+ *) :
+
+ # Option given with PATH to package
+ if test ! -d "$with_ssl"
+then :
+ as_fn_error $? "Invalid path to option --with-ssl=PATH" "$LINENO" 5
+fi
+ if test ! -d "$with_ssl_incl"
+then :
+ as_fn_error $? "Invalid path to option --with-ssl-incl=PATH" "$LINENO" 5
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL header in $with_ssl_incl" >&5
+printf %s "checking for OpenSSL header in $with_ssl_incl... " >&6; }
+ if test -f "$with_ssl_incl/include/openssl/opensslv.h"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+else $as_nop
+ as_fn_error $? "no OpenSSL header found in $with_ssl_incl" "$LINENO" 5
+fi
+ SSL_INCDIR="$with_ssl_incl"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for OpenSSL in $with_ssl" >&5
+printf %s "checking for OpenSSL in $with_ssl... " >&6; }
# Check for static and dynamic crypto library in the directory
# given as argument...
@@ -5723,12 +6686,13 @@ yes
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "^yes.?$" >/dev/null 2>&1; then :
+ $EGREP "^yes.?$" >/dev/null 2>&1
+then :
valid_include=yes
-else
+else $as_nop
valid_include=no
fi
-rm -f conftest*
+rm -rf conftest*
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5740,15 +6704,17 @@ yes
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "^yes.?$" >/dev/null 2>&1; then :
+ $EGREP "^yes.?$" >/dev/null 2>&1
+then :
v3_include=yes
-else
+else $as_nop
v3_include=no
fi
-rm -f conftest*
+rm -rf conftest*
+
-if test "x$DISABLE_OTP_TEST_ENGINE" = "xdefault"; then
+ if test "x$DISABLE_OTP_TEST_ENGINE" = "xdefault"; then
# Get default value for the --disable-otp-test-engine. Depends on cryptolib version
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5760,74 +6726,105 @@ yes
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "^yes.?$" >/dev/null 2>&1; then :
+ $EGREP "^yes.?$" >/dev/null 2>&1
+then :
DISABLE_OTP_TEST_ENGINE=yes
-else
+else $as_nop
DISABLE_OTP_TEST_ENGINE=no
fi
-rm -f conftest*
+rm -rf conftest*
fi
CPPFLAGS="$save_CPPFLAGS"
- if test $valid_include != yes; then
- static_crypto_lib_name=
- static_ssl_lib_name=
- static_extra_libs=
- static_lib_dir=
- dynamic_crypto_lib_name=
- dynamic_ssl_lib_name=
- dynamic_extra_libs=
- dynamic_lib_dir=
- dynamic_runtime_lib_dir=
- elif test "$host_os" = "win32" ; then
- if test -f "$dir/lib/VC/static/libcrypto${lib_bits}MD.lib"; then
- static_crypto_lib_name=libcrypto${lib_bits}MD
- static_ssl_lib_name="libssl${lib_bits}MD"
- static_extra_libs="$static_extra_libs -lCRYPT32 -lWS2_32"
- static_lib_dir="$dir/lib/VC/static"
- found_static_lib=yes
- fi
- if test -f "$dir/lib/VC/libcrypto${lib_bits}MD.lib"; then
- dynamic_crypto_lib_name=libcrypto${lib_bits}MD
- dynamic_ssl_lib_name="libssl${lib_bits}MD"
- dynamic_runtime_lib_dir="$rdir/lib/VC"
- dynamic_lib_dir="$dir/lib/VC"
- found_dynamic_lib=yes
- fi
- else # Non windows...
-
- case "$host_os" in
- darwin*)
- static_ext=.a
- dynamic_ext=.dylib;;
- *)
- static_ext=.a
- dynamic_ext=.so;;
- esac
- for sdir in $search_subdirs; do
- if test -f "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"; then
- found_dynlib=yes
- else
- found_dynlib=no
- case $host_os in
- openbsd*)
- # libcrypto.so got a suffix on (at least some) openbsd.
- # If we find libcrypto.so with suffix, we try to link
- # to it using -lcrypto ...
- for f in "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"*; do
- test -f "$f" && found_dynlib=yes
- break
- done;;
- *)
- ;;
- esac
- fi
- if test $found_dynlib = yes; then
- # Found dynamic library; check if it links...
- dynamic_lib_dir="$dir/$sdir"
- dynamic_runtime_lib_dir="$rdir/$sdir"
+ if test $valid_include != yes
+then :
+
+ # Not a valid include...
+ static_crypto_lib_name=
+ static_ssl_lib_name=
+ static_extra_libs=
+ static_lib_dir=
+ dynamic_crypto_lib_name=
+ dynamic_ssl_lib_name=
+ dynamic_extra_libs=
+ dynamic_lib_dir=
+ dynamic_runtime_lib_dir=
+
+elif test "$host_os" = "win32"
+then :
+
+ # Windows...
+ if test -f "$dir/lib/VC/static/libcrypto${lib_bits}MD.lib"
+then :
+
+ static_crypto_lib_name=libcrypto${lib_bits}MD
+ static_ssl_lib_name="libssl${lib_bits}MD"
+ static_extra_libs="$static_extra_libs -lCRYPT32 -lWS2_32"
+ static_lib_dir="$dir/lib/VC/static"
+ found_static_lib=yes
+
+fi
+ if test -f "$dir/lib/VC/libcrypto${lib_bits}MD.lib"
+then :
+
+ dynamic_crypto_lib_name=libcrypto${lib_bits}MD
+ dynamic_ssl_lib_name="libssl${lib_bits}MD"
+ dynamic_runtime_lib_dir="$rdir/lib/VC"
+ dynamic_lib_dir="$dir/lib/VC"
+ found_dynamic_lib=yes
+
+fi
+
+else $as_nop
+
+ # Not windows...
+ case "$host_os" in #(
+ darwin*) :
+
+ static_ext=.a
+ dynamic_ext=.dylib
+ ;; #(
+ *) :
+
+ static_ext=.a
+ dynamic_ext=.so
+ ;;
+esac
+ for sdir in $search_subdirs; do
+ if test -f "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"
+then :
+
+ found_dynlib=yes
+
+else $as_nop
+
+ found_dynlib=no
+ case $host_os in #(
+ openbsd*) :
+
+ # libcrypto.so got a suffix on (at least some) openbsd.
+ # If we find libcrypto.so with suffix, we try to link
+ # to it using -lcrypto ...
+ for f in "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"*; do
+ if test -f "$f"
+then :
+ found_dynlib=yes; break
+fi
+ done
+ ;; #(
+ *) :
+ ;;
+esac
+
+fi
+ if test $found_dynlib = yes
+then :
+
+ # Found dynamic library; check if it links...
+ dynamic_lib_dir="$dir/$sdir"
+ dynamic_runtime_lib_dir="$rdir/$sdir"
test_cflags="-I$idir/include"
test_ldflags="-L$dynamic_lib_dir"
@@ -5847,7 +6844,7 @@ rm -f conftest*
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5856,25 +6853,28 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_dynamic_lib=yes
-else
+else $as_nop
found_dynamic_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- if test $found_dynamic_lib = no -a $static_zlib != no; then
- # No, but linking with zlib as well might help...
- dynamic_extra_libs="$dynamic_extra_libs $static_zlib"
+ if test $found_dynamic_lib = no -a $static_zlib != no
+then :
+
+ # No, but linking with zlib as well might help...
+ dynamic_extra_libs="$dynamic_extra_libs $static_zlib"
test_cflags="-I$idir/include"
test_ldflags="-L$dynamic_lib_dir"
@@ -5894,7 +6894,7 @@ rm -f core conftest.err conftest.$ac_objext \
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5903,27 +6903,32 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_dynamic_lib=yes
-else
+else $as_nop
found_dynamic_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- fi
- fi
- if test -f "$dir/$sdir/lib$static_crypto_lib_name$static_ext"; then
- # Found static library; check if it links...
- static_lib_dir="$dir/$sdir"
+
+fi
+
+fi
+ if test -f "$dir/$sdir/lib$static_crypto_lib_name$static_ext"
+then :
+
+ # Found static library; check if it links...
+ static_lib_dir="$dir/$sdir"
test_cflags="-I$idir/include"
test_ldflags=
@@ -5943,7 +6948,7 @@ rm -f core conftest.err conftest.$ac_objext \
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5952,25 +6957,28 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_static_lib=yes
-else
+else $as_nop
found_static_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- if test $found_static_lib = no -a $static_zlib != no; then
- # No, but inking with zlib as well might help...
- static_extra_libs="$static_extra_libs $static_zlib"
+ if test $found_static_lib = no -a $static_zlib != no
+then :
+
+ # No, but inking with zlib as well might help...
+ static_extra_libs="$static_extra_libs $static_zlib"
test_cflags="-I$idir/include"
test_ldflags=
@@ -5990,7 +6998,7 @@ rm -f core conftest.err conftest.$ac_objext \
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -5999,191 +7007,280 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
found_static_lib=yes
-else
+else $as_nop
found_static_lib=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- fi
- fi
- if test $found_static_lib = yes -o $found_dynamic_lib = yes; then
- break
- fi
- done
- fi
- case $enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib in
- no-*-no)
- as_fn_error $? "dynamic linking against crypto library disabled by user, but no static library found in $with_ssl" "$LINENO" 5;;
- yes-no-*)
- as_fn_error $? "static linking against crypto library disabled by user, but no dynamic library found in $with_ssl" "$LINENO" 5;;
- *-no-no)
- as_fn_error $? "neither static nor dynamic crypto library found in $with_ssl" "$LINENO" 5;;
- no-*-yes | default_no-*-yes | default_yes-no-yes)
- # Link statically...
- SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
- SSL_SSL_LIBNAME=$static_ssl_lib_name
- SSL_LIBDIR="$static_lib_dir"
- SSL_EXTRA_LIBS="$static_extra_libs"
- SSL_RUNTIME_LIBDIR=
- SSL_DYNAMIC_ONLY=no;;
- *-yes-*)
- # Link dynamically...
- SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
- SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
- SSL_EXTRA_LIBS="$dynamic_extra_libs"
- SSL_LIBDIR="$dynamic_lib_dir"
- SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
- SSL_DYNAMIC_ONLY=yes;;
- esac
- if test $SSL_DYNAMIC_ONLY = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
-$as_echo "dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
-$as_echo "static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
- fi
- SSL_INCLUDE="-I$with_ssl_incl/include"
- SSL_APP=ssl
- CRYPTO_APP=crypto
- SSH_APP=ssh
- if test "$cross_compiling" = "yes"; then
- SSL_RUNTIME_LIBDIR=`echo "$SSL_LIBDIR" | sed -n "s|^$erl_xcomp_sysroot\(/*\)\(.*\)\$|/\2|p"`
- else
- SSL_RUNTIME_LIBDIR="$SSL_LIBDIR"
- fi
+fi
+
+fi
+ if test $found_static_lib = yes -o $found_dynamic_lib = yes
+then :
+ break
+fi
+ done
+
+fi
+
+ case $enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib in #(
+ no-*-no) :
+
+ as_fn_error $? "dynamic linking against crypto library disabled by user, but no static library found in $with_ssl" "$LINENO" 5
+ ;; #(
+ yes-no-*) :
+
+ as_fn_error $? "static linking against crypto library disabled by user, but no dynamic library found in $with_ssl" "$LINENO" 5
+ ;; #(
+ *-no-no) :
+
+ as_fn_error $? "neither static nor dynamic crypto library found in $with_ssl" "$LINENO" 5
+ ;; #(
+ no-*-yes | default_no-*-yes | default_yes-no-yes) :
+
+ # Link statically...
+ SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
+ SSL_SSL_LIBNAME=$static_ssl_lib_name
+ SSL_LIBDIR="$static_lib_dir"
+ SSL_EXTRA_LIBS="$static_extra_libs"
+ SSL_RUNTIME_LIBDIR=
+ SSL_DYNAMIC_ONLY=no
+ ;; #(
+ *-yes-*) :
+
+ # Link dynamically...
+ SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
+ SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
+ SSL_EXTRA_LIBS="$dynamic_extra_libs"
+ SSL_LIBDIR="$dynamic_lib_dir"
+ SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
+ SSL_DYNAMIC_ONLY=yes
+ ;; #(
+ *) :
+ ;;
esac
+ if test $SSL_DYNAMIC_ONLY = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
+printf "%s\n" "dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&5
+printf "%s\n" "static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR" >&6; }
+fi
+ SSL_INCLUDE="-I$with_ssl_incl/include"
+ SSL_APP=ssl
+ CRYPTO_APP=crypto
+ SSH_APP=ssh
+ if test "$cross_compiling" = "yes"
+then :
+ SSL_RUNTIME_LIBDIR=`echo "$SSL_LIBDIR" | sed -n "s|^$erl_xcomp_sysroot\(/*\)\(.*\)\$|/\2|p"`
+
+else $as_nop
+
+ SSL_RUNTIME_LIBDIR="$SSL_LIBDIR"
+
+fi
+ ;;
+esac
SSL_DED_LD_RUNTIME_LIBRARY_PATH=
ded_ld_rflg="$DED_LD_FLAG_RUNTIME_LIBRARY_PATH"
+case "$with_ssl_rpath" in #(
+ no) :
-case "$with_ssl_rpath" in
+ # Use no ssl runtime library path
+ SSL_DED_LD_RUNTIME_LIBRARY_PATH=
+ ;; #(
+ yes | default) :
-yes | default) # Use standard lib locations for ssl runtime library path
+ # Use standard lib locations for ssl runtime library path
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for runtime library path to use" >&5
+printf %s "checking for runtime library path to use... " >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for runtime library path to use" >&5
-$as_echo_n "checking for runtime library path to use... " >&6; }
+ if test $enable_dynamic_ssl = no -a "$with_ssl_rpath" = yes; then
+ as_fn_error $? "requested by user, but user also requested static linking" "$LINENO" 5
+ fi
- if test $enable_dynamic_ssl = no -a "$with_ssl_rpath" = yes; then
- as_fn_error $? "requested by user, but user also requested static linking" "$LINENO" 5
- fi
+ if test "$CRYPTO_APP" = ""
+then :
- if test "$CRYPTO_APP" = ""; then
- if test "$with_ssl_rpath" = yes; then
- as_fn_error $? "requested by user, but could not be used since no crypto library was found" "$LINENO" 5
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
- elif test "$ded_ld_rflg" = ""; then
- if test "$with_ssl_rpath" = yes; then
- as_fn_error $? "requested by user, but cannot be set on this platform" "$LINENO" 5
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
- elif test "$SSL_DYNAMIC_ONLY" != "yes"; then
- if test "$with_ssl_rpath" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: requested by user, but dynamic linking will not be used" >&5
-$as_echo "$as_me: WARNING: requested by user, but dynamic linking will not be used" >&2;}
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
- fi
- else
+ if test "$with_ssl_rpath" = yes
+then :
+ as_fn_error $? "requested by user, but could not be used since no crypto library was found" "$LINENO" 5
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5
+printf "%s\n" "" >&6; }
- libdirs="/lib"
+elif test "$ded_ld_rflg" = ""
+then :
- dir_lib64=no
- dir_lib_64=no
- dir_lib32=no
- dir_lib_32=no
- dir_multiarch=no
- dir_with_ssl_lib_subdir=no
+ if test "$with_ssl_rpath" = yes
+then :
+ as_fn_error $? "requested by user, but cannot be set on this platform" "$LINENO" 5
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5
+printf "%s\n" "" >&6; }
- test "$multiarch_dir" = "" || dir_multiarch=yes
- test "$with_ssl_lib_subdir" = "" || dir_with_ssl_lib_subdir=yes
+elif test "$SSL_DYNAMIC_ONLY" != "yes"
+then :
- case "$SSL_RUNTIME_LIBDIR" in
- */lib/64 | */lib/64/ ) dir_lib_64=yes;;
- */lib64 | */lib64/ ) dir_lib64=yes;;
- */lib/32 | */lib/32/ ) dir_lib_32=yes;;
- */lib32 | */lib32/ ) dir_lib32=yes;;
- *) ;;
- esac
+ if test "$with_ssl_rpath" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: requested by user, but dynamic linking will not be used" >&5
+printf "%s\n" "$as_me: WARNING: requested by user, but dynamic linking will not be used" >&2;}
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5
+printf "%s\n" "" >&6; }
+fi
- for dir in $std_ssl_locations; do
- if test "$ac_cv_sizeof_void_p" = "8"; then
- test $dir_lib_64 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib/64" &&
- dir_lib_64=yes
- test $dir_lib64 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib64" &&
- dir_lib64=yes
- else
- test $dir_lib_32 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib/32" &&
- dir_lib_32=yes
- test $dir_lib32 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib32" &&
- dir_lib32=yes
- fi
- test $dir_multiarch = no &&
- test -d "$erl_xcomp_sysroot$dir/lib/$multiarch_dir" &&
- dir_multiarch=yes
- done
+else $as_nop
- test $dir_with_ssl_lib_subdir = yes && libdirs="/$with_ssl_lib_subdir $libdirs"
- test $dir_multiarch = yes && libdirs="/lib/$multiarch_dir $libdirs"
- test $dir_lib_64 = yes && libdirs="/lib/64 $libdirs"
- test $dir_lib64 = yes && libdirs="/lib64 $libdirs"
- test $dir_lib_32 = yes && libdirs="/lib/32 $libdirs"
- test $dir_lib32 = yes && libdirs="/lib32 $libdirs"
+ # Try to find a suitable rpath based on default install directories...
+ libdirs="/lib"
- #
- # We try the following runtime paths in the
- # following order:
- # 1. Standard ssl locations with all variations
- # of lib subdirectories that we know of
- # 2. Standard ssl locations with all variations
- # of lib subdirectories that we know of and
- # exist on this machine
- # 3. Determined $SSL_RUNTIME_LIBDIR
- # If none of the above links, we skip runtime
- # library path...
- #
- for type in std x_std curr; do
-
- ded_ld_rpath="$ded_ld_rflg$SSL_RUNTIME_LIBDIR"
- rpath="$SSL_RUNTIME_LIBDIR"
-
- if test $type != curr; then
- for ldir in $libdirs; do
- for dir in $std_ssl_locations; do
- test "$SSL_RUNTIME_LIBDIR" != "$dir$ldir" || continue
- test $type != x_std || test -d "$erl_xcomp_sysroot$dir$ldir" || continue
- if test "$dir" = "/"; then
- libdir="$ldir"
- else
- libdir="$dir$ldir"
- fi
- ded_ld_rpath="$ded_ld_rpath $ded_ld_rflg$libdir"
- rpath="$rpath:$libdir"
- done
- done
- fi
+ dir_lib64=no
+ dir_lib_64=no
+ dir_lib32=no
+ dir_lib_32=no
+ dir_multiarch=no
+ dir_with_ssl_lib_subdir=no
+
+ if test "$multiarch_dir" != ""
+then :
+ dir_multiarch=yes
+fi
+ if test "$with_ssl_lib_subdir" != ""
+then :
+ dir_with_ssl_lib_subdir=yes
+fi
+
+ case "$SSL_RUNTIME_LIBDIR" in #(
+ */lib/64 | */lib/64/) :
+ dir_lib_64=yes ;; #(
+ */lib64 | */lib64/) :
+ dir_lib64=yes ;; #(
+ */lib/32 | */lib/32/) :
+ dir_lib_32=yes ;; #(
+ */lib32 | */lib32/) :
+ dir_lib32=yes ;; #(
+ *) :
+ ;;
+esac
+
+ for dir in $std_ssl_locations; do
+ if test "$ac_cv_sizeof_void_p" = "8"
+then :
+
+ if test $dir_lib_64 = no && test -d "$erl_xcomp_sysroot$dir/lib/64"
+then :
+ dir_lib_64=yes
+fi
+ if test $dir_lib64 = no && test -d "$erl_xcomp_sysroot$dir/lib64"
+then :
+ dir_lib64=yes
+fi
+
+else $as_nop
+
+ if test $dir_lib_32 = no && test -d "$erl_xcomp_sysroot$dir/lib/32"
+then :
+ dir_lib_32=yes
+fi
+ if test $dir_lib32 = no && test -d "$erl_xcomp_sysroot$dir/lib32"
+then :
+ dir_lib32=yes
+fi
+
+fi
+ if test $dir_multiarch = no && test -d "$erl_xcomp_sysroot$dir/lib/$multiarch_dir"
+then :
+ dir_multiarch=yes
+fi
+ done
- # Check that it still links when we add the runtime path...
+ if test $dir_with_ssl_lib_subdir = yes
+then :
+ libdirs="/$with_ssl_lib_subdir $libdirs"
+fi
+ if test $dir_multiarch = yes
+then :
+ libdirs="/lib/$multiarch_dir $libdirs"
+fi
+ if test $dir_lib_64 = yes
+then :
+ libdirs="/lib/64 $libdirs"
+fi
+ if test $dir_lib64 = yes
+then :
+ libdirs="/lib64 $libdirs"
+fi
+ if test $dir_lib_32 = yes
+then :
+ libdirs="/lib/32 $libdirs"
+fi
+ if test $dir_lib32 = yes
+then :
+ libdirs="/lib32 $libdirs"
+fi
+
+ #
+ # We try the follwing runtime paths in the
+ # following order:
+ # 1. Standard ssl locations with all variations
+ # of lib subdirectories that we know of
+ # 2. Standard ssl locations with all variations
+ # of lib subdirectories that we know of and
+ # exist on this machine
+ # 3. Determined $SSL_RUNTIME_LIBDIR
+ # If none of the above links, we skip runtime
+ # library path...
+ #
+ for type in std x_std curr; do
+
+ ded_ld_rpath="$ded_ld_rflg$SSL_RUNTIME_LIBDIR"
+ rpath="$SSL_RUNTIME_LIBDIR"
+
+ if test $type != curr
+then :
+
+ for ldir in $libdirs; do
+ for dir in $std_ssl_locations; do
+ if test "$SSL_RUNTIME_LIBDIR" = "$dir$ldir"
+then :
+ continue
+fi
+ if test $type = x_std && test '!' -d "$erl_xcomp_sysroot$dir$ldir"
+then :
+ continue
+fi
+ if test "$dir" = "/"
+then :
+ libdir="$ldir"
+else $as_nop
+ libdir="$dir$ldir"
+fi
+ ded_ld_rpath="$ded_ld_rpath $ded_ld_rflg$libdir"
+ rpath="$rpath:$libdir"
+ done
+ done
+
+fi
+
+ # Check that it still links when we add the runtime path...
test_cflags="$SSL_INCLUDE"
test_ldflags="$ded_ld_rpath -L$SSL_LIBDIR"
@@ -6203,7 +7300,7 @@ $as_echo "" >&6; }
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -6212,16 +7309,17 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
rpath_success=yes
-else
+else $as_nop
rpath_success=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
@@ -6229,69 +7327,102 @@ rm -f core conftest.err conftest.$ac_objext \
LIBS="$saveLIBS"
- test "$rpath_success" = "yes" && break
- done
+ if test "$rpath_success" = "yes"
+then :
+ break
+fi
- test "$rpath_success" = "yes" || { ded_ld_rpath=; rpath=; }
+ done
- SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
+ if test "$rpath_success" != "yes"
+then :
- if test "$rpath" != ""; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $rpath" >&5
-$as_echo "$rpath" >&6; }
- elif test "$with_ssl_rpath" = yes; then
- as_fn_error $? "requested by user, but could not be used" "$LINENO" 5
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unable to set run path during linking" >&5
-$as_echo "$as_me: WARNING: unable to set run path during linking" >&2;}
- fi
- fi
- ;;
+ ded_ld_rpath=
+ rpath=
-no) # Use no ssl runtime library path
- SSL_DED_LD_RUNTIME_LIBRARY_PATH=
- ;;
+fi
-*) # Use ssl runtime library paths set by --with-ssl-rpath (without any check)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether runtime library path can be set" >&5
-$as_echo_n "checking whether runtime library path can be set... " >&6; }
+ SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
- if test $enable_dynamic_ssl = no; then
- as_fn_error $? "runtime library path requested by user, but user also requested static linking" "$LINENO" 5
- elif test "$CRYPTO_APP" = ""; then
- if test "$with_ssl_rpath" = yes; then
- as_fn_error $? "runtime library path requested by user, but could not be set since no crypto library was found" "$LINENO" 5
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
- elif test "$ded_ld_rflg" = ""; then
- if test "$with_ssl_rpath" = yes; then
- as_fn_error $? "runtime library path requested by user, but cannot be set on this platform" "$LINENO" 5
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
- elif test "$SSL_DYNAMIC_ONLY" != "yes"; then
- if test "$with_ssl_rpath" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: runtime library path requested by user, but dynamic linking will not be used" >&5
-$as_echo "$as_me: WARNING: runtime library path requested by user, but dynamic linking will not be used" >&2;}
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5
-$as_echo "" >&6; }
- fi
- else
- ded_ld_rpath=
- delimit=
- rpath=
- rpath_delimit=
- save_ifs="$IFS"; IFS=",:"
- for dir in $with_ssl_rpath; do
- ded_ld_rpath="$ded_ld_rpath$delimit$ded_ld_rflg$dir"
- delimit=" "
- rpath="$rpath$rpath_delimit$dir"
- rpath_delimit=":"
- done
- IFS="$save_ifs"
- SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
+ if test "$rpath" != ""
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $rpath" >&5
+printf "%s\n" "$rpath" >&6; }
+
+elif test "$with_ssl_rpath" = yes
+then :
+
+ as_fn_error $? "requested by user, but could not be used" "$LINENO" 5
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unable to set run path during linking" >&5
+printf "%s\n" "$as_me: WARNING: unable to set run path during linking" >&2;}
+
+fi
+
+fi
+ # end yes|default
+ ;; #(
+ *) :
+
+ # Use ssl runtime library paths set by --with-ssl-rpath
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether runtime library path can be set" >&5
+printf %s "checking whether runtime library path can be set... " >&6; }
+
+ if test $enable_dynamic_ssl = no
+then :
+
+ as_fn_error $? "runtime library path requested by user, but user also requested static linking" "$LINENO" 5
+
+elif test "$CRYPTO_APP" = ""
+then :
+
+ if test "$with_ssl_rpath" = yes
+then :
+ as_fn_error $? "runtime library path requested by user, but could not be set since no crypto library was found" "$LINENO" 5
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5
+printf "%s\n" "" >&6; }
+
+elif test "$ded_ld_rflg" = ""
+then :
+
+ if test "$with_ssl_rpath" = yes
+then :
+ as_fn_error $? "runtime library path requested by user, but cannot be set on this platform" "$LINENO" 5
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5
+printf "%s\n" "" >&6; }
+
+ test "$SSL_DYNAMIC_ONLY" != "yes"
+elif
+ if test "$with_ssl_rpath" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: runtime library path requested by user, but dynamic linking will not be used" >&5
+printf "%s\n" "$as_me: WARNING: runtime library path requested by user, but dynamic linking will not be used" >&2;}
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: " >&5
+printf "%s\n" "" >&6; }
+fi
+
+then :
+
+ # Check that it links...
+ ded_ld_rpath=
+ delimit=
+ rpath=
+ rpath_delimit=
+ save_ifs="$IFS"; IFS=",:"
+ for dir in $with_ssl_rpath; do
+ ded_ld_rpath="$ded_ld_rpath$delimit$ded_ld_rflg$dir"
+ delimit=" "
+ rpath="$rpath$rpath_delimit$dir"
+ rpath_delimit=":"
+ done
+ IFS="$save_ifs"
+ SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
test_cflags="$SSL_INCLUDE"
test_ldflags="$ded_ld_rpath -L$SSL_LIBDIR"
@@ -6311,7 +7442,7 @@ $as_echo "" >&6; }
#include <openssl/hmac.h>
int
-main ()
+main (void)
{
HMAC(0, 0, 0, 0, 0, 0, 0);
@@ -6320,98 +7451,269 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
rpath_success=yes
-else
+else $as_nop
rpath_success=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS="$saveCFLAGS"
LDFLAGS="$saveLDFLAGS"
LIBS="$saveLIBS"
- if test "$rpath_success" = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes; using $rpath" >&5
-$as_echo "yes; using $rpath" >&6; }
- else
- as_fn_error $? "runtime library path requested by user, but link failed" "$LINENO" 5
- fi
- fi
- ;;
+ if test "$rpath_success" = yes
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes; using $rpath" >&5
+printf "%s\n" "yes; using $rpath" >&6; }
+else $as_nop
+ as_fn_error $? "runtime library path requested by user, but link failed" "$LINENO" 5
+fi
+fi
+ ;;
esac
-
-
# Check whether --enable-fips was given.
-if test "${enable_fips+set}" = set; then :
+if test ${enable_fips+y}
+then :
enableval=$enable_fips; case "$enableval" in
yes) enable_fips_support=yes ;;
*) enable_fips_support=no ;;
esac
-else
+else $as_nop
enable_fips_support=no
fi
-if test "x$enable_fips_support" = "xyes" && test "$CRYPTO_APP" != ""; then
- saveCFLAGS="$CFLAGS"
- saveLDFLAGS="$LDFLAGS"
- saveLIBS="$LIBS"
- CFLAGS="$DED_BASIC_CFLAGS $SSL_INCLUDE"
- if test $SSL_DYNAMIC_ONLY = yes; then
- LDFLAGS="$DED_LDFLAGS_CONFTEST $ded_ld_rpath -L$SSL_LIBDIR"
- LIBS="$LIBS -l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"
- else
- LDFLAGS="$DED_LDFLAGS_CONFTEST"
- if test "$host_os" = "win32" ; then
- LIBS="$LIBS $SSL_LIBDIR/$SSL_CRYPTO_LIBNAME.lib $SSL_EXTRA_LIBS"
- else
- LIBS="$LIBS $SSL_LIBDIR/lib$SSL_CRYPTO_LIBNAME.a $SSL_EXTRA_LIBS"
- fi
- fi
- ac_fn_c_check_func "$LINENO" "FIPS_mode_set" "ac_cv_func_FIPS_mode_set"
-if test "x$ac_cv_func_FIPS_mode_set" = xyes; then :
+SSL_FLAGS=
+if test "$enable_fips_support" = "yes"
+then :
+
+ if test "$CRYPTO_APP" = ""
+then :
+ as_fn_error $? "FIPS support requested, but no crypto library found" "$LINENO" 5
+fi
+ saveCFLAGS="$CFLAGS"
+ saveLDFLAGS="$LDFLAGS"
+ saveLIBS="$LIBS"
+ CFLAGS="$DED_BASIC_CFLAGS $SSL_INCLUDE"
+ if test $SSL_DYNAMIC_ONLY = yes
+then :
+
+ LDFLAGS="$DED_LDFLAGS_CONFTEST $ded_ld_rpath -L$SSL_LIBDIR"
+ LIBS="$LIBS -l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"
+
+else $as_nop
+
+ LDFLAGS="$DED_LDFLAGS_CONFTEST"
+ if test "$host_os" = "win32"
+then :
+ LIBS="$LIBS $SSL_LIBDIR/$SSL_CRYPTO_LIBNAME.lib $SSL_EXTRA_LIBS"
+else $as_nop
+ LIBS="$LIBS $SSL_LIBDIR/lib$SSL_CRYPTO_LIBNAME.a $SSL_EXTRA_LIBS"
+fi
+
+fi
+ ac_fn_c_check_func "$LINENO" "FIPS_mode_set" "ac_cv_func_FIPS_mode_set"
+if test "x$ac_cv_func_FIPS_mode_set" = xyes
+then :
SSL_FLAGS="-DFIPS_SUPPORT"
-else
- SSL_FLAGS=
+else $as_nop
+ as_fn_error $? "FIPS support requested, but cannot be enabled" "$LINENO" 5
fi
- CFLAGS="$saveCFLAGS"
- LDFLAGS="$saveLDFLAGS"
- LIBS="$saveLIBS"
-else
- SSL_FLAGS=
+ CFLAGS="$saveCFLAGS"
+ LDFLAGS="$saveLDFLAGS"
+ LIBS="$saveLIBS"
+
fi
-if test "x$v3_include" = "xyes"; then
- echo "Using OpenSSL 3.0 is not yet recommended for production code." >> ./CONF_INFO
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5
-$as_echo "$as_me: WARNING: ******************************************************************" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * Using OpenSSL 3.0 is not yet recommended for production code. *" >&5
-$as_echo "$as_me: WARNING: * Using OpenSSL 3.0 is not yet recommended for production code. *" >&2;}
+if test "x$v3_include" = "xyes"
+then :
+ echo "Using OpenSSL 3.0 is not yet recommended for production code." >> ./CONF_INFO
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5
+printf "%s\n" "$as_me: WARNING: ******************************************************************" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: * Using OpenSSL 3.0 is not yet recommended for production code. *" >&5
+printf "%s\n" "$as_me: WARNING: * Using OpenSSL 3.0 is not yet recommended for production code. *" >&2;}
+ if test "x$SSL_DYNAMIC_ONLY" = "xno"
+then :
+ echo "Static linking with OpenSSL 3.0 *MAY* require special configuring of the cryptolib." >> ./CONF_INFO
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: * Static linking *MAY* require re-configuring the 3.0 cryptolib. *" >&5
+printf "%s\n" "$as_me: WARNING: * Static linking *MAY* require re-configuring the 3.0 cryptolib. *" >&2;}
+
+fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5
+printf "%s\n" "$as_me: WARNING: ******************************************************************" >&2;}
- if test "x$SSL_DYNAMIC_ONLY" = "xno" ; then
- echo "Static linking with OpenSSL 3.0 *MAY* require special configuring of the cryptolib." >> ./CONF_INFO
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: * Static linking *MAY* require re-configuring the 3.0 cryptolib. *" >&5
-$as_echo "$as_me: WARNING: * Static linking *MAY* require re-configuring the 3.0 cryptolib. *" >&2;}
- fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ******************************************************************" >&5
-$as_echo "$as_me: WARNING: ******************************************************************" >&2;}
fi
-if test "x$v3_include" = "xyes" && test "x$deprecated_warnings" = "xdefault_yes" && test "$CRYPTO_APP" != ""; then
- deprecated_warnings=no
+if test "x$v3_include" = "xyes" && test "x$deprecated_warnings" = "xdefault_yes" && test "$CRYPTO_APP" != ""
+then :
+ deprecated_warnings=no
+
fi
-if test "x$deprecated_warnings" = "xno" && test "$CRYPTO_APP" != "" ; then
- SSL_FLAGS="$SSL_FLAGS -Wno-deprecated-declarations"
+if test "x$deprecated_warnings" = "xno" && test "$CRYPTO_APP" != ""
+then :
+ SSL_FLAGS="$SSL_FLAGS -Wno-deprecated-declarations"
+
+fi
+
+saveCFLAGS="$CFLAGS"
+saveLDFLAGS="$LDFLAGS"
+saveLIBS="$LIBS"
+CFLAGS="$DED_BASIC_CFLAGS $SSL_INCLUDE"
+if test $SSL_DYNAMIC_ONLY = yes
+then :
+
+ LDFLAGS="$DED_LDFLAGS_CONFTEST $ded_ld_rpath -L$SSL_LIBDIR"
+ LIBS="$LIBS -l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"
+
+else $as_nop
+
+ LDFLAGS="$DED_LDFLAGS_CONFTEST"
+ if test "$host_os" = "win32"
+then :
+ LIBS="$LIBS $SSL_LIBDIR/$SSL_CRYPTO_LIBNAME.lib $SSL_EXTRA_LIBS"
+else $as_nop
+ LIBS="$LIBS $SSL_LIBDIR/lib$SSL_CRYPTO_LIBNAME.a $SSL_EXTRA_LIBS"
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC options needed to detect all undeclared functions" >&5
+printf %s "checking for $CC options needed to detect all undeclared functions... " >&6; }
+if test ${ac_cv_c_undeclared_builtin_options+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_save_CFLAGS=$CFLAGS
+ ac_cv_c_undeclared_builtin_options='cannot detect'
+ for ac_arg in '' -fno-builtin; do
+ CFLAGS="$ac_save_CFLAGS $ac_arg"
+ # This test program should *not* compile successfully.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+(void) strchr;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+
+else $as_nop
+ # This test program should compile successfully.
+ # No library function is consistently available on
+ # freestanding implementations, so test against a dummy
+ # declaration. Include always-available headers on the
+ # off chance that they somehow elicit warnings.
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <float.h>
+#include <limits.h>
+#include <stdarg.h>
+#include <stddef.h>
+extern void ac_decl (int, char *);
+
+int
+main (void)
+{
+(void) ac_decl (0, (char *) 0);
+ (void) ac_decl;
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ if test x"$ac_arg" = x
+then :
+ ac_cv_c_undeclared_builtin_options='none needed'
+else $as_nop
+ ac_cv_c_undeclared_builtin_options=$ac_arg
+fi
+ break
fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ done
+ CFLAGS=$ac_save_CFLAGS
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_undeclared_builtin_options" >&5
+printf "%s\n" "$ac_cv_c_undeclared_builtin_options" >&6; }
+ case $ac_cv_c_undeclared_builtin_options in #(
+ 'cannot detect') :
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot make $CC report undeclared builtins
+See \`config.log' for more details" "$LINENO" 5; } ;; #(
+ 'none needed') :
+ ac_c_undeclared_builtin_options='' ;; #(
+ *) :
+ ac_c_undeclared_builtin_options=$ac_cv_c_undeclared_builtin_options ;;
+esac
+
+ac_fn_check_decl "$LINENO" "CRYPTO_memcmp" "ac_cv_have_decl_CRYPTO_memcmp" "#include <openssl/crypto.h>
+" "$ac_c_undeclared_builtin_options" "CFLAGS"
+if test "x$ac_cv_have_decl_CRYPTO_memcmp" = xyes
+then :
+ have_crypto_memcmp_decl=yes
+else $as_nop
+ have_crypto_memcmp_decl=no
+fi
+if test $have_crypto_memcmp_decl = yes
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether CRYPTO_memcmp can be linked" >&5
+printf %s "checking whether CRYPTO_memcmp can be linked... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+ #include <openssl/crypto.h>
+
+int
+main (void)
+{
+
+ CRYPTO_memcmp("a", "b", 1);
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"
+then :
+
+ SSL_FLAGS="-DHAVE_OPENSSL_CRYPTO_MEMCMP $SSL_FLAGS"
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext conftest.$ac_ext
+
+fi
+CFLAGS="$saveCFLAGS"
+LDFLAGS="$saveLDFLAGS"
+LIBS="$saveLIBS"
@@ -6455,8 +7757,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -6486,15 +7788,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -6508,8 +7810,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -6562,7 +7864,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -6578,8 +7880,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -6602,14 +7904,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -6619,46 +7923,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -6667,13 +7971,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -6682,8 +7979,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -6695,30 +7996,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -6731,13 +8012,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -6764,18 +8046,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -6787,12 +8071,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -6823,7 +8108,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -6845,6 +8130,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -6858,6 +8147,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -6899,7 +8194,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -6908,7 +8203,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -6971,7 +8266,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -7020,14 +8315,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -7064,21 +8361,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -7106,7 +8403,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -7120,7 +8417,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -7145,7 +8442,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -7373,7 +8670,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -7381,17 +8678,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -7408,7 +8705,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -7432,9 +8729,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -7487,8 +8784,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -7530,9 +8827,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -7579,8 +8876,9 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
diff --git a/lib/crypto/configure.ac b/lib/crypto/configure.ac
new file mode 100644
index 0000000000..52d1f6c324
--- /dev/null
+++ b/lib/crypto/configure.ac
@@ -0,0 +1,971 @@
+dnl Process this file with autoconf to produce a configure script. -*-Autoconf-*-
+dnl
+dnl %CopyrightBegin%
+dnl
+dnl Copyright Ericsson AB 2018-2022. All Rights Reserved.
+dnl
+dnl Licensed under the Apache License, Version 2.0 (the "License");
+dnl you may not use this file except in compliance with the License.
+dnl You may obtain a copy of the License at
+dnl
+dnl http://www.apache.org/licenses/LICENSE-2.0
+dnl
+dnl Unless required by applicable law or agreed to in writing, software
+dnl distributed under the License is distributed on an "AS IS" BASIS,
+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+dnl See the License for the specific language governing permissions and
+dnl limitations under the License.
+dnl
+dnl %CopyrightEnd%
+dnl
+
+dnl define([AC_CACHE_LOAD], )dnl
+dnl define([AC_CACHE_SAVE], )dnl
+
+AC_INIT
+AC_CONFIG_SRCDIR([vsn.mk])
+AC_PREREQ([2.71])
+
+m4_include([otp.m4])
+
+AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf])
+
+ERL_CANONICAL_SYSTEM_TYPE
+
+AC_LANG(C)
+
+LM_PRECIOUS_VARS
+
+## Delete previous failed configure results
+if test -f ./CONF_INFO; then
+ rm ./CONF_INFO
+fi
+
+if test "$cross_compiling" = "yes"; then
+ CROSS_COMPILING=yes
+else
+ CROSS_COMPILING=no
+fi
+AC_SUBST(CROSS_COMPILING)
+
+ERL_XCOMP_SYSROOT_INIT
+
+AC_PROG_CC
+LM_WINDOWS_ENVIRONMENT
+
+ERL_DED
+
+AC_MSG_CHECKING([for multiarch directory])
+multiarch_dir=
+if test "$GCC" = "yes"; then
+ multiarch_dir=`$CC $CFLAGS -print-multiarch 2>/dev/null`
+ if test $? -ne 0; then
+ multiarch_dir=
+ fi
+fi
+if test "$multiarch_dir" = ""; then
+ AC_MSG_RESULT([not found])
+else
+ AC_MSG_RESULT([$multiarch_dir])
+fi
+
+dnl
+dnl SSL, SSH and CRYPTO need the OpenSSL libraries
+dnl
+dnl Check flags --with-ssl, --without-ssl --with-ssl=PATH.
+dnl If no option is given or --with-ssl is set without a path then we
+dnl search for OpenSSL libraries and header files in the standard locations.
+dnl If set to --without-ssl we disable the use of SSL, SSH and CRYPTO.
+dnl If set to --with-ssl=PATH we use that path as the prefix, i.e. we
+dnl use "PATH/include" and "PATH/lib".
+
+AC_CHECK_SIZEOF(void *)
+
+std_ssl_locations="\
+/usr/local \
+/usr/sfw \
+/usr \
+/opt/local \
+/usr/pkg \
+/usr/local/openssl \
+/usr/local/opt/openssl \
+/opt/homebrew/opt/openssl \
+/usr/lib/openssl \
+/usr/openssl \
+/usr/local/ssl \
+/usr/lib/ssl \
+/usr/ssl \
+/"
+
+AC_ARG_WITH(ssl,
+AS_HELP_STRING([--with-ssl=PATH], [base location of OpenSSL include and lib directories])
+AS_HELP_STRING([--with-ssl], [use SSL (default)])
+AS_HELP_STRING([--without-ssl], [don't use SSL]))
+
+AC_ARG_WITH(ssl-lib-subdir,
+AS_HELP_STRING([--with-ssl-lib-subdir=RELATIVE_PATH],
+ [specify extra OpenSSL lib sub-directory to search in (relative to base directory)]),
+[
+case "$with_ssl_lib_subdir" in
+ yes|no)
+ with_ssl_lib_subdir=
+ ;;
+ *)
+ ;;
+esac
+],
+[with_ssl_lib_subdir=]) #default
+
+AC_ARG_WITH(ssl-incl,
+AS_HELP_STRING([--with-ssl-incl=PATH],
+ [base location of OpenSSL include dir (if different than base location specified by --with-ssl=PATH)]),
+[
+case X$with_ssl in
+ X | Xyes | Xno) AC_MSG_ERROR([--with-ssl-incl=PATH set without --with-ssl=PATH]);;
+esac
+],
+[with_ssl_incl=$with_ssl]) #default
+
+AC_ARG_WITH(ssl-zlib,
+AS_HELP_STRING([--with-ssl-zlib=PATH], [Path to static zlib library to link the
+ crypto NIF with. This zlib library is most
+ often not necessary but might be needed in
+ order to link the NIF in some cases.]),
+[], [with_ssl_zlib=default]) #default
+
+AC_ARG_WITH(ssl-rpath,
+AS_HELP_STRING([--with-ssl-rpath=yes|no|PATHS],
+ [runtime library path for OpenSSL. Default is "yes", which equates to a
+ number of standard locations. If "no", then no runtime
+ library paths will be used. Anything else should be a
+ comma or colon separated list of paths.]),
+[
+case X$with_ssl in
+ Xno) AC_MSG_ERROR([--with-ssl-rpath set without --with-ssl]);;
+esac
+],
+[with_ssl_rpath=default]) #default
+
+
+AC_ARG_ENABLE(dynamic-ssl-lib,
+AS_HELP_STRING([--enable-dynamic-ssl-lib],
+ [enable using dynamic openssl libraries when linking the crypto NIF])
+AS_HELP_STRING([--disable-dynamic-ssl-lib],
+ [disable using dynamic openssl libraries when linking the crypto NIF]),
+[ case "$enableval" in
+ no) enable_dynamic_ssl=no ;;
+ *) enable_dynamic_ssl=yes ;;
+ esac ], enable_dynamic_ssl=undefined)
+
+AC_ARG_ENABLE(evp-dh,
+AS_HELP_STRING([--disable-evp-dh],
+ [intentionally undocumented workaround]),
+[ case "$enableval" in
+ no) DISABLE_EVP_DH=1;;
+ *) DISABLE_EVP_DH=0;;
+ esac ], DISABLE_EVP_DH=0)
+
+
+AC_ARG_ENABLE(evp-hmac,
+AS_HELP_STRING([--disable-evp-hmac],
+ [intentionally undocumented workaround]),
+[ case "$enableval" in
+ no) DISABLE_EVP_HMAC=1;;
+ *) DISABLE_EVP_HMAC=0;;
+ esac ], DISABLE_EVP_HMAC=0)
+
+AC_ARG_ENABLE(otp-test-engine,
+AS_HELP_STRING([--disable-otp-test-engine],
+ [Disable build of the otp_test_engine. (default is --enable-otp-test-engine, unless for LibreSSL >= 3.5.0 where default is --disable-otp-test-engine)]),
+[ case "$enableval" in
+ no) DISABLE_OTP_TEST_ENGINE=yes;;
+ *) DISABLE_OTP_TEST_ENGINE=no;;
+ esac ], DISABLE_OTP_TEST_ENGINE=default)
+
+AC_ARG_ENABLE(deprecated_warnings,
+AS_HELP_STRING([--disable-deprecated-warnings],
+ [disable warnings for deprecated functions in cryptolib (default is to warn, except for OpenSSL 3.x where the default is not to warn)]),
+[ case "$enableval" in
+ no) deprecated_warnings=no;;
+ *) deprecated_warnings=yes;;
+ esac ], deprecated_warnings=default_yes)
+
+AC_DEFUN([ERL_LINK_CRYPTO_IFELSE], [
+ test_cflags=$1
+ test_ldflags=$2
+ test_libs=$3
+
+ saveCFLAGS="$CFLAGS"
+ saveLDFLAGS="$LDFLAGS"
+ saveLIBS="$LIBS"
+ CFLAGS="$DED_BASIC_CFLAGS $test_cflags"
+ LDFLAGS="$DED_LDFLAGS_CONFTEST $test_ldflags"
+ LIBS="$LIBS $test_libs"
+
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM(
+ [[
+ #include <stdio.h>
+ #include <openssl/hmac.h>
+ ]],
+ [[
+ HMAC(0, 0, 0, 0, 0, 0, 0);
+ ]])],
+ [
+ $4
+ ],
+ [
+ $5
+ ])
+
+ CFLAGS="$saveCFLAGS"
+ LDFLAGS="$saveLDFLAGS"
+ LIBS="$saveLIBS"
+])
+
+AC_DEFUN([ERL_CRYPTO_CHECK_LIB], [
+ # Check for static and dynamic crypto library in the directory
+ # given as argument...
+ #
+ # Written as a macro in order to avoid writing the tests twice...
+ idir=$1
+ prfx=$2
+ rdir=$3
+ dir="$prfx$rdir"
+ static_crypto_lib_name=crypto
+ static_ssl_lib_name=ssl
+ static_extra_libs="$forced_static_zlib"
+ static_lib_dir=
+ dynamic_crypto_lib_name=crypto
+ dynamic_ssl_lib_name=ssl
+ dynamic_extra_libs="$forced_static_zlib"
+ dynamic_lib_dir=
+ dynamic_runtime_lib_dir=
+ found_static_lib=no
+ found_dynamic_lib=no
+
+ save_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="-I$idir/include"
+ AC_EGREP_CPP(^yes.?$,[
+#include <openssl/opensslv.h>
+#if OPENSSL_VERSION_NUMBER >= 0x0090803fL
+yes
+#endif
+ ],
+ [valid_include=yes],
+ [valid_include=no])
+ AC_EGREP_CPP(^yes.?$,[
+#include <openssl/opensslv.h>
+#if OPENSSL_VERSION_MAJOR == 3
+yes
+#endif
+ ],
+ [v3_include=yes],
+ [v3_include=no])
+
+
+ if test "x$DISABLE_OTP_TEST_ENGINE" = "xdefault"; then
+# Get default value for the --disable-otp-test-engine. Depends on cryptolib version
+ AC_EGREP_CPP(^yes.?$,[
+#include <openssl/opensslv.h>
+#if LIBRESSL_VERSION_NUMBER >= 0x3050000fL
+yes
+#endif
+ ],
+ [DISABLE_OTP_TEST_ENGINE=yes],
+ [DISABLE_OTP_TEST_ENGINE=no])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+
+ AS_IF([test $valid_include != yes],
+ [
+ # Not a valid include...
+ static_crypto_lib_name=
+ static_ssl_lib_name=
+ static_extra_libs=
+ static_lib_dir=
+ dynamic_crypto_lib_name=
+ dynamic_ssl_lib_name=
+ dynamic_extra_libs=
+ dynamic_lib_dir=
+ dynamic_runtime_lib_dir=
+ ],
+ [test "$host_os" = "win32"],
+ [
+ # Windows...
+ AS_IF([test -f "$dir/lib/VC/static/libcrypto${lib_bits}MD.lib"],
+ [
+ static_crypto_lib_name=libcrypto${lib_bits}MD
+ static_ssl_lib_name="libssl${lib_bits}MD"
+ static_extra_libs="$static_extra_libs -lCRYPT32 -lWS2_32"
+ static_lib_dir="$dir/lib/VC/static"
+ found_static_lib=yes
+ ])
+ AS_IF([test -f "$dir/lib/VC/libcrypto${lib_bits}MD.lib"],
+ [
+ dynamic_crypto_lib_name=libcrypto${lib_bits}MD
+ dynamic_ssl_lib_name="libssl${lib_bits}MD"
+ dynamic_runtime_lib_dir="$rdir/lib/VC"
+ dynamic_lib_dir="$dir/lib/VC"
+ found_dynamic_lib=yes
+ ])
+ ],
+ [
+ # Not windows...
+ AS_CASE(["$host_os"],
+ [darwin*],
+ [
+ static_ext=.a
+ dynamic_ext=.dylib
+ ],
+ [
+ static_ext=.a
+ dynamic_ext=.so
+ ])
+ for sdir in $search_subdirs; do
+ AS_IF([test -f "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"],
+ [
+ found_dynlib=yes
+ ],
+ [
+ found_dynlib=no
+ AS_CASE([$host_os],
+ [openbsd*],
+ [
+ # libcrypto.so got a suffix on (at least some) openbsd.
+ # If we find libcrypto.so with suffix, we try to link
+ # to it using -lcrypto ...
+ for f in "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"*; do
+ AS_IF([test -f "$f"], [found_dynlib=yes; break])
+ done
+ ])
+ ])
+ AS_IF([test $found_dynlib = yes],
+ [
+ # Found dynamic library; check if it links...
+ dynamic_lib_dir="$dir/$sdir"
+ dynamic_runtime_lib_dir="$rdir/$sdir"
+ ERL_LINK_CRYPTO_IFELSE(["-I$idir/include"],
+ ["-L$dynamic_lib_dir"],
+ ["-l$dynamic_crypto_lib_name $dynamic_extra_libs"],
+ [found_dynamic_lib=yes],
+ [found_dynamic_lib=no])
+ AS_IF([test $found_dynamic_lib = no -a $static_zlib != no],
+ [
+ # No, but linking with zlib as well might help...
+ dynamic_extra_libs="$dynamic_extra_libs $static_zlib"
+ ERL_LINK_CRYPTO_IFELSE(["-I$idir/include"],
+ ["-L$dynamic_lib_dir"],
+ ["-l$dynamic_crypto_lib_name $dynamic_extra_libs"],
+ [found_dynamic_lib=yes],
+ [found_dynamic_lib=no])
+ ])
+ ])
+ AS_IF([test -f "$dir/$sdir/lib$static_crypto_lib_name$static_ext"],
+ [
+ # Found static library; check if it links...
+ static_lib_dir="$dir/$sdir"
+ ERL_LINK_CRYPTO_IFELSE(["-I$idir/include"],
+ [],
+ ["$dir/$sdir/lib$static_crypto_lib_name$static_ext $static_extra_libs"],
+ [found_static_lib=yes],
+ [found_static_lib=no])
+ AS_IF([test $found_static_lib = no -a $static_zlib != no],
+ [
+ # No, but inking with zlib as well might help...
+ static_extra_libs="$static_extra_libs $static_zlib"
+ ERL_LINK_CRYPTO_IFELSE(["-I$idir/include"],
+ [],
+ ["$dir/$sdir/lib$static_crypto_lib_name$static_ext $static_extra_libs"],
+ [found_static_lib=yes],
+ [found_static_lib=no])
+ ])
+ ])
+ AS_IF([test $found_static_lib = yes -o $found_dynamic_lib = yes],
+ [break])
+ done
+ ])
+])
+
+# Remove all SKIP files from previous runs
+for a in ssl crypto ssh; do
+ rm -f "$ERL_TOP/lib/$a/SKIP"
+done
+
+# Setup subdirectories to search in...
+search_subdirs="lib"
+if test "$ac_cv_sizeof_void_p" = "8"; then
+ search_subdirs="$search_subdirs lib64 lib/64"
+else
+ search_subdirs="$search_subdirs lib32 lib/32"
+fi
+test "$multiarch_dir" = "" || search_subdirs="lib/$multiarch_dir $search_subdirs"
+test "$with_ssl_lib_subdir" = "" || search_subdirs="$with_ssl_lib_subdir $search_subdirs"
+
+# We might need to link with zlib, so first check if we can find
+# a static zlib to use if needed...
+static_zlib=no
+forced_static_zlib=
+case "$with_ssl_zlib" in
+ no)
+ ;;
+ default | yes)
+ AC_MSG_CHECKING([for static zlib])
+ for dir in $std_ssl_locations; do
+ for sdir in $search_subdirs; do
+ if test -f "$erl_xcomp_sysroot$dir/$sdir/libz.a"; then
+ static_zlib="$erl_xcomp_sysroot$dir/$sdir/libz.a"
+ break
+ fi
+ done
+ test "$static_zlib" = "no" || break
+ done
+ AC_MSG_RESULT([$static_zlib])
+ if test $with_ssl_zlib = yes; then
+ if test $static_zlib = no; then
+ AC_MSG_ERROR([linking with zlib requested by user, but no such library was found])
+ fi
+ forced_static_zlib="$static_zlib"
+ static_zlib=no
+ fi;;
+ *) # PATH
+ AC_MSG_CHECKING([for static zlib])
+ if test -f "$with_ssl_zlib/libz.a"; then
+ forced_static_zlib="$with_ssl_zlib/libz.a"
+ else
+ for sdir in $search_subdirs; do
+ if test -f "$with_ssl_zlib/$sdir/libz.a"; then
+ forced_static_zlib="$with_ssl_zlib/$sdir/libz.a"
+ break
+ fi
+ done
+ fi
+ if test "$forced_static_zlib" = ""; then
+ AC_MSG_ERROR([linking with zlib requested by user, but no such library was found in $with_ssl_zlib])
+ fi
+ AC_MSG_RESULT([$forced_static_zlib])
+ ;;
+esac
+
+if test $enable_dynamic_ssl = undefined; then
+ if test "$host_os" = "win32" ; then
+ enable_dynamic_ssl=default_no
+ else
+ enable_dynamic_ssl=default_yes
+ fi
+fi
+
+case $enable_dynamic_ssl in
+ yes|default_yes)
+ SSL_DYNAMIC_ONLY=yes;;
+ *)
+ SSL_DYNAMIC_ONLY=no;;
+esac
+
+AS_CASE(["$erl_xcomp_without_sysroot-$with_ssl"],
+ [yes-* | no-no],
+ [
+ SSL_APP=
+ CRYPTO_APP=
+ SSH_APP=
+ if test "$with_ssl" != "no"; then
+ skip="Cannot search for ssl; missing cross system root (erl_xcomp_sysroot)."
+ fi
+ for a in ssl crypto ssh; do
+ echo "$skip" > $ERL_TOP/lib/$a/SKIP
+ done
+ ],
+ [no-yes | no-],
+ [
+ # We search for OpenSSL in the common OS standard locations.
+ SSL_APP=ssl
+ CRYPTO_APP=crypto
+ SSH_APP=ssh
+
+ AS_IF([test "$host_os" != "win32"],
+ [
+ std_win_ssl_locations=
+ ],
+ [
+ AS_IF([test "x$ac_cv_sizeof_void_p" = "x8"],
+ [
+ std_win_ssl_locations="/mnt/c/OpenSSL-Win64 /c/OpenSSL-Win64 /mnt/c/opt/local64/pgm/OpenSSL /opt/local64/pgm/OpenSSL /cygdrive/c/OpenSSL-Win64"
+ lib_bits=64
+ ],
+ [
+ std_win_ssl_locations="/mnt/c/OpenSSL-Win32 /c/OpenSSL-Win32 /mnt/c/OpenSSL /c/OpenSSL /cygdrive/c/OpenSSL /opt/local/pgm/OpenSSL /opt/local32/pgm/OpenSSL /mnt/c/opt/local/pgm/OpenSSL /mnt/c/opt/local32/pgm/OpenSSL /cygdrive/c/OpenSSL-Win32"
+ lib_bits=32
+ ])
+ ])
+
+ usable_crypto=no
+ AC_MSG_CHECKING([for OpenSSL crypto library with version >= 0.9.8c in standard locations])
+ for rdir in $std_win_ssl_locations $std_ssl_locations; do
+ AS_IF([test -f "$erl_xcomp_isysroot$rdir/include/openssl/opensslv.h"],
+ [
+ SSL_INCDIR="$erl_xcomp_isysroot$rdir"
+ SSL_INCLUDE="-I$SSL_INCDIR/include"
+ ERL_CRYPTO_CHECK_LIB(["$SSL_INCDIR"], ["$erl_xcomp_sysroot"], ["$rdir"])
+ AS_CASE([$enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib],
+ [no-*-no],
+ [
+ # Dynamic linking against ssl library disabled by user,
+ # and no static library found...
+ ],
+ [yes-no-*],
+ [
+ # Static linking against ssl library disabled by user,
+ # and no dynamic library found...
+ ],
+ [*-no-no],
+ [
+ # Neither static nor dynamic ssl library found...
+ ],
+ [no-*-yes | default_no-*-yes | default_yes-no-yes],
+ [
+ # Link statically...
+ SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
+ SSL_SSL_LIBNAME=$static_ssl_lib_name
+ SSL_LIBDIR="$static_lib_dir"
+ SSL_EXTRA_LIBS="$static_extra_libs"
+ SSL_RUNTIME_LIBDIR=
+ SSL_DYNAMIC_ONLY=no
+ usable_crypto=yes
+ break
+ ],
+ [*-yes-*],
+ [
+ # Link dynamically...
+ SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
+ SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
+ SSL_EXTRA_LIBS="$dynamic_extra_libs"
+ SSL_LIBDIR="$dynamic_lib_dir"
+ SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
+ SSL_DYNAMIC_ONLY=yes
+ usable_crypto=yes
+ break
+ ])
+ ])
+ done
+
+ AS_IF([test $usable_crypto = yes],
+ [AS_IF([test $SSL_DYNAMIC_ONLY = yes],
+ [AC_MSG_RESULT([dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])],
+ [AC_MSG_RESULT([static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])])],
+ [
+ AC_MSG_RESULT([no])
+ SSL_APP=
+ CRYPTO_APP=
+ SSH_APP=
+
+ SSL_INCDIR=
+ SSL_INCLUDE=
+ SSL_CRYPTO_LIBNAME=
+ SSL_SSL_LIBNAME=
+ SSL_INCDIR=
+ SSL_RUNTIME_LIBDIR=
+ SSL_LIBDIR=
+
+ AS_CASE(["$with_ssl-$enable_dynamic_ssl"],
+ [yes-yes],
+ [
+ AC_MSG_ERROR([crypto library with dynamic linking requested by user, but no such library was found])
+ ],
+ [yes-no],
+ [
+ AC_MSG_ERROR([crypto library with static linking requested by user, but no such library was found])
+ ],
+ [yes-*],
+ [
+ AC_MSG_ERROR([crypto library requested by user, but no such library was found])
+ ],
+ [
+ AC_MSG_WARN([No (usable) OpenSSL found, skipping ssl, ssh and crypto applications])
+ ])
+
+ for a in ssl crypto ssh; do
+ echo "No usable OpenSSL found" > $ERL_TOP/lib/$a/SKIP
+ done
+ ])
+ ],
+ [
+ # Option given with PATH to package
+ AS_IF([test ! -d "$with_ssl"],
+ [AC_MSG_ERROR(Invalid path to option --with-ssl=PATH)])
+ AS_IF([test ! -d "$with_ssl_incl"],
+ [AC_MSG_ERROR(Invalid path to option --with-ssl-incl=PATH)])
+ AC_MSG_CHECKING([for OpenSSL header in $with_ssl_incl])
+ AS_IF([test -f "$with_ssl_incl/include/openssl/opensslv.h"],
+ [AC_MSG_RESULT([yes])],
+ [AC_MSG_ERROR([no OpenSSL header found in $with_ssl_incl])])
+ SSL_INCDIR="$with_ssl_incl"
+ AC_MSG_CHECKING([for OpenSSL in $with_ssl])
+ ERL_CRYPTO_CHECK_LIB(["$with_ssl_incl"], [""], ["$with_ssl"])
+ AS_CASE([$enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib],
+ [no-*-no],
+ [
+ AC_MSG_ERROR([dynamic linking against crypto library disabled by user, but no static library found in $with_ssl])
+ ],
+ [yes-no-*],
+ [
+ AC_MSG_ERROR([static linking against crypto library disabled by user, but no dynamic library found in $with_ssl])
+ ],
+ [*-no-no],
+ [
+ AC_MSG_ERROR([neither static nor dynamic crypto library found in $with_ssl])
+ ],
+ [no-*-yes | default_no-*-yes | default_yes-no-yes],
+ [
+ # Link statically...
+ SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
+ SSL_SSL_LIBNAME=$static_ssl_lib_name
+ SSL_LIBDIR="$static_lib_dir"
+ SSL_EXTRA_LIBS="$static_extra_libs"
+ SSL_RUNTIME_LIBDIR=
+ SSL_DYNAMIC_ONLY=no
+ ],
+ [*-yes-*],
+ [
+ # Link dynamically...
+ SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
+ SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
+ SSL_EXTRA_LIBS="$dynamic_extra_libs"
+ SSL_LIBDIR="$dynamic_lib_dir"
+ SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
+ SSL_DYNAMIC_ONLY=yes
+ ])
+ AS_IF([test $SSL_DYNAMIC_ONLY = yes],
+ [AC_MSG_RESULT([dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])],
+ [AC_MSG_RESULT([static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])])
+ SSL_INCLUDE="-I$with_ssl_incl/include"
+ SSL_APP=ssl
+ CRYPTO_APP=crypto
+ SSH_APP=ssh
+ AS_IF([test "$cross_compiling" = "yes"],
+ [
+ SSL_RUNTIME_LIBDIR=`echo "$SSL_LIBDIR" | sed -n "s|^$erl_xcomp_sysroot\(/*\)\(.*\)\$|/\2|p"`
+ ],
+ [
+ SSL_RUNTIME_LIBDIR="$SSL_LIBDIR"
+ ])
+ ])dnl AS_CASE
+
+SSL_DED_LD_RUNTIME_LIBRARY_PATH=
+ded_ld_rflg="$DED_LD_FLAG_RUNTIME_LIBRARY_PATH"
+
+AS_CASE(["$with_ssl_rpath"],
+ [no],
+ [
+ # Use no ssl runtime library path
+ SSL_DED_LD_RUNTIME_LIBRARY_PATH=
+ ],
+ [yes | default],
+ [
+ # Use standard lib locations for ssl runtime library path
+ AC_MSG_CHECKING([for runtime library path to use])
+
+ if test $enable_dynamic_ssl = no -a "$with_ssl_rpath" = yes; then
+ AC_MSG_ERROR([requested by user, but user also requested static linking])
+ fi
+
+ AS_IF([test "$CRYPTO_APP" = ""],
+ [
+ AS_IF([test "$with_ssl_rpath" = yes],
+ [AC_MSG_ERROR([requested by user, but could not be used since no crypto library was found])])
+ AC_MSG_RESULT([])
+ ],
+ [test "$ded_ld_rflg" = ""],
+ [
+ AS_IF([test "$with_ssl_rpath" = yes],
+ [AC_MSG_ERROR([requested by user, but cannot be set on this platform])])
+ AC_MSG_RESULT([])
+ ],
+ [test "$SSL_DYNAMIC_ONLY" != "yes"],
+ [
+ AS_IF([test "$with_ssl_rpath" = yes],
+ [AC_MSG_WARN([requested by user, but dynamic linking will not be used])],
+ [AC_MSG_RESULT([])])
+ ],
+ [
+ # Try to find a suitable rpath based on default install directories...
+ libdirs="/lib"
+
+ dir_lib64=no
+ dir_lib_64=no
+ dir_lib32=no
+ dir_lib_32=no
+ dir_multiarch=no
+ dir_with_ssl_lib_subdir=no
+
+ AS_IF([test "$multiarch_dir" != ""], [dir_multiarch=yes])
+ AS_IF([test "$with_ssl_lib_subdir" != ""], [dir_with_ssl_lib_subdir=yes])
+
+ AS_CASE(["$SSL_RUNTIME_LIBDIR"],
+ [*/lib/64 | */lib/64/], [dir_lib_64=yes],
+ [*/lib64 | */lib64/], [dir_lib64=yes],
+ [*/lib/32 | */lib/32/], [dir_lib_32=yes],
+ [*/lib32 | */lib32/], [dir_lib32=yes])
+
+ for dir in $std_ssl_locations; do
+ AS_IF([test "$ac_cv_sizeof_void_p" = "8"],
+ [
+ AS_IF([test $dir_lib_64 = no && test -d "$erl_xcomp_sysroot$dir/lib/64"],
+ [dir_lib_64=yes])
+ AS_IF([test $dir_lib64 = no && test -d "$erl_xcomp_sysroot$dir/lib64"],
+ [dir_lib64=yes])
+ ],
+ [
+ AS_IF([test $dir_lib_32 = no && test -d "$erl_xcomp_sysroot$dir/lib/32"],
+ [dir_lib_32=yes])
+ AS_IF([test $dir_lib32 = no && test -d "$erl_xcomp_sysroot$dir/lib32"],
+ [dir_lib32=yes])
+ ])
+ AS_IF([test $dir_multiarch = no && test -d "$erl_xcomp_sysroot$dir/lib/$multiarch_dir"],
+ [dir_multiarch=yes])
+ done
+
+ AS_IF([test $dir_with_ssl_lib_subdir = yes],
+ [libdirs="/$with_ssl_lib_subdir $libdirs"])
+ AS_IF([test $dir_multiarch = yes],
+ [libdirs="/lib/$multiarch_dir $libdirs"])
+ AS_IF([test $dir_lib_64 = yes],
+ [libdirs="/lib/64 $libdirs"])
+ AS_IF([test $dir_lib64 = yes],
+ [libdirs="/lib64 $libdirs"])
+ AS_IF([test $dir_lib_32 = yes],
+ [libdirs="/lib/32 $libdirs"])
+ AS_IF([test $dir_lib32 = yes],
+ [libdirs="/lib32 $libdirs"])
+
+ #
+ # We try the follwing runtime paths in the
+ # following order:
+ # 1. Standard ssl locations with all variations
+ # of lib subdirectories that we know of
+ # 2. Standard ssl locations with all variations
+ # of lib subdirectories that we know of and
+ # exist on this machine
+ # 3. Determined $SSL_RUNTIME_LIBDIR
+ # If none of the above links, we skip runtime
+ # library path...
+ #
+ for type in std x_std curr; do
+
+ ded_ld_rpath="$ded_ld_rflg$SSL_RUNTIME_LIBDIR"
+ rpath="$SSL_RUNTIME_LIBDIR"
+
+ AS_IF([test $type != curr],
+ [
+ for ldir in $libdirs; do
+ for dir in $std_ssl_locations; do
+ AS_IF([test "$SSL_RUNTIME_LIBDIR" = "$dir$ldir"],
+ [continue])
+ AS_IF([test $type = x_std && test '!' -d "$erl_xcomp_sysroot$dir$ldir"],
+ [continue])
+ AS_IF([test "$dir" = "/"],
+ [libdir="$ldir"],
+ [libdir="$dir$ldir"])
+ ded_ld_rpath="$ded_ld_rpath $ded_ld_rflg$libdir"
+ rpath="$rpath:$libdir"
+ done
+ done
+ ])
+
+ # Check that it still links when we add the runtime path...
+ ERL_LINK_CRYPTO_IFELSE(["$SSL_INCLUDE"],
+ ["$ded_ld_rpath -L$SSL_LIBDIR"],
+ ["-l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"],
+ [rpath_success=yes],
+ [rpath_success=no])
+
+ AS_IF([test "$rpath_success" = "yes"], [break])
+
+ done
+
+ AS_IF([test "$rpath_success" != "yes"],
+ [
+ ded_ld_rpath=
+ rpath=
+ ])
+
+ SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
+
+ AS_IF([test "$rpath" != ""],
+ [
+ AC_MSG_RESULT([$rpath])
+ ],
+ [test "$with_ssl_rpath" = yes],
+ [
+ AC_MSG_ERROR([requested by user, but could not be used])
+ ],
+ [
+ AC_MSG_WARN([unable to set run path during linking])
+ ])
+ ])
+ # end yes|default
+ ],
+ [
+ # Use ssl runtime library paths set by --with-ssl-rpath
+ AC_MSG_CHECKING([whether runtime library path can be set])
+
+ AS_IF([test $enable_dynamic_ssl = no],
+ [
+ AC_MSG_ERROR([runtime library path requested by user, but user also requested static linking])
+ ],
+ [test "$CRYPTO_APP" = ""],
+ [
+ AS_IF([test "$with_ssl_rpath" = yes],
+ [AC_MSG_ERROR([runtime library path requested by user, but could not be set since no crypto library was found])])
+ AC_MSG_RESULT([])
+ ],
+ [test "$ded_ld_rflg" = ""],
+ [
+ AS_IF([test "$with_ssl_rpath" = yes],
+ [AC_MSG_ERROR([runtime library path requested by user, but cannot be set on this platform])])
+ AC_MSG_RESULT([])
+ ]
+ [test "$SSL_DYNAMIC_ONLY" != "yes"],
+ [
+ AS_IF([test "$with_ssl_rpath" = yes],
+ [AC_MSG_WARN([runtime library path requested by user, but dynamic linking will not be used])],
+ [AC_MSG_RESULT([])])
+ ],
+ [
+ # Check that it links...
+ ded_ld_rpath=
+ delimit=
+ rpath=
+ rpath_delimit=
+ save_ifs="$IFS"; IFS=",:"
+ for dir in $with_ssl_rpath; do
+ ded_ld_rpath="$ded_ld_rpath$delimit$ded_ld_rflg$dir"
+ delimit=" "
+ rpath="$rpath$rpath_delimit$dir"
+ rpath_delimit=":"
+ done
+ IFS="$save_ifs"
+ SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
+ ERL_LINK_CRYPTO_IFELSE(["$SSL_INCLUDE"],
+ ["$ded_ld_rpath -L$SSL_LIBDIR"],
+ ["-l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"],
+ [rpath_success=yes],
+ [rpath_success=no])
+ AS_IF([test "$rpath_success" = yes],
+ [AC_MSG_RESULT([yes; using $rpath])],
+ [AC_MSG_ERROR([runtime library path requested by user, but link failed])])
+ ])
+ ])dnl AS_CASE
+
+AC_ARG_ENABLE(fips,
+AS_HELP_STRING([--enable-fips], [enable OpenSSL FIPS mode support])
+AS_HELP_STRING([--disable-fips], [disable OpenSSL FIPS mode support (default)]),
+[ case "$enableval" in
+ yes) enable_fips_support=yes ;;
+ *) enable_fips_support=no ;;
+ esac ], enable_fips_support=no)
+
+SSL_FLAGS=
+AS_IF([test "$enable_fips_support" = "yes"],
+ [
+ AS_IF([test "$CRYPTO_APP" = ""],
+ [AC_MSG_ERROR([FIPS support requested, but no crypto library found])])
+ saveCFLAGS="$CFLAGS"
+ saveLDFLAGS="$LDFLAGS"
+ saveLIBS="$LIBS"
+ CFLAGS="$DED_BASIC_CFLAGS $SSL_INCLUDE"
+ AS_IF([test $SSL_DYNAMIC_ONLY = yes],
+ [
+ LDFLAGS="$DED_LDFLAGS_CONFTEST $ded_ld_rpath -L$SSL_LIBDIR"
+ LIBS="$LIBS -l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"
+ ],
+ [
+ LDFLAGS="$DED_LDFLAGS_CONFTEST"
+ AS_IF([test "$host_os" = "win32"],
+ [LIBS="$LIBS $SSL_LIBDIR/$SSL_CRYPTO_LIBNAME.lib $SSL_EXTRA_LIBS"],
+ [LIBS="$LIBS $SSL_LIBDIR/lib$SSL_CRYPTO_LIBNAME.a $SSL_EXTRA_LIBS"])
+ ])
+ AC_CHECK_FUNC([FIPS_mode_set],
+ [SSL_FLAGS="-DFIPS_SUPPORT"],
+ [AC_MSG_ERROR([FIPS support requested, but cannot be enabled])])
+ CFLAGS="$saveCFLAGS"
+ LDFLAGS="$saveLDFLAGS"
+ LIBS="$saveLIBS"
+ ])
+
+AS_IF([test "x$v3_include" = "xyes"],
+ [echo "Using OpenSSL 3.0 is not yet recommended for production code." >> ./CONF_INFO
+ AC_MSG_WARN(******************************************************************)
+ AC_MSG_WARN(* Using OpenSSL 3.0 is not yet recommended for production code. *)
+ AS_IF([test "x$SSL_DYNAMIC_ONLY" = "xno" ],
+ [echo "Static linking with OpenSSL 3.0 *MAY* require special configuring of the cryptolib." >> ./CONF_INFO
+ AC_MSG_WARN(* Static linking *MAY* require re-configuring the 3.0 cryptolib. *)
+ ])
+ AC_MSG_WARN(******************************************************************)
+ ])
+
+AS_IF([test "x$v3_include" = "xyes" && test "x$deprecated_warnings" = "xdefault_yes" && test "$CRYPTO_APP" != ""],
+ [deprecated_warnings=no
+ ])
+
+AS_IF([test "x$deprecated_warnings" = "xno" && test "$CRYPTO_APP" != ""],
+ [SSL_FLAGS="$SSL_FLAGS -Wno-deprecated-declarations"
+ ])
+
+saveCFLAGS="$CFLAGS"
+saveLDFLAGS="$LDFLAGS"
+saveLIBS="$LIBS"
+CFLAGS="$DED_BASIC_CFLAGS $SSL_INCLUDE"
+AS_IF([test $SSL_DYNAMIC_ONLY = yes],
+ [
+ LDFLAGS="$DED_LDFLAGS_CONFTEST $ded_ld_rpath -L$SSL_LIBDIR"
+ LIBS="$LIBS -l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"
+ ],
+ [
+ LDFLAGS="$DED_LDFLAGS_CONFTEST"
+ AS_IF([test "$host_os" = "win32"],
+ [LIBS="$LIBS $SSL_LIBDIR/$SSL_CRYPTO_LIBNAME.lib $SSL_EXTRA_LIBS"],
+ [LIBS="$LIBS $SSL_LIBDIR/lib$SSL_CRYPTO_LIBNAME.a $SSL_EXTRA_LIBS"])
+ ])
+AC_CHECK_DECL([CRYPTO_memcmp],
+ [have_crypto_memcmp_decl=yes],
+ [have_crypto_memcmp_decl=no],
+ [#include <openssl/crypto.h>])
+AS_IF([test $have_crypto_memcmp_decl = yes],
+ [
+ AC_MSG_CHECKING([whether CRYPTO_memcmp can be linked])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[
+ #include <openssl/crypto.h>
+ ]],
+ [[
+ CRYPTO_memcmp("a", "b", 1);
+ ]])],
+ [
+ SSL_FLAGS="-DHAVE_OPENSSL_CRYPTO_MEMCMP $SSL_FLAGS"
+ AC_MSG_RESULT([yes])
+ ],
+ [
+ AC_MSG_RESULT([no])
+ ])
+ ])
+CFLAGS="$saveCFLAGS"
+LDFLAGS="$saveLDFLAGS"
+LIBS="$saveLIBS"
+
+AC_SUBST(SSL_INCLUDE)
+AC_SUBST(SSL_INCDIR)
+AC_SUBST(SSL_LIBDIR)
+AC_SUBST(SSL_FLAGS)
+AC_SUBST(SSL_CRYPTO_LIBNAME)
+AC_SUBST(SSL_SSL_LIBNAME)
+AC_SUBST(SSL_EXTRA_LIBS)
+AC_SUBST(SSL_DED_LD_RUNTIME_LIBRARY_PATH)
+AC_SUBST(SSL_DYNAMIC_ONLY)
+AC_SUBST(DISABLE_EVP_DH)
+AC_SUBST(DISABLE_EVP_HMAC)
+AC_SUBST(DISABLE_OTP_TEST_ENGINE)
+
+AC_CONFIG_FILES([c_src/$host/Makefile:c_src/Makefile.in])
+AC_OUTPUT
+
diff --git a/lib/crypto/configure.in b/lib/crypto/configure.in
deleted file mode 100644
index 377acccd80..0000000000
--- a/lib/crypto/configure.in
+++ /dev/null
@@ -1,871 +0,0 @@
-dnl Process this file with autoconf to produce a configure script. -*-m4-*-
-dnl
-dnl %CopyrightBegin%
-dnl
-dnl Copyright Ericsson AB 2018-2022. All Rights Reserved.
-dnl
-dnl Licensed under the Apache License, Version 2.0 (the "License");
-dnl you may not use this file except in compliance with the License.
-dnl You may obtain a copy of the License at
-dnl
-dnl http://www.apache.org/licenses/LICENSE-2.0
-dnl
-dnl Unless required by applicable law or agreed to in writing, software
-dnl distributed under the License is distributed on an "AS IS" BASIS,
-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-dnl See the License for the specific language governing permissions and
-dnl limitations under the License.
-dnl
-dnl %CopyrightEnd%
-dnl
-
-dnl define([AC_CACHE_LOAD], )dnl
-dnl define([AC_CACHE_SAVE], )dnl
-
-
-AC_INIT(vsn.mk)
-
-## Delete previous failed configure results
-if test -f ./CONF_INFO; then
- rm ./CONF_INFO
-fi
-
-AC_CONFIG_AUX_DIRS(${ERL_TOP}/erts/autoconf)
-
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- AC_CANONICAL_HOST
-else
- host_os=win32
-fi
-
-AC_LANG(C)
-
-LM_PRECIOUS_VARS
-
-if test "$cross_compiling" = "yes"; then
- CROSS_COMPILING=yes
-else
- CROSS_COMPILING=no
-fi
-AC_SUBST(CROSS_COMPILING)
-
-ERL_XCOMP_SYSROOT_INIT
-
-AC_PROG_CC
-LM_WINDOWS_ENVIRONMENT
-
-ERL_DED
-
-AC_MSG_CHECKING([for multiarch directory])
-multiarch_dir=
-if test "$GCC" = "yes"; then
- multiarch_dir=`$CC $CFLAGS -print-multiarch 2>/dev/null`
- if test $? -ne 0; then
- multiarch_dir=
- fi
-fi
-if test "$multiarch_dir" = ""; then
- AC_MSG_RESULT([not found])
-else
- AC_MSG_RESULT([$multiarch_dir])
-fi
-
-dnl
-dnl SSL, SSH and CRYPTO need the OpenSSL libraries
-dnl
-dnl Check flags --with-ssl, --without-ssl --with-ssl=PATH.
-dnl If no option is given or --with-ssl is set without a path then we
-dnl search for OpenSSL libraries and header files in the standard locations.
-dnl If set to --without-ssl we disable the use of SSL, SSH and CRYPTO.
-dnl If set to --with-ssl=PATH we use that path as the prefix, i.e. we
-dnl use "PATH/include" and "PATH/lib".
-
-AC_CHECK_SIZEOF(void *)
-
-std_ssl_locations="/usr/local /usr/sfw /usr /opt/local /usr/pkg /usr/local/openssl /usr/local/opt/openssl /usr/lib/openssl /usr/openssl /usr/local/ssl /usr/lib/ssl /usr/ssl /"
-
-AC_ARG_WITH(ssl,
-AS_HELP_STRING([--with-ssl=PATH], [base location of OpenSSL include and lib directories])
-AS_HELP_STRING([--with-ssl], [use SSL (default)])
-AS_HELP_STRING([--without-ssl], [don't use SSL]))
-
-AC_ARG_WITH(ssl-lib-subdir,
-AS_HELP_STRING([--with-ssl-lib-subdir=RELATIVE_PATH],
- [specify extra OpenSSL lib sub-directory to search in (relative to base directory)]),
-[
-case "$with_ssl_lib_subdir" in
- yes|no)
- with_ssl_lib_subdir=
- ;;
- *)
- ;;
-esac
-],
-[with_ssl_lib_subdir=]) #default
-
-AC_ARG_WITH(ssl-incl,
-AS_HELP_STRING([--with-ssl-incl=PATH],
- [base location of OpenSSL include dir (if different than base location specified by --with-ssl=PATH)]),
-[
-case X$with_ssl in
- X | Xyes | Xno) AC_MSG_ERROR([--with-ssl-incl=PATH set without --with-ssl=PATH]);;
-esac
-],
-[with_ssl_incl=$with_ssl]) #default
-
-AC_ARG_WITH(ssl-zlib,
-AS_HELP_STRING([--with-ssl-zlib=PATH], [Path to static zlib library to link the
- crypto NIF with. This zlib library is most
- often not necessary but might be needed in
- order to link the NIF in some cases.]),
-[], [with_ssl_zlib=default]) #default
-
-AC_ARG_WITH(ssl-rpath,
-AS_HELP_STRING([--with-ssl-rpath=yes|no|PATHS],
- [runtime library path for OpenSSL. Default is "yes", which equates to a
- number of standard locations. If "no", then no runtime
- library paths will be used. Anything else should be a
- comma or colon separated list of paths.]),
-[
-case X$with_ssl in
- Xno) AC_MSG_ERROR([--with-ssl-rpath set without --with-ssl]);;
-esac
-],
-[with_ssl_rpath=default]) #default
-
-
-AC_ARG_ENABLE(dynamic-ssl-lib,
-AS_HELP_STRING([--enable-dynamic-ssl-lib],
- [enable using dynamic openssl libraries when linking the crypto NIF])
-AS_HELP_STRING([--disable-dynamic-ssl-lib],
- [disable using dynamic openssl libraries when linking the crypto NIF]),
-[ case "$enableval" in
- no) enable_dynamic_ssl=no ;;
- *) enable_dynamic_ssl=yes ;;
- esac ], enable_dynamic_ssl=undefined)
-
-AC_ARG_ENABLE(evp-dh,
-AS_HELP_STRING([--disable-evp-dh],
- [intentionally undocumented workaround]),
-[ case "$enableval" in
- no) DISABLE_EVP_DH=1;;
- *) DISABLE_EVP_DH=0;;
- esac ], DISABLE_EVP_DH=0)
-
-
-AC_ARG_ENABLE(evp-hmac,
-AS_HELP_STRING([--disable-evp-hmac],
- [intentionally undocumented workaround]),
-[ case "$enableval" in
- no) DISABLE_EVP_HMAC=1;;
- *) DISABLE_EVP_HMAC=0;;
- esac ], DISABLE_EVP_HMAC=0)
-
-
-AC_ARG_ENABLE(otp-test-engine,
-AS_HELP_STRING([--disable-otp-test-engine],
- [Disable build of the otp_test_engine. (default is --enable-otp-test-engine, unless for LibreSSL >= 3.5.0 where default is --disable-otp-test-engine)]),
-[ case "$enableval" in
- no) DISABLE_OTP_TEST_ENGINE=yes;;
- *) DISABLE_OTP_TEST_ENGINE=no;;
- esac ], DISABLE_OTP_TEST_ENGINE=default)
-
-AC_ARG_ENABLE(deprecated_warnings,
-AS_HELP_STRING([--disable-deprecated-warnings],
- [disable warnings for deprecated functions in cryptolib (default is to warn, except for OpenSSL 3.x where the default is not to warn)]),
-[ case "$enableval" in
- no) deprecated_warnings=no;;
- *) deprecated_warnings=yes;;
- esac ], deprecated_warnings=default_yes)
-
-AC_DEFUN([ERL_LINK_CRYPTO_IFELSE], [
- test_cflags=$1
- test_ldflags=$2
- test_libs=$3
-
- saveCFLAGS="$CFLAGS"
- saveLDFLAGS="$LDFLAGS"
- saveLIBS="$LIBS"
- CFLAGS="$DED_BASIC_CFLAGS $test_cflags"
- LDFLAGS="$DED_LDFLAGS_CONFTEST $test_ldflags"
- LIBS="$LIBS $test_libs"
-
- AC_LINK_IFELSE(
- [AC_LANG_PROGRAM(
- [[
- #include <stdio.h>
- #include <openssl/hmac.h>
- ]],
- [[
- HMAC(0, 0, 0, 0, 0, 0, 0);
- ]])],
- [
- $4
- ],
- [
- $5
- ])
-
- CFLAGS="$saveCFLAGS"
- LDFLAGS="$saveLDFLAGS"
- LIBS="$saveLIBS"
-])
-
-AC_DEFUN([ERL_CRYPTO_CHECK_LIB], [
- # Check for static and dynamic crypto library in the directory
- # given as argument...
- #
- # Written as a macro in order to avoid writing the tests twice...
- idir=$1
- prfx=$2
- rdir=$3
- dir="$prfx$rdir"
- static_crypto_lib_name=crypto
- static_ssl_lib_name=ssl
- static_extra_libs="$forced_static_zlib"
- static_lib_dir=
- dynamic_crypto_lib_name=crypto
- dynamic_ssl_lib_name=ssl
- dynamic_extra_libs="$forced_static_zlib"
- dynamic_lib_dir=
- dynamic_runtime_lib_dir=
- found_static_lib=no
- found_dynamic_lib=no
-
- save_CPPFLAGS=$CPPFLAGS
- CPPFLAGS="-I$idir/include"
- AC_EGREP_CPP(^yes.?$,[
-#include <openssl/opensslv.h>
-#if OPENSSL_VERSION_NUMBER >= 0x0090803fL
-yes
-#endif
- ],
- [valid_include=yes],
- [valid_include=no])
- AC_EGREP_CPP(^yes.?$,[
-#include <openssl/opensslv.h>
-#if OPENSSL_VERSION_MAJOR == 3
-yes
-#endif
- ],
- [v3_include=yes],
- [v3_include=no])
-
-if test "x$DISABLE_OTP_TEST_ENGINE" = "xdefault"; then
-# Get default value for the --disable-otp-test-engine. Depends on cryptolib version
- AC_EGREP_CPP(^yes.?$,[
-#include <openssl/opensslv.h>
-#if LIBRESSL_VERSION_NUMBER >= 0x3050000fL
-yes
-#endif
- ],
- [DISABLE_OTP_TEST_ENGINE=yes],
- [DISABLE_OTP_TEST_ENGINE=no])
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
-
- if test $valid_include != yes; then
- static_crypto_lib_name=
- static_ssl_lib_name=
- static_extra_libs=
- static_lib_dir=
- dynamic_crypto_lib_name=
- dynamic_ssl_lib_name=
- dynamic_extra_libs=
- dynamic_lib_dir=
- dynamic_runtime_lib_dir=
- elif test "$host_os" = "win32" ; then
- if test -f "$dir/lib/VC/static/libcrypto${lib_bits}MD.lib"; then
- static_crypto_lib_name=libcrypto${lib_bits}MD
- static_ssl_lib_name="libssl${lib_bits}MD"
- static_extra_libs="$static_extra_libs -lCRYPT32 -lWS2_32"
- static_lib_dir="$dir/lib/VC/static"
- found_static_lib=yes
- fi
- if test -f "$dir/lib/VC/libcrypto${lib_bits}MD.lib"; then
- dynamic_crypto_lib_name=libcrypto${lib_bits}MD
- dynamic_ssl_lib_name="libssl${lib_bits}MD"
- dynamic_runtime_lib_dir="$rdir/lib/VC"
- dynamic_lib_dir="$dir/lib/VC"
- found_dynamic_lib=yes
- fi
- else # Non windows...
-
- case "$host_os" in
- darwin*)
- static_ext=.a
- dynamic_ext=.dylib;;
- *)
- static_ext=.a
- dynamic_ext=.so;;
- esac
- for sdir in $search_subdirs; do
- if test -f "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"; then
- found_dynlib=yes
- else
- found_dynlib=no
- case $host_os in
- openbsd*)
- # libcrypto.so got a suffix on (at least some) openbsd.
- # If we find libcrypto.so with suffix, we try to link
- # to it using -lcrypto ...
- for f in "$dir/$sdir/lib$dynamic_crypto_lib_name$dynamic_ext"*; do
- test -f "$f" && found_dynlib=yes
- break
- done;;
- *)
- ;;
- esac
- fi
- if test $found_dynlib = yes; then
- # Found dynamic library; check if it links...
- dynamic_lib_dir="$dir/$sdir"
- dynamic_runtime_lib_dir="$rdir/$sdir"
- ERL_LINK_CRYPTO_IFELSE(
- ["-I$idir/include"],
- ["-L$dynamic_lib_dir"],
- ["-l$dynamic_crypto_lib_name $dynamic_extra_libs"],
- [found_dynamic_lib=yes],
- [found_dynamic_lib=no])
- if test $found_dynamic_lib = no -a $static_zlib != no; then
- # No, but linking with zlib as well might help...
- dynamic_extra_libs="$dynamic_extra_libs $static_zlib"
- ERL_LINK_CRYPTO_IFELSE(
- ["-I$idir/include"],
- ["-L$dynamic_lib_dir"],
- ["-l$dynamic_crypto_lib_name $dynamic_extra_libs"],
- [found_dynamic_lib=yes],
- [found_dynamic_lib=no])
- fi
- fi
- if test -f "$dir/$sdir/lib$static_crypto_lib_name$static_ext"; then
- # Found static library; check if it links...
- static_lib_dir="$dir/$sdir"
- ERL_LINK_CRYPTO_IFELSE(
- ["-I$idir/include"],
- [],
- ["$dir/$sdir/lib$static_crypto_lib_name$static_ext $static_extra_libs"],
- [found_static_lib=yes],
- [found_static_lib=no])
- if test $found_static_lib = no -a $static_zlib != no; then
- # No, but inking with zlib as well might help...
- static_extra_libs="$static_extra_libs $static_zlib"
- ERL_LINK_CRYPTO_IFELSE(
- ["-I$idir/include"],
- [],
- ["$dir/$sdir/lib$static_crypto_lib_name$static_ext $static_extra_libs"],
- [found_static_lib=yes],
- [found_static_lib=no])
- fi
- fi
- if test $found_static_lib = yes -o $found_dynamic_lib = yes; then
- break
- fi
- done
- fi
-])
-
-# Remove all SKIP files from previous runs
-for a in ssl crypto ssh; do
- rm -f "$ERL_TOP/lib/$a/SKIP"
-done
-
-# Setup subdirectories to search in...
-search_subdirs="lib"
-if test "$ac_cv_sizeof_void_p" = "8"; then
- search_subdirs="$search_subdirs lib64 lib/64"
-else
- search_subdirs="$search_subdirs lib32 lib/32"
-fi
-test "$multiarch_dir" = "" || search_subdirs="lib/$multiarch_dir $search_subdirs"
-test "$with_ssl_lib_subdir" = "" || search_subdirs="$with_ssl_lib_subdir $search_subdirs"
-
-# We might need to link with zlib, so first check if we can find
-# a static zlib to use if needed...
-static_zlib=no
-forced_static_zlib=
-case "$with_ssl_zlib" in
- no)
- ;;
- default | yes)
- AC_MSG_CHECKING([for static zlib])
- for dir in $std_ssl_locations; do
- for sdir in $search_subdirs; do
- if test -f "$erl_xcomp_sysroot$dir/$sdir/libz.a"; then
- static_zlib="$erl_xcomp_sysroot$dir/$sdir/libz.a"
- break
- fi
- done
- test "$static_zlib" = "no" || break
- done
- AC_MSG_RESULT([$static_zlib])
- if test $with_ssl_zlib = yes; then
- if test $static_zlib = no; then
- AC_MSG_ERROR([linking with zlib requested by user, but no such library was found])
- fi
- forced_static_zlib="$static_zlib"
- static_zlib=no
- fi;;
- *) # PATH
- AC_MSG_CHECKING([for static zlib])
- if test -f "$with_ssl_zlib/libz.a"; then
- forced_static_zlib="$with_ssl_zlib/libz.a"
- else
- for sdir in $search_subdirs; do
- if test -f "$with_ssl_zlib/$sdir/libz.a"; then
- forced_static_zlib="$with_ssl_zlib/$sdir/libz.a"
- break
- fi
- done
- fi
- if test "$forced_static_zlib" = ""; then
- AC_MSG_ERROR([linking with zlib requested by user, but no such library was found in $with_ssl_zlib])
- fi
- AC_MSG_RESULT([$forced_static_zlib])
- ;;
-esac
-
-if test $enable_dynamic_ssl = undefined; then
- if test "$host_os" = "win32" ; then
- enable_dynamic_ssl=default_no
- else
- enable_dynamic_ssl=default_yes
- fi
-fi
-
-case $enable_dynamic_ssl in
- yes|default_yes)
- SSL_DYNAMIC_ONLY=yes;;
- *)
- SSL_DYNAMIC_ONLY=no;;
-esac
-
-case "$erl_xcomp_without_sysroot-$with_ssl" in
- yes-* | no-no)
- SSL_APP=
- CRYPTO_APP=
- SSH_APP=
- if test "$with_ssl" != "no"; then
- skip="Cannot search for ssl; missing cross system root (erl_xcomp_sysroot)."
- fi
- for a in ssl crypto ssh; do
- echo "$skip" > $ERL_TOP/lib/$a/SKIP
- done
- ;;
- no-yes | no- )
- # We search for OpenSSL in the common OS standard locations.
- SSL_APP=ssl
- CRYPTO_APP=crypto
- SSH_APP=ssh
-
- if test "$host_os" = "win32" ; then
- if test "x$ac_cv_sizeof_void_p" = "x8"; then
- std_win_ssl_locations="/mnt/c/OpenSSL-Win64 /c/OpenSSL-Win64 /mnt/c/opt/local64/pgm/OpenSSL /opt/local64/pgm/OpenSSL /cygdrive/c/OpenSSL-Win64"
- lib_bits=64
- else
- std_win_ssl_locations="/mnt/c/OpenSSL-Win32 /c/OpenSSL-Win32 /mnt/c/OpenSSL /c/OpenSSL /cygdrive/c/OpenSSL /opt/local/pgm/OpenSSL /opt/local32/pgm/OpenSSL /mnt/c/opt/local/pgm/OpenSSL /mnt/c/opt/local32/pgm/OpenSSL /cygdrive/c/OpenSSL-Win32"
- lib_bits=32
- fi
- else
- std_win_ssl_locations=""
- fi
-
- usable_crypto=no
- AC_MSG_CHECKING([for OpenSSL crypto library with version >= 0.9.8c in standard locations])
- for rdir in $std_win_ssl_locations $std_ssl_locations; do
- if test -f "$erl_xcomp_isysroot$rdir/include/openssl/opensslv.h"; then
- SSL_INCDIR="$erl_xcomp_isysroot$rdir"
- SSL_INCLUDE="-I$SSL_INCDIR/include"
- ERL_CRYPTO_CHECK_LIB(["$SSL_INCDIR"], ["$erl_xcomp_sysroot"], ["$rdir"])
- case $enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib in
- no-*-no)
- ;; # Dynamic linking against ssl library disabled by user, and no static library found
- yes-no-*)
- ;; # Static linking against ssl library disabled by user, and no dynamic library found
- *-no-no)
- ;; # Neither static nor dynamic ssl library found
- no-*-yes | default_no-*-yes | default_yes-no-yes)
- # Link statically...
- SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
- SSL_SSL_LIBNAME=$static_ssl_lib_name
- SSL_LIBDIR="$static_lib_dir"
- SSL_EXTRA_LIBS="$static_extra_libs"
- SSL_RUNTIME_LIBDIR=
- SSL_DYNAMIC_ONLY=no
- usable_crypto=yes
- break;;
- *-yes-*)
- # Link dynamically...
- SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
- SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
- SSL_EXTRA_LIBS="$dynamic_extra_libs"
- SSL_LIBDIR="$dynamic_lib_dir"
- SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
- SSL_DYNAMIC_ONLY=yes
- usable_crypto=yes
- break;;
- esac
- fi
- done
-
- if test $usable_crypto = yes ; then
- if test $SSL_DYNAMIC_ONLY = yes; then
- AC_MSG_RESULT([dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])
- else
- AC_MSG_RESULT([static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])
- fi
- else
- AC_MSG_RESULT([no])
- SSL_APP=
- CRYPTO_APP=
- SSH_APP=
-
- SSL_INCDIR=
- SSL_INCLUDE=
- SSL_CRYPTO_LIBNAME=
- SSL_SSL_LIBNAME=
- SSL_INCDIR=
- SSL_RUNTIME_LIBDIR=
- SSL_LIBDIR=
-
- case "$with_ssl-$enable_dynamic_ssl" in
- yes-yes)
- AC_MSG_ERROR([crypto library with dynamic linking requested by user, but no such library was found])
- ;;
- yes-no)
- AC_MSG_ERROR([crypto library with static linking requested by user, but no such library was found])
- ;;
- yes-*)
- AC_MSG_ERROR([crypto library requested by user, but no such library was found])
- ;;
- *)
- AC_MSG_WARN([No (usable) OpenSSL found, skipping ssl, ssh and crypto applications])
- ;;
- esac
-
- for a in ssl crypto ssh; do
- echo "No usable OpenSSL found" > $ERL_TOP/lib/$a/SKIP
- done
- fi
- ;;
- *)
- # Option given with PATH to package
- if test ! -d "$with_ssl" ; then
- AC_MSG_ERROR(Invalid path to option --with-ssl=PATH)
- fi
- if test ! -d "$with_ssl_incl" ; then
- AC_MSG_ERROR(Invalid path to option --with-ssl-incl=PATH)
- fi
- AC_MSG_CHECKING([for OpenSSL header in $with_ssl_incl])
- if test -f "$with_ssl_incl/include/openssl/opensslv.h"; then
- AC_MSG_RESULT([yes])
- else
- AC_MSG_ERROR([no OpenSSL header found in $with_ssl_incl])
- fi
- SSL_INCDIR="$with_ssl_incl"
- AC_MSG_CHECKING([for OpenSSL in $with_ssl])
- ERL_CRYPTO_CHECK_LIB(["$with_ssl_incl"], [""], ["$with_ssl"])
- case $enable_dynamic_ssl-$found_dynamic_lib-$found_static_lib in
- no-*-no)
- AC_MSG_ERROR([dynamic linking against crypto library disabled by user, but no static library found in $with_ssl]);;
- yes-no-*)
- AC_MSG_ERROR([static linking against crypto library disabled by user, but no dynamic library found in $with_ssl]);;
- *-no-no)
- AC_MSG_ERROR([neither static nor dynamic crypto library found in $with_ssl]);;
- no-*-yes | default_no-*-yes | default_yes-no-yes)
- # Link statically...
- SSL_CRYPTO_LIBNAME=$static_crypto_lib_name
- SSL_SSL_LIBNAME=$static_ssl_lib_name
- SSL_LIBDIR="$static_lib_dir"
- SSL_EXTRA_LIBS="$static_extra_libs"
- SSL_RUNTIME_LIBDIR=
- SSL_DYNAMIC_ONLY=no;;
- *-yes-*)
- # Link dynamically...
- SSL_CRYPTO_LIBNAME=$dynamic_crypto_lib_name
- SSL_SSL_LIBNAME=$dynamic_ssl_lib_name
- SSL_EXTRA_LIBS="$dynamic_extra_libs"
- SSL_LIBDIR="$dynamic_lib_dir"
- SSL_RUNTIME_LIBDIR="$dynamic_runtime_lib_dir"
- SSL_DYNAMIC_ONLY=yes;;
- esac
- if test $SSL_DYNAMIC_ONLY = yes; then
- AC_MSG_RESULT([dynamic $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])
- else
- AC_MSG_RESULT([static $SSL_CRYPTO_LIBNAME library in $SSL_LIBDIR])
- fi
- SSL_INCLUDE="-I$with_ssl_incl/include"
- SSL_APP=ssl
- CRYPTO_APP=crypto
- SSH_APP=ssh
- if test "$cross_compiling" = "yes"; then
- SSL_RUNTIME_LIBDIR=`echo "$SSL_LIBDIR" | sed -n "s|^$erl_xcomp_sysroot\(/*\)\(.*\)\$|/\2|p"`
- else
- SSL_RUNTIME_LIBDIR="$SSL_LIBDIR"
- fi
-esac
-
-SSL_DED_LD_RUNTIME_LIBRARY_PATH=
-ded_ld_rflg="$DED_LD_FLAG_RUNTIME_LIBRARY_PATH"
-
-
-case "$with_ssl_rpath" in
-
-yes | default) # Use standard lib locations for ssl runtime library path
-
- AC_MSG_CHECKING([for runtime library path to use])
-
- if test $enable_dynamic_ssl = no -a "$with_ssl_rpath" = yes; then
- AC_MSG_ERROR([requested by user, but user also requested static linking])
- fi
-
- if test "$CRYPTO_APP" = ""; then
- if test "$with_ssl_rpath" = yes; then
- AC_MSG_ERROR([requested by user, but could not be used since no crypto library was found])
- fi
- AC_MSG_RESULT([])
- elif test "$ded_ld_rflg" = ""; then
- if test "$with_ssl_rpath" = yes; then
- AC_MSG_ERROR([requested by user, but cannot be set on this platform])
- fi
- AC_MSG_RESULT([])
- elif test "$SSL_DYNAMIC_ONLY" != "yes"; then
- if test "$with_ssl_rpath" = yes; then
- AC_MSG_WARN([requested by user, but dynamic linking will not be used])
- else
- AC_MSG_RESULT([])
- fi
- else
-
- libdirs="/lib"
-
- dir_lib64=no
- dir_lib_64=no
- dir_lib32=no
- dir_lib_32=no
- dir_multiarch=no
- dir_with_ssl_lib_subdir=no
-
- test "$multiarch_dir" = "" || dir_multiarch=yes
- test "$with_ssl_lib_subdir" = "" || dir_with_ssl_lib_subdir=yes
-
- case "$SSL_RUNTIME_LIBDIR" in
- */lib/64 | */lib/64/ ) dir_lib_64=yes;;
- */lib64 | */lib64/ ) dir_lib64=yes;;
- */lib/32 | */lib/32/ ) dir_lib_32=yes;;
- */lib32 | */lib32/ ) dir_lib32=yes;;
- *) ;;
- esac
-
- for dir in $std_ssl_locations; do
- if test "$ac_cv_sizeof_void_p" = "8"; then
- test $dir_lib_64 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib/64" &&
- dir_lib_64=yes
- test $dir_lib64 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib64" &&
- dir_lib64=yes
- else
- test $dir_lib_32 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib/32" &&
- dir_lib_32=yes
- test $dir_lib32 = no &&
- test -d "$erl_xcomp_sysroot$dir/lib32" &&
- dir_lib32=yes
- fi
- test $dir_multiarch = no &&
- test -d "$erl_xcomp_sysroot$dir/lib/$multiarch_dir" &&
- dir_multiarch=yes
- done
-
- test $dir_with_ssl_lib_subdir = yes && libdirs="/$with_ssl_lib_subdir $libdirs"
- test $dir_multiarch = yes && libdirs="/lib/$multiarch_dir $libdirs"
- test $dir_lib_64 = yes && libdirs="/lib/64 $libdirs"
- test $dir_lib64 = yes && libdirs="/lib64 $libdirs"
- test $dir_lib_32 = yes && libdirs="/lib/32 $libdirs"
- test $dir_lib32 = yes && libdirs="/lib32 $libdirs"
-
- #
- # We try the following runtime paths in the
- # following order:
- # 1. Standard ssl locations with all variations
- # of lib subdirectories that we know of
- # 2. Standard ssl locations with all variations
- # of lib subdirectories that we know of and
- # exist on this machine
- # 3. Determined $SSL_RUNTIME_LIBDIR
- # If none of the above links, we skip runtime
- # library path...
- #
- for type in std x_std curr; do
-
- ded_ld_rpath="$ded_ld_rflg$SSL_RUNTIME_LIBDIR"
- rpath="$SSL_RUNTIME_LIBDIR"
-
- if test $type != curr; then
- for ldir in $libdirs; do
- for dir in $std_ssl_locations; do
- test "$SSL_RUNTIME_LIBDIR" != "$dir$ldir" || continue
- test $type != x_std || test -d "$erl_xcomp_sysroot$dir$ldir" || continue
- if test "$dir" = "/"; then
- libdir="$ldir"
- else
- libdir="$dir$ldir"
- fi
- ded_ld_rpath="$ded_ld_rpath $ded_ld_rflg$libdir"
- rpath="$rpath:$libdir"
- done
- done
- fi
-
- # Check that it still links when we add the runtime path...
- ERL_LINK_CRYPTO_IFELSE(
- ["$SSL_INCLUDE"],
- ["$ded_ld_rpath -L$SSL_LIBDIR"],
- ["-l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"],
- [rpath_success=yes],
- [rpath_success=no])
-
- test "$rpath_success" = "yes" && break
- done
-
- test "$rpath_success" = "yes" || { ded_ld_rpath=; rpath=; }
-
- SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
-
- if test "$rpath" != ""; then
- AC_MSG_RESULT([$rpath])
- elif test "$with_ssl_rpath" = yes; then
- AC_MSG_ERROR([requested by user, but could not be used])
- else
- AC_MSG_WARN([unable to set run path during linking])
- fi
- fi
- ;;
-
-no) # Use no ssl runtime library path
- SSL_DED_LD_RUNTIME_LIBRARY_PATH=
- ;;
-
-*) # Use ssl runtime library paths set by --with-ssl-rpath (without any check)
- AC_MSG_CHECKING([whether runtime library path can be set])
-
- if test $enable_dynamic_ssl = no; then
- AC_MSG_ERROR([runtime library path requested by user, but user also requested static linking])
- elif test "$CRYPTO_APP" = ""; then
- if test "$with_ssl_rpath" = yes; then
- AC_MSG_ERROR([runtime library path requested by user, but could not be set since no crypto library was found])
- fi
- AC_MSG_RESULT([])
- elif test "$ded_ld_rflg" = ""; then
- if test "$with_ssl_rpath" = yes; then
- AC_MSG_ERROR([runtime library path requested by user, but cannot be set on this platform])
- fi
- AC_MSG_RESULT([])
- elif test "$SSL_DYNAMIC_ONLY" != "yes"; then
- if test "$with_ssl_rpath" = yes; then
- AC_MSG_WARN([runtime library path requested by user, but dynamic linking will not be used])
- else
- AC_MSG_RESULT([])
- fi
- else
- ded_ld_rpath=
- delimit=
- rpath=
- rpath_delimit=
- save_ifs="$IFS"; IFS=",:"
- for dir in $with_ssl_rpath; do
- ded_ld_rpath="$ded_ld_rpath$delimit$ded_ld_rflg$dir"
- delimit=" "
- rpath="$rpath$rpath_delimit$dir"
- rpath_delimit=":"
- done
- IFS="$save_ifs"
- SSL_DED_LD_RUNTIME_LIBRARY_PATH="$ded_ld_rpath"
- ERL_LINK_CRYPTO_IFELSE(
- ["$SSL_INCLUDE"],
- ["$ded_ld_rpath -L$SSL_LIBDIR"],
- ["-l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"],
- [rpath_success=yes],
- [rpath_success=no])
- if test "$rpath_success" = yes; then
- AC_MSG_RESULT([yes; using $rpath])
- else
- AC_MSG_ERROR([runtime library path requested by user, but link failed])
- fi
- fi
- ;;
-
-esac
-
-
-AC_ARG_ENABLE(fips,
-AS_HELP_STRING([--enable-fips], [enable OpenSSL FIPS mode support])
-AS_HELP_STRING([--disable-fips], [disable OpenSSL FIPS mode support (default)]),
-[ case "$enableval" in
- yes) enable_fips_support=yes ;;
- *) enable_fips_support=no ;;
- esac ], enable_fips_support=no)
-
-if test "x$enable_fips_support" = "xyes" && test "$CRYPTO_APP" != ""; then
- saveCFLAGS="$CFLAGS"
- saveLDFLAGS="$LDFLAGS"
- saveLIBS="$LIBS"
- CFLAGS="$DED_BASIC_CFLAGS $SSL_INCLUDE"
- if test $SSL_DYNAMIC_ONLY = yes; then
- LDFLAGS="$DED_LDFLAGS_CONFTEST $ded_ld_rpath -L$SSL_LIBDIR"
- LIBS="$LIBS -l$SSL_CRYPTO_LIBNAME $SSL_EXTRA_LIBS"
- else
- LDFLAGS="$DED_LDFLAGS_CONFTEST"
- if test "$host_os" = "win32" ; then
- LIBS="$LIBS $SSL_LIBDIR/$SSL_CRYPTO_LIBNAME.lib $SSL_EXTRA_LIBS"
- else
- LIBS="$LIBS $SSL_LIBDIR/lib$SSL_CRYPTO_LIBNAME.a $SSL_EXTRA_LIBS"
- fi
- fi
- AC_CHECK_FUNC([FIPS_mode_set],
- [SSL_FLAGS="-DFIPS_SUPPORT"],
- [SSL_FLAGS=])
- CFLAGS="$saveCFLAGS"
- LDFLAGS="$saveLDFLAGS"
- LIBS="$saveLIBS"
-else
- SSL_FLAGS=
-fi
-
-if test "x$v3_include" = "xyes"; then
- echo "Using OpenSSL 3.0 is not yet recommended for production code." >> ./CONF_INFO
- AC_MSG_WARN(******************************************************************)
- AC_MSG_WARN(* Using OpenSSL 3.0 is not yet recommended for production code. *)
-
- if test "x$SSL_DYNAMIC_ONLY" = "xno" ; then
- echo "Static linking with OpenSSL 3.0 *MAY* require special configuring of the cryptolib." >> ./CONF_INFO
- AC_MSG_WARN(* Static linking *MAY* require re-configuring the 3.0 cryptolib. *)
- fi
- AC_MSG_WARN(******************************************************************)
-fi
-
-if test "x$v3_include" = "xyes" && test "x$deprecated_warnings" = "xdefault_yes" && test "$CRYPTO_APP" != ""; then
- deprecated_warnings=no
-fi
-
-if test "x$deprecated_warnings" = "xno" && test "$CRYPTO_APP" != "" ; then
- SSL_FLAGS="$SSL_FLAGS -Wno-deprecated-declarations"
-fi
-
-AC_SUBST(SSL_INCLUDE)
-AC_SUBST(SSL_INCDIR)
-AC_SUBST(SSL_LIBDIR)
-AC_SUBST(SSL_FLAGS)
-AC_SUBST(SSL_CRYPTO_LIBNAME)
-AC_SUBST(SSL_SSL_LIBNAME)
-AC_SUBST(SSL_EXTRA_LIBS)
-AC_SUBST(SSL_DED_LD_RUNTIME_LIBRARY_PATH)
-AC_SUBST(SSL_DYNAMIC_ONLY)
-AC_SUBST(DISABLE_EVP_DH)
-AC_SUBST(DISABLE_EVP_HMAC)
-AC_SUBST(DISABLE_OTP_TEST_ENGINE)
-
-AC_OUTPUT(c_src/$host/Makefile:c_src/Makefile.in)
-
diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml
index 937a32f21a..d1876d6063 100644
--- a/lib/crypto/doc/src/crypto.xml
+++ b/lib/crypto/doc/src/crypto.xml
@@ -547,72 +547,67 @@
</desc>
</datatype>
- <datatype_title>Error types</datatype_title>
+ </datatypes>
- <datatype>
- <name name="run_time_error"/>
- <desc>
- <p>The exception <c>error:badarg</c> signifies that one or more arguments are of wrong data type,
- or are otherwise badly formed.
- </p>
- <p>The exception <c>error:notsup</c> signifies that the algorithm is known but is not supported
- by current underlying libcrypto or explicitly disabled when building that.
- </p>
- <p>For a list of supported algorithms, see <seemfa marker="#supports/1">supports(ciphers)</seemfa>.
- </p>
- </desc>
- </datatype>
- <datatype>
- <name name="descriptive_error"/>
- <desc>
- <p>This is a more developed variant of the older
- <seetype marker="#run_time_error">run_time_error()</seetype>.
- </p>
- <p>The exception is:</p>
- <pre>
- {Tag, {C_FileName,LineNumber}, Description}
+ <section>
+ <title>Exceptions</title>
+ <section>
+ <title>Atoms - the older style</title>
+ <marker id="error_old"/>
+ <p>The exception <c>error:badarg</c> signifies that one or more arguments are of wrong data type,
+ or are otherwise badly formed.
+ </p>
+ <p>The exception <c>error:notsup</c> signifies that the algorithm is known but is not supported
+ by current underlying libcrypto or explicitly disabled when building that.
+ </p>
+ <p>For a list of supported algorithms, see <seemfa marker="#supports/1">supports(ciphers)</seemfa>.
+ </p>
+ </section>
- Tag = badarg | notsup | error
- C_FileName = string()
- LineNumber = integer()
- Description = string()
- </pre>
+ <section>
+ <title>3-tuples - the new style</title>
+ <marker id="error_3tup"/>
+ <p>The exception is:</p>
+ <pre>
+error:{Tag, C_FileInfo, Description}
- <p>It is like the older type an exception of the <c>error</c> class. In addition they contain
- a descriptive text in English. That text is targeted to a developer. Examples are "Bad key size"
- or "Cipher id is not an atom".
- </p>
- <p>The exception tags are:</p>
- <taglist>
- <tag><c>badarg</c></tag>
- <item><p>Signifies that one or more arguments are of wrong data type or are otherwise badly formed.</p>
- </item>
+Tag = badarg | notsup | error
+C_FileInfo = term() % Usually only useful for the OTP maintainer
+Description = string() % Clear text, sometimes only useful for the OTP maintainer
+ </pre>
- <tag><c>notsup</c></tag>
- <item><p>Signifies that the algorithm is known but is not supported by current underlying libcrypto
- or explicitly disabled when building that one.</p>
- </item>
+ <p>The exception tags are:</p>
+ <taglist>
+ <tag><c>badarg</c></tag>
+ <item><p>Signifies that one or more arguments are of wrong data type or are otherwise badly formed.</p>
+ </item>
- <tag><c>error</c></tag>
- <item><p>An error condition that should not occur, for example a memory allocation failed or
- the underlying cryptolib returned an error code, for example "Can't initialize context, step 1".
- Those text usually needs searching the C-code to be understood.</p>
- </item>
- </taglist>
- <p>To catch the exception, use for example:</p>
- <code>
- try crypto:crypto_init(Ciph, Key, IV, true)
- catch
- error:{Tag, {C_FileName,LineNumber}, Description} ->
- do_something(......)
- .....
- end
- </code>
- </desc>
- </datatype>
+ <tag><c>notsup</c></tag>
+ <item><p>Signifies that the algorithm is known but is not supported by current underlying libcrypto
+ or explicitly disabled when building that one.</p>
+ </item>
- </datatypes>
+ <tag><c>error</c></tag>
+ <item><p>An error condition that should not occur, for example a memory allocation failed or
+ the underlying cryptolib returned an error code, for example <c>"Can't initialize context, step 1"</c>.
+ Those text usually needs searching the C-code to be understood.</p>
+ </item>
+ </taglist>
+
+ <p>Usually there are more information in the call stack about which argument caused the exception
+ and what the values where.</p>
+ <p>To catch the exception, use for example:</p>
+ <code>
+try crypto:crypto_init(Ciph, Key, IV, true)
+ catch
+ error:{Tag, _C_FileInfo, Description} ->
+ do_something(......)
+ .....
+end
+ </code>
+ </section>
+ </section>
<!--================ FUNCTIONS ================-->
@@ -622,6 +617,7 @@
<name name="crypto_init" arity="3" since="OTP 22.0"/>
<fsummary>Initializes a series of encryptions or decryptions</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Equivalent to the call
<seemfa marker="#crypto_init/4"><c>crypto_init(Cipher, Key, &lt;&lt;>>, FlagOrOptions)</c></seemfa>.
It is intended for ciphers without an IV (nounce).
@@ -633,6 +629,7 @@
<name name="crypto_init" arity="4" since="OTP 22.0"/>
<fsummary>Initializes a series of encryptions or decryptions</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
Initializes a series of encryptions or decryptions and creates an internal state
with a reference that is returned.
@@ -689,6 +686,7 @@
<name name="crypto_update" arity="2" since="OTP 22.0"/>
<fsummary>Do an actual crypto operation on a part of the full text</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
It does an actual crypto operation on a part of the full text. If the part is less
than a number of full blocks, only the full blocks (possibly none) are encrypted
@@ -708,6 +706,7 @@
<name name="crypto_dyn_iv_init" arity="3" since="OTP 22.0"/>
<fsummary>Initializes a series of encryptions or decryptions where the IV is provided later</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Initializes a series of encryptions or decryptions where the IV is provided later.
The actual encryption or decryption is done by
<seemfa marker="crypto#crypto_dyn_iv_update/3">crypto_dyn_iv_update/3</seemfa>.
@@ -722,6 +721,7 @@
<name name="crypto_final" arity="1" since="OTP 23.0"/>
<fsummary>Ends a series of encryptions or decryptions</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
Finalizes a series of encryptions or decryptions and delivers the final bytes of the final block.
The data returned from this function may be empty if no padding was enabled in
@@ -735,6 +735,7 @@
<name name="crypto_get_data" arity="1" since="OTP 23.0"/>
<fsummary>Get information about crypto states</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
Returns information about the State in the argument. The information is the form of a map,
which currently contains at least:
@@ -763,6 +764,7 @@
<name name="crypto_dyn_iv_update" arity="3" since="OTP 22.0"/>
<fsummary>Do an actual crypto operation on a part of the full text and the IV is supplied for each part</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
Do an actual crypto operation on a part of the full text and the IV is supplied for each part.
The <c>State</c> should be created with
@@ -775,6 +777,7 @@
<name name="crypto_one_time" arity="4" since="OTP 22.0"/>
<fsummary>Do a complete encrypt or decrypt of the full text</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>As <seemfa marker="#crypto_one_time/5">crypto_one_time/5</seemfa> but for ciphers without IVs.</p>
</desc>
</func>
@@ -783,6 +786,7 @@
<name name="crypto_one_time" arity="5" since="OTP 22.0"/>
<fsummary>Do a complete encrypt or decrypt of the full text</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
Do a complete encrypt or decrypt of the full text in the argument <c>Data</c>.
</p>
@@ -800,6 +804,7 @@
<name name="crypto_one_time_aead" arity="7" since="OTP 22.0"/>
<fsummary>Do a complete encrypt or decrypt with an AEAD cipher of the full text</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
Do a complete encrypt or decrypt with an AEAD cipher of the full text.
</p>
@@ -846,6 +851,7 @@
<name name="mac" arity="3" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Short for <seemfa marker="#mac/4">mac(Type, undefined, Key, Data)</seemfa>.
</p>
</desc>
@@ -855,6 +861,7 @@
<name name="mac" arity="4" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Computes a MAC (Message Authentication Code) of type <c>Type</c> from <c>Data</c>.
</p>
@@ -896,6 +903,7 @@
<name name="macN" arity="4" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Short for <seemfa marker="#macN/5">macN(Type, undefined, Key, Data, MacLength)</seemfa>.
</p>
</desc>
@@ -924,6 +932,7 @@
<name name="mac_init" arity="2" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Short for <seemfa marker="#mac_init/3">mac_init(Type, undefined, Key)</seemfa>.
</p>
</desc>
@@ -933,6 +942,7 @@
<name name="mac_init" arity="3" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Initializes the context for streaming MAC operations.
</p>
<p><c>Type</c> determines which mac algorithm to use in the MAC operation.
@@ -979,6 +989,7 @@
<name name="mac_update" arity="2" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Updates the MAC represented by <c>State0</c> using the given <c>Data</c> which
could be of any length.
</p>
@@ -995,6 +1006,7 @@
<name name="mac_final" arity="1" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Finalizes the MAC operation referenced by <c>State</c>. The <c>Mac</c> result will have
a default length depending on the <c>Type</c> and <c>SubType</c> in the
<seemfa marker="#mac_init/3">mac_init/2,3</seemfa> call.
@@ -1010,6 +1022,7 @@
<name name="mac_finalN" arity="2" since="OTP 22.1"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Finalizes the MAC operation referenced by <c>State</c>.
</p>
<p><c>Mac</c> will be a binary with at most <c>MacLength</c> bytes.
@@ -1037,6 +1050,7 @@
<name name="compute_key" arity="4" since="OTP R16B01"/>
<fsummary>Computes the shared secret</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Computes the shared secret from the private key and the other party's public key.
See also <seemfa marker="public_key:public_key#compute_key/2">public_key:compute_key/2</seemfa>
</p>
@@ -1057,15 +1071,10 @@
<name name="generate_key" arity="3" since="OTP R16B01"/>
<fsummary>Generates a public key of type <c>Type</c></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Generates a public key of type <c>Type</c>.
See also <seemfa marker="public_key:public_key#generate_key/1">public_key:generate_key/1</seemfa>.
- May raise exception:
</p>
- <list type="bulleted">
- <item><c>error:badarg</c>: an argument is of wrong type or has an illegal value,</item>
- <item><c>error:low_entropy</c>: the random generator failed due to lack of secure "randomness",</item>
- <item><c>error:computation_failed</c>: the computation fails of another reason than <c>low_entropy</c>.</item>
- </list>
<note>
<p>RSA key generation is only available if the runtime was
built with dirty scheduler support. Otherwise, attempting to
@@ -1078,9 +1087,8 @@
<name name="hash" arity="2" since="OTP R15B02"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Computes a message digest of type <c>Type</c> from <c>Data</c>.</p>
- <p>May raise exception <c>error:notsup</c> in case the chosen <c>Type</c>
- is not supported by the underlying libcrypto implementation.</p>
</desc>
</func>
@@ -1088,11 +1096,10 @@
<name name="hash_init" arity="1" since="OTP R15B02"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Initializes the context for streaming hash operations. <c>Type</c> determines
which digest to use. The returned context should be used as argument
to <seemfa marker="#hash_update/2">hash_update</seemfa>.</p>
- <p>May raise exception <c>error:notsup</c> in case the chosen <c>Type</c>
- is not supported by the underlying libcrypto implementation.</p>
</desc>
</func>
@@ -1100,6 +1107,7 @@
<name name="hash_update" arity="2" since="OTP R15B02"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Updates the digest represented by <c>Context</c> using the given <c>Data</c>. <c>Context</c>
must have been generated using <seemfa marker="#hash_init/1">hash_init</seemfa>
or a previous call to this function. <c>Data</c> can be any length. <c>NewContext</c>
@@ -1112,6 +1120,7 @@
<name name="hash_final" arity="1" since="OTP R15B02"/>
<fsummary></fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Finalizes the hash operation referenced by <c>Context</c> returned
from a previous call to <seemfa marker="#hash_update/2">hash_update</seemfa>.
The size of <c>Digest</c> is determined by the type of hash
@@ -1244,6 +1253,7 @@
<name name="private_decrypt" arity="4" since="OTP R16B01"/>
<fsummary>Decrypts CipherText using the private Key.</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Decrypts the <c>CipherText</c>, encrypted with
<seemfa marker="#public_encrypt/4">public_encrypt/4</seemfa> (or equivalent function)
using the <c>PrivateKey</c>, and returns the
@@ -1258,6 +1268,7 @@
<name name="private_encrypt" arity="4" since="OTP R16B01"/>
<fsummary>Encrypts PlainText using the private Key.</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Encrypts the <c>PlainText</c> using the <c>PrivateKey</c>
and returns the ciphertext. This is a low level signature operation
used for instance by older versions of the SSL protocol. See
@@ -1271,6 +1282,7 @@
<name name="public_decrypt" arity="4" since="OTP R16B01"/>
<fsummary>Decrypts CipherText using the public Key.</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Decrypts the <c>CipherText</c>, encrypted with
<seemfa marker="#private_encrypt/4">private_encrypt/4</seemfa>(or equivalent function)
using the <c>PrivateKey</c>, and returns the
@@ -1285,6 +1297,7 @@
<name name="public_encrypt" arity="4" since="OTP R16B01"/>
<fsummary>Encrypts PlainText using the public Key.</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Encrypts the <c>PlainText</c> (message digest) using the <c>PublicKey</c>
and returns the <c>CipherText</c>. This is a low level signature operation
used for instance by older versions of the SSL protocol. See also <seemfa
@@ -1621,6 +1634,7 @@ FloatValue = rand:uniform(). % again
<name name="sign" arity="5" since="OTP 20.1"/>
<fsummary> Create digital signature.</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Creates a digital signature.</p>
<p>The msg is either the binary "cleartext" data to be
signed or it is the hashed value of "cleartext" i.e. the
@@ -1636,6 +1650,7 @@ FloatValue = rand:uniform(). % again
<name name="verify" arity="6" since="OTP 20.1"/>
<fsummary>Verifies a digital signature.</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>Verifies a digital signature</p>
<p>The msg is either the binary "cleartext" data to be
signed or it is the hashed value of "cleartext" i.e. the
@@ -1965,15 +1980,27 @@ FloatValue = rand:uniform(). % again
</func>
<func>
+ <name name="hash_equals" arity="2" since="OTP 25.0"/>
+ <fsummary>Constant time memory comparison for fixed length binaries</fsummary>
+ <desc>
+ <p>
+ Constant time memory comparison for fixed length binaries, such as results of HMAC computations.
+ </p>
+ <p>
+ Returns true if the binaries are identical, false if they are of the same length but not identical.
+ The function raises an <c>error:badarg</c> exception if the binaries are of different size.
+ </p>
+ </desc>
+ </func>
+
+ <func>
<name name="pbkdf2_hmac" arity="5" since="OTP 24.2"/>
<fsummary>PBKDF2 in combination with HMAC</fsummary>
<desc>
+ <p>Uses the <seeerl marker="#error_3tup">3-tuple style</seeerl> for error handling.</p>
<p>
PKCS #5 PBKDF2 (Password-Based Key Derivation Function 2) in combination with HMAC.
</p>
- <p>
- The function raises a <c>error:badarg</c> if the parameters are in wrong format.
- </p>
</desc>
</func>
diff --git a/lib/crypto/src/Makefile b/lib/crypto/src/Makefile
index fea32dc4e3..893f679390 100644
--- a/lib/crypto/src/Makefile
+++ b/lib/crypto/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2021. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -61,7 +61,7 @@ ERL_COMPILE_FLAGS += -DCRYPTO_VSN=\"$(VSN)\" -Werror -I../include
# Targets
# ----------------------------------------------------
-debug opt valgrind asan: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
clean:
rm -f $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/crypto/src/crypto.app.src b/lib/crypto/src/crypto.app.src
index 492aa10e51..30e804c7e2 100644
--- a/lib/crypto/src/crypto.app.src
+++ b/lib/crypto/src/crypto.app.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,6 +25,6 @@
{registered, []},
{applications, [kernel, stdlib]},
{env, [{fips_mode, false}, {rand_cache_size, 896}]},
- {runtime_dependencies, ["erts-9.0","stdlib-3.4","kernel-5.3"]}]}.
+ {runtime_dependencies, ["erts-9.0","stdlib-3.9","kernel-5.3"]}]}.
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index 70d1ebc2b7..fdf2cdfbf9 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -46,6 +46,12 @@
-export([pbkdf2_hmac/5]).
%%%----------------------------------------------------------------
+%% Deprecated functions
+-deprecated([crypto_dyn_iv_init/3,
+ crypto_dyn_iv_update/3
+ ]).
+
+%%%----------------------------------------------------------------
%% Removed functions.
%%
%% Old interface. Now implemented with the New interface.
@@ -98,6 +104,8 @@
crypto_final/1,
crypto_get_data/1,
+ hash_equals/2,
+
supports/1,
mac/3, mac/4, macN/4, macN/5,
mac_init/2, mac_init/3, mac_update/2, mac_final/1, mac_finalN/2
@@ -391,18 +399,20 @@
-type crypto_integer() :: binary() | integer().
-%%%
-%% Exceptions
-%% error:badarg
-%% error:notsup
--type run_time_error() :: any().
+%% %%%--------------------------------------------------------------------
+%% %%% Exceptions
+%% %%%
+%% %% Exceptions
+%% %% error:badarg
+%% %% error:notsup
+%% -type run_time_error() :: badarg | notsup.
-%% Exceptions
-%% error:{badarg,Reason::term()}
-%% error:{notsup,Reason::term()}
-%% error:{error,Reason::term()}
--type descriptive_error() :: any() .
+%% %% Exceptions
+%% %% error:{badarg, file_line_info, Reason::term()}
+%% %% error:{notsup,Reason::term()}
+%% %% error:{error,Reason::term()}
+%% -type descriptive_error() :: {badarg | notsup | error, FileLineInfo::any, Reason::string()}.
%%--------------------------------------------------------------------
%% Compilation and loading
@@ -570,7 +580,7 @@ enable_fips_mode_nif(_) -> ?nif_stub.
KeyLen :: pos_integer(),
Result :: binary().
pbkdf2_hmac(Digest, Pass, Salt, Iter, KeyLen) ->
- pbkdf2_hmac_nif(Digest, Pass, Salt, Iter, KeyLen).
+ ?nif_call(pbkdf2_hmac_nif(Digest, Pass, Salt, Iter, KeyLen)).
pbkdf2_hmac_nif(_, _, _, _, _) -> ?nif_stub.
@@ -582,7 +592,7 @@ pbkdf2_hmac_nif(_, _, _, _, _) -> ?nif_stub.
-type hash_algorithm() :: sha1() | sha2() | sha3() | blake2() | ripemd160 | compatibility_only_hash() .
--spec hash_info(Type) -> Result | run_time_error()
+-spec hash_info(Type) -> Result
when Type :: hash_algorithm(),
Result :: #{size := integer(),
block_size := integer(),
@@ -604,7 +614,7 @@ hash(Type, Data) ->
-spec hash_init(Type) -> State when Type :: hash_algorithm(),
State :: hash_state().
hash_init(Type) ->
- notsup_to_error(hash_init_nif(Type)).
+ ?nif_call(hash_init_nif(Type)).
-spec hash_update(State, Data) -> NewState when State :: hash_state(),
NewState :: hash_state(),
@@ -617,7 +627,7 @@ hash_update(Context, Data) ->
-spec hash_final(State) -> Digest when State :: hash_state(),
Digest :: binary().
hash_final(Context) ->
- notsup_to_error(hash_final_nif(Context)).
+ ?nif_call(hash_final_nif(Context)).
%%%================================================================
%%%
@@ -638,7 +648,7 @@ hash_final(Context) ->
%%%----------------------------------------------------------------
%%% Calculate MAC for the whole text at once
--spec mac(Type :: poly1305, Key, Data) -> Mac | descriptive_error()
+-spec mac(Type :: poly1305, Key, Data) -> Mac
when Key :: iodata(),
Data :: iodata(),
Mac :: binary().
@@ -646,7 +656,7 @@ hash_final(Context) ->
mac(poly1305, Key, Data) -> mac(poly1305, undefined, Key, Data).
--spec mac(Type, SubType, Key, Data) -> Mac | descriptive_error()
+-spec mac(Type, SubType, Key, Data) -> Mac
when Type :: hmac | cmac | poly1305,
SubType :: hmac_hash_algorithm() | cmac_cipher_algorithm() | undefined,
Key :: iodata(),
@@ -655,11 +665,10 @@ mac(poly1305, Key, Data) -> mac(poly1305, undefined, Key, Data).
mac(Type, SubType, Key0, Data) ->
Key = iolist_to_binary(Key0),
- mac_nif(Type, alias(SubType,Key), Key, Data).
+ ?nif_call(mac_nif(Type, alias(SubType,Key), Key, Data)).
-
--spec macN(Type :: poly1305, Key, Data, MacLength) -> Mac | descriptive_error()
+-spec macN(Type :: poly1305, Key, Data, MacLength) -> Mac
when Key :: iodata(),
Data :: iodata(),
Mac :: binary(),
@@ -669,7 +678,7 @@ macN(Type, Key, Data, MacLength) ->
macN(Type, undefined, Key, Data, MacLength).
--spec macN(Type, SubType, Key, Data, MacLength) -> Mac | descriptive_error()
+-spec macN(Type, SubType, Key, Data, MacLength) -> Mac
when Type :: hmac | cmac | poly1305,
SubType :: hmac_hash_algorithm() | cmac_cipher_algorithm() | undefined,
Key :: iodata(),
@@ -686,40 +695,40 @@ macN(Type, SubType, Key, Data, MacLength) ->
-opaque mac_state() :: reference() .
--spec mac_init(Type :: poly1305, Key) -> State | descriptive_error()
+-spec mac_init(Type :: poly1305, Key) -> State
when Key :: iodata(),
State :: mac_state() .
mac_init(poly1305, Key) ->
- mac_init_nif(poly1305, undefined, Key).
+ ?nif_call(mac_init_nif(poly1305, undefined, Key)).
--spec mac_init(Type, SubType, Key) -> State | descriptive_error()
+-spec mac_init(Type, SubType, Key) -> State
when Type :: hmac | cmac | poly1305,
SubType :: hmac_hash_algorithm() | cmac_cipher_algorithm() | undefined,
Key :: iodata(),
State :: mac_state() .
mac_init(Type, SubType, Key0) ->
Key = iolist_to_binary(Key0),
- mac_init_nif(Type, alias(SubType,Key), Key).
+ ?nif_call(mac_init_nif(Type, alias(SubType,Key), Key)).
--spec mac_update(State0, Data) -> State | descriptive_error()
+-spec mac_update(State0, Data) -> State
when Data :: iodata(),
State0 :: mac_state(),
State :: mac_state().
mac_update(Ref, Data) ->
- mac_update_nif(Ref, Data).
+ ?nif_call(mac_update_nif(Ref, Data)).
--spec mac_final(State) -> Mac | descriptive_error()
+-spec mac_final(State) -> Mac
when State :: mac_state(),
Mac :: binary().
mac_final(Ref) ->
- mac_final_nif(Ref).
+ ?nif_call(mac_final_nif(Ref)).
--spec mac_finalN(State, MacLength) -> Mac | descriptive_error()
+-spec mac_finalN(State, MacLength) -> Mac
when State :: mac_state(),
MacLength :: pos_integer(),
Mac :: binary().
@@ -747,7 +756,7 @@ mac_final_nif(_Ref) -> ?nif_stub.
%%%---- Cipher info
--spec cipher_info(Type) -> Result | run_time_error()
+-spec cipher_info(Type) -> Result
when Type :: cipher(),
Result :: #{key_length := integer(),
iv_length := integer(),
@@ -816,7 +825,7 @@ cipher_info(Type) ->
%%% Create and initialize a new state for encryption or decryption
%%%
--spec crypto_init(Cipher, Key, FlagOrOptions) -> State | descriptive_error()
+-spec crypto_init(Cipher, Key, FlagOrOptions) -> State
when Cipher :: cipher_no_iv(),
Key :: iodata(),
FlagOrOptions :: crypto_opts() | boolean(),
@@ -826,7 +835,7 @@ crypto_init(Cipher, Key, FlagOrOptions) ->
{1,2,-1,3}
).
--spec crypto_init(Cipher, Key, IV, FlagOrOptions) -> State | descriptive_error()
+-spec crypto_init(Cipher, Key, IV, FlagOrOptions) -> State
when Cipher :: cipher_iv(),
Key :: iodata(),
IV :: iodata(),
@@ -836,7 +845,7 @@ crypto_init(Cipher, Key, IV, FlagOrOptions) ->
?nif_call(ng_crypto_init_nif(alias(Cipher,Key), Key, IV, FlagOrOptions)).
%%%----------------------------------------------------------------
--spec crypto_dyn_iv_init(Cipher, Key, FlagOrOptions) -> State | descriptive_error()
+-spec crypto_dyn_iv_init(Cipher, Key, FlagOrOptions) -> State
when Cipher :: cipher_iv(),
Key :: iodata(),
FlagOrOptions :: crypto_opts() | boolean(),
@@ -855,7 +864,7 @@ crypto_dyn_iv_init(Cipher, Key, FlagOrOptions) ->
%%% blocksize.
%%%
--spec crypto_update(State, Data) -> Result | descriptive_error()
+-spec crypto_update(State, Data) -> Result
when State :: crypto_state(),
Data :: iodata(),
Result :: binary() .
@@ -863,7 +872,7 @@ crypto_update(State, Data) ->
?nif_call(ng_crypto_update_nif(State, Data)).
%%%----------------------------------------------------------------
--spec crypto_dyn_iv_update(State, Data, IV) -> Result | descriptive_error()
+-spec crypto_dyn_iv_update(State, Data, IV) -> Result
when State :: crypto_state(),
Data :: iodata(),
IV :: iodata(),
@@ -877,7 +886,7 @@ crypto_dyn_iv_update(State, Data, IV) ->
%%% to crypto_uptate was not an integer number of blocks, the rest
%%% is returned from this function.
--spec crypto_final(State) -> FinalResult | descriptive_error()
+-spec crypto_final(State) -> FinalResult
when State :: crypto_state(),
FinalResult :: binary() .
crypto_final(State) ->
@@ -900,7 +909,7 @@ crypto_get_data(State) ->
%%%
-spec crypto_one_time(Cipher, Key, Data, FlagOrOptions) ->
- Result | descriptive_error()
+ Result
when Cipher :: cipher_no_iv(),
Key :: iodata(),
Data :: iodata(),
@@ -915,7 +924,7 @@ crypto_one_time(Cipher, Key, Data, FlagOrOptions) ->
-spec crypto_one_time(Cipher, Key, IV, Data, FlagOrOptions) ->
- Result | descriptive_error()
+ Result
when Cipher :: cipher_iv(),
Key :: iodata(),
IV :: iodata(),
@@ -930,7 +939,7 @@ crypto_one_time(Cipher, Key, IV, Data, FlagOrOptions) ->
%%%----------------------------------------------------------------
-spec crypto_one_time_aead(Cipher, Key, IV, InText, AAD, EncFlag::true) ->
- Result | descriptive_error()
+ Result
when Cipher :: cipher_aead(),
Key :: iodata(),
IV :: iodata(),
@@ -948,7 +957,7 @@ crypto_one_time_aead(Cipher, Key, IV, PlainText, AAD, true) ->
-spec crypto_one_time_aead(Cipher, Key, IV, InText, AAD, TagOrTagLength, EncFlag) ->
- Result | descriptive_error()
+ Result
when Cipher :: cipher_aead(),
Key :: iodata(),
IV :: iodata(),
@@ -1415,11 +1424,9 @@ sign(Algorithm, Type, Data, Key) ->
sign(Algorithm0, Type0, Data, Key, Options) ->
{Algorithm, Type} = sign_verify_compatibility(Algorithm0, Type0, Data),
- case pkey_sign_nif(Algorithm, Type, Data, format_pkey(Algorithm, Key), Options) of
- error -> erlang:error(badkey, [Algorithm, Type, Data, Key, Options]);
- notsup -> erlang:error(notsup);
- Signature -> Signature
- end.
+ ?nif_call(pkey_sign_nif(Algorithm, Type, Data, format_pkey(Algorithm, Key), Options),
+ {1, 2, 3, 4, 5},
+ [Algorithm0, Type0, Data, Key, Options]).
pkey_sign_nif(_Algorithm, _Type, _Digest, _Key, _Options) -> ?nif_stub.
@@ -1464,10 +1471,9 @@ verify(Algorithm, Type, Data, Signature, Key) ->
verify(Algorithm0, Type0, Data, Signature, Key, Options) ->
{Algorithm, Type} = sign_verify_compatibility(Algorithm0, Type0, Data),
- case pkey_verify_nif(Algorithm, Type, Data, Signature, format_pkey(Algorithm, Key), Options) of
- notsup -> erlang:error(notsup);
- Boolean -> Boolean
- end.
+ ?nif_call(pkey_verify_nif(Algorithm, Type, Data, Signature, format_pkey(Algorithm, Key), Options),
+ {1,2,3,4,5},
+ [Algorithm0, Type0, Data, Signature, Key, Options]).
pkey_verify_nif(_Algorithm, _Type, _Data, _Signature, _Key, _Options) -> ?nif_stub.
@@ -1553,12 +1559,7 @@ pkey_crypt(rsa, Text, Key, Padding, PubPriv, EncDec) when is_atom(Padding) ->
pkey_crypt(rsa, Text, Key, [{rsa_padding, Padding}], PubPriv, EncDec);
pkey_crypt(Alg, Text, Key, Options, PubPriv, EncDec) ->
- case pkey_crypt_nif(Alg, Text, format_pkey(Alg,Key), Options, PubPriv, EncDec) of
- error when EncDec==true -> erlang:error(encrypt_failed, [Alg, Text, Key, Options]);
- error when EncDec==false -> erlang:error(decrypt_failed, [Alg, Text, Key, Options]);
- notsup -> erlang:error(notsup);
- Out -> Out
- end.
+ ?nif_call(pkey_crypt_nif(Alg, Text, format_pkey(Alg,Key), Options, PubPriv, EncDec)).
pkey_crypt_nif(_Algorithm, _In, _Key, _Options, _IsPrivate, _IsEncrypt) -> ?nif_stub.
@@ -1593,9 +1594,11 @@ generate_key(dh, DHParameters0, PrivateKey) ->
[P,G,L] -> {[P,G], L};
[P,G] -> {[P,G], 0}
end,
- dh_generate_key_nif(ensure_int_as_bin(PrivateKey),
- map_ensure_int_as_bin(DHParameters),
- 0, Len);
+ ?nif_call(dh_generate_key_nif(ensure_int_as_bin(PrivateKey),
+ map_ensure_int_as_bin(DHParameters),
+ 0, Len),
+ {3, 2, -1, 2},
+ [dh, DHParameters0, PrivateKey]);
generate_key(srp, {host, [Verifier, Generator, Prime, Version]}, PrivArg)
when is_binary(Verifier), is_binary(Generator), is_binary(Prime), is_atom(Version) ->
@@ -1639,14 +1642,20 @@ generate_key(ecdh, Curve, PrivKey) when Curve == x448 ;
generate_key(eddh, Curve, PrivKey);
generate_key(eddh, Curve, PrivKey) when Curve == x448 ;
Curve == x25519 ->
- evp_generate_key_nif(Curve, ensure_int_as_bin(PrivKey));
+ ?nif_call(evp_generate_key_nif(Curve, ensure_int_as_bin(PrivKey)),
+ {2, 3},
+ [eddh, Curve, PrivKey]
+ );
generate_key(ecdh, Curve, PrivKey) ->
- ec_key_generate(nif_curve_params(Curve), ensure_int_as_bin(PrivKey));
+ ?nif_call(ec_generate_key_nif(nif_curve_params(Curve), ensure_int_as_bin(PrivKey)));
generate_key(eddsa, Curve, PrivKey) when Curve == ed448 ;
Curve == ed25519 ->
- evp_generate_key_nif(Curve, ensure_int_as_bin(PrivKey)).
+ ?nif_call(evp_generate_key_nif(Curve, ensure_int_as_bin(PrivKey)),
+ {2, 3},
+ [eddsa, Curve, PrivKey]
+ ).
evp_generate_key_nif(_Curve, _PrivKey) -> ?nif_stub.
@@ -1661,13 +1670,11 @@ evp_generate_key_nif(_Curve, _PrivKey) -> ?nif_stub.
.
compute_key(dh, OthersPublicKey, MyPrivateKey, DHParameters) ->
- case dh_compute_key_nif(ensure_int_as_bin(OthersPublicKey),
- ensure_int_as_bin(MyPrivateKey),
- map_ensure_int_as_bin(DHParameters)) of
- error -> erlang:error(computation_failed,
- [dh,OthersPublicKey,MyPrivateKey,DHParameters]);
- Ret -> Ret
- end;
+ ?nif_call(dh_compute_key_nif(ensure_int_as_bin(OthersPublicKey),
+ ensure_int_as_bin(MyPrivateKey),
+ map_ensure_int_as_bin(DHParameters)),
+ {2, 3, 4},
+ [dh, OthersPublicKey, MyPrivateKey, DHParameters]);
compute_key(srp, HostPublic, {UserPublic, UserPrivate},
{user, [DerivedKey, Prime, Generator, Version | ScramblerArg]}) when
@@ -1706,12 +1713,16 @@ compute_key(ecdh, Others, My, Curve) when Curve == x448 ;
compute_key(eddh, Others, My, Curve) when Curve == x448 ;
Curve == x25519 ->
- evp_compute_key_nif(Curve, ensure_int_as_bin(Others), ensure_int_as_bin(My));
+ ?nif_call(evp_compute_key_nif(Curve, ensure_int_as_bin(Others), ensure_int_as_bin(My)),
+ {2, 3, 4},
+ [eddh, Others, My, Curve]);
compute_key(ecdh, Others, My, Curve) ->
- ecdh_compute_key_nif(ensure_int_as_bin(Others),
- nif_curve_params(Curve),
- ensure_int_as_bin(My)).
+ ?nif_call(ecdh_compute_key_nif(ensure_int_as_bin(Others),
+ nif_curve_params(Curve),
+ ensure_int_as_bin(My)),
+ {2, 4, 3},
+ [ecdh, Others, My, Curve]).
evp_compute_key_nif(_Curve, _OthersBin, _MyBin) -> ?nif_stub.
@@ -2161,17 +2172,17 @@ notsup_to_error(Other) ->
%% HASH --------------------------------------------------------------------
hash(Hash, Data, Size, Max) when Size =< Max ->
- notsup_to_error(hash_nif(Hash, Data));
+ ?nif_call(hash_nif(Hash, Data));
hash(Hash, Data, Size, Max) ->
State0 = hash_init(Hash),
State1 = hash_update(State0, Data, Size, Max),
hash_final(State1).
hash_update(State, Data, Size, MaxBytes) when Size =< MaxBytes ->
- notsup_to_error(hash_update_nif(State, Data));
+ ?nif_call(hash_update_nif(State, Data), {1,2});
hash_update(State0, Data, _, MaxBytes) ->
<<Increment:MaxBytes/binary, Rest/binary>> = Data,
- State = notsup_to_error(hash_update_nif(State0, Increment)),
+ State = ?nif_call(hash_update_nif(State0, Increment), {1,2}),
hash_update(State, Rest, erlang:byte_size(Rest), MaxBytes).
hash_info_nif(_Hash) -> ?nif_stub.
@@ -2265,7 +2276,7 @@ dh_generate_key_nif(_PrivateKey, _DHParameters, _Mpint, _Length) -> ?nif_stub.
%% MyPrivKey, OthersPublicKey = mpint()
dh_compute_key_nif(_OthersPublicKey, _MyPrivateKey, _DHParameters) -> ?nif_stub.
-ec_key_generate(_Curve, _Key) -> ?nif_stub.
+ec_generate_key_nif(_Curve, _Key) -> ?nif_stub.
ecdh_compute_key_nif(_Others, _Curve, _My) -> ?nif_stub.
@@ -2286,16 +2297,15 @@ ec_curve(X) ->
EnginePrivateKeyRef :: engine_key_ref(),
PublicKey :: rsa_public() | dss_public() .
privkey_to_pubkey(Alg, EngineMap) when Alg == rsa; Alg == dss; Alg == ecdsa ->
- try privkey_to_pubkey_nif(Alg, format_pkey(Alg,EngineMap))
- of
+ try ?nif_call(privkey_to_pubkey_nif(Alg, format_pkey(Alg,EngineMap))) of
[_|_]=L -> map_ensure_bin_as_int(L);
X -> X
catch
- error:badarg when Alg==ecdsa ->
+ error:{badarg,_,_} when Alg==ecdsa ->
{error, notsup};
- error:badarg ->
+ error:{badarg,_,_} ->
{error, not_found};
- error:notsup ->
+ error:{notsup,_,_} ->
{error, notsup}
end.
@@ -2344,6 +2354,15 @@ exor(Data1, Data2, _Size, MaxByts, Acc) ->
do_exor(_A, _B) -> ?nif_stub.
+-spec hash_equals(BinA, BinB) -> Result
+ when BinA :: binary(),
+ BinB :: binary(),
+ Result :: boolean().
+hash_equals(A, B) ->
+ hash_equals_nif(A, B).
+
+hash_equals_nif(_A, _B) -> ?nif_stub.
+
hash_algorithms() -> ?nif_stub.
pubkey_algorithms() -> ?nif_stub.
cipher_algorithms() -> ?nif_stub.
diff --git a/lib/crypto/test/Makefile b/lib/crypto/test/Makefile
index aaa2df0534..a018b794c5 100644
--- a/lib/crypto/test/Makefile
+++ b/lib/crypto/test/Makefile
@@ -17,6 +17,7 @@ TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
SPEC_FILES = \
crypto.spec \
+ crypto_gh.spec \
crypto_bench.spec
COVER_FILE = crypto.cover
@@ -35,7 +36,7 @@ EBIN = .
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-tests debug opt: $(TARGET_FILES)
+tests $(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/crypto/test/crypto.spec b/lib/crypto/test/crypto.spec
index 4a95275687..690374b099 100644
--- a/lib/crypto/test/crypto.spec
+++ b/lib/crypto/test/crypto.spec
@@ -1,6 +1,4 @@
{suites,"../crypto_test",all}.
-
-{skip_suites, "../crypto_test", [crypto_bench_SUITE
- ],
+{skip_suites, "../crypto_test", [crypto_bench_SUITE],
"Benchmarks run separately"}.
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index 503961ebf9..15ab9e735a 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -104,6 +104,8 @@
rand_threads/1,
rand_uniform/0,
rand_uniform/1,
+ hash_equals/0,
+ hash_equals/1,
sign_verify/0,
sign_verify/1,
ec_key_padding/1,
@@ -168,6 +170,11 @@
rsa_oaep_label/0
]).
+
+-compile({nowarn_deprecated_function, [{crypto, crypto_dyn_iv_init, 3},
+ {crypto, crypto_dyn_iv_update, 3}
+ ]}).
+
%%--------------------------------------------------------------------
%% Common Test interface functions -----------------------------------
%%--------------------------------------------------------------------
@@ -195,6 +202,7 @@ all() ->
info,
cipher_info,
hash_info,
+ hash_equals,
pbkdf2_hmac
].
@@ -700,36 +708,21 @@ make_crypto_key(String) ->
{[K1,K2,K3],IVec,8}.
%%--------------------------------------------------------------------
%% Test that a spawned node has initialized the cache
--define(at_node,
- (fun(N, M, F, As) ->
- R = rpc:call(N, M, F, As),
- ct:log("~p ~p ~p:~p(~s) = ~p", [?LINE,N,M,F,args2list(As), R]),
- R
- end) ).
-args2list(As) -> lists:join(", ", [io_lib:format("~p",[A]) || A <- As]).
node_supports_cache(_Config) ->
ECs = crypto:supports(curves),
- {ok,Node} = start_slave_node(random_node_name(?MODULE)),
- case ?at_node(Node, crypto, supports, [curves]) of
+ {ok,Peer,Node} = ?CT_PEER(),
+ case erpc:call(Node, crypto, supports, [curves]) of
ECs ->
- test_server:stop_node(Node);
+ peer:stop(Peer);
OtherECs ->
+ peer:stop(Peer),
ct:log("At master:~p~nAt slave:~p~n"
"Missing at slave: ~p~nmissing at master: ~p",
[ECs, OtherECs, ECs--OtherECs, OtherECs--ECs]),
{fail, "different support at slave"}
end.
-
-start_slave_node(Name) ->
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, slave, [{args, " -pa " ++ Pa}]).
-
-random_node_name(BaseName) ->
- L = integer_to_list(erlang:unique_integer([positive])),
- lists:concat([BaseName,"___",L]).
-
%%--------------------------------------------------------------------
hash() ->
[{doc, "Test all different hash functions"}].
@@ -1261,6 +1254,18 @@ exor(Config) when is_list(Config) ->
do_exor(<<1, 2, 3, 4, 5, 6, 7, 8, 9, 10>>),
do_exor(term_to_binary(lists:seq(1, 1000000))).
%%--------------------------------------------------------------------
+hash_equals() ->
+ [{doc, "Test the hash_equals function"}].
+hash_equals(Config) when is_list(Config) ->
+ try
+ true = crypto:hash_equals(<<>>, <<>>),
+ true = crypto:hash_equals(<<"abc">>, <<"abc">>),
+ false = crypto:hash_equals(<<"abc">>, <<"abe">>)
+ catch
+ error:{notsup,{"hash_equals.c",_Line},"Unsupported CRYPTO_memcmp"} ->
+ {skip, "No CRYPTO_memcmp"}
+ end.
+%%--------------------------------------------------------------------
rand_uniform() ->
[{doc, "rand_uniform and random_bytes testing"}].
rand_uniform(Config) when is_list(Config) ->
@@ -1579,6 +1584,13 @@ do_sign_verify({Type, Hash, Public, Private, Msg, Options}) ->
ct:log("notsup but OK in old cryptolib crypto:sign(~p, ~p, ..., ..., ..., ~p)",
[Type,Hash,Options]),
true;
+ error:{notsup,_,_} when NotSupLow == true,
+ is_integer(LibVer),
+ LibVer < 16#10001000 ->
+ %% Those opts where introduced in 1.0.1
+ ct:log("notsup but OK in old cryptolib crypto:sign(~p, ~p, ..., ..., ..., ~p)",
+ [Type,Hash,Options]),
+ true;
C:E ->
ct:log("~p:~p crypto:sign(~p, ~p, ..., ..., ..., ~p)", [C,E,Type,Hash,Options]),
ct:fail({{crypto, sign_verify, [LibVer, Type, Hash, Msg, Public, Options]}})
@@ -4340,7 +4352,7 @@ bad_generate_key_name(_Config) ->
bad_hash_name(_Config) ->
?chk_api_name(crypto:hash_init(foobar),
- error:badarg).
+ error:{badarg,{"hash.c",_},"Bad digest type"}).
bad_mac_name(_Config) ->
?chk_api_name(crypto:mac(foobar, <<1:1024>>, "nothing"),
@@ -4348,15 +4360,15 @@ bad_mac_name(_Config) ->
bad_sign_name(_Config) ->
?chk_api_name(crypto:sign(rsa, foobar, "nothing", <<1:1024>>),
- error:badarg),
+ error:{badarg, {"pkey.c",_}, "Bad digest type"}),
?chk_api_name(crypto:sign(foobar, sha, "nothing", <<1:1024>>),
- error:badarg).
+ error:{badarg, {"pkey.c",_}, "Bad algorithm"}).
bad_verify_name(_Config) ->
- ?chk_api_name(crypto:verify(rsa, foobar, "nothing","nothing", <<1:1024>>),
- error:badarg),
- ?chk_api_name(crypto:verify(foobar, sha, "nothing", "nothing", <<1:1024>>),
- error:badarg).
+ ?chk_api_name(crypto:verify(rsa, foobar, "nothing", <<"nothing">>, <<1:1024>>),
+ error:{badarg,{"pkey.c",_},"Bad digest type"}),
+ ?chk_api_name(crypto:verify(foobar, sha, "nothing", <<"nothing">>, <<1:1024>>),
+ error:{badarg, {"pkey.c",_}, "Bad algorithm"}).
%%%----------------------------------------------------------------
diff --git a/lib/crypto/test/crypto_gh.spec b/lib/crypto/test/crypto_gh.spec
new file mode 100644
index 0000000000..a1119373cd
--- /dev/null
+++ b/lib/crypto/test/crypto_gh.spec
@@ -0,0 +1,5 @@
+{suites,"../crypto_test",all}.
+{skip_suites, "../crypto_test", [crypto_bench_SUITE],
+ "Benchmarks run separately"}.
+{skip_cases, "../crypto_test", engine_SUITE,
+ [multiple_engine_load],"Broken with openssl 1.1.1f and docker"}.
diff --git a/lib/crypto/test/engine_SUITE.erl b/lib/crypto/test/engine_SUITE.erl
index cab519fdb9..22c6a033c3 100644
--- a/lib/crypto/test/engine_SUITE.erl
+++ b/lib/crypto/test/engine_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -833,7 +833,7 @@ sign_verify_rsa_pwd_bad_pwd(Config) ->
try sign_verify(rsa, sha, Priv, Pub) of
_ -> {fail, "PWD prot pubkey sign succeeded with no pwd!"}
catch
- error:badarg -> ok
+ error:{badarg,_,_} -> ok
end.
priv_encrypt_pub_decrypt_rsa(Config) ->
diff --git a/lib/debugger/doc/src/notes.xml b/lib/debugger/doc/src/notes.xml
index 94cd320955..f43c53bce7 100644
--- a/lib/debugger/doc/src/notes.xml
+++ b/lib/debugger/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2021</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -270,7 +270,7 @@
<list>
<item>
<p>
- Update build scripts to not make assumtions about where
+ Update build scripts to not make assumptions about where
env, cp and perl are located.</p>
<p>
Own Id: OTP-13800</p>
diff --git a/lib/debugger/priv/Makefile b/lib/debugger/priv/Makefile
index 726d7eb2f3..9f092b1a02 100644
--- a/lib/debugger/priv/Makefile
+++ b/lib/debugger/priv/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2016. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -42,7 +42,7 @@ TOOLBAR_FILES = \
# Rules
#
-debug opt:
+$(TYPES):
docs:
diff --git a/lib/debugger/src/Makefile b/lib/debugger/src/Makefile
index 118cb6b758..2fb955b2e3 100644
--- a/lib/debugger/src/Makefile
+++ b/lib/debugger/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2016. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -92,7 +92,7 @@ ERL_COMPILE_FLAGS += -Werror
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES) $(TARGET_TOOLBOX_FILES)
+$(TYPES): $(TARGET_FILES) $(TARGET_TOOLBOX_FILES)
clean:
rm -f $(TARGET_FILES) $(TARGET_TOOLBOX_FILES)
diff --git a/lib/debugger/src/dbg_icmd.erl b/lib/debugger/src/dbg_icmd.erl
index 0eb258567f..38f89d0d9e 100644
--- a/lib/debugger/src/dbg_icmd.erl
+++ b/lib/debugger/src/dbg_icmd.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -382,19 +382,14 @@ eval_restricted({From,_Mod,Cmd,SP}, Bs) ->
case catch parse_cmd(Cmd, 1) of
{'EXIT', _Reason} ->
From ! {self(), {eval_rsp, 'Parse error'}};
- {[{var,_,Var}], XBs} ->
+ [{var,_,Var}] ->
Bs2 = bindings(Bs, SP),
Res = case get_binding(Var, Bs2) of
{value, Value} -> Value;
- unbound ->
- case get_binding(Var, XBs) of
- {value, _} ->
- 'Only possible to inspect variables';
- unbound -> unbound
- end
+ unbound -> unbound
end,
From ! {self(), {eval_rsp, Res}};
- {_Forms, _XBs} ->
+ _Forms ->
Rsp = 'Only possible to inspect variables',
From ! {self(), {eval_rsp, Rsp}}
end.
@@ -409,18 +404,17 @@ eval_nonrestricted({From, _Mod, Cmd, _SP}, Bs,
{'EXIT', _Reason} ->
From ! {self(), {eval_rsp, 'Parse error'}},
Bs;
- {Forms, XBs} ->
+ Forms ->
mark_running(Line, Le),
- Bs1 = merge_bindings(Bs, XBs),
- {Res, Bs2} =
+ {Res, Bs1} =
lists:foldl(fun(Expr, {_Res, Bs0}) ->
eval_nonrestricted_1(Expr,Bs0,Ieval)
end,
- {null, Bs1},
+ {null, Bs},
Forms),
mark_break(M, Line, Le),
From ! {self(), {eval_rsp, Res}},
- remove_binding_structs(Bs2, XBs)
+ Bs1
end.
eval_nonrestricted_1({match,_,{var,_,Var},Expr}, Bs, Ieval) ->
@@ -445,14 +439,6 @@ eval_expr(Expr, Bs, Ieval) ->
dbg_ieval:eval_expr(Expr, Bs, Ieval#ieval{top=false}),
{Res,Bs2}.
-%% XBs have unique keys.
-merge_bindings(Bs1, XBs) ->
- Bs1 ++ erl_eval:bindings(XBs).
-
-remove_binding_structs(Bs1, XBs) ->
- lists:foldl(fun({N, _V}, Bs) -> lists:keydelete(N, 1, Bs)
- end, Bs1, erl_eval:bindings(XBs)).
-
mark_running(LineNo, Le) ->
put(next_break, running),
put(user_eval, [{LineNo, Le} | get(user_eval)]),
@@ -467,8 +453,8 @@ mark_break(Cm, LineNo, Le) ->
parse_cmd(Cmd, LineNo) ->
{ok,Tokens,_} = erl_scan:string(Cmd, LineNo, [text]),
- {ok,Forms,Bs} = erl_eval:extended_parse_exprs(Tokens),
- {Forms, Bs}.
+ {ok,Forms} = erl_eval:extended_parse_exprs(Tokens),
+ Forms.
%%====================================================================
%% Library functions for attached process handling
diff --git a/lib/debugger/src/dbg_ieval.erl b/lib/debugger/src/dbg_ieval.erl
index 49a8f6513c..2d736898d8 100644
--- a/lib/debugger/src/dbg_ieval.erl
+++ b/lib/debugger/src/dbg_ieval.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -84,7 +84,7 @@ exit_info(Int, AttPid, OrigPid, Reason, ExitInfo) ->
%%--------------------------------------------------------------------
%% eval_expr(Expr, Bs, Ieval) -> {value, Value, Bs}
%%
-%% Evalute a shell expression in the real process.
+%% Evaluate a shell expression in the real process.
%% Called (dbg_icmd) in response to a user request.
%%--------------------------------------------------------------------
eval_expr(Expr0, Bs, Ieval) ->
@@ -266,7 +266,7 @@ meta_loop(Debugged, Bs, #ieval{level=Le} = Ieval) ->
end,
do_exception(Class, Reason, MakeStk, Bs, Ieval);
- %% Error must have occured within a re-entry to
+ %% Error must have occurred within a re-entry to
%% interpreted code, simply raise the exception
_ ->
erlang:Class(Reason)
@@ -669,7 +669,7 @@ expr({map,Line,E0,Fs0}, Bs0, Ieval0) ->
%% Record update
expr({record_update,Line,Es},Bs,#ieval{level=Le}=Ieval0) ->
- %% Incr Level, we don't need to step (next) trough temp
+ %% Incr Level, we don't need to step (next) through temp
%% variables creation and matching
Ieval = Ieval0#ieval{top=false, line=Line, level=Le+1},
Seq = fun(E, {_, _, Bs1}) -> expr(E, Bs1, Ieval) end,
@@ -1043,9 +1043,7 @@ expr({bin,Line,Fs}, Bs0, Ieval0) ->
Ieval = Ieval0#ieval{line=Line,top=false},
try
eval_bits:expr_grp(Fs, Bs0,
- fun (E, B) -> expr(E, B, Ieval) end,
- [],
- false)
+ fun (E, B) -> expr(E, B, Ieval) end)
catch
Class:Reason ->
exception(Class, Reason, Bs0, Ieval)
@@ -1504,7 +1502,7 @@ guard_expr({bin,_,Flds}, Bs) ->
fun(E,B) ->
{value,V} = guard_expr(E,B),
{value,V,B}
- end, [], false),
+ end),
{value,V}.
@@ -1583,8 +1581,7 @@ match1({map,_,Fields}, Map, Bs, BBs) when is_map(Map) ->
match1({bin,_,Fs}, B, Bs0, BBs) when is_bitstring(B) ->
try eval_bits:match_bits(Fs, B, Bs0, BBs,
match_fun(BBs),
- fun(E, Bs) -> expr(E, Bs, #ieval{}) end,
- false)
+ fun(E, Bs) -> expr(E, Bs, #ieval{}) end)
catch
_:_ -> throw(nomatch)
end;
diff --git a/lib/debugger/src/dbg_iload.erl b/lib/debugger/src/dbg_iload.erl
index 888de26620..4649f7cef4 100644
--- a/lib/debugger/src/dbg_iload.erl
+++ b/lib/debugger/src/dbg_iload.erl
@@ -901,7 +901,7 @@ record_pattern(_, _, _, _, _, Acc) -> lists:reverse(Acc).
%% The debugger converts both strings "abc" and lists [67, 68, 69]
%% into {value, Line, [67, 68, 69]}, making it impossible to later
-%% distingish one or the other inside binaries when evaluating. To
+%% distinguish one or the other inside binaries when evaluating. To
%% avoid <<[67, 68, 69]>> from evaluating, we convert strings into
%% chars to avoid the ambiguity.
bin_expand_strings(Es) ->
diff --git a/lib/debugger/src/dbg_wx_break_win.erl b/lib/debugger/src/dbg_wx_break_win.erl
index 10e9272254..e521dca57b 100644
--- a/lib/debugger/src/dbg_wx_break_win.erl
+++ b/lib/debugger/src/dbg_wx_break_win.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -214,9 +214,9 @@ handle_event(#wx{id=?wxID_OK},#winInfo{win=Win,text=Text, entries=Es, trigger=Tr
%% Non function box
Mod = wxComboBox:getValue(Text),
Data = check_input(Es),
- Trigged = get_trigger(Trigger),
+ Triggered = get_trigger(Trigger),
wxDialog:destroy(Win),
- {break, [[list_to_atom(Mod)|Data]], Trigged};
+ {break, [[list_to_atom(Mod)|Data]], Triggered};
handle_event(_WxEvent, _WinInfo) ->
%% io:format("Ev: ~p ~n", [_WxEvent]),
diff --git a/lib/debugger/src/dbg_wx_settings.erl b/lib/debugger/src/dbg_wx_settings.erl
index 3a355f18a9..d39d99ed68 100644
--- a/lib/debugger/src/dbg_wx_settings.erl
+++ b/lib/debugger/src/dbg_wx_settings.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -80,30 +80,35 @@ default_settings_dir(Win) ->
case filelib:is_dir(DefDir) of
true -> DefDir;
false ->
- {ok, CWD} = file:get_cwd(),
-
- Msg = ["Default directory ", DefDir, " does not exist. ",
- "Click OK to create it or ",
- "Cancel to use other directory."],
- case dbg_wx_win:confirm(Win, Msg) of
- ok ->
- ToolsDir = filename:dirname(DefDir),
- case filelib:is_dir(ToolsDir) of
- true ->
- case file:make_dir(DefDir) of
- ok -> DefDir;
- _Error -> CWD
- end;
- false ->
- case file:make_dir(ToolsDir) of
- ok ->
- case file:make_dir(DefDir) of
- ok -> DefDir;
- _Error -> CWD
- end;
- _Error -> CWD
- end
- end;
- cancel -> CWD
- end
+ XDGDir = filename:join(filename:basedir(user_config,"erlang"),"debugger"),
+ case filelib:is_dir(XDGDir) of
+ true -> XDGDir;
+ false ->
+ {ok, CWD} = file:get_cwd(),
+
+ Msg = ["Default directory ", XDGDir, " does not exist. ",
+ "Click OK to create it or ",
+ "Cancel to use other directory."],
+ case dbg_wx_win:confirm(Win, Msg) of
+ ok ->
+ ToolsDir = filename:dirname(XDGDir),
+ case filelib:is_dir(ToolsDir) of
+ true ->
+ case file:make_dir(XDGDir) of
+ ok -> XDGDir;
+ _Error -> CWD
+ end;
+ false ->
+ case file:make_dir(ToolsDir) of
+ ok ->
+ case file:make_dir(XDGDir) of
+ ok -> XDGDir;
+ _Error -> CWD
+ end;
+ _Error -> CWD
+ end
+ end;
+ cancel -> CWD
+ end
+ end
end.
diff --git a/lib/debugger/src/i.erl b/lib/debugger/src/i.erl
index 853fa529a0..5bab31cc4a 100644
--- a/lib/debugger/src/i.erl
+++ b/lib/debugger/src/i.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -276,7 +276,7 @@ ia(Pid) ->
%% -------------------------------------------
%% Attach to process.
-%% X,Y,Z is combind to a process identity.
+%% X,Y,Z is combined to a process identity.
%% -------------------------------------------
ia(X,Y,Z) ->
diff --git a/lib/debugger/test/Makefile b/lib/debugger/test/Makefile
index 8677180596..14186798f0 100644
--- a/lib/debugger/test/Makefile
+++ b/lib/debugger/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1998-2021. All Rights Reserved.
+# Copyright Ericsson AB 1998-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -84,7 +84,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) '*_SUITE_make' \
>> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/debugger/test/bs_match_int_SUITE.erl b/lib/debugger/test/bs_match_int_SUITE.erl
index 8ff5fe260e..d89bcfd434 100644
--- a/lib/debugger/test/bs_match_int_SUITE.erl
+++ b/lib/debugger/test/bs_match_int_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -263,7 +263,7 @@ match_huge_int(Config) when is_list(Config) ->
8 ->
%% An attempt will be made to allocate heap space for
%% the bignum (which will probably fail); only if the
- %% allocation succeds will the matching fail because
+ %% allocation succeeds will the matching fail because
%% the binary is too small.
ok
end,
diff --git a/lib/debugger/test/dbg_ui_SUITE.erl b/lib/debugger/test/dbg_ui_SUITE.erl
index 32577d48cd..ca66f49f0a 100644
--- a/lib/debugger/test/dbg_ui_SUITE.erl
+++ b/lib/debugger/test/dbg_ui_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -205,13 +205,13 @@ Interpret one module").
?MAN_CASE(finish3, "Finish the current function body",
- "Call the fucntion test:test1() from the shell. Press Finish to evaluate the remaining lines in the function. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}").
+ "Call the function test:test1() from the shell. Press Finish to evaluate the remaining lines in the function. The result printed in the shell should be: {\"peter\",[1,2,4,a,b,c],\"olin\"}").
?MAN_CASE(killinit3,"Set up for killing and clearing processes",
"Call test:test2() from the shell. Set a break point at the last line of test:test2. Click Continue. This should open three new attach windows. One for each spawn called in test:test2/0. ").
?MAN_CASE(killone3, "Kill a process and clear it",
- "In one of the newly openend Attach windows: select Process->Kill. A message should appear above the Code Area in the Attach window. Use Windows->Monitor to verify that the Monitor window also shows that the process has been killed. In the Monitor window: select Edit->Clear. This should do two things: 1) close/remove the window of the killed process. 2) Remove the entry of the killed process from the monitor window.").
+ "In one of the newly opened Attach windows: select Process->Kill. A message should appear above the Code Area in the Attach window. Use Windows->Monitor to verify that the Monitor window also shows that the process has been killed. In the Monitor window: select Edit->Clear. This should do two things: 1) close/remove the window of the killed process. 2) Remove the entry of the killed process from the monitor window.").
?MAN_CASE(killall3,"KIll all processes, and clear them",
"In the Monitor window: Select Edit->Kill All. Verify that all processes have been killed (in their respective windows and in the monitor window). Windows will be raised as their processes die. Next select, Edit->Clear. All attach windows should now be closed. Their entris should also disappear from the monitor window. The shell should have reported: ** exited: killed **").
@@ -250,7 +250,7 @@ Interpret one module").
%% SET 6 (Distribution)
?MAN_CASE(distsetup6,"Set up distribution",
- "Start two erlang systems [foo,bar] (with option -sname), make them aware of eachother using net_adm:ping/1. Start the debugger on foo. Interpret the modules [test, lists1, ordsets1]. Set attach on First call. ").
+ "Start two erlang systems [foo,bar] (with option -sname), make them aware of each other using net_adm:ping/1. Start the debugger on foo. Interpret the modules [test, lists1, ordsets1]. Set attach on First call. ").
diff --git a/lib/debugger/test/dbg_ui_SUITE_data/manual_data/src/lists1.erl b/lib/debugger/test/dbg_ui_SUITE_data/manual_data/src/lists1.erl
index 32aabfcbb9..fd041d05e0 100644
--- a/lib/debugger/test/dbg_ui_SUITE_data/manual_data/src/lists1.erl
+++ b/lib/debugger/test/dbg_ui_SUITE_data/manual_data/src/lists1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -156,7 +156,7 @@ sublist([H|T], L) when L > 0 ->
sublist(List, L) -> [].
%% delete(Item, List) -> List'
-%% Delete the first occurance of Item from the list L.
+%% Delete the first occurrence of Item from the list L.
delete(Item, [Item|Rest]) -> Rest;
delete(Item, [H|Rest]) ->
@@ -221,7 +221,7 @@ flatten([], [H|Cont], Tail) ->
flatten([], [], Tail) ->
Tail.
-%% flat_length(List) (undocumented can be rmove later)
+%% flat_length(List) (undocumented can be removed later)
%% Calculate the length of a list of lists.
flat_length(List) -> flatlength(List).
diff --git a/lib/debugger/test/exception_SUITE.erl b/lib/debugger/test/exception_SUITE.erl
index dd19fe4b78..2c638cba06 100644
--- a/lib/debugger/test/exception_SUITE.erl
+++ b/lib/debugger/test/exception_SUITE.erl
@@ -179,7 +179,7 @@ pending({Code,[{?MODULE,Func,Arity,_}|_]}, Func, Args, Code)
pending(Reason, _Function, _Args, _Code) ->
ct:fail({bad_exit_reason,Reason}).
-%% Test that doing arithmetics on [] gives a badarith EXIT and not a crash.
+%% Test that doing arithmetic on [] gives a badarith EXIT and not a crash.
nil_arith(Config) when is_list(Config) ->
ba_plus_minus_times([], []),
diff --git a/lib/debugger/test/fun_SUITE.erl b/lib/debugger/test/fun_SUITE.erl
index 7eb53e4ce4..f970ed0438 100644
--- a/lib/debugger/test/fun_SUITE.erl
+++ b/lib/debugger/test/fun_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -289,7 +289,7 @@ eep37(Config) when is_list(Config) ->
10 = Add(9),
50 = UnusedName(8),
[1,1,2,6,24,120] = lists:map(F, lists:seq(0, 5)),
- {'EXIT',{{badarity,_},_}} = (catch lists:map(fun G() -> G() end, [1])),
+ {'EXIT',{function_clause,_}} = (catch lists:map(fun G() -> G() end, [1])),
{'EXIT',{{badarity,_},_}} = (catch F()),
ok.
diff --git a/lib/debugger/test/guard_SUITE.erl b/lib/debugger/test/guard_SUITE.erl
index 02a1bbd66b..f677dc8dc0 100644
--- a/lib/debugger/test/guard_SUITE.erl
+++ b/lib/debugger/test/guard_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -203,7 +203,7 @@ guard_bifs(Config) when list(Config) ->
Big = -237849247829874297658726487367328971246284736473821617265433,
Float = 387924.874,
- %% Succeding use of guard bifs.
+ %% Succeeding use of guard bifs.
try_gbif('abs/1', Big, -Big),
try_gbif('float/1', Big, float(Big)),
@@ -1436,7 +1436,7 @@ traverse_dcd(Config) when is_list(Config) ->
%% The function starts out with 3 arguments in {x,0}, {x,1}, {x,2}.
%% The outer match of a two tuple will places the first element in {x,3} and
%% second in {x,4}. The guard for the first clause must make ensure that all of those
-%% registers are restored befor entering the second clause.
+%% registers are restored before entering the second clause.
%%
%% (From mnesia_checkpoint.erl, modified.)
diff --git a/lib/debugger/test/int_SUITE_data/lists1.erl b/lib/debugger/test/int_SUITE_data/lists1.erl
index 32aabfcbb9..fd041d05e0 100644
--- a/lib/debugger/test/int_SUITE_data/lists1.erl
+++ b/lib/debugger/test/int_SUITE_data/lists1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -156,7 +156,7 @@ sublist([H|T], L) when L > 0 ->
sublist(List, L) -> [].
%% delete(Item, List) -> List'
-%% Delete the first occurance of Item from the list L.
+%% Delete the first occurrence of Item from the list L.
delete(Item, [Item|Rest]) -> Rest;
delete(Item, [H|Rest]) ->
@@ -221,7 +221,7 @@ flatten([], [H|Cont], Tail) ->
flatten([], [], Tail) ->
Tail.
-%% flat_length(List) (undocumented can be rmove later)
+%% flat_length(List) (undocumented can be removed later)
%% Calculate the length of a list of lists.
flat_length(List) -> flatlength(List).
diff --git a/lib/debugger/test/int_SUITE_data/my_lists.erl b/lib/debugger/test/int_SUITE_data/my_lists.erl
index dade8e824c..3c7f767982 100644
--- a/lib/debugger/test/int_SUITE_data/my_lists.erl
+++ b/lib/debugger/test/int_SUITE_data/my_lists.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -157,7 +157,7 @@ sublist([H|T], L) when L > 0 ->
sublist(List, L) -> [].
%% delete(Item, List) -> List'
-%% Delete the first occurance of Item from the list L.
+%% Delete the first occurrence of Item from the list L.
delete(Item, [Item|Rest]) -> Rest;
delete(Item, [H|Rest]) ->
@@ -222,7 +222,7 @@ flatten([], [H|Cont], Tail) ->
flatten([], [], Tail) ->
Tail.
-%% flat_length(List) (undocumented can be rmove later)
+%% flat_length(List) (undocumented can be removed later)
%% Calculate the length of a list of lists.
flat_length(List) -> flatlength(List).
@@ -618,7 +618,7 @@ sublist_1([H|T], L) when L > 0 ->
sublist_1(List, L) -> [].
%% delete(Item, List) -> List'
-%% Delete the first occurance of Item from the list L.
+%% Delete the first occurrence of Item from the list L.
delete_1(Item, [Item|Rest]) -> Rest;
delete_1(Item, [H|Rest]) ->
@@ -683,7 +683,7 @@ flatten_1([], [H|Cont], Tail) ->
flatten_1([], [], Tail) ->
Tail.
-%% flat_length(List) (undocumented can be rmove later)
+%% flat_length(List) (undocumented can be removed later)
%% Calculate the length of a list of lists.
flat_length_1(List) -> flatlength_1(List).
@@ -1082,7 +1082,7 @@ sublist_2([H|T], L) when L > 0 ->
sublist_2(List, L) -> [].
%% delete_2(Item, List) -> List'
-%% Delete the first occurance of Item from the list L.
+%% Delete the first occurrence of Item from the list L.
delete_2(Item, [Item|Rest]) -> Rest;
delete_2(Item, [H|Rest]) ->
@@ -1147,7 +1147,7 @@ flatten_2([], [H|Cont], Tail) ->
flatten_2([], [], Tail) ->
Tail.
-%% flat_length_2(List) _2(undocumented can be rmove later)
+%% flat_length_2(List) _2(undocumented can be removed later)
%% Calculate the length of a list of lists.
flat_length_2(List) -> flatlength_2(List).
@@ -1544,7 +1544,7 @@ sublist_3([H|T], L) when L > 0 ->
sublist_3(List, L) -> [].
%% delete_3(Item, List) -> List'
-%% Delete the first occurance of Item from the list L.
+%% Delete the first occurrence of Item from the list L.
delete_3(Item, [Item|Rest]) -> Rest;
delete_3(Item, [H|Rest]) ->
@@ -1609,7 +1609,7 @@ flatten_3([], [H|Cont], Tail) ->
flatten_3([], [], Tail) ->
Tail.
-%% flat_length_3(List) _3(undocumented can be rmove later)
+%% flat_length_3(List) _3(undocumented can be removed later)
%% Calculate the length of a list of lists.
flat_length_3(List) -> flatlength_3(List).
diff --git a/lib/debugger/test/int_eval_SUITE.erl b/lib/debugger/test/int_eval_SUITE.erl
index e564316516..6ec3fb0df7 100644
--- a/lib/debugger/test/int_eval_SUITE.erl
+++ b/lib/debugger/test/int_eval_SUITE.erl
@@ -89,7 +89,7 @@ bifs_outside_erlang(Config) when is_list(Config) ->
ok = spawn_eval(Fun),
ok.
-%% Try evalutate spawn_link/3.
+%% Try evaluating spawn_link/3.
spawning(Config) when is_list(Config) ->
ok = spawn_eval(fun() -> ?IM:spawn_test() end).
diff --git a/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl b/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl
index 1033aa9934..82a742b58b 100644
--- a/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl
+++ b/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl
@@ -118,7 +118,7 @@ external_call_test(Data) ->
{yes,Data} = i_am_exported(Data),
{yes,Data} = ?MODULE:i_am_exported(Data),
- %% Excercise the function cache in the interpreter.
+ %% Exercise the function cache in the interpreter.
{ok,Data,[a,b]} = not_exported(Data, [a,b]),
{yes,Data} = i_am_exported(Data),
diff --git a/lib/debugger/test/trycatch_SUITE.erl b/lib/debugger/test/trycatch_SUITE.erl
index 2857cac9a3..c3d7e03b3b 100644
--- a/lib/debugger/test/trycatch_SUITE.erl
+++ b/lib/debugger/test/trycatch_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -120,7 +120,7 @@ basic(Conf) when is_list(Conf) ->
%% Try/of
ok = try V of
{a,variable} -> ok
- catch nisse -> erro
+ catch nisse -> error
end,
ok.
diff --git a/lib/dialyzer/RELEASE_NOTES b/lib/dialyzer/RELEASE_NOTES
index 299cc8642f..909cada009 100644
--- a/lib/dialyzer/RELEASE_NOTES
+++ b/lib/dialyzer/RELEASE_NOTES
@@ -257,7 +257,7 @@ Version 1.5.1 (in Erlang/OTP R11B-3)
Version 1.5.0 (in Erlang/OTP R11B-2)
------------------------------------
- Dialyzer's building of PLT is based on a different type inference algorithm.
- More specifically, Dialyzer uses inferrence of refined success typings to
+ More specifically, Dialyzer uses inference of refined success typings to
infer function prototypes. As a result, Dialyzer bases its analysis on a
significantly more powerful basis and thus is able to detect more
discrepancies. The downside is that building the PLT is a considerably
diff --git a/lib/dialyzer/doc/src/dialyzer.xml b/lib/dialyzer/doc/src/dialyzer.xml
index 3a0463a2b4..a6340929b2 100644
--- a/lib/dialyzer/doc/src/dialyzer.xml
+++ b/lib/dialyzer/doc/src/dialyzer.xml
@@ -316,6 +316,16 @@ dialyzer --plts plt_1 ... plt_n -- files_to_analyze</code>
<item>
<p>Include warnings for functions that only return by an exception.</p>
</item>
+ <tag><c>-Wextra_return</c> (***)</tag>
+ <item>
+ <p>Warn about functions that return values that are not part of the
+ specification.</p>
+ </item>
+ <tag><c>-Wmissing_return</c> (***)</tag>
+ <item>
+ <p>Warn about functions whose specification includes types that the
+ function cannot return.</p>
+ </item>
<tag><c>-Wno_behaviours</c></tag>
<item>
<p>Suppress warnings about behavior callbacks that drift from the
@@ -362,13 +372,6 @@ dialyzer --plts plt_1 ... plt_n -- files_to_analyze</code>
<item>
<p>Suppress warnings for unused functions.</p>
</item>
- <tag><c>-Wrace_conditions</c> (***)</tag>
- <item>
- <p>Include warnings for possible race conditions. Notice that the
- analysis that finds data races performs intra-procedural data flow
- analysis and can sometimes explode in time. Enable it at your own
- risk.</p>
- </item>
<tag><c>-Wunderspecs</c> (***)</tag>
<item>
<p>Warn about underspecified functions (the specification is strictly
@@ -427,6 +430,16 @@ dialyzer --plts plt_1 ... plt_n -- files_to_analyze</code>
specification is strictly more allowing than the success typing).
</p>
</item>
+ <tag><c>-Wno_extra_return</c></tag>
+ <item>
+ <p>Suppress warnings about functions that return values that are not
+ part of the specification.</p>
+ </item>
+ <tag><c>-Wno_missing_return</c></tag>
+ <item>
+ <p>Suppress warnings about functions whose specification includes types
+ that the function cannot return.</p>
+ </item>
</taglist>
</section>
diff --git a/lib/dialyzer/doc/src/dialyzer_chapter.xml b/lib/dialyzer/doc/src/dialyzer_chapter.xml
index d83943a42b..8f0abe3403 100644
--- a/lib/dialyzer/doc/src/dialyzer_chapter.xml
+++ b/lib/dialyzer/doc/src/dialyzer_chapter.xml
@@ -68,9 +68,11 @@ dialyzer --build_plt --apps erts kernel stdlib mnesia</code>
<p>Dialyzer looks if there is an environment variable called
<c>DIALYZER_PLT</c> and places the PLT at this location. If no such
- variable is set, Dialyzer places the PLT at
- <c>$HOME/.dialyzer_plt</c>. The placement can also be specified using
- the options <c>--plt</c> or <c>--output_plt</c>.</p>
+ variable is set, Dialyzer places the PLT in a file called .dialyzer_plt
+ in the <seeerl marker="stdlib:filename#user_cache">
+ <c>filename:basedir(user_cache, "erlang")</c></seeerl> folder.
+ The placement can also be specified using the options
+ <c>--plt</c> or <c>--output_plt</c>.</p>
<p>Information can be added to an existing PLT using option
<c>--add_to_plt</c>. If you also want to include the Erlang compiler in
diff --git a/lib/dialyzer/doc/src/typer_cmd.xml b/lib/dialyzer/doc/src/typer_cmd.xml
index cfeba9e456..6217fce715 100644
--- a/lib/dialyzer/doc/src/typer_cmd.xml
+++ b/lib/dialyzer/doc/src/typer_cmd.xml
@@ -4,7 +4,7 @@
<comref>
<header>
<copyright>
- <year>2006</year><year>2021</year>
+ <year>2006</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -54,7 +54,7 @@ typer --help</code>
typer [--help] [--version] [--plt PLT] [--edoc]
[--show | --show-exported | --annotate | --annotate-inc-files]
[-Ddefine]* [-I include_dir]* [-pa dir]* [-pz dir]*
- [-T application]* [-r] file*</code>
+ [-T application]* file* [-r directory*]</code>
<note>
<p>* denotes that multiple occurrences of the option are possible.</p>
@@ -66,7 +66,7 @@ typer [--help] [--version] [--plt PLT] [--edoc]
<tag><c>-r</c></tag>
<item>
- <p>Search directories recursively for .erl files below them.</p>
+ <p>Search directories recursively for .erl files below them. If a list of files is given, this must be after them.</p>
</item>
<tag><c>--show</c></tag>
<item>
diff --git a/lib/dialyzer/src/Makefile b/lib/dialyzer/src/Makefile
index 5f2c24c3c0..c934ecdc2b 100644
--- a/lib/dialyzer/src/Makefile
+++ b/lib/dialyzer/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2006-2021. All Rights Reserved.
+# Copyright Ericsson AB 2006-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -47,11 +47,7 @@ DIALYZER_DIR = $(ERL_TOP)/lib/dialyzer
# Target Specs
# ----------------------------------------------------
MODULES = \
- cerl_closurean \
- cerl_lib \
- cerl_pmatch \
cerl_prettypr \
- cerl_typean \
dialyzer \
dialyzer_analysis_callgraph \
dialyzer_behaviours \
@@ -68,17 +64,17 @@ MODULES = \
dialyzer_gui_wx \
dialyzer_options \
dialyzer_plt \
- dialyzer_race_data_server \
- dialyzer_races \
dialyzer_succ_typings \
dialyzer_timing \
dialyzer_typesig \
+ dialyzer_typegraph \
dialyzer_coordinator \
dialyzer_worker \
dialyzer_utils \
erl_bif_types \
erl_types \
- typer
+ typer \
+ typer_core
HRL_FILES= dialyzer.hrl dialyzer_gui_wx.hrl
ERL_FILES= $(MODULES:%=%.erl)
@@ -104,7 +100,7 @@ ERL_COMPILE_FLAGS += +warn_export_vars +warn_unused_import +warn_missing_spec
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
docs:
@@ -156,6 +152,7 @@ $(EBIN)/dialyzer_race_data_server.beam: dialyzer.hrl
$(EBIN)/dialyzer_races.beam: dialyzer.hrl
$(EBIN)/dialyzer_succ_typings.beam: dialyzer.hrl
$(EBIN)/dialyzer_typesig.beam: dialyzer.hrl
+$(EBIN)/dialyzer_typegraph.beam: dialyzer.hrl
$(EBIN)/dialyzer_utils.beam: dialyzer.hrl
# ----------------------------------------------------
diff --git a/lib/dialyzer/src/cerl_closurean.erl b/lib/dialyzer/src/cerl_closurean.erl
deleted file mode 100644
index 55dcfeed1d..0000000000
--- a/lib/dialyzer/src/cerl_closurean.erl
+++ /dev/null
@@ -1,856 +0,0 @@
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% @copyright 2001-2002 Richard Carlsson
-%% @author Richard Carlsson <carlsson.richard@gmail.com>
-%% @doc Closure analysis of Core Erlang programs.
-
-%% TODO: might need a "top" (`any') element for any-length value lists.
-
--module(cerl_closurean).
-
--export([analyze/1, annotate/1]).
-%% The following functions are exported from this module since they
-%% are also used by Dialyzer (file dialyzer/src/dialyzer_dep.erl)
--export([is_escape_op/2, is_escape_op/3, is_literal_op/2, is_literal_op/3]).
-
--import(cerl, [ann_c_apply/3, ann_c_fun/3, ann_c_var/2, apply_args/1,
- apply_op/1, atom_val/1, bitstr_size/1, bitstr_val/1,
- binary_segments/1, c_letrec/2, c_seq/2, c_tuple/1,
- c_nil/0, call_args/1, call_module/1, call_name/1,
- case_arg/1, case_clauses/1, catch_body/1, clause_body/1,
- clause_guard/1, clause_pats/1, cons_hd/1, cons_tl/1,
- fun_body/1, fun_vars/1, get_ann/1, is_c_atom/1,
- let_arg/1, let_body/1, let_vars/1, letrec_body/1,
- letrec_defs/1, module_defs/1, module_defs/1,
- module_exports/1, pat_vars/1, primop_args/1,
- primop_name/1, receive_action/1, receive_clauses/1,
- receive_timeout/1, seq_arg/1, seq_body/1, set_ann/2,
- try_arg/1, try_body/1, try_vars/1, try_evars/1,
- try_handler/1, tuple_es/1, type/1, values_es/1]).
-
--import(cerl_trees, [get_label/1]).
-
-%% ===========================================================================
-
--type label() :: integer() | 'top' | 'external' | 'external_call'.
--type ordset(X) :: [X]. % XXX: TAKE ME OUT
--type labelset() :: ordset(label()).
--type outlist() :: [labelset()] | 'none'.
--type escapes() :: labelset().
-
-%% ===========================================================================
-%% annotate(Tree) -> {Tree1, OutList, Outputs, Escapes, Dependencies, Parents}
-%%
-%% Tree = cerl:cerl()
-%%
-%% Analyzes `Tree' (see `analyze') and appends terms `{callers,
-%% Labels}' and `{calls, Labels}' to the annotation list of each
-%% fun-expression node and apply-expression node of `Tree',
-%% respectively, where `Labels' is an ordered-set list of labels of
-%% fun-expressions in `Tree', possibly also containing the atom
-%% `external', corresponding to the dependency information derived
-%% by the analysis. Any previous such annotations are removed from
-%% `Tree'. `Tree1' is the modified tree; for details on `OutList',
-%% `Outputs' , `Dependencies', `Escapes' and `Parents', see
-%% `analyze'.
-%%
-%% Note: `Tree' must be annotated with labels in order to use this
-%% function; see `analyze' for details.
-
--spec annotate(cerl:cerl()) ->
- {cerl:cerl(), outlist(), dict:dict(),
- escapes(), dict:dict(), dict:dict()}.
-
-annotate(Tree) ->
- {Xs, Out, Esc, Deps, Par} = analyze(Tree),
- F = fun (T) ->
- case type(T) of
- 'fun' ->
- L = get_label(T),
- X = case dict:find(L, Deps) of
- {ok, X1} -> X1;
- error -> set__new()
- end,
- set_ann(T, append_ann(callers,
- set__to_list(X),
- get_ann(T)));
- apply ->
- L = get_label(T),
- X = case dict:find(L, Deps) of
- {ok, X1} -> X1;
- error -> set__new()
- end,
- set_ann(T, append_ann(calls,
- set__to_list(X),
- get_ann(T)));
- _ ->
-%%% set_ann(T, []) % debug
- T
- end
- end,
- {cerl_trees:map(F, Tree), Xs, Out, Esc, Deps, Par}.
-
-append_ann(Tag, Val, [X | Xs]) ->
- if tuple_size(X) >= 1, element(1, X) =:= Tag ->
- append_ann(Tag, Val, Xs);
- true ->
- [X | append_ann(Tag, Val, Xs)]
- end;
-append_ann(Tag, Val, []) ->
- [{Tag, Val}].
-
-%% =====================================================================
-%% analyze(Tree) -> {OutList, Outputs, Escapes, Dependencies, Parents}
-%%
-%% Tree = cerl()
-%% OutList = [LabelSet] | none
-%% Outputs = dict(Label, OutList)
-%% Escapes = LabelSet
-%% Dependencies = dict(Label, LabelSet)
-%% LabelSet = ordset(Label)
-%% Label = integer() | top | external | external_call
-%% Parents = dict(Label, Label)
-%%
-%% Analyzes a module or an expression represented by `Tree'.
-%%
-%% The returned `OutList' is a list of sets of labels of
-%% fun-expressions which correspond to the possible closures in the
-%% value list produced by `Tree' (viewed as an expression; the
-%% "value" of a module contains its exported functions). The atom
-%% `none' denotes missing or conflicting information.
-%%
-%% The atom `external' in any label set denotes any possible
-%% function outside `Tree', including those in `Escapes'. The atom
-%% `top' denotes the top-level expression `Tree'.
-%%
-%% `Outputs' is a mapping from the labels of fun-expressions in
-%% `Tree' to corresponding lists of sets of labels of
-%% fun-expressions (or the atom `none'), representing the possible
-%% closures in the value lists returned by the respective
-%% functions.
-%%
-%% `Dependencies' is a similar mapping from the labels of
-%% fun-expressions and apply-expressions in `Tree' to sets of
-%% labels of corresponding fun-expressions which may contain call
-%% sites of the functions or be called from the call sites,
-%% respectively. Any such label not defined in `Dependencies'
-%% represents an unreachable function or a dead or faulty
-%% application.
-%%
-%% `Escapes' is the set of labels of fun-expressions in `Tree' such
-%% that corresponding closures may be accessed from outside `Tree'.
-%%
-%% `Parents' is a mapping from labels of fun-expressions in `Tree'
-%% to the corresponding label of the nearest containing
-%% fun-expression or top-level expression. This can be used to
-%% extend the dependency graph, for certain analyses.
-%%
-%% Note: `Tree' must be annotated with labels (as done by the
-%% function `cerl_trees:label/1') in order to use this function.
-%% The label annotation `{label, L}' (where L should be an integer)
-%% must be the first element of the annotation list of each node in
-%% the tree. Instances of variables bound in `Tree' which denote
-%% the same variable must have the same label; apart from this,
-%% labels should be unique. Constant literals do not need to be
-%% labeled.
-
--record(state, {vars, out, dep, work, funs, par}).
-
-%% Note: In order to keep our domain simple, we assume that all remote
-%% calls and primops return a single value, if any.
-
-%% We use the terms `closure', `label', `lambda' and `fun-expression'
-%% interchangeably. The exact meaning in each case can be grasped from
-%% the context.
-%%
-%% Rules:
-%% 1) The implicit top level lambda escapes.
-%% 2) A lambda returned by an escaped lambda also escapes.
-%% 3) An escaped lambda can be passed an external lambda as argument.
-%% 4) A lambda passed as argument to an external lambda also escapes.
-%% 5) An argument passed to an unknown operation escapes.
-%% 6) A call to an unknown operation can return an external lambda.
-%%
-%% Escaped lambdas become part of the set of external lambdas, but this
-%% does not need to be represented explicitly.
-
-%% We wrap the given syntax tree T in a fun-expression labeled `top',
-%% which is initially in the set of escaped labels. `top' will be
-%% visited at least once.
-%%
-%% We create a separate function labeled `external', defined as:
-%% "'external'/1 = fun (Escape) -> do apply 'external'/1(apply Escape())
-%% 'external'/1", which will represent any and all functions outside T,
-%% and which returns itself, and contains a recursive call; this models
-%% rules 2 and 4 above. It will be revisited if the set of escaped
-%% labels changes, or at least once. Its parameter `Escape' is a
-%% variable labeled `escape', which will hold the set of escaped labels.
-%% initially it contains `top' and `external'.
-
--spec analyze(cerl:cerl()) ->
- {outlist(), dict:dict(), escapes(), dict:dict(), dict:dict()}.
-
-analyze(Tree) ->
- %% Note that we use different name spaces for variable labels and
- %% function/call site labels, so we can reuse some names here. We
- %% assume that the labeling of Tree only uses integers, not atoms.
- External = ann_c_var([{label, external}], {external, 1}),
- Escape = ann_c_var([{label, escape}], 'Escape'),
- ExtBody = c_seq(ann_c_apply([{label, loop}], External,
- [ann_c_apply([{label, external_call}],
- Escape, [])]),
- External),
- ExtFun = ann_c_fun([{label, external}], [Escape], ExtBody),
-%%% io:fwrite("external fun:\n~s.\n",
-%%% [cerl_prettypr:format(ExtFun, [noann])]),
- Top = ann_c_var([{label, top}], {top, 0}),
- TopFun = ann_c_fun([{label, top}], [], Tree),
-
- %% The "start fun" just makes the initialisation easier. It will not
- %% be marked as escaped, and thus cannot be called.
- StartFun = ann_c_fun([{label, start}], [],
- c_letrec([{External, ExtFun}, {Top, TopFun}],
- c_nil())),
-%%% io:fwrite("start fun:\n~s.\n",
-%%% [cerl_prettypr:format(StartFun, [noann])]),
-
- %% Gather a database of all fun-expressions in Tree and initialise
- %% all their outputs and parameter variables. Bind all module- and
- %% letrec-defined variables to their corresponding labels.
- Funs0 = dict:new(),
- Vars0 = dict:new(),
- Out0 = dict:new(),
- Empty = empty(),
- F = fun (T, S = {Fs, Vs, Os}) ->
- case type(T) of
- 'fun' ->
- L = get_label(T),
- As = fun_vars(T),
- {dict:store(L, T, Fs),
- bind_vars_single(As, Empty, Vs),
- dict:store(L, none, Os)};
- letrec ->
- {Fs, bind_defs(letrec_defs(T), Vs), Os};
- module ->
- {Fs, bind_defs(module_defs(T), Vs), Os};
- _ ->
- S
- end
- end,
- {Funs, Vars, Out} = cerl_trees:fold(F, {Funs0, Vars0, Out0},
- StartFun),
-
- %% Initialise Escape to the minimal set of escaped labels.
- Vars1 = dict:store(escape, from_label_list([top, external]), Vars),
-
- %% Enter the fixpoint iteration at the StartFun.
- St = loop(StartFun, start, #state{vars = Vars1,
- out = Out,
- dep = dict:new(),
- work = init_work(),
- funs = Funs,
- par = dict:new()}),
-%%% io:fwrite("dependencies: ~p.\n",
-%%% [[{X, set__to_list(Y)}
-%%% || {X, Y} <- dict:to_list(St#state.dep)]]),
- {dict:fetch(top, St#state.out),
- tidy_dict([start, top, external], St#state.out),
- dict:fetch(escape, St#state.vars),
- tidy_dict([loop], St#state.dep),
- St#state.par}.
-
-tidy_dict([X | Xs], D) ->
- tidy_dict(Xs, dict:erase(X, D));
-tidy_dict([], D) ->
- D.
-
-loop(T, L, St0) ->
-%%% io:fwrite("analyzing: ~w.\n", [L]),
-%%% io:fwrite("work: ~w.\n", [St0#state.work]),
- Xs0 = dict:fetch(L, St0#state.out),
- {Xs, St1} = visit(fun_body(T), L, St0),
- {W, M} = case equal(Xs0, Xs) of
- true ->
- {St1#state.work, St1#state.out};
- false ->
-%%% io:fwrite("out (~w) changed: ~w <- ~w.\n",
-%%% [L, Xs, Xs0]),
- M1 = dict:store(L, Xs, St1#state.out),
- case dict:find(L, St1#state.dep) of
- {ok, S} ->
- {add_work(set__to_list(S), St1#state.work),
- M1};
- error ->
- {St1#state.work, M1}
- end
- end,
- St2 = St1#state{out = M},
- case take_work(W) of
- {ok, L1, W1} ->
- T1 = dict:fetch(L1, St2#state.funs),
- loop(T1, L1, St2#state{work = W1});
- none ->
- St2
- end.
-
-visit(T, L, St) ->
- case type(T) of
- literal ->
- {[empty()], St};
- var ->
- %% If a variable is not already in the store here, we
- %% initialize it to empty().
- L1 = get_label(T),
- Vars = St#state.vars,
- case dict:find(L1, Vars) of
- {ok, X} ->
- {[X], St};
- error ->
- X = empty(),
- St1 = St#state{vars = dict:store(L1, X, Vars)},
- {[X], St1}
- end;
- 'fun' ->
- %% Must revisit the fun also, because its environment might
- %% have changed. (We don't keep track of such dependencies.)
- L1 = get_label(T),
- St1 = St#state{work = add_work([L1], St#state.work),
- par = set_parent([L1], L, St#state.par)},
- {[singleton(L1)], St1};
- values ->
- visit_list(values_es(T), L, St);
- cons ->
- {Xs, St1} = visit_list([cons_hd(T), cons_tl(T)], L, St),
- {[join_single_list(Xs)], St1};
- tuple ->
- {Xs, St1} = visit_list(tuple_es(T), L, St),
- {[join_single_list(Xs)], St1};
- 'let' ->
- {Xs, St1} = visit(let_arg(T), L, St),
- Vars = bind_vars(let_vars(T), Xs, St1#state.vars),
- visit(let_body(T), L, St1#state{vars = Vars});
- seq ->
- {_, St1} = visit(seq_arg(T), L, St),
- visit(seq_body(T), L, St1);
- apply ->
- {Xs, St1} = visit(apply_op(T), L, St),
- {As, St2} = visit_list(apply_args(T), L, St1),
- case Xs of
- [X] ->
- %% We store the dependency from the call site to the
- %% called functions
- Ls = set__to_list(X),
- Out = St2#state.out,
- Xs1 = join_list([dict:fetch(Lx, Out) || Lx <- Ls]),
- St3 = call_site(Ls, L, As, St2),
- L1 = get_label(T),
- D = dict:store(L1, X, St3#state.dep),
- {Xs1, St3#state{dep = D}};
- none ->
- {none, St2}
- end;
- call ->
- M = call_module(T),
- F = call_name(T),
- {_, St1} = visit(M, L, St),
- {_, St2} = visit(F, L, St1),
- {Xs, St3} = visit_list(call_args(T), L, St2),
- remote_call(M, F, Xs, St3);
- primop ->
- As = primop_args(T),
- {Xs, St1} = visit_list(As, L, St),
- primop_call(atom_val(primop_name(T)), length(Xs), Xs, St1);
- 'case' ->
- {Xs, St1} = visit(case_arg(T), L, St),
- visit_clauses(Xs, case_clauses(T), L, St1);
- 'receive' ->
- X = singleton(external),
- {Xs1, St1} = visit_clauses([X], receive_clauses(T), L, St),
- {_, St2} = visit(receive_timeout(T), L, St1),
- {Xs2, St3} = visit(receive_action(T), L, St2),
- {join(Xs1, Xs2), St3};
- 'try' ->
- {Xs1, St1} = visit(try_arg(T), L, St),
- X = singleton(external),
- Vars = bind_vars(try_vars(T), [X], St1#state.vars),
- {Xs2, St2} = visit(try_body(T), L, St1#state{vars = Vars}),
- Evars = bind_vars(try_evars(T), [X, X, X], St2#state.vars),
- {Xs3, St3} = visit(try_handler(T), L, St2#state{vars = Evars}),
- {join(join(Xs1, Xs2), Xs3), St3};
- 'catch' ->
- {_, St1} = visit(catch_body(T), L, St),
- {[singleton(external)], St1};
- binary ->
- {_, St1} = visit_list(binary_segments(T), L, St),
- {[empty()], St1};
- bitstr ->
- %% The other fields are constant literals.
- {_, St1} = visit(bitstr_val(T), L, St),
- {_, St2} = visit(bitstr_size(T), L, St1),
- {none, St2};
- letrec ->
- %% All the bound funs should be revisited, because the
- %% environment might have changed.
- Ls = [get_label(F) || {_, F} <- letrec_defs(T)],
- St1 = St#state{work = add_work(Ls, St#state.work),
- par = set_parent(Ls, L, St#state.par)},
- visit(letrec_body(T), L, St1);
- module ->
- %% All the exported functions escape, and can thus be passed
- %% any external closures as arguments. We regard a module as
- %% a tuple of function variables in the body of a `letrec'.
- visit(c_letrec(module_defs(T), c_tuple(module_exports(T))),
- L, St)
- end.
-
-visit_clause(T, Xs, L, St) ->
- Vars = bind_pats(clause_pats(T), Xs, St#state.vars),
- {_, St1} = visit(clause_guard(T), L, St#state{vars = Vars}),
- visit(clause_body(T), L, St1).
-
-%% We assume correct value-list typing.
-
-visit_list([T | Ts], L, St) ->
- {Xs, St1} = visit(T, L, St),
- {Xs1, St2} = visit_list(Ts, L, St1),
- X = case Xs of
- [X1] -> X1;
- none -> none
- end,
- {[X | Xs1], St2};
-visit_list([], _L, St) ->
- {[], St}.
-
-visit_clauses(Xs, [T | Ts], L, St) ->
- {Xs1, St1} = visit_clause(T, Xs, L, St),
- {Xs2, St2} = visit_clauses(Xs, Ts, L, St1),
- {join(Xs1, Xs2), St2};
-visit_clauses(_, [], _L, St) ->
- {none, St}.
-
-bind_defs([{V, F} | Ds], Vars) ->
- bind_defs(Ds, dict:store(get_label(V), singleton(get_label(F)),
- Vars));
-bind_defs([], Vars) ->
- Vars.
-
-bind_pats(Ps, none, Vars) ->
- bind_pats_single(Ps, empty(), Vars);
-bind_pats(Ps, Xs, Vars) ->
- if length(Xs) =:= length(Ps) ->
- bind_pats_list(Ps, Xs, Vars);
- true ->
- bind_pats_single(Ps, empty(), Vars)
- end.
-
-bind_pats_list([P | Ps], [X | Xs], Vars) ->
- bind_pats_list(Ps, Xs, bind_vars_single(pat_vars(P), X, Vars));
-bind_pats_list([], [], Vars) ->
- Vars.
-
-bind_pats_single([P | Ps], X, Vars) ->
- bind_pats_single(Ps, X, bind_vars_single(pat_vars(P), X, Vars));
-bind_pats_single([], _X, Vars) ->
- Vars.
-
-bind_vars(Vs, none, Vars) ->
- bind_vars_single(Vs, empty(), Vars);
-bind_vars(Vs, Xs, Vars) ->
- if length(Vs) =:= length(Xs) ->
- bind_vars_list(Vs, Xs, Vars);
- true ->
- bind_vars_single(Vs, empty(), Vars)
- end.
-
-bind_vars_list([V | Vs], [X | Xs], Vars) ->
- bind_vars_list(Vs, Xs, dict:store(get_label(V), X, Vars));
-bind_vars_list([], [], Vars) ->
- Vars.
-
-bind_vars_single([V | Vs], X, Vars) ->
- bind_vars_single(Vs, X, dict:store(get_label(V), X, Vars));
-bind_vars_single([], _X, Vars) ->
- Vars.
-
-%% This handles a call site - adding dependencies and updating parameter
-%% variables with respect to the actual parameters. The 'external'
-%% function is handled specially, since it can get an arbitrary number
-%% of arguments, which must be unified into a single argument.
-
-call_site(Ls, L, Xs, St) ->
-%%% io:fwrite("call site: ~w -> ~w (~w).\n", [L, Ls, Xs]),
- {D, W, V} = call_site(Ls, L, Xs, St#state.dep, St#state.work,
- St#state.vars, St#state.funs),
- St#state{dep = D, work = W, vars = V}.
-
-call_site([external | Ls], T, Xs, D, W, V, Fs) ->
- D1 = add_dep(external, T, D),
- X = join_single_list(Xs),
- case bind_arg(escape, X, V) of
- {V1, true} ->
-%%% io:fwrite("escape changed: ~w <- ~w + ~w.\n",
-%%% [dict:fetch(escape, V1), dict:fetch(escape, V),
-%%% X]),
- {W1, V2} = update_esc(set__to_list(X), W, V1, Fs),
- call_site(Ls, T, Xs, D1, add_work([external], W1), V2, Fs);
- {V1, false} ->
- call_site(Ls, T, Xs, D1, W, V1, Fs)
- end;
-call_site([L | Ls], T, Xs, D, W, V, Fs) ->
- D1 = add_dep(L, T, D),
- Vs = fun_vars(dict:fetch(L, Fs)),
- case bind_args(Vs, Xs, V) of
- {V1, true} ->
- call_site(Ls, T, Xs, D1, add_work([L], W), V1, Fs);
- {V1, false} ->
- call_site(Ls, T, Xs, D1, W, V1, Fs)
- end;
-call_site([], _, _, D, W, V, _) ->
- {D, W, V}.
-
-%% Note that `visit' makes sure all lambdas are visited at least once.
-%% For every called function, we add a dependency from the *called*
-%% function to the function containing the call site.
-
-add_dep(Source, Target, Deps) ->
- case dict:find(Source, Deps) of
- {ok, X} ->
- case set__is_member(Target, X) of
- true ->
- Deps;
- false ->
-%%% io:fwrite("new dep: ~w <- ~w.\n", [Target, Source]),
- dict:store(Source, set__add(Target, X), Deps)
- end;
- error ->
-%%% io:fwrite("new dep: ~w <- ~w.\n", [Target, Source]),
- dict:store(Source, set__singleton(Target), Deps)
- end.
-
-%% If the arity does not match the call, nothing is done here.
-
-bind_args(Vs, Xs, Vars) ->
- if length(Vs) =:= length(Xs) ->
- bind_args(Vs, Xs, Vars, false);
- true ->
- {Vars, false}
- end.
-
-bind_args([V | Vs], [X | Xs], Vars, Ch) ->
- L = get_label(V),
- {Vars1, Ch1} = bind_arg(L, X, Vars, Ch),
- bind_args(Vs, Xs, Vars1, Ch1);
-bind_args([], [], Vars, Ch) ->
- {Vars, Ch}.
-
-bind_args_single(Vs, X, Vars) ->
- bind_args_single(Vs, X, Vars, false).
-
-bind_args_single([V | Vs], X, Vars, Ch) ->
- L = get_label(V),
- {Vars1, Ch1} = bind_arg(L, X, Vars, Ch),
- bind_args_single(Vs, X, Vars1, Ch1);
-bind_args_single([], _, Vars, Ch) ->
- {Vars, Ch}.
-
-bind_arg(L, X, Vars) ->
- bind_arg(L, X, Vars, false).
-
-bind_arg(L, X, Vars, Ch) ->
- X0 = dict:fetch(L, Vars),
- X1 = join_single(X, X0),
- case equal_single(X0, X1) of
- true ->
- {Vars, Ch};
- false ->
-%%% io:fwrite("arg (~w) changed: ~w <- ~w + ~w.\n",
-%%% [L, X1, X0, X]),
- {dict:store(L, X1, Vars), true}
- end.
-
-%% This handles escapes from things like primops and remote calls.
-
-%% escape(none, St) ->
-%% St;
-escape([X], St) ->
- Vars = St#state.vars,
- X0 = dict:fetch(escape, Vars),
- X1 = join_single(X, X0),
- case equal_single(X0, X1) of
- true ->
- St;
- false ->
-%%% io:fwrite("escape changed: ~w <- ~w + ~w.\n", [X1, X0, X]),
-%%% io:fwrite("updating escaping funs: ~w.\n", [set__to_list(X)]),
- Vars1 = dict:store(escape, X1, Vars),
- {W, Vars2} = update_esc(set__to_list(set__subtract(X, X0)),
- St#state.work, Vars1,
- St#state.funs),
- St#state{work = add_work([external], W), vars = Vars2}
- end.
-
-%% For all escaping lambdas, since they might be called from outside the
-%% program, all their arguments may be an external lambda. (Note that we
-%% only have to include the `external' label once per escaping lambda.)
-%% If the escape set has changed, we need to revisit the `external' fun.
-
-update_esc(Ls, W, V, Fs) ->
- update_esc(Ls, singleton(external), W, V, Fs).
-
-%% The external lambda is skipped here - the Escape variable is known to
-%% contain `external' from the start.
-
-update_esc([external | Ls], X, W, V, Fs) ->
- update_esc(Ls, X, W, V, Fs);
-update_esc([L | Ls], X, W, V, Fs) ->
- Vs = fun_vars(dict:fetch(L, Fs)),
- case bind_args_single(Vs, X, V) of
- {V1, true} ->
- update_esc(Ls, X, add_work([L], W), V1, Fs);
- {V1, false} ->
- update_esc(Ls, X, W, V1, Fs)
- end;
-update_esc([], _, W, V, _) ->
- {W, V}.
-
-set_parent([L | Ls], L1, D) ->
- set_parent(Ls, L1, dict:store(L, L1, D));
-set_parent([], _L1, D) ->
- D.
-
-%% Handle primop calls: (At present, we assume that all unknown primops
-%% yield exactly one value. This might have to be changed.)
-
-primop_call(F, A, Xs, St0) ->
- case is_pure_op(F, A) of
- %% XXX: this case is currently not possible -- commented out.
- %% true ->
- %% case is_literal_op(F, A) of
- %% true -> {[empty()], St0};
- %% false -> {[join_single_list(Xs)], St0}
- %% end;
- false ->
- St1 = case is_escape_op(F, A) of
- true -> escape([join_single_list(Xs)], St0);
- false -> St0
- end,
- case is_literal_op(F, A) of
- true -> {none, St1};
- false -> {[singleton(external)], St1}
- end
- end.
-
-%% Handle remote-calls: (At present, we assume that all unknown calls
-%% yield exactly one value. This might have to be changed.)
-
-remote_call(M, F, Xs, St) ->
- case is_c_atom(M) andalso is_c_atom(F) of
- true ->
- remote_call_1(atom_val(M), atom_val(F), length(Xs), Xs, St);
- false ->
- %% Unknown function
- {[singleton(external)], escape([join_single_list(Xs)], St)}
- end.
-
-remote_call_1(M, F, A, Xs, St0) ->
- case is_pure_op(M, F, A) of
- true ->
- case is_literal_op(M, F, A) of
- true -> {[empty()], St0};
- false -> {[join_single_list(Xs)], St0}
- end;
- false ->
- St1 = case is_escape_op(M, F, A) of
- true -> escape([join_single_list(Xs)], St0);
- false -> St0
- end,
- case is_literal_op(M, F, A) of
- true -> {[empty()], St1};
- false -> {[singleton(external)], St1}
- end
- end.
-
-%% Domain: none | [Vs], where Vs = set(integer()).
-
-join(none, Xs2) -> Xs2;
-join(Xs1, none) -> Xs1;
-join(Xs1, Xs2) ->
- if length(Xs1) =:= length(Xs2) ->
- join_1(Xs1, Xs2);
- true ->
- none
- end.
-
-join_1([X1 | Xs1], [X2 | Xs2]) ->
- [join_single(X1, X2) | join_1(Xs1, Xs2)];
-join_1([], []) ->
- [].
-
-empty() -> set__new().
-
-singleton(X) -> set__singleton(X).
-
-from_label_list(X) -> set__from_list(X).
-
-join_single(none, Y) -> Y;
-join_single(X, none) -> X;
-join_single(X, Y) -> set__union(X, Y).
-
-join_list([Xs | Xss]) ->
- join(Xs, join_list(Xss));
-join_list([]) ->
- none.
-
-join_single_list([X | Xs]) ->
- join_single(X, join_single_list(Xs));
-join_single_list([]) ->
- empty().
-
-equal(none, none) -> true;
-equal(none, _) -> false;
-equal(_, none) -> false;
-equal(X1, X2) -> equal_1(X1, X2).
-
-equal_1([X1 | Xs1], [X2 | Xs2]) ->
- equal_single(X1, X2) andalso equal_1(Xs1, Xs2);
-equal_1([], []) -> true;
-equal_1(_, _) -> false.
-
-equal_single(X, Y) -> set__equal(X, Y).
-
-%% Set abstraction for label sets in the domain.
-
-set__new() -> [].
-
-set__singleton(X) -> [X].
-
-set__to_list(S) -> S.
-
-set__from_list(S) -> ordsets:from_list(S).
-
-set__union(X, Y) -> ordsets:union(X, Y).
-
-set__add(X, S) -> ordsets:add_element(X, S).
-
-set__is_member(X, S) -> ordsets:is_element(X, S).
-
-set__subtract(X, Y) -> ordsets:subtract(X, Y).
-
-set__equal(X, Y) -> X =:= Y.
-
-%% A simple but efficient functional queue.
-
-queue__new() -> {[], []}.
-
-queue__put(X, {In, Out}) -> {[X | In], Out}.
-
-queue__get({In, [X | Out]}) -> {ok, X, {In, Out}};
-queue__get({[], _}) -> empty;
-queue__get({In, _}) ->
- [X | In1] = lists:reverse(In),
- {ok, X, {[], In1}}.
-
-%% The work list - a queue without repeated elements.
-
-init_work() ->
- {queue__new(), sets:new()}.
-
-add_work(Ls, {Q, Set}) ->
- add_work(Ls, Q, Set).
-
-%% Note that the elements are enqueued in order.
-
-add_work([L | Ls], Q, Set) ->
- case sets:is_element(L, Set) of
- true ->
- add_work(Ls, Q, Set);
- false ->
- add_work(Ls, queue__put(L, Q), sets:add_element(L, Set))
- end;
-add_work([], Q, Set) ->
- {Q, Set}.
-
-take_work({Queue0, Set0}) ->
- case queue__get(Queue0) of
- {ok, L, Queue1} ->
- Set1 = sets:del_element(L, Set0),
- {ok, L, {Queue1, Set1}};
- empty ->
- none
- end.
-
-%% Escape operators may let their arguments escape. Unless we know
-%% otherwise, and the function is not pure, we assume this is the case.
-%% Error-raising functions (fault/match_fail) are not considered as
-%% escapes (but throw/exit are). Zero-argument functions need not be
-%% listed.
-
--spec is_escape_op(atom(), arity()) -> boolean().
-
-is_escape_op(match_fail, 1) -> false;
-is_escape_op(recv_wait_timeout, 1) -> false;
-is_escape_op(F, A) when is_atom(F), is_integer(A) -> true.
-
--spec is_escape_op(atom(), atom(), arity()) -> boolean().
-
-is_escape_op(erlang, error, 1) -> false;
-is_escape_op(erlang, error, 2) -> false;
-is_escape_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> true.
-
-%% "Literal" operators will never return functional values even when
-%% found in their arguments. Unless we know otherwise, we assume this is
-%% not the case. (More functions can be added to this list, if needed
-%% for better precision. Note that the result of `term_to_binary' still
-%% contains an encoding of the closure.)
-
--spec is_literal_op(atom(), arity()) -> boolean().
-
-is_literal_op(recv_wait_timeout, 1) -> true;
-is_literal_op(match_fail, 1) -> true;
-is_literal_op(F, A) when is_atom(F), is_integer(A) -> false.
-
--spec is_literal_op(atom(), atom(), arity()) -> boolean().
-
-is_literal_op(erlang, '+', 2) -> true;
-is_literal_op(erlang, '-', 2) -> true;
-is_literal_op(erlang, '*', 2) -> true;
-is_literal_op(erlang, '/', 2) -> true;
-is_literal_op(erlang, '=:=', 2) -> true;
-is_literal_op(erlang, '==', 2) -> true;
-is_literal_op(erlang, '=/=', 2) -> true;
-is_literal_op(erlang, '/=', 2) -> true;
-is_literal_op(erlang, '<', 2) -> true;
-is_literal_op(erlang, '=<', 2) -> true;
-is_literal_op(erlang, '>', 2) -> true;
-is_literal_op(erlang, '>=', 2) -> true;
-is_literal_op(erlang, 'and', 2) -> true;
-is_literal_op(erlang, 'or', 2) -> true;
-is_literal_op(erlang, 'not', 1) -> true;
-is_literal_op(erlang, length, 1) -> true;
-is_literal_op(erlang, size, 1) -> true;
-is_literal_op(erlang, fun_info, 1) -> true;
-is_literal_op(erlang, fun_info, 2) -> true;
-is_literal_op(erlang, fun_to_list, 1) -> true;
-is_literal_op(erlang, throw, 1) -> true;
-is_literal_op(erlang, exit, 1) -> true;
-is_literal_op(erlang, error, 1) -> true;
-is_literal_op(erlang, error, 2) -> true;
-is_literal_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> false.
-
-%% Pure functions neither affect the state, nor depend on it.
-
-is_pure_op(F, A) when is_atom(F), is_integer(A) -> false.
-
-is_pure_op(M, F, A) -> erl_bifs:is_pure(M, F, A).
-
-%% =====================================================================
diff --git a/lib/dialyzer/src/cerl_lib.erl b/lib/dialyzer/src/cerl_lib.erl
deleted file mode 100644
index 3a6fb1cf51..0000000000
--- a/lib/dialyzer/src/cerl_lib.erl
+++ /dev/null
@@ -1,457 +0,0 @@
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% @copyright 1999-2002 Richard Carlsson
-%% @author Richard Carlsson <carlsson.richard@gmail.com>
-%% @doc Utility functions for Core Erlang abstract syntax trees.
-%%
-%% <p>Syntax trees are defined in the module <a
-%% href=""><code>cerl</code></a>.</p>
-%%
-%% @type cerl() = cerl:cerl()
-
--module(cerl_lib).
-
--define(NO_UNUSED, true).
-
--export([is_safe_expr/2, reduce_expr/1, is_simple_clause/1,
- is_bool_switch/1, bool_switch_cases/1]).
--ifndef(NO_UNUSED).
--export([is_safe_expr/1, is_pure_expr/1, is_pure_expr/2,
- make_bool_switch/3]).
--endif.
-
-
-%% Test if a clause has a single pattern and an always-true guard.
-
--spec is_simple_clause(cerl:c_clause()) -> boolean().
-
-is_simple_clause(C) ->
- case cerl:clause_pats(C) of
- [_P] ->
- G = cerl:clause_guard(C),
- case cerl_clauses:eval_guard(G) of
- {value, true} -> true;
- _ -> false
- end;
- _ -> false
- end.
-
-%% Creating an if-then-else construct that can be recognized as such.
-%% `Test' *must* be guaranteed to return a boolean.
-
--ifndef(NO_UNUSED).
-make_bool_switch(Test, True, False) ->
- Cs = [cerl:c_clause([cerl:c_atom(true)], True),
- cerl:c_clause([cerl:c_atom(false)], False)],
- cerl:c_case(Test, Cs).
--endif.
-
-%% A boolean switch cannot have a catch-all; only true/false branches.
-
--spec is_bool_switch([cerl:c_clause()]) -> boolean().
-
-is_bool_switch([C1, C2]) ->
- case is_simple_clause(C1) andalso is_simple_clause(C2) of
- true ->
- [P1] = cerl:clause_pats(C1),
- [P2] = cerl:clause_pats(C2),
- case cerl:is_c_atom(P1) andalso cerl:is_c_atom(P2) of
- true ->
- A1 = cerl:concrete(P1),
- A2 = cerl:concrete(P2),
- is_boolean(A1) andalso is_boolean(A2)
- andalso A1 =/= A2;
- false ->
- false
- end;
- false ->
- false
- end;
-is_bool_switch(_) ->
- false.
-
-%% Returns the true-body and the false-body for boolean switch clauses.
-
--spec bool_switch_cases([cerl:c_clause()]) -> {cerl:cerl(), cerl:cerl()}.
-
-bool_switch_cases([C1, C2]) ->
- B1 = cerl:clause_body(C1),
- B2 = cerl:clause_body(C2),
- [P1] = cerl:clause_pats(C1),
- case cerl:concrete(P1) of
- true ->
- {B1, B2};
- false ->
- {B2, B1}
- end.
-
-%%
-%% The type of the check functions like the default check below - XXX: refine
-%%
--type check_fun() :: fun((_, _) -> boolean()).
-
-%% The default function property check always returns `false':
-
-default_check(_Property, _Function) -> false.
-
-
-%% @spec is_safe_expr(Expr::cerl()) -> boolean()
-%%
-%% @doc Returns `true' if `Expr' represents a "safe" Core Erlang
-%% expression, otherwise `false'. An expression is safe if it always
-%% completes normally and does not modify the state (although the return
-%% value may depend on the state).
-%%
-%% Expressions of type `apply', `case', `receive' and `binary' are
-%% always considered unsafe by this function.
-
-%% TODO: update cerl_inline to use these functions instead.
-
--ifndef(NO_UNUSED).
-is_safe_expr(E) ->
- Check = fun default_check/2,
- is_safe_expr(E, Check).
--endif.
-%% @clear
-
--spec is_safe_expr(cerl:cerl(), check_fun()) -> boolean().
-
-is_safe_expr(E, Check) ->
- case cerl:type(E) of
- literal ->
- true;
- var ->
- true;
- 'fun' ->
- true;
- values ->
- is_safe_expr_list(cerl:values_es(E), Check);
- tuple ->
- is_safe_expr_list(cerl:tuple_es(E), Check);
- cons ->
- case is_safe_expr(cerl:cons_hd(E), Check) of
- true ->
- is_safe_expr(cerl:cons_tl(E), Check);
- false ->
- false
- end;
- 'let' ->
- case is_safe_expr(cerl:let_arg(E), Check) of
- true ->
- is_safe_expr(cerl:let_body(E), Check);
- false ->
- false
- end;
- letrec ->
- is_safe_expr(cerl:letrec_body(E), Check);
- seq ->
- case is_safe_expr(cerl:seq_arg(E), Check) of
- true ->
- is_safe_expr(cerl:seq_body(E), Check);
- false ->
- false
- end;
- 'catch' ->
- is_safe_expr(cerl:catch_body(E), Check);
- 'try' ->
- %% If the guarded expression is safe, the try-handler will
- %% never be evaluated, so we need only check the body. If
- %% the guarded expression is pure, but could fail, we also
- %% have to check the handler.
- case is_safe_expr(cerl:try_arg(E), Check) of
- true ->
- is_safe_expr(cerl:try_body(E), Check);
- false ->
- case is_pure_expr(cerl:try_arg(E), Check) of
- true ->
- case is_safe_expr(cerl:try_body(E), Check) of
- true ->
- is_safe_expr(cerl:try_handler(E), Check);
- false ->
- false
- end;
- false ->
- false
- end
- end;
- primop ->
- Name = cerl:atom_val(cerl:primop_name(E)),
- As = cerl:primop_args(E),
- case Check(safe, {Name, length(As)}) of
- true ->
- is_safe_expr_list(As, Check);
- false ->
- false
- end;
- call ->
- Module = cerl:call_module(E),
- Name = cerl:call_name(E),
- case cerl:is_c_atom(Module) and cerl:is_c_atom(Name) of
- true ->
- M = cerl:atom_val(Module),
- F = cerl:atom_val(Name),
- As = cerl:call_args(E),
- case Check(safe, {M, F, length(As)}) of
- true ->
- is_safe_expr_list(As, Check);
- false ->
- false
- end;
- false ->
- false % Call to unknown function
- end;
- _ ->
- false
- end.
-
-is_safe_expr_list([E | Es], Check) ->
- case is_safe_expr(E, Check) of
- true ->
- is_safe_expr_list(Es, Check);
- false ->
- false
- end;
-is_safe_expr_list([], _Check) ->
- true.
-
-
-%% @spec (Expr::cerl()) -> bool()
-%%
-%% @doc Returns `true' if `Expr' represents a "pure" Core Erlang
-%% expression, otherwise `false'. An expression is pure if it does not
-%% affect the state, nor depend on the state, although its evaluation is
-%% not guaranteed to complete normally for all input.
-%%
-%% Expressions of type `apply', `case', `receive' and `binary' are
-%% always considered impure by this function.
-
--ifndef(NO_UNUSED).
-is_pure_expr(E) ->
- Check = fun default_check/2,
- is_pure_expr(E, Check).
--endif.
-%% @clear
-
-is_pure_expr(E, Check) ->
- case cerl:type(E) of
- literal ->
- true;
- var ->
- true;
- 'fun' ->
- true;
- values ->
- is_pure_expr_list(cerl:values_es(E), Check);
- tuple ->
- is_pure_expr_list(cerl:tuple_es(E), Check);
- cons ->
- case is_pure_expr(cerl:cons_hd(E), Check) of
- true ->
- is_pure_expr(cerl:cons_tl(E), Check);
- false ->
- false
- end;
- 'let' ->
- case is_pure_expr(cerl:let_arg(E), Check) of
- true ->
- is_pure_expr(cerl:let_body(E), Check);
- false ->
- false
- end;
- letrec ->
- is_pure_expr(cerl:letrec_body(E), Check);
- seq ->
- case is_pure_expr(cerl:seq_arg(E), Check) of
- true ->
- is_pure_expr(cerl:seq_body(E), Check);
- false ->
- false
- end;
- 'catch' ->
- is_pure_expr(cerl:catch_body(E), Check);
- 'try' ->
- case is_pure_expr(cerl:try_arg(E), Check) of
- true ->
- case is_pure_expr(cerl:try_body(E), Check) of
- true ->
- is_pure_expr(cerl:try_handler(E), Check);
- false ->
- false
- end;
- false ->
- false
- end;
- primop ->
- Name = cerl:atom_val(cerl:primop_name(E)),
- As = cerl:primop_args(E),
- case Check(pure, {Name, length(As)}) of
- true ->
- is_pure_expr_list(As, Check);
- false ->
- false
- end;
- call ->
- Module = cerl:call_module(E),
- Name = cerl:call_name(E),
- case cerl:is_c_atom(Module) and cerl:is_c_atom(Name) of
- true ->
- M = cerl:atom_val(Module),
- F = cerl:atom_val(Name),
- As = cerl:call_args(E),
- case Check(pure, {M, F, length(As)}) of
- true ->
- is_pure_expr_list(As, Check);
- false ->
- false
- end;
- false ->
- false % Call to unknown function
- end;
- _ ->
- false
- end.
-
-is_pure_expr_list([E | Es], Check) ->
- case is_pure_expr(E, Check) of
- true ->
- is_pure_expr_list(Es, Check);
- false ->
- false
- end;
-is_pure_expr_list([], _Check) ->
- true.
-
-
-%% Peephole optimizations
-%%
-%% This is only intended to be a light-weight cleanup optimizer,
-%% removing small things that may e.g. have been generated by other
-%% optimization passes or in the translation from higher-level code.
-%% It is not recursive in general - it only descends until it can do no
-%% more work in the current context.
-%%
-%% To expose hidden cases of final expressions (enabling last call
-%% optimization), we try to remove all trivial let-bindings (`let X = Y
-%% in X', `let X = Y in Y', `let X = Y in let ... in ...', `let X = let
-%% ... in ... in ...', etc.). We do not, however, try to recognize any
-%% other similar cases, even for simple `case'-expressions like `case E
-%% of X -> X end', or simultaneous multiple-value bindings.
-
--spec reduce_expr(cerl:cerl()) -> cerl:cerl().
-
-reduce_expr(E) ->
- Check = fun default_check/2,
- reduce_expr(E, Check).
-
--spec reduce_expr(cerl:cerl(), check_fun()) -> cerl:cerl().
-
-reduce_expr(E, Check) ->
- case cerl:type(E) of
- values ->
- case cerl:values_es(E) of
- [E1] ->
- %% Not really an "optimization" in itself, but
- %% enables other rewritings by removing the wrapper.
- reduce_expr(E1, Check);
- _ ->
- E
- end;
- 'seq' ->
- A = reduce_expr(cerl:seq_arg(E), Check),
- B = reduce_expr(cerl:seq_body(E), Check),
- %% `do <E1> <E2>' is equivalent to `<E2>' if `<E1>' is
- %% "safe" (cannot effect the behaviour in any way).
- case is_safe_expr(A, Check) of
- true ->
- B;
- false ->
- case cerl:is_c_seq(B) of
- true ->
- %% Rewrite `do <E1> do <E2> <E3>' to `do do
- %% <E1> <E2> <E3>' so that the "body" of the
- %% outermost seq-operator is the expression
- %% which produces the final result (i.e.,
- %% E3). This can make other optimizations
- %% easier; see `let'.
- B1 = cerl:seq_arg(B),
- B2 = cerl:seq_body(B),
- cerl:c_seq(cerl:c_seq(A, B1), B2);
- false ->
- cerl:c_seq(A, B)
- end
- end;
- 'let' ->
- A = reduce_expr(cerl:let_arg(E), Check),
- case cerl:is_c_seq(A) of
- true ->
- %% `let X = do <E1> <E2> in Y' is equivalent to `do
- %% <E1> let X = <E2> in Y'. Note that `<E2>' cannot
- %% be a seq-operator, due to the `seq' optimization.
- A1 = cerl:seq_arg(A),
- A2 = cerl:seq_body(A),
- E1 = cerl:update_c_let(E, cerl:let_vars(E),
- A2, cerl:let_body(E)),
- cerl:c_seq(A1, reduce_expr(E1, Check));
- false ->
- B = reduce_expr(cerl:let_body(E), Check),
- Vs = cerl:let_vars(E),
- %% We give up if the body does not reduce to a
- %% single variable. This is not a generic copy
- %% propagation.
- case cerl:type(B) of
- var when length(Vs) =:= 1 ->
- %% We have `let <V1> = <E> in <V2>':
- [V] = Vs,
- N1 = cerl:var_name(V),
- N2 = cerl:var_name(B),
- if N1 =:= N2 ->
- %% `let X = <E> in X' equals `<E>'
- A;
- true ->
- %% `let X = <E> in Y' when X and Y
- %% are different variables is
- %% equivalent to `do <E> Y'.
- reduce_expr(cerl:c_seq(A, B), Check)
- end;
- literal ->
- %% `let X = <E> in T' when T is a literal
- %% term is equivalent to `do <E> T'.
- reduce_expr(cerl:c_seq(A, B), Check);
- _ ->
- cerl:update_c_let(E, Vs, A, B)
- end
- end;
- 'try' ->
- %% Get rid of unnecessary try-expressions.
- A = reduce_expr(cerl:try_arg(E), Check),
- B = reduce_expr(cerl:try_body(E), Check),
- case is_safe_expr(A, Check) of
- true ->
- B;
- false ->
- cerl:update_c_try(E, A, cerl:try_vars(E), B,
- cerl:try_evars(E),
- cerl:try_handler(E))
- end;
- 'catch' ->
- %% Just a simpler form of try-expressions.
- B = reduce_expr(cerl:catch_body(E), Check),
- case is_safe_expr(B, Check) of
- true ->
- B;
- false ->
- cerl:update_c_catch(E, B)
- end;
- _ ->
- E
- end.
diff --git a/lib/dialyzer/src/cerl_pmatch.erl b/lib/dialyzer/src/cerl_pmatch.erl
deleted file mode 100644
index 66fce3c8eb..0000000000
--- a/lib/dialyzer/src/cerl_pmatch.erl
+++ /dev/null
@@ -1,620 +0,0 @@
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% @copyright 2000-2006 Richard Carlsson
-%% @author Richard Carlsson <carlsson.richard@gmail.com>
-%%
-%% @doc Core Erlang pattern matching compiler.
-%%
-%% <p>For reference, see Simon L. Peyton Jones "The Implementation of
-%% Functional Programming Languages", chapter 5 (by Phil Wadler).</p>
-%%
-%% @type cerl() = cerl:cerl().
-%% Abstract Core Erlang syntax trees.
-%% @type cerl_records() = cerl:cerl_records().
-%% An explicit record representation of Core Erlang syntax trees.
-
--module(cerl_pmatch).
-
-%%-define(NO_UNUSED, true).
-
--export([clauses/2]).
--ifndef(NO_UNUSED).
--export([transform/2, core_transform/2, expr/2]).
--endif.
-
--import(lists, [all/2, splitwith/2, foldr/3, keysort/2, foldl/3,
- mapfoldl/3]).
-
--define(binary_id, {binary}).
--define(cons_id, {cons}).
--define(tuple_id, {tuple}).
--define(literal_id(V), V).
-
-
-%% @spec core_transform(Module::cerl_records(), Options::[term()]) ->
-%% cerl_records()
-%%
-%% @doc Transforms a module represented by records. See
-%% <code>transform/2</code> for details.
-%%
-%% <p>Use the compiler option <code>{core_transform, cerl_pmatch}</code>
-%% to insert this function as a compilation pass.</p>
-%%
-%% @see transform/2
-
--ifndef(NO_UNUSED).
--spec core_transform(cerl:c_module(), [_]) -> cerl:c_module().
-
-core_transform(M, Opts) ->
- cerl:to_records(transform(cerl:from_records(M), Opts)).
--endif. % NO_UNUSED
-%% @clear
-
-
-%% @spec transform(Module::cerl(), Options::[term()]) -> cerl()
-%%
-%% @doc Rewrites all <code>case</code>-clauses in <code>Module</code>.
-%% <code>receive</code>-clauses are not affected. Currently, no options
-%% are available.
-%%
-%% @see clauses/2
-%% @see expr/2
-%% @see core_transform/2
-
--ifndef(NO_UNUSED).
--spec transform(cerl:cerl(), [_]) -> cerl:cerl().
-
-transform(M, _Opts) ->
- expr(M, env__empty()).
--endif. % NO_UNUSED
-%% @clear
-
-
-%% @spec clauses(Clauses::[Clause], Env) -> {Expr, Vars}
-%% Clause = cerl()
-%% Expr = cerl()
-%% Vars = [cerl()]
-%% Env = rec_env:environment()
-%%
-%% @doc Rewrites a sequence of clauses to an equivalent expression,
-%% removing as much repeated testing as possible. Returns a pair
-%% <code>{Expr, Vars}</code>, where <code>Expr</code> is the resulting
-%% expression, and <code>Vars</code> is a list of new variables (i.e.,
-%% not already in the given environment) to be bound to the arguments to
-%% the switch. The following is a typical example (assuming
-%% <code>E</code> is a Core Erlang case expression):
-%% <pre>
-%% handle_case(E, Env) ->
-%% Cs = case_clauses(E),
-%% {E1, Vs} = cerl_pmatch(Cs, Env),
-%% c_let(Vs, case_arg(E), E1).
-%% </pre>
-%%
-%% <p>The environment is used for generating new variables which do not
-%% shadow existing bindings.</p>
-%%
-%% @see rec_env
-%% @see expr/2
-%% @see transform/2
-
--spec clauses([cerl:cerl(),...], rec_env:environment()) ->
- {cerl:cerl(), [cerl:cerl()]}.
-
-clauses(Cs, Env) ->
- clauses(Cs, none, Env).
-
-clauses([C | _] = Cs, Else, Env) ->
- Vs = new_vars(cerl:clause_arity(C), Env),
- E = match(Vs, Cs, Else, add_vars(Vs, Env)),
- {E, Vs}.
-
-%% The implementation very closely follows that described in the book.
-
-match([], Cs, Else, _Env) ->
- %% If the "default action" is the atom 'none', it is simply not
- %% added; otherwise it is put in the body of a final catch-all
- %% clause (which is often removed by the below optimization).
- Cs1 = if Else =:= none -> Cs;
- true -> Cs ++ [cerl:c_clause([], Else)]
- end,
- %% This clause reduction is an important optimization. It selects a
- %% clause body if possible, and otherwise just removes dead clauses.
- case cerl_clauses:reduce(Cs1) of
- {true, {C, []}} -> % if we get bindings, something is wrong!
- cerl:clause_body(C);
- {false, Cs2} ->
- %% This happens when guards are nontrivial.
- cerl:c_case(cerl:c_values([]), Cs2)
- end;
-match([V | _] = Vs, Cs, Else, Env) ->
- foldr(fun (CsF, ElseF) ->
- match_var_con(Vs, CsF, ElseF, Env)
- end,
- Else,
- group([unalias(C, V) || C <- Cs], fun is_var_clause/1)).
-
-group([], _F) ->
- [];
-group([X | _] = Xs, F) ->
- group(Xs, F, F(X)).
-
-group(Xs, F, P) ->
- {First, Rest} = splitwith(fun (X) -> F(X) =:= P end, Xs),
- [First | group(Rest, F)].
-
-is_var_clause(C) ->
- cerl:is_c_var(hd(cerl:clause_pats(C))).
-
-%% To avoid code duplication, if the 'Else' expression is too big, we
-%% put it in a local function definition instead, and replace it with a
-%% call. (Note that it is important that 'is_lightweight' does not yield
-%% 'true' for a simple function application, or we will create a lot of
-%% unnecessary extra functions.)
-
-match_var_con(Vs, Cs, none = Else, Env) ->
- match_var_con_1(Vs, Cs, Else, Env);
-match_var_con(Vs, Cs, Else, Env) ->
- case is_lightweight(Else) of
- true ->
- match_var_con_1(Vs, Cs, Else, Env);
- false ->
- F = new_fvar("match_", 0, Env),
- Else1 = cerl:c_apply(F, []),
- Env1 = add_vars([F], Env),
- cerl:c_letrec([{F, cerl:c_fun([], Else)}],
- match_var_con_1(Vs, Cs, Else1, Env1))
- end.
-
-match_var_con_1(Vs, Cs, Else, Env) ->
- case is_var_clause(hd(Cs)) of
- true ->
- match_var(Vs, Cs, Else, Env);
- false ->
- match_con(Vs, Cs, Else, Env)
- end.
-
-match_var([V | Vs], Cs, Else, Env) ->
- Cs1 = [begin
- [P | Ps] = cerl:clause_pats(C),
- G = make_let([P], V, cerl:clause_guard(C)),
- B = make_let([P], V, cerl:clause_body(C)),
- cerl:update_c_clause(C, Ps, G, B)
- end
- || C <- Cs],
- match(Vs, Cs1, Else, Env).
-
-%% Since Erlang is dynamically typed, we must include the possibility
-%% that none of the constructors in the group will match, and in that
-%% case the "Else" code will be executed (unless it is 'none'), in the
-%% body of a final catch-all clause.
-
-match_con([V | Vs], Cs, Else, Env) ->
- case group_con(Cs) of
- [{_, _, Gs}] ->
- %% Don't create a group type switch if there is only one
- %% such group
- make_switch(V, [match_congroup(DG, Vs, CsG, Else, Env)
- || {DG, _, CsG} <- Gs],
- Else, Env);
- Ts ->
- Cs1 = [match_typegroup(T, V, Vs, Gs, Else, Env)
- || {T, _, Gs} <- Ts],
- make_switch(V, Cs1, Else, Env)
- end.
-
-
-match_typegroup(_T, _V, Vs, [{D, _, Cs}], Else, Env) when element(1, D) /= ?binary_id ->
- %% Don't create a group type switch if there is only one constructor
- %% in the group. (Note that this always happens for '[]'.)
- %% Special case for binaries which always get a group switch
- match_congroup(D, Vs, Cs, Else, Env);
-match_typegroup(T, V, Vs, Gs, Else, Env) ->
- Body = make_switch(V, [match_congroup(D, Vs, Cs, Else, Env)
- || {D, _, Cs} <- Gs],
- Else, Env),
- typetest_clause(T, V, Body, Env).
-
-match_congroup({?binary_id, Segs}, Vs, Cs, Else, Env) ->
- Body = match(Vs, Cs, Else, Env),
- cerl:c_clause([make_pat(?binary_id, Segs)], Body);
-
-match_congroup({D, A}, Vs, Cs, Else, Env) ->
- Vs1 = new_vars(A, Env),
- Body = match(Vs1 ++ Vs, Cs, Else, add_vars(Vs1, Env)),
- cerl:c_clause([make_pat(D, Vs1)], Body).
-
-make_switch(V, Cs, Else, Env) ->
- cerl:c_case(V, if Else =:= none -> Cs;
- true -> Cs ++ [cerl:c_clause([new_var(Env)],
- Else)]
- end).
-
-%% We preserve the relative order of different-type constructors as they
-%% were originally listed. This is done by tracking the clause numbers.
-
-group_con(Cs) ->
- {Cs1, _} = mapfoldl(fun (C, N) ->
- [P | Ps] = cerl:clause_pats(C),
- Ps1 = sub_pats(P) ++ Ps,
- G = cerl:clause_guard(C),
- B = cerl:clause_body(C),
- C1 = cerl:update_c_clause(C, Ps1, G, B),
- D = con_desc(P),
- {{D, N, C1}, N + 1}
- end,
- 0, Cs),
- %% Sort and group constructors.
- Css = group(keysort(1, Cs1), fun ({D,_,_}) -> D end),
- %% Sort each group "back" by line number, and move the descriptor
- %% and line number to the wrapper for the group.
- Gs = [finalize_congroup(C) || C <- Css],
- %% Group by type only (put e.g. different-arity tuples together).
- Gss = group(Gs, fun ({D,_,_}) -> con_desc_type(D) end),
- %% Sort and wrap the type groups.
- Ts = [finalize_typegroup(G) || G <- Gss],
- %% Sort type-groups by first clause order
- keysort(2, Ts).
-
-finalize_congroup(Cs) ->
- [{D,N,_}|_] = Cs1 = keysort(2, Cs),
- {D, N, [C || {_,_,C} <- Cs1]}.
-
-finalize_typegroup(Gs) ->
- [{D,N,_}|_] = Gs1 = keysort(2, Gs),
- {con_desc_type(D), N, Gs1}.
-
-%% Since Erlang clause patterns can contain "alias patterns", we must
-%% eliminate these, by turning them into let-definitions in the guards
-%% and bodies of the clauses.
-
-unalias(C, V) ->
- [P | Ps] = cerl:clause_pats(C),
- B = cerl:clause_body(C),
- G = cerl:clause_guard(C),
- unalias(P, V, Ps, B, G, C).
-
-unalias(P, V, Ps, B, G, C) ->
- case cerl:type(P) of
- alias ->
- V1 = cerl:alias_var(P),
- B1 = make_let([V1], V, B),
- G1 = make_let([V1], V, G),
- unalias(cerl:alias_pat(P), V, Ps, B1, G1, C);
- _ ->
- cerl:update_c_clause(C, [P | Ps], G, B)
- end.
-
-%% Generating a type-switch clause
-
-typetest_clause([], _V, E, _Env) ->
- cerl:c_clause([cerl:c_nil()], E);
-typetest_clause(atom, V, E, _Env) ->
- typetest_clause_1(is_atom, V, E);
-typetest_clause(integer, V, E, _Env) ->
- typetest_clause_1(is_integer, V, E);
-typetest_clause(float, V, E, _Env) ->
- typetest_clause_1(is_float, V, E);
-typetest_clause(cons, _V, E, Env) ->
- [V1, V2] = new_vars(2, Env),
- cerl:c_clause([cerl:c_cons(V1, V2)], E); % there is no 'is cons'
-typetest_clause(tuple, V, E, _Env) ->
- typetest_clause_1(is_tuple, V, E);
-typetest_clause(binary, V, E, _Env) ->
- typetest_clause_1(is_binary, V, E).
-
-typetest_clause_1(T, V, E) ->
- cerl:c_clause([V], cerl:c_call(cerl:c_atom('erlang'),
- cerl:c_atom(T), [V]), E).
-
-%% This returns a constructor descriptor, to be used for grouping and
-%% pattern generation. It consists of an identifier term and the arity.
-
-con_desc(E) ->
- case cerl:type(E) of
- cons -> {?cons_id, 2};
- tuple -> {?tuple_id, cerl:tuple_arity(E)};
- binary -> {?binary_id, cerl:binary_segments(E)};
- literal ->
- case cerl:concrete(E) of
- [_|_] -> {?cons_id, 2};
- T when is_tuple(T) -> {?tuple_id, tuple_size(T)};
- V -> {?literal_id(V), 0}
- end;
- _ ->
- throw({bad_constructor, E})
- end.
-
-%% This returns the type class for a constructor descriptor, for
-%% grouping of clauses. It does not distinguish between tuples of
-%% different arity, nor between different values of atoms, integers and
-%% floats.
-
-con_desc_type({?literal_id([]), _}) -> [];
-con_desc_type({?literal_id(V), _}) when is_atom(V) -> atom;
-con_desc_type({?literal_id(V), _}) when is_integer(V) -> integer;
-con_desc_type({?literal_id(V), _}) when is_float(V) -> float;
-con_desc_type({?cons_id, 2}) -> cons;
-con_desc_type({?tuple_id, _}) -> tuple;
-con_desc_type({?binary_id, _}) -> binary.
-
-%% This creates a new constructor pattern from a type descriptor and a
-%% list of variables.
-
-make_pat(?cons_id, [V1, V2]) -> cerl:c_cons(V1, V2);
-make_pat(?tuple_id, Vs) -> cerl:c_tuple(Vs);
-make_pat(?binary_id, Segs) -> cerl:c_binary(Segs);
-make_pat(?literal_id(Val), []) -> cerl:abstract(Val).
-
-%% This returns the list of subpatterns of a constructor pattern.
-
-sub_pats(E) ->
- case cerl:type(E) of
- cons ->
- [cerl:cons_hd(E), cerl:cons_tl(E)];
- tuple ->
- cerl:tuple_es(E);
- binary ->
- [];
- literal ->
- case cerl:concrete(E) of
- [H|T] -> [cerl:abstract(H), cerl:abstract(T)];
- T when is_tuple(T) -> [cerl:abstract(X)
- || X <- tuple_to_list(T)];
- _ -> []
- end;
- _ ->
- throw({bad_constructor_pattern, E})
- end.
-
-%% This avoids generating stupid things like "let X = ... in 'true'",
-%% and "let X = Y in X", keeping the generated code cleaner. It also
-%% prevents expressions from being considered "non-lightweight" when
-%% code duplication is disallowed (see is_lightweight for details).
-
-make_let(Vs, A, B) ->
- cerl_lib:reduce_expr(cerl:c_let(Vs, A, B)).
-
-%% ---------------------------------------------------------------------
-%% Rewriting a module or other expression:
-
-%% @spec expr(Expression::cerl(), Env) -> cerl()
-%% Env = rec_env:environment()
-%%
-%% @doc Rewrites all <code>case</code>-clauses in
-%% <code>Expression</code>. <code>receive</code>-clauses are not
-%% affected.
-%%
-%% <p>The environment is used for generating new variables which do not
-%% shadow existing bindings.</p>
-%%
-%% @see clauses/2
-%% @see rec_env
-
--ifndef(NO_UNUSED).
--spec expr(cerl:cerl(), rec_env:environment()) -> cerl:cerl().
-
-expr(E, Env) ->
- case cerl:type(E) of
- binary ->
- Es = expr_list(cerl:binary_segments(E), Env),
- cerl:update_c_binary(E, Es);
- bitstr ->
- V = expr(cerl:bitstr_val(E), Env),
- Sz = expr(cerl:bitstr_size(E), Env),
- Unit = expr(cerl:bitstr_unit(E), Env),
- Type = expr(cerl:bitstr_type(E), Env),
- cerl:update_c_bitstr(E, V, Sz, Unit, Type, cerl:bitstr_flags(E));
- literal ->
- E;
- var ->
- E;
- values ->
- Es = expr_list(cerl:values_es(E), Env),
- cerl:update_c_values(E, Es);
- cons ->
- H = expr(cerl:cons_hd(E), Env),
- T = expr(cerl:cons_tl(E), Env),
- cerl:update_c_cons(E, H, T);
- tuple ->
- Es = expr_list(cerl:tuple_es(E), Env),
- cerl:update_c_tuple(E, Es);
- 'let' ->
- A = expr(cerl:let_arg(E), Env),
- Vs = cerl:let_vars(E),
- Env1 = add_vars(Vs, Env),
- B = expr(cerl:let_body(E), Env1),
- cerl:update_c_let(E, Vs, A, B);
- seq ->
- A = expr(cerl:seq_arg(E), Env),
- B = expr(cerl:seq_body(E), Env),
- cerl:update_c_seq(E, A, B);
- apply ->
- Op = expr(cerl:apply_op(E), Env),
- As = expr_list(cerl:apply_args(E), Env),
- cerl:update_c_apply(E, Op, As);
- call ->
- M = expr(cerl:call_module(E), Env),
- N = expr(cerl:call_name(E), Env),
- As = expr_list(cerl:call_args(E), Env),
- cerl:update_c_call(E, M, N, As);
- primop ->
- As = expr_list(cerl:primop_args(E), Env),
- cerl:update_c_primop(E, cerl:primop_name(E), As);
- 'case' ->
- A = expr(cerl:case_arg(E), Env),
- Cs = expr_list(cerl:case_clauses(E), Env),
- {E1, Vs} = clauses(Cs, Env),
- make_let(Vs, A, E1);
- clause ->
- Vs = cerl:clause_vars(E),
- Env1 = add_vars(Vs, Env),
- G = expr(cerl:clause_guard(E), Env1),
- B = expr(cerl:clause_body(E), Env1),
- cerl:update_c_clause(E, cerl:clause_pats(E), G, B);
- 'fun' ->
- Vs = cerl:fun_vars(E),
- Env1 = add_vars(Vs, Env),
- B = expr(cerl:fun_body(E), Env1),
- cerl:update_c_fun(E, Vs, B);
- 'receive' ->
- %% NOTE: No pattern matching compilation is done here! The
- %% receive-clauses and patterns cannot be staged as long as
- %% we are working with "normal" Core Erlang.
- Cs = expr_list(cerl:receive_clauses(E), Env),
- T = expr(cerl:receive_timeout(E), Env),
- A = expr(cerl:receive_action(E), Env),
- cerl:update_c_receive(E, Cs, T, A);
- 'try' ->
- A = expr(cerl:try_arg(E), Env),
- Vs = cerl:try_vars(E),
- B = expr(cerl:try_body(E), add_vars(Vs, Env)),
- Evs = cerl:try_evars(E),
- H = expr(cerl:try_handler(E), add_vars(Evs, Env)),
- cerl:update_c_try(E, A, Vs, B, Evs, H);
- 'catch' ->
- B = expr(cerl:catch_body(E), Env),
- cerl:update_c_catch(E, B);
- letrec ->
- Ds = cerl:letrec_defs(E),
- Env1 = add_defs(Ds, Env),
- Ds1 = defs(Ds, Env1),
- B = expr(cerl:letrec_body(E), Env1),
- cerl:update_c_letrec(E, Ds1, B);
- module ->
- Ds = cerl:module_defs(E),
- Env1 = add_defs(Ds, Env),
- Ds1 = defs(Ds, Env1),
- cerl:update_c_module(E, cerl:module_name(E),
- cerl:module_exports(E),
- cerl:module_attrs(E), Ds1)
- end.
-
-expr_list(Es, Env) ->
- [expr(E, Env) || E <- Es].
-
-defs(Ds, Env) ->
- [{V, expr(F, Env)} || {V, F} <- Ds].
--endif. % NO_UNUSED
-%% @clear
-
-%% ---------------------------------------------------------------------
-%% Support functions
-
-new_var(Env) ->
- Name = env__new_vname(Env),
- cerl:c_var(Name).
-
-new_vars(N, Env) ->
- [cerl:c_var(V) || V <- env__new_vnames(N, Env)].
-
-new_fvar(A, N, Env) ->
- Name = env__new_fname(A, N, Env),
- cerl:c_var(Name).
-
-add_vars(Vs, Env) ->
- foldl(fun (V, E) -> env__bind(cerl:var_name(V), [], E) end, Env, Vs).
-
--ifndef(NO_UNUSED).
-add_defs(Ds, Env) ->
- foldl(fun ({V, _F}, E) ->
- env__bind(cerl:var_name(V), [], E)
- end, Env, Ds).
--endif. % NO_UNUSED
-
-%% This decides whether an expression is worth lifting out to a separate
-%% function instead of duplicating the code. In other words, whether its
-%% cost is about the same or smaller than that of a local function call.
-%% Note that variables must always be "lightweight"; otherwise, they may
-%% get lifted out of the case switch that introduces them.
-
-is_lightweight(E) ->
- case get('cerl_pmatch_duplicate_code') of
- never -> cerl:type(E) =:= var; % Avoids all code duplication
- always -> true; % Does not lift code to new functions
- _ -> is_lightweight_1(E)
- end.
-
-is_lightweight_1(E) ->
- case cerl:type(E) of
- var -> true;
- literal -> true;
- 'fun' -> true;
- values -> all(fun is_simple/1, cerl:values_es(E));
- cons -> is_simple(cerl:cons_hd(E))
- andalso is_simple(cerl:cons_tl(E));
- tuple -> all(fun is_simple/1, cerl:tuple_es(E));
- 'let' -> (is_simple(cerl:let_arg(E)) andalso
- is_lightweight_1(cerl:let_body(E)));
- seq -> (is_simple(cerl:seq_arg(E)) andalso
- is_lightweight_1(cerl:seq_body(E)));
- primop ->
- all(fun is_simple/1, cerl:primop_args(E));
- apply ->
- is_simple(cerl:apply_op(E))
- andalso all(fun is_simple/1, cerl:apply_args(E));
- call ->
- is_simple(cerl:call_module(E))
- andalso is_simple(cerl:call_name(E))
- andalso all(fun is_simple/1, cerl:call_args(E));
- _ ->
- %% The default is to lift the code to a new function.
- false
- end.
-
-%% "Simple" things have no (or negligible) runtime cost and are free
-%% from side effects.
-
-is_simple(E) ->
- case cerl:type(E) of
- var -> true;
- literal -> true;
- values -> all(fun is_simple/1, cerl:values_es(E));
- _ -> false
- end.
-
-
-%% ---------------------------------------------------------------------
-%% Abstract datatype: environment()
-
-env__bind(Key, Val, Env) ->
- rec_env:bind(Key, Val, Env).
-
--ifndef(NO_UNUSED).
-%% env__bind_recursive(Ks, Vs, F, Env) ->
-%% rec_env:bind_recursive(Ks, Vs, F, Env).
-
-%% env__lookup(Key, Env) ->
-%% rec_env:lookup(Key, Env).
-
-%% env__get(Key, Env) ->
-%% rec_env:get(Key, Env).
-
-%% env__is_defined(Key, Env) ->
-%% rec_env:is_defined(Key, Env).
-
-env__empty() ->
- rec_env:empty().
--endif. % NO_UNUSED
-
-env__new_vname(Env) ->
- rec_env:new_key(Env).
-
-env__new_vnames(N, Env) ->
- rec_env:new_keys(N, Env).
-
-env__new_fname(F, A, Env) ->
- rec_env:new_key(fun (X) ->
- S = integer_to_list(X),
- {list_to_atom(F ++ S), A}
- end,
- Env).
diff --git a/lib/dialyzer/src/cerl_typean.erl b/lib/dialyzer/src/cerl_typean.erl
deleted file mode 100644
index 3deb4af3e1..0000000000
--- a/lib/dialyzer/src/cerl_typean.erl
+++ /dev/null
@@ -1,994 +0,0 @@
-%% -*- erlang-indent-level: 4 -*-
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% @copyright 2001-2002 Richard Carlsson
-%% @author Richard Carlsson <carlsson.richard@gmail.com>
-%% @doc Type analysis of Core Erlang programs.
-
-%% TODO: filters must handle conjunctions for better precision!
-%% TODO: should get filters from patterns as well as guards.
-%% TODO: unused functions are being included in the analysis.
-
--module(cerl_typean).
-
--export([core_transform/2, analyze/1, pp_hook/0]).
-%%-export([analyze/2, analyze/5, annotate/1, annotate/2, annotate/5]).
-
--import(erl_types, [t_any/0, t_atom/0, t_atom_vals/1, t_binary/0,
- t_cons/2, t_cons_hd/1, t_cons_tl/1, t_float/0,
- t_fun/0, t_fun/2, t_from_range/2, t_from_term/1,
- t_inf/2, t_integer/0,
- t_is_any/1, t_is_atom/1, t_is_cons/1, t_is_list/1,
- t_is_maybe_improper_list/1, t_is_none/1, t_is_tuple/1,
- t_limit/2, t_list_elements/1, t_maybe_improper_list/0,
- t_none/0, t_number/0, t_pid/0, t_port/0, t_product/1,
- t_reference/0, t_sup/2, t_to_tlist/1, t_tuple/0, t_tuple/1,
- t_tuple_args/1, t_tuple_size/1, t_tuple_subtypes/1]).
-
--import(cerl, [ann_c_fun/3, ann_c_var/2, alias_pat/1, alias_var/1,
- apply_args/1, apply_op/1, atom_val/1, bitstr_size/1,
- bitstr_val/1, bitstr_type/1, bitstr_flags/1, binary_segments/1,
- c_letrec/2, c_nil/0,
- c_values/1, call_args/1, call_module/1, call_name/1,
- case_arg/1, case_clauses/1, catch_body/1, clause_body/1,
- clause_guard/1, clause_pats/1, concrete/1, cons_hd/1,
- cons_tl/1, fun_body/1, fun_vars/1, get_ann/1, int_val/1,
- is_c_atom/1, is_c_int/1, let_arg/1, let_body/1, let_vars/1,
- letrec_body/1, letrec_defs/1, module_defs/1,
- module_defs/1, module_exports/1, pat_vars/1,
- primop_args/1, primop_name/1, receive_action/1,
- receive_clauses/1, receive_timeout/1, seq_arg/1,
- seq_body/1, set_ann/2, try_arg/1, try_body/1,
- try_evars/1, try_handler/1, try_vars/1, tuple_arity/1,
- tuple_es/1, type/1, values_es/1, var_name/1]).
-
--import(cerl_trees, [get_label/1]).
-
--ifdef(DEBUG).
--define(ANNOTATE(X), case erl_types:t_to_string(X) of Q when length(Q) < 255 -> list_to_atom(Q); Q -> Q end).
--else.
--define(ANNOTATE(X), X).
--endif.
-
-%% Limit for type representation depth.
--define(DEF_LIMIT, 3).
-
-
-%% @spec core_transform(Module::cerl_records(), Options::[term()]) ->
-%% cerl_records()
-%%
-%% @doc Annotates a module represented by records with type
-%% information. See <code>annotate/1</code> for details.
-%%
-%% <p>Use the compiler option <code>{core_transform, cerl_typean}</code>
-%% to insert this function as a compilation pass.</p>
-%%
-%% @see module/2
-
--spec core_transform(cerl:cerl(), [term()]) -> cerl:cerl().
-
-core_transform(Code, _Opts) ->
- {Code1, _} = cerl_trees:label(cerl:from_records(Code)),
- %% io:fwrite("Running type analysis..."),
- %% {T1,_} = statistics(runtime),
- {Code2, _, _} = annotate(Code1),
- %% {T2,_} = statistics(runtime),
- %% io:fwrite("(~w ms).\n", [T2 - T1]),
- cerl:to_records(Code2).
-
-
-%% =====================================================================
-%% annotate(Tree) -> {Tree1, Type, Vars}
-%%
-%% Tree = cerl:cerl()
-%%
-%% Analyzes `Tree' (see `analyze') and appends terms `{type, Type}'
-%% to the annotation list of each fun-expression node and
-%% apply-expression node of `Tree', respectively, where `Labels' is
-%% an ordered-set list of labels of fun-expressions in `Tree',
-%% possibly also containing the atom `external', corresponding to
-%% the dependency information derived by the analysis. Any previous
-%% such annotations are removed from `Tree'. `Tree1' is the
-%% modified tree; for details on `OutList', `Outputs' ,
-%% `Dependencies' and `Escapes', see `analyze'.
-%%
-%% Note: `Tree' must be annotated with labels in order to use this
-%% function; see `analyze' for details.
-
-annotate(Tree) ->
- annotate(Tree, ?DEF_LIMIT).
-
-annotate(Tree, Limit) ->
- {_, _, Esc, Dep, Par} = cerl_closurean:analyze(Tree),
- annotate(Tree, Limit, Esc, Dep, Par).
-
-annotate(Tree, Limit, Esc, Dep, Par) ->
- {Type, Out, Vars} = analyze(Tree, Limit, Esc, Dep, Par),
- DelAnn = fun (T) -> set_ann(T, delete_ann(type, get_ann(T))) end,
- SetType = fun (T, Dict) ->
- case dict:find(get_label(T), Dict) of
- {ok, X} ->
- case t_is_any(X) of
- true ->
- DelAnn(T);
- false ->
- set_ann(T, append_ann(type,
- ?ANNOTATE(X),
- get_ann(T)))
- end;
- error ->
- DelAnn(T)
- end
- end,
- F = fun (T) ->
- case type(T) of
- var ->
- SetType(T, Vars);
- apply ->
- SetType(T, Out);
- call ->
- SetType(T, Out);
- primop ->
- SetType(T, Out);
- 'fun' ->
- SetType(T, Out);
- _ ->
- DelAnn(T)
- end
- end,
- {cerl_trees:map(F, Tree), Type, Vars}.
-
-append_ann(Tag, Val, [X | Xs]) ->
- if tuple_size(X) >= 1, element(1, X) =:= Tag ->
- append_ann(Tag, Val, Xs);
- true ->
- [X | append_ann(Tag, Val, Xs)]
- end;
-append_ann(Tag, Val, []) ->
- [{Tag, Val}].
-
-delete_ann(Tag, [X | Xs]) ->
- if tuple_size(X) >= 1, element(1, X) =:= Tag ->
- delete_ann(Tag, Xs);
- true ->
- [X | delete_ann(Tag, Xs)]
- end;
-delete_ann(_, []) ->
- [].
-
-
-%% =====================================================================
-%% analyze(Tree) -> {OutList, Outputs, Dependencies}
-%%
-%% Tree = cerl:cerl()
-%% OutList = [LabelSet] | none
-%% Outputs = dict(integer(), OutList)
-%% Dependencies = dict(integer(), LabelSet)
-%% LabelSet = ordset(Label)
-%% Label = integer() | external
-%%
-%% Analyzes a module or an expression represented by `Tree'.
-%%
-%% The returned `OutList' is a list of sets of labels of
-%% fun-expressions which correspond to the possible closures in the
-%% value list produced by `Tree' (viewed as an expression; the
-%% "value" of a module contains its exported functions). The atom
-%% `none' denotes missing or conflicting information.
-%%
-%% The atom `external' in any label set denotes any possible
-%% function outside `Tree', including those in `Escapes'.
-%%
-%% `Outputs' is a mapping from the labels of fun-expressions in
-%% `Tree' to corresponding lists of sets of labels of
-%% fun-expressions (or the atom `none'), representing the possible
-%% closures in the value lists returned by the respective
-%% functions.
-%%
-%% `Dependencies' is a similar mapping from the labels of
-%% fun-expressions and apply-expressions in `Tree' to sets of
-%% labels of corresponding fun-expressions which may contain call
-%% sites of the functions or be called from the call sites,
-%% respectively. Any such label not defined in `Dependencies'
-%% represents an unreachable function or a dead or faulty
-%% application.
-%%
-%% `Escapes' is the set of labels of fun-expressions in `Tree' such
-%% that corresponding closures may be accessed from outside `Tree'.
-%%
-%% Note: `Tree' must be annotated with labels (as done by the
-%% function `cerl_trees:label/1') in order to use this function.
-%% The label annotation `{label, L}' (where L should be an integer)
-%% must be the first element of the annotation list of each node in
-%% the tree. Instances of variables bound in `Tree' which denote
-%% the same variable must have the same label; apart from this,
-%% labels should be unique. Constant literals do not need to be
-%% labeled.
-
--record(state, {k, vars, out, dep, work, funs, envs}).
-
-%% Note: In order to keep our domain simple, we assume that all remote
-%% calls and primops return a single value, if any.
-
-%% We wrap the given syntax tree T in a fun-expression labeled `top',
-%% which is initially in the set of escaped labels. `top' will be
-%% visited at least once.
-%%
-%% We create a separate function labeled `external', defined as:
-%% "External = fun () -> Any", which will represent any and all
-%% functions outside T, and whose return value has unknown type.
-
--type label() :: integer() | 'external' | 'top'.
--type ordset(X) :: [X]. % XXX: TAKE ME OUT
--type labelset() :: ordset(label()).
--type outlist() :: [labelset()] | 'none'.
-
--spec analyze(cerl:cerl()) -> {outlist(), dict:dict(), dict:dict()}.
-
-analyze(Tree) ->
- analyze(Tree, ?DEF_LIMIT).
-
-analyze(Tree, Limit) ->
- {_, _, Esc, Dep, Par} = cerl_closurean:analyze(Tree),
- analyze(Tree, Limit, Esc, Dep, Par).
-
-analyze(Tree, Limit, Esc0, Dep0, Par) ->
- %% Note that we use different name spaces for variable labels and
- %% function/call site labels. We assume that the labeling of Tree
- %% only uses integers, not atoms.
- LabelExtL = [{label, external}],
- External = ann_c_var(LabelExtL, {external, 1}),
- ExtFun = ann_c_fun(LabelExtL, [], ann_c_var([{label, any}], 'Any')),
-%%% io:fwrite("external fun:\n~s.\n",
-%%% [cerl_prettypr:format(ExtFun, [noann, {paper, 80}])]),
- LabelTopL = [{label, top}],
- Top = ann_c_var(LabelTopL, {top, 0}),
- TopFun = ann_c_fun(LabelTopL, [], Tree),
-
- %% The "start fun" just makes the initialisation easier. It is not
- %% itself in the call graph.
- StartFun = ann_c_fun([{label, start}], [],
- c_letrec([{External, ExtFun}, {Top, TopFun}],
- c_nil())),
-%%% io:fwrite("start fun:\n~s.\n",
-%%% [cerl_prettypr:format(StartFun, [{paper, 80}])]),
-
- %% Gather a database of all fun-expressions in Tree and initialise
- %% their outputs and parameter variables. All escaping functions can
- %% receive any values as inputs. Also add an extra dependency edge
- %% from each fun-expression label to its parent fun-expression.
-%%% io:fwrite("Escape: ~p.\n",[Esc0]),
- Esc = sets:from_list(Esc0),
- Any = t_any(),
- None = t_none(),
- Funs0 = dict:new(),
- Vars0 = dict:store(any, Any, dict:new()),
- Out0 = dict:store(top, None,
- dict:store(external, None, dict:new())),
- Envs0 = dict:store(top, dict:new(),
- dict:store(external, dict:new(), dict:new())),
- F = fun (T, S = {Fs, Vs, Os, Es}) ->
- case type(T) of
- 'fun' ->
- L = get_label(T),
- As = fun_vars(T),
- X = case sets:is_element(L, Esc) of
- true -> Any;
- false -> None
- end,
- {dict:store(L, T, Fs),
- bind_vars_single(As, X, Vs),
- dict:store(L, None, Os),
- dict:store(L, dict:new(), Es)};
- _ ->
- S
- end
- end,
- {Funs, Vars, Out, Envs} = cerl_trees:fold(F, {Funs0, Vars0, Out0,
- Envs0}, StartFun),
-
- %% Add dependencies from funs to their parent funs.
- Dep = lists:foldl(fun ({L, L1}, D) -> add_dep(L, L1, D) end,
- Dep0, dict:to_list(Par)),
-
- %% Enter the fixpoint iteration at the StartFun.
- St = loop(TopFun, top, #state{vars = Vars,
- out = Out,
- dep = Dep,
- work = init_work(),
- funs = Funs,
- envs = Envs,
- k = Limit}),
- {dict:fetch(top, St#state.out),
- tidy_dict([top, external], St#state.out),
- tidy_dict([any], St#state.vars)}.
-
-tidy_dict([X | Xs], D) ->
- tidy_dict(Xs, dict:erase(X, D));
-tidy_dict([], D) ->
- D.
-
-loop(T, L, St0) ->
-%%% io:fwrite("analyzing: ~w.\n",[L]),
-%%% io:fwrite("work: ~w.\n", [Queue0]),
- Env = dict:fetch(L, St0#state.envs),
- X0 = dict:fetch(L, St0#state.out),
- {X1, St1} = visit(fun_body(T), Env, St0),
- X = limit(X1, St1#state.k),
- {W, M} = case equal(X0, X) of
- true ->
- {St1#state.work, St1#state.out};
- false ->
-%%% io:fwrite("out (~w) changed: ~s <- ~s.\n",
-%%% [L, erl_types:t_to_string(X),
-%%% erl_types:t_to_string(X0)]),
- M1 = dict:store(L, X, St1#state.out),
- case dict:find(L, St1#state.dep) of
- {ok, S} ->
-%%% io:fwrite("adding work: ~w.\n", [S]),
- {add_work(S, St1#state.work), M1};
- error ->
- {St1#state.work, M1}
- end
- end,
- St2 = St1#state{out = M},
- case take_work(W) of
- {ok, L1, W1} ->
- T1 = dict:fetch(L1, St2#state.funs),
- loop(T1, L1, St2#state{work = W1});
- none ->
- St2
- end.
-
-visit(T, Env, St) ->
- case type(T) of
- literal ->
- {t_from_term(concrete(T)), St};
- var ->
- %% If a variable is not already in the store at this point,
- %% we initialize it to 'none()'.
- L = get_label(T),
- Vars = St#state.vars,
- case dict:find(L, Vars) of
- {ok, X} ->
- case dict:find(var_name(T), Env) of
- {ok, X1} ->
-%%% io:fwrite("filtered variable reference: ~w:~s.\n",
-%%% [var_name(T), erl_types:t_to_string(X1)]),
- {meet(X, X1), St};
- error ->
- {X, St}
- end;
- error ->
- X = t_none(),
- Vars1 = dict:store(L, X, Vars),
- St1 = St#state{vars = Vars1},
- {X, St1}
- end;
- 'fun' ->
- %% Must revisit the fun also, because its environment might
- %% have changed. (We don't keep track of such dependencies.)
- L = get_label(T),
- Xs = [dict:fetch(get_label(V), St#state.vars)
- || V <- fun_vars(T)],
- X = dict:fetch(L, St#state.out),
- St1 = St#state{work = add_work([L], St#state.work),
- envs = dict:store(L, Env, St#state.envs)},
- {t_fun(Xs, X), St1};
- values ->
- {Xs, St1} = visit_list(values_es(T), Env, St),
- {t_product(Xs), St1};
- cons ->
- {[X1, X2], St1} = visit_list([cons_hd(T), cons_tl(T)], Env, St),
- {t_cons(X1, X2), St1};
- tuple ->
- {Xs, St1} = visit_list(tuple_es(T), Env, St),
- {t_tuple(Xs), St1};
- 'let' ->
- {X, St1} = visit(let_arg(T), Env, St),
- LetVars = let_vars(T),
- St1Vars = St1#state.vars,
- Vars = case t_is_any(X) orelse t_is_none(X) of
- true ->
- bind_vars_single(LetVars, X, St1Vars);
- false ->
- bind_vars(LetVars, t_to_tlist(X), St1Vars)
- end,
- visit(let_body(T), Env, St1#state{vars = Vars});
- seq ->
- {_, St1} = visit(seq_arg(T), Env, St),
- visit(seq_body(T), Env, St1);
- apply ->
- {_F, St1} = visit(apply_op(T), Env, St),
- {As, St2} = visit_list(apply_args(T), Env, St1),
- L = get_label(T),
- Ls = get_deps(L, St#state.dep),
- Out = St2#state.out,
- X = join_list([dict:fetch(L1, Out) || L1 <- Ls]),
- Out1 = dict:store(L, X, Out),
- {X, call_site(Ls, As, St2#state{out = Out1})};
- call ->
- M = call_module(T),
- F = call_name(T),
- As = call_args(T),
- {[X1, X2], St1} = visit_list([M, F], Env, St),
- {Xs, St2} = visit_list(As, Env, St1),
-%%% io:fwrite("call: ~w:~w(~w).\n",[X1,X2,Xs]),
- X = case {t_atom_vals(X1), t_atom_vals(X2)} of
- {[M1], [F1]} ->
- A = length(As),
-%%% io:fwrite("known call: ~w:~w/~w.\n",
-%%% [M1, F1, A]),
- call_type(M1, F1, A, Xs);
- _ ->
- t_any()
- end,
- L = get_label(T),
- {X, St2#state{out = dict:store(L, X, St2#state.out)}};
- primop ->
- As = primop_args(T),
- {Xs, St1} = visit_list(As, Env, St),
- F = atom_val(primop_name(T)),
- A = length(As),
- L = get_label(T),
- X = primop_type(F, A, Xs),
- {X, St1#state{out = dict:store(L, X, St1#state.out)}};
- 'case' ->
- {X, St1} = visit(case_arg(T), Env, St),
- Xs = case t_is_any(X) orelse t_is_none(X) of
- true ->
- [X || _ <- cerl:case_clauses(T)];
- false ->
- t_to_tlist(X)
- end,
- join_visit_clauses(Xs, case_clauses(T), Env, St1);
- 'receive' ->
- Any = t_any(),
- {X1, St1} = join_visit_clauses([Any], receive_clauses(T),
- Env, St),
- {X2, St2} = visit(receive_timeout(T), Env, St1),
- case t_is_atom(X2) andalso (t_atom_vals(X2) =:= [infinity]) of
- true ->
- {X1, St2};
- false ->
- {X3, St3} = visit(receive_action(T), Env, St2),
- {join(X1, X3), St3}
- end;
- 'try' ->
- {X, St1} = visit(try_arg(T), Env, St),
- Any = t_any(),
- Atom = t_atom(),
- TryVars = try_vars(T),
- St1Vars = St1#state.vars,
- Vars = case t_is_any(X) orelse t_is_none(X) of
- true ->
- bind_vars_single(TryVars, X, St1Vars);
- false ->
- bind_vars(TryVars, t_to_tlist(X), St1Vars)
- end,
- {X1, St2} = visit(try_body(T), Env, St1#state{vars = Vars}),
- EVars = bind_vars(try_evars(T), [Atom, Any, Any], St2#state.vars),
- {X2, St3} = visit(try_handler(T), Env, St2#state{vars = EVars}),
- {join(X1, X2), St3};
- 'catch' ->
- {_, St1} = visit(catch_body(T), Env, St),
- {t_any(), St1};
- binary ->
- {_, St1} = visit_list(binary_segments(T), Env, St),
- {t_binary(), St1};
- bitstr ->
- %% The other fields are constant literals.
- {_, St1} = visit(bitstr_val(T), Env, St),
- {_, St2} = visit(bitstr_size(T), Env, St1),
- {t_none(), St2};
- letrec ->
- %% All the bound funs should be revisited, because the
- %% environment might have changed.
- Vars = bind_defs(letrec_defs(T), St#state.vars,
- St#state.out),
- Ls = [get_label(F) || {_, F} <- letrec_defs(T)],
- St1 = St#state{work = add_work(Ls, St#state.work),
- vars = Vars},
- visit(letrec_body(T), Env, St1);
- module ->
- %% We handle a module as a sequence of function variables in
- %% the body of a `letrec'.
- {_, St1} = visit(c_letrec(module_defs(T),
- c_values(module_exports(T))),
- Env, St),
- {t_none(), St1}
- end.
-
-visit_clause(T, Xs, Env, St) ->
- Env1 = Env,
- Vars = bind_pats(clause_pats(T), Xs, St#state.vars),
- G = clause_guard(T),
- {_, St1} = visit(G, Env1, St#state{vars = Vars}),
- Env2 = guard_filters(G, Env1),
- visit(clause_body(T), Env2, St1).
-
-%% We assume correct value-list typing.
-
-visit_list([T | Ts], Env, St) ->
- {X, St1} = visit(T, Env, St),
- {Xs, St2} = visit_list(Ts, Env, St1),
- {[X | Xs], St2};
-visit_list([], _Env, St) ->
- {[], St}.
-
-join_visit_clauses(Xs, [T | Ts], Env, St) ->
- {X1, St1} = visit_clause(T, Xs, Env, St),
- {X2, St2} = join_visit_clauses(Xs, Ts, Env, St1),
- {join(X1, X2), St2};
-join_visit_clauses(_, [], _Env, St) ->
- {t_none(), St}.
-
-bind_defs([{V, F} | Ds], Vars, Out) ->
- Xs = [dict:fetch(get_label(V1), Vars) || V1 <- fun_vars(F)],
- X = dict:fetch(get_label(F), Out),
- bind_defs(Ds, dict:store(get_label(V), t_fun(Xs, X), Vars), Out);
-bind_defs([], Vars, _Out) ->
- Vars.
-
-bind_pats(Ps, Xs, Vars) ->
- if length(Xs) =:= length(Ps) ->
- bind_pats_list(Ps, Xs, Vars);
- true ->
- bind_pats_single(Ps, t_none(), Vars)
- end.
-
-bind_pats_list([P | Ps], [X | Xs], Vars) ->
- Vars1 = bind_pat_vars(P, X, Vars),
- bind_pats_list(Ps, Xs, Vars1);
-bind_pats_list([], [], Vars) ->
- Vars.
-
-bind_pats_single([P | Ps], X, Vars) ->
- bind_pats_single(Ps, X, bind_pat_vars(P, X, Vars));
-bind_pats_single([], _X, Vars) ->
- Vars.
-
-bind_pat_vars(P, X, Vars) ->
- case type(P) of
- var ->
- dict:store(get_label(P), X, Vars);
- literal ->
- Vars;
- cons ->
- case t_is_cons(X) of
- true ->
- %% If X is "nonempty proper list of X1", then the
- %% head has type X1 and the tail has type "proper
- %% list of X1". (If X is just "cons cell of X1",
- %% then both head and tail have type X1.)
- Vars1 = bind_pat_vars(cons_hd(P), t_cons_hd(X),
- Vars),
- bind_pat_vars(cons_tl(P), t_cons_tl(X), Vars1);
- false ->
- case t_is_list(X) of
- true ->
- %% If X is "proper list of X1", then the
- %% head has type X1 and the tail has type
- %% "proper list of X1", i.e., type X.
- Vars1 = bind_pat_vars(cons_hd(P),
- t_list_elements(X),
- Vars),
- bind_pat_vars(cons_tl(P), X, Vars1);
- false ->
- case t_is_maybe_improper_list(X) of
- true ->
- %% If X is "cons cell of X1", both
- %% the head and tail have type X1.
- X1 = t_list_elements(X),
- Vars1 = bind_pat_vars(cons_hd(P),
- X1, Vars),
- bind_pat_vars(cons_tl(P), X1,
- Vars1);
- false ->
- bind_vars_single(pat_vars(P),
- top_or_bottom(X),
- Vars)
- end
- end
- end;
- tuple ->
- case t_is_tuple(X) of
- true ->
- case t_tuple_subtypes(X) of
- unknown ->
- bind_vars_single(pat_vars(P), top_or_bottom(X),
- Vars);
- [Tuple] ->
- case t_tuple_size(Tuple) =:= tuple_arity(P) of
- true ->
- bind_pats_list(tuple_es(P),
- t_tuple_args(Tuple), Vars);
-
- false ->
- bind_vars_single(pat_vars(P),
- top_or_bottom(X), Vars)
- end;
- List when is_list(List) ->
- bind_vars_single(pat_vars(P), top_or_bottom(X),
- Vars)
- end;
- false ->
- bind_vars_single(pat_vars(P), top_or_bottom(X), Vars)
- end;
- binary ->
- bind_pats_single(binary_segments(P), t_none(), Vars);
- bitstr ->
- %% Only the Value field is a new binding. Size is already
- %% bound, and the other fields are constant literals.
- %% We could create a filter for Size being an integer().
- Size = bitstr_size(P),
- ValType =
- case concrete(bitstr_type(P)) of
- float -> t_float();
- binary -> t_binary();
- integer ->
- case is_c_int(Size) of
- false -> t_integer();
- true ->
- SizeVal = int_val(Size),
- Flags = concrete(bitstr_flags(P)),
- case lists:member(signed, Flags) of
- true ->
- t_from_range(-(1 bsl (SizeVal - 1)),
- 1 bsl (SizeVal - 1) - 1);
- false ->
- t_from_range(0,1 bsl SizeVal - 1)
- end
- end
- end,
- bind_pat_vars(bitstr_val(P), ValType, Vars);
- alias ->
- P1 = alias_pat(P),
- Vars1 = bind_pat_vars(P1, X, Vars),
- dict:store(get_label(alias_var(P)), pat_type(P1, Vars1),
- Vars1)
- end.
-
-pat_type(P, Vars) ->
- case type(P) of
- var ->
- dict:fetch(get_label(P), Vars);
- literal ->
- t_from_term(concrete(P));
- cons ->
- t_cons(pat_type(cons_hd(P), Vars),
- pat_type(cons_tl(P), Vars));
- tuple ->
- t_tuple([pat_type(E, Vars) || E <- tuple_es(P)]);
- binary ->
- t_binary();
- alias ->
- pat_type(alias_pat(P), Vars)
- end.
-
-bind_vars(Vs, Xs, Vars) ->
- if length(Vs) =:= length(Xs) ->
- bind_vars_list(Vs, Xs, Vars);
- true ->
- bind_vars_single(Vs, t_none(), Vars)
- end.
-
-bind_vars_list([V | Vs], [X | Xs], Vars) ->
- bind_vars_list(Vs, Xs, dict:store(get_label(V), X, Vars));
-bind_vars_list([], [], Vars) ->
- Vars.
-
-bind_vars_single([V | Vs], X, Vars) ->
- bind_vars_single(Vs, X, dict:store(get_label(V), X, Vars));
-bind_vars_single([], _X, Vars) ->
- Vars.
-
-add_dep(Source, Target, Deps) ->
- case dict:find(Source, Deps) of
- {ok, X} ->
- case set__is_member(Target, X) of
- true ->
- Deps;
- false ->
-%%% io:fwrite("new dep: ~w <- ~w.\n", [Target, Source]),
- dict:store(Source, set__add(Target, X), Deps)
- end;
- error ->
-%%% io:fwrite("new dep: ~w <- ~w.\n", [Target, Source]),
- dict:store(Source, set__singleton(Target), Deps)
- end.
-
-%% This handles a call site, updating parameter variables with respect
-%% to the actual parameters.
-
-call_site(Ls, Xs, St) ->
-%% io:fwrite("call site: ~w ~s.\n",
-%% [Ls, erl_types:t_to_string(erl_types:t_product(Xs))]),
- {W, V} = call_site(Ls, Xs, St#state.work, St#state.vars,
- St#state.funs, St#state.k),
- St#state{work = W, vars = V}.
-
-call_site([L | Ls], Xs, W, V, Fs, Limit) ->
- Vs = fun_vars(dict:fetch(L, Fs)),
- case bind_args(Vs, Xs, V, Limit) of
- {V1, true} ->
- call_site(Ls, Xs, add_work([L], W), V1, Fs, Limit);
- {V1, false} ->
- call_site(Ls, Xs, W, V1, Fs, Limit)
- end;
-call_site([], _, W, V, _, _) ->
- {W, V}.
-
-%% If the arity does not match the call, nothing is done here.
-
-bind_args(Vs, Xs, Vars, Limit) ->
- if length(Vs) =:= length(Xs) ->
- bind_args(Vs, Xs, Vars, Limit, false);
- true ->
- {Vars, false}
- end.
-
-bind_args([V | Vs], [X | Xs], Vars, Limit, Ch) ->
- L = get_label(V),
- {Vars1, Ch1} = bind_arg(L, X, Vars, Limit, Ch),
- bind_args(Vs, Xs, Vars1, Limit, Ch1);
-bind_args([], [], Vars, _Limit, Ch) ->
- {Vars, Ch}.
-
-%% bind_arg(L, X, Vars, Limit) ->
-%% bind_arg(L, X, Vars, Limit, false).
-
-bind_arg(L, X, Vars, Limit, Ch) ->
- X0 = dict:fetch(L, Vars),
- X1 = limit(join(X, X0), Limit),
- case equal(X0, X1) of
- true ->
- {Vars, Ch};
- false ->
-%%% io:fwrite("arg (~w) changed: ~s <- ~s + ~s.\n",
-%%% [L, erl_types:t_to_string(X1),
-%%% erl_types:t_to_string(X0),
-%%% erl_types:t_to_string(X)]),
- {dict:store(L, X1, Vars), true}
- end.
-
-%% Domain: type(), defined in module `erl_types'.
-
-meet(X, Y) -> t_inf(X, Y).
-
-join(X, Y) -> t_sup(X, Y).
-
-join_list([Xs | Xss]) ->
- join(Xs, join_list(Xss));
-join_list([]) ->
- t_none().
-
-equal(X, Y) -> X =:= Y.
-
-limit(X, K) -> t_limit(X, K).
-
-top_or_bottom(T) ->
- case t_is_none(T) of
- true ->
- T;
- false ->
- t_any()
- end.
-
-strict(Xs, T) ->
- case erl_types:any_none(Xs) of
- true ->
- t_none();
- false ->
- T
- end.
-
-%% Set abstraction for label sets.
-
-%% set__new() -> [].
-
-set__singleton(X) -> [X].
-
-%% set__to_list(S) -> S.
-
-%% set__from_list(S) -> ordsets:from_list(S).
-
-%% set__union(X, Y) -> ordsets:union(X, Y).
-
-set__add(X, S) -> ordsets:add_element(X, S).
-
-set__is_member(X, S) -> ordsets:is_element(X, S).
-
-%% set__subtract(X, Y) -> ordsets:subtract(X, Y).
-
-%% set__equal(X, Y) -> X =:= Y.
-
-%% A simple but efficient functional queue.
-
-queue__new() -> {[], []}.
-
-queue__put(X, {In, Out}) -> {[X | In], Out}.
-
-queue__get({In, [X | Out]}) -> {ok, X, {In, Out}};
-queue__get({[], _}) -> empty;
-queue__get({In, _}) ->
- [X | In1] = lists:reverse(In),
- {ok, X, {[], In1}}.
-
-%% The work list - a queue without repeated elements.
-
-init_work() ->
- {queue__put(external, queue__new()), sets:new()}.
-
-add_work(Ls, {Q, Set}) ->
- add_work(Ls, Q, Set).
-
-%% Note that the elements are enqueued in order.
-
-add_work([L | Ls], Q, Set) ->
- case sets:is_element(L, Set) of
- true ->
- add_work(Ls, Q, Set);
- false ->
- add_work(Ls, queue__put(L, Q), sets:add_element(L, Set))
- end;
-add_work([], Q, Set) ->
- {Q, Set}.
-
-take_work({Queue0, Set0}) ->
- case queue__get(Queue0) of
- {ok, L, Queue1} ->
- Set1 = sets:del_element(L, Set0),
- {ok, L, {Queue1, Set1}};
- empty ->
- none
- end.
-
-get_deps(L, Dep) ->
- case dict:find(L, Dep) of
- {ok, Ls} -> Ls;
- error -> []
- end.
-
-%% Type information for built-in functions. We do not check that the
-%% arguments have the correct type; if the call would actually fail,
-%% rather than return a value, this is a safe overapproximation.
-
-primop_type(match_fail, 1, _) -> t_none();
-primop_type(_, _, Xs) -> strict(Xs, t_any()).
-
-call_type(M, F, A, Xs) ->
- erl_bif_types:type(M, F, A, Xs).
-
-guard_filters(T, Env) ->
- guard_filters(T, Env, dict:new()).
-
-guard_filters(T, Env, Vars) ->
- case type(T) of
- call ->
- M = call_module(T),
- F = call_name(T),
- case is_c_atom(M) andalso is_c_atom(F) of
- true ->
- As = call_args(T),
- case {atom_val(M), atom_val(F), length(As)} of
- {erlang, 'and', 2} ->
- [A1, A2] = As,
- guard_filters(A1, guard_filters(A2, Env));
- {erlang, is_atom, 1} ->
- filter(As, t_atom(), Env);
- {erlang, is_binary, 1} ->
- filter(As, t_binary(), Env);
- {erlang, is_float, 1} ->
- filter(As, t_float(), Env);
- {erlang, is_function, 1} ->
- filter(As, t_fun(), Env);
- {erlang, is_integer, 1} ->
- filter(As, t_integer(), Env);
- {erlang, is_list, 1} ->
- filter(As, t_maybe_improper_list(), Env);
- {erlang, is_number, 1} ->
- filter(As, t_number(), Env);
- {erlang, is_pid, 1} ->
- filter(As, t_pid(), Env);
- {erlang, is_port, 1} ->
- filter(As, t_port(), Env);
- {erlang, is_reference, 1} ->
- filter(As, t_reference(), Env);
- {erlang, is_tuple, 1} ->
- filter(As, t_tuple(), Env);
- _ ->
- Env
- end;
- false ->
- Env
- end;
- var ->
- case dict:find(var_name(T), Vars) of
- {ok, T1} ->
- guard_filters(T1, Env, Vars);
- error ->
- Env
- end;
- 'let' ->
- case let_vars(T) of
- [V] ->
- guard_filters(let_body(T), Env,
- dict:store(var_name(V), let_arg(T),
- Vars));
- _ ->
- Env
- end;
- values ->
- case values_es(T) of
- [T1] ->
- guard_filters(T1, Env, Vars);
- _ ->
- Env
- end;
- _ ->
- Env
- end.
-
-filter(As, X, Env) ->
- [A] = As,
- case type(A) of
- var ->
- V = var_name(A),
- case dict:find(V, Env) of
- {ok, X1} ->
- dict:store(V, meet(X, X1), Env);
- error ->
- dict:store(V, X, Env)
- end;
- _ ->
- Env
- end.
-
-%% Callback hook for cerl_prettypr:
-
--spec pp_hook() -> fun((cerl:cerl(), _, fun((_,_) -> any())) -> any()).
-
-pp_hook() ->
- fun pp_hook/3.
-
-pp_hook(Node, Ctxt, Cont) ->
- As = cerl:get_ann(Node),
- As1 = proplists:delete(type, proplists:delete(label, As)),
- As2 = proplists:delete(typesig, proplists:delete(file, As1)),
- D = Cont(cerl:set_ann(Node, []), Ctxt),
- T = case proplists:lookup(type, As) of
- {type, T0} -> T0;
- none ->
- case proplists:lookup(typesig, As) of
- {typesig, T0} -> T0;
- none -> t_any()
- end
- end,
- D1 = case erl_types:t_is_any(T) of
- true ->
- D;
- false ->
- case cerl:is_literal(Node) of
- true ->
- D;
- false ->
- S = erl_types:t_to_string(T),
- Q = prettypr:beside(prettypr:text("::"),
- prettypr:text(S)),
- prettypr:beside(D, Q)
- end
- end,
- cerl_prettypr:annotate(D1, As2, Ctxt).
-
-%% =====================================================================
diff --git a/lib/dialyzer/src/dialyzer.app.src b/lib/dialyzer/src/dialyzer.app.src
index a22f8acd85..f9c7304b9f 100644
--- a/lib/dialyzer/src/dialyzer.app.src
+++ b/lib/dialyzer/src/dialyzer.app.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -22,15 +22,12 @@
{application, dialyzer,
[{description, "DIscrepancy AnaLYZer of ERlang programs, version %VSN%"},
{vsn, "%VSN%"},
- {modules, [cerl_closurean,
- cerl_lib,
- cerl_pmatch,
- cerl_prettypr,
- cerl_typean,
+ {modules, [cerl_prettypr,
dialyzer,
dialyzer_analysis_callgraph,
dialyzer_behaviours,
dialyzer_callgraph,
+ dialyzer_typegraph,
dialyzer_cl,
dialyzer_cl_parse,
dialyzer_clean_core,
@@ -44,8 +41,6 @@
dialyzer_gui_wx,
dialyzer_options,
dialyzer_plt,
- dialyzer_race_data_server,
- dialyzer_races,
dialyzer_succ_typings,
dialyzer_typesig,
dialyzer_utils,
@@ -53,10 +48,11 @@
dialyzer_worker,
erl_bif_types,
erl_types,
- typer]},
+ typer,
+ typer_core]},
{registered, []},
{applications, [compiler, kernel, stdlib]},
{env, []},
- {runtime_dependencies, ["wx-1.2","syntax_tools-2.0","stdlib-3.4",
- "kernel-5.3","erts-9.0",
- "compiler-7.0"]}]}.
+ {runtime_dependencies, ["wx-2.0","syntax_tools-2.0","stdlib-3.15",
+ "kernel-8.0","erts-12.0",
+ "compiler-8.0"]}]}.
diff --git a/lib/dialyzer/src/dialyzer.erl b/lib/dialyzer/src/dialyzer.erl
index ddd08e8679..9a5ba44592 100644
--- a/lib/dialyzer/src/dialyzer.erl
+++ b/lib/dialyzer/src/dialyzer.erl
@@ -503,10 +503,6 @@ message_to_string({opaque_size, [SizeType, Size]}, I, _E) ->
message_to_string({opaque_call, [M, F, Args, Culprit, OpaqueType]}, I, _E) ->
io_lib:format("The call ~s:~ts~ts breaks the opacity of the term ~ts :: ~ts\n",
[M, F, a(Args, I), c(Culprit, I), t(OpaqueType, I)]);
-%%----- Warnings for concurrency errors --------------------
-message_to_string({race_condition, [M, F, Args, Reason]}, I, _E) ->
- %% There is a possibly huge type in Reason.
- io_lib:format("The call ~w:~tw~ts ~ts\n", [M, F, a(Args, I), Reason]);
%%----- Warnings for behaviour errors --------------------
message_to_string({callback_type_mismatch, [B, F, A, ST, CT]}, I, _E) ->
io_lib:format("The inferred return type of ~tw/~w ~ts has nothing in"
diff --git a/lib/dialyzer/src/dialyzer.hrl b/lib/dialyzer/src/dialyzer.hrl
index 3ca63881d3..9236d6be3a 100644
--- a/lib/dialyzer/src/dialyzer.hrl
+++ b/lib/dialyzer/src/dialyzer.hrl
@@ -46,11 +46,12 @@
-define(WARN_CONTRACT_SYNTAX, warn_contract_syntax).
-define(WARN_CONTRACT_NOT_EQUAL, warn_contract_not_equal).
-define(WARN_CONTRACT_SUBTYPE, warn_contract_subtype).
+-define(WARN_CONTRACT_MISSING_RETURN, warn_contract_missing_return).
-define(WARN_CONTRACT_SUPERTYPE, warn_contract_supertype).
+-define(WARN_CONTRACT_EXTRA_RETURN, warn_contract_extra_return).
-define(WARN_CONTRACT_RANGE, warn_contract_range).
-define(WARN_CALLGRAPH, warn_callgraph).
-define(WARN_UNMATCHED_RETURN, warn_umatched_return).
--define(WARN_RACE_CONDITION, warn_race_condition).
-define(WARN_BEHAVIOUR, warn_behaviour).
-define(WARN_UNDEFINED_CALLBACK, warn_undefined_callbacks).
-define(WARN_UNKNOWN, warn_unknown).
@@ -69,7 +70,7 @@
| ?WARN_FUN_APP | ?WARN_MAP_CONSTRUCTION
| ?WARN_MATCHING | ?WARN_NON_PROPER_LIST
| ?WARN_NOT_CALLED | ?WARN_OPAQUE
- | ?WARN_RACE_CONDITION | ?WARN_RETURN_NO_RETURN
+ | ?WARN_RETURN_NO_RETURN
| ?WARN_RETURN_ONLY_EXIT | ?WARN_UNDEFINED_CALLBACK
| ?WARN_UNKNOWN | ?WARN_UNMATCHED_RETURN.
@@ -124,7 +125,6 @@
| 'no_undefined_callbacks'
| 'no_underspecs'
| 'no_unused'
- | 'race_conditions'
| 'underspecs'
| 'unknown'
| 'unmatched_returns'
@@ -168,6 +168,7 @@
-define(ERROR_LOCATION, column).
-type doc_plt() :: 'undefined' | dialyzer_plt:plt().
+-record(plt_info, {files :: [dialyzer_plt:file_md5()], mod_deps :: dict:dict()}).
-record(analysis, {analysis_pid :: pid() | 'undefined',
type = succ_typings :: anal_type(),
@@ -178,7 +179,6 @@
start_from = byte_code :: start_from(),
plt :: dialyzer_plt:plt(),
use_contracts = true :: boolean(),
- race_detection = false :: boolean(),
behaviours_chk = false :: boolean(),
timing = false :: boolean() | 'debug',
timing_server = none :: dialyzer_timing:timing_server(),
diff --git a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl
index 898ed26daf..ee795a54dc 100644
--- a/lib/dialyzer/src/dialyzer_analysis_callgraph.erl
+++ b/lib/dialyzer/src/dialyzer_analysis_callgraph.erl
@@ -68,9 +68,8 @@
start(Parent, LegalWarnings, Analysis) ->
TimingServer = dialyzer_timing:init(Analysis#analysis.timing),
- RacesOn = ordsets:is_element(?WARN_RACE_CONDITION, LegalWarnings),
Analysis0 =
- Analysis#analysis{race_detection = RacesOn, timing_server = TimingServer},
+ Analysis#analysis{timing_server = TimingServer},
Analysis1 = expand_files(Analysis0),
Analysis2 = run_analysis(Analysis1, LegalWarnings),
State = #server_state{parent = Parent},
@@ -132,7 +131,7 @@ analysis_start(Parent, Analysis, LegalWarnings) ->
solvers = Analysis#analysis.solvers
},
Files = ordsets:from_list(Analysis#analysis.files),
- {Callgraph, TmpCServer0} = compile_and_store(Files, State),
+ {Callgraph, ModCallDeps, Modules, TmpCServer0} = compile_and_store(Files, State),
%% Remote type postprocessing
Args = {Plt, Analysis, Parent},
NewCServer = remote_type_postprocessing(TmpCServer0, Args),
@@ -143,19 +142,16 @@ analysis_start(Parent, Analysis, LegalWarnings) ->
Plt1 = dialyzer_plt:insert_callbacks(Plt1_a, NewCServer),
State1 = State#analysis_state{codeserver = NewCServer, plt = Plt1},
Exports = dialyzer_codeserver:get_exports(NewCServer),
- NonExports = sets:subtract(sets:from_list(AllNodes), Exports),
+ NonExports = sets:subtract(sets:from_list(AllNodes, [{version, 2}]), Exports),
NonExportsList = sets:to_list(NonExports),
- NewCallgraph =
- case Analysis#analysis.race_detection of
- true -> dialyzer_callgraph:put_race_detection(true, Callgraph);
- false -> Callgraph
- end,
- State2 = analyze_callgraph(NewCallgraph, State1),
+ State2 = analyze_callgraph(Callgraph, State1),
+ ModTypeDeps = dict:from_list(maps:to_list(dialyzer_typegraph:module_type_deps(Analysis#analysis.use_contracts, CServer, Modules))),
+ ModDeps = dialyzer_callgraph:merge_module_deps(ModCallDeps, ModTypeDeps),
+ send_mod_deps(Parent, ModDeps),
#analysis_state{plt = Plt2,
doc_plt = DocPlt,
codeserver = Codeserver0} = State2,
{Codeserver, Plt3} = move_data(Codeserver0, Plt2),
- dialyzer_callgraph:dispose_race_server(NewCallgraph),
%% Since the PLT is never used, a dummy is sent:
DummyPlt = dialyzer_plt:new(),
send_codeserver_plt(Parent, Codeserver, DummyPlt),
@@ -240,16 +236,16 @@ analyze_callgraph(Callgraph, #analysis_state{codeserver = Codeserver,
plt_build ->
NewPlt =
dialyzer_succ_typings:analyze_callgraph(Callgraph, Plt, Codeserver,
- TimingServer, Solvers, Parent),
+ TimingServer, Solvers),
dialyzer_callgraph:delete(Callgraph),
State#analysis_state{plt = NewPlt, doc_plt = DocPlt};
succ_typings ->
{Warnings, NewPlt, NewDocPlt} =
dialyzer_succ_typings:get_warnings(Callgraph, Plt, DocPlt, Codeserver,
- TimingServer, Solvers, Parent),
+ TimingServer, Solvers),
dialyzer_callgraph:delete(Callgraph),
Warnings1 = filter_warnings(Warnings, Codeserver),
- send_warnings(State#analysis_state.parent, Warnings1),
+ send_warnings(Parent, Warnings1),
State#analysis_state{plt = NewPlt, doc_plt = NewDocPlt}
end.
@@ -315,13 +311,13 @@ compile_and_store(Files, #analysis_state{codeserver = CServer,
{T2, _} = statistics(wall_clock),
Msg1 = io_lib:format("done in ~.2f secs\nRemoving edges... ", [(T2-T1)/1000]),
send_log(Parent, Msg1),
- Callgraph =
+ {ModCallDeps, Callgraph} =
?timing(Timing, "clean", _C2,
cleanup_callgraph(State, CServer2, Callgraph, Modules)),
{T3, _} = statistics(wall_clock),
Msg2 = io_lib:format("done in ~.2f secs\n", [(T3-T2)/1000]),
send_log(Parent, Msg2),
- {Callgraph, CServer2}.
+ {Callgraph, ModCallDeps, Modules, CServer2}.
-opaque compile_init_data() :: #compile_init{}.
-type error_reason() :: string().
@@ -374,15 +370,14 @@ cleanup_callgraph(#analysis_state{plt = InitPlt, parent = Parent,
codeserver = CodeServer
},
CServer, Callgraph, Modules) ->
- ModuleDeps = dialyzer_callgraph:module_deps(Callgraph),
- send_mod_deps(Parent, ModuleDeps),
+ ModCallDeps = dialyzer_callgraph:module_call_deps(Callgraph),
{Callgraph1, ExtCalls} = dialyzer_callgraph:remove_external(Callgraph),
ExtCalls1 = [Call || Call = {_From, To} <- ExtCalls,
not dialyzer_plt:contains_mfa(InitPlt, To)],
{BadCalls1, RealExtCalls} =
if ExtCalls1 =:= [] -> {[], []};
true ->
- ModuleSet = sets:from_list(Modules),
+ ModuleSet = sets:from_list(Modules, [{version, 2}]),
PltModuleSet = dialyzer_plt:all_modules(InitPlt),
AllModules = sets:union(ModuleSet, PltModuleSet),
Pred = fun({_From, {M, _F, _A}}) -> sets:is_element(M, AllModules) end,
@@ -402,7 +397,7 @@ cleanup_callgraph(#analysis_state{plt = InitPlt, parent = Parent,
{From, To} <- RealExtCalls],
send_ext_calls(Parent, ExtCallsWithFileAndLocation)
end,
- Callgraph1.
+ {ModCallDeps, Callgraph1}.
compile_src(File, Includes, Defines, Callgraph, CServer, UseContracts,
LegalWarnings) ->
@@ -475,7 +470,7 @@ get_exported_types_from_core(Core) ->
cerl:concrete(L1) =:= 'export_type'],
ExpTypes2 = lists:flatten(ExpTypes1),
M = cerl:atom_val(cerl:module_name(Core)),
- sets:from_list([{M, F, A} || {F, A} <- ExpTypes2]).
+ sets:from_list([{M, F, A} || {F, A} <- ExpTypes2], [{version, 2}]).
get_exports_from_core(Core) ->
Tree = cerl:from_records(Core),
diff --git a/lib/dialyzer/src/dialyzer_behaviours.erl b/lib/dialyzer/src/dialyzer_behaviours.erl
index 4be84502a1..2462c2173f 100644
--- a/lib/dialyzer/src/dialyzer_behaviours.erl
+++ b/lib/dialyzer/src/dialyzer_behaviours.erl
@@ -22,7 +22,7 @@
-module(dialyzer_behaviours).
--export([check_callbacks/5]).
+-export([check_callbacks/5, get_behaviours/1]).
-export_type([behaviour/0]).
@@ -39,7 +39,7 @@
-record(state, {plt :: dialyzer_plt:plt(),
codeserver :: dialyzer_codeserver:codeserver(),
filename :: file:filename(),
- behlines :: [{behaviour(), non_neg_integer()}],
+ behlines :: [{behaviour(), file_location()}],
records :: rectab()}).
%%--------------------------------------------------------------------
@@ -64,6 +64,8 @@ check_callbacks(Module, Attrs, Records, Plt, Codeserver) ->
%%--------------------------------------------------------------------
+-spec get_behaviours([{cerl:cerl(), cerl:cerl()}]) -> {[behaviour()], [{behaviour(), term()}]}.
+
get_behaviours(Attrs) ->
BehaviourListsAndLocation =
[{cerl:concrete(L2), hd(cerl:get_ann(L2))} ||
@@ -101,7 +103,7 @@ check_all_callbacks(Module, Behaviour, [Cb|Rest],
CbReturnType = dialyzer_contracts:get_contract_return(Callback),
CbArgTypes = dialyzer_contracts:get_contract_args(Callback),
Acc0 = Acc,
- Acc1 =
+ Acc1 =
case dialyzer_plt:lookup(Plt, CbMFA) of
'none' ->
case lists:member(optional_callback, Xtra) of
diff --git a/lib/dialyzer/src/dialyzer_callgraph.erl b/lib/dialyzer/src/dialyzer_callgraph.erl
index f858a81e63..aec4bd7169 100644
--- a/lib/dialyzer/src/dialyzer_callgraph.erl
+++ b/lib/dialyzer/src/dialyzer_callgraph.erl
@@ -15,7 +15,7 @@
%%%-------------------------------------------------------------------
%%% File : dialyzer_callgraph.erl
%%% Author : Tobias Lindahl <tobiasl@it.uu.se>
-%%% Description :
+%%% Description :
%%%
%%% Created : 30 Mar 2005 by Tobias Lindahl <tobiasl@it.uu.se>
%%%-------------------------------------------------------------------
@@ -35,16 +35,14 @@
lookup_label/2,
lookup_name/2,
modules/1,
- module_deps/1,
+ module_call_deps/1,
+ merge_module_deps/2,
%% module_postorder/1,
module_postorder_from_funs/2,
new/0,
get_depends_on/2,
%% get_required_by/2,
in_neighbours/2,
- renew_race_info/4,
- renew_race_code/2,
- renew_race_public_tables/2,
reset_from_funs/2,
scan_core_tree/2,
strip_module_deps/2,
@@ -52,12 +50,6 @@
to_dot/2,
to_ps/3]).
--export([cleanup/1, get_digraph/1, get_named_tables/1, get_public_tables/1,
- get_race_code/1, get_race_detection/1, race_code_new/1,
- put_digraph/2, put_race_code/2, put_race_detection/2,
- put_named_tables/2, put_public_tables/2, put_behaviour_api_calls/2,
- get_behaviour_api_calls/1, dispose_race_server/1, duplicate/1]).
-
-export_type([callgraph/0, mfa_or_funlbl/0, callgraph_edge/0, mod_deps/0]).
-include("dialyzer.hrl").
@@ -72,10 +64,10 @@
%%-----------------------------------------------------------------------------
%% A callgraph is a directed graph where the nodes are functions and a
%% call between two functions is an edge from the caller to the callee.
-%%
+%%
%% calls - A mapping from call site (and apply site) labels
%% to the possible functions that can be called.
-%% digraph - A digraph representing the callgraph.
+%% digraph - A digraph representing the callgraph.
%% Nodes are represented as MFAs or labels.
%% esc - A set of all escaping functions as reported by dialyzer_dep.
%% letrec_map - A dict mapping from letrec bound labels to function labels.
@@ -89,24 +81,15 @@
%% whenever applicable.
%%-----------------------------------------------------------------------------
-%% Types with comment 'race' are due to dialyzer_races.erl.
-record(callgraph, {digraph = digraph:new() :: digraph:graph(),
- active_digraph :: active_digraph()
- | 'undefined', % race
- esc :: ets:tid()
- | 'undefined', % race
- letrec_map :: ets:tid()
- | 'undefined', % race
+ active_digraph :: active_digraph() | 'undefined',
+ esc :: ets:tid(),
+ letrec_map :: ets:tid(),
name_map :: ets:tid(),
rev_name_map :: ets:tid(),
- rec_var_map :: ets:tid()
- | 'undefined', % race
- self_rec :: ets:tid()
- | 'undefined', % race
- calls :: ets:tid()
- | 'undefined', % race
- race_detection = false :: boolean(),
- race_data_server = dialyzer_race_data_server:new() :: pid()}).
+ rec_var_map :: ets:tid(),
+ self_rec :: ets:tid(),
+ calls :: ets:tid()}).
%% Exported Types
@@ -147,7 +130,7 @@ all_nodes(#callgraph{digraph = DG}) ->
-spec lookup_rec_var(label(), callgraph()) -> 'error' | {'ok', mfa()}.
-lookup_rec_var(Label, #callgraph{rec_var_map = RecVarMap})
+lookup_rec_var(Label, #callgraph{rec_var_map = RecVarMap})
when is_integer(Label) ->
ets_lookup_dict(Label, RecVarMap).
@@ -222,7 +205,7 @@ remove_external(#callgraph{digraph = DG} = CG) ->
non_local_calls(#callgraph{digraph = DG}) ->
Edges = digraph_edges(DG),
- find_non_local_calls(Edges, sets:new()).
+ find_non_local_calls(Edges, sets:new([{version, 2}])).
-type call_tab() :: sets:set(mfa_call()).
@@ -234,7 +217,7 @@ find_non_local_calls([{{M,_,_}, {M,_,_}}|Left], Set) ->
find_non_local_calls([{{M1,_,_}, {M2,_,_}} = Edge|Left], Set) when M1 =/= M2 ->
find_non_local_calls(Left, sets:add_element(Edge, Set));
find_non_local_calls([{{_,_,_}, Label}|Left], Set) when is_integer(Label) ->
- find_non_local_calls(Left, Set);
+ find_non_local_calls(Left, Set);
find_non_local_calls([{Label, {_,_,_}}|Left], Set) when is_integer(Label) ->
find_non_local_calls(Left, Set);
find_non_local_calls([{Label1, Label2}|Left], Set) when is_integer(Label1),
@@ -243,6 +226,7 @@ find_non_local_calls([{Label1, Label2}|Left], Set) when is_integer(Label1),
find_non_local_calls([], Set) ->
sets:to_list(Set).
+%% Only considers call dependencies, not type dependencies, which are dealt with elsewhere
-spec get_depends_on(scc() | module(), callgraph()) -> [scc()].
get_depends_on(SCC, #callgraph{active_digraph = {'e', Out, _In, Maps}}) ->
@@ -281,10 +265,10 @@ modules(#callgraph{digraph = DG}) ->
-spec module_postorder(callgraph()) -> {[module()], {'d', digraph:graph()}}.
module_postorder(#callgraph{digraph = DG}) ->
- Edges = lists:foldl(fun edge_fold/2, sets:new(), digraph_edges(DG)),
- Nodes = sets:from_list([M || {M,_F,_A} <- digraph_vertices(DG)]),
+ Edges = lists:foldl(fun edge_fold/2, sets:new([{version, 2}]), digraph_edges(DG)),
+ Modules = ordsets:from_list([M || {M,_F,_A} <- digraph_vertices(DG)]),
MDG = digraph:new([acyclic]),
- digraph_confirm_vertices(sets:to_list(Nodes), MDG),
+ digraph_confirm_vertices(Modules, MDG),
Foreach = fun({M1,M2}) -> _ = digraph:add_edge(MDG, M1, M2) end,
lists:foreach(Foreach, sets:to_list(Edges)),
%% The out-neighbors of a vertex are the vertices called directly.
@@ -299,21 +283,33 @@ edge_fold({{M1,_,_},{M2,_,_}}, Set) ->
edge_fold(_, Set) -> Set.
-%% The module deps of a module are modules that depend on the module
--spec module_deps(callgraph()) -> mod_deps().
+%% The module call deps of a module are modules that depend on the module to
+%% make function calls
+-spec module_call_deps(callgraph()) -> mod_deps().
-module_deps(#callgraph{digraph = DG}) ->
- Edges = lists:foldl(fun edge_fold/2, sets:new(), digraph_edges(DG)),
- Nodes = sets:from_list([M || {M,_F,_A} <- digraph_vertices(DG)]),
+module_call_deps(#callgraph{digraph = DG}) ->
+ Edges = lists:foldl(fun edge_fold/2, sets:new([{version, 2}]), digraph_edges(DG)),
+ Modules = ordsets:from_list([M || {M,_F,_A} <- digraph_vertices(DG)]),
MDG = digraph:new(),
- digraph_confirm_vertices(sets:to_list(Nodes), MDG),
+ digraph_confirm_vertices(Modules, MDG),
Foreach = fun({M1,M2}) -> check_add_edge(MDG, M1, M2) end,
lists:foreach(Foreach, sets:to_list(Edges)),
Deps = [{N, ordsets:from_list(digraph:in_neighbours(MDG, N))}
- || N <- sets:to_list(Nodes)],
+ || N <- Modules],
digraph_delete(MDG),
dict:from_list(Deps).
+-spec merge_module_deps(mod_deps(), mod_deps()) -> mod_deps().
+merge_module_deps(Left, Right) ->
+ dict:merge(
+ fun (_Mod, L, R) ->
+ gb_sets:to_list(gb_sets:union(
+ gb_sets:from_list(L),
+ gb_sets:from_list(R)))
+ end,
+ Left,
+ Right).
+
-spec strip_module_deps(mod_deps(), sets:set(module())) -> mod_deps().
strip_module_deps(ModDeps, StripSet) ->
@@ -387,10 +383,10 @@ scan_core_tree(Tree, #callgraph{calls = ETSCalls,
true = ets:insert(ETSEsc, [{E} || E <- EscapingFuns]),
LabelEdges = get_edges_from_deps(Deps0),
-
+
%% Find the self recursive functions. Named functions get both the
%% key and their name for convenience.
- SelfRecs0 = lists:foldl(fun({Key, Key}, Acc) ->
+ SelfRecs0 = lists:foldl(fun({Key, Key}, Acc) ->
case ets_lookup_dict(Key, ETSNameMap) of
error -> [Key|Acc];
{ok, Name} -> [Key, Name|Acc]
@@ -398,9 +394,9 @@ scan_core_tree(Tree, #callgraph{calls = ETSCalls,
(_, Acc) -> Acc
end, [], LabelEdges),
true = ets:insert(ETSSelfRec, [{S} || S <- SelfRecs0]),
-
+
NamedEdges1 = name_edges(LabelEdges, ETSNameMap),
-
+
%% We need to scan for inter-module calls since these are not tracked
%% by dialyzer_dep. Note that the caller is always recorded as the
%% top level function. This is OK since the included functions are
@@ -422,7 +418,7 @@ scan_core_tree(Tree, #callgraph{calls = ETSCalls,
build_maps(Tree, ETSRecVarMap, ETSNameMap, ETSRevNameMap, ETSLetrecMap) ->
%% We only care about the named (top level) functions. The anonymous
- %% functions will be analysed together with their parents.
+ %% functions will be analysed together with their parents.
Defs = cerl:module_defs(Tree),
Mod = cerl:atom_val(cerl:module_name(Tree)),
Fun =
@@ -445,7 +441,7 @@ get_edges_from_deps(Deps) ->
%% this information.
Edges = dict:fold(fun(external, _Set, Acc) -> Acc;
(Caller, Set, Acc) ->
- [[{Caller, Callee} || Callee <- Set,
+ [[{Caller, Callee} || Callee <- Set,
Callee =/= external]|Acc]
end, [], Deps),
lists:flatten(Edges).
@@ -487,9 +483,9 @@ scan_one_core_fun(TopTree, FunName) ->
CalleeF = cerl:call_name(Tree),
CalleeArgs = cerl:call_args(Tree),
A = length(CalleeArgs),
- case (cerl:is_c_atom(CalleeM) andalso
+ case (cerl:is_c_atom(CalleeM) andalso
cerl:is_c_atom(CalleeF)) of
- true ->
+ true ->
M = cerl:atom_val(CalleeM),
F = cerl:atom_val(CalleeF),
case erl_bif_types:is_known(M, F, A) of
@@ -518,7 +514,7 @@ scan_one_core_fun(TopTree, FunName) ->
end;
false -> [{FunName, {M, F, A}}|Acc]
end;
- false ->
+ false ->
%% We cannot handle run-time bindings
Acc
end;
@@ -574,14 +570,14 @@ digraph_confirm_vertices([MFA|Left], DG) ->
digraph_confirm_vertices(Left, DG);
digraph_confirm_vertices([], _DG) ->
ok.
-
+
digraph_remove_external(DG) ->
Vertices = digraph:vertices(DG),
Unconfirmed = remove_unconfirmed(Vertices, DG),
{DG, Unconfirmed}.
-remove_unconfirmed(Vertexes, DG) ->
- remove_unconfirmed(Vertexes, DG, []).
+remove_unconfirmed(Vertices, DG) ->
+ remove_unconfirmed(Vertices, DG, []).
remove_unconfirmed([V|Left], DG, Unconfirmed) ->
case digraph:vertex(DG, V) of
@@ -616,138 +612,10 @@ digraph_in_neighbours(V, DG) ->
List -> List
end.
-digraph_reaching_subgraph(Funs, DG) ->
+digraph_reaching_subgraph(Funs, DG) ->
Vertices = digraph_utils:reaching(Funs, DG),
digraph_utils:subgraph(DG, Vertices).
-%%----------------------------------------------------------------------
-%% Races
-%%----------------------------------------------------------------------
-
--spec renew_race_info(callgraph(), dict:dict(), [label()], [string()]) ->
- callgraph().
-
-renew_race_info(#callgraph{race_data_server = RaceDataServer} = CG,
- RaceCode, PublicTables, NamedTables) ->
- ok = dialyzer_race_data_server:cast(
- {renew_race_info, {RaceCode, PublicTables, NamedTables}},
- RaceDataServer),
- CG.
-
--spec renew_race_code(dialyzer_races:races(), callgraph()) -> callgraph().
-
-renew_race_code(Races, #callgraph{race_data_server = RaceDataServer} = CG) ->
- Fun = dialyzer_races:get_curr_fun(Races),
- FunArgs = dialyzer_races:get_curr_fun_args(Races),
- Code = lists:reverse(dialyzer_races:get_race_list(Races)),
- ok = dialyzer_race_data_server:cast(
- {renew_race_code, {Fun, FunArgs, Code}},
- RaceDataServer),
- CG.
-
--spec renew_race_public_tables(label(), callgraph()) -> callgraph().
-
-renew_race_public_tables(VarLabel,
- #callgraph{race_data_server = RaceDataServer} = CG) ->
- ok =
- dialyzer_race_data_server:cast({renew_race_public_tables, VarLabel}, RaceDataServer),
- CG.
-
--spec cleanup(callgraph()) -> callgraph().
-
-cleanup(#callgraph{digraph = Digraph,
- name_map = NameMap,
- rev_name_map = RevNameMap,
- race_data_server = RaceDataServer}) ->
- #callgraph{digraph = Digraph,
- name_map = NameMap,
- rev_name_map = RevNameMap,
- race_data_server = dialyzer_race_data_server:duplicate(RaceDataServer)}.
-
--spec duplicate(callgraph()) -> callgraph().
-
-duplicate(#callgraph{race_data_server = RaceDataServer} = Callgraph) ->
- Callgraph#callgraph{
- race_data_server = dialyzer_race_data_server:duplicate(RaceDataServer)}.
-
--spec dispose_race_server(callgraph()) -> ok.
-
-dispose_race_server(#callgraph{race_data_server = RaceDataServer}) ->
- dialyzer_race_data_server:stop(RaceDataServer).
-
--spec get_digraph(callgraph()) -> digraph:graph().
-
-get_digraph(#callgraph{digraph = Digraph}) ->
- Digraph.
-
--spec get_named_tables(callgraph()) -> [string()].
-
-get_named_tables(#callgraph{race_data_server = RaceDataServer}) ->
- dialyzer_race_data_server:call(get_named_tables, RaceDataServer).
-
--spec get_public_tables(callgraph()) -> [label()].
-
-get_public_tables(#callgraph{race_data_server = RaceDataServer}) ->
- dialyzer_race_data_server:call(get_public_tables, RaceDataServer).
-
--spec get_race_code(callgraph()) -> dict:dict().
-
-get_race_code(#callgraph{race_data_server = RaceDataServer}) ->
- dialyzer_race_data_server:call(get_race_code, RaceDataServer).
-
--spec get_race_detection(callgraph()) -> boolean().
-
-get_race_detection(#callgraph{race_detection = RD}) ->
- RD.
-
--spec get_behaviour_api_calls(callgraph()) -> [{mfa(), mfa()}].
-
-get_behaviour_api_calls(#callgraph{race_data_server = RaceDataServer}) ->
- dialyzer_race_data_server:call(get_behaviour_api_calls, RaceDataServer).
-
--spec race_code_new(callgraph()) -> callgraph().
-
-race_code_new(#callgraph{race_data_server = RaceDataServer} = CG) ->
- ok = dialyzer_race_data_server:cast(race_code_new, RaceDataServer),
- CG.
-
--spec put_digraph(digraph:graph(), callgraph()) -> callgraph().
-
-put_digraph(Digraph, Callgraph) ->
- Callgraph#callgraph{digraph = Digraph}.
-
--spec put_race_code(dict:dict(), callgraph()) -> callgraph().
-
-put_race_code(RaceCode, #callgraph{race_data_server = RaceDataServer} = CG) ->
- ok = dialyzer_race_data_server:cast({put_race_code, RaceCode}, RaceDataServer),
- CG.
-
--spec put_race_detection(boolean(), callgraph()) -> callgraph().
-
-put_race_detection(RaceDetection, Callgraph) ->
- Callgraph#callgraph{race_detection = RaceDetection}.
-
--spec put_named_tables([string()], callgraph()) -> callgraph().
-
-put_named_tables(NamedTables,
- #callgraph{race_data_server = RaceDataServer} = CG) ->
- ok = dialyzer_race_data_server:cast({put_named_tables, NamedTables}, RaceDataServer),
- CG.
-
--spec put_public_tables([label()], callgraph()) -> callgraph().
-
-put_public_tables(PublicTables,
- #callgraph{race_data_server = RaceDataServer} = CG) ->
- ok = dialyzer_race_data_server:cast({put_public_tables, PublicTables}, RaceDataServer),
- CG.
-
--spec put_behaviour_api_calls([{mfa(), mfa()}], callgraph()) -> callgraph().
-
-put_behaviour_api_calls(Calls,
- #callgraph{race_data_server = RaceDataServer} = CG) ->
- ok = dialyzer_race_data_server:cast({put_behaviour_api_calls, Calls}, RaceDataServer),
- CG.
-
%%=============================================================================
%% Utilities for 'dot'
%%=============================================================================
@@ -762,7 +630,7 @@ to_dot(#callgraph{digraph = DG, esc = Esc} = CG, File) ->
{ok, Name} -> Name
end
end,
- Escaping = [{Fun(L), {color, red}}
+ Escaping = [{Fun(L), {color, red}}
|| L <- [E || {E} <- ets:tab2list(Esc)], L =/= external],
Vertices = digraph_edges(DG),
dialyzer_dot:translate_list(Vertices, File, "CG", Escaping).
@@ -799,7 +667,7 @@ do_condensation(G, Parent) ->
IntScc = sofs:relation(IntToSCC, [{int, scc}]),
%% Create mapping from unique integers to SCCs:
ets:insert(MapsETS, IntToSCC),
- %% Subsitute strong components for vertices in edges using the
+ %% Substitute strong components for vertices in edges using the
%% unique numbers:
C2V = sofs:relation([{SC, V} || SC <- SCCs, V <- SC], [{scc, v}]),
I2V = sofs:relative_product(IntScc, C2V), % [{v, int}]
diff --git a/lib/dialyzer/src/dialyzer_cl.erl b/lib/dialyzer/src/dialyzer_cl.erl
index 2dd56ebb08..25fdef948e 100644
--- a/lib/dialyzer/src/dialyzer_cl.erl
+++ b/lib/dialyzer/src/dialyzer_cl.erl
@@ -47,7 +47,7 @@
indent_opt = ?INDENT_OPT :: iopt(),
error_location = ?ERROR_LOCATION :: error_location(),
output_plt = none :: 'none' | file:filename(),
- plt_info = none :: 'none' | dialyzer_plt:plt_info(),
+ plt_info = none :: 'none' | #plt_info{},
report_mode = normal :: rep_mode(),
return_status= ?RET_NOTHING_SUSPICIOUS :: dial_ret(),
stored_warnings = [] :: [raw_warning()]
@@ -73,7 +73,7 @@ build_plt(Opts) ->
Opts1 = init_opts_for_build(Opts),
Files = get_files_from_opts(Opts1),
Md5 = dialyzer_plt:compute_md5_from_files(Files),
- PltInfo = {Md5, dict:new()},
+ PltInfo = #plt_info{files = Md5, mod_deps = dict:new()},
do_analysis(Files, Opts1, dialyzer_plt:new(), PltInfo).
init_opts_for_build(Opts) ->
@@ -200,7 +200,7 @@ plt_common(#options{init_plts = [InitPlt]} = Opts, RemoveFiles, AddFiles) ->
end,
{?RET_NOTHING_SUSPICIOUS, []};
{old_version, Md5} ->
- PltInfo = {Md5, dict:new()},
+ PltInfo = #plt_info{files = Md5, mod_deps = dict:new()},
Files = [F || {F, _} <- Md5],
do_analysis(Files, Opts, dialyzer_plt:new(), PltInfo);
{differ, Md5, DiffMd5, ModDeps} ->
@@ -212,10 +212,10 @@ plt_common(#options{init_plts = [InitPlt]} = Opts, RemoveFiles, AddFiles) ->
true ->
%% Only removed stuff. Just write the PLT.
dialyzer_plt:to_file(Opts#options.output_plt, Plt, ModDeps,
- {Md5, ModDeps}),
+ #plt_info{files = Md5, mod_deps = ModDeps}),
{?RET_NOTHING_SUSPICIOUS, []};
false ->
- do_analysis(AnalFiles, Opts, Plt, {Md5, ModDeps1})
+ do_analysis(AnalFiles, Opts, Plt, #plt_info{files = Md5, mod_deps = ModDeps1})
end;
{error, no_such_file} ->
Msg = io_lib:format("Could not find the PLT: ~ts\n~s",
@@ -431,7 +431,18 @@ check_if_writable(PltFile) ->
true -> false;
false ->
DirName = filename:dirname(PltFile),
- filelib:is_dir(DirName) andalso is_writable_file_or_dir(DirName)
+ case filelib:is_dir(DirName) of
+ false ->
+ case filelib:ensure_dir(PltFile) of
+ ok ->
+ io:format(" Creating ~ts as it did not exist...~n", [DirName]),
+ true;
+ {error, _} ->
+ false
+ end;
+ true ->
+ is_writable_file_or_dir(DirName)
+ end
end
end.
@@ -452,8 +463,8 @@ clean_plt(PltFile, RemovedMods) ->
Plt, RemovedMods).
expand_dependent_modules(Md5, DiffMd5, ModDeps) ->
- ChangedMods = sets:from_list([M || {differ, M} <- DiffMd5]),
- RemovedMods = sets:from_list([M || {removed, M} <- DiffMd5]),
+ ChangedMods = sets:from_list([M || {differ, M} <- DiffMd5], [{version, 2}]),
+ RemovedMods = sets:from_list([M || {removed, M} <- DiffMd5], [{version, 2}]),
BigSet = sets:union(ChangedMods, RemovedMods),
BigList = sets:to_list(BigSet),
ExpandedSet = expand_dependent_modules_1(BigList, BigSet, ModDeps),
diff --git a/lib/dialyzer/src/dialyzer_cl_parse.erl b/lib/dialyzer/src/dialyzer_cl_parse.erl
index ff7930f21a..b78bfd442d 100644
--- a/lib/dialyzer/src/dialyzer_cl_parse.erl
+++ b/lib/dialyzer/src/dialyzer_cl_parse.erl
@@ -544,8 +544,6 @@ warning_options_msg() ->
value or do not match against one of many possible return value(s).
-Werror_handling ***
Include warnings for functions that only return by means of an exception.
- -Wrace_conditions ***
- Include warnings for possible race conditions.
-Wunderspecs ***
Warn about underspecified functions
(those whose -spec is strictly more allowing than the success typing).
diff --git a/lib/dialyzer/src/dialyzer_clean_core.erl b/lib/dialyzer/src/dialyzer_clean_core.erl
index d591ad3473..820ce19a06 100644
--- a/lib/dialyzer/src/dialyzer_clean_core.erl
+++ b/lib/dialyzer/src/dialyzer_clean_core.erl
@@ -72,11 +72,6 @@ clean(Tree) ->
Args = clean_list(cerl:primop_args(Tree)),
Name = cerl:primop_name(Tree),
cerl:update_c_primop(Tree, Name, Args);
- 'receive' ->
- Clauses = clean_clauses(cerl:receive_clauses(Tree)),
- Timeout = clean(cerl:receive_timeout(Tree)),
- Action = clean(cerl:receive_action(Tree)),
- cerl:update_c_receive(Tree, Clauses, Timeout, Action);
seq ->
Arg = clean(cerl:seq_arg(Tree)),
Body = clean(cerl:seq_body(Tree)),
@@ -114,6 +109,7 @@ clean_letrec(Tree) ->
FunBody = cerl:fun_body(Fun),
FunBody1 = clean(FunBody),
Body = clean(cerl:letrec_body(Tree)),
+ FunVars = cerl:fun_vars(Fun),
case dialyzer_ignore(Body) of
true ->
%% The body of the letrec directly transfer controls to
@@ -157,8 +153,10 @@ clean_letrec(Tree) ->
%% end
%%
PrimopUnknown = cerl:c_primop(cerl:abstract(dialyzer_unknown), []),
- Clauses = [cerl:c_clause([cerl:abstract(a)], Body),
- cerl:c_clause([cerl:abstract(b)], FunBody1)],
+ PatA = [cerl:abstract(a)],
+ PatB = [cerl:c_tuple([cerl:abstract(b)|FunVars])],
+ Clauses = [cerl:c_clause(PatA, Body),
+ cerl:c_clause(PatB, FunBody1)],
cerl:c_case(PrimopUnknown, Clauses)
end;
false ->
diff --git a/lib/dialyzer/src/dialyzer_codeserver.erl b/lib/dialyzer/src/dialyzer_codeserver.erl
index 0472e2c128..9b8a165dd0 100644
--- a/lib/dialyzer/src/dialyzer_codeserver.erl
+++ b/lib/dialyzer/src/dialyzer_codeserver.erl
@@ -29,7 +29,7 @@
finalize_records/1,
get_contracts/1,
get_callbacks/1,
- get_exported_types/1,
+ get_exported_types_table/1,
extract_exported_types/1,
get_exports/1,
get_records_table/1,
@@ -122,7 +122,7 @@ ets_set_insert_list(List, Table) ->
ets_set_to_set(Table) ->
Fold = fun({E}, Set) -> sets:add_element(E, Set) end,
- ets:foldl(Fold, sets:new(), Table).
+ ets:foldl(Fold, sets:new([{version, 2}]), Table).
%%--------------------------------------------------------------------
@@ -132,12 +132,15 @@ new() ->
CodeOptions = [compressed, public, {read_concurrency, true}],
Code = ets:new(dialyzer_codeserver_code, CodeOptions),
ReadOptions = [compressed, {read_concurrency, true}],
- [Contracts, Callbacks, Records, ExportedTypes] =
+ [Records, ExportedTypes] =
[ets:new(Name, ReadOptions) ||
- Name <- [dialyzer_codeserver_contracts,
- dialyzer_codeserver_callbacks,
- dialyzer_codeserver_records,
+ Name <- [dialyzer_codeserver_records,
dialyzer_codeserver_exported_types]],
+ ReadWriteOptions = [public | ReadOptions],
+ [Contracts, Callbacks] =
+ [ets:new(Name, ReadWriteOptions) ||
+ Name <- [dialyzer_codeserver_contracts,
+ dialyzer_codeserver_callbacks]],
TempOptions = [public, {write_concurrency, true}],
[Exports, FunMetaInfo, TempExportedTypes, TempRecords, TempContracts,
TempCallbacks] =
@@ -211,10 +214,10 @@ insert_fun_meta_info(List, #codeserver{fun_meta_info = FunMetaInfo} = CS) ->
is_exported(MFA, #codeserver{exports = Exports}) ->
ets_set_is_element(MFA, Exports).
--spec get_exported_types(codeserver()) -> sets:set(mfa()).
+-spec get_exported_types_table(codeserver()) -> map_ets().
-get_exported_types(#codeserver{exported_types = ExpTypes}) ->
- ets_set_to_set(ExpTypes).
+get_exported_types_table(#codeserver{exported_types = ExpTypes}) ->
+ ExpTypes.
-spec extract_exported_types(codeserver()) -> {codeserver(), set_ets()}.
diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl
index 2b296e1668..713e475b17 100644
--- a/lib/dialyzer/src/dialyzer_contracts.erl
+++ b/lib/dialyzer/src/dialyzer_contracts.erl
@@ -25,14 +25,26 @@
%% get_contract_signature/1,
is_overloaded/1,
process_contract_remote_types/1,
- store_tmp_contract/6]).
+ store_tmp_contract/6,
+ constraint_form_to_remote_modules/1]).
--export_type([file_contract/0, plt_contracts/0]).
+%% For dialyzer_worker.
+-export([process_contract_remote_types_module/2]).
+
+-export_type([file_contract/0, plt_contracts/0,
+ contract_remote_types_init_data/0,
+ contract_remote_types_result/0]).
%%-----------------------------------------------------------------------
-include("dialyzer.hrl").
+-type ext_types_message() :: {pid(), 'ext_types',
+ {mfa(), {file:filename(), erl_anno:location()}}}
+ | {'error', io_lib:chars()}.
+-type contract_remote_types_init_data() :: dialyzer_codeserver:codeserver().
+-type contract_remote_types_result() :: [ext_types_message()].
+
%%-----------------------------------------------------------------------
%% Types used in other parts of the system below
%%-----------------------------------------------------------------------
@@ -143,37 +155,78 @@ sequence([H|T], Delimiter) -> H ++ Delimiter ++ sequence(T, Delimiter).
dialyzer_codeserver:codeserver().
process_contract_remote_types(CodeServer) ->
- Mods = dialyzer_codeserver:all_temp_modules(CodeServer),
+ case dialyzer_codeserver:all_temp_modules(CodeServer) of
+ [] ->
+ CodeServer;
+ Mods ->
+ %% CodeServer is updated by each worker, but is still valid
+ %% after updates. Workers call
+ %% process_contract_remote_types_module/2 below.
+ Return =
+ dialyzer_coordinator:parallel_job(contract_remote_types,
+ Mods,
+ _InitData=CodeServer,
+ _Timing=none),
+ %% We need to pass on messages and thrown errors from erl_types:
+ _ = [self() ! {self(), ext_types, ExtType} ||
+ {_, ext_types, ExtType} <- Return],
+ case [Error || {error, _} = Error <- Return] of
+ [] ->
+ dialyzer_codeserver:finalize_contracts(CodeServer);
+ [Error | _] ->
+ throw(Error)
+ end
+ end.
+
+-spec process_contract_remote_types_module(module(),
+ dialyzer_codeserver:codeserver()) -> [ext_types_message()].
+
+process_contract_remote_types_module(ModuleName, CodeServer) ->
RecordTable = dialyzer_codeserver:get_records_table(CodeServer),
- ExpTypes = dialyzer_codeserver:get_exported_types(CodeServer),
- ModuleFun =
- fun(ModuleName) ->
- ContractFun =
- fun({MFA, {File, TmpContract, Xtra}}, C0) ->
- #tmp_contract{contract_funs = CFuns, forms = Forms} = TmpContract,
- {NewCs, C2} = lists:mapfoldl(fun(CFun, C1) ->
- CFun(ExpTypes, RecordTable, C1)
- end, C0, CFuns),
- Args = general_domain(NewCs),
- Contract = #contract{contracts = NewCs, args = Args, forms = Forms},
- {{MFA, {File, Contract, Xtra}}, C2}
- end,
- Cache = erl_types:cache__new(),
- {ContractMap, CallbackMap} =
- dialyzer_codeserver:get_temp_contracts(ModuleName, CodeServer),
- {NewContractList, Cache1} =
- lists:mapfoldl(ContractFun, Cache, maps:to_list(ContractMap)),
- {NewCallbackList, _NewCache} =
- lists:mapfoldl(ContractFun, Cache1, maps:to_list(CallbackMap)),
- dialyzer_codeserver:store_contracts(ModuleName,
- maps:from_list(NewContractList),
- maps:from_list(NewCallbackList),
- CodeServer)
+ ExpTypes = dialyzer_codeserver:get_exported_types_table(CodeServer),
+ ContractFun =
+ fun({MFA, {File, TmpContract, Xtra}}, C0) ->
+ #tmp_contract{contract_funs = CFuns, forms = Forms} = TmpContract,
+ {NewCs, C2} = lists:mapfoldl(fun(CFun, C1) ->
+ CFun(ExpTypes, RecordTable, C1)
+ end, C0, CFuns),
+ Args = general_domain(NewCs),
+ Contract = #contract{contracts = NewCs, args = Args, forms = Forms},
+ {{MFA, {File, Contract, Xtra}}, C2}
end,
- lists:foreach(ModuleFun, Mods),
- dialyzer_codeserver:finalize_contracts(CodeServer).
+ Cache = erl_types:cache__new(),
+ {ContractMap, CallbackMap} =
+ dialyzer_codeserver:get_temp_contracts(ModuleName, CodeServer),
+ try
+ {NewContractList, Cache1} =
+ lists:mapfoldl(ContractFun, Cache, maps:to_list(ContractMap)),
+ {NewCallbackList, _NewCache} =
+ lists:mapfoldl(ContractFun, Cache1, maps:to_list(CallbackMap)),
+ _NewCodeServer =
+ dialyzer_codeserver:store_contracts(ModuleName,
+ maps:from_list(NewContractList),
+ maps:from_list(NewCallbackList),
+ CodeServer),
+ rcv_ext_types()
+ catch
+ throw:{error, _}=Error ->
+ [Error] ++ rcv_ext_types()
+ end.
+
+rcv_ext_types() ->
+ Self = self(),
+ Self ! {Self, done},
+ rcv_ext_types(Self, []).
+
+rcv_ext_types(Self, ExtTypes) ->
+ receive
+ {Self, ext_types, _} = ExtType ->
+ rcv_ext_types(Self, [ExtType | ExtTypes]);
+ {Self, done} ->
+ lists:usort(ExtTypes)
+ end.
--type fun_types() :: orddict:orddict(label(), erl_types:type_table()).
+-type fun_types() :: orddict:orddict(label(), erl_types:erl_type()).
-spec check_contracts(orddict:orddict(mfa(), #contract{}),
dialyzer_callgraph:callgraph(), fun_types(),
@@ -846,13 +899,13 @@ overlapping_contract_warning({M, F, A}, WarningInfo) ->
extra_range_warning({M, F, A}, WarningInfo, ExtraRanges, STRange) ->
ERangesStr = erl_types:t_to_string(ExtraRanges),
STRangeStr = erl_types:t_to_string(STRange),
- {?WARN_CONTRACT_SUPERTYPE, WarningInfo,
+ {?WARN_CONTRACT_EXTRA_RETURN, WarningInfo,
{extra_range, [M, F, A, ERangesStr, STRangeStr]}}.
missing_range_warning({M, F, A}, WarningInfo, ExtraRanges, CRange) ->
ERangesStr = erl_types:t_to_string(ExtraRanges),
CRangeStr = erl_types:t_to_string(CRange),
- {?WARN_CONTRACT_SUBTYPE, WarningInfo,
+ {?WARN_CONTRACT_MISSING_RETURN, WarningInfo,
{missing_range, [M, F, A, ERangesStr, CRangeStr]}}.
picky_contract_check(CSig0, Sig0, MFA, WarningInfo, Contract, RecDict,
@@ -967,3 +1020,13 @@ blame_remote_list([CArg|CArgs], [NRArg|NRArgs], [SArg|SArgs], Opaques) ->
is_subtype(T1, T2, Opaques) ->
Inf = erl_types:t_inf(T1, T2, Opaques),
erl_types:t_is_equal(T1, Inf).
+
+-spec constraint_form_to_remote_modules(Constraint :: term()) -> [module()].
+
+constraint_form_to_remote_modules([]) ->
+ [];
+
+constraint_form_to_remote_modules([{type, _, constraint, [{atom, _, _}, Types]}|Rest]) ->
+ ModulesFromTypes = erl_types:type_form_to_remote_modules(Types),
+ ModulesFromSubsequentConstraints = constraint_form_to_remote_modules(Rest),
+ lists:usort(lists:append(ModulesFromTypes, ModulesFromSubsequentConstraints)).
diff --git a/lib/dialyzer/src/dialyzer_coordinator.erl b/lib/dialyzer/src/dialyzer_coordinator.erl
index 7c1bc1de5a..2ca3acc4cb 100644
--- a/lib/dialyzer/src/dialyzer_coordinator.erl
+++ b/lib/dialyzer/src/dialyzer_coordinator.erl
@@ -11,22 +11,21 @@
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
-
-%%%-------------------------------------------------------------------
-%%% File : dialyzer_coordinator.erl
-%%% Authors : Stavros Aronis <aronisstav@gmail.com>
-%%%-------------------------------------------------------------------
+%%
+%% Original author: Stavros Aronis <aronisstav@gmail.com>
+%%
+%% Purpose: Spawn and coordinate parallel jobs.
-module(dialyzer_coordinator).
%%% Export for dialyzer main process
-export([parallel_job/4]).
-%%% Export for all possible workers
--export([job_done/3]).
+%%% Exports for all workers
+-export([request_activation/1, job_done/3]).
%%% Exports for the typesig and dataflow analysis workers
--export([sccs_to_pids/2, request_activation/1]).
+-export([wait_for_success_typings/2]).
%%% Exports for the compilation workers
-export([get_next_label/2]).
@@ -37,40 +36,59 @@
-type collector() :: pid().
-type regulator() :: pid().
--type scc_to_pid() :: ets:tid() | 'unused'.
+-type scc_to_pid() :: ets:tid() | 'none'.
-opaque coordinator() :: {collector(), regulator(), scc_to_pid()}.
-type timing() :: dialyzer_timing:timing_server().
-type scc() :: [mfa_or_funlbl()].
--type mode() :: 'typesig' | 'dataflow' | 'compile' | 'warnings'.
+-type mode() :: 'typesig' | 'dataflow' | 'compile' | 'warnings' |
+ 'contract_remote_types' | 'record_remote_types'.
-type compile_job() :: file:filename().
-type typesig_job() :: scc().
-type dataflow_job() :: module().
-type warnings_job() :: module().
+-type contract_remote_types_job() :: module().
+-type record_remote_types_job() :: module().
--type job() :: compile_job() | typesig_job() | dataflow_job() | warnings_job().
+-type job() :: compile_job() | typesig_job() | dataflow_job() |
+ warnings_job() | contract_remote_types_job() |
+ record_remote_types_job().
-type compile_init_data() :: dialyzer_analysis_callgraph:compile_init_data().
-type typesig_init_data() :: dialyzer_succ_typings:typesig_init_data().
-type dataflow_init_data() :: dialyzer_succ_typings:dataflow_init_data().
-type warnings_init_data() :: dialyzer_succ_typings:warnings_init_data().
+-type contract_remote_types_init_data() ::
+ dialyzer_contracts:contract_remote_types_init_data().
+-type record_remote_types_init_data() ::
+ dialyzer_utils:record_remote_types_init_data().
-type compile_result() :: dialyzer_analysis_callgraph:compile_result().
-type typesig_result() :: [mfa_or_funlbl()].
-type dataflow_result() :: [mfa_or_funlbl()].
-type warnings_result() :: [dial_warning()].
+-type contract_remote_types_result() ::
+ dialyzer_contracts:contract_remote_types_result().
+-type record_remote_types_result() ::
+ dialyzer_utils:record_remote_types_result().
-type init_data() :: compile_init_data() | typesig_init_data() |
- dataflow_init_data() | warnings_init_data().
+ dataflow_init_data() | warnings_init_data() |
+ contract_remote_types_init_data() |
+ record_remote_types_init_data().
-type result() :: compile_result() | typesig_result() |
- dataflow_result() | warnings_result().
+ dataflow_result() | warnings_result() |
+ contract_remote_types_result() |
+ record_remote_types_result().
-type job_result() :: dialyzer_analysis_callgraph:one_file_mid_error() |
dialyzer_analysis_callgraph:one_file_result_ok() |
- typesig_result() | dataflow_result() | warnings_result().
+ typesig_result() | dataflow_result() |
+ warnings_result() | contract_remote_types_result() |
+ record_remote_types_result().
-record(state, {mode :: mode(),
active = 0 :: integer(),
@@ -86,6 +104,7 @@
-include("dialyzer.hrl").
%%--------------------------------------------------------------------
+%% API functions for the main dialyzer process.
-spec parallel_job('compile', [compile_job()], compile_init_data(), timing()) ->
{compile_result(), integer()};
@@ -94,76 +113,155 @@
('dataflow', [dataflow_job()], dataflow_init_data(),
timing()) -> dataflow_result();
('warnings', [warnings_job()], warnings_init_data(),
- timing()) -> warnings_result().
+ timing()) -> warnings_result();
+ ('contract_remote_types', [contract_remote_types_job()],
+ contract_remote_types_init_data(), timing()) ->
+ contract_remote_types_result();
+ ('record_remote_types', [record_remote_types_job()],
+ record_remote_types_init_data(), timing()) ->
+ record_remote_types_result().
parallel_job(Mode, Jobs, InitData, Timing) ->
State = spawn_jobs(Mode, Jobs, InitData, Timing),
collect_result(State).
+%%--------------------------------------------------------------------
+%% API functions for workers (dialyzer_worker).
+
+-spec request_activation(coordinator()) -> ok.
+
+request_activation({_Collector, Regulator, _SCCtoPid}) ->
+ Regulator ! {req, self()},
+ wait_activation().
+
+-spec job_done(job(), job_result(), coordinator()) -> ok.
+
+job_done(Job, Result, {Collector, Regulator, _SCCtoPid}) ->
+ Regulator ! done,
+ Collector ! {done, Job, Result},
+ ok.
+
+-spec get_next_label(integer(), coordinator()) -> integer().
+
+%% For the 'compile' worker.
+get_next_label(EstimatedSize, {Collector, _Regulator, _SCCtoPid}) ->
+ Collector ! {next_label_request, EstimatedSize, self()},
+ receive
+ {next_label_reply, NextLabel} -> NextLabel
+ end.
+
+-spec wait_for_success_typings([scc() | module()], coordinator()) ->
+ 'ok'.
+
+%% Helper for 'sigtype' and 'dataflow' workers.
+wait_for_success_typings(SCCs, {_Collector, _Regulator, SCCtoPid}) ->
+ F = fun(SCC) ->
+ %% The SCCs that SCC depends on have always been started.
+ try ets:lookup_element(SCCtoPid, SCC, 2) of
+ Pid when is_pid(Pid) ->
+ Ref = erlang:monitor(process, Pid),
+ receive
+ {'DOWN', Ref, process, Pid, _Info} ->
+ ok
+ end
+ catch
+ _:_ ->
+ %% Already finished.
+ ok
+ end
+ end,
+ lists:foreach(F, SCCs).
+
+
+%%--------------------------------------------------------------------
+%% Local functions.
+
spawn_jobs(Mode, Jobs, InitData, Timing) ->
Collector = self(),
Regulator = spawn_regulator(),
- TypesigOrDataflow = (Mode =:= 'typesig') orelse (Mode =:= 'dataflow'),
- SCCtoPID =
- case TypesigOrDataflow of
- true -> ets:new(scc_to_pid, [{read_concurrency, true}]);
- false -> unused
- end,
- Coordinator = {Collector, Regulator, SCCtoPID},
- JobFun =
- fun(Job) ->
- Pid = dialyzer_worker:launch(Mode, Job, InitData, Coordinator),
- case TypesigOrDataflow of
- true -> true = ets:insert(SCCtoPID, {Job, Pid});
- false -> true
- end
+
+ SCCtoPid =
+ if
+ Mode =:= 'typesig'; Mode =:= 'dataflow' ->
+ ets:new(scc_to_pid, [{read_concurrency, true}]);
+ true ->
+ none
end,
- JobCount = length(Jobs),
- NumberOfInitJobs = min(JobCount, 20 * dialyzer_utils:parallelism()),
- {InitJobs, RestJobs} = lists:split(NumberOfInitJobs, Jobs),
- lists:foreach(JobFun, InitJobs),
+
+ Coordinator = {Collector, Regulator, SCCtoPid},
+
+ JobFun = job_fun(SCCtoPid, Mode, InitData, Coordinator),
+
+ %% Limit the number of processes we start in order to save memory.
+ MaxNumberOfInitJobs = 20 * dialyzer_utils:parallelism(),
+ RestJobs = launch_jobs(Jobs, JobFun, MaxNumberOfInitJobs),
+
Unit =
case Mode of
'typesig' -> "SCCs";
_ -> "modules"
end,
+ JobCount = length(Jobs),
dialyzer_timing:send_size_info(Timing, JobCount, Unit),
+
InitResult =
case Mode of
'compile' -> dialyzer_analysis_callgraph:compile_init_result();
_ -> []
end,
+
#state{mode = Mode, active = JobCount, result = InitResult,
next_label = 0, job_fun = JobFun, jobs = RestJobs,
- init_data = InitData, regulator = Regulator, scc_to_pid = SCCtoPID}.
+ init_data = InitData, regulator = Regulator, scc_to_pid = SCCtoPid}.
+
+launch_jobs(Jobs, _JobFun, 0) ->
+ Jobs;
+launch_jobs([Job|Jobs], JobFun, N) ->
+ JobFun(Job),
+ launch_jobs(Jobs, JobFun, N - 1);
+launch_jobs([], _JobFun, _) ->
+ [].
+
+job_fun(none, Mode, InitData, Coordinator) ->
+ fun(Job) ->
+ _ = dialyzer_worker:launch(Mode, Job, InitData, Coordinator),
+ ok
+ end;
+job_fun(SCCtoPid, Mode, InitData, Coordinator) ->
+ fun(Job) ->
+ Pid = dialyzer_worker:launch(Mode, Job, InitData, Coordinator),
+ true = ets:insert(SCCtoPid, {Job, Pid}),
+ ok
+ end.
collect_result(#state{mode = Mode, active = Active, result = Result,
next_label = NextLabel, init_data = InitData,
jobs = JobsLeft, job_fun = JobFun,
- regulator = Regulator, scc_to_pid = SCCtoPID} = State) ->
+ regulator = Regulator, scc_to_pid = SCCtoPid} = State) ->
receive
{next_label_request, Estimation, Pid} ->
Pid ! {next_label_reply, NextLabel},
collect_result(State#state{next_label = NextLabel + Estimation});
{done, Job, Data} ->
NewResult = update_result(Mode, InitData, Job, Data, Result),
- TypesigOrDataflow = (Mode =:= 'typesig') orelse (Mode =:= 'dataflow'),
case Active of
1 ->
+ %% This was the last running job. Clean up and return the result.
kill_regulator(Regulator),
case Mode of
'compile' ->
{NewResult, NextLabel};
- _ when TypesigOrDataflow ->
- ets:delete(SCCtoPID),
- NewResult;
- 'warnings' ->
+ _ ->
+ if
+ SCCtoPid =:= none -> ok;
+ true -> ets:delete(SCCtoPid)
+ end,
NewResult
end;
N ->
- case TypesigOrDataflow of
- true -> true = ets:delete(SCCtoPID, Job);
- false -> true
+ if
+ SCCtoPid =:= none -> ok;
+ true -> true = ets:delete(SCCtoPid, Job)
end,
NewJobsLeft =
case JobsLeft of
@@ -180,46 +278,23 @@ collect_result(#state{mode = Mode, active = Active, result = Result,
end.
update_result(Mode, InitData, Job, Data, Result) ->
- case Mode of
- 'compile' ->
+ if
+ Mode =:= 'compile' ->
dialyzer_analysis_callgraph:add_to_result(Job, Data, Result,
InitData);
- X when X =:= 'typesig'; X =:= 'dataflow' ->
- dialyzer_succ_typings:lookup_names(Data, InitData) ++ Result;
- 'warnings' ->
+ Mode =:= 'typesig'; Mode =:= 'dataflow' ->
+ dialyzer_succ_typings:add_to_result(Data, Result, InitData);
+ true ->
Data ++ Result
end.
--spec sccs_to_pids([scc() | module()], coordinator()) ->
- [dialyzer_worker:worker()].
-
-sccs_to_pids(SCCs, {_Collector, _Regulator, SCCtoPID}) ->
- Fold =
- fun(SCC, Pids) ->
- %% The SCCs that SCC depends on have always been started.
- try ets:lookup_element(SCCtoPID, SCC, 2) of
- Pid when is_pid(Pid) ->
- [Pid|Pids]
- catch
- _:_ -> Pids
- end
- end,
- lists:foldl(Fold, [], SCCs).
-
--spec job_done(job(), job_result(), coordinator()) -> ok.
-
-job_done(Job, Result, {Collector, Regulator, _SCCtoPID}) ->
- Regulator ! done,
- Collector ! {done, Job, Result},
- ok.
-
--spec get_next_label(integer(), coordinator()) -> integer().
-
-get_next_label(EstimatedSize, {Collector, _Regulator, _SCCtoPID}) ->
- Collector ! {next_label_request, EstimatedSize, self()},
- receive
- {next_label_reply, NextLabel} -> NextLabel
- end.
+%%--------------------------------------------------------------------
+%% The regulator server
+%%
+%% The regulator limits the number of simultaneous running jobs to the
+%% number of schedulers. Note that there are usually many more worker
+%% processes started, but they are only allowed to do light work (such
+%% as monitoring other processes) when they have not been activated.
-spec wait_activation() -> ok.
@@ -229,12 +304,6 @@ wait_activation() ->
activate_pid(Pid) ->
Pid ! activate.
--spec request_activation(coordinator()) -> ok.
-
-request_activation({_Collector, Regulator, _SCCtoPID}) ->
- Regulator ! {req, self()},
- wait_activation().
-
spawn_regulator() ->
InitTickets = dialyzer_utils:parallelism(),
spawn_link(fun() -> regulator_loop(InitTickets, queue:new()) end).
@@ -250,15 +319,13 @@ regulator_loop(Tickets, Queue) ->
regulator_loop(N-1, Queue)
end;
done ->
- {Waiting, NewQueue} = queue:out(Queue),
- NewTickets =
- case Waiting of
- empty -> Tickets + 1;
- {value, Pid} ->
- activate_pid(Pid),
- Tickets
- end,
- regulator_loop(NewTickets, NewQueue);
+ case queue:out(Queue) of
+ {empty, NewQueue} ->
+ regulator_loop(Tickets + 1, NewQueue);
+ {{value, Pid}, NewQueue} ->
+ activate_pid(Pid),
+ regulator_loop(Tickets, NewQueue)
+ end;
stop -> ok
end.
diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl
index 2323889a51..206e93a177 100644
--- a/lib/dialyzer/src/dialyzer_dataflow.erl
+++ b/lib/dialyzer/src/dialyzer_dataflow.erl
@@ -24,16 +24,6 @@
-export([get_fun_types/5, get_warnings/5, format_args/3]).
-%% Data structure interfaces.
--export([state__add_warning/2, state__cleanup/1,
- state__duplicate/1, dispose_state/1,
- state__get_callgraph/1, state__get_races/1,
- state__get_records/1, state__put_callgraph/2,
- state__put_races/2, state__records_only/1,
- state__find_function/2]).
-
--export_type([state/0]).
-
-include("dialyzer.hrl").
-import(erl_types,
@@ -85,37 +75,23 @@
-type curr_fun() :: 'undefined' | 'top' | mfa_or_funlbl().
--define(no_arg, no_arg).
-
-define(TYPE_LIMIT, 3).
-define(BITS, 128).
-%% Types with comment 'race' are due to dialyzer_races.erl.
--record(state, {callgraph :: dialyzer_callgraph:callgraph()
- | 'undefined', % race
- codeserver :: dialyzer_codeserver:codeserver()
- | 'undefined', % race
- envs :: env_tab()
- | 'undefined', % race
- fun_tab :: fun_tab()
- | 'undefined', % race
- fun_homes :: dict:dict(label(), mfa())
- | 'undefined', % race
- reachable_funs :: sets:set(label())
- | 'undefined', % race
- plt :: dialyzer_plt:plt()
- | 'undefined', % race
- opaques :: [type()]
- | 'undefined', % race
- races = dialyzer_races:new() :: dialyzer_races:races(),
+-record(state, {callgraph :: dialyzer_callgraph:callgraph(),
+ codeserver :: dialyzer_codeserver:codeserver(),
+ envs :: env_tab(),
+ fun_tab :: fun_tab(),
+ fun_homes :: dict:dict(label(), mfa()),
+ reachable_funs :: sets:set(label()),
+ plt :: dialyzer_plt:plt(),
+ opaques :: [type()],
records = dict:new() :: types(),
- tree_map :: dict:dict(label(), cerl:cerl())
- | 'undefined', % race
+ tree_map :: dict:dict(label(), cerl:cerl()),
warning_mode = false :: boolean(),
warnings = [] :: [raw_warning()],
- work :: {[_], [_], sets:set()}
- | 'undefined', % race
+ work :: {[_], [_], sets:set()},
module :: module(),
curr_fun :: curr_fun()
}).
@@ -134,9 +110,7 @@
-type type_tab() :: #{key() => type()}.
-type subst_tab() :: #{key() => cerl:cerl()}.
-%% Exported Types
-
--opaque state() :: #state{}.
+-type state() :: #state{}.
%%--------------------------------------------------------------------
@@ -151,8 +125,7 @@
get_warnings(Tree, Plt, Callgraph, Codeserver, Records) ->
State1 = analyze_module(Tree, Plt, Callgraph, Codeserver, Records, true),
State2 = state__renew_warnings(state__get_warnings(State1), State1),
- State3 = state__get_race_warnings(State2),
- {State3#state.warnings, state__all_fun_types(State3)}.
+ {State2#state.warnings, state__all_fun_types(State2)}.
-spec get_fun_types(cerl:c_module(), dialyzer_plt:plt(),
dialyzer_callgraph:callgraph(),
@@ -174,15 +147,13 @@ analyze_module(Tree, Plt, Callgraph, Codeserver, Records, GetWarnings) ->
Module = cerl:atom_val(cerl:module_name(Tree)),
TopFun = cerl:ann_c_fun([{label, top}], [], Tree),
State = state__new(Callgraph, Codeserver, TopFun, Plt, Module, Records),
- State1 = state__race_analysis(not GetWarnings, State),
- State2 = analyze_loop(State1),
+ State1 = analyze_loop(State),
case GetWarnings of
true ->
- State3 = state__set_warning_mode(State2),
- State4 = analyze_loop(State3),
- dialyzer_races:race(State4);
+ State2 = state__set_warning_mode(State1),
+ analyze_loop(State2);
false ->
- State2
+ State1
end.
analyze_loop(State) ->
@@ -211,32 +182,16 @@ analyze_loop(State) ->
Vars = cerl:fun_vars(Fun),
Map1 = enter_type_lists(Vars, ArgTypes, Map),
Body = cerl:fun_body(Fun),
- FunLabel = get_label(Fun),
- IsRaceAnalysisEnabled = is_race_analysis_enabled(State),
- NewState3 =
- case IsRaceAnalysisEnabled of
- true ->
- NewState2 = state__renew_curr_fun(
- state__lookup_name(FunLabel, NewState1), FunLabel,
- NewState1),
- state__renew_race_list([], 0, NewState2);
- false -> NewState1
- end,
- {NewState4, _Map2, BodyType} =
- traverse(Body, Map1, NewState3),
+ {NewState2, _Map2, BodyType} =
+ traverse(Body, Map1, NewState1),
?debug("Done analyzing: ~w:~ts\n",
[NewState1#state.curr_fun,
t_to_string(t_fun(ArgTypes, BodyType))]),
- NewState5 =
- case IsRaceAnalysisEnabled of
- true -> renew_race_code(NewState4);
- false -> NewState4
- end,
- NewState6 =
- state__update_fun_entry(Fun, ArgTypes, BodyType, NewState5),
+ NewState3 =
+ state__update_fun_entry(Fun, ArgTypes, BodyType, NewState2),
?debug("done adding stuff for ~tw\n",
[state__lookup_name(get_label(Fun), State)]),
- analyze_loop(NewState6)
+ analyze_loop(NewState3)
end
end
end.
@@ -295,41 +250,8 @@ traverse(Tree, Map, State) ->
literal ->
Type = literal_type(Tree),
{State, Map, Type};
- module ->
- handle_module(Tree, Map, State);
primop ->
- case cerl:atom_val(cerl:primop_name(Tree)) of
- match_fail ->
- {State, Map, t_none()};
- raise ->
- {State, Map, t_none()};
- bs_init_writable ->
- {State, Map, t_from_term(<<>>)};
- build_stacktrace ->
- {State, Map, erl_bif_types:type(erlang, build_stacktrace, 0)};
- dialyzer_unknown ->
- {State, Map, t_any()};
- recv_peek_message ->
- {State, Map, t_product([t_boolean(), t_any()])};
- recv_wait_timeout ->
- [Arg] = cerl:primop_args(Tree),
- {State1, Map1, TimeoutType} = traverse(Arg, Map, State),
- Opaques = State1#state.opaques,
- case t_is_atom(TimeoutType, Opaques) andalso
- t_atom_vals(TimeoutType, Opaques) =:= ['infinity'] of
- true ->
- {State1, Map1, t_boolean()};
- false ->
- {State1, Map1, t_boolean()}
- end;
- remove_message ->
- {State, Map, t_any()};
- timeout ->
- {State, Map, t_any()};
- Other -> erlang:error({'Unsupported primop', Other})
- end;
- 'receive' ->
- handle_receive(Tree, Map, State);
+ handle_primop(Tree, Map, State);
seq ->
Arg = cerl:seq_arg(Tree),
Body = cerl:seq_body(Tree),
@@ -338,20 +260,7 @@ traverse(Tree, Map, State) ->
true ->
SMA;
false ->
- State2 =
- case
- t_is_any(ArgType)
- orelse t_is_simple(ArgType, State)
- orelse is_call_to_send(Arg)
- orelse is_lc_simple_list(Arg, ArgType, State)
- of
- true -> % do not warn in these cases
- State1;
- false ->
- state__add_warning(State1, ?WARN_UNMATCHED_RETURN, Arg,
- {unmatched_return,
- [format_type(ArgType, State1)]})
- end,
+ State2 = maybe_warn_unmatched_return(Arg, ArgType, State1),
traverse(Body, Map1, State2)
end;
'try' ->
@@ -386,6 +295,27 @@ traverse_list([Tree|Tail], Map, State, Acc) ->
traverse_list([], Map, State, Acc) ->
{State, Map, lists:reverse(Acc)}.
+maybe_warn_unmatched_return(Arg, ArgType, State) ->
+ case state__warning_mode(State) of
+ false ->
+ State;
+ true ->
+ %% Warn when return values such as 'ok' | {'error',any()}
+ %% are ignored. Don't warn when a single value such as 'ok'
+ %% is returned.
+ case t_is_any(ArgType) orelse
+ t_is_simple(ArgType, State) orelse
+ is_call_to_send(Arg) orelse
+ is_lc_simple_list(Arg, ArgType, State) of
+ true ->
+ State;
+ false ->
+ state__add_warning(State, ?WARN_UNMATCHED_RETURN, Arg,
+ {unmatched_return,
+ [format_type(ArgType, State)]})
+ end
+ end.
+
%%________________________________________
%%
%% Special instructions
@@ -550,16 +480,6 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
?debug("ContrRet: ~ts\n", [erl_types:t_to_string(ContrRet)]),
?debug("LocalRet: ~ts\n", [erl_types:t_to_string(LocalRet)]),
- State1 =
- case is_race_analysis_enabled(State) of
- true ->
- Ann = cerl:get_ann(Tree),
- File = get_file(Ann, State),
- Location = get_location(Tree),
- dialyzer_races:store_race_call(Fun, ArgTypes, Args,
- {File, Location}, State);
- false -> State
- end,
FailedConj = any_none([RetWithoutLocal|NewArgTypes]),
IsFailBif = t_is_none(BifRange(BifArgs)),
IsFailSig = t_is_none(SigRange),
@@ -581,7 +501,7 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
%% This Msg will be post_processed by dialyzer_succ_typings
Msg =
{contract_range, [Contract, M1, F1, A1, ArgStrings, CRet]},
- state__add_warning(State1, ?WARN_CONTRACT_RANGE, Tree, Msg);
+ state__add_warning(State, ?WARN_CONTRACT_RANGE, Tree, Msg);
false ->
FailedSig = any_none(NewArgsSig),
FailedContract =
@@ -592,7 +512,7 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
FailReason =
apply_fail_reason(FailedSig, FailedBif, FailedContract),
Msg = get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes, InfSig,
- Contr, CArgs, State1, FailReason, Opaques),
+ Contr, CArgs, State, FailReason, Opaques),
WarnType = case Msg of
{call, _} -> ?WARN_FAILING_CALL;
{apply, _} -> ?WARN_FAILING_CALL;
@@ -614,9 +534,9 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
Tree
end,
Frc = {erlang, is_record, 3} =:= state__lookup_name(Fun, State),
- state__add_warning(State1, WarnType, LocTree, Msg, Frc)
+ state__add_warning(State, WarnType, LocTree, Msg, Frc)
end;
- false -> State1
+ false -> State
end,
State3 =
case TypeOfApply of
@@ -767,17 +687,17 @@ find_unknown(ContractOrSigList, ArgTypes, Opaques, NoneArgNs) ->
is_opaque_type_test_problem(Fun, Args, ArgTypes, State) ->
case Fun of
- {erlang, FN, 1} when FN =:= is_atom; FN =:= is_boolean;
- FN =:= is_binary; FN =:= is_bitstring;
- FN =:= is_float; FN =:= is_function;
- FN =:= is_integer; FN =:= is_list;
- FN =:= is_number; FN =:= is_pid; FN =:= is_port;
- FN =:= is_reference; FN =:= is_tuple;
- FN =:= is_map ->
- type_test_opaque_arg(Args, ArgTypes, State#state.opaques);
{erlang, FN, 2} when FN =:= is_function ->
type_test_opaque_arg(Args, ArgTypes, State#state.opaques);
- _ -> no
+ {erlang, FN, 1} ->
+ case t_is_any(type_test_type(FN, 1)) of
+ true ->
+ no;
+ false ->
+ type_test_opaque_arg(Args, ArgTypes, State#state.opaques)
+ end;
+ _ ->
+ no
end.
type_test_opaque_arg([], [], _Opaques) ->
@@ -857,7 +777,7 @@ handle_bitstr(Tree, Map, State) ->
{State1, Map1, SizeType0} = traverse(Size, Map, State),
{State2, Map2, ValType0} = traverse(Val, Map1, State1),
case cerl:bitstr_bitsize(Tree) of
- BitSz when BitSz =:= all orelse BitSz =:= utf ->
+ BitSz when BitSz =:= all; BitSz =:= utf ->
ValType =
case BitSz of
all ->
@@ -878,7 +798,7 @@ handle_bitstr(Tree, Map, State) ->
false ->
{State2, Map3, t_bitstr()}
end;
- BitSz when is_integer(BitSz) orelse BitSz =:= any ->
+ BitSz when is_integer(BitSz); BitSz =:= any ->
SizeType = t_inf(SizeType0, t_non_neg_integer()),
ValType =
case BitstrType of
@@ -1007,26 +927,15 @@ handle_case(Tree, Map, State) ->
case t_is_none_or_unit(ArgType) of
true -> SMA;
false ->
- State2 =
- case is_race_analysis_enabled(State) of
- true ->
- {RaceList, RaceListSize} = get_race_list_and_size(State1),
- state__renew_race_list([beg_case|RaceList],
- RaceListSize + 1, State1);
- false -> State1
- end,
Map2 = join_maps_begin(Map1),
{MapList, State3, Type, Warns} =
- handle_clauses(Clauses, Arg, ArgType, ArgType, State2,
- [], Map2, [], [], []),
+ handle_clauses(Clauses, Arg, ArgType, Map2, State1),
%% Non-Erlang BEAM languages, such as Elixir, expand language constructs
%% into case statements. In that case, we do not want to warn on
%% individual clauses not matching unless none of them can.
- SupressForced = is_compiler_generated(cerl:get_ann(Tree))
- andalso not (t_is_none(Type)),
+ DoForce = not is_compiler_generated(cerl:get_ann(Tree)) orelse t_is_none(Type),
State4 = lists:foldl(fun({T,R,M,F}, S) ->
- state__add_warning(
- S,T,R,M,F andalso (not SupressForced))
+ state__add_warning(S, T, R, M, F andalso DoForce)
end, State3, Warns),
Map3 = join_maps_end(MapList, Map2),
debug_pp_map(Map3),
@@ -1054,99 +963,55 @@ handle_cons(Tree, Map, State) ->
%%----------------------------------------
handle_let(Tree, Map, State) ->
- IsRaceAnalysisEnabled = is_race_analysis_enabled(State),
Arg = cerl:let_arg(Tree),
Vars = cerl:let_vars(Tree),
{Map0, State0} =
case cerl:is_c_var(Arg) of
true ->
[Var] = Vars,
- {enter_subst(Var, Arg, Map),
- case IsRaceAnalysisEnabled of
- true ->
- {RaceList, RaceListSize} = get_race_list_and_size(State),
- state__renew_race_list(
- [dialyzer_races:let_tag_new(Var, Arg)|RaceList],
- RaceListSize + 1, State);
- false -> State
- end};
+ {enter_subst(Var, Arg, Map), State};
false -> {Map, State}
end,
Body = cerl:let_body(Tree),
{State1, Map1, ArgTypes} = SMA = traverse(Arg, Map0, State0),
- State2 =
- case IsRaceAnalysisEnabled andalso cerl:is_c_call(Arg) of
- true ->
- Mod = cerl:call_module(Arg),
- Name = cerl:call_name(Arg),
- case cerl:is_literal(Mod) andalso
- cerl:concrete(Mod) =:= ets andalso
- cerl:is_literal(Name) andalso
- cerl:concrete(Name) =:= new of
- true -> renew_race_public_tables(Vars, State1);
- false -> State1
- end;
- false -> State1
- end,
case t_is_none_or_unit(ArgTypes) of
true -> SMA;
false ->
Map2 = enter_type_lists(Vars, t_to_tlist(ArgTypes), Map1),
- traverse(Body, Map2, State2)
+ traverse(Body, Map2, State1)
end.
%%----------------------------------------
-handle_module(Tree, Map, State) ->
- %% By not including the variables in scope we can assure that we
- %% will get the current function type when using the variables.
- Defs = cerl:module_defs(Tree),
- PartFun = fun({_Var, Fun}) ->
- state__is_escaping(get_label(Fun), State)
- end,
- {Defs1, Defs2} = lists:partition(PartFun, Defs),
- Letrec = cerl:c_letrec(Defs1, cerl:c_int(42)),
- {State1, Map1, _FunTypes} = traverse(Letrec, Map, State),
- %% Also add environments for the other top-level functions.
- VarTypes = [{Var, state__fun_type(Fun, State1)} || {Var, Fun} <- Defs],
- EnvMap = enter_type_list(VarTypes, Map),
- FoldFun = fun({_Var, Fun}, AccState) ->
- state__update_fun_env(Fun, EnvMap, AccState)
- end,
- State2 = lists:foldl(FoldFun, State1, Defs2),
- {State2, Map1, t_any()}.
-
-%%----------------------------------------
-
-handle_receive(Tree, Map, State) ->
- Clauses = cerl:receive_clauses(Tree),
- Timeout = cerl:receive_timeout(Tree),
- State1 =
- case is_race_analysis_enabled(State) of
- true ->
- {RaceList, RaceListSize} = get_race_list_and_size(State),
- state__renew_race_list([beg_case|RaceList],
- RaceListSize + 1, State);
- false -> State
- end,
- {MapList, State2, ReceiveType, Warns} =
- handle_clauses(Clauses, ?no_arg, t_any(), t_any(), State1, [], Map,
- [], [], []),
- State3 = lists:foldl(fun({T,R,M,F}, S) -> state__add_warning(S,T,R,M,F) end,
- State2, Warns),
- Map1 = join_maps(MapList, Map),
- {State4, Map2, TimeoutType} = traverse(Timeout, Map1, State3),
- Opaques = State4#state.opaques,
- case (t_is_atom(TimeoutType, Opaques) andalso
- (t_atom_vals(TimeoutType, Opaques) =:= ['infinity'])) of
- true ->
- {State4, Map2, ReceiveType};
- false ->
- Action = cerl:receive_action(Tree),
- {State5, Map3, ActionType} = traverse(Action, Map, State4),
- Map4 = join_maps([Map3, Map1], Map),
- Type = t_sup(ReceiveType, ActionType),
- {State5, Map4, Type}
+handle_primop(Tree, Map, State) ->
+ case cerl:atom_val(cerl:primop_name(Tree)) of
+ match_fail ->
+ {State, Map, t_none()};
+ raise ->
+ {State, Map, t_none()};
+ bs_init_writable ->
+ {State, Map, t_from_term(<<>>)};
+ build_stacktrace ->
+ {State, Map, erl_bif_types:type(erlang, build_stacktrace, 0)};
+ dialyzer_unknown ->
+ {State, Map, t_any()};
+ recv_peek_message ->
+ {State, Map, t_product([t_boolean(), t_any()])};
+ recv_wait_timeout ->
+ [Arg] = cerl:primop_args(Tree),
+ {State1, Map1, TimeoutType} = traverse(Arg, Map, State),
+ Opaques = State1#state.opaques,
+ case t_is_atom(TimeoutType, Opaques) andalso
+ t_atom_vals(TimeoutType, Opaques) =:= ['infinity'] of
+ true ->
+ {State1, Map1, t_boolean()};
+ false ->
+ {State1, Map1, t_boolean()}
+ end;
+ remove_message ->
+ {State, Map, t_any()};
+ Other ->
+ error({'Unsupported primop', Other})
end.
%%----------------------------------------
@@ -1165,14 +1030,14 @@ handle_try(Tree, Map, State) ->
true ->
Map2 = mark_as_fresh(Vars, Map1),
{SuccState, SuccMap, SuccType} =
- case bind_pat_vars(Vars, TypeList, [], Map2, State1) of
+ case bind_pat_vars(Vars, TypeList, Map2, State1) of
{error, _, _, _, _} ->
{State1, map__new(), t_none()};
{SuccMap1, VarTypes} ->
%% Try to bind the argument. Will only succeed if
%% it is a simple structured term.
SuccMap2 =
- case bind_pat_vars_reverse([Arg], [t_product(VarTypes)], [],
+ case bind_pat_vars_reverse([Arg], [t_product(VarTypes)],
SuccMap1, State1) of
{error, _, _, _, _} -> SuccMap1;
{SM, _} -> SM
@@ -1208,7 +1073,7 @@ handle_map(Tree,Map,State) ->
try lists:foldl(InsertPair, ArgType1, TypePairs)
of ResT ->
BindT = t_map([{K, t_any()} || K <- ExactKeys]),
- case bind_pat_vars_reverse([Arg], [BindT], [], Map2, State2) of
+ case bind_pat_vars_reverse([Arg], [BindT], Map2, State2) of
{error, _, _, _, _} -> {State2, Map2, ResT};
{Map3, _} -> {State2, Map3, ResT}
end
@@ -1269,7 +1134,7 @@ handle_tuple(Tree, Map, State) ->
{State2, Map1, t_none()};
false ->
case bind_pat_vars(Elements, t_tuple_args(RecType),
- [], Map1, State1) of
+ Map1, State1) of
{error, bind, ErrorPat, ErrorType, _} ->
Msg = {record_constr,
[TagVal, format_patterns(ErrorPat),
@@ -1322,229 +1187,203 @@ field_name(Elements, ErrorPat, FieldNames) ->
%%----------------------------------------
%% Clauses
%%
-handle_clauses([C|Left], Arg, ArgType, OrigArgType, State, CaseTypes, MapIn,
- Acc, ClauseAcc, WarnAcc0) ->
- IsRaceAnalysisEnabled = is_race_analysis_enabled(State),
- State1 =
- case IsRaceAnalysisEnabled of
- true ->
- {RaceList, RaceListSize} = get_race_list_and_size(State),
- state__renew_race_list(
- [dialyzer_races:beg_clause_new(Arg, cerl:clause_pats(C),
- cerl:clause_guard(C))|
- RaceList], RaceListSize + 1,
- State);
- false -> State
- end,
- {State2, ClauseMap, BodyType, NewArgType, WarnAcc} =
- do_clause(C, Arg, ArgType, OrigArgType, MapIn, State1, WarnAcc0),
- {NewClauseAcc, State3} =
- case IsRaceAnalysisEnabled of
- true ->
- {RaceList1, RaceListSize1} = get_race_list_and_size(State2),
- EndClause = dialyzer_races:end_clause_new(Arg, cerl:clause_pats(C),
- cerl:clause_guard(C)),
- {[EndClause|ClauseAcc],
- state__renew_race_list([EndClause|RaceList1],
- RaceListSize1 + 1, State2)};
- false -> {ClauseAcc, State2}
- end,
- {NewCaseTypes, NewAcc} =
- case t_is_none(BodyType) of
- true -> {CaseTypes, Acc};
- false -> {[BodyType|CaseTypes], [ClauseMap|Acc]}
- end,
- handle_clauses(Left, Arg, NewArgType, OrigArgType, State3,
- NewCaseTypes, MapIn, NewAcc, NewClauseAcc, WarnAcc);
-handle_clauses([], _Arg, _ArgType, _OrigArgType, State, CaseTypes, _MapIn, Acc,
- ClauseAcc, WarnAcc) ->
- State1 =
- case is_race_analysis_enabled(State) of
- true ->
- {RaceList, RaceListSize} = get_race_list_and_size(State),
- state__renew_race_list(
- [dialyzer_races:end_case_new(ClauseAcc)|RaceList],
- RaceListSize + 1, State);
- false -> State
- end,
- {lists:reverse(Acc), State1, t_sup(CaseTypes), WarnAcc}.
-do_clause(C, Arg, ArgType0, OrigArgType, Map, State, Warns) ->
+handle_clauses(Cs, Arg, ArgType, Map, State) ->
+ handle_clauses(Cs, Arg, ArgType, ArgType, Map, State, [], [], []).
+
+handle_clauses([C|Cs], Arg, ArgType, OrigArgType, MapIn, State,
+ CaseTypes, Acc, WarnAcc0) ->
+ {State1, ClauseMap, BodyType, NewArgType, WarnAcc} =
+ do_clause(C, Arg, ArgType, OrigArgType, MapIn, State, WarnAcc0),
+ case t_is_none(BodyType) of
+ true ->
+ handle_clauses(Cs, Arg, NewArgType, OrigArgType, MapIn, State1,
+ CaseTypes, Acc, WarnAcc);
+ false ->
+ handle_clauses(Cs, Arg, NewArgType, OrigArgType, MapIn, State1,
+ [BodyType|CaseTypes], [ClauseMap|Acc], WarnAcc)
+ end;
+handle_clauses([], _Arg, _ArgType, _OrigArgType, _MapIn, State,
+ CaseTypes, Acc, WarnAcc) ->
+ {lists:reverse(Acc), State, t_sup(CaseTypes), WarnAcc}.
+
+%%
+%% Process one clause.
+%%
+%% ArgType is the current type of the case argument; the types for
+%% all previously matched clauses have been subtracted from it.
+%%
+%% OrigArgType is the original type of the case argument. We need it
+%% to produce better warnings when a clause does not match.
+%%
+do_clause(C, Arg, ArgType, OrigArgType, Map, State, Warns) ->
Pats = cerl:clause_pats(C),
- Guard = cerl:clause_guard(C),
- Body = cerl:clause_body(C),
- State1 =
- case is_race_analysis_enabled(State) of
- true ->
- state__renew_fun_args(Pats, State);
- false -> State
- end,
Map0 = mark_as_fresh(Pats, Map),
- Map1 = if Arg =:= ?no_arg -> Map0;
- true -> bind_subst(Arg, Pats, Map0)
- end,
+ Map1 = bind_subst(Arg, Pats, Map0),
+
+ %% Try to bind the pattern to the case argument.
BindRes =
- case t_is_none(ArgType0) of
+ case t_is_none(ArgType) of
true ->
- {error, bind, Pats, ArgType0, ArgType0};
+ {error, maybe_covered, OrigArgType, ignore, ignore};
false ->
- ArgTypes =
- case t_is_any(ArgType0) of
- true -> [ArgType0 || _ <- Pats];
- false -> t_to_tlist(ArgType0)
- end,
- bind_pat_vars(Pats, ArgTypes, [], Map1, State1)
+ ArgTypes = get_arg_list(ArgType, Pats),
+ bind_pat_vars(Pats, ArgTypes, Map1, State)
end,
+
+ %% Test whether the binding succeeded.
case BindRes of
- {error, ErrorType, NewPats, Type, OpaqueTerm} ->
+ {error, _ErrorType, _NewPats, _Type, _OpaqueTerm} ->
?debug("Failed binding pattern: ~ts\nto ~ts\n",
- [cerl_prettypr:format(C), format_type(ArgType0, State1)]),
- case state__warning_mode(State1) of
- false ->
- {State1, Map, t_none(), ArgType0, Warns};
- true ->
- {Msg, Force} =
- case t_is_none(ArgType0) of
- true ->
- %% See if this is covered by an earlier clause or if it
- %% simply cannot match
- OrigArgTypes =
- case t_is_any(OrigArgType) of
- true -> Any = t_any(), [Any || _ <- Pats];
- false -> t_to_tlist(OrigArgType)
- end,
- PatString = format_patterns(Pats),
- ArgTypeString = format_type(OrigArgType, State1),
- BindResOrig =
- bind_pat_vars(Pats, OrigArgTypes, [], Map1, State1),
- Tag =
- case BindResOrig of
- {error, bind, _, _, _} -> pattern_match;
- {error, record, _, _, _} -> record_match;
- {error, opaque, _, _, _} -> opaque_match;
- {_, _} -> pattern_match_cov
- end,
- PatTypes = case BindResOrig of
- {error, opaque, _, _, OpaqueType} ->
- [PatString, ArgTypeString,
- format_type(OpaqueType, State1)];
- _ -> [PatString, ArgTypeString]
- end,
- {{Tag, PatTypes}, false};
- false ->
- %% Try to find out if this is a default clause in a list
- %% comprehension and suppress this. A real Hack(tm)
- Force0 =
- case is_compiler_generated(cerl:get_ann(C)) of
- true ->
- case Pats of
- [Pat] ->
- case cerl:is_c_cons(Pat) of
- true ->
- not (cerl:is_c_var(cerl:cons_hd(Pat)) andalso
- cerl:is_c_var(cerl:cons_tl(Pat)) andalso
- cerl:is_literal(Guard) andalso
- (cerl:concrete(Guard) =:= true));
- false ->
- true
- end;
- [Pat0, Pat1] -> % binary comprehension
- case cerl:is_c_cons(Pat0) of
- true ->
- not (cerl:is_c_var(cerl:cons_hd(Pat0)) andalso
- cerl:is_c_var(cerl:cons_tl(Pat0)) andalso
- cerl:is_c_var(Pat1) andalso
- cerl:is_literal(Guard) andalso
- (cerl:concrete(Guard) =:= true));
- false ->
- true
- end;
- _ -> true
- end;
- false ->
- true
- end,
- PatString =
- case ErrorType of
- bind -> format_patterns(Pats);
- record -> format_patterns(NewPats);
- opaque -> format_patterns(NewPats)
- end,
- PatTypes = case ErrorType of
- bind -> [PatString, format_type(ArgType0, State1)];
- record -> [PatString, format_type(Type, State1)];
- opaque -> [PatString, format_type(Type, State1),
- format_type(OpaqueTerm, State1)]
- end,
- FailedTag = case ErrorType of
- bind -> pattern_match;
- record -> record_match;
- opaque -> opaque_match
- end,
- {{FailedTag, PatTypes}, Force0}
- end,
- WarnType = case Msg of
- {opaque_match, _} -> ?WARN_OPAQUE;
- {pattern_match, _} -> ?WARN_MATCHING;
- {record_match, _} -> ?WARN_MATCHING;
- {pattern_match_cov, _} -> ?WARN_MATCHING
- end,
- {State1, Map, t_none(), ArgType0, [{WarnType, C, Msg, Force}|Warns]}
- end;
+ [cerl_prettypr:format(C), format_type(ArgType, State)]),
+ NewWarns =
+ case state__warning_mode(State) of
+ false ->
+ Warns;
+ true ->
+ Warn = clause_error(State, Map1, BindRes, C, Pats, ArgType),
+ [Warn|Warns]
+ end,
+ {State, Map, t_none(), ArgType, NewWarns};
{Map2, PatTypes} ->
+ %% Try to bind the argument. Will only succeed if
+ %% it is a simple structured term.
Map3 =
- case Arg =:= ?no_arg of
- true -> Map2;
- false ->
- %% Try to bind the argument. Will only succeed if
- %% it is a simple structured term.
- case bind_pat_vars_reverse([Arg], [t_product(PatTypes)],
- [], Map2, State1) of
- {error, _, _, _, _} -> Map2;
- {NewMap, _} -> NewMap
- end
- end,
- NewArgType =
- case Arg =:= ?no_arg of
- true -> ArgType0;
- false ->
- GenType = dialyzer_typesig:get_safe_underapprox(Pats, Guard),
- t_subtract(t_product(t_to_tlist(ArgType0)), GenType)
+ case bind_pat_vars_reverse([Arg], [t_product(PatTypes)],
+ Map2, State) of
+ {error, _, _, _, _} -> Map2;
+ {NewMap, _} -> NewMap
end,
- case bind_guard(Guard, Map3, State1) of
+
+ %% Subtract the matched type from the case argument. That will
+ %% allow us to find clauses that are covered by previous
+ %% clauses.
+ Guard = cerl:clause_guard(C),
+ GenType = dialyzer_typesig:get_safe_underapprox(Pats, Guard),
+ NewArgType = t_subtract(t_product(t_to_tlist(ArgType)), GenType),
+
+ %% Now test whether the guard will succeed.
+ case bind_guard(Guard, Map3, State) of
{error, Reason} ->
?debug("Failed guard: ~ts\n",
[cerl_prettypr:format(C, [{hook, cerl_typean:pp_hook()}])]),
- PatString = format_patterns(Pats),
- DefaultMsg =
- case Pats =:= [] of
- true -> {guard_fail, []};
- false ->
- {guard_fail_pat, [PatString, format_type(ArgType0, State1)]}
- end,
- Warn =
- case Reason of
- none -> {?WARN_MATCHING, C, DefaultMsg, false};
- {FailGuard, Msg} ->
- case is_compiler_generated(cerl:get_ann(FailGuard)) of
- false ->
- WarnType = case Msg of
- {guard_fail, _} -> ?WARN_MATCHING;
- {neg_guard_fail, _} -> ?WARN_MATCHING;
- {opaque_guard, _} -> ?WARN_OPAQUE
- end,
- {WarnType, FailGuard, Msg, false};
- true ->
- {?WARN_MATCHING, C, Msg, false}
- end
- end,
- {State1, Map, t_none(), NewArgType, [Warn|Warns]};
+ Warn = clause_guard_error(State, Reason, C, Pats, ArgType),
+ {State, Map, t_none(), NewArgType, [Warn|Warns]};
Map4 ->
- {RetState, RetMap, BodyType} = traverse(Body, Map4, State1),
+ Body = cerl:clause_body(C),
+ {RetState, RetMap, BodyType} = traverse(Body, Map4, State),
{RetState, RetMap, BodyType, NewArgType, Warns}
end
end.
+clause_error(State, Map, {error, maybe_covered, OrigArgType, _, _}, C, Pats, _) ->
+ %% This clause is covered by previous clauses, but it is possible
+ %% that it would never match anyway. Find out by matching the
+ %% original argument types of the case.
+ OrigArgTypes = get_arg_list(OrigArgType, Pats),
+ Msg =
+ case bind_pat_vars(Pats, OrigArgTypes, Map, State) of
+ {_, _} ->
+ %% The pattern would match if it had not been covered.
+ PatString = format_patterns(Pats),
+ ArgTypeString = format_type(OrigArgType, State),
+ {pattern_match_cov, [PatString, ArgTypeString]};
+ {error, ErrorType, _, _, OpaqueTerm} ->
+ %% This pattern can never match.
+ failed_msg(State, ErrorType, Pats, OrigArgType,
+ Pats, OrigArgType, OpaqueTerm)
+ end,
+ Force = false,
+ clause_error_warning(Msg, Force, C);
+clause_error(State, _Map, BindRes, C, Pats, ArgType) ->
+ %% This clause will never match. Always produce a warning
+ %% unless it is the default clause in a list comprehension
+ %% without any filters.
+ Force = not is_lc_default_clause(C),
+ {error, ErrorType, NewPats, NewType, OpaqueTerm} = BindRes,
+ Msg = failed_msg(State, ErrorType, Pats, ArgType, NewPats, NewType, OpaqueTerm),
+ clause_error_warning(Msg, Force, C).
+
+failed_msg(State, ErrorType, Pats, Type, NewPats, NewType, OpaqueTerm) ->
+ case ErrorType of
+ bind ->
+ {pattern_match, [format_patterns(Pats), format_type(Type, State)]};
+ record ->
+ {record_match, [format_patterns(NewPats), format_type(NewType, State)]};
+ opaque ->
+ {opaque_match, [format_patterns(NewPats), format_type(NewType, State),
+ format_type(OpaqueTerm, State)]}
+ end.
+
+clause_error_warning(Msg, Force, C) ->
+ {warn_type(Msg), C, Msg, Force}.
+
+warn_type({Tag, _}) ->
+ case Tag of
+ guard_fail -> ?WARN_MATCHING;
+ neg_guard_fail -> ?WARN_MATCHING;
+ opaque_guard -> ?WARN_OPAQUE;
+ opaque_match -> ?WARN_OPAQUE;
+ pattern_match -> ?WARN_MATCHING;
+ pattern_match_cov -> ?WARN_MATCHING;
+ record_match -> ?WARN_MATCHING
+ end.
+
+get_arg_list(ArgTypes, Pats) ->
+ case t_is_any(ArgTypes) of
+ true ->
+ [ArgTypes || _ <- Pats];
+ false ->
+ t_to_tlist(ArgTypes)
+ end.
+
+%% Test whether this clause is the default clause for a list
+%% or binary comprehension without any filters.
+is_lc_default_clause(C) ->
+ case is_compiler_generated(cerl:get_ann(C)) of
+ false ->
+ false;
+ true ->
+ case cerl:clause_pats(C) of
+ [Pat] -> % list comprehension
+ cerl:is_c_cons(Pat) andalso
+ cerl:is_c_var(cerl:cons_hd(Pat)) andalso
+ cerl:is_c_var(cerl:cons_tl(Pat)) andalso
+ does_guard_succeed(C);
+ [Pat0, Pat1] -> % binary comprehension
+ cerl:is_c_cons(Pat0) andalso
+ cerl:is_c_var(cerl:cons_hd(Pat0)) andalso
+ cerl:is_c_var(cerl:cons_tl(Pat0)) andalso
+ cerl:is_c_var(Pat1) andalso
+ does_guard_succeed(C)
+ end
+ end.
+
+does_guard_succeed(C) ->
+ Guard = cerl:clause_guard(C),
+ cerl:is_literal(Guard) andalso cerl:concrete(Guard) =:= true.
+
+clause_guard_error(State, Reason, C, Pats, ArgType) ->
+ case Reason of
+ none ->
+ Msg =
+ case Pats of
+ [] ->
+ {guard_fail, []};
+ [_|_] ->
+ PatString = format_patterns(Pats),
+ {guard_fail_pat, [PatString, format_type(ArgType, State)]}
+ end,
+ {?WARN_MATCHING, C, Msg, false};
+ {FailGuard, Msg} ->
+ case is_compiler_generated(cerl:get_ann(FailGuard)) of
+ false ->
+ {warn_type(Msg), FailGuard, Msg, false};
+ true ->
+ {?WARN_MATCHING, C, Msg, false}
+ end
+ end.
+
bind_subst(Arg, Pats, Map) ->
case cerl:type(Arg) of
values ->
@@ -1575,27 +1414,23 @@ bind_subst_list([], [], Map) ->
%% Patterns
%%
-bind_pat_vars(Pats, Types, Acc, Map, State) ->
- try
- bind_pat_vars(Pats, Types, Acc, Map, State, false)
- catch
- throw:Error ->
- %% Error = {error, bind | opaque | record, ErrorPats, ErrorType}
- Error
- end.
+bind_pat_vars(Pats, Types, Map, State) ->
+ bind_pat_vars(Pats, Types, Map, State, false).
-bind_pat_vars_reverse(Pats, Types, Acc, Map, State) ->
+bind_pat_vars_reverse(Pats, Types, Map, State) ->
+ bind_pat_vars(Pats, Types, Map, State, true).
+
+bind_pat_vars(Pats, Types, Map, State, Rev) ->
try
- bind_pat_vars(Pats, Types, Acc, Map, State, true)
+ do_bind_pat_vars(Pats, Types, Map, State, Rev, [])
catch
- throw:Error ->
+ throw:Error ->
%% Error = {error, bind | opaque | record, ErrorPats, ErrorType}
Error
end.
-bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
- ?debug("Binding pat: ~tw to ~ts\n", [cerl:type(Pat), format_type(Type, State)]
-),
+do_bind_pat_vars([Pat|Pats], [Type|Types], Map, State, Rev, Acc) ->
+ ?debug("Binding pat: ~tw to ~ts\n", [cerl:type(Pat), format_type(Type, State)]),
Opaques = State#state.opaques,
{NewMap, TypeOut} =
case cerl:type(Pat) of
@@ -1605,157 +1440,48 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
AliasPat = dialyzer_utils:refold_pattern(cerl:alias_pat(Pat)),
Var = cerl:alias_var(Pat),
Map1 = enter_subst(Var, AliasPat, Map),
- {Map2, [PatType]} = bind_pat_vars([AliasPat], [Type], [],
- Map1, State, Rev),
+ {Map2, [PatType]} = do_bind_pat_vars([AliasPat], [Type],
+ Map1, State, Rev, []),
{enter_type(Var, PatType, Map2), PatType};
binary ->
- %% Cannot bind the binary if we are in reverse match since
- %% binary patterns and binary construction are not symmetric.
case Rev of
- true -> {Map, t_bitstr()};
- false ->
- BinType = t_inf(t_bitstr(), Type, Opaques),
- case t_is_none(BinType) of
- true ->
- case t_find_opaque_mismatch(t_bitstr(), Type, Opaques) of
- {ok, T1, T2} ->
- bind_error([Pat], T1, T2, opaque);
- error ->
- bind_error([Pat], Type, t_none(), bind)
- end;
- false ->
- Segs = cerl:binary_segments(Pat),
- {Map1, SegTypes} = bind_bin_segs(Segs, BinType, Map, State),
- {Map1, t_bitstr_concat(SegTypes)}
- end
- end;
- cons ->
- Cons = t_inf(Type, t_cons(), Opaques),
- case t_is_none(Cons) of
true ->
- bind_opaque_pats(t_cons(), Type, Pat, State);
+ %% Cannot bind the binary if we are in reverse match since
+ %% binary patterns and binary construction are not
+ %% symmetric.
+ {Map, t_bitstr()};
false ->
- {Map1, [HdType, TlType]} =
- bind_pat_vars([cerl:cons_hd(Pat), cerl:cons_tl(Pat)],
- [t_cons_hd(Cons, Opaques),
- t_cons_tl(Cons, Opaques)],
- [], Map, State, Rev),
- {Map1, t_cons(HdType, TlType)}
+ BinType = bind_checked_inf(Pat, t_bitstr(), Type, Opaques),
+ Segs = cerl:binary_segments(Pat),
+ {Map1, SegTypes} = bind_bin_segs(Segs, BinType, Map, State),
+ {Map1, t_bitstr_concat(SegTypes)}
end;
+ cons ->
+ Cons = bind_checked_inf(Pat, t_cons(), Type, Opaques),
+ {Map1, [HdType, TlType]} =
+ do_bind_pat_vars([cerl:cons_hd(Pat), cerl:cons_tl(Pat)],
+ [t_cons_hd(Cons, Opaques),
+ t_cons_tl(Cons, Opaques)],
+ Map, State, Rev, []),
+ {Map1, t_cons(HdType, TlType)};
literal ->
Pat0 = dialyzer_utils:refold_pattern(Pat),
case cerl:is_literal(Pat0) of
true ->
- Literal = literal_type(Pat),
- case t_is_none(t_inf(Literal, Type, Opaques)) of
- true ->
- bind_opaque_pats(Literal, Type, Pat, State);
- false -> {Map, Literal}
- end;
+ LiteralType = bind_checked_inf(Pat, literal_type(Pat), Type, Opaques),
+ {Map, LiteralType};
false ->
- %% Retry with the unfolded pattern
- {Map1, [PatType]}
- = bind_pat_vars([Pat0], [Type], [], Map, State, Rev),
+ {Map1, [PatType]} = do_bind_pat_vars([Pat0], [Type], Map, State, Rev, []),
{Map1, PatType}
end;
map ->
- MapT = t_inf(Type, t_map(), Opaques),
- case t_is_none(MapT) of
- true ->
- bind_opaque_pats(t_map(), Type, Pat, State);
- false ->
- case Rev of
- %% TODO: Reverse matching (propagating a matched subset back to a value)
- true -> {Map, MapT};
- false ->
- FoldFun =
- fun(Pair, {MapAcc, ListAcc}) ->
- %% Only exact (:=) can appear in patterns
- exact = cerl:concrete(cerl:map_pair_op(Pair)),
- Key = cerl:map_pair_key(Pair),
- KeyType =
- case cerl:type(Key) of
- var ->
- case state__lookup_type_for_letrec(Key, State) of
- error -> lookup_type(Key, MapAcc);
- {ok, RecType} -> RecType
- end;
- literal ->
- literal_type(Key)
- end,
- Bind = erl_types:t_map_get(KeyType, MapT),
- {MapAcc1, [ValType]} =
- bind_pat_vars([cerl:map_pair_val(Pair)],
- [Bind], [], MapAcc, State, Rev),
- case t_is_singleton(KeyType, Opaques) of
- true -> {MapAcc1, [{KeyType, ValType}|ListAcc]};
- false -> {MapAcc1, ListAcc}
- end
- end,
- {Map1, Pairs} = lists:foldl(FoldFun, {Map, []}, cerl:map_es(Pat)),
- {Map1, t_inf(MapT, t_map(Pairs))}
- end
- end;
+ bind_map(Pat, Type, Map, State, Opaques, Rev);
tuple ->
- Es = cerl:tuple_es(Pat),
- {TypedRecord, Prototype} =
- case Es of
- [] -> {false, t_tuple([])};
- [Tag|Left] ->
- case cerl:is_c_atom(Tag) andalso is_literal_record(Pat) of
- true ->
- TagAtom = cerl:atom_val(Tag),
- case state__lookup_record(TagAtom, length(Left), State) of
- error -> {false, t_tuple(length(Es))};
- {ok, Record, _FieldNames} ->
- [_Head|AnyTail] = [t_any() || _ <- Es],
- UntypedRecord = t_tuple([t_atom(TagAtom)|AnyTail]),
- {not t_is_equal(Record, UntypedRecord), Record}
- end;
- false -> {false, t_tuple(length(Es))}
- end
- end,
- Tuple = t_inf(Prototype, Type, Opaques),
- case t_is_none(Tuple) of
- true ->
- bind_opaque_pats(Prototype, Type, Pat, State);
- false ->
- SubTuples = t_tuple_subtypes(Tuple, Opaques),
- %% Need to call the top function to get the try-catch wrapper
- MapJ = join_maps_begin(Map),
- Results =
- case Rev of
- true ->
- [bind_pat_vars_reverse(Es, t_tuple_args(SubTuple, Opaques),
- [], MapJ, State)
- || SubTuple <- SubTuples];
- false ->
- [bind_pat_vars(Es, t_tuple_args(SubTuple, Opaques), [],
- MapJ, State)
- || SubTuple <- SubTuples]
- end,
- case lists:keyfind(opaque, 2, Results) of
- {error, opaque, _PatList, _Type, Opaque} ->
- bind_error([Pat], Tuple, Opaque, opaque);
- false ->
- case [M || {M, _} <- Results, M =/= error] of
- [] ->
- case TypedRecord of
- true -> bind_error([Pat], Tuple, Prototype, record);
- false -> bind_error([Pat], Tuple, t_none(), bind)
- end;
- Maps ->
- Map1 = join_maps_end(Maps, MapJ),
- TupleType = t_sup([t_tuple(EsTypes)
- || {M, EsTypes} <- Results, M =/= error]),
- {Map1, TupleType}
- end
- end
- end;
+ bind_tuple(Pat, Type, Map, State, Opaques, Rev);
values ->
Es = cerl:values_es(Pat),
- {Map1, EsTypes} =
- bind_pat_vars(Es, t_to_tlist(Type), [], Map, State, Rev),
+ {Map1, EsTypes} = do_bind_pat_vars(Es, t_to_tlist(Type),
+ Map, State, Rev, []),
{Map1, t_product(EsTypes)};
var ->
VarType1 =
@@ -1764,28 +1490,100 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
{ok, RecType} -> RecType
end,
%% Must do inf when binding args to pats. Vars in pats are fresh.
- VarType2 = t_inf(VarType1, Type, Opaques),
- case t_is_none(VarType2) of
- true ->
- case t_find_opaque_mismatch(VarType1, Type, Opaques) of
- {ok, T1, T2} ->
- bind_error([Pat], T1, T2, opaque);
- error ->
- bind_error([Pat], Type, t_none(), bind)
- end;
- false ->
- Map1 = enter_type(Pat, VarType2, Map),
- {Map1, VarType2}
- end;
+ VarType2 = bind_checked_inf(Pat, VarType1, Type, Opaques),
+ Map1 = enter_type(Pat, VarType2, Map),
+ {Map1, VarType2};
_Other ->
%% Catch all is needed when binding args to pats
?debug("Failed match for ~p\n", [_Other]),
+ Rev = true, % Assertion.
bind_error([Pat], Type, t_none(), bind)
end,
- bind_pat_vars(PatLeft, TypeLeft, [TypeOut|Acc], NewMap, State, Rev);
-bind_pat_vars([], [], Acc, Map, _State, _Rev) ->
+ do_bind_pat_vars(Pats, Types, NewMap, State, Rev, [TypeOut|Acc]);
+do_bind_pat_vars([], [], Map, _State, _Rev, Acc) ->
{Map, lists:reverse(Acc)}.
+bind_map(Pat, Type, Map, State, Opaques, Rev) ->
+ MapT = bind_checked_inf(Pat, t_map(), Type, Opaques),
+ case Rev of
+ %% TODO: Reverse matching (propagating a matched subset back to a value).
+ true ->
+ {Map, MapT};
+ false ->
+ FoldFun =
+ fun(Pair, {MapAcc, ListAcc}) ->
+ %% Only exact (:=) can appear in patterns.
+ exact = cerl:concrete(cerl:map_pair_op(Pair)),
+ Key = cerl:map_pair_key(Pair),
+ KeyType =
+ case cerl:type(Key) of
+ var ->
+ case state__lookup_type_for_letrec(Key, State) of
+ error -> lookup_type(Key, MapAcc);
+ {ok, RecType} -> RecType
+ end;
+ literal ->
+ literal_type(Key)
+ end,
+ Bind = erl_types:t_map_get(KeyType, MapT),
+ {MapAcc1, [ValType]} =
+ do_bind_pat_vars([cerl:map_pair_val(Pair)],
+ [Bind], MapAcc, State, Rev, []),
+ case t_is_singleton(KeyType, Opaques) of
+ true -> {MapAcc1, [{KeyType, ValType}|ListAcc]};
+ false -> {MapAcc1, ListAcc}
+ end
+ end,
+ {Map1, Pairs} = lists:foldl(FoldFun, {Map, []}, cerl:map_es(Pat)),
+ {Map1, t_inf(MapT, t_map(Pairs))}
+ end.
+
+bind_tuple(Pat, Type, Map, State, Opaques, Rev) ->
+ Es = cerl:tuple_es(Pat),
+ {IsTypedRecord, Prototype} =
+ case Es of
+ [] ->
+ {false, t_tuple([])};
+ [Tag|Tags] ->
+ case cerl:is_c_atom(Tag) andalso is_literal_record(Pat) of
+ true ->
+ Any = t_any(),
+ [_Head|AnyTail] = [Any || _ <- Es],
+ UntypedRecord = t_tuple([Tag|AnyTail]),
+ case state__lookup_record(cerl:atom_val(Tag), length(Tags), State) of
+ error ->
+ {false, UntypedRecord};
+ {ok, Record, _FieldNames} ->
+ {not t_is_equal(Record, UntypedRecord), Record}
+ end;
+ false ->
+ {false, t_tuple(length(Es))}
+ end
+ end,
+ Tuple = bind_checked_inf(Pat, Prototype, Type, Opaques),
+ SubTuples = t_tuple_subtypes(Tuple, Opaques),
+ MapJ = join_maps_begin(Map),
+ %% Need to call the top function to get the try-catch wrapper.
+ Results = [bind_pat_vars(Es, t_tuple_args(SubTuple, Opaques), MapJ, State, Rev) ||
+ SubTuple <- SubTuples],
+ case lists:keyfind(opaque, 2, Results) of
+ {error, opaque, _PatList, _Type, Opaque} ->
+ bind_error([Pat], Tuple, Opaque, opaque);
+ false ->
+ case [M || {M, _} <- Results, M =/= error] of
+ [] ->
+ case IsTypedRecord of
+ true -> bind_error([Pat], Tuple, Prototype, record);
+ false -> bind_error([Pat], Tuple, t_none(), bind)
+ end;
+ Maps ->
+ Map1 = join_maps_end(Maps, MapJ),
+ TupleType = t_sup([t_tuple(EsTypes) ||
+ {M, EsTypes} <- Results, M =/= error]),
+ {Map1, TupleType}
+ end
+ end.
+
bind_bin_segs(BinSegs, BinType, Map, State) ->
bind_bin_segs(BinSegs, BinType, [], Map, State).
@@ -1797,18 +1595,20 @@ bind_bin_segs([Seg|Segs], BinType, Acc, Map, State) ->
all ->
binary = SegType, [] = Segs, %% just an assert
T = t_inf(t_bitstr(UnitVal, 0), BinType),
- {Map1, [Type]} = bind_pat_vars([Val], [T], [], Map, State, false),
+ {Map1, [Type]} = do_bind_pat_vars([Val], [T], Map,
+ State, false, []),
Type1 = remove_local_opaque_types(Type, State#state.opaques),
bind_bin_segs(Segs, t_bitstr(0, 0), [Type1|Acc], Map1, State);
- utf -> % XXX: possibly can be strengthened
+ utf -> % XXX: can possibly be strengthened
true = lists:member(SegType, [utf8, utf16, utf32]),
- {Map1, [_]} = bind_pat_vars([Val], [t_integer()], [], Map, State, false),
+ {Map1, [_]} = do_bind_pat_vars([Val], [t_integer()],
+ Map, State, false, []),
Type = t_binary(),
bind_bin_segs(Segs, BinType, [Type|Acc], Map1, State);
- BitSz when is_integer(BitSz) orelse BitSz =:= any ->
+ BitSz when is_integer(BitSz); BitSz =:= any ->
Size = cerl:bitstr_size(Seg),
- {Map1, [SizeType]} =
- bind_pat_vars([Size], [t_non_neg_integer()], [], Map, State, false),
+ {Map1, [SizeType]} = do_bind_pat_vars([Size], [t_non_neg_integer()],
+ Map, State, false, []),
Opaques = State#state.opaques,
NumberVals = t_number_vals(SizeType, Opaques),
case t_contains_opaque(SizeType, Opaques) of
@@ -1847,7 +1647,7 @@ bind_bin_segs([Seg|Segs], BinType, Acc, Map, State) ->
end
end
end,
- {Map2, [_]} = bind_pat_vars([Val], [ValConstr], [], Map1, State, false),
+ {Map2, [_]} = do_bind_pat_vars([Val], [ValConstr], Map1, State, false, []),
NewBinType = t_bitstr_match(Type, BinType),
case t_is_none(NewBinType) of
true -> bind_error([Seg], BinType, t_none(), bind);
@@ -1857,6 +1657,22 @@ bind_bin_segs([Seg|Segs], BinType, Acc, Map, State) ->
bind_bin_segs([], _BinType, Acc, Map, _State) ->
{Map, lists:reverse(Acc)}.
+%% Return the infimum (meet) of ExpectedType and Type if is not
+%% t_none(), and raise a bind_error() it is t_none().
+bind_checked_inf(Pat, ExpectedType, Type, Opaques) ->
+ Inf = t_inf(ExpectedType, Type, Opaques),
+ case t_is_none(Inf) of
+ true ->
+ case t_find_opaque_mismatch(ExpectedType, Type, Opaques) of
+ {ok, T1, T2} ->
+ bind_error([Pat], T1, T2, opaque);
+ error ->
+ bind_error([Pat], Type, t_none(), bind)
+ end;
+ false ->
+ Inf
+ end.
+
bind_error(Pats, Type, OpaqueType, Error0) ->
Error = case {Error0, Pats} of
{bind, [Pat]} ->
@@ -1868,17 +1684,6 @@ bind_error(Pats, Type, OpaqueType, Error0) ->
end,
throw({error, Error, Pats, Type, OpaqueType}).
--spec bind_opaque_pats(type(), type(), cerl:c_literal(), state()) ->
- no_return().
-
-bind_opaque_pats(GenType, Type, Pat, State) ->
- case t_find_opaque_mismatch(GenType, Type, State#state.opaques) of
- {ok, T1, T2} ->
- bind_error([Pat], T1, T2, opaque);
- error ->
- bind_error([Pat], Type, t_none(), bind)
- end.
-
%%----------------------------------------
%% Guards
%%
@@ -1923,9 +1728,7 @@ bind_guard(Guard, Map, Env, Eval, State) ->
{{Map2, t_none()}, HE}
end,
BodyEnv = maps:put(get_label(Var), Arg, Env),
- Wanted = case Eval of pos -> t_atom(true); neg -> t_atom(false);
- dont_know -> t_any() end,
- case t_is_none(t_inf(HandlerType, Wanted)) of
+ case t_is_none(guard_eval_inf(Eval, HandlerType)) of
%% Handler won't save us; pretend it does not exist
true -> bind_guard(cerl:try_body(Guard), Map, BodyEnv, Eval, State);
false ->
@@ -1981,13 +1784,7 @@ bind_guard(Guard, Map, Env, Eval, State) ->
error ->
?debug("Did not find it\n", []),
Type = lookup_type(Guard, Map),
- Constr =
- case Eval of
- pos -> t_atom(true);
- neg -> t_atom(false);
- dont_know -> Type
- end,
- Inf = t_inf(Constr, Type),
+ Inf = guard_eval_inf(Eval, Type),
{enter_type(Guard, Inf, Map), Inf};
{ok, Tree} ->
?debug("Found it\n", []),
@@ -2003,17 +1800,9 @@ handle_guard_call(Guard, Map, Env, Eval, State) ->
cerl:atom_val(cerl:call_name(Guard)),
cerl:call_arity(Guard)},
case MFA of
- {erlang, F, 1} when F =:= is_atom; F =:= is_boolean;
- F =:= is_binary; F =:= is_bitstring;
- F =:= is_float; F =:= is_function;
- F =:= is_integer; F =:= is_list; F =:= is_map;
- F =:= is_number; F =:= is_pid; F =:= is_port;
- F =:= is_reference; F =:= is_tuple ->
- handle_guard_type_test(Guard, F, Map, Env, Eval, State);
{erlang, is_function, 2} ->
handle_guard_is_function(Guard, Map, Env, Eval, State);
- MFA when (MFA =:= {erlang, internal_is_record, 3}) or
- (MFA =:= {erlang, is_record, 3}) ->
+ {erlang, F, 3} when F =:= internal_is_record; F =:= is_record ->
handle_guard_is_record(Guard, Map, Env, Eval, State);
{erlang, '=:=', 2} ->
handle_guard_eqeq(Guard, Map, Env, Eval, State);
@@ -2028,8 +1817,14 @@ handle_guard_call(Guard, Map, Env, Eval, State) ->
{erlang, Comp, 2} when Comp =:= '<'; Comp =:= '=<';
Comp =:= '>'; Comp =:= '>=' ->
handle_guard_comp(Guard, Comp, Map, Env, Eval, State);
- _ ->
- handle_guard_gen_fun(MFA, Guard, Map, Env, Eval, State)
+ {erlang, F, A} ->
+ TypeTestType = type_test_type(F, A),
+ case t_is_any(TypeTestType) of
+ true ->
+ handle_guard_gen_fun(MFA, Guard, Map, Env, Eval, State);
+ false ->
+ handle_guard_type_test(Guard, TypeTestType, Map, Env, Eval, State)
+ end
end.
handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) ->
@@ -2047,12 +1842,7 @@ handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) ->
false ->
BifArgs = bif_args(M, F, A),
Map2 = enter_type_lists(Args, t_inf_lists(BifArgs, As, Opaques), Map1),
- Ret =
- case Eval of
- pos -> t_inf(t_atom(true), BifRet);
- neg -> t_inf(t_atom(false), BifRet);
- dont_know -> BifRet
- end,
+ Ret = guard_eval_inf(Eval, BifRet),
case t_is_none(Ret) of
true ->
case Eval =:= pos of
@@ -2063,10 +1853,10 @@ handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) ->
end
end.
-handle_guard_type_test(Guard, F, Map, Env, Eval, State) ->
+handle_guard_type_test(Guard, TypeTestType, Map, Env, Eval, State) ->
[Arg] = cerl:call_args(Guard),
{Map1, ArgType} = bind_guard(Arg, Map, Env, dont_know, State),
- case bind_type_test(Eval, F, ArgType, State) of
+ case bind_type_test(Eval, TypeTestType, ArgType, State) of
error ->
?debug("Type test: ~w failed\n", [F]),
signal_guard_fail(Eval, Guard, [ArgType], State);
@@ -2076,23 +1866,7 @@ handle_guard_type_test(Guard, F, Map, Env, Eval, State) ->
{enter_type(Arg, NewArgType, Map1), Ret}
end.
-bind_type_test(Eval, TypeTest, ArgType, State) ->
- Type = case TypeTest of
- is_atom -> t_atom();
- is_boolean -> t_boolean();
- is_binary -> t_binary();
- is_bitstring -> t_bitstr();
- is_float -> t_float();
- is_function -> t_fun();
- is_integer -> t_integer();
- is_list -> t_maybe_improper_list();
- is_map -> t_map();
- is_number -> t_number();
- is_pid -> t_pid();
- is_port -> t_port();
- is_reference -> t_reference();
- is_tuple -> t_tuple()
- end,
+bind_type_test(Eval, Type, ArgType, State) ->
case Eval of
pos ->
Inf = t_inf(Type, ArgType, State#state.opaques),
@@ -2110,6 +1884,27 @@ bind_type_test(Eval, TypeTest, ArgType, State) ->
{ok, ArgType, t_boolean()}
end.
+type_test_type(TypeTest, 1) ->
+ case TypeTest of
+ is_atom -> t_atom();
+ is_boolean -> t_boolean();
+ is_binary -> t_binary();
+ is_bitstring -> t_bitstr();
+ is_float -> t_float();
+ is_function -> t_fun();
+ is_integer -> t_integer();
+ is_list -> t_maybe_improper_list();
+ is_map -> t_map();
+ is_number -> t_number();
+ is_pid -> t_pid();
+ is_port -> t_port();
+ is_reference -> t_reference();
+ is_tuple -> t_tuple();
+ _ -> t_any() % Not a known type test.
+ end;
+type_test_type(_, _) ->
+ t_any().
+
handle_guard_comp(Guard, Comp, Map, Env, Eval, State) ->
Args = cerl:call_args(Guard),
[Arg1, Arg2] = Args,
@@ -2129,12 +1924,12 @@ handle_guard_comp(Guard, Comp, Map, Env, Eval, State) ->
false when Eval =:= dont_know -> {Map, t_atom(false)};
false when Eval =:= neg -> {Map, t_atom(false)}
end;
- {{literal, Lit1}, var} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) ->
+ {{literal, Lit1}, var} when IsInt1, IsInt2, Eval =:= pos ->
case bind_comp_literal_var(Lit1, Arg2, Type2, Comp, Map1, Opaques) of
error -> signal_guard_fail(Eval, Guard, ArgTypes, State);
{ok, NewMap} -> {NewMap, t_atom(true)}
end;
- {var, {literal, Lit2}} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) ->
+ {var, {literal, Lit2}} when IsInt1, IsInt2, Eval =:= pos ->
case bind_comp_literal_var(Lit2, Arg1, Type1, invert_comp(Comp),
Map1, Opaques) of
error -> signal_guard_fail(Eval, Guard, ArgTypes, State);
@@ -2313,11 +2108,7 @@ bind_eq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) ->
OpArgs = erl_types:t_find_unknown_opaque(Type1, Type2, Opaques),
case OpArgs =:= [] of
true ->
- case Eval of
- pos -> {Map2, t_atom(true)};
- neg -> {Map2, t_atom(false)};
- dont_know -> {Map2, t_boolean()}
- end;
+ {Map2, guard_eval_inf(Eval, t_boolean())};
false ->
signal_guard_fail(Eval, Guard, [Type1, Type2], State)
end
@@ -2621,6 +2412,14 @@ bind_guard_map_pairs([Pair|Pairs], Map, Env, State, PairAcc) ->
-type eval() :: 'pos' | 'neg' | 'dont_know'.
+guard_eval_inf(Eval, Type) ->
+ Constr = case Eval of
+ pos -> t_atom(true);
+ neg -> t_atom(false);
+ dont_know -> Type
+ end,
+ t_inf(Constr, Type).
+
-spec signal_guard_fail(eval(), cerl:c_call(), [type()],
state()) -> no_return().
@@ -2668,16 +2467,10 @@ signal_guard_failure(Eval, Guard, ArgTypes, Tag, State) ->
end,
throw({Tag, {LocTree, Msg}}).
-is_infix_op({erlang, '=:=', 2}) -> true;
-is_infix_op({erlang, '==', 2}) -> true;
-is_infix_op({erlang, '=/=', 2}) -> true;
-is_infix_op({erlang, '=/', 2}) -> true;
-is_infix_op({erlang, '<', 2}) -> true;
-is_infix_op({erlang, '=<', 2}) -> true;
-is_infix_op({erlang, '>', 2}) -> true;
-is_infix_op({erlang, '>=', 2}) -> true;
-is_infix_op({M, F, A}) when is_atom(M), is_atom(F),
- is_integer(A), 0 =< A, A =< 255 -> false.
+is_infix_op({erlang, F, 2}) ->
+ erl_internal:comp_op(F, 2);
+is_infix_op({_, _, _}) ->
+ false.
bif_args(M, F, A) ->
case erl_bif_types:arg_types(M, F, A) of
@@ -2741,7 +2534,7 @@ bind_guard_case_clauses(GenArgType, GenMap, ArgExpr, [Clause|Left],
true -> Any = t_any(), [Any || _ <- Pats];
false -> t_to_tlist(ArgType)
end,
- case bind_pat_vars(Pats, ArgTypes, [], NewMap0, State) of
+ case bind_pat_vars(Pats, ArgTypes, NewMap0, State) of
{error, _, _, _, _} -> none;
{PatMap, _PatTypes} -> PatMap
end
@@ -2880,12 +2673,6 @@ enter_type_lists([Key|KeyTail], [Val|ValTail], Map) ->
enter_type_lists([], [], Map) ->
Map.
-enter_type_list([{Key, Val}|Left], Map) ->
- Map1 = enter_type(Key, Val, Map),
- enter_type_list(Left, Map1);
-enter_type_list([], Map) ->
- Map.
-
enter_type(Key, Val, MS) ->
case cerl:is_literal(Key) of
true -> MS;
@@ -3091,15 +2878,15 @@ state__new(Callgraph, Codeserver, Tree, Plt, Module, Records) ->
dict:new(), Funs),
#state{callgraph = Callgraph, codeserver = Codeserver,
envs = Env, fun_tab = FunTab, fun_homes = FunHomes, opaques = Opaques,
- plt = Plt, races = dialyzer_races:new(), records = Records,
+ plt = Plt, records = Records,
warning_mode = false, warnings = [], work = Work, tree_map = TreeMap,
- module = Module, reachable_funs = sets:new()}.
+ module = Module, reachable_funs = sets:new([{version, 2}])}.
state__warning_mode(#state{warning_mode = WM}) ->
WM.
state__set_warning_mode(#state{tree_map = TreeMap, fun_tab = FunTab,
- races = Races, callgraph = Callgraph,
+ callgraph = Callgraph,
reachable_funs = ReachableFuns} = State) ->
?debug("==========\nStarting warning pass\n==========\n", []),
Funs = dict:fetch_keys(TreeMap),
@@ -3109,37 +2896,11 @@ state__set_warning_mode(#state{tree_map = TreeMap, fun_tab = FunTab,
dialyzer_callgraph:lookup_name(Fun, Callgraph) =/= error orelse
sets:is_element(Fun, ReachableFuns)],
State#state{work = init_work(Work),
- fun_tab = FunTab, warning_mode = true,
- races = dialyzer_races:put_race_analysis(true, Races)}.
-
-state__race_analysis(Analysis, #state{races = Races} = State) ->
- State#state{races = dialyzer_races:put_race_analysis(Analysis, Races)}.
-
-state__renew_curr_fun(CurrFun, CurrFunLabel,
- #state{races = Races} = State) ->
- State#state{races = dialyzer_races:put_curr_fun(CurrFun, CurrFunLabel,
- Races)}.
-
-state__renew_fun_args(Args, #state{races = Races} = State) ->
- case state__warning_mode(State) of
- true -> State;
- false ->
- State#state{races = dialyzer_races:put_fun_args(Args, Races)}
- end.
-
-state__renew_race_list(RaceList, RaceListSize,
- #state{races = Races} = State) ->
- State#state{races = dialyzer_races:put_race_list(RaceList, RaceListSize,
- Races)}.
+ fun_tab = FunTab, warning_mode = true}.
state__renew_warnings(Warnings, State) ->
State#state{warnings = Warnings}.
--spec state__add_warning(raw_warning(), state()) -> state().
-
-state__add_warning(Warn, #state{warnings = Warnings} = State) ->
- State#state{warnings = [Warn|Warnings]}.
-
state__add_warning(State, Tag, Tree, Msg) ->
state__add_warning(State, Tag, Tree, Msg, false).
@@ -3190,15 +2951,6 @@ state__set_curr_fun(undefined, State) ->
state__set_curr_fun(FunLbl, State) ->
State#state{curr_fun = find_function(FunLbl, State)}.
--spec state__find_function(mfa_or_funlbl(), state()) -> mfa_or_funlbl().
-
-state__find_function(FunLbl, State) ->
- find_function(FunLbl, State).
-
-state__get_race_warnings(#state{races = Races} = State) ->
- {Races1, State1} = dialyzer_races:get_race_warnings(Races, State),
- State1#state{races = Races1}.
-
state__get_warnings(#state{tree_map = TreeMap, fun_tab = FunTab,
callgraph = Callgraph, plt = Plt,
reachable_funs = ReachableFuns} = State) ->
@@ -3526,56 +3278,6 @@ forward_args(Fun, ArgTypes, #state{work = Work, fun_tab = FunTab} = State) ->
State#state{work = NewWork, fun_tab = NewFunTab}
end.
--spec state__cleanup(state()) -> state().
-
-state__cleanup(#state{callgraph = Callgraph,
- races = Races,
- records = Records}) ->
- #state{callgraph = dialyzer_callgraph:cleanup(Callgraph),
- races = dialyzer_races:cleanup(Races),
- records = Records}.
-
--spec state__duplicate(state()) -> state().
-
-state__duplicate(#state{callgraph = Callgraph} = State) ->
- State#state{callgraph = dialyzer_callgraph:duplicate(Callgraph)}.
-
--spec dispose_state(state()) -> ok.
-
-dispose_state(#state{callgraph = Callgraph}) ->
- dialyzer_callgraph:dispose_race_server(Callgraph).
-
--spec state__get_callgraph(state()) -> dialyzer_callgraph:callgraph().
-
-state__get_callgraph(#state{callgraph = Callgraph}) ->
- Callgraph.
-
--spec state__get_races(state()) -> dialyzer_races:races().
-
-state__get_races(#state{races = Races}) ->
- Races.
-
--spec state__get_records(state()) -> types().
-
-state__get_records(#state{records = Records}) ->
- Records.
-
--spec state__put_callgraph(dialyzer_callgraph:callgraph(), state()) ->
- state().
-
-state__put_callgraph(Callgraph, State) ->
- State#state{callgraph = Callgraph}.
-
--spec state__put_races(dialyzer_races:races(), state()) -> state().
-
-state__put_races(Races, State) ->
- State#state{races = Races}.
-
--spec state__records_only(state()) -> state().
-
-state__records_only(#state{records = Records}) ->
- #state{records = Records}.
-
-spec state__translate_file(file:filename(), state()) -> file:filename().
state__translate_file(FakeFile, State) ->
@@ -3584,51 +3286,12 @@ state__translate_file(FakeFile, State) ->
%%% ===========================================================================
%%%
-%%% Races
-%%%
-%%% ===========================================================================
-
-is_race_analysis_enabled(#state{races = Races, callgraph = Callgraph}) ->
- RaceDetection = dialyzer_callgraph:get_race_detection(Callgraph),
- RaceAnalysis = dialyzer_races:get_race_analysis(Races),
- RaceDetection andalso RaceAnalysis.
-
-get_race_list_and_size(#state{races = Races}) ->
- dialyzer_races:get_race_list_and_size(Races).
-
-renew_race_code(#state{races = Races, callgraph = Callgraph,
- warning_mode = WarningMode} = State) ->
- case WarningMode of
- true -> State;
- false ->
- NewCallgraph = dialyzer_callgraph:renew_race_code(Races, Callgraph),
- State#state{callgraph = NewCallgraph}
- end.
-
-renew_race_public_tables([Var], #state{races = Races, callgraph = Callgraph,
- warning_mode = WarningMode} = State) ->
- case WarningMode of
- true -> State;
- false ->
- Table = dialyzer_races:get_new_table(Races),
- case Table of
- no_t -> State;
- _Other ->
- VarLabel = get_label(Var),
- NewCallgraph =
- dialyzer_callgraph:renew_race_public_tables(VarLabel, Callgraph),
- State#state{callgraph = NewCallgraph}
- end
- end.
-
-%%% ===========================================================================
-%%%
%%% Worklist
%%%
%%% ===========================================================================
init_work(List) ->
- {List, [], sets:from_list(List)}.
+ {List, [], sets:from_list(List, [{version, 2}])}.
get_work({[], [], _Set}) ->
none;
diff --git a/lib/dialyzer/src/dialyzer_dep.erl b/lib/dialyzer/src/dialyzer_dep.erl
index 1880e1ee5c..c565a0a612 100644
--- a/lib/dialyzer/src/dialyzer_dep.erl
+++ b/lib/dialyzer/src/dialyzer_dep.erl
@@ -279,7 +279,7 @@ remote_call(Tree, ArgFuns, State) ->
true ->
M1 = cerl:atom_val(M),
F1 = cerl:atom_val(F),
- Literal = cerl_closurean:is_literal_op(M1, F1, A),
+ Literal = is_literal_op(M1, F1, A),
case erl_bifs:is_pure(M1, F1, A) of
true ->
case Literal of
@@ -289,7 +289,7 @@ remote_call(Tree, ArgFuns, State) ->
{output(set__singleton(external)), state__add_esc(ArgFuns, State)}
end;
false ->
- State1 = case cerl_closurean:is_escape_op(M1, F1, A) of
+ State1 = case is_escape_op(M1, F1, A) of
true -> state__add_esc(ArgFuns, State);
false -> State
end,
@@ -303,26 +303,86 @@ remote_call(Tree, ArgFuns, State) ->
primop(Tree, ArgFuns, State) ->
F = cerl:atom_val(cerl:primop_name(Tree)),
A = length(cerl:primop_args(Tree)),
- State1 = case cerl_closurean:is_escape_op(F, A) of
+ State1 = case is_escape_op(F, A) of
true -> state__add_esc(ArgFuns, State);
false -> State
end,
- case cerl_closurean:is_literal_op(F, A) of
+ case is_literal_op(F, A) of
true -> {output(none), State1};
false -> {ArgFuns, State1}
end.
%%------------------------------------------------------------
+
+%% Escape operators may let their arguments escape. Unless we know
+%% otherwise, and the function is not pure, we assume this is the case.
+%% Error-raising functions (fault/match_fail) are not considered as
+%% escapes (but throw/exit are). Zero-argument functions need not be
+%% listed.
+
+-spec is_escape_op(atom(), arity()) -> boolean().
+
+is_escape_op(match_fail, 1) -> false;
+is_escape_op(recv_wait_timeout, 1) -> false;
+is_escape_op(F, A) when is_atom(F), is_integer(A) -> true.
+
+-spec is_escape_op(atom(), atom(), arity()) -> boolean().
+
+is_escape_op(erlang, error, 1) -> false;
+is_escape_op(erlang, error, 2) -> false;
+is_escape_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> true.
+
+%% "Literal" operators will never return functional values even when
+%% found in their arguments. Unless we know otherwise, we assume this is
+%% not the case. (More functions can be added to this list, if needed
+%% for better precision. Note that the result of `term_to_binary' still
+%% contains an encoding of the closure.)
+
+-spec is_literal_op(atom(), arity()) -> boolean().
+
+is_literal_op(recv_wait_timeout, 1) -> true;
+is_literal_op(match_fail, 1) -> true;
+is_literal_op(F, A) when is_atom(F), is_integer(A) -> false.
+
+-spec is_literal_op(atom(), atom(), arity()) -> boolean().
+
+is_literal_op(erlang, '+', 2) -> true;
+is_literal_op(erlang, '-', 2) -> true;
+is_literal_op(erlang, '*', 2) -> true;
+is_literal_op(erlang, '/', 2) -> true;
+is_literal_op(erlang, '=:=', 2) -> true;
+is_literal_op(erlang, '==', 2) -> true;
+is_literal_op(erlang, '=/=', 2) -> true;
+is_literal_op(erlang, '/=', 2) -> true;
+is_literal_op(erlang, '<', 2) -> true;
+is_literal_op(erlang, '=<', 2) -> true;
+is_literal_op(erlang, '>', 2) -> true;
+is_literal_op(erlang, '>=', 2) -> true;
+is_literal_op(erlang, 'and', 2) -> true;
+is_literal_op(erlang, 'or', 2) -> true;
+is_literal_op(erlang, 'not', 1) -> true;
+is_literal_op(erlang, length, 1) -> true;
+is_literal_op(erlang, size, 1) -> true;
+is_literal_op(erlang, fun_info, 1) -> true;
+is_literal_op(erlang, fun_info, 2) -> true;
+is_literal_op(erlang, fun_to_list, 1) -> true;
+is_literal_op(erlang, throw, 1) -> true;
+is_literal_op(erlang, exit, 1) -> true;
+is_literal_op(erlang, error, 1) -> true;
+is_literal_op(erlang, error, 2) -> true;
+is_literal_op(M, F, A) when is_atom(M), is_atom(F), is_integer(A) -> false.
+
+%%------------------------------------------------------------
%% Set
%%
-record(set, {set :: sets:set()}).
set__singleton(Val) ->
- #set{set = sets:add_element(Val, sets:new())}.
+ #set{set = sets:add_element(Val, sets:new([{version, 2}]))}.
set__from_list(List) ->
- #set{set = sets:from_list(List)}.
+ #set{set = sets:from_list(List, [{version, 2}])}.
set__is_element(_El, none) ->
false;
diff --git a/lib/dialyzer/src/dialyzer_dot.erl b/lib/dialyzer/src/dialyzer_dot.erl
index 210067a2ab..4caaf53f0c 100644
--- a/lib/dialyzer/src/dialyzer_dot.erl
+++ b/lib/dialyzer/src/dialyzer_dot.erl
@@ -41,7 +41,7 @@
%% filename is the name of the resulting .dot file the GraphName is
%% pretty much useless.
%%
-%% The resulting .dot reprsentation will be stored in the flie FileName.
+%% The resulting .dot representation will be stored in the file FileName.
%%
%% Interfaces:
%%
@@ -115,12 +115,12 @@ node_format(Opt, Fun, V) ->
Tmp = io_lib:format("~p", [Fun(V)]),
String = lists:flatten(Tmp),
%% io:format("~p", [String]),
- {Width, Heigth} = calc_dim(String),
+ {Width, Height} = calc_dim(String),
W = ((Width div 7) + 1) * 0.55,
- H = Heigth * 0.4,
+ H = Height * 0.4,
SL = io_lib:format("~f", [W]),
SH = io_lib:format("~f", [H]),
- [String, " [width=", SL, " heigth=", SH, " ", OptText,"];\n"].
+ [String, " [width=", SL, " height=", SH, " ", OptText,"];\n"].
edge_format(Opt, Fun, V1, V2) ->
OptText =
diff --git a/lib/dialyzer/src/dialyzer_gui_wx.erl b/lib/dialyzer/src/dialyzer_gui_wx.erl
index 3a24f140e0..3b04b56f80 100644
--- a/lib/dialyzer/src/dialyzer_gui_wx.erl
+++ b/lib/dialyzer/src/dialyzer_gui_wx.erl
@@ -242,7 +242,6 @@ create_window(Wx, #options{init_plts = InitPltFiles} = DialyzerOptions) ->
{?WARN_OPAQUE, ?menuID_WARN_OPAQUE},
{?WARN_FAILING_CALL, ?menuID_WARN_FAIL_FUN_CALLS},
{?WARN_CALLGRAPH, ?menuID_WARN_UNEXPORTED_FUN},
- {?WARN_RACE_CONDITION, ?menuID_WARN_RACE_CONDITIONS},
%% For contracts.
{?WARN_CONTRACT_TYPES,?menuID_WARN_WRONG_CONTRACTS},
{?WARN_CONTRACT_SYNTAX, ?menuID_WARN_CONTRACT_SYNTAX}
@@ -313,8 +312,6 @@ createWarningsMenu() ->
"Functions of no return"),
addCheckedItem(WarningsMenu, ?menuID_WARN_UNEXPORTED_FUN,
"Call to unexported function"),
- _ = wxMenu:appendCheckItem(WarningsMenu, ?menuID_WARN_RACE_CONDITIONS,
- "Possible race conditions"),
addCheckedItem(WarningsMenu, ?menuID_WARN_WRONG_CONTRACTS, "Wrong contracts"),
addCheckedItem(WarningsMenu, ?menuID_WARN_CONTRACT_SYNTAX,
"Wrong contract syntax"),
diff --git a/lib/dialyzer/src/dialyzer_gui_wx.hrl b/lib/dialyzer/src/dialyzer_gui_wx.hrl
index fe763a9abc..0a6ca9e8b2 100644
--- a/lib/dialyzer/src/dialyzer_gui_wx.hrl
+++ b/lib/dialyzer/src/dialyzer_gui_wx.hrl
@@ -31,9 +31,8 @@
-define(menuID_WARN_ERROR_HANDLING_FUN, 206).
-define(menuID_WARN_NO_RETURN_FUN, 207).
-define(menuID_WARN_UNEXPORTED_FUN, 208).
--define(menuID_WARN_RACE_CONDITIONS, 209).
--define(menuID_WARN_WRONG_CONTRACTS, 210).
--define(menuID_WARN_CONTRACT_SYNTAX, 211).
+-define(menuID_WARN_WRONG_CONTRACTS, 209).
+-define(menuID_WARN_CONTRACT_SYNTAX, 210).
-define(menuID_PLT_INIT_EMPTY, 300).
-define(menuID_PLT_SHOW_CONTENTS, 301).
diff --git a/lib/dialyzer/src/dialyzer_options.erl b/lib/dialyzer/src/dialyzer_options.erl
index 44c75d60c1..5a56e0b0cb 100644
--- a/lib/dialyzer/src/dialyzer_options.erl
+++ b/lib/dialyzer/src/dialyzer_options.erl
@@ -105,12 +105,12 @@ adapt_get_warnings(Opts = #options{analysis_type = Mode,
%% default.
case is_plt_mode(Mode) of
true ->
- case Warns =:= maybe of
+ case Warns =:= 'maybe' of
true -> Opts#options{get_warnings = false};
false -> Opts
end;
false ->
- case Warns =:= maybe of
+ case Warns =:= 'maybe' of
true -> Opts#options{get_warnings = true};
false -> Opts
end
@@ -333,25 +333,37 @@ build_warnings([Opt|Opts], Warnings) ->
ordsets:add_element(?WARN_UNMATCHED_RETURN, Warnings);
error_handling ->
ordsets:add_element(?WARN_RETURN_ONLY_EXIT, Warnings);
- race_conditions ->
- ordsets:add_element(?WARN_RACE_CONDITION, Warnings);
no_missing_calls ->
ordsets:del_element(?WARN_CALLGRAPH, Warnings);
specdiffs ->
- S = ordsets:from_list([?WARN_CONTRACT_SUBTYPE,
- ?WARN_CONTRACT_SUPERTYPE,
- ?WARN_CONTRACT_NOT_EQUAL]),
- ordsets:union(S, Warnings);
+ S = ordsets:from_list([?WARN_CONTRACT_SUBTYPE,
+ ?WARN_CONTRACT_SUPERTYPE,
+ ?WARN_CONTRACT_NOT_EQUAL,
+ ?WARN_CONTRACT_MISSING_RETURN,
+ ?WARN_CONTRACT_EXTRA_RETURN]),
+ ordsets:union(S, Warnings);
overspecs ->
- ordsets:add_element(?WARN_CONTRACT_SUBTYPE, Warnings);
+ S = ordsets:from_list([?WARN_CONTRACT_SUBTYPE,
+ ?WARN_CONTRACT_MISSING_RETURN]),
+ ordsets:union(S, Warnings);
underspecs ->
- ordsets:add_element(?WARN_CONTRACT_SUPERTYPE, Warnings);
+ S = ordsets:from_list([?WARN_CONTRACT_SUPERTYPE,
+ ?WARN_CONTRACT_EXTRA_RETURN]),
+ ordsets:union(S, Warnings);
no_underspecs ->
- ordsets:del_element(?WARN_CONTRACT_SUPERTYPE, Warnings);
+ ordsets:del_element(?WARN_CONTRACT_SUPERTYPE, Warnings);
+ extra_return ->
+ ordsets:add_element(?WARN_CONTRACT_EXTRA_RETURN, Warnings);
+ no_extra_return ->
+ ordsets:del_element(?WARN_CONTRACT_EXTRA_RETURN, Warnings);
+ missing_return ->
+ ordsets:add_element(?WARN_CONTRACT_MISSING_RETURN, Warnings);
+ no_missing_return ->
+ ordsets:del_element(?WARN_CONTRACT_MISSING_RETURN, Warnings);
unknown ->
- ordsets:add_element(?WARN_UNKNOWN, Warnings);
+ ordsets:add_element(?WARN_UNKNOWN, Warnings);
OtherAtom ->
- bad_option("Unknown dialyzer warning option", OtherAtom)
+ bad_option("Unknown dialyzer warning option", OtherAtom)
end,
build_warnings(Opts, NewWarnings);
build_warnings([], Warnings) ->
diff --git a/lib/dialyzer/src/dialyzer_plt.erl b/lib/dialyzer/src/dialyzer_plt.erl
index 8fd38a8922..409d1f65c5 100644
--- a/lib/dialyzer/src/dialyzer_plt.erl
+++ b/lib/dialyzer/src/dialyzer_plt.erl
@@ -50,13 +50,16 @@
get_specs/1,
get_specs/4,
to_file/4,
- delete/1
+ delete/1,
+ get_all_types/1,
+ get_all_contracts/1,
+ get_all_callbacks/1
]).
%% Debug utilities
-export([pp_non_returning/0, pp_mod/1]).
--export_type([plt/0, plt_info/0]).
+-export_type([plt/0, file_md5/0]).
-include_lib("stdlib/include/ms_transform.hrl").
@@ -89,7 +92,6 @@
-include("dialyzer.hrl").
-type file_md5() :: {file:filename(), binary()}.
--type plt_info() :: {[file_md5()], dict:dict()}.
-record(file_plt, {version = "" :: string(),
file_md5_list = [] :: [file_md5()],
@@ -235,12 +237,12 @@ contains_mfa(#plt{info = Info, contracts = Contracts}, MFA) ->
get_default_plt() ->
case os:getenv("DIALYZER_PLT") of
false ->
- {ok,[[HomeDir]]} = init:get_argument(home),
- filename:join(HomeDir, ".dialyzer_plt");
+ CacheDir = filename:basedir(user_cache, "erlang"),
+ filename:join(CacheDir, ".dialyzer_plt");
UserSpecPlt -> UserSpecPlt
end.
--spec plt_and_info_from_file(file:filename()) -> {plt(), plt_info()}.
+-spec plt_and_info_from_file(file:filename()) -> {plt(), #plt_info{}}.
plt_and_info_from_file(FileName) ->
from_file(FileName, true).
@@ -296,8 +298,8 @@ from_file1(Plt, FileName, ReturnInfo) ->
case ReturnInfo of
false -> {ok, Plt};
true ->
- PltInfo = {Rec#file_plt.file_md5_list,
- Rec#file_plt.mod_deps},
+ PltInfo = #plt_info{files = Rec#file_plt.file_md5_list,
+ mod_deps = Rec#file_plt.mod_deps},
{ok, {Plt, PltInfo}}
end
end;
@@ -407,8 +409,8 @@ find_duplicates(List) ->
ModList = [filename:basename(E) || E <- List],
SortedList = lists:usort(ModList),
lists:usort(ModList -- SortedList).
-
--spec to_file(file:filename(), plt(), mod_deps(), {[file_md5()], mod_deps()}) -> 'ok'.
+
+-spec to_file(file:filename(), plt(), mod_deps(), #plt_info{}) -> 'ok'.
%% Write the PLT to file, and delete the PLT.
to_file(FileName, Plt, ModDeps, MD5_OldModDeps) ->
@@ -423,7 +425,7 @@ to_file(FileName, Plt, ModDeps, MD5_OldModDeps) ->
to_file1(FileName,
#plt{info = ETSInfo, types = ETSTypes, contracts = ETSContracts,
callbacks = ETSCallbacks, exported_types = ETSExpTypes},
- ModDeps, {MD5, OldModDeps}) ->
+ ModDeps, #plt_info{files = MD5, mod_deps = OldModDeps}) ->
NewModDeps = dict:merge(fun(_Key, OldVal, NewVal) ->
ordsets:union(OldVal, NewVal)
end,
@@ -845,3 +847,24 @@ pp_mod(Mod) when is_atom(Mod) ->
io:format("dialyzer: Found no module named '~s' in the PLT\n", [Mod])
end,
delete(Plt).
+
+
+%% Returns all contracts stored in the PLT
+-spec get_all_contracts(plt()) -> #{mfa() => #contract{}}.
+get_all_contracts(#plt{contracts = ETSContracts}) ->
+ maps:from_list(ets:tab2list(ETSContracts)).
+
+%% Returns all callbacks stored in the PLT
+-spec get_all_callbacks(plt()) -> #{mfa() => #contract{}}.
+get_all_callbacks(#plt{callbacks = ETSCallbacks}) ->
+ CallbacksList =
+ [Cb ||
+ {_M, Cbs} <- ets:tab2list(ETSCallbacks),
+ Cb <- Cbs],
+ maps:from_list(CallbacksList).
+
+%% Returns all types stored in the PLT
+-spec get_all_types(plt()) -> #{module() => erl_types:type_table()}.
+get_all_types(#plt{types = ETSTypes}) ->
+ Types = ets:tab2list(ETSTypes),
+ maps:from_list(Types).
diff --git a/lib/dialyzer/src/dialyzer_race_data_server.erl b/lib/dialyzer/src/dialyzer_race_data_server.erl
deleted file mode 100644
index 953cebfdf1..0000000000
--- a/lib/dialyzer/src/dialyzer_race_data_server.erl
+++ /dev/null
@@ -1,127 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-
-%%%-------------------------------------------------------------------
-%%% File : dialyzer_race_data_server.erl
-%%% Author : Tobias Lindahl <tobiasl@it.uu.se>
-%%% Description :
-%%%
-%%% Created : 18 Sep 2015 by Luca Favatella <luca.favatella@erlang-solutions.com>
-%%%-------------------------------------------------------------------
--module(dialyzer_race_data_server).
-
--export([new/0,
- duplicate/1,
- stop/1,
- call/2,
- cast/2]).
-
--include("dialyzer.hrl").
-
-%%----------------------------------------------------------------------
-
--record(state, {race_code = dict:new() :: dict:dict(),
- public_tables = [] :: [label()],
- named_tables = [] :: [string()],
- beh_api_calls = [] :: [{mfa(), mfa()}]}).
-
-%%----------------------------------------------------------------------
-
--spec new() -> pid().
-
-new() ->
- spawn_link(fun() -> loop(#state{}) end).
-
--spec duplicate(pid()) -> pid().
-
-duplicate(Server) ->
- call(dup, Server).
-
--spec stop(pid()) -> ok.
-
-stop(Server) ->
- cast(stop, Server).
-
--spec call(atom(), pid()) -> term().
-
-call(Query, Server) ->
- Ref = make_ref(),
- Server ! {call, self(), Ref, Query},
- receive
- {Ref, Reply} -> Reply
- end.
-
--spec cast(atom() | {atom(), term()}, pid()) -> ok.
-
-cast(Message, Server) ->
- Server ! {cast, Message},
- ok.
-
-%%----------------------------------------------------------------------
-
-loop(State) ->
- receive
- {call, From, Ref, Query} ->
- Reply = handle_call(Query, State),
- From ! {Ref, Reply},
- loop(State);
- {cast, stop} ->
- ok;
- {cast, Message} ->
- NewState = handle_cast(Message, State),
- loop(NewState)
- end.
-
-handle_cast(race_code_new, State) ->
- State#state{race_code = dict:new()};
-handle_cast({Tag, Data}, State) ->
- case Tag of
- renew_race_info -> renew_race_info_handler(Data, State);
- renew_race_code -> renew_race_code_handler(Data, State);
- renew_race_public_tables -> renew_race_public_tables_handler(Data, State);
- put_race_code -> State#state{race_code = Data};
- put_public_tables -> State#state{public_tables = Data};
- put_named_tables -> State#state{named_tables = Data};
- put_behaviour_api_calls -> State#state{beh_api_calls = Data}
- end.
-
-handle_call(Query,
- #state{race_code = RaceCode,
- public_tables = PublicTables,
- named_tables = NamedTables,
- beh_api_calls = BehApiCalls}
- = State) ->
- case Query of
- dup -> spawn_link(fun() -> loop(State) end);
- get_race_code -> RaceCode;
- get_public_tables -> PublicTables;
- get_named_tables -> NamedTables;
- get_behaviour_api_calls -> BehApiCalls
- end.
-
-%%----------------------------------------------------------------------
-
-renew_race_info_handler({RaceCode, PublicTables, NamedTables},
- #state{} = State) ->
- State#state{race_code = RaceCode,
- public_tables = PublicTables,
- named_tables = NamedTables}.
-
-renew_race_code_handler({Fun, FunArgs, Code},
- #state{race_code = RaceCode} = State) ->
- State#state{race_code = dict:store(Fun, [FunArgs, Code], RaceCode)}.
-
-renew_race_public_tables_handler(VarLabel,
- #state{public_tables = PT} = State) ->
- State#state{public_tables = ordsets:add_element(VarLabel, PT)}.
diff --git a/lib/dialyzer/src/dialyzer_races.erl b/lib/dialyzer/src/dialyzer_races.erl
deleted file mode 100644
index adefc16f99..0000000000
--- a/lib/dialyzer/src/dialyzer_races.erl
+++ /dev/null
@@ -1,2483 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-
-%%%----------------------------------------------------------------------
-%%% File : dialyzer_races.erl
-%%% Author : Maria Christakis <christakismaria@gmail.com>
-%%% Description : Utility functions for race condition detection
-%%%
-%%% Created : 21 Nov 2008 by Maria Christakis <christakismaria@gmail.com>
-%%%----------------------------------------------------------------------
--module(dialyzer_races).
-
-%% Race Analysis
-
--export([store_race_call/5, race/1, get_race_warnings/2, format_args/4]).
-
-%% Record Interfaces
-
--export([beg_clause_new/3, cleanup/1, end_case_new/1, end_clause_new/3,
- get_curr_fun/1, get_curr_fun_args/1, get_new_table/1,
- get_race_analysis/1, get_race_list/1, get_race_list_size/1,
- get_race_list_and_size/1,
- let_tag_new/2, new/0, put_curr_fun/3, put_fun_args/2,
- put_race_analysis/2, put_race_list/3]).
-
--export_type([races/0, core_vars/0]).
-
--include("dialyzer.hrl").
-
-%%% ===========================================================================
-%%%
-%%% Definitions
-%%%
-%%% ===========================================================================
-
--define(local, 5).
--define(no_arg, no_arg).
--define(no_label, no_label).
--define(bypassed, bypassed).
-
--define(WARN_WHEREIS_REGISTER, warn_whereis_register).
--define(WARN_WHEREIS_UNREGISTER, warn_whereis_unregister).
--define(WARN_ETS_LOOKUP_INSERT, warn_ets_lookup_insert).
--define(WARN_MNESIA_DIRTY_READ_WRITE, warn_mnesia_dirty_read_write).
--define(WARN_NO_WARN, warn_no_warn).
-
-%%% ===========================================================================
-%%%
-%%% Local Types
-%%%
-%%% ===========================================================================
-
--type label_type() :: label() | [label()] | {label()} | ?no_label.
--type args() :: [label_type() | [string()]].
--type core_vars() :: cerl:cerl() | ?no_arg | ?bypassed.
--type var_to_map1() :: core_vars() | [cerl:cerl()].
--type var_to_map2() :: cerl:cerl() | [cerl:cerl()] | ?bypassed.
--type core_args() :: [core_vars()] | 'empty'.
--type op() :: 'bind' | 'unbind'.
-
--type dep_calls() :: 'whereis' | 'ets_lookup' | 'mnesia_dirty_read'.
--type warn_calls() :: 'register' | 'unregister' | 'ets_insert'
- | 'mnesia_dirty_write'.
--type call() :: 'whereis' | 'register' | 'unregister' | 'ets_new'
- | 'ets_lookup' | 'ets_insert' | 'mnesia_dirty_read1'
- | 'mnesia_dirty_read2' | 'mnesia_dirty_write1'
- | 'mnesia_dirty_write2' | 'function_call'.
--type race_tag() :: 'whereis_register' | 'whereis_unregister'
- | 'ets_lookup_insert' | 'mnesia_dirty_read_write'.
-
-%% The following type is similar to the raw_warning() type but has a
-%% tag which is local to this module and is not propagated to outside
--type dial_race_warning() :: {race_warn_tag(), warning_info(), {atom(), [term()]}}.
--type race_warn_tag() :: ?WARN_WHEREIS_REGISTER | ?WARN_WHEREIS_UNREGISTER
- | ?WARN_ETS_LOOKUP_INSERT | ?WARN_MNESIA_DIRTY_READ_WRITE.
-
--record(beg_clause, {arg :: var_to_map1() | 'undefined',
- pats :: var_to_map1() | 'undefined',
- guard :: cerl:cerl() | 'undefined'}).
--record(end_clause, {arg :: var_to_map1() | 'undefined',
- pats :: var_to_map1() | 'undefined',
- guard :: cerl:cerl() | 'undefined'}).
--record(end_case, {clauses :: [#end_clause{}]}).
--record(curr_fun, {status :: 'in' | 'out' | 'undefined',
- mfa :: dialyzer_callgraph:mfa_or_funlbl()
- | 'undefined',
- label :: label() | 'undefined',
- def_vars :: [core_vars()] | 'undefined',
- arg_types :: [erl_types:erl_type()] | 'undefined',
- call_vars :: [core_vars()] | 'undefined',
- var_map :: dict:dict() | 'undefined'}).
--record(dep_call, {call_name :: dep_calls(),
- args :: args() | 'undefined',
- arg_types :: [erl_types:erl_type()],
- vars :: [core_vars()],
- state :: dialyzer_dataflow:state(),
- file_loc :: file_location(),
- var_map :: dict:dict() | 'undefined'}).
--record(fun_call, {caller :: dialyzer_callgraph:mfa_or_funlbl(),
- callee :: dialyzer_callgraph:mfa_or_funlbl(),
- arg_types :: [erl_types:erl_type()],
- vars :: [core_vars()]}).
--record(let_tag, {var :: var_to_map1(),
- arg :: var_to_map1()}).
--record(warn_call, {call_name :: warn_calls(),
- args :: args(),
- var_map :: dict:dict() | 'undefined'}).
-
--type case_tags() :: 'beg_case' | #beg_clause{} | #end_clause{} | #end_case{}.
--type code() :: [#dep_call{} | #fun_call{} | #warn_call{} |
- #curr_fun{} | #let_tag{} | case_tags() | race_tag()].
-
--type table_var() :: label() | ?no_label.
--type table() :: {'named', table_var(), [string()]} | 'other' | 'no_t'.
-
--record(race_fun, {mfa :: mfa(),
- args :: args(),
- arg_types :: [erl_types:erl_type()],
- vars :: [core_vars()],
- file_loc :: file_location(),
- index :: non_neg_integer(),
- fun_mfa :: dialyzer_callgraph:mfa_or_funlbl(),
- fun_label :: label()}).
-
--record(races, {curr_fun :: dialyzer_callgraph:mfa_or_funlbl()
- | 'undefined',
- curr_fun_label :: label() | 'undefined',
- curr_fun_args = 'empty' :: core_args(),
- new_table = 'no_t' :: table(),
- race_list = [] :: code(),
- race_list_size = 0 :: non_neg_integer(),
- race_tags = [] :: [#race_fun{}],
- %% true for fun types and warning mode
- race_analysis = false :: boolean(),
- race_warnings = [] :: [dial_race_warning()]}).
-
-%%% ===========================================================================
-%%%
-%%% Exported Types
-%%%
-%%% ===========================================================================
-
--opaque races() :: #races{}.
-
-%%% ===========================================================================
-%%%
-%%% Race Analysis
-%%%
-%%% ===========================================================================
-
--spec store_race_call(dialyzer_callgraph:mfa_or_funlbl(),
- [erl_types:erl_type()], [core_vars()],
- file_location(), dialyzer_dataflow:state()) ->
- dialyzer_dataflow:state().
-
-store_race_call(Fun, ArgTypes, Args, FileLocation, State) ->
- Races = dialyzer_dataflow:state__get_races(State),
- CurrFun = Races#races.curr_fun,
- CurrFunLabel = Races#races.curr_fun_label,
- RaceTags = Races#races.race_tags,
- CleanState = dialyzer_dataflow:state__records_only(State),
- {NewRaceList, NewRaceListSize, NewRaceTags, NewTable} =
- case CurrFun of
- {_Module, module_info, A} when A =:= 0 orelse A =:= 1 ->
- {[], 0, RaceTags, no_t};
- _Thing ->
- RaceList = Races#races.race_list,
- RaceListSize = Races#races.race_list_size,
- case Fun of
- {erlang, get_module_info, A} when A =:= 1 orelse A =:= 2 ->
- {[], 0, RaceTags, no_t};
- {erlang, register, 2} ->
- VarArgs = format_args(Args, ArgTypes, CleanState, register),
- RaceFun = #race_fun{mfa = Fun, args = VarArgs,
- arg_types = ArgTypes, vars = Args,
- file_loc = FileLocation, index = RaceListSize,
- fun_mfa = CurrFun, fun_label = CurrFunLabel},
- {[#warn_call{call_name = register, args = VarArgs}|
- RaceList], RaceListSize + 1, [RaceFun|RaceTags], no_t};
- {erlang, unregister, 1} ->
- VarArgs = format_args(Args, ArgTypes, CleanState, unregister),
- RaceFun = #race_fun{mfa = Fun, args = VarArgs,
- arg_types = ArgTypes, vars = Args,
- file_loc = FileLocation, index = RaceListSize,
- fun_mfa = CurrFun, fun_label = CurrFunLabel},
- {[#warn_call{call_name = unregister, args = VarArgs}|
- RaceList], RaceListSize + 1, [RaceFun|RaceTags], no_t};
- {erlang, whereis, 1} ->
- VarArgs = format_args(Args, ArgTypes, CleanState, whereis),
- {[#dep_call{call_name = whereis, args = VarArgs,
- arg_types = ArgTypes, vars = Args,
- state = CleanState, file_loc = FileLocation}|
- RaceList], RaceListSize + 1, RaceTags, no_t};
- {ets, insert, 2} ->
- VarArgs = format_args(Args, ArgTypes, CleanState, ets_insert),
- RaceFun = #race_fun{mfa = Fun, args = VarArgs,
- arg_types = ArgTypes, vars = Args,
- file_loc = FileLocation, index = RaceListSize,
- fun_mfa = CurrFun, fun_label = CurrFunLabel},
- {[#warn_call{call_name = ets_insert, args = VarArgs}|
- RaceList], RaceListSize + 1, [RaceFun|RaceTags], no_t};
- {ets, lookup, 2} ->
- VarArgs = format_args(Args, ArgTypes, CleanState, ets_lookup),
- {[#dep_call{call_name = ets_lookup, args = VarArgs,
- arg_types = ArgTypes, vars = Args,
- state = CleanState, file_loc = FileLocation}|
- RaceList], RaceListSize + 1, RaceTags, no_t};
- {ets, new, 2} ->
- VarArgs = format_args(Args, ArgTypes, CleanState, ets_new),
- [VarArgs1, VarArgs2, _, Options] = VarArgs,
- NewTable1 =
- case lists:member("'public'", Options) of
- true ->
- case lists:member("'named_table'", Options) of
- true ->
- {named, VarArgs1, VarArgs2};
- false -> other
- end;
- false -> no_t
- end,
- {RaceList, RaceListSize, RaceTags, NewTable1};
- {mnesia, dirty_read, A} when A =:= 1 orelse A =:= 2 ->
- VarArgs =
- case A of
- 1 ->
- format_args(Args, ArgTypes, CleanState, mnesia_dirty_read1);
- 2 ->
- format_args(Args, ArgTypes, CleanState, mnesia_dirty_read2)
- end,
- {[#dep_call{call_name = mnesia_dirty_read, args = VarArgs,
- arg_types = ArgTypes, vars = Args,
- state = CleanState, file_loc = FileLocation}|RaceList],
- RaceListSize + 1, RaceTags, no_t};
- {mnesia, dirty_write, A} when A =:= 1 orelse A =:= 2 ->
- VarArgs =
- case A of
- 1 ->
- format_args(Args, ArgTypes, CleanState, mnesia_dirty_write1);
- 2 ->
- format_args(Args, ArgTypes, CleanState, mnesia_dirty_write2)
- end,
- RaceFun = #race_fun{mfa = Fun, args = VarArgs,
- arg_types = ArgTypes, vars = Args,
- file_loc = FileLocation, index = RaceListSize,
- fun_mfa = CurrFun, fun_label = CurrFunLabel},
- {[#warn_call{call_name = mnesia_dirty_write,
- args = VarArgs}|RaceList],
- RaceListSize + 1, [RaceFun|RaceTags], no_t};
- Int when is_integer(Int) ->
- {[#fun_call{caller = CurrFun, callee = Int, arg_types = ArgTypes,
- vars = Args}|RaceList],
- RaceListSize + 1, RaceTags, no_t};
- _Other ->
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- case digraph:vertex(dialyzer_callgraph:get_digraph(Callgraph),
- Fun) of
- {Fun, confirmed} ->
- {[#fun_call{caller = CurrFun, callee = Fun,
- arg_types = ArgTypes, vars = Args}|RaceList],
- RaceListSize + 1, RaceTags, no_t};
- false ->
- {RaceList, RaceListSize, RaceTags, no_t}
- end
- end
- end,
- state__renew_info(NewRaceList, NewRaceListSize, NewRaceTags, NewTable, State).
-
--spec race(dialyzer_dataflow:state()) -> dialyzer_dataflow:state().
-
-race(State) ->
- Races = dialyzer_dataflow:state__get_races(State),
- RaceTags = Races#races.race_tags,
- RetState =
- case RaceTags of
- [] -> State;
- [#race_fun{mfa = Fun,
- args = VarArgs, arg_types = ArgTypes,
- vars = Args, file_loc = FileLocation,
- index = Index, fun_mfa = CurrFun,
- fun_label = CurrFunLabel}|T] ->
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- {ok, [_Args, Code]} =
- dict:find(CurrFun, dialyzer_callgraph:get_race_code(Callgraph)),
- RaceList = lists:reverse(Code),
- RaceWarnTag =
- case Fun of
- {erlang, register, 2} -> ?WARN_WHEREIS_REGISTER;
- {erlang, unregister, 1} -> ?WARN_WHEREIS_UNREGISTER;
- {ets, insert, 2} -> ?WARN_ETS_LOOKUP_INSERT;
- {mnesia, dirty_write, _A} -> ?WARN_MNESIA_DIRTY_READ_WRITE
- end,
- State1 =
- state__renew_curr_fun(CurrFun,
- state__renew_curr_fun_label(CurrFunLabel,
- state__renew_race_list(lists:nthtail(length(RaceList) - Index,
- RaceList), State))),
- DepList = fixup_race_list(RaceWarnTag, VarArgs, State1),
- {State2, RaceWarn} =
- get_race_warn(Fun, Args, ArgTypes, DepList, State),
- {File, Location} = FileLocation,
- CurrMFA = dialyzer_dataflow:state__find_function(CurrFun, State),
- WarningInfo = {File, Location, CurrMFA},
- race(
- state__add_race_warning(
- state__renew_race_tags(T, State2), RaceWarn, RaceWarnTag,
- WarningInfo))
- end,
- state__renew_race_tags([], RetState).
-
-fixup_race_list(RaceWarnTag, WarnVarArgs, State) ->
- Races = dialyzer_dataflow:state__get_races(State),
- CurrFun = Races#races.curr_fun,
- CurrFunLabel = Races#races.curr_fun_label,
- RaceList = Races#races.race_list,
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- Digraph = dialyzer_callgraph:get_digraph(Callgraph),
- Calls = digraph:edges(Digraph),
- RaceTag =
- case RaceWarnTag of
- ?WARN_WHEREIS_REGISTER -> whereis_register;
- ?WARN_WHEREIS_UNREGISTER -> whereis_unregister;
- ?WARN_ETS_LOOKUP_INSERT -> ets_lookup_insert;
- ?WARN_MNESIA_DIRTY_READ_WRITE -> mnesia_dirty_read_write
- end,
- NewRaceList = [RaceTag|RaceList],
- CleanState = dialyzer_dataflow:state__cleanup(State),
- NewState = state__renew_race_list(NewRaceList, CleanState),
- DepList1 =
- fixup_race_forward_pullout(CurrFun, CurrFunLabel, Calls,
- lists:reverse(NewRaceList), [], CurrFun,
- WarnVarArgs, RaceWarnTag, dict:new(),
- [], [], [], 2 * ?local, NewState),
- Parents = fixup_race_backward(CurrFun, Calls, Calls, [], ?local),
- UParents = lists:usort(Parents),
- Filtered = filter_parents(UParents, UParents, Digraph),
- NewParents =
- case lists:member(CurrFun, Filtered) of
- true -> Filtered;
- false -> [CurrFun|Filtered]
- end,
- DepList2 =
- fixup_race_list_helper(NewParents, Calls, CurrFun, WarnVarArgs,
- RaceWarnTag, NewState),
- dialyzer_dataflow:dispose_state(CleanState),
- lists:usort(cleanup_dep_calls(DepList1 ++ DepList2)).
-
-fixup_race_list_helper(Parents, Calls, CurrFun, WarnVarArgs, RaceWarnTag,
- State) ->
- case Parents of
- [] -> [];
- [Head|Tail] ->
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- Code =
- case dict:find(Head, dialyzer_callgraph:get_race_code(Callgraph)) of
- error -> [];
- {ok, [_A, C]} -> C
- end,
- {ok, FunLabel} = dialyzer_callgraph:lookup_label(Head, Callgraph),
- DepList1 =
- fixup_race_forward_pullout(Head, FunLabel, Calls, Code, [], CurrFun,
- WarnVarArgs, RaceWarnTag, dict:new(),
- [], [], [], 2 * ?local, State),
- DepList2 =
- fixup_race_list_helper(Tail, Calls, CurrFun, WarnVarArgs,
- RaceWarnTag, State),
- DepList1 ++ DepList2
- end.
-
-%%% ===========================================================================
-%%%
-%%% Forward Analysis
-%%%
-%%% ===========================================================================
-
-fixup_race_forward_pullout(CurrFun, CurrFunLabel, Calls, Code, RaceList,
- InitFun, WarnVarArgs, RaceWarnTag, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NestingLevel,
- State) ->
- TState = dialyzer_dataflow:state__duplicate(State),
- {DepList, NewCurrFun, NewCurrFunLabel, NewCalls,
- NewCode, NewRaceList, NewRaceVarMap, NewFunDefVars,
- NewFunCallVars, NewFunArgTypes, NewNestingLevel} =
- fixup_race_forward(CurrFun, CurrFunLabel, Calls, Code, RaceList,
- InitFun, WarnVarArgs, RaceWarnTag, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NestingLevel,
- cleanup_race_code(TState)),
- dialyzer_dataflow:dispose_state(TState),
- case NewCode of
- [] -> DepList;
- [#fun_call{caller = NewCurrFun, callee = Call, arg_types = FunTypes,
- vars = FunArgs}|Tail] ->
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- OkCall = {ok, Call},
- {Name, Label} =
- case is_integer(Call) of
- true ->
- case dialyzer_callgraph:lookup_name(Call, Callgraph) of
- error -> {OkCall, OkCall};
- N -> {N, OkCall}
- end;
- false ->
- {OkCall, dialyzer_callgraph:lookup_label(Call, Callgraph)}
- end,
- {NewCurrFun1, NewCurrFunLabel1, NewCalls1, NewCode1, NewRaceList1,
- NewRaceVarMap1, NewFunDefVars1, NewFunCallVars1, NewFunArgTypes1,
- NewNestingLevel1} =
- case Label =:= error of
- true ->
- {NewCurrFun, NewCurrFunLabel, NewCalls, Tail, NewRaceList,
- NewRaceVarMap, NewFunDefVars, NewFunCallVars, NewFunArgTypes,
- NewNestingLevel};
- false ->
- {ok, Fun} = Name,
- {ok, Int} = Label,
- case dict:find(Fun, dialyzer_callgraph:get_race_code(Callgraph)) of
- error ->
- {NewCurrFun, NewCurrFunLabel, NewCalls, Tail, NewRaceList,
- NewRaceVarMap, NewFunDefVars, NewFunCallVars, NewFunArgTypes,
- NewNestingLevel};
- {ok, [Args, CodeB]} ->
- Races = dialyzer_dataflow:state__get_races(State),
- {RetCurrFun, RetCurrFunLabel, RetCalls, RetCode,
- RetRaceList, RetRaceVarMap, RetFunDefVars, RetFunCallVars,
- RetFunArgTypes, RetNestingLevel} =
- fixup_race_forward_helper(NewCurrFun,
- NewCurrFunLabel, Fun, Int, NewCalls, NewCalls,
- [#curr_fun{status = out, mfa = NewCurrFun,
- label = NewCurrFunLabel,
- var_map = NewRaceVarMap,
- def_vars = NewFunDefVars,
- call_vars = NewFunCallVars,
- arg_types = NewFunArgTypes}|
- Tail],
- NewRaceList, InitFun, FunArgs, FunTypes, RaceWarnTag,
- NewRaceVarMap, NewFunDefVars, NewFunCallVars,
- NewFunArgTypes, NewNestingLevel, Args, CodeB,
- Races#races.race_list),
- case RetCode of
- [#curr_fun{}|_CodeTail] ->
- {NewCurrFun, NewCurrFunLabel, RetCalls, RetCode,
- RetRaceList, NewRaceVarMap, NewFunDefVars,
- NewFunCallVars, NewFunArgTypes, RetNestingLevel};
- _Else ->
- {RetCurrFun, RetCurrFunLabel, RetCalls, RetCode,
- RetRaceList, RetRaceVarMap, RetFunDefVars,
- RetFunCallVars, RetFunArgTypes, RetNestingLevel}
- end
- end
- end,
- DepList ++
- fixup_race_forward_pullout(NewCurrFun1, NewCurrFunLabel1, NewCalls1,
- NewCode1, NewRaceList1, InitFun, WarnVarArgs,
- RaceWarnTag, NewRaceVarMap1, NewFunDefVars1,
- NewFunCallVars1, NewFunArgTypes1,
- NewNestingLevel1, State)
- end.
-
-fixup_race_forward(CurrFun, CurrFunLabel, Calls, Code, RaceList,
- InitFun, WarnVarArgs, RaceWarnTag, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NestingLevel,
- State) ->
- case Code of
- [] ->
- {[], CurrFun, CurrFunLabel, Calls, Code, RaceList, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NestingLevel};
- [Head|Tail] ->
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- {NewRL, DepList, NewNL, Return} =
- case Head of
- #dep_call{call_name = whereis} ->
- case RaceWarnTag of
- WarnWhereis when WarnWhereis =:= ?WARN_WHEREIS_REGISTER orelse
- WarnWhereis =:= ?WARN_WHEREIS_UNREGISTER ->
- {[Head#dep_call{var_map = RaceVarMap}|RaceList],
- [], NestingLevel, false};
- _Other ->
- {RaceList, [], NestingLevel, false}
- end;
- #dep_call{call_name = ets_lookup} ->
- case RaceWarnTag of
- ?WARN_ETS_LOOKUP_INSERT ->
- {[Head#dep_call{var_map = RaceVarMap}|RaceList],
- [], NestingLevel, false};
- _Other ->
- {RaceList, [], NestingLevel, false}
- end;
- #dep_call{call_name = mnesia_dirty_read} ->
- case RaceWarnTag of
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- {[Head#dep_call{var_map = RaceVarMap}|RaceList],
- [], NestingLevel, false};
- _Other ->
- {RaceList, [], NestingLevel, false}
- end;
- #warn_call{call_name = RegCall} when RegCall =:= register orelse
- RegCall =:= unregister ->
- case RaceWarnTag of
- WarnWhereis when WarnWhereis =:= ?WARN_WHEREIS_REGISTER orelse
- WarnWhereis =:= ?WARN_WHEREIS_UNREGISTER ->
- {[Head#warn_call{var_map = RaceVarMap}|RaceList],
- [], NestingLevel, false};
- _Other ->
- {RaceList, [], NestingLevel, false}
- end;
- #warn_call{call_name = ets_insert} ->
- case RaceWarnTag of
- ?WARN_ETS_LOOKUP_INSERT ->
- {[Head#warn_call{var_map = RaceVarMap}|RaceList],
- [], NestingLevel, false};
- _Other ->
- {RaceList, [], NestingLevel, false}
- end;
- #warn_call{call_name = mnesia_dirty_write} ->
- case RaceWarnTag of
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- {[Head#warn_call{var_map = RaceVarMap}|RaceList],
- [], NestingLevel, false};
- _Other ->
- {RaceList, [], NestingLevel, false}
- end;
- #fun_call{caller = CurrFun, callee = InitFun} ->
- {RaceList, [], NestingLevel, false};
- #fun_call{caller = CurrFun} ->
- {RaceList, [], NestingLevel - 1, false};
- beg_case ->
- {[Head|RaceList], [], NestingLevel, false};
- #beg_clause{} ->
- {[#beg_clause{}|RaceList], [], NestingLevel, false};
- #end_clause{} ->
- {[#end_clause{}|RaceList], [], NestingLevel, false};
- #end_case{} ->
- {[Head|RaceList], [], NestingLevel, false};
- #let_tag{} ->
- {RaceList, [], NestingLevel, false};
- #curr_fun{status = in, mfa = InitFun,
- label = _InitFunLabel, var_map = _NewRVM,
- def_vars = NewFDV, call_vars = NewFCV,
- arg_types = _NewFAT} ->
- {[#curr_fun{status = out, var_map = RaceVarMap,
- def_vars = NewFDV, call_vars = NewFCV}|
- RaceList], [], NestingLevel - 1, false};
- #curr_fun{status = in, def_vars = NewFDV,
- call_vars = NewFCV} ->
- {[#curr_fun{status = out, var_map = RaceVarMap,
- def_vars = NewFDV, call_vars = NewFCV}|
- RaceList],
- [], NestingLevel - 1, false};
- #curr_fun{status = out} ->
- {[#curr_fun{status = in, var_map = RaceVarMap}|RaceList], [],
- NestingLevel + 1, false};
- RaceTag ->
- PublicTables = dialyzer_callgraph:get_public_tables(Callgraph),
- NamedTables = dialyzer_callgraph:get_named_tables(Callgraph),
- WarnVarArgs1 =
- var_type_analysis(FunDefVars, FunArgTypes, WarnVarArgs,
- RaceWarnTag, RaceVarMap,
- dialyzer_dataflow:state__records_only(State)),
- {NewDepList, IsPublic, _Return} =
- get_deplist_paths(RaceList, WarnVarArgs1, RaceWarnTag,
- RaceVarMap, 0, PublicTables, NamedTables),
- {NewHead, NewDepList1} =
- case RaceTag of
- whereis_register ->
- {[#warn_call{call_name = register, args = WarnVarArgs,
- var_map = RaceVarMap}],
- NewDepList};
- whereis_unregister ->
- {[#warn_call{call_name = unregister, args = WarnVarArgs,
- var_map = RaceVarMap}],
- NewDepList};
- ets_lookup_insert ->
- NewWarnCall =
- [#warn_call{call_name = ets_insert, args = WarnVarArgs,
- var_map = RaceVarMap}],
- [Tab, Names, _, _] = WarnVarArgs,
- case IsPublic orelse
- compare_var_list(Tab, PublicTables, RaceVarMap)
- orelse
- length(Names -- NamedTables) < length(Names) of
- true ->
- {NewWarnCall, NewDepList};
- false -> {NewWarnCall, []}
- end;
- mnesia_dirty_read_write ->
- {[#warn_call{call_name = mnesia_dirty_write,
- args = WarnVarArgs, var_map = RaceVarMap}],
- NewDepList}
- end,
- {NewHead ++ RaceList, NewDepList1, NestingLevel,
- is_last_race(RaceTag, InitFun, Tail, Callgraph)}
- end,
- {NewCurrFun, NewCurrFunLabel, NewCode, NewRaceList, NewRaceVarMap,
- NewFunDefVars, NewFunCallVars, NewFunArgTypes, NewNestingLevel,
- PullOut} =
- case Head of
- #fun_call{caller = CurrFun} ->
- case NewNL =:= 0 of
- true ->
- {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NewNL, false};
- false ->
- {CurrFun, CurrFunLabel, Code, NewRL, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NewNL, true}
- end;
- #beg_clause{arg = Arg, pats = Pats, guard = Guard} ->
- {RaceVarMap1, RemoveClause} =
- race_var_map_guard(Arg, Pats, Guard, RaceVarMap, bind),
- case RemoveClause of
- true ->
- {RaceList2,
- #curr_fun{mfa = CurrFun2, label = CurrFunLabel2,
- var_map = RaceVarMap2, def_vars = FunDefVars2,
- call_vars = FunCallVars2, arg_types = FunArgTypes2},
- Code2, NestingLevel2} =
- remove_clause(NewRL,
- #curr_fun{mfa = CurrFun, label = CurrFunLabel,
- var_map = RaceVarMap1,
- def_vars = FunDefVars,
- call_vars = FunCallVars,
- arg_types = FunArgTypes},
- Tail, NewNL),
- {CurrFun2, CurrFunLabel2, Code2, RaceList2,
- RaceVarMap2, FunDefVars2, FunCallVars2, FunArgTypes2,
- NestingLevel2, false};
- false ->
- {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap1,
- FunDefVars, FunCallVars, FunArgTypes, NewNL, false}
- end;
- #end_clause{arg = Arg, pats = Pats, guard = Guard} ->
- {RaceVarMap1, _RemoveClause} =
- race_var_map_guard(Arg, Pats, Guard, RaceVarMap, unbind),
- {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap1,
- FunDefVars, FunCallVars, FunArgTypes, NewNL,
- false};
- #end_case{clauses = Clauses} ->
- RaceVarMap1 =
- race_var_map_clauses(Clauses, RaceVarMap),
- {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap1,
- FunDefVars, FunCallVars, FunArgTypes, NewNL,
- false};
- #let_tag{var = Var, arg = Arg} ->
- {CurrFun, CurrFunLabel, Tail, NewRL,
- race_var_map(Var, Arg, RaceVarMap, bind), FunDefVars,
- FunCallVars, FunArgTypes, NewNL, false};
- #curr_fun{mfa = CurrFun1, label = CurrFunLabel1,
- var_map = RaceVarMap1, def_vars = FunDefVars1,
- call_vars = FunCallVars1, arg_types = FunArgTypes1} ->
- case NewNL =:= 0 of
- true ->
- {CurrFun, CurrFunLabel,
- remove_nonlocal_functions(Tail, 1), NewRL, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NewNL, false};
- false ->
- {CurrFun1, CurrFunLabel1, Tail, NewRL, RaceVarMap1,
- FunDefVars1, FunCallVars1, FunArgTypes1, NewNL, false}
- end;
- _Thing ->
- {CurrFun, CurrFunLabel, Tail, NewRL, RaceVarMap,
- FunDefVars, FunCallVars, FunArgTypes, NewNL, false}
- end,
- case Return of
- true ->
- {DepList, NewCurrFun, NewCurrFunLabel, Calls,
- [], NewRaceList, NewRaceVarMap, NewFunDefVars,
- NewFunCallVars, NewFunArgTypes, NewNestingLevel};
- false ->
- NewNestingLevel1 =
- case NewNestingLevel =:= 0 of
- true -> NewNestingLevel + 1;
- false -> NewNestingLevel
- end,
- case PullOut of
- true ->
- {DepList, NewCurrFun, NewCurrFunLabel, Calls,
- NewCode, NewRaceList, NewRaceVarMap, NewFunDefVars,
- NewFunCallVars, NewFunArgTypes, NewNestingLevel1};
- false ->
- {RetDepList, NewCurrFun1, NewCurrFunLabel1, NewCalls1,
- NewCode1, NewRaceList1, NewRaceVarMap1, NewFunDefVars1,
- NewFunCallVars1, NewFunArgTypes1, NewNestingLevel2} =
- fixup_race_forward(NewCurrFun, NewCurrFunLabel, Calls,
- NewCode, NewRaceList, InitFun, WarnVarArgs,
- RaceWarnTag, NewRaceVarMap, NewFunDefVars,
- NewFunCallVars, NewFunArgTypes,
- NewNestingLevel1, State),
- {DepList ++ RetDepList, NewCurrFun1, NewCurrFunLabel1,
- NewCalls1, NewCode1, NewRaceList1, NewRaceVarMap1,
- NewFunDefVars1, NewFunCallVars1, NewFunArgTypes1,
- NewNestingLevel2}
- end
- end
- end.
-
-get_deplist_paths(RaceList, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel,
- PublicTables, NamedTables) ->
- case RaceList of
- [] -> {[], false, true};
- [Head|Tail] ->
- case Head of
- #end_case{} ->
- {RaceList1, DepList1, IsPublic1, Continue1} =
- handle_case(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel,
- PublicTables, NamedTables),
- case Continue1 of
- true ->
- {DepList2, IsPublic2, Continue2} =
- get_deplist_paths(RaceList1, WarnVarArgs, RaceWarnTag,
- RaceVarMap, CurrLevel, PublicTables,
- NamedTables),
- {DepList1 ++ DepList2, IsPublic1 orelse IsPublic2, Continue2};
- false -> {DepList1, IsPublic1, false}
- end;
- #beg_clause{} ->
- get_deplist_paths(fixup_before_case_path(Tail), WarnVarArgs,
- RaceWarnTag, RaceVarMap, CurrLevel, PublicTables,
- NamedTables);
- #curr_fun{status = in, var_map = RaceVarMap1} ->
- {DepList, IsPublic, Continue} =
- get_deplist_paths(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap,
- CurrLevel + 1, PublicTables, NamedTables),
- IsPublic1 =
- case RaceWarnTag of
- ?WARN_ETS_LOOKUP_INSERT ->
- [Tabs, Names, _, _] = WarnVarArgs,
- IsPublic orelse
- lists:any(
- fun (T) ->
- compare_var_list(T, PublicTables, RaceVarMap1)
- end, Tabs)
- orelse
- length(Names -- NamedTables) < length(Names);
- _ -> true
- end,
- {DepList, IsPublic1, Continue};
- #curr_fun{status = out, var_map = RaceVarMap1, def_vars = FunDefVars,
- call_vars = FunCallVars} ->
- WarnVarArgs1 =
- var_analysis([format_arg(DefVar) || DefVar <- FunDefVars],
- [format_arg(CallVar) || CallVar <- FunCallVars],
- WarnVarArgs, RaceWarnTag),
- {WarnVarArgs2, Stop} =
- case RaceWarnTag of
- ?WARN_WHEREIS_REGISTER ->
- [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs1,
- Vars =
- lists:flatten(
- [find_all_bound_vars(V, RaceVarMap1) || V <- WVA1]),
- case {Vars, CurrLevel} of
- {[], 0} ->
- {WarnVarArgs, true};
- {[], _} ->
- {WarnVarArgs, false};
- _ ->
- {[Vars, WVA2, WVA3, WVA4], false}
- end;
- ?WARN_WHEREIS_UNREGISTER ->
- [WVA1, WVA2] = WarnVarArgs1,
- Vars =
- lists:flatten(
- [find_all_bound_vars(V, RaceVarMap1) || V <- WVA1]),
- case {Vars, CurrLevel} of
- {[], 0} ->
- {WarnVarArgs, true};
- {[], _} ->
- {WarnVarArgs, false};
- _ ->
- {[Vars, WVA2], false}
- end;
- ?WARN_ETS_LOOKUP_INSERT ->
- [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs1,
- Vars1 =
- lists:flatten(
- [find_all_bound_vars(V1, RaceVarMap1) || V1 <- WVA1]),
- Vars2 =
- lists:flatten(
- [find_all_bound_vars(V2, RaceVarMap1) || V2 <- WVA3]),
- case {Vars1, Vars2, CurrLevel} of
- {[], _, 0} ->
- {WarnVarArgs, true};
- {[], _, _} ->
- {WarnVarArgs, false};
- {_, [], 0} ->
- {WarnVarArgs, true};
- {_, [], _} ->
- {WarnVarArgs, false};
- _ ->
- {[Vars1, WVA2, Vars2, WVA4], false}
- end;
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- [WVA1, WVA2|T] = WarnVarArgs1,
- Vars =
- lists:flatten(
- [find_all_bound_vars(V, RaceVarMap1) || V <- WVA1]),
- case {Vars, CurrLevel} of
- {[], 0} ->
- {WarnVarArgs, true};
- {[], _} ->
- {WarnVarArgs, false};
- _ ->
- {[Vars, WVA2|T], false}
- end
- end,
- case Stop of
- true -> {[], false, false};
- false ->
- CurrLevel1 =
- case CurrLevel of
- 0 -> CurrLevel;
- _ -> CurrLevel - 1
- end,
- get_deplist_paths(Tail, WarnVarArgs2, RaceWarnTag, RaceVarMap1,
- CurrLevel1, PublicTables, NamedTables)
- end;
- #warn_call{call_name = RegCall, args = WarnVarArgs1,
- var_map = RaceVarMap1} when RegCall =:= register orelse
- RegCall =:= unregister ->
- case compare_first_arg(WarnVarArgs, WarnVarArgs1, RaceVarMap1) of
- true -> {[], false, false};
- NewWarnVarArgs ->
- get_deplist_paths(Tail, NewWarnVarArgs, RaceWarnTag, RaceVarMap,
- CurrLevel, PublicTables, NamedTables)
- end;
- #warn_call{call_name = ets_insert, args = WarnVarArgs1,
- var_map = RaceVarMap1} ->
- case compare_ets_insert(WarnVarArgs, WarnVarArgs1, RaceVarMap1) of
- true -> {[], false, false};
- NewWarnVarArgs ->
- get_deplist_paths(Tail, NewWarnVarArgs, RaceWarnTag, RaceVarMap,
- CurrLevel, PublicTables, NamedTables)
- end;
- #warn_call{call_name = mnesia_dirty_write, args = WarnVarArgs1,
- var_map = RaceVarMap1} ->
- case compare_first_arg(WarnVarArgs, WarnVarArgs1, RaceVarMap1) of
- true -> {[], false, false};
- NewWarnVarArgs ->
- get_deplist_paths(Tail, NewWarnVarArgs, RaceWarnTag, RaceVarMap,
- CurrLevel, PublicTables, NamedTables)
- end;
- #dep_call{var_map = RaceVarMap1} ->
- {DepList, IsPublic, Continue} =
- get_deplist_paths(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap,
- CurrLevel, PublicTables, NamedTables),
- {refine_race(Head, WarnVarArgs, RaceWarnTag, DepList, RaceVarMap1),
- IsPublic, Continue}
- end
- end.
-
-handle_case(RaceList, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel,
- PublicTables, NamedTables) ->
- case RaceList of
- [] -> {[], [], false, true};
- [Head|Tail] ->
- case Head of
- #end_clause{} ->
- {RestRaceList, DepList1, IsPublic1, Continue1} =
- do_clause(Tail, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel,
- PublicTables, NamedTables),
- {RetRaceList, DepList2, IsPublic2, Continue2} =
- handle_case(RestRaceList, WarnVarArgs, RaceWarnTag, RaceVarMap,
- CurrLevel, PublicTables, NamedTables),
- {RetRaceList, DepList1 ++ DepList2, IsPublic1 orelse IsPublic2,
- Continue1 orelse Continue2};
- beg_case -> {Tail, [], false, false}
- end
- end.
-
-do_clause(RaceList, WarnVarArgs, RaceWarnTag, RaceVarMap, CurrLevel,
- PublicTables, NamedTables) ->
- {DepList, IsPublic, Continue} =
- get_deplist_paths(fixup_case_path(RaceList, 0), WarnVarArgs,
- RaceWarnTag, RaceVarMap, CurrLevel,
- PublicTables, NamedTables),
- {fixup_case_rest_paths(RaceList, 0), DepList, IsPublic, Continue}.
-
-fixup_case_path(RaceList, NestingLevel) ->
- case RaceList of
- [] -> [];
- [Head|Tail] ->
- {NewNestingLevel, Return} =
- case Head of
- beg_case -> {NestingLevel - 1, false};
- #end_case{} -> {NestingLevel + 1, false};
- #beg_clause{} ->
- case NestingLevel =:= 0 of
- true -> {NestingLevel, true};
- false -> {NestingLevel, false}
- end;
- _Other -> {NestingLevel, false}
- end,
- case Return of
- true -> [];
- false -> [Head|fixup_case_path(Tail, NewNestingLevel)]
- end
- end.
-
-%% Gets the race list before a case clause.
-fixup_before_case_path(RaceList) ->
- case RaceList of
- [] -> [];
- [Head|Tail] ->
- case Head of
- #end_clause{} ->
- fixup_before_case_path(fixup_case_rest_paths(Tail, 0));
- beg_case -> Tail
- end
- end.
-
-fixup_case_rest_paths(RaceList, NestingLevel) ->
- case RaceList of
- [] -> [];
- [Head|Tail] ->
- {NewNestingLevel, Return} =
- case Head of
- beg_case -> {NestingLevel - 1, false};
- #end_case{} -> {NestingLevel + 1, false};
- #beg_clause{} ->
- case NestingLevel =:= 0 of
- true -> {NestingLevel, true};
- false -> {NestingLevel, false}
- end;
- _Other -> {NestingLevel, false}
- end,
- case Return of
- true -> Tail;
- false -> fixup_case_rest_paths(Tail, NewNestingLevel)
- end
- end.
-
-fixup_race_forward_helper(CurrFun, CurrFunLabel, Fun, FunLabel,
- Calls, CallsToAnalyze, Code, RaceList,
- InitFun, NewFunArgs, NewFunTypes,
- RaceWarnTag, RaceVarMap, FunDefVars,
- FunCallVars, FunArgTypes, NestingLevel,
- Args, CodeB, StateRaceList) ->
- case Calls of
- [] ->
- {NewRaceList,
- #curr_fun{mfa = NewCurrFun, label = NewCurrFunLabel,
- var_map = NewRaceVarMap, def_vars = NewFunDefVars,
- call_vars = NewFunCallVars, arg_types = NewFunArgTypes},
- NewCode, NewNestingLevel} =
- remove_clause(RaceList,
- #curr_fun{mfa = CurrFun, label = CurrFunLabel, var_map = RaceVarMap,
- def_vars = FunDefVars, call_vars = FunCallVars,
- arg_types = FunArgTypes},
- Code, NestingLevel),
- {NewCurrFun, NewCurrFunLabel, CallsToAnalyze, NewCode, NewRaceList,
- NewRaceVarMap, NewFunDefVars, NewFunCallVars, NewFunArgTypes,
- NewNestingLevel};
- [Head|Tail] ->
- case Head of
- {InitFun, InitFun} when CurrFun =:= InitFun, Fun =:= InitFun ->
- NewCallsToAnalyze = lists:delete(Head, CallsToAnalyze),
- NewRaceVarMap =
- race_var_map(Args, NewFunArgs, RaceVarMap, bind),
- RetC =
- fixup_all_calls(InitFun, InitFun, FunLabel, Args,
- CodeB ++
- [#curr_fun{status = out, mfa = InitFun,
- label = CurrFunLabel, var_map = RaceVarMap,
- def_vars = FunDefVars, call_vars = FunCallVars,
- arg_types = FunArgTypes}],
- Code, RaceVarMap),
- NewCode =
- fixup_all_calls(InitFun, InitFun, FunLabel, Args,
- CodeB ++
- [#curr_fun{status = out, mfa = InitFun,
- label = CurrFunLabel, var_map = NewRaceVarMap,
- def_vars = Args, call_vars = NewFunArgs,
- arg_types = NewFunTypes}],
- [#curr_fun{status = in, mfa = Fun,
- label = FunLabel, var_map = NewRaceVarMap,
- def_vars = Args, call_vars = NewFunArgs,
- arg_types = NewFunTypes}|
- lists:reverse(StateRaceList)] ++
- RetC, NewRaceVarMap),
- {InitFun, FunLabel, NewCallsToAnalyze, NewCode, RaceList,
- NewRaceVarMap, Args, NewFunArgs, NewFunTypes, NestingLevel};
- {CurrFun, Fun} ->
- NewCallsToAnalyze = lists:delete(Head, CallsToAnalyze),
- NewRaceVarMap = race_var_map(Args, NewFunArgs, RaceVarMap, bind),
- RetC =
- case Fun of
- InitFun ->
- fixup_all_calls(CurrFun, Fun, FunLabel, Args,
- lists:reverse(StateRaceList) ++
- [#curr_fun{status = out, mfa = CurrFun,
- label = CurrFunLabel, var_map = RaceVarMap,
- def_vars = FunDefVars, call_vars = FunCallVars,
- arg_types = FunArgTypes}],
- Code, RaceVarMap);
- _Other1 ->
- fixup_all_calls(CurrFun, Fun, FunLabel, Args,
- CodeB ++
- [#curr_fun{status = out, mfa = CurrFun,
- label = CurrFunLabel, var_map = RaceVarMap,
- def_vars = FunDefVars, call_vars = FunCallVars,
- arg_types = FunArgTypes}],
- Code, RaceVarMap)
- end,
- NewCode =
- case Fun of
- InitFun ->
- [#curr_fun{status = in, mfa = Fun,
- label = FunLabel, var_map = NewRaceVarMap,
- def_vars = Args, call_vars = NewFunArgs,
- arg_types = NewFunTypes}|
- lists:reverse(StateRaceList)] ++ RetC;
- _ ->
- [#curr_fun{status = in, mfa = Fun,
- label = FunLabel, var_map = NewRaceVarMap,
- def_vars = Args, call_vars = NewFunArgs,
- arg_types = NewFunTypes}|CodeB] ++
- RetC
- end,
- {Fun, FunLabel, NewCallsToAnalyze, NewCode, RaceList, NewRaceVarMap,
- Args, NewFunArgs, NewFunTypes, NestingLevel};
- {_TupleA, _TupleB} ->
- fixup_race_forward_helper(CurrFun, CurrFunLabel, Fun, FunLabel,
- Tail, CallsToAnalyze, Code, RaceList, InitFun, NewFunArgs,
- NewFunTypes, RaceWarnTag, RaceVarMap, FunDefVars, FunCallVars,
- FunArgTypes, NestingLevel, Args, CodeB, StateRaceList)
- end
- end.
-
-%%% ===========================================================================
-%%%
-%%% Backward Analysis
-%%%
-%%% ===========================================================================
-
-fixup_race_backward(CurrFun, Calls, CallsToAnalyze, Parents, Height) ->
- case Height =:= 0 of
- true -> Parents;
- false ->
- case Calls of
- [] ->
- case is_integer(CurrFun) orelse lists:member(CurrFun, Parents) of
- true -> Parents;
- false -> [CurrFun|Parents]
- end;
- [Head|Tail] ->
- {Parent, TupleB} = Head,
- case TupleB =:= CurrFun of
- true -> % more paths are needed
- NewCallsToAnalyze = lists:delete(Head, CallsToAnalyze),
- NewParents =
- fixup_race_backward(Parent, NewCallsToAnalyze,
- NewCallsToAnalyze, Parents, Height - 1),
- fixup_race_backward(CurrFun, Tail, NewCallsToAnalyze, NewParents,
- Height);
- false ->
- fixup_race_backward(CurrFun, Tail, CallsToAnalyze, Parents,
- Height)
- end
- end
- end.
-
-%%% ===========================================================================
-%%%
-%%% Utilities
-%%%
-%%% ===========================================================================
-
-are_bound_labels(Label1, Label2, RaceVarMap) ->
- case dict:find(Label1, RaceVarMap) of
- error -> false;
- {ok, Labels} ->
- lists:member(Label2, Labels) orelse
- are_bound_labels_helper(Labels, Label1, Label2, RaceVarMap)
- end.
-
-are_bound_labels_helper(Labels, OldLabel, CompLabel, RaceVarMap) ->
- case dict:size(RaceVarMap) of
- 0 -> false;
- _ ->
- case Labels of
- [] -> false;
- [Head|Tail] ->
- NewRaceVarMap = dict:erase(OldLabel, RaceVarMap),
- are_bound_labels(Head, CompLabel, NewRaceVarMap) orelse
- are_bound_labels_helper(Tail, Head, CompLabel, NewRaceVarMap)
- end
- end.
-
-are_bound_vars(Vars1, Vars2, RaceVarMap) ->
- case is_list(Vars1) andalso is_list(Vars2) of
- true ->
- case Vars1 of
- [] -> false;
- [AHead|ATail] ->
- case Vars2 of
- [] -> false;
- [PHead|PTail] ->
- are_bound_vars(AHead, PHead, RaceVarMap) andalso
- are_bound_vars(ATail, PTail, RaceVarMap)
- end
- end;
- false ->
- {NewVars1, NewVars2, IsList} =
- case is_list(Vars1) of
- true ->
- case Vars1 of
- [Var1] -> {Var1, Vars2, true};
- _Thing -> {Vars1, Vars2, false}
- end;
- false ->
- case is_list(Vars2) of
- true ->
- case Vars2 of
- [Var2] -> {Vars1, Var2, true};
- _Thing -> {Vars1, Vars2, false}
- end;
- false -> {Vars1, Vars2, true}
- end
- end,
- case IsList of
- true ->
- case cerl:type(NewVars1) of
- var ->
- case cerl:type(NewVars2) of
- var ->
- ALabel = cerl_trees:get_label(NewVars1),
- PLabel = cerl_trees:get_label(NewVars2),
- are_bound_labels(ALabel, PLabel, RaceVarMap) orelse
- are_bound_labels(PLabel, ALabel, RaceVarMap);
- alias ->
- are_bound_vars(NewVars1, cerl:alias_var(NewVars2),
- RaceVarMap);
- values ->
- are_bound_vars(NewVars1, cerl:values_es(NewVars2),
- RaceVarMap);
- _Other -> false
- end;
- tuple ->
- case cerl:type(NewVars2) of
- tuple ->
- are_bound_vars(cerl:tuple_es(NewVars1),
- cerl:tuple_es(NewVars2), RaceVarMap);
- alias ->
- are_bound_vars(NewVars1, cerl:alias_var(NewVars2),
- RaceVarMap);
- values ->
- are_bound_vars(NewVars1, cerl:values_es(NewVars2),
- RaceVarMap);
- _Other -> false
- end;
- cons ->
- case cerl:type(NewVars2) of
- cons ->
- are_bound_vars(cerl:cons_hd(NewVars1),
- cerl:cons_hd(NewVars2), RaceVarMap)
- andalso
- are_bound_vars(cerl:cons_tl(NewVars1),
- cerl:cons_tl(NewVars2), RaceVarMap);
- alias ->
- are_bound_vars(NewVars1, cerl:alias_var(NewVars2),
- RaceVarMap);
- values ->
- are_bound_vars(NewVars1, cerl:values_es(NewVars2),
- RaceVarMap);
- _Other -> false
- end;
- alias ->
- case cerl:type(NewVars2) of
- alias ->
- are_bound_vars(cerl:alias_var(NewVars1),
- cerl:alias_var(NewVars2), RaceVarMap);
- _Other ->
- are_bound_vars(cerl:alias_var(NewVars1),
- NewVars2, RaceVarMap)
- end;
- values ->
- case cerl:type(NewVars2) of
- values ->
- are_bound_vars(cerl:values_es(NewVars1),
- cerl:values_es(NewVars2), RaceVarMap);
- _Other ->
- are_bound_vars(cerl:values_es(NewVars1),
- NewVars2, RaceVarMap)
- end;
- _Other -> false
- end;
- false -> false
- end
- end.
-
-callgraph__renew_tables(Table, Callgraph) ->
- case Table of
- {named, NameLabel, Names} ->
- PTablesToAdd =
- case NameLabel of
- ?no_label -> [];
- _Other -> [NameLabel]
- end,
- NamesToAdd = filter_named_tables(Names),
- PTables = dialyzer_callgraph:get_public_tables(Callgraph),
- NTables = dialyzer_callgraph:get_named_tables(Callgraph),
- dialyzer_callgraph:put_public_tables(
- lists:usort(PTablesToAdd ++ PTables),
- dialyzer_callgraph:put_named_tables(
- NamesToAdd ++ NTables, Callgraph));
- _Other ->
- Callgraph
- end.
-
-cleanup_clause_code(#curr_fun{mfa = CurrFun} = CurrTuple, Code,
- NestingLevel, LocalNestingLevel) ->
- case Code of
- [] -> {CurrTuple, []};
- [Head|Tail] ->
- {NewLocalNestingLevel, NewNestingLevel, NewCurrTuple, Return} =
- case Head of
- beg_case ->
- {LocalNestingLevel, NestingLevel + 1, CurrTuple, false};
- #end_case{} ->
- {LocalNestingLevel, NestingLevel - 1, CurrTuple, false};
- #end_clause{} ->
- case NestingLevel =:= 0 of
- true ->
- {LocalNestingLevel, NestingLevel, CurrTuple, true};
- false ->
- {LocalNestingLevel, NestingLevel, CurrTuple, false}
- end;
- #fun_call{caller = CurrFun} ->
- {LocalNestingLevel - 1, NestingLevel, CurrTuple, false};
- #curr_fun{status = in} ->
- {LocalNestingLevel - 1, NestingLevel, Head, false};
- #curr_fun{status = out} ->
- {LocalNestingLevel + 1, NestingLevel, Head, false};
- Other when Other =/= #fun_call{} ->
- {LocalNestingLevel, NestingLevel, CurrTuple, false}
- end,
- case Return of
- true -> {NewCurrTuple, Tail};
- false ->
- cleanup_clause_code(NewCurrTuple, Tail, NewNestingLevel,
- NewLocalNestingLevel)
- end
- end.
-
-cleanup_dep_calls(DepList) ->
- case DepList of
- [] -> [];
- [#dep_call{call_name = CallName, arg_types = ArgTypes,
- vars = Vars, state = State, file_loc = FileLocation}|T] ->
- [#dep_call{call_name = CallName, arg_types = ArgTypes,
- vars = Vars, state = State, file_loc = FileLocation}|
- cleanup_dep_calls(T)]
- end.
-
-cleanup_race_code(State) ->
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- dialyzer_dataflow:state__put_callgraph(
- dialyzer_callgraph:race_code_new(Callgraph), State).
-
-filter_named_tables(NamesList) ->
- case NamesList of
- [] -> [];
- [Head|Tail] ->
- NewHead =
- case string:find(Head, "()", trailing) of
- nomatch -> [Head];
- _Other -> []
- end,
- NewHead ++ filter_named_tables(Tail)
- end.
-
-filter_parents(Parents, NewParents, Digraph) ->
- case Parents of
- [] -> NewParents;
- [Head|Tail] ->
- NewParents1 = filter_parents_helper1(Head, Tail, NewParents, Digraph),
- filter_parents(Tail, NewParents1, Digraph)
- end.
-
-filter_parents_helper1(First, Rest, NewParents, Digraph) ->
- case Rest of
- [] -> NewParents;
- [Head|Tail] ->
- NewParents1 = filter_parents_helper2(First, Head, NewParents, Digraph),
- filter_parents_helper1(First, Tail, NewParents1, Digraph)
- end.
-
-filter_parents_helper2(Parent1, Parent2, NewParents, Digraph) ->
- case digraph:get_path(Digraph, Parent1, Parent2) of
- false ->
- case digraph:get_path(Digraph, Parent2, Parent1) of
- false -> NewParents;
- _Vertices -> NewParents -- [Parent1]
- end;
- _Vertices -> NewParents -- [Parent2]
- end.
-
-find_all_bound_vars(Label, RaceVarMap) ->
- case dict:find(Label, RaceVarMap) of
- error -> [Label];
- {ok, Labels} ->
- lists:usort(Labels ++
- find_all_bound_vars_helper(Labels, Label, RaceVarMap))
- end.
-
-find_all_bound_vars_helper(Labels, Label, RaceVarMap) ->
- case dict:size(RaceVarMap) of
- 0 -> [];
- _ ->
- case Labels of
- [] -> [];
- [Head|Tail] ->
- NewRaceVarMap = dict:erase(Label, RaceVarMap),
- find_all_bound_vars(Head, NewRaceVarMap) ++
- find_all_bound_vars_helper(Tail, Head, NewRaceVarMap)
- end
- end.
-
-fixup_all_calls(CurrFun, NextFun, NextFunLabel, Args, CodeToReplace,
- Code, RaceVarMap) ->
- case Code of
- [] -> [];
- [Head|Tail] ->
- NewCode =
- case Head of
- #fun_call{caller = CurrFun, callee = Callee,
- arg_types = FunArgTypes, vars = FunArgs}
- when Callee =:= NextFun orelse Callee =:= NextFunLabel ->
- RaceVarMap1 = race_var_map(Args, FunArgs, RaceVarMap, bind),
- [#curr_fun{status = in, mfa = NextFun, label = NextFunLabel,
- var_map = RaceVarMap1, def_vars = Args,
- call_vars = FunArgs, arg_types = FunArgTypes}|
- CodeToReplace];
- _Other -> [Head]
- end,
- RetCode =
- fixup_all_calls(CurrFun, NextFun, NextFunLabel, Args, CodeToReplace,
- Tail, RaceVarMap),
- NewCode ++ RetCode
- end.
-
-is_last_race(RaceTag, InitFun, Code, Callgraph) ->
- case Code of
- [] -> true;
- [Head|Tail] ->
- case Head of
- RaceTag -> false;
- #fun_call{callee = Fun} ->
- FunName =
- case is_integer(Fun) of
- true ->
- case dialyzer_callgraph:lookup_name(Fun, Callgraph) of
- error -> Fun;
- {ok, Name} -> Name
- end;
- false -> Fun
- end,
- Digraph = dialyzer_callgraph:get_digraph(Callgraph),
- case FunName =:= InitFun orelse
- digraph:get_path(Digraph, FunName, InitFun) of
- false -> is_last_race(RaceTag, InitFun, Tail, Callgraph);
- _Vertices -> false
- end;
- _Other -> is_last_race(RaceTag, InitFun, Tail, Callgraph)
- end
- end.
-
-lists_key_member(Member, List, N) when is_integer(Member) ->
- case List of
- [] -> 0;
- [Head|Tail] ->
- NewN = N + 1,
- case Head of
- Member -> NewN;
- _Other -> lists_key_member(Member, Tail, NewN)
- end
- end;
-lists_key_member(_M, _L, _N) ->
- 0.
-
-lists_key_member_lists(MemberList, List) ->
- case MemberList of
- [] -> 0;
- [Head|Tail] ->
- case lists_key_member(Head, List, 0) of
- 0 -> lists_key_member_lists(Tail, List);
- Other -> Other
- end
- end.
-
-lists_key_members_lists(MemberList, List) ->
- case MemberList of
- [] -> [];
- [Head|Tail] ->
- lists:usort(
- lists_key_members_lists_helper(Head, List, 1) ++
- lists_key_members_lists(Tail, List))
- end.
-
-lists_key_members_lists_helper(Elem, List, N) when is_integer(Elem) ->
- case List of
- [] -> [];
- [Head|Tail] ->
- NewHead =
- case Head =:= Elem of
- true -> [N];
- false -> []
- end,
- NewHead ++ lists_key_members_lists_helper(Elem, Tail, N + 1)
- end;
-lists_key_members_lists_helper(_Elem, _List, _N) ->
- [0].
-
-lists_key_replace(N, List, NewMember) ->
- {Before, [_|After]} = lists:split(N - 1, List),
- Before ++ [NewMember|After].
-
-lists_get(0, _List) -> ?no_label;
-lists_get(N, List) -> lists:nth(N, List).
-
-refine_race(RaceCall, WarnVarArgs, RaceWarnTag, DependencyList, RaceVarMap) ->
- case RaceWarnTag of
- WarnWhereis when WarnWhereis =:= ?WARN_WHEREIS_REGISTER orelse
- WarnWhereis =:= ?WARN_WHEREIS_UNREGISTER ->
- case RaceCall of
- #dep_call{call_name = ets_lookup} ->
- DependencyList;
- #dep_call{call_name = mnesia_dirty_read} ->
- DependencyList;
- #dep_call{call_name = whereis, args = VarArgs} ->
- refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag,
- DependencyList, RaceVarMap)
- end;
- ?WARN_ETS_LOOKUP_INSERT ->
- case RaceCall of
- #dep_call{call_name = whereis} ->
- DependencyList;
- #dep_call{call_name = mnesia_dirty_read} ->
- DependencyList;
- #dep_call{call_name = ets_lookup, args = VarArgs} ->
- refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag,
- DependencyList, RaceVarMap)
- end;
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- case RaceCall of
- #dep_call{call_name = whereis} ->
- DependencyList;
- #dep_call{call_name = ets_lookup} ->
- DependencyList;
- #dep_call{call_name = mnesia_dirty_read, args = VarArgs} ->
- refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag,
- DependencyList, RaceVarMap)
- end
- end.
-
-refine_race_helper(RaceCall, VarArgs, WarnVarArgs, RaceWarnTag, DependencyList,
- RaceVarMap) ->
- case compare_types(VarArgs, WarnVarArgs, RaceWarnTag, RaceVarMap) of
- true -> [RaceCall|DependencyList];
- false -> DependencyList
- end.
-
-remove_clause(RaceList, CurrTuple, Code, NestingLevel) ->
- NewRaceList = fixup_case_rest_paths(RaceList, 0),
- {NewCurrTuple, NewCode} =
- cleanup_clause_code(CurrTuple, Code, 0, NestingLevel),
- ReturnTuple = {NewRaceList, NewCurrTuple, NewCode, NestingLevel},
- case NewRaceList of
- [beg_case|RTail] ->
- case NewCode of
- [#end_case{}|CTail] ->
- remove_clause(RTail, NewCurrTuple, CTail, NestingLevel);
- _Other -> ReturnTuple
- end;
- _Else -> ReturnTuple
- end.
-
-remove_nonlocal_functions(Code, NestingLevel) ->
- case Code of
- [] -> [];
- [H|T] ->
- NewNL =
- case H of
- #curr_fun{status = in} ->
- NestingLevel + 1;
- #curr_fun{status = out} ->
- NestingLevel - 1;
- _Other ->
- NestingLevel
- end,
- case NewNL =:= 0 of
- true -> T;
- false -> remove_nonlocal_functions(T, NewNL)
- end
- end.
-
-renew_curr_fun(CurrFun, Races) ->
- Races#races{curr_fun = CurrFun}.
-
-renew_curr_fun_label(CurrFunLabel, Races) ->
- Races#races{curr_fun_label = CurrFunLabel}.
-
-renew_race_list(RaceList, Races) ->
- Races#races{race_list = RaceList}.
-
-renew_race_list_size(RaceListSize, Races) ->
- Races#races{race_list_size = RaceListSize}.
-
-renew_race_tags(RaceTags, Races) ->
- Races#races{race_tags = RaceTags}.
-
-renew_table(Table, Races) ->
- Races#races{new_table = Table}.
-
-state__renew_curr_fun(CurrFun, State) ->
- Races = dialyzer_dataflow:state__get_races(State),
- dialyzer_dataflow:state__put_races(renew_curr_fun(CurrFun, Races), State).
-
-state__renew_curr_fun_label(CurrFunLabel, State) ->
- Races = dialyzer_dataflow:state__get_races(State),
- dialyzer_dataflow:state__put_races(
- renew_curr_fun_label(CurrFunLabel, Races), State).
-
-state__renew_race_list(RaceList, State) ->
- Races = dialyzer_dataflow:state__get_races(State),
- dialyzer_dataflow:state__put_races(renew_race_list(RaceList, Races), State).
-
-state__renew_race_tags(RaceTags, State) ->
- Races = dialyzer_dataflow:state__get_races(State),
- dialyzer_dataflow:state__put_races(renew_race_tags(RaceTags, Races), State).
-
-state__renew_info(RaceList, RaceListSize, RaceTags, Table, State) ->
- Callgraph = dialyzer_dataflow:state__get_callgraph(State),
- Races = dialyzer_dataflow:state__get_races(State),
- dialyzer_dataflow:state__put_callgraph(
- callgraph__renew_tables(Table, Callgraph),
- dialyzer_dataflow:state__put_races(
- renew_table(Table,
- renew_race_list(RaceList,
- renew_race_list_size(RaceListSize,
- renew_race_tags(RaceTags, Races)))), State)).
-
-%%% ===========================================================================
-%%%
-%%% Variable and Type Utilities
-%%%
-%%% ===========================================================================
-
-any_args(StrList) ->
- case StrList of
- [] -> false;
- [Head|Tail] ->
- case string:find(Head, "()", trailing) of
- nomatch -> any_args(Tail);
- _Other -> true
- end
- end.
-
--spec bind_dict_vars(label(), label(), dict:dict()) -> dict:dict().
-
-bind_dict_vars(Key, Label, RaceVarMap) ->
- case Key =:= Label of
- true -> RaceVarMap;
- false ->
- case dict:find(Key, RaceVarMap) of
- error -> dict:store(Key, [Label], RaceVarMap);
- {ok, Labels} ->
- case lists:member(Label, Labels) of
- true -> RaceVarMap;
- false -> dict:store(Key, [Label|Labels], RaceVarMap)
- end
- end
- end.
-
-bind_dict_vars_list(Key, Labels, RaceVarMap) ->
- case Labels of
- [] -> RaceVarMap;
- [Head|Tail] ->
- bind_dict_vars_list(Key, Tail, bind_dict_vars(Key, Head, RaceVarMap))
- end.
-
-compare_ets_insert(OldWarnVarArgs, NewWarnVarArgs, RaceVarMap) ->
- [Old1, Old2, Old3, Old4] = OldWarnVarArgs,
- [New1, New2, New3, New4] = NewWarnVarArgs,
- Bool =
- case any_args(Old2) of
- true -> compare_var_list(New1, Old1, RaceVarMap);
- false ->
- case any_args(New2) of
- true -> compare_var_list(New1, Old1, RaceVarMap);
- false -> compare_var_list(New1, Old1, RaceVarMap)
- orelse (Old2 =:= New2)
- end
- end,
- case Bool of
- true ->
- case any_args(Old4) of
- true ->
- case compare_list_vars(Old3, ets_list_args(New3), [], RaceVarMap) of
- true -> true;
- Args3 -> lists_key_replace(3, OldWarnVarArgs, Args3)
- end;
- false ->
- case any_args(New4) of
- true ->
- case compare_list_vars(Old3, ets_list_args(New3), [],
- RaceVarMap) of
- true -> true;
- Args3 -> lists_key_replace(3, OldWarnVarArgs, Args3)
- end;
- false ->
- case compare_list_vars(Old3, ets_list_args(New3), [],
- RaceVarMap) of
- true -> true;
- Args3 ->
- lists_key_replace(4,
- lists_key_replace(3, OldWarnVarArgs, Args3), Old4 -- New4)
- end
- end
- end;
- false -> OldWarnVarArgs
- end.
-
-compare_first_arg(OldWarnVarArgs, NewWarnVarArgs, RaceVarMap) ->
- [Old1, Old2|_OldT] = OldWarnVarArgs,
- [New1, New2|_NewT] = NewWarnVarArgs,
- case any_args(Old2) of
- true ->
- case compare_var_list(New1, Old1, RaceVarMap) of
- true -> true;
- false -> OldWarnVarArgs
- end;
- false ->
- case any_args(New2) of
- true ->
- case compare_var_list(New1, Old1, RaceVarMap) of
- true -> true;
- false -> OldWarnVarArgs
- end;
- false ->
- case compare_var_list(New1, Old1, RaceVarMap) of
- true -> true;
- false -> lists_key_replace(2, OldWarnVarArgs, Old2 -- New2)
- end
- end
- end.
-
-compare_argtypes(ArgTypes, WarnArgTypes) ->
- lists:any(fun (X) -> lists:member(X, WarnArgTypes) end, ArgTypes).
-
-%% Compares the argument types of the two suspicious calls.
-compare_types(VarArgs, WarnVarArgs, RaceWarnTag, RaceVarMap) ->
- case RaceWarnTag of
- ?WARN_WHEREIS_REGISTER ->
- [VA1, VA2] = VarArgs,
- [WVA1, WVA2, _, _] = WarnVarArgs,
- case any_args(VA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- case any_args(WVA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- compare_var_list(VA1, WVA1, RaceVarMap) orelse
- compare_argtypes(VA2, WVA2)
- end
- end;
- ?WARN_WHEREIS_UNREGISTER ->
- [VA1, VA2] = VarArgs,
- [WVA1, WVA2] = WarnVarArgs,
- case any_args(VA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- case any_args(WVA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- compare_var_list(VA1, WVA1, RaceVarMap) orelse
- compare_argtypes(VA2, WVA2)
- end
- end;
- ?WARN_ETS_LOOKUP_INSERT ->
- [VA1, VA2, VA3, VA4] = VarArgs,
- [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs,
- Bool =
- case any_args(VA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- case any_args(WVA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- compare_var_list(VA1, WVA1, RaceVarMap) orelse
- compare_argtypes(VA2, WVA2)
- end
- end,
- Bool andalso
- (case any_args(VA4) of
- true ->
- compare_var_list(VA3, WVA3, RaceVarMap);
- false ->
- case any_args(WVA4) of
- true ->
- compare_var_list(VA3, WVA3, RaceVarMap);
- false ->
- compare_var_list(VA3, WVA3, RaceVarMap) orelse
- compare_argtypes(VA4, WVA4)
- end
- end);
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- [VA1, VA2|_] = VarArgs, %% Two or four elements
- [WVA1, WVA2|_] = WarnVarArgs,
- case any_args(VA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- case any_args(WVA2) of
- true -> compare_var_list(VA1, WVA1, RaceVarMap);
- false ->
- compare_var_list(VA1, WVA1, RaceVarMap) orelse
- compare_argtypes(VA2, WVA2)
- end
- end
- end.
-
-compare_list_vars(VarList1, VarList2, NewVarList1, RaceVarMap) ->
- case VarList1 of
- [] ->
- case NewVarList1 of
- [] -> true;
- _Other -> NewVarList1
- end;
- [Head|Tail] ->
- NewHead =
- case compare_var_list(Head, VarList2, RaceVarMap) of
- true -> [];
- false -> [Head]
- end,
- compare_list_vars(Tail, VarList2, NewHead ++ NewVarList1, RaceVarMap)
- end.
-
-compare_vars(Var1, Var2, RaceVarMap) when is_integer(Var1), is_integer(Var2) ->
- Var1 =:= Var2 orelse
- are_bound_labels(Var1, Var2, RaceVarMap) orelse
- are_bound_labels(Var2, Var1, RaceVarMap);
-compare_vars(_Var1, _Var2, _RaceVarMap) ->
- false.
-
--spec compare_var_list(label_type(), [label_type()], dict:dict()) -> boolean().
-
-compare_var_list(Var, VarList, RaceVarMap) ->
- lists:any(fun (V) -> compare_vars(Var, V, RaceVarMap) end, VarList).
-
-ets_list_args(MaybeList) ->
- case is_list(MaybeList) of
- true ->
- try [ets_tuple_args(T) || T <- MaybeList]
- catch _:_ -> [?no_label]
- end;
- false -> [ets_tuple_args(MaybeList)]
- end.
-
-ets_list_argtypes(ListStr) ->
- ListStr1 = string:trim(ListStr, leading, "$["),
- string:trim(ListStr1, trailing, "$]$.$,").
-
-ets_tuple_args(MaybeTuple) ->
- case is_tuple(MaybeTuple) of
- true -> element(1, MaybeTuple);
- false -> ?no_label
- end.
-
-ets_tuple_argtypes2(TupleList, ElemList) ->
- case TupleList of
- [] -> ElemList;
- [H|T] ->
- ets_tuple_argtypes2(T,
- ets_tuple_argtypes2_helper(H, [], 0) ++ ElemList)
- end.
-
-ets_tuple_argtypes2_helper(TupleStr, ElemStr, NestingLevel) ->
- case TupleStr of
- [] -> [];
- [H|T] ->
- {NewElemStr, NewNestingLevel, Return} =
- case H of
- ${ when NestingLevel =:= 0 ->
- {ElemStr, NestingLevel + 1, false};
- ${ ->
- {[H|ElemStr], NestingLevel + 1, false};
- $[ ->
- {[H|ElemStr], NestingLevel + 1, false};
- $( ->
- {[H|ElemStr], NestingLevel + 1, false};
- $} ->
- {[H|ElemStr], NestingLevel - 1, false};
- $] ->
- {[H|ElemStr], NestingLevel - 1, false};
- $) ->
- {[H|ElemStr], NestingLevel - 1, false};
- $, when NestingLevel =:= 1 ->
- {lists:reverse(ElemStr), NestingLevel, true};
- _Other ->
- {[H|ElemStr], NestingLevel, false}
- end,
- case Return of
- true -> string:lexemes(NewElemStr, " |");
- false ->
- ets_tuple_argtypes2_helper(T, NewElemStr, NewNestingLevel)
- end
- end.
-
-ets_tuple_argtypes1(Str, Tuple, TupleList, NestingLevel) ->
- case Str of
- [] -> TupleList;
- [H|T] ->
- {NewTuple, NewNestingLevel, Add} =
- case H of
- ${ ->
- {[H|Tuple], NestingLevel + 1, false};
- $} ->
- case NestingLevel of
- 1 ->
- {[H|Tuple], NestingLevel - 1, true};
- _Else ->
- {[H|Tuple], NestingLevel - 1, false}
- end;
- _Other1 when NestingLevel =:= 0 ->
- {Tuple, NestingLevel, false};
- _Other2 ->
- {[H|Tuple], NestingLevel, false}
- end,
- case Add of
- true ->
- ets_tuple_argtypes1(T, [],
- [lists:reverse(NewTuple)|TupleList],
- NewNestingLevel);
- false ->
- ets_tuple_argtypes1(T, NewTuple, TupleList, NewNestingLevel)
- end
- end.
-
-format_arg(?bypassed) -> ?no_label;
-format_arg(Arg0) ->
- Arg = cerl:fold_literal(Arg0),
- case cerl:type(Arg) of
- var -> cerl_trees:get_label(Arg);
- tuple -> list_to_tuple([format_arg(A) || A <- cerl:tuple_es(Arg)]);
- cons -> [format_arg(cerl:cons_hd(Arg))|format_arg(cerl:cons_tl(Arg))];
- alias -> format_arg(cerl:alias_var(Arg));
- literal ->
- case cerl:is_c_nil(Arg) of
- true -> [];
- false -> ?no_label
- end;
- _Other -> ?no_label
- end.
-
--spec format_args([core_vars()], [erl_types:erl_type()],
- dialyzer_dataflow:state(), call()) ->
- args().
-
-format_args([], [], _State, _Call) ->
- [];
-format_args(ArgList, TypeList, CleanState, Call) ->
- format_args_2(format_args_1(ArgList, TypeList, CleanState), Call).
-
-format_args_1([Arg], [Type], CleanState) ->
- [format_arg(Arg), format_type(Type, CleanState)];
-format_args_1([Arg|Args], [Type|Types], CleanState) ->
- List =
- case Arg =:= ?bypassed of
- true -> [?no_label, format_type(Type, CleanState)];
- false ->
- case cerl:is_literal(cerl:fold_literal(Arg)) of
- true -> [?no_label, format_cerl(Arg)];
- false -> [format_arg(Arg), format_type(Type, CleanState)]
- end
- end,
- List ++ format_args_1(Args, Types, CleanState).
-
-format_args_2(StrArgList, Call) ->
- case Call of
- whereis ->
- lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |"));
- register ->
- lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |"));
- unregister ->
- lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |"));
- ets_new ->
- StrArgList1 = lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |")),
- lists_key_replace(4, StrArgList1,
- string:lexemes(ets_list_argtypes(lists:nth(4, StrArgList1)), " |"));
- ets_lookup ->
- StrArgList1 = lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |")),
- lists_key_replace(4, StrArgList1,
- string:lexemes(lists:nth(4, StrArgList1), " |"));
- ets_insert ->
- StrArgList1 = lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |")),
- lists_key_replace(4, StrArgList1,
- ets_tuple_argtypes2(
- ets_tuple_argtypes1(lists:nth(4, StrArgList1), [], [], 0),
- []));
- mnesia_dirty_read1 ->
- lists_key_replace(2, StrArgList,
- [mnesia_tuple_argtypes(T) || T <- string:lexemes(
- lists:nth(2, StrArgList), " |")]);
- mnesia_dirty_read2 ->
- lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |"));
- mnesia_dirty_write1 ->
- lists_key_replace(2, StrArgList,
- [mnesia_record_tab(R) || R <- string:lexemes(
- lists:nth(2, StrArgList), " |")]);
- mnesia_dirty_write2 ->
- lists_key_replace(2, StrArgList,
- string:lexemes(lists:nth(2, StrArgList), " |"));
- function_call -> StrArgList
- end.
-
-format_cerl(Tree) ->
- cerl_prettypr:format(cerl:set_ann(Tree, []),
- [{hook, dialyzer_utils:pp_hook()},
- {noann, true},
- {paper, 100000},
- {ribbon, 100000}
- ]).
-
-format_type(Type, State) ->
- R = dialyzer_dataflow:state__get_records(State),
- erl_types:t_to_string(Type, R).
-
-mnesia_record_tab(RecordStr) ->
- case erl_scan:string(RecordStr) of
- {ok, [{'#', _}, {atom, _, Name}|_], _} ->
- io_lib:write_string(atom_to_list(Name), $');
- _ -> RecordStr
- end.
-
-mnesia_tuple_argtypes(TupleStr) ->
- TupleStr1 = string:trim(TupleStr, leading, "${"),
- [TupleStr2|_T] = string:lexemes(TupleStr1, " ,"),
- lists:flatten(string:lexemes(TupleStr2, " |")).
-
--spec race_var_map(var_to_map1(), var_to_map2(), dict:dict(), op()) ->
- dict:dict().
-
-race_var_map(Vars1, Vars2, RaceVarMap, Op) ->
- case Vars1 =:= ?no_arg orelse Vars1 =:= ?bypassed
- orelse Vars2 =:= ?bypassed of
- true -> RaceVarMap;
- false ->
- case is_list(Vars1) andalso is_list(Vars2) of
- true ->
- case Vars1 of
- [] -> RaceVarMap;
- [AHead|ATail] ->
- case Vars2 of
- [] -> RaceVarMap;
- [PHead|PTail] ->
- NewRaceVarMap = race_var_map(AHead, PHead, RaceVarMap, Op),
- race_var_map(ATail, PTail, NewRaceVarMap, Op)
- end
- end;
- false ->
- {NewVars1, NewVars2, Bool} =
- case is_list(Vars1) of
- true ->
- case Vars1 of
- [Var1] -> {Var1, Vars2, true};
- _Thing -> {Vars1, Vars2, false}
- end;
- false ->
- case is_list(Vars2) of
- true ->
- case Vars2 of
- [Var2] -> {Vars1, Var2, true};
- _Thing -> {Vars1, Vars2, false}
- end;
- false -> {Vars1, Vars2, true}
- end
- end,
- case Bool of
- true ->
- case cerl:type(NewVars1) of
- var ->
- case cerl:type(NewVars2) of
- var ->
- ALabel = cerl_trees:get_label(NewVars1),
- PLabel = cerl_trees:get_label(NewVars2),
- case Op of
- bind ->
- TempRaceVarMap =
- bind_dict_vars(ALabel, PLabel, RaceVarMap),
- bind_dict_vars(PLabel, ALabel, TempRaceVarMap);
- unbind ->
- TempRaceVarMap =
- unbind_dict_vars(ALabel, PLabel, RaceVarMap),
- unbind_dict_vars(PLabel, ALabel, TempRaceVarMap)
- end;
- alias ->
- race_var_map(NewVars1, cerl:alias_var(NewVars2),
- RaceVarMap, Op);
- values ->
- race_var_map(NewVars1, cerl:values_es(NewVars2),
- RaceVarMap, Op);
- _Other -> RaceVarMap
- end;
- tuple ->
- case cerl:type(NewVars2) of
- tuple ->
- race_var_map(cerl:tuple_es(NewVars1),
- cerl:tuple_es(NewVars2), RaceVarMap, Op);
- alias ->
- race_var_map(NewVars1, cerl:alias_var(NewVars2),
- RaceVarMap, Op);
- values ->
- race_var_map(NewVars1, cerl:values_es(NewVars2),
- RaceVarMap, Op);
- _Other -> RaceVarMap
- end;
- cons ->
- case cerl:type(NewVars2) of
- cons ->
- NewRaceVarMap = race_var_map(cerl:cons_hd(NewVars1),
- cerl:cons_hd(NewVars2), RaceVarMap, Op),
- race_var_map(cerl:cons_tl(NewVars1),
- cerl:cons_tl(NewVars2), NewRaceVarMap, Op);
- alias ->
- race_var_map(NewVars1, cerl:alias_var(NewVars2),
- RaceVarMap, Op);
- values ->
- race_var_map(NewVars1, cerl:values_es(NewVars2),
- RaceVarMap, Op);
- _Other -> RaceVarMap
- end;
- alias ->
- case cerl:type(NewVars2) of
- alias ->
- race_var_map(cerl:alias_var(NewVars1),
- cerl:alias_var(NewVars2), RaceVarMap, Op);
- _Other ->
- race_var_map(cerl:alias_var(NewVars1),
- NewVars2, RaceVarMap, Op)
- end;
- values ->
- case cerl:type(NewVars2) of
- values ->
- race_var_map(cerl:values_es(NewVars1),
- cerl:values_es(NewVars2), RaceVarMap, Op);
- _Other ->
- race_var_map(cerl:values_es(NewVars1),
- NewVars2, RaceVarMap, Op)
- end;
- _Other -> RaceVarMap
- end;
- false -> RaceVarMap
- end
- end
- end.
-
-race_var_map_clauses(Clauses, RaceVarMap) ->
- case Clauses of
- [] -> RaceVarMap;
- [#end_clause{arg = Arg, pats = Pats, guard = Guard}|T] ->
- {RaceVarMap1, _RemoveClause} =
- race_var_map_guard(Arg, Pats, Guard, RaceVarMap, bind),
- race_var_map_clauses(T, RaceVarMap1)
- end.
-
-race_var_map_guard(Arg, Pats, Guard, RaceVarMap, Op) ->
- {NewRaceVarMap, RemoveClause} =
- case cerl:type(Guard) of
- call ->
- CallName = cerl:call_name(Guard),
- case cerl:is_literal(CallName) of
- true ->
- case cerl:concrete(CallName) of
- '=:=' ->
- [Arg1, Arg2] = cerl:call_args(Guard),
- {race_var_map(Arg1, Arg2, RaceVarMap, Op), false};
- '==' ->
- [Arg1, Arg2] = cerl:call_args(Guard),
- {race_var_map(Arg1, Arg2, RaceVarMap, Op), false};
- '=/=' ->
- case Op of
- bind ->
- [Arg1, Arg2] = cerl:call_args(Guard),
- {RaceVarMap, are_bound_vars(Arg1, Arg2, RaceVarMap)};
- unbind -> {RaceVarMap, false}
- end;
- _Other -> {RaceVarMap, false}
- end;
- false -> {RaceVarMap, false}
- end;
- _Other -> {RaceVarMap, false}
- end,
- {RaceVarMap1, RemoveClause1} =
- race_var_map_guard_helper1(Arg, Pats,
- race_var_map(Arg, Pats, NewRaceVarMap, Op), Op),
- {RaceVarMap1, RemoveClause orelse RemoveClause1}.
-
-race_var_map_guard_helper1(Arg, Pats, RaceVarMap, Op) ->
- case Arg =:= ?no_arg orelse Arg =:= ?bypassed of
- true -> {RaceVarMap, false};
- false ->
- case cerl:type(Arg) of
- call ->
- case Pats of
- [NewPat] ->
- ModName = cerl:call_module(Arg),
- CallName = cerl:call_name(Arg),
- case cerl:is_literal(ModName) andalso
- cerl:is_literal(CallName) of
- true ->
- case {cerl:concrete(ModName),
- cerl:concrete(CallName)} of
- {erlang, '=:='} ->
- race_var_map_guard_helper2(Arg, NewPat, true,
- RaceVarMap, Op);
- {erlang, '=='} ->
- race_var_map_guard_helper2(Arg, NewPat, true,
- RaceVarMap, Op);
- {erlang, '=/='} ->
- race_var_map_guard_helper2(Arg, NewPat, false,
- RaceVarMap, Op);
- _Else -> {RaceVarMap, false}
- end;
- false -> {RaceVarMap, false}
- end;
- _Other -> {RaceVarMap, false}
- end;
- _Other -> {RaceVarMap, false}
- end
- end.
-
-race_var_map_guard_helper2(Arg, Pat0, Bool, RaceVarMap, Op) ->
- Pat = cerl:fold_literal(Pat0),
- case cerl:type(Pat) of
- literal ->
- [Arg1, Arg2] = cerl:call_args(Arg),
- case cerl:concrete(Pat) of
- Bool ->
- {race_var_map(Arg1, Arg2, RaceVarMap, Op), false};
- _Else ->
- case Op of
- bind ->
- {RaceVarMap, are_bound_vars(Arg1, Arg2, RaceVarMap)};
- unbind -> {RaceVarMap, false}
- end
- end;
- _Else -> {RaceVarMap, false}
- end.
-
-unbind_dict_vars(Var, Var, RaceVarMap) ->
- RaceVarMap;
-unbind_dict_vars(Var1, Var2, RaceVarMap) ->
- case dict:find(Var1, RaceVarMap) of
- error -> RaceVarMap;
- {ok, Labels} ->
- case Labels of
- [] -> dict:erase(Var1, RaceVarMap);
- _Else ->
- case lists:member(Var2, Labels) of
- true ->
- unbind_dict_vars(Var1, Var2,
- bind_dict_vars_list(Var1, Labels -- [Var2],
- dict:erase(Var1, RaceVarMap)));
- false ->
- unbind_dict_vars_helper(Labels, Var1, Var2, RaceVarMap)
- end
- end
- end.
-
-unbind_dict_vars_helper(Labels, Key, CompLabel, RaceVarMap) ->
- case dict:size(RaceVarMap) of
- 0 -> RaceVarMap;
- _ ->
- case Labels of
- [] -> RaceVarMap;
- [Head|Tail] ->
- NewRaceVarMap =
- case are_bound_labels(Head, CompLabel, RaceVarMap) orelse
- are_bound_labels(CompLabel, Head, RaceVarMap) of
- true ->
- bind_dict_vars_list(Key, Labels -- [Head],
- dict:erase(Key, RaceVarMap));
- false -> RaceVarMap
- end,
- unbind_dict_vars_helper(Tail, Key, CompLabel, NewRaceVarMap)
- end
- end.
-
-var_analysis(FunDefArgs, FunCallArgs, WarnVarArgs, RaceWarnTag) ->
- case RaceWarnTag of
- ?WARN_WHEREIS_REGISTER ->
- [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs,
- ArgNos = lists_key_members_lists(WVA1, FunDefArgs),
- [[lists_get(N, FunCallArgs) || N <- ArgNos], WVA2, WVA3, WVA4];
- ?WARN_WHEREIS_UNREGISTER ->
- [WVA1, WVA2] = WarnVarArgs,
- ArgNos = lists_key_members_lists(WVA1, FunDefArgs),
- [[lists_get(N, FunCallArgs) || N <- ArgNos], WVA2];
- ?WARN_ETS_LOOKUP_INSERT ->
- [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs,
- ArgNos1 = lists_key_members_lists(WVA1, FunDefArgs),
- ArgNos2 = lists_key_members_lists(WVA3, FunDefArgs),
- [[lists_get(N1, FunCallArgs) || N1 <- ArgNos1], WVA2,
- [lists_get(N2, FunCallArgs) || N2 <- ArgNos2], WVA4];
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- [WVA1, WVA2|T] = WarnVarArgs,
- ArgNos = lists_key_members_lists(WVA1, FunDefArgs),
- [[lists_get(N, FunCallArgs) || N <- ArgNos], WVA2|T]
- end.
-
-var_type_analysis(FunDefArgs, FunCallTypes, WarnVarArgs, RaceWarnTag,
- RaceVarMap, CleanState) ->
- FunVarArgs = format_args(FunDefArgs, FunCallTypes, CleanState, function_call),
- case RaceWarnTag of
- ?WARN_WHEREIS_REGISTER ->
- [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs,
- Vars = find_all_bound_vars(WVA1, RaceVarMap),
- case lists_key_member_lists(Vars, FunVarArgs) of
- 0 -> [Vars, WVA2, WVA3, WVA4];
- N when is_integer(N) ->
- NewWVA2 = string:lexemes(lists:nth(N + 1, FunVarArgs), " |"),
- [Vars, NewWVA2, WVA3, WVA4]
- end;
- ?WARN_WHEREIS_UNREGISTER ->
- [WVA1, WVA2] = WarnVarArgs,
- Vars = find_all_bound_vars(WVA1, RaceVarMap),
- case lists_key_member_lists(Vars, FunVarArgs) of
- 0 -> [Vars, WVA2];
- N when is_integer(N) ->
- NewWVA2 = string:lexemes(lists:nth(N + 1, FunVarArgs), " |"),
- [Vars, NewWVA2]
- end;
- ?WARN_ETS_LOOKUP_INSERT ->
- [WVA1, WVA2, WVA3, WVA4] = WarnVarArgs,
- Vars1 = find_all_bound_vars(WVA1, RaceVarMap),
- FirstVarArg =
- case lists_key_member_lists(Vars1, FunVarArgs) of
- 0 -> [Vars1, WVA2];
- N1 when is_integer(N1) ->
- NewWVA2 = string:lexemes(lists:nth(N1 + 1, FunVarArgs), " |"),
- [Vars1, NewWVA2]
- end,
- Vars2 =
- lists:flatten(
- [find_all_bound_vars(A, RaceVarMap) || A <- ets_list_args(WVA3)]),
- case lists_key_member_lists(Vars2, FunVarArgs) of
- 0 -> FirstVarArg ++ [Vars2, WVA4];
- N2 when is_integer(N2) ->
- NewWVA4 =
- ets_tuple_argtypes2(
- ets_tuple_argtypes1(lists:nth(N2 + 1, FunVarArgs), [], [], 0),
- []),
- FirstVarArg ++ [Vars2, NewWVA4]
-
- end;
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- [WVA1, WVA2|T] = WarnVarArgs,
- Arity =
- case T of
- [] -> 1;
- _Else -> 2
- end,
- Vars = find_all_bound_vars(WVA1, RaceVarMap),
- case lists_key_member_lists(Vars, FunVarArgs) of
- 0 -> [Vars, WVA2|T];
- N when is_integer(N) ->
- NewWVA2 =
- case Arity of
- 1 ->
- [mnesia_record_tab(R) || R <- string:lexemes(
- lists:nth(2, FunVarArgs), " |")];
- 2 ->
- string:lexemes(lists:nth(N + 1, FunVarArgs), " |")
- end,
- [Vars, NewWVA2|T]
- end
- end.
-
-%%% ===========================================================================
-%%%
-%%% Warning Format Utilities
-%%%
-%%% ===========================================================================
-
-add_race_warning(Warn, #races{race_warnings = Warns} = Races) ->
- Races#races{race_warnings = [Warn|Warns]}.
-
-get_race_warn(Fun, Args, ArgTypes, DepList, State) ->
- {M, F, _A} = Fun,
- case DepList of
- [] -> {State, no_race};
- _Other ->
- {State, {race_condition, [M, F, Args, ArgTypes, State, DepList]}}
- end.
-
--spec get_race_warnings(races(), dialyzer_dataflow:state()) ->
- {races(), dialyzer_dataflow:state()}.
-
-get_race_warnings(#races{race_warnings = RaceWarnings}, State) ->
- get_race_warnings_helper(RaceWarnings, State).
-
-get_race_warnings_helper(Warnings, State) ->
- case Warnings of
- [] ->
- {dialyzer_dataflow:state__get_races(State), State};
- [H|T] ->
- {RaceWarnTag, WarningInfo, {race_condition, [M, F, A, AT, S, DepList]}} = H,
- Reason =
- case RaceWarnTag of
- ?WARN_WHEREIS_REGISTER ->
- get_reason(lists:keysort(7, DepList),
- "might fail due to a possible race condition "
- "caused by its combination with ");
- ?WARN_WHEREIS_UNREGISTER ->
- get_reason(lists:keysort(7, DepList),
- "might fail due to a possible race condition "
- "caused by its combination with ");
- ?WARN_ETS_LOOKUP_INSERT ->
- get_reason(lists:keysort(7, DepList),
- "might have an unintended effect due to " ++
- "a possible race condition " ++
- "caused by its combination with ");
- ?WARN_MNESIA_DIRTY_READ_WRITE ->
- get_reason(lists:keysort(7, DepList),
- "might have an unintended effect due to " ++
- "a possible race condition " ++
- "caused by its combination with ")
- end,
- W =
- {?WARN_RACE_CONDITION, WarningInfo,
- {race_condition,
- [M, F, dialyzer_dataflow:format_args(A, AT, S), Reason]}},
- get_race_warnings_helper(T,
- dialyzer_dataflow:state__add_warning(W, State))
- end.
-
-get_reason(DependencyList, Reason) ->
- case DependencyList of
- [] -> "";
- [#dep_call{call_name = Call, arg_types = ArgTypes, vars = Args,
- state = State, file_loc = {File, Location}}|T] ->
- R =
- Reason ++
- case Call of
- whereis -> "the erlang:whereis";
- ets_lookup -> "the ets:lookup";
- mnesia_dirty_read -> "the mnesia:dirty_read"
- end ++
- dialyzer_dataflow:format_args(Args, ArgTypes, State) ++
- " call in " ++
- filename:basename(File) ++
- " on line " ++
- lists:flatten(io_lib:write(Location)),
- case T of
- [] -> R;
- _ -> get_reason(T, R ++ ", ")
- end
- end.
-
-state__add_race_warning(State, RaceWarn, RaceWarnTag, WarningInfo) ->
- case RaceWarn of
- no_race -> State;
- _Else ->
- Races = dialyzer_dataflow:state__get_races(State),
- Warn = {RaceWarnTag, WarningInfo, RaceWarn},
- dialyzer_dataflow:state__put_races(add_race_warning(Warn, Races), State)
- end.
-
-%%% ===========================================================================
-%%%
-%%% Record Interfaces
-%%%
-%%% ===========================================================================
-
--spec beg_clause_new(var_to_map1(), var_to_map1(), cerl:cerl()) ->
- #beg_clause{}.
-
-beg_clause_new(Arg, Pats, Guard) ->
- #beg_clause{arg = Arg, pats = Pats, guard = Guard}.
-
--spec cleanup(races()) -> races().
-
-cleanup(#races{race_list = RaceList}) ->
- #races{race_list = RaceList}.
-
--spec end_case_new([#end_clause{}]) -> #end_case{}.
-
-end_case_new(Clauses) ->
- #end_case{clauses = Clauses}.
-
--spec end_clause_new(var_to_map1(), var_to_map1(), cerl:cerl()) ->
- #end_clause{}.
-
-end_clause_new(Arg, Pats, Guard) ->
- #end_clause{arg = Arg, pats = Pats, guard = Guard}.
-
--spec get_curr_fun(races()) -> dialyzer_callgraph:mfa_or_funlbl().
-
-get_curr_fun(#races{curr_fun = CurrFun}) ->
- CurrFun.
-
--spec get_curr_fun_args(races()) -> core_args().
-
-get_curr_fun_args(#races{curr_fun_args = CurrFunArgs}) ->
- CurrFunArgs.
-
--spec get_new_table(races()) -> table().
-
-get_new_table(#races{new_table = Table}) ->
- Table.
-
--spec get_race_analysis(races()) -> boolean().
-
-get_race_analysis(#races{race_analysis = RaceAnalysis}) ->
- RaceAnalysis.
-
--spec get_race_list(races()) -> code().
-
-get_race_list(#races{race_list = RaceList}) ->
- RaceList.
-
--spec get_race_list_size(races()) -> non_neg_integer().
-
-get_race_list_size(#races{race_list_size = RaceListSize}) ->
- RaceListSize.
-
--spec get_race_list_and_size(races()) -> {code(), non_neg_integer()}.
-
-get_race_list_and_size(#races{race_list = RaceList,
- race_list_size = RaceListSize}) ->
- {RaceList, RaceListSize}.
-
--spec let_tag_new(var_to_map1(), var_to_map1()) -> #let_tag{}.
-
-let_tag_new(Var, Arg) ->
- #let_tag{var = Var, arg = Arg}.
-
--spec new() -> races().
-
-new() -> #races{}.
-
--spec put_curr_fun(dialyzer_callgraph:mfa_or_funlbl(), label(), races()) ->
- races().
-
-put_curr_fun(CurrFun, CurrFunLabel, Races) ->
- Races#races{curr_fun = CurrFun,
- curr_fun_label = CurrFunLabel,
- curr_fun_args = empty}.
-
--spec put_fun_args(core_args(), races()) -> races().
-
-put_fun_args(Args, #races{curr_fun_args = CurrFunArgs} = Races) ->
- case CurrFunArgs of
- empty -> Races#races{curr_fun_args = Args};
- _Other -> Races
- end.
-
--spec put_race_analysis(boolean(), races()) ->
- races().
-
-put_race_analysis(Analysis, Races) ->
- Races#races{race_analysis = Analysis}.
-
--spec put_race_list(code(), non_neg_integer(), races()) ->
- races().
-
-put_race_list(RaceList, RaceListSize, Races) ->
- Races#races{race_list = RaceList, race_list_size = RaceListSize}.
diff --git a/lib/dialyzer/src/dialyzer_succ_typings.erl b/lib/dialyzer/src/dialyzer_succ_typings.erl
index c53ea15ae1..248f78a43f 100644
--- a/lib/dialyzer/src/dialyzer_succ_typings.erl
+++ b/lib/dialyzer/src/dialyzer_succ_typings.erl
@@ -11,28 +11,25 @@
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
+%%
+%% Original author: Tobias Lindahl <tobiasl@it.uu.se>
+%%
+%% Purpose: Orchestrate calculation of success typings.
+%%
-%%%-------------------------------------------------------------------
-%%% File : dialyzer_succ_typings.erl
-%%% Author : Tobias Lindahl <tobiasl@it.uu.se>
-%%% Description :
-%%%
-%%% Created : 11 Sep 2006 by Tobias Lindahl <tobiasl@it.uu.se>
-%%%-------------------------------------------------------------------
-module(dialyzer_succ_typings).
--export([analyze_callgraph/3,
- analyze_callgraph/6,
- get_warnings/7
+%% Main entry points.
+-export([analyze_callgraph/5,
+ get_warnings/6
]).
--export([
- find_succ_types_for_scc/2,
+%% Entry points for dialyzer_worker.
+-export([find_succ_types_for_scc/2,
refine_one_module/2,
- %% find_required_by/2,
+ add_to_result/3,
find_depends_on/2,
- collect_warnings/2,
- lookup_names/2
+ collect_warnings/2
]).
-export_type([typesig_init_data/0, dataflow_init_data/0, warnings_init_data/0]).
@@ -54,7 +51,6 @@
%%--------------------------------------------------------------------
%% State record -- local to this module
--type parent() :: 'none' | pid().
-type typesig_init_data() :: term().
-type dataflow_init_data() :: term().
-type warnings_init_data() :: term().
@@ -65,80 +61,33 @@
-record(st, {callgraph :: dialyzer_callgraph:callgraph(),
codeserver :: dialyzer_codeserver:codeserver(),
- parent = none :: parent(),
timing_server :: dialyzer_timing:timing_server(),
solvers :: [solver()],
plt :: dialyzer_plt:plt()}).
-%%--------------------------------------------------------------------
-
--spec analyze_callgraph(dialyzer_callgraph:callgraph(), dialyzer_plt:plt(),
- dialyzer_codeserver:codeserver()) ->
- dialyzer_plt:plt().
-
-analyze_callgraph(Callgraph, Plt, Codeserver) ->
- analyze_callgraph(Callgraph, Plt, Codeserver, none, [], none).
+%% --------------------------------------------------------------------
+%% The main entry points.
-spec analyze_callgraph(dialyzer_callgraph:callgraph(), dialyzer_plt:plt(),
dialyzer_codeserver:codeserver(),
dialyzer_timing:timing_server(),
- [solver()], parent()) ->
+ [solver()]) ->
dialyzer_plt:plt().
-analyze_callgraph(Callgraph, Plt, Codeserver, TimingServer, Solvers, Parent) ->
- NewState =
- init_state_and_get_success_typings(Callgraph, Plt, Codeserver,
- TimingServer, Solvers, Parent),
- NewState#st.plt.
-
-%%--------------------------------------------------------------------
-
-init_state_and_get_success_typings(Callgraph, Plt, Codeserver,
- TimingServer, Solvers, Parent) ->
- {SCCs, Callgraph1} =
- ?timing(TimingServer, "order", dialyzer_callgraph:finalize(Callgraph)),
- State = #st{callgraph = Callgraph1, plt = Plt,
- codeserver = Codeserver, parent = Parent,
- timing_server = TimingServer, solvers = Solvers},
- get_refined_success_typings(SCCs, State).
-
-get_refined_success_typings(SCCs, #st{callgraph = Callgraph,
- timing_server = TimingServer} = State) ->
- case find_succ_typings(SCCs, State) of
- {fixpoint, State1} -> State1;
- {not_fixpoint, NotFixpoint1, State1} ->
- {ModulePostorder, ModCallgraph} =
- ?timing(
- TimingServer, "order", _C1,
- dialyzer_callgraph:module_postorder_from_funs(NotFixpoint1,
- Callgraph)),
- ModState = State1#st{callgraph = ModCallgraph},
- case refine_succ_typings(ModulePostorder, ModState) of
- {fixpoint, State2} ->
- State2;
- {not_fixpoint, NotFixpoint2, State2} ->
- %% Need to reset the callgraph.
- {NewSCCs, Callgraph2} =
- ?timing(TimingServer, "order", _C2,
- dialyzer_callgraph:reset_from_funs(NotFixpoint2,
- ModCallgraph)),
- NewState = State2#st{callgraph = Callgraph2},
- get_refined_success_typings(NewSCCs, NewState)
- end
- end.
+analyze_callgraph(Callgraph, Plt, Codeserver, TimingServer, Solvers) ->
+ _ = get_success_typings(Callgraph, Plt, Codeserver, TimingServer, Solvers),
+ Plt.
-spec get_warnings(dialyzer_callgraph:callgraph(), dialyzer_plt:plt(),
doc_plt(), dialyzer_codeserver:codeserver(),
- dialyzer_timing:timing_server(), [solver()], pid()) ->
+ dialyzer_timing:timing_server(), [solver()]) ->
{[raw_warning()], dialyzer_plt:plt(), doc_plt()}.
get_warnings(Callgraph, Plt, DocPlt, Codeserver,
- TimingServer, Solvers, Parent) ->
- InitState =
- init_state_and_get_success_typings(Callgraph, Plt, Codeserver,
- TimingServer, Solvers, Parent),
+ TimingServer, Solvers) ->
+ InitState = get_success_typings(Callgraph, Plt, Codeserver,
+ TimingServer, Solvers),
Mods = dialyzer_callgraph:modules(InitState#st.callgraph),
- Plt = InitState#st.plt,
CWarns =
dialyzer_contracts:get_invalid_contract_warnings(Mods, Codeserver, Plt),
ModWarns =
@@ -148,18 +97,89 @@ get_warnings(Callgraph, Plt, DocPlt, Codeserver,
Plt,
DocPlt}.
-get_warnings_from_modules(Mods, State, DocPlt) ->
- #st{callgraph = Callgraph, codeserver = Codeserver,
- plt = Plt, timing_server = TimingServer} = State,
- Init = {Codeserver, Callgraph, Plt, DocPlt},
- dialyzer_coordinator:parallel_job(warnings, Mods, Init, TimingServer).
+%% --------------------------------------------------------------------
+%% Callback functions called from dialyzer_worker.
+
+-spec find_succ_types_for_scc(scc(), typesig_init_data()) -> [mfa_or_funlbl()].
+
+find_succ_types_for_scc(SCC0, {Codeserver, Callgraph, Plt, Solvers}) ->
+ SCC = [MFA || {_, _, _} = MFA <- SCC0],
+ Label = dialyzer_codeserver:get_next_core_label(Codeserver),
+ F = fun(MFA) ->
+ {_Var, Fun} = dialyzer_codeserver:lookup_mfa_code(MFA, Codeserver),
+ collect_fun_info(Fun)
+ end,
+ AllFuns = lists:flatmap(F, SCC),
+ PropTypes = get_fun_types_from_plt(AllFuns, Callgraph, Plt),
+
+ %% Assume that the PLT contains the current propagated types
+ FunTypes = dialyzer_typesig:analyze_scc(SCC, Label, Callgraph,
+ Codeserver, Plt, PropTypes,
+ Solvers),
+
+ %% FunTypes may now have picked up funs outside of the SCC. Get rid of them.
+ AllFunKeys = [X || {X, _} <- AllFuns],
+ Set = sofs:set(AllFunKeys, [id]),
+ BinRel = sofs:from_external(FunTypes, [{id,type}]), %Already sorted.
+ FilteredFunTypes = sofs:to_external(sofs:restriction(BinRel, Set)),
+
+ FunMFAContracts = get_contracts(FilteredFunTypes, Callgraph, Codeserver),
+ ModOpaques = get_module_opaques(FunMFAContracts, Codeserver),
+ DecoratedFunTypes = decorate_succ_typings(FunMFAContracts, ModOpaques),
+
+ %% Check contracts
+ Contracts = orddict:from_list([{MFA, Contract} ||
+ {_, {MFA, Contract}} <- FunMFAContracts]),
+ PltContracts =
+ dialyzer_contracts:check_contracts(Contracts, Callgraph,
+ DecoratedFunTypes,
+ ModOpaques),
+ debug_pp_functions("SCC", FilteredFunTypes, DecoratedFunTypes, Callgraph),
+ NewPltContracts = [MC ||
+ {MFA, _C}=MC <- PltContracts,
+ %% Check the non-deleted PLT
+ not dialyzer_plt:is_contract(Plt, MFA)],
+ _ = insert_into_plt(DecoratedFunTypes, Callgraph, Plt),
+ _ = dialyzer_plt:insert_contract_list(Plt, NewPltContracts),
+
+ %% Check whether we have reached a fixpoint.
+ case NewPltContracts =:= [] andalso
+ reached_fixpoint_strict(PropTypes, DecoratedFunTypes) of
+ true -> [];
+ false ->
+ ?debug("Not fixpoint for: ~tw\n", [AllFuns]),
+ AllFunKeys
+ end.
+
+-spec refine_one_module(module(), dataflow_init_data()) -> [mfa_or_funlbl()].
+
+refine_one_module(M, {CodeServer, Callgraph, Plt, _Solvers}) ->
+ ModCode = dialyzer_codeserver:lookup_mod_code(M, CodeServer),
+ AllFuns = collect_fun_info(ModCode),
+ FunTypes = get_fun_types_from_plt(AllFuns, Callgraph, Plt),
+ Records = dialyzer_codeserver:lookup_mod_records(M, CodeServer),
+ NewFunTypes =
+ dialyzer_dataflow:get_fun_types(ModCode, Plt, Callgraph, CodeServer, Records),
+
+ FunMFAContracts = get_contracts(NewFunTypes, Callgraph, CodeServer),
+ ModOpaques = get_module_opaques(FunMFAContracts, CodeServer),
+ DecoratedFunTypes = decorate_succ_typings(FunMFAContracts, ModOpaques),
+ debug_pp_functions("Refine", NewFunTypes, DecoratedFunTypes, Callgraph),
+
+ case updated_types(FunTypes, DecoratedFunTypes) of
+ [] -> [];
+ [_|_]=NotFixpoint ->
+ ?debug("Not fixpoint\n", []),
+ _ = insert_into_plt(NotFixpoint, Callgraph, Plt),
+ [FunLbl || {FunLbl,_Type} <- NotFixpoint]
+ end.
-spec collect_warnings(module(), warnings_init_data()) -> [raw_warning()].
collect_warnings(M, {Codeserver, Callgraph, Plt, DocPlt}) ->
ModCode = dialyzer_codeserver:lookup_mod_code(M, Codeserver),
Contracts = dialyzer_codeserver:lookup_mod_contracts(M, Codeserver),
- AllFuns = collect_fun_info([ModCode]),
+ AllFuns = collect_fun_info(ModCode),
%% Check if there are contracts for functions that do not exist
Warnings1 =
dialyzer_contracts:contracts_without_fun(Contracts, AllFuns, Callgraph),
@@ -173,6 +193,97 @@ collect_warnings(M, {Codeserver, Callgraph, Plt, DocPlt}) ->
DocPlt = insert_into_doc_plt(FunTypes, Callgraph, DocPlt),
lists:flatten([Warnings1, Warnings2, Warnings3]).
+-spec find_depends_on(scc() | module(), fixpoint_init_data()) -> [scc()].
+
+find_depends_on(SCC, {_Codeserver, Callgraph, _Plt, _Solvers}) ->
+ dialyzer_callgraph:get_depends_on(SCC, Callgraph).
+
+-spec add_to_result([label()], [mfa()], fixpoint_init_data()) -> [mfa()].
+
+add_to_result(Labels, Result, {_Codeserver, Callgraph, _Plt, _Solver}) ->
+ [lookup_name(Label, Callgraph) || Label <- Labels] ++ Result.
+
+%% --------------------------------------------------------------------
+%% Local functions.
+%% --------------------------------------------------------------------
+
+%%--------------------------------------------------------------------
+%% Calculate success typings.
+
+get_success_typings(Callgraph, Plt, Codeserver, TimingServer, Solvers) ->
+ %% Condense the call graph to its strongly connected components (SCCs).
+ {SCCs, Callgraph1} =
+ ?timing(TimingServer, "order", dialyzer_callgraph:finalize(Callgraph)),
+ State = #st{callgraph = Callgraph1, plt = Plt,
+ codeserver = Codeserver,
+ timing_server = TimingServer, solvers = Solvers},
+ get_refined_success_typings(SCCs, State).
+
+get_refined_success_typings(SCCs, #st{callgraph = Callgraph,
+ timing_server = TimingServer} = State) ->
+ %% Find the success types for the SCCs.
+ case find_succ_typings(SCCs, State) of
+ [] ->
+ %% No new type information was discovered. We are done.
+ State;
+ NotFixpoint1 ->
+ %% New type information was discovered. Refine the type
+ %% information in each module using a dataflow analysis.
+ {ModulePostorder, ModCallgraph} =
+ ?timing(TimingServer, "order", _C1,
+ dialyzer_callgraph:module_postorder_from_funs(NotFixpoint1,
+ Callgraph)),
+ ?debug("Module postorder: ~p\n", [Modules]),
+
+ ModState = State#st{callgraph = ModCallgraph},
+ case refine_succ_typings(ModulePostorder, ModState) of
+ [] ->
+ %% No new type information was found. We are done.
+ ModState;
+ NotFixpoint2 ->
+ %% Need to reset the callgraph before repeating.
+ {NewSCCs, Callgraph2} =
+ ?timing(TimingServer, "order", _C2,
+ dialyzer_callgraph:reset_from_funs(NotFixpoint2,
+ ModCallgraph)),
+ NewState = ModState#st{callgraph = Callgraph2},
+ get_refined_success_typings(NewSCCs, NewState)
+ end
+ end.
+
+find_succ_typings(SCCs, State) ->
+ {Init, Timing} = init_pass_data(State),
+ Updated =
+ ?timing(Timing, "typesig",
+ dialyzer_coordinator:parallel_job(typesig, SCCs, Init, Timing)),
+ ?debug("==================== Typesig done ====================\n\n", []),
+ Updated.
+
+refine_succ_typings(Modules, State) ->
+ {Init, Timing} = init_pass_data(State),
+ Updated =
+ ?timing(Timing, "refine",
+ dialyzer_coordinator:parallel_job(dataflow, Modules, Init, Timing)),
+ ?debug("==================== Dataflow done ====================\n\n", []),
+ Updated.
+
+init_pass_data(#st{codeserver = Codeserver,
+ callgraph = Callgraph,
+ plt = Plt,
+ timing_server = Timing,
+ solvers = Solvers}) ->
+ Init = {Codeserver, Callgraph, Plt, Solvers},
+ {Init, Timing}.
+
+%%--------------------------------------------------------------------
+%% Produce warnings.
+
+get_warnings_from_modules(Mods, State, DocPlt) ->
+ #st{callgraph = Callgraph, codeserver = Codeserver,
+ plt = Plt, timing_server = TimingServer} = State,
+ Init = {Codeserver, Callgraph, Plt, DocPlt},
+ dialyzer_coordinator:parallel_job(warnings, Mods, Init, TimingServer).
+
postprocess_warnings(RawWarnings, Codeserver) ->
Pred =
fun({?WARN_CONTRACT_RANGE, _, _}) -> true;
@@ -210,177 +321,53 @@ postprocess_dataflow_warns([{?WARN_CONTRACT_RANGE, WarningInfo, Msg}|Rest],
W = {?WARN_CONTRACT_RANGE, WarningInfo, NewMsg},
postprocess_dataflow_warns(Rest, Codeserver, WAcc, [W|Acc])
end.
-
-refine_succ_typings(Modules, #st{codeserver = Codeserver,
- callgraph = Callgraph,
- plt = Plt,
- timing_server = Timing,
- solvers = Solvers} = State) ->
- ?debug("Module postorder: ~p\n", [Modules]),
- Init = {Codeserver, Callgraph, Plt, Solvers},
- NotFixpoint =
- ?timing(Timing, "refine",
- dialyzer_coordinator:parallel_job(dataflow, Modules, Init, Timing)),
- ?debug("==================== Dataflow done ====================\n\n", []),
- case NotFixpoint =:= [] of
- true -> {fixpoint, State};
- false -> {not_fixpoint, NotFixpoint, State}
- end.
-
--spec find_depends_on(scc() | module(), fixpoint_init_data()) -> [scc()].
-
-find_depends_on(SCC, {_Codeserver, Callgraph, _Plt, _Solvers}) ->
- dialyzer_callgraph:get_depends_on(SCC, Callgraph).
-
-%% -spec find_required_by(scc() | module(), fixpoint_init_data()) -> [scc()].
-%% find_required_by(SCC, {_Codeserver, Callgraph, _Plt, _Solvers}) ->
-%% dialyzer_callgraph:get_required_by(SCC, Callgraph).
-
--spec lookup_names([label()], fixpoint_init_data()) -> [mfa_or_funlbl()].
-
-lookup_names(Labels, {_Codeserver, Callgraph, _Plt, _Solvers}) ->
- [lookup_name(F, Callgraph) || F <- Labels].
-
--spec refine_one_module(module(), dataflow_init_data()) -> [label()]. % ordset
-
-refine_one_module(M, {CodeServer, Callgraph, Plt, _Solvers}) ->
- ModCode = dialyzer_codeserver:lookup_mod_code(M, CodeServer),
- AllFuns = collect_fun_info([ModCode]),
- FunTypes = get_fun_types_from_plt(AllFuns, Callgraph, Plt),
- Records = dialyzer_codeserver:lookup_mod_records(M, CodeServer),
- NewFunTypes =
- dialyzer_dataflow:get_fun_types(ModCode, Plt, Callgraph, CodeServer, Records),
- {FunMFAContracts, ModOpaques} =
- prepare_decoration(NewFunTypes, Callgraph, CodeServer),
- DecoratedFunTypes = decorate_succ_typings(FunMFAContracts, ModOpaques),
- %% ?Debug("NewFunTypes ~tp\n ~n", [NewFunTypes]),
- %% ?debug("refine DecoratedFunTypes ~tp\n ~n", [DecoratedFunTypes]),
- debug_pp_functions("Refine", NewFunTypes, DecoratedFunTypes, Callgraph),
-
- case reached_fixpoint(FunTypes, DecoratedFunTypes) of
- true -> [];
- {false, NotFixpoint} ->
- ?debug("Not fixpoint\n", []),
- Plt = insert_into_plt(orddict:from_list(NotFixpoint), Callgraph, Plt),
- [FunLbl || {FunLbl,_Type} <- NotFixpoint]
- end.
-
-reached_fixpoint(OldTypes, NewTypes) ->
- reached_fixpoint(OldTypes, NewTypes, false).
-
-reached_fixpoint_strict(OldTypes, NewTypes) ->
- case reached_fixpoint(OldTypes, NewTypes, true) of
- true -> true;
- {false, _} -> false
- end.
+%%--------------------------------------------------------------------
+%% Helpers.
-reached_fixpoint(OldTypes0, NewTypes0, Strict) ->
- MapFun = fun({Key, Type}) ->
- case is_failed_or_not_called_fun(Type) of
- true -> {Key, failed_fun};
- false -> {Key, erl_types:t_limit(Type, ?TYPE_LIMIT)}
- end
- end,
- OldTypes = lists:map(MapFun, orddict:to_list(OldTypes0)),
- NewTypes = lists:map(MapFun, orddict:to_list(NewTypes0)),
- compare_types(OldTypes, NewTypes, Strict).
+reached_fixpoint_strict([{Key,Type1}|Types1], [{Key,Type2}|Types2]) ->
+ case is_failed_or_not_called_fun(Type2) of
+ true ->
+ reached_fixpoint_strict(Types1, Types2);
+ false ->
+ LimitedType1 = erl_types:t_limit(Type1, ?TYPE_LIMIT),
+ LimitedType2 = erl_types:t_limit(Type2, ?TYPE_LIMIT),
+ erl_types:t_is_equal(LimitedType1, LimitedType2) andalso
+ reached_fixpoint_strict(Types1, Types2)
+ end;
+reached_fixpoint_strict([{Key1,_}|Types1], [{Key2,_}|_]=Types2)
+ when Key1 < Key2 ->
+ %% The function was never called.
+ reached_fixpoint_strict(Types1, Types2);
+reached_fixpoint_strict([], []) ->
+ true.
+
+updated_types(OldTypes, NewTypes) ->
+ updated_types_1(OldTypes, NewTypes, []).
+
+updated_types_1([{Key,Type1}|Types1], [{Key,Type2}|Types2], Acc) ->
+ case is_failed_or_not_called_fun(Type2) of
+ true ->
+ updated_types_1(Types1, Types2, Acc);
+ false ->
+ LimitedType1 = erl_types:t_limit(Type1, ?TYPE_LIMIT),
+ LimitedType2 = erl_types:t_limit(Type2, ?TYPE_LIMIT),
+ case erl_types:t_is_subtype(LimitedType1, LimitedType2) of
+ true ->
+ updated_types_1(Types1, Types2, Acc);
+ false ->
+ ?debug("Failed fixpoint for ~w: ~ts =/= ~ts\n",
+ [Key, erl_types:t_to_string(Type1), erl_types:t_to_string(Type2)]),
+ updated_types_1(Types1, Types2, [{Key, Type2}|Acc])
+ end
+ end;
+updated_types_1([], [], Acc) ->
+ Acc.
is_failed_or_not_called_fun(Type) ->
erl_types:any_none([erl_types:t_fun_range(Type)|erl_types:t_fun_args(Type)]).
-compare_types(List1, List2, Strict) ->
- compare_types_1(List1, List2, Strict, []).
-
-compare_types_1([{X, _Type1}|Left1], [{X, failed_fun}|Left2],
- Strict, NotFixpoint) ->
- compare_types_1(Left1, Left2, Strict, NotFixpoint);
-compare_types_1([{X, failed_fun}|Left1], [{X, _Type2}|Left2],
- Strict, NotFixpoint) ->
- compare_types_1(Left1, Left2, Strict, NotFixpoint);
-compare_types_1([{X, Type1}|Left1], [{X, Type2}|Left2], Strict, NotFixpoint) ->
- Res = case Strict of
- true -> erl_types:t_is_equal(Type1, Type2);
- false -> erl_types:t_is_subtype(Type1, Type2)
- end,
- case Res of
- true -> compare_types_1(Left1, Left2, Strict, NotFixpoint);
- false ->
- ?debug("Failed fixpoint for ~w: ~ts =/= ~ts\n",
- [X, erl_types:t_to_string(Type1), erl_types:t_to_string(Type2)]),
- compare_types_1(Left1, Left2, Strict, [{X, Type2}|NotFixpoint])
- end;
-compare_types_1([_|Left1], List2, Strict, NotFixpoint) ->
- %% If the function was not called.
- compare_types_1(Left1, List2, Strict, NotFixpoint);
-compare_types_1([], [], _Strict, NotFixpoint) ->
- case NotFixpoint =:= [] of
- true -> true;
- false -> {false, NotFixpoint}
- end.
-
-find_succ_typings(SCCs, #st{codeserver = Codeserver, callgraph = Callgraph,
- plt = Plt, timing_server = Timing,
- solvers = Solvers} = State) ->
- Init = {Codeserver, Callgraph, Plt, Solvers},
- NotFixpoint =
- ?timing(Timing, "typesig",
- dialyzer_coordinator:parallel_job(typesig, SCCs, Init, Timing)),
- ?debug("==================== Typesig done ====================\n\n", []),
- case NotFixpoint =:= [] of
- true -> {fixpoint, State};
- false -> {not_fixpoint, NotFixpoint, State}
- end.
-
--spec find_succ_types_for_scc(scc(), typesig_init_data()) -> [mfa_or_funlbl()].
-
-find_succ_types_for_scc(SCC0, {Codeserver, Callgraph, Plt, Solvers}) ->
- SCC = [MFA || {_, _, _} = MFA <- SCC0],
- Label = dialyzer_codeserver:get_next_core_label(Codeserver),
- AllFuns = lists:append(
- [begin
- {_Var, Fun} =
- dialyzer_codeserver:lookup_mfa_code(MFA, Codeserver),
- collect_fun_info([Fun])
- end || MFA <- SCC]),
- PropTypes = get_fun_types_from_plt(AllFuns, Callgraph, Plt),
- %% Assume that the PLT contains the current propagated types
- FunTypes = dialyzer_typesig:analyze_scc(SCC, Label, Callgraph,
- Codeserver, Plt, PropTypes,
- Solvers),
- AllFunSet = sets:from_list([X || {X, _} <- AllFuns]),
- FilteredFunTypes =
- orddict:filter(fun(F, _T) -> sets:is_element(F, AllFunSet)
- end, FunTypes),
- {FunMFAContracts, ModOpaques} =
- prepare_decoration(FilteredFunTypes, Callgraph, Codeserver),
- DecoratedFunTypes = decorate_succ_typings(FunMFAContracts, ModOpaques),
- %% Check contracts
- Contracts = orddict:from_list([{MFA, Contract} ||
- {_, {MFA, Contract}} <- FunMFAContracts]),
- PltContracts =
- dialyzer_contracts:check_contracts(Contracts, Callgraph,
- DecoratedFunTypes,
- ModOpaques),
- %% ?debug("FilteredFunTypes ~tp\n ~n", [FilteredFunTypes]),
- %% ?debug("SCC DecoratedFunTypes ~tp\n ~n", [DecoratedFunTypes]),
- debug_pp_functions("SCC", FilteredFunTypes, DecoratedFunTypes, Callgraph),
- NewPltContracts = [MC ||
- {MFA, _C}=MC <- PltContracts,
- %% Check the non-deleted PLT
- not dialyzer_plt:is_contract(Plt, MFA)],
- ContractFixpoint = NewPltContracts =:= [],
- Plt = insert_into_plt(DecoratedFunTypes, Callgraph, Plt),
- Plt = dialyzer_plt:insert_contract_list(Plt, NewPltContracts),
- case (ContractFixpoint andalso
- reached_fixpoint_strict(PropTypes, DecoratedFunTypes)) of
- true -> [];
- false ->
- ?debug("Not fixpoint for: ~tw\n", [AllFuns]),
- [Fun || {Fun, _Arity} <- AllFuns]
- end.
-
-prepare_decoration(FunTypes, Callgraph, Codeserver) ->
+get_contracts(FunTypes, Callgraph, Codeserver) ->
F = fun({Label, _Type}=LabelType, Acc) ->
case dialyzer_callgraph:lookup_name(Label, Callgraph) of
{ok, MFA} ->
@@ -392,24 +379,28 @@ prepare_decoration(FunTypes, Callgraph, Codeserver) ->
error -> [{LabelType, no}|Acc]
end
end,
- Contracts = lists:foldl(F, [], orddict:to_list(FunTypes)),
- ModOpaques =
- [{M, lookup_opaques(M, Codeserver)} ||
- M <- lists:usort([M || {_LabelType, {{M, _, _}, _Con}} <- Contracts])],
- {Contracts, orddict:from_list(ModOpaques)}.
+ lists:foldl(F, [], FunTypes).
+
+get_module_opaques(Contracts, Codeserver) ->
+ OpaqueModules = ordsets:from_list([M || {_LabelType, {{M, _, _}, _Con}} <- Contracts]),
+ [{M, lookup_opaques(M, Codeserver)} || M <- OpaqueModules].
decorate_succ_typings(FunTypesContracts, ModOpaques) ->
- F = fun({{Label, Type}, {{M, _, _}, Contract}}) ->
- Args = dialyzer_contracts:get_contract_args(Contract),
- Ret = dialyzer_contracts:get_contract_return(Contract),
- C = erl_types:t_fun(Args, Ret),
- {M, Opaques} = lists:keyfind(M, 1, ModOpaques),
- R = erl_types:t_decorate_with_opaque(Type, C, Opaques),
- {Label, R};
- ({LabelType, no}) ->
- LabelType
+ F = fun({{Label, Type}, {{M, _, _}, Contract}}, Acc) ->
+ case lists:keyfind(M, 1, ModOpaques) of
+ {M, []} ->
+ [{Label, Type}|Acc];
+ {M, Opaques} ->
+ Args = dialyzer_contracts:get_contract_args(Contract),
+ Ret = dialyzer_contracts:get_contract_return(Contract),
+ C = erl_types:t_fun(Args, Ret),
+ R = erl_types:t_decorate_with_opaque(Type, C, Opaques),
+ [{Label, R}|Acc]
+ end;
+ ({LabelType, no}, Acc) ->
+ [LabelType|Acc]
end,
- orddict:from_list(lists:map(F, FunTypesContracts)).
+ orddict:from_list(lists:foldl(F, [], FunTypesContracts)).
lookup_opaques(Module, Codeserver) ->
Records = dialyzer_codeserver:lookup_mod_records(Module, Codeserver),
@@ -424,10 +415,7 @@ get_fun_types_from_plt([{FunLabel, Arity}|Left], Callgraph, Plt, Map) ->
get_fun_types_from_plt([], _Callgraph, _Plt, Map) ->
orddict:from_list(Map).
-collect_fun_info(Trees) ->
- collect_fun_info(Trees, []).
-
-collect_fun_info([Tree|Trees], List) ->
+collect_fun_info(Tree) ->
Fun = fun(SubTree, Acc) ->
case cerl:is_c_fun(SubTree) of
true ->
@@ -435,9 +423,7 @@ collect_fun_info([Tree|Trees], List) ->
false -> Acc
end
end,
- collect_fun_info(Trees, cerl_trees:fold(Fun, List, Tree));
-collect_fun_info([], List) ->
- List.
+ cerl_trees:fold(Fun, [], Tree).
lookup_fun_type(Label, Arity, Callgraph, Plt) ->
ID = lookup_name(Label, Callgraph),
@@ -468,6 +454,15 @@ format_succ_types([{Label, Type0}|Left], Callgraph, Acc) ->
format_succ_types([], _Callgraph, Acc) ->
Acc.
+lookup_name(F, CG) ->
+ case dialyzer_callgraph:lookup_name(F, CG) of
+ error -> F;
+ {ok, Name} -> Name
+ end.
+
+%%--------------------------------------------------------------------
+%% Debugging.
+
-ifdef(DEBUG).
debug_pp_succ_typings(SuccTypes) ->
?debug("Succ typings:\n", []),
@@ -503,9 +498,3 @@ debug_pp_succ_typings(_) ->
debug_pp_functions(_, _, _, _) ->
ok.
-endif.
-
-lookup_name(F, CG) ->
- case dialyzer_callgraph:lookup_name(F, CG) of
- error -> F;
- {ok, Name} -> Name
- end.
diff --git a/lib/dialyzer/src/dialyzer_typegraph.erl b/lib/dialyzer/src/dialyzer_typegraph.erl
new file mode 100644
index 0000000000..5818236fa7
--- /dev/null
+++ b/lib/dialyzer/src/dialyzer_typegraph.erl
@@ -0,0 +1,109 @@
+%% -*- erlang-indent-level: 2 -*-
+-module(dialyzer_typegraph).
+
+-export([module_type_deps/3]).
+
+-export_type([type_mod_deps/0]).
+
+-include("dialyzer.hrl").
+
+%% Maps a module to those modules that depend on it
+-type type_mod_deps() :: #{module() => [module()]}.
+
+%% We track type dependecies so that we know which modules we ultimately
+%% depend upon for type definitions which, in turn, affect the checking
+%% of a module.
+
+%% Any non-local types that are used in a spec (aka contract) / callback, any
+%% locally-defined types that may depend on a non-local type, and any
+%% implementations of a behaviour, introduce type-level dependencies on other
+%% modules such that if the definition of that other module were to change,
+%% this module would need to be checked again to account for those changes.
+
+-spec module_type_deps(UseContracts :: boolean(), dialyzer_codeserver:codeserver(), [module()]) -> type_mod_deps().
+
+%% The module type deps of a module are modules that depend on the module to
+%% define types, contracts, callbacks or behaviours
+module_type_deps(UseContracts, CodeServer, Modules) ->
+
+ Contracts =
+ case UseContracts of
+ true -> maps:from_list(dict:to_list(dialyzer_codeserver:get_contracts(CodeServer)));
+ false -> []
+ end,
+ Callbacks = maps:from_list(dialyzer_codeserver:get_callbacks(CodeServer)),
+ TypeDefinitions =
+ maps:from_list(
+ [{M, dialyzer_codeserver:lookup_mod_records(M, CodeServer)} || M <- Modules]
+ ),
+ Behaviours =
+ maps:from_list(
+ [{M, get_behaviours_for_module(M, CodeServer)} || M <- Modules]
+ ),
+ collect_module_type_deps(Contracts, Callbacks, TypeDefinitions, Behaviours).
+
+-spec get_behaviours_for_module(module(), dialyzer_codeserver:codeserver()) -> [module()].
+
+get_behaviours_for_module(M, CodeServer) ->
+ ModCode = dialyzer_codeserver:lookup_mod_code(M, CodeServer),
+ Attrs = cerl:module_attrs(ModCode),
+ {Behaviours, _BehaviourLocations} = dialyzer_behaviours:get_behaviours(Attrs),
+ Behaviours.
+
+-spec collect_module_type_deps(Specs, Callbacks, TypeDefinitions, Behaviours) -> type_mod_deps() when
+ Specs :: #{mfa() => dialyzer_contracts:file_contract()},
+ Callbacks :: #{mfa() => dialyzer_contracts:file_contract()},
+ TypeDefinitions :: #{module() => erl_types:type_table()},
+ Behaviours :: #{module() => [module()]}.
+
+collect_module_type_deps(Specs, Callbacks, TypeDefinitions, Behaviours) ->
+
+ Contracts =
+ [{M, Spec} || {{M, _F, _A}, {_FileLine, Spec, _Extra}} <- maps:to_list(Specs)] ++
+ [{M, Callback} || {{M, _F, _A}, {_FileLine, Callback, _Extra}} <- maps:to_list(Callbacks)],
+
+ ModulesMentionedInTypeDefinitions =
+ [{FromTypeDefM, erl_types:module_type_deps_of_type_defs(TypeTable)}
+ || {FromTypeDefM, TypeTable} <- maps:to_list(TypeDefinitions)],
+
+ ModulesMentionedInContracts =
+ [{FromContractM, module_type_deps_of_contract(C)}
+ || {FromContractM, C} <- Contracts],
+
+ ModulesMentionedAsBehaviours =
+ maps:to_list(Behaviours),
+
+ AllDepsRaw =
+ ModulesMentionedInContracts ++
+ ModulesMentionedInTypeDefinitions ++
+ ModulesMentionedAsBehaviours,
+
+ %% Find the union of module dependencies from all sources, removing
+ %% self-references, and flipping the direction of the mapping to
+ %% match the expectations of Dialyzer elsewhere,
+ %% i.e., from:
+ %% module -> those modules it depends on
+ %% to
+ %% module -> those modules that depend on it
+ S0 = sofs:relation(AllDepsRaw, [{atom,[atom]}]),
+ S1 = sofs:relation_to_family(S0),
+ S2 = sofs:family_union(S1),
+ S3 = sofs:family_to_relation(S2),
+ S4 = sofs:converse(S3),
+ S5 = sofs:strict_relation(S4),
+ S6 = sofs:relation_to_family(S5),
+ S7 = sofs:to_external(S6),
+ ModuleToThoseModulesThatDependOnIt = maps:from_list(S7),
+
+ ModuleToThoseModulesThatDependOnIt.
+
+-spec module_type_deps_of_contract(#contract{}) -> [module()].
+
+module_type_deps_of_contract(#contract{forms = Forms}) ->
+ TypeForms = [TypeForm || {TypeForm, _Constraints} <- Forms],
+ ConstraintForms =
+ lists:append([Constraints || {_TypeForm, Constraints} <- Forms]),
+ lists:usort(
+ lists:append(
+ erl_types:type_form_to_remote_modules(TypeForms),
+ dialyzer_contracts:constraint_form_to_remote_modules(ConstraintForms))).
diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl
index 62ab852fae..88be51972d 100644
--- a/lib/dialyzer/src/dialyzer_typesig.erl
+++ b/lib/dialyzer/src/dialyzer_typesig.erl
@@ -28,12 +28,13 @@
%%-import(helper, %% 'helper' could be any module doing sanity checks...
-import(erl_types,
[t_has_var/1, t_inf/2, t_is_equal/2, t_is_subtype/2,
- t_subtract/2, t_subtract_list/2, t_sup/1, t_sup/2,t_unify/2]).
+ t_subtract/2, t_subtract_list/2, t_sup/1, t_sup/2,
+ t_unify_table_only/2]).
-import(erl_types,
[t_any/0, t_atom/0, t_atom_vals/1,
t_binary/0, t_bitstr/0, t_bitstr/2, t_bitstr_concat/1, t_boolean/0,
- t_collect_vars/1, t_cons/2, t_cons_hd/1, t_cons_tl/1,
+ t_collect_var_names/1, t_cons/2, t_cons_hd/1, t_cons_tl/1,
t_float/0, t_from_range/2, t_from_term/1,
t_fun/0, t_fun/2, t_fun_args/1, t_fun_range/1,
t_integer/0,
@@ -97,7 +98,7 @@
-type typesig_funmap() :: #{type_var() => type_var()}.
-type prop_types() :: orddict:orddict(label(), erl_types:erl_type()).
--type dict_prop_types() :: dict:dict(label(), erl_types:erl_type()).
+-type dict_prop_types() :: #{label() => erl_types:erl_type()}.
-record(state, {callgraph :: dialyzer_callgraph:callgraph()
| 'undefined',
@@ -114,7 +115,7 @@
self_rec :: 'false' | erl_types:erl_type(),
plt :: dialyzer_plt:plt()
| 'undefined',
- prop_types = dict:new() :: dict_prop_types(),
+ prop_types = #{} :: dict_prop_types(),
mod_records = [] :: [{module(), types()}],
scc = [] :: ordsets:ordset(type_var()),
mfas :: [mfa()],
@@ -132,10 +133,8 @@
%%-define(DEBUG_CONSTRAINTS, true).
-ifdef(DEBUG).
-define(DEBUG_NAME_MAP, true).
--define(DEBUG_LOOP_DETECTION, true).
-endif.
%%-define(DEBUG_NAME_MAP, true).
-%%-define(DEBUG_LOOP_DETECTION, true).
-ifdef(DEBUG).
-define(debug(__String, __Args), io:format(__String, __Args)).
@@ -180,7 +179,7 @@ analyze_scc(SCC, NextLabel, CallGraph, CServer, Plt, PropTypes, Solvers0) ->
Solvers = solvers(Solvers0),
State1 = new_state(SCC, NextLabel, CallGraph, CServer, Plt, PropTypes,
Solvers),
- DefSet = add_def_list(maps:values(State1#state.name_map), sets:new()),
+ DefSet = add_def_list(maps:values(State1#state.name_map), sets:new([{version, 2}])),
State2 = traverse_scc(SCC, CServer, DefSet, State1),
State3 = state__finalize(State2),
Funs = state__scc(State3),
@@ -308,7 +307,7 @@ traverse(Tree, DefinedVars, State) ->
Hd = cerl:cons_hd(Tree),
Tl = cerl:cons_tl(Tree),
{State1, [HdVar, TlVar]} = traverse_list([Hd, Tl], DefinedVars, State),
- case cerl:is_literal(fold_literal_maybe_match(Tree, State)) of
+ case is_foldable(Tree, State) of
true ->
%% We do not need to do anything more here.
{State, t_cons(HdVar, TlVar)};
@@ -350,10 +349,7 @@ traverse(Tree, DefinedVars, State) ->
TreeVar = mk_var(Tree),
State2 =
try
- State1 = case state__add_prop_constrs(Tree, State0) of
- not_called -> State0;
- PropState -> PropState
- end,
+ State1 = state__add_prop_constrs(Tree, State0),
{BodyState, BodyVar} = traverse(Body, DefinedVars1, State1),
state__store_conj(TreeVar, eq,
t_fun(mk_var_list(Vars), BodyVar), BodyState)
@@ -401,18 +397,6 @@ traverse(Tree, DefinedVars, State) ->
end;
_ -> {State, t_from_term(cerl:concrete(Tree))}
end;
- module ->
- Defs = cerl:module_defs(Tree),
- Funs = [Fun || {_Var, Fun} <- Defs],
- Vars = [Var || {Var, _Fun} <- Defs],
- DefinedVars1 = add_def_list(Vars, DefinedVars),
- State1 = state__store_funs(Vars, Funs, State),
- FoldFun = fun(Fun, AccState) ->
- {S, _} = traverse(Fun, DefinedVars1,
- state__new_constraint_context(AccState)),
- S
- end,
- lists:foldl(FoldFun, State1, Funs);
primop ->
case cerl:atom_val(cerl:primop_name(Tree)) of
match_fail -> throw(error);
@@ -442,23 +426,8 @@ traverse(Tree, DefinedVars, State) ->
end;
remove_message ->
{State, t_any()};
- timeout ->
- {State, t_any()};
Other -> erlang:error({'Unsupported primop', Other})
end;
- 'receive' ->
- Clauses = cerl:receive_clauses(Tree),
- Timeout = cerl:receive_timeout(Tree),
- case (cerl:is_c_atom(Timeout) andalso
- (cerl:atom_val(Timeout) =:= infinity)) of
- true ->
- handle_clauses(Clauses, mk_var(Tree), [], DefinedVars, State);
- false ->
- Action = cerl:receive_action(Tree),
- {State1, TimeoutVar} = traverse(Timeout, DefinedVars, State),
- State2 = state__store_conj(TimeoutVar, sub, t_timeout(), State1),
- handle_clauses(Clauses, mk_var(Tree), [], Action, DefinedVars, State2)
- end;
seq ->
Body = cerl:seq_body(Tree),
Arg = cerl:seq_arg(Tree),
@@ -470,7 +439,7 @@ traverse(Tree, DefinedVars, State) ->
Elements = cerl:tuple_es(Tree),
{State1, EVars} = traverse_list(Elements, DefinedVars, State),
{State2, TupleType} =
- case cerl:is_literal(fold_literal_maybe_match(Tree, State1)) of
+ case is_foldable(Tree, State) of
true ->
%% We do not need to do anything more here.
{State, t_tuple(EVars)};
@@ -667,13 +636,14 @@ add_def_list([], Set) ->
Set.
add_def_from_tree(T, DefinedVars) ->
- Vars = cerl_trees:fold(fun(X, Acc) ->
- case cerl:is_c_var(X) of
- true -> [X|Acc];
- false -> Acc
- end
- end, [], T),
- add_def_list(Vars, DefinedVars).
+ cerl_trees:fold(fun(X, Set) ->
+ case cerl:is_c_var(X) of
+ true ->
+ add_def(X, Set);
+ false ->
+ Set
+ end
+ end, DefinedVars, T).
add_def_from_tree_list([H|T], DefinedVars) ->
add_def_from_tree_list(T, add_def_from_tree(H, DefinedVars));
@@ -858,12 +828,6 @@ get_contract_return(C, ArgTypes) ->
-define(MAX_NOF_CLAUSES, 15).
handle_clauses(Clauses, TopVar, Arg, DefinedVars, State) ->
- handle_clauses(Clauses, TopVar, Arg, none, DefinedVars, State).
-
-handle_clauses([], _, _, Action, DefinedVars, State) when Action =/= none ->
- %% Can happen when a receive has no clauses, see filter_match_fail.
- traverse(Action, DefinedVars, State);
-handle_clauses(Clauses, TopVar, Arg, Action, DefinedVars, State) ->
SubtrTypeList =
if length(Clauses) > ?MAX_NOF_CLAUSES -> overflow;
true -> []
@@ -871,23 +835,8 @@ handle_clauses(Clauses, TopVar, Arg, Action, DefinedVars, State) ->
{State1, CList} = handle_clauses_1(Clauses, TopVar, Arg, DefinedVars,
State, SubtrTypeList, []),
{NewCs, NewState} =
- case Action of
- none ->
- if CList =:= [] -> throw(error);
- true -> {CList, State1}
- end;
- _ ->
- try
- {State2, ActionVar} = traverse(Action, DefinedVars, State1),
- TmpC = mk_constraint(TopVar, eq, ActionVar),
- ActionCs = mk_conj_constraint_list([state__cs(State2),TmpC]),
- {[ActionCs|CList], State2}
- catch
- throw:error ->
- if CList =:= [] -> throw(error);
- true -> {CList, State1}
- end
- end
+ if CList =:= [] -> throw(error);
+ true -> {CList, State1}
end,
OldCs = state__cs(State),
NewCList = mk_disj_constraint_list(NewCs),
@@ -901,29 +850,27 @@ handle_clauses_1([Clause|Tail], TopVar, Arg, DefinedVars,
Guard = cerl:clause_guard(Clause),
Body = cerl:clause_body(Clause),
NewSubtrTypes =
- case SubtrTypes =:= overflow of
- true -> overflow;
- false ->
+ case SubtrTypes of
+ overflow ->
+ overflow;
+ _ ->
ordsets:add_element(get_safe_underapprox(Pats, Guard), SubtrTypes)
end,
try
DefinedVars1 = add_def_from_tree_list(Pats, DefinedVars),
State1 = state__set_in_match(State0, true),
{State2, PatVars} = traverse_list(Pats, DefinedVars1, State1),
+ S = state__store_conj(Arg, eq, t_product(PatVars), State2),
State3 =
- case Arg =:= [] of
- true -> State2;
- false ->
- S = state__store_conj(Arg, eq, t_product(PatVars), State2),
- case SubtrTypes =:= overflow of
- true -> S;
- false ->
- SubtrPatVar = ?mk_fun_var(fun(Map) ->
- TmpType = lookup_type(Arg, Map),
- t_subtract_list(TmpType, SubtrTypes)
- end, [Arg]),
- state__store_conj(Arg, sub, SubtrPatVar, S)
- end
+ case SubtrTypes of
+ overflow ->
+ S;
+ _ ->
+ SubtrPatVar = ?mk_fun_var(fun(Map) ->
+ TmpType = lookup_type(Arg, Map),
+ t_subtract_list(TmpType, SubtrTypes)
+ end, [Arg]),
+ state__store_conj(Arg, sub, SubtrPatVar, S)
end,
State4 = handle_guard(Guard, DefinedVars1, State3),
{State5, BodyVar} = traverse(Body, DefinedVars1,
@@ -1800,12 +1747,12 @@ get_bif_test_constr(Dst, Arg, Type, _State) ->
solve([Fun], State) ->
?debug("============ Analyzing Fun: ~tw ===========\n",
[debug_lookup_name(Fun)]),
- solve_fun(Fun, map_new(), State);
+ solve_fun(Fun, #{}, State);
solve([_|_] = SCC, State) ->
?debug("============ Analyzing SCC: ~tw ===========\n",
[[debug_lookup_name(F) || F <- SCC]]),
Users = comp_users(SCC, State),
- solve_scc(SCC, map_new(), State, Users, _ToSolve=SCC, false).
+ solve_scc(SCC, #{}, State, Users, _ToSolve=SCC, false).
comp_users(SCC, State) ->
Vars0 = [{Fun, state__get_rec_var(Fun, State)} || Fun <- SCC],
@@ -1816,11 +1763,8 @@ comp_users(SCC, State) ->
Vars)]).
solve_fun(Fun, FunMap, State) ->
- Cs = state__get_cs(Fun, State),
- Deps = get_deps(Cs),
- Ref = mk_constraint_ref(Fun, Deps),
%% Note that functions are always considered to succeed.
- NewMap = solve(Fun, Ref, FunMap, State),
+ NewMap = solve(Fun, FunMap, State),
NewType = lookup_type(Fun, NewMap),
NewFunMap1 = case state__get_rec_var(Fun, State) of
error -> FunMap;
@@ -1872,10 +1816,8 @@ affected(Updated, Users) ->
end || V <- Updated]).
scc_fold_fun(F, FunMap, State) ->
- Deps = get_deps(state__get_cs(F, State)),
- Cs = mk_constraint_ref(F, Deps),
%% Note that functions are always considered to succeed.
- Map = solve(F, Cs, FunMap, State),
+ Map = solve(F, FunMap, State),
NewType0 = unsafe_lookup_type(F, Map),
NewType = t_limit(NewType0, ?TYPE_LIMIT),
NewFunMap = case state__get_rec_var(F, State) of
@@ -1888,75 +1830,23 @@ scc_fold_fun(F, FunMap, State) ->
format_type(NewType)]),
NewFunMap.
-solve(Fun, Cs, FunMap, State) ->
- Solvers = State#state.solvers,
- R = [solver(S, solve_fun(S, Fun, Cs, FunMap, State)) || S <- Solvers],
- check_solutions(R, Fun, no_solver, no_map).
-
-solver(Solver, SolveFun) ->
- ?debug("Start solver ~w\n", [Solver]),
- try timer:tc(SolveFun) of
- {Time, {ok, Map}} ->
- ?debug("End solver ~w (~w microsecs)\n", [Solver, Time]),
- {Solver, Map, Time};
- {_, _R} ->
- ?debug("Solver ~w returned unexpected result:\n ~P\n",
- [Solver, _R, 60]),
- throw(error)
- catch E:R:S ->
- io:format("Solver ~w failed: ~w:~p\n ~tp\n", [Solver, E, R, S]),
- throw(error)
- end.
-
-solve_fun(v1, _Fun, Cs, FunMap, State) ->
- fun() ->
- {ok, _MapDict, NewMap} = solve_ref_or_list(Cs, FunMap, map_new(), State),
- {ok, NewMap}
- end;
-solve_fun(v2, Fun, _Cs, FunMap, State) ->
- fun() -> v2_solve_ref(Fun, FunMap, State) end.
-
-check_solutions([], _Fun, _S, Map) ->
- Map;
-check_solutions([{S1,Map1,_Time1}|Maps], Fun, S, Map) ->
- ?debug("Solver ~w needed ~w microsecs\n", [S1, _Time1]),
- case Map =:= no_map orelse sane_maps(Map, Map1, [Fun], S, S1) of
- true ->
- check_solutions(Maps, Fun, S1, Map1);
- false ->
- ?debug("Constraint solvers do not agree on ~w\n", [Fun]),
- ?pp_map(atom_to_list(S), Map),
- ?pp_map(atom_to_list(S1), Map1),
- io:format("A bug was found. Please report it, and use the option "
- "`--solver v1' until the bug has been fixed.\n"),
- throw(error)
- end.
-
-sane_maps(Map1, Map2, Keys, _S1, _S2) ->
- lists:all(fun(Key) ->
- V1 = unsafe_lookup_type(Key, Map1),
- V2 = unsafe_lookup_type(Key, Map2),
- case t_is_equal(V1, V2) of
- true -> true;
- false ->
- ?debug("Constraint solvers do not agree on ~w\n", [Key]),
- ?debug("~w: ~ts\n",
- [_S1, format_type(unsafe_lookup_type(Key, Map1))]),
- ?debug("~w: ~ts\n",
- [_S2, format_type(unsafe_lookup_type(Key, Map2))]),
- false
- end
- end, Keys).
-
%% Solver v2
-record(v2_state, {constr_data = maps:new() :: map(),
state :: state()}).
-v2_solve_ref(Fun, Map, State) ->
+solve(Fun, FunMap, State) ->
V2State = #v2_state{state = State},
- {ok, NewMap, _, _} = v2_solve_reference(Fun, Map, V2State),
- {ok, NewMap}.
+ try v2_solve_reference(Fun, FunMap, V2State) of
+ {ok, NewMap, _, _} -> NewMap
+ catch
+ throw:infinite_loop:Stack ->
+ erlang:raise(error,
+ {"Infinite loop detected, please report this bug.",
+ Fun,
+ State#state.module},
+ Stack)
+ end.
v2_solve(#constraint{}=C, Map, V2State) ->
case solve_one_c(C, Map) of
@@ -1996,20 +1886,22 @@ v2_solve_reference(Id, Map, V2State0) ->
{ok, Dom} -> t_fun(Dom, t_none())
end,
{FunType0, V2State1};
- {ok, NewMap, V2State1, U} ->
+ {ok, ResMap, V2State1, ResU} ->
?debug("Done solving fun: ~tp\n", [debug_lookup_name(Id)]),
- FunType0 = lookup_type(Id, NewMap),
- V2State2 = save_local_map(V2State1, Id, U, NewMap),
+ FunType0 = lookup_type(Id, ResMap),
+ V2State2 = save_local_map(V2State1, Id, ResU, ResMap),
{FunType0, V2State2}
end,
?debug("ref Id=~w Assigned ~ts\n", [Id, format_type(FunType)]),
- {NewMap1, U1} = enter_var_type(Id, FunType, Map),
- {NewMap2, U2} =
- case state__get_rec_var(Id, State) of
- {ok, Var} -> enter_var_type(Var, FunType, NewMap1);
- error -> {NewMap1, []}
- end,
- {ok, NewMap2, V2State, lists:umerge(U1, U2)}.
+ {NewMap0, U0} = enter_var_type(Id, FunType, Map),
+ case state__get_rec_var(Id, State) of
+ {ok, Var} ->
+ %% `Id` and `Var` are one and the same, so they need to be unified.
+ {ok, {NewMap, U}} = refine_bindings([{Var, FunType}], NewMap0, U0),
+ {ok, NewMap, V2State, U};
+ error ->
+ {ok, NewMap0, V2State, U0}
+ end.
v2_solve_self_recursive(Cs, Map, Id, RecType0, V2State0) ->
?debug("Solving self recursive ~tw\n", [debug_lookup_name(Id)]),
@@ -2117,33 +2009,34 @@ v2_solve_disj(Is, [C|Cs], I, Map, V2State, UL, MapL, Eval, Uneval0, Failed) ->
not is_failed_list(C, V2State)] ++ Uneval0,
v2_solve_disj(Is, Cs, I+1, Map, V2State, UL, MapL, Eval, Uneval, Failed).
-save_local_map(#v2_state{constr_data = ConData}=V2State, Id, U, Map) ->
- Part0 = [{V,maps:get(V, Map)} || V <- U],
- Part1 =
- case maps:find(Id, ConData) of
- error -> []; % cannot happen
- {ok, {Part2,[]}} -> Part2
- end,
+save_local_map(#v2_state{constr_data = ConData0}=V2State, Id, U, Map) ->
?debug("save local map Id=~w:\n", [Id]),
- Part = lists:ukeymerge(1, lists:keysort(1, Part0), Part1),
- ?pp_map("New Part", maps:from_list(Part0)),
- ?pp_map("Old Part", maps:from_list(Part1)),
- ?pp_map(" => Part", maps:from_list(Part)),
- V2State#v2_state{constr_data = maps:put(Id, {Part,[]}, ConData)}.
+
+ {Part0, []} = maps:get(Id, ConData0, {#{}, []}),
+ ?pp_map("Old Part", Part0),
+
+ Part = maps:merge(Part0, maps:with(U, Map)),
+ ?pp_map(" => Part", Part),
+
+ ConData = ConData0#{ Id => {Part,[]} },
+ V2State#v2_state{constr_data = ConData}.
restore_local_map(#v2_state{constr_data = ConData}, Id, Map0) ->
- case maps:find(Id, ConData) of
- error -> Map0;
- {ok, failed} -> Map0;
- {ok, {[],_}} -> Map0;
- {ok, {Part0,U}} ->
- Part = [KV || {K,_V} = KV <- Part0, not lists:member(K, U)],
+ case ConData of
+ #{ Id := {Part0, U} } when map_size(Part0) =/= 0 ->
?debug("restore local map Id=~w U=~w\n", [Id, U]),
- ?pp_map("Part", maps:from_list(Part)),
+
?pp_map("Map0", Map0),
- Map = lists:foldl(fun({K,V}, D) -> maps:put(K, V, D) end, Map0, Part),
+
+ Part = maps:without(U, Part0),
+ ?pp_map("Part", Part0),
+
+ Map = maps:merge(Map0, Part),
?pp_map("Map", Map),
- Map
+
+ Map;
+ #{} ->
+ Map0
end.
v2_solve_conjunct(Conj, Map, V2State0) ->
@@ -2189,18 +2082,19 @@ v2_solve_conj([I|Is], [Cs|Tail], I, Map0, Conj, IsFlat, V2State0,
[U|UL], NewFs, VarsUp, LastMap, LastFlags)
end;
v2_solve_conj([], _Cs, _I, Map, Conj, IsFlat, V2State, UL, NewFs, VarsUp,
- LastMap, LastFlags) ->
+ LastMap, LastFlags) ->
U = lists:umerge(UL),
case lists:umerge(NewFs) of
[] ->
?debug("conjunct finished Id=~w\n", [Conj#constraint_list.id]),
{ok, Map, V2State, lists:umerge([U|VarsUp])};
NewFlags when NewFlags =:= LastFlags, Map =:= LastMap ->
- %% A loop was detected! The cause is some bug, possibly in erl_types.
- %% The evaluation continues, but the results can be wrong.
- report_detected_loop(Conj),
- {ok, Map, V2State, lists:umerge([U|VarsUp])};
+ %% We're stuck in an infinite loop, so we'll crash in the hopes of
+ %% getting a report. Trying to return anyway will yield potentially
+ %% misleading results.
+ throw(infinite_loop);
NewFlags ->
+ ?debug("conjunct restart Id=~w\n", [Conj#constraint_list.id]),
#constraint_list{type = conj, list = Cs} = Conj,
v2_solve_conj(NewFlags, Cs, 1, Map, Conj, IsFlat, V2State,
[], [], [U|VarsUp], Map, NewFlags)
@@ -2218,14 +2112,6 @@ v2_solve_conj(Is, [_|Tail], I, Map, Conj, IsFlat, V2State, UL, NewFs, VarsUp,
v2_solve_conj(Is, Tail, I+1, Map, Conj, IsFlat, V2State, UL, NewFs, VarsUp,
LastMap, LastFlags).
--ifdef(DEBUG_LOOP_DETECTION).
-report_detected_loop(Conj) ->
- io:format("A loop was detected in ~w\n", [Conj#constraint_list.id]).
--else.
-report_detected_loop(_) ->
- ok.
--endif.
-
add_mask_to_flags(Flags, [Im|M], I, L) when I > Im ->
add_mask_to_flags(Flags, M, I, [Im|L]);
add_mask_to_flags(Flags, [_|M], _I, L) ->
@@ -2237,24 +2123,27 @@ umerge_mask(Is, F) ->
lists:umerge(Is, F).
get_mask(V, Masks) ->
- case maps:find(V, Masks) of
- error -> [];
- {ok, M} -> M
+ case Masks of
+ #{ V := M } -> M;
+ #{} -> []
end.
-get_flags(#v2_state{constr_data = ConData}=V2State0, C) ->
+get_flags(#v2_state{constr_data = ConData0}=V2State0, C) ->
#constraint_list{id = Id, list = Cs, masks = Masks} = C,
- case maps:find(Id, ConData) of
- error ->
- ?debug("get_flags Id=~w Flags=all ~w\n", [Id, length(Cs)]),
- V2State = V2State0#v2_state{constr_data = maps:put(Id, {[],[]}, ConData)},
- {V2State, [every_i]};
- {ok, failed} ->
- {V2State0, failed_list};
- {ok, {Part,U}} when U =/= [] ->
+ case ConData0 of
+ #{ Id := {Part, U} } ->
+ true = U =/= [], %Assertion.
?debug("get_flags Id=~w U=~w\n", [Id, U]),
- V2State = V2State0#v2_state{constr_data = maps:put(Id, {Part,[]}, ConData)},
- save_updated_vars_list(Cs, vars_per_child(U, Masks), V2State)
+ ConData = ConData0#{ Id => {Part, []}},
+ V2State = V2State0#v2_state{constr_data = ConData},
+ save_updated_vars_list(Cs, vars_per_child(U, Masks), V2State);
+ #{ Id := failed } ->
+ {V2State0, failed_list};
+ #{} ->
+ ?debug("get_flags Id=~w Flags=all ~w\n", [Id, length(Cs)]),
+ ConData = ConData0#{ Id => {#{}, []}},
+ V2State = V2State0#v2_state{constr_data = ConData},
+ {V2State, [every_i]}
end.
vars_per_child(U, Masks) ->
@@ -2279,16 +2168,16 @@ save_updated_vars(#constraint_ref{id = Id}, U, V2State) ->
Cs = state__get_cs(Id, V2State#v2_state.state),
save_updated_vars(Cs, U, V2State).
-save_updated_vars1(V2State, C, U) ->
- #v2_state{constr_data = ConData} = V2State,
- #constraint_list{id = Id} = C,
- case maps:find(Id, ConData) of
- error -> V2State; % error means everything is flagged
- {ok, failed} -> V2State;
- {ok, {Part,U0}} ->
+save_updated_vars1(#v2_state{constr_data = ConData0} = V2State,
+ #constraint_list{id = Id}, U) ->
+ case ConData0 of
+ #{ Id := {Part, U0} } ->
%% Duplicates are not so common; let masks/2 remove them.
- U1 = U ++ U0,
- V2State#v2_state{constr_data = maps:put(Id, {Part,U1}, ConData)}
+ ConData = ConData0#{ Id => {Part, U ++ U0}},
+ V2State#v2_state{constr_data = ConData};
+ #{} ->
+ %% Everything is flagged
+ V2State
end.
-ifdef(DEBUG).
@@ -2298,7 +2187,7 @@ pp_constr_data(_Tag, #v2_state{constr_data = D}) ->
case _PartU of
{_Part, _U} ->
io:format("Id: ~w Vars: ~w\n", [_Id, _U]),
- [?pp_map("Part", maps:from_list(_Part)) || _Part =/= []];
+ [?pp_map("Part", _Part) || _Part =/= #{}];
failed ->
io:format("Id: ~w failed list\n", [_Id])
end
@@ -2311,168 +2200,17 @@ pp_constr_data(_Tag, _V2State) ->
ok.
-endif.
-failed_list(#constraint_list{id = Id}, #v2_state{constr_data = D}=V2State) ->
+failed_list(#constraint_list{id = Id}, #v2_state{constr_data = D0}=V2State) ->
?debug("error list ~w~n", [Id]),
- V2State#v2_state{constr_data = maps:put(Id, failed, D)}.
+ D = D0#{ Id => failed },
+ V2State#v2_state{constr_data = D}.
is_failed_list(#constraint_list{id = Id}, #v2_state{constr_data = D}) ->
- maps:find(Id, D) =:= {ok, failed}.
-
-%% Solver v1
-
-solve_ref_or_list(#constraint_ref{id = Id, deps = Deps},
- Map, MapDict, State) ->
- {OldLocalMap, Check} =
- case maps:find(Id, MapDict) of
- error -> {map_new(), false};
- {ok, M} -> {M, true}
- end,
- ?debug("Checking ref to fun: ~tw\n", [debug_lookup_name(Id)]),
- %% Note: mk_constraint_ref() has already removed Id from Deps. The
- %% reason for doing it there is that it makes it easy for
- %% calculate_masks() to make the corresponding adjustment for
- %% version v2.
- CheckDeps = ordsets:del_element(t_var_name(Id), Deps),
- true = CheckDeps =:= Deps,
- case Check andalso maps_are_equal(OldLocalMap, Map, CheckDeps) of
- true ->
- ?debug("Equal\n", []),
- {ok, MapDict, Map};
- false ->
- ?debug("Not equal. Solving\n", []),
- Cs = state__get_cs(Id, State),
- Res =
- case state__is_self_rec(Id, State) of
- true -> solve_self_recursive(Cs, Map, MapDict, Id, t_none(), State);
- false -> solve_ref_or_list(Cs, Map, MapDict, State)
- end,
- {NewMapDict, FunType} =
- case Res of
- {error, NewMapDict0} ->
- ?debug("Error solving for function ~tp\n", [debug_lookup_name(Id)]),
- Arity = state__fun_arity(Id, State),
- FunType0 =
- case state__prop_domain(t_var_name(Id), State) of
- error -> t_fun(Arity, t_none());
- {ok, Dom} -> t_fun(Dom, t_none())
- end,
- {NewMapDict0, FunType0};
- {ok, NewMapDict0, NewMap} ->
- ?debug("Done solving fun: ~tp\n", [debug_lookup_name(Id)]),
- FunType0 = lookup_type(Id, NewMap),
- {NewMapDict0, FunType0}
- end,
- ?debug(" Id=~w Assigned ~ts\n", [Id, format_type(FunType)]),
- NewMap1 = enter_type(Id, FunType, Map),
- NewMap2 =
- case state__get_rec_var(Id, State) of
- {ok, Var} -> enter_type(Var, FunType, NewMap1);
- error -> NewMap1
- end,
- {ok, maps:put(Id, NewMap2, NewMapDict), NewMap2}
- end;
-solve_ref_or_list(#constraint_list{type=Type, list = Cs, deps = Deps, id = Id},
- Map, MapDict, State) ->
- {OldLocalMap, Check} =
- case maps:find(Id, MapDict) of
- error -> {map_new(), false};
- {ok, M} -> {M, true}
- end,
- ?debug("Checking ref to list: ~w\n", [Id]),
- if
- OldLocalMap =:= error -> {error, MapDict};
- true ->
- case Check andalso maps_are_equal(OldLocalMap, Map, Deps) of
- true ->
- ?debug("~tw equal ~w\n", [Type, Id]),
- {ok, MapDict, Map};
- false ->
- ?debug("~tw not equal: ~w. Solving\n", [Type, Id]),
- solve_clist(Cs, Type, Id, Deps, MapDict, Map, State)
- end
+ case D of
+ #{ Id := failed } -> true;
+ #{} -> false
end.
-solve_self_recursive(Cs, Map, MapDict, Id, RecType0, State) ->
- ?debug("Solving self recursive ~tw\n", [debug_lookup_name(Id)]),
- {ok, RecVar} = state__get_rec_var(Id, State),
- ?debug("OldRecType ~ts\n", [format_type(RecType0)]),
- RecType = t_limit(RecType0, ?TYPE_LIMIT),
- Map1 = enter_type(RecVar, RecType, erase_type(t_var_name(Id), Map)),
- ?pp_map("Map1", Map1),
- case solve_ref_or_list(Cs, Map1, MapDict, State) of
- {error, _} = Error ->
- case t_is_none(RecType0) of
- true ->
- %% Try again and assume that this is a non-terminating function.
- Arity = state__fun_arity(Id, State),
- NewRecType = t_fun(lists:duplicate(Arity, t_any()), t_unit()),
- solve_self_recursive(Cs, Map, MapDict, Id, NewRecType, State);
- false ->
- Error
- end;
- {ok, NewMapDict, NewMap} ->
- ?pp_map("NewMap", NewMap),
- NewRecType = unsafe_lookup_type(Id, NewMap),
- case is_equal(NewRecType, RecType0) of
- true ->
- {ok, NewMapDict, enter_type(RecVar, NewRecType, NewMap)};
- false ->
- solve_self_recursive(Cs, Map, MapDict, Id, NewRecType, State)
- end
- end.
-
-solve_clist(Cs, conj, Id, Deps, MapDict, Map, State) ->
- case solve_cs(Cs, Map, MapDict, State) of
- {error, NewMapDict} ->
- {error, maps:put(Id, error, NewMapDict)};
- {ok, NewMapDict, NewMap} = Ret ->
- case Cs of
- [_] ->
- %% Just a special case for one conjunctive constraint.
- Ret;
- _ ->
- case maps_are_equal(Map, NewMap, Deps) of
- true -> {ok, maps:put(Id, NewMap, NewMapDict), NewMap};
- false -> solve_clist(Cs, conj, Id, Deps, NewMapDict, NewMap, State)
- end
- end
- end;
-solve_clist(Cs, disj, Id, _Deps, MapDict, Map, State) ->
- Fun = fun(C, Dict) ->
- case solve_ref_or_list(C, Map, Dict, State) of
- {ok, NewDict, NewMap} -> {{ok, NewMap}, NewDict};
- {error, _NewDict} = Error -> Error
- end
- end,
- {Maps, NewMapDict} = lists:mapfoldl(Fun, MapDict, Cs),
- case [X || {ok, X} <- Maps] of
- [] -> {error, maps:put(Id, error, NewMapDict)};
- MapList ->
- NewMap = join_maps(MapList),
- {ok, maps:put(Id, NewMap, NewMapDict), NewMap}
- end.
-
-solve_cs([#constraint_ref{} = C|Tail], Map, MapDict, State) ->
- case solve_ref_or_list(C, Map, MapDict, State) of
- {ok, NewMapDict, Map1} -> solve_cs(Tail, Map1, NewMapDict, State);
- {error, _NewMapDict} = Error -> Error
- end;
-solve_cs([#constraint_list{} = C|Tail], Map, MapDict, State) ->
- case solve_ref_or_list(C, Map, MapDict, State) of
- {ok, NewMapDict, Map1} -> solve_cs(Tail, Map1, NewMapDict, State);
- {error, _NewMapDict} = Error -> Error
- end;
-solve_cs([#constraint{} = C|Tail], Map, MapDict, State) ->
- case solve_one_c(C, Map) of
- error ->
- report_failed_constraint(C, Map),
- {error, MapDict};
- {ok, {NewMap, _U}} ->
- solve_cs(Tail, NewMap, MapDict, State)
- end;
-solve_cs([], Map, MapDict, _State) ->
- {ok, MapDict, Map}.
-
solve_one_c(#constraint{lhs = Lhs, rhs = Rhs, op = Op}, Map) ->
LhsType = lookup_type(Lhs, Map),
RhsType = lookup_type(Rhs, Map),
@@ -2498,22 +2236,50 @@ solve_one_c(#constraint{lhs = Lhs, rhs = Rhs, op = Op}, Map) ->
end.
solve_subtype(Type, Inf, Map) ->
- %% case cerl:is_literal(Type) of
- %% true ->
- %% case t_is_subtype(t_from_term(cerl:concrete(Type)), Inf) of
- %% true -> {ok, Map};
- %% false -> error
- %% end;
- %% false ->
- try t_unify(Type, Inf) of
- {_, List} -> {ok, enter_type_list(List, Map)}
- catch
- throw:{mismatch, _T1, _T2} ->
- ?debug("Mismatch between ~ts and ~ts\n",
- [format_type(_T1), format_type(_T2)]),
- error
- end.
- %% end.
+ try t_unify_table_only(Type, Inf) of
+ Bindings ->
+ refine_bindings(maps:to_list(Bindings), Map, [])
+ catch
+ throw:{mismatch, _T1, _T2} ->
+ ?debug("Mismatch between ~ts and ~ts\n",
+ [format_type(_T1), format_type(_T2)]),
+ error
+ end.
+
+%% Similar to enter_type/3 over a list, but refines known types rather than
+%% replaces them.
+refine_bindings([{Key, Val} | Tail], Map, U0) ->
+ ?debug("Unifying ~ts :: ~ts\n",
+ [format_type(t_var(Key)), format_type(Val)]),
+ %% It's important to keep opaque types whose internal structure is any(),
+ %% hence the equality check on t_any() rather than t_is_any/1.
+ case t_is_equal(Val, t_any()) of
+ true ->
+ refine_bindings(Tail, maps:remove(Key, Map), U0);
+ false ->
+ LimitedVal = t_limit(Val, ?INTERNAL_TYPE_LIMIT),
+ case Map of
+ #{ Key := Old } ->
+ LimitedInf = t_inf(Old, LimitedVal),
+ case t_is_none(LimitedInf) of
+ true ->
+ error;
+ false ->
+ case t_is_equal(Old, LimitedInf) of
+ true ->
+ refine_bindings(Tail, Map, U0);
+ false ->
+ U = ordsets:add_element(Key, U0),
+ refine_bindings(Tail, Map#{ Key => LimitedInf }, U)
+ end
+ end;
+ #{} ->
+ U = ordsets:add_element(Key, U0),
+ refine_bindings(Tail, Map#{ Key => LimitedVal }, U)
+ end
+ end;
+refine_bindings([], Map, U) ->
+ {ok, {Map, U}}.
report_failed_constraint(_C, _Map) ->
?debug("+++++++++++\nFailed: ~ts :: ~ts ~w ~ts :: ~ts\n+++++++++++\n",
@@ -2529,15 +2295,6 @@ report_failed_constraint(_C, _Map) ->
%%
%% ============================================================================
-map_new() ->
- maps:new().
-
-join_maps([Map]) ->
- Map;
-join_maps(Maps) ->
- Keys = constrained_keys(Maps),
- join_maps(Keys, Maps, map_new()).
-
constrained_keys(Maps) ->
lists:foldl(fun(TmpMap, AccKeys) ->
[Key || Key <- AccKeys, maps:is_key(Key, TmpMap)]
@@ -2564,43 +2321,6 @@ join_one_key(Key, [Map|Maps], Type) ->
join_one_key(_Key, [], Type) ->
Type.
-maps_are_equal(Map1, Map2, Deps) ->
- NewDeps = prune_keys(Map1, Map2, Deps),
- maps_are_equal_1(Map1, Map2, NewDeps).
-
-maps_are_equal_1(Map1, Map2, [H|Tail]) ->
- T1 = lookup_type(H, Map1),
- T2 = lookup_type(H, Map2),
- case is_equal(T1, T2) of
- true -> maps_are_equal_1(Map1, Map2, Tail);
- false ->
- ?debug("~w: ~ts =/= ~ts\n", [H, format_type(T1), format_type(T2)]),
- false
- end;
-maps_are_equal_1(_Map1, _Map2, []) ->
- true.
-
--define(PRUNE_LIMIT, 100).
-
-prune_keys(Map1, Map2, Deps) ->
- %% This is only worthwhile if the number of deps is reasonably large,
- %% and also bigger than the number of elements in the maps.
- NofDeps = length(Deps),
- case NofDeps > ?PRUNE_LIMIT of
- true ->
- Keys1 = maps:keys(Map1),
- case length(Keys1) > NofDeps of
- true ->
- Set1 = lists:sort(Keys1),
- Set2 = lists:sort(maps:keys(Map2)),
- ordsets:intersection(ordsets:union(Set1, Set2), Deps);
- false ->
- Deps
- end;
- false ->
- Deps
- end.
-
enter_type(Key, Val, Map) when is_integer(Key) ->
?debug("Entering ~ts :: ~ts\n", [format_type(t_var(Key)), format_type(Val)]),
%% Keep any() in the map if it is opaque:
@@ -2632,15 +2352,6 @@ enter_type_lists([Key|KeyTail], [Val|ValTail], Map) ->
enter_type_lists([], [], Map) ->
Map.
-enter_type_list(KeyVals, Map) ->
- enter_type_list(KeyVals, Map, []).
-
-enter_type_list([{Key, Val}|Tail], Map, U0) ->
- {Map1,U1} = enter_type2(Key, Val, Map),
- enter_type_list(Tail, Map1, U1++U0);
-enter_type_list([], Map, U) ->
- {Map, ordsets:from_list(U)}.
-
enter_type2(Key, Val, Map) ->
Map1 = enter_type(Key, Val, Map),
{Map1, [Key || not is_same(Key, Map, Map1)]}.
@@ -2734,7 +2445,7 @@ new_state(MFAs, NextLabel, CallGraph, CServer, Plt, PropTypes0, Solvers) ->
end;
_Many -> false
end,
- PropTypes = dict:from_list(PropTypes0),
+ PropTypes = maps:from_list(PropTypes0),
#state{callgraph = CallGraph, name_map = NameMap, next_label = NextLabel,
prop_types = PropTypes, plt = Plt, scc = ordsets:from_list(SCC),
mfas = MFAs, self_rec = SelfRec, solvers = Solvers,
@@ -2834,29 +2545,29 @@ state__new_constraint_context(State) ->
State#state{cs = []}.
state__prop_domain(FunLabel, #state{prop_types = PropTypes}) ->
- case dict:find(FunLabel, PropTypes) of
- error -> error;
- {ok, {_Range_Fun, Dom}} -> {ok, Dom};
- {ok, FunType} -> {ok, t_fun_args(FunType)}
+ case PropTypes of
+ #{FunLabel := FunType} -> {ok, t_fun_args(FunType)};
+ #{} -> error
end.
state__add_prop_constrs(Tree, #state{prop_types = PropTypes} = State) ->
Label = cerl_trees:get_label(Tree),
- case dict:find(Label, PropTypes) of
- error -> State;
- {ok, FunType} ->
+ case PropTypes of
+ #{Label := FunType} ->
case t_fun_args(FunType) of
unknown -> State;
ArgTypes ->
case erl_types:any_none(ArgTypes) of
- true -> not_called;
+ true -> State;
false ->
?debug("Adding propagated constr: ~ts for function ~tw\n",
[format_type(FunType), debug_lookup_name(mk_var(Tree))]),
FunVar = mk_var(Tree),
state__store_conj(FunVar, sub, FunType, State)
end
- end
+ end;
+ #{} ->
+ State
end.
state__cs(#state{cs = Cs}) ->
@@ -2947,7 +2658,7 @@ mk_constraint(Lhs, Op, Rhs) ->
case Deps =:= [] of
true ->
%% This constraint is constant. Solve it immediately.
- case solve_one_c(C, map_new()) of
+ case solve_one_c(C, #{}) of
error -> throw(error);
_R ->
%% This is always true, keep it anyway for logistic reasons
@@ -2977,8 +2688,8 @@ constraint_opnd_is_any(Type) -> t_is_any(Type).
[erl_types:erl_type()]) -> #fun_var{}.
mk_fun_var(Line, Fun, Types) ->
- Deps = [t_var_name(Var) || Var <- t_collect_vars(t_product(Types))],
- #fun_var{'fun' = Fun, deps = ordsets:from_list(Deps), origin = Line}.
+ Deps = t_collect_var_names(t_product(Types)),
+ #fun_var{'fun' = Fun, deps = Deps, origin = Line}.
pp_map(S, Map) ->
?debug("\t~s: ~p\n",
@@ -2990,8 +2701,8 @@ pp_map(S, Map) ->
-spec mk_fun_var(fun((_) -> erl_types:erl_type()), [erl_types:erl_type()]) -> #fun_var{}.
mk_fun_var(Fun, Types) ->
- Deps = [t_var_name(Var) || Var <- t_collect_vars(t_product(Types))],
- #fun_var{'fun' = Fun, deps = ordsets:from_list(Deps)}.
+ Deps = t_collect_var_names(t_product(Types)),
+ #fun_var{'fun' = Fun, deps = Deps}.
-endif.
@@ -3004,15 +2715,15 @@ get_deps(#constraint_ref{deps = D}) -> D.
-spec find_constraint_deps([fvar_or_type()]) -> deps().
find_constraint_deps(List) ->
- ordsets:from_list(find_constraint_deps(List, [])).
+ find_constraint_deps(List, []).
find_constraint_deps([#fun_var{deps = Deps}|Tail], Acc) ->
- find_constraint_deps(Tail, [Deps|Acc]);
-find_constraint_deps([Type|Tail], Acc) ->
- NewAcc = [[t_var_name(D) || D <- t_collect_vars(Type)]|Acc],
- find_constraint_deps(Tail, NewAcc);
+ find_constraint_deps(Tail, ordsets:union(Deps, Acc));
+find_constraint_deps([Type | Tail], Acc0) ->
+ Acc = ordsets:union(t_collect_var_names(Type), Acc0),
+ find_constraint_deps(Tail, Acc);
find_constraint_deps([], Acc) ->
- lists:append(Acc).
+ Acc.
mk_constraint_1(Lhs, eq, Rhs, Deps) when Lhs < Rhs ->
#constraint{lhs = Lhs, op = eq, rhs = Rhs, deps = Deps};
@@ -3349,14 +3060,12 @@ find_constraint(Tuple, [#constraint_list{list = List}|Cs]) ->
find_constraint(Tuple, [_|Cs]) ->
find_constraint(Tuple, Cs).
--spec fold_literal_maybe_match(cerl:cerl(), state()) -> cerl:cerl().
+%% Test whether the term can be folded into a literal. If `State`
+%% indicates that we are in a match, folding is not possible if any
+%% literal in the term contains a map.
-fold_literal_maybe_match(Tree0, State) ->
- Tree1 = cerl:fold_literal(Tree0),
- case state__is_in_match(State) of
- false -> Tree1;
- true -> dialyzer_utils:refold_pattern(Tree1)
- end.
+is_foldable(Tree, State) ->
+ dialyzer_utils:is_foldable(Tree, state__is_in_match(State)).
lookup_record(State, Tag, Arity) ->
#state{module = M, mod_records = ModRecs, cserver = CServer} = State,
diff --git a/lib/dialyzer/src/dialyzer_utils.erl b/lib/dialyzer/src/dialyzer_utils.erl
index c4ac96c9dc..292c01f7aa 100644
--- a/lib/dialyzer/src/dialyzer_utils.erl
+++ b/lib/dialyzer/src/dialyzer_utils.erl
@@ -31,6 +31,7 @@
get_record_and_type_info/1,
get_spec_info/3,
get_fun_meta_info/3,
+ is_foldable/2,
is_suppressed_fun/2,
is_suppressed_tag/3,
is_compiler_generated/1,
@@ -47,9 +48,21 @@
family/1
]).
+%% For dialyzer_worker.
+-export([process_record_remote_types_module/2]).
+
+-export_type([record_remote_types_init_data/0,
+ record_remote_types_result/0]).
+
-include("dialyzer.hrl").
-include("../../compiler/src/core_parse.hrl").
+-type ext_types_message() :: {pid(), 'ext_types',
+ {mfa(), {file:filename(), erl_anno:location()}}}
+ | {'error', io_lib:chars()}.
+-type record_remote_types_init_data() :: codeserver().
+-type record_remote_types_result() :: [ext_types_message()].
+
%%-define(DEBUG, true).
-ifdef(DEBUG).
@@ -233,60 +246,104 @@ get_record_fields([], _RecDict, Acc) ->
%% The field types are cached. Used during analysis when handling records.
process_record_remote_types(CServer) ->
- ExpTypes = dialyzer_codeserver:get_exported_types(CServer),
- Mods = dialyzer_codeserver:all_temp_modules(CServer),
- process_opaque_types0(Mods, CServer, ExpTypes),
+ case dialyzer_codeserver:all_temp_modules(CServer) of
+ [] ->
+ CServer;
+ Mods ->
+ ExpTypes = dialyzer_codeserver:get_exported_types_table(CServer),
+ process_opaque_types0(Mods, CServer, ExpTypes),
+ %% CodeServer is updated by each worker, but is still valid
+ %% after updates. Workers call
+ %% process_record_remote_types_module/2 below.
+ Return =
+ dialyzer_coordinator:parallel_job(record_remote_types,
+ Mods,
+ _InitData=CServer,
+ _Timing=none),
+ %% We need to pass on messages and thrown errors from erl_types:
+ _ = [self() ! {self(), ext_types, ExtType} ||
+ {_, ext_types, ExtType} <- Return],
+ case [Error || {error, _} = Error <- Return] of
+ [] ->
+ check_record_fields(Mods, CServer, ExpTypes),
+ dialyzer_codeserver:finalize_records(CServer);
+ [Error | _] ->
+ throw(Error)
+ end
+ end.
+
+-spec process_record_remote_types_module(module(),
+ dialyzer_codeserver:codeserver()) ->
+ [ext_types_message()].
+
+process_record_remote_types_module(Module, CServer) ->
+
+ ExpTypes = dialyzer_codeserver:get_exported_types_table(CServer),
VarTable = erl_types:var_table__new(),
RecordTable = dialyzer_codeserver:get_temp_records_table(CServer),
- ModuleFun =
- fun(Module) ->
- RecordMap = dialyzer_codeserver:lookup_temp_mod_records(Module, CServer),
- RecordFun =
- fun({Key, Value}, C2) ->
- case Key of
- {record, Name} ->
- {FileLocation, Fields} = Value,
- {File, _Location} = FileLocation,
- FieldFun =
- fun({Arity, Fields0}, C4) ->
- MRA = {Module, Name, Arity},
- Site = {record, MRA, File},
- {Fields1, C7} =
- lists:mapfoldl(fun({FieldName, Field, _}, C5) ->
- check_remote(Field, ExpTypes, MRA,
- File, RecordTable),
- {FieldT, C6} =
- erl_types:t_from_form
- (Field, ExpTypes, Site,
- RecordTable, VarTable,
- C5),
- {{FieldName, Field, FieldT}, C6}
- end, C4, Fields0),
- {{Arity, Fields1}, C7}
- end,
- {FieldsList, C3} =
- lists:mapfoldl(FieldFun, C2, orddict:to_list(Fields)),
- {{Key, {FileLocation, orddict:from_list(FieldsList)}}, C3};
- {_TypeOrOpaque, Name, NArgs} ->
- %% Make sure warnings about unknown types are output
- %% also for types unused by specs.
- MTA = {Module, Name, NArgs},
- {{_Module, FileLocation, Form, _ArgNames}, _Type} = Value,
- {File, _Location} = FileLocation,
- check_remote(Form, ExpTypes, MTA, File, RecordTable),
- {{Key, Value}, C2}
- end
- end,
- Cache = erl_types:cache__new(),
- {RecordList, _NewCache} =
- lists:mapfoldl(RecordFun, Cache, maps:to_list(RecordMap)),
- dialyzer_codeserver:store_temp_records(Module,
- maps:from_list(RecordList),
- CServer)
+ RecordMap = dialyzer_codeserver:lookup_temp_mod_records(Module, CServer),
+ RecordFun =
+ fun({Key, Value}, C2) ->
+ case Key of
+ {record, Name} ->
+ {FileLocation, Fields} = Value,
+ {File, _Location} = FileLocation,
+ FieldFun =
+ fun({Arity, Fields0}, C4) ->
+ MRA = {Module, Name, Arity},
+ Site = {record, MRA, File},
+ {Fields1, C7} =
+ lists:mapfoldl(fun({FieldName, Field, _}, C5) ->
+ check_remote(Field, ExpTypes, MRA,
+ File, RecordTable),
+ {FieldT, C6} =
+ erl_types:t_from_form
+ (Field, ExpTypes, Site,
+ RecordTable, VarTable,
+ C5),
+ {{FieldName, Field, FieldT}, C6}
+ end, C4, Fields0),
+ {{Arity, Fields1}, C7}
+ end,
+ {FieldsList, C3} =
+ lists:mapfoldl(FieldFun, C2, orddict:to_list(Fields)),
+ {{Key, {FileLocation, orddict:from_list(FieldsList)}}, C3};
+ {_TypeOrOpaque, Name, NArgs} ->
+ %% Make sure warnings about unknown types are output
+ %% also for types unused by specs.
+ MTA = {Module, Name, NArgs},
+ {{_Module, FileLocation, Form, _ArgNames}, _Type} = Value,
+ {File, _Location} = FileLocation,
+ check_remote(Form, ExpTypes, MTA, File, RecordTable),
+ {{Key, Value}, C2}
+ end
end,
- lists:foreach(ModuleFun, Mods),
- check_record_fields(Mods, CServer, ExpTypes),
- dialyzer_codeserver:finalize_records(CServer).
+ Cache = erl_types:cache__new(),
+ try
+ {RecordList, _NewCache} =
+ lists:mapfoldl(RecordFun, Cache, maps:to_list(RecordMap)),
+ _NewCodeServer =
+ dialyzer_codeserver:store_temp_records(Module,
+ maps:from_list(RecordList),
+ CServer),
+ rcv_ext_types()
+ catch
+ throw:{error, _}=Error ->
+ [Error] ++ rcv_ext_types()
+ end.
+
+rcv_ext_types() ->
+ Self = self(),
+ Self ! {Self, done},
+ rcv_ext_types(Self, []).
+
+rcv_ext_types(Self, ExtTypes) ->
+ receive
+ {Self, ext_types, _} = ExtType ->
+ rcv_ext_types(Self, [ExtType | ExtTypes]);
+ {Self, done} ->
+ lists:usort(ExtTypes)
+ end.
%% erl_types:t_from_form() substitutes the declaration of opaque types
%% for the expanded type in some cases. To make sure the initial type,
@@ -934,6 +991,32 @@ segs_from_bitstring(Bitstring) ->
%%------------------------------------------------------------------------------
+
+%% Test whether the term can be folded into a literal.
+%% If the boolean `InMatch` indicates that the term is used in a
+%% match, folding is not possible if any literal in the term
+%% contains a map.
+
+-spec is_foldable(cerl:cerl(), boolean()) -> boolean().
+
+is_foldable(Tree, InMatch) ->
+ case cerl:type(Tree) of
+ cons ->
+ is_foldable(cerl:cons_hd(Tree), InMatch) andalso
+ is_foldable(cerl:cons_tl(Tree), InMatch);
+ tuple ->
+ is_foldable_list(cerl:tuple_es(Tree), InMatch);
+ literal ->
+ not (InMatch andalso find_map(cerl:concrete(Tree)));
+ _ ->
+ false
+ end.
+
+is_foldable_list([E|Es], InMatch) ->
+ is_foldable(E, InMatch) andalso is_foldable_list(Es, InMatch);
+is_foldable_list([], _InMatch) ->
+ true.
+
-spec refold_pattern(cerl:cerl()) -> cerl:cerl().
refold_pattern(Pat) ->
diff --git a/lib/dialyzer/src/dialyzer_worker.erl b/lib/dialyzer/src/dialyzer_worker.erl
index af0f2e9e08..c9ceb75a40 100644
--- a/lib/dialyzer/src/dialyzer_worker.erl
+++ b/lib/dialyzer/src/dialyzer_worker.erl
@@ -12,6 +12,8 @@
%% See the License for the specific language governing permissions and
%% limitations under the License.
+%% Purpose: Run individual jobs in separate processes.
+
-module(dialyzer_worker).
-export([launch/4]).
@@ -29,12 +31,9 @@
mode :: mode(),
job :: job(),
coordinator :: coordinator(),
- init_data :: init_data(),
- depends_on = [] :: list()
+ init_data :: init_data()
}).
--include("dialyzer.hrl").
-
%% -define(DEBUG, true).
-ifdef(DEBUG).
@@ -55,85 +54,46 @@ launch(Mode, Job, InitData, Coordinator) ->
spawn_link(fun() -> init(State) end).
%%--------------------------------------------------------------------
+%% Local functions.
-init(#state{job = SCC, mode = Mode, init_data = InitData,
- coordinator = Coordinator} = State) when
- Mode =:= 'typesig'; Mode =:= 'dataflow' ->
- DependsOnSCCs = dialyzer_succ_typings:find_depends_on(SCC, InitData),
- ?debug("~w: Deps ~p: ~p\n", [self(), SCC, DependsOnSCCs]),
- Pids = dialyzer_coordinator:sccs_to_pids(DependsOnSCCs, Coordinator),
- ?debug("~w: PidsDeps ~p\n", [self(), Pids]),
- DependsOn = [{Pid, erlang:monitor(process, Pid)} || Pid <- Pids],
- loop(updating, State#state{depends_on = DependsOn});
+init(#state{job = SCC, mode = Mode, init_data = InitData} = State)
+ when Mode =:= 'typesig'; Mode =:= 'dataflow' ->
+ wait_for_success_typings(SCC, InitData, State),
+ run(State);
init(#state{mode = Mode} = State) when
- Mode =:= 'compile'; Mode =:= 'warnings' ->
- loop(running, State).
-
-loop(updating, #state{mode = Mode} = State) when
- Mode =:= 'typesig'; Mode =:= 'dataflow' ->
- ?debug("~w: Update: ~p\n", [self(), State#state.job]),
- NextStatus =
- case waits_more_success_typings(State) of
- true -> waiting;
- false -> running
- end,
- loop(NextStatus, State);
-loop(waiting, #state{mode = Mode} = State) when
- Mode =:= 'typesig'; Mode =:= 'dataflow' ->
- ?debug("~w: Wait: ~p\n", [self(), State#state.job]),
- NewState = wait_for_success_typings(State),
- loop(updating, NewState);
-loop(running, #state{mode = 'compile'} = State) ->
- request_activation(State),
- ?debug("Compile: ~s\n",[State#state.job]),
- Result =
- case start_compilation(State) of
- {ok, EstimatedSize, Data} ->
- Label = ask_coordinator_for_label(EstimatedSize, State),
- continue_compilation(Label, Data);
- {error, _Reason} = Error ->
- Error
- end,
- report_to_coordinator(Result, State);
-loop(running, #state{mode = 'warnings'} = State) ->
- request_activation(State),
- ?debug("Warning: ~s\n",[State#state.job]),
- Result = collect_warnings(State),
- report_to_coordinator(Result, State);
-loop(running, #state{mode = Mode} = State) when
- Mode =:= 'typesig'; Mode =:= 'dataflow' ->
- request_activation(State),
- ?debug("~w: Run: ~p\n", [self(), State#state.job]),
- NotFixpoint = do_work(State),
- report_to_coordinator(NotFixpoint, State).
-
-waits_more_success_typings(#state{depends_on = Depends}) ->
- Depends =/= [].
-
-wait_for_success_typings(#state{depends_on = DependsOn} = State) ->
- receive
- {'DOWN', Ref, process, Pid, _Info} ->
- ?debug("~w: ~p got DOWN: ~p\n", [self(), State#state.job, Pid]),
- State#state{depends_on = DependsOn -- [{Pid, Ref}]}
- after
- 5000 ->
- ?debug("~w: Still Waiting ~p:\n ~p\n", [self(), State#state.job, DependsOn]),
- State
- end.
+ Mode =:= 'compile'; Mode =:= 'warnings';
+ Mode =:= 'contract_remote_types'; Mode =:= 'record_remote_types' ->
+ run(State).
-request_activation(#state{coordinator = Coordinator}) ->
- dialyzer_coordinator:request_activation(Coordinator).
+run(#state{coordinator = Coordinator, job = Job} = State) ->
+ dialyzer_coordinator:request_activation(Coordinator),
+ Result = run_job(State),
+ ?debug("~w: Done: ~p\n",[self(), Job]),
+ dialyzer_coordinator:job_done(Job, Result, Coordinator).
-do_work(#state{mode = Mode, job = Job, init_data = InitData}) ->
+run_job(#state{mode = Mode, job = Job, init_data = InitData} = State) ->
+ ?debug("~w: ~p: ~p\n", [self(), Mode, Job]),
case Mode of
- typesig -> dialyzer_succ_typings:find_succ_types_for_scc(Job, InitData);
- dataflow -> dialyzer_succ_typings:refine_one_module(Job, InitData)
+ compile ->
+ case start_compilation(State) of
+ {ok, EstimatedSize, Data} ->
+ Label = ask_coordinator_for_label(EstimatedSize, State),
+ continue_compilation(Label, Data);
+ {error, _Reason} = Error ->
+ Error
+ end;
+ typesig ->
+ dialyzer_succ_typings:find_succ_types_for_scc(Job, InitData);
+ dataflow ->
+ dialyzer_succ_typings:refine_one_module(Job, InitData);
+ contract_remote_types ->
+ dialyzer_contracts:process_contract_remote_types_module(Job, InitData);
+ record_remote_types ->
+ dialyzer_utils:process_record_remote_types_module(Job, InitData);
+ warnings ->
+ dialyzer_succ_typings:collect_warnings(Job, InitData)
end.
-report_to_coordinator(Result, #state{job = Job, coordinator = Coordinator}) ->
- ?debug("~w: Done: ~p\n",[self(), Job]),
- dialyzer_coordinator:job_done(Job, Result, Coordinator).
-
start_compilation(#state{job = Job, init_data = InitData}) ->
dialyzer_analysis_callgraph:start_compilation(Job, InitData).
@@ -143,5 +103,8 @@ ask_coordinator_for_label(EstimatedSize, #state{coordinator = Coordinator}) ->
continue_compilation(Label, Data) ->
dialyzer_analysis_callgraph:continue_compilation(Label, Data).
-collect_warnings(#state{job = Job, init_data = InitData}) ->
- dialyzer_succ_typings:collect_warnings(Job, InitData).
+%% Wait for the results of success typings of modules or SCCs that we
+%% depend on. ('typesig' or 'dataflow' mode)
+wait_for_success_typings(SCC, InitData, #state{coordinator = Coordinator}) ->
+ DependsOnSCCs = dialyzer_succ_typings:find_depends_on(SCC, InitData),
+ dialyzer_coordinator:wait_for_success_typings(DependsOnSCCs, Coordinator).
diff --git a/lib/dialyzer/src/erl_bif_types.erl b/lib/dialyzer/src/erl_bif_types.erl
index d755d5e3d9..eb795af0c9 100644
--- a/lib/dialyzer/src/erl_bif_types.erl
+++ b/lib/dialyzer/src/erl_bif_types.erl
@@ -772,6 +772,10 @@ type(erlang, length, 1, Xs, Opaques) ->
%% Guard bif, needs to be here.
type(erlang, map_size, 1, Xs, Opaques) ->
type(maps, size, 1, Xs, Opaques);
+type(erlang, max, 2, Xs, Opaques) ->
+ strict(erlang, max, 2, Xs,
+ fun([A, B]) -> t_sup(A, B) end,
+ Opaques);
%% Guard bif, needs to be here.
type(erlang, map_get, 2, Xs, Opaques) ->
type(maps, get, 2, Xs, Opaques);
@@ -803,6 +807,10 @@ type(erlang, make_tuple, 3, Xs, Opaques) ->
_Other -> t_tuple()
end
end, Opaques);
+type(erlang, min, 2, Xs, Opaques) ->
+ strict(erlang, min, 2, Xs,
+ fun([A, B]) -> t_sup(A, B) end,
+ Opaques);
type(erlang, nif_error, 1, Xs, Opaques) ->
%% this BIF and the next one are stubs for NIFs and never return
strict(erlang, nif_error, 1, Xs, fun (_) -> t_any() end, Opaques);
@@ -813,6 +821,13 @@ type(erlang, node, 0, _, _Opaques) -> t_node();
%% Guard bif, needs to be here.
type(erlang, node, 1, Xs, Opaques) ->
strict(erlang, node, 1, Xs, fun (_) -> t_node() end, Opaques);
+type(erlang, raise, 3, Xs, Opaques) ->
+ Ts = arg_types(erlang, raise, 3),
+ Xs1 = inf_lists(Xs, Ts, Opaques),
+ case any_is_none_or_unit(Xs1) of
+ true -> t_atom('badarg');
+ false -> t_none()
+ end;
%% Guard bif, needs to be here.
type(erlang, round, 1, Xs, Opaques) ->
strict(erlang, round, 1, Xs, fun (_) -> t_integer() end, Opaques);
@@ -2290,6 +2305,8 @@ arg_types(erlang, is_tuple, 1) ->
%% Guard bif, needs to be here.
arg_types(erlang, length, 1) ->
[t_list()];
+arg_types(erlang, max, 2) ->
+ [t_any(), t_any()];
%% Guard bif, needs to be here.
arg_types(erlang, map_size, 1) ->
[t_map()];
@@ -2302,6 +2319,8 @@ arg_types(erlang, make_tuple, 2) ->
[t_non_neg_fixnum(), t_any()]; % the value 0 is OK as first argument
arg_types(erlang, make_tuple, 3) ->
[t_non_neg_fixnum(), t_any(), t_list(t_tuple([t_pos_integer(), t_any()]))];
+arg_types(erlang, min, 2) ->
+ [t_any(), t_any()];
arg_types(erlang, nif_error, 1) ->
[t_any()];
arg_types(erlang, nif_error, 2) ->
@@ -2312,6 +2331,20 @@ arg_types(erlang, node, 0) ->
%% Guard bif, needs to be here.
arg_types(erlang, node, 1) ->
[t_identifier()];
+arg_types(erlang, raise, 3) ->
+ %% The types are based on the implementation of erlang:raise/3, not
+ %% the documention. That is, those are the types for which
+ %% erlang:raise/3 will raise an exception. If the arguments do not
+ %% conform to those types, erlang:raise/3 will return 'badarg'.
+ Class = t_sup([t_atom('error'), t_atom('exit'), t_atom('throw')]),
+ InfoList = t_list(), %erlang:raise/3 does not check the contents of the list.
+ ArityOrArgs = t_any(), %erlang:raise/3 does not check the type.
+ MFA = t_tuple([t_module(), t_atom(), ArityOrArgs]),
+ MFAS = t_tuple([t_module(), t_atom(), ArityOrArgs, InfoList]),
+ Fun = t_tuple([t_fun(), ArityOrArgs]),
+ FunI = t_tuple([t_fun(), ArityOrArgs, InfoList]),
+ Stack = t_list(t_sup([MFA, MFAS, Fun, FunI])),
+ [Class, t_any(), Stack];
%% Guard bif, needs to be here.
arg_types(erlang, round, 1) ->
[t_number()];
@@ -2551,7 +2584,6 @@ check_fun_application(Fun, Args, Opaques) ->
error
end.
-
%% =====================================================================
%% Some basic types used in various parts of the system
%% =====================================================================
diff --git a/lib/dialyzer/src/erl_types.erl b/lib/dialyzer/src/erl_types.erl
index c75baee3cb..6fe8111482 100644
--- a/lib/dialyzer/src/erl_types.erl
+++ b/lib/dialyzer/src/erl_types.erl
@@ -55,7 +55,7 @@
t_boolean/0,
t_byte/0,
t_char/0,
- t_collect_vars/1,
+ t_collect_var_names/1,
t_cons/0,
t_cons/2,
t_cons_hd/1, t_cons_hd/2,
@@ -186,7 +186,6 @@
t_reference/0,
t_singleton_to_term/2,
t_string/0,
- t_struct_from_opaque/2,
t_subst/2,
t_subtract/2,
t_subtract_list/2,
@@ -203,7 +202,7 @@
t_tuple_sizes/1,
t_tuple_subtypes/1,
t_tuple_subtypes/2,
- t_unify/2,
+ t_unify_table_only/2,
t_unit/0,
t_unopaque/1, t_unopaque/2,
t_var/1,
@@ -218,7 +217,9 @@
is_erl_type/1,
atom_to_string/1,
var_table__new/0,
- cache__new/0
+ cache__new/0,
+ module_type_deps_of_type_defs/1,
+ type_form_to_remote_modules/1
]).
-compile({no_auto_import,[min/2,max/2,map_get/2]}).
@@ -320,11 +321,9 @@
-record(int_set, {set :: [integer()]}).
-record(int_rng, {from :: rng_elem(), to :: rng_elem()}).
-%% Note: the definition of #opaque{} was changed to 'mod' and 'name';
-%% it used to be an ordsets of {Mod, Name} pairs. The Dialyzer version
-%% was updated to 2.7 due to this change.
+
-record(opaque, {mod :: module(), name :: atom(),
- args = [] :: [erl_type()], struct :: erl_type()}).
+ arity = 0 :: arity(), struct :: erl_type()}).
-define(atom(Set), #c{tag=?atom_tag, elements=Set}).
-define(bitstr(Unit, Base), #c{tag=?binary_tag, elements=[Unit,Base]}).
@@ -363,17 +362,18 @@
-type file_line() :: {file:name(), erl_anno:line()}.
-type record_key() :: {'record', atom()}.
--type type_key() :: {'type' | 'opaque', mfa()}.
+-type type_key() :: {'type' | 'opaque', {atom(), arity()}}.
-type field() :: {atom(), erl_parse:abstract_expr(), erl_type()}.
-type record_value() :: {file_line(),
[{RecordSize :: non_neg_integer(), [field()]}]}.
-type type_value() :: {{module(), file_line(),
erl_parse:abstract_type(), ArgNames :: [atom()]},
erl_type()}.
--type type_table() :: #{record_key() | type_key() =>
- record_value() | type_value()}.
+-type type_table() :: #{record_key() => record_value()} |
+ #{type_key() => type_value()}.
--opaque var_table() :: #{atom() => erl_type()}.
+-type var_name() :: atom() | integer().
+-type var_table() :: #{ var_name() => erl_type() }.
%%-----------------------------------------------------------------------------
%% Unions
@@ -436,7 +436,7 @@ t_is_none(_) -> false.
-spec t_opaque(module(), atom(), [_], erl_type()) -> erl_type().
t_opaque(Mod, Name, Args, Struct) ->
- O = #opaque{mod = Mod, name = Name, args = Args, struct = Struct},
+ O = #opaque{mod = Mod, name = Name, arity = length(Args), struct = Struct},
?opaque(set_singleton(O)).
-spec t_is_opaque(erl_type(), [erl_type()]) -> boolean().
@@ -747,7 +747,7 @@ decorate_tuples_in_sets([?tuple(Elements, Arity, Tag1) = T1|Tuples] = L1,
if
Tag1 < Tag2 -> decorate_tuples_in_sets(Tuples, L2, Opaques, [T1|Acc]);
Tag1 > Tag2 -> decorate_tuples_in_sets(L1, Ts, Opaques, Acc);
- Tag1 =:= Tag2 ->
+ Tag1 == Tag2 ->
NewElements = list_decorate(Elements, Es, Opaques),
NewAcc = [?tuple(NewElements, Arity, Tag1)|Acc],
decorate_tuples_in_sets(Tuples, Ts, Opaques, NewAcc)
@@ -780,37 +780,6 @@ t_opaque_from_records(RecMap) ->
end, OpaqueRecMap),
[OpaqueType || {_Key, OpaqueType} <- maps:to_list(OpaqueTypeMap)].
-%% Decompose opaque instances of type arg2 to structured types, in arg1
-%% XXX: Same as t_unopaque
--spec t_struct_from_opaque(erl_type(), [erl_type()]) -> erl_type().
-
-t_struct_from_opaque(?function(Domain, Range), Opaques) ->
- ?function(t_struct_from_opaque(Domain, Opaques),
- t_struct_from_opaque(Range, Opaques));
-t_struct_from_opaque(?list(Types, Term, Size), Opaques) ->
- ?list(t_struct_from_opaque(Types, Opaques),
- t_struct_from_opaque(Term, Opaques), Size);
-t_struct_from_opaque(?opaque(_) = T, Opaques) ->
- case is_opaque_type(T, Opaques) of
- true -> t_opaque_structure(T);
- false -> T
- end;
-t_struct_from_opaque(?product(Types), Opaques) ->
- ?product(list_struct_from_opaque(Types, Opaques));
-t_struct_from_opaque(?tuple(?any, _, _) = T, _Opaques) -> T;
-t_struct_from_opaque(?tuple(Types, Arity, Tag), Opaques) ->
- ?tuple(list_struct_from_opaque(Types, Opaques), Arity, Tag);
-t_struct_from_opaque(?tuple_set(Set), Opaques) ->
- NewSet = [{Sz, [t_struct_from_opaque(T, Opaques) || T <- Tuples]}
- || {Sz, Tuples} <- Set],
- ?tuple_set(NewSet);
-t_struct_from_opaque(?union(List), Opaques) ->
- t_sup(list_struct_from_opaque(List, Opaques));
-t_struct_from_opaque(Type, _Opaques) -> Type.
-
-list_struct_from_opaque(Types, Opaques) ->
- [t_struct_from_opaque(Type, Opaques) || Type <- Types].
-
%%-----------------------------------------------------------------------------
%% Unit type. Signals non termination.
%%
@@ -2359,7 +2328,6 @@ t_has_var(?map(_, DefK, _)= Map) ->
t_has_var_list(map_all_values(Map)) orelse
t_has_var(DefK);
t_has_var(?opaque(Set)) ->
- %% Assume variables in 'args' are also present i 'struct'
t_has_var_list([O#opaque.struct || O <- set_to_list(Set)]);
t_has_var(?union(List)) ->
t_has_var_list(List);
@@ -2371,45 +2339,42 @@ t_has_var_list([T|Ts]) ->
t_has_var(T) orelse t_has_var_list(Ts);
t_has_var_list([]) -> false.
--spec t_collect_vars(erl_type()) -> [erl_type()].
-
-t_collect_vars(T) ->
- Vs = t_collect_vars(T, maps:new()),
- [V || {V, _} <- maps:to_list(Vs)].
+-spec t_collect_var_names(erl_type()) -> any().
--type ctab() :: #{erl_type() => 'any'}.
+t_collect_var_names(T) ->
+ t_collect_var_names(T, []).
--spec t_collect_vars(erl_type(), ctab()) -> ctab().
+-spec t_collect_var_names(erl_type(), ordsets:ordset(term())) ->
+ ordsets:ordset(term()).
-t_collect_vars(?var(_) = Var, Acc) ->
- maps:put(Var, any, Acc);
-t_collect_vars(?function(Domain, Range), Acc) ->
- Acc1 = t_collect_vars(Domain, Acc),
- t_collect_vars(Range, Acc1);
-t_collect_vars(?list(Contents, Termination, _), Acc) ->
- Acc1 = t_collect_vars(Contents, Acc),
- t_collect_vars(Termination, Acc1);
-t_collect_vars(?product(Types), Acc) ->
+t_collect_var_names(?var(Id), Acc) ->
+ ordsets:add_element(Id, Acc);
+t_collect_var_names(?function(Domain, Range), Acc) ->
+ Acc1 = t_collect_var_names(Domain, Acc),
+ t_collect_var_names(Range, Acc1);
+t_collect_var_names(?list(Contents, Termination, _), Acc) ->
+ Acc1 = t_collect_var_names(Contents, Acc),
+ t_collect_var_names(Termination, Acc1);
+t_collect_var_names(?product(Types), Acc) ->
t_collect_vars_list(Types, Acc);
-t_collect_vars(?tuple(?any, ?any, ?any), Acc) ->
+t_collect_var_names(?tuple(?any, ?any, ?any), Acc) ->
Acc;
-t_collect_vars(?tuple(Types, _, _), Acc) ->
+t_collect_var_names(?tuple(Types, _, _), Acc) ->
t_collect_vars_list(Types, Acc);
-t_collect_vars(?tuple_set(_) = TS, Acc) ->
+t_collect_var_names(?tuple_set(_) = TS, Acc) ->
t_collect_vars_list(t_tuple_subtypes(TS), Acc);
-t_collect_vars(?map(_, DefK, _) = Map, Acc0) ->
+t_collect_var_names(?map(_, DefK, _) = Map, Acc0) ->
Acc = t_collect_vars_list(map_all_values(Map), Acc0),
- t_collect_vars(DefK, Acc);
-t_collect_vars(?opaque(Set), Acc) ->
- %% Assume variables in 'args' are also present i 'struct'
+ t_collect_var_names(DefK, Acc);
+t_collect_var_names(?opaque(Set), Acc) ->
t_collect_vars_list([O#opaque.struct || O <- set_to_list(Set)], Acc);
-t_collect_vars(?union(List), Acc) ->
+t_collect_var_names(?union(List), Acc) ->
t_collect_vars_list(List, Acc);
-t_collect_vars(_, Acc) ->
+t_collect_var_names(_, Acc) ->
Acc.
t_collect_vars_list([T|Ts], Acc0) ->
- Acc = t_collect_vars(T, Acc0),
+ Acc = t_collect_var_names(T, Acc0),
t_collect_vars_list(Ts, Acc);
t_collect_vars_list([], Acc) -> Acc.
@@ -2630,7 +2595,7 @@ t_sup(Ts) ->
t_sup1([H1, H2|T], L) ->
t_sup1(T, [t_sup(H1, H2)|L]);
-t_sup1([T], []) -> subst_all_vars_to_any(T);
+t_sup1([T], []) -> do_not_subst_all_vars_to_any(T);
t_sup1(Ts, L) ->
t_sup1(Ts++L, []).
@@ -2642,7 +2607,7 @@ t_sup(?none, T) -> T;
t_sup(T, ?none) -> T;
t_sup(?unit, T) -> T;
t_sup(T, ?unit) -> T;
-t_sup(T, T) -> subst_all_vars_to_any(T);
+t_sup(T, T) -> do_not_subst_all_vars_to_any(T);
t_sup(?var(_), _) -> ?any;
t_sup(_, ?var(_)) -> ?any;
t_sup(?atom(Set1), ?atom(Set2)) ->
@@ -2716,9 +2681,9 @@ t_sup(?tuple(?any, ?any, ?any) = T, ?tuple_set(_)) -> T;
t_sup(?tuple_set(_), ?tuple(?any, ?any, ?any) = T) -> T;
t_sup(?tuple(Elements1, Arity, Tag1) = T1,
?tuple(Elements2, Arity, Tag2) = T2) ->
- if Tag1 =:= Tag2 -> t_tuple(t_sup_lists(Elements1, Elements2));
- Tag1 =:= ?any -> t_tuple(t_sup_lists(Elements1, Elements2));
- Tag2 =:= ?any -> t_tuple(t_sup_lists(Elements1, Elements2));
+ if Tag1 == Tag2 -> t_tuple(t_sup_lists(Elements1, Elements2));
+ Tag1 == ?any -> t_tuple(t_sup_lists(Elements1, Elements2));
+ Tag2 == ?any -> t_tuple(t_sup_lists(Elements1, Elements2));
Tag1 < Tag2 -> ?tuple_set([{Arity, [T1, T2]}]);
Tag1 > Tag2 -> ?tuple_set([{Arity, [T2, T1]}])
end;
@@ -2748,8 +2713,8 @@ sup_opaque(List) ->
?opaque(ordsets:from_list(L)).
sup_opaq(L0) ->
- L1 = [{{Mod,Name,Args}, T} ||
- #opaque{mod = Mod, name = Name, args = Args}=T <- L0],
+ L1 = [{{Mod,Name,Arity}, T} ||
+ #opaque{mod = Mod, name = Name, arity = Arity}=T <- L0],
F = dialyzer_utils:family(L1),
[supl(Ts) || {_, Ts} <- F].
@@ -2824,9 +2789,10 @@ sup_tuples_in_set([?tuple(Elements1, Arity, Tag1) = T1|Left1] = L1,
if
Tag1 < Tag2 -> sup_tuples_in_set(Left1, L2, [T1|Acc]);
Tag1 > Tag2 -> sup_tuples_in_set(L1, Left2, [T2|Acc]);
- Tag2 =:= Tag2 -> NewElements = t_sup_lists(Elements1, Elements2),
- NewAcc = [?tuple(NewElements, Arity, Tag1)|Acc],
- sup_tuples_in_set(Left1, Left2, NewAcc)
+ Tag1 == Tag2 ->
+ NewElements = t_sup_lists(Elements1, Elements2),
+ NewAcc = [?tuple(NewElements, Arity, Tag1)|Acc],
+ sup_tuples_in_set(Left1, Left2, NewAcc)
end;
sup_tuples_in_set([], L2, Acc) -> lists:reverse(Acc, L2);
sup_tuples_in_set(L1, [], Acc) -> lists:reverse(Acc, L1).
@@ -2944,15 +2910,15 @@ t_inf(T1, T2) ->
-spec t_inf(erl_type(), erl_type(), t_inf_opaques()) -> erl_type().
t_inf(?var(_), ?var(_), _Opaques) -> ?any;
-t_inf(?var(_), T, _Opaques) -> subst_all_vars_to_any(T);
-t_inf(T, ?var(_), _Opaques) -> subst_all_vars_to_any(T);
-t_inf(?any, T, _Opaques) -> subst_all_vars_to_any(T);
-t_inf(T, ?any, _Opaques) -> subst_all_vars_to_any(T);
+t_inf(?var(_), T, _Opaques) -> do_not_subst_all_vars_to_any(T);
+t_inf(T, ?var(_), _Opaques) -> do_not_subst_all_vars_to_any(T);
+t_inf(?any, T, _Opaques) -> do_not_subst_all_vars_to_any(T);
+t_inf(T, ?any, _Opaques) -> do_not_subst_all_vars_to_any(T);
t_inf(?none, _, _Opaques) -> ?none;
t_inf(_, ?none, _Opaques) -> ?none;
t_inf(?unit, _, _Opaques) -> ?unit; % ?unit cases should appear below ?none
t_inf(_, ?unit, _Opaques) -> ?unit;
-t_inf(T, T, _Opaques) -> subst_all_vars_to_any(T);
+t_inf(T, T, _Opaques) -> do_not_subst_all_vars_to_any(T);
t_inf(?atom(Set1), ?atom(Set2), _) ->
case set_intersection(Set1, Set2) of
?none -> ?none;
@@ -2988,7 +2954,7 @@ t_inf(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, _Opaques) ->
%% result in a none result.
Pairs =
map_pairwise_merge(
- %% For optional keys in both maps, when the infinimum is none, we have
+ %% For optional keys in both maps, when the infimum is none, we have
%% essentially concluded that K must not be a key in the map.
fun(K, ?opt, V1, ?opt, V2) -> {K, ?opt, t_inf(V1, V2)};
%% When a key is optional in one map, but mandatory in another, it
@@ -3072,13 +3038,13 @@ t_inf(?product(_), _, _Opaques) ->
t_inf(_, ?product(_), _Opaques) ->
?none;
t_inf(?tuple(?any, ?any, ?any), ?tuple(_, _, _) = T, _Opaques) ->
- subst_all_vars_to_any(T);
+ do_not_subst_all_vars_to_any(T);
t_inf(?tuple(_, _, _) = T, ?tuple(?any, ?any, ?any), _Opaques) ->
- subst_all_vars_to_any(T);
+ do_not_subst_all_vars_to_any(T);
t_inf(?tuple(?any, ?any, ?any), ?tuple_set(_) = T, _Opaques) ->
- subst_all_vars_to_any(T);
+ do_not_subst_all_vars_to_any(T);
t_inf(?tuple_set(_) = T, ?tuple(?any, ?any, ?any), _Opaques) ->
- subst_all_vars_to_any(T);
+ do_not_subst_all_vars_to_any(T);
t_inf(?tuple(Elements1, Arity, _Tag1), ?tuple(Elements2, Arity, _Tag2), Opaques) ->
case t_inf_lists_strict(Elements1, Elements2, Opaques) of
bottom -> ?none;
@@ -3196,121 +3162,13 @@ compatible_opaque_types(?opaque(Es1), ?opaque(Es2)) ->
[{O1, O2} || O1 <- Es1, O2 <- Es2, is_compat_opaque_names(O1, O2)].
is_compat_opaque_names(Opaque1, Opaque2) ->
- #opaque{mod = Mod1, name = Name1, args = Args1} = Opaque1,
- #opaque{mod = Mod2, name = Name2, args = Args2} = Opaque2,
- case {{Mod1, Name1, Args1}, {Mod2, Name2, Args2}} of
- {ModNameArgs, ModNameArgs} -> true;
- {{Mod, Name, Args1}, {Mod, Name, Args2}} ->
- is_compat_args(Args1, Args2);
+ #opaque{mod = Mod1, name = Name1, arity = Arity1} = Opaque1,
+ #opaque{mod = Mod2, name = Name2, arity = Arity2} = Opaque2,
+ case {{Mod1, Name1, Arity1}, {Mod2, Name2, Arity2}} of
+ {ModNameArity, ModNameArity} -> true;
_ -> false
end.
-is_compat_args([A1|Args1], [A2|Args2]) ->
- is_compat_arg(A1, A2) andalso is_compat_args(Args1, Args2);
-is_compat_args([], []) -> true;
-is_compat_args(_, _) -> false.
-
--spec is_compat_arg(erl_type(), erl_type()) -> boolean().
-
-%% The intention is that 'true' is to be returned iff one of the
-%% arguments is a specialization of the other argument in the sense
-%% that every type is a specialization of any(). For example, {_,_} is
-%% a specialization of any(), but not of tuple(). Does not handle
-%% variables, but any() and unions (sort of). However, the
-%% implementation is more relaxed as any() is compatible to anything.
-
-is_compat_arg(T, T) -> true;
-is_compat_arg(_, ?any) -> true;
-is_compat_arg(?any, _) -> true;
-is_compat_arg(?function(Domain1, Range1), ?function(Domain2, Range2)) ->
- (is_compat_arg(Domain1, Domain2) andalso
- is_compat_arg(Range1, Range2));
-is_compat_arg(?list(Contents1, Termination1, Size1),
- ?list(Contents2, Termination2, Size2)) ->
- (Size1 =:= Size2 andalso
- is_compat_arg(Contents1, Contents2) andalso
- is_compat_arg(Termination1, Termination2));
-is_compat_arg(?product(Types1), ?product(Types2)) ->
- is_compat_list(Types1, Types2);
-is_compat_arg(?map(Pairs1, DefK1, DefV1), ?map(Pairs2, DefK2, DefV2)) ->
- {Ks1, _, Vs1} = lists:unzip3(Pairs1),
- {Ks2, _, Vs2} = lists:unzip3(Pairs2),
- Key1 = t_sup([DefK1 | Ks1]),
- Key2 = t_sup([DefK2 | Ks2]),
- case is_compat_arg(Key1, Key2) of
- true ->
- Value1 = t_sup([DefV1 | Vs1]),
- Value2 = t_sup([DefV2 | Vs2]),
- is_compat_arg(Value1, Value2);
- false ->
- false
- end;
-is_compat_arg(?tuple(?any, ?any, ?any), ?tuple(_, _, _)) -> false;
-is_compat_arg(?tuple(_, _, _), ?tuple(?any, ?any, ?any)) -> false;
-is_compat_arg(?tuple(Elements1, Arity, _),
- ?tuple(Elements2, Arity, _)) when Arity =/= ?any ->
- is_compat_list(Elements1, Elements2);
-is_compat_arg(?tuple_set([{Arity, List}]),
- ?tuple(Elements2, Arity, _)) when Arity =/= ?any ->
- is_compat_list(sup_tuple_elements(List), Elements2);
-is_compat_arg(?tuple(Elements1, Arity, _),
- ?tuple_set([{Arity, List}])) when Arity =/= ?any ->
- is_compat_list(Elements1, sup_tuple_elements(List));
-is_compat_arg(?tuple_set(List1), ?tuple_set(List2)) ->
- try
- is_compat_list_list([sup_tuple_elements(T) || {_Arity, T} <- List1],
- [sup_tuple_elements(T) || {_Arity, T} <- List2])
- catch _:_ -> false
- end;
-is_compat_arg(?opaque(_) = T1, T2) ->
- is_compat_arg(t_opaque_structure(T1), T2);
-is_compat_arg(T1, ?opaque(_) = T2) ->
- is_compat_arg(T1, t_opaque_structure(T2));
-is_compat_arg(?union(List1)=T1, ?union(List2)=T2) ->
- case is_compat_union2(T1, T2) of
- {yes, Type1, Type2} -> is_compat_arg(Type1, Type2);
- no -> is_compat_list(List1, List2)
- end;
-is_compat_arg(?union(List), T2) ->
- case unify_union(List) of
- {yes, Type} -> is_compat_arg(Type, T2);
- no -> false
- end;
-is_compat_arg(T1, ?union(List)) ->
- case unify_union(List) of
- {yes, Type} -> is_compat_arg(T1, Type);
- no -> false
- end;
-is_compat_arg(?var(_), _) -> exit(error);
-is_compat_arg(_, ?var(_)) -> exit(error);
-is_compat_arg(?none, _) -> false;
-is_compat_arg(_, ?none) -> false;
-is_compat_arg(?unit, _) -> false;
-is_compat_arg(_, ?unit) -> false;
-is_compat_arg(#c{}, #c{}) -> false.
-
-is_compat_list_list(LL1, LL2) ->
- length(LL1) =:= length(LL2) andalso is_compat_list_list1(LL1, LL2).
-
-is_compat_list_list1([], []) -> true;
-is_compat_list_list1([L1|LL1], [L2|LL2]) ->
- is_compat_list(L1, L2) andalso is_compat_list_list1(LL1, LL2).
-
-is_compat_list(L1, L2) ->
- length(L1) =:= length(L2) andalso is_compat_list1(L1, L2).
-
-is_compat_list1([], []) -> true;
-is_compat_list1([T1|L1], [T2|L2]) ->
- is_compat_arg(T1, T2) andalso is_compat_list1(L1, L2).
-
-is_compat_union2(?union(List1)=T1, ?union(List2)=T2) ->
- case {unify_union(List1), unify_union(List2)} of
- {{yes, Type1}, {yes, Type2}} -> {yes, Type1, Type2};
- {{yes, Type1}, no} -> {yes, Type1, T2};
- {no, {yes, Type2}} -> {yes, T1, Type2};
- {no, no} -> no
- end.
-
-spec t_inf_lists([erl_type()], [erl_type()]) -> [erl_type()].
t_inf_lists(L1, L2) ->
@@ -3459,11 +3317,20 @@ findfirst(N1, N2, U1, B1, U2, B2) ->
if Val1 =:= Val2 ->
Val1;
Val1 > Val2 ->
- findfirst(N1, N2+1, U1, B1, U2, B2);
+ N2_1 = N2 + max((Val1 - Val2) div U2, 1),
+ findfirst(N1, N2_1, U1, B1, U2, B2);
Val1 < Val2 ->
- findfirst(N1+1, N2, U1, B1, U2, B2)
+ N1_1 = N1 + max((Val2 - Val1) div U1, 1),
+ findfirst(N1_1, N2, U1, B1, U2, B2)
end.
+%% Optimization. Before Erlang/OTP 25, subst_all_vars_to_any() was
+%% called. It turned out that variables are not to be substituted for
+%% any() since either there are no variables, or variables are
+%% substituted for any() afterwards.
+do_not_subst_all_vars_to_any(T) ->
+ T.
+
%%-----------------------------------------------------------------------------
%% Substitution of variables
%%
@@ -3516,9 +3383,8 @@ t_subst_aux(?map(Pairs, DefK, DefV), Map) ->
t_map([{K, MNess, t_subst_aux(V, Map)} || {K, MNess, V} <- Pairs],
t_subst_aux(DefK, Map), t_subst_aux(DefV, Map));
t_subst_aux(?opaque(Es), Map) ->
- List = [Opaque#opaque{args = [t_subst_aux(Arg, Map) || Arg <- Args],
- struct = t_subst_aux(S, Map)} ||
- Opaque = #opaque{args = Args, struct = S} <- set_to_list(Es)],
+ List = [Opaque#opaque{struct = t_subst_aux(S, Map)} ||
+ Opaque = #opaque{struct = S} <- set_to_list(Es)],
?opaque(ordsets:from_list(List));
t_subst_aux(?union(List), Map) ->
?union([t_subst_aux(E, Map) || E <- List]);
@@ -3529,106 +3395,116 @@ t_subst_aux(T, _Map) ->
%% Unification
%%
--type t_unify_ret() :: {erl_type(), [{_, erl_type()}]}.
-
--spec t_unify(erl_type(), erl_type()) -> t_unify_ret().
-
-t_unify(T1, T2) ->
- {T, VarMap} = t_unify(T1, T2, #{}),
- {t_subst(T, VarMap), lists:keysort(1, maps:to_list(VarMap))}.
-
-t_unify(?var(Id) = T, ?var(Id), VarMap) ->
- {T, VarMap};
-t_unify(?var(Id1) = T, ?var(Id2), VarMap) ->
- case maps:find(Id1, VarMap) of
- error ->
- case maps:find(Id2, VarMap) of
- error -> {T, VarMap#{Id2 => T}};
- {ok, Type} -> t_unify(T, Type, VarMap)
- end;
- {ok, Type1} ->
- case maps:find(Id2, VarMap) of
- error -> {Type1, VarMap#{Id2 => T}};
- {ok, Type2} -> t_unify(Type1, Type2, VarMap)
- end
+-spec t_unify_table_only(erl_type(), erl_type()) -> var_table().
+
+%% A simplified version of t_unify/2 which returns the variable
+%% bindings only. It is faster, mostly because t_subst() is not
+%% called.
+
+t_unify_table_only(T1, T2) ->
+ t_unify_table_only(T1, T2, #{}).
+
+t_unify_table_only(?var(Id), ?var(Id), VarMap) ->
+ VarMap;
+t_unify_table_only(?var(Id1) = LHS, ?var(Id2) = RHS, VarMap) ->
+ case VarMap of
+ #{ Id1 := Type1, Id2 := Type2} ->
+ t_unify_table_only(Type1, Type2, VarMap);
+ #{ Id1 := Type } ->
+ t_unify_table_only(Type, RHS, VarMap);
+ #{ Id2 := Type } ->
+ t_unify_table_only(LHS, Type, VarMap);
+ #{} ->
+ VarMap#{ Id1 => LHS, Id2 => RHS }
end;
-t_unify(?var(Id), Type, VarMap) ->
+t_unify_table_only(?var(Id), Type, VarMap) ->
case maps:find(Id, VarMap) of
- error -> {Type, VarMap#{Id => Type}};
- {ok, VarType} -> t_unify(VarType, Type, VarMap)
+ error -> VarMap#{Id => Type};
+ {ok, VarType} -> t_unify_table_only(VarType, Type, VarMap)
end;
-t_unify(Type, ?var(Id), VarMap) ->
+t_unify_table_only(Type, ?var(Id), VarMap) ->
case maps:find(Id, VarMap) of
- error -> {Type, VarMap#{Id => Type}};
- {ok, VarType} -> t_unify(VarType, Type, VarMap)
+ error -> VarMap#{Id => Type};
+ {ok, VarType} -> t_unify_table_only(VarType, Type, VarMap)
end;
-t_unify(?function(Domain1, Range1), ?function(Domain2, Range2), VarMap) ->
- {Domain, VarMap1} = t_unify(Domain1, Domain2, VarMap),
- {Range, VarMap2} = t_unify(Range1, Range2, VarMap1),
- {?function(Domain, Range), VarMap2};
-t_unify(?list(Contents1, Termination1, Size),
+t_unify_table_only(?function(Domain1, Range1), ?function(Domain2, Range2), VarMap) ->
+ VarMap1 = t_unify_table_only(Domain1, Domain2, VarMap),
+ t_unify_table_only(Range1, Range2, VarMap1);
+t_unify_table_only(?list(Contents1, Termination1, Size),
?list(Contents2, Termination2, Size), VarMap) ->
- {Contents, VarMap1} = t_unify(Contents1, Contents2, VarMap),
- {Termination, VarMap2} = t_unify(Termination1, Termination2, VarMap1),
- {?list(Contents, Termination, Size), VarMap2};
-t_unify(?product(Types1), ?product(Types2), VarMap) ->
- {Types, VarMap1} = unify_lists(Types1, Types2, VarMap),
- {?product(Types), VarMap1};
-t_unify(?tuple(?any, ?any, ?any) = T, ?tuple(?any, ?any, ?any), VarMap) ->
- {T, VarMap};
-t_unify(?tuple(Elements1, Arity, _),
+ VarMap1 = t_unify_table_only(Contents1, Contents2, VarMap),
+ t_unify_table_only(Termination1, Termination2, VarMap1);
+t_unify_table_only(?product(Types1), ?product(Types2), VarMap) ->
+ unify_lists_table_only(Types1, Types2, VarMap);
+t_unify_table_only(?tuple(?any, ?any, ?any), ?tuple(?any, ?any, ?any), VarMap) ->
+ VarMap;
+t_unify_table_only(?tuple(Elements1, Arity, _),
?tuple(Elements2, Arity, _), VarMap) when Arity =/= ?any ->
- {NewElements, VarMap1} = unify_lists(Elements1, Elements2, VarMap),
- {t_tuple(NewElements), VarMap1};
-t_unify(?tuple_set([{Arity, _}]) = T1,
+ unify_lists_table_only(Elements1, Elements2, VarMap);
+t_unify_table_only(?tuple_set([{Arity, _}]) = T1,
?tuple(_, Arity, _) = T2, VarMap) when Arity =/= ?any ->
- unify_tuple_set_and_tuple1(T1, T2, VarMap);
-t_unify(?tuple(_, Arity, _) = T1,
+ unify_tuple_set_and_tuple1_table_only(T1, T2, VarMap);
+t_unify_table_only(?tuple(_, Arity, _) = T1,
?tuple_set([{Arity, _}]) = T2, VarMap) when Arity =/= ?any ->
- unify_tuple_set_and_tuple2(T1, T2, VarMap);
-t_unify(?tuple_set(List1) = T1, ?tuple_set(List2) = T2, VarMap) ->
+ unify_tuple_set_and_tuple2_table_only(T1, T2, VarMap);
+t_unify_table_only(?tuple_set(List1) = T1, ?tuple_set(List2) = T2, VarMap) ->
try
- unify_lists(lists:append([T || {_Arity, T} <- List1]),
- lists:append([T || {_Arity, T} <- List2]), VarMap)
- of
- {Tuples, NewVarMap} -> {t_sup(Tuples), NewVarMap}
+ unify_lists_table_only(lists:append([T || {_Arity, T} <- List1]),
+ lists:append([T || {_Arity, T} <- List2]), VarMap)
catch _:_ -> throw({mismatch, T1, T2})
end;
-t_unify(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, VarMap0) ->
- {DefK, VarMap1} = t_unify(ADefK, BDefK, VarMap0),
- {DefV, VarMap2} = t_unify(ADefV, BDefV, VarMap1),
- {Pairs, VarMap} =
+t_unify_table_only(?map(_, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B, VarMap0) ->
+ VarMap1 = t_unify_table_only(ADefK, BDefK, VarMap0),
+ VarMap2 = t_unify_table_only(ADefV, BDefV, VarMap1),
+ {[], VarMap} =
map_pairwise_merge_foldr(
- fun(K, MNess, V1, MNess, V2, {Pairs0, VarMap3}) ->
+ fun(_K, MNess, V1, MNess, V2, {Pairs0, VarMap3}) ->
%% We know that the keys unify and do not contain variables, or they
%% would not be singletons
%% TODO: Should V=?none (known missing keys) be handled special?
- {V, VarMap4} = t_unify(V1, V2, VarMap3),
- {[{K,MNess,V}|Pairs0], VarMap4};
- (K, _, V1, _, V2, {Pairs0, VarMap3}) ->
+ VarMap4 = t_unify_table_only(V1, V2, VarMap3),
+ {Pairs0, VarMap4};
+ (_K, _, V1, _, V2, {Pairs0, VarMap3}) ->
%% One mandatory and one optional; what should be done in this case?
- {V, VarMap4} = t_unify(V1, V2, VarMap3),
- {[{K,?mand,V}|Pairs0], VarMap4}
+ VarMap4 = t_unify_table_only(V1, V2, VarMap3),
+ {Pairs0, VarMap4}
end, {[], VarMap2}, A, B),
- {t_map(Pairs, DefK, DefV), VarMap};
-t_unify(?opaque(_) = T1, ?opaque(_) = T2, VarMap) ->
- t_unify(t_opaque_structure(T1), t_opaque_structure(T2), VarMap);
-t_unify(T1, ?opaque(_) = T2, VarMap) ->
- t_unify(T1, t_opaque_structure(T2), VarMap);
-t_unify(?opaque(_) = T1, T2, VarMap) ->
- t_unify(t_opaque_structure(T1), T2, VarMap);
-t_unify(T, T, VarMap) ->
- {T, VarMap};
-t_unify(?union(_)=T1, ?union(_)=T2, VarMap) ->
+ VarMap;
+t_unify_table_only(?opaque(_) = T1, ?opaque(_) = T2, VarMap) ->
+ t_unify_table_only(t_opaque_structure(T1), t_opaque_structure(T2), VarMap);
+t_unify_table_only(T1, ?opaque(_) = T2, VarMap) ->
+ t_unify_table_only(T1, t_opaque_structure(T2), VarMap);
+t_unify_table_only(?opaque(_) = T1, T2, VarMap) ->
+ t_unify_table_only(t_opaque_structure(T1), T2, VarMap);
+t_unify_table_only(T, T, VarMap) ->
+ VarMap;
+t_unify_table_only(?union(_)=T1, ?union(_)=T2, VarMap) ->
{Type1, Type2} = unify_union2(T1, T2),
- t_unify(Type1, Type2, VarMap);
-t_unify(?union(_)=T1, T2, VarMap) ->
- t_unify(unify_union1(T1, T1, T2), T2, VarMap);
-t_unify(T1, ?union(_)=T2, VarMap) ->
- t_unify(T1, unify_union1(T2, T1, T2), VarMap);
-t_unify(T1, T2, _) ->
+ t_unify_table_only(Type1, Type2, VarMap);
+t_unify_table_only(?union(_)=T1, T2, VarMap) ->
+ t_unify_table_only(unify_union1(T1, T1, T2), T2, VarMap);
+t_unify_table_only(T1, ?union(_)=T2, VarMap) ->
+ t_unify_table_only(T1, unify_union1(T2, T1, T2), VarMap);
+t_unify_table_only(T1, T2, _) ->
throw({mismatch, T1, T2}).
+%% Two functions since t_unify_table_only is not symmetric.
+unify_tuple_set_and_tuple1_table_only(?tuple_set([{Arity, List}]),
+ ?tuple(Elements2, Arity, _), VarMap) ->
+ %% Can only work if the single tuple has variables at correct places.
+ unify_lists_table_only(sup_tuple_elements(List), Elements2, VarMap).
+
+unify_tuple_set_and_tuple2_table_only(?tuple(Elements2, Arity, _),
+ ?tuple_set([{Arity, List}]), VarMap) ->
+ %% Can only work if the single tuple has variables at correct places.
+ unify_lists_table_only(Elements2, sup_tuple_elements(List), VarMap).
+
+unify_lists_table_only([T1|Left1], [T2|Left2], VarMap) ->
+ NewVarMap = t_unify_table_only(T1, T2, VarMap),
+ unify_lists_table_only(Left1, Left2, NewVarMap);
+unify_lists_table_only([], [], VarMap) ->
+ VarMap.
+
unify_union2(?union(List1)=T1, ?union(List2)=T2) ->
case {unify_union(List1), unify_union(List2)} of
{{yes, Type1}, {yes, Type2}} -> {Type1, Type2};
@@ -3659,46 +3535,20 @@ unify_union(List) ->
is_opaque_type(?opaque(Elements), Opaques) ->
lists:any(fun(Opaque) -> is_opaque_type2(Opaque, Opaques) end, Elements).
-is_opaque_type2(#opaque{mod = Mod1, name = Name1, args = Args1}, Opaques) ->
+is_opaque_type2(#opaque{mod = Mod1, name = Name1, arity = Arity1}, Opaques) ->
F1 = fun(?opaque(Es)) ->
- F2 = fun(#opaque{mod = Mod, name = Name, args = Args}) ->
- is_type_name(Mod1, Name1, Args1, Mod, Name, Args)
+ F2 = fun(#opaque{mod = Mod, name = Name, arity = Arity}) ->
+ is_type_name(Mod1, Name1, Arity1, Mod, Name, Arity)
end,
lists:any(F2, Es)
end,
lists:any(F1, Opaques).
-is_type_name(Mod, Name, Args1, Mod, Name, Args2) ->
- length(Args1) =:= length(Args2);
-is_type_name(_Mod1, _Name1, _Args1, _Mod2, _Name2, _Args2) ->
+is_type_name(Mod, Name, Arity, Mod, Name, Arity) ->
+ true;
+is_type_name(_Mod1, _Name1, _Arity1, _Mod2, _Name2, _Arity2) ->
false.
-%% Two functions since t_unify is not symmetric.
-unify_tuple_set_and_tuple1(?tuple_set([{Arity, List}]),
- ?tuple(Elements2, Arity, _), VarMap) ->
- %% Can only work if the single tuple has variables at correct places.
- %% Collapse the tuple set.
- {NewElements, VarMap1} =
- unify_lists(sup_tuple_elements(List), Elements2, VarMap),
- {t_tuple(NewElements), VarMap1}.
-
-unify_tuple_set_and_tuple2(?tuple(Elements2, Arity, _),
- ?tuple_set([{Arity, List}]), VarMap) ->
- %% Can only work if the single tuple has variables at correct places.
- %% Collapse the tuple set.
- {NewElements, VarMap1} =
- unify_lists(Elements2, sup_tuple_elements(List), VarMap),
- {t_tuple(NewElements), VarMap1}.
-
-unify_lists(L1, L2, VarMap) ->
- unify_lists(L1, L2, VarMap, []).
-
-unify_lists([T1|Left1], [T2|Left2], VarMap, Acc) ->
- {NewT, NewVarMap} = t_unify(T1, T2, VarMap),
- unify_lists(Left1, Left2, NewVarMap, [NewT|Acc]);
-unify_lists([], [], VarMap, Acc) ->
- {lists:reverse(Acc), VarMap}.
-
%%t_assign_variables_to_subtype(T1, T2) ->
%% try
%% Dict = assign_vars(T1, T2, dict:new()),
@@ -3750,7 +3600,7 @@ unify_lists([], [], VarMap, Acc) ->
%% assign_vars_lists(Elements1, Elements2, Dict);
%%assign_vars(?tuple_set(_) = T, ?tuple_set(List2), Dict) ->
%% %% All Rhs tuples must already be subtypes of Lhs, so we can take
-%% %% each one separatly.
+%% %% each one separately.
%% assign_vars_lists([T || _ <- List2], List2, Dict);
%%assign_vars(?tuple(?any, ?any, ?any), ?tuple_set(_), Dict) ->
%% Dict;
@@ -3981,7 +3831,7 @@ t_subtract(?map(APairs, ADefK, ADefV) = A, ?map(_, BDefK, BDefV) = B) ->
%% * The arguments constrain A at least as much as B, i.e. that A so far
%% is a subtype of B. In that case they return false
%% * That for the particular arguments, A being a subtype of B does not
- %% hold, but the infinimum of A and B is nonempty, and by narrowing a
+ %% hold, but the infimum of A and B is nonempty, and by narrowing a
%% pair in A, we can create a type that excludes some elements in the
%% infinumum. In that case, they will return that pair.
%% * That for the particular arguments, A being a subtype of B does not
@@ -4200,7 +4050,44 @@ t_unopaque(T, _) ->
-spec t_limit(erl_type(), integer()) -> erl_type().
t_limit(Term, K) when is_integer(K) ->
- t_limit_k(Term, K).
+ case is_limited(Term, K) of
+ true -> Term;
+ false -> t_limit_k(Term, K)
+ end.
+
+is_limited(?any, _) -> true;
+is_limited(_, K) when K =< 0 -> false;
+is_limited(?tuple(?any, ?any, ?any), _K) -> true;
+is_limited(?tuple(Elements, _Arity, _), K) ->
+ if K =:= 1 -> false;
+ true ->
+ K1 = K-1,
+ lists:all(fun(E) -> is_limited(E, K1) end, Elements)
+ end;
+is_limited(?tuple_set(_) = T, K) ->
+ lists:all(fun(Tuple) -> is_limited(Tuple, K) end, t_tuple_subtypes(T));
+is_limited(?list(Elements, Termination, _Size), K) ->
+ if K =:= 1 -> is_limited(Termination, K);
+ true -> is_limited(Termination, K - 1)
+ end
+ andalso is_limited(Elements, K - 1);
+is_limited(?function(Domain, Range), K) ->
+ is_limited(Domain, K) andalso is_limited(Range, K-1);
+is_limited(?product(Elements), K) ->
+ K1 = K-1,
+ lists:all(fun(X) -> is_limited(X, K1) end, Elements);
+is_limited(?union(Elements), K) ->
+ lists:all(fun(X) -> is_limited(X, K) end, Elements);
+is_limited(?opaque(Es), K) ->
+ lists:all(fun(#opaque{struct = S}) -> is_limited(S, K) end, set_to_list(Es));
+is_limited(?map(Pairs, DefK, DefV), K) ->
+ %% Use the fact that t_sup() does not increase the depth.
+ K1 = K - 1,
+ lists:all(fun({Key, _, Value}) ->
+ is_limited(Key, K1) andalso is_limited(Value, K1)
+ end, Pairs)
+ andalso is_limited(DefK, K1) andalso is_limited(DefV, K1);
+is_limited(_, _K) -> true.
t_limit_k(_, K) when K =< 0 -> ?any;
t_limit_k(?tuple(?any, ?any, ?any) = T, _K) -> T;
@@ -4350,8 +4237,8 @@ t_to_string(?identifier(Set), _RecDict) ->
flat_join([flat_format("~w()", [T]) || T <- set_to_list(Set)], " | ")
end;
t_to_string(?opaque(Set), RecDict) ->
- flat_join([opaque_type(Mod, Name, Args, S, RecDict) ||
- #opaque{mod = Mod, name = Name, struct = S, args = Args}
+ flat_join([opaque_type(Mod, Name, Arity, S, RecDict) ||
+ #opaque{mod = Mod, name = Name, struct = S, arity = Arity}
<- set_to_list(Set)],
" | ");
t_to_string(?matchstate(Pres, Slots), RecDict) ->
@@ -4524,19 +4411,18 @@ union_sequence(Types, RecDict) ->
flat_join(List, " | ").
-ifdef(DEBUG).
-opaque_type(Mod, Name, _Args, S, RecDict) ->
- ArgsString = comma_sequence(_Args, RecDict),
+opaque_type(Mod, Name, Arity, S, RecDict) ->
String = t_to_string(S, RecDict),
- opaque_name(Mod, Name, ArgsString) ++ "[" ++ String ++ "]".
+ opaque_name(Mod, Name, Arity) ++ "[" ++ String ++ "]".
-else.
-opaque_type(Mod, Name, Args, _S, RecDict) ->
- ArgsString = comma_sequence(Args, RecDict),
- opaque_name(Mod, Name, ArgsString).
+opaque_type(Mod, Name, Arity, _S, _RecDict) ->
+ opaque_name(Mod, Name, Arity).
-endif.
-opaque_name(Mod, Name, Extra) ->
+opaque_name(Mod, Name, Arity) ->
S = mod_name(Mod, Name),
- flat_format("~ts(~ts)", [S, Extra]).
+ Args = lists:join($,, lists:duplicate(Arity, $_)),
+ flat_format("~ts(~ts)", [S, Args]).
mod_name(Mod, Name) ->
flat_format("~w:~tw", [Mod, Name]).
@@ -4559,6 +4445,7 @@ mod_name(Mod, Name) ->
[erl_type()], type_names()}.
-type mod_type_table() :: ets:tid().
-type mod_records() :: dict:dict(module(), type_table()).
+-type exported_type_table() :: ets:tid().
-record(cache,
{
types = maps:new() :: #{cache_key() => {erl_type(), expand_limit()}},
@@ -4567,7 +4454,7 @@ mod_name(Mod, Name) ->
-opaque cache() :: #cache{}.
--spec t_from_form(parse_form(), sets:set(mfa()), site(), mod_type_table(),
+-spec t_from_form(parse_form(), exported_type_table(), site(), mod_type_table(),
var_table(), cache()) -> {erl_type(), cache()}.
t_from_form(Form, ExpTypes, Site, RecDict, VarTab, Cache) ->
@@ -4592,12 +4479,12 @@ t_from_form_without_remote(Form, Site, TypeTable) ->
-type expand_depth() :: integer().
-record(from_form, {site :: site(),
- xtypes :: sets:set(mfa()) | 'replace_by_none',
+ xtypes :: exported_type_table() | 'replace_by_none',
mrecs :: 'undefined' | mod_type_table(),
vtab :: var_table(),
tnames :: type_names()}).
--spec t_from_form_check_remote(parse_form(), sets:set(mfa()), site(),
+-spec t_from_form_check_remote(parse_form(), exported_type_table(), site(),
mod_type_table()) -> 'ok'.
t_from_form_check_remote(Form, ExpTypes, Site, RecDict) ->
State = #from_form{site = Site,
@@ -4618,7 +4505,7 @@ t_from_form_check_remote(Form, ExpTypes, Site, RecDict) ->
%% types balanced (unions will otherwise collapse to any()) by limiting
%% the depth the same way as t_limit/2 does.
--spec t_from_form1(parse_form(), sets:set(mfa()) | 'replace_by_none',
+-spec t_from_form1(parse_form(), exported_type_table() | 'replace_by_none',
site(), 'undefined' | mod_type_table(), var_table(),
cache()) -> {erl_type(), cache()}.
@@ -4647,6 +4534,10 @@ initial_typenames({type, MTA, _File}) -> [{type, MTA}];
initial_typenames({spec, _MFA, _File}) -> [];
initial_typenames({record, _MRA, _File}) -> [].
+%% 4 is the maximal depth used by any Dialyzer module
+%% (5 is used internally).
+-define(TYPE_LIMIT, 4).
+
from_form_loop(Form, State, D, Limit, C, T0) ->
{T1, L1, C1} = from_form(Form, State, D, Limit, C),
Delta = Limit - L1,
@@ -4656,6 +4547,9 @@ from_form_loop(Form, State, D, Limit, C, T0) ->
Delta * 8 > Limit ->
%% Save some time by assuming next depth will exceed the limit.
{T1, C1};
+ D =:= ?TYPE_LIMIT ->
+ %% No need to go deeper than necessary.
+ {T1, C1};
true ->
D1 = D + 1,
from_form_loop(Form, State, D1, Limit, C1, T1)
@@ -4963,7 +4857,7 @@ remote_from_form(Anno, RemMod, Name, Args, S, D, L, C) ->
self() ! {self(), ext_types, ext_types_message(MFA, Anno, Site)},
{t_any(), L, C};
{RemDict, C1} ->
- case sets:is_element(MFA, ET) of
+ case ets:member(ET, MFA) of
true ->
RemType = {type, MFA},
case can_unfold_more(RemType, TypeNames) of
@@ -5169,7 +5063,7 @@ separate_key(?union(List)) ->
lists:append([separate_key(K) || K <- List, not t_is_none(K)]);
separate_key(Key) -> [Key].
-%% Sorts, combines non-singleton pairs, and applies precendence and
+%% Sorts, combines non-singleton pairs, and applies precedence and
%% mandatoriness rules.
map_from_form([], ShdwPs, MKs, Pairs, DefK, DefV) ->
verify_possible(MKs, ShdwPs),
@@ -5234,7 +5128,7 @@ recur_limit(Fun, D, L, TypeName, TypeNames) ->
Fun(D, L)
end.
--spec t_check_record_fields(parse_form(), sets:set(mfa()), site(),
+-spec t_check_record_fields(parse_form(), exported_type_table(), site(),
mod_type_table(), var_table(), cache()) -> cache().
t_check_record_fields(Form, ExpTypes, Site, RecDict, VarTable, Cache) ->
@@ -5465,7 +5359,7 @@ t_form_to_string({type, _Anno, Name, []} = T) ->
V = var_table__new(),
C = cache__new(),
State = #from_form{site = Site,
- xtypes = sets:new(),
+ xtypes = replace_by_none,
mrecs = 'undefined',
vtab = V,
tnames = []},
@@ -5813,3 +5707,130 @@ handle_base(Unit, Neg) ->
var_table__new() ->
maps:new().
+
+%%=============================================================================
+%%
+%% Utilities for finding a module's type dependencies
+%%
+%%=============================================================================
+
+
+-spec module_type_deps_of_type_defs(type_table()) -> [module()].
+
+module_type_deps_of_type_defs(TypeTable) ->
+ ModuleTypeDependencies =
+ [module_type_deps_of_entry(TypeTableEntry)
+ || TypeTableEntry <- maps:to_list(TypeTable)],
+ lists:append(ModuleTypeDependencies).
+
+-spec module_type_deps_of_entry(
+ {type_key(), type_value()}
+ | {record_key(), record_value()}) -> [module()].
+
+module_type_deps_of_entry({{'type', _TypeName, _A}, {{_FromM, _FileLine, AbstractType, _ArgNames}, _}}) ->
+ type_form_to_remote_modules(AbstractType);
+
+module_type_deps_of_entry({{'opaque', _TypeName, _A}, {{_FromM, _FileLine, AbstractType, _ArgNames}, _}}) ->
+ type_form_to_remote_modules(AbstractType);
+
+module_type_deps_of_entry({{'record', _Name}, {_FileLine, SizesAndFields}}) ->
+ AllFields = lists:append([Fields || {_Size, Fields} <- SizesAndFields]),
+ FieldTypes = [AbstractType || {_, AbstractType, _} <- AllFields],
+ type_form_to_remote_modules(FieldTypes).
+
+%% Whilst this function is depth-limited, it should be limited in precisely
+%% the same way as Dialyzer's other analyses - i.e. it should only ignore
+%% sub-components of types Diaylzer wouldn't explore anyway
+-spec type_form_to_remote_modules(parse_form() | [parse_form()]) -> [module()].
+
+type_form_to_remote_modules([]) ->
+ [];
+
+type_form_to_remote_modules([_|_] = Forms) ->
+ D = ?EXPAND_DEPTH,
+ L = ?EXPAND_LIMIT,
+ {_, Mods} = list_get_modules_mentioned(Forms, D, L, []),
+ lists:usort(Mods);
+
+type_form_to_remote_modules(Form) ->
+ D = ?EXPAND_DEPTH,
+ L = ?EXPAND_LIMIT,
+ {_, Mods} = get_modules_mentioned(Form, D, L, []),
+ lists:usort(Mods).
+
+-spec get_modules_mentioned(TypeForm :: parse_form(), expand_depth(), expand_limit(), Acc :: [module()]) -> {expand_depth(), [module()]}.
+
+get_modules_mentioned(_, D, L, Acc) when D =< 0 ; L =< 0 ->
+ {L, Acc};
+get_modules_mentioned({var, _L, '_'}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({var, _L, _Name}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({ann_type, _L, [_Var, Type]}, D, L, Acc) ->
+ get_modules_mentioned(Type, D, L, Acc);
+get_modules_mentioned({paren_type, _L, [Type]}, D, L, Acc) ->
+ get_modules_mentioned(Type, D, L, Acc);
+get_modules_mentioned({atom, _L, _Atom}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({integer, _L, _Int}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({char, _L, _Char}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({op, _L, _Op, _Arg}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({op, _L, _Op, _Arg1, _Arg2}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({type, _L, 'fun', [{type, _, any}, Range]}, D, L, Acc) ->
+ get_modules_mentioned(Range, D - 1, L - 1, Acc);
+get_modules_mentioned({type, _L, 'fun', [{type, _, product, Domain}, Range]}, D, L, Acc) ->
+ {L1, Acc1} = list_get_modules_mentioned(Domain, D, L, Acc),
+ get_modules_mentioned(Range, D, L1, Acc1);
+get_modules_mentioned({type, _L, list, [Type]}, D, L, Acc) ->
+ get_modules_mentioned(Type, D - 1, L - 1, Acc);
+get_modules_mentioned({type, _L, map, any}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({type, _L, map, List}, D0, L, Acc) ->
+ fun PairsFromForm(_, L1, Acc1) when L1 =< 0 -> Acc1;
+ PairsFromForm([], L1, Acc1) -> {L1, Acc1};
+ PairsFromForm([{type, _, _Oper, [KF, VF]}|T], L1, Acc1) ->
+ D = D0 - 1,
+ {L2, Acc2} = get_modules_mentioned(KF, D, L1, Acc1),
+ {L3, Acc3} = get_modules_mentioned(VF, D, L2, Acc2),
+ PairsFromForm(T, L3 - 1, Acc3)
+ end(List, L, Acc);
+get_modules_mentioned({type, _L, nonempty_list, [Type]}, D, L, Acc) ->
+ get_modules_mentioned(Type, D, L - 1, Acc);
+get_modules_mentioned({type, _L, nonempty_improper_list, [Cont, Term]}, D, L, Acc) ->
+ {L1, Acc1} = get_modules_mentioned(Cont, D, L - 1, Acc),
+ get_modules_mentioned(Term, D, L1, Acc1);
+get_modules_mentioned({type, _L, nonempty_maybe_improper_list, [Cont, Term]}, D, L, Acc) ->
+ {L1, Acc1} = get_modules_mentioned(Cont, D, L - 1, Acc),
+ get_modules_mentioned(Term, D, L1, Acc1);
+get_modules_mentioned({type, _L, maybe_improper_list, [Content, Termination]}, D, L, Acc) ->
+ {L1, Acc1} = get_modules_mentioned(Content, D, L - 1, Acc),
+ get_modules_mentioned(Termination, D, L1, Acc1);
+get_modules_mentioned({type, _L, product, Elements}, D, L, Acc) ->
+ list_get_modules_mentioned(Elements, D - 1, L, Acc);
+get_modules_mentioned({type, _L, range, [_From, _To]}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({type, _L, tuple, any}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({type, _L, tuple, Args}, D, L, Acc) ->
+ list_get_modules_mentioned(Args, D - 1, L, Acc);
+get_modules_mentioned({type, _L, union, Args}, D, L, Acc) ->
+ list_get_modules_mentioned(Args, D, L, Acc);
+get_modules_mentioned({remote_type, _L, [{atom, _, Module}, {atom, _, _Type}, Args]}, D, L, Acc) ->
+ Acc1 = [Module|Acc],
+ list_get_modules_mentioned(Args, D, L, Acc1);
+get_modules_mentioned({user_type, _L, _Name, Args}, D, L, Acc) ->
+ list_get_modules_mentioned(Args, D, L, Acc);
+get_modules_mentioned({type, _L, _Name, []}, _D, L, Acc) ->
+ {L, Acc};
+get_modules_mentioned({type, _L, _Name, Args}, D, L, Acc) ->
+ list_get_modules_mentioned(Args, D, L, Acc).
+
+list_get_modules_mentioned([], _D, L, Acc) ->
+ {L, Acc};
+list_get_modules_mentioned([H|Tail], D, L, Acc) ->
+ {L1, Acc1} = get_modules_mentioned(H, D, L - 1, Acc),
+ list_get_modules_mentioned(Tail, D, L1, Acc1).
diff --git a/lib/dialyzer/src/typer.erl b/lib/dialyzer/src/typer.erl
index 69a622db2d..5be2607e63 100644
--- a/lib/dialyzer/src/typer.erl
+++ b/lib/dialyzer/src/typer.erl
@@ -17,6 +17,9 @@
%% Author(s) : The first version of typer was written by Bingwen He
%% with guidance from Kostis Sagonas and Tobias Lindahl.
%% Since June 2008 typer is maintained by Kostis Sagonas.
+%% On 2022, Brujo, Pablo, and Mackenzie from NextRoll
+%% started working on the rebar3 plugin for typer and,
+%% with that in mind, split typer and typer_core apart.
%% Description : An Erlang/OTP application that shows type information
%% for Erlang modules to the user. Additionally, it can
%% annotate the code of files with such type information.
@@ -33,563 +36,38 @@
-define(ANNOTATE, annotate).
-define(ANNOTATE_INC_FILES, annotate_inc_files).
--type mode() :: ?SHOW | ?SHOW_EXPORTED | ?ANNOTATE | ?ANNOTATE_INC_FILES.
-
%%-----------------------------------------------------------------------
--type files() :: [file:filename()].
--type callgraph() :: dialyzer_callgraph:callgraph().
--type codeserver() :: dialyzer_codeserver:codeserver().
--type plt() :: dialyzer_plt:plt().
-
--record(analysis,
- {mode :: mode() | 'undefined',
- macros = [] :: [{atom(), term()}],
- includes = [] :: files(),
- codeserver = dialyzer_codeserver:new():: codeserver(),
- callgraph = dialyzer_callgraph:new() :: callgraph(),
- files = [] :: files(), % absolute names
- plt = none :: 'none' | file:filename(),
- no_spec = false :: boolean(),
- show_succ = false :: boolean(),
- %% For choosing between specs or edoc @spec comments
- edoc = false :: boolean(),
- %% Files in 'fms' are compilable with option 'to_pp'; we keep them
- %% as {FileName, ModuleName} in case the ModuleName is different
- fms = [] :: [{file:filename(), module()}],
- ex_func = map__new() :: map_dict(),
- record = map__new() :: map_dict(),
- func = map__new() :: map_dict(),
- inc_func = map__new() :: map_dict(),
- trust_plt = dialyzer_plt:new() :: plt()}).
--type analysis() :: #analysis{}.
-
--record(args, {files = [] :: files(),
- files_r = [] :: files(),
- trusted = [] :: files()}).
--type args() :: #args{}.
-
-%%--------------------------------------------------------------------
-
-spec start() -> no_return().
start() ->
_ = io:setopts(standard_error, [{encoding,unicode}]),
_ = io:setopts([{encoding,unicode}]),
- {Args, Analysis} = process_cl_args(),
- %% io:format("Args: ~p\n", [Args]),
- %% io:format("Analysis: ~p\n", [Analysis]),
- Timer = dialyzer_timing:init(false),
- TrustedFiles = filter_fd(Args#args.trusted, [], fun is_erl_file/1),
- Analysis2 = extract(Analysis, TrustedFiles),
- All_Files = get_all_files(Args),
- %% io:format("All_Files: ~tp\n", [All_Files]),
- Analysis3 = Analysis2#analysis{files = All_Files},
- Analysis4 = collect_info(Analysis3),
- %% io:format("Final: ~p\n", [Analysis4#analysis.fms]),
- TypeInfo = get_type_info(Analysis4),
- dialyzer_timing:stop(Timer),
- show_or_annotate(TypeInfo),
- %% io:format("\nTyper analysis finished\n"),
+ ok = typer_core:run(process_cl_args()),
erlang:halt(0).
%%--------------------------------------------------------------------
-
--spec extract(analysis(), files()) -> analysis().
-
-extract(#analysis{macros = Macros,
- includes = Includes,
- trust_plt = TrustPLT} = Analysis, TrustedFiles) ->
- %% io:format("--- Extracting trusted typer_info... "),
- Ds = [{d, Name, Value} || {Name, Value} <- Macros],
- CodeServer = dialyzer_codeserver:new(),
- Fun =
- fun(File, CS) ->
- %% We include one more dir; the one above the one we are trusting
- %% E.g, for /home/tests/typer_ann/test.ann.erl, we should include
- %% /home/tests/ rather than /home/tests/typer_ann/
- AllIncludes = [filename:dirname(filename:dirname(File)) | Includes],
- Is = [{i, Dir} || Dir <- AllIncludes],
- CompOpts = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds,
- case dialyzer_utils:get_core_from_src(File, CompOpts) of
- {ok, Core} ->
- case dialyzer_utils:get_record_and_type_info(Core) of
- {ok, RecDict} ->
- Mod = list_to_atom(filename:basename(File, ".erl")),
- case dialyzer_utils:get_spec_info(Mod, Core, RecDict) of
- {ok, SpecDict, CbDict} ->
- CS1 = dialyzer_codeserver:store_temp_records(Mod, RecDict, CS),
- dialyzer_codeserver:store_temp_contracts(Mod, SpecDict, CbDict, CS1);
- {error, Reason} -> compile_error([Reason])
- end;
- {error, Reason} -> compile_error([Reason])
- end;
- {error, Reason} -> compile_error(Reason)
- end
- end,
- CodeServer1 = lists:foldl(Fun, CodeServer, TrustedFiles),
- %% Process remote types
- NewCodeServer =
- try
- CodeServer2 =
- dialyzer_utils:merge_types(CodeServer1,
- TrustPLT), % XXX change to the PLT?
- NewExpTypes = dialyzer_codeserver:get_temp_exported_types(CodeServer1),
- case sets:size(NewExpTypes) of 0 -> ok end,
- CodeServer3 = dialyzer_codeserver:finalize_exported_types(NewExpTypes, CodeServer2),
- CodeServer4 = dialyzer_utils:process_record_remote_types(CodeServer3),
- dialyzer_contracts:process_contract_remote_types(CodeServer4)
- catch
- throw:{error, ErrorMsg} ->
- compile_error(ErrorMsg)
- end,
- %% Create TrustPLT
- ContractsDict = dialyzer_codeserver:get_contracts(NewCodeServer),
- Contracts = orddict:from_list(dict:to_list(ContractsDict)),
- NewTrustPLT = dialyzer_plt:insert_contract_list(TrustPLT, Contracts),
- Analysis#analysis{trust_plt = NewTrustPLT}.
-
-%%--------------------------------------------------------------------
-
--spec get_type_info(analysis()) -> analysis().
-
-get_type_info(#analysis{callgraph = CallGraph,
- trust_plt = TrustPLT,
- codeserver = CodeServer} = Analysis) ->
- StrippedCallGraph = remove_external(CallGraph, TrustPLT),
- %% io:format("--- Analyzing callgraph... "),
- try
- NewPlt = dialyzer_succ_typings:analyze_callgraph(StrippedCallGraph,
- TrustPLT,
- CodeServer),
- Analysis#analysis{callgraph = StrippedCallGraph, trust_plt = NewPlt}
- catch
- error:What:Stacktrace ->
- fatal_error(io_lib:format("Analysis failed with message: ~tp",
- [{What, Stacktrace}]));
- throw:{dialyzer_succ_typing_error, Msg} ->
- fatal_error(io_lib:format("Analysis failed with message: ~ts", [Msg]))
- end.
-
--spec remove_external(callgraph(), plt()) -> callgraph().
-
-remove_external(CallGraph, PLT) ->
- {StrippedCG0, Ext} = dialyzer_callgraph:remove_external(CallGraph),
- case get_external(Ext, PLT) of
- [] -> ok;
- Externals ->
- msg(io_lib:format(" Unknown functions: ~tp\n", [lists:usort(Externals)])),
- ExtTypes = rcv_ext_types(),
- case ExtTypes of
- [] -> ok;
- _ -> msg(io_lib:format(" Unknown types: ~tp\n", [ExtTypes]))
- end
- end,
- StrippedCG0.
-
--spec get_external([{mfa(), mfa()}], plt()) -> [mfa()].
-
-get_external(Exts, Plt) ->
- Fun = fun ({_From, To = {M, F, A}}, Acc) ->
- case dialyzer_plt:contains_mfa(Plt, To) of
- false ->
- case erl_bif_types:is_known(M, F, A) of
- true -> Acc;
- false -> [To|Acc]
- end;
- true -> Acc
- end
- end,
- lists:foldl(Fun, [], Exts).
-
-%%--------------------------------------------------------------------
-%% Showing type information or annotating files with such information.
-%%--------------------------------------------------------------------
-
--define(TYPER_ANN_DIR, "typer_ann").
-
--type line() :: non_neg_integer().
--type fa() :: {atom(), arity()}.
--type func_info() :: {line(), atom(), arity()}.
-
--record(info, {records = maps:new() :: erl_types:type_table(),
- functions = [] :: [func_info()],
- types = map__new() :: map_dict(),
- edoc = false :: boolean()}).
--record(inc, {map = map__new() :: map_dict(), filter = [] :: files()}).
--type inc() :: #inc{}.
-
--spec show_or_annotate(analysis()) -> 'ok'.
-
-show_or_annotate(#analysis{mode = Mode, fms = Files} = Analysis) ->
- case Mode of
- ?SHOW -> show(Analysis);
- ?SHOW_EXPORTED -> show(Analysis);
- ?ANNOTATE ->
- Fun = fun ({File, Module}) ->
- Info = get_final_info(File, Module, Analysis),
- write_typed_file(File, Info)
- end,
- lists:foreach(Fun, Files);
- ?ANNOTATE_INC_FILES ->
- IncInfo = write_and_collect_inc_info(Analysis),
- write_inc_files(IncInfo)
- end.
-
-write_and_collect_inc_info(Analysis) ->
- Fun = fun ({File, Module}, Inc) ->
- Info = get_final_info(File, Module, Analysis),
- write_typed_file(File, Info),
- IncFuns = get_functions(File, Analysis),
- collect_imported_functions(IncFuns, Info#info.types, Inc)
- end,
- NewInc = lists:foldl(Fun, #inc{}, Analysis#analysis.fms),
- clean_inc(NewInc).
-
-write_inc_files(Inc) ->
- Fun =
- fun (File) ->
- Val = map__lookup(File, Inc#inc.map),
- %% Val is function with its type info
- %% in form [{{Line,F,A},Type}]
- Functions = [Key || {Key, _} <- Val],
- Val1 = [{{F,A},Type} || {{_Line,F,A},Type} <- Val],
- Info = #info{types = map__from_list(Val1),
- records = maps:new(),
- %% Note we need to sort functions here!
- functions = lists:keysort(1, Functions)},
- %% io:format("Types ~tp\n", [Info#info.types]),
- %% io:format("Functions ~tp\n", [Info#info.functions]),
- %% io:format("Records ~tp\n", [Info#info.records]),
- write_typed_file(File, Info)
- end,
- lists:foreach(Fun, dict:fetch_keys(Inc#inc.map)).
-
-show(Analysis) ->
- Fun = fun ({File, Module}) ->
- Info = get_final_info(File, Module, Analysis),
- show_type_info(File, Info)
- end,
- lists:foreach(Fun, Analysis#analysis.fms).
-
-get_final_info(File, Module, Analysis) ->
- Records = get_records(File, Analysis),
- Types = get_types(Module, Analysis, Records),
- Functions = get_functions(File, Analysis),
- Edoc = Analysis#analysis.edoc,
- #info{records = Records, functions = Functions, types = Types, edoc = Edoc}.
-
-collect_imported_functions(Functions, Types, Inc) ->
- %% Coming from other sourses, including:
- %% FIXME: How to deal with yecc-generated file????
- %% --.yrl (yecc-generated file)???
- %% -- yeccpre.hrl (yecc-generated file)???
- %% -- other cases
- Fun = fun ({File, _} = Obj, I) ->
- case is_yecc_gen(File, I) of
- {true, NewI} -> NewI;
- {false, NewI} ->
- check_imported_functions(Obj, NewI, Types)
- end
- end,
- lists:foldl(Fun, Inc, Functions).
-
--spec is_yecc_gen(file:filename(), inc()) -> {boolean(), inc()}.
-
-is_yecc_gen(File, #inc{filter = Fs} = Inc) ->
- case lists:member(File, Fs) of
- true -> {true, Inc};
- false ->
- case filename:extension(File) of
- ".yrl" ->
- Rootname = filename:rootname(File, ".yrl"),
- Obj = Rootname ++ ".erl",
- case lists:member(Obj, Fs) of
- true -> {true, Inc};
- false ->
- NewInc = Inc#inc{filter = [Obj|Fs]},
- {true, NewInc}
- end;
- _ ->
- case filename:basename(File) of
- "yeccpre.hrl" -> {true, Inc};
- _ -> {false, Inc}
- end
- end
- end.
-
-check_imported_functions({File, {Line, F, A}}, Inc, Types) ->
- IncMap = Inc#inc.map,
- FA = {F, A},
- Type = get_type_info(FA, Types),
- case map__lookup(File, IncMap) of
- none -> %% File is not added. Add it
- Obj = {File,[{FA, {Line, Type}}]},
- NewMap = map__insert(Obj, IncMap),
- Inc#inc{map = NewMap};
- Val -> %% File is already in. Check.
- case lists:keyfind(FA, 1, Val) of
- false ->
- %% Function is not in; add it
- Obj = {File, Val ++ [{FA, {Line, Type}}]},
- NewMap = map__insert(Obj, IncMap),
- Inc#inc{map = NewMap};
- Type ->
- %% Function is in and with same type
- Inc;
- _ ->
- %% Function is in but with diff type
- inc_warning(FA, File),
- Elem = lists:keydelete(FA, 1, Val),
- NewMap = case Elem of
- [] -> map__remove(File, IncMap);
- _ -> map__insert({File, Elem}, IncMap)
- end,
- Inc#inc{map = NewMap}
- end
- end.
-
-inc_warning({F, A}, File) ->
- io:format(" ***Warning: Skip function ~tp/~p ", [F, A]),
- io:format("in file ~tp because of inconsistent type\n", [File]).
-
-clean_inc(Inc) ->
- Inc1 = remove_yecc_generated_file(Inc),
- normalize_obj(Inc1).
-
-remove_yecc_generated_file(#inc{filter = Filter} = Inc) ->
- Fun = fun (Key, #inc{map = Map} = I) ->
- I#inc{map = map__remove(Key, Map)}
- end,
- lists:foldl(Fun, Inc, Filter).
-
-normalize_obj(TmpInc) ->
- Fun = fun (Key, Val, Inc) ->
- NewVal = [{{Line,F,A},Type} || {{F,A},{Line,Type}} <- Val],
- map__insert({Key, NewVal}, Inc)
- end,
- TmpInc#inc{map = map__fold(Fun, map__new(), TmpInc#inc.map)}.
-
-get_records(File, Analysis) ->
- map__lookup(File, Analysis#analysis.record).
-
-get_types(Module, Analysis, Records) ->
- TypeInfoPlt = Analysis#analysis.trust_plt,
- TypeInfo =
- case dialyzer_plt:lookup_module(TypeInfoPlt, Module) of
- none -> [];
- {value, List} -> List
- end,
- CodeServer = Analysis#analysis.codeserver,
- TypeInfoList =
- case Analysis#analysis.show_succ of
- true ->
- [convert_type_info(I) || I <- TypeInfo];
- false ->
- [get_type(I, CodeServer, Records) || I <- TypeInfo]
- end,
- map__from_list(TypeInfoList).
-
-convert_type_info({{_M, F, A}, Range, Arg}) ->
- {{F, A}, {Range, Arg}}.
-
-get_type({{M, F, A} = MFA, Range, Arg}, CodeServer, Records) ->
- case dialyzer_codeserver:lookup_mfa_contract(MFA, CodeServer) of
- error ->
- {{F, A}, {Range, Arg}};
- {ok, {_FileLine, Contract, _Xtra}} ->
- Sig = erl_types:t_fun(Arg, Range),
- case dialyzer_contracts:check_contract(Contract, Sig) of
- ok -> {{F, A}, {contract, Contract}};
- {range_warnings, _} ->
- {{F, A}, {contract, Contract}};
- {error, {overlapping_contract, []}} ->
- {{F, A}, {contract, Contract}};
- {error, invalid_contract} ->
- CString = dialyzer_contracts:contract_to_string(Contract),
- SigString = dialyzer_utils:format_sig(Sig, Records),
- Msg = io_lib:format("Error in contract of function ~w:~tw/~w\n"
- "\t The contract is: " ++ CString ++ "\n" ++
- "\t but the inferred signature is: ~ts",
- [M, F, A, SigString]),
- fatal_error(Msg);
- {error, ErrorStr} when is_list(ErrorStr) -> % ErrorStr is a string()
- Msg = io_lib:format("Error in contract of function ~w:~tw/~w: ~ts",
- [M, F, A, ErrorStr]),
- fatal_error(Msg)
- end
- end.
-
-get_functions(File, Analysis) ->
- case Analysis#analysis.mode of
- ?SHOW ->
- Funcs = map__lookup(File, Analysis#analysis.func),
- Inc_Funcs = map__lookup(File, Analysis#analysis.inc_func),
- remove_module_info(Funcs) ++ normalize_incFuncs(Inc_Funcs);
- ?SHOW_EXPORTED ->
- Ex_Funcs = map__lookup(File, Analysis#analysis.ex_func),
- remove_module_info(Ex_Funcs);
- ?ANNOTATE ->
- Funcs = map__lookup(File, Analysis#analysis.func),
- remove_module_info(Funcs);
- ?ANNOTATE_INC_FILES ->
- map__lookup(File, Analysis#analysis.inc_func)
- end.
-
-normalize_incFuncs(Functions) ->
- [FunInfo || {_FileName, FunInfo} <- Functions].
-
--spec remove_module_info([func_info()]) -> [func_info()].
-
-remove_module_info(FunInfoList) ->
- F = fun ({_,module_info,0}) -> false;
- ({_,module_info,1}) -> false;
- ({Line,F,A}) when is_integer(Line), is_atom(F), is_integer(A) -> true
- end,
- lists:filter(F, FunInfoList).
-
-write_typed_file(File, Info) ->
- io:format(" Processing file: ~tp\n", [File]),
- Dir = filename:dirname(File),
- RootName = filename:basename(filename:rootname(File)),
- Ext = filename:extension(File),
- TyperAnnDir = filename:join(Dir, ?TYPER_ANN_DIR),
- TmpNewFilename = lists:concat([RootName, ".ann", Ext]),
- NewFileName = filename:join(TyperAnnDir, TmpNewFilename),
- case file:make_dir(TyperAnnDir) of
- {error, Reason} ->
- case Reason of
- eexist -> %% TypEr dir exists; remove old typer files if they exist
- case file:delete(NewFileName) of
- ok -> ok;
- {error, enoent} -> ok;
- {error, _} ->
- Msg = io_lib:format("Error in deleting file ~ts\n", [NewFileName]),
- fatal_error(Msg)
- end,
- write_typed_file(File, Info, NewFileName);
- enospc ->
- Msg = io_lib:format("Not enough space in ~tp\n", [Dir]),
- fatal_error(Msg);
- eacces ->
- Msg = io_lib:format("No write permission in ~tp\n", [Dir]),
- fatal_error(Msg);
- _ ->
- Msg = io_lib:format("Unhandled error ~ts when writing ~tp\n",
- [Reason, Dir]),
- fatal_error(Msg)
- end;
- ok -> %% Typer dir does NOT exist
- write_typed_file(File, Info, NewFileName)
- end.
-
-write_typed_file(File, Info, NewFileName) ->
- {ok, Binary} = file:read_file(File),
- Chars = unicode:characters_to_list(Binary),
- write_typed_file(Chars, NewFileName, Info, 1, []),
- io:format(" Saved as: ~tp\n", [NewFileName]).
-
-write_typed_file(Chars, File, #info{functions = []}, _LNo, _Acc) ->
- ok = file:write_file(File, unicode:characters_to_binary(Chars), [append]);
-write_typed_file([Ch|Chs] = Chars, File, Info, LineNo, Acc) ->
- [{Line,F,A}|RestFuncs] = Info#info.functions,
- case Line of
- 1 -> %% This will happen only for inc files
- ok = raw_write(F, A, Info, File, []),
- NewInfo = Info#info{functions = RestFuncs},
- NewAcc = [],
- write_typed_file(Chars, File, NewInfo, Line, NewAcc);
- _ ->
- case Ch of
- 10 ->
- NewLineNo = LineNo + 1,
- {NewInfo, NewAcc} =
- case NewLineNo of
- Line ->
- ok = raw_write(F, A, Info, File, [Ch|Acc]),
- {Info#info{functions = RestFuncs}, []};
- _ ->
- {Info, [Ch|Acc]}
- end,
- write_typed_file(Chs, File, NewInfo, NewLineNo, NewAcc);
- _ ->
- write_typed_file(Chs, File, Info, LineNo, [Ch|Acc])
- end
- end.
-
-raw_write(F, A, Info, File, Content) ->
- TypeInfo = get_type_string(F, A, Info, file),
- ContentList = lists:reverse(Content) ++ TypeInfo ++ "\n",
- ContentBin = unicode:characters_to_binary(ContentList),
- file:write_file(File, ContentBin, [append]).
-
-get_type_string(F, A, Info, Mode) ->
- Type = get_type_info({F,A}, Info#info.types),
- TypeStr =
- case Type of
- {contract, C} ->
- dialyzer_contracts:contract_to_string(C);
- {RetType, ArgType} ->
- Sig = erl_types:t_fun(ArgType, RetType),
- dialyzer_utils:format_sig(Sig, Info#info.records)
- end,
- case Info#info.edoc of
- false ->
- case {Mode, Type} of
- {file, {contract, _}} -> "";
- _ ->
- Prefix = lists:concat(["-spec ", erl_types:atom_to_string(F)]),
- lists:concat([Prefix, TypeStr, "."])
- end;
- true ->
- Prefix = lists:concat(["%% @spec ", F]),
- lists:concat([Prefix, TypeStr, "."])
- end.
-
-show_type_info(File, Info) ->
- io:format("\n%% File: ~tp\n%% ", [File]),
- OutputString = lists:concat(["~.", length(File)+8, "c~n"]),
- io:fwrite(OutputString, [$-]),
- Fun = fun ({_LineNo, F, A}) ->
- TypeInfo = get_type_string(F, A, Info, show),
- io:format("~ts\n", [TypeInfo])
- end,
- lists:foreach(Fun, Info#info.functions).
-
-get_type_info(Func, Types) ->
- case map__lookup(Func, Types) of
- none ->
- %% Note: Typeinfo of any function should exist in
- %% the result offered by dialyzer, otherwise there
- %% *must* be something wrong with the analysis
- Msg = io_lib:format("No type info for function: ~tp\n", [Func]),
- fatal_error(Msg);
- {contract, _Fun} = C -> C;
- {_RetType, _ArgType} = RA -> RA
- end.
-
-%%--------------------------------------------------------------------
%% Processing of command-line options and arguments.
%%--------------------------------------------------------------------
--spec process_cl_args() -> {args(), analysis()}.
+-spec process_cl_args() -> typer_core:opts().
process_cl_args() ->
ArgList = init:get_plain_arguments(),
%% io:format("Args is ~tp\n", [ArgList]),
- {Args, Analysis} = analyze_args(ArgList, #args{}, #analysis{}),
+ Opts = analyze_args(ArgList, #{}),
%% if the mode has not been set, set it to the default mode (show)
- {Args, case Analysis#analysis.mode of
- undefined -> Analysis#analysis{mode = ?SHOW};
- Mode when is_atom(Mode) -> Analysis
- end}.
+ case Opts of
+ #{mode := _} -> Opts;
+ Opts -> Opts#{mode => ?SHOW}
+ end.
-analyze_args([], Args, Analysis) ->
- {Args, Analysis};
-analyze_args(ArgList, Args, Analysis) ->
+analyze_args([], Opts) ->
+ Opts;
+analyze_args(ArgList, Opts) ->
{Result, Rest} = cl(ArgList),
- {NewArgs, NewAnalysis} = analyze_result(Result, Args, Analysis),
- analyze_args(Rest, NewArgs, NewAnalysis).
+ NewOpts = analyze_result(Result, Opts),
+ analyze_args(Rest, NewOpts).
cl(["-h"|_]) -> help_message();
cl(["--help"|_]) -> help_message();
@@ -605,19 +83,13 @@ cl(["--annotate"|Opts]) -> {{mode, ?ANNOTATE}, Opts};
cl(["--annotate-inc-files"|Opts]) -> {{mode, ?ANNOTATE_INC_FILES}, Opts};
cl(["--no_spec"|Opts]) -> {no_spec, Opts};
cl(["--plt",Plt|Opts]) -> {{plt, Plt}, Opts};
+cl(["-D"|_Opts]) -> fatal_error("no variable name specified after -D");
cl(["-D"++Def|Opts]) ->
- case Def of
- "" -> fatal_error("no variable name specified after -D");
- _ ->
- DefPair = process_def_list(re:split(Def, "=", [{return, list}, unicode])),
- {{def, DefPair}, Opts}
- end;
+ DefPair = process_def_list(re:split(Def, "=", [{return, list}, unicode])),
+ {{def, DefPair}, Opts};
cl(["-I",Dir|Opts]) -> {{inc, Dir}, Opts};
-cl(["-I"++Dir|Opts]) ->
- case Dir of
- "" -> fatal_error("no include directory specified after -I");
- _ -> {{inc, Dir}, Opts}
- end;
+cl(["-I"|_Opts]) -> fatal_error("no include directory specified after -I");
+cl(["-I"++Dir|Opts]) -> {{inc, Dir}, Opts};
cl(["-T"|Opts]) ->
{Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
case Files of
@@ -630,7 +102,7 @@ cl(["-r"|Opts]) ->
cl(["-pa",Dir|Opts]) -> {{pa,Dir}, Opts};
cl(["-pz",Dir|Opts]) -> {{pz,Dir}, Opts};
cl(["-"++H|_]) -> fatal_error("unknown option -"++H);
-cl(Opts) ->
+cl(Opts) ->
{Files, RestOpts} = dialyzer_cl_parse:collect_args(Opts),
{{files, Files}, RestOpts}.
@@ -645,327 +117,38 @@ process_def_list(L) ->
end.
%% Get information about files that the user trusts and wants to analyze
-analyze_result({files, Val}, Args, Analysis) ->
- NewVal = Args#args.files ++ Val,
- {Args#args{files = NewVal}, Analysis};
-analyze_result({files_r, Val}, Args, Analysis) ->
- NewVal = Args#args.files_r ++ Val,
- {Args#args{files_r = NewVal}, Analysis};
-analyze_result({trusted, Val}, Args, Analysis) ->
- NewVal = Args#args.trusted ++ Val,
- {Args#args{trusted = NewVal}, Analysis};
-analyze_result(edoc, Args, Analysis) ->
- {Args, Analysis#analysis{edoc = true}};
+analyze_result({files, Val}, Opts) ->
+ append_in_map(files, Val, Opts);
+analyze_result({files_r, Val}, Opts) ->
+ append_in_map(files_r, Val, Opts);
+analyze_result({trusted, Val}, Opts) ->
+ append_in_map(trusted, Val, Opts);
+analyze_result(edoc, Opts) ->
+ Opts#{edoc => true};
%% Get useful information for actual analysis
-analyze_result({mode, Mode}, Args, Analysis) ->
- case Analysis#analysis.mode of
- undefined -> {Args, Analysis#analysis{mode = Mode}};
- OldMode -> mode_error(OldMode, Mode)
- end;
-analyze_result({def, Val}, Args, Analysis) ->
- NewVal = Analysis#analysis.macros ++ [Val],
- {Args, Analysis#analysis{macros = NewVal}};
-analyze_result({inc, Val}, Args, Analysis) ->
- NewVal = Analysis#analysis.includes ++ [Val],
- {Args, Analysis#analysis{includes = NewVal}};
-analyze_result({plt, Plt}, Args, Analysis) ->
- {Args, Analysis#analysis{plt = Plt}};
-analyze_result(show_succ, Args, Analysis) ->
- {Args, Analysis#analysis{show_succ = true}};
-analyze_result(no_spec, Args, Analysis) ->
- {Args, Analysis#analysis{no_spec = true}};
-analyze_result({pa, Dir}, Args, Analysis) ->
+analyze_result({mode, Mode}, #{mode := OldMode}) ->
+ mode_error(OldMode, Mode);
+analyze_result({mode, Mode}, Opts) ->
+ Opts#{mode => Mode};
+analyze_result({def, Val}, Opts) ->
+ append_in_map(macros, [Val], Opts);
+analyze_result({inc, Val}, Opts) ->
+ append_in_map(includes, [Val], Opts);
+analyze_result({plt, Plt}, Opts) ->
+ Opts#{plt => Plt};
+analyze_result(show_succ, Opts) ->
+ Opts#{show_succ => true};
+analyze_result(no_spec, Opts) ->
+ Opts#{no_spec => true};
+analyze_result({pa, Dir}, Opts) ->
true = code:add_patha(Dir),
- {Args, Analysis};
-analyze_result({pz, Dir}, Args, Analysis) ->
+ Opts;
+analyze_result({pz, Dir}, Opts) ->
true = code:add_pathz(Dir),
- {Args, Analysis}.
-
-%%--------------------------------------------------------------------
-%% File processing.
-%%--------------------------------------------------------------------
-
--spec get_all_files(args()) -> [file:filename(),...].
-
-get_all_files(#args{files = Fs, files_r = Ds}) ->
- case filter_fd(Fs, Ds, fun test_erl_file_exclude_ann/1) of
- [] -> fatal_error("no file(s) to analyze");
- AllFiles -> AllFiles
- end.
-
--spec test_erl_file_exclude_ann(file:filename()) -> boolean().
-
-test_erl_file_exclude_ann(File) ->
- case is_erl_file(File) of
- true -> %% Exclude files ending with ".ann.erl"
- case re:run(File, "[\.]ann[\.]erl$", [unicode]) of
- {match, _} -> false;
- nomatch -> true
- end;
- false -> false
- end.
-
--spec is_erl_file(file:filename()) -> boolean().
-
-is_erl_file(File) ->
- filename:extension(File) =:= ".erl".
-
--type test_file_fun() :: fun((file:filename()) -> boolean()).
-
--spec filter_fd(files(), files(), test_file_fun()) -> files().
-
-filter_fd(File_Dir, Dir_R, Fun) ->
- All_File_1 = process_file_and_dir(File_Dir, Fun),
- All_File_2 = process_dir_rec(Dir_R, Fun),
- remove_dup(All_File_1 ++ All_File_2).
-
--spec process_file_and_dir(files(), test_file_fun()) -> files().
-
-process_file_and_dir(File_Dir, TestFun) ->
- Fun =
- fun (Elem, Acc) ->
- case filelib:is_regular(Elem) of
- true -> process_file(Elem, TestFun, Acc);
- false -> check_dir(Elem, false, Acc, TestFun)
- end
- end,
- lists:foldl(Fun, [], File_Dir).
-
--spec process_dir_rec(files(), test_file_fun()) -> files().
-
-process_dir_rec(Dirs, TestFun) ->
- Fun = fun (Dir, Acc) -> check_dir(Dir, true, Acc, TestFun) end,
- lists:foldl(Fun, [], Dirs).
-
--spec check_dir(file:filename(), boolean(), files(), test_file_fun()) -> files().
-
-check_dir(Dir, Recursive, Acc, Fun) ->
- case file:list_dir(Dir) of
- {ok, Files} ->
- {TmpDirs, TmpFiles} = split_dirs_and_files(Files, Dir),
- case Recursive of
- false ->
- FinalFiles = process_file_and_dir(TmpFiles, Fun),
- Acc ++ FinalFiles;
- true ->
- TmpAcc1 = process_file_and_dir(TmpFiles, Fun),
- TmpAcc2 = process_dir_rec(TmpDirs, Fun),
- Acc ++ TmpAcc1 ++ TmpAcc2
- end;
- {error, eacces} ->
- fatal_error("no access permission to dir \""++Dir++"\"");
- {error, enoent} ->
- fatal_error("cannot access "++Dir++": No such file or directory");
- {error, _Reason} ->
- fatal_error("error involving a use of file:list_dir/1")
- end.
-
-%% Same order as the input list
--spec process_file(file:filename(), test_file_fun(), files()) -> files().
-
-process_file(File, TestFun, Acc) ->
- case TestFun(File) of
- true -> Acc ++ [File];
- false -> Acc
- end.
-
-%% Same order as the input list
--spec split_dirs_and_files(files(), file:filename()) -> {files(), files()}.
-
-split_dirs_and_files(Elems, Dir) ->
- Test_Fun =
- fun (Elem, {DirAcc, FileAcc}) ->
- File = filename:join(Dir, Elem),
- case filelib:is_regular(File) of
- false -> {[File|DirAcc], FileAcc};
- true -> {DirAcc, [File|FileAcc]}
- end
- end,
- {Dirs, Files} = lists:foldl(Test_Fun, {[], []}, Elems),
- {lists:reverse(Dirs), lists:reverse(Files)}.
-
-%% Removes duplicate filenames but keeps the order of the input list
--spec remove_dup(files()) -> files().
-
-remove_dup(Files) ->
- Test_Dup = fun (File, Acc) ->
- case lists:member(File, Acc) of
- true -> Acc;
- false -> [File|Acc]
- end
- end,
- Reversed_Elems = lists:foldl(Test_Dup, [], Files),
- lists:reverse(Reversed_Elems).
-
-%%--------------------------------------------------------------------
-%% Collect information.
-%%--------------------------------------------------------------------
-
--type inc_file_info() :: {file:filename(), func_info()}.
-
--record(tmpAcc, {file :: file:filename(),
- module :: atom(),
- funcAcc = [] :: [func_info()],
- incFuncAcc = [] :: [inc_file_info()],
- dialyzerObj = [] :: [{mfa(), {_, _}}]}).
-
--spec collect_info(analysis()) -> analysis().
-
-collect_info(Analysis) ->
- NewPlt =
- try get_dialyzer_plt(Analysis) of
- DialyzerPlt ->
- dialyzer_plt:merge_plts([Analysis#analysis.trust_plt, DialyzerPlt])
- catch
- throw:{dialyzer_error,_Reason} ->
- fatal_error("Dialyzer's PLT is missing or is not up-to-date; please (re)create it")
- end,
- NewAnalysis = lists:foldl(fun collect_one_file_info/2,
- Analysis#analysis{trust_plt = NewPlt},
- Analysis#analysis.files),
- %% Process Remote Types
- TmpCServer = NewAnalysis#analysis.codeserver,
- NewCServer =
- try
- TmpCServer1 = dialyzer_utils:merge_types(TmpCServer, NewPlt),
- NewExpTypes = dialyzer_codeserver:get_temp_exported_types(TmpCServer),
- OldExpTypes = dialyzer_plt:get_exported_types(NewPlt),
- MergedExpTypes = sets:union(NewExpTypes, OldExpTypes),
- TmpCServer2 =
- dialyzer_codeserver:finalize_exported_types(MergedExpTypes, TmpCServer1),
- TmpCServer3 = dialyzer_utils:process_record_remote_types(TmpCServer2),
- dialyzer_contracts:process_contract_remote_types(TmpCServer3)
- catch
- throw:{error, ErrorMsg} ->
- fatal_error(ErrorMsg)
- end,
- NewAnalysis#analysis{codeserver = NewCServer}.
-
-collect_one_file_info(File, Analysis) ->
- Ds = [{d,Name,Val} || {Name,Val} <- Analysis#analysis.macros],
- %% Current directory should also be included in "Includes".
- Includes = [filename:dirname(File)|Analysis#analysis.includes],
- Is = [{i,Dir} || Dir <- Includes],
- Options = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds,
- case dialyzer_utils:get_core_from_src(File, Options) of
- {error, Reason} ->
- %% io:format("File=~tp\n,Options=~p\n,Error=~p\n", [File,Options,Reason]),
- compile_error(Reason);
- {ok, Core} ->
- case dialyzer_utils:get_record_and_type_info(Core) of
- {error, Reason} -> compile_error([Reason]);
- {ok, Records} ->
- Mod = cerl:concrete(cerl:module_name(Core)),
- case dialyzer_utils:get_spec_info(Mod, Core, Records) of
- {error, Reason} -> compile_error([Reason]);
- {ok, SpecInfo, CbInfo} ->
- ExpTypes = get_exported_types_from_core(Core),
- analyze_core_tree(Core, Records, SpecInfo, CbInfo,
- ExpTypes, Analysis, File)
- end
- end
- end.
-
-analyze_core_tree(Core, Records, SpecInfo, CbInfo, ExpTypes, Analysis, File) ->
- Module = cerl:concrete(cerl:module_name(Core)),
- TmpTree = cerl:from_records(Core),
- CS1 = Analysis#analysis.codeserver,
- NextLabel = dialyzer_codeserver:get_next_core_label(CS1),
- {Tree, NewLabel} = cerl_trees:label(TmpTree, NextLabel),
- CS2 = dialyzer_codeserver:insert(Module, Tree, CS1),
- CS3 = dialyzer_codeserver:set_next_core_label(NewLabel, CS2),
- CS4 = dialyzer_codeserver:store_temp_records(Module, Records, CS3),
- CS5 =
- case Analysis#analysis.no_spec of
- true -> CS4;
- false ->
- dialyzer_codeserver:store_temp_contracts(Module, SpecInfo, CbInfo, CS4)
- end,
- OldExpTypes = dialyzer_codeserver:get_temp_exported_types(CS5),
- MergedExpTypes = sets:union(ExpTypes, OldExpTypes),
- CS6 = dialyzer_codeserver:insert_temp_exported_types(MergedExpTypes, CS5),
- Ex_Funcs = [{0,F,A} || {_,_,{F,A}} <- cerl:module_exports(Tree)],
- CG = Analysis#analysis.callgraph,
- {V, E} = dialyzer_callgraph:scan_core_tree(Tree, CG),
- dialyzer_callgraph:add_edges(E, V, CG),
- Fun = fun analyze_one_function/2,
- All_Defs = cerl:module_defs(Tree),
- Acc = lists:foldl(Fun, #tmpAcc{file = File, module = Module}, All_Defs),
- Exported_FuncMap = map__insert({File, Ex_Funcs}, Analysis#analysis.ex_func),
- %% we must sort all functions in the file which
- %% originate from this file by *numerical order* of lineNo
- Sorted_Functions = lists:keysort(1, Acc#tmpAcc.funcAcc),
- FuncMap = map__insert({File, Sorted_Functions}, Analysis#analysis.func),
- %% we do not need to sort functions which are imported from included files
- IncFuncMap = map__insert({File, Acc#tmpAcc.incFuncAcc},
- Analysis#analysis.inc_func),
- FMs = Analysis#analysis.fms ++ [{File, Module}],
- RecordMap = map__insert({File, Records}, Analysis#analysis.record),
- Analysis#analysis{fms = FMs,
- callgraph = CG,
- codeserver = CS6,
- ex_func = Exported_FuncMap,
- inc_func = IncFuncMap,
- record = RecordMap,
- func = FuncMap}.
+ Opts.
-analyze_one_function({Var, FunBody} = Function, Acc) ->
- F = cerl:fname_id(Var),
- A = cerl:fname_arity(Var),
- TmpDialyzerObj = {{Acc#tmpAcc.module, F, A}, Function},
- NewDialyzerObj = Acc#tmpAcc.dialyzerObj ++ [TmpDialyzerObj],
- Anno = cerl:get_ann(FunBody),
- LineNo = get_line(Anno),
- FileName = get_file(Anno),
- BaseName = filename:basename(FileName),
- FuncInfo = {LineNo, F, A},
- OriginalName = Acc#tmpAcc.file,
- {FuncAcc, IncFuncAcc} =
- case (FileName =:= OriginalName) orelse (BaseName =:= OriginalName) of
- true -> %% Coming from original file
- %% io:format("Added function ~tp\n", [{LineNo, F, A}]),
- {Acc#tmpAcc.funcAcc ++ [FuncInfo], Acc#tmpAcc.incFuncAcc};
- false ->
- %% Coming from other sourses, including:
- %% -- .yrl (yecc-generated file)
- %% -- yeccpre.hrl (yecc-generated file)
- %% -- other cases
- {Acc#tmpAcc.funcAcc, Acc#tmpAcc.incFuncAcc ++ [{FileName, FuncInfo}]}
- end,
- Acc#tmpAcc{funcAcc = FuncAcc,
- incFuncAcc = IncFuncAcc,
- dialyzerObj = NewDialyzerObj}.
-
-get_line([Line|_]) when is_integer(Line) -> Line;
-get_line([{Line, _Column} | _Tail]) when is_integer(Line) -> Line;
-get_line([_|Tail]) -> get_line(Tail);
-get_line([]) -> -1.
-
-get_file([{file,File}|_]) -> File;
-get_file([_|T]) -> get_file(T);
-get_file([]) -> "no_file". % should not happen
-
--spec get_dialyzer_plt(analysis()) -> plt().
-
-get_dialyzer_plt(#analysis{plt = PltFile0}) ->
- PltFile =
- case PltFile0 =:= none of
- true -> dialyzer_plt:get_default_plt();
- false -> PltFile0
- end,
- dialyzer_plt:from_file(PltFile).
-
-%% Exported Types
-
-get_exported_types_from_core(Core) ->
- Attrs = cerl:module_attrs(Core),
- ExpTypes1 = [cerl:concrete(L2) || {L1, L2} <- Attrs,
- cerl:is_literal(L1),
- cerl:is_literal(L2),
- cerl:concrete(L1) =:= 'export_type'],
- ExpTypes2 = lists:flatten(ExpTypes1),
- M = cerl:atom_val(cerl:module_name(Core)),
- sets:from_list([{M, F, A} || {F, A} <- ExpTypes2]).
+append_in_map(Key, List, Map) ->
+ maps:update_with(Key, fun(L) -> L ++ List end, List, Map).
%%--------------------------------------------------------------------
%% Utilities for error reporting.
@@ -977,7 +160,7 @@ fatal_error(Slogan) ->
msg(io_lib:format("typer: ~ts\n", [Slogan])),
erlang:halt(1).
--spec mode_error(mode(), mode()) -> no_return().
+-spec mode_error(typer_core:mode(), typer_core:mode()) -> no_return().
mode_error(OldMode, NewMode) ->
Msg = io_lib:format("Mode was previously set to '~s'; "
@@ -985,13 +168,6 @@ mode_error(OldMode, NewMode) ->
[OldMode, NewMode]),
fatal_error(Msg).
--spec compile_error([string()]) -> no_return().
-
-compile_error(Reason) ->
- JoinedString = lists:flatten([X ++ "\n" || X <- Reason]),
- Msg = "Analysis failed with error report:\n" ++ JoinedString,
- fatal_error(Msg).
-
-spec msg(string()) -> 'ok'.
msg(Msg) ->
@@ -1025,7 +201,8 @@ help_message() ->
Same as --show, but prints specifications for exported functions only
Specs are displayed sorted alphabetically on the function's name
--annotate
- Annotates the specified files with type specifications
+ Annotates the specified files with type specifications and writes
+ the resulting files into a new typer_ann folder.
--annotate-inc-files
Same as --annotate but annotates all -include() files as well as
all .erl files (use this option with caution - has not been tested much)
@@ -1046,7 +223,7 @@ help_message() ->
-pa dir
-pz dir
Set code path options to TypEr
- (This is useful for files that use parse tranforms.)
+ (This is useful for files that use parse transforms.)
--version (or -v)
prints the Typer version and exits
--help (or -h)
@@ -1057,52 +234,3 @@ help_message() ->
">>,
io:put_chars(S),
erlang:halt(0).
-
-%%--------------------------------------------------------------------
-%% Handle messages.
-%%--------------------------------------------------------------------
-
-rcv_ext_types() ->
- Self = self(),
- Self ! {Self, done},
- rcv_ext_types(Self, []).
-
-rcv_ext_types(Self, ExtTypes) ->
- receive
- {Self, ext_types, ExtType} ->
- rcv_ext_types(Self, [ExtType|ExtTypes]);
- {Self, done} ->
- lists:usort(ExtTypes)
- end.
-
-%%--------------------------------------------------------------------
-%% A convenient abstraction of a Key-Value mapping data structure
-%% specialized for the uses in this module
-%%--------------------------------------------------------------------
-
--type map_dict() :: dict:dict().
-
--spec map__new() -> map_dict().
-map__new() ->
- dict:new().
-
--spec map__insert({term(), term()}, map_dict()) -> map_dict().
-map__insert(Object, Map) ->
- {Key, Value} = Object,
- dict:store(Key, Value, Map).
-
--spec map__lookup(term(), map_dict()) -> term().
-map__lookup(Key, Map) ->
- try dict:fetch(Key, Map) catch error:_ -> none end.
-
--spec map__from_list([{fa(), term()}]) -> map_dict().
-map__from_list(List) ->
- dict:from_list(List).
-
--spec map__remove(term(), map_dict()) -> map_dict().
-map__remove(Key, Dict) ->
- dict:erase(Key, Dict).
-
--spec map__fold(fun((term(), term(), term()) -> map_dict()), map_dict(), map_dict()) -> map_dict().
-map__fold(Fun, Acc0, Dict) ->
- dict:fold(Fun, Acc0, Dict).
diff --git a/lib/dialyzer/src/typer_core.erl b/lib/dialyzer/src/typer_core.erl
new file mode 100644
index 0000000000..76405775ef
--- /dev/null
+++ b/lib/dialyzer/src/typer_core.erl
@@ -0,0 +1,1031 @@
+%% -*- erlang-indent-level: 2 -*-
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+
+%%-----------------------------------------------------------------------
+%% File : typer_core.erl
+%% Author(s) : The first version of typer was written by Bingwen He
+%% with guidance from Kostis Sagonas and Tobias Lindahl.
+%% Since June 2008 typer is maintained by Kostis Sagonas.
+%% On 2022, Brujo, Pablo, and Mackenzie from NextRoll
+%% started working on the rebar3 plugin for typer and,
+%% with that in mind, splitted typer and typer_core apart.
+%% Description : An Erlang/OTP module that shows type information
+%% for Erlang modules to the user. Additionally, it can
+%% annotate the code of files with such type information.
+%%-----------------------------------------------------------------------
+
+-module(typer_core).
+
+-export([run/1]).
+
+%%-----------------------------------------------------------------------
+
+-define(SHOW, show).
+-define(SHOW_EXPORTED, show_exported).
+-define(ANNOTATE, annotate).
+-define(ANNOTATE_INC_FILES, annotate_inc_files).
+
+-type mode() :: ?SHOW | ?SHOW_EXPORTED | ?ANNOTATE | ?ANNOTATE_INC_FILES.
+
+%%-----------------------------------------------------------------------
+
+-type files() :: [file:filename()].
+-type callgraph() :: dialyzer_callgraph:callgraph().
+-type codeserver() :: dialyzer_codeserver:codeserver().
+-type plt() :: dialyzer_plt:plt().
+-type printer(Return) :: fun((io:format(), [term()]) -> Return).
+-type io() ::
+ #{debug := printer(_),
+ info := printer(_),
+ warn := printer(_),
+ abort := printer(no_return())}.
+-type opts() ::
+ #{mode := mode(),
+ show_succ => boolean(),
+ no_spec => boolean(),
+ edoc => boolean(),
+ plt => file:filename(),
+ trusted => files(),
+ files => files(),
+ files_r => files(),
+ macros => [{atom(), term()}],
+ includes => files(),
+ io => io()}.
+
+-export_type([mode/0, opts/0]).
+
+-record(analysis,
+ {mode :: mode() | 'undefined',
+ macros = [] :: [{atom(), term()}],
+ includes = [] :: files(),
+ codeserver = dialyzer_codeserver:new():: codeserver(),
+ callgraph = dialyzer_callgraph:new() :: callgraph(),
+ files = [] :: files(), % absolute names
+ plt = none :: 'none' | file:filename(),
+ no_spec = false :: boolean(),
+ show_succ = false :: boolean(),
+ %% For choosing between specs or edoc @spec comments
+ edoc = false :: boolean(),
+ %% Files in 'fms' are compilable with option 'to_pp'; we keep them
+ %% as {FileName, ModuleName} in case the ModuleName is different
+ fms = [] :: [{file:filename(), module()}],
+ ex_func = map__new() :: map_dict(),
+ record = map__new() :: map_dict(),
+ func = map__new() :: map_dict(),
+ inc_func = map__new() :: map_dict(),
+ trust_plt = dialyzer_plt:new() :: plt(),
+ io = default_io() :: io()}).
+-type analysis() :: #analysis{}.
+
+-record(args, {files = [] :: files(),
+ files_r = [] :: files(),
+ trusted = [] :: files()}).
+-type args() :: #args{}.
+
+%%--------------------------------------------------------------------
+
+-spec run(opts()) -> ok.
+
+run(Opts) ->
+ {Args, Analysis} = process_cl_args(Opts),
+ msg(debug, "Opts: ~p\nArgs: ~p\nAnalysis: ~p", [Opts, Args, Analysis], Analysis),
+ Timer = dialyzer_timing:init(false),
+ TrustedFiles = filter_fd(Args#args.trusted, [], fun is_erl_file/1, Analysis),
+ Analysis2 = extract(Analysis, TrustedFiles),
+ All_Files = get_all_files(Args, Analysis2),
+ msg(debug, "All_Files: ~tp", [All_Files], Analysis2),
+ Analysis3 = Analysis2#analysis{files = All_Files},
+ Analysis4 = collect_info(Analysis3),
+ msg(debug, "Final: ~p", [Analysis4#analysis.fms], Analysis3),
+ TypeInfo = get_type_info(Analysis4),
+ dialyzer_timing:stop(Timer),
+ show_or_annotate(TypeInfo),
+ msg(debug, "\nTyper analysis finished", [], Analysis4),
+ ok.
+
+%%--------------------------------------------------------------------
+
+-spec extract(analysis(), files()) -> analysis().
+
+extract(#analysis{macros = Macros,
+ includes = Includes,
+ trust_plt = TrustPLT} = Analysis, TrustedFiles) ->
+ msg(debug, "Extracting trusted typer info...", [], Analysis),
+ Ds = [{d, Name, Value} || {Name, Value} <- Macros],
+ CodeServer = dialyzer_codeserver:new(),
+ Fun =
+ fun(File, CS) ->
+ %% We include one more dir; the one above the one we are trusting
+ %% E.g, for /home/tests/typer_ann/test.ann.erl, we should include
+ %% /home/tests/ rather than /home/tests/typer_ann/
+ AllIncludes = [filename:dirname(filename:dirname(File)) | Includes],
+ Is = [{i, Dir} || Dir <- AllIncludes],
+ CompOpts = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds,
+ case dialyzer_utils:get_core_from_src(File, CompOpts) of
+ {ok, Core} ->
+ case dialyzer_utils:get_record_and_type_info(Core) of
+ {ok, RecDict} ->
+ Mod = list_to_atom(filename:basename(File, ".erl")),
+ case dialyzer_utils:get_spec_info(Mod, Core, RecDict) of
+ {ok, SpecDict, CbDict} ->
+ CS1 = dialyzer_codeserver:store_temp_records(Mod, RecDict, CS),
+ dialyzer_codeserver:store_temp_contracts(Mod, SpecDict, CbDict, CS1);
+ {error, Reason} -> compile_error([Reason], Analysis)
+ end;
+ {error, Reason} -> compile_error([Reason], Analysis)
+ end;
+ {error, Reason} -> compile_error(Reason, Analysis)
+ end
+ end,
+ CodeServer1 = lists:foldl(Fun, CodeServer, TrustedFiles),
+ %% Process remote types
+ NewCodeServer =
+ try
+ CodeServer2 =
+ dialyzer_utils:merge_types(CodeServer1,
+ TrustPLT), % XXX change to the PLT?
+ NewExpTypes = dialyzer_codeserver:get_temp_exported_types(CodeServer1),
+ case sets:size(NewExpTypes) of 0 -> ok end,
+ CodeServer3 = dialyzer_codeserver:finalize_exported_types(NewExpTypes, CodeServer2),
+ CodeServer4 = dialyzer_utils:process_record_remote_types(CodeServer3),
+ dialyzer_contracts:process_contract_remote_types(CodeServer4)
+ catch
+ throw:{error, ErrorMsg} ->
+ compile_error(ErrorMsg, Analysis)
+ end,
+ %% Create TrustPLT
+ ContractsDict = dialyzer_codeserver:get_contracts(NewCodeServer),
+ Contracts = orddict:from_list(dict:to_list(ContractsDict)),
+ NewTrustPLT = dialyzer_plt:insert_contract_list(TrustPLT, Contracts),
+ Analysis#analysis{trust_plt = NewTrustPLT}.
+
+%%--------------------------------------------------------------------
+
+-spec get_type_info(analysis()) -> analysis().
+
+get_type_info(#analysis{callgraph = CallGraph,
+ trust_plt = TrustPLT,
+ codeserver = CodeServer} = Analysis) ->
+ StrippedCallGraph = remove_external(CallGraph, TrustPLT, Analysis),
+ msg(debug, "Analyizing callgraph...", [], Analysis),
+ try
+ NewPlt = dialyzer_succ_typings:analyze_callgraph(StrippedCallGraph,
+ TrustPLT,
+ CodeServer,
+ none, []),
+ Analysis#analysis{callgraph = StrippedCallGraph, trust_plt = NewPlt}
+ catch
+ error:What:Stacktrace ->
+ fatal_error(io_lib:format("Analysis failed with message: ~tp",
+ [{What, Stacktrace}]), Analysis);
+ throw:{dialyzer_succ_typing_error, Msg} ->
+ fatal_error(io_lib:format("Analysis failed with message: ~ts", [Msg]), Analysis)
+ end.
+
+-spec remove_external(callgraph(), plt(), analysis()) -> callgraph().
+
+remove_external(CallGraph, PLT, Analysis) ->
+ {StrippedCG0, Ext} = dialyzer_callgraph:remove_external(CallGraph),
+ case get_external(Ext, PLT) of
+ [] -> ok;
+ Externals ->
+ msg(warn, " Unknown functions: ~tp", [lists:usort(Externals)], Analysis),
+ ExtTypes = rcv_ext_types(),
+ case ExtTypes of
+ [] -> ok;
+ _ -> msg(warn, " Unknown types: ~tp", [ExtTypes], Analysis)
+ end
+ end,
+ StrippedCG0.
+
+-spec get_external([{mfa(), mfa()}], plt()) -> [mfa()].
+
+get_external(Exts, Plt) ->
+ Fun = fun ({_From, To = {M, F, A}}, Acc) ->
+ case dialyzer_plt:contains_mfa(Plt, To) of
+ false ->
+ case erl_bif_types:is_known(M, F, A) of
+ true -> Acc;
+ false -> [To|Acc]
+ end;
+ true -> Acc
+ end
+ end,
+ lists:foldl(Fun, [], Exts).
+
+%%--------------------------------------------------------------------
+%% Showing type information or annotating files with such information.
+%%--------------------------------------------------------------------
+
+-define(TYPER_ANN_DIR, "typer_ann").
+
+-type line() :: non_neg_integer().
+-type fa() :: {atom(), arity()}.
+-type func_info() :: {line(), atom(), arity()}.
+
+-record(info, {records = maps:new() :: erl_types:type_table(),
+ functions = [] :: [func_info()],
+ types = map__new() :: map_dict(),
+ edoc = false :: boolean()}).
+-record(inc, {map = map__new() :: map_dict(), filter = [] :: files()}).
+-type inc() :: #inc{}.
+
+-spec show_or_annotate(analysis()) -> 'ok'.
+
+show_or_annotate(#analysis{mode = Mode, fms = Files} = Analysis) ->
+ case Mode of
+ ?SHOW -> show(Analysis);
+ ?SHOW_EXPORTED -> show(Analysis);
+ ?ANNOTATE ->
+ Fun = fun ({File, Module}) ->
+ Info = get_final_info(File, Module, Analysis),
+ write_typed_file(File, Info, Analysis)
+ end,
+ lists:foreach(Fun, Files);
+ ?ANNOTATE_INC_FILES ->
+ IncInfo = write_and_collect_inc_info(Analysis),
+ write_inc_files(IncInfo, Analysis)
+ end.
+
+write_and_collect_inc_info(Analysis) ->
+ Fun = fun ({File, Module}, Inc) ->
+ Info = get_final_info(File, Module, Analysis),
+ write_typed_file(File, Info, Analysis),
+ IncFuns = get_functions(File, Analysis),
+ collect_imported_functions(IncFuns, Info#info.types, Inc, Analysis)
+ end,
+ NewInc = lists:foldl(Fun, #inc{}, Analysis#analysis.fms),
+ clean_inc(NewInc).
+
+write_inc_files(Inc, Analysis) ->
+ Fun =
+ fun (File) ->
+ Val = map__lookup(File, Inc#inc.map),
+ %% Val is function with its type info
+ %% in form [{{Line,F,A},Type}]
+ Functions = [Key || {Key, _} <- Val],
+ Val1 = [{{F,A},Type} || {{_Line,F,A},Type} <- Val],
+ Info = #info{types = map__from_list(Val1),
+ records = maps:new(),
+ %% Note we need to sort functions here!
+ functions = lists:keysort(1, Functions)},
+ msg(debug, "Types ~tp", [Info#info.types], Analysis),
+ msg(debug, "Functions ~tp", [Info#info.functions], Analysis),
+ msg(debug, "Records ~tp", [Info#info.records], Analysis),
+ write_typed_file(File, Info, Analysis)
+ end,
+ lists:foreach(Fun, dict:fetch_keys(Inc#inc.map)).
+
+show(Analysis) ->
+ Fun = fun ({File, Module}) ->
+ Info = get_final_info(File, Module, Analysis),
+ show_type_info(File, Info, Analysis)
+ end,
+ lists:foreach(Fun, Analysis#analysis.fms).
+
+get_final_info(File, Module, Analysis) ->
+ Records = get_records(File, Analysis),
+ Types = get_types(Module, Analysis, Records),
+ Functions = get_functions(File, Analysis),
+ Edoc = Analysis#analysis.edoc,
+ #info{records = Records, functions = Functions, types = Types, edoc = Edoc}.
+
+collect_imported_functions(Functions, Types, Inc, Analysis) ->
+ %% Coming from other sourses, including:
+ %% FIXME: How to deal with yecc-generated file????
+ %% --.yrl (yecc-generated file)???
+ %% -- yeccpre.hrl (yecc-generated file)???
+ %% -- other cases
+ Fun = fun ({File, _} = Obj, I) ->
+ case is_yecc_gen(File, I) of
+ {true, NewI} -> NewI;
+ {false, NewI} ->
+ check_imported_functions(Obj, NewI, Types, Analysis)
+ end
+ end,
+ lists:foldl(Fun, Inc, Functions).
+
+-spec is_yecc_gen(file:filename(), inc()) -> {boolean(), inc()}.
+
+is_yecc_gen(File, #inc{filter = Fs} = Inc) ->
+ case lists:member(File, Fs) of
+ true -> {true, Inc};
+ false ->
+ case filename:extension(File) of
+ ".yrl" ->
+ Rootname = filename:rootname(File, ".yrl"),
+ Obj = Rootname ++ ".erl",
+ case lists:member(Obj, Fs) of
+ true -> {true, Inc};
+ false ->
+ NewInc = Inc#inc{filter = [Obj|Fs]},
+ {true, NewInc}
+ end;
+ _ ->
+ case filename:basename(File) of
+ "yeccpre.hrl" -> {true, Inc};
+ _ -> {false, Inc}
+ end
+ end
+ end.
+
+check_imported_functions({File, {Line, F, A}}, Inc, Types, Analysis) ->
+ IncMap = Inc#inc.map,
+ FA = {F, A},
+ Type = get_type_info(FA, Types, Analysis),
+ case map__lookup(File, IncMap) of
+ none -> %% File is not added. Add it
+ Obj = {File,[{FA, {Line, Type}}]},
+ NewMap = map__insert(Obj, IncMap),
+ Inc#inc{map = NewMap};
+ Val -> %% File is already in. Check.
+ case lists:keyfind(FA, 1, Val) of
+ false ->
+ %% Function is not in; add it
+ Obj = {File, Val ++ [{FA, {Line, Type}}]},
+ NewMap = map__insert(Obj, IncMap),
+ Inc#inc{map = NewMap};
+ Type ->
+ %% Function is in and with same type
+ Inc;
+ _ ->
+ %% Function is in but with diff type
+ inc_warning(FA, File, Analysis),
+ Elem = lists:keydelete(FA, 1, Val),
+ NewMap = case Elem of
+ [] -> map__remove(File, IncMap);
+ _ -> map__insert({File, Elem}, IncMap)
+ end,
+ Inc#inc{map = NewMap}
+ end
+ end.
+
+inc_warning({F, A}, File, Analysis) ->
+ msg(warn,
+ " ***Warning: Skip function ~tp/~p "
+ "in file ~tp because of inconsistent type",
+ [F, A, File],
+ Analysis).
+
+clean_inc(Inc) ->
+ Inc1 = remove_yecc_generated_file(Inc),
+ normalize_obj(Inc1).
+
+remove_yecc_generated_file(#inc{filter = Filter} = Inc) ->
+ Fun = fun (Key, #inc{map = Map} = I) ->
+ I#inc{map = map__remove(Key, Map)}
+ end,
+ lists:foldl(Fun, Inc, Filter).
+
+normalize_obj(TmpInc) ->
+ Fun = fun (Key, Val, Inc) ->
+ NewVal = [{{Line,F,A},Type} || {{F,A},{Line,Type}} <- Val],
+ map__insert({Key, NewVal}, Inc)
+ end,
+ TmpInc#inc{map = map__fold(Fun, map__new(), TmpInc#inc.map)}.
+
+get_records(File, Analysis) ->
+ map__lookup(File, Analysis#analysis.record).
+
+get_types(Module, Analysis, Records) ->
+ TypeInfoPlt = Analysis#analysis.trust_plt,
+ TypeInfo =
+ case dialyzer_plt:lookup_module(TypeInfoPlt, Module) of
+ none -> [];
+ {value, List} -> List
+ end,
+ CodeServer = Analysis#analysis.codeserver,
+ TypeInfoList =
+ case Analysis#analysis.show_succ of
+ true ->
+ [convert_type_info(I) || I <- TypeInfo];
+ false ->
+ [get_type(I, CodeServer, Records, Analysis) || I <- TypeInfo]
+ end,
+ map__from_list(TypeInfoList).
+
+convert_type_info({{_M, F, A}, Range, Arg}) ->
+ {{F, A}, {Range, Arg}}.
+
+get_type({{M, F, A} = MFA, Range, Arg}, CodeServer, Records, Analysis) ->
+ case dialyzer_codeserver:lookup_mfa_contract(MFA, CodeServer) of
+ error ->
+ {{F, A}, {Range, Arg}};
+ {ok, {_FileLine, Contract, _Xtra}} ->
+ Sig = erl_types:t_fun(Arg, Range),
+ case dialyzer_contracts:check_contract(Contract, Sig) of
+ ok -> {{F, A}, {contract, Contract}};
+ {range_warnings, _} ->
+ {{F, A}, {contract, Contract}};
+ {error, {overlapping_contract, []}} ->
+ {{F, A}, {contract, Contract}};
+ {error, invalid_contract} ->
+ CString = dialyzer_contracts:contract_to_string(Contract),
+ SigString = dialyzer_utils:format_sig(Sig, Records),
+ Msg = io_lib:format("Error in contract of function ~w:~tw/~w\n"
+ "\t The contract is: " ++ CString ++ "\n" ++
+ "\t but the inferred signature is: ~ts",
+ [M, F, A, SigString]),
+ fatal_error(Msg, Analysis);
+ {error, ErrorStr} when is_list(ErrorStr) -> % ErrorStr is a string()
+ Msg = io_lib:format("Error in contract of function ~w:~tw/~w: ~ts",
+ [M, F, A, ErrorStr]),
+ fatal_error(Msg, Analysis)
+ end
+ end.
+
+get_functions(File, Analysis) ->
+ case Analysis#analysis.mode of
+ ?SHOW ->
+ Funcs = map__lookup(File, Analysis#analysis.func),
+ Inc_Funcs = map__lookup(File, Analysis#analysis.inc_func),
+ remove_module_info(Funcs) ++ normalize_incFuncs(Inc_Funcs);
+ ?SHOW_EXPORTED ->
+ Ex_Funcs = map__lookup(File, Analysis#analysis.ex_func),
+ remove_module_info(Ex_Funcs);
+ ?ANNOTATE ->
+ Funcs = map__lookup(File, Analysis#analysis.func),
+ remove_module_info(Funcs);
+ ?ANNOTATE_INC_FILES ->
+ map__lookup(File, Analysis#analysis.inc_func)
+ end.
+
+normalize_incFuncs(Functions) ->
+ [FunInfo || {_FileName, FunInfo} <- Functions].
+
+-spec remove_module_info([func_info()]) -> [func_info()].
+
+remove_module_info(FunInfoList) ->
+ F = fun ({_,module_info,0}) -> false;
+ ({_,module_info,1}) -> false;
+ ({Line,F,A}) when is_integer(Line), is_atom(F), is_integer(A) -> true
+ end,
+ lists:filter(F, FunInfoList).
+
+write_typed_file(File, Info, Analysis) ->
+ msg(info, " Processing file: ~tp", [File], Analysis),
+ Dir = filename:dirname(File),
+ RootName = filename:basename(filename:rootname(File)),
+ Ext = filename:extension(File),
+ TyperAnnDir = filename:join(Dir, ?TYPER_ANN_DIR),
+ TmpNewFilename = lists:concat([RootName, ".ann", Ext]),
+ NewFileName = filename:join(TyperAnnDir, TmpNewFilename),
+ case file:make_dir(TyperAnnDir) of
+ {error, Reason} ->
+ case Reason of
+ eexist -> %% TypEr dir exists; remove old typer files if they exist
+ delete_file(NewFileName, Analysis),
+ write_typed_file(File, Info, NewFileName, Analysis);
+ enospc ->
+ Msg = io_lib:format("Not enough space in ~tp", [Dir]),
+ fatal_error(Msg, Analysis);
+ eacces ->
+ Msg = io_lib:format("No write permission in ~tp", [Dir]),
+ fatal_error(Msg, Analysis);
+ _ ->
+ Msg = io_lib:format("Unhandled error ~ts when writing ~tp",
+ [Reason, Dir]),
+ fatal_error(Msg, Analysis)
+ end;
+ ok -> %% Typer dir does NOT exist
+ write_typed_file(File, Info, NewFileName, Analysis)
+ end.
+
+-spec delete_file(file:filename_all(), analysis()) -> ok.
+delete_file(File, Analysis) ->
+ case file:delete(File) of
+ ok ->
+ ok;
+ {error, enoent} ->
+ ok;
+ {error, _} ->
+ Msg = io_lib:format("Error in deleting file ~ts", [File]),
+ fatal_error(Msg, Analysis)
+ end.
+
+write_typed_file(File, Info, NewFileName, Analysis) ->
+ {ok, Binary} = file:read_file(File),
+ Chars = unicode:characters_to_list(Binary),
+ write_typed_file(Chars, NewFileName, Info, 1, [], Analysis),
+ msg(info, " Saved as: ~tp", [NewFileName], Analysis).
+
+write_typed_file(Chars, File, #info{functions = []}, _LNo, _Acc, _Analysis) ->
+ ok = file:write_file(File, unicode:characters_to_binary(Chars), [append]);
+write_typed_file([Ch|Chs] = Chars, File, Info, LineNo, Acc, Analysis) ->
+ [{Line,F,A}|RestFuncs] = Info#info.functions,
+ case Line of
+ 1 -> %% This will happen only for inc files
+ ok = raw_write(F, A, Info, File, [], Analysis),
+ NewInfo = Info#info{functions = RestFuncs},
+ NewAcc = [],
+ write_typed_file(Chars, File, NewInfo, Line, NewAcc, Analysis);
+ _ ->
+ case Ch of
+ 10 ->
+ NewLineNo = LineNo + 1,
+ {NewInfo, NewAcc} =
+ case NewLineNo of
+ Line ->
+ ok = raw_write(F, A, Info, File, [Ch|Acc], Analysis),
+ {Info#info{functions = RestFuncs}, []};
+ _ ->
+ {Info, [Ch|Acc]}
+ end,
+ write_typed_file(Chs, File, NewInfo, NewLineNo, NewAcc, Analysis);
+ _ ->
+ write_typed_file(Chs, File, Info, LineNo, [Ch|Acc], Analysis)
+ end
+ end.
+
+raw_write(F, A, Info, File, Content, Analysis) ->
+ TypeInfo = get_type_string(F, A, Info, file, Analysis),
+ ContentList = lists:reverse(Content) ++ TypeInfo ++ "\n",
+ ContentBin = unicode:characters_to_binary(ContentList),
+ file:write_file(File, ContentBin, [append]).
+
+get_type_string(F, A, Info, Mode, Analysis) ->
+ Type = get_type_info({F,A}, Info#info.types, Analysis),
+ TypeStr =
+ case Type of
+ {contract, C} ->
+ dialyzer_contracts:contract_to_string(C);
+ {RetType, ArgType} ->
+ Sig = erl_types:t_fun(ArgType, RetType),
+ dialyzer_utils:format_sig(Sig, Info#info.records)
+ end,
+ case Info#info.edoc of
+ false ->
+ case {Mode, Type} of
+ {file, {contract, _}} -> "";
+ _ ->
+ Prefix = lists:concat(["-spec ", erl_types:atom_to_string(F)]),
+ lists:concat([Prefix, TypeStr, "."])
+ end;
+ true ->
+ Prefix = lists:concat(["%% @spec ", F]),
+ lists:concat([Prefix, TypeStr, "."])
+ end.
+
+show_type_info(File, Info, Analysis) ->
+ msg(info, "\n%% File: ~tp", [File], Analysis),
+ OutputString = lists:concat(["~.", length(File) + 8, "c"]),
+ msg(info, [$%, $%, $\s | OutputString], [$-], Analysis),
+ Fun = fun ({_LineNo, F, A}) ->
+ TypeInfo = get_type_string(F, A, Info, show, Analysis),
+ msg(info, "~ts", [TypeInfo], Analysis)
+ end,
+ lists:foreach(Fun, Info#info.functions).
+
+get_type_info(Func, Types, Analysis) ->
+ case map__lookup(Func, Types) of
+ none ->
+ %% Note: Typeinfo of any function should exist in
+ %% the result offered by dialyzer, otherwise there
+ %% *must* be something wrong with the analysis
+ Msg = io_lib:format("No type info for function: ~tp", [Func]),
+ fatal_error(Msg, Analysis);
+ {contract, _Fun} = C -> C;
+ {_RetType, _ArgType} = RA -> RA
+ end.
+
+%%--------------------------------------------------------------------
+%% Processing of command-line options and arguments.
+%%--------------------------------------------------------------------
+
+-spec process_cl_args(opts()) -> {args(), analysis()}.
+
+process_cl_args(Opts) ->
+ analyze_args(maps:to_list(Opts), #args{}, #analysis{}).
+
+analyze_args([], Args, Analysis) ->
+ {Args, Analysis};
+analyze_args([Result | Rest], Args, Analysis) ->
+ {NewArgs, NewAnalysis} = analyze_result(Result, Args, Analysis),
+ analyze_args(Rest, NewArgs, NewAnalysis).
+
+%% Get information about files that the user trusts and wants to analyze
+analyze_result({files, Val}, Args, Analysis) ->
+ NewVal = Args#args.files ++ Val,
+ {Args#args{files = NewVal}, Analysis};
+analyze_result({files_r, Val}, Args, Analysis) ->
+ NewVal = Args#args.files_r ++ Val,
+ {Args#args{files_r = NewVal}, Analysis};
+analyze_result({trusted, Val}, Args, Analysis) ->
+ NewVal = Args#args.trusted ++ Val,
+ {Args#args{trusted = NewVal}, Analysis};
+analyze_result({edoc, Value}, Args, Analysis) ->
+ {Args, Analysis#analysis{edoc = Value}};
+analyze_result({io, Val}, Args, Analysis) ->
+ {Args, Analysis#analysis{io = Val}};
+%% Get useful information for actual analysis
+analyze_result({mode, Mode}, Args, Analysis) ->
+ {Args, Analysis#analysis{mode = Mode}};
+analyze_result({macros, Macros}, Args, Analysis) ->
+ {Args, Analysis#analysis{macros = Macros}};
+analyze_result({includes, Includes}, Args, Analysis) ->
+ {Args, Analysis#analysis{includes = Includes}};
+analyze_result({plt, Plt}, Args, Analysis) ->
+ {Args, Analysis#analysis{plt = Plt}};
+analyze_result({show_succ, Value}, Args, Analysis) ->
+ {Args, Analysis#analysis{show_succ = Value}};
+analyze_result({no_spec, Value}, Args, Analysis) ->
+ {Args, Analysis#analysis{no_spec = Value}}.
+
+%%--------------------------------------------------------------------
+%% File processing.
+%%--------------------------------------------------------------------
+
+-spec get_all_files(args(), analysis()) -> [file:filename(), ...].
+
+get_all_files(#args{files = Fs, files_r = Ds}, Analysis) ->
+ case filter_fd(Fs, Ds, fun test_erl_file_exclude_ann/1, Analysis) of
+ [] ->
+ fatal_error("no file(s) to analyze", Analysis);
+ AllFiles ->
+ AllFiles
+ end.
+
+-spec test_erl_file_exclude_ann(file:filename()) -> boolean().
+
+test_erl_file_exclude_ann(File) ->
+ case is_erl_file(File) of
+ true -> %% Exclude files ending with ".ann.erl"
+ case re:run(File, "[\.]ann[\.]erl$", [unicode]) of
+ {match, _} -> false;
+ nomatch -> true
+ end;
+ false -> false
+ end.
+
+-spec is_erl_file(file:filename()) -> boolean().
+
+is_erl_file(File) ->
+ filename:extension(File) =:= ".erl".
+
+-type test_file_fun() :: fun((file:filename()) -> boolean()).
+
+-spec filter_fd(files(), files(), test_file_fun(), analysis()) -> files().
+
+filter_fd(File_Dir, Dir_R, Fun, Analysis) ->
+ All_File_1 = process_file_and_dir(File_Dir, Fun, Analysis),
+ All_File_2 = process_dir_rec(Dir_R, Fun, Analysis),
+ remove_dup(All_File_1 ++ All_File_2).
+
+-spec process_file_and_dir(files(), test_file_fun(), analysis()) -> files().
+
+process_file_and_dir(File_Dir, TestFun, Analysis) ->
+ Fun =
+ fun (Elem, Acc) ->
+ case filelib:is_regular(Elem) of
+ true -> process_file(Elem, TestFun, Acc);
+ false -> check_dir(Elem, false, Acc, TestFun, Analysis)
+ end
+ end,
+ lists:foldl(Fun, [], File_Dir).
+
+-spec process_dir_rec(files(), test_file_fun(), analysis()) -> files().
+
+process_dir_rec(Dirs, TestFun, Analysis) ->
+ Fun = fun (Dir, Acc) -> check_dir(Dir, true, Acc, TestFun, Analysis) end,
+ lists:foldl(Fun, [], Dirs).
+
+-spec check_dir(file:filename(), boolean(), files(), test_file_fun(), analysis()) -> files().
+
+check_dir(Dir, Recursive, Acc, Fun, Analysis) ->
+ case file:list_dir(Dir) of
+ {ok, Files} ->
+ {TmpDirs, TmpFiles} = split_dirs_and_files(Files, Dir),
+ case Recursive of
+ false ->
+ FinalFiles = process_file_and_dir(TmpFiles, Fun, Analysis),
+ Acc ++ FinalFiles;
+ true ->
+ TmpAcc1 = process_file_and_dir(TmpFiles, Fun, Analysis),
+ TmpAcc2 = process_dir_rec(TmpDirs, Fun, Analysis),
+ Acc ++ TmpAcc1 ++ TmpAcc2
+ end;
+ {error, eacces} ->
+ fatal_error("no access permission to dir \""++Dir++"\"", Analysis);
+ {error, enoent} ->
+ fatal_error("cannot access "++Dir++": No such file or directory", Analysis);
+ {error, _Reason} ->
+ fatal_error("error involving a use of file:list_dir/1", Analysis)
+ end.
+
+%% Same order as the input list
+-spec process_file(file:filename(), test_file_fun(), files()) -> files().
+
+process_file(File, TestFun, Acc) ->
+ case TestFun(File) of
+ true -> Acc ++ [File];
+ false -> Acc
+ end.
+
+%% Same order as the input list
+-spec split_dirs_and_files(files(), file:filename()) -> {files(), files()}.
+
+split_dirs_and_files(Elems, Dir) ->
+ Test_Fun =
+ fun (Elem, {DirAcc, FileAcc}) ->
+ File = filename:join(Dir, Elem),
+ case filelib:is_regular(File) of
+ false -> {[File|DirAcc], FileAcc};
+ true -> {DirAcc, [File|FileAcc]}
+ end
+ end,
+ {Dirs, Files} = lists:foldl(Test_Fun, {[], []}, Elems),
+ {lists:reverse(Dirs), lists:reverse(Files)}.
+
+%% Removes duplicate filenames but keeps the order of the input list
+-spec remove_dup(files()) -> files().
+
+remove_dup(Files) ->
+ Test_Dup = fun (File, Acc) ->
+ case lists:member(File, Acc) of
+ true -> Acc;
+ false -> [File|Acc]
+ end
+ end,
+ Reversed_Elems = lists:foldl(Test_Dup, [], Files),
+ lists:reverse(Reversed_Elems).
+
+%%--------------------------------------------------------------------
+%% Collect information.
+%%--------------------------------------------------------------------
+
+-type inc_file_info() :: {file:filename(), func_info()}.
+
+-record(tmpAcc, {file :: file:filename(),
+ module :: atom(),
+ funcAcc = [] :: [func_info()],
+ incFuncAcc = [] :: [inc_file_info()],
+ dialyzerObj = [] :: [{mfa(), {_, _}}]}).
+
+-spec collect_info(analysis()) -> analysis().
+
+collect_info(Analysis) ->
+ NewPlt =
+ try get_dialyzer_plt(Analysis) of
+ DialyzerPlt ->
+ dialyzer_plt:merge_plts([Analysis#analysis.trust_plt, DialyzerPlt])
+ catch
+ throw:{dialyzer_error,_Reason} ->
+ fatal_error("Dialyzer's PLT is missing or is not up-to-date; please (re)create it",
+ Analysis)
+ end,
+ NewAnalysis = lists:foldl(fun collect_one_file_info/2,
+ Analysis#analysis{trust_plt = NewPlt},
+ Analysis#analysis.files),
+ %% Process Remote Types
+ TmpCServer = NewAnalysis#analysis.codeserver,
+ NewCServer =
+ try
+ TmpCServer1 = dialyzer_utils:merge_types(TmpCServer, NewPlt),
+ NewExpTypes = dialyzer_codeserver:get_temp_exported_types(TmpCServer),
+ OldExpTypes = dialyzer_plt:get_exported_types(NewPlt),
+ MergedExpTypes = sets:union(NewExpTypes, OldExpTypes),
+ TmpCServer2 =
+ dialyzer_codeserver:finalize_exported_types(MergedExpTypes, TmpCServer1),
+ TmpCServer3 = dialyzer_utils:process_record_remote_types(TmpCServer2),
+ dialyzer_contracts:process_contract_remote_types(TmpCServer3)
+ catch
+ throw:{error, ErrorMsg} ->
+ fatal_error(ErrorMsg, NewAnalysis)
+ end,
+ NewAnalysis#analysis{codeserver = NewCServer}.
+
+collect_one_file_info(File, Analysis) ->
+ Ds = [{d,Name,Val} || {Name,Val} <- Analysis#analysis.macros],
+ %% Current directory should also be included in "Includes".
+ Includes = [filename:dirname(File)|Analysis#analysis.includes],
+ Is = [{i,Dir} || Dir <- Includes],
+ Options = dialyzer_utils:src_compiler_opts() ++ Is ++ Ds,
+ case dialyzer_utils:get_core_from_src(File, Options) of
+ {error, Reason} ->
+ msg(debug, "File=~tp\n,Options=~p\n,Error=~p", [File, Options, Reason], Analysis),
+ compile_error(Reason, Analysis);
+ {ok, Core} ->
+ case dialyzer_utils:get_record_and_type_info(Core) of
+ {error, Reason} -> compile_error([Reason], Analysis);
+ {ok, Records} ->
+ Mod = cerl:concrete(cerl:module_name(Core)),
+ case dialyzer_utils:get_spec_info(Mod, Core, Records) of
+ {error, Reason} -> compile_error([Reason], Analysis);
+ {ok, SpecInfo, CbInfo} ->
+ ExpTypes = get_exported_types_from_core(Core),
+ analyze_core_tree(Core, Records, SpecInfo, CbInfo,
+ ExpTypes, Analysis, File)
+ end
+ end
+ end.
+
+analyze_core_tree(Core, Records, SpecInfo, CbInfo, ExpTypes, Analysis, File) ->
+ Module = cerl:concrete(cerl:module_name(Core)),
+ TmpTree = cerl:from_records(Core),
+ CS1 = Analysis#analysis.codeserver,
+ NextLabel = dialyzer_codeserver:get_next_core_label(CS1),
+ {Tree, NewLabel} = cerl_trees:label(TmpTree, NextLabel),
+ CS2 = dialyzer_codeserver:insert(Module, Tree, CS1),
+ CS3 = dialyzer_codeserver:set_next_core_label(NewLabel, CS2),
+ CS4 = dialyzer_codeserver:store_temp_records(Module, Records, CS3),
+ CS5 =
+ case Analysis#analysis.no_spec of
+ true -> CS4;
+ false ->
+ dialyzer_codeserver:store_temp_contracts(Module, SpecInfo, CbInfo, CS4)
+ end,
+ OldExpTypes = dialyzer_codeserver:get_temp_exported_types(CS5),
+ MergedExpTypes = sets:union(ExpTypes, OldExpTypes),
+ CS6 = dialyzer_codeserver:insert_temp_exported_types(MergedExpTypes, CS5),
+ Ex_Funcs = [{0,F,A} || {_,_,{F,A}} <- cerl:module_exports(Tree)],
+ CG = Analysis#analysis.callgraph,
+ {V, E} = dialyzer_callgraph:scan_core_tree(Tree, CG),
+ dialyzer_callgraph:add_edges(E, V, CG),
+ Fun = fun analyze_one_function/2,
+ All_Defs = cerl:module_defs(Tree),
+ Acc = lists:foldl(Fun, #tmpAcc{file = File, module = Module}, All_Defs),
+ Exported_FuncMap = map__insert({File, Ex_Funcs}, Analysis#analysis.ex_func),
+ %% we must sort all functions in the file which
+ %% originate from this file by *numerical order* of lineNo
+ Sorted_Functions = lists:keysort(1, Acc#tmpAcc.funcAcc),
+ FuncMap = map__insert({File, Sorted_Functions}, Analysis#analysis.func),
+ %% we do not need to sort functions which are imported from included files
+ IncFuncMap = map__insert({File, Acc#tmpAcc.incFuncAcc},
+ Analysis#analysis.inc_func),
+ FMs = Analysis#analysis.fms ++ [{File, Module}],
+ RecordMap = map__insert({File, Records}, Analysis#analysis.record),
+ Analysis#analysis{fms = FMs,
+ callgraph = CG,
+ codeserver = CS6,
+ ex_func = Exported_FuncMap,
+ inc_func = IncFuncMap,
+ record = RecordMap,
+ func = FuncMap}.
+
+analyze_one_function({Var, FunBody} = Function, Acc) ->
+ F = cerl:fname_id(Var),
+ A = cerl:fname_arity(Var),
+ TmpDialyzerObj = {{Acc#tmpAcc.module, F, A}, Function},
+ NewDialyzerObj = Acc#tmpAcc.dialyzerObj ++ [TmpDialyzerObj],
+ Anno = cerl:get_ann(FunBody),
+ LineNo = get_line(Anno),
+ FileName = get_file(Anno),
+ BaseName = filename:basename(FileName),
+ FuncInfo = {LineNo, F, A},
+ OriginalName = Acc#tmpAcc.file,
+ {FuncAcc, IncFuncAcc} =
+ case (FileName =:= OriginalName) orelse (BaseName =:= OriginalName) of
+ true -> %% Coming from original file
+ {Acc#tmpAcc.funcAcc ++ [FuncInfo], Acc#tmpAcc.incFuncAcc};
+ false ->
+ %% Coming from other sourses, including:
+ %% -- .yrl (yecc-generated file)
+ %% -- yeccpre.hrl (yecc-generated file)
+ %% -- other cases
+ {Acc#tmpAcc.funcAcc, Acc#tmpAcc.incFuncAcc ++ [{FileName, FuncInfo}]}
+ end,
+ Acc#tmpAcc{funcAcc = FuncAcc,
+ incFuncAcc = IncFuncAcc,
+ dialyzerObj = NewDialyzerObj}.
+
+get_line([Line|_]) when is_integer(Line) -> Line;
+get_line([{Line, _Column} | _Tail]) when is_integer(Line) -> Line;
+get_line([_|Tail]) -> get_line(Tail);
+get_line([]) -> -1.
+
+get_file([{file,File}|_]) -> File;
+get_file([_|T]) -> get_file(T);
+get_file([]) -> "no_file". % should not happen
+
+-spec get_dialyzer_plt(analysis()) -> plt().
+
+get_dialyzer_plt(#analysis{plt = PltFile0}) ->
+ PltFile =
+ case PltFile0 =:= none of
+ true -> dialyzer_plt:get_default_plt();
+ false -> PltFile0
+ end,
+ dialyzer_plt:from_file(PltFile).
+
+%% Exported Types
+
+get_exported_types_from_core(Core) ->
+ Attrs = cerl:module_attrs(Core),
+ ExpTypes1 = [cerl:concrete(L2) || {L1, L2} <- Attrs,
+ cerl:is_literal(L1),
+ cerl:is_literal(L2),
+ cerl:concrete(L1) =:= 'export_type'],
+ ExpTypes2 = lists:flatten(ExpTypes1),
+ M = cerl:atom_val(cerl:module_name(Core)),
+ sets:from_list([{M, F, A} || {F, A} <- ExpTypes2]).
+
+%%--------------------------------------------------------------------
+%% Utilities for error reporting.
+%%--------------------------------------------------------------------
+
+-spec default_io() -> io().
+
+default_io() ->
+ #{debug => fun swallow_output/2,
+ info => fun format/2,
+ warn => fun format_on_stderr/2,
+ abort => fun format_and_halt/2}.
+
+-spec fatal_error(string(), analysis()) -> no_return().
+
+fatal_error(Slogan, Analysis) ->
+ msg(abort, "typer: ~ts", [Slogan], Analysis).
+
+-spec compile_error([string()], analysis()) -> no_return().
+
+compile_error(Reason, Analysis) ->
+ JoinedString = lists:flatten([X ++ "\n" || X <- Reason]),
+ Msg = "Analysis failed with error report:\n" ++ JoinedString,
+ fatal_error(Msg, Analysis).
+
+-spec msg(debug | info | warn | abort, io:format(), [term()], analysis()) -> _.
+
+msg(Level, Format, Data, #analysis{io = Io}) ->
+ Printer = maps:get(Level, Io, fun swallow_output/2),
+ Printer(Format, Data).
+
+-spec format(io:format(), [term()]) -> ok.
+
+format(Format, Data) ->
+ io:format(Format ++ "\n", Data).
+
+-spec swallow_output(io:format(), [term()]) -> ok.
+
+swallow_output(_Format, _Data) ->
+ ok.
+
+-spec format_on_stderr(io:format(), [term()]) -> ok.
+
+format_on_stderr(Format, Data) ->
+ io:format(standard_error, Format ++ "\n", Data).
+
+-spec format_and_halt(io:format(), [term()]) -> no_return().
+
+format_and_halt(Format, Data) ->
+ format_on_stderr(Format, Data),
+ erlang:halt(1).
+
+%%--------------------------------------------------------------------
+%% Handle messages.
+%%--------------------------------------------------------------------
+
+rcv_ext_types() ->
+ Self = self(),
+ Self ! {Self, done},
+ rcv_ext_types(Self, []).
+
+rcv_ext_types(Self, ExtTypes) ->
+ receive
+ {Self, ext_types, ExtType} ->
+ rcv_ext_types(Self, [ExtType|ExtTypes]);
+ {Self, done} ->
+ lists:usort(ExtTypes)
+ end.
+
+%%--------------------------------------------------------------------
+%% A convenient abstraction of a Key-Value mapping data structure
+%% specialized for the uses in this module
+%%--------------------------------------------------------------------
+
+-type map_dict() :: dict:dict().
+
+-spec map__new() -> map_dict().
+map__new() ->
+ dict:new().
+
+-spec map__insert({term(), term()}, map_dict()) -> map_dict().
+map__insert(Object, Map) ->
+ {Key, Value} = Object,
+ dict:store(Key, Value, Map).
+
+-spec map__lookup(term(), map_dict()) -> term().
+map__lookup(Key, Map) ->
+ try dict:fetch(Key, Map) catch error:_ -> none end.
+
+-spec map__from_list([{fa(), term()}]) -> map_dict().
+map__from_list(List) ->
+ dict:from_list(List).
+
+-spec map__remove(term(), map_dict()) -> map_dict().
+map__remove(Key, Dict) ->
+ dict:erase(Key, Dict).
+
+-spec map__fold(fun((term(), term(), term()) -> map_dict()), map_dict(), map_dict()) -> map_dict().
+map__fold(Fun, Acc0, Dict) ->
+ dict:fold(Fun, Acc0, Dict).
diff --git a/lib/dialyzer/test/Makefile b/lib/dialyzer/test/Makefile
index d5e975453f..7308c20400 100644
--- a/lib/dialyzer/test/Makefile
+++ b/lib/dialyzer/test/Makefile
@@ -12,6 +12,7 @@ AUXILIARY_FILES=\
dialyzer_common.erl\
file_utils.erl\
dialyzer_SUITE.erl\
+ dialyzer_cl_SUITE.erl\
abstract_SUITE.erl\
plt_SUITE.erl\
typer_SUITE.erl\
@@ -33,7 +34,7 @@ release_tests_spec:
$(INSTALL_DIR) "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
$(INSTALL_DATA) $(AUXILIARY_FILES) "$(RELSYSDIR)"
- @tar cf - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -)
+ @tar cf - *_SUITE_data property_test | (cd "$(RELSYSDIR)"; tar xf -)
cd "$(RELSYSDIR)";\
erlc dialyzer_common.erl file_utils.erl;\
erl -noshell -run dialyzer_common create_all_suites -s erlang halt
diff --git a/lib/dialyzer/test/behaviour_SUITE_data/results/gen_server_incorrect_args b/lib/dialyzer/test/behaviour_SUITE_data/results/gen_server_incorrect_args
index 69c2186481..a1412f29e6 100644
--- a/lib/dialyzer/test/behaviour_SUITE_data/results/gen_server_incorrect_args
+++ b/lib/dialyzer/test/behaviour_SUITE_data/results/gen_server_incorrect_args
@@ -2,4 +2,4 @@
gen_server_incorrect_args.erl:3:2: Undefined callback function handle_cast/2 (behaviour gen_server)
gen_server_incorrect_args.erl:3:2: Undefined callback function init/1 (behaviour gen_server)
gen_server_incorrect_args.erl:7:1: The inferred return type of handle_call/3 ({'no'} | {'ok'}) has nothing in common with {'noreply',_} | {'noreply',_,'hibernate' | 'infinity' | non_neg_integer() | {'continue',_}} | {'reply',_,_} | {'stop',_,_} | {'reply',_,_,'hibernate' | 'infinity' | non_neg_integer() | {'continue',_}} | {'stop',_,_,_}, which is the expected return type for the callback of the gen_server behaviour
-gen_server_incorrect_args.erl:7:1: The inferred type for the 2nd argument of handle_call/3 ('boo' | 'foo') is not a supertype of {pid(),_}, which is expected type for this argument in the callback of the gen_server behaviour
+gen_server_incorrect_args.erl:7:1: The inferred type for the 2nd argument of handle_call/3 ('boo' | 'foo') is not a supertype of {pid(),gen_server:reply_tag()}, which is expected type for this argument in the callback of the gen_server behaviour
diff --git a/lib/dialyzer/test/dialyzer.spec b/lib/dialyzer/test/dialyzer.spec
index 0ba5df5d1e..6551910461 100644
--- a/lib/dialyzer/test/dialyzer.spec
+++ b/lib/dialyzer/test/dialyzer.spec
@@ -1,5 +1 @@
-{alias, tests, "../dialyzer_test"}.
-
-{suites, tests, all}.
-
-{skip_cases, tests, small_SUITE, "Needs compiler in plt"}.
+{suites, "../dialyzer_test", all}.
diff --git a/lib/dialyzer/test/dialyzer_SUITE.erl b/lib/dialyzer/test/dialyzer_SUITE.erl
index 0676e6c599..59e8b5a101 100644
--- a/lib/dialyzer/test/dialyzer_SUITE.erl
+++ b/lib/dialyzer/test/dialyzer_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2015-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2015-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,7 +55,7 @@ end_per_group(_GroupName, Config) ->
init_per_testcase(_Case, Config) ->
- ?line Dog=test_server:timetrap(?default_timeout),
+ Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
end_per_testcase(_Case, Config) ->
Dog=?config(watchdog, Config),
@@ -71,7 +71,7 @@ app_test(doc) ->
app_test(suite) ->
[];
app_test(Config) when is_list(Config) ->
- ?line test_server:app_test(dialyzer).
+ test_server:app_test(dialyzer).
%% Test that the .appup file does not contain any `basic' errors
appup_test(Config) when is_list(Config) ->
diff --git a/lib/dialyzer/test/dialyzer_cl_SUITE.erl b/lib/dialyzer/test/dialyzer_cl_SUITE.erl
new file mode 100644
index 0000000000..ed84fc6068
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer_cl_SUITE.erl
@@ -0,0 +1,129 @@
+-module(dialyzer_cl_SUITE).
+
+-include_lib("common_test/include/ct.hrl").
+-include_lib("stdlib/include/assert.hrl").
+-include_lib("dialyzer/src/dialyzer.hrl").
+
+%% Test server specific exports
+-export([all/0, suite/0, init_per_suite/1, end_per_suite/1]).
+
+%% Test cases must be exported.
+-export([
+ unknown_function_warning_includes_callsite/1,
+ call_to_missing_warning_includes_callsite/1
+]).
+
+suite() -> [{timetrap, {minutes, 1}}].
+
+all() ->
+ [
+ unknown_function_warning_includes_callsite,
+ call_to_missing_warning_includes_callsite
+ ].
+
+init_per_suite(Config) ->
+ %% Prime PLT with common stuff so we don't get errors about get_module_info
+ %% being unknown, etc.
+ PrivDir = proplists:get_value(priv_dir,Config),
+ PltBase = plt_base_file(PrivDir),
+ _ = dialyzer:run([{analysis_type, plt_build},
+ {apps, [erts]},
+ {output_plt, PltBase}]),
+ Config.
+
+end_per_suite(Config) ->
+ Config.
+
+plt_base_file(PrivDir) ->
+ filename:join(PrivDir, "dialyzer_cl_base.plt").
+
+%%%
+%%% Test cases starts here.
+%%%
+
+%% Test running Dialyzer programatically can yield call to missing
+%% errors with information on both the callsite and the unknown call
+%% itself.
+%% Missing function logic is tested elsewhere, but here we're specifically
+%% interested in the details of the error that are accessible from the
+%% dialyzer_cl API
+call_to_missing_warning_includes_callsite(Config) when is_list(Config) ->
+
+ PrivDir = proplists:get_value(priv_dir,Config),
+ PltBase = plt_base_file(PrivDir),
+ Plt = filename:join(PrivDir, "previously_defined.plt"),
+
+ {ok, BeamFileForPlt} = compile(Config, previously_defined, []),
+ [] = dialyzer:run([{analysis_type, plt_build},
+ {files, [BeamFileForPlt]},
+ {output_plt, Plt}]),
+
+ {ok, Beam} = compile(Config, call_to_missing_example, []),
+ Opts =
+ #options{
+ analysis_type = succ_typings,
+ init_plts = [Plt, PltBase],
+ output_file = none,
+ get_warnings = true,
+ legal_warnings = ordsets:from_list([warn_unknown, warn_callgraph]),
+ erlang_mode = true,
+ files = [Beam]
+ },
+ Res = dialyzer_cl:start(Opts),
+
+ ?assertMatch(
+ {2, [
+ {warn_callgraph, {_Filename, {5, 5}}, {
+ call_to_missing, [
+ previously_defined, function, 0
+ ]
+ }}
+ ]},
+ Res),
+
+ ok.
+
+%% Test running Dialyzer programatically can yield unknown function
+%% errors with information on both the callsite and the unknown call
+%% itself.
+%% Missing function logic is tested elsewhere, but here we're specifically
+%% interested in the details of the error that are accessible from the
+%% dialyzer_cl API
+unknown_function_warning_includes_callsite(Config) when is_list(Config) ->
+
+ PrivDir = proplists:get_value(priv_dir,Config),
+ PltBase = plt_base_file(PrivDir),
+
+ {ok, Beam} = compile(Config, unknown_function_example, []),
+ Opts =
+ #options{
+ analysis_type = succ_typings,
+ init_plts = [PltBase],
+ output_file = none,
+ get_warnings = true,
+ legal_warnings = ordsets:from_list([warn_unknown, warn_callgraph]),
+ erlang_mode = true,
+ files = [Beam]
+ },
+ Res = dialyzer_cl:start(Opts),
+
+ ?assertMatch(
+ {2, [
+ {warn_unknown, {_Filename, {5,5}},
+ {unknown_function, {
+ does_not_exist, function, 0
+ }}
+ }
+ ]},
+ Res),
+
+ ok.
+
+compile(Config, Module, CompileOpts) ->
+ Source = lists:concat([Module, ".erl"]),
+ PrivDir = proplists:get_value(priv_dir,Config),
+ DataDir = proplists:get_value(data_dir,Config),
+ SrcFilename = filename:join([DataDir, Source]),
+ Opts = [{outdir, PrivDir}, debug_info | CompileOpts],
+ {ok, Module} = compile:file(SrcFilename, Opts),
+ {ok, filename:join([PrivDir, lists:concat([Module, ".beam"])])}.
diff --git a/lib/dialyzer/test/dialyzer_cl_SUITE_data/call_to_missing_example.erl b/lib/dialyzer/test/dialyzer_cl_SUITE_data/call_to_missing_example.erl
new file mode 100644
index 0000000000..96670f1221
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer_cl_SUITE_data/call_to_missing_example.erl
@@ -0,0 +1,5 @@
+-module(call_to_missing_example).
+-export([call_to_missing_test/0]).
+
+call_to_missing_test() ->
+ previously_defined:function().
diff --git a/lib/dialyzer/test/dialyzer_cl_SUITE_data/previously_defined.erl b/lib/dialyzer/test/dialyzer_cl_SUITE_data/previously_defined.erl
new file mode 100644
index 0000000000..5b03eb2b7c
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer_cl_SUITE_data/previously_defined.erl
@@ -0,0 +1,5 @@
+-module(previously_defined).
+
+-export([do_thing/0]).
+
+do_thing() -> ok.
diff --git a/lib/dialyzer/test/dialyzer_cl_SUITE_data/unknown_function_example.erl b/lib/dialyzer/test/dialyzer_cl_SUITE_data/unknown_function_example.erl
new file mode 100644
index 0000000000..c9a93010c8
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer_cl_SUITE_data/unknown_function_example.erl
@@ -0,0 +1,5 @@
+-module(unknown_function_example).
+-export([unknown_function_test/0]).
+
+unknown_function_test() ->
+ does_not_exist:function().
diff --git a/lib/dialyzer/test/dialyzer_common.erl b/lib/dialyzer/test/dialyzer_common.erl
index 392c41306e..3b39cf99ab 100644
--- a/lib/dialyzer/test/dialyzer_common.erl
+++ b/lib/dialyzer/test/dialyzer_common.erl
@@ -13,6 +13,7 @@
-define(suite_suffix, "_SUITE").
-define(data_folder, "_data").
+-define(excludes, ["dialyzer_cl", "plt"]). % _SUITE_data dirs that we shouldn't automatically make suites for
-define(suite_data, ?suite_suffix ++ ?data_folder).
-define(erlang_extension, ".erl").
-define(output_file_mode, write).
@@ -45,7 +46,7 @@ check_plt(OutDir) ->
{error, _ } ->
io:format("No plt found in test run directory!"),
PltLockFile = filename:join(OutDir, ?plt_lockfile),
- case file:read_file_info(PltLockFile) of
+ case file:read_file_info(PltLockFile) of
{ok, _} ->
explain_fail_with_lock(),
fail;
@@ -178,7 +179,7 @@ fix_options([{pa, Path} | Rest], Dir, Acc) ->
true -> fix_options(Rest, Dir, Acc);
{error, _} -> erlang:error("Bad directory for pa: " ++ Path)
end;
-fix_options([{DirOption, RelativeDirs} | Rest], Dir, Acc)
+fix_options([{DirOption, RelativeDirs} | Rest], Dir, Acc)
when DirOption =:= include_dirs ;
DirOption =:= files_rec ;
DirOption =:= files ->
@@ -215,15 +216,21 @@ get_suites(Dir) ->
{error, _} -> [];
{ok, Filenames} ->
FullFilenames = [filename:join(Dir, F) || F <-Filenames ],
- Dirs = [suffix(filename:basename(F), ?suite_data) ||
+ Dirs = [is_suite_data(filename:basename(F), ?suite_data) ||
F <- FullFilenames,
file_utils:file_type(F) =:= {ok, 'directory'}],
[S || {yes, S} <- Dirs]
end.
-suffix(String, Suffix) ->
+is_suite_data(String, Suffix) ->
case string:split(String, Suffix, trailing) of
- [Prefix,[]] -> {yes, Prefix};
+ [Prefix,[]] ->
+ case lists:member(Prefix, ?excludes) of
+ true ->
+ no;
+ false ->
+ {yes, Prefix}
+ end;
_ -> no
end.
diff --git a/lib/dialyzer/test/erl_types_SUITE.erl b/lib/dialyzer/test/erl_types_SUITE.erl
index bc735d3a60..5674ffd1cb 100644
--- a/lib/dialyzer/test/erl_types_SUITE.erl
+++ b/lib/dialyzer/test/erl_types_SUITE.erl
@@ -14,8 +14,11 @@
%%
-module(erl_types_SUITE).
--export([all/0,
- consistency_and_to_string/1, map_multiple_representations/1]).
+-export([all/0,groups/0,init_per_group/2,end_per_group/2,
+ consistency_and_to_string/1,misc/1,map_multiple_representations/1,
+ absorption/1,associativity/1,commutativity/1,idempotence/1,
+ identity/1,limit/1
+ ]).
%% Simplify calls into erl_types and avoid importing the entire module.
-define(M, erl_types).
@@ -23,7 +26,39 @@
-include_lib("common_test/include/ct.hrl").
all() ->
- [consistency_and_to_string, map_multiple_representations].
+ [consistency_and_to_string,
+ misc,
+ map_multiple_representations,
+ {group,property_tests}
+ ].
+
+groups() ->
+ [{property_tests,[parallel],
+ [absorption,
+ associativity,
+ commutativity,
+ idempotence,
+ identity,
+ limit]}].
+
+init_per_group(property_tests, Config0) ->
+ case ct_property_test:init_per_suite(Config0) of
+ [_|_]=Config ->
+ try proper_erlang_abstract_code:module() of
+ _ ->
+ Config
+ catch
+ error:undef ->
+ {skip, "No proper_erlang_abstract_code module"}
+ end;
+ Other ->
+ Other
+ end;
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
consistency_and_to_string(_Config) ->
%% Check consistency of types
@@ -196,6 +231,16 @@ consistency_and_to_string(_Config) ->
"{'false',_} | {'true',_}" = ?M:t_to_string(Union10),
"{'true',integer()}" = ?M:t_to_string(?M:t_inf(Union10, ?M:t_tuple([?M:t_atom(true), ?M:t_integer()]))).
+misc(_Config) ->
+ %% Miscellaneous cases which have been fixed.
+
+ %% Used to take "forever".
+ B1_1 = ?M:t_bitstr(6442450944, 1456),
+ B1_2 = ?M:t_bitstr(85, 7),
+ R1_R = ?M:t_bitstr(547608330240, 347892352432),
+ R1_R = ?M:t_inf(B1_1, B1_2),
+ ok.
+
%% OTP-17537.
map_multiple_representations(_Config) ->
DefV = erl_types:t_atom(),
@@ -311,3 +356,27 @@ map_multiple_representations(_Config) ->
"#{'a'=>atom(), 'b'=>atom()}" = erl_types:t_to_string(T)
end(),
ok.
+
+absorption(Config) ->
+ %% manual test: proper:quickcheck(erl_types_prop:absorption()).
+ true = ct_property_test:quickcheck(erl_types_prop:absorption(), Config).
+
+associativity(Config) ->
+ %% manual test: proper:quickcheck(erl_types_prop:associativity()).
+ true = ct_property_test:quickcheck(erl_types_prop:associativity(), Config).
+
+commutativity(Config) ->
+ %% manual test: proper:quickcheck(erl_types_prop:commutativity()).
+ true = ct_property_test:quickcheck(erl_types_prop:commutativity(), Config).
+
+idempotence(Config) ->
+ %% manual test: proper:quickcheck(erl_types_prop:idempotence()).
+ true = ct_property_test:quickcheck(erl_types_prop:idempotence(), Config).
+
+identity(Config) ->
+ %% manual test: proper:quickcheck(erl_types_prop:identity()).
+ true = ct_property_test:quickcheck(erl_types_prop:identity(), Config).
+
+limit(Config) ->
+ %% manual test: proper:quickcheck(erl_types_prop:limit()).
+ true = ct_property_test:quickcheck(erl_types_prop:limit(), Config).
diff --git a/lib/dialyzer/test/indent_SUITE_data/dialyzer_options b/lib/dialyzer/test/indent_SUITE_data/dialyzer_options
index 7c088f9a65..3ff26b87db 100644
--- a/lib/dialyzer/test/indent_SUITE_data/dialyzer_options
+++ b/lib/dialyzer/test/indent_SUITE_data/dialyzer_options
@@ -1 +1 @@
-{dialyzer_options, [{warnings, [no_unused, no_return, race_conditions]}]}.
+{dialyzer_options, [{warnings, [no_unused, no_return]}]}.
diff --git a/lib/dialyzer/test/indent_SUITE_data/results/whereis_control_flow1 b/lib/dialyzer/test/indent_SUITE_data/results/whereis_control_flow1
deleted file mode 100644
index 1154cada8a..0000000000
--- a/lib/dialyzer/test/indent_SUITE_data/results/whereis_control_flow1
+++ /dev/null
@@ -1,4 +0,0 @@
-
-whereis_control_flow1.erl:13:18: The call erlang:register
- (AnAtom :: atom(),
- Pid :: pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow1.erl on line {8,8}
diff --git a/lib/dialyzer/test/indent_SUITE_data/src/whereis_control_flow1.erl b/lib/dialyzer/test/indent_SUITE_data/src/whereis_control_flow1.erl
deleted file mode 100644
index e65f6c3e23..0000000000
--- a/lib/dialyzer/test/indent_SUITE_data/src/whereis_control_flow1.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination. It takes into account control flow that might exist.
-
--module(whereis_control_flow1).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false -> register(AnAtom, Pid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/map_SUITE_data/results/opaque_key b/lib/dialyzer/test/map_SUITE_data/results/opaque_key
index b3a2d2b78c..b70157f1af 100644
--- a/lib/dialyzer/test/map_SUITE_data/results/opaque_key
+++ b/lib/dialyzer/test/map_SUITE_data/results/opaque_key
@@ -4,8 +4,8 @@ opaque_key_adt.erl:41:2: Invalid type specification for function opaque_key_adt:
opaque_key_adt.erl:44:2: Invalid type specification for function opaque_key_adt:s5/0. The success typing is () -> #{2:=3}
opaque_key_adt.erl:56:2: Invalid type specification for function opaque_key_adt:smt1/0. The success typing is () -> #{3:='a'}
opaque_key_adt.erl:59:2: Invalid type specification for function opaque_key_adt:smt2/0. The success typing is () -> #{1:='a'}
-opaque_key_use.erl:13:5: The test opaque_key_use:t() =:= opaque_key_use:t(integer()) can never evaluate to 'true'
-opaque_key_use.erl:24:5: Attempt to test for equality between a term of type opaque_key_adt:t(integer()) and a term of opaque type opaque_key_adt:t()
+opaque_key_use.erl:13:5: The test opaque_key_use:t() =:= opaque_key_use:t(_) can never evaluate to 'true'
+opaque_key_use.erl:24:5: Attempt to test for equality between a term of type opaque_key_adt:t(_) and a term of opaque type opaque_key_adt:t()
opaque_key_use.erl:37:1: Function adt_mm1/0 has no local return
opaque_key_use.erl:40:5: The attempt to match a term of type opaque_key_adt:m() against the pattern #{A:=R} breaks the opacity of the term
opaque_key_use.erl:48:1: Function adt_mu1/0 has no local return
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/para b/lib/dialyzer/test/opaque_SUITE_data/results/para
index d0ddab7b66..0ba2a24996 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/para
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/para
@@ -1,34 +1,24 @@
-para1.erl:18:5: The test para1:t(atom()) =:= para1:t(integer()) can never evaluate to 'true'
-para1.erl:23:5: The test para1:t(atom()) =:= para1:t() can never evaluate to 'true'
-para1.erl:28:5: The test para1:t() =:= para1:t(integer()) can never evaluate to 'true'
+para1.erl:18:5: The test para1:t(_) =:= para1:t(_) can never evaluate to 'true'
+para1.erl:23:5: The test para1:t(_) =:= para1:t() can never evaluate to 'true'
+para1.erl:28:5: The test para1:t() =:= para1:t(_) can never evaluate to 'true'
para1.erl:33:5: The test {3,2} =:= {'a','b'} can never evaluate to 'true'
-para1.erl:38:5: Attempt to test for equality between a term of type para1_adt:t(integer()) and a term of opaque type para1_adt:t(atom())
-para1.erl:43:5: Attempt to test for equality between a term of type para1_adt:t() and a term of opaque type para1_adt:t(atom())
-para1.erl:48:5: Attempt to test for equality between a term of type para1_adt:t(integer()) and a term of opaque type para1_adt:t()
+para1.erl:38:5: The test para1_adt:t(_) =:= para1_adt:t(_) can never evaluate to 'true'
+para1.erl:43:5: Attempt to test for equality between a term of type para1_adt:t() and a term of opaque type para1_adt:t(_)
+para1.erl:48:5: Attempt to test for equality between a term of type para1_adt:t(_) and a term of opaque type para1_adt:t()
para1.erl:53:5: The test {3,2} =:= {'a','b'} can never evaluate to 'true'
-para2.erl:103:5: Attempt to test for equality between a term of type para2_adt:circ(integer(),integer()) and a term of opaque type para2_adt:circ(integer())
-para2.erl:117:5: Attempt to test for equality between a term of type para2_adt:un(atom(),integer()) and a term of opaque type para2_adt:un(integer(),atom())
+para2.erl:103:5: Attempt to test for equality between a term of type para2_adt:circ(_,_) and a term of opaque type para2_adt:circ(_)
para2.erl:31:5: The test 'a' =:= 'b' can never evaluate to 'true'
para2.erl:61:5: Attempt to test for equality between a term of type para2_adt:c2() and a term of opaque type para2_adt:c1()
para2.erl:66:5: The test 'a' =:= 'b' can never evaluate to 'true'
-para2.erl:88:5: The test para2:circ(integer()) =:= para2:circ(integer(),integer()) can never evaluate to 'true'
+para2.erl:88:5: The test para2:circ(_) =:= para2:circ(_,_) can never evaluate to 'true'
para3.erl:28:2: Invalid type specification for function para3:ot2/0. The success typing is () -> 'foo'
para3.erl:36:5: The pattern {{{17}}} can never match the type {{{{{{_,_,_,_,_}}}}}}
para3.erl:55:2: Invalid type specification for function para3:t2/0. The success typing is () -> 'foo'
para3.erl:65:5: The attempt to match a term of type {{{{{para3_adt:ot1(_,_,_,_,_)}}}}} against the pattern {{{{{17}}}}} breaks the opacity of para3_adt:ot1(_,_,_,_,_)
para3.erl:68:5: The pattern {{{{17}}}} can never match the type {{{{{para3_adt:ot1(_,_,_,_,_)}}}}}
-para3.erl:74:2: The specification for para3:exp_adt/0 has an opaque subtype para3_adt:exp1(para3_adt:exp2()) which is violated by the success typing () -> 3
-para4.erl:21:2: Invalid type specification for function para4:a/1. The success typing is (para4:d_all() | para4:d_atom()) -> [{atom() | integer(),atom() | integer()}]
-para4.erl:26:2: Invalid type specification for function para4:i/1. The success typing is (para4:d_all() | para4:d_integer()) -> [{atom() | integer(),atom() | integer()}]
+para3.erl:74:2: The specification for para3:exp_adt/0 has an opaque subtype para3_adt:exp1(_) which is violated by the success typing () -> 3
para4.erl:31:2: Invalid type specification for function para4:t/1. The success typing is (para4:d_all() | para4:d_tuple()) -> [{atom() | integer(),atom() | integer()}]
-para4.erl:59:5: Attempt to test for equality between a term of type para4_adt:t(atom() | integer()) and a term of opaque type para4_adt:t(integer())
-para4.erl:64:5: Attempt to test for equality between a term of type para4_adt:t(atom() | integer()) and a term of opaque type para4_adt:t(atom())
-para4.erl:69:5: Attempt to test for equality between a term of type para4_adt:int(1 | 2 | 3 | 4) and a term of opaque type para4_adt:int(1 | 2)
-para4.erl:74:5: Attempt to test for equality between a term of type para4_adt:int(2 | 3 | 4) and a term of opaque type para4_adt:int(1 | 2)
-para4.erl:79:5: Attempt to test for equality between a term of type para4_adt:int(2 | 3 | 4) and a term of opaque type para4_adt:int(5 | 6 | 7)
-para4.erl:84:5: Attempt to test for equality between a term of type para4_adt:un(3 | 4) and a term of opaque type para4_adt:un(1 | 2)
-para4.erl:89:5: Attempt to test for equality between a term of type para4_adt:tup({_,_}) and a term of opaque type para4_adt:tup(tuple())
-para4.erl:94:5: Attempt to test for equality between a term of type para4_adt:t(#{1=>'a'}) and a term of opaque type para4_adt:t(#{2=>'b'})
-para5.erl:13:5: Attempt to test for inequality between a term of type para5_adt:dd(atom()) and a term of opaque type para5_adt:d()
+para4.erl:79:5: The test para4_adt:int(_) =:= para4_adt:int(_) can never evaluate to 'true'
+para5.erl:13:5: Attempt to test for inequality between a term of type para5_adt:dd(_) and a term of opaque type para5_adt:d()
para5.erl:8:5: The test para5_adt:d() =:= para5_adt:d() can never evaluate to 'true'
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/big_external_type.erl b/lib/dialyzer/test/opaque_SUITE_data/src/big_external_type.erl
index d286a378ed..a01e20710a 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/src/big_external_type.erl
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/big_external_type.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2015. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -409,7 +409,7 @@ normalise({bin,_,Fs}) ->
eval_bits:expr_grp(Fs, [],
fun(E, _) ->
{value, normalise(E), []}
- end, [], true),
+ end),
B;
normalise({cons,_,Head,Tail}) ->
[normalise(Head)|normalise(Tail)];
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/big_local_type.erl b/lib/dialyzer/test/opaque_SUITE_data/src/big_local_type.erl
index 7daceb5260..78e069ab79 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/src/big_local_type.erl
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/big_local_type.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2015. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -406,7 +406,7 @@ normalise({bin,_,Fs}) ->
eval_bits:expr_grp(Fs, [],
fun(E, _) ->
{value, normalise(E), []}
- end, [], true),
+ end),
B;
normalise({cons,_,Head,Tail}) ->
[normalise(Head)|normalise(Tail)];
diff --git a/lib/dialyzer/test/plt_SUITE.erl b/lib/dialyzer/test/plt_SUITE.erl
index 800f1fd307..e1c5ecdd95 100644
--- a/lib/dialyzer/test/plt_SUITE.erl
+++ b/lib/dialyzer/test/plt_SUITE.erl
@@ -4,53 +4,139 @@
-module(plt_SUITE).
-include_lib("common_test/include/ct.hrl").
+-include_lib("stdlib/include/assert.hrl").
+-include_lib("dialyzer/src/dialyzer.hrl").
-include("dialyzer_test_constants.hrl").
--export([suite/0, all/0, build_plt/1, beam_tests/1, update_plt/1,
+-export([suite/0, all/0,
+ build_plt/1, beam_tests/1, update_plt/1,
local_fun_same_as_callback/1,
remove_plt/1, run_plt_check/1, run_succ_typings/1,
bad_dialyzer_attr/1, merge_plts/1, bad_record_type/1,
- letrec_rvals/1, missing_plt_file/1]).
+ letrec_rvals/1,
+ missing_plt_file/1,
+ build_xdg_plt/1,
+ mod_dep_from_behaviour/1,
+ mod_dep_from_record_definition_field_value_default_used/1,
+ mod_dep_from_record_definition_field_value_default_unused/1,
+ mod_dep_from_record_definition_field_type/1,
+ mod_dep_from_overloaded_callback/1,
+ mod_dep_from_exported_overloaded_fun_spec/1,
+ mod_dep_from_unexported_overloaded_fun_spec/1,
+ mod_dep_from_callback_constraint/1,
+ mod_dep_from_unexported_fun_spec_constraint/1,
+ mod_dep_from_exported_fun_spec_constraint/1,
+ mod_dep_from_exported_type/1,
+ mod_dep_from_callback_return/1,
+ mod_dep_from_callback_args/1,
+ mod_dep_from_unexported_opaque_type_args/1,
+ mod_dep_from_exported_opaque_type_args/1,
+ mod_dep_from_unexported_opaque_type/1,
+ mod_dep_from_exported_opaque_type/1,
+ mod_dep_from_unexported_type_args/1,
+ mod_dep_from_exported_type_args/1,
+ mod_dep_from_unexported_fun_spec_args/1,
+ mod_dep_from_exported_fun_spec_args/1,
+ mod_dep_from_unexported_fun_spec_return/1,
+ mod_dep_from_exported_fun_spec_return/1,
+ mod_dep_from_unexported_type/1
+ ]).
suite() ->
[{timetrap, ?plt_timeout}].
-all() -> [build_plt, beam_tests, update_plt, run_plt_check,
+all() -> [build_plt, build_xdg_plt, beam_tests, update_plt, run_plt_check,
remove_plt, run_succ_typings, local_fun_same_as_callback,
bad_dialyzer_attr, merge_plts, bad_record_type,
- letrec_rvals, missing_plt_file].
+ letrec_rvals,
+ missing_plt_file,
+ mod_dep_from_behaviour,
+ mod_dep_from_record_definition_field_value_default_used,
+ mod_dep_from_record_definition_field_value_default_unused,
+ mod_dep_from_record_definition_field_type,
+ mod_dep_from_overloaded_callback,
+ mod_dep_from_exported_overloaded_fun_spec,
+ mod_dep_from_unexported_overloaded_fun_spec,
+ mod_dep_from_callback_constraint,
+ mod_dep_from_unexported_fun_spec_constraint,
+ mod_dep_from_exported_fun_spec_constraint,
+ mod_dep_from_exported_type,
+ mod_dep_from_callback_return,
+ mod_dep_from_callback_args,
+ mod_dep_from_unexported_opaque_type_args,
+ mod_dep_from_exported_opaque_type_args,
+ mod_dep_from_unexported_opaque_type,
+ mod_dep_from_exported_opaque_type,
+ mod_dep_from_unexported_type_args,
+ mod_dep_from_exported_type_args,
+ mod_dep_from_unexported_fun_spec_args,
+ mod_dep_from_exported_fun_spec_args,
+ mod_dep_from_unexported_fun_spec_return,
+ mod_dep_from_exported_fun_spec_return,
+ mod_dep_from_unexported_type
+ ].
build_plt(Config) ->
- OutDir = ?config(priv_dir, Config),
+ OutDir = proplists:get_value(priv_dir, Config),
case dialyzer_common:check_plt(OutDir) of
ok -> ok;
fail -> ct:fail(plt_build_fail)
end.
+build_xdg_plt(Config) ->
+ TestHome = filename:join(?config(priv_dir, Config), ?FUNCTION_NAME),
+
+ %% We change the $HOME of the emulator to run this test
+ HomeEnv = case os:type() of
+ {win32, _} ->
+ [Drive | Path] = filename:split(TestHome),
+ [{"APPDATA", filename:join(TestHome,"AppData")},
+ {"HOMEDRIVE", Drive}, {"HOMEPATH", filename:join(Path)}];
+ _ ->
+ [{"HOME", TestHome}]
+ end,
+
+ {ok, Peer, Node} = ?CT_PEER(#{ env => HomeEnv }),
+
+ erpc:call(
+ Node,
+ fun() ->
+ ?assertMatch([], dialyzer:run(
+ [{analysis_type, plt_build},
+ {apps, [erts]}])),
+ ?assertMatch(
+ {ok,_}, file:read_file(
+ filename:join(
+ filename:basedir(user_cache, "erlang"),
+ ".dialyzer_plt")))
+ end),
+
+ peer:stop(Peer).
+
beam_tests(Config) when is_list(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Plt = filename:join(PrivDir, "beam_tests.plt"),
- Prog = <<"
- -module(no_auto_import).
+ Src = <<"
+ -module(no_auto_import).
- %% Copied from erl_lint_SUITE.erl, clash6
+ %% Copied from erl_lint_SUITE.erl, clash6
- -export([size/1]).
+ -export([size/1]).
- size([]) ->
- 0;
- size({N,_}) ->
- N;
- size([_|T]) ->
- 1+size(T).
- ">>,
+ size([]) ->
+ 0;
+ size({N,_}) ->
+ N;
+ size([_|T]) ->
+ 1+size(T).
+ ">>,
Opts = [no_auto_import],
- {ok, BeamFile} = compile(Config, Prog, no_auto_import, Opts),
+ {ok, BeamFile} = compile(Config, Src, no_auto_import, Opts),
[] = run_dialyzer(plt_build, [BeamFile], [{output_plt, Plt}]),
ok.
run_plt_check(Config) when is_list(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Plt = filename:join(PrivDir, "run_plt_check.plt"),
Mod1 = <<"
-module(run_plt_check1).
@@ -74,14 +160,14 @@ run_plt_check(Config) when is_list(Config) ->
{ok, BeamFile2} = compile(Config, Mod2B, run_plt_check2, []),
- % callgraph warning as run_plt_check2:call/1 makes a call to unexported
- % function run_plt_check1:call/1.
+ %% callgraph warning as run_plt_check2:call/1 makes a call to unexported
+ %% function run_plt_check1:call/1.
[_] = run_dialyzer(plt_check, [], [{init_plt, Plt}]),
ok.
run_succ_typings(Config) when is_list(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Plt = filename:join(PrivDir, "run_succ_typings.plt"),
Mod1A = <<"
-module(run_succ_typings1).
@@ -113,11 +199,11 @@ run_succ_typings(Config) when is_list(Config) ->
{ok, BeamFile1} = compile(Config, Mod1B, run_succ_typings1, []),
{ok, BeamFile2} = compile(Config, Mod2, run_succ_typings2, []),
- % contract types warning as run_succ_typings2:call/0 makes a call to
- % run_succ_typings1:call/0, which returns a (not b) in the PLT.
+ %% contract types warning as run_succ_typings2:call/0 makes a call to
+ %% run_succ_typings1:call/0, which returns a (not b) in the PLT.
[_] = run_dialyzer(succ_typings, [BeamFile2],
[{check_plt, false}, {init_plt, Plt}]),
- % warning not returned as run_succ_typings1 is updated in the PLT.
+ %% warning not returned as run_succ_typings1 is updated in the PLT.
[] = run_dialyzer(succ_typings, [BeamFile2],
[{check_plt, true}, {init_plt, Plt}]),
@@ -133,7 +219,7 @@ run_succ_typings(Config) when is_list(Config) ->
%%% contract types warning, might be emitted when the removed function
%%% nolonger exists.
update_plt(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Prog1 = <<"-module(plt_gc).
-export([one/0]).
one() ->
@@ -179,7 +265,7 @@ update_plt(Config) ->
%%% up the callback table. This bug was reported by Brujo Benavides.
local_fun_same_as_callback(Config) when is_list(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Prog1 =
<<"-module(bad_behaviour).
-callback bad() -> bad.
@@ -213,7 +299,7 @@ local_fun_same_as_callback(Config) when is_list(Config) ->
-export([bad/0]).
- %% @doc This function incorreclty implements bad_behaviour.
+ %% @doc This function incorrectly implements bad_behaviour.
bad() -> not_bad.">>,
{ok, TestBeam} = compile(Config, Prog2, bad_child, []),
@@ -231,7 +317,7 @@ local_fun_same_as_callback(Config) when is_list(Config) ->
%%% from a PLT when the beam file no longer exists. Dialyzer should not to
%%% check files exist on disk when removing from the PLT.
remove_plt(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Prog1 = <<"-module(m1).
-export([t/0]).
t() ->
@@ -269,7 +355,7 @@ remove_plt(Config) ->
%% needs to be updated when/if the Dialyzer can analyze Core Erlang
%% without compiling abstract code.
bad_dialyzer_attr(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Source = lists:concat([dial, ".erl"]),
Filename = filename:join(PrivDir, Source),
ok = dialyzer_common:check_plt(PrivDir),
@@ -346,7 +432,7 @@ types() ->
">>,
{Mod1, Mod2}.
-callbacks() -> % A very shallow test.
+callbacks() -> %% A very shallow test.
Mod1 = <<"-module(merge_plts_1).
-callback t() -> merge_plts_2:t().
">>,
@@ -357,7 +443,7 @@ callbacks() -> % A very shallow test.
{Mod1, Mod2}.
create_plts(Mod1, Mod2, Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Plt1 = filename:join(PrivDir, "merge_plts_1.plt"),
Plt2 = filename:join(PrivDir, "merge_plts_2.plt"),
ErlangBeam = erlang_beam(),
@@ -372,7 +458,7 @@ create_plts(Mod1, Mod2, Config) ->
%% End of merge_plts().
bad_record_type(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Source = lists:concat([bad_record_type, ".erl"]),
Filename = filename:join(PrivDir, Source),
PltFilename = dialyzer_common:plt_file(PrivDir),
@@ -398,7 +484,7 @@ bad_record_type(Config) ->
ok.
letrec_rvals(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
Plt = filename:join(PrivDir, "letrec_rvals.plt"),
Prog = <<"
-module(letrec_rvals).
@@ -433,7 +519,7 @@ check_done(_) ->
%% GH-4501
missing_plt_file(Config) ->
- PrivDir = ?config(priv_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
PltFile = filename:join(PrivDir, "missing_plt_file.plt"),
Prog2 = <<"-module(missing_plt_file2).
t() -> foo.">>,
@@ -485,10 +571,320 @@ succ(PltFile, BeamFile2) ->
{plts,[PltFile]},
{analysis_type, succ_typings}]).
-check(PltFile, BeamFile2) ->
+check(PltFile, _BeamFile2) ->
dialyzer:run([{plts,[PltFile]},
{analysis_type, plt_check}]).
+mod_dep_from_record_definition_field_value_default_unused(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -record(my_record,
+ { num_field = type_deps:get_num() :: number(),
+ str_field,
+ bool_field
+ }).
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, []}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_record_definition_field_value_default_used(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export([f/0]).
+
+ -record(my_record,
+ { num_field = type_deps:get_num() :: number(),
+ str_field,
+ bool_field
+ }).
+
+ f() -> #my_record{str_field = \"foo\", bool_field = true}. % type_deps:get_num() used implicitly here
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_behaviour(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -behaviour(type_deps).
+ -export([quux/1]).
+
+ quux(N) -> N + 1. % Depends on behaviour module to check the callback implementation
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_record_definition_field_type(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -record(my_record,
+ { num_field = 1 :: type_deps:number_like(),
+ str_field,
+ bool_field
+ }).
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_overloaded_callback(Config) ->
+ DependerSrc1 = <<"
+ -module(depender).
+
+ -callback f(string()) -> string()
+ ; (type_deps:number_like()) -> type_deps:number_like().
+ ">>,
+ DependerSrc2 = <<"
+ -module(depender).
+
+ -callback f(type_deps:number_like()) -> type_deps:number_like()
+ ; (string()) -> string().
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc1, ExpectedTypeDepsInPlt),
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc2, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_overloaded_fun_spec(Config) ->
+ DependerSrc1 = <<"
+ -module(depender).
+ -export([f/1]).
+
+ -spec f({a, atom()}) -> atom()
+ ; ({n, type_deps:number_like()}) -> type_deps:number_like().
+ f({a, X}) when is_atom(X) -> X;
+ f({n, X}) when is_number(X) -> X.
+ ">>,
+ DependerSrc2 = <<"
+ -module(depender).
+ -export([f/1]).
+
+ -spec f({n, type_deps:number_like()}) -> type_deps:number_like()
+ ; ({a, atom()}) -> atom().
+ f({n, X}) when is_number(X) -> X;
+ f({a, X}) when is_atom(X) -> X.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc1, ExpectedTypeDepsInPlt),
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc2, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_overloaded_fun_spec(Config) ->
+ DependerSrc1 = <<"
+ -module(depender).
+ -compile({nowarn_unused_function, [f/1]}).
+
+ -spec f({a, atom()}) -> atom()
+ ; ({n, type_deps:number_like()}) -> type_deps:number_like().
+ f({a, X}) when is_atom(X) -> X;
+ f({n, X}) when is_number(X) -> X.
+ ">>,
+ DependerSrc2 = <<"
+ -module(depender).
+ -compile({nowarn_unused_function, [f/1]}).
+
+ -spec f({n, type_deps:number_like()}) -> type_deps:number_like()
+ ; ({a, atom()}) -> atom().
+ f({n, X}) when is_number(X) -> X;
+ f({a, X}) when is_atom(X) -> X.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc1, ExpectedTypeDepsInPlt),
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc2, ExpectedTypeDepsInPlt).
+
+mod_dep_from_callback_constraint(Config) ->
+ DependerSrc1 = <<"
+ -module(depender).
+
+ -callback f(X) -> string() when X :: type_deps:number_like().
+ ">>,
+ DependerSrc2 = <<"
+ -module(depender).
+
+ -callback f(X :: type_deps:number_like()) -> string().
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc1, ExpectedTypeDepsInPlt),
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc2, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_fun_spec_constraint(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -compile({nowarn_unused_function, [f/1]}).
+
+ -spec f(N) -> number() when N :: type_deps:number_like().
+ f(N) -> N.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_fun_spec_constraint(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export([f/1]).
+
+ -spec f(N) -> number() when N :: type_deps:number_like().
+ f(N) -> N.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_callback_return(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -callback f(string()) -> type_deps:number_like().
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_callback_args(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -callback f(type_deps:number_like()) -> string().
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_opaque_type(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -opaque my_type() :: {string(), type_deps:number_like()}.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_opaque_type(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export_type([my_type/0]).
+
+ -opaque my_type() :: {string(), type_deps:number_like()}.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_opaque_type_args(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -type my_type() :: type_deps:my_opaque(number()).
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_opaque_type_args(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export_type([my_type/0]).
+
+ -type my_type() :: type_deps:my_opaque(number()).
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_type_args(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -type my_type() :: {string(), type_deps:number_like()}.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_type_args(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export_type([my_type/0]).
+
+ -type my_type() :: {string(), type_deps:number_like()}.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_fun_spec_args(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -compile({nowarn_unused_function, [f/1]}).
+
+ -spec f(type_deps:number_like()) -> number().
+ f(N) -> N.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_fun_spec_args(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export([f/1]).
+
+ -spec f(N :: type_deps:number_like()) -> number().
+ f(N) -> N.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_fun_spec_return(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -compile({nowarn_unused_function, [f/0]}).
+
+ -spec f() -> type_deps:number_like().
+ f() -> 1.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_fun_spec_return(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export([f/0]).
+
+ -spec f() -> type_deps:number_like().
+ f() -> 1.
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_unexported_type(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+
+ -type my_type() :: type_deps:list_like(number()).
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+mod_dep_from_exported_type(Config) ->
+ DependerSrc = <<"
+ -module(depender).
+ -export_type([my_type/0]).
+
+ -type my_type() :: type_deps:list_like(number()).
+ ">>,
+ ExpectedTypeDepsInPlt = [{depender, []}, {type_deps, [depender]}],
+ ok = check_plt_deps(Config, ?FUNCTION_NAME, DependerSrc, ExpectedTypeDepsInPlt).
+
+check_plt_deps(Config, TestName, DependerSrc, ExpectedTypeDepsInPltUnsorted) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ PltFile = filename:join(PrivDir, atom_to_list(TestName) ++ ".plt"),
+ {ok, DepsBeamFile} = compile(Config, type_deps, []),
+ {ok, DependerBeamFile} = compile(Config, DependerSrc, depender, []),
+ [] = run_dialyzer(plt_build, [DependerBeamFile, DepsBeamFile], [{output_plt, PltFile}]),
+ {_ResPlt, #plt_info{mod_deps = DepsByModule}} = dialyzer_plt:plt_and_info_from_file(PltFile),
+
+ ActualTypeDepsInPlt =
+ lists:sort(dict:to_list(dict:erase(erlang, DepsByModule))),
+ ExpectedTypeDepsInPlt =
+ lists:usort(ExpectedTypeDepsInPltUnsorted),
+
+ ?assertEqual(
+ ExpectedTypeDepsInPlt,
+ ActualTypeDepsInPlt,
+ {missing, ExpectedTypeDepsInPlt -- ActualTypeDepsInPlt,
+ extra, ActualTypeDepsInPlt -- ExpectedTypeDepsInPlt}).
+
erlang_beam() ->
case code:where_is_file("erlang.beam") of
non_existing ->
@@ -499,9 +895,20 @@ erlang_beam() ->
EBeam
end.
+%% Builds the named module using the source in the plt_SUITE_data dir
+compile(Config, Module, CompileOpts) ->
+ Source = lists:concat([Module, ".erl"]),
+ PrivDir = proplists:get_value(priv_dir,Config),
+ DataDir = proplists:get_value(data_dir,Config),
+ SrcFilename = filename:join([DataDir, Source]),
+ Opts = [{outdir, PrivDir}, debug_info | CompileOpts],
+ {ok, Module} = compile:file(SrcFilename, Opts),
+ {ok, filename:join([PrivDir, lists:concat([Module, ".beam"])])}.
+
+%% Builds the named module using the literal source given
compile(Config, Prog, Module, CompileOpts) ->
Source = lists:concat([Module, ".erl"]),
- PrivDir = ?config(priv_dir,Config),
+ PrivDir = proplists:get_value(priv_dir,Config),
Filename = filename:join([PrivDir, Source]),
ok = file:write_file(Filename, Prog),
Opts = [{outdir, PrivDir}, debug_info | CompileOpts],
diff --git a/lib/dialyzer/test/plt_SUITE_data/type_deps.erl b/lib/dialyzer/test/plt_SUITE_data/type_deps.erl
new file mode 100644
index 0000000000..f6fcfc3d23
--- /dev/null
+++ b/lib/dialyzer/test/plt_SUITE_data/type_deps.erl
@@ -0,0 +1,18 @@
+-module(type_deps).
+
+-export([func/1, get_num/0]).
+
+-export_type([number_like/0, my_opaque/1, list_like/1]).
+
+-type number_like() :: number().
+-type list_like(X) :: [X].
+-opaque my_opaque(X) :: {X,X}.
+
+-callback quux(number()) -> number().
+
+-spec func(T) -> T.
+func(X) ->
+ X + X.
+
+get_num() ->
+ 3.
diff --git a/lib/dialyzer/test/property_test/erl_types_prop.erl b/lib/dialyzer/test/property_test/erl_types_prop.erl
new file mode 100644
index 0000000000..0dbcbe555f
--- /dev/null
+++ b/lib/dialyzer/test/property_test/erl_types_prop.erl
@@ -0,0 +1,230 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(erl_types_prop).
+-compile([export_all, nowarn_export_all]).
+
+%% This module only supports proper, as we use features of PropEr's
+%% module erlang_abstract_code not available in quickcheck.
+
+-proptest([proper]).
+
+-ifdef(PROPER).
+
+-include_lib("proper/include/proper.hrl").
+
+-define(REPETITIONS, 5000).
+
+absorption() ->
+ numtests(?REPETITIONS, absorption_1()).
+
+absorption_1() ->
+ ?FORALL({TypeA, TypeB},
+ ?LET(TypeA, type(),
+ ?LET(TypeB, type(), {TypeA, TypeB})),
+ ?WHENFAIL(
+ begin
+ io:format("TypeA = ~p,\n", [TypeA]),
+ io:format("TypeB = ~p,\n", [TypeB]),
+ io:format("~p:absorption_check(TypeA, TypeB).\n",
+ [?MODULE])
+ end,
+ absorption_check(TypeA, TypeB))).
+
+absorption_check(A, B) ->
+ %% a ∨ (a ∧ b) = a
+ R1 = sup(A, inf(A, B)),
+ %% a ∧ (a ∨ b) = a
+ R2 = inf(A, sup(A, B)),
+ equal(A, R1) andalso equal(A, R2).
+
+associativity() ->
+ numtests(?REPETITIONS, associativity_1()).
+
+associativity_1() ->
+ ?FORALL({TypeA, TypeB, TypeC},
+ ?LET(TypeA, type_without_no_return(),
+ ?LET(TypeB, type_without_no_return(),
+ ?LET(TypeC, type_without_no_return(), {TypeA, TypeB, TypeC}))),
+ ?WHENFAIL(
+ begin
+ io:format("TypeA = ~p,\n", [TypeA]),
+ io:format("TypeB = ~p,\n", [TypeB]),
+ io:format("TypeC = ~p,\n", [TypeC]),
+ io:format("~p:associativity_check(TypeA, TypeB, TypeC).\n",
+ [?MODULE])
+ end,
+ associativity_check(TypeA, TypeB, TypeC))).
+
+associativity_check(A, B, C) ->
+ %% a ∨ (b ∨ c) = (a ∨ b) ∨ c
+ LHS_Sup = sup(A, sup(B, C)),
+ RHS_Sup = sup(sup(A, B), C),
+ Test1 = equal(LHS_Sup, RHS_Sup),
+ %% a ∧ (b ∧ c) = (a ∧ b) ∧ c
+ LHS_Inf = inf(A, inf(B, C)),
+ RHS_Inf = inf(inf(A, B), C),
+ Test2 = equal(LHS_Inf, RHS_Inf),
+ Test1 and Test2.
+
+commutativity() ->
+ numtests(?REPETITIONS, commutativity_1()).
+
+commutativity_1() ->
+ ?FORALL({TypeA, TypeB},
+ ?LET(TypeA, type(),
+ ?LET(TypeB, type(), {TypeA, TypeB})),
+ ?WHENFAIL(
+ begin
+ io:format("TypeA = ~p,\n", [TypeA]),
+ io:format("TypeB = ~p,\n", [TypeB]),
+ io:format("~p:commutativity_check(TypeA, TypeB).\n",
+ [?MODULE])
+ end,
+ commutativity_check(TypeA, TypeB))).
+
+commutativity_check(A, B) ->
+ %% a ∨ b = b ∨ a
+ Sup_AB = sup(A, B),
+ Sup_BA = sup(B, A),
+ true = sup(A, B) =:= sup(B, A),
+ Test1 = equal(Sup_AB, Sup_BA),
+ %% a ∧ b = b ∧ a
+ Inf_AB = inf(A, B),
+ Inf_BA = inf(B, A),
+ Test2 = equal(Inf_AB, Inf_BA),
+ Test1 and Test2.
+
+idempotence() ->
+ numtests(?REPETITIONS, idempotence_1()).
+
+idempotence_1() ->
+ ?FORALL(Type,
+ type(),
+ ?WHENFAIL(
+ begin
+ io:format("Type = ~p,\n", [Type]),
+ io:format("~p:idempotence_check(Type).\n", [?MODULE])
+ end,
+ idempotence_check(Type))).
+
+idempotence_check(Type) ->
+ %% a ∨ a = a
+ Sup = sup(Type, Type),
+ Test1 = equal(Sup, Type),
+ %% a ∧ a = a
+ Inf = inf(Type, Type),
+ Test2 = equal(Inf, Type),
+ Test1 and Test2.
+
+identity() ->
+ numtests(?REPETITIONS, identity_1()).
+
+identity_1() ->
+ ?FORALL(Type, type(), identity_check(Type)).
+
+identity_check(Type) ->
+ %% a ∨ [bottom element] = a
+ Sup = sup(Type, none),
+ Test1 = equal(Sup, Type),
+ %% a ∧ [top element] = a
+ Inf = inf(Type, any),
+ Test2 = equal(Inf, Type),
+ Test1 and Test2.
+
+limit() ->
+ numtests(?REPETITIONS, limit_1()).
+
+limit_1() ->
+ ?FORALL(Type,
+ type(),
+ ?WHENFAIL(
+ begin
+ io:format("Type = ~p,\n", [Type]),
+ io:format("~p:limit_check(Type).\n", [?MODULE])
+ end,
+ limit_check(Type))).
+
+limit_check(Type1) ->
+ equal(erl_types:t_limit(Type1, 1000), Type1).
+
+inf(A, B) ->
+ erl_types:t_inf(A, B).
+
+sup(A, B) ->
+ erl_types:t_sup(A, B).
+
+equal(A, B) ->
+ erl_types:t_is_equal(A, B).
+
+type_without_no_return() ->
+ ?SUCHTHAT(Type, type(), not has_no_return(Type)).
+
+has_no_return(unit) ->
+ true;
+has_no_return(Tuple) when is_tuple(Tuple) ->
+ has_no_return(tuple_to_list(Tuple));
+has_no_return([T|Ts]) ->
+ has_no_return(T) orelse has_no_return(Ts);
+has_no_return(_) ->
+ false.
+
+type() ->
+ ?LET(Forms,
+ abstr(),
+ begin
+ [F | _] = [T || {attribute, _, K, {_, T, []}} <- Forms,
+ K =:= type orelse K =:= opaque],
+ form_to_type(F)
+ end).
+
+abstr() ->
+ Opts = [{types, [{Type, 0} || Type <- types()]},
+ {weight, {atom, 10}},
+ {weight, {type_decl, 1}},
+ {weight, {record_decl, 0}},
+ {weight, {function_spec, 0}},
+ {weight, {function_decl, 0}},
+ {weight, {type_variable, 0}}],
+ proper_erlang_abstract_code:module(Opts).
+
+form_to_type(Form) ->
+ Types = [SiteType | _] = types(),
+ Anno = erl_anno:new(0),
+ TableTypes = [{{type, Type, 0},
+ {{m, {"file", Anno}, {type, 0, any, []}, []}, any}} ||
+ Type <- Types],
+ TypeTable = maps:from_list(TableTypes),
+ CodeTable = ets:new(table, [set]),
+ try
+ true = ets:insert(CodeTable, {m, TypeTable}),
+ Site = {type, {m, SiteType, 0}, ""},
+ C = erl_types:cache__new(),
+ ETypes = sets:from_list([]),
+ {T, _} = erl_types:t_from_form(Form, ETypes, Site, CodeTable, #{}, C),
+ T
+ after
+ true = ets:delete(CodeTable)
+ end.
+
+types() ->
+ [t, tt].
+
+-endif.
diff --git a/lib/dialyzer/test/race_SUITE_data/dialyzer_options b/lib/dialyzer/test/race_SUITE_data/dialyzer_options
deleted file mode 100644
index 2be2f47dda..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/dialyzer_options
+++ /dev/null
@@ -1 +0,0 @@
-{dialyzer_options, [{indent_opt, false}, {warnings, [race_conditions]}]}.
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args1
deleted file mode 100644
index 452b623f94..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args1.erl:9:16: The call ets:insert(T::'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args1.erl on line {8,28}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args10 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args10
deleted file mode 100644
index cefface2f5..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args10
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args10.erl:9:16: The call ets:insert(T::'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args10.erl on line {8,28}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args2
deleted file mode 100644
index 1a529812f9..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args2.erl:9:16: The call ets:insert(T::'foo',[{'counter',number()} | {'kostis',number()} | {'maria',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args2.erl on line {8,27}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args3 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args3
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args3
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args4 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args4
deleted file mode 100644
index dd08666fe8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args4
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args4.erl:9:16: The call ets:insert(T::'foo',{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args4.erl on line {8,27}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args5 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args5
deleted file mode 100644
index ec44a89f8f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args5
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args5.erl:9:16: The call ets:insert(T::'foo',{'counter',number(),number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args5.erl on line {8,27}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args6 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args6
deleted file mode 100644
index b7d4131ff6..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args6
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args6.erl:9:16: The call ets:insert(T::'foo',[{'counter',number(),number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_args6.erl on line {8,27}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args7 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args7
deleted file mode 100644
index fc6ea50437..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args7
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args7.erl:17:3: The call ets:insert(Table::'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo','counter') call in ets_insert_args7.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args8 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args8
deleted file mode 100644
index f263c0eaaf..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_args8
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_args8.erl:16:3: The call ets:insert(Table::atom(),[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::atom(),'counter') call in ets_insert_args8.erl on line {12,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow1
deleted file mode 100644
index 38c507582e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_control_flow1.erl:15:7: The call ets:insert('foo',{'random',integer()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_control_flow1.erl on line {10,41}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow2
deleted file mode 100644
index 1ca874c4d8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow2
+++ /dev/null
@@ -1,3 +0,0 @@
-
-ets_insert_control_flow2.erl:15:7: The call ets:insert('foo',[{'pass',[pos_integer()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_control_flow2.erl on line {10,41}
-ets_insert_control_flow2.erl:19:7: The call ets:insert('foo',[{'pass',[pos_integer()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_control_flow2.erl on line {10,41}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow3 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow3
deleted file mode 100644
index ad011e918c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow3
+++ /dev/null
@@ -1,3 +0,0 @@
-
-ets_insert_control_flow3.erl:21:11: The call ets:insert(Table::atom() | ets:tid(),{'root',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'root') call in ets_insert_control_flow3.erl on line {12,15}
-ets_insert_control_flow3.erl:23:11: The call ets:insert(Table::atom() | ets:tid(),{'user',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'user') call in ets_insert_control_flow3.erl on line {13,15}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow4 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow4
deleted file mode 100644
index ad505c0ab8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow4
+++ /dev/null
@@ -1,3 +0,0 @@
-
-ets_insert_control_flow4.erl:21:11: The call ets:insert(Table::atom() | ets:tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow4.erl on line {12,15}, the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow4.erl on line {13,15}
-ets_insert_control_flow4.erl:23:11: The call ets:insert(Table::atom() | ets:tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow4.erl on line {12,15}, the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow4.erl on line {13,15}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow5 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow5
deleted file mode 100644
index f98aa27654..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_control_flow5
+++ /dev/null
@@ -1,5 +0,0 @@
-
-ets_insert_control_flow5.erl:22:11: The call ets:insert(Table::atom() | ets:tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'welcome_msg') call in ets_insert_control_flow5.erl on line {16,16}
-ets_insert_control_flow5.erl:23:11: The call ets:insert(Table::atom() | ets:tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow5.erl on line {12,15}, the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow5.erl on line {13,15}
-ets_insert_control_flow5.erl:25:11: The call ets:insert(Table::atom() | ets:tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'welcome_msg') call in ets_insert_control_flow5.erl on line {16,16}
-ets_insert_control_flow5.erl:26:11: The call ets:insert(Table::atom() | ets:tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow5.erl on line {12,15}, the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_control_flow5.erl on line {13,15}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race1
deleted file mode 100644
index 60e115ff1b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_diff_atoms_race1.erl:22:3: The call ets:insert(Table::'bar' | 'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo','counter') call in ets_insert_diff_atoms_race1.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race2
deleted file mode 100644
index 0e6546685c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_diff_atoms_race2.erl:22:3: The call ets:insert(Table::'bar' | 'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race2.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race3 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race3
deleted file mode 100644
index 9a0e7dc936..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_diff_atoms_race3.erl:22:3: The call ets:insert(Table::'bar' | 'foo',{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo','counter') call in ets_insert_diff_atoms_race3.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race4 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race4
deleted file mode 100644
index cc17f482ad..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race4
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_diff_atoms_race4.erl:22:3: The call ets:insert(Table::'bar' | 'foo',{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race4.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race5 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race5
deleted file mode 100644
index c6df36c0e2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race5
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_diff_atoms_race5.erl:22:3: The call ets:insert(Table::'foo',[{'counter',number()} | {'index',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race5.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race6 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race6
deleted file mode 100644
index 21e5cdf8f3..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_diff_atoms_race6
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_diff_atoms_race6.erl:22:3: The call ets:insert(Table::'foo',{'counter',number()} | {'index',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Tab::'foo',Counter::'counter') call in ets_insert_diff_atoms_race6.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double1
deleted file mode 100644
index 5de9983e9e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double1
+++ /dev/null
@@ -1,4 +0,0 @@
-
-ets_insert_double1.erl:15:7: The call ets:insert('foo',[{'pass',[number()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_double1.erl on line {10,41}, the ets:lookup('foo','pass') call in ets_insert_double1.erl on line {27,14}
-ets_insert_double1.erl:19:7: The call ets:insert('foo',[{'pass',[number()]} | {'random',integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','random') call in ets_insert_double1.erl on line {10,41}, the ets:lookup('foo','pass') call in ets_insert_double1.erl on line {27,14}
-ets_insert_double1.erl:24:3: The call ets:insert('foo',{'pass', 'empty'}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','pass') call in ets_insert_double1.erl on line {22,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double2
deleted file mode 100644
index 532550efb7..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_double2
+++ /dev/null
@@ -1,4 +0,0 @@
-
-ets_insert_double2.erl:15:7: The call ets:insert('foo',[{_,[number()] | integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo',Random::any()) call in ets_insert_double2.erl on line {10,41}, the ets:lookup('foo',Pass::any()) call in ets_insert_double2.erl on line {27,14}
-ets_insert_double2.erl:19:7: The call ets:insert('foo',[{_,[number()] | integer()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo',Random::any()) call in ets_insert_double2.erl on line {10,41}, the ets:lookup('foo',Pass::any()) call in ets_insert_double2.erl on line {27,14}
-ets_insert_double2.erl:24:3: The call ets:insert('foo',{_,'empty'}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo',Pass::any()) call in ets_insert_double2.erl on line {22,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs1 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs1
deleted file mode 100644
index 646921b7ab..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_funs1.erl:15:3: The call ets:insert('foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(T::'foo','counter') call in ets_insert_funs1.erl on line {9,9}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs2 b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs2
deleted file mode 100644
index 1cb3e3a996..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_funs2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_funs2.erl:9:9: The call ets:insert(T::'foo',[{'counter',number()},...]) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('foo','counter') call in ets_insert_funs2.erl on line {14,14}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_new b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_new
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_new
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_param b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_param
deleted file mode 100644
index 29b20f3386..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_param
+++ /dev/null
@@ -1,5 +0,0 @@
-
-ets_insert_param.erl:13:7: The call ets:insert(Table::atom() | ets:tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'welcome_msg') call in ets_insert_param.erl on line {10,16}
-ets_insert_param.erl:14:7: The call ets:insert(Table::atom() | ets:tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_param.erl on line {14,57}, the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_param.erl on line {15,67}
-ets_insert_param.erl:17:7: The call ets:insert(Table::atom() | ets:tid(),{'welcome_msg',[any(),...]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'welcome_msg') call in ets_insert_param.erl on line {10,16}
-ets_insert_param.erl:18:7: The call ets:insert(Table::atom() | ets:tid(),{'pass',[pos_integer()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Table::atom() | ets:tid(),'pass') call in ets_insert_param.erl on line {18,57}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_public b/lib/dialyzer/test/race_SUITE_data/results/ets_insert_public
deleted file mode 100644
index 27ce4b181a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/ets_insert_public
+++ /dev/null
@@ -1,2 +0,0 @@
-
-ets_insert_public.erl:14:5: The call ets:insert(Foo::atom(),{'counter',number()}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup(Foo::atom(),'counter') call in ets_insert_public.erl on line {12,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/extract_translations b/lib/dialyzer/test/race_SUITE_data/results/extract_translations
deleted file mode 100644
index 8804c0b9ee..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/extract_translations
+++ /dev/null
@@ -1,5 +0,0 @@
-
-extract_translations.erl:140:7: The call ets:insert('files',{atom() | [atom() | [any()] | char()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('files',File::atom() | [atom() | [any()] | char()]) call in extract_translations.erl on line {135,11}
-extract_translations.erl:146:6: The call ets:insert('translations',{_,[]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('translations',Str::any()) call in extract_translations.erl on line {126,11}
-extract_translations.erl:152:7: The call ets:insert('files',{atom() | [atom() | [any()] | char()]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('files',File::atom() | [atom() | [any()] | char()]) call in extract_translations.erl on line {148,11}
-extract_translations.erl:154:6: The call ets:insert('translations',{_,[]}) might have an unintended effect due to a possible race condition caused by its combination with the ets:lookup('translations',Str::any()) call in extract_translations.erl on line {126,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race1 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race1
deleted file mode 100644
index d7886f3b68..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_diff_atoms_race1.erl:33:3: The call mnesia:dirty_write(Table::'employee' | 'employer',Record::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read(Tab::'employee',Eno::any()) call in mnesia_diff_atoms_race1.erl on line {19,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race2 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race2
deleted file mode 100644
index 51906dd548..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_diff_atoms_race2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_diff_atoms_race2.erl:37:3: The call mnesia:dirty_write(Record::#employee{salary::number()} | #employer{}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read(Tab::'employee',Eno::any()) call in mnesia_diff_atoms_race2.erl on line {26,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two
deleted file mode 100644
index 3ac7ed1f04..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_one_write_two
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_one_write_two.erl:20:5: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_one_write_two.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one
deleted file mode 100644
index 231e62c2c2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_two_write_one
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_two_write_one.erl:20:5: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_two_write_one.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double1 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double1
deleted file mode 100644
index 1e2c4e379f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_write_double1.erl:20:5: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_write_double1.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double2 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double2
deleted file mode 100644
index 3d28f32dc9..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_write_double2.erl:20:5: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_write_double2.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double3 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double3
deleted file mode 100644
index 5b46129157..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_write_double3.erl:20:5: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_write_double3.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double4 b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double4
deleted file mode 100644
index 895faa4cad..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_double4
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_write_double4.erl:20:5: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_write_double4.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one
deleted file mode 100644
index d88e501f9c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_one
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_write_one.erl:20:5: The call mnesia:dirty_write(New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read({'employee',_}) call in mnesia_dirty_read_write_one.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two b/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two
deleted file mode 100644
index 4ff8c0d9c4..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/mnesia_dirty_read_write_two
+++ /dev/null
@@ -1,2 +0,0 @@
-
-mnesia_dirty_read_write_two.erl:20:5: The call mnesia:dirty_write('employee',New::#employee{salary::number()}) might have an unintended effect due to a possible race condition caused by its combination with the mnesia:dirty_read('employee',Eno::any()) call in mnesia_dirty_read_write_two.erl on line {17,11}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow1
deleted file mode 100644
index c62a764338..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_control_flow1.erl:13:18: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow1.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow2
deleted file mode 100644
index 1fc47a7218..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow2
+++ /dev/null
@@ -1,3 +0,0 @@
-
-whereis_control_flow2.erl:14:4: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow2.erl on line {8,8}
-whereis_control_flow2.erl:15:18: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow2.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow3
deleted file mode 100644
index f04acc840e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_control_flow3.erl:25:3: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow3.erl on line {11,14}, the erlang:whereis(AnAtom::any()) call in whereis_control_flow3.erl on line {18,14}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow4
deleted file mode 100644
index 76b60a0db8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow4
+++ /dev/null
@@ -1,3 +0,0 @@
-
-whereis_control_flow4.erl:18:19: The call erlang:register('maria',Pid1::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis('maria') call in whereis_control_flow4.erl on line {8,8}
-whereis_control_flow4.erl:19:19: The call erlang:register('kostis',Pid2::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis('kostis') call in whereis_control_flow4.erl on line {13,16}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow5
deleted file mode 100644
index 0a445d4f10..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow5
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_control_flow5.erl:11:7: The call erlang:unregister(AnAtom::atom()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_control_flow5.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow6
deleted file mode 100644
index 2b6726731f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_control_flow6
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_control_flow6.erl:11:7: The call erlang:unregister('kostis') might fail due to a possible race condition caused by its combination with the erlang:whereis('kostis') call in whereis_control_flow6.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_no_race
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race
deleted file mode 100644
index 4b7272e203..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_atoms_race
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_atoms_race.erl:34:3: The call erlang:register(Atom::'kostis' | 'maria',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::'maria') call in whereis_diff_atoms_race.erl on line {14,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1
deleted file mode 100644
index aac6a321cd..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1
+++ /dev/null
@@ -1,3 +0,0 @@
-
-whereis_diff_functions1.erl:10:7: The call erlang:register('master',pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis('master') call in whereis_diff_functions1.erl on line {8,8}
-whereis_diff_functions1.erl:18:7: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions1.erl on line {15,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested
deleted file mode 100644
index 85a8546bc6..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_nested
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions1_nested.erl:23:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions1_nested.erl on line {11,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens
deleted file mode 100644
index c9c4fe7b48..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_pathsens
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions1_pathsens.erl:32:3: The call erlang:register(Atom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::'kostis') call in whereis_diff_functions1_pathsens.erl on line {15,14}, the erlang:whereis(AnAtom::'kostis') call in whereis_diff_functions1_pathsens.erl on line {22,14}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice
deleted file mode 100644
index f2338ed249..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions1_twice
+++ /dev/null
@@ -1,3 +0,0 @@
-
-whereis_diff_functions1_twice.erl:27:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions1_twice.erl on line {11,8}
-whereis_diff_functions1_twice.erl:30:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions1_twice.erl on line {15,12}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2
deleted file mode 100644
index 005428286e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions2.erl:25:3: The call erlang:register(Atom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::'kostis') call in whereis_diff_functions2.erl on line {13,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested
deleted file mode 100644
index 54ea8e70fd..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_nested
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions2_nested.erl:20:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_nested.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens
deleted file mode 100644
index 3ec2234046..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_pathsens
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions2_pathsens.erl:29:3: The call erlang:register(Atom::atom(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_pathsens.erl on line {12,14}, the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_pathsens.erl on line {19,14}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice
deleted file mode 100644
index d14a255040..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions2_twice
+++ /dev/null
@@ -1,3 +0,0 @@
-
-whereis_diff_functions2_twice.erl:24:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions2_twice.erl on line {8,8}
-whereis_diff_functions2_twice.erl:27:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions2_twice.erl on line {12,12}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3
deleted file mode 100644
index 079ec9fb31..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions3.erl:8:3: The call erlang:register(AnAtom::atom(),'undefined' | pid() | port()) might fail due to a possible race condition caused by its combination with the erlang:whereis(Atom::any()) call in whereis_diff_functions3.erl on line {11,3}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested
deleted file mode 100644
index f1a4733585..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_nested
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions3_nested.erl:21:3: The call erlang:unregister(Atom::atom()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions3_nested.erl on line {11,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens
deleted file mode 100644
index 44e1ba6fbc..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions3_pathsens
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions3_pathsens.erl:29:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions3_pathsens.erl on line {12,14}, the erlang:whereis(AnAtom::any()) call in whereis_diff_functions3_pathsens.erl on line {19,14}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions4
deleted file mode 100644
index 2f39e19a03..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions4
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions4.erl:32:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions4.erl on line {13,8}, the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions4.erl on line {17,12}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions5
deleted file mode 100644
index 1e19cb26e7..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions5
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions5.erl:22:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions5.erl on line {10,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions6
deleted file mode 100644
index 5c8a093405..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_functions6
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_functions6.erl:29:3: The call erlang:register(Atom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_functions6.erl on line {10,8}, the erlang:whereis(AnAtom::atom()) call in whereis_diff_functions6.erl on line {14,12}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1
deleted file mode 100644
index 6a28376c07..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules2.erl:11:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1.erl on line {10,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens
deleted file mode 100644
index f287ade224..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_pathsens
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules2_pathsens.erl:12:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_pathsens.erl on line {12,14}, the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_pathsens.erl on line {19,14}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec
deleted file mode 100644
index 2d2033d172..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules1_rec
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules1_rec.erl:10:10: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_diff_modules1_rec.erl on line {12,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2
deleted file mode 100644
index 3ae7f24bf7..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules3.erl:8:3: The call erlang:register(AnAtom::atom(),'undefined' | pid() | port()) might fail due to a possible race condition caused by its combination with the erlang:whereis(Atom::any()) call in whereis_diff_modules4.erl on line {11,3}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens
deleted file mode 100644
index b3a9a2130a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_pathsens
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules4_pathsens.erl:13:3: The call erlang:register(Atom::atom(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules3_pathsens.erl on line {12,14}, the erlang:whereis(AnAtom::any()) call in whereis_diff_modules3_pathsens.erl on line {19,14}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec
deleted file mode 100644
index bca2659836..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules2_rec
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules3_rec.erl:13:10: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_diff_modules3_rec.erl on line {15,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules3
deleted file mode 100644
index c8afd6603f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules6.erl:11:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules5.erl on line {10,8}, the erlang:whereis(AnAtom::atom()) call in whereis_diff_modules5.erl on line {14,12}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested
deleted file mode 100644
index b003518eb7..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_nested
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_modules3_nested.erl:11:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_nested.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice
deleted file mode 100644
index c8d414d76c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_modules_twice
+++ /dev/null
@@ -1,3 +0,0 @@
-
-whereis_diff_modules2_twice.erl:11:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::atom()) call in whereis_diff_modules1_twice.erl on line {12,12}
-whereis_diff_modules2_twice.erl:8:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_diff_modules1_twice.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_no_race
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race b/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race
deleted file mode 100644
index 4309c8370c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_diff_vars_race
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_diff_vars_race.erl:16:7: The call erlang:register(Atom2::any(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(Atom1::any()) call in whereis_diff_vars_race.erl on line {13,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module1
deleted file mode 100644
index cf4393654f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module2.erl:11:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module1.erl on line {10,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module2
deleted file mode 100644
index 4ceffb2f1f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module4.erl:14:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module3.erl on line {10,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module3
deleted file mode 100644
index 9b5aa5c867..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module6.erl:14:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module5.erl on line {10,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module4
deleted file mode 100644
index c42e9b967f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module4
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module7.erl:8:3: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module8.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module5
deleted file mode 100644
index 569d0f5976..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module5
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module9.erl:8:3: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module10.erl on line {11,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module6
deleted file mode 100644
index cc848c493c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module6
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module12.erl:14:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module11.erl on line {10,8}, the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module11.erl on line {21,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module7 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module7
deleted file mode 100644
index 5bb9fb794b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module7
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module14.erl:11:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module13.erl on line {10,8}, the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module14.erl on line {16,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module8 b/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module8
deleted file mode 100644
index 6973b7422c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_intra_inter_module8
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_intra_inter_module16.erl:11:3: The call erlang:register(Atom::any(),Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module15.erl on line {10,8}, the erlang:whereis(AnAtom::any()) call in whereis_intra_inter_module16.erl on line {16,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_param b/lib/dialyzer/test/race_SUITE_data/results/whereis_param
deleted file mode 100644
index f6735807c1..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_param
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_param.erl:8:3: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_param.erl on line {11,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module b/lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module
deleted file mode 100644
index 97c9d27789..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_param_inter_module
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_param_inter_module1.erl:8:3: The call erlang:register(AnAtom::atom(),pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_param_inter_module2.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function1
deleted file mode 100644
index 66248649a0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function1
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function1.erl:14:4: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_rec_function1.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function2
deleted file mode 100644
index 83298a5c3c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function2.erl:13:10: The call erlang:register(AnAtom::atom(),Id::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function2.erl on line {15,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function3
deleted file mode 100644
index 7b004aeb12..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function3.erl:13:10: The call erlang:register(AnAtom::atom(),Id::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function3.erl on line {16,10}, the erlang:whereis(NextAtom::atom()) call in whereis_rec_function3.erl on line {20,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function4
deleted file mode 100644
index b2885774ba..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function4
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function4.erl:13:10: The call erlang:register(AnAtom::atom(),Id::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function4.erl on line {15,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function5
deleted file mode 100644
index d5e9c4328a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function5
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function5.erl:10:10: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function5.erl on line {12,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function6
deleted file mode 100644
index c4c7c55b02..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function6
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function6.erl:10:10: The call erlang:register(AnAtom::any(),Id::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(NextAtom::any()) call in whereis_rec_function6.erl on line {12,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function7 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function7
deleted file mode 100644
index 0a0b07bcc0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function7
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function7.erl:15:4: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_rec_function7.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function8 b/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function8
deleted file mode 100644
index db37842e6b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_rec_function8
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_rec_function8.erl:18:4: The call erlang:register(AnAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_rec_function8.erl on line {11,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch b/lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch
deleted file mode 100644
index 3cf78cf0d2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_try_catch
+++ /dev/null
@@ -1,3 +0,0 @@
-
-whereis_try_catch.erl:13:14: The call erlang:register('master',Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis('master') call in whereis_try_catch.erl on line {8,8}
-whereis_try_catch.erl:21:9: The call erlang:register('master',Pid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis('master') call in whereis_try_catch.erl on line {18,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars1 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars1
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars1
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars10 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars10
deleted file mode 100644
index 37c060def4..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars10
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars10.erl:17:22: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars10.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars11 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars11
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars11
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars12 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars12
deleted file mode 100644
index bc19f7a756..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars12
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars12.erl:16:37: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars12.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars13 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars13
deleted file mode 100644
index 864231d6b4..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars13
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars13.erl:16:52: The call erlang:register(OtherAtom::'kostis',APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars13.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars14 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars14
deleted file mode 100644
index 4aaf586141..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars14
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars14.erl:16:52: The call erlang:register(OtherAtom::'kostis',APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars14.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars15 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars15
deleted file mode 100644
index 2042e119ca..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars15
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars15.erl:17:15: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars15.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars16 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars16
deleted file mode 100644
index 89f5b963a8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars16
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars16.erl:17:15: The call erlang:register(OtherAtom::any(),APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars16.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars17 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars17
deleted file mode 100644
index 1f94cfef0e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars17
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars17.erl:17:15: The call erlang:register(OtherAtom::any(),APid::any()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars17.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars18 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars18
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars18
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars19 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars19
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars19
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars2 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars2
deleted file mode 100644
index 6aa57fcdc5..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars2
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars2.erl:14:18: The call erlang:register(OtherAtom::atom(),Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars2.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars20 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars20
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars20
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars21 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars21
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars21
+++ /dev/null
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars22 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars22
deleted file mode 100644
index 613d788e59..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars22
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars22.erl:21:21: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars22.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars3 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars3
deleted file mode 100644
index 74ab067e56..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars3
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars3.erl:14:18: The call erlang:register(OtherAtom::atom(),APid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars3.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars4 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars4
deleted file mode 100644
index 0584b03a8d..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars4
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars4.erl:14:18: The call erlang:register(OtherAtom::atom() | pid(),APid::atom() | pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars4.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars5 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars5
deleted file mode 100644
index 0482d31215..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars5
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars5.erl:16:26: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars5.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars6 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars6
deleted file mode 100644
index 6edcb8b756..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars6
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars6.erl:16:34: The call erlang:register(OtherAtom::'kostis',APid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars6.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars7 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars7
deleted file mode 100644
index 23c1ef2942..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars7
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars7.erl:16:34: The call erlang:register(OtherAtom::'kostis',APid::atom() | pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars7.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars8 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars8
deleted file mode 100644
index 59019c74c0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars8
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars8.erl:16:21: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars8.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars9 b/lib/dialyzer/test/race_SUITE_data/results/whereis_vars9
deleted file mode 100644
index 89fba57863..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/results/whereis_vars9
+++ /dev/null
@@ -1,2 +0,0 @@
-
-whereis_vars9.erl:16:21: The call erlang:register(OtherAtom::'kostis',Pid::pid()) might fail due to a possible race condition caused by its combination with the erlang:whereis(AnAtom::any()) call in whereis_vars9.erl on line {8,8}
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl
deleted file mode 100644
index 0039195e0a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args1).
--export([start/0]).
-
-start() ->
- F = fun(T) -> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, [{counter, N+1}])
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0}),
- io:format("Inserted ~w\n", [{counter, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args10.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args10.erl
deleted file mode 100644
index c897a34af0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args10.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args10).
--export([start/0]).
-
-start() ->
- F = fun(T) -> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, [{counter, N+1}])
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- A = {counter, 0},
- B = [],
- ets:insert(foo, [A|B]),
- io:format("Inserted ~w\n", [{counter, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1_suppressed.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1_suppressed.erl
deleted file mode 100644
index 5134cc6f0b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args1_suppressed.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args1_suppressed).
--export([start/0]).
-
--dialyzer({nowarn_function,start/0}).
-
-start() ->
- F = fun(T) -> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, [{counter, N+1}])
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0}),
- io:format("Inserted ~w\n", [{counter, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl
deleted file mode 100644
index c1857eb58b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args2.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args2).
--export([start/0]).
-
-start() ->
- F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, [{counter, N+1}, {maria, N+1}, {kostis, N+1}])
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0}),
- io:format("Inserted ~w\n", [{counter, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl
deleted file mode 100644
index 74401b76fd..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args3.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args3).
--export([start/0]).
-
-start() ->
- F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, [{maria, N+1}, {kostis, N+1}])
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0}),
- io:format("Inserted ~w\n", [{counter, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl
deleted file mode 100644
index 2c892074ec..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args4.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args4).
--export([start/0]).
-
-start() ->
- F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, {counter, N+1})
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0}),
- io:format("Inserted ~w\n", [{counter, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl
deleted file mode 100644
index 156f555a7c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args5.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args5).
--export([start/0]).
-
-start() ->
- F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, {counter, N+1, N+2})
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0, 0}),
- io:format("Inserted ~w\n", [{counter, 0, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl
deleted file mode 100644
index 1e5887f76d..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args6.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args6).
--export([start/0]).
-
-start() ->
- F = fun(T)-> [{_, N}] = ets:lookup(T, counter),
- ets:insert(T, [{counter, N+1, N+2}])
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0, 0}),
- io:format("Inserted ~w\n", [{counter, 0, 0}]),
- F(foo),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl
deleted file mode 100644
index 912bbf7073..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args7.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args7).
--export([test/0]).
-
-test() ->
- Foo = foo,
- ets:new(Foo, [named_table, public]),
- race(Foo).
-
-race(Tab) ->
- [{_, N}] = ets:lookup(Tab, counter),
- aux(Tab, N).
-
-aux(Table, N) ->
- ets:insert(Table, [{counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl
deleted file mode 100644
index 275cf0291c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_args8.erl
+++ /dev/null
@@ -1,16 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the argument types of the calls.
-
--module(ets_insert_args8).
--export([test/1]).
-
-test(Foo) ->
- ets:new(Foo, [named_table, public]),
- race(Foo).
-
-race(Tab) ->
- [{_, N}] = ets:lookup(Tab, counter),
- aux(Tab, N).
-
-aux(Table, N) ->
- ets:insert(Table, [{counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl
deleted file mode 100644
index cfe0b2b727..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow1.erl
+++ /dev/null
@@ -1,20 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account control flow that might exist.
-
--module(ets_insert_control_flow1).
--export([start/0]).
-
-start() ->
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {random, random:uniform(maria:get_int())}),
- io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, random)),
- case (N rem 2 == 0) of
- true ->
- io:format("\nInserted an even number\n", []),
- io:format("\nWill make it odd\n", []),
- ets:insert(foo, {random, N+1});
- false -> ok
- end,
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, random),
- io:format("Random odd integer: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl
deleted file mode 100644
index d160418bdb..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow2.erl
+++ /dev/null
@@ -1,26 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account control flow that might exist.
-
--module(ets_insert_control_flow2).
--export([start/0]).
-
-start() ->
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {random, random:uniform(150)}),
- io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, random)),
- case (N rem 2 == 0) of
- true ->
- io:format("\nInserted an even integer\n", []),
- io:format("\nWill make it odd and generate password\n", []),
- ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}]);
- false ->
- io:format("\nInserted an odd integer\n", []),
- io:format("\nWill make it even and generate password\n", []),
- ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}])
- end,
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, pass),
- io:format("New password: ~w\n", [ObjectList]).
-
-generate_password(N) ->
- lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl
deleted file mode 100644
index 9c6a22eb05..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow3.erl
+++ /dev/null
@@ -1,31 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account control flow that might exist.
-
--module(ets_insert_control_flow3).
--export([start/1]).
-
-start(User) ->
- Table = ets:new(table, [public]),
- mod:process(Table),
- [{_, N}] =
- case User of
- root -> ets:lookup(Table, root);
- user -> ets:lookup(Table, user);
- Other -> [{undefined, -1}]
- end,
- case N of
- -1 -> io:format("\nUnknown User\n", []);
- 0 ->
- case User of
- root ->
- ets:insert(Table, {User, Pass = generate_password(N) ++ generate_password(N+1)});
- user ->
- ets:insert(Table, {User, Pass = generate_password(N)})
- end,
- io:format("\nYour new pass is ~w\n", [Pass]);
- P ->
- io:format("\nYour pass is ~w\n", [P])
- end.
-
-generate_password(N) ->
- lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl
deleted file mode 100644
index caa3804614..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow4.erl
+++ /dev/null
@@ -1,31 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account control flow that might exist.
-
--module(ets_insert_control_flow4).
--export([start/1]).
-
-start(User) ->
- Table = ets:new(table, [public]),
- mod:process(Table),
- [{_, N}] =
- case User of
- root -> ets:lookup(Table, pass);
- user -> ets:lookup(Table, pass);
- _Other -> [{undefined, -1}]
- end,
- case N of
- -1 -> io:format("\nUnknown User\n", []);
- 0 ->
- case User of
- root ->
- ets:insert(Table, {pass, Pass = generate_password(N) ++ generate_password(N+1)});
- user ->
- ets:insert(Table, {pass, Pass = generate_password(N)})
- end,
- io:format("\nYour new pass is ~w\n", [Pass]);
- P ->
- io:format("\nYour pass is ~w\n", [P])
- end.
-
-generate_password(N) ->
- lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl
deleted file mode 100644
index b19fd776ec..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_control_flow5.erl
+++ /dev/null
@@ -1,34 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account control flow that might exist.
-
--module(ets_insert_control_flow5).
--export([start/1]).
-
-start(User) ->
- Table = ets:new(table, [public]),
- mod:process(Table),
- [{_, N}] =
- case User of
- root -> ets:lookup(Table, pass);
- user -> ets:lookup(Table, pass);
- Other -> [{undefined, -1}]
- end,
- [{_, Msg}] = ets:lookup(Table, welcome_msg),
- case N of
- -1 -> io:format("\nUnknown User\n", []);
- 0 ->
- case User of
- root ->
- ets:insert(Table, {welcome_msg, Msg ++ "root"}),
- ets:insert(Table, {pass, Pass = generate_password(N) ++ generate_password(N+1)});
- user ->
- ets:insert(Table, {welcome_msg, Msg ++ "user"}),
- ets:insert(Table, {pass, Pass = generate_password(N)})
- end,
- io:format("\nYour new pass is ~w\n", [Pass]);
- P ->
- io:format("\nYour pass is ~w\n", [P])
- end.
-
-generate_password(N) ->
- lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl
deleted file mode 100644
index 7b2dbb8eff..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race1.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between ets:lookup/
-%% ets:insert is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(ets_insert_diff_atoms_race1).
--export([test/0]).
-
-test() ->
- ets:new(foo, [named_table, public]),
- {race(foo), no_race(foo)}.
-
-race(Tab) ->
- [{_, N}] = ets:lookup(Tab, counter),
- aux(Tab, N).
-
-no_race(Tab) ->
- [{_, N}] = ets:lookup(Tab, counter),
- AnotherTab = bar,
- aux(AnotherTab, N).
-
-aux(Table, N) ->
- ets:insert(Table, [{counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl
deleted file mode 100644
index d7afc79d07..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race2.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between ets:lookup/
-%% ets:insert is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(ets_insert_diff_atoms_race2).
--export([test/0]).
-
-test() ->
- ets:new(foo, [named_table, public]),
- {race(foo, counter), no_race(foo, counter)}.
-
-race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- aux(Tab, Counter, N).
-
-no_race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- AnotherTab = bar,
- aux(AnotherTab, Counter, N).
-
-aux(Table, Counter, N) ->
- ets:insert(Table, [{Counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl
deleted file mode 100644
index e05e9be54b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race3.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between ets:lookup/
-%% ets:insert is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(ets_insert_diff_atoms_race3).
--export([test/0]).
-
-test() ->
- ets:new(foo, [named_table, public]),
- {race(foo), no_race(foo)}.
-
-race(Tab) ->
- [{_, N}] = ets:lookup(Tab, counter),
- aux(Tab, N).
-
-no_race(Tab) ->
- [{_, N}] = ets:lookup(Tab, counter),
- AnotherTab = bar,
- aux(AnotherTab, N).
-
-aux(Table, N) ->
- ets:insert(Table, {counter, N+1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl
deleted file mode 100644
index e2a3588f41..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race4.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between ets:lookup/
-%% ets:insert is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(ets_insert_diff_atoms_race4).
--export([test/0]).
-
-test() ->
- ets:new(foo, [named_table, public]),
- {race(foo, counter), no_race(foo, counter)}.
-
-race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- aux(Tab, Counter, N).
-
-no_race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- AnotherTab = bar,
- aux(AnotherTab, Counter, N).
-
-aux(Table, Counter, N) ->
- ets:insert(Table, {Counter, N+1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl
deleted file mode 100644
index dd53387c11..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race5.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between ets:lookup/
-%% ets:insert is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(ets_insert_diff_atoms_race5).
--export([test/0]).
-
-test() ->
- ets:new(foo, [named_table, public]),
- {race(foo, counter), no_race(foo, counter)}.
-
-race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- aux(Tab, Counter, N).
-
-no_race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- AnotherCounter = index,
- aux(Tab, AnotherCounter, N).
-
-aux(Table, Counter, N) ->
- ets:insert(Table, [{Counter, N+1}]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl
deleted file mode 100644
index ec0a0eaadf..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_diff_atoms_race6.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between ets:lookup/
-%% ets:insert is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(ets_insert_diff_atoms_race6).
--export([test/0]).
-
-test() ->
- ets:new(foo, [named_table, public]),
- {race(foo, counter), no_race(foo, counter)}.
-
-race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- aux(Tab, Counter, N).
-
-no_race(Tab, Counter) ->
- [{_, N}] = ets:lookup(Tab, Counter),
- AnotherCounter = index,
- aux(Tab, AnotherCounter, N).
-
-aux(Table, Counter, N) ->
- ets:insert(Table, {Counter, N+1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl
deleted file mode 100644
index d5b6689eb1..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double1.erl
+++ /dev/null
@@ -1,28 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account multiple ets:inserts that might exist.
-
--module(ets_insert_double1).
--export([start/0]).
-
-start() ->
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {random, random:uniform(150)}),
- io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, random)),
- case (N rem 2 == 0) of
- true ->
- io:format("\nInserted an even integer\n", []),
- io:format("\nWill make it odd and generate new password\n", []),
- ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}]);
- false ->
- io:format("\nInserted an odd integer\n", []),
- io:format("\nWill make it even and generate new password\n", []),
- ets:insert(foo, [{random, N+1}, {pass, generate_password(N)}])
- end,
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, pass),
- io:format("New password: ~w\n", [ObjectList]),
- ets:insert(foo, {pass, 'empty'}).
-
-generate_password(N) ->
- [{_, P}] = ets:lookup(foo, pass),
- lists:map(fun (_) -> random:uniform(90)+P+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl
deleted file mode 100644
index fa653e3090..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_double2.erl
+++ /dev/null
@@ -1,28 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account multiple ets:inserts that might exist.
-
--module(ets_insert_double2).
--export([start/2]).
-
-start(Random, Pass) ->
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {Random, random:uniform(150)}),
- io:format("Inserted ~w\n", [{_, N}] = ets:lookup(foo, Random)),
- case (N rem 2 == 0) of
- true ->
- io:format("\nInserted an even integer\n", []),
- io:format("\nWill make it odd and generate new password\n", []),
- ets:insert(foo, [{Random, N+1}, {Pass, generate_password(Pass, N)}]);
- false ->
- io:format("\nInserted an odd integer\n", []),
- io:format("\nWill make it even and generate new password\n", []),
- ets:insert(foo, [{Random, N+1}, {Pass, generate_password(Pass, N)}])
- end,
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, Pass),
- io:format("New password: ~w\n", [ObjectList]),
- ets:insert(foo, {Pass, 'empty'}).
-
-generate_password(Pass, N) ->
- [{_, P}] = ets:lookup(foo, Pass),
- lists:map(fun (_) -> random:uniform(90)+P+$\s+1 end, lists:seq(1,N)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl
deleted file mode 100644
index b6b258fd21..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs1.erl
+++ /dev/null
@@ -1,18 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the anonymous functions.
-
--module(ets_insert_funs1).
--export([start/0]).
-
-start() ->
- F = fun(T) ->
- ets:lookup(T, counter)
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0}),
- io:format("Inserted ~w\n", [{counter, 0}]),
- [{_, N}] = F(foo),
- ets:insert(foo, [{counter, N+1}]),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl
deleted file mode 100644
index 6b9518f314..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_funs2.erl
+++ /dev/null
@@ -1,18 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account the anonymous functions.
-
--module(ets_insert_funs2).
--export([start/0]).
-
-start() ->
- F = fun(T, N) ->
- ets:insert(T, [{counter, N+1}])
- end,
- io:format("Created ~w\n", [ets:new(foo, [named_table, public])]),
- ets:insert(foo, {counter, 0}),
- io:format("Inserted ~w\n", [{counter, 0}]),
- [{_, N}] = ets:lookup(foo, counter),
- F(foo, N),
- io:format("Update complete\n", []),
- ObjectList = ets:lookup(foo, counter),
- io:format("Counter: ~w\n", [ObjectList]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl
deleted file mode 100644
index 63f3272912..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_new.erl
+++ /dev/null
@@ -1,15 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account multiple ets:new calls that might exist.
-
--module(ets_insert_new).
--export([test/0]).
-
-test() ->
- T1 = ets:new(foo, [public]),
- T2 = ets:new(bar, []),
- ets:lookup(T2, counter),
- aux(T1),
- aux(T2).
-
-aux(Tab) ->
- ets:insert(Tab, {counter, 1}).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl
deleted file mode 100644
index a479a31792..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_param.erl
+++ /dev/null
@@ -1,26 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination in higher order functions.
-
--module(ets_insert_param).
--export([start/1]).
-
-start(User) ->
- Table = ets:new(table, [public]),
- mod:process(Table),
- [{_, Msg}] = ets:lookup(Table, welcome_msg),
- case User of
- root ->
- ets:insert(Table, {welcome_msg, Msg ++ "root"}),
- ets:insert(Table, {pass, Pass = generate_password(ets:lookup(Table, pass))
- ++ generate_strong_password(ets:lookup(Table, pass))});
- user ->
- ets:insert(Table, {welcome_msg, Msg ++ "user"}),
- ets:insert(Table, {pass, Pass = generate_password(ets:lookup(Table, pass))})
- end,
- io:format("\nYour new pass is ~w\n", [Pass]).
-
-generate_password([{_, N}]) ->
- lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,N)).
-
-generate_strong_password([{_, N}]) ->
- lists:map(fun (_) -> random:uniform(90)+$\s+1 end, lists:seq(1,(N rem 2) * 5)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl b/lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl
deleted file mode 100644
index 4caa9fe8a0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/ets_insert_public.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests the presence of possible races due to an ets:lookup/ets:insert
-%% combination. It takes into account any public ETS tables that might exist.
-
--module(ets_insert_public).
-
--export([main/1]).
-
-%% Main
-main(Foo) ->
- make_table(Foo),
- ets:insert(Foo, {counter, 0}),
- [{_, N}] = ets:lookup(Foo, counter),
- NewN = N + 1,
- ets:insert(Foo, {counter, NewN}),
- NewN.
-
-make_table(Foo) ->
- init(Foo).
-
-init(Foo) ->
- ets:new(Foo, [named_table, public]),
- ets:insert(Foo, {counter, 0}),
- {ok, feeling_good}.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl b/lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl
deleted file mode 100644
index 76ffca4676..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/extract_translations.erl
+++ /dev/null
@@ -1,293 +0,0 @@
-%%%----------------------------------------------------------------------
-%%% File : extract_translations.erl
-%%% Author : Sergei Golovan <sgolovan@nes.ru>
-%%% Purpose : Auxiliary tool for interface/messages translators
-%%% Created : 23 Apr 2005 by Sergei Golovan <sgolovan@nes.ru>
-%%% Id : $Id: extract_translations.erl,v 1.1 2009/08/17 09:18:59 maria Exp $
-%%%----------------------------------------------------------------------
-
--module(extract_translations).
--author('sgolovan@nes.ru').
-
--export([start/0]).
-
--define(STATUS_SUCCESS, 0).
--define(STATUS_ERROR, 1).
--define(STATUS_USAGE, 2).
-
--include_lib("kernel/include/file.hrl").
-
-
-start() ->
- ets:new(translations, [named_table, public]),
- ets:new(translations_obsolete, [named_table, public]),
- ets:new(files, [named_table, public]),
- ets:new(vars, [named_table, public]),
- case init:get_plain_arguments() of
- ["-srcmsg2po", Dir, File] ->
- print_po_header(File),
- Status = process(Dir, File, srcmsg2po),
- halt(Status);
- ["-unused", Dir, File] ->
- Status = process(Dir, File, unused),
- halt(Status);
- [Dir, File] ->
- Status = process(Dir, File, used),
- halt(Status);
- _ ->
- print_usage(),
- halt(?STATUS_USAGE)
- end.
-
-
-process(Dir, File, Used) ->
- case load_file(File) of
- {error, Reason} ->
- io:format("~s: ~s~n", [File, file:format_error(Reason)]),
- ?STATUS_ERROR;
- _ ->
- FileList = find_src_files(Dir),
- lists:foreach(
- fun(F) ->
- parse_file(Dir, F, Used)
- end, FileList),
- case Used of
- unused ->
- ets:foldl(fun({Key, _}, _) ->
- io:format("~p~n", [Key])
- end, ok, translations);
- srcmsg2po ->
- ets:foldl(fun({Key, Trans}, _) ->
- print_translation_obsolete(Key, Trans)
- end, ok, translations_obsolete);
- _ ->
- ok
- end,
- ?STATUS_SUCCESS
- end.
-
-parse_file(Dir, File, Used) ->
- ets:delete_all_objects(vars),
- case epp:parse_file(File, [Dir, filename:dirname(File) | code:get_path()], []) of
- {ok, Forms} ->
- lists:foreach(
- fun(F) ->
- parse_form(Dir, File, F, Used)
- end, Forms);
- _ ->
- ok
- end.
-
-parse_form(Dir, File, Form, Used) ->
- case Form of
- %%{undefined, Something} ->
- %% io:format("Undefined: ~p~n", [Something]);
- {call,
- _,
- {remote, _, {atom, _, translate}, {atom, _, translate}},
- [_, {string, Line, Str}]
- } ->
- process_string(Dir, File, Line, Str, Used);
- {call,
- _,
- {remote, _, {atom, _, translate}, {atom, _, translate}},
- [_, {var, _, Name}]
- } ->
- case ets:lookup(vars, Name) of
- [{_Name, Value, Line}] ->
- process_string(Dir, File, Line, Value, Used);
- _ ->
- ok
- end;
- {match,
- _,
- {var, _, Name},
- {string, Line, Value}
- } ->
- ets:insert(vars, {Name, Value, Line});
- L when is_list(L) ->
- lists:foreach(
- fun(F) ->
- parse_form(Dir, File, F, Used)
- end, L);
- T when is_tuple(T) ->
- lists:foreach(
- fun(F) ->
- parse_form(Dir, File, F, Used)
- end, tuple_to_list(T));
- _ ->
- ok
- end.
-
-process_string(_Dir, _File, _Line, "", _Used) ->
- ok;
-
-process_string(_Dir, File, Line, Str, Used) ->
- case {ets:lookup(translations, Str), Used} of
- {[{_Key, _Trans}], unused} ->
- ets:delete(translations, Str);
- {[{_Key, _Trans}], used} ->
- ok;
- {[{_Key, Trans}], srcmsg2po} ->
- ets:delete(translations_obsolete, Str),
- print_translation(File, Line, Str, Trans);
- {_, used} ->
- case ets:lookup(files, File) of
- [{_}] ->
- ok;
- _ ->
- io:format("~n% ~s~n", [File]),
- ets:insert(files, {File})
- end,
- case Str of
- [] -> ok;
- _ -> io:format("{~p, \"\"}.~n", [Str])
- end,
- ets:insert(translations, {Str, ""});
- {_, srcmsg2po} ->
- case ets:lookup(files, File) of
- [{_}] ->
- ok;
- _ ->
- ets:insert(files, {File})
- end,
- ets:insert(translations, {Str, ""}),
- print_translation(File, Line, Str, "");
- _ ->
- ok
- end.
-
-load_file(File) ->
- case file:consult(File) of
- {ok, Terms} ->
- lists:foreach(
- fun({Orig, Trans}) ->
- case Trans of
- "" ->
- ok;
- _ ->
- ets:insert(translations, {Orig, Trans}),
- ets:insert(translations_obsolete, {Orig, Trans})
- end
- end, Terms);
- Err ->
- Err
- end.
-
-find_src_files(Dir) ->
- case file:list_dir(Dir) of
- {ok, FileList} ->
- recurse_filelist(
- lists:map(
- fun(F) ->
- filename:join(Dir, F)
- end, FileList));
- _ ->
- []
- end.
-
-recurse_filelist(FileList) ->
- recurse_filelist(FileList, []).
-
-recurse_filelist([], Acc) ->
- lists:reverse(Acc);
-
-recurse_filelist([H | T], Acc) ->
- case file:read_file_info(H) of
- {ok, #file_info{type = directory}} ->
- recurse_filelist(T, lists:reverse(find_src_files(H)) ++ Acc);
- {ok, #file_info{type = regular}} ->
- case string:substr(H, string:len(H) - 3) of
- ".erl" ->
- recurse_filelist(T, [H | Acc]);
- ".hrl" ->
- recurse_filelist(T, [H | Acc]);
- _ ->
- recurse_filelist(T, Acc)
- end;
- _ ->
- recurse_filelist(T, Acc)
- end.
-
-
-print_usage() ->
- io:format(
- "Usage: extract_translations [-unused] dir file~n"
- "~n"
- "Example:~n"
- " extract_translations . ./msgs/ru.msg~n"
- ).
-
-
-%%%
-%%% Gettext
-%%%
-
-print_po_header(File) ->
- MsgProps = get_msg_header_props(File),
- {Language, [LastT | AddT]} = prepare_props(MsgProps),
- application:load(ejabberd),
- {ok, Version} = application:get_key(ejabberd, vsn),
- print_po_header(Version, Language, LastT, AddT).
-
-get_msg_header_props(File) ->
- {ok, F} = file:open(File, [read]),
- Lines = get_msg_header_props(F, []),
- file:close(F),
- Lines.
-
-get_msg_header_props(F, Lines) ->
- String = io:get_line(F, ""),
- case io_lib:fread("% ", String) of
- {ok, [], RemString} ->
- case io_lib:fread("~s", RemString) of
- {ok, [Key], Value} when Value /= "\n" ->
- %% The first character in Value is a blankspace:
- %% And the last characters are 'slash n'
- ValueClean = string:substr(Value, 2, string:len(Value)-2),
- get_msg_header_props(F, Lines ++ [{Key, ValueClean}]);
- _ ->
- get_msg_header_props(F, Lines)
- end;
- _ ->
- Lines
- end.
-
-prepare_props(MsgProps) ->
- Language = proplists:get_value("Language:", MsgProps),
- Authors = proplists:get_all_values("Author:", MsgProps),
- {Language, Authors}.
-
-print_po_header(Version, Language, LastTranslator, AdditionalTranslatorsList) ->
- AdditionalTranslatorsString = build_additional_translators(AdditionalTranslatorsList),
- HeaderString =
- "msgid \"\"\n"
- "msgstr \"\"\n"
- "\"Project-Id-Version: " ++ Version ++ "\\n\"\n"
- ++ "\"X-Language: " ++ Language ++ "\\n\"\n"
- "\"Last-Translator: " ++ LastTranslator ++ "\\n\"\n"
- ++ AdditionalTranslatorsString ++
- "\"MIME-Version: 1.0\\n\"\n"
- "\"Content-Type: text/plain; charset=UTF-8\\n\"\n"
- "\"Content-Transfer-Encoding: 8bit\\n\"\n",
- io:format("~s~n", [HeaderString]).
-
-build_additional_translators(List) ->
- lists:foldl(
- fun(T, Str) ->
- Str ++ "\"X-Additional-Translator: " ++ T ++ "\\n\"\n"
- end,
- "",
- List).
-
-print_translation(File, Line, Str, StrT) ->
- {ok, StrQ, _} = regexp:gsub(Str, "\"", "\\\""),
- {ok, StrTQ, _} = regexp:gsub(StrT, "\"", "\\\""),
- io:format("#: ~s:~p~nmsgid \"~s\"~nmsgstr \"~s\"~n~n", [File, Line, StrQ, StrTQ]).
-
-print_translation_obsolete(Str, StrT) ->
- File = "unknown.erl",
- Line = 1,
- {ok, StrQ, _} = regexp:gsub(Str, "\"", "\\\""),
- {ok, StrTQ, _} = regexp:gsub(StrT, "\"", "\\\""),
- io:format("#: ~s:~p~n#~~ msgid \"~s\"~n#~~ msgstr \"~s\"~n~n", [File, Line, StrQ, StrTQ]).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl
deleted file mode 100644
index 2f499208a2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race1.erl
+++ /dev/null
@@ -1,33 +0,0 @@
-%% This tests that the race condition detection between mnesia:dirty_read/
-%% mnesia:dirty_write is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(mnesia_diff_atoms_race1).
--export([test/2]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-test(Eno, Raise) ->
- {race(employee, Eno, Raise), no_race(employee, Eno, Raise)}.
-
-race(Tab, Eno, Raise) ->
- [E] = mnesia:dirty_read(Tab, Eno),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- aux(Tab, New).
-
-no_race(Tab, Eno, Raise) ->
- [E] = mnesia:dirty_read(Tab, Eno),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- AnotherTab = employer,
- aux(AnotherTab, New).
-
-
-aux(Table, Record) ->
- mnesia:dirty_write(Table, Record).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl
deleted file mode 100644
index c1dcfbd8f5..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_diff_atoms_race2.erl
+++ /dev/null
@@ -1,37 +0,0 @@
-%% This tests that the race condition detection between mnesia:dirty_read/
-%% mnesia:dirty_write is robust even when the functions are called with
-%% different atoms as arguments.
-
--module(mnesia_diff_atoms_race2).
--export([test/2]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
--record(employer, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-test(Eno, Raise) ->
- {race(employee, Eno, Raise), no_race(employee, Eno, Raise)}.
-
-race(Tab, Eno, Raise) ->
- [E] = mnesia:dirty_read(Tab, Eno),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- aux(New).
-
-no_race(Tab, Eno, Raise) ->
- [E] = mnesia:dirty_read(Tab, Eno),
- AnotherRecord = #employer{},
- aux(AnotherRecord).
-
-aux(Record) ->
- mnesia:dirty_write(Record).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl
deleted file mode 100644
index 4ca62deedc..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_one_write_two.erl
+++ /dev/null
@@ -1,20 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account the argument types
-%% of the calls.
-
--module(mnesia_dirty_read_one_write_two).
--export([raise/2]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise) ->
- [E] = mnesia:dirty_read({employee, Eno}),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl
deleted file mode 100644
index e523a03789..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_two_write_one.erl
+++ /dev/null
@@ -1,20 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account the argument types
-%% of the calls.
-
--module(mnesia_dirty_read_two_write_one).
--export([raise/2]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise) ->
- [E] = mnesia:dirty_read(employee, Eno),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl
deleted file mode 100644
index 2bd18e4772..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double1.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account multiple
-%% mnesia:dirty_writes that might exist.
-
--module(mnesia_dirty_read_write_double1).
--export([raise/3]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise, Room) ->
- [E] = mnesia:dirty_read(employee, Eno),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(employee, New),
- move(E, Room).
-
-move(E, Room) ->
- New = E#employee{room_no = Room},
- mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl
deleted file mode 100644
index cdbfdc700a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double2.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account multiple
-%% mnesia:dirty_writes that might exist.
-
--module(mnesia_dirty_read_write_double2).
--export([raise/3]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise, Room) ->
- [E] = mnesia:dirty_read({employee, Eno}),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(New),
- move(E, Room).
-
-move(E, Room) ->
- New = E#employee{room_no = Room},
- mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl
deleted file mode 100644
index 051524917e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double3.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account multiple
-%% mnesia:dirty_writes that might exist.
-
--module(mnesia_dirty_read_write_double3).
--export([raise/3]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise, Room) ->
- [E] = mnesia:dirty_read({employee, Eno}),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(employee, New),
- move(E, Room).
-
-move(E, Room) ->
- New = E#employee{room_no = Room},
- mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl
deleted file mode 100644
index 96752a6045..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_double4.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account multiple
-%% mnesia:dirty_writes that might exist.
-
--module(mnesia_dirty_read_write_double4).
--export([raise/3]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise, Room) ->
- [E] = mnesia:dirty_read(employee, Eno),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(New),
- move(E, Room).
-
-move(E, Room) ->
- New = E#employee{room_no = Room},
- mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl
deleted file mode 100644
index aee6433736..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_one.erl
+++ /dev/null
@@ -1,20 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account the argument types
-%% of the calls.
-
--module(mnesia_dirty_read_write_one).
--export([raise/2]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise) ->
- [E] = mnesia:dirty_read({employee, Eno}),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl b/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl
deleted file mode 100644
index 037aeddafd..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/mnesia_dirty_read_write_two.erl
+++ /dev/null
@@ -1,20 +0,0 @@
-%% This tests the presence of possible races due to an mnesia:dirty_read/
-%% mnesia:dirty_write combination. It takes into account the argument types
-%% of the calls.
-
--module(mnesia_dirty_read_write_two).
--export([raise/2]).
-
--record(employee, {emp_no,
- name,
- salary,
- sex,
- phone,
- room_no}).
-
-
-raise(Eno, Raise) ->
- [E] = mnesia:dirty_read(employee, Eno),
- Salary = E#employee.salary + Raise,
- New = E#employee{salary = Salary},
- mnesia:dirty_write(employee, New).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl
deleted file mode 100644
index e65f6c3e23..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow1.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination. It takes into account control flow that might exist.
-
--module(whereis_control_flow1).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false -> register(AnAtom, Pid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl
deleted file mode 100644
index 41039482c9..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow2.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination. It takes into account control flow that might exist.
-
--module(whereis_control_flow2).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true ->
- io:format("self",[]),
- register(AnAtom, Pid);
- false -> register(AnAtom, Pid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl
deleted file mode 100644
index 94f8445fad..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow3.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination. It takes into account control flow that might exist.
-
--module(whereis_control_flow3).
--export([start/3]).
-
-start(AnAtom, Fun, FunName) ->
- Pid =
- case FunName of
- master ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end;
- slave ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end
- end,
- register(AnAtom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl
deleted file mode 100644
index 2a59760789..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow4.erl
+++ /dev/null
@@ -1,29 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination. It takes into account control flow that might exist.
-
--module(whereis_control_flow4).
--export([start/1]).
-
-start(Fun) ->
- case whereis(maria) of
- undefined ->
- Pid1 = spawn(Fun),
- case Pid1 =:= self() of
- true ->
- case whereis(kostis) of
- undefined ->
- Pid2 = spawn(Fun),
- case Pid2 =:= self() of
- true ->
- register(maria, Pid1),
- register(kostis, Pid2);
- false -> ok
- end;
- P when is_pid(P) ->
- ok
- end;
- false -> ok
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl
deleted file mode 100644
index 8de9cb2dad..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow5.erl
+++ /dev/null
@@ -1,12 +0,0 @@
-%% This tests the presence of possible races due to a whereis/unregister
-%% combination. It takes into account control flow that might exist.
-
--module(whereis_control_flow5).
--export([start/1]).
-
-start(AnAtom) ->
- case whereis(AnAtom) of
- undefined -> ok;
- P when is_pid(P) ->
- unregister(AnAtom)
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl
deleted file mode 100644
index 03c5095a50..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_control_flow6.erl
+++ /dev/null
@@ -1,12 +0,0 @@
-%% This tests the presence of possible races due to a whereis/unregister
-%% combination. It takes into account control flow that might exist.
-
--module(whereis_control_flow6).
--export([start/0]).
-
-start() ->
- case whereis(kostis) of
- undefined -> ok;
- P when is_pid(P) ->
- unregister(kostis)
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl
deleted file mode 100644
index 704ee6015d..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_no_race.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust even when the functions are called with different atoms
-%% as arguments.
-
--module(whereis_diff_atoms_no_race).
--export([test/0]).
-
-test() ->
- Fun = fun () -> foo end,
- {no_race(maria, Fun)}.
-
-no_race(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- AnotherAtom = kostis,
- aux(AnotherAtom, Pid);
- P when is_pid(P) ->
- ok
- end.
-
-aux(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl
deleted file mode 100644
index 6c834caa0c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_atoms_race.erl
+++ /dev/null
@@ -1,34 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust even when the functions are called with different atoms
-%% as arguments.
-
--module(whereis_diff_atoms_race).
--export([test/0]). %, race/1, no_race/1]).
-
-test() ->
- Fun = fun () -> foo end,
- {race(maria, Fun), no_race(maria, Fun)}.
-
-race(AnAtom, Fun) ->
- %AnAtom = maria,
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- aux(AnAtom, Pid);
- P when is_pid(P) ->
- ok
- end.
-
-no_race(AnAtom, Fun) ->
- %AnAtom = maria,
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- AnotherAtom = kostis,
- aux(AnotherAtom, Pid);
- P when is_pid(P) ->
- ok
- end.
-
-aux(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl
deleted file mode 100644
index 6a1c197c06..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions1).
--export([start/2]).
-
-continue(Fun) ->
- case whereis(master) of
- undefined ->
- register(master, spawn(Fun));
- _ -> ok
- end.
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- register(AnAtom, Pid);
- _ ->
- ok
- end,
- continue(Fun).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl
deleted file mode 100644
index 4967dec133..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_nested.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions1_nested).
--export([test/2]).
-
-test(AnAtom, Fun) ->
- start(AnAtom, Fun).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- race1(AnAtom, Pid);
- P when is_pid(P) ->
- true
- end.
-
-race1(Atom, Pid) ->
- race2(Atom, Pid).
-
-race2(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl
deleted file mode 100644
index ff6506eee8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_pathsens.erl
+++ /dev/null
@@ -1,32 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-%% It takes into account control flow that might exist.
-
--module(whereis_diff_functions1_pathsens).
--export([test/1]).
-
-test(FunName) ->
- start(kostis, mod:function(), FunName).
-
-start(AnAtom, Fun, FunName) ->
- Pid =
- case FunName of
- master ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end;
- slave ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end
- end,
- race(AnAtom, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl
deleted file mode 100644
index dd395bb6d8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions1_twice.erl
+++ /dev/null
@@ -1,30 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having multiple calls in separate functions.
-
--module(whereis_diff_functions1_twice).
--export([test/2]).
-
-test(AnAtom, Fun) ->
- start(AnAtom, Fun).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid1 = spawn(Fun),
- race(AnAtom, Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- race_again(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end;
- P when is_pid(P) ->
- true
- end.
-
-race(Atom, Pid) ->
- register(Atom, Pid).
-
-race_again(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl
deleted file mode 100644
index eaf98291ed..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions2).
--export([test/0]).
-
-test() ->
- start(kostis, mod:function()).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- race(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl
deleted file mode 100644
index 5ae8784389..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_nested.erl
+++ /dev/null
@@ -1,20 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions2_nested).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- race1(AnAtom, Pid);
- P when is_pid(P) ->
- true
- end.
-
-race1(Atom, Pid) ->
- race2(Atom, Pid).
-
-race2(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl
deleted file mode 100644
index e9ce4bc48e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_pathsens.erl
+++ /dev/null
@@ -1,29 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-%% It takes into account control flow that might exist.
-
--module(whereis_diff_functions2_pathsens).
--export([race/4]).
-
-start(AnAtom, Fun, FunName) ->
- Pid =
- case FunName of
- master ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end;
- slave ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end
- end.
-
-race(Atom, Fun, FunName, Pid) ->
- start(Atom, Fun, FunName),
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl
deleted file mode 100644
index d5efe631b8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions2_twice.erl
+++ /dev/null
@@ -1,27 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having multiple calls in separate functions.
-
--module(whereis_diff_functions2_twice).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid1 = spawn(Fun),
- race(AnAtom, Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- race_again(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end;
- P when is_pid(P) ->
- true
- end.
-
-race(Atom, Pid) ->
- register(Atom, Pid).
-
-race_again(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl
deleted file mode 100644
index 093f02a06f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions3).
--export([start/1]).
-
-start(AnAtom) ->
- register(AnAtom, race(AnAtom)).
-
-race(Atom) ->
- whereis(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl
deleted file mode 100644
index 5c28fc74f6..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_nested.erl
+++ /dev/null
@@ -1,21 +0,0 @@
-%% This tests that the race condition detection between whereis/unregister
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions3_nested).
--export([test/1]).
-
-test(AnAtom) ->
- start(AnAtom).
-
-start(AnAtom) ->
- case whereis(AnAtom) of
- undefined -> true;
- P when is_pid(P) ->
- race1(AnAtom)
- end.
-
-race1(Atom) ->
- race2(Atom).
-
-race2(Atom) ->
- unregister(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl
deleted file mode 100644
index a3a245b9ea..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions3_pathsens.erl
+++ /dev/null
@@ -1,29 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-%% It takes into account control flow that might exist.
-
--module(whereis_diff_functions3_pathsens).
--export([start/3]).
-
-start(AnAtom, Fun, FunName) ->
- Pid =
- case FunName of
- master ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end;
- slave ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end
- end,
- race(AnAtom, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl
deleted file mode 100644
index e40483d487..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions4.erl
+++ /dev/null
@@ -1,32 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions4).
--export([test/2]).
-
-test(AnAtom, Fun) ->
- start(AnAtom, Fun).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- race(AnAtom, Pid2),
- case whereis(AnAtom) of
- undefined ->
- Pid3 = spawn(Fun),
- race(AnAtom, Pid3);
- P when is_pid(P) ->
- true
- end;
- P when is_pid(P) ->
- true
- end.
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl
deleted file mode 100644
index a2c4352803..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions5.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions5).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- race(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl
deleted file mode 100644
index f016d79533..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_functions6.erl
+++ /dev/null
@@ -1,29 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions.
-
--module(whereis_diff_functions6).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- race(AnAtom, Pid2),
- case whereis(AnAtom) of
- undefined ->
- Pid3 = spawn(Fun),
- race(AnAtom, Pid3);
- P when is_pid(P) ->
- true
- end;
- P when is_pid(P) ->
- true
- end.
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl
deleted file mode 100644
index 00cb29cec0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules1.erl
+++ /dev/null
@@ -1,16 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules1).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_diff_modules2:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- whereis_diff_modules2:race(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl
deleted file mode 100644
index e5f6fdeb7b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1/whereis_diff_modules2.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules2).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl
deleted file mode 100644
index a5f1d4d3c7..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules1_pathsens.erl
+++ /dev/null
@@ -1,26 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules (backward analysis).
-%% It takes into account control flow that might exist.
-
--module(whereis_diff_modules1_pathsens).
--export([start/3]).
-
-start(AnAtom, Fun, FunName) ->
- Pid =
- case FunName of
- master ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end;
- slave ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end
- end,
- whereis_diff_modules2_pathsens:race(AnAtom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl
deleted file mode 100644
index d24d13976b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_pathsens/whereis_diff_modules2_pathsens.erl
+++ /dev/null
@@ -1,12 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules (backward analysis).
-%% It takes into account control flow that might exist.
-
--module(whereis_diff_modules2_pathsens).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl
deleted file mode 100644
index a397954eea..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules1_rec.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in an indirectly recursive inter-modular function.
-
--module(whereis_diff_modules1_rec).
--export([start/4]).
-
-start(AnAtom, NextAtom, Fun, Id) ->
- case AnAtom of
- undefined -> register(start, Id);
- _ -> register(AnAtom, Id)
- end,
- case whereis(NextAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- whereis_diff_modules2_rec:continue(NextAtom, mod:next(), Pid, Id)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl
deleted file mode 100644
index 4b46b4a8e5..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules1_rec/whereis_diff_modules2_rec.erl
+++ /dev/null
@@ -1,8 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in a recursive function.
-
--module(whereis_diff_modules2_rec).
--export([continue/4]).
-
-continue(Atom, NextAtom, Fun, Id) ->
- whereis_diff_modules1_rec:start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl
deleted file mode 100644
index 60b5a1d378..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules3.erl
+++ /dev/null
@@ -1,8 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules3).
--export([start/1]).
-
-start(AnAtom) ->
- register(AnAtom, whereis_diff_modules4:race(AnAtom)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl
deleted file mode 100644
index 1ab4fbf8d8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2/whereis_diff_modules4.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules4).
--export([no_race/1, race/1]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom) ->
- whereis(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl
deleted file mode 100644
index cb2f85a103..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules3_pathsens.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules (forward analysis).
-%% It takes into account control flow that might exist.
-
--module(whereis_diff_modules3_pathsens).
--export([start/3]).
-
-start(AnAtom, Fun, FunName) ->
- Pid =
- case FunName of
- master ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end;
- slave ->
- case whereis(AnAtom) of
- undefined ->
- spawn(Fun);
- P when is_pid(P) ->
- P
- end
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl
deleted file mode 100644
index 952f9312f4..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_pathsens/whereis_diff_modules4_pathsens.erl
+++ /dev/null
@@ -1,13 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules (forward analysis).
-%% It takes into account control flow that might exist.
-
--module(whereis_diff_modules4_pathsens).
--export([no_race/1, race/4]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Fun, FunName, Pid) ->
- whereis_diff_modules3_pathsens:start(Atom, Fun, FunName),
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl
deleted file mode 100644
index 0320140768..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules3_rec.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in an indirectly recursive inter-modular function.
-
--module(whereis_diff_modules3_rec).
--export([test/0, start/4]).
-
-test() ->
- start(undefined, second, mod:f(), self()).
-
-start(AnAtom, NextAtom, Fun, Id) ->
- case AnAtom of
- undefined -> register(start, Id);
- _ -> register(AnAtom, Id)
- end,
- case whereis(NextAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- whereis_diff_modules4_rec:continue(NextAtom, mod:next(), Pid, Id)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl
deleted file mode 100644
index d49c59ed5c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules2_rec/whereis_diff_modules4_rec.erl
+++ /dev/null
@@ -1,8 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in a recursive function.
-
--module(whereis_diff_modules4_rec).
--export([continue/4]).
-
-continue(Atom, NextAtom, Fun, Id) ->
- whereis_diff_modules3_rec:start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl
deleted file mode 100644
index 591732aa31..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules5.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules5).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_diff_modules6:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- whereis_diff_modules6:race(AnAtom, Pid2),
- case whereis(AnAtom) of
- undefined ->
- Pid3 = spawn(Fun),
- whereis_diff_modules6:race(AnAtom, Pid3);
- P when is_pid(P) ->
- true
- end;
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl
deleted file mode 100644
index 159d96cfc5..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules3/whereis_diff_modules6.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules6).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl
deleted file mode 100644
index a25d2f8784..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules1_nested.erl
+++ /dev/null
@@ -1,14 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules1_nested).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- whereis_diff_modules2_nested:race(AnAtom, Pid);
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl
deleted file mode 100644
index 32a55e731a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules2_nested.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules2_nested).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- whereis_diff_modules3_nested:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl
deleted file mode 100644
index 414129611f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_nested/whereis_diff_modules3_nested.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules3_nested).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl
deleted file mode 100644
index 92f2cb1fbc..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules1_twice.erl
+++ /dev/null
@@ -1,21 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having multiple calls in separate modules.
-
--module(whereis_diff_modules1_twice).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid1 = spawn(Fun),
- whereis_diff_modules2_twice:race(AnAtom, Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- whereis_diff_modules2_twice:race_again(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end;
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl
deleted file mode 100644
index 390c0dcc94..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_modules_twice/whereis_diff_modules2_twice.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate modules.
-
--module(whereis_diff_modules2_twice).
--export([race/2, race_again/2]).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
-
-race_again(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl
deleted file mode 100644
index 8466004ce4..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_no_race.erl
+++ /dev/null
@@ -1,13 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust even when the functions are called with different variables
-%% as arguments.
-
--module(whereis_diff_vars_no_race).
--export([test/3]).
-
-test(AnAtom, AnotherAtom, Pid) ->
- {aux(AnAtom, Pid), aux(AnotherAtom, Pid)}.
-
-aux(Atom, Pid) ->
- register(Atom, Pid),
- whereis(Atom).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl
deleted file mode 100644
index 90791de1b2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_diff_vars_race.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust even when the functions are called with different variables
-%% as arguments.
-
--module(whereis_diff_vars_race).
--export([test/2]).
-
-test(AnAtom, AnotherAtom) ->
- Fun = fun () -> foo end,
- {aux(AnAtom, AnotherAtom, Fun), aux(AnotherAtom, AnAtom, Fun)}.
-
-aux(Atom1, Atom2, Fun) ->
- case whereis(Atom1) of
- undefined ->
- Pid = spawn(Fun),
- register(Atom2, Pid);
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl
deleted file mode 100644
index 677551c99d..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module1.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module1).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_intra_inter_module2:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- continue(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
-
-continue(Atom, Pid) ->
- whereis_intra_inter_module2:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl
deleted file mode 100644
index e7acee0cfd..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module1/whereis_intra_inter_module2.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module2).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl
deleted file mode 100644
index c8103db122..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module3.erl
+++ /dev/null
@@ -1,16 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module3).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_intra_inter_module4:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- whereis_intra_inter_module4:race(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl
deleted file mode 100644
index 4094a95223..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module2/whereis_intra_inter_module4.erl
+++ /dev/null
@@ -1,14 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module4).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- continue(Atom, Pid).
-
-continue(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl
deleted file mode 100644
index 2a29779153..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module5.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module5).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_intra_inter_module6:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- continue(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
-
-continue(Atom, Pid) ->
- whereis_intra_inter_module6:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl
deleted file mode 100644
index cd05431cd5..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module3/whereis_intra_inter_module6.erl
+++ /dev/null
@@ -1,14 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module6).
--export([no_race/1, race/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- continue(Atom, Pid).
-
-continue(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl
deleted file mode 100644
index 1f702e7af3..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module7.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module7).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- register(AnAtom, continue(AnAtom, Fun)).
-
-continue(AnAtom, Fun) ->
- whereis_intra_inter_module8:continue(AnAtom, Fun).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl
deleted file mode 100644
index 581817308b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module4/whereis_intra_inter_module8.erl
+++ /dev/null
@@ -1,13 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module8).
--export([continue/2]).
-
-continue(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun);
- P when is_pid(P) ->
- P
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl
deleted file mode 100644
index 7ed50ea742..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module10.erl
+++ /dev/null
@@ -1,16 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module10).
--export([continue/2]).
-
-continue(AnAtom, Fun) ->
- aux(AnAtom, Fun).
-
-aux(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun);
- P when is_pid(P) ->
- P
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl
deleted file mode 100644
index 5c5d92b770..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module5/whereis_intra_inter_module9.erl
+++ /dev/null
@@ -1,11 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module9).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- register(AnAtom, continue(AnAtom, Fun)).
-
-continue(AnAtom, Fun) ->
- whereis_intra_inter_module10:continue(AnAtom, Fun).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl
deleted file mode 100644
index 82abe2f4a8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module11.erl
+++ /dev/null
@@ -1,27 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module11).
--export([start/2, start_again/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_intra_inter_module12:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- whereis_intra_inter_module12:race(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
-
-start_again(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_intra_inter_module12:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- whereis_intra_inter_module12:continue(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl
deleted file mode 100644
index c2f5d560a0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module6/whereis_intra_inter_module12.erl
+++ /dev/null
@@ -1,14 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module12).
--export([no_race/1, race/2, continue/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- continue(Atom, Pid).
-
-continue(Atom, Pid) ->
- register(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl
deleted file mode 100644
index 3cd5cc6fa6..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module13.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module13).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_intra_inter_module14:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- continue(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
-
-continue(Atom, Pid) ->
- whereis_intra_inter_module14:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl
deleted file mode 100644
index 6b6a982055..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module7/whereis_intra_inter_module14.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module14).
--export([no_race/1, race/2, start/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- race(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl
deleted file mode 100644
index c60d166fa9..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module15.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module15).
--export([start/2, continue/2]).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- whereis_intra_inter_module16:no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- continue(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
-
-continue(Atom, Pid) ->
- whereis_intra_inter_module16:race(Atom, Pid).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl
deleted file mode 100644
index 279e633d66..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_intra_inter_module8/whereis_intra_inter_module16.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that the race condition detection between whereis/register
-%% is robust w.r.t. having the calls in separate functions and modules.
-
--module(whereis_intra_inter_module16).
--export([no_race/1, race/2, start/2]).
-
-no_race(Pid) ->
- register(master, Pid).
-
-race(Atom, Pid) ->
- register(Atom, Pid).
-
-start(AnAtom, Fun) ->
- Pid1 = spawn(Fun),
- no_race(Pid1),
- case whereis(AnAtom) of
- undefined ->
- Pid2 = spawn(Fun),
- whereis_intra_inter_module15:continue(AnAtom, Pid2);
- P when is_pid(P) ->
- true
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl
deleted file mode 100644
index 7bcde321a1..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_param.erl
+++ /dev/null
@@ -1,16 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination in higher order functions.
-
--module(whereis_param).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- register(AnAtom, continue(AnAtom, Fun)).
-
-continue(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun);
- P when is_pid(P) ->
- P
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl
deleted file mode 100644
index 8bac0326a5..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module1.erl
+++ /dev/null
@@ -1,8 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination in higher order functions and inter-module calls.
-
--module(whereis_param_inter_module1).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- register(AnAtom, whereis_param_inter_module2:continue(AnAtom, Fun)).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl
deleted file mode 100644
index 61252add9a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_param_inter_module/whereis_param_inter_module2.erl
+++ /dev/null
@@ -1,13 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination in higher order functions and inter-module calls.
-
--module(whereis_param_inter_module2).
--export([continue/2]).
-
-continue(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun);
- P when is_pid(P) ->
- P
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl
deleted file mode 100644
index c8095fbf4c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function1.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination in a recursive function.
-
--module(whereis_rec_function1).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- register(AnAtom, Pid),
- start(AnAtom, Fun)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl
deleted file mode 100644
index 2721c9e19c..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function2.erl
+++ /dev/null
@@ -1,24 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in a recursive function.
-
--module(whereis_rec_function2).
--export([test/0]).
-
-test() ->
- start(undefined, second, mod:f(), self()).
-
-start(AnAtom, NextAtom, Fun, Id) ->
- case AnAtom of
- undefined -> register(start, Id);
- _ -> register(AnAtom, Id)
- end,
- case whereis(NextAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false -> start(NextAtom, mod:next(), Pid, Id)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl
deleted file mode 100644
index e101f34fba..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function3.erl
+++ /dev/null
@@ -1,27 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in a recursive function.
-
--module(whereis_rec_function3).
--export([test/0]).
-
-test() ->
- start(undefined, second, mod:f(), self()).
-
-start(AnAtom, NextAtom, Fun, Id) ->
- case AnAtom of
- undefined -> register(start, Id);
- _ -> register(AnAtom, Id)
- end,
- Pid =
- case whereis(NextAtom) of
- undefined -> spawn(Fun);
- P1 when is_pid(P1) -> P1
- end,
- case whereis(NextAtom) of
- undefined ->
- case Pid =:= self() of
- true -> ok;
- false -> start(NextAtom, mod:next(), Pid, Id), io:format("", [])
- end;
- P2 when is_pid(P2) -> ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl
deleted file mode 100644
index 4894d3397b..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function4.erl
+++ /dev/null
@@ -1,27 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in an indirectly recursive function.
-
--module(whereis_rec_function4).
--export([test/0]).
-
-test() ->
- start(undefined, second, mod:f(), self()).
-
-start(AnAtom, NextAtom, Fun, Id) ->
- case AnAtom of
- undefined -> register(start, Id);
- _ -> register(AnAtom, Id)
- end,
- case whereis(NextAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false -> continue(NextAtom, mod:next(), Pid, Id)
- end;
- P when is_pid(P) ->
- ok
- end.
-
-continue(Atom, NextAtom, Fun, Id) ->
- start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl
deleted file mode 100644
index d821f829a2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function5.erl
+++ /dev/null
@@ -1,21 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in a recursive function.
-
--module(whereis_rec_function5).
--export([start/4]).
-
-start(AnAtom, NextAtom, Fun, Id) ->
- case AnAtom of
- undefined -> register(start, Id);
- _ -> register(AnAtom, Id)
- end,
- case whereis(NextAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false -> start(NextAtom, mod:next(), Pid, Id)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl
deleted file mode 100644
index 4ec4baf0be..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function6.erl
+++ /dev/null
@@ -1,24 +0,0 @@
-%% This tests the presence of possible races due to a register/whereis
-%% combination in an indirectly recursive function.
-
--module(whereis_rec_function6).
--export([start/4]).
-
-start(AnAtom, NextAtom, Fun, Id) ->
- case AnAtom of
- undefined -> register(start, Id);
- _ -> register(AnAtom, Id)
- end,
- case whereis(NextAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false -> continue(NextAtom, mod:next(), Pid, Id)
- end;
- P when is_pid(P) ->
- ok
- end.
-
-continue(Atom, NextAtom, Fun, Id) ->
- start(Atom, NextAtom, Fun, Id).
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl
deleted file mode 100644
index 7667443117..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function7.erl
+++ /dev/null
@@ -1,19 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination in a recursive function.
-
--module(whereis_rec_function7).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- start(AnAtom, Fun),
- register(AnAtom, Pid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl
deleted file mode 100644
index a06fb75f64..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_rec_function8.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests the presence of possible races due to a whereis/register
-%% combination in a recursive function.
-
--module(whereis_rec_function8).
--export([test/2]).
-
-test(AnAtom, Fun) ->
- start(AnAtom, Fun).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- start(AnAtom, Fun),
- register(AnAtom, Pid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl
deleted file mode 100644
index 39bb440f56..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_try_catch.erl
+++ /dev/null
@@ -1,25 +0,0 @@
-% This tests that warnings do appear when a whereis/register combination
-% is handled by try/catch.
-
--module(whereis_try_catch).
--export([race/1, no_race/1]).
-
-race(Pid) ->
- case whereis(master) of
- undefined ->
- try
- io:format("exception", [])
- catch
- _ -> register(master, Pid)
- end
- end.
-
-no_race(Pid) ->
- case whereis(master) of
- undefined ->
- try
- register(master, Pid)
- catch
- _ -> io:format("exception", [])
- end
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl
deleted file mode 100644
index 9b249e72be..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars1.erl
+++ /dev/null
@@ -1,17 +0,0 @@
-%% This tests that no warnings appear when there is no specific
-%% information about the types and the variables are not bound.
-
--module(whereis_vars1).
--export([start/3]).
-
-start(AnAtom, OtherAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false -> register(OtherAtom, Pid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl
deleted file mode 100644
index 5c1896d6b4..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars10.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars10).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom =/= OtherAtom of
- true -> ok;
- false -> register(OtherAtom, Pid)
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl
deleted file mode 100644
index dc8551b3f2..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars11.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that no warnings appear when there is no specific
-%% information about the types and the variables are not bound.
-
--module(whereis_vars11).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom of
- OtherAtom -> ok;
- _Other -> register(OtherAtom, Pid)
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl
deleted file mode 100644
index 38b0dc5d04..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars12.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars12).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- if
- AnAtom =:= OtherAtom -> register(OtherAtom, Pid);
- AnAtom =/= OtherAtom -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl
deleted file mode 100644
index 3a04bba02f..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars13.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars13).
--export([start/3]).
-
-start(AnAtom, APid, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- if
- {AnAtom, Pid} =:= {OtherAtom, APid} -> register(OtherAtom, APid);
- {AnAtom, Pid} =/= {OtherAtom, APid} -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl
deleted file mode 100644
index c688847551..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars14.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars14).
--export([start/3]).
-
-start(AnAtom, APid, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- if
- [AnAtom, Pid] =:= [OtherAtom, APid] -> register(OtherAtom, APid);
- [AnAtom, Pid] =/= [OtherAtom, APid] -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl
deleted file mode 100644
index 4b3a72537e..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars15.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars15).
--export([start/3]).
-
-start(AnAtom, OtherAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom of
- maria -> ok;
- kostis when AnAtom =:= OtherAtom ->
- register(OtherAtom, Pid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl
deleted file mode 100644
index 7badb8df22..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars16.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars16).
--export([start/4]).
-
-start(AnAtom, OtherAtom, APid, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom of
- maria -> ok;
- kostis when {AnAtom, Pid} =:= {OtherAtom, APid} ->
- register(OtherAtom, APid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl
deleted file mode 100644
index bc7ef5e980..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars17.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars17).
--export([start/4]).
-
-start(AnAtom, OtherAtom, APid, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom of
- maria -> ok;
- kostis when [AnAtom, Pid] =:= [OtherAtom, APid] ->
- register(OtherAtom, APid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl
deleted file mode 100644
index 06416fa987..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars18.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that no warnings appear when there is no specific
-%% information about the types and the variables are not bound.
-
--module(whereis_vars18).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom =:= OtherAtom of
- true -> ok;
- false -> register(OtherAtom, Pid)
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl
deleted file mode 100644
index ae5b28e42d..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars19.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that no warnings appear when there is no specific
-%% information about the types and the variables are not bound.
-
--module(whereis_vars19).
--export([start/3]).
-
-start(AnAtom, OtherAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom of
- maria -> ok;
- kostis when AnAtom =/= OtherAtom ->
- register(OtherAtom, Pid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl
deleted file mode 100644
index bafb5d4644..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars2.erl
+++ /dev/null
@@ -1,18 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars2).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = AnAtom,
- case Pid =:= self() of
- true -> ok;
- false -> register(OtherAtom, Pid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl
deleted file mode 100644
index 87c6caadf0..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars20.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that no warnings appear when there is no specific
-%% information about the types and the variables are not bound.
-
--module(whereis_vars20).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- if
- AnAtom =:= OtherAtom -> ok;
- AnAtom =/= OtherAtom -> register(OtherAtom, Pid)
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl
deleted file mode 100644
index 73d22d3467..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars21.erl
+++ /dev/null
@@ -1,23 +0,0 @@
-%% This tests that no warnings appear when there is no specific
-%% information about the types and the variables are not bound.
-
--module(whereis_vars21).
--export([start/3]).
-
-start(AnAtom, OtherAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom of
- maria when AnAtom =/= OtherAtom -> ok;
- kostis when AnAtom =/= OtherAtom ->
- register(OtherAtom, Pid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl
deleted file mode 100644
index dd16928e33..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars22.erl
+++ /dev/null
@@ -1,27 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars22).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- Same =
- case AnAtom of
- OtherAtom -> true;
- _Other -> false
- end,
- case Same of
- true -> register(OtherAtom, Pid);
- false -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl
deleted file mode 100644
index 16c9a6c8bc..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars3.erl
+++ /dev/null
@@ -1,18 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars3).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- {OtherAtom, APid} = {AnAtom, Pid},
- case Pid =:= self() of
- true -> ok;
- false -> register(OtherAtom, APid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl
deleted file mode 100644
index da5b329ca9..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars4.erl
+++ /dev/null
@@ -1,18 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars4).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- [OtherAtom, APid] = [AnAtom, Pid],
- case Pid =:= self() of
- true -> ok;
- false -> register(OtherAtom, APid)
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl
deleted file mode 100644
index dff8646ea8..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars5.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars5).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom of
- OtherAtom -> register(OtherAtom, Pid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl
deleted file mode 100644
index cf22ab1883..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars6.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars6).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case {AnAtom, Pid} of
- {OtherAtom, APid} -> register(OtherAtom, APid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl
deleted file mode 100644
index 4bce53982a..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars7.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars7).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case [AnAtom, Pid] of
- [OtherAtom, APid] -> register(OtherAtom, APid);
- _Other -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl
deleted file mode 100644
index 937b83cf02..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars8.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars8).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom =:= OtherAtom of
- true -> register(OtherAtom, Pid);
- false -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl b/lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl
deleted file mode 100644
index 9beb67ca38..0000000000
--- a/lib/dialyzer/test/race_SUITE_data/src/whereis_vars9.erl
+++ /dev/null
@@ -1,22 +0,0 @@
-%% This tests that warnings do appear when there is no specific
-%% information about the types and the variables are bound.
-
--module(whereis_vars9).
--export([start/2]).
-
-start(AnAtom, Fun) ->
- case whereis(AnAtom) of
- undefined ->
- Pid = spawn(Fun),
- OtherAtom = kostis,
- case Pid =:= self() of
- true -> ok;
- false ->
- case AnAtom == OtherAtom of
- true -> register(OtherAtom, Pid);
- false -> ok
- end
- end;
- P when is_pid(P) ->
- ok
- end.
diff --git a/lib/dialyzer/test/small_SUITE_data/results/fun_hangs b/lib/dialyzer/test/small_SUITE_data/results/fun_hangs
new file mode 100644
index 0000000000..139597f9cb
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/results/fun_hangs
@@ -0,0 +1,2 @@
+
+
diff --git a/lib/dialyzer/test/small_SUITE_data/results/gencall b/lib/dialyzer/test/small_SUITE_data/results/gencall
index b4dec09e4b..4e32e2aa9c 100644
--- a/lib/dialyzer/test/small_SUITE_data/results/gencall
+++ b/lib/dialyzer/test/small_SUITE_data/results/gencall
@@ -1,4 +1,6 @@
-gencall.erl:11:3: Call to missing or unexported function gencall:foo/0
-gencall.erl:12:3: Call to missing or unexported function gen_server:handle_cast/2
-gencall.erl:9:3: Call to missing or unexported function ets:lookup/3
+gencall.erl:10:3: Call to missing or unexported function gen_server:handle_cast/2
+gencall.erl:5:1: Function f/0 has no local return
+gencall.erl:6:34: The call gen_server:call(pid(),'request',{'not_a_timeout'}) breaks the contract (ServerRef::server_ref(),Request::term(),Timeout::timeout()) -> Reply::term()
+gencall.erl:7:3: Call to missing or unexported function ets:lookup/3
+gencall.erl:9:3: Call to missing or unexported function gencall:foo/0
diff --git a/lib/dialyzer/test/small_SUITE_data/results/guards b/lib/dialyzer/test/small_SUITE_data/results/guards
index 8e2386c77a..9313d3e43a 100644
--- a/lib/dialyzer/test/small_SUITE_data/results/guards
+++ b/lib/dialyzer/test/small_SUITE_data/results/guards
@@ -8,6 +8,10 @@ guards.erl:129:32: The call guards:t15('c') will never return since it differs i
guards.erl:136:16: The call guards:t16('a') will never return since it differs in the 1st argument from the success typing arguments: ('b')
guards.erl:136:1: Function t16_a/0 has no local return
guards.erl:136:32: The call guards:t16('c') will never return since it differs in the 1st argument from the success typing arguments: ('b')
+guards.erl:140:1: Function t17/1 has no local return
+guards.erl:140:1: Guard test #{'x':=_} =:= 'true' can never succeed
+guards.erl:145:1: Function t18/1 has no local return
+guards.erl:145:1: Guard test binary() =:= 'true' can never succeed
guards.erl:55:1: Function t5/1 has no local return
guards.erl:55:27: Guard test is_integer(A::atom()) can never succeed
guards.erl:59:1: Function t6/1 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/results/try2 b/lib/dialyzer/test/small_SUITE_data/results/try2
index 14306bb756..e3fada37ea 100644
--- a/lib/dialyzer/test/small_SUITE_data/results/try2
+++ b/lib/dialyzer/test/small_SUITE_data/results/try2
@@ -1,2 +1,3 @@
+try2.erl:12:1: Function run/2 has no local return
try2.erl:33:1: Function run3/2 has no local return
diff --git a/lib/dialyzer/test/small_SUITE_data/src/big_external_type.erl b/lib/dialyzer/test/small_SUITE_data/src/big_external_type.erl
index 9ad4810a5e..50eb8db935 100644
--- a/lib/dialyzer/test/small_SUITE_data/src/big_external_type.erl
+++ b/lib/dialyzer/test/small_SUITE_data/src/big_external_type.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2015. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -412,7 +412,7 @@ normalise({bin,_,Fs}) ->
eval_bits:expr_grp(Fs, [],
fun(E, _) ->
{value, normalise(E), []}
- end, [], true),
+ end),
B;
normalise({cons,_,Head,Tail}) ->
[normalise(Head)|normalise(Tail)];
diff --git a/lib/dialyzer/test/small_SUITE_data/src/big_local_type.erl b/lib/dialyzer/test/small_SUITE_data/src/big_local_type.erl
index fe567ff10d..5e8c1b95da 100644
--- a/lib/dialyzer/test/small_SUITE_data/src/big_local_type.erl
+++ b/lib/dialyzer/test/small_SUITE_data/src/big_local_type.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2015. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -409,7 +409,7 @@ normalise({bin,_,Fs}) ->
eval_bits:expr_grp(Fs, [],
fun(E, _) ->
{value, normalise(E), []}
- end, [], true),
+ end),
B;
normalise({cons,_,Head,Tail}) ->
[normalise(Head)|normalise(Tail)];
diff --git a/lib/dialyzer/test/small_SUITE_data/src/binary_redef.erl b/lib/dialyzer/test/small_SUITE_data/src/binary_redef.erl
deleted file mode 100644
index 851b8180d3..0000000000
--- a/lib/dialyzer/test/small_SUITE_data/src/binary_redef.erl
+++ /dev/null
@@ -1,22 +0,0 @@
--module(binary_redef).
-
--export([t/0]).
-
--export_type([nonempty_binary/0, nonempty_bitstring/0]).
-
--type nonempty_binary() :: integer().
--type nonempty_bitstring() :: integer().
-
-t() ->
- I = new(),
- t1(I).
-
--spec t1(nonempty_bitstring()) -> nonempty_bitstring().
-
-t1(A) ->
- A + A.
-
--spec new() -> nonempty_binary().
-
-new() ->
- 3.
diff --git a/lib/dialyzer/test/small_SUITE_data/src/fun_named.erl b/lib/dialyzer/test/small_SUITE_data/src/fun_named.erl
new file mode 100644
index 0000000000..4c74f092fa
--- /dev/null
+++ b/lib/dialyzer/test/small_SUITE_data/src/fun_named.erl
@@ -0,0 +1,10 @@
+%% Analysis could enter an infinite loop when a named fun called itself.
+-module(fun_hangs).
+-export([bar/1, foo/0]).
+
+-spec bar(fun((pos_integer()) -> term())) -> term().
+bar(Fun) ->
+ Fun.
+
+foo() ->
+ bar(fun F(_) -> F(1) end).
diff --git a/lib/dialyzer/test/small_SUITE_data/src/gencall.erl b/lib/dialyzer/test/small_SUITE_data/src/gencall.erl
index 762be55007..8e0ac802fb 100644
--- a/lib/dialyzer/test/small_SUITE_data/src/gencall.erl
+++ b/lib/dialyzer/test/small_SUITE_data/src/gencall.erl
@@ -1,11 +1,9 @@
-%% Error: gen_server:handle_cast/2 is not logged as an unexported func
-%% but unknown function.
-module(gencall).
-export([f/0]).
f() ->
- gen_server:call(1,2,3),
+ gen_server:call(self(),request,{not_a_timeout}),
ets:lookup(1,2,3),
some_mod:some_function(),
gencall:foo(),
diff --git a/lib/dialyzer/test/small_SUITE_data/src/guards.erl b/lib/dialyzer/test/small_SUITE_data/src/guards.erl
index 34c43d6d12..85d4d32214 100644
--- a/lib/dialyzer/test/small_SUITE_data/src/guards.erl
+++ b/lib/dialyzer/test/small_SUITE_data/src/guards.erl
@@ -134,3 +134,24 @@ t16(A) when ((A =:= a) orelse (A =:= b)) andalso
((A =:= b) orelse (A =:= c)) -> ok.
t16_a() -> t16(a), t16(b), t16(c).
+
+%% Should give a warning
+
+t17(X) when #{x => X} ->
+ ok.
+
+%% Should give a warning
+
+t18(X) when <<X>> ->
+ ok.
+
+%% Coverage
+
+cover1() when 1 < 2; 1 > 2 ->
+ ok.
+
+cover2() when is_atom(1 < 2); is_atom(1 > 2) ->
+ ok.
+
+cover3() when not(1 < 2); not(1 > 2) ->
+ ok.
diff --git a/lib/diameter/Makefile b/lib/diameter/Makefile
index 320e72ada1..fccbba7501 100644
--- a/lib/diameter/Makefile
+++ b/lib/diameter/Makefile
@@ -28,5 +28,6 @@ SPECIAL_TARGETS =
include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=ssl runtime_tools syntax_tools
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/diameter/doc/src/notes.xml b/lib/diameter/doc/src/notes.xml
index 0b664b5b50..b42cc2dad2 100644
--- a/lib/diameter/doc/src/notes.xml
+++ b/lib/diameter/doc/src/notes.xml
@@ -11,14 +11,14 @@
<header>
<copyright>
<year>2011</year>
-<year>2021</year>
+<year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
-
+
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
@@ -643,7 +643,7 @@ first.</p>
</item>
<item>
<p>
- Update build scripts to not make assumtions about where
+ Update build scripts to not make assumptions about where
env, cp and perl are located.</p>
<p>
Own Id: OTP-13800</p>
@@ -910,7 +910,7 @@ first.</p>
connection over SCTP, and then TCP in case SCTP fails.
Multiple module tuples can be paired with a single config
tuple, but in this case the start order was reversed
- relative to the order in which the modules were specifed.</p>
+ relative to the order in which the modules were specified.</p>
<p>
Own Id: OTP-12851</p>
</item>
diff --git a/lib/diameter/src/Makefile b/lib/diameter/src/Makefile
index 348cc350e1..6dd3667a46 100644
--- a/lib/diameter/src/Makefile
+++ b/lib/diameter/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2010-2020. All Rights Reserved.
+# Copyright Ericsson AB 2010-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -146,8 +146,8 @@ patch:
git diff --exit-code HEAD
$(MAKE) opt PRE_VSN="-$(shell git rev-list --max-count=1 HEAD | cut -c 1-8)"
-debug:
- @$(MAKE) TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
# The dictionary parser.
gen/$(DICT_YRL).erl: compiler/$(DICT_YRL).yrl
diff --git a/lib/diameter/src/base/diameter_callback.erl b/lib/diameter/src/base/diameter_callback.erl
index 3bcf550cd8..a2b2ba8ffb 100644
--- a/lib/diameter/src/base/diameter_callback.erl
+++ b/lib/diameter/src/base/diameter_callback.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@
%%
%% {module, [diameter_callback, {peer_down, {mymod, down, []}}]}
%%
-%% The following would result in this module suppying peer_up and
+%% The following would result in this module supplying peer_up and
%% peer_down callback, others taking place in module mymod.
%%
%% {module, #diameter_callback{peer_up = false,
diff --git a/lib/diameter/src/base/diameter_reg.erl b/lib/diameter/src/base/diameter_reg.erl
index c1762a07e3..2fd6abbfbd 100644
--- a/lib/diameter/src/base/diameter_reg.erl
+++ b/lib/diameter/src/base/diameter_reg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -76,7 +76,7 @@
%% # add(T)
%%
%% Associate the specified term with self(). The list of pids having
-%% this or other assocations can be retrieved using match/1.
+%% this or other associations can be retrieved using match/1.
%%
%% An association is removed when the calling process dies or as a
%% result of calling remove/1. Adding the same term more than once is
diff --git a/lib/diameter/src/base/diameter_service.erl b/lib/diameter/src/base/diameter_service.erl
index 520a7233cc..6ff9de3341 100644
--- a/lib/diameter/src/base/diameter_service.erl
+++ b/lib/diameter/src/base/diameter_service.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -686,7 +686,7 @@ cs(undefined, _) ->
%% # i/1
%% ---------------------------------------------------------------------------
-%% Intialize the state of a service gen_server.
+%% Initialize the state of a service gen_server.
i(SvcName) ->
%% Split the config into a server state and a list of transports.
@@ -1072,7 +1072,7 @@ reopen({TPid, {Caps, SupportedApps, _Pkt}},
%% ---------------------------------------------------------------------------
%% Watchdog has recovered a suspect connection. Note that there has
-%% been no new capabilties exchange in this case.
+%% been no new capabilities exchange in this case.
connection_up(#watchdog{peer = TPid} = Wd, #state{local = {PeerT, _, _}}
= S) ->
diff --git a/lib/diameter/src/base/diameter_types.erl b/lib/diameter/src/base/diameter_types.erl
index 86b674dd48..79312dfe13 100644
--- a/lib/diameter/src/base/diameter_types.erl
+++ b/lib/diameter/src/base/diameter_types.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -247,9 +247,19 @@
2 == A, 16 == size(B) ->
list_to_tuple([N || <<N:A/unit:8>> <= B]);
+%% Bytes for non-IP address types are left for the user to interpret.
+'Address'(decode, <<A:16, B/binary>>, _)
+ when 2 < A, A < 65535 ->
+ {A, B};
+
'Address'(decode, B, _) ->
?INVALID_LENGTH(B);
+%% Allow IP address types as both 2- and 4/8-tuples.
+'Address'(encode, {A, B}, _)
+ when 0 < A, A < 65535 ->
+ <<A:16, B/binary>>;
+
'Address'(encode, T, _) ->
Ns = tuple_to_list(diameter_lib:ipaddr(T)), %% length 4 or 8
A = length(Ns) div 4, %% 1 or 2
diff --git a/lib/diameter/src/diameter.app.src b/lib/diameter/src/diameter.app.src
index 18202f033e..27f248e070 100644
--- a/lib/diameter/src/diameter.app.src
+++ b/lib/diameter/src/diameter.app.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@
{mod, {diameter_app, []}},
{runtime_dependencies, [
"erts-10.0",
- "stdlib-2.4",
+ "stdlib-3.0",
"kernel-3.2",
"ssl-9.0"
%, "syntax-tools-1.6.18"
diff --git a/lib/diameter/src/diameter.appup.src b/lib/diameter/src/diameter.appup.src
index bbfa44086e..35d453b193 100644
--- a/lib/diameter/src/diameter.appup.src
+++ b/lib/diameter/src/diameter.appup.src
@@ -70,12 +70,16 @@
{update, diameter_peer_fsm},
{update, diameter_service},
{load_module, diameter_traffic},
+ {load_module, diameter_types},
{update, diameter_tcp},
{update, diameter_sctp}]},
{"2.2.2", [{load_module, diameter}, %% 22.2.8
+ {load_module, diameter_types},
{update, diameter_sctp}]},
- {"2.2.3", [{update, diameter_sctp}]}, %% 22.3
- {"2.2.4", []} %% 23.3.4
+ {"2.2.3", [{load_module, diameter_types},
+ {update, diameter_sctp}]}, %% 22.3
+ {"2.2.4", [{load_module, diameter_types}]}, %% 23.3.4
+ {"2.2.5", [{load_module, diameter_types}]} %% 24.3
],
[
{"0.9", [{restart_application, diameter}]},
@@ -127,11 +131,15 @@
{update, diameter_peer_fsm},
{update, diameter_service},
{load_module, diameter_traffic},
+ {load_module, diameter_types},
{update, diameter_tcp},
{update, diameter_sctp}]},
{"2.2.2", [{load_module, diameter},
+ {load_module, diameter_types},
{update, diameter_sctp}]},
- {"2.2.3", [{update, diameter_sctp}]},
- {"2.2.4", []}
+ {"2.2.3", [{load_module, diameter_types},
+ {update, diameter_sctp}]},
+ {"2.2.4", [{load_module, diameter_types}]},
+ {"2.2.5", [{load_module, diameter_types}]}
]
}.
diff --git a/lib/diameter/src/info/diameter_info.erl b/lib/diameter/src/info/diameter_info.erl
index 9ff6769ba5..9d1f392c4e 100644
--- a/lib/diameter/src/info/diameter_info.erl
+++ b/lib/diameter/src/info/diameter_info.erl
@@ -166,7 +166,7 @@ format(Recs, Fields, SFun)
%%% Output: Number of entries output.
%%%
%%% Description: Pretty-print records in a named tables as collected
-%%% from known nodes. Each table listing is preceeded by
+%%% from known nodes. Each table listing is preceded by
%%% a banner.
%%% ----------------------------------------------------------
diff --git a/lib/diameter/src/transport/diameter_tcp.erl b/lib/diameter/src/transport/diameter_tcp.erl
index 2c5dc2fa2e..f40f2b1fc4 100644
--- a/lib/diameter/src/transport/diameter_tcp.erl
+++ b/lib/diameter/src/transport/diameter_tcp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -43,6 +43,7 @@
-export([listener/1,%% diameter_sync callback
info/1]). %% service_info callback
+%% test
-export([ports/0,
ports/1]).
@@ -450,16 +451,20 @@ sock(_, Sock) ->
resolve(Type, S) ->
Sock = sock(Type, S),
try
- ok(portnr(Sock))
+ {ok, T} = portnr(Sock),
+ T
catch
_:_ -> Sock
end.
-portnr(Sock)
- when is_port(Sock) ->
- portnr(gen_tcp, Sock);
+%% Assume either ssl or gen_tcp. In particular, this can't deal with a
+%% transport module that called start/3 with an own module option.
portnr(Sock) ->
- portnr(ssl, Sock).
+ try
+ {ok, _} = portnr(ssl, Sock)
+ catch
+ _:_ -> portnr(gen_tcp, Sock)
+ end.
%% ---------------------------------------------------------------------------
%% # handle_call/3
@@ -615,7 +620,7 @@ transition({P, Sock, Bin}, #transport{socket = Sock,
P == tcp ->
recv(acc(Frag, Bin), S);
-%% Capabilties exchange has decided on whether or not to run over TLS.
+%% Capabilities exchange has decided on whether or not to run over TLS.
transition({diameter, {tls, Ref, Type, B}}, #transport{parent = Pid}
= S) ->
true = is_boolean(B), %% assert
diff --git a/lib/diameter/test/Makefile b/lib/diameter/test/Makefile
index c574d70e45..53b5fd4618 100644
--- a/lib/diameter/test/Makefile
+++ b/lib/diameter/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2010-2016. All Rights Reserved.
+# Copyright Ericsson AB 2010-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -64,17 +64,14 @@ ERL_COMPILE_FLAGS += +warn_export_vars \
# Targets
# ----------------------------------------------------
-all debug opt: $(TARGET_FILES)
+all $(TYPES): $(TARGET_FILES)
strict:
$(MAKE) opt STRICT_FLAGS=-Werror
-# Require success ...
-run: $(SUITES)
-
-# ... or not.
-any: opt
- $(MAKE) -i $(SUITES)
+# Run all suites, without/with common_test.
+run: $(SUITES:%=_%)
+ct: $(SUITES)
clean:
rm -f $(TARGET_FILES)
@@ -91,13 +88,11 @@ info:
@echo ========================================
@$(call list,MODULES)
@echo
- @$(call list,HRL_FILES)
- @echo
@$(call list,SUITES)
@echo
@echo erl = $(shell which erl)
@erl -noinput \
- -eval 'io:format("diameter = ~s~n", [code:lib_dir(diameter)])' \
+ -eval 'io:format("diameter = ~ts~n", [code:lib_dir(diameter)])' \
-s init stop
@echo ========================================
@@ -109,13 +104,14 @@ help:
@echo " Compile all test suites."
@echo
@echo " run:"
- @echo " Compile and run all test suites, stop on failure."
+ @echo " Compile and run all test suites without common_test."
@echo
- @echo " any:"
- @echo " Compile and run all test suites, ignore any failures."
+ @echo " ct:"
+ @echo " Compile and run all test suites with common_test."
@echo
@echo " $(SUITES):"
@echo " Compile and run a specific test suite."
+ @echo " Prefix with _ to run without common_test."
@echo
@echo " clean | realclean:"
@echo " Remove generated files."
@@ -124,7 +120,10 @@ help:
@echo " Echo some relevant variables."
@echo ========================================
-.PHONY: all any run clean debug docs help info opt realclean strict
+.PHONY: all ct run clean debug docs help info opt realclean strict
+
+# Disable crash dumps.
+export ERL_CRASH_DUMP_BYTES=0
# ----------------------------------------------------
# Special Targets
@@ -132,7 +131,8 @@ help:
# Exit with a non-zero status if the output looks to indicate failure.
# diameter_ct:run/1 itself can't tell (it seems). The absolute -pa is
-# because ct will change directories.
+# because ct will change directories, and for code:lib_dir(diameter) to
+# return the parent directory.
$(SUITES): log opt
$(ERL) -noinput \
-pa $(realpath ../ebin) \
@@ -142,6 +142,14 @@ $(SUITES): log opt
| awk '{print} / FAILED /{rc=1} END{exit rc}' rc=0
# Shorter in sed but requires a GNU extension (ie. Q).
+# Run suites without common_test.
+$(SUITES:%=_%): opt
+ $(ERL) -noinput \
+ -pa $(realpath ../ebin) \
+ -sname diameter_test_$@ \
+ -s diameter$@_SUITE run \
+ -s init stop
+
cover: log opt coverspec
$(ERL) -noinput \
-pa $(realpath ../ebin) \
@@ -173,7 +181,6 @@ release_tests_spec:
$(INSTALL_DIR) "$(RELSYSDIR)"
$(INSTALL_DATA) $(TEST_SPEC_FILE) \
$(COVER_SPEC_FILE) \
- $(HRL_FILES) \
"$(RELSYSDIR)"
$(MAKE) $(DATA_DIRS:%/=release_data_%)
$(MAKE) $(ERL_FILES:%=/%)
diff --git a/lib/diameter/test/diameter.spec b/lib/diameter/test/diameter.spec
index fae7863bec..be62bb7f2b 100644
--- a/lib/diameter/test/diameter.spec
+++ b/lib/diameter/test/diameter.spec
@@ -1 +1,2 @@
{suites, "../diameter_test", all}.
+{skip_suites, "../diameter_test", [diameter_gen_sctp_SUITE], "Fails due to suspect gen_sctp behaviour."}.
diff --git a/lib/diameter/test/diameter_3xxx_SUITE.erl b/lib/diameter/test/diameter_3xxx_SUITE.erl
index 0f060c4ba7..63de2467a3 100644
--- a/lib/diameter/test/diameter_3xxx_SUITE.erl
+++ b/lib/diameter/test/diameter_3xxx_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,19 +26,17 @@
-module(diameter_3xxx_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/2,
- end_per_group/2,
- init_per_testcase/2,
- end_per_testcase/2]).
-
-%% testcases
--export([start/1,
- send_unknown_application/1,
+ traffic/1]).
+
+%% internal
+-export([send_unknown_application/1,
send_unknown_command/1,
send_ok/1,
send_invalid_hdr_bits/1,
@@ -47,9 +45,7 @@
send_5xxx_missing_avp/1,
send_double_error/1,
send_3xxx/1,
- send_5xxx/1,
- counters/1,
- stop/1]).
+ send_5xxx/1]).
%% diameter callbacks
-export([peer_up/3,
@@ -67,11 +63,7 @@
%% ===========================================================================
-define(util, diameter_util).
--define(testcase(), proplists:get_value(testcase, get(?MODULE))).
--define(group(Config), begin
- put(?MODULE, Config),
- ?util:name(proplists:get_value(group, Config))
- end).
+-define(testcase(), get(?MODULE)).
-define(L, atom_to_list).
-define(A, list_to_atom).
@@ -106,34 +98,15 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 90}}].
all() ->
- [{group, ?util:name([E,D])} || E <- ?ERRORS, D <- ?RFCS].
-
-groups() ->
- Tc = tc(),
- [{?util:name([E,D]), [], [start] ++ Tc ++ [counters, stop]}
- || E <- ?ERRORS, D <- ?RFCS].
-
-init_per_suite(Config) ->
- ok = diameter:start(),
- Config.
+ [traffic].
-end_per_suite(_Config) ->
- ok = diameter:stop().
+traffic(_Config) ->
+ run().
-init_per_group(Group, Config) ->
- [{group, Group} | Config].
-
-end_per_group(_, _) ->
- ok.
-
-init_per_testcase(Name, Config) ->
- [{testcase, Name} | Config].
-
-end_per_testcase(_, _) ->
- ok.
+%% ===========================================================================
tc() ->
[send_unknown_application,
@@ -147,25 +120,36 @@ tc() ->
send_3xxx,
send_5xxx].
-%% ===========================================================================
+%% run/0
+
+run() ->
+ ?util:run([[{{?MODULE, run, [{E,D}]}, 60000} || E <- ?ERRORS,
+ D <- ?RFCS]]).
+
+%% run/1
-%% start/1
+run({F, [_,_] = G}) ->
+ put(?MODULE, F),
+ apply(?MODULE, F, [G]);
-start(Config) ->
- Group = proplists:get_value(group, Config),
- [Errors, RFC] = ?util:name(Group),
- ok = diameter:start_service(?SERVER, ?SERVICE(?L(Group),
- Errors,
- RFC)),
+run({E,D}) ->
+ try
+ run([E,D])
+ after
+ ok = diameter:stop()
+ end;
+
+run([Errors, RFC] = G) ->
+ Name = ?L(Errors) ++ "," ++ ?L(RFC),
+ ok = diameter:start(),
+ ok = diameter:start_service(?SERVER, ?SERVICE(Name, Errors, RFC)),
ok = diameter:start_service(?CLIENT, ?SERVICE(?CLIENT,
callback,
rfc6733)),
LRef = ?util:listen(?SERVER, tcp),
- ?util:connect(?CLIENT, tcp, LRef).
-
-%% stop/1
-
-stop(_Config) ->
+ ?util:connect(?CLIENT, tcp, LRef),
+ ?util:run([{?MODULE, run, [{F,G}]} || F <- tc()]),
+ _ = counters(G),
ok = diameter:remove_transport(?CLIENT, true),
ok = diameter:remove_transport(?SERVER, true),
ok = diameter:stop_service(?SERVER),
@@ -175,9 +159,7 @@ stop(_Config) ->
%%
%% Check that counters are as expected.
-counters(Config) ->
- Group = proplists:get_value(group, Config),
- [_Errors, _Rfc] = G = ?util:name(Group),
+counters([_Errors, _RFC] = G) ->
[] = ?util:run([[fun counters/3, K, S, G]
|| K <- [statistics, transport, connections],
S <- [?CLIENT, ?SERVER]]).
@@ -379,10 +361,7 @@ send_unknown_application([_,_]) ->
%% UNSUPPORTED_APPLICATION
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_unknown_application(Config) ->
- send_unknown_application(?group(Config)).
+ = call().
%% send_unknown_command/1
%%
@@ -398,10 +377,7 @@ send_unknown_command([_,_]) ->
%% UNSUPPORTED_COMMAND
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_unknown_command(Config) ->
- send_unknown_command(?group(Config)).
+ = call().
%% send_ok/1
%%
@@ -412,10 +388,7 @@ send_ok([_,_]) ->
#diameter_base_STA{'Result-Code' = 5002, %% UNKNOWN_SESSION_ID
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_ok(Config) ->
- send_ok(?group(Config)).
+ = call().
%% send_invalid_hdr_bits/1
%%
@@ -433,10 +406,7 @@ send_invalid_hdr_bits([_,_]) ->
#'diameter_base_answer-message'{'Result-Code' = 3008, %% INVALID_HDR_BITS
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_invalid_hdr_bits(Config) ->
- send_invalid_hdr_bits(?group(Config)).
+ = call().
%% send_missing_avp/1
%%
@@ -454,10 +424,7 @@ send_missing_avp([_,_]) ->
#diameter_base_STA{'Result-Code' = 5005, %% MISSING_AVP
'Failed-AVP' = [_],
'AVP' = []}
- = call();
-
-send_missing_avp(Config) ->
- send_missing_avp(?group(Config)).
+ = call().
%% send_ignore_missing_avp/1
%%
@@ -475,10 +442,7 @@ send_ignore_missing_avp([_,_]) ->
#diameter_base_STA{'Result-Code' = 2001, %% SUCCESS
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_ignore_missing_avp(Config) ->
- send_ignore_missing_avp(?group(Config)).
+ = call().
%% send_5xxx_missing_avp/1
%%
@@ -501,10 +465,7 @@ send_5xxx_missing_avp([_,_]) ->
#diameter_base_STA{'Result-Code' = 2001, %% SUCCESS
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_5xxx_missing_avp(Config) ->
- send_5xxx_missing_avp(?group(Config)).
+ = call().
%% send_double_error/1
%%
@@ -522,10 +483,7 @@ send_double_error([_,_]) ->
#'diameter_base_answer-message'{'Result-Code' = 3008, %% INVALID_HDR_BITS
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_double_error(Config) ->
- send_double_error(?group(Config)).
+ = call().
%% send_3xxx/1
%%
@@ -536,10 +494,7 @@ send_3xxx([_,_]) ->
#'diameter_base_answer-message'{'Result-Code' = 3999,
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_3xxx(Config) ->
- send_3xxx(?group(Config)).
+ = call().
%% send_5xxx/1
%%
@@ -555,10 +510,7 @@ send_5xxx([_,_]) ->
#'diameter_base_answer-message'{'Result-Code' = 5999,
'Failed-AVP' = [],
'AVP' = []}
- = call();
-
-send_5xxx(Config) ->
- send_5xxx(?group(Config)).
+ = call().
%% ===========================================================================
diff --git a/lib/diameter/test/diameter_app_SUITE.erl b/lib/diameter/test/diameter_app_SUITE.erl
index ef4a28d3f4..adcc7114a1 100644
--- a/lib/diameter/test/diameter_app_SUITE.erl
+++ b/lib/diameter/test/diameter_app_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,22 +24,24 @@
-module(diameter_app_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
- all/0,
- init_per_suite/1,
- end_per_suite/1]).
+ all/0]).
%% testcases
-export([keys/1,
vsn/1,
- modules/1,
- exports/1,
+ modules/1,
+ exports/1,
release/1,
- xref/1,
+ xref/1,
relup/1]).
--include("diameter_ct.hrl").
-
+-define(util, diameter_util).
-define(A, list_to_atom).
%% Modules not in the app and that should not have dependencies on it
@@ -57,7 +59,7 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 20}}].
all() ->
[keys,
@@ -68,12 +70,22 @@ all() ->
xref,
relup].
-init_per_suite(Config) ->
- [{application, ?APP, App}] = diameter_util:consult(?APP, app),
- [{app, App} | Config].
+%% ===========================================================================
+
+run() ->
+ run(all()).
+
+run(List) ->
+ Tmp = ?util:mktemp("diameter_app"),
+ try
+ run([{priv_dir, Tmp}], List)
+ after
+ file:del_dir_r(Tmp)
+ end.
-end_per_suite(_Config) ->
- ok.
+run(Config, List) ->
+ [{application, diameter, App}] = ?util:consult(diameter, app),
+ ?util:run([{{?MODULE, F, [{App, Config}]}, 10000} || F <- List]).
%% ===========================================================================
%% # keys/1
@@ -82,10 +94,12 @@ end_per_suite(_Config) ->
%% also be caught by other testcases.
%% ===========================================================================
-keys(Config) ->
- App = fetch(app, Config),
+keys({App, _Config}) ->
[] = lists:filter(fun(K) -> not lists:keymember(K, 1, App) end,
- [vsn, description, modules, registered, applications]).
+ [vsn, description, modules, registered, applications]);
+
+keys(Config) ->
+ run(Config, [keys]).
%% ===========================================================================
%% # vsn/1
@@ -93,8 +107,11 @@ keys(Config) ->
%% Ensure that our app version sticks to convention.
%% ===========================================================================
+vsn({App, _Config}) ->
+ true = is_vsn(fetch(vsn, App));
+
vsn(Config) ->
- true = is_vsn(fetch(vsn, fetch(app, Config))).
+ run(Config, [vsn]).
%% ===========================================================================
%% # modules/1
@@ -103,15 +120,17 @@ vsn(Config) ->
%% compiler/info modules.
%% ===========================================================================
-modules(Config) ->
- Mods = fetch(modules, fetch(app, Config)),
+modules({App, _Config}) ->
+ Mods = fetch(modules, App),
Installed = code_mods(),
Help = lists:sort(?INFO_MODULES ++ ?COMPILER_MODULES),
+ {[], Help} = {Mods -- Installed, lists:sort(Installed -- Mods)};
- {[], Help} = {Mods -- Installed, lists:sort(Installed -- Mods)}.
+modules(Config) ->
+ run(Config, [modules]).
code_mods() ->
- Dir = code:lib_dir(?APP, ebin),
+ Dir = code:lib_dir(diameter, ebin),
{ok, Files} = file:list_dir(Dir),
[?A(lists:reverse(R)) || N <- Files, "maeb." ++ R <- [lists:reverse(N)]].
@@ -121,9 +140,12 @@ code_mods() ->
%% Ensure that no module does export_all.
%% ===========================================================================
+exports({App, _Config}) ->
+ Mods = fetch(modules, App),
+ [] = [M || M <- Mods, exports_all(M)];
+
exports(Config) ->
- Mods = fetch(modules, fetch(app, Config)),
- [] = [M || M <- Mods, exports_all(M)].
+ run(Config, [exports]).
exports_all(Mod) ->
Opts = fetch(options, Mod:module_info(compile)),
@@ -136,8 +158,7 @@ exports_all(Mod) ->
%% Ensure that it's possible to build a minimal release with our app file.
%% ===========================================================================
-release(Config) ->
- App = fetch(app, Config),
+release({App, Config}) ->
Rel = {release,
{"diameter test release", fetch(vsn, App)},
{erts, erlang:system_info(version)},
@@ -146,13 +167,16 @@ release(Config) ->
ok = write_file(filename:join([Dir, "diameter_test.rel"]), Rel),
{ok, _, []} = systools:make_script("diameter_test", [{path, [Dir]},
{outdir, Dir},
- silent]).
+ silent]);
+
+release(Config) ->
+ run(Config, [release]).
%% sasl need to be included to avoid a missing_sasl warning, error
%% in the case of relup/1.
appvsn(Name) ->
- [{application, Name, App}] = diameter_util:consult(Name, app),
+ [{application, Name, App}] = ?util:consult(Name, app),
fetch(vsn, App).
%% ===========================================================================
@@ -162,8 +186,7 @@ appvsn(Name) ->
%% or one in an application we haven't declared as a dependency. (Almost.)
%% ===========================================================================
-xref(Config) ->
- App = fetch(app, Config),
+xref({App, _Config}) ->
Mods = fetch(modules, App), %% modules listed in the app file
%% List of application names extracted from runtime_dependencies.
@@ -179,7 +202,7 @@ xref(Config) ->
%% the sense that there's no .app file, and isn't listed in
%% applications.
ok = lists:foreach(fun(A) -> add_application(XRef, A) end,
- [?APP, erts | fetch(applications, App)]),
+ [diameter, erts | fetch(applications, App)]),
{ok, Undefs} = xref:analyze(XRef, undefined_function_calls),
{ok, RTmods} = xref:analyze(XRef, {module_use, Mods}),
@@ -212,7 +235,10 @@ xref(Config) ->
%% The declared application versions are ignored since we only
%% know what we see now.
[] = lists:filter(fun(M) -> not lists:member(app(M), Deps) end,
- RTdeps -- Mods).
+ RTdeps -- Mods);
+
+xref(Config) ->
+ run(Config, [xref]).
ignored({FromMod,_,_}, {ToMod,_,_} = To, Rel)->
%% diameter_tcp does call ssl despite the latter not being listed
@@ -281,7 +307,7 @@ add_application(XRef, App, Dir)
{ok, App} = xref:add_application(XRef, Dir, []).
make_name(Suf) ->
- list_to_atom(atom_to_list(?APP) ++ "_" ++ atom_to_list(Suf)).
+ list_to_atom("diameter_" ++ atom_to_list(Suf)).
%% ===========================================================================
%% # relup/1
@@ -289,11 +315,10 @@ make_name(Suf) ->
%% Ensure that we can generate release upgrade files using our appup file.
%% ===========================================================================
-relup(Config) ->
- [{Vsn, Up, Down}] = diameter_util:consult(?APP, appup),
+relup({App, Config}) ->
+ [{Vsn, Up, Down}] = ?util:consult(diameter, appup),
true = is_vsn(Vsn),
- App = fetch(app, Config),
Rel = [{erts, erlang:system_info(version)}
| [{A, appvsn(A)} || A <- [sasl | fetch(applications, App)]]],
@@ -303,26 +328,19 @@ relup(Config) ->
UpFrom = acc_rel(Dir, Rel, Up),
DownTo = acc_rel(Dir, Rel, Down),
- {[Name], [Name], [], []} %% no current in up/down and go both ways
- = {[Name] -- UpFrom,
- [Name] -- DownTo,
- UpFrom -- DownTo,
- DownTo -- UpFrom},
-
+ {[], []} = {UpFrom -- DownTo, DownTo -- UpFrom},
[[], []] = [S -- sets:to_list(sets:from_list(S))
|| S <- [UpFrom, DownTo]],
{ok, _, _, []} = systools:make_relup(Name, UpFrom, DownTo, [{path, [Dir]},
{outdir, Dir},
- silent]).
+ silent]);
-acc_rel(Dir, Rel, List) ->
- lists:foldl(fun(T,A) -> acc_rel(Dir, Rel, T, A) end,
- [],
- List).
+relup(Config) ->
+ run(Config, [relup]).
-acc_rel(Dir, Rel, {Vsn, _}, Acc) ->
- [write_rel(Dir, Rel, Vsn) | Acc].
+acc_rel(Dir, Rel, List) ->
+ lists:map(fun({V,_}) -> write_rel(Dir, Rel, V) end, List).
%% Write a rel file and return its name.
write_rel(Dir, [Erts | Apps], Vsn) ->
diff --git a/lib/diameter/test/diameter_capx_SUITE.erl b/lib/diameter/test/diameter_capx_SUITE.erl
index 51b6c1d7f2..35e62b7eda 100644
--- a/lib/diameter/test/diameter_capx_SUITE.erl
+++ b/lib/diameter/test/diameter_capx_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,39 +25,30 @@
-module(diameter_capx_SUITE).
+%% testcases, no common_test dependency
+-export([run/0]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/2,
- end_per_group/2,
- init_per_testcase/2,
- end_per_testcase/2]).
-
-%% testcases
--export([start/1,
- vendor_id/1,
- start_services/1,
- add_listeners/1,
- s_no_common_application/1,
- c_no_common_application/1,
- s_no_common_security/1,
- c_no_common_security/1,
- s_unknown_peer/1,
- c_unknown_peer/1,
- s_unable/1,
- c_unable/1,
- s_client_reject/1,
- c_client_reject/1,
- remove_listeners/1,
- stop_services/1,
- stop/1]).
+ traffic/1]).
%% diameter callbacks
-export([peer_up/4,
peer_down/4]).
+%% internal
+-export([s_no_common_application/1,
+ s_no_common_security/1,
+ s_unknown_peer/1,
+ s_unable/1,
+ s_client_reject/1,
+ c_no_common_application/1,
+ c_no_common_security/1,
+ c_unknown_peer/1,
+ c_unable/1,
+ c_client_reject/1]).
+
-include("diameter.hrl").
-include("diameter_gen_base_rfc3588.hrl").
%% Use only the Vendor-Specific-Application-Id record from the base
@@ -108,65 +99,20 @@
-define(caps, #diameter_caps).
-define(packet, #diameter_packet).
--define(fail(T), erlang:error({T, process_info(self(), messages)})).
-
--define(TIMEOUT, 10000).
-
-define(DICTS, [rfc3588, rfc6733]).
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
-
-all() -> [start,
- vendor_id,
- start_services,
- add_listeners]
- ++ [{group, D, P} || D <- ?DICTS, P <- [[], [parallel]]]
- ++ [remove_listeners,
- stop_services,
- stop].
-
-groups() ->
- Tc = lists:flatmap(fun tc/1, tc()),
- [{D, [], Tc} || D <- ?DICTS].
-
-init_per_suite(Config) ->
- lists:foreach(fun load_dict/1, ?NOAPPS),
- Config.
-
-end_per_suite(_Config) ->
- [] = [Mod || N <- ?NOAPPS,
- Mod <- [dict(N)],
- false <- [code:delete(Mod)]],
- ok.
+ [{timetrap, {seconds, 20}}].
-%% Generate a unique hostname for each testcase so that watchdogs
-%% don't prevent a connection from being brought up immediately.
-init_per_testcase(Name, Config) ->
- [{host, ?L(Name) ++ "." ++ diameter_util:unique_string()}
- | Config].
+all() ->
+ [traffic].
-init_per_group(Name, Config) ->
- [{rfc, Name} | Config].
+traffic(_Config) ->
+ run().
-end_per_group(_, _) ->
- ok.
-
-end_per_testcase(N, _)
- when N == start;
- N == vendor_id;
- N == start_services;
- N == add_listeners;
- N == remove_listeners;
- N == stop_services;
- N == stop ->
- ok;
-
-end_per_testcase(Name, Config) ->
- CRef = ?util:read_priv(Config, Name),
- ok = diameter:remove_transport(?CLIENT, CRef).
+%% ===========================================================================
%% Testcases all come in two flavours, client and server.
tc(Name) ->
@@ -179,17 +125,46 @@ tc() ->
unable,
client_reject].
-%% ===========================================================================
-%% start/stop testcases
+run() ->
+ try
+ ?util:run([{fun traffic/0, 15000}])
+ after
+ ok = diameter:stop(),
+ [] = [M || N <- ?NOAPPS,
+ M <- [dict(N)],
+ B <- [code:delete(M)],
+ _ <- [code:purge(M)],
+ not B]
+ end.
-start(_Config) ->
- ok = diameter:start().
+traffic() ->
+ lists:foreach(fun load_dict/1, ?NOAPPS),
+ ok = diameter:start(),
+ _ = vendor_id(),
+ ok = diameter:start_service(?SERVER, ?SERVICE),
+ ok = diameter:start_service(?CLIENT, ?SERVICE),
+ LRefs = add_listeners(),
+ ?util:run([[fun traffic/3, F, D, LRefs] || D <- ?DICTS,
+ N <- tc(),
+ F <- tc(N)]),
+ ok = diameter:remove_transport(?SERVER, true),
+ ok = diameter:stop_service(?CLIENT),
+ ok = diameter:stop_service(?SERVER).
+
+%% Generate a unique hostname for each testcase so that watchdogs
+%% don't prevent a connection from being brought up immediately.
+traffic(F, Dict, {_Base, _Acct} = LRefs) ->
+ apply(?MODULE,
+ F,
+ [[{lref, LRefs},
+ {rfc, Dict},
+ {host, ?L(F) ++ "." ++ ?util:unique_string()}]]).
%% Ensure that both integer and list-valued vendor id's can be
%% configured in a Vendor-Specific-Application-Id, the arity having
%% changed between RFC 3588 and RFC 6733.
-vendor_id(_Config) ->
- [] = ?util:run([[fun vid/1, V] || V <- [1, [1], [1,2], x]]).
+vendor_id() ->
+ ?util:run([[fun vid/1, V] || V <- [1, [1], [1,2], x]]).
vid(V) ->
RC = diameter:start_service(make_ref(),
@@ -203,14 +178,10 @@ vid(x, {error, _}) ->
vid(_, ok) ->
ok.
-start_services(_Config) ->
- ok = diameter:start_service(?SERVER, ?SERVICE),
- ok = diameter:start_service(?CLIENT, ?SERVICE).
-
%% One server that responds only to base accounting, one that responds
%% to both this and the common application. Share a common service just
%% to simplify config, and because we can.
-add_listeners(Config) ->
+add_listeners() ->
Acct = [listen(?SERVER,
[{capabilities, [{'Origin-Host', ?HOST(H)},
{'Auth-Application-Id', []}]},
@@ -224,17 +195,7 @@ add_listeners(Config) ->
{capabilities_cb, [fun server_capx/3, base]}])
|| {A,H} <- [{[base3588, acct3588], "base3588-srv"},
{[base6733, acct6733], "base6733-srv"}]],
- ?util:write_priv(Config, ?MODULE, {Base, Acct}). %% lref/2 reads
-
-remove_listeners(_Config) ->
- ok = diameter:remove_transport(?SERVER, true).
-
-stop_services(_Config) ->
- ok = diameter:stop_service(?CLIENT),
- ok = diameter:stop_service(?SERVER).
-
-stop(_Config) ->
- ok = diameter:stop().
+ {Base, Acct}.
%% ===========================================================================
%% All the testcases come in pairs, one for receiving an event on the
@@ -338,13 +299,10 @@ s_client_reject(Config) ->
receive
?event{service = ?SERVER,
info = {up, LRef,
- {_, ?caps{origin_host = {_, OH}}},
- {listen, _},
- ?packet{}}}
- = Info ->
- Info
- after ?TIMEOUT ->
- ?fail({LRef, OH})
+ {_, ?caps{origin_host = {_, OH}}},
+ {listen, _},
+ ?packet{}}} ->
+ ok
end.
c_client_reject(Config) ->
@@ -404,12 +362,9 @@ server_closed(Config, F, RC) ->
info = {closed, LRef,
{'CER', RC,
?caps{origin_host = {_, OH}},
- ?packet{}}
- = Reason,
+ ?packet{}},
{listen, _}}} ->
- Reason
- after ?TIMEOUT ->
- ?fail({LRef, OH})
+ ok
end.
%% server_reject/3
@@ -425,12 +380,9 @@ server_reject(Config, F, RC) ->
info = {closed, LRef,
{'CER', {capabilities_cb, _, RC},
?caps{origin_host = {_, OH}},
- ?packet{}}
- = Reason,
+ ?packet{}},
{listen, _}}} ->
- Reason
- after ?TIMEOUT ->
- ?fail({LRef, OH})
+ ok
end.
%% client_closed/4
@@ -459,8 +411,6 @@ client_recv(CRef) ->
?event{service = ?CLIENT,
info = {closed, CRef, Reason, {connect, _}}} ->
Reason
- after ?TIMEOUT ->
- ?fail(CRef)
end.
%% server_capx/3
@@ -504,20 +454,14 @@ listen(Name, Opts) ->
connect(Config, T, Opts) ->
{_, H} = lists:keyfind(host, 1, Config),
LRef = lref(Config, T),
- CRef = connect(LRef, [{capabilities, [{'Origin-Host', ?HOST(H)}]}
- | Opts]),
- Name = lists:takewhile(fun(C) -> C /= $. end, H),
- ?util:write_priv(Config, Name, CRef), %% end_per_testcase reads
- {CRef, LRef}.
-
-connect(LRef, Opts) ->
[PortNr] = ?util:lport(tcp, LRef),
- {ok, CRef} = diameter:add_transport(?CLIENT,
- {connect, opts(PortNr, Opts)}),
- CRef.
+ {ok, CRef}
+ = diameter:add_transport(?CLIENT, {connect, opts(H, PortNr, Opts)}),
+ {CRef, LRef}.
-opts(PortNr, Opts) ->
- [{transport_module, diameter_tcp},
+opts(Host, PortNr, Opts) ->
+ [{capabilities, [{'Origin-Host', ?HOST(Host)}]},
+ {transport_module, diameter_tcp},
{transport_config, [{raddr, ?ADDR},
{rport, PortNr},
{ip, ?ADDR},
@@ -531,7 +475,7 @@ lref(rfc6733, [_, LRef]) ->
lref(Config, T) ->
lref(proplists:get_value(rfc, Config),
- case ?util:read_priv(Config, ?MODULE) of
+ case proplists:get_value(lref, Config) of
{R, _} when T == base ->
R;
{_, R} when T == acct ->
diff --git a/lib/diameter/test/diameter_codec_SUITE.erl b/lib/diameter/test/diameter_codec_SUITE.erl
index 17112794e4..f92b360dab 100644
--- a/lib/diameter/test/diameter_codec_SUITE.erl
+++ b/lib/diameter/test/diameter_codec_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -28,109 +28,134 @@
-module(diameter_codec_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/2,
- end_per_group/2,
- init_per_testcase/2,
- end_per_testcase/2]).
-
-%% testcases
--export([base/1,
+ base/1,
gen/1,
lib/1,
unknown/1,
- success/1,
- grouped_error/1,
- failed_error/1]).
+ recode/1]).
--include("diameter_ct.hrl").
-include("diameter.hrl").
+-define(util, diameter_util).
-define(L, atom_to_list).
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 10}}].
+ [{timetrap, {seconds, 15}}].
all() ->
- [base, gen, lib, unknown, {group, recode}].
+ [base, gen, lib, unknown, recode].
-groups() ->
- [{recode, [], [success,
- grouped_error,
- failed_error]}].
+base(_Config) ->
+ run(base).
-init_per_suite(Config) ->
- Config.
+gen(_Config) ->
+ run(gen).
-end_per_suite(_Config) ->
- ok.
+lib(_Config) ->
+ run(lib).
-init_per_group(recode, Config) ->
- ok = diameter:start(),
- Config.
+unknown(Config) ->
+ Priv = proplists:get_value(priv_dir, Config),
+ Data = proplists:get_value(data_dir, Config),
+ unknown(Priv, Data).
+
+recode(_Config) ->
+ run(recode).
+
+%% ===========================================================================
+
+%% run/0
+
+run() ->
+ run(all()).
+
+%% run/1
-end_per_group(_, _) ->
- ok = diameter:stop().
+run(base) ->
+ diameter_codec_test:base();
-init_per_testcase(gen, Config) ->
- [{application, ?APP, App}] = diameter_util:consult(?APP, app),
+run(gen) ->
+ [{application, diameter, App}] = diameter_util:consult(diameter, app),
{modules, Ms} = lists:keyfind(modules, 1, App),
[_|_] = Gs = lists:filter(fun(M) ->
lists:prefix("diameter_gen_", ?L(M))
end,
Ms),
- [{dicts, Gs} | Config];
+ lists:foreach(fun diameter_codec_test:gen/1, Gs);
-init_per_testcase(_Name, Config) ->
- Config.
+run(lib) ->
+ diameter_codec_test:lib();
-end_per_testcase(_, _) ->
- ok.
-
-%% ===========================================================================
-
-base(_Config) ->
- diameter_codec_test:base().
+%% Have a separate AVP dictionary just to exercise more code.
+run(unknown) ->
+ PD = ?util:mktemp("diameter_codec"),
+ DD = filename:join([code:lib_dir(diameter),
+ "test",
+ "diameter_codec_SUITE_data"]),
+ try
+ unknown(PD, DD)
+ after
+ file:del_dir_r(PD)
+ end;
+
+run(success) ->
+ success();
+
+run(grouped_error) ->
+ grouped_error();
+
+run(failed_error) ->
+ failed_error();
+
+run(recode) ->
+ ok = diameter:start(),
+ try
+ ?util:run([{?MODULE, run, [F]} || F <- [success,
+ grouped_error,
+ failed_error]])
+ after
+ ok = diameter:stop()
+ end;
-gen([{dicts, Ms} | _]) ->
- lists:foreach(fun diameter_codec_test:gen/1, Ms).
+run(List) ->
+ ?util:run([{{?MODULE, run, [F]}, 10000} || F <- List]).
-lib(_Config) ->
- diameter_codec_test:lib().
+%% ===========================================================================
-%% Have a separate AVP dictionary just to exercise more code.
-unknown(Config) ->
- Priv = proplists:get_value(priv_dir, Config),
- Data = proplists:get_value(data_dir, Config),
- ok = make(Data, "recv.dia"),
- ok = make(Data, "avps.dia"),
- {ok, _, _} = compile("diameter_test_avps.erl"),
- ok = make(Data, "send.dia"),
- {ok, _, _} = compile("diameter_test_send.erl"),
- {ok, _, _} = compile("diameter_test_recv.erl"),
- {ok, _, _} = compile(filename:join([Data, "diameter_test_unknown.erl"]),
+unknown(Priv, Data) ->
+ ok = make(Data, "recv.dia", Priv),
+ ok = make(Data, "avps.dia", Priv),
+ {ok, _, _} = compile(Priv, "diameter_test_avps.erl"),
+ ok = make(Data, "send.dia", Priv),
+ {ok, _, _} = compile(Priv, "diameter_test_send.erl"),
+ {ok, _, _} = compile(Priv, "diameter_test_recv.erl"),
+ {ok, _, _} = compile(Priv,
+ filename:join([Data, "diameter_test_unknown.erl"]),
[{i, Priv}]),
diameter_test_unknown:run().
-make(Dir, File) ->
- diameter_make:codec(filename:join([Dir, File])).
+make(Dir, File, Out) ->
+ diameter_make:codec(filename:join(Dir, File), [{outdir, Out}]).
-compile(File) ->
- compile(File, []).
+compile(Dir, File) ->
+ compile(Dir, File, []).
-compile(File, Opts) ->
- compile:file(File, [return | Opts]).
+compile(Dir, File, Opts) ->
+ compile:file(filename:join(Dir, File), [return | Opts]).
%% ===========================================================================
%% Ensure a Grouped AVP is represented by a list in the avps field.
-success(_) ->
+success() ->
Avps = [{295, <<1:32>>}, %% Termination-Cause
{284, [{280, "Proxy-Host"}, %% Proxy-Info
{33, "Proxy-State"}, %%
@@ -145,13 +170,13 @@ success(_) ->
value = 2,
data = <<2:32>>}]],
errors = []}
- = str(recode(str(Avps))).
+ = str(repkg(str(Avps))).
%% ===========================================================================
%% Ensure a Grouped AVP is represented by a list in the avps field
%% even in the case of a decode error on a component AVP.
-grouped_error(_) ->
+grouped_error() ->
Avps = [{295, <<1:32>>}, %% Termination-Cause
{284, [{295, <<0:32>>}, %% Proxy-Info, Termination-Cause
{280, "Proxy-Host"},
@@ -166,13 +191,13 @@ grouped_error(_) ->
#diameter_avp{code = 280},
#diameter_avp{code = 33}]],
errors = [{5004, #diameter_avp{code = 284}}]}
- = str(recode(str(Avps))).
+ = str(repkg(str(Avps))).
%% ===========================================================================
%% Ensure that a failed decode in Failed-AVP is acceptable, and that
%% the component AVPs are decoded if possible.
-failed_error(_) ->
+failed_error() ->
Avps = [{279, [{295, <<0:32>>}, %% Failed-AVP, Termination-Cause
{258, <<1:32>>}, %% Auth-Application-Id
{284, [{280, "Proxy-Host"}, %% Proxy-Info
@@ -195,7 +220,7 @@ failed_error(_) ->
value = 2,
data = <<2:32>>}]]],
errors = []}
- = sta(recode(sta(Avps))).
+ = sta(repkg(sta(Avps))).
%% ===========================================================================
@@ -279,9 +304,9 @@ avp([{_,_} | _] = Avps) ->
avp(V) ->
V.
-%% recode/1
+%% repkg/1
-recode(Msg) ->
+repkg(Msg) ->
recode(Msg, diameter_gen_base_rfc6733).
recode(#diameter_packet{} = Pkt, Dict) ->
diff --git a/lib/diameter/test/diameter_codec_test.erl b/lib/diameter/test/diameter_codec_test.erl
index 70e910ffa6..e4ad139d93 100644
--- a/lib/diameter/test/diameter_codec_test.erl
+++ b/lib/diameter/test/diameter_codec_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -469,7 +469,7 @@ values(Name, Mod) ->
%%
%% Pack four variants of group values: tagged list containing all
%% values, the corresponding record, a minimal tagged list and the
-%% coresponding record.
+%% corresponding record.
group(Mod, Name, Rec, Avps, Enum) ->
lists:map(fun(B) -> group(Mod, Name, Rec, Avps, Enum, B) end,
diff --git a/lib/diameter/test/diameter_compiler_SUITE.erl b/lib/diameter/test/diameter_compiler_SUITE.erl
index 73fe1ef6e0..cd886d4e8e 100644
--- a/lib/diameter/test/diameter_compiler_SUITE.erl
+++ b/lib/diameter/test/diameter_compiler_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,16 +24,17 @@
-module(diameter_compiler_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- init_per_suite/1,
- end_per_suite/1]).
-
-%% testcases
--export([format/1, format/2,
- replace/1, replace/2,
- generate/1, generate/4,
- flatten1/1, flatten1/3,
+ format/1,
+ replace/1,
+ generate/1,
+ flatten1/1,
flatten2/1]).
-export([dict/0]). %% fake dictionary module
@@ -364,7 +365,7 @@
%% ===========================================================================
suite() ->
- [{timetrap, {minutes, 10}}].
+ [{timetrap, {seconds, 200}}].
all() ->
[format,
@@ -373,36 +374,55 @@ all() ->
flatten1,
flatten2].
-%% Error handling testcases will make an erroneous dictionary out of
-%% the base dictionary and check that the expected error results.
-%% ?REPLACE encodes the modifications and expected error.
-init_per_suite(Config) ->
+%% ===========================================================================
+
+%% run/0
+
+run() ->
+ run(all()).
+
+%% run/1
+
+run(List)
+ when is_list(List) ->
+ Tmp = ?util:mktemp("diameter_compiler"),
+ try
+ run(List, Tmp)
+ after
+ file:del_dir_r(Tmp)
+ end.
+
+%% run/2
+
+run(List, Dir)
+ when is_list(List) ->
Path = filename:join([code:lib_dir(diameter, src), "dict", ?base]),
{ok, Bin} = file:read_file(Path),
- [{base, Bin} | Config].
+ ?util:run([{{?MODULE, F, [{Bin, Dir}]}, 180000} || F <- List]);
-end_per_suite(_Config) ->
- ok.
+run(F, Config) ->
+ run([F], proplists:get_value(priv_dir, Config)).
%% ===========================================================================
%% format/1
%%
%% Ensure that parse o format is the identity map.
-format(Config) ->
- Bin = proplists:get_value(base, Config),
- [] = ?util:run([{?MODULE, [format, M, Bin]}
- || E <- ?REPLACE,
- {ok, M} <- [norm(E)]]).
+format({<<_/binary>> = Bin, _Dir}) ->
+ ?util:run([{?MODULE, format, [{M, Bin}]} || E <- ?REPLACE,
+ {ok, M} <- [norm(E)]]);
-format(Mods, Bin) ->
+format({Mods, Bin}) ->
B = modify(Bin, Mods),
- {ok, Dict} = parse(B, []),
- {ok, D} = parse(diameter_make:format(Dict), []),
- {Dict, Dict} = {Dict, D}.
+ {ok, Dict} = parse(B),
+ {ok, D} = parse(diameter_make:format(Dict)),
+ {Dict, Dict} = {Dict, D};
+
+format(Config) ->
+ run(format, Config).
-parse(File, Opts) ->
- case diameter_make:codec(File, [parse, hrl, return | Opts]) of
+parse(File) ->
+ case diameter_make:codec(File, [parse, hrl, return]) of
{ok, [Dict, _]} ->
{ok, Dict};
{error, _} = E ->
@@ -415,20 +435,21 @@ parse(File, Opts) ->
%% Ensure the expected success/error when parsing a morphed common
%% dictionary.
-replace(Config) ->
- Bin = proplists:get_value(base, Config),
- [] = ?util:run([{?MODULE, [replace, N, Bin]}
- || E <- ?REPLACE,
- N <- [norm(E)]]).
+replace({<<_/binary>> = Bin, _Dir}) ->
+ ?util:run([{?MODULE, replace, [{N, Bin}]} || E <- ?REPLACE,
+ N <- [norm(E)]]);
-replace({E, Mods}, Bin) ->
+replace({{E, Mods}, Bin}) ->
B = modify(Bin, Mods),
- case {E, parse(B, [{include, here()}]), Mods} of
+ case {E, parse(B), Mods} of
{ok, {ok, Dict}, _} ->
Dict;
{_, {error, {E,_} = T}, _} when E /= ok ->
diameter_make:format_error(T)
- end.
+ end;
+
+replace(Config) ->
+ run(replace, Config).
re({RE, Repl}, Bin) ->
re:replace(Bin, RE, Repl, [multiline]).
@@ -438,23 +459,26 @@ re({RE, Repl}, Bin) ->
%%
%% Ensure success when generating code and compiling.
-generate(Config) ->
- Bin = proplists:get_value(base, Config),
+generate({<<_/binary>> = Bin, Dir}) ->
Rs = lists:zip(?REPLACE, lists:seq(1, length(?REPLACE))),
- [] = ?util:run([{?MODULE, [generate, M, Bin, N, T]}
- || {E,N} <- Rs,
- {ok, M} <- [norm(E)],
- T <- [erl, hrl, parse, forms]]).
+ ?util:run([{?MODULE, generate, [{M, Bin, N, T, Dir}]}
+ || {E,N} <- Rs,
+ {ok, M} <- [norm(E)],
+ T <- [erl, hrl, parse, forms]]);
-generate(Mods, Bin, N, Mode) ->
+generate({Mods, Bin, N, Mode, Dir}) ->
B = modify(Bin, Mods ++ [{"@name .*", "@name dict" ++ ?L(N)}]),
- {ok, Dict} = parse(B, []),
+ {ok, Dict} = parse(B),
File = "dict" ++ integer_to_list(N),
{_, ok} = {Dict, diameter_make:codec(Dict,
[{name, File},
{prefix, "base"},
+ {outdir, Dir},
Mode])},
- generate(Mode, File, Dict).
+ generate(Mode, filename:join(Dir, File), Dict);
+
+generate(Config) ->
+ run(generate, Config).
generate(erl, File, _) ->
{ok, _} = compile:file(File ++ ".erl", [return_errors]);
@@ -473,21 +497,21 @@ generate(hrl, _, _) ->
%% ===========================================================================
%% flatten1/1
-flatten1(_Config) ->
+flatten1({Key, BaseD, FlatD}) ->
+ Vs = orddict:fetch(Key, BaseD),
+ Vs = orddict:fetch(Key, FlatD);
+
+flatten1(_) ->
[Vsn | BaseD] = diameter_gen_base_rfc6733:dict(),
- {ok, I} = parse("@inherits diameter_gen_base_rfc6733\n", []),
+ {ok, I} = parse("@inherits diameter_gen_base_rfc6733\n"),
[Vsn | FlatD] = diameter_make:flatten(I),
- [] = ?util:run([{?MODULE, [flatten1, K, BaseD, FlatD]}
- || K <- [avp_types, grouped, enum]]).
-
-flatten1(Key, BaseD, FlatD) ->
- Vs = orddict:fetch(Key, BaseD),
- Vs = orddict:fetch(Key, FlatD).
+ ?util:run([{?MODULE, flatten1, [{K, BaseD, FlatD}]}
+ || K <- [avp_types, grouped, enum]]).
%% ===========================================================================
%% flatten2/1
-flatten2(_Config) ->
+flatten2(_) ->
Dict1 =
"@name diameter_test1\n"
"@prefix diameter_test1\n"
@@ -576,8 +600,5 @@ norm({E, RE, Repl}) ->
norm({_,_} = T) ->
T.
-here() ->
- filename:dirname(code:which(?MODULE)).
-
dict() ->
[0 | orddict:new()].
diff --git a/lib/diameter/test/diameter_config_SUITE.erl b/lib/diameter/test/diameter_config_SUITE.erl
index 31a6b49041..90773e8f6d 100644
--- a/lib/diameter/test/diameter_config_SUITE.erl
+++ b/lib/diameter/test/diameter_config_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2015. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,14 +25,15 @@
-module(diameter_config_SUITE).
--export([suite/0,
- all/0]).
+%% testscases, no common_test dependency
+-export([run/0,
+ run/1]).
-%% testcases
--export([start/1,
+%% common_test wrapping
+-export([suite/0,
+ all/0,
start_service/1,
- add_transport/1,
- stop/1]).
+ add_transport/1]).
-define(util, diameter_util).
@@ -204,38 +205,53 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 15}}].
all() ->
- [start,
- start_service,
- add_transport,
- stop].
+ [start_service,
+ add_transport].
+
+start_service(_Config) ->
+ run([start_service]).
+
+add_transport(_Config) ->
+ run([add_transport]).
%% ===========================================================================
-start(_) ->
- ok = diameter:start().
+run() ->
+ run(all()).
-start_service(T)
- when is_tuple(T) ->
- do(fun start/3, T);
+run(List)
+ when is_list(List) ->
+ try
+ ?util:run([[[fun run/1, {F, 5000}] || F <- List]])
+ after
+ dbg:stop_clear(),
+ diameter:stop()
+ end;
+
+run({F, Tmo}) ->
+ ok = diameter:start(),
+ try
+ ?util:run([{[fun run/1, F], Tmo}])
+ after
+ ok = diameter:stop()
+ end;
-start_service(_) ->
- [] = ?util:run([{?MODULE, start_service, [T]}
- || T <- [lists:keyfind(capabilities, 1, ?TRANSPORT_CONFIG)
- | ?SERVICE_CONFIG]]).
+run(start_service) ->
+ ?util:run([[fun start/1, T]
+ || T <- [lists:keyfind(capabilities, 1, ?TRANSPORT_CONFIG)
+ | ?SERVICE_CONFIG]]);
-add_transport(T)
- when is_tuple(T) ->
- do(fun add/3, T);
+run(add_transport) ->
+ ?util:run([[fun add/1, T] || T <- ?TRANSPORT_CONFIG]).
-add_transport(_) ->
- [] = ?util:run([{?MODULE, add_transport, [T]}
- || T <- ?TRANSPORT_CONFIG]).
+start(T) ->
+ do(fun start/3, T).
-stop(_) ->
- ok = diameter:stop().
+add(T) ->
+ do(fun add/3, T).
%% ===========================================================================
diff --git a/lib/diameter/test/diameter_dist_SUITE.erl b/lib/diameter/test/diameter_dist_SUITE.erl
index 2fda2830ae..81d2dfbf36 100644
--- a/lib/diameter/test/diameter_dist_SUITE.erl
+++ b/lib/diameter/test/diameter_dist_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2019-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2019-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,16 +25,13 @@
-module(diameter_dist_SUITE).
--export([suite/0,
- all/0]).
+%% all tests, no common_test dependency
+-export([run/0]).
-%% testcases
--export([enslave/1, enslave/0,
- ping/1,
- start/1,
- connect/1,
- send/1,
- stop/1, stop/0]).
+%% common_test wrapping
+-export([suite/0,
+ all/0,
+ traffic/1]).
%% diameter callbacks
-export([peer_up/3,
@@ -46,7 +43,11 @@
handle_error/4,
handle_request/3]).
--export([call/1]).
+%% rpc calls
+-export([start/1,
+ call/1,
+ connect/1,
+ ping/1]).
-include("diameter.hrl").
-include("diameter_gen_base_rfc6733.hrl").
@@ -95,26 +96,35 @@
{server2, ?SERVER},
{client, ?CLIENT}]).
-%% Options to ct_slave:start/2.
--define(TIMEOUTS, [{T, 15000} || T <- [boot_timeout,
- init_timeout,
- start_timeout]]).
-
%% ===========================================================================
+%% common_test wrapping
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 90}}].
all() ->
- [enslave,
- ping,
- start,
- connect,
- send,
- stop].
+ [traffic].
+
+traffic(_Config) ->
+ run().
%% ===========================================================================
-%% start/stop testcases
+
+%% run/0
+
+run() ->
+ [] = ?util:run([{fun traffic/0, 60000}]).
+ %% process for linked peers to die with
+
+%% traffic/0
+
+traffic() ->
+ true = is_alive(), %% need distribution for peer nodes
+ Nodes = enslave(),
+ [] = ping(lists:droplast(Nodes)), %% drop client node
+ [] = start(Nodes),
+ ok = connect(Nodes),
+ ok = send(Nodes).
%% enslave/1
%%
@@ -122,39 +132,29 @@ all() ->
%% one to implement a client.
enslave() ->
- [{timetrap, {seconds, 30*length(?NODES)}}].
-
-enslave(Config) ->
Here = filename:dirname(code:which(?MODULE)),
Ebin = filename:join([Here, "..", "ebin"]),
- Dirs = [Here, Ebin],
- Nodes = [{N,S} || {M,S} <- ?NODES, N <- [slave(M, Dirs)]],
- ?util:write_priv(Config, nodes, [{N,S} || {{N,ok},S} <- Nodes]),
- [] = [{T,S} || {{_,E} = T, S} <- Nodes, E /= ok].
-
-slave(Name, Dirs) ->
- add_pathsa(Dirs, ct_slave:start(Name, ?TIMEOUTS)).
+ Args = ["-pa", Here, Ebin],
+ [{N,S} || {M,S} <- ?NODES, N <- [start(M, Args)]].
-add_pathsa(Dirs, {ok, Node}) ->
- {Node, rpc:call(Node, code, add_pathsa, [Dirs])};
-add_pathsa(_, No) ->
- {No, error}.
+start(Name, Args) ->
+ {ok, _, Node} = ?util:peer(#{name => Name, args => Args}),
+ Node.
%% ping/1
%%
%% Ensure the server nodes are connected so that diameter_dist can attach.
ping({S, Nodes}) ->
- ?SERVER = S,
+ ?SERVER = S, %% assert
[N || {N,_} <- Nodes,
node() /= N,
pang <- [net_adm:ping(N)]];
-ping(Config) ->
- Nodes = lists:droplast(?util:read_priv(Config, nodes)),
- [] = [{N,RC} || {N,S} <- Nodes,
- RC <- [rpc:call(N, ?MODULE, ping, [{S,Nodes}])],
- RC /= []].
+ping(Nodes) ->
+ [{N,RC} || {N,S} <- Nodes,
+ RC <- [rpc:call(N, ?MODULE, ping, [{S,Nodes}])],
+ RC /= []].
%% start/1
%%
@@ -168,7 +168,7 @@ ping(Config) ->
%% which case the application needs to be started and diameter_dist is
%% started as a part of this, but only start the server here to ensure
%% everything still works as expected.
-start({_SvcName, [_, {S1, _}, {S2, _}, _]})
+start({_SvcName, [_, {S1, _}, {S2, _}, _]})
when node() == S1; %% server1
node() == S2 -> %% server2
Mod = diameter_dist,
@@ -181,12 +181,10 @@ start({SvcName, [{S0, _}, _, _, {C, _}]})
ok = diameter:start(),
ok = diameter:start_service(SvcName, ?SERVICE((?L(SvcName))));
-start(Config)
- when is_list(Config) ->
- Nodes = ?util:read_priv(Config, nodes),
- [] = [{N,RC} || {N,S} <- Nodes,
- RC <- [rpc:call(N, ?MODULE, start, [{S, Nodes}])],
- RC /= ok].
+start(Nodes) ->
+ [{N,RC} || {N,S} <- Nodes,
+ RC <- [rpc:call(N, ?MODULE, start, [{S, Nodes}])],
+ RC /= ok].
sequence() ->
sequence(sname()).
@@ -211,33 +209,24 @@ origin(Server) ->
%% Establish one connection from the client, terminated on the first
%% server node, the others handling requests.
-connect({?SERVER, Config, [{Node, _} | _]})
+connect({?SERVER, [{Node, _} | _], []})
when Node == node() -> %% server0
- ok = ?util:write_priv(Config, lref, {Node, ?util:listen(?SERVER, tcp)});
+ [_LRef = ?util:listen(?SERVER, tcp)];
-connect({?SERVER, _Config, _}) -> %% server[12]: register to receive requests
- ok = diameter_dist:attach([?SERVER]);
+connect({?SERVER, _, [_] = Acc}) -> %% server[12]: register to receive requests
+ ok = diameter_dist:attach([?SERVER]),
+ Acc;
-connect({?CLIENT, Config, _}) ->
- ?util:connect(?CLIENT, tcp, ?util:read_priv(Config, lref)),
+connect({?CLIENT, [{Node, _} | _], [LRef]}) ->
+ ?util:connect(?CLIENT, tcp, {Node, LRef}),
ok;
-connect(Config) ->
- Nodes = ?util:read_priv(Config, nodes),
- [] = [{N,RC} || {N,S} <- Nodes,
- RC <- [rpc:call(N, ?MODULE, connect, [{S, Config, Nodes}])],
- RC /= ok].
-
-%% stop/1
-%%
-%% Stop the slave nodes.
-
-stop() ->
- [{timetrap, {seconds, 30*length(?NODES)}}].
-
-stop(_Config) ->
- [] = [{N,E} || {N,_} <- ?NODES,
- {error, _, _} = E <- [ct_slave:stop(N)]].
+connect(Nodes) ->
+ lists:foldl(fun({N,S}, A) ->
+ rpc:call(N, ?MODULE, connect, [{S, Nodes, A}])
+ end,
+ [],
+ Nodes).
%% ===========================================================================
%% traffic testcases
@@ -247,13 +236,13 @@ stop(_Config) ->
%% Send 100 requests and ensure the node name sent as User-Name isn't
%% the node terminating transport.
-send(Config) ->
- send(Config, 100, dict:new()).
+send(Nodes) ->
+ send(Nodes, 100, dict:new()).
%% send/2
-send(Config, 0, Dict) ->
- [{Server0, _} | _] = ?util:read_priv(Config, nodes) ,
+send(Nodes, 0, Dict) ->
+ [{Server0, _} | _] = Nodes,
Node = atom_to_binary(Server0, utf8),
{false, _} = {dict:is_key(Node, Dict), dict:to_list(Dict)},
%% Check that counters have been incremented as expected on server0.
@@ -266,14 +255,15 @@ send(Config, 0, Dict) ->
Stats},
{[{send, 0, 100, 2001}], _}
= {[{D,R,N,C} || {{{0,275,R}, D, {'Result-Code', C}}, N} <- Stats],
- Stats};
+ Stats},
+ ok;
-send(Config, N, Dict) ->
+send(Nodes, N, Dict) ->
#diameter_base_STA{'Result-Code' = ?SUCCESS,
'User-Name' = [ServerNode]}
- = send(Config, str(?LOGOUT)),
+ = send(Nodes, str(?LOGOUT)),
true = is_binary(ServerNode),
- send(Config, N-1, dict:update_counter(ServerNode, 1, Dict)).
+ send(Nodes, N-1, dict:update_counter(ServerNode, 1, Dict)).
%% ===========================================================================
@@ -284,8 +274,8 @@ str(Cause) ->
%% send/2
-send(Config, Req) ->
- {Node, _} = lists:last(?util:read_priv(Config, nodes)),
+send(Nodes, Req) ->
+ {Node, _} = lists:last(Nodes),
rpc:call(Node, ?MODULE, call, [Req]).
%% call/1
diff --git a/lib/diameter/test/diameter_distribution_SUITE.erl b/lib/diameter/test/diameter_distribution_SUITE.erl
index 5fe02284ae..013c42496e 100644
--- a/lib/diameter/test/diameter_distribution_SUITE.erl
+++ b/lib/diameter/test/diameter_distribution_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,19 +25,19 @@
-module(diameter_distribution_SUITE).
+%% testcases, no common_test dependency
+-export([run/0]).
+
+%% common_test wrapping
-export([suite/0,
- all/0]).
+ all/0,
+ traffic/1]).
-%% testcases
--export([enslave/1, enslave/0,
- ping/1,
+%% rpc calls
+-export([ping/1,
start/1,
connect/1,
- send_local/1,
- send_remote/1,
- send_timeout/1,
- send_failover/1,
- stop/1, stop/0]).
+ call/1]).
%% diameter callbacks
-export([peer_up/3,
@@ -49,8 +49,6 @@
handle_error/5,
handle_request/3]).
--export([call/1]).
-
-include("diameter.hrl").
-include("diameter_gen_base_rfc6733.hrl").
@@ -99,53 +97,47 @@
{client1, ?CLIENT},
{client2, ?CLIENT}]).
-%% Options to ct_slave:start/2.
--define(TIMEOUTS, [{T, 15000} || T <- [boot_timeout,
- init_timeout,
- start_timeout]]).
-
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 90}}].
all() ->
- [enslave,
- ping,
- start,
- connect,
- send_local,
- send_remote,
- send_timeout,
- send_failover,
- stop].
+ [traffic].
+
+traffic(_Config) ->
+ traffic().
%% ===========================================================================
-%% start/stop testcases
-%% enslave/1
+run() ->
+ [] = ?util:run([{fun traffic/0, 60000}]).
+ %% process for linked peers to die with
+
+%% traffic/0
+
+traffic() ->
+ true = is_alive(), %% need distribution for peer nodes
+ Nodes = enslave(),
+ [] = ping(Nodes), %% drop client node
+ [] = start(Nodes),
+ [_] = connect(Nodes),
+ [] = send(Nodes).
+
+%% enslave/0
%%
%% Start four slave nodes, one to implement a Diameter server,
%% three to implement a client.
enslave() ->
- [{timetrap, {seconds, 30*length(?NODES)}}].
-
-enslave(Config) ->
Here = filename:dirname(code:which(?MODULE)),
Ebin = filename:join([Here, "..", "ebin"]),
- Dirs = [Here, Ebin],
- Nodes = [{N,S} || {M,S} <- ?NODES, N <- [slave(M, Dirs)]],
- ?util:write_priv(Config, nodes, [{N,S} || {{N,ok},S} <- Nodes]),
- [] = [{T,S} || {{_,E} = T, S} <- Nodes, E /= ok].
-
-slave(Name, Dirs) ->
- add_pathsa(Dirs, ct_slave:start(Name, ?TIMEOUTS)).
+ Args = ["-pa", Here, Ebin],
+ [{N,S} || {M,S} <- ?NODES, N <- [start(M, Args)]].
-add_pathsa(Dirs, {ok, Node}) ->
- {Node, rpc:call(Node, code, add_pathsa, [Dirs])};
-add_pathsa(_, No) ->
- {No, error}.
+start(Name, Args) ->
+ {ok, _, Node} = ?util:peer(#{name => Name, args => Args}),
+ Node.
%% ping/1
%%
@@ -160,11 +152,10 @@ ping({?CLIENT, Nodes}) ->
node() /= N,
pang <- [net_adm:ping(N)]];
-ping(Config) ->
- Nodes = ?util:read_priv(Config, nodes),
- [] = [{N,RC} || {N,S} <- Nodes,
- RC <- [rpc:call(N, ?MODULE, ping, [{S, Nodes}])],
- RC /= []].
+ping(Nodes) ->
+ [{N,RC} || {N,S} <- Nodes,
+ RC <- [rpc:call(N, ?MODULE, ping, [{S, Nodes}])],
+ RC /= []].
%% start/1
%%
@@ -175,11 +166,10 @@ start(SvcName)
ok = diameter:start(),
ok = diameter:start_service(SvcName, ?SERVICE((?L(SvcName))));
-start(Config) ->
- Nodes = ?util:read_priv(Config, nodes),
- [] = [{N,RC} || {N,S} <- Nodes,
- RC <- [rpc:call(N, ?MODULE, start, [S])],
- RC /= ok].
+start(Nodes) ->
+ [{N,RC} || {N,S} <- Nodes,
+ RC <- [rpc:call(N, ?MODULE, start, [S])],
+ RC /= ok].
sequence() ->
sequence(sname()).
@@ -212,66 +202,50 @@ peers(client2) -> nodes().
%% Establish one connection to the server from each of the client
%% nodes.
-connect({?SERVER, Config}) ->
- ?util:write_priv(Config, lref, {node(), ?util:listen(?SERVER, tcp)}),
- ok;
+connect({?SERVER, _, []}) ->
+ [_LRef = ?util:listen(?SERVER, tcp)];
-connect({?CLIENT, Config}) ->
- ?util:connect(?CLIENT, tcp, ?util:read_priv(Config, lref)),
- ok;
+connect({?CLIENT, [{Node, _} | _], [LRef] = Acc}) ->
+ ?util:connect(?CLIENT, tcp, {Node, LRef}),
+ Acc;
-connect(Config) ->
- Nodes = ?util:read_priv(Config, nodes),
- [] = [{N,RC} || {N,S} <- Nodes,
- RC <- [rpc:call(N, ?MODULE, connect, [{S,Config}])],
- RC /= ok].
+connect(Nodes) ->
+ lists:foldl(fun({N,S}, A) ->
+ rpc:call(N, ?MODULE, connect, [{S, Nodes, A}])
+ end,
+ [],
+ Nodes).
-%% stop/1
-%%
-%% Stop the slave nodes.
+%% ===========================================================================
-stop() ->
- [{timetrap, {seconds, 30*length(?NODES)}}].
+%% send/1
-stop(_Config) ->
- [] = [{N,E} || {N,_} <- ?NODES,
- {error, _, _} = E <- [ct_slave:stop(N)]].
+send(Nodes) ->
+ ?util:run([[fun send/2, Nodes, T]
+ || T <- [local, remote, timeout, failover]]).
-%% ===========================================================================
-%% traffic testcases
+%% send/2
-%% send_local/1
-%%
%% Send a request from the first client node, using a the local
%% transport.
-
-send_local(Config) ->
+send(Nodes, local) ->
#diameter_base_STA{'Result-Code' = ?SUCCESS}
- = send(Config, local, str(?LOGOUT)).
+ = send(Nodes, 0, str(?LOGOUT));
-%% send_remote/1
-%%
%% Send a request from the first client node, using a transport on the
%% another node.
-
-send_remote(Config) ->
+send(Nodes, remote) ->
#diameter_base_STA{'Result-Code' = ?SUCCESS}
- = send(Config, remote, str(?LOGOUT)).
+ = send(Nodes, 1, str(?LOGOUT));
-%% send_timeout/1
-%%
%% Send a request that the server discards.
+send(Nodes, timeout) ->
+ {error, timeout} = send(Nodes, 1, str(?TIMEOUT));
-send_timeout(Config) ->
- {error, timeout} = send(Config, remote, str(?TIMEOUT)).
-
-%% send_failover/1
-%%
-%% Send a request that causes the server to remote transports down.
-
-send_failover(Config) ->
+%% Send a request that causes the server to take the transport down.
+send(Nodes, failover) ->
#'diameter_base_answer-message'{'Result-Code' = ?BUSY}
- = send(Config, remote, str(?MOVED)).
+ = send(Nodes, 2, str(?MOVED)).
%% ===========================================================================
@@ -280,10 +254,9 @@ str(Cause) ->
'Auth-Application-Id' = ?DICT:id(),
'Termination-Cause' = Cause}.
-%% send/2
+%% send/3
-send(Config, Where, Req) ->
- [_, {Node, _} | _] = ?util:read_priv(Config, nodes) ,
+send([_, {Node, _} | _], Where, Req) ->
rpc:call(Node, ?MODULE, call, [{Where, Req}]).
%% call/1
@@ -311,14 +284,22 @@ peer_down(_SvcName, _Peer, State) ->
%% pick_peer/4
-pick_peer([LP], [_, _], ?CLIENT, _State, {local, client0}) ->
+pick_peer([LP], _, ?CLIENT, _State, {0, client0}) ->
{ok, LP};
-pick_peer([_], [RP | _], ?CLIENT, _State, {remote, client0}) ->
+pick_peer(_, Peers, ?CLIENT, _State, {1, client0}) ->
+ [RP] = [T || {_, #diameter_caps{origin_state_id = {[1],_}}} = T <- Peers],
{ok, RP};
-pick_peer([LP], [], ?CLIENT, _State, {remote, client0}) ->
- {ok, LP}.
+%% Sending on the remote transport causes the server to take the
+%% transport down. Retransmission on the local.
+pick_peer(LP, RP, ?CLIENT, _State, {2, client0}) ->
+ {ok, case [T || {_, #diameter_caps{origin_state_id = {[2],_}}} = T <- RP] of
+ [T] ->
+ T;
+ _ ->
+ hd([_] = LP)
+ end}.
%% prepare_request/4
diff --git a/lib/diameter/test/diameter_dpr_SUITE.erl b/lib/diameter/test/diameter_dpr_SUITE.erl
index 779b919d3c..45f4ec9b5a 100644
--- a/lib/diameter/test/diameter_dpr_SUITE.erl
+++ b/lib/diameter/test/diameter_dpr_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2012-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2012-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,22 +24,26 @@
-module(diameter_dpr_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/2,
- end_per_group/2]).
-
-%% testcases
--export([start/1,
- connect/1,
+ client/1,
+ server/1,
+ uncommon/1,
+ transport/1,
+ service/1,
+ application/1]).
+
+%% internal
+-export([connect/1,
send_dpr/1,
remove_transport/1,
stop_service/1,
- check/1,
- stop/1]).
+ check/1]).
%% disconnect_cb
-export([disconnect/5]).
@@ -84,42 +88,54 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 30}}].
all() ->
- [{group, R} || R <- [client, server, uncommon | ?REASONS]].
+ [client, server, uncommon, transport, service, application].
-%% The group determines how transports are terminated: by remove_transport,
-%% stop_service or application stop.
-groups() ->
- [{R, [], [start, send_dpr, stop]} || R <- [client, server, uncommon]]
- ++ [{R, [], Ts} || Ts <- [tc()], R <- ?REASONS].
+-define(tc(Name), Name(_) -> run([Name])).
-init_per_suite(Config) -> %% not need, but a useful place to enable trace
- Config.
+?tc(client).
+?tc(server).
+?tc(uncommon).
+?tc(transport).
+?tc(service).
+?tc(application).
-end_per_suite(_Config) ->
- ok.
+%% ===========================================================================
-init_per_group(Name, Config) ->
- [{group, Name} | Config].
+%% run/0
-end_per_group(_, _) ->
- ok.
+run() ->
+ run(all()).
-tc() ->
- [start, connect, remove_transport, stop_service, check, stop].
+%% run/1
-%% ===========================================================================
+run(List)
+ when is_list(List) ->
+ try
+ ?util:run([[{[fun run/1, T], 15000} || T <- List]])
+ after
+ diameter:stop()
+ end;
-%% start/1
-
-start(Config)
- when is_list(Config) ->
- Grp = group(Config),
+run(Grp) ->
ok = diameter:start(),
ok = diameter:start_service(?SERVER, service(?SERVER, Grp)),
- ok = diameter:start_service(?CLIENT, service(?CLIENT, Grp)).
+ ok = diameter:start_service(?CLIENT, service(?CLIENT, Grp)),
+ _ = lists:foldl(fun(F,A) -> apply(?MODULE, F, [A]) end,
+ [{group, Grp}],
+ tc(Grp)),
+ ok = diameter:stop().
+
+tc(T)
+ when T == client;
+ T == server;
+ T == uncommon ->
+ [send_dpr];
+
+tc(_) ->
+ [connect, remove_transport, stop_service, check].
service(?SERVER = Svc, _) ->
?SERVICE(Svc)
@@ -192,26 +208,30 @@ sender(_) ->
%% connect/1
connect(Config) ->
- Pid = spawn(fun init/0), %% process for disconnect_cb to bang
+ Self = self(),
Grp = group(Config),
+ Pid = spawn(fun() -> init(Self) end), %% process for disconnect_cb to bang
LRef = ?util:listen(?SERVER, tcp),
Refs = [?util:connect(?CLIENT, tcp, LRef, opts(RCs, {Grp, Pid}))
|| RCs <- ?RETURNS],
- ?util:write_priv(Config, config, [Pid | Refs]).
+ Pid ! (Grp == application orelse length(Refs)),
+ [{config, [Pid | Refs]} | Config].
%% remove_transport/1
%% Remove all the client transports only in the transport group.
remove_transport(Config) ->
transport == group(Config)
- andalso (ok = diameter:remove_transport(?CLIENT, true)).
+ andalso (ok = diameter:remove_transport(?CLIENT, true)),
+ Config.
%% stop_service/1
%% Stop the service only in the service group.
stop_service(Config) ->
service == group(Config)
- andalso (ok = diameter:stop_service(?CLIENT)).
+ andalso (ok = diameter:stop_service(?CLIENT)),
+ Config.
%% check/1
@@ -219,16 +239,11 @@ stop_service(Config) ->
%% for the timing reason explained below.
check(Config) ->
Grp = group(Config),
- [Pid | Refs] = ?util:read_priv(Config, config),
+ [Pid | Refs] = proplists:get_value(config, Config),
Pid ! self(), %% ask for dictionary
Dict = receive {Pid, D} -> D end, %% get it
check(Refs, ?RETURNS, Grp, Dict). %% check for callbacks
-%% stop/1
-
-stop(_Config) ->
- ok = diameter:stop().
-
%% ===========================================================================
%% Whether or not there are callbacks after diameter:stop() depends on
@@ -258,8 +273,7 @@ check1(Ref, [], _, Dict) ->
%% ----------------------------------------
group(Config) ->
- {group, Grp} = lists:keyfind(group, 1, Config),
- Grp.
+ proplists:get_value(group, Config).
%% Configure the callback with the group name (= disconnect reason) as
%% extra argument.
@@ -274,13 +288,18 @@ disconnect(Reason, Ref, Peer, {Reason, Pid}, RC) ->
Pid ! {Reason, Ref},
RC.
-init() ->
- exit(recv(dict:new())).
+init(Pid) ->
+ monitor(process, Pid),
+ exit(recv(receive T -> T end, dict:new())).
-recv(Dict) ->
+recv(true, Dict) ->
+ recv(0, Dict);
+recv(N, Dict) ->
receive
- Pid when is_pid(Pid) ->
+ Pid when N == 0, is_pid(Pid) ->
Pid ! {self(), Dict};
{Reason, Ref} ->
- recv(dict:store(Ref, Reason, Dict))
+ recv(N - 1, dict:store(Ref, Reason, Dict));
+ {'DOWN', _, process, _, _} ->
+ ok
end.
diff --git a/lib/diameter/test/diameter_event_SUITE.erl b/lib/diameter/test/diameter_event_SUITE.erl
index 6d1d1dfd8f..f4cb5e6d79 100644
--- a/lib/diameter/test/diameter_event_SUITE.erl
+++ b/lib/diameter/test/diameter_event_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,20 +26,18 @@
-module(diameter_event_SUITE).
+%% testcase, no common_test dependency
+-export([run/0]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_testcase/2,
- end_per_testcase/2]).
-
-%% testcases
--export([start/1,
- start_server/1,
- up/1,
+ traffic/1]).
+
+%% internal
+-export([up/1,
down/1,
- cea_timeout/1,
- stop/1]).
+ cea_timeout/1]).
-include("diameter.hrl").
@@ -77,43 +75,44 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 90}}].
all() ->
- [start,
- start_server,
- up,
- down,
- cea_timeout,
- stop].
-
-%% Not used, but a convenient place to enable trace.
-init_per_suite(Config) ->
- Config.
-
-end_per_suite(_Config) ->
- ok.
+ [traffic].
-init_per_testcase(Name, Config) ->
- [{name, Name} | Config].
-
-end_per_testcase(_, _) ->
- ok.
+traffic(_Config) ->
+ run().
%% ===========================================================================
-%% start/stop testcases
-start(_Config) ->
- ok = diameter:start().
+%% run/0
-start_server(Config) ->
+run() ->
+ ok = diameter:start(),
+ try
+ ?util:run([{fun traffic/0, 60000}])
+ after
+ ok = diameter:stop()
+ end.
+
+%% traffic/0
+
+traffic() ->
+ PortNr = start_server(),
+ Config = [{portnr, PortNr}],
+ Funs = [up, down, cea_timeout],
+ ?util:run([[{?MODULE, F, [[{name, F} | Config]]} || F <- Funs]]).
+
+%% start_server/0
+
+start_server() ->
diameter:subscribe(?SERVER),
ok = diameter:start_service(?SERVER, ?SERVICE(?SERVER, [?DICT_COMMON])),
LRef = ?util:listen(?SERVER, tcp, [{capabilities_cb, fun capx_cb/2},
{capx_timeout, ?SERVER_CAPX_TMO}]),
[PortNr] = ?util:lport(tcp, LRef),
- ?util:write_priv(Config, portnr, PortNr),
- start = event(?SERVER).
+ start = event(?SERVER),
+ PortNr.
%% Connect with matching capabilities and expect the connection to
%% come up.
@@ -158,9 +157,6 @@ cea_timeout(Config) ->
start = event(Svc),
{{closed, Ref, {'CEA', timeout}, T}, _} = {event(Svc), T}.
-stop(_Config) ->
- ok = diameter:stop().
-
%% ----------------------------------------
%% Keep the server from sending CEA until the client has timed out.
@@ -201,7 +197,7 @@ start_service(Name, Opts) ->
diameter:start_service(Name, [{monitor, self()} | Opts]).
opts(Config, Opts) ->
- PortNr = ?util:read_priv(Config, portnr),
+ PortNr = proplists:get_value(portnr, Config),
{connect, [{transport_module, diameter_tcp},
{transport_config, [{ip, ?ADDR}, {port, 0},
diff --git a/lib/diameter/test/diameter_examples_SUITE.erl b/lib/diameter/test/diameter_examples_SUITE.erl
index 7d47efd527..7bb39cace3 100644
--- a/lib/diameter/test/diameter_examples_SUITE.erl
+++ b/lib/diameter/test/diameter_examples_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,25 +24,20 @@
-module(diameter_examples_SUITE).
+%% testcase, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/2,
- end_per_group/2]).
-
-%% testcases
--export([dict/1, dict/0,
- code/1,
- slave/1, slave/0,
- enslave/1,
- start/1,
- traffic/1,
- stop/1]).
+ dict/1,
+ code/1]).
+%% rpc calls
-export([install/1,
- call/1]).
+ start/1,
+ traffic/1]).
-include("diameter.hrl").
@@ -54,11 +49,6 @@
%% before the clients connect.
-define(NODES, [server, client]).
-%% Options to ct_slave:start/2.
--define(TIMEOUTS, [{T, 15000} || T <- [boot_timeout,
- init_timeout,
- start_timeout]]).
-
%% @inherits dependencies between example dictionaries. This is needed
%% in order compile them in the right order. Can't compile to erl to
%% find out since @inherits is a beam dependency.
@@ -70,68 +60,74 @@
-define(DICT0, [rfc3588_base, rfc6733_base]).
%% Transport protocols over which the example Diameter nodes are run.
--define(PROTS, [tcp, sctp]).
+-define(PROTS, [sctp || ?util:have_sctp()] ++ [tcp]).
+
+-define(L, atom_to_list).
+-define(A, list_to_atom).
%% ===========================================================================
+%% common_test wrapping
suite() ->
- [{timetrap, {minutes, 2}}].
+ [{timetrap, {seconds, 75}}].
all() ->
- [dict,
- code,
- {group, all}].
-
-groups() ->
- Tc = tc(),
- [{all, [parallel], [{group, P} || P <- ?PROTS]}
- | [{P, [], Tc} || P <- ?PROTS]].
-
-%% Not used, but a convenient place to enable trace.
-init_per_suite(Config) ->
- Config.
-
-end_per_suite(_Config) ->
- ok.
-
-init_per_group(all, Config) ->
- Config;
-
-init_per_group(tcp = N, Config) ->
- [{group, N} | Config];
-
-init_per_group(sctp = N, Config) ->
- case ?util:have_sctp() of
- true ->
- [{group, N} | Config];
- false->
- {skip, no_sctp}
+ [dict, code].
+
+dict(Config) ->
+ run(dict, Config).
+
+code(Config) ->
+ run(code, Config).
+
+%% ===========================================================================
+
+%% run/0
+
+run() ->
+ run(all()).
+
+%% run/1
+
+run({dict, Dir}) ->
+ compile_dicts(Dir);
+%% The example code doesn't use the example dictionaries, so a
+%% separate testcase.
+
+run({code, Dir}) ->
+ run_code(Dir);
+
+run(List)
+ when is_list(List) ->
+ Tmp = ?util:mktemp("diameter_examples"),
+ try
+ run(List, Tmp)
+ after
+ file:del_dir_r(Tmp)
end.
-end_per_group(_, _) ->
- ok.
+%% run/2
-tc() ->
- [slave,
- enslave,
- start,
- traffic,
- stop].
+%% Eg. erl -noinput -s diameter_examples_SUITE run code -s init stop ...
+run(List, Dir)
+ when is_list(List) ->
+ ?util:run([{[fun run/1, {F, Dir}], 60000} || F <- List]);
+
+run(F, Config) ->
+ run([F], proplists:get_value(priv_dir, Config)).
%% ===========================================================================
-%% dict/1
+%% compile_dicts/1
%%
%% Compile example dictionaries in examples/dict.
-dict() ->
- [{timetrap, {minutes, 10}}].
-
-dict(_Config) ->
+compile_dicts(Dir) ->
+ Out = mkdir(Dir, "dict"),
Dirs = [filename:join(H ++ ["examples", "dict"])
|| H <- [[code:lib_dir(diameter)], [here(), ".."]]],
[] = [{F,D,RC} || {_,F} <- sort(find_files(Dirs, ".*\\.dia$")),
D <- ?DICT0,
- RC <- [make(F,D)],
+ RC <- [make(F, D, Out)],
RC /= ok].
sort([{_,_} | _] = Files) ->
@@ -162,11 +158,11 @@ dep([{Dict, _} | T], Rest, Acc) ->
dep([], Rest, Acc) ->
dep(Rest, Acc).
-make(Path, Dict0)
+make(Path, Dict0, Out)
when is_atom(Dict0) ->
- make(Path, atom_to_list(Dict0));
+ make(Path, atom_to_list(Dict0), Out);
-make(Path, Dict0) ->
+make(Path, Dict0, Out) ->
Dict = filename:rootname(filename:basename(Path)),
{Mod, Pre} = make_name(Dict),
{"diameter_gen_base" ++ Suf = Mod0, _} = make_name(Dict0),
@@ -174,10 +170,11 @@ make(Path, Dict0) ->
try
ok = to_erl(Path, [{name, Name},
{prefix, Pre},
+ {outdir, Out},
{inherits, "common/" ++ Mod0}
| [{inherits, D ++ "/" ++ M ++ Suf}
|| {D,M} <- dep(Dict)]]),
- ok = to_beam(Name)
+ ok = to_beam(filename:join(Out, Name))
catch
throw: {_,_} = E ->
E
@@ -220,28 +217,35 @@ make_name(Dict) ->
{string:join(["diameter_gen", N, R], "_"), "diameter_" ++ N}.
%% ===========================================================================
-%% code/1
+%% compile_code/1
%%
%% Compile example code under examples/code.
-code(Config) ->
+compile_code(Tmpdir) ->
+ {ok, Pid, Node} = slave(peer:random_name(), here()),
try
- [] = rpc:call(slave(compile, here()),
- ?MODULE,
- install,
- [proplists:get_value(priv_dir, Config)])
+ {ok, _Ebin} = rpc:call(Node, ?MODULE, install, [Tmpdir])
after
- {ok, _} = ct_slave:stop(compile)
+ peer:stop(Pid)
end.
-%% Compile on another node since the code path may be modified.
-install(PrivDir) ->
- Top = install(here(), PrivDir),
+%% Compile in another node since the code path is modified.
+install(Tmpdir) ->
+ {Top, Dia, Ebin} = install(here(), Tmpdir),
+
+ %% Prepend the created directory just so that code:lib_dir/1 finds
+ %% it when compile:file/2 tries to resolve include_lib.
+ true = code:add_patha(Ebin),
+ Dia = code:lib_dir(diameter), %% assert
+
Src = filename:join([Top, "examples", "code"]),
Files = find_files([Src], ".*\\.erl$"),
- [] = [{F,E} || {_,F} <- Files,
- {error, _, _} = E <- [compile:file(F, [warnings_as_errors,
- return_errors])]].
+ [] = [{F,T} || {_,F} <- Files,
+ T <- [compile:file(F, [warnings_as_errors,
+ return_errors,
+ {outdir, Ebin}])],
+ ok /= element(1, T)],
+ {ok, Ebin}.
%% Copy include files into a temporary directory and adjust the code
%% path in order for example code to be able to include them with
@@ -251,20 +255,15 @@ install(PrivDir) ->
%% preprocessor to find these otherwise. Generated hrls are only be
%% under include in an installation. ("Installing" them locally is
%% anathema.)
-install(Dir, PrivDir) ->
- %% Remove the path added by slave/1 (needed for the rpc:call/4 in
- %% compile/1 to find ?MODULE) so the call to code:lib_dir/2 below
- %% returns the installed path.
- [Ebin | _] = code:get_path(),
- true = code:del_path(Ebin),
+install(Dir, Tmpdir) ->
Top = top(Dir, code:lib_dir(diameter)),
%% Create a new diameter/include in priv_dir. Copy all includes
%% there, from below ../include and ../src/gen if they exist (in
%% the repo).
- Tmp = filename:join([PrivDir, "diameter"]),
- TmpInc = filename:join([PrivDir, "diameter", "include"]),
- TmpEbin = filename:join([PrivDir, "diameter", "ebin"]),
+ Tmp = filename:join([Tmpdir, "diameter"]),
+ TmpInc = filename:join([Tmp, "include"]),
+ TmpEbin = filename:join([Tmp, "ebin"]),
[] = [{T,E} || T <- [Tmp, TmpInc, TmpEbin],
{error, E} <- [file:make_dir(T)]],
@@ -275,13 +274,7 @@ install(Dir, PrivDir) ->
B <- [filename:basename(F)],
D <- [filename:join([TmpInc, B])],
{error, E} <- [file:copy(F,D)]],
-
- %% Prepend the created directory just so that code:lib_dir/1 finds
- %% it when compile:file/2 tries to resolve include_lib.
- true = code:add_patha(TmpEbin),
- Tmp = code:lib_dir(diameter), %% assert
- %% Return the top directory containing examples/code.
- Top.
+ {Top, Tmp, TmpEbin}.
find_files(Dirs, RE) ->
lists:foldl(fun(D,A) -> fold_files(D, RE, A) end,
@@ -296,49 +289,19 @@ store(Path, Dict) ->
%% ===========================================================================
-%% slave/1
-%%
-%% Return how long slave start/stop is taking since it seems to be
-%% ridiculously long on some hosts.
-
-slave() ->
- [{timetrap, {minutes, 10}}].
-
-slave(_) ->
- T0 = diameter_lib:now(),
- {ok, Node} = ct_slave:start(?MODULE, ?TIMEOUTS),
- T1 = diameter_lib:now(),
- T2 = rpc:call(Node, diameter_lib, now, []),
- {ok, Node} = ct_slave:stop(?MODULE),
- now_diff([T0, T1, T2, diameter_lib:now()]).
-
-now_diff([T1,T2|_] = Ts) ->
- [diameter_lib:micro_diff(T2,T1) | now_diff(tl(Ts))];
-now_diff(_) ->
- [].
-
-%% ===========================================================================
-
%% enslave/1
%%
%% Start two nodes: one for the server, one for the client.
-enslave(Config) ->
- Prot = proplists:get_value(group, Config),
- Dir = here(),
- Nodes = [{S, slave(N, Dir)} || S <- ?NODES, N <- [concat(Prot, S)]],
- ?util:write_priv(Config, Prot, Nodes).
+enslave(Prefix) ->
+ [{S,N} || D <- [here()],
+ S <- ?NODES,
+ M <- [lists:append(["diameter", Prefix, ?L(S)])],
+ {ok, _, N} <- [slave(M,D)]].
slave(Name, Dir) ->
- {ok, Node} = ct_slave:start(Name, ?TIMEOUTS),
- ok = rpc:call(Node,
- code,
- add_pathsa,
- [[Dir, filename:join([Dir, "..", "ebin"])]]),
- Node.
-
-concat(Prot, Svc) ->
- list_to_atom(atom_to_list(Prot) ++ atom_to_list(Svc)).
+ Args = ["-pa", Dir, filename:join([Dir, "..", "ebin"])],
+ {ok, _Pid, _Node} = ?util:peer(#{name => Name, args => Args}).
here() ->
filename:dirname(code:which(?MODULE)).
@@ -350,27 +313,33 @@ top(Dir, LibDir) ->
false -> LibDir
end.
-%% start/1
+%% start/2
-start({server, Prot}) ->
+start({server, Prot, Ebin}) ->
+ true = code:add_patha(Ebin),
ok = diameter:start(),
ok = server:start(),
{ok, Ref} = server:listen({Prot, any, 3868}),
[_] = ?util:lport(Prot, Ref),
ok;
-start({client = Svc, Prot}) ->
+start({client = Svc, Prot, Ebin}) ->
+ true = code:add_patha(Ebin),
ok = diameter:start(),
true = diameter:subscribe(Svc),
ok = client:start(),
{ok, Ref} = client:connect({Prot, loopback, loopback, 3868}),
- receive #diameter_event{info = {up, Ref, _, _, _}} -> ok end;
+ receive
+ #diameter_event{info = {up, Ref, _, _, _}} ->
+ ok
+ after
+ 2000 ->
+ timeout
+ end;
-start(Config) ->
- Prot = proplists:get_value(group, Config),
- Nodes = ?util:read_priv(Config, Prot),
- [] = [RC || {T,N} <- Nodes,
- RC <- [rpc:call(N, ?MODULE, start, [{T, Prot}])],
+start([Prot, Ebin | Nodes]) ->
+ [] = [RC || {S,N} <- Nodes,
+ RC <- [rpc:call(N, ?MODULE, start, [{S, Prot, Ebin}])],
RC /= ok].
%% traffic/1
@@ -381,30 +350,35 @@ traffic(server) ->
ok;
traffic(client) ->
- {_, MRef} = spawn_monitor(fun() -> call(100) end),
+ {_, MRef} = spawn_monitor(fun() -> exit(call(100)) end),
receive {'DOWN', MRef, process, _, Reason} -> Reason end;
-traffic(Config) ->
- Prot = proplists:get_value(group, Config),
- Nodes = ?util:read_priv(Config, Prot),
+traffic({Prot, Ebin}) ->
+ Nodes = enslave(?L(Prot)),
+ [] = start([Prot, Ebin | Nodes]),
[] = [RC || {T,N} <- Nodes,
RC <- [rpc:call(N, ?MODULE, traffic, [T])],
RC /= ok].
+%% run_code/1
+
+run_code(Dir) ->
+ true = is_alive(), %% need distribution for peer nodes
+ {ok, Ebin} = compile_code(mkdir(Dir, "code")),
+ ?util:run([[fun traffic/1, {T, Ebin}] || T <- ?PROTS]).
+
+%% call/1
+
call(0) ->
- exit(ok);
+ ok;
call(N) ->
{ok, _} = client:call(),
call(N-1).
-%% stop/1
-
-stop(Name)
- when is_atom(Name) ->
- {ok, _Node} = ct_slave:stop(Name),
- ok;
+%% mkdir/2
-stop(Config) ->
- Prot = proplists:get_value(group, Config),
- [] = [RC || N <- ?NODES, RC <- [catch stop(concat(Prot, N))], RC /= ok].
+mkdir(Top, Dir) ->
+ Tmp = filename:join(Top, Dir),
+ ok = file:make_dir(Tmp),
+ Tmp.
diff --git a/lib/diameter/test/diameter_failover_SUITE.erl b/lib/diameter/test/diameter_failover_SUITE.erl
index 8a3b3e8413..0c78119e50 100644
--- a/lib/diameter/test/diameter_failover_SUITE.erl
+++ b/lib/diameter/test/diameter_failover_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -36,20 +36,19 @@
-module(diameter_failover_SUITE).
+%% testcases, no common_test dependency
+-export([run/0]).
+
+%% common_test wrapping
-export([suite/0,
- all/0]).
-
-%% testcases
--export([start/1,
- start_services/1,
- connect/1,
- send_ok/1,
- send_nok/1,
- send_discard_1/1,
- send_discard_2/1,
- stop_services/1,
- empty/1,
- stop/1]).
+ all/0,
+ parallel/1]).
+
+%% internal
+-export([send_ok/0,
+ send_nok/0,
+ send_discard_1/0,
+ send_discard_2/0]).
%% diameter callbacks
-export([pick_peer/4,
@@ -112,50 +111,61 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 90}}].
all() ->
- [start,
- start_services,
- connect,
- send_ok,
- send_nok,
- send_discard_1,
- send_discard_2,
- stop_services,
- empty,
- stop].
+ [parallel].
+
+parallel(_Config) ->
+ run().
%% ===========================================================================
-%% start/stop testcases
-start(_Config) ->
- ok = diameter:start().
+%% run/0
+
+run() ->
+ ok = diameter:start(),
+ try
+ ?util:run([{fun traffic/0, 60000}])
+ after
+ ok = diameter:stop()
+ end.
+
+%% traffic/0
-start_services(_Config) ->
+traffic() ->
+ Servers = start_services(),
+ ok = connect(Servers),
+ [] = send(),
+ [] = stop_services(),
+ [] = ets:tab2list(diameter_request).
+
+%% start_services/0
+
+start_services() ->
Servers = [server(N) || N <- ?SERVERS],
[] = [T || C <- ?CLIENTS,
T <- [diameter:start_service(C, ?SERVICE(C))],
T /= ok],
+ Servers.
- {save_config, Servers}.
+%% send/0
-connect(Config) ->
- {start_services, Servers} = proplists:get_value(saved_config, Config),
+send() ->
+ Funs = [send_ok, send_nok, send_discard_1, send_discard_2],
+ ?util:run([[{?MODULE, F, []} || F <- Funs]]).
- lists:foreach(fun(C) -> connect(C, Servers) end, ?CLIENTS).
+%% connect/1
-stop_services(_Config) ->
- [] = [{H,T} || H <- ?CLIENTS ++ ?SERVERS,
- T <- [diameter:stop_service(H)],
- T /= ok].
+connect(Servers) ->
+ lists:foreach(fun(C) -> connect(C, Servers) end, ?CLIENTS).
-%% Ensure transports have been removed from request table.
-empty(_Config) ->
- [] = ets:tab2list(diameter_request).
+%% stop_services/0
-stop(_Config) ->
- ok = diameter:stop().
+stop_services() ->
+ [{H,T} || H <- ?CLIENTS ++ ?SERVERS,
+ T <- [diameter:stop_service(H)],
+ T /= ok].
%% ----------------------------------------
@@ -171,7 +181,7 @@ connect(Name, Refs) ->
%% Send an STR and expect success after SERVER3 answers after a couple
%% of failovers.
-send_ok(_Config) ->
+send_ok() ->
Req = #diameter_base_STR{'Destination-Realm' = realm(?SERVER1),
'Termination-Cause' = ?LOGOUT,
'Auth-Application-Id' = ?APP_ID},
@@ -180,19 +190,19 @@ send_ok(_Config) ->
= call(?CLIENT1, Req).
%% Send an STR and expect failure when both servers fail.
-send_nok(_Config) ->
+send_nok() ->
Req = #diameter_base_STR{'Destination-Realm' = realm(?SERVER4),
'Termination-Cause' = ?LOGOUT,
'Auth-Application-Id' = ?APP_ID},
{failover, ?LOGOUT} = call(?CLIENT1, Req).
%% Send an STR and have prepare_retransmit discard it.
-send_discard_1(_Config) ->
+send_discard_1() ->
Req = #diameter_base_STR{'Destination-Realm' = realm(?SERVER1),
'Termination-Cause' = ?TIMEOUT,
'Auth-Application-Id' = ?APP_ID},
{rejected, ?TIMEOUT} = call(?CLIENT2, Req).
-send_discard_2(_Config) ->
+send_discard_2() ->
Req = #diameter_base_STR{'Destination-Realm' = realm(?SERVER4),
'Termination-Cause' = ?MOVED,
'Auth-Application-Id' = ?APP_ID},
diff --git a/lib/diameter/test/diameter_gen_sctp_SUITE.erl b/lib/diameter/test/diameter_gen_sctp_SUITE.erl
index ccee6baec1..1333431943 100644
--- a/lib/diameter/test/diameter_gen_sctp_SUITE.erl
+++ b/lib/diameter/test/diameter_gen_sctp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,14 +27,19 @@
-module(diameter_gen_sctp_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
init_per_suite/1,
end_per_suite/1]).
%% testcases
--export([send_one_from_many/1, send_one_from_many/0,
- send_many_from_one/1, send_many_from_one/0,
+-export([send_one_from_many/1,
+ send_many_from_one/1,
receive_what_was_sent/1]).
-include_lib("kernel/include/inet_sctp.hrl").
@@ -45,7 +50,7 @@
%% Open sockets on the loopback address.
-define(ADDR, {127,0,0,1}).
-%% An indescribably long number of milliseconds after which everthing
+%% An indescribably long number of milliseconds after which everything
%% that should have happened has.
-define(FOREVER, 2000).
@@ -67,7 +72,7 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 10}}].
+ [{timetrap, {seconds, 15}}].
all() ->
[send_one_from_many,
@@ -89,13 +94,20 @@ end_per_suite(_Config) ->
%% ===========================================================================
-%% send_one_from_many/0
+%% run/0
+
+run() ->
+ run(all()).
+
+%% run/1
+
+run(List) ->
+ diameter_util:run([{{?MODULE, F, [[]]}, 10000} || F <- List]).
+
+%% send_one_from_many/1
%%
%% Demonstrates sluggish delivery of messages.
-send_one_from_many() ->
- [{timetrap, {seconds, 30}}].
-
send_one_from_many(_) ->
?OK = send_multiple(128, 1, 1024).
@@ -402,23 +414,20 @@ unmark(Bin) ->
%% ===========================================================================
-%% send_many_from_one/0
+%% send_many_from_one/1
%%
%% Demonstrates sluggish delivery of messages.
-send_many_from_one() ->
- [{timetrap, {seconds, 30}}].
-
send_many_from_one(_) ->
?OK = send_multiple(1, 128, 1024).
%% ===========================================================================
-%% receive_what_was_sent/1
+%% receive_what_was_sent/0
%%
%% Demonstrates reception of a message that differs from that sent.
-receive_what_was_sent(_Config) ->
+receive_what_was_sent(_) ->
?OK = send_multiple(1, 1, 1024*32).
%% ===========================================================================
diff --git a/lib/diameter/test/diameter_gen_tcp_SUITE.erl b/lib/diameter/test/diameter_gen_tcp_SUITE.erl
index db42ea813e..d1e01da27e 100644
--- a/lib/diameter/test/diameter_gen_tcp_SUITE.erl
+++ b/lib/diameter/test/diameter_gen_tcp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2014-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2014-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,11 +27,14 @@
-module(diameter_gen_tcp_SUITE).
--export([suite/0,
- all/0]).
+%% testcases, not common_test dependency
+-export([run/0,
+ run/1]).
-%% testcases
--export([send_long/1,
+%% common_test wrapping
+-export([suite/0,
+ all/0,
+ send_long/1,
connect/1]).
-define(LOOPBACK, {127,0,0,1}).
@@ -46,13 +49,29 @@ all() ->
[connect, %% Appears to fail only when run first.
send_long].
+send_long(_) ->
+ send_long().
+
+connect(_) ->
+ connect().
+
%% ===========================================================================
-%% send_long/1
+%% run/0
+
+run() ->
+ run(all()).
+
+%% run/1
+
+run(List) ->
+ diameter_util:run([{{?MODULE, F, [[]]}, 10000} || F <- List]).
+
+%% send_long/0
%%
%% Test that a long message is received.
-send_long(_) ->
+send_long() ->
{Sock, SendF} = connection(),
B = binary:copy(<<$X>>, 1 bsl 20),
ok = SendF(B),
@@ -101,13 +120,13 @@ send(Sock, Bin) ->
%% ===========================================================================
-%% connect/1
+%% connect/0
%%
%% Test that simultaneous connections succeed. This fails sporadically
%% on OS X at the time of writing, when gen_tcp:connect/2 returns
%% {error, econnreset}.
-connect(_) ->
+connect() ->
{ok, LSock} = gen_tcp:listen(0, ?GEN_OPTS),
{ok, {_,PortNr}} = inet:sockname(LSock),
Count = lists:seq(1,8), %% 8 simultaneous connects
diff --git a/lib/diameter/test/diameter_gh.spec b/lib/diameter/test/diameter_gh.spec
new file mode 100644
index 0000000000..9662044402
--- /dev/null
+++ b/lib/diameter/test/diameter_gh.spec
@@ -0,0 +1,2 @@
+{suites, "../diameter_test", all}.
+{skip_suites, "../diameter_test", [diameter_gen_sctp_SUITE], "SCTP does not work on Github actions"}.
diff --git a/lib/diameter/test/diameter_length_SUITE.erl b/lib/diameter/test/diameter_length_SUITE.erl
index daaaae6e00..66d1be114f 100644
--- a/lib/diameter/test/diameter_length_SUITE.erl
+++ b/lib/diameter/test/diameter_length_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,20 +24,14 @@
-module(diameter_length_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/2,
- end_per_group/2,
- init_per_testcase/2,
- end_per_testcase/2]).
-
-%% testcases
--export([start/1,
- send/1,
- stop/1]).
+ parallel/1]).
%% diameter callbacks
-export([peer_up/3,
@@ -83,39 +77,20 @@
-define(LOGOUT,
?'DIAMETER_BASE_TERMINATION-CAUSE_LOGOUT').
--define(GROUPS, [exit, handle, discard]).
-
-define(L, atom_to_list).
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 120}}].
all() ->
- [{group, G} || G <- ?GROUPS].
-
-groups() ->
- [{G, [], [start, send, stop]} || G <- ?GROUPS].
-
-init_per_suite(Config) ->
- ok = diameter:start(),
- Config.
-
-end_per_suite(_Config) ->
- ok = diameter:stop().
-
-init_per_group(Group, Config) ->
- [{group, Group} | Config].
-
-end_per_group(_, _) ->
- ok.
+ [parallel].
-init_per_testcase(_Name, Config) ->
- Config.
+parallel(_Config) ->
+ run().
-end_per_testcase(_, _) ->
- ok.
+%% ===========================================================================
origin(exit) -> 0;
origin(handle) -> 1;
@@ -127,25 +102,39 @@ origin(2) -> discard.
%% ===========================================================================
+run() ->
+ run([exit, handle, discard]).
+
+run(List)
+ when is_list(List) ->
+ ok = diameter:start(),
+ try
+ ?util:run([[{[fun run/1, T], 30000} || T <- List]])
+ after
+ ok = diameter:stop()
+ end;
+
+run(Group) ->
+ start(Group),
+ send(Group),
+ stop().
+
%% start/1
-start(Config) ->
- Group = proplists:get_value(group, Config),
+start(Group) ->
ok = diameter:start_service(?SERVER, ?SERVICE(?L(Group))),
ok = diameter:start_service(?CLIENT, ?SERVICE(?CLIENT)),
- LRef = ?util:listen(?SERVER,
- tcp,
- [{length_errors, Group}]),
+ LRef = ?util:listen(?SERVER, tcp, [{length_errors, Group}]),
?util:connect(?CLIENT,
tcp,
LRef,
[{capabilities, [{'Origin-State-Id', origin(Group)}]}]).
-%% stop/1
+%% stop/0
-stop(_Config) ->
- ok = diameter:remove_transport(?CLIENT, true),
+stop() ->
ok = diameter:remove_transport(?SERVER, true),
+ ok = diameter:remove_transport(?CLIENT, true),
ok = diameter:stop_service(?SERVER),
ok = diameter:stop_service(?CLIENT).
@@ -194,10 +183,7 @@ send(discard) ->
{error, timeout}
= call(4),
#diameter_base_STA{'Result-Code' = ?SUCCESS}
- = call(0);
-
-send(Config) ->
- send(proplists:get_value(group, Config)).
+ = call(0).
%% ===========================================================================
diff --git a/lib/diameter/test/diameter_pool_SUITE.erl b/lib/diameter/test/diameter_pool_SUITE.erl
index a36a4fa17a..40d34c6237 100644
--- a/lib/diameter/test/diameter_pool_SUITE.erl
+++ b/lib/diameter/test/diameter_pool_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2015-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2015-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,17 +25,16 @@
-module(diameter_pool_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- init_per_testcase/2,
- end_per_testcase/2,
- init_per_suite/1,
- end_per_suite/1]).
-
-%% testcases
--export([tcp_connect/1,
- sctp_connect/1,
- any_connect/1]).
+ tcp/1,
+ sctp/1,
+ any/1]).
%% ===========================================================================
@@ -62,44 +61,53 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 30}}].
+ [{timetrap, {seconds, 45}}].
all() ->
- [tcp_connect,
- sctp_connect,
- any_connect].
+ [tcp, sctp, any].
-init_per_testcase(_Name, Config) ->
- Config.
+tcp(_Config) ->
+ run([tcp]).
-end_per_testcase(_Name, _Config) ->
- diameter:stop().
-
-init_per_suite(Config) ->
- [{sctp, ?util:have_sctp()} | Config].
+sctp(_Config) ->
+ case ?util:have_sctp() of
+ true -> run([sctp]);
+ false -> {skip, no_sctp}
+ end.
-end_per_suite(_Config) ->
- ok.
+any(_Config) ->
+ run([any]).
%% ===========================================================================
-tcp_connect(_Config) ->
- connect(tcp, tcp).
+%% run/0
-sctp_connect(Config) ->
- case lists:member({sctp, true}, Config) of
- true -> connect(sctp, sctp);
- false -> {skip, no_sctp}
- end.
+run() ->
+ run(all()).
+
+%% run/1
+
+run(tcp = T) ->
+ connect(T, T);
-any_connect(_Config) ->
- connect(any, tcp).
+run(sctp = T) ->
+ connect(T, T);
+
+run(any = T) ->
+ connect(T, tcp);
+
+run(List) ->
+ ok = diameter:start(),
+ try
+ ?util:run([[{[fun run/1, T], 30000} || T <- List]])
+ after
+ ok = diameter:stop()
+ end.
%% connect/2
%% Establish multiple connections between a client and server.
connect(ClientProt, ServerProt) ->
- ok = diameter:start(),
[] = [{S,T} || S <- ["server", "client"],
T <- [diameter:start_service(S, ?SERVICE(S))],
T /= ok],
@@ -108,20 +116,24 @@ connect(ClientProt, ServerProt) ->
LRef = ?util:listen("server", ServerProt, [{pool_size, 4}]),
{4,0} = count("server", LRef, accept), %% 4 transports, no connections
%% Establish 5 connections.
- Ref = ?util:connect("client", ClientProt, LRef, [{pool_size, 5}]),
- {5,5} = count("client", Ref, pool), %% 5 connections
+ N = pool_size(5), %% connections to establish
+ Ref = ?util:connect("client", ClientProt, LRef, [{pool_size, N}]),
+ {N,N} = count("client", Ref, pool), %% N connections
%% Ensure the server has started replacement transports within a
%% reasonable time. Sleepsince there's no guarantee the
%% replacements have been started before the client has received
%% 'up' events. (Although it's likely.)
- sleep(),
- {9,5} = count("server", LRef, accept), %% 5 connections + 4 accepting
+ timer:sleep(1000),
+ N4 = N + 4,
+ {N4,N} = count("server", LRef, accept), %% N connections + 4 accepting
%% Ensure there are still the expected number of accepting transports
%% after stopping the client service.
ok = diameter:stop_service("client"),
- sleep(),
+ timer:sleep(1000),
{4,0} = count("server", LRef, accept), %% 4 transports, no connections
%% Done.
+ ok = diameter:remove_transport("client", true),
+ ok = diameter:remove_transport("server", true),
ok = diameter:stop_service("server").
count(Name, Ref, Key) ->
@@ -131,5 +143,10 @@ count(Name, Ref, Key) ->
{Key, Ps} = lists:keyfind(Key, 1, T),
{length(Ps), length(Cs)}. %% number of processes, connections
-sleep() ->
- receive after 1000 -> ok end.
+%% Simultaneous connections are often refused on Darwin: don't try to
+%% establish more than one.
+pool_size(N) ->
+ case os:type() of
+ {_, 'darwin'} -> 1;
+ _ -> rand:uniform(N)
+ end.
diff --git a/lib/diameter/test/diameter_reg_SUITE.erl b/lib/diameter/test/diameter_reg_SUITE.erl
index cd9242faa8..02e10ffb74 100644
--- a/lib/diameter/test/diameter_reg_SUITE.erl
+++ b/lib/diameter/test/diameter_reg_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,86 +24,76 @@
-module(diameter_reg_SUITE).
--export([suite/0,
- all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1]).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
-%% testcases
--export([add/1,
- add_new/1,
- remove/1,
- down/1,
- terms/1,
- pids/1]).
+%% common_test wrapping
+-export([all/0,
+ parallel/1]).
--define(reg, diameter_reg).
--define(util, diameter_util).
+-define(reg, diameter_reg).
%% ===========================================================================
-suite() ->
- [{timetrap, {seconds, 60}}].
-
all() ->
- [{group, all},
- {group, all, [parallel]}].
+ [parallel].
-groups() ->
- [{all, [], tc()}].
+parallel(_Config) ->
+ run().
-tc() ->
- [add,
- add_new,
- remove,
- down,
- terms,
- pids].
+%% ===========================================================================
-init_per_suite(Config) ->
- ok = diameter:start(),
- Config.
+%% run/0
-end_per_suite(_Config) ->
- ok = diameter:stop().
+run() ->
+ run([add, add_new, remove, down, terms, pids]).
-%% ===========================================================================
+%% run/1
+
+run(List)
+ when is_list(List) ->
+ ok = diameter:start(),
+ try
+ diameter_util:run([{[fun run/1, T], 10000} || T <- List])
+ after
+ ok = diameter:stop()
+ end;
-add(_) ->
+run(add) ->
Ref = make_ref(),
true = ?reg:add(Ref),
true = ?reg:add(Ref),
[{Ref, Pid}] = ?reg:match(Ref),
- Pid = self().
+ Pid = self();
-add_new(_) ->
+run(add_new) ->
Ref = make_ref(),
true = ?reg:add_new(Ref),
- false = ?reg:add_new(Ref).
+ false = ?reg:add_new(Ref);
-remove(_) ->
+run(remove) ->
Ref = make_ref(),
true = ?reg:add_new(Ref),
true = ?reg:add_new({Ref}),
true = ?reg:remove({Ref}),
[{Ref, Pid}] = ?reg:match(Ref),
- Pid = self().
+ Pid = self();
-down(_) ->
+run(down) ->
Ref = make_ref(),
{_, MRef} = spawn_monitor(fun() -> ?reg:add_new(Ref), timer:sleep(1000) end),
receive {'DOWN', MRef, process, _, _} -> ok end,
timer:sleep(1000),
- [] = ?reg:match(Ref).
+ [] = ?reg:match(Ref);
-terms(_) ->
+run(terms) ->
Ref = make_ref(),
true = ?reg:add_new(Ref),
[[Pid]] = [L || {T,L} <- ?reg:terms(), T == Ref],
- Pid = self().
+ Pid = self();
-pids(_) ->
+run(pids) ->
Ref = make_ref(),
true = ?reg:add_new(Ref),
%% Don't match [[Ref]] since this will only necessarily be the
diff --git a/lib/diameter/test/diameter_relay_SUITE.erl b/lib/diameter/test/diameter_relay_SUITE.erl
index 9de5cbe685..2502820e0f 100644
--- a/lib/diameter/test/diameter_relay_SUITE.erl
+++ b/lib/diameter/test/diameter_relay_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -34,26 +34,13 @@
-module(diameter_relay_SUITE).
+%% testcases, no common_test dependency
+-export([run/0]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0]).
-
-%% testcases
--export([start/1,
- start_services/1,
- connect/1,
- send1/1,
- send2/1,
- send3/1,
- send4/1,
- send_loop/1,
- send_timeout_1/1,
- send_timeout_2/1,
- info/1,
- counters/1,
- disconnect/1,
- stop_services/1,
- stop/1]).
+ parallel/1]).
%% diameter callbacks
-export([pick_peer/4,
@@ -115,41 +102,37 @@
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 30}}].
all() ->
- [start,
- start_services,
- connect,
- {group, all},
- counters,
- {group, all, [parallel]},
- disconnect,
- stop_services,
- stop].
-
-groups() ->
- [{all, [], tc()}].
+ [parallel].
-%% Traffic cases run when services are started and connections
-%% established.
-tc() ->
- [send1,
- send2,
- send3,
- send4,
- send_loop,
- send_timeout_1,
- send_timeout_2,
- info].
+parallel(_Config) ->
+ run().
%% ===========================================================================
-%% start/stop testcases
-start(_Config) ->
- ok = diameter:start().
+%% run/0
+
+run() ->
+ ok = diameter:start(),
+ try
+ ?util:run([{fun traffic/0, 20000}])
+ after
+ ok = diameter:stop()
+ end.
-start_services(_Config) ->
+%% traffic/0
+
+traffic() ->
+ Servers = start_services(),
+ Conns = connect(Servers),
+ [] = send(),
+ [] = counters(),
+ [] = disconnect(Conns),
+ [] = stop_services().
+
+start_services() ->
[S1,S2,S3,S4] = [server(N, ?DICT_COMMON) || N <- [?SERVER1,
?SERVER2,
?SERVER3,
@@ -158,30 +141,32 @@ start_services(_Config) ->
ok = diameter:start_service(?CLIENT, ?SERVICE(?CLIENT, ?DICT_COMMON)),
- {save_config, [{?RELAY1, [S1,S2,R2]},
- {?RELAY2, [S3,S4]},
- {?CLIENT, [R1,R2]}]}.
-
-connect(Config) ->
- {_, Conns} = proplists:get_value(saved_config, Config),
+ [{?RELAY1, [S1,S2,R2]}, {?RELAY2, [S3,S4]}, {?CLIENT, [R1,R2]}].
- ?util:write_priv(Config,
- "cfg",
- lists:flatmap(fun({CN,Ss}) -> connect(CN, Ss) end,
- Conns)).
+connect(Servers) ->
+ lists:flatmap(fun({CN,Ss}) -> connect(CN, Ss) end, Servers).
-disconnect(Config) ->
- [] = [{T,C} || C <- ?util:read_priv(Config, "cfg"),
- T <- [break(C)],
- T /= ok].
+disconnect(Conns) ->
+ [{T,C} || C <- Conns,
+ T <- [break(C)],
+ T /= ok].
-stop_services(_Config) ->
- [] = [{H,T} || H <- ?SERVICES,
- T <- [diameter:stop_service(H)],
- T /= ok].
+stop_services() ->
+ [{H,T} || H <- ?SERVICES,
+ T <- [diameter:stop_service(H)],
+ T /= ok].
-stop(_Config) ->
- ok = diameter:stop().
+%% Traffic cases run when services are started and connections
+%% established.
+send() ->
+ ?util:run([[fun traffic/1, T] || T <- [send1,
+ send2,
+ send3,
+ send4,
+ send_loop,
+ send_timeout_1,
+ send_timeout_2,
+ info]]).
%% ----------------------------------------
@@ -203,50 +188,50 @@ connect(Name, Refs) ->
%% traffic testcases
%% Send an STR intended for a specific server and expect success.
-send1(_Config) ->
- call(?SERVER1).
-send2(_Config) ->
- call(?SERVER2).
-send3(_Config) ->
- call(?SERVER3).
-send4(_Config) ->
- call(?SERVER4).
+traffic(send1) ->
+ call(?SERVER1);
+traffic(send2) ->
+ call(?SERVER2);
+traffic(send3) ->
+ call(?SERVER3);
+traffic(send4) ->
+ call(?SERVER4);
%% Send an ASR that loops between the relays (RELAY1 -> RELAY2 ->
%% RELAY1) and expect the loop to be detected.
-send_loop(_Config) ->
+traffic(send_loop) ->
Req = ['ASR', {'Destination-Realm', realm(?SERVER1)},
{'Destination-Host', ?SERVER1},
{'Auth-Application-Id', ?APP_ID}],
#'diameter_base_answer-message'{'Result-Code' = ?LOOP_DETECTED}
- = call(Req, [{filter, realm}]).
+ = call(Req, [{filter, realm}]);
%% Send a RAR that is incorrectly routed and then discarded and expect
%% different results depending on whether or not we or the relay
%% timeout first.
-send_timeout_1(_Config) ->
+traffic(send_timeout_1) ->
#'diameter_base_answer-message'{'Result-Code' = ?UNABLE_TO_DELIVER}
- = send_timeout(7000).
-send_timeout_2(_Config) ->
- {error, timeout} = send_timeout(3000).
+ = traffic({timeout, 7000});
+traffic(send_timeout_2) ->
+ {error, timeout} = traffic({timeout, 3000});
-send_timeout(Tmo) ->
+traffic({timeout, Tmo}) ->
Req = ['RAR', {'Destination-Realm', realm(?SERVER1)},
{'Destination-Host', ?SERVER1},
{'Auth-Application-Id', ?APP_ID},
{'Re-Auth-Request-Type', ?AUTHORIZE_ONLY}],
- call(Req, [{filter, realm}, {timeout, Tmo}]).
+ call(Req, [{filter, realm}, {timeout, Tmo}]);
-info(_Config) ->
+traffic(info) ->
%% Wait for RELAY1 to have answered all requests, so that the
%% suite doesn't end before all answers are sent and counted.
receive after 6000 -> ok end,
[] = ?util:info().
-counters(_Config) ->
- [] = ?util:run([[fun counters/2, K, S]
- || K <- [statistics, transport, connections],
- S <- ?SERVICES]).
+counters() ->
+ ?util:run([[fun counters/2, K, S]
+ || K <- [statistics, transport, connections],
+ S <- ?SERVICES]).
counters(Key, Svc) ->
counters(Key, Svc, [_|_] = diameter:service_info(Svc, Key)).
diff --git a/lib/diameter/test/diameter_stats_SUITE.erl b/lib/diameter/test/diameter_stats_SUITE.erl
index 4716082394..b48e7a84bf 100644
--- a/lib/diameter/test/diameter_stats_SUITE.erl
+++ b/lib/diameter/test/diameter_stats_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2015. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,55 +24,52 @@
-module(diameter_stats_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1]).
-
-%% testcases
--export([reg/1,
- incr/1,
- read/1,
- sum/1,
- flush/1]).
+ parallel/1]).
-define(stat, diameter_stats).
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 30}}].
all() ->
- [{group, all},
- {group, all, [parallel]}].
+ [parallel].
-groups() ->
- [{all, [], tc()}].
+parallel(_Config) ->
+ run().
-tc() ->
- [reg,
- incr,
- read,
- sum,
- flush].
+%% ===========================================================================
-init_per_suite(Config) ->
- ok = diameter:start(),
- Config.
+%% run/0
-end_per_suite(_Config) ->
- ok = diameter:stop().
+run() ->
+ run([reg, incr, read, sum, flush]).
-%% ===========================================================================
+%% run/1
+
+run(List)
+ when is_list(List) ->
+ ok = diameter:start(),
+ try
+ diameter_util:run([{[fun run/1, T], 15000} || T <- List])
+ after
+ ok = diameter:stop()
+ end;
-reg(_) ->
+run(reg) ->
Ref = '$1',
true = ?stat:reg(Ref),
- false = ?stat:reg(Ref). %% duplicate
+ false = ?stat:reg(Ref); %% duplicate
-incr(_) ->
+run(incr) ->
Ref = '_',
Ctr = x,
false = ?stat:incr(Ctr), %% not registered,
@@ -83,9 +80,9 @@ incr(_) ->
2 = ?stat:incr(Ctr, self(), 2)
end),
ok = fold(Ctr, Ref, 3), %% folded
- ?stat:flush([self(), Ref]).
+ ?stat:flush([self(), Ref]);
-read(_) ->
+run(read) ->
Ref = make_ref(),
C1 = {a,b},
C2 = {b,a},
@@ -99,9 +96,9 @@ read(_) ->
= ?stat:read([self(), Ref, make_ref()]),
[] = ?stat:read([]),
[] = ?stat:read([make_ref()]),
- ?stat:flush([self(), Ref, make_ref()]).
+ ?stat:flush([self(), Ref, make_ref()]);
-sum(_) ->
+run(sum) ->
Ref = make_ref(),
C1 = {a,b},
C2 = {b,a},
@@ -116,9 +113,9 @@ sum(_) ->
[{Self, [{C1,1}, {C2,2}]}]
= ?stat:sum([self()]),
[{Ref, [{C1,7}]}, {Self, [{C1,1}, {C2,2}]}]
- = ?stat:flush([self(), Ref]).
+ = ?stat:flush([self(), Ref]);
-flush(_) ->
+run(flush) ->
Ref = make_ref(),
Ctr = '_',
true = ?stat:reg(Ref),
diff --git a/lib/diameter/test/diameter_sync_SUITE.erl b/lib/diameter/test/diameter_sync_SUITE.erl
index 2785bd92d6..395c99bd0b 100644
--- a/lib/diameter/test/diameter_sync_SUITE.erl
+++ b/lib/diameter/test/diameter_sync_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,63 +24,59 @@
-module(diameter_sync_SUITE).
+%% testcases, no common_test depedency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1]).
-
-%% testcases
--export([call/1,
- cast/1,
- timeout/1,
- flush/1]).
+ parallel/1]).
-define(sync, diameter_sync).
--define(util, diameter_util).
-
--define(TIMEOUT, infinity).
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 15}}].
all() ->
- [{group, all},
- {group, all, [parallel]}].
+ [parallel].
-groups() ->
- [{all, [], tc()}].
+parallel(_Config) ->
+ run().
-tc() ->
- [call,
- cast,
- timeout,
- flush].
+%% ===========================================================================
-init_per_suite(Config) ->
- ok = diameter:start(),
- Config.
+%% run/0
-end_per_suite(_Config) ->
- ok = diameter:stop().
+run() ->
+ run([call, cast, timeout, flush]).
-%% ===========================================================================
+%% run/1
+
+run(List)
+ when is_list(List) ->
+ ok = diameter:start(),
+ try
+ diameter_util:run([{[fun run/1, T], 10000} || T <- List])
+ after
+ ok = diameter:stop()
+ end;
-call(_) ->
+run(call) ->
Ref = make_ref(),
Q = {q, Ref},
F = fun() -> Ref end,
- Ref = ?sync:call(Q, F, infinity, ?TIMEOUT),
+ Ref = ?sync:call(Q, F, infinity, infinity),
Ref = ?sync:call(Q, F, 0, infinity),
Ref = call(Q, F),
Ref = call(Q, {fun(_) -> Ref end, x}),
timeout = call(Q, fun() -> exit(unexpected) end),
{_,_,_} = call(Q, {erlang, now, []}),
- {_,_,_} = call(Q, [fun erlang:now/0]).
+ {_,_,_} = call(Q, [fun erlang:now/0]);
-cast(_) ->
+run(cast) ->
Ref = make_ref(),
Q = {q, Ref},
false = ?sync:carp(Q),
@@ -95,26 +91,21 @@ cast(_) ->
true = 2 =< ?sync:pending(),
true = lists:member(Q, ?sync:queues()),
%% ... and that the max number of requests is respected.
- rejected = ?sync:call(Q, {erlang, now, []}, 1, ?TIMEOUT),
- rejected = ?sync:cast(Q, {erlang, now, []}, 1, ?TIMEOUT),
+ rejected = ?sync:call(Q, {erlang, now, []}, 1, infinity),
+ rejected = ?sync:cast(Q, {erlang, now, []}, 1, infinity),
%% Monitor on the identifiable request and see that exits when we
%% let the blocking request finish.
MRef = erlang:monitor(process, Pid),
{value, P} = ?sync:carp(Q),
P ! Ref,
- Ref = receive
- {'DOWN', MRef, process, _, Reason} ->
- Reason
- after ?TIMEOUT ->
- false
- end.
-
-timeout(_) ->
+ Ref = receive {'DOWN', MRef, process, _, Reason} -> Reason end;
+
+run(timeout) ->
Q = make_ref(),
ok = ?sync:cast(Q, {timer, sleep, [2000]}, infinity, 2000),
- timeout = ?sync:call(Q, fun() -> ok end, infinity, 1000).
+ timeout = ?sync:call(Q, fun() -> ok end, infinity, 1000);
-flush(_) ->
+run(flush) ->
Q = make_ref(),
F = {timer, sleep, [2000]},
ok = cast(Q, F),
diff --git a/lib/diameter/test/diameter_tls_SUITE.erl b/lib/diameter/test/diameter_tls_SUITE.erl
index 1ad897dcd2..1e7f7ed50a 100644
--- a/lib/diameter/test/diameter_tls_SUITE.erl
+++ b/lib/diameter/test/diameter_tls_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -34,27 +34,15 @@
-module(diameter_tls_SUITE).
+%% testcases, no common_test dependency
+-export([run/0]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
init_per_suite/1,
- end_per_suite/1]).
-
-%% testcases
--export([start_ssl/1,
- start_diameter/1,
- make_certs/1, make_certs/0,
- start_services/1,
- add_transports/1,
- send1/1,
- send2/1,
- send3/1,
- send4/1,
- send5/1,
- remove_transports/1,
- stop_services/1,
- stop_diameter/1,
- stop_ssl/1]).
+ end_per_suite/1,
+ parallel/1]).
%% diameter callbacks
-export([prepare_request/3,
@@ -126,34 +114,22 @@
-define(LOGOUT, ?'DIAMETER_BASE_TERMINATION-CAUSE_LOGOUT').
%% ===========================================================================
+%% common_test wrapping
suite() ->
- [{timetrap, {seconds, 60}}].
+ [{timetrap, {seconds, 90}}].
all() ->
- [start_ssl,
- start_diameter,
- make_certs,
- start_services,
- add_transports,
- {group, all},
- {group, all, [parallel]},
- remove_transports,
- stop_services,
- stop_diameter,
- stop_ssl].
-
-groups() ->
- [{all, [], tc()}].
+ [parallel].
%% Shouldn't really have to know about crypto here but 'ok' from
%% ssl:start() isn't enough to guarantee that TLS is available.
init_per_suite(Config) ->
try
- false /= os:find_executable("openssl")
- orelse throw({?MODULE, no_openssl}),
- ok == (catch crypto:start())
- orelse throw({?MODULE, no_crypto}),
+ [] == (catch make_certs(dir(Config)))
+ orelse throw({?MODULE, no_certs}),
+ ok == crypto:start() orelse throw({?MODULE, no_crypto}),
+ ok == ssl:start() orelse throw({?MODULE, no_ssl}),
Config
catch
{?MODULE, E} ->
@@ -161,87 +137,81 @@ init_per_suite(Config) ->
end.
end_per_suite(_Config) ->
+ ssl:stop(),
crypto:stop().
-%% Testcases to run when services are started and connections
-%% established.
-tc() ->
- [send1,
- send2,
- send3,
- send4,
- send5].
-
-%% ===========================================================================
-%% testcases
-
-start_ssl(_Config) ->
- ok = ssl:start().
-
-start_diameter(_Config) ->
- ok = diameter:start().
+parallel(Config) ->
+ run(dir(Config), false).
-make_certs() ->
- [{timetrap, {minutes, 2}}].
+dir(Config) ->
+ proplists:get_value(priv_dir, Config).
-make_certs(Config) ->
- Dir = proplists:get_value(priv_dir, Config),
+%% ===========================================================================
- [] = ?util:run([[fun make_cert/2, Dir, B] || B <- ["server1",
- "server2",
- "server4",
- "server5",
- "client"]]).
+run() ->
+ Tmp = ?util:mktemp("diameter_tls"),
+ try
+ run(Tmp, true)
+ after
+ file:del_dir_r(Tmp)
+ end.
-start_services(Config) ->
- Dir = proplists:get_value(priv_dir, Config),
- Servers = [server(S, sopts(S, Dir)) || S <- ?SERVERS],
+run(Dir, B) ->
+ crypto:start(),
+ ssl:start(),
+ try
+ ?util:run([{[fun traffic/2, Dir, B], 60000}])
+ after
+ diameter:stop(),
+ ssl:stop(),
+ crypto:stop()
+ end.
+traffic(Dir, true) ->
+ [] = make_certs(Dir),
+ traffic(Dir, false);
+
+traffic(Dir, false) ->
+ ok = diameter:start(),
+ Servers = start_services(Dir),
+ Connections = add_transports(Dir, Servers),
+ [] = ?util:run([[fun call/1, S] || S <- ?util:scramble(?SERVERS)]),
+ [] = remove_transports(Connections),
+ [] = stop_services().
+
+make_certs(Dir) ->
+ ?util:run([[fun make_cert/2, Dir, B] || B <- ["server1",
+ "server2",
+ "server4",
+ "server5",
+ "client"]]).
+
+start_services(Dir) ->
+ Servers = [{S, {_,_} = server(S, sopts(S, Dir))} || S <- ?SERVERS],
ok = diameter:start_service(?CLIENT, ?SERVICE(?CLIENT, ?DICT_COMMON)),
+ Servers.
- {save_config, [Dir | Servers]}.
-
-add_transports(Config) ->
- {_, [Dir | Servers]} = proplists:get_value(saved_config, Config),
-
+add_transports(Dir, Servers) ->
true = diameter:subscribe(?CLIENT),
-
Opts = ssl_options(Dir, "client"),
- Connections = [connect(?CLIENT, S, copts(N, Opts))
- || {S,N} <- lists:zip(Servers, ?SERVERS)],
-
- ?util:write_priv(Config, "cfg", lists:zip(Servers, Connections)).
-
+ [{N, S, connect(?CLIENT, S, copts(N, Opts))} || {N,S} <- Servers].
%% Remove the client transports and expect the corresponding server
%% transport to go down.
-remove_transports(Config) ->
- Ts = ?util:read_priv(Config, "cfg"),
+remove_transports(Connections) ->
[] = [T || S <- ?SERVERS, T <- [diameter:subscribe(S)], T /= true],
- lists:map(fun disconnect/1, Ts).
+ [] = ?util:run([[fun disconnect/1, T] || T <- Connections]),
+ [S || S <- ?SERVERS,
+ I <- [receive #diameter_event{service = S, info = I} -> I end],
+ down /= catch element(1, I)].
-stop_services(_Config) ->
- [] = [{H,T} || H <- [?CLIENT | ?SERVERS],
- T <- [diameter:stop_service(H)],
- T /= ok].
+disconnect({_, {_LRef, _PortNr}, CRef}) ->
+ ok = diameter:remove_transport(?CLIENT, CRef).
-stop_diameter(_Config) ->
- ok = diameter:stop().
-
-stop_ssl(_Config) ->
- ok = ssl:stop().
-
-%% Send an STR intended for a specific server and expect success.
-send1(_Config) ->
- call(?SERVER1).
-send2(_Config) ->
- call(?SERVER2).
-send3(_Config) ->
- call(?SERVER3).
-send4(_Config) ->
- call(?SERVER4).
-send5(_Config) ->
- call(?SERVER5).
+stop_services() ->
+ [{H,T} || H <- [?CLIENT | ?SERVERS],
+ T <- [diameter:stop_service(H)],
+ T /= ok].
%% ===========================================================================
%% diameter callbacks
@@ -285,6 +255,7 @@ handle_request(#diameter_packet{msg = #diameter_base_STR{'Session-Id' = SId}},
%% ===========================================================================
%% support functions
+%% Send an STR intended for a specific server and expect success.
call(Server) ->
Realm = realm(Server),
Req = ['STR', {'Destination-Realm', Realm},
@@ -301,10 +272,6 @@ call(Req, Opts) ->
set([H|T], Vs) ->
[H | Vs ++ T].
-disconnect({{LRef, _PortNr}, CRef}) ->
- ok = diameter:remove_transport(?CLIENT, CRef),
- receive #diameter_event{info = {down, LRef, _, _}} -> ok end.
-
realm(Host) ->
tl(lists:dropwhile(fun(C) -> C /= $. end, Host)).
@@ -364,11 +331,12 @@ ssl([{ssl_options = T, Opts}]) ->
connect(Host, {_LRef, PortNr}, {Caps, Opts}) ->
{ok, Ref} = diameter:add_transport(Host, ?CONNECT(PortNr, Caps, Opts)),
- receive
- #diameter_event{service = Host,
- info = {up, Ref, _, _, #diameter_packet{}}} ->
- ok
- end,
+ {up, Ref, _, _, #diameter_packet{}}
+ = receive
+ #diameter_event{service = Host, info = Info}
+ when element(2, Info) == Ref ->
+ Info
+ end,
Ref.
copts(S, Opts)
diff --git a/lib/diameter/test/diameter_traffic_SUITE.erl b/lib/diameter/test/diameter_traffic_SUITE.erl
index a12759bac2..95ea6be020 100644
--- a/lib/diameter/test/diameter_traffic_SUITE.erl
+++ b/lib/diameter/test/diameter_traffic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,25 +25,17 @@
-module(diameter_traffic_SUITE).
+%% all tests, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/1,
- init_per_group/2,
- end_per_group/2,
- init_per_testcase/2,
- end_per_testcase/2]).
+ parallel/1]).
%% testcases
--export([rfc4005/1,
- start/1,
- start_services/1,
- add_transports/1,
- result_codes/1,
- send_ok/1,
+-export([send_ok/1,
send_nok/1,
send_eval/1,
send_bad_answer/1,
@@ -97,11 +89,7 @@
send_multiple_filters_1/1,
send_multiple_filters_2/1,
send_multiple_filters_3/1,
- send_anything/1,
- remove_transports/1,
- empty/1,
- stop_services/1,
- stop/1]).
+ send_anything/1]).
%% diameter callbacks
-export([peer_up/4,
@@ -127,14 +115,6 @@
%% ===========================================================================
-%% Fraction of shuffle/parallel groups to randomly skip.
--define(SKIP, 0.90).
-
-%% Positive number of testcases from which to select (randomly) from
-%% tc(), the list of testcases to run, or [] to run all. The random
-%% selection is to limit the time it takes for the suite to run.
--define(LIMIT, #{tcp => 42, sctp => 5}).
-
-define(util, diameter_util).
-define(A, list_to_atom).
@@ -164,30 +144,19 @@
%% Which dictionary to use in the clients.
-define(RFCS, [rfc3588, rfc6733, rfc4005]).
-%% Whether to decode stringish Diameter types to strings, or leave
-%% them as binary.
--define(STRING_DECODES, [false, true]).
-
%% Which transport protocol to use.
--define(TRANSPORTS, [tcp, sctp]).
-
-%% Send from a dedicated process?
--define(SENDERS, [true, false]).
-
-%% Message callbacks from diameter_{tcp,sctp}?
--define(CALLBACKS, [true, false]).
-
--record(group,
- {transport,
- strings,
- encoding,
- client_service,
- client_dict,
- client_sender,
- server_service,
- server_decoding,
- server_sender,
- server_throttle}).
+-define(TRANSPORTS, [sctp || ?util:have_sctp()] ++ [tcp]).
+
+-record(group, {transport,
+ strings,
+ encoding,
+ client_service,
+ client_dict,
+ client_sender,
+ server_service,
+ server_decoding,
+ server_sender,
+ server_throttle}).
%% Not really what we should be setting unless the message is sent in
%% the common application but diameter doesn't care.
@@ -270,285 +239,156 @@
?'DIAMETER_BASE_TERMINATION-CAUSE_USER_MOVED').
%% ===========================================================================
+%% common_test wrapping
suite() ->
- [{timetrap, {seconds, 10}}].
+ [{timetrap, {seconds, 90}}].
all() ->
- [rfc4005, start, result_codes, {group, traffic}, empty, stop].
-
-%% Redefine this to run one or more groups for debugging purposes.
--define(GROUPS, []).
-%-define(GROUPS, [[sctp,rfc6733,record,map,false,false,true,false]]).
-
-%% Issues with gen_sctp sporadically cause huge numbers of failed
-%% testcases when running testcases in parallel.
-groups() ->
- Names = names([] == ?GROUPS orelse ?GROUPS),
- [{P, [P], Ts} || Ts <- [tc()], P <- [shuffle, parallel]]
- ++
- [{?util:name(N), [], [{group, if T == sctp; S -> shuffle;
- true -> parallel end}]}
- || [T,_,_,_,S|_] = N <- Names]
- ++
- [{T, [], [{group, ?util:name(N)} || N <- Names,
- T == hd(N)]}
- || T <- ?TRANSPORTS]
- ++
- [{traffic, [], [{group, T} || T <- ?TRANSPORTS]}].
-
-names() ->
- [[T,R,E,D,S,ST,SS,CS] || T <- ?TRANSPORTS,
- R <- ?RFCS,
- E <- ?ENCODINGS,
- D <- ?DECODINGS,
- S <- ?STRING_DECODES,
- ST <- ?CALLBACKS,
- SS <- ?SENDERS,
- CS <- ?SENDERS,
- ?SKIP =< rand:uniform()].
-
-names(true) ->
- names(names());
-
-names(Names) ->
- [N || N <- Names,
- [CS,SS|_] <- [lists:reverse(N)],
- SS orelse CS]. %% avoid deadlock
-
-%% --------------------
-
-init_per_suite() ->
- [{timetrap, {seconds, 60}}].
-
-init_per_suite(Config) ->
- [{rfc4005, compile_and_load()}, {sctp, ?util:have_sctp()} | Config].
-
-end_per_suite(_Config) ->
- code:delete(nas4005),
- code:purge(nas4005),
- ok.
+ [parallel].
-%% --------------------
+parallel(_Config) ->
+ run().
-init_per_group(_) ->
- [{timetrap, {seconds, 30}}].
+%% ===========================================================================
-init_per_group(Name, Config)
- when Name == shuffle;
- Name == parallel ->
- start_services(Config),
- add_transports(Config),
- replace({sleep, Name == parallel}, Config);
+%% run/0
+%%
+%% The test cases proper, do or (meaningfully) die.
+%%
+%% Randomly choose one of many configuration possibilities. Testing
+%% all of them takes too much time, and randomly skipping various
+%% cases (as used to be the case) just unnecessary complexity. There
+%% are run night after night in on various hosts, so just choosing a
+%% configuration results in sufficient coverage over time.
+
+run() ->
+ Svc = ?util:unique_string(),
+ run(#group{transport = ?util:choose(?TRANSPORTS),
+ strings = bool(),
+ encoding = ?util:choose(?ENCODINGS),
+ client_service = [$C | Svc],
+ client_dict = appdict(?util:choose(?RFCS)),
+ client_sender = bool(),
+ server_service = [$S | Svc],
+ server_decoding = ?util:choose(?DECODINGS),
+ server_sender = true, %% avoid deadlock
+ server_throttle = bool()}).
+
+%% run/1
+
+run(#group{} = Cfg) ->
+ _ = result_codes(Cfg),
+ io:format("config: ~p~n", [Cfg]),
+ try
+ ?util:run([{[fun traffic/1, Cfg], 60000}])
+ after
+ code:delete(nas4005),
+ code:purge(nas4005),
+ diameter:stop()
+ end.
-init_per_group(sctp = Name, Config) ->
- {_, Sctp} = lists:keyfind(Name, 1, Config),
- if Sctp ->
- Config;
- true ->
- {skip, Name}
- end;
+%% traffic/1
-init_per_group(Name, Config) ->
- Nas = proplists:get_value(rfc4005, Config, false),
- case ?util:name(Name) of
- [_,R,_,_,_,_,_,_] when R == rfc4005, true /= Nas ->
- {skip, rfc4005};
- [T,R,E,D,S,ST,SS,CS] ->
- G = #group{transport = T,
- strings = S,
- encoding = E,
- client_service = [$C|?util:unique_string()],
- client_dict = appdict(R),
- client_sender = CS,
- server_service = [$S|?util:unique_string()],
- server_decoding = D,
- server_sender = SS,
- server_throttle = ST},
- replace([{group, G}, {runlist, select(T)}], Config);
- _ ->
- Config
- end.
+traffic(#group{} = Cfg) ->
+ _ = compile_and_load(),
+ ok = diameter:start(),
+ LRef = server(Cfg),
+ ok = client(Cfg, LRef),
+ [] = send(Cfg),
+ ok = stop_services(Cfg),
+ [] = ets:tab2list(diameter_request).
-end_per_group(Name, Config)
- when Name == shuffle;
- Name == parallel ->
- remove_transports(Config),
- stop_services(Config);
+%% start_service/2
-end_per_group(_, _) ->
+start_service(Svc, Opts) ->
+ {ok, _} = {diameter:start_service(Svc, Opts), Opts},
ok.
-select(T) ->
- try maps:get(T, ?LIMIT) of
- N ->
- lists:sublist(?util:scramble(tc()), max(5, rand:uniform(N)))
- catch
- error:_ -> ?LIMIT
- end.
+%% send/1
-%% --------------------
-
-%% Work around common_test accumulating Config improperly, causing
-%% testcases to get Config from groups and suites they're not in.
-init_per_testcase(N, Config)
- when N == rfc4005;
- N == start;
- N == result_codes;
- N == empty;
- N == stop ->
- Config;
-
-%% Skip testcases that can reasonably fail under SCTP.
-init_per_testcase(Name, Config) ->
- TCs = proplists:get_value(runlist, Config, []),
- Run = [] == TCs orelse lists:member(Name, TCs),
- case [G || #group{transport = sctp} = G
- <- [proplists:get_value(group, Config)]]
- of
- [_] when Name == send_maxlen;
- Name == send_long ->
- {skip, sctp};
- _ when not Run ->
- {skip, random};
- _ ->
- proplists:get_value(sleep, Config, false)
- andalso timer:sleep(rand:uniform(200)),
- [{testcase, Name} | Config]
- end.
+send(Cfg) ->
+ Ref = make_ref(),
+ Refs = [R || {F,1} <- module_info(exports),
+ "send_" ++ _ <- [atom_to_list(F)],
+ I <- [fun() -> exit({Ref, send(F, Cfg)}) end],
+ {_,R} <- [spawn_monitor(I)]],
+ lists:filter(fun({R,_}) -> R /= Ref; (_) -> true end, wait(Refs)).
-end_per_testcase(_, _) ->
- ok.
+%% send/2
-%% replace/2
-%%
-%% Work around common_test running init functions inappropriately, and
-%% this accumulating more config than expected.
-
-replace(Pairs, Config)
- when is_list(Pairs) ->
- lists:foldl(fun replace/2, Config, Pairs);
-
-replace({Key, _} = T, Config) ->
- [T | lists:keydelete(Key, 1, Config)].
-
-%% --------------------
-
-%% Testcases to run when services are started and connections
-%% established.
-tc() ->
- [send_ok,
- send_nok,
- send_eval,
- send_bad_answer,
- send_protocol_error,
- send_experimental_result,
- send_arbitrary,
- send_proxy_info,
- send_unknown,
- send_unknown_short,
- send_unknown_mandatory,
- send_unknown_short_mandatory,
- send_noreply,
- send_grouped_error,
- send_unsupported,
- send_unsupported_app,
- send_error_bit,
- send_unsupported_version,
- send_long_avp_length,
- send_short_avp_length,
- send_zero_avp_length,
- send_invalid_avp_length,
- send_invalid_reject,
- send_unexpected_mandatory_decode,
- send_unexpected_mandatory,
- send_too_many,
- send_long,
- send_maxlen,
- send_nopeer,
- send_noapp,
- send_discard,
- send_any_1,
- send_any_2,
- send_all_1,
- send_all_2,
- send_timeout,
- send_error,
- send_detach,
- send_encode_error,
- send_destination_1,
- send_destination_2,
- send_destination_3,
- send_destination_4,
- send_destination_5,
- send_destination_6,
- send_bad_option_1,
- send_bad_option_2,
- send_bad_filter_1,
- send_bad_filter_2,
- send_bad_filter_3,
- send_bad_filter_4,
- send_multiple_filters_1,
- send_multiple_filters_2,
- send_multiple_filters_3,
- send_anything].
+send(F, #group{transport = sctp})
+ when F == send_long;
+ F == send_maxlen ->
+ ok;
-%% ===========================================================================
-%% start/stop testcases
+send(F, Cfg) ->
+ timer:sleep(rand:uniform(2000)),
+ apply(?MODULE, F, [[{testcase, F}, {group, Cfg}]]).
-start(_Config) ->
- ok = diameter:start().
+%% wait/1
-start_services(Config) ->
- #group{client_service = CN,
- server_service = SN,
- server_decoding = SD}
- = Grp
- = group(Config),
- ok = diameter:start_service(SN, [{traffic_counters, bool()},
- {decode_format, SD}
- | ?SERVICE(SN, Grp)]),
- ok = diameter:start_service(CN, [{traffic_counters, bool()},
- {sequence, ?CLIENT_MASK},
- {decode_format, map},
- {strict_arities, decode}
- | ?SERVICE(CN, Grp)]).
+wait(Refs)
+ when is_list(Refs) ->
+ lists:map(fun wait/1, Refs);
-bool() ->
- 0.5 =< rand:uniform().
+wait(MRef) ->
+ receive {'DOWN', MRef, process, _, T} -> T end.
+
+%% ===========================================================================
-add_transports(Config) ->
+%% server/1
+
+server(Config) ->
#group{transport = T,
- encoding = E,
- client_service = CN,
client_sender = CS,
server_service = SN,
+ server_decoding = SD,
server_sender = SS,
server_throttle = ST}
+ = Grp
= group(Config),
- LRef = ?util:listen(SN,
- [T,
- {sender, SS},
- {message_cb, ST andalso {?MODULE, message, [0]}}]
- ++ [{packet, hd(?util:scramble([false, raw]))}
- || T == sctp andalso CS]
- ++ [{unordered, unordered()} || T == sctp],
- [{capabilities_cb, fun capx/2},
- {pool_size, 8}
- | server_apps()]),
- Cs = [?util:connect(CN,
- [T, {sender, CS} | client_opts(T)],
- LRef,
- [{id, Id}
- | client_apps(R, [{'Origin-State-Id', origin(Id)}])])
- || D <- ?DECODINGS, %% for multiple candidate peers
- R <- ?RFCS,
- R /= rfc4005 orelse have_nas(),
- Id <- [{D,E}]],
- ?util:write_priv(Config, "transport", [LRef | Cs]).
+ ok = start_service(SN, [{traffic_counters, bool()},
+ {decode_format, SD}
+ | ?SERVICE(SN, Grp)]),
+ Cfg = [{sender, SS},
+ {message_cb, ST andalso {?MODULE, message, [0]}}]
+ ++ [{packet, ?util:choose([false, raw])} || T == sctp andalso CS]
+ ++ [{unordered, unordered()} || T == sctp],
+ Opts = [{capabilities_cb, fun capx/2},
+ {pool_size, 8}
+ | server_apps()],
+ _LRef = ?util:listen(SN, [T | Cfg], Opts).
+
+%% client/1
+
+client(Config, LRef) ->
+ #group{transport = T,
+ encoding = E,
+ client_service = CN,
+ client_sender = CS}
+ = Grp
+ = group(Config),
+ ok = start_service(CN, [{traffic_counters, bool()},
+ {sequence, ?CLIENT_MASK},
+ {decode_format, map},
+ {strict_arities, decode}
+ | ?SERVICE(CN, Grp)]),
+ _ = [?util:connect(CN, [T | C], LRef, O)
+ || C <- [[{sender, CS} | client_opts(T)]],
+ D <- ?DECODINGS, %% for multiple candidate peers
+ R <- ?RFCS,
+ R /= rfc4005 orelse have_nas(),
+ I <- [{D,E}],
+ O <- [[{id, I}
+ | client_apps(R, [{'Origin-State-Id', origin(I)}])]]],
+ ok.
+
+bool() ->
+ 0.5 =< rand:uniform().
unordered() ->
- element(rand:uniform(4), {true, false, 1, 2}).
+ ?util:choose([true, false, 1, 2]).
client_opts(tcp) ->
[];
@@ -567,32 +407,19 @@ server_apps() ->
{capabilities, [{'Auth-Application-Id', [0] ++ [1 || B]}, %% common, NAS
{'Acct-Application-Id', [3]}]}]. %% accounting
+client_apps(rfc4005, Caps) ->
+ [{applications, [nas4005]},
+ {capabilities, [{'Auth-Application-Id', [1]}, %% NAS
+ {'Acct-Application-Id', []}
+ | Caps]}];
client_apps(D, Caps) ->
- if D == rfc4005 ->
- [{applications, [nas4005]},
- {capabilities, [{'Auth-Application-Id', [1]}, %% NAS
- {'Acct-Application-Id', []}
- | Caps]}];
- true ->
- D0 = dict0(D),
- [{applications, [acct(D0), D0]},
- {capabilities, Caps}]
- end.
+ D0 = dict0(D),
+ [{applications, [acct(D0), D0]},
+ {capabilities, Caps}].
have_nas() ->
false /= code:is_loaded(nas4005).
-remove_transports(Config) ->
- #group{client_service = CN,
- server_service = SN}
- = group(Config),
- [LRef | Cs] = ?util:read_priv(Config, "transport"),
- try
- [] = [T || C <- Cs, T <- [?util:disconnect(CN, C, SN, LRef)], T /= ok]
- after
- ok = diameter:remove_transport(SN, LRef)
- end.
-
stop_services(Config) ->
#group{client_service = CN,
server_service = SN}
@@ -600,24 +427,12 @@ stop_services(Config) ->
ok = diameter:stop_service(CN),
ok = diameter:stop_service(SN).
-%% Ensure even transports have been removed from request table.
-empty(_Config) ->
- [] = ets:tab2list(diameter_request).
-
-stop(_Config) ->
- ok = diameter:stop().
-
capx(_, #diameter_caps{origin_host = {OH,DH}}) ->
io:format("connection: ~p -> ~p~n", [DH,OH]),
ok.
%% ===========================================================================
-%% Fail only this testcase if the RFC 4005 dictionary hasn't been
-%% successfully compiled and loaded.
-rfc4005(Config) ->
- true = proplists:get_value(rfc4005, Config).
-
%% Ensure that result codes have the expected values.
result_codes(_Config) ->
{2001,
@@ -1135,6 +950,8 @@ send_anything(Config) ->
%% ===========================================================================
+group(#group{} = Rec) ->
+ Rec;
group(Config) ->
#group{} = proplists:get_value(group, Config).
@@ -1903,25 +1720,19 @@ message(ack, _, N) ->
%% ------------------------------------------------------------------------
compile_and_load() ->
- try
- Path = hd([P || H <- [[here(), ".."], [code:lib_dir(diameter)]],
- P <- [filename:join(H ++ ["examples",
- "dict",
- "rfc4005_nas.dia"])],
- {ok, _} <- [file:read_file_info(P)]]),
- {ok, [Forms]}
- = diameter_make:codec(Path, [return,
- forms,
- {name, "nas4005"},
- {prefix, "nas"},
- {inherits, "common/diameter_gen_base_rfc3588"}]),
- {ok, nas4005, Bin, []} = compile:forms(Forms, [debug_info, return]),
- {module, nas4005} = code:load_binary(nas4005, "nas4005", Bin),
- true
- catch
- E:R:Stack ->
- {E, R, Stack}
- end.
+ Path = hd([P || H <- [[here(), ".."], [code:lib_dir(diameter)]],
+ P <- [filename:join(H ++ ["examples",
+ "dict",
+ "rfc4005_nas.dia"])],
+ {ok, _} <- [file:read_file_info(P)]]),
+ Opts = [return,
+ forms,
+ {name, "nas4005"},
+ {prefix, "nas"},
+ {inherits, "common/diameter_gen_base_rfc3588"}],
+ {ok, [Forms]} = diameter_make:codec(Path, Opts),
+ {ok, nas4005, Bin, []} = compile:forms(Forms, [debug_info, return]),
+ {module, nas4005} = code:load_binary(nas4005, "nas4005", Bin).
here() ->
filename:dirname(code:which(?MODULE)).
diff --git a/lib/diameter/test/diameter_transport_SUITE.erl b/lib/diameter/test/diameter_transport_SUITE.erl
index 284d2b9566..9b763141ff 100644
--- a/lib/diameter/test/diameter_transport_SUITE.erl
+++ b/lib/diameter/test/diameter_transport_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,23 +25,17 @@
-module(diameter_transport_SUITE).
+%% all tests, no common_test dependency
+-export([run/0]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1]).
-
-%% testcases
--export([start/1,
- tcp_accept/1,
- tcp_connect/1,
- sctp_accept/1,
- sctp_connect/1,
- reconnect/1, reconnect/0,
- stop/1]).
+ parallel/1]).
-export([accept/1,
connect/1,
+ reconnect/1,
init/2]).
-include_lib("kernel/include/inet_sctp.hrl").
@@ -84,93 +78,63 @@
-define(SCTP(Sock, Data), {sctp, Sock, _, _, Data}).
%% ===========================================================================
+%% common_test wrapping
suite() ->
- [{timetrap, {seconds, 15}}].
+ [{timetrap, {seconds, 270}}].
all() ->
- [start,
- {group, all},
- {group, all, [parallel]},
- stop].
+ [parallel].
-groups() ->
- [{all, [], tc()}].
+parallel(_) ->
+ run().
-tc() ->
- [tcp_accept,
- tcp_connect,
- sctp_accept,
- sctp_connect,
- reconnect].
+%% ===========================================================================
-init_per_suite(Config) ->
- [{sctp, ?util:have_sctp()} | Config].
+%% run/0
-end_per_suite(_Config) ->
- ok.
+run() ->
+ ok = diameter:start(),
+ try
+ ?util:run([[fun run/1, {P,F}]
+ || P <- [sctp || ?util:have_sctp()] ++ [tcp],
+ F <- [connect, accept, reconnect]])
+ after
+ diameter:stop()
+ end.
-%% ===========================================================================
+%% run/1
-start(_Config) ->
- ok = diameter:start().
+run({Prot, reconnect}) ->
+ reconnect(Prot);
-stop(_Config) ->
- ok = diameter:stop().
+run({Prot, accept}) ->
+ accept(Prot);
+
+run({Prot, connect}) ->
+ connect(Prot).
%% ===========================================================================
-%% tcp_accept/1
-%% sctp_accept/1
+%% accept/1
%%
%% diameter transport accepting, test code connecting.
-tcp_accept(_) ->
- accept(tcp).
-
-sctp_accept(Config) ->
- case lists:member({sctp, true}, Config) of
- true -> accept(sctp);
- false -> {skip, no_sctp}
- end.
-
-%% Start multiple accepting transport processes that are connected to
-%% with an equal number of connecting processes using gen_tcp/sctp
-%% directly.
-
--define(PEER_COUNT, 8).
-
accept(Prot) ->
Ref = make_ref(),
true = diameter_reg:add_new({diameter_config, transport, Ref}), %% fake it
T = {Prot, Ref},
- [] = ?util:run(?util:scramble(acc(2*?PEER_COUNT, T, []))).
-
-acc(0, _, Acc) ->
- Acc;
-acc(N, T, Acc) ->
- acc(N-1, T, [{?MODULE, [init,
- element(1 + N rem 2, {accept, gen_connect}),
- T]}
- | Acc]).
+ ?util:run([{{?MODULE, [init, X, T]}, 15000}
+ || X <- [accept, gen_connect]]).
%% ===========================================================================
-%% tcp_connect/1
-%% sctp_connect/1
+%% connect/1
%%
%% Test code accepting, diameter transport connecting.
-tcp_connect(_) ->
- connect(tcp).
-
-sctp_connect(Config) ->
- case lists:member({sctp, true}, Config) of
- true -> connect(sctp);
- false -> {skip, no_sctp}
- end.
-
connect(Prot) ->
T = {Prot, make_ref()},
- [] = ?util:run([{?MODULE, [init, X, T]} || X <- [gen_accept, connect]]).
+ ?util:run([{{?MODULE, [init, X, T]}, 15000}
+ || X <- [gen_accept, connect]]).
%% ===========================================================================
%% reconnect/1
@@ -179,9 +143,6 @@ connect(Prot) ->
%% doesn't try to establish a new connection until the old one is
%% broken.
-reconnect() ->
- [{timetrap, {minutes, 4}}].
-
reconnect({listen, Ref}) ->
SvcName = make_ref(),
ok = start_service(SvcName),
@@ -222,10 +183,11 @@ reconnect({connect, Ref}) ->
MRef = erlang:monitor(process, Pid),
?RECV({'DOWN', MRef, process, _, _});
-reconnect(_) ->
+reconnect(Prot) ->
Ref = make_ref(),
- [] = ?util:run([{?MODULE, [reconnect, {T, Ref}]}
- || T <- [listen, connect]]).
+ ?util:run([{{?MODULE, [reconnect, {T, Ref}]}, 240000}
+ || Prot == tcp, %% ignore sctp
+ T <- [listen, connect]]).
start_service(SvcName) ->
OH = diameter_util:unique_string(),
@@ -430,8 +392,9 @@ gen_send(tcp, Sock, Bin) ->
gen_recv(sctp, Sock) ->
{_OS, _IS, Id} = getr(assoc),
receive
- ?SCTP(Sock, {[#sctp_sndrcvinfo{assoc_id = Id}], Bin})
+ ?SCTP(Sock, {[#sctp_sndrcvinfo{assoc_id = I}], Bin})
when is_binary(Bin) ->
+ {Id, _} = {I, Id}, %% assert
Bin
end;
gen_recv(tcp, Sock) ->
diff --git a/lib/diameter/test/diameter_util.erl b/lib/diameter/test/diameter_util.erl
index d249b0e4fa..cdb6fa410f 100644
--- a/lib/diameter/test/diameter_util.erl
+++ b/lib/diameter/test/diameter_util.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -31,6 +31,10 @@
fold/3,
foldl/3,
scramble/1,
+ choose/1,
+ tmpdir/0,
+ mktemp/1,
+ peer/1,
unique_string/0,
have_sctp/0,
eprof/1]).
@@ -42,11 +46,6 @@
disconnect/4,
info/0]).
-%% common_test-specific
--export([write_priv/3,
- read_priv/2,
- map_priv/3]).
-
-define(L, atom_to_list).
%% ---------------------------------------------------------------------------
@@ -63,7 +62,7 @@ eprof(stop) ->
%% ---------------------------------------------------------------------------
%% name/2
%%
-%% Contruct and deconstruct lists of atoms as atoms to work around
+%% Construct and deconstruct lists of atoms as atoms to work around
%% group names in common_test being restricted to atoms.
name(Names)
@@ -102,18 +101,37 @@ consult(Path) ->
%% ---------------------------------------------------------------------------
%% run/1
%%
-%% Evaluate functions in parallel and return a list of those that
-%% failed to return. The fun takes a boolean (did the function return
-%% or not), the function that was evaluated, the return value or exit
-%% reason and the prevailing accumulator.
+%% Evaluate functions in parallel and raise an error exception if any
+%% fail to return.
run(L) ->
- fold(fun cons/4, [], L).
-
-cons(true, _, _, Acc) ->
- Acc;
-cons(false, F, RC, Acc) ->
- [{F, RC} | Acc].
+ Ref = make_ref(),
+ AccF = fun(I, [F|T]) ->
+ Ref == (catch element(1, I))
+ orelse error(#{failed => F, reason => I}),
+ T
+ end,
+ Pid = self(),
+ Funs = [fun() -> down(Pid, self()), {Ref, eval(F)} end || F <- L],
+ [] = fold(AccF, L, Funs).
+
+%% down/2
+
+down(Parent, Worker)
+ when is_pid(Parent) ->
+ spawn(fun() ->
+ monitor(process, Worker),
+ down(monitor(process, Parent), Worker)
+ end);
+
+%% Die with the worker, kill the worker if the parent dies.
+down(MRef, Pid) ->
+ receive
+ {'DOWN', MRef, process, _, _} ->
+ exit(Pid, kill);
+ {'DOWN', _, process, Pid, _} ->
+ ok
+ end.
%% ---------------------------------------------------------------------------
%% fold/3
@@ -121,61 +139,43 @@ cons(false, F, RC, Acc) ->
%% Parallel fold. Results are folded in the order received.
fold(Fun, Acc0, L)
- when is_function(Fun, 4) ->
- Ref = make_ref(),
- %% Spawn a middleman to collect down messages from processes
- %% spawned for each function so as not to assume that all DOWN
- %% messages are ours.
- MRef = run1([fun fold/4, Ref, Fun, Acc0, L], Ref),
- {Ref, RC} = down(MRef),
- RC.
-
-fold(Ref, Fun, Acc0, L) ->
- recv(run(Ref, L), Ref, Fun, Acc0).
-
-run(Ref, L) ->
- [{run1(F, Ref), F} || F <- L].
-
-run1(F, Ref) ->
- {_, MRef} = spawn_monitor(fun() -> exit({Ref, eval(F)}) end),
- MRef.
-
-recv([], _, _, Acc) ->
+ when is_list(L) ->
+ fold(Fun, Acc0, lists:foldl(fun(F,A) ->
+ {P,M} = spawn_eval(F),
+ A#{M => P}
+ end,
+ #{},
+ L));
+
+fold(_, Acc, Map)
+ when 0 == map_size(Map) ->
Acc;
-recv(L, Ref, Fun, Acc) ->
- {MRef, R} = down(),
- {MRef, F} = lists:keyfind(MRef, 1, L),
- recv(lists:keydelete(MRef, 1, L),
- Ref,
- Fun,
- acc(R, Ref, F, Fun, Acc)).
-acc({Ref, RC}, Ref, F, Fun, Acc) ->
- Fun(true, F, RC, Acc);
-acc(Reason, _, F, Fun, Acc) ->
- Fun(false, F, Reason, Acc).
+fold(Fun, Acc, #{} = Map) ->
+ receive
+ {'DOWN', MRef, process, _, Info} when is_map_key(MRef, Map) ->
+ fold(Fun, Fun(Info, Acc), maps:remove(MRef, Map))
+ end.
-down(MRef) ->
- receive {'DOWN', MRef, process, _, Reason} -> Reason end.
+%% spawn_eval/1
-down() ->
- receive {'DOWN', MRef, process, _, Reason} -> {MRef, Reason} end.
+spawn_eval(F) ->
+ spawn_monitor(fun() -> exit(eval(F)) end).
%% ---------------------------------------------------------------------------
%% foldl/3
%%
%% Parallel fold. Results are folded in order of the function list.
-foldl(Fun, Acc0, L)
- when is_function(Fun, 4) ->
- Ref = make_ref(),
- recvl(run(Ref, L), Ref, Fun, Acc0).
+foldl(Fun, Acc0, L) ->
+ lists:foldl(fun(R,A) -> acc(Fun, R, A) end,
+ Acc0,
+ [M || F <- L, {_,M} <- [spawn_eval(F)]]).
-recvl([], _, _, Acc) ->
- Acc;
-recvl([{MRef, F} | L], Ref, Fun, Acc) ->
- R = down(MRef),
- recvl(L, Ref, Fun, acc(R, Ref, F, Fun, Acc)).
+%% acc/3
+
+acc(Fun, MRef, Acc) ->
+ receive {'DOWN', MRef, process, _, Info} -> Fun(Info, Acc) end.
%% ---------------------------------------------------------------------------
%% scramble/1
@@ -186,6 +186,71 @@ scramble(L) ->
[X || {_,X} <- lists:sort([{rand:uniform(), T} || T <- L])].
%% ---------------------------------------------------------------------------
+%% choose/1
+%%
+%% Return a random element from a list.
+
+choose([_|_] = List) ->
+ hd(lists:nthtail(rand:uniform(length(List)) - 1, List)).
+
+%% ---------------------------------------------------------------------------
+%% tmpdir/0
+
+tmpdir() ->
+ case os:getenv("TMPDIR") of
+ false ->
+ "/tmp";
+ Dir ->
+ Dir
+ end.
+
+%% mktemp/1
+
+mktemp(Prefix) ->
+ Suf = integer_to_list(erlang:monotonic_time()),
+ Tmp = filename:join(tmpdir(), Prefix ++ "." ++ Suf),
+ ok = file:make_dir(Tmp),
+ Tmp.
+
+%% ---------------------------------------------------------------------------
+%% peer/1
+%%
+%% Start a peer that dies with the calling process, but start it from
+%% a spawned process to make it insensitive to the exit reason of the
+%% calling process.
+
+peer(#{name := _} = Opts) ->
+ Ref = make_ref(),
+ Pid = self(),
+ {_, MRef} = spawn_monitor(fun() -> peer(Opts, Pid, Ref) end),
+ receive
+ {Ref, T} ->
+ erlang:demonitor(MRef, [flush]),
+ T;
+ {'DOWN', MRef, process, _, T} ->
+ {error, T}
+ end;
+
+peer(#{} = Opts) ->
+ peer(Opts#{name => peer:random_name()}).
+
+%% peer/3
+
+peer(Opts, Pid, Ref) ->
+ Cookie = atom_to_list(erlang:get_cookie()),
+ Args = [str(B) || B <- maps:get(args, Opts, [])],
+ Pid ! {Ref, peer:start_link(Opts#{args => ["-setcookie", Cookie | Args]})},
+ MRef = monitor(process, Pid),
+ receive {'DOWN', MRef, process, _, _} -> ok end.
+
+%% str/1
+%%
+%% Turn possible iodata() into string().
+
+str(Bytes) ->
+ binary_to_list(iolist_to_binary(Bytes)).
+
+%% ---------------------------------------------------------------------------
%% unique_string/0
unique_string() ->
@@ -208,8 +273,7 @@ have_sctp(_) ->
{ok, Sock} ->
gen_sctp:close(Sock),
true;
- {error, E} when E == eprotonosupport;
- E == esocktnosupport -> %% fail on any other reason
+ _ ->
false
end.
@@ -218,6 +282,13 @@ have_sctp(_) ->
%%
%% Evaluate a function in one of a number of forms.
+eval({F, infinity}) ->
+ eval(F);
+eval({F, Tmo})
+ when is_integer(Tmo) ->
+ {ok, _} = timer:exit_after(Tmo, timeout),
+ eval(F);
+
eval({M,[F|A]})
when is_atom(F) ->
apply(M,F,A);
@@ -231,55 +302,13 @@ eval([F|A])
eval(L)
when is_list(L) ->
- run(L);
+ [eval(F) || F <- L];
eval(F)
when is_function(F,0) ->
F().
%% ---------------------------------------------------------------------------
-%% write_priv/3
-%%
-%% Write an arbitrary term to a named file.
-
-write_priv(Config, Name, Term) ->
- write(path(Config, Name), Term).
-
-write(Path, Term) ->
- ok = file:write_file(Path, term_to_binary(Term)).
-
-%% read_priv/2
-%%
-%% Read a term from a file.
-
-read_priv(Config, Name) ->
- read(path(Config, Name)).
-
-read(Path) ->
- {ok, Bin} = file:read_file(Path),
- binary_to_term(Bin).
-
-%% map_priv/3
-%%
-%% Modify a term in a file and return both old and new values.
-
-map_priv(Config, Name, Fun1) ->
- map(path(Config, Name), Fun1).
-
-map(Path, Fun1) ->
- T0 = read(Path),
- T1 = Fun1(T0),
- write(Path, T1),
- {T0, T1}.
-
-path(Config, Name)
- when is_atom(Name) ->
- path(Config, ?L(Name));
-path(Config, Name) ->
- Dir = proplists:get_value(priv_dir, Config),
- filename:join([Dir, Name]).
-
-%% ---------------------------------------------------------------------------
%% lport/2
%%
%% Lookup the port number of a tcp/sctp listening transport.
diff --git a/lib/diameter/test/diameter_watchdog_SUITE.erl b/lib/diameter/test/diameter_watchdog_SUITE.erl
index f3f168e671..02f15ff21b 100644
--- a/lib/diameter/test/diameter_watchdog_SUITE.erl
+++ b/lib/diameter/test/diameter_watchdog_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,18 +25,22 @@
-module(diameter_watchdog_SUITE).
+%% testcases, no common_test dependency
+-export([run/0,
+ run/1]).
+
+%% common_test wrapping
-export([suite/0,
all/0,
- init_per_suite/1,
- end_per_suite/1]).
-
-%% testcases
--export([reopen/0, reopen/1, reopen/4, reopen/6,
- suspect/1, suspect/4,
- okay/1, okay/4]).
-
--export([id/1, %% jitter callback
- run1/1,
+ reopen/1,
+ suspect/1,
+ okay/1]).
+
+%% internal callbacks
+-export([reopen/4, reopen/6,
+ suspect/4,
+ okay/4,
+ id/1, %% jitter callback
abuse/1,
abuse/2]).
@@ -48,7 +52,6 @@
-export([message/3]).
-include("diameter.hrl").
--include("diameter_ct.hrl").
%% ===========================================================================
@@ -105,49 +108,72 @@
[])).
%% Log to make failures identifiable.
--define(LOG(T), ?LOG("~p", [T])).
--define(LOG(F,A), ct:pal("~p: " ++ F, [self() | A])).
--define(WARN(F,A), ct:pal(error, "~p: " ++ F, [self() | A])).
+-define(LOG(F,A), io:format("~p: " ++ F ++ "~n", [self() | A])).
%% ===========================================================================
suite() ->
- [{timetrap, {seconds, 90}}].
+ [{timetrap, {seconds, 315}}].
all() ->
- [reopen,
- suspect,
- okay].
+ [reopen, suspect, okay].
-init_per_suite(Config) ->
- ok = diameter:start(),
- Config.
+reopen(_Config) ->
+ run([reopen]).
+
+suspect(_Config) ->
+ run([suspect]).
+
+okay(_Config) ->
+ run([okay]).
+
+%% ===========================================================================
+
+%% run/0
-end_per_suite(_Config) ->
- ok = diameter:stop().
+run() ->
+ run(all()).
+
+%% run/1.
+
+run(reopen) ->
+ reopen(); %% 20 watchdogs @ 15 sec
+
+run(suspect) ->
+ suspect();
+
+run(okay) ->
+ okay();
+
+run(List) ->
+ ok = diameter:start(),
+ try
+ ?util:run([{[fun run/1, T], maps:get(T, #{reopen => 300000}, 90000)}
+ || T <- List])
+ after
+ ok = diameter:stop()
+ end.
%% ===========================================================================
-%% # reopen/1
+%% # reopen/0
%% ===========================================================================
%% Test the watchdog state machine for the required failover, failback
%% and reopen behaviour by examining watchdog events.
reopen() ->
- [{timetrap, {minutes, 5}}]. %% 20 watchdogs @ 15 sec
-
-reopen(_) ->
- [] = run([[reopen, T, W, N, M]
- || T <- [listen, connect], %% watchdog to test
- W <- ?WD_TIMERS, %% watchdog_timer value
- N <- [0,1,2], %% DWR's to answer before ignoring
- M <- ['DWR', 'DWA', 'RAA']]). %% how to induce failback
+ ?util:run([{?MODULE, reopen, [T, W, N, M]}
+ || T <- [listen, connect], %% watchdog to test
+ W <- ?WD_TIMERS, %% watchdog_timer value
+ N <- [0,1,2], %% DWR's to answer before ignoring
+ M <- ['DWR', 'DWA', 'RAA']]). %% how to induce failback
reopen(Test, Wd, N, M) ->
%% Publish a ref ensure the connecting transport is added only
%% once events from the listening transport are subscribed to.
Ref = make_ref(),
- [] = run([[reopen, T, Test, Ref, Wd, N, M] || T <- [listen, connect]]).
+ ?util:run([{?MODULE, reopen, [T, Test, Ref, Wd, N, M]}
+ || T <- [listen, connect]]).
%% reopen/6
@@ -377,14 +403,14 @@ tpid(Ref, [[{ref, Ref},
TPid.
%% ===========================================================================
-%% # suspect/1
+%% # suspect/0
%% ===========================================================================
%% Configure transports to require a set number of watchdog timeouts
%% before moving from OKAY to SUSPECT.
-suspect(_) ->
- [] = run([[abuse, [suspect, N]] || N <- [0,1,3]]).
+suspect() ->
+ ?util:run([{?MODULE, abuse, [[suspect, N]]} || N <- [0,1,3]]).
suspect(Type, Fake, Ref, N)
when is_reference(Ref) ->
@@ -417,7 +443,7 @@ suspect(TRef, false, SvcName, N) ->
%% abuse/1
abuse(F) ->
- [] = run([[abuse, F, T] || T <- [listen, connect]]).
+ ?util:run([{?MODULE, abuse, [F, T]} || T <- [listen, connect]]).
abuse(F, [_,_,_|_] = Args) ->
?LOG("~p", [Args]),
@@ -425,21 +451,21 @@ abuse(F, [_,_,_|_] = Args) ->
abuse([F|A], Test) ->
Ref = make_ref(),
- [] = run([[abuse, F, [T, T == Test, Ref] ++ A]
- || T <- [listen, connect]]);
+ ?util:run([{?MODULE, abuse, [F, [T, T == Test, Ref] ++ A]}
+ || T <- [listen, connect]]);
abuse(F, Test) ->
abuse([F], Test).
%% ===========================================================================
-%% # okay/1
+%% # okay/0
%% ===========================================================================
%% Configure the number of watchdog exchanges before moving from
%% REOPEN to OKAY.
-okay(_) ->
- [] = run([[abuse, [okay, N]] || N <- [0,2,3]]).
+okay() ->
+ ?util:run([{?MODULE, abuse, [[okay, N]]} || N <- [0,2,3]]).
okay(Type, Fake, Ref, N)
when is_reference(Ref) ->
@@ -626,23 +652,6 @@ choose(false, _, X) -> X.
id(T) ->
T.
-%% run/1
-%%
-%% A more useful badmatch in case of failure.
-
-run(Fs) ->
- ?util:run([{?MODULE, [run1, F]} || F <- Fs]).
-
-run1([F|A]) ->
- ok = try
- apply(?MODULE, F, A),
- ok
- catch
- E:R:Stack ->
- ?WARN("~p", [{A, E, R, Stack}]),
- Stack
- end.
-
%% jitter/2
jitter(?WD(T), _) ->
diff --git a/lib/diameter/test/modules.mk b/lib/diameter/test/modules.mk
index 90b0a25d5f..fb8cfc445c 100644
--- a/lib/diameter/test/modules.mk
+++ b/lib/diameter/test/modules.mk
@@ -1,7 +1,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2010-2019. All Rights Reserved.
+# Copyright Ericsson AB 2010-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
#
# %CopyrightEnd%
-TEST_SPEC_FILE = diameter.spec
+TEST_SPEC_FILE = diameter.spec diameter_gh.spec
COVER_SPEC_FILE = diameter.cover
MODULES = \
@@ -50,9 +50,6 @@ MODULES = \
diameter_transport_SUITE \
diameter_watchdog_SUITE
-HRL_FILES = \
- diameter_ct.hrl
-
DATA = \
diameter_codec_SUITE_data/avps.dia \
diameter_codec_SUITE_data/send.dia \
diff --git a/lib/edoc/bin/Makefile b/lib/edoc/bin/Makefile
index d87c08356f..699c3321d3 100644
--- a/lib/edoc/bin/Makefile
+++ b/lib/edoc/bin/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@ ESCRIPT_FILES= \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
docs:
diff --git a/lib/edoc/doc/Makefile b/lib/edoc/doc/Makefile
index c635f07d78..0be38971c4 100644
--- a/lib/edoc/doc/Makefile
+++ b/lib/edoc/doc/Makefile
@@ -57,7 +57,7 @@ info:
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/edoc/include/Makefile b/lib/edoc/include/Makefile
index 6318253c27..a3bfd0568f 100644
--- a/lib/edoc/include/Makefile
+++ b/lib/edoc/include/Makefile
@@ -37,7 +37,7 @@ INCLUDE_FILES = edoc_doclet.hrl
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/edoc/priv/Makefile b/lib/edoc/priv/Makefile
index 45bff37b39..66846fad21 100644
--- a/lib/edoc/priv/Makefile
+++ b/lib/edoc/priv/Makefile
@@ -23,7 +23,7 @@ RELSYSDIR = $(RELEASE_PATH)/lib/edoc-$(EDOC_VSN)
GEN_SCRIPT = edoc_generate
PRIV_FILES = stylesheet.css erlang.png edoc.dtd
-debug opt:
+$(TYPES):
clean:
rm -f core *~
diff --git a/lib/edoc/src/Makefile b/lib/edoc/src/Makefile
index 8acef15248..a455662049 100644
--- a/lib/edoc/src/Makefile
+++ b/lib/edoc/src/Makefile
@@ -49,7 +49,7 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
# Targets
# ----------------------------------------------------
-debug opt: $(OBJECTS)
+$(TYPES): $(OBJECTS)
all: $(OBJECTS)
diff --git a/lib/edoc/src/edoc.app.src b/lib/edoc/src/edoc.app.src
index 0edee67fce..079be93e9e 100644
--- a/lib/edoc/src/edoc.app.src
+++ b/lib/edoc/src/edoc.app.src
@@ -26,6 +26,6 @@
{registered,[]},
{applications, [compiler, kernel, stdlib, syntax_tools]},
{env, []},
- {runtime_dependencies, ["xmerl-1.3.7", "syntax_tools-1.6.14", "stdlib-3.15",
+ {runtime_dependencies, ["xmerl-1.3.7", "syntax_tools-2.0", "stdlib-3.15",
"kernel-3.0", "inets-5.10", "erts-6.0"]}
]}.
diff --git a/lib/edoc/src/edoc.erl b/lib/edoc/src/edoc.erl
index b1cf537f07..8ff27b9759 100644
--- a/lib/edoc/src/edoc.erl
+++ b/lib/edoc/src/edoc.erl
@@ -562,7 +562,7 @@ read_comments(File) ->
%% @doc Extracts comments from an Erlang source code file. See the
%% module {@link //syntax_tools/erl_comment_scan} for details on the
-%% representation of comments. Currently, no options are avaliable.
+%% representation of comments. Currently, no options are available.
-spec read_comments(File, Opts) -> [comment()] when
File :: filename(),
diff --git a/lib/edoc/src/edoc_doclet_chunks.erl b/lib/edoc/src/edoc_doclet_chunks.erl
index 50eb4086b6..d619df2f0a 100644
--- a/lib/edoc/src/edoc_doclet_chunks.erl
+++ b/lib/edoc/src/edoc_doclet_chunks.erl
@@ -89,11 +89,8 @@ gen(Sources, _App, Modules, Ctxt) ->
sources(Sources, Dir, Modules, Env, Options) ->
Suffix = proplists:get_value(file_suffix, Options, ?DEFAULT_FILE_SUFFIX),
- Private = proplists:get_bool(private, Options),
- Hidden = proplists:get_bool(hidden, Options),
{Ms, E} = lists:foldl(fun (Src, {Set, Error}) ->
- source(Src, Dir, Suffix, Env, Set,
- Private, Hidden, Error, Options)
+ source(Src, Dir, Suffix, Env, Set, Error, Options)
end,
{sets:new(), false}, Sources),
{[M || M <- Modules, sets:is_element(M, Ms)], E}.
@@ -104,10 +101,17 @@ sources(Sources, Dir, Modules, Env, Options) ->
%% Add its name to the set if it was successful.
%% Errors are just flagged at this stage,
%% allowing all source files to be processed even if some of them fail.
-source({_M, Name, Path}, Dir, Suffix, Env, OkSet, _Private, _Hidden, ErrorFlag, Options) ->
+source({_M, Name, Path}, Dir, Suffix, Env, OkSet, ErrorFlag, Options0) ->
File = filename:join(Path, Name),
try
- {_Module, Doc, Entries} = edoc:get_doc(File, Env, [return_entries, private, hidden | Options]),
+ %% Without these opts the entries returned by EDoc core (`edoc_extract:source1/5') won't have
+ %% all the necessary data to generate chunks.
+ RequiredChunkOpts = [return_entries, private, hidden],
+ %% But we also want to have the real user-defined `private' accessible.
+ Options = ([{show_private, proplists:get_bool(private, Options0)}]
+ ++ RequiredChunkOpts
+ ++ Options0),
+ {_Module, Doc, Entries} = edoc:get_doc(File, Env, Options),
Chunk = edoc:layout(Doc, [{entries, Entries}, {source, Name} | Options]),
WriteOptions = [{encoding, utf8}],
ok = write_file(Chunk, Dir, chunk_file_name(Name, Suffix), WriteOptions),
diff --git a/lib/edoc/src/edoc_layout_chunks.erl b/lib/edoc/src/edoc_layout_chunks.erl
index 570511c754..e325346b56 100644
--- a/lib/edoc/src/edoc_layout_chunks.erl
+++ b/lib/edoc/src/edoc_layout_chunks.erl
@@ -135,29 +135,34 @@ edoc_to_chunk(Doc, Opts) ->
Opts :: proplists:proplist().
doc_contents(XPath, Doc, Opts) ->
case doc_visibility(XPath, Doc, Opts) of
- hidden -> hidden;
none -> none;
- regular -> doc_contents_(XPath, Doc, Opts)
+ hidden -> hidden;
+ show -> doc_contents_(XPath, Doc, Opts)
end.
+-spec doc_visibility(_, _, _) -> none | hidden | show.
doc_visibility(_XPath, Doc, Opts) ->
case {xpath_to_text("./@private", Doc, Opts),
+ proplists:get_bool(show_private, Opts),
xpath_to_text("./@hidden", Doc, Opts)}
of
- {<<"yes">>, _} ->
- %% EDoc `@private' is EEP-48 `hidden'
+ %% Generating `@private' documentation was explicitly requested
+ {<<"yes">>, true, _} ->
+ show;
+ %% EDoc `@private' maps to EEP-48 `hidden'
+ {<<"yes">>, _, _} ->
hidden;
- {_, <<"yes">>} ->
- %% EDoc `@hidden' is EEP-48 `none'
+ %% EDoc `@hidden' is EEP-48 `none'
+ {_, _, <<"yes">>} ->
none;
_ ->
- regular
+ show
end.
doc_contents_(_XPath, Doc, Opts) ->
- Equiv = xpath_to_chunk("./equiv", Doc),
- Desc = xpath_to_chunk("./description/fullDescription", Doc),
- See = xpath_to_chunk("./see", Doc),
+ Equiv = xpath_to_chunk("./equiv", Doc, Opts),
+ Desc = xpath_to_chunk("./description/fullDescription", Doc, Opts),
+ See = xpath_to_chunk("./see", Doc, Opts),
doc_content(Equiv ++ Desc ++ See, Opts).
meta_deprecated(Doc, Opts) ->
@@ -226,7 +231,7 @@ callback(Cb = #tag{name = callback, origin = code}, Opts) ->
form = Form} = Cb,
EntryDoc = case MaybeDoc of
none -> none;
- _ -> doc_content([xmerl_to_binary(MaybeDoc)], Opts)
+ _ -> doc_content([xmerl_to_binary(MaybeDoc, Opts)], Opts)
end,
{source, File} = lists:keyfind(source, 1, Opts),
Anno = erl_anno:set_file(File, erl_anno:new(Line)),
@@ -449,7 +454,7 @@ source_file(Opts) ->
Source.
-spec doc_content(_, _) -> doc().
-doc_content([], _Opts) -> none;
+doc_content([], _Opts) -> #{};
doc_content(Content, Opts) ->
DocLanguage = proplists:get_value(lang, Opts, <<"en">>),
#{DocLanguage => Content}.
@@ -477,13 +482,13 @@ xpath_to_text(XPath, Doc, Opts) ->
{_ , Value} = format_attribute(Attr),
hd(shell_docs:normalize([Value]));
[#xmlElement{}] = Elements ->
- xmerl_to_binary(Elements);
+ xmerl_to_binary(Elements, Opts);
[_|_] ->
erlang:error(multiple_nodes, [XPath, Doc, Opts])
end.
-xmerl_to_binary(XML) ->
- iolist_to_binary(chunk_to_text(xmerl_to_chunk(XML))).
+xmerl_to_binary(XML, Opts) ->
+ iolist_to_binary(chunk_to_text(xmerl_to_chunk(XML, Opts))).
chunk_to_text([]) -> [];
chunk_to_text([Node | Nodes]) ->
@@ -498,53 +503,53 @@ xpath_to_atom(XPath, Doc, Opts) ->
xpath_to_integer(XPath, Doc, Opts) ->
binary_to_integer(xpath_to_text(XPath, Doc, Opts)).
-xpath_to_chunk(XPath, Doc) ->
+xpath_to_chunk(XPath, Doc, Opts) ->
XmerlDoc = xmerl_xpath:string(XPath, Doc),
- xmerl_to_chunk(XmerlDoc).
+ xmerl_to_chunk(XmerlDoc, Opts).
%%.
%%' Xmerl to chunk format
%%
--spec xmerl_to_chunk([xmerl_doc_node()]) -> shell_docs:chunk_elements().
-xmerl_to_chunk(Contents) ->
- shell_docs:normalize(format_content(Contents)).
+-spec xmerl_to_chunk([xmerl_doc_node()], proplists:proplist()) -> shell_docs:chunk_elements().
+xmerl_to_chunk(Contents, Opts) ->
+ shell_docs:normalize(format_content(Contents, Opts)).
--spec format_content([xmerl_doc_node()]) -> shell_docs:chunk_elements().
-format_content(Contents) ->
+-spec format_content([xmerl_doc_node()], proplists:proplist()) -> shell_docs:chunk_elements().
+format_content(Contents, Opts) ->
{SeeTags, OtherTags} = lists:partition(fun (#xmlElement{name = see}) -> true;
(_) -> false end,
Contents),
- lists:flatten([ format_content_(T) || T <- OtherTags ] ++ rewrite_see_tags(SeeTags)).
+ lists:flatten([ format_content_(T, Opts) || T <- OtherTags ] ++ rewrite_see_tags(SeeTags, Opts)).
--spec format_content_(xmerl_doc_node()) -> shell_docs:chunk_elements().
-format_content_(#xmlPI{}) -> [];
-format_content_(#xmlComment{}) -> [];
+-spec format_content_(xmerl_doc_node(), proplists:proplist()) -> shell_docs:chunk_elements().
+format_content_(#xmlPI{}, _) -> [];
+format_content_(#xmlComment{}, _) -> [];
-format_content_(#xmlText{} = T) ->
+format_content_(#xmlText{} = T, _) ->
Text = T#xmlText.value,
case edoc_lib:is_space(Text) of
true -> [];
false -> [unicode:characters_to_binary(Text)]
end;
-format_content_(#xmlElement{name = equiv} = E) ->
- format_element(rewrite_equiv_tag(E));
-format_content_(#xmlElement{name = a} = E) ->
- format_element(rewrite_a_tag(E));
-format_content_(#xmlElement{} = E) ->
- format_element(E).
+format_content_(#xmlElement{name = equiv} = E, Opts) ->
+ format_element(rewrite_equiv_tag(E), Opts);
+format_content_(#xmlElement{name = a} = E, Opts) ->
+ format_element(rewrite_a_tag(E), Opts);
+format_content_(#xmlElement{} = E, Opts) ->
+ format_element(E, Opts).
-format_element(#xmlElement{} = E) ->
+format_element(#xmlElement{} = E, Opts) ->
#xmlElement{name = Name, content = Content, attributes = Attributes} = E,
case {is_edoc_tag(Name), is_html_tag(Name)} of
{true, _} ->
- format_content(Content);
+ format_content(Content, Opts);
{_, false} ->
- edoc_report:warning("'~s' is not allowed - skipping tag, extracting content", [Name]),
- format_content(Content);
+ edoc_report:warning(0, source_file(Opts), "'~s' is not allowed - skipping tag, extracting content", [Name]),
+ format_content(Content, Opts);
_ ->
- [{Name, format_attributes(Attributes), format_content(Content)}]
+ [{Name, format_attributes(Attributes), format_content(Content, Opts)}]
end.
-spec format_attributes([xmerl_attribute()]) -> [shell_docs:chunk_element_attr()].
@@ -575,12 +580,12 @@ rewrite_a_tag(#xmlElement{name = a} = E) ->
SimpleE = xmerl_lib:simplify_element(E),
xmerl_lib:normalize_element(rewrite_docgen_link(SimpleE)).
-rewrite_see_tags([]) -> [];
-rewrite_see_tags([#xmlElement{name = see} | _] = SeeTags) ->
+rewrite_see_tags([], _Opts) -> [];
+rewrite_see_tags([#xmlElement{name = see} | _] = SeeTags, Opts) ->
Grouped = [ rewrite_see_tag(T) || T <- SeeTags ],
NewXML = {p, [], [{em,[],["See also: "]}] ++ lists:join(", ", Grouped) ++ ["."]},
%% Convert strings to binaries in the entire new tree:
- [format_content_(xmerl_lib:normalize_element(NewXML))].
+ [format_content_(xmerl_lib:normalize_element(NewXML), Opts)].
rewrite_see_tag(#xmlElement{name = see} = E) ->
%% TODO: this is not formatted nicely by shell_docs...
diff --git a/lib/edoc/src/edoc_tags.erl b/lib/edoc/src/edoc_tags.erl
index 005c062e23..e467b98a00 100644
--- a/lib/edoc/src/edoc_tags.erl
+++ b/lib/edoc/src/edoc_tags.erl
@@ -340,6 +340,7 @@ parse_contact(Data, Line, _Env, _Where) ->
Info
end.
+-dialyzer({no_match, parse_typedef/4}).
parse_typedef(Data, Line, _Env, Where) ->
edoc_report:warning(Line, Where,
"EDoc @type tags are deprecated. "
diff --git a/lib/edoc/src/edoc_types.erl b/lib/edoc/src/edoc_types.erl
index fd427b2c1a..94e8db5749 100644
--- a/lib/edoc/src/edoc_types.erl
+++ b/lib/edoc/src/edoc_types.erl
@@ -39,9 +39,9 @@
-include("edoc_types.hrl").
-include_lib("xmerl/include/xmerl.hrl").
-%-type t_spec() :: #t_spec{name :: t_name(),
-% type :: t_type(),
-% defs :: [t_def()]}.
+-type t_spec() :: #t_spec{name :: t_name(),
+ type :: t_fun(),
+ defs :: [t_def()]}.
%% Function specification.
-type type() :: t_atom() | t_binary() | t_float() | t_fun() | t_integer()
@@ -49,18 +49,18 @@
| t_record() | t_tuple() | t_type() | t_union() | t_var()
| t_paren().
-%-type t_typedef() :: #t_typedef{name :: t_name(),
-% args :: [type()],
-% type :: type() | undefined,
-% defs :: [t_def()]}.
+-type t_typedef() :: #t_typedef{name :: t_name(),
+ args :: [type()],
+ type :: type() | undefined,
+ defs :: [t_def()]}.
%% Type declaration/definition.
-%-type t_throws() :: #t_throws{type :: type(),
-% defs :: [t_def()]}.
+-type t_throws() :: #t_throws{type :: type(),
+ defs :: [t_def()]}.
%% Exception declaration.
-%-type t_def() :: #t_def{name :: t_type() | t_var(),
-% type :: type()}.
+-type t_def() :: #t_def{name :: t_type() | t_var(),
+ type :: type()}.
%% Local definition `name = type'.
-type t_name() :: #t_name{app :: [] | atom(),
@@ -137,11 +137,9 @@ is_predefined(cons, 2) -> true;
is_predefined(deep_string, 0) -> true;
is_predefined(F, A) -> erl_internal:is_type(F, A).
-is_new_predefined(nonempty_binary, 0) -> true;
-is_new_predefined(nonempty_bitstring, 0) -> true;
-is_new_predefined(map, 0) -> true;
is_new_predefined(_, _) -> false.
+-spec to_ref(t_typedef() | t_def() | t_type() | t_name()) -> edoc_refs:t().
to_ref(#t_typedef{name = N}) ->
to_ref(N);
to_ref(#t_def{name = N}) ->
@@ -172,6 +170,8 @@ infer_module_app(#t_name{app = [], module = M} = TName) when is_atom(M) ->
infer_module_app(Other) ->
Other.
+-spec to_xml(type() | t_spec() | t_typedef() | t_def() | t_throws(),
+ term(), Opts :: proplists:proplist()) -> term().
to_xml(#t_var{name = N}, _Env, _Opts) ->
{typevar, [{name, atom_to_list(N)}], []};
to_xml(#t_name{module = [], name = N}, _Env, _Opts) ->
diff --git a/lib/edoc/src/edoc_wiki.erl b/lib/edoc/src/edoc_wiki.erl
index 574880703c..903d69e84c 100644
--- a/lib/edoc/src/edoc_wiki.erl
+++ b/lib/edoc/src/edoc_wiki.erl
@@ -42,7 +42,7 @@
%% and the resulting text easier to read. The wiki notation should be a
%% small bag of easy-to-remember tricks for making XHTML documentation
%% easier to write, not a complete markup language in itself. As a
-%% typical example, it is hardly worthwile to introduce a special
+%% typical example, it is hardly worthwhile to introduce a special
%% notation like say, ""..."" for emphasized text, since <em>...</em> is
%% not much harder to write, not any less readable, and no more
%% difficult to remember, especially since emphasis is not very often
diff --git a/lib/edoc/test/Makefile b/lib/edoc/test/Makefile
index ecc93e32be..80906a9456 100644
--- a/lib/edoc/test/Makefile
+++ b/lib/edoc/test/Makefile
@@ -40,7 +40,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) '*_SUITE_make' \
>> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/eldap/doc/src/eldap.xml b/lib/eldap/doc/src/eldap.xml
index 2af599751c..4d9ec96a70 100644
--- a/lib/eldap/doc/src/eldap.xml
+++ b/lib/eldap/doc/src/eldap.xml
@@ -552,4 +552,3 @@ Control2 = eldap:paged_result_control(PageSize, Cookie1),
</funcs>
</erlref>
-
diff --git a/lib/eldap/src/Makefile b/lib/eldap/src/Makefile
index b79a537424..04a84a4766 100644
--- a/lib/eldap/src/Makefile
+++ b/lib/eldap/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2012-2016. All Rights Reserved.
+# Copyright Ericsson AB 2012-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -67,8 +67,8 @@ ERL_COMPILE_FLAGS += -I../include -I../ebin -Werror
# ----------------------------------------------------
opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
clean:
rm -f $(TARGET_FILES) $(GEN_FILES) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/eldap/src/eldap.app.src b/lib/eldap/src/eldap.app.src
index 03a7d7c562..032a391936 100644
--- a/lib/eldap/src/eldap.app.src
+++ b/lib/eldap/src/eldap.app.src
@@ -5,6 +5,6 @@
{registered, []},
{applications, [kernel, stdlib]},
{env, []},
- {runtime_dependencies, ["stdlib-2.0","ssl-5.3.4","kernel-3.0","erts-6.0",
+ {runtime_dependencies, ["stdlib-3.4","ssl-5.3.4","kernel-3.0","erts-6.0",
"asn1-3.0"]}
]}.
diff --git a/lib/eldap/test/Makefile b/lib/eldap/test/Makefile
index 81fa8f187a..ba8fe0dfa9 100644
--- a/lib/eldap/test/Makefile
+++ b/lib/eldap/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2012-2016. All Rights Reserved.
+# Copyright Ericsson AB 2012-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -61,7 +61,7 @@ EBIN = .
# Targets
# ----------------------------------------------------
-tests debug opt: $(TARGET_FILES)
+tests $(TYPES): $(TARGET_FILES)
clean:
diff --git a/lib/erl_docgen/doc/src/doc_storage.xml b/lib/erl_docgen/doc/src/doc_storage.xml
index cc6cf5d549..6f88e36e20 100644
--- a/lib/erl_docgen/doc/src/doc_storage.xml
+++ b/lib/erl_docgen/doc/src/doc_storage.xml
@@ -34,7 +34,7 @@
<p><seeguide marker="kernel:eep48_chapter">EEP-48</seeguide>
defines a common documentation storage format for module documentation in the Erlang/OTP
ecosystem. Erl_Docgen can generate documentation in this format from XML files following
- the DTD's descibed in the other User's Guides in this application.</p>
+ the DTD's described in the other User's Guides in this application.</p>
<p>Some special considerations have to be taken when writing documentation that
should also be available through EEP-48 style storage.</p>
<list>
diff --git a/lib/erl_docgen/priv/bin/Makefile b/lib/erl_docgen/priv/bin/Makefile
index 9ccb84b9c6..2bd1ddc22c 100644
--- a/lib/erl_docgen/priv/bin/Makefile
+++ b/lib/erl_docgen/priv/bin/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -50,7 +50,7 @@ ESCRIPT_FILES= \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
docs:
diff --git a/lib/erl_docgen/priv/bin/github_link.escript b/lib/erl_docgen/priv/bin/github_link.escript
index e0f5a2f471..c554c73a3d 100755
--- a/lib/erl_docgen/priv/bin/github_link.escript
+++ b/lib/erl_docgen/priv/bin/github_link.escript
@@ -2,7 +2,7 @@
%% -*- erlang -*-
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@ sub([], _Pat, _Fn, _Sha, _Cnt) ->
sub([H|T], Pat, Fn, Sha, Cnt) ->
%% We use the maint branch here, it is not as exact as the tag,
%% but it is the best we can do as github does not allow doing
- %% pullrequests on anything but branches.
+ %% pull requests on anything but branches.
[re:replace(H,["<",Pat,">"],
["<",Pat," ghlink=\"maint/",Fn,"#L",
integer_to_list(Cnt),"\">"],[{return,list}]) |
diff --git a/lib/erl_docgen/priv/bin/validate_links.escript b/lib/erl_docgen/priv/bin/validate_links.escript
index a11350ad2f..2373a08b29 100755
--- a/lib/erl_docgen/priv/bin/validate_links.escript
+++ b/lib/erl_docgen/priv/bin/validate_links.escript
@@ -3,7 +3,7 @@
%%! +A 1 +SDio 1 +S 1 -mode minimal
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -231,14 +231,19 @@ validate_link(Filename, "seemfa", Line, Link, CachedFiles) ->
try list_to_integer(Arity) of
_ ->
MF = App ++ ":" ++ Mod ++ "#" ++ Func,
- Funcs = maps:get(funcs,maps:get({App,Mod},CachedFiles)),
- case lists:member({Func,Arity},Funcs) of
- true ->
- validate_type(Line, "seemfa",
- read_link(Line, ParsedLink, CachedFiles));
- false ->
- fail(Line, "Could not find documentation for ~s when "
- "resolving link",[MF ++ "/" ++ Arity])
+ case maps:find({App,Mod},CachedFiles) of
+ error ->
+ fail(Line, "Could not find ~ts in ~ts", [Mod, App]);
+ {ok, ModInfo} ->
+ Funcs = maps:get(funcs,ModInfo),
+ case lists:member({Func,Arity},Funcs) of
+ true ->
+ validate_type(Line, "seemfa",
+ read_link(Line, ParsedLink, CachedFiles));
+ false ->
+ fail(Line, "Could not find documentation for ~s when "
+ "resolving link",[MF ++ "/" ++ Arity])
+ end
end
catch _:_ ->
fail(Line, "Invalid arity for seemfa. "
diff --git a/lib/erl_docgen/priv/css/Makefile b/lib/erl_docgen/priv/css/Makefile
index 7f24128753..d80172b887 100644
--- a/lib/erl_docgen/priv/css/Makefile
+++ b/lib/erl_docgen/priv/css/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ CSS_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
DOC_TARGETS?=html
diff --git a/lib/erl_docgen/priv/dtd/Makefile b/lib/erl_docgen/priv/dtd/Makefile
index bed1827dac..84e61320b1 100644
--- a/lib/erl_docgen/priv/dtd/Makefile
+++ b/lib/erl_docgen/priv/dtd/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -70,7 +70,7 @@ ENT_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
docs:
diff --git a/lib/erl_docgen/priv/dtd_html_entities/Makefile b/lib/erl_docgen/priv/dtd_html_entities/Makefile
index c0026bd04d..fd50fed6e5 100644
--- a/lib/erl_docgen/priv/dtd_html_entities/Makefile
+++ b/lib/erl_docgen/priv/dtd_html_entities/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@ ENTITY_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
docs:
diff --git a/lib/erl_docgen/priv/dtd_man_entities/Makefile b/lib/erl_docgen/priv/dtd_man_entities/Makefile
index c634417e8c..a6565f55d0 100644
--- a/lib/erl_docgen/priv/dtd_man_entities/Makefile
+++ b/lib/erl_docgen/priv/dtd_man_entities/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -49,7 +49,7 @@ ENTITY_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
docs:
diff --git a/lib/erl_docgen/priv/images/Makefile b/lib/erl_docgen/priv/images/Makefile
index 03d3e19997..66a3a4dd0a 100644
--- a/lib/erl_docgen/priv/images/Makefile
+++ b/lib/erl_docgen/priv/images/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -52,7 +52,7 @@ PNG_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
DOC_TARGETS?=html
diff --git a/lib/erl_docgen/priv/js/flipmenu/Makefile b/lib/erl_docgen/priv/js/flipmenu/Makefile
index 030b1fa052..f3f657f3a5 100644
--- a/lib/erl_docgen/priv/js/flipmenu/Makefile
+++ b/lib/erl_docgen/priv/js/flipmenu/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -54,7 +54,7 @@ JS_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
DOC_TARGETS?=html
diff --git a/lib/erl_docgen/priv/xsl/Makefile b/lib/erl_docgen/priv/xsl/Makefile
index d381bd4cf7..5a9a947e00 100644
--- a/lib/erl_docgen/priv/xsl/Makefile
+++ b/lib/erl_docgen/priv/xsl/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2018. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ XSL_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
docs:
diff --git a/lib/erl_docgen/priv/xsl/db_html.xsl b/lib/erl_docgen/priv/xsl/db_html.xsl
index fc02f8fdc5..f47b294ea9 100644
--- a/lib/erl_docgen/priv/xsl/db_html.xsl
+++ b/lib/erl_docgen/priv/xsl/db_html.xsl
@@ -752,7 +752,7 @@
<xsl:template match="marker" mode="local_type">
<xsl:param name="local_types"/>
<xsl:param name="global_types"/>
- <!-- Craete no anchor -->
+ <!-- Create no anchor -->
<!-- It would be possible to create a link to the global type
(if there is one), but that would mean even more code...
-->
diff --git a/lib/erl_docgen/src/Makefile b/lib/erl_docgen/src/Makefile
index e4339dcb1f..458094e35f 100644
--- a/lib/erl_docgen/src/Makefile
+++ b/lib/erl_docgen/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -66,7 +66,7 @@ ERL_COMPILE_FLAGS += -I../../xmerl/include
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/erl_docgen/src/docgen_edoc_xml_cb.erl b/lib/erl_docgen/src/docgen_edoc_xml_cb.erl
index d5511eae9d..4590926fad 100644
--- a/lib/erl_docgen/src/docgen_edoc_xml_cb.erl
+++ b/lib/erl_docgen/src/docgen_edoc_xml_cb.erl
@@ -185,7 +185,7 @@ chapter_title(#xmlElement{content=Es}) -> % name = h3 | h4
%% Es1 = Es2 = [#xmlElement{} | #xmlText{}]
%% Fix things that are allowed in XHTML but not in chapter/erlref DTDs.
%% 1) lists (<ul>, <ol>, <dl>) and code snippets (<pre>) cannot occur
-%% within a <p>, such a <p> must be splitted into a sequence of <p>,
+%% within a <p>, such a <p> must be split into a sequence of <p>,
%% <ul>, <ol>, <dl> and <pre>.
%% 2) <a> must only have either a href attribute (corresponds to a
%% <seealso> or <url> in the XML code) in which case its content
@@ -282,7 +282,7 @@ otp_xmlify_es([E | Es]) ->
otp_xmlify_e(E) ++ otp_xmlify_es(Es);
%% paragraph contained dl, ul and/or pre and has been
- %% splitted
+ %% split
SubEs ->
lists:flatmap(fun otp_xmlify_e/1, SubEs) ++
otp_xmlify_es(Es)
@@ -452,7 +452,7 @@ otp_xmlify_e(E) ->
%%--Tags with special handling------------------------------------------
%% otp_xmlify_a(A1) -> [A2]
-%% Takes an <a> element and filters the attributes to decide wheather
+%% Takes an <a> element and filters the attributes to decide whether
%% its a seealso/url or a marker.
%% In the case of a seealso/url, the href part is checked, making
%% sure a .xml/.html file extension is removed.
diff --git a/lib/erl_docgen/src/docgen_otp_specs.erl b/lib/erl_docgen/src/docgen_otp_specs.erl
index 1807c450d8..633353f34c 100644
--- a/lib/erl_docgen/src/docgen_otp_specs.erl
+++ b/lib/erl_docgen/src/docgen_otp_specs.erl
@@ -164,7 +164,7 @@ collect_localdef(E = #xmlElement{content = Es}, Opts) ->
{Name,N0,format_type(N0, get_elem(type, Es), Opts)}.
%% "A = t(), B = t()" is coalesced into "A = B = t()".
-%% Names as B above are kept, but the formated string is empty.
+%% Names as B above are kept, but the formatted string is empty.
coalesce_local_defs([], _Last) ->
[];
coalesce_local_defs([{Name,N0,TypeS} | L], Last) when Name =:= N0 ->
diff --git a/lib/erl_docgen/src/docgen_xml_to_chunk.erl b/lib/erl_docgen/src/docgen_xml_to_chunk.erl
index c936c58d31..0bdd197db9 100644
--- a/lib/erl_docgen/src/docgen_xml_to_chunk.erl
+++ b/lib/erl_docgen/src/docgen_xml_to_chunk.erl
@@ -31,14 +31,24 @@
main([_Application, FromBeam, _Escript, ToChunk]) ->
%% The given module is not documented, generate a hidden beam chunk file
Name = filename:basename(filename:rootname(FromBeam)) ++ ".erl",
+ {ok, {_Module, [{exports, Exports}]}} = beam_lib:chunks(FromBeam, [exports]),
- EmptyDocs = #docs_v1{ anno = erl_anno:set_file(Name, erl_anno:new(0)),
- module_doc = hidden, docs = []},
+ Anno = erl_anno:set_file(Name, erl_anno:new(0)),
+
+ EmptyDocs = add_hidden_docs(
+ Exports,
+ #docs_v1{ anno = Anno,
+ module_doc = hidden,
+ docs = []}),
ok = file:write_file(ToChunk, term_to_binary(EmptyDocs,[compressed])),
ok;
-main([Application, FromXML, FromBeam, _Escript, ToChunk]) ->
+main([Application, FromXML, FromBeam, Escript, ToChunk]) ->
_ = erlang:process_flag(max_heap_size,20 * 1000 * 1000),
case docs(Application, FromXML, FromBeam) of
+ {error, not_erlref} ->
+ %% The XML files was not a erlref, so we generate
+ %% a hidden entry for this module.
+ main([Application, FromBeam, Escript, ToChunk]);
{error, Reason} ->
io:format("Failed to create chunks: ~p~n",[Reason]),
erlang:halt(1);
@@ -68,7 +78,7 @@ main([Application, FromXML, FromBeam, _Escript, ToChunk]) ->
erlang:halt(1),
ok;
Docs ->
- ok = file:write_file(ToChunk, term_to_binary(Docs,[compressed]))
+ ok = file:write_file(ToChunk, term_to_binary(Docs, [compressed]))
end.
%% Error handling
@@ -269,17 +279,34 @@ docs(Application, OTPXml, FromBEAM)->
{event_state,initial_state()}]) of
{ok,Tree,_} ->
{ok, {Module, Chunks}} = beam_lib:chunks(FromBEAM,[exports,abstract_code]),
- Dom = get_dom(Tree),
- put(application, Application),
- put(module, filename:basename(filename:rootname(FromBEAM))),
- NewDom = transform(Dom,[]),
- Chunk = to_chunk(NewDom, OTPXml, Module, proplists:get_value(abstract_code, Chunks)),
- verify_chunk(Module,proplists:get_value(exports, Chunks), Chunk),
- Chunk;
+ case get_dom(Tree) of
+ [{erlref,_,_}] = Dom ->
+ put(application, Application),
+ put(module, filename:basename(filename:rootname(FromBEAM))),
+ NewDom = transform(Dom, []),
+ Chunk = add_hidden_docs(
+ proplists:get_value(exports, Chunks),
+ to_chunk(NewDom, OTPXml, Module,
+ proplists:get_value(abstract_code, Chunks))),
+ verify_chunk(Module, proplists:get_value(exports, Chunks), Chunk),
+ Chunk;
+ _Else ->
+ {error,not_erlref}
+ end;
Else ->
{error,Else}
end.
+%% Create hidden function entries for any exported functions that
+%% does not have any documentation.
+add_hidden_docs(Exports, #docs_v1{ anno = Anno, docs = Docs } = Chunk) ->
+ HiddenFuncs =
+ [{{function, F, A}, Anno,
+ [iolist_to_binary(io_lib:format("~p/~p", [F, A]))],
+ hidden, #{}} || {F, A} <- Exports, F =/= module_info,
+ lists:keysearch({function, F, A}, 1, Docs) == false ],
+ Chunk#docs_v1{ docs = HiddenFuncs ++ Docs }.
+
verify_chunk(M, Exports, #docs_v1{ docs = Docs } = Doc) ->
%% Make sure that each documented function actually is exported
diff --git a/lib/erl_docgen/src/erl_docgen.app.src b/lib/erl_docgen/src/erl_docgen.app.src
index c7b7967a3d..5a6b48bd26 100644
--- a/lib/erl_docgen/src/erl_docgen.app.src
+++ b/lib/erl_docgen/src/erl_docgen.app.src
@@ -10,6 +10,6 @@
{registered,[]},
{applications, [kernel,stdlib]},
{env, []},
- {runtime_dependencies, ["xmerl-1.3.7","kernel-8.0","stdlib-3.15","edoc-1.0","erts-9.0"]}
+ {runtime_dependencies, ["xmerl-1.3.7","kernel-8.0","stdlib-3.15","edoc-1.0","erts-11.0"]}
]
}.
diff --git a/lib/erl_docgen/test/Makefile b/lib/erl_docgen/test/Makefile
index 9e58157023..fe45b2a684 100644
--- a/lib/erl_docgen/test/Makefile
+++ b/lib/erl_docgen/test/Makefile
@@ -39,7 +39,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) '*_SUITE_make' \
>> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/erl_interface/config.h.in b/lib/erl_interface/config.h.in
index 2ec4f66c3b..aba0e2ec91 100644
--- a/lib/erl_interface/config.h.in
+++ b/lib/erl_interface/config.h.in
@@ -1,11 +1,6 @@
-/* config.h.in. Generated from configure.in by autoheader. */
+/* config.h.in. Generated from configure.ac by autoheader. */
-/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
- systems. This function is required for `alloca.c' support on those systems.
- */
-#undef CRAY_STACKSEG_END
-
-/* Define to 1 if using `alloca.c'. */
+/* Define to 1 if using 'alloca.c'. */
#undef C_ALLOCA
/* Define if 'errno' should not be exposed as is in 'erl_errno' */
@@ -74,11 +69,10 @@
__sync_val_compare_and_swap() can handle on your system */
#undef ETHR_HAVE___sync_val_compare_and_swap
-/* Define to 1 if you have `alloca', as a function or macro. */
+/* Define to 1 if you have 'alloca', as a function or macro. */
#undef HAVE_ALLOCA
-/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
- */
+/* Define to 1 if <alloca.h> works. */
#undef HAVE_ALLOCA_H
/* Define to 1 if you have the <arpa/inet.h> header file. */
@@ -123,18 +117,12 @@
/* Define to 1 if you have the `gmp' library (-lgmp). */
#undef HAVE_LIBGMP
-/* Define to 1 if you have the `nsl' library (-lnsl). */
-#undef HAVE_LIBNSL
-
/* Define to 1 if you have the `resolv' library (-lresolv). */
#undef HAVE_LIBRESOLV
/* Define to 1 if you have the `rt' library (-lrt). */
#undef HAVE_LIBRT
-/* Define to 1 if you have the `socket' library (-lsocket). */
-#undef HAVE_LIBSOCKET
-
/* Define to 1 if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
@@ -147,9 +135,6 @@
/* Define to 1 if you have the `memmove' function. */
#undef HAVE_MEMMOVE
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
/* Define to 1 if you have the `memset' function. */
#undef HAVE_MEMSET
@@ -180,6 +165,9 @@
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
+/* Define to 1 if you have the <stdio.h> header file. */
+#undef HAVE_STDIO_H
+
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
@@ -284,16 +272,15 @@
STACK_DIRECTION = 0 => direction of growth unknown */
#undef STACK_DIRECTION
-/* Define to 1 if you have the ANSI C header files. */
+/* Define to 1 if all of the C90 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
#undef STDC_HEADERS
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#undef TIME_WITH_SYS_TIME
-
/* Define to `int' if <sys/types.h> doesn't define. */
#undef gid_t
-/* Define to `int' if <sys/types.h> does not define. */
+/* Define as a signed integer type capable of holding a process identifier. */
#undef pid_t
/* Define to `unsigned int' if <sys/types.h> does not define. */
diff --git a/lib/erl_interface/configure b/lib/erl_interface/configure
index 50c4b6396e..809a812253 100755
--- a/lib/erl_interface/configure
+++ b/lib/erl_interface/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,42 +167,53 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -228,14 +221,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -253,18 +253,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -291,6 +292,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -308,6 +310,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -322,7 +332,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -331,7 +341,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -370,12 +380,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -387,18 +398,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -410,9 +430,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -439,7 +459,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -483,7 +503,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -497,6 +517,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -510,6 +534,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -575,49 +606,46 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
-
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+ac_unique_file="include/ei.h"
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
+ac_header_c_list=
ac_subst_vars='LTLIBOBJS
DED_OSTYPE
DED_LIBS
@@ -650,10 +678,10 @@ INSTALL_SCRIPT
INSTALL_PROGRAM
AR
ARCH
-EGREP
-GREP
LD
RANLIB
+EGREP
+GREP
CPP
OBJEXT
EXEEXT
@@ -664,6 +692,10 @@ CFLAGS
CC
DYNAMIC_LIB
TARGET
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -797,8 +829,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -839,9 +869,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -865,9 +895,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1078,9 +1108,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1094,9 +1124,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1140,9 +1170,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1158,7 +1188,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1222,7 +1252,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1340,6 +1370,7 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1392,9 +1423,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1422,7 +1453,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1430,7 +1462,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1440,9 +1472,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1459,14 +1491,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1474,14 +1506,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1503,7 +1536,7 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1511,14 +1544,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } > conftest.i && {
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
test ! -s conftest.err
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1530,8 +1564,8 @@ fi
# ac_fn_c_try_run LINENO
# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
ac_fn_c_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
@@ -1541,25 +1575,26 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
@@ -1584,7 +1619,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
@@ -1594,14 +1629,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=0 ac_mid=0
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -1611,9 +1647,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid; break
-else
+else $as_nop
as_fn_arith $ac_mid + 1 && ac_lo=$as_val
if test $ac_lo -le $ac_mid; then
ac_lo= ac_hi=
@@ -1621,14 +1658,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
@@ -1638,14 +1675,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=-1 ac_mid=-1
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
@@ -1655,9 +1693,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=$ac_mid; break
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
if test $ac_mid -le $ac_hi; then
ac_lo= ac_hi=
@@ -1665,14 +1704,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
ac_lo= ac_hi=
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
@@ -1680,7 +1719,7 @@ while test "x$ac_lo" != "x$ac_hi"; do
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -1690,12 +1729,13 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
@@ -1705,12 +1745,12 @@ esac
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.val", "w");
@@ -1738,9 +1778,10 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
+else $as_nop
ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -1760,26 +1801,28 @@ rm -f conftest.val
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
@@ -1790,14 +1833,14 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1805,17 +1848,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1830,93 +1874,6 @@ fi
} # ac_fn_c_try_link
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
@@ -1924,17 +1881,18 @@ fi
ac_fn_c_check_type ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
eval "$3=no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof ($2))
return 0;
@@ -1942,12 +1900,13 @@ if (sizeof ($2))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof (($2)))
return 0;
@@ -1955,18 +1914,19 @@ if (sizeof (($2)))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
eval "$3=yes"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_type
@@ -1977,11 +1937,12 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
@@ -1989,16 +1950,9 @@ else
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ which can conflict with char $2 (); below. */
+#include <limits.h>
#undef $2
/* Override any GCC internal prototype to avoid an error.
@@ -2016,35 +1970,56 @@ choke me
#endif
int
-main ()
+main (void)
{
return $2 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -2077,8 +2052,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -2113,7 +2092,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -2148,11 +2127,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -2163,8 +2144,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -2188,7 +2169,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -2196,14 +2177,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -2211,15 +2192,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -2227,8 +2208,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -2242,63 +2223,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -2308,19 +2274,435 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+as_fn_append ac_header_c_list " sys/time.h sys_time_h HAVE_SYS_TIME_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="install-sh config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${ERL_TOP}/make/autoconf"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2331,12 +2713,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2345,24 +2727,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2372,11 +2754,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2390,6 +2773,99 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
#### Make srcdir absolute, if it isn't already. It's important to
#### avoid running the path through pwd unnecessary, since pwd can
#### give you automounter prefixes, which can go away.
@@ -2410,57 +2886,32 @@ case "${srcdir}" in
* ) srcdir="`(cd ${srcdir}; pwd)`" ;;
esac
-ac_aux_dir=
-for ac_dir in $srcdir/src/auxdir "$srcdir"/$srcdir/src/auxdir; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in $srcdir/src/auxdir \"$srcdir\"/$srcdir/src/auxdir" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2479,21 +2930,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2512,10 +2964,108 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
else
- host_os=win32
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ # Adjust for local legacy windows hack...
+ case $host in #(
+ local-*-windows) :
+
+ host=win32
+ host_os=win32
+ host_vendor=
+ host_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $build in #(
+ local-*-windows) :
+
+ build=win32
+ build_os=win32
+ build_vendor=
+ build_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $target in #(
+ local-*-windows) :
+
+ target=win32
+ target_os=win32
+ target_vendor=
+ target_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+ if test "$cross_compiling" = "yes" -a "$build" = "$host"
+then :
+ as_fn_error $? "
+ Cross compiling with the same canonicalized 'host' value
+ as the canonicalized 'build' value.
+
+ We are cross compiling since the '--host=$host_alias'
+ and the '--build=$build_alias' arguments differ. When
+ cross compiling Erlang/OTP, also the canonicalized values of
+ the '--build' and the '--host' arguments *must* differ. The
+ canonicalized values of these arguments however both equals:
+ $host
+
+ You can check the canonical value by passing a value as
+ argument to the 'make/autoconf/config.sub' script.
+ " "$LINENO" 5
fi
+
TARGET=$host
@@ -2526,40 +3076,52 @@ ac_config_headers="$ac_config_headers src/$host/config.h:config.h.in"
# Use --disable-threads to force building single threaded libs even
# if pthreads exists (for test purposes).
# Check whether --enable-threads was given.
-if test "${enable_threads+set}" = set; then :
+if test ${enable_threads+y}
+then :
enableval=$enable_threads; case "$enableval" in
no) threads_disabled=yes ;;
*) threads_disabled=no ;;
esac
-else
+else $as_nop
threads_disabled=maybe
fi
# Check whether --enable-mask-real-errno was given.
-if test "${enable_mask_real_errno+set}" = set; then :
+if test ${enable_mask_real_errno+y}
+then :
enableval=$enable_mask_real_errno; case "$enableval" in
no) mask_real_errno=no ;;
*) mask_real_errno=yes ;;
esac
-else
+else $as_nop
mask_real_errno=yes
fi
# Check whether --enable-ei-dynamic-lib was given.
-if test "${enable_ei_dynamic_lib+set}" = set; then :
+if test ${enable_ei_dynamic_lib+y}
+then :
enableval=$enable_ei_dynamic_lib; case "$enableval" in
yes) DYNAMIC_LIB=yes ;;
*) DYNAMIC_LIB=no ;;
esac
-else
+else $as_nop
DYNAMIC_LIB=no
fi
+
+
+
+
+
+
+
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2568,11 +3130,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2580,11 +3143,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2595,11 +3162,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2608,11 +3175,12 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2620,11 +3188,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2635,11 +3207,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -2647,8 +3219,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2661,11 +3233,12 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2673,11 +3246,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2688,11 +3265,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2701,11 +3278,12 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2714,15 +3292,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2738,18 +3320,18 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2760,11 +3342,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2772,11 +3355,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2787,11 +3374,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2804,11 +3391,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2816,11 +3404,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2831,11 +3423,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2847,34 +3439,138 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
fi
+else
+ CC="$ac_cv_prog_CC"
fi
fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -2884,7 +3580,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -2892,7 +3588,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -2904,9 +3600,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -2927,11 +3623,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
@@ -2948,7 +3645,7 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
@@ -2964,44 +3661,46 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
+else $as_nop
ac_file=''
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -3015,15 +3714,15 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -3032,7 +3731,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
@@ -3044,8 +3743,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -3053,10 +3752,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -3064,39 +3763,40 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3110,11 +3810,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -3123,31 +3824,32 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3157,29 +3859,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
@@ -3188,57 +3894,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
+else $as_nop
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -3253,94 +3962,144 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
-
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
fi
ac_ext=c
@@ -3354,40 +4113,36 @@ ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
do
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
-else
+else $as_nop
# Broken: fails on valid input.
continue
fi
@@ -3399,10 +4154,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
+else $as_nop
# Passes both tests.
ac_preproc_ok=:
break
@@ -3412,7 +4168,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
break
fi
@@ -3424,29 +4181,24 @@ fi
else
ac_cv_prog_CPP=$CPP
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
-else
+else $as_nop
# Broken: fails on valid input.
continue
fi
@@ -3458,10 +4210,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
+else $as_nop
# Passes both tests.
ac_preproc_ok=:
break
@@ -3471,11 +4224,12 @@ rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -3486,14 +4240,157 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+ then ac_cv_path_EGREP="$GREP -E"
+ else
+ if test -z "$EGREP"; then
+ ac_path_EGREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_EGREP" || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+ # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
+ "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_EGREP="$ac_path_EGREP"
+ ac_path_EGREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_EGREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_EGREP"; then
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_EGREP=$EGREP
+fi
+
+ fi
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
@@ -3501,11 +4398,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3516,11 +4417,11 @@ fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3529,11 +4430,12 @@ if test -z "$ac_cv_prog_RANLIB"; then
ac_ct_RANLIB=$RANLIB
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_RANLIB"; then
ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
@@ -3541,11 +4443,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3556,11 +4462,11 @@ fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_RANLIB" = x; then
@@ -3568,8 +4474,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
RANLIB=$ac_ct_RANLIB
@@ -3582,11 +4488,12 @@ for ac_prog in ld.sh
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$LD"; then
ac_cv_prog_LD="$LD" # Let the user override the test.
else
@@ -3594,11 +4501,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_LD="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3609,11 +4520,11 @@ fi
fi
LD=$ac_cv_prog_LD
if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3623,11 +4534,12 @@ done
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$LD"; then
ac_cv_prog_LD="$LD" # Let the user override the test.
else
@@ -3635,11 +4547,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_LD="${ac_tool_prefix}ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3650,11 +4566,11 @@ fi
fi
LD=$ac_cv_prog_LD
if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3663,11 +4579,12 @@ if test -z "$ac_cv_prog_LD"; then
ac_ct_LD=$LD
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_LD"; then
ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test.
else
@@ -3675,11 +4592,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_LD="ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3690,11 +4611,11 @@ fi
fi
ac_ct_LD=$ac_cv_prog_ac_ct_LD
if test -n "$ac_ct_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5
-$as_echo "$ac_ct_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5
+printf "%s\n" "$ac_ct_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_LD" = x; then
@@ -3702,8 +4623,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
LD=$ac_ct_LD
@@ -3715,281 +4636,52 @@ fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
+done
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-fi
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-fi
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
fi
-
-done
-
-
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if ${ac_cv_sizeof_short+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+printf %s "checking size of short... " >&6; }
+if test ${ac_cv_sizeof_short+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_short" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (short)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -3998,31 +4690,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
+printf "%s\n" "$ac_cv_sizeof_short" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
-_ACEOF
+printf "%s\n" "#define SIZEOF_SHORT $ac_cv_sizeof_short" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if ${ac_cv_sizeof_int+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+printf %s "checking size of int... " >&6; }
+if test ${ac_cv_sizeof_int+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_int" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (int)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -4031,31 +4723,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+printf "%s\n" "$ac_cv_sizeof_int" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
-_ACEOF
+printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if ${ac_cv_sizeof_long+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+printf %s "checking size of long... " >&6; }
+if test ${ac_cv_sizeof_long+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -4064,31 +4756,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+printf "%s\n" "$ac_cv_sizeof_long" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
+printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -4097,31 +4789,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
-$as_echo_n "checking size of long long... " >&6; }
-if ${ac_cv_sizeof_long_long+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+printf %s "checking size of long long... " >&6; }
+if test ${ac_cv_sizeof_long_long+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_long_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long long)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -4130,20 +4822,18 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
-$as_echo "$ac_cv_sizeof_long_long" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+printf "%s\n" "$ac_cv_sizeof_long_long" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
-_ACEOF
+printf "%s\n" "#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long" >>confdefs.h
if test $mask_real_errno = yes; then
-$as_echo "#define EI_HIDE_REAL_ERRNO 1" >>confdefs.h
+printf "%s\n" "#define EI_HIDE_REAL_ERRNO 1" >>confdefs.h
fi
@@ -4152,8 +4842,8 @@ if test $ac_cv_sizeof_long = 8; then
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking target hardware architecture" >&5
-$as_echo_n "checking target hardware architecture... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target hardware architecture" >&5
+printf %s "checking target hardware architecture... " >&6; }
if test "x$host_alias" != "x" -a "x$host_cpu" != "x"; then
chk_arch_=$host_cpu
else
@@ -4195,80 +4885,81 @@ $as_echo_n "checking target hardware architecture... " >&6; }
e2k) ARCH=e2k;;
*) ARCH=noarch;;
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ARCH" >&5
-$as_echo "$ARCH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ARCH" >&5
+printf "%s\n" "$ARCH" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether compilation mode forces ARCH adjustment" >&5
-$as_echo_n "checking whether compilation mode forces ARCH adjustment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether compilation mode forces ARCH adjustment" >&5
+printf %s "checking whether compilation mode forces ARCH adjustment... " >&6; }
case "$ARCH-$ac_cv_sizeof_void_p" in
x86-8)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=x86 to ARCH=amd64" >&5
-$as_echo "yes: adjusting ARCH=x86 to ARCH=amd64" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=x86 to ARCH=amd64" >&5
+printf "%s\n" "yes: adjusting ARCH=x86 to ARCH=amd64" >&6; }
ARCH=amd64
;;
amd64-4)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=amd64 to ARCH=x86" >&5
-$as_echo "yes: adjusting ARCH=amd64 to ARCH=x86" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=amd64 to ARCH=x86" >&5
+printf "%s\n" "yes: adjusting ARCH=amd64 to ARCH=x86" >&6; }
ARCH=x86
;;
ultrasparc-8)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=ultrasparc to ARCH=sparc64" >&5
-$as_echo "yes: adjusting ARCH=ultrasparc to ARCH=sparc64" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=ultrasparc to ARCH=sparc64" >&5
+printf "%s\n" "yes: adjusting ARCH=ultrasparc to ARCH=sparc64" >&6; }
ARCH=sparc64
;;
sparc64-4)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=sparc64 to ARCH=ultrasparc" >&5
-$as_echo "yes: adjusting ARCH=sparc64 to ARCH=ultrasparc" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=sparc64 to ARCH=ultrasparc" >&5
+printf "%s\n" "yes: adjusting ARCH=sparc64 to ARCH=ultrasparc" >&6; }
ARCH=ultrasparc
;;
ppc64-4)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=ppc64 to ARCH=ppc" >&5
-$as_echo "yes: adjusting ARCH=ppc64 to ARCH=ppc" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=ppc64 to ARCH=ppc" >&5
+printf "%s\n" "yes: adjusting ARCH=ppc64 to ARCH=ppc" >&6; }
ARCH=ppc
;;
ppc-8)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=ppc to ARCH=ppc64" >&5
-$as_echo "yes: adjusting ARCH=ppc to ARCH=ppc64" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=ppc to ARCH=ppc64" >&5
+printf "%s\n" "yes: adjusting ARCH=ppc to ARCH=ppc64" >&6; }
ARCH=ppc64
;;
arm-8)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=arm to ARCH=arm64" >&5
-$as_echo "yes: adjusting ARCH=arm to ARCH=arm64" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: adjusting ARCH=arm to ARCH=arm64" >&5
+printf "%s\n" "yes: adjusting ARCH=arm to ARCH=arm64" >&6; }
ARCH=arm64
;;
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no: ARCH is $ARCH" >&5
-$as_echo "no: ARCH is $ARCH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no: ARCH is $ARCH" >&5
+printf "%s\n" "no: ARCH is $ARCH" >&6; }
;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for unaligned word access" >&5
-$as_echo_n "checking for unaligned word access... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for unaligned word access" >&5
+printf %s "checking for unaligned word access... " >&6; }
case "$ARCH" in
x86|amd64)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes: x86 or amd64" >&5
-$as_echo "yes: x86 or amd64" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: x86 or amd64" >&5
+printf "%s\n" "yes: x86 or amd64" >&6; }
-$as_echo "#define HAVE_UNALIGNED_WORD_ACCESS 1" >>confdefs.h
+printf "%s\n" "#define HAVE_UNALIGNED_WORD_ACCESS 1" >>confdefs.h
;;
*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
;;
esac
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$AR"; then
ac_cv_prog_AR="$AR" # Let the user override the test.
else
@@ -4276,11 +4967,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_AR="${ac_tool_prefix}ar"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4291,11 +4986,11 @@ fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
-$as_echo "$AR" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+printf "%s\n" "$AR" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4304,11 +4999,12 @@ if test -z "$ac_cv_prog_AR"; then
ac_ct_AR=$AR
# Extract the first word of "ar", so it can be a program name with args.
set dummy ar; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_AR+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_AR+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_AR"; then
ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
@@ -4316,11 +5012,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_AR="ar"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4331,11 +5031,11 @@ fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
-$as_echo "$ac_ct_AR" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+printf "%s\n" "$ac_ct_AR" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_AR" = x; then
@@ -4343,8 +5043,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
AR=$ac_ct_AR
@@ -4367,7 +5067,8 @@ case $host in
;;
esac
-# Find a good install program. We prefer a C program (faster),
+
+ # Find a good install program. We prefer a C program (faster),
# so one script is as good as another. But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
@@ -4381,20 +5082,25 @@ esac
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
-$as_echo_n "checking for a BSD-compatible install... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+printf %s "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
-if ${ac_cv_path_install+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test ${ac_cv_path_install+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in #((
- ./ | .// | /[cC]/* | \
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ # Account for fact that we put trailing slashes in our PATH walk.
+case $as_dir in #((
+ ./ | /[cC]/* | \
/etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
/usr/ucb/* ) ;;
@@ -4404,13 +5110,13 @@ case $as_dir/ in #((
# by default.
for ac_prog in ginstall scoinst install; do
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then
if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# AIX install. It has an incompatible calling convention.
:
elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
# program-specific install script used by HP pwplus--don't use.
:
else
@@ -4418,12 +5124,12 @@ case $as_dir/ in #((
echo one > conftest.one
echo two > conftest.two
mkdir conftest.dir
- if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+ if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" &&
test -s conftest.one && test -s conftest.two &&
test -s conftest.dir/conftest.one &&
test -s conftest.dir/conftest.two
then
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c"
break 3
fi
fi
@@ -4439,7 +5145,7 @@ IFS=$as_save_IFS
rm -rf conftest.one conftest.two conftest.dir
fi
- if test "${ac_cv_path_install+set}" = set; then
+ if test ${ac_cv_path_install+y}; then
INSTALL=$ac_cv_path_install
else
# As a last resort, use the slow shell script. Don't cache a
@@ -4449,8 +5155,8 @@ fi
INSTALL=$ac_install_sh
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
-$as_echo "$INSTALL" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+printf "%s\n" "$INSTALL" >&6; }
# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
@@ -4460,11 +5166,12 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a directory including parents" >&5
-$as_echo_n "checking how to create a directory including parents... " >&6; }
-if ${ac_cv_prog_mkdir_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to create a directory including parents" >&5
+printf %s "checking how to create a directory including parents... " >&6; }
+if test ${ac_cv_prog_mkdir_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
temp_name_base=config.$$
temp_name=$temp_name_base/x/y/z
@@ -4481,8 +5188,8 @@ fi
rm -fr $temp_name_base
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_mkdir_p" >&5
-$as_echo "$ac_cv_prog_mkdir_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_mkdir_p" >&5
+printf "%s\n" "$ac_cv_prog_mkdir_p" >&6; }
case "${ac_cv_prog_mkdir_p}" in
none) as_fn_error $? "don't know how create directories with parents" "$LINENO" 5 ;;
@@ -4499,393 +5206,395 @@ case $host_os in
esac
# Checks for libraries.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
-$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
-if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lnsl $LIBS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5
+printf %s "checking for library containing gethostbyname... " >&6; }
+if test ${ac_cv_search_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char gethostbyname ();
int
-main ()
+main (void)
{
return gethostbyname ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_nsl_gethostbyname=yes
-else
- ac_cv_lib_nsl_gethostbyname=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+for ac_lib in '' nsl
+do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_search_gethostbyname=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_gethostbyname+y}
+then :
+ break
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
-$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
-if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBNSL 1
-_ACEOF
+done
+if test ${ac_cv_search_gethostbyname+y}
+then :
- LIBS="-lnsl $LIBS"
+else $as_nop
+ ac_cv_search_gethostbyname=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5
+printf "%s\n" "$ac_cv_search_gethostbyname" >&6; }
+ac_res=$ac_cv_search_gethostbyname
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for getpeername in -lsocket" >&5
-$as_echo_n "checking for getpeername in -lsocket... " >&6; }
-if ${ac_cv_lib_socket_getpeername+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsocket $LIBS"
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing getpeername" >&5
+printf %s "checking for library containing getpeername... " >&6; }
+if test ${ac_cv_search_getpeername+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char getpeername ();
int
-main ()
+main (void)
{
return getpeername ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_socket_getpeername=yes
-else
- ac_cv_lib_socket_getpeername=no
-fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
+for ac_lib in '' socket
+do
+ if test -z "$ac_lib"; then
+ ac_res="none required"
+ else
+ ac_res=-l$ac_lib
+ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
+ fi
+ if ac_fn_c_try_link "$LINENO"
+then :
+ ac_cv_search_getpeername=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
+ conftest$ac_exeext
+ if test ${ac_cv_search_getpeername+y}
+then :
+ break
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_getpeername" >&5
-$as_echo "$ac_cv_lib_socket_getpeername" >&6; }
-if test "x$ac_cv_lib_socket_getpeername" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBSOCKET 1
-_ACEOF
+done
+if test ${ac_cv_search_getpeername+y}
+then :
- LIBS="-lsocket $LIBS"
+else $as_nop
+ ac_cv_search_getpeername=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_getpeername" >&5
+printf "%s\n" "$ac_cv_search_getpeername" >&6; }
+ac_res=$ac_cv_search_getpeername
+if test "$ac_res" != no
+then :
+ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
fi
# Checks for header files.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
+printf %s "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
+if test ${ac_cv_header_sys_wait_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
int
-main ()
+main (void)
{
-
+ int s;
+ wait (&s);
+ s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_header_sys_wait_h=yes
+else $as_nop
+ ac_cv_header_sys_wait_h=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f conftest*
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
+printf "%s\n" "$ac_cv_header_sys_wait_h" >&6; }
+if test $ac_cv_header_sys_wait_h = yes; then
-fi
+printf "%s\n" "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
+fi
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
+ac_fn_c_check_header_compile "$LINENO" "arpa/inet.h" "ac_cv_header_arpa_inet_h" "$ac_includes_default"
+if test "x$ac_cv_header_arpa_inet_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_ARPA_INET_H 1" >>confdefs.h
-else
- ac_cv_header_stdc=no
fi
-rm -f conftest*
+ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default"
+if test "x$ac_cv_header_fcntl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default"
+if test "x$ac_cv_header_limits_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIMITS_H 1" >>confdefs.h
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
+ac_fn_c_check_header_compile "$LINENO" "malloc.h" "ac_cv_header_malloc_h" "$ac_includes_default"
+if test "x$ac_cv_header_malloc_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_MALLOC_H 1" >>confdefs.h
+
fi
+ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_netdb_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NETDB_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "netinet/in.h" "ac_cv_header_netinet_in_h" "$ac_includes_default"
+if test "x$ac_cv_header_netinet_in_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NETINET_IN_H 1" >>confdefs.h
+
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
+ac_fn_c_check_header_compile "$LINENO" "stddef.h" "ac_cv_header_stddef_h" "$ac_includes_default"
+if test "x$ac_cv_header_stddef_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDDEF_H 1" >>confdefs.h
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+fi
+ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
+if test "x$ac_cv_header_string_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5
-$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; }
-if ${ac_cv_header_sys_wait_h+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <sys/types.h>
-#include <sys/wait.h>
-#ifndef WEXITSTATUS
-# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)
-#endif
-#ifndef WIFEXITED
-# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
-#endif
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_param_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_PARAM_H 1" >>confdefs.h
-int
-main ()
-{
- int s;
- wait (&s);
- s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_sys_wait_h=yes
-else
- ac_cv_header_sys_wait_h=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_socket_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h
+
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5
-$as_echo "$ac_cv_header_sys_wait_h" >&6; }
-if test $ac_cv_header_sys_wait_h = yes; then
+ac_fn_c_check_header_compile "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_select_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SELECT_H 1" >>confdefs.h
-$as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_time_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
+if test "x$ac_cv_header_unistd_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNISTD_H 1" >>confdefs.h
-for ac_header in arpa/inet.h fcntl.h limits.h malloc.h netdb.h netinet/in.h stddef.h stdlib.h string.h sys/param.h sys/socket.h sys/select.h sys/time.h unistd.h sys/types.h sys/uio.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/types.h" "ac_cv_header_sys_types_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_types_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TYPES_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "sys/uio.h" "ac_cv_header_sys_uio_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_uio_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_UIO_H 1" >>confdefs.h
-done
+fi
# Checks for typedefs, structures, and compiler characteristics.
# fixme AC_C_CONST & AC_C_VOLATILE needed for Windows?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
-$as_echo_n "checking for uid_t in sys/types.h... " >&6; }
-if ${ac_cv_type_uid_t+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5
+printf %s "checking for uid_t in sys/types.h... " >&6; }
+if test ${ac_cv_type_uid_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "uid_t" >/dev/null 2>&1; then :
+ $EGREP "uid_t" >/dev/null 2>&1
+then :
ac_cv_type_uid_t=yes
-else
+else $as_nop
ac_cv_type_uid_t=no
fi
-rm -f conftest*
+rm -rf conftest*
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
-$as_echo "$ac_cv_type_uid_t" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5
+printf "%s\n" "$ac_cv_type_uid_t" >&6; }
if test $ac_cv_type_uid_t = no; then
-$as_echo "#define uid_t int" >>confdefs.h
-
-
-$as_echo "#define gid_t int" >>confdefs.h
-
-fi
-
-ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
-if test "x$ac_cv_type_pid_t" = xyes; then :
+printf "%s\n" "#define uid_t int" >>confdefs.h
-else
-cat >>confdefs.h <<_ACEOF
-#define pid_t int
-_ACEOF
+printf "%s\n" "#define gid_t int" >>confdefs.h
fi
-ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
-else
-
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
-
-fi
+ ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default
+"
+if test "x$ac_cv_type_pid_t" = xyes
+then :
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5
-$as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; }
-if ${ac_cv_header_time+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <sys/types.h>
-#include <sys/time.h>
-#include <time.h>
+
+ #if defined _WIN64 && !defined __CYGWIN__
+ LLP64
+ #endif
int
-main ()
+main (void)
{
-if ((struct tm *) 0)
-return 0;
+
;
return 0;
}
+
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_time=yes
-else
- ac_cv_header_time=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_pid_type='int'
+else $as_nop
+ ac_pid_type='__int64'
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+
+printf "%s\n" "#define pid_t $ac_pid_type" >>confdefs.h
+
+
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5
-$as_echo "$ac_cv_header_time" >&6; }
-if test $ac_cv_header_time = yes; then
-$as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h
+
+ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
+if test "x$ac_cv_type_size_t" = xyes
+then :
+
+else $as_nop
+
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for socklen_t usability" >&5
-$as_echo_n "checking for socklen_t usability... " >&6; }
+
+
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socklen_t usability" >&5
+printf %s "checking for socklen_t usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <sys/types.h>
#include <sys/socket.h>
int
-main ()
+main (void)
{
socklen_t mylen;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+if ac_fn_c_try_compile "$LINENO"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
-$as_echo "#define HAVE_SOCKLEN_T /**/" >>confdefs.h
+printf "%s\n" "#define HAVE_SOCKLEN_T /**/" >>confdefs.h
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Checks for library functions.
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
-$as_echo_n "checking for working alloca.h... " >&6; }
-if ${ac_cv_working_alloca_h+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5
+printf %s "checking for working alloca.h... " >&6; }
+if test ${ac_cv_working_alloca_h+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <alloca.h>
int
-main ()
+main (void)
{
char *p = (char *) alloca (2 * sizeof (int));
if (p) return 0;
@@ -4893,52 +5602,52 @@ char *p = (char *) alloca (2 * sizeof (int));
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_working_alloca_h=yes
-else
+else $as_nop
ac_cv_working_alloca_h=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
-$as_echo "$ac_cv_working_alloca_h" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5
+printf "%s\n" "$ac_cv_working_alloca_h" >&6; }
if test $ac_cv_working_alloca_h = yes; then
-$as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_ALLOCA_H 1" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
-$as_echo_n "checking for alloca... " >&6; }
-if ${ac_cv_func_alloca_works+:} false; then :
- $as_echo_n "(cached) " >&6
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5
+printf %s "checking for alloca... " >&6; }
+if test ${ac_cv_func_alloca_works+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test $ac_cv_working_alloca_h = yes; then
+ ac_cv_func_alloca_works=yes
else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __GNUC__
-# define alloca __builtin_alloca
-#else
-# ifdef _MSC_VER
+#include <stdlib.h>
+#include <stddef.h>
+#ifndef alloca
+# ifdef __GNUC__
+# define alloca __builtin_alloca
+# elif defined _MSC_VER
# include <malloc.h>
# define alloca _alloca
# else
-# ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-# else
-# ifdef _AIX
- #pragma alloca
-# else
-# ifndef alloca /* predefined by HP cc +Olibcalls */
-void *alloca (size_t);
-# endif
-# endif
+# ifdef __cplusplus
+extern "C"
# endif
+void *alloca (size_t);
# endif
#endif
int
-main ()
+main (void)
{
char *p = (char *) alloca (1);
if (p) return 0;
@@ -4946,20 +5655,22 @@ char *p = (char *) alloca (1);
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_func_alloca_works=yes
-else
+else $as_nop
ac_cv_func_alloca_works=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
-$as_echo "$ac_cv_func_alloca_works" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5
+printf "%s\n" "$ac_cv_func_alloca_works" >&6; }
+fi
if test $ac_cv_func_alloca_works = yes; then
-$as_echo "#define HAVE_ALLOCA 1" >>confdefs.h
+printf "%s\n" "#define HAVE_ALLOCA 1" >>confdefs.h
else
# The SVR3 libPW and SVR4 libucb both contain incompatible functions
@@ -4969,58 +5680,19 @@ else
ALLOCA=\${LIBOBJDIR}alloca.$ac_objext
-$as_echo "#define C_ALLOCA 1" >>confdefs.h
+printf "%s\n" "#define C_ALLOCA 1" >>confdefs.h
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5
-$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
-if ${ac_cv_os_cray+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#if defined CRAY && ! defined CRAY2
-webecray
-#else
-wenotbecray
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "webecray" >/dev/null 2>&1; then :
- ac_cv_os_cray=yes
-else
- ac_cv_os_cray=no
-fi
-rm -f conftest*
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5
-$as_echo "$ac_cv_os_cray" >&6; }
-if test $ac_cv_os_cray = yes; then
- for ac_func in _getb67 GETB67 getb67; do
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
-
-cat >>confdefs.h <<_ACEOF
-#define CRAY_STACKSEG_END $ac_func
-_ACEOF
-
- break
-fi
-
- done
-fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
-$as_echo_n "checking stack direction for C alloca... " >&6; }
-if ${ac_cv_c_stack_direction+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5
+printf %s "checking stack direction for C alloca... " >&6; }
+if test ${ac_cv_c_stack_direction+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
ac_cv_c_stack_direction=0
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
@@ -5041,9 +5713,10 @@ main (int argc, char **argv)
return find_stack_direction (0, argc + !argv + 20) < 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
ac_cv_c_stack_direction=1
-else
+else $as_nop
ac_cv_c_stack_direction=-1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -5051,22 +5724,21 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
-$as_echo "$ac_cv_c_stack_direction" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define STACK_DIRECTION $ac_cv_c_stack_direction
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5
+printf "%s\n" "$ac_cv_c_stack_direction" >&6; }
+printf "%s\n" "#define STACK_DIRECTION $ac_cv_c_stack_direction" >>confdefs.h
fi
# FIXME check that this isn't set in normal cases
if test $ac_cv_c_compiler_gnu = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5
-$as_echo_n "checking whether $CC needs -traditional... " >&6; }
-if ${ac_cv_prog_gcc_traditional+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5
+printf %s "checking whether $CC needs -traditional... " >&6; }
+if test ${ac_cv_prog_gcc_traditional+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_pattern="Autoconf.*'x'"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
@@ -5074,12 +5746,13 @@ else
Autoconf TIOCGETP
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "$ac_pattern" >/dev/null 2>&1; then :
+ $EGREP "$ac_pattern" >/dev/null 2>&1
+then :
ac_cv_prog_gcc_traditional=yes
-else
+else $as_nop
ac_cv_prog_gcc_traditional=no
fi
-rm -f conftest*
+rm -rf conftest*
if test $ac_cv_prog_gcc_traditional = no; then
@@ -5089,34 +5762,37 @@ rm -f conftest*
Autoconf TCGETA
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "$ac_pattern" >/dev/null 2>&1; then :
+ $EGREP "$ac_pattern" >/dev/null 2>&1
+then :
ac_cv_prog_gcc_traditional=yes
fi
-rm -f conftest*
+rm -rf conftest*
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5
-$as_echo "$ac_cv_prog_gcc_traditional" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5
+printf "%s\n" "$ac_cv_prog_gcc_traditional" >&6; }
if test $ac_cv_prog_gcc_traditional = yes; then
CC="$CC -traditional"
fi
fi
# Check if malloc(0) is ok
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5
-$as_echo_n "checking for working memcmp... " >&6; }
-if ${ac_cv_func_memcmp_working+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test "$cross_compiling" = yes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working memcmp" >&5
+printf %s "checking for working memcmp... " >&6; }
+if test ${ac_cv_func_memcmp_working+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "$cross_compiling" = yes
+then :
ac_cv_func_memcmp_working=no
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$ac_includes_default
int
-main ()
+main (void)
{
/* Some versions of memcmp are not 8-bit clean. */
@@ -5147,9 +5823,10 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
ac_cv_func_memcmp_working=yes
-else
+else $as_nop
ac_cv_func_memcmp_working=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -5157,8 +5834,8 @@ rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5
-$as_echo "$ac_cv_func_memcmp_working" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working" >&5
+printf "%s\n" "$ac_cv_func_memcmp_working" >&6; }
test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in
*" memcmp.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS memcmp.$ac_objext"
@@ -5166,31 +5843,145 @@ test $ac_cv_func_memcmp_working = no && case " $LIBOBJS " in
esac
-for ac_func in dup2 gethostbyaddr gethostbyname \
- gethostbyaddr_r \
- gethostbyname_r gethostname writev \
- gethrtime gettimeofday inet_ntoa memchr memmove memset select \
- socket strchr strerror strrchr strstr uname sysconf
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
+
+ac_fn_c_check_func "$LINENO" "dup2" "ac_cv_func_dup2"
+if test "x$ac_cv_func_dup2" = xyes
+then :
+ printf "%s\n" "#define HAVE_DUP2 1" >>confdefs.h
fi
-done
+ac_fn_c_check_func "$LINENO" "gethostbyaddr" "ac_cv_func_gethostbyaddr"
+if test "x$ac_cv_func_gethostbyaddr" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHOSTBYADDR 1" >>confdefs.h
-ac_fn_c_check_func "$LINENO" "res_gethostbyname" "ac_cv_func_res_gethostbyname"
-if test "x$ac_cv_func_res_gethostbyname" = xyes; then :
+fi
+ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
+if test "x$ac_cv_func_gethostbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHOSTBYNAME 1" >>confdefs.h
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_gethostbyname in -lresolv" >&5
-$as_echo_n "checking for res_gethostbyname in -lresolv... " >&6; }
-if ${ac_cv_lib_resolv_res_gethostbyname+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+fi
+ac_fn_c_check_func "$LINENO" "gethostbyaddr_r" "ac_cv_func_gethostbyaddr_r"
+if test "x$ac_cv_func_gethostbyaddr_r" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHOSTBYADDR_R 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "gethostbyname_r" "ac_cv_func_gethostbyname_r"
+if test "x$ac_cv_func_gethostbyname_r" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHOSTBYNAME_R 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "gethostname" "ac_cv_func_gethostname"
+if test "x$ac_cv_func_gethostname" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHOSTNAME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "writev" "ac_cv_func_writev"
+if test "x$ac_cv_func_writev" = xyes
+then :
+ printf "%s\n" "#define HAVE_WRITEV 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "gethrtime" "ac_cv_func_gethrtime"
+if test "x$ac_cv_func_gethrtime" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETHRTIME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "gettimeofday" "ac_cv_func_gettimeofday"
+if test "x$ac_cv_func_gettimeofday" = xyes
+then :
+ printf "%s\n" "#define HAVE_GETTIMEOFDAY 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "inet_ntoa" "ac_cv_func_inet_ntoa"
+if test "x$ac_cv_func_inet_ntoa" = xyes
+then :
+ printf "%s\n" "#define HAVE_INET_NTOA 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "memchr" "ac_cv_func_memchr"
+if test "x$ac_cv_func_memchr" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMCHR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "memmove" "ac_cv_func_memmove"
+if test "x$ac_cv_func_memmove" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMMOVE 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset"
+if test "x$ac_cv_func_memset" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMSET 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "select" "ac_cv_func_select"
+if test "x$ac_cv_func_select" = xyes
+then :
+ printf "%s\n" "#define HAVE_SELECT 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket"
+if test "x$ac_cv_func_socket" = xyes
+then :
+ printf "%s\n" "#define HAVE_SOCKET 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strchr" "ac_cv_func_strchr"
+if test "x$ac_cv_func_strchr" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRCHR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strerror" "ac_cv_func_strerror"
+if test "x$ac_cv_func_strerror" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRERROR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strrchr" "ac_cv_func_strrchr"
+if test "x$ac_cv_func_strrchr" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRRCHR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "strstr" "ac_cv_func_strstr"
+if test "x$ac_cv_func_strstr" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRSTR 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "uname" "ac_cv_func_uname"
+if test "x$ac_cv_func_uname" = xyes
+then :
+ printf "%s\n" "#define HAVE_UNAME 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "sysconf" "ac_cv_func_sysconf"
+if test "x$ac_cv_func_sysconf" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYSCONF 1" >>confdefs.h
+
+fi
+
+ac_fn_c_check_func "$LINENO" "res_gethostbyname" "ac_cv_func_res_gethostbyname"
+if test "x$ac_cv_func_res_gethostbyname" = xyes
+then :
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for res_gethostbyname in -lresolv" >&5
+printf %s "checking for res_gethostbyname in -lresolv... " >&6; }
+if test ${ac_cv_lib_resolv_res_gethostbyname+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lresolv $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5199,33 +5990,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char res_gethostbyname ();
int
-main ()
+main (void)
{
return res_gethostbyname ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_resolv_res_gethostbyname=yes
-else
+else $as_nop
ac_cv_lib_resolv_res_gethostbyname=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_gethostbyname" >&5
-$as_echo "$ac_cv_lib_resolv_res_gethostbyname" >&6; }
-if test "x$ac_cv_lib_resolv_res_gethostbyname" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBRESOLV 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_gethostbyname" >&5
+printf "%s\n" "$ac_cv_lib_resolv_res_gethostbyname" >&6; }
+if test "x$ac_cv_lib_resolv_res_gethostbyname" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBRESOLV 1" >>confdefs.h
LIBS="-lresolv $LIBS"
@@ -5235,14 +6023,16 @@ fi
fi
ac_fn_c_check_func "$LINENO" "clock_gettime" "ac_cv_func_clock_gettime"
-if test "x$ac_cv_func_clock_gettime" = xyes; then :
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
-$as_echo_n "checking for clock_gettime in -lrt... " >&6; }
-if ${ac_cv_lib_rt_clock_gettime+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test "x$ac_cv_func_clock_gettime" = xyes
+then :
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
+printf %s "checking for clock_gettime in -lrt... " >&6; }
+if test ${ac_cv_lib_rt_clock_gettime+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5251,33 +6041,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char clock_gettime ();
int
-main ()
+main (void)
{
return clock_gettime ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_rt_clock_gettime=yes
-else
+else $as_nop
ac_cv_lib_rt_clock_gettime=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
-$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
-if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBRT 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
+printf "%s\n" "$ac_cv_lib_rt_clock_gettime" >&6; }
+if test "x$ac_cv_lib_rt_clock_gettime" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBRT 1" >>confdefs.h
LIBS="-lrt $LIBS"
@@ -5294,7 +6081,8 @@ fi
# Check whether --with-gmp was given.
-if test "${with_gmp+set}" = set; then :
+if test ${with_gmp+y}
+then :
withval=$with_gmp;
fi
@@ -5302,21 +6090,23 @@ fi
# We don't just want any GNU MP version, we want 4.1 or later
# that contain the import/export functions we need.
-if test "x$with_gmp" = "xyes" ;then
+if test "x$with_gmp" = "xyes"
+then :
+
for dir in /usr /usr/pkg /usr/local /usr/local/gmp /usr/lib/gmp /usr/gmp; do
- as_ac_Header=`$as_echo "ac_cv_header_$dir/include/gmp.h" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$dir/include/gmp.h" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ as_ac_Header=`printf "%s\n" "ac_cv_header_$dir/include/gmp.h" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$dir/include/gmp.h" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
ac_cv_gmp=yes
-else
+else $as_nop
ac_cv_gmp=no
fi
-
if test $ac_cv_gmp = yes ; then
CFLAGS="$CFLAGS -I$dir/include -L$dir/lib"
-$as_echo "#define HAVE_GMP_H /**/" >>confdefs.h
+printf "%s\n" "#define HAVE_GMP_H /**/" >>confdefs.h
break
fi
@@ -5324,11 +6114,12 @@ $as_echo "#define HAVE_GMP_H /**/" >>confdefs.h
if test $ac_cv_gmp = no ; then
as_fn_error $? "No GNU MP installation found" "$LINENO" 5
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_export in -lgmp" >&5
-$as_echo_n "checking for __gmpz_export in -lgmp... " >&6; }
-if ${ac_cv_lib_gmp___gmpz_export+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __gmpz_export in -lgmp" >&5
+printf %s "checking for __gmpz_export in -lgmp... " >&6; }
+if test ${ac_cv_lib_gmp___gmpz_export+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lgmp $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5337,33 +6128,30 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char __gmpz_export ();
int
-main ()
+main (void)
{
return __gmpz_export ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_gmp___gmpz_export=yes
-else
+else $as_nop
ac_cv_lib_gmp___gmpz_export=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_export" >&5
-$as_echo "$ac_cv_lib_gmp___gmpz_export" >&6; }
-if test "x$ac_cv_lib_gmp___gmpz_export" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBGMP 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_export" >&5
+printf "%s\n" "$ac_cv_lib_gmp___gmpz_export" >&6; }
+if test "x$ac_cv_lib_gmp___gmpz_export" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBGMP 1" >>confdefs.h
LIBS="-lgmp $LIBS"
@@ -5372,22 +6160,23 @@ fi
# FIXME return ERROR if no lib
elif test "x$with_gmp" != "xno" -a -n "$with_gmp" ;then
# Option given with PATH to package
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU MP" >&5
-$as_echo_n "checking for GNU MP... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU MP" >&5
+printf %s "checking for GNU MP... " >&6; }
if test ! -d "$with_gmp" ; then
as_fn_error $? "Invalid path to option --with-gmp=PATH" "$LINENO" 5
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CFLAGS="$CFLAGS -I$with_gmp/include -L$with_gmp/lib"
-$as_echo "#define HAVE_GMP_H /**/" >>confdefs.h
+printf "%s\n" "#define HAVE_GMP_H /**/" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __gmpz_export in -lgmp" >&5
-$as_echo_n "checking for __gmpz_export in -lgmp... " >&6; }
-if ${ac_cv_lib_gmp___gmpz_export+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __gmpz_export in -lgmp" >&5
+printf %s "checking for __gmpz_export in -lgmp... " >&6; }
+if test ${ac_cv_lib_gmp___gmpz_export+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lgmp $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5396,39 +6185,37 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char __gmpz_export ();
int
-main ()
+main (void)
{
return __gmpz_export ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_gmp___gmpz_export=yes
-else
+else $as_nop
ac_cv_lib_gmp___gmpz_export=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_export" >&5
-$as_echo "$ac_cv_lib_gmp___gmpz_export" >&6; }
-if test "x$ac_cv_lib_gmp___gmpz_export" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBGMP 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp___gmpz_export" >&5
+printf "%s\n" "$ac_cv_lib_gmp___gmpz_export" >&6; }
+if test "x$ac_cv_lib_gmp___gmpz_export" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBGMP 1" >>confdefs.h
LIBS="-lgmp $LIBS"
fi
# FIXME return ERROR if no lib
+
fi
@@ -5442,111 +6229,111 @@ MIXED_VSL=no
MIXED_VC=no
MIXED_MINGW=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
-$as_echo_n "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
+printf %s "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" != "xyes"; then
if test -x /usr/bin/msys-?.0.dll; then
CFLAGS="$CFLAGS -O2"
MIXED_MSYS=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
-$as_echo "MSYS and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
+printf "%s\n" "MSYS and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
MIXED_CYGWIN=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
-$as_echo "Cygwin and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
+printf "%s\n" "Cygwin and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /bin/wslpath; then
CFLAGS="$CFLAGS -O2"
MIXED_WSL=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
-$as_echo "WSL and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
+printf "%s\n" "WSL and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not within any known env" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$MIXED_MSYS" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
-$as_echo_n "checking for mixed cygwin and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
+printf %s "checking for mixed cygwin and native MinGW environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" = x"yes"; then
if test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with cygwin" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
-$as_echo_n "checking for mixed MSYS and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
+printf %s "checking for mixed MSYS and native MinGW environment... " >&6; }
if test "x$GCC" = x"yes"; then
if test -x /usr/bin/msys-=.0.dll; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with msys" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
-$as_echo_n "checking if we mix cygwin with any native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
+printf %s "checking if we mix cygwin with any native compiler... " >&6; }
if test "X$MIXED_CYGWIN" = "Xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
-$as_echo_n "checking if we mix msys with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
+printf %s "checking if we mix msys with another native compiler... " >&6; }
if test "X$MIXED_MSYS" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
-$as_echo_n "checking if we mix WSL with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
+printf %s "checking if we mix WSL with another native compiler... " >&6; }
if test "X$MIXED_WSL" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -5559,35 +6346,41 @@ THR_DEFS=
-case "$threads_disabled" in
- no|maybe)
+case "$threads_disabled" in #(
+ no|maybe) :
+
NEED_NPTL_PTHREAD_H=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
-$as_echo_n "checking for native win32 threads... " >&6; }
-if test "X$host_os" = "Xwin32"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
+printf %s "checking for native win32 threads... " >&6; }
+if test "X$host_os" = "Xwin32"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
THR_DEFS="-DWIN32_THREADS"
THR_LIBS=
THR_LIB_NAME=win32_threads
THR_LIB_TYPE=win32_threads
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
THR_DEFS=
THR_LIBS=
THR_LIB_NAME=
THR_LIB_TYPE=posix_unknown
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
-$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+printf %s "checking for pthread_create in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5596,40 +6389,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_pthread_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_pthread_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = xyes
+then :
THR_LIBS="-lpthread"
fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
-$as_echo_n "checking for pthread_create in -lc_r... " >&6; }
-if ${ac_cv_lib_c_r_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
+printf %s "checking for pthread_create in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc_r $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5638,96 +6433,112 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_r_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_c_r_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
-$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
-if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_create" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_create" = xyes
+then :
THR_LIBS="-lc_r"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
-if test "x$ac_cv_func_pthread_create" = xyes; then :
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
+if test "x$ac_cv_func_pthread_create" = xyes
+then :
THR_LIBS="none_needed"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
-$as_echo_n "checking if the '-pthread' switch can be used... " >&6; }
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
+printf %s "checking if the '-pthread' switch can be used... " >&6; }
saved_cflags=$CFLAGS
CFLAGS="$CFLAGS -pthread"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
-main ()
+main (void)
{
pthread_create((void*)0,(void*)0,(void*)0,(void*)0);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
THR_DEFS="-pthread"
THR_LIBS="-pthread"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS=$saved_cflags
if test "x$THR_LIBS" != "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- fi
- if test "x$THR_LIBS" != "x"; then
+fi
+
+ if test "x$THR_LIBS" != "x"
+then :
+
THR_DEFS="$THR_DEFS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS"
THR_LIB_NAME=pthread
if test "x$THR_LIBS" = "xnone_needed"; then
THR_LIBS=
fi
- case $host_os in
- solaris*)
- THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS" ;;
- linux*)
+ case $host_os in #(
+ solaris*) :
+
+ THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS"
+ ;; #(
+ linux*) :
+
THR_DEFS="$THR_DEFS -D_POSIX_THREAD_SAFE_FUNCTIONS"
-if test "$cross_compiling" != "yes"; then
+if test "$cross_compiling" != "yes"
+then :
+
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -5735,11 +6546,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5751,23 +6566,26 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-else
+
+else $as_nop
+
host_getconf="$host_alias-getconf"
# Extract the first word of "$host_getconf", so it can be a program name with args.
set dummy $host_getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -5775,11 +6593,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="$host_getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5791,25 +6613,28 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""; then
+ if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""
+then :
+
GETCONF=
prfx="$erl_xcomp_sysroot"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}getconf", so it can be a program name with args.
set dummy ${ac_tool_prefix}getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_GETCONF="$GETCONF" # Let the user override the test with a path.
@@ -5820,11 +6645,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5836,11 +6665,11 @@ esac
fi
GETCONF=$ac_cv_path_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5849,11 +6678,12 @@ if test -z "$ac_cv_path_GETCONF"; then
ac_pt_GETCONF=$GETCONF
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $ac_pt_GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_GETCONF="$ac_pt_GETCONF" # Let the user override the test with a path.
@@ -5864,11 +6694,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5880,11 +6714,11 @@ esac
fi
ac_pt_GETCONF=$ac_cv_path_ac_pt_GETCONF
if test -n "$ac_pt_GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
-$as_echo "$ac_pt_GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
+printf "%s\n" "$ac_pt_GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_pt_GETCONF" = x; then
@@ -5892,8 +6726,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
GETCONF=$ac_pt_GETCONF
@@ -5902,11 +6736,13 @@ else
GETCONF="$ac_cv_path_GETCONF"
fi
- fi
+
+fi
+
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
-$as_echo_n "checking for Native POSIX Thread Library... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
+printf %s "checking for Native POSIX Thread Library... " >&6; }
libpthr_vsn=`$GETCONF GNU_LIBPTHREAD_VERSION 2>/dev/null`
if test $? -eq 0; then
case "$libpthr_vsn" in
@@ -5922,24 +6758,28 @@ $as_echo_n "checking for Native POSIX Thread Library... " >&6; }
else
nptl=no
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
-$as_echo "$nptl" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
+printf "%s\n" "$nptl" >&6; }
if test $nptl = cross; then
nptl=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
-$as_echo "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
+printf "%s\n" "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
fi
- if test $nptl = yes; then
+ if test $nptl = yes
+then :
+
THR_LIB_TYPE=posix_nptl
need_nptl_incldir=no
- ac_fn_c_check_header_mongrel "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_nptl_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_nptl_pthread_h" = xyes
+then :
need_nptl_incldir=yes
NEED_NPTL_PTHREAD_H=yes
fi
+ if test $need_nptl_incldir = yes
+then :
- if test $need_nptl_incldir = yes; then
# Ahh...
nptl_path="$C_INCLUDE_PATH:$CPATH"
if test X$cross_compiling != Xyes; then
@@ -5960,13 +6800,13 @@ fi
IFS=$save_ifs
nptl_incldir=
for dir in $nptl_ws_path; do
- as_ac_Header=`$as_echo "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ as_ac_Header=`printf "%s\n" "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
nptl_incldir=$dir/nptl
fi
-
if test "x$nptl_incldir" != "x"; then
THR_DEFS="$THR_DEFS -isystem $nptl_incldir"
break
@@ -5975,38 +6815,43 @@ fi
if test "x$nptl_incldir" = "x"; then
as_fn_error $? "Failed to locate nptl system include directory" "$LINENO" 5
fi
- fi
- fi
- ;;
- *) ;;
- esac
+
+fi
+
+fi
+ ;; #(
+ *) :
+ ;;
+esac
saved_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $THR_DEFS"
- ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
-$as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h
fi
-
- ac_fn_c_check_header_mongrel "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes
+then :
\
-$as_echo "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
fi
-
CPPFLAGS=$saved_cppflags
- fi
+
+fi
+
fi
@@ -6015,17 +6860,19 @@ fi
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
-$as_echo_n "checking size of short... " >&6; }
-if ${ac_cv_sizeof_short+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
+printf %s "checking size of short... " >&6; }
+if test ${ac_cv_sizeof_short+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_short" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (short)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -6034,31 +6881,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
-$as_echo "$ac_cv_sizeof_short" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
+printf "%s\n" "$ac_cv_sizeof_short" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_SHORT $ac_cv_sizeof_short
-_ACEOF
+printf "%s\n" "#define SIZEOF_SHORT $ac_cv_sizeof_short" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
-$as_echo_n "checking size of int... " >&6; }
-if ${ac_cv_sizeof_int+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
+printf %s "checking size of int... " >&6; }
+if test ${ac_cv_sizeof_int+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_int" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (int)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -6067,31 +6914,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
-$as_echo "$ac_cv_sizeof_int" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
+printf "%s\n" "$ac_cv_sizeof_int" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_INT $ac_cv_sizeof_int
-_ACEOF
+printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
-$as_echo_n "checking size of long... " >&6; }
-if ${ac_cv_sizeof_long+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
+printf %s "checking size of long... " >&6; }
+if test ${ac_cv_sizeof_long+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -6100,31 +6947,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
-$as_echo "$ac_cv_sizeof_long" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
+printf "%s\n" "$ac_cv_sizeof_long" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG $ac_cv_sizeof_long
-_ACEOF
+printf "%s\n" "#define SIZEOF_LONG $ac_cv_sizeof_long" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
-$as_echo_n "checking size of long long... " >&6; }
-if ${ac_cv_sizeof_long_long+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5
+printf %s "checking size of long long... " >&6; }
+if test ${ac_cv_sizeof_long_long+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_long_long" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long long)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -6133,31 +6980,31 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
-$as_echo "$ac_cv_sizeof_long_long" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5
+printf "%s\n" "$ac_cv_sizeof_long_long" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
-_ACEOF
+printf "%s\n" "#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long" >>confdefs.h
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int128_t" >&5
-$as_echo_n "checking size of __int128_t... " >&6; }
-if ${ac_cv_sizeof___int128_t+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int128_t))" "ac_cv_sizeof___int128_t" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of __int128_t" >&5
+printf %s "checking size of __int128_t... " >&6; }
+if test ${ac_cv_sizeof___int128_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int128_t))" "ac_cv_sizeof___int128_t" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type___int128_t" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (__int128_t)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -6166,14 +7013,12 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int128_t" >&5
-$as_echo "$ac_cv_sizeof___int128_t" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int128_t" >&5
+printf "%s\n" "$ac_cv_sizeof___int128_t" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF___INT128_T $ac_cv_sizeof___int128_t
-_ACEOF
+printf "%s\n" "#define SIZEOF___INT128_T $ac_cv_sizeof___int128_t" >>confdefs.h
@@ -6202,28 +7047,30 @@ _ACEOF
else
gcc_atomic_type128="#error "
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working __sync_synchronize()" >&5
-$as_echo_n "checking for a working __sync_synchronize()... " >&6; }
-if ${ethr_cv___sync_synchronize+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working __sync_synchronize()" >&5
+printf %s "checking for a working __sync_synchronize()... " >&6; }
+if test ${ethr_cv___sync_synchronize+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv___sync_synchronize=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
__sync_synchronize();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv___sync_synchronize=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
if test $ethr_cv___sync_synchronize = yes; then
#
@@ -6268,8 +7115,8 @@ EOF
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv___sync_synchronize" >&5
-$as_echo "$ethr_cv___sync_synchronize" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv___sync_synchronize" >&5
+printf "%s\n" "$ethr_cv___sync_synchronize" >&6; }
if test "$ethr_cv___sync_synchronize" = "yes"; then
have_sync_synchronize_value="~0"
@@ -6277,9 +7124,7 @@ $as_echo "$ethr_cv___sync_synchronize" >&6; }
have_sync_synchronize_value="0"
fi
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___sync_synchronize $have_sync_synchronize_value
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___sync_synchronize $have_sync_synchronize_value" >>confdefs.h
@@ -6318,87 +7163,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_add_and_fetch()" >&5
-$as_echo_n "checking for 32-bit __sync_add_and_fetch()... " >&6; }
-if ${ethr_cv_32bit___sync_add_and_fetch+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_add_and_fetch()" >&5
+printf %s "checking for 32-bit __sync_add_and_fetch()... " >&6; }
+if test ${ethr_cv_32bit___sync_add_and_fetch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___sync_add_and_fetch=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___sync_add_and_fetch=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_add_and_fetch" >&5
-$as_echo "$ethr_cv_32bit___sync_add_and_fetch" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_add_and_fetch()" >&5
-$as_echo_n "checking for 64-bit __sync_add_and_fetch()... " >&6; }
-if ${ethr_cv_64bit___sync_add_and_fetch+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_add_and_fetch" >&5
+printf "%s\n" "$ethr_cv_32bit___sync_add_and_fetch" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_add_and_fetch()" >&5
+printf %s "checking for 64-bit __sync_add_and_fetch()... " >&6; }
+if test ${ethr_cv_64bit___sync_add_and_fetch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___sync_add_and_fetch=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___sync_add_and_fetch=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_add_and_fetch" >&5
-$as_echo "$ethr_cv_64bit___sync_add_and_fetch" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_add_and_fetch()" >&5
-$as_echo_n "checking for 128-bit __sync_add_and_fetch()... " >&6; }
-if ${ethr_cv_128bit___sync_add_and_fetch+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_add_and_fetch" >&5
+printf "%s\n" "$ethr_cv_64bit___sync_add_and_fetch" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_add_and_fetch()" >&5
+printf %s "checking for 128-bit __sync_add_and_fetch()... " >&6; }
+if test ${ethr_cv_128bit___sync_add_and_fetch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___sync_add_and_fetch=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___sync_add_and_fetch=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_add_and_fetch" >&5
-$as_echo "$ethr_cv_128bit___sync_add_and_fetch" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_add_and_fetch" >&5
+printf "%s\n" "$ethr_cv_128bit___sync_add_and_fetch" >&6; }
case $ethr_cv_128bit___sync_add_and_fetch-$ethr_cv_64bit___sync_add_and_fetch-$ethr_cv_32bit___sync_add_and_fetch in
no-no-no)
@@ -6419,9 +7270,7 @@ $as_echo "$ethr_cv_128bit___sync_add_and_fetch" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___sync_add_and_fetch $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___sync_add_and_fetch $have_atomic_ops" >>confdefs.h
@@ -6460,87 +7309,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_fetch_and_and()" >&5
-$as_echo_n "checking for 32-bit __sync_fetch_and_and()... " >&6; }
-if ${ethr_cv_32bit___sync_fetch_and_and+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_fetch_and_and()" >&5
+printf %s "checking for 32-bit __sync_fetch_and_and()... " >&6; }
+if test ${ethr_cv_32bit___sync_fetch_and_and+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___sync_fetch_and_and=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___sync_fetch_and_and=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_fetch_and_and" >&5
-$as_echo "$ethr_cv_32bit___sync_fetch_and_and" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_fetch_and_and()" >&5
-$as_echo_n "checking for 64-bit __sync_fetch_and_and()... " >&6; }
-if ${ethr_cv_64bit___sync_fetch_and_and+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_fetch_and_and" >&5
+printf "%s\n" "$ethr_cv_32bit___sync_fetch_and_and" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_fetch_and_and()" >&5
+printf %s "checking for 64-bit __sync_fetch_and_and()... " >&6; }
+if test ${ethr_cv_64bit___sync_fetch_and_and+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___sync_fetch_and_and=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___sync_fetch_and_and=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_fetch_and_and" >&5
-$as_echo "$ethr_cv_64bit___sync_fetch_and_and" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_fetch_and_and()" >&5
-$as_echo_n "checking for 128-bit __sync_fetch_and_and()... " >&6; }
-if ${ethr_cv_128bit___sync_fetch_and_and+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_fetch_and_and" >&5
+printf "%s\n" "$ethr_cv_64bit___sync_fetch_and_and" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_fetch_and_and()" >&5
+printf %s "checking for 128-bit __sync_fetch_and_and()... " >&6; }
+if test ${ethr_cv_128bit___sync_fetch_and_and+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___sync_fetch_and_and=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___sync_fetch_and_and=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_fetch_and_and" >&5
-$as_echo "$ethr_cv_128bit___sync_fetch_and_and" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_fetch_and_and" >&5
+printf "%s\n" "$ethr_cv_128bit___sync_fetch_and_and" >&6; }
case $ethr_cv_128bit___sync_fetch_and_and-$ethr_cv_64bit___sync_fetch_and_and-$ethr_cv_32bit___sync_fetch_and_and in
no-no-no)
@@ -6561,9 +7416,7 @@ $as_echo "$ethr_cv_128bit___sync_fetch_and_and" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___sync_fetch_and_and $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___sync_fetch_and_and $have_atomic_ops" >>confdefs.h
@@ -6602,87 +7455,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_fetch_and_or()" >&5
-$as_echo_n "checking for 32-bit __sync_fetch_and_or()... " >&6; }
-if ${ethr_cv_32bit___sync_fetch_and_or+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_fetch_and_or()" >&5
+printf %s "checking for 32-bit __sync_fetch_and_or()... " >&6; }
+if test ${ethr_cv_32bit___sync_fetch_and_or+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___sync_fetch_and_or=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___sync_fetch_and_or=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_fetch_and_or" >&5
-$as_echo "$ethr_cv_32bit___sync_fetch_and_or" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_fetch_and_or()" >&5
-$as_echo_n "checking for 64-bit __sync_fetch_and_or()... " >&6; }
-if ${ethr_cv_64bit___sync_fetch_and_or+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_fetch_and_or" >&5
+printf "%s\n" "$ethr_cv_32bit___sync_fetch_and_or" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_fetch_and_or()" >&5
+printf %s "checking for 64-bit __sync_fetch_and_or()... " >&6; }
+if test ${ethr_cv_64bit___sync_fetch_and_or+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___sync_fetch_and_or=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___sync_fetch_and_or=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_fetch_and_or" >&5
-$as_echo "$ethr_cv_64bit___sync_fetch_and_or" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_fetch_and_or()" >&5
-$as_echo_n "checking for 128-bit __sync_fetch_and_or()... " >&6; }
-if ${ethr_cv_128bit___sync_fetch_and_or+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_fetch_and_or" >&5
+printf "%s\n" "$ethr_cv_64bit___sync_fetch_and_or" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_fetch_and_or()" >&5
+printf %s "checking for 128-bit __sync_fetch_and_or()... " >&6; }
+if test ${ethr_cv_128bit___sync_fetch_and_or+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___sync_fetch_and_or=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___sync_fetch_and_or=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_fetch_and_or" >&5
-$as_echo "$ethr_cv_128bit___sync_fetch_and_or" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_fetch_and_or" >&5
+printf "%s\n" "$ethr_cv_128bit___sync_fetch_and_or" >&6; }
case $ethr_cv_128bit___sync_fetch_and_or-$ethr_cv_64bit___sync_fetch_and_or-$ethr_cv_32bit___sync_fetch_and_or in
no-no-no)
@@ -6703,9 +7562,7 @@ $as_echo "$ethr_cv_128bit___sync_fetch_and_or" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___sync_fetch_and_or $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___sync_fetch_and_or $have_atomic_ops" >>confdefs.h
@@ -6744,87 +7601,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_val_compare_and_swap()" >&5
-$as_echo_n "checking for 32-bit __sync_val_compare_and_swap()... " >&6; }
-if ${ethr_cv_32bit___sync_val_compare_and_swap+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __sync_val_compare_and_swap()" >&5
+printf %s "checking for 32-bit __sync_val_compare_and_swap()... " >&6; }
+if test ${ethr_cv_32bit___sync_val_compare_and_swap+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___sync_val_compare_and_swap=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___sync_val_compare_and_swap=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_val_compare_and_swap" >&5
-$as_echo "$ethr_cv_32bit___sync_val_compare_and_swap" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_val_compare_and_swap()" >&5
-$as_echo_n "checking for 64-bit __sync_val_compare_and_swap()... " >&6; }
-if ${ethr_cv_64bit___sync_val_compare_and_swap+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___sync_val_compare_and_swap" >&5
+printf "%s\n" "$ethr_cv_32bit___sync_val_compare_and_swap" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __sync_val_compare_and_swap()" >&5
+printf %s "checking for 64-bit __sync_val_compare_and_swap()... " >&6; }
+if test ${ethr_cv_64bit___sync_val_compare_and_swap+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___sync_val_compare_and_swap=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___sync_val_compare_and_swap=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_val_compare_and_swap" >&5
-$as_echo "$ethr_cv_64bit___sync_val_compare_and_swap" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_val_compare_and_swap()" >&5
-$as_echo_n "checking for 128-bit __sync_val_compare_and_swap()... " >&6; }
-if ${ethr_cv_128bit___sync_val_compare_and_swap+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___sync_val_compare_and_swap" >&5
+printf "%s\n" "$ethr_cv_64bit___sync_val_compare_and_swap" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __sync_val_compare_and_swap()" >&5
+printf %s "checking for 128-bit __sync_val_compare_and_swap()... " >&6; }
+if test ${ethr_cv_128bit___sync_val_compare_and_swap+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___sync_val_compare_and_swap=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___sync_val_compare_and_swap=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_val_compare_and_swap" >&5
-$as_echo "$ethr_cv_128bit___sync_val_compare_and_swap" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___sync_val_compare_and_swap" >&5
+printf "%s\n" "$ethr_cv_128bit___sync_val_compare_and_swap" >&6; }
case $ethr_cv_128bit___sync_val_compare_and_swap-$ethr_cv_64bit___sync_val_compare_and_swap-$ethr_cv_32bit___sync_val_compare_and_swap in
no-no-no)
@@ -6845,9 +7708,7 @@ $as_echo "$ethr_cv_128bit___sync_val_compare_and_swap" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___sync_val_compare_and_swap $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___sync_val_compare_and_swap $have_atomic_ops" >>confdefs.h
@@ -6887,87 +7748,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_store_n()" >&5
-$as_echo_n "checking for 32-bit __atomic_store_n()... " >&6; }
-if ${ethr_cv_32bit___atomic_store_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_store_n()" >&5
+printf %s "checking for 32-bit __atomic_store_n()... " >&6; }
+if test ${ethr_cv_32bit___atomic_store_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___atomic_store_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___atomic_store_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_store_n" >&5
-$as_echo "$ethr_cv_32bit___atomic_store_n" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_store_n()" >&5
-$as_echo_n "checking for 64-bit __atomic_store_n()... " >&6; }
-if ${ethr_cv_64bit___atomic_store_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_store_n" >&5
+printf "%s\n" "$ethr_cv_32bit___atomic_store_n" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_store_n()" >&5
+printf %s "checking for 64-bit __atomic_store_n()... " >&6; }
+if test ${ethr_cv_64bit___atomic_store_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___atomic_store_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___atomic_store_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_store_n" >&5
-$as_echo "$ethr_cv_64bit___atomic_store_n" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_store_n()" >&5
-$as_echo_n "checking for 128-bit __atomic_store_n()... " >&6; }
-if ${ethr_cv_128bit___atomic_store_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_store_n" >&5
+printf "%s\n" "$ethr_cv_64bit___atomic_store_n" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_store_n()" >&5
+printf %s "checking for 128-bit __atomic_store_n()... " >&6; }
+if test ${ethr_cv_128bit___atomic_store_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___atomic_store_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___atomic_store_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_store_n" >&5
-$as_echo "$ethr_cv_128bit___atomic_store_n" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_store_n" >&5
+printf "%s\n" "$ethr_cv_128bit___atomic_store_n" >&6; }
case $ethr_cv_128bit___atomic_store_n-$ethr_cv_64bit___atomic_store_n-$ethr_cv_32bit___atomic_store_n in
no-no-no)
@@ -6988,9 +7855,7 @@ $as_echo "$ethr_cv_128bit___atomic_store_n" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___atomic_store_n $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___atomic_store_n $have_atomic_ops" >>confdefs.h
@@ -7029,87 +7894,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_load_n()" >&5
-$as_echo_n "checking for 32-bit __atomic_load_n()... " >&6; }
-if ${ethr_cv_32bit___atomic_load_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_load_n()" >&5
+printf %s "checking for 32-bit __atomic_load_n()... " >&6; }
+if test ${ethr_cv_32bit___atomic_load_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___atomic_load_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___atomic_load_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_load_n" >&5
-$as_echo "$ethr_cv_32bit___atomic_load_n" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_load_n()" >&5
-$as_echo_n "checking for 64-bit __atomic_load_n()... " >&6; }
-if ${ethr_cv_64bit___atomic_load_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_load_n" >&5
+printf "%s\n" "$ethr_cv_32bit___atomic_load_n" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_load_n()" >&5
+printf %s "checking for 64-bit __atomic_load_n()... " >&6; }
+if test ${ethr_cv_64bit___atomic_load_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___atomic_load_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___atomic_load_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_load_n" >&5
-$as_echo "$ethr_cv_64bit___atomic_load_n" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_load_n()" >&5
-$as_echo_n "checking for 128-bit __atomic_load_n()... " >&6; }
-if ${ethr_cv_128bit___atomic_load_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_load_n" >&5
+printf "%s\n" "$ethr_cv_64bit___atomic_load_n" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_load_n()" >&5
+printf %s "checking for 128-bit __atomic_load_n()... " >&6; }
+if test ${ethr_cv_128bit___atomic_load_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___atomic_load_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___atomic_load_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_load_n" >&5
-$as_echo "$ethr_cv_128bit___atomic_load_n" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_load_n" >&5
+printf "%s\n" "$ethr_cv_128bit___atomic_load_n" >&6; }
case $ethr_cv_128bit___atomic_load_n-$ethr_cv_64bit___atomic_load_n-$ethr_cv_32bit___atomic_load_n in
no-no-no)
@@ -7130,9 +8001,7 @@ $as_echo "$ethr_cv_128bit___atomic_load_n" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___atomic_load_n $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___atomic_load_n $have_atomic_ops" >>confdefs.h
@@ -7171,87 +8040,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_add_fetch()" >&5
-$as_echo_n "checking for 32-bit __atomic_add_fetch()... " >&6; }
-if ${ethr_cv_32bit___atomic_add_fetch+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_add_fetch()" >&5
+printf %s "checking for 32-bit __atomic_add_fetch()... " >&6; }
+if test ${ethr_cv_32bit___atomic_add_fetch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___atomic_add_fetch=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___atomic_add_fetch=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_add_fetch" >&5
-$as_echo "$ethr_cv_32bit___atomic_add_fetch" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_add_fetch()" >&5
-$as_echo_n "checking for 64-bit __atomic_add_fetch()... " >&6; }
-if ${ethr_cv_64bit___atomic_add_fetch+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_add_fetch" >&5
+printf "%s\n" "$ethr_cv_32bit___atomic_add_fetch" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_add_fetch()" >&5
+printf %s "checking for 64-bit __atomic_add_fetch()... " >&6; }
+if test ${ethr_cv_64bit___atomic_add_fetch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___atomic_add_fetch=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___atomic_add_fetch=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_add_fetch" >&5
-$as_echo "$ethr_cv_64bit___atomic_add_fetch" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_add_fetch()" >&5
-$as_echo_n "checking for 128-bit __atomic_add_fetch()... " >&6; }
-if ${ethr_cv_128bit___atomic_add_fetch+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_add_fetch" >&5
+printf "%s\n" "$ethr_cv_64bit___atomic_add_fetch" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_add_fetch()" >&5
+printf %s "checking for 128-bit __atomic_add_fetch()... " >&6; }
+if test ${ethr_cv_128bit___atomic_add_fetch+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___atomic_add_fetch=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___atomic_add_fetch=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_add_fetch" >&5
-$as_echo "$ethr_cv_128bit___atomic_add_fetch" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_add_fetch" >&5
+printf "%s\n" "$ethr_cv_128bit___atomic_add_fetch" >&6; }
case $ethr_cv_128bit___atomic_add_fetch-$ethr_cv_64bit___atomic_add_fetch-$ethr_cv_32bit___atomic_add_fetch in
no-no-no)
@@ -7272,9 +8147,7 @@ $as_echo "$ethr_cv_128bit___atomic_add_fetch" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___atomic_add_fetch $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___atomic_add_fetch $have_atomic_ops" >>confdefs.h
@@ -7313,87 +8186,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_fetch_and()" >&5
-$as_echo_n "checking for 32-bit __atomic_fetch_and()... " >&6; }
-if ${ethr_cv_32bit___atomic_fetch_and+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_fetch_and()" >&5
+printf %s "checking for 32-bit __atomic_fetch_and()... " >&6; }
+if test ${ethr_cv_32bit___atomic_fetch_and+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___atomic_fetch_and=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___atomic_fetch_and=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_fetch_and" >&5
-$as_echo "$ethr_cv_32bit___atomic_fetch_and" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_fetch_and()" >&5
-$as_echo_n "checking for 64-bit __atomic_fetch_and()... " >&6; }
-if ${ethr_cv_64bit___atomic_fetch_and+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_fetch_and" >&5
+printf "%s\n" "$ethr_cv_32bit___atomic_fetch_and" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_fetch_and()" >&5
+printf %s "checking for 64-bit __atomic_fetch_and()... " >&6; }
+if test ${ethr_cv_64bit___atomic_fetch_and+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___atomic_fetch_and=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___atomic_fetch_and=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_fetch_and" >&5
-$as_echo "$ethr_cv_64bit___atomic_fetch_and" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_fetch_and()" >&5
-$as_echo_n "checking for 128-bit __atomic_fetch_and()... " >&6; }
-if ${ethr_cv_128bit___atomic_fetch_and+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_fetch_and" >&5
+printf "%s\n" "$ethr_cv_64bit___atomic_fetch_and" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_fetch_and()" >&5
+printf %s "checking for 128-bit __atomic_fetch_and()... " >&6; }
+if test ${ethr_cv_128bit___atomic_fetch_and+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___atomic_fetch_and=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___atomic_fetch_and=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_fetch_and" >&5
-$as_echo "$ethr_cv_128bit___atomic_fetch_and" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_fetch_and" >&5
+printf "%s\n" "$ethr_cv_128bit___atomic_fetch_and" >&6; }
case $ethr_cv_128bit___atomic_fetch_and-$ethr_cv_64bit___atomic_fetch_and-$ethr_cv_32bit___atomic_fetch_and in
no-no-no)
@@ -7414,9 +8293,7 @@ $as_echo "$ethr_cv_128bit___atomic_fetch_and" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___atomic_fetch_and $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___atomic_fetch_and $have_atomic_ops" >>confdefs.h
@@ -7455,87 +8332,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_fetch_or()" >&5
-$as_echo_n "checking for 32-bit __atomic_fetch_or()... " >&6; }
-if ${ethr_cv_32bit___atomic_fetch_or+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_fetch_or()" >&5
+printf %s "checking for 32-bit __atomic_fetch_or()... " >&6; }
+if test ${ethr_cv_32bit___atomic_fetch_or+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___atomic_fetch_or=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___atomic_fetch_or=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_fetch_or" >&5
-$as_echo "$ethr_cv_32bit___atomic_fetch_or" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_fetch_or()" >&5
-$as_echo_n "checking for 64-bit __atomic_fetch_or()... " >&6; }
-if ${ethr_cv_64bit___atomic_fetch_or+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_fetch_or" >&5
+printf "%s\n" "$ethr_cv_32bit___atomic_fetch_or" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_fetch_or()" >&5
+printf %s "checking for 64-bit __atomic_fetch_or()... " >&6; }
+if test ${ethr_cv_64bit___atomic_fetch_or+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___atomic_fetch_or=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___atomic_fetch_or=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_fetch_or" >&5
-$as_echo "$ethr_cv_64bit___atomic_fetch_or" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_fetch_or()" >&5
-$as_echo_n "checking for 128-bit __atomic_fetch_or()... " >&6; }
-if ${ethr_cv_128bit___atomic_fetch_or+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_fetch_or" >&5
+printf "%s\n" "$ethr_cv_64bit___atomic_fetch_or" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_fetch_or()" >&5
+printf %s "checking for 128-bit __atomic_fetch_or()... " >&6; }
+if test ${ethr_cv_128bit___atomic_fetch_or+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___atomic_fetch_or=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___atomic_fetch_or=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_fetch_or" >&5
-$as_echo "$ethr_cv_128bit___atomic_fetch_or" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_fetch_or" >&5
+printf "%s\n" "$ethr_cv_128bit___atomic_fetch_or" >&6; }
case $ethr_cv_128bit___atomic_fetch_or-$ethr_cv_64bit___atomic_fetch_or-$ethr_cv_32bit___atomic_fetch_or in
no-no-no)
@@ -7556,9 +8439,7 @@ $as_echo "$ethr_cv_128bit___atomic_fetch_or" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___atomic_fetch_or $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___atomic_fetch_or $have_atomic_ops" >>confdefs.h
@@ -7597,87 +8478,93 @@ _ACEOF
eval atomic${atomic_bit_size}_call=\"$atomic_call\"
done
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_compare_exchange_n()" >&5
-$as_echo_n "checking for 32-bit __atomic_compare_exchange_n()... " >&6; }
-if ${ethr_cv_32bit___atomic_compare_exchange_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 32-bit __atomic_compare_exchange_n()" >&5
+printf %s "checking for 32-bit __atomic_compare_exchange_n()... " >&6; }
+if test ${ethr_cv_32bit___atomic_compare_exchange_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_32bit___atomic_compare_exchange_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic32_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_32bit___atomic_compare_exchange_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_compare_exchange_n" >&5
-$as_echo "$ethr_cv_32bit___atomic_compare_exchange_n" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_compare_exchange_n()" >&5
-$as_echo_n "checking for 64-bit __atomic_compare_exchange_n()... " >&6; }
-if ${ethr_cv_64bit___atomic_compare_exchange_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_32bit___atomic_compare_exchange_n" >&5
+printf "%s\n" "$ethr_cv_32bit___atomic_compare_exchange_n" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 64-bit __atomic_compare_exchange_n()" >&5
+printf %s "checking for 64-bit __atomic_compare_exchange_n()... " >&6; }
+if test ${ethr_cv_64bit___atomic_compare_exchange_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_64bit___atomic_compare_exchange_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic64_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_64bit___atomic_compare_exchange_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_compare_exchange_n" >&5
-$as_echo "$ethr_cv_64bit___atomic_compare_exchange_n" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_compare_exchange_n()" >&5
-$as_echo_n "checking for 128-bit __atomic_compare_exchange_n()... " >&6; }
-if ${ethr_cv_128bit___atomic_compare_exchange_n+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_64bit___atomic_compare_exchange_n" >&5
+printf "%s\n" "$ethr_cv_64bit___atomic_compare_exchange_n" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 128-bit __atomic_compare_exchange_n()" >&5
+printf %s "checking for 128-bit __atomic_compare_exchange_n()... " >&6; }
+if test ${ethr_cv_128bit___atomic_compare_exchange_n+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_128bit___atomic_compare_exchange_n=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
$atomic128_call
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_128bit___atomic_compare_exchange_n=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_compare_exchange_n" >&5
-$as_echo "$ethr_cv_128bit___atomic_compare_exchange_n" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_128bit___atomic_compare_exchange_n" >&5
+printf "%s\n" "$ethr_cv_128bit___atomic_compare_exchange_n" >&6; }
case $ethr_cv_128bit___atomic_compare_exchange_n-$ethr_cv_64bit___atomic_compare_exchange_n-$ethr_cv_32bit___atomic_compare_exchange_n in
no-no-no)
@@ -7698,9 +8585,7 @@ $as_echo "$ethr_cv_128bit___atomic_compare_exchange_n" >&6; }
have_atomic_ops=28;;
esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE___atomic_compare_exchange_n $have_atomic_ops
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE___atomic_compare_exchange_n $have_atomic_ops" >>confdefs.h
@@ -7708,20 +8593,22 @@ _ACEOF
ethr_arm_dbm_sy_instr_val=0
ethr_arm_dbm_st_instr_val=0
ethr_arm_dbm_ld_instr_val=0
- case "$GCC-$host_cpu" in
- yes-arm*|yes-aarch*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM 'dmb sy' instruction" >&5
-$as_echo_n "checking for ARM 'dmb sy' instruction... " >&6; }
-if ${ethr_cv_arm_dbm_sy_instr+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ case "$GCC-$host_cpu" in #(
+ yes-arm*|yes-aarch*) :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ARM 'dmb sy' instruction" >&5
+printf %s "checking for ARM 'dmb sy' instruction... " >&6; }
+if test ${ethr_cv_arm_dbm_sy_instr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_arm_dbm_sy_instr=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
__asm__ __volatile__("dmb sy" : : : "memory");
@@ -7730,32 +8617,34 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_arm_dbm_sy_instr=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_arm_dbm_sy_instr" >&5
-$as_echo "$ethr_cv_arm_dbm_sy_instr" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_arm_dbm_sy_instr" >&5
+printf "%s\n" "$ethr_cv_arm_dbm_sy_instr" >&6; }
if test $ethr_cv_arm_dbm_sy_instr = yes; then
ethr_arm_dbm_sy_instr_val=1
test $ethr_cv_64bit___atomic_compare_exchange_n = yes &&
ethr_have_gcc_native_atomics=yes
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM 'dmb st' instruction" >&5
-$as_echo_n "checking for ARM 'dmb st' instruction... " >&6; }
-if ${ethr_cv_arm_dbm_st_instr+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ARM 'dmb st' instruction" >&5
+printf %s "checking for ARM 'dmb st' instruction... " >&6; }
+if test ${ethr_cv_arm_dbm_st_instr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_arm_dbm_st_instr=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
__asm__ __volatile__("dmb st" : : : "memory");
@@ -7764,30 +8653,32 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_arm_dbm_st_instr=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_arm_dbm_st_instr" >&5
-$as_echo "$ethr_cv_arm_dbm_st_instr" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_arm_dbm_st_instr" >&5
+printf "%s\n" "$ethr_cv_arm_dbm_st_instr" >&6; }
if test $ethr_cv_arm_dbm_st_instr = yes; then
ethr_arm_dbm_st_instr_val=1
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ARM 'dmb ld' instruction" >&5
-$as_echo_n "checking for ARM 'dmb ld' instruction... " >&6; }
-if ${ethr_cv_arm_dbm_ld_instr+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ARM 'dmb ld' instruction" >&5
+printf %s "checking for ARM 'dmb ld' instruction... " >&6; }
+if test ${ethr_cv_arm_dbm_ld_instr+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ethr_cv_arm_dbm_ld_instr=no
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
__asm__ __volatile__("dmb ld" : : : "memory");
@@ -7796,35 +8687,32 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ethr_cv_arm_dbm_ld_instr=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_arm_dbm_ld_instr" >&5
-$as_echo "$ethr_cv_arm_dbm_ld_instr" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ethr_cv_arm_dbm_ld_instr" >&5
+printf "%s\n" "$ethr_cv_arm_dbm_ld_instr" >&6; }
if test $ethr_cv_arm_dbm_ld_instr = yes; then
ethr_arm_dbm_ld_instr_val=1
- fi;;
- *)
- ;;
- esac
+ fi
+ ;; #(
+ *) :
+ ;;
+esac
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE_GCC_ASM_ARM_DMB_INSTRUCTION $ethr_arm_dbm_sy_instr_val
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE_GCC_ASM_ARM_DMB_INSTRUCTION $ethr_arm_dbm_sy_instr_val" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE_GCC_ASM_ARM_DMB_ST_INSTRUCTION $ethr_arm_dbm_st_instr_val
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE_GCC_ASM_ARM_DMB_ST_INSTRUCTION $ethr_arm_dbm_st_instr_val" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE_GCC_ASM_ARM_DMB_LD_INSTRUCTION $ethr_arm_dbm_ld_instr_val
-_ACEOF
+
+printf "%s\n" "#define ETHR_HAVE_GCC_ASM_ARM_DMB_LD_INSTRUCTION $ethr_arm_dbm_ld_instr_val" >>confdefs.h
test $ethr_cv_32bit___sync_val_compare_and_swap = yes &&
ethr_have_gcc_native_atomics=yes
@@ -7844,9 +8732,7 @@ _ACEOF
test $ethr_have_gcc_atomic_builtins = 1 && ethr_native_atomic_implementation=gcc_atomic_sync
fi
-cat >>confdefs.h <<_ACEOF
-#define ETHR_HAVE_GCC___ATOMIC_BUILTINS $ethr_have_gcc_atomic_builtins
-_ACEOF
+printf "%s\n" "#define ETHR_HAVE_GCC___ATOMIC_BUILTINS $ethr_have_gcc_atomic_builtins" >>confdefs.h
test $ethr_have_gcc_native_atomics = yes && ethr_have_native_atomics=yes
@@ -7868,15 +8754,18 @@ _ACEOF
;;
*)
EI_THREADS="true"
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unexpected thread library: $THR_LIB_NAME" >&5
-$as_echo "$as_me: WARNING: Unexpected thread library: $THR_LIB_NAME" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Unexpected thread library: $THR_LIB_NAME" >&5
+printf "%s\n" "$as_me: WARNING: Unexpected thread library: $THR_LIB_NAME" >&2;}
;;
esac
- ;;
- yes)
+ ;; #(
+ yes) :
+
# Threads disabled
EI_THREADS="false"
- ;;
+ ;; #(
+ *) :
+ ;;
esac
# ---------------------------------------------------------------------------
@@ -7884,39 +8773,47 @@ esac
# ---------------------------------------------------------------------------
-if test "x$GCC" = xyes; then
+if test "x$GCC" = xyes
+then :
+
# Treat certain GCC warnings as errors
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to WERRORFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
WERRORFLAGS="-Werror=return-type $WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
WFLAGS="-Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline"
# check which GCC version
@@ -7939,40 +8836,49 @@ $as_echo "no" >&6; }
# Until version 10, gcc has had -fcommon as default, which allows and merges
# such dubious duplicates.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to CFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -fno-common to CFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-common to CFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-fno-common $CFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CFLAGS="-fno-common $CFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
-else
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+
+
+else $as_nop
+
WFLAGS=""
WERRORFLAGS=""
+
fi
# ---------------------------------------------------------------------------
@@ -8027,181 +8933,253 @@ case "$host_cpu" in
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WARN_FLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=return-type $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+fi
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=implicit $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=implicit $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=undef $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=undef $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
DED_SYS_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host -I${ERL_TOP}/erts/include/internal -I${ERL_TOP}/erts/include/internal/$host -I${ERL_TOP}/erts/emulator/sys/$DED_OSTYPE -I${ERL_TOP}/erts/emulator/sys/common"
DED_INCLUDE=$DED_SYS_INCLUDE
DED_CFLAGS="$CFLAGS $CPPFLAGS $DED_CFLAGS"
-if test "x$GCC" = xyes; then
+if test "x$GCC" = xyes
+then :
+
# Use -fno-common for gcc, that is link error if multiple definitions of
# global variables are encountered. This is ISO C compliant.
# Until version 10, gcc has had -fcommon as default, which allows and merges
# such dubious duplicates.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-fno-common $DED_CFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_CFLAGS="-fno-common $DED_CFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-strict-aliasing to DED_CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-strict-aliasing to DED_CFLAGS (via CFLAGS)... " >&6; }
+ saved_CFLAGS=$CFLAGS;
+ CFLAGS="-fno-strict-aliasing $DED_CFLAGS";
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ can_enable_flag=true
+else $as_nop
+ can_enable_flag=false
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS=$saved_CFLAGS;
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ DED_CFLAGS="-fno-strict-aliasing $DED_CFLAGS"
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
DED_STATIC_CFLAGS="$DED_CFLAGS"
DED_CFLAGS="$DED_CFLAGS -fPIC"
# Remove -fPIE and -fno-PIE
DED_CFLAGS=`echo $DED_CFLAGS | sed 's/-f\(no-\)\?PIE//g'`
+
fi
DED_EXT=so
@@ -8288,17 +9266,19 @@ case $host_os in
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -8307,14 +9287,12 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
case "$ac_cv_sizeof_void_p" in
@@ -8381,11 +9359,12 @@ test "$DED_LDFLAGS_CONFTEST" != "" || DED_LDFLAGS_CONFTEST="$DED_LDFLAGS"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DED_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DED_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DED_LD"; then
ac_cv_prog_DED_LD="$DED_LD" # Let the user override the test.
else
@@ -8393,11 +9372,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DED_LD="${ac_tool_prefix}ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8408,11 +9391,11 @@ fi
fi
DED_LD=$ac_cv_prog_DED_LD
if test -n "$DED_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
-$as_echo "$DED_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
+printf "%s\n" "$DED_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -8421,11 +9404,12 @@ if test -z "$ac_cv_prog_DED_LD"; then
ac_ct_DED_LD=$DED_LD
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DED_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DED_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_DED_LD"; then
ac_cv_prog_ac_ct_DED_LD="$ac_ct_DED_LD" # Let the user override the test.
else
@@ -8433,11 +9417,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DED_LD="ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -8448,11 +9436,11 @@ fi
fi
ac_ct_DED_LD=$ac_cv_prog_ac_ct_DED_LD
if test -n "$ac_ct_DED_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DED_LD" >&5
-$as_echo "$ac_ct_DED_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DED_LD" >&5
+printf "%s\n" "$ac_ct_DED_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_DED_LD" = x; then
@@ -8460,8 +9448,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DED_LD=$ac_ct_DED_LD
@@ -8472,37 +9460,37 @@ fi
test "$DED_LD" != "false" || as_fn_error $? "No linker found" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for static compiler flags" >&5
-$as_echo_n "checking for static compiler flags... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for static compiler flags" >&5
+printf %s "checking for static compiler flags... " >&6; }
DED_STATIC_CFLAGS="$DED_WERRORFLAGS $DED_WFLAGS $DED_THR_DEFS $DED_STATIC_CFLAGS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_STATIC_CFLAGS" >&5
-$as_echo "$DED_STATIC_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for basic compiler flags for loadable drivers" >&5
-$as_echo_n "checking for basic compiler flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_STATIC_CFLAGS" >&5
+printf "%s\n" "$DED_STATIC_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for basic compiler flags for loadable drivers" >&5
+printf %s "checking for basic compiler flags for loadable drivers... " >&6; }
DED_BASIC_CFLAGS=$DED_CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
-$as_echo "$DED_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler flags for loadable drivers" >&5
-$as_echo_n "checking for compiler flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
+printf "%s\n" "$DED_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler flags for loadable drivers" >&5
+printf %s "checking for compiler flags for loadable drivers... " >&6; }
DED_CFLAGS="$DED_WERRORFLAGS $DED_WARN_FLAGS $DED_THR_DEFS $DED_CFLAGS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
-$as_echo "$DED_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker for loadable drivers" >&5
-$as_echo_n "checking for linker for loadable drivers... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
-$as_echo "$DED_LD" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable drivers" >&5
-$as_echo_n "checking for linker flags for loadable drivers... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LDFLAGS" >&5
-$as_echo "$DED_LDFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'runtime library path' linker flag" >&5
-$as_echo_n "checking for 'runtime library path' linker flag... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
+printf "%s\n" "$DED_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker for loadable drivers" >&5
+printf %s "checking for linker for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
+printf "%s\n" "$DED_LD" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable drivers" >&5
+printf %s "checking for linker flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LDFLAGS" >&5
+printf "%s\n" "$DED_LDFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 'runtime library path' linker flag" >&5
+printf %s "checking for 'runtime library path' linker flag... " >&6; }
if test "x$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" != "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&5
-$as_echo "$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&5
+printf "%s\n" "$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+printf "%s\n" "not found" >&6; }
fi
@@ -8526,7 +9514,8 @@ fi
# Check whether --enable-sanitizers was given.
-if test "${enable_sanitizers+set}" = set; then :
+if test ${enable_sanitizers+y}
+then :
enableval=$enable_sanitizers;
case "$enableval" in
no) sanitizers= ;;
@@ -8573,8 +9562,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -8604,15 +9593,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -8626,8 +9615,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -8644,7 +9633,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -8660,8 +9649,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -8684,14 +9673,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -8701,46 +9692,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -8749,13 +9740,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -8764,8 +9748,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -8777,30 +9765,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -8813,13 +9781,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -8846,18 +9815,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -8869,12 +9840,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -8905,7 +9877,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -8927,6 +9899,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -8940,6 +9916,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -8981,7 +9963,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -8990,7 +9972,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -9053,7 +10035,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -9111,14 +10093,16 @@ $config_headers
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -9156,15 +10140,15 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
@@ -9172,7 +10156,7 @@ do
--header | --heade | --head | --hea )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
as_fn_append CONFIG_HEADERS " '$ac_optarg'"
ac_need_defaults=false;;
@@ -9181,7 +10165,7 @@ do
as_fn_error $? "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
--help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -9209,7 +10193,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -9223,7 +10207,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -9250,8 +10234,8 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
+ test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -9587,7 +10571,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -9595,17 +10579,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -9622,7 +10606,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -9646,9 +10630,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -9705,8 +10689,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -9749,9 +10733,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -9767,20 +10751,20 @@ which seems to be undefined. Please make sure it is defined" >&2;}
#
if test x"$ac_file" != x-; then
{
- $as_echo "/* $configure_input */" \
+ printf "%s\n" "/* $configure_input */" >&1 \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
} >"$ac_tmp/config.h" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
-$as_echo "$as_me: $ac_file is unchanged" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+printf "%s\n" "$as_me: $ac_file is unchanged" >&6;}
else
rm -f "$ac_file"
mv "$ac_tmp/config.h" "$ac_file" \
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
fi
else
- $as_echo "/* $configure_input */" \
+ printf "%s\n" "/* $configure_input */" >&1 \
&& eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
|| as_fn_error $? "could not create -" "$LINENO" 5
fi
@@ -9821,7 +10805,8 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
diff --git a/lib/erl_interface/configure.in b/lib/erl_interface/configure.ac
index c43ce74016..d24e3f48eb 100644
--- a/lib/erl_interface/configure.in
+++ b/lib/erl_interface/configure.ac
@@ -20,14 +20,16 @@
# Process this file with autoconf to produce a configure script.
# The starting point for this file was the output from 'autoscan'.
-# Strange, VxWorks HAVE_SENS not set here, see "ei_resolve.h"
-
# Find the erl_interface version number and set m4 macro to it.
# We do this because AC_INIT can't handle shell variables. Still broken.
dnl m4_define(EI_VERSION,`grep EI_VSN ../vsn.mk | sed 's/^.*=[ ]*//'`)
dnl m4_define(EI_VERSION,regexp(m4_include(VERSION),[version \([-.0-9A-Za-z]+\)],[\1]))
-AC_INIT()
+AC_INIT
+AC_CONFIG_SRCDIR([include/ei.h])
+AC_PREREQ([2.71])
+
+m4_include([otp.m4])
dnl How to set srcdir absolute is taken from the GNU Emacs distribution
#### Make srcdir absolute, if it isn't already. It's important to
@@ -50,18 +52,14 @@ case "${srcdir}" in
* ) srcdir="`(cd ${srcdir}; pwd)`" ;;
esac
-AC_CONFIG_AUX_DIR([$srcdir/src/auxdir])
+AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf])
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- AC_CANONICAL_HOST
-else
- host_os=win32
-fi
+ERL_CANONICAL_SYSTEM_TYPE
TARGET=$host
AC_SUBST(TARGET)
-AC_CONFIG_HEADER([src/$host/config.h:config.h.in])
+AC_CONFIG_HEADERS([src/$host/config.h:config.h.in])
dnl ----------------------------------------------------------------------
dnl Optional features
@@ -100,6 +98,7 @@ dnl ----------------------------------------------------------------------
AC_PROG_CC
AC_PROG_CPP
+AC_PROG_EGREP
dnl AC_PROG_LIBTOOL
AC_PROG_RANLIB
AC_CHECK_PROGS(LD, ld.sh)
@@ -168,11 +167,12 @@ case $host_os in
esac
# Checks for libraries.
-AC_CHECK_LIB([nsl], [gethostbyname])
-AC_CHECK_LIB([socket], [getpeername])
+AC_SEARCH_LIBS([gethostbyname], [nsl])
+AC_SEARCH_LIBS([getpeername], [socket])
# Checks for header files.
-AC_HEADER_STDC
+AC_CHECK_INCLUDES_DEFAULT
+
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h malloc.h netdb.h netinet/in.h stddef.h stdlib.h string.h sys/param.h sys/socket.h sys/select.h sys/time.h unistd.h sys/types.h sys/uio.h])
@@ -183,14 +183,12 @@ dnl AC_C_VOLATILE
AC_TYPE_UID_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
-AC_HEADER_TIME
+AC_CHECK_HEADERS_ONCE([sys/time.h])
+
AC_MSG_CHECKING([for socklen_t usability])
-AC_TRY_COMPILE([#include <sys/types.h>
-#include <sys/socket.h>],
-[socklen_t mylen;],
-[AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_SOCKLEN_T, [], [Define if you have the `socklen_t' type])],
-[AC_MSG_RESULT(no)])
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
+#include <sys/socket.h>]], [[socklen_t mylen;]])],[AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SOCKLEN_T, [], [Define if you have the `socklen_t' type])],[AC_MSG_RESULT(no)])
# Checks for library functions.
AC_FUNC_ALLOCA
@@ -202,7 +200,7 @@ dnl AC_FUNC_MALLOC
dnl AC_FUNC_REALLOC
AC_FUNC_MEMCMP
dnl AC_FUNC_SELECT_ARGTYPES
-dnl AC_TYPE_SIGNAL
+
dnl AC_FUNC_STRERROR_R
dnl AC_FUNC_VPRINTF
AC_CHECK_FUNCS([dup2 gethostbyaddr gethostbyname \
@@ -229,7 +227,8 @@ AC_ARG_WITH(gmp,
# We don't just want any GNU MP version, we want 4.1 or later
# that contain the import/export functions we need.
-if test "x$with_gmp" = "xyes" ;then
+AS_IF([test "x$with_gmp" = "xyes"],
+ [
for dir in /usr /usr/pkg /usr/local /usr/local/gmp /usr/lib/gmp /usr/gmp; do
AC_CHECK_HEADER($dir/include/gmp.h, ac_cv_gmp=yes, ac_cv_gmp=no)
if test $ac_cv_gmp = yes ; then
@@ -254,7 +253,7 @@ elif test "x$with_gmp" != "xno" -a -n "$with_gmp" ;then
AC_DEFINE(HAVE_GMP_H, [], [Define if you have "gmp.h"])
AC_CHECK_LIB(gmp, __gmpz_export)
# FIXME return ERROR if no lib
-fi
+ ])
LM_WINDOWS_ENVIRONMENT
@@ -268,8 +267,10 @@ AC_SUBST(THR_LIBS)
AC_SUBST(THR_DEFS)
AC_SUBST(EI_THREADS)
-case "$threads_disabled" in
- no|maybe)
+AS_CASE(["$threads_disabled"],
+
+ [no|maybe],
+ [
LM_CHECK_THR_LIB
ETHR_CHK_GCC_ATOMIC_OPS([])
@@ -278,7 +279,7 @@ case "$threads_disabled" in
EI_THREADS="false"
# Fail if --enable-threads given and no threads found
if test "x$threads_disabled" = "xno"; then
- AC_MSG_ERROR(No threads support found)
+ AC_MSG_ERROR([No threads support found])
fi
;;
win32_threads)
@@ -293,19 +294,21 @@ case "$threads_disabled" in
AC_MSG_WARN([Unexpected thread library: $THR_LIB_NAME])
;;
esac
- ;;
- yes)
+ ],
+
+ [yes],
+ [
# Threads disabled
EI_THREADS="false"
- ;;
-esac
+ ])
# ---------------------------------------------------------------------------
# Warning flags to the C compiler
# ---------------------------------------------------------------------------
AC_SUBST(WFLAGS)
-if test "x$GCC" = xyes; then
+AS_IF([test "x$GCC" = xyes],
+ [
# Treat certain GCC warnings as errors
LM_TRY_ENABLE_CFLAG([-Werror=return-type], [WERRORFLAGS])
WFLAGS="-Wall -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Winline"
@@ -329,10 +332,11 @@ if test "x$GCC" = xyes; then
# Until version 10, gcc has had -fcommon as default, which allows and merges
# such dubious duplicates.
LM_TRY_ENABLE_CFLAG([-fno-common], [CFLAGS])
-else
+ ],
+ [
WFLAGS=""
WERRORFLAGS=""
-fi
+ ])
# ---------------------------------------------------------------------------
# FIXME We want to use libtool but until then....
@@ -382,7 +386,7 @@ LDFLAGS="$LDFLAGS $sanitizers"
# ---------------------------------------------------------------------------
-AC_OUTPUT(
- src/$host/Makefile:src/Makefile.in
+AC_CONFIG_FILES([src/$host/Makefile:src/Makefile.in
src/$host/eidefs.mk:src/eidefs.mk.in
- )
+ ])
+AC_OUTPUT
diff --git a/lib/erl_interface/doc/src/ei_connect.xml b/lib/erl_interface/doc/src/ei_connect.xml
index dc170780b6..390122ae94 100644
--- a/lib/erl_interface/doc/src/ei_connect.xml
+++ b/lib/erl_interface/doc/src/ei_connect.xml
@@ -165,7 +165,7 @@
<p>On success it should set <c>*ctx</c> to point to a context for
the created socket. This context will be passed to all other
socket callbacks. This function will be passed the same
- <c>setup_context</c> as passed to the preceeding
+ <c>setup_context</c> as passed to the preceding
<seecref marker="#ei_connect_init"><c>ei_connect_init_ussi()</c></seecref>
or
<seecref marker="#ei_connect_init"><c>ei_connect_xinit_ussi()</c></seecref>
@@ -192,8 +192,8 @@
<p>The <c>addr</c> and <c>len</c> arguments are both input and output
arguments. When called <c>addr</c> points to an address structure of
- lenght <c>*len</c> containing information on how to bind the socket.
- Uppon return this callback should have updated the structure referred
+ length <c>*len</c> containing information on how to bind the socket.
+ Upon return this callback should have updated the structure referred
by <c>addr</c> with information on how the socket actually was bound.
<c>*len</c> should be updated to reflect the size of <c>*addr</c>
updated. <c>backlog</c> identifies the size of the backlog for the
@@ -211,7 +211,7 @@
connection should be created and <c>*ctx</c> should be updated
to point to the new context for the accepted connection. When
called <c>addr</c> points to an uninitialized address structure
- of lenght <c>*len</c>. Uppon return this callback should have
+ of length <c>*len</c>. Upon return this callback should have
updated this structure with information about the client address.
<c>*len</c> should be updated to reflect the size of <c>*addr</c>
updated.
@@ -233,7 +233,7 @@
identified by <c>addr</c>.</p>
<p>When called <c>addr</c> points to an address structure of
- lenght <c>len</c> containing information on where to connect.</p>
+ length <c>len</c> containing information on where to connect.</p>
<p>If the <c>EI_SCLBK_FLG_FULL_IMPL</c> flag has been set,
<c>tmo</c> contains timeout time in milliseconds.</p>
@@ -541,10 +541,10 @@ fd = ei_xconnect(&ec, &addr, ALIVE);
</func>
<func>
- <name since=""><ret>int</ret><nametext>ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, short creation)</nametext></name>
- <name since="OTP 21.3"><ret>int</ret><nametext>ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie, short creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context)</nametext></name>
- <name since=""><ret>int</ret><nametext>ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename, const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, short creation)</nametext></name>
- <name since="OTP 21.3"><ret>int</ret><nametext>ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename, const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, short creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context)</nametext></name>
+ <name since=""><ret>int</ret><nametext>ei_connect_init(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation)</nametext></name>
+ <name since="OTP 21.3"><ret>int</ret><nametext>ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name, const char *cookie, unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context)</nametext></name>
+ <name since=""><ret>int</ret><nametext>ei_connect_xinit(ei_cnode* ec, const char *thishostname, const char *thisalivename, const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation)</nametext></name>
+ <name since="OTP 21.3"><ret>int</ret><nametext>ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname, const char *thisalivename, const char *thisnodename, Erl_IpAddr thisipaddr, const char *cookie, unsigned creation, ei_socket_callbacks *cbs, int cbs_sz, void *setup_context)</nametext></name>
<fsummary>Initialize for a connection.</fsummary>
<type>
<v><seecref marker="#ei_cnode"><c>ei_cnode</c></seecref></v>
@@ -573,7 +573,15 @@ fd = ei_xconnect(&ec, &addr, ALIVE);
<item>
<p><c>creation</c> identifies a specific instance of a
C-node. It can help prevent the node from receiving messages
- sent to an earlier process with the same registered name.</p>
+ sent to an earlier process with the same registered name.</p>
+ <note>
+ <p>
+ The type of the <c>creation</c> argument was changed from
+ <c>short</c> (16 bit) to <c>unsigned int</c> (32 bit) in OTP
+ 25. This should cause no practical problem other than maybe a
+ compiler warning.
+ </p>
+ </note>
</item>
<item>
<p><c>thishostname</c> is the name of the machine we are
@@ -620,7 +628,7 @@ fd = ei_xconnect(&ec, &addr, ALIVE);
occurred.</p>
<p><em>Example 1:</em></p>
<code type="none"><![CDATA[
-int n = 0;
+unsigned n = 0;
struct in_addr addr;
ei_cnode ec;
addr.s_addr = inet_addr("150.236.14.75");
diff --git a/lib/erl_interface/doc/src/ei_users_guide.xml b/lib/erl_interface/doc/src/ei_users_guide.xml
index 5c9452b516..f59449c420 100644
--- a/lib/erl_interface/doc/src/ei_users_guide.xml
+++ b/lib/erl_interface/doc/src/ei_users_guide.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2002</year><year>2020</year>
+ <year>2002</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -298,7 +298,7 @@ pub = ei_publish(ec, port); ]]></code>
explicitly close the descriptor or if your node fails, it becomes
unregistered from <c>epmd</c>.</p>
- <p>Notice that on some systems (such as VxWorks), a failed node is
+ <p>Notice that on some systems a failed node is
not detected by this mechanism, as the operating system does not
automatically close descriptors that were left open when the node
failed. If a node has failed in this way, <c>epmd</c>
diff --git a/lib/erl_interface/doc/src/notes.xml b/lib/erl_interface/doc/src/notes.xml
index 75c29257ab..45f04a7083 100644
--- a/lib/erl_interface/doc/src/notes.xml
+++ b/lib/erl_interface/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2021</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -2096,7 +2096,7 @@
</item>
<item>
<p>
- In <c>send_exit.c</c> an errorneous size of memory
+ In <c>send_exit.c</c> an erroneous size of memory
allocation could occur when reallocating a buffer.</p>
<p>
In <c>ei_decode_trace.c</c> the index could be updated
diff --git a/lib/erl_interface/include/ei.h b/lib/erl_interface/include/ei.h
index 84fad3f108..4876d93c30 100644
--- a/lib/erl_interface/include/ei.h
+++ b/lib/erl_interface/include/ei.h
@@ -397,20 +397,20 @@ typedef struct ei_x_buff_TAG {
/* Handle the connection */
int ei_connect_init(ei_cnode* ec, const char* this_node_name,
- const char *cookie, short creation);
+ const char *cookie, unsigned int creation);
int ei_connect_xinit (ei_cnode* ec, const char *thishostname,
const char *thisalivename, const char *thisnodename,
Erl_IpAddr thisipaddr, const char *cookie,
- const short creation);
+ unsigned int creation);
int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name,
- const char *cookie, short creation,
+ const char *cookie, unsigned int creation,
ei_socket_callbacks *cbs, int cbs_sz,
void *setup_context);
int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname,
const char *thisalivename, const char *thisnodename,
Erl_IpAddr thisipaddr, const char *cookie,
- const short creation, ei_socket_callbacks *cbs,
+ unsigned int creation, ei_socket_callbacks *cbs,
int cbs_sz, void *setup_context);
int ei_connect(ei_cnode* ec, char *nodename);
diff --git a/lib/erl_interface/src/Makefile b/lib/erl_interface/src/Makefile
index 6b5e2c1e61..9ca8310312 100644
--- a/lib/erl_interface/src/Makefile
+++ b/lib/erl_interface/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2020. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -26,12 +26,10 @@
include $(ERL_TOP)/make/output.mk
include $(ERL_TOP)/make/target.mk
-debug opt shared gcov:
+debug opt shared gcov lcnt valgrind asan:
ifndef TERTIARY_BOOTSTRAP
$(make_verbose)$(MAKE) -f $(TARGET)/Makefile TYPE=$@
endif
clean depend docs release release_docs tests release_tests check xmllint:
$(make_verbose)$(MAKE) -f $(TARGET)/Makefile $@
-
-lcnt:
diff --git a/lib/erl_interface/src/Makefile.in b/lib/erl_interface/src/Makefile.in
index 92459f6223..0a5ae800be 100644
--- a/lib/erl_interface/src/Makefile.in
+++ b/lib/erl_interface/src/Makefile.in
@@ -22,7 +22,7 @@
##
## This is a standalone make file for erl_interface. It is
## to be preprocessed by the configure script and the result
-## is saved into the TARGER directory.
+## is saved into the TARGET directory.
##
## We use 'vpath' to use plain C file names without the directory
## part in dependency rules.
@@ -405,7 +405,10 @@ MDD_EIOBJECTS = $(addprefix $(MDD_OBJDIR)/,$(notdir $(EISOURCES:.c=.o)))
# FIXME this assumes execution order
# FIXME move up and add exe prefix if needed....
-debug opt: $(TARGETS)
+opt: $(TARGETS)
+
+debug lcnt asan valgrind gcov:
+ @${MAKE} TYPE=$@
docs:
diff --git a/lib/erl_interface/src/README.internal b/lib/erl_interface/src/README.internal
index 51be1159d3..f0e27ec358 100644
--- a/lib/erl_interface/src/README.internal
+++ b/lib/erl_interface/src/README.internal
@@ -3,7 +3,7 @@
******************************************************************************
There are two different interfaces, the old 'erl_interface' and 'ei'.
-The old interface is to depend on the new one, not the other way arount.
+The old interface is to depend on the new one, not the other way around.
Erl_interface should be "thread safe", i.e. you should be able to
handle connections, convert data etc from different threads.
@@ -12,10 +12,6 @@ Ei should be "reentrant" or "async safe", i.e. no locks should be set
so that if an ei function is called inside an signal handler there
could be a deadlock.
-VxWorks call the operating processes "tasks". These are to be handled the
-same way as Unix threads, i.e. there can only be one C node for all tasks
-using the old interface.
-
Try to keep the documented functions, variables and symbols in sync
between
@@ -143,7 +139,7 @@ source. "eidef.h" contains some common constants and macros and
also includes config.h.
In general avoid including other header files from header files.
-The exception is to make the protoypes complete to the user of
+The exception is to make the prototypes complete to the user of
this library, i.e. to include <stdio.h> to defined FILE or
to include "ei_x_encode" to define the type ei_x_buff.
@@ -157,11 +153,11 @@ where size matters ;-) Use uint8 for buffers where we construct
messages.
NOTE!!!! Sending a "char" to macros like isupper(), isalpha() where
-the character is > 127 will cause serios problems on some
+the character is > 127 will cause serious problems on some
machines/OS. The reason is that
'char' may be unsigned, i.e. the Swedish char 'ä' will
- as a number be negativ.
+ as a number be negative.
The implementation of isupper() and others will on some
machines use an array that is indexed with the incoming
@@ -237,7 +233,7 @@ long" operations will create a dependency to a "hidden" library
libei.a[decode_longlong.o]: [6] | 0| 0|NOTY |GLOB |0 |UNDEF |__ashldi3
libei.a[decode_ulonglong.o]: [5] | 0| 0|NOTY |GLOB |0 |UNDEF |__ashldi3
-We can accept that a dependecy is created for code linked with
+We can accept that a dependency is created for code linked with
"libei.a" that actually use 'ei' long long functions. But if we
arrange the 'ei' source badly using a non "long long" functions from
'ei' will still link in an object file that need "libgcc.a". One
diff --git a/lib/erl_interface/src/auxdir/config.guess b/lib/erl_interface/src/auxdir/config.guess
deleted file mode 100755
index 1972fda8eb..0000000000
--- a/lib/erl_interface/src/auxdir/config.guess
+++ /dev/null
@@ -1,1700 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright 1992-2021 Free Software Foundation, Inc.
-
-timestamp='2021-01-25'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <https://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program. This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-#
-# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
-#
-# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
-#
-# Please send patches to <config-patches@gnu.org>.
-
-
-me=$(echo "$0" | sed -e 's,.*/,,')
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Options:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright 1992-2021 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-tmp=
-# shellcheck disable=SC2172
-trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
-
-set_cc_for_build() {
- # prevent multiple calls if $tmp is already set
- test "$tmp" && return 0
- : "${TMPDIR=/tmp}"
- # shellcheck disable=SC2039
- { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
- dummy=$tmp/dummy
- case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
- ,,) echo "int x;" > "$dummy.c"
- for driver in cc gcc c89 c99 ; do
- if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$driver"
- break
- fi
- done
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
- esac
-}
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if test -f /.attbin/uname ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown
-UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown
-UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown
-UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown
-
-case "$UNAME_SYSTEM" in
-Linux|GNU|GNU/*)
- LIBC=unknown
-
- set_cc_for_build
- cat <<-EOF > "$dummy.c"
- #include <features.h>
- #if defined(__UCLIBC__)
- LIBC=uclibc
- #elif defined(__dietlibc__)
- LIBC=dietlibc
- #elif defined(__GLIBC__)
- LIBC=gnu
- #else
- #include <stdarg.h>
- /* First heuristic to detect musl libc. */
- #ifdef __DEFINED_va_list
- LIBC=musl
- #endif
- #endif
- EOF
- eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"
-
- # Second heuristic to detect musl libc.
- if [ "$LIBC" = unknown ] &&
- command -v ldd >/dev/null &&
- ldd --version 2>&1 | grep -q ^musl; then
- LIBC=musl
- fi
-
- # If the system lacks a compiler, then just pick glibc.
- # We could probably try harder.
- if [ "$LIBC" = unknown ]; then
- LIBC=gnu
- fi
- ;;
-esac
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \
- /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
- /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
- echo unknown))
- case "$UNAME_MACHINE_ARCH" in
- aarch64eb) machine=aarch64_be-unknown ;;
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- sh5el) machine=sh5le-unknown ;;
- earmv*)
- arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,')
- endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p')
- machine="${arch}${endian}"-unknown
- ;;
- *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently (or will in the future) and ABI.
- case "$UNAME_MACHINE_ARCH" in
- earm*)
- os=netbsdelf
- ;;
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ELF__
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # Determine ABI tags.
- case "$UNAME_MACHINE_ARCH" in
- earm*)
- expr='s/^earmv[0-9]/-eabi/;s/eb$//'
- abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr")
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "$UNAME_VERSION" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2)
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "$machine-${os}${release}${abi-}"
- exit ;;
- *:Bitrig:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
- exit ;;
- *:LibertyBSD:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
- exit ;;
- *:MidnightBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
- exit ;;
- *:ekkoBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
- exit ;;
- *:SolidBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
- exit ;;
- *:OS108:*:*)
- echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
- *:MirBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
- *:Sortix:*:*)
- echo "$UNAME_MACHINE"-unknown-sortix
- exit ;;
- *:Twizzler:*:*)
- echo "$UNAME_MACHINE"-unknown-twizzler
- exit ;;
- *:Redox:*:*)
- echo "$UNAME_MACHINE"-unknown-redox
- exit ;;
- mips:OSF1:*.*)
- echo mips-dec-osf1
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')
- ;;
- *5.*)
- UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1)
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE=alpha ;;
- "EV4.5 (21064)")
- UNAME_MACHINE=alpha ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE=alpha ;;
- "EV5 (21164)")
- UNAME_MACHINE=alphaev5 ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE=alphaev56 ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE=alphapca56 ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE=alphapca57 ;;
- "EV6 (21264)")
- UNAME_MACHINE=alphaev6 ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE=alphaev67 ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE=alphaev69 ;;
- "EV7 (21364)")
- UNAME_MACHINE=alphaev7 ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE=alphaev79 ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"
- # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
- exitcode=$?
- trap '' 0
- exit $exitcode ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix"$UNAME_RELEASE"
- exit ;;
- arm*:riscos:*:*|arm*:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "$( (/bin/universe) 2>/dev/null)" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case $(/usr/bin/uname -p) in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- s390x:SunOS:*:*)
- echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
- exit ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
- exit ;;
- i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux"$UNAME_RELEASE"
- exit ;;
- i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- set_cc_for_build
- SUN_ARCH=i386
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH=x86_64
- fi
- fi
- echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:*:*)
- case "$(/usr/bin/arch -k)" in
- Series*|S4*)
- UNAME_RELEASE=$(uname -v)
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos"$UNAME_RELEASE"
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)
- test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
- case "$(/bin/arch)" in
- sun3)
- echo m68k-sun-sunos"$UNAME_RELEASE"
- ;;
- sun4)
- echo sparc-sun-sunos"$UNAME_RELEASE"
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos"$UNAME_RELEASE"
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint"$UNAME_RELEASE"
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint"$UNAME_RELEASE"
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint"$UNAME_RELEASE"
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten"$UNAME_RELEASE"
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten"$UNAME_RELEASE"
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix"$UNAME_RELEASE"
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix"$UNAME_RELEASE"
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix"$UNAME_RELEASE"
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
- dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&
- SYSTEM_NAME=$("$dummy" "$dummyarg") &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos"$UNAME_RELEASE"
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=$(/usr/bin/uname -p)
- if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
- then
- if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
- test "$TARGET_BINARY_INTERFACE"x = x
- then
- echo m88k-dg-dgux"$UNAME_RELEASE"
- else
- echo m88k-dg-dguxbcs"$UNAME_RELEASE"
- fi
- else
- echo i586-dg-dgux"$UNAME_RELEASE"
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if test -x /usr/bin/oslevel ; then
- IBM_REV=$(/usr/bin/oslevel)
- else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
- fi
- echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[4567])
- IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')
- if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if test -x /usr/bin/lslpp ; then
- IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |
- awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)
- else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
- fi
- echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
- case "$UNAME_MACHINE" in
- 9000/31?) HP_ARCH=m68000 ;;
- 9000/[34]??) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if test -x /usr/bin/getconf; then
- sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)
- sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)
- case "$sc_cpu_version" in
- 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
- 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "$sc_kernel_bits" in
- 32) HP_ARCH=hppa2.0n ;;
- 64) HP_ARCH=hppa2.0w ;;
- '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if test "$HP_ARCH" = ""; then
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if test "$HP_ARCH" = hppa2.0w
- then
- set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
- grep -q __LP64__
- then
- HP_ARCH=hppa2.0w
- else
- HP_ARCH=hppa64
- fi
- fi
- echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
- echo ia64-hp-hpux"$HPUX_REV"
- exit ;;
- 3050*:HI-UX:*:*)
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if test -x /usr/sbin/sysversion ; then
- echo "$UNAME_MACHINE"-unknown-osf1mk
- else
- echo "$UNAME_MACHINE"-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
- FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
- FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
- FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
- *:BSD/OS:*:*)
- echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
- arm:FreeBSD:*:*)
- UNAME_PROCESSOR=$(uname -p)
- set_cc_for_build
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi
- else
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf
- fi
- exit ;;
- *:FreeBSD:*:*)
- UNAME_PROCESSOR=$(/usr/bin/uname -p)
- case "$UNAME_PROCESSOR" in
- amd64)
- UNAME_PROCESSOR=x86_64 ;;
- i386)
- UNAME_PROCESSOR=i586 ;;
- esac
- echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
- exit ;;
- i*:CYGWIN*:*)
- echo "$UNAME_MACHINE"-pc-cygwin
- exit ;;
- *:MINGW64*:*)
- echo "$UNAME_MACHINE"-pc-mingw64
- exit ;;
- *:MINGW*:*)
- echo "$UNAME_MACHINE"-pc-mingw32
- exit ;;
- *:MSYS*:*)
- echo "$UNAME_MACHINE"-pc-msys
- exit ;;
- i*:PW*:*)
- echo "$UNAME_MACHINE"-pc-pw32
- exit ;;
- *:Interix*:*)
- case "$UNAME_MACHINE" in
- x86)
- echo i586-pc-interix"$UNAME_RELEASE"
- exit ;;
- authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix"$UNAME_RELEASE"
- exit ;;
- IA64)
- echo ia64-unknown-interix"$UNAME_RELEASE"
- exit ;;
- esac ;;
- i*:UWIN*:*)
- echo "$UNAME_MACHINE"-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-pc-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"
- exit ;;
- *:Minix:*:*)
- echo "$UNAME_MACHINE"-unknown-minix
- exit ;;
- aarch64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- aarch64_be:Linux:*:*)
- UNAME_MACHINE=aarch64_be
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- alpha:Linux:*:*)
- case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- arc:Linux:*:* | arceb:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- arm*:Linux:*:*)
- set_cc_for_build
- if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_EABI__
- then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- else
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
- else
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
- fi
- fi
- exit ;;
- avr32*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- cris:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
- crisv32:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
- e2k:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- frv:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- hexagon:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- i*86:Linux:*:*)
- echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
- exit ;;
- ia64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- k1om:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- m32r*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- m68*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- mips:Linux:*:* | mips64:Linux:*:*)
- set_cc_for_build
- IS_GLIBC=0
- test x"${LIBC}" = xgnu && IS_GLIBC=1
- sed 's/^ //' << EOF > "$dummy.c"
- #undef CPU
- #undef mips
- #undef mipsel
- #undef mips64
- #undef mips64el
- #if ${IS_GLIBC} && defined(_ABI64)
- LIBCABI=gnuabi64
- #else
- #if ${IS_GLIBC} && defined(_ABIN32)
- LIBCABI=gnuabin32
- #else
- LIBCABI=${LIBC}
- #endif
- #endif
-
- #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
- CPU=mipsisa64r6
- #else
- #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
- CPU=mipsisa32r6
- #else
- #if defined(__mips64)
- CPU=mips64
- #else
- CPU=mips
- #endif
- #endif
- #endif
-
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- MIPS_ENDIAN=el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- MIPS_ENDIAN=
- #else
- MIPS_ENDIAN=
- #endif
- #endif
-EOF
- eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"
- test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
- ;;
- mips64el:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- openrisc*:Linux:*:*)
- echo or1k-unknown-linux-"$LIBC"
- exit ;;
- or32:Linux:*:* | or1k*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- padre:Linux:*:*)
- echo sparc-unknown-linux-"$LIBC"
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-"$LIBC"
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in
- PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
- PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
- *) echo hppa-unknown-linux-"$LIBC" ;;
- esac
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-"$LIBC"
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-"$LIBC"
- exit ;;
- ppc64le:Linux:*:*)
- echo powerpc64le-unknown-linux-"$LIBC"
- exit ;;
- ppcle:Linux:*:*)
- echo powerpcle-unknown-linux-"$LIBC"
- exit ;;
- riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
- exit ;;
- sh64*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- sh*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- tile*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- vax:Linux:*:*)
- echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
- exit ;;
- x86_64:Linux:*:*)
- set_cc_for_build
- LIBCABI=$LIBC
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_X32 >/dev/null
- then
- LIBCABI="$LIBC"x32
- fi
- fi
- echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI"
- exit ;;
- xtensa*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo "$UNAME_MACHINE"-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo "$UNAME_MACHINE"-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo "$UNAME_MACHINE"-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo "$UNAME_MACHINE"-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- i*86:*DOS:*:*)
- echo "$UNAME_MACHINE"-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:*)
- UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
- else
- echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case $(/bin/uname -X | grep "^Machine") in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)
- echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
- else
- echo "$UNAME_MACHINE"-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
- # Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configure will decide that
- # this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- NCR*:*:4.2:* | MPRAS*:*:4.2:*)
- OS_REL='.3'
- test -r /etc/.relid \
- && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv"$UNAME_RELEASE"
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=$( (uname -p) 2>/dev/null)
- echo "$UNAME_MACHINE"-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes@openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo "$UNAME_MACHINE"-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux"$UNAME_RELEASE"
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if test -d /usr/nec; then
- echo mips-nec-sysv"$UNAME_RELEASE"
- else
- echo mips-unknown-sysv"$UNAME_RELEASE"
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
- x86_64:Haiku:*:*)
- echo x86_64-unknown-haiku
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-ACE:SUPER-UX:*:*)
- echo sxace-nec-superux"$UNAME_RELEASE"
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
- *:Rhapsody:*:*)
- echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
- arm64:Darwin:*:*)
- echo aarch64-apple-darwin"$UNAME_RELEASE"
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=$(uname -p)
- case $UNAME_PROCESSOR in
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- if command -v xcode-select > /dev/null 2> /dev/null && \
- ! xcode-select --print-path > /dev/null 2> /dev/null ; then
- # Avoid executing cc if there is no toolchain installed as
- # cc will be a stub that puts up a graphical alert
- # prompting the user to install developer tools.
- CC_FOR_BUILD=no_compiler_found
- else
- set_cc_for_build
- fi
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- case $UNAME_PROCESSOR in
- i386) UNAME_PROCESSOR=x86_64 ;;
- powerpc) UNAME_PROCESSOR=powerpc64 ;;
- esac
- fi
- # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
- if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_PPC >/dev/null
- then
- UNAME_PROCESSOR=powerpc
- fi
- elif test "$UNAME_PROCESSOR" = i386 ; then
- # uname -m returns i386 or x86_64
- UNAME_PROCESSOR=$UNAME_MACHINE
- fi
- echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=$(uname -p)
- if test "$UNAME_PROCESSOR" = x86; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NEO-*:NONSTOP_KERNEL:*:*)
- echo neo-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSE-*:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSR-*:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSV-*:NONSTOP_KERNEL:*:*)
- echo nsv-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSX-*:NONSTOP_KERNEL:*:*)
- echo nsx-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- # shellcheck disable=SC2154
- if test "$cputype" = 386; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo "$UNAME_MACHINE"-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux"$UNAME_RELEASE"
- exit ;;
- *:DragonFly:*:*)
- echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=$( (uname -p) 2>/dev/null)
- case "$UNAME_MACHINE" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"
- exit ;;
- i*86:rdos:*:*)
- echo "$UNAME_MACHINE"-pc-rdos
- exit ;;
- *:AROS:*:*)
- echo "$UNAME_MACHINE"-unknown-aros
- exit ;;
- x86_64:VMkernel:*:*)
- echo "$UNAME_MACHINE"-unknown-esx
- exit ;;
- amd64:Isilon\ OneFS:*:*)
- echo x86_64-unknown-onefs
- exit ;;
- *:Unleashed:*:*)
- echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
- exit ;;
-esac
-
-# No uname command or uname output not recognized.
-set_cc_for_build
-cat > "$dummy.c" <<EOF
-#ifdef _SEQUENT_
-#include <sys/types.h>
-#include <sys/utsname.h>
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#include <signal.h>
-#if defined(_SIZE_T_) || defined(SIGLOST)
-#include <sys/utsname.h>
-#endif
-#endif
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null);
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-#endif
-
-#if defined (vax)
-#if !defined (ultrix)
-#include <sys/param.h>
-#if defined (BSD)
-#if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-#else
-#if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#else
- printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#endif
-#else
- printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#else
-#if defined(_SIZE_T_) || defined(SIGLOST)
- struct utsname un;
- uname (&un);
- printf ("vax-dec-ultrix%s\n", un.release); exit (0);
-#else
- printf ("vax-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#if defined(_SIZE_T_) || defined(SIGLOST)
- struct utsname *un;
- uname (&un);
- printf ("mips-dec-ultrix%s\n", un.release); exit (0);
-#else
- printf ("mips-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
-
-echo "$0: unable to guess system type" >&2
-
-case "$UNAME_MACHINE:$UNAME_SYSTEM" in
- mips:Linux | mips64:Linux)
- # If we got here on MIPS GNU/Linux, output extra information.
- cat >&2 <<EOF
-
-NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
-the system type. Please install a C compiler and try again.
-EOF
- ;;
-esac
-
-cat >&2 <<EOF
-
-This script (version $timestamp), has failed to recognize the
-operating system you are using. If your script is old, overwrite *all*
-copies of config.guess and config.sub with the latest versions from:
-
- https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
-and
- https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
-EOF
-
-year=$(echo $timestamp | sed 's,-.*,,')
-# shellcheck disable=SC2003
-if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then
- cat >&2 <<EOF
-
-If $0 has already been updated, send the following data and any
-information you think might be pertinent to config-patches@gnu.org to
-provide the necessary information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = $( (uname -m) 2>/dev/null || echo unknown)
-uname -r = $( (uname -r) 2>/dev/null || echo unknown)
-uname -s = $( (uname -s) 2>/dev/null || echo unknown)
-uname -v = $( (uname -v) 2>/dev/null || echo unknown)
-
-/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)
-/bin/uname -X = $( (/bin/uname -X) 2>/dev/null)
-
-hostinfo = $( (hostinfo) 2>/dev/null)
-/bin/universe = $( (/bin/universe) 2>/dev/null)
-/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null)
-/bin/arch = $( (/bin/arch) 2>/dev/null)
-/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null)
-/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)
-
-UNAME_MACHINE = "$UNAME_MACHINE"
-UNAME_RELEASE = "$UNAME_RELEASE"
-UNAME_SYSTEM = "$UNAME_SYSTEM"
-UNAME_VERSION = "$UNAME_VERSION"
-EOF
-fi
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/lib/erl_interface/src/auxdir/config.sub b/lib/erl_interface/src/auxdir/config.sub
deleted file mode 100755
index 63c1f1c8b5..0000000000
--- a/lib/erl_interface/src/auxdir/config.sub
+++ /dev/null
@@ -1,1860 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright 1992-2021 Free Software Foundation, Inc.
-
-timestamp='2021-01-08'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <https://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program. This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-
-
-# Please send patches to <config-patches@gnu.org>.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=$(echo "$0" | sed -e 's,.*/,,')
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
-
-Canonicalize a configuration name.
-
-Options:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright 1992-2021 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo "$1"
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Split fields of configuration type
-# shellcheck disable=SC2162
-IFS="-" read field1 field2 field3 field4 <<EOF
-$1
-EOF
-
-# Separate into logical components for further validation
-case $1 in
- *-*-*-*-*)
- echo Invalid configuration \`"$1"\': more than four components >&2
- exit 1
- ;;
- *-*-*-*)
- basic_machine=$field1-$field2
- basic_os=$field3-$field4
- ;;
- *-*-*)
- # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
- # parts
- maybe_os=$field2-$field3
- case $maybe_os in
- nto-qnx* | linux-* | uclinux-uclibc* \
- | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
- | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
- | storm-chaos* | os2-emx* | rtmk-nova*)
- basic_machine=$field1
- basic_os=$maybe_os
- ;;
- android-linux)
- basic_machine=$field1-unknown
- basic_os=linux-android
- ;;
- *)
- basic_machine=$field1-$field2
- basic_os=$field3
- ;;
- esac
- ;;
- *-*)
- # A lone config we happen to match not fitting any pattern
- case $field1-$field2 in
- decstation-3100)
- basic_machine=mips-dec
- basic_os=
- ;;
- *-*)
- # Second component is usually, but not always the OS
- case $field2 in
- # Prevent following clause from handling this valid os
- sun*os*)
- basic_machine=$field1
- basic_os=$field2
- ;;
- # Manufacturers
- dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
- | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
- | unicom* | ibm* | next | hp | isi* | apollo | altos* \
- | convergent* | ncr* | news | 32* | 3600* | 3100* \
- | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
- | ultra | tti* | harris | dolphin | highlevel | gould \
- | cbm | ns | masscomp | apple | axis | knuth | cray \
- | microblaze* | sim | cisco \
- | oki | wec | wrs | winbond)
- basic_machine=$field1-$field2
- basic_os=
- ;;
- *)
- basic_machine=$field1
- basic_os=$field2
- ;;
- esac
- ;;
- esac
- ;;
- *)
- # Convert single-component short-hands not valid as part of
- # multi-component configurations.
- case $field1 in
- 386bsd)
- basic_machine=i386-pc
- basic_os=bsd
- ;;
- a29khif)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- basic_os=scout
- ;;
- alliant)
- basic_machine=fx80-alliant
- basic_os=
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- basic_os=
- ;;
- am29k)
- basic_machine=a29k-none
- basic_os=bsd
- ;;
- amdahl)
- basic_machine=580-amdahl
- basic_os=sysv
- ;;
- amiga)
- basic_machine=m68k-unknown
- basic_os=
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- basic_os=amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- basic_os=sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- basic_os=sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- basic_os=bsd
- ;;
- aros)
- basic_machine=i386-pc
- basic_os=aros
- ;;
- aux)
- basic_machine=m68k-apple
- basic_os=aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- basic_os=dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- basic_os=linux
- ;;
- cegcc)
- basic_machine=arm-unknown
- basic_os=cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- basic_os=bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- basic_os=bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- basic_os=bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- basic_os=bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- basic_os=bsd
- ;;
- cray)
- basic_machine=j90-cray
- basic_os=unicos
- ;;
- crds | unos)
- basic_machine=m68k-crds
- basic_os=
- ;;
- da30)
- basic_machine=m68k-da30
- basic_os=
- ;;
- decstation | pmax | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- basic_os=
- ;;
- delta88)
- basic_machine=m88k-motorola
- basic_os=sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- basic_os=dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- basic_os=msdosdjgpp
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- basic_os=ebmon
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- basic_os=ose
- ;;
- gmicro)
- basic_machine=tron-gmicro
- basic_os=sysv
- ;;
- go32)
- basic_machine=i386-pc
- basic_os=go32
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- basic_os=hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- basic_os=xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- basic_os=hms
- ;;
- harris)
- basic_machine=m88k-harris
- basic_os=sysv3
- ;;
- hp300 | hp300hpux)
- basic_machine=m68k-hp
- basic_os=hpux
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- basic_os=bsd
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- basic_os=osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- basic_os=proelf
- ;;
- i386mach)
- basic_machine=i386-mach
- basic_os=mach
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- basic_os=sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- basic_os=linux
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- basic_os=sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- basic_os=sysv
- ;;
- mingw64)
- basic_machine=x86_64-pc
- basic_os=mingw64
- ;;
- mingw32)
- basic_machine=i686-pc
- basic_os=mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- basic_os=mingw32ce
- ;;
- monitor)
- basic_machine=m68k-rom68k
- basic_os=coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- basic_os=morphos
- ;;
- moxiebox)
- basic_machine=moxie-unknown
- basic_os=moxiebox
- ;;
- msdos)
- basic_machine=i386-pc
- basic_os=msdos
- ;;
- msys)
- basic_machine=i686-pc
- basic_os=msys
- ;;
- mvs)
- basic_machine=i370-ibm
- basic_os=mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- basic_os=nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- basic_os=sysv4
- ;;
- netbsd386)
- basic_machine=i386-pc
- basic_os=netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- basic_os=linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- basic_os=newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- basic_os=newsos
- ;;
- necv70)
- basic_machine=v70-nec
- basic_os=sysv
- ;;
- nh3000)
- basic_machine=m68k-harris
- basic_os=cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- basic_os=cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- basic_os=nindy
- ;;
- mon960)
- basic_machine=i960-intel
- basic_os=mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- basic_os=nonstopux
- ;;
- os400)
- basic_machine=powerpc-ibm
- basic_os=os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- basic_os=ose
- ;;
- os68k)
- basic_machine=m68k-none
- basic_os=os68k
- ;;
- paragon)
- basic_machine=i860-intel
- basic_os=osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- basic_os=linux
- ;;
- psp)
- basic_machine=mipsallegrexel-sony
- basic_os=psp
- ;;
- pw32)
- basic_machine=i586-unknown
- basic_os=pw32
- ;;
- rdos | rdos64)
- basic_machine=x86_64-pc
- basic_os=rdos
- ;;
- rdos32)
- basic_machine=i386-pc
- basic_os=rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- basic_os=coff
- ;;
- sa29200)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- sei)
- basic_machine=mips-sei
- basic_os=seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- basic_os=
- ;;
- sps7)
- basic_machine=m68k-bull
- basic_os=sysv2
- ;;
- st2000)
- basic_machine=m68k-tandem
- basic_os=
- ;;
- stratus)
- basic_machine=i860-stratus
- basic_os=sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- basic_os=
- ;;
- sun2os3)
- basic_machine=m68000-sun
- basic_os=sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- basic_os=sunos4
- ;;
- sun3)
- basic_machine=m68k-sun
- basic_os=
- ;;
- sun3os3)
- basic_machine=m68k-sun
- basic_os=sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- basic_os=sunos4
- ;;
- sun4)
- basic_machine=sparc-sun
- basic_os=
- ;;
- sun4os3)
- basic_machine=sparc-sun
- basic_os=sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- basic_os=sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- basic_os=solaris2
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- basic_os=
- ;;
- sv1)
- basic_machine=sv1-cray
- basic_os=unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- basic_os=dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- basic_os=unicos
- ;;
- t90)
- basic_machine=t90-cray
- basic_os=unicos
- ;;
- toad1)
- basic_machine=pdp10-xkl
- basic_os=tops20
- ;;
- tpf)
- basic_machine=s390x-ibm
- basic_os=tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- basic_os=sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- basic_os=none
- ;;
- vaxv)
- basic_machine=vax-dec
- basic_os=sysv
- ;;
- vms)
- basic_machine=vax-dec
- basic_os=vms
- ;;
- vsta)
- basic_machine=i386-pc
- basic_os=vsta
- ;;
- vxworks960)
- basic_machine=i960-wrs
- basic_os=vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- basic_os=vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- basic_os=vxworks
- ;;
- xbox)
- basic_machine=i686-pc
- basic_os=mingw32
- ;;
- ymp)
- basic_machine=ymp-cray
- basic_os=unicos
- ;;
- *)
- basic_machine=$1
- basic_os=
- ;;
- esac
- ;;
-esac
-
-# Decode 1-component or ad-hoc basic machines
-case $basic_machine in
- # Here we handle the default manufacturer of certain CPU types. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- w89k)
- cpu=hppa1.1
- vendor=winbond
- ;;
- op50n)
- cpu=hppa1.1
- vendor=oki
- ;;
- op60c)
- cpu=hppa1.1
- vendor=oki
- ;;
- ibm*)
- cpu=i370
- vendor=ibm
- ;;
- orion105)
- cpu=clipper
- vendor=highlevel
- ;;
- mac | mpw | mac-mpw)
- cpu=m68k
- vendor=apple
- ;;
- pmac | pmac-mpw)
- cpu=powerpc
- vendor=apple
- ;;
-
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- cpu=m68000
- vendor=att
- ;;
- 3b*)
- cpu=we32k
- vendor=att
- ;;
- bluegene*)
- cpu=powerpc
- vendor=ibm
- basic_os=cnk
- ;;
- decsystem10* | dec10*)
- cpu=pdp10
- vendor=dec
- basic_os=tops10
- ;;
- decsystem20* | dec20*)
- cpu=pdp10
- vendor=dec
- basic_os=tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- cpu=m68k
- vendor=motorola
- ;;
- dpx2*)
- cpu=m68k
- vendor=bull
- basic_os=sysv3
- ;;
- encore | umax | mmax)
- cpu=ns32k
- vendor=encore
- ;;
- elxsi)
- cpu=elxsi
- vendor=elxsi
- basic_os=${basic_os:-bsd}
- ;;
- fx2800)
- cpu=i860
- vendor=alliant
- ;;
- genix)
- cpu=ns32k
- vendor=ns
- ;;
- h3050r* | hiux*)
- cpu=hppa1.1
- vendor=hitachi
- basic_os=hiuxwe2
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- cpu=m68000
- vendor=hp
- ;;
- hp9k3[2-9][0-9])
- cpu=m68k
- vendor=hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- i*86v32)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv32
- ;;
- i*86v4*)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv4
- ;;
- i*86v)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv
- ;;
- i*86sol2)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=solaris2
- ;;
- j90 | j90-cray)
- cpu=j90
- vendor=cray
- basic_os=${basic_os:-unicos}
- ;;
- iris | iris4d)
- cpu=mips
- vendor=sgi
- case $basic_os in
- irix*)
- ;;
- *)
- basic_os=irix4
- ;;
- esac
- ;;
- miniframe)
- cpu=m68000
- vendor=convergent
- ;;
- *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
- cpu=m68k
- vendor=atari
- basic_os=mint
- ;;
- news-3600 | risc-news)
- cpu=mips
- vendor=sony
- basic_os=newsos
- ;;
- next | m*-next)
- cpu=m68k
- vendor=next
- case $basic_os in
- openstep*)
- ;;
- nextstep*)
- ;;
- ns2*)
- basic_os=nextstep2
- ;;
- *)
- basic_os=nextstep3
- ;;
- esac
- ;;
- np1)
- cpu=np1
- vendor=gould
- ;;
- op50n-* | op60c-*)
- cpu=hppa1.1
- vendor=oki
- basic_os=proelf
- ;;
- pa-hitachi)
- cpu=hppa1.1
- vendor=hitachi
- basic_os=hiuxwe2
- ;;
- pbd)
- cpu=sparc
- vendor=tti
- ;;
- pbb)
- cpu=m68k
- vendor=tti
- ;;
- pc532)
- cpu=ns32k
- vendor=pc532
- ;;
- pn)
- cpu=pn
- vendor=gould
- ;;
- power)
- cpu=power
- vendor=ibm
- ;;
- ps2)
- cpu=i386
- vendor=ibm
- ;;
- rm[46]00)
- cpu=mips
- vendor=siemens
- ;;
- rtpc | rtpc-*)
- cpu=romp
- vendor=ibm
- ;;
- sde)
- cpu=mipsisa32
- vendor=sde
- basic_os=${basic_os:-elf}
- ;;
- simso-wrs)
- cpu=sparclite
- vendor=wrs
- basic_os=vxworks
- ;;
- tower | tower-32)
- cpu=m68k
- vendor=ncr
- ;;
- vpp*|vx|vx-*)
- cpu=f301
- vendor=fujitsu
- ;;
- w65)
- cpu=w65
- vendor=wdc
- ;;
- w89k-*)
- cpu=hppa1.1
- vendor=winbond
- basic_os=proelf
- ;;
- none)
- cpu=none
- vendor=none
- ;;
- leon|leon[3-9])
- cpu=sparc
- vendor=$basic_machine
- ;;
- leon-*|leon[3-9]-*)
- cpu=sparc
- vendor=$(echo "$basic_machine" | sed 's/-.*//')
- ;;
-
- *-*)
- # shellcheck disable=SC2162
- IFS="-" read cpu vendor <<EOF
-$basic_machine
-EOF
- ;;
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- cpu=$basic_machine
- vendor=pc
- ;;
- # These rules are duplicated from below for sake of the special case above;
- # i.e. things that normalized to x86 arches should also default to "pc"
- pc98)
- cpu=i386
- vendor=pc
- ;;
- x64 | amd64)
- cpu=x86_64
- vendor=pc
- ;;
- # Recognize the basic CPU types without company name.
- *)
- cpu=$basic_machine
- vendor=unknown
- ;;
-esac
-
-unset -v basic_machine
-
-# Decode basic machines in the full and proper CPU-Company form.
-case $cpu-$vendor in
- # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- craynv-unknown)
- vendor=cray
- basic_os=${basic_os:-unicosmp}
- ;;
- c90-unknown | c90-cray)
- vendor=cray
- basic_os=${Basic_os:-unicos}
- ;;
- fx80-unknown)
- vendor=alliant
- ;;
- romp-unknown)
- vendor=ibm
- ;;
- mmix-unknown)
- vendor=knuth
- ;;
- microblaze-unknown | microblazeel-unknown)
- vendor=xilinx
- ;;
- rs6000-unknown)
- vendor=ibm
- ;;
- vax-unknown)
- vendor=dec
- ;;
- pdp11-unknown)
- vendor=dec
- ;;
- we32k-unknown)
- vendor=att
- ;;
- cydra-unknown)
- vendor=cydrome
- ;;
- i370-ibm*)
- vendor=ibm
- ;;
- orion-unknown)
- vendor=highlevel
- ;;
- xps-unknown | xps100-unknown)
- cpu=xps100
- vendor=honeywell
- ;;
-
- # Here we normalize CPU types with a missing or matching vendor
- dpx20-unknown | dpx20-bull)
- cpu=rs6000
- vendor=bull
- basic_os=${basic_os:-bosx}
- ;;
-
- # Here we normalize CPU types irrespective of the vendor
- amd64-*)
- cpu=x86_64
- ;;
- blackfin-*)
- cpu=bfin
- basic_os=linux
- ;;
- c54x-*)
- cpu=tic54x
- ;;
- c55x-*)
- cpu=tic55x
- ;;
- c6x-*)
- cpu=tic6x
- ;;
- e500v[12]-*)
- cpu=powerpc
- basic_os=${basic_os}"spe"
- ;;
- mips3*-*)
- cpu=mips64
- ;;
- ms1-*)
- cpu=mt
- ;;
- m68knommu-*)
- cpu=m68k
- basic_os=linux
- ;;
- m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
- cpu=s12z
- ;;
- openrisc-*)
- cpu=or32
- ;;
- parisc-*)
- cpu=hppa
- basic_os=linux
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- cpu=i586
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
- cpu=i686
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- cpu=i686
- ;;
- pentium4-*)
- cpu=i786
- ;;
- pc98-*)
- cpu=i386
- ;;
- ppc-* | ppcbe-*)
- cpu=powerpc
- ;;
- ppcle-* | powerpclittle-*)
- cpu=powerpcle
- ;;
- ppc64-*)
- cpu=powerpc64
- ;;
- ppc64le-* | powerpc64little-*)
- cpu=powerpc64le
- ;;
- sb1-*)
- cpu=mipsisa64sb1
- ;;
- sb1el-*)
- cpu=mipsisa64sb1el
- ;;
- sh5e[lb]-*)
- cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')
- ;;
- spur-*)
- cpu=spur
- ;;
- strongarm-* | thumb-*)
- cpu=arm
- ;;
- tx39-*)
- cpu=mipstx39
- ;;
- tx39el-*)
- cpu=mipstx39el
- ;;
- x64-*)
- cpu=x86_64
- ;;
- xscale-* | xscalee[bl]-*)
- cpu=$(echo "$cpu" | sed 's/^xscale/arm/')
- ;;
- arm64-*)
- cpu=aarch64
- ;;
-
- # Recognize the canonical CPU Types that limit and/or modify the
- # company names they are paired with.
- cr16-*)
- basic_os=${basic_os:-elf}
- ;;
- crisv32-* | etraxfs*-*)
- cpu=crisv32
- vendor=axis
- ;;
- cris-* | etrax*-*)
- cpu=cris
- vendor=axis
- ;;
- crx-*)
- basic_os=${basic_os:-elf}
- ;;
- neo-tandem)
- cpu=neo
- vendor=tandem
- ;;
- nse-tandem)
- cpu=nse
- vendor=tandem
- ;;
- nsr-tandem)
- cpu=nsr
- vendor=tandem
- ;;
- nsv-tandem)
- cpu=nsv
- vendor=tandem
- ;;
- nsx-tandem)
- cpu=nsx
- vendor=tandem
- ;;
- mipsallegrexel-sony)
- cpu=mipsallegrexel
- vendor=sony
- ;;
- tile*-*)
- basic_os=${basic_os:-linux-gnu}
- ;;
-
- *)
- # Recognize the canonical CPU types that are allowed with any
- # company name.
- case $cpu in
- 1750a | 580 \
- | a29k \
- | aarch64 | aarch64_be \
- | abacus \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
- | alphapca5[67] | alpha64pca5[67] \
- | am33_2.0 \
- | amdgcn \
- | arc | arceb \
- | arm | arm[lb]e | arme[lb] | armv* \
- | avr | avr32 \
- | asmjs \
- | ba \
- | be32 | be64 \
- | bfin | bpf | bs2000 \
- | c[123]* | c30 | [cjt]90 | c4x \
- | c8051 | clipper | craynv | csky | cydra \
- | d10v | d30v | dlx | dsp16xx \
- | e2k | elxsi | epiphany \
- | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
- | h8300 | h8500 \
- | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i*86 | i860 | i960 | ia16 | ia64 \
- | ip2k | iq2000 \
- | k1om \
- | le32 | le64 \
- | lm32 \
- | loongarch32 | loongarch64 | loongarchx32 \
- | m32c | m32r | m32rle \
- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
- | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
- | m88110 | m88k | maxq | mb | mcore | mep | metag \
- | microblaze | microblazeel \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64eb | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa32r6 | mipsisa32r6el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64r6 | mipsisa64r6el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipsr5900 | mipsr5900el \
- | mipstx39 | mipstx39el \
- | mmix \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nfp \
- | nios | nios2 | nios2eb | nios2el \
- | none | np1 | ns16k | ns32k | nvptx \
- | open8 \
- | or1k* \
- | or32 \
- | orion \
- | picochip \
- | pdp10 | pdp11 | pj | pjl | pn | power \
- | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
- | pru \
- | pyramid \
- | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
- | rl78 | romp | rs6000 | rx \
- | s390 | s390x \
- | score \
- | sh | shl \
- | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
- | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
- | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
- | spu \
- | tahoe \
- | thumbv7* \
- | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
- | tron \
- | ubicom32 \
- | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
- | vax \
- | visium \
- | w65 \
- | wasm32 | wasm64 \
- | we32k \
- | x86 | x86_64 | xc16x | xgate | xps100 \
- | xstormy16 | xtensa* \
- | ymp \
- | z8k | z80)
- ;;
-
- *)
- echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
- exit 1
- ;;
- esac
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $vendor in
- digital*)
- vendor=dec
- ;;
- commodore*)
- vendor=cbm
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if test x$basic_os != x
-then
-
-# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
-# set os.
-case $basic_os in
- gnu/linux*)
- kernel=linux
- os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')
- ;;
- os2-emx)
- kernel=os2
- os=$(echo $basic_os | sed -e 's|os2-emx|emx|')
- ;;
- nto-qnx*)
- kernel=nto
- os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')
- ;;
- *-*)
- # shellcheck disable=SC2162
- IFS="-" read kernel os <<EOF
-$basic_os
-EOF
- ;;
- # Default OS when just kernel was specified
- nto*)
- kernel=nto
- os=$(echo $basic_os | sed -e 's|nto|qnx|')
- ;;
- linux*)
- kernel=linux
- os=$(echo $basic_os | sed -e 's|linux|gnu|')
- ;;
- *)
- kernel=
- os=$basic_os
- ;;
-esac
-
-# Now, normalize the OS (knowing we just have one component, it's not a kernel,
-# etc.)
-case $os in
- # First match some system type aliases that might get confused
- # with valid system types.
- # solaris* is a basic system type, with this one exception.
- auroraux)
- os=auroraux
- ;;
- bluegene*)
- os=cnk
- ;;
- solaris1 | solaris1.*)
- os=$(echo $os | sed -e 's|solaris1|sunos4|')
- ;;
- solaris)
- os=solaris2
- ;;
- unixware*)
- os=sysv4.2uw
- ;;
- # es1800 is here to avoid being matched by es* (a different OS)
- es1800*)
- os=ose
- ;;
- # Some version numbers need modification
- chorusos*)
- os=chorusos
- ;;
- isc)
- os=isc2.2
- ;;
- sco6)
- os=sco5v6
- ;;
- sco5)
- os=sco3.2v5
- ;;
- sco4)
- os=sco3.2v4
- ;;
- sco3.2.[4-9]*)
- os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')
- ;;
- sco*v* | scout)
- # Don't match below
- ;;
- sco*)
- os=sco3.2v2
- ;;
- psos*)
- os=psos
- ;;
- qnx*)
- os=qnx
- ;;
- hiux*)
- os=hiuxwe2
- ;;
- lynx*178)
- os=lynxos178
- ;;
- lynx*5)
- os=lynxos5
- ;;
- lynxos*)
- # don't get caught up in next wildcard
- ;;
- lynx*)
- os=lynxos
- ;;
- mac[0-9]*)
- os=$(echo "$os" | sed -e 's|mac|macos|')
- ;;
- opened*)
- os=openedition
- ;;
- os400*)
- os=os400
- ;;
- sunos5*)
- os=$(echo "$os" | sed -e 's|sunos5|solaris2|')
- ;;
- sunos6*)
- os=$(echo "$os" | sed -e 's|sunos6|solaris3|')
- ;;
- wince*)
- os=wince
- ;;
- utek*)
- os=bsd
- ;;
- dynix*)
- os=bsd
- ;;
- acis*)
- os=aos
- ;;
- atheos*)
- os=atheos
- ;;
- syllable*)
- os=syllable
- ;;
- 386bsd)
- os=bsd
- ;;
- ctix* | uts*)
- os=sysv
- ;;
- nova*)
- os=rtmk-nova
- ;;
- ns2)
- os=nextstep2
- ;;
- # Preserve the version number of sinix5.
- sinix5.*)
- os=$(echo $os | sed -e 's|sinix|sysv|')
- ;;
- sinix*)
- os=sysv4
- ;;
- tpf*)
- os=tpf
- ;;
- triton*)
- os=sysv3
- ;;
- oss*)
- os=sysv3
- ;;
- svr4*)
- os=sysv4
- ;;
- svr3)
- os=sysv3
- ;;
- sysvr4)
- os=sysv4
- ;;
- ose*)
- os=ose
- ;;
- *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
- os=mint
- ;;
- dicos*)
- os=dicos
- ;;
- pikeos*)
- # Until real need of OS specific support for
- # particular features comes up, bare metal
- # configurations are quite functional.
- case $cpu in
- arm*)
- os=eabi
- ;;
- *)
- os=elf
- ;;
- esac
- ;;
- *)
- # No normalization, but not necessarily accepted, that comes below.
- ;;
-esac
-
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-kernel=
-case $cpu-$vendor in
- score-*)
- os=elf
- ;;
- spu-*)
- os=elf
- ;;
- *-acorn)
- os=riscix1.2
- ;;
- arm*-rebel)
- kernel=linux
- os=gnu
- ;;
- arm*-semi)
- os=aout
- ;;
- c4x-* | tic4x-*)
- os=coff
- ;;
- c8051-*)
- os=elf
- ;;
- clipper-intergraph)
- os=clix
- ;;
- hexagon-*)
- os=elf
- ;;
- tic54x-*)
- os=coff
- ;;
- tic55x-*)
- os=coff
- ;;
- tic6x-*)
- os=coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=tops20
- ;;
- pdp11-*)
- os=none
- ;;
- *-dec | vax-*)
- os=ultrix4.2
- ;;
- m68*-apollo)
- os=domain
- ;;
- i386-sun)
- os=sunos4.0.2
- ;;
- m68000-sun)
- os=sunos3
- ;;
- m68*-cisco)
- os=aout
- ;;
- mep-*)
- os=elf
- ;;
- mips*-cisco)
- os=elf
- ;;
- mips*-*)
- os=elf
- ;;
- or32-*)
- os=coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=sysv3
- ;;
- sparc-* | *-sun)
- os=sunos4.1.1
- ;;
- pru-*)
- os=elf
- ;;
- *-be)
- os=beos
- ;;
- *-ibm)
- os=aix
- ;;
- *-knuth)
- os=mmixware
- ;;
- *-wec)
- os=proelf
- ;;
- *-winbond)
- os=proelf
- ;;
- *-oki)
- os=proelf
- ;;
- *-hp)
- os=hpux
- ;;
- *-hitachi)
- os=hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=sysv
- ;;
- *-cbm)
- os=amigaos
- ;;
- *-dg)
- os=dgux
- ;;
- *-dolphin)
- os=sysv3
- ;;
- m68k-ccur)
- os=rtu
- ;;
- m88k-omron*)
- os=luna
- ;;
- *-next)
- os=nextstep
- ;;
- *-sequent)
- os=ptx
- ;;
- *-crds)
- os=unos
- ;;
- *-ns)
- os=genix
- ;;
- i370-*)
- os=mvs
- ;;
- *-gould)
- os=sysv
- ;;
- *-highlevel)
- os=bsd
- ;;
- *-encore)
- os=bsd
- ;;
- *-sgi)
- os=irix
- ;;
- *-siemens)
- os=sysv4
- ;;
- *-masscomp)
- os=rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=uxpv
- ;;
- *-rom68k)
- os=coff
- ;;
- *-*bug)
- os=coff
- ;;
- *-apple)
- os=macos
- ;;
- *-atari*)
- os=mint
- ;;
- *-wrs)
- os=vxworks
- ;;
- *)
- os=none
- ;;
-esac
-
-fi
-
-# Now, validate our (potentially fixed-up) OS.
-case $os in
- # Sometimes we do "kernel-libc", so those need to count as OSes.
- musl* | newlib* | uclibc*)
- ;;
- # Likewise for "kernel-abi"
- eabi* | gnueabi*)
- ;;
- # VxWorks passes extra cpu info in the 4th filed.
- simlinux | simwindows | spe)
- ;;
- # Now accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST end in a * to match a version number.
- gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
- | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
- | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
- | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
- | hiux* | abug | nacl* | netware* | windows* \
- | os9* | macos* | osx* | ios* \
- | mpw* | magic* | mmixware* | mon960* | lnews* \
- | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
- | aos* | aros* | cloudabi* | sortix* | twizzler* \
- | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
- | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
- | mirbsd* | netbsd* | dicos* | openedition* | ose* \
- | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
- | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
- | udi* | lites* | ieee* | go32* | aux* | hcos* \
- | chorusrdb* | cegcc* | glidix* \
- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
- | midipix* | mingw32* | mingw64* | mint* \
- | uxpv* | beos* | mpeix* | udk* | moxiebox* \
- | interix* | uwin* | mks* | rhapsody* | darwin* \
- | openstep* | oskit* | conix* | pw32* | nonstopux* \
- | storm-chaos* | tops10* | tenex* | tops20* | its* \
- | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
- | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
- | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
- | skyos* | haiku* | rdos* | toppers* | drops* | es* \
- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
- | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
- | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
- ;;
- # This one is extra strict with allowed versions
- sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- ;;
- none)
- ;;
- *)
- echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# As a final step for OS-related things, validate the OS-kernel combination
-# (given a valid OS), if there is a kernel.
-case $kernel-$os in
- linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
- ;;
- uclinux-uclibc* )
- ;;
- -dietlibc* | -newlib* | -musl* | -uclibc* )
- # These are just libc implementations, not actual OSes, and thus
- # require a kernel.
- echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
- exit 1
- ;;
- kfreebsd*-gnu* | kopensolaris*-gnu*)
- ;;
- vxworks-simlinux | vxworks-simwindows | vxworks-spe)
- ;;
- nto-qnx*)
- ;;
- os2-emx)
- ;;
- *-eabi* | *-gnueabi*)
- ;;
- -*)
- # Blank kernel with real OS is always fine.
- ;;
- *-*)
- echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
- exit 1
- ;;
-esac
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-case $vendor in
- unknown)
- case $cpu-$os in
- *-riscix*)
- vendor=acorn
- ;;
- *-sunos*)
- vendor=sun
- ;;
- *-cnk* | *-aix*)
- vendor=ibm
- ;;
- *-beos*)
- vendor=be
- ;;
- *-hpux*)
- vendor=hp
- ;;
- *-mpeix*)
- vendor=hp
- ;;
- *-hiux*)
- vendor=hitachi
- ;;
- *-unos*)
- vendor=crds
- ;;
- *-dgux*)
- vendor=dg
- ;;
- *-luna*)
- vendor=omron
- ;;
- *-genix*)
- vendor=ns
- ;;
- *-clix*)
- vendor=intergraph
- ;;
- *-mvs* | *-opened*)
- vendor=ibm
- ;;
- *-os400*)
- vendor=ibm
- ;;
- s390-* | s390x-*)
- vendor=ibm
- ;;
- *-ptx*)
- vendor=sequent
- ;;
- *-tpf*)
- vendor=ibm
- ;;
- *-vxsim* | *-vxworks* | *-windiss*)
- vendor=wrs
- ;;
- *-aux*)
- vendor=apple
- ;;
- *-hms*)
- vendor=hitachi
- ;;
- *-mpw* | *-macos*)
- vendor=apple
- ;;
- *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
- vendor=atari
- ;;
- *-vos*)
- vendor=stratus
- ;;
- esac
- ;;
-esac
-
-echo "$cpu-$vendor-${kernel:+$kernel-}$os"
-exit
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/lib/erl_interface/src/auxdir/install-sh b/lib/erl_interface/src/auxdir/install-sh
deleted file mode 100755
index ec298b5374..0000000000
--- a/lib/erl_interface/src/auxdir/install-sh
+++ /dev/null
@@ -1,541 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2020-11-14.01; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-tab=' '
-nl='
-'
-IFS=" $tab$nl"
-
-# Set DOITPROG to "echo" to test this script.
-
-doit=${DOITPROG-}
-doit_exec=${doit:-exec}
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-# Create dirs (including intermediate dirs) using mode 755.
-# This is like GNU 'install' as of coreutils 8.32 (2020).
-mkdir_umask=22
-
-backupsuffix=
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-is_target_a_directory=possibly
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
- or: $0 [OPTION]... SRCFILES... DIRECTORY
- or: $0 [OPTION]... -t DIRECTORY SRCFILES...
- or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
- --help display this help and exit.
- --version display version info and exit.
-
- -c (ignored)
- -C install only if different (preserve data modification time)
- -d create directories instead of installing files.
- -g GROUP $chgrpprog installed files to GROUP.
- -m MODE $chmodprog installed files to MODE.
- -o USER $chownprog installed files to USER.
- -p pass -p to $cpprog.
- -s $stripprog installed files.
- -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
- -t DIRECTORY install into DIRECTORY.
- -T report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
- RMPROG STRIPPROG
-
-By default, rm is invoked with -f; when overridden with RMPROG,
-it's up to you to specify -f if you want it.
-
-If -S is not specified, no backups are attempted.
-
-Email bug reports to bug-automake@gnu.org.
-Automake home page: https://www.gnu.org/software/automake/
-"
-
-while test $# -ne 0; do
- case $1 in
- -c) ;;
-
- -C) copy_on_change=true;;
-
- -d) dir_arg=true;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift;;
-
- --help) echo "$usage"; exit $?;;
-
- -m) mode=$2
- case $mode in
- *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
-
- -o) chowncmd="$chownprog $2"
- shift;;
-
- -p) cpprog="$cpprog -p";;
-
- -s) stripcmd=$stripprog;;
-
- -S) backupsuffix="$2"
- shift;;
-
- -t)
- is_target_a_directory=always
- dst_arg=$2
- # Protect names problematic for 'test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- shift;;
-
- -T) is_target_a_directory=never;;
-
- --version) echo "$0 $scriptversion"; exit $?;;
-
- --) shift
- break;;
-
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
-
- *) break;;
- esac
- shift
-done
-
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
- if test -n "$dst_arg"; then
- echo "$0: target directory not allowed when installing a directory." >&2
- exit 1
- fi
-fi
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
- # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dst_arg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dst_arg"
- shift # fnord
- fi
- shift # arg
- dst_arg=$arg
- # Protect names problematic for 'test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- done
-fi
-
-if test $# -eq 0; then
- if test -z "$dir_arg"; then
- echo "$0: no input file specified." >&2
- exit 1
- fi
- # It's OK to call 'install-sh -d' without argument.
- # This can happen when creating conditional directories.
- exit 0
-fi
-
-if test -z "$dir_arg"; then
- if test $# -gt 1 || test "$is_target_a_directory" = always; then
- if test ! -d "$dst_arg"; then
- echo "$0: $dst_arg: Is not a directory." >&2
- exit 1
- fi
- fi
-fi
-
-if test -z "$dir_arg"; then
- do_exit='(exit $ret); exit $ret'
- trap "ret=129; $do_exit" 1
- trap "ret=130; $do_exit" 2
- trap "ret=141; $do_exit" 13
- trap "ret=143; $do_exit" 15
-
- # Set umask so as not to create temps with too-generous modes.
- # However, 'strip' requires both read and write access to temps.
- case $mode in
- # Optimize common cases.
- *644) cp_umask=133;;
- *755) cp_umask=22;;
-
- *[0-7])
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw='% 200'
- fi
- cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
- *)
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw=,u+rw
- fi
- cp_umask=$mode$u_plus_rw;;
- esac
-fi
-
-for src
-do
- # Protect names problematic for 'test' and other utilities.
- case $src in
- -* | [=\(\)!]) src=./$src;;
- esac
-
- if test -n "$dir_arg"; then
- dst=$src
- dstdir=$dst
- test -d "$dstdir"
- dstdir_status=$?
- # Don't chown directories that already exist.
- if test $dstdir_status = 0; then
- chowncmd=""
- fi
- else
-
- # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
- # might cause directories to be created, which would be especially bad
- # if $src (and thus $dsttmp) contains '*'.
- if test ! -f "$src" && test ! -d "$src"; then
- echo "$0: $src does not exist." >&2
- exit 1
- fi
-
- if test -z "$dst_arg"; then
- echo "$0: no destination specified." >&2
- exit 1
- fi
- dst=$dst_arg
-
- # If destination is a directory, append the input filename.
- if test -d "$dst"; then
- if test "$is_target_a_directory" = never; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
- fi
- dstdir=$dst
- dstbase=`basename "$src"`
- case $dst in
- */) dst=$dst$dstbase;;
- *) dst=$dst/$dstbase;;
- esac
- dstdir_status=0
- else
- dstdir=`dirname "$dst"`
- test -d "$dstdir"
- dstdir_status=$?
- fi
- fi
-
- case $dstdir in
- */) dstdirslash=$dstdir;;
- *) dstdirslash=$dstdir/;;
- esac
-
- obsolete_mkdir_used=false
-
- if test $dstdir_status != 0; then
- case $posix_mkdir in
- '')
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
- else
- mkdir_mode=
- fi
-
- posix_mkdir=false
- # The $RANDOM variable is not portable (e.g., dash). Use it
- # here however when possible just to lower collision chance.
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-
- trap '
- ret=$?
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
- exit $ret
- ' 0
-
- # Because "mkdir -p" follows existing symlinks and we likely work
- # directly in world-writeable /tmp, make sure that the '$tmpdir'
- # directory is successfully created first before we actually test
- # 'mkdir -p'.
- if (umask $mkdir_umask &&
- $mkdirprog $mkdir_mode "$tmpdir" &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- test_tmpdir="$tmpdir/a"
- ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
- fi
- trap '' 0;;
- esac
-
- if
- $posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
- )
- then :
- else
-
- # mkdir does not conform to POSIX,
- # or it failed possibly due to a race condition. Create the
- # directory the slow way, step by step, checking for races as we go.
-
- case $dstdir in
- /*) prefix='/';;
- [-=\(\)!]*) prefix='./';;
- *) prefix='';;
- esac
-
- oIFS=$IFS
- IFS=/
- set -f
- set fnord $dstdir
- shift
- set +f
- IFS=$oIFS
-
- prefixes=
-
- for d
- do
- test X"$d" = X && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
- done
-
- if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
- fi
- fi
- fi
-
- if test -n "$dir_arg"; then
- { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
- { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
- test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
- else
-
- # Make a couple of temp file names in the proper directory.
- dsttmp=${dstdirslash}_inst.$$_
- rmtmp=${dstdirslash}_rm.$$_
-
- # Trap to clean up those temp files at exit.
- trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
- # Copy the file name to the temp name.
- (umask $cp_umask &&
- { test -z "$stripcmd" || {
- # Create $dsttmp read-write so that cp doesn't create it read-only,
- # which would cause strip to fail.
- if test -z "$doit"; then
- : >"$dsttmp" # No need to fork-exec 'touch'.
- else
- $doit touch "$dsttmp"
- fi
- }
- } &&
- $doit_exec $cpprog "$src" "$dsttmp") &&
-
- # and set any options; do chmod last to preserve setuid bits.
- #
- # If any of these fail, we abort the whole thing. If we want to
- # ignore errors from any of these, just make sure not to ignore
- # errors from the above "$doit $cpprog $src $dsttmp" command.
- #
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
- { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
- { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
- # If -C, don't bother to copy if it wouldn't change the file.
- if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
- set -f &&
- set X $old && old=:$2:$4:$5:$6 &&
- set X $new && new=:$2:$4:$5:$6 &&
- set +f &&
- test "$old" = "$new" &&
- $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
- then
- rm -f "$dsttmp"
- else
- # If $backupsuffix is set, and the file being installed
- # already exists, attempt a backup. Don't worry if it fails,
- # e.g., if mv doesn't support -f.
- if test -n "$backupsuffix" && test -f "$dst"; then
- $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
- fi
-
- # Rename the file to the real destination.
- $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
- {
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
- }
- fi || exit 1
-
- trap '' 0
- fi
-done
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/lib/erl_interface/src/connect/ei_connect.c b/lib/erl_interface/src/connect/ei_connect.c
index c310c93012..8cdb5a97ee 100644
--- a/lib/erl_interface/src/connect/ei_connect.c
+++ b/lib/erl_interface/src/connect/ei_connect.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,15 +36,9 @@
#include <unistd.h>
#include <sys/times.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
+#include <time.h>
+#if HAVE_SYS_TIME_H
# include <sys/time.h>
-# else
-# include <time.h>
-# endif
#endif
#include <sys/socket.h>
@@ -514,11 +508,6 @@ const char *ei_thisalivename(const ei_cnode* ec)
return ec->thisalivename;
}
-short ei_thiscreation(const ei_cnode* ec)
-{
- return ec->creation;
-}
-
/* FIXME: this function is not an api, why not? */
const char *ei_thiscookie(const ei_cnode* ec)
{
@@ -624,7 +613,7 @@ int ei_make_pid(ei_cnode *ec, erlang_pid *pid)
* of modifying the 'num' field in the pid returned by
* ei_self(). Since 'serial' field in pid returned by
* ei_self() is initialized to 0, pids created by
- * ei_make_pid() wont clash with such badly created pids
+ * ei_make_pid() won't clash with such badly created pids
* using ei_self() unless user also modified serial, but
* that has at least never been suggested by the
* documentation.
@@ -687,7 +676,7 @@ static ei_mutex_t *ref_mtx = NULL;
/*
* We use a global counter for all c-nodes in this process.
- * We wont wrap anyway due to the enormous amount of values
+ * We won't wrap anyway due to the enormous amount of values
* available.
*/
#ifdef EI_MAKE_REF_ATOMIC__
@@ -902,13 +891,13 @@ int ei_init_connect(void)
/*
* Perhaps run this routine instead of ei_connect_init/2 ?
-* Initailize by setting:
+* Initialize by setting:
* thishostname, thisalivename, thisnodename and thisipaddr
*/
int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname,
const char *thisalivename, const char *thisnodename,
Erl_IpAddr thisipaddr, const char *cookie,
- const short creation, ei_socket_callbacks *cbs,
+ unsigned int creation, ei_socket_callbacks *cbs,
int cbs_sz, void *setup_context)
{
char *dbglevel;
@@ -925,6 +914,10 @@ int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname,
}
ec->creation = creation;
+ if (ec->creation < 4) {
+ /* Avoid invalid 0-creation as well as old tiny 1,2,3 values. */
+ ec->creation += 0xE10000;
+ }
ec->pidsn = 0;
if (cookie) {
@@ -962,7 +955,7 @@ int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname,
strcpy(ec->self.node, thisnodename);
ec->self.num = 0;
ec->self.serial = 0;
- ec->self.creation = creation;
+ ec->self.creation = ec->creation;
}
else {
/* dynamic name */
@@ -987,7 +980,7 @@ int ei_connect_xinit_ussi(ei_cnode* ec, const char *thishostname,
int ei_connect_xinit(ei_cnode* ec, const char *thishostname,
const char *thisalivename, const char *thisnodename,
Erl_IpAddr thisipaddr, const char *cookie,
- const short creation)
+ unsigned int creation)
{
return ei_connect_xinit_ussi(ec, thishostname, thisalivename, thisnodename,
thisipaddr, cookie, creation,
@@ -1002,7 +995,7 @@ int ei_connect_xinit(ei_cnode* ec, const char *thishostname,
* otherwise return -1.
*/
int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name,
- const char *cookie, short creation,
+ const char *cookie, unsigned int creation,
ei_socket_callbacks *cbs, int cbs_sz,
void *setup_context)
{
@@ -1083,7 +1076,7 @@ int ei_connect_init_ussi(ei_cnode* ec, const char* this_node_name,
}
int ei_connect_init(ei_cnode* ec, const char* this_node_name,
- const char *cookie, short creation)
+ const char *cookie, unsigned int creation)
{
return ei_connect_init_ussi(ec, this_node_name, cookie, creation,
&ei_default_socket_callbacks,
@@ -1146,7 +1139,7 @@ struct hostent *dyn_gethostbyname_r(const char *name,
#endif
}
-/* Finds the the IP address for hostname and saves that IP address at
+/* Finds the IP address for hostname and saves that IP address at
the location that ip_wb points to. Returns a negative error code if
the IP address cannot be found for the hostname. */
static int ip_address_from_hostname(char* hostname,
@@ -1162,7 +1155,7 @@ static int ip_address_from_hostname(char* hostname,
hp = dyn_gethostbyname_r(hostname,&host,buffer_p,buffer_size,&ei_h_errno);
if (hp == NULL) {
char thishostname[EI_MAXHOSTNAMELEN+1];
- /* gethostname requies len to be max(hostname) + 1*/
+ /* gethostname requires len to be max(hostname) + 1*/
if (gethostname(thishostname,EI_MAXHOSTNAMELEN+1) < 0) {
EI_TRACE_ERR0("ip_address_from_hostname",
"Failed to get name of this host");
@@ -2270,7 +2263,8 @@ error:
static DistFlags preferred_flags(void)
{
DistFlags flags =
- DFLAG_EXTENDED_REFERENCES
+ DFLAG_MANDATORY_25_DIGEST
+ | DFLAG_EXTENDED_REFERENCES
| DFLAG_DIST_MONITOR
| DFLAG_EXTENDED_PIDS_PORTS
| DFLAG_FUN_TAGS
@@ -2285,10 +2279,6 @@ static DistFlags preferred_flags(void)
| DFLAG_HANDSHAKE_23
| DFLAG_V4_NC
| DFLAG_UNLINK_ID;
- if (ei_internal_use_21_bitstr_expfun()) {
- flags &= ~(DFLAG_EXPORT_PTR_TAG
- | DFLAG_BIT_BINARIES);
- }
return flags;
}
@@ -2417,7 +2407,7 @@ static int send_challenge(ei_cnode *ec,
flags = preferred_flags();
put8(s, tag);
if (tag == 'n') {
- put16be(s, EI_DIST_5); /* choosen version */
+ put16be(s, EI_DIST_5); /* chosen version */
put32be(s, flags);
put32be(s, challenge);
}
@@ -2518,22 +2508,13 @@ static int recv_challenge(ei_socket_callbacks *cbs, void *ctx,
goto error;
}
- if (!(*flags & DFLAG_EXTENDED_REFERENCES)) {
- EI_TRACE_ERR0("recv_challenge","<- RECV_CHALLENGE peer cannot "
- "handle extended references");
- goto error;
+ if (*flags & DFLAG_MANDATORY_25_DIGEST) {
+ *flags |= DFLAG_DIST_MANDATORY_25;
}
- if (!(*flags & DFLAG_EXTENDED_PIDS_PORTS)) {
+ if ((*flags & DFLAG_DIST_MANDATORY) != DFLAG_DIST_MANDATORY) {
EI_TRACE_ERR0("recv_challenge","<- RECV_CHALLENGE peer cannot "
- "handle extended pids and ports");
- erl_errno = EIO;
- goto error;
- }
-
- if (!(*flags & DFLAG_NEW_FLOATS)) {
- EI_TRACE_ERR0("recv_challenge","<- RECV_CHALLENGE peer cannot "
- "handle binary float encoding");
+ "handle all mandatory capabilities");
goto error;
}
@@ -2924,15 +2905,13 @@ static int recv_name(ei_socket_callbacks *cbs, void *ctx,
namelen = get16be(s);
}
- if (!(*flags & DFLAG_EXTENDED_REFERENCES)) {
- EI_TRACE_ERR0("recv_name","<- RECV_NAME peer cannot handle"
- "extended references");
- goto error;
+ if (*flags & DFLAG_MANDATORY_25_DIGEST) {
+ *flags |= DFLAG_DIST_MANDATORY_25;
}
- if (!(*flags & DFLAG_EXTENDED_PIDS_PORTS)) {
+ if ((*flags & DFLAG_DIST_MANDATORY) != DFLAG_DIST_MANDATORY) {
EI_TRACE_ERR0("recv_name","<- RECV_NAME peer cannot "
- "handle extended pids and ports");
+ "handle all mandatory capabilities");
erl_errno = EIO;
goto error;
}
diff --git a/lib/erl_interface/src/connect/ei_connect_int.h b/lib/erl_interface/src/connect/ei_connect_int.h
index 7ada7b598c..d9be32d42c 100644
--- a/lib/erl_interface/src/connect/ei_connect_int.h
+++ b/lib/erl_interface/src/connect/ei_connect_int.h
@@ -43,15 +43,9 @@
#include <sys/types.h>
#include <sys/times.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
+#include <time.h>
+#if HAVE_SYS_TIME_H
# include <sys/time.h>
-# else
-# include <time.h>
-# endif
#endif
#include <sys/socket.h>
@@ -62,7 +56,7 @@
#include <sys/utsname.h> /* for gen_challenge (NEED FIX?) */
#endif
-/* FIXME remove duplicate defintions */
+/* FIXME remove duplicate definitions */
#define DEFBUF_SIZ 100
@@ -90,19 +84,39 @@ typedef EI_ULONGLONG DistFlags;
#define DFLAG_BIG_CREATION 0x40000
#define DFLAG_HANDSHAKE_23 0x1000000
#define DFLAG_UNLINK_ID 0x2000000
-#define DFLAG_RESERVED 0xfc000000
-#define DFLAG_NAME_ME ((DistFlags)0x2 << 32)
+#define DFLAG_MANDATORY_25_DIGEST 0x4000000
+#define DFLAG_RESERVED 0xf8000000
+#define DFLAG_NAME_ME (((DistFlags)0x2) << 32)
#define DFLAG_V4_NC (((DistFlags)0x4) << 32)
/* Control message tags not exposed to user... */
#define ERL_UNLINK_ID 35
#define ERL_UNLINK_ID_ACK 36
+/* Mandatory flags for distribution in OTP 25. */
+#define DFLAG_DIST_MANDATORY_25 (DFLAG_EXTENDED_REFERENCES \
+ | DFLAG_FUN_TAGS \
+ | DFLAG_EXTENDED_PIDS_PORTS \
+ | DFLAG_UTF8_ATOMS \
+ | DFLAG_NEW_FUN_TAGS \
+ | DFLAG_BIG_CREATION \
+ | DFLAG_NEW_FLOATS \
+ | DFLAG_MAP_TAG \
+ | DFLAG_EXPORT_PTR_TAG \
+ | DFLAG_BIT_BINARIES)
+
+/* Mandatory flags for distribution. */
+
+/*
+ * Mandatory flags for distribution. Keep them in sync with
+ * erts/emulator/beam/dist.h.
+ */
+#define DFLAG_DIST_MANDATORY DFLAG_DIST_MANDATORY_25
+
ei_cnode *ei_fd_to_cnode(int fd);
int ei_distversion(int fd);
const char* ei_getfdcookie(int fd);
-short ei_thiscreation(const ei_cnode* ec);
const char *ei_thiscookie(const ei_cnode* ec);
int ei_do_receive_msg(int fd, int staticbuffer_p,
diff --git a/lib/erl_interface/src/connect/eirecv.c b/lib/erl_interface/src/connect/eirecv.c
index 29decb9d87..fadffd95fb 100644
--- a/lib/erl_interface/src/connect/eirecv.c
+++ b/lib/erl_interface/src/connect/eirecv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2021. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
# include <winsock2.h>
# include <windows.h>
# include <winbase.h>
-#else /* Unix/VxWorks */
+#else /* Unix */
# include <unistd.h>
#endif
@@ -369,7 +369,7 @@ send_unlink_id_ack(ei_socket_callbacks *cbs, void *ctx,
s = &ctl[0];
/* packet size */
put32be(s, index - 4);
- /* pass throug */
+ /* pass through */
put8(s, ERL_PASS_THROUGH);
if (ei_tracelevel >= 4) {
diff --git a/lib/erl_interface/src/connect/send_exit.c b/lib/erl_interface/src/connect/send_exit.c
index 231aad0ae0..ed064da438 100644
--- a/lib/erl_interface/src/connect/send_exit.c
+++ b/lib/erl_interface/src/connect/send_exit.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2020. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
# include <winsock2.h>
# include <windows.h>
# include <winbase.h>
-#else /* Unix/VxWorks */
+#else /* Unix */
#include <unistd.h>
#endif
diff --git a/lib/erl_interface/src/decode/decode_atom.c b/lib/erl_interface/src/decode/decode_atom.c
index 2bf8ab0552..b9cdec5b22 100644
--- a/lib/erl_interface/src/decode/decode_atom.c
+++ b/lib/erl_interface/src/decode/decode_atom.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2018. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -100,7 +100,7 @@ typedef unsigned long AsciiWord;
#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
typedef unsigned long long AsciiWord;
#else
-# error "Uknown word type"
+# error "Unknown word type"
#endif
#if SIZEOF_VOID_P == 4
diff --git a/lib/erl_interface/src/decode/decode_fun.c b/lib/erl_interface/src/decode/decode_fun.c
index 3622ebbe02..d9c1236f3d 100644
--- a/lib/erl_interface/src/decode/decode_fun.c
+++ b/lib/erl_interface/src/decode/decode_fun.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2020. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -120,7 +120,7 @@ int ei_decode_fun(const char *buf, int *index, erlang_fun *p)
/* then the old_uniq */
if (ei_decode_long(s, &ix, p_uniq) < 0)
return -1;
- /* the the pid */
+ /* the pid */
if (ei_decode_pid(s, &ix, p_pid) < 0)
return -1;
/* finally the free vars */
diff --git a/lib/erl_interface/src/encode/encode_atom.c b/lib/erl_interface/src/encode/encode_atom.c
index 6117aae37e..2b4c56af29 100644
--- a/lib/erl_interface/src/encode/encode_atom.c
+++ b/lib/erl_interface/src/encode/encode_atom.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2017. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -65,7 +65,7 @@ int ei_encode_atom_len_as(char *buf, int *index, const char *p, int len,
/*
* Since OTP 20 we totally ignore 'to_enc'
- * and alway encode as UTF8.
+ * and always encode as UTF8.
*/
{
offs = 1 + 1;
diff --git a/lib/erl_interface/src/epmd/epmd_unpublish.c b/lib/erl_interface/src/epmd/epmd_unpublish.c
index c463732250..269bce278f 100644
--- a/lib/erl_interface/src/epmd/epmd_unpublish.c
+++ b/lib/erl_interface/src/epmd/epmd_unpublish.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2020. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -61,7 +61,7 @@ int ei_unpublish_tmo(const char *alive, unsigned ms)
put8(s,EI_EPMD_STOP_REQ);
strcpy(s, alive);
- /* FIXME can't connect, return success?! At least commen whats up */
+ /* FIXME can't connect, return success?! At least comment what's up */
if ((fd = ei_epmd_connect_tmo(NULL,ms)) < 0) return fd;
dlen = (ssize_t) len+2;
diff --git a/lib/erl_interface/src/misc/ei_compat.c b/lib/erl_interface/src/misc/ei_compat.c
index e25a1a015d..95be5d6dde 100644
--- a/lib/erl_interface/src/misc/ei_compat.c
+++ b/lib/erl_interface/src/misc/ei_compat.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2004-2020. All Rights Reserved.
+ * Copyright Ericsson AB 2004-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -35,9 +35,3 @@ ei_set_compat_rel(unsigned rel)
{
compat_rel = rel;
}
-
-int ei_internal_use_21_bitstr_expfun(void)
-{
- return compat_rel < 22;
-}
-
diff --git a/lib/erl_interface/src/misc/ei_internal.h b/lib/erl_interface/src/misc/ei_internal.h
index 5b39e3dc37..374fd2975c 100644
--- a/lib/erl_interface/src/misc/ei_internal.h
+++ b/lib/erl_interface/src/misc/ei_internal.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2020. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -157,8 +157,6 @@ int ei_init_connect(void);
void ei_trace_printf(const char *name, int level, const char *format, ...);
-int ei_internal_use_21_bitstr_expfun(void);
-
int ei_get_cbs_ctx__(ei_socket_callbacks **cbs, void **ctx, int fd);
#endif /* _EI_INTERNAL_H */
diff --git a/lib/erl_interface/src/misc/ei_pthreads.c b/lib/erl_interface/src/misc/ei_pthreads.c
index 3dede6343a..d70e76cf1e 100644
--- a/lib/erl_interface/src/misc/ei_pthreads.c
+++ b/lib/erl_interface/src/misc/ei_pthreads.c
@@ -158,7 +158,7 @@ static void erl_errno_key_alloc(void)
* If pthread functions fail we fall back to using fallback_errno
* so that the main thread (actually not a thread in all ascpects)
* still will set and get an erl_errno value.
- * Actually this is a bit to nice, it would be preferrable to exit fatal
+ * Actually this is a bit to nice, it would be preferable to exit fatal
* as we do on windows, but we might break some code with one thread
* but still compiled with -D_REENTRANT, so we'll leave it here.
*/
diff --git a/lib/erl_interface/src/misc/eimd5.c b/lib/erl_interface/src/misc/eimd5.c
index 426b96d962..3d7dd960e7 100644
--- a/lib/erl_interface/src/misc/eimd5.c
+++ b/lib/erl_interface/src/misc/eimd5.c
@@ -161,7 +161,7 @@ void ei_MD5Update (MD5_CTX *context, unsigned char *input,
}
/*
- * MD5 finalization. Ends an MD5 message-digest operation, writing the
+ * MD5 finalization. Ends an MD5 message-digest operation, writing
the message digest and zeroizing the context.
*/
void ei_MD5Final (unsigned char digest[16], MD5_CTX *context)
diff --git a/lib/erl_interface/src/misc/show_msg.c b/lib/erl_interface/src/misc/show_msg.c
index db1a386496..87fd970165 100644
--- a/lib/erl_interface/src/misc/show_msg.c
+++ b/lib/erl_interface/src/misc/show_msg.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2020. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,19 +29,9 @@
#include "eidef.h"
-#ifndef __WIN32__
-# ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-# else
-# ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-# endif
-#else
-# include <time.h>
+#include <time.h>
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
#endif
#include "eiext.h"
diff --git a/lib/erl_interface/src/prog/erl_call.c b/lib/erl_interface/src/prog/erl_call.c
index e62931de35..4548b9f4dd 100644
--- a/lib/erl_interface/src/prog/erl_call.c
+++ b/lib/erl_interface/src/prog/erl_call.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2021. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -61,15 +61,9 @@
#include <time.h>
#include <unistd.h>
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
+#include <time.h>
+#if HAVE_SYS_TIME_H
# include <sys/time.h>
-# else
-# include <time.h>
-# endif
#endif
#endif
@@ -1103,7 +1097,7 @@ static char* ei_chk_strdup(char *s)
}
/*
- * Helper function that that:
+ * Helper function that:
*
* 1. Executes a function on a remote node
*
diff --git a/lib/erl_interface/test/Makefile b/lib/erl_interface/test/Makefile
index bdfedecc66..11c60953ca 100644
--- a/lib/erl_interface/test/Makefile
+++ b/lib/erl_interface/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2020. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -58,7 +58,7 @@ RELSYSDIR = $(RELEASE_PATH)/erl_interface_test
# Targets
# ----------------------------------------------------
-tests debug opt:
+tests $(TYPES):
clean:
diff --git a/lib/erl_interface/test/all_SUITE_data/ei_runner.c b/lib/erl_interface/test/all_SUITE_data/ei_runner.c
index b1a4f1a2c1..3732cb9f5b 100644
--- a/lib/erl_interface/test/all_SUITE_data/ei_runner.c
+++ b/lib/erl_interface/test/all_SUITE_data/ei_runner.c
@@ -274,7 +274,7 @@ void do_fail(const char* file, int line, const char* reason, ...)
/*
* This function sends a message to the Erlang side.
* The message will be written to the test servers log file,
- * but will otherwise be completly ignored.
+ * but will otherwise be completely ignored.
*/
void message(char* format, ...)
diff --git a/lib/erl_interface/test/all_SUITE_data/reclaim.h b/lib/erl_interface/test/all_SUITE_data/reclaim.h
deleted file mode 100644
index fe99bb0afc..0000000000
--- a/lib/erl_interface/test/all_SUITE_data/reclaim.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * %CopyrightBegin%
- *
- * Copyright Ericsson AB 2001-2016. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * %CopyrightEnd%
- *
-
- */
-#ifndef _RECLAIM_H
-#define _RECLAIM_H
-
-
-/* The Erlang release for VxWorks includes a simple mechanism for
- "resource reclamation" at task exit - it allows replacement of the
- functions that open/close "files" and malloc/free memory with versions
- that keep track, to be able to "reclaim" file descriptors and memory
- when a task exits (regardless of *how* it exits).
-
- The interface to this mechanism is made available via this file,
- with the following caveats:
-
- - The interface may change (or perhaps even be removed, though that
- isn't likely until VxWorks itself provides similar functionality)
- in future releases - i.e. you must always use the version of this
- file that comes with the Erlang release you are using.
-
- - Disaster is guaranteed if you use the mechanism incorrectly (see
- below for the correct way), e.g. allocate memory with the "tracking"
- version of malloc() and free it with the "standard" version of free().
-
- - The mechanism (of course) incurs some performance penalty - thus
- for a simple program you may be better off with careful programming,
- making sure that you do whatever close()/free()/etc calls that are
- appropriate at all exit points (though if you need to guard against
- taskDelete() etc, things get messy...).
-
- To use the mechanism, simply program your application normally, i.e.
- use open()/close()/malloc()/free() etc as usual, but #include this
- file before any usage of the relevant functions. NOTE: To avoid the
- "disaster" mentioned above, you *must* #include it in *all* (or none)
- of the files that manipulate a particular file descriptor, allocated
- memory area, etc.
-
- Before any task that uses this utility is loaded (which includes the
- erlang emulator), the reclaim.o object file has to be loaded and
- the function reclaim_init() has to be called. reclaim_init should be called
- only _ONCE_ in a systems lifetime and has only a primitive guard
- against multiple calls (i.e. a global variable is checked). Therefore
- the initialization should occur either in the start script of the system
- or (even better) in the usrInit() part of system initialization. The
- object file itself should be loaded only once, so linking it with the
- kernel is a good idea, linking with each application is an extremely bad
- dito. Make really sure that it's loaded _before_ any application that
- uses it if You want to load it in the startup script.
-
- If You dont want to have #define's for the posix/stdio names
- of the file/memory operations (i.e. no #define malloc save_malloc etc),
- #define RECLAIM_NO_ALIAS in Your source before reclaim.h is included.
-*/
-
-#include <vxWorks.h> /* STATUS, size_t */
-#include <sockLib.h> /* struct sockaddr */
-#include <stdio.h> /* FILE */
-
-#if defined(__STDC__)
-#define _RECLAIM_DECL_FUN(RetType, FunName, ParamList) \
-extern RetType FunName##ParamList
-#define _RECLAIM_VOID_PTR void *
-#define _RECLAIM_VOID_PARAM void
-#define _RECLAIM_VOID_RETURN void
-#elif defined(__cplusplus)
-#define _RECLAIM_DECL_FUN(RetType, FunName, ParamList) \
-extern "C" RetType FunName##ParamList
-#define _RECLAIM_VOID_PTR void *
-#define _RECLAIM_VOID_PARAM
-#define _RECLAIM_VOID_RETURN void
-#else
-#define _RECLAIM_DECL_FUN(RetType, FunName, Ignore) extern RetType FunName()
-#define DECLARE_FUNCTION_TYPE(RetType, Type, PList) typedef RetType (* Type)()
-#define _RECLAIM_VOID_PTR char *
-#define _RECLAIM_VOID_PARAM
-#define _RECLAIM_VOID_RETURN
-#endif /* __STDC__ / __cplusplus */
-
-/* Initialize the facility, on a per system basis. */
-_RECLAIM_DECL_FUN(STATUS, reclaim_init, (_RECLAIM_VOID_PARAM));
-
-/* File descriptor operations */
-_RECLAIM_DECL_FUN(int,save_open,(char *, int, ...));
-_RECLAIM_DECL_FUN(int,save_creat,(char *, int));
-_RECLAIM_DECL_FUN(int,save_socket,(int, int, int));
-_RECLAIM_DECL_FUN(int,save_accept,(int, struct sockaddr *, int *));
-_RECLAIM_DECL_FUN(int,save_close,(int));
-/* Interface to add an fd to what's reclaimed even though it's not open with
- one of the above functions */
-_RECLAIM_DECL_FUN(_RECLAIM_VOID_RETURN, save_fd, (int fd));
-#ifndef RECLAIM_NO_ALIAS
-#define open save_open
-#define creat save_creat
-#define socket save_socket
-#define accept save_accept
-#define close save_close
-#endif
-/* Stdio file operations */
-_RECLAIM_DECL_FUN(FILE *, save_fopen, (char *, char *));
-_RECLAIM_DECL_FUN(FILE *, save_fdopen, (int, char *));
-_RECLAIM_DECL_FUN(FILE *, save_freopen, (char *, char *, FILE *));
-_RECLAIM_DECL_FUN(int, save_fclose, (FILE *));
-/* XXX Should do opendir/closedir too... */
-#ifndef RECLAIM_NO_ALIAS
-#define fopen save_fopen
-#define fdopen save_fdopen
-#define freopen save_freopen
-#define fclose save_fclose
-#endif
-/* Memory allocation */
-_RECLAIM_DECL_FUN(_RECLAIM_VOID_PTR, save_malloc, (size_t));
-_RECLAIM_DECL_FUN(_RECLAIM_VOID_PTR, save_calloc, (size_t, size_t));
-_RECLAIM_DECL_FUN(_RECLAIM_VOID_PTR, save_realloc,
- (_RECLAIM_VOID_PTR, size_t));
-_RECLAIM_DECL_FUN(void, save_free, (_RECLAIM_VOID_PTR));
-_RECLAIM_DECL_FUN(void, save_cfree, (_RECLAIM_VOID_PTR));
-#ifndef RECLAIM_NO_ALIAS
-#define malloc save_malloc
-#define calloc save_calloc
-#define realloc save_realloc
-#define free save_free
-#define cfree save_cfree
-#endif
-/* Generic interfaces to malloc etc... */
-_RECLAIM_DECL_FUN(_RECLAIM_VOID_PTR, plain_malloc, (size_t));
-_RECLAIM_DECL_FUN(_RECLAIM_VOID_PTR, plain_realloc,
- (_RECLAIM_VOID_PTR, size_t));
-_RECLAIM_DECL_FUN(void, plain_free, (_RECLAIM_VOID_PTR));
-#endif /* _RECLAIM_H */
-
-
-
-
diff --git a/lib/erl_interface/test/ei_accept_SUITE.erl b/lib/erl_interface/test/ei_accept_SUITE.erl
index 612d6e1b81..a3989ce6f7 100644
--- a/lib/erl_interface/test/ei_accept_SUITE.erl
+++ b/lib/erl_interface/test/ei_accept_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -43,9 +43,7 @@ init_per_testcase(Case, Config) ->
runner:init_per_testcase(?MODULE, Case, Config).
ei_accept(Config) when is_list(Config) ->
- [ei_accept_do(Config, CR, SI)
- || CR <- [0,21],
- SI <- [default, ussi]],
+ _ = [ei_accept_do(Config, 0, SI) || SI <- [default, ussi]],
ok.
ei_accept_do(Config, CompatRel, SockImpl) ->
@@ -58,34 +56,28 @@ ei_accept_do(Config, CompatRel, SockImpl) ->
EINode = list_to_atom("c42@"++Myname),
io:format("EINode ~p ~n", [EINode]),
- %% We take this opportunity to also test export-funs and bit-strings
- %% with (ugly) tuple fallbacks in OTP 21 and older.
+ %% We take this opportunity to also test export-funs and bit-strings.
%% Test both toward pending connection and established connection.
- RealTerms = [<<1:1>>, fun lists:map/2],
- EncTerms = case CompatRel of
- 0 -> RealTerms;
- 21 -> [{<<128>>,1}, {lists,map}]
- end,
+ RealTerms = [<<1:1>>, fun lists:map/2],
Self = self(),
Funny = fun() -> hello end,
- TermToSend = {call, Self, "Test", Funny, RealTerms},
- TermToGet = {call, Self, "Test", Funny, EncTerms},
+ Terms = {call, Self, "Test", Funny, RealTerms},
Port = 6543,
{ok, ListenFd} = ei_publish(P, Port),
- {any, EINode} ! TermToSend,
+ {any, EINode} ! Terms,
{ok, Fd, Node} = ei_accept(P, ListenFd),
Node = node(),
Got1 = ei_receive(P, Fd),
%% Send again, now without auto-connect
- {any, EINode} ! TermToSend,
+ {any, EINode} ! Terms,
Got2 = ei_receive(P, Fd),
- io:format("Sent ~p~nExp. ~p~nGot1 ~p~nGot2 ~p~n", [TermToSend, TermToGet, Got1, Got2]),
- TermToGet = Got1,
- TermToGet = Got2,
+ io:format("Sent ~p~nExp. ~p~nGot1 ~p~nGot2 ~p~n", [Terms, Terms, Got1, Got2]),
+ Terms = Got1,
+ Terms = Got2,
runner:finish(P),
ok.
diff --git a/lib/erl_interface/test/ei_accept_SUITE_data/eiaccnode.c b/lib/erl_interface/test/ei_accept_SUITE_data/eiaccnode.c
index ef1ab96d41..7dc9696611 100644
--- a/lib/erl_interface/test/ei_accept_SUITE_data/eiaccnode.c
+++ b/lib/erl_interface/test/ei_accept_SUITE_data/eiaccnode.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2001-2020. All Rights Reserved.
+ * Copyright Ericsson AB 2001-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -145,7 +145,7 @@ static void*
ei_x_free(&x);
ei_x_free(&xs);
} else {
- fprintf(file, "coudn't connect fd %d r %d\n", fd, r); fflush(file);
+ fprintf(file, "couldn't connect fd %d r %d\n", fd, r); fflush(file);
}
ei_close_connection(listen);
fprintf(file, "done thread %d\n", n);
diff --git a/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c b/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
index 379c3bb4ba..f713637438 100644
--- a/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
+++ b/lib/erl_interface/test/ei_connect_SUITE_data/ei_connect_test.c
@@ -72,7 +72,7 @@ static struct {
/*
- * Sends a list contaning all data types to the Erlang side.
+ * Sends a list containing all data types to the Erlang side.
*/
TESTCASE(interpret)
diff --git a/lib/erl_interface/test/ei_connect_SUITE_data/einode.c b/lib/erl_interface/test/ei_connect_SUITE_data/einode.c
index 54bd0ecd8b..1739245ab8 100644
--- a/lib/erl_interface/test/ei_connect_SUITE_data/einode.c
+++ b/lib/erl_interface/test/ei_connect_SUITE_data/einode.c
@@ -89,7 +89,7 @@ static void*
shutdown(fd, SD_SEND);
closesocket(fd);
} else {
- printf("coudn't connect fd %d r %d\n", fd, r); // DebugBreak();
+ printf("couldn't connect fd %d r %d\n", fd, r); // DebugBreak();
}
printf("done thread %d\n", n);
return 0;
diff --git a/lib/erl_interface/test/ei_decode_SUITE.erl b/lib/erl_interface/test/ei_decode_SUITE.erl
index a51078f7e7..3703e85777 100644
--- a/lib/erl_interface/test/ei_decode_SUITE.erl
+++ b/lib/erl_interface/test/ei_decode_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ init_per_testcase(Case, Config) ->
%% ---------------------------------------------------------------------------
-% NOTE: for historical reasons we don't pach as tight as we can,
+% NOTE: for historical reasons we don't patch as tight as we can,
% we only fill 27 bits in 32 bit INTEGER_EXT
diff --git a/lib/erl_interface/test/ei_encode_SUITE.erl b/lib/erl_interface/test/ei_encode_SUITE.erl
index d6e026379f..8327398527 100644
--- a/lib/erl_interface/test/ei_encode_SUITE.erl
+++ b/lib/erl_interface/test/ei_encode_SUITE.erl
@@ -52,7 +52,7 @@ init_per_testcase(Case, Config) ->
%% ---------------------------------------------------------------------------
-% NOTE: for historical reasons we don't pach as tight as we can,
+% NOTE: for historical reasons we don't patch as tight as we can,
% we only fill 27 bits in 32 bit INTEGER_EXT
diff --git a/lib/erl_interface/test/ei_global_SUITE_data/ei_global_test.c b/lib/erl_interface/test/ei_global_SUITE_data/ei_global_test.c
index c018ff625a..5150b78e6d 100644
--- a/lib/erl_interface/test/ei_global_SUITE_data/ei_global_test.c
+++ b/lib/erl_interface/test/ei_global_SUITE_data/ei_global_test.c
@@ -59,7 +59,7 @@ static struct {
/*
- * Sends a list contaning all data types to the Erlang side.
+ * Sends a list containing all data types to the Erlang side.
*/
TESTCASE(interpret)
diff --git a/lib/erl_interface/test/ei_tmo_SUITE.erl b/lib/erl_interface/test/ei_tmo_SUITE.erl
index 2e3789a3d9..49e889bdf3 100644
--- a/lib/erl_interface/test/ei_tmo_SUITE.erl
+++ b/lib/erl_interface/test/ei_tmo_SUITE.erl
@@ -31,7 +31,8 @@
ei_send_tmo/1,
ei_send_failure_tmo/1,
ei_connect_unreachable_tmo/0, ei_connect_unreachable_tmo/1,
- ei_recv_tmo/1]).
+ ei_recv_tmo/1,
+ ei_dflags/1]).
suite() ->
[{ct_hooks,[ts_install_cth]},
@@ -48,7 +49,8 @@ groups() ->
Members = [ei_recv_tmo,
ei_accept_tmo,
ei_connect_tmo,
- ei_send_tmo],
+ ei_send_tmo,
+ ei_dflags],
[{default, [], Members},
{ussi, [], Members}].
@@ -61,6 +63,40 @@ init_per_testcase(Case, Config) ->
end_per_testcase(_Case, _Config) ->
ok.
+-define(DFLAG_PUBLISHED, 16#01).
+-define(DFLAG_ATOM_CACHE, 16#02).
+-define(DFLAG_EXTENDED_REFERENCES, 16#04).
+-define(DFLAG_DIST_MONITOR, 16#08).
+-define(DFLAG_FUN_TAGS, 16#10).
+-define(DFLAG_NEW_FUN_TAGS, 16#80).
+-define(DFLAG_EXTENDED_PIDS_PORTS, 16#100).
+-define(DFLAG_EXPORT_PTR_TAG, 16#200).
+-define(DFLAG_BIT_BINARIES, 16#400).
+-define(DFLAG_NEW_FLOATS, 16#800).
+-define(DFLAG_UTF8_ATOMS, 16#10000).
+-define(DFLAG_MAP_TAG, 16#20000).
+-define(DFLAG_BIG_CREATION, 16#40000).
+-define(DFLAG_HANDSHAKE_23, 16#1000000).
+-define(DFLAG_MANDATORY_25_DIGEST, 16#4000000).
+
+%% From OTP R9 extended references are compulsory.
+%% From OTP R10 extended pids and ports are compulsory.
+%% From OTP 20 UTF8 atoms are compulsory.
+%% From OTP 21 NEW_FUN_TAGS is compulsory (no more tuple fallback {fun, ...}).
+%% From OTP 23 BIG_CREATION is compulsory.
+%% From OTP 25 NEW_FLOATS, MAP_TAG, EXPORT_PTR_TAG, and BIT_BINARIES are compulsory.
+-define(COMPULSORY_DFLAGS,
+ (?DFLAG_EXTENDED_REFERENCES bor
+ ?DFLAG_FUN_TAGS bor
+ ?DFLAG_EXTENDED_PIDS_PORTS bor
+ ?DFLAG_UTF8_ATOMS bor
+ ?DFLAG_NEW_FUN_TAGS bor
+ ?DFLAG_BIG_CREATION bor
+ ?DFLAG_NEW_FLOATS bor
+ ?DFLAG_MAP_TAG bor
+ ?DFLAG_EXPORT_PTR_TAG bor
+ ?DFLAG_BIT_BINARIES)).
+
%% Check the framework.
framework_check(Config) when is_list(Config) ->
%%dbg:tracer(),
@@ -221,14 +257,19 @@ ei_connect_unreachable_tmo(Config) when is_list(Config) ->
ei_connect_tmo(Config) when is_list(Config) ->
[begin
- io:format("Test dist version ~p published as ~p\n", [OurVer,OurEpmdVer]),
+ io:format("Test dist version ~p published as ~p\n",
+ [OurVer,OurEpmdVer]),
do_ei_connect_tmo(Config, OurVer, OurEpmdVer)
end
|| OurVer <- lists:seq(?EI_DIST_LOW, ?EI_DIST_HIGH),
OurEpmdVer <- lists:seq(?EI_DIST_LOW, ?EI_DIST_HIGH),
- OurVer >= OurEpmdVer].
+ OurVer >= OurEpmdVer],
+
+ ok.
do_ei_connect_tmo(Config, OurVer, OurEpmdVer) ->
+ Flags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST,
+
P2 = runner:start(Config, ?connect_tmo),
runner:send_term(P2,{c_nod_connect_tmo_2,
erlang:get_cookie(),
@@ -237,6 +278,7 @@ do_ei_connect_tmo(Config, OurVer, OurEpmdVer) ->
{term, X} = runner:get_term(P2, 10000),
runner:recv_eot(P2),
true = is_integer(X),
+
%% Aborted handshake test...
{_,Host} = split(node()),
OurName = join(cccc,Host),
@@ -263,7 +305,7 @@ do_ei_connect_tmo(Config, OurVer, OurEpmdVer) ->
{hidden,Node} = recv_name(SocketB, OurEpmdVer), % See 1)
send_status(SocketB, ok),
MyChallengeB = gen_challenge(),
- send_challenge(SocketB, OurName, MyChallengeB, OurVer),
+ send_challenge(SocketB, OurName, MyChallengeB, OurVer, Flags),
recv_complement(SocketB, OurVer, OurEpmdVer),
_HisChallengeB = recv_challenge_reply(SocketB,
MyChallengeB,
@@ -288,12 +330,15 @@ ei_accept_tmo(Config) when is_list(Config) ->
ok.
do_ei_accept_tmo(Config, OurVer, AssumedVer) ->
+ Flags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST,
+
P = runner:start(Config, ?accept_tmo),
runner:send_term(P,{c_nod_som_ingen_kontaktar_1,
kaksmula_som_ingen_bryr_sig_om,
get_group(Config)}),
{term,{-1,ETimedout,ETimedout}} = runner:get_term(P, 10000),
runner:recv_eot(P),
+
P2 = runner:start(Config, ?accept_tmo),
runner:send_term(P2,{c_nod_som_vi_kontaktar_1,
erlang:get_cookie(),
@@ -304,8 +349,14 @@ do_ei_accept_tmo(Config, OurVer, AssumedVer) ->
{term, X} = runner:get_term(P2, 10000),
runner:recv_eot(P2),
true = is_integer(X),
- P3 = runner:start(Config, ?accept_tmo),
- runner:send_term(P3,{c_nod_som_vi_kontaktar_2,
+
+ normal_accept(Config, OurVer, AssumedVer, Flags),
+
+ ok.
+
+normal_accept(Config, OurVer, AssumedVer, Flags) ->
+ P = runner:start(Config, ?accept_tmo),
+ runner:send_term(P,{c_nod_som_vi_kontaktar_2,
erlang:get_cookie(),
get_group(Config)}),
receive after 1000 -> ok end,
@@ -317,7 +368,7 @@ do_ei_accept_tmo(Config, OurVer, AssumedVer) ->
{ok, SocketA} = gen_tcp:connect(atom_to_list(NB),PortNo,
[{active,false},
{packet,2}]),
- send_name(SocketA,OurName,OurVer,AssumedVer),
+ send_name(SocketA, OurName, OurVer, AssumedVer, Flags),
ok = recv_status(SocketA),
{hidden,_Node,HisChallengeA} = recv_challenge(SocketA,OurVer), % See 1)
_OurChallengeA = gen_challenge(),
@@ -325,9 +376,40 @@ do_ei_accept_tmo(Config, OurVer, AssumedVer) ->
%% Dont do the last two steps of the connection setup...
%% send_challenge_reply(SocketA, OurChallengeA, OurDigestA),
%% ok = recv_challenge_ack(SocketA, OurChallengeA, erlang:get_cookie()),
- {term, {-1,ETimedout,ETimedout}} = runner:get_term(P3, 10000),
- runner:recv_eot(P3),
- gen_tcp:close(SocketA),
+ {term, {-1,ETimedout,ETimedout}} = runner:get_term(P, 10000),
+ runner:recv_eot(P),
+ gen_tcp:close(SocketA).
+
+normal_connect(Config, OurVer, Flags) ->
+ {_,Host} = split(node()),
+ OurName = join(cccc,Host),
+ Node = join(c_nod_connect_tmo_3,Host),
+ LSocket = case gen_tcp:listen(0, [{active, false}, {packet,2}]) of
+ {ok, Socket} ->
+ Socket;
+ Else ->
+ exit(Else)
+ end,
+ EpmdSocket = epmd_register(OurName, LSocket, OurVer),
+ P3 = runner:start(Config, ?connect_tmo),
+ Cookie = kaksmula_som_ingen_bryr_sig_om,
+ runner:send_term(P3, {c_nod_connect_tmo_3,
+ Cookie,
+ OurName,
+ get_group(Config)}),
+ SocketB = case gen_tcp:accept(LSocket) of
+ {ok, Socket1} ->
+ Socket1;
+ Else2 ->
+ exit(Else2)
+ end,
+ {hidden,Node} = recv_name(SocketB, OurVer),
+ send_status(SocketB, ok),
+ MyChallengeB = gen_challenge(),
+ send_challenge(SocketB, OurName, MyChallengeB, OurVer, Flags),
+ recv_complement(SocketB, OurVer, OurVer),
+ gen_tcp:close(SocketB),
+ gen_tcp:close(EpmdSocket),
ok.
make_node(X) ->
@@ -345,6 +427,25 @@ make_and_check_dummy() ->
list_to_atom("dummy@"++HostNotReachable).
+%% Test that erl_interface sets the appropriate distributions flags.
+ei_dflags(Config) ->
+ AssumedVer = 5,
+ OurVer = 6,
+
+ %% Test compatibility with OTP 24 and earlier.
+ normal_connect(Config, AssumedVer, ?COMPULSORY_DFLAGS),
+ normal_connect(Config, OurVer, ?COMPULSORY_DFLAGS),
+ normal_accept(Config, OurVer, AssumedVer, ?COMPULSORY_DFLAGS),
+ normal_accept(Config, OurVer, OurVer, ?COMPULSORY_DFLAGS),
+
+ %% Test compatibility with future versions.
+ normal_connect(Config, AssumedVer, ?DFLAG_MANDATORY_25_DIGEST),
+ normal_connect(Config, OurVer, ?DFLAG_MANDATORY_25_DIGEST),
+ normal_accept(Config, OurVer, AssumedVer, ?DFLAG_MANDATORY_25_DIGEST),
+ normal_accept(Config, OurVer, OurVer, ?DFLAG_MANDATORY_25_DIGEST),
+
+ ok.
+
%%
%% Stolen from the erl_distribution_wb_test in kernel
%% To be able to do partial handshakes...
@@ -359,18 +460,6 @@ make_and_check_dummy() ->
R
end).
--define(DFLAG_PUBLISHED,1).
--define(DFLAG_ATOM_CACHE,2).
--define(DFLAG_EXTENDED_REFERENCES,4).
--define(DFLAG_EXTENDED_PIDS_PORTS,16#100).
--define(DFLAG_NEW_FLOATS,16#800).
--define(DFLAG_DIST_MONITOR,8).
--define(DFLAG_HANDSHAKE_23,16#1000000).
-
-%% From R9 and forward extended references is compulsory
-%% From 14 and forward new float is compulsory
--define(COMPULSORY_DFLAGS, (?DFLAG_EXTENDED_REFERENCES bor ?DFLAG_EXTENDED_PIDS_PORTS bor ?DFLAG_NEW_FLOATS)).
-
-define(shutdown(X), exit(X)).
-define(int16(X), [((X) bsr 8) band 16#ff, (X) band 16#ff]).
@@ -411,7 +500,7 @@ gen_digest(Challenge, Cookie) when is_integer(Challenge), is_atom(Cookie) ->
%%
-%% The differrent stages of the MD5 handshake
+%% The different stages of the MD5 handshake
%%
send_status(Socket, Stat) ->
@@ -430,7 +519,8 @@ recv_status(Socket) ->
end.
send_challenge(Socket, Node, Challenge, OurVer) ->
- send_challenge(Socket, Node, Challenge, OurVer, ?COMPULSORY_DFLAGS).
+ DefaultFlags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST,
+ send_challenge(Socket, Node, Challenge, OurVer, DefaultFlags).
send_challenge(Socket, Node, Challenge, OurVer, Flags) ->
if OurVer =:= 5 ->
@@ -463,6 +553,7 @@ recv_challenge(Socket, OurVer) ->
_Cr3,_Cr2,_Cr1,_Cr0, NL1,NL0 | Rest]} ->
true = (OurVer >= 6),
<<Flags:64>> = <<F7,F6,F5,F4,F3,F2,F1,F0>>,
+ verify_flags(Flags),
Type = flags_to_type(Flags),
NameLen = ?u16(NL1,NL0),
{NodeName,_} = lists:split(NameLen, Rest),
@@ -517,14 +608,11 @@ send_challenge_ack(Socket, Digest) ->
% ?shutdown(bad_challenge_ack)
% end.
-send_name(Socket, MyNode, OurVer, AssumedVer) ->
- Flags = ?COMPULSORY_DFLAGS bor (case OurVer of
- 5 -> 0;
- 6 -> ?DFLAG_HANDSHAKE_23
- end),
- send_name(Socket, MyNode, OurVer, AssumedVer, Flags).
-
-send_name(Socket, MyNode, OurVer, AssumedVer, Flags) ->
+send_name(Socket, MyNode, OurVer, AssumedVer, Flags0) ->
+ Flags = Flags0 bor case OurVer of
+ 5 -> 0;
+ 6 -> ?DFLAG_HANDSHAKE_23
+ end,
NodeName = atom_to_binary(MyNode, latin1),
if AssumedVer =:= 5 ->
?to_port(Socket, [$n,?int16(OurVer),?int32(Flags),NodeName]);
@@ -542,12 +630,15 @@ recv_name(Socket, OurEpmdVer) ->
{ok,[$n, V1,V0, F3,F2,F1,F0 | OtherNode]} ->
5 = OurEpmdVer,
5 = ?u16(V1,V0),
- Type = flags_to_type(?u32(F3,F2,F1,F0)),
+ Flags = ?u32(F3, F2, F1, F0),
+ verify_flags(Flags),
+ Type = flags_to_type(Flags),
{Type, list_to_atom(OtherNode)};
{ok,[$N, F7,F6,F5,F4,F3,F2,F1,F0, _Cr3,_Cr2,_Cr1,_Cr0, NL1, NL0 | Rest]} ->
true = (OurEpmdVer >= 6),
{OtherNode, _Residue} = lists:split(?u16(NL1,NL0), Rest),
<<Flags:64>> = <<F7,F6,F5,F4,F3,F2,F1,F0>>,
+ verify_flags(Flags),
Type = flags_to_type(Flags),
{Type, list_to_atom(OtherNode)};
Res ->
@@ -634,6 +725,16 @@ epmd_register(NodeName, ListenSocket, OurVer) ->
exit(Other)
end.
+verify_flags(Flags) ->
+ RequiredFlags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST,
+ if
+ Flags band RequiredFlags =:= RequiredFlags ->
+ ok;
+ true ->
+ io:format("Given flags: ~.16.0B\n", [Flags]),
+ io:format("Required flags: ~.16.0B\n", [RequiredFlags]),
+ ct:fail(missing_dflags)
+ end.
%%
%% Utilities
diff --git a/lib/et/doc/src/et_desc.xmlsrc b/lib/et/doc/src/et_desc.xmlsrc
index 29e0ab1fe3..a1f9546db2 100644
--- a/lib/et/doc/src/et_desc.xmlsrc
+++ b/lib/et/doc/src/et_desc.xmlsrc
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2002</year><year>2016</year>
+ <year>2002</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -520,7 +520,7 @@ ok]]></code>
<p><c>Hide (excluded actors)</c> - When true, this means that
the <c>Viewer</c> will hide all <c>Events</c> whose actors are
marked as excluded. Excluded actors are normally enclosed in
- round brackets when they are displayed inthe
+ round brackets when they are displayed in the
<c>Viewer</c>.</p>
</item>
diff --git a/lib/et/examples/Makefile b/lib/et/examples/Makefile
index fe6811e45d..c572fb4ce6 100644
--- a/lib/et/examples/Makefile
+++ b/lib/et/examples/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2002-2016. All Rights Reserved.
+# Copyright Ericsson AB 2002-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -61,7 +61,7 @@ EBIN = .
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES) *~
diff --git a/lib/et/src/Makefile b/lib/et/src/Makefile
index b6347d8b6d..fc66cc1eaf 100644
--- a/lib/et/src/Makefile
+++ b/lib/et/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2016. All Rights Reserved.
+# Copyright Ericsson AB 2000-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -76,8 +76,8 @@ ERL_COMPILE_FLAGS += -pa $(ERL_TOP)/lib/et/ebin -I../include -Werror
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/et/src/et.erl b/lib/et/src/et.erl
index 91c17ffdc9..b951439ef3 100644
--- a/lib/et/src/et.erl
+++ b/lib/et/src/et.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -50,7 +50,7 @@
%% et_viewer
%%
%% A graphical sequence chart tool. It is connected to a
-%% et_collector-process, which it polls regulary for more trace
+%% et_collector-process, which it polls regularly for more trace
%% events to display. Before the event is displayed a user defined
%% filter function is applied in order to skip, accept as is or
%% transform the event. Several et_viewer-processes may share the
diff --git a/lib/et/src/et_selector.erl b/lib/et/src/et_selector.erl
index 35db07cd99..b293907aef 100644
--- a/lib/et/src/et_selector.erl
+++ b/lib/et/src/et_selector.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -91,7 +91,7 @@ make_pattern({Mod, Pattern}) when is_atom(Mod) ->
%% An empty match spec deactivates tracing of calls to trace_me/4,5
%%
%% Other match specs activates tracing of calls to trace_me/4,5
-%% accordlingly with erlang:trace_pattern/2.
+%% accordingly with erlang:trace_pattern/2.
%%----------------------------------------------------------------------
change_pattern({Mod, Pattern}) when is_atom(Mod) ->
diff --git a/lib/et/src/et_wx_viewer.erl b/lib/et/src/et_wx_viewer.erl
index 51e80b73fd..d6fd3a0095 100644
--- a/lib/et/src/et_wx_viewer.erl
+++ b/lib/et/src/et_wx_viewer.erl
@@ -55,7 +55,7 @@
first_event, % Key of first event (regardless of visibility)
last_event, % Key of last event (regardless of visibility)
events_per_page, % Maximum number of shown events
- events, % Queue containg all event keys (regardless of visibility)
+ events, % Queue containing all event keys (regardless of visibility)
n_events, % Number of events available in the collector
max_actors, % Maximum number of shown actors
actors, % List of known actors
diff --git a/lib/et/test/Makefile b/lib/et/test/Makefile
index 45ea2c2ce0..55c6037c10 100644
--- a/lib/et/test/Makefile
+++ b/lib/et/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ EBIN = .
# Targets
# ----------------------------------------------------
-tests debug opt: $(TARGET_FILES)
+tests $(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/eunit/examples/Makefile b/lib/eunit/examples/Makefile
index 01620746f5..23433e1a70 100644
--- a/lib/eunit/examples/Makefile
+++ b/lib/eunit/examples/Makefile
@@ -37,7 +37,7 @@ EXAMPLE_FILES = fib.erl tests.txt
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/eunit/src/Makefile b/lib/eunit/src/Makefile
index 32f75202a0..f4eaf6807a 100644
--- a/lib/eunit/src/Makefile
+++ b/lib/eunit/src/Makefile
@@ -73,7 +73,7 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
$(TARGET_FILES): $(BEHAVIOUR_TARGET_FILES)
-debug opt: $(PARSE_TRANSFORM_BIN) $(OBJECTS)
+$(TYPES): $(PARSE_TRANSFORM_BIN) $(OBJECTS)
docs:
@@ -121,7 +121,7 @@ release_spec: opt
$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
$(INSTALL_DATA) $(PARSE_TRANSFORM_BIN) $(OBJECTS) "$(RELSYSDIR)/ebin"
$(INSTALL_DIR) "$(RELSYSDIR)/src"
- $(INSTALL_DATA) $(PARSE_TRANSFORM) $(SOURCES) "$(RELSYSDIR)/src"
+ $(INSTALL_DATA) $(PARSE_TRANSFORM) $(SOURCES) $(BEHAVIOUR_SOURCES) "$(RELSYSDIR)/src"
$(INSTALL_DATA) $(INTERNAL_HRL_FILES) "$(RELSYSDIR)/src"
$(INSTALL_DIR) "$(RELSYSDIR)/include"
$(INSTALL_DATA) $(INCLUDE_DELIVERABLES) "$(RELSYSDIR)/include"
diff --git a/lib/eunit/src/eunit_data.erl b/lib/eunit/src/eunit_data.erl
index a16faf2e80..e36f6cad13 100644
--- a/lib/eunit/src/eunit_data.erl
+++ b/lib/eunit/src/eunit_data.erl
@@ -105,7 +105,7 @@
%% @type fileName() = string()
%% TODO: Can we mark up tests as known-failures?
-%% TODO: Is it possible to handle known timout/setup failures?
+%% TODO: Is it possible to handle known timeout/setup failures?
%% TODO: Add diagnostic tests which never fail, but may cause warnings?
%% ---------------------------------------------------------------------
@@ -182,6 +182,9 @@ next(Tests) ->
none
end.
+%% Temporary suppression
+-compile([{nowarn_deprecated_function,[{slave,start_link,3},{slave,stop,1}]}]).
+
%% this returns either a #test{} or #group{} record, or {data, T} to
%% signal that T has been substituted for the given representation
@@ -388,7 +391,7 @@ parse({with, X, As}=T) when is_list(As) ->
case As of
[A | As1] ->
check_arity(A, 1, T),
- {data, [{eunit_lib:fun_parent(A), fun () -> A(X) end},
+ {data, [{erlang:fun_info_mfa(A), fun () -> A(X) end},
{with, X, As1}]};
[] ->
{data, []}
@@ -436,7 +439,7 @@ parse_simple(F) ->
parse_function(F) when is_function(F) ->
check_arity(F, 0, F),
- #test{f = F, location = eunit_lib:fun_parent(F)};
+ #test{f = F, location = erlang:fun_info_mfa(F)};
parse_function({test, M, F}) when is_atom(M), is_atom(F) ->
#test{f = eunit_test:mf_wrapper(M, F), location = {M, F, 0}};
parse_function({M, F}) when is_atom(M), is_atom(F) ->
diff --git a/lib/eunit/src/eunit_lib.erl b/lib/eunit/src/eunit_lib.erl
index c7555597c2..e3129eb30f 100644
--- a/lib/eunit/src/eunit_lib.erl
+++ b/lib/eunit/src/eunit_lib.erl
@@ -32,7 +32,7 @@
-include("eunit_internal.hrl").
--export([dlist_next/1, uniq/1, fun_parent/1, is_string/1, command/1,
+-export([dlist_next/1, uniq/1, is_string/1, command/1,
command/2, command/3, trie_new/0, trie_store/2, trie_match/2,
split_node/1, consult_file/1, list_dir/1, format_exit_term/1,
format_exception/1, format_exception/2, format_error/1, format_error/2,
@@ -378,27 +378,6 @@ split_node_2(As, Cs) ->
{list_to_atom(lists:reverse(As)), list_to_atom(Cs)}.
%% ---------------------------------------------------------------------
-%% Get the name of the containing function for a fun. (This is encoded
-%% in the name of the generated function that implements the fun.)
-fun_parent(F) ->
- {module, M} = erlang:fun_info(F, module),
- {name, N} = erlang:fun_info(F, name),
- case erlang:fun_info(F, type) of
- {type, external} ->
- {arity, A} = erlang:fun_info(F, arity),
- {M, N, A};
- {type, local} ->
- [$-|S] = atom_to_list(N),
- [S2, T] = string:split(S, "/", trailing),
- {M, list_to_atom(S2), element(1, string:to_integer(T))}
- end.
-
--ifdef(TEST).
-fun_parent_test() ->
- {?MODULE,fun_parent_test,0} = fun_parent(fun (A) -> {ok,A} end).
--endif.
-
-%% ---------------------------------------------------------------------
%% Ye olde uniq function
uniq([X, X | Xs]) -> uniq([X | Xs]);
diff --git a/lib/eunit/test/Makefile b/lib/eunit/test/Makefile
index 0889f31b54..e2fbdf7241 100644
--- a/lib/eunit/test/Makefile
+++ b/lib/eunit/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -57,7 +57,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) \
$(MODULES) > $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/ftp/src/Makefile b/lib/ftp/src/Makefile
index 93e3c4a8e5..7f18498b13 100644
--- a/lib/ftp/src/Makefile
+++ b/lib/ftp/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2018. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -83,7 +83,7 @@ ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/kernel/src \
$(TARGET_FILES): $(BEHAVIOUR_TARGET_FILES)
-debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
clean:
rm -f $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(BEHAVIOUR_TARGET_FILES)
diff --git a/lib/ftp/src/ftp.erl b/lib/ftp/src/ftp.erl
index 60bcc85794..e22a78d9f7 100644
--- a/lib/ftp/src/ftp.erl
+++ b/lib/ftp/src/ftp.erl
@@ -1255,7 +1255,7 @@ handle_cast({Pid, close}, State) ->
error_logger:info_report(Report),
{noreply, State};
-%% Catch all - This can oly happen if the application programmer writes
+%% Catch all - This can only happen if the application programmer writes
%% really bad code that violates the API.
handle_cast(Msg, State) ->
{stop, {'API_violation_connection_closed', Msg}, State}.
@@ -2260,7 +2260,7 @@ activate_connection(API, CloseTag, Socket0) ->
case API:setopts(Socket, [{active, once}]) of
ok ->
ok;
- {error, _} -> %% inet can retrun einval instead of closed
+ {error, _} -> %% inet can return einval instead of closed
self() ! {CloseTag, Socket}
end.
diff --git a/lib/ftp/src/ftp_progress.erl b/lib/ftp/src/ftp_progress.erl
index 64c612519d..c3940140a1 100644
--- a/lib/ftp/src/ftp_progress.erl
+++ b/lib/ftp/src/ftp_progress.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,8 +18,8 @@
%% %CopyrightEnd%
%%
%%
-%% Description: This module impements a temporary process that
-%% performes progress reporting during file transfer calling a user
+%% Description: This module implements a temporary process that
+%% performs progress reporting during file transfer calling a user
%% defined callback function. Its life span is as long as the ftp connection
%% processes that spawned it lives. The purpose of this process is to
%% shild the ftp connection process from errors and time consuming operations
diff --git a/lib/ftp/src/ftp_response.erl b/lib/ftp/src/ftp_response.erl
index 8d00153ba8..1fbbf9f044 100644
--- a/lib/ftp/src/ftp_response.erl
+++ b/lib/ftp/src/ftp_response.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
%% %CopyrightEnd%
%%
%%
-%% Description: This module impements handling of ftp server responses.
+%% Description: This module implements handling of ftp server responses.
-module(ftp_response).
@@ -50,7 +50,7 @@
%% {continue, {Data,
%% AccLines, StatusCode}}
%%
-%% Data = binary() - data recived on the control connection from the
+%% Data = binary() - data received on the control connection from the
%% ftp-server.
%% AccLines = [string()]
%% StatusCode = start | {byte(), byte(), byte()} | finish -
@@ -95,7 +95,7 @@ parse_lines(<<?CR, ?LF, C1, C2, C3, ?WHITE_SPACE, Rest/binary>>, Lines, {C1, C2,
%% Potential end found wait for more data
parse_lines(<<?CR, ?LF, C1, C2, C3>> = Bin, Lines, {C1, C2, C3}) ->
{continue, {Bin, Lines, {C1, C2, C3}}};
-%% Intermidate line begining with status code
+%% Intermidate line beginning with status code
parse_lines(<<?CR, ?LF, C1, C2, C3, Rest/binary>>, Lines, {C1, C2, C3}) ->
parse_lines(Rest, [C3, C2, C1, ?LF, ?CR | Lines], {C1, C2, C3});
@@ -184,7 +184,7 @@ interpret_status(?POS_PREL,_,_) -> pos_prel;
interpret_status(?POS_COMPL, ?AUTH_ACC, 4) -> tls_upgrade;
%% Positive Completion Reply
interpret_status(?POS_COMPL,_,_) -> pos_compl;
-%% Positive Intermediate Reply nedd account
+%% Positive Intermediate Reply need account
interpret_status(?POS_INTERM,?AUTH_ACC,2) -> pos_interm_acct;
%% Positive Intermediate Reply
interpret_status(?POS_INTERM,_,_) -> pos_interm;
diff --git a/lib/ftp/test/Makefile b/lib/ftp/test/Makefile
index f649daf4d1..71ddb3bc7c 100644
--- a/lib/ftp/test/Makefile
+++ b/lib/ftp/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2021. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -98,7 +98,6 @@ FTP_FLAGS += -pa ../ftp/ebin
FTP_ROOT = ../ftp
MODULES = \
- erl_make_certs \
ftp_SUITE \
ftp_format_SUITE \
ftp_test_lib
@@ -162,7 +161,7 @@ ERL_COMPILE_FLAGS += \
# 1) FTP_PRIV_DIR must be created
# ----------------------------------------------------
-tests debug opt: $(BUILDTARGET)
+tests $(TYPES): $(BUILDTARGET)
targets: $(TARGET_FILES)
diff --git a/lib/ftp/test/erl_make_certs.erl b/lib/ftp/test/erl_make_certs.erl
deleted file mode 100644
index 2af2d8c3e9..0000000000
--- a/lib/ftp/test/erl_make_certs.erl
+++ /dev/null
@@ -1,474 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2011-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%% Create test certificates
-
--module(erl_make_certs).
--include_lib("public_key/include/public_key.hrl").
-
--export([make_cert/1, gen_rsa/1, gen_dsa/2, gen_ec/1, verify_signature/3, write_pem/3]).
-
-%%--------------------------------------------------------------------
-%% @doc Create and return a der encoded certificate
-%% Option Default
-%% -------------------------------------------------------
-%% digest sha1
-%% validity {date(), date() + week()}
-%% version 3
-%% subject [] list of the following content
-%% {name, Name}
-%% {email, Email}
-%% {city, City}
-%% {state, State}
-%% {org, Org}
-%% {org_unit, OrgUnit}
-%% {country, Country}
-%% {serial, Serial}
-%% {title, Title}
-%% {dnQualifer, DnQ}
-%% issuer = {Issuer, IssuerKey} true (i.e. a ca cert is created)
-%% (obs IssuerKey migth be {Key, Password}
-%% key = KeyFile|KeyBin|rsa|dsa|ec Subject PublicKey rsa, dsa or ec generates key
-%%
-%%
-%% (OBS: The generated keys are for testing only)
-%% @spec ([{::atom(), ::term()}]) -> {Cert::binary(), Key::binary()}
-%% @end
-%%--------------------------------------------------------------------
-
-make_cert(Opts) ->
- SubjectPrivateKey = get_key(Opts),
- {TBSCert, IssuerKey} = make_tbs(SubjectPrivateKey, Opts),
- Cert = public_key:pkix_sign(TBSCert, IssuerKey),
- true = verify_signature(Cert, IssuerKey, undef), %% verify that the keys where ok
- {Cert, encode_key(SubjectPrivateKey)}.
-
-%%--------------------------------------------------------------------
-%% @doc Writes pem files in Dir with FileName ++ ".pem" and FileName ++ "_key.pem"
-%% @spec (::string(), ::string(), {Cert,Key}) -> ok
-%% @end
-%%--------------------------------------------------------------------
-write_pem(Dir, FileName, {Cert, Key = {_,_,not_encrypted}}) when is_binary(Cert) ->
- ok = der_to_pem(filename:join(Dir, FileName ++ ".pem"),
- [{'Certificate', Cert, not_encrypted}]),
- ok = der_to_pem(filename:join(Dir, FileName ++ "_key.pem"), [Key]).
-
-%%--------------------------------------------------------------------
-%% @doc Creates a rsa key (OBS: for testing only)
-%% the size are in bytes
-%% @spec (::integer()) -> {::atom(), ::binary(), ::opaque()}
-%% @end
-%%--------------------------------------------------------------------
-gen_rsa(Size) when is_integer(Size) ->
- Key = gen_rsa2(Size),
- {Key, encode_key(Key)}.
-
-%%--------------------------------------------------------------------
-%% @doc Creates a dsa key (OBS: for testing only)
-%% the sizes are in bytes
-%% @spec (::integer()) -> {::atom(), ::binary(), ::opaque()}
-%% @end
-%%--------------------------------------------------------------------
-gen_dsa(LSize,NSize) when is_integer(LSize), is_integer(NSize) ->
- Key = gen_dsa2(LSize, NSize),
- {Key, encode_key(Key)}.
-
-%%--------------------------------------------------------------------
-%% @doc Creates a ec key (OBS: for testing only)
-%% the sizes are in bytes
-%% @spec (::integer()) -> {::atom(), ::binary(), ::opaque()}
-%% @end
-%%--------------------------------------------------------------------
-gen_ec(Curve) when is_atom(Curve) ->
- Key = gen_ec2(Curve),
- {Key, encode_key(Key)}.
-
-%%--------------------------------------------------------------------
-%% @doc Verifies cert signatures
-%% @spec (::binary(), ::tuple()) -> ::boolean()
-%% @end
-%%--------------------------------------------------------------------
-verify_signature(DerEncodedCert, DerKey, _KeyParams) ->
- Key = decode_key(DerKey),
- case Key of
- #'RSAPrivateKey'{modulus=Mod, publicExponent=Exp} ->
- public_key:pkix_verify(DerEncodedCert,
- #'RSAPublicKey'{modulus=Mod, publicExponent=Exp});
- #'DSAPrivateKey'{p=P, q=Q, g=G, y=Y} ->
- public_key:pkix_verify(DerEncodedCert, {Y, #'Dss-Parms'{p=P, q=Q, g=G}});
- #'ECPrivateKey'{version = _Version, privateKey = _PrivKey,
- parameters = Params, publicKey = {0, PubKey}} ->
- public_key:pkix_verify(DerEncodedCert, {#'ECPoint'{point = PubKey}, Params})
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%% Implementation %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-get_key(Opts) ->
- case proplists:get_value(key, Opts) of
- undefined -> make_key(rsa, Opts);
- rsa -> make_key(rsa, Opts);
- dsa -> make_key(dsa, Opts);
- ec -> make_key(ec, Opts);
- Key ->
- Password = proplists:get_value(password, Opts, no_passwd),
- decode_key(Key, Password)
- end.
-
-decode_key({Key, Pw}) ->
- decode_key(Key, Pw);
-decode_key(Key) ->
- decode_key(Key, no_passwd).
-
-
-decode_key(#'RSAPublicKey'{} = Key,_) ->
- Key;
-decode_key(#'RSAPrivateKey'{} = Key,_) ->
- Key;
-decode_key(#'DSAPrivateKey'{} = Key,_) ->
- Key;
-decode_key(#'ECPrivateKey'{} = Key,_) ->
- Key;
-decode_key(PemEntry = {_,_,_}, Pw) ->
- public_key:pem_entry_decode(PemEntry, Pw);
-decode_key(PemBin, Pw) ->
- [KeyInfo] = public_key:pem_decode(PemBin),
- decode_key(KeyInfo, Pw).
-
-encode_key(Key = #'RSAPrivateKey'{}) ->
- {ok, Der} = 'OTP-PUB-KEY':encode('RSAPrivateKey', Key),
- {'RSAPrivateKey', Der, not_encrypted};
-encode_key(Key = #'DSAPrivateKey'{}) ->
- {ok, Der} = 'OTP-PUB-KEY':encode('DSAPrivateKey', Key),
- {'DSAPrivateKey', Der, not_encrypted};
-encode_key(Key = #'ECPrivateKey'{}) ->
- {ok, Der} = 'OTP-PUB-KEY':encode('ECPrivateKey', Key),
- {'ECPrivateKey', Der, not_encrypted}.
-
-make_tbs(SubjectKey, Opts) ->
- Version = list_to_atom("v"++integer_to_list(proplists:get_value(version, Opts, 3))),
-
- IssuerProp = proplists:get_value(issuer, Opts, true),
- {Issuer, IssuerKey} = issuer(IssuerProp, Opts, SubjectKey),
-
- {Algo, Parameters} = sign_algorithm(IssuerKey, Opts),
-
- SignAlgo = #'SignatureAlgorithm'{algorithm = Algo,
- parameters = Parameters},
- Subject = case IssuerProp of
- true -> %% Is a Root Ca
- Issuer;
- _ ->
- subject(proplists:get_value(subject, Opts),false)
- end,
-
- {#'OTPTBSCertificate'{serialNumber = trunc(rand:uniform()*100000000)*10000 + 1,
- signature = SignAlgo,
- issuer = Issuer,
- validity = validity(Opts),
- subject = Subject,
- subjectPublicKeyInfo = publickey(SubjectKey),
- version = Version,
- extensions = extensions(Opts)
- }, IssuerKey}.
-
-issuer(true, Opts, SubjectKey) ->
- %% Self signed
- {subject(proplists:get_value(subject, Opts), true), SubjectKey};
-issuer({Issuer, IssuerKey}, _Opts, _SubjectKey) when is_binary(Issuer) ->
- {issuer_der(Issuer), decode_key(IssuerKey)};
-issuer({File, IssuerKey}, _Opts, _SubjectKey) when is_list(File) ->
- {ok, [{cert, Cert, _}|_]} = pem_to_der(File),
- {issuer_der(Cert), decode_key(IssuerKey)}.
-
-issuer_der(Issuer) ->
- Decoded = public_key:pkix_decode_cert(Issuer, otp),
- #'OTPCertificate'{tbsCertificate=Tbs} = Decoded,
- #'OTPTBSCertificate'{subject=Subject} = Tbs,
- Subject.
-
-subject(undefined, IsRootCA) ->
- User = if IsRootCA -> "RootCA"; true -> os:getenv("USER", "test_user") end,
- Opts = [{email, User ++ "@erlang.org"},
- {name, User},
- {city, "Stockholm"},
- {country, "SE"},
- {org, "erlang"},
- {org_unit, "testing dep"}],
- subject(Opts);
-subject(Opts, _) ->
- subject(Opts).
-
-subject(SubjectOpts) when is_list(SubjectOpts) ->
- Encode = fun(Opt) ->
- {Type,Value} = subject_enc(Opt),
- [#'AttributeTypeAndValue'{type=Type, value=Value}]
- end,
- {rdnSequence, [Encode(Opt) || Opt <- SubjectOpts]}.
-
-%% Fill in the blanks
-subject_enc({name, Name}) -> {?'id-at-commonName', {printableString, Name}};
-subject_enc({email, Email}) -> {?'id-emailAddress', Email};
-subject_enc({city, City}) -> {?'id-at-localityName', {printableString, City}};
-subject_enc({state, State}) -> {?'id-at-stateOrProvinceName', {printableString, State}};
-subject_enc({org, Org}) -> {?'id-at-organizationName', {printableString, Org}};
-subject_enc({org_unit, OrgUnit}) -> {?'id-at-organizationalUnitName', {printableString, OrgUnit}};
-subject_enc({country, Country}) -> {?'id-at-countryName', Country};
-subject_enc({serial, Serial}) -> {?'id-at-serialNumber', Serial};
-subject_enc({title, Title}) -> {?'id-at-title', {printableString, Title}};
-subject_enc({dnQualifer, DnQ}) -> {?'id-at-dnQualifier', DnQ};
-subject_enc(Other) -> Other.
-
-
-extensions(Opts) ->
- case proplists:get_value(extensions, Opts, []) of
- false ->
- asn1_NOVALUE;
- Exts ->
- lists:flatten([extension(Ext) || Ext <- default_extensions(Exts)])
- end.
-
-default_extensions(Exts) ->
- Def = [{key_usage,undefined},
- {subject_altname, undefined},
- {issuer_altname, undefined},
- {basic_constraints, default},
- {name_constraints, undefined},
- {policy_constraints, undefined},
- {ext_key_usage, undefined},
- {inhibit_any, undefined},
- {auth_key_id, undefined},
- {subject_key_id, undefined},
- {policy_mapping, undefined}],
- Filter = fun({Key, _}, D) -> lists:keydelete(Key, 1, D) end,
- Exts ++ lists:foldl(Filter, Def, Exts).
-
-extension({_, undefined}) -> [];
-extension({basic_constraints, Data}) ->
- case Data of
- default ->
- #'Extension'{extnID = ?'id-ce-basicConstraints',
- extnValue = #'BasicConstraints'{cA=true},
- critical=true};
- false ->
- [];
- Len when is_integer(Len) ->
- #'Extension'{extnID = ?'id-ce-basicConstraints',
- extnValue = #'BasicConstraints'{cA=true, pathLenConstraint=Len},
- critical=true};
- _ ->
- #'Extension'{extnID = ?'id-ce-basicConstraints',
- extnValue = Data}
- end;
-extension({Id, Data, Critical}) ->
- #'Extension'{extnID = Id, extnValue = Data, critical = Critical}.
-
-
-publickey(#'RSAPrivateKey'{modulus=N, publicExponent=E}) ->
- Public = #'RSAPublicKey'{modulus=N, publicExponent=E},
- Algo = #'PublicKeyAlgorithm'{algorithm= ?rsaEncryption, parameters='NULL'},
- #'OTPSubjectPublicKeyInfo'{algorithm = Algo,
- subjectPublicKey = Public};
-publickey(#'DSAPrivateKey'{p=P, q=Q, g=G, y=Y}) ->
- Algo = #'PublicKeyAlgorithm'{algorithm= ?'id-dsa',
- parameters={params, #'Dss-Parms'{p=P, q=Q, g=G}}},
- #'OTPSubjectPublicKeyInfo'{algorithm = Algo, subjectPublicKey = Y};
-publickey(#'ECPrivateKey'{version = _Version,
- privateKey = _PrivKey,
- parameters = Params,
- publicKey = {0, PubKey}}) ->
- Algo = #'PublicKeyAlgorithm'{algorithm= ?'id-ecPublicKey', parameters=Params},
- #'OTPSubjectPublicKeyInfo'{algorithm = Algo,
- subjectPublicKey = #'ECPoint'{point = PubKey}}.
-
-validity(Opts) ->
- DefFrom0 = calendar:gregorian_days_to_date(calendar:date_to_gregorian_days(date())-1),
- DefTo0 = calendar:gregorian_days_to_date(calendar:date_to_gregorian_days(date())+7),
- {DefFrom, DefTo} = proplists:get_value(validity, Opts, {DefFrom0, DefTo0}),
- Format = fun({Y,M,D}) -> lists:flatten(io_lib:format("~w~2..0w~2..0w000000Z",[Y,M,D])) end,
- #'Validity'{notBefore={generalTime, Format(DefFrom)},
- notAfter ={generalTime, Format(DefTo)}}.
-
-sign_algorithm(#'RSAPrivateKey'{}, Opts) ->
- Type = case proplists:get_value(digest, Opts, sha1) of
- sha1 -> ?'sha1WithRSAEncryption';
- sha512 -> ?'sha512WithRSAEncryption';
- sha384 -> ?'sha384WithRSAEncryption';
- sha256 -> ?'sha256WithRSAEncryption';
- md5 -> ?'md5WithRSAEncryption';
- md2 -> ?'md2WithRSAEncryption'
- end,
- {Type, 'NULL'};
-sign_algorithm(#'DSAPrivateKey'{p=P, q=Q, g=G}, _Opts) ->
- {?'id-dsa-with-sha1', {params,#'Dss-Parms'{p=P, q=Q, g=G}}};
-sign_algorithm(#'ECPrivateKey'{}, Opts) ->
- Type = case proplists:get_value(digest, Opts, sha1) of
- sha1 -> ?'ecdsa-with-SHA1';
- sha512 -> ?'ecdsa-with-SHA512';
- sha384 -> ?'ecdsa-with-SHA384';
- sha256 -> ?'ecdsa-with-SHA256'
- end,
- {Type, 'NULL'}.
-
-make_key(rsa, _Opts) ->
- %% (OBS: for testing only)
- gen_rsa2(64);
-make_key(dsa, _Opts) ->
- gen_dsa2(128, 20); %% Bytes i.e. {1024, 160}
-make_key(ec, _Opts) ->
- %% (OBS: for testing only)
- gen_ec2(secp256k1).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% RSA key generation (OBS: for testing only)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
--define(SMALL_PRIMES, [65537,97,89,83,79,73,71,67,61,59,53,
- 47,43,41,37,31,29,23,19,17,13,11,7,5,3]).
-
-gen_rsa2(Size) ->
- P = prime(Size),
- Q = prime(Size),
- N = P*Q,
- Tot = (P - 1) * (Q - 1),
- [E|_] = lists:dropwhile(fun(Candidate) -> (Tot rem Candidate) == 0 end, ?SMALL_PRIMES),
- {D1,D2} = extended_gcd(E, Tot),
- D = erlang:max(D1,D2),
- case D < E of
- true ->
- gen_rsa2(Size);
- false ->
- {Co1,Co2} = extended_gcd(Q, P),
- Co = erlang:max(Co1,Co2),
- #'RSAPrivateKey'{version = 'two-prime',
- modulus = N,
- publicExponent = E,
- privateExponent = D,
- prime1 = P,
- prime2 = Q,
- exponent1 = D rem (P-1),
- exponent2 = D rem (Q-1),
- coefficient = Co
- }
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% DSA key generation (OBS: for testing only)
-%% See http://en.wikipedia.org/wiki/Digital_Signature_Algorithm
-%% and the fips_186-3.pdf
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-gen_dsa2(LSize, NSize) ->
- Q = prime(NSize), %% Choose N-bit prime Q
- X0 = prime(LSize),
- P0 = prime((LSize div 2) +1),
-
- %% Choose L-bit prime modulus P such that p-1 is a multiple of q.
- case dsa_search(X0 div (2*Q*P0), P0, Q, 1000) of
- error ->
- gen_dsa2(LSize, NSize);
- P ->
- G = crypto:mod_pow(2, (P-1) div Q, P), % Choose G a number whose multiplicative order modulo p is q.
- %% such that This may be done by setting g = h^(p-1)/q mod p, commonly h=2 is used.
-
- X = prime(20), %% Choose x by some random method, where 0 < x < q.
- Y = crypto:mod_pow(G, X, P), %% Calculate y = g^x mod p.
-
- #'DSAPrivateKey'{version=0, p = P, q = Q,
- g = crypto:bytes_to_integer(G), y = crypto:bytes_to_integer(Y), x = X}
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% EC key generation (OBS: for testing only)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-gen_ec2(CurveId) ->
- {PubKey, PrivKey} = crypto:generate_key(ecdh, CurveId),
-
- #'ECPrivateKey'{version = 1,
- privateKey = binary_to_list(PrivKey),
- parameters = {namedCurve, pubkey_cert_records:namedCurves(CurveId)},
- publicKey = {0, PubKey}}.
-
-%% See fips_186-3.pdf
-dsa_search(T, P0, Q, Iter) when Iter > 0 ->
- P = 2*T*Q*P0 + 1,
- case is_prime(P, 50) of
- true -> P;
- false -> dsa_search(T+1, P0, Q, Iter-1)
- end;
-dsa_search(_,_,_,_) ->
- error.
-
-
-%%%%%%% Crypto Math %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-prime(ByteSize) ->
- Rand = odd_rand(ByteSize),
- prime_odd(Rand, 0).
-
-prime_odd(Rand, N) ->
- case is_prime(Rand, 50) of
- true ->
- Rand;
- false ->
- prime_odd(Rand+2, N+1)
- end.
-
-%% see http://en.wikipedia.org/wiki/Fermat_primality_test
-is_prime(_, 0) -> true;
-is_prime(Candidate, Test) ->
- CoPrime = odd_rand(10000, Candidate),
- Result = crypto:mod_pow(CoPrime, Candidate, Candidate) ,
- is_prime(CoPrime, crypto:bytes_to_integer(Result), Candidate, Test).
-
-is_prime(CoPrime, CoPrime, Candidate, Test) ->
- is_prime(Candidate, Test-1);
-is_prime(_,_,_,_) ->
- false.
-
-odd_rand(Size) ->
- Min = 1 bsl (Size*8-1),
- Max = (1 bsl (Size*8))-1,
- odd_rand(Min, Max).
-
-odd_rand(Min,Max) when Min < Max ->
- Rand = Min + rand:uniform(Max - Min - 1),
- case Rand rem 2 of
- 0 ->
- Rand + 1;
- _ ->
- Rand
- end.
-
-extended_gcd(A, B) ->
- case A rem B of
- 0 ->
- {0, 1};
- N ->
- {X, Y} = extended_gcd(B, N),
- {Y, X-Y*(A div B)}
- end.
-
-pem_to_der(File) ->
- {ok, PemBin} = file:read_file(File),
- public_key:pem_decode(PemBin).
-
-der_to_pem(File, Entries) ->
- PemBin = public_key:pem_encode(Entries),
- file:write_file(File, PemBin).
-
diff --git a/lib/ftp/test/ftp_SUITE.erl b/lib/ftp/test/ftp_SUITE.erl
index fb6468b499..3c9442a99f 100644
--- a/lib/ftp/test/ftp_SUITE.erl
+++ b/lib/ftp/test/ftp_SUITE.erl
@@ -516,7 +516,7 @@ ls(Config0) ->
%%-------------------------------------------------------------------------
nlist() ->
[{doc,"Open an ftp connection; nlist the current directory, and the "
- "\"test\" directory. Nlist does not behave consistenly over "
+ "\"test\" directory. Nlist does not behave consistently over "
"operating systems. On some it is an error to have an empty "
"directory."}].
nlist(Config0) ->
@@ -862,7 +862,7 @@ recv_chunk_delay(Config0) when is_list(Config0) ->
delay_recv_chunk(Pid) ->
delay_recv_chunk(Pid, <<>>).
delay_recv_chunk(Pid, Acc) ->
- ct:pal("Received size ~p", [byte_size(Acc)]),
+ ct:log("Received size ~p", [byte_size(Acc)]),
case ftp:recv_chunk(Pid) of
ok ->
{ok, Acc};
@@ -888,7 +888,7 @@ quote(Config) ->
Pid = proplists:get_value(ftp, Config),
["257 \""++_Rest] = ftp:quote(Pid, "pwd"), %% 257
[_| _] = ftp:quote(Pid, "help"),
- %% This negativ test causes some ftp servers to hang. This test
+ %% This negative test causes some ftp servers to hang. This test
%% is not important for the client, so we skip it for now.
%%["425 Can't build data connection: Connection refused."]
%% = ftp:quote(Pid, "list"),
@@ -948,7 +948,7 @@ unexpected_call(Config) when is_list(Config) ->
Flag = process_flag(trap_exit, true),
Pid = proplists:get_value(ftp, Config),
- %% Serious programming fault, connetion will be shut down
+ %% A serious programming fault, the connection will be shut down
case (catch gen_server:call(Pid, {self(), foobar, 10}, infinity)) of
{error, {connection_terminated, 'API_violation'}} ->
ok;
@@ -965,7 +965,7 @@ unexpected_cast()->
unexpected_cast(Config) when is_list(Config) ->
Flag = process_flag(trap_exit, true),
Pid = proplists:get_value(ftp, Config),
- %% Serious programming fault, connetion will be shut down
+ %% A serious programming fault, the connection will be shut down
gen_server:cast(Pid, {self(), foobar, 10}),
ct:sleep(500),
undefined = process_info(Pid, status),
@@ -977,7 +977,7 @@ unexpected_bang()->
unexpected_bang(Config) when is_list(Config) ->
Flag = process_flag(trap_exit, true),
Pid = proplists:get_value(ftp, Config),
- %% Could be an innocent misstake the connection lives.
+ %% Could be an innocent mistake the connection lives.
Pid ! foobar,
ct:sleep(500),
{status, _} = process_info(Pid, status),
@@ -1016,7 +1016,7 @@ clean_shutdown(Config) ->
%%-------------------------------------------------------------------------
ftp_worker() ->
[{doc, "Makes sure the ftp worker processes are added and removed "
- "appropriatly to/from the supervison tree."}].
+ "appropriately to/from the supervison tree."}].
ftp_worker(Config) ->
Pid = proplists:get_value(ftp,Config),
case supervisor:which_children(ftp_sup) of
@@ -1217,7 +1217,7 @@ start_ftpd(Config0) ->
ct:log("Ftp server ~p started on ~p:~p but is unusable:~n~p:~p",
[AbsName,Host,Port,Class,Exception]),
catch stop_ftpd(Config),
- {skip, [AbsName," started but unusuable"]}
+ {skip, [AbsName," started but unusable"]}
end;
{error,Msg} ->
{skip, [AbsName," not started: ",Msg]}
diff --git a/lib/ftp/test/ftp_SUITE_data/vsftpd.conf b/lib/ftp/test/ftp_SUITE_data/vsftpd.conf
index 51cea2dcd8..7a2bf67805 100644
--- a/lib/ftp/test/ftp_SUITE_data/vsftpd.conf
+++ b/lib/ftp/test/ftp_SUITE_data/vsftpd.conf
@@ -2,7 +2,7 @@
###
### Some parameters are given in the vsftpd start command.
###
-### Typical command-line paramters are such that has a file path
+### Typical command-line parameters are such that has a file path
### component like cert files.
###
diff --git a/lib/ftp/test/ftp_format_SUITE.erl b/lib/ftp/test/ftp_format_SUITE.erl
index e1d0de2390..c5c3c4b06d 100644
--- a/lib/ftp/test/ftp_format_SUITE.erl
+++ b/lib/ftp/test/ftp_format_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -64,7 +64,7 @@ end_per_testcase(_, _) ->
%%-------------------------------------------------------------------------
ftp_150() ->
- [{doc, "Especially check that respons can be devided in a random place."}].
+ [{doc, "Especially check that a response can be divided in a random place."}].
ftp_150(Config) when is_list(Config) ->
FtpResponse = ["150 ASCII data conn", "ection for /bin/ls ",
"(134.138.177", ".89,50434) (0 bytes).\r\n"],
@@ -75,7 +75,7 @@ ftp_150(Config) when is_list(Config) ->
{pos_prel, _} = ftp_response:interpret(Msg).
ftp_200() ->
- [{doc, "Especially check that respons can be devided after the first status "
+ [{doc, "Especially check that a response can be divided after the first status "
"code character and in the end delimiter."}].
ftp_200(Config) when is_list(Config) ->
FtpResponse = ["2", "00 PORT command successful.", [?CR], [?LF]],
@@ -86,8 +86,8 @@ ftp_200(Config) when is_list(Config) ->
ok.
ftp_220() ->
- [{doc, "Especially check that respons can be devided after the "
- "first with space "}].
+ [{doc, "Especially check that a response can be divided after the "
+ "first white space "}].
ftp_220(Config) when is_list(Config) ->
FtpResponse = ["220 ","fingon FTP server (SunOS 5.8) ready.\r\n"],
@@ -97,7 +97,7 @@ ftp_220(Config) when is_list(Config) ->
ok.
ftp_226() ->
- [{doc, "Especially check that respons can be devided after second status code"
+ [{doc, "Especially check that a response can be divided after second status code"
" character and in the end delimiter."}].
ftp_226(Config) when is_list(Config) ->
FtpResponse = ["22" "6 Transfer complete.\r", [?LF]],
@@ -118,7 +118,7 @@ ftp_257(Config) when is_list(Config) ->
ok.
ftp_331() ->
- [{doc, "Especially check that respons can be devided after the third status "
+ [{doc, "Especially check that a response can be divided after the third status "
" status code character."}].
ftp_331(Config) when is_list(Config) ->
%% Brake before white space after code
@@ -151,7 +151,7 @@ ftp_multiple_lines_status_in_msg(Config) when is_list(Config) ->
ok.
ftp_multiple_lines() ->
- [{doc, "Especially check multiple lines devided in significant places"}].
+ [{doc, "Especially check multiple lines divided in significant places"}].
ftp_multiple_lines(Config) when is_list(Config) ->
FtpResponse = ["21", "4","-The",
" following commands are recognized:\r\n"
@@ -231,9 +231,9 @@ ftp_multiple_lines(Config) when is_list(Config) ->
ftp_other_status_codes() ->
[{doc, "Check that other valid status codes, than the ones above, are handled"
- "by ftp_response:interpret/1. Note there are som ftp status codes"
- "that will not be received with the current ftp instruction support,"
- "they are not included here."}].
+ "by ftp_response:interpret/1. Note that there are some ftp status codes"
+ "that will not be received with the current ftp instruction support."
+ "They are not included here."}].
ftp_other_status_codes(Config) when is_list(Config) ->
%% 1XX
diff --git a/lib/ftp/test/ftp_test_lib.erl b/lib/ftp/test/ftp_test_lib.erl
index f5fbc39037..8ab337b54a 100644
--- a/lib/ftp/test/ftp_test_lib.erl
+++ b/lib/ftp/test/ftp_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -28,14 +28,15 @@
make_cert_files(Dir) ->
#{server_config := ServerConf,
client_config := _} =
- public_key:pkix_test_data(#{server_chain =>
- #{root => [{key, hardcode_rsa_key(1)}],
- intermediates => [[{key, hardcode_rsa_key(2)}]],
- peer => [{key, hardcode_rsa_key(3)}]},
- client_chain =>
- #{root => [{key, hardcode_rsa_key(1)}],
- intermediates => [[{key, hardcode_rsa_key(3)}]],
- peer => [{key, hardcode_rsa_key(2)}]}}),
+ public_key:pkix_test_data(
+ #{server_chain =>
+ #{root => [{key, hardcode_rsa_key(1)},{digest,appropriate_sha()}],
+ intermediates => [[{key, hardcode_rsa_key(2)},{digest,appropriate_sha()}]],
+ peer => [{key, hardcode_rsa_key(3)},{digest,appropriate_sha()}]},
+ client_chain =>
+ #{root => [{key, hardcode_rsa_key(1)},{digest,appropriate_sha()}],
+ intermediates => [[{key, hardcode_rsa_key(3)},{digest,appropriate_sha()}]],
+ peer => [{key, hardcode_rsa_key(2)},{digest,appropriate_sha()}]}}),
CaCertFile = filename:join(Dir, "server-cacerts.pem"),
CertFile = filename:join(Dir, "server-cert.pem"),
@@ -48,6 +49,20 @@ make_cert_files(Dir) ->
der_to_pem(KeyFile, [key_entry(Key)]),
der_to_pem(CaCertFile, ca_entries(CAs)).
+appropriate_sha() ->
+ Hashes = proplists:get_value(hashs, crypto:supports()),
+ case os:cmd("openssl version") of
+ "OpenSSL 0.9.8" ++ _ ->
+ sha;
+ _ ->
+ case lists:member(sha256, Hashes) of
+ true ->
+ sha256;
+ false ->
+ sha
+ end
+ end.
+
cert_entry(Cert) ->
{'Certificate', Cert, not_encrypted}.
diff --git a/lib/ftp/test/property_test/ftp_simple_client_server_data/vsftpd.conf b/lib/ftp/test/property_test/ftp_simple_client_server_data/vsftpd.conf
index fd48e2abf0..dc6d0ff0b3 100644
--- a/lib/ftp/test/property_test/ftp_simple_client_server_data/vsftpd.conf
+++ b/lib/ftp/test/property_test/ftp_simple_client_server_data/vsftpd.conf
@@ -2,7 +2,7 @@
###
### Some parameters are given in the vsftpd start command.
###
-### Typical command-line paramters are such that has a file path
+### Typical command-line parameters are such that has a file path
### component like cert files.
###
diff --git a/lib/inets/doc/src/http_uri.xml b/lib/inets/doc/src/http_uri.xml
index eb47a823fb..39b367eb92 100644
--- a/lib/inets/doc/src/http_uri.xml
+++ b/lib/inets/doc/src/http_uri.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2012</year><year>2021</year>
+ <year>2012</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -57,25 +57,10 @@
<tag><c>uri() = string() | binary()</c></tag>
<item><p>Syntax according to the URI definition in RFC 3986,
for example, "http://www.erlang.org/"</p></item>
- <tag><c>user_info() = string() | binary()</c></tag>
- <item><p></p></item>
- <tag><c>scheme() = atom()</c></tag>
- <item><p>Example: http, https</p></item>
- <tag><c>host() = string() | binary()</c></tag>
- <item><p></p></item>
- <tag><c>port() = inet:port_number()</c></tag>
- <item><p></p></item>
- <tag><c>path() = string() | binary()</c></tag>
- <item><p>Represents a file path or directory path</p></item>
- <tag><c>query() = string() | binary()</c></tag>
- <item><p></p></item>
- <tag><c>fragment() = string() | binary()</c></tag>
- <item><p></p></item>
</taglist>
<p>For more information about URI, see
<url href="http://www.ietf.org/rfc/rfc3986.txt">RFC 3986</url>.</p>
- <marker id="scheme_defaults"></marker>
</section>
<funcs>
@@ -108,80 +93,6 @@
<marker id="decode"></marker>
</desc>
</func>
-
- <func>
- <name since="OTP R15B01">parse(URI) -> {ok, Result} | {error, Reason}</name>
- <name since="OTP R15B01">parse(URI, Options) -> {ok, Result} | {error, Reason}</name>
- <fsummary>Parses a URI.</fsummary>
- <type>
- <v>URI = uri()</v>
- <v>Options = [Option]</v>
- <v>Option = {ipv6_host_with_brackets, boolean()} |
- {scheme_defaults, scheme_defaults()} |
- {fragment, boolean()} |
- {scheme_validation_fun, fun()}</v>
- <v>Result = {Scheme, UserInfo, Host, Port, Path, Query} |
- {Scheme, UserInfo, Host, Port, Path, Query, Fragment}</v>
- <v>Scheme = scheme()</v>
- <v>UserInfo = user_info()</v>
- <v>Host = host()</v>
- <v>Port = inet:port_number()</v>
- <v>Path = path()</v>
- <v>Query = query()</v>
- <v>Fragment = fragment()</v>
- <v>Reason = term()</v>
- </type>
- <desc>
- <p>Parses a URI. If no scheme defaults
- are provided, the value of the
- <seeerl marker="#scheme_defaults">scheme_defaults</seeerl>
- function is used.</p>
-
- <p>When parsing a URI with an unknown scheme (that is,
- a scheme not found in the scheme defaults), a port number must be
- provided, otherwise the parsing fails.</p>
-
- <p>If the fragment option is <c>true</c>, the URI fragment is returned as
- part of the parsing result, otherwise it is ignored.</p>
-
- <p>Scheme validation fun is to be defined as follows:</p>
-
- <code>
-fun(SchemeStr :: string() | binary()) ->
- valid | {error, Reason :: term()}.
- </code>
-
- <p>It is called before scheme string gets converted into scheme atom and
- thus possible atom leak could be prevented</p>
-
- <warning>
- <p>The scheme portion of the URI gets converted into atom,
- meaning that atom leak may occur. Specifying a scheme
- validation fun is recommended unless the URI is already
- sanitized.</p>
- </warning>
-
- <marker id="encode"></marker>
- </desc>
- </func>
-
- <func>
- <name since="OTP R15B01">scheme_defaults() -> SchemeDefaults</name>
- <fsummary>A list of the scheme and their default ports.</fsummary>
- <type>
- <v>SchemeDefaults = [{scheme(), default_scheme_port_number()}] </v>
- <v>default_scheme_port_number() = inet:port_number()</v>
- </type>
- <desc>
- <p>Provides a list of the scheme and their default
- port numbers supported (by default) by this utility.</p>
-
- <marker id="parse"></marker>
- </desc>
- </func>
-
-
-
</funcs>
<!--
diff --git a/lib/inets/doc/src/httpd_util.xml b/lib/inets/doc/src/httpd_util.xml
index 60a147399d..3ab3d7c163 100644
--- a/lib/inets/doc/src/httpd_util.xml
+++ b/lib/inets/doc/src/httpd_util.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1997</year><year>2021</year>
+ <year>1997</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -35,7 +35,8 @@
<description>
<p>This module provides the Erlang web server API module
programmer with miscellaneous utility functions.</p>
-
+ <note><p>Note the module is only recommended for using with httpd - for other
+ cases it should be considered as deprecated.</p></note>
<marker id="convert_request_date"></marker>
</description>
diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml
index 961376b4dd..90f6d1b374 100644
--- a/lib/inets/doc/src/notes.xml
+++ b/lib/inets/doc/src/notes.xml
@@ -2552,8 +2552,7 @@
<p>Utility module
<seeerl marker="http_uri">http_uri</seeerl>
now officially supported. </p>
- <p>Also, the
- <seeerl marker="http_uri#parse">parse</seeerl>
+ <p>Also, the <c>http_uri:parse</c>
function has been extended with more
scheme support and a way to provide your own scheme info. </p>
<p>Own Id: OTP-9983</p>
diff --git a/lib/inets/examples/httpd_load_test/Makefile b/lib/inets/examples/httpd_load_test/Makefile
index 8b1b654593..19edf10cb0 100644
--- a/lib/inets/examples/httpd_load_test/Makefile
+++ b/lib/inets/examples/httpd_load_test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2010-2016. All Rights Reserved.
+# Copyright Ericsson AB 2010-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -77,8 +77,8 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/inets/examples/server_root/Makefile b/lib/inets/examples/server_root/Makefile
index d11389f0a7..5dfb8d1704 100644
--- a/lib/inets/examples/server_root/Makefile
+++ b/lib/inets/examples/server_root/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2016. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -163,7 +163,7 @@ ERL_COMPILE_FLAGS +=
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/inets/priv/Makefile b/lib/inets/priv/Makefile
index ddd35e8625..0f10e8d3ce 100644
--- a/lib/inets/priv/Makefile
+++ b/lib/inets/priv/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2016. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -46,7 +46,7 @@ ERL_COMPILE_FLAGS +=
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/inets/src/http_client/Makefile b/lib/inets/src/http_client/Makefile
index a1c1f36b70..62f62792f0 100644
--- a/lib/inets/src/http_client/Makefile
+++ b/lib/inets/src/http_client/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2016. All Rights Reserved.
+# Copyright Ericsson AB 2005-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -77,7 +77,7 @@ ERL_COMPILE_FLAGS += \
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/inets/src/http_client/httpc_handler.erl b/lib/inets/src/http_client/httpc_handler.erl
index 615314ac1d..c5993cc37c 100644
--- a/lib/inets/src/http_client/httpc_handler.erl
+++ b/lib/inets/src/http_client/httpc_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -962,7 +962,7 @@ handle_http_body(_, #state{status = {ssl_tunnel, _},
handle_http_body(_, #state{status = {ssl_tunnel, Request},
status_line = StatusLine} = State) ->
- ClientErrMsg = httpc_response:error(Request,{could_no_establish_ssh_tunnel, StatusLine}),
+ ClientErrMsg = httpc_response:error(Request,{could_not_establish_ssl_tunnel, StatusLine}),
NewState = answer_request(Request, ClientErrMsg, State),
{stop, normal, NewState};
diff --git a/lib/inets/src/http_lib/Makefile b/lib/inets/src/http_lib/Makefile
index 8248e37c44..481c4f66eb 100644
--- a/lib/inets/src/http_lib/Makefile
+++ b/lib/inets/src/http_lib/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2016. All Rights Reserved.
+# Copyright Ericsson AB 2005-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -73,7 +73,7 @@ ERL_COMPILE_FLAGS += \
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/inets/src/http_lib/http_request.erl b/lib/inets/src/http_lib/http_request.erl
index 02fa8acb80..af8b6754b1 100644
--- a/lib/inets/src/http_lib/http_request.erl
+++ b/lib/inets/src/http_lib/http_request.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -103,11 +103,9 @@ is_absolut_uri(_) ->
%% Description: returns a normalized Host header value, with the port
%% number omitted for well-known ports
%%-------------------------------------------------------------------------
-normalize_host(https, Host, Port) when Port =:= 443 orelse
- Port =:= undefined ->
+normalize_host(https, Host, 443 = _Port) ->
Host;
-normalize_host(http, Host, Port) when Port =:= 80 orelse
- Port =:= undefined ->
+normalize_host(http, Host, 80 = _Port) ->
Host;
normalize_host(_Scheme, Host, Port) ->
Host ++ ":" ++ integer_to_list(Port).
diff --git a/lib/inets/src/http_lib/http_uri.erl b/lib/inets/src/http_lib/http_uri.erl
index e8bc9b3560..d4f352b692 100644
--- a/lib/inets/src/http_lib/http_uri.erl
+++ b/lib/inets/src/http_lib/http_uri.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -17,124 +17,33 @@
%%
%% %CopyrightEnd%
%%
-%%
-%% This is from chapter 3, Syntax Components, of RFC 3986:
-%%
-%% The generic URI syntax consists of a hierarchical sequence of
-%% components referred to as the scheme, authority, path, query, and
-%% fragment.
-%%
-%% URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
-%%
-%% hier-part = "//" authority path-abempty
-%% / path-absolute
-%% / path-rootless
-%% / path-empty
-%%
-%% The scheme and path components are required, though the path may be
-%% empty (no characters). When authority is present, the path must
-%% either be empty or begin with a slash ("/") character. When
-%% authority is not present, the path cannot begin with two slash
-%% characters ("//"). These restrictions result in five different ABNF
-%% rules for a path (Section 3.3), only one of which will match any
-%% given URI reference.
-%%
-%% The following are two example URIs and their component parts:
-%%
-%% foo://example.com:8042/over/there?name=ferret#nose
-%% \_/ \______________/\_________/ \_________/ \__/
-%% | | | | |
-%% scheme authority path query fragment
-%% | _____________________|__
-%% / \ / \
-%% urn:example:animal:ferret:nose
-%%
-%% scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
-%% authority = [ userinfo "@" ] host [ ":" port ]
-%% userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
-%%
-%%
-
-module(http_uri).
--export([parse/1, parse/2,
- scheme_defaults/0,
- encode/1, decode/1]).
-
+-export([encode/1, decode/1]).
--deprecated({parse, 1, "use uri_string functions instead"}).
--deprecated({parse, 2, "use uri_string functions instead"}).
--deprecated({encode, 1, "use uri_string functions instead"}).
--deprecated({decode, 1, "use uri_string functions instead"}).
--deprecated({scheme_defaults, 0, "use uri_string functions instead"}).
-
+-deprecated({encode, 1, "use uri_string:quote function instead"}).
+-deprecated({decode, 1, "use uri_string:unquote function instead"}).
+-removed({parse, 1, "use uri_string functions instead"}).
+-removed({parse, 2, "use uri_string functions instead"}).
+-removed({scheme_defaults, 0, "use uri_string functions instead"}).
--export_type([uri/0,
- user_info/0,
- scheme/0, default_scheme_port_number/0,
- host/0,
- path/0,
- query/0,
- fragment/0]).
+-export_type([uri/0]).
-type uri() :: string() | binary().
--type user_info() :: string() | binary().
--type scheme() :: atom().
--type host() :: string() | binary().
--type path() :: string() | binary().
--type query() :: string() | binary().
--type fragment() :: string() | binary().
--type port_number() :: inet:port_number().
--type default_scheme_port_number() :: port_number().
-type hex_uri() :: string() | binary(). %% Hexadecimal encoded URI.
-type maybe_hex_uri() :: string() | binary(). %% A possibly hexadecimal encoded URI.
--type scheme_defaults() :: [{scheme(), default_scheme_port_number()}].
--type scheme_validation_fun() :: fun((SchemeStr :: string() | binary()) ->
- valid | {error, Reason :: term()}).
+-removed_type({user_info, 0, "use uri_string instead"}).
+-removed_type({scheme, 0, "use uri_string instead"}).
+-removed_type({host, 0, "use uri_string instead"}).
+-removed_type({path, 0, "use uri_string instead"}).
+-removed_type({query, 0, "use uri_string instead"}).
+-removed_type({fragment, 0, "use uri_string instead"}).
+-removed_type({default_scheme_port_number, 0, "use uri_string instead"}).
%%%=========================================================================
%%% API
%%%=========================================================================
-
--spec scheme_defaults() -> scheme_defaults().
-scheme_defaults() ->
- [{http, 80},
- {https, 443},
- {ftp, 21},
- {ssh, 22},
- {sftp, 22},
- {tftp, 69}].
-
--type parse_result() ::
- {scheme(), user_info(), host(), port_number(), path(), query()} |
- {scheme(), user_info(), host(), port_number(), path(), query(),
- fragment()}.
-
--spec parse(uri()) -> {ok, parse_result()} | {error, term()}.
-parse(AbsURI) ->
- parse(AbsURI, []).
-
--spec parse(uri(), [Option]) -> {ok, parse_result()} | {error, term()} when
- Option :: {ipv6_host_with_brackets, boolean()} |
- {scheme_defaults, scheme_defaults()} |
- {fragment, boolean()} |
- {scheme_validation_fun, scheme_validation_fun() | none}.
-parse(AbsURI, Opts) ->
- case parse_scheme(AbsURI, Opts) of
- {error, Reason} ->
- {error, Reason};
- {Scheme, DefaultPort, Rest} ->
- case (catch parse_uri_rest(Scheme, DefaultPort, Rest, Opts)) of
- {ok, Result} ->
- {ok, Result};
- {error, Reason} ->
- {error, {Reason, Scheme, AbsURI}};
- _ ->
- {error, {malformed_url, Scheme, AbsURI}}
- end
- end.
-
reserved() ->
sets:from_list([$;, $:, $@, $&, $=, $+, $,, $/, $?,
$#, $[, $], $<, $>, $\", ${, $}, $|, %"
@@ -171,145 +80,8 @@ do_decode_binary(<<>>) ->
%%%========================================================================
%%% Internal functions
%%%========================================================================
-
-which_scheme_defaults(Opts) ->
- Key = scheme_defaults,
- case lists:keysearch(Key, 1, Opts) of
- {value, {Key, SchemeDefaults}} ->
- SchemeDefaults;
- false ->
- scheme_defaults()
- end.
-
-parse_scheme(AbsURI, Opts) ->
- case split_uri(AbsURI, ":", {error, no_scheme}, 1, 1) of
- {error, no_scheme} ->
- {error, no_scheme};
- {SchemeStr, Rest} ->
- case extract_scheme(SchemeStr, Opts) of
- {error, Error} ->
- {error, Error};
- {ok, Scheme} ->
- SchemeDefaults = which_scheme_defaults(Opts),
- case lists:keysearch(Scheme, 1, SchemeDefaults) of
- {value, {Scheme, DefaultPort}} ->
- {Scheme, DefaultPort, Rest};
- false ->
- {Scheme, no_default_port, Rest}
- end
- end
- end.
-
-extract_scheme(Str, Opts) ->
- case lists:keysearch(scheme_validation_fun, 1, Opts) of
- {value, {scheme_validation_fun, Fun}} when is_function(Fun) ->
- case Fun(Str) of
- valid ->
- {ok, to_atom(http_util:to_lower(Str))};
- {error, Error} ->
- {error, Error}
- end;
- _ ->
- {ok, to_atom(http_util:to_lower(Str))}
- end.
-
-to_atom(S) when is_list(S) ->
- list_to_atom(S);
-to_atom(S) when is_binary(S) ->
- binary_to_atom(S, unicode).
-
-parse_uri_rest(Scheme, DefaultPort, <<"//", URIPart/binary>>, Opts) ->
- {Authority, PathQueryFragment} =
- split_uri(URIPart, "[/?#]", {URIPart, <<"">>}, 1, 0),
- {RawPath, QueryFragment} =
- split_uri(PathQueryFragment, "[?#]", {PathQueryFragment, <<"">>}, 1, 0),
- {Query, Fragment} =
- split_uri(QueryFragment, "#", {QueryFragment, <<"">>}, 1, 0),
- {UserInfo, HostPort} = split_uri(Authority, "@", {<<"">>, Authority}, 1, 1),
- {Host, Port} = parse_host_port(Scheme, DefaultPort, HostPort, Opts),
- Path = path(RawPath),
- case lists:keyfind(fragment, 1, Opts) of
- {fragment, true} ->
- {ok, {Scheme, UserInfo, Host, Port, Path, Query, Fragment}};
- _ ->
- {ok, {Scheme, UserInfo, Host, Port, Path, Query}}
- end;
-parse_uri_rest(Scheme, DefaultPort, "//" ++ URIPart, Opts) ->
- {Authority, PathQueryFragment} =
- split_uri(URIPart, "[/?#]", {URIPart, ""}, 1, 0),
- {RawPath, QueryFragment} =
- split_uri(PathQueryFragment, "[?#]", {PathQueryFragment, ""}, 1, 0),
- {Query, Fragment} =
- split_uri(QueryFragment, "#", {QueryFragment, ""}, 1, 0),
- {UserInfo, HostPort} = split_uri(Authority, "@", {"", Authority}, 1, 1),
- {Host, Port} = parse_host_port(Scheme, DefaultPort, HostPort, Opts),
- Path = path(RawPath),
- case lists:keyfind(fragment, 1, Opts) of
- {fragment, true} ->
- {ok, {Scheme, UserInfo, Host, Port, Path, Query, Fragment}};
- _ ->
- {ok, {Scheme, UserInfo, Host, Port, Path, Query}}
- end.
-
-
%% In this version of the function, we no longer need
%% the Scheme argument, but just in case...
-parse_host_port(_Scheme, DefaultPort, <<"[", HostPort/binary>>, Opts) -> %ipv6
- {Host, ColonPort} = split_uri(HostPort, "\\]", {HostPort, <<"">>}, 1, 1),
- Host2 = maybe_ipv6_host_with_brackets(Host, Opts),
- {_, Port} = split_uri(ColonPort, ":", {<<"">>, DefaultPort}, 0, 1),
- {Host2, int_port(Port)};
-parse_host_port(_Scheme, DefaultPort, "[" ++ HostPort, Opts) -> %ipv6
- {Host, ColonPort} = split_uri(HostPort, "\\]", {HostPort, ""}, 1, 1),
- Host2 = maybe_ipv6_host_with_brackets(Host, Opts),
- {_, Port} = split_uri(ColonPort, ":", {"", DefaultPort}, 0, 1),
- {Host2, int_port(Port)};
-
-parse_host_port(_Scheme, DefaultPort, HostPort, _Opts) ->
- {Host, Port} = split_uri(HostPort, ":", {HostPort, DefaultPort}, 1, 1),
- {Host, int_port(Port)}.
-
-split_uri(UriPart, SplitChar, NoMatchResult, SkipLeft, SkipRight) ->
- case re:run(UriPart, SplitChar, [{capture, first}]) of
- {match, [{Match, _}]} ->
- {string:slice(UriPart, 0, Match + 1 - SkipLeft),
- string:slice(UriPart, Match + SkipRight, string:length(UriPart))};
- nomatch ->
- NoMatchResult
- end.
-
-maybe_ipv6_host_with_brackets(Host, Opts) when is_binary(Host) ->
- case lists:keysearch(ipv6_host_with_brackets, 1, Opts) of
- {value, {ipv6_host_with_brackets, true}} ->
- <<"[", Host/binary, "]">>;
- _ ->
- Host
- end;
-maybe_ipv6_host_with_brackets(Host, Opts) ->
- case lists:keysearch(ipv6_host_with_brackets, 1, Opts) of
- {value, {ipv6_host_with_brackets, true}} ->
- "[" ++ Host ++ "]";
- _ ->
- Host
- end.
-
-int_port(Port) when is_integer(Port) ->
- Port;
-int_port(Port) when is_binary(Port) ->
- binary_to_integer(Port);
-int_port(Port) when is_list(Port) ->
- list_to_integer(Port);
-%% This is the case where no port was found and there was no default port
-int_port(no_default_port) ->
- throw({error, no_default_port}).
-
-path(<<"">>) ->
- <<"/">>;
-path("") ->
- "/";
-path(Path) ->
- Path.
-
uri_encode(Char, Reserved) ->
case sets:is_element(Char, Reserved) of
true ->
diff --git a/lib/inets/src/http_server/Makefile b/lib/inets/src/http_server/Makefile
index f66a446d40..abf8413f33 100644
--- a/lib/inets/src/http_server/Makefile
+++ b/lib/inets/src/http_server/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2021. All Rights Reserved.
+# Copyright Ericsson AB 2005-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -117,7 +117,7 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
$(TARGET_FILES): $(BEHAVIOUR_TARGET_FILES)
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES) $(BEHAVIOUR_TARGET_FILES)
diff --git a/lib/inets/src/http_server/httpd_util.erl b/lib/inets/src/http_server/httpd_util.erl
index b4e49dc7f0..c1f273af79 100644
--- a/lib/inets/src/http_server/httpd_util.erl
+++ b/lib/inets/src/http_server/httpd_util.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -38,6 +38,8 @@
-deprecated({integer_to_hexlist, 1, "use erlang:integer_to_list/2 with base 16 instead"}).
-deprecated({strip, 1, "use string:trim/1 instead"}).
-deprecated({suffix, 1, "use filename:extension/1 and string:trim/2 instead"}).
+-deprecated({decode_hex, 1, "use uri_string:unquote function instead"}).
+-deprecated({encode_hex, 1, "use uri_string:quote function instead"}).
-compile({nowarn_deprecated_function, [{http_uri, encode, 1}]}).
-compile({nowarn_deprecated_function, [{http_uri, decode, 1}]}).
@@ -396,10 +398,11 @@ month(12) -> "Dec".
%% decode_hex
decode_hex(URI) ->
- http_uri:decode(URI).
+ uri_string:unquote(URI).
encode_hex(URI) ->
- http_uri:encode(URI).
+ SafeChars = "!$()*", %% characters not encoded by deprecated http_uri:encode/1
+ uri_string:quote(URI, SafeChars).
%% flatlength
flatlength(List) ->
diff --git a/lib/inets/src/inets_app/Makefile b/lib/inets/src/inets_app/Makefile
index d85df269ce..405e86105a 100644
--- a/lib/inets/src/inets_app/Makefile
+++ b/lib/inets/src/inets_app/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2021. All Rights Reserved.
+# Copyright Ericsson AB 2005-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -86,7 +86,7 @@ ERL_COMPILE_FLAGS += \
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/inets/src/inets_app/inets.app.src b/lib/inets/src/inets_app/inets.app.src
index 0ec8ca9cd8..9a0de7edc1 100644
--- a/lib/inets/src/inets_app/inets.app.src
+++ b/lib/inets/src/inets_app/inets.app.src
@@ -1,7 +1,7 @@
%% This is an -*- erlang -*- file.
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -97,5 +97,5 @@
%% If the "new" ssl is used then 'crypto' must be started before inets.
{applications,[kernel,stdlib]},
{mod,{inets_app,[]}},
- {runtime_dependencies, ["stdlib-3.5","ssl-5.3.4","runtime_tools-1.8.14",
- "mnesia-4.12","kernel-3.0","erts-6.0"]}]}.
+ {runtime_dependencies, ["stdlib-@OTP-17778@","ssl-9.0","runtime_tools-1.8.14",
+ "mnesia-4.12","kernel-6.0","erts-6.0"]}]}.
diff --git a/lib/inets/test/Makefile b/lib/inets/test/Makefile
index 2d7efe55df..16a1abaee7 100644
--- a/lib/inets/test/Makefile
+++ b/lib/inets/test/Makefile
@@ -209,7 +209,7 @@ ERL_COMPILE_FLAGS += \
# 1) INETS_PRIV_DIR must be created
# ----------------------------------------------------
-tests debug opt: $(BUILDTARGET)
+tests $(TYPES): $(BUILDTARGET)
targets: $(TARGET_FILES)
diff --git a/lib/inets/test/httpc_SUITE.erl b/lib/inets/test/httpc_SUITE.erl
index 77a56cf1b8..87bc410ff9 100644
--- a/lib/inets/test/httpc_SUITE.erl
+++ b/lib/inets/test/httpc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -136,7 +136,6 @@ real_requests()->
invalid_method,
no_scheme,
invalid_uri,
- undefined_port,
binary_url
].
@@ -258,8 +257,8 @@ init_per_group(http_unix_socket = Group, Config0) ->
file:delete(?UNIX_SOCKET),
start_apps(Group),
Config = proplists:delete(port, Config0),
- Port = server_start(Group, server_config(Group, Config)),
- [{port, Port} | Config]
+ {Pid, Port} = server_start(Group, server_config(Group, Config)),
+ lists:append([{dummy_server_pid, Pid}, {port, Port}], Config)
end;
init_per_group(http_ipv6 = Group, Config0) ->
case is_ipv6_supported() of
@@ -277,7 +276,16 @@ init_per_group(Group, Config0) ->
Port = server_start(Group, server_config(Group, Config)),
[{port, Port} | Config].
-end_per_group(http_unix_socket,_Config) ->
+end_per_group(http_unix_socket, Config) ->
+ Pid = ?config(dummy_server_pid, Config),
+ Pid ! {stop, self()},
+ %% request is needed for enforcing dummy server and handlers stop; without a
+ %% it, dummy server waits in gen_tcp:accept and will not process stop request
+ httpc:request(get, {"http://localhost/v1/kv/foo", []}, [], []),
+ receive
+ {stopped, DummyServerPid} ->
+ ok
+ end,
file:delete(?UNIX_SOCKET),
ok;
end_per_group(_, _Config) ->
@@ -420,7 +428,7 @@ post() ->
"only care about the client side of the the post. The server "
"script will not actually use the post data."}].
post(Config) when is_list(Config) ->
- CGI = case test_server:os_type() of
+ CGI = case os:type() of
{win32, _} ->
"/cgi-bin/cgi_echo.exe";
_ ->
@@ -445,7 +453,7 @@ delete() ->
"only care about the client side of the the delete. The server "
"script will not actually use the delete data."}].
delete(Config) when is_list(Config) ->
- CGI = case test_server:os_type() of
+ CGI = case os:type() of
{win32, _} ->
"/cgi-bin/cgi_echo.exe";
_ ->
@@ -469,7 +477,7 @@ patch() ->
"only care about the client side of the the patch. The server "
"script will not actually use the patch data."}].
patch(Config) when is_list(Config) ->
- CGI = case test_server:os_type() of
+ CGI = case os:type() of
{win32, _} ->
"/cgi-bin/cgi_echo.exe";
_ ->
@@ -491,7 +499,7 @@ post_stream() ->
"We only care about the client side of the the post. "
"The server script will not actually use the post data."}].
post_stream(Config) when is_list(Config) ->
- CGI = case test_server:os_type() of
+ CGI = case os:type() of
{win32, _} ->
"/cgi-bin/cgi_echo.exe";
_ ->
@@ -1367,12 +1375,6 @@ invalid_uri(Config) ->
{error, invalid_uri} = httpc:request(URL),
ok.
-%%-------------------------------------------------------------------------
-
-undefined_port(_Config) ->
- {error, {failed_connect, _Reason}} = httpc:request("http://:"),
- ok.
-
%%-------------------------------------------------------------------------
remote_socket_close(Config) when is_list(Config) ->
@@ -1955,9 +1957,9 @@ server_start(http_unix_socket, Config) ->
Inet = local,
Socket = proplists:get_value(unix_socket, Config),
ok = httpc:set_options([{ipfamily, Inet},{unix_socket, Socket}]),
- {_Pid, Port} = http_test_lib:dummy_server(unix_socket, Inet, [{content_cb, ?MODULE},
+ {Pid, Port} = http_test_lib:dummy_server(unix_socket, Inet, [{content_cb, ?MODULE},
{unix_socket, Socket}]),
- Port;
+ {Pid, Port};
server_start(http_ipv6, HttpdConfig) ->
{ok, Pid} = inets:start(httpd, HttpdConfig),
Serv = inets:services_info(),
@@ -2051,7 +2053,7 @@ setup_server_dirs(ServerRoot, DocRoot, DataDir) ->
end
end, Files),
- Cgi = case test_server:os_type() of
+ Cgi = case os:type() of
{win32, _} ->
"cgi_echo.exe";
_ ->
@@ -2093,7 +2095,7 @@ receive_replys([ID|IDs]) ->
{http, {ID, {{_, 200, _}, [_|_], _}}} ->
receive_replys(IDs);
{http, {Other, {{_, 200, _}, [_|_], _}}} ->
- ct:pal({recived_canceld_id, Other})
+ ct:pal("~p",[{recived_canceld_id, Other}])
end.
diff --git a/lib/inets/test/httpd_1_1.erl b/lib/inets/test/httpd_1_1.erl
index c1438ca1ca..bea29a3445 100644
--- a/lib/inets/test/httpd_1_1.erl
+++ b/lib/inets/test/httpd_1_1.erl
@@ -244,7 +244,7 @@ head(Type, Port, Host, Node)->
[{statuscode, 200}]),
%% mod_cgi
Script =
- case test_server:os_type() of
+ case os:type() of
{win32, _} ->
"printenv.bat";
_ ->
diff --git a/lib/inets/test/httpd_SUITE.erl b/lib/inets/test/httpd_SUITE.erl
index b39ae6425a..5b0adf7c8a 100644
--- a/lib/inets/test/httpd_SUITE.erl
+++ b/lib/inets/test/httpd_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1042,7 +1042,7 @@ cgi() ->
cgi(Config) when is_list(Config) ->
{Script, Script2, Script3} =
- case test_server:os_type() of
+ case os:type() of
{win32, _} ->
{"printenv.bat", "printenv.sh", "cgi_echo.exe"};
_ ->
@@ -1117,7 +1117,7 @@ cgi_chunked_encoding_test() ->
cgi_chunked_encoding_test(Config) when is_list(Config) ->
Host = proplists:get_value(host, Config),
Script =
- case test_server:os_type() of
+ case os:type() of
{win32, _} ->
"/cgi-bin/printenv.bat";
_ ->
@@ -1947,7 +1947,7 @@ setup_server_dirs(ServerRoot, DocRoot, DataDir) ->
inets_test_lib:copy_dirs(PicsSrc, PicsDir),
inets_test_lib:copy_dirs(ConfigSrc, ConfigDir),
- Cgi = case test_server:os_type() of
+ Cgi = case os:type() of
{win32, _} ->
"cgi_echo.exe";
_ ->
diff --git a/lib/inets/test/httpd_all.erl b/lib/inets/test/httpd_all.erl
index 9be02e3fd8..b4845e4cf0 100644
--- a/lib/inets/test/httpd_all.erl
+++ b/lib/inets/test/httpd_all.erl
@@ -128,7 +128,7 @@ esi(Version, Type, Port, Host, Node) ->
cgi(Version, Type, Port, Host, Node) ->
{Script, Script2, Script3} =
- case test_server:os_type() of
+ case os:type() of
{win32, _} ->
{"printenv.bat", "printenv.sh", "cgi_echo.exe"};
_ ->
diff --git a/lib/inets/test/httpd_basic_SUITE.erl b/lib/inets/test/httpd_basic_SUITE.erl
index c6b35eb756..bbeb49083e 100644
--- a/lib/inets/test/httpd_basic_SUITE.erl
+++ b/lib/inets/test/httpd_basic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -85,7 +85,7 @@ DUMMY
DummyFile = filename:join([PrivDir,"dummy.html"]),
CgiDir = filename:join(PrivDir, "cgi-bin"),
ok = file:make_dir(CgiDir),
- {CgiPrintEnv, CgiSleep} = case test_server:os_type() of
+ {CgiPrintEnv, CgiSleep} = case os:type() of
{win32, _} ->
{"printenv.bat", "cgi_sleep.exe"};
_ ->
diff --git a/lib/inets/test/httpd_mod.erl b/lib/inets/test/httpd_mod.erl
index 2add30099d..a133490cfe 100644
--- a/lib/inets/test/httpd_mod.erl
+++ b/lib/inets/test/httpd_mod.erl
@@ -611,7 +611,7 @@ htaccess(Type, Port, Host, Node) ->
%%--------------------------------------------------------------------
cgi(Type, Port, Host, Node) ->
{Script, Script2, Script3} =
- case test_server:os_type() of
+ case os:type() of
{win32, _} ->
{"printenv.bat", "printenv.sh", "cgi_echo.exe"};
_ ->
diff --git a/lib/inets/test/httpd_test_data/server_root/Makefile b/lib/inets/test/httpd_test_data/server_root/Makefile
index ed4d63a3bb..4defc918ca 100644
--- a/lib/inets/test/httpd_test_data/server_root/Makefile
+++ b/lib/inets/test/httpd_test_data/server_root/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2016. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -163,7 +163,7 @@ ERL_COMPILE_FLAGS +=
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/inets/test/uri_SUITE.erl b/lib/inets/test/uri_SUITE.erl
index db6a8bdfc3..d8e7b419d9 100644
--- a/lib/inets/test/uri_SUITE.erl
+++ b/lib/inets/test/uri_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -41,20 +41,7 @@ suite() ->
[{ct_hooks,[ts_install_cth]}].
all() ->
- [
- ipv4,
- ipv6,
- host,
- userinfo,
- scheme,
- queries,
- fragments,
- escaped,
- hexed_query,
- scheme_validation,
- scheme_validation_bin,
- encode_decode
- ].
+ [encode_decode].
%%--------------------------------------------------------------------
@@ -74,225 +61,6 @@ end_per_testcase(_Case, _Config) ->
%% Test cases starts here.
%%-------------------------------------------------------------------------
-ipv4(Config) when is_list(Config) ->
- {ok, {http,[],"127.0.0.1",80,"/foobar.html",[]}} =
- http_uri:parse("http://127.0.0.1/foobar.html"),
-
- {ok, {http,<<>>,<<"127.0.0.1">>,80,<<"/foobar.html">>,<<>>}} =
- http_uri:parse(<<"http://127.0.0.1/foobar.html">>).
-
-ipv6(Config) when is_list(Config) ->
- {ok, {http,[],"2010:836B:4179::836B:4179",80,"/foobar.html",[]}} =
- http_uri:parse("http://[2010:836B:4179::836B:4179]/foobar.html"),
- {ok, {http,[],"[2010:836B:4179::836B:4179]",80,"/foobar.html",[]}} =
- http_uri:parse("http://[2010:836B:4179::836B:4179]/foobar.html",
- [{ipv6_host_with_brackets, true}]),
- {ok, {http,[],"2010:836B:4179::836B:4179",80,"/foobar.html",[]}} =
- http_uri:parse("http://[2010:836B:4179::836B:4179]/foobar.html",
- [{ipv6_host_with_brackets, false}]),
- {ok, {http,[],"2010:836B:4179::836B:4179",80,"/foobar.html",[]}} =
- http_uri:parse("http://[2010:836B:4179::836B:4179]/foobar.html",
- [{foo, false}]),
- {error,
- {malformed_url, _, "http://2010:836B:4179::836B:4179/foobar.html"}} =
- http_uri:parse("http://2010:836B:4179::836B:4179/foobar.html"),
-
- {ok, {http,<<>>,<<"2010:836B:4179::836B:4179">>,80,<<"/foobar.html">>,<<>>}} =
- http_uri:parse(<<"http://[2010:836B:4179::836B:4179]/foobar.html">>),
- {ok, {http,<<>>,<<"[2010:836B:4179::836B:4179]">>,80,<<"/foobar.html">>,<<>>}} =
- http_uri:parse(<<"http://[2010:836B:4179::836B:4179]/foobar.html">>,
- [{ipv6_host_with_brackets, true}]),
- {ok, {http,<<>>,<<"2010:836B:4179::836B:4179">>,80,<<"/foobar.html">>,<<>>}} =
- http_uri:parse(<<"http://[2010:836B:4179::836B:4179]/foobar.html">>,
- [{ipv6_host_with_brackets, false}]),
- {ok, {http,<<>>,<<"2010:836B:4179::836B:4179">>,80,<<"/foobar.html">>,<<>>}} =
- http_uri:parse(<<"http://[2010:836B:4179::836B:4179]/foobar.html">>,
- [{foo, false}]),
- {error,
- {malformed_url, _, <<"http://2010:836B:4179::836B:4179/foobar.html">>}} =
- http_uri:parse(<<"http://2010:836B:4179::836B:4179/foobar.html">>).
-
-host(Config) when is_list(Config) ->
- {ok, {http,[],"localhost",8888,"/foobar.html",[]}} =
- http_uri:parse("http://localhost:8888/foobar.html"),
-
- {ok, {http,<<>>,<<"localhost">>,8888,<<"/foobar.html">>,<<>>}} =
- http_uri:parse(<<"http://localhost:8888/foobar.html">>).
-
-userinfo(Config) when is_list(Config) ->
- {ok, {http,"nisse:foobar","localhost",8888,"/foobar.html",[]}} =
- http_uri:parse("http://nisse:foobar@localhost:8888/foobar.html"),
-
- {ok, {http,<<"nisse:foobar">>,<<"localhost">>,8888,<<"/foobar.html">>,<<>>}} =
- http_uri:parse(<<"http://nisse:foobar@localhost:8888/foobar.html">>).
-
-scheme(Config) when is_list(Config) ->
- {error, no_scheme} = http_uri:parse("localhost/foobar.html"),
- {error, {malformed_url, _, _}} =
- http_uri:parse("localhost:8888/foobar.html"),
-
- {error, no_scheme} = http_uri:parse(<<"localhost/foobar.html">>),
- {error, {malformed_url, _, _}} =
- http_uri:parse(<<"localhost:8888/foobar.html">>).
-
-queries(Config) when is_list(Config) ->
- {ok, {http,[],"localhost",8888,"/foobar.html","?foo=bar&foobar=42"}} =
- http_uri:parse("http://localhost:8888/foobar.html?foo=bar&foobar=42"),
-
- {ok, {http,<<>>,<<"localhost">>,8888,<<"/foobar.html">>,<<"?foo=bar&foobar=42">>}} =
- http_uri:parse(<<"http://localhost:8888/foobar.html?foo=bar&foobar=42">>).
-
-fragments(Config) when is_list(Config) ->
- {ok, {http,[],"localhost",80,"/",""}} =
- http_uri:parse("http://localhost#fragment"),
- {ok, {http,[],"localhost",80,"/path",""}} =
- http_uri:parse("http://localhost/path#fragment"),
- {ok, {http,[],"localhost",80,"/","?query"}} =
- http_uri:parse("http://localhost?query#fragment"),
- {ok, {http,[],"localhost",80,"/path","?query"}} =
- http_uri:parse("http://localhost/path?query#fragment"),
- {ok, {http,[],"localhost",80,"/","","#fragment"}} =
- http_uri:parse("http://localhost#fragment", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/path","","#fragment"}} =
- http_uri:parse("http://localhost/path#fragment", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/","?query","#fragment"}} =
- http_uri:parse("http://localhost?query#fragment", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/path","?query","#fragment"}} =
- http_uri:parse("http://localhost/path?query#fragment",
- [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/","",""}} =
- http_uri:parse("http://localhost", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/path","",""}} =
- http_uri:parse("http://localhost/path", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/","?query",""}} =
- http_uri:parse("http://localhost?query", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/path","?query",""}} =
- http_uri:parse("http://localhost/path?query", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/","","#"}} =
- http_uri:parse("http://localhost#", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/path","","#"}} =
- http_uri:parse("http://localhost/path#", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/","?query","#"}} =
- http_uri:parse("http://localhost?query#", [{fragment,true}]),
- {ok, {http,[],"localhost",80,"/path","?query","#"}} =
- http_uri:parse("http://localhost/path?query#", [{fragment,true}]),
-
-
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"">>}} =
- http_uri:parse(<<"http://localhost#fragment">>),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"">>}} =
- http_uri:parse(<<"http://localhost/path#fragment">>),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"?query">>}} =
- http_uri:parse(<<"http://localhost?query#fragment">>),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"?query">>}} =
- http_uri:parse(<<"http://localhost/path?query#fragment">>),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"">>,<<"#fragment">>}} =
- http_uri:parse(<<"http://localhost#fragment">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"">>,<<"#fragment">>}} =
- http_uri:parse(<<"http://localhost/path#fragment">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"?query">>,<<"#fragment">>}} =
- http_uri:parse(<<"http://localhost?query#fragment">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"?query">>,<<"#fragment">>}} =
- http_uri:parse(<<"http://localhost/path?query#fragment">>,
- [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"">>,<<"">>}} =
- http_uri:parse(<<"http://localhost">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"">>,<<"">>}} =
- http_uri:parse(<<"http://localhost/path">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"?query">>,<<"">>}} =
- http_uri:parse(<<"http://localhost?query">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"?query">>,<<"">>}} =
- http_uri:parse(<<"http://localhost/path?query">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"">>,<<"#">>}} =
- http_uri:parse(<<"http://localhost#">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"">>,<<"#">>}} =
- http_uri:parse(<<"http://localhost/path#">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<"?query">>,<<"#">>}} =
- http_uri:parse(<<"http://localhost?query#">>, [{fragment,true}]),
- {ok, {http,<<>>,<<"localhost">>,80,<<"/path">>,<<"?query">>,<<"#">>}} =
- http_uri:parse(<<"http://localhost/path?query#">>, [{fragment,true}]),
- ok.
-
-escaped(Config) when is_list(Config) ->
- {ok, {http,[],"www.somedomain.com",80,"/%2Eabc",[]}} =
- http_uri:parse("http://www.somedomain.com/%2Eabc"),
- {ok, {http,[],"www.somedomain.com",80,"/%252Eabc",[]}} =
- http_uri:parse("http://www.somedomain.com/%252Eabc"),
- {ok, {http,[],"www.somedomain.com",80,"/%25abc",[]}} =
- http_uri:parse("http://www.somedomain.com/%25abc"),
- {ok, {http,[],"www.somedomain.com",80,"/%25abc", "?foo=bar"}} =
- http_uri:parse("http://www.somedomain.com/%25abc?foo=bar"),
-
- {ok, {http,<<>>,<<"www.somedomain.com">>,80,<<"/%2Eabc">>,<<>>}} =
- http_uri:parse(<<"http://www.somedomain.com/%2Eabc">>),
- {ok, {http,<<>>,<<"www.somedomain.com">>,80,<<"/%252Eabc">>,<<>>}} =
- http_uri:parse(<<"http://www.somedomain.com/%252Eabc">>),
- {ok, {http,<<>>,<<"www.somedomain.com">>,80,<<"/%25abc">>,<<>>}} =
- http_uri:parse(<<"http://www.somedomain.com/%25abc">>),
- {ok, {http,<<>>,<<"www.somedomain.com">>,80,<<"/%25abc">>, <<"?foo=bar">>}} =
- http_uri:parse(<<"http://www.somedomain.com/%25abc?foo=bar">>).
-
-hexed_query(doc) ->
- [{doc, "Solves OTP-6191"}];
-hexed_query(Config) when is_list(Config) ->
- Google = ?GOOGLE,
- GoogleSearch = "http://" ++ Google ++ "/search",
- Search1 = "?hl=en&q=a%D1%85%D1%83%D0%B9&btnG=Google+Search",
- URI1 = GoogleSearch ++ Search1,
- Search2 = "?hl=en&q=%25%25",
- URI2 = GoogleSearch ++ Search2,
- Search3 = "?hl=en&q=%foo",
- URI3 = GoogleSearch ++ Search3,
-
- Verify1 =
- fun({http, [], ?GOOGLE, 80, "/search", _}) -> ok;
- (_) -> error
- end,
- Verify2 = Verify1,
- Verify3 = Verify1,
- verify_uri(URI1, Verify1),
- verify_uri(URI2, Verify2),
- verify_uri(URI3, Verify3).
-
-scheme_validation(Config) when is_list(Config) ->
- {ok, {http,[],"localhost",80,"/",""}} =
- http_uri:parse("http://localhost#fragment"),
-
- ValidationFun =
- fun("http") -> valid;
- (_) -> {error, bad_scheme}
- end,
-
- {ok, {http,[],"localhost",80,"/",""}} =
- http_uri:parse("http://localhost#fragment",
- [{scheme_validation_fun, ValidationFun}]),
- {error, bad_scheme} =
- http_uri:parse("https://localhost#fragment",
- [{scheme_validation_fun, ValidationFun}]),
- %% non-fun scheme_validation_fun works as no option passed
- {ok, {https,[],"localhost",443,"/",""}} =
- http_uri:parse("https://localhost#fragment",
- [{scheme_validation_fun, none}]).
-
-scheme_validation_bin(Config) when is_list(Config) ->
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<>>}} =
- http_uri:parse(<<"http://localhost#fragment">>),
-
- ValidationFun =
- fun(<<"http">>) -> valid;
- (_) -> {error, bad_scheme}
- end,
-
- {ok, {http,<<>>,<<"localhost">>,80,<<"/">>,<<>>}} =
- http_uri:parse(<<"http://localhost#fragment">>,
- [{scheme_validation_fun, ValidationFun}]),
- {error, bad_scheme} =
- http_uri:parse(<<"https://localhost#fragment">>,
- [{scheme_validation_fun, ValidationFun}]),
- %% non-fun scheme_validation_fun works as no option passed
- {ok, {https,<<>>,<<"localhost">>,443,<<"/">>,<<>>}} =
- http_uri:parse(<<"https://localhost#fragment">>,
- [{scheme_validation_fun, none}]).
encode_decode(Config) when is_list(Config) ->
?assertEqual("foo%20bar", http_uri:encode("foo bar")),
@@ -304,24 +72,3 @@ encode_decode(Config) when is_list(Config) ->
?assertEqual(<<"foo bar">>, http_uri:decode(<<"foo%20bar">>)),
?assertEqual("foo\r\n", http_uri:decode("foo%0D%0A")),
?assertEqual(<<"foo\r\n">>, http_uri:decode(<<"foo%0D%0A">>)).
-
-
-%%--------------------------------------------------------------------
-%% Internal Functions ------------------------------------------------
-%%--------------------------------------------------------------------
-
-
-verify_uri(URI, Verify) ->
- case http_uri:parse(URI) of
- {ok, ParsedURI} ->
- case Verify(ParsedURI) of
- ok ->
- ok;
- error ->
- Reason = {unexpected_parse_result, URI, ParsedURI},
- ERROR = {error, Reason},
- throw(ERROR)
- end;
- {error, _} = ERROR ->
- throw(ERROR)
- end.
diff --git a/lib/jinterface/doc/src/jinterface_users_guide.xml b/lib/jinterface/doc/src/jinterface_users_guide.xml
index 686fb9565e..cffaa50793 100644
--- a/lib/jinterface/doc/src/jinterface_users_guide.xml
+++ b/lib/jinterface/doc/src/jinterface_users_guide.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2021</year>
+ <year>2000</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -19,7 +19,7 @@
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-
+
</legalnotice>
<title>The Jinterface Package</title>
@@ -140,17 +140,29 @@
unique name in the form of an identifier composed partly of the
hostname on which the node is running, e.g "gurka@sallad.com". Several
such nodes can run on the same host as long as their names are unique.
- The class <seefile marker="java/com/ericsson/otp/erlang/OtpNode">OtpNode</seefile>
- represents an Erlang node. It is created with a name
- and optionally a port number on which it listens for incoming
- connections. Before creating an instance of
- <seefile marker="java/com/ericsson/otp/erlang/OtpNode">OtpNode</seefile>,
- ensure that Epmd is running on the host machine. See the Erlang documentation
- for more information about Epmd. In this example, the host name is appended
+ The class <seefile marker="java/com/ericsson/otp/erlang/OtpNode">OtpNode</seefile>
+ represents an Erlang node.</p>
+ <p>It is created with a name
+ and optionally a TCP/IP socket port number on which it listens for incoming
+ connections. By default before creating an instance of
+ <seefile marker="java/com/ericsson/otp/erlang/OtpNode">OtpNode</seefile>,
+ ensure that Epmd is running on the host machine. See the Erlang documentation
+ for more information about Epmd.</p>
+ <p>In this example, the host name is appended
automatically to the identifier, and the port number is chosen by the
underlying system:</p>
<code type="none">
OtpNode node = new OtpNode("gurka"); </code>
+ <p>It is also possible to use alternative communication (or distribution)
+ protocols without Epmd by switching to a custom transport factory extending
+ the OtpGenericTransportFactory abstract class, for example based on
+ Unix Domain Sockets instead of the default TCP/IP sockets.</p>
+ <p>In this example, the host name is appended automatically to the identifier
+ and a custom transport factory is used:</p>
+ <code type="none">
+OtpGenericTransportFactory customFactory = new MyCustomFactory();
+OtpNode node = new OtpNode("gurka", customFactory);
+ </code>
</section>
<section>
@@ -227,8 +239,11 @@ OtpNode node = new OtpNode("gurka"); </code>
<title>Transport Factory</title>
<p>All necessary connections are made using methods of
<seefile marker="java/com/ericsson/otp/erlang/OtpTransportFactory">OtpTransportFactory</seefile>
- interface. Default OtpTransportFactory implementation is based on standard Socket class.
- User may provide custom transport factory as needed. See java doc for details.</p>
+ interface. The default OtpTransportFactory implementation is based on standard TCP/IP Socket class
+ and relies on epmd. User may provide custom transport factory as needed. See java doc for details.</p>
+ <p>For alternative distribution protocols working without epmd, using a transport factory extending the
+ <seefile marker="java/com/ericsson/otp/erlang/OtpGenericTransportFactory">OtpGenericTransportFactory</seefile>
+ abstract class will disable the automatic epmd registration and lookup in Jinterface.</p>
</section>
<section>
@@ -356,24 +371,25 @@ OtpNode node = new OtpNode("gurka"); </code>
<section>
<title>Using EPMD</title>
- <p>Epmd is the Erlang Port Mapper Daemon. Distributed Erlang nodes
- register with epmd on the localhost to indicate to other nodes that
- they exist and can accept connections. Epmd maintains a register of
- node and port number information, and when a node wishes to connect to
+ <p>Epmd is the Erlang Port Mapper Daemon. By default distributed Erlang
+ nodes register with epmd on the localhost to indicate to other nodes that
+ they exist and can accept connections. Epmd maintains a register of node
+ and socket port number information, and when a node wishes to connect to
another node, it first contacts epmd in order to find out the correct
- port number to connect to.</p>
- <p>The basic interaction with EPMD is done through instances of
+ socket port number to connect to. It is also possible to use alternative
+ distribution protocols which don't need epmd at all.</p>
+ <p>The basic interaction with EPMD is done through instances of
<seefile marker="java/com/ericsson/otp/erlang/OtpEpmd">OtpEpmd</seefile> class.
- Nodes wishing to contact other nodes must first request information
- from Epmd before a connection can be set up, however this is done automatically
+ Nodes wishing to contact other nodes must first request information
+ from Epmd before a connection can be set up, however this is done automatically
by <seefile marker="java/com/ericsson/otp/erlang/OtpSelf#connect(com.ericsson.otp.erlang.OtpPeer)">OtpSelf.connect()</seefile> when necessary. </p>
- <p>When you use <seefile marker="java/com/ericsson/otp/erlang/OtpSelf#connect(com.ericsson.otp.erlang.OtpPeer)">OtpSelf.connect()</seefile> to connect to an Erlang node,
+ <p>When you use <seefile marker="java/com/ericsson/otp/erlang/OtpSelf#connect(com.ericsson.otp.erlang.OtpPeer)">OtpSelf.connect()</seefile> to connect to an Erlang node,
a connection is first made to epmd and, if the node is known, a
connection is then made to the Erlang node.</p>
<p>Java nodes can also register themselves with epmd if they want other
nodes in the system to be able to find and connect to them.
This is done by call to method <seefile marker="java/com/ericsson/otp/erlang/OtpEpmd#publishPort(com.ericsson.otp.erlang.OtpLocalNode)">OtpEpmd.publishPort()</seefile>.</p>
- <p>Be aware that on some systems (such as VxWorks), a failed node will
+ <p>Be aware that on some systems a failed node will
not be detected by this mechanism since the operating system does not
automatically close descriptors that were left open when the node
failed. If a node has failed in this way, epmd will prevent you from
diff --git a/lib/jinterface/doc/src/notes.xml b/lib/jinterface/doc/src/notes.xml
index 99f9e79c83..5f39266d50 100644
--- a/lib/jinterface/doc/src/notes.xml
+++ b/lib/jinterface/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2021</year>
+ <year>2000</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -304,7 +304,7 @@
<list>
<item>
<p>
- Update build scripts to not make assumtions about where
+ Update build scripts to not make assumptions about where
env, cp and perl are located.</p>
<p>
Own Id: OTP-13800</p>
@@ -630,7 +630,7 @@
Java 1.5 has a bug where detecting codepoint offsets in
strings that are created by String.substring() gives
wrong results. The new implementation uses a different
- method, avoinding the issue. (Thanks to Vlad Dumitrescu)</p>
+ method, avoiding the issue. (Thanks to Vlad Dumitrescu)</p>
<p>
Own Id: OTP-9927</p>
</item>
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java
index 7ea5d52da7..14a09ce65f 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractConnection.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -79,7 +79,7 @@ public abstract class AbstractConnection extends Thread {
protected static final int unlinkIdTag = 35;
protected static final int unlinkIdAckTag = 36;
- // MD5 challenge messsage tags
+ // MD5 challenge message tags
protected static final int ChallengeReply = 'r';
protected static final int ChallengeAck = 'a';
protected static final int ChallengeStatus = 's';
@@ -166,18 +166,12 @@ public abstract class AbstractConnection extends Thread {
throws IOException, OtpAuthException {
peer = other;
localNode = self;
- socket = null;
int port;
traceLevel = defaultLevel;
setDaemon(true);
- // now get a connection between the two...
- port = OtpEpmd.lookupPort(peer);
- if (port == 0)
- throw new IOException("No remote node found - cannot connect");
-
- // now find highest common dist value
+ // Find highest common dist value
if (peer.proto != self.proto || self.distHigh < peer.distLow
|| self.distLow > peer.distHigh) {
throw new IOException("No common protocol found - cannot connect");
@@ -187,7 +181,21 @@ public abstract class AbstractConnection extends Thread {
peer.distChoose = peer.distHigh > self.distHigh ? self.distHigh
: peer.distHigh;
- doConnect(port);
+ // Now get a connection between the two nodes
+ if (self.transportFactory instanceof OtpGenericTransportFactory) {
+ // For alternative distribution protocols using a transport factory
+ // extending the OtpGenericTransportFactory class, the notion of
+ // socket port is not used so the remote node is not registered
+ // with Epmd.
+ doGenericConnect();
+
+ } else {
+ // Get the listening port of the remote node registered with Epmd
+ port = OtpEpmd.lookupPort(peer);
+ if (port == 0)
+ throw new IOException("No remote node found - cannot connect");
+ doPortConnect(port);
+ }
name = peer.node();
connected = true;
@@ -1052,17 +1060,31 @@ public abstract class AbstractConnection extends Thread {
}
}
- protected void doConnect(final int port) throws IOException,
+ protected void doPortConnect(final int port) throws IOException,
OtpAuthException {
try {
socket = peer.createTransport(peer.host(), port);
-
if (traceLevel >= handshakeThreshold) {
System.out.println("-> MD5 CONNECT TO " + peer.host() + ":"
+ port);
}
+ doConnect();
+
+ } catch (final OtpAuthException ae) {
+ close();
+ throw ae;
+ } catch (final Exception e) {
+ close();
+ final IOException ioe = new IOException(
+ "Cannot connect to peer node");
+ ioe.initCause(e);
+ throw ioe;
+ }
+ }
+
+ protected void doConnect() throws IOException, OtpAuthException {
final int send_name_tag = sendName(peer.distChoose, localNode.flags,
- localNode.creation);
+ localNode.creation());
recvStatus();
final int her_challenge = recvChallenge();
final byte[] our_digest = genDigest(her_challenge,
@@ -1073,6 +1095,17 @@ public abstract class AbstractConnection extends Thread {
recvChallengeAck(our_challenge);
cookieOk = true;
sendCookie = false;
+ }
+
+ protected void doGenericConnect() throws IOException,
+ OtpAuthException {
+ try {
+ socket = peer.createTransport(peer);
+ if (traceLevel >= handshakeThreshold) {
+ System.out.println("-> MD5 CONNECT TO " + peer.node());
+ }
+ doConnect();
+
} catch (final OtpAuthException ae) {
close();
throw ae;
@@ -1187,14 +1220,14 @@ public abstract class AbstractConnection extends Thread {
obuf.write1('c');
final int flagsHigh = (int)(localNode.flags >> 32);
obuf.write4BE(flagsHigh);
- obuf.write4BE(localNode.creation);
+ obuf.write4BE(localNode.creation());
obuf.writeToAndFlush(socket.getOutputStream());
if (traceLevel >= handshakeThreshold) {
System.out.println("-> " + "HANDSHAKE sendComplement" +
" flagsHigh=" + flagsHigh +
- " creation=" + localNode.creation);
+ " creation=" + localNode.creation());
}
}
}
@@ -1218,7 +1251,7 @@ public abstract class AbstractConnection extends Thread {
obuf.write1('N');
obuf.write8BE(our_flags);
obuf.write4BE(challenge);
- obuf.write4BE(localNode.creation);
+ obuf.write4BE(localNode.creation());
obuf.write2BE(str.length());
obuf.write(str.getBytes());
}
@@ -1273,7 +1306,7 @@ public abstract class AbstractConnection extends Thread {
apeer.flags = ibuf.read8BE();
if ((apeer.flags & AbstractNode.dFlagHandshake23) == 0)
throw new IOException("Missing DFLAG_HANDSHAKE_23");
- apeer.creation = ibuf.read4BE();
+ apeer.setCreation(ibuf.read4BE());
int namelen = ibuf.read2BE();
tmpname = new byte[namelen];
ibuf.readN(tmpname);
@@ -1283,21 +1316,20 @@ public abstract class AbstractConnection extends Thread {
throw new IOException("Unknown remote node type");
}
- if ((apeer.flags & AbstractNode.dFlagExtendedReferences) == 0) {
- throw new IOException(
- "Handshake failed - peer cannot handle extended references");
+ if ((apeer.flags & AbstractNode.dFlagMandatory25Digest) != 0) {
+ apeer.flags |= AbstractNode.mandatoryFlags25;
}
- if ((apeer.flags & AbstractNode.dFlagExtendedPidsPorts) == 0) {
+ if ((apeer.flags & AbstractNode.mandatoryFlags) != AbstractNode.mandatoryFlags) {
throw new IOException(
- "Handshake failed - peer cannot handle extended pids and ports");
+ "Handshake failed - peer cannot handle all mandatory capabilities");
}
} catch (final OtpErlangDecodeException e) {
throw new IOException("Handshake failed - not enough data");
}
- final int i = hisname.indexOf('@', 0);
+ final int i = hisname.indexOf('@');
apeer.node = hisname;
apeer.alive = hisname.substring(0, i);
apeer.host = hisname.substring(i + 1, hisname.length());
@@ -1335,7 +1367,7 @@ public abstract class AbstractConnection extends Thread {
if ((peer.flags & AbstractNode.dFlagHandshake23) == 0)
throw new IOException("New challenge missing DFLAG_HANDHAKE_23");
challenge = ibuf.read4BE();
- peer.creation = ibuf.read4BE();
+ peer.setCreation(ibuf.read4BE());
namelen = ibuf.read2BE();
break;
default:
@@ -1349,14 +1381,13 @@ public abstract class AbstractConnection extends Thread {
"Handshake failed - peer has wrong name: " + hisname);
}
- if ((peer.flags & AbstractNode.dFlagExtendedReferences) == 0) {
- throw new IOException(
- "Handshake failed - peer cannot handle extended references");
+ if ((peer.flags & AbstractNode.dFlagMandatory25Digest) != 0) {
+ peer.flags |= AbstractNode.mandatoryFlags25;
}
- if ((peer.flags & AbstractNode.dFlagExtendedPidsPorts) == 0) {
+ if ((peer.flags & AbstractNode.mandatoryFlags) != AbstractNode.mandatoryFlags) {
throw new IOException(
- "Handshake failed - peer cannot handle extended pids and ports");
+ "Handshake failed - peer cannot handle all mandatory capabilities");
}
} catch (final OtpErlangDecodeException e) {
@@ -1385,7 +1416,7 @@ public abstract class AbstractConnection extends Thread {
final long flagsHigh = ibuf.read4BE();
peer.flags |= flagsHigh << 32;
- peer.creation = ibuf.read4BE();
+ peer.setCreation(ibuf.read4BE());
} catch (final OtpErlangDecodeException e) {
throw new IOException("Handshake failed - not enough data");
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractNode.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractNode.java
index 0d9635393e..7e8355dcc6 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractNode.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/AbstractNode.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -95,21 +95,35 @@ public class AbstractNode implements OtpTransportFactory {
static final int dFlagBigCreation = 0x40000;
static final int dFlagHandshake23 = 0x1000000;
static final int dFlagUnlinkId = 0x2000000;
+ static final int dFlagMandatory25Digest = 0x4000000;
static final long dFlagV4PidsRefs = 0x4L << 32;
+ /* Mandatory flags in OTP 25. */
+ static final long mandatoryFlags25 = dFlagExtendedReferences
+ | dFlagFunTags
+ | dFlagExtendedPidsPorts
+ | dFlagUtf8Atoms
+ | dflagNewFunTags
+ | dFlagBigCreation
+ | dFlagNewFloats
+ | dFlagMapTag
+ | dFlagExportPtrTag
+ | dFlagBitBinaries;
+
+ /* Mandatory flags for distribution. Keep them in sync with
+ DFLAG_DIST_MANDATORY in erts/emulator/beam/dist.h. */
+ static final long mandatoryFlags = mandatoryFlags25;
+
int ntype = NTYPE_R6;
int proto = 0; // tcp/ip
int distHigh = 6;
int distLow = 5; // Cannot talk to nodes before R6
- int creation = 0;
- long flags = dFlagExtendedReferences | dFlagExtendedPidsPorts
- | dFlagBitBinaries | dFlagNewFloats | dFlagFunTags
- | dflagNewFunTags | dFlagUtf8Atoms | dFlagMapTag
- | dFlagExportPtrTag
- | dFlagBigCreation
- | dFlagHandshake23
- | dFlagUnlinkId
- | dFlagV4PidsRefs;
+ private int creation = 0x710000;
+ long flags = mandatoryFlags
+ | dFlagHandshake23
+ | dFlagUnlinkId
+ | dFlagV4PidsRefs
+ | dFlagMandatory25Digest;
/* initialize hostname and default cookie */
static {
@@ -190,7 +204,7 @@ public class AbstractNode implements OtpTransportFactory {
this.cookie = cookie;
this.transportFactory = transportFactory;
- final int i = name.indexOf('@', 0);
+ final int i = name.indexOf('@');
if (i < 0) {
alive = name;
host = localHost;
@@ -271,6 +285,13 @@ public class AbstractNode implements OtpTransportFactory {
return creation;
}
+ void setCreation(int cr) throws OtpErlangDecodeException {
+ if (cr == 0) {
+ throw new OtpErlangDecodeException("Node creation 0 not allowed");
+ }
+ this.creation = cr;
+ }
+
/**
* Set the authorization cookie used by this node.
*
@@ -311,4 +332,44 @@ public class AbstractNode implements OtpTransportFactory {
throws IOException {
return transportFactory.createServerTransport(port);
}
+
+ /**
+ * Create a client-side transport for alternative distribution protocols
+ * using a transport factory extending the OtpGenericTransportFactory
+ * abstract class. Connect it to the specified server.
+ *
+ * @param peer
+ * the peer identifying the server to connect to
+ *
+ */
+ public OtpTransport createTransport(final OtpPeer peer)
+ throws IOException {
+ if (transportFactory instanceof OtpGenericTransportFactory) {
+ return ((OtpGenericTransportFactory) transportFactory)
+ .createTransport(peer);
+ }
+ throw new IOException("Method createTransport(OtpPeer) " +
+ "applicable only for Nodes with a transport " +
+ "factory instance of OtpGenericTransportFactory");
+ }
+
+ /**
+ * Create a server-side transport for alternative distribution protocols
+ * using a transport factory extending the OtpGenericTransportFactory
+ * abstract class.
+ *
+ * @param node
+ * the local node identifying the transport to create server-side
+ *
+ */
+ public OtpServerTransport createServerTransport(final OtpLocalNode node)
+ throws IOException {
+ if (transportFactory instanceof OtpGenericTransportFactory) {
+ return ((OtpGenericTransportFactory) transportFactory)
+ .createServerTransport(node);
+ }
+ throw new IOException("Method createServerTransport(OtpLocalNode) " +
+ "applicable only for Nodes with a transport " +
+ "factory instance of OtpGenericTransportFactory");
+ }
}
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile b/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile
index e42fd9468d..089cf4ab1a 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/Makefile
@@ -2,9 +2,9 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2000-2021. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2000-2022. All Rights Reserved.
+#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
@@ -16,7 +16,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-#
+#
# %CopyrightEnd%
#
include $(ERL_TOP)/make/target.mk
@@ -82,7 +82,7 @@ ifneq ($(V),0)
JARFLAGS=-cfv
endif
-JAVA_OPTIONS = -Xlint
+JAVA_OPTIONS = -Xlint -encoding UTF-8
ifeq ($(TESTROOT),)
RELEASE_PATH="$(ERL_TOP)/release/$(TARGET)"
@@ -100,7 +100,7 @@ $(APP_TARGET): $(APP_SRC) $(ERL_TOP)/lib/jinterface/vsn.mk
$(APPUP_TARGET): $(APPUP_SRC) $(ERL_TOP)/lib/jinterface/vsn.mk
$(vsn_verbose)sed -e 's;%VSN%;$(JINTERFACE_VSN);' $< > $@
-debug opt: make_dirs $(JAVA_DEST_ROOT)$(JARFILE)
+$(TYPES): make_dirs $(JAVA_DEST_ROOT)$(JARFILE)
make_dirs:
$(V_at)if [ ! -d "$(JAVA_DEST_ROOT)" ];then mkdir "$(JAVA_DEST_ROOT)"; fi
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpConnection.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpConnection.java
index 125004c9f6..5ca80038cd 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpConnection.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpConnection.java
@@ -38,7 +38,7 @@ import java.io.IOException;
*
* <p>
* If an exception occurs in any of the methods in this class, the connection
- * will be closed and must be explicitely reopened in order to resume
+ * will be closed and must be explicitly reopened in order to resume
* communication with the peer.
*
* <p>
@@ -317,7 +317,7 @@ public class OtpConnection extends AbstractConnection {
}
/**
- * Receive a messge complete with sender and recipient information.
+ * Receive a message complete with sender and recipient information.
*
* @return an {@link OtpMsg OtpMsg} containing the header information about
* the sender and recipient, as well as the actual message contents.
@@ -352,7 +352,7 @@ public class OtpConnection extends AbstractConnection {
}
/**
- * Receive a messge complete with sender and recipient information. This
+ * Receive a message complete with sender and recipient information. This
* method blocks at most for the specified time.
*
* @param timeout
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpCookedConnection.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpCookedConnection.java
index f70aa4e6e8..948c036e9f 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpCookedConnection.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpCookedConnection.java
@@ -182,7 +182,7 @@ public class OtpCookedConnection extends AbstractConnection {
}
/*
- * this one called explicitely by user code => use exit2
+ * this one called explicitly by user code => use exit2
*/
void exit2(final OtpErlangPid from, final OtpErlangPid to,
final OtpErlangObject reason) {
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpEpmd.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpEpmd.java
index 6d6b64225b..dd9d741283 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpEpmd.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpEpmd.java
@@ -326,7 +326,7 @@ public class OtpEpmd {
if (response == ALIVE2_RESP || response == ALIVE2_X_RESP) {
final int result = ibuf.read1();
if (result == 0) {
- node.creation = (response == ALIVE2_RESP
+ node.setCreation(response == ALIVE2_RESP
? ibuf.read2BE() : ibuf.read4BE());
if (traceLevel >= traceThreshold) {
System.out.println("<- OK");
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangAtom.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangAtom.java
index d73bad5e4f..68351d1210 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangAtom.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangAtom.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,7 +28,7 @@ public class OtpErlangAtom extends OtpErlangObject {
// don't change this!
private static final long serialVersionUID = -3204386396807876641L;
- /** The maximun allowed length of an atom, in characters */
+ /** The maximum allowed length of an atom, in characters */
public static final int maxAtomLength = 0xff; // one byte length
private final String atom;
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangDouble.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangDouble.java
index 5084848562..8e50755f80 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangDouble.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangDouble.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -123,7 +123,7 @@ public class OtpErlangDouble extends OtpErlangObject {
@Override
protected int doHashCode() {
- final Double v = new Double(d);
+ final Double v = Double.valueOf(d);
return v.hashCode();
}
}
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangLong.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangLong.java
index a2b4e30e18..70d8c5d403 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangLong.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangLong.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -117,7 +117,7 @@ public class OtpErlangLong extends OtpErlangObject {
* @return true if this value fits in a long, false otherwise.
*/
public boolean isLong() {
- // To just chech this.bigVal is a wee bit to simple, since
+ // To just check this.bigVal is a wee bit to simple, since
// there just might have be a mean bignum that arrived on
// a stream, and was a long disguised as more than 8 byte integer.
if (bigVal != null) {
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPid.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPid.java
index 9f68f6e695..e1ffa2ef43 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPid.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPid.java
@@ -85,12 +85,11 @@ public class OtpErlangPid extends OtpErlangObject implements Comparable<Object>
* used.
*
* @param creation
- * yet another arbitrary number. Ony the low order 2 bits will
- * be used.
+ * node incarnation number. Avoid values 0 to 3.
*/
public OtpErlangPid(final String node, final int id, final int serial,
final int creation) {
- this(OtpExternal.pidTag, node, id, serial, creation);
+ this(OtpExternal.newPidTag, node, id, serial, creation);
}
/**
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPort.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPort.java
index c5a18caa33..a58101a492 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPort.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangPort.java
@@ -32,7 +32,7 @@ public class OtpErlangPort extends OtpErlangObject {
/*
* Create a unique Erlang port belonging to the local node. Since it isn't
- * meaninful to do so, this constructor is private...
+ * meaningful to do so, this constructor is private...
*
* @param self the local node.
*
@@ -77,10 +77,10 @@ public class OtpErlangPort extends OtpErlangObject {
* an arbitrary number. Only the low order 28 bits will be used.
*
* @param creation
- * another arbitrary number. Only the low order 2 bits will be used.
+ * node incarnation number. Avoid values 0 to 3.
*/
public OtpErlangPort(final String node, final long id, final int creation) {
- this(OtpExternal.portTag, node, id, creation);
+ this(OtpExternal.newPortTag, node, id, creation);
}
/**
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
index 5a99ae07c6..7ce539dd94 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpErlangRef.java
@@ -106,12 +106,11 @@ public class OtpErlangRef extends OtpErlangObject {
* three numbers will be read from the array.
*
* @param creation
- * another arbitrary number. Only the low order 2 bits will be
- * used.
+ * node incarnation number. Avoid values 0 to 3.
*/
public OtpErlangRef(final String node, final int[] ids, final int creation) {
- this(OtpExternal.newRefTag, node, ids, creation);
- }
+ this(OtpExternal.newerRefTag, node, ids, creation);
+ }
/**
* Create a new(er) style Erlang ref from its components.
@@ -246,7 +245,7 @@ public class OtpErlangRef extends OtpErlangObject {
/**
* Determine if two refs are equal. Refs are equal if their components are
* equal. New refs and old refs are considered equal if the node, creation
- * and first id numnber are equal.
+ * and first id number are equal.
*
* @param o
* the other ref to compare to.
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpGenericTransportFactory.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpGenericTransportFactory.java
new file mode 100644
index 0000000000..c5858c8953
--- /dev/null
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpGenericTransportFactory.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2022 Jérôme de Bretagne
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %ExternalCopyright%
+ */
+
+package com.ericsson.otp.erlang;
+
+import java.io.IOException;
+import java.net.InetAddress;
+
+/**
+ * Transport factory abstract class used to create client-side and server-side
+ * transport instances defined using generic peers and local nodes (instead of
+ * a host + port combination as expected in the base OtpTransportFactory).
+ *
+ * It allows the creation of a transport using Unix Domain Sockets for example.
+ *
+ * OtpGenericTransportFactory is created as a subclass of OtpTransportFactory
+ * to keep backwards compatibility and ease the integration within existing
+ * Jinterface code, but in practice it doesn't support the 3 original methods.
+ */
+public abstract class OtpGenericTransportFactory implements OtpTransportFactory {
+
+ /**
+ * Create an instance of a client-side {@link OtpTransport}
+ *
+ * @param peer
+ * the peer identifying the server to connect to
+ *
+ * @return a new transport object
+ *
+ * @throws IOException
+ */
+ public abstract OtpTransport createTransport(final OtpPeer peer)
+ throws IOException;
+
+ /**
+ * Create an instance of a server-side {@link OtpServerTransport}
+ *
+ * @param node
+ * the local node identifying the transport to create server-side
+ *
+ * @return a new transport object
+ *
+ * @throws IOException
+ */
+ public abstract OtpServerTransport createServerTransport(final OtpLocalNode node)
+ throws IOException;
+
+
+ /**
+ * Implement the 3 original methods by throwing an exception as the usage
+ * of a port is not supported by this subclass of OtpTransportFactory.
+ */
+ @Override public OtpTransport createTransport(String addr, int port)
+ throws IOException {
+ throw new IOException("Method createTransport(String, int) " +
+ "not applicable for OtpGenericTransportFactory");
+ }
+
+ @Override public OtpTransport createTransport(final InetAddress addr, final int port)
+ throws IOException {
+ throw new IOException("Method createTransport(InetAddress, int) " +
+ "not applicable for OtpGenericTransportFactory");
+ }
+
+ @Override public OtpServerTransport createServerTransport(final int port)
+ throws IOException {
+ throw new IOException("Method createServerTransport(int) " +
+ "not applicable for OtpGenericTransportFactory");
+ }
+
+}
+
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpInputStream.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpInputStream.java
index 7578f06ee5..cf4c5be388 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpInputStream.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpInputStream.java
@@ -750,7 +750,7 @@ public class OtpInputStream extends ByteArrayInputStream {
nb = new byte[4];
if (this.readN(nb) != 4) { // Big endian
throw new OtpErlangDecodeException(
- "Cannot read from intput stream");
+ "Cannot read from input stream");
}
break;
@@ -775,7 +775,7 @@ public class OtpInputStream extends ByteArrayInputStream {
// with one zero byte to make the value 2's complement positive.
if (this.readN(nb, 0, arity) != arity) {
throw new OtpErlangDecodeException(
- "Cannot read from intput stream");
+ "Cannot read from input stream");
}
// Reverse the array to make it big endian.
for (int i = 0, j = nb.length; i < j--; i++) {
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java
index 6f896aab9f..a07897828f 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpLocalNode.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2021. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -114,7 +114,7 @@ public class OtpLocalNode extends AbstractNode {
*/
public synchronized OtpErlangPid createPid() {
final OtpErlangPid p = new OtpErlangPid(node, pidCount, serial,
- creation);
+ creation());
pidCount++;
if (pidCount > 0x7fff) {
@@ -139,7 +139,7 @@ public class OtpLocalNode extends AbstractNode {
* @return an Erlang port.
*/
public synchronized OtpErlangPort createPort() {
- final OtpErlangPort p = new OtpErlangPort(node, portCount, creation);
+ final OtpErlangPort p = new OtpErlangPort(node, portCount, creation());
portCount++;
if (portCount > 0xfffffff) { /* 28 bits */
@@ -158,7 +158,7 @@ public class OtpLocalNode extends AbstractNode {
* @return an Erlang reference.
*/
public synchronized OtpErlangRef createRef() {
- final OtpErlangRef r = new OtpErlangRef(node, refId, creation);
+ final OtpErlangRef r = new OtpErlangRef(node, refId, creation());
// increment ref ids (3 ints: 18 + 32 + 32 bits)
refId[0]++;
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java
index 18aad6a4a8..ff8b63e64a 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMbox.java
@@ -128,7 +128,7 @@ public class OtpMbox {
* mailbox enables others to send messages without knowing the
* {@link OtpErlangPid pid} of the mailbox. A mailbox can have at most one
* name; if the mailbox already had a name, calling this method will
- * supercede that name.
+ * supersede that name.
* </p>
*
* @param aname
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java
index e14b99d274..c44c0c5bdb 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpMsg.java
@@ -242,7 +242,7 @@ public class OtpMsg {
* <p>
* The first time this method is called the actual payload is deserialized
* and the Erlang term is created. Calling this method subsequent times will
- * not cuase the message to be deserialized additional times, instead the
+ * not cause the message to be deserialized additional times, instead the
* same Erlang term object will be returned.
* </p>
*
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpNode.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpNode.java
index e48e6e8633..b0e43b9c11 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpNode.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpNode.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -52,9 +52,12 @@ import java.util.Iterator;
*
* <p>
* Note that the use of this class requires that Epmd (Erlang Port Mapper
- * Daemon) is running on each cooperating host. This class does not start Epmd
- * automatically as Erlang does, you must start it manually or through some
- * other means. See the Erlang documentation for more information about this.
+ * Daemon) is running on each cooperating host, except when using a transport
+ * factory extending the OtpGenericTransportFactory abstract class.
+ *
+ * This class does not start Epmd automatically as Erlang does, you must start
+ * it manually or through some other means. See the Erlang documentation for
+ * more information about this.
* </p>
*/
public class OtpNode extends OtpLocalNode {
@@ -128,7 +131,14 @@ public class OtpNode extends OtpLocalNode {
final OtpTransportFactory transportFactory) throws IOException {
super(node, transportFactory);
- init(0);
+ if (transportFactory instanceof OtpGenericTransportFactory) {
+ // For alternative distribution protocols using a transport factory
+ // extending the OtpGenericTransportFactory abstract class, the
+ // local node is used as the identifier for incoming connections.
+ init();
+ } else {
+ init(0);
+ }
}
/**
@@ -168,7 +178,16 @@ public class OtpNode extends OtpLocalNode {
*/
public OtpNode(final String node, final String cookie,
final OtpTransportFactory transportFactory) throws IOException {
- this(node, cookie, 0, transportFactory);
+ super(node, cookie, transportFactory);
+
+ if (transportFactory instanceof OtpGenericTransportFactory) {
+ // For alternative distribution protocols using a transport factory
+ // extending the OtpGenericTransportFactory abstract class, the
+ // local node is used as the identifier for incoming connections.
+ init();
+ } else {
+ init(0);
+ }
}
/**
@@ -224,6 +243,10 @@ public class OtpNode extends OtpLocalNode {
init(port);
}
+ /*
+ * Initialize a node instance with the port number to use for incoming
+ * connections. Specifying 0 lets the system choose an available port.
+ */
private synchronized void init(final int aport) throws IOException {
if (!initDone) {
connections = new Hashtable<String, OtpCookedConnection>(17,
@@ -234,6 +257,20 @@ public class OtpNode extends OtpLocalNode {
}
}
+ /*
+ * Initialize a node instance using an alternative distribution protocol
+ * with the local node used as the identifier for incoming connections.
+ */
+ private synchronized void init() throws IOException {
+ if (!initDone) {
+ connections = new Hashtable<String, OtpCookedConnection>(17,
+ (float) 0.95);
+ mboxes = new Mailboxes();
+ acceptor = new Acceptor(this);
+ initDone = true;
+ }
+ }
+
/**
* Close the node. Unpublish the node from Epmd (preventing new connections)
* and close all existing connections.
@@ -348,7 +385,7 @@ public class OtpNode extends OtpLocalNode {
* mailbox enables others to send messages without knowing the
* {@link OtpErlangPid pid} of the mailbox. A mailbox can have at most one
* name; if the mailbox already had a name, calling this method will
- * supercede that name.
+ * supersede that name.
* </p>
*
* @param name
@@ -446,8 +483,8 @@ public class OtpNode extends OtpLocalNode {
public boolean ping(final String anode, final long timeout) {
if (anode.equals(node)) {
return true;
- } else if (anode.indexOf('@', 0) < 0
- && anode.equals(node.substring(0, node.indexOf('@', 0)))) {
+ } else if (anode.indexOf('@') < 0
+ && anode.equals(node.substring(0, node.indexOf('@')))) {
return true;
}
@@ -527,7 +564,7 @@ public class OtpNode extends OtpLocalNode {
if (t == OtpMsg.regSendTag) {
final String name = m.getRecipientName();
- /* special case for netKernel requests */
+ // special case for netKernel requests
if (name.equals("net_kernel")) {
return netKernel(m);
}
@@ -569,7 +606,10 @@ public class OtpNode extends OtpLocalNode {
if (conn == null) {
// in case node had no '@' add localhost info and try again
- peer = new OtpPeer(anode);
+ peer = new OtpPeer(anode,
+ // Pass the transport factory to use
+ // when creating connections
+ transportFactory);
conn = connections.get(peer.node());
if (conn == null) {
@@ -578,7 +618,7 @@ public class OtpNode extends OtpLocalNode {
conn.setFlags(connFlags);
addConnection(conn);
} catch (final Exception e) {
- /* false = outgoing */
+ // false = outgoing
connAttempt(peer.node(), false, e);
}
}
@@ -773,10 +813,31 @@ public class OtpNode extends OtpLocalNode {
setDaemon(true);
setName("acceptor");
+ // Publish the node through Epmd
publishPort();
start();
}
+ /*
+ * Constructor for alternative distribution protocols using a transport
+ * factory extending the OtpGenericTransportFactory abstract class.
+ *
+ * The notion of socket port is not used with such protocols so the
+ * node is not published via Epmd.
+ */
+ Acceptor(final OtpLocalNode node) throws IOException {
+ // Set acceptorPort arbitrarily to 0, it won't be used later on.
+ acceptorPort = 0;
+
+ // The local node is passed as the identifier to use for incoming
+ // connections.
+ sock = createServerTransport(node);
+
+ setDaemon(true);
+ setName("acceptor");
+ start();
+ }
+
private boolean publishPort() throws IOException {
if (getEpmd() != null) {
return false; // already published
@@ -786,10 +847,16 @@ public class OtpNode extends OtpLocalNode {
}
private void unPublishPort() {
- // unregister with epmd
+ // The notion of socket port is not used with such an alternative
+ // distribution protocol so the node was not registered with Epmd.
+ if (transportFactory instanceof OtpGenericTransportFactory) {
+ return;
+ }
+
+ // Unregister the node from Epmd
OtpEpmd.unPublishPort(OtpNode.this);
- // close the local descriptor (if we have one)
+ // Close the local descriptor (if we have one)
closeSock(epmd);
epmd = null;
}
@@ -875,7 +942,7 @@ public class OtpNode extends OtpLocalNode {
}
} // while
- // if we have exited loop we must do this too
+ // If we have exited loop we must do this too
unPublishPort();
}
}
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpSelf.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpSelf.java
index 97f7f037e7..9410aba9a5 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpSelf.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpSelf.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@ import java.net.UnknownHostException;
* <p>
* When you create an instance of this class, it will bind a socket to a port so
* that incoming connections can be accepted. However the port number will not
- * be made available to other nodes wishing to connect until you explicitely
+ * be made available to other nodes wishing to connect until you explicitly
* register with the port mapper daemon by calling {@link #publishPort()}.
* </p>
*
@@ -196,12 +196,20 @@ public class OtpSelf extends OtpLocalNode {
final OtpTransportFactory transportFactory) throws IOException {
super(node, cookie, transportFactory);
- sock = createServerTransport(port);
+ if (transportFactory instanceof OtpGenericTransportFactory) {
+ // For alternative distribution protocols using a transport factory
+ // extending the OtpGenericTransportFactory abstract class, pass the
+ // local node as the identifier to use for incoming connections.
+ sock = createServerTransport(this);
- if (port != 0) {
- this.port = port;
} else {
- this.port = sock.getLocalPort();
+ sock = createServerTransport(port);
+
+ if (port != 0) {
+ this.port = port;
+ } else {
+ this.port = sock.getLocalPort();
+ }
}
pid = createPid();
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpServer.java b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpServer.java
index d6a143ca6a..4cc6fd5047 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpServer.java
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/OtpServer.java
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@ import java.io.IOException;
*
* When you create an instance of this class, it will bind a socket to a port so
* that incoming connections can be accepted. However the port number will not
- * be made available to other nodes wishing to connect until you explicitely
+ * be made available to other nodes wishing to connect until you explicitly
* register with the port mapper daemon by calling {@link #publishPort()}.
*
* <p>
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/java_files b/lib/jinterface/java_src/com/ericsson/otp/erlang/java_files
index cfabbe6271..10709e1059 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/java_files
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/java_files
@@ -2,9 +2,9 @@
#
# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2000-2016. All Rights Reserved.
-#
+#
+# Copyright Ericsson AB 2000-2022. All Rights Reserved.
+#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
@@ -16,7 +16,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
-#
+#
# %CopyrightEnd%
#
@@ -44,6 +44,7 @@ COMM = \
OtpErlangFun \
OtpErlangExternalFun \
OtpExternal \
+ OtpGenericTransportFactory \
OtpInputStream \
OtpLocalNode \
OtpNodeStatus \
diff --git a/lib/jinterface/java_src/com/ericsson/otp/erlang/package.html b/lib/jinterface/java_src/com/ericsson/otp/erlang/package.html
index f7b4884851..eb62e69243 100644
--- a/lib/jinterface/java_src/com/ericsson/otp/erlang/package.html
+++ b/lib/jinterface/java_src/com/ericsson/otp/erlang/package.html
@@ -3,7 +3,7 @@
%CopyrightBegin%
- Copyright Ericsson AB 2000-2016. All Rights Reserved.
+ Copyright Ericsson AB 2000-2022. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -105,7 +105,7 @@ com.ericsson.otp.erlang.OtpConnection}. </p>
<p> The classes {@link com.ericsson.otp.erlang.OtpPeer}, {@link
com.ericsson.otp.erlang.OtpSelf} and {@link
com.ericsson.otp.erlang.OtpServer} are used to represent OTP nodes and
-are neccessary in order to set up communication between the Java
+are necessary in order to set up communication between the Java
thread and a remote node. Once a connection has been established, it
is represented by an {@link com.ericsson.otp.erlang.OtpConnection},
through which all communication goes.
diff --git a/lib/jinterface/test/Makefile b/lib/jinterface/test/Makefile
index 3eff11e4f7..abbd8c6535 100644
--- a/lib/jinterface/test/Makefile
+++ b/lib/jinterface/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -58,7 +58,7 @@ TARGET_FILES = \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-tests debug opt:
+tests $(TYPES):
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/jinterface/test/jinterface_SUITE.erl b/lib/jinterface/test/jinterface_SUITE.erl
index d7bb112bd9..8c771feeea 100644
--- a/lib/jinterface/test/jinterface_SUITE.erl
+++ b/lib/jinterface/test/jinterface_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
init_per_suite/1, end_per_suite/1,
init_per_testcase/2, end_per_testcase/2]).
--export([transport_factory/1,
+-export([generic_transport_factory/1, transport_factory/1,
nodename/1, register_and_whereis/1, get_names/1, boolean_atom/1,
node_ping/1, mbox_ping/1,
java_erlang_send_receive/1,
@@ -114,14 +114,15 @@ end_per_group(_GroupName, Config) ->
fundamental() ->
[
- transport_factory, % TransportFactoryTest.java
- nodename, % Nodename.java
- register_and_whereis, % RegisterAndWhereis.java
- get_names, % GetNames.java
- boolean_atom, % BooleanAtom.java
- maps, % Maps.java
- fun_equals, % FunEquals.java
- core_match_bind % CoreMatchBind.java
+ generic_transport_factory, % GenericTransportFactoryTest.java
+ transport_factory, % TransportFactoryTest.java
+ nodename, % Nodename.java
+ register_and_whereis, % RegisterAndWhereis.java
+ get_names, % GetNames.java
+ boolean_atom, % BooleanAtom.java
+ maps, % Maps.java
+ fun_equals, % FunEquals.java
+ core_match_bind % CoreMatchBind.java
].
ping() ->
@@ -236,6 +237,17 @@ end_per_testcase(_Case,Config) ->
%%%-----------------------------------------------------------------
%%% TEST CASES
%%%-----------------------------------------------------------------
+generic_transport_factory(doc) ->
+ ["GenericTransportFactoryTest.java: "
+ "Test custom OTP Generic Transport Factory"];
+generic_transport_factory(suite) ->
+ [];
+generic_transport_factory(Config) when is_list(Config) ->
+ ok = jitu:java(?config(java, Config),
+ ?config(data_dir, Config),
+ "GenericTransportFactoryTest").
+
+%%%-----------------------------------------------------------------
transport_factory(doc) ->
["TransportFactoryTest.java: Test custom OTP Transport Factory"];
transport_factory(suite) ->
diff --git a/lib/jinterface/test/jinterface_SUITE_data/GenericTransportFactoryTest.java b/lib/jinterface/test/jinterface_SUITE_data/GenericTransportFactoryTest.java
new file mode 100644
index 0000000000..63306c63cb
--- /dev/null
+++ b/lib/jinterface/test/jinterface_SUITE_data/GenericTransportFactoryTest.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2022 Jérôme de Bretagne
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %ExternalCopyright%
+ */
+
+import java.io.IOException;
+
+import com.ericsson.otp.erlang.OtpGenericTransportFactory;
+import com.ericsson.otp.erlang.OtpLocalNode;
+import com.ericsson.otp.erlang.OtpNode;
+import com.ericsson.otp.erlang.OtpPeer;
+import com.ericsson.otp.erlang.OtpServerTransport;
+import com.ericsson.otp.erlang.OtpSocketTransportFactory;
+import com.ericsson.otp.erlang.OtpTransport;
+import com.ericsson.otp.erlang.OtpTransportFactory;
+
+public class GenericTransportFactoryTest {
+
+ static boolean serverOk = false;
+
+ /**
+ * A minimalist custom generic transport factory working without epmd,
+ * using the node name as the identifier of the listening socket port.
+ */
+ public static class TestFactory extends OtpGenericTransportFactory {
+
+ OtpSocketTransportFactory tf = new OtpSocketTransportFactory();
+
+ public OtpTransport createTransport(final OtpPeer peer)
+ throws IOException {
+ String addr = "localhost";
+ String peerName = peer.alive();
+ int port = 0;
+ try {
+ port = Integer.parseInt(peerName);
+ } catch (NumberFormatException e) {
+ }
+ System.out.println("Creating transport to " + addr + ", " + port);
+ return tf.createTransport(addr, port);
+ }
+
+ public OtpServerTransport createServerTransport(final OtpLocalNode node)
+ throws IOException {
+ String nodeName = node.alive();
+ int port = 0;
+ try {
+ port = Integer.parseInt(nodeName);
+ serverOk = true;
+ } catch (NumberFormatException e) {
+ serverOk = false;
+ }
+ System.out.println("Creating server transport to " + port);
+ return tf.createServerTransport(port);
+ }
+
+ }
+
+ public static void main(final String[] args) throws IOException {
+
+ OtpTransportFactory customFactory = new TestFactory();
+
+ // The 2 test nodes with arbitrary socket port numbers
+ String nodeName1 = "65432";
+ String nodeName2 = "54321";
+
+ // Create the first node
+ final OtpNode node1 = new OtpNode(nodeName1, customFactory);
+ if (!serverOk) {
+ fail("Custom server transport 1 was not created");
+ }
+ System.out.println("Node 1 accepting connections on " + node1.port());
+
+ // Create the second node
+ final OtpNode node2 = new OtpNode(nodeName2, customFactory);
+ if (!serverOk) {
+ fail("Custom server transport 2 was not created");
+ }
+ System.out.println("Node 2 accepting connections on " + node2.port());
+
+ // Finally test the connection between the 2 nodes
+ if (!node1.ping(nodeName2, 2000)) {
+ fail("The 2 nodes couldn't connect");
+ }
+
+ }
+
+ private static void fail(final String string) {
+ System.err.println(string);
+ System.exit(1);
+ }
+}
diff --git a/lib/jinterface/test/jinterface_SUITE_data/Makefile.src b/lib/jinterface/test/jinterface_SUITE_data/Makefile.src
index 19c2157f7a..fe4051ea8f 100644
--- a/lib/jinterface/test/jinterface_SUITE_data/Makefile.src
+++ b/lib/jinterface/test/jinterface_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -23,9 +23,6 @@
# We use both `rm' (Unix) and `del' (Windows) for removing files, but
# with a `-' in front so that the error in not finding `rm' (`del') on
# Windows (Unix) is ignored.
-#
-# VxWorks? XXX
-#
.SUFFIXES:
.SUFFIXES: .java
@@ -39,6 +36,7 @@ JINTERFACE_CLASSPATH = @jinterface_classpath@
CLASSPATH = .@PS@$(JINTERFACE_CLASSPATH)@PS@
JAVA_FILES = \
+ GenericTransportFactoryTest.java \
TransportFactoryTest.java \
Nodename.java \
RegisterAndWhereis.java \
@@ -62,6 +60,6 @@ clean:
-del /F /Q $(CLASS_FILES)
$(CLASS_FILES) : $(JAVA_FILES)
- $(JAVAC) -classpath $(CLASSPATH) $(JAVA_FILES)
+ $(JAVAC) -encoding UTF-8 -classpath $(CLASSPATH) $(JAVA_FILES)
#
diff --git a/lib/jinterface/test/jinterface_SUITE_data/MboxLinkUnlink.java b/lib/jinterface/test/jinterface_SUITE_data/MboxLinkUnlink.java
index 560786c304..4af73e8fb4 100644
--- a/lib/jinterface/test/jinterface_SUITE_data/MboxLinkUnlink.java
+++ b/lib/jinterface/test/jinterface_SUITE_data/MboxLinkUnlink.java
@@ -188,7 +188,7 @@ class MboxLinkUnlink {
waiting = true;
expected = tuple.elementAt(2);
mbox2.receive(1000); // hanging waiting for exit
- System.exit(4); // got someting other than exit
+ System.exit(4); // got something other than exit
break;
case internal_link_linked_exits:
dbg("Java got \"internal_link_linked_exits\"");
@@ -198,7 +198,7 @@ class MboxLinkUnlink {
waiting = true;
expected = tuple.elementAt(2);
mbox.receive(1000); // hanging waiting for exit
- System.exit(5); // got someting other than exit
+ System.exit(5); // got something other than exit
break;
case internal_unlink_linking_exits:
dbg("Java got \"internal_unlink_linking_exits\"");
diff --git a/lib/jinterface/test/nc_SUITE.erl b/lib/jinterface/test/nc_SUITE.erl
index 66806a94ab..115571e21e 100644
--- a/lib/jinterface/test/nc_SUITE.erl
+++ b/lib/jinterface/test/nc_SUITE.erl
@@ -125,8 +125,6 @@ end_per_testcase(_Case, Config) ->
%% Test cases
%%
-pid_roundtrip(doc) -> [];
-pid_roundtrip(suite) -> [];
pid_roundtrip(Config) when is_list(Config)->
ThisNode = {node(), erlang:system_info(creation)},
RemPids = [mk_pid({gurka@sallad, Cr}, Num, Ser)
@@ -138,8 +136,6 @@ pid_roundtrip(Config) when is_list(Config)->
| RemPids],
Config).
-fun_roundtrip(doc) -> [];
-fun_roundtrip(suite) -> [];
fun_roundtrip(Config) when is_list(Config)->
do_echo([fun(A, B) -> A + B end,
fun(A) -> lists:reverse(A) end,
@@ -148,8 +144,6 @@ fun_roundtrip(Config) when is_list(Config)->
fun ?MODULE:fun_roundtrip/1],
Config).
-port_roundtrip(doc) -> [];
-port_roundtrip(suite) -> [];
port_roundtrip(Config) when is_list(Config)->
ThisNode = {node(), erlang:system_info(creation)},
RemPorts = [mk_port({gurka@sallad, Cr}, Num)
@@ -166,8 +160,6 @@ port_roundtrip(Config) when is_list(Config)->
| RemPorts],
Config).
-ref_roundtrip(doc) -> [];
-ref_roundtrip(suite) -> [];
ref_roundtrip(Config) when is_list(Config)->
ThisNode = {node(), erlang:system_info(creation)},
RemRefs = [mk_ref({gurka@sallad, Cr}, Words)
@@ -183,8 +175,6 @@ ref_roundtrip(Config) when is_list(Config)->
| RemRefs],
Config).
-new_float(doc) -> [];
-new_float(suite) -> [];
new_float(Config) when is_list(Config)->
Two16 = float(1 bsl 16),
X = math:sqrt(2),
@@ -193,8 +183,6 @@ new_float(Config) when is_list(Config)->
io:format("~w", [Floats]),
do_echo(Floats, Config).
-old_stuff(doc) -> [];
-old_stuff(suite) -> [];
old_stuff(Config) when is_list(Config)->
Terms = [0.0,math:sqrt(2)],
OutTrans =
@@ -207,8 +195,6 @@ old_stuff(Config) when is_list(Config)->
end,
do_echo(Terms, Config, OutTrans, InTrans).
-binary_roundtrip(doc) -> [];
-binary_roundtrip(suite) -> [];
binary_roundtrip(Config) when is_list(Config) ->
do_echo([<<17>>,
<<1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17>>,
@@ -217,8 +203,6 @@ binary_roundtrip(Config) when is_list(Config) ->
<<>>],
Config).
-decompress_roundtrip(doc) -> [];
-decompress_roundtrip(suite) -> [];
decompress_roundtrip(Config) when is_list(Config) ->
RandomBin = erlang:term_to_binary(lists:seq(1, 5 * 1024 * 1024)), % roughly 26MB
<<RandomBin1k:1024/binary,_/binary>> = RandomBin,
@@ -247,8 +231,6 @@ decompress_roundtrip(Config) when is_list(Config) ->
end,
do_echo(Terms, Config, OutTrans, InTrans).
-compress_roundtrip(doc) -> [];
-compress_roundtrip(suite) -> [];
compress_roundtrip(Config) when is_list(Config) ->
RandomBin = erlang:term_to_binary(lists:seq(1, 5 * 1024 * 1024)), % roughly 26MB
<<RandomBin1k:1024/binary,_/binary>> = RandomBin,
@@ -279,8 +261,6 @@ compress_roundtrip(Config) when is_list(Config) ->
-integer_roundtrip(doc) -> [];
-integer_roundtrip(suite) -> [];
integer_roundtrip(Config) when is_list(Config) ->
Xs = [1 bsl X || X <- [26,27,28,29,30,31,32,33,
62,63,64,65,
@@ -319,8 +299,6 @@ bitlength(V) when is_integer(V) ->
-lists_roundtrip(doc) -> [];
-lists_roundtrip(suite) -> [];
lists_roundtrip(Config) when is_list(Config) ->
Ls = [lists:seq(1,10),
lists:seq(11,17)++last_tail,
@@ -332,8 +310,6 @@ lists_roundtrip(Config) when is_list(Config) ->
-lists_roundtrip_2(doc) -> [];
-lists_roundtrip_2(suite) -> [];
lists_roundtrip_2(Config) when is_list(Config) ->
Ls = [{[a,b],tail},
{[c,d,e],tail},
@@ -385,8 +361,6 @@ lists_roundtrip_2(Config) when is_list(Config) ->
-lists_iterator(doc) -> [];
-lists_iterator(suite) -> [];
lists_iterator(Config) when is_list(Config) ->
Ls = [["able ","was ","I ","ere ","I ","saw ","elba"]],
do_echo(Ls, Config,
@@ -398,8 +372,6 @@ lists_iterator(Config) when is_list(Config) ->
-unicode(doc) -> [];
-unicode(suite) -> [];
unicode(Config) when is_list(Config) ->
S1 = "plain ascii",
S2 = "iso-latin åäö ñ",
@@ -447,8 +419,6 @@ unicode_cp_gen(Cont) when is_function(Cont, 0) ->
-unicode_list_to_string(doc) -> [];
-unicode_list_to_string(suite) -> [];
unicode_list_to_string(Config) when is_list(Config) ->
do_echo(cp_gen(73), Config,
fun ({L,_}) -> {self(),L,to_string_neg_int_list} end,
@@ -469,8 +439,6 @@ unicode_list_to_string(Config) when is_list(Config) ->
-unicode_string_to_list(doc) -> [];
-unicode_string_to_list(suite) -> [];
unicode_string_to_list(Config) when is_list(Config) ->
do_echo(cp_gen(79), Config,
fun ({L,_}) -> {self(),L,to_neg_int_list} end,
@@ -592,11 +560,8 @@ cp_validity(UnicodeCP) ->
-connect(doc) -> [];
-connect(suite) -> [];
connect(Config) when is_list(Config) ->
- WD = filename:dirname(code:which(?MODULE)),
- {ok,Other} = test_server:start_node(make_name(), slave, [{args,"-pa "++WD}]),
+ {ok,Peer,Other} = ?CT_PEER(),
Action =
fun (Pid) ->
JName = node(Pid),
@@ -628,7 +593,8 @@ connect(Config) when is_list(Config) ->
end,
Hidden = rpc:call(Other, erlang, nodes, [hidden])
end,
- run_server(connection_server, Config, Action, []).
+ run_server(connection_server, Config, Action, []),
+ peer:stop(Peer).
diff --git a/lib/jinterface/test/nc_SUITE_data/Makefile.src b/lib/jinterface/test/nc_SUITE_data/Makefile.src
index 94e2c1fa47..a278683477 100644
--- a/lib/jinterface/test/nc_SUITE_data/Makefile.src
+++ b/lib/jinterface/test/nc_SUITE_data/Makefile.src
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -24,9 +24,6 @@
# We use both `rm' (Unix) and `del' (Windows) for removing files, but
# with a `-' in front so that the error in not finding `rm' (`del') on
# Windows (Unix) is ignored.
-#
-# VxWorks? XXX
-#
.SUFFIXES:
.SUFFIXES: .java
@@ -49,6 +46,6 @@ clean:
-del /F /Q $(CLASS_FILES)
$(CLASS_FILES) : $(JAVA_FILES)
- $(JAVAC) -classpath $(CLASSPATH) $(JAVA_FILES)
+ $(JAVAC) -encoding UTF-8 -classpath $(CLASSPATH) $(JAVA_FILES)
#
diff --git a/lib/kernel/Makefile b/lib/kernel/Makefile
index a6c0253397..534b564c2c 100644
--- a/lib/kernel/Makefile
+++ b/lib/kernel/Makefile
@@ -36,5 +36,6 @@ SPECIAL_TARGETS =
include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=crypto
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/kernel/doc/src/config.xml b/lib/kernel/doc/src/config.xml
index cf47c2c231..fe271a1a6f 100644
--- a/lib/kernel/doc/src/config.xml
+++ b/lib/kernel/doc/src/config.xml
@@ -101,7 +101,7 @@
<c>sys.config</c> file and from a configuration that comes
from a file descriptor that has been pointed out with the <seecom
marker="erts:erl#configfd"><c>-configfd</c></seecom> command-line
- arguemnt.</p>
+ argument.</p>
<p>The syntax for including files can be described by the
<seeguide marker="system/reference_manual:typespec">Erlang type
diff --git a/lib/kernel/doc/src/erl_ddll.xml b/lib/kernel/doc/src/erl_ddll.xml
index 798789c2af..a04e36a37d 100644
--- a/lib/kernel/doc/src/erl_ddll.xml
+++ b/lib/kernel/doc/src/erl_ddll.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1997</year><year>2020</year>
+ <year>1997</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -95,7 +95,7 @@
<em>last port</em> using the driver is closed. Function
<c>unload/1</c> can return immediately, as the
<seeerl marker="#users">users</seeerl>
- have no interrest in when the unloading occurs. The
+ have no interest in when the unloading occurs. The
driver is unloaded when no one needs it any longer.</p>
<p>If a process having the driver loaded dies, it has
the same effect as if unloading is done.</p>
@@ -334,7 +334,7 @@
<p>Loads and links the dynamic driver <c><anno>Name</anno></c>.
<c><anno>Path</anno></c>
is a file path to the directory containing the driver.
- <c><anno>Name</anno></c> must be a sharable object/dynamic library. Two
+ <c><anno>Name</anno></c> must be a shareable object/dynamic library. Two
drivers with different <c><anno>Path</anno></c> parameters cannot be
loaded under the same name. <c><anno>Name</anno></c> is a string or
atom containing at least one character.</p>
diff --git a/lib/kernel/doc/src/erpc.xml b/lib/kernel/doc/src/erpc.xml
index 26d1ec4aad..7b1791765c 100644
--- a/lib/kernel/doc/src/erpc.xml
+++ b/lib/kernel/doc/src/erpc.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2020</year><year>2021</year>
+ <year>2020</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -64,12 +64,55 @@
<name name="request_id"/>
<desc>
<p>
- An opaque type of call request identifiers. For more
- information see
+ An opaque request identifier. For more information see
<seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
</p>
</desc>
</datatype>
+ <datatype>
+ <name name="request_id_collection"/>
+ <desc>
+ <p>
+ An opaque collection of request identifiers
+ (<seetype marker="#request_id"><c>request_id()</c></seetype>)
+ where each request identifier can be associated with a label
+ chosen by the user. For more information see
+ <seemfa marker="#reqids_new/0"><c>reqids_new/0</c></seemfa>.
+ </p>
+ </desc>
+ </datatype>
+ <datatype>
+ <name name="timeout_time"/>
+ <desc>
+ <taglist>
+ <tag><c>0..4294967295</c></tag>
+ <item><p>
+ Timeout relative to current time in milliseconds.
+ </p></item>
+ <tag><c>infinity</c></tag>
+ <item><p>
+ Infinite timeout. That is, the operation will never time out.
+ </p></item>
+ <tag><c>{abs, Timeout}</c></tag>
+ <item><p>
+ An absolute
+ <seemfa marker="erts:erlang#monotonic_time/1">Erlang monotonic time</seemfa>
+ timeout in milliseconds. That is, the operation will time out when
+ <seemfa marker="erts:erlang#monotonic_time/1"><c>erlang:monotonic_time(millisecond)</c></seemfa>
+ returns a value larger than or equal to <c>Timeout</c>. <c>Timeout</c>
+ is not allowed to identify a time further into the future than <c>4294967295</c>
+ milliseconds. Identifying the timeout using an absolute timeout value
+ is especially handy when you have a deadline for responses corresponding
+ to a complete collection of requests
+ (<seetype marker="#request_id_collection"><c>request_id_collection()</c></seetype>)
+,
+ since you do not have to recalculate the relative time until the deadline
+ over and over again.
+ </p></item>
+ </taglist>
+ </desc>
+ </datatype>
+
</datatypes>
<funcs>
@@ -81,8 +124,9 @@
<desc>
<p>
The same as calling
- <seemfa marker="#call/5"><c>erpc:call(<anno>Node</anno>,erlang,apply,[<anno>Fun</anno>,[]],<anno>Timeout</anno>)</c></seemfa>.
- May raise all the same exceptions as <c>erpc:call/5</c>
+ <seemfa marker="#call/5"><c>erpc:call(<anno>Node</anno>,
+ erlang, apply, [<anno>Fun</anno>,[]], <anno>Timeout</anno>)</c></seemfa>.
+ May raise all the same exceptions as <c>call/5</c>
plus an <c>{erpc, badarg}</c> <c>error</c>
exception if <c><anno>Fun</anno></c> is not a fun of
zero arity.
@@ -104,9 +148,8 @@
Evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>,
<anno>Args</anno>)</c> on node <c><anno>Node</anno></c> and returns
the corresponding value <c><anno>Result</anno></c>.
- <c><anno>Timeout</anno></c> is an integer representing
- the timeout in milliseconds or the atom <c>infinity</c>
- which prevents the operation from ever timing out.
+ <c><anno>Timeout</anno></c> sets an upper time limit
+ for the <c>call</c> operation to complete.
</p>
<p>The call <c>erpc:call(<anno>Node</anno>, <anno>Module</anno>,
<anno>Function</anno>, <anno>Args</anno>)</c> is equivalent
@@ -118,7 +161,7 @@
exceptions, the operation did not time out, and no failures
occurred. In all other cases an exception is raised. The
following exceptions, listed by exception class, can
- currently be raised by <c>erpc:call()</c>:
+ currently be raised by <c>call()</c>:
</p>
<taglist>
<tag><c>throw</c></tag>
@@ -158,7 +201,7 @@
<tag><c>{exception, ErrorReason, StackTrace}</c></tag>
<item><p>
- A runtime error occurred which raised and error
+ A runtime error occurred which raised an error
exception while applying the function,
and the applied function did not catch the
exception. The error reason <c>ErrorReason</c>
@@ -186,9 +229,8 @@
<item><p><c><anno>Args</anno></c> is not a list.
Note that the list is not verified to be
a proper list at the client side.</p></item>
- <item><p><c><anno>Timeout</anno></c> is not the
- atom <c>infinity</c> or an integer in valid
- range.</p></item>
+ <item><p><c><anno>Timeout</anno></c> is
+ invalid.</p></item>
</list>
</item>
@@ -256,7 +298,7 @@
The same as calling
<seemfa marker="#cast/4"><c>erpc:cast(<anno>Node</anno>,erlang,apply,[<anno>Fun</anno>,[]])</c></seemfa>.
</p>
- <p><c>erpc:cast/2</c> fails with an <c>{erpc, badarg}</c>
+ <p><c>cast/2</c> fails with an <c>{erpc, badarg}</c>
<c>error</c> exception if:</p>
<list>
<item><p><c><anno>Node</anno></c> is not an atom.</p></item>
@@ -273,11 +315,11 @@
Evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>,
<anno>Args</anno>)</c> on node
<c><anno>Node</anno></c>. No response is delivered to the
- calling process. <c>erpc:cast()</c> returns immediately
+ calling process. <c>cast()</c> returns immediately
after the cast request has been sent. Any failures beside
bad arguments are silently ignored.
</p>
- <p><c>erpc:cast/4</c> fails with an <c>{erpc, badarg}</c>
+ <p><c>cast/4</c> fails with an <c>{erpc, badarg}</c>
<c>error</c> exception if:</p>
<list>
<item><p><c><anno>Node</anno></c> is not an atom.</p></item>
@@ -305,13 +347,13 @@
<p>
Check if a message is a response to a <c>call</c> request
previously made by the calling process using
- <seemfa marker="#send_request/4"><c>erpc:send_request/4</c></seemfa>.
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
<c><anno>RequestId</anno></c> should be the value returned
- from the previously made <c>erpc:send_request()</c> call,
+ from the previously made <c>send_request/4</c> call,
and the corresponding response should not already have been
- received and handled to completion by <c>erpc:check_response()</c>,
- <seemfa marker="#receive_response/2"><c>erpc:receive_response()</c></seemfa>, or
- <seemfa marker="#wait_response/2"><c>erpc:wait_response()</c></seemfa>.
+ received and handled to completion by <c>check_response/2</c>,
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>, or
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>.
<c><anno>Message</anno></c> is the message to check.
</p>
<p>
@@ -323,9 +365,9 @@
corresponds to the value returned from the applied function
or an exception is raised. The exceptions that can be raised
corresponds to the same exceptions as can be raised by
- <seemfa marker="#call/4"><c>erpc:call/4</c></seemfa>.
+ <seemfa marker="#call/4"><c>call/4</c></seemfa>.
That is, no <c>{erpc, timeout}</c> <c>error</c> exception
- can be raised. <c>erpc:check_response()</c> will fail with
+ can be raised. <c>check_response()</c> will fail with
an <c>{erpc, badarg}</c> exception if/when an invalid
<c><anno>RequestId</anno></c> is detected.
</p>
@@ -341,14 +383,89 @@
</func>
<func>
+ <name name="check_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Check if a message is a response corresponding to a
+ previously sent call request.</fsummary>
+ <desc>
+ <p>
+ Check if a message is a response to a <c>call</c> request corresponding
+ to a request identifier saved in <c><anno>RequestIdCollection</anno></c>.
+ All request identifiers of <c><anno>RequestIdCollection</anno></c> must
+ correspond to requests that have been made using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa> or
+ <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>,
+ and all requests must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ <c><anno>Label</anno></c> is the label associated with the request
+ identifier of the request that the response corresponds to.
+ A request identifier is associated with a label when
+ <seemfa marker="#reqids_add/3">adding a request identifier</seemfa>
+ in a <seetype marker="#request_id_collection">request identifier
+ collection</seetype>, or when sending the request using
+ <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>check_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewRequestIdCollection</anno></c> is a possibly modified
+ request identifier collection. The <c>error</c> exception <c>{erpc,
+ badarg}</c> is not associated with any specific request identifier,
+ and will hence not be wrapped.
+ </p>
+ <p>
+ If <c><anno>RequestIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned. If <c><anno>Message</anno></c>
+ does not correspond to any of the request identifiers in
+ <c><anno>RequestIdCollection</anno></c>, the atom
+ <c>no_response</c> is returned.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>RequestIdCollection</anno></c> in the resulting
+ <c><anno>NewRequestIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewRequestIdCollection</anno></c> will equal
+ <c><anno>RequestIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>check_response/3</c>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>check_response/3</c>, it will always
+ return <c>no_response</c>.
+ </p>
+ <p>
+ Note that a response might have been consumed uppon an <c>{erpc,
+ badarg}</c> exception and if so, will be lost for ever.
+ </p>
+ </desc>
+ </func>
+
+ <func>
<name name="multicall" arity="2" since="OTP 23.0"/>
<name name="multicall" arity="3" since="OTP 23.0"/>
<fsummary>Evaluate a function call on a node.</fsummary>
<desc>
<p>
The same as calling
- <seemfa marker="#multicall/5"><c>erpc:multicall(<anno>Nodes</anno>,erlang,apply,[<anno>Fun</anno>,[]],<anno>Timeout</anno>)</c></seemfa>.
- May raise all the same exceptions as <c>erpc:multicall/5</c>
+ <seemfa marker="#multicall/5"><c>erpc:multicall(<anno>Nodes</anno>,
+ erlang, apply, [<anno>Fun</anno>,[]], <anno>Timeout</anno>)</c></seemfa>.
+ May raise all the same exceptions as <c>multicall/5</c>
plus an <c>{erpc, badarg}</c> <c>error</c>
exception if <c><anno>Fun</anno></c> is not a fun of
zero arity.
@@ -372,15 +489,13 @@
Performs multiple <c>call</c> operations in parallel
on multiple nodes. That is, evaluates
<c>apply(<anno>Module</anno>, <anno>Function</anno>,
- <anno>Args</anno>)</c> on the nodes
- <c><anno>Nodes</anno></c> in parallel.
- <c><anno>Timeout</anno></c> is an integer representing
- the timeout in milliseconds or the atom <c>infinity</c>
- which prevents the operation from ever timing out.
- The result is returned as a list where
- the result from each node is placed at the same position
- as the node name is placed in <c><anno>Nodes</anno></c>.
- Each item in the resulting list is formatted as either:
+ <anno>Args</anno>)</c> on the nodes <c><anno>Nodes</anno></c>
+ in parallel. <c><anno>Timeout</anno></c> sets an upper time
+ limit for all <c>call</c> operations to complete. The result
+ is returned as a list where the result from each node is placed
+ at the same position as the node name is placed in
+ <c><anno>Nodes</anno></c>. Each item in the resulting list is
+ formatted as either:
</p>
<taglist>
<tag><c>{ok, Result}</c></tag>
@@ -394,11 +509,11 @@
raised an exception of class <c>Class</c> with
exception reason <c>ExceptionReason</c>. These
corresponds the the exceptions that
- <seemfa marker="#call/5"><c>erpc:call/5</c></seemfa>
+ <seemfa marker="#call/5"><c>call/5</c></seemfa>
can raise.
</p></item>
</taglist>
- <p><c>erpc:multicall/5</c> fails with an <c>{erpc, badarg}</c>
+ <p><c>multicall/5</c> fails with an <c>{erpc, badarg}</c>
<c>error</c> exception if:</p>
<list>
<item><p><c><anno>Nodes</anno></c> is not a proper list of
@@ -416,8 +531,12 @@
to the call <c>erpc:multicall(<anno>Nodes</anno>, <anno>Module</anno>,
<anno>Function</anno>, <anno>Args</anno>, infinity)</c>. These
calls are also equivalent to calling <c>my_multicall(Nodes, Module,
- Function, Args)</c> if one disregard performance and failure
- behavior:
+ Function, Args)</c> below if one disregard performance and failure
+ behavior. <c>multicall()</c> can utilize a selective receive
+ optimization which removes the need to scan the message queue from
+ the beginning in order to find a matching message. The
+ <c>send_request()/receive_response()</c> combination can,
+ however, not utilize this optimization.
</p>
<pre>
my_multicall(Nodes, Module, Function, Args) ->
@@ -436,12 +555,6 @@ my_multicall(Nodes, Module, Function, Args) ->
ReqIds).
</pre>
- <p>
- The <c><anno>Timeout</anno></c> value in milliseconds
- sets an upper time limit for all <c>call</c> operations
- to complete.
- </p>
-
<p>
If an <c>erpc</c> operation fails, but it is unknown if
the function is/will be applied (that is, a timeout,
@@ -473,7 +586,7 @@ my_multicall(Nodes, Module, Function, Args) ->
The same as calling
<seemfa marker="#multicast/4"><c>erpc:multicast(<anno>Nodes</anno>,erlang,apply,[<anno>Fun</anno>,[]])</c></seemfa>.
</p>
- <p><c>erpc:multicast/2</c> fails with an <c>{erpc, badarg}</c>
+ <p><c>multicast/2</c> fails with an <c>{erpc, badarg}</c>
<c>error</c> exception if:</p>
<list>
<item><p><c><anno>Nodes</anno></c> is not a proper list of atoms.</p></item>
@@ -490,11 +603,11 @@ my_multicall(Nodes, Module, Function, Args) ->
Evaluates <c>apply(<anno>Module</anno>, <anno>Function</anno>,
<anno>Args</anno>)</c> on the nodes
<c><anno>Nodes</anno></c>. No response is delivered to the
- calling process. <c>erpc:multicast()</c> returns immediately
+ calling process. <c>multicast()</c> returns immediately
after the cast requests have been sent. Any failures beside
bad arguments are silently ignored.
</p>
- <p><c>erpc:multicast/4</c> fails with an <c>{erpc, badarg}</c>
+ <p><c>multicast/4</c> fails with an <c>{erpc, badarg}</c>
<c>error</c> exception if:</p>
<list>
<item><p><c><anno>Nodes</anno></c> is not a proper list of
@@ -515,9 +628,21 @@ my_multicall(Nodes, Module, Function, Args) ->
</note>
</desc>
</func>
-
+
<func>
<name name="receive_response" arity="1" since="OTP 23.0"/>
+ <fsummary>Receive a call response corresponding to a
+ previously sent call request.</fsummary>
+ <desc>
+ <p>
+ The same as calling
+ <seemfa marker="#receive_response/2"><c>erpc:receive_response(<anno>RequestId</anno>,
+ infinity)</c></seemfa>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
<name name="receive_response" arity="2" since="OTP 23.0"/>
<fsummary>Receive a call response corresponding to a
previously sent call request.</fsummary>
@@ -525,34 +650,41 @@ my_multicall(Nodes, Module, Function, Args) ->
<p>
Receive a response to a <c>call</c> request previously
made by the calling process using
- <seemfa marker="#send_request/4"><c>erpc:send_request/4</c></seemfa>.
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
<c><anno>RequestId</anno></c> should be the value returned from
- the previously made <c>erpc:send_request()</c> call, and
+ the previously made <c>send_request/4</c> call, and
the corresponding response should not already have been received
- and handled to completion by
- <seemfa marker="#check_response/2"><c>erpc:check_response()</c></seemfa>,
- <c>erpc:receive_response()</c>, or
- <seemfa marker="#wait_response/2"><c>erpc:wait_response()</c></seemfa>.
- <c><anno>Timeout</anno></c> is an integer representing
- the timeout in milliseconds or the atom <c>infinity</c>
- which prevents the operation from ever timing out. The <c>call</c>
- operation is completed once the <c>erpc:receive_response()</c> call
- returns or raise an exception.
- </p>
- <p>
- The call <c>erpc:receive_response(<anno>RequestId</anno>)</c> is
- equivalent to the call
- <c>erpc:receive_response(<anno>RequestId</anno>, infinity)</c>.
+ and handled to completion by <c>receive_response()</c>,
+ <seemfa marker="#check_response/2"><c>check_response/4</c></seemfa>,
+ or
+ <seemfa marker="#wait_response/2"><c>wait_response/4</c></seemfa>.
+ </p>
+ <p>
+ <c><anno>Timeout</anno></c> sets an upper time limit on how
+ long to wait for a response. If the operation times out, the request
+ identified by <c><anno>RequestId</anno></c> will be abandoned, then an
+ <c>{erpc, timeout}</c> <c>error</c> exception will be raised. That is,
+ no response corresponding to the request will ever be received after a
+ timeout. If a response is received, the <c>call</c> operation is
+ completed and either the result is returned or an exception is raised. The
+ exceptions that can be raised corresponds to the same exceptions as can
+ be raised by <seemfa marker="#call/5"><c>call/5</c></seemfa>.
+ <c>receive_response/2</c> will fail with an <c>{erpc, badarg}</c>
+ exception if/when an invalid <c><anno>RequestId</anno></c> is detected
+ or if an invalid <c><anno>Timeout</anno></c> is passed.
</p>
+
<p>
A call to the function
<c>my_call(Node, Module, Function, Args, Timeout)</c>
below is equivalent to the call
<seemfa marker="#call/5"><c>erpc:call(Node, Module, Function, Args,
- Timeout)</c></seemfa> if one disregards performance. <c>erpc:call()</c>
- can utilize a message queue optimization which removes the need to scan
- the whole message queue which the combination
- <c>erpc:send_request()/erpc:receive_response()</c> cannot.
+ Timeout)</c></seemfa> if one disregards performance. <c>call()</c>
+ can utilize a selective receive optimization which removes
+ the need to scan the message queue from the beginning in
+ order to find a matching message. The
+ <c>send_request()/receive_response()</c> combination can,
+ however, not utilize this optimization.
</p>
<pre>
my_call(Node, Module, Function, Args, Timeout) ->
@@ -568,15 +700,157 @@ my_call(Node, Module, Function, Args, Timeout) ->
communicates with the calling process, such communication
may, of course, reach the calling process.
</p>
-
- <p>
- <c>erpc:receive_response()</c> will return or raise exceptions the
- same way as <seemfa marker="#call/5"><c>erpc:call/5</c></seemfa>
- does with the exception of <c>{erpc, badarg}</c>. An
- <c>{erpc, badarg}</c> exception will be raised if/when an invalid
- <c><anno>RequestId</anno></c> is detected or if an invalid
- <c><anno>Timeout</anno></c> is passed.
+ </desc>
+ </func>
+
+ <func>
+ <name name="receive_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Receive a call response corresponding to a
+ previously sent call request.</fsummary>
+ <desc>
+ <p>
+ Receive a response to a <c>call</c> request corresponding to a request
+ identifier saved in <c><anno>RequestIdCollection</anno></c>. All
+ request identifiers of <c><anno>RequestIdCollection</anno></c> must
+ correspond to requests that have been made using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa> or
+ <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>,
+ and all requests must have been made by the process calling this
+ function.
</p>
+ <p>
+ <c><anno>Label</anno></c> is the label associated with the request
+ identifier of the request that the response corresponds to.
+ A request identifier is associated with a label when
+ <seemfa marker="#reqids_add/3">adding a request identifier</seemfa>
+ in a <seetype marker="#request_id_collection">request identifier
+ collection</seetype>, or when sending the request using
+ <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>receive_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewRequestIdCollection</anno></c> is a possibly modified
+ request identifier collection. The <c>error</c> exceptions <c>{erpc,
+ badarg}</c> and <c>{erpc, timeout}</c> are not associated with any
+ specific request identifiers, and will hence not be wrapped.
+ </p>
+ <p>
+ If <c><anno>RequestIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned.
+ </p>
+ <p>
+ If the operation times out, all requests identified by
+ <c><anno>RequestIdCollection</anno></c> will be abandoned, then an
+ <c>{erpc, timeout}</c> <c>error</c> exception will be raised. That is,
+ no responses corresponding to any of the request identifiers in
+ <c><anno>RequestIdCollection</anno></c> will ever be received after a
+ timeout. The difference between <c>receive_response/3</c> and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>
+ is that <c>receive_response/3</c> abandons the requests at timeout
+ so that any potential future responses are ignored, while
+ <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>RequestIdCollection</anno></c> in the resulting
+ <c><anno>NewRequestIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewRequestIdCollection</anno></c> will equal
+ <c><anno>RequestIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>receive_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>receive_response/3</c>, it will always block
+ until a timeout determined by <c><anno>Timeout</anno></c> is
+ triggered.
+ </p>
+ <p>
+ Note that a response might have been consumed uppon an <c>{erpc,
+ badarg}</c> exception and if so, will be lost for ever.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_add" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Save a request identifier.</fsummary>
+ <desc>
+ <p>
+ Saves <c><anno>RequestId</anno></c> and associates a
+ <c><anno>Label</anno></c> with the request identifier by adding this
+ information to <c><anno>RequestIdCollection</anno></c> and returning
+ the resulting request identifier collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_new" arity="0" since="OTP @OTP-17784@"/>
+ <fsummary>Create a new empty request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns a new empty request identifier collection. A
+ request identifier collection can be utilized in order
+ the handle multiple outstanding requests.
+ </p>
+ <p>
+ Request identifiers of requests made by
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>
+ can be saved in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ </p>
+ <p>
+ <seemfa marker="#reqids_size/1"><c>reqids_size/1</c></seemfa>
+ can be used to determine the amount of request identifiers in a
+ request identifier collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_size" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>Get size of a request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns the amount of request identifiers saved in
+ <c><anno>RequestIdCollection</anno></c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_to_list" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>Get a list a request identifier/label associations in a collection.</fsummary>
+ <desc>
+ <p>
+ Returns a list of <c>{<anno>RequestId</anno>, <anno>Label</anno>}</c>
+ tuples which corresponds to all request identifiers with their
+ associated labels present in the <c><anno>RequestIdCollection</anno></c>
+ collection.
+ </p>
</desc>
</func>
@@ -586,10 +860,10 @@ my_call(Node, Module, Function, Args, Timeout) ->
<desc>
<p>
The same as calling
- <seemfa marker="#send_request/4"><c>erpc:send_request(<anno>Node</anno>,erlang,apply,[<anno>Fun</anno>,[]])</c></seemfa>.
+ <seemfa marker="#send_request/4"><c>erpc:send_request(<anno>Node</anno>,
+ erlang, apply, [<anno>Fun</anno>, []])</c></seemfa>.
</p>
- <p><c>erpc:send_request/2</c> fails with an <c>{erpc, badarg}</c>
- <c>error</c> exception if:</p>
+ <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p>
<list>
<item><p><c><anno>Node</anno></c> is not an atom.</p></item>
<item><p><c><anno>Fun</anno></c> is not a fun of
@@ -606,34 +880,158 @@ my_call(Node, Module, Function, Args, Timeout) ->
</func>
<func>
- <name name="send_request" arity="4" since="OTP 23.0"/>
+ <name name="send_request" arity="4" clause_i="1" since="OTP 23.0"/>
<fsummary>Send a request to evaluate a function call on a node.</fsummary>
<desc>
<p>
Send an asynchronous <c>call</c> request to the node
- <c><anno>Node</anno></c>. <c>erpc:send_request()</c>
+ <c><anno>Node</anno></c>. <c>send_request/4</c>
returns a request identifier that later is to be passed
- as argument to either
- <seemfa marker="#receive_response/1"><c>erpc:receive_response()</c></seemfa>,
- <seemfa marker="#wait_response/1"><c>erpc:wait_response()</c></seemfa>,
+ to either
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>
+ in order to get the response of the call request. Besides passing
+ the request identifier directly to these functions, it can also be
+ added in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
or,
- <seemfa marker="#check_response/2"><c>erpc:check_response()</c></seemfa>
- in order to get the response of the call request.
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ If you are about to save the request identifier in a request identifier
+ collection, you may want to consider using
+ <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>
+ instead.
+ </p>
+ <p>
+ A call to the function
+ <c>my_call(Node, Module, Function, Args, Timeout)</c>
+ below is equivalent to the call
+ <seemfa marker="#call/5"><c>erpc:call(Node, Module, Function, Args,
+ Timeout)</c></seemfa> if one disregards performance. <c>call()</c>
+ can utilize a selective receive optimization which removes
+ the need to scan the message queue from the beginning in
+ order to find a matching message. The
+ <c>send_request()/receive_response()</c> combination can,
+ however, not utilize this optimization.
</p>
- <p><c>erpc:send_request()</c> fails with an <c>{erpc, badarg}</c>
- <c>error</c> exception if:</p>
+ <pre>
+my_call(Node, Module, Function, Args, Timeout) ->
+ RequestId = erpc:send_request(Node, Module, Function, Args),
+ <seemfa marker="#receive_response/2">erpc:receive_response(RequestId, Timeout)</seemfa>.
+</pre>
+ <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p>
+ <list>
+ <item><p><c><anno>Node</anno></c> is not an atom.</p></item>
+ <item><p><c><anno>Module</anno></c> is not an atom.</p></item>
+ <item><p><c><anno>Function</anno></c> is not an atom.</p></item>
+ <item><p><c><anno>Args</anno></c> is not a list. Note that the
+ list is not verified to be a proper list at the client side.</p></item>
+ </list>
+ <note>
+ <p>
+ You cannot make <em>any</em> assumptions about the
+ process that will perform the <c>apply()</c>. It may
+ be a server, or a freshly spawned process.
+ </p>
+ </note>
+ </desc>
+ </func>
+
+ <func>
+ <name name="send_request" arity="4" clause_i="2" since="OTP @OTP-17784@"/>
+ <fsummary>Send a request to evaluate a function call on a node.</fsummary>
+ <desc>
+ <p>
+ The same as calling
+ <seemfa marker="#send_request/6"><c>erpc:send_request(<anno>Node</anno>,
+ erlang, apply, [<anno>Fun</anno>,[]]), <anno>Label</anno>,
+ <anno>RequestIdCollection</anno>)</c></seemfa>.
+ </p>
+ <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p>
+ <list>
+ <item><p><c><anno>Node</anno></c> is not an atom.</p></item>
+ <item><p><c><anno>Fun</anno></c> is not a fun of zero arity.</p></item>
+ <item><p><c><anno>RequestIdCollection</anno></c> is detected not to
+ be request identifier collection.</p></item>
+ </list>
+ <note>
+ <p>
+ You cannot make <em>any</em> assumptions about the
+ process that will perform the <c>apply()</c>. It may
+ be a server, or a freshly spawned process.
+ </p>
+ </note>
+ </desc>
+ </func>
+
+ <func>
+ <name name="send_request" arity="6" since="OTP @OTP-17784@"/>
+ <fsummary>Send a request to evaluate a function call on a node.</fsummary>
+ <desc>
+ <p>
+ Send an asynchronous <c>call</c> request to the node
+ <c><anno>Node</anno></c>. The <c><anno>Label</anno></c> will be
+ associated with the request identifier of the operation and
+ added to the returned request identifier collection
+ <c><anno>NewRequestIdCollection</anno></c>. The collection can
+ later be used in order to get one response corresponding to a
+ request in the collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ </p>
+
+ <p>
+ The same as calling
+ <seemfa marker="#reqids_add/3"><c>erpc:reqids_add</c></seemfa>(<seemfa
+ marker="#send_request/4"><c>erpc:send_request</c></seemfa><c>(<anno>Node</anno>,
+ <anno>Module</anno>, <anno>Function</anno>, <anno>Args</anno>),
+ <anno>Label</anno>, <anno>RequestIdCollection</anno>)</c>, but
+ calling <c>send_request/6</c> is slightly more efficient.
+ </p>
+
+ <p>Fails with an <c>{erpc, badarg}</c> <c>error</c> exception if:</p>
<list>
<item><p><c><anno>Node</anno></c> is not an atom.</p></item>
<item><p><c><anno>Module</anno></c> is not an atom.</p></item>
<item><p><c><anno>Function</anno></c> is not an atom.</p></item>
<item><p><c><anno>Args</anno></c> is not a list. Note that the
list is not verified to be a proper list at the client side.</p></item>
+ <item><p><c><anno>RequestIdCollection</anno></c> is detected not to
+ be request identifier collection.</p></item>
</list>
+ <note>
+ <p>
+ You cannot make <em>any</em> assumptions about the
+ process that will perform the <c>apply()</c>. It may
+ be a server, or a freshly spawned process.
+ </p>
+ </note>
+ </desc>
+ </func>
+
+ <func>
+ <name name="wait_response" arity="1" clause_i="1" since="OTP 23.0"/>
+ <fsummary>Poll for a call response corresponding to a previously
+ sent call request.</fsummary>
+ <desc>
+ <p>
+ The same as calling
+ <seemfa marker="#wait_response/2"><c>erpc:wait_response(<anno>RequestId</anno>,
+ 0)</c></seemfa>. That is, poll for a response message to a <c>call</c>
+ request previously made by the calling process.
+ </p>
</desc>
</func>
<func>
- <name name="wait_response" arity="1" since="OTP 23.0"/>
<name name="wait_response" arity="2" since="OTP 23.0"/>
<fsummary>Wait or poll for a call response corresponding to a previously
sent call request.</fsummary>
@@ -641,40 +1039,30 @@ my_call(Node, Module, Function, Args, Timeout) ->
<p>
Wait or poll for a response message to a <c>call</c> request
previously made by the calling process using
- <seemfa marker="#send_request/4"><c>erpc:send_request/4</c></seemfa>.
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
<c><anno>RequestId</anno></c> should be the value returned from
- the previously made <c>erpc:send_request()</c> call, and the
+ the previously made <c>send_request()</c> call, and the
corresponding response should not already have been received and handled
to completion by
- <seemfa marker="#check_response/2"><c>erpc:check_response()</c></seemfa>,
- <seemfa marker="#receive_response/2"><c>erpc:receive_response()</c></seemfa>,
- or <c>erpc:wait_response()</c>. <c><anno>WaitTime</anno></c> equals the
- time to wait in milliseconds (or the atom <c>infinity</c>) during the wait.
- <c><anno>WaitTime</anno></c> is an integer representing time to wait
- in milliseconds or the atom <c>infinity</c> which will cause
- <c>wait_response/2</c> to wait for a response until it appears
- regardless of how long time that is.
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>,
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ or <c>wait_response()</c>.
</p>
<p>
- The call <c>erpc:wait_response(<anno>RequestId</anno>)</c> is equivalent
- to the call <c>erpc:wait_response(<anno>RequestId</anno>, 0)</c>. That is,
- poll for a response message to a <c>call</c> request previously made by
- the calling process.
- </p>
- <p>
- If no response is received before <c><anno>WaitTime</anno></c> milliseconds,
- the atom <c>no_response</c> is returned. It is valid to continue waiting
- for a response as many times as needed up until a response has
- been received and completed by <c>erpc:check_response()</c>,
- <c>erpc:receive_response()</c>, or <c>erpc:wait_response()</c>. If a
- response is received, the <c>call</c> operation is completed and either
- the result is returned as <c>{response, Result}</c> where <c>Result</c>
- corresponds to the value returned from the applied function or an
- exception is raised. The exceptions that can be raised corresponds to the
- same exceptions as can be raised by
- <seemfa marker="#call/4"><c>erpc:call/4</c></seemfa>.
+ <c><anno>WaitTime</anno></c> sets an upper time limit on how long to wait
+ for a response. If no response is received before the
+ <c><anno>WaitTime</anno></c> timeout has triggered, the atom
+ <c>no_response</c> is returned. It is valid to continue waiting for a
+ response as many times as needed up until a response has been received
+ and completed by <c>check_response()</c>, <c>receive_response()</c>, or
+ <c>wait_response()</c>. If a response is received, the <c>call</c>
+ operation is completed and either the result is returned as
+ <c>{response, Result}</c> where <c>Result</c> corresponds to the value
+ returned from the applied function or an exception is raised. The
+ exceptions that can be raised corresponds to the same exceptions as can
+ be raised by <seemfa marker="#call/4"><c>call/4</c></seemfa>.
That is, no <c>{erpc, timeout}</c> <c>error</c> exception can be raised.
- <c>erpc:wait_response()</c> will fail with an <c>{erpc, badarg}</c>
+ <c>wait_response/2</c> will fail with an <c>{erpc, badarg}</c>
exception if/when an invalid <c><anno>RequestId</anno></c> is detected
or if an invalid <c><anno>WaitTime</anno></c> is passed.
</p>
@@ -690,6 +1078,87 @@ my_call(Node, Module, Function, Args, Timeout) ->
</desc>
</func>
+ <func>
+ <name name="wait_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Wait or poll for a call response corresponding to a previously
+ sent call request.</fsummary>
+ <desc>
+ <p>
+ Wait or poll for a response to a <c>call</c> request corresponding
+ to a request identifier saved in <c><anno>RequestIdCollection</anno></c>. All
+ request identifiers of <c><anno>RequestIdCollection</anno></c> must
+ correspond to requests that have been made using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa> or
+ <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>,
+ and all requests must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ <c><anno>Label</anno></c> is the label associated with the request
+ identifier of the request that the response corresponds to.
+ A request identifier is associated with a label when
+ <seemfa marker="#reqids_add/3">adding a request identifier</seemfa>
+ in a <seetype marker="#request_id_collection">request identifier
+ collection</seetype>, or when sending the request using
+ <seemfa marker="#send_request/6"><c>send_request/6</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>wait_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewRequestIdCollection</anno></c> is a possibly modified
+ request identifier collection. The <c>error</c> exception <c>{erpc,
+ badarg}</c> is not associated with any specific request identifier,
+ and will hence not be wrapped.
+ </p>
+ <p>
+ If <c><anno>RequestIdCollection</anno></c> is empty, <c>no_request</c>
+ will be returned. If no response is received before the
+ <c><anno>WaitTime</anno></c> timeout has triggered, the atom
+ <c>no_response</c> is returned. It is valid to continue waiting for a
+ response as many times as needed up until a response has been received
+ and completed by <c>check_response()</c>, <c>receive_response()</c>,
+ or <c>wait_response()</c>. The difference between
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>
+ and <c>wait_response/3</c> is that <c>receive_response/3</c>
+ abandons requests at timeout so that any potential future
+ responses are ignored, while <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>RequestIdCollection</anno></c> in the resulting
+ <c><anno>NewRequestIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewRequestIdCollection</anno></c> will equal
+ <c><anno>RequestIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>wait_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>wait_response/3</c>, it will always block
+ until a timeout determined by <c><anno>WaitTime</anno></c> is
+ triggered and then return <c>no_response</c>.
+ </p>
+ <p>
+ Note that a response might have been consumed uppon an <c>{erpc,
+ badarg}</c> exception and if so, will be lost for ever.
+ </p>
+ </desc>
+ </func>
+
</funcs>
</erlref>
diff --git a/lib/kernel/doc/src/gen_sctp.xml b/lib/kernel/doc/src/gen_sctp.xml
index 0e980e9ec8..f8b5530069 100644
--- a/lib/kernel/doc/src/gen_sctp.xml
+++ b/lib/kernel/doc/src/gen_sctp.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2007</year><year>2021</year>
+ <year>2007</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -305,6 +305,53 @@ connect(Socket, Ip, Port>,
</func>
<func>
+ <name name="connectx_init" arity="3" since="OTP @OTP-17951@"/>
+ <fsummary>Same as <c>connectx_init(Socket, SockAddrs, Opts, infinity)</c>..</fsummary>
+ <desc>
+ <p>Similar to
+ <seemfa marker="#connectx_init/5"><c>connectx_init/5</c></seemfa>
+ except using socket addresses, and not having a <c>Timeout</c>.
+ Since the addresses do not need lookup and the connect
+ is non-blocking this call returns immediately.</p>
+ <p>The value of each socket address <c>port</c>
+ must be the same or zero. At least one socket address
+ must have a non-zero <c>port</c></p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="connectx_init" arity="4" since="OTP @OTP-17951@"/>
+ <fsummary>Same as <c>connectx_init(Socket, Addrs, Port, Opts, infinity)</c>..</fsummary>
+ <desc>
+ <p>Same as <c>connectx_init(<anno>Socket</anno>, <anno>Addrs</anno>,
+ <anno>Port</anno>, <anno>Opts</anno>, infinity)</c>.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="connectx_init" arity="5" since="OTP @OTP-17951@"/>
+ <fsummary>Initiate a new association for socket <c>Socket</c>, with a
+ peer (SCTP server socket).</fsummary>
+ <desc>
+ <p>Initiates a new association for socket <c><anno>Socket</anno></c>,
+ with the peer (SCTP server socket) specified by
+ <c><anno>Addrs</anno></c> and <c><anno>Port</anno></c>.</p>
+ <p>This API is similar to <c>connect_init/*</c> except the
+ underlying OS <c>sctp_connectx(3)</c> system call is used.</p>
+ <p>If successful, the association ID is returned which will be received
+ in a subsequent
+ <seeerl marker="#record-sctp_assoc_change"><c>#sctp_assoc_change{}</c></seeerl>
+ event.</p>
+ <p>The parameters are as described in
+ <seemfa marker="#connect_init/5"><c>connect_init/5</c></seemfa></p>
+ <p>NOTE: This API allows the OS to use all <anno>Addrs</anno>
+ when establishing an association, but does not guarantee it will.
+ Therefore, if the connection fails the user may want to rotate
+ the order of addresses for a subsequent call.</p>
+ </desc>
+ </func>
+
+ <func>
<name name="controlling_process" arity="2" since=""/>
<fsummary>Assign a new controlling process pid to the socket.</fsummary>
<desc>
@@ -877,7 +924,7 @@ connect(Socket, Ip, Port>,
<url href="http://www.rfc-archive.org/getrfc.php?rfc=2960">RFC 2960</url>
and
<url href="http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13">Sockets
- API Extenstions for SCTP</url>.</p>
+ API Extensions for SCTP</url>.</p>
</item>
<tag><c>{sctp_peer_addr_params, #sctp_paddrparams{}}</c></tag>
<item>
@@ -1255,4 +1302,3 @@ client_loop(S, Peer1, Port1, AssocId1, Peer2, Port2, AssocId2) -&gt;
API Extensions for SCTP</url></p>
</section>
</erlref>
-
diff --git a/lib/kernel/doc/src/gen_tcp.xml b/lib/kernel/doc/src/gen_tcp.xml
index b63980eb61..e455cfdaf5 100644
--- a/lib/kernel/doc/src/gen_tcp.xml
+++ b/lib/kernel/doc/src/gen_tcp.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1997</year><year>2021</year>
+ <year>1997</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -126,7 +126,7 @@ do_recv(Sock, Bs) ->
implementation.
A send operation will detect a remote close and immediately
return this to the caller, but do nothing else.
- A reader will therefor be able to extract any data from the OS buffers.
+ A reader will therefore be able to extract any data from the OS buffers.
If the socket is set to <c>active</c> to not <c>false</c>, the data
will be received as expected (<c>{tcp, ...}</c> and then a closed
message (<c>{tcp_closed, ...}</c> will be received (not an error). </p>
@@ -153,7 +153,7 @@ do_recv(Sock, Bs) ->
<em>will fail</em> with <c>{error, enotsup}</c>. </p>
<p>This does not actually work for <c>inet_backend = inet</c> either,
but in that case the error is simply <em>ignored</em>,
- which is a <em>bad</em> idea. We have choosen to <em>not</em>
+ which is a <em>bad</em> idea. We have chosen to <em>not</em>
ignore this error for <c>inet_backend = socket</c>. </p>
</item>
@@ -195,7 +195,7 @@ do_recv(Sock, Bs) ->
which is since long (2003) obsoleted by RFC 3542
that <em>explicitly</em> removes this possibility to get
packet information from a stream socket.
- For comparision: it has existed in FreeBSD but is now removed,
+ For comparison: it has existed in FreeBSD but is now removed,
at least since FreeBSD 10.
</p>
</note>
@@ -582,7 +582,7 @@ do_recv(Sock, Bs) ->
expires (the function can hang even when using 'inet' backend
if the internal buffers are full). </p>
<p>If this happens when using <c>packet =/= raw</c>, we have a partial
- package written. A new package therefor <em>must not</em> be written
+ package written. A new package therefore <em>must not</em> be written
at this point, as there is no way for the peer to distinguish this
from the data portion of the current package. Instead, set package
to raw, send the rest data (as raw data) and then set package to
@@ -740,4 +740,3 @@ loop(Sock) ->
comes in handy.</p>
</section>
</erlref>
-
diff --git a/lib/kernel/doc/src/global.xml b/lib/kernel/doc/src/global.xml
index 5c96850511..183dd46abb 100644
--- a/lib/kernel/doc/src/global.xml
+++ b/lib/kernel/doc/src/global.xml
@@ -38,36 +38,32 @@
<item>Maintenance of the fully connected network</item>
</list>
<marker id="prevent_overlapping_partitions"/>
+ <p>
+ As of OTP 25, <c>global</c> will by default prevent overlapping
+ partitions due to network issues by actively disconnecting from
+ nodes that reports that they have lost connections to other
+ nodes. This will cause fully connected partitions to form instead
+ of leaving the network in a state with overlapping partitions.
+ </p>
<warning>
<p>
- By default <c>global</c> does <i>not</i> take any actions to restore
- a fully connected network when connections are lost due to network
- issues. This is problematic for all applications expecting a fully
- connected network to be provided, such as for example <c>mnesia</c>,
- but also for <c>global</c> itself. A network of overlapping partitions
- might cause the internal state of <c>global</c> to become inconsistent.
- Such an inconsistency can remain even after such partitions have been
- brought together to form a fully connected network again. The effect
- on other applications that expects that a fully connected network is
- maintained may vary, but they might misbehave in very subtle hard to
- detect ways during such a partitioning.
- </p>
- <p>
- In order to prevent such issues, we have introduced a <i>prevent
- overlapping partitions</i> fix which can be enabled using the
+ Prevention of overlapping partitions can be disabled using the
<seeapp marker="kernel_app#prevent_overlapping_partitions">
- <c>prevent_overlapping_partitions</c></seeapp> <c>kernel(6)</c>
- parameter. When this fix has been enabled, <c>global</c> will actively
- disconnect from nodes that reports that they have lost connections to
- other nodes. This will cause fully connected partitions to form
- instead of leaving the network in a state with overlapping partitions.
- Note that this fix <i>has</i> to be enabled on <i>all</i> nodes in the
- network in order to work properly. Since this quite substantially
- changes the behavior, this fix is currently disabled by default. Since
- you might get hard to detect issues without this fix you are, however,
- <i>strongly</i> advised to enable this fix in order to avoid issues
- such as the ones described above. As of OTP 25 this fix will become
- enabled by default.
+ <c>prevent_overlapping_partitions</c></seeapp>
+ <c>kernel(6)</c> parameter, making <c>global</c>
+ behave like it used to do. This is, however, problematic for all
+ applications expecting a fully connected network to be provided,
+ such as for example <c>mnesia</c>, but also for <c>global</c> itself.
+ A network of overlapping partitions might cause the internal state of
+ <c>global</c> to become inconsistent. Such an inconsistency can
+ remain even after such partitions have been brought together to form
+ a fully connected network again. The effect on other applications
+ that expects that a fully connected network is maintained may vary,
+ but they might misbehave in very subtle hard to detect ways during
+ such a partitioning. Since you might get hard to detect issues without
+ this fix, you are <i>strongly</i> advised <i>not</i> to disable this
+ fix. Also note that this fix <i>has</i> to be enabled on <i>all</i>
+ nodes in the network in order to work properly.
</p>
</warning>
<p>These services are controlled through the process
diff --git a/lib/kernel/doc/src/heart.xml b/lib/kernel/doc/src/heart.xml
index e1fb1323a5..6f956924b3 100644
--- a/lib/kernel/doc/src/heart.xml
+++ b/lib/kernel/doc/src/heart.xml
@@ -98,7 +98,7 @@
</item>
<tag><c><![CDATA[ERL_CRASH_DUMP_SECONDS=-1]]></c></tag>
<item><p>Setting the environment variable to a negative value does not
- reboot the runtime system until the crash dump file is completly
+ reboot the runtime system until the crash dump file is completely
written.</p>
</item>
<tag><c><![CDATA[ERL_CRASH_DUMP_SECONDS=S]]></c></tag>
diff --git a/lib/kernel/doc/src/inet.xml b/lib/kernel/doc/src/inet.xml
index 8e7fe2f7bf..145a5a9751 100644
--- a/lib/kernel/doc/src/inet.xml
+++ b/lib/kernel/doc/src/inet.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1997</year><year>2021</year>
+ <year>1997</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -588,7 +588,7 @@ fe80::204:acff:fe17:bf38
correspond to the second, third, and fourth/fifth parameters to the
<c>getsockopt</c> call in the C socket API. The value stored
in the buffer is returned as a binary <c>ValueBin</c>,
- where all values are coded in the native endianess.</p>
+ where all values are coded in the native endianness.</p>
<p>Asking for and inspecting raw socket options require low-level
information about the current operating system and TCP stack.</p>
<p><em>Example:</em></p>
@@ -734,10 +734,10 @@ get_tcpi_sacked(Sock) ->
<func>
<name name="info" arity="1" since="OTP 24.0"/>
- <fsummary>Retreive miscellaneous information about a socket</fsummary>
+ <fsummary>Retrieve miscellaneous information about a socket</fsummary>
<desc>
<p>
- Produces a term containg miscellaneous information about a socket.
+ Produces a term containing miscellaneous information about a socket.
</p>
</desc>
</func>
@@ -783,6 +783,36 @@ get_tcpi_sacked(Sock) ->
</func>
<func>
+ <name name="is_ip_address" arity="1" since="OTP @OTP-17923@"/>
+ <fsummary>Tests if <c>IPAddress</c> is an IPv4 or IPv6 address tuple.</fsummary>
+ <desc>
+ <p>Tests if <c>IPAddress</c> is an
+ <seetype marker="#ip_address"><c>ip_address()</c></seetype>
+ and returns <c>true</c> if so, otherwise <c>false</c>.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="is_ipv4_address" arity="1" since="OTP @OTP-17923@"/>
+ <fsummary>Tests if <c>IPAddress</c> is an IPv4 address tuple.</fsummary>
+ <desc>
+ <p>Tests if <c>IPAddress</c> is an
+ <seetype marker="#ip4_address"><c>ip4_address()</c></seetype>
+ and returns <c>true</c> if so, otherwise <c>false</c>.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="is_ipv6_address" arity="1" since="OTP @OTP-17923@"/>
+ <fsummary>Tests if <c>IPAddress</c> is an IPv6 address tuple.</fsummary>
+ <desc>
+ <p>Tests if <c>IPAddress</c> is an
+ <seetype marker="#ip6_address"><c>ip6_address()</c></seetype>
+ and returns <c>true</c> if so, otherwise <c>false</c>.</p>
+ </desc>
+ </func>
+
+ <func>
<name name="ntoa" arity="1" since="OTP R16B02"/>
<fsummary>Convert IPv6/IPV4 address to ASCII.</fsummary>
<desc>
@@ -1621,7 +1651,7 @@ setcap cap_sys_admin,cap_sys_ptrace,cap_dac_read_search+epi beam.smp</code>
and the option value specified as a binary. This
corresponds to the second, third, and fourth arguments to the
<c>setsockopt</c> call in the C socket API. The option value
- must be coded in the native endianess of the platform and,
+ must be coded in the native endianness of the platform and,
if a structure is required, must follow the structure
alignment conventions on the specific platform.</p>
<p>Using raw socket options requires detailed knowledge about
diff --git a/lib/kernel/doc/src/inet_res.xml b/lib/kernel/doc/src/inet_res.xml
index 0d654bbc0e..39355613ae 100644
--- a/lib/kernel/doc/src/inet_res.xml
+++ b/lib/kernel/doc/src/inet_res.xml
@@ -76,7 +76,7 @@
<p>But before all name servers are tried again, there is a
(user configurable) timeout, <c>servfail_retry_timeout</c>.
The point of this is to prevent the new query to be handled by
- a server's servfail cache (a client that is to eager will
+ a server's servfail cache (a client that is too eager will
actually only get what is in the servfail cache).
If there is too little time left
of the resolver call's timeout to do a retry,
@@ -125,7 +125,7 @@
<datatype>
<name name="dns_msg"/>
<desc>
- <p>This is the start of a hiearchy of opaque data structures
+ <p>This is the start of a hierarchy of opaque data structures
that can be examined with access functions in <c>inet_dns</c>, which
return lists of <c>{Field,Value}</c> tuples. The arity 2 functions
only return the value for a specified field.</p>
diff --git a/lib/kernel/doc/src/kernel_app.xml b/lib/kernel/doc/src/kernel_app.xml
index fb1d11fad4..4004956588 100644
--- a/lib/kernel/doc/src/kernel_app.xml
+++ b/lib/kernel/doc/src/kernel_app.xml
@@ -244,9 +244,8 @@
to be forwarded to the handlers.</p>
</note>
</item>
- <tag><c>global_groups = [GroupTuple]</c></tag>
+ <tag><marker id="global_groups"/><c>global_groups = [GroupTuple]</c></tag>
<item>
- <marker id="global_groups"></marker>
<p>Defines global groups, see
<seeerl marker="global_group"><c>global_group(3)</c></seeerl>.
In this parameter:</p>
@@ -257,7 +256,7 @@
<item><p><c>Node = node()</c></p></item>
</list>
</item>
- <tag><c>inet_default_connect_options = [{Opt, Val}]</c></tag>
+ <tag><marker id="inet_default_connect_options"/><c>inet_default_connect_options = [{Opt, Val}]</c></tag>
<item>
<p>Specifies default options for <c>connect</c> sockets,
see <seeerl marker="inet"><c>inet(3)</c></seeerl>.</p>
@@ -267,28 +266,26 @@
<p>Specifies default options for <c>listen</c> (and
<c>accept</c>) sockets, see <seeerl marker="inet"><c>inet(3)</c></seeerl>.</p>
</item>
- <tag><c>{inet_dist_use_interface, ip_address()}</c></tag>
+ <tag><marker id="inet_dist_use_interface"/><c>inet_dist_use_interface = ip_address()</c></tag>
<item>
<p>If the host of an Erlang node has many network interfaces,
this parameter specifies which one to listen on. For the type definition
of <c>ip_address()</c>,
see <seeerl marker="inet"><c>inet(3)</c></seeerl>.</p>
</item>
- <tag><c>{inet_dist_listen_min, First}</c> and <c>{inet_dist_listen_max, Last}</c></tag>
+ <tag><marker id="inet_dist_listen"/><c>inet_dist_listen_min = First</c><br/><c>inet_dist_listen_max = Last</c></tag>
<item>
<p>Defines the <c>First..Last</c> port range for the listener
socket of a distributed Erlang node.</p>
</item>
- <tag><c>{inet_dist_listen_options, Opts}</c></tag>
+ <tag><marker id="inet_dist_listen_options"/><c>inet_dist_listen_options = Opts</c></tag>
<item>
- <marker id="inet_dist_listen_options"></marker>
<p>Defines a list of extra socket options to be used when opening the
listening socket for a distributed Erlang node.
See <seemfa marker="gen_tcp#listen/2"><c>gen_tcp:listen/2</c></seemfa>.</p>
</item>
- <tag><c>{inet_dist_connect_options, Opts}</c></tag>
+ <tag><marker id="inet_dist_connect_options"/><c>inet_dist_connect_options = Opts</c></tag>
<item>
- <marker id="inet_dist_connect_options"></marker>
<p>Defines a list of extra socket options to be used when connecting to
other distributed Erlang nodes.
See <seemfa marker="gen_tcp#connect/4"><c>gen_tcp:connect/4</c></seemfa>.</p>
@@ -319,6 +316,35 @@
setup time, but rather each individual network operation during
the connection setup and handshake.</p>
</item>
+ <tag><marker id="net_ticker_spawn_options"/><c>net_ticker_spawn_options = Opts</c></tag>
+ <item>
+ <p>
+ Defines a list of extra spawn options for net ticker processes. There exist
+ one such process for each connection to another node. A net ticker process is
+ responsible for supervising the connection it is associated with. These
+ processes also execute the distribution handshake protocol when setting up
+ connections. When there is a large number of distribution connections,
+ setting up garbage collection options can be helpful to reduce memory usage.
+ Default is <c>[link, {priority, max}]</c>, and these two options cannot be
+ changed. The <c>monitor</c> and <c>{monitor, MonitorOpts}</c> options are
+ not allowed and will be dropped if present. See the documentation of the
+ <seemfa marker="erts:erlang#spawn_opt/4"><c>erlang:spawn_opt/4</c></seemfa>
+ BIF for information about valid options. If the <c>Opts</c> list is not
+ a proper list, or containing invalid options the setup of connections
+ will fail.
+ </p>
+ <p>
+ Note that the behavior described above is only true if the distribution
+ carrier protocol used is implemented as described in
+ <seeguide marker="erts:alt_dist#distribution_module">ERTS
+ User's Guide ➜ How to implement an Alternative Carrier
+ for the Erlang Distribution ➜ Distribution Module</seeguide> without
+ further alterations. The implementer of the distribution carrier protocol
+ used, may have chosen to ignore the <c>net_ticker_spawn_options</c> parameter
+ or altered its behavior. Currently all distribution modules shipped with OTP
+ do, however, behave as described above.
+ </p>
+ </item>
<tag><marker id="net_tickintensity"/><c>net_tickintensity = NetTickIntensity</c></tag>
<item>
<p><i>Net tick intensity</i> specifies how many ticks to send during a
@@ -389,11 +415,11 @@ MaxT = NetTickTime + NetTickTime / NetTickIntensity</code>
<p>
If enabled (<c>true</c>), <c>global</c> will actively prevent
overlapping partitions from forming when connections are lost
- between nodes. This fix is, however, currently disabled by
- default. See the
+ between nodes. This fix is enabled by default. If you are about
+ to disable this fix, make sure to read the
<seeerl marker="kernel:global#prevent_overlapping_partitions">
- <c>global(3)</c></seeerl> documentation for more
- information.
+ <c>global(3)</c></seeerl> documentation about this fix for
+ more important information about this.
</p>
</item>
<tag><c>shutdown_timeout = integer() | infinity</c></tag>
diff --git a/lib/kernel/doc/src/logger.xml b/lib/kernel/doc/src/logger.xml
index 45ee802cfc..647c970b10 100644
--- a/lib/kernel/doc/src/logger.xml
+++ b/lib/kernel/doc/src/logger.xml
@@ -480,7 +480,7 @@ logger:log(warning, #{ what => roof, cause => Cause }).
<p>The message and metadata can either be given directly in the arguments,
or returned from a fun. Passing a fun instead of the message/metadata directly is
useful in scenarios when the message/metadata is very expensive to compute.
- This is because the fun is only evaluted when the message/metadata is
+ This is because the fun is only evaluated when the message/metadata is
actually needed, which may be not at all if the log event is not
to be logged. Examples:</p>
<code>
diff --git a/lib/kernel/doc/src/logger_chapter.xml b/lib/kernel/doc/src/logger_chapter.xml
index 45ee5eefad..df2edff724 100644
--- a/lib/kernel/doc/src/logger_chapter.xml
+++ b/lib/kernel/doc/src/logger_chapter.xml
@@ -218,7 +218,7 @@
<pre>fun((<seetype marker="logger#report"><c>logger:report()</c></seetype>) -> {<seetype marker="stdlib:io#format"><c>io:format()</c></seetype>,[term()]})</pre>
<p>If it takes two arguments, the first is the report, and the
second is a map containing extra data that allows direct
- coversion to a string:</p>
+ conversion to a string:</p>
<pre>fun((<seetype marker="logger#report"><c>logger:report()</c></seetype>,<seetype marker="logger#report_cb_config"><c>logger:report_cb_config()</c></seetype>) -> <seetype marker="stdlib:unicode#chardata"><c>unicode:chardata()</c></seetype>)
</pre>
<p>The fun must obey the <c>depth</c> and <c>chars_limit</c>
@@ -925,7 +925,7 @@ logger:debug(#{got => connection_request, id => Id, state => State},
and progress reports.</p>
<p>Prior to Erlang/OTP 21.0, these reports were only logged
when the SASL application was running, and they were printed
- trough SASL's own event handlers <c>sasl_report_tty_h</c>
+ through SASL's own event handlers <c>sasl_report_tty_h</c>
and <c>sasl_report_file_h</c>.</p>
<p>The destination of these log events was configured by
<seeapp marker="sasl:sasl_app#deprecated_error_logger_config">SASL
diff --git a/lib/kernel/doc/src/logger_std_h.xml b/lib/kernel/doc/src/logger_std_h.xml
index d0d6268e34..5d839b2b88 100644
--- a/lib/kernel/doc/src/logger_std_h.xml
+++ b/lib/kernel/doc/src/logger_std_h.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2017</year><year>2020</year>
+ <year>2017</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -149,7 +149,7 @@
information prior to writing, as long as no more
than <c>N</c> milliseconds have passed since it was last
read.</p>
- <p>Notice that the risk of loosing log events grows when
+ <p>Notice that the risk of losing log events grows when
the <c>file_check</c> value grows.</p>
<p>Defaults to 0.</p>
</item>
diff --git a/lib/kernel/doc/src/net.xml b/lib/kernel/doc/src/net.xml
index d63df8e8ca..dba8e7602d 100644
--- a/lib/kernel/doc/src/net.xml
+++ b/lib/kernel/doc/src/net.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2018</year><year>2020</year>
+ <year>2018</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -132,7 +132,7 @@
<func>
<name name="getnameinfo" arity="1" since="OTP 22.0"/>
<name name="getnameinfo" arity="2" since="OTP 22.0"/>
- <fsummary>Address-to-name transaltion.</fsummary>
+ <fsummary>Address-to-name translation.</fsummary>
<desc>
<p>Address-to-name translation in a protocol-independant manner.</p>
<p>This function is the inverse of
@@ -146,7 +146,7 @@
<name name="getaddrinfo" arity="2" clause_i="1" since="OTP 22.0"/>
<name name="getaddrinfo" arity="2" clause_i="2" since="OTP 22.0"/>
<name name="getaddrinfo" arity="2" clause_i="3" since="OTP 22.0"/>
- <fsummary>Network address and service transation.</fsummary>
+ <fsummary>Network address and service transaction.</fsummary>
<desc>
<p>Network address and service translation.</p>
<p>This function is the inverse of
@@ -169,7 +169,7 @@
possibly filtered according to <c>Filter</c>. </p>
<p>By default, a filter with the content:
<c>#{family => default, flags => any}</c> is used.
- This will return all interfaces with adresses in the
+ This will return all interfaces with addresses in the
<c>inet</c> and <c>inet6</c> families. </p>
</desc>
</func>
diff --git a/lib/kernel/doc/src/net_kernel.xml b/lib/kernel/doc/src/net_kernel.xml
index 977fb35caf..6ffe063e91 100644
--- a/lib/kernel/doc/src/net_kernel.xml
+++ b/lib/kernel/doc/src/net_kernel.xml
@@ -340,7 +340,7 @@ $ <input>erl -sname foobar</input></pre>
or <c>{error, noconnection}</c> if <c><anno>Node</anno></c> is not
a connected node or <c>new</c>.</p>
<p>If <c><anno>Node</anno></c> is <c>new</c> the <c><anno>Options</anno></c>
- will then also be added to kernel configration parameters
+ will then also be added to kernel configuration parameters
<seeapp marker="kernel:kernel_app#inet_dist_listen_options">inet_dist_listen_options</seeapp>
and
<seeapp marker="kernel:kernel_app#inet_dist_connect_options">inet_dist_connect_options</seeapp>.</p>
@@ -463,4 +463,3 @@ $ <input>erl -sname foobar</input></pre>
</func>
</funcs>
</erlref>
-
diff --git a/lib/kernel/doc/src/notes.xml b/lib/kernel/doc/src/notes.xml
index 9e0897ec7f..dfce446818 100644
--- a/lib/kernel/doc/src/notes.xml
+++ b/lib/kernel/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2021</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -802,7 +802,7 @@
order to prevent late responses. The <c>gen_statem</c>
behavior still use a proxy process in the distributed
case, since it has always prevented late replies and
- aliases wont work against pre OTP 24 nodes. The proxy
+ aliases won't work against pre OTP 24 nodes. The proxy
process can be removed in OTP 26.</p>
<p>
The alias feature also made it possible to introduce new
@@ -1269,7 +1269,7 @@
</item>
<item>
<p>When running Xref in the <c>modules</c> mode, the
- Debugger application would show up as a depency for the
+ Debugger application would show up as a dependency for the
Kernel applications.</p>
<p>
Own Id: OTP-17223 Aux Id: GH-4546, PR-4554 </p>
@@ -1918,7 +1918,7 @@
<list>
<item>
<p>When running Xref in the <c>modules</c> mode, the
- Debugger application would show up as a depency for the
+ Debugger application would show up as a dependency for the
Kernel applications.</p>
<p>
Own Id: OTP-17223 Aux Id: GH-4546, PR-4554 </p>
@@ -2481,7 +2481,7 @@
The default value is 0, which means that this check is
done prior to each write operation. Setting a higher
number may improve performance, but adds the risk of
- loosing log events.</p>
+ losing log events.</p>
<p>
Own Id: OTP-15663</p>
</item>
@@ -4401,11 +4401,11 @@
Characteristics impact: A call to the
<c>garbage_collect/1</c> BIF or the
<c>check_process_code/2</c> BIF will normally take longer
- time to complete while the system as a whole wont be as
+ time to complete while the system as a whole won't be as
much negatively effected by the operation as before. A
call to <c>code:purge/1</c> and <c>code:soft_purge/1</c>
may complete faster or slower depending on the state of
- the system while the system as a whole wont be as much
+ the system while the system as a whole won't be as much
negatively effected by the operation as before.</p>
<p>
Own Id: OTP-11388 Aux Id: OTP-11535, OTP-11648 </p>
@@ -4766,7 +4766,7 @@
<item>
<p>
Change printout of application crash message on startup
- to formated strings (Thanks to Serge Aleynikov)</p>
+ to formatted strings (Thanks to Serge Aleynikov)</p>
<p>
Own Id: OTP-10620</p>
</item>
@@ -5548,7 +5548,7 @@
</item>
<item>
<p>
- - Add spec for function that does not return - Strenghen
+ - Add spec for function that does not return - Strengthen
spec - Introduce types to avoid duplication in specs -
Add specs for functions that do not return - Add specs
for behaviour callbacks - Simplify two specs</p>
@@ -5928,7 +5928,7 @@
app-vsn/ebin/mod.beam file, the file info for the app-vsn
and app-vsn/ebin directories are faked using the file
info from the archive file as origin. The virtual
- direcories can also be listed. For short, the top
+ directories can also be listed. For short, the top
directories are virtual if they does not exist.</p>
<p>
Own Id: OTP-8387</p>
diff --git a/lib/kernel/doc/src/os.xml b/lib/kernel/doc/src/os.xml
index 02f36a25ff..9ac0583d0a 100644
--- a/lib/kernel/doc/src/os.xml
+++ b/lib/kernel/doc/src/os.xml
@@ -345,7 +345,7 @@ calendar:now_to_universal_time(TS),
<pre>
1> <input>io:format("~s~n",[print_time:format_utc_timestamp()]).</input>
29 Apr 2009 9:55:30.051711</pre>
- <p>OS system time can also be retreived by
+ <p>OS system time can also be retrieved by
<seemfa marker="#system_time/0"><c>system_time/0</c></seemfa> and
<seemfa marker="#system_time/1"><c>system_time/1</c></seemfa>.</p>
</desc>
diff --git a/lib/kernel/doc/src/rpc.xml b/lib/kernel/doc/src/rpc.xml
index a3e96e99f4..6b471d0d42 100644
--- a/lib/kernel/doc/src/rpc.xml
+++ b/lib/kernel/doc/src/rpc.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2020</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -43,14 +43,14 @@
This cannot be changed due to compatibility reasons. As of OTP 23,
a new module <seeerl marker="erpc"><c>erpc</c></seeerl> was
introduced in order to provide an API that makes it possible
- to distingush between the different results. The <c>erpc</c>
+ to distinguish between the different results. The <c>erpc</c>
module provides a subset (however, the central subset) of the
functionality available in the <c>rpc</c> module. The <c>erpc</c>
implementation also provides a more scalable implementation with
better performance than the original <c>rpc</c> implementation.
However, since the introduction of <c>erpc</c>, the <c>rpc</c>
module implements large parts of its central functionality using
- <c>erpc</c>, so the <c>rpc</c> module wont not suffer scalability
+ <c>erpc</c>, so the <c>rpc</c> module won't not suffer scalability
wise and performance wise compared to <c>erpc</c>.
</p></note>
</description>
diff --git a/lib/kernel/doc/src/seq_trace.xml b/lib/kernel/doc/src/seq_trace.xml
index b20a1f2f9d..4f3349af6b 100644
--- a/lib/kernel/doc/src/seq_trace.xml
+++ b/lib/kernel/doc/src/seq_trace.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1998</year><year>2020</year>
+ <year>1998</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -90,7 +90,7 @@ seq_trace:set_token(OldToken), % activate the trace token again
the separate traces. Default is 0.</p>
<warning>
<p>Labels were restricted to small signed integers (28 bits)
- prior to OTP 21. The trace token will be silenty dropped if it
+ prior to OTP 21. The trace token will be silently dropped if it
crosses over to a node that does not support the label.</p>
</warning>
</item>
diff --git a/lib/kernel/doc/src/socket.xml b/lib/kernel/doc/src/socket.xml
index 541f4aaba4..8baaca7944 100644
--- a/lib/kernel/doc/src/socket.xml
+++ b/lib/kernel/doc/src/socket.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2018</year><year>2021</year>
+ <year>2018</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -304,6 +304,10 @@
<desc></desc>
</datatype>
<datatype>
+ <name name="hatype"/>
+ <desc></desc>
+ </datatype>
+ <datatype>
<name name="port_number"/>
<desc></desc>
</datatype>
@@ -1314,7 +1318,7 @@
A control message has got a <c>data</c> field with
a native (<c>binary</c>) value for the message data,
and may also have a decoded <c>value</c> field
- if this socket library succesfully decoded the data.
+ if this socket library successfully decoded the data.
</p>
</desc>
</datatype>
@@ -1543,7 +1547,7 @@
<note>
<p>
Note that when this call has returned
- <c>{error, timeout</c> the connection state of the socket
+ <c>{error, timeout}</c> the connection state of the socket
is uncertain since the platform's network stack
may complete the connection at any time,
up to some platform specific time-out.
@@ -1629,7 +1633,7 @@
<seetype marker="#select_info"><c>{select, SelectInfo}</c></seetype>,
and receiving the select message
<c>{'$socket', Socket, select, SelectHandle}</c>,
- and returns whether the connection setup was succesful or not.
+ and returns whether the connection setup was successful or not.
</p>
<p>
Instead of calling this function, for backwards compatibility,
@@ -1704,7 +1708,7 @@
<seetype marker="#socket_option">socket_option()</seetype>
for which options that this implementation knows about,
how they are related to option names in the OS,
- and if there are known pecularities with any of them.
+ and if there are known peculiarities with any of them.
</p>
<p>
What options are valid depends on what kind of socket it is
@@ -1966,7 +1970,7 @@
<fsummary>Control device.</fsummary>
<desc>
<p>Retrieve socket (device) parameters.
- This function retreives a specific parameter,
+ This function retrieves a specific parameter,
according to <c>GetRequest</c> argument. The third
argument is the (lookup) "key", identifying the
interface (usually the name of the interface).</p>
@@ -2119,7 +2123,7 @@
<fsummary>Report info about what the platform supports.</fsummary>
<desc>
<p>
- This function retreives information about what the
+ This function retrieves information about what the
platform supports, such as if SCTP is supported,
or if a socket options are supported.
</p>
@@ -2274,7 +2278,7 @@
<p>
On some platforms it is <em>necessary</em> to provide
<c>domain</c>, <c>type</c> and <c>protocol</c>
- since they cannot be retreived from the platform.
+ since they cannot be retrieved from the platform.
</p>
</note>
</desc>
@@ -2839,7 +2843,7 @@
<p>
This cannot happen for a socket of
<seetype marker="#type">type <c>stream</c></seetype>
- where a partially succesful send is retried until
+ where a partially successful send is retried until
the data is either accepted or there is an error.
</p>
<p>
@@ -2882,8 +2886,8 @@
<p>
This can only happen for a socket of
<seetype marker="#type">type <c>stream</c></seetype>
- when a partially succesful send is retried
- untill there is an error.
+ when a partially successful send is retried
+ until there is an error.
</p>
</item>
</taglist>
@@ -3431,7 +3435,7 @@
<tag><c>{ok,&nbsp;<anno>BytesSent</anno>}</c></tag>
<item>
<p>
- The transfer completed succesfully after
+ The transfer completed successfully after
<c><anno>BytesSent</anno></c> bytes of data.
</p>
</item>
@@ -3726,7 +3730,7 @@
<seetype marker="#socket_option">socket_option()</seetype>
for which options that this implementation knows about,
how they are related to option names in the OS,
- and if there are known pecularities with any of them.
+ and if there are known peculiarities with any of them.
</p>
<p>
What options are valid depends on what kind of socket it is
@@ -3856,7 +3860,7 @@
<fsummary>Report info about what the platform supports.</fsummary>
<desc>
<p>
- These functions function retreives information about what the
+ These functions function retrieves information about what the
platform supports, such which platform features
or which socket options, are supported.
</p>
@@ -4015,7 +4019,7 @@
<p>The general filter rule.
<br/>A fun that takes the socket info and returns a
<c><![CDATA[boolean()]]></c>
- (<c><![CDATA[true]]></c> if the socket sould be included and
+ (<c><![CDATA[true]]></c> if the socket could be included and
<c><![CDATA[false]]></c> if should not). </p>
</item>
</taglist>
diff --git a/lib/kernel/doc/src/socket_usage.xml b/lib/kernel/doc/src/socket_usage.xml
index c549ea0e19..39d9ded99e 100644
--- a/lib/kernel/doc/src/socket_usage.xml
+++ b/lib/kernel/doc/src/socket_usage.xml
@@ -34,7 +34,7 @@
<title>Introduction</title>
<p>The socket interface (module) is basically a "thin" layer on top of
the OS socket interface. It is assumed that, unless you have special needs,
- gen_[tcp|udp|sctp] should be sufficent (when they become available). </p>
+ gen_[tcp|udp|sctp] should be sufficient (when they become available). </p>
<p>Note that just because we have a documented and described option,
it does <em>not</em> mean that the OS supports it. So its recommended
that the user reads the platform specific documentation for the
@@ -352,7 +352,7 @@
Since our implementation is <em>nonblocking</em>,
its unknown if and how this option works, or even if
it may cause malfunctions.
- Therefor, we do not recommend setting this option.
+ Therefore, we do not recommend setting this option.
Instead, use the <c>Timeout</c> argument to, for instance,
the
<seemfa marker="socket#recv/3"><c>recv/3</c></seemfa>
@@ -400,7 +400,7 @@
Since our implementation is <em>nonblocking</em>,
its unknown if and how this option works, or even if
it may cause malfunctions.
- Therefor, we do not recommend setting this option.
+ Therefore, we do not recommend setting this option.
Instead, use the <c>Timeout</c> argument to, for instance,
the
<seemfa marker="socket#send/3"><c>send/3</c></seemfa>
diff --git a/lib/kernel/examples/Makefile b/lib/kernel/examples/Makefile
index 21f3f26cf7..2356bbf602 100644
--- a/lib/kernel/examples/Makefile
+++ b/lib/kernel/examples/Makefile
@@ -29,7 +29,7 @@ include ../vsn.mk
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/kernel/examples/erl_uds_dist/src/erl_uds_dist.erl b/lib/kernel/examples/erl_uds_dist/src/erl_uds_dist.erl
index c69947184f..d6310bdd19 100644
--- a/lib/kernel/examples/erl_uds_dist/src/erl_uds_dist.erl
+++ b/lib/kernel/examples/erl_uds_dist/src/erl_uds_dist.erl
@@ -25,7 +25,7 @@
%% This is an example of how to plug in an alternative distribution
%% protocol using distribution controller processes. Erlang
%% distribution can use whatever underlying protocols as long as the
-%% implementation reliably delivers data chuncks to the receiving
+%% implementation reliably delivers data chunks to the receiving
%% Erlang node in the order they were sent by the sending node.
%%
%% This example uses stream-oriented Unix Domain Sockets (of the
@@ -74,7 +74,7 @@
%% If tracing is wanted, uncomment the dist_trace macro in dist_util.hrl
%% to enable all the calls to trace below, or copy the trace macro here.
%%
-%% Tracing will freeze the initial boot when a -name or -sname paramater
+%% Tracing will freeze the initial boot when a -name or -sname parameter
%% is passed to start directly distributed nodes. To make it work,
%% launch non-distributed nodes first (without -name and -sname) then
%% call net_kernel:start/1 to enable the distribution in a second stage.
@@ -417,7 +417,7 @@ accept_loop(Kernel, ListeningSocket) ->
%% The caller of accept_supervisor is a representative for net_kernel and
%% is identified as Kernel below.
%%
-%% AcceptPid is the process identifer created by accept/1.
+%% AcceptPid is the process identifier created by accept/1.
%%
%% DistCtrl is the identifier of the distribution controller process in
%% charge of the connection, as created by the accept_loop process above.
@@ -432,8 +432,7 @@ accept_loop(Kernel, ListeningSocket) ->
accept_connection(AcceptPid, DistCtrl, MyNode, Allowed, SetupTime) ->
spawn_opt(?MODULE, accept_supervisor,
[self(), AcceptPid, DistCtrl, MyNode, Allowed, SetupTime],
- %% Spawn on max priority
- [link, {priority, max}]).
+ dist_util:net_ticker_spawn_options()).
accept_supervisor(Kernel, AcceptPid, DistCtrl, MyNode, Allowed, SetupTime) ->
?trace("~p~n", [{?MODULE, accept_connection, self()}]),
@@ -473,7 +472,6 @@ accept_supervisor(Kernel, AcceptPid, DistCtrl, MyNode, Allowed, SetupTime) ->
dist_util:handshake_other_started(HSData)
end.
-
%% ---------------------------------------------------------------------
%% Define common values of the handshake data record, defined in
%% kernel/include/dist_util.hrl
@@ -666,8 +664,7 @@ getopts(ListeningSocket, Options) ->
setup(Node, Type, MyNode, _LongOrShortNames, SetupTime) ->
spawn_opt(?MODULE, setup_supervisor,
[self(), Node, Type, MyNode, SetupTime],
- %% Spawn on max priority
- [link, {priority, max}]).
+ dist_util:net_ticker_spawn_options()).
setup_supervisor(Kernel, Node, Type, MyNode, SetupTime) ->
?trace("~p~n", [{?MODULE, setup, self(), Node}]),
diff --git a/lib/kernel/examples/gen_tcp_dist/src/gen_tcp_dist.erl b/lib/kernel/examples/gen_tcp_dist/src/gen_tcp_dist.erl
index f4eb12818d..9df8ab4f4c 100644
--- a/lib/kernel/examples/gen_tcp_dist/src/gen_tcp_dist.erl
+++ b/lib/kernel/examples/gen_tcp_dist/src/gen_tcp_dist.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -183,7 +183,7 @@ flush_controller(Pid, Socket) ->
accept_connection(AcceptPid, DistCtrl, MyNode, Allowed, SetupTime) ->
spawn_opt(?MODULE, do_accept,
[self(), AcceptPid, DistCtrl, MyNode, Allowed, SetupTime],
- [link, {priority, max}]).
+ dist_util:net_ticker_spawn_options()).
do_accept(Kernel, AcceptPid, DistCtrl, MyNode, Allowed, SetupTime) ->
?trace("~p~n",[{?MODULE, do_accept, self(), MyNode}]),
@@ -230,7 +230,7 @@ nodelay() ->
setup(Node, Type, MyNode, LongOrShortNames,SetupTime) ->
spawn_opt(?MODULE, do_setup,
[self(), Node, Type, MyNode, LongOrShortNames, SetupTime],
- [link, {priority, max}]).
+ dist_util:net_ticker_spawn_options()).
do_setup(Kernel, Node, Type, MyNode, LongOrShortNames, SetupTime) ->
?trace("~p~n",[{?MODULE, do_setup, self(), Node}]),
@@ -444,7 +444,7 @@ hs_data_common(DistCtrl) ->
%% the connection down if no incoming traffic is seen.
%% This process also executes on max priority.
%%
-%% These parties are linked togheter so should one
+%% These parties are linked together so should one
%% of them fail, all of them are terminated and the
%% connection is taken down.
%%
@@ -569,7 +569,7 @@ call_ctrlr(Ctrlr, Msg) ->
%% non-blocking send operation exposed in its API
%% and we don't want to run the distribution
%% controller under high priority. Therefore this
-%% sparate process with max prio that dispatches
+%% separate process with max prio that dispatches
%% ticks.
%%
dist_cntrlr_tick_handler(Socket) ->
@@ -700,7 +700,7 @@ dist_cntrlr_setup_loop(Socket, TickHandler, Sup) ->
dist_cntrlr_input_setup(DHandle, Socket, Sup) ->
link(Sup),
- %% Ensure we don't try to put data before registerd
+ %% Ensure we don't try to put data before we are registered
%% as input handler...
receive
DHandle ->
@@ -775,7 +775,7 @@ death_row() ->
death_row(normal) ->
%% We do not want to exit with normal
- %% exit reason since it wont bring down
+ %% exit reason since it won't bring down
%% linked processes...
death_row();
death_row(Reason) ->
diff --git a/lib/kernel/examples/uds_dist/c_src/uds_drv.c b/lib/kernel/examples/uds_dist/c_src/uds_drv.c
index 8c028ba910..6110ce6a72 100644
--- a/lib/kernel/examples/uds_dist/c_src/uds_drv.c
+++ b/lib/kernel/examples/uds_dist/c_src/uds_drv.c
@@ -1039,7 +1039,7 @@ static int try_lock(char *sockname, Byte *p_creation)
}
lseek(lockfd, 0, SEEK_SET);
write(lockfd, &creation, 1);
- fsync(lockfd); /* This could be concidered dangerous (blocking) */
+ fsync(lockfd); /* This could be considered dangerous (blocking) */
*p_creation = creation;
return lockfd;
}
diff --git a/lib/kernel/examples/uds_dist/src/uds_server.erl b/lib/kernel/examples/uds_dist/src/uds_server.erl
index c060130f9d..76eb869c5e 100644
--- a/lib/kernel/examples/uds_dist/src/uds_server.erl
+++ b/lib/kernel/examples/uds_dist/src/uds_server.erl
@@ -113,7 +113,7 @@ load_driver() ->
find_priv_lib() ->
PrivDir = case (catch code:priv_dir(uds_dist)) of
{'EXIT', _} ->
- %% Code server probably not startet yet
+ %% Code server probably not started yet
{ok, P} = erl_prim_loader:get_path(),
ModuleFile = atom_to_list(?MODULE) ++ extension(),
Pd = (catch lists:foldl
diff --git a/lib/kernel/include/dist.hrl b/lib/kernel/include/dist.hrl
index 10460ba3e8..3c2d6323e3 100644
--- a/lib/kernel/include/dist.hrl
+++ b/lib/kernel/include/dist.hrl
@@ -22,35 +22,55 @@
%% Distribution capabilities flags (corresponds with dist.h).
%%
--define(DFLAG_PUBLISHED,1).
--define(DFLAG_ATOM_CACHE,2).
--define(DFLAG_EXTENDED_REFERENCES,4).
--define(DFLAG_DIST_MONITOR,8).
--define(DFLAG_FUN_TAGS,16#10).
--define(DFLAG_DIST_MONITOR_NAME,16#20).
--define(DFLAG_HIDDEN_ATOM_CACHE,16#40).
--define(DFLAG_NEW_FUN_TAGS,16#80).
--define(DFLAG_EXTENDED_PIDS_PORTS,16#100).
--define(DFLAG_EXPORT_PTR_TAG,16#200).
--define(DFLAG_BIT_BINARIES,16#400).
--define(DFLAG_NEW_FLOATS,16#800).
--define(DFLAG_UNICODE_IO,16#1000).
--define(DFLAG_DIST_HDR_ATOM_CACHE,16#2000).
--define(DFLAG_SMALL_ATOM_TAGS, 16#4000).
--define(DFLAG_UTF8_ATOMS, 16#10000).
--define(DFLAG_MAP_TAG, 16#20000).
--define(DFLAG_BIG_CREATION, 16#40000).
--define(DFLAG_SEND_SENDER, 16#80000).
--define(DFLAG_BIG_SEQTRACE_LABELS, 16#100000).
-%% -define(DFLAG_NO_MAGIC, 16#200000). %% Used internally only
--define(DFLAG_EXIT_PAYLOAD, 16#400000).
--define(DFLAG_FRAGMENTS, 16#00800000).
--define(DFLAG_HANDSHAKE_23, 16#01000000).
--define(DFLAG_RESERVED, 16#fe000000).
--define(DFLAG_SPAWN, 16#100000000).
--define(DFLAG_NAME_ME, 16#200000000).
--define(DFLAG_V4_NC, 16#400000000).
--define(DFLAG_ALIAS, 16#800000000).
+-define(DFLAG_PUBLISHED, 16#01).
+-define(DFLAG_ATOM_CACHE, 16#02).
+-define(DFLAG_EXTENDED_REFERENCES, 16#04).
+-define(DFLAG_DIST_MONITOR, 16#08).
+-define(DFLAG_FUN_TAGS, 16#10).
+-define(DFLAG_DIST_MONITOR_NAME, 16#20).
+-define(DFLAG_HIDDEN_ATOM_CACHE, 16#40).
+-define(DFLAG_NEW_FUN_TAGS, 16#80).
+-define(DFLAG_EXTENDED_PIDS_PORTS, 16#100).
+-define(DFLAG_EXPORT_PTR_TAG, 16#200).
+-define(DFLAG_BIT_BINARIES, 16#400).
+-define(DFLAG_NEW_FLOATS, 16#800).
+-define(DFLAG_UNICODE_IO, 16#1000).
+-define(DFLAG_DIST_HDR_ATOM_CACHE, 16#2000).
+-define(DFLAG_SMALL_ATOM_TAGS, 16#4000).
+-define(DFLAG_UTF8_ATOMS, 16#10000).
+-define(DFLAG_MAP_TAG, 16#20000).
+-define(DFLAG_BIG_CREATION, 16#40000).
+-define(DFLAG_SEND_SENDER, 16#80000).
+-define(DFLAG_BIG_SEQTRACE_LABELS, 16#100000).
+%% -define(DFLAG_NO_MAGIC, 16#200000). %% Used internally only
+-define(DFLAG_EXIT_PAYLOAD, 16#400000).
+-define(DFLAG_FRAGMENTS, 16#00800000).
+-define(DFLAG_HANDSHAKE_23, 16#01000000).
+-define(DFLAG_UNLINK_ID, 16#02000000).
+-define(DFLAG_MANDATORY_25_DIGEST, 16#04000000).
+-define(DFLAG_RESERVED, 16#f8000000).
+
+%% Second 32-bit flag word.
+-define(DFLAG_SPAWN, (16#01 bsl 32)).
+-define(DFLAG_NAME_ME, (16#02 bsl 32)).
+-define(DFLAG_V4_NC, (16#04 bsl 32)).
+-define(DFLAG_ALIAS, (16#08 bsl 32)).
+
+%% The following flags are mandatory in OTP 25. OTP 25 and higher
+%% will accept ?DFLAG_MANDATORY_25_DIGEST as a shorthand for all those
+%% flags.
+-define(MANDATORY_DFLAGS_25,
+ (?DFLAG_EXTENDED_REFERENCES bor
+ ?DFLAG_FUN_TAGS bor
+ ?DFLAG_EXTENDED_PIDS_PORTS bor
+ ?DFLAG_NEW_FUN_TAGS bor
+ ?DFLAG_EXPORT_PTR_TAG bor
+ ?DFLAG_BIT_BINARIES bor
+ ?DFLAG_NEW_FLOATS bor
+ ?DFLAG_UTF8_ATOMS bor
+ ?DFLAG_MAP_TAG bor
+ ?DFLAG_BIG_CREATION bor
+ ?DFLAG_HANDSHAKE_23)).
%% Also update dflag2str() in ../src/dist_util.erl
%% when adding flags...
@@ -62,3 +82,32 @@
-define(ERL_DIST_VER_LOW, ?ERL_DIST_VER_5).
-define(ERL_DIST_VER_HIGH, ?ERL_DIST_VER_6).
+%%%
+%%% To avoid having to extend the number of distribution flags from 64
+%%% to 128, a scheme for garbage collection of the flags was
+%%% introduced in OTP 25.
+%%%
+%%% In OTP 25, ?DFLAG_MANDATORY_25_DIGEST was introduced as a synonym
+%%% for the flags defined by ?MANDATORY_DFLAGS_25. OTP 25/26 will
+%%% accept the old flags to support communication with 24 and earlier,
+%%% as well as ?DFLAG_MANDATORY_25_DIGEST.
+%%%
+%%% OTP 27 will make ?DFLAG_MANDATORY_25_DIGEST mandatory, meaning that an
+%%% OTP 27 node can only communicate with OTP 25 and higher.
+%%%
+%%% An OTP 27 node will also introduce the new flag
+%%% ?DFLAG_MANDATORY_27_DIGEST:
+%%%
+%%% * If ?DFLAG_MANDATORY_27_DIGEST is set, it means that all bit
+%%% numbers defined by ?MANDATORY_DFLAGS_25, as well as the bit
+%%% number defined by ?DFLAG_MANDATORY_25_DIGEST and any other bits
+%%% made mandatory in OTP 26/27, lose their previous meanings. New
+%%% meanings can then be assigned to those bit numbers as
+%%% needed. (This is for communication between nodes from OTP 27 and
+%%% up.)
+%%%
+%%% * If ?DFLAG_MANDATORY_27_DIGEST is not set, then
+%%% ?DFLAG_MANDATORY_25_DIGEST must be set and all bit numbers
+%%% defined by ?MANDATORY_DFLAGS_25 are ignored. (This is for
+%%% communication between an OTP 27 node and an OTP 25/26 node.)
+%%%
diff --git a/lib/kernel/include/inet_sctp.hrl b/lib/kernel/include/inet_sctp.hrl
index ddb3cdc26c..11b06fd8e6 100644
--- a/lib/kernel/include/inet_sctp.hrl
+++ b/lib/kernel/include/inet_sctp.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -120,7 +120,7 @@
}).
%% sctp_partial_delivery_event: XXX: Not clear whether it is delivered to
-%% the Sender or to the Recepient (probably the
+%% the Sender or to the Recipient (probably the
%% former). Currently, there is only 1 possible
%% value for "indication":
-record(sctp_pdapi_event,
diff --git a/lib/kernel/src/Makefile b/lib/kernel/src/Makefile
index b2299188eb..2149e89776 100644
--- a/lib/kernel/src/Makefile
+++ b/lib/kernel/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -188,7 +188,7 @@ ERL_COMPILE_FLAGS += -I../include
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
# Note: In the open-source build clean must not destroyed the preloaded
# beam files.
diff --git a/lib/kernel/src/application_controller.erl b/lib/kernel/src/application_controller.erl
index bf7843b92b..1f428c560b 100644
--- a/lib/kernel/src/application_controller.erl
+++ b/lib/kernel/src/application_controller.erl
@@ -509,7 +509,7 @@ init(Init, Kernel) ->
{ok, ConfData} ->
%% Actually, we don't need this info in an ets table anymore.
%% This table was introduced because starting applications
- %% should be able to get som info from AC (e.g. loaded_apps).
+ %% should be able to get some info from AC (e.g. loaded_apps).
%% The new implementation makes sure the AC process can be
%% called during start-up of any app.
case check_conf_data(ConfData) of
@@ -670,7 +670,7 @@ handle_call({start_application, AppName, RestartType}, From, S) ->
#state{running = Running, starting = Starting, start_p_false = SPF,
started = Started, start_req = Start_req} = S,
%% Check if the commandline environment variables are OK.
- %% Incase of erroneous variables do not start the application,
+ %% In case of erroneous variables do not start the application,
%% if the application is permanent crash the node.
%% Check if the application is already starting.
case lists:keyfind(AppName, 1, Start_req) of
@@ -1731,7 +1731,7 @@ check_user() ->
%%-----------------------------------------------------------------
-%% Prepare for a release upgrade by reading all the evironment variables.
+%% Prepare for a release upgrade by reading all the environment variables.
%%-----------------------------------------------------------------
do_prep_config_change(Apps) ->
do_prep_config_change(Apps, []).
diff --git a/lib/kernel/src/auth.erl b/lib/kernel/src/auth.erl
index f61ceb9461..8f2fc99647 100644
--- a/lib/kernel/src/auth.erl
+++ b/lib/kernel/src/auth.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -45,7 +45,7 @@
-type cookie() :: atom().
-record(state, {
our_cookie :: cookie(), %% Our own cookie
- other_cookies :: ets:tab() %% The send-cookies of other nodes
+ other_cookies :: ets:table()%% The send-cookies of other nodes
}).
-type state() :: #state{}.
@@ -375,26 +375,64 @@ init_setcookie([], OurCookies, OtherCookies) ->
ets_new_cookies() ->
ets:new(cookies, [?COOKIE_ETS_PROTECTION]).
+%% Read cookie from:
+%% 1. $HOME/.erlang.cookie
+%% 2. $XDG_CONFIG_HOME/erlang/.erlang.cookie
+%%
+%% If neither are present, we generate $HOME/.erlang.cookie
read_cookie() ->
+ XDGPath = filename:join(
+ filename:basedir(user_config, "erlang"),
+ ".erlang.cookie"),
case init:get_argument(home) of
{ok, [[Home]]} ->
- read_cookie(filename:join(Home, ".erlang.cookie"));
+ HomePath = filename:join(Home, ".erlang.cookie"),
+ case read_cookie(HomePath) of
+ {error, enoent} ->
+ case read_cookie(XDGPath) of
+ {error, enoent} ->
+ case create_cookie(HomePath) of
+ ok ->
+ {ok, Cookie} = read_cookie(HomePath),
+ Cookie;
+ Error -> Error
+ end;
+ {ok, Cookie} ->
+ Cookie;
+ Error ->
+ Error
+ end;
+ {ok, Cookie} ->
+ Cookie;
+ Error ->
+ Error
+ end;
_ ->
- {error, "No home for cookie file"}
+ %% Failed to read find home, try xdg path
+ case read_cookie(XDGPath) of
+ {error, enoent} ->
+ case create_cookie(XDGPath) of
+ ok ->
+ {ok, Cookie} = read_cookie(XDGPath),
+ Cookie;
+ Error -> Error
+ end;
+ {ok, Cookie} ->
+ Cookie;
+ _Error ->
+ {error, "No home for cookie file"}
+ end
end.
read_cookie(Name) ->
case file:raw_read_file_info(Name) of
{ok, #file_info {type=Type, mode=Mode, size=Size}} ->
case check_attributes(Name, Type, Mode, os:type()) of
- ok -> read_cookie(Name, Size);
- Error -> Error
- end;
- {error, enoent} ->
- case create_cookie(Name) of
- ok -> read_cookie(Name);
+ ok -> {ok, read_cookie(Name, Size)};
Error -> Error
end;
+ {error, enoent} ->
+ {error, enoent};
{error, Reason} ->
{error, make_error(Name, Reason)}
end.
@@ -454,24 +492,24 @@ create_cookie(Name) ->
bxor erlang:unique_integer()),
Cookie = random_cookie(20, Seed, []),
case file:open(Name, [write, raw]) of
- {ok, File} ->
- R1 = file:write(File, Cookie),
- ok = file:close(File),
- R2 = file:raw_write_file_info(Name, make_info(Name)),
- case {R1, R2} of
- {ok, ok} ->
- ok;
- {{error,Reason}, _} ->
- {error,
- lists:flatten(
- io_lib:format("Failed to write to cookie file '~ts': ~p", [Name, Reason]))};
- {ok, {error, Reason}} ->
- {error, "Failed to change mode: " ++ atom_to_list(Reason)}
- end;
- {error,Reason} ->
- {error,
- lists:flatten(
- io_lib:format("Failed to create cookie file '~ts': ~p", [Name, Reason]))}
+ {ok, File} ->
+ R1 = file:write(File, Cookie),
+ ok = file:close(File),
+ R2 = file:raw_write_file_info(Name, make_info(Name)),
+ case {R1, R2} of
+ {ok, ok} ->
+ ok;
+ {{error,Reason}, _} ->
+ {error,
+ lists:flatten(
+ io_lib:format("Failed to write to cookie file '~ts': ~p", [Name, Reason]))};
+ {ok, {error, Reason}} ->
+ {error, "Failed to change mode: " ++ atom_to_list(Reason)}
+ end;
+ {error,Reason} ->
+ {error,
+ lists:flatten(
+ io_lib:format("Failed to create cookie file '~ts': ~p", [Name, Reason]))}
end.
random_cookie(0, _, Result) ->
diff --git a/lib/kernel/src/code.erl b/lib/kernel/src/code.erl
index 71a570fa7b..77f8f0ca9e 100644
--- a/lib/kernel/src/code.erl
+++ b/lib/kernel/src/code.erl
@@ -739,7 +739,8 @@ do_start() ->
load_code_server_prerequisites() ->
%% Please keep the alphabetical order.
- Needed = [binary,
+ Needed = [beam_lib,
+ binary,
ets,
filename,
gb_sets,
@@ -1048,20 +1049,20 @@ module_status(Module) ->
%% Note that we don't want to go via which/1, since it doesn't look at the
%% disk contents at all if the module is already loaded.
module_status(Module, PathFiles) ->
- case code:is_loaded(Module) of
+ case is_loaded(Module) of
false -> not_loaded;
{file, preloaded} -> loaded;
{file, cover_compiled} ->
- %% cover compilation loads directly to memory and does not
- %% create a beam file, so report 'modified' if a file exists
+ %% Cover compilation loads directly to memory and does not
+ %% create a beam file, so report 'modified' if a file exists.
case which(Module, PathFiles) of
non_existing -> removed;
_File -> modified
end;
{file, []} -> loaded; % no beam file - generated code
- {file, OldFile} when is_list(OldFile) ->
- %% we don't care whether or not the file is in the same location
- %% as when last loaded, as long as it can be found in the path
+ {file, [_|_]} ->
+ %% We don't care whether or not the file is in the same location
+ %% as when last loaded, as long as it can be found in the path.
case which(Module, PathFiles) of
non_existing -> removed;
Path ->
@@ -1076,10 +1077,24 @@ module_status(Module, PathFiles) ->
%% be reloaded; does not care about file timestamps or compilation time
module_changed_on_disk(Module, Path) ->
MD5 = erlang:get_module_info(Module, md5),
- MD5 =/= beam_file_md5(Path).
+ MD5 =/= beam_file_md5(Module, Path).
+
+beam_file_md5(Module, Path) ->
+ case do_beam_file_md5(Path) of
+ MD5 when is_binary(MD5) ->
+ MD5;
+ undefined ->
+ %% This module is probably embedded in an archive.
+ case get_object_code(Module) of
+ {Module, Code, _Path} ->
+ do_beam_file_md5(Code);
+ error ->
+ undefined
+ end
+ end.
-beam_file_md5(Path) ->
- case beam_lib:md5(Path) of
+do_beam_file_md5(PathOrCode) ->
+ case beam_lib:md5(PathOrCode) of
{ok,{_Mod,MD5}} -> MD5;
_ -> undefined
end.
diff --git a/lib/kernel/src/code_server.erl b/lib/kernel/src/code_server.erl
index 3ab50cafe0..af8531271f 100644
--- a/lib/kernel/src/code_server.erl
+++ b/lib/kernel/src/code_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -42,8 +42,8 @@
-record(state, {supervisor :: pid(),
root :: file:name_all(),
path :: [file:name_all()],
- moddb :: ets:tab(),
- namedb :: ets:tab(),
+ moddb :: ets:table(),
+ namedb :: ets:table(),
mode = interactive :: 'interactive' | 'embedded',
on_load = [] :: [on_load_item()]}).
-type state() :: #state{}.
@@ -1334,7 +1334,7 @@ handle_pending_on_load(Action, Mod, From, #state{on_load=OnLoad0}=St) ->
%% call to its own module. That would be a deadlock.
%% Fail the call. (The call is probably from error_handler,
%% and it will ignore the actual error reason and cause
- %% an undef execption.)
+ %% an undef exception.)
{reply,{error,deadlock},St};
{_,_,_} ->
OnLoad = handle_pending_on_load_1(Mod, {From,Action}, OnLoad0),
diff --git a/lib/kernel/src/disk_log.erl b/lib/kernel/src/disk_log.erl
index a420a133d0..19225c9be5 100644
--- a/lib/kernel/src/disk_log.erl
+++ b/lib/kernel/src/disk_log.erl
@@ -368,7 +368,7 @@ pid2name(Pid) ->
end.
%% This function Takes 3 args, a Log, a Continuation and N.
-%% It retuns a {Cont2, ObjList} | eof | {error, Reason}
+%% It returns a {Cont2, ObjList} | eof | {error, Reason}
%% The initial continuation is the atom 'start'
-type chunk_error_rsn() :: no_such_log
@@ -1151,7 +1151,7 @@ system_terminate(Reason, _Parent, _, State) ->
exit(Reason).
%%-----------------------------------------------------------------
-%% Temporay code for upgrade.
+%% Temporary code for upgrade.
%%-----------------------------------------------------------------
system_code_change(State, _Module, _OldVsn, _Extra) ->
{ok, State}.
diff --git a/lib/kernel/src/disk_log.hrl b/lib/kernel/src/disk_log.hrl
index 1e773e4730..6cb2c13f02 100644
--- a/lib/kernel/src/disk_log.hrl
+++ b/lib/kernel/src/disk_log.hrl
@@ -143,7 +143,7 @@
%% since log was opened if info/1
%% has not yet been used on this log.
accFull :: non_neg_integer()} %% noFull+accFull is number of
- %% oveflows since the log was opened.
+ %% overflows since the log was opened.
).
-record(log,
diff --git a/lib/kernel/src/dist_ac.erl b/lib/kernel/src/dist_ac.erl
index 2a5cf0ba92..32f9cc461f 100644
--- a/lib/kernel/src/dist_ac.erl
+++ b/lib/kernel/src/dist_ac.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -42,7 +42,7 @@
-define(DIST_AC, ?MODULE).
-define(LOCK_ID, ?MODULE).
-%% This is the protocol version for the dist_ac protcol (between nodes)
+%% This is the protocol version for the dist_ac protocol (between nodes)
-define(vsn, 1).
%%%-----------------------------------------------------------------
@@ -862,8 +862,8 @@ wait_dist_start(Node, Appl, Name, Nodes, PermittedNodes, S, Type) ->
{dist_ac_weight, Name, _Weigth, Node} ->
%% This is the situation: {Name, [RNode, {Node}, node()]}
%% and permit(false) is called on RNode, and we sent the
- %% weigth first. Node handled it in handle_info, and
- %% now we must send him a weigth msg. We can use any weigth;
+ %% weight first. Node handled it in handle_info, and
+ %% now we must send him a weight msg. We can use any weight;
%% he wins anyway.
monitor_node(Node, false),
{?DIST_AC, Node} !
diff --git a/lib/kernel/src/dist_util.erl b/lib/kernel/src/dist_util.erl
index 7fe5edf80d..39ea8a5dec 100644
--- a/lib/kernel/src/dist_util.erl
+++ b/lib/kernel/src/dist_util.erl
@@ -31,7 +31,8 @@
start_timer/1, setup_timer/2,
reset_timer/1, cancel_timer/1,
is_node_name/1, split_node/1, is_allowed/2,
- shutdown/3, shutdown/4]).
+ shutdown/3, shutdown/4,
+ net_ticker_spawn_options/0]).
-import(error_logger,[error_msg/2]).
@@ -124,6 +125,10 @@ dflag2str(?DFLAG_FRAGMENTS) ->
"FRAGMENTS";
dflag2str(?DFLAG_HANDSHAKE_23) ->
"HANDSHAKE_23";
+dflag2str(?DFLAG_UNLINK_ID) ->
+ "UNLINK_ID";
+dflag2str(?DFLAG_MANDATORY_25_DIGEST) ->
+ "MANDATORY_25_DIGEST";
dflag2str(?DFLAG_SPAWN) ->
"SPAWN";
dflag2str(?DFLAG_NAME_ME) ->
@@ -132,8 +137,8 @@ dflag2str(?DFLAG_V4_NC) ->
"V4_NC";
dflag2str(?DFLAG_ALIAS) ->
"ALIAS";
-dflag2str(_) ->
- "UNKNOWN".
+dflag2str(Other) ->
+ lists:flatten(io_lib:format("UNKNOWN<~.16.0B>", [Other])).
adjust_flags(ThisFlags, OtherFlags) ->
@@ -200,7 +205,8 @@ handshake_other_started(#hs_data{request_type=ReqType,
AddFlgs = convert_flags(AddFlgs0),
RejFlgs = convert_flags(RejFlgs0),
ReqFlgs = convert_flags(ReqFlgs0),
- {PreOtherFlags,NodeOrHost,Creation,SendNameVersion} = recv_name(HSData0),
+ {PreOtherFlags0,NodeOrHost,Creation,SendNameVersion} = recv_name(HSData0),
+ PreOtherFlags = expand_mandatory_25_flag(PreOtherFlags0),
EDF = erts_internal:get_dflags(),
PreThisFlags = make_this_flags(ReqType, AddFlgs, RejFlgs, NodeOrHost, EDF,
PreOtherFlags),
@@ -239,6 +245,15 @@ handshake_other_started(#hs_data{request_type=ReqType,
handshake_other_started(OldHsData) when element(1,OldHsData) =:= hs_data ->
handshake_other_started(convert_old_hsdata(OldHsData)).
+expand_mandatory_25_flag(Flags) ->
+ if
+ Flags band ?DFLAG_MANDATORY_25_DIGEST =/= 0 ->
+ %% From OTP 25, the single flag ?DFLAG_MANDATORY_25_DIGEST can
+ %% replace all the flags in ?MANDATORY_DFLAGS_25.
+ Flags bor ?MANDATORY_DFLAGS_25;
+ true ->
+ Flags
+ end.
%%
%% Check mandatory flags...
@@ -431,7 +446,8 @@ handshake_we_started(#hs_data{request_type=ReqType,
require_flags = ReqFlgs},
SendNameVersion = send_name(HSData),
HSData1 = recv_status(HSData),
- {PreOtherFlags, ChallengeA, Creation} = recv_challenge(HSData1),
+ {PreOtherFlags0, ChallengeA, Creation} = recv_challenge(HSData1),
+ PreOtherFlags = expand_mandatory_25_flag(PreOtherFlags0),
ChosenFlags = adjust_flags(PreThisFlags, PreOtherFlags),
HSData2 = HSData1#hs_data{this_flags = ChosenFlags,
other_flags = ChosenFlags,
@@ -1193,8 +1209,8 @@ send_status(#hs_data{socket = Socket, other_node = Node,
%% ticker process, In that case this code will never run
%% And then every 60 seconds we also check the connection and
-%% close it if we havn't received anything on it for the
-%% last 60 secs. If ticked == tick we havn't received anything
+%% close it if we haven't received anything on it for the
+%% last 60 secs. If ticked == tick we haven't received anything
%% on the connection the last 60 secs.
%% The detection time interval is thus, by default, 45s < DT < 75s
@@ -1283,3 +1299,20 @@ cancel_timer(Timer) ->
unlink(Timer),
exit(Timer, shutdown).
+net_ticker_spawn_options() ->
+ Opts = application:get_env(kernel, net_ticker_spawn_options, []),
+ [link, {priority, max} | cleanup_net_ticker_spawn_options(Opts)].
+
+cleanup_net_ticker_spawn_options([]) ->
+ [];
+cleanup_net_ticker_spawn_options([link|Opts]) ->
+ cleanup_net_ticker_spawn_options(Opts);
+cleanup_net_ticker_spawn_options([{priority, _}|Opts]) ->
+ cleanup_net_ticker_spawn_options(Opts);
+cleanup_net_ticker_spawn_options([monitor|Opts]) ->
+ cleanup_net_ticker_spawn_options(Opts);
+cleanup_net_ticker_spawn_options([{monitor, _}|Opts]) ->
+ cleanup_net_ticker_spawn_options(Opts);
+cleanup_net_ticker_spawn_options([Opt|Opts]) ->
+ [Opt|cleanup_net_ticker_spawn_options(Opts)].
+
diff --git a/lib/kernel/src/erl_boot_server.erl b/lib/kernel/src/erl_boot_server.erl
index 4ac945ce01..adbf1bdbcf 100644
--- a/lib/kernel/src/erl_boot_server.erl
+++ b/lib/kernel/src/erl_boot_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@
add_subnet/2, delete_subnet/2,
which_slaves/0]).
-%% Exports for testing (dont't remove; tests suites depend on them).
+%% Exports for testing (don't remove; tests suites depend on them).
-export([would_be_booted/1]).
%% Internal exports
@@ -46,7 +46,7 @@
{
priority = 0, %% priority of this server
version = "" :: string(), %% Version handled i.e "4.5.3" etc
- udp_sock, %% listen port for broadcase requests
+ udp_sock, %% listen port for broadcast requests
udp_port, %% port number must be ?EBOOT_PORT!
listen_sock, %% listen sock for incoming file requests
listen_port, %% listen port number
diff --git a/lib/kernel/src/erl_erts_errors.erl b/lib/kernel/src/erl_erts_errors.erl
index b6a8ce846f..2b99e0c079 100644
--- a/lib/kernel/src/erl_erts_errors.erl
+++ b/lib/kernel/src/erl_erts_errors.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -19,7 +19,7 @@
%%
-module(erl_erts_errors).
--export([format_error/2]).
+-export([format_error/2, format_bs_fail/2]).
-spec format_error(Reason, StackTrace) -> ErrorMap when
Reason :: term(),
@@ -43,6 +43,26 @@ format_error(Reason, [{M,F,As,Info}|_]) ->
end,
format_error_map(Res, 1, #{}).
+-spec format_bs_fail(Reason, StackTrace) -> ErrorMap when
+ Reason :: term(),
+ StackTrace :: erlang:stacktrace(),
+ ErrorMap :: #{'general' => unicode:chardata()}.
+
+format_bs_fail(Reason, [{_,_,_,Info}|_]) ->
+ ErrorInfoMap = proplists:get_value(error_info, Info, #{}),
+ case ErrorInfoMap of
+ #{cause := {Segment0,Type,Error,Value}} ->
+ Segment1 = maps:get(override_segment_position, ErrorInfoMap, Segment0),
+ PrettyPrinter = maps:get(pretty_printer, ErrorInfoMap, fun possibly_truncated/1),
+ Str0 = do_format_bs_fail(Reason, Type, Error, Value, PrettyPrinter),
+ Str1 = io_lib:format("segment ~p of type '~ts': ~ts",
+ [Segment1,Type,Str0]),
+ Str = iolist_to_binary(Str1),
+ #{general => Str, reason => <<"construction of binary failed">>};
+ #{} ->
+ #{}
+ end.
+
format_atomics_error(new, [Size,Options], Reason, Cause) ->
case Reason of
system_limit ->
@@ -1034,6 +1054,76 @@ format_erlang_error(whereis, [_], _) ->
format_erlang_error(_, _, _) ->
[].
+do_format_bs_fail(system_limit, binary, binary, size, _PrettyPrinter) ->
+ %% On a 32-bit system, the size of the binary is 256 MiB or
+ %% more, which is not supported because the size in bits does not
+ %% fit in a 32-bit signed integer. In practice, an application
+ %% that uses any binaries of that size is likely to quickly run
+ %% out of memory.
+ io_lib:format(<<"the size of the binary/bitstring is too large (exceeding ~p bits)">>,
+ [(1 bsl 31) - 1]);
+do_format_bs_fail(system_limit, _Type, size, Value, _PrettyPrinter) ->
+ io_lib:format(<<"the size ~p is too large">>, [Value]);
+do_format_bs_fail(badarg, Type, Info, Value, PrettyPrinter) ->
+ do_format_bs_fail(Type, Info, Value, PrettyPrinter).
+
+do_format_bs_fail(float, invalid, Value, _PrettyPrinter) ->
+ io_lib:format(<<"expected one of the supported sizes 16, 32, or 64 but got: ~p">>,
+ [Value]);
+do_format_bs_fail(float, no_float, Value, PrettyPrinter) ->
+ io_lib:format(<<"the value ~ts is outside the range expressible as a float">>,
+ [PrettyPrinter(Value)]);
+do_format_bs_fail(binary, unit, Value, PrettyPrinter) ->
+ io_lib:format(<<"the size of the value ~ts is not a multiple of the unit for the segment">>,
+ [PrettyPrinter(Value)]);
+do_format_bs_fail(_Type, short, Value, PrettyPrinter) ->
+ io_lib:format(<<"the value ~ts is shorter than the size of the segment">>,
+ [PrettyPrinter(Value)]);
+do_format_bs_fail(_Type, size, Value, PrettyPrinter) ->
+ io_lib:format(<<"expected a non-negative integer as size but got: ~ts">>,
+ [PrettyPrinter(Value)]);
+do_format_bs_fail(Type, type, Value, PrettyPrinter) ->
+ F = <<"expected a",
+ (case Type of
+ binary ->
+ <<" binary">>;
+ float ->
+ <<" float or an integer">>;
+ integer ->
+ <<"n integer">>;
+ _ ->
+ <<" non-negative integer encodable as ", (atom_to_binary(Type))/binary>>
+ end)/binary, " but got: ~ts">>,
+ io_lib:format(F, [PrettyPrinter(Value)]).
+
+possibly_truncated(Int) when is_integer(Int) ->
+ Bin = integer_to_binary(Int),
+ case byte_size(Bin) of
+ Size when Size < 48 ->
+ Bin;
+ Size ->
+ <<Prefix:12/binary, _:(Size-24)/binary, Suffix/binary>> = Bin,
+ [Prefix, <<"...">>, Suffix]
+ end;
+possibly_truncated(Bin) when is_bitstring(Bin) ->
+ case byte_size(Bin) of
+ Size when Size < 16 ->
+ io_lib:format("~p", [Bin]);
+ Size ->
+ <<Prefix0:8/binary, _:(Size-10)/binary, Suffix0/bitstring>> = Bin,
+ Prefix1 = iolist_to_binary(io_lib:format("~w", [Prefix0])),
+ <<Prefix:(byte_size(Prefix1)-2)/binary,_/binary>> = Prefix1,
+ <<_:2/unit:8,Suffix/binary>> = iolist_to_binary(io_lib:format("~w", [Suffix0])),
+ [Prefix, <<"...,">>, Suffix]
+ end;
+%% possibly_truncated(Value) when is_bitstring(Value) ->
+possibly_truncated(Value) ->
+ io_lib:format("~P", [Value,20]).
+
+%%%
+%%% Utility functions.
+%%%
+
list_to_something(List, Error) ->
try length(List) of
_ ->
diff --git a/lib/kernel/src/erpc.erl b/lib/kernel/src/erpc.erl
index d591fc7025..ce34d1a62f 100644
--- a/lib/kernel/src/erpc.erl
+++ b/lib/kernel/src/erpc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -32,19 +32,27 @@
cast/4,
send_request/2,
send_request/4,
+ send_request/6,
receive_response/1,
receive_response/2,
+ receive_response/3,
wait_response/1,
wait_response/2,
+ wait_response/3,
check_response/2,
+ check_response/3,
multicall/2,
multicall/3,
multicall/4,
multicall/5,
multicast/2,
- multicast/4]).
+ multicast/4,
+ reqids_new/0,
+ reqids_size/1,
+ reqids_add/3,
+ reqids_to_list/1]).
--export_type([request_id/0]).
+-export_type([request_id/0, request_id_collection/0, timeout_time/0]).
%% Internal exports (also used by the 'rpc' module)
@@ -57,14 +65,15 @@
%%------------------------------------------------------------------------
--compile({inline,[{result,4}]}). %% Nicer error stack trace...
+%% Nicer error stack trace...
+-compile({inline,[{result,4},{collection_result,6},{timeout_value,1}]}).
-define(MAX_INT_TIMEOUT, 4294967295).
--define(TIMEOUT_TYPE, 0..?MAX_INT_TIMEOUT | 'infinity').
-define(IS_VALID_TMO_INT(TI_), (is_integer(TI_)
andalso (0 =< TI_)
andalso (TI_ =< ?MAX_INT_TIMEOUT))).
--define(IS_VALID_TMO(T_), ((T_ == infinity) orelse ?IS_VALID_TMO_INT(T_))).
+
+-type timeout_time() :: 0..?MAX_INT_TIMEOUT | 'infinity' | {abs, integer()}.
%%------------------------------------------------------------------------
%% Exported API
@@ -81,7 +90,7 @@ call(N, Fun) ->
-spec call(Node, Fun, Timeout) -> Result when
Node :: node(),
Fun :: function(),
- Timeout :: ?TIMEOUT_TYPE,
+ Timeout :: timeout_time(),
Result :: term().
call(N, Fun, Timeout) when is_function(Fun, 0) ->
@@ -106,7 +115,7 @@ call(N, M, F, A) ->
Module :: atom(),
Function :: atom(),
Args :: [term()],
- Timeout :: ?TIMEOUT_TYPE,
+ Timeout :: timeout_time(),
Result :: term().
call(N, M, F, A, infinity) when node() =:= N, %% Optimize local call
@@ -131,8 +140,8 @@ call(N, M, F, A, infinity) when node() =:= N, %% Optimize local call
call(N, M, F, A, T) when is_atom(N),
is_atom(M),
is_atom(F),
- is_list(A),
- ?IS_VALID_TMO(T) ->
+ is_list(A) ->
+ Timeout = timeout_value(T),
Res = make_ref(),
ReqId = spawn_request(N, ?MODULE, execute_call, [Res, M, F, A],
[{reply, error_only}, monitor]),
@@ -141,7 +150,7 @@ call(N, M, F, A, T) when is_atom(N),
result(spawn_reply, ReqId, Res, Reason);
{'DOWN', ReqId, process, _Pid, Reason} ->
result(down, ReqId, Res, Reason)
- after T ->
+ after Timeout ->
result(timeout, ReqId, Res, undefined)
end;
call(_N, _M, _F, _A, _T) ->
@@ -149,24 +158,34 @@ call(_N, _M, _F, _A, _T) ->
%% Asynchronous call
--opaque request_id() :: {reference(), reference()}.
+-opaque request_id() :: nonempty_improper_list(reference(), reference()).
+-opaque request_id_collection() :: #{ reference() => [reference() | term()] }.
-spec send_request(Node, Fun) -> RequestId when
Node :: node(),
Fun :: function(),
RequestId :: request_id().
-send_request(N, F) when is_function(F, 0) ->
+send_request(N, F) when is_atom(N), is_function(F, 0) ->
send_request(N, erlang, apply, [F, []]);
send_request(_N, _F) ->
error({?MODULE, badarg}).
+-dialyzer({no_improper_lists, send_request/4}).
+
-spec send_request(Node, Module, Function, Args) -> RequestId when
Node :: node(),
Module :: atom(),
Function :: atom(),
Args :: [term()],
- RequestId :: request_id().
+ RequestId :: request_id();
+ (Node, Fun, Label, RequestIdCollection) ->
+ NewRequestIdCollection when
+ Node :: node(),
+ Fun :: function(),
+ Label :: term(),
+ RequestIdCollection :: request_id_collection(),
+ NewRequestIdCollection :: request_id_collection().
send_request(N, M, F, A) when is_atom(N),
is_atom(M),
@@ -175,16 +194,43 @@ send_request(N, M, F, A) when is_atom(N),
Res = make_ref(),
ReqId = spawn_request(N, ?MODULE, execute_call, [Res, M, F, A],
[{reply, error_only}, monitor]),
- {Res, ReqId};
-send_request(_N, _M, _F, _A) ->
+ [Res|ReqId];
+send_request(N, F, L, C) when is_atom(N), is_function(F, 0), is_map(C) ->
+ send_request(N, erlang, apply, [F, []], L, C);
+send_request(_, _, _, _) ->
+ error({?MODULE, badarg}).
+
+-dialyzer({no_improper_lists, send_request/6}).
+
+-spec send_request(Node, Module, Function, Args,
+ Label, RequestIdCollection) ->
+ NewRequestIdCollection when
+ Node :: node(),
+ Module :: atom(),
+ Function :: atom(),
+ Args :: [term()],
+ Label :: term(),
+ RequestIdCollection :: request_id_collection(),
+ NewRequestIdCollection :: request_id_collection().
+
+send_request(N, M, F, A, L, C) when is_atom(N),
+ is_atom(M),
+ is_atom(F),
+ is_list(A),
+ is_map(C) ->
+ Res = make_ref(),
+ ReqId = spawn_request(N, ?MODULE, execute_call, [Res, M, F, A],
+ [{reply, error_only}, monitor]),
+ maps:put(ReqId, [Res|L], C);
+send_request(_N, _M, _F, _A, _L, _C) ->
error({?MODULE, badarg}).
-spec receive_response(RequestId) -> Result when
RequestId :: request_id(),
Result :: term().
-receive_response({Res, ReqId} = RId) when is_reference(Res),
- is_reference(ReqId) ->
+receive_response([Res|ReqId] = RId) when is_reference(Res),
+ is_reference(ReqId) ->
receive_response(RId, infinity);
receive_response(_) ->
error({?MODULE, badarg}).
@@ -193,53 +239,118 @@ receive_response(_) ->
-spec receive_response(RequestId, Timeout) -> Result when
RequestId :: request_id(),
- Timeout :: ?TIMEOUT_TYPE,
+ Timeout :: timeout_time(),
Result :: term().
-receive_response({Res, ReqId}, Tmo) when is_reference(Res),
- is_reference(ReqId),
- ?IS_VALID_TMO(Tmo) ->
+receive_response([Res|ReqId], Tmo) when is_reference(Res),
+ is_reference(ReqId) ->
+ Timeout = timeout_value(Tmo),
receive
{spawn_reply, ReqId, error, Reason} ->
result(spawn_reply, ReqId, Res, Reason);
{'DOWN', ReqId, process, _Pid, Reason} ->
result(down, ReqId, Res, Reason)
- after Tmo ->
+ after Timeout ->
result(timeout, ReqId, Res, undefined)
end;
receive_response(_, _) ->
error({?MODULE, badarg}).
--spec wait_response(RequestId) -> {'response', Result} | 'no_response' when
+-dialyzer([{nowarn_function, receive_response/3}, no_return]).
+
+-spec receive_response(RequestIdCollection, Timeout, Delete) ->
+ {Result, Label, NewRequestIdCollection} | 'no_request' when
+ RequestIdCollection :: request_id_collection(),
+ Timeout :: timeout_time(),
+ Delete :: boolean(),
+ Result :: term(),
+ Label :: term(),
+ NewRequestIdCollection :: request_id_collection().
+
+receive_response(ReqIdCol, WT, Del) when map_size(ReqIdCol) == 0,
+ is_boolean(Del) ->
+ _ = timeout_value(WT),
+ no_request;
+receive_response(ReqIdCol, Tmo, Del) when is_map(ReqIdCol),
+ is_boolean(Del) ->
+ Timeout = timeout_value(Tmo),
+ receive
+ {spawn_reply, ReqId, error, Reason}
+ when is_map_key(ReqId, ReqIdCol), is_reference(ReqId) ->
+ collection_result(spawn_reply, ReqId, Reason, ReqIdCol, false, Del);
+ {'DOWN', ReqId, process, _Pid, Reason}
+ when is_map_key(ReqId, ReqIdCol), is_reference(ReqId) ->
+ collection_result(down, ReqId, Reason, ReqIdCol, false, Del)
+ after Timeout ->
+ collection_result(timeout, ok, ok, ReqIdCol, false, Del)
+ end;
+receive_response(_, _, _) ->
+ error({?MODULE, badarg}).
+
+-spec wait_response(RequestId) ->
+ {'response', Result} | 'no_response' when
RequestId :: request_id(),
Result :: term().
-wait_response({Res, ReqId} = RId) when is_reference(Res),
- is_reference(ReqId) ->
- wait_response(RId, 0).
+wait_response([Res|ReqId] = RId) when is_reference(Res),
+ is_reference(ReqId) ->
+ wait_response(RId, 0);
+wait_response(_) ->
+ error({?MODULE, badarg}).
-dialyzer([{nowarn_function, wait_response/2}, no_return]).
-spec wait_response(RequestId, WaitTime) ->
{'response', Result} | 'no_response' when
RequestId :: request_id(),
- WaitTime :: ?TIMEOUT_TYPE,
+ WaitTime :: timeout_time(),
Result :: term().
-wait_response({Res, ReqId}, WT) when is_reference(Res),
- is_reference(ReqId),
- ?IS_VALID_TMO(WT) ->
+wait_response([Res|ReqId], WT) when is_reference(Res),
+ is_reference(ReqId) ->
+ Timeout = timeout_value(WT),
receive
{spawn_reply, ReqId, error, Reason} ->
result(spawn_reply, ReqId, Res, Reason);
{'DOWN', ReqId, process, _Pid, Reason} ->
{response, result(down, ReqId, Res, Reason)}
- after WT ->
+ after Timeout ->
no_response
end;
wait_response(_, _) ->
error({?MODULE, badarg}).
+-spec wait_response(RequestIdCollection, WaitTime, Delete) ->
+ {{'response', Result}, Label, NewRequestIdCollection} |
+ 'no_response' |
+ 'no_request' when
+ RequestIdCollection :: request_id_collection(),
+ WaitTime :: timeout_time(),
+ Delete :: boolean(),
+ Label :: term(),
+ NewRequestIdCollection :: request_id_collection(),
+ Result :: term().
+
+wait_response(ReqIdCol, WT, Del) when map_size(ReqIdCol) == 0,
+ is_boolean(Del) ->
+ _ = timeout_value(WT),
+ no_request;
+wait_response(ReqIdCol, WT, Del) when is_map(ReqIdCol),
+ is_boolean(Del) ->
+ Timeout = timeout_value(WT),
+ receive
+ {spawn_reply, ReqId, error, Reason}
+ when is_map_key(ReqId, ReqIdCol), is_reference(ReqId) ->
+ collection_result(spawn_reply, ReqId, Reason, ReqIdCol, true, Del);
+ {'DOWN', ReqId, process, _Pid, Reason}
+ when is_map_key(ReqId, ReqIdCol), is_reference(ReqId) ->
+ collection_result(down, ReqId, Reason, ReqIdCol, true, Del)
+ after Timeout ->
+ no_response
+ end;
+wait_response(_, _, _) ->
+ error({?MODULE, badarg}).
+
-dialyzer([{nowarn_function, check_response/2}, no_return]).
-spec check_response(Message, RequestId) ->
@@ -247,21 +358,106 @@ wait_response(_, _) ->
Message :: term(),
RequestId :: request_id(),
Result :: term().
-
+
check_response({spawn_reply, ReqId, error, Reason},
- {Res, ReqId}) when is_reference(Res),
- is_reference(ReqId) ->
+ [Res|ReqId]) when is_reference(Res),
+ is_reference(ReqId) ->
result(spawn_reply, ReqId, Res, Reason);
check_response({'DOWN', ReqId, process, _Pid, Reason},
- {Res, ReqId}) when is_reference(Res),
- is_reference(ReqId) ->
+ [Res|ReqId]) when is_reference(Res),
+ is_reference(ReqId) ->
{response, result(down, ReqId, Res, Reason)};
-check_response(_Msg, {Res, ReqId}) when is_reference(Res),
- is_reference(ReqId) ->
+check_response(_Msg, [Res|ReqId]) when is_reference(Res),
+ is_reference(ReqId) ->
no_response;
check_response(_, _) ->
error({?MODULE, badarg}).
+-spec check_response(Message, RequestIdCollection, Delete) ->
+ {{'response', Result}, Label, NewRequestIdCollection} |
+ 'no_response' |
+ 'no_request' when
+ Message :: term(),
+ RequestIdCollection :: request_id_collection(),
+ Delete :: boolean(),
+ Result :: term(),
+ Label :: term(),
+ NewRequestIdCollection :: request_id_collection().
+
+check_response(_Msg, ReqIdCol, Del) when map_size(ReqIdCol) == 0,
+ is_boolean(Del) ->
+ no_request;
+check_response({spawn_reply, ReqId, error, Reason},
+ ReqIdCol, Del) when is_reference(ReqId),
+ is_map_key(ReqId, ReqIdCol),
+ is_boolean(Del) ->
+ collection_result(spawn_reply, ReqId, Reason, ReqIdCol, true, Del);
+check_response({'DOWN', ReqId, process, _Pid, Reason},
+ ReqIdCol, Del) when is_reference(ReqId),
+ is_map_key(ReqId, ReqIdCol),
+ is_boolean(Del) ->
+ collection_result(down, ReqId, Reason, ReqIdCol, true, Del);
+check_response(_Msg, ReqIdCol, Del) when is_map(ReqIdCol),
+ is_boolean(Del) ->
+ no_response;
+check_response(_, _, _) ->
+ error({?MODULE, badarg}).
+
+-spec reqids_new() ->
+ NewRequestIdCollection::request_id_collection().
+
+reqids_new() ->
+ maps:new().
+
+-spec reqids_size(RequestIdCollection::request_id_collection()) ->
+ non_neg_integer().
+reqids_size(ReqIdCollection) ->
+ try
+ maps:size(ReqIdCollection)
+ catch
+ _:_ ->
+ error({?MODULE, badarg})
+ end.
+
+-dialyzer({no_improper_lists, reqids_add/3}).
+
+-spec reqids_add(RequestId::request_id(), Label::term(),
+ RequestIdCollection::request_id_collection()) ->
+ NewRequestIdCollection::request_id_collection().
+
+reqids_add([_|ReqId], _, ReqIdCollection) when is_reference(ReqId),
+ is_map_key(ReqId,
+ ReqIdCollection) ->
+ error({?MODULE, badarg});
+reqids_add([Res|ReqId], Label, ReqIdCollection) when is_reference(Res),
+ is_reference(ReqId),
+ is_map(ReqIdCollection) ->
+ maps:put(ReqId, [Res|Label], ReqIdCollection);
+reqids_add(_, _, _) ->
+ error({?MODULE, badarg}).
+
+-dialyzer({no_improper_lists, reqids_to_list/1}).
+
+-spec reqids_to_list(RequestIdCollection::request_id_collection()) ->
+ [{RequestId::request_id(), Label::term()}].
+
+reqids_to_list(ReqIdCollection) when is_map(ReqIdCollection) ->
+ try
+ maps:fold(fun (ReqId, [Res|Label], Acc) when is_reference(ReqId),
+ is_reference(Res) ->
+ [{[Res|ReqId], Label}|Acc];
+ (_, _, _) ->
+ throw(badarg)
+ end,
+ [],
+ ReqIdCollection)
+ catch
+ throw:badarg ->
+ error({?MODULE, badarg})
+ end;
+reqids_to_list(_) ->
+ error({?MODULE, badarg}).
+
-type stack_item() ::
{Module :: atom(),
Function :: atom(),
@@ -288,7 +484,7 @@ multicall(Ns, Fun) ->
-spec multicall(Nodes, Fun, Timeout) -> Result when
Nodes :: [atom()],
Fun :: function(),
- Timeout :: ?TIMEOUT_TYPE,
+ Timeout :: timeout_time(),
Result :: term().
multicall(Ns, Fun, Timeout) when is_function(Fun, 0) ->
@@ -311,7 +507,7 @@ multicall(Ns, M, F, A) ->
Module :: atom(),
Function :: atom(),
Args :: [term()],
- Timeout :: ?TIMEOUT_TYPE,
+ Timeout :: timeout_time(),
Result :: [{ok, ReturnValue :: term()} | caught_call_exception()].
multicall(Ns, M, F, A, T) ->
@@ -320,7 +516,8 @@ multicall(Ns, M, F, A, T) ->
true = is_atom(F),
true = is_list(A),
Tag = make_ref(),
- SendState = mcall_send_requests(Tag, Ns, M, F, A, T),
+ Timeout = timeout_value(T),
+ SendState = mcall_send_requests(Tag, Ns, M, F, A, Timeout),
mcall_receive_replies(Tag, SendState)
catch
error:NotIErr when NotIErr /= internal_error ->
@@ -531,6 +728,74 @@ result(timeout, ReqId, Res, _Reason) ->
end
end.
+collection_result(timeout, _, _, ReqIdCollection, _, _) ->
+ Abandon = fun (ReqId, [Res|_Label]) when is_reference(ReqId),
+ is_reference(Res) ->
+ case call_abandon(ReqId) of
+ true ->
+ ok;
+ false ->
+ %% Spawn error or DOWN has arrived if
+ %% ReqId corresponds to an outstanding
+ %% request; fetch and drop it...
+ receive
+ {spawn_reply, ReqId, error, _} ->
+ ok;
+ {'DOWN', ReqId, process, _, _} ->
+ ok
+ after
+ 0 ->
+ ok %% Already handled...
+ end
+ end;
+ (_, _) ->
+ %% Invalid request id collection...
+ throw(badarg)
+ end,
+ try
+ maps:foreach(Abandon, ReqIdCollection)
+ catch
+ throw:badarg -> error({?MODULE, badarg})
+ end,
+ error({?MODULE, timeout});
+collection_result(Type, ReqId, ResultReason, ReqIdCol, WrapResponse, Delete) ->
+ ReqIdInfo = case Delete of
+ true -> maps:take(ReqId, ReqIdCol);
+ false -> {maps:get(ReqId, ReqIdCol), ReqIdCol}
+ end,
+ case ReqIdInfo of
+ {[Res|Label], NewReqIdCol} when is_reference(Res) ->
+ try
+ Result = result(Type, ReqId, Res, ResultReason),
+ Response = if WrapResponse -> {response, Result};
+ true -> Result
+ end,
+ {Response, Label, NewReqIdCol}
+ catch
+ Class:Reason ->
+ erlang:Class({Reason, Label, NewReqIdCol})
+ end;
+ _ ->
+ %% Invalid request id collection...
+ error({?MODULE, badarg})
+ end.
+
+timeout_value(infinity) ->
+ infinity;
+timeout_value(Timeout) when ?IS_VALID_TMO_INT(Timeout) ->
+ Timeout;
+timeout_value({abs, Timeout}) when is_integer(Timeout) ->
+ case Timeout - erlang:monotonic_time(millisecond) of
+ TMO when TMO < 0 ->
+ 0;
+ TMO when TMO > ?MAX_INT_TIMEOUT ->
+ error({?MODULE, badarg});
+ TMO ->
+ TMO
+ end;
+timeout_value(_) ->
+ error({?MODULE, badarg}).
+
deadline(infinity) ->
infinity;
deadline(?MAX_INT_TIMEOUT) ->
@@ -590,7 +855,7 @@ mcall_send_requests(Tag, Ns, M, F, A, Tmo) ->
mcall_send_requests(_Tag, [], M, F, A, RIDs, DL, local_call, NRs) ->
%% Timeout infinity and call on local node wanted;
- %% excecute local call in this process...
+ %% execute local call in this process...
LRes = mcall_local_call(M, F, A),
{ok, RIDs, #{local_call => LRes}, NRs, DL};
mcall_send_requests(_Tag, [], _M, _F, _A, RIDs, DL, _LC, NRs) ->
diff --git a/lib/kernel/src/erts_debug.erl b/lib/kernel/src/erts_debug.erl
index 291af484a5..ae688ee717 100644
--- a/lib/kernel/src/erts_debug.erl
+++ b/lib/kernel/src/erts_debug.erl
@@ -256,6 +256,10 @@ size([H|T]=Term, Seen0, Sum0) ->
{Sum,Seen} = size(H, Seen1, Sum0+2),
size(T, Seen, Sum)
end;
+size({}, Seen0, Sum0) ->
+ %% Tuples of size 0 all points to a constant literal so we count
+ %% them as size zero
+ {Sum0,Seen0};
size(Tuple, Seen0, Sum0) when is_tuple(Tuple) ->
case remember_term(Tuple, Seen0) of
seen -> {Sum0,Seen0};
diff --git a/lib/kernel/src/file_io_server.erl b/lib/kernel/src/file_io_server.erl
index b848e5ef75..691fc00b14 100644
--- a/lib/kernel/src/file_io_server.erl
+++ b/lib/kernel/src/file_io_server.erl
@@ -673,7 +673,7 @@ get_chars_apply(Mod, Func, XtraArg, S0, OutEnc,
end.
%% A hack that tries to inform the caller about the position where the
-%% error occured.
+%% error occurred.
invalid_unicode_error(Mod, Func, XtraArg, S) ->
try
{erl_scan,tokens,_Args} = XtraArg,
diff --git a/lib/kernel/src/gen_sctp.erl b/lib/kernel/src/gen_sctp.erl
index d3582f89e6..b43377905b 100644
--- a/lib/kernel/src/gen_sctp.erl
+++ b/lib/kernel/src/gen_sctp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -30,7 +30,8 @@
-export([open/0, open/1, open/2, close/1]).
-export([listen/2, peeloff/2]).
-export([connect/3, connect/4, connect/5,
- connect_init/3, connect_init/4, connect_init/5]).
+ connect_init/3, connect_init/4, connect_init/5,
+ connectx_init/3, connectx_init/4,connectx_init/5]).
-export([eof/2, abort/2]).
-export([send/3, send/4, recv/1, recv/2]).
-export([error_string/1]).
@@ -357,11 +358,11 @@ do_connect(_S, _SockAddr, _Opts, _Timeout, _ConnWait) ->
badarg.
-do_connect(S, Addr, Port, Opts, Timeout, ConnWait)
+do_connect(S, Addr, Service, Opts, Timeout, ConnWait)
when is_port(S) andalso is_list(Opts) ->
case inet_db:lookup_socket(S) of
{ok,Mod} ->
- case Mod:getserv(Port) of
+ case Mod:getserv(Service) of
{ok,Port} ->
try inet:start_timer(Timeout) of
Timer ->
@@ -389,6 +390,177 @@ do_connect(_S, _Addr, _Port, _Opts, _Timeout, _ConnWait) ->
badarg.
+
+-spec connectx_init(Socket, SockAddrs, Opts) ->
+ {ok, assoc_id()} | {error, inet:posix()} when
+ Socket :: sctp_socket(),
+ SockAddrs:: [{inet:ip_address(), inet:port_number()} |
+ inet:family_address() |
+ socket:sockaddr_in() | socket:sockaddr_in6()],
+ Opts :: [option()].
+%%
+connectx_init(S, SockAddrs, Opts) ->
+ case do_connectx(S, SockAddrs, Opts) of
+ badarg ->
+ erlang:error(badarg, [S, SockAddrs, Opts]);
+ Result ->
+ Result
+ end.
+
+-spec connectx_init(Socket, Addrs, Port, Opts) ->
+ {ok, assoc_id()} | {error, inet:posix()} when
+ Socket :: sctp_socket(),
+ Addrs :: [inet:ip_address() | inet:hostname()],
+ Port :: inet:port_number() | atom(),
+ Opts :: [option()].
+%%
+connectx_init(S, Addrs, Port, Opts) ->
+ connectx_init(S, Addrs, Port, Opts, infinity).
+
+-spec connectx_init(Socket, Addrs, Port, Opts, Timeout) ->
+ {ok, assoc_id()} | {error, inet:posix()} when
+ Socket :: sctp_socket(),
+ Addrs :: [inet:ip_address() | inet:hostname()],
+ Port :: inet:port_number() | atom(),
+ Opts :: [option()],
+ Timeout :: timeout().
+%%
+connectx_init(S, Addrs, Port, Opts, Timeout) ->
+ case do_connectx(S, Addrs, Port, Opts, Timeout) of
+ badarg ->
+ erlang:error(badarg, [S, Addrs, Port, Opts, Timeout]);
+ Result ->
+ Result
+ end.
+
+
+do_connectx(S, SockAddrs, Opts)
+ when is_port(S), is_list(SockAddrs), is_list(Opts) ->
+ case inet_db:lookup_socket(S) of
+ {ok, Mod} ->
+ case ensure_sockaddrs(SockAddrs) of
+ {SockAddrs_1, Port} ->
+ SockAddrs_2 = set_port(SockAddrs_1, Port),
+ Mod:connectx(S, SockAddrs_2, Opts);
+ Error1 ->
+ Error1
+ end;
+ {error, _} = Error2->
+ Error2
+ end;
+do_connectx(_S, _SockAddrs, _Opts) ->
+ badarg.
+
+do_connectx(S, Addrs, Service, Opts, Timeout)
+ when is_port(S), is_list(Addrs), is_list(Opts) ->
+ case inet_db:lookup_socket(S) of
+ {ok,Mod} ->
+ case Mod:getserv(Service) of
+ {ok,Port} ->
+ try inet:start_timer(Timeout) of
+ Timer ->
+ try
+ case getaddrs(Mod, Addrs, Timer) of
+ IPs when is_list(IPs) ->
+ Mod:connectx(S, IPs, Port, Opts);
+ Error1 ->
+ Error1
+ end
+ after
+ _ = inet:stop_timer(Timer)
+ end
+ catch
+ error:badarg ->
+ badarg
+ end;
+ {error, _} = Error2 ->
+ Error2
+ end;
+ {error, _} = Error3 ->
+ Error3
+ end;
+do_connectx(_S, _Addrs, _Port, _Opts, _Timeout) ->
+ badarg.
+
+ensure_sockaddrs(SockAddrs) ->
+ ensure_sockaddrs(SockAddrs, 0, []).
+%%
+ensure_sockaddrs([SockAddr | SockAddrs], Port, Acc) ->
+ case SockAddr of
+ {IP, P} when is_tuple(IP) ->
+ ensure_sockaddrs(SockAddrs, Port, [SockAddr | Acc], P);
+ {Family, {_, P}}
+ when Family =:= inet;
+ Family =:= inet6 ->
+ ensure_sockaddrs(SockAddrs, Port, [SockAddr | Acc], P);
+ #{family := Family}
+ when Family =:= inet;
+ Family =:= inet6 ->
+ SockAddr_1 = inet:ensure_sockaddr(SockAddr),
+ ensure_sockaddrs(
+ SockAddrs, Port, [SockAddr_1 | Acc],
+ maps:get(port, SockAddr_1, 0));
+ _ -> badarg
+ end;
+ensure_sockaddrs([], 0, _) ->
+ badarg;
+ensure_sockaddrs([], Port, Acc) ->
+ {lists:reverse(Acc), Port}.
+%%
+ensure_sockaddrs(SockAddrs, Port, Acc, P) ->
+ if
+ is_integer(P) ->
+ if
+ 0 < P ->
+ ensure_sockaddrs(SockAddrs, P, Acc);
+ P < 0 ->
+ badarg;
+ true ->
+ ensure_sockaddrs(SockAddrs, Port, Acc)
+ end;
+ true ->
+ badarg
+ end.
+
+set_port([SockAddr | SockAddrs], Port) ->
+ case SockAddr of
+ {IP, P} when is_tuple(IP) ->
+ set_port(
+ SockAddrs, Port, SockAddr, P,
+ fun () -> {IP, Port} end);
+ {Family, {Addr, P}} ->
+ set_port(
+ SockAddrs, Port, SockAddr, P,
+ fun () -> {Family, {Addr, Port}} end);
+ #{port := P} ->
+ set_port(
+ SockAddrs, Port, SockAddr, P,
+ fun () -> SockAddr#{port := Port} end)
+ end;
+set_port([], _Port) ->
+ [].
+%%
+set_port(SockAddrs, Port, SockAddr, P, NewSockAddrFun) ->
+ [case P of
+ Port -> SockAddr;
+ _ -> NewSockAddrFun()
+ end | set_port(SockAddrs, Port)].
+
+getaddrs(Mod, Addrs, Timer) ->
+ getaddrs(Mod, Addrs, Timer, []).
+%%
+getaddrs(Mod, [Addr | Addrs], Timer, Acc) ->
+ case Mod:getaddr(Addr, Timer) of
+ {ok, IP} ->
+ getaddrs(Mod, Addrs, Timer, [IP | Acc]);
+ {error, _} ->
+ badarg
+ end;
+getaddrs(_Mod, [], _Timer, Acc) ->
+ lists:reverse(Acc).
+
+
+
-spec eof(Socket, Assoc) -> ok | {error, Reason} when
Socket :: sctp_socket(),
Assoc :: #sctp_assoc_change{},
diff --git a/lib/kernel/src/gen_tcp_socket.erl b/lib/kernel/src/gen_tcp_socket.erl
index 62c0150679..a887726e0f 100644
--- a/lib/kernel/src/gen_tcp_socket.erl
+++ b/lib/kernel/src/gen_tcp_socket.erl
@@ -1446,7 +1446,7 @@ handle_event({call, From}, {setopts, Opts}, State, {P, D}) ->
%% we are in state 'recv' but are inactive is simply stored in the buffer.
%% If activated: active: false -> once | true | N > 0
%% We need to check if there is something in our buffers, and maybe deliver
- %% it to its owner. This is what we do here. This should only occure
+ %% it to its owner. This is what we do here. This should only occur
%% if we are in state connected (state 'recv' and in-active when data
%% arrives => put data in buffer and then enter state 'connected', since
%% we are in-active).
diff --git a/lib/kernel/src/gen_udp_socket.erl b/lib/kernel/src/gen_udp_socket.erl
index 505dfea4ef..eb751efa72 100644
--- a/lib/kernel/src/gen_udp_socket.erl
+++ b/lib/kernel/src/gen_udp_socket.erl
@@ -444,7 +444,7 @@ do_sendmsg(?MODULE_socket(_Server, Socket), SockAddr, IOV, Ctrl)
recv(Socket, Length) ->
recv(Socket, Length, infinity).
-%% This is a bit wierd. If two calls to recv is made with short intervalls
+%% This is a bit weird. If two calls to recv is made with short intervals
%% from different processes, with say timeout 10s and then 5s. The second
%% call will be postponed until the first has been processed, which can
%% take up to 10s. If the first times out (after 10s) the second is
@@ -839,7 +839,7 @@ socket_getopt_opt(Socket, Opt, Tag) ->
%% Its possible for *one* option to be mapped to several 'socket' options.
%% But, its *always* the first element in th elist that is the "real"
-%% option. This is the one used when *reading*. The other elemnts in the list
+%% option. This is the one used when *reading*. The other elements in the list
%% is basically side effect options, which is not used when reading.
socket_getopt_opts([{_Domain, _} = Opt|_], Socket, Tag) ->
socket_getopt_opt(Socket, Opt, Tag);
@@ -1703,7 +1703,7 @@ handle_recv_error(P, D, ActionsR, Reason) ->
{next_state, 'open',
{P, recv_stop(D#{active := false})}, reverse(ActionsR_1)};
_ ->
- %% Temporary ... need somthing better here...maybe
+ %% Temporary ... need something better here...maybe
{next_state, 'open',
{P, recv_stop(D#{active := false})}, reverse(ActionsR_1)}
end.
diff --git a/lib/kernel/src/global.erl b/lib/kernel/src/global.erl
index 17d7b0f396..8a87e382fb 100644
--- a/lib/kernel/src/global.erl
+++ b/lib/kernel/src/global.erl
@@ -275,9 +275,9 @@ register_name(Name, Pid, Method0) when is_pid(Pid) ->
Fun = fun(Nodes) ->
case (where(Name) =:= undefined) andalso check_dupname(Name, Pid) of
true ->
- gen_server:multi_call(Nodes,
- global_name_server,
- {register, Name, Pid, Method}),
+ _ = gen_server:multi_call(Nodes,
+ global_name_server,
+ {register, Name, Pid, Method}),
yes;
_ ->
no
@@ -310,9 +310,9 @@ unregister_name(Name) ->
ok;
_ ->
Fun = fun(Nodes) ->
- gen_server:multi_call(Nodes,
- global_name_server,
- {unregister, Name}),
+ _ = gen_server:multi_call(Nodes,
+ global_name_server,
+ {unregister, Name}),
ok
end,
?trace({unregister_name, self(), Name}),
@@ -332,9 +332,9 @@ re_register_name(Name, Pid) when is_pid(Pid) ->
re_register_name(Name, Pid, Method0) when is_pid(Pid) ->
Method = allow_tuple_fun(Method0),
Fun = fun(Nodes) ->
- gen_server:multi_call(Nodes,
- global_name_server,
- {register, Name, Pid, Method}),
+ _ = gen_server:multi_call(Nodes,
+ global_name_server,
+ {register, Name, Pid, Method}),
yes
end,
?trace({re_register_name, self(), Name, Pid, Method}),
@@ -368,10 +368,10 @@ register_name_external(Name, Pid, Method) when is_pid(Pid) ->
Fun = fun(Nodes) ->
case where(Name) of
undefined ->
- gen_server:multi_call(Nodes,
- global_name_server,
- {register_ext, Name, Pid,
- Method, node()}),
+ _ = gen_server:multi_call(Nodes,
+ global_name_server,
+ {register_ext, Name, Pid,
+ Method, node()}),
yes;
_Pid -> no
end
@@ -432,7 +432,7 @@ del_lock(Id) ->
Nodes :: [node()].
del_lock({_ResourceId, _LockRequesterId} = Id, Nodes) ->
?trace({del_lock, {me,self()}, Id, {nodes,Nodes}}),
- gen_server:multi_call(Nodes, global_name_server, {del_lock, Id}),
+ _ = gen_server:multi_call(Nodes, global_name_server, {del_lock, Id}),
true.
-type trans_fun() :: function() | {module(), atom()}.
@@ -513,7 +513,7 @@ init([]) ->
prevent_overlapping_partitions,
Invalid});
undefined ->
- false
+ true
end,
S = #state{the_locker = start_the_locker(DoTrace),
trace = T0,
@@ -1270,7 +1270,8 @@ check_replies([{_Node, false=Reply} | _T], _Id, [_]) ->
check_replies([{_Node, false=Reply} | _T], Id, Replies) ->
TrueReplyNodes = [N || {N, true} <- Replies],
?trace({check_replies, {true_reply_nodes, TrueReplyNodes}}),
- gen_server:multi_call(TrueReplyNodes, global_name_server, {del_lock, Id}),
+ _ = gen_server:multi_call(
+ TrueReplyNodes, global_name_server, {del_lock, Id}),
Reply;
check_replies([], _Id, _Replies) ->
true.
diff --git a/lib/kernel/src/global_group.erl b/lib/kernel/src/global_group.erl
index c288fdde26..bb843a302c 100644
--- a/lib/kernel/src/global_group.erl
+++ b/lib/kernel/src/global_group.erl
@@ -71,7 +71,7 @@
%%%====================================================================================
%%% The state of the global_group process
%%%
-%%% sync_state = no_conf (global_groups not defined, inital state) |
+%%% sync_state = no_conf (global_groups not defined, initial state) |
%%% synced
%%% group_name = Own global group name
%%% nodes = Nodes in the own global group
@@ -219,9 +219,9 @@ request(Req, Time) ->
%%% at release upgrade when all nodes are not yet upgraded.
%%%
%%% It is possible to manually force a sync of the global_group. This is done for
-%%% instance after a release upgrade, after all nodes in the group beeing upgraded.
+%%% instance after a release upgrade, after all nodes in the group being upgraded.
%%% The nodes are not synced automatically because it would cause the node to be
-%%% disconnected from those not yet beeing upgraded.
+%%% disconnected from those not yet being upgraded.
%%%
%%% The three process dictionary variables (registered_names, send, and whereis_name)
%%% are used to store information needed if the search process crashes.
@@ -281,7 +281,7 @@ init([]) ->
%%% sync() -> ok
%%%
%%% An operator ordered sync of the own global group. This must be done after
-%%% a release upgrade. It can also be ordered if somthing has made the nodes
+%%% a release upgrade. It can also be ordered if something has made the nodes
%%% to disagree of the global_groups definition.
%%%====================================================================================
handle_call(sync, _From, S) ->
@@ -525,7 +525,7 @@ handle_call({global_groups_changed, NewPara}, _From, S) ->
%% group) global is not going to be synced to these nodes. We disconnect instead
%% of connect because upgrades can be done node by node and we cannot really
%% know what nodes these new nodes are synced to. The operator can always
- %% manually force a sync of the nodes after all nodes beeing uppgraded.
+ %% manually force a sync of the nodes after all nodes being uppgraded.
%% We must disconnect also if some nodes to which we have a connection
%% will not be in any global group at all.
force_nodedown(nodes(connected) -- NewNodes),
diff --git a/lib/kernel/src/heart.erl b/lib/kernel/src/heart.erl
index ffd9fd668a..dadcfaea0e 100644
--- a/lib/kernel/src/heart.erl
+++ b/lib/kernel/src/heart.erl
@@ -370,7 +370,7 @@ check_system([?SCHEDULER_CHECK_OPT|Opts]) ->
%% return 'ok' if everything is alright.
%% Terminate if with reason if something is a miss.
%% It is fine to timeout in the callback, in fact that is the intention
-%% if something goes wront -> no heartbeat.
+%% if something goes wrong -> no heartbeat.
check_callback(Callback) ->
case Callback of
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index 16bdc8e099..6ccf251372 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -32,7 +32,8 @@
ifget/3, ifget/2, ifset/3, ifset/2,
getstat/1, getstat/2,
info/1, socket_to_list/1,
- ip/1, stats/0, options/0,
+ ip/1, is_ipv4_address/1, is_ipv6_address/1, is_ip_address/1,
+ stats/0, options/0,
pushf/3, popf/1, close/1, gethostname/0, gethostname/1,
parse_ipv4_address/1, parse_ipv6_address/1, parse_ipv4strict_address/1,
parse_ipv6strict_address/1, parse_address/1, parse_strict_address/1,
@@ -754,6 +755,25 @@ ip(Name) ->
Error -> Error
end.
+-spec is_ipv4_address(IPv4Address) -> boolean() when
+ IPv4Address :: ip4_address() | term().
+is_ipv4_address({A,B,C,D}) when ?ip(A,B,C,D) ->
+ true;
+is_ipv4_address(_) ->
+ false.
+
+-spec is_ipv6_address(IPv6Address) -> boolean() when
+ IPv6Address :: ip6_address() | term().
+is_ipv6_address({A,B,C,D,E,F,G,H}) when ?ip6(A,B,C,D,E,F,G,H) ->
+ true;
+is_ipv6_address(_) ->
+ false.
+
+-spec is_ip_address(IPAddress) -> boolean() when
+ IPAddress :: ip_address() | term().
+is_ip_address(Address) ->
+ is_ipv4_address(Address) orelse is_ipv6_address(Address).
+
%% This function returns the erlang port used (with inet_drv)
-spec getll(Socket :: socket()) -> {'ok', socket()}.
@@ -1752,7 +1772,7 @@ open_bind(
open_fd(Fd, BAddr, BPort, Opts, Protocol, Family, Type, Module) ->
DoNotBind =
%% We do not do any binding if no port+addr options
- %% were given, in order to keep backwards compatability
+ %% were given, in order to keep backwards compatibility
%% with pre Erlang/OTP 17
BAddr =:= undefined, % Presumably already bound
if
@@ -2289,4 +2309,8 @@ lock_socket(S,Val) ->
ensure_sockaddr(SockAddr) ->
- prim_socket:enc_sockaddr(SockAddr).
+ try prim_socket:enc_sockaddr(SockAddr)
+ catch
+ throw : {invalid, _} = Invalid : Stacktrace ->
+ erlang:raise(error, Invalid, Stacktrace)
+ end.
diff --git a/lib/kernel/src/inet6_sctp.erl b/lib/kernel/src/inet6_sctp.erl
index 0e04088736..6e3d2ad26e 100644
--- a/lib/kernel/src/inet6_sctp.erl
+++ b/lib/kernel/src/inet6_sctp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@
-include("inet_int.hrl").
-export([getserv/1, getaddr/1, getaddr/2, translate_ip/1]).
--export([open/1, close/1, listen/2, peeloff/2, connect/4, connect/5]).
+-export([open/1, close/1, listen/2, peeloff/2, connect/4, connect/5, connectx/3, connectx/4]).
-export([sendmsg/3, send/4, recv/2]).
-define(PROTO, sctp).
@@ -81,6 +81,12 @@ connect(S, SockAddr, Opts, Timer) ->
connect(S, Addr, Port, Opts, Timer) ->
inet_sctp:connect(S, Addr, Port, Opts, Timer).
+connectx(S, SockAddrs, Opts) ->
+ inet_sctp:connectx(S, SockAddrs, Opts).
+
+connectx(S, Addr, Port, Opts) ->
+ inet_sctp:connectx(S, Addr, Port, Opts).
+
sendmsg(S, SRI, Data) ->
prim_inet:sendmsg(S, SRI, Data).
diff --git a/lib/kernel/src/inet_config.erl b/lib/kernel/src/inet_config.erl
index c1ff478cc2..3b4c4287bc 100644
--- a/lib/kernel/src/inet_config.erl
+++ b/lib/kernel/src/inet_config.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -213,7 +213,7 @@ add_dns_lookup([],Acc) ->
%%
%% Set the hostname (SHORT)
%% If hostname is long use the suffix as default domain
-%% and initalize the search option with the parts of domain
+%% and initialize the search option with the parts of domain
%%
set_hostname() ->
case inet_udp:open(0,[]) of
diff --git a/lib/kernel/src/inet_db.erl b/lib/kernel/src/inet_db.erl
index e2d9b25868..87b272a44b 100644
--- a/lib/kernel/src/inet_db.erl
+++ b/lib/kernel/src/inet_db.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -67,11 +67,11 @@
-export([res_option/1, res_option/2, res_check_option/2]).
-export([socks_option/1]).
-export([getbyname/2, get_searchlist/0]).
--export([gethostbyaddr/1]).
--export([res_gethostbyaddr/2,res_hostent_by_domain/3]).
+-export([gethostbyaddr/2]).
+-export([res_gethostbyaddr/3,res_hostent_by_domain/3]).
-export([res_update_conf/0, res_update_hosts/0]).
%% inet help functions
--export([tolower/1]).
+-export([tolower/1, eq_domains/2]).
-ifdef(DEBUG).
-define(dbg(Fmt, Args), io:format(Fmt, Args)).
-else.
@@ -308,7 +308,7 @@ translate_lookup([]) -> [].
valid_lookup() -> [dns, file, yp, nis, nisplus, native].
-%% Reconstruct an inetrc sturcture from inet_db
+%% Reconstruct an inetrc structure from inet_db
get_rc() ->
get_rc([hosts, domain, nameservers, search, alt_nameservers,
timeout, retry, servfail_retry_timeout, inet6, usevc,
@@ -498,7 +498,7 @@ res_check_option(nameservers, NSs) ->
res_check_option(alt_nameservers, NSs) ->
res_check_list(NSs, fun res_check_ns/1);
res_check_option(domain, Dom) ->
- inet_parse:visible_string(Dom);
+ Dom =:= "" orelse inet_parse:visible_string(Dom);
res_check_option(lookup, Methods) ->
try lists_subtract(Methods, valid_lookup()) of
[] -> true;
@@ -584,19 +584,35 @@ db_get(Name) ->
end.
add_rr(RR) ->
- call({add_rr, RR}).
+ %% Questionable if we need to support this;
+ %% not used by OTP
+ %%
+ res_cache_answer([RR]).
add_rr(Domain, Class, Type, TTL, Data) ->
- call({add_rr, dns_rr_add(Domain, Class, Type, TTL, Data)}).
+ %% Only used from a test suite within OTP,
+ %% can be optimized to create the whole record inline
+ %% and call {add_rrs, [RR]} directly
+ RR =
+ #dns_rr{
+ domain = Domain, class = Class, type = Type,
+ ttl = TTL, data = Data},
+ res_cache_answer([RR]).
del_rr(Domain, Class, Type, Data) ->
- call({del_rr, dns_rr_match(Domain, Class, Type, Data)}).
-
-res_cache_answer(Rec) ->
- lists:foreach( fun(RR) -> add_rr(RR) end, Rec#dns_rec.anlist).
+ call({del_rr, dns_rr_match(tolower(Domain), Class, Type, Data)}).
-
+res_cache_answer(RRs) ->
+ TM = times(),
+ call(
+ {add_rrs,
+ [RR#dns_rr{
+ bm = tolower(RR#dns_rr.domain), tm = TM, cnt = TM}
+ || #dns_rr{ttl = TTL} = RR <- RRs,
+ %% Do not cache TTL 0 entries - they are only used
+ %% to resolve the current lookup
+ 0 < TTL]}).
%%
%% getbyname (cache version)
@@ -638,6 +654,34 @@ get_searchlist() ->
end.
+%%
+%% hostent_by_domain (cache version)
+%%
+hostent_by_domain(Domain, Type) ->
+ ?dbg("hostent_by_domain: ~p~n", [Domain]),
+ case resolve_cnames(stripdot(Domain), Type, fun lookup_cache_data/2) of
+ {error, _} = Error ->
+ Error;
+ {D, Addrs, Aliases} ->
+ {ok, make_hostent(D, Addrs, Aliases, Type)}
+ end.
+
+%%
+%% hostent_by_domain (newly resolved version)
+%% match data field directly and cache RRs.
+%%
+res_hostent_by_domain(Domain, Type, Rec) ->
+ RRs = res_filter_rrs(Type, Rec#dns_rec.anlist),
+ ?dbg("res_hostent_by_domain: ~p - ~p~n", [Domain, RRs]),
+ LookupFun = res_lookup_fun(RRs),
+ case resolve_cnames(stripdot(Domain), Type, LookupFun) of
+ {error, _} = Error ->
+ Error;
+ {D, Addrs, Aliases} ->
+ res_cache_answer(RRs),
+ {ok, make_hostent(D, Addrs, Aliases, Type)}
+ end.
+
make_hostent(Name, Addrs, Aliases, ?S_A) ->
#hostent {
h_name = Name,
@@ -664,149 +708,114 @@ make_hostent(Name, Datas, Aliases, Type) ->
h_aliases = Aliases
}.
-hostent_by_domain(Domain, Type) ->
- ?dbg("hostent_by_domain: ~p~n", [Domain]),
- hostent_by_domain(stripdot(Domain), [], [], Type).
-hostent_by_domain(Domain, Aliases, LAliases, Type) ->
- case lookup_type(Domain, Type) of
- [] ->
- case lookup_cname(Domain) of
- [] ->
- {error, nxdomain};
- [CName | _] ->
- LDomain = tolower(Domain),
- case lists:member(CName, [LDomain | LAliases]) of
- true ->
- {error, nxdomain};
- false ->
- hostent_by_domain(CName, [Domain | Aliases],
- [LDomain | LAliases], Type)
- end
- end;
- Addrs ->
- {ok, make_hostent(Domain, Addrs, Aliases, Type)}
- end.
-
-%% lookup address record
-lookup_type(Domain, Type) ->
- [R#dns_rr.data || R <- lookup_rr(Domain, in, Type) ].
-%% lookup canonical name
-lookup_cname(Domain) ->
- [R#dns_rr.data || R <- lookup_rr(Domain, in, ?S_CNAME) ].
+res_filter_rrs(Type, RRs) ->
+ [RR#dns_rr{bm = tolower(N)} ||
+ #dns_rr{
+ domain = N,
+ class = in,
+ type = T} = RR <- RRs,
+ T =:= Type orelse T =:= ?S_CNAME].
-lookup_cname(Domain, Type) ->
- case Type of
- a -> [];
- aaaa -> [];
- cname -> lookup_cname(Domain);
- _ -> []
+res_lookup_fun(RRs) ->
+ fun (LcDomain, Type) ->
+ [Data
+ || #dns_rr{bm = LcD, type = T, data = Data}
+ <- RRs,
+ LcD =:= LcDomain,
+ T =:= Type]
end.
-%% lookup resource record
-lookup_rr(Domain, Class, Type) ->
- match_rr(dns_rr_match(tolower(Domain), Class, Type)).
-
-%%
-%% hostent_by_domain (newly resolved version)
-%% match data field directly and cache RRs.
-%%
-res_hostent_by_domain(Domain, Type, Rec) ->
- RRs = lists:map(fun lower_rr/1, Rec#dns_rec.anlist),
- res_cache_answer(Rec#dns_rec{anlist = RRs}),
- ?dbg("res_hostent_by_domain: ~p - ~p~n", [Domain, RRs]),
- res_hostent_by_domain(stripdot(Domain), [], [], Type, RRs).
-
-res_hostent_by_domain(Domain, Aliases, LAliases, Type, RRs) ->
- LDomain = tolower(Domain),
- case res_lookup_type(LDomain, Type, RRs) of
- [] ->
- case res_lookup_type(LDomain, ?S_CNAME, RRs) of
- [] ->
- {error, nxdomain};
- [CName | _] ->
- case lists:member(tolower(CName), [LDomain | LAliases]) of
- true ->
- {error, nxdomain};
- false ->
- res_hostent_by_domain(CName, [Domain | Aliases],
- [LDomain | LAliases], Type,
- RRs)
- end
- end;
- Addrs ->
- {ok, make_hostent(Domain, Addrs, Aliases, Type)}
+resolve_cnames(Domain, Type, LookupFun) ->
+ resolve_cnames(Domain, Type, LookupFun, tolower(Domain), [], []).
+
+resolve_cnames(Domain, Type, LookupFun, LcDomain, Aliases, LcAliases) ->
+ case LookupFun(LcDomain, Type) of
+ [] ->
+ case LookupFun(LcDomain, ?S_CNAME) of
+ [] ->
+ %% Did not find neither Type nor CNAME record
+ {error, nxdomain};
+ [CName] ->
+ LcCname = tolower(CName),
+ case lists:member(LcCname, [LcDomain | LcAliases]) of
+ true ->
+ %% CNAME loop
+ {error, nxdomain};
+ false ->
+ %% Repeat with the (more) canonical domain name
+ resolve_cnames(
+ CName, Type, LookupFun, LcCname,
+ [Domain | Aliases], [LcDomain, LcAliases])
+ end;
+ [_ | _] = _CNames ->
+ ?dbg("resolve_cnames duplicate cnames=~p~n", [_CNames]),
+ {error, nxdomain}
+ end;
+ [_ | _] = Results ->
+ {Domain, Results, Aliases}
end.
-%% newly resolved lookup address record
-res_lookup_type(Domain,Type,RRs) ->
- [R#dns_rr.data || R <- RRs,
- R#dns_rr.domain =:= Domain,
- R#dns_rr.type =:= Type].
%%
%% gethostbyaddr (cache version)
%% match data field directly
%%
-gethostbyaddr(IP) ->
- case dnip(IP) of
- {ok, {IP1, HType, HLen, DnIP}} ->
- RRs = match_rr(dns_rr_match(DnIP, in, ptr)),
- ent_gethostbyaddr(RRs, IP1, HType, HLen);
- Error -> Error
+gethostbyaddr(Domain, IP) ->
+ ?dbg("gethostbyaddr: ~p~n", [IP]),
+ case resolve_cnames(Domain, ?S_PTR, fun lookup_cache_data/2) of
+ {error, _} = Error ->
+ Error;
+ {_D, Domains, _Aliases} ->
+ ent_gethostbyaddr(Domains, IP)
end.
%%
%% res_gethostbyaddr (newly resolved version)
%% match data field directly and cache RRs.
%%
-res_gethostbyaddr(IP, Rec) ->
- {ok, {IP1, HType, HLen}} = dnt(IP),
- RRs = lists:map(fun lower_rr/1, Rec#dns_rec.anlist),
- res_cache_answer(Rec#dns_rec{anlist = RRs}),
- ent_gethostbyaddr(Rec#dns_rec.anlist, IP1, HType, HLen).
-
-ent_gethostbyaddr(RRs, IP, AddrType, Length) ->
- case RRs of
- [] -> {error, nxdomain};
- [RR|TR] ->
- %% debug
- if TR =/= [] ->
- ?dbg("gethostbyaddr found extra=~p~n", [TR]);
- true -> ok
- end,
- Type = RR#dns_rr.type,
- Domain = RR#dns_rr.data,
- H = #hostent { h_name = Domain,
- h_aliases = lookup_cname(Domain, Type),
- h_addr_list = [IP],
- h_addrtype = AddrType,
- h_length = Length },
- {ok, H}
- end.
-
-dnip(IP) ->
- case dnt(IP) of
- {ok,{IP1 = {A,B,C,D}, inet, HLen}} ->
- {ok,{IP1, inet, HLen, dn_in_addr_arpa(A,B,C,D)}};
- {ok,{IP1 = {A,B,C,D,E,F,G,H}, inet6, HLen}} ->
- {ok,{IP1, inet6, HLen, dn_ip6_int(A,B,C,D,E,F,G,H)}};
- _ ->
- {error, formerr}
+res_gethostbyaddr(Domain, IP, Rec) ->
+ RRs = res_filter_rrs(?S_PTR, Rec#dns_rec.anlist),
+ ?dbg("res_gethostbyaddr: ~p - ~p~n", [IP, RRs]),
+ LookupFun = res_lookup_fun(RRs),
+ case resolve_cnames(Domain, ?S_PTR, LookupFun) of
+ {error, _} = Error ->
+ Error;
+ {_D, Domains, _Aliases} ->
+ case ent_gethostbyaddr(Domains, IP) of
+ {ok, _HEnt} = Result ->
+ res_cache_answer(RRs),
+ Result;
+ {error, _} = Error ->
+ Error
+ end
end.
+ent_gethostbyaddr([Domain], IP) ->
+ HEnt =
+ if
+ tuple_size(IP) =:= 4 ->
+ #hostent{
+ h_name = Domain,
+ h_aliases = [],
+ h_addr_list = [IP],
+ h_addrtype = inet,
+ h_length = 4};
+ tuple_size(IP) =:= 8 ->
+ #hostent{
+ h_name = Domain,
+ h_aliases = [],
+ h_addr_list = [IP],
+ h_addrtype = inet6,
+ h_length = 16}
+ end,
+ {ok, HEnt};
+ent_gethostbyaddr([_ | _] = _Domains, _IP) ->
+ ?dbg("gethostbyaddr duplicate domains=~p~n", [_Domains]),
+ {error, nxdomain}.
-dnt(IP = {A,B,C,D}) when ?ip(A,B,C,D) ->
- {ok, {IP, inet, 4}};
-dnt({0,0,0,0,0,16#ffff,G,H}) when is_integer(G+H) ->
- A = G div 256, B = G rem 256, C = H div 256, D = H rem 256,
- {ok, {{A,B,C,D}, inet, 4}};
-dnt(IP = {A,B,C,D,E,F,G,H}) when ?ip6(A,B,C,D,E,F,G,H) ->
- {ok, {IP, inet6, 16}};
-dnt(_) ->
- {error, formerr}.
%%
%% Register socket Modules
@@ -890,7 +899,7 @@ take_socket_type(MRef) ->
%% --------------------
%% {node_auth,N} Ls - List of authentication for node N
%% {node_crypt,N} Ls - List of encryption methods for node N
-%% node_auth Ls - Default authenication
+%% node_auth Ls - Default authentication
%% node_crypt Ls - Default encryption
%%
%% Socket type (used for socket monitors)
@@ -911,7 +920,7 @@ init([]) ->
end,
Db = ets:new(inet_db, [public, named_table]),
reset_db(Db),
- CacheOpts = [public, bag, {keypos,#dns_rr.domain}, named_table],
+ CacheOpts = [public, bag, {keypos,#dns_rr.bm}, named_table],
Cache = ets:new(inet_cache, CacheOpts),
HostsByname = ets:new(inet_hosts_byname, [named_table]),
HostsByaddr = ets:new(inet_hosts_byaddr, [named_table]),
@@ -999,10 +1008,9 @@ handle_call(Request, From, #state{db=Db}=State) ->
IP),
{reply, ok, State};
- {add_rr, RR} when is_record(RR, dns_rr) ->
- ?dbg("add_rr: ~p~n", [RR]),
- do_add_rr(RR, Db, State),
- {reply, ok, State};
+ {add_rrs, RRs} ->
+ ?dbg("add_rrs: ~p~n", [RRs]),
+ {reply, do_add_rrs(RRs, Db, State), State};
{del_rr, RR} when is_record(RR, dns_rr) ->
Cache = State#state.cache,
@@ -1197,7 +1205,7 @@ handle_call(Request, From, #state{db=Db}=State) ->
Reply = handle_put_socket_type(State#state.sockets, MRef, Type),
{reply, Reply, State};
- %% Take (in the 'maps' sence of the word) the socket type of
+ %% Take (in the 'maps' sense of the word) the socket type of
%% this socket monitor (reference).
{take_socket_type, MRef} ->
Reply = handle_take_socket_type(State#state.sockets, MRef),
@@ -1646,35 +1654,40 @@ is_reqname(_) -> false.
%% #dns_rr.cnt is used to store the access time
%% instead of number of accesses.
%%
-do_add_rr(RR, Db, State) ->
+do_add_rrs(RRs, Db, State) ->
CacheDb = State#state.cache,
- TM = times(),
- case alloc_entry(Db, CacheDb, TM) of
+ do_add_rrs(RRs, Db, State, CacheDb).
+
+do_add_rrs([], _Db, _State, _CacheDb) ->
+ ok;
+do_add_rrs([RR | RRs], Db, State, CacheDb) ->
+ case alloc_entry(Db, CacheDb, #dns_rr.tm) of
true ->
%% Add to cache
+ %%
#dns_rr{
- domain = Domain, class = Class, type = Type,
+ bm = LcDomain, class = Class, type = Type,
data = Data} = RR,
DeleteRRs =
ets:match_object(
- CacheDb, dns_rr_match(Domain, Class, Type, Data)),
- InsertRR = RR#dns_rr{tm = TM, cnt = TM},
+ CacheDb, dns_rr_match(LcDomain, Class, Type, Data)),
%% Insert before delete to always have an RR present.
%% Watch out to not delete what we insert.
- case lists:member(InsertRR, DeleteRRs) of
+ case lists:member(RR, DeleteRRs) of
true ->
_ = [ets:delete_object(CacheDb, DelRR) ||
DelRR <- DeleteRRs,
- DelRR =/= InsertRR],
- true;
+ DelRR =/= RR],
+ ok;
false ->
- ets:insert(CacheDb, InsertRR),
+ ets:insert(CacheDb, RR),
_ = [ets:delete_object(CacheDb, DelRR) ||
DelRR <- DeleteRRs],
- true
- end;
+ ok
+ end,
+ do_add_rrs(RRs, Db, State, CacheDb);
false ->
- false
+ ok
end.
@@ -1698,34 +1711,30 @@ dns_rr_match_cnt(Cnt) ->
domain = '_', class = '_', type = '_', data = '_',
cnt = Cnt, tm = '_', ttl = '_', bm = '_', func = '_'}.
%%
-dns_rr_match(Domain, Class, Type) ->
+dns_rr_match(LcDomain, Class, Type) ->
#dns_rr{
- domain = Domain, class = Class, type = Type, data = '_',
- cnt = '_', tm = '_', ttl = '_', bm = '_', func = '_'}.
+ domain = '_', class = Class, type = Type, data = '_',
+ cnt = '_', tm = '_', ttl = '_', bm = LcDomain, func = '_'}.
%%
-dns_rr_match(Domain, Class, Type, Data) ->
+dns_rr_match(LcDomain, Class, Type, Data) ->
#dns_rr{
- domain = Domain, class = Class, type = Type, data = Data,
- cnt = '_', tm = '_', ttl = '_', bm = '_', func = '_'}.
+ domain = '_', class = Class, type = Type, data = Data,
+ cnt = '_', tm = '_', ttl = '_', bm = LcDomain, func = '_'}.
-%% RR creation
--compile({inline, [dns_rr_add/5]}).
-%%
-dns_rr_add(Domain, Class, Type, TTL, Data) ->
- #dns_rr{
- domain = Domain, class = Class, type = Type,
- ttl = TTL, data = Data}.
+lookup_cache_data(LcDomain, Type) ->
+ [Data
+ || #dns_rr{data = Data}
+ <- match_rr(dns_rr_match(LcDomain, in, Type))].
%% We are simultaneously updating the table from all clients
-%% and the server, so we might get duplicate recource records
+%% and the server, so we might get duplicate resource records
%% in the table, i.e identical domain, class, type and data.
%% We embrace that and eliminate duplicates here.
%%
%% Look up all matching objects. The still valid ones
%% should be returned, and updated with a new cnt time.
-%% All expired ones should be deleted. We count TTL 0
-%% RRs as valid but immediately expired.
+%% All expired ones should be deleted.
%%
match_rr(MatchRR) ->
CacheDb = inet_cache,
@@ -1742,12 +1751,6 @@ match_rr(CacheDb, [RR | RRs], Time, ResultRRs, InsertRRs, DeleteRRs) ->
%%
#dns_rr{ttl = TTL, tm = TM, cnt = Cnt} = RR,
if
- TTL =:= 0 ->
- %% Valid, immediately expired; return and delete
- Key = match_rr_key(RR),
- match_rr(
- CacheDb, RRs, Time,
- ResultRRs#{Key => RR}, InsertRRs, [RR | DeleteRRs]);
TM + TTL < Time ->
%% Expired, delete
match_rr(
@@ -1774,16 +1777,10 @@ match_rr(CacheDb, [RR | RRs], Time, ResultRRs, InsertRRs, DeleteRRs) ->
-compile({inline, [match_rr_key/1]}).
match_rr_key(
- #dns_rr{domain = Domain, class = Class, type = Type, data = Data}) ->
- {Domain, Class, Type, Data}.
+ #dns_rr{bm = LcDomain, class = Class, type = Type, data = Data}) ->
+ {LcDomain, Class, Type, Data}.
-%% Lowercase the domain name before storage.
-%%
-lower_rr(#dns_rr{domain=Domain}=RR) when is_list(Domain) ->
- RR#dns_rr { domain = tolower(Domain) };
-lower_rr(RR) -> RR.
-
%%
%% Case fold upper-case to lower-case according to RFC 4343
%% "Domain Name System (DNS) Case Insensitivity Clarification".
@@ -1792,32 +1789,70 @@ lower_rr(RR) -> RR.
%% to much on stdlib. Furthermore string:to_lower/1
%% does not follow RFC 4343.
%%
-tolower([]) -> [];
-tolower([C|Cs]) when is_integer(C) ->
- if C >= $A, C =< $Z ->
- [(C-$A)+$a|tolower(Cs)];
- true ->
- [C|tolower(Cs)]
+tolower(Domain) ->
+ case rfc_4343_lc(Domain) of
+ ok ->
+ %% Optimization for already lowercased domain
+ Domain;
+ LcDomain ->
+ LcDomain
end.
-dn_ip6_int(A,B,C,D,E,F,G,H) ->
- dnib(H) ++ dnib(G) ++ dnib(F) ++ dnib(E) ++
- dnib(D) ++ dnib(C) ++ dnib(B) ++ dnib(A) ++ "ip6.int".
+rfc_4343_lc([]) -> ok; % Optimization for already lowercased domain
+rfc_4343_lc([C | Cs]) when is_integer(C), 0 =< C, C =< 16#10FFFF ->
+ if
+ $A =< C, C =< $Z ->
+ [(C - $A) + $a |
+ case rfc_4343_lc(Cs) of
+ ok ->
+ Cs;
+ LCs ->
+ LCs
+ end];
+ true ->
+ case rfc_4343_lc(Cs) of
+ ok ->
+ ok;
+ LCs ->
+ [C | LCs]
+ end
+ end.
-dn_in_addr_arpa(A,B,C,D) ->
- integer_to_list(D) ++ "." ++
- integer_to_list(C) ++ "." ++
- integer_to_list(B) ++ "." ++
- integer_to_list(A) ++ ".in-addr.arpa".
-dnib(X) ->
- [hex(X), $., hex(X bsr 4), $., hex(X bsr 8), $., hex(X bsr 12), $.].
+%% Case insensitive domain name comparison according to RFC 4343
+%% "Domain Name System (DNS) Case Insensitivity Clarification",
+%% i.e regard $a through $z as equal to $A through $Z.
+%%
+eq_domains([A | As], [B | Bs]) ->
+ if
+ is_integer(A), 0 =< A, A =< 16#10FFFF,
+ is_integer(B), 0 =< B, B =< 16#10FFFF ->
+ %% An upper bound of 255 would be right right now,
+ %% but this algorithm works for any integer. That
+ %% guard just gives the compiler the opportuinity
+ %% to optimize bit operations for machine word size,
+ %% so we might as well use the Unicode upper bound instead.
+ Xor = (A bxor B),
+ if
+ Xor =:= 0 ->
+ eq_domains(As, Bs);
+ Xor =:= ($A bxor $a) ->
+ And = (A band B),
+ if
+ ($A band $a) =< And, And =< ($Z band $z) ->
+ eq_domains(As, Bs);
+ true ->
+ false
+ end;
+ true ->
+ false
+ end
+ end;
+eq_domains([], []) ->
+ true;
+eq_domains(As, Bs) when is_list(As), is_list(Bs) ->
+ false.
-hex(X) ->
- X4 = (X band 16#f),
- if X4 < 10 -> X4 + $0;
- true -> (X4-10) + $a
- end.
%% Strip trailing dot, do not produce garbage unless necessary.
%%
@@ -1925,7 +1960,7 @@ delete_oldest(CacheDb, TM, N) ->
%% many duplicate times, which is not unlikely
%% given the second resolution. Therefore it is
%% possible that gb_trees and storing the number
- %% of occurences for a cnt time might be needed,
+ %% of occurrences for a cnt time might be needed,
%% so insertion gets more complicated and slower,
%% and we need our own concept of set size.
%%
diff --git a/lib/kernel/src/inet_dns.hrl b/lib/kernel/src/inet_dns.hrl
index c87786390c..5288c570b2 100644
--- a/lib/kernel/src/inet_dns.hrl
+++ b/lib/kernel/src/inet_dns.hrl
@@ -18,7 +18,7 @@
%% %CopyrightEnd%
%%
%%
-%% Defintion for Domain Name System
+%% Definition for Domain Name System
%%
%%
@@ -153,7 +153,7 @@
%%
%% Structure for query header, the order of the fields is machine and
%% compiler dependent, in our case, the bits within a byte are assignd
-%% least significant first, while the order of transmition is most
+%% least significant first, while the order of transmission is most
%% significant first. This requires a somewhat confusing rearrangement.
%%
-record(dns_header,
@@ -162,7 +162,7 @@
%% byte F0
qr = 0, %% :1 response flag
opcode = 0, %% :4 purpose of message
- aa = 0, %% :1 authoritive answer
+ aa = 0, %% :1 authoritative answer
tc = 0, %% :1 truncated message
rd = 0, %% :1 recursion desired
%% byte F1
@@ -190,9 +190,11 @@
cnt = 0, %% access count
ttl = 0, %% time to live
data = [], %% raw data
- %%
+ %%
tm, %% creation time
- bm = [], %% Bitmap storing domain character case information.
+ bm = "", %% Used to be defined as:
+ %% Bitmap storing domain character case information
+ %% but now; Case normalized domain
func = false %% Was: Optional function calculating the data field.
%% Now: cache-flush Class flag from mDNS RFC 6762
}).
diff --git a/lib/kernel/src/inet_gethost_native.erl b/lib/kernel/src/inet_gethost_native.erl
index d9e817f8e5..090f9b9ef9 100644
--- a/lib/kernel/src/inet_gethost_native.erl
+++ b/lib/kernel/src/inet_gethost_native.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
-behaviour(supervisor_bridge).
%% Supervisor bridge exports
--export([start_link/0, init/1, terminate/2, start_raw/0, run_once/0]).
+-export([start_link/0, init/1, terminate/2]).
%% Server export
-export([server_init/2, main_loop/1]).
@@ -131,10 +131,16 @@ init([]) -> % Called by supervisor_bridge:start_link
start_link() ->
supervisor_bridge:start_link({local, ?PROCNAME_SUP}, ?MODULE, []).
+
+-spec terminate(term(), pid()) -> 'ok'.
+
+terminate(_Reason, Pid) ->
+ (catch exit(Pid, kill)),
+ ok.
+
+%%-----------------------------------------------------------------------
%% Only used in fallback situations, no supervisor, no bridge, serve only until
%% no requests present...
-start_raw() ->
- spawn(?MODULE,run_once,[]).
run_once() ->
Port = do_open_port(get_poolsize(), get_extra_args()),
@@ -158,12 +164,6 @@ run_once() ->
Pid ! {R, {error, timeout}}
end.
--spec terminate(term(), pid()) -> 'ok'.
-
-terminate(_Reason, Pid) ->
- (catch exit(Pid, kill)),
- ok.
-
%%-----------------------------------------------------------------------
%% Server API
%%-----------------------------------------------------------------------
@@ -389,34 +389,61 @@ restart_port(#state{port = Port, requests = Requests}) ->
Requests),
NewPort.
-
+-dialyzer({no_improper_lists, do_open_port/2}).
do_open_port(Poolsize, ExtraArgs) ->
- try
- open_port({spawn,
- ?PORT_PROGRAM++" "++integer_to_list(Poolsize)++" "++
- ExtraArgs},
- [{packet,4},eof,binary,overlapped_io])
+ Args = [integer_to_list(Poolsize)] ++ ExtraArgs,
+ %% open_executable/2 below assumes overlapped_io is at the head
+ Opts = [overlapped_io, {args, Args}, {packet,4}, eof, binary],
+ RootDir = code:root_dir(),
+ Prog = filename:join([RootDir, erts(), "bin", ?PORT_PROGRAM]),
+ Cont =
+ fun () ->
+ [filename:join([RootDir, "bin", target(), ?PORT_PROGRAM])]
+ end,
+ open_executable([Prog|Cont], Opts).
+
+open_executable([Prog|Tail] = Progs, Opts) ->
+ try open_port({spawn_executable, Prog}, Opts)
catch
- error:_ ->
- open_port({spawn,
- ?PORT_PROGRAM++" "++integer_to_list(Poolsize)++
- " "++ExtraArgs},
- [{packet,4},eof,binary])
- end.
+ error : badarg when hd(Opts) =:= overlapped_io ->
+ open_executable(Progs, tl(Opts));
+ error : enoent ->
+ open_executable(Tail, Opts);
+ error : Reason ->
+ erlang:halt(
+ "Can not execute "++Prog++" : "++term2string(Reason))
+ end;
+open_executable([], _Opts) ->
+ erlang:halt(
+ "Can not find "++?PORT_PROGRAM++" for "++erts()++"/"++target());
+open_executable(Cont, Opts) ->
+ open_executable(Cont(), Opts).
+%% We regard not being able to start the resolver helper program
+%% as a node fatal error to avoid getting weird malfunction
+%% of name lookups
+
+erts() ->
+ "erts-"++erlang:system_info(version).
+target() ->
+ erlang:system_info(system_architecture).
+term2string(Term) ->
+ unicode:characters_to_list(io_lib:format("~tw", [Term])).
+
+
get_extra_args() ->
- FirstPart = case application:get_env(kernel, gethost_prioritize) of
- {ok, false} ->
- " -ng";
- _ ->
- ""
- end,
- case application:get_env(kernel, gethost_extra_args) of
- {ok, L} when is_list(L) ->
- FirstPart++" "++L;
- _ ->
- FirstPart++""
- end.
+ case application:get_env(kernel, gethost_prioritize) of
+ {ok, false} ->
+ ["-ng"];
+ _ ->
+ []
+ end ++
+ case application:get_env(kernel, gethost_extra_args) of
+ {ok, L} when is_list(L) ->
+ string:tokens(L, " ");
+ _ ->
+ []
+ end.
get_poolsize() ->
case application:get_env(kernel, gethost_poolsize) of
@@ -508,6 +535,34 @@ getit(Req, DefaultName) ->
Res2
end.
+ensure_started() ->
+ case whereis(?MODULE) of
+ undefined ->
+ ChildSpec =
+ {?PROCNAME_SUP, {?MODULE, start_link, []}, temporary,
+ 1000, worker, [?MODULE]},
+ ensure_started([kernel_safe_sup, net_sup], ChildSpec);
+ Pid ->
+ Pid
+ end.
+
+ensure_started([Supervisor|Supervisors], ChildSpec) ->
+ case whereis(Supervisor) of
+ undefined ->
+ ensure_started(Supervisors, ChildSpec);
+ _ ->
+ do_start(Supervisor, ChildSpec),
+ case whereis(?MODULE) of
+ undefined ->
+ exit({could_not_start_server, ?MODULE});
+ Pid ->
+ Pid
+ end
+ end;
+ensure_started([], _ChildSpec) ->
+ %% Icky fallback, run once without supervisor
+ spawn(fun run_once/0).
+
do_start(Sup, C) ->
{Child,_,_,_,_,_} = C,
case supervisor:start_child(Sup,C) of
@@ -522,38 +577,6 @@ do_start(Sup, C) ->
do_start(Sup, C)
end.
-ensure_started() ->
- case whereis(?MODULE) of
- undefined ->
- C = {?PROCNAME_SUP, {?MODULE, start_link, []}, temporary,
- 1000, worker, [?MODULE]},
- case whereis(kernel_safe_sup) of
- undefined ->
- case whereis(net_sup) of
- undefined ->
- %% Icky fallback, run once without supervisor
- start_raw();
- _ ->
- do_start(net_sup,C),
- case whereis(?MODULE) of
- undefined ->
- exit({could_not_start_server, ?MODULE});
- Pid0 ->
- Pid0
- end
- end;
- _ ->
- do_start(kernel_safe_sup,C),
- case whereis(?MODULE) of
- undefined ->
- exit({could_not_start_server, ?MODULE});
- Pid1 ->
- Pid1
- end
- end;
- Pid ->
- Pid
- end.
parse_address(BinHostent, DefaultName) ->
case catch
diff --git a/lib/kernel/src/inet_int.hrl b/lib/kernel/src/inet_int.hrl
index c19df16205..8c7a60b33f 100644
--- a/lib/kernel/src/inet_int.hrl
+++ b/lib/kernel/src/inet_int.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -32,6 +32,7 @@
-define(INET_AF_LOOPBACK, 4). % Fake for LOOPBACK in any address family
-define(INET_AF_LOCAL, 5). % For Unix Domain address family
-define(INET_AF_UNDEFINED, 6). % For any unknown address family
+-define(INET_AF_LIST, 7). % List of addresses for sctp connectx
%% type codes to open and gettype - INET_REQ_GETTYPE
-define(INET_TYPE_STREAM, 1).
@@ -370,21 +371,26 @@
(?u8(X0) -
(if (X0) > 127 -> 16#100; true -> 0 end))).
-%% macro for use in guard for checking ip address {A,B,C,D}
+%% macro for guards only that checks IP address {A,B,C,D}
+%% that returns true for an IP address, but returns false
+%% or crashes for other terms
-define(ip(A,B,C,D),
(((A) bor (B) bor (C) bor (D)) band (bnot 16#ff)) =:= 0).
+%% d:o for IP address as one term
-define(ip(Addr),
- ?ip(element(1, (Addr)), element(2, (Addr)),
- element(3, (Addr)), element(4, (Addr)))).
-
+ (tuple_size(Addr) =:= 4 andalso
+ ?ip(element(1, (Addr)), element(2, (Addr)),
+ element(3, (Addr)), element(4, (Addr))))).
+%% d:o IPv6 address
-define(ip6(A,B,C,D,E,F,G,H),
(((A) bor (B) bor (C) bor (D) bor (E) bor (F) bor (G) bor (H))
band (bnot 16#ffff)) =:= 0).
-define(ip6(Addr),
- ?ip6(element(1, (Addr)), element(2, (Addr)),
- element(3, (Addr)), element(4, (Addr)),
- element(5, (Addr)), element(6, (Addr)),
- element(7, (Addr)), element(8, (Addr)))).
+ (tuple_size(Addr) =:= 8 andalso
+ ?ip6(element(1, (Addr)), element(2, (Addr)),
+ element(3, (Addr)), element(4, (Addr)),
+ element(5, (Addr)), element(6, (Addr)),
+ element(7, (Addr)), element(8, (Addr))))).
-define(ether(A,B,C,D,E,F),
(((A) bor (B) bor (C) bor (D) bor (E) bor (F))
diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl
index 4e71944492..e579999c2f 100644
--- a/lib/kernel/src/inet_res.erl
+++ b/lib/kernel/src/inet_res.erl
@@ -355,40 +355,42 @@ gethostbyaddr(IP,Timeout) ->
_ = inet:stop_timer(Timer),
Res.
-gethostbyaddr_tm({A,B,C,D} = IP, Timer) when ?ip(A,B,C,D) ->
- inet_db:res_update_conf(),
- case inet_db:gethostbyaddr(IP) of
- {ok, HEnt} -> {ok, HEnt};
- _ -> res_gethostbyaddr(dn_in_addr_arpa(A,B,C,D), IP, Timer)
- end;
-gethostbyaddr_tm({A,B,C,D,E,F,G,H} = IP, Timer) when ?ip6(A,B,C,D,E,F,G,H) ->
- inet_db:res_update_conf(),
- case inet_db:gethostbyaddr(IP) of
- {ok, HEnt} -> {ok, HEnt};
- _ -> res_gethostbyaddr(dn_ip6_int(A,B,C,D,E,F,G,H), IP, Timer)
- end;
-gethostbyaddr_tm(Addr,Timer) when is_list(Addr) ->
+gethostbyaddr_tm(Addr, Timer) when is_atom(Addr) ->
+ gethostbyaddr_tm(atom_to_list(Addr), Timer);
+gethostbyaddr_tm(Addr, Timer) when is_list(Addr) ->
case inet_parse:address(Addr) of
- {ok, IP} -> gethostbyaddr_tm(IP,Timer);
+ {ok, IP} -> gethostbyaddr_tm(IP, Timer);
_Error -> {error, formerr}
end;
-gethostbyaddr_tm(Addr,Timer) when is_atom(Addr) ->
- gethostbyaddr_tm(atom_to_list(Addr),Timer);
-gethostbyaddr_tm(_,_) -> {error, formerr}.
-
-%%
-%% Send the gethostbyaddr query to:
-%% 1. the list of normal names servers
-%% 2. the list of alternative name servers
-%%
-res_gethostbyaddr(Addr, IP, Timer) ->
- case res_query(Addr, in, ptr, [], Timer) of
- {ok, Rec} ->
- inet_db:res_gethostbyaddr(IP, Rec);
- {error,{qfmterror,_}} -> {error,einval};
- {error,{Reason,_}} -> {error,Reason};
- Error ->
- Error
+gethostbyaddr_tm(IP, Timer) ->
+ %% The call to norm_ip/1 here translates a lookup of
+ %% ::ffff:A.B.C.D (AAAA in ...ip6.arpa) into a plain
+ %% A.B.C.D (A in ...in-addr.arpa) lookup, and pretends
+ %% the result as if it was from the original IPv6 lookup
+ %%
+ case dn_ip(norm_ip(IP)) of
+ {error, _} = Error ->
+ Error;
+ Name ->
+ %% Try cached first
+ inet_db:res_update_conf(),
+ case inet_db:gethostbyaddr(Name, IP) of
+ {ok, _HEnt} = Result ->
+ Result;
+ {error, nxdomain} ->
+ %% Do a resolver lookup
+ case res_query(Name, in, ?S_PTR, [], Timer) of
+ {ok, Rec} ->
+ %% Process and cache DNS Record
+ inet_db:res_gethostbyaddr(Name, IP, Rec);
+ {error,{qfmterror,_}} ->
+ {error,einval};
+ {error,{Reason,_}} ->
+ {error,Reason};
+ Error ->
+ Error
+ end
+ end
end.
%% --------------------------------------------------------------------------
@@ -479,12 +481,17 @@ getbyname_tm(Name, Type, Timer) when is_list(Name) ->
case type_p(Type) of
true ->
case inet_parse:visible_string(Name) of
- false -> {error, formerr};
+ false ->
+ {error, formerr};
true ->
+ %% Try cached first
inet_db:res_update_conf(),
case inet_db:getbyname(Name, Type) of
- {ok, HEnt} -> {ok, HEnt};
- _ -> res_getbyname(Name, Type, Timer)
+ {ok, HEnt} ->
+ {ok, HEnt};
+ _ ->
+ %% Do a resolver lookup
+ res_getbyname(Name, Type, Timer)
end
end;
false ->
@@ -577,6 +584,7 @@ res_getby_search(_Name, [], Reason,_,_) ->
res_getby_query(Name, Type, Timer) ->
case res_query(Name, in, Type, [], Timer) of
{ok, Rec} ->
+ %% Process and cache DNS Record
inet_db:res_hostent_by_domain(Name, Type, Rec);
{error,{qfmterror,_}} -> {error,einval};
{error,{Reason,_}} -> {error,Reason};
@@ -586,6 +594,7 @@ res_getby_query(Name, Type, Timer) ->
res_getby_query(Name, Type, Timer, NSs) ->
case res_query(Name, in, Type, [], Timer, NSs) of
{ok, Rec} ->
+ %% Process and cache DNS Record
inet_db:res_hostent_by_domain(Name, Type, Rec);
{error,{qfmterror,_}} -> {error,einval};
{error,{Reason,_}} -> {error,Reason};
@@ -649,6 +658,7 @@ make_query(Dname, Class, Type, Opts) ->
make_query(Dname, Class, Type, Options, Edns) ->
Id = inet_db:res_option(next_id),
Recurse = Options#options.recurse,
+ RD = Recurse =:= 1 orelse Recurse =:= true, % (0 | 1 | true | false)
ARList = case Edns of
false -> [];
_ ->
@@ -656,17 +666,18 @@ make_query(Dname, Class, Type, Options, Edns) ->
[#dns_rr_opt{udp_payload_size=PSz,
version=Edns}]
end,
- Msg = #dns_rec{header=#dns_header{id=Id,
+ Msg = #dns_rec{header=#dns_header{id=Id,
+ qr=false,
opcode='query',
- rd=Recurse,
+ rd=RD,
rcode=?NOERROR},
- qdlist=[#dns_query{domain=Dname,
- type=Type,
- class=Class}],
+ qdlist=[#dns_query{domain=Dname,
+ type=Type,
+ class=Class}],
arlist=ARList},
?verbose(Options#options.verbose, "Query: ~p~n", [dns_msg(Msg)]),
Buffer = inet_dns:encode(Msg),
- {Id, Buffer}.
+ {Msg, Buffer}.
%% --------------------------------------------------------------------------
%% socket helpers
@@ -727,7 +738,7 @@ do_udp_recv(I, IP, Port, Timeout, Decode, Time, PollCnt) ->
{ok,Reply} ->
case Decode(Reply) of
false when Timeout =:= 0 ->
- %% This is a compromize between the hard way i.e
+ %% This is a compromise between the hard way i.e
%% in the clause below if Timeout becomes 0 bailout
%% immediately and risk that the right reply lies
%% ahead after some bad id replies, and the
@@ -820,13 +831,13 @@ query_nss_edns(
#q{options =
#options{
udp_payload_size = PSz}=Options,
- edns = {Id,Buffer}}=Q,
+ edns = EDNSQuery}=Q,
[NsSpec|NSs], Timer, Retry, I, S_0, Reason, RetryNSs) ->
%%
{IP,Port} = NS = servfail_retry_wait(NsSpec),
{S,Result} =
query_ns(
- S_0, Id, Buffer, IP, Port, Timer, Retry, I, Options, PSz),
+ S_0, EDNSQuery, IP, Port, Timer, Retry, I, Options, PSz),
case Result of
{error,{E,_}}
when E =:= qfmterror;
@@ -848,19 +859,21 @@ query_nss_edns(
end.
query_nss_dns(
- #q{dns = Qdns}=Q_0,
+ #q{dns = DNSQuery_0}=Q_0,
[NsSpec|NSs], Timer, Retry, I, S_0, Reason, RetryNSs) ->
%%
{IP,Port} = NS = servfail_retry_wait(NsSpec),
#q{options = Options,
- dns = {Id,Buffer}}=Q =
+ dns = DNSQuery}=Q =
if
- is_function(Qdns, 0) -> Q_0#q{dns=Qdns()};
- true -> Q_0
+ is_function(DNSQuery_0, 0) ->
+ Q_0#q{dns=DNSQuery_0()};
+ true ->
+ Q_0
end,
{S,Result} =
query_ns(
- S_0, Id, Buffer, IP, Port, Timer, Retry, I, Options, ?PACKETSZ),
+ S_0, DNSQuery, IP, Port, Timer, Retry, I, Options, ?PACKETSZ),
query_nss_result(
Q, NSs, Timer, Retry, I, S, Reason, RetryNSs, NS, Result).
@@ -952,14 +965,14 @@ query_retries_error(#q{options=#options{nxdomain_reply=NxReply}}, S, Reason) ->
end.
-query_ns(S0, Id, Buffer, IP, Port, Timer, Retry, I,
+query_ns(S0, {Msg, Buffer}, IP, Port, Timer, Retry, I,
#options{timeout=Tm,usevc=UseVC,verbose=Verbose},
PSz) ->
case UseVC orelse iolist_size(Buffer) > PSz of
true ->
TcpTimeout = inet:timeout(Tm*5, Timer),
{S0,
- query_tcp(TcpTimeout, Id, Buffer, IP, Port, Verbose)};
+ query_tcp(TcpTimeout, Msg, Buffer, IP, Port, Verbose)};
false ->
case udp_open(S0, IP) of
{ok,S} ->
@@ -967,13 +980,13 @@ query_ns(S0, Id, Buffer, IP, Port, Timer, Retry, I,
inet:timeout( (Tm * (1 bsl I)) div Retry, Timer),
case
query_udp(
- S, Id, Buffer, IP, Port, UdpTimeout, Verbose)
+ S, Msg, Buffer, IP, Port, UdpTimeout, Verbose)
of
{ok,#dns_rec{header=H}} when H#dns_header.tc ->
TcpTimeout = inet:timeout(Tm*5, Timer),
{S,
query_tcp(
- TcpTimeout, Id, Buffer, IP, Port, Verbose)};
+ TcpTimeout, Msg, Buffer, IP, Port, Verbose)};
{error, econnrefused} = Err ->
ok = udp_close(S),
{#sock{}, Err};
@@ -984,9 +997,9 @@ query_ns(S0, Id, Buffer, IP, Port, Timer, Retry, I,
end
end.
-query_udp(_S, _Id, _Buffer, _IP, _Port, 0, _Verbose) ->
+query_udp(_S, _Msg, _Buffer, _IP, _Port, 0, _Verbose) ->
timeout;
-query_udp(S, Id, Buffer, IP, Port, Timeout, Verbose) ->
+query_udp(S, Msg, Buffer, IP, Port, Timeout, Verbose) ->
?verbose(Verbose, "Try UDP server : ~p:~p (timeout=~w)\n",
[IP,Port,Timeout]),
case
@@ -999,7 +1012,7 @@ query_udp(S, Id, Buffer, IP, Port, Timeout, Verbose) ->
Decode =
fun ({RecIP,RecPort,Answer})
when RecIP =:= IP, RecPort =:= Port ->
- case decode_answer(Answer, Id, Verbose) of
+ case decode_answer(Answer, Msg, Verbose) of
{error,badid} ->
false;
Reply ->
@@ -1020,9 +1033,9 @@ query_udp(S, Id, Buffer, IP, Port, Timeout, Verbose) ->
{error,econnrefused}
end.
-query_tcp(0, _Id, _Buffer, _IP, _Port, _Verbose) ->
+query_tcp(0, _Msg, _Buffer, _IP, _Port, _Verbose) ->
timeout;
-query_tcp(Timeout, Id, Buffer, IP, Port, Verbose) ->
+query_tcp(Timeout, Msg, Buffer, IP, Port, Verbose) ->
?verbose(Verbose, "Try TCP server : ~p:~p (timeout=~w)\n",
[IP, Port, Timeout]),
Family = case IP of
@@ -1038,7 +1051,7 @@ query_tcp(Timeout, Id, Buffer, IP, Port, Verbose) ->
case gen_tcp:recv(S, 0, Timeout) of
{ok, Answer} ->
gen_tcp:close(S),
- case decode_answer(Answer, Id, Verbose) of
+ case decode_answer(Answer, Msg, Verbose) of
{ok, _} = OK -> OK;
{error, badid} -> {error, servfail};
Error -> Error
@@ -1062,96 +1075,147 @@ query_tcp(Timeout, Id, Buffer, IP, Port, Verbose) ->
_:_ -> {error, einval}
end.
-decode_answer(Answer, Id, Verbose) ->
+decode_answer(Answer, Q_Msg, Verbose) ->
case inet_dns:decode(Answer) of
- {ok, Msg} ->
+ {ok, #dns_rec{header = H, arlist = ARList} = Msg} ->
?verbose(Verbose, "Got reply: ~p~n", [dns_msg(Msg)]),
- E = case lists:keyfind(dns_rr_opt, 1, Msg#dns_rec.arlist) of
+ E = case lists:keyfind(dns_rr_opt, 1, ARList) of
false -> 0;
#dns_rr_opt{ext_rcode=ExtRCode} -> ExtRCode
end,
- H = Msg#dns_rec.header,
RCode = (E bsl 4) bor H#dns_header.rcode,
case RCode of
- ?NOERROR ->
- if H#dns_header.id =/= Id ->
- {error,badid};
- length(Msg#dns_rec.qdlist) =/= 1 ->
- {error,{noquery,Msg}};
- true ->
- {ok, Msg}
- end;
+ ?NOERROR -> decode_answer_noerror(Q_Msg, Msg, H);
?FORMERR -> {error,{qfmterror,Msg}};
?SERVFAIL -> {error,{servfail,Msg}};
?NXDOMAIN -> {error,{nxdomain,Msg}};
?NOTIMP -> {error,{notimp,Msg}};
?REFUSED -> {error,{refused,Msg}};
?BADVERS -> {error,{badvers,Msg}};
- _ -> {error,{unknown,Msg}}
+ _ -> {error,{unknown,Msg}}
end;
{error, formerr} = Error ->
?verbose(Verbose, "Got reply: decode format error~n", []),
Error
end.
+decode_answer_noerror(
+ #dns_rec{header = Q_H, qdlist = [Q_RR]},
+ #dns_rec{qdlist = QDList} = Msg,
+ H) ->
+ %% Validate the reply
+ if
+ H#dns_header.id =/= Q_H#dns_header.id ->
+ {error,badid};
+ H#dns_header.qr =/= true;
+ H#dns_header.opcode =/= Q_H#dns_header.opcode;
+ H#dns_header.rd =/= Q_H#dns_header.rd ->
+ {error,{unknown,Msg}};
+ true ->
+ case QDList of
+ [RR] ->
+ case
+ (RR#dns_query.class =:= Q_RR#dns_query.class)
+ andalso
+ (RR#dns_query.type =:= Q_RR#dns_query.type)
+ andalso
+ inet_db:eq_domains(
+ RR#dns_query.domain, Q_RR#dns_query.domain)
+ of
+ true ->
+ {ok, Msg};
+ false ->
+ {error,{noquery,Msg}}
+ end;
+ _ when is_list(QDList) ->
+ {error,{noquery,Msg}}
+ end
+ end.
+
%%
%% Transform domain name or address
%% 1. "a.b.c" =>
%% "a.b.c"
%% 2. "1.2.3.4" =>
-%% "4.3.2.1.IN-ADDR.ARPA"
+%% "4.3.2.1.in-addr.arpa"
%% 3. "4321:0:1:2:3:4:567:89ab" =>
-%% "b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.1.2.3.4.IP6.ARPA"
+%% "b.a.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.1.2.3.4.ip6.arpa"
%% 4. {1,2,3,4} => as 2.
%% 5. {1,2,3,4,5,6,7,8} => as 3.
+%% 6. Atom -> Recurse(String(Atom))
+%% 7. Term => {error, formerr}
%%
-nsdname({A,B,C,D}) ->
- {ok, dn_in_addr_arpa(A,B,C,D)};
-nsdname({A,B,C,D,E,F,G,H}) ->
- {ok, dn_ip6_int(A,B,C,D,E,F,G,H)};
+nsdname(Name) when is_atom(Name) ->
+ nsdname(atom_to_list(Name));
nsdname(Name) when is_list(Name) ->
case inet_parse:visible_string(Name) of
true ->
case inet_parse:address(Name) of
- {ok, Addr} ->
- nsdname(Addr);
+ {ok, IP} ->
+ dn_ip(IP);
_ ->
{ok, Name}
end;
_ -> {error, formerr}
end;
-nsdname(Name) when is_atom(Name) ->
- nsdname(atom_to_list(Name));
-nsdname(_) -> {error, formerr}.
-
-dn_in_addr_arpa(A,B,C,D) ->
- integer_to_list(D) ++
- ("." ++ integer_to_list(C) ++
- ("." ++ integer_to_list(B) ++
- ("." ++ integer_to_list(A) ++ ".IN-ADDR.ARPA"))).
-
-dn_ip6_int(A,B,C,D,E,F,G,H) ->
- dnib(H) ++
- (dnib(G) ++
- (dnib(F) ++
- (dnib(E) ++
- (dnib(D) ++
- (dnib(C) ++
- (dnib(B) ++
- (dnib(A) ++ "IP6.ARPA"))))))).
-
-
-
--compile({inline, [dnib/1, dnib/3]}).
-dnib(X) ->
- L = erlang:integer_to_list(X, 16),
- dnib(4-length(L), L, []).
+nsdname(IP) ->
+ dn_ip(IP).
+
+%% Return the domain name for a PTR lookup of
+%% the argument IP address
+%%
+dn_ip({A,B,C,D}) when ?ip(A,B,C,D) ->
+ dn_ipv4([A,B,C,D], "in-addr.arpa");
+dn_ip({A,B,C,D,E,F,G,H}) when ?ip6(A,B,C,D,E,F,G,H) ->
+ dn_ipv6([A,B,C,D,E,F,G,H], "ip6.arpa");
+dn_ip(_) ->
+ {error, formerr}.
+
+dn_ipv4([], Dn) ->
+ Dn;
+dn_ipv4([A | As], Dn_0) when is_integer(A), A =< 255 ->
+ Dn = [$. | Dn_0],
+ if
+ A < 10 ->
+ dn_ipv4(As, dn_dec(A, Dn));
+ A < 100 ->
+ dn_ipv4(As, dn_dec(A div 10, dn_dec(A rem 10, Dn)));
+ true ->
+ B = A rem 100,
+ dn_ipv4(
+ As,
+ dn_dec(A div 100, dn_dec(B div 10, dn_dec(B rem 10, Dn))))
+ end.
+
+dn_ipv6([], Dn) ->
+ Dn;
+dn_ipv6([W | Ws], Dn) when is_integer(W), W =< 16#ffff ->
+ D = W band 16#f, W_1 = W bsr 4,
+ C = W_1 band 16#f, W_2 = W_1 bsr 4,
+ B = W_2 band 16#f,
+ A = W_2 bsr 4,
+ dn_ipv6(Ws, dn_hex(D, dn_hex(C, dn_hex(B, dn_hex(A, Dn))))).
+
+-compile({inline, [dn_dec/2, dn_hex/2]}).
+dn_dec(N, Tail) when is_integer(N) ->
+ [N + $0 | Tail].
+
+dn_hex(N, Tail) when is_integer(N) ->
+ if
+ N < 10 ->
+ [N + $0, $. | Tail];
+ true ->
+ [(N - 10) + $a, $. | Tail]
+end.
+
+%% Normalize an IPv4-compatible IPv6 address
+%% into a plain IPv4 address
%%
-dnib(0, [], Acc) -> Acc;
-dnib(0, [C|Cs], Acc) ->
- dnib(0, Cs, [C,$.|Acc]);
-dnib(N, Cs, Acc) ->
- dnib(N-1, Cs, [$0,$.|Acc]).
+norm_ip({0,0,0,0,0,16#ffff,G,H}) ->
+ A = G bsr 8, B = G band 16#ff, C = H bsr 8, D = H band 16#ff,
+ {A,B,C,D};
+norm_ip(IP) ->
+ IP.
diff --git a/lib/kernel/src/inet_res.hrl b/lib/kernel/src/inet_res.hrl
index c812550328..19e3f04e75 100644
--- a/lib/kernel/src/inet_res.hrl
+++ b/lib/kernel/src/inet_res.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@
%% %CopyrightEnd%
%%
%%
-%% Dns & resolver defintions
+%% Dns & resolver definitions
%%
%% milli second for requests
diff --git a/lib/kernel/src/inet_sctp.erl b/lib/kernel/src/inet_sctp.erl
index d7020b4bf6..61f6ab0bcd 100644
--- a/lib/kernel/src/inet_sctp.erl
+++ b/lib/kernel/src/inet_sctp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@
-include("inet_int.hrl").
-export([getserv/1, getaddr/1, getaddr/2, translate_ip/1]).
--export([open/1, close/1, listen/2, peeloff/2, connect/4, connect/5]).
+-export([open/1, close/1, listen/2, peeloff/2, connect/4, connect/5, connectx/3, connectx/4]).
-export([sendmsg/3, send/4, recv/2]).
-define(PROTO, sctp).
@@ -119,6 +119,20 @@ connect(S, Addr, Port, Opts, Timer) ->
Err3 -> Err3
end.
+%% connectx is always non-blocking so there is no timer
+connectx(S, SockAddrs, Opts) ->
+ case prim_inet:chgopts(S, Opts) of
+ ok ->
+ prim_inet:connectx(S, SockAddrs);
+ Err2 -> Err2
+ end.
+
+connectx(S, Addrs, Port, Opts) ->
+ case prim_inet:chgopts(S, Opts) of
+ ok ->
+ prim_inet:connectx(S, Addrs, Port);
+ Err2 -> Err2
+ end.
%% XXX race condition problem
%%
diff --git a/lib/kernel/src/inet_tcp_dist.erl b/lib/kernel/src/inet_tcp_dist.erl
index d84d5d56bf..b6a0cec0ab 100644
--- a/lib/kernel/src/inet_tcp_dist.erl
+++ b/lib/kernel/src/inet_tcp_dist.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -208,7 +208,7 @@ accept_connection(AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
gen_accept_connection(Driver, AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
spawn_opt(?MODULE, do_accept,
[Driver, self(), AcceptPid, Socket, MyNode, Allowed, SetupTime],
- [link, {priority, max}]).
+ dist_util:net_ticker_spawn_options()).
do_accept(Driver, Kernel, AcceptPid, Socket, MyNode, Allowed, SetupTime) ->
receive
@@ -274,7 +274,6 @@ nodelay() ->
{nodelay, true}
end.
-
%% ------------------------------------------------------------
%% Get remote information about a Socket.
%% ------------------------------------------------------------
@@ -304,7 +303,7 @@ setup(Node, Type, MyNode, LongOrShortNames,SetupTime) ->
gen_setup(Driver, Node, Type, MyNode, LongOrShortNames, SetupTime) ->
spawn_opt(?MODULE, do_setup,
[Driver, self(), Node, Type, MyNode, LongOrShortNames, SetupTime],
- [link, {priority, max}]).
+ dist_util:net_ticker_spawn_options()).
do_setup(Driver, Kernel, Node, Type, MyNode, LongOrShortNames, SetupTime) ->
?trace("~p~n",[{inet_tcp_dist,self(),setup,Node}]),
diff --git a/lib/kernel/src/kernel.app.src b/lib/kernel/src/kernel.app.src
index 606e939041..4c1b60dc8e 100644
--- a/lib/kernel/src/kernel.app.src
+++ b/lib/kernel/src/kernel.app.src
@@ -154,10 +154,10 @@
{logger_sasl_compatible, false},
{net_tickintensity, 4},
{net_ticktime, 60},
- {prevent_overlapping_partitions, false},
+ {prevent_overlapping_partitions, true},
{shell_docs_ansi,auto}
]},
{mod, {kernel, []}},
- {runtime_dependencies, ["erts-12.3", "stdlib-3.13", "sasl-3.0", "crypto-5.0"]}
- ]
+ {runtime_dependencies, ["erts-@OTP-17951@", "stdlib-@OTP-17720@", "sasl-3.0", "crypto-5.0"]}
+ ]
}.
diff --git a/lib/kernel/src/logger.erl b/lib/kernel/src/logger.erl
index 1f8e300dd9..73a86dd3ca 100644
--- a/lib/kernel/src/logger.erl
+++ b/lib/kernel/src/logger.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -997,7 +997,7 @@ get_primary_metadata() ->
{ok, Meta} ->
throw({logger_metadata, Meta});
undefined ->
- %% This case is here to keep bug compatability. Can be removed in OTP 25.
+ %% This case is here to keep bug compatibility. Can be removed in OTP 25.
case application:get_env(kernel,logger_default_metadata,#{}) of
Meta when is_map(Meta) ->
Meta;
@@ -1156,12 +1156,13 @@ log_fun_allowed(Location, Level, FunRes, Meta, FunCall) ->
Meta)
end.
-do_log_allowed(Level,{Format,Args}=Msg,Meta,Tid,Config)
+do_log_allowed(Level,{Format,Args},Meta,Tid,Config)
when ?IS_LEVEL(Level),
?IS_FORMAT(Format),
is_list(Args),
is_map(Meta) ->
- logger_backend:log_allowed(#{level=>Level,msg=>Msg,meta=>Meta},Tid,Config);
+ logger_backend:log_allowed(#{level=>Level,msg=>{deatomize(Format),Args},meta=>Meta},
+ Tid,Config);
do_log_allowed(Level,Report,Meta,Tid,Config)
when ?IS_LEVEL(Level),
?IS_REPORT(Report),
@@ -1177,6 +1178,9 @@ do_log_allowed(Level,String,Meta,Tid,Config)
tid() ->
ets:whereis(?LOGGER_TABLE).
+deatomize(Atom) when is_atom(Atom) -> atom_to_list(Atom);
+deatomize(Other) -> Other.
+
log_remote(Node,Level,{Format,Args},Meta) ->
log_remote(Node,{log,Level,Format,Args,Meta});
log_remote(Node,Level,Msg,Meta) ->
@@ -1209,7 +1213,7 @@ default(pid) -> self();
default(gl) -> group_leader();
default(time) -> timestamp().
-%% Remove everything upto and including this module from the stacktrace
+%% Remove everything up to and including this module from the stacktrace
filter_stacktrace(Module,[{Module,_,_,_}|_]) ->
[];
filter_stacktrace(Module,[H|T]) ->
diff --git a/lib/kernel/src/logger_disk_log_h.erl b/lib/kernel/src/logger_disk_log_h.erl
index 8be6b5e69c..2f386acbf3 100644
--- a/lib/kernel/src/logger_disk_log_h.erl
+++ b/lib/kernel/src/logger_disk_log_h.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -58,8 +58,8 @@ adding_handler(Config) ->
%%%-----------------------------------------------------------------
%%% Updating handler config
-changing_config(SetOrUpdate, OldConfig, NewConfig) ->
- logger_h_common:changing_config(SetOrUpdate, OldConfig, NewConfig).
+changing_config(SetOrUpdate,OldConfig,NewConfig) ->
+ logger_h_common:changing_config(SetOrUpdate,OldConfig,NewConfig).
%%%-----------------------------------------------------------------
%%% Handler being removed
@@ -68,12 +68,12 @@ removing_handler(Config) ->
%%%-----------------------------------------------------------------
%%% Log a string or report
--spec log(LogEvent, Config) -> ok when
+-spec log(LogEvent,Config) -> ok when
LogEvent :: logger:log_event(),
Config :: logger:handler_config().
-log(LogEvent, Config) ->
- logger_h_common:log(LogEvent, Config).
+log(LogEvent,Config) ->
+ logger_h_common:log(LogEvent,Config).
%%%-----------------------------------------------------------------
%%% Remove internal fields from configuration
@@ -86,19 +86,19 @@ filter_config(Config) ->
init(Name, #{file:=File,type:=Type,max_no_bytes:=MNB,max_no_files:=MNF}) ->
case open_disk_log(Name, File, Type, MNB, MNF) of
ok ->
- {ok,#{log_opts => #{file => File,
- type => Type,
- max_no_bytes => MNB,
- max_no_files => MNF},
- prev_log_result => ok,
- prev_sync_result => ok,
- prev_disk_log_info => undefined}};
+ {ok,#{log_opts=>#{file=>File,
+ type=>Type,
+ max_no_bytes=>MNB,
+ max_no_files=>MNF},
+ prev_log_result=>ok,
+ prev_sync_result=>ok,
+ prev_disk_log_info=>undefined}};
Error ->
Error
end.
check_config(Name,set,undefined,HConfig0) ->
- HConfig=merge_default_logopts(Name,maps:merge(get_default_config(),HConfig0)),
+ HConfig=merge_default_logopts(Name,HConfig0),
check_config(HConfig);
check_config(_Name,SetOrUpdate,OldHConfig,NewHConfig0) ->
WriteOnce = maps:with([type,file,max_no_files,max_no_bytes],OldHConfig),
@@ -106,7 +106,7 @@ check_config(_Name,SetOrUpdate,OldHConfig,NewHConfig0) ->
case SetOrUpdate of
set ->
%% Do not reset write-once fields to defaults
- maps:merge(get_default_config(),WriteOnce);
+ WriteOnce;
update ->
OldHConfig
end,
@@ -147,60 +147,57 @@ check_h_config([Other | _]) ->
check_h_config([]) ->
ok.
-get_default_config() ->
- #{}.
-
-merge_default_logopts(Name, HConfig) ->
- Type = maps:get(type, HConfig, wrap),
+merge_default_logopts(Name,HConfig) ->
+ Type = maps:get(type,HConfig,wrap),
{DefaultNoFiles,DefaultNoBytes} =
case Type of
halt -> {undefined,infinity};
_wrap -> {10,1048576}
end,
{ok,Dir} = file:get_cwd(),
- Defaults = #{file => filename:join(Dir,Name),
- max_no_files => DefaultNoFiles,
- max_no_bytes => DefaultNoBytes,
- type => Type},
- maps:merge(Defaults, HConfig).
+ Defaults = #{file=>filename:join(Dir,Name),
+ max_no_files=>DefaultNoFiles,
+ max_no_bytes=>DefaultNoBytes,
+ type=>Type},
+ maps:merge(Defaults,HConfig).
filesync(Name,_Mode,State) ->
Result = ?disk_log_sync(Name),
- maybe_notify_error(Name, filesync, Result, prev_sync_result, State).
+ maybe_notify_error(Name,filesync,Result,prev_sync_result,State).
-write(Name, Mode, Bin, State) ->
- Result = ?disk_log_write(Name, Mode, Bin),
- maybe_notify_error(Name, log, Result, prev_log_result, State).
+write(Name,Mode,Bin,State) ->
+ Result = ?disk_log_write(Name,Mode,Bin),
+ maybe_notify_error(Name,log,Result,prev_log_result,State).
-reset_state(_Name, State) ->
- State#{prev_log_result => ok,
- prev_sync_result => ok,
- prev_disk_log_info => undefined}.
+reset_state(_Name,State) ->
+ State#{prev_log_result=>ok,
+ prev_sync_result=>ok,
+ prev_disk_log_info=>undefined}.
%% The disk log owner must handle status messages from disk_log.
-handle_info(Name, {disk_log, _Node, Log, Info={truncated,_NoLostItems}}, State) ->
- maybe_notify_status(Name, Log, Info, prev_disk_log_info, State);
-handle_info(Name, {disk_log, _Node, Log, Info = {blocked_log,_Items}}, State) ->
- maybe_notify_status(Name, Log, Info, prev_disk_log_info, State);
-handle_info(Name, {disk_log, _Node, Log, Info = full}, State) ->
- maybe_notify_status(Name, Log, Info, prev_disk_log_info, State);
-handle_info(Name, {disk_log, _Node, Log, Info = {error_status,_Status}}, State) ->
- maybe_notify_status(Name, Log, Info, prev_disk_log_info, State);
-handle_info(_, _, State) ->
+handle_info(Name,{disk_log,_Node,Log,Info={truncated,_NoLostItems}},State) ->
+ maybe_notify_status(Name,Log,Info,prev_disk_log_info,State);
+handle_info(Name,{disk_log,_Node,Log,Info={blocked_log,_Items}},State) ->
+ maybe_notify_status(Name,Log,Info,prev_disk_log_info,State);
+handle_info(Name,{disk_log,_Node,Log,Info=full}, State) ->
+ maybe_notify_status(Name,Log,Info,prev_disk_log_info,State);
+handle_info(Name,{disk_log,_Node,Log,Info={error_status,_Status}},State) ->
+ maybe_notify_status(Name,Log,Info,prev_disk_log_info,State);
+handle_info(_,_,State) ->
State.
-terminate(Name, _Reason, _State) ->
- _ = close_disk_log(Name, normal),
+terminate(Name,_Reason,_State) ->
+ _ = close_disk_log(Name,normal),
ok.
%%%-----------------------------------------------------------------
%%% Internal functions
-open_disk_log(Name, File, Type, MaxNoBytes, MaxNoFiles) ->
+open_disk_log(Name,File,Type,MaxNoBytes,MaxNoFiles) ->
case filelib:ensure_dir(File) of
ok ->
Size =
- if Type == halt -> MaxNoBytes;
- Type == wrap -> {MaxNoBytes,MaxNoFiles}
+ if Type==halt -> MaxNoBytes;
+ Type==wrap -> {MaxNoBytes,MaxNoFiles}
end,
Opts = [{name, Name},
{file, File},
@@ -222,27 +219,27 @@ open_disk_log(Name, File, Type, MaxNoBytes, MaxNoFiles) ->
Error
end.
-close_disk_log(Name, _) ->
+close_disk_log(Name,_) ->
_ = ?disk_log_sync(Name),
_ = disk_log:close(Name),
ok.
-disk_log_write(Name, sync, Bin) ->
- disk_log:blog(Name, Bin);
-disk_log_write(Name, async, Bin) ->
- disk_log:balog(Name, Bin).
+disk_log_write(Name,sync,Bin) ->
+ disk_log:blog(Name,Bin);
+disk_log_write(Name,async,Bin) ->
+ disk_log:balog(Name,Bin).
%%%-----------------------------------------------------------------
%%% Print error messages, but don't repeat the same message
-maybe_notify_error(Name, Op, Result, Key, #{log_opts:=LogOpts}=State) ->
- {Result,error_notify_new({Name, Op, LogOpts, Result}, Result, Key, State)}.
+maybe_notify_error(Name,Op,Result,Key,#{log_opts:=LogOpts}=State) ->
+ {Result,error_notify_new({Name,Op,LogOpts,Result},Result,Key,State)}.
-maybe_notify_status(Name, Log, Info, Key, State) ->
- error_notify_new({disk_log, Name, Log, Info}, Info, Key, State).
+maybe_notify_status(Name,Log,Info,Key,State) ->
+ error_notify_new({disk_log,Name,Log,Info},Info,Key,State).
-error_notify_new(Term, What, Key, State) ->
- error_notify_new(What, maps:get(Key,State), Term),
- State#{Key => What}.
+error_notify_new(Term,What,Key,State) ->
+ error_notify_new(What,maps:get(Key,State),Term),
+ State#{Key=>What}.
error_notify_new(ok,_Prev,_Term) ->
ok;
diff --git a/lib/kernel/src/logger_h_common.erl b/lib/kernel/src/logger_h_common.erl
index e96d2b28f3..bbd45ac73d 100644
--- a/lib/kernel/src/logger_h_common.erl
+++ b/lib/kernel/src/logger_h_common.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -396,7 +396,7 @@ do_log_to_binary(Log,Config) ->
{config,FormatterConfig},
{log_event,Log},
{bad_return_value,String},
- {catched,{C2,R2,S2}}]),
+ {caught,{C2,R2,S2}}]),
<<"FORMATTER ERROR: bad return value\n">>
end.
diff --git a/lib/kernel/src/logger_olp.erl b/lib/kernel/src/logger_olp.erl
index 068fbe447b..1379f8cf54 100644
--- a/lib/kernel/src/logger_olp.erl
+++ b/lib/kernel/src/logger_olp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -193,11 +193,13 @@ init([Name,Module,Args,Options]) ->
gen_server:enter_loop(?MODULE, [], State);
Error ->
unregister(Name),
- proc_lib:init_ack(Error)
+ proc_lib:init_ack(Error),
+ ignore %% Just to shut Dialyzer up - ignored
catch
_:Error ->
unregister(Name),
- proc_lib:init_ack(Error)
+ proc_lib:init_ack(Error),
+ ignore %% Just to shut Dialyzer up - ignored
end.
%% This is the synchronous load event.
diff --git a/lib/kernel/src/logger_server.erl b/lib/kernel/src/logger_server.erl
index 942c0aac5a..dff30a95fc 100644
--- a/lib/kernel/src/logger_server.erl
+++ b/lib/kernel/src/logger_server.erl
@@ -623,7 +623,7 @@ do_internal_log(Level,Location,Log,[Report] = Data) ->
do_internal_log(Level,Location,Log,[Fmt,Args] = Data) ->
do_internal_log(Level,Location,Log,Data,{Fmt,Args}).
do_internal_log(Level,Location,Log,Data,Msg) ->
- Meta = logger:add_default_metadata(maps:merge(Location,maps:get(meta,Log,#{}))),
+ Meta = logger:add_default_metadata(Location),
%% Spawn these to avoid deadlocks
case Log of
#{ meta := #{ internal_log_event := true } } ->
diff --git a/lib/kernel/src/net.erl b/lib/kernel/src/net.erl
index 9acd89fb5a..1b6905df94 100644
--- a/lib/kernel/src/net.erl
+++ b/lib/kernel/src/net.erl
@@ -49,7 +49,6 @@
cast/4,
broadcast/3,
ping/1,
- relay/1,
sleep/1]).
%% Should we define these here or refer to the prim_net module
@@ -73,7 +72,7 @@
-deprecated({cast, 4, "use rpc:cast/4 instead"}).
-deprecated({broadcast, 3, "use rpc:eval_everywhere/3 instead"}).
-deprecated({ping, 1, "use net_adm:ping/1 instead"}).
--deprecated({relay, 1, "use slave:relay/1 instead"}).
+-removed({relay, 1, "use fun Relay(Pid) -> receive X -> Pid ! X end, Relay(Pid) instead"}).
-deprecated({sleep, 1, "use 'receive after T -> ok end' instead"}).
@@ -130,7 +129,6 @@ cast(N,M,F,A) -> rpc:cast(N,M,F,A).
broadcast(M,F,A) -> rpc:eval_everywhere(M,F,A).
ping(Node) -> net_adm:ping(Node).
sleep(T) -> receive after T -> ok end.
-relay(X) -> slave:relay(X).
%% ===========================================================================
diff --git a/lib/kernel/src/net_kernel.erl b/lib/kernel/src/net_kernel.erl
index 40abf24f57..e614e12108 100644
--- a/lib/kernel/src/net_kernel.erl
+++ b/lib/kernel/src/net_kernel.erl
@@ -71,6 +71,7 @@
nodename/0,
protocol_childspecs/0,
epmd_module/0,
+ get_state/0,
dist_listen/0]).
-export([disconnect/1, passive_cnct/1]).
@@ -195,6 +196,19 @@ longnames() -> request(longnames).
nodename() -> request(nodename).
+get_state() ->
+ case whereis(net_kernel) of
+ undefined ->
+ case retry_request_maybe(get_state) of
+ ignored ->
+ #{started => no};
+ Reply ->
+ Reply
+ end;
+ _ ->
+ request(get_state)
+ end.
+
-spec stop() -> ok | {error, Reason} when
Reason :: not_allowed | not_found.
stop() ->
@@ -561,7 +575,7 @@ do_auto_connect_2(Node, ConnId, From, State, ConnLookup) ->
{reply, false, State};
%% This might happen due to connection close
- %% not beeing propagated to user space yet.
+ %% not being propagated to user space yet.
%% Save the day by just not connecting...
{ok, once} when ConnLookup =/= [],
(hd(ConnLookup))#connection.state =:= up ->
@@ -833,6 +847,30 @@ handle_call({getopts, Node, Opts}, From, State) ->
end,
async_reply({reply, Return, State}, From);
+
+handle_call(get_state, From, State) ->
+ Started = case State#state.supervisor of
+ net_sup -> static;
+ _ -> dynamic
+ end,
+ {NameType,Name} = case {persistent_term:get(net_kernel, undefined), node()} of
+ {undefined, Node} ->
+ {static, Node};
+ {dynamic_node_name, nonode@nohost} ->
+ {dynamic, undefined};
+ {dynamic_node_name, Node} ->
+ {dynamic, Node}
+ end,
+ DomainType = case get(longnames) of
+ true -> long;
+ false -> short
+ end,
+ Return = #{started => Started,
+ name_type => NameType,
+ name => Name,
+ domain_type => DomainType},
+ async_reply({reply, Return, State}, From);
+
handle_call(_Msg, _From, State) ->
{noreply, State}.
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index 6395d37c5d..f4c5d01b05 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -313,7 +313,22 @@ mk_cmd(_,Cmd) ->
%% We use an absolute path here because we do not want the path to be
%% searched in case a stale NFS handle is somewhere in the path before
%% the sh command.
- {"/bin/sh -s unix:cmd", [out],
+ %%
+ %% Check if the default shell is located in /bin/sh as expected usually
+ %% or in /system/bin/sh as implemented on Android. The raw option is
+ %% used to bypass the file server and speed up the file access.
+ Shell = case file:read_file_info("/bin/sh",[raw]) of
+ {ok,#file_info{type=regular}} ->
+ "/bin/sh";
+ _ ->
+ case file:read_file_info("/system/bin/sh",[raw]) of
+ {ok,#file_info{type=regular}} ->
+ "/system/bin/sh";
+ _ ->
+ "/bin/sh"
+ end
+ end,
+ {Shell ++ " -s unix:cmd", [out],
%% We insert a new line after the command, in case the command
%% contains a comment character.
%%
diff --git a/lib/kernel/src/ram_file.erl b/lib/kernel/src/ram_file.erl
index e7b5e1eedb..ae0784b770 100644
--- a/lib/kernel/src/ram_file.erl
+++ b/lib/kernel/src/ram_file.erl
@@ -41,7 +41,7 @@
%% --------------------------------------------------------------------------
%% These operation codes were once identical between efile_drv.c
-%% and ram_file_drv.c, but now these drivers are not depeding on each other.
+%% and ram_file_drv.c, but now these drivers are not depending on each other.
%% So, the codes could be changed to more logical values now, but why indeed?
%% Defined "file" functions
@@ -394,7 +394,7 @@ ll_close(Port) ->
%%% Utility functions.
%% Converts a list of mode atoms into an mode word for the driver.
-%% Returns {Mode, Opts} wher Opts is a list of options for
+%% Returns {Mode, Opts} where Opts is a list of options for
%% erlang:open_port/2, or {error, einval} upon failure.
open_mode(List) when is_list(List) ->
diff --git a/lib/kernel/src/rpc.erl b/lib/kernel/src/rpc.erl
index a799095e87..c3b4b8f1b1 100644
--- a/lib/kernel/src/rpc.erl
+++ b/lib/kernel/src/rpc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,11 +20,7 @@
-module(rpc).
%%
-%% Implementations inside '-ifdef(SERVER_SIDE_ERPC_IS_MANDATORY).'
-%% below require 'erpc' support to be mandatory on server side.
-%% 'erpc' was introduced in OTP 23, so it should be possible to
-%% enable this as of OTP 25:
-%% -define(SERVER_SIDE_ERPC_IS_MANDATORY, yes).
+%% As of OTP 25 the rpc module require server side support for erpc.
%%
%% General rpc, broadcast,multicall, promise and parallel evaluator
@@ -123,10 +119,13 @@ init([]) ->
process_flag(trap_exit, true),
{ok, #{nodes_observer => start_nodes_observer()}}.
--spec handle_call(term(), term(), state()) ->
- {'noreply', state()} |
- {'reply', term(), state()} |
- {'stop', 'normal', 'stopped', state()}.
+-spec handle_call(
+ term(),
+ gen_server:from() | {?NAME,term()},
+ state()) ->
+ {'noreply', state()} |
+ {'reply', term(), state()} |
+ {'stop', 'normal', 'stopped', state()}.
handle_call({call, Mod, Fun, Args, Gleader}, To, S) ->
%% Spawn not to block the rex server.
@@ -146,7 +145,7 @@ handle_call({call, Mod, Fun, Args, Gleader}, To, S) ->
Ref -> ok
end;
_ ->
- gen_server:reply(To, Reply)
+ reply(To, Reply)
end
end,
try
@@ -194,7 +193,7 @@ handle_info({'DOWN', M, process, _, Reason}, S) ->
undefined ->
{noreply, S};
{_, _} = To ->
- gen_server:reply(To, {badrpc, {'EXIT', Reason}}),
+ reply(To, {badrpc, {'EXIT', Reason}}),
{noreply, maps:remove(M, S)}
end;
handle_info({From, {sbcast, Name, Msg}}, S) ->
@@ -215,7 +214,7 @@ handle_info({From, {send, Name, Msg}}, S) ->
{noreply, S};
handle_info({From, {call, Mod, Fun, Args, Gleader}}, S) ->
%% Special for hidden C node's, uugh ...
- To = {From, ?NAME},
+ To = {?NAME, From},
NewGleader =
case Gleader of
send_stdout_to_caller ->
@@ -228,7 +227,7 @@ handle_info({From, {call, Mod, Fun, Args, Gleader}}, S) ->
{noreply, _NewS} = Return ->
Return;
{reply, Reply, NewS} ->
- gen_server:reply(To, Reply),
+ reply(To, Reply),
{noreply, NewS}
end;
handle_info({From, features_request}, S) ->
@@ -250,6 +249,13 @@ code_change(_, S, _) ->
%% RPC aid functions ....
+reply({?NAME, From}, Reply) ->
+ From ! {?NAME, Reply},
+ ok;
+reply({From, _} = To, Reply) when is_pid(From) ->
+ gen_server:reply(To, Reply).
+
+
execute_call(Mod, Fun, Args) ->
try
{return, Return} = erpc:execute_call(Mod, Fun, Args),
@@ -355,32 +361,6 @@ nodes_observer_loop(Tab) ->
end,
nodes_observer_loop(Tab).
--ifdef(SERVER_SIDE_ERPC_IS_MANDATORY).
-
-%% Currently node_has_feature() is only needed if
-%% it is unknown if 'erpc' is supported by server
-%% side or not...
-
--else. %% ! define SERVER_SIDE_ERPC_IS_MANDATORY
-
--dialyzer([{nowarn_function, node_has_feature/2}, no_match]).
-
--spec node_has_feature(Node :: atom(), Feature :: term()) -> boolean().
-
-node_has_feature(N, erpc) when N == node() ->
- true;
-node_has_feature(N, erpc) ->
- try
- Tab = persistent_term:get(?TAB_NAME),
- ets:lookup_element(Tab, N, 2)
- catch
- _:_ -> false
- end;
-node_has_feature(_N, _Feature) ->
- false.
-
--endif.
-
%% THE rpc client interface
%% Call
@@ -417,34 +397,9 @@ call(N,M,F,A) ->
Reason :: term(),
Timeout :: ?TIMEOUT_TYPE.
--ifdef(SERVER_SIDE_ERPC_IS_MANDATORY).
-
call(N,M,F,A,T) ->
?RPCIFY(erpc:call(N, M, F, A, T)).
--else. %% ! defined SERVER_SIDE_ERPC_IS_MANDATORY
-
-call(N,M,F,A,T) ->
- DL = try
- deadline(T)
- catch
- error:_ ->
- error(badarg)
- end,
- case ?RPCIFY(erpc:call(N, M, F, A, T)) of
- {badrpc, notsup} ->
- case time_left(DL) of
- 0 ->
- {badrpc, timeout};
- Timeout ->
- do_srv_call(N, {call,M,F,A,group_leader()}, Timeout)
- end;
- Res ->
- Res
- end.
-
--endif. %% ! defined SERVER_SIDE_ERPC_IS_MANDATORY
-
-spec block_call(Node, Module, Function, Args) -> Res | {badrpc, Reason} when
Node :: node(),
Module :: module(),
@@ -573,8 +528,6 @@ server_call(Node, Name, ReplyWrapper, Msg)
Function :: atom(),
Args :: [term()].
--ifdef(SERVER_SIDE_ERPC_IS_MANDATORY).
-
cast(Node, Mod, Fun, Args) ->
try
ok = erpc:cast(Node, Mod, Fun, Args)
@@ -584,32 +537,6 @@ cast(Node, Mod, Fun, Args) ->
end,
true.
--else.
-
-cast(Node, Mod, Fun, Args) when is_atom(Node),
- is_atom(Mod),
- is_atom(Fun),
- is_list(Args) ->
- _ = case node_has_feature(Node, erpc) of
- false ->
- gen_server:cast({?NAME,Node},
- {cast,Mod,Fun,Args,group_leader()});
- true ->
- try
- ok = erpc:cast(Node, Mod, Fun, Args)
- catch
- error:{erpc, badarg} ->
- error(badarg)
- end
- end,
- true;
-cast(_, _, _, _) ->
- error(badarg).
-
-
--endif.
-
-
%% Asynchronous broadcast, returns nothing, it's just send 'n' pray
-spec abcast(Name, Msg) -> abcast when
Name :: atom(),
@@ -630,9 +557,9 @@ abcast([Node|Tail], Name, Mess) ->
abcast([], _,_) -> abcast.
-%% Syncronous broadcast, returns a list of the nodes which had Name
+%% Synchronous broadcast, returns a list of the nodes which had Name
%% as a registered server. Returns {Goodnodes, Badnodes}.
-%% Syncronous in the sense that we know that all servers have received the
+%% Synchronous in the sense that we know that all servers have received the
%% message when we return from the call, we can't know that they have
%% processed the message though.
@@ -741,21 +668,14 @@ multicall(M, F, A, Timeout) ->
ResL :: [Res :: term() | {'badrpc', Reason :: term()}],
BadNodes :: [node()].
--ifdef(SERVER_SIDE_ERPC_IS_MANDATORY).
-
-%%
-%% Use this more efficient implementation of multicall()
-%% when 'erpc' support can be made mandatory for server
-%% side.
-%%
multicall(Nodes, M, F, A, Timeout) ->
%%
%% We want to use erpc:multicall() and then convert the result
%% instead of using erpc:send_request()/erpc:receive_response()
- %% directly. This since it is expected that erpc:multicall()
- %% will be able to utilize a future message queue optimization
- %% that erpc:send_request()/erpc:receive_response() most likely
- %% wont be able to (only the future will tell...).
+ %% directly. This since erpc:multicall() is able to utilize the
+ %% selective receive optimization when all clauses match on the
+ %% same reference. erpc:send_request()/erpc:receive_response()
+ %% is not able to utilize such optimizations.
%%
ERpcRes = try
erpc:multicall(Nodes, M, F, A, Timeout)
@@ -778,256 +698,6 @@ rpcmulticallify([N|Ns], [{error, {erpc, Reason}}|Rlts], Ok, Err)
rpcmulticallify([_N|Ns], [{Class, Reason}|Rlts], Ok, Err) ->
rpcmulticallify(Ns, Rlts, [rpcify_exception(Class, Reason)|Ok], Err).
--else. %% ! defined SERVER_SIDE_ERPC_IS_MANDATORY
-
-%%
-%% Currently used implementation for multicall(). When
-%% 'erpc' support can be required for server side,
-%% replace with the implementation above...
-%%
-
-multicall(Nodes, M, F, A, Timeout) ->
- try
- true = is_atom(M),
- true = is_atom(F),
- true = is_list(A),
- Deadline = deadline(Timeout),
- Res = make_ref(),
- MFA = {M, F, A},
- {NRs, ReqMap0} = mc_requests(Res, Nodes, M, F, A, [], #{}),
- ReqMap1 = mc_spawn_replies(Res, maps:size(ReqMap0), ReqMap0,
- MFA, Deadline),
- mc_results(Res, NRs, [], [], ReqMap1, MFA, Deadline)
- catch
- error:NotIError when NotIError /= internal_error ->
- error(badarg)
- end.
-
-mc_requests(_Res, [], _M, _F, _A, NRs, ReqMap) ->
- {NRs, ReqMap};
-mc_requests(Res, [N|Ns], M, F, A, NRs, ReqMap) ->
- ReqId = try
- spawn_request(N, erpc, execute_call,
- [Res, M, F, A],
- [{reply_tag, {spawn_reply, Res, N}},
- monitor])
- catch
- _:_ ->
- mc_fail_requests(Res, NRs)
- end,
- NR = {N, ReqId},
- mc_requests(Res, Ns, M, F, A, [NR|NRs], ReqMap#{ReqId => spawn_request});
-mc_requests(Res, _Error, _M, _F, _A, NRs, _ReqMap) ->
- mc_fail_requests(Res, NRs).
-
-%% Abandon any requests sent then fail...
-mc_fail_requests(_Res, []) ->
- error(badarg);
-mc_fail_requests(Res, [{Node, ReqId} | NRs]) ->
- case spawn_request_abandon(ReqId) of
- true ->
- ok;
- false ->
- receive
- {{spawn_reply, Res, Node}, ReqId, error, _} ->
- ok;
- {{spawn_reply, Res, Node}, ReqId, ok, Pid} ->
- case erlang:demonitor(ReqId, [info]) of
- true ->
- ok;
- false ->
- receive
- {'DOWN', ReqId, process, Pid, _} ->
- ok
- after
- 0 ->
- error(internal_error)
- end
- end
- after
- 0 ->
- error(internal_error)
- end
- end,
- mc_fail_requests(Res, NRs).
-
-mc_spawn_replies(_Res, 0, ReqMap, _MFA, _Deadline) ->
- ReqMap;
-mc_spawn_replies(Res, Outstanding, ReqMap, MFA, Deadline) ->
- Timeout = time_left(Deadline),
- receive
- {{spawn_reply, Res, _}, _, _, _} = Reply ->
- NewReqMap = mc_handle_spawn_reply(Reply, ReqMap, MFA, Deadline),
- mc_spawn_replies(Res, Outstanding-1, NewReqMap, MFA, Deadline)
- after
- Timeout ->
- ReqMap
- end.
-
-mc_handle_spawn_reply({{spawn_reply, _Res, _Node}, ReqId, ok, Pid},
- ReqMap, _MFA, _Deadline) ->
- ReqMap#{ReqId => {spawn, Pid}};
-mc_handle_spawn_reply({{spawn_reply, _Res, Node}, ReqId, error, notsup},
- ReqMap, MFA, infinity) ->
- {M, F, A} = MFA,
- SrvReqId = gen_server:send_request({?NAME, Node},
- {call, M,F,A,
- group_leader()}),
- ReqMap#{ReqId => {server, SrvReqId}};
-mc_handle_spawn_reply({{spawn_reply, Res, Node}, ReqId, error, notsup},
- ReqMap, MFA, Deadline) ->
- {M, F, A} = MFA,
- try
- {Pid, Mon} = spawn_monitor(fun () ->
- process_flag(trap_exit, true),
- Request = {call, M,F,A,
- group_leader()},
- Timeout = time_left(Deadline),
- Result = gen_server:call({?NAME,
- Node},
- Request,
- Timeout),
- exit({Res, Result})
- end),
- ReqMap#{ReqId => {spawn_server, Mon, Pid}}
- catch
- error:system_limit ->
- ReqMap#{ReqId => {error, {badrpc, {'EXIT', system_limit}}}}
- end;
-mc_handle_spawn_reply({{spawn_reply, _Res, _Node}, ReqId, error, noconnection},
- ReqMap, _MFA, _Deadline) ->
- ReqMap#{ReqId => {error, badnode}};
-mc_handle_spawn_reply({{spawn_reply, _Res, _Node}, ReqId, error, Reason},
- ReqMap, _MFA, _Deadline) ->
- ReqMap#{ReqId => {error, {badrpc, {'EXIT', Reason}}}}.
-
-mc_results(_Res, [], OkAcc, ErrAcc, _ReqMap, _MFA, _Deadline) ->
- {OkAcc, ErrAcc};
-mc_results(Res, [{N,ReqId}|NRs] = OrigNRs, OkAcc, ErrAcc,
- ReqMap, MFA, Deadline) ->
- case maps:get(ReqId, ReqMap) of
- {error, badnode} ->
- mc_results(Res, NRs, OkAcc, [N|ErrAcc], ReqMap, MFA, Deadline);
- {error, BadRpc} ->
- mc_results(Res, NRs, [BadRpc|OkAcc], ErrAcc, ReqMap,
- MFA, Deadline);
- spawn_request ->
- %% We timed out waiting for spawn replies...
- case spawn_request_abandon(ReqId) of
- true ->
- %% Timed out request...
- mc_results(Res, NRs, OkAcc, [N|ErrAcc], ReqMap,
- MFA, Deadline);
- false ->
- %% Reply has been delivered now; handle it...
- receive
- {{spawn_reply, Res, _}, ReqId, _, _} = Reply ->
- NewReqMap = mc_handle_spawn_reply(Reply, ReqMap,
- MFA, Deadline),
- mc_results(Res, OrigNRs, OkAcc, ErrAcc,
- NewReqMap, MFA, Deadline)
- after 0 ->
- error(internal_error)
- end
- end;
- {spawn, Pid} ->
- Timeout = time_left(Deadline),
- receive
- {'DOWN', ReqId, process, Pid, Reason} ->
- case ?RPCIFY(erpc:call_result(down, ReqId, Res, Reason)) of
- {badrpc, nodedown} ->
- mc_results(Res, NRs, OkAcc, [N|ErrAcc],
- ReqMap, MFA, Deadline);
- CallRes ->
- mc_results(Res, NRs, [CallRes|OkAcc],
- ErrAcc, ReqMap, MFA, Deadline)
- end
- after
- Timeout ->
- case erlang:demonitor(ReqId, [info]) of
- true ->
- mc_results(Res, NRs, OkAcc, [N|ErrAcc],
- ReqMap, MFA, Deadline);
- false ->
- receive
- {'DOWN', ReqId, process, Pid, Reason} ->
- case ?RPCIFY(erpc:call_result(down,
- ReqId,
- Res,
- Reason)) of
- {badrpc, nodedown} ->
- mc_results(Res, NRs, OkAcc,
- [N|ErrAcc], ReqMap,
- MFA, Deadline);
- CallRes ->
- mc_results(Res, NRs,
- [CallRes|OkAcc],
- ErrAcc, ReqMap,
- MFA, Deadline)
- end
- after 0 ->
- error(internal_error)
- end
- end
- end;
- {spawn_server, Mon, Pid} ->
- %% Old node with timeout on the call...
- Result = receive
- {'DOWN', Mon, process, Pid, {Res, CallRes}} ->
- rpc_check(CallRes);
- {'DOWN', Mon, process, Pid, Reason} ->
- rpc_check_t({'EXIT',Reason})
- end,
- case Result of
- {badrpc, BadRpcReason} when BadRpcReason == timeout;
- BadRpcReason == nodedown ->
- mc_results(Res, NRs, OkAcc, [N|ErrAcc],
- ReqMap, MFA, Deadline);
- _ ->
- mc_results(Res, NRs, [Result|OkAcc], ErrAcc, ReqMap,
- MFA, Deadline)
- end;
- {server, SrvReqId} ->
- %% Old node without timeout on the call...
- case gen_server:wait_response(SrvReqId, infinity) of
- {reply, Reply} ->
- Result = rpc_check(Reply),
- mc_results(Res, NRs, [Result|OkAcc], ErrAcc,
- ReqMap, MFA, Deadline);
- {error, {noconnection, _}} ->
- mc_results(Res, NRs, OkAcc, [N|ErrAcc],
- ReqMap, MFA, Deadline);
- {error, {Reason, _}} ->
- BadRpc = {badrpc, {'EXIT', Reason}},
- mc_results(Res, NRs, [BadRpc|OkAcc], ErrAcc,
- ReqMap, MFA, Deadline)
- end
- end.
-
-deadline(infinity) ->
- infinity;
-deadline(?MAX_INT_TIMEOUT) ->
- erlang:convert_time_unit(erlang:monotonic_time(millisecond)
- + ?MAX_INT_TIMEOUT,
- millisecond,
- native);
-deadline(T) when ?IS_VALID_TMO_INT(T) ->
- Now = erlang:monotonic_time(),
- NativeTmo = erlang:convert_time_unit(T, millisecond, native),
- Now + NativeTmo.
-
-time_left(infinity) ->
- infinity;
-time_left(Deadline) ->
- case Deadline - erlang:monotonic_time() of
- TimeLeft when TimeLeft =< 0 ->
- 0;
- TimeLeft ->
- erlang:convert_time_unit(TimeLeft-1, native, millisecond) + 1
- end.
-
--endif. %% ! defined SERVER_SIDE_ERPC_IS_MANDATORY
-
%% Send Msg to Name on all nodes, and collect the answers.
%% Return {Replies, Badnodes} where Badnodes is a list of the nodes
%% that failed during the timespan of the call.
@@ -1081,18 +751,10 @@ rec_nodes(Name, [{N,R} | Tail], Badnodes, Replies) ->
end.
%% Now for an asynchronous rpc.
-%% An asyncronous version of rpc that is faster for series of
+%% An asynchronous version of rpc that is faster for series of
%% rpc's towards the same node. I.e. it returns immediately and
%% it returns a Key that can be used in a subsequent yield(Key).
--ifdef(SERVER_SIDE_ERPC_IS_MANDATORY).
-
-%%
-%% Use this more efficient implementation of async_call()
-%% when 'erpc' support can be made mandatory for server
-%% side.
-%%
-
-opaque key() :: erpc:request_id().
-spec async_call(Node, Module, Function, Args) -> Key when
@@ -1124,17 +786,16 @@ yield(Key) ->
Val :: (Res :: term()) | {badrpc, Reason :: term()}.
nb_yield(Key, Tmo) ->
- case ?RPCIFY(erpc:wait_response(Key, Tmo)) of
+ try erpc:wait_response(Key, Tmo) of
no_response ->
timeout;
{response, {'EXIT', _} = BadRpc} ->
- %% RPCIFY() cannot handle this case...
{value, {badrpc, BadRpc}};
{response, R} ->
- {value, R};
- BadRpc ->
- %% An exception converted by RPCIFY()...
- {value, BadRpc}
+ {value, R}
+ catch
+ Class:Reason ->
+ {value, rpcify_exception(Class, Reason)}
end.
-spec nb_yield(Key) -> {value, Val} | timeout when
@@ -1144,78 +805,6 @@ nb_yield(Key, Tmo) ->
nb_yield(Key) ->
nb_yield(Key, 0).
--else. %% ! defined SERVER_SIDE_ERPC_IS_MANDATORY
-
-%%
-%% Currently used implementation for async_call(). When
-%% 'erpc' support can be required for server side,
-%% replace with the implementation above...
-%%
-
--opaque key() :: {pid(), reference()}.
-
--spec async_call(Node, Module, Function, Args) -> Key when
- Node :: node(),
- Module :: module(),
- Function :: atom(),
- Args :: [term()],
- Key :: key().
-
-async_call(Node, Mod, Fun, Args) ->
- try
- true = is_atom(Node),
- true = is_atom(Mod),
- true = is_atom(Fun),
- true = is_integer(length(Args))
- catch
- _:_ ->
- error(badarg)
- end,
- Caller = self(),
- spawn_monitor(fun() ->
- process_flag(trap_exit, true),
- R = call(Node, Mod, Fun, Args),
- exit({async_call_result, Caller, R})
- end).
-
--spec yield(Key) -> Res | {badrpc, Reason} when
- Key :: key(),
- Res :: term(),
- Reason :: term().
-
-yield({Pid, Ref} = Key) when is_pid(Pid),
- is_reference(Ref) ->
- {value,R} = nb_yield(Key, infinity),
- R.
-
--spec nb_yield(Key) -> {value, Val} | timeout when
- Key :: key(),
- Val :: (Res :: term()) | {badrpc, Reason :: term()}.
-
-nb_yield({Pid, Ref} = Key) when is_pid(Pid),
- is_reference(Ref) ->
- nb_yield(Key, 0).
-
--spec nb_yield(Key, Timeout) -> {value, Val} | timeout when
- Key :: key(),
- Timeout :: ?TIMEOUT_TYPE,
- Val :: (Res :: term()) | {badrpc, Reason :: term()}.
-
-nb_yield({Proxy, Mon}, Tmo) when is_pid(Proxy),
- is_reference(Mon),
- ?IS_VALID_TMO(Tmo) ->
- Me = self(),
- receive
- {'DOWN', Mon, process, Proxy, {async_call_result, Me, R}} ->
- {value,R};
- {'DOWN', Mon, process, Proxy, Reason} ->
- {value, {badrpc, {'EXIT', Reason}}}
- after Tmo ->
- timeout
- end.
-
--endif. %% ! defined SERVER_SIDE_ERPC_IS_MANDATORY
-
%% A parallel network evaluator
%% ArgL === [{M,F,Args},........]
%% Returns a lists of the evaluations in the same order as
@@ -1315,7 +904,7 @@ cnode_call_group_leader_loop(State) ->
From ! {io_reply, ReplyAs, Reply},
cnode_call_group_leader_loop(NewState);
{stop, StopRequesterPid, Ref, To, Reply} ->
- gen_server:reply(To, Reply),
+ reply(To, Reply),
StopRequesterPid ! Ref,
ok;
_Unknown ->
diff --git a/lib/kernel/src/socket.erl b/lib/kernel/src/socket.erl
index c188f516a1..490a970f52 100644
--- a/lib/kernel/src/socket.erl
+++ b/lib/kernel/src/socket.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -317,6 +317,13 @@
outgoing | loopback | user | kernel | fastroute |
non_neg_integer().
+-type hatype() :: netrom | eether | ether | ax25 | pronet | chaos |
+ ieee802 | arcnet | appletlk | dlci | atm | metricom |
+ ieee1394 | eui64 | infiniband |
+ tunnel | tunnel6 | loopback | localtlk |
+ none | void |
+ non_neg_integer().
+
-type sockaddr_un() ::
#{family := 'local',
path := binary() | string()}.
@@ -336,7 +343,7 @@
protocol := non_neg_integer(),
ifindex := integer(),
pkttype := packet_type(),
- hatype := non_neg_integer(),
+ hatype := hatype(),
addr := binary()}.
-type sockaddr_unspec() ::
#{family := 'unspec', addr := binary()}.
@@ -619,7 +626,7 @@
%% Even if we are able to decode both level and type, we may not be
%% able to decode the data. The data is always delivered as a binary()
%% and a decoded value is delivered in the 'value' field, if decoding
-%% is succesful.
+%% is successful.
-type cmsg() :: cmsg_recv() | cmsg_send().
@@ -806,7 +813,7 @@ number_of() ->
%% *** which_sockets/0,1 ***
%%
%% Interface function to the socket registry
-%% Returns a list of all the sockets, accoring to the filter rule.
+%% Returns a list of all the sockets, according to the filter rule.
%%
-spec which_sockets() -> [socket()].
@@ -976,7 +983,7 @@ use_registry(D) when is_boolean(D) ->
%%
%% This produces a list of "all" the sockets, and some info about each one.
%% This function is intended as a utility and debug function.
-%% The sockets can be selected from domain, type or porotocol.
+%% The sockets can be selected from domain, type or protocol.
%% The sockets are not sorted.
%%
%% ===========================================================================
@@ -1206,8 +1213,18 @@ fmt_port(N, Proto) ->
-spec info() -> info().
%%
info() ->
- prim_socket:info().
-
+ try
+ prim_socket:info()
+ catch error:undef:ST ->
+ case ST of
+ %% We rewrite errors coming from prim_socket not existing
+ %% to enotsup.
+ [{prim_socket,info,[],_}|_] ->
+ erlang:raise(error,notsup,ST);
+ _ ->
+ erlang:raise(error,undef,ST)
+ end
+ end.
-spec info(Socket) -> socket_info() when
Socket :: socket().
@@ -1277,7 +1294,7 @@ cancel_monitor(MRef) ->
%%
%% supports - get information about what the platform "supports".
%%
-%% Generates a list of various info about what the plaform can support.
+%% Generates a list of various info about what the platform can support.
%% The most obvious case is 'options'.
%%
%% Each item in a 'supports'-list will appear only *one* time.
@@ -1338,7 +1355,7 @@ is_supported(options, Level, Opt) when is_atom(Level), is_atom(Opt) ->
%% The nif sets up a monitor to this process, and if it dies the socket
%% is closed. It is also used if someone wants to monitor the socket.
%%
-%% We may therefor need monitor function(s):
+%% We may therefore need monitor function(s):
%%
%% socket:monitor(Socket)
%% socket:demonitor(Socket)
@@ -3945,7 +3962,7 @@ setopt_native(Socket, SocketOption, Value) ->
%% If its an "invalid" option, we should not crash but return some
%% useful error...
%%
-%% When specifying level as an integer, and therefor using "native mode",
+%% When specifying level as an integer, and therefore using "native mode",
%% we should make it possible to specify common types instead of the
%% value size. Example: int | bool | {string, pos_integer()} | non_neg_integer()
%%
diff --git a/lib/kernel/test/Makefile b/lib/kernel/test/Makefile
index 62909d324d..12e6c42f7c 100644
--- a/lib/kernel/test/Makefile
+++ b/lib/kernel/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2021. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -113,7 +113,6 @@ MODULES= \
cleanup \
ignore_cores \
zlib_SUITE \
- loose_node \
sendfile_SUITE \
standard_error_SUITE \
multi_load_SUITE \
@@ -132,13 +131,17 @@ APP_FILES = \
topApp2.app \
topApp3.app
-ERL_FILES= $(MODULES:%=%.erl) code_a_test.erl
+SASL_MODULES= otp_vsns
+
+ERL_FILES= $(MODULES:%=%.erl) code_a_test.erl $(SASL_MODULES:%=$(ERL_TOP)/lib/sasl/test/%.erl)
HRL_FILES= \
kernel_test_lib.hrl \
socket_test_evaluator.hrl \
socket_test_ttest.hrl \
socket_test_ttest_client.hrl
+EXTRA_FILES= $(ERL_TOP)/otp_versions.table
+
TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
INSTALL_PROGS= $(TARGET_FILES)
@@ -176,10 +179,10 @@ erl_uds_dist.erl: ../examples/erl_uds_dist/src/erl_uds_dist.erl
make_emakefile: $(ERL_FILES)
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) '*_SUITE_make' \
> $(EMAKEFILE)
- $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) \
+ $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) $(SASL_MODULES) \
>> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
@@ -203,11 +206,12 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) "$(RELSYSDIR)"
$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)"
- $(INSTALL_DATA) $(APP_FILES) "$(RELSYSDIR)"
+ $(INSTALL_DATA) $(APP_FILES) $(EXTRA_FILES) "$(RELSYSDIR)"
$(INSTALL_DATA) \
kernel.spec kernel_smoke.spec kernel_bench.spec logger.spec \
$(EMAKEFILE) $(COVERFILE) "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
@tar cf - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -)
+ $(INSTALL_DATA) $(ERL_TOP)/make/otp_version_tickets "$(RELSYSDIR)/kernel_SUITE_data"
release_docs_spec:
diff --git a/lib/kernel/test/application_SUITE.erl b/lib/kernel/test/application_SUITE.erl
index 3584b90378..6817435576 100644
--- a/lib/kernel/test/application_SUITE.erl
+++ b/lib/kernel/test/application_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -225,7 +225,7 @@ failover(Conf) when is_list(Conf) ->
%%-----------------------------------------------------------------
%% Tests failover and takeover for distributed applications. Tests
%% start, load etc implicitly. The applications do not use start_phases
-%% i.e. the failover should be transfered to normal start type.
+%% i.e. the failover should be transferred to normal start type.
failover_comp(Conf) when is_list(Conf) ->
%% start a help process to check the start type
StPid = spawn_link(?MODULE, start_type, []),
@@ -371,7 +371,7 @@ permissions(Conf) when is_list(Conf) ->
false = is_started(app1, Cp3),
true = is_started(app1, Cp2),
- %% Start app3, make sure noone starts it
+ %% Start app3, make sure no one starts it
{[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app3()]),
?UNTIL(is_loaded(app3, Cps)),
@@ -744,7 +744,7 @@ permit_false_start_local(Conf) when is_list(Conf) ->
true = is_started(app1, Cp2),
false = is_started(app1, Cp3),
- %% Unpermit it agin
+ %% Unpermit it again
ok = rpc:call(Cp1, application, permit, [app1, false]),
ct:sleep(1000),
false = is_started(app1, Cp1),
@@ -1225,7 +1225,7 @@ otp_2718(Conf) when is_list(Conf) ->
%% Ticket: OTP-2973
%% Slogan: application:start does not test if an appl is already starting...
%%-----------------------------------------------------------------
-%% Test of two processes simultanously starting the same application.
+%% Test of two processes simultaneously starting the same application.
otp_2973(Conf) when is_list(Conf) ->
%% Write a .app file
{ok, Fd} = file:open("app0.app", [write]),
diff --git a/lib/kernel/test/bif_SUITE.erl b/lib/kernel/test/bif_SUITE.erl
index 2369dd8b71..14ab4519a1 100644
--- a/lib/kernel/test/bif_SUITE.erl
+++ b/lib/kernel/test/bif_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -91,7 +91,7 @@ spawn1(Config) when is_list(Config) ->
%% Test spawn/2.
spawn2(Config) when is_list(Config) ->
- {ok, Node} = start_node(spawn2),
+ {ok, Peer, Node} = ?CT_PEER(),
Parent = self(),
{_, _, FA, _} = fetch_proc_vals(self()),
@@ -105,7 +105,7 @@ spawn2(Config) when is_list(Config) ->
check_proc_vals(false, normal, FA, 0, PV)
end,
- true = stop_node(Node),
+ peer:stop(Peer),
ok.
@@ -131,7 +131,7 @@ spawn3(Config) when is_list(Config) ->
%% Test spawn/4.
spawn4(Config) when is_list(Config) ->
- {ok, Node} = start_node(spawn4),
+ {ok, Peer, Node} = ?CT_PEER(),
Parent = self(),
{_, _, FA, _} = fetch_proc_vals(self()),
@@ -149,7 +149,7 @@ spawn4(Config) when is_list(Config) ->
check_proc_vals(false, normal, FA, 0, PV)
end,
- true = stop_node(Node),
+ peer:stop(Peer),
ok.
@@ -171,7 +171,7 @@ spawn_link1(Config) when is_list(Config) ->
%% Test spawn_link/2.
spawn_link2(Config) when is_list(Config) ->
- {ok, Node} = start_node(spawn_link2),
+ {ok, Peer, Node} = ?CT_PEER(),
Parent = self(),
{_, _, FA, _} = fetch_proc_vals(self()),
@@ -185,7 +185,7 @@ spawn_link2(Config) when is_list(Config) ->
check_proc_vals(true, normal, FA, 0, PV)
end,
- true = stop_node(Node),
+ peer:stop(Peer),
ok.
%% Test spawn_link/3.
@@ -210,7 +210,7 @@ spawn_link3(Config) when is_list(Config) ->
%% Test spawn_link/4.
spawn_link4(Config) when is_list(Config) ->
- {ok, Node} = start_node(spawn_link4),
+ {ok, Peer, Node} = ?CT_PEER(),
Parent = self(),
{_, _, FA, _} = fetch_proc_vals(self()),
@@ -228,7 +228,7 @@ spawn_link4(Config) when is_list(Config) ->
check_proc_vals(true, normal, FA, 0, PV)
end,
- true = stop_node(Node),
+ peer:stop(Peer),
ok.
@@ -259,7 +259,7 @@ spawn_opt2(Config) when is_list(Config) ->
%% Test spawn_opt/3.
spawn_opt3(Config) when is_list(Config) ->
- {ok, Node} = start_node(spawn_opt3),
+ {ok, Peer, Node} = ?CT_PEER(),
Parent = self(),
{_, _, FA, _} = fetch_proc_vals(self()),
P1 = spawn_opt(Node,
@@ -281,7 +281,7 @@ spawn_opt3(Config) when is_list(Config) ->
Node = node(P2),
check_proc_vals(false, normal, FA, 10, PV2)
end,
- true = stop_node(Node),
+ peer:stop(Peer),
ok.
%% Test spawn_opt/4.
@@ -316,7 +316,7 @@ spawn_opt4(Config) when is_list(Config) ->
%% Test spawn_opt/5.
spawn_opt5(Config) when is_list(Config) ->
- {ok, Node} = start_node(spawn_opt5),
+ {ok, Peer, Node} = ?CT_PEER(),
Parent = self(),
{_, _, FA, _} = fetch_proc_vals(self()),
P1 = spawn_opt(Node,
@@ -344,13 +344,13 @@ spawn_opt5(Config) when is_list(Config) ->
Node = node(P2),
check_proc_vals(false, normal, FA, 10, PV2)
end,
- true = stop_node(Node),
+ peer:stop(Peer),
ok.
%% Test failure behavior of spawn bifs.
spawn_failures(Config) when is_list(Config) ->
ThisNode = node(),
- {ok, Node} = start_node(spawn_remote_failure),
+ {ok, Peer, Node} = ?CT_PEER(),
%% unknown nodes
io:format("Testing unknown nodes~n", []),
@@ -466,7 +466,7 @@ spawn_failures(Config) when is_list(Config) ->
{'EXIT', {badarg, _}} = (catch spawn_opt(erlang,nodes,[],[a|b])),
- true = stop_node(Node),
+ peer:stop(Peer),
ok.
check_proc_vals(Link, Priority, FullsweepAfter, MinHeapSize, {Ls, P, FA, HS}) ->
@@ -518,15 +518,7 @@ wilderness(Config) when is_list(Config) ->
run_wilderness_test({Set_tt, Set_tp}, {Exp_tt, Exp_tp}) ->
Self = self(),
Ref = make_ref(),
- SuiteDir = filename:dirname(code:which(?MODULE)),
- {ok, Node} = test_server:start_node(allocator_test,
- slave,
- [{args,
- " -pa "
- ++ SuiteDir
- ++" +MYtt "++to_string(Set_tt)
- ++" +MYtp "++to_string(Set_tp)},
- {linked, false}]),
+ {ok, Peer, Node} = ?CT_PEER(["+MYtt", to_string(Set_tt), "+MYtp", to_string(Set_tp)]),
spawn(Node, fun () ->
Self ! {Ref, erlang:system_info(allocator)}
end),
@@ -541,7 +533,7 @@ run_wilderness_test({Set_tt, Set_tp}, {Exp_tt, Exp_tp}) ->
{value, {tt, Ett}} = lists:keysearch(tt, 1, SA_Opts),
{value, {tp, Etp}} = lists:keysearch(tp, 1, SA_Opts)
end,
- stop_node(Node).
+ peer:stop(Peer).
to_string(X) when is_integer(X) ->
integer_to_list(X);
@@ -550,30 +542,5 @@ to_string(X) when is_atom(X) ->
to_string(X) when is_list(X) ->
X.
-get_nodenames(N, T) ->
- get_nodenames(N, T, []).
-
-get_nodenames(0, _, Acc) ->
- Acc;
-get_nodenames(N, T, Acc) ->
- {A, B, C} = now(),
- get_nodenames(N-1, T, [list_to_atom(atom_to_list(?MODULE)
- ++ "-"
- ++ atom_to_list(T)
- ++ "-"
- ++ integer_to_list(A)
- ++ "-"
- ++ integer_to_list(B)
- ++ "-"
- ++ integer_to_list(C)) | Acc]).
-
-start_node(TestCase) ->
- [Name] = get_nodenames(1, TestCase),
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, slave, [{args, "-pa " ++ Pa}]).
-
-stop_node(Node) ->
- true = test_server:stop_node(Node).
-
run_fun(Fun) ->
Fun().
diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl
index a6dd3b3f54..7059d477d9 100644
--- a/lib/kernel/test/code_SUITE.erl
+++ b/lib/kernel/test/code_SUITE.erl
@@ -303,7 +303,7 @@ replace_path(Config) when is_list(Config) ->
true = code:set_path(P), %Reset path
ok = file:del_dir("./kernel-2.11"),
- %% Add a completly new application.
+ %% Add a completely new application.
NewAppName = 'blurf_blarfer',
NewAppDir = filename:join(Cwd, atom_to_list(NewAppName) ++ "-6.33.1"),
@@ -657,8 +657,7 @@ set_path_file(Config) when is_list(Config) ->
%% Test that a module with the same name as a module in
%% a sticky directory cannot be loaded.
sticky_dir(Config) when is_list(Config) ->
- Pa = filename:dirname(code:which(?MODULE)),
- {ok,Node} = test_server:start_node(sticky_dir, slave, [{args,"-pa "++Pa}]),
+ {ok, Peer, Node} = ?CT_PEER(),
Mods = [code,lists,erlang,init],
OutDir = filename:join(proplists:get_value(priv_dir, Config), sticky_dir),
_ = file:make_dir(OutDir),
@@ -671,7 +670,7 @@ sticky_dir(Config) when is_list(Config) ->
io:format("~p\n", [Other]),
ct:fail(failed)
end,
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
sticky_compiler(Files, PrivDir) ->
@@ -709,22 +708,17 @@ pa_pz_option(Config) when is_list(Config) ->
DDir = proplists:get_value(data_dir,Config),
PaDir = filename:join(DDir,"pa"),
PzDir = filename:join(DDir,"pz"),
- {ok, Node}=test_server:start_node(pa_pz1, slave,
- [{args,
- "-pa " ++ PaDir
- ++ " -pz " ++ PzDir}]),
+ {ok, Peer, Node} = ?CT_PEER(["-pa", PaDir, "-pz", PzDir]),
Ret=rpc:call(Node, code, get_path, []),
[PaDir|Paths] = Ret,
[PzDir|_] = lists:reverse(Paths),
- test_server:stop_node(Node),
- {ok, Node2}=test_server:start_node(pa_pz2, slave,
- [{args,
- "-mode embedded " ++ "-pa "
- ++ PaDir ++ " -pz " ++ PzDir}]),
+ peer:stop(Peer),
+ {ok, Peer2, Node2} = ?CT_PEER(["-mode", "embedded", "-pa",
+ PaDir, "-pz", PzDir]),
Ret2=rpc:call(Node2, code, get_path, []),
[PaDir|Paths2] = Ret2,
[PzDir|_] = lists:reverse(Paths2),
- test_server:stop_node(Node2).
+ peer:stop(Peer2).
%% add_path, del_path should not cause priv_dir(App) to fail.
add_del_path(Config) when is_list(Config) ->
@@ -776,7 +770,7 @@ clash(Config) when is_list(Config) ->
true = code:add_path(TmpEzFile++"/foobar-0.1/ebin"),
case os:type() of
{win32,_} ->
- %% The file wont be deleted on windows until it's closed, why we
+ %% The file won't be deleted on windows until it's closed, why we
%% need to rename instead.
ok = file:rename(TmpEzFile,TmpEzFile++".moved");
_ ->
@@ -878,13 +872,15 @@ check_funs({'$M_EXPR','$F_EXPR',_},
[{code_server,do_mod_call,4},
{code_server,handle_call,3}|_]) -> 0;
check_funs({'$M_EXPR','$F_EXPR',_},
- [{lists,flatmap,2},
+ [{lists,flatmap_1,2},
+ {lists,flatmap,2},
{lists,concat,1},
{code_server,load_abs,4},
{code_server,handle_call,3},
{code_server,loop,1}|_]) -> 0;
check_funs({'$M_EXPR','$F_EXPR',_},
- [{lists,foreach,2},
+ [{lists,foreach_1,2},
+ {lists,foreach,2},
{code_server,stick_dir,3},
{code_server,handle_call,3},
{code_server,loop,1}|_]) -> 0;
@@ -901,6 +897,19 @@ check_funs({'$M_EXPR','$F_EXPR',1},
{code_server,init,3},
{code_server,start_link,1}]) -> 0;
check_funs({'$M_EXPR','$F_EXPR',1},
+ [{lists,all_1,2},
+ {lists,all,2},
+ {code_server,is_numstr,1},
+ {code_server,is_vsn,1},
+ {code_server,vsn_to_num,1},
+ {code_server,create_bundle,2},
+ {code_server,choose_bundles,1},
+ {code_server,make_path,2},
+ {code_server,get_user_lib_dirs_1,1},
+ {code_server,get_user_lib_dirs,0},
+ {code_server,init,3},
+ {code_server,start_link,1}]) -> 0;
+check_funs({'$M_EXPR','$F_EXPR',1},
[{lists,filter,2},
{code_server,try_archive_subdirs,3}|_]) -> 0;
check_funs({'$M_EXPR','$F_EXPR',_},
@@ -991,16 +1000,16 @@ mult_lib_roots(Config) when is_list(Config) ->
mult_lib_compile(DataDir,
"my_dummy_app-c/ebin/code_SUITE_mult_root_module"),
- %% Set up ERL_LIBS and start a slave node.
+ %% Set up ERL_LIBS and start a peer node.
ErlLibs = filename:join(DataDir, "first_root") ++ mult_lib_sep() ++
filename:join(DataDir, "second_root"),
- {ok,Node} =
- test_server:start_node(mult_lib_roots, slave,
- [{args,"-env ERL_LIBS "++ErlLibs}]),
+ {ok, Peer, Node} = ?CT_PEER(["-env", "ERL_LIBS", ErlLibs]),
Path0 = rpc:call(Node, code, get_path, []),
- ["."|Path1] = Path0,
+ %% ?CT_PEER adds extra path to this module folder
+ PathToSelf = filename:dirname(code:which(?MODULE)),
+ [PathToSelf, "."|Path1] = Path0,
[Kernel|Path2] = Path1,
[Stdlib|Path3] = Path2,
mult_lib_verify_lib(Kernel, "kernel"),
@@ -1018,6 +1027,7 @@ mult_lib_roots(Config) when is_list(Config) ->
io:format("~p\n", [Path]),
true = rpc:call(Node, code_SUITE_mult_root_module, works_fine, []),
+ peer:stop(Peer),
ok.
@@ -1050,16 +1060,13 @@ bad_erl_libs(Config) when is_list(Config) ->
false -> BadLibs0;
Libs -> BadLibs0 ++ ":" ++ Libs
end,
- {ok,Node} =
- test_server:start_node(bad_erl_libs, slave, []),
+ {ok, Peer, Node} = ?CT_PEER(),
Code = rpc:call(Node,code,get_path,[]),
- test_server:stop_node(Node),
+ peer:stop(Peer),
- {ok,Node2} =
- test_server:start_node(bad_erl_libs, slave,
- [{args,"-env ERL_LIBS " ++ BadLibs}]),
- Code2 = rpc:call(Node,code,get_path,[]),
- test_server:stop_node(Node2),
+ {ok, Peer2, Node2} = ?CT_PEER(["-env", "ERL_LIBS", BadLibs]),
+ Code2 = rpc:call(Node2,code,get_path,[]),
+ peer:stop(Peer2),
%% Test that code path is not affected by the faulty ERL_LIBS
Code = Code2,
@@ -1117,10 +1124,8 @@ do_code_archive(Config, Root, StripVsn) when is_list(Config) ->
filelib:ensure_dir(OtherFile),
ok = file:write_file(OtherFile, OtherContents),
- %% Set up ERL_LIBS and start a slave node.
- {ok, Node} =
- test_server:start_node(code_archive, slave,
- [{args,"-env ERL_LIBS " ++ RootDir}]),
+ %% Set up ERL_LIBS and start a peer node.
+ {ok, Peer, Node} = ?CT_PEER(["-env", "ERL_LIBS", RootDir]),
CodePath = rpc:call(Node, code, get_path, []),
AppEbin = filename:join([Archive, Base, "ebin"]),
io:format("AppEbin: ~p\n", [AppEbin]),
@@ -1162,7 +1167,7 @@ do_code_archive(Config, Root, StripVsn) when is_list(Config) ->
error = rpc:call(Node, App, find, [Tab, Key]),
ok = rpc:call(Node, App, erase, [Tab]),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
compile_app(TopDir, AppName) ->
@@ -1192,12 +1197,11 @@ compile_files([], _, _) ->
%% embeddedd system.
big_boot_embedded(Config) when is_list(Config) ->
{BootArg,AppsInBoot} = create_big_boot(Config),
- {ok, Node} =
- test_server:start_node(big_boot_embedded, slave,
- [{args,"-boot "++BootArg++" -mode embedded"}]),
+ {ok, Peer, Node} = ?CT_PEER(["-boot", BootArg, "-mode", "embedded"]),
RemoteNodeApps =
[ {X,Y} || {X,_,Y} <-
rpc:call(Node,application,loaded_applications,[]) ],
+ peer:stop(Peer),
true = lists:sort(AppsInBoot) =:= lists:sort(RemoteNodeApps),
ok.
@@ -1343,12 +1347,11 @@ on_load_embedded_1(Config) ->
true = code:del_path(OnLoadAppEbin),
%% Start the node and check that the on_load function was run.
- {ok,Node} = start_node(on_load_embedded,
- "-mode embedded -boot " ++ BootScript),
+ {ok, Peer, Node} = ?CT_PEER(["-mode", "embedded", "-boot", BootScript]),
ok = rpc:call(Node, on_load_embedded, status, []),
%% Clean up.
- stop_node(Node).
+ peer:stop(Peer).
del_link(LinkName) ->
case file:delete(LinkName) of
@@ -1824,23 +1827,23 @@ do_normalized_paths([]) ->
%% Make sure that the extra -mode flags are ignored
mult_embedded_flags(_Config) ->
- Modes = [{" -mode embedded", embedded},
- {" -mode interactive", interactive},
- {" -mode invalid", interactive}],
+ Modes = [{["-mode", "embedded"], embedded},
+ {["-mode", "interactive"], interactive},
+ {["-mode", "invalid"], interactive}],
[ begin
{ArgMode, ExpectedMode} = Mode,
- {ok, Node} = start_node(mode_test, ArgMode),
+ {ok, Peer, Node} = ?CT_PEER(ArgMode),
ExpectedMode = rpc:call(Node, code, get_mode, []),
- true = stop_node(Node)
+ peer:stop(Peer)
end || Mode <- Modes],
[ begin
{ArgIgnoredMode, _} = IgnoredMode,
{ArgRelevantMode, ExpectedMode} = RelevantMode,
- {ok, Node} = start_node(mode_test, ArgRelevantMode ++ ArgIgnoredMode),
+ {ok, Peer, Node} = ?CT_PEER(ArgRelevantMode ++ ArgIgnoredMode),
ExpectedMode = rpc:call(Node, code, get_mode, []),
- true = stop_node(Node)
+ peer:stop(Peer)
end || IgnoredMode <- Modes, RelevantMode <- Modes],
ok.
@@ -2035,9 +2038,3 @@ run_purge_test(Test, Config) ->
after
TestLowOSRL = erlang:system_flag(outstanding_system_requests_limit, OSRL)
end.
-
-start_node(Name, Param) ->
- test_server:start_node(Name, slave, [{args, Param}]).
-
-stop_node(Node) ->
- test_server:stop_node(Node).
diff --git a/lib/kernel/test/code_SUITE_data/upgrade_client.erl b/lib/kernel/test/code_SUITE_data/upgrade_client.erl
index 1c3c2def53..6b9a6875f3 100644
--- a/lib/kernel/test/code_SUITE_data/upgrade_client.erl
+++ b/lib/kernel/test/code_SUITE_data/upgrade_client.erl
@@ -11,59 +11,59 @@ run(Dir, Upgradee1, Upgradee2, Other1, Other2) ->
Tracer = start_tracing(),
- ?line 1 = upgradee:exp1(),
- ?line 1 = upgradee:exp1exp2(),
- ?line 1 = upgradee:exp1loc2(),
+ 1 = upgradee:exp1(),
+ 1 = upgradee:exp1exp2(),
+ 1 = upgradee:exp1loc2(),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1exp2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1()),
+ {'EXIT',{undef,_}} = (catch upgradee:exp2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1exp2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
P = spawn_link(upgradee,dispatch_loop,[]),
- ?line 1 = proxy_call(P, local, exp1),
- ?line 1 = proxy_call(P, local, loc1),
- ?line 1 = proxy_call(P, local, exp1exp2),
- ?line 1 = proxy_call(P, local, exp1loc2),
- ?line 1 = proxy_call(P, local, loc1exp2),
- ?line 1 = proxy_call(P, local, loc1loc2),
- ?line 1 = proxy_call(P, external, exp1),
- ?line 1 = proxy_call(P, external, exp1exp2),
- ?line 1 = proxy_call(P, external, exp1loc2),
-
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
- ?line {cannot_compile,1} = proxy_call(P, local, exp2),
- ?line {cannot_compile,1} = proxy_call(P, local, loc2),
-
- ?line {'EXIT',{undef,_}} = (catch other:exp1()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1()),
- ?line {'EXIT',{undef,_}} = (catch other:exp1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:exp1exp2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc11exp2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:exp2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc2()),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
+ 1 = proxy_call(P, local, exp1),
+ 1 = proxy_call(P, local, loc1),
+ 1 = proxy_call(P, local, exp1exp2),
+ 1 = proxy_call(P, local, exp1loc2),
+ 1 = proxy_call(P, local, loc1exp2),
+ 1 = proxy_call(P, local, loc1loc2),
+ 1 = proxy_call(P, external, exp1),
+ 1 = proxy_call(P, external, exp1exp2),
+ 1 = proxy_call(P, external, exp1loc2),
+
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
+ {cannot_compile,1} = proxy_call(P, local, exp2),
+ {cannot_compile,1} = proxy_call(P, local, loc2),
+
+ {'EXIT',{undef,_}} = (catch other:exp1()),
+ {'EXIT',{undef,_}} = (catch other:loc1()),
+ {'EXIT',{undef,_}} = (catch other:exp1loc2()),
+ {'EXIT',{undef,_}} = (catch other:exp1exp2()),
+ {'EXIT',{undef,_}} = (catch other:loc11exp2()),
+ {'EXIT',{undef,_}} = (catch other:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch other:exp2()),
+ {'EXIT',{undef,_}} = (catch other:loc2()),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
Env1 = "Env1",
put(loc1_fun, upgradee:get_local_fun(Env1)),
- ?line {1,Env1} = (get(loc1_fun))(),
+ {1,Env1} = (get(loc1_fun))(),
put(exp1exp2_fun, upgradee:get_exp1exp2_fun()),
- ?line 1 = (get(exp1exp2_fun))(),
+ 1 = (get(exp1exp2_fun))(),
ok = check_tracing(Tracer, 13),
@@ -71,23 +71,23 @@ run(Dir, Upgradee1, Upgradee2, Other1, Other2) ->
%% Load version 1 of other
%%
code_SUITE:compile_load(other, Dir, 1, Other1),
- ?line 1 = other:exp1(),
- ?line 1 = other:exp1loc2(),
- ?line 1 = other:exp1exp2(),
- ?line {'EXIT',{undef,_}} = (catch other:loc1()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1exp2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:exp2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc2()),
-
- ?line 1 = proxy_call(P, other, exp1),
- ?line 1 = proxy_call(P, other, exp1loc2),
- ?line 1 = proxy_call(P, other, exp1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
+ 1 = other:exp1(),
+ 1 = other:exp1loc2(),
+ 1 = other:exp1exp2(),
+ {'EXIT',{undef,_}} = (catch other:loc1()),
+ {'EXIT',{undef,_}} = (catch other:loc1exp2()),
+ {'EXIT',{undef,_}} = (catch other:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch other:exp2()),
+ {'EXIT',{undef,_}} = (catch other:loc2()),
+
+ 1 = proxy_call(P, other, exp1),
+ 1 = proxy_call(P, other, exp1loc2),
+ 1 = proxy_call(P, other, exp1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
ok = check_tracing(Tracer, 5),
@@ -96,59 +96,59 @@ run(Dir, Upgradee1, Upgradee2, Other1, Other2) ->
%%
code_SUITE:compile_load(upgradee, Dir, 2, Upgradee2),
- ?line 2 = upgradee:exp2(),
- ?line 2 = upgradee:exp1exp2(),
- ?line 2 = upgradee:loc1exp2(),
+ 2 = upgradee:exp2(),
+ 2 = upgradee:exp1exp2(),
+ 2 = upgradee:loc1exp2(),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp1()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp1loc2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc2()),
-
- ?line 1 = proxy_call(P, local, exp1),
- ?line 1 = proxy_call(P, local, loc1),
- ?line 1 = proxy_call(P, local, exp1exp2),
- ?line 1 = proxy_call(P, local, exp1loc2),
- ?line 1 = proxy_call(P, local, loc1exp2),
- ?line 1 = proxy_call(P, local, loc1loc2),
- ?line {cannot_compile,1} = proxy_call(P, local, exp2),
- ?line {cannot_compile,1} = proxy_call(P, local, loc2),
-
- ?line 2 = proxy_call(P, external, exp1exp2),
- ?line 2 = proxy_call(P, external, loc1exp2),
- ?line 2 = proxy_call(P, external, exp2),
-
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
-
- ?line 1 = other:exp1(),
- ?line 1 = other:exp1loc2(),
- ?line 1 = other:exp1exp2(),
- ?line {'EXIT',{undef,_}} = (catch other:loc1()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1exp2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:exp2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc2()),
-
- ?line 1 = proxy_call(P, other, exp1),
- ?line 1 = proxy_call(P, other, exp1loc2),
- ?line 1 = proxy_call(P, other, exp1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
-
- ?line {1,Env1} = (get(loc1_fun))(),
+ {'EXIT',{undef,_}} = (catch upgradee:exp1()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1()),
+ {'EXIT',{undef,_}} = (catch upgradee:exp1loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc2()),
+
+ 1 = proxy_call(P, local, exp1),
+ 1 = proxy_call(P, local, loc1),
+ 1 = proxy_call(P, local, exp1exp2),
+ 1 = proxy_call(P, local, exp1loc2),
+ 1 = proxy_call(P, local, loc1exp2),
+ 1 = proxy_call(P, local, loc1loc2),
+ {cannot_compile,1} = proxy_call(P, local, exp2),
+ {cannot_compile,1} = proxy_call(P, local, loc2),
+
+ 2 = proxy_call(P, external, exp1exp2),
+ 2 = proxy_call(P, external, loc1exp2),
+ 2 = proxy_call(P, external, exp2),
+
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp1),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
+
+ 1 = other:exp1(),
+ 1 = other:exp1loc2(),
+ 1 = other:exp1exp2(),
+ {'EXIT',{undef,_}} = (catch other:loc1()),
+ {'EXIT',{undef,_}} = (catch other:loc1exp2()),
+ {'EXIT',{undef,_}} = (catch other:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch other:exp2()),
+ {'EXIT',{undef,_}} = (catch other:loc2()),
+
+ 1 = proxy_call(P, other, exp1),
+ 1 = proxy_call(P, other, exp1loc2),
+ 1 = proxy_call(P, other, exp1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
+
+ {1,Env1} = (get(loc1_fun))(),
Env2 = "Env2",
put(loc2_fun, upgradee:get_local_fun(Env2)),
- ?line {2,Env2} = (get(loc2_fun))(),
+ {2,Env2} = (get(loc2_fun))(),
- ?line 2 = (get(exp1exp2_fun))(),
+ 2 = (get(exp1exp2_fun))(),
ok = check_tracing(Tracer, 10),
@@ -157,56 +157,56 @@ run(Dir, Upgradee1, Upgradee2, Other1, Other2) ->
%%
code_SUITE:compile_load(other, Dir, 2, Other2),
- ?line 2 = upgradee:exp2(),
- ?line 2 = upgradee:exp1exp2(),
- ?line 2 = upgradee:loc1exp2(),
+ 2 = upgradee:exp2(),
+ 2 = upgradee:exp1exp2(),
+ 2 = upgradee:loc1exp2(),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp1()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp1loc2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc2()),
-
- ?line 1 = proxy_call(P, local, exp1),
- ?line 1 = proxy_call(P, local, loc1),
- ?line 1 = proxy_call(P, local, exp1exp2),
- ?line 1 = proxy_call(P, local, exp1loc2),
- ?line 1 = proxy_call(P, local, loc1exp2),
- ?line 1 = proxy_call(P, local, loc1loc2),
- ?line {cannot_compile,1} = proxy_call(P, local, exp2),
- ?line {cannot_compile,1} = proxy_call(P, local, loc2),
-
- ?line 2 = proxy_call(P, external, exp1exp2),
- ?line 2 = proxy_call(P, external, loc1exp2),
- ?line 2 = proxy_call(P, external, exp2),
-
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
-
- ?line 2 = other:exp2(),
- ?line 2 = other:loc1exp2(),
- ?line 2 = other:exp1exp2(),
- ?line {'EXIT',{undef,_}} = (catch other:exp1()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1()),
- ?line {'EXIT',{undef,_}} = (catch other:exp1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc2()),
-
- ?line 2 = proxy_call(P, other, exp2),
- ?line 2 = proxy_call(P, other, loc1exp2),
- ?line 2 = proxy_call(P, other, exp1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
-
- ?line {1,Env1} = (get(loc1_fun))(),
- ?line {2,Env2} = (get(loc2_fun))(),
- ?line 2 = (get(exp1exp2_fun))(),
+ {'EXIT',{undef,_}} = (catch upgradee:exp1()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1()),
+ {'EXIT',{undef,_}} = (catch upgradee:exp1loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc2()),
+
+ 1 = proxy_call(P, local, exp1),
+ 1 = proxy_call(P, local, loc1),
+ 1 = proxy_call(P, local, exp1exp2),
+ 1 = proxy_call(P, local, exp1loc2),
+ 1 = proxy_call(P, local, loc1exp2),
+ 1 = proxy_call(P, local, loc1loc2),
+ {cannot_compile,1} = proxy_call(P, local, exp2),
+ {cannot_compile,1} = proxy_call(P, local, loc2),
+
+ 2 = proxy_call(P, external, exp1exp2),
+ 2 = proxy_call(P, external, loc1exp2),
+ 2 = proxy_call(P, external, exp2),
+
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp1),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
+
+ 2 = other:exp2(),
+ 2 = other:loc1exp2(),
+ 2 = other:exp1exp2(),
+ {'EXIT',{undef,_}} = (catch other:exp1()),
+ {'EXIT',{undef,_}} = (catch other:loc1()),
+ {'EXIT',{undef,_}} = (catch other:exp1loc2()),
+ {'EXIT',{undef,_}} = (catch other:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch other:loc2()),
+
+ 2 = proxy_call(P, other, exp2),
+ 2 = proxy_call(P, other, loc1exp2),
+ 2 = proxy_call(P, other, exp1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
+
+ {1,Env1} = (get(loc1_fun))(),
+ {2,Env2} = (get(loc2_fun))(),
+ 2 = (get(exp1exp2_fun))(),
ok = check_tracing(Tracer, 10),
@@ -226,52 +226,52 @@ run(Dir, Upgradee1, Upgradee2, Other1, Other2) ->
%%
code:delete(upgradee),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp1exp2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1exp2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp1()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:exp1loc2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch upgradee:loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:exp2()),
+ {'EXIT',{undef,_}} = (catch upgradee:exp1exp2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1exp2()),
+ {'EXIT',{undef,_}} = (catch upgradee:exp1()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1()),
+ {'EXIT',{undef,_}} = (catch upgradee:exp1loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch upgradee:loc2()),
- ?line 2 = proxy_call(P, local, exp2),
- ?line 2 = proxy_call(P, local, loc2),
- ?line 2 = proxy_call(P, local, exp1exp2),
- ?line 2 = proxy_call(P, local, exp1loc2),
- ?line 2 = proxy_call(P, local, loc1exp2),
- ?line 2 = proxy_call(P, local, loc1loc2),
- ?line {cannot_compile,2} = proxy_call(P, local, exp1),
- ?line {cannot_compile,2} = proxy_call(P, local, loc1),
+ 2 = proxy_call(P, local, exp2),
+ 2 = proxy_call(P, local, loc2),
+ 2 = proxy_call(P, local, exp1exp2),
+ 2 = proxy_call(P, local, exp1loc2),
+ 2 = proxy_call(P, local, loc1exp2),
+ 2 = proxy_call(P, local, loc1loc2),
+ {cannot_compile,2} = proxy_call(P, local, exp1),
+ {cannot_compile,2} = proxy_call(P, local, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, exp1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp1),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, external, exp1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, external, loc2),
- ?line 2 = other:exp2(),
- ?line 2 = other:loc1exp2(),
- ?line 2 = other:exp1exp2(),
- ?line {'EXIT',{undef,_}} = (catch other:exp1()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1()),
- ?line {'EXIT',{undef,_}} = (catch other:exp1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc1loc2()),
- ?line {'EXIT',{undef,_}} = (catch other:loc2()),
+ 2 = other:exp2(),
+ 2 = other:loc1exp2(),
+ 2 = other:exp1exp2(),
+ {'EXIT',{undef,_}} = (catch other:exp1()),
+ {'EXIT',{undef,_}} = (catch other:loc1()),
+ {'EXIT',{undef,_}} = (catch other:exp1loc2()),
+ {'EXIT',{undef,_}} = (catch other:loc1loc2()),
+ {'EXIT',{undef,_}} = (catch other:loc2()),
- ?line 2 = proxy_call(P, other, exp2),
- ?line 2 = proxy_call(P, other, loc1exp2),
- ?line 2 = proxy_call(P, other, exp1exp2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, exp1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
- ?line {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
-
- ?line {'EXIT',{undef,_}} = (catch (get(exp1exp2_fun))()),
+ 2 = proxy_call(P, other, exp2),
+ 2 = proxy_call(P, other, loc1exp2),
+ 2 = proxy_call(P, other, exp1exp2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1),
+ {'EXIT',{undef,_}} = proxy_call(P, other, exp1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc1loc2),
+ {'EXIT',{undef,_}} = proxy_call(P, other, loc2),
+
+ {'EXIT',{undef,_}} = (catch (get(exp1exp2_fun))()),
ok = check_tracing(Tracer, 14),
@@ -300,9 +300,9 @@ proxy_call(Pid, CallType, Func) ->
start_tracing() ->
Self = self(),
{Tracer,_} = spawn_opt(fun() -> tracer_loop(Self) end, [link,monitor]),
- ?line 1 = erlang:trace_pattern({error_handler,undefined_function,3},
+ 1 = erlang:trace_pattern({error_handler,undefined_function,3},
true, [global]),
- ?line 1 = erlang:trace(Self, true, [call,{tracer,Tracer}]),
+ 1 = erlang:trace(Self, true, [call,{tracer,Tracer}]),
Tracer.
diff --git a/lib/kernel/test/disk_log_SUITE.erl b/lib/kernel/test/disk_log_SUITE.erl
index 9dd008d978..2be791a571 100644
--- a/lib/kernel/test/disk_log_SUITE.erl
+++ b/lib/kernel/test/disk_log_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -120,14 +120,6 @@
open_change_size, change_attribute, otp_6278, otp_10131,
otp_16768, otp_16809]).
-%% These tests should be skipped if the VxWorks card is configured *with*
-%% nfs cache.
--define(SKIP_LARGE_CACHE,[inc_wrap_file, halt_ext, wrap_ext, read_mode,
- head, wrap_notif, open_size, error_log,
- error_index, chunk,
- change_size_before, change_size_during,
- change_size_after, default_size]).
-
suite() ->
[{ct_hooks,[ts_install_cth]},
@@ -1045,7 +1037,7 @@ m() ->
one_line("halt,int.inf. (10,1000)", W5, R5, Rep5, C5),
io:format("\n"),
io:format("\tWrap log time depends on how often the log wraps, as this\n"),
- io:format("\tinvolves opening of new files, which costs alot."),
+ io:format("\tinvolves opening of new files, which costs a lot."),
io:format("\n").
one_line(Txt, W, R, Rep, C) ->
diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl
index 40670e45d2..34015dadbf 100644
--- a/lib/kernel/test/erl_distribution_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_SUITE.erl
@@ -21,6 +21,8 @@
-include_lib("common_test/include/ct.hrl").
-include_lib("kernel/include/dist.hrl").
+-include_lib("stdlib/include/assert.hrl").
+-include_lib("kernel/include/file.hrl").
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2]).
@@ -34,6 +36,7 @@
setopts/1,
table_waste/1, net_setuptime/1,
inet_dist_options_options/1,
+ net_ticker_spawn_options/1,
monitor_nodes_nodedown_reason/1,
monitor_nodes_complex_nodedown_reason/1,
@@ -50,10 +53,12 @@
erl_uds_dist_smoke_test/1,
erl_1424/1, net_kernel_start/1, differing_cookies/1,
cmdline_setcookie_2/1, connection_cookie/1,
- dyn_differing_cookies/1]).
+ dyn_differing_cookies/1,
+ xdg_cookie/1]).
%% Performs the test at another node.
-export([get_socket_priorities/0,
+ get_net_ticker_fullsweep_option/1,
tick_cli_test/3, tick_cli_test1/3,
tick_serv_test/2, tick_serv_test1/1,
run_remote_test/1,
@@ -97,6 +102,7 @@ all() ->
epmd_reconnect,
hidden_node, setopts,
table_waste, net_setuptime, inet_dist_options_options,
+ net_ticker_spawn_options,
{group, monitor_nodes},
erl_uds_dist_smoke_test,
erl_1424, net_kernel_start,
@@ -115,7 +121,8 @@ groups() ->
[differing_cookies,
cmdline_setcookie_2,
connection_cookie,
- dyn_differing_cookies]}].
+ dyn_differing_cookies,
+ xdg_cookie]}].
init_per_suite(Config) ->
start_gen_tcp_dist_test_type_server(),
@@ -334,14 +341,14 @@ illegal(Name) ->
test_node(Name) ->
test_node(Name, false).
-test_node(Name, Illigal) ->
- test_node(Name, Illigal, "").
-test_node(Name, Illigal, ExtraArgs) ->
+test_node(Name, Illegal) ->
+ test_node(Name, Illegal, "").
+test_node(Name, Illegal, ExtraArgs) ->
ProgName = ct:get_progname(),
Command = ProgName ++ " -noinput " ++
long_or_short() ++ Name ++ ExtraArgs ++
" -eval \"net_adm:ping('" ++ atom_to_list(node()) ++ "')\"" ++
- case Illigal of
+ case Illegal of
true ->
" -eval \"timer:sleep(10000),init:stop().\"";
false ->
@@ -574,21 +581,33 @@ dyn_node_name(Config) when is_list(Config) ->
dyn_node_name("", Config).
dyn_node_name(DCfg, _Config) ->
+ DomainType = case net_kernel:get_state() of
+ #{domain_type := short} -> "short";
+ #{domain_type := long} -> "long"
+ end,
{_N1F,Port1} = start_node_unconnected(DCfg ++ " -dist_listen false",
undefined, ?MODULE, run_remote_test,
- ["dyn_node_name_do", atom_to_list(node())]),
+ ["dyn_node_name_do", atom_to_list(node()),
+ DomainType]),
0 = wait_for_port_exit(Port1),
ok.
-dyn_node_name_do(TestNode, _Args) ->
+dyn_node_name_do(TestNode, [DomainTypeStr]) ->
nonode@nohost = node(),
[] = nodes(),
[] = nodes(hidden),
+ DomainType = list_to_atom(DomainTypeStr),
+ #{started := static, name_type := dynamic, name := undefined,
+ domain_type := DomainType} = net_kernel:get_state(),
net_kernel:monitor_nodes(true, [{node_type,all}]),
net_kernel:connect_node(TestNode),
[] = nodes(),
[TestNode] = nodes(hidden),
MyName = node(),
+ false = (MyName =:= undefined),
+ false = (MyName =:= nonode@nohost),
+ #{started := static, name_type := dynamic, name := MyName}
+ = net_kernel:get_state(),
check([MyName], rpc:call(TestNode, erlang, nodes, [hidden])),
{nodeup, MyName, [{node_type, visible}]} = receive_any(0),
@@ -601,11 +620,16 @@ dyn_node_name_do(TestNode, _Args) ->
{nodedown, MyName, [{node_type, visible}]} = receive_any(1000),
nonode@nohost = node(),
+ #{started := static, name_type := dynamic, name := undefined}
+ = net_kernel:get_state(),
net_kernel:connect_node(TestNode),
[] = nodes(),
[TestNode] = nodes(hidden),
MyName = node(),
+ #{started := static, name_type := dynamic, name := MyName}
+ = net_kernel:get_state(),
+
check([MyName], rpc:call(TestNode, erlang, nodes, [hidden])),
{nodeup, MyName, [{node_type, visible}]} = receive_any(0),
@@ -617,7 +641,8 @@ dyn_node_name_do(TestNode, _Args) ->
[] = nodes(hidden),
{nodedown, MyName, [{node_type, visible}]} = receive_any(1000),
nonode@nohost = node(),
-
+ #{started := static, name_type := dynamic, name := undefined}
+ = net_kernel:get_state(),
ok.
check(X, X) -> ok.
@@ -1121,6 +1146,75 @@ get_socket_priorities() ->
+%% check net_ticker_spawn_options
+net_ticker_spawn_options(Config) when is_list(Config) ->
+ run_dist_configs(fun net_ticker_spawn_options/2, Config).
+
+net_ticker_spawn_options(DCfg, Config) when is_list(Config) ->
+ FullsweepString0 = "[{fullsweep_after,0}]",
+ FullsweepString =
+ case os:cmd("echo [{a,1}]") of
+ "[{a,1}]"++_ ->
+ FullsweepString0;
+ _ ->
+ %% Some shells need quoting of [{}]
+ "'"++FullsweepString0++"'"
+ end,
+ InetDistOptions =
+ "-hidden "
+ "-kernel net_ticker_spawn_options "++FullsweepString,
+ {ok,Node1} =
+ start_node(DCfg, net_ticker_spawn_options_1, InetDistOptions),
+ {ok,Node2} =
+ start_node(DCfg, net_ticker_spawn_options_2, InetDistOptions),
+ %%
+ pong =
+ erpc:call(Node1, net_adm, ping, [Node2]),
+ FullsweepOptionNode1 =
+ erpc:call(Node1, ?MODULE, get_net_ticker_fullsweep_option, [Node2]),
+ FullsweepOptionNode2 =
+ erpc:call(Node2, ?MODULE, get_net_ticker_fullsweep_option, [Node1]),
+ io:format("FullsweepOptionNode1 = ~p", [FullsweepOptionNode1]),
+ io:format("FullsweepOptionNode2 = ~p", [FullsweepOptionNode2]),
+ 0 = FullsweepOptionNode1,
+ 0 = FullsweepOptionNode2,
+ %%
+ stop_node(Node2),
+ stop_node(Node1),
+ ok.
+
+get_net_ticker_fullsweep_option(Node) ->
+ Links = case proplists:get_value(Node, erlang:system_info(dist_ctrl)) of
+ DistCtrl when is_port(DistCtrl) ->
+ {links, Ls} = erlang:port_info(DistCtrl, links),
+ Ls;
+ DistCtrl when is_pid(DistCtrl) ->
+ {links, Ls} = process_info(DistCtrl, links),
+ Ls
+ end,
+ Ticker = try
+ lists:foreach(
+ fun (Pid) when is_pid(Pid) ->
+ {current_stacktrace, Stk}
+ = process_info(Pid, current_stacktrace),
+ lists:foreach(
+ fun ({dist_util, con_loop, _, _}) ->
+ throw(Pid);
+ (_) ->
+ ok
+ end, Stk);
+ (_) ->
+ ok
+ end, Links),
+ error(no_ticker_found)
+ catch
+ throw:Pid when is_pid(Pid) -> Pid
+ end,
+ {garbage_collection, GCOpts} = erlang:process_info(Ticker, garbage_collection),
+ proplists:get_value(fullsweep_after, GCOpts).
+
+
+
%%
%% Testcase:
%% monitor_nodes_nodedown_reason
@@ -1676,14 +1770,10 @@ monitor_nodes_many(DCfg, _Config) ->
%% Test order of messages nodedown and nodeup.
monitor_nodes_down_up(Config) when is_list(Config) ->
- [An] = get_nodenames(1, monitor_nodeup),
- {ok, A} = ct_slave:start(An),
-
- try
- monitor_nodes_yoyo(A)
- after
- catch ct_slave:stop(A)
- end.
+ {ok, Peer, Node} = ?CT_PEER(#{connection => 0}),
+ true = net_kernel:connect_node(Node),
+ monitor_nodes_yoyo(Node),
+ peer:stop(Peer).
monitor_nodes_yoyo(A) ->
net_kernel:monitor_nodes(true),
@@ -2410,6 +2500,59 @@ ddc_remote_run(MotherNode, [SetCookie, MotherNodeCookieL]) ->
error({unexpected, Other})
end.
+xdg_cookie(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+
+ TestHome = filename:join(PrivDir, ?FUNCTION_NAME),
+ ok = file:make_dir(TestHome),
+
+ HomeEnv = case os:type() of
+ {win32, _} ->
+ [Drive | Path] = filename:split(TestHome),
+ [{"APPDATA", filename:join(TestHome,"AppData")},
+ {"HOMEDRIVE", Drive}, {"HOMEPATH", filename:join(Path)}];
+ _ ->
+ [{"HOME", TestHome}]
+ end,
+
+ NodeOpts = #{ env => HomeEnv ++
+ [{"ERL_CRASH_DUMP", filename:join([TestHome,"erl_crash.dump"])}],
+ connection => 0 },
+
+ %% Test that a default .erlang.cookie file is created
+ {ok, CreatorPeer, _} = peer:start_link(NodeOpts#{ name => peer:random_name(?FUNCTION_NAME) }),
+ UserConfig = peer:call(CreatorPeer, filename, basedir, [user_config,"erlang"]),
+ ?assert(peer:call(CreatorPeer, filelib, is_regular,
+ [filename:join(TestHome, ".erlang.cookie")])),
+ OrigCookie = peer:call(CreatorPeer, erlang, get_cookie, []),
+ peer:stop(CreatorPeer),
+
+ %% Test that the $HOME/.erlang.cookie file takes precedence over XDG
+ XDGCookie = filename:join([UserConfig, ".erlang.cookie"]),
+ ok = filelib:ensure_dir(XDGCookie),
+ ok = file:write_file(XDGCookie, "Me want cookie!"),
+ {ok, XDGFI} = file:read_file_info(XDGCookie),
+ ok = file:write_file_info(XDGCookie, XDGFI#file_info{ mode = 8#600 }),
+
+ {ok, Peer, _} = peer:start_link(NodeOpts#{ name => peer:random_name(?FUNCTION_NAME) }),
+
+ ?assertEqual(OrigCookie, peer:call(Peer, erlang, get_cookie, [])),
+
+ peer:stop(Peer),
+
+ %% Check that XDG cookie works after we delete the $HOME cookie
+ HomeCookie = filename:join(TestHome, ".erlang.cookie"),
+ {ok, HomeFI} = file:read_file_info(HomeCookie),
+ ok = file:write_file_info(HomeCookie, HomeFI#file_info{ mode = 8#777 }),
+ ok = file:delete(HomeCookie),
+ {ok, Peer2, _} = peer:start_link(NodeOpts#{ name => peer:random_name(?FUNCTION_NAME) }),
+ ?assertEqual('Me want cookie!', peer:call(Peer2, erlang, get_cookie, [])),
+
+ peer:stop(Peer2),
+
+ ok.
+
+
%% Misc. functions
diff --git a/lib/kernel/test/erl_distribution_wb_SUITE.erl b/lib/kernel/test/erl_distribution_wb_SUITE.erl
index 3f45860a7e..2268f6dbfc 100644
--- a/lib/kernel/test/erl_distribution_wb_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_wb_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,7 +26,8 @@
init_per_group/2,end_per_group/2]).
-export([init_per_testcase/2, end_per_testcase/2, whitebox/1,
- switch_options/1, missing_compulsory_dflags/1]).
+ switch_options/1, missing_compulsory_dflags/1,
+ dflag_mandatory_25/1]).
-define(to_port(Socket, Data),
@@ -41,29 +42,39 @@
-define(DIST_VER_HIGH, 6).
-define(DIST_VER_LOW, 5).
--define(DFLAG_PUBLISHED,1).
--define(DFLAG_ATOM_CACHE,2).
--define(DFLAG_EXTENDED_REFERENCES,4).
--define(DFLAG_DIST_MONITOR,8).
--define(DFLAG_FUN_TAGS,16#10).
--define(DFLAG_DIST_MONITOR_NAME,16#20).
--define(DFLAG_HIDDEN_ATOM_CACHE,16#40).
--define(DFLAG_NEW_FUN_TAGS,16#80).
--define(DFLAG_EXTENDED_PIDS_PORTS,16#100).
--define(DFLAG_UTF8_ATOMS, 16#10000).
--define(DFLAG_BIG_CREATION, 16#40000).
--define(DFLAG_HANDSHAKE_23, 16#01000000).
-
-%% From R9 and forward extended references is compulsory
-%% From R10 and forward extended pids and ports are compulsory
-%% From R20 and forward UTF8 atoms are compulsory
-%% From R21 and forward NEW_FUN_TAGS is compulsory (no more tuple fallback {fun, ...})
-%% From R23 and forward BIG_CREATION is compulsory
--define(COMPULSORY_DFLAGS, (?DFLAG_EXTENDED_REFERENCES bor
- ?DFLAG_EXTENDED_PIDS_PORTS bor
- ?DFLAG_UTF8_ATOMS bor
- ?DFLAG_NEW_FUN_TAGS bor
- ?DFLAG_BIG_CREATION)).
+-define(DFLAG_PUBLISHED, 16#01).
+-define(DFLAG_ATOM_CACHE, 16#02).
+-define(DFLAG_EXTENDED_REFERENCES, 16#04).
+-define(DFLAG_DIST_MONITOR, 16#08).
+-define(DFLAG_FUN_TAGS, 16#10).
+-define(DFLAG_NEW_FUN_TAGS, 16#80).
+-define(DFLAG_EXTENDED_PIDS_PORTS, 16#100).
+-define(DFLAG_EXPORT_PTR_TAG, 16#200).
+-define(DFLAG_BIT_BINARIES, 16#400).
+-define(DFLAG_NEW_FLOATS, 16#800).
+-define(DFLAG_UTF8_ATOMS, 16#10000).
+-define(DFLAG_MAP_TAG, 16#20000).
+-define(DFLAG_BIG_CREATION, 16#40000).
+-define(DFLAG_HANDSHAKE_23, 16#1000000).
+-define(DFLAG_MANDATORY_25_DIGEST, 16#4000000).
+
+%% From OTP R9 extended references are compulsory.
+%% From OTP R10 extended pids and ports are compulsory.
+%% From OTP 20 UTF8 atoms are compulsory.
+%% From OTP 21 NEW_FUN_TAGS is compulsory (no more tuple fallback {fun, ...}).
+%% From OTP 23 BIG_CREATION is compulsory.
+%% From OTP 25 NEW_FLOATS, MAP_TAG, EXPORT_PTR_TAG, and BIT_BINARIES are compulsory.
+-define(COMPULSORY_DFLAGS,
+ (?DFLAG_EXTENDED_REFERENCES bor
+ ?DFLAG_FUN_TAGS bor
+ ?DFLAG_EXTENDED_PIDS_PORTS bor
+ ?DFLAG_UTF8_ATOMS bor
+ ?DFLAG_NEW_FUN_TAGS bor
+ ?DFLAG_BIG_CREATION bor
+ ?DFLAG_NEW_FLOATS bor
+ ?DFLAG_MAP_TAG bor
+ ?DFLAG_EXPORT_PTR_TAG bor
+ ?DFLAG_BIT_BINARIES)).
-define(PASS_THROUGH, $p).
@@ -89,7 +100,7 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- [whitebox, switch_options, missing_compulsory_dflags].
+ [whitebox, switch_options, missing_compulsory_dflags, dflag_mandatory_25].
groups() ->
[].
@@ -126,9 +137,10 @@ switch_options(Config) when is_list(Config) ->
%% Whitebox testing of distribution handshakes.
whitebox(Config) when is_list(Config) ->
- {ok, Node} = start_node(?MODULE,""),
+ {ok, Peer, Node} = ?CT_PEER(),
Cookie = erlang:get_cookie(),
{_,Host} = split(node()),
+ OurVersion = ?DIST_VER_HIGH,
[begin
io:format("Test OurVersion=~p and TrustEpmd=~p\n",
[OurVersion, TrustEpmd]),
@@ -139,9 +151,8 @@ whitebox(Config) when is_list(Config) ->
ok = simultaneous_md5(Node, join(zzzzzzzzzzzzzz,Host),
OurVersion, TrustEpmd, Cookie)
end
- || OurVersion <- lists:seq(?DIST_VER_LOW, ?DIST_VER_HIGH),
- TrustEpmd <- [true, false]],
- stop_node(Node),
+ || TrustEpmd <- [true, false]],
+ peer:stop(Peer),
ok.
%%
@@ -391,21 +402,37 @@ simultaneous_md5(Node, OurName, OurVersion, TrustEpmd, Cookie) when OurName > No
ok.
missing_compulsory_dflags(Config) when is_list(Config) ->
- [Name1, Name2] = get_nodenames(2, missing_compulsory_dflags),
- {ok, Node} = start_node(Name1,""),
+ {ok, Peer, Node} = ?CT_PEER(),
{NA,NB} = split(Node),
{port,PortNo,_} = erl_epmd:port_please(NA,NB),
[begin
{ok, SocketA} = gen_tcp:connect(atom_to_list(NB),PortNo,
[{active,false},
{packet,2}]),
- BadNode = list_to_atom(atom_to_list(Name2)++"@"++atom_to_list(NB)),
- send_name(SocketA,BadNode, Version, Version, 0),
+ BadNode = list_to_atom(?CT_PEER_NAME()++"@"++atom_to_list(NB)),
+ send_name(SocketA,BadNode, ?DIST_VER_HIGH, Version, 0),
not_allowed = recv_status(SocketA),
gen_tcp:close(SocketA)
end
|| Version <- lists:seq(?DIST_VER_LOW, ?DIST_VER_HIGH)],
- stop_node(Node),
+ peer:stop(Peer),
+ ok.
+
+%% Test that instead of passing all compulsory flags, we can instead
+%% pass only ?DFLAG_MANDATORY_25_DIGEST to ensure that we will be able to communicate
+%% with a future release where ?DFLAG_MANDATORY_25_DIGEST is mandatory.
+dflag_mandatory_25(_Config) ->
+ {ok, Peer, Node} = ?CT_PEER(),
+ {NA,NB} = split(Node),
+ {port,PortNo,_} = erl_epmd:port_please(NA, NB),
+ {ok, SocketA} = gen_tcp:connect(atom_to_list(NB),
+ PortNo,
+ [{active,false},{packet,2}]),
+ OtherNode = list_to_atom(?CT_PEER_NAME()++"@"++atom_to_list(NB)),
+ send_name(SocketA, OtherNode, ?DIST_VER_HIGH, ?DIST_VER_HIGH, ?DFLAG_MANDATORY_25_DIGEST),
+ ok = recv_status(SocketA),
+ gen_tcp:close(SocketA),
+ peer:stop(Peer),
ok.
%%
@@ -496,7 +523,7 @@ gen_digest(Challenge, Cookie) when is_integer(Challenge), is_atom(Cookie) ->
%%
-%% The differrent stages of the MD5 handshake
+%% The different stages of the MD5 handshake
%%
send_status(Socket, Stat) ->
@@ -517,7 +544,8 @@ recv_status(Socket) ->
end.
send_challenge(Socket, Node, Challenge, Version, GotFlags) ->
- send_challenge(Socket, Node, Challenge, Version, GotFlags, ?COMPULSORY_DFLAGS).
+ Flags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST,
+ send_challenge(Socket, Node, Challenge, Version, GotFlags, Flags).
send_challenge(Socket, Node, Challenge, ?DIST_VER_LOW, _GotFlags, Flags) ->
{ok, {{_Ip1,_Ip2,_Ip3,_Ip4}, _}} = inet:sockname(Socket),
@@ -541,8 +569,8 @@ recv_challenge(Socket, OurVersion) ->
{?DIST_VER_LOW,
[$n,V1,V0,Fl1,Fl2,Fl3,Fl4,CA3,CA2,CA1,CA0 | Ns]} ->
Flags = ?u32(Fl1,Fl2,Fl3,Fl4),
- true = (Flags band ?COMPULSORY_DFLAGS) =:= ?COMPULSORY_DFLAGS,
- Node =list_to_atom(Ns),
+ verify_flags(Flags),
+ Node = list_to_atom(Ns),
?DIST_VER_LOW = ?u16(V1,V0),
Challenge = ?u32(CA3,CA2,CA1,CA0),
{Node,$n,Challenge};
@@ -551,7 +579,7 @@ recv_challenge(Socket, OurVersion) ->
[$N, F7,F6,F5,F4,F3,F2,F1,F0, CA3,CA2,CA1,CA0,
Cr3,Cr2,Cr1,Cr0, NL1,NL0 | Ns]} ->
<<Flags:64>> = <<F7,F6,F5,F4,F3,F2,F1,F0>>,
- true = (Flags band ?COMPULSORY_DFLAGS) =:= ?COMPULSORY_DFLAGS,
+ verify_flags(Flags),
<<Creation:32>> = <<Cr3,Cr2,Cr1,Cr0>>,
true = (Creation =/= 0),
<<NameLen:16>> = <<NL1,NL0>>,
@@ -564,6 +592,17 @@ recv_challenge(Socket, OurVersion) ->
?shutdown(no_node)
end.
+verify_flags(Flags) ->
+ RequiredFlags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST,
+ if
+ Flags band RequiredFlags =:= RequiredFlags ->
+ ok;
+ true ->
+ io:format("Given flags: ~.16.0B\n", [Flags]),
+ io:format("Required flags: ~.16.0B\n", [RequiredFlags]),
+ ct:fail(missing_dflags)
+ end.
+
send_complement(Socket, SentNameMsg, ChallengeMsg, OurVersion) ->
case {SentNameMsg,ChallengeMsg} of
{$n,$N} ->
@@ -618,17 +657,16 @@ recv_challenge_ack(Socket, ChallengeB, CookieA) ->
end.
send_name(Socket, MyNode0, OurVersion, AssumedVersion) ->
- send_name(Socket, MyNode0, OurVersion, AssumedVersion, ?COMPULSORY_DFLAGS).
+ Flags = ?COMPULSORY_DFLAGS bor ?DFLAG_MANDATORY_25_DIGEST,
+ send_name(Socket, MyNode0, OurVersion, AssumedVersion, Flags).
send_name(Socket, MyNode0, OurVersion, AssumedVersion, Flags) ->
MyNode = atom_to_list(MyNode0),
- if (OurVersion =:= ?DIST_VER_LOW) or
- (AssumedVersion =:= ?DIST_VER_LOW) ->
+ if (AssumedVersion =:= ?DIST_VER_LOW) ->
OurFlags = our_flags(Flags,OurVersion),
ok = ?to_port(Socket, [<<$n,OurVersion:16,OurFlags:32>>|MyNode]),
$n;
- (OurVersion > ?DIST_VER_LOW) and
(AssumedVersion > ?DIST_VER_LOW) ->
Creation = erts_internal:get_creation(),
NameLen = length(MyNode),
@@ -637,8 +675,6 @@ send_name(Socket, MyNode0, OurVersion, AssumedVersion, Flags) ->
$N
end.
-our_flags(Flags, ?DIST_VER_LOW) ->
- Flags;
our_flags(Flags, OurVersion) when OurVersion > ?DIST_VER_LOW ->
Flags bor ?DFLAG_HANDSHAKE_23.
@@ -761,13 +797,13 @@ split(Atom) ->
%% Build a distribution message that will make rex answer
build_rex_message(Cookie,OurName) ->
- [$?,term_to_binary({6,self(),Cookie,rex}),
+ [?PASS_THROUGH,term_to_binary({6,self(),Cookie,rex}),
term_to_binary({'$gen_cast',
{cast,
- rpc,
- cast,
- [OurName, hello, world, []],
- self()} })].
+ erlang,
+ send,
+ [{regname, OurName}, "hello world"],
+ self()}})].
%% Receive a distribution message
recv_message(Socket) ->
@@ -793,24 +829,3 @@ recv_message(Socket) ->
%% Build a nodename
join(Name,Host) ->
list_to_atom(atom_to_list(Name) ++ "@" ++ atom_to_list(Host)).
-
-%% start/stop slave.
-start_node(Name, Param) ->
- test_server:start_node(Name, slave, [{args, Param}]).
-
-stop_node(Node) ->
- test_server:stop_node(Node).
-
-
-get_nodenames(N, T) ->
- get_nodenames(N, T, []).
-
-get_nodenames(0, _, Acc) ->
- Acc;
-get_nodenames(N, T, Acc) ->
- U = erlang:unique_integer([positive]),
- get_nodenames(N-1, T, [list_to_atom(?MODULE_STRING
- ++ "-"
- ++ atom_to_list(T)
- ++ "-"
- ++ integer_to_list(U)) | Acc]).
diff --git a/lib/kernel/test/erl_prim_loader_SUITE.erl b/lib/kernel/test/erl_prim_loader_SUITE.erl
index 907a000787..eaeca5ac58 100644
--- a/lib/kernel/test/erl_prim_loader_SUITE.erl
+++ b/lib/kernel/test/erl_prim_loader_SUITE.erl
@@ -140,8 +140,7 @@ do_get_modules(Config) ->
%% Test that an 'enotdir' error can be handled.
{ok,{SuccExp,FailExp}} = get_modules_sorted(Ms, Process, [NotADir|Path]),
- Name = inet_get_modules,
- {ok, Node, BootPid} = complete_start_node(Name),
+ {ok, Peer, Node, BootPid} = complete_start_node(),
ThisDir = filename:dirname(code:which(?MODULE)),
true = rpc:call(Node, code, add_patha, [ThisDir]),
_ = rpc:call(Node, code, ensure_loaded, [?MODULE]),
@@ -149,7 +148,7 @@ do_get_modules(Config) ->
get_modules, [Ms,Process,Path]),
SuccExp = lists:sort(InetSucc),
- stop_node(Node),
+ peer:stop(Peer),
unlink(BootPid),
exit(BootPid, kill),
@@ -186,11 +185,10 @@ test_normalize_and_backslash(Config) ->
%% Start a node using the 'inet' loading method,
%% from an already started boot server.
inet_existing(Config) when is_list(Config) ->
- Name = erl_prim_test_inet_existing,
BootPid = start_boot_server(),
- Node = start_node_using_inet(Name),
+ {ok, Peer, Node} = ?CT_PEER(start_node_using_inet_args()),
{ok,[["inet"]]} = rpc:call(Node, init, get_argument, [loader]),
- stop_node(Node),
+ peer:stop(Peer),
unlink(BootPid),
exit(BootPid, kill),
ok.
@@ -198,37 +196,35 @@ inet_existing(Config) when is_list(Config) ->
%% Start a node using the 'inet' loading method,
%% but start the boot server afterwards.
inet_coming_up(Config) when is_list(Config) ->
- Name = erl_prim_test_inet_coming_up,
- Node = start_node_using_inet(Name, [{wait,false}]),
+ {ok, Peer} = ?CT_PEER(#{wait_boot => false, connection => standard_io,
+ args => start_node_using_inet_args()}),
%% Wait a while, then start boot server, and wait for node to start.
ct:sleep({seconds,6}),
BootPid = start_boot_server(),
- wait_really_started(Node, 25),
+ Node = wait_really_started(Peer, 25),
%% Check loader argument, then cleanup.
{ok,[["inet"]]} = rpc:call(Node, init, get_argument, [loader]),
- stop_node(Node),
+ peer:stop(Peer),
unlink(BootPid),
exit(BootPid, kill),
ok.
-wait_really_started(Node, 0) ->
- ct:fail({not_booted,Node});
-wait_really_started(Node, N) ->
- case rpc:call(Node, init, get_status, []) of
- {started, _} ->
- ok;
- _ ->
- ct:sleep(1000),
- wait_really_started(Node, N - 1)
+wait_really_started(Peer, 0) ->
+ ct:fail({not_booted,Peer});
+wait_really_started(Peer, N) ->
+ case (catch peer:call(Peer, init, get_status, [])) of
+ {started, _} ->
+ peer:call(Peer, erlang, node, []);
+ _ ->
+ ct:sleep(1000),
+ wait_really_started(Peer, N - 1)
end.
%% Start a node using the 'inet' loading method,
%% then lose the connection.
inet_disconnects(Config) when is_list(Config) ->
- Name = erl_prim_test_inet_disconnects,
-
BootPid = start_boot_server(),
unlink(BootPid),
Self = self(),
@@ -240,7 +236,8 @@ inet_disconnects(Config) when is_list(Config) ->
end,
%% Let the loading begin...
- Node = start_node_using_inet(Name, [{wait,false}]),
+ {ok,Peer} = ?CT_PEER(#{wait_boot => false, connection => 0,
+ args => start_node_using_inet_args()}),
%% When the stopper is ready, the slave node should be
%% looking for a boot server again.
@@ -255,9 +252,9 @@ inet_disconnects(Config) when is_list(Config) ->
%% Start new boot server to see that loading is continued.
BootPid2 = start_boot_server(),
- wait_really_started(Node, 25),
+ Node = wait_really_started(Peer, 25),
{ok,[["inet"]]} = rpc:call(Node, init, get_argument, [loader]),
- stop_node(Node),
+ peer:stop(Peer),
unlink(BootPid2),
exit(BootPid2, kill),
ok.
@@ -290,22 +287,11 @@ get_calls(Count, Pid) ->
%% Start nodes in parallel, all using the 'inet' loading method;
%% verify that the boot server manages.
multiple_slaves(Config) when is_list(Config) ->
- Name = erl_prim_test_multiple_slaves,
- Host = host(),
- IpStr = ip_str(Host),
- Args = " -loader inet -hosts " ++ IpStr,
+ Args = start_node_using_inet_args(),
NoOfNodes = 10, % no of slave nodes to be started
- NamesAndNodes =
- lists:map(fun(N) ->
- NameN = atom_to_list(Name) ++
- integer_to_list(N),
- NodeN = NameN ++ "@" ++ Host,
- {list_to_atom(NameN),list_to_atom(NodeN)}
- end, lists:seq(1, NoOfNodes)),
-
- Nodes = start_multiple_nodes(NamesAndNodes, Args, []),
+ Peers = [?CT_PEER(#{wait_boot => {self(), tag}, args => Args}) || _ <- lists:seq(1, NoOfNodes)],
%% "queue up" the nodes to wait for the boot server to respond
%% (note: test_server supervises each node start by accept()
@@ -317,31 +303,25 @@ multiple_slaves(Config) when is_list(Config) ->
%% give the nodes a chance to boot up before attempting to stop them
ct:sleep({seconds,10}),
- wait_and_shutdown(lists:reverse(Nodes), 30),
+ %% wait for all nodes to complete boot process, get their names:
+ [
+ receive
+ {tag, {started, Node, Peer}} ->
+ {ok,[["inet"]]} = rpc:call(Node, init, get_argument, [loader])
+ end
+ || {ok, Peer} <- Peers
+ ],
+ [peer:stop(Peer) || {ok, Peer} <- Peers],
unlink(BootPid),
exit(BootPid, kill),
ok.
-start_multiple_nodes([{Name,Node} | NNs], Args, Started) ->
- {ok,Node} = start_node(Name, Args, [{wait, false}]),
- start_multiple_nodes(NNs, Args, [Node | Started]);
-start_multiple_nodes([], _, Nodes) ->
- Nodes.
-
-wait_and_shutdown([Node | Nodes], Tries) ->
- wait_really_started(Node, Tries),
- {ok,[["inet"]]} = rpc:call(Node, init, get_argument, [loader]),
- stop_node(Node),
- wait_and_shutdown(Nodes, Tries);
-wait_and_shutdown([], _) ->
- ok.
-
%% Start a node using the 'inet' loading method,
%% verify that the boot server responds to file requests.
file_requests(Config) when is_list(Config) ->
- {ok, Node, BootPid} = complete_start_node(erl_prim_test_file_req),
+ {ok, Peer, Node, BootPid} = complete_start_node(),
%% compare with results from file server calls (the
%% boot server uses the same file sys and cwd)
@@ -384,7 +364,7 @@ file_requests(Config) when is_list(Config) ->
{ok,DCwd} = rpc:call(Node, erl_prim_loader, get_cwd, ["C:"])
end,
- stop_node(Node),
+ peer:stop(Peer),
unlink(BootPid),
exit(BootPid, kill),
ok.
@@ -414,13 +394,13 @@ remote_archive(Config) when is_list(Config) ->
file:delete(Archive),
{ok, Archive} = create_archive(Archive, [KernelDir]),
- {ok, Node, BootPid} = complete_start_node(remote_archive),
+ {ok, Peer, Node, BootPid} = complete_start_node(),
BeamName = "inet.beam",
ok = test_archive(Node, Archive, KernelDir, BeamName),
%% Cleanup
- stop_node(Node),
+ peer:stop(Peer),
unlink(BootPid),
exit(BootPid, kill),
ok.
@@ -449,10 +429,7 @@ primary_archive(Config) when is_list(Config) ->
[memory, {compress, []}, {cwd, TopDir}]),
%% Use temporary node to simplify cleanup
- Cookie = atom_to_list(erlang:get_cookie()),
- Args = " -setcookie " ++ Cookie,
- {ok,Node} = start_node(primary_archive, Args),
- wait_really_started(Node, 25),
+ {ok,Peer,Node} = ?CT_PEER(),
{_,_,_} = rpc:call(Node, erlang, date, []),
%% Set primary archive
@@ -473,7 +450,7 @@ primary_archive(Config) when is_list(Config) ->
{ok, []} = rpc:call(Node, erl_prim_loader, set_primary_archive,
[undefined, undefined, undefined,
fun escript:parse_file/1]),
- stop_node(Node),
+ peer:stop(Peer),
ok = file:delete(Archive),
ok.
@@ -559,11 +536,10 @@ virtual_dir_in_archive(Config) when is_list(Config) ->
%%% Helper functions.
%%%
-complete_start_node(Name) ->
+complete_start_node() ->
BootPid = start_boot_server(),
- Node = start_node_using_inet(Name),
- wait_really_started(Node, 25),
- {ok, Node, BootPid}.
+ {ok, Peer, Node} = ?CT_PEER(start_node_using_inet_args()),
+ {ok, Peer, Node, BootPid}.
start_boot_server() ->
%% Many linux systems define:
@@ -576,15 +552,9 @@ start_boot_server() ->
{ok,BootPid} = erl_boot_server:start_link(Hosts),
BootPid.
-start_node_using_inet(Name) ->
- start_node_using_inet(Name, []).
-
-start_node_using_inet(Name, Opts) ->
- Host = host(),
- IpStr = ip_str(Host),
- Args = " -loader inet -hosts " ++ IpStr,
- {ok,Node} = start_node(Name, Args, Opts),
- Node.
+start_node_using_inet_args() ->
+ IpStr = ip_str(host()),
+ ["-loader", "inet", "-hosts", IpStr].
ip_str({A, B, C, D}) ->
@@ -593,24 +563,10 @@ ip_str(Host) ->
{ok,Ip} = inet:getaddr(Host, inet),
ip_str(Ip).
-start_node(Name, Args) ->
- start_node(Name, Args, []).
-
-start_node(Name, Args, Opts) ->
- Opts2 = [{args, Args}|Opts],
- io:format("test_server:start_node(~p, peer, ~p).\n",
- [Name, Opts2]),
- Res = test_server:start_node(Name, peer, Opts2),
- io:format("start_node -> ~p\n", [Res]),
- Res.
-
host() ->
{ok,Host} = inet:gethostname(),
Host.
-stop_node(Node) ->
- test_server:stop_node(Node).
-
compile_app(TopDir, AppName) ->
AppDir = filename:join([TopDir, AppName]),
SrcDir = filename:join([AppDir, "src"]),
diff --git a/lib/kernel/test/erpc_SUITE.erl b/lib/kernel/test/erpc_SUITE.erl
index cd145259c3..265131b20c 100644
--- a/lib/kernel/test/erpc_SUITE.erl
+++ b/lib/kernel/test/erpc_SUITE.erl
@@ -21,12 +21,17 @@
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2]).
--export([call/1, call_reqtmo/1, call_against_old_node/1, cast/1,
+-export([call/1, call_against_old_node/1,
+ call_from_old_node/1,
+ call_reqtmo/1, call_against_ei_node/1, cast/1,
send_request/1, send_request_fun/1,
send_request_receive_reqtmo/1,
send_request_wait_reqtmo/1,
send_request_check_reqtmo/1,
- send_request_against_old_node/1,
+ send_request_against_ei_node/1,
+ send_request_receive_reqid_collection/1,
+ send_request_wait_reqid_collection/1,
+ send_request_check_reqid_collection/1,
multicall/1, multicall_reqtmo/1,
multicall_recv_opt/1,
multicall_recv_opt2/1,
@@ -35,27 +40,41 @@
timeout_limit/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
+-export([call_test/4]).
+
-export([call_func1/1, call_func2/1, call_func4/4]).
-export([f/0, f2/0]).
-include_lib("common_test/include/ct.hrl").
+-ifndef(CT_PEER).
+%% This module needs to compile on old nodes...
+-define(CT_PEER(), {ok, undefined, undefined}).
+-define(CT_PEER(Opts), {ok, undefined, undefined}).
+-define(CT_PEER(Opts, Release, PrivDir), {ok, undefined, undefined}).
+-endif.
+
suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,2}}].
-all() ->
+all() ->
[call,
- call_reqtmo,
call_against_old_node,
+ call_from_old_node,
+ call_reqtmo,
+ call_against_ei_node,
cast,
send_request,
send_request_fun,
send_request_receive_reqtmo,
send_request_wait_reqtmo,
send_request_check_reqtmo,
- send_request_against_old_node,
+ send_request_against_ei_node,
+ send_request_receive_reqid_collection,
+ send_request_wait_reqid_collection,
+ send_request_check_reqid_collection,
multicall,
multicall_reqtmo,
multicall_recv_opt,
@@ -86,28 +105,61 @@ end_per_group(_GroupName, Config) ->
Config.
call(Config) when is_list(Config) ->
- call_test(Config).
-
-call_test(Config) ->
- call_test(node(), 10000),
- call_test(node(), infinity),
- try
- erpc:call(node(), timer, sleep, [100], 10),
- ct:fail(unexpected)
- catch
- error:{erpc, timeout} ->
+ {ok, Peer, Node} = ?CT_PEER(),
+ call_test(Peer, Node, true, false).
+
+call_against_old_node(Config) when is_list(Config) ->
+ {OldRelName, OldRel} = old_release(),
+ case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ {skipped, "Not able to start an OTP "++OldRel++" node"};
+ {ok, Peer, Node} ->
+ compile_and_load_on_node(Node),
+ call_test(Peer, Node, false, false),
ok
- end,
- try
- erpc:call(node(), fun () -> timer:sleep(100) end, 10),
- ct:fail(unexpected)
- catch
- error:{erpc, timeout} ->
+ end.
+
+call_from_old_node(Config) when is_list(Config) ->
+ {OldRelName, OldRel} = old_release(),
+ case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ {skipped, "Not able to start an OTP "++OldRel++" node"};
+ {ok, Peer, Node} ->
+ try
+ compile_and_load_on_node(Node),
+ ok = erpc:call(Node, ?MODULE, call_test, [undefined, node(), false, true])
+ after
+ peer:stop(Peer)
+ end
+ end.
+
+call_test(Peer, Node, NodesOfSameRelease, ToTestServer) ->
+ if NodesOfSameRelease ->
+ call_test(Peer, node(), 10000, NodesOfSameRelease, ToTestServer),
+ call_test(Peer, node(), infinity, NodesOfSameRelease, ToTestServer),
+ try
+ erpc:call(node(), timer, sleep, [100], 10),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, timeout} ->
+ ok
+ end,
+ try
+ erpc:call(node(), fun () -> timer:sleep(100) end, 10),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, timeout} ->
+ ok
+ end;
+ true ->
ok
end,
- {ok, Node} = start_node(Config),
- call_test(Node, 10000),
- call_test(Node, infinity),
+ call_test(Peer, Node, 10000, NodesOfSameRelease, ToTestServer),
+ call_test(Peer, Node, infinity, NodesOfSameRelease, ToTestServer),
try
erpc:call(Node, timer, sleep, [100], 10),
ct:fail(unexpected)
@@ -115,32 +167,44 @@ call_test(Config) ->
error:{erpc, timeout} ->
ok
end,
- try
- erpc:call(Node, fun () -> timer:sleep(100) end, 10),
- ct:fail(unexpected)
- catch
- error:{erpc, timeout} ->
- ok
- end,
- try
- erpc:call(Node, erlang, halt, []),
- ct:fail(unexpected)
- catch
- error:{erpc, noconnection} ->
- ok
- end,
- try
- erpc:call(Node, fun () -> erlang:node() end),
- ct:fail(unexpected)
- catch
- error:{erpc, noconnection} ->
+ if NodesOfSameRelease ->
+ try
+ erpc:call(Node, fun () -> timer:sleep(100) end, 10),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, timeout} ->
+ ok
+ end;
+ true ->
ok
end,
- try
- erpc:call(Node, erlang, node, []),
- ct:fail(unexpected)
- catch
- error:{erpc, noconnection} ->
+ if not ToTestServer ->
+ try
+ erpc:call(Node, erlang, halt, []),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, noconnection} ->
+ ok
+ end,
+ if NodesOfSameRelease ->
+ try
+ erpc:call(Node, fun () -> erlang:node() end),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, noconnection} ->
+ ok
+ end;
+ true ->
+ ok
+ end,
+ try
+ erpc:call(Node, erlang, node, []),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, noconnection} ->
+ ok
+ end;
+ true ->
ok
end,
try
@@ -155,8 +219,9 @@ call_test(Config) ->
[] = flush([]),
ok.
-call_test(Node, Timeout) ->
- io:format("call_test(~p, ~p)~n", [Node, Timeout]),
+call_test(Peer, Node, Timeout, NodesOfSameRelease, ToTestServer) ->
+ io:format("call_test(~p, ~p, ~p, ~p, ~p)~n",
+ [Peer, Node, Timeout, NodesOfSameRelease, ToTestServer]),
Node = erpc:call(Node, erlang, node, [], Timeout),
try
erpc:call(Node, erlang, error, [oops|invalid], Timeout),
@@ -179,11 +244,15 @@ call_test(Node, Timeout) ->
exit:{exception, oops} ->
ok
end,
- try
- erpc:call(Node, fun () -> erlang:exit(oops) end, Timeout),
- ct:fail(unexpected)
- catch
- exit:{exception, oops} ->
+ if NodesOfSameRelease ->
+ try
+ erpc:call(Node, fun () -> erlang:exit(oops) end, Timeout),
+ ct:fail(unexpected)
+ catch
+ exit:{exception, oops} ->
+ ok
+ end;
+ true ->
ok
end,
try
@@ -193,38 +262,42 @@ call_test(Node, Timeout) ->
throw:oops ->
ok
end,
- try
- erpc:call(Node, fun () -> erlang:throw(oops) end, Timeout),
- ct:fail(unexpected)
- catch
- throw:oops ->
- ok
- end,
- case {node() == Node, Timeout == infinity} of
- {true, true} ->
- %% This would kill the test since local calls
- %% without timeout is optimized to execute in
- %% calling process itself...
- ok;
- _ ->
- ExitSignal = fun () ->
- exit(self(), oops),
- receive after infinity -> ok end
- end,
+ if NodesOfSameRelease ->
try
- erpc:call(Node, ExitSignal, Timeout),
+ erpc:call(Node, fun () -> erlang:throw(oops) end, Timeout),
ct:fail(unexpected)
catch
- exit:{signal, oops} ->
+ throw:oops ->
ok
end,
- try
- erpc:call(Node, erlang, apply, [ExitSignal, []], Timeout),
- ct:fail(unexpected)
- catch
- exit:{signal, oops} ->
- ok
- end
+ case {node() == Node, Timeout == infinity} of
+ {true, true} ->
+ %% This would kill the test since local calls
+ %% without timeout is optimized to execute in
+ %% calling process itself...
+ ok;
+ _ ->
+ ExitSignal = fun () ->
+ exit(self(), oops),
+ receive after infinity -> ok end
+ end,
+ try
+ erpc:call(Node, ExitSignal, Timeout),
+ ct:fail(unexpected)
+ catch
+ exit:{signal, oops} ->
+ ok
+ end,
+ try
+ erpc:call(Node, erlang, apply, [ExitSignal, []], Timeout),
+ ct:fail(unexpected)
+ catch
+ exit:{signal, oops} ->
+ ok
+ end
+ end;
+ true ->
+ ok
end,
try
erpc:call(Node, ?MODULE, call_func1, [boom], Timeout),
@@ -243,22 +316,26 @@ call_test(Node, Timeout) ->
orelse (A2 == [boom])) ->
ok
end,
- try
- erpc:call(Node, fun () -> ?MODULE:call_func1(boom) end, Timeout),
- ct:fail(unexpected)
- catch
- error:{exception,
- {exception,
- boom,
- [{?MODULE, call_func3, A4, _},
- {?MODULE, call_func2, 1, _}]},
- [{erpc, call, A3, _},
- {?MODULE, call_func1, 1, _},
- {erlang, apply, 2, _}]}
- when ((A3 == 5)
- orelse (A3 == [Node, ?MODULE, call_func2, [boom]]))
- andalso ((A4 == 1)
- orelse (A4 == [boom])) ->
+ if NodesOfSameRelease ->
+ try
+ erpc:call(Node, fun () -> ?MODULE:call_func1(boom) end, Timeout),
+ ct:fail(unexpected)
+ catch
+ error:{exception,
+ {exception,
+ boom,
+ [{?MODULE, call_func3, A4, _},
+ {?MODULE, call_func2, 1, _}]},
+ [{erpc, call, A3, _},
+ {?MODULE, call_func1, 1, _},
+ {erlang, apply, 2, _}]}
+ when ((A3 == 5)
+ orelse (A3 == [Node, ?MODULE, call_func2, [boom]]))
+ andalso ((A4 == 1)
+ orelse (A4 == [boom])) ->
+ ok
+ end;
+ true ->
ok
end,
try
@@ -314,21 +391,27 @@ call_func5(A, B, N, T) when N >= 0 ->
call_func5(_A, _B, _N, _T) ->
erlang:error(badarg).
-call_against_old_node(Config) ->
- case start_22_node(Config) of
- {ok, Node22} ->
- try
- erpc:call(Node22, erlang, node, []),
- ct:fail(unexpected)
- catch
- error:{erpc, notsup} ->
- ok
- end,
- stop_node(Node22),
- ok;
- _ ->
- {skipped, "No OTP 22 available"}
- end.
+call_against_ei_node(Config) when is_list(Config) ->
+ {ok, Node} = start_ei_node(Config),
+ %% Once when erpc:call() brings up the connection
+ %% and once when the connection is up...
+ disconnect(Node),
+ try
+ erpc:call(Node, erlang, node, []),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+ true = lists:member(Node, nodes(hidden)),
+ try
+ erpc:call(Node, erlang, node, []),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+ ok = stop_ei_node(Node).
call_reqtmo(Config) when is_list(Config) ->
Fun = fun (Node, SendMe, Timeout) ->
@@ -340,9 +423,9 @@ call_reqtmo(Config) when is_list(Config) ->
error:{erpc, timeout} -> ok
end
end,
- reqtmo_test(Config, Fun).
+ reqtmo_test(Fun).
-reqtmo_test(Config, Test) ->
+reqtmo_test(Test) ->
%% Tests that we time out in time also when the request itself
%% does not get through. A typical issue we have had
%% in the past, is that the timeout has not triggered until
@@ -352,7 +435,7 @@ reqtmo_test(Config, Test) ->
WaitBlock = 100,
BlockTime = 1000,
- {ok, Node} = start_node(Config),
+ {ok, Peer, Node} = ?CT_PEER(),
erpc:call(Node, erts_debug, set_internal_state, [available_internal_state,
true]),
@@ -378,7 +461,7 @@ reqtmo_test(Config, Test) ->
after 0 -> ok
end,
- stop_node(Node),
+ peer:stop(Peer),
{comment,
"Timeout = " ++ integer_to_list(Timeout)
@@ -425,7 +508,7 @@ cast(Config) when is_list(Config) ->
receive
{a_fun, Ok1} -> ok
end,
- {ok, Node} = start_node(Config),
+ {ok, _Peer, Node} = ?CT_PEER(),
Ok2 = make_ref(),
ok = erpc:cast(Node, erlang, send, [Me, {mfa, Ok2}]),
receive
@@ -446,28 +529,52 @@ cast(Config) when is_list(Config) ->
receive after 1000 -> ok end,
[] = flush([]),
- case start_22_node(Config) of
- {ok, Node22} ->
- ok = erpc:cast(Node, erlang, send, [Me, wont_reach_me]),
- ok = erpc:cast(Node, fun () -> Me ! wont_reach_me end),
+ {ok, EiNode} = start_ei_node(Config),
+ %% Both when erpc:cast() brings up the connection
+ %% and when the connection is up...
+ disconnect(EiNode),
+
+ ok = erpc:cast(EiNode, erlang, send, [Me, wont_reach_me]),
+ ok = erpc:cast(EiNode, fun () -> Me ! wont_reach_me end),
+
+ wait_until(fun () -> lists:member(EiNode, nodes(hidden)) end),
+
+ ok = erpc:cast(EiNode, erlang, send, [Me, wont_reach_me]),
+ ok = erpc:cast(EiNode, fun () -> Me ! wont_reach_me end),
+
+ receive
+ Msg -> ct:fail({unexpected_message, Msg})
+ after
+ 2000 -> ok
+ end,
+ ok = stop_ei_node(EiNode),
+
+ {OldRelName, OldRel} = old_release(),
+ case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ {comment, "Not tested against OTP "++OldRel++" node"};
+ {ok, _OldPeer, OldNode} ->
+ Ok3 = make_ref(),
+ ok = erpc:cast(OldNode, erlang, send, [Me, {mfa, Ok3}]),
receive
- Msg -> ct:fail({unexpected_message, Msg})
- after
- 2000 -> ok
+ {mfa, Ok3} -> ok
end,
- stop_node(Node22),
- {comment, "Tested against OTP 22 as well"};
- _ ->
- {comment, "No tested against OTP 22"}
+ ok = erpc:cast(OldNode, erlang, halt, []),
+
+ ok = erpc:cast(OldNode, erlang, send, [Me, wont_reach_me]),
+
+ receive after 1000 -> ok end,
+ [] = flush([]),
+ {comment, "Also tested against OTP "++OldRel++" node"}
end.
send_request(Config) when is_list(Config) ->
%% Note: First part of nodename sets response delay in seconds.
- PA = filename:dirname(code:which(?MODULE)),
- NodeArgs = [{args,"-pa "++ PA}],
- {ok,Node1} = test_server:start_node('1_erpc_SUITE_call', slave, NodeArgs),
- {ok,Node2} = test_server:start_node('10_erpc_SUITE_call', slave, NodeArgs),
- {ok,Node3} = test_server:start_node('20_erpc_SUITE_call', slave, NodeArgs),
+ {ok, _Peer1, Node1} = ?CT_PEER(["-erpc_test_delay", "1"]),
+ {ok, _Peer2, Node2} = ?CT_PEER(["-erpc_test_delay", "10"]),
+ {ok, _Peer3, Node3} = ?CT_PEER(["-erpc_test_delay", "20"]),
ReqId1 = erpc:send_request(Node1, ?MODULE, f, []),
ReqId2 = erpc:send_request(Node2, ?MODULE, f, []),
ReqId3 = erpc:send_request(Node3, ?MODULE, f, []),
@@ -512,13 +619,9 @@ send_request(Config) when is_list(Config) ->
after 0 -> ok
end,
- stop_node(Node1),
- stop_node(Node2),
- stop_node(Node3),
-
[] = flush([]),
- {ok, Node4} = start_node(Config),
+ {ok, _Peer4, Node4} = ?CT_PEER(),
ReqId6 = erpc:send_request(Node4, erlang, node, []),
@@ -551,32 +654,83 @@ send_request(Config) when is_list(Config) ->
[] = flush([]),
- case start_22_node(Config) of
- {ok, Node5} ->
- ReqId9 = erpc:send_request(Node5, erlang, node, []),
+ {ok, Node5} = start_ei_node(Config),
+ %% Once when erpc:send_request() brings up the connection
+ %% and once when the connection is up...
+ disconnect(Node5),
+ ReqId14 = erpc:send_request(Node5, erlang, node, []),
+ try
+ erpc:receive_response(ReqId14),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} -> ok
+ end,
+ true = lists:member(Node5, nodes(hidden)),
+ ReqId15 = erpc:send_request(Node5, erlang, node, []),
+ try
+ erpc:receive_response(ReqId15),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} -> ok
+ end,
+
+ ok = stop_ei_node(Node5),
+
+ [] = flush([]),
+
+ {OldRelName, OldRel} = old_release(),
+ case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ {comment, "Not tested against OTP "++OldRel++" node"};
+ {ok, _OldPeer, OldNode} ->
+
+ ReqId9 = erpc:send_request(OldNode, erlang, node, []),
+
+ no_response = erpc:check_response({response, OldNode}, ReqId9),
+ no_response = erpc:check_response(ReqId6, ReqId9),
+ receive
+ Msg3 ->
+ {response, OldNode} = erpc:check_response(Msg3, ReqId9)
+ end,
+
+ ReqId10 = erpc:send_request(OldNode, erlang, node, []),
+
+ OldNode = erpc:receive_response(ReqId10),
+
+ ReqId11 = erpc:send_request(OldNode, erlang, node, []),
+ {response, OldNode} = erpc:wait_response(ReqId11, infinity),
+
+ ReqId12 = erpc:send_request(OldNode, erlang, halt, []),
try
- erpc:receive_response(ReqId9),
+ erpc:receive_response(ReqId12),
ct:fail(unexpected)
catch
- error:{erpc, notsup} -> ok
+ error:{erpc, noconnection} -> ok
end,
- stop_node(Node5),
+ ReqId13 = erpc:send_request(OldNode, erlang, node, []),
+ receive
+ Msg4 ->
+ try
+ erpc:check_response(Msg4, ReqId13),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, noconnection} ->
+ ok
+ end
+ end,
[] = flush([]),
-
- ok;
- _ ->
- {comment, "No test against OTP 22 node performed"}
+ {comment, "Also tested against OTP "++OldRel++" node"}
end.
send_request_fun(Config) when is_list(Config) ->
%% Note: First part of nodename sets response delay in seconds.
- PA = filename:dirname(code:which(?MODULE)),
- NodeArgs = [{args,"-pa "++ PA}],
- {ok,Node1} = test_server:start_node('1_erpc_SUITE_call', slave, NodeArgs),
- {ok,Node2} = test_server:start_node('10_erpc_SUITE_call', slave, NodeArgs),
- {ok,Node3} = test_server:start_node('20_erpc_SUITE_call', slave, NodeArgs),
+ {ok, _Peer1, Node1} = ?CT_PEER(["-erpc_test_delay", "1"]),
+ {ok, _Peer2, Node2} = ?CT_PEER(["-erpc_test_delay", "10"]),
+ {ok, _Peer3, Node3} = ?CT_PEER(["-erpc_test_delay", "20"]),
ReqId1 = erpc:send_request(Node1, fun () -> ?MODULE:f() end),
ReqId2 = erpc:send_request(Node2, fun () -> ?MODULE:f() end),
ReqId3 = erpc:send_request(Node3, fun () -> ?MODULE:f() end),
@@ -622,11 +776,7 @@ send_request_fun(Config) when is_list(Config) ->
after 0 -> ok
end,
- stop_node(Node1),
- stop_node(Node2),
- stop_node(Node3),
-
- {ok, Node4} = start_node(Config),
+ {ok, _Peer4, Node4} = ?CT_PEER(),
ReqId6 = erpc:send_request(Node4, fun () -> erlang:node() end),
@@ -659,24 +809,27 @@ send_request_fun(Config) when is_list(Config) ->
[] = flush([]),
- case start_22_node(Config) of
- {ok, Node5} ->
- ReqId9 = erpc:send_request(Node5, fun () -> erlang:node() end),
- try
- erpc:receive_response(ReqId9),
- ct:fail(unexpected)
- catch
- error:{erpc, notsup} -> ok
- end,
-
- stop_node(Node5),
-
- [] = flush([]),
+ {ok, Node5} = start_ei_node(Config),
+ %% Once when erpc:send_request() brings up the connection
+ %% and once when the connection is up...
+ disconnect(Node5),
+ ReqId9 = erpc:send_request(Node5, fun () -> erlang:node() end),
+ try
+ erpc:receive_response(ReqId9),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} -> ok
+ end,
+ true = lists:member(Node5, nodes(hidden)),
+ ReqId10 = erpc:send_request(Node5, fun () -> erlang:node() end),
+ try
+ erpc:receive_response(ReqId10),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} -> ok
+ end,
- ok;
- _ ->
- {comment, "No test against OTP 22 node performed"}
- end.
+ ok = stop_ei_node(Node5).
send_request_receive_reqtmo(Config) when is_list(Config) ->
@@ -690,7 +843,7 @@ send_request_receive_reqtmo(Config) when is_list(Config) ->
error:{erpc, timeout} -> ok
end
end,
- reqtmo_test(Config, Fun).
+ reqtmo_test(Fun).
send_request_wait_reqtmo(Config) when is_list(Config) ->
Fun = fun (Node, SendMe, Timeout) ->
@@ -706,7 +859,7 @@ send_request_wait_reqtmo(Config) when is_list(Config) ->
error:{erpc, timeout} -> ok
end
end,
- reqtmo_test(Config, Fun).
+ reqtmo_test(Fun).
send_request_check_reqtmo(Config) when is_list(Config) ->
Fun = fun (Node, SendMe, Timeout) ->
@@ -723,60 +876,417 @@ send_request_check_reqtmo(Config) when is_list(Config) ->
error:{erpc, timeout} -> ok
end
end,
- reqtmo_test(Config, Fun).
-
-send_request_against_old_node(Config) when is_list(Config) ->
- case start_22_node(Config) of
- {ok, Node22} ->
- RID1 = erpc:send_request(Node22, erlang, node, []),
- RID2 = erpc:send_request(Node22, erlang, node, []),
- RID3 = erpc:send_request(Node22, erlang, node, []),
- try
- erpc:receive_response(RID1),
+ reqtmo_test(Fun).
+
+send_request_against_ei_node(Config) when is_list(Config) ->
+ {ok, EiNode} = start_ei_node(Config),
+ %% Once when erpc:send_request() brings up the connection
+ %% and once when the connection is up...
+ disconnect(EiNode),
+ RID1 = erpc:send_request(EiNode, erlang, node, []),
+ RID2 = erpc:send_request(EiNode, erlang, node, []),
+ RID3 = erpc:send_request(EiNode, erlang, node, []),
+ try
+ erpc:receive_response(RID1),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+ try
+ erpc:wait_response(RID2, infinity),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+ try
+ receive
+ Msg ->
+ erpc:check_response(Msg, RID3),
ct:fail(unexpected)
- catch
- error:{erpc, notsup} ->
- ok
- end,
- try
- erpc:wait_response(RID2, infinity),
+ end
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+
+ true = lists:member(EiNode, nodes(hidden)),
+
+ RID1u = erpc:send_request(EiNode, erlang, node, []),
+ RID2u = erpc:send_request(EiNode, erlang, node, []),
+ RID3u = erpc:send_request(EiNode, erlang, node, []),
+ try
+ erpc:receive_response(RID1u),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+ try
+ erpc:wait_response(RID2u, infinity),
+ ct:fail(unexpected)
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+ try
+ receive
+ Msgu ->
+ erpc:check_response(Msgu, RID3u),
ct:fail(unexpected)
- catch
- error:{erpc, notsup} ->
- ok
- end,
- try
- receive
- Msg ->
- erpc:check_response(Msg, RID3),
- ct:fail(unexpected)
- end
- catch
- error:{erpc, notsup} ->
- ok
- end,
- stop_node(Node22),
- ok;
- _ ->
- {skipped, "No OTP 22 available"}
- end.
+ end
+ catch
+ error:{erpc, notsup} ->
+ ok
+ end,
+
+ ok = stop_ei_node(EiNode).
+
+send_request_receive_reqid_collection(Config) when is_list(Config) ->
+ {ok, _P, N} = ?CT_PEER(#{connection => 0}),
+ send_request_receive_reqid_collection_success(N),
+ send_request_receive_reqid_collection_timeout(N),
+ send_request_receive_reqid_collection_error(N),
+ ok.
+
+send_request_receive_reqid_collection_success(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqId1 = erpc:send_request(N, fun () -> receive after 400 -> 400 end end),
+ ReqIdC1 = erpc:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = erpc:reqids_size(ReqIdC1),
+
+ ReqIdC2 = erpc:send_request(N, fun () -> receive after 1 -> 1 end end, req2, ReqIdC1),
+ 2 = erpc:reqids_size(ReqIdC2),
+
+ ReqIdC3 = erpc:send_request(N, fun () -> receive after 200 -> 200 end end, req3, ReqIdC2),
+ 3 = erpc:reqids_size(ReqIdC3),
+
+ {1, req2, ReqIdC4} = erpc:receive_response(ReqIdC3, infinity, true),
+ 2 = erpc:reqids_size(ReqIdC4),
+
+ {200, req3, ReqIdC5} = erpc:receive_response(ReqIdC4, 7654, true),
+ 1 = erpc:reqids_size(ReqIdC5),
+
+ {400, req1, ReqIdC6} = erpc:receive_response(ReqIdC5, 5000, true),
+ 0 = erpc:reqids_size(ReqIdC6),
+
+ no_request = erpc:receive_response(ReqIdC6, 5000, true),
+
+ 0 = erpc:receive_response(ReqId0),
+
+ ok.
+
+send_request_receive_reqid_collection_timeout(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqId1 = erpc:send_request(N, fun () -> receive after 1000 -> 1000 end end),
+ ReqIdC1 = erpc:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = erpc:send_request(N, fun () -> receive after 1 -> 1 end end, req2, ReqIdC1),
+
+ ReqId3 = erpc:send_request(N, fun () -> receive after 500 -> 500 end end),
+ ReqIdC3 = erpc:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {1, req2, ReqIdC4} = erpc:receive_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = erpc:reqids_size(ReqIdC4),
+
+ try not_valid = erpc:receive_response(ReqIdC4, {abs, Deadline}, true)
+ catch error:{erpc, timeout} -> ok
+ end,
+
+ Abandoned = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Abandoned = lists:sort(erpc:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were abandoned...
+ try not_valid = erpc:receive_response(ReqIdC4, {abs, Deadline+1000}, false)
+ catch error:{erpc, timeout} -> ok
+ end,
+
+ 0 = erpc:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_receive_reqid_collection_error(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqId1 = erpc:send_request(N, fun () -> receive after 600 -> 600 end end),
+ ReqIdC1 = erpc:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = erpc:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:{erpc, badarg} -> ok
+ end,
+
+ ReqIdC2 = erpc:send_request(N, fun () -> receive after 800 -> erlang:halt() end end, req2, ReqIdC1),
+ ReqIdC3 = erpc:send_request(N, fun () -> receive after 200 -> error(errored) end end, req3, ReqIdC2),
+ ReqIdC4 = erpc:send_request(N, fun () -> exit(exited) end, req4, ReqIdC3),
+ ReqIdC5 = erpc:send_request(N, fun () -> receive after 400 -> throw(thrown) end end, req5, ReqIdC4),
+
+ 5 = erpc:reqids_size(ReqIdC5),
+
+ ReqIdC6 = try not_valid = erpc:receive_response(ReqIdC5, infinity, true)
+ catch exit:{{exception, exited}, req4, RIC6} -> RIC6
+ end,
+
+ 4 = erpc:reqids_size(ReqIdC6),
+
+ try not_valid = erpc:receive_response(ReqIdC6, 2000, false)
+ catch error:{{exception, errored, _Stk}, req3, _} -> ok
+ end,
+
+ try not_valid = erpc:receive_response(ReqIdC6, infinity, false)
+ catch throw:{thrown, req5, _} -> ok
+ end,
+
+ {600, req1, ReqIdC6} = erpc:receive_response(ReqIdC6, infinity, false),
+
+ try not_valid = erpc:receive_response(ReqIdC6, 5000, false)
+ catch error:{{erpc, noconnection}, req2, ReqIdC6} -> ok
+ end,
+
+ 0 = erpc:receive_response(ReqId0),
+
+ ok.
+
+send_request_wait_reqid_collection(Config) when is_list(Config) ->
+ {ok, _P, N} = ?CT_PEER(#{connection => 0}),
+ send_request_wait_reqid_collection_success(N),
+ send_request_wait_reqid_collection_timeout(N),
+ send_request_wait_reqid_collection_error(N),
+ ok.
+
+send_request_wait_reqid_collection_success(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqId1 = erpc:send_request(N, fun () -> receive after 400 -> 400 end end),
+ ReqIdC1 = erpc:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = erpc:reqids_size(ReqIdC1),
+
+ ReqIdC2 = erpc:send_request(N, fun () -> receive after 1 -> 1 end end, req2, ReqIdC1),
+ 2 = erpc:reqids_size(ReqIdC2),
+
+ ReqIdC3 = erpc:send_request(N, fun () -> receive after 200 -> 200 end end, req3, ReqIdC2),
+ 3 = erpc:reqids_size(ReqIdC3),
+
+ {{response, 1}, req2, ReqIdC4} = erpc:wait_response(ReqIdC3, infinity, true),
+ 2 = erpc:reqids_size(ReqIdC4),
+
+ {{response, 200}, req3, ReqIdC5} = erpc:wait_response(ReqIdC4, 7654, true),
+ 1 = erpc:reqids_size(ReqIdC5),
+
+ {{response, 400}, req1, ReqIdC6} = erpc:wait_response(ReqIdC5, 5000, true),
+ 0 = erpc:reqids_size(ReqIdC6),
+
+ no_request = erpc:wait_response(ReqIdC6, 5000, true),
+
+ {response, 0} = erpc:wait_response(ReqId0),
+
+ ok.
+
+send_request_wait_reqid_collection_timeout(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqId1 = erpc:send_request(N, fun () -> receive after 1000 -> 1000 end end),
+ ReqIdC1 = erpc:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = erpc:send_request(N, fun () -> receive after 1 -> 1 end end, req2, ReqIdC1),
+
+ ReqId3 = erpc:send_request(N, fun () -> receive after 500 -> 500 end end),
+ ReqIdC3 = erpc:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {{response, 1}, req2, ReqIdC4} = erpc:wait_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = erpc:reqids_size(ReqIdC4),
+
+ no_response = erpc:wait_response(ReqIdC4, {abs, Deadline}, true),
+
+ Unhandled = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Unhandled = lists:sort(erpc:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were not abandoned...
+ {{response, 500}, req3, ReqIdC4} = erpc:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+ {{response, 1000}, req1, ReqIdC4} = erpc:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+
+ {response, 0} = erpc:wait_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection_error(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqId1 = erpc:send_request(N, fun () -> receive after 600 -> 600 end end),
+ ReqIdC1 = erpc:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = erpc:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:{erpc, badarg} -> ok
+ end,
+
+ ReqIdC2 = erpc:send_request(N, fun () -> receive after 800 -> erlang:halt() end end, req2, ReqIdC1),
+ ReqIdC3 = erpc:send_request(N, fun () -> receive after 200 -> error(errored) end end, req3, ReqIdC2),
+ ReqIdC4 = erpc:send_request(N, fun () -> exit(exited) end, req4, ReqIdC3),
+ ReqIdC5 = erpc:send_request(N, fun () -> receive after 400 -> throw(thrown) end end, req5, ReqIdC4),
+
+ 5 = erpc:reqids_size(ReqIdC5),
+
+ ReqIdC6 = try not_valid = erpc:wait_response(ReqIdC5, infinity, true)
+ catch exit:{{exception, exited}, req4, RIC6} -> RIC6
+ end,
+
+ 4 = erpc:reqids_size(ReqIdC6),
+
+ try not_valid = erpc:wait_response(ReqIdC6, 2000, false)
+ catch error:{{exception, errored, _Stk}, req3, _} -> ok
+ end,
+
+ try not_valid = erpc:wait_response(ReqIdC6, infinity, false)
+ catch throw:{thrown, req5, _} -> ok
+ end,
+
+ {{response, 600}, req1, ReqIdC6} = erpc:wait_response(ReqIdC6, infinity, false),
+
+ try not_valid = erpc:wait_response(ReqIdC6, 5000, false)
+ catch error:{{erpc, noconnection}, req2, ReqIdC6} -> ok
+ end,
+
+ {response, 0} = erpc:wait_response(ReqId0),
+
+ ok.
+
+send_request_check_reqid_collection(Config) when is_list(Config) ->
+ {ok, _P, N} = ?CT_PEER(#{connection => 0}),
+ send_request_check_reqid_collection_success(N),
+ send_request_check_reqid_collection_error(N),
+ ok.
+
+send_request_check_reqid_collection_success(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqIdC1 = erpc:send_request(N, fun () -> receive after 600 -> 600 end end, req1, ReqIdC0),
+ 1 = erpc:reqids_size(ReqIdC1),
+
+ ReqId2 = erpc:send_request(N, fun () -> receive after 200 -> 200 end end),
+ ReqIdC2 = erpc:reqids_add(ReqId2, req2, ReqIdC1),
+ 2 = erpc:reqids_size(ReqIdC2),
+
+ ReqIdC3 = erpc:send_request(N, fun () -> receive after 400 -> 400 end end, req3, ReqIdC2),
+ 3 = erpc:reqids_size(ReqIdC3),
+
+ Msg0 = next_msg(),
+
+ no_response = erpc:check_response(Msg0, ReqIdC3, true),
+
+ {{response, 200}, req2, ReqIdC4} = erpc:check_response(next_msg(), ReqIdC3, true),
+ 2 = erpc:reqids_size(ReqIdC4),
+
+ {{response, 400}, req3, ReqIdC5} = erpc:check_response(next_msg(), ReqIdC4, true),
+ 1 = erpc:reqids_size(ReqIdC5),
+
+ {{response, 600}, req1, ReqIdC6} = erpc:check_response(next_msg(), ReqIdC5, true),
+ 0 = erpc:reqids_size(ReqIdC6),
+
+ no_request = erpc:check_response(Msg0, ReqIdC6, true),
+
+ {response, 0} = erpc:check_response(Msg0, ReqId0),
+
+ ok.
+
+send_request_check_reqid_collection_error(N) ->
+
+ ReqId0 = erpc:send_request(N, fun () -> 0 end),
+
+ ReqIdC0 = erpc:reqids_new(),
+
+ ReqId1 = erpc:send_request(N, fun () -> receive after 600 -> 600 end end),
+ ReqIdC1 = erpc:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = erpc:send_request(N, fun () -> receive after 800 -> erlang:halt() end end, req2, ReqIdC1),
+
+ ReqIdC3 = erpc:send_request(N, fun () -> receive after 200 -> error(errored) end end, req3, ReqIdC2),
+
+ ReqIdC4 = erpc:send_request(N, fun () -> exit(exited) end, req4, ReqIdC3),
+
+ ReqIdC5 = erpc:send_request(N, fun () -> receive after 400 -> throw(thrown) end end, req5, ReqIdC4),
+
+ 5 = erpc:reqids_size(ReqIdC5),
+
+ Msg0 = next_msg(),
+
+ no_response = erpc:check_response(Msg0, ReqIdC5, true),
+
+ ReqIdC6 = try not_valid = erpc:check_response(next_msg(), ReqIdC5, true)
+ catch exit:{{exception, exited}, req4, RIC6} -> RIC6
+ end,
+
+ try not_valid = erpc:check_response(next_msg(), ReqIdC6, false)
+ catch error:{{exception, errored, _Stk}, req3, ReqIdC6} -> ok
+ end,
+
+ try not_valid = erpc:check_response(next_msg(), ReqIdC6, false)
+ catch throw:{thrown, req5, ReqIdC6} -> ok
+ end,
+
+ {{response, 600}, req1, ReqIdC6} = erpc:check_response(next_msg(), ReqIdC6, false),
+
+ try not_valid = erpc:check_response(next_msg(), ReqIdC6, false)
+ catch error:{{erpc, noconnection}, req2, ReqIdC6} -> ok
+ end,
+
+ {response, 0} = erpc:check_response(Msg0, ReqId0),
+
+ ok.
multicall(Config) ->
- {ok, Node1} = start_peer_node(Config),
- {ok, Node2} = start_peer_node(Config),
- {Node3, Node3Res} = case start_22_node(Config) of
- {ok, N3} ->
- {N3, {error, {erpc, notsup}}};
- _ ->
- {ok, N3} = start_peer_node(Config),
- stop_node(N3),
- {N3, {error, {erpc, noconnection}}}
- end,
- {ok, Node4} = start_peer_node(Config),
- {ok, Node5} = start_peer_node(Config),
- stop_node(Node2),
- io:format("Node1=~p~nNode2=~p~nNode3=~p~nNode4=~p~nNode5=~p~n",
- [Node1, Node2, Node3, Node4, Node5]),
+ {ok, _Peer1, Node1} = ?CT_PEER(#{connection => 0}),
+ {ok, Peer2, Node2} = ?CT_PEER(#{connection => 0}),
+ {ok, Node3} = start_ei_node(Config),
+ %% Test once when erpc:multicall() brings up the connection...
+ disconnect(Node3),
+ Node3Res = {error, {erpc, notsup}},
+ {ok, _Peer4, Node4} = ?CT_PEER(#{connection => 0}),
+ {ok, _Peer5, Node5} = ?CT_PEER(#{connection => 0}),
+ {OldRelName, OldRel} = old_release(),
+ {OldTested, {ok, _Peer6, Node6}}
+ = case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ {false, ?CT_PEER(#{connection => 0})};
+ {ok, _OldPeer, OldNode} = OldNodeRes ->
+ compile_and_load_on_node(OldNode),
+ {true, OldNodeRes}
+ end,
+ peer:stop(Peer2),
+ io:format("Node1=~p~nNode2=~p~nNode3=~p~nNode4=~p~nNode5=~p~nNode6=~p~n",
+ [Node1, Node2, Node3, Node4, Node5, Node6]),
ThisNode = node(),
Nodes = [ThisNode, Node1, Node2, Node3, Node4, Node5],
@@ -787,8 +1297,9 @@ multicall(Config) ->
Node3Res,
{ok, Node4},
{ok, Node5},
- {error, {erpc, noconnection}}]
- = erpc:multicall(Nodes ++ [badnodename], erlang, node, []),
+ {error, {erpc, noconnection}},
+ {ok, Node6}]
+ = erpc:multicall(Nodes ++ [badnodename] ++ [Node6], erlang, node, []),
[{ok, ThisNode},
{ok, Node1},
@@ -837,16 +1348,18 @@ multicall(Config) ->
{error, {erpc, noconnection}},
Node3Res,
{ok, Node4},
- {ok, Node5}]
- = erpc:multicall(Nodes, erlang, node, []),
+ {ok, Node5},
+ {ok, Node6}]
+ = erpc:multicall(Nodes ++ [Node6], erlang, node, []),
[{ok, ThisNode},
{ok, Node1},
{error, {erpc, noconnection}},
Node3Res,
{ok, Node4},
- {ok, Node5}]
- = erpc:multicall(Nodes, erlang, node, [], 60000),
+ {ok, Node5},
+ {ok, Node6}]
+ = erpc:multicall(Nodes ++ [Node6], erlang, node, [], 60000),
[{throw, ThisNode},
{throw, Node1},
@@ -872,12 +1385,15 @@ multicall(Config) ->
{error, {erpc, timeout}},
{error, {erpc, timeout}},
{error, {erpc, timeout}},
+
+ {error, {erpc, timeout}},
{error, {erpc, timeout}},
{error, {erpc, noconnection}},
Node3Res,
{error, {erpc, timeout}},
+ {error, {erpc, timeout}},
{error, {erpc, timeout}}]
- = erpc:multicall(Nodes++Nodes, timer, sleep, [2000], 500),
+ = erpc:multicall(Nodes++[Node6]++Nodes++[Node6], timer, sleep, [2000], 500),
E0 = erlang:monotonic_time(millisecond),
T0 = E0 - S0,
io:format("T0=~p~n", [T0]),
@@ -891,12 +1407,15 @@ multicall(Config) ->
{ok, ok},
{ok, ok},
{ok, ok},
+
+ {ok, ok},
{ok, ok},
{error, {erpc, noconnection}},
Node3Res,
{ok, ok},
+ {ok, ok},
{ok, ok}]
- = erpc:multicall(Nodes++Nodes, timer, sleep, [2000]),
+ = erpc:multicall(Nodes++[Node6]++Nodes++[Node6], timer, sleep, [2000]),
E1 = erlang:monotonic_time(millisecond),
T1 = E1 - S1,
io:format("T1=~p~n", [T1]),
@@ -910,12 +1429,15 @@ multicall(Config) ->
{ok, ok},
{ok, ok},
{ok, ok},
+
+ {ok, ok},
{ok, ok},
{error, {erpc, noconnection}},
Node3Res,
{ok, ok},
+ {ok, ok},
{ok, ok}]
- = erpc:multicall(Nodes++Nodes, timer, sleep, [2000], 3000),
+ = erpc:multicall(Nodes++[Node6]++Nodes++[Node6], timer, sleep, [2000], 3000),
E2 = erlang:monotonic_time(millisecond),
T2 = E2 - S2,
io:format("T2=~p~n", [T2]),
@@ -927,13 +1449,16 @@ multicall(Config) ->
Node3Res,
{ok, Node4},
{ok, Node5},
+ {ok, Node6},
+
{ok, ThisNode},
{ok, Node1},
{error, {erpc, noconnection}},
Node3Res,
{ok, Node4},
- {ok, Node5}]
- = erpc:multicall(Nodes++Nodes, erlang, node, []),
+ {ok, Node5},
+ {ok, Node6}]
+ = erpc:multicall(Nodes++[Node6]++Nodes++[Node6], erlang, node, []),
[{ok, ThisNode},
{ok, Node1},
@@ -941,13 +1466,16 @@ multicall(Config) ->
Node3Res,
{ok, Node4},
{ok, Node5},
+ {ok, Node6},
+
{ok, ThisNode},
{ok, Node1},
{error, {erpc, noconnection}},
Node3Res,
{ok, Node4},
- {ok, Node5}]
- = erpc:multicall(Nodes++Nodes, erlang, node, [], 60000),
+ {ok, Node5},
+ {ok, Node6}]
+ = erpc:multicall(Nodes++[Node6]++Nodes++[Node6], erlang, node, [], 60000),
[{ok, ThisNode},
{ok, Node1},
@@ -962,16 +1490,18 @@ multicall(Config) ->
{error, {erpc, noconnection}},
Node3Res,
BlingError,
- BlingError]
- = erpc:multicall(Nodes, ?MODULE, call_func2, [bling]),
+ BlingError,
+ OldBlingError]
+ = erpc:multicall(Nodes++[Node6], ?MODULE, call_func2, [bling]),
[BlingError,
BlingError,
{error, {erpc, noconnection}},
Node3Res,
BlingError,
- BlingError]
- = erpc:multicall(Nodes, ?MODULE, call_func2, [bling], 60000),
+ BlingError,
+ OldBlingError]
+ = erpc:multicall(Nodes++[Node6], ?MODULE, call_func2, [bling], 60000),
{error, {exception,
bling,
@@ -979,21 +1509,29 @@ multicall(Config) ->
{?MODULE, call_func2, 1, _}]}} = BlingError,
true = (A == 1) orelse (A == [bling]),
+ {error, {exception,
+ bling,
+ [{?MODULE, call_func3, OldA, _},
+ {?MODULE, call_func2, 1, _}]}} = OldBlingError,
+ true = (OldA == 1) orelse (OldA == [bling]),
+
[{error, {exception, blong, [{erlang, error, [blong], _}]}},
{error, {exception, blong, [{erlang, error, [blong], _}]}},
{error, {erpc, noconnection}},
Node3Res,
{error, {exception, blong, [{erlang, error, [blong], _}]}},
+ {error, {exception, blong, [{erlang, error, [blong], _}]}},
{error, {exception, blong, [{erlang, error, [blong], _}]}}]
- = erpc:multicall(Nodes, erlang, error, [blong]),
+ = erpc:multicall(Nodes++[Node6], erlang, error, [blong]),
[{error, {exception, blong, [{erlang, error, [blong], _}]}},
{error, {exception, blong, [{erlang, error, [blong], _}]}},
{error, {erpc, noconnection}},
Node3Res,
{error, {exception, blong, [{erlang, error, [blong], _}]}},
+ {error, {exception, blong, [{erlang, error, [blong], _}]}},
{error, {exception, blong, [{erlang, error, [blong], _}]}}]
- = erpc:multicall(Nodes, erlang, error, [blong], 60000),
+ = erpc:multicall(Nodes++[Node6], erlang, error, [blong], 60000),
SlowNode4 = fun () ->
case node() of
@@ -1060,22 +1598,23 @@ multicall(Config) ->
[{error, {erpc, noconnection}},
Node3Res,
{error, {erpc, noconnection}},
+ {error, {erpc, noconnection}},
{error, {erpc, noconnection}}]
- = erpc:multicall([Node2, Node3, Node4, Node5], erlang, halt, []),
+ = erpc:multicall([Node2, Node3, Node4, Node5, Node6], erlang, halt, []),
[] = flush([]),
- stop_node(Node3),
- case Node3Res of
- {error, {erpc, notsup}} ->
- {comment, "Tested against an OTP 22 node as well"};
- _ ->
- {comment, "No OTP 22 node available; i.e., only testing against current release"}
+ ok = stop_ei_node(Node3),
+ case OldTested of
+ false ->
+ {comment, "Not tested against OTP "++OldRel++" node"};
+ true ->
+ {comment, "Also tested against OTP "++OldRel++" node"}
end.
multicall_reqtmo(Config) when is_list(Config) ->
- {ok, QuickNode1} = start_node(Config),
- {ok, QuickNode2} = start_node(Config),
+ {ok, Peer1, QuickNode1} = ?CT_PEER(),
+ {ok, Peer2, QuickNode2} = ?CT_PEER(),
Fun = fun (Node, SendMe, Timeout) ->
Me = self(),
SlowSend = fun () ->
@@ -1091,17 +1630,17 @@ multicall_reqtmo(Config) when is_list(Config) ->
erlang, apply, [SlowSend, []],
Timeout)
end,
- Res = reqtmo_test(Config, Fun),
- stop_node(QuickNode1),
- stop_node(QuickNode2),
+ Res = reqtmo_test(Fun),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
Res.
multicall_recv_opt(Config) when is_list(Config) ->
Loops = 1000,
HugeMsgQ = 500000,
process_flag(message_queue_data, off_heap),
- {ok, Node1} = start_node(Config),
- {ok, Node2} = start_node(Config),
+ {ok, Peer1, Node1} = ?CT_PEER(),
+ {ok, Peer2, Node2} = ?CT_PEER(),
ExpRes = [{ok, node()}, {ok, Node1}, {ok, Node2}],
Nodes = [node(), Node1, Node2],
Fun = fun () -> erlang:node() end,
@@ -1113,8 +1652,8 @@ multicall_recv_opt(Config) when is_list(Config) ->
Huge = time_multicall(ExpRes, Nodes, Fun, infinity, Loops),
io:format("Time with huge message queue: ~p microsecond~n",
[erlang:convert_time_unit(Huge, native, microsecond)]),
- stop_node(Node1),
- stop_node(Node2),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
Q = Huge / Empty,
HugeMsgQ = flush_msgq(),
case Q > 10 of
@@ -1128,9 +1667,9 @@ multicall_recv_opt2(Config) when is_list(Config) ->
Loops = 1000,
HugeMsgQ = 500000,
process_flag(message_queue_data, off_heap),
- {ok, Node1} = start_node(Config),
- stop_node(Node1),
- {ok, Node2} = start_node(Config),
+ {ok, Peer1, Node1} = ?CT_PEER(),
+ peer:stop(Peer1),
+ {ok, Peer2, Node2} = ?CT_PEER(),
ExpRes = [{ok, node()}, {error, {erpc, noconnection}}, {ok, Node2}],
Nodes = [node(), Node1, Node2],
Fun = fun () -> erlang:node() end,
@@ -1142,7 +1681,7 @@ multicall_recv_opt2(Config) when is_list(Config) ->
Huge = time_multicall(ExpRes, Nodes, Fun, infinity, Loops),
io:format("Time with huge message queue: ~p microsecond~n",
[erlang:convert_time_unit(Huge, native, microsecond)]),
- stop_node(Node2),
+ peer:stop(Peer2),
Q = Huge / Empty,
HugeMsgQ = flush_msgq(),
case Q > 10 of
@@ -1156,9 +1695,9 @@ multicall_recv_opt3(Config) when is_list(Config) ->
Loops = 1000,
HugeMsgQ = 500000,
process_flag(message_queue_data, off_heap),
- {ok, Node1} = start_node(Config),
- stop_node(Node1),
- {ok, Node2} = start_node(Config),
+ {ok, Peer1, Node1} = ?CT_PEER(),
+ peer:stop(Peer1),
+ {ok, Peer2, Node2} = ?CT_PEER(),
Nodes = [node(), Node1, Node2],
Fun = fun () -> erlang:node() end,
_Warmup = time_multicall(undefined, Nodes, Fun, infinity, Loops div 10),
@@ -1169,7 +1708,7 @@ multicall_recv_opt3(Config) when is_list(Config) ->
Huge = time_multicall(undefined, Nodes, Fun, 0, Loops),
io:format("Time with huge message queue: ~p microsecond~n",
[erlang:convert_time_unit(Huge, native, microsecond)]),
- stop_node(Node2),
+ peer:stop(Peer2),
Q = Huge / Empty,
HugeMsgQ = flush_msgq(),
case Q > 10 of
@@ -1194,10 +1733,20 @@ do_time_multicall(Expect, Nodes, Fun, Tmo, N) ->
do_time_multicall(Expect, Nodes, Fun, Tmo, N-1).
multicast(Config) when is_list(Config) ->
- {ok, Node} = start_node(Config),
+ {ok, _Peer, Node} = ?CT_PEER(),
+ {OldRelName, OldRel} = old_release(),
+ {OldTested, {ok, _OldPeer, OldNode}}
+ = case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ {false, ?CT_PEER()};
+ {ok, _, _} = OldNodeRes ->
+ {true, OldNodeRes}
+ end,
Nodes = [node(), Node],
try
- erpc:multicast(Nodes, erlang, send, hej),
+ erpc:multicast(Nodes++[OldNode], erlang, send, hej),
ct:fail(unexpected)
catch
error:{erpc, badarg} -> ok
@@ -1234,7 +1783,10 @@ multicast(Config) when is_list(Config) ->
Me = self(),
Ok1 = make_ref(),
- ok = erpc:multicast(Nodes, erlang, send, [Me, {mfa, Ok1}]),
+ ok = erpc:multicast(Nodes++[OldNode], erlang, send, [Me, {mfa, Ok1}]),
+ receive
+ {mfa, Ok1} -> ok
+ end,
receive
{mfa, Ok1} -> ok
end,
@@ -1249,31 +1801,47 @@ multicast(Config) when is_list(Config) ->
{a_fun, Ok1} -> ok
end,
- ok = erpc:multicast([Node], erlang, halt, []),
+ ok = erpc:multicast([Node, OldNode], erlang, halt, []),
monitor_node(Node, true),
receive {nodedown, Node} -> ok end,
+ monitor_node(OldNode, true),
+ receive {nodedown, OldNode} -> ok end,
- ok = erpc:multicast([Node], erlang, send, [Me, wont_reach_me]),
+ ok = erpc:multicast([Node, OldNode], erlang, send, [Me, wont_reach_me]),
receive after 1000 -> ok end,
[] = flush([]),
- case start_22_node(Config) of
- {ok, Node22} ->
- ok = erpc:multicast([Node], erlang, send, [Me, wont_reach_me]),
- ok = erpc:multicast([Node], fun () -> Me ! wont_reach_me end),
- receive
- Msg -> ct:fail({unexpected_message, Msg})
- after
- 2000 -> ok
- end,
- stop_node(Node22),
- {comment, "Tested against OTP 22 as well"};
- _ ->
- {comment, "No tested against OTP 22"}
+
+ {ok, EiNode} = start_ei_node(Config),
+ %% Test once when erpc:multicast() brings up the connection
+ %% and once when the connection is up...
+ disconnect(EiNode),
+
+ ok = erpc:multicast([EiNode], erlang, send, [Me, wont_reach_me]),
+ ok = erpc:multicast([EiNode], fun () -> Me ! wont_reach_me end),
+
+ wait_until(fun () -> lists:member(EiNode, nodes(hidden)) end),
+
+ ok = erpc:multicast([EiNode], erlang, send, [Me, wont_reach_me]),
+ ok = erpc:multicast([EiNode], fun () -> Me ! wont_reach_me end),
+
+ receive
+ Msg -> ct:fail({unexpected_message, Msg})
+ after
+ 2000 -> ok
+ end,
+ ok = stop_ei_node(EiNode),
+
+ case OldTested of
+ false ->
+ {comment, "Not tested against OTP "++OldRel++" node"};
+ true ->
+ {comment, "Also tested against OTP "++OldRel++" node"}
end.
+
timeout_limit(Config) when is_list(Config) ->
Node = node(),
MaxTmo = (1 bsl 32) - 1,
@@ -1335,42 +1903,136 @@ timeout_limit(Config) when is_list(Config) ->
%%% Utility functions.
%%%
-start_node(Config) ->
- Name = list_to_atom(atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-" ++ integer_to_list(erlang:system_time(second))
- ++ "-" ++ integer_to_list(erlang:unique_integer([positive]))),
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, slave, [{args, "-pa " ++ Pa}]).
-
-start_peer_node(Config) ->
- Name = list_to_atom(atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-" ++ integer_to_list(erlang:system_time(second))
- ++ "-" ++ integer_to_list(erlang:unique_integer([positive]))),
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, peer, [{args, "-pa " ++ Pa}]).
-
-start_22_node(Config) ->
- Rel = "22_latest",
- case test_server:is_release_available(Rel) of
- false ->
- notsup;
+wait_until(Fun) ->
+ case (catch Fun()) of
true ->
- Cookie = atom_to_list(erlang:get_cookie()),
- Name = list_to_atom(atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-" ++ integer_to_list(erlang:system_time(second))
- ++ "-" ++ integer_to_list(erlang:unique_integer([positive]))),
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name,
- peer,
- [{args, "-pa " ++ Pa ++ " -setcookie "++Cookie},
- {erl, [{release, Rel}]}])
+ ok;
+ _ ->
+ receive after 100 -> ok end,
+ wait_until(Fun)
+ end.
+
+old_release() ->
+ OldRel = integer_to_list(list_to_integer(erlang:system_info(otp_release))-2),
+ {OldRel++"_latest", OldRel}.
+
+compile_and_load_on_node(Node) ->
+ %% Recompile erpc_SUITE on the old node and load it...
+ SrcFile = filename:rootname(code:which(?MODULE)) ++ ".erl",
+ {ok, ?MODULE, BeamCode} = erpc:call(Node, compile, file,
+ [SrcFile, [binary]]),
+ {module, ?MODULE} = erpc:call(Node, code, load_binary,
+ [?MODULE, SrcFile, BeamCode]).
+
+start_ei_node(Config) when is_list(Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ Suffix = case os:type() of
+ {win32, _} -> ".exe";
+ _ -> ""
+ end,
+ FwdNodeExe = filename:join(DataDir, "fwd_node"++Suffix),
+ Name = atom_to_list(?MODULE)
+ ++ "-" ++ "ei_node"
+ ++ "-" ++ integer_to_list(erlang:system_time(second))
+ ++ "-" ++ integer_to_list(erlang:unique_integer([positive])),
+ Cookie = atom_to_list(erlang:get_cookie()),
+ HostName = get_hostname(),
+ Node = list_to_atom(Name++"@"++HostName),
+ Creation = integer_to_list(rand:uniform((1 bsl 15) - 4) + 3),
+ Parent = self(),
+ Pid = spawn_link(fun () ->
+ register(cnode_forward_receiver, self()),
+ process_flag(trap_exit, true),
+ Args = ["-sname", Name,
+ "-cookie", Cookie,
+ "-creation", Creation],
+ io:format("Starting ei_node: ~p ~p~n",
+ [FwdNodeExe, Args]),
+ Port = erlang:open_port({spawn_executable, FwdNodeExe},
+ [use_stdio, {args, Args}]),
+ receive
+ {Port, {data, "accepting"}} -> ok
+ end,
+ ei_node_handler_loop(Node, Parent, Port)
+ end),
+ put({ei_node_handler, Node}, Pid),
+ case check_ei_node(Node) of
+ ok -> {ok, Node};
+ Error -> Error
+ end.
+
+check_ei_node(Node) ->
+ Key = {ei_node_handler, Node},
+ case get(Key) of
+ undefined ->
+ {error, no_handler};
+ Pid when is_pid(Pid) ->
+ Pid ! {check_node, self()},
+ receive
+ {check_node, Pid, Res} ->
+ Res
+ after 3000 ->
+ {error, no_handler_response}
+ end
end.
-stop_node(Node) ->
- test_server:stop_node(Node).
+stop_ei_node(Node) ->
+ case check_ei_node(Node) of
+ ok ->
+ Key = {ei_node_handler, Node},
+ case get(Key) of
+ undefined ->
+ {error, no_handler};
+ Pid when is_pid(Pid) ->
+ Pid ! {stop_node, self()},
+ receive
+ {stop_node, Pid} ->
+ put(Key, undefined),
+ ok
+ after 2000 ->
+ {error, no_handler_response}
+ end
+ end;
+ Error ->
+ Error
+ end.
+
+ei_node_handler_loop(Node, Parent, Port) ->
+ receive
+ {'EXIT', Parent, Reason} ->
+ erlang:disconnect_node(Node),
+ (catch port_close(Port)),
+ exit(Reason);
+ {stop_node, Parent} ->
+ erlang:disconnect_node(Node),
+ (catch port_close(Port)),
+ Parent ! {stop_node, self()},
+ exit(normal);
+ {check_node, Parent} ->
+ Ref = make_ref(),
+ {a_name, Node} ! Ref,
+ receive
+ Ref ->
+ Parent ! {check_node, self(), ok}
+ after
+ 2000 ->
+ Parent ! {check_node, self(), {error, no_node_response}}
+ end;
+ Msg ->
+ Msgs = fetch_all_messages([Msg]),
+ erlang:disconnect_node(Node),
+ (catch port_close(Port)),
+ exit({ei_node_handler, Node, unexpected_messages, Msgs})
+ end,
+ ei_node_handler_loop(Node, Parent, Port).
+
+get_hostname() ->
+ get_hostname(atom_to_list(node())).
+
+get_hostname([$@ | HostName]) ->
+ HostName;
+get_hostname([_ | Rest]) ->
+ get_hostname(Rest).
flush(L) ->
receive
@@ -1380,9 +2042,24 @@ flush(L) ->
L
end.
+disconnect(Node) ->
+ case lists:member(Node, nodes([visible, hidden])) of
+ false ->
+ ok;
+ true ->
+ monitor_node(Node, true),
+ true = erlang:disconnect_node(Node),
+ receive {nodedown, Node} -> ok end,
+ false = lists:member(Node, nodes([visible, hidden])),
+ ok
+ end.
+
t() ->
- [N | _] = string:tokens(atom_to_list(node()), "_"),
- 1000*list_to_integer(N).
+ Delay = case init:get_argument(erpc_test_delay) of
+ {ok,[[D]]} -> list_to_integer(D);
+ _ -> 0
+ end,
+ 1000*Delay.
f() ->
timer:sleep(T=t()),
@@ -1393,6 +2070,9 @@ f2() ->
timer:sleep(500),
halt().
+next_msg() ->
+ receive M -> M end.
+
flush_msgq() ->
flush_msgq(0).
flush_msgq(N) ->
@@ -1402,3 +2082,12 @@ flush_msgq(N) ->
after 0 ->
N
end.
+
+fetch_all_messages(Msgs) ->
+ receive
+ Msg ->
+ fetch_all_messages([Msg|Msgs])
+ after
+ 0 ->
+ Msgs
+ end.
diff --git a/lib/kernel/test/erpc_SUITE_data/Makefile.src b/lib/kernel/test/erpc_SUITE_data/Makefile.src
new file mode 100644
index 0000000000..0f59ee0b05
--- /dev/null
+++ b/lib/kernel/test/erpc_SUITE_data/Makefile.src
@@ -0,0 +1,39 @@
+#
+# %CopyrightBegin%
+#
+# Copyright Ericsson AB 2021. All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# %CopyrightEnd%
+#
+
+include @erl_interface_mk_include@
+
+CC = @CC@
+LD = @LD@
+
+CFLAGS = @EI_CFLAGS@ $(THR_DEFS) -I@erl_interface_include@
+
+LIBEI = @erl_interface_eilib@
+LIBFLAGS = $(LIBEI) @LIBS@ @erl_interface_sock_libs@ @erl_interface_threadlib@
+
+all: fwd_node@exe@
+
+fwd_node@exe@: fwd_node@obj@ $(LIBEI)
+ $(LD) @CROSSLDFLAGS@ -o $@ fwd_node@obj@ $(LIBFLAGS)
+
+clean:
+ $(RM) fwd_node@obj@
+ $(RM) fwd_node@exe@
+
diff --git a/lib/kernel/test/erpc_SUITE_data/fwd_node.c b/lib/kernel/test/erpc_SUITE_data/fwd_node.c
new file mode 100644
index 0000000000..da26fd4224
--- /dev/null
+++ b/lib/kernel/test/erpc_SUITE_data/fwd_node.c
@@ -0,0 +1,221 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2021. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef __WIN32__
+# include <io.h>
+#else
+# include <unistd.h>
+# include <errno.h>
+# include <pthread.h>
+#endif
+#include "ei.h"
+
+static void usage1(char *what);
+static void usage2(char *what, char *val);
+static void fail1(char *what);
+
+char *progname;
+ei_cnode cnode;
+char *node_name = NULL;
+char *cookie = NULL;
+short creation = -1;
+
+#ifdef __WIN32__
+static unsigned __stdcall ei_node_executor(LPVOID unused)
+#else
+static void *ei_node_executor(void *unused)
+#endif
+{
+ int lfd, pfd, res, port;
+
+ ei_init();
+ res = ei_connect_init(&cnode, node_name, cookie, creation);
+ if (res < 0)
+ fail1("ei_connect_init");
+ port = 0;
+ lfd = ei_listen(&cnode, &port, 5);
+ if (lfd < 0)
+ fail1("ei_listen");
+ pfd = ei_publish(&cnode, port);
+ if (pfd < 0)
+ fail1("ei_publish");
+
+ printf("accepting");
+ fflush(stdout);
+
+ while (!0) {
+ ErlConnect conn;
+ int afd = ei_accept(&cnode, lfd, &conn);
+ if (afd < 0)
+ fail1("ei_accept");
+
+ while (!0) {
+ ei_x_buff x;
+ erlang_msg msg;
+ ei_x_new(&x);
+ do {
+ res = ei_xreceive_msg(afd, &msg, &x);
+ } while (res == ERL_TICK);
+ if (res != ERL_MSG) {
+ /* connection closed... */
+ ei_close_connection(afd);
+ break;
+ }
+
+ switch (msg.msgtype) {
+ case ERL_SEND:
+ case ERL_REG_SEND:
+ ei_send_reg_encoded(afd, &cnode.self, "cnode_forward_receiver",
+ x.buff, x.index);
+ break;
+ case ERL_LINK:
+ fail1("received link");
+ break;
+ case ERL_UNLINK:
+ fail1("received unlink");
+ break;
+ case ERL_EXIT:
+ fail1("received exit");
+ break;
+ default:
+ fail1("received invalid signal");
+ break;
+ }
+ ei_x_free(&x);
+ }
+ }
+
+#ifdef __WIN32__
+ return 0;
+#else
+ return NULL;
+#endif
+}
+
+int
+main(int argc, char *argv[])
+{
+#ifdef __WIN32__
+ unsigned tid;
+ HANDLE thndl;
+#else
+ pthread_t tid;
+#endif
+ int i;
+
+ progname = argv[0];
+ i = 1;
+ while (i < argc) {
+ if (strcmp(argv[i], "-sname") == 0) {
+ i++;
+ if (i == argc)
+ usage1("Missing -sname value");
+ node_name = argv[i];
+ }
+ else if (strcmp(argv[i], "-cookie") == 0) {
+ i++;
+ if (i == argc)
+ usage1("Missing -cookie value");
+ cookie = argv[i];
+ }
+ else if (strcmp(argv[i], "-creation") == 0) {
+ char *endp;
+ long int val;
+ i++;
+ if (i == argc)
+ usage1("Missing -creation value");
+ val = strtol(argv[i], &endp, 10);
+ creation = (short) val;
+ if (*endp != '\0' || creation < 4)
+ usage2("Invalid creation", argv[i]);
+ }
+ else {
+ usage2("Unknown parameter", argv[i]);
+ }
+ i++;
+ }
+
+ if (!node_name)
+ usage1("Missing -sname parameter");
+ if (!cookie)
+ usage1("Missing -cookie parameter");
+ if (creation < 0)
+ usage1("Missing -creation parameter");
+
+#ifdef __WIN32__
+ thndl = (HANDLE) _beginthreadex(NULL, 0, ei_node_executor,
+ NULL, 0, &tid);
+ if (thndl == (HANDLE) 0)
+ fail1("_beginthreadex() failed");
+#else
+ if (pthread_create(&tid, NULL, ei_node_executor, NULL) != 0)
+ fail1("pthread_create() failed");
+#endif
+
+ /* Wait until stdin is closed. Terminate when that happens... */
+ while (!0) {
+ char buf[128];
+#ifdef __WIN32__
+ int res = _read(0, (void *) &buf[0], sizeof(buf));
+#else
+ ssize_t res = read(0, (void *) &buf[0], sizeof(buf));
+#endif
+ if (res == 0)
+ exit(0); /* erlang port closed... */
+ if (res < 0 && errno != EINTR) {
+ fail1("read() failed");
+ }
+ }
+
+ return 0;
+}
+
+static void
+usage1(char *what)
+{
+ fprintf(stderr,
+ "ERROR: %s\n\n"
+ " Usage:\n"
+ " %s -sname <node name> -cookie <cookie> -creation <creation>\n",
+ what, progname);
+ exit(1);
+}
+
+static void
+usage2(char *what, char *val)
+{
+ fprintf(stderr,
+ "ERROR: %s: %s\n\n"
+ " Usage:\n"
+ " %s -sname <node name> -cookie <cookie> -creation <creation>\n",
+ what, val, progname);
+ exit(1);
+}
+
+static void
+fail1(char *what)
+{
+ fprintf(stderr, "%s FAILED: %s; %d\n",
+ cnode.thisalivename, what, erl_errno);
+ exit(1);
+}
diff --git a/lib/kernel/test/error_logger_SUITE.erl b/lib/kernel/test/error_logger_SUITE.erl
index eab72e58a7..5050ed1af8 100644
--- a/lib/kernel/test/error_logger_SUITE.erl
+++ b/lib/kernel/test/error_logger_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -235,7 +235,7 @@ generate_error(Error, Stack) ->
via_logger_process(Config) ->
case os:type() of
{win32,_} ->
- {skip,"Skip on windows - cant change file mode"};
+ {skip,"Skip on windows - can't change file mode"};
_ ->
error_logger:add_report_handler(?MODULE, self()),
Dir = filename:join(?config(priv_dir,Config),"dummydir"),
@@ -255,12 +255,12 @@ via_logger_process(Config) ->
other_node(_Config) ->
error_logger:add_report_handler(?MODULE, self()),
- {ok,Node} = test_server:start_node(?FUNCTION_NAME,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
ok = rpc:call(Node,logger,add_handler,[error_logger,error_logger,
#{level=>info,filter_default=>log}]),
rpc:call(Node,error_logger,error_report,[hi_from_remote]),
reported(error_report,std_error,hi_from_remote),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl
index 60aa60bf9f..f3ca38070e 100644
--- a/lib/kernel/test/file_SUITE.erl
+++ b/lib/kernel/test/file_SUITE.erl
@@ -820,7 +820,7 @@ untranslatable_names_1(Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
Dir = filename:join(PrivDir, "untranslatable_names"),
ok = file:make_dir(Dir),
- Node = start_node(untranslatable_names, "+fnu"),
+ {ok, Peer, Node} = ?CT_PEER(["+fnu"]),
try
ok = file:set_cwd(Dir),
[ok = file:write_file(F, F) || {_,F} <- untranslatable_names()],
@@ -841,7 +841,7 @@ untranslatable_names_1(Config) ->
io:format("ExpectedListDirAll: ~p\n", [ExpectedListDirAll]),
ExpectedListDirAll = call_and_sort(Node, file, list_dir_all, [Dir])
after
- catch test_server:stop_node(Node),
+ catch peer:stop(Peer),
file:set_cwd(OldCwd),
[file:delete(F) || {_,F} <- untranslatable_names()],
file:del_dir(Dir)
@@ -861,7 +861,7 @@ untranslatable_names_error_1(Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
Dir = filename:join(PrivDir, "untranslatable_names_error"),
ok = file:make_dir(Dir),
- Node = start_node(untranslatable_names, "+fnue"),
+ {ok, Peer, Node} = ?CT_PEER(["+fnue"]),
try
ok = file:set_cwd(Dir),
[ok = file:write_file(F, F) || {_,F} <- untranslatable_names()],
@@ -875,7 +875,7 @@ untranslatable_names_error_1(Config) ->
true = lists:keymember(BadFile, 2, untranslatable_names())
after
- catch test_server:stop_node(Node),
+ catch peer:stop(Peer),
file:set_cwd(OldCwd),
[file:delete(F) || {_,F} <- untranslatable_names()],
file:del_dir(Dir)
@@ -901,18 +901,6 @@ no_untranslatable_names() ->
_ -> false
end.
-start_node(Name, Args) ->
- [_,Host] = string:lexemes(atom_to_list(node()), "@"),
- ct:log("Trying to start ~w@~s~n", [Name,Host]),
- case test_server:start_node(Name, peer, [{args,Args}]) of
- {error,Reason} ->
- ct:fail(Reason);
- {ok,Node} ->
- ct:log("Node ~p started~n", [Node]),
- Node
- end.
-
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1089,7 +1077,7 @@ close(Config) when is_list(Config) ->
{ok,Fd1} = ?FILE_MODULE:open(Name,read_write),
%% Just closing it is no fun, we did that a million times already
%% This is a common error, for code written before Erlang 4.3
- %% bacause then ?FILE_MODULE:open just returned a Pid, and not everyone
+ %% because then ?FILE_MODULE:open just returned a Pid, and not everyone
%% really checked what they got.
{'EXIT',_Msg} = (catch ok = ?FILE_MODULE:close({ok,Fd1})),
ok = ?FILE_MODULE:close(Fd1),
@@ -1253,7 +1241,7 @@ append(Config) when is_list(Config) ->
ok = ?FILE_MODULE:make_dir(NewDir),
First = "First line\n",
- Second = "Seond lines comes here\n",
+ Second = "Second lines comes here\n",
Third = "And here is the third line\n",
%% Write a small text file.
@@ -2238,7 +2226,7 @@ allocate(Config) when is_list(Config) ->
allocate_and_assert(Fd, Offset, Length) ->
%% Just verify that calls to ?PRIM_FILE:allocate/3 don't crash or have
- %% any other negative side effect. We can't really asssert against a
+ %% any other negative side effect. We can't really assert against a
%% specific return value, because support for file space pre-allocation
%% depends on the OS, OS version and underlying filesystem.
%%
@@ -2603,7 +2591,7 @@ e_rename(Config) when is_list(Config) ->
ok ->
{ok, {comment,
"Moving between filesystems "
- "suceeded, files are probably "
+ "succeeded, files are probably "
"in the same filesystem!"}};
{error, eperm} ->
{ok, {comment, "SBS! You don't "
@@ -4003,7 +3991,7 @@ ok.
%% OTP-10852. +fnu and latin1 filenames.
otp_10852(Config) when is_list(Config) ->
- Node = start_node(erl_pp_helper, "+fnu"),
+ {ok, Peer, Node} = ?CT_PEER(["+fnu"]),
Dir = proplists:get_value(priv_dir, Config),
B = filename:join(Dir, <<"\xE4">>),
ok = rpc_call(Node, get_cwd, [B]),
@@ -4046,7 +4034,7 @@ otp_10852(Config) when is_list(Config) ->
{ok, Fd2, B} = rpc_call(Node, path_open, [["."], B, [read]]),
ok = rpc_call(Node, close, [Fd2])
end,
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
rpc_call(N, F, As) ->
diff --git a/lib/kernel/test/file_SUITE_data/realmen.html b/lib/kernel/test/file_SUITE_data/realmen.html
index 92e13f23b8..eaaa65523a 100644
--- a/lib/kernel/test/file_SUITE_data/realmen.html
+++ b/lib/kernel/test/file_SUITE_data/realmen.html
@@ -121,7 +121,7 @@ based on data structures, instead of the other way around. As all Real
Programmers know, the only useful data structure is the
array. Strings, lists, structures, sets -- these are all special cases
of arrays and and can be treated that way just as easily without
-messing up your programing language with all sorts of
+messing up your programming language with all sorts of
complications. The worst thing about fancy data types is that you have
to declare them, and Real Programming Languages, as we all know, have
implicit typing based on the first letter of the (six character)
@@ -318,7 +318,7 @@ thing slightly more trivial than the destruction of life as we know
it, providing there's enough money in it. There are several Real
Programmers building video games at Atari, for example. (But not
playing them. A Real Programmer knows how to beat the machine every
-time: no challange in that.) Everyone working at LucasFilm is a Real
+time: no challenge in that.) Everyone working at LucasFilm is a Real
Programmer. (It would be crazy to turn down the money of 50 million
Star Wars fans.) The proportion of Real Programmers in Computer
Graphics is somewhat lower than the norm, mostly because nobody has
@@ -384,7 +384,7 @@ coffee. In some cases, the cups will contain Orange Crush.
and the Principles of Operation open to some particularly interesting
pages.
-<LI> Taped to the wall is a line-printer Snoopy calender for the year
+<LI> Taped to the wall is a line-printer Snoopy calendar for the year
1969.
<LI> Strewn about the floor are several wrappers for peanut butter
diff --git a/lib/kernel/test/file_name_SUITE.erl b/lib/kernel/test/file_name_SUITE.erl
index 7166064558..5a6424ff98 100644
--- a/lib/kernel/test/file_name_SUITE.erl
+++ b/lib/kernel/test/file_name_SUITE.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -634,9 +634,9 @@ hopeless_darwin() ->
case {os:type(),os:version()} of
{{unix,darwin},{Major,_,_}} ->
%% icky file names worked between 10 and 17, but started returning
- %% EILSEQ in 18. The check against 18..19 is exact in case newer
+ %% EILSEQ in 18. The check against 18..20 is exact in case newer
%% versions of Darwin support them again.
- Major < 9 orelse (Major >= 18 andalso Major =< 19);
+ Major < 9 orelse (Major >= 18 andalso Major =< 20);
_ ->
false
end.
diff --git a/lib/kernel/test/gen_sctp_SUITE.erl b/lib/kernel/test/gen_sctp_SUITE.erl
index 321f6abf2e..46b227af07 100644
--- a/lib/kernel/test/gen_sctp_SUITE.erl
+++ b/lib/kernel/test/gen_sctp_SUITE.erl
@@ -32,7 +32,7 @@
-export([
skip_old_solaris/1,
basic/1,
- api_open_close/1,api_listen/1,api_connect_init/1,api_opts/1,
+ api_open_close/1,api_listen/1,api_connect_init/1,api_connectx_init/1,api_opts/1,
xfer_min/1,xfer_active/1,def_sndrcvinfo/1,implicit_inet6/1,
open_multihoming_ipv4_socket/1,
open_unihoming_ipv6_socket/1,
@@ -48,7 +48,8 @@
t_simple_local_sockaddr_in_send_recv/1,
t_simple_link_local_sockaddr_in_send_recv/1,
t_simple_local_sockaddr_in6_send_recv/1,
- t_simple_link_local_sockaddr_in6_send_recv/1
+ t_simple_link_local_sockaddr_in6_send_recv/1,
+ t_simple_local_sockaddr_in_connectx_init/1
]).
suite() ->
@@ -87,7 +88,7 @@ old_solaris_cases() ->
extensive_cases() ->
[
- api_open_close, api_listen, api_connect_init,
+ api_open_close, api_listen, api_connect_init, api_connectx_init,
api_opts, xfer_min, xfer_active, def_sndrcvinfo, implicit_inet6,
open_multihoming_ipv4_socket,
open_unihoming_ipv6_socket,
@@ -105,7 +106,8 @@ sockaddr_cases() ->
t_simple_local_sockaddr_in_send_recv,
t_simple_link_local_sockaddr_in_send_recv,
t_simple_local_sockaddr_in6_send_recv,
- t_simple_link_local_sockaddr_in6_send_recv
+ t_simple_link_local_sockaddr_in6_send_recv,
+ t_simple_local_sockaddr_in_connectx_init
].
@@ -178,7 +180,14 @@ end_per_group(_GroupName, Config) ->
Config.
-init_per_testcase(_Case, Config) ->
+init_per_testcase(api_connectx_init=Case, Config) ->
+ check_sctp_connectx(Case, Config);
+init_per_testcase(t_simple_local_sockaddr_in_connectx_init=Case, Config) ->
+ check_sctp_connectx(Case, Config);
+init_per_testcase(Case, Config) ->
+ init_per_testcase_common(Case, Config).
+
+init_per_testcase_common(_Case, Config) ->
?P("init_per_testcase -> entry with"
"~n Config: ~p"
@@ -215,6 +224,21 @@ end_per_testcase(_Case, Config) ->
-define(LOGVAR(Var), begin io:format(??Var" = ~p~n", [Var]) end).
+-define(no_return(Expr), error({unexpected, Expr})).
+
+check_sctp_connectx(Case, Config) ->
+ {ok,S} = gen_sctp:open([]),
+ try
+ {ok,Pb} = inet:port(S),
+ case gen_sctp:connectx_init(S, [{127,0,0,1}], Pb, []) of
+ {error, enotsup} ->
+ {skip, "sctp_connectx unsupported"};
+ _ ->
+ init_per_testcase_common(Case, Config)
+ end
+ after
+ gen_sctp:close(S)
+ end.
is_old_solaris() ->
os:type() =:= {unix,sunos} andalso os:version() < {5,12,0}.
@@ -798,6 +822,40 @@ api_connect_init(Config) when is_list(Config) ->
ok = gen_sctp:close(Sb),
ok.
+%% Test the API function connectx_init/4.
+api_connectx_init(Config) when is_list(Config) ->
+ Localhost = {127,0,0,1},
+
+ {ok,S} = gen_sctp:open(),
+ {ok,Pb} = inet:port(S),
+ try ?no_return(gen_sctp:connectx_init(S, Localhost, 12345, []))
+ catch error:badarg -> ok
+ end,
+ {error, einval} = gen_sctp:connectx_init(S, [Localhost], not_allowed_for_port, []),
+ %% try ?no_return(gen_sctp:connectx_init(S, [Localhost], not_allowed_for_port, []))
+ %% catch error:badarg -> ok
+ %% end,
+ try ?no_return(gen_sctp:connectx_init(S, [Localhost], 12345, not_allowed_for_opts))
+ catch error:badarg -> ok
+ end,
+ ok = gen_sctp:close(S),
+ {error,closed} = gen_sctp:connectx_init(S, [Localhost], 12345, []),
+
+ {ok,Sb} = gen_sctp:open(Pb),
+ {ok,Sa} = gen_sctp:open(),
+ {ok, A1} = gen_sctp:connectx_init(Sa, [localhost], Pb, []),
+ true = (A1 =/= 0),
+ {Localhost,Pb,#sctp_assoc_change{state=cant_assoc, assoc_id = A1}} =
+ recv_event(log_ok(gen_sctp:recv(Sa, infinity))),
+ ok = gen_sctp:listen(Sb, true),
+ {ok, A2} = gen_sctp:connectx_init(Sa, [localhost], Pb, []),
+ true = (A2 =/= 0),
+ {Localhost,Pb,#sctp_assoc_change{state=comm_up, assoc_id = A2}} =
+ recv_event(log_ok(gen_sctp:recv(Sa, infinity))),
+ ok = gen_sctp:close(Sa),
+ ok = gen_sctp:close(Sb),
+ ok.
+
recv_event({Addr, Port, [], #sctp_assoc_change{} = AssocChange}) ->
{Addr, Port, AssocChange};
recv_event({Addr,Port,
@@ -862,7 +920,7 @@ do_implicit_inet6(_Config) ->
{error, nxdomain = Reason_getaddr} ->
?SKIPT(Reason_getaddr);
{error, Reason_getaddr} ->
- ?line ct:fail({unexpected, Reason_getaddr})
+ ct:fail({unexpected, Reason_getaddr})
end,
S2 = case gen_sctp:open(0, [{ip, Localhost}]) of
{ok, S} ->
@@ -870,7 +928,7 @@ do_implicit_inet6(_Config) ->
{error, nxdomain = Reason_open} ->
?SKIPT(Reason_open);
{error, Reason_open} ->
- ?line ct:fail({unexpected, Reason_open})
+ ct:fail({unexpected, Reason_open})
end,
?P("*** ~s: ~p ***", ["localhost", Localhost]),
@@ -1920,7 +1978,7 @@ recv_close(Config) when is_list(Config) ->
"~n ~p", [PreReason]),
(catch gen_sctp:close(S)),
(catch gen_sctp:close(C)),
- ?line ct:fail("Unexpected pre close from reader (~p): ~p",
+ ct:fail("Unexpected pre close from reader (~p): ~p",
[Pid, PreReason]);
{Pid, ready} ->
?P("reader ready"),
@@ -1932,7 +1990,7 @@ recv_close(Config) when is_list(Config) ->
?P("reader ready timeout"),
(catch gen_sctp:close(S)),
(catch gen_sctp:close(C)),
- ?line ct:fail("Unexpected pre close timeout (~p)", [Pid])
+ ct:fail("Unexpected pre close timeout (~p)", [Pid])
end,
?P("\"ensure\" reader reading..."),
@@ -1942,7 +2000,7 @@ recv_close(Config) when is_list(Config) ->
"~n ~p", [Any]),
(catch gen_sctp:close(S)),
(catch gen_sctp:close(C)),
- ?line ct:fail("Unexpected message: ~p", [Any])
+ ct:fail("Unexpected message: ~p", [Any])
after 5000 ->
ok
end,
@@ -1959,14 +2017,14 @@ recv_close(Config) when is_list(Config) ->
?P("unexpected reader termination: "
"~n ~p", [PostReason]),
(catch gen_sctp:close(C)),
- ?line ct:fail("Unexpected post close from reader (~p): ~p",
+ ct:fail("Unexpected post close from reader (~p): ~p",
[Pid, PostReason])
after 5000 ->
?P("unexpected reader termination timeout"),
demonitor(MRef, [flush]),
(catch gen_sctp:close(C)),
exit(Pid, kill),
- ?line ct:fail("Reader (~p) termination timeout", [Pid])
+ ct:fail("Reader (~p) termination timeout", [Pid])
end,
?P("close client socket"),
(catch gen_sctp:close(C)),
@@ -2339,6 +2397,32 @@ do_simple_sockaddr_send_recv(#{family := _Fam} = SockAddr, _) ->
ok.
+%% Test the sockaddr version of connectx_init/4.
+t_simple_local_sockaddr_in_connectx_init(Config) when is_list(Config) ->
+ Localhost = {127,0,0,1},
+ {ok,Sb} = gen_sctp:open(),
+ {ok,Pb} = inet:port(Sb),
+ {ok,Sa} = gen_sctp:open(),
+ SockAddr = #{family => inet,
+ addr => Localhost,
+ port => Pb},
+ case gen_sctp:connectx_init(Sa, [SockAddr], []) of
+ {ok, A1} ->
+ true = (A1 =/= 0),
+ {Localhost,Pb,#sctp_assoc_change{state=cant_assoc, assoc_id = A1}} =
+ recv_event(log_ok(gen_sctp:recv(Sa, infinity))),
+ ok = gen_sctp:listen(Sb, true),
+ {ok, A2} = gen_sctp:connectx_init(Sa, [SockAddr], []),
+ true = (A2 =/= 0),
+ {Localhost,Pb,#sctp_assoc_change{state=comm_up, assoc_id = A2}} =
+ recv_event(log_ok(gen_sctp:recv(Sa, infinity))),
+ ok = gen_sctp:close(Sa),
+ ok = gen_sctp:close(Sb);
+ {error, enotsup} ->
+ ok
+ end,
+ ok.
+
%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% socket gen_server ultra light
@@ -2627,10 +2711,10 @@ ok({ok, X}) ->
X;
ok({error, X}) ->
?P("ERROR: ~p", [X]),
- ?line ct:fail({unexpected_error, X});
+ ct:fail({unexpected_error, X});
ok(X) ->
?P("UNEXPECTED: ~p", [X]),
- ?line ct:fail({unexpected, X}).
+ ct:fail({unexpected, X}).
log(X) ->
diff --git a/lib/kernel/test/gen_tcp_api_SUITE.erl b/lib/kernel/test/gen_tcp_api_SUITE.erl
index 47a9ff7149..87e3750548 100644
--- a/lib/kernel/test/gen_tcp_api_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_api_SUITE.erl
@@ -63,7 +63,7 @@ suite() ->
].
all() ->
- %% This is a temporary messure to ensure that we can
+ %% This is a temporary measure to ensure that we can
%% test the socket backend without effecting *all*
%% applications on *all* machines.
%% This flag is set only for *one* host.
@@ -424,9 +424,9 @@ do_recv_delim(Config) ->
ok = gen_tcp:send(A, "abcXefgX"),
?P("await the first chunk"),
- receive {tcp, Client, "abcX"} -> ?P("received first chunck") end,
+ receive {tcp, Client, "abcX"} -> ?P("received first chunk") end,
?P("await the second chunk"),
- receive {tcp, Client, "efgX"} -> ?P("received second chunck") end,
+ receive {tcp, Client, "efgX"} -> ?P("received second chunk") end,
?P("cleanup"),
ok = gen_tcp:close(Client),
@@ -609,7 +609,7 @@ do_t_fdconnect(Config) ->
ct:fail({unexpected_listen_error, LReason, LOpts})
catch
LC : LE : LS ->
- ?P("UNEXPECTED ERROR - catched listen: "
+ ?P("UNEXPECTED ERROR - caught listen: "
"~n LOpts: ~p"
"~n C: ~p"
"~n E: ~p"
@@ -635,7 +635,7 @@ do_t_fdconnect(Config) ->
ct:fail({unexpected_connect_error, CReason, COpts})
catch
CC : CE : CS ->
- ?P("UNEXPECTED ERROR - catched connect: "
+ ?P("UNEXPECTED ERROR - caught connect: "
"~n COpts: ~p"
"~n C: ~p"
"~n E: ~p"
@@ -657,7 +657,7 @@ do_t_fdconnect(Config) ->
ct:fail({unexpected_accept_error, AReason})
catch
AC : AE : AS ->
- ?P("UNEXPECTED ERROR - catched accept: "
+ ?P("UNEXPECTED ERROR - caught accept: "
"~n C: ~p"
"~n E: ~p"
"~n S: ~p", [AC, AE, AS]),
@@ -1316,10 +1316,7 @@ do_simple_sockaddr_send_recv(SockAddr, _) ->
%% we have to skip on that platform.
s_accept_with_explicit_socket_backend(Config) when is_list(Config) ->
?TC_TRY(s_accept_with_explicit_socket_backend,
- fun() ->
- is_not_windows(),
- is_socket_supported()
- end,
+ fun() -> has_socket_support() end,
fun() -> do_s_accept_with_explicit_socket_backend() end).
do_s_accept_with_explicit_socket_backend() ->
@@ -1337,12 +1334,15 @@ do_s_accept_with_explicit_socket_backend() ->
%%% Utilities
-is_not_windows() ->
+has_socket_support() ->
case os:type() of
{win32, _} ->
{skip, "Windows not supported"};
_ ->
- ok
+ case code:is_loaded(prim_socket) of
+ false -> {skip, "Compiled without socket support"};
+ _ -> ok
+ end
end.
is_socket_supported() ->
diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index 1e32f1b3cd..23b0c1b542 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -122,7 +122,7 @@ suite() ->
{timetrap,{minutes,4}}].
all() ->
- %% This is a temporary messure to ensure that we can
+ %% This is a temporary measure to ensure that we can
%% test the socket backend without effecting *all*
%% applications on *all* machines.
%% This flag is set only for *one* host.
@@ -427,7 +427,7 @@ do_default_options(Config) ->
"-kernel inet_default_listen_options "
"\"{delay_send,true}\"",
fun() -> do_delay_send_2(Config) end),
- %% Active is to dangerous and is supressed
+ %% Active is to dangerous and is suppressed
{true,true,true} =
do_delay_on_other_node("-kernel inet_default_connect_options "
"\"{active,false}\" "
@@ -1064,7 +1064,7 @@ iter_max_socks(Config) when is_list(Config) ->
%% L = rpc:call(Node,?MODULE,do_iter_max_socks,[N, initalize]),
L = iter_max_socks_run(Node,
fun() ->
- exit(do_iter_max_socks(Config, Tries, initalize))
+ exit(do_iter_max_socks(Config, Tries, initialize))
end),
?STOP_NODE(Node),
@@ -1082,21 +1082,21 @@ iter_max_socks_run(Node, F) ->
_Any ->
?P("Unexpected process start result: "
"~n ~p", [_Any]),
- {skip, "Failed starting iterator (slave) process"}
+ {skip, "Failed starting iterator (remote) process"}
catch
C:E:S ->
- ?P("Failed starting iterator (slave) process: "
+ ?P("Failed starting iterator (remote) process: "
"~n Class: ~p"
"~n Error: ~p"
"~n Stack: ~p", [C, E, S]),
- {skip, "Failed starting iterator (slave) process"}
+ {skip, "Failed starting iterator (remote) process"}
end.
do_iter_max_socks(_Config, 0, _) ->
?P("do_iter_max_socks(0,-) -> done"),
[];
-do_iter_max_socks(Config, N, initalize = First) ->
+do_iter_max_socks(Config, N, initialize = First) ->
?P("do_iter_max_socks(~w,~w) -> entry", [N, First]),
MS = max_socks(Config),
[MS|do_iter_max_socks(Config, N-1, MS)];
@@ -2100,7 +2100,7 @@ do_econnreset_after_async_send_passive(Config) ->
ok = ct:sleep(20),
?P("verify 1 (default)"),
- ?line ok = craasp_verify(Client1, default, SPayload),
+ ok = craasp_verify(Client1, default, SPayload),
?P("cleanup 1 (default)"),
craasp_cleanup(Client1, Sender1),
@@ -2120,7 +2120,7 @@ do_econnreset_after_async_send_passive(Config) ->
ok = ct:sleep(20),
?P("verify 2 (default)"),
- ?line ok = craasp_verify(Client2, true, SPayload),
+ ok = craasp_verify(Client2, true, SPayload),
?P("cleanup 2 (default)"),
craasp_cleanup(Client2, Sender2),
@@ -2388,11 +2388,11 @@ lz_ensure_non_empty_queue(Sock, Payload, OS, N) ->
?P("try verify client socket queue size"),
case erlang:port_info(Sock, queue_size) of
{queue_size, QSz} when QSz > 0 ->
- ?P("queue size verification *successfull* (~p) - port info: "
+ ?P("queue size verification *successful* (~p) - port info: "
"~n ~p", [QSz, erlang:port_info(Sock)]),
ok;
{queue_size, 0} when OS =:= win32 ->
- ?P("queue size verification *successfull* - port info: "
+ ?P("queue size verification *successful* - port info: "
"~n ~p", [erlang:port_info(Sock)]),
ok;
{queue_size, 0} ->
@@ -3349,7 +3349,7 @@ test_prio_accept_async(Config) ->
{Ref,{ok,[{priority,4},{tos,Tos1}]}} ->
ok;
{Ref,Error} ->
- ct:fail({missmatch,Error})
+ ct:fail({mismatch,Error})
after 5000 -> ct:fail({error,"helper process timeout"})
end,
?P("test_prio_accept_async -> await prio and tos for accepted socket"),
@@ -3357,7 +3357,7 @@ test_prio_accept_async(Config) ->
{Ref,{ok,[{priority,4},{tos,Tos1}]}} ->
ok;
{Ref,Error2} ->
- ct:fail({missmatch,Error2})
+ ct:fail({mismatch,Error2})
after 5000 -> ct:fail({error,"helper process timeout"})
end,
@@ -3406,7 +3406,7 @@ test_prio_udp() ->
so_priority(Config) when is_list(Config) ->
?TC_TRY(so_priority,
%% Normally we should have the condition funm here,
- %% but since we are (currently) not platform independant,
+ %% but since we are (currently) not platform independent,
%% we can't...check in the test case instead.
fun() -> do_so_priority(Config) end).
@@ -4748,7 +4748,7 @@ accept_system_limit(Config) when is_list(Config) ->
Cond = fun() ->
case ?IS_SOCKET_BACKEND(Config) of
true ->
- {skip, "Not complient with socket"};
+ {skip, "Not compliant with socket"};
false ->
ok
end
@@ -5052,7 +5052,7 @@ send_timeout(Config) when is_list(Config) ->
do_send_timeout(Config) ->
?P("begin"),
Dir = filename:dirname(code:which(?MODULE)),
- ?P("create (slave) node"),
+ ?P("create node"),
{ok, RNode} = ?START_NODE(?UNIQ_NODE_NAME, "-pa " ++ Dir),
{TslTimeout, SndTimeout, BinData, SndBuf} =
@@ -5095,15 +5095,15 @@ do_send_timeout(Config) ->
?P("await (timeout checker) process death"),
receive {'DOWN', Mon, process, Pid, _} -> ok end,
- %% Check that parallell writers do not hang forever
- ?P("check parallell writers wo autoclose"),
+ %% Check that parallel writers do not hang forever
+ ?P("check parallel writers wo autoclose"),
send_timeout_para(Config, BinData, SndBuf, TslTimeout, SndTimeout,
false, RNode),
- ?P("check parallell writers w autoclose"),
+ ?P("check parallel writers w autoclose"),
send_timeout_para(Config, BinData, SndBuf, TslTimeout, SndTimeout,
true, RNode),
- ?P("stop (slave) node"),
+ ?P("stop node"),
?STOP_NODE(RNode),
?P("done"),
@@ -5166,7 +5166,7 @@ send_timeout_para(Config, BinData, BufSz, TslTimeout, SndTimeout,
?F("UNKNOWN: ~p", [X2])
catch
C2:E2:S2 ->
- ?F("CATCHED: ~p, ~p, ~p", [C2, E2, S2])
+ ?F("CAUGHT: ~p, ~p, ~p", [C2, E2, S2])
end
end,
@@ -5460,12 +5460,12 @@ flush() ->
setup_closed_ao(Config) ->
Dir = filename:dirname(code:which(?MODULE)),
- ?P("[setup] start slave node"),
+ ?P("[setup] start node"),
R = case ?START_NODE(?UNIQ_NODE_NAME, "-pa " ++ Dir) of
- {ok, Slave} ->
- Slave;
+ {ok, Node} ->
+ Node;
{error, Reason} ->
- ?SKIPT(?F("failed starting slave node: ~p", [Reason]))
+ ?SKIPT(?F("failed starting node: ~p", [Reason]))
end,
Host = get_hostname(node()),
?P("[setup] create listen socket"),
@@ -5527,7 +5527,7 @@ setup_closed_ao(Config) ->
end
end,
Loop = fun(Match2,F3) -> Loop2(Loop2,Match2,F3,10) end,
- ?P("[setup] stop slave node"),
+ ?P("[setup] stop node"),
?STOP_NODE(R),
?P("[setup] done"),
{Loop,A}.
@@ -6615,7 +6615,7 @@ otp_12242(Config) when is_list(Config) ->
%% Even if we set sndbuf and recbuf to small sizes
%% Windows either happily accepts to send GBytes of
%% data in no time, so the second send below that
- %% is supposed to time out just succedes, or the
+ %% is supposed to time out just succeeds, or the
%% first send that is supposed to fill the inet_drv
%% I/O queue and start waiting for when more data
%% can be sent instead sends all data but suffers
@@ -6624,7 +6624,7 @@ otp_12242(Config) when is_list(Config) ->
_ ->
case ?IS_SOCKET_BACKEND(Config) of
true ->
- {skip, "Not complient with socket"};
+ {skip, "Not compliant with socket"};
false ->
ok
end
@@ -6797,7 +6797,7 @@ otp_12242_closer(C) ->
ok = Result
catch
Class:Reason:Stacktrace ->
- ?P("[closer] catched gen_tcp:close(C):"
+ ?P("[closer] caught gen_tcp:close(C):"
"~n Error Class: ~p"
"~n Error: ~p"
"~n Stack trace: ~p",
@@ -6870,7 +6870,7 @@ delay_send_error2(Sock) ->
delay_send_error2(Sock, 0) ->
gen_tcp:close(Sock),
- ct:fail("Unxpected send success");
+ ct:fail("Unexpected send success");
delay_send_error2(Sock, N) ->
%% Sleep in order for delay_send to have time to trigger
%% This used to result in a double free
diff --git a/lib/kernel/test/gen_udp_SUITE.erl b/lib/kernel/test/gen_udp_SUITE.erl
index bc2a7cb25b..de14325dd3 100644
--- a/lib/kernel/test/gen_udp_SUITE.erl
+++ b/lib/kernel/test/gen_udp_SUITE.erl
@@ -69,7 +69,7 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- %% This is a temporary messure to ensure that we can
+ %% This is a temporary measure to ensure that we can
%% test the socket backend without effecting *all*
%% applications on *all* machines.
%% This flag is set only for *one* host.
@@ -630,7 +630,7 @@ do_bad_address(Config) when is_list(Config) ->
%%-------------------------------------------------------------
%% OTP-6249 UDP option for number of packet reads
%%
-%% Starts a slave node that on command sends a bunch of messages
+%% Starts a node that on command sends a bunch of messages
%% to our UDP port. The receiving process just receives and
%% ignores the incoming messages.
%% A tracing process traces the receiving port for
@@ -645,39 +645,28 @@ read_packets(Config) when is_list(Config) ->
true ->
%% We have not (yet) implemented support for
%% this option. We accept it but do not use it.
- {skip, "Not complient with socket"};
+ {skip, "Not compliant with socket"};
false ->
ok
end
end,
- Pre = fun() ->
- ?P("~w:pre -> try create node", [?FUNCTION_NAME]),
- {ok, Node} = start_node(gen_udp_SUITE_read_packets),
- ?P("~w:pre -> node created", [?FUNCTION_NAME]),
- Node
- end,
- TC = fun(Node) ->
+ TC = fun() ->
?P("~w:tc -> begin", [?FUNCTION_NAME]),
- Res = do_read_packets(Config, Node),
+ Res = do_read_packets(Config),
?P("~w:tc -> done", [?FUNCTION_NAME]),
Res
end,
- Post = fun(Node) ->
- ?P("~w:post -> try stop node ~p", [?FUNCTION_NAME, Node]),
- stop_node(Node),
- ?P("~w:post -> done", [?FUNCTION_NAME]),
- ok
- end,
- ?TC_TRY(?FUNCTION_NAME, Cond, Pre, TC, Post).
+ ?TC_TRY(?FUNCTION_NAME, Cond, TC).
-do_read_packets(Config, Node) when is_list(Config) ->
+do_read_packets(Config) when is_list(Config) ->
N1 = 5,
N2 = 1,
Msgs = 30000,
?P("open socket (with read-packets: ~p)", [N1]),
{ok, R} = ?OPEN(Config, 0, [{read_packets,N1}]),
{ok, RP} = inet:port(R),
-
+ ?P("create slave node"),
+ {ok,Peer,Node} = ?CT_PEER(),
%%
?P("perform read-packets test"),
{V1, Trace1} = read_packets_test(Config, R, RP, Msgs, Node),
@@ -691,7 +680,8 @@ do_read_packets(Config, Node) when is_list(Config) ->
?P("verify read-packets (to ~w)", [N2]),
{ok, [{read_packets,N2}]} = inet:getopts(R, [read_packets]),
%%
-
+ ?P("stop slave node"),
+ peer:stop(Peer),
?P("dump trace 1"),
dump_terms(Config, "trace1.terms", Trace1),
?P("dump trace 2"),
@@ -1660,7 +1650,7 @@ recv_close(Config) when is_list(Config) ->
receive
{'DOWN', MRef, process, Pid, PreReason} ->
%% Make sure id does not die for some other reason...
- ?line ct:fail("Unexpected pre close from reader (~p): ~p",
+ ct:fail("Unexpected pre close from reader (~p): ~p",
[Pid, PreReason])
after 5000 -> % Just in case...
ok
@@ -1674,13 +1664,13 @@ recv_close(Config) when is_list(Config) ->
ok;
{'DOWN', MRef, process, Pid, PostReason} ->
?P("unexpected reader termination: ~p", [PostReason]),
- ?line ct:fail("Unexpected post close from reader (~p): ~p",
+ ct:fail("Unexpected post close from reader (~p): ~p",
[Pid, PostReason])
after 5000 ->
?P("unexpected reader termination timeout"),
demonitor(MRef, [flush]),
exit(Pid, kill),
- ?line ct:fail("Reader (~p) termination timeout", [Pid])
+ ct:fail("Reader (~p) termination timeout", [Pid])
end,
?P("done"),
ok.
@@ -1803,7 +1793,7 @@ do_implicit_inet6(Config) ->
implicit_inet6(Config, Host, Addr) ->
Active = {active,false},
Loopback = {0,0,0,0,0,0,0,1},
- ?P("try 1 with explit inet6 on loopback"),
+ ?P("try 1 with explicit inet6 on loopback"),
S1 = case ?OPEN(Config, 0, [inet6, Active, {ip, Loopback}]) of
{ok, Sock1} ->
Sock1;
@@ -2897,14 +2887,5 @@ pi(Item) ->
%% Utils
%%
-start_node(Name) ->
- ?START_NODE(Name, []).
-
-stop_node(Node) ->
- ?STOP_NODE(Node).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
open_failed_str(Reason) ->
?F("Open failed: ~w", [Reason]).
diff --git a/lib/kernel/test/global_SUITE.erl b/lib/kernel/test/global_SUITE.erl
index 7b31b7462a..72c52a83c1 100644
--- a/lib/kernel/test/global_SUITE.erl
+++ b/lib/kernel/test/global_SUITE.erl
@@ -45,6 +45,7 @@
mass_death/1,
garbage_messages/1,
ring_line/1,
+ flaw1/1,
lost_connection/1,
lost_connection2/1
]).
@@ -134,7 +135,7 @@ all() ->
simple_resolve2, simple_resolve3, leftover_name,
re_register_name, name_exit, external_nodes, many_nodes,
sync_0, global_groups_change, register_1, both_known_1,
- lost_unregister, mass_death, garbage_messages,
+ lost_unregister, mass_death, garbage_messages, flaw1,
lost_connection, lost_connection2
]
end.
@@ -613,8 +614,9 @@ write_high_level_trace(Nodes, Config) ->
Node <- Nodes],
Dir = proplists:get_value(priv_dir, Config),
DataFile = filename:join([Dir, lists:concat(["global_", ?testcase])]),
- ?P("High-level trace on:"
- "~n ~p", [DataFile]),
+ io:format("\n\nAnalyze high level trace like this:\n"),
+ io:format("global_trace:dd(~p, [{show_state, 0, 10}]). % 10 seconds\n",
+ [DataFile]),
file:write_file(DataFile, term_to_binary({high_level_trace, When, Data})).
lock_global2(Id, Parent) ->
@@ -885,7 +887,7 @@ locks(Config) when is_list(Config) ->
Pid = start_proc(),
Pid2 = rpc:call(Cp1, ?MODULE, start_proc, []),
- %% set a lock, and make sure noone else can set the same lock
+ %% set a lock, and make sure no one else can set the same lock
true = global:set_lock({test_lock, self()}, ?NODES, 1),
false = req(Pid, {set_lock, test_lock, self()}),
false = req(Pid2, {set_lock, test_lock, self()}),
@@ -1662,7 +1664,7 @@ stress_partition(Config) when is_list(Config) ->
ok.
-%% Use this one to test alot of connection tests
+%% Use this one to test a lot of connection tests
%% erl -sname ts -ring_line 10000 -s test_server run_test global_SUITE
ring_line(Config) when is_list(Config) ->
@@ -2679,7 +2681,7 @@ mon_by_servers(Proc) ->
-define(REGNAME, contact_a_2).
-%% OTP-5563. Bug: nodedown while synching.
+%% OTP-5563. Bug: nodedown while syncing.
leftover_name(Config) when is_list(Config) ->
Timeout = 30,
ct:timetrap({seconds,Timeout}),
@@ -3045,7 +3047,7 @@ many_nodes(Config) when is_list(Config) ->
OrigNames = global:registered_names(),
{Rels, N_cps} =
- case test_server:os_type() of
+ case os:type() of
{unix, Osname} when Osname =:= linux;
Osname =:= openbsd;
Osname =:= darwin ->
@@ -3160,7 +3162,7 @@ sync_0(Config) when is_list(Config) ->
init_condition(Config),
N_cps =
- case test_server:os_type() of
+ case os:type() of
{unix, Osname} when Osname =:= linux;
Osname =:= openbsd;
Osname =:= darwin ->
@@ -4285,6 +4287,105 @@ garbage_messages(Config) when is_list(Config) ->
init_condition(Config),
ok.
+%% This is scenario outlined in
+%% https://erlang.org/pipermail/erlang-questions/2020-October/100034.html.
+%% It illustrates that the algorithm of Global is flawed.
+%%
+%% This has been worked around by global actively disconnecting nodes
+%% to prevent overlapping partitions (OTP-17843).
+flaw1(Config) ->
+ case prevent_overlapping_partitions() of
+ true ->
+ flaw1_test(Config);
+ false ->
+ {skipped, "Prevent overlapping partitions disabled"}
+ end.
+
+flaw1_test(Config) ->
+ Timeout = 360,
+ ct:timetrap({seconds,Timeout}),
+ init_high_level_trace(Timeout),
+ init_condition(Config),
+ OrigNames = global:registered_names(),
+
+ PartCtrlr = start_partition_controller(Config),
+
+ [A, B, C, D] = OtherNodes = start_nodes([a, b, c, d], peer, Config),
+ Nodes = lists:sort([node() | OtherNodes]),
+ wait_for_ready_net(Config),
+
+ F1 =
+ fun(S0) ->
+ ct:sleep(100),
+ Str = "************",
+ S = Str ++ " " ++ lists:flatten(S0) ++ " " ++ Str,
+ io:format("~s\n", [S]),
+ erpc:call(
+ PartCtrlr,
+ fun () ->
+ [begin
+ RNs = erpc:call(N, global, registered_names, []),
+ W = erpc:call(N, global, whereis_name, [x]),
+ io:format(" === ~w ===\n", [N]),
+ io:format(" registered names: ~p", [RNs]),
+ io:format(" where is x: ~p", [W])
+ end || N <- OtherNodes]
+ end)
+ end,
+ F1("start"),
+
+ disconnect_nodes(PartCtrlr, A, C),
+ F1("after disconnecting c from a"),
+
+ Me = self(),
+ IdleFun = fun () ->
+ Mon = erlang:monitor(process, Me),
+ receive
+ {'DOWN', Mon, process, Me, _} ->
+ exit(normal)
+ end
+ end,
+ Pid = spawn(IdleFun),
+ yes = rpc:call(A, global, register_name, [x, Pid]),
+ F1(io_lib:format("after registering x as ~p on a", [Pid])),
+
+ disconnect_nodes(PartCtrlr, B, D),
+ F1("after disconnecting d from b"),
+
+ Pid2 = spawn(IdleFun),
+ yes = rpc:call(B, global, re_register_name, [x, Pid2]),
+ F1(io_lib:format("after re_register_name x as ~p on b", [Pid2])),
+
+ pong = rpc:call(A, net_adm, ping, [C]),
+ F1("finished after ping c from a"),
+
+ pong = rpc:call(B, net_adm, ping, [D]),
+ F1("finished after ping d from b"),
+
+ timer:sleep(1000),
+
+ check_everywhere(Nodes, x, Config),
+ F1("After check everywhere"),
+
+ assert_pid(global:whereis_name(x)),
+
+ lists:foreach(fun(N) ->
+ rpc:call(N, ?MODULE, stop_tracer, [])
+ end, Nodes),
+ _ = rpc:call(A, global, unregister_name, [x]),
+
+ F1("after unregistering x on node a"),
+
+ %% _ = rpc:call(B, global, unregister_name, [y]),
+ %% F1("after unregistering y on node b"),
+
+ ct:sleep(100),
+ OrigNames = global:registered_names(),
+ write_high_level_trace(Config),
+ stop_nodes(OtherNodes),
+ init_condition(Config),
+ ok.
+
wait_for_ready_net(Config) ->
{Pid, MRef} = spawn_monitor(fun() ->
wait_for_ready_net(?NODES, Config)
@@ -4304,7 +4405,7 @@ wait_for_ready_net_loop(Pid, MRef) ->
"~n Waiter: ~p"
"~n Current Location: ~p"
"~n Dictionary: ~p"
- "~n Mesages: ~p",
+ "~n Messages: ~p",
[ParentPid, Pid,
pi(Pid, current_location),
pi(Pid, dictionary),
@@ -4497,10 +4598,10 @@ stop_partition_controller(PartCtrlr) ->
prevent_overlapping_partitions() ->
case application:get_env(kernel, prevent_overlapping_partitions) of
- {ok, true} ->
- true;
+ {ok, false} ->
+ false;
_ ->
- false
+ true
end.
cast_line([]) ->
diff --git a/lib/kernel/test/global_SUITE_data/global_trace.erl b/lib/kernel/test/global_SUITE_data/global_trace.erl
index b4af4ed76e..923bf53454 100644
--- a/lib/kernel/test/global_SUITE_data/global_trace.erl
+++ b/lib/kernel/test/global_SUITE_data/global_trace.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -73,42 +73,17 @@ logdir() ->
%%% For one thing, the trace from all nodes are written onto the file
%%% as one single term. One term per node would be better. &c.
--compile(export_all).
+-compile([export_all, nowarn_export_all]).
-record(state, {connect_all, known = [], synced = [],
resolvers = [], syncers = [], node_name = node(),
- the_locker, the_deleter, the_registrar, trace = [],
+ the_locker, the_registrar, trace = [],
global_lock_down
}).
%% Compatible with different versions.
state(#state{}=S) ->
- S;
-state({state, ConnectAll, Known, Synced, LockersResolvers, Syncers,
- NodeName, TheLocker, TheDeleter}) ->
- %% r10b: Lockers, r10b_patched, r11b: Resolvers
- #state{connect_all = ConnectAll, known = Known, synced = Synced,
- resolvers = LockersResolvers, syncers = Syncers,
- node_name = NodeName, the_locker = TheLocker,
- the_deleter = TheDeleter, the_registrar = undefined, trace = []};
-state({state, ConnectAll, Known, Synced, Resolvers, Syncers,
- NodeName, TheLocker, TheDeleter, Trace}) ->
- %% r11b, some time before r11b-3
- #state{connect_all = ConnectAll, known = Known, synced = Synced,
- resolvers = Resolvers, syncers = Syncers,
- node_name = NodeName, the_locker = TheLocker,
- the_deleter = TheDeleter, the_registrar = undefined,
- trace = Trace};
-state({state, ConnectAll, Known, Synced, Resolvers, Syncers,
- NodeName, TheLocker, TheDeleter, TheRegistrar, Trace}) ->
- %% r11b, some time after r11b-3
- #state{connect_all = ConnectAll, known = Known, synced = Synced,
- resolvers = Resolvers, syncers = Syncers,
- node_name = NodeName, the_locker = TheLocker,
- the_deleter = TheDeleter, the_registrar = TheRegistrar,
- trace = Trace, global_lock_down = false};
-state(Else) ->
- Else.
+ S.
%%% Trace tuples look like {Node, Now, Message, Nodes, Extra}.
%%% Nodes is the list as returned by nodes().
@@ -123,12 +98,11 @@ state(Else) ->
%%% {ops,Ops}]
%%% NewKnown = Known ++ AddedNodes
%%% AddedNodes = NewNodes -- Known
-%%% NewNodes är här den man förhandlat med plus de noder den känner till.
+%%% NewNodes is the other node and the nodes known to that node.
%%% {added, AddedNodes}, Extra = [{ops,Ops}]
%%% NewKnown = Known ++ AddedNodes
-%%% Den (passiva) noden får Nodes som är NewNodes
-%%% hos den förhandlande. Sedan: AddedNodes = (Nodes -- Known) -- [node()].
-%%% Det är som hos förhandlaren.
+%%% The (passive) node gets Nodes which is NewNodes on the other node.
+%%% Then: AddedNodes = (Nodes -- Known) -- [node()].
%%% {nodes_changed, {New,Old}}
%%% Every now and then the list [node() | nodes()] is checked for updates.
%%% New are the nodes that global does not know of (yet).
@@ -187,7 +161,7 @@ t(File) ->
%% {show_state, From, To}
%% From = To = integer() | {integer(), integer()}
%% Examples: {7, 8} (show states between seconds 7.0 and 8.0);
-%% {{1,431234},{2,432}} (between 1.431234 and 2.000432)
+%% {{1,431234},{2,432}} (between 1.431234 and 2.432)
%% The state of a node includes locks, names, nodes, known, ...
%% Default is {{0,0}, {0,0}}, that is, do not show state.
%% show_state
@@ -226,7 +200,7 @@ t(File, Options) ->
{high_level_trace, ET, D3} ->
{D3, ET};
_ ->
- {D1, now()}
+ {D1, erlang:timestamp()}
end,
D = adjust_nodes(D2),
{NodeNodeTrace, _NodeTrace, Trace, Base} = get_trace(D, End),
@@ -320,13 +294,12 @@ adjust_times(Ts, Base) ->
[setelement(2, adj_tag(T, Base), adjust_time(element(2, T), Base)) ||
T <- Ts].
-adj_tag({Node, Time, {M, Node2}, Nodes, Extra}=T, Base) ->
+adj_tag({Node, Time, {M, Node2}, Nodes, Extra}=T, _Base) ->
if
M =:= new_resolver;
M =:= kill_resolver;
M =:= exit_resolver ->
- {Node, Time, {M, Node2}, Nodes,
- [adjust_time(hd(Extra), Base) | tl(Extra)]};
+ {Node, Time, {M, Node2}, Nodes, Extra};
true ->
T
end.
@@ -356,10 +329,16 @@ adjust_node(Node) ->
z_2;
"z_" ++ _ ->
z;
- "b_" ++ _ ->
- b;
"c_external_nodes" ++ _ ->
c_external_nodes;
+ "a_" ++ _ ->
+ a;
+ "b_" ++ _ ->
+ b;
+ "c_" ++ _ ->
+ c;
+ "d_" ++ _ ->
+ d;
_ ->
Node
end.
@@ -381,7 +360,7 @@ eval([T | Ts], Time0, S0, Fun) ->
end,
case time_diff(Time1, Time0) > 0 of
true ->
- display_nodes("PAUS", Time1, S0#w.nodes, T);
+ display_nodes("PAUSE", Time1, S0#w.nodes, T);
false ->
ok
end,
@@ -800,9 +779,9 @@ ms(syncers) ->
no_info(D) ->
[{Node,no_info} || {Node, no_info} <- D].
-resolvers(D, Base, End) ->
+resolvers(D, _Base, End) ->
[{Node,
- [{N,adjust_time(T, Base),P} || {N, T, P} <- Rs, T < End]} ||
+ [{N,T,P} || {N, T, P} <- Rs, T < End]} ||
{Node, {info,State}} <- D,
is_record(State, state),
[] =/= (Rs = (state(State))#state.resolvers)].
@@ -834,16 +813,21 @@ negotiations(Trace) ->
{Node,T,Added,[{new_nodes,[Other|_]=NewNodes},_Abcast,_Ops]} <- Ns],
Act ++ Pass.
-show_spurious(NodeTrace, Spurious) ->
- Pairs = [{Node,ActionNode} || {{Node,ActionNode}, _Time} <- Spurious],
- S = sofs:restriction(sofs:relation(NodeTrace), sofs:set(Pairs)),
+show_spurious(NodeTraceL, SpuriousL) ->
+ TraceDomL = [{Node,ActionNode} ||
+ {{Node,ActionNode}, _Ts} <- NodeTraceL],
+ SpuriousDomL = [{Node,ActionNode} ||
+ {{Node,ActionNode}, _Times} <- SpuriousL],
+ S = sofs:restriction(sofs:relation(NodeTraceL), sofs:set(SpuriousDomL)),
+ %% Some spurious lost:
+ Spurious = sofs:restriction(sofs:relation(SpuriousL), sofs:set(TraceDomL)),
[foo ||
{{{Node,ANode},Times},
- {{Node,ANode},Ts}} <- lists:zip(family(Spurious),
+ {{Node,ANode},Ts}} <- lists:zip(family(sofs:to_external(Spurious)),
sofs:to_external(S)),
- show_spurious(Node, ANode, Times, lists:keysort(2, Ts))].
+ show_spurious2(Node, ANode, Times, lists:keysort(2, Ts))].
-show_spurious(Node, ActionNode, Times, Ts) ->
+show_spurious2(Node, ActionNode, Times, Ts) ->
io:format("** Actions for ~p on node ~p **~n", [ActionNode, Node]),
lists:map(fun(T) -> spurious(Node, T, Times) end, Ts),
io:format("-- End of actions for ~p on node ~p --~n", [ActionNode, Node]),
diff --git a/lib/kernel/test/global_group_SUITE.erl b/lib/kernel/test/global_group_SUITE.erl
index 594ee6b537..ad2ba59e2d 100644
--- a/lib/kernel/test/global_group_SUITE.erl
+++ b/lib/kernel/test/global_group_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -81,7 +81,7 @@ end_per_suite(_Config) ->
-define(TESTCASE, testcase_name).
-define(testcase, proplists:get_value(?TESTCASE, Config)).
-init_per_testcase(Case, Config) ->
+init_per_testcase(_Case, Config) ->
Config.
end_per_testcase(_Func, _Config) ->
@@ -99,25 +99,23 @@ start_gg_proc(Config) when is_list(Config) ->
Dir = proplists:get_value(priv_dir, Config),
File = filename:join(Dir, "global_group.config"),
{ok, Fd}=file:open(File, [write]),
- [Ncp1,Ncp2,Ncp3] = node_names([cp1, cp2, cp3], Config),
+ [Ncp1,Ncp2,Ncp3] = [?CT_PEER_NAME() || _ <- [cp1, cp2, cp3]],
config(Fd, Ncp1, Ncp2, Ncp3, "cpx", "cpy", "cpz", "cpq"),
- Cp1nn = node_at(Ncp1),
- Cp2nn = node_at(Ncp2),
- Cp3nn = node_at(Ncp3),
+ Args = ["-config", filename:join(Dir, "global_group")],
- {ok, Cp1} = start_node(Ncp1, Config),
- {ok, Cp2} = start_node(Ncp2, Config),
- {ok, Cp3} = start_node(Ncp3, Config),
+ {ok, Peer1, Cp1} = ?CT_PEER(#{name => Ncp1, args => Args}),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{name => Ncp2, args => Args}),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{name => Ncp3, args => Args}),
- [] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]),
- [] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]),
- [] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]),
+ [] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1}]),
+ [] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2}]),
+ [] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3}]),
%% stop the nodes, and make sure names are released.
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
?UNTIL(undefined =:= global:whereis_name(test)),
ok.
@@ -132,36 +130,29 @@ no_gg_proc(Config) when is_list(Config) ->
{ok, Fd} = file:open(File, [write]),
config_no(Fd),
- NN = node_name(atom_to_list(node())),
- Cp1nn = list_to_atom("cp1@" ++ NN),
- Cp2nn = list_to_atom("cp2@" ++ NN),
- Cp3nn = list_to_atom("cp3@" ++ NN),
- Cpxnn = list_to_atom("cpx@" ++ NN),
- Cpynn = list_to_atom("cpy@" ++ NN),
- Cpznn = list_to_atom("cpz@" ++ NN),
-
- {ok, Cp1} = start_node_no(cp1, Config),
- {ok, Cp2} = start_node_no(cp2, Config),
- {ok, Cp3} = start_node_no(cp3, Config),
- {ok, Cpx} = start_node_no(cpx, Config),
- {ok, Cpy} = start_node_no(cpy, Config),
- {ok, Cpz} = start_node_no(cpz, Config),
+ Args = ["-config", filename:join(Dir, "no_global_group")],
+ {ok, Peer1, Cp1} = ?CT_PEER(#{args => Args}),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{args => Args}),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{args => Args}),
+ {ok, Peerx, Cpx} = ?CT_PEER(#{args => Args}),
+ {ok, Peery, Cpy} = ?CT_PEER(#{args => Args}),
+ {ok, Peerz, Cpz} = ?CT_PEER(#{args => Args}),
%% let the nodes know of each other
- pong = rpc:call(Cp1, net_adm, ping, [Cp2nn]),
- pong = rpc:call(Cp2, net_adm, ping, [Cp3nn]),
- pong = rpc:call(Cp3, net_adm, ping, [Cpxnn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cpynn]),
- pong = rpc:call(Cpy, net_adm, ping, [Cpznn]),
+ pong = rpc:call(Cp1, net_adm, ping, [Cp2]),
+ pong = rpc:call(Cp2, net_adm, ping, [Cp3]),
+ pong = rpc:call(Cp3, net_adm, ping, [Cpx]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cpy]),
+ pong = rpc:call(Cpy, net_adm, ping, [Cpz]),
wait_for_ready_net(),
- [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]),
- [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]),
- [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]),
- [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}]),
- [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}]),
- [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}]),
+ [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1}]),
+ [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2}]),
+ [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3}]),
+ [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpx}]),
+ [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpy}]),
+ [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpz}]),
%% start a proc and register it
@@ -171,28 +162,28 @@ no_gg_proc(Config) when is_list(Config) ->
RegNames =
lists:sort(
- rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}])),
+ rpc:call(Cp1, global_group, registered_names, [{node, Cp1}])),
RegNames =
lists:sort(
- rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}])),
+ rpc:call(Cp2, global_group, registered_names, [{node, Cp2}])),
RegNames =
lists:sort(
- rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}])),
+ rpc:call(Cp3, global_group, registered_names, [{node, Cp3}])),
RegNames =
lists:sort(
- rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}])),
+ rpc:call(Cp1, global_group, registered_names, [{node, Cpx}])),
RegNames =
lists:sort(
- rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}])),
+ rpc:call(Cp2, global_group, registered_names, [{node, Cpy}])),
RegNames =
lists:sort(
- rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}])),
+ rpc:call(Cp3, global_group, registered_names, [{node, Cpz}])),
undefined = rpc:call(Cp3, global_group, global_groups, []),
- Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn,
- Cpxnn, Cpynn, Cpznn],
+ Own_nodes_should = [node(), Cp1, Cp2, Cp3,
+ Cpx, Cpy, Cpz],
Own_nodes = rpc:call(Cp3, global_group, own_nodes, []),
[] = (Own_nodes -- Own_nodes_should),
[] = (Own_nodes_should -- Own_nodes),
@@ -224,67 +215,67 @@ no_gg_proc(Config) when is_list(Config) ->
%%------------------------------------
%% Test monitor nodes
%%------------------------------------
- Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]),
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]),
+ Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2}, test2, monitor]),
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpx}, test, monitor]),
%% Kill node Cp1
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cp1}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodedown, Cp1}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cp1}]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodedown, Cp1}]),
ct:sleep(100),
- stop_node(Cp1),
+ peer:stop(Peer1),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Kill node Cpz
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cpz}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodedown, Cpz}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cpz}]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodedown, Cpz}]),
ct:sleep(100),
- stop_node(Cpz),
+ peer:stop(Peerz),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Restart node Cp1
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cp1}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodeup, Cp1}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cp1}]),
- {ok, Cp1} = start_node_no(cp1, Config),
- pong = rpc:call(Cp2, net_adm, ping, [Cp1nn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cp1nn]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodeup, Cp1}]),
+ {ok, Peer11, Cp1} = ?CT_PEER(#{name => Cp1, args => Args}),
+ pong = rpc:call(Cp2, net_adm, ping, [Cp1]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cp1]),
wait_for_ready_net(),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Restart node Cpz
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cpz}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodeup, Cpz}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cpz}]),
- {ok, Cpz} = start_node_no(cpz, Config),
- pong = rpc:call(Cp2, net_adm, ping, [Cpznn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cpznn]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodeup, Cpz}]),
+ {ok, Peer1z, Cpz} = ?CT_PEER(#{name => Cpz, args => Args}),
+ pong = rpc:call(Cp2, net_adm, ping, [Cpz]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cpz]),
wait_for_ready_net(),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% stop the nodes, and make sure names are released.
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
- stop_node(Cpx),
- stop_node(Cpy),
- stop_node(Cpz),
+ peer:stop(Peer11),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
+ peer:stop(Peerx),
+ peer:stop(Peery),
+ peer:stop(Peer1z),
?UNTIL(undefined =:= global:whereis_name(test)),
ok.
@@ -299,39 +290,33 @@ no_gg_proc_sync(Config) when is_list(Config) ->
File = filename:join(Dir, "no_global_group_sync.config"),
{ok, Fd} = file:open(File, [write]),
- [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz] =
- node_names([cp1,cp2,cp3,cpx,cpy,cpz], Config),
+ [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz] = [?CT_PEER_NAME() ||
+ _ <- [cp1,cp2,cp3,cpx,cpy,cpz]],
config_sync(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz),
- Cp1nn = node_at(Ncp1),
- Cp2nn = node_at(Ncp2),
- Cp3nn = node_at(Ncp3),
- Cpxnn = node_at(Ncpx),
- Cpynn = node_at(Ncpy),
- Cpznn = node_at(Ncpz),
-
- {ok, Cp1} = start_node_no2(Ncp1, Config),
- {ok, Cp2} = start_node_no2(Ncp2, Config),
- {ok, Cp3} = start_node_no2(Ncp3, Config),
- {ok, Cpx} = start_node_no2(Ncpx, Config),
- {ok, Cpy} = start_node_no2(Ncpy, Config),
- {ok, Cpz} = start_node_no2(Ncpz, Config),
+ Args = ["-config", filename:join(Dir, "no_global_group_sync")],
+ {ok, Peer1, Cp1} = ?CT_PEER(#{name => Ncp1, args => Args}),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{name => Ncp2, args => Args}),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{name => Ncp3, args => Args}),
+ {ok, Peerx, Cpx} = ?CT_PEER(#{name => Ncpx, args => Args}),
+ {ok, Peery, Cpy} = ?CT_PEER(#{name => Ncpy, args => Args}),
+ {ok, Peerz, Cpz} = ?CT_PEER(#{name => Ncpz, args => Args}),
%% let the nodes know of each other
- pong = rpc:call(Cp1, net_adm, ping, [Cp2nn]),
- pong = rpc:call(Cp2, net_adm, ping, [Cp3nn]),
- pong = rpc:call(Cp3, net_adm, ping, [Cpxnn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cpynn]),
- pong = rpc:call(Cpy, net_adm, ping, [Cpznn]),
+ pong = rpc:call(Cp1, net_adm, ping, [Cp2]),
+ pong = rpc:call(Cp2, net_adm, ping, [Cp3]),
+ pong = rpc:call(Cp3, net_adm, ping, [Cpx]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cpy]),
+ pong = rpc:call(Cpy, net_adm, ping, [Cpz]),
wait_for_ready_net(),
- [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]),
- [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]),
- [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]),
- [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}]),
- [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}]),
- [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}]),
+ [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1}]),
+ [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2}]),
+ [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3}]),
+ [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpx}]),
+ [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpy}]),
+ [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpz}]),
%% start a proc and register it
@@ -341,28 +326,28 @@ no_gg_proc_sync(Config) when is_list(Config) ->
RegNames =
lists:sort(
- rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}])),
+ rpc:call(Cp1, global_group, registered_names, [{node, Cp1}])),
RegNames =
lists:sort(
- rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}])),
+ rpc:call(Cp2, global_group, registered_names, [{node, Cp2}])),
RegNames =
lists:sort(
- rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}])),
+ rpc:call(Cp3, global_group, registered_names, [{node, Cp3}])),
RegNames =
lists:sort(
- rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}])),
+ rpc:call(Cp1, global_group, registered_names, [{node, Cpx}])),
RegNames =
lists:sort(
- rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}])),
+ rpc:call(Cp2, global_group, registered_names, [{node, Cpy}])),
RegNames =
lists:sort(
- rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}])),
+ rpc:call(Cp3, global_group, registered_names, [{node, Cpz}])),
undefined = rpc:call(Cp3, global_group, global_groups, []),
- Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn,
- Cpxnn, Cpynn, Cpznn],
+ Own_nodes_should = [node(), Cp1, Cp2, Cp3,
+ Cpx, Cpy, Cpz],
Own_nodes = rpc:call(Cp3, global_group, own_nodes, []),
[] = (Own_nodes -- Own_nodes_should),
[] = (Own_nodes_should -- Own_nodes),
@@ -394,67 +379,67 @@ no_gg_proc_sync(Config) when is_list(Config) ->
%%------------------------------------
%% Test monitor nodes
%%------------------------------------
- Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]),
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]),
+ Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2}, test2, monitor]),
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpx}, test, monitor]),
%% Kill node Cp1
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cp1}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodedown, Cp1}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cp1}]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodedown, Cp1}]),
ct:sleep(100),
- stop_node(Cp1),
+ peer:stop(Peer1),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Kill node Cpz
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cpz}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodedown, Cpz}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cpz}]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodedown, Cpz}]),
ct:sleep(100),
- stop_node(Cpz),
+ peer:stop(Peerz),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Restart node Cp1
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cp1}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodeup, Cp1}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cp1}]),
- {ok, Cp1} = start_node_no2(Ncp1, Config),
- pong = rpc:call(Cp2, net_adm, ping, [Cp1nn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cp1nn]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodeup, Cp1}]),
+ {ok, Peer11, Cp1} = ?CT_PEER(#{name => Cp1, args => Args}),
+ pong = rpc:call(Cp2, net_adm, ping, [Cp1]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cp1]),
wait_for_ready_net(),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Restart node Cpz
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cpz}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodeup, Cpz}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cpz}]),
- {ok, Cpz} = start_node_no2(Ncpz, Config),
- pong = rpc:call(Cp2, net_adm, ping, [Cpznn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cpznn]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodeup, Cpz}]),
+ {ok, Peerz1, Cpz} = ?CT_PEER(#{name => Cpz, args => Args}),
+ pong = rpc:call(Cp2, net_adm, ping, [Cpz]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cpz]),
wait_for_ready_net(),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% stop the nodes, and make sure names are released.
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
- stop_node(Cpx),
- stop_node(Cpy),
- stop_node(Cpz),
+ peer:stop(Peer11),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
+ peer:stop(Peerx),
+ peer:stop(Peery),
+ peer:stop(Peerz1),
?UNTIL(undefined =:= global:whereis_name(test)),
ok.
@@ -468,39 +453,33 @@ compatible(Config) when is_list(Config) ->
File = filename:join(Dir, "global_group_comp.config"),
{ok, Fd} = file:open(File, [write]),
- [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz] =
- node_names([cp1,cp2,cp3,cpx,cpy,cpz], Config),
- config_comp(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz),
-
- Cp1nn = node_at(Ncp1),
- Cp2nn = node_at(Ncp2),
- Cp3nn = node_at(Ncp3),
- Cpxnn = node_at(Ncpx),
- Cpynn = node_at(Ncpy),
- Cpznn = node_at(Ncpz),
+ [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz] = [?CT_PEER_NAME() ||
+ _ <- [cp1,cp2,cp3,cpx,cpy,cpz]],
+ config_sync(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz),
- {ok, Cp1} = start_node_comp(Ncp1, Config),
- {ok, Cp2} = start_node_comp(Ncp2, Config),
- {ok, Cp3} = start_node_comp(Ncp3, Config),
- {ok, Cpx} = start_node_comp(Ncpx, Config),
- {ok, Cpy} = start_node_comp(Ncpy, Config),
- {ok, Cpz} = start_node_comp(Ncpz, Config),
+ Args = ["-config", filename:join(Dir, "global_group_comp")],
+ {ok, Peer1, Cp1} = ?CT_PEER(#{args => Args}),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{args => Args}),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{args => Args}),
+ {ok, Peerx, Cpx} = ?CT_PEER(#{args => Args}),
+ {ok, Peery, Cpy} = ?CT_PEER(#{args => Args}),
+ {ok, Peerz, Cpz} = ?CT_PEER(#{args => Args}),
%% let the nodes know of each other
- pong = rpc:call(Cp1, net_adm, ping, [Cp2nn]),
- pong = rpc:call(Cp2, net_adm, ping, [Cp3nn]),
- pong = rpc:call(Cp3, net_adm, ping, [Cpxnn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cpynn]),
- pong = rpc:call(Cpy, net_adm, ping, [Cpznn]),
+ pong = rpc:call(Cp1, net_adm, ping, [Cp2]),
+ pong = rpc:call(Cp2, net_adm, ping, [Cp3]),
+ pong = rpc:call(Cp3, net_adm, ping, [Cpx]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cpy]),
+ pong = rpc:call(Cpy, net_adm, ping, [Cpz]),
wait_for_ready_net(),
- [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]),
- [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}]),
- [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}]),
- [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}]),
- [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}]),
- [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}]),
+ [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cp1}]),
+ [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cp2}]),
+ [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cp3}]),
+ [test_server] = rpc:call(Cp1, global_group, registered_names, [{node, Cpx}]),
+ [test_server] = rpc:call(Cp2, global_group, registered_names, [{node, Cpy}]),
+ [test_server] = rpc:call(Cp3, global_group, registered_names, [{node, Cpz}]),
%% start a proc and register it
@@ -510,28 +489,28 @@ compatible(Config) when is_list(Config) ->
RegNames =
lists:sort(
- rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}])),
+ rpc:call(Cp1, global_group, registered_names, [{node, Cp1}])),
RegNames =
lists:sort(
- rpc:call(Cp2, global_group, registered_names, [{node, Cp2nn}])),
+ rpc:call(Cp2, global_group, registered_names, [{node, Cp2}])),
RegNames =
lists:sort(
- rpc:call(Cp3, global_group, registered_names, [{node, Cp3nn}])),
+ rpc:call(Cp3, global_group, registered_names, [{node, Cp3}])),
RegNames =
lists:sort(
- rpc:call(Cp1, global_group, registered_names, [{node, Cpxnn}])),
+ rpc:call(Cp1, global_group, registered_names, [{node, Cpx}])),
RegNames =
lists:sort(
- rpc:call(Cp2, global_group, registered_names, [{node, Cpynn}])),
+ rpc:call(Cp2, global_group, registered_names, [{node, Cpy}])),
RegNames =
lists:sort(
- rpc:call(Cp3, global_group, registered_names, [{node, Cpznn}])),
+ rpc:call(Cp3, global_group, registered_names, [{node, Cpz}])),
undefined = rpc:call(Cp3, global_group, global_groups, []),
- Own_nodes_should = [node(), Cp1nn, Cp2nn, Cp3nn,
- Cpxnn, Cpynn, Cpznn],
+ Own_nodes_should = [node(), Cp1, Cp2, Cp3,
+ Cpx, Cpy, Cpz],
Own_nodes = rpc:call(Cp3, global_group, own_nodes, []),
[] = (Own_nodes -- Own_nodes_should),
[] = (Own_nodes_should -- Own_nodes),
@@ -563,67 +542,67 @@ compatible(Config) when is_list(Config) ->
%%------------------------------------
%% Test monitor nodes
%%------------------------------------
- Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]),
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]),
+ Pid2 = rpc:call(Cp1, global_group, send, [{node, Cp2}, test2, monitor]),
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpx}, test, monitor]),
%% Kill node Cp1
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cp1}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodedown, Cp1}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cp1}]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodedown, Cp1}]),
ct:sleep(100),
- stop_node(Cp1),
+ peer:stop(Peer1),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Kill node Cpz
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodedown, Cpz}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodedown, Cpz}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodedown, Cpz}]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodedown, Cpz}]),
ct:sleep(100),
- stop_node(Cpz),
+ peer:stop(Peerz),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Restart node Cp1
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cp1}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodeup, Cp1}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cp1}]),
- {ok, Cp1} = start_node_comp(Ncp1, Config),
- pong = rpc:call(Cp2, net_adm, ping, [Cp1nn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cp1nn]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodeup, Cp1}]),
+ {ok, Peer11, Cp1} = ?CT_PEER(#{name => Cp1, args => Args}),
+ pong = rpc:call(Cp2, net_adm, ping, [Cp1]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cp1]),
wait_for_ready_net(),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% Restart node Cpz
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, {wait_nodeup, Cpz}]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, {wait_nodeup, Cpz}]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, {wait_nodeup, Cpz}]),
- {ok, Cpz} = start_node_comp(Ncpz, Config),
- pong = rpc:call(Cp2, net_adm, ping, [Cpznn]),
- pong = rpc:call(Cpx, net_adm, ping, [Cpznn]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, {wait_nodeup, Cpz}]),
+ {ok, Peer1z, Cpz} = ?CT_PEER(#{name => Cpz, args => Args}),
+ pong = rpc:call(Cp2, net_adm, ping, [Cpz]),
+ pong = rpc:call(Cpx, net_adm, ping, [Cpz]),
wait_for_ready_net(),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
%% stop the nodes, and make sure names are released.
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
- stop_node(Cpx),
- stop_node(Cpy),
- stop_node(Cpz),
+ peer:stop(Peer11),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
+ peer:stop(Peerx),
+ peer:stop(Peery),
+ peer:stop(Peer1z),
?UNTIL(undefined =:= global:whereis_name(test)),
ok.
@@ -636,12 +615,13 @@ one_grp(Config) when is_list(Config) ->
Dir = proplists:get_value(priv_dir, Config),
File = filename:join(Dir, "global_group.config"),
{ok, Fd} = file:open(File, [write]),
- [Ncp1,Ncp2,Ncp3] = node_names([cp1, cp2, cp3], Config),
+ [Ncp1,Ncp2,Ncp3] = [?CT_PEER_NAME() || _ <- [cp1, cp2, cp3]],
config(Fd, Ncp1, Ncp2, Ncp3, "cpx", "cpy", "cpz", "cpq"),
- {ok, Cp1} = start_node(Ncp1, Config),
- {ok, Cp2} = start_node(Ncp2, Config),
- {ok, Cp3} = start_node(Ncp3, Config),
+ Args = ["-config", filename:join(Dir, "global_group")],
+ {ok, Peer1, Cp1} = ?CT_PEER(#{name => Ncp1, args => Args}),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{name => Ncp2, args => Args}),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{name => Ncp3, args => Args}),
%% sleep a while to make the global_group to sync...
ct:sleep(1000),
@@ -698,13 +678,13 @@ one_grp(Config) when is_list(Config) ->
{_, yes} = rpc:call(Cp3, ?MODULE, start_proc, [test]),
%% stop the nodes, and make sure names are released.
- stop_node(Cp3),
+ peer:stop(Peer3),
?UNTIL(undefined =:= rpc:call(Cp1, global, whereis_name, [test])),
Pid2 ! die,
- stop_node(Cp1),
- stop_node(Cp2),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
ok.
@@ -718,17 +698,18 @@ one_grp_x(Config) when is_list(Config) ->
Dir = proplists:get_value(priv_dir, Config),
File = filename:join(Dir, "global_group.config"),
{ok, Fd} = file:open(File, [write]),
- [Ncp1,Ncp2,Ncp3] = node_names([cp1, cp2, cp3], Config),
+ [Ncp1,Ncp2,Ncp3] = [?CT_PEER_NAME() || _ <- [cp1, cp2, cp3]],
config(Fd, Ncp1, Ncp2, Ncp3, "cpx", "cpy", "cpz", "cpq"),
- {ok, Cp1} = start_node(Ncp1, Config),
+ Args = ["-config", filename:join(Dir, "global_group")],
+ {ok, Peer1, Cp1} = ?CT_PEER(#{name => Ncp1, args => Args}),
%% sleep a while to make the global_group to sync...
ct:sleep(1000),
%% start a proc and register it
{Pid, yes} = rpc:call(Cp1, ?MODULE, start_proc, [test]),
- {ok, Cp2} = start_node(Ncp2, Config),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{name => Ncp2, args => Args}),
%% sleep a while to make the global_group to sync...
ct:sleep(1000),
@@ -736,7 +717,7 @@ one_grp_x(Config) when is_list(Config) ->
Pid = rpc:call(Cp1, global, whereis_name, [test]),
Pid = rpc:call(Cp2, global, whereis_name, [test]),
- {ok, Cp3} = start_node(Ncp3, Config),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{name => Ncp3, args => Args}),
%% sleep a while to make the global_group to sync...
ct:sleep(1000),
@@ -759,9 +740,9 @@ one_grp_x(Config) when is_list(Config) ->
Pid2 ! die,
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
ok.
@@ -776,23 +757,17 @@ two_grp(Config) when is_list(Config) ->
File = filename:join(Dir, "global_group.config"),
{ok, Fd} = file:open(File, [write]),
- [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz,Ncpq] =
- node_names([cp1,cp2,cp3,cpx,cpy,cpz,cpq], Config),
+ [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz,Ncpq] = [?CT_PEER_NAME() ||
+ _ <- [cp1,cp2,cp3,cpx,cpy,cpz,cpq]],
config(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq),
- Cp1nn = node_at(Ncp1),
- Cp2nn = node_at(Ncp2),
- Cp3nn = node_at(Ncp3),
- Cpxnn = node_at(Ncpx),
- Cpynn = node_at(Ncpy),
- Cpznn = node_at(Ncpz),
-
- {ok, Cp1} = start_node(Ncp1, Config),
- {ok, Cp2} = start_node(Ncp2, Config),
- {ok, Cp3} = start_node(Ncp3, Config),
- {ok, Cpx} = start_node(Ncpx, Config),
- {ok, Cpy} = start_node(Ncpy, Config),
- {ok, Cpz} = start_node(Ncpz, Config),
+ Args = ["-config", filename:join(Dir, "global_group")],
+ {ok, Peer1, Cp1} = ?CT_PEER(#{name => Ncp1, args => Args}),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{name => Ncp2, args => Args}),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{name => Ncp3, args => Args}),
+ {ok, Peerx, Cpx} = ?CT_PEER(#{name => Ncpx, args => Args}),
+ {ok, Peery, Cpy} = ?CT_PEER(#{name => Ncpy, args => Args}),
+ {ok, Peerz, Cpz} = ?CT_PEER(#{name => Ncpz, args => Args}),
%% The groups (cpq not started):
%% [{nc1, [cp1,cp2,cp3]}, {nc2, [cpx,cpy,cpz]}, {nc3, [cpq]}]
@@ -809,12 +784,14 @@ two_grp(Config) when is_list(Config) ->
{nc2, [nc1, nc3]} = rpc:call(Cpz, global_group, global_groups, []),
%% check the global group nodes
- [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp1, global_group, own_nodes, []),
- [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp2, global_group, own_nodes, []),
- [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp3, global_group, own_nodes, []),
- [Cpxnn, Cpynn, Cpznn] = rpc:call(Cpx, global_group, own_nodes, []),
- [Cpxnn, Cpynn, Cpznn] = rpc:call(Cpy, global_group, own_nodes, []),
- [Cpxnn, Cpynn, Cpznn] = rpc:call(Cpz, global_group, own_nodes, []),
+ Nodes1 = lists:sort([Cp1, Cp2, Cp3]),
+ Nodes2 = lists:sort([Cpx, Cpy, Cpz]),
+ Nodes1 = rpc:call(Cp1, global_group, own_nodes, []),
+ Nodes1 = rpc:call(Cp2, global_group, own_nodes, []),
+ Nodes1 = rpc:call(Cp3, global_group, own_nodes, []),
+ Nodes2 = rpc:call(Cpx, global_group, own_nodes, []),
+ Nodes2 = rpc:call(Cpy, global_group, own_nodes, []),
+ Nodes2 = rpc:call(Cpz, global_group, own_nodes, []),
%% start a proc and register it
@@ -825,10 +802,10 @@ two_grp(Config) when is_list(Config) ->
Pid1 = rpc:call(Cp1, global_group, send, [{group,nc1}, test,
{io, from_cp1}]),
[test] =
- rpc:call(Cpx, global_group, registered_names, [{node, Cp1nn}]),
+ rpc:call(Cpx, global_group, registered_names, [{node, Cp1}]),
[test] =
rpc:call(Cpx, global_group, registered_names, [{group, nc1}]),
- [] = rpc:call(Cpx, global_group, registered_names, [{node, Cpxnn}]),
+ [] = rpc:call(Cpx, global_group, registered_names, [{node, Cpx}]),
[] = rpc:call(Cpx, global_group, registered_names, [{group, nc2}]),
Pid1 = rpc:call(Cpx, global_group, send, [{group,nc1}, test,
{io, from_cp1}]),
@@ -924,21 +901,21 @@ two_grp(Config) when is_list(Config) ->
2000 -> ct:fail(timeout2)
end,
- Pid2 = rpc:call(Cpx, global_group, send, [{node, Cp1nn}, test2,
+ Pid2 = rpc:call(Cpx, global_group, send, [{node, Cp1}, test2,
{ping, self()}]),
receive
{pong, Cp2} -> ok
after
2000 -> ct:fail(timeout2)
end,
- Pid2 = rpc:call(Cpy, global_group, send, [{node, Cp2nn}, test2,
+ Pid2 = rpc:call(Cpy, global_group, send, [{node, Cp2}, test2,
{ping, self()}]),
receive
{pong, Cp2} -> ok
after
2000 -> ct:fail(timeout2)
end,
- Pid2 = rpc:call(Cpz, global_group, send, [{node, Cp3nn}, test2,
+ Pid2 = rpc:call(Cpz, global_group, send, [{node, Cp3}, test2,
{ping, self()}]),
receive
{pong, Cp2} -> ok
@@ -946,21 +923,21 @@ two_grp(Config) when is_list(Config) ->
2000 -> ct:fail(timeout2)
end,
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpznn}, test,
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpz}, test,
{ping, self()}]),
receive
{pong, Cpx} -> ok
after
2000 -> ct:fail(timeout2)
end,
- PidX = rpc:call(Cpy, global_group, send, [{node, Cpxnn}, test,
+ PidX = rpc:call(Cpy, global_group, send, [{node, Cpx}, test,
{ping, self()}]),
receive
{pong, Cpx} -> ok
after
2000 -> ct:fail(timeout2)
end,
- PidX = rpc:call(Cpz, global_group, send, [{node, Cpynn}, test,
+ PidX = rpc:call(Cpz, global_group, send, [{node, Cpy}, test,
{ping, self()}]),
receive
{pong, Cpx} -> ok
@@ -987,79 +964,79 @@ two_grp(Config) when is_list(Config) ->
%% Test monitor nodes
%%------------------------------------
Pid2 =
- rpc:call(Cp1, global_group, send, [{node, Cp2nn}, test2, monitor]),
+ rpc:call(Cp1, global_group, send, [{node, Cp2}, test2, monitor]),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, monitor]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, monitor]),
%% Kill node Cp1
- Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2,
+ Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2}, test2,
{wait_nodedown, Cp1}]),
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test,
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpx}, test,
{wait_nodedown, Cp1}]),
ct:sleep(100),
- stop_node(Cp1),
+ peer:stop(Peer1),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop_nodedown),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop_nodedown),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, to_loop]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, to_loop]),
%% Kill node Cpz
- Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2,
+ Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2}, test2,
{wait_nodedown, Cpz}]),
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test,
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpx}, test,
{wait_nodedown, Cpz}]),
ct:sleep(100),
- stop_node(Cpz),
+ peer:stop(Peerz),
ct:sleep(1000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop_nodedown),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop_nodedown),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, to_loop]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, to_loop]),
%% Restart node Cp1
- [Cp1nn, Cp2nn, Cp3nn] = rpc:call(Cp2, global_group, own_nodes, []),
- Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2,
+ Nodes1 = rpc:call(Cp2, global_group, own_nodes, []),
+ Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2}, test2,
{wait_nodeup, Cp1}]),
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test,
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpx}, test,
{wait_nodeup, Cp1}]),
ct:sleep(100),
- {ok, Cp1} = start_node(Ncp1, Config),
+ {ok, Peer11, Cp1} = ?CT_PEER(#{name => Cp1, args => Args}),
ct:sleep(5000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop_nodeup),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop_nodeup),
PidX =
- rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test, to_loop]),
+ rpc:call(Cpx, global_group, send, [{node, Cpx}, test, to_loop]),
%% Restart node Cpz
- Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2,
+ Pid2 = rpc:call(Cp2, global_group, send, [{node, Cp2}, test2,
{wait_nodeup, Cpz}]),
- PidX = rpc:call(Cpx, global_group, send, [{node, Cpxnn}, test,
+ PidX = rpc:call(Cpx, global_group, send, [{node, Cpx}, test,
{wait_nodeup, Cpz}]),
ct:sleep(100),
- {ok, Cpz} = start_node(Ncpz, Config),
+ {ok, Peer1z, Cpz} = ?CT_PEER(#{name => Cpz, args => Args}),
ct:sleep(5000),
- ok = assert_loop(Cp2, Cp2nn, test2, Pid2, loop_nodeup),
- ok = assert_loop(Cpx, Cpxnn, test, PidX, loop),
+ ok = assert_loop(Cp2, Cp2, test2, Pid2, loop_nodeup),
+ ok = assert_loop(Cpx, Cpx, test, PidX, loop),
Pid2 =
- rpc:call(Cp2, global_group, send, [{node, Cp2nn}, test2, to_loop]),
+ rpc:call(Cp2, global_group, send, [{node, Cp2}, test2, to_loop]),
Pid2 ! die,
PidX ! die,
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
- stop_node(Cpx),
- stop_node(Cpy),
- stop_node(Cpz),
+ peer:stop(Peer11),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
+ peer:stop(Peerx),
+ peer:stop(Peery),
+ peer:stop(Peer1z),
ok.
@@ -1068,20 +1045,21 @@ two_grp(Config) when is_list(Config) ->
%% Test hidden global groups.
hidden_groups(Config) when is_list(Config) ->
Dir = proplists:get_value(priv_dir, Config),
- File = filename:join(Dir, "global_group.config"),
+ File = filename:join(Dir, "hidden_groups.config"),
{ok, Fd} = file:open(File, [write]),
- [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz,Ncpq] =
- node_names([cp1,cp2,cp3,cpx,cpy,cpz,cpq], Config),
+ [Ncp1,Ncp2,Ncp3,Ncpx,Ncpy,Ncpz,Ncpq] = [?CT_PEER_NAME() ||
+ _ <- [cp1,cp2,cp3,cpx,cpy,cpz,cpq]],
config_hidden(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq),
- {ok, Cp1} = start_node(Ncp1, Config),
- {ok, Cp2} = start_node(Ncp2, Config),
- {ok, Cp3} = start_node(Ncp3, Config),
- {ok, Cpx} = start_node(Ncpx, Config),
- {ok, Cpy} = start_node(Ncpy, Config),
- {ok, Cpz} = start_node(Ncpz, Config),
- {ok, Cpq} = start_node(Ncpq, Config),
+ Args = ["-config", filename:join(Dir, "hidden_groups")],
+ {ok, Peer1, Cp1} = ?CT_PEER(#{name => Ncp1, args => Args}),
+ {ok, Peer2, Cp2} = ?CT_PEER(#{name => Ncp2, args => Args}),
+ {ok, Peer3, Cp3} = ?CT_PEER(#{name => Ncp3, args => Args}),
+ {ok, Peerx, Cpx} = ?CT_PEER(#{name => Ncpx, args => Args}),
+ {ok, Peery, Cpy} = ?CT_PEER(#{name => Ncpy, args => Args}),
+ {ok, Peerz, Cpz} = ?CT_PEER(#{name => Ncpz, args => Args}),
+ {ok, Peerq, Cpq} = ?CT_PEER(#{name => Ncpq, args => Args}),
%% sleep a while to make the global_groups to sync...
ct:sleep(1000),
@@ -1095,12 +1073,14 @@ hidden_groups(Config) when is_list(Config) ->
{nc2, [nc1, nc3]} = rpc:call(Cpz, global_group, global_groups, []),
%% check the global group nodes
- [Cp1, Cp2, Cp3] = rpc:call(Cp1, global_group, own_nodes, []),
- [Cp1, Cp2, Cp3] = rpc:call(Cp2, global_group, own_nodes, []),
- [Cp1, Cp2, Cp3] = rpc:call(Cp3, global_group, own_nodes, []),
- [Cpx, Cpy, Cpz] = rpc:call(Cpx, global_group, own_nodes, []),
- [Cpx, Cpy, Cpz] = rpc:call(Cpy, global_group, own_nodes, []),
- [Cpx, Cpy, Cpz] = rpc:call(Cpz, global_group, own_nodes, []),
+ Nodes1 = lists:sort([Cp1, Cp2, Cp3]),
+ Nodes2 = lists:sort([Cpx, Cpy, Cpz]),
+ Nodes1 = rpc:call(Cp1, global_group, own_nodes, []),
+ Nodes1 = rpc:call(Cp2, global_group, own_nodes, []),
+ Nodes1 = rpc:call(Cp3, global_group, own_nodes, []),
+ Nodes2 = rpc:call(Cpx, global_group, own_nodes, []),
+ Nodes2 = rpc:call(Cpy, global_group, own_nodes, []),
+ Nodes2 = rpc:call(Cpz, global_group, own_nodes, []),
[Cpq] = rpc:call(Cpq, global_group, own_nodes, []),
%% Make some inter group connections
@@ -1112,108 +1092,65 @@ hidden_groups(Config) when is_list(Config) ->
pong = rpc:call(Cpz, net_adm, ping, [Cpq]),
%% Check that no inter group connections are visible
- NC1Nodes = lists:sort([Cp1, Cp2, Cp3]),
- NC2Nodes = lists:sort([Cpx, Cpy, Cpz]),
- NC1Nodes = lists:sort([Cp1|rpc:call(Cp1, erlang, nodes, [])]),
- NC1Nodes = lists:sort([Cp2|rpc:call(Cp2, erlang, nodes, [])]),
- NC1Nodes = lists:sort([Cp3|rpc:call(Cp3, erlang, nodes, [])]),
- NC2Nodes = lists:sort([Cpx|rpc:call(Cpx, erlang, nodes, [])]),
- NC2Nodes = lists:sort([Cpy|rpc:call(Cpy, erlang, nodes, [])]),
- NC2Nodes = lists:sort([Cpz|rpc:call(Cpz, erlang, nodes, [])]),
- NC12Nodes = lists:append(NC1Nodes, NC2Nodes),
+ Nodes1 = lists:sort([Cp1|rpc:call(Cp1, erlang, nodes, [])]),
+ Nodes1 = lists:sort([Cp2|rpc:call(Cp2, erlang, nodes, [])]),
+ Nodes1 = lists:sort([Cp3|rpc:call(Cp3, erlang, nodes, [])]),
+ Nodes2 = lists:sort([Cpx|rpc:call(Cpx, erlang, nodes, [])]),
+ Nodes2 = lists:sort([Cpy|rpc:call(Cpy, erlang, nodes, [])]),
+ Nodes2 = lists:sort([Cpz|rpc:call(Cpz, erlang, nodes, [])]),
+ NC12Nodes = lists:append(Nodes1, Nodes2),
false = lists:any(fun(N) -> lists:member(N, NC12Nodes) end,
rpc:call(Cpq, erlang, nodes, [])),
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
- stop_node(Cpx),
- stop_node(Cpy),
- stop_node(Cpz),
- stop_node(Cpq),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
+ peer:stop(Peerx),
+ peer:stop(Peery),
+ peer:stop(Peerz),
+ peer:stop(Peerq),
ok.
%% Checks when the search process exits. .
test_exit(Config) when is_list(Config) ->
- NN = node_name(atom_to_list(node())),
- Cp1nn = list_to_atom("cp1@" ++ NN),
+ Dir=proplists:get_value(priv_dir, Config),
+ Args = ["-config", filename:join(Dir, "global_group")],
- {ok, Cp1} = start_node(cp1, Config),
- {ok, Cp2} = start_node(cp2, Config),
- {ok, Cp3} = start_node(cp3, Config),
+ {ok, Peer1, Cp1} = ?CT_PEER(Args),
+ {ok, Peer2, _Cp2} = ?CT_PEER(Args),
+ {ok, Peer3, _Cp3} = ?CT_PEER(Args),
ct:sleep(1000),
{error, illegal_function_call} =
- rpc:call(Cp1, global_group, registered_names_test, [{node, Cp1nn}]),
+ rpc:call(Cp1, global_group, registered_names_test, [{node, Cp1}]),
{badarg,_} =
rpc:call(Cp1, global_group, send, [king, "The message"]),
undefined = rpc:call(Cp1, global_group, whereis_name, [king]),
% make sure the search process really exits after every global_group operations
ProcessCount0 = rpc:call(Cp1, erlang, system_info, [process_count]),
- _ = rpc:call(Cp1, global_group, whereis_name, [{node, Cp1nn}, whatever_pid_name]),
+ _ = rpc:call(Cp1, global_group, whereis_name, [{node, Cp1}, whatever_pid_name]),
ProcessCount1 = rpc:call(Cp1, erlang, system_info, [process_count]),
- _ = rpc:call(Cp1, global_group, registered_names, [{node, Cp1nn}]),
+ _ = rpc:call(Cp1, global_group, registered_names, [{node, Cp1}]),
ProcessCount2 = rpc:call(Cp1, erlang, system_info, [process_count]),
- _ = rpc:call(Cp1, global_group, send, [{node, Cp1nn}, whatever_pid_name, msg]),
+ _ = rpc:call(Cp1, global_group, send, [{node, Cp1}, whatever_pid_name, msg]),
ProcessCount3 = rpc:call(Cp1, erlang, system_info, [process_count]),
ProcessCount0 = ProcessCount1 = ProcessCount2 = ProcessCount3,
%% stop the nodes, and make sure names are released.
- stop_node(Cp1),
- stop_node(Cp2),
- stop_node(Cp3),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
+ peer:stop(Peer3),
%% sleep to let the nodes die
ct:sleep(1000),
ok.
-
-start_node(Name, Config) ->
- Pa=filename:dirname(code:which(?MODULE)),
- Dir=proplists:get_value(priv_dir, Config),
- ConfFile = " -config " ++ filename:join(Dir, "global_group"),
- test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]).
-
-start_node_no(Name, Config) ->
- Pa=filename:dirname(code:which(?MODULE)),
- Dir=proplists:get_value(priv_dir, Config),
- ConfFile = " -config " ++ filename:join(Dir, "no_global_group"),
- test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]).
-
-start_node_no2(Name, Config) ->
- Pa=filename:dirname(code:which(?MODULE)),
- Dir=proplists:get_value(priv_dir, Config),
- ConfFile = " -config " ++ filename:join(Dir, "no_global_group_sync"),
- test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]).
-
-start_node_comp(Name, Config) ->
- Pa=filename:dirname(code:which(?MODULE)),
- Dir=proplists:get_value(priv_dir, Config),
- ConfFile = " -config " ++ filename:join(Dir, "global_group_comp"),
- test_server:start_node(Name, slave, [{args, "-pa " ++ Pa ++ ConfFile}]).
-
-node_names(Names, Config) ->
- [node_name(Name, Config) || Name <- Names].
-
-node_name(Name, Config) ->
- U = "_",
- Pid = os:getpid(),
- {{Y,M,D}, {H,Min,S}} = calendar:now_to_local_time(now()),
- Date = io_lib:format("~4w_~2..0w_~2..0w__~2..0w_~2..0w_~2..0w",
- [Y,M,D, H,Min,S]),
- L = lists:flatten(Date),
- lists:concat([Name,U,?testcase,U,Pid,U,U,L]).
-
-stop_node(Node) ->
- test_server:stop_node(Node).
-
-
wait_for_ready_net() ->
Nodes = lists:sort(?NODES),
?UNTIL(begin
@@ -1236,10 +1173,10 @@ config_hidden(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq) ->
"{global_groups, [{nc1, hidden, ['~s@~s','~s@~s','~s@~s']}, "
"{nc2, hidden, ['~s@~s','~s@~s','~s@~s']}, "
"{nc3, normal, ['~s@~s']}]} ] }]. ~n",
- [Ncp1, M, Ncp2, M, Ncp3, M,
- Ncpx, M, Ncpy, M, Ncpz, M,
- Ncp1, M, Ncp2, M, Ncp3, M,
- Ncpx, M, Ncpy, M, Ncpz, M,
+ [Ncp1, M, Ncp2, M, Ncp3, M,
+ Ncpx, M, Ncpy, M, Ncpz, M,
+ Ncp1, M, Ncp2, M, Ncp3, M,
+ Ncpx, M, Ncpy, M, Ncpz, M,
Ncpq, M]).
config(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq) ->
@@ -1250,10 +1187,10 @@ config(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz, Ncpq) ->
"{global_groups, [{nc1, ['~s@~s','~s@~s','~s@~s']}, "
" {nc2, ['~s@~s','~s@~s','~s@~s']}, "
"{nc3, ['~s@~s']}]} ] }]. ~n",
- [Ncp1, M, Ncp2, M, Ncp3, M,
- Ncpx, M, Ncpy, M, Ncpz, M,
- Ncp1, M, Ncp2, M, Ncp3, M,
- Ncpx, M, Ncpy, M, Ncpz, M,
+ [Ncp1, M, Ncp2, M, Ncp3, M,
+ Ncpx, M, Ncpy, M, Ncpz, M,
+ Ncp1, M, Ncp2, M, Ncp3, M,
+ Ncpx, M, Ncpy, M, Ncpz, M,
Ncpq, M]).
config_no(Fd) ->
@@ -1265,7 +1202,7 @@ config_sync(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz) ->
" '~s@~s','~s@~s','~s@~s']},"
"{sync_nodes_timeout, 1000},"
"{global_groups, []} ] }] .~n",
- [Ncp1, M, Ncp2, M, Ncp3, M,
+ [Ncp1, M, Ncp2, M, Ncp3, M,
Ncpx, M, Ncpy, M, Ncpz, M]).
@@ -1274,16 +1211,9 @@ config_comp(Fd, Ncp1, Ncp2, Ncp3, Ncpx, Ncpy, Ncpz) ->
io:format(Fd, "[{kernel, [{sync_nodes_optional, ['~s@~s','~s@~s','~s@~s', "
" '~s@~s','~s@~s','~s@~s']},"
"{sync_nodes_timeout, 1000} ] }] .~n",
- [Ncp1, M, Ncp2, M, Ncp3, M,
+ [Ncp1, M, Ncp2, M, Ncp3, M,
Ncpx, M, Ncpy, M, Ncpz, M]).
-node_at(N) ->
- NN = node_name(atom_to_list(node())),
- list_to_atom(lists:concat([N, "@", NN])).
-
-node_name(L) ->
- from($@, L).
-
from(H, [H | T]) -> T;
from(H, [_ | T]) -> from(H, T);
from(_, []) -> [].
diff --git a/lib/kernel/test/heart_SUITE.erl b/lib/kernel/test/heart_SUITE.erl
index f5ca6d0e1d..01a57947b1 100644
--- a/lib/kernel/test/heart_SUITE.erl
+++ b/lib/kernel/test/heart_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,159 +21,126 @@
-include_lib("common_test/include/ct.hrl").
--export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
- init_per_group/2,end_per_group/2, start/1, restart/1,
- reboot/1,
- node_start_immediately_after_crash/1,
- node_start_soon_after_crash/1,
- set_cmd/1, clear_cmd/1, get_cmd/1,
- callback_api/1,
- options_api/1,
- dont_drop/1, kill_pid/1, heart_no_kill/1]).
-
--export([init_per_testcase/2, end_per_testcase/2]).
-
--export([start_heart_stress/1, mangle/1, suicide_by_heart/0, non_suicide_by_heart/0]).
-
--define(DEFAULT_TIMEOUT_SECS, 120).
-
--define(UNIQ_NODE_NAME,
- list_to_atom(?MODULE_STRING ++ "__" ++
- atom_to_list(?FUNCTION_NAME) ++ "_" ++
- integer_to_list(erlang:unique_integer([positive])))).
-
-init_per_testcase(_Func, Config) ->
- Config.
-
-end_per_testcase(_Func, _Config) ->
- Nodes = nodes(),
- lists:foreach(fun(X) ->
- NNam = list_to_atom(hd(string:tokens(atom_to_list(X),"@"))),
- case NNam of
- heart_test ->
- ct:pal(?HI_VERBOSITY, "WARNING: Killed ~p~n", [X]),
- rpc:cast(X, erlang, halt, []);
- _ ->
- ok
- end
- end, Nodes).
+%% Test suite exports
+-export([
+ all/0, suite/0,
+ init_per_suite/1, end_per_suite/1
+]).
+
+%% Test case exports
+-export([
+ start/0, start/1,
+ restart/0, restart/1,
+ reboot/0, reboot/1,
+ node_start_immediately_after_crash/1,
+ node_start_soon_after_crash/1,
+ set_cmd/1, clear_cmd/1, get_cmd/1,
+ callback_api/1, options_api/1, dont_drop/1,
+ kill_pid/0, kill_pid/1,
+ heart_no_kill/0, heart_no_kill/1
+]).
+
+%% Internal exports used by peer nodes
+-export([
+ start_heart_stress/1, mangle/1,
+ suicide_by_heart/0, non_suicide_by_heart/0,
+ exhaust_atoms/0
+]).
%%-----------------------------------------------------------------
-%% Test suite for heart.
-%% Should be started in a CC view with:
-%% erl -sname master -rsh ctrsh
-%%-----------------------------------------------------------------
+%% Test suite for heart
suite() ->
- [{ct_hooks,[ts_install_cth]},
- {timetrap,{minutes,2}}].
-
-all() -> [
- start, restart, reboot,
- node_start_immediately_after_crash,
- node_start_soon_after_crash,
- set_cmd, clear_cmd, get_cmd,
- callback_api,
- options_api,
- kill_pid,
- heart_no_kill
- ].
-
-groups() ->
- [].
-
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(_GroupName, Config) ->
- Config.
+ [{ct_hooks, [ts_install_cth]}, {timetrap, {minutes,2}}].
+all() ->
+ [
+ start, restart, reboot,
+ node_start_immediately_after_crash,
+ node_start_soon_after_crash,
+ set_cmd, clear_cmd, get_cmd, callback_api,
+ options_api, kill_pid, heart_no_kill].
init_per_suite(Config) when is_list(Config) ->
case os:type() of
- {win32, windows} ->
- {skipped, "No use to run on Windows 95/98"};
- _ ->
- ignore_cores:init(Config)
+ {win32, windows} ->
+ {skipped, "No use to run on Windows 95/98"};
+ _ ->
+ ignore_cores:init(Config)
end.
+
end_per_suite(Config) when is_list(Config) ->
ignore_cores:fini(Config).
+%%-----------------------------------------------------------------
+%% Test suite for heart
-start_check(Type, Name) ->
- start_check(Type, Name, []).
-start_check(Type, Name, Envs) ->
- Args = case test_server:os_type() of
- {win32,_} ->
- "+t50000 -heart " ++ env_encode([{"HEART_COMMAND", no_reboot}|Envs]);
- _ ->
- "+t50000 -heart " ++ env_encode(Envs)
- end,
- {ok, Node} = case Type of
- loose ->
- loose_node:start(Name, Args, ?DEFAULT_TIMEOUT_SECS);
- _ ->
- test_server:start_node(Name, Type, [{args, Args}])
- end,
+heart_args() ->
+ Common = ["-heart"],
+ case os:type() of
+ {win32, _} ->
+ Common ++ ["-env", "HEART_COMMAND", "no_reboot"];
+ _ ->
+ Common
+ end.
+
+heart_monitor(Node) ->
erlang:monitor_node(Node, true),
- case rpc:call(Node, erlang, whereis, [heart]) of
- Pid when is_pid(Pid) ->
- ok;
- _ ->
- ct:fail(heart_not_started)
- end,
- {ok, Node}.
+ %% assert that peer node has a heart
+ is_pid(rpc:call(Node, erlang, whereis, [heart])) orelse
+ ct:fail(heart_not_started),
+ ok.
+
+start() ->
+ [{doc, "Test that node is down after init:reboot"}].
start(Config) when is_list(Config) ->
- {ok, Node} = start_check(slave, ?UNIQ_NODE_NAME),
- rpc:call(Node, init, reboot, []),
+ {ok, _Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
+ ok = rpc:call(Node, init, reboot, []),
receive
- {nodedown, Node} -> ok
- after 2000 -> ct:fail(node_not_closed)
+ {nodedown, Node} ->
+ ok
+ after
+ 2000 -> ct:fail(node_not_closed)
end,
timer:sleep(5000),
- case net_adm:ping(Node) of
- pang ->
- ok;
- _ ->
- ct:fail(node_rebooted)
- end,
- test_server:stop_node(Node).
+ net_adm:ping(Node) =:= pang orelse
+ ct:fail(node_rebooted).
+
+restart() ->
+ [{doc, "Check that a node is up and running after a init:restart/0"}].
%% Also test fixed bug in R1B (it was not possible to
%% do init:stop/0 on a restarted system before)
%% Slave executes erlang:halt() on master nodedown.
%% Therefore the slave process has to be killed
%% before restart.
-
-%% restart
-%% Purpose:
-%% Check that a node is up and running after a init:restart/0
restart(Config) when is_list(Config) ->
- {ok, Node} = start_check(loose, ?UNIQ_NODE_NAME),
- rpc:call(Node, init, restart, []),
+ {ok, Peer, Node} = ?CT_PEER(#{connection => standard_io, args => heart_args()}),
+ heart_monitor(Node),
+ ok = rpc:call(Node, init, restart, []),
receive
- {nodedown, Node} ->
- ok
+ {nodedown, Node} ->
+ ok
after 5000 ->
ct:fail(node_not_closed)
end,
timer:sleep(5000),
node_check_up_down(Node, 2000),
- loose_node:stop(Node).
+ peer:stop(Peer).
-%% reboot
-%% Purpose:
-%% Check that a node is up and running after a init:reboot/0
-reboot(Config) when is_list(Config) ->
- {ok, Node} = start_check(slave, ?UNIQ_NODE_NAME),
+reboot() ->
+ [{doc, "Check that a node is up and running after a init:reboot/0"}].
+reboot(Config) when is_list(Config) ->
+ {ok, _Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
ok = rpc:call(Node, heart, set_cmd,
- [ct:get_progname() ++
- " -noshell -heart " ++ name(Node) ++ "&"]),
- rpc:call(Node, init, reboot, []),
+ [ct:get_progname() ++ " -noshell -heart " ++ name(Node) ++ "&"]),
+ ok = rpc:call(Node, init, reboot, []),
receive
- {nodedown, Node} ->
- ok
+ {nodedown, Node} ->
+ ok
after 2000 ->
ct:fail(node_not_closed)
end,
@@ -187,50 +154,40 @@ reboot(Config) when is_list(Config) ->
%% This test exhausts the atom table on the remote node.
%% ERL_CRASH_DUMP_SECONDS=0 will force beam not to dump an erl_crash.dump.
%% May currently dump core in beam debug build due to lock-order violation
-%% This should be removed when a non-lockad information retriever is implemented
+%% This should be removed when a non-locked information retriever is implemented
%% for crash dumps
node_start_immediately_after_crash(Config) when is_list(Config) ->
- Config2 = ignore_cores:setup(?MODULE, node_start_immediately_after_crash, Config, true),
+ Config2 = ignore_cores:setup(?MODULE, ?FUNCTION_NAME, Config, true),
try
- node_start_immediately_after_crash_test(Config2)
+ node_start_immediately_after_crash_test(Config2)
after
- ignore_cores:restore(Config2)
+ ignore_cores:restore(Config2)
end.
-
node_start_immediately_after_crash_test(Config) when is_list(Config) ->
- {ok, Node} = start_check(loose, ?UNIQ_NODE_NAME,
- [{"ERL_CRASH_DUMP_SECONDS", "0"}]),
+ {ok, _Peer, Node} = ?CT_PEER(#{connection => standard_io,
+ args => heart_args() ++ ["-env", "ERL_CRASH_DUMP_SECONDS", "0"]}),
+ heart_monitor(Node),
ok = rpc:call(Node, heart, set_cmd,
- [ct:get_progname() ++
- " -noshell -heart " ++ name(Node) ++ "&"]),
-
- Mod = exhaust_atoms,
-
- Code = generate(Mod, [], [
- "do() -> "
- " Set = lists:seq($a,$z), "
- " [ list_to_atom([A,B,C,D,E]) || "
- " A <- Set, B <- Set, C <- Set, E <- Set, D <- Set ]."
- ]),
+ [ct:get_progname() ++ " -noshell -heart " ++ name(Node) ++ "&"]),
%% crash it with atom exhaustion
- rpc:call(Node, erlang, load_module, [Mod, Code]),
- rpc:cast(Node, Mod, do, []),
+ rpc:cast(Node, ?MODULE, exhaust_atoms, []),
- T0 = now(),
-
- receive {nodedown, Node} ->
- io:format("Took ~.2f s. for node to go down~n", [timer:now_diff(now(), T0)/1000000]),
- ok
+ T0 = erlang:monotonic_time(),
+ receive
+ {nodedown, Node} ->
+ Msec = erlang:convert_time_unit(erlang:monotonic_time() - T0, native, millisecond),
+ io:format("Took ~.2f s. for node to go down~n", [Msec / 1000]),
+ ok
%% timeout is very liberal here. nodedown is received in about 1 s. on linux (palantir)
%% and in about 10 s. on solaris (carcharoth)
- after (15000*test_server:timetrap_scale_factor()) -> ct:fail(node_not_closed)
+ after (15000 * test_server:timetrap_scale_factor()) ->
+ ct:fail(node_not_closed)
end,
timer:sleep(3000),
- node_check_up_down(Node, 2000),
- loose_node:stop(Node).
+ node_check_up_down(Node, 2000).
%% node_start_soon_after_crash
%% Purpose:
@@ -238,63 +195,49 @@ node_start_immediately_after_crash_test(Config) when is_list(Config) ->
%% This test exhausts the atom table on the remote node.
%% ERL_CRASH_DUMP_SECONDS=10 will force beam
%% to only dump an erl_crash.dump for 10 seconds.
-%% May currently dump core in beam debug build due to lock-order violation
-%% This should be removed when a non-lockad information retriever is implemented
-%% for crash dumps
node_start_soon_after_crash(Config) when is_list(Config) ->
- Config2 = ignore_cores:setup(?MODULE, node_start_soon_after_crash, Config, true),
+ Config2 = ignore_cores:setup(?MODULE, ?FUNCTION_NAME, Config, true),
try
- node_start_soon_after_crash_test(Config2)
+ node_start_soon_after_crash_test(Config2)
after
- ignore_cores:restore(Config2)
+ ignore_cores:restore(Config2)
end.
-
+
node_start_soon_after_crash_test(Config) when is_list(Config) ->
- {ok, Node} = start_check(loose, ?UNIQ_NODE_NAME,
- [{"ERL_CRASH_DUMP_SECONDS", "10"}]),
+ {ok, _Peer, Node} = ?CT_PEER(#{connection => standard_io,
+ args => heart_args() ++ ["-env", "ERL_CRASH_DUMP_SECONDS", "10"]}),
+ heart_monitor(Node),
ok = rpc:call(Node, heart, set_cmd,
- [ct:get_progname() ++
- " -noshell -heart " ++ name(Node) ++ "&"]),
+ [ct:get_progname() ++ " -noshell -heart " ++ name(Node) ++ "&"]),
- Mod = exhaust_atoms,
-
- Code = generate(Mod, [], [
- "do() -> "
- " Set = lists:seq($a,$z), "
- " [ list_to_atom([A,B,C,D,E]) || "
- " A <- Set, B <- Set, C <- Set, E <- Set, D <- Set ]."
- ]),
-
- %% crash it with atom exhaustion
- rpc:call(Node, erlang, load_module, [Mod, Code]),
- rpc:cast(Node, Mod, do, []),
+ rpc:cast(Node, ?MODULE, exhaust_atoms, []),
receive {nodedown, Node} -> ok
- after (15000*test_server:timetrap_scale_factor()) -> ct:fail(node_not_closed)
+ after (15000 * test_server:timetrap_scale_factor()) -> ct:fail(node_not_closed)
end,
timer:sleep(20000),
- node_check_up_down(Node, 15000),
- loose_node:stop(Node).
+ node_check_up_down(Node, 15000).
node_check_up_down(Node, Tmo) ->
case net_adm:ping(Node) of
- pong ->
- erlang:monitor_node(Node, true),
- rpc:call(Node, init, reboot, []),
- receive
- {nodedown, Node} -> ok
- after Tmo ->
- ct:fail(node_not_closed2)
- end;
- _ ->
- ct:fail(node_not_rebooted)
+ pong ->
+ erlang:monitor_node(Node, true),
+ rpc:call(Node, init, reboot, []),
+ receive
+ {nodedown, Node} -> ok
+ after Tmo ->
+ ct:fail(node_not_closed2)
+ end;
+ _ ->
+ ct:fail(node_not_rebooted)
end.
%% Only tests bad command, correct behaviour is tested in reboot/1.
set_cmd(Config) when is_list(Config) ->
- {ok, Node} = start_check(slave, ?UNIQ_NODE_NAME),
+ {ok, Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
Cmd = wrong_atom,
{error, {bad_cmd, Cmd}} = rpc:call(Node, heart, set_cmd, [Cmd]),
Cmd1 = lists:duplicate(2047, $a),
@@ -303,49 +246,51 @@ set_cmd(Config) when is_list(Config) ->
ok = rpc:call(Node, heart, set_cmd, [Cmd2]),
Cmd3 = lists:duplicate(2000, $a),
ok = rpc:call(Node, heart, set_cmd, [Cmd3]),
- stop_node(Node),
+ peer:stop(Peer),
ok.
clear_cmd(Config) when is_list(Config) ->
- {ok, Node} = start_check(slave, ?UNIQ_NODE_NAME),
+ {ok, _Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
ok = rpc:call(Node, heart, set_cmd,
- [ct:get_progname() ++
- " -noshell -heart " ++ name(Node) ++ "&"]),
+ [ct:get_progname() ++
+ " -noshell -heart " ++ name(Node) ++ "&"]),
rpc:call(Node, init, reboot, []),
receive
- {nodedown, Node} ->
- ok
+ {nodedown, Node} ->
+ ok
after 2000 ->
- ct:fail(node_not_closed)
+ ct:fail(node_not_closed)
end,
timer:sleep(5000),
case net_adm:ping(Node) of
- pong ->
- erlang:monitor_node(Node, true);
- _ ->
- ct:fail(node_not_rebooted)
+ pong ->
+ erlang:monitor_node(Node, true);
+ _ ->
+ ct:fail(node_not_rebooted)
end,
ok = rpc:call(Node, heart, set_cmd,
- ["erl -noshell -heart " ++ name(Node) ++ "&"]),
+ ["erl -noshell -heart " ++ name(Node) ++ "&"]),
ok = rpc:call(Node, heart, clear_cmd, []),
rpc:call(Node, init, reboot, []),
receive
- {nodedown, Node} ->
- ok
+ {nodedown, Node} ->
+ ok
after 2000 ->
- ct:fail(node_not_closed)
+ ct:fail(node_not_closed)
end,
timer:sleep(5000),
case net_adm:ping(Node) of
- pang ->
- ok;
- _ ->
- ct:fail(node_rebooted)
+ pang ->
+ ok;
+ _ ->
+ ct:fail(node_rebooted)
end,
ok.
get_cmd(Config) when is_list(Config) ->
- {ok, Node} = start_check(slave, ?UNIQ_NODE_NAME),
+ {ok, Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
ShortCmd = "test",
ok = rpc:call(Node, heart, set_cmd, [ShortCmd]),
@@ -356,11 +301,12 @@ get_cmd(Config) when is_list(Config) ->
ok = rpc:call(Node, heart, set_cmd, [LongCmd]),
{ok, LongCmd} = rpc:call(Node, heart, get_cmd, []),
- stop_node(Node),
+ peer:stop(Peer),
ok.
callback_api(Config) when is_list(Config) ->
- {ok, Node} = start_check(slave, ?UNIQ_NODE_NAME),
+ {ok, _Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
none = rpc:call(Node, heart, get_callback, []),
M0 = self(),
F0 = ok,
@@ -390,11 +336,11 @@ callback_api(Config) when is_list(Config) ->
receive {nodedown, Node} -> ok
after 5000 -> ct:fail(node_not_killed)
end,
- stop_node(Node),
ok.
options_api(Config) when is_list(Config) ->
- {ok, Node} = start_check(slave, ?UNIQ_NODE_NAME),
+ {ok, Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
none = rpc:call(Node, heart, get_options, []),
M0 = self(),
F0 = ok,
@@ -418,7 +364,7 @@ options_api(Config) when is_list(Config) ->
ok = rpc:call(Node, heart, set_options, [[]]),
none = rpc:call(Node, heart, get_options, []),
- stop_node(Node),
+ peer:stop(Peer),
ok.
@@ -447,11 +393,14 @@ do_dont_drop(Config,N) ->
FirstCmd = erl() ++ name(NN2 ++ "@" ++ Host),
%% Separated the parameters to start_node_run for clarity...
Name = list_to_atom(NN1),
- Env = [{"HEART_COMMAND", FirstCmd}],
- Func = "start_heart_stress",
- Arg = NN3 ++ "@" ++ Host ++ " " ++
- filename:join(proplists:get_value(data_dir, Config), "simple_echo"),
- start_node_run(Name,Env,Func,Arg),
+ EchoPath = filename:join(proplists:get_value(data_dir, Config), "simple_echo"),
+ Peer3Name = list_to_atom(NN3 ++ "@" ++ Host),
+ %%
+ PA = filename:dirname(code:which(?MODULE)),
+ Params = ["-heart", "-pa", PA, "-env", "HEART_COMMAND", FirstCmd],
+ {ok, Peer, _Node} = ?CT_PEER(#{name => Name, args => Params}),
+ peer:call(Peer, ?MODULE, start_heart_stress, [Peer3Name, EchoPath]),
+ %%
case wait_for_any_of(list_to_atom(NN2 ++ "@" ++ Host),
list_to_atom(NN3 ++ "@" ++ Host)) of
2 ->
@@ -483,53 +432,32 @@ wait_for_any_of(N1,N2,Times) ->
end.
-%% Tests that heart kills the old erlang node before executing
-%% heart command.
-kill_pid(Config) when is_list(Config) ->
- ok = do_kill_pid(Config).
+kill_pid() ->
+ [{doc, "Tests that heart kills the old erlang node before executing heart command."}].
-do_kill_pid(_Config) ->
- Name = ?UNIQ_NODE_NAME,
- Env = [{"HEART_COMMAND", "nickeNyfikenFarEttJobb"}],
- {ok,Node} = start_node_run(Name,Env,suicide_by_heart,[]),
- ok = wait_for_node(Node,15),
+kill_pid(Config) when is_list(Config) ->
+ {ok, _Peer, Node} = ?CT_PEER(heart_args() ++ ["-env", "HEART_COMMAND", "nickeNyfikenFarEttJobb"]),
+ heart_monitor(Node),
+ true = rpc:cast(Node, ?MODULE, suicide_by_heart, []),
erlang:monitor_node(Node, true),
- receive {nodedown,Node} -> ok
+ receive {nodedown, Node} -> ok
after 30000 ->
- false
+ ct:fail(heart_did_not_kill_old_node)
end.
-heart_no_kill(suite) ->
- [];
-heart_no_kill(doc) ->
- ["Tests that heart doesn't kill the old erlang node when ",
- "HEART_NO_KILL is set."];
+heart_no_kill() ->
+ [{doc, "Tests that heart doesn't kill the old erlang node when HEART_NO_KILL is set."}].
+
heart_no_kill(Config) when is_list(Config) ->
- ok = do_no_kill(Config).
-
-do_no_kill(_Config) ->
- Name = heart_test,
- {ok,Node} = start_node_run(Name,[],non_suicide_by_heart,[]),
- io:format("Node is ~p~n", [Node]),
- ok = wait_for_node(Node,15),
- io:format("wait_for_node is ~p~n", [ok]),
- erlang:monitor_node(Node, true),
- receive {nodedown,Node} -> false
+ {ok, Peer, Node} = ?CT_PEER(heart_args()),
+ heart_monitor(Node),
+ true = rpc:cast(Node, ?MODULE, non_suicide_by_heart, []),
+ receive
+ {nodedown, Node} ->
+ ct:fail(heart_killed_old_node)
after 30000 ->
- io:format("Node didn't die..\n"),
- rpc:call(Node,init,stop,[]),
- io:format("done init:stop..\n"),
- ok
- end.
-
-wait_for_node(_,0) ->
- false;
-wait_for_node(Node,N) ->
- receive after 1000 -> ok end,
- case net_adm:ping(Node) of
- pong -> ok;
- pang -> wait_for_node(Node,N-1)
+ peer:stop(Peer)
end.
erl() ->
@@ -537,133 +465,105 @@ erl() ->
{win32,_} -> "werl ";
_ -> "erl "
end.
-
-name(Node) when is_list(Node) -> name(Node,[]);
-name(Node) when is_atom(Node) -> name(atom_to_list(Node),[]).
-name([$@|Node], Name) ->
+name(Node) when is_list(Node) -> name(Node, []);
+name(Node) when is_atom(Node) -> name(atom_to_list(Node), []).
+
+name([$@ | Node], Name) ->
case lists:member($., Node) of
- true ->
- "-name " ++ lists:reverse(Name);
- _ ->
- "-sname " ++ lists:reverse(Name)
+ true ->
+ "-name " ++ lists:reverse(Name);
+ _ ->
+ "-sname " ++ lists:reverse(Name)
end;
-name([H|T], Name) ->
- name(T, [H|Name]).
-
-
-enc(A) when is_atom(A) -> atom_to_list(A);
-enc(A) when is_binary(A) -> binary_to_list(A);
-enc(A) when is_list(A) -> A.
-
-env_encode([]) -> [];
-env_encode([{X,Y}|T]) ->
- "-env " ++ enc(X) ++ " \"" ++ enc(Y) ++ "\" " ++ env_encode(T).
-
-%%%
-%%% Starts a node and runs a function in this
-%%% module.
-%%% Name is the node name as either atom or string,
-%%% Env is a list of Tuples containing name-value pairs.
-%%% Function is the function to run in this module
-%%% Argument is the argument(s) to send through erl -s
-%%%
-start_node_run(Name, Env, Function, Argument) ->
- PA = filename:dirname(code:which(?MODULE)),
- Params = "-heart " ++ env_encode(Env) ++ " -pa " ++ PA ++
- " -s " ++
- enc(?MODULE) ++ " " ++ enc(Function) ++ " " ++
- enc(Argument),
- start_node(Name, Params).
-
-start_node(Name, Param) ->
- test_server:start_node(Name, slave, [{args, Param}]).
-
-stop_node(Node) ->
- test_server:stop_node(Node).
+name([H | T], Name) ->
+ name(T, [H | Name]).
-%%% This code is run in a slave node to ensure that
-%%% A heart command really gets set syncronously
+%%% This code is run in a peer node to ensure that
+%%% A heart command really gets set synchronously
%%% and cannot get "dropped".
-send_to(_,_,0) ->
+send_to(_, _, 0) ->
ok;
-send_to(Port,D,N) ->
- Port ! {self(),{command,D}},
- send_to(Port,D,N-1).
+send_to(Port, D, N) ->
+ Port ! {self(), {command, D}},
+ send_to(Port, D, N - 1).
-receive_from(_,_,0) ->
+receive_from(_, _, 0) ->
ok;
-receive_from(Port,D,N) ->
+receive_from(Port, D, N) ->
receive
- {Port, {data,{eol,_Data}}} ->
- receive_from(Port,D,N-1);
- X ->
- io:format("Got garbage ~p~n",[X])
+ {Port, {data, {eol, _Data}}} ->
+ receive_from(Port, D, N - 1);
+ X ->
+ io:format("Got garbage ~p~n", [X])
end.
mangle(PP) when is_list(PP) ->
- Port = open_port({spawn,PP},[{line,100}]),
+ Port = open_port({spawn, PP}, [{line, 100}]),
mangle(Port);
mangle(Port) ->
- send_to(Port, "ABCDEFGHIJ" ++ io_lib:nl(),1),
- receive_from(Port,"ABCDEFGHIJ",1),
+ send_to(Port, "ABCDEFGHIJ" ++ io_lib:nl(), 1),
+ receive_from(Port, "ABCDEFGHIJ", 1),
mangle(Port).
-explode(0,_) ->
+explode(0, _) ->
ok;
-explode(N,PP) ->
- spawn(?MODULE,mangle,[PP]),
- explode(N-1,PP).
+explode(N, PP) ->
+ spawn(?MODULE, mangle, [PP]),
+ explode(N - 1, PP).
-start_heart_stress([NewName,PortProgram]) ->
- explode(10,atom_to_list(PortProgram)),
- NewCmd = erl() ++ name(NewName),
+start_heart_stress([NewName, PortProgram]) ->
+ explode(10, atom_to_list(PortProgram)),
+ NewCmd = erl() ++ name(NewName),
%%io:format("~p~n",[NewCmd]),
receive
after 10000 ->
- heart:set_cmd(NewCmd),
- halt()
+ heart:set_cmd(NewCmd),
+ halt()
end.
suicide_by_heart() ->
%%io:format("Suicide starting...~n"),
- open_port({spawn,"heart -ht 11 -pid "++os:getpid()},[{packet,2}]),
+ open_port({spawn, "heart -ht 11 -pid " ++ os:getpid()}, [{packet, 2}]),
receive X -> X end,
%% Just hang and wait for heart to timeout
receive
- {makaronipudding} ->
- sallad
+ {makaronipudding} ->
+ sallad
end.
non_suicide_by_heart() ->
- P = open_port({spawn,"heart -ht 11 -pid "++os:getpid()},
- [exit_status, {env, [{"HEART_NO_KILL", "TRUE"}]},
- {packet,2}]),
+ P = open_port({spawn, "heart -ht 11 -pid " ++ os:getpid()},
+ [exit_status, {env, [{"HEART_NO_KILL", "TRUE"}]},
+ {packet, 2}]),
receive X -> X end,
%% Just hang and wait for heart to timeout
receive
- {P,{exit_status,_}} ->
- ok
+ {P, {exit_status, _}} ->
+ ok
after
- 20000 ->
- exit(timeout)
+ 20000 ->
+ exit(timeout)
end.
+exhaust_atoms() ->
+ Set = lists:seq($a,$z),
+ [list_to_atom([A,B,C,D,E]) || A <- Set, B <- Set, C <- Set, E <- Set, D <- Set].
%% generate a module from binary
generate(Module, Attributes, FunStrings) ->
FunForms = function_forms(FunStrings),
- Forms = [
- {attribute,a(1),module,Module},
- {attribute,a(2),export,[FA || {FA,_} <- FunForms]}
- ] ++ [{attribute, a(3), A, V}|| {A, V} <- Attributes] ++
- [ Function || {_, Function} <- FunForms],
+ Forms = [
+ {attribute, a(1), module, Module},
+ {attribute, a(2), export, [FA || {FA, _} <- FunForms]}
+ ] ++ [{attribute, a(3), A, V} || {A, V} <- Attributes] ++
+ [Function || {_, Function} <- FunForms],
{ok, Module, Bin} = compile:forms(Forms),
Bin.
@@ -671,9 +571,9 @@ a(L) ->
erl_anno:new(L).
function_forms([]) -> [];
-function_forms([S|Ss]) ->
- {ok, Ts,_} = erl_scan:string(S),
+function_forms([S | Ss]) ->
+ {ok, Ts, _} = erl_scan:string(S),
{ok, Form} = erl_parse:parse_form(Ts),
- Fun = element(3, Form),
+ Fun = element(3, Form),
Arity = element(4, Form),
- [{{Fun,Arity}, Form}|function_forms(Ss)].
+ [{{Fun, Arity}, Form} | function_forms(Ss)].
diff --git a/lib/kernel/test/ignore_cores.erl b/lib/kernel/test/ignore_cores.erl
index fde65bf5c4..1f223df914 100644
--- a/lib/kernel/test/ignore_cores.erl
+++ b/lib/kernel/test/ignore_cores.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -94,7 +94,7 @@ setup(Suite, Testcase, Config, SetCwd) when is_atom(Suite),
end,
ok = file:write_file(filename:join([IgnDir, "ignore_core_files"]), <<>>),
%% cores are dumped in /cores on MacOS X
- CoresDir = case {test_server:os_type(), filelib:is_dir("/cores")} of
+ CoresDir = case {os:type(), filelib:is_dir("/cores")} of
{{unix,darwin}, true} ->
filelib:fold_files("/cores",
"^core.*$",
diff --git a/lib/kernel/test/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl
index cf3ff47325..6298130a09 100644
--- a/lib/kernel/test/inet_SUITE.erl
+++ b/lib/kernel/test/inet_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -47,6 +47,7 @@
lookup_bad_search_option/1,
getif/1,
getif_ifr_name_overflow/1,getservbyname_overflow/1, getifaddrs/1,
+ is_ip_address/1,
parse_strict_address/1, ipv4_mapped_ipv6_address/1, ntoa/1,
simple_netns/1, simple_netns_open/1,
add_del_host/1, add_del_host_v6/1,
@@ -71,7 +72,7 @@ all() ->
[
t_gethostbyaddr, t_gethostbyname, t_getaddr,
t_gethostbyaddr_v6, t_gethostbyname_v6, t_getaddr_v6,
- ipv4_to_ipv6, host_and_addr, {group, parse},
+ ipv4_to_ipv6, host_and_addr, is_ip_address, {group, parse},
t_gethostnative, gethostnative_parallell, cname_loop,
missing_hosts_reload, hosts_file_quirks,
gethostnative_debug_level, gethostnative_soft_restart,
@@ -103,7 +104,7 @@ socknames_cases() ->
socknames_udp
].
-%% Required configuaration
+%% Required configuration
required(v4) ->
[{require, test_host_ipv4_only},
{require, test_dummy_host}];
@@ -521,7 +522,7 @@ ipv4_to_ipv6(Config) when is_list(Config) ->
%% Test looking up hosts and addresses. Use 'ypcat hosts'
-%% or the local eqivalent to find all hosts.
+%% or the local equivalent to find all hosts.
host_and_addr() ->
?P("host_and_addr -> entry"),
@@ -795,18 +796,18 @@ parse_address(Config) when is_list(Config) ->
t_parse_address(Func, _Reversable, []) ->
io:format("~p done.~n", [Func]),
ok;
-t_parse_address(Func, Reversable, [{Addr,String}|L]) ->
+t_parse_address(Func, Reversible, [{Addr,String}|L]) ->
io:format("~p = ~p.~n", [Addr,String]),
{ok,Addr} = inet:Func(String),
- case Reversable of
+ case Reversible of
true ->String = inet:ntoa(Addr);
false -> ok
end,
- t_parse_address(Func, Reversable, L);
-t_parse_address(Func, Reversable, [String|L]) ->
+ t_parse_address(Func, Reversible, L);
+t_parse_address(Func, Reversible, [String|L]) ->
io:format("~p.~n", [String]),
{error,einval} = inet:Func(String),
- t_parse_address(Func, Reversable, L).
+ t_parse_address(Func, Reversible, L).
parse_strict_address(Config) when is_list(Config) ->
{ok, {127,0,0,1}} =
@@ -816,6 +817,63 @@ parse_strict_address(Config) when is_list(Config) ->
{ok, {3089,3106,23603,50240,0,0,119,136}} =
inet:parse_strict_address("c11:0c22:5c33:c440::077:0088").
+is_ip_address(Config) when is_list(Config) ->
+ IPv4Addresses = [
+ {0, 0, 0, 0},
+ {255, 255, 255, 255}
+ ],
+ IPv6Addresses = [
+ {0, 0, 0, 0, 0, 0, 0, 0},
+ {16#ffff, 16#ffff, 16#ffff, 16#ffff, 16#ffff, 16#ffff, 16#ffff, 16#ffff}
+ ],
+ NonIPAddresses = [
+ foo,
+ "0.0.0.0",
+ {},
+ {0},
+ {0, 0},
+ {0, 0, 0},
+ {0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, foo},
+ {0, 0, 0, 0, 0, 0, 0, foo},
+ {0, 0, 0, 256},
+ {0, 0, 256, 0},
+ {0, 256, 0, 0},
+ {256, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, 16#10000},
+ {0, 0, 0, 0, 0, 0, 16#10000, 0},
+ {0, 0, 0, 0, 0, 16#10000, 0, 0},
+ {0, 0, 0, 0, 16#10000, 0, 0, 0},
+ {0, 0, 0, 16#10000, 0, 0, 0, 0},
+ {0, 0, 16#10000, 0, 0, 0, 0, 0},
+ {0, 16#10000, 0, 0, 0, 0, 0, 0},
+ {16#10000, 0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, -1},
+ {0, 0, -1, 0},
+ {0, -1, 0, 0},
+ {-1, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0, -1},
+ {0, 0, 0, 0, 0, 0, -1, 0},
+ {0, 0, 0, 0, 0, -1, 0, 0},
+ {0, 0, 0, 0, -1, 0, 0, 0},
+ {0, 0, 0, -1, 0, 0, 0, 0},
+ {0, 0, -1, 0, 0, 0, 0, 0},
+ {0, -1, 0, 0, 0, 0, 0, 0},
+ {-1, 0, 0, 0, 0, 0, 0, 0}
+ ],
+
+ true = lists:all(fun inet:is_ipv4_address/1, IPv4Addresses),
+ false = lists:any(fun inet:is_ipv4_address/1, IPv6Addresses ++ NonIPAddresses),
+
+ true = lists:all(fun inet:is_ipv6_address/1, IPv6Addresses),
+ false = lists:any(fun inet:is_ipv6_address/1, IPv4Addresses ++ NonIPAddresses),
+
+ true = lists:all(fun inet:is_ip_address/1, IPv6Addresses ++ IPv4Addresses),
+ false = lists:any(fun inet:is_ip_address/1, NonIPAddresses).
+
ipv4_mapped_ipv6_address(Config) when is_list(Config) ->
{D1,D2,D3,D4} = IPv4Address =
{rand:uniform(256) - 1,
@@ -907,13 +965,11 @@ gethostnative_parallell(Config) when is_list(Config) ->
end.
do_gethostnative_parallell() ->
- PA = filename:dirname(code:which(?MODULE)),
- {ok,Node} = test_server:start_node(gethost_parallell, slave,
- [{args, "-pa " ++ PA}]),
+ {ok,Peer,Node} = ?CT_PEER(),
ok = rpc:call(Node, ?MODULE, parallell_gethost, []),
receive after 10000 -> ok end,
pong = net_adm:ping(Node),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
parallell_gethost() ->
@@ -1044,9 +1100,7 @@ missing_hosts_reload(Config) when is_list(Config) ->
ok = file:write_file(InetRc, "{hosts_file, \"" ++ HostsFile ++ "\"}.\n"),
{error, enoent} = file:read_file_info(HostsFile),
% start a node
- Pa = filename:dirname(code:which(?MODULE)),
- {ok, TestNode} = test_server:start_node(?MODULE, slave,
- [{args, "-pa " ++ Pa ++ " -kernel inetrc '\"" ++ InetRc ++ "\"'"}]),
+ {ok, Peer, TestNode} = ?CT_PEER(["-kernel", "inetrc", "\"" ++ InetRc ++ "\""]),
% ensure it has our RC
Rc = rpc:call(TestNode, inet_db, get_rc, []),
{hosts_file, HostsFile} = lists:keyfind(hosts_file, 1, Rc),
@@ -1060,7 +1114,7 @@ missing_hosts_reload(Config) when is_list(Config) ->
{ok,{hostent,"somehost",[],inet,4,[{1,2,3,4}]}} =
rpc:call(TestNode, inet_hosts, gethostbyname, ["somehost"]),
% cleanup
- true = test_server:stop_node(TestNode).
+ peer:stop(Peer).
%% The /etc/hosts file format and limitations is quite undocumented.
@@ -1138,9 +1192,7 @@ hosts_file_quirks(Config) when is_list(Config) ->
ok = file:write_file(InetRc, "{hosts_file, \"" ++ HostsFile ++ "\"}.\n"),
%%
%% start a node
- Pa = filename:dirname(code:which(?MODULE)),
- {ok, TestNode} = test_server:start_node(?MODULE, slave,
- [{args, "-pa " ++ Pa ++ " -kernel inetrc '\"" ++ InetRc ++ "\"'"}]),
+ {ok, Peer, TestNode} = ?CT_PEER(["-kernel", "inetrc", "\"" ++ InetRc ++ "\""]),
%% ensure it has our RC
Rc = rpc:call(TestNode, inet_db, get_rc, []),
{hosts_file, HostsFile} = lists:keyfind(hosts_file, 1, Rc),
@@ -1187,7 +1239,7 @@ hosts_file_quirks(Config) when is_list(Config) ->
hosts_file_quirks_verify(TestNode, V1),
%%
%% cleanup
- true = test_server:stop_node(TestNode).
+ peer:stop(Peer).
hosts_file_quirks_verify(_TestNode, Vs) ->
hosts_file_quirks_verify(_TestNode, Vs, true).
@@ -1302,7 +1354,7 @@ gethostnative_control(Config, Opts) ->
{skipped, "Not running native gethostbyname"}
end;
_ ->
- {skipped, "Native not only lookup metod"}
+ {skipped, "Native not only lookup method"}
end.
gethostnative_control_1(
@@ -1916,9 +1968,14 @@ do_socknames_tcp0(_Config) ->
?P("Test socknames for 'new' socket (=socket nif)"),
do_socknames_tcp1([{inet_backend, socket}])
catch
- error : notsup ->
+ error:notsup ->
?P("Skip test of socknames for 'new' socket (=socket nif)"),
- ok
+ ok;
+ error:undef:ST ->
+ case ST of
+ [{prim_socket,info,[],_}|_] ->
+ ?P("Skip test of socknames for 'new' socket (=socket nif)")
+ end
end.
@@ -1995,7 +2052,12 @@ do_socknames_udp0(_Config) ->
catch
error : notsup ->
?P("Skip test of socknames for 'new' socket (=socket nif)"),
- ok
+ ok;
+ error:undef:ST ->
+ case ST of
+ [{prim_socket,info,[],_}|_] ->
+ ?P("Skip test of socknames for 'new' socket (=socket nif)")
+ end
end.
diff --git a/lib/kernel/test/inet_res_SUITE.erl b/lib/kernel/test/inet_res_SUITE.erl
index 5ac88f2e4a..60589c33dc 100644
--- a/lib/kernel/test/inet_res_SUITE.erl
+++ b/lib/kernel/test/inet_res_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,11 +27,12 @@
-include("kernel_test_lib.hrl").
--export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
- init_per_group/2,end_per_group/2,
+-export([all/0, suite/0, groups/0, init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
init_per_testcase/2, end_per_testcase/2
]).
--export([basic/1, resolve/1, edns0/1, txt_record/1, files_monitor/1,
+-export([basic/1, name_addr_and_cached/1, resolve/1,
+ edns0/1, txt_record/1, files_monitor/1,
nxdomain_reply/1, last_ms_answer/1, intermediate_error/1,
servfail_retry_timeout_default/1, servfail_retry_timeout_1000/1,
label_compression_limit/1
@@ -71,7 +72,8 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- [basic, resolve, edns0, txt_record, files_monitor,
+ [basic, resolve, name_addr_and_cached,
+ edns0, txt_record, files_monitor,
nxdomain_reply, last_ms_answer,
intermediate_error,
servfail_retry_timeout_default, servfail_retry_timeout_1000,
@@ -123,13 +125,14 @@ end_per_group(_GroupName, Config) ->
zone_dir(TC) ->
case TC of
- basic -> otptest;
- resolve -> otptest;
- edns0 -> otptest;
- files_monitor -> otptest;
- nxdomain_reply -> otptest;
- last_ms_answer -> otptest;
- intermediate_error ->
+ basic -> otptest;
+ name_addr_and_cached -> otptest;
+ resolve -> otptest;
+ edns0 -> otptest;
+ files_monitor -> otptest;
+ nxdomain_reply -> otptest;
+ last_ms_answer -> otptest;
+ intermediate_error ->
{internal,
#{rcode => ?REFUSED}};
servfail_retry_timeout_default ->
@@ -171,7 +174,7 @@ init_per_testcase(Func, Config) ->
[{nameserver, NsSpec}, {res_lookup, Lookup} | Config]
catch
SkipReason ->
- ?P("init_per_testcase -> catched:"
+ ?P("init_per_testcase -> caught:"
"~n SkipReason: ~p", [SkipReason]),
{skip, SkipReason}
end.
@@ -511,68 +514,341 @@ basic(Config) when is_list(Config) ->
NS = ns(Config),
Name = "ns.otptest",
NameC = caseflip(Name),
- IP = {127,0,0,254},
+ IP1 = {127,0,0,253},
+ IP2 = {127,0,0,254},
%%
%% nslookup
{ok,Msg1} = inet_res:nslookup(Name, in, a, [NS]),
?P("nslookup with ~p: ~n ~p", [Name, Msg1]),
- [RR1] = inet_dns:msg(Msg1, anlist),
- IP = inet_dns:rr(RR1, data),
+ [RR1, RR2] = lists:sort(inet_dns:msg(Msg1, anlist)),
+ IP1 = inet_dns:rr(RR1, data),
+ IP2 = inet_dns:rr(RR2, data),
Bin1 = inet_dns:encode(Msg1),
%%io:format("Bin1 = ~w~n", [Bin1]),
{ok,Msg1} = inet_dns:decode(Bin1),
%% Now with scrambled case
{ok,Msg1b} = inet_res:nslookup(NameC, in, a, [NS]),
?P("nslookup with ~p: ~n ~p", [NameC, Msg1b]),
- [RR1b] = inet_dns:msg(Msg1b, anlist),
- IP = inet_dns:rr(RR1b, data),
+ [RR1b, RR2b] = lists:sort(inet_dns:msg(Msg1b, anlist)),
+ IP1 = inet_dns:rr(RR1b, data),
+ IP2 = inet_dns:rr(RR2b, data),
Bin1b = inet_dns:encode(Msg1b),
%%io:format("Bin1b = ~w~n", [Bin1b]),
{ok,Msg1b} = inet_dns:decode(Bin1b),
true =
(tolower(inet_dns:rr(RR1, domain))
=:= tolower(inet_dns:rr(RR1b, domain))),
+ true =
+ (tolower(inet_dns:rr(RR2, domain))
+ =:= tolower(inet_dns:rr(RR2b, domain))),
%%
%% resolve
{ok,Msg2} = inet_res:resolve(Name, in, a, [{nameservers,[NS]},verbose]),
?P("resolve with ~p: ~n ~p", [Name, Msg2]),
- [RR2] = inet_dns:msg(Msg2, anlist),
- IP = inet_dns:rr(RR2, data),
+ [RR1c, RR2c] = lists:sort(inet_dns:msg(Msg2, anlist)),
+ IP1 = inet_dns:rr(RR1c, data),
+ IP2 = inet_dns:rr(RR2c, data),
Bin2 = inet_dns:encode(Msg2),
%%io:format("Bin2 = ~w~n", [Bin2]),
{ok,Msg2} = inet_dns:decode(Bin2),
%% Now with scrambled case
{ok,Msg2b} = inet_res:resolve(NameC, in, a, [{nameservers,[NS]},verbose]),
?P("resolve with ~p: ~n ~p", [NameC, Msg2b]),
- [RR2b] = inet_dns:msg(Msg2b, anlist),
- IP = inet_dns:rr(RR2b, data),
+ [RR1d, RR2d] = lists:sort(inet_dns:msg(Msg2b, anlist)),
+ IP1 = inet_dns:rr(RR1d, data),
+ IP2 = inet_dns:rr(RR2d, data),
Bin2b = inet_dns:encode(Msg2b),
%%io:format("Bin2b = ~w~n", [Bin2b]),
{ok,Msg2b} = inet_dns:decode(Bin2b),
true =
- (tolower(inet_dns:rr(RR2, domain))
- =:= tolower(inet_dns:rr(RR2b, domain))),
+ (tolower(inet_dns:rr(RR1c, domain))
+ =:= tolower(inet_dns:rr(RR1d, domain))),
+ true =
+ (tolower(inet_dns:rr(RR2c, domain))
+ =:= tolower(inet_dns:rr(RR2d, domain))),
%%
%% lookup
?P("lookup"),
- [IP] = inet_res:lookup(Name, in, a, [{nameservers,[NS]},verbose]),
- [IP] = inet_res:lookup(NameC, in, a, [{nameservers,[NS]},verbose]),
+ [IP1, IP2] =
+ lists:sort(
+ inet_res:lookup(Name, in, a, [{nameservers,[NS]},verbose])),
+ [IP1, IP2] =
+ lists:sort(
+ inet_res:lookup(NameC, in, a, [{nameservers,[NS]},verbose])),
%%
%% gethostbyname
?P("gethostbyname"),
- {ok,#hostent{h_addr_list=[IP]}} = inet_res:gethostbyname(Name),
- {ok,#hostent{h_addr_list=[IP]}} = inet_res:gethostbyname(NameC),
+ {ok,#hostent{h_addr_list=IPs1}} = inet_res:gethostbyname(Name),
+ [IP1, IP2] = lists:sort(IPs1),
+ {ok,#hostent{h_addr_list=IPs2}} = inet_res:gethostbyname(NameC),
+ [IP1, IP2] = lists:sort(IPs2),
%%
%% getbyname
?P("getbyname"),
- {ok,#hostent{h_addr_list=[IP]}} = inet_res:getbyname(Name, a),
- {ok,#hostent{h_addr_list=[IP]}} = inet_res:getbyname(NameC, a),
+ {ok,#hostent{h_addr_list=IPs3}} = inet_res:getbyname(Name, a),
+ [IP1, IP2] = lists:sort(IPs3),
+ {ok,#hostent{h_addr_list=IPs4}} = inet_res:getbyname(NameC, a),
+ [IP1, IP2] = lists:sort(IPs4),
?P("end"),
ok.
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Check that lookup of names and addresses works the same
+%% also when cached, by simply repeating the lookups
+
+name_addr_and_cached(Config) when is_list(Config) ->
+ ?P("begin"),
+
+%%% dbg:tracer(),
+%%% dbg:p(all, c),
+%%% dbg:tpl(inet_res, do_query, cx),
+
+ NS = ns(Config),
+ Domain = "otptest",
+ Options =
+ [{lookup, [dns]},
+ {resolv_conf, []},
+ {hosts_file, []},
+ {domain, Domain},
+ {nameservers, [NS]},
+ {search, [Domain]},
+ {alt_nameservers, []},
+ {inet6, false},
+ {usevc, false},
+ {edns, 0}],
+ SavedOptions =
+ [{Option, inet_db:res_option(Option)}
+ || {Option, _Value} <- Options],
+ [inet_db:res_option(Option, Value)
+ || {Option, Value} <- Options],
+ try
+ ?P("first pass"),
+ %% Flip character case randomly
+ name_addr(Domain, fun caseflip/1),
+ %%
+ ?P("second pass"),
+ %% Use only character upper case,
+ %% should get identical results from the cache
+ name_addr(Domain, fun toupper/1)
+ after
+ [ok = inet_db:res_option(Option, Value)
+ || {Option, Value} <- SavedOptions]
+ end,
+ ?P("done"),
+ ok.
+
+name_addr(Domain, CFlip) ->
+%% RDomain4 = "0.0.127.in-addr.arpa",
+%% RDomain6 = "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa",
+ H4 =
+ #hostent{
+ h_addrtype = inet,
+ h_length = 4},
+ H6 =
+ #hostent{
+ h_addrtype = inet6,
+ h_length = 16},
+ H_mx = CFlip("mx"),
+ H_mx_ = CFlip("mx."),
+ IP4_mx = {127,0,0,10},
+ %%
+ H_resolve = CFlip("resolve"),
+ H_resolve_ = CFlip("resolve."),
+ H_cname_resolve = CFlip("cname.resolve"),
+ H_cname_resolve_ = CFlip("cname.resolve."),
+ %%
+ IP4_resolve = {127,0,0,28},
+ IP6_resolve = {0,0,0,0,0,0,127 bsl 8,28},
+ IP64_resolve = {0,0,0,0,0,16#ffff,127 bsl 8,28},
+ %%
+ H_ns = CFlip("ns"),
+ H_ns_ = CFlip("ns."),
+ IP4_ns_1 = {127,0,0,253},
+ IP4_ns_2 = {127,0,0,254},
+ IP6_ns_1 = {0,0,0,0,0,0,127 bsl 8,253},
+ IP6_ns_2 = {0,0,0,0,0,0,127 bsl 8,254},
+ IP64_ns_1 = {0,0,0,0,0,16#ffff,127 bsl 8,253},
+ IP64_ns_2 = {0,0,0,0,0,16#ffff,127 bsl 8,254},
+ Lookups =
+ %% The search list is [Domain] so a lookup of a short
+ %% name should return the fully qualified name with
+ %% Domain appended.
+ %%
+ %% Lookup results should have the same character case
+ %% as the query. Both for short (search) lookups and
+ %% for full name lookups.
+ %%
+ %% Lookup via a CNAME record should return the
+ %% result as stored in DNS but the CNAME should be
+ %% returned as an alias with the query character case
+ %% preserved.
+ %%
+ %% Address lookups (reverse/PTR lookups) can only
+ %% return the one address we looked up and the
+ %% fully qualified name as in DNS, and no aliases.
+ %%
+ %% IPv6 address lookups in ::ffff.A.B.C.D
+ %% (IPv4-compatible IPv6 addresses) should be
+ %% internally done as IPv4 lookups by the client,
+ %% without the caller noticing.
+ %%
+ [{{H_mx, inet}, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = H_mx++[$.|Domain],
+ h_addr_list = [IP4_mx]}},
+ {{H_mx_++Domain, inet}, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = H_mx_++Domain,
+ h_addr_list = [IP4_mx]}},
+ {{H_resolve, inet}, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = H_resolve++[$.|Domain],
+ h_addr_list = [IP4_resolve]}},
+ {{H_resolve_++Domain, inet}, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = H_resolve_++Domain,
+ h_addr_list = [IP4_resolve]}},
+ {{H_cname_resolve, inet}, fun lower_h_name/1, ?LINE,
+ H4#hostent{
+ h_name = "resolve."++Domain,
+ h_aliases = [H_cname_resolve++[$.|Domain]],
+ h_addr_list = [IP4_resolve]}},
+ {{H_cname_resolve_++Domain, inet}, fun lower_h_name/1, ?LINE,
+ H4#hostent{
+ h_name = "resolve."++Domain,
+ h_aliases = [H_cname_resolve_++Domain],
+ h_addr_list = [IP4_resolve]}},
+ %%
+ {{H_ns, inet}, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = H_ns++[$.|Domain],
+ h_addr_list = [IP4_ns_1,IP4_ns_2]}},
+ {{H_ns_++Domain, inet}, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = H_ns_++Domain,
+ h_addr_list = [IP4_ns_1,IP4_ns_2]}},
+ %%
+ {IP4_ns_2, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = "ns."++Domain,
+ h_addr_list = [IP4_ns_2]}},
+ {IP4_ns_1, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = "ns."++Domain,
+ h_addr_list = [IP4_ns_1]}},
+ {IP4_mx, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = "mx."++Domain,
+ h_addr_list = [IP4_mx]}},
+ {IP4_mx, fun norm/1, ?LINE,
+ H4#hostent{
+ h_name = "mx."++Domain,
+ h_addr_list = [IP4_mx]}},
+ %%
+ %%
+ %%
+ {{H_resolve_++Domain, inet6}, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = H_resolve_++Domain,
+ h_addr_list = [IP6_resolve]}},
+ {{H_resolve, inet6}, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = H_resolve++[$.|Domain],
+ h_addr_list = [IP6_resolve]}},
+ {{H_cname_resolve, inet6}, fun lower_h_name/1, ?LINE,
+ H6#hostent{
+ h_name = "resolve."++Domain,
+ h_aliases = [H_cname_resolve++[$.|Domain]],
+ h_addr_list = [IP6_resolve]}},
+ {{H_cname_resolve_++Domain, inet6}, fun lower_h_name/1, ?LINE,
+ H6#hostent{
+ h_name = "resolve."++Domain,
+ h_aliases = [H_cname_resolve_++Domain],
+ h_addr_list = [IP6_resolve]}},
+ {IP6_resolve, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = "resolve."++Domain,
+ h_addr_list = [IP6_resolve]}},
+ {IP64_resolve, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = "resolve."++Domain,
+ h_addr_list = [IP64_resolve]}},
+ %%
+ {{H_ns, inet6}, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = H_ns++[$.|Domain],
+ h_addr_list =
+ [IP6_ns_1,
+ IP6_ns_2]}},
+ {{H_ns_++Domain, inet6}, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = H_ns_++Domain,
+ h_addr_list =
+ [IP6_ns_1,
+ IP6_ns_2]}},
+ {IP6_ns_1, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = "ns."++Domain,
+ h_addr_list = [IP6_ns_1]}},
+ {IP6_ns_2, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = "ns."++Domain,
+ h_addr_list = [IP6_ns_2]}},
+ {IP64_ns_1, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = "ns."++Domain,
+ h_addr_list = [IP64_ns_1]}},
+ {IP64_ns_2, fun norm/1, ?LINE,
+ H6#hostent{
+ h_name = "ns."++Domain,
+ h_addr_list = [IP64_ns_2]}}
+ %%
+ %%
+ %%
+ ],
+ Results =
+ [case Target of
+ {H, T} ->
+ inet_res:gethostbyname(H, T);
+ Addr ->
+ inet_res:gethostbyaddr(Addr)
+ end || {Target, _TFun, _Line, _HE} <- Lookups],
+ ?P("inet_cache: ~p~n", [ets:tab2list(inet_cache)]),
+ [] = merge_results(Lookups, Results),
+ ok.
+
+lower_h_name(#hostent{h_name = HName} = HE) ->
+ norm(HE#hostent{h_name = tolower(HName)}).
+
+%%%lower_h_aliases(#hostent{h_aliases = HAliases} = HE) ->
+%%% HE#hostent{
+%%% h_aliases = [tolower(HAlias) || HAlias <- HAliases]}.
+
+norm(#hostent{h_addr_list = Addrs} = HE) ->
+ HE#hostent{h_addr_list = lists:sort(Addrs)}.
+
+merge_results([], []) ->
+ [];
+merge_results([{H_T, TFun, Line, HE} | Lookups], [Result | Results]) ->
+ case
+ case Result of
+ {ok, ResultHE} ->
+ {ok, TFun(ResultHE)};
+ _ ->
+ Result
+ end
+ of
+ {ok, HE} ->
+ merge_results(Lookups, Results);
+ Other ->
+ [{{Line, H_T, HE}, Other} | merge_results(Lookups, Results)]
+ end.
+
+
+%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
%% Lookup different records using resolve/2..4.
resolve(Config) when is_list(Config) ->
?P("begin"),
@@ -965,7 +1241,7 @@ last_ms_answer(Config) when is_list(Config) ->
PSpec = proxy_start(last_ms_answer, NS),
ProxyNS = proxy_ns(PSpec),
%%
- %% resolve; whith short timeout to trigger Timeout =:= 0 in inet_res
+ %% resolve; with short timeout to trigger Timeout =:= 0 in inet_res
{error,timeout} =
inet_res:resolve(
Name, in, a, [{nameservers,[ProxyNS]},verbose], Time + 10),
@@ -1128,42 +1404,53 @@ timestamp() ->
erlang:monotonic_time(milli_seconds).
-%% Case flip helper
+%% Case flip helper, randomly flips the case of about every second [a-zA-Z]
+
+-compile({inline, [caseflip/3]}).
-caseflip([C|Cs]) when is_integer(C), $a =< C, C =< $z ->
- [(C - $a + $A)|caseflip_skip(Cs)];
-caseflip([C|Cs]) when is_integer(C), $A =< C, C =< $Z ->
- [(C - $A + $a)|caseflip_skip(Cs)];
-caseflip([C|Cs]) ->
- [C|caseflip(Cs)];
+caseflip([C | Cs]) when is_integer(C), $a =< C, C =< $z ->
+ caseflip(Cs, C, $a - $A);
+caseflip([C | Cs]) when is_integer(C), $A =< C, C =< $Z ->
+ caseflip(Cs, C, $A - $a);
+caseflip([C | Cs]) ->
+ [C | caseflip(Cs)];
caseflip([]) ->
[].
+%%
+caseflip(Cs, C, Diff) ->
+ [case 0.5 =< rand:uniform() of
+ true ->
+ C - Diff;
+ false ->
+ C
+ end | caseflip(Cs)].
-caseflip_skip([C|Cs]) when is_integer(C), $a =< C, C =< $z ->
- [C|caseflip(Cs)];
-caseflip_skip([C|Cs]) when is_integer(C), $A =< C, C =< $Z ->
- [C|caseflip(Cs)];
-caseflip_skip([C|Cs]) ->
- [C|caseflip_skip(Cs)];
-caseflip_skip([]) ->
- [].
-tolower_email([$.|Cs]) ->
- [$.|tolower(Cs)];
-tolower_email([C|Cs]) ->
- [C|tolower_email(Cs)].
+tolower_email([$. | Cs]) ->
+ [$. | tolower(Cs)];
+tolower_email([C | Cs]) ->
+ [C | tolower_email(Cs)].
-%% Case fold to lower case according to RFC 4343
+%% Case fold according to RFC 4343
%%
-tolower([C|Cs]) when is_integer(C) ->
+tolower([C | Cs]) when is_integer(C) ->
if $A =< C, C =< $Z ->
- [(C - $A + $a)|tolower(Cs)];
+ [(C - $A + $a) | tolower(Cs)];
true ->
- [C|tolower(Cs)]
+ [C | tolower(Cs)]
end;
tolower([]) ->
[].
+toupper([C | Cs]) when is_integer(C) ->
+ if $a =< C, C =< $z ->
+ [(C - $a + $A) | toupper(Cs)];
+ true ->
+ [C | toupper(Cs)]
+ end;
+toupper([]) ->
+ [].
+
-compile({inline,[ok/1]}).
ok(ok) -> ok;
ok({ok,X}) -> X;
diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone b/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone
index 81e14217ba..73812abda9 100644
--- a/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone
+++ b/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone
@@ -10,3 +10,5 @@ $TTL 3600
IN MX 10 mx.otptest.
c.1 IN PTR resolve.otptest.
+d.f IN CNAME e.f
+e.f IN PTR ns.otptest.
diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone b/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone
index bae50a9eec..7a09e4bff8 100644
--- a/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone
+++ b/lib/kernel/test/inet_res_SUITE_data/otptest/0.0.127.in-addr.arpa.zone
@@ -24,4 +24,5 @@ $TTL 3600
28 IN PTR resolve.otptest.
+253 IN CNAME 254
254 IN PTR ns.otptest.
diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone b/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone
index 51268f49ae..9e4a3513f8 100644
--- a/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone
+++ b/lib/kernel/test/inet_res_SUITE_data/otptest/otptest.zone
@@ -32,6 +32,9 @@ mx6-5678901234567890123456789012345678 IN A 127.0.0.26
mx7-5678901234567890123456789012345678 IN A 127.0.0.27
ns IN A 127.0.0.254
+ns IN AAAA ::127.0.0.254
+ns IN A 127.0.0.253
+ns IN AAAA ::127.0.0.253
resolve IN A 127.0.0.28
resolve IN AAAA ::127.0.0.28
cname.resolve IN CNAME resolve
diff --git a/lib/kernel/test/init_SUITE.erl b/lib/kernel/test/init_SUITE.erl
index 34db4d8080..bc3882b862 100644
--- a/lib/kernel/test/init_SUITE.erl
+++ b/lib/kernel/test/init_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
-module(init_SUITE).
-include_lib("common_test/include/ct.hrl").
+-include_lib("stdlib/include/assert.hrl").
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2]).
@@ -28,15 +29,12 @@
many_restarts/0, many_restarts/1, restart_with_mode/1,
get_plain_arguments/1,
reboot/1, stop_status/1, stop/1, get_status/1, script_id/1,
+ dot_erlang/1,
find_system_processes/0]).
-export([boot1/1, boot2/1]).
-export([init_per_testcase/2, end_per_testcase/2]).
--export([init/1, fini/1]).
-
--define(DEFAULT_TIMEOUT_SEC, 100).
-
%%-----------------------------------------------------------------
%% Test suite for init. (Most code is run during system start/stop.
%% Should be started in a CC view with:
@@ -50,7 +48,7 @@ all() ->
[get_arguments, get_argument, boot_var,
many_restarts, restart_with_mode,
get_plain_arguments, restart, stop_status, get_status, script_id,
- {group, boot}].
+ dot_erlang, {group, boot}].
groups() ->
[{boot, [], [boot1, boot2]}].
@@ -74,27 +72,18 @@ init_per_testcase(_Func, Config) ->
end_per_testcase(_Func, _Config) ->
ok.
-init(Config) when is_list(Config) ->
- Config.
-
-fini(Config) when is_list(Config) ->
- Host = list_to_atom(from($@, atom_to_list(node()))),
- Node = list_to_atom(lists:concat([init_test, "@", Host])),
- stop_node(Node),
- Config.
-
get_arguments(Config) when is_list(Config) ->
Args = args(),
- {ok, Node} = start_node(init_test, Args),
+ {ok, Peer, Node} = ?CT_PEER(Args),
case rpc:call(Node, init, get_arguments, []) of
Arguments when is_list(Arguments) ->
- stop_node(Node),
+ peer:stop(Peer),
check_a(Arguments),
check_b(Arguments),
check_c(Arguments),
check_d(Arguments);
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail(get_arguments)
end,
ok.
@@ -169,43 +158,43 @@ check_d(Args) ->
get_argument(Config) when is_list(Config) ->
Args = args(),
- {ok, Node} = start_node(init_test, Args),
+ {ok, Peer, Node} = ?CT_PEER(Args),
case rpc:call(Node, init, get_argument, [b]) of
{ok, [["hej", "hopp"],["san", "sa"]]} ->
ok;
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail({get_argument, b})
end,
case rpc:call(Node, init, get_argument, [a]) of
{ok, [["kalle"]]} ->
ok;
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail({get_argument, a})
end,
case rpc:call(Node, init, get_argument, [c]) of
{ok, [["4", "5", "6"], ["7", "8", "9"]]} ->
ok;
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail({get_argument, c})
end,
case rpc:call(Node, init, get_argument, [d]) of
{ok, [[]]} ->
ok;
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail({get_argument, d})
end,
case rpc:call(Node, init, get_argument, [e]) of
error ->
ok;
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail({get_argument, e})
end,
- stop_node(Node),
+ peer:stop(Peer),
ok.
get_plain_arguments(Config) when is_list(Config) ->
@@ -221,15 +210,15 @@ get_plain_arguments(Config) when is_list(Config) ->
"fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2fjdkfjdkfjfdaa2",
true = (length(Longstring) > 255),
Args = long_args(Longstring),
- {ok, Node} = start_node(init_test, Args),
+ {ok, Peer, Node} = ?CT_PEER(Args),
case rpc:call(Node, init, get_plain_arguments, []) of
["a", "b", "c", Longstring] ->
ok;
As ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail({get_argument, As})
end,
- stop_node(Node),
+ peer:stop(Peer),
ok.
@@ -241,18 +230,20 @@ boot_var(Config) when is_list(Config) ->
{BootScript, TEST_VAR, KernelVsn, StdlibVsn} = create_boot(Config),
%% Should fail as we have not given -boot_var TEST_VAR
- {error, timeout} =
- start_node(init_test, "-boot " ++ BootScript),
+ try
+ ?CT_PEER(#{args => ["-boot", BootScript], connection => standard_io}),
+ ct:fail({boot_var, "Should not start without TEST_VAR"})
+ catch
+ exit:{boot_failed,{exit_status,1}} ->
+ ok
+ end,
+
case is_real_system(KernelVsn, StdlibVsn) of
true ->
%% Now it should work !!
- {ok, Node} =
- start_node(init_test,
- "-boot " ++ BootScript ++
- " -boot_var TEST_VAR \"" ++
- TEST_VAR ++ "\""),
- stop_node(Node),
+ {ok, Peer, _} = ?CT_PEER(["-boot", BootScript, "-boot_var", "TEST_VAR", TEST_VAR]),
+ peer:stop(Peer),
Res = ok;
_ ->
%% What we need is not so much version numbers on the directories, but
@@ -298,30 +289,30 @@ many_restarts() ->
[{timetrap,{minutes,16}}].
many_restarts(Config) when is_list(Config) ->
- {ok, Node} = loose_node:start(init_test, "", ?DEFAULT_TIMEOUT_SEC),
- loop_restart(50,Node,rpc:call(Node,erlang,whereis,[logger])),
- loose_node:stop(Node),
+ {ok, Peer, Node} = ?CT_PEER(#{connection => standard_io}),
+ loop_restart(50,Peer,Node,rpc:call(Node,erlang,whereis,[logger])),
+ peer:stop(Peer),
ok.
-loop_restart(0,_,_) ->
+loop_restart(0,_,_,_) ->
ok;
-loop_restart(N,Node,EHPid) ->
+loop_restart(N,Peer,Node,EHPid) ->
erlang:monitor_node(Node, true),
ok = rpc:call(Node, init, restart, []),
receive
{nodedown, Node} ->
ok
after 10000 ->
- loose_node:stop(Node),
+ peer:stop(Peer),
ct:fail(not_stopping)
end,
- ok = wait_for(60, Node, EHPid),
- loop_restart(N-1,Node,rpc:call(Node,erlang,whereis,[logger])).
+ ok = wait_for(60, Peer, Node, EHPid),
+ loop_restart(N-1,Peer,Node,rpc:call(Node,erlang,whereis,[logger])).
-wait_for(0,Node,_) ->
- loose_node:stop(Node),
+wait_for(0,Peer,_Node,_) ->
+ peer:stop(Peer),
error;
-wait_for(N,Node,EHPid) ->
+wait_for(N,Peer,Node,EHPid) ->
case rpc:call(Node, erlang, whereis, [logger]) of
Pid when is_pid(Pid), Pid =/= EHPid ->
%% erlang:display(ok),
@@ -345,7 +336,7 @@ wait_for(N,Node,EHPid) ->
after 100 ->
ok
end,
- wait_for(N-1,Node,EHPid)
+ wait_for(N-1,Peer,Node,EHPid)
end.
restart_with_mode(Config) when is_list(Config) ->
@@ -377,13 +368,7 @@ restart_with_mode(Config) when is_list(Config) ->
%% ------------------------------------------------
restart(Config) when is_list(Config) ->
Args = args(),
-
- Pa = " -pa " ++ filename:dirname(code:which(?MODULE)),
-
- %% Currently test_server:start_node cannot be used. The restarted
- %% node immediately halts due to the implementation of
- %% test_server:start_node.
- {ok, Node} = loose_node:start(init_test, Args ++ Pa, ?DEFAULT_TIMEOUT_SEC),
+ {ok, Peer, Node} = ?CT_PEER(#{args => Args, connection => standard_io}),
%% Ok, the node is up, now the real test test begins.
erlang:monitor_node(Node, true),
SysProcs0 = rpc:call(Node, ?MODULE, find_system_processes, []),
@@ -395,14 +380,14 @@ restart(Config) when is_list(Config) ->
InitPid = rpc:call(Node, erlang, whereis, [init]),
PurgerPid = rpc:call(Node, erlang, whereis, [erts_code_purger]),
Procs = rpc:call(Node, erlang, processes, []),
- MsgFlags = lists:sort(rpc:call(Node, socket, supports, [msg_flags])),
+ MsgFlags = fetch_socket_msg_flags(Node),
MaxPid = lists:last(Procs),
ok = rpc:call(Node, init, restart, []),
receive
{nodedown, Node} ->
ok
after 10000 ->
- loose_node:stop(Node),
+ peer:stop(Peer),
ct:fail(not_stopping)
end,
ok = wait_restart(30, Node),
@@ -443,8 +428,13 @@ restart(Config) when is_list(Config) ->
PrimFileP = pid_to_list(PrimFilePid1),
%% and same socket_registry helper process!
- ESockRegP = pid_to_list(ESockRegPid),
- ESockRegP = pid_to_list(ESockRegPid1),
+ if ESockRegPid =:= undefined, ESockRegPid1 =:= undefined ->
+ %% No socket registry on either node
+ ok;
+ true ->
+ ESockRegP = pid_to_list(ESockRegPid),
+ ESockRegP = pid_to_list(ESockRegPid1)
+ end,
NewProcs0 = rpc:call(Node, erlang, processes, []),
NewProcs = NewProcs0 -- SysProcs1,
@@ -452,22 +442,22 @@ restart(Config) when is_list(Config) ->
true ->
ok;
_ ->
- loose_node:stop(Node),
+ peer:stop(Peer),
ct:fail(processes_not_greater)
end,
%% Check that socket tables has been re-initialized; check one
- MsgFlags = lists:sort(rpc:call(Node, socket, supports, [msg_flags])),
+ MsgFlags = fetch_socket_msg_flags(Node),
%% Test that, for instance, the same argument still exists.
case rpc:call(Node, init, get_argument, [c]) of
{ok, [["4", "5", "6"], ["7", "8", "9"]]} ->
ok;
_ ->
- loose_node:stop(Node),
+ peer:stop(Peer),
ct:fail({get_argument, restart_fail})
end,
- loose_node:stop(Node),
+ peer:stop(Peer),
ok.
-record(sys_procs, {init,
@@ -553,6 +543,14 @@ apid(Pid) ->
[N,P,I] = string:tokens(pid_to_list(Pid),"<>."),
[list_to_integer(N),list_to_integer(P),list_to_integer(I)].
+fetch_socket_msg_flags(Node) ->
+ case code:is_loaded(prim_socket) of
+ {file,preloaded} ->
+ lists:sort(rpc:call(Node, socket, supports, [msg_flags]));
+ _ ->
+ ok
+ end.
+
%% ------------------------------------------------
%% Just test that the system is halted here.
%% The reboot facility using heart is tested
@@ -560,14 +558,14 @@ apid(Pid) ->
%% ------------------------------------------------
reboot(Config) when is_list(Config) ->
Args = args(),
- {ok, Node} = start_node(init_test, Args),
+ {ok, Peer, Node} = ?CT_PEER(Args),
erlang:monitor_node(Node, true),
ok = rpc:call(Node, init, reboot, []),
receive
{nodedown, Node} ->
ok
after 10000 ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail(not_stopping)
end,
ct:sleep(5000),
@@ -575,7 +573,7 @@ reboot(Config) when is_list(Config) ->
pang ->
ok;
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail(system_rebooted)
end,
ok.
@@ -599,14 +597,14 @@ catch_stop(Status) ->
%% ------------------------------------------------
stop(Config) when is_list(Config) ->
Args = args(),
- {ok, Node} = start_node(init_test, Args),
+ {ok, Peer, Node} = ?CT_PEER(Args),
erlang:monitor_node(Node, true),
ok = rpc:call(Node, init, reboot, []),
receive
{nodedown, Node} ->
ok
after 10000 ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail(not_stopping)
end,
ct:sleep(5000),
@@ -614,7 +612,7 @@ stop(Config) when is_list(Config) ->
pang ->
ok;
_ ->
- stop_node(Node),
+ peer:stop(Peer),
ct:fail(system_rebooted)
end,
ok.
@@ -649,27 +647,74 @@ script_id(Config) when is_list(Config) ->
ok.
%% ------------------------------------------------
+%% Test that .erlang file works as it should
+%% ------------------------------------------------
+dot_erlang(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+
+ TestHome = filename:join(PrivDir, ?FUNCTION_NAME),
+ ok = file:make_dir(TestHome),
+
+ HomeEnv = case os:type() of
+ {win32, _} ->
+ [Drive | Path] = filename:split(TestHome),
+ [{"APPDATA", filename:join(TestHome,"AppData")},
+ {"HOMEDRIVE", Drive}, {"HOMEPATH", filename:join(Path)}];
+ _ ->
+ [{"HOME", TestHome}]
+ end,
+
+ NodeOpts = #{ env => HomeEnv },
+
+ %% Get basedir of peer node
+ {ok, CreatorPeer, CreatorNode} = ?CT_PEER(NodeOpts),
+ UserConfig = erpc:call(CreatorNode, filename, basedir, [user_config,"erlang"]),
+ peer:stop(CreatorPeer),
+
+ XDGErlang = filename:join([UserConfig, ".erlang"]),
+ ok = filelib:ensure_dir(XDGErlang),
+ ok = file:write_file(XDGErlang, "application:set_env(kernel,test,xdg)."),
+
+ {ok, Peer, Node} = ?CT_PEER(NodeOpts),
+
+ ?assertEqual({ok, xdg}, erpc:call(Node, application, get_env, [kernel, test])),
+ peer:stop(Peer),
+
+ HomeErlang = filename:join([TestHome, ".erlang"]),
+ ok = file:write_file(HomeErlang, "application:set_env(kernel,test,home)."),
+ {ok, Peer2, Node2} = ?CT_PEER(NodeOpts),
+
+ ?assertEqual({ok, home}, erpc:call(Node2, application, get_env, [kernel, test])),
+ peer:stop(Peer2),
+
+ ok.
+
+%% ------------------------------------------------
%% Start the slave system with -boot flag.
%% ------------------------------------------------
boot1(Config) when is_list(Config) ->
- Args = args() ++ " -boot start_sasl",
- {ok, Node} = start_node(init_test, Args),
- stop_node(Node),
+ Args = args() ++ ["-boot", "start_sasl"],
+ {ok, Peer, _Node} = ?CT_PEER(Args),
+ peer:stop(Peer),
%% Try to start with non existing boot file.
- Args1 = args() ++ " -boot dummy_script",
- {error, timeout} = start_node(init_test, Args1),
-
- ok.
+ Args1 = args() ++ ["-boot", "dummy_script"],
+ try
+ ?CT_PEER(#{args => Args1, connection => standard_io}),
+ ct:fail({boot1, "started with non existing boot file"})
+ catch
+ exit:{boot_failed, {exit_status, 1}} ->
+ ok
+ end.
boot2(Config) when is_list(Config) ->
%% Absolute boot file name
Boot = filename:join([code:root_dir(), "bin", "start_sasl"]),
- Args = args() ++ " -boot \"" ++ Boot++"\"",
- {ok, Node} = start_node(init_test, Args),
- stop_node(Node),
+ Args = args() ++ ["-boot", Boot],
+ {ok, Peer, _Node} = ?CT_PEER(Args),
+ peer:stop(Peer),
case os:type() of
{win32, _} ->
@@ -679,9 +724,9 @@ boot2(Config) when is_list(Config) ->
($/) -> $\\;
(C) -> C
end, Boot),
- Args2 = args() ++ " -boot \"" ++ Win_boot ++ "\"",
- {ok, Node2} = start_node(init_test, Args2),
- stop_node(Node2);
+ Args2 = args() ++ ["-boot", Win_boot],
+ {ok, Peer2, _Node2} = ?CT_PEER(Args2),
+ peer:stop(Peer2);
_ ->
ok
end,
@@ -690,24 +735,13 @@ boot2(Config) when is_list(Config) ->
%% Misc. functions
-start_node(Name, Param) ->
- test_server:start_node(Name, slave, [{args, Param}]).
-
-stop_node(Node) ->
- test_server:stop_node(Node).
-
-from(H, [H | T]) -> T;
-from(H, [_ | T]) -> from(H, T);
-from(_, []) -> [].
-
args() ->
- "-a kalle -- a b -d -b hej hopp -- c d -b san sa -c 4 5 6 -c 7 8 9".
+ ["-a", "kalle", "--", "a", "b", "-d", "-b", "hej", "hopp",
+ "--", "c", "d", "-b", "san", "sa", "-c", "4", "5", "6", "-c", "7", "8", "9"].
long_args(A) ->
- lists:flatten(
- io_lib:format("-a kalle -- a b -d -b hej hopp -- c "
- "~s -b san sa -c 4 5 6 -c 7 8 9",
- [A])).
+ ["-a", "kalle", "--", "a", "b", "-d", "-b", "hej", "hopp", "--", "c", A,
+ "-b", "san", "sa", "-c", "4", "5", "6", "-c", "7", "8", "9"].
create_script(Config) ->
PrivDir = proplists:get_value(priv_dir,Config),
diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl
index 2dede6ea03..ec3887df1d 100644
--- a/lib/kernel/test/interactive_shell_SUITE.erl
+++ b/lib/kernel/test/interactive_shell_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,44 +18,39 @@
%% %CopyrightEnd%
%%
-module(interactive_shell_SUITE).
--include_lib("common_test/include/ct.hrl").
-include_lib("kernel/include/file.hrl").
--export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
- init_per_group/2,end_per_group/2,
- get_columns_and_rows/1, exit_initial/1, job_control_local/1,
- job_control_remote/1,stop_during_init/1,
+
+-export([all/0, suite/0, groups/0, init_per_suite/1, end_per_suite/1,
+ init_per_group/2, end_per_group/2,
+ init_per_testcase/2, end_per_testcase/2,
+ get_columns_and_rows/1, exit_initial/1, job_control_local/1,
+ job_control_remote/1,stop_during_init/1,wrap/1,
shell_history/1, shell_history_resize/1, shell_history_eaccess/1,
shell_history_repair/1, shell_history_repair_corrupt/1,
shell_history_corrupt/1,
shell_history_custom/1, shell_history_custom_errors/1,
job_control_remote_noshell/1,ctrl_keys/1,
get_columns_and_rows_escript/1,
- remsh/1, remsh_longnames/1, remsh_no_epmd/1]).
+ remsh_basic/1, remsh_longnames/1, remsh_no_epmd/1]).
--export([init_per_testcase/2, end_per_testcase/2]).
%% For spawn
-export([toerl_server/3]).
%% Exports for custom shell history module
-export([load/0, add/1]).
-init_per_testcase(_Func, Config) ->
- Config.
-
-end_per_testcase(_Func, _Config) ->
- ok.
-
suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,3}}].
-all() ->
+all() ->
[get_columns_and_rows_escript,get_columns_and_rows,
exit_initial, job_control_local,
job_control_remote, job_control_remote_noshell,
- ctrl_keys, stop_during_init, {group, shell_history},
- remsh, remsh_longnames, remsh_no_epmd].
+ ctrl_keys, stop_during_init, wrap,
+ {group, shell_history},
+ {group, remsh}].
-groups() ->
+groups() ->
[{shell_history, [],
[shell_history,
shell_history_resize,
@@ -63,32 +58,77 @@ groups() ->
shell_history_repair,
shell_history_repair_corrupt,
shell_history_corrupt,
- shell_history_custom,
- shell_history_custom_errors
- ]}].
+ {group, sh_custom}
+ ]},
+ {sh_custom, [],
+ [shell_history_custom,
+ shell_history_custom_errors]},
+ {remsh, [],
+ [remsh_basic,
+ remsh_longnames,
+ remsh_no_epmd]}
+ ].
init_per_suite(Config) ->
- Term = os:getenv("TERM", "dumb"),
- os:putenv("TERM","vt100"),
- DefShell = get_default_shell(),
- [{default_shell,DefShell},{term,Term}|Config].
+ case get_progs() of
+ {error, Error} ->
+ {skip, Error};
+ _ ->
+ Term = os:getenv("TERM", "dumb"),
+ os:putenv("TERM", "vt100"),
+ DefShell = get_default_shell(),
+ [{default_shell,DefShell},{term,Term}|Config]
+ end.
end_per_suite(Config) ->
Term = proplists:get_value(term,Config),
os:putenv("TERM",Term),
ok.
+init_per_group(remsh, Config) ->
+ case proplists:get_value(default_shell, Config) of
+ old -> {skip, "Not supported in old shell"};
+ new -> Config
+ end;
init_per_group(shell_history, Config) ->
case proplists:get_value(default_shell, Config) of
old -> {skip, "Not supported in old shell"};
new -> Config
end;
+init_per_group(sh_custom, Config) ->
+ %% Ensure that ERL_AFLAGS will not override the value of the
+ %% shell_history variable.
+ Name = interactive_shell_sh_custom,
+ Args = "-noshell -kernel shell_history not_overridden",
+ {ok, Node} = test_server:start_node(Name, slave, [{args,Args}]),
+ try erpc:call(Node, application, get_env, [kernel, shell_history], timeout(normal)) of
+ {ok, not_overridden} ->
+ Config;
+ _ ->
+ SkipText = "shell_history variable is overridden (probably by ERL_AFLAGS)",
+ {skip, SkipText}
+ catch
+ C:R:Stk ->
+ io:format("~p\n~p\n~p\n", [C,R,Stk]),
+ {skip, "Unexpected error"}
+ after
+ test_server:stop_node(Node)
+ end;
init_per_group(_GroupName, Config) ->
Config.
end_per_group(_GroupName, Config) ->
Config.
+init_per_testcase(_Func, Config) ->
+ Config.
+
+end_per_testcase(_Case, _Config) ->
+ %% Terminate any connected nodes. They may disturb test cases that follow.
+ lists:foreach(fun(Node) ->
+ catch erpc:call(Node, erlang, halt, [])
+ end, nodes()),
+ ok.
%%-define(DEBUG,1).
-ifdef(DEBUG).
@@ -153,98 +193,139 @@ get_columns_and_rows_escript(Config) when is_list(Config) ->
%% Test that the shell can access columns and rows.
get_columns_and_rows(Config) when is_list(Config) ->
- case proplists:get_value(default_shell,Config) of
+ case proplists:get_value(default_shell, Config) of
old ->
- %% Old shell tests
- ?dbg(old_shell),
- rtnode([{putline,""},
- {putline, "2."},
- {getline, "2"},
- {putline,"io:columns()."},
- {getline_re,".*{error,enotsup}"},
- {putline,"io:rows()."},
- {getline_re,".*{error,enotsup}"}
-
- ],[]),
- rtnode([{putline,""},
- {putline, "2."},
- {getline, "2"},
- {putline,"io:columns()."},
- {getline_re,".*{ok,90}"},
- {putline,"io:rows()."},
- {getline_re,".*{ok,40}"}],
- [],
- "stty rows 40; stty columns 90; ");
+ test_columns_and_rows(old, []);
new ->
- %% New shell tests
- ?dbg(new_shell),
- rtnode([{putline,""},
- {putline, "2."},
- {getline, "2"},
- {putline,"io:columns()."},
- %% Behaviour change in R12B-5, returns 80
- %% {getline,"{error,enotsup}"},
- {getline,"{ok,80}"},
- {putline,"io:rows()."},
- %% Behaviour change in R12B-5, returns 24
- %% {getline,"{error,enotsup}"}
- {getline,"{ok,24}"}
- ],[]),
- rtnode([{putline,""},
- {putline, "2."},
- {getline, "2"},
- {putline,"io:columns()."},
- {getline,"{ok,90}"},
- {putline,"io:rows()."},
- {getline,"{ok,40}"}],
- [],
- "stty rows 40; stty columns 90; ")
- end.
-
+ test_columns_and_rows(old, ["-oldshell"]),
+ test_columns_and_rows(new, [])
+ end,
+ ok.
+test_columns_and_rows(old, Args) ->
+ rtnode([{putline, ""},
+ {putline, "2."},
+ {expect, "2\r\n"},
+ {putline, "io:columns()."},
+ {expect, "{error,enotsup}\r\n"},
+ {putline, "io:rows()."},
+ {expect, "{error,enotsup}\r\n"}
+ ], [], [], Args),
+
+ rtnode([{putline, ""},
+ {putline, "2."},
+ {expect, "2\r\n"},
+ {putline, "io:columns()."},
+ {expect, "{ok,90}\r\n"},
+ {putline,"io:rows()."},
+ {expect, "{ok,40}\r\n"}],
+ [],
+ "stty rows 40; stty columns 90; ",
+ Args);
+test_columns_and_rows(new, _Args) ->
+ rtnode([{putline, ""},
+ {expect, "1> $"},
+ {putline, "2."},
+ {expect, "\r\n2\r\n"},
+ {expect, "> $"},
+ {putline, "io:columns()."},
+ {expect, "{ok,80}\r\n"},
+ {expect, "> $"},
+ {putline, "io:rows()."},
+ {expect, "\r\n{ok,24}\r\n"}
+ ]),
+
+ rtnode([{putline, ""},
+ {expect, "1> $"},
+ {putline, "2."},
+ {expect, "\r\n2\r\n"},
+ {expect, "> $"},
+ {putline, "io:columns()."},
+ {expect, "\r\n{ok,90}\r\n"},
+ {expect, "> $"},
+ {putline, "io:rows()."},
+ {expect, "\r\n{ok,40}\r\n"}],
+ [],
+ "stty rows 40; stty columns 90; ").
%% Tests that exit of initial shell restarts shell.
exit_initial(Config) when is_list(Config) ->
- case proplists:get_value(default_shell,Config) of
+ case proplists:get_value(default_shell, Config) of
old ->
- rtnode([{putline,""},
- {putline, "2."},
- {getline_re, ".*2"},
- {putline,"exit()."},
- {getline,""},
- {getline,"Eshell"},
- {putline,""},
- {putline,"35."},
- {getline_re,".*35"}],[]);
- new ->
- rtnode([{putline,""},
- {putline, "2."},
- {getline, "2"},
- {putline,"exit()."},
- {getline,""},
- {getline,"Eshell"},
- {putline,""},
- {putline,"35."},
- {getline_re,"35"}],[])
- end.
+ test_exit_initial(old);
+ new ->
+ test_exit_initial(old),
+ test_exit_initial(new)
+ end,
+ ok.
+
+test_exit_initial(old) ->
+ rtnode([{putline, ""},
+ {putline, "2."},
+ {expect, "2\r\n"},
+ {putline, "exit()."},
+ {expect, "Eshell"},
+ {putline, ""},
+ {putline, "35."},
+ {expect, "35\r\n"}],
+ [], [], ["-oldshell"]);
+test_exit_initial(new) ->
+ rtnode([{putline, ""},
+ {expect, "1> $"},
+ {putline, "2."},
+ {expect, "2"},
+ {putline,"exit()."},
+ {expect, "Eshell"},
+ {expect, "1> $"},
+ {putline, "35."},
+ {expect, "35\r\n"}]).
stop_during_init(Config) when is_list(Config) ->
- case get_progs() of
- {error,_Reason} ->
- {skip,"No runerl present"};
- {RunErl,_ToErl,Erl} ->
- case create_tempdir() of
- {error, Reason2} ->
- {skip, Reason2};
- Tempdir ->
- XArg = " -kernel shell_history enabled -s init stop",
- start_runerl_command(RunErl, Tempdir, "\\\""++Erl++"\\\""++XArg),
- Logs = rtnode_read_logs(Tempdir),
- rtnode_dump_logs(Logs),
- nomatch = binary:match(maps:get("erlang.log.1",Logs),
- <<"*** ERROR: Shell process terminated! ***">>)
- end
- end.
+ {RunErl,_ToErl,Erl} = get_progs(),
+ case create_tempdir() of
+ {error, Reason} ->
+ {skip, Reason};
+ Tempdir ->
+ XArg = " -kernel shell_history enabled -s init stop",
+ start_runerl_command(RunErl, Tempdir, "\\\""++Erl++"\\\""++XArg),
+ Logs = rtnode_read_logs(Tempdir),
+ rtnode_dump_logs(Logs),
+ nomatch = binary:match(map_get("erlang.log.1", Logs),
+ <<"*** ERROR: Shell process terminated! ***">>),
+ ok
+ end.
+
+%% This testcase tests that the correct wrapping characters are added
+%% When a terminal has the xn flag set, it means that wrapping may not
+%% work as expected and historically the ttysl driver has always inserted
+%% a " \b" (i.e. space + backspace) when an output string ends on that line
+%% in order for the cursor to be at col 0 on the next line instead of col max
+%% on the current line.
+%%
+%% This caused problems when a string was `columns` long and then ended in "\r\n"
+%% as it would first wrap due to " \b" and then output "\r\n" that cause a double
+%% newline to happen.
+%%
+%% This testcase tests that we get a " \b" when we should and we get a "\r\n" when
+%% we should.
+wrap(Config) when is_list(Config) ->
+ case proplists:get_value(default_shell, Config) of
+ new ->
+ As = lists:duplicate(20,"a"),
+ rtnode([{putline, "io:columns()."},
+ {expect, "{ok,20}\r\n"},
+ {putline, ["io:format(\"~s\",[lists:duplicate(20,\"a\")])."]},
+ {expect, As ++ " \b"},
+ {putline, ["io:format(\"~s~n~s\",[lists:duplicate(20,\"a\"),lists:duplicate(20,\"a\")])."]},
+ {expect, As ++ "\r\n" ++ As ++ " \b"}
+ ],
+ [],
+ "stty rows 40; stty columns 20; ",
+ [""]);
+ _ ->
+ ok
+ end,
+ ok.
%% This testcase tests that shell_history works as it should.
%% We use Ctrl + P = Cp=[$\^p] in order to navigate up
@@ -257,50 +338,52 @@ shell_history(Config) when is_list(Config) ->
Path = shell_history_path(Config, "basic"),
rtnode([
{putline, "echo1."},
- {getline, "echo1"},
+ {expect, "echo1\r\n"},
{putline, "echo2."},
- {getline, "echo2"},
+ {expect, "echo2\r\n"},
{putline, "echo3."},
- {getline, "echo3"},
+ {expect, "echo3\r\n"},
{putline, "echo4."},
- {getline, "echo4"},
+ {expect, "echo4\r\n"},
{putline, "echo5."},
- {getline, "echo5"}
+ {expect, "echo5\r\n"}
], [], [], " -kernel shell_history enabled " ++
"-kernel shell_history_drop '[\\\"init:stop().\\\"]' " ++
mk_sh_param(Path)),
+ receive after 1000 -> ok end,
rtnode([
{putline, ""},
%% the init:stop that stopped the node is dropped
- {putdata, [$\^p]}, {getdata, "echo5."},
+ {putdata, [$\^p]}, {expect, "echo5[.]$"},
{putdata, [$\n]},
- {getline, "echo5"},
- {putdata, [$\^p]}, {getdata,"echo5."},
- {putdata, [$\^p]}, {getdata,"echo4."},
- {putdata, [$\^p]}, {getdata,"echo3."},
- {putdata, [$\^p]}, {getdata,"echo2."},
- {putdata, [$\^n]}, {getdata,"echo3."},
- {putdata, [$\^n]}, {getdata,"echo4."},
+ {expect, "echo5\r\n"},
+ {putdata, [$\^p]}, {expect, "echo5[.]$"},
+ {putdata, [$\^p]}, {expect, "echo4[.]$"},
+ {putdata, [$\^p]}, {expect, "echo3[.]$"},
+ {putdata, [$\^p]}, {expect, "echo2[.]$"},
+ {putdata, [$\^n]}, {expect, "echo3[.]$"},
+ {putdata, [$\^n]}, {expect, "echo4[.]$"},
{putdata, [$\^b]}, {sleep,50}, %% the echo4. (cursor moved one left)
- {putline, ["echo"]},
- {getline, "echo4echo"}
- ], [], [], " -kernel shell_history enabled " ++ mk_sh_param(Path)).
+ {putline, ["ECHO"]},
+ {expect, "echo4ECHO\r\n"}
+ ], [], [], " -kernel shell_history enabled " ++ mk_sh_param(Path)),
+ ok.
shell_history_resize(Config) ->
Path = shell_history_path(Config, "resize"),
rtnode([
{putline, "echo."},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], " -kernel shell_history_file_bytes 123456 " ++
"-kernel shell_history enabled " ++ mk_sh_param(Path)),
{ok, Logs} =
rtnode([
{putline, ""},
- {putdata, [$\^p]}, {getdata,"init:stop()."},
- {putdata, [$\^p]}, {getdata,"echo."},
+ {putdata, [$\^p]}, {expect, "init:stop\\(\\)[.]$"},
+ {putdata, [$\^p]}, {expect, "echo[.]$"},
{putdata, [$\n]},
- {getline, "echo"}
+ {expect, "echo"}
], [], [], " -kernel shell_history_file_bytes 654321 " ++
"-kernel shell_history enabled " ++ mk_sh_param(Path)),
@@ -324,7 +407,7 @@ shell_history_eaccess(Config) ->
{ok, Logs1} =
rtnode([
{putline, "echo."},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)),
rtnode_check_logs("erlang.log.1", "Error handling file", Logs1),
@@ -332,10 +415,10 @@ shell_history_eaccess(Config) ->
%% shell_docs recursively creates the folder to store the
%% logs. This test checks that erlang still starts if we
%% cannot create the folders to the path.
- {ok, Logs2} =
+ {ok, Logs2} =
rtnode([
{putline, "echo."},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], "-kernel shell_history enabled " ++
mk_sh_param(filename:join(Path,"logs"))),
@@ -343,34 +426,25 @@ shell_history_eaccess(Config) ->
after
file:write_file_info(Path, Info)
- end.
+ end,
+ ok.
shell_history_repair(Config) ->
Path = shell_history_path(Config, "repair"),
%% We stop a node without closing the log
- try rtnode([
- {putline, "echo."},
- {getline, "echo"},
- {sleep, 2500}, %% disk_log internal cache timer is 2000 ms
- {putline, "erlang:halt(0)."}
- ], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)) of
- _ ->
- ok
- catch _:_ ->
- ok
- end,
+ shell_history_halt(Path),
{ok, Logs} =
rtnode([
{putline, ""},
- {putdata, [$\^p]}, {getdata,"echo."},
+ {putdata, [$\^p]}, {expect, "echo[.]$"},
{putdata, [$\n]},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)),
%% The regexp below checks that he string is NOT part of the log
- rtnode_check_logs("erlang.log.1",
+ rtnode_check_logs("erlang.log.1",
"The shell history log file was corrupted and was repaired",
false,
Logs),
@@ -380,17 +454,7 @@ shell_history_repair_corrupt(Config) ->
Path = shell_history_path(Config, "repair_corrupt"),
%% We stop a node without closing the log
- try rtnode([
- {putline, "echo."},
- {getline, "echo"},
- {sleep, 2500}, %% disk_log internal cache timer is 2000 ms
- {putline, "erlang:halt(0)."}
- ], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)) of
- _ ->
- ok
- catch _:_ ->
- ok
- end,
+ shell_history_halt(Path),
%% We corrupt the disklog
{ok, D} = file:open(filename:join(Path,"erlang-shell-log.1"), [read,append]),
@@ -400,12 +464,12 @@ shell_history_repair_corrupt(Config) ->
{ok, Logs} =
rtnode([
{putline, ""},
- {putdata, [$\^p]}, {getdata,"echo."},
+ {putdata, [$\^p]}, {expect, "echo[.]$"},
{putdata, [$\n]},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)),
- rtnode_check_logs("erlang.log.1",
+ rtnode_check_logs("erlang.log.1",
"The shell history log file was corrupted and was repaired.",
Logs),
ok.
@@ -413,18 +477,12 @@ shell_history_repair_corrupt(Config) ->
shell_history_corrupt(Config) ->
Path = shell_history_path(Config, "corrupt"),
- %% We stop a node without closing the log
- try rtnode([
- {putline, "echo."},
- {getline, "echo"}
- ], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)) of
- _ ->
- ok
- catch _:_ ->
- ok
- end,
+ %% We initialize the shell history log with a known value.
+ rtnode([{putline, "echo."},
+ {expect, "echo\r\n"}
+ ], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)),
- %% We corrupt the disklog
+ %% We corrupt the disklog.
{ok, D} = file:open(filename:join(Path,"erlang-shell-log.1"), [read, append]),
ok = file:write(D, [10, 10]),
ok = file:close(D),
@@ -432,16 +490,29 @@ shell_history_corrupt(Config) ->
{ok, Logs} =
rtnode([
{putline, ""},
- {putdata, [$\^p]}, {getdata,"init:stop()."},
- {putdata, [$\^p]}, {getdata,"echo."},
+ {putdata, [$\^p]}, {expect, "init:stop\\(\\)[.]$"},
+ {putdata, [$\^p]}, {expect, "echo[.]$"},
{putdata, [$\n]},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path)),
- rtnode_check_logs("erlang.log.1", "Invalid chunk in the file", Logs),
+ rtnode_check_logs("erlang.log.1", "Invalid chunk in the file", Logs),
ok.
-
+%% Stop the node without closing the log.
+shell_history_halt(Path) ->
+ try
+ rtnode([
+ {putline, "echo."},
+ {expect, "echo\r\n"},
+ {sleep, 2500}, % disk_log internal cache timer is 2000 ms
+ {putline, "halt(0)."}
+ ], [], [], "-kernel shell_history enabled " ++ mk_sh_param(Path))
+ catch
+ _:_ ->
+ ok
+ end.
+
shell_history_path(Config, TestCase) ->
filename:join([proplists:get_value(priv_dir, Config),
"shell_history", TestCase]).
@@ -451,63 +522,66 @@ mk_sh_param(Path) ->
shell_history_custom(_Config) ->
%% Up key: Ctrl + P = Cp=[$\^p]
- rtnode([
- {putline, ""},
- {putdata, [$\^p]}, {getdata,"0."},
+ rtnode([{expect, "1> $"},
+ %% {putline, ""},
+ {putdata, [$\^p]}, {expect, "0[.]"},
{putdata, [$\n]},
- {getline, "0"},
+ {expect, "0\r\n"},
{putline, "echo."},
- {getline, "!echo"} %% exclamation sign is printed by custom history module
+ {expect, "!echo\r\n"} % exclamation mark is printed by custom history module
], [], [], " -kernel shell_history " ++ atom_to_list(?MODULE) ++
- " -pz " ++ filename:dirname(code:which(?MODULE))).
+ " -pz " ++ filename:dirname(code:which(?MODULE))),
+ ok.
shell_history_custom_errors(_Config) ->
%% Check that we can start with a node with an undefined
%% provider module.
- rtnode([
+ rtnode([{expect, "1> $"},
{putline, "echo."},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], " -kernel shell_history very_broken " ++
" -pz " ++ filename:dirname(code:which(?MODULE))),
%% Check that we can start with a node with a provider module
- %% that crashes in load/0
+ %% that crashes in load/0.
rtnode([
{putline, "echo."},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], " -kernel shell_history " ++ atom_to_list(?MODULE) ++
" -kernel provider_load crash" ++
" -pz " ++ filename:dirname(code:which(?MODULE))),
%% Check that we can start with a node with a provider module
- %% that return incorrect in load/0
+ %% that return incorrect in load/0.
rtnode([
{putline, "echo."},
- {getline, "echo"}
+ {expect, "echo\r\n"}
], [], [], " -kernel shell_history " ++ atom_to_list(?MODULE) ++
" -kernel provider_load badreturn" ++
" -pz " ++ filename:dirname(code:which(?MODULE))),
%% Check that we can start with a node with a provider module
- %% that crashes in load/0
+ %% that crashes in load/0.
rtnode([
{putline, "echo."},
- {getline, "Disabling shell history logging."},
- {getline, "echo"}
+ {expect, "Disabling shell history logging.\r\n"},
+ {expect, "echo\r\n"}
], [], [], " -kernel shell_history " ++ atom_to_list(?MODULE) ++
" -kernel provider_add crash" ++
" -pz " ++ filename:dirname(code:which(?MODULE))),
%% Check that we can start with a node with a provider module
- %% that return incorrect in load/0
+ %% that return incorrect in load/0.
rtnode([
{putline, "echo."},
- {getline, "It returned {error,badreturn}."},
- {getline, "echo"}
+ {expect, "It returned {error,badreturn}.\r\n"},
+ {expect, "echo\r\n"}
], [], [], " -kernel shell_history " ++ atom_to_list(?MODULE) ++
" -kernel provider_add badreturn" ++
- " -pz " ++ filename:dirname(code:which(?MODULE))).
+ " -pz " ++ filename:dirname(code:which(?MODULE))),
+
+ ok.
load() ->
case application:get_env(kernel,provider_load) of
@@ -533,298 +607,276 @@ add(_Line) ->
%% Tests that local shell can be started by means of job control.
job_control_local(Config) when is_list(Config) ->
- case proplists:get_value(default_shell,Config) of
+ case proplists:get_value(default_shell, Config) of
old ->
%% Old shell tests
{skip,"No new shell found"};
new ->
%% New shell tests
- rtnode([{putline,""},
+ rtnode([{putline, ""},
+ {expect, "1> $"},
{putline, "2."},
- {getline, "2"},
- {putline,[7]},
- {sleep,timeout(short)},
- {putline,""},
- {getline," -->"},
- {putline,"s"},
- {putline,"c"},
- {putline_raw,""},
- {getline,"Eshell"},
- {putline_raw,""},
- {getline,"1>"},
- {putline,"35."},
- {getline,"35"}],[])
+ {expect, "\r\n2\r\n"},
+ {putline, "\^g"},
+ {expect, ["--> $"]},
+ {putline, "s"},
+ {expect, ["--> $"]},
+ {putline, "c"},
+ {expect, ["\r\nEshell"]},
+ {expect, ["1> $"]},
+ {putline, "35."},
+ {expect, "\r\n35\r\n2> $"}],
+ []),
+ ok
end.
-job_control_remote(doc) -> [ "Tests that remote shell can be "
- "started by means of job control" ];
+%% Tests that remote shell can be started by means of job control.
job_control_remote(Config) when is_list(Config) ->
- case {node(),proplists:get_value(default_shell,Config)} of
- {nonode@nohost,_} ->
- exit(not_distributed);
- {_,old} ->
+ case proplists:get_value(default_shell, Config) of
+ old ->
{skip,"No new shell found"};
_ ->
- RNode = create_nodename(),
- MyNode = atom2list(node()),
- Pid = spawn_link(fun() ->
- receive die ->
- ok
- end
- end),
- PidStr = pid_to_list(Pid),
- register(kalaskula,Pid),
- CookieString = lists:flatten(
- io_lib:format("~w",
- [erlang:get_cookie()])),
- Res = rtnode([{putline,""},
- {putline, "erlang:get_cookie()."},
- {getline, CookieString},
- {putline,[7]},
- {sleep,timeout(short)},
- {putline,""},
- {getline," -->"},
- {putline,"r '"++MyNode++"'"},
- {putline,"c"},
- {putline_raw,""},
- {getline,"Eshell"},
- {sleep,timeout(short)},
- {putline_raw,""},
- {getline,"("++MyNode++")1>"},
- {putline,"whereis(kalaskula)."},
- {getline,PidStr},
- {sleep,timeout(short)}, % Race, known bug.
- {putline_raw,"exit()."},
- {getline,"***"},
- {putline,[7]},
- {putline,""},
- {getline," -->"},
- {putline,"c 1"},
- {putline,""},
- {sleep,timeout(short)},
- {putline_raw,""},
- {getline,"("++RNode++")"}],RNode),
- Pid ! die,
- Res
+ NSNode = start_node(?FUNCTION_NAME, []),
+ try
+ test_remote_job_control(NSNode)
+ after
+ test_server:stop_node(NSNode)
+ end
end.
-%% Tests that remote shell can be
-%% started by means of job control to -noshell node.
+%% Tests that remote shell can be started by means of job control to
+%% -noshell node.
job_control_remote_noshell(Config) when is_list(Config) ->
- case {node(),proplists:get_value(default_shell,Config)} of
- {nonode@nohost,_} ->
- exit(not_distributed);
- {_,old} ->
+ case proplists:get_value(default_shell, Config) of
+ old ->
{skip,"No new shell found"};
_ ->
- RNode = create_nodename(),
- NSNode = start_noshell_node(interactive_shell_noshell),
- Pid = spawn_link(NSNode, fun() ->
- receive die ->
- ok
- end
- end),
- PidStr = rpc:call(NSNode,erlang,pid_to_list,[Pid]),
- true = rpc:call(NSNode,erlang,register,[kalaskula,Pid]),
- NSNodeStr = atom2list(NSNode),
- CookieString = lists:flatten(
- io_lib:format("~w",
- [erlang:get_cookie()])),
- Res = rtnode([{putline,""},
- {putline, "erlang:get_cookie()."},
- {getline, CookieString},
- {putline,[7]},
- {sleep,timeout(short)},
- {putline,""},
- {getline," -->"},
- {putline,"r '"++NSNodeStr++"'"},
- {putline,"c"},
- {putline_raw,""},
- {getline,"Eshell"},
- {sleep,timeout(short)},
- {putline_raw,""},
- {getline,"("++NSNodeStr++")1>"},
- {putline,"whereis(kalaskula)."},
- {getline,PidStr},
- {sleep,timeout(short)}, % Race, known bug.
- {putline_raw,"exit()."},
- {getline,"***"},
- {putline,[7]},
- {putline,""},
- {getline," -->"},
- {putline,"c 1"},
- {putline,""},
- {sleep,timeout(short)},
- {putline_raw,""},
- {getline,"("++RNode++")"}],RNode),
- Pid ! die,
- stop_noshell_node(NSNode),
- Res
+ NSNode = start_node(?FUNCTION_NAME, ["-noshell"]),
+ try
+ test_remote_job_control(NSNode)
+ after
+ test_server:stop_node(NSNode)
+ end
end.
+test_remote_job_control(Node) ->
+ RemNode = create_nodename(),
+ Pid = spawn_link(Node, fun() ->
+ receive die ->
+ ok
+ end
+ end),
+ PidStr = erpc:call(Node, erlang, pid_to_list, [Pid]),
+ true = erpc:call(Node, erlang, register, [kalaskula,Pid]),
+ PrintedNode = printed_atom(Node),
+ CookieString = printed_atom(erlang:get_cookie()),
+
+ rtnode([{putline, ""},
+ {putline, "erlang:get_cookie()."},
+ {expect, "\r\n\\Q" ++ CookieString ++ "\\E"},
+ {putdata, "\^g"},
+ {expect, " --> $"},
+ {putline, "r " ++ PrintedNode},
+ {expect, "\r\n"},
+ {putline, "c"},
+ {expect, "\r\n"},
+ {expect, "Eshell"},
+ {expect, "\\Q(" ++ atom_to_list(Node) ++")1> \\E$"},
+ {putline, "whereis(kalaskula)."},
+ {expect, PidStr},
+ {putline, "exit()."},
+ {expect, "[*][*][*] Shell process terminated!"},
+ {putdata, "\^g"},
+ {expect, " --> $"},
+ {putline, "c 1"},
+ {expect, "\r\n"},
+ {putline, ""},
+ {expect, "\\Q("++RemNode++")\\E[12]> $"}
+ ], RemNode),
+ Pid ! die,
+ ok.
+
%% Tests various control keys.
-ctrl_keys(_Conf) when is_list(_Conf) ->
- Cu=[$\^u],
- Cw=[$\^w],
- Cy=[$\^y],
- Home=[27,$O,$H],
- End=[27,$O,$F],
+ctrl_keys(_Config) ->
+ Cu = [$\^u],
+ Cw = [$\^w],
+ Cy = [$\^y],
+ Home = [27,$O,$H],
+ End = [27,$O,$F],
rtnode([{putline,""},
{putline,"2."},
- {getline,"2"},
+ {expect,"2"},
{putline,"\"hello "++Cw++"world\"."}, % test <CTRL>+W
- {getline,"\"world\""},
+ {expect,"\"world\""},
{putline,"\"hello "++Cu++"\"world\"."}, % test <CTRL>+U
- {getline,"\"world\""},
+ {expect,"\"world\""},
{putline,"world\"."++Home++"\"hello "}, % test <HOME>
- {getline,"\"hello world\""},
+ {expect,"\"hello world\""},
{putline,"world"++Home++"\"hello "++End++"\"."}, % test <END>
- {getline,"\"hello world\""},
+ {expect,"\"hello world\""},
{putline,"\"hello world\""++Cu++Cy++"."},
- {getline,"\"hello world\""}]
- ++wordLeft()++wordRight(),[]).
-
+ {expect,"\"hello world\""}] ++
+ wordLeft() ++ wordRight(), []),
+ ok.
wordLeft() ->
- L1=[27,27,$[,$D],
- L2=[27]++"[5D",
- L3=[27]++"[1;5D",
- wordLeft(L1)++wordLeft(L2)++wordLeft(L3).
+ L1 = "\e\e[D",
+ L2 = "\e[5D",
+ L3 = "\e[1;5D",
+ wordLeft(L1) ++ wordLeft(L2) ++ wordLeft(L3).
wordLeft(Chars) ->
- End=[27,$O,$F],
+ End = "\eOF",
[{putline,"\"world\""++Chars++"hello "++End++"."},
- {getline,"\"hello world\""}].
+ {expect,"\"hello world\""}].
wordRight() ->
- R1=[27,27,$[,$C],
- R2=[27]++"[5C",
- R3=[27]++"[1;5C",
- wordRight(R1)++wordRight(R2)++wordRight(R3).
+ R1 = "\e\e[C",
+ R2 = "\e[5C",
+ R3 = "\e[1;5C",
+ wordRight(R1) ++ wordRight(R2) ++ wordRight(R3).
wordRight(Chars) ->
- Home=[27,$O,$H],
+ Home = "\eOH",
[{putline,"world"++Home++"\"hello "++Chars++"\"."},
- {getline,"\"hello world\""}].
+ {expect,"\"hello world\""}].
%% Test that -remsh works
-remsh(Config) when is_list(Config) ->
- case proplists:get_value(default_shell,Config) of
- old -> {skip,"Not supported in old shell"};
- new ->
- NodeStr = lists:flatten(io_lib:format("~p",[node()])),
- [_Name,Host] = string:split(atom_to_list(node()),"@"),
- Cmds = [{kill_emulator_command,sigint},
- {putline,""},
- {putline,"node()."},
- {getline,NodeStr}],
+remsh_basic(Config) when is_list(Config) ->
+ TargetNode = start_node(?FUNCTION_NAME, []),
+ TargetNodeStr = printed_atom(TargetNode),
+ [_Name,Host] = string:split(atom_to_list(node()), "@"),
- %% Test that remsh works with explicit -sname
- rtnode(Cmds ++ [{putline,"nodes()."},
- {getline,"['Remshtest@"++Host++"']"}],
- "Remshtest", [], "-remsh " ++ NodeStr),
+ PreCmds = [{putline,""},
+ {putline,"node()."},
+ {expect, "\\Q" ++ TargetNodeStr ++ "\\E\r\n"}],
- %% Test that remsh works without -sname
- rtnode(Cmds, [], [], " -remsh " ++ NodeStr)
+ PostCmds = quit_hosting_node(),
+ %% Test that remsh works with explicit -sname.
+ HostNode = atom_to_list(?FUNCTION_NAME) ++ "_host",
+ HostNodeStr = printed_atom(list_to_atom(HostNode ++ "@" ++ Host)),
+ rtnode(PreCmds ++
+ [{putline,"nodes()."},
+ {expect, "\\Q" ++ HostNodeStr ++ "\\E"}] ++
+ PostCmds,
+ HostNode, [], "-remsh " ++ TargetNodeStr),
- end.
+ %% Test that remsh works without -sname.
+ rtnode(PreCmds ++ PostCmds, [], [], " -remsh " ++ TargetNodeStr),
-%% Test that -remsh works with long names
-remsh_longnames(Config) when is_list(Config) ->
+ test_server:stop_node(TargetNode),
- case proplists:get_value(default_shell,Config) of
- old -> {skip,"Not supported in old shell"};
- new ->
- %% If we cannot resolve the domain, we need to add localhost to the longname
- Domain =
- case inet_db:res_option(domain) of
- [] ->
- "@127.0.0.1";
- _ -> ""
- end,
- case rtstart(" -name " ++ atom_to_list(?FUNCTION_NAME)++Domain) of
- {ok, _SRPid, _STPid, SState} ->
- {ok, _CRPid, CTPid, CState} =
- rtstart("-name undefined" ++ Domain ++
- " -remsh " ++ atom_to_list(?FUNCTION_NAME)),
- try
- ok = get_and_put(
- CTPid,
- [{kill_emulator_command,sigint},
- {putline,""},
- {putline,"node()."},
- {getline_re,atom_to_list(?FUNCTION_NAME)}], 1)
- after
- rtstop(CState), %% Stop client before server
- rtstop(SState)
- end;
- Else ->
- Else
- end
+ ok.
+
+quit_hosting_node() ->
+ %% Command sequence for entering a shell on the hosting node.
+ [{putdata, "\^g"},
+ {expect, "--> $"},
+ {putline, "s"},
+ {expect, "--> $"},
+ {putline, "c"},
+ {expect, ["Eshell"]},
+ {expect, ["1> $"]}].
+
+%% Test that -remsh works with long names.
+remsh_longnames(Config) when is_list(Config) ->
+ %% If we cannot resolve the domain, we need to add localhost to the longname
+ Domain =
+ case inet_db:res_option(domain) of
+ [] ->
+ "@127.0.0.1";
+ _ -> ""
+ end,
+ case rtstart(" -name " ++ atom_to_list(?FUNCTION_NAME)++Domain) of
+ {ok, _SRPid, STPid, SState} ->
+ try
+ {ok, _CRPid, CTPid, CState} =
+ rtstart("-name undefined" ++ Domain ++
+ " -remsh " ++ atom_to_list(?FUNCTION_NAME)),
+ try
+ ok = send_commands(
+ STPid,
+ [{putline, ""},
+ {putline, "node()."},
+ {expect, "\\Q" ++ atom_to_list(?FUNCTION_NAME) ++ "\\E"}], 1),
+ ok = send_commands(
+ CTPid,
+ [{putline, ""},
+ {putline, "node()."},
+ {expect, "\\Q" ++ atom_to_list(?FUNCTION_NAME) ++ "\\E"} | quit_hosting_node()], 1)
+ after
+ rtnode_dump_logs(rtstop(CState))
+ end
+ after
+ rtnode_dump_logs(rtstop(SState))
+ end;
+ Else ->
+ Else
end.
-%% Test that -remsh works without epmd
+%% Test that -remsh works without epmd.
remsh_no_epmd(Config) when is_list(Config) ->
-
- case proplists:get_value(default_shell,Config) of
- old -> {skip,"Not supported in old shell"};
- new ->
- EPMD_ARGS = "-start_epmd false -erl_epmd_port 12345 ",
- case rtstart([],"ERL_EPMD_PORT=12345 ",
- EPMD_ARGS ++ " -sname " ++ atom_to_list(?FUNCTION_NAME)) of
- {ok, _SRPid, STPid, SState} ->
- try
- ok = get_and_put(
- STPid,
- [{putline,""},
- {putline,"node()."},
- {getline_re,atom_to_list(?FUNCTION_NAME)}], 1),
- {ok, _CRPid, CTPid, CState} =
- rtstart([],"ERL_EPMD_PORT=12345 ",
- EPMD_ARGS ++ " -remsh "++atom_to_list(?FUNCTION_NAME)),
- try
- ok = get_and_put(
- CTPid,
- [{kill_emulator_command,sigint},
- {putline,""},
- {putline,"node()."},
- {getline_re,atom_to_list(?FUNCTION_NAME)}], 1)
- after
- rtstop(CState)
- end
- after
- rtstop(SState)
- end;
- Else ->
- Else
- end
+ EPMD_ARGS = "-start_epmd false -erl_epmd_port 12345 ",
+ case rtstart([],"ERL_EPMD_PORT=12345 ",
+ EPMD_ARGS ++ " -sname " ++ atom_to_list(?FUNCTION_NAME)) of
+ {ok, _SRPid, STPid, SState} ->
+ try
+ ok = send_commands(
+ STPid,
+ [{putline, ""},
+ {putline, "node()."},
+ {expect, "\\Q" ++ atom_to_list(?FUNCTION_NAME) ++ "\\E"}], 1),
+ {ok, _CRPid, CTPid, CState} =
+ rtstart([],"ERL_EPMD_PORT=12345 ",
+ EPMD_ARGS ++ " -remsh "++atom_to_list(?FUNCTION_NAME)),
+ try
+ ok = send_commands(
+ CTPid,
+ [{putline, ""},
+ {putline, "node()."},
+ {expect, "\\Q" ++ atom_to_list(?FUNCTION_NAME) ++ "\\E"} | quit_hosting_node()], 1)
+ after
+ rtstop(CState)
+ end
+ after
+ rtstop(SState)
+ end;
+ Else ->
+ Else
end.
-rtnode(C,N) ->
- rtnode(C,N,[]).
-rtnode(Commands,Nodename,ErlPrefix) ->
- rtnode(Commands,Nodename,ErlPrefix,[]).
-rtnode(Commands,Nodename,ErlPrefix,Args) ->
- case rtstart(Nodename,ErlPrefix,Args) of
+rtnode(C) ->
+ rtnode(C, []).
+
+rtnode(C, N) ->
+ rtnode(C, N, []).
+
+rtnode(Commands, Nodename, ErlPrefix) ->
+ rtnode(Commands, Nodename, ErlPrefix, []).
+
+rtnode(Commands, Nodename, ErlPrefix, Args) ->
+ case rtstart(Nodename, ErlPrefix, Args) of
{ok, _SPid, CPid, RTState} ->
- erase(getline_skipped),
- Res = (catch get_and_put(CPid, Commands, 1)),
+ Res = catch send_commands(CPid, Commands, 1),
Logs = rtstop(RTState),
case Res of
ok ->
- {Res, Logs};
- _Else ->
+ rtnode_dump_logs(Logs),
+ ok;
+ _ ->
rtnode_dump_logs(Logs),
ok = Res
- end;
+ end,
+ {ok, Logs};
Skip ->
Skip
end.
rtstart(Args) ->
- rtstart([],[],Args).
-rtstart(Nodename,ErlPrefix,Args) ->
+ rtstart([], [], Args).
+
+rtstart(Nodename, ErlPrefix, Args) ->
case get_progs() of
{error,_Reason} ->
{skip,"No runerl present"};
@@ -844,20 +896,7 @@ rtstart(Nodename,ErlPrefix,Args) ->
rtstop({CPid, SPid, ToErl, Tempdir}) ->
case stop_runerl_node(CPid) of
{error,_} ->
- CPid2 =
- start_toerl_server(ToErl,Tempdir),
- erase(getline_skipped),
- ok = get_and_put
- (CPid2,
- [{putline,[7]},
- {sleep,
- timeout(short)},
- {putline,""},
- {getline," -->"},
- {putline,"s"},
- {putline,"c"},
- {putline,""}],1),
- stop_runerl_node(CPid2);
+ catch rtstop_try_harder(ToErl, Tempdir);
_ ->
ok
end,
@@ -866,6 +905,18 @@ rtstop({CPid, SPid, ToErl, Tempdir}) ->
file:del_dir_r(Tempdir),
Logs.
+rtstop_try_harder(ToErl, Tempdir) ->
+ CPid = start_toerl_server(ToErl, Tempdir),
+ ok = send_commands(CPid,
+ [{putline,[7]},
+ {expect, " --> $"},
+ {putline, "s"},
+ {putline, "c"},
+ {putline, ""}], 1),
+ stop_runerl_node(CPid).
+
+timeout(longest) ->
+ timeout(long) + timeout(normal);
timeout(long) ->
2 * timeout(normal);
timeout(short) ->
@@ -873,154 +924,72 @@ timeout(short) ->
timeout(normal) ->
10000 * test_server:timetrap_scale_factor().
-
-start_noshell_node(Name) ->
- PADir = filename:dirname(code:which(?MODULE)),
- {ok, Node} = test_server:start_node(Name,slave,[{args," -noshell -pa "++
- PADir++" "}]),
+start_node(Name, Args0) ->
+ PaDir = filename:dirname(code:which(?MODULE)),
+ Args1 = ["-pa",PaDir|Args0],
+ Args = lists:append(lists:join(" ", Args1)),
+ {ok, Node} = test_server:start_node(Name, slave, [{args,Args}]),
Node.
-stop_noshell_node(Node) ->
- test_server:stop_node(Node).
-get_and_put(_CPid,[],_) ->
- ok;
-get_and_put(CPid, [{sleep, X}|T],N) ->
+send_commands(CPid, [{sleep, X}|T], N) ->
?dbg({sleep, X}),
receive
after X ->
- get_and_put(CPid,T,N+1)
- end;
-get_and_put(CPid, [{kill_emulator_command, Cmd}|T],N) ->
- ?dbg({kill_emulator_command, Cmd}),
- CPid ! {self(), {kill_emulator_command, Cmd}},
- receive
- {kill_emulator_command,_Res} ->
- get_and_put(CPid,T,N)
- end;
-get_and_put(CPid, [{getline, Match}|T],N) ->
- ?dbg({getline, Match}),
- CPid ! {self(), {get_line, timeout(normal)}},
- receive
- {get_line, timeout} ->
- error_logger:error_msg("~p: getline timeout waiting for \"~s\" "
- "(command number ~p, skipped: ~p)~n",
- [?MODULE, Match,N,get(getline_skipped)]),
- {error, timeout};
- {get_line, Data} ->
- ?dbg({data,Data}),
- case lists:prefix(Match, Data) of
- true ->
- erase(getline_skipped),
- get_and_put(CPid, T,N+1);
- false ->
- case get(getline_skipped) of
- undefined ->
- put(getline_skipped,[Data]);
- List ->
- put(getline_skipped,List ++ [Data])
- end,
- get_and_put(CPid, [{getline, Match}|T],N)
- end
+ send_commands(CPid, T, N+1)
end;
-
-%% Hey ho copy paste from stdlib/io_proto_SUITE
-get_and_put(CPid, [{getline_re, Match}|T],N) ->
- ?dbg({getline_re, Match}),
- CPid ! {self(), {get_line, timeout(normal)}},
- receive
- {get_line, timeout} ->
- error_logger:error_msg("~p: getline_re timeout waiting for \"~s\" "
- "(command number ~p, skipped: ~p)~n",
- [?MODULE, Match,N,get(getline_skipped)]),
- {error, timeout};
- {get_line, Data} ->
- ?dbg({data,Data}),
- case re:run(Data, Match,[{capture,none}]) of
- match ->
- erase(getline_skipped),
- get_and_put(CPid, T,N+1);
- _ ->
- case get(getline_skipped) of
- undefined ->
- put(getline_skipped,[Data]);
- List ->
- put(getline_skipped,List ++ [Data])
- end,
- get_and_put(CPid, [{getline_re, Match}|T],N)
- end
- end;
-
-get_and_put(CPid, [{getdata, Match}|T],N) ->
- ?dbg({getdata, Match}),
- CPid ! {self(), {get_data, timeout(normal), Match}},
- receive
- {get_data, timeout} ->
- error_logger:error_msg("~p: getdata timeout waiting for \"~s\" "
- "(command number ~p, skipped: ~p)~n",
- [?MODULE, Match,N,get(getline_skipped)]),
- {error, timeout};
- {get_data, _Data} ->
- ?dbg({CPid,data,_Data}),
- get_and_put(CPid, T, N+1)
+send_commands(CPid, [{expect, Expect}|T], N) when is_list(Expect) ->
+ ?dbg(Exp),
+ case command(CPid, {expect, [Expect], timeout(normal)}) of
+ ok ->
+ send_commands(CPid, T, N + 1);
+ {expect_timeout, Got} ->
+ ct:pal("expect timed out waiting for ~p\ngot: ~p\n", [Expect,Got]),
+ {error, timeout};
+ Other ->
+ Other
end;
-
-get_and_put(CPid, [{putline_raw, Line}|T],N) ->
- ?dbg({putline_raw, Line}),
- CPid ! {self(), {send_line, Line}},
- Timeout = timeout(normal),
- receive
- {send_line, ok} ->
- get_and_put(CPid, T,N+1)
- after Timeout ->
- error_logger:error_msg("~p: putline_raw timeout (~p) sending "
- "\"~s\" (command number ~p)~n",
- [?MODULE, Timeout, Line, N]),
- {error, timeout}
+send_commands(CPid, [{putline, Line}|T], N) ->
+ send_commands(CPid, [{putdata, Line ++ "\n"}|T], N);
+send_commands(CPid, [{putdata, Data}|T], N) ->
+ ?dbg({putdata, Data}),
+ case command(CPid, {send_data, Data}) of
+ ok ->
+ send_commands(CPid, T, N+1);
+ Error ->
+ Error
end;
+send_commands(_CPid, [], _) ->
+ ok.
-get_and_put(CPid, [{putline, Line}|T],N) ->
- ?dbg({putline, Line}),
- CPid ! {self(), {send_line, Line}},
- Timeout = timeout(normal),
- receive
- {send_line, ok} ->
- get_and_put(CPid, [{getline, []}|T],N)
- after Timeout ->
- error_logger:error_msg("~p: putline timeout (~p) sending "
- "\"~s\" (command number ~p)~n[~p]~n",
- [?MODULE, Timeout, Line, N,get()]),
- {error, timeout}
- end;
-get_and_put(CPid, [{putdata, Data}|T],N) ->
- ?dbg({putdata, Data}),
- CPid ! {self(), {send_data, Data}},
- Timeout = timeout(normal),
+command(Pid, Req) ->
+ Timeout = timeout(longest),
+ Ref = erlang:monitor(process, Pid),
+ Pid ! {self(), Ref, Req},
receive
- {send_data, ok} ->
- get_and_put(CPid, T,N+1)
+ {Ref, Reply} ->
+ erlang:demonitor(Ref, [flush]),
+ Reply;
+ {'DOWN', Ref, _, _, Reason} ->
+ {error, Reason}
after Timeout ->
- error_logger:error_msg("~p: putline_raw timeout (~p) sending "
- "\"~s\" (command number ~p)~n",
- [?MODULE, Timeout, Data, N]),
- {error, timeout}
+ io:format("timeout while executing ~p\n", [Req]),
+ {error, timeout}
end.
wait_for_runerl_server(SPid) ->
- Ref = erlang:monitor(process, SPid),
+ Ref = erlang:monitor(process, SPid),
Timeout = timeout(long),
receive
- {'DOWN', Ref, process, SPid, _} ->
+ {'DOWN', Ref, process, SPid, _Reason} ->
ok
after Timeout ->
- {error, timeout}
+ {error, runerl_server_timeout}
end.
-
-
stop_runerl_node(CPid) ->
Ref = erlang:monitor(process, CPid),
CPid ! {self(), kill_emulator},
- Timeout = timeout(long),
+ Timeout = timeout(longest),
receive
{'DOWN', Ref, process, CPid, noproc} ->
ok;
@@ -1029,34 +998,38 @@ stop_runerl_node(CPid) ->
{'DOWN', Ref, process, CPid, {error, Reason}} ->
{error, Reason}
after Timeout ->
- {error, timeout}
+ {error, toerl_server_timeout}
end.
get_progs() ->
+ try
+ do_get_progs()
+ catch
+ throw:Thrown ->
+ {error, Thrown}
+ end.
+
+do_get_progs() ->
case os:type() of
{unix,freebsd} ->
- {error,"cant use run_erl on freebsd"};
+ throw("Can't use run_erl on FreeBSD");
{unix,openbsd} ->
- {error,"cant use run_erl on openbsd"};
+ throw("Can't use run_erl on OpenBSD");
{unix,_} ->
- case os:find_executable("run_erl") of
- RE when is_list(RE) ->
- case os:find_executable("to_erl") of
- TE when is_list(TE) ->
- case os:find_executable("erl") of
- E when is_list(E) ->
- {RE,TE,E};
- _ ->
- {error, "Could not find erl command"}
- end;
- _ ->
- {error, "Could not find to_erl command"}
- end;
- _ ->
- {error, "Could not find run_erl command"}
- end;
+ RunErl = find_executable("run_erl"),
+ ToErl = find_executable("to_erl"),
+ Erl = find_executable("erl"),
+ {RunErl, ToErl, Erl};
_ ->
- {error, "Not a unix OS"}
+ throw("Not a Unix OS")
+ end.
+
+find_executable(Name) ->
+ case os:find_executable(Name) of
+ Prog when is_list(Prog) ->
+ Prog;
+ false ->
+ throw("Could not find " ++ Name)
end.
create_tempdir() ->
@@ -1143,8 +1116,8 @@ try_to_erl(Command, N) ->
Port
end.
-toerl_server(Parent,ToErl,Tempdir) ->
- Port = try_to_erl("\""++ToErl++"\" "++Tempdir++"/ 2>/dev/null", 8),
+toerl_server(Parent, ToErl, TempDir) ->
+ Port = try_to_erl("\""++ToErl++"\" "++TempDir++"/ 2>/dev/null", 8),
case Port of
P when is_port(P) ->
Parent ! {self(),started};
@@ -1152,7 +1125,9 @@ toerl_server(Parent,ToErl,Tempdir) ->
Parent ! {self(),error,Other},
exit(Other)
end,
- case toerl_loop(#{ port => Port}) of
+
+ State = #{port => Port, acc => [], kill_emulator_command => init_stop},
+ case toerl_loop(State) of
normal ->
ok;
{error, Reason} ->
@@ -1161,100 +1136,133 @@ toerl_server(Parent,ToErl,Tempdir) ->
exit(Reason)
end.
-toerl_loop(#{ port := Port } = State0) ->
- ?dbg({toerl_loop, Port, maps:get(acc,State0,[]),
- maps:get(match,State0,nomatch)}),
+toerl_loop(#{port := Port} = State0) ->
+ ?dbg({toerl_loop, Port, map_get(acc, State0),
+ maps:get(match, State0, nomatch)}),
- State = handle_match(State0),
+ State = handle_expect(State0),
receive
{Port,{data,Data}} when is_port(Port) ->
?dbg({?LINE,Port,{data,Data}}),
- toerl_loop(State#{ acc => lists:flatten([maps:get(acc,State,[]),Data])});
- {Pid, {get_data, Timeout, Match}} ->
- toerl_loop(
- State#{ get =>
- #{ match => Match,
- timer => erlang:start_timer(Timeout, self(), timeout),
- tag => get_data,
- from => Pid }
- });
- {Pid, {get_line, Timeout}} ->
- toerl_loop(
- State#{ get =>
- #{ match => "\r\n",
- timer => erlang:start_timer(Timeout, self(), timeout),
- tag => get_line,
- from => Pid }
- });
- {Pid, {send_line, Data7}} ->
- Port ! {self(),{command, Data7++"\n"}},
- Pid ! {send_line, ok},
- toerl_loop(State);
- {Pid, {send_data, Data}} ->
- Port ! {self(),{command, Data}},
- Pid ! {send_data, ok},
- toerl_loop(State);
- {Pid, {kill_emulator_command, Cmd}} ->
- put(kill_emulator_command, Cmd),
- Pid ! {kill_emulator_command, ok},
+ toerl_loop(State#{acc => map_get(acc, State) ++ Data});
+ {Pid, Ref, {expect, Expect, Timeout}} ->
+ toerl_loop(init_expect(Pid, Ref, Expect, Timeout, State));
+ {Pid, Ref, {send_data, Data}} ->
+ Port ! {self(), {command, Data}},
+ Pid ! {Ref, ok},
toerl_loop(State);
{_Pid, kill_emulator} ->
- case get(kill_emulator_command) of
- undefined ->
- Port ! {self(),{command, "init:stop().\n"}};
- sigint ->
- ?dbg({putdata,[$\^c]}),
- Port ! {self(),{command, [$\^c]}},
- receive
- {Port,{data,_Data}} ->
- ?dbg({exit_data, _Data}),
- ok
- after 2000 ->
- ok
- end,
- ?dbg({putdata,"a\n"}),
- Port ! {self(),{command, "a\n"}}
- end,
- Timeout1 = timeout(long),
- receive
- {Port,eof} ->
- normal
- after Timeout1 ->
- {error, kill_timeout}
- end;
- {timeout,Timer,timeout} ->
- #{ get := #{ tag := Tag, from := Pid, timer := Timer } } = State,
- Pid ! {Tag, timeout},
- toerl_loop(maps:remove(get, State));
+ kill_emulator(State);
+ {timeout,Timer,expect_timeout} ->
+ toerl_loop(handle_expect_timeout(Timer, State));
{Port, eof} ->
{error, unexpected_eof};
Other ->
{error, {unexpected, Other}}
end.
-handle_match(#{ acc := Acc, get := #{ tag := Tag,
- match := Match,
- from := From,
- timer := Timer}} = State) ->
- case string:split(Acc, Match) of
- [Pre,Post] ->
- ?dbg({match,Pre}),
- From ! {Tag, Pre},
- erlang:cancel_timer(Timer),
- receive
- {timeout,Timer,timeout} ->
- ok
- after 0 ->
- ok
- end,
- maps:put(acc, Post, maps:remove(get, State));
- [Acc] ->
- State
+kill_emulator(#{port := Port}) ->
+ %% If the line happens to end in a ".", issuing "init:stop()."
+ %% will result in a syntax error. To avoid that, issue a "\n"
+ %% before "init:stop().".
+ Port ! {self(),{command, "\ninit:stop().\n"}},
+ wait_for_eof(Port).
+
+wait_for_eof(Port) ->
+ receive
+ {Port,eof} ->
+ normal;
+ _Other ->
+ wait_for_eof(Port)
+ after
+ timeout(long) ->
+ {error, kill_timeout}
+ end.
+
+init_expect(Pid, Ref, ExpectList, Timeout, State) ->
+ try compile_expect(ExpectList) of
+ Expect ->
+ Exp = #{expect => Expect,
+ ref => Ref,
+ source => ExpectList,
+ timer => erlang:start_timer(Timeout, self(), expect_timeout),
+ from => Pid},
+ State#{expect => Exp}
+ catch
+ Class:Reason:Stk ->
+ io:put_chars("Compilation of expect pattern failed:"),
+ io:format("~p\n", [ExpectList]),
+ io:put_chars(erl_error:format_exception(Class, Reason, Stk)),
+ exit(expect_pattern_error)
+ end.
+
+handle_expect(#{acc := Acc, expect := Exp} = State) ->
+ #{expect := Expect, from := Pid, ref := Ref} = Exp,
+ case Expect(Acc) of
+ nomatch ->
+ State;
+ {matched, Eaten, Result} ->
+ Pid ! {Ref, Result},
+ finish_expect(Eaten, State)
end;
-handle_match(State) ->
+handle_expect(State) ->
State.
+handle_expect_timeout(Timer, State) ->
+ #{acc := Acc, expect := Exp} = State,
+ #{expect := Expect, timer := Timer, from := Pid, ref := Ref} = Exp,
+ case Expect({timeout, Acc}) of
+ nomatch ->
+ Result = {expect_timeout, Acc},
+ Pid ! {Ref, Result},
+ finish_expect(0, State);
+ {matched, Eaten, Result} ->
+ Pid ! {Ref, Result},
+ finish_expect(Eaten, State)
+ end.
+
+finish_expect(Eaten, #{acc := Acc0,
+ expect := #{timer := Timer}}=State) ->
+ erlang:cancel_timer(Timer),
+ receive
+ {timeout,Timer,timeout} ->
+ ok
+ after 0 ->
+ ok
+ end,
+ Acc = lists:nthtail(Eaten, Acc0),
+ maps:remove(expect, State#{acc := Acc}).
+
+compile_expect([{timeout,Action}|T]) when is_function(Action, 1) ->
+ Next = compile_expect(T),
+ fun({timeout, _}=Tm) ->
+ {matched, 0, Action(Tm)};
+ (Subject) ->
+ Next(Subject)
+ end;
+compile_expect([{{re,RE0},Action}|T]) when is_binary(RE0), is_function(Action, 1) ->
+ {ok, RE} = re:compile(RE0),
+ Next = compile_expect(T),
+ fun({timeout, _}=Subject) ->
+ Next(Subject);
+ (Subject) ->
+ case re:run(Subject, RE, [{capture,first,index}]) of
+ nomatch ->
+ Next(Subject);
+ {match, [{Pos,Len}]} ->
+ Matched = binary:part(list_to_binary(Subject), Pos, Len),
+ {matched, Pos+Len, Action(Matched)}
+ end
+ end;
+compile_expect([RE|T]) when is_list(RE) ->
+ Ok = fun(_) -> ok end,
+ compile_expect([{{re,list_to_binary(RE)},Ok}|T]);
+compile_expect([]) ->
+ fun(_) ->
+ nomatch
+ end.
+
rtnode_check_logs(Logname, Pattern, Logs) ->
rtnode_check_logs(Logname, Pattern, true, Logs).
rtnode_check_logs(Logname, Pattern, Match, Logs) ->
@@ -1275,7 +1283,15 @@ rtnode_dump_logs(Logs) ->
end, Logs).
rtnode_read_logs(Tempdir) ->
- {ok, LogFiles} = file:list_dir(Tempdir),
+ {ok, LogFiles0} = file:list_dir(Tempdir),
+
+ %% Make sure that we only read log files and not any named pipes.
+ LogFiles = [F || F <- LogFiles0,
+ case F of
+ "erlang.log" ++ _ -> true;
+ _ -> false
+ end],
+
lists:foldl(
fun(File, Acc) ->
case file:read_file(filename:join(Tempdir, File)) of
@@ -1289,13 +1305,13 @@ rtnode_read_logs(Tempdir) ->
get_default_shell() ->
try
rtnode([{putline,""},
- {putline, "whereis(user_drv)."},
- {getline, "undefined"}],[]),
- old
+ {putline, "is_pid(whereis(user_drv))."},
+ {expect, "true\r\n"}], []),
+ new
catch _E:_R ->
?dbg({_E,_R}),
- new
+ old
end.
-atom2list(A) ->
- lists:flatten(io_lib:format("~s", [A])).
+printed_atom(A) ->
+ lists:flatten(io_lib:format("~w", [A])).
diff --git a/lib/kernel/test/kernel.spec b/lib/kernel/test/kernel.spec
index eaa17f3a59..fdf90c8ce2 100644
--- a/lib/kernel/test/kernel.spec
+++ b/lib/kernel/test/kernel.spec
@@ -1,5 +1,2 @@
-{config, "../test_server/ts.config"}.
-{config, "../test_server/ts.unix.config"}.
-
{suites,"../kernel_test", all}.
{skip_suites,"../kernel_test",[logger_stress_SUITE],"Benchmarks only"}.
diff --git a/lib/kernel/test/kernel_SUITE.erl b/lib/kernel/test/kernel_SUITE.erl
index a70aa1fa30..48e4db2ad3 100644
--- a/lib/kernel/test/kernel_SUITE.erl
+++ b/lib/kernel/test/kernel_SUITE.erl
@@ -23,7 +23,7 @@
-module(kernel_SUITE).
-include_lib("common_test/include/ct.hrl").
--compile(r21).
+-compile(r22).
%% Test server specific exports
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
@@ -55,7 +55,19 @@ init_per_group(_GroupName, Config) ->
end_per_group(_GroupName, Config) ->
Config.
-
+init_per_testcase(appup_test, Config) ->
+ %% We check if the test results were released using a version
+ %% of Erlang/OTP that was a tagged version or not. On a non-tagged
+ %% version this testcase most likely will fail.
+ case file:read_file(
+ filename:join(
+ proplists:get_value(data_dir,Config), "otp_version_tickets")) of
+ {ok,<<"DEVELOPMENT",_/binary>>} ->
+ {skip, "This is a development version, test might fail "
+ "because of incorrect version numbers"};
+ {ok,_NotDev} ->
+ Config
+ end;
init_per_testcase(_Case, Config) ->
Config.
end_per_testcase(_Case, _Config) ->
@@ -75,8 +87,6 @@ app_test(Config) when is_list(Config) ->
appup_test(_Config) ->
appup_tests(kernel,create_test_vsns(kernel)).
-appup_tests(_App,{[],[]}) ->
- {skip,"no previous releases available"};
appup_tests(App,{OkVsns0,NokVsns}) ->
application:load(App),
{_,_,Vsn} = lists:keyfind(App,1,application:loaded_applications()),
@@ -89,8 +99,7 @@ appup_tests(App,{OkVsns0,NokVsns}) ->
OkVsns0 ->
OkVsns0;
Ok ->
- ct:log("Current version, ~p, is same as in previous release.~n"
- "Removing this from the list of ok versions.",
+ ct:log("Removed current version ~p from the list of ok versions to test.",
[Vsn]),
Ok
end,
@@ -105,57 +114,46 @@ appup_tests(App,{OkVsns0,NokVsns}) ->
ok.
create_test_vsns(App) ->
- ThisMajor = erlang:system_info(otp_release),
- FirstMajor = previous_major(ThisMajor),
- SecondMajor = previous_major(previous_major(FirstMajor)),
- Ok = app_vsn(App,[ThisMajor,FirstMajor]),
- Nok0 = app_vsn(App,[SecondMajor]),
+ S = otp_vsns:read_state(),
+ Rel = list_to_integer(erlang:system_info(otp_release)),
+ AppStr = atom_to_list(App),
+ Ok = ok_app_vsns(S, Rel, AppStr),
+ Nok0 = nok_app_vsns(S, Rel, AppStr, hd(Ok)),
Nok = case Ok of
- [Ok1|_] ->
- [Ok1 ++ ",1" | Nok0]; % illegal
- _ ->
- Nok0
- end,
- {Ok,Nok}.
-
-previous_major("17") ->
- "r16b";
-previous_major("r16b") ->
- "r15b";
-previous_major(Rel) ->
- integer_to_list(list_to_integer(Rel)-1).
-
-app_vsn(App,[R|Rs]) ->
- OldRel =
- case test_server:is_release_available(R) of
- true ->
- {release,R};
- false ->
- case ct:get_config({otp_releases,list_to_atom(R)}) of
- undefined ->
- false;
- Prog0 ->
- case os:find_executable(Prog0) of
- false ->
- false;
- Prog ->
- {prog,Prog}
- end
- end
- end,
- case OldRel of
- false ->
- app_vsn(App,Rs);
- _ ->
- {ok,N} = test_server:start_node(prevrel,peer,[{erl,[OldRel]}]),
- _ = rpc:call(N,application,load,[App]),
- As = rpc:call(N,application,loaded_applications,[]),
- {_,_,V} = lists:keyfind(App,1,As),
- test_server:stop_node(N),
- [V|app_vsn(App,Rs)]
- end;
-app_vsn(_App,[]) ->
- [].
+ [Ok1|_] ->
+ [Ok1 ++ ",1" | Nok0]; % illegal
+ _ ->
+ Nok0
+ end,
+ {Ok, Nok}.
+
+ok_app_vsns(S, Rel, AppStr) ->
+ AppVsns0 = get_rel_app_vsns(S, Rel-2, AppStr),
+ AppVsns1 = get_rel_app_vsns(S, Rel-1, AppStr),
+ AppVsns2 = try
+ get_rel_app_vsns(S, Rel, AppStr)
+ catch
+ _:_ -> []
+ end,
+ lists:usort(AppVsns2 ++ AppVsns1 ++ AppVsns0).
+
+nok_app_vsns(S, Rel, AppStr, EarliestOkVsn) ->
+ AppVsns0 = get_rel_app_vsns(S, Rel-4, AppStr),
+ AppVsns1 = get_rel_app_vsns(S, Rel-3, AppStr),
+ %% Earliest OK version may exist in not OK versions
+ %% as well if there were no application version bump
+ %% between two releases, so we need to remove it
+ %% if that is the case...
+ lists:usort(AppVsns1 ++ AppVsns0) -- EarliestOkVsn.
+
+get_rel_app_vsns(S, Rel, App) ->
+ RelStr = integer_to_list(Rel),
+ OtpVsns = otp_vsns:branch_vsns(S, "maint-"++RelStr),
+ lists:map(fun (OtpVsn) ->
+ AppVsn = otp_vsns:app_vsn(S, OtpVsn, App),
+ [_, Vsn] = string:lexemes(AppVsn, "-"),
+ Vsn
+ end, OtpVsns).
check_appup([Vsn|Vsns],Instrs,Expected) ->
case systools_relup:appup_search_for_version(Vsn, Instrs) of
diff --git a/lib/kernel/test/kernel_smoke.spec b/lib/kernel/test/kernel_smoke.spec
index e5d8273c56..84be0a97bc 100644
--- a/lib/kernel/test/kernel_smoke.spec
+++ b/lib/kernel/test/kernel_smoke.spec
@@ -1,6 +1,3 @@
-{config, "../test_server/ts.config"}.
-{config, "../test_server/ts.unix.config"}.
-
{cases,"../kernel_test", inet_SUITE,[t_gethostbyaddr,t_gethostbyname,
t_gethostbyaddr_v6,t_gethostbyname_v6,t_gethostnative,getifaddrs]}.
{cases,"../kernel_test", inet_res_SUITE,[gethostbyaddr,gethostbyname,
diff --git a/lib/kernel/test/kernel_test_global_sys_monitor.erl b/lib/kernel/test/kernel_test_global_sys_monitor.erl
index 216e872bf4..f7a1e8501a 100644
--- a/lib/kernel/test/kernel_test_global_sys_monitor.erl
+++ b/lib/kernel/test/kernel_test_global_sys_monitor.erl
@@ -221,7 +221,7 @@ cast(Msg) ->
ok
catch
C:E:_ ->
- {error, {catched, C, E}}
+ {error, {caught, C, E}}
end.
@@ -234,7 +234,7 @@ call(Req, Timeout) when is_integer(Timeout) andalso (Timeout > 1000) ->
call(Req, Timeout) when is_integer(Timeout) ->
call(Req, Timeout, Timeout div 2).
-%% This peace of wierdness is because on some machines this call has
+%% This peace of weirdness is because on some machines this call has
%% hung (in a call during end_per_testcase, which had a 1 min timeout,
%% or if that was the total time for the test case).
%% But because it hung there, we don't really know what where it git stuck.
@@ -254,7 +254,7 @@ call(Req, Timeout1, Timeout2) ->
end
catch
C:E:_ ->
- {error, {catched, C, E}}
+ {error, {caught, C, E}}
end
end,
{Pid, Mon} = spawn_monitor(F),
diff --git a/lib/kernel/test/logger_SUITE.erl b/lib/kernel/test/logger_SUITE.erl
index f9ae51ae40..d2fae6bf94 100644
--- a/lib/kernel/test/logger_SUITE.erl
+++ b/lib/kernel/test/logger_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -38,8 +38,7 @@
suite() ->
- [{timetrap,{seconds,30}},
- {ct_hooks,[logger_test_lib]}].
+ [{timetrap,{seconds,30}}].
init_per_suite(Config) ->
case logger:get_handler_config(?STANDARD_HANDLER) of
@@ -77,7 +76,7 @@ end_per_testcase(Case, Config) ->
groups() ->
[].
-all() ->
+all() ->
[start_stop,
add_remove_handler,
multiple_handlers,
@@ -103,7 +102,9 @@ all() ->
process_metadata,
app_config,
kernel_config,
- pretty_print].
+ pretty_print,
+ pathological,
+ internal_log].
start_stop(_Config) ->
S = whereis(logger),
@@ -849,7 +850,7 @@ via_logger_process(Config) ->
case os:type() of
{win32,_} ->
- %% Skip this part on windows - cant change file mode"
+ %% Skip this part on windows - can't change file mode"
ok;
_ ->
%% This should trigger the same thing from erl_prim_loader
@@ -877,14 +878,13 @@ via_logger_process(cleanup, Config) ->
other_node(_Config) ->
ok = logger:add_handler(h1,?MODULE,#{level=>notice,filter_default=>log,
tc_proc=>self()}),
- {ok,Node} = test_server:start_node(?FUNCTION_NAME,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
rpc:call(Node,logger,error,[Msg=?str,#{}]),
check_logged(error,Msg,#{}),
+ peer:stop(Peer),
ok.
other_node(cleanup,_Config) ->
- Nodes = nodes(),
- [test_server:stop_node(Node) || Node <- Nodes],
logger:remove_handler(h1),
ok.
@@ -956,7 +956,7 @@ process_metadata(cleanup,_Config) ->
app_config(Config) ->
%% Start a node with default configuration
- {ok,_,Node} = logger_test_lib:setup(Config,[]),
+ {ok, _, Peer, Node} = logger_test_lib:setup(Config,[]),
App1Name = app1,
App1 = {application, App1Name,
@@ -978,35 +978,35 @@ app_config(Config) ->
{ok,#{filters:=DF}} = rpc:call(Node,logger,get_handler_config,[default]),
{ok,#{filters:=[]}} = rpc:call(Node,logger,get_handler_config,[myh]),
- true = test_server:stop_node(Node),
+ ok = peer:stop(Peer),
%% Start a node with no default handler, then add an own default handler
- {ok,#{handlers:=[#{id:=simple}]},Node} =
- logger_test_lib:setup(Config,[{logger,[{handler,default,undefined}]}]),
+ {ok, #{handlers := [#{id := simple}]}, Peer2, Node2} =
+ logger_test_lib:setup(Config, [{logger, [{handler, default, undefined}]}]),
- ok = rpc:call(Node,application,load,[App1]),
- ok = rpc:call(Node,application,set_env,
+ ok = rpc:call(Node2,application,load,[App1]),
+ ok = rpc:call(Node2,application,set_env,
[App1Name,logger,[{handler,default,logger_std_h,#{}}]]),
- ok = rpc:call(Node,logger,add_handlers,[App1Name]),
+ ok = rpc:call(Node2,logger,add_handlers,[App1Name]),
#{handlers:=[#{id:=default,filters:=DF}]} =
- rpc:call(Node,logger,get_config,[]),
+ rpc:call(Node2,logger,get_config,[]),
- true = test_server:stop_node(Node),
+ ok = peer:stop(Peer2),
%% Start a silent node, then add an own default handler
- {ok,#{handlers:=[]},Node} =
+ {ok,#{handlers:=[]}, Peer3, Node3} =
logger_test_lib:setup(Config,[{error_logger,silent}]),
{error,{bad_config,{handler,[{some,bad,config}]}}} =
- rpc:call(Node,logger,add_handlers,[[{some,bad,config}]]),
- ok = rpc:call(Node,logger,add_handlers,
+ rpc:call(Node3,logger,add_handlers,[[{some,bad,config}]]),
+ ok = rpc:call(Node3,logger,add_handlers,
[[{handler,default,logger_std_h,#{}}]]),
#{handlers:=[#{id:=default,filters:=DF}]} =
- rpc:call(Node,logger,get_config,[]),
+ rpc:call(Node3,logger,get_config,[]),
- ok.
+ ok = peer:stop(Peer3).
%% This test case is mainly to see code coverage. Note that
%% logger_env_var_SUITE tests a lot of the same, and checks the
@@ -1017,7 +1017,7 @@ kernel_config(Config) ->
%% start by calling logger:reconfigure(). This is to test all
%% variants of kernel config, including bad config, and see
%% the code coverage.
- {ok,#{handlers:=[#{id:=simple,filters:=DF}]}=LC,Node} =
+ {ok,#{handlers:=[#{id:=simple,filters:=DF}]}=LC, Peer, Node} =
logger_test_lib:setup(Config,[{error_logger,false}]),
%% Same once more, to get coverage
@@ -1151,7 +1151,7 @@ kernel_config(Config) ->
{error,{bad_config,{kernel,{invalid_level,bad}}}} =
rpc:call(Node,logger,reconfigure,[]),
- ok.
+ ok = peer:stop(Peer).
pretty_print(_Config) ->
ok = logger:add_handler(?FUNCTION_NAME,logger_std_h,#{}),
@@ -1208,6 +1208,45 @@ pretty_print(_Config) ->
IHs = ["Handler configuration: \n"|IHs2],
ok.
+pathological(cleanup,_Config) ->
+ logger:remove_handler(p1),
+ logger:set_primary_config(level,notice),
+ logger:unset_module_level(?MODULE),
+ ok.
+
+pathological(_Config) ->
+ ok = logger:set_primary_config(level,all),
+ ok = logger:add_handler(p1,?MODULE,#{level=>all,filter_default=>log}),
+ logger:notice(string, []),
+ check_logged(notice,"string",[],#{}),
+ logger:notice(report, []),
+ check_logged(notice,"report",[],#{}),
+ ok.
+
+internal_log(_Config) ->
+ register(callback_receiver, self()),
+ {error, {not_found, h1}} = logger:get_handler_config(h1),
+ ok = logger:add_handler(h1, ?MODULE, #{tc_proc => self()}),
+ OriginalMeta = #{
+ mfa => {orig_mod, orig_func, 0},
+ line => 0,
+ file => "path/to/orig_mod.beam",
+ pid => self(),
+ time => logger:timestamp(),
+ gl => group_leader()
+ },
+ OriginalLog = #{
+ level => notice,
+ msg => "Original log",
+ meta => OriginalMeta
+ },
+ Report = [{testing, internal_log}],
+
+ ?LOG_INTERNAL(notice, OriginalLog, Report),
+ ok = check_logged(notice, Report, ?MY_LOC(1)),
+
+ ok.
+
%%%-----------------------------------------------------------------
%%% Internal
check_logged(Level,Format,Args,Meta) ->
@@ -1288,7 +1327,7 @@ test_api(Level) ->
logger:Level("~w: ~w",[Level,fa]),
ok = check_logged(Level,"~w: ~w",[Level,fa],#{}),
logger:Level('~w: ~w',[Level,fa]),
- ok = check_logged(Level,'~w: ~w',[Level,fa],#{}),
+ ok = check_logged(Level,"~w: ~w",[Level,fa],#{}),
logger:Level(<<"~w: ~w">>,[Level,fa]),
ok = check_logged(Level,<<"~w: ~w">>,[Level,fa],#{}),
logger:Level("~w: ~w ~w",[Level,fa,meta],#{my=>meta}),
@@ -1301,7 +1340,7 @@ test_api(Level) ->
ok = check_logged(Level,<<"~w: ~w ~w">>,[Level,fun_to_fa,meta],#{my=>meta}),
logger:Level(fun(x) -> {'~w: ~w ~w',[Level,fun_to_fa,meta]} end,x,
#{my=>meta}),
- ok = check_logged(Level,'~w: ~w ~w',[Level,fun_to_fa,meta],#{my=>meta}),
+ ok = check_logged(Level,"~w: ~w ~w",[Level,fun_to_fa,meta],#{my=>meta}),
logger:Level(fun(x) -> #{Level=>fun_to_r,meta=>true} end,x,
#{my=>meta}),
ok = check_logged(Level,#{Level=>fun_to_r,meta=>true},#{my=>meta}),
@@ -1332,7 +1371,7 @@ test_log_function(Level) ->
ok = check_logged(Level,<<"~w: ~w ~w">>,[Level,fun_to_fa,meta],#{my=>meta}),
logger:log(Level,fun(x) -> {'~w: ~w ~w',[Level,fun_to_fa,meta]} end,
x, #{my=>meta}),
- ok = check_logged(Level,'~w: ~w ~w',[Level,fun_to_fa,meta],#{my=>meta}),
+ ok = check_logged(Level,"~w: ~w ~w",[Level,fun_to_fa,meta],#{my=>meta}),
logger:log(Level,fun(x) -> #{Level=>fun_to_r,meta=>true} end,
x, #{my=>meta}),
ok = check_logged(Level,#{Level=>fun_to_r,meta=>true},#{my=>meta}),
diff --git a/lib/kernel/test/logger_disk_log_h_SUITE.erl b/lib/kernel/test/logger_disk_log_h_SUITE.erl
index 7bfcd2a397..a4e4e52309 100644
--- a/lib/kernel/test/logger_disk_log_h_SUITE.erl
+++ b/lib/kernel/test/logger_disk_log_h_SUITE.erl
@@ -47,8 +47,7 @@
-define(domain,#{domain=>[?MODULE]}).
suite() ->
- [{timetrap,{seconds,30}},
- {ct_hooks,[logger_test_lib]}].
+ [{timetrap,{seconds,30}}].
init_per_suite(Config) ->
timer:start(), % to avoid progress report
@@ -348,7 +347,7 @@ errors(Config) ->
config,
#{file=>"newfilename"}),
- %% Read-only fields may (accidentially) be included in the change,
+ %% Read-only fields may (accidentally) be included in the change,
%% but it won't take effect
{ok,C} = logger:get_handler_config(Name1),
ok = logger:set_handler_config(Name1,config,#{olp=>dummyvalue}),
diff --git a/lib/kernel/test/logger_env_var_SUITE.erl b/lib/kernel/test/logger_env_var_SUITE.erl
index 270403e83a..8ac40e9e70 100644
--- a/lib/kernel/test/logger_env_var_SUITE.erl
+++ b/lib/kernel/test/logger_env_var_SUITE.erl
@@ -27,8 +27,7 @@
-import(logger_test_lib,[setup/2,log/3,sync_and_read/3]).
suite() ->
- [{timetrap,{seconds,60}},
- {ct_hooks,[logger_test_lib]}].
+ [{timetrap, {seconds, 60}}].
init_per_suite(Config) ->
Config.
@@ -80,7 +79,7 @@ all() ->
].
default(Config) ->
- {ok,#{primary:=P,handlers:=Hs,module_levels:=ML},_Node} = setup(Config,[]),
+ {ok, #{primary := P, handlers := Hs, module_levels := ML}, Peer, _Node} = setup(Config, []),
notice = maps:get(level,P),
true = #{} == maps:get(metadata,P),
#{module:=logger_std_h} = StdC = find(?STANDARD_HANDLER,Hs),
@@ -90,11 +89,11 @@ default(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
default_sasl_compatible(Config) ->
- {ok,#{primary:=P,handlers:=Hs,module_levels:=ML},_Node} =
- setup(Config,[{logger_sasl_compatible,true}]),
+ {ok, #{primary := P, handlers := Hs, module_levels := ML}, Peer, _Node} =
+ setup(Config, [{logger_sasl_compatible, true}]),
info = maps:get(level,P),
#{module:=logger_std_h} = StdC = find(?STANDARD_HANDLER,Hs),
all = maps:get(level,StdC),
@@ -103,11 +102,11 @@ default_sasl_compatible(Config) ->
false = exists(simple,Hs),
true = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
error_logger_tty(Config) ->
- {ok,#{primary:=P,handlers:=Hs,module_levels:=ML},_Node} =
- setup(Config,[{error_logger,tty}]),
+ {ok, #{primary := P, handlers := Hs, module_levels := ML}, Peer, _Node} =
+ setup(Config, [{error_logger, tty}]),
notice = maps:get(level,P),
#{module:=logger_std_h} = StdC = find(?STANDARD_HANDLER,Hs),
all = maps:get(level,StdC),
@@ -116,10 +115,10 @@ error_logger_tty(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
error_logger_tty_sasl_compatible(Config) ->
- {ok,#{primary:=P,handlers:=Hs,module_levels:=ML},_Node} =
+ {ok, #{primary := P, handlers := Hs, module_levels := ML}, Peer, _Node} =
setup(Config,
[{error_logger,tty},
{logger_sasl_compatible,true}]),
@@ -131,10 +130,10 @@ error_logger_tty_sasl_compatible(Config) ->
false = exists(simple,Hs),
true = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
error_logger_false(Config) ->
- {ok,#{handlers:=Hs,primary:=P,module_levels:=ML},_Node} =
+ {ok, #{handlers := Hs, primary := P, module_levels := ML}, Peer, _Node} =
setup(Config,
[{error_logger,false},
{logger_level,notice}]),
@@ -146,10 +145,10 @@ error_logger_false(Config) ->
{domain,{_,{log,super,[otp,sasl]}}} = lists:keyfind(domain,1,SimpleFilters),
false = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
error_logger_false_progress(Config) ->
- {ok,#{handlers:=Hs,primary:=P,module_levels:=ML},_Node} =
+ {ok, #{handlers := Hs, primary := P, module_levels := ML}, Peer, _Node} =
setup(Config,
[{error_logger,false},
{logger_level,notice}]),
@@ -161,10 +160,10 @@ error_logger_false_progress(Config) ->
{domain,{_,{log,super,[otp,sasl]}}} = lists:keyfind(domain,1,SimpleFilters),
false = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
error_logger_false_sasl_compatible(Config) ->
- {ok,#{handlers:=Hs,primary:=P,module_levels:=ML},_Node} =
+ {ok, #{handlers := Hs, primary := P, module_levels := ML}, Peer, _Node} =
setup(Config,
[{error_logger,false},
{logger_level,notice},
@@ -177,39 +176,39 @@ error_logger_false_sasl_compatible(Config) ->
{domain,{_,{log,super,[otp]}}} = lists:keyfind(domain,1,SimpleFilters),
true = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
error_logger_silent(Config) ->
- {ok,#{handlers:=Hs},_Node} = setup(Config,
- [{error_logger,silent}]),
+ {ok, #{handlers := Hs}, Peer, _Node} = setup(Config,
+ [{error_logger, silent}]),
false = exists(?STANDARD_HANDLER,Hs),
false = exists(simple,Hs),
false = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
error_logger_silent_sasl_compatible(Config) ->
- {ok,#{handlers:=Hs},_Node} = setup(Config,
+ {ok, #{handlers := Hs}, Peer, _Node} = setup(Config,
[{error_logger,silent},
{logger_sasl_compatible,true}]),
false = exists(?STANDARD_HANDLER,Hs),
false = exists(simple,Hs),
true = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
error_logger_file(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,_,Node} = setup(Config,
+ {ok, _, Peer, Node} = setup(Config,
[{error_logger,{file,Log}}]),
check_default_log(Node,Log,
file,% dest
0),% progress in std logger
- ok.
+ ok = peer:stop(Peer).
logger_file(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{primary:=P,handlers:=Hs,module_levels:=ML},Node}
+ {ok, #{primary := P, handlers := Hs, module_levels := ML}, Peer, Node}
= setup(Config,
[{logger,
[{handler,?STANDARD_HANDLER,logger_std_h,
@@ -226,11 +225,11 @@ logger_file(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
logger_file_sasl_compatible(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{primary:=P,handlers:=Hs,module_levels:=ML},Node}
+ {ok, #{primary := P, handlers := Hs, module_levels := ML}, Peer, Node}
= setup(Config,
[{logger_sasl_compatible,true},
{logger,
@@ -248,11 +247,11 @@ logger_file_sasl_compatible(Config) ->
false = exists(simple,Hs),
true = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
logger_file_log_progress(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{primary:=P,handlers:=Hs,module_levels:=ML},Node}
+ {ok, #{primary := P, handlers := Hs, module_levels := ML}, Peer, Node}
= setup(Config,
[{logger_level,info},
{logger,
@@ -271,11 +270,11 @@ logger_file_log_progress(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
[] = ML,
- ok.
+ ok = peer:stop(Peer).
logger_file_no_filter(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs},Node}
+ {ok, #{handlers := Hs}, Peer, Node}
= setup(Config,
[{logger,
[{handler,?STANDARD_HANDLER,logger_std_h,
@@ -291,11 +290,11 @@ logger_file_no_filter(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
logger_file_no_filter_level(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs},Node}
+ {ok, #{handlers := Hs}, Peer, Node}
= setup(Config,
[{logger,
[{handler,?STANDARD_HANDLER,logger_std_h,
@@ -312,11 +311,11 @@ logger_file_no_filter_level(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
logger_file_formatter(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs},Node}
+ {ok, #{handlers := Hs}, Peer, Node}
= setup(Config,
[{logger,
[{handler,?STANDARD_HANDLER,logger_std_h,
@@ -333,11 +332,11 @@ logger_file_formatter(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
logger_filters(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs,primary:=P},Node}
+ {ok, #{handlers := Hs, primary := P}, Peer, Node}
= setup(Config,
[{logger_level,info},
{logger,
@@ -359,11 +358,11 @@ logger_filters(Config) ->
LoggerFilters = maps:get(filters,P),
true = lists:keymember(stop_progress,1,LoggerFilters),
- ok.
+ ok = peer:stop(Peer).
logger_filters_stop(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs,primary:=P},Node}
+ {ok, #{handlers := Hs, primary := P}, Peer, Node}
= setup(Config,
[{logger_level,info},
{logger,
@@ -385,11 +384,11 @@ logger_filters_stop(Config) ->
LoggerFilters = maps:get(filters,P),
true = lists:keymember(log_error,1,LoggerFilters),
- ok.
+ ok = peer:stop(Peer).
logger_module_level(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs,module_levels:=ModuleLevels},Node}
+ {ok, #{handlers := Hs, module_levels := ModuleLevels}, Peer, Node}
= setup(Config,
[{logger_level,info},
{logger,
@@ -409,11 +408,11 @@ logger_module_level(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
[{supervisor,error}] = ModuleLevels,
- ok.
+ ok = peer:stop(Peer).
logger_disk_log(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs},Node}
+ {ok, #{handlers := Hs}, Peer, Node}
= setup(Config,
[{logger,
[{handler,?STANDARD_HANDLER,logger_disk_log_h,
@@ -429,11 +428,11 @@ logger_disk_log(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
logger_disk_log_formatter(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,#{handlers:=Hs},Node}
+ {ok, #{handlers := Hs}, Peer, Node}
= setup(Config,
[{logger,
[{handler,?STANDARD_HANDLER,logger_disk_log_h,
@@ -450,10 +449,10 @@ logger_disk_log_formatter(Config) ->
false = exists(simple,Hs),
false = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
logger_undefined(Config) ->
- {ok,#{handlers:=Hs,primary:=P},_Node} =
+ {ok, #{handlers := Hs, primary := P}, Peer, _Node} =
setup(Config,[{logger,[{handler,?STANDARD_HANDLER,undefined}]}]),
false = exists(?STANDARD_HANDLER,Hs),
#{module:=logger_simple_h} = SimpleC = find(simple,Hs),
@@ -462,7 +461,7 @@ logger_undefined(Config) ->
SimpleFilters = maps:get(filters,SimpleC),
{domain,{_,{log,super,[otp,sasl]}}} = lists:keyfind(domain,1,SimpleFilters),
false = exists(sasl,Hs),
- ok.
+ ok = peer:stop(Peer).
%% Test that we can add multiple handlers with the default first
@@ -530,7 +529,7 @@ logger_many_handlers_default_last_broken_filter(Config) ->
{logger_level,info}], LogErr, LogInfo, 7).
logger_many_handlers(Config, Env, LogErr, LogInfo, NumProgress) ->
- {ok,_,Node} = setup(Config,Env),
+ {ok, _, Peer, Node} = setup(Config, Env),
check_single_log(Node,LogErr,
file,% dest
0,% progress in std logger
@@ -542,12 +541,12 @@ logger_many_handlers(Config, Env, LogErr, LogInfo, NumProgress) ->
match(Bin,<<"notice:">>,1,notice,info),
match(Bin,<<"alert:">>,0,alert,info),
- ok.
+ peer:stop(Peer).
logger_proxy(Config) ->
%% assume current node runs with default settings
DefOpts = logger_olp:get_opts(logger_proxy),
- {ok,_,Node} = setup(Config,
+ {ok, _, Peer, Node} = setup(Config,
[{logger,[{proxy,#{sync_mode_qlen=>0,
drop_mode_qlen=>2}}]}]),
Expected = DefOpts#{sync_mode_qlen:=0,
@@ -555,17 +554,17 @@ logger_proxy(Config) ->
Expected = rpc:call(Node,logger_olp,get_opts,[logger_proxy]),
Expected = rpc:call(Node,logger,get_proxy_config,[]),
- ok.
+ peer:stop(Peer).
logger_metadata(Config) ->
- {ok,#{ primary := #{ metadata := #{ test := test } } }, _}
+ {ok,#{ primary := #{ metadata := #{ test := test } } }, Peer, _}
= setup(Config, [{logger_metadata,#{ test => test }}]),
- ok.
+ peer:stop(Peer).
sasl_compatible_false(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,_,Node} = setup(Config,
+ {ok, _, Peer, Node} = setup(Config,
[{error_logger,{file,Log}},
{logger_sasl_compatible,false},
{logger_level,info}]), % to get progress
@@ -573,27 +572,27 @@ sasl_compatible_false(Config) ->
file,% dest
6,% progress in std logger
info),
- ok.
+ peer:stop(Peer).
sasl_compatible_false_no_progress(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,_,Node} = setup(Config,
+ {ok, _, Peer, Node} = setup(Config,
[{error_logger,{file,Log}},
{logger_sasl_compatible,false}]),
check_default_log(Node,Log,
file,% dest
0),% progress in std logger
- ok.
+ peer:stop(Peer).
sasl_compatible(Config) ->
Log = file(Config,?FUNCTION_NAME),
- {ok,_,Node} = setup(Config,
+ {ok, _, Peer, Node} = setup(Config,
[{error_logger,{file,Log}},
{sasl_compatible,true}]),
check_default_log(Node,Log,
file,% dest
0),% progress in std logger
- ok.
+ peer:stop(Peer).
all_logger_level(Config) ->
[all_logger_level(Config,Level) || Level <- [none,
@@ -609,9 +608,8 @@ all_logger_level(Config) ->
ok.
all_logger_level(Config,Level) ->
- {ok,#{primary:=#{level:=Level}},Node} = setup(Config,[{logger_level,Level}]),
- true = test_server:stop_node(Node),
- ok.
+ {ok, #{primary := #{level := Level}}, Peer, _Node} = setup(Config, [{logger_level, Level}]),
+ peer:stop(Peer).
bad_error_logger(Config) ->
error = setup(Config,[{error_logger,baddest}]).
diff --git a/lib/kernel/test/logger_proxy_SUITE.erl b/lib/kernel/test/logger_proxy_SUITE.erl
index 2151dc11f3..cf0deccc88 100644
--- a/lib/kernel/test/logger_proxy_SUITE.erl
+++ b/lib/kernel/test/logger_proxy_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -41,8 +41,7 @@
-define(ENSURE_TIME,5000).
suite() ->
- [{timetrap,{seconds,30}},
- {ct_hooks,[logger_test_lib]}].
+ [{timetrap,{seconds,30}}].
init_per_suite(Config) ->
Config.
@@ -109,18 +108,18 @@ emulator(cleanup,_Config) ->
ok = logger:remove_handler(?HNAME).
remote(Config) ->
- {ok,_,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
+ {ok,_,Peer,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
ok = logger:add_handler(?HNAME,?MODULE,#{config=>self()}),
L1 = ?LOC, spawn(Node,fun() -> logger:notice("Log from ~p; ~p",[?FUNCTION_NAME,?LINE],L1) end),
ok = ensure(L1),
L2 = ?LOC, spawn(Node,fun() -> logger:notice([{test_case,?FUNCTION_NAME},{line,?LINE}],L2) end),
ok = ensure(L2),
- ok.
+ ok = peer:stop(Peer).
remote(cleanup,_Config) ->
ok = logger:remove_handler(?HNAME).
remote_disconnect(Config) ->
- {ok,_,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
+ {ok,_,Peer,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
ok = logger:add_handler(?HNAME,?MODULE,#{config=>self()}),
RemoteGL = rpc:call(Node, erlang, whereis, [user]),
net_kernel:disconnect(Node),
@@ -128,16 +127,16 @@ remote_disconnect(Config) ->
ok = ensure(L1),
L2 = ?LOC#{ gl => RemoteGL }, logger:notice([{test_case,?FUNCTION_NAME},{line,?LINE}],L2),
ok = ensure(L2),
- ok.
+ ok = peer:stop(Peer).
remote_disconnect(cleanup,_Config) ->
ok = logger:remove_handler(?HNAME).
remote_emulator(Config) ->
- {ok,_,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
+ {ok,_,Peer,Node} = logger_test_lib:setup(Config,[{logger,[{proxy,#{}}]}]),
ok = logger:add_handler(?HNAME,?MODULE,#{config=>self()}),
Pid = spawn(Node,fun() -> erlang:error(some_reason) end),
ok = ensure(#{pid=>Pid}),
- ok.
+ ok = peer:stop(Peer).
remote_emulator(cleanup,_Config) ->
ok = logger:remove_handler(?HNAME).
diff --git a/lib/kernel/test/logger_simple_h_SUITE.erl b/lib/kernel/test/logger_simple_h_SUITE.erl
index e0ad792bdb..8ac52e54c7 100644
--- a/lib/kernel/test/logger_simple_h_SUITE.erl
+++ b/lib/kernel/test/logger_simple_h_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -44,8 +44,7 @@
-define(keyval_rep,[{function,?FUNCTION_NAME}, {line,?LINE}]).
suite() ->
- [{timetrap,{seconds,30}},
- {ct_hooks, [logger_test_lib]}].
+ [{timetrap,{seconds,30}}].
init_per_suite(Config) ->
Hs0 = logger:get_handler_config(),
@@ -106,7 +105,7 @@ start_stop(cleanup,_Config) ->
%% to stdout which we cannot read from in a detached slave.
replace_default(Config) ->
- {ok, _, Node} = logger_test_lib:setup(Config, [{logger, [{handler, default, undefined}]}]),
+ {ok, _, Peer, Node} = logger_test_lib:setup(Config, [{logger, [{handler, default, undefined}]}]),
log(Node, emergency, [?str]),
log(Node, alert, [?str,[]]),
log(Node, error, [?map_rep]),
@@ -119,11 +118,11 @@ replace_default(Config) ->
ok = rpc:call(Node, logger, add_handlers, [kernel]),
- ok.
+ ok = peer:stop(Peer).
replace_file(Config) ->
- {ok, _, Node} = logger_test_lib:setup(Config, [{logger, [{handler, default, undefined}]}]),
+ {ok, _, Peer, Node} = logger_test_lib:setup(Config, [{logger, [{handler, default, undefined}]}]),
log(Node, emergency, [M1=?str]),
log(Node, alert, [M2=?str,[]]),
log(Node, error, [?map_rep]),
@@ -163,11 +162,11 @@ replace_file(Config) ->
"=NOTICE REPORT===="++_,
_
] = Lines,
- ok.
+ ok = peer:stop(Peer).
replace_disk_log(Config) ->
- {ok, _, Node} = logger_test_lib:setup(Config, [{logger, [{handler, default, undefined}]}]),
+ {ok, _, Peer, Node} = logger_test_lib:setup(Config, [{logger, [{handler, default, undefined}]}]),
log(Node, emergency, [M1=?str]),
log(Node, alert, [M2=?str,[]]),
log(Node, error, [?map_rep]),
@@ -206,4 +205,4 @@ replace_disk_log(Config) ->
"=NOTICE REPORT===="++_,
_
] = Lines,
- ok.
+ ok = peer:stop(Peer).
diff --git a/lib/kernel/test/logger_std_h_SUITE.erl b/lib/kernel/test/logger_std_h_SUITE.erl
index aa31993b9a..08962eec0f 100644
--- a/lib/kernel/test/logger_std_h_SUITE.erl
+++ b/lib/kernel/test/logger_std_h_SUITE.erl
@@ -51,8 +51,7 @@
-define(domain,#{domain=>[?MODULE]}).
suite() ->
- [{timetrap,{seconds,30}},
- {ct_hooks,[logger_test_lib]}].
+ [{timetrap,{seconds,30}}].
init_per_suite(Config) ->
timer:start(), % to avoid progress report
@@ -405,7 +404,7 @@ config_fail(_Config) ->
logger:set_handler_config(?MODULE, config,
#{filesync_rep_int => 2000}),
- %% Read-only fields may (accidentially) be included in the change,
+ %% Read-only fields may (accidentally) be included in the change,
%% but it won't take effect
{ok,C} = logger:get_handler_config(?MODULE),
ok = logger:set_handler_config(?MODULE,config,#{olp=>dummyvalue}),
@@ -841,7 +840,7 @@ write_failure(Config) ->
Dir = ?config(priv_dir, Config),
File = lists:concat([?MODULE,"_",?FUNCTION_NAME,".log"]),
Log = filename:join(Dir, File),
- Node = start_std_h_on_new_node(Config, Log),
+ {Peer, Node} = start_std_h_on_new_node(Config, Log),
false = (undefined == rpc:call(Node, ets, whereis, [?TEST_HOOKS_TAB])),
rpc:call(Node, ets, insert, [?TEST_HOOKS_TAB,{tester,self()}]),
rpc:call(Node, ?MODULE, set_internal_log, [?MODULE,internal_log]),
@@ -869,16 +868,13 @@ write_failure(Config) ->
rpc:call(Node, logger_std_h, filesync, [?STANDARD_HANDLER]),
?check_no_log,
try_read_file(Log, {ok,<<"Logged1\nLogged2\n">>}, filesync_rep_int()),
- ok.
-write_failure(cleanup, _Config) ->
- Nodes = nodes(),
- [test_server:stop_node(Node) || Node <- Nodes].
+ peer:stop(Peer).
sync_failure(Config) ->
Dir = ?config(priv_dir, Config),
File = lists:concat([?MODULE,"_",?FUNCTION_NAME,".log"]),
Log = filename:join(Dir, File),
- Node = start_std_h_on_new_node(Config, Log),
+ {Peer, Node} = start_std_h_on_new_node(Config, Log),
false = (undefined == rpc:call(Node, ets, whereis, [?TEST_HOOKS_TAB])),
rpc:call(Node, ets, insert, [?TEST_HOOKS_TAB,{tester,self()}]),
rpc:call(Node, ?MODULE, set_internal_log, [?MODULE,internal_log]),
@@ -907,20 +903,17 @@ sync_failure(Config) ->
rpc:call(Node, ?MODULE, set_result, [file_datasync,ok]),
ok = log_on_remote_node(Node, "Logged2"),
?check_no_log,
- ok.
-sync_failure(cleanup, _Config) ->
- Nodes = nodes(),
- [test_server:stop_node(Node) || Node <- Nodes].
+ peer:stop(Peer).
start_std_h_on_new_node(Config, Log) ->
- {ok,_,Node} =
+ {ok,_,Peer,Node} =
logger_test_lib:setup(
Config,
[{logger,[{handler,default,logger_std_h,
#{ config => #{ type => {file,Log}}}}]}]),
ok = rpc:call(Node,logger,set_handler_config,[?STANDARD_HANDLER,formatter,
{?MODULE,nl}]),
- Node.
+ {Peer, Node}.
%% functions for test hook macros to be called by rpc
set_internal_log(_Mod, _Func) ->
@@ -1747,7 +1740,7 @@ rotation_opts_restart_handler(Config) ->
{ok,#file_info{size=260}} = file:read_file_info(Log),
[] = filelib:wildcard(Log++".*"),
- %% Stop/start handler and trun on rotation. Check that file is rotated.
+ %% Stop/start handler and turn on rotation. Check that file is rotated.
{ok,#{config:=StdHConfig2}=HConfig2} = logger:get_handler_config(?MODULE),
ok = logger:remove_handler(?MODULE),
ok = logger:add_handler(
@@ -1780,7 +1773,7 @@ rotation_opts_restart_handler(Config) ->
{ok,#file_info{size=29}} = file:read_file_info(Log++".0.gz"),
[_] = filelib:wildcard(Log++".*"),
- %% Stop/start handler and turn off compression. Check that achives
+ %% Stop/start handler and turn off compression. Check that archives
%% are decompressed.
{ok,#{config:=StdHConfig4}=HConfig4} = logger:get_handler_config(?MODULE),
ok = logger:remove_handler(?MODULE),
diff --git a/lib/kernel/test/logger_test_lib.erl b/lib/kernel/test/logger_test_lib.erl
index be4bc427fb..3bc23de422 100644
--- a/lib/kernel/test/logger_test_lib.erl
+++ b/lib/kernel/test/logger_test_lib.erl
@@ -1,7 +1,7 @@
%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2018. All Rights Reserved.
+%% Copyright Ericsson AB 2018-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,34 +20,29 @@
-module(logger_test_lib).
-include_lib("kernel/src/logger_internal.hrl").
+-include_lib("common_test/include/ct.hrl").
-export([setup/2, log/3, sync_and_read/3]).
--export([init/2,
- pre_init_per_suite/3, pre_init_per_testcase/4,
- post_end_per_testcase/5, post_end_per_suite/3]).
-
setup(Config,Vars) ->
Postfix = case proplists:get_value(postfix, Config) of
undefined -> "";
P -> ["_",P]
end,
- FuncStr = lists:concat([proplists:get_value(suite, Config), "_",
- proplists:get_value(tc, Config)|
- Postfix]),
+ TestCase = proplists:get_value(tc, Config),
+ FuncStr = lists:concat([proplists:get_value(suite, Config), "_", TestCase | Postfix]),
ConfigFileName = filename:join(proplists:get_value(priv_dir, Config), FuncStr),
file:write_file(ConfigFileName ++ ".config", io_lib:format("[{kernel, ~p}].",[Vars])),
- Sname = lists:concat([proplists:get_value(tc,Config)|Postfix]),
- case test_server:start_node(Sname, slave,
- [{args, ["-pa ",filename:dirname(code:which(?MODULE)),
- " -boot start_sasl -kernel start_timer true "
- "-config ",ConfigFileName]}]) of
- {ok, Node} ->
- L = rpc:call(Node, logger, get_config, []),
- ct:log("~p",[L]),
- {ok, L, Node};
- {error, Reason} ->
- ct:log("Failed to start node: ~p",[Reason]),
+ Args = ["-boot", "start_sasl", "-kernel", "start_timer", "true", "-config", ConfigFileName],
+ try
+ {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(TestCase),
+ args => Args, connection => standard_io}),
+ L = rpc:call(Node, logger, get_config, []),
+ ct:log("~p",[L]),
+ {ok, L, Peer, Node}
+ catch
+ exit:{boot_failed, Reason} ->
+ ct:log("Failed to start node: ~p", [Reason]),
error
end.
@@ -63,26 +58,3 @@ sync_and_read(Node,disk_log,Log) ->
sync_and_read(Node, file,Log) ->
ok = rpc:call(Node,logger_std_h,filesync,[?STANDARD_HANDLER]),
file:read_file(Log).
-
-
-init(_, _) ->
- {ok, []}.
-
-pre_init_per_suite(_Suite, Config, State) ->
- {[{nodes, nodes()} | Config], State}.
-
-pre_init_per_testcase(Suite, TC, Config, State) ->
- cleanup(Config),
- {[{suite, Suite}, {tc, TC} | Config], State}.
-
-post_end_per_testcase(_, _TC, Config, Res, State) ->
- cleanup(Config),
- {Res, State}.
-
-post_end_per_suite(_, Config, State) ->
- cleanup(Config),
- {Config, State}.
-
-cleanup(Config) ->
- [test_server:stop_node(N) || N <- nodes(),
- not lists:member(N, proplists:get_value(nodes, Config))].
diff --git a/lib/kernel/test/loose_node.erl b/lib/kernel/test/loose_node.erl
deleted file mode 100644
index cc3f9bbea0..0000000000
--- a/lib/kernel/test/loose_node.erl
+++ /dev/null
@@ -1,202 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2004-2016. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%%%-------------------------------------------------------------------
-%%% File : loose_node.erl
-%%% Author : Rickard Green <rickard.s.green@ericsson.com>
-%%% Description : Creation of nodes which are not supervised by
-%%% the test_server. Currently needed by init_SUITE
-%%% and heart_SUITE (until the test_server can
-%%% handle node restart).
-%%%
-%%% Created : 22 Sep 2004 by Rickard Green <rickard.s.green@ericsson.com>
-%%%-------------------------------------------------------------------
--module(loose_node).
--author('rickard.s.green@ericsson.com').
-
-%%
-%% Exports
-%%
--export([start/3, start/2, stop/1]).
-
-%%
-%% Internal exports
-%%
--export([loose_node_started/1]).
-
-%%
-%% Exported functions for internal use.
-%%
-
-%%
-%% Defines
-%%
--define(L2A, list_to_atom).
--define(A2L, atom_to_list).
--define(I2L, integer_to_list).
-
-%%
-%% Exported functions.
-%%
-
-stop(Node) when is_atom(Node) ->
- erlang:monitor_node(Node, true),
- rpc:cast(Node, erlang, halt, []),
- receive
- {nodedown, Node} ->
- io:format("Stopped loose node ~p~n", [Node]),
- ok
- after 10000 ->
- io:format("Failed to stop loose node: ~p~n", [Node]),
- {error, node_not_stopped}
- end.
-
-start(Name, Args) ->
- start(Name, Args, -1).
-
-start(Name, Args, TimeOut) when is_atom(Name) ->
- start(atom_to_list(Name), Args, TimeOut);
-start(Name, Args, TimeOut)
- when is_list(Name), is_list(Args), is_integer(TimeOut) ->
- Parent = self(),
- Ref = make_ref(),
- Starter
- = fun () ->
- Erl = case init:get_argument(progname) of
- {ok,[[Prog]]} ->
- Prog;
- _ ->
- "erl"
- end,
- RegName = until_success(fun () ->
- {A, B, C} = now(),
- Reg =
- ?L2A(?A2L(?MODULE)
- ++ "-" ++ ?I2L(A)
- ++ "-" ++ ?I2L(B)
- ++ "-" ++ ?I2L(C)),
- true = register(Reg, self()),
- Reg
- end),
- NameCmd = case net_kernel:longnames() of
- true -> " -name " ++ Name;
- false -> " -sname " ++ Name
- end,
- Cookie = " -setcookie " ++ atom_to_list(auth:get_cookie()),
- Pa = " -pa " ++ filename:dirname(code:which(?MODULE)),
- ThisNode = node(),
- NodeStarted
- = " -run "
- ++ atom_to_list(?MODULE)
- ++ " loose_node_started "
- ++ atom_to_list(RegName)
- ++ " "
- ++ atom_to_list(ThisNode)
- ++ " "
- ++ integer_to_list(TimeOut),
- CrashDump =
- " -env ERL_CRASH_DUMP"
- ++ " erl_crash.dump.loose_node."
- ++ Name,
- Cmd =
- Erl
- ++ " -detached"
- ++ NameCmd
- ++ Cookie
- ++ Pa
- ++ NodeStarted
- ++ CrashDump
- ++ " "
- ++ Args,
- io:format("Trying to start loose node...~n"
- " --> ~p~n", [Cmd]),
- Res = case open_port({spawn, Cmd}, []) of
- P when is_port(P) ->
- receive
- {loose_node_started,
- Node,
- {RegName, ThisNode}} ->
- io:format("Loose node ~p started.~n",
- [Node]),
- {ok, Node}
- after 10000 ->
- io:format("Start of loose node ~p "
- "timed out.", [Name]),
- {error, timeout}
- end;
- _ ->
- io:format("Start of loose node ~p failed.",
- [Name]),
- {error, open_port_failed}
- end,
- Parent ! {Ref, Res}
- end,
- spawn_opt(Starter, [link, {priority, max}]),
- receive
- {Ref, Result} ->
- Result
- end.
-
-
-%%
-%% Exported functions for internal use.
-%%
-
-loose_node_started([Name, Node, TimeOutSecs]) when is_list(Name),
- is_list(Node),
- is_list(TimeOutSecs) ->
- spawn_opt(fun () ->
- process_flag(trap_exit, true),
- Proc = {list_to_atom(Name), list_to_atom(Node)},
- Timeout = case catch list_to_integer(TimeOutSecs) of
- I when is_integer(I), I >= 0 -> I*1000;
- _ -> infinity
- end,
- wait_until(fun () -> is_alive() end),
- Proc ! {loose_node_started, node(), Proc},
- receive
- after Timeout ->
- timeout
- end,
- erlang:halt("Loose node timeout")
- end,
- [{priority, max}]),
- ok.
-
-%%
-%% Internal functions.
-%%
-
-until_success(Fun) ->
- case catch Fun() of
- {'EXIT', _} -> until_success(Fun);
- Res -> Res
- end.
-
-wait_until(Fun) ->
- case Fun() of
- true -> true;
- _ ->
- receive
- after 100 ->
- wait_until(Fun)
- end
- end.
-
diff --git a/lib/kernel/test/pg_SUITE.erl b/lib/kernel/test/pg_SUITE.erl
index 9c84e51c43..a6708dc419 100644
--- a/lib/kernel/test/pg_SUITE.erl
+++ b/lib/kernel/test/pg_SUITE.erl
@@ -25,8 +25,6 @@
suite/0,
all/0,
groups/0,
- init_per_suite/1,
- end_per_suite/1,
init_per_testcase/2,
end_per_testcase/2,
stop_proc/1,
@@ -59,33 +57,12 @@
group_leave/1
]).
--export([
- control/1,
- controller/3
-]).
-
-include_lib("common_test/include/ct.hrl").
-include_lib("stdlib/include/assert.hrl").
suite() ->
[{timetrap, {seconds, 60}}].
-init_per_suite(Config) ->
- case erlang:is_alive() of
- false ->
- %% verify epmd running (otherwise next call fails)
- (erl_epmd:names("localhost") =:= {error, address}) andalso ([] = os:cmd("epmd -daemon")),
- %% start a random node name
- NodeName = list_to_atom(lists:concat([atom_to_list(?MODULE), "_", os:getpid()])),
- {ok, Pid} = net_kernel:start([NodeName, shortnames]),
- [{distribution, Pid} | Config];
- true ->
- Config
- end.
-
-end_per_suite(Config) ->
- is_pid(proplists:get_value(distribution, Config)) andalso net_kernel:stop().
-
init_per_testcase(TestCase, Config) ->
{ok, _Pid} = pg:start_link(TestCase),
Config.
@@ -196,10 +173,10 @@ process_owner_check() ->
[{doc, "Tests that process owner is local node"}].
process_owner_check(Config) when is_list(Config) ->
- {TwoPeer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
%% spawn remote process
LocalPid = erlang:spawn(forever()),
- RemotePid = erlang:spawn(TwoPeer, forever()),
+ RemotePid = erlang:spawn(Node, forever()),
%% check they can't be joined locally
?assertException(error, {nolocal, _}, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid)),
?assertException(error, {nolocal, _}, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, [RemotePid, RemotePid])),
@@ -208,19 +185,19 @@ process_owner_check(Config) when is_list(Config) ->
?assertException(error, function_clause, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, undefined)),
?assertException(error, {nolocal, _}, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, [undefined])),
%% stop the peer
- stop_node(TwoPeer, Socket),
+ peer:stop(Peer),
ok.
overlay_missing() ->
[{doc, "Tests that scope process that is not a part of overlay network does not change state"}].
overlay_missing(_Config) ->
- {TwoPeer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
%% join self (sanity check)
?assertEqual(ok, pg:join(?FUNCTION_NAME, group, self())),
%% remember pid from remote
- PgPid = rpc:call(TwoPeer, erlang, whereis, [?FUNCTION_NAME]),
- RemotePid = erlang:spawn(TwoPeer, forever()),
+ PgPid = rpc:call(Node, erlang, whereis, [?FUNCTION_NAME]),
+ RemotePid = erlang:spawn(Node, forever()),
%% stop remote scope
gen_server:stop(PgPid),
%% craft white-box request: ensure it's rejected
@@ -241,34 +218,34 @@ overlay_missing(_Config) ->
%?assertException(error, function_clause, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, undefined)),
%?assertException(error, {nolocal, _}, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, [undefined])),
%% stop the peer
- stop_node(TwoPeer, Socket).
+ peer:stop(Peer).
two(Config) when is_list(Config) ->
- {TwoPeer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
Pid = erlang:spawn(forever()),
?assertEqual(ok, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, Pid)),
?assertEqual([Pid], pg:get_local_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
%% first RPC must be serialised
- sync({?FUNCTION_NAME, TwoPeer}),
- ?assertEqual([Pid], rpc:call(TwoPeer, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
- ?assertEqual([], rpc:call(TwoPeer, pg, get_local_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
+ sync({?FUNCTION_NAME, Node}),
+ ?assertEqual([Pid], rpc:call(Node, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
+ ?assertEqual([], rpc:call(Node, pg, get_local_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
stop_proc(Pid),
%% again, must be serialised
sync(?FUNCTION_NAME),
?assertEqual([], pg:get_local_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
- ?assertEqual([], rpc:call(TwoPeer, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
+ ?assertEqual([], rpc:call(Node, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
- Pid2 = erlang:spawn(TwoPeer, forever()),
- Pid3 = erlang:spawn(TwoPeer, forever()),
- ?assertEqual(ok, rpc:call(TwoPeer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pid2])),
- ?assertEqual(ok, rpc:call(TwoPeer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pid3])),
+ Pid2 = erlang:spawn(Node, forever()),
+ Pid3 = erlang:spawn(Node, forever()),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pid2])),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pid3])),
%% serialise through the *other* node
- sync({?FUNCTION_NAME, TwoPeer}),
+ sync({?FUNCTION_NAME, Node}),
?assertEqual(lists:sort([Pid2, Pid3]),
lists:sort(pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME))),
%% stop the peer
- stop_node(TwoPeer, Socket),
+ peer:stop(Peer),
%% hope that 'nodedown' comes before we route our request
sync(?FUNCTION_NAME),
ok.
@@ -277,35 +254,35 @@ empty_group_by_remote_leave() ->
[{doc, "Empty group should be deleted from nodes."}].
empty_group_by_remote_leave(Config) when is_list(Config) ->
- {TwoPeer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- RemoteNode = rpc:call(TwoPeer, erlang, whereis, [?FUNCTION_NAME]),
- RemotePid = erlang:spawn(TwoPeer, forever()),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ RemoteNode = rpc:call(Node, erlang, whereis, [?FUNCTION_NAME]),
+ RemotePid = erlang:spawn(Node, forever()),
% remote join
- ?assertEqual(ok, rpc:call(TwoPeer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
- sync({?FUNCTION_NAME, TwoPeer}),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
+ sync({?FUNCTION_NAME, Node}),
?assertEqual([RemotePid], pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
% inspecting internal state is not best practice, but there's no other way to check if the state is correct.
{state, _, _, #{RemoteNode := {_, RemoteMap}}} = sys:get_state(?FUNCTION_NAME),
?assertEqual(#{?FUNCTION_NAME => [RemotePid]}, RemoteMap),
% remote leave
- ?assertEqual(ok, rpc:call(TwoPeer, pg, leave, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
- sync({?FUNCTION_NAME, TwoPeer}),
+ ?assertEqual(ok, rpc:call(Node, pg, leave, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
+ sync({?FUNCTION_NAME, Node}),
?assertEqual([], pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
{state, _, _, #{RemoteNode := {_, NewRemoteMap}}} = sys:get_state(?FUNCTION_NAME),
% empty group should be deleted.
?assertEqual(#{}, NewRemoteMap),
%% another variant of emptying a group remotely: join([Pi1, Pid2]) and leave ([Pid2, Pid1])
- RemotePid2 = erlang:spawn(TwoPeer, forever()),
- ?assertEqual(ok, rpc:call(TwoPeer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, [RemotePid, RemotePid2]])),
- sync({?FUNCTION_NAME, TwoPeer}),
+ RemotePid2 = erlang:spawn(Node, forever()),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, [RemotePid, RemotePid2]])),
+ sync({?FUNCTION_NAME, Node}),
?assertEqual([RemotePid, RemotePid2], pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
%% now leave
- ?assertEqual(ok, rpc:call(TwoPeer, pg, leave, [?FUNCTION_NAME, ?FUNCTION_NAME, [RemotePid2, RemotePid]])),
- sync({?FUNCTION_NAME, TwoPeer}),
+ ?assertEqual(ok, rpc:call(Node, pg, leave, [?FUNCTION_NAME, ?FUNCTION_NAME, [RemotePid2, RemotePid]])),
+ sync({?FUNCTION_NAME, Node}),
?assertEqual([], pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
{state, _, _, #{RemoteNode := {_, NewRemoteMap}}} = sys:get_state(?FUNCTION_NAME),
- stop_node(TwoPeer, Socket),
+ peer:stop(Peer),
ok.
thundering_herd() ->
@@ -317,228 +294,228 @@ thundering_herd(Config) when is_list(Config) ->
%% make up a large amount of groups
[pg:join(?FUNCTION_NAME, {group, Seq}, self()) || Seq <- lists:seq(1, GroupCount)],
%% initiate a few syncs - and those are really slow...
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- PeerPid = erlang:spawn(Peer, forever()),
- PeerPg = rpc:call(Peer, erlang, whereis, [?FUNCTION_NAME], 1000),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ PeerPid = erlang:spawn(Node, forever()),
+ PeerPg = rpc:call(Node, erlang, whereis, [?FUNCTION_NAME], 1000),
%% WARNING: code below acts for white-box! %% WARNING
FakeSync = [{{group, 1}, [PeerPid, PeerPid]}],
[gen_server:cast(?FUNCTION_NAME, {sync, PeerPg, FakeSync}) || _ <- lists:seq(1, SyncCount)],
%% next call must not timetrap, otherwise test fails
pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, self()),
- stop_node(Peer, Socket).
+ peer:stop(Peer).
initial(Config) when is_list(Config) ->
Pid = erlang:spawn(forever()),
?assertEqual(ok, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, Pid)),
?assertEqual([Pid], pg:get_local_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
%% first RPC must be serialised
- sync({?FUNCTION_NAME, Peer}),
- ?assertEqual([Pid], rpc:call(Peer, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
+ sync({?FUNCTION_NAME, Node}),
+ ?assertEqual([Pid], rpc:call(Node, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
- ?assertEqual([], rpc:call(Peer, pg, get_local_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
+ ?assertEqual([], rpc:call(Node, pg, get_local_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
stop_proc(Pid),
- sync({?FUNCTION_NAME, Peer}),
- ?assertEqual([], rpc:call(Peer, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
- stop_node(Peer, Socket),
+ sync({?FUNCTION_NAME, Node}),
+ ?assertEqual([], rpc:call(Node, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
+ peer:stop(Peer),
ok.
netsplit(Config) when is_list(Config) ->
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- ?assertEqual(Peer, rpc(Socket, erlang, node, [])), %% just to test RPC
- RemoteOldPid = erlang:spawn(Peer, forever()),
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, '$invisible', RemoteOldPid])),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ ?assertEqual(Node, peer:call(Peer, erlang, node, [])), %% just to test RPC
+ RemoteOldPid = erlang:spawn(Node, forever()),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, '$invisible', RemoteOldPid])),
%% hohoho, partition!
- disconnect_nodes([Peer]),
- ?assertEqual(Peer, rpc(Socket, erlang, node, [])), %% just to ensure RPC still works
- RemotePid = rpc(Socket, erlang, spawn, [forever()]),
- ?assertEqual([], rpc(Socket, erlang, nodes, [])),
- ?assertNot(lists:member(Peer, nodes())), %% should be no nodes in the cluster
- ?assertEqual(ok, rpc(Socket, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])), %% join - in a partition!
-
- ?assertEqual(ok, rpc(Socket, pg, leave, [?FUNCTION_NAME, '$invisible', RemoteOldPid])),
- ?assertEqual(ok, rpc(Socket, pg, join, [?FUNCTION_NAME, '$visible', RemoteOldPid])),
- ?assertEqual([RemoteOldPid], rpc(Socket, pg, get_local_members, [?FUNCTION_NAME, '$visible'])),
+ disconnect_nodes([Node]),
+ ?assertEqual(Node, peer:call(Peer, erlang, node, [])), %% just to ensure RPC still works
+ RemotePid = peer:call(Peer, erlang, spawn, [forever()]),
+ ?assertEqual([], peer:call(Peer, erlang, nodes, [])),
+ ?assertNot(lists:member(Node, nodes())), %% should be no nodes in the cluster
+ ?assertEqual(ok, peer:call(Peer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])), %% join - in a partition!
+
+ ?assertEqual(ok, peer:call(Peer, pg, leave, [?FUNCTION_NAME, '$invisible', RemoteOldPid])),
+ ?assertEqual(ok, peer:call(Peer, pg, join, [?FUNCTION_NAME, '$visible', RemoteOldPid])),
+ ?assertEqual([RemoteOldPid], peer:call(Peer, pg, get_local_members, [?FUNCTION_NAME, '$visible'])),
%% join locally too
LocalPid = erlang:spawn(forever()),
?assertEqual(ok, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, LocalPid)),
- ?assertNot(lists:member(Peer, nodes())), %% should be no nodes in the cluster
+ ?assertNot(lists:member(Node, nodes())), %% should be no nodes in the cluster
- pong = net_adm:ping(Peer),
+ pong = net_adm:ping(Node),
%% now ensure sync happened
Pids = lists:sort([RemotePid, LocalPid]),
- sync({?FUNCTION_NAME, Peer}),
- ?assertEqual(Pids, lists:sort(rpc:call(Peer, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME]))),
+ sync({?FUNCTION_NAME, Node}),
+ ?assertEqual(Pids, lists:sort(rpc:call(Node, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME]))),
?assertEqual([RemoteOldPid], pg:get_members(?FUNCTION_NAME, '$visible')),
- stop_node(Peer, Socket),
+ peer:stop(Peer),
ok.
trisplit(Config) when is_list(Config) ->
- {Peer, Socket1} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- _PeerPid1 = erlang:spawn(Peer, forever()),
- PeerPid2 = erlang:spawn(Peer, forever()),
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, three, PeerPid2])),
- disconnect_nodes([Peer]),
- ?assertEqual(true, net_kernel:connect_node(Peer)),
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, one, PeerPid2])),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ _PeerPid1 = erlang:spawn(Node, forever()),
+ PeerPid2 = erlang:spawn(Node, forever()),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, three, PeerPid2])),
+ disconnect_nodes([Node]),
+ ?assertEqual(true, net_kernel:connect_node(Node)),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, one, PeerPid2])),
%% now ensure sync happened
- {Peer2, Socket2} = spawn_node(?FUNCTION_NAME, trisplit_second),
- ?assertEqual(true, rpc:call(Peer2, net_kernel, connect_node, [Peer])),
- ?assertEqual(lists:sort([node(), Peer]), lists:sort(rpc:call(Peer2, erlang, nodes, []))),
- ok = rpc:call(Peer2, ?MODULE, ensure_peers_info, [?FUNCTION_NAME, [node(), Peer]]),
- ?assertEqual([PeerPid2], rpc:call(Peer2, pg, get_members, [?FUNCTION_NAME, one])),
- stop_node(Peer, Socket1),
- stop_node(Peer2, Socket2),
+ {Peer2, Node2} = spawn_node(?FUNCTION_NAME),
+ ?assertEqual(true, rpc:call(Node2, net_kernel, connect_node, [Node])),
+ ?assertEqual(lists:sort([node(), Node]), lists:sort(rpc:call(Node2, erlang, nodes, []))),
+ ok = rpc:call(Node2, ?MODULE, ensure_peers_info, [?FUNCTION_NAME, [node(), Node]]),
+ ?assertEqual([PeerPid2], rpc:call(Node2, pg, get_members, [?FUNCTION_NAME, one])),
+ peer:stop(Peer),
+ peer:stop(Peer2),
ok.
foursplit(Config) when is_list(Config) ->
Pid = erlang:spawn(forever()),
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
?assertEqual(ok, pg:join(?FUNCTION_NAME, one, Pid)),
?assertEqual(ok, pg:join(?FUNCTION_NAME, two, Pid)),
- PeerPid1 = spawn(Peer, forever()),
+ PeerPid1 = erlang:spawn(Node, forever()),
?assertEqual(ok, pg:leave(?FUNCTION_NAME, one, Pid)),
?assertEqual(not_joined, pg:leave(?FUNCTION_NAME, three, Pid)),
- disconnect_nodes([Peer]),
- ?assertEqual(ok, rpc(Socket, ?MODULE, stop_proc, [PeerPid1])),
+ disconnect_nodes([Node]),
+ ?assertEqual(ok, peer:call(Peer, ?MODULE, stop_proc, [PeerPid1])),
?assertEqual(not_joined, pg:leave(?FUNCTION_NAME, three, Pid)),
- ?assertEqual(true, net_kernel:connect_node(Peer)),
+ ?assertEqual(true, net_kernel:connect_node(Node)),
?assertEqual([], pg:get_members(?FUNCTION_NAME, one)),
- ?assertEqual([], rpc(Socket, pg, get_members, [?FUNCTION_NAME, one])),
- stop_node(Peer, Socket),
+ ?assertEqual([], peer:call(Peer, pg, get_members, [?FUNCTION_NAME, one])),
+ peer:stop(Peer),
ok.
exchange(Config) when is_list(Config) ->
- {Peer1, Socket1} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- {Peer2, Socket2} = spawn_node(?FUNCTION_NAME, exchange_second),
- Pids10 = [rpc(Socket1, erlang, spawn, [forever()]) || _ <- lists:seq(1, 10)],
- Pids2 = [rpc(Socket2, erlang, spawn, [forever()]) || _ <- lists:seq(1, 10)],
- Pids11 = [rpc(Socket1, erlang, spawn, [forever()]) || _ <- lists:seq(1, 10)],
+ {Peer1, Node1} = spawn_node(?FUNCTION_NAME),
+ {Peer2, Node2} = spawn_node(?FUNCTION_NAME),
+ Pids10 = [peer:call(Peer1, erlang, spawn, [forever()]) || _ <- lists:seq(1, 10)],
+ Pids2 = [peer:call(Peer2, erlang, spawn, [forever()]) || _ <- lists:seq(1, 10)],
+ Pids11 = [peer:call(Peer1, erlang, spawn, [forever()]) || _ <- lists:seq(1, 10)],
%% kill first 3 pids from node1
{PidsToKill, Pids1} = lists:split(3, Pids10),
- ?assertEqual(ok, rpc(Socket1, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pids10])),
- sync({?FUNCTION_NAME, Peer1}), %% Join broadcast have reached local
+ ?assertEqual(ok, peer:call(Peer1, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pids10])),
+ sync({?FUNCTION_NAME, Node1}), %% Join broadcast have reached local
sync(?FUNCTION_NAME), %% Join broadcast has been processed by local
?assertEqual(lists:sort(Pids10), lists:sort(pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME))),
- [rpc(Socket1, ?MODULE, stop_proc, [Pid]) || Pid <- PidsToKill],
+ [peer:call(Peer1, ?MODULE, stop_proc, [Pid]) || Pid <- PidsToKill],
sync(?FUNCTION_NAME),
- sync({?FUNCTION_NAME, Peer1}),
+ sync({?FUNCTION_NAME, Node1}),
Pids = lists:sort(Pids1 ++ Pids2 ++ Pids11),
?assert(lists:all(fun erlang:is_pid/1, Pids)),
- disconnect_nodes([Peer1, Peer2]),
+ disconnect_nodes([Node1, Node2]),
sync(?FUNCTION_NAME), %% Processed nodedowns...
?assertEqual([], lists:sort(pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME))),
- [?assertEqual(ok, rpc(Socket2, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pid])) || Pid <- Pids2],
- [?assertEqual(ok, rpc(Socket1, pg, join, [?FUNCTION_NAME, second, Pid])) || Pid <- Pids11],
- ?assertEqual(ok, rpc(Socket1, pg, join, [?FUNCTION_NAME, third, Pids11])),
+ [?assertEqual(ok, peer:call(Peer2, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, Pid])) || Pid <- Pids2],
+ [?assertEqual(ok, peer:call(Peer1, pg, join, [?FUNCTION_NAME, second, Pid])) || Pid <- Pids11],
+ ?assertEqual(ok, peer:call(Peer1, pg, join, [?FUNCTION_NAME, third, Pids11])),
%% rejoin
- ?assertEqual(true, net_kernel:connect_node(Peer1)),
- ?assertEqual(true, net_kernel:connect_node(Peer2)),
+ ?assertEqual(true, net_kernel:connect_node(Node1)),
+ ?assertEqual(true, net_kernel:connect_node(Node2)),
%% need to sleep longer to ensure both nodes made the exchange
- ensure_peers_info(?FUNCTION_NAME, [Peer1, Peer2]),
+ ensure_peers_info(?FUNCTION_NAME, [Node1, Node2]),
?assertEqual(Pids, lists:sort(pg:get_members(?FUNCTION_NAME, second) ++ pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME))),
?assertEqual(lists:sort(Pids11), lists:sort(pg:get_members(?FUNCTION_NAME, third))),
{Left, Stay} = lists:split(3, Pids11),
- ?assertEqual(ok, rpc(Socket1, pg, leave, [?FUNCTION_NAME, third, Left])),
- sync({?FUNCTION_NAME, Peer1}),
+ ?assertEqual(ok, peer:call(Peer1, pg, leave, [?FUNCTION_NAME, third, Left])),
+ sync({?FUNCTION_NAME, Node1}),
sync(?FUNCTION_NAME),
?assertEqual(lists:sort(Stay), lists:sort(pg:get_members(?FUNCTION_NAME, third))),
- ?assertEqual(not_joined, rpc(Socket1, pg, leave, [?FUNCTION_NAME, left, Stay])),
- ?assertEqual(ok, rpc(Socket1, pg, leave, [?FUNCTION_NAME, third, Stay])),
- sync({?FUNCTION_NAME, Peer1}),
+ ?assertEqual(not_joined, peer:call(Peer1, pg, leave, [?FUNCTION_NAME, left, Stay])),
+ ?assertEqual(ok, peer:call(Peer1, pg, leave, [?FUNCTION_NAME, third, Stay])),
+ sync({?FUNCTION_NAME, Node1}),
sync(?FUNCTION_NAME),
?assertEqual([], lists:sort(pg:get_members(?FUNCTION_NAME, third))),
- sync({?FUNCTION_NAME, Peer1}),
+ sync({?FUNCTION_NAME, Node1}),
sync(?FUNCTION_NAME),
- stop_node(Peer1, Socket1),
- stop_node(Peer2, Socket2),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
ok.
nolocal(Config) when is_list(Config) ->
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- RemotePid = spawn(Peer, forever()),
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ RemotePid = erlang:spawn(Node, forever()),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
?assertEqual([], pg:get_local_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
- stop_node(Peer, Socket),
+ peer:stop(Peer),
ok.
double(Config) when is_list(Config) ->
Pid = erlang:spawn(forever()),
?assertEqual(ok, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, Pid)),
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
?assertEqual(ok, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, [Pid])),
?assertEqual([Pid, Pid], pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
sync(?FUNCTION_NAME),
- sync({?FUNCTION_NAME, Peer}),
- ?assertEqual([Pid, Pid], rpc:call(Peer, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
- stop_node(Peer, Socket),
+ sync({?FUNCTION_NAME, Node}),
+ ?assertEqual([Pid, Pid], rpc:call(Node, pg, get_members, [?FUNCTION_NAME, ?FUNCTION_NAME])),
+ peer:stop(Peer),
ok.
scope_restart(Config) when is_list(Config) ->
Pid = erlang:spawn(forever()),
?assertEqual(ok, pg:join(?FUNCTION_NAME, ?FUNCTION_NAME, [Pid, Pid])),
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- RemotePid = spawn(Peer, forever()),
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
- sync({?FUNCTION_NAME, Peer}),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ RemotePid = erlang:spawn(Node, forever()),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
+ sync({?FUNCTION_NAME, Node}),
?assertEqual(lists:sort([RemotePid, Pid, Pid]), lists:sort(pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME))),
%% stop scope locally, and restart
gen_server:stop(?FUNCTION_NAME),
pg:start(?FUNCTION_NAME),
%% ensure remote pids joined, local are missing
sync(?FUNCTION_NAME),
- sync({?FUNCTION_NAME, Peer}),
+ sync({?FUNCTION_NAME, Node}),
sync(?FUNCTION_NAME),
?assertEqual([RemotePid], pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME)),
- stop_node(Peer, Socket),
+ peer:stop(Peer),
ok.
missing_scope_join(Config) when is_list(Config) ->
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- ?assertEqual(ok, rpc:call(Peer, gen_server, stop, [?FUNCTION_NAME])),
- RemotePid = spawn(Peer, forever()),
- ?assertMatch({badrpc, {'EXIT', {noproc, _}}}, rpc:call(Peer, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
- ?assertMatch({badrpc, {'EXIT', {noproc, _}}}, rpc:call(Peer, pg, leave, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
- stop_node(Peer, Socket),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ ?assertEqual(ok, rpc:call(Node, gen_server, stop, [?FUNCTION_NAME])),
+ RemotePid = erlang:spawn(Node, forever()),
+ ?assertMatch({badrpc, {'EXIT', {noproc, _}}}, rpc:call(Node, pg, join, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
+ ?assertMatch({badrpc, {'EXIT', {noproc, _}}}, rpc:call(Node, pg, leave, [?FUNCTION_NAME, ?FUNCTION_NAME, RemotePid])),
+ peer:stop(Peer),
ok.
disconnected_start(Config) when is_list(Config) ->
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- disconnect_nodes([Peer]),
- ?assertEqual(ok, rpc(Socket, gen_server, stop, [?FUNCTION_NAME])),
- ?assertMatch({ok, _Pid}, rpc(Socket, pg, start,[?FUNCTION_NAME])),
- ?assertEqual(ok, rpc(Socket, gen_server, stop, [?FUNCTION_NAME])),
- RemotePid = rpc(Socket, erlang, spawn, [forever()]),
+ {Peer, Node} = spawn_disconnected_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ ?assertNot(lists:member(Node, nodes())),
+ ?assertEqual(ok, peer:call(Peer, gen_server, stop, [?FUNCTION_NAME])),
+ ?assertMatch({ok, _Pid}, peer:call(Peer, pg, start,[?FUNCTION_NAME])),
+ ?assertEqual(ok, peer:call(Peer, gen_server, stop, [?FUNCTION_NAME])),
+ RemotePid = peer:call(Peer, erlang, spawn, [forever()]),
?assert(is_pid(RemotePid)),
- stop_node(Peer, Socket),
+ peer:stop(Peer),
ok.
forced_sync() ->
[{doc, "This test was added when lookup_element was erroneously used instead of lookup, crashing pg with badmatch, and it tests rare out-of-order sync operations"}].
forced_sync(Config) when is_list(Config) ->
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
Pid = erlang:spawn(forever()),
- RemotePid = spawn(Peer, forever()),
+ RemotePid = erlang:spawn(Node, forever()),
Expected = lists:sort([Pid, RemotePid]),
pg:join(?FUNCTION_NAME, one, Pid),
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, one, RemotePid])),
- RemoteScopePid = rpc:call(Peer, erlang, whereis, [?FUNCTION_NAME]),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, one, RemotePid])),
+ RemoteScopePid = rpc:call(Node, erlang, whereis, [?FUNCTION_NAME]),
?assert(is_pid(RemoteScopePid)),
%% hohoho, partition!
- disconnect_nodes([Peer]),
- ?assertEqual(true, net_kernel:connect_node(Peer)),
- ensure_peers_info(?FUNCTION_NAME, [Peer]),
+ disconnect_nodes([Node]),
+ ?assertEqual(true, net_kernel:connect_node(Node)),
+ ensure_peers_info(?FUNCTION_NAME, [Node]),
?assertEqual(Expected, lists:sort(pg:get_members(?FUNCTION_NAME, one))),
%% WARNING: this code uses pg as white-box, exploiting internals,
%% only to simulate broken 'sync'
@@ -551,32 +528,32 @@ forced_sync(Config) when is_list(Config) ->
?assertEqual(lists:sort([RemotePid, RemotePid]), lists:sort(pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME))),
?assertEqual(lists:sort([RemotePid, RemotePid, Pid]), lists:sort(pg:get_members(?FUNCTION_NAME, one))),
%% simulate force-sync via 'discover' - ask peer to send sync to us
- {?FUNCTION_NAME, Peer} ! {discover, whereis(?FUNCTION_NAME)},
- sync({?FUNCTION_NAME, Peer}),
+ {?FUNCTION_NAME, Node} ! {discover, whereis(?FUNCTION_NAME)},
+ sync({?FUNCTION_NAME, Node}),
sync(?FUNCTION_NAME),
?assertEqual(Expected, lists:sort(pg:get_members(?FUNCTION_NAME, one))),
?assertEqual([], lists:sort(pg:get_members(?FUNCTION_NAME, ?FUNCTION_NAME))),
%% and simulate extra sync
- sync({?FUNCTION_NAME, Peer}),
+ sync({?FUNCTION_NAME, Node}),
sync(?FUNCTION_NAME),
?assertEqual(Expected, lists:sort(pg:get_members(?FUNCTION_NAME, one))),
- stop_node(Peer, Socket),
+ peer:stop(Peer),
ok.
group_leave(Config) when is_list(Config) ->
- {Peer, Socket} = spawn_node(?FUNCTION_NAME, ?FUNCTION_NAME),
- RemotePid = erlang:spawn(Peer, forever()),
+ {Peer, Node} = spawn_node(?FUNCTION_NAME),
+ RemotePid = erlang:spawn(Node, forever()),
Total = lists:duplicate(16, RemotePid),
{Left, Remain} = lists:split(4, Total),
%% join 16 times!
- ?assertEqual(ok, rpc:call(Peer, pg, join, [?FUNCTION_NAME, two, Total])),
- ?assertEqual(ok, rpc:call(Peer, pg, leave, [?FUNCTION_NAME, two, Left])),
+ ?assertEqual(ok, rpc:call(Node, pg, join, [?FUNCTION_NAME, two, Total])),
+ ?assertEqual(ok, rpc:call(Node, pg, leave, [?FUNCTION_NAME, two, Left])),
- sync({?FUNCTION_NAME, Peer}),
+ sync({?FUNCTION_NAME, Node}),
sync(?FUNCTION_NAME),
?assertEqual(Remain, pg:get_members(?FUNCTION_NAME, two)),
- stop_node(Peer, Socket),
+ peer:stop(Peer),
sync(?FUNCTION_NAME),
?assertEqual([], pg:get_members(?FUNCTION_NAME, two)),
ok.
@@ -587,7 +564,7 @@ group_leave(Config) when is_list(Config) ->
sync(GS) ->
_ = sys:log(GS, get).
-ensure_peers_info(Scope, Peers) ->
+ensure_peers_info(Scope, Nodes) ->
%% Ensures that pg server on local node has gotten info from
%% pg servers on all Peer nodes passed as argument (assuming
%% no connection failures).
@@ -602,7 +579,7 @@ ensure_peers_info(Scope, Peers) ->
sync(Scope),
%% Known: nodup handled and discover sent to Peer
- lists:foreach(fun (Peer) -> sync({Scope, Peer}) end, Peers),
+ lists:foreach(fun (Node) -> sync({Scope, Node}) end, Nodes),
%% Known: nodeup handled by Peers and discover sent to local
%% Known: discover received/handled by Peers and sync sent to local
%% Known: discover received from Peer
@@ -615,7 +592,7 @@ ensure_peers_info(Scope, Peers) ->
-ifdef(CURRENTLY_UNUSED_BUT_SERVES_AS_DOC).
-ensure_synced(Scope, Peers) ->
+ensure_synced(Scope, Nodes) ->
%% Ensures that the pg server on local node have synced
%% with pg servers on all Peer nodes (assuming no connection
%% failures).
@@ -626,10 +603,10 @@ ensure_synced(Scope, Peers) ->
%% Note that this relies on current ERTS implementation; not
%% language guarantees.
%%
- ensure_peer_info(Scope, Peer),
+ ensure_peer_info(Scope, Node),
%% Known: local has gotten info from all Peers
%% Known: discover from Peers handled and sync sent to Peers
- lists:foreach(fun (Peer) -> sync({Scope, Peer}) end, Peers),
+ lists:foreach(fun (Node) -> sync({Scope, Node}) end, Nodes),
%% Known: sync from local handled by Peers
ok.
@@ -637,7 +614,7 @@ ensure_synced(Scope, Peers) ->
disconnect_nodes(Nodes) ->
%% The following is not a language guarantee, but internal
- %% knowledged about current implementation of ERTS and pg.
+ %% knowledge about current implementation of ERTS and pg.
%%
%% The pg server reacts on 'DOWN's via process monitors of
%% its peers. These are delivered before 'nodedown's from
@@ -662,12 +639,10 @@ disconnect_nodes(Nodes) ->
{Pid, Mon} = spawn_monitor(F),
receive
{'DOWN', Mon, process, Pid, Reason} ->
- normal = Reason
+ ?assertEqual(normal, Reason)
end,
ok.
--define (LOCALHOST, {127, 0, 0, 1}).
-
%% @doc Kills process Pid and waits for it to exit using monitor,
%% and yields after (for 1 ms).
-spec stop_proc(pid()) -> ok.
@@ -679,125 +654,27 @@ stop_proc(Pid) ->
timer:sleep(1)
end.
-%% @doc Executes remote call on the node via TCP socket
-%% Used when dist connection is not available, or
-%% when it's undesirable to use one.
--spec rpc(gen_tcp:socket(), module(), atom(), [term()]) -> term().
-rpc(Sock, M, F, A) ->
- ok = gen_tcp:send(Sock, term_to_binary({call, M, F, A})),
- inet:setopts(Sock, [{active, once}]),
- receive
- {tcp, Sock, Data} ->
- case binary_to_term(Data) of
- {ok, Val} ->
- Val;
- {error, Error} ->
- {badrpc, Error}
- end;
- {tcp_closed, Sock} ->
- error(closed)
- end.
-
-%% @doc starts peer node on this host.
-%% Returns spawned node name, and a gen_tcp socket to talk to it using ?MODULE:rpc.
--spec spawn_node(Scope :: atom(), Node :: atom()) -> {node(), gen_tcp:socket()}.
-spawn_node(Scope, Name) ->
- Self = self(),
- Controller = erlang:spawn(?MODULE, controller, [Name, Scope, Self]),
- receive
- {'$node_started', Node, Port} ->
- {ok, Socket} = gen_tcp:connect(?LOCALHOST, Port, [{active, false}, {mode, binary}, {packet, 4}]),
- Controller ! {socket, Socket},
- {Node, Socket};
- Other ->
- error({start_node, Name, Other})
- after 60000 ->
- error({start_node, Name, timeout})
- end.
-
-%% @private
--spec controller(atom(), atom(), pid()) -> ok.
-controller(Name, Scope, Self) ->
- Pa = filename:dirname(code:which(?MODULE)),
- Pa2 = filename:dirname(code:which(pg)),
- Args = lists:concat(["-setcookie ", erlang:get_cookie(),
- " -connect_all false -kernel dist_auto_connect never -noshell -pa ", Pa, " -pa ", Pa2]),
- {ok, Node} = test_server:start_node(Name, peer, [{args, Args}]),
- case rpc:call(Node, ?MODULE, control, [Scope], 5000) of
- {badrpc, nodedown} ->
- Self ! {badrpc, Node},
- ok;
- {Port, _PgPid} ->
- Self ! {'$node_started', Node, Port},
- controller_wait()
- end.
-
-controller_wait() ->
- Port =
- receive
- {socket, Port0} ->
- Port0
- end,
- MRef = monitor(port, Port),
- receive
- {'DOWN', MRef, port, Port, _Info} ->
- ok
- end.
-
-%% @doc Stops the node previously started with spawn_node,
-%% and also closes the RPC socket.
--spec stop_node(node(), gen_tcp:socket()) -> true.
-stop_node(Node, Socket) when Node =/= node() ->
- true = test_server:stop_node(Node),
- Socket =/= undefined andalso gen_tcp:close(Socket),
- true.
-
forever() ->
- fun() -> receive after infinity -> ok end end.
-
-
--spec control(Scope :: atom()) -> {Port :: integer(), pid()}.
-control(Scope) ->
- Control = self(),
- erlang:spawn(fun () -> server(Control, Scope) end),
- receive
- {port, Port, PgPid} ->
- {Port, PgPid};
- Other ->
- error({error, Other})
+ Parent = self(),
+ fun() ->
+ %% forever() is used both locally and on a remote node,
+ %% if used locally, we want to terminate when the
+ %% parent terminates in order to not leak process to
+ %% later test cases
+ Ref = monitor(process,Parent),
+ receive
+ {'DOWN',Ref,_,_,_} when node() =:= node(Parent) ->
+ ok
+ end
end.
-server(Control, Scope) ->
- try
- {ok, Pid} = if Scope =:= undefined -> {ok, undefined}; true -> pg:start(Scope) end,
- {ok, Listen} = gen_tcp:listen(0, [{mode, binary}, {packet, 4}, {ip, ?LOCALHOST}]),
- {ok, Port} = inet:port(Listen),
- Control ! {port, Port, Pid},
- {ok, Sock} = gen_tcp:accept(Listen),
- server_loop(Sock)
- catch
- Class:Reason:Stack ->
- Control ! {error, {Class, Reason, Stack}}
- end.
+spawn_node(TestCase) ->
+ {Peer, Node} = spawn_disconnected_node(TestCase, TestCase),
+ true = net_kernel:connect_node(Node),
+ {Peer, Node}.
-server_loop(Sock) ->
- inet:setopts(Sock, [{active, once}]),
- receive
- {tcp, Sock, Data} ->
- {call, M, F, A} = binary_to_term(Data),
- Ret =
- try
- erlang:apply(M, F, A) of
- Res ->
- {ok, Res}
- catch
- exit:Reason ->
- {error, {'EXIT', Reason}};
- error:Reason ->
- {error, {'EXIT', Reason}}
- end,
- ok = gen_tcp:send(Sock, term_to_binary(Ret)),
- server_loop(Sock);
- {tcp_closed, Sock} ->
- erlang:halt(1)
- end.
+spawn_disconnected_node(Scope, TestCase) ->
+ {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(TestCase), connection => 0,
+ args => ["-connect_all", "false", "-kernel", "dist_auto_connect", "never"]}),
+ {ok, _Pid} = peer:call(Peer, pg, start, [Scope]),
+ {Peer, Node}.
diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl
index bfdcdec836..086e54ce7f 100644
--- a/lib/kernel/test/prim_file_SUITE.erl
+++ b/lib/kernel/test/prim_file_SUITE.erl
@@ -435,7 +435,7 @@ close(Config) when is_list(Config) ->
{ok,Fd1} = ?PRIM_FILE:open(Name, [read, write]),
%% Just closing it is no fun, we did that a million times already
%% This is a common error, for code written before Erlang 4.3
- %% bacause then ?PRIM_FILE:open just returned a Pid, and not everyone
+ %% because then ?PRIM_FILE:open just returned a Pid, and not everyone
%% really checked what they got.
{'EXIT',_Msg} = (catch ok = ?PRIM_FILE:close({ok,Fd1})),
ok = ?PRIM_FILE:close(Fd1),
@@ -535,7 +535,7 @@ append(Config) when is_list(Config) ->
ok = ?PRIM_FILE:make_dir(NewDir),
First = "First line\n",
- Second = "Seond lines comes here\n",
+ Second = "Second lines comes here\n",
Third = "And here is the third line\n",
%% Write a small text file.
@@ -1222,7 +1222,7 @@ allocate(Config) when is_list(Config) ->
allocate_and_assert(Fd, Offset, Length) ->
%% Just verify that calls to ?PRIM_FILE:allocate/3 don't crash or have
- %% any other negative side effect. We can't really asssert against a
+ %% any other negative side effect. We can't really assert against a
%% specific return value, because support for file space pre-allocation
%% depends on the OS, OS version and underlying filesystem.
%%
@@ -1458,7 +1458,7 @@ e_rename(Config) when is_list(Config) ->
ok ->
{ok, {comment,
"Moving between filesystems "
- "suceeded, files are probably "
+ "succeeded, files are probably "
"in the same filesystem!"}};
{error, eperm} ->
{ok, {comment, "SBS! You don't "
diff --git a/lib/kernel/test/prim_file_SUITE_data/realmen.html b/lib/kernel/test/prim_file_SUITE_data/realmen.html
index c810a5d088..eaaa65523a 100644
--- a/lib/kernel/test/prim_file_SUITE_data/realmen.html
+++ b/lib/kernel/test/prim_file_SUITE_data/realmen.html
@@ -121,7 +121,7 @@ based on data structures, instead of the other way around. As all Real
Programmers know, the only useful data structure is the
array. Strings, lists, structures, sets -- these are all special cases
of arrays and and can be treated that way just as easily without
-messing up your programing language with all sorts of
+messing up your programming language with all sorts of
complications. The worst thing about fancy data types is that you have
to declare them, and Real Programming Languages, as we all know, have
implicit typing based on the first letter of the (six character)
@@ -237,7 +237,7 @@ destroy most of the interesting uses for EQUIVALENCE, and make it
impossible to modify the operating system code with negative
subscripts. Worst of all, bounds checking is inefficient.
-<LI> Source code maintainance systems. A Real Programmer keeps his
+<LI> Source code maintenance systems. A Real Programmer keeps his
code locked up in a card file, because it implies that its owner
cannot leave his important programs unguarded [5].
@@ -318,7 +318,7 @@ thing slightly more trivial than the destruction of life as we know
it, providing there's enough money in it. There are several Real
Programmers building video games at Atari, for example. (But not
playing them. A Real Programmer knows how to beat the machine every
-time: no challange in that.) Everyone working at LucasFilm is a Real
+time: no challenge in that.) Everyone working at LucasFilm is a Real
Programmer. (It would be crazy to turn down the money of 50 million
Star Wars fans.) The proportion of Real Programmers in Computer
Graphics is somewhat lower than the norm, mostly because nobody has
@@ -384,7 +384,7 @@ coffee. In some cases, the cups will contain Orange Crush.
and the Principles of Operation open to some particularly interesting
pages.
-<LI> Taped to the wall is a line-printer Snoopy calender for the year
+<LI> Taped to the wall is a line-printer Snoopy calendar for the year
1969.
<LI> Strewn about the floor are several wrappers for peanut butter
@@ -396,7 +396,7 @@ double stuff Oreos for special occasions.
<LI> Underneath the Oreos is a flow-charting template, left there by
the previous occupant of the office. (Real Programmers write programs,
-not documentation. Leave that to the maintainence people.)
+not documentation. Leave that to the maintenance people.)
</UL> <P>
diff --git a/lib/kernel/test/ram_file_SUITE_data/realmen.html b/lib/kernel/test/ram_file_SUITE_data/realmen.html
index c810a5d088..eaaa65523a 100644
--- a/lib/kernel/test/ram_file_SUITE_data/realmen.html
+++ b/lib/kernel/test/ram_file_SUITE_data/realmen.html
@@ -121,7 +121,7 @@ based on data structures, instead of the other way around. As all Real
Programmers know, the only useful data structure is the
array. Strings, lists, structures, sets -- these are all special cases
of arrays and and can be treated that way just as easily without
-messing up your programing language with all sorts of
+messing up your programming language with all sorts of
complications. The worst thing about fancy data types is that you have
to declare them, and Real Programming Languages, as we all know, have
implicit typing based on the first letter of the (six character)
@@ -237,7 +237,7 @@ destroy most of the interesting uses for EQUIVALENCE, and make it
impossible to modify the operating system code with negative
subscripts. Worst of all, bounds checking is inefficient.
-<LI> Source code maintainance systems. A Real Programmer keeps his
+<LI> Source code maintenance systems. A Real Programmer keeps his
code locked up in a card file, because it implies that its owner
cannot leave his important programs unguarded [5].
@@ -318,7 +318,7 @@ thing slightly more trivial than the destruction of life as we know
it, providing there's enough money in it. There are several Real
Programmers building video games at Atari, for example. (But not
playing them. A Real Programmer knows how to beat the machine every
-time: no challange in that.) Everyone working at LucasFilm is a Real
+time: no challenge in that.) Everyone working at LucasFilm is a Real
Programmer. (It would be crazy to turn down the money of 50 million
Star Wars fans.) The proportion of Real Programmers in Computer
Graphics is somewhat lower than the norm, mostly because nobody has
@@ -384,7 +384,7 @@ coffee. In some cases, the cups will contain Orange Crush.
and the Principles of Operation open to some particularly interesting
pages.
-<LI> Taped to the wall is a line-printer Snoopy calender for the year
+<LI> Taped to the wall is a line-printer Snoopy calendar for the year
1969.
<LI> Strewn about the floor are several wrappers for peanut butter
@@ -396,7 +396,7 @@ double stuff Oreos for special occasions.
<LI> Underneath the Oreos is a flow-charting template, left there by
the previous occupant of the office. (Real Programmers write programs,
-not documentation. Leave that to the maintainence people.)
+not documentation. Leave that to the maintenance people.)
</UL> <P>
diff --git a/lib/kernel/test/rpc_SUITE.erl b/lib/kernel/test/rpc_SUITE.erl
index 90ca4addcd..f23f24596a 100644
--- a/lib/kernel/test/rpc_SUITE.erl
+++ b/lib/kernel/test/rpc_SUITE.erl
@@ -44,6 +44,13 @@
-include_lib("common_test/include/ct.hrl").
+-ifndef(CT_PEER).
+%% This module needs to compile on old nodes...
+-define(CT_PEER(), {ok, undefined, undefined}).
+-define(CT_PEER(Opts), {ok, undefined, undefined}).
+-define(CT_PEER(Opts, Release, PrivDir), {ok, undefined, undefined}).
+-endif.
+
suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,2}}].
@@ -89,17 +96,11 @@ off_heap(_Config) ->
%% Test different rpc calls.
call(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- %% Note. First part of nodename sets response delay in seconds
- {ok, N1} = test_server:start_node('3_rpc_SUITE_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N2} = test_server:start_node('1_rcp_SUITE_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N3} = test_server:start_node('4_rcp_SUITE_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N4} = test_server:start_node('8_rcp_SUITE_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- ok = io:format("~p~n", [[N1, N2, N3]]),
+ {ok, _P1, N1} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "3"]),
+ {ok, _P2, N2} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "1"]),
+ {ok, _P3, N3} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "4"]),
+ {ok, _P4, N4} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "8"]),
+ ok = io:format("~p~n", [[N1, N2, N3, N4]]),
{hej,_,N1} = rpc:call(N1, ?MODULE, f, []),
{hej,_,N2} = rpc:call(N2, ?MODULE, f, [], 2000),
{badrpc,timeout} = rpc:call(N3, ?MODULE, f, [], 2000),
@@ -107,10 +108,6 @@ call(Config) when is_list(Config) ->
[] = flush([]),
{hej,_,N4} = rpc:call(N4, ?MODULE, f, []),
{badrpc, nodedown} = rpc:call(gurka, ?MODULE, f, []),
- test_server:stop_node(N1),
- test_server:stop_node(N2),
- test_server:stop_node(N3),
- test_server:stop_node(N4),
ok.
@@ -120,9 +117,9 @@ call_reqtmo(Config) when is_list(Config) ->
[self(), SendMe],
Timeout)
end,
- reqtmo_test(Config, Fun).
+ reqtmo_test(Fun).
-reqtmo_test(Config, Test) ->
+reqtmo_test(Test) ->
%% Tests that we time out in time also when the request itself
%% does not get through. A typical issue we have had
%% in the past, is that the timeout has not triggered until
@@ -132,7 +129,7 @@ reqtmo_test(Config, Test) ->
WaitBlock = 100,
BlockTime = 1000,
- {ok, Node} = start_node(Config),
+ {ok, Peer, Node} = ?CT_PEER(),
erpc:call(Node, erts_debug, set_internal_state, [available_internal_state,
true]),
@@ -158,7 +155,7 @@ reqtmo_test(Config, Test) ->
after 0 -> ok
end,
- stop_node(Node),
+ peer:stop(Peer),
{comment,
"Timeout = " ++ integer_to_list(Timeout)
@@ -167,16 +164,10 @@ reqtmo_test(Config, Test) ->
%% Test different rpc calls.
block_call(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- %% Note. First part of nodename sets response delay in seconds
- {ok, N1} = test_server:start_node('3_rpc_SUITE_block_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N2} = test_server:start_node('1_rcp_SUITE_block_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N3} = test_server:start_node('4_rcp_SUITE_block_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N4} = test_server:start_node('8_rcp_SUITE_block_call', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
+ {ok, _P1, N1} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "3"]),
+ {ok, _P2, N2} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "1"]),
+ {ok, _P3, N3} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "4"]),
+ {ok, _P4, N4} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "8"]),
ok = io:format("~p~n", [[N1, N2, N3]]),
{hej,_,N1} = rpc:block_call(N1, ?MODULE, f, []),
{hej,_,N2} = rpc:block_call(N2, ?MODULE, f, [], 2000),
@@ -184,56 +175,36 @@ block_call(Config) when is_list(Config) ->
receive after 6000 -> ok end,
[] = flush([]),
{hej,_,N4} = rpc:block_call(N4, ?MODULE, f, []),
- test_server:stop_node(N1),
- test_server:stop_node(N2),
- test_server:stop_node(N3),
- test_server:stop_node(N4),
ok.
%% OTP-3449.
multicall(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- %% Note. First part of nodename sets response delay in seconds
- {ok, N1} = test_server:start_node('3_rpc_SUITE_multicall', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N2} = test_server:start_node('1_rcp_SUITE_multicall', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
+ {ok, _P1, N1} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "3"]),
+ {ok, _P2, N2} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "1"]),
ok = io:format("~p~n", [[N1, N2]]),
{[{hej,_,N1},{hej,_,N2}],[]} =
rpc:multicall([N1, N2], ?MODULE, f, []),
Msgs = flush([]),
[] = Msgs,
- test_server:stop_node(N1),
- test_server:stop_node(N2),
ok.
multicall_timeout(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- %% Note. First part of nodename sets response delay in seconds
- {ok, N1} = test_server:start_node('11_rpc_SUITE_multicall', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N2} = test_server:start_node('8_rpc_SUITE_multicall', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N3} = test_server:start_node('5_rpc_SUITE_multicall', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N4} = test_server:start_node('2_rcp_SUITE_multicall', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- ok = io:format("~p~n", [[N1, N2]]),
+ {ok, _P1, N1} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "11"]),
+ {ok, _P2, N2} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "8"]),
+ {ok, _P3, N3} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "5"]),
+ {ok, _P4, N4} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "2"]),
+ ok = io:format("~p~n", [[N1, N2, N3, N4]]),
{[{hej,_,N3},{hej,_,N4}],[N1, N2]} =
rpc:multicall([N3, N1, N2, N4], ?MODULE, f, [], 6000),
ct:sleep({seconds,8}), %Wait for late answers
Msgs = flush([]),
[] = Msgs,
- test_server:stop_node(N1),
- test_server:stop_node(N2),
- test_server:stop_node(N3),
- test_server:stop_node(N4),
ok.
multicall_reqtmo(Config) when is_list(Config) ->
- {ok, QuickNode1} = start_node(Config),
- {ok, QuickNode2} = start_node(Config),
+ {ok, Peer1, QuickNode1} = ?CT_PEER(),
+ {ok, Peer2, QuickNode2} = ?CT_PEER(),
Fun = fun (Node, SendMe, Timeout) ->
Me = self(),
SlowSend = fun () ->
@@ -249,18 +220,15 @@ multicall_reqtmo(Config) when is_list(Config) ->
erlang, apply, [SlowSend, []],
Timeout)
end,
- Res = reqtmo_test(Config, Fun),
- stop_node(QuickNode1),
- stop_node(QuickNode2),
+ Res = reqtmo_test(Fun),
+ peer:stop(Peer1),
+ peer:stop(Peer2),
Res.
multicall_dies(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- {ok, N1} = test_server:start_node('rpc_SUITE_multicall_dies_1', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N2} = test_server:start_node('rcp_SUITE_multicall_dies_2', slave,
- [{args, "-connect_all false -pa " ++ PA}]),
+ {ok, P1, N1} = ?CT_PEER(["-connect_all", "false"]),
+ {ok, P2, N2} = ?CT_PEER(["-connect_all", "false"]),
Nodes = [N1, N2],
%%
{[{badrpc, {'EXIT', normal}}, {badrpc, {'EXIT', normal}}], []} =
@@ -290,8 +258,8 @@ multicall_dies(Config) when is_list(Config) ->
{[{badrpc, {'EXIT', killed}}, {badrpc, {'EXIT', killed}}], []} =
do_multicall(Nodes, ?MODULE, suicide, [exit, kill]),
%%
- test_server:stop_node(N1),
- test_server:stop_node(N2),
+ peer:stop(P1),
+ peer:stop(P2),
ok.
do_multicall(Nodes, Mod, Func, Args) ->
@@ -311,11 +279,8 @@ multicall_node_dies(Config) when is_list(Config) ->
do_multicall_2_nodes_dies(Mod, Func, Args) ->
ok = io:format("~p:~p~p~n", [Mod, Func, Args]),
- PA = filename:dirname(code:which(?MODULE)),
- {ok, N1} = test_server:start_node('rpc_SUITE_multicall_node_dies_1', peer,
- [{args, "-connect_all false -pa " ++ PA}]),
- {ok, N2} = test_server:start_node('rcp_SUITE_multicall_node_dies_2', peer,
- [{args, "-connect_all false -pa " ++ PA}]),
+ {ok, _P1, N1} = ?CT_PEER(#{connection => 0, args => ["-connect_all", "false"]}),
+ {ok, _P2, N2} = ?CT_PEER(#{connection => 0, args => ["-connect_all", "false"]}),
Nodes = [N1, N2],
case {Mod, Func, rpc:multicall(Nodes, Mod, Func, Args)} of
{_, _, {[], Nodes}} ->
@@ -336,9 +301,7 @@ do_multicall_2_nodes_dies(Mod, Func, Args) ->
%% OTP-3766.
called_dies(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- {ok, N} = test_server:start_node(rpc_SUITE_called_dies, slave,
- [{args, "-connect_all false -pa " ++ PA}]),
+ {ok, P, N} = ?CT_PEER(["-connect_all", "false"]),
%%
rep(fun (Tag, Call, Args) ->
{Tag,{badrpc,{'EXIT',normal}}} =
@@ -425,7 +388,7 @@ called_dies(Config) when is_list(Config) ->
end, N, ?MODULE, suicide, [exit,kill]),
%%
[] = flush([]),
- test_server:stop_node(N),
+ peer:stop(P),
ok.
rep(Fun, N, M, F, A) ->
@@ -470,27 +433,22 @@ suicide(Mod, Func, Args) ->
called_node_dies(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
-
node_rep(
fun (Call, Args) ->
{badrpc,nodedown} = apply(rpc, Call, Args)
- end, "rpc_SUITE_called_node_dies_1",
- PA, ?MODULE, suicide, [erlang,halt,[]]),
+ end, ?MODULE, suicide, [erlang,halt,[]]),
node_rep(
fun (Call, Args) ->
{badrpc,nodedown} = apply(rpc, Call, Args)
- end, "rpc_SUITE_called_node_dies_2",
- PA, ?MODULE, suicide, [init,stop,[]]),
+ end, ?MODULE, suicide, [init,stop,[]]),
node_rep(
fun (block_call, Args=[_|_]) ->
{badrpc,{'EXIT',{killed,_}}} = apply(rpc, block_call, Args);
(call, Args=[_|_]) ->
{badrpc,nodedown} = apply(rpc, call, Args)
- end, "rpc_SUITE_called_node_dies_3",
- PA, ?MODULE, suicide, [erlang,exit,[rex,kill]]),
+ end, ?MODULE, suicide, [erlang,exit,[rex,kill]]),
node_rep(
fun (block_call, _Args) ->
@@ -498,31 +456,24 @@ called_node_dies(Config) when is_list(Config) ->
ok;
(Call, Args=[_|_]) ->
{badrpc,nodedown} = apply(rpc, Call, Args)
- end, "rpc_SUITE_called_node_dies_4",
- PA, ?MODULE, suicide, [rpc,stop,[]]),
+ end, ?MODULE, suicide, [rpc,stop,[]]),
ok.
-node_rep(Fun, Name, PA, M, F, A) ->
- node_rep_call(a, call, [M,F,A], Fun, Name, PA),
- node_rep_call(b, call, [M,F,A,infinity], Fun, Name, PA),
- node_rep_call(c, block_call, [M,F,A], Fun, Name, PA),
- node_rep_call(d, block_call, [M,F,A,infinity], Fun, Name, PA).
+node_rep(Fun, M, F, A) ->
+ node_rep_call(call, [M,F,A], Fun),
+ node_rep_call(call, [M,F,A,infinity], Fun),
+ node_rep_call(block_call, [M,F,A], Fun),
+ node_rep_call(block_call, [M,F,A,infinity], Fun).
-node_rep_call(Tag, Call, Args, Fun, Name0, PA) ->
- Name = list_to_atom(Name0 ++ "_" ++ atom_to_list(Tag)),
- {ok, N} = test_server:start_node(Name, slave,
- [{args, "-connect_all false -pa " ++ PA}]),
+node_rep_call(Call, Args, Fun) ->
+ {ok, _P, N} = ?CT_PEER(#{connection => 0, args => ["-connect_all", "false"]}),
Fun(Call, [N|Args]),
- catch test_server:stop_node(N),
ok.
%% OTP-3766.
called_throws(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- %%
- {ok, N} = test_server:start_node(rpc_SUITE_called_throws, slave,
- [{args, "-connect_all false -pa " ++ PA}]),
+ {ok, P, N} = ?CT_PEER(["-connect_all", "false"]),
%%
rep(fun (Tag, Call, Args) ->
{Tag,up} =
@@ -533,21 +484,19 @@ called_throws(Config) when is_list(Config) ->
{Tag,apply(rpc, Call, Args)}
end, N, erlang, throw, [{'EXIT',reason}]),
%%
- test_server:stop_node(N),
+ peer:stop(P),
ok.
call_benchmark(Config) when is_list(Config) ->
- PA = filename:dirname(code:which(?MODULE)),
- {ok, Node} = test_server:start_node(rpc_SUITE_call_benchmark, slave,
- [{args, "-connect_all false -pa " ++ PA}]),
+ {ok, Peer, Node} = ?CT_PEER(["-connect_all", "false"]),
Iter = case erlang:system_info(modified_timing_level) of
undefined -> 10000;
_ -> 500 %Modified timing - spawn is slower
end,
Res = do_call_benchmark(Node, Iter),
- test_server:stop_node(Node),
+ peer:stop(Peer),
Res.
do_call_benchmark(Node, M) when is_integer(M), M > 0 ->
@@ -567,12 +516,10 @@ do_call_benchmark(Node, I, M) ->
do_call_benchmark(Node, I+1, M).
async_call(Config) when is_list(Config) ->
+ {ok, _Peer1, Node1} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "1"]),
+ {ok, _Peer2, Node2} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "10"]),
+ {ok, _Peer3, Node3} = ?CT_PEER(["-connect_all", "false", "-rpc_test_delay", "20"]),
%% Note: First part of nodename sets response delay in seconds.
- PA = filename:dirname(code:which(?MODULE)),
- NodeArgs = [{args,"-connect_all false -pa "++ PA}],
- {ok,Node1} = test_server:start_node('1_rpc_SUITE_call', slave, NodeArgs),
- {ok,Node2} = test_server:start_node('10_rpc_SUITE_call', slave, NodeArgs),
- {ok,Node3} = test_server:start_node('20_rpc_SUITE_call', slave, NodeArgs),
Promise1 = rpc:async_call(Node1, ?MODULE, f, []),
Promise2 = rpc:async_call(Node2, ?MODULE, f, []),
Promise3 = rpc:async_call(Node3, ?MODULE, f, []),
@@ -588,32 +535,37 @@ async_call(Config) when is_list(Config) ->
%% Wait for the Node2 and Node3.
{value,{hej,_,Node2}} = rpc:nb_yield(Promise2, infinity),
{hej,_,Node3} = rpc:yield(Promise3),
-
ok.
call_against_old_node(Config) ->
- case start_22_node(Config) of
- {ok, Node22} ->
- Node22 = rpc:call(Node22, erlang, node, []),
- stop_node(Node22),
- ok;
- _ ->
- {skipped, "No OTP 22 available"}
+ {OldRelName, OldRel} = old_release(),
+ case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ {skipped, "No OTP "++OldRel++" available"};
+ {ok, PeerOld, NodeOld} ->
+ NodeOld = rpc:call(NodeOld, erlang, node, []),
+ peer:stop(PeerOld),
+ ok
end.
multicall_mix(Config) ->
- {ok, Node1} = start_peer_node(Config),
- {ok, Node2} = start_peer_node(Config),
- {Node3, OldNodeTest} = case start_22_node(Config) of
- {ok, N3} ->
- {N3, true};
- _ ->
- {ok, N3} = start_peer_node(Config),
- {N3, false}
- end,
- {ok, Node4} = start_peer_node(Config),
- {ok, Node5} = start_peer_node(Config),
- stop_node(Node2),
+ {ok, _Peer1, Node1} = ?CT_PEER(#{connection => 0}),
+ {ok, Peer2, Node2} = ?CT_PEER(#{connection => 0}),
+ {OldRelName, OldRel} = old_release(),
+ {{ok, _Peer3, Node3}, OldNodeTest}
+ = case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ {ok, _, _} = OldNRes ->
+ {OldNRes, true};
+ not_available ->
+ {?CT_PEER(#{connection => 0}), false}
+ end,
+ {ok, _Peer4, Node4} = ?CT_PEER(#{connection => 0}),
+ {ok, _Peer5, Node5} = ?CT_PEER(#{connection => 0}),
+ peer:stop(Peer2),
[] = flush([]),
@@ -711,8 +663,8 @@ multicall_mix(Config) ->
[] = flush([]),
case OldNodeTest of
- true -> {comment, "Test with OTP 22 node as well"};
- false -> {comment, "Test without OTP 22"}
+ true -> {comment, "Test with OTP "++OldRel++" node as well"};
+ false -> {comment, "Test without OTP "++OldRel}
end.
call_func1(X) ->
@@ -768,51 +720,51 @@ timeout_limit(Config) when is_list(Config) ->
call_old_against_new(Config) ->
- case test_server:is_release_available("22_latest") of
- false ->
- {skipped, "No OTP 22 available"};
- true ->
- test_on_22_node(Config, call_old_against_new_test, 1, 1)
+ try
+ test_on_old_node(Config, call_old_against_new_test, 1, 1)
+ catch
+ throw:{skipped, _} = Skipped ->
+ Skipped
end.
-call_old_against_new_test([Node22], [NodeCurr]) ->
- %% Excecuted on an OTP 22 node
+call_old_against_new_test([NodeOld], [NodeCurr]) ->
+ %% Executed on an OTP old node
- Node22 = rpc:call(Node22, erlang, node, []),
+ NodeOld = rpc:call(NodeOld, erlang, node, []),
NodeCurr = rpc:call(NodeCurr, erlang, node, []),
- {badrpc, {'EXIT', bang}} = rpc:call(Node22, erlang, exit, [bang]),
+ {badrpc, {'EXIT', bang}} = rpc:call(NodeOld, erlang, exit, [bang]),
{badrpc, {'EXIT', bang}} = rpc:call(NodeCurr, erlang, exit, [bang]),
- {badrpc, {'EXIT', {blong, _}}} = rpc:call(Node22, erlang, error, [blong]),
+ {badrpc, {'EXIT', {blong, _}}} = rpc:call(NodeOld, erlang, error, [blong]),
{badrpc, {'EXIT', {blong, _}}} = rpc:call(NodeCurr, erlang, error, [blong]),
- bling = rpc:call(Node22, erlang, throw, [bling]),
+ bling = rpc:call(NodeOld, erlang, throw, [bling]),
bling = rpc:call(NodeCurr, erlang, throw, [bling]),
- {badrpc, timeout} = rpc:call(Node22, timer, sleep, [1000], 100),
+ {badrpc, timeout} = rpc:call(NodeOld, timer, sleep, [1000], 100),
{badrpc, timeout} = rpc:call(NodeCurr, timer, sleep, [1000], 100),
- {badrpc, nodedown} = rpc:call(Node22, erlang, halt, []),
+ {badrpc, nodedown} = rpc:call(NodeOld, erlang, halt, []),
{badrpc, nodedown} = rpc:call(NodeCurr, erlang, halt, []),
- {badrpc, nodedown} = rpc:call(Node22, erlang, node, []),
+ {badrpc, nodedown} = rpc:call(NodeOld, erlang, node, []),
{badrpc, nodedown} = rpc:call(NodeCurr, erlang, node, []),
ok.
multicall_old_against_new(Config) ->
- case test_server:is_release_available("22_latest") of
- false ->
- {skipped, "No OTP 22 available"};
- true ->
- test_on_22_node(Config, multicall_old_against_new_test, 2, 2)
+ try
+ test_on_old_node(Config, multicall_old_against_new_test, 2, 2)
+ catch
+ throw:{skipped, _} = Skipped ->
+ Skipped
end.
-multicall_old_against_new_test([Node22A, Node22B], [NodeCurrA, NodeCurrB]) ->
- %% Excecuted on an OTP 22 node
+multicall_old_against_new_test([NodeOldA, NodeOldB], [NodeCurrA, NodeCurrB]) ->
+ %% Executed on an OTP old node
- AllNodes = [NodeCurrA, Node22A, NodeCurrB, Node22B],
+ AllNodes = [NodeCurrA, NodeOldA, NodeCurrB, NodeOldB],
NoNodes = length(AllNodes),
{AllNodes, []} = rpc:multicall(AllNodes, erlang, node, []),
@@ -839,32 +791,32 @@ multicall_old_against_new_test([Node22A, Node22B], [NodeCurrA, NodeCurrB]) ->
ok.
cast_old_against_new(Config) ->
- case test_server:is_release_available("22_latest") of
- false ->
- {skipped, "No OTP 22 available"};
- true ->
- test_on_22_node(Config, cast_old_against_new_test, 1, 1)
+ try
+ test_on_old_node(Config, cast_old_against_new_test, 1, 1)
+ catch
+ throw:{skipped, _} = Skipped ->
+ Skipped
end.
-cast_old_against_new_test([Node22], [NodeCurr]) ->
- %% Excecuted on an OTP 22 node
+cast_old_against_new_test([NodeOld], [NodeCurr]) ->
+ %% Executed on an OTP old node
Me = self(),
Ref = make_ref(),
- true = rpc:cast(Node22, erlang, send, [Me, {Ref, 1}]),
+ true = rpc:cast(NodeOld, erlang, send, [Me, {Ref, 1}]),
receive {Ref, 1} -> ok end,
true = rpc:cast(NodeCurr, erlang, send, [Me, {Ref, 2}]),
receive {Ref, 2} -> ok end,
- true = rpc:cast(Node22, erlang, halt, []),
+ true = rpc:cast(NodeOld, erlang, halt, []),
true = rpc:cast(NodeCurr, erlang, halt, []),
- monitor_node(Node22, true),
- receive {nodedown, Node22} -> ok end,
+ monitor_node(NodeOld, true),
+ receive {nodedown, NodeOld} -> ok end,
monitor_node(NodeCurr, true),
receive {nodedown, NodeCurr} -> ok end,
- true = rpc:cast(Node22, erlang, send, [Me, {Ref, 3}]),
+ true = rpc:cast(NodeOld, erlang, send, [Me, {Ref, 3}]),
true = rpc:cast(NodeCurr, erlang, send, [Me, {Ref, 4}]),
receive Msg -> error({unexcpected_message, Msg})
@@ -875,42 +827,9 @@ cast_old_against_new_test([Node22], [NodeCurr]) ->
%%% Utility functions.
%%%
-start_peer_node(Config) ->
- Name = list_to_atom(atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-" ++ integer_to_list(erlang:system_time(second))
- ++ "-" ++ integer_to_list(erlang:unique_integer([positive]))),
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, peer, [{args, "-pa " ++ Pa}]).
-
-start_node(Config) ->
- Name = list_to_atom(atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-" ++ integer_to_list(erlang:system_time(second))
- ++ "-" ++ integer_to_list(erlang:unique_integer([positive]))),
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, slave, [{args, "-pa " ++ Pa}]).
-
-start_22_node(Config) ->
- Rel = "22_latest",
- case test_server:is_release_available(Rel) of
- false ->
- notsup;
- true ->
- Cookie = atom_to_list(erlang:get_cookie()),
- Name = list_to_atom(atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-" ++ integer_to_list(erlang:system_time(second))
- ++ "-" ++ integer_to_list(erlang:unique_integer([positive]))),
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name,
- peer,
- [{args, "-pa " ++ Pa ++ " -setcookie "++Cookie},
- {erl, [{release, Rel}]}])
- end.
-
-stop_node(Node) ->
- test_server:stop_node(Node).
+old_release() ->
+ OldRel = integer_to_list(list_to_integer(erlang:system_info(otp_release))-2),
+ {OldRel++"_latest", OldRel}.
flush(L) ->
receive
@@ -921,8 +840,11 @@ flush(L) ->
end.
t() ->
- [N | _] = string:tokens(atom_to_list(node()), "_"),
- 1000*list_to_integer(N).
+ Delay = case init:get_argument(rpc_test_delay) of
+ {ok,[[D]]} -> list_to_integer(D);
+ _ -> 0
+ end,
+ 1000*Delay.
f() ->
timer:sleep(T=t()),
@@ -933,33 +855,37 @@ f2() ->
timer:sleep(500),
halt().
-test_on_22_node(Config, Test, No22, NoCurr) ->
- Nodes22 = lists:map(fun (_) ->
- {ok, N} = start_22_node(Config),
- N
- end,
- lists:seq(1, No22+1)),
- NodesCurr = lists:map(fun (_) ->
- {ok, N} = start_node(Config),
- N
- end,
- lists:seq(1, NoCurr)),
-
- %% Recompile rpc_SUITE on OTP 22 node and load it on all OTP 22 nodes...
+test_on_old_node(Config, Test, NoOld, NoCurr) ->
+ {OldRelName, OldRel} = old_release(),
+ NodesOldRes = lists:map(fun (_) ->
+ case ?CT_PEER(#{connection => 0},
+ OldRelName,
+ proplists:get_value(priv_dir, Config)) of
+ not_available ->
+ throw({skipped, "No OTP "++OldRel++" available"});
+ {ok, _, _} = Ok ->
+ Ok
+ end
+ end,
+ lists:seq(1, NoOld+1)),
+ NodesCurrRes = lists:map(fun (_) ->
+ {ok, _, _} = ?CT_PEER()
+ end,
+ lists:seq(1, NoCurr)),
+ NFun = fun ({ok, _Peer, Node}) -> Node end,
+ NodesOld = lists:map(NFun, NodesOldRes),
+ NodesCurr = lists:map(NFun, NodesCurrRes),
+
+ %% Recompile rpc_SUITE on old node and load it on all old nodes...
SrcFile = filename:rootname(code:which(?MODULE)) ++ ".erl",
- {ok, ?MODULE, BeamCode} = rpc:call(hd(Nodes22), compile, file, [SrcFile, [binary]]),
- LoadResult = lists:duplicate(length(Nodes22), {module, ?MODULE}),
- {LoadResult, []} = rpc:multicall(Nodes22, code, load_binary, [?MODULE, SrcFile, BeamCode]),
- try
- %% Excecute test on first OTP 22 node...
- Pid = spawn_link(hd(Nodes22), ?MODULE, Test, [tl(Nodes22), NodesCurr]),
- Mon = erlang:monitor(process, Pid),
- receive
- {'DOWN', Mon, process, Pid, Reason} when Reason == normal; Reason == noproc ->
- ok
- end
- after
- lists:foreach(fun (N) -> stop_node(N) end, Nodes22),
- lists:foreach(fun (N) -> stop_node(N) end, NodesCurr)
+ {ok, ?MODULE, BeamCode} = rpc:call(hd(NodesOld), compile, file, [SrcFile, [binary]]),
+ LoadResult = lists:duplicate(length(NodesOld), {module, ?MODULE}),
+ {LoadResult, []} = rpc:multicall(NodesOld, code, load_binary, [?MODULE, SrcFile, BeamCode]),
+ %% Execute test on first old node...
+ Pid = spawn_link(hd(NodesOld), ?MODULE, Test, [tl(NodesOld), NodesCurr]),
+ Mon = erlang:monitor(process, Pid),
+ receive
+ {'DOWN', Mon, process, Pid, Reason} when Reason == normal; Reason == noproc ->
+ ok
end,
ok.
diff --git a/lib/kernel/test/seq_trace_SUITE.erl b/lib/kernel/test/seq_trace_SUITE.erl
index f6140d16ed..6e3cb08af3 100644
--- a/lib/kernel/test/seq_trace_SUITE.erl
+++ b/lib/kernel/test/seq_trace_SUITE.erl
@@ -19,9 +19,6 @@
%%
-module(seq_trace_SUITE).
-%% label_capability_mismatch needs to run a part of the test on an OTP 20 node.
--compile(r20).
-
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2,
init_per_testcase/2,end_per_testcase/2]).
@@ -30,7 +27,7 @@
send/1, distributed_send/1, recv/1, distributed_recv/1,
trace_exit/1, distributed_exit/1, call/1, port/1,
port_clean_token/1,
- match_set_seq_token/1, gc_seq_token/1, label_capability_mismatch/1,
+ match_set_seq_token/1, gc_seq_token/1,
send_literal/1,inherit_on_spawn/1,inherit_on_dist_spawn/1,
dist_spawn_error/1]).
@@ -57,7 +54,7 @@ all() ->
old_heap_token, mature_heap_token,
distributed_exit, call, port, match_set_seq_token,
port_clean_token,
- gc_seq_token, label_capability_mismatch,
+ gc_seq_token,
inherit_on_spawn, inherit_on_dist_spawn, dist_spawn_error].
groups() ->
@@ -249,10 +246,7 @@ distributed_send(Config) when is_list(Config) ->
lists:foreach(fun do_distributed_send/1, ?TIMESTAMP_MODES).
do_distributed_send(TsType) ->
- {ok,Node} = start_node(seq_trace_other,[]),
- {_,Dir} = code:is_loaded(?MODULE),
- Mdir = filename:dirname(Dir),
- true = rpc:call(Node,code,add_patha,[Mdir]),
+ {ok, Peer, Node} = ?CT_PEER(),
seq_trace:reset_trace(),
start_tracer(),
Tester = self(),
@@ -276,7 +270,7 @@ do_distributed_send(TsType) ->
Self = self(),
seq_trace:reset_trace(),
- stop_node(Node),
+ peer:stop(Peer),
[{Label,{send,_,Self,Receiver,send}, Ts1},
{Label,{send,_,Self,{n_time_receiver,Node}, "dsend"}, Ts2},
{Label,{send,_,Self,Alias,"alias_dsend"}, Ts3}
@@ -317,10 +311,7 @@ distributed_recv(Config) when is_list(Config) ->
lists:foreach(fun do_distributed_recv/1, ?TIMESTAMP_MODES).
do_distributed_recv(TsType) ->
- {ok,Node} = start_node(seq_trace_other,[]),
- {_,Dir} = code:is_loaded(?MODULE),
- Mdir = filename:dirname(Dir),
- true = rpc:call(Node,code,add_patha,[Mdir]),
+ {ok, Peer, Node} = ?CT_PEER(),
seq_trace:reset_trace(),
rpc:call(Node,?MODULE,start_tracer,[]),
Tester = self(),
@@ -346,7 +337,7 @@ do_distributed_recv(TsType) ->
Self = self(),
seq_trace:reset_trace(),
Result = rpc:call(Node,?MODULE,stop_tracer,[2]),
- stop_node(Node),
+ peer:stop(Peer),
ok = io:format("~p~n",[Result]),
[{Label,{'receive',_,Self,Receiver,'alias_receive'}, Ts1},
{Label,{'receive',_,Self,Receiver,'receive'}, Ts2}] = Result,
@@ -390,10 +381,7 @@ distributed_exit(Config) when is_list(Config) ->
lists:foreach(fun do_distributed_exit/1, ?TIMESTAMP_MODES).
do_distributed_exit(TsType) ->
- {ok, Node} = start_node(seq_trace_other, []),
- {_, Dir} = code:is_loaded(?MODULE),
- Mdir = filename:dirname(Dir),
- true = rpc:call(Node, code, add_patha, [Mdir]),
+ {ok, Peer, Node} = ?CT_PEER(),
seq_trace:reset_trace(),
rpc:call(Node, ?MODULE, start_tracer,[]),
Receiver = spawn_link(Node, ?MODULE, one_time_receiver, [exit]),
@@ -411,81 +399,14 @@ do_distributed_exit(TsType) ->
Self = self(),
Result = rpc:call(Node, ?MODULE, stop_tracer, [1]),
seq_trace:reset_trace(),
- stop_node(Node),
+ process_flag(trap_exit, false),
+ peer:stop(Peer),
ok = io:format("~p~n", [Result]),
[{0, {send, {1, 2}, Receiver, Self,
{'EXIT', Receiver, {exit, {before, exit}}}}, Ts}] = Result,
check_ts(TsType, Ts).
-label_capability_mismatch(Config) when is_list(Config) ->
- Releases = ["20_latest"],
- Available = [Rel || Rel <- Releases, test_server:is_release_available(Rel)],
- case Available of
- [] -> {skipped, "No incompatible releases available"};
- _ ->
- lists:foreach(fun do_incompatible_labels/1, Available),
- lists:foreach(fun do_compatible_labels/1, Available),
- ok
- end.
-
-do_incompatible_labels(Rel) ->
- Cookie = atom_to_list(erlang:get_cookie()),
- {ok, Node} = test_server:start_node(
- list_to_atom(atom_to_list(?MODULE)++"_"++Rel), peer,
- [{args, " -setcookie "++Cookie}, {erl, [{release, Rel}]}]),
-
- {_,Dir} = code:is_loaded(?MODULE),
- Mdir = filename:dirname(Dir),
- true = rpc:call(Node,code,add_patha,[Mdir]),
- seq_trace:reset_trace(),
- true = is_pid(rpc:call(Node,?MODULE,start_tracer,[])),
- Receiver = spawn(Node,?MODULE,one_time_receiver,[]),
-
- %% This node does not support arbitrary labels, so it must fail with a
- %% timeout as the token is dropped silently.
- seq_trace:set_token(label,make_ref()),
- seq_trace:set_token('receive',true),
-
- Receiver ! 'receive',
- %% let the other process receive the message:
- receive after 10 -> ok end,
- seq_trace:reset_trace(),
-
- {error,timeout} = rpc:call(Node,?MODULE,stop_tracer,[1]),
- stop_node(Node),
- ok.
-
-do_compatible_labels(Rel) ->
- Cookie = atom_to_list(erlang:get_cookie()),
- {ok, Node} = test_server:start_node(
- list_to_atom(atom_to_list(?MODULE)++"_"++Rel), peer,
- [{args, " -setcookie "++Cookie}, {erl, [{release, Rel}]}]),
-
- {_,Dir} = code:is_loaded(?MODULE),
- Mdir = filename:dirname(Dir),
- true = rpc:call(Node,code,add_patha,[Mdir]),
- seq_trace:reset_trace(),
- true = is_pid(rpc:call(Node,?MODULE,start_tracer,[])),
- Receiver = spawn(Node,?MODULE,one_time_receiver,[]),
-
- %% This node does not support arbitrary labels, but small integers should
- %% still work.
- Label = 1234,
- seq_trace:set_token(label,Label),
- seq_trace:set_token('receive',true),
-
- Receiver ! 'receive',
- %% let the other process receive the message:
- receive after 10 -> ok end,
- Self = self(),
- seq_trace:reset_trace(),
- Result = rpc:call(Node,?MODULE,stop_tracer,[1]),
- stop_node(Node),
- ok = io:format("~p~n",[Result]),
- [{Label,{'receive',_,Self,Receiver,'receive'}, _}] = Result,
- ok.
-
-call(doc) ->
+call(doc) ->
"Tests special forms {is_seq_trace} and {get_seq_token} "
"in trace match specs.";
call(Config) when is_list(Config) ->
@@ -734,8 +655,7 @@ inherit_on_dist_spawn(Config) when is_list(Config) ->
inherit_on_dist_spawn_test(Spawn) ->
io:format("Testing ~p()~n", [Spawn]),
- Pa = "-pa "++filename:dirname(code:which(?MODULE)),
- {ok, Node} = start_node(seq_trace_dist_spawn, Pa),
+ {ok, Peer, Node} = ?CT_PEER(),
%% ensure module is loaded on remote node...
_ = rpc:call(Node, ?MODULE, module_info, []),
@@ -865,13 +785,12 @@ inherit_on_dist_spawn_test(Spawn) ->
unlink(Other),
- stop_node(Node),
+ peer:stop(Peer),
ok.
dist_spawn_error(Config) when is_list(Config) ->
- Pa = "-pa "++filename:dirname(code:which(?MODULE)),
- {ok, Node} = start_node(seq_trace_dist_spawn, Pa),
+ {ok, Peer, Node} = ?CT_PEER(),
%% ensure module is loaded on remote node...
_ = rpc:call(Node, ?MODULE, module_info, []),
@@ -957,7 +876,7 @@ dist_spawn_error(Config) when is_list(Config) ->
{spawn_reply, ReqId, error, badopt}},
_} = StSpawnReplyNode,
- stop_node(Node),
+ peer:stop(Peer),
ok.
@@ -1079,7 +998,7 @@ match_set_seq_token(Config) when is_list(Config) ->
%% All the timeout stuff is here to get decent accuracy of the error
%% return value, instead of just 'timeout'.
%%
- {ok, Sandbox} = start_node(seq_trace_other, []),
+ {ok, Peer, Sandbox} = ?CT_PEER(),
true = rpc:call(Sandbox, code, add_patha,
[filename:dirname(code:which(?MODULE))]),
Lbl = 4711,
@@ -1124,7 +1043,7 @@ match_set_seq_token(Config) when is_list(Config) ->
ok = check_match_set_seq_token_log(Lbl, SortedLog),
%%
- stop_node(Sandbox),
+ peer:stop(Peer),
ok.
%% OTP-4222 Match spec 'set_seq_token' corrupts heap
@@ -1230,7 +1149,7 @@ gc_seq_token(Config) when is_list(Config) ->
%% All the timeout stuff is here to get decent accuracy of the error
%% return value, instead of just 'timeout'.
%%
- {ok, Sandbox} = start_node(seq_trace_other, []),
+ {ok, Peer, Sandbox} = ?CT_PEER(),
true = rpc:call(Sandbox, code, add_patha,
[filename:dirname(code:which(?MODULE))]),
Label = 4711,
@@ -1268,7 +1187,7 @@ gc_seq_token(Config) when is_list(Config) ->
{error, "Test node hung"}
end,
%%
- stop_node(Sandbox),
+ peer:stop(Peer),
ok.
do_gc_seq_token(Label) ->
@@ -1554,12 +1473,6 @@ check_ts(strict_monotonic_timestamp, Ts) ->
end,
ok.
-start_node(Name, Param) ->
- test_server:start_node(Name, peer, [{args, Param}]).
-
-stop_node(Node) ->
- test_server:stop_node(Node).
-
load_tracer(Config) ->
Path = proplists:get_value(data_dir, Config),
ok = erl_ddll:load_driver(Path, echo_drv),
diff --git a/lib/kernel/test/socket_SUITE.erl b/lib/kernel/test/socket_SUITE.erl
index 03ee74ef29..054171e22e 100644
--- a/lib/kernel/test/socket_SUITE.erl
+++ b/lib/kernel/test/socket_SUITE.erl
@@ -197,7 +197,7 @@
api_opt_sock_sndtimeo_udp4/1,
api_opt_sock_timestamp_udp4/1,
api_opt_sock_timestamp_tcp4/1,
- api_opt_ip_add_drop_membership/1,
+ api_opt_ip_add_drop_membership/0, api_opt_ip_add_drop_membership/1,
api_opt_ip_pktinfo_udp4/1,
api_opt_ip_recvopts_udp4/1,
api_opt_ip_recvorigdstaddr_udp4/1,
@@ -477,10 +477,10 @@
ttest_sgent_cgent_small_tcp4/1,
ttest_sgent_cgent_small_tcp6/1,
- ttest_sgent_cgent_medium_tcp4/1,
- ttest_sgent_cgent_medium_tcp6/1,
- ttest_sgent_cgent_large_tcp4/1,
- ttest_sgent_cgent_large_tcp6/1,
+ ttest_sgent_cgent_medium_tcp4/0, ttest_sgent_cgent_medium_tcp4/1,
+ ttest_sgent_cgent_medium_tcp6/0, ttest_sgent_cgent_medium_tcp6/1,
+ ttest_sgent_cgent_large_tcp4/0, ttest_sgent_cgent_large_tcp4/1,
+ ttest_sgent_cgent_large_tcp6/0, ttest_sgent_cgent_large_tcp6/1,
%% Server: transport = gen_tcp, active = true
%% Client: transport = socket(tcp)
@@ -2124,7 +2124,7 @@ init_per_group(GroupName, Config)
"~n", [GroupName, Config]),
%% Maybe we should skip the entire suite for this platform,
%% but for now we just skip these groups, which seem to
- %% have problems (slave node start).
+ %% have problems (node start).
%% As stated elsewhere, its not really Fedora 16, but
%% the *really* slow VM that is the issue.
try is_old_fedora16() of
@@ -2211,10 +2211,6 @@ double_data(N, Data) ->
%% that we can call the "global" info function and that it returns
%% a non-empty map...
-api_m_info(suite) ->
- [];
-api_m_info(doc) ->
- [];
api_m_info(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_m_info,
@@ -2244,10 +2240,6 @@ api_m_info() ->
%% At the same time, it will test the info function (since it uses it
%% for verification).
-api_m_debug(suite) ->
- [];
-api_m_debug(doc) ->
- [];
api_m_debug(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_m_debug,
@@ -2412,10 +2404,6 @@ api_m_error_bind(Config) when is_list(Config) ->
%% Basically open (create) and info of an IPv4 UDP (dgram) socket.
%% With some extra checks...
-api_b_open_and_info_udp4(suite) ->
- [];
-api_b_open_and_info_udp4(doc) ->
- [];
api_b_open_and_info_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_info_udp4,
@@ -2432,10 +2420,6 @@ api_b_open_and_info_udp4(_Config) when is_list(_Config) ->
%% Basically open (create) and info of an IPv6 UDP (dgram) socket.
%% With some extra checks...
-api_b_open_and_info_udp6(suite) ->
- [];
-api_b_open_and_info_udp6(doc) ->
- [];
api_b_open_and_info_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_info_udp6,
@@ -2453,10 +2437,6 @@ api_b_open_and_info_udp6(_Config) when is_list(_Config) ->
%% Basically open (create) and info of an IPv4 TCP (stream) socket.
%% With some extra checks...
-api_b_open_and_info_tcp4(suite) ->
- [];
-api_b_open_and_info_tcp4(doc) ->
- [];
api_b_open_and_info_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_info_tcp4,
@@ -2473,10 +2453,6 @@ api_b_open_and_info_tcp4(_Config) when is_list(_Config) ->
%% Basically open (create) and info of an IPv6 TCP (stream) socket.
%% With some extra checks...
-api_b_open_and_info_tcp6(suite) ->
- [];
-api_b_open_and_info_tcp6(doc) ->
- [];
api_b_open_and_info_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_info_tcp6,
@@ -2554,10 +2530,6 @@ api_b_open_and_info(InitState) ->
%% Basically open (create) and close an IPv4 UDP (dgram) socket.
%% With some extra checks...
-api_b_open_and_close_udp4(suite) ->
- [];
-api_b_open_and_close_udp4(doc) ->
- [];
api_b_open_and_close_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_close_udp4,
@@ -2573,10 +2545,6 @@ api_b_open_and_close_udp4(_Config) when is_list(_Config) ->
%% Basically open (create) and close an IPv6 UDP (dgram) socket.
%% With some extra checks...
-api_b_open_and_close_udp6(suite) ->
- [];
-api_b_open_and_close_udp6(doc) ->
- [];
api_b_open_and_close_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_close_udp6,
@@ -2593,10 +2561,6 @@ api_b_open_and_close_udp6(_Config) when is_list(_Config) ->
%% Basically open (create) and close an IPv4 TCP (stream) socket.
%% With some extra checks...
-api_b_open_and_close_tcp4(suite) ->
- [];
-api_b_open_and_close_tcp4(doc) ->
- [];
api_b_open_and_close_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_close_tcp4,
@@ -2612,10 +2576,6 @@ api_b_open_and_close_tcp4(_Config) when is_list(_Config) ->
%% Basically open (create) and close an IPv6 TCP (stream) socket.
%% With some extra checks...
-api_b_open_and_close_tcp6(suite) ->
- [];
-api_b_open_and_close_tcp6(doc) ->
- [];
api_b_open_and_close_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_close_tcp6,
@@ -2632,10 +2592,6 @@ api_b_open_and_close_tcp6(_Config) when is_list(_Config) ->
%% Basically open (create) and close an Unix Domain dgram (UDP) socket.
%% With some extra checks...
-api_b_open_and_close_udpL(suite) ->
- [];
-api_b_open_and_close_udpL(doc) ->
- [];
api_b_open_and_close_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_close_udpL,
@@ -2652,10 +2608,6 @@ api_b_open_and_close_udpL(_Config) when is_list(_Config) ->
%% Basically open (create) and close an Unix Domain stream (TCP) socket.
%% With some extra checks...
-api_b_open_and_close_tcpL(suite) ->
- [];
-api_b_open_and_close_tcpL(doc) ->
- [];
api_b_open_and_close_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_close_tcpL,
@@ -2672,10 +2624,6 @@ api_b_open_and_close_tcpL(_Config) when is_list(_Config) ->
%% Basically open (create) and close an Unix Domain dgram (UDP) socket.
%% With some extra checks...
-api_b_open_and_close_seqpL(suite) ->
- [];
-api_b_open_and_close_seqpL(doc) ->
- [];
api_b_open_and_close_seqpL(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -2692,10 +2640,6 @@ api_b_open_and_close_seqpL(_Config) when is_list(_Config) ->
%% Basically open (create) and close an IPv4 SCTP (seqpacket) socket.
%% With some extra checks...
-api_b_open_and_close_sctp4(suite) ->
- [];
-api_b_open_and_close_sctp4(doc) ->
- [];
api_b_open_and_close_sctp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_close_sctp4,
@@ -2783,7 +2727,7 @@ api_b_open_and_close(InitState) ->
protocol := ExpProtocol}, {ok, Protocol}}) ->
%% On OpenBSD (at least 6.6) something screwy happens
%% when domain = local.
- %% It will report a completly different protocol (icmp)
+ %% It will report a completely different protocol (icmp)
%% but everything still works. So we skip if this happens
%% on OpenBSD...
case os:type() of
@@ -2847,10 +2791,6 @@ api_b_open_and_close(InitState) ->
%% Basically open (create) and (maybe) close an RAW socket.
-api_b_open_and_maybe_close_raw(suite) ->
- [];
-api_b_open_and_maybe_close_raw(doc) ->
- [];
api_b_open_and_maybe_close_raw(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_open_and_maybe_close_raw,
@@ -2913,13 +2853,10 @@ do_api_b_open_and_maybe_close_raw(InitState) ->
%% Basically send and receive on an IPv4 UDP (dgram) socket using
%% sendto and recvfrom..
-api_b_sendto_and_recvfrom_udp4(suite) ->
- [];
-api_b_sendto_and_recvfrom_udp4(doc) ->
- [];
api_b_sendto_and_recvfrom_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_sendto_and_recvfrom_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data, Dest) ->
socket:sendto(Sock, Data, Dest)
@@ -2939,10 +2876,6 @@ api_b_sendto_and_recvfrom_udp4(_Config) when is_list(_Config) ->
%% Basically send and receive on an IPv4 UDP (dgram) socket using
%% sendto and recvfrom.
-api_b_sendto_and_recvfrom_udpL(suite) ->
- [];
-api_b_sendto_and_recvfrom_udpL(doc) ->
- [];
api_b_sendto_and_recvfrom_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_sendto_and_recvfrom_udpL,
@@ -2969,13 +2902,10 @@ api_b_sendto_and_recvfrom_udpL(_Config) when is_list(_Config) ->
%% Basically send and receive on an IPv4 UDP (dgram) socket
%% using sendmsg and recvmsg.
-api_b_sendmsg_and_recvmsg_udp4(suite) ->
- [];
-api_b_sendmsg_and_recvmsg_udp4(doc) ->
- [];
api_b_sendmsg_and_recvmsg_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_sendmsg_and_recvmsg_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data, Dest) ->
%% We need tests for this,
@@ -3013,10 +2943,6 @@ api_b_sendmsg_and_recvmsg_udp4(_Config) when is_list(_Config) ->
%% Basically send and receive on an IPv4 UDP (dgram) socket
%% using sendmsg and recvmsg.
-api_b_sendmsg_and_recvmsg_udpL(suite) ->
- [];
-api_b_sendmsg_and_recvmsg_udpL(doc) ->
- [];
api_b_sendmsg_and_recvmsg_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_sendmsg_and_recvmsg_udpL,
@@ -3201,13 +3127,10 @@ api_b_send_and_recv_udp(InitState) ->
%% Basically send and receive using the "common" functions (send and recv)
%% on an IPv4 TCP (stream) socket.
-api_b_send_and_recv_tcp4(suite) ->
- [];
-api_b_send_and_recv_tcp4(doc) ->
- [];
api_b_send_and_recv_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_b_send_and_recv_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data) ->
socket:send(Sock, Data)
@@ -3228,10 +3151,6 @@ api_b_send_and_recv_tcp4(_Config) when is_list(_Config) ->
%% Basically send and receive using the "common" functions (send and recv)
%% on an Unix Domain (stream) socket (TCP).
-api_b_send_and_recv_tcpL(suite) ->
- [];
-api_b_send_and_recv_tcpL(doc) ->
- [];
api_b_send_and_recv_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_b_send_and_recv_tcpL,
@@ -3256,10 +3175,6 @@ api_b_send_and_recv_tcpL(_Config) when is_list(_Config) ->
%% Basically send and receive using the "common" functions (send and recv)
%% on an Unix Domain seqpacket socket.
-api_b_send_and_recv_seqpL(suite) ->
- [];
-api_b_send_and_recv_seqpL(doc) ->
- [];
api_b_send_and_recv_seqpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(?FUNCTION_NAME,
@@ -3284,13 +3199,10 @@ api_b_send_and_recv_seqpL(_Config) when is_list(_Config) ->
%% Basically send and receive using the msg functions (sendmsg and recvmsg)
%% on an IPv4 TCP (stream) socket.
-api_b_sendmsg_and_recvmsg_tcp4(suite) ->
- [];
-api_b_sendmsg_and_recvmsg_tcp4(doc) ->
- [];
api_b_sendmsg_and_recvmsg_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_b_sendmsg_and_recvmsg_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data) ->
Msg = #{iov => [Data]},
@@ -3321,10 +3233,6 @@ api_b_sendmsg_and_recvmsg_tcp4(_Config) when is_list(_Config) ->
%% Basically send and receive using the msg functions (sendmsg and recvmsg)
%% on an Unix Domain (stream) socket (TCP).
-api_b_sendmsg_and_recvmsg_tcpL(suite) ->
- [];
-api_b_sendmsg_and_recvmsg_tcpL(doc) ->
- [];
api_b_sendmsg_and_recvmsg_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_b_sendmsg_and_recvmsg_tcpL,
@@ -3374,10 +3282,6 @@ api_b_sendmsg_and_recvmsg_tcpL(_Config) when is_list(_Config) ->
%% Basically send and receive using the msg functions (sendmsg and recvmsg)
%% on an Unix Domain (stream) socket (TCP).
-api_b_sendmsg_and_recvmsg_seqpL(suite) ->
- [];
-api_b_sendmsg_and_recvmsg_seqpL(doc) ->
- [];
api_b_sendmsg_and_recvmsg_seqpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(?FUNCTION_NAME,
@@ -3842,10 +3746,6 @@ api_b_send_and_recv_conn(InitState) ->
%% Basically send and receive on an IPv4 SCTP (seqpacket) socket
%% using sendmsg and recvmsg.
-api_b_sendmsg_and_recvmsg_sctp4(suite) ->
- [];
-api_b_sendmsg_and_recvmsg_sctp4(doc) ->
- [];
api_b_sendmsg_and_recvmsg_sctp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_b_sendmsg_and_recvmsg_sctp4,
@@ -4384,6 +4284,7 @@ api_b_send_and_recv_sctp(_InitState) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
api_b_sendmsg_iov_dgram_inet(Config) when is_list(Config) ->
+ has_support_ipv4(),
api_b_sendmsg_iov_dgram(inet).
%%
api_b_sendmsg_iov_dgram_inet6(Config) when is_list(Config) ->
@@ -4395,6 +4296,7 @@ api_b_sendmsg_iov_dgram_local(Config) when is_list(Config) ->
api_b_sendmsg_iov_dgram(local).
api_b_sendmsg_iov_stream_inet(Config) when is_list(Config) ->
+ has_support_ipv4(),
api_b_sendmsg_iov_stream(inet).
%%
api_b_sendmsg_iov_stream_inet6(Config) when is_list(Config) ->
@@ -4489,6 +4391,7 @@ api_b_sendmsg_iov_stream(Domain) ->
api_sendfile_inet(Config) when is_list(Config) ->
has_support_sendfile(),
+ has_support_ipv4(),
api_sendfile(inet, Config, fun socket:sendfile/2).
api_sendfile_inet6(Config) when is_list(Config) ->
@@ -4505,6 +4408,7 @@ api_sendfile_local(Config) when is_list(Config) ->
api_sendfile_loop_inet(Config) when is_list(Config) ->
has_support_sendfile(),
+ has_support_ipv4(),
api_sendfile(inet, Config, fun sendfile_loop/2).
api_sendfile_loop_inet6(Config) when is_list(Config) ->
@@ -4650,13 +4554,10 @@ api_sendfile_verify_block(S, Data, M, Block, N) ->
%% With some extra checks...
%% IPv4
%% Without dup
-api_ffd_open_wod_and_info_udp4(suite) ->
- [];
-api_ffd_open_wod_and_info_udp4(doc) ->
- [];
api_ffd_open_wod_and_info_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_wod_and_info_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
type => dgram,
@@ -4673,10 +4574,6 @@ api_ffd_open_wod_and_info_udp4(_Config) when is_list(_Config) ->
%% With some extra checks...
%% IPv6
%% Without dup
-api_ffd_open_wod_and_info_udp6(suite) ->
- [];
-api_ffd_open_wod_and_info_udp6(doc) ->
- [];
api_ffd_open_wod_and_info_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_wod_and_info_udp6,
@@ -4697,13 +4594,10 @@ api_ffd_open_wod_and_info_udp6(_Config) when is_list(_Config) ->
%% With some extra checks...
%% IPv4
%% With dup
-api_ffd_open_wd_and_info_udp4(suite) ->
- [];
-api_ffd_open_wd_and_info_udp4(doc) ->
- [];
api_ffd_open_wd_and_info_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_wd_open_and_info_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
type => dgram,
@@ -4720,10 +4614,6 @@ api_ffd_open_wd_and_info_udp4(_Config) when is_list(_Config) ->
%% With some extra checks...
%% IPv6
%% With dup
-api_ffd_open_wd_and_info_udp6(suite) ->
- [];
-api_ffd_open_wd_and_info_udp6(doc) ->
- [];
api_ffd_open_wd_and_info_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_wd_open_and_info_udp6,
@@ -4744,13 +4634,10 @@ api_ffd_open_wd_and_info_udp6(_Config) when is_list(_Config) ->
%% With some extra checks...
%% IPv6
%% Without dup
-api_ffd_open_wod_and_info_tcp4(suite) ->
- [];
-api_ffd_open_wod_and_info_tcp4(doc) ->
- [];
api_ffd_open_wod_and_info_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_wod_and_info_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
type => stream,
@@ -4767,10 +4654,6 @@ api_ffd_open_wod_and_info_tcp4(_Config) when is_list(_Config) ->
%% With some extra checks...
%% IPv6
%% Without dup
-api_ffd_open_wod_and_info_tcp6(suite) ->
- [];
-api_ffd_open_wod_and_info_tcp6(doc) ->
- [];
api_ffd_open_wod_and_info_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_wod_and_info_tcp6,
@@ -4791,13 +4674,10 @@ api_ffd_open_wod_and_info_tcp6(_Config) when is_list(_Config) ->
%% With some extra checks...
%% IPv6
%% With dup
-api_ffd_open_wd_and_info_tcp4(suite) ->
- [];
-api_ffd_open_wd_and_info_tcp4(doc) ->
- [];
api_ffd_open_wd_and_info_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_wd_and_info_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
type => stream,
@@ -4814,10 +4694,6 @@ api_ffd_open_wd_and_info_tcp4(_Config) when is_list(_Config) ->
%% With some extra checks...
%% IPv6
%% With dup
-api_ffd_open_wd_and_info_tcp6(suite) ->
- [];
-api_ffd_open_wd_and_info_tcp6(doc) ->
- [];
api_ffd_open_wd_and_info_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_wd_and_info_tcp6,
@@ -5025,7 +4901,7 @@ api_ffd_open_and_info(InitState) ->
%% Basically open a socket (1) and then create another socket (2) from
%% its file descriptor *without* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv4 UDP (dgram) socket.
@@ -5039,13 +4915,10 @@ api_ffd_open_and_info(InitState) ->
%%
%% </WARNING>
%%
-api_ffd_open_and_open_wod_and_send_udp4(suite) ->
- [];
-api_ffd_open_and_open_wod_and_send_udp4(doc) ->
- [];
api_ffd_open_and_open_wod_and_send_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_and_open_wod_and_send_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
type => dgram,
@@ -5060,7 +4933,7 @@ api_ffd_open_and_open_wod_and_send_udp4(_Config) when is_list(_Config) ->
%% Basically open a socket (1) and then create another socket (2) from
%% its file descriptor *without* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv6 UDP (dgram) socket.
@@ -5074,10 +4947,6 @@ api_ffd_open_and_open_wod_and_send_udp4(_Config) when is_list(_Config) ->
%%
%% </WARNING>
%%
-api_ffd_open_and_open_wod_and_send_udp6(suite) ->
- [];
-api_ffd_open_and_open_wod_and_send_udp6(doc) ->
- [];
api_ffd_open_and_open_wod_and_send_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_and_open_wod_and_send_udp6,
@@ -5096,18 +4965,15 @@ api_ffd_open_and_open_wod_and_send_udp6(_Config) when is_list(_Config) ->
%% Basically open a socket (1) and then create another socket (2) from
%% its file descriptor *with* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv4 UDP (dgram) socket.
%%
-api_ffd_open_and_open_wd_and_send_udp4(suite) ->
- [];
-api_ffd_open_and_open_wd_and_send_udp4(doc) ->
- [];
api_ffd_open_and_open_wd_and_send_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_and_open_wd_and_send_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
type => dgram,
@@ -5122,15 +4988,11 @@ api_ffd_open_and_open_wd_and_send_udp4(_Config) when is_list(_Config) ->
%% Basically open a socket (1) and then create another socket (2) from
%% its file descriptor *with* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv6 UDP (dgram) socket.
%%
-api_ffd_open_and_open_wd_and_send_udp6(suite) ->
- [];
-api_ffd_open_and_open_wd_and_send_udp6(doc) ->
- [];
api_ffd_open_and_open_wd_and_send_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_and_open_wd_and_send_udp6,
@@ -5748,7 +5610,7 @@ api_ffd_open_and_open_and_send_udp2(InitState) ->
%% Basically open a socket (1), connect to a server and then create
%% another socket (2) from its file descriptor *without* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv4 TCP (stream) socket.
@@ -5762,10 +5624,6 @@ api_ffd_open_and_open_and_send_udp2(InitState) ->
%%
%% </WARNING>
%%
-api_ffd_open_connect_and_open_wod_and_send_tcp4(suite) ->
- [];
-api_ffd_open_connect_and_open_wod_and_send_tcp4(doc) ->
- [];
api_ffd_open_connect_and_open_wod_and_send_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_connect_and_open_wod_and_send_tcp4,
@@ -5783,7 +5641,7 @@ api_ffd_open_connect_and_open_wod_and_send_tcp4(_Config) when is_list(_Config) -
%% Basically open a socket (1), connect to a server and then create
%% another socket (2) from its file descriptor *without* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv6 TCP (stream) socket.
@@ -5797,10 +5655,6 @@ api_ffd_open_connect_and_open_wod_and_send_tcp4(_Config) when is_list(_Config) -
%%
%% </WARNING>
%%
-api_ffd_open_connect_and_open_wod_and_send_tcp6(suite) ->
- [];
-api_ffd_open_connect_and_open_wod_and_send_tcp6(doc) ->
- [];
api_ffd_open_connect_and_open_wod_and_send_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_connect_and_open_wod_and_send_tcp6,
@@ -5819,14 +5673,10 @@ api_ffd_open_connect_and_open_wod_and_send_tcp6(_Config) when is_list(_Config) -
%% Basically open a socket (1), connect to a server and then create
%% another socket (2) from its file descriptor *with* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv4 TCP (stream) socket.
-api_ffd_open_connect_and_open_wd_and_send_tcp4(suite) ->
- [];
-api_ffd_open_connect_and_open_wd_and_send_tcp4(doc) ->
- [];
api_ffd_open_connect_and_open_wd_and_send_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_connect_and_open_wd_and_send_tcp4,
@@ -5845,14 +5695,10 @@ api_ffd_open_connect_and_open_wd_and_send_tcp4(_Config) when is_list(_Config) ->
%% Basically open a socket (1), connect to a server and then create
%% another socket (2) from its file descriptor *with* dup.
-%% Exchange som data from via both "client" sockets.
+%% Exchange some data from via both "client" sockets.
%% Finally close the second socket. Ensure that the original socket
%% has not been closed (test by sending some data).
%% IPv6 TCP (stream) socket.
-api_ffd_open_connect_and_open_wd_and_send_tcp6(suite) ->
- [];
-api_ffd_open_connect_and_open_wd_and_send_tcp6(doc) ->
- [];
api_ffd_open_connect_and_open_wd_and_send_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_ffd_open_connect_and_open_wd_and_send_tcp6,
@@ -6524,14 +6370,10 @@ api_ffd_open_connect_and_open_and_send_tcp2(InitState) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Basically establish a TCP connection via an async connect. IPv4.
-
-api_a_connect_tcp4(suite) ->
- [];
-api_a_connect_tcp4(doc) ->
- [];
api_a_connect_tcp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
tc_try(api_a_connect_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
ok = api_a_connect_tcpD(inet, nowait(Config))
end).
@@ -6540,11 +6382,6 @@ api_a_connect_tcp4(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Basically establish a TCP connection via an async connect. IPv6.
-
-api_a_connect_tcp6(suite) ->
- [];
-api_a_connect_tcp6(doc) ->
- [];
api_a_connect_tcp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
tc_try(api_a_connect_tcp6,
@@ -7061,14 +6898,11 @@ api_a_connect_tcp(InitState) ->
%% select message). Note that we only do this for the recvfrom,
%% since its much more difficult to "arrange" for sendto.
%%
-api_a_sendto_and_recvfrom_udp4(suite) ->
- [];
-api_a_sendto_and_recvfrom_udp4(doc) ->
- [];
api_a_sendto_and_recvfrom_udp4(Config) when is_list(Config) ->
?TT(?SECS(5)),
Nowait = nowait(Config),
tc_try(api_a_sendto_and_recvfrom_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data, Dest) ->
socket:sendto(Sock, Data, Dest)
@@ -7093,10 +6927,6 @@ api_a_sendto_and_recvfrom_udp4(Config) when is_list(Config) ->
%% select message). Note that we only do this for the recvfrom,
%% since its much more difficult to "arrange" for sendto.
%%
-api_a_sendto_and_recvfrom_udp6(suite) ->
- [];
-api_a_sendto_and_recvfrom_udp6(doc) ->
- [];
api_a_sendto_and_recvfrom_udp6(Config) when is_list(Config) ->
?TT(?SECS(5)),
Nowait = nowait(Config),
@@ -7126,14 +6956,11 @@ api_a_sendto_and_recvfrom_udp6(Config) when is_list(Config) ->
%% select message). Note that we only do this for the recvmsg,
%% since its much more difficult to "arrange" for sendmsg.
%%
-api_a_sendmsg_and_recvmsg_udp4(suite) ->
- [];
-api_a_sendmsg_and_recvmsg_udp4(doc) ->
- [];
api_a_sendmsg_and_recvmsg_udp4(Config) when is_list(Config) ->
?TT(?SECS(5)),
Nowait = nowait(Config),
tc_try(api_a_sendmsg_and_recvmsg_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data, Dest) ->
Msg = #{addr => Dest,
@@ -7171,10 +6998,6 @@ api_a_sendmsg_and_recvmsg_udp4(Config) when is_list(Config) ->
%% select message). Note that we only do this for the recvmsg,
%% since its much more difficult to "arrange" for sendmsg.
%%
-api_a_sendmsg_and_recvmsg_udp6(suite) ->
- [];
-api_a_sendmsg_and_recvmsg_udp6(doc) ->
- [];
api_a_sendmsg_and_recvmsg_udp6(Config) when is_list(Config) ->
?TT(?SECS(5)),
Nowait = nowait(Config),
@@ -7652,14 +7475,11 @@ api_a_send_and_recv_udp(InitState) ->
%% select message). Note that we only do this for the recv,
%% since its much more difficult to "arrange" for send.
%% We *also* test async for accept.
-api_a_send_and_recv_tcp4(suite) ->
- [];
-api_a_send_and_recv_tcp4(doc) ->
- [];
api_a_send_and_recv_tcp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
tc_try(api_a_send_and_recv_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data) ->
socket:send(Sock, Data)
@@ -7684,10 +7504,6 @@ api_a_send_and_recv_tcp4(Config) when is_list(Config) ->
%% select message). Note that we only do this for the recv,
%% since its much more difficult to "arrange" for send.
%% We *also* test async for accept.
-api_a_send_and_recv_tcp6(suite) ->
- [];
-api_a_send_and_recv_tcp6(doc) ->
- [];
api_a_send_and_recv_tcp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
@@ -7717,14 +7533,11 @@ api_a_send_and_recv_tcp6(Config) when is_list(Config) ->
%% select message). Note that we only do this for the recvmsg,
%% since its much more difficult to "arrange" for sendmsg.
%% We *also* test async for accept.
-api_a_sendmsg_and_recvmsg_tcp4(suite) ->
- [];
-api_a_sendmsg_and_recvmsg_tcp4(doc) ->
- [];
api_a_sendmsg_and_recvmsg_tcp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
tc_try(api_a_sendmsg_and_recvmsg_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Send = fun(Sock, Data) ->
Msg = #{iov => [Data]},
@@ -7757,10 +7570,6 @@ api_a_sendmsg_and_recvmsg_tcp4(Config) when is_list(Config) ->
%% select message). Note that we only do this for the recvmsg,
%% since its much more difficult to "arrange" for sendmsg.
%% We *also* test async for accept.
-api_a_sendmsg_and_recvmsg_tcp6(suite) ->
- [];
-api_a_sendmsg_and_recvmsg_tcp6(doc) ->
- [];
api_a_sendmsg_and_recvmsg_tcp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
@@ -8320,14 +8129,11 @@ api_a_send_and_recv_tcp(Config, InitState) ->
%% Basically we make an async (Timeout = nowait) call to recvfrom,
%% wait some time and then cancel. IPv4
%%
-api_a_recvfrom_cancel_udp4(suite) ->
- [];
-api_a_recvfrom_cancel_udp4(doc) ->
- [];
api_a_recvfrom_cancel_udp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
tc_try(api_a_recvfrom_cancel_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
case socket:recvfrom(Sock, 0, Nowait) of
@@ -8352,10 +8158,6 @@ api_a_recvfrom_cancel_udp4(Config) when is_list(Config) ->
%% Basically we make an async (Timeout = nowait) call to recvfrom,
%% wait some time and then cancel. IPv6
%%
-api_a_recvfrom_cancel_udp6(suite) ->
- [];
-api_a_recvfrom_cancel_udp6(doc) ->
- [];
api_a_recvfrom_cancel_udp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
@@ -8385,14 +8187,11 @@ api_a_recvfrom_cancel_udp6(Config) when is_list(Config) ->
%% Basically we make an async (Timeout = nowait) call to recvmsg,
%% wait some time and then cancel. IPv4
%%
-api_a_recvmsg_cancel_udp4(suite) ->
- [];
-api_a_recvmsg_cancel_udp4(doc) ->
- [];
api_a_recvmsg_cancel_udp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
tc_try(api_a_recvmsg_cancel_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
case socket:recvmsg(Sock, Nowait) of
@@ -8417,10 +8216,6 @@ api_a_recvmsg_cancel_udp4(Config) when is_list(Config) ->
%% Basically we make an async (Timeout = nowait) call to recvmsg,
%% wait some time and then cancel. IPv6
%%
-api_a_recvmsg_cancel_udp6(suite) ->
- [];
-api_a_recvmsg_cancel_udp6(doc) ->
- [];
api_a_recvmsg_cancel_udp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
@@ -8661,14 +8456,11 @@ api_a_recv_cancel_udp(InitState) ->
%% Basically we make an async (Timeout = nowait) call to accept,
%% wait some time and then cancel. IPv4
%%
-api_a_accept_cancel_tcp4(suite) ->
- [];
-api_a_accept_cancel_tcp4(doc) ->
- [];
api_a_accept_cancel_tcp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
tc_try(api_a_accept_cancel_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Accept = fun(Sock) ->
case socket:accept(Sock, Nowait) of
@@ -8694,10 +8486,6 @@ api_a_accept_cancel_tcp4(Config) when is_list(Config) ->
%% Basically we make an async (Timeout = nowait) call to accept,
%% wait some time and then cancel. IPv6
%%
-api_a_accept_cancel_tcp6(suite) ->
- [];
-api_a_accept_cancel_tcp6(doc) ->
- [];
api_a_accept_cancel_tcp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
@@ -8941,14 +8729,11 @@ api_a_accept_cancel_tcp(InitState) ->
%% Basically we make an async (Timeout = nowait) call to recv,
%% wait some time and then cancel. IPv4
%%
-api_a_recv_cancel_tcp4(suite) ->
- [];
-api_a_recv_cancel_tcp4(doc) ->
- [];
api_a_recv_cancel_tcp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
tc_try(api_a_recv_cancel_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
socket:recv(Sock, 0, Nowait)
@@ -8966,10 +8751,6 @@ api_a_recv_cancel_tcp4(Config) when is_list(Config) ->
%% Basically we make an async (Timeout = nowait) call to recv,
%% wait some time and then cancel. IPv6
%%
-api_a_recv_cancel_tcp6(suite) ->
- [];
-api_a_recv_cancel_tcp6(doc) ->
- [];
api_a_recv_cancel_tcp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
@@ -8992,14 +8773,11 @@ api_a_recv_cancel_tcp6(Config) when is_list(Config) ->
%% Basically we make an async (Timeout = nowait) call to recvmsg,
%% wait some time and then cancel. IPv4
%%
-api_a_recvmsg_cancel_tcp4(suite) ->
- [];
-api_a_recvmsg_cancel_tcp4(doc) ->
- [];
api_a_recvmsg_cancel_tcp4(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
tc_try(api_a_recvmsg_cancel_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
socket:recvmsg(Sock, Nowait)
@@ -9017,10 +8795,6 @@ api_a_recvmsg_cancel_tcp4(Config) when is_list(Config) ->
%% Basically we make an async (Timeout = nowait) call to recvmsg,
%% wait some time and then cancel. IPv6
%%
-api_a_recvmsg_cancel_tcp6(suite) ->
- [];
-api_a_recvmsg_cancel_tcp6(doc) ->
- [];
api_a_recvmsg_cancel_tcp6(Config) when is_list(Config) ->
?TT(?SECS(10)),
Nowait = nowait(Config),
@@ -9407,14 +9181,11 @@ api_a_recv_cancel_tcp(InitState) ->
%% (from *several* processes), wait some time and then cancel.
%% This should result in abort messages to the 'other' processes. IPv4
%%
-api_a_mrecvfrom_cancel_udp4(suite) ->
- [];
-api_a_mrecvfrom_cancel_udp4(doc) ->
- [];
api_a_mrecvfrom_cancel_udp4(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
tc_try(api_a_mrecvfrom_cancel_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
case socket:recvfrom(Sock, 0, Nowait) of
@@ -9440,10 +9211,6 @@ api_a_mrecvfrom_cancel_udp4(Config) when is_list(Config) ->
%% (from *several* processes), wait some time and then cancel.
%% This should result in abort messages to the 'other' processes. IPv6
%%
-api_a_mrecvfrom_cancel_udp6(suite) ->
- [];
-api_a_mrecvfrom_cancel_udp6(doc) ->
- [];
api_a_mrecvfrom_cancel_udp6(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
@@ -9474,14 +9241,11 @@ api_a_mrecvfrom_cancel_udp6(Config) when is_list(Config) ->
%% (from *several* processes), wait some time and then cancel.
%% This should result in abort messages to the 'other' processes. IPv4
%%
-api_a_mrecvmsg_cancel_udp4(suite) ->
- [];
-api_a_mrecvmsg_cancel_udp4(doc) ->
- [];
api_a_mrecvmsg_cancel_udp4(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
tc_try(api_a_mrecvmsg_cancel_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
case socket:recvmsg(Sock, Nowait) of
@@ -9507,10 +9271,6 @@ api_a_mrecvmsg_cancel_udp4(Config) when is_list(Config) ->
%% (from *several* processes), wait some time and then cancel.
%% This should result in abort messages to the 'other' processes. IPv6
%%
-api_a_mrecvmsg_cancel_udp6(suite) ->
- [];
-api_a_mrecvmsg_cancel_udp6(doc) ->
- [];
api_a_mrecvmsg_cancel_udp6(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
@@ -9928,14 +9688,11 @@ api_a_mrecv_cancel_udp(InitState) ->
%% (from *several* processes), wait some time and then cancel,
%% This should result in abort messages to the 'other' processes. IPv4
%%
-api_a_maccept_cancel_tcp4(suite) ->
- [];
-api_a_maccept_cancel_tcp4(doc) ->
- [];
api_a_maccept_cancel_tcp4(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
tc_try(api_a_maccept_cancel_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Accept = fun(Sock) ->
case socket:accept(Sock, Nowait) of
@@ -9962,10 +9719,6 @@ api_a_maccept_cancel_tcp4(Config) when is_list(Config) ->
%% (from *several* processes), wait some time and then cancel,
%% This should result in abort messages to the 'other' processes. IPv6
%%
-api_a_maccept_cancel_tcp6(suite) ->
- [];
-api_a_maccept_cancel_tcp6(doc) ->
- [];
api_a_maccept_cancel_tcp6(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
@@ -10387,14 +10140,11 @@ api_a_maccept_cancel_tcp(InitState) ->
%% (from *several* processes), wait some time and then cancel,
%% This should result in abort messages to the 'other' processes. IPv4
%%
-api_a_mrecv_cancel_tcp4(suite) ->
- [];
-api_a_mrecv_cancel_tcp4(doc) ->
- [];
api_a_mrecv_cancel_tcp4(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
tc_try(api_a_mrecv_cancel_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
socket:recv(Sock, 0, Nowait)
@@ -10413,10 +10163,6 @@ api_a_mrecv_cancel_tcp4(Config) when is_list(Config) ->
%% (from *several* processes), wait some time and then cancel,
%% This should result in abort messages to the 'other' processes. IPv6
%%
-api_a_mrecv_cancel_tcp6(suite) ->
- [];
-api_a_mrecv_cancel_tcp6(doc) ->
- [];
api_a_mrecv_cancel_tcp6(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
@@ -10440,14 +10186,11 @@ api_a_mrecv_cancel_tcp6(Config) when is_list(Config) ->
%% (from *several* processes), wait some time and then cancel,
%% This should result in abort messages to the 'other' processes. IPv4
%%
-api_a_mrecvmsg_cancel_tcp4(suite) ->
- [];
-api_a_mrecvmsg_cancel_tcp4(doc) ->
- [];
api_a_mrecvmsg_cancel_tcp4(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
tc_try(api_a_mrecvmsg_cancel_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) ->
socket:recvmsg(Sock, Nowait)
@@ -10466,10 +10209,6 @@ api_a_mrecvmsg_cancel_tcp4(Config) when is_list(Config) ->
%% (from *several* processes), wait some time and then cancel,
%% This should result in abort messages to the 'other' processes. IPv6
%%
-api_a_mrecvmsg_cancel_tcp6(suite) ->
- [];
-api_a_mrecvmsg_cancel_tcp6(doc) ->
- [];
api_a_mrecvmsg_cancel_tcp6(Config) when is_list(Config) ->
?TT(?SECS(20)),
Nowait = nowait(Config),
@@ -11037,10 +10776,6 @@ api_a_mrecv_cancel_tcp(InitState) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Perform some simple getopt and setopt with the level = otp options
-api_opt_simple_otp_options(suite) ->
- [];
-api_opt_simple_otp_options(doc) ->
- [];
api_opt_simple_otp_options(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_simple_otp_options,
@@ -11304,7 +11039,8 @@ api_opt_simple_otp_options() ->
%% *** We are done ***
#{desc => "finish",
- cmd => fun(_) ->
+ cmd => fun(#{ dummy := Dummy }) ->
+ Dummy ! die,
{ok, normal}
end}
],
@@ -11324,10 +11060,6 @@ api_opt_simple_otp_options() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Perform some simple getopt and setopt otp meta option
-api_opt_simple_otp_meta_option(suite) ->
- [];
-api_opt_simple_otp_meta_option(doc) ->
- [];
api_opt_simple_otp_meta_option(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_simple_otp_meta_option,
@@ -11504,10 +11236,6 @@ api_opt_simple_otp_meta_option() ->
%% Perform some simple operations with the rcvbuf otp option
%% The operations we test here are only for type = stream and
%% protocol = tcp.
-api_opt_simple_otp_rcvbuf_option(suite) ->
- [];
-api_opt_simple_otp_rcvbuf_option(doc) ->
- [];
api_opt_simple_otp_rcvbuf_option(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(api_opt_simple_otp_rcvbuf_option,
@@ -12150,7 +11878,7 @@ api_opt_simple_otp_rcvbuf_option() ->
%% Create a data binary of 6*1024 bytes
Data = list_to_binary(lists:duplicate(6*4, lists:seq(0, 255))),
- InitState = #{domain => inet,
+ InitState = #{domain => inet_or_inet6(),
data => Data},
i("create server evaluator"),
@@ -12175,10 +11903,6 @@ api_opt_simple_otp_rcvbuf_option() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Perform some simple getopt and setopt with the level = otp options
-api_opt_simple_otp_controlling_process(suite) ->
- [];
-api_opt_simple_otp_controlling_process(doc) ->
- [];
api_opt_simple_otp_controlling_process(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(api_opt_simple_otp_controlling_process,
@@ -12399,7 +12123,7 @@ api_opt_simple_otp_controlling_process() ->
Client1 = ?SEV_START("tcp-client", ClientSeq, ClientInitState1),
i("start tcp (stream) tester evaluator"),
- TesterInitState1 = #{domain => inet,
+ TesterInitState1 = #{domain => inet,
type => stream,
protocol => tcp,
client => Client1#ev.pid},
@@ -12413,7 +12137,7 @@ api_opt_simple_otp_controlling_process() ->
Client2 = ?SEV_START("udp-client", ClientSeq, ClientInitState2),
i("start udp (dgram) tester evaluator"),
- TesterInitState2 = #{domain => inet,
+ TesterInitState2 = #{domain => inet,
type => dgram,
protocol => udp,
client => Client2#ev.pid},
@@ -12429,10 +12153,6 @@ api_opt_simple_otp_controlling_process() ->
%% Tests the socket option acceptconn for UDP.
%% This should be possible to get but not set.
-api_opt_sock_acceptconn_udp(suite) ->
- [];
-api_opt_sock_acceptconn_udp(doc) ->
- [];
api_opt_sock_acceptconn_udp(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(api_opt_sock_acceptconn_udp,
@@ -12561,7 +12281,7 @@ api_opt_sock_acceptconn_udp() ->
?SEV_FINISH_NORMAL
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -12577,10 +12297,6 @@ api_opt_sock_acceptconn_udp() ->
%% Tests the socket option acceptconn for TCP.
%% This should be possible to get but not set.
-api_opt_sock_acceptconn_tcp(suite) ->
- [];
-api_opt_sock_acceptconn_tcp(doc) ->
- [];
api_opt_sock_acceptconn_tcp(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(api_opt_sock_acceptconn_tcp,
@@ -12917,7 +12633,7 @@ api_opt_sock_acceptconn_tcp() ->
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -12932,10 +12648,6 @@ api_opt_sock_acceptconn_tcp() ->
%% Tests the socket option acceptfilter. PLACEHOLDER!
-api_opt_sock_acceptfilter(suite) ->
- [];
-api_opt_sock_acceptfilter(doc) ->
- [];
api_opt_sock_acceptfilter(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(api_opt_sock_acceptfilter,
@@ -12948,12 +12660,8 @@ api_opt_sock_acceptfilter(_Config) when is_list(_Config) ->
%% Tests the socket option bindtodevice.
%% It has not always been possible to 'get' this option
-%% (atleast on linux).
+%% (at least on linux).
-api_opt_sock_bindtodevice(suite) ->
- [];
-api_opt_sock_bindtodevice(doc) ->
- [];
api_opt_sock_bindtodevice(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(api_opt_sock_bindtodevice,
@@ -13221,7 +12929,7 @@ api_opt_sock_bindtodevice() ->
?SEV_FINISH_NORMAL
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -13238,10 +12946,6 @@ api_opt_sock_bindtodevice() ->
%% Make it possible for datagram sockets to send packets to a broadcast
%% address (IPv4 only).
-api_opt_sock_broadcast(suite) ->
- [];
-api_opt_sock_broadcast(doc) ->
- [];
api_opt_sock_broadcast(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(api_opt_sock_broadcast,
@@ -13468,7 +13172,7 @@ api_opt_sock_broadcast() ->
(#{sock3 := Sock,
sa1 := Dest} = _State) ->
Data = list_to_binary("hejsan"),
- ?SEV_IPRINT("try send to bradcast address: "
+ ?SEV_IPRINT("try send to broadcast address: "
"~n ~p", [Dest]),
case socket:sendto(Sock, Data, Dest) of
ok ->
@@ -13514,7 +13218,7 @@ api_opt_sock_broadcast() ->
cmd => fun(#{sock3 := Sock,
sa2 := Dest} = _State) ->
Data = list_to_binary("hejsan"),
- ?SEV_IPRINT("try send to bradcast address: "
+ ?SEV_IPRINT("try send to broadcast address: "
"~n ~p", [Dest]),
case socket:sendto(Sock, Data, Dest) of
ok ->
@@ -13572,7 +13276,7 @@ api_opt_sock_broadcast() ->
?SEV_FINISH_NORMAL
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -13588,13 +13292,9 @@ api_opt_sock_broadcast() ->
%% Tests the socket option debug.
%% On linux, this test requires that the user running the test to have
%% CAP_NET_ADMIN capabilities or be root (effective user ID of 0),
-%% therefor we explicitly test for the result eacces when attempting to
+%% therefore we explicitly test for the result eacces when attempting to
%% set, and skip if we get it.
-api_opt_sock_debug(suite) ->
- [];
-api_opt_sock_debug(doc) ->
- [];
api_opt_sock_debug(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_opt_sock_debug,
@@ -13617,19 +13317,14 @@ api_opt_sock_debug() ->
cmd => fun(#{domain := Domain} = State) ->
case ?LIB:which_local_host_info(Domain) of
{ok, #{name := Name,
- addr := Addr,
- broadaddr := BAddr}} ->
+ addr := Addr}} ->
?SEV_IPRINT("local host info: "
"~n Name: ~p"
- "~n Addr: ~p"
- "~n Broadcast Addr: ~p",
- [Name, Addr, BAddr]),
+ "~n Addr: ~p",
+ [Name, Addr]),
LSA = #{family => Domain,
addr => Addr},
- BSA = #{family => Domain,
- addr => BAddr},
- {ok, State#{lsa => LSA,
- bsa => BSA}};
+ {ok, State#{lsa => LSA}};
{error, _} = ERROR ->
ERROR
end
@@ -13697,7 +13392,7 @@ api_opt_sock_debug() ->
?SEV_FINISH_NORMAL
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -13713,10 +13408,6 @@ api_opt_sock_debug() ->
%% Tests the socket option domain.
%% This is a read only option. Also not available on all platforms.
-api_opt_sock_domain(suite) ->
- [];
-api_opt_sock_domain(doc) ->
- [];
api_opt_sock_domain(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_opt_sock_domain,
@@ -13736,19 +13427,14 @@ api_opt_sock_domain() ->
cmd => fun(#{domain := Domain} = State) ->
case ?LIB:which_local_host_info(Domain) of
{ok, #{name := Name,
- addr := Addr,
- broadaddr := BAddr}} ->
+ addr := Addr}} ->
?SEV_IPRINT("local host info: "
"~n Name: ~p"
- "~n Addr: ~p"
- "~n Broadcast Addr: ~p",
- [Name, Addr, BAddr]),
+ "~n Addr: ~p",
+ [Name, Addr]),
LSA = #{family => Domain,
addr => Addr},
- BSA = #{family => Domain,
- addr => BAddr},
- {ok, State#{lsa => LSA,
- bsa => BSA}};
+ {ok, State#{lsa => LSA}};
{error, _} = ERROR ->
ERROR
end
@@ -13815,7 +13501,7 @@ api_opt_sock_domain() ->
?SEV_FINISH_NORMAL
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -13838,10 +13524,6 @@ api_opt_sock_domain() ->
%% other side"), we only test if we can set and get the value.
%% Better then nothing.
-api_opt_sock_dontroute(suite) ->
- [];
-api_opt_sock_dontroute(doc) ->
- [];
api_opt_sock_dontroute(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_opt_sock_dontroute,
@@ -13864,19 +13546,14 @@ api_opt_sock_dontroute() ->
cmd => fun(#{domain := Domain} = State) ->
case ?LIB:which_local_host_info(Domain) of
{ok, #{name := Name,
- addr := Addr,
- broadaddr := BAddr}} ->
+ addr := Addr}} ->
?SEV_IPRINT("local host info: "
"~n Name: ~p"
- "~n Addr: ~p"
- "~n Broadcast Addr: ~p",
- [Name, Addr, BAddr]),
+ "~n Addr: ~p",
+ [Name, Addr]),
LSA = #{family => Domain,
addr => Addr},
- BSA = #{family => Domain,
- addr => BAddr},
- {ok, State#{lsa => LSA,
- bsa => BSA}};
+ {ok, State#{lsa => LSA}};
{error, _} = ERROR ->
ERROR
end
@@ -13946,7 +13623,7 @@ api_opt_sock_dontroute() ->
?SEV_FINISH_NORMAL
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -13961,10 +13638,6 @@ api_opt_sock_dontroute() ->
%% Tests the socket option error. PLACEHOLDER!
-api_opt_sock_error(suite) ->
- [];
-api_opt_sock_error(doc) ->
- [];
api_opt_sock_error(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_opt_sock_error,
@@ -13980,10 +13653,6 @@ api_opt_sock_error(_Config) when is_list(_Config) ->
%% the underlying TCP timeouts. So, for now, we just test that we can
%% change the value.
-api_opt_sock_keepalive(suite) ->
- [];
-api_opt_sock_keepalive(doc) ->
- [];
api_opt_sock_keepalive(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_opt_sock_keepalive,
@@ -14006,19 +13675,14 @@ api_opt_sock_keepalive() ->
cmd => fun(#{domain := Domain} = State) ->
case ?LIB:which_local_host_info(Domain) of
{ok, #{name := Name,
- addr := Addr,
- broadaddr := BAddr}} ->
+ addr := Addr}} ->
?SEV_IPRINT("local host info: "
"~n Name: ~p"
- "~n Addr: ~p"
- "~n Broadcast Addr: ~p",
- [Name, Addr, BAddr]),
+ "~n Addr: ~p",
+ [Name, Addr]),
LSA = #{family => Domain,
addr => Addr},
- BSA = #{family => Domain,
- addr => BAddr},
- {ok, State#{lsa => LSA,
- bsa => BSA}};
+ {ok, State#{lsa => LSA}};
{error, _} = ERROR ->
ERROR
end
@@ -14090,7 +13754,7 @@ api_opt_sock_keepalive() ->
?SEV_FINISH_NORMAL
],
- Domain = inet,
+ Domain = inet_or_inet6(),
i("start tester evaluator"),
InitState = #{domain => Domain},
@@ -14105,10 +13769,6 @@ api_opt_sock_keepalive() ->
%% Tests the socket option linger. PLACEHOLDER!
-api_opt_sock_linger(suite) ->
- [];
-api_opt_sock_linger(doc) ->
- [];
api_opt_sock_linger(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_opt_sock_linger,
@@ -14121,10 +13781,6 @@ api_opt_sock_linger(_Config) when is_list(_Config) ->
%% Tests the socket option mark. PLACEHOLDER!
-api_opt_sock_mark(suite) ->
- [];
-api_opt_sock_mark(doc) ->
- [];
api_opt_sock_mark(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_opt_sock_mark,
@@ -14141,7 +13797,7 @@ api_opt_sock_mark(_Config) when is_list(_Config) ->
%%
%% socket:setopt(Sock, socket, oobinline, boolean()).
%%
-%% This works on linux of some version (atleast linux kernel 4.15.0),
+%% This works on linux of some version (at least linux kernel 4.15.0),
%% but not on FreeBSD (12) for some reason. Until we have figured out
%% exctly why, we skip a bunch of OSs...
%%
@@ -14150,10 +13806,6 @@ api_opt_sock_mark(_Config) when is_list(_Config) ->
%% linux but maybe not in, say, FreeBSD).
%%
-api_opt_sock_oobinline(suite) ->
- [];
-api_opt_sock_oobinline(doc) ->
- [];
api_opt_sock_oobinline(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_ooinline,
@@ -14179,7 +13831,7 @@ api_opt_sock_oobinline(_Config) when is_list(_Config) ->
(Sock, false) ->
socket:recv(Sock)
end,
- InitState = #{domain => inet,
+ InitState = #{domain => inet_or_inet6(),
proto => tcp,
send => Send,
recv => Recv,
@@ -14783,10 +14435,6 @@ do_api_opt_sock_oobinline(InitState) ->
%% As it is now, the client does *not* get any credentials!
%% Until this has been done, this case is skipped!.
-api_opt_sock_passcred_tcp4(suite) ->
- [];
-api_opt_sock_passcred_tcp4(doc) ->
- [];
api_opt_sock_passcred_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_passcred_tcp4,
@@ -15574,10 +15222,6 @@ api_opt_sock_passcred_tcp(InitState) ->
%%
%%
-api_opt_sock_peek_off_tcpL(suite) ->
- [];
-api_opt_sock_peek_off_tcpL(doc) ->
- [];
api_opt_sock_peek_off_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_peek_off_tcpL,
@@ -16125,7 +15769,7 @@ api_opt_sock_peek_off(InitState) ->
%% There is no way to be sure that the data has actually arrived,
%% and with no data on the server side, the peek will fail.
- %% Hopfully a sleep will take care of this...
+ %% Hopefully a sleep will take care of this...
?SEV_SLEEP(?SECS(1)),
%% 1) peek
@@ -16288,7 +15932,7 @@ api_opt_sock_peek_off(InitState) ->
%% Tests that we get the peer credentials for a connected unix domain
%% TCP (stream) socket.
-%% That is, all we need to do is to create a slave node, and have
+%% That is, all we need to do is to create a node, and have
%% process connect from that to a local (unix domain socket) socket.
%%
%% THIS IS A PLACEHOLDER!!
@@ -16297,10 +15941,6 @@ api_opt_sock_peek_off(InitState) ->
%% and decode it...
%%
-api_opt_sock_peercred_tcpL(suite) ->
- [];
-api_opt_sock_peercred_tcpL(doc) ->
- [];
api_opt_sock_peercred_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_peercred_tcpL,
@@ -16477,11 +16117,11 @@ api_opt_sock_peercred_tcp(_InitState) ->
%% #{desc => "create node",
%% cmd => fun(#{host := Host} = State) ->
%% ?SEV_IPRINT("try create node on ~p", [Host]),
- %% case start_node(Host, client) of
- %% {ok, Node} ->
+ %% case ?CT_PEER() of
+ %% {ok, Peer, Node} ->
%% ?SEV_IPRINT("client node ~p started",
%% [Node]),
- %% {ok, State#{node => Node}};
+ %% {ok, State#{node => Node, peer => Peer}};
%% {error, Reason} ->
%% {skip, Reason}
%% end
@@ -16590,8 +16230,8 @@ api_opt_sock_peercred_tcp(_InitState) ->
%% {ok, State1}
%% end},
%% #{desc => "stop client node",
- %% cmd => fun(#{node := Node} = _State) ->
- %% stop_node(Node)
+ %% cmd => fun(#{peer := Peer} = _State) ->
+ %% peer:stop(Peer)
%% end},
%% #{desc => "await client node termination",
%% cmd => fun(#{node := Node} = State) ->
@@ -16836,14 +16476,10 @@ api_opt_sock_peercred_tcp(_InitState) ->
%%
%%
-api_opt_sock_priority_udp4(suite) ->
- [];
-api_opt_sock_priority_udp4(doc) ->
- [];
api_opt_sock_priority_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_priority_udp4,
- fun() -> has_support_sock_priority() end,
+ fun() -> has_support_ipv4(), has_support_sock_priority() end,
fun() ->
Set = fun(Sock, Value) ->
socket:setopt(Sock, socket, priority, Value)
@@ -16869,14 +16505,10 @@ api_opt_sock_priority_udp4(_Config) when is_list(_Config) ->
%%
%%
-api_opt_sock_priority_tcp4(suite) ->
- [];
-api_opt_sock_priority_tcp4(doc) ->
- [];
api_opt_sock_priority_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_priority_tcp4,
- fun() -> has_support_sock_priority() end,
+ fun() -> has_support_ipv4(), has_support_sock_priority() end,
fun() ->
Set = fun(Sock, Value) ->
socket:setopt(Sock, socket, priority, Value)
@@ -17010,14 +16642,10 @@ api_opt_sock_priority(InitState) ->
%%
%%
-api_opt_sock_rcvbuf_udp4(suite) ->
- [];
-api_opt_sock_rcvbuf_udp4(doc) ->
- [];
api_opt_sock_rcvbuf_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_rcvbuf_udp4,
- fun() -> has_support_sock_rcvbuf() end,
+ fun() -> has_support_ipv4(), has_support_sock_rcvbuf() end,
fun() ->
ok = api_opt_sock_buf_udp4(rcvbuf)
end).
@@ -17031,14 +16659,10 @@ api_opt_sock_rcvbuf_udp4(_Config) when is_list(_Config) ->
%%
%%
-api_opt_sock_sndbuf_udp4(suite) ->
- [];
-api_opt_sock_sndbuf_udp4(doc) ->
- [];
api_opt_sock_sndbuf_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_sndbuf_udp4,
- fun() -> has_support_sock_sndbuf() end,
+ fun() -> has_support_ipv4(), has_support_sock_sndbuf() end,
fun() ->
ok = api_opt_sock_buf_udp4(sndbuf)
end).
@@ -17167,14 +16791,10 @@ api_opt_sock_buf(InitState) ->
%% but we don't (we just set the value and read it back...)
%%
-api_opt_sock_rcvtimeo_udp4(suite) ->
- [];
-api_opt_sock_rcvtimeo_udp4(doc) ->
- [];
api_opt_sock_rcvtimeo_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_rcvtimeo_udp4,
- fun() -> has_support_sock_rcvtimeo() end,
+ fun() -> has_support_ipv4(), has_support_sock_rcvtimeo() end,
fun() ->
ok = api_opt_sock_timeo_udp4(rcvtimeo)
end).
@@ -17188,14 +16808,10 @@ api_opt_sock_rcvtimeo_udp4(_Config) when is_list(_Config) ->
%%
%%
-api_opt_sock_sndtimeo_udp4(suite) ->
- [];
-api_opt_sock_sndtimeo_udp4(doc) ->
- [];
api_opt_sock_sndtimeo_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_sndtimeo_udp4,
- fun() -> has_support_sock_sndtimeo() end,
+ fun() -> has_support_ipv4(), has_support_sock_sndtimeo() end,
fun() ->
ok = api_opt_sock_timeo_udp4(sndtimeo)
end).
@@ -17291,7 +16907,7 @@ api_opt_sock_timeo(InitState) ->
ok;
{ok, #{sec := Sec}} when (ExpSec =:= Sec) ->
%% For some reason OpenBSD "adjusts" the timeout,
- %% so that usec does not (allways match)
+ %% so that usec does not (always match)
?SEV_IPRINT("timeout (approx) validated"),
ok;
{ok, TO} ->
@@ -17338,14 +16954,10 @@ api_opt_sock_timeo(InitState) ->
%%
%%
-api_opt_sock_rcvlowat_udp4(suite) ->
- [];
-api_opt_sock_rcvlowat_udp4(doc) ->
- [];
api_opt_sock_rcvlowat_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_rcvlowat_udp4,
- fun() -> has_support_sock_rcvlowat() end,
+ fun() -> has_support_ipv4(), has_support_sock_rcvlowat() end,
fun() ->
ok = api_opt_sock_lowat_udp4(rcvlowat)
end).
@@ -17361,14 +16973,10 @@ api_opt_sock_rcvlowat_udp4(_Config) when is_list(_Config) ->
%% so we skip if we get ENOPROTOOPT when attempting a change.
%%
-api_opt_sock_sndlowat_udp4(suite) ->
- [];
-api_opt_sock_sndlowat_udp4(doc) ->
- [];
api_opt_sock_sndlowat_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_sndlowat_udp4,
- fun() -> has_support_sock_sndlowat() end,
+ fun() -> has_support_ipv4(), has_support_sock_sndlowat() end,
fun() ->
ok = api_opt_sock_lowat_udp4(sndlowat)
end).
@@ -17505,14 +17113,10 @@ api_opt_sock_lowat(InitState) ->
%% All subsequent *received* messages will be timestamped.
%%
-api_opt_sock_timestamp_udp4(suite) ->
- [];
-api_opt_sock_timestamp_udp4(doc) ->
- [];
api_opt_sock_timestamp_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_timestamp_udp4,
- fun() -> has_support_sock_timestamp() end,
+ fun() -> has_support_ipv4(), has_support_sock_timestamp() end,
fun() ->
Set = fun(Sock, Value) ->
socket:setopt(Sock, socket, timestamp, Value)
@@ -17891,14 +17495,11 @@ api_opt_sock_timestamp_udp(InitState) ->
%% Don't actually know if its the distro or the (kernel) version...
%%
-api_opt_sock_timestamp_tcp4(suite) ->
- [];
-api_opt_sock_timestamp_tcp4(doc) ->
- [];
api_opt_sock_timestamp_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_sock_timestamp_tcp4,
fun() ->
+ has_support_ipv4(),
has_support_sock_timestamp(),
is_good_enough_linux({4,4,120}),
is_not_freebsd(),
@@ -18311,7 +17912,7 @@ api_opt_sock_timestamp_tcp(InitState) ->
ERROR
end
end},
- %% Linux pecularity observed here...
+ %% Linux peculiarity observed here...
%% Detected on Kernel 4.15.0-72 x96_64.
%% The option set to enable receiving timestamps just above
%% has failed to be effective down in "await recv reply 2
@@ -18696,10 +18297,9 @@ api_opt_sock_timestamp_tcp(InitState) ->
%% When sending, the dest will be the multicast address
%% and port of the receiving socket.
%% Receiving socket: Bound to the multicast address and port.
-api_opt_ip_add_drop_membership(suite) ->
- [];
-api_opt_ip_add_drop_membership(doc) ->
- ["OTP-15908 (ERL-980)"];
+api_opt_ip_add_drop_membership() ->
+ [{doc, "OTP-15908 (ERL-980)"}].
+
api_opt_ip_add_drop_membership(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(api_opt_ip_add_drop_membership,
@@ -18708,10 +18308,10 @@ api_opt_ip_add_drop_membership(_Config) when is_list(_Config) ->
has_support_ip_drop_membership(),
has_support_ip_multicast()
end,
- fun() -> api_opt_ip_add_drop_membership() end).
+ fun() -> api_opt_ip_add_drop_membership_do() end).
-api_opt_ip_add_drop_membership() ->
+api_opt_ip_add_drop_membership_do() ->
Set = fun(S, Key, Val) ->
socket:setopt(S, ip, Key, Val)
end,
@@ -19038,14 +18638,10 @@ which_local_host_ifname(Domain) ->
%% we do not test!!
%%
-api_opt_ip_pktinfo_udp4(suite) ->
- [];
-api_opt_ip_pktinfo_udp4(doc) ->
- [];
api_opt_ip_pktinfo_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_pktinfo_udp4,
- fun() -> has_support_ip_pktinfo() end,
+ fun() -> has_support_ipv4(), has_support_ip_pktinfo() end,
fun() ->
Set = fun(Sock, Value) ->
socket:setopt(Sock, ip, pktinfo, Value)
@@ -19394,14 +18990,11 @@ api_opt_ip_pktinfo_udp(InitState) ->
%% </NOTE>
%%
-api_opt_ip_recvopts_udp4(suite) ->
- [];
-api_opt_ip_recvopts_udp4(doc) ->
- [];
api_opt_ip_recvopts_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_recvopts_udp4,
fun() ->
+ has_support_ipv4(),
has_support_ip_recvopts(),
%% We also use the recvtos and timestamp options
%% in this test, so at least one of them must
@@ -19853,14 +19446,10 @@ api_opt_ip_recvopts_udp(InitState) ->
%%
%%
-api_opt_ip_recvorigdstaddr_udp4(suite) ->
- [];
-api_opt_ip_recvorigdstaddr_udp4(doc) ->
- [];
api_opt_ip_recvorigdstaddr_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_recvorigdstaddr_udp4,
- fun() -> has_support_ip_recvorigdstaddr() end,
+ fun() -> has_support_ipv4(), has_support_ip_recvorigdstaddr() end,
fun() ->
Set = fun(Sock, Value) ->
socket:setopt(Sock, ip, recvorigdstaddr, Value)
@@ -20109,14 +19698,11 @@ api_opt_ip_recvorigdstaddr_udp(InitState) ->
%% that method. Instead, set tos (true) on the sending socket.
%%
-api_opt_ip_recvtos_udp4(suite) ->
- [];
-api_opt_ip_recvtos_udp4(doc) ->
- [];
api_opt_ip_recvtos_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_recvtos_udp4,
fun() ->
+ has_support_ipv4(),
has_support_ip_recvtos(),
has_support_ip_tos() % Used in the test
end,
@@ -20486,14 +20072,11 @@ api_opt_ip_recvtos_udp(InitState) ->
%% skip darwin and OpenBSD.
%%
-api_opt_ip_recvttl_udp4(suite) ->
- [];
-api_opt_ip_recvttl_udp4(doc) ->
- [];
api_opt_ip_recvttl_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_recvttl_udp4,
fun() ->
+ has_support_ipv4(),
has_support_ip_recvttl(),
is_not_openbsd(),
is_not_darwin()
@@ -20872,14 +20455,10 @@ api_opt_ip_recvttl_udp(InitState) ->
%% Default value is supposed to be '0'.
%%
-api_opt_ip_tos_udp4(suite) ->
- [];
-api_opt_ip_tos_udp4(doc) ->
- [];
api_opt_ip_tos_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_tos_udp4,
- fun() -> has_support_ip_tos() end,
+ fun() -> has_support_ipv4(), has_support_ip_tos() end,
fun() ->
Set = fun(Sock, Value) ->
socket:setopt(Sock, ip, tos, Value)
@@ -20900,7 +20479,7 @@ api_opt_ip_tos_udp(InitState) ->
process_flag(trap_exit, true),
%% mincost is not supported on all platforms.
%% For instance, Solaris 10, does not have that constant.
- %% Instead it has two others with, what appers to be,
+ %% Instead it has two others with, what appears to be,
%% completely different meanings...
%% So, avoid the complication by not using this value...
%% TOS1 = mincost, TOS1Str = atom_to_list(TOS1),
@@ -21118,14 +20697,11 @@ api_opt_ip_tos_udp(InitState) ->
%% queue can be read.
%%
-api_opt_ip_recverr_udp4(suite) ->
- [];
-api_opt_ip_recverr_udp4(doc) ->
- [];
api_opt_ip_recverr_udp4(Config) when is_list(Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_recverr_udp4,
fun() ->
+ has_support_ipv4(),
has_support_ip_recverr()
end,
fun() ->
@@ -21157,10 +20733,6 @@ api_opt_ip_recverr_udp4(Config) when is_list(Config) ->
%% queue can be read.
%%
-api_opt_ipv6_recverr_udp6(suite) ->
- [];
-api_opt_ipv6_recverr_udp6(doc) ->
- [];
api_opt_ipv6_recverr_udp6(Config) when is_list(Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ipv6_recverr_udp6,
@@ -21249,7 +20821,7 @@ api_opt_recverr_udp(Config, InitState) ->
"~n ~p", [SelectInfo]),
{ok, State#{rselect => SelectInfo}};
{ok, _} ->
- ?SEV_EPRINT("unexpected successs"),
+ ?SEV_EPRINT("unexpected success"),
{error, unexpected_success};
{error, Reason} = ERROR ->
?SEV_EPRINT("unexpected error: ~p", [Reason]),
@@ -21310,7 +20882,7 @@ api_opt_recverr_udp(Config, InitState) ->
?SEV_IPRINT("expected failure: ~p", [Reason]),
ok;
{ok, _} ->
- ?SEV_EPRINT("unexpected successs"),
+ ?SEV_EPRINT("unexpected success"),
{error, unexpected_success};
{select, SelectInfo} ->
?SEV_EPRINT("unexpected select: ~p",
@@ -21448,14 +21020,11 @@ api_opt_recverr_udp(Config, InitState) ->
%% the test (since its a IPv4 test case).
%%
-api_opt_ip_mopts_udp4(suite) ->
- [];
-api_opt_ip_mopts_udp4(doc) ->
- [];
api_opt_ip_mopts_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ip_mopts_udp4,
fun() ->
+ has_support_ipv4(),
case is_any_options_supported(
[{ip, pktinfo},
{ip, recvorigdstaddr},
@@ -21789,10 +21358,6 @@ api_opt_ip_mopts_udp(InitState) ->
%% although we only test this with dgram.
%%
-api_opt_ipv6_recvpktinfo_udp6(suite) ->
- [];
-api_opt_ipv6_recvpktinfo_udp6(doc) ->
- [];
api_opt_ipv6_recvpktinfo_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ipv6_recvpktinfo_udp6,
@@ -22052,14 +21617,10 @@ api_opt_ipv6_recvpktinfo_udp(InitState) ->
%% There seem to be some weirdness with the definition of this
%% option, so its defined in an include file we don't include
%% (directly or indirectly). And since some of the defines
-%% are occure in a file we *do* include (via netinet/in.h), we
+%% occur in a file we *do* include (via netinet/in.h), we
%% leave it as is for now...
%%
-api_opt_ipv6_flowinfo_udp6(suite) ->
- [];
-api_opt_ipv6_flowinfo_udp6(doc) ->
- [];
api_opt_ipv6_flowinfo_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ipv6_flowinfo_udp6,
@@ -22315,10 +21876,6 @@ api_opt_ipv6_flowinfo_udp(InitState) ->
%% </Note>
%%
-api_opt_ipv6_hoplimit_udp6(suite) ->
- [];
-api_opt_ipv6_hoplimit_udp6(doc) ->
- [];
api_opt_ipv6_hoplimit_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ipv6_hoplimit_udp6,
@@ -22606,10 +22163,6 @@ api_opt_ipv6_hoplimit_udp(InitState) ->
%% </Note>
%%
-api_opt_ipv6_tclass_udp6(suite) ->
- [];
-api_opt_ipv6_tclass_udp6(doc) ->
- [];
api_opt_ipv6_tclass_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ipv6_tclass_udp6,
@@ -22963,10 +22516,6 @@ api_opt_ipv6_tclass_udp(InitState) ->
%% the test (since its a IPv6 test case).
%%
-api_opt_ipv6_mopts_udp6(suite) ->
- [];
-api_opt_ipv6_mopts_udp6(doc) ->
- [];
api_opt_ipv6_mopts_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_ipv6_mopts_udp6,
@@ -23254,18 +22803,14 @@ api_opt_ipv6_mopts_udp(InitState) ->
%% According to the man page (on linux) for this option it *should* be
%% possible to both get and set *allowed* algorithms. But when we attempt
%% to set, we get 'enoent'.
-%% Accoring to /proc/sys/net/ipv4/tcp_allowed_congestion_control that
+%% According to /proc/sys/net/ipv4/tcp_allowed_congestion_control that
%% allgorithm was allowed, so...
%% For now, we only test that we can get (it could be a bug in our code)
-api_opt_tcp_congestion_tcp4(suite) ->
- [];
-api_opt_tcp_congestion_tcp4(doc) ->
- [];
api_opt_tcp_congestion_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_tcp_congestion_tcp4,
- fun() -> has_support_tcp_congestion() end,
+ fun() -> has_support_ipv4(), has_support_tcp_congestion() end,
fun() ->
Set = fun(Sock, Value) when is_list(Value) ->
socket:setopt(Sock, tcp, congestion, Value)
@@ -23449,14 +22994,10 @@ api_opt_tcp_congestion_tcp(InitState) ->
%% Reading the man page it seems like (on linux) that the
%% value resets itself after some (short) time...
-api_opt_tcp_cork_tcp4(suite) ->
- [];
-api_opt_tcp_cork_tcp4(doc) ->
- [];
api_opt_tcp_cork_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_tcp_cork_tcp4,
- fun() -> has_support_tcp_cork() end,
+ fun() -> has_support_ipv4(), has_support_tcp_cork() end,
fun() ->
Set = fun(Sock, Value) when is_boolean(Value) ->
socket:setopt(Sock, tcp, cork, Value)
@@ -23568,17 +23109,13 @@ api_opt_tcp_cork_tcp(InitState) ->
%%
%% Note that there is no point in reading this value back,
%% since the kernel imposes its own rules with regard
-%% to what is an acceptible value.
+%% to what is an acceptable value.
%%
-api_opt_tcp_maxseg_tcp4(suite) ->
- [];
-api_opt_tcp_maxseg_tcp4(doc) ->
- [];
api_opt_tcp_maxseg_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_tcp_maxseg_tcp4,
- fun() -> has_support_tcp_maxseg() end,
+ fun() -> has_support_ipv4(), has_support_tcp_maxseg() end,
fun() ->
Set = fun(Sock, Value) when is_integer(Value) ->
socket:setopt(Sock, tcp, maxseg, Value)
@@ -23644,7 +23181,7 @@ api_opt_tcp_maxseg_tcp(InitState) ->
%% Note that there is no point in reading this value back,
%% since the kernel imposes its own rules with regard
- %% to what is an acceptible value.
+ %% to what is an acceptable value.
%% So, even if the set operation is a success, the value
%% still might not have changed.
%%
@@ -23698,14 +23235,10 @@ api_opt_tcp_maxseg_tcp(InitState) ->
%% This is a very simple test. We simple set and get the value.
%% To test that it has an effect is just "to much work"...
-api_opt_tcp_nodelay_tcp4(suite) ->
- [];
-api_opt_tcp_nodelay_tcp4(doc) ->
- [];
api_opt_tcp_nodelay_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_tcp_nodelay_tcp4,
- fun() -> has_support_tcp_nodelay() end,
+ fun() -> has_support_ipv4(), has_support_tcp_nodelay() end,
fun() ->
Set = fun(Sock, Value) when is_boolean(Value) ->
socket:setopt(Sock, tcp, nodelay, Value)
@@ -23816,14 +23349,10 @@ api_opt_tcp_nodelay_tcp(InitState) ->
%% To test that it has an effect is just "to much work"...
%%
-api_opt_udp_cork_udp4(suite) ->
- [];
-api_opt_udp_cork_udp4(doc) ->
- [];
api_opt_udp_cork_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(api_opt_udp_cork_udp4,
- fun() -> has_support_udp_cork() end,
+ fun() -> has_support_ipv4(), has_support_udp_cork() end,
fun() ->
Set = fun(Sock, Value) when is_boolean(Value) ->
socket:setopt(Sock, udp, cork, Value)
@@ -23939,13 +23468,9 @@ api_opt_udp_cork_udp(InitState) ->
%% This test case is intended to test the connect timeout option
%% on an IPv4 TCP (stream) socket.
-api_to_connect_tcp4(suite) ->
- [];
-api_to_connect_tcp4(doc) ->
- [];
api_to_connect_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
- Cond = fun() -> api_to_connect_cond() end,
+ Cond = fun() -> has_support_ipv4(), api_to_connect_cond() end,
tc_try(api_to_connect_tcp4,
Cond,
fun() ->
@@ -23961,7 +23486,7 @@ api_to_connect_cond() ->
%% I don't know exactly at which version this starts to work.
%% I know it does not work for 4.4.*, but is does for 4.15.
-%% So, just to simplify, we require atleast 4.15
+%% So, just to simplify, we require at least 4.15
api_to_connect_cond({unix, linux}, {Maj, Min, _Rev}) ->
if
(Maj > 4) ->
@@ -23998,10 +23523,6 @@ api_to_connect_cond(_, _) ->
%% This test case is intended to test the connect timeout option
%% on an IPv6 TCP (stream) socket.
-api_to_connect_tcp6(suite) ->
- [];
-api_to_connect_tcp6(doc) ->
- [];
api_to_connect_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_connect_tcp6,
@@ -24019,7 +23540,7 @@ api_to_connect_tcp6(_Config) when is_list(_Config) ->
%% We use the backlog (listen) argument to test this.
%% Note that the behaviour of the TCP "server side" can vary when
%% a client connect to a "busy" server (full backlog).
-%% For instance, on FreeBSD (11.2) the reponse when the backlog is full
+%% For instance, on FreeBSD (11.2) the response when the backlog is full
%% is a econreset.
api_to_connect_tcp(InitState) ->
@@ -24121,11 +23642,11 @@ api_to_connect_tcp(InitState) ->
#{desc => "create node",
cmd => fun(#{host := Host} = State) ->
?SEV_IPRINT("try create node on ~p", [Host]),
- case start_node(Host, client) of
- {ok, Node} ->
+ case ?CT_PEER() of
+ {ok, Peer, Node} ->
?SEV_IPRINT("client node ~p started",
[Node]),
- {ok, State#{node => Node}};
+ {ok, State#{node => Node, peer => Peer}};
{error, Reason} ->
{skip, Reason}
end
@@ -24233,9 +23754,9 @@ api_to_connect_tcp(InitState) ->
{ok, State1}
end},
#{desc => "stop client node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
State#{node_stop => ok};
{error, Reason} ->
@@ -24257,14 +23778,14 @@ api_to_connect_tcp(InitState) ->
receive
{nodedown, Node} ->
?SEV_IPRINT("nodedown received - cleanup"),
- State1 = maps:remove(node_id, State),
- State2 = maps:remove(node, State1),
+ State1 = maps:remove(peer, State),
+ State2 = maps:remove(node, State1),
{ok, State2}
end;
(#{node_stop := error} = State) ->
?SEV_IPRINT("Failed node stop - cleanup"),
- State1 = maps:remove(node_id, State),
- State2 = maps:remove(node, State1),
+ State1 = maps:remove(peer, State),
+ State2 = maps:remove(node, State1),
{ok, State2}
end},
@@ -24511,13 +24032,10 @@ api_to_connect_tcp_await_timeout3([Sock|Socka]) ->
%% This test case is intended to test the accept timeout option
%% on an IPv4 TCP (stream) socket.
-api_to_accept_tcp4(suite) ->
- [];
-api_to_accept_tcp4(doc) ->
- [];
api_to_accept_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_accept_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet, timeout => 5000},
ok = api_to_accept_tcp(InitState)
@@ -24528,13 +24046,9 @@ api_to_accept_tcp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the accept timeout option
%% on an IPv6 TCP (stream) socket.
-api_to_accept_tcp6(suite) ->
- [];
-api_to_accept_tcp6(doc) ->
- [];
api_to_accept_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
- tc_try(api_to_accept_tcp4,
+ tc_try(api_to_accept_tcp6,
fun() -> has_support_ipv6() end,
fun() ->
InitState = #{domain => inet6, timeout => 5000},
@@ -24625,13 +24139,10 @@ api_to_accept_tcp(InitState) ->
%% This test case is intended to test the multi accept timeout option
%% on an IPv4 TCP (stream) socket with multiple acceptor processes
%% (three in this case).
-api_to_maccept_tcp4(suite) ->
- [];
-api_to_maccept_tcp4(doc) ->
- [];
api_to_maccept_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(20)),
tc_try(api_to_maccept_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet, timeout => 5000},
ok = api_to_maccept_tcp(InitState)
@@ -24642,13 +24153,9 @@ api_to_maccept_tcp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the accept timeout option
%% on an IPv6 TCP (stream) socket.
-api_to_maccept_tcp6(suite) ->
- [];
-api_to_maccept_tcp6(doc) ->
- [];
api_to_maccept_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(20)),
- tc_try(api_to_maccept_tcp4,
+ tc_try(api_to_maccept_tcp6,
fun() -> has_support_ipv6() end,
fun() ->
InitState = #{domain => inet6, timeout => 5000},
@@ -24995,12 +24502,9 @@ api_to_maccept_tcp(InitState) ->
%% This test case is intended to test the send timeout option
%% on an IPv4 TCP (stream) socket.
-api_to_send_tcp4(suite) ->
- [];
-api_to_send_tcp4(doc) ->
- [];
api_to_send_tcp4(_Config) when is_list(_Config) ->
tc_try(api_to_send_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
not_yet_implemented()%% ,
%% ok = api_to_send_tcp(inet)
@@ -25011,10 +24515,6 @@ api_to_send_tcp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the send timeout option
%% on an IPv6 TCP (stream) socket.
-api_to_send_tcp6(suite) ->
- [];
-api_to_send_tcp6(doc) ->
- [];
api_to_send_tcp6(_Config) when is_list(_Config) ->
tc_try(api_to_send_tcp6,
fun() -> has_support_ipv6() end,
@@ -25028,12 +24528,9 @@ api_to_send_tcp6(_Config) when is_list(_Config) ->
%% This test case is intended to test the sendto timeout option
%% on an IPv4 UDP (dgram) socket.
-api_to_sendto_udp4(suite) ->
- [];
-api_to_sendto_udp4(doc) ->
- [];
api_to_sendto_udp4(_Config) when is_list(_Config) ->
tc_try(api_to_sendto_udp4,
+ fun () -> has_support_ipv4() end,
fun() ->
not_yet_implemented()%% ,
%% ok = api_to_sendto_to_udp(inet)
@@ -25044,10 +24541,6 @@ api_to_sendto_udp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the sendto timeout option
%% on an IPv6 UDP (dgram) socket.
-api_to_sendto_udp6(suite) ->
- [];
-api_to_sendto_udp6(doc) ->
- [];
api_to_sendto_udp6(_Config) when is_list(_Config) ->
tc_try(api_to_sendto_udp6,
fun() -> has_support_ipv6() end,
@@ -25061,12 +24554,9 @@ api_to_sendto_udp6(_Config) when is_list(_Config) ->
%% This test case is intended to test the sendmsg timeout option
%% on an IPv4 TCP (stream) socket.
-api_to_sendmsg_tcp4(suite) ->
- [];
-api_to_sendmsg_tcp4(doc) ->
- [];
api_to_sendmsg_tcp4(_Config) when is_list(_Config) ->
tc_try(api_to_sendmsg_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
not_yet_implemented()%% ,
%% ok = api_to_sendmsg_tcp(inet)
@@ -25077,10 +24567,6 @@ api_to_sendmsg_tcp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the sendmsg timeout option
%% on an IPv6 TCP (stream) socket.
-api_to_sendmsg_tcp6(suite) ->
- [];
-api_to_sendmsg_tcp6(doc) ->
- [];
api_to_sendmsg_tcp6(_Config) when is_list(_Config) ->
tc_try(api_to_sendmsg_tcp6,
fun() -> has_support_ipv6() end,
@@ -25095,12 +24581,9 @@ api_to_sendmsg_tcp6(_Config) when is_list(_Config) ->
%% This test case is intended to test the recv timeout option
%% on an IPv4 UDP (dgram) socket. To test this we must connect
%% the socket.
-api_to_recv_udp4(suite) ->
- [];
-api_to_recv_udp4(doc) ->
- [];
api_to_recv_udp4(_Config) when is_list(_Config) ->
tc_try(api_to_recv_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
not_yet_implemented()%%,
%%ok = api_to_recv_udp(inet)
@@ -25112,10 +24595,6 @@ api_to_recv_udp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the recv timeout option
%% on an IPv6 UDP (dgram) socket. To test this we must connect
%% the socket.
-api_to_recv_udp6(suite) ->
- [];
-api_to_recv_udp6(doc) ->
- [];
api_to_recv_udp6(_Config) when is_list(_Config) ->
tc_try(api_to_recv_udp6,
fun() -> has_support_ipv6() end,
@@ -25129,13 +24608,10 @@ api_to_recv_udp6(_Config) when is_list(_Config) ->
%% This test case is intended to test the recv timeout option
%% on an IPv4 TCP (stream) socket.
-api_to_recv_tcp4(suite) ->
- [];
-api_to_recv_tcp4(doc) ->
- [];
api_to_recv_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recv_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock, To) -> socket:recv(Sock, 0, To) end,
InitState = #{domain => inet,
@@ -25149,10 +24625,6 @@ api_to_recv_tcp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the recv timeout option
%% on an IPv6 TCP (stream) socket.
-api_to_recv_tcp6(suite) ->
- [];
-api_to_recv_tcp6(doc) ->
- [];
api_to_recv_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recv_tcp6,
@@ -25486,13 +24958,10 @@ api_to_receive_tcp(InitState) ->
%% This test case is intended to test the recvfrom timeout option
%% on an IPv4 UDP (dgram) socket.
-api_to_recvfrom_udp4(suite) ->
- [];
-api_to_recvfrom_udp4(doc) ->
- [];
api_to_recvfrom_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recvfrom_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock, To) -> socket:recvfrom(Sock, 0, To) end,
InitState = #{domain => inet,
@@ -25506,10 +24975,6 @@ api_to_recvfrom_udp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the recvfrom timeout option
%% on an IPv6 UDP (dgram) socket.
-api_to_recvfrom_udp6(suite) ->
- [];
-api_to_recvfrom_udp6(doc) ->
- [];
api_to_recvfrom_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recvfrom_udp6,
@@ -25602,13 +25067,10 @@ api_to_receive_udp(InitState) ->
%% This test case is intended to test the recvmsg timeout option
%% on an IPv4 UDP (dgram) socket.
-api_to_recvmsg_udp4(suite) ->
- [];
-api_to_recvmsg_udp4(doc) ->
- [];
api_to_recvmsg_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recvmsg_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock, To) -> socket:recvmsg(Sock, To) end,
InitState = #{domain => inet,
@@ -25622,10 +25084,6 @@ api_to_recvmsg_udp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the recvmsg timeout option
%% on an IPv6 UDP (dgram) socket.
-api_to_recvmsg_udp6(suite) ->
- [];
-api_to_recvmsg_udp6(doc) ->
- [];
api_to_recvmsg_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recvmsg_udp6,
@@ -25643,13 +25101,10 @@ api_to_recvmsg_udp6(_Config) when is_list(_Config) ->
%% This test case is intended to test the recvmsg timeout option
%% on an IPv4 TCP (stream) socket.
-api_to_recvmsg_tcp4(suite) ->
- [];
-api_to_recvmsg_tcp4(doc) ->
- [];
api_to_recvmsg_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recvmsg_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock, To) -> socket:recvmsg(Sock, To) end,
InitState = #{domain => inet,
@@ -25663,10 +25118,6 @@ api_to_recvmsg_tcp4(_Config) when is_list(_Config) ->
%% This test case is intended to test the recvmsg timeout option
%% on an IPv6 TCP (stream) socket.
-api_to_recvmsg_tcp6(suite) ->
- [];
-api_to_recvmsg_tcp6(doc) ->
- [];
api_to_recvmsg_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(api_to_recvmsg_tcp6,
@@ -25693,10 +25144,6 @@ api_to_recvmsg_tcp6(_Config) when is_list(_Config) ->
%% We create a bunch of different sockets and ensure that the registry
%% has the correct info.
-reg_s_single_open_and_close_and_count(suite) ->
- [];
-reg_s_single_open_and_close_and_count(doc) ->
- [];
reg_s_single_open_and_close_and_count(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(reg_s_single_open_and_close_and_count,
@@ -26086,10 +25533,6 @@ reg_sr_num2(Existing, F) ->
%% We create a bunch of different sockets and ensure that the registry
%% has the correct info.
-reg_s_optional_open_and_close_and_count(suite) ->
- [];
-reg_s_optional_open_and_close_and_count(doc) ->
- [];
reg_s_optional_open_and_close_and_count(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(reg_s_optional_open_and_close_and_count,
@@ -26198,10 +25641,6 @@ reg_s_optional_open_and_close_and_count() ->
%% Create one socket, monitor from a different process then close socket.
%% The process that did the monitor shall receive a socket DOWN.
-monitor_simple_open_and_close(suite) ->
- [];
-monitor_simple_open_and_close(doc) ->
- [];
monitor_simple_open_and_close(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_simple_open_and_close,
@@ -26458,10 +25897,6 @@ mon_simple_open_and_close(InitState) ->
%% owner process.
%% The process that did the monitor shall receive a socket DOWN.
-monitor_simple_open_and_exit(suite) ->
- [];
-monitor_simple_open_and_exit(doc) ->
- [];
monitor_simple_open_and_exit(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_simple_open_and_exit,
@@ -26653,10 +26088,6 @@ mon_simple_open_and_exit(InitState) ->
%% (demonitor) and then close socket.
%% The process that did the monitor shall *not* receive a socket DOWN.
-monitor_simple_open_and_demon_and_close(suite) ->
- [];
-monitor_simple_open_and_demon_and_close(doc) ->
- [];
monitor_simple_open_and_demon_and_close(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_simple_open_and_demon_and_close,
@@ -26848,10 +26279,6 @@ mon_simple_open_and_demon_and_close(InitState) ->
%% Create several sockets, monitor from a different process then close
%% socket. The process that did the monitor shall receive a socket DOWN.
-monitor_open_and_close_multi_socks(suite) ->
- [];
-monitor_open_and_close_multi_socks(doc) ->
- [];
monitor_open_and_close_multi_socks(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_open_and_close_multi_socks,
@@ -27293,10 +26720,6 @@ mon_open_and_close_multi_socks(InitState) ->
%% the owner process.
%% The process that did the monitor shall receive a socket DOWN.
-monitor_open_and_exit_multi_socks(suite) ->
- [];
-monitor_open_and_exit_multi_socks(doc) ->
- [];
monitor_open_and_exit_multi_socks(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_open_and_exit_multi_socks,
@@ -27614,10 +27037,6 @@ mon_open_and_exit_multi_socks(InitState) ->
%% The process that did the monitor shall receive a socket DOWN for
%% the sockets that are still monitored.
-monitor_open_and_demon_and_close_multi_socks(suite) ->
- [];
-monitor_open_and_demon_and_close_multi_socks(doc) ->
- [];
monitor_open_and_demon_and_close_multi_socks(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_open_and_demon_and_close_multi_socks,
@@ -27987,10 +27406,6 @@ mon_open_and_demon_and_close_multi_socks(InitState) ->
%% processes, then close socket (from 'owner').
%% The processes that did the monitor shall receive a socket DOWN.
-monitor_open_and_close_multi_mon(suite) ->
- [];
-monitor_open_and_close_multi_mon(doc) ->
- [];
monitor_open_and_close_multi_mon(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_open_and_close_multi_mon,
@@ -28580,10 +27995,6 @@ mon_open_and_close_multi_mon(InitState) ->
%% processes, then close socket (from 'owner').
%% The processes that did the monitor shall receive a socket DOWN.
-monitor_open_and_exit_multi_mon(suite) ->
- [];
-monitor_open_and_exit_multi_mon(doc) ->
- [];
monitor_open_and_exit_multi_mon(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_open_and_exit_multi_mon,
@@ -29138,10 +28549,6 @@ mon_open_and_exit_multi_mon(InitState) ->
%% The processes that did the monitor shall receive one socket DOWN for
%% each socket.
-monitor_open_and_close_multi_socks_and_mon(suite) ->
- [];
-monitor_open_and_close_multi_socks_and_mon(doc) ->
- [];
monitor_open_and_close_multi_socks_and_mon(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(monitor_open_and_close_multi_socks_and_mon,
@@ -30096,10 +29503,6 @@ mon_open_and_close_multi_socks_and_mon(InitState) ->
%% The processes that did the monitor shall receive one socket DOWN for
%% each socket.
-monitor_open_and_exit_multi_socks_and_mon(suite) ->
- [];
-monitor_open_and_exit_multi_socks_and_mon(doc) ->
- [];
monitor_open_and_exit_multi_socks_and_mon(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(monitor_open_and_exit_multi_socks_and_mon,
@@ -30847,10 +30250,6 @@ mon_open_and_exit_multi_socks_and_mon(InitState) ->
%% The processes that did the monitor shall receive one socket DOWN for
%% each socket.
-monitor_closed_socket(suite) ->
- [];
-monitor_closed_socket(doc) ->
- [];
monitor_closed_socket(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(monitor_closed_socket,
@@ -31146,10 +30545,6 @@ mon_closed_socket(InitState) ->
%% ("removed") when the controlling process terminates (without explicitly
%% calling the close function). For a IPv4 TCP (stream) socket.
-sc_cpe_socket_cleanup_tcp4(suite) ->
- [];
-sc_cpe_socket_cleanup_tcp4(doc) ->
- [];
sc_cpe_socket_cleanup_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_cpe_socket_cleanup_tcp4,
@@ -31166,10 +30561,6 @@ sc_cpe_socket_cleanup_tcp4(_Config) when is_list(_Config) ->
%% ("removed") when the controlling process terminates (without explicitly
%% calling the close function). For a IPv6 TCP (stream) socket.
-sc_cpe_socket_cleanup_tcp6(suite) ->
- [];
-sc_cpe_socket_cleanup_tcp6(doc) ->
- [];
sc_cpe_socket_cleanup_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_cpe_socket_cleanup_tcp6,
@@ -31187,10 +30578,6 @@ sc_cpe_socket_cleanup_tcp6(_Config) when is_list(_Config) ->
%% ("removed") when the controlling process terminates (without explicitly
%% calling the close function). For a Unix Domain (stream) socket (TCP).
-sc_cpe_socket_cleanup_tcpL(suite) ->
- [];
-sc_cpe_socket_cleanup_tcpL(doc) ->
- [];
sc_cpe_socket_cleanup_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_cpe_socket_cleanup_tcpL,
@@ -31208,13 +30595,10 @@ sc_cpe_socket_cleanup_tcpL(_Config) when is_list(_Config) ->
%% ("removed") when the controlling process terminates (without explicitly
%% calling the close function). For a IPv4 UDP (dgram) socket.
-sc_cpe_socket_cleanup_udp4(suite) ->
- [];
-sc_cpe_socket_cleanup_udp4(doc) ->
- [];
sc_cpe_socket_cleanup_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_cpe_socket_cleanup_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
type => dgram,
@@ -31229,10 +30613,6 @@ sc_cpe_socket_cleanup_udp4(_Config) when is_list(_Config) ->
%% (removed) when the controlling process terminates (without explicitly
%% calling the close function). For a IPv6 UDP (dgram) socket.
-sc_cpe_socket_cleanup_udp6(suite) ->
- [];
-sc_cpe_socket_cleanup_udp6(doc) ->
- [];
sc_cpe_socket_cleanup_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_cpe_socket_cleanup_udp6,
@@ -31250,10 +30630,6 @@ sc_cpe_socket_cleanup_udp6(_Config) when is_list(_Config) ->
%% ("removed") when the controlling process terminates (without explicitly
%% calling the close function). For a Unix Domain (dgram) socket (UDP).
-sc_cpe_socket_cleanup_udpL(suite) ->
- [];
-sc_cpe_socket_cleanup_udpL(doc) ->
- [];
sc_cpe_socket_cleanup_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_cpe_socket_cleanup_udpL,
@@ -31303,7 +30679,7 @@ sc_cpe_socket_cleanup(InitState) ->
end},
%% *** The actual test ***
- %% We *intentially* leave the socket "as is", no explicit close
+ %% We *intentionally* leave the socket "as is", no explicit close
#{desc => "await terminate (from tester)",
cmd => fun(#{tester := Tester} = State) ->
case ?SEV_AWAIT_TERMINATE(Tester, tester) of
@@ -31412,13 +30788,10 @@ sc_cpe_socket_cleanup(InitState) ->
%%
%% </KOLLA>
-sc_lc_recv_response_tcp4(suite) ->
- [];
-sc_lc_recv_response_tcp4(doc) ->
- [];
sc_lc_recv_response_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_lc_recv_response_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) -> socket:recv(Sock) end,
InitState = #{domain => inet,
@@ -31433,10 +30806,6 @@ sc_lc_recv_response_tcp4(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recv function.
%% Socket is IPv6.
-sc_lc_recv_response_tcp6(suite) ->
- [];
-sc_lc_recv_response_tcp6(doc) ->
- [];
sc_lc_recv_response_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_lc_recv_response_tcp6,
@@ -31455,10 +30824,6 @@ sc_lc_recv_response_tcp6(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recv function.
%% Socket is Unix Domain (stream) socket.
-sc_lc_recv_response_tcpL(suite) ->
- [];
-sc_lc_recv_response_tcpL(doc) ->
- [];
sc_lc_recv_response_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_lc_recv_response_tcpL,
@@ -31647,7 +31012,7 @@ sc_lc_receive_response_tcp(InitState) ->
],
%% The point of this is to perform the recv for which
- %% we are testing the reponse.
+ %% we are testing the response.
HandlerSeq =
[
%% *** Wait for start order part ***
@@ -32099,13 +31464,10 @@ sc_lc_receive_response_tcp(InitState) ->
%% Socket is IPv4.
%%
-sc_lc_recvfrom_response_udp4(suite) ->
- [];
-sc_lc_recvfrom_response_udp4(doc) ->
- [];
sc_lc_recvfrom_response_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_lc_recvfrom_response_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock, To) -> socket:recvfrom(Sock, [], To) end,
InitState = #{domain => inet,
@@ -32120,10 +31482,6 @@ sc_lc_recvfrom_response_udp4(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recv function.
%% Socket is IPv6.
-sc_lc_recvfrom_response_udp6(suite) ->
- [];
-sc_lc_recvfrom_response_udp6(doc) ->
- [];
sc_lc_recvfrom_response_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_lc_recvfrom_response_udp6,
@@ -32142,10 +31500,6 @@ sc_lc_recvfrom_response_udp6(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recv function.
%% Socket is Unix Domainm (dgram) socket.
-sc_lc_recvfrom_response_udpL(suite) ->
- [];
-sc_lc_recvfrom_response_udpL(doc) ->
- [];
sc_lc_recvfrom_response_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_lc_recvfrom_response_udpL,
@@ -32419,7 +31773,7 @@ sc_lc_receive_response_udp(InitState) ->
%% The actual test
- %% Make all the seondary servers continue, with an infinit recvfrom
+ %% Make all the seondary servers continue, with an infinite recvfrom
%% and then the prim-server with a timed recvfrom.
%% After the prim server notifies us (about the timeout) we order it
%% to close the socket, which should cause the all the secondary
@@ -32571,13 +31925,10 @@ sc_lc_receive_response_udp(InitState) ->
%% locally closed while the process is calling the recvmsg function.
%% Socket is IPv4.
-sc_lc_recvmsg_response_tcp4(suite) ->
- [];
-sc_lc_recvmsg_response_tcp4(doc) ->
- [];
sc_lc_recvmsg_response_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_lc_recvmsg_response_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) -> socket:recvmsg(Sock) end,
InitState = #{domain => inet,
@@ -32592,10 +31943,6 @@ sc_lc_recvmsg_response_tcp4(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recvmsg function.
%% Socket is IPv6.
-sc_lc_recvmsg_response_tcp6(suite) ->
- [];
-sc_lc_recvmsg_response_tcp6(doc) ->
- [];
sc_lc_recvmsg_response_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_recvmsg_response_tcp6,
@@ -32614,10 +31961,6 @@ sc_lc_recvmsg_response_tcp6(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recvmsg function.
%% Socket is Unix Domain (stream) socket.
-sc_lc_recvmsg_response_tcpL(suite) ->
- [];
-sc_lc_recvmsg_response_tcpL(doc) ->
- [];
sc_lc_recvmsg_response_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_recvmsg_response_tcpL,
@@ -32636,12 +31979,9 @@ sc_lc_recvmsg_response_tcpL(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recvmsg function.
%% Socket is IPv4.
-sc_lc_recvmsg_response_udp4(suite) ->
- [];
-sc_lc_recvmsg_response_udp4(doc) ->
- [];
sc_lc_recvmsg_response_udp4(_Config) when is_list(_Config) ->
tc_try(sc_lc_recvmsg_response_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(10)),
Recv = fun(Sock, To) -> socket:recvmsg(Sock, To) end,
@@ -32657,10 +31997,6 @@ sc_lc_recvmsg_response_udp4(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recvmsg function.
%% Socket is IPv6.
-sc_lc_recvmsg_response_udp6(suite) ->
- [];
-sc_lc_recvmsg_response_udp6(doc) ->
- [];
sc_lc_recvmsg_response_udp6(_Config) when is_list(_Config) ->
tc_try(sc_recvmsg_response_udp6,
fun() -> has_support_ipv6() end,
@@ -32680,10 +32016,6 @@ sc_lc_recvmsg_response_udp6(_Config) when is_list(_Config) ->
%% locally closed while the process is calling the recvmsg function.
%% Socket is Unix Domain (dgram) socket.
-sc_lc_recvmsg_response_udpL(suite) ->
- [];
-sc_lc_recvmsg_response_udpL(doc) ->
- [];
sc_lc_recvmsg_response_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_recvmsg_response_udpL,
@@ -32705,13 +32037,10 @@ sc_lc_recvmsg_response_udpL(_Config) when is_list(_Config) ->
%% git the setup anyway.
%% Socket is IPv4.
-sc_lc_acceptor_response_tcp4(suite) ->
- [];
-sc_lc_acceptor_response_tcp4(doc) ->
- [];
sc_lc_acceptor_response_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_lc_acceptor_response_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
protocol => tcp},
@@ -32726,10 +32055,6 @@ sc_lc_acceptor_response_tcp4(_Config) when is_list(_Config) ->
%% git the setup anyway.
%% Socket is IPv6.
-sc_lc_acceptor_response_tcp6(suite) ->
- [];
-sc_lc_acceptor_response_tcp6(doc) ->
- [];
sc_lc_acceptor_response_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_lc_acceptor_response_tcp6,
@@ -32748,10 +32073,6 @@ sc_lc_acceptor_response_tcp6(_Config) when is_list(_Config) ->
%% git the setup anyway.
%% Socket is Unix Domain (stream) socket.
-sc_lc_acceptor_response_tcpL(suite) ->
- [];
-sc_lc_acceptor_response_tcpL(doc) ->
- [];
sc_lc_acceptor_response_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_lc_acceptor_response_tcpL,
@@ -33020,7 +32341,7 @@ sc_lc_acceptor_response_tcp(InitState) ->
%% The actual test
- %% Make all the seondary servers continue, with an infinit recvfrom
+ %% Make all the seondary servers continue, with an infinite recvfrom
%% and then the prim-server with a timed recvfrom.
%% After the prim server notifies us (about the timeout) we order it
%% to close the socket, which should cause the all the secondary
@@ -33176,13 +32497,10 @@ sc_lc_acceptor_response_tcp(InitState) ->
%% now, we will make do with different VMs on the same host.
%%
-sc_rc_recv_response_tcp4(suite) ->
- [];
-sc_rc_recv_response_tcp4(doc) ->
- [];
sc_rc_recv_response_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_rc_recv_response_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) -> socket:recv(Sock) end,
InitState = #{domain => inet,
@@ -33197,10 +32515,6 @@ sc_rc_recv_response_tcp4(_Config) when is_list(_Config) ->
%% remotely closed while the process is calling the recv function.
%% Socket is IPv6.
-sc_rc_recv_response_tcp6(suite) ->
- [];
-sc_rc_recv_response_tcp6(doc) ->
- [];
sc_rc_recv_response_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_rc_recv_response_tcp6,
@@ -33219,10 +32533,6 @@ sc_rc_recv_response_tcp6(_Config) when is_list(_Config) ->
%% remotely closed while the process is calling the recv function.
%% Socket is Unix Domain (stream) socket.
-sc_rc_recv_response_tcpL(suite) ->
- [];
-sc_rc_recv_response_tcpL(doc) ->
- [];
sc_rc_recv_response_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_rc_recv_response_tcpL,
@@ -33535,13 +32845,12 @@ sc_rc_receive_response_tcp(InitState) ->
%% *** Init part ***
#{desc => "create node",
- cmd => fun(#{host := Host, node_id := NodeID} = State) ->
- case start_node(Host,
- l2a(f("client_~w", [NodeID]))) of
- {ok, Node} ->
+ cmd => fun(#{node_id := NodeID} = State) ->
+ case ?CT_PEER(#{name => ?CT_PEER_NAME(f("client_~w", [NodeID]))}) of
+ {ok, Peer, Node} ->
?SEV_IPRINT("client node ~p started",
[Node]),
- {ok, State#{node => Node}};
+ {ok, State#{node => Node, peer => Peer}};
{error, Reason} ->
?SEV_EPRINT("failed starting "
"client node ~p (=> SKIP):"
@@ -33665,9 +32974,9 @@ sc_rc_receive_response_tcp(InitState) ->
{ok, State1}
end},
#{desc => "stop client node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
State#{node_stop => ok};
{error, Reason} ->
@@ -33690,14 +32999,14 @@ sc_rc_receive_response_tcp(InitState) ->
receive
{nodedown, Node} ->
?SEV_IPRINT("nodedown received - cleanup"),
- State1 = maps:remove(node_id, State),
- State2 = maps:remove(node, State1),
+ State1 = maps:remove(peer, State),
+ State2 = maps:remove(node, State1),
{ok, State2}
end;
(#{node_stop := error} = State) ->
?SEV_IPRINT("Failed node stop - cleanup"),
- State1 = maps:remove(node_id, State),
- State2 = maps:remove(node, State1),
+ State1 = maps:remove(peer, State),
+ State2 = maps:remove(node, State1),
{ok, State2}
end},
@@ -33989,7 +33298,7 @@ sc_rc_receive_response_tcp(InitState) ->
Tester = ?SEV_START("tester", TesterSeq, TesterInitState),
i("await evaluator"),
- ?line ok = ?SEV_AWAIT_FINISH([Server,
+ ok = ?SEV_AWAIT_FINISH([Server,
Client1, Client2, Client3,
Tester]).
@@ -34161,13 +33470,10 @@ sc_rc_tcp_handler_announce_ready(Parent, Slogan, Result) ->
%% remotely closed while the process is calling the recvmsg function.
%% Socket is IPv4.
-sc_rc_recvmsg_response_tcp4(suite) ->
- [];
-sc_rc_recvmsg_response_tcp4(doc) ->
- [];
sc_rc_recvmsg_response_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_rc_recvmsg_response_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
Recv = fun(Sock) -> socket:recvmsg(Sock) end,
InitState = #{domain => inet,
@@ -34182,10 +33488,6 @@ sc_rc_recvmsg_response_tcp4(_Config) when is_list(_Config) ->
%% remotely closed while the process is calling the recvmsg function.
%% Socket is IPv6.
-sc_rc_recvmsg_response_tcp6(suite) ->
- [];
-sc_rc_recvmsg_response_tcp6(doc) ->
- [];
sc_rc_recvmsg_response_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_rc_recvmsg_response_tcp6,
@@ -34204,10 +33506,6 @@ sc_rc_recvmsg_response_tcp6(_Config) when is_list(_Config) ->
%% remotely closed while the process is calling the recvmsg function.
%% Socket is Unix Domain (stream) socket.
-sc_rc_recvmsg_response_tcpL(suite) ->
- [];
-sc_rc_recvmsg_response_tcpL(doc) ->
- [];
sc_rc_recvmsg_response_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_rc_recvmsg_response_tcpL,
@@ -34234,13 +33532,10 @@ sc_rc_recvmsg_response_tcpL(_Config) when is_list(_Config) ->
%% This would of course not work for Unix Domain sockets.
%%
-sc_rs_recv_send_shutdown_receive_tcp4(suite) ->
- [];
-sc_rs_recv_send_shutdown_receive_tcp4(doc) ->
- [];
sc_rs_recv_send_shutdown_receive_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(sc_rs_recv_send_shutdown_receive_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
MsgData = ?DATA,
Recv = fun(Sock) ->
@@ -34265,10 +33560,6 @@ sc_rs_recv_send_shutdown_receive_tcp4(_Config) when is_list(_Config) ->
%% reader attempts a recv.
%% Socket is IPv6.
-sc_rs_recv_send_shutdown_receive_tcp6(suite) ->
- [];
-sc_rs_recv_send_shutdown_receive_tcp6(doc) ->
- [];
sc_rs_recv_send_shutdown_receive_tcp6(_Config) when is_list(_Config) ->
tc_try(sc_rs_recv_send_shutdown_receive_tcp6,
fun() -> has_support_ipv6() end,
@@ -34297,10 +33588,6 @@ sc_rs_recv_send_shutdown_receive_tcp6(_Config) when is_list(_Config) ->
%% reader attempts a recv.
%% Socket is Unix Domain (stream) socket.
-sc_rs_recv_send_shutdown_receive_tcpL(suite) ->
- [];
-sc_rs_recv_send_shutdown_receive_tcpL(doc) ->
- [];
sc_rs_recv_send_shutdown_receive_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_rs_recv_send_shutdown_receive_tcpL,
@@ -34539,12 +33826,12 @@ sc_rs_send_shutdown_receive_tcp(InitState) ->
%% *** Init part ***
#{desc => "create node",
- cmd => fun(#{host := Host} = State) ->
- case start_node(Host, client) of
- {ok, Node} ->
+ cmd => fun(State) ->
+ case ?CT_PEER() of
+ {ok, Peer, Node} ->
?SEV_IPRINT("client node ~p started",
[Node]),
- {ok, State#{node => Node}};
+ {ok, State#{peer => Peer, node => Node}};
{error, Reason} ->
{skip, Reason}
end
@@ -34712,9 +33999,9 @@ sc_rs_send_shutdown_receive_tcp(InitState) ->
{ok, State1}
end},
#{desc => "stop client node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
State#{node_stop => ok};
{error, Reason} ->
@@ -34736,14 +34023,14 @@ sc_rs_send_shutdown_receive_tcp(InitState) ->
receive
{nodedown, Node} ->
?SEV_IPRINT("nodedown received - cleanup"),
- State1 = maps:remove(node_id, State),
- State2 = maps:remove(node, State1),
+ State1 = maps:remove(peer, State),
+ State2 = maps:remove(node, State1),
{ok, State2}
end;
(#{node_stop := error} = State) ->
?SEV_IPRINT("Failed node stop - cleanup"),
- State1 = maps:remove(node_id, State),
- State2 = maps:remove(node, State1),
+ State1 = maps:remove(peer, State),
+ State2 = maps:remove(node, State1),
{ok, State2}
end},
@@ -35106,7 +34393,7 @@ sc_rs_tcp_handler_await(Parent, Slogan) ->
?SEV_IPRINT("await ~w", [Slogan]),
?SEV_AWAIT_CONTINUE(Parent, parent, Slogan).
-%% This hould actually work - we leave it for now
+%% This should actually work - we leave it for now
sc_rs_tcp_handler_recv(Recv, Sock, First) ->
?SEV_IPRINT("recv"),
try Recv(Sock) of
@@ -35143,12 +34430,9 @@ sc_rs_tcp_handler_announce_ready(Parent, Slogan, Result) ->
%% reader attempts a recv.
%% Socket is IPv4.
-sc_rs_recvmsg_send_shutdown_receive_tcp4(suite) ->
- [];
-sc_rs_recvmsg_send_shutdown_receive_tcp4(doc) ->
- [];
sc_rs_recvmsg_send_shutdown_receive_tcp4(_Config) when is_list(_Config) ->
tc_try(sc_rs_recvmsg_send_shutdown_receive_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(30)),
MsgData = ?DATA,
@@ -35182,10 +34466,6 @@ sc_rs_recvmsg_send_shutdown_receive_tcp4(_Config) when is_list(_Config) ->
%% reader attempts a recv.
%% Socket is IPv6.
-sc_rs_recvmsg_send_shutdown_receive_tcp6(suite) ->
- [];
-sc_rs_recvmsg_send_shutdown_receive_tcp6(doc) ->
- [];
sc_rs_recvmsg_send_shutdown_receive_tcp6(_Config) when is_list(_Config) ->
tc_try(sc_rs_recvmsg_send_shutdown_receive_tcp6,
fun() -> has_support_ipv6() end,
@@ -35222,10 +34502,6 @@ sc_rs_recvmsg_send_shutdown_receive_tcp6(_Config) when is_list(_Config) ->
%% reader attempts a recv.
%% Socket is UNix Domain (stream) socket.
-sc_rs_recvmsg_send_shutdown_receive_tcpL(suite) ->
- [];
-sc_rs_recvmsg_send_shutdown_receive_tcpL(doc) ->
- [];
sc_rs_recvmsg_send_shutdown_receive_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(sc_rs_recvmsg_send_shutdown_receive_tcpL,
@@ -35271,10 +34547,6 @@ sc_rs_recvmsg_send_shutdown_receive_tcpL(_Config) when is_list(_Config) ->
%% This test case is intended to (simply) test "some" ioctl features.
%%
-ioctl_simple1(suite) ->
- [];
-ioctl_simple1(doc) ->
- [];
ioctl_simple1(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35357,10 +34629,6 @@ do_ioctl_simple(_State) ->
%% request(s).
%%
-ioctl_get_gifname(suite) ->
- [];
-ioctl_get_gifname(doc) ->
- [];
ioctl_get_gifname(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35410,10 +34678,6 @@ do_ioctl_get_gifname(_State) ->
%% --- gifindex ---
-ioctl_get_gifindex(suite) ->
- [];
-ioctl_get_gifindex(doc) ->
- [];
ioctl_get_gifindex(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35465,10 +34729,6 @@ do_ioctl_get_gifindex(_State) ->
%% --- gifaddr ---
-ioctl_get_gifaddr(suite) ->
- [];
-ioctl_get_gifaddr(doc) ->
- [];
ioctl_get_gifaddr(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35532,10 +34792,6 @@ do_ioctl_get_gifaddr(_State) ->
%% --- gifdstaddr ---
-ioctl_get_gifdstaddr(suite) ->
- [];
-ioctl_get_gifdstaddr(doc) ->
- [];
ioctl_get_gifdstaddr(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35550,17 +34806,17 @@ ioctl_get_gifdstaddr(_Config) when is_list(_Config) ->
do_ioctl_get_gifdstaddr(_State) ->
- Domain = inet,
+ Domain = inet_or_inet6(),
LSA = which_local_socket_addr(Domain),
i("create and init listen stream:TCP socket"),
- {ok, LSock} = socket:open(inet, stream, tcp),
+ {ok, LSock} = socket:open(Domain, stream, tcp),
ok = socket:bind(LSock, LSA#{port => 0}),
ok = socket:listen(LSock),
{ok, #{port := LPort}} = socket:sockname(LSock),
i("create and init connection stream:TCP socket"),
- {ok, CSock} = socket:open(inet, stream, tcp),
+ {ok, CSock} = socket:open(Domain, stream, tcp),
i("attempt connect (nowait)"),
{ok, ASock} =
@@ -35625,16 +34881,13 @@ verify_gifdstaddr(Sock, Prefix, IfIdx, IfName) ->
"~n ~p", [Prefix, IfName, IfIdx, Crap]),
socket:close(Sock),
?FAIL({unexpected_addr, Prefix, IfName, IfIdx, Crap});
- {error, eaddrnotavail = Reason} ->
+ {error, IgnoredReason} when IgnoredReason =:= eaddrnotavail;
+ IgnoredReason =:= eperm;
+ IgnoredReason =:= enotty ->
i("[~s] got unexpected error for interface ~p (~w) => "
"SKIP interface"
- "~n Reason: ~p", [Prefix, IfName, IfIdx, Reason]),
+ "~n Reason: ~p", [Prefix, IfName, IfIdx, IgnoredReason]),
ignore;
- {error, eperm = Reason} ->
- i("[~s] got unexpected error for interface ~p (~w) => "
- "SKIP interface"
- "~n Reason: ~p", [Prefix, IfName, IfIdx, Reason]),
- ignore;
{error, einval = Reason} when (OsFam =:= unix) andalso
((OsName =:= darwin) orelse
(OsName =:= freebsd) orelse
@@ -35656,10 +34909,6 @@ verify_gifdstaddr(Sock, Prefix, IfIdx, IfName) ->
%% --- gifbrdaddr ---
-ioctl_get_gifbrdaddr(suite) ->
- [];
-ioctl_get_gifbrdaddr(doc) ->
- [];
ioctl_get_gifbrdaddr(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35674,17 +34923,17 @@ ioctl_get_gifbrdaddr(_Config) when is_list(_Config) ->
do_ioctl_get_gifbrdaddr(_State) ->
- Domain = inet,
+ Domain = inet_or_inet6(),
LSA = which_local_socket_addr(Domain),
i("create and init listen stream:TCP socket"),
- {ok, LSock} = socket:open(inet, stream, tcp),
+ {ok, LSock} = socket:open(Domain, stream, tcp),
ok = socket:bind(LSock, LSA#{port => 0}),
ok = socket:listen(LSock),
{ok, #{port := LPort}} = socket:sockname(LSock),
i("create and init connection stream:TCP socket"),
- {ok, CSock} = socket:open(inet, stream, tcp),
+ {ok, CSock} = socket:open(Domain, stream, tcp),
i("attempt connect (nowait)"),
{ok, ASock} =
@@ -35748,16 +34997,13 @@ verify_gifbrdaddr(Sock, Prefix, IfIdx, IfName) ->
"~n ~p", [Prefix, IfName, IfIdx, Crap]),
socket:close(Sock),
?FAIL({unexpected_addr, IfName, IfIdx, Crap});
- {error, eaddrnotavail = Reason} ->
+ {error, IgnoredReason} when IgnoredReason =:= eaddrnotavail;
+ IgnoredReason =:= eperm;
+ IgnoredReason =:= enotty ->
i("[~s] got unexpected error for interface ~p (~w) => "
- "SKIP interface"
- "~n Reason: ~p", [Prefix, IfName, IfIdx, Reason]),
+ "SKIP interface"
+ "~n Reason: ~p", [Prefix, IfName, IfIdx, IgnoredReason]),
ignore;
- {error, eperm = Reason} ->
- i("[~s] got unexpected error for interface ~p (~w) => "
- "SKIP interface"
- "~n Reason: ~p", [Prefix, IfName, IfIdx, Reason]),
- ignore;
{error, einval = Reason} when (OsFam =:= unix) andalso
((OsName =:= darwin) orelse
(OsName =:= freebsd) orelse
@@ -35778,10 +35024,6 @@ verify_gifbrdaddr(Sock, Prefix, IfIdx, IfName) ->
%% --- gifnetmask ---
-ioctl_get_gifnetmask(suite) ->
- [];
-ioctl_get_gifnetmask(doc) ->
- [];
ioctl_get_gifnetmask(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35844,10 +35086,6 @@ do_ioctl_get_gifnetmask(_State) ->
%% --- gifmtu ---
-ioctl_get_gifmtu(suite) ->
- [];
-ioctl_get_gifmtu(doc) ->
- [];
ioctl_get_gifmtu(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35900,10 +35138,6 @@ do_ioctl_get_gifmtu(_State) ->
%% --- gifhwaddr ---
-ioctl_get_gifhwaddr(suite) ->
- [];
-ioctl_get_gifhwaddr(doc) ->
- [];
ioctl_get_gifhwaddr(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -35929,22 +35163,8 @@ do_ioctl_get_gifhwaddr(_State) ->
%% This a *very* simple test...
%% ...just to check that we actually get an socket address
_ = [case socket:ioctl(Sock, gifhwaddr, IfName) of
- {ok, #{family := ArphdrFam,
- addr := Addr}} when is_atom(ArphdrFam) ->
- case erlang:atom_to_list(ArphdrFam) of
- "arphrd_" ++ _ ->
- i("got (expected) (HW) socket address for "
- "interface ~p (~w): "
- "~n (~w) ~p", [IfName, IfIdx, ArphdrFam, Addr]),
- ok;
- _ ->
- i("<ERROR> got unexpected family for interface ~p (~w)"
- "~n ~p", [IfName, IfIdx, ArphdrFam]),
- socket:close(Sock),
- ?FAIL({unexpected_family, IfName, IfIdx, ArphdrFam})
- end;
{ok, #{family := Fam,
- addr := Addr}} when is_integer(Fam) ->
+ addr := Addr}} when is_atom(Fam) orelse is_integer(Fam) ->
i("got (expected) socket address for interface ~p (~w): "
"~n (~w) ~p", [IfName, IfIdx, Fam, Addr]),
ok;
@@ -35971,10 +35191,6 @@ do_ioctl_get_gifhwaddr(_State) ->
%% --- giftxqlen ---
-ioctl_get_giftxqlen(suite) ->
- [];
-ioctl_get_giftxqlen(doc) ->
- [];
ioctl_get_giftxqlen(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -36027,10 +35243,6 @@ do_ioctl_get_giftxqlen(_State) ->
%% --- gifflags ---
-ioctl_get_gifflags(suite) ->
- [];
-ioctl_get_gifflags(doc) ->
- [];
ioctl_get_gifflags(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -36099,10 +35311,6 @@ do_ioctl_get_gifflags(_State) ->
%% --- gifmap ---
-ioctl_get_gifmap(suite) ->
- [];
-ioctl_get_gifmap(doc) ->
- [];
ioctl_get_gifmap(_Config) when is_list(_Config) ->
?TT(?SECS(5)),
tc_try(?FUNCTION_NAME,
@@ -36160,13 +35368,10 @@ do_ioctl_get_gifmap(_State) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use TCP on IPv4.
-traffic_send_and_recv_counters_tcp4(suite) ->
- [];
-traffic_send_and_recv_counters_tcp4(doc) ->
- [];
traffic_send_and_recv_counters_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_send_and_recv_counters_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
proto => tcp,
@@ -36182,10 +35387,6 @@ traffic_send_and_recv_counters_tcp4(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use TCP on IPv6.
-traffic_send_and_recv_counters_tcp6(suite) ->
- [];
-traffic_send_and_recv_counters_tcp6(doc) ->
- [];
traffic_send_and_recv_counters_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_send_and_recv_counters_tcp6,
@@ -36205,10 +35406,6 @@ traffic_send_and_recv_counters_tcp6(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use default (TCP) on local.
-traffic_send_and_recv_counters_tcpL(suite) ->
- [];
-traffic_send_and_recv_counters_tcpL(doc) ->
- [];
traffic_send_and_recv_counters_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_send_and_recv_counters_tcpL,
@@ -36228,13 +35425,10 @@ traffic_send_and_recv_counters_tcpL(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use TCP on IPv4.
-traffic_sendmsg_and_recvmsg_counters_tcp4(suite) ->
- [];
-traffic_sendmsg_and_recvmsg_counters_tcp4(doc) ->
- [];
traffic_sendmsg_and_recvmsg_counters_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendmsg_and_recvmsg_counters_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
proto => tcp,
@@ -36260,10 +35454,6 @@ traffic_sendmsg_and_recvmsg_counters_tcp4(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use TCP on IPv6.
-traffic_sendmsg_and_recvmsg_counters_tcp6(suite) ->
- [];
-traffic_sendmsg_and_recvmsg_counters_tcp6(doc) ->
- [];
traffic_sendmsg_and_recvmsg_counters_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendmsg_and_recvmsg_counters_tcp6,
@@ -36293,10 +35483,6 @@ traffic_sendmsg_and_recvmsg_counters_tcp6(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use default (TCP) on local.
-traffic_sendmsg_and_recvmsg_counters_tcpL(suite) ->
- [];
-traffic_sendmsg_and_recvmsg_counters_tcpL(doc) ->
- [];
traffic_sendmsg_and_recvmsg_counters_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendmsg_and_recvmsg_counters_tcpL,
@@ -37365,13 +36551,10 @@ traffic_sar_counters_validation2(Counters, [{Cnt, Val}|ValidateCounters]) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use UDP on IPv4.
-traffic_sendto_and_recvfrom_counters_udp4(suite) ->
- [];
-traffic_sendto_and_recvfrom_counters_udp4(doc) ->
- [];
traffic_sendto_and_recvfrom_counters_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendto_and_recvfrom_counters_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
proto => udp,
@@ -37391,10 +36574,6 @@ traffic_sendto_and_recvfrom_counters_udp4(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use UDP on IPv6.
-traffic_sendto_and_recvfrom_counters_udp6(suite) ->
- [];
-traffic_sendto_and_recvfrom_counters_udp6(doc) ->
- [];
traffic_sendto_and_recvfrom_counters_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendto_and_recvfrom_counters_udp6,
@@ -37418,10 +36597,6 @@ traffic_sendto_and_recvfrom_counters_udp6(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use default (UDP) on local.
-traffic_sendto_and_recvfrom_counters_udpL(suite) ->
- [];
-traffic_sendto_and_recvfrom_counters_udpL(doc) ->
- [];
traffic_sendto_and_recvfrom_counters_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendto_and_recvfrom_counters_udp4,
@@ -37445,13 +36620,10 @@ traffic_sendto_and_recvfrom_counters_udpL(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use UDP on IPv4.
-traffic_sendmsg_and_recvmsg_counters_udp4(suite) ->
- [];
-traffic_sendmsg_and_recvmsg_counters_udp4(doc) ->
- [];
traffic_sendmsg_and_recvmsg_counters_udp4(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendmsg_and_recvmsg_counters_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
proto => udp,
@@ -37479,10 +36651,6 @@ traffic_sendmsg_and_recvmsg_counters_udp4(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use UDP on IPv6.
-traffic_sendmsg_and_recvmsg_counters_udp6(suite) ->
- [];
-traffic_sendmsg_and_recvmsg_counters_udp6(doc) ->
- [];
traffic_sendmsg_and_recvmsg_counters_udp6(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendmsg_and_recvmsg_counters_udp6,
@@ -37514,10 +36682,6 @@ traffic_sendmsg_and_recvmsg_counters_udp6(_Config) when is_list(_Config) ->
%% So that its easy to extend, we use fun's for read and write.
%% We use default (UDP) on local.
-traffic_sendmsg_and_recvmsg_counters_udpL(suite) ->
- [];
-traffic_sendmsg_and_recvmsg_counters_udpL(doc) ->
- [];
traffic_sendmsg_and_recvmsg_counters_udpL(_Config) when is_list(_Config) ->
?TT(?SECS(15)),
tc_try(traffic_sendmsg_and_recvmsg_counters_udpL,
@@ -38377,13 +37541,10 @@ traffic_send_and_recv_udp(InitState) ->
%% Second, send in a bunch of "small" chunks, and read in one "big" chunk.
%% Socket is IPv4.
-traffic_send_and_recv_chunks_tcp4(suite) ->
- [];
-traffic_send_and_recv_chunks_tcp4(doc) ->
- [];
traffic_send_and_recv_chunks_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(traffic_send_and_recv_chunks_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
proto => tcp},
@@ -38399,10 +37560,6 @@ traffic_send_and_recv_chunks_tcp4(_Config) when is_list(_Config) ->
%% Second, send in a bunch of "small" chunks, and read in one "big" chunk.
%% Socket is IPv6.
-traffic_send_and_recv_chunks_tcp6(suite) ->
- [];
-traffic_send_and_recv_chunks_tcp6(doc) ->
- [];
traffic_send_and_recv_chunks_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(traffic_send_and_recv_chunks_tcp6,
@@ -38421,10 +37578,6 @@ traffic_send_and_recv_chunks_tcp6(_Config) when is_list(_Config) ->
%% Second, send in a bunch of "small" chunks, and read in one "big" chunk.
%% Socket is UNix Domain (Stream) socket.
-traffic_send_and_recv_chunks_tcpL(suite) ->
- [];
-traffic_send_and_recv_chunks_tcpL(doc) ->
- [];
traffic_send_and_recv_chunks_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(30)),
tc_try(traffic_send_and_recv_chunks_tcp6,
@@ -38732,12 +37885,12 @@ traffic_send_and_recv_chunks_tcp(InitState) ->
%% *** Init part ***
#{desc => "create node",
- cmd => fun(#{host := Host} = State) ->
- case start_node(Host, client) of
- {ok, Node} ->
+ cmd => fun(State) ->
+ case ?CT_PEER() of
+ {ok, Peer, Node} ->
?SEV_IPRINT("(remote) client node ~p started",
[Node]),
- {ok, State#{node => Node}};
+ {ok, State#{peer => Peer, node => Node}};
{error, Reason} ->
{skip, Reason}
end
@@ -39104,9 +38257,9 @@ traffic_send_and_recv_chunks_tcp(InitState) ->
{ok, State1}
end},
#{desc => "stop client node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
State#{node_stop => ok};
{error, Reason} ->
@@ -39352,7 +38505,7 @@ traffic_snr_tcp_client(Parent) ->
traffic_snr_tcp_client_send_loop(Parent, Sock) ->
case ?SEV_AWAIT_CONTINUE(Parent, parent, send) of
- {ok, stop} -> % Breakes the loop
+ {ok, stop} -> % Breaks the loop
?SEV_ANNOUNCE_READY(Parent, send, ok),
ok;
{ok, Data} ->
@@ -39457,15 +38610,12 @@ traffic_snr_tcp_client_await_terminate(Parent) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv4.
-traffic_ping_pong_small_send_and_recv_tcp4(suite) ->
- [];
-traffic_ping_pong_small_send_and_recv_tcp4(doc) ->
- [];
traffic_ping_pong_small_send_and_recv_tcp4(Config) when is_list(Config) ->
?TT(?SECS(15)),
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
tc_try(traffic_ping_pong_small_send_and_recv_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
proto => tcp,
@@ -39485,10 +38635,6 @@ traffic_ping_pong_small_send_and_recv_tcp4(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv6.
-traffic_ping_pong_small_send_and_recv_tcp6(suite) ->
- [];
-traffic_ping_pong_small_send_and_recv_tcp6(doc) ->
- [];
traffic_ping_pong_small_send_and_recv_tcp6(Config) when is_list(Config) ->
?TT(?SECS(15)),
Msg = l2b(?TPP_SMALL),
@@ -39513,10 +38659,6 @@ traffic_ping_pong_small_send_and_recv_tcp6(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for Unix Domain (stream) socket.
-traffic_ping_pong_small_send_and_recv_tcpL(suite) ->
- [];
-traffic_ping_pong_small_send_and_recv_tcpL(doc) ->
- [];
traffic_ping_pong_small_send_and_recv_tcpL(Config) when is_list(Config) ->
?TT(?SECS(15)),
Msg = l2b(?TPP_SMALL),
@@ -39541,14 +38683,11 @@ traffic_ping_pong_small_send_and_recv_tcpL(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv4.
-traffic_ping_pong_medium_send_and_recv_tcp4(suite) ->
- [];
-traffic_ping_pong_medium_send_and_recv_tcp4(doc) ->
- [];
traffic_ping_pong_medium_send_and_recv_tcp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
tc_try(traffic_ping_pong_medium_send_and_recv_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(30)),
InitState = #{domain => inet,
@@ -39568,10 +38707,6 @@ traffic_ping_pong_medium_send_and_recv_tcp4(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv6.
-traffic_ping_pong_medium_send_and_recv_tcp6(suite) ->
- [];
-traffic_ping_pong_medium_send_and_recv_tcp6(doc) ->
- [];
traffic_ping_pong_medium_send_and_recv_tcp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
@@ -39597,10 +38732,6 @@ traffic_ping_pong_medium_send_and_recv_tcp6(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for Unix Domain (stream) socket.
-traffic_ping_pong_medium_send_and_recv_tcpL(suite) ->
- [];
-traffic_ping_pong_medium_send_and_recv_tcpL(doc) ->
- [];
traffic_ping_pong_medium_send_and_recv_tcpL(Config) when is_list(Config) ->
?TT(?SECS(30)),
Msg = l2b(?TPP_MEDIUM),
@@ -39626,16 +38757,13 @@ traffic_ping_pong_medium_send_and_recv_tcpL(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'large' message test case, for IPv4.
-traffic_ping_pong_large_send_and_recv_tcp4(suite) ->
- [];
-traffic_ping_pong_large_send_and_recv_tcp4(doc) ->
- [];
traffic_ping_pong_large_send_and_recv_tcp4(Config) when is_list(Config) ->
?TT(?SECS(60)),
Msg = l2b(?TPP_LARGE),
Num = ?TPP_NUM(Config, ?TPP_LARGE_NUM),
tc_try(traffic_ping_pong_large_send_and_recv_tcp4,
- fun() -> is_old_fedora16(),
+ fun() -> has_support_ipv4(),
+ is_old_fedora16(),
is_slow_ubuntu(Config) end,
fun() ->
InitState = #{domain => inet,
@@ -39655,10 +38783,6 @@ traffic_ping_pong_large_send_and_recv_tcp4(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'large' message test case, for IPv6.
-traffic_ping_pong_large_send_and_recv_tcp6(suite) ->
- [];
-traffic_ping_pong_large_send_and_recv_tcp6(doc) ->
- [];
traffic_ping_pong_large_send_and_recv_tcp6(Config) when is_list(Config) ->
?TT(?SECS(60)),
Msg = l2b(?TPP_LARGE),
@@ -39686,10 +38810,6 @@ traffic_ping_pong_large_send_and_recv_tcp6(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'large' message test case, for UNix Domain (stream) socket.
-traffic_ping_pong_large_send_and_recv_tcpL(suite) ->
- [];
-traffic_ping_pong_large_send_and_recv_tcpL(doc) ->
- [];
traffic_ping_pong_large_send_and_recv_tcpL(Config) when is_list(Config) ->
?TT(?SECS(60)),
Msg = l2b(?TPP_LARGE),
@@ -39774,14 +38894,11 @@ is_slow_ubuntu(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv4.
-traffic_ping_pong_small_sendto_and_recvfrom_udp4(suite) ->
- [];
-traffic_ping_pong_small_sendto_and_recvfrom_udp4(doc) ->
- [];
traffic_ping_pong_small_sendto_and_recvfrom_udp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
tc_try(traffic_ping_pong_small_sendto_and_recvfrom_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(45)),
InitState = #{domain => inet,
@@ -39801,10 +38918,6 @@ traffic_ping_pong_small_sendto_and_recvfrom_udp4(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv6.
-traffic_ping_pong_small_sendto_and_recvfrom_udp6(suite) ->
- [];
-traffic_ping_pong_small_sendto_and_recvfrom_udp6(doc) ->
- [];
traffic_ping_pong_small_sendto_and_recvfrom_udp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
@@ -39830,10 +38943,6 @@ traffic_ping_pong_small_sendto_and_recvfrom_udp6(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for Unix Domain (dgram) socket.
-traffic_ping_pong_small_sendto_and_recvfrom_udpL(suite) ->
- [];
-traffic_ping_pong_small_sendto_and_recvfrom_udpL(doc) ->
- [];
traffic_ping_pong_small_sendto_and_recvfrom_udpL(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
@@ -39859,14 +38968,11 @@ traffic_ping_pong_small_sendto_and_recvfrom_udpL(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv4.
-traffic_ping_pong_medium_sendto_and_recvfrom_udp4(suite) ->
- [];
-traffic_ping_pong_medium_sendto_and_recvfrom_udp4(doc) ->
- [];
traffic_ping_pong_medium_sendto_and_recvfrom_udp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
tc_try(traffic_ping_pong_medium_sendto_and_recvfrom_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(45)),
InitState = #{domain => inet,
@@ -39886,10 +38992,6 @@ traffic_ping_pong_medium_sendto_and_recvfrom_udp4(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv6.
-traffic_ping_pong_medium_sendto_and_recvfrom_udp6(suite) ->
- [];
-traffic_ping_pong_medium_sendto_and_recvfrom_udp6(doc) ->
- [];
traffic_ping_pong_medium_sendto_and_recvfrom_udp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
@@ -39915,10 +39017,6 @@ traffic_ping_pong_medium_sendto_and_recvfrom_udp6(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for Unix Domain (dgram) socket.
-traffic_ping_pong_medium_sendto_and_recvfrom_udpL(suite) ->
- [];
-traffic_ping_pong_medium_sendto_and_recvfrom_udpL(doc) ->
- [];
traffic_ping_pong_medium_sendto_and_recvfrom_udpL(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
@@ -39944,14 +39042,11 @@ traffic_ping_pong_medium_sendto_and_recvfrom_udpL(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv4.
-traffic_ping_pong_small_sendmsg_and_recvmsg_tcp4(suite) ->
- [];
-traffic_ping_pong_small_sendmsg_and_recvmsg_tcp4(doc) ->
- [];
traffic_ping_pong_small_sendmsg_and_recvmsg_tcp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
tc_try(traffic_ping_pong_small_sendmsg_and_recvmsg_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(20)),
InitState = #{domain => inet,
@@ -39971,10 +39066,6 @@ traffic_ping_pong_small_sendmsg_and_recvmsg_tcp4(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv6.
-traffic_ping_pong_small_sendmsg_and_recvmsg_tcp6(suite) ->
- [];
-traffic_ping_pong_small_sendmsg_and_recvmsg_tcp6(doc) ->
- [];
traffic_ping_pong_small_sendmsg_and_recvmsg_tcp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
@@ -39999,10 +39090,6 @@ traffic_ping_pong_small_sendmsg_and_recvmsg_tcp6(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for Unix Domain (stream) socket.
-traffic_ping_pong_small_sendmsg_and_recvmsg_tcpL(suite) ->
- [];
-traffic_ping_pong_small_sendmsg_and_recvmsg_tcpL(doc) ->
- [];
traffic_ping_pong_small_sendmsg_and_recvmsg_tcpL(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
@@ -40027,14 +39114,11 @@ traffic_ping_pong_small_sendmsg_and_recvmsg_tcpL(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv4.
-traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp4(suite) ->
- [];
-traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp4(doc) ->
- [];
traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
tc_try(traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(30)),
InitState = #{domain => inet,
@@ -40054,10 +39138,6 @@ traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp4(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv6.
-traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp6(suite) ->
- [];
-traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp6(doc) ->
- [];
traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
@@ -40082,10 +39162,6 @@ traffic_ping_pong_medium_sendmsg_and_recvmsg_tcp6(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for Unix Domain (stream) socket.
-traffic_ping_pong_medium_sendmsg_and_recvmsg_tcpL(suite) ->
- [];
-traffic_ping_pong_medium_sendmsg_and_recvmsg_tcpL(doc) ->
- [];
traffic_ping_pong_medium_sendmsg_and_recvmsg_tcpL(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
@@ -40110,15 +39186,11 @@ traffic_ping_pong_medium_sendmsg_and_recvmsg_tcpL(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'large' message test case, for IPv4.
-traffic_ping_pong_large_sendmsg_and_recvmsg_tcp4(suite) ->
- [];
-traffic_ping_pong_large_sendmsg_and_recvmsg_tcp4(doc) ->
- [];
traffic_ping_pong_large_sendmsg_and_recvmsg_tcp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_LARGE),
Num = ?TPP_NUM(Config, ?TPP_LARGE_NUM),
tc_try(traffic_ping_pong_large_sendmsg_and_recvmsg_tcp4,
- fun() -> traffic_ping_pong_large_sendmsg_and_recvmsg_cond() end,
+ fun() -> has_support_ipv4(), traffic_ping_pong_large_sendmsg_and_recvmsg_cond() end,
fun() ->
?TT(?SECS(60)),
InitState = #{domain => inet,
@@ -40148,10 +39220,6 @@ traffic_ping_pong_large_sendmsg_and_recvmsg_cond(_, _) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'large' message test case, for IPv6.
-traffic_ping_pong_large_sendmsg_and_recvmsg_tcp6(suite) ->
- [];
-traffic_ping_pong_large_sendmsg_and_recvmsg_tcp6(doc) ->
- [];
traffic_ping_pong_large_sendmsg_and_recvmsg_tcp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_LARGE),
Num = ?TPP_NUM(Config, ?TPP_LARGE_NUM),
@@ -40180,10 +39248,6 @@ traffic_ping_pong_large_sendmsg_and_recvmsg_tcp6(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'large' message test case, for Unix Domain (stream) socket.
-traffic_ping_pong_large_sendmsg_and_recvmsg_tcpL(suite) ->
- [];
-traffic_ping_pong_large_sendmsg_and_recvmsg_tcpL(doc) ->
- [];
traffic_ping_pong_large_sendmsg_and_recvmsg_tcpL(Config) when is_list(Config) ->
Msg = l2b(?TPP_LARGE),
Num = ?TPP_NUM(Config, ?TPP_LARGE_NUM),
@@ -40209,14 +39273,11 @@ traffic_ping_pong_large_sendmsg_and_recvmsg_tcpL(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv4.
-traffic_ping_pong_small_sendmsg_and_recvmsg_udp4(suite) ->
- [];
-traffic_ping_pong_small_sendmsg_and_recvmsg_udp4(doc) ->
- [];
traffic_ping_pong_small_sendmsg_and_recvmsg_udp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
tc_try(traffic_ping_pong_small_sendmsg_and_recvmsg_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(60)),
InitState = #{domain => inet,
@@ -40236,10 +39297,6 @@ traffic_ping_pong_small_sendmsg_and_recvmsg_udp4(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for IPv6.
-traffic_ping_pong_small_sendmsg_and_recvmsg_udp6(suite) ->
- [];
-traffic_ping_pong_small_sendmsg_and_recvmsg_udp6(doc) ->
- [];
traffic_ping_pong_small_sendmsg_and_recvmsg_udp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
@@ -40264,10 +39321,6 @@ traffic_ping_pong_small_sendmsg_and_recvmsg_udp6(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'small' message test case, for Unix Domain (dgram) socket.
-traffic_ping_pong_small_sendmsg_and_recvmsg_udpL(suite) ->
- [];
-traffic_ping_pong_small_sendmsg_and_recvmsg_udpL(doc) ->
- [];
traffic_ping_pong_small_sendmsg_and_recvmsg_udpL(Config) when is_list(Config) ->
Msg = l2b(?TPP_SMALL),
Num = ?TPP_NUM(Config, ?TPP_SMALL_NUM),
@@ -40292,14 +39345,11 @@ traffic_ping_pong_small_sendmsg_and_recvmsg_udpL(Config) when is_list(Config) ->
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv4.
-traffic_ping_pong_medium_sendmsg_and_recvmsg_udp4(suite) ->
- [];
-traffic_ping_pong_medium_sendmsg_and_recvmsg_udp4(doc) ->
- [];
traffic_ping_pong_medium_sendmsg_and_recvmsg_udp4(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
tc_try(traffic_ping_pong_medium_sendmsg_and_recvmsg_udp4,
+ fun() -> has_support_ipv4() end,
fun() ->
?TT(?SECS(60)),
InitState = #{domain => inet,
@@ -40319,10 +39369,6 @@ traffic_ping_pong_medium_sendmsg_and_recvmsg_udp4(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for IPv6.
-traffic_ping_pong_medium_sendmsg_and_recvmsg_udp6(suite) ->
- [];
-traffic_ping_pong_medium_sendmsg_and_recvmsg_udp6(doc) ->
- [];
traffic_ping_pong_medium_sendmsg_and_recvmsg_udp6(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
@@ -40348,10 +39394,6 @@ traffic_ping_pong_medium_sendmsg_and_recvmsg_udp6(Config) when is_list(Config) -
%% repeated a set number of times (more times the small the message).
%% This is the 'medium' message test case, for Unix Domain (dgram) socket.
-traffic_ping_pong_medium_sendmsg_and_recvmsg_udpL(suite) ->
- [];
-traffic_ping_pong_medium_sendmsg_and_recvmsg_udpL(doc) ->
- [];
traffic_ping_pong_medium_sendmsg_and_recvmsg_udpL(Config) when is_list(Config) ->
Msg = l2b(?TPP_MEDIUM),
Num = ?TPP_NUM(Config, ?TPP_MEDIUM_NUM),
@@ -40431,7 +39473,7 @@ traffic_ping_pong_sendmsg_and_recvmsg_tcp2(InitState) ->
traffic_ping_pong_send_and_receive_tcp(#{msg := Msg} = InitState) ->
Fun = fun(Sock) ->
{ok, RcvSz} = socket:getopt(Sock, socket, rcvbuf),
- ?SEV_IPRINT("RcvBuf is ~p (needs atleast ~p)",
+ ?SEV_IPRINT("RcvBuf is ~p (needs at least ~p)",
[RcvSz, 16+size(Msg)]),
if (RcvSz < size(Msg)) ->
NewRcvSz = 1024+size(Msg),
@@ -40449,7 +39491,7 @@ traffic_ping_pong_send_and_receive_tcp(#{msg := Msg} = InitState) ->
ok
end,
{ok, SndSz} = socket:getopt(Sock, socket, sndbuf),
- ?SEV_IPRINT("SndBuf is ~p (needs atleast ~p)",
+ ?SEV_IPRINT("SndBuf is ~p (needs at least ~p)",
[SndSz, 16+size(Msg)]),
if (SndSz < size(Msg)) ->
NewSndSz = 1024+size(Msg),
@@ -40681,12 +39723,12 @@ traffic_ping_pong_send_and_receive_tcp2(InitState) ->
%% *** Init part ***
#{desc => "create node",
- cmd => fun(#{host := Host} = State) ->
- case start_node(Host, client) of
- {ok, Node} ->
+ cmd => fun(State) ->
+ case ?CT_PEER() of
+ {ok, Peer, Node} ->
?SEV_IPRINT("(remote) client node ~p started",
[Node]),
- {ok, State#{node => Node}};
+ {ok, State#{peer => Peer, node => Node}};
{error, Reason} ->
{skip, Reason}
end
@@ -40834,9 +39876,9 @@ traffic_ping_pong_send_and_receive_tcp2(InitState) ->
{ok, State1}
end},
#{desc => "stop client node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
State#{node_stop => ok};
{error, Reason} ->
@@ -40991,7 +40033,7 @@ traffic_ping_pong_send_and_receive_tcp2(InitState) ->
CTime = tdiff(CStart, CStop),
%% Note that the sizes we are counting is only
%% the "data" part of the messages. There is also
- %% fixed header for each message, which of cource
+ %% fixed header for each message, which of course
%% is small for the large messages, but comparatively
%% big for the small messages!
?SEV_IPRINT("Results: ~w messages exchanged"
@@ -41674,12 +40716,12 @@ traffic_ping_pong_send_and_receive_udp2(InitState) ->
%% *** Init part ***
#{desc => "create node",
- cmd => fun(#{host := Host} = State) ->
- case start_node(Host, client) of
- {ok, Node} ->
+ cmd => fun(State) ->
+ case ?CT_PEER() of
+ {ok, Peer, Node} ->
?SEV_IPRINT("(remote) client node ~p started",
[Node]),
- {ok, State#{node => Node}};
+ {ok, State#{peer => Peer, node => Node}};
{error, Reason} ->
{skip, Reason}
end
@@ -41783,9 +40825,9 @@ traffic_ping_pong_send_and_receive_udp2(InitState) ->
{ok, State1}
end},
#{desc => "stop client node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
State#{node_stop => ok};
{error, Reason} ->
@@ -41917,7 +40959,7 @@ traffic_ping_pong_send_and_receive_udp2(InitState) ->
CTime = tdiff(CStart, CStop),
%% Note that the sizes we are counting is only
%% the "data" part of the messages. There is also
- %% fixed header for each message, which of cource
+ %% fixed header for each message, which of course
%% is small for the large messages, but comparatively
%% big for the small messages!
?SEV_IPRINT("Results: ~w messages exchanged"
@@ -42194,7 +41236,7 @@ tpp_udp_recv(Sock, Recv, Tag) ->
ERROR
catch
C:E:S ->
- {error, {catched, C, E, S}}
+ {error, {caught, C, E, S}}
end.
tpp_udp_send_req(Sock, Send, Data, Dest) ->
@@ -42306,10 +41348,6 @@ tpp_udp_sock_close(Sock, Path) ->
%% Domain: inet
%%
-ttest_sgenf_cgenf_small_tcp4(suite) ->
- [];
-ttest_sgenf_cgenf_small_tcp4(doc) ->
- [];
ttest_sgenf_cgenf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgenf_small_tcp4,
@@ -42330,10 +41368,6 @@ ttest_sgenf_cgenf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgenf_small_tcp6(suite) ->
- [];
-ttest_sgenf_cgenf_small_tcp6(doc) ->
- [];
ttest_sgenf_cgenf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgenf_small_tcp6,
@@ -42354,10 +41388,6 @@ ttest_sgenf_cgenf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgenf_medium_tcp4(suite) ->
- [];
-ttest_sgenf_cgenf_medium_tcp4(doc) ->
- [];
ttest_sgenf_cgenf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgenf_medium_tcp4,
@@ -42378,10 +41408,6 @@ ttest_sgenf_cgenf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgenf_medium_tcp6(suite) ->
- [];
-ttest_sgenf_cgenf_medium_tcp6(doc) ->
- [];
ttest_sgenf_cgenf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgenf_medium_tcp6,
@@ -42402,10 +41428,6 @@ ttest_sgenf_cgenf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgenf_large_tcp4(suite) ->
- [];
-ttest_sgenf_cgenf_large_tcp4(doc) ->
- [];
ttest_sgenf_cgenf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgenf_large_tcp4,
@@ -42426,10 +41448,6 @@ ttest_sgenf_cgenf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgenf_large_tcp6(suite) ->
- [];
-ttest_sgenf_cgenf_large_tcp6(doc) ->
- [];
ttest_sgenf_cgenf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgenf_large_tcp6,
@@ -42450,10 +41468,6 @@ ttest_sgenf_cgenf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgeno_small_tcp4(suite) ->
- [];
-ttest_sgenf_cgeno_small_tcp4(doc) ->
- [];
ttest_sgenf_cgeno_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgeno_small_tcp4,
@@ -42474,10 +41488,6 @@ ttest_sgenf_cgeno_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgeno_small_tcp6(suite) ->
- [];
-ttest_sgenf_cgeno_small_tcp6(doc) ->
- [];
ttest_sgenf_cgeno_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgeno_small_tcp6,
@@ -42498,10 +41508,6 @@ ttest_sgenf_cgeno_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgeno_medium_tcp4(suite) ->
- [];
-ttest_sgenf_cgeno_medium_tcp4(doc) ->
- [];
ttest_sgenf_cgeno_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgeno_medium_tcp4,
@@ -42522,10 +41528,6 @@ ttest_sgenf_cgeno_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgeno_medium_tcp6(suite) ->
- [];
-ttest_sgenf_cgeno_medium_tcp6(doc) ->
- [];
ttest_sgenf_cgeno_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgeno_medium_tcp6,
@@ -42546,10 +41548,6 @@ ttest_sgenf_cgeno_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgeno_large_tcp4(suite) ->
- [];
-ttest_sgenf_cgeno_large_tcp4(doc) ->
- [];
ttest_sgenf_cgeno_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgeno_large_tcp4,
@@ -42570,10 +41568,6 @@ ttest_sgenf_cgeno_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgeno_large_tcp6(suite) ->
- [];
-ttest_sgenf_cgeno_large_tcp6(doc) ->
- [];
ttest_sgenf_cgeno_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgeno_large_tcp6,
@@ -42594,10 +41588,6 @@ ttest_sgenf_cgeno_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgent_small_tcp4(suite) ->
- [];
-ttest_sgenf_cgent_small_tcp4(doc) ->
- [];
ttest_sgenf_cgent_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgent_small_tcp4,
@@ -42618,10 +41608,6 @@ ttest_sgenf_cgent_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgent_small_tcp6(suite) ->
- [];
-ttest_sgenf_cgent_small_tcp6(doc) ->
- [];
ttest_sgenf_cgent_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgeno_small_tcp6,
@@ -42642,10 +41628,6 @@ ttest_sgenf_cgent_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgent_medium_tcp4(suite) ->
- [];
-ttest_sgenf_cgent_medium_tcp4(doc) ->
- [];
ttest_sgenf_cgent_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgent_medium_tcp4,
@@ -42666,10 +41648,6 @@ ttest_sgenf_cgent_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgent_medium_tcp6(suite) ->
- [];
-ttest_sgenf_cgent_medium_tcp6(doc) ->
- [];
ttest_sgenf_cgent_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgent_medium_tcp6,
@@ -42690,10 +41668,6 @@ ttest_sgenf_cgent_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_cgent_large_tcp4(suite) ->
- [];
-ttest_sgenf_cgent_large_tcp4(doc) ->
- [];
ttest_sgenf_cgent_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgent_large_tcp4,
@@ -42714,10 +41688,6 @@ ttest_sgenf_cgent_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_cgent_large_tcp6(suite) ->
- [];
-ttest_sgenf_cgent_large_tcp6(doc) ->
- [];
ttest_sgenf_cgent_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_cgent_large_tcp6,
@@ -42738,10 +41708,6 @@ ttest_sgenf_cgent_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csockf_small_tcp4(suite) ->
- [];
-ttest_sgenf_csockf_small_tcp4(doc) ->
- [];
ttest_sgenf_csockf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockf_small_tcp4,
@@ -42762,10 +41728,6 @@ ttest_sgenf_csockf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csockf_small_tcp6(suite) ->
- [];
-ttest_sgenf_csockf_small_tcp6(doc) ->
- [];
ttest_sgenf_csockf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockf_small_tcp6,
@@ -42786,10 +41748,6 @@ ttest_sgenf_csockf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csockf_medium_tcp4(suite) ->
- [];
-ttest_sgenf_csockf_medium_tcp4(doc) ->
- [];
ttest_sgenf_csockf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockf_medium_tcp4,
@@ -42810,10 +41768,6 @@ ttest_sgenf_csockf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csockf_medium_tcp6(suite) ->
- [];
-ttest_sgenf_csockf_medium_tcp6(doc) ->
- [];
ttest_sgenf_csockf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockf_medium_tcp6,
@@ -42834,10 +41788,6 @@ ttest_sgenf_csockf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csockf_large_tcp4(suite) ->
- [];
-ttest_sgenf_csockf_large_tcp4(doc) ->
- [];
ttest_sgenf_csockf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockf_large_tcp4,
@@ -42858,10 +41808,6 @@ ttest_sgenf_csockf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csockf_large_tcp6(suite) ->
- [];
-ttest_sgenf_csockf_large_tcp6(doc) ->
- [];
ttest_sgenf_csockf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockf_large_tcp6,
@@ -42882,10 +41828,6 @@ ttest_sgenf_csockf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csocko_small_tcp4(suite) ->
- [];
-ttest_sgenf_csocko_small_tcp4(doc) ->
- [];
ttest_sgenf_csocko_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csocko_small_tcp4,
@@ -42906,10 +41848,6 @@ ttest_sgenf_csocko_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csocko_small_tcp6(suite) ->
- [];
-ttest_sgenf_csocko_small_tcp6(doc) ->
- [];
ttest_sgenf_csocko_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csocko_small_tcp6,
@@ -42930,10 +41868,6 @@ ttest_sgenf_csocko_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csocko_medium_tcp4(suite) ->
- [];
-ttest_sgenf_csocko_medium_tcp4(doc) ->
- [];
ttest_sgenf_csocko_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csocko_medium_tcp4,
@@ -42954,10 +41888,6 @@ ttest_sgenf_csocko_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csocko_medium_tcp6(suite) ->
- [];
-ttest_sgenf_csocko_medium_tcp6(doc) ->
- [];
ttest_sgenf_csocko_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csocko_medium_tcp6,
@@ -42978,10 +41908,6 @@ ttest_sgenf_csocko_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csocko_large_tcp4(suite) ->
- [];
-ttest_sgenf_csocko_large_tcp4(doc) ->
- [];
ttest_sgenf_csocko_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csocko_large_tcp4,
@@ -43002,10 +41928,6 @@ ttest_sgenf_csocko_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csocko_large_tcp6(suite) ->
- [];
-ttest_sgenf_csocko_large_tcp6(doc) ->
- [];
ttest_sgenf_csocko_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csocko_large_tcp6,
@@ -43026,10 +41948,6 @@ ttest_sgenf_csocko_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csockt_small_tcp4(suite) ->
- [];
-ttest_sgenf_csockt_small_tcp4(doc) ->
- [];
ttest_sgenf_csockt_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockt_small_tcp4,
@@ -43050,10 +41968,6 @@ ttest_sgenf_csockt_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csockt_small_tcp6(suite) ->
- [];
-ttest_sgenf_csockt_small_tcp6(doc) ->
- [];
ttest_sgenf_csockt_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csocko_small_tcp6,
@@ -43074,10 +41988,6 @@ ttest_sgenf_csockt_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csockt_medium_tcp4(suite) ->
- [];
-ttest_sgenf_csockt_medium_tcp4(doc) ->
- [];
ttest_sgenf_csockt_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockt_medium_tcp4,
@@ -43098,10 +42008,6 @@ ttest_sgenf_csockt_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csockt_medium_tcp6(suite) ->
- [];
-ttest_sgenf_csockt_medium_tcp6(doc) ->
- [];
ttest_sgenf_csockt_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockt_medium_tcp6,
@@ -43122,10 +42028,6 @@ ttest_sgenf_csockt_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgenf_csockt_large_tcp4(suite) ->
- [];
-ttest_sgenf_csockt_large_tcp4(doc) ->
- [];
ttest_sgenf_csockt_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockt_large_tcp4,
@@ -43146,10 +42048,6 @@ ttest_sgenf_csockt_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgenf_csockt_large_tcp6(suite) ->
- [];
-ttest_sgenf_csockt_large_tcp6(doc) ->
- [];
ttest_sgenf_csockt_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgenf_csockt_large_tcp6,
@@ -43170,10 +42068,6 @@ ttest_sgenf_csockt_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgenf_small_tcp4(suite) ->
- [];
-ttest_sgeno_cgenf_small_tcp4(doc) ->
- [];
ttest_sgeno_cgenf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgenf_small_tcp4,
@@ -43194,10 +42088,6 @@ ttest_sgeno_cgenf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgenf_small_tcp6(suite) ->
- [];
-ttest_sgeno_cgenf_small_tcp6(doc) ->
- [];
ttest_sgeno_cgenf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgenf_small_tcp6,
@@ -43218,10 +42108,6 @@ ttest_sgeno_cgenf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgenf_medium_tcp4(suite) ->
- [];
-ttest_sgeno_cgenf_medium_tcp4(doc) ->
- [];
ttest_sgeno_cgenf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgenf_medium_tcp4,
@@ -43242,10 +42128,6 @@ ttest_sgeno_cgenf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgenf_medium_tcp6(suite) ->
- [];
-ttest_sgeno_cgenf_medium_tcp6(doc) ->
- [];
ttest_sgeno_cgenf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgenf_medium_tcp6,
@@ -43266,10 +42148,6 @@ ttest_sgeno_cgenf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgenf_large_tcp4(suite) ->
- [];
-ttest_sgeno_cgenf_large_tcp4(doc) ->
- [];
ttest_sgeno_cgenf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgenf_large_tcp4,
@@ -43290,10 +42168,6 @@ ttest_sgeno_cgenf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgenf_large_tcp6(suite) ->
- [];
-ttest_sgeno_cgenf_large_tcp6(doc) ->
- [];
ttest_sgeno_cgenf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgenf_large_tcp6,
@@ -43314,10 +42188,6 @@ ttest_sgeno_cgenf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgeno_small_tcp4(suite) ->
- [];
-ttest_sgeno_cgeno_small_tcp4(doc) ->
- [];
ttest_sgeno_cgeno_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgeno_small_tcp4,
@@ -43338,10 +42208,6 @@ ttest_sgeno_cgeno_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgeno_small_tcp6(suite) ->
- [];
-ttest_sgeno_cgeno_small_tcp6(doc) ->
- [];
ttest_sgeno_cgeno_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgeno_small_tcp6,
@@ -43362,10 +42228,6 @@ ttest_sgeno_cgeno_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgeno_medium_tcp4(suite) ->
- [];
-ttest_sgeno_cgeno_medium_tcp4(doc) ->
- [];
ttest_sgeno_cgeno_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgeno_medium_tcp4,
@@ -43386,10 +42248,6 @@ ttest_sgeno_cgeno_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgeno_medium_tcp6(suite) ->
- [];
-ttest_sgeno_cgeno_medium_tcp6(doc) ->
- [];
ttest_sgeno_cgeno_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgeno_medium_tcp6,
@@ -43410,10 +42268,6 @@ ttest_sgeno_cgeno_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgeno_large_tcp4(suite) ->
- [];
-ttest_sgeno_cgeno_large_tcp4(doc) ->
- [];
ttest_sgeno_cgeno_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgeno_large_tcp4,
@@ -43434,10 +42288,6 @@ ttest_sgeno_cgeno_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgeno_large_tcp6(suite) ->
- [];
-ttest_sgeno_cgeno_large_tcp6(doc) ->
- [];
ttest_sgeno_cgeno_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgeno_large_tcp6,
@@ -43458,10 +42308,6 @@ ttest_sgeno_cgeno_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgent_small_tcp4(suite) ->
- [];
-ttest_sgeno_cgent_small_tcp4(doc) ->
- [];
ttest_sgeno_cgent_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgent_small_tcp4,
@@ -43482,10 +42328,6 @@ ttest_sgeno_cgent_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgent_small_tcp6(suite) ->
- [];
-ttest_sgeno_cgent_small_tcp6(doc) ->
- [];
ttest_sgeno_cgent_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgeno_small_tcp6,
@@ -43506,10 +42348,6 @@ ttest_sgeno_cgent_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgent_medium_tcp4(suite) ->
- [];
-ttest_sgeno_cgent_medium_tcp4(doc) ->
- [];
ttest_sgeno_cgent_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgent_medium_tcp4,
@@ -43530,10 +42368,6 @@ ttest_sgeno_cgent_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgent_medium_tcp6(suite) ->
- [];
-ttest_sgeno_cgent_medium_tcp6(doc) ->
- [];
ttest_sgeno_cgent_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgent_medium_tcp6,
@@ -43554,10 +42388,6 @@ ttest_sgeno_cgent_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_cgent_large_tcp4(suite) ->
- [];
-ttest_sgeno_cgent_large_tcp4(doc) ->
- [];
ttest_sgeno_cgent_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgent_large_tcp4,
@@ -43578,10 +42408,6 @@ ttest_sgeno_cgent_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_cgent_large_tcp6(suite) ->
- [];
-ttest_sgeno_cgent_large_tcp6(doc) ->
- [];
ttest_sgeno_cgent_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_cgent_large_tcp6,
@@ -43602,10 +42428,6 @@ ttest_sgeno_cgent_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csockf_small_tcp4(suite) ->
- [];
-ttest_sgeno_csockf_small_tcp4(doc) ->
- [];
ttest_sgeno_csockf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockf_small_tcp4,
@@ -43626,10 +42448,6 @@ ttest_sgeno_csockf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csockf_small_tcp6(suite) ->
- [];
-ttest_sgeno_csockf_small_tcp6(doc) ->
- [];
ttest_sgeno_csockf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockf_small_tcp6,
@@ -43650,10 +42468,6 @@ ttest_sgeno_csockf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csockf_medium_tcp4(suite) ->
- [];
-ttest_sgeno_csockf_medium_tcp4(doc) ->
- [];
ttest_sgeno_csockf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockf_medium_tcp4,
@@ -43674,10 +42488,6 @@ ttest_sgeno_csockf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csockf_medium_tcp6(suite) ->
- [];
-ttest_sgeno_csockf_medium_tcp6(doc) ->
- [];
ttest_sgeno_csockf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockf_medium_tcp6,
@@ -43698,10 +42508,6 @@ ttest_sgeno_csockf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csockf_large_tcp4(suite) ->
- [];
-ttest_sgeno_csockf_large_tcp4(doc) ->
- [];
ttest_sgeno_csockf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockf_large_tcp4,
@@ -43722,10 +42528,6 @@ ttest_sgeno_csockf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csockf_large_tcp6(suite) ->
- [];
-ttest_sgeno_csockf_large_tcp6(doc) ->
- [];
ttest_sgeno_csockf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockf_large_tcp6,
@@ -43746,10 +42548,6 @@ ttest_sgeno_csockf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csocko_small_tcp4(suite) ->
- [];
-ttest_sgeno_csocko_small_tcp4(doc) ->
- [];
ttest_sgeno_csocko_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csocko_small_tcp4,
@@ -43770,10 +42568,6 @@ ttest_sgeno_csocko_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csocko_small_tcp6(suite) ->
- [];
-ttest_sgeno_csocko_small_tcp6(doc) ->
- [];
ttest_sgeno_csocko_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csocko_small_tcp6,
@@ -43794,10 +42588,6 @@ ttest_sgeno_csocko_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csocko_medium_tcp4(suite) ->
- [];
-ttest_sgeno_csocko_medium_tcp4(doc) ->
- [];
ttest_sgeno_csocko_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csocko_medium_tcp4,
@@ -43818,10 +42608,6 @@ ttest_sgeno_csocko_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csocko_medium_tcp6(suite) ->
- [];
-ttest_sgeno_csocko_medium_tcp6(doc) ->
- [];
ttest_sgeno_csocko_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csocko_medium_tcp6,
@@ -43842,10 +42628,6 @@ ttest_sgeno_csocko_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csocko_large_tcp4(suite) ->
- [];
-ttest_sgeno_csocko_large_tcp4(doc) ->
- [];
ttest_sgeno_csocko_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csocko_large_tcp4,
@@ -43866,10 +42648,6 @@ ttest_sgeno_csocko_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csocko_large_tcp6(suite) ->
- [];
-ttest_sgeno_csocko_large_tcp6(doc) ->
- [];
ttest_sgeno_csocko_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csocko_large_tcp6,
@@ -43890,10 +42668,6 @@ ttest_sgeno_csocko_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csockt_small_tcp4(suite) ->
- [];
-ttest_sgeno_csockt_small_tcp4(doc) ->
- [];
ttest_sgeno_csockt_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockt_small_tcp4,
@@ -43914,10 +42688,6 @@ ttest_sgeno_csockt_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csockt_small_tcp6(suite) ->
- [];
-ttest_sgeno_csockt_small_tcp6(doc) ->
- [];
ttest_sgeno_csockt_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csocko_small_tcp6,
@@ -43938,10 +42708,6 @@ ttest_sgeno_csockt_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csockt_medium_tcp4(suite) ->
- [];
-ttest_sgeno_csockt_medium_tcp4(doc) ->
- [];
ttest_sgeno_csockt_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockt_medium_tcp4,
@@ -43962,10 +42728,6 @@ ttest_sgeno_csockt_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csockt_medium_tcp6(suite) ->
- [];
-ttest_sgeno_csockt_medium_tcp6(doc) ->
- [];
ttest_sgeno_csockt_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockt_medium_tcp6,
@@ -43986,10 +42748,6 @@ ttest_sgeno_csockt_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgeno_csockt_large_tcp4(suite) ->
- [];
-ttest_sgeno_csockt_large_tcp4(doc) ->
- [];
ttest_sgeno_csockt_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockt_large_tcp4,
@@ -44010,10 +42768,6 @@ ttest_sgeno_csockt_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgeno_csockt_large_tcp6(suite) ->
- [];
-ttest_sgeno_csockt_large_tcp6(doc) ->
- [];
ttest_sgeno_csockt_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgeno_csockt_large_tcp6,
@@ -44034,10 +42788,6 @@ ttest_sgeno_csockt_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgenf_small_tcp4(suite) ->
- [];
-ttest_sgent_cgenf_small_tcp4(doc) ->
- [];
ttest_sgent_cgenf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgenf_small_tcp4,
@@ -44058,10 +42808,6 @@ ttest_sgent_cgenf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgenf_small_tcp6(suite) ->
- [];
-ttest_sgent_cgenf_small_tcp6(doc) ->
- [];
ttest_sgent_cgenf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgenf_small_tcp6,
@@ -44082,10 +42828,6 @@ ttest_sgent_cgenf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgenf_medium_tcp4(suite) ->
- [];
-ttest_sgent_cgenf_medium_tcp4(doc) ->
- [];
ttest_sgent_cgenf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgenf_medium_tcp4,
@@ -44106,10 +42848,6 @@ ttest_sgent_cgenf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgenf_medium_tcp6(suite) ->
- [];
-ttest_sgent_cgenf_medium_tcp6(doc) ->
- [];
ttest_sgent_cgenf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgenf_medium_tcp6,
@@ -44130,10 +42868,6 @@ ttest_sgent_cgenf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgenf_large_tcp4(suite) ->
- [];
-ttest_sgent_cgenf_large_tcp4(doc) ->
- [];
ttest_sgent_cgenf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgenf_large_tcp4,
@@ -44154,10 +42888,6 @@ ttest_sgent_cgenf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgenf_large_tcp6(suite) ->
- [];
-ttest_sgent_cgenf_large_tcp6(doc) ->
- [];
ttest_sgent_cgenf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgenf_large_tcp6,
@@ -44178,10 +42908,6 @@ ttest_sgent_cgenf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgeno_small_tcp4(suite) ->
- [];
-ttest_sgent_cgeno_small_tcp4(doc) ->
- [];
ttest_sgent_cgeno_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgeno_small_tcp4,
@@ -44202,10 +42928,6 @@ ttest_sgent_cgeno_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgeno_small_tcp6(suite) ->
- [];
-ttest_sgent_cgeno_small_tcp6(doc) ->
- [];
ttest_sgent_cgeno_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgeno_small_tcp6,
@@ -44226,10 +42948,6 @@ ttest_sgent_cgeno_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgeno_medium_tcp4(suite) ->
- [];
-ttest_sgent_cgeno_medium_tcp4(doc) ->
- [];
ttest_sgent_cgeno_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgeno_medium_tcp4,
@@ -44250,10 +42968,6 @@ ttest_sgent_cgeno_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgeno_medium_tcp6(suite) ->
- [];
-ttest_sgent_cgeno_medium_tcp6(doc) ->
- [];
ttest_sgent_cgeno_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgeno_medium_tcp6,
@@ -44274,10 +42988,6 @@ ttest_sgent_cgeno_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgeno_large_tcp4(suite) ->
- [];
-ttest_sgent_cgeno_large_tcp4(doc) ->
- [];
ttest_sgent_cgeno_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgeno_large_tcp4,
@@ -44298,10 +43008,6 @@ ttest_sgent_cgeno_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgeno_large_tcp6(suite) ->
- [];
-ttest_sgent_cgeno_large_tcp6(doc) ->
- [];
ttest_sgent_cgeno_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgeno_large_tcp6,
@@ -44322,10 +43028,6 @@ ttest_sgent_cgeno_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgent_small_tcp4(suite) ->
- [];
-ttest_sgent_cgent_small_tcp4(doc) ->
- [];
ttest_sgent_cgent_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgent_small_tcp4,
@@ -44346,10 +43048,6 @@ ttest_sgent_cgent_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgent_small_tcp6(suite) ->
- [];
-ttest_sgent_cgent_small_tcp6(doc) ->
- [];
ttest_sgent_cgent_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgeno_small_tcp6,
@@ -44370,10 +43068,9 @@ ttest_sgent_cgent_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgent_medium_tcp4(suite) ->
- [];
-ttest_sgent_cgent_medium_tcp4(doc) ->
- ["Server(gen,true), Client(gen,true), Domain=inet, msg=medium"];
+ttest_sgent_cgent_medium_tcp4() ->
+ [{doc, "Server(gen,true), Client(gen,true), Domain=inet, msg=medium"}].
+
ttest_sgent_cgent_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgent_medium_tcp4,
@@ -44393,11 +43090,9 @@ ttest_sgent_cgent_medium_tcp4(Config) when is_list(Config) ->
%% Message Size: medium (=2)
%% Domain: inet6
%%
+ttest_sgent_cgent_medium_tcp6() ->
+ [{doc, "Server(gen,true), Client(gen,true), Domain=inet6, msg=medium"}].
-ttest_sgent_cgent_medium_tcp6(suite) ->
- [];
-ttest_sgent_cgent_medium_tcp6(doc) ->
- ["Server(gen,true), Client(gen,true), Domain=inet6, msg=medium"];
ttest_sgent_cgent_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgent_medium_tcp6,
@@ -44418,10 +43113,9 @@ ttest_sgent_cgent_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_cgent_large_tcp4(suite) ->
- [];
-ttest_sgent_cgent_large_tcp4(doc) ->
- ["Server(gen,true), Client(gen,true), Domain=inet, msg=large"];
+ttest_sgent_cgent_large_tcp4() ->
+ [{doc, "Server(gen,true), Client(gen,true), Domain=inet, msg=large"}].
+
ttest_sgent_cgent_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgent_large_tcp4,
@@ -44442,10 +43136,9 @@ ttest_sgent_cgent_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_cgent_large_tcp6(suite) ->
- [];
-ttest_sgent_cgent_large_tcp6(doc) ->
- ["Server(gen,true), Client(gen,true), Domain=inet6, msg=large"];
+ttest_sgent_cgent_large_tcp6() ->
+ [{doc, "Server(gen,true), Client(gen,true), Domain=inet6, msg=large"}].
+
ttest_sgent_cgent_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_cgent_large_tcp6,
@@ -44466,10 +43159,7 @@ ttest_sgent_cgent_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csockf_small_tcp4(suite) ->
- [];
-ttest_sgent_csockf_small_tcp4(doc) ->
- [];
+
ttest_sgent_csockf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockf_small_tcp4,
@@ -44490,10 +43180,6 @@ ttest_sgent_csockf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csockf_small_tcp6(suite) ->
- [];
-ttest_sgent_csockf_small_tcp6(doc) ->
- [];
ttest_sgent_csockf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockf_small_tcp6,
@@ -44514,10 +43200,6 @@ ttest_sgent_csockf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csockf_medium_tcp4(suite) ->
- [];
-ttest_sgent_csockf_medium_tcp4(doc) ->
- [];
ttest_sgent_csockf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockf_medium_tcp4,
@@ -44538,10 +43220,6 @@ ttest_sgent_csockf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csockf_medium_tcp6(suite) ->
- [];
-ttest_sgent_csockf_medium_tcp6(doc) ->
- [];
ttest_sgent_csockf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockf_medium_tcp6,
@@ -44562,10 +43240,6 @@ ttest_sgent_csockf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csockf_large_tcp4(suite) ->
- [];
-ttest_sgent_csockf_large_tcp4(doc) ->
- [];
ttest_sgent_csockf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockf_large_tcp4,
@@ -44586,10 +43260,6 @@ ttest_sgent_csockf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csockf_large_tcp6(suite) ->
- [];
-ttest_sgent_csockf_large_tcp6(doc) ->
- [];
ttest_sgent_csockf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockf_large_tcp6,
@@ -44610,10 +43280,6 @@ ttest_sgent_csockf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csocko_small_tcp4(suite) ->
- [];
-ttest_sgent_csocko_small_tcp4(doc) ->
- [];
ttest_sgent_csocko_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csocko_small_tcp4,
@@ -44634,10 +43300,6 @@ ttest_sgent_csocko_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csocko_small_tcp6(suite) ->
- [];
-ttest_sgent_csocko_small_tcp6(doc) ->
- [];
ttest_sgent_csocko_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csocko_small_tcp6,
@@ -44658,10 +43320,6 @@ ttest_sgent_csocko_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csocko_medium_tcp4(suite) ->
- [];
-ttest_sgent_csocko_medium_tcp4(doc) ->
- [];
ttest_sgent_csocko_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csocko_medium_tcp4,
@@ -44682,10 +43340,6 @@ ttest_sgent_csocko_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csocko_medium_tcp6(suite) ->
- [];
-ttest_sgent_csocko_medium_tcp6(doc) ->
- [];
ttest_sgent_csocko_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csocko_medium_tcp6,
@@ -44706,10 +43360,6 @@ ttest_sgent_csocko_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csocko_large_tcp4(suite) ->
- [];
-ttest_sgent_csocko_large_tcp4(doc) ->
- [];
ttest_sgent_csocko_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csocko_large_tcp4,
@@ -44730,10 +43380,6 @@ ttest_sgent_csocko_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csocko_large_tcp6(suite) ->
- [];
-ttest_sgent_csocko_large_tcp6(doc) ->
- [];
ttest_sgent_csocko_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csocko_large_tcp6,
@@ -44754,10 +43400,6 @@ ttest_sgent_csocko_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csockt_small_tcp4(suite) ->
- [];
-ttest_sgent_csockt_small_tcp4(doc) ->
- [];
ttest_sgent_csockt_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockt_small_tcp4,
@@ -44778,10 +43420,6 @@ ttest_sgent_csockt_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csockt_small_tcp6(suite) ->
- [];
-ttest_sgent_csockt_small_tcp6(doc) ->
- [];
ttest_sgent_csockt_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csocko_small_tcp6,
@@ -44802,10 +43440,6 @@ ttest_sgent_csockt_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csockt_medium_tcp4(suite) ->
- [];
-ttest_sgent_csockt_medium_tcp4(doc) ->
- [];
ttest_sgent_csockt_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockt_medium_tcp4,
@@ -44826,10 +43460,6 @@ ttest_sgent_csockt_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csockt_medium_tcp6(suite) ->
- [];
-ttest_sgent_csockt_medium_tcp6(doc) ->
- [];
ttest_sgent_csockt_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockt_medium_tcp6,
@@ -44850,10 +43480,6 @@ ttest_sgent_csockt_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_sgent_csockt_large_tcp4(suite) ->
- [];
-ttest_sgent_csockt_large_tcp4(doc) ->
- [];
ttest_sgent_csockt_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockt_large_tcp4,
@@ -44874,10 +43500,6 @@ ttest_sgent_csockt_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_sgent_csockt_large_tcp6(suite) ->
- [];
-ttest_sgent_csockt_large_tcp6(doc) ->
- [];
ttest_sgent_csockt_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_sgent_csockt_large_tcp6,
@@ -44898,10 +43520,6 @@ ttest_sgent_csockt_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgenf_small_tcp4(suite) ->
- [];
-ttest_ssockf_cgenf_small_tcp4(doc) ->
- [];
ttest_ssockf_cgenf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgenf_small_tcp4,
@@ -44922,10 +43540,6 @@ ttest_ssockf_cgenf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgenf_small_tcp6(suite) ->
- [];
-ttest_ssockf_cgenf_small_tcp6(doc) ->
- [];
ttest_ssockf_cgenf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgenf_small_tcp6,
@@ -44946,10 +43560,6 @@ ttest_ssockf_cgenf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgenf_medium_tcp4(suite) ->
- [];
-ttest_ssockf_cgenf_medium_tcp4(doc) ->
- [];
ttest_ssockf_cgenf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgenf_medium_tcp4,
@@ -44970,10 +43580,6 @@ ttest_ssockf_cgenf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgenf_medium_tcp6(suite) ->
- [];
-ttest_ssockf_cgenf_medium_tcp6(doc) ->
- [];
ttest_ssockf_cgenf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgenf_medium_tcp6,
@@ -44994,10 +43600,6 @@ ttest_ssockf_cgenf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgenf_large_tcp4(suite) ->
- [];
-ttest_ssockf_cgenf_large_tcp4(doc) ->
- [];
ttest_ssockf_cgenf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgenf_large_tcp4,
@@ -45018,10 +43620,6 @@ ttest_ssockf_cgenf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgenf_large_tcp6(suite) ->
- [];
-ttest_ssockf_cgenf_large_tcp6(doc) ->
- [];
ttest_ssockf_cgenf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgenf_large_tcp6,
@@ -45042,10 +43640,6 @@ ttest_ssockf_cgenf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgeno_small_tcp4(suite) ->
- [];
-ttest_ssockf_cgeno_small_tcp4(doc) ->
- [];
ttest_ssockf_cgeno_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgeno_small_tcp4,
@@ -45066,10 +43660,6 @@ ttest_ssockf_cgeno_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgeno_small_tcp6(suite) ->
- [];
-ttest_ssockf_cgeno_small_tcp6(doc) ->
- [];
ttest_ssockf_cgeno_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgeno_small_tcp6,
@@ -45090,10 +43680,6 @@ ttest_ssockf_cgeno_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgeno_medium_tcp4(suite) ->
- [];
-ttest_ssockf_cgeno_medium_tcp4(doc) ->
- [];
ttest_ssockf_cgeno_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgeno_medium_tcp4,
@@ -45114,10 +43700,6 @@ ttest_ssockf_cgeno_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgeno_medium_tcp6(suite) ->
- [];
-ttest_ssockf_cgeno_medium_tcp6(doc) ->
- [];
ttest_ssockf_cgeno_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgeno_medium_tcp6,
@@ -45138,10 +43720,6 @@ ttest_ssockf_cgeno_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgeno_large_tcp4(suite) ->
- [];
-ttest_ssockf_cgeno_large_tcp4(doc) ->
- [];
ttest_ssockf_cgeno_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgeno_large_tcp4,
@@ -45162,10 +43740,6 @@ ttest_ssockf_cgeno_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgeno_large_tcp6(suite) ->
- [];
-ttest_ssockf_cgeno_large_tcp6(doc) ->
- [];
ttest_ssockf_cgeno_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgeno_large_tcp6,
@@ -45186,10 +43760,6 @@ ttest_ssockf_cgeno_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgent_small_tcp4(suite) ->
- [];
-ttest_ssockf_cgent_small_tcp4(doc) ->
- [];
ttest_ssockf_cgent_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgent_small_tcp4,
@@ -45210,10 +43780,6 @@ ttest_ssockf_cgent_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgent_small_tcp6(suite) ->
- [];
-ttest_ssockf_cgent_small_tcp6(doc) ->
- [];
ttest_ssockf_cgent_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgeno_small_tcp6,
@@ -45234,10 +43800,6 @@ ttest_ssockf_cgent_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgent_medium_tcp4(suite) ->
- [];
-ttest_ssockf_cgent_medium_tcp4(doc) ->
- [];
ttest_ssockf_cgent_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgent_medium_tcp4,
@@ -45258,10 +43820,6 @@ ttest_ssockf_cgent_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgent_medium_tcp6(suite) ->
- [];
-ttest_ssockf_cgent_medium_tcp6(doc) ->
- [];
ttest_ssockf_cgent_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgent_medium_tcp6,
@@ -45282,10 +43840,6 @@ ttest_ssockf_cgent_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_cgent_large_tcp4(suite) ->
- [];
-ttest_ssockf_cgent_large_tcp4(doc) ->
- [];
ttest_ssockf_cgent_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgent_large_tcp4,
@@ -45306,10 +43860,6 @@ ttest_ssockf_cgent_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_cgent_large_tcp6(suite) ->
- [];
-ttest_ssockf_cgent_large_tcp6(doc) ->
- [];
ttest_ssockf_cgent_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_cgent_large_tcp6,
@@ -45330,10 +43880,6 @@ ttest_ssockf_cgent_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csockf_small_tcp4(suite) ->
- [];
-ttest_ssockf_csockf_small_tcp4(doc) ->
- [];
ttest_ssockf_csockf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_small_tcp4,
@@ -45354,10 +43900,6 @@ ttest_ssockf_csockf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csockf_small_tcp6(suite) ->
- [];
-ttest_ssockf_csockf_small_tcp6(doc) ->
- [];
ttest_ssockf_csockf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_small_tcp6,
@@ -45378,10 +43920,6 @@ ttest_ssockf_csockf_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csockf_small_tcpL(suite) ->
- [];
-ttest_ssockf_csockf_small_tcpL(doc) ->
- [];
ttest_ssockf_csockf_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_small_tcpL,
@@ -45402,10 +43940,6 @@ ttest_ssockf_csockf_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csockf_medium_tcp4(suite) ->
- [];
-ttest_ssockf_csockf_medium_tcp4(doc) ->
- [];
ttest_ssockf_csockf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_medium_tcp4,
@@ -45426,10 +43960,6 @@ ttest_ssockf_csockf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csockf_medium_tcp6(suite) ->
- [];
-ttest_ssockf_csockf_medium_tcp6(doc) ->
- [];
ttest_ssockf_csockf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_medium_tcp6,
@@ -45450,10 +43980,6 @@ ttest_ssockf_csockf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csockf_medium_tcpL(suite) ->
- [];
-ttest_ssockf_csockf_medium_tcpL(doc) ->
- [];
ttest_ssockf_csockf_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_medium_tcpL,
@@ -45474,10 +44000,6 @@ ttest_ssockf_csockf_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csockf_large_tcp4(suite) ->
- [];
-ttest_ssockf_csockf_large_tcp4(doc) ->
- [];
ttest_ssockf_csockf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_large_tcp4,
@@ -45498,10 +44020,6 @@ ttest_ssockf_csockf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csockf_large_tcp6(suite) ->
- [];
-ttest_ssockf_csockf_large_tcp6(doc) ->
- [];
ttest_ssockf_csockf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_large_tcp6,
@@ -45522,10 +44040,6 @@ ttest_ssockf_csockf_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csockf_large_tcpL(suite) ->
- [];
-ttest_ssockf_csockf_large_tcpL(doc) ->
- [];
ttest_ssockf_csockf_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockf_large_tcpL,
@@ -45546,10 +44060,6 @@ ttest_ssockf_csockf_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csocko_small_tcp4(suite) ->
- [];
-ttest_ssockf_csocko_small_tcp4(doc) ->
- [];
ttest_ssockf_csocko_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_small_tcp4,
@@ -45570,10 +44080,6 @@ ttest_ssockf_csocko_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csocko_small_tcp6(suite) ->
- [];
-ttest_ssockf_csocko_small_tcp6(doc) ->
- [];
ttest_ssockf_csocko_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_small_tcp6,
@@ -45594,10 +44100,6 @@ ttest_ssockf_csocko_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csocko_small_tcpL(suite) ->
- [];
-ttest_ssockf_csocko_small_tcpL(doc) ->
- [];
ttest_ssockf_csocko_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_small_tcpL,
@@ -45618,10 +44120,6 @@ ttest_ssockf_csocko_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csocko_medium_tcp4(suite) ->
- [];
-ttest_ssockf_csocko_medium_tcp4(doc) ->
- [];
ttest_ssockf_csocko_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_medium_tcp4,
@@ -45642,10 +44140,6 @@ ttest_ssockf_csocko_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csocko_medium_tcp6(suite) ->
- [];
-ttest_ssockf_csocko_medium_tcp6(doc) ->
- [];
ttest_ssockf_csocko_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_medium_tcp6,
@@ -45666,10 +44160,6 @@ ttest_ssockf_csocko_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csocko_medium_tcpL(suite) ->
- [];
-ttest_ssockf_csocko_medium_tcpL(doc) ->
- [];
ttest_ssockf_csocko_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_medium_tcpL,
@@ -45690,10 +44180,6 @@ ttest_ssockf_csocko_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csocko_large_tcp4(suite) ->
- [];
-ttest_ssockf_csocko_large_tcp4(doc) ->
- [];
ttest_ssockf_csocko_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_large_tcp4,
@@ -45714,10 +44200,6 @@ ttest_ssockf_csocko_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csocko_large_tcp6(suite) ->
- [];
-ttest_ssockf_csocko_large_tcp6(doc) ->
- [];
ttest_ssockf_csocko_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_large_tcp6,
@@ -45738,10 +44220,6 @@ ttest_ssockf_csocko_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csocko_large_tcpL(suite) ->
- [];
-ttest_ssockf_csocko_large_tcpL(doc) ->
- [];
ttest_ssockf_csocko_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_large_tcpL,
@@ -45762,10 +44240,6 @@ ttest_ssockf_csocko_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csockt_small_tcp4(suite) ->
- [];
-ttest_ssockf_csockt_small_tcp4(doc) ->
- [];
ttest_ssockf_csockt_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockt_small_tcp4,
@@ -45786,10 +44260,6 @@ ttest_ssockf_csockt_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csockt_small_tcp6(suite) ->
- [];
-ttest_ssockf_csockt_small_tcp6(doc) ->
- [];
ttest_ssockf_csockt_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_small_tcp6,
@@ -45810,10 +44280,6 @@ ttest_ssockf_csockt_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csockt_small_tcpL(suite) ->
- [];
-ttest_ssockf_csockt_small_tcpL(doc) ->
- [];
ttest_ssockf_csockt_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csocko_small_tcpL,
@@ -45834,10 +44300,6 @@ ttest_ssockf_csockt_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csockt_medium_tcp4(suite) ->
- [];
-ttest_ssockf_csockt_medium_tcp4(doc) ->
- [];
ttest_ssockf_csockt_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockt_medium_tcp4,
@@ -45858,10 +44320,6 @@ ttest_ssockf_csockt_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csockt_medium_tcp6(suite) ->
- [];
-ttest_ssockf_csockt_medium_tcp6(doc) ->
- [];
ttest_ssockf_csockt_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockt_medium_tcp6,
@@ -45882,10 +44340,6 @@ ttest_ssockf_csockt_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csockt_medium_tcpL(suite) ->
- [];
-ttest_ssockf_csockt_medium_tcpL(doc) ->
- [];
ttest_ssockf_csockt_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockt_medium_tcpL,
@@ -45906,10 +44360,6 @@ ttest_ssockf_csockt_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockf_csockt_large_tcp4(suite) ->
- [];
-ttest_ssockf_csockt_large_tcp4(doc) ->
- [];
ttest_ssockf_csockt_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockt_large_tcp4,
@@ -45930,10 +44380,6 @@ ttest_ssockf_csockt_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockf_csockt_large_tcp6(suite) ->
- [];
-ttest_ssockf_csockt_large_tcp6(doc) ->
- [];
ttest_ssockf_csockt_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockt_large_tcp6,
@@ -45954,10 +44400,6 @@ ttest_ssockf_csockt_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockf_csockt_large_tcpL(suite) ->
- [];
-ttest_ssockf_csockt_large_tcpL(doc) ->
- [];
ttest_ssockf_csockt_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockf_csockt_large_tcpL,
@@ -45978,10 +44420,6 @@ ttest_ssockf_csockt_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgenf_small_tcp4(suite) ->
- [];
-ttest_ssocko_cgenf_small_tcp4(doc) ->
- [];
ttest_ssocko_cgenf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgenf_small_tcp4,
@@ -46002,10 +44440,6 @@ ttest_ssocko_cgenf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgenf_small_tcp6(suite) ->
- [];
-ttest_ssocko_cgenf_small_tcp6(doc) ->
- [];
ttest_ssocko_cgenf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgenf_small_tcp6,
@@ -46026,10 +44460,6 @@ ttest_ssocko_cgenf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgenf_medium_tcp4(suite) ->
- [];
-ttest_ssocko_cgenf_medium_tcp4(doc) ->
- [];
ttest_ssocko_cgenf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgenf_medium_tcp4,
@@ -46050,10 +44480,6 @@ ttest_ssocko_cgenf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgenf_medium_tcp6(suite) ->
- [];
-ttest_ssocko_cgenf_medium_tcp6(doc) ->
- [];
ttest_ssocko_cgenf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgenf_medium_tcp6,
@@ -46074,10 +44500,6 @@ ttest_ssocko_cgenf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgenf_large_tcp4(suite) ->
- [];
-ttest_ssocko_cgenf_large_tcp4(doc) ->
- [];
ttest_ssocko_cgenf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgenf_large_tcp4,
@@ -46098,10 +44520,6 @@ ttest_ssocko_cgenf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgenf_large_tcp6(suite) ->
- [];
-ttest_ssocko_cgenf_large_tcp6(doc) ->
- [];
ttest_ssocko_cgenf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgenf_large_tcp6,
@@ -46122,10 +44540,6 @@ ttest_ssocko_cgenf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgeno_small_tcp4(suite) ->
- [];
-ttest_ssocko_cgeno_small_tcp4(doc) ->
- [];
ttest_ssocko_cgeno_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgeno_small_tcp4,
@@ -46146,10 +44560,6 @@ ttest_ssocko_cgeno_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgeno_small_tcp6(suite) ->
- [];
-ttest_ssocko_cgeno_small_tcp6(doc) ->
- [];
ttest_ssocko_cgeno_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgeno_small_tcp6,
@@ -46170,10 +44580,6 @@ ttest_ssocko_cgeno_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgeno_medium_tcp4(suite) ->
- [];
-ttest_ssocko_cgeno_medium_tcp4(doc) ->
- [];
ttest_ssocko_cgeno_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgeno_medium_tcp4,
@@ -46194,10 +44600,6 @@ ttest_ssocko_cgeno_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgeno_medium_tcp6(suite) ->
- [];
-ttest_ssocko_cgeno_medium_tcp6(doc) ->
- [];
ttest_ssocko_cgeno_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgeno_medium_tcp6,
@@ -46218,10 +44620,6 @@ ttest_ssocko_cgeno_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgeno_large_tcp4(suite) ->
- [];
-ttest_ssocko_cgeno_large_tcp4(doc) ->
- [];
ttest_ssocko_cgeno_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgeno_large_tcp4,
@@ -46242,10 +44640,6 @@ ttest_ssocko_cgeno_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgeno_large_tcp6(suite) ->
- [];
-ttest_ssocko_cgeno_large_tcp6(doc) ->
- [];
ttest_ssocko_cgeno_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgeno_large_tcp6,
@@ -46266,10 +44660,6 @@ ttest_ssocko_cgeno_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgent_small_tcp4(suite) ->
- [];
-ttest_ssocko_cgent_small_tcp4(doc) ->
- [];
ttest_ssocko_cgent_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgent_small_tcp4,
@@ -46290,10 +44680,6 @@ ttest_ssocko_cgent_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgent_small_tcp6(suite) ->
- [];
-ttest_ssocko_cgent_small_tcp6(doc) ->
- [];
ttest_ssocko_cgent_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgent_small_tcp6,
@@ -46314,10 +44700,6 @@ ttest_ssocko_cgent_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgent_medium_tcp4(suite) ->
- [];
-ttest_ssocko_cgent_medium_tcp4(doc) ->
- [];
ttest_ssocko_cgent_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgent_medium_tcp4,
@@ -46338,10 +44720,6 @@ ttest_ssocko_cgent_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgent_medium_tcp6(suite) ->
- [];
-ttest_ssocko_cgent_medium_tcp6(doc) ->
- [];
ttest_ssocko_cgent_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgent_medium_tcp6,
@@ -46362,10 +44740,6 @@ ttest_ssocko_cgent_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_cgent_large_tcp4(suite) ->
- [];
-ttest_ssocko_cgent_large_tcp4(doc) ->
- [];
ttest_ssocko_cgent_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgent_large_tcp4,
@@ -46386,10 +44760,6 @@ ttest_ssocko_cgent_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_cgent_large_tcp6(suite) ->
- [];
-ttest_ssocko_cgent_large_tcp6(doc) ->
- [];
ttest_ssocko_cgent_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_cgent_large_tcp6,
@@ -46410,10 +44780,6 @@ ttest_ssocko_cgent_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csockf_small_tcp4(suite) ->
- [];
-ttest_ssocko_csockf_small_tcp4(doc) ->
- [];
ttest_ssocko_csockf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_small_tcp4,
@@ -46434,10 +44800,6 @@ ttest_ssocko_csockf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csockf_small_tcp6(suite) ->
- [];
-ttest_ssocko_csockf_small_tcp6(doc) ->
- [];
ttest_ssocko_csockf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_small_tcp6,
@@ -46458,10 +44820,6 @@ ttest_ssocko_csockf_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csockf_small_tcpL(suite) ->
- [];
-ttest_ssocko_csockf_small_tcpL(doc) ->
- [];
ttest_ssocko_csockf_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_small_tcpL,
@@ -46482,10 +44840,6 @@ ttest_ssocko_csockf_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csockf_medium_tcp4(suite) ->
- [];
-ttest_ssocko_csockf_medium_tcp4(doc) ->
- [];
ttest_ssocko_csockf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_medium_tcp4,
@@ -46506,10 +44860,6 @@ ttest_ssocko_csockf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csockf_medium_tcp6(suite) ->
- [];
-ttest_ssocko_csockf_medium_tcp6(doc) ->
- [];
ttest_ssocko_csockf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_medium_tcp6,
@@ -46530,10 +44880,6 @@ ttest_ssocko_csockf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csockf_medium_tcpL(suite) ->
- [];
-ttest_ssocko_csockf_medium_tcpL(doc) ->
- [];
ttest_ssocko_csockf_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_medium_tcpL,
@@ -46554,10 +44900,6 @@ ttest_ssocko_csockf_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csockf_large_tcp4(suite) ->
- [];
-ttest_ssocko_csockf_large_tcp4(doc) ->
- [];
ttest_ssocko_csockf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_large_tcp4,
@@ -46578,10 +44920,6 @@ ttest_ssocko_csockf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csockf_large_tcp6(suite) ->
- [];
-ttest_ssocko_csockf_large_tcp6(doc) ->
- [];
ttest_ssocko_csockf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_large_tcp6,
@@ -46602,10 +44940,6 @@ ttest_ssocko_csockf_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csockf_large_tcpL(suite) ->
- [];
-ttest_ssocko_csockf_large_tcpL(doc) ->
- [];
ttest_ssocko_csockf_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockf_large_tcpL,
@@ -46626,10 +44960,6 @@ ttest_ssocko_csockf_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csocko_small_tcp4(suite) ->
- [];
-ttest_ssocko_csocko_small_tcp4(doc) ->
- [];
ttest_ssocko_csocko_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_small_tcp4,
@@ -46650,10 +44980,6 @@ ttest_ssocko_csocko_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csocko_small_tcp6(suite) ->
- [];
-ttest_ssocko_csocko_small_tcp6(doc) ->
- [];
ttest_ssocko_csocko_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_small_tcp6,
@@ -46674,10 +45000,6 @@ ttest_ssocko_csocko_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csocko_small_tcpL(suite) ->
- [];
-ttest_ssocko_csocko_small_tcpL(doc) ->
- [];
ttest_ssocko_csocko_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_small_tcpL,
@@ -46698,10 +45020,6 @@ ttest_ssocko_csocko_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csocko_medium_tcp4(suite) ->
- [];
-ttest_ssocko_csocko_medium_tcp4(doc) ->
- [];
ttest_ssocko_csocko_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_medium_tcp4,
@@ -46722,10 +45040,6 @@ ttest_ssocko_csocko_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csocko_medium_tcp6(suite) ->
- [];
-ttest_ssocko_csocko_medium_tcp6(doc) ->
- [];
ttest_ssocko_csocko_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_medium_tcp6,
@@ -46746,10 +45060,6 @@ ttest_ssocko_csocko_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csocko_medium_tcpL(suite) ->
- [];
-ttest_ssocko_csocko_medium_tcpL(doc) ->
- [];
ttest_ssocko_csocko_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_medium_tcpL,
@@ -46770,10 +45080,6 @@ ttest_ssocko_csocko_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csocko_large_tcp4(suite) ->
- [];
-ttest_ssocko_csocko_large_tcp4(doc) ->
- [];
ttest_ssocko_csocko_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_large_tcp4,
@@ -46794,10 +45100,6 @@ ttest_ssocko_csocko_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csocko_large_tcp6(suite) ->
- [];
-ttest_ssocko_csocko_large_tcp6(doc) ->
- [];
ttest_ssocko_csocko_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_large_tcp6,
@@ -46818,10 +45120,6 @@ ttest_ssocko_csocko_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csocko_large_tcpL(suite) ->
- [];
-ttest_ssocko_csocko_large_tcpL(doc) ->
- [];
ttest_ssocko_csocko_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_large_tcpL,
@@ -46842,10 +45140,6 @@ ttest_ssocko_csocko_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csockt_small_tcp4(suite) ->
- [];
-ttest_ssocko_csockt_small_tcp4(doc) ->
- [];
ttest_ssocko_csockt_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockt_small_tcp4,
@@ -46866,10 +45160,6 @@ ttest_ssocko_csockt_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csockt_small_tcp6(suite) ->
- [];
-ttest_ssocko_csockt_small_tcp6(doc) ->
- [];
ttest_ssocko_csockt_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_small_tcp6,
@@ -46890,10 +45180,6 @@ ttest_ssocko_csockt_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csockt_small_tcpL(suite) ->
- [];
-ttest_ssocko_csockt_small_tcpL(doc) ->
- [];
ttest_ssocko_csockt_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csocko_small_tcpL,
@@ -46914,10 +45200,6 @@ ttest_ssocko_csockt_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csockt_medium_tcp4(suite) ->
- [];
-ttest_ssocko_csockt_medium_tcp4(doc) ->
- [];
ttest_ssocko_csockt_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockt_medium_tcp4,
@@ -46938,10 +45220,6 @@ ttest_ssocko_csockt_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csockt_medium_tcp6(suite) ->
- [];
-ttest_ssocko_csockt_medium_tcp6(doc) ->
- [];
ttest_ssocko_csockt_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockt_medium_tcp6,
@@ -46962,10 +45240,6 @@ ttest_ssocko_csockt_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csockt_medium_tcpL(suite) ->
- [];
-ttest_ssocko_csockt_medium_tcpL(doc) ->
- [];
ttest_ssocko_csockt_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockt_medium_tcpL,
@@ -46986,10 +45260,6 @@ ttest_ssocko_csockt_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssocko_csockt_large_tcp4(suite) ->
- [];
-ttest_ssocko_csockt_large_tcp4(doc) ->
- [];
ttest_ssocko_csockt_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockt_large_tcp4,
@@ -47010,10 +45280,6 @@ ttest_ssocko_csockt_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssocko_csockt_large_tcp6(suite) ->
- [];
-ttest_ssocko_csockt_large_tcp6(doc) ->
- [];
ttest_ssocko_csockt_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockt_large_tcp6,
@@ -47034,10 +45300,6 @@ ttest_ssocko_csockt_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssocko_csockt_large_tcpL(suite) ->
- [];
-ttest_ssocko_csockt_large_tcpL(doc) ->
- [];
ttest_ssocko_csockt_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssocko_csockt_large_tcpL,
@@ -47058,10 +45320,6 @@ ttest_ssocko_csockt_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgenf_small_tcp4(suite) ->
- [];
-ttest_ssockt_cgenf_small_tcp4(doc) ->
- [];
ttest_ssockt_cgenf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgenf_small_tcp4,
@@ -47082,10 +45340,6 @@ ttest_ssockt_cgenf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgenf_small_tcp6(suite) ->
- [];
-ttest_ssockt_cgenf_small_tcp6(doc) ->
- [];
ttest_ssockt_cgenf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgenf_small_tcp6,
@@ -47106,10 +45360,6 @@ ttest_ssockt_cgenf_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgenf_medium_tcp4(suite) ->
- [];
-ttest_ssockt_cgenf_medium_tcp4(doc) ->
- [];
ttest_ssockt_cgenf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgenf_medium_tcp4,
@@ -47130,10 +45380,6 @@ ttest_ssockt_cgenf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgenf_medium_tcp6(suite) ->
- [];
-ttest_ssockt_cgenf_medium_tcp6(doc) ->
- [];
ttest_ssockt_cgenf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgenf_medium_tcp6,
@@ -47154,10 +45400,6 @@ ttest_ssockt_cgenf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgenf_large_tcp4(suite) ->
- [];
-ttest_ssockt_cgenf_large_tcp4(doc) ->
- [];
ttest_ssockt_cgenf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgenf_large_tcp4,
@@ -47178,10 +45420,6 @@ ttest_ssockt_cgenf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgenf_large_tcp6(suite) ->
- [];
-ttest_ssockt_cgenf_large_tcp6(doc) ->
- [];
ttest_ssockt_cgenf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgenf_large_tcp6,
@@ -47202,10 +45440,6 @@ ttest_ssockt_cgenf_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgeno_small_tcp4(suite) ->
- [];
-ttest_ssockt_cgeno_small_tcp4(doc) ->
- [];
ttest_ssockt_cgeno_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgeno_small_tcp4,
@@ -47226,10 +45460,6 @@ ttest_ssockt_cgeno_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgeno_small_tcp6(suite) ->
- [];
-ttest_ssockt_cgeno_small_tcp6(doc) ->
- [];
ttest_ssockt_cgeno_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgeno_small_tcp6,
@@ -47250,10 +45480,6 @@ ttest_ssockt_cgeno_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgeno_medium_tcp4(suite) ->
- [];
-ttest_ssockt_cgeno_medium_tcp4(doc) ->
- [];
ttest_ssockt_cgeno_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgeno_medium_tcp4,
@@ -47274,10 +45500,6 @@ ttest_ssockt_cgeno_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgeno_medium_tcp6(suite) ->
- [];
-ttest_ssockt_cgeno_medium_tcp6(doc) ->
- [];
ttest_ssockt_cgeno_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgeno_medium_tcp6,
@@ -47298,10 +45520,6 @@ ttest_ssockt_cgeno_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgeno_large_tcp4(suite) ->
- [];
-ttest_ssockt_cgeno_large_tcp4(doc) ->
- [];
ttest_ssockt_cgeno_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgeno_large_tcp4,
@@ -47322,10 +45540,6 @@ ttest_ssockt_cgeno_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgeno_large_tcp6(suite) ->
- [];
-ttest_ssockt_cgeno_large_tcp6(doc) ->
- [];
ttest_ssockt_cgeno_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgeno_large_tcp6,
@@ -47346,10 +45560,6 @@ ttest_ssockt_cgeno_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgent_small_tcp4(suite) ->
- [];
-ttest_ssockt_cgent_small_tcp4(doc) ->
- [];
ttest_ssockt_cgent_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgent_small_tcp4,
@@ -47370,10 +45580,6 @@ ttest_ssockt_cgent_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgent_small_tcp6(suite) ->
- [];
-ttest_ssockt_cgent_small_tcp6(doc) ->
- [];
ttest_ssockt_cgent_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgent_small_tcp6,
@@ -47394,10 +45600,6 @@ ttest_ssockt_cgent_small_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgent_medium_tcp4(suite) ->
- [];
-ttest_ssockt_cgent_medium_tcp4(doc) ->
- [];
ttest_ssockt_cgent_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgent_medium_tcp4,
@@ -47418,10 +45620,6 @@ ttest_ssockt_cgent_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgent_medium_tcp6(suite) ->
- [];
-ttest_ssockt_cgent_medium_tcp6(doc) ->
- [];
ttest_ssockt_cgent_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgent_medium_tcp6,
@@ -47442,10 +45640,6 @@ ttest_ssockt_cgent_medium_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_cgent_large_tcp4(suite) ->
- [];
-ttest_ssockt_cgent_large_tcp4(doc) ->
- [];
ttest_ssockt_cgent_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgent_large_tcp4,
@@ -47466,10 +45660,6 @@ ttest_ssockt_cgent_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_cgent_large_tcp6(suite) ->
- [];
-ttest_ssockt_cgent_large_tcp6(doc) ->
- [];
ttest_ssockt_cgent_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_cgent_large_tcp6,
@@ -47490,10 +45680,6 @@ ttest_ssockt_cgent_large_tcp6(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csockf_small_tcp4(suite) ->
- [];
-ttest_ssockt_csockf_small_tcp4(doc) ->
- [];
ttest_ssockt_csockf_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_small_tcp4,
@@ -47514,10 +45700,6 @@ ttest_ssockt_csockf_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csockf_small_tcp6(suite) ->
- [];
-ttest_ssockt_csockf_small_tcp6(doc) ->
- [];
ttest_ssockt_csockf_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_small_tcp6,
@@ -47538,10 +45720,6 @@ ttest_ssockt_csockf_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csockf_small_tcpL(suite) ->
- [];
-ttest_ssockt_csockf_small_tcpL(doc) ->
- [];
ttest_ssockt_csockf_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_small_tcpL,
@@ -47562,10 +45740,6 @@ ttest_ssockt_csockf_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csockf_medium_tcp4(suite) ->
- [];
-ttest_ssockt_csockf_medium_tcp4(doc) ->
- [];
ttest_ssockt_csockf_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_medium_tcp4,
@@ -47586,10 +45760,6 @@ ttest_ssockt_csockf_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csockf_medium_tcp6(suite) ->
- [];
-ttest_ssockt_csockf_medium_tcp6(doc) ->
- [];
ttest_ssockt_csockf_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_medium_tcp6,
@@ -47610,10 +45780,6 @@ ttest_ssockt_csockf_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csockf_medium_tcpL(suite) ->
- [];
-ttest_ssockt_csockf_medium_tcpL(doc) ->
- [];
ttest_ssockt_csockf_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_medium_tcpL,
@@ -47634,10 +45800,6 @@ ttest_ssockt_csockf_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csockf_large_tcp4(suite) ->
- [];
-ttest_ssockt_csockf_large_tcp4(doc) ->
- [];
ttest_ssockt_csockf_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_large_tcp4,
@@ -47658,10 +45820,6 @@ ttest_ssockt_csockf_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csockf_large_tcp6(suite) ->
- [];
-ttest_ssockt_csockf_large_tcp6(doc) ->
- [];
ttest_ssockt_csockf_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_large_tcp6,
@@ -47682,10 +45840,6 @@ ttest_ssockt_csockf_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csockf_large_tcpL(suite) ->
- [];
-ttest_ssockt_csockf_large_tcpL(doc) ->
- [];
ttest_ssockt_csockf_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockf_large_tcpL,
@@ -47706,10 +45860,6 @@ ttest_ssockt_csockf_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csocko_small_tcp4(suite) ->
- [];
-ttest_ssockt_csocko_small_tcp4(doc) ->
- [];
ttest_ssockt_csocko_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_small_tcp4,
@@ -47730,10 +45880,6 @@ ttest_ssockt_csocko_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csocko_small_tcp6(suite) ->
- [];
-ttest_ssockt_csocko_small_tcp6(doc) ->
- [];
ttest_ssockt_csocko_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_small_tcp6,
@@ -47754,10 +45900,6 @@ ttest_ssockt_csocko_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csocko_small_tcpL(suite) ->
- [];
-ttest_ssockt_csocko_small_tcpL(doc) ->
- [];
ttest_ssockt_csocko_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_small_tcpL,
@@ -47778,10 +45920,6 @@ ttest_ssockt_csocko_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csocko_medium_tcp4(suite) ->
- [];
-ttest_ssockt_csocko_medium_tcp4(doc) ->
- [];
ttest_ssockt_csocko_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_medium_tcp4,
@@ -47802,10 +45940,6 @@ ttest_ssockt_csocko_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csocko_medium_tcp6(suite) ->
- [];
-ttest_ssockt_csocko_medium_tcp6(doc) ->
- [];
ttest_ssockt_csocko_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_medium_tcp6,
@@ -47826,10 +45960,6 @@ ttest_ssockt_csocko_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csocko_medium_tcpL(suite) ->
- [];
-ttest_ssockt_csocko_medium_tcpL(doc) ->
- [];
ttest_ssockt_csocko_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_medium_tcpL,
@@ -47850,10 +45980,6 @@ ttest_ssockt_csocko_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csocko_large_tcp4(suite) ->
- [];
-ttest_ssockt_csocko_large_tcp4(doc) ->
- [];
ttest_ssockt_csocko_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_large_tcp4,
@@ -47874,10 +46000,6 @@ ttest_ssockt_csocko_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csocko_large_tcp6(suite) ->
- [];
-ttest_ssockt_csocko_large_tcp6(doc) ->
- [];
ttest_ssockt_csocko_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_large_tcp6,
@@ -47898,10 +46020,6 @@ ttest_ssockt_csocko_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csocko_large_tcpL(suite) ->
- [];
-ttest_ssockt_csocko_large_tcpL(doc) ->
- [];
ttest_ssockt_csocko_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_large_tcpL,
@@ -47922,10 +46040,6 @@ ttest_ssockt_csocko_large_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csockt_small_tcp4(suite) ->
- [];
-ttest_ssockt_csockt_small_tcp4(doc) ->
- [];
ttest_ssockt_csockt_small_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockt_small_tcp4,
@@ -47946,10 +46060,6 @@ ttest_ssockt_csockt_small_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csockt_small_tcp6(suite) ->
- [];
-ttest_ssockt_csockt_small_tcp6(doc) ->
- [];
ttest_ssockt_csockt_small_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_small_tcp6,
@@ -47970,10 +46080,6 @@ ttest_ssockt_csockt_small_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csockt_small_tcpL(suite) ->
- [];
-ttest_ssockt_csockt_small_tcpL(doc) ->
- [];
ttest_ssockt_csockt_small_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csocko_small_tcpL,
@@ -47994,10 +46100,6 @@ ttest_ssockt_csockt_small_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csockt_medium_tcp4(suite) ->
- [];
-ttest_ssockt_csockt_medium_tcp4(doc) ->
- [];
ttest_ssockt_csockt_medium_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockt_medium_tcp4,
@@ -48018,10 +46120,6 @@ ttest_ssockt_csockt_medium_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csockt_medium_tcp6(suite) ->
- [];
-ttest_ssockt_csockt_medium_tcp6(doc) ->
- [];
ttest_ssockt_csockt_medium_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockt_medium_tcp6,
@@ -48042,10 +46140,6 @@ ttest_ssockt_csockt_medium_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csockt_medium_tcpL(suite) ->
- [];
-ttest_ssockt_csockt_medium_tcpL(doc) ->
- [];
ttest_ssockt_csockt_medium_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockt_medium_tcpL,
@@ -48066,10 +46160,6 @@ ttest_ssockt_csockt_medium_tcpL(Config) when is_list(Config) ->
%% Domain: inet
%%
-ttest_ssockt_csockt_large_tcp4(suite) ->
- [];
-ttest_ssockt_csockt_large_tcp4(doc) ->
- [];
ttest_ssockt_csockt_large_tcp4(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockt_large_tcp4,
@@ -48090,10 +46180,6 @@ ttest_ssockt_csockt_large_tcp4(Config) when is_list(Config) ->
%% Domain: inet6
%%
-ttest_ssockt_csockt_large_tcp6(suite) ->
- [];
-ttest_ssockt_csockt_large_tcp6(doc) ->
- [];
ttest_ssockt_csockt_large_tcp6(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockt_large_tcp6,
@@ -48114,10 +46200,6 @@ ttest_ssockt_csockt_large_tcp6(Config) when is_list(Config) ->
%% Domain: local
%%
-ttest_ssockt_csockt_large_tcpL(suite) ->
- [];
-ttest_ssockt_csockt_large_tcpL(doc) ->
- [];
ttest_ssockt_csockt_large_tcpL(Config) when is_list(Config) ->
Runtime = which_ttest_runtime(Config),
ttest_tcp(ttest_ssockt_csockt_large_tcpL,
@@ -48195,10 +46277,12 @@ ttest_tcp(TC,
%% On darwin we seem to hit the system limit(s)
%% much earlier.
%% The tests "mostly" work, but random cases fail
- %% (even on reasonably powerfull machines),
+ %% (even on reasonably powerful machines),
%% so its much simpler to just skip on darwin...
has_support_unix_domain_socket(),
- is_not_darwin();
+ is_not_darwin();
+ (Domain =:= inet) ->
+ has_support_ipv4();
(Domain =:= inet6) ->
has_support_ipv6();
true -> ok
@@ -48240,10 +46324,10 @@ ttest_tcp(InitState) ->
%% *** Init part ***
#{desc => "create node",
- cmd => fun(#{host := Host} = State) ->
- case start_node(Host, server) of
- {ok, Node} ->
- {ok, State#{node => Node}};
+ cmd => fun(State) ->
+ case ?CT_PEER() of
+ {ok, Peer, Node} ->
+ {ok, State#{peer => Peer, node => Node}};
{error, Reason} ->
{skip, Reason}
end
@@ -48321,9 +46405,9 @@ ttest_tcp(InitState) ->
{ok, State1}
end},
#{desc => "stop (server) node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
State#{node_stop => ok};
{error, Reason} ->
@@ -48384,10 +46468,14 @@ ttest_tcp(InitState) ->
%% *** Init part ***
#{desc => "create node",
- cmd => fun(#{host := Host} = State) ->
- case start_node(Host, client) of
- {ok, Node} ->
- {ok, State#{node => Node}};
+ cmd => fun(#{host := _Host} = State) ->
+ %% Because peer does not accept a host argument,
+ %% we can no longer start "remote" nodes...
+ %% Not that we actually did that. We always
+ %% used local-host.
+ case ?CT_PEER() of
+ {ok, Peer, Node} ->
+ {ok, State#{peer => Peer, node => Node}};
{error, Reason} ->
{skip, Reason}
end
@@ -48497,11 +46585,11 @@ ttest_tcp(InitState) ->
end
end},
#{desc => "stop (client) node",
- cmd => fun(#{node := Node} = State) ->
+ cmd => fun(#{peer := Peer} = State) ->
{ok,
- try stop_node(Node) of
+ try peer:stop(Peer) of
ok ->
- State#{node_stop => ok};
+ State#{node_stop3 => ok};
{error, Reason} ->
?SEV_EPRINT("Unexpected node stop result: "
"~n ~p", [Reason]),
@@ -48831,7 +46919,7 @@ ttest_report(Domain,
bytes = NumBytes,
msgs = NumMsgs},
%% If we run just one test case, the group init has never been run
- %% and therefor the ttest manager is not running (we also don't actually
+ %% and therefore the ttest manager is not running (we also don't actually
%% care about collecting reports in that case).
(catch global:send(?TTEST_MANAGER, Report)),
ok.
@@ -48978,13 +47066,10 @@ which_ttest_reports(Domain, MsgID) ->
%% Create several acceptor processes (processes that calls socket:accept/1)
%% and then a couple of clients connects to them without any problems.
%% TCP, IPv4.
-otp16359_maccept_tcp4(suite) ->
- [];
-otp16359_maccept_tcp4(doc) ->
- [];
otp16359_maccept_tcp4(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(otp16359_maccept_tcp4,
+ fun() -> has_support_ipv4() end,
fun() ->
InitState = #{domain => inet,
protocol => tcp},
@@ -48997,10 +47082,6 @@ otp16359_maccept_tcp4(_Config) when is_list(_Config) ->
%% Create several acceptor processes (processes that calls socket:accept/1)
%% and then a couple of clients connects to them without any problems.
%% TCP, IPv6.
-otp16359_maccept_tcp6(suite) ->
- [];
-otp16359_maccept_tcp6(doc) ->
- [];
otp16359_maccept_tcp6(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(otp16359_maccept_tcp6,
@@ -49017,10 +47098,6 @@ otp16359_maccept_tcp6(_Config) when is_list(_Config) ->
%% Create several acceptor processes (processes that calls socket:accept/1)
%% and then a couple of clients connects to them without any problems.
%% TCP, UNix Domain Sockets.
-otp16359_maccept_tcpL(suite) ->
- [];
-otp16359_maccept_tcpL(doc) ->
- [];
otp16359_maccept_tcpL(_Config) when is_list(_Config) ->
?TT(?SECS(10)),
tc_try(otp16359_maccept_tcpL,
@@ -49634,68 +47711,6 @@ otp16359_maccept_tcp(InitState) ->
Client1, Client2, Client3,
Tester]).
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%% This mechanism has only one purpose: So that we are able to kill
-%% the node-starter process if it takes to long. The node-starter
-%% runs on the local node.
-%% This crapola is hopefully temporary, but we have seen that on
-%% some platforms the ct_slave:start simply hangs.
--define(NODE_START_TIMEOUT, 10000).
-start_node(Host, NodeName) ->
- start_node(Host, NodeName, ?NODE_START_TIMEOUT).
-
-start_node(Host, NodeName, Timeout) ->
- {NodeStarter, _} =
- spawn_monitor(fun() -> exit(start_unique_node(Host, NodeName)) end),
- receive
- {'DOWN', _, process, NodeStarter, Result} ->
- %% i("Node Starter (~p) reported: ~p", [NodeStarter, Result]),
- Result
- after Timeout ->
- exit(NodeStarter, kill),
- {error, {failed_starting_node, NodeName, timeout}}
- end.
-
-start_unique_node(Host, NodeName) ->
- UniqueNodeName = f("~w_~w", [NodeName, erlang:system_time(millisecond)]),
- case do_start_node(Host, UniqueNodeName) of
- {ok, _} = OK ->
- global:sync(),
- %% i("Node ~p started: "
- %% "~n Nodes: ~p"
- %% "~n Logger: ~p"
- %% "~n Global Names: ~p",
- %% [NodeName, nodes(),
- %% global:whereis_name(socket_test_logger),
- %% global:registered_names()]),
- OK;
- {error, Reason, _} ->
- {error, Reason}
- end.
-
-do_start_node(Host, NodeName) when is_list(NodeName) ->
- do_start_node(Host, list_to_atom(NodeName));
-do_start_node(Host, NodeName) when is_atom(NodeName) ->
- Dir = filename:dirname(code:which(?MODULE)),
- Flags = "-pa " ++ Dir,
- Opts = [{monitor_master, true}, {erl_flags, Flags}],
- ct_slave:start(Host, NodeName, Opts).
-
-
-stop_node(Node) ->
- case ct_slave:stop(Node) of
- {ok, _} ->
- ok;
- {error, _} = ERROR ->
- ERROR
- end.
-
-
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
sock_open(Domain, Type, Proto) ->
@@ -49789,7 +47804,7 @@ ensure_unique_path(Path) ->
ensure_unique_path(Path, 1);
{error, _} ->
%% We assume this means it does not exist yet...
- %% If we have several process in paralell trying to create
+ %% If we have several process in parallel trying to create
%% (unique) path's, then we are in trouble. To *really* be
%% on the safe side we should have a (central) path registry...
encode_path(Path)
@@ -49878,6 +47893,7 @@ has_support_sock_bindtodevice() ->
has_support_socket_option_sock(bindtodevice).
has_support_sock_broadcast() ->
+ has_support_ipv4(),
has_support_socket_option_sock(broadcast),
case ?LIB:which_local_host_info(inet) of
{ok, #{flags := Flags}} ->
@@ -50180,11 +48196,24 @@ has_support_sctp() ->
%% The idea is that this function shall test if the test host has
-%% support for IPv6. If not, there is no point in running IPv6 tests.
+%% support for IPv4 or IPv6. If not, there is no point in running corresponding tests.
%% Currently we just skip.
+has_support_ipv4() ->
+ ?LIB:has_support_ipv4().
+
has_support_ipv6() ->
?LIB:has_support_ipv6().
+inet_or_inet6() ->
+ try
+ has_support_ipv4(),
+ inet
+ catch
+ throw:{skip, _Reason} ->
+ has_support_ipv6(),
+ inet6
+ end.
+
has_support_sendfile() ->
try socket:is_supported(sendfile) of
true ->
@@ -50409,19 +48438,19 @@ tc_try(Case, TCCondFun, TCFun)
end
catch
C:{skip, _} = SKIP when ((C =:= throw) orelse (C =:= exit)) ->
- %% i("catched[tc] (skip): "
+ %% i("caught[tc] (skip): "
%% "~n C: ~p"
%% "~n SKIP: ~p"
%% "~n", [C, SKIP]),
- tc_end( f("skipping(catched,~w,tc)", [C]) ),
+ tc_end( f("skipping(caught,~w,tc)", [C]) ),
SKIP;
C:E:S ->
- %% i("catched[tc]: "
+ %% i("caught[tc]: "
%% "~n C: ~p"
%% "~n E: ~p"
%% "~n S: ~p"
%% "~n", [C, E, S]),
- tc_end( f("failed(catched,~w,tc)", [C]) ),
+ tc_end( f("failed(caught,~w,tc)", [C]) ),
erlang:raise(C, E, S)
end;
{skip, _} = SKIP ->
@@ -50432,19 +48461,19 @@ tc_try(Case, TCCondFun, TCFun)
exit({tc_cond_failed, Reason})
catch
C:{skip, _} = SKIP when ((C =:= throw) orelse (C =:= exit)) ->
- %% i("catched[cond] (skip): "
+ %% i("caught[cond] (skip): "
%% "~n C: ~p"
%% "~n SKIP: ~p"
%% "~n", [C, SKIP]),
- tc_end( f("skipping(catched,~w,cond)", [C]) ),
+ tc_end( f("skipping(caught,~w,cond)", [C]) ),
SKIP;
C:E:S ->
- %% i("catched[cond]: "
+ %% i("caught[cond]: "
%% "~n C: ~p"
%% "~n E: ~p"
%% "~n S: ~p"
%% "~n", [C, E, S]),
- tc_end( f("failed(catched,~w,cond)", [C]) ),
+ tc_end( f("failed(caught,~w,cond)", [C]) ),
erlang:raise(C, E, S)
end.
@@ -50474,7 +48503,7 @@ tc_which_name() ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% This function prints various host info, which might be usefull
+%% This function prints various host info, which might be useful
%% when analyzing the test suite (results).
%% It also returns a "factor" that can be used when deciding
%% the load for some test cases (traffic). Such as run time or
@@ -51502,9 +49531,6 @@ sock_port(S) ->
{ok, #{}} -> undefined
end.
-l2a(S) when is_list(S) ->
- list_to_atom(S).
-
l2b(L) when is_list(L) ->
list_to_binary(L).
diff --git a/lib/kernel/test/socket_test_evaluator.erl b/lib/kernel/test/socket_test_evaluator.erl
index 70ab63bbc7..c2bd9d44b8 100644
--- a/lib/kernel/test/socket_test_evaluator.erl
+++ b/lib/kernel/test/socket_test_evaluator.erl
@@ -26,7 +26,7 @@
await_finish/1
]).
-%% Functions used by evaluators to interact with eachother
+%% Functions used by evaluators to interact with each other
-export([
%% Announce functions
%% (Send an announcement from one evaluator to another)
@@ -138,7 +138,7 @@ loop(ID, [#{desc := Desc,
%% Secondary skip
exit(E);
C:{skip, R} = E:_ when ((C =:= throw) orelse (C =:= exit)) ->
- ?SEV_IPRINT("command ~w skip catched(~w): "
+ ?SEV_IPRINT("command ~w skip caught(~w): "
"~n Reason: ~p", [ID, C, R]),
exit(E);
C:E:S ->
@@ -166,7 +166,7 @@ await_finish([], _OK, Fails) ->
Fails;
await_finish(Evs, OK, Fails) ->
receive
- %% Successfull termination of evaluator
+ %% Successful termination of evaluator
{'DOWN', _MRef, process, Pid, normal} ->
{Evs2, OK2, Fails2} = await_finish_normal(Pid, Evs, OK, Fails),
await_finish(Evs2, OK2, Fails2);
diff --git a/lib/kernel/test/socket_test_lib.erl b/lib/kernel/test/socket_test_lib.erl
index 56da2997e7..e7028dab3b 100644
--- a/lib/kernel/test/socket_test_lib.erl
+++ b/lib/kernel/test/socket_test_lib.erl
@@ -41,6 +41,7 @@
print/1, print/2,
%% Generic 'has support' test function(s)
+ has_support_ipv4/0,
has_support_ipv6/0,
which_local_host_info/1,
@@ -123,6 +124,14 @@ print(F, A) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+has_support_ipv4() ->
+ case which_local_addr(inet) of
+ {ok, _Addr} ->
+ ok;
+ {error, R1} ->
+ skip(f("Local Address eval failed: ~p", [R1]))
+ end.
+
has_support_ipv6() ->
case socket:is_supported(ipv6) of
true ->
diff --git a/lib/kernel/test/socket_test_ttest_tcp_server.erl b/lib/kernel/test/socket_test_ttest_tcp_server.erl
index d8cacd750c..6acad1f844 100644
--- a/lib/kernel/test/socket_test_ttest_tcp_server.erl
+++ b/lib/kernel/test/socket_test_ttest_tcp_server.erl
@@ -25,7 +25,7 @@
%%
%% There are three ways to run the server: active, passive or active-once.
%%
-%% The server does only two things; accept connnections and then reply
+%% The server does only two things; accept connections and then reply
%% to requests (actually the handler(s) does that). No timing or counting.
%% That is all done by the clients.
%%
@@ -415,7 +415,7 @@ handler_recv_message(#{mod := Mod,
%% When "active" (once or true), we receive one data "message", which may
%% contain any number of requests or only part of a request. Then we
%% process this data together with whatever we had "accumulated" from
-%% prevous messages. Each request will be extracted and replied to. If
+%% previous messages. Each request will be extracted and replied to. If
%% there is some data left, not enough for a complete request, we store
%% this in 'acc' (accumulate it).
handler_recv_message(#{mod := Mod,
diff --git a/lib/kernel/test/socket_test_ttest_tcp_socket.erl b/lib/kernel/test/socket_test_ttest_tcp_socket.erl
index d949e51da1..22788b3651 100644
--- a/lib/kernel/test/socket_test_ttest_tcp_socket.erl
+++ b/lib/kernel/test/socket_test_ttest_tcp_socket.erl
@@ -84,7 +84,7 @@ accept(#{sock := LSock, opts := #{async := Async,
ERROR
end.
-%% If a timeout has been explictly specified, then we do not use
+%% If a timeout has been explicitly specified, then we do not use
%% async here. We will pass it on to the reader process.
accept(#{sock := LSock, opts := #{async := Async,
method := Method} = Opts}, Timeout) ->
diff --git a/lib/megaco/Makefile b/lib/megaco/Makefile
index ebddcec5e7..5dc2955dd8 100644
--- a/lib/megaco/Makefile
+++ b/lib/megaco/Makefile
@@ -203,5 +203,6 @@ $(APP_TAR_FILE): $(APP_DIR)
(cd "$(APP_RELEASE_DIR)"; gtar zcf "$(subst $(space),\ ,$@)" $(DIR_NAME))
DIA_PLT_APPS=asn1 runtime_tools et debugger
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/megaco/configure b/lib/megaco/configure
index fac90552ce..1ca72e94d3 100755
--- a/lib/megaco/configure
+++ b/lib/megaco/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,42 +167,53 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -228,14 +221,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -253,18 +253,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -291,6 +292,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -308,6 +310,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -322,7 +332,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -331,7 +341,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -370,12 +380,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -387,18 +398,35 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -410,9 +438,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -439,7 +467,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -483,7 +511,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -497,6 +525,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -510,6 +542,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -575,50 +614,46 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
ac_unique_file="vsn.mk"
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
+ac_header_c_list=
ac_subst_vars='LTLIBOBJS
LIBOBJS
PERL
@@ -638,9 +673,6 @@ DED_GCC
DED_CC
DED_LD
DED_THR_DEFS
-EGREP
-GREP
-CPP
GETCONF
OTP_EXTRA_FLAGS
ERLANG_OSTYPE
@@ -659,6 +691,10 @@ CPPFLAGS
LDFLAGS
CFLAGS
CC
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -720,8 +756,7 @@ CC
CFLAGS
LDFLAGS
LIBS
-CPPFLAGS
-CPP'
+CPPFLAGS'
# Initialize some variables set by options.
@@ -790,8 +825,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -832,9 +865,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -858,9 +891,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1071,9 +1104,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1087,9 +1120,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1133,9 +1166,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1151,7 +1184,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1215,7 +1248,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1333,6 +1366,7 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1359,7 +1393,6 @@ Some influential environment variables:
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
- CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -1380,9 +1413,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1410,7 +1443,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1418,7 +1452,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1428,9 +1462,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1447,14 +1481,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1462,14 +1496,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1485,14 +1520,14 @@ fi
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1500,17 +1535,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1531,11 +1567,12 @@ fi
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
@@ -1543,16 +1580,9 @@ else
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ which can conflict with char $2 (); below. */
+#include <limits.h>
#undef $2
/* Override any GCC internal prototype to avoid an error.
@@ -1570,156 +1600,66 @@ choke me
#endif
int
-main ()
+main (void)
{
return $2 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
+if ac_fn_c_try_compile "$LINENO"
+then :
+ eval "$3=yes"
+else $as_nop
+ eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-} # ac_fn_c_check_header_mongrel
+} # ac_fn_c_check_header_compile
# ac_fn_c_try_run LINENO
# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
ac_fn_c_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
@@ -1729,25 +1669,26 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
@@ -1758,37 +1699,6 @@ fi
} # ac_fn_c_try_run
-# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists and can be compiled using the include files in
-# INCLUDES, setting the cache variable VAR accordingly.
-ac_fn_c_check_header_compile ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- eval "$3=yes"
-else
- eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_compile
-
# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
@@ -1803,7 +1713,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
@@ -1813,14 +1723,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=0 ac_mid=0
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -1830,9 +1741,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid; break
-else
+else $as_nop
as_fn_arith $ac_mid + 1 && ac_lo=$as_val
if test $ac_lo -le $ac_mid; then
ac_lo= ac_hi=
@@ -1840,14 +1752,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
@@ -1857,14 +1769,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=-1 ac_mid=-1
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
@@ -1874,9 +1787,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=$ac_mid; break
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
if test $ac_mid -le $ac_hi; then
ac_lo= ac_hi=
@@ -1884,14 +1798,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
ac_lo= ac_hi=
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
@@ -1899,7 +1813,7 @@ while test "x$ac_lo" != "x$ac_hi"; do
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -1909,12 +1823,13 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
@@ -1924,12 +1839,12 @@ esac
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.val", "w");
@@ -1957,9 +1872,10 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
+else $as_nop
ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -1971,14 +1887,34 @@ rm -f conftest.val
as_fn_set_status $ac_retval
} # ac_fn_c_compute_int
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -2011,8 +1947,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -2047,7 +1987,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -2082,11 +2022,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -2097,8 +2039,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -2122,7 +2064,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -2130,14 +2072,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -2145,15 +2087,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -2161,8 +2103,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -2176,63 +2118,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -2242,19 +2169,434 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${ERL_TOP}/make/autoconf"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2265,12 +2607,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2279,24 +2621,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2306,11 +2648,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2324,57 +2667,125 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_aux_dir=
-for ac_dir in ${ERL_TOP}/erts/autoconf; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in ${ERL_TOP}/erts/autoconf" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2393,21 +2804,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2426,11 +2838,118 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
else
- host_os=win32
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ # Adjust for local legacy windows hack...
+ case $host in #(
+ local-*-windows) :
+
+ host=win32
+ host_os=win32
+ host_vendor=
+ host_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $build in #(
+ local-*-windows) :
+
+ build=win32
+ build_os=win32
+ build_vendor=
+ build_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $target in #(
+ local-*-windows) :
+
+ target=win32
+ target_os=win32
+ target_vendor=
+ target_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+ if test "$cross_compiling" = "yes" -a "$build" = "$host"
+then :
+ as_fn_error $? "
+ Cross compiling with the same canonicalized 'host' value
+ as the canonicalized 'build' value.
+
+ We are cross compiling since the '--host=$host_alias'
+ and the '--build=$build_alias' arguments differ. When
+ cross compiling Erlang/OTP, also the canonicalized values of
+ the '--build' and the '--host' arguments *must* differ. The
+ canonicalized values of these arguments however both equals:
+ $host
+
+ You can check the canonical value by passing a value as
+ argument to the 'make/autoconf/config.sub' script.
+ " "$LINENO" 5
fi
+
+
+
+
+
+
+
+
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2439,11 +2958,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2451,11 +2971,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2466,11 +2990,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2479,11 +3003,12 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2491,11 +3016,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2506,11 +3035,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -2518,8 +3047,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2532,11 +3061,12 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2544,11 +3074,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2559,11 +3093,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2572,11 +3106,12 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2585,15 +3120,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2609,18 +3148,18 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2631,11 +3170,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2643,11 +3183,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2658,11 +3202,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2675,11 +3219,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2687,11 +3232,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2702,11 +3251,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2718,8 +3267,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2727,25 +3276,129 @@ esac
fi
fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -2755,7 +3408,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -2763,7 +3416,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -2775,9 +3428,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -2798,11 +3451,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
@@ -2819,7 +3473,7 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
@@ -2835,44 +3489,46 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
+else $as_nop
ac_file=''
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -2886,15 +3542,15 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -2903,7 +3559,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
@@ -2915,8 +3571,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -2924,10 +3580,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -2935,39 +3591,40 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -2981,11 +3638,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -2994,31 +3652,32 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3028,29 +3687,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
@@ -3059,57 +3722,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
+else $as_nop
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -3124,94 +3790,144 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
-
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
fi
ac_ext=c
@@ -3232,111 +3948,111 @@ MIXED_VSL=no
MIXED_VC=no
MIXED_MINGW=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
-$as_echo_n "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
+printf %s "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" != "xyes"; then
if test -x /usr/bin/msys-?.0.dll; then
CFLAGS="$CFLAGS -O2"
MIXED_MSYS=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
-$as_echo "MSYS and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
+printf "%s\n" "MSYS and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
MIXED_CYGWIN=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
-$as_echo "Cygwin and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
+printf "%s\n" "Cygwin and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /bin/wslpath; then
CFLAGS="$CFLAGS -O2"
MIXED_WSL=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
-$as_echo "WSL and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
+printf "%s\n" "WSL and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not within any known env" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$MIXED_MSYS" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
-$as_echo_n "checking for mixed cygwin and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
+printf %s "checking for mixed cygwin and native MinGW environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" = x"yes"; then
if test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with cygwin" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
-$as_echo_n "checking for mixed MSYS and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
+printf %s "checking for mixed MSYS and native MinGW environment... " >&6; }
if test "x$GCC" = x"yes"; then
if test -x /usr/bin/msys-=.0.dll; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with msys" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
-$as_echo_n "checking if we mix cygwin with any native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
+printf %s "checking if we mix cygwin with any native compiler... " >&6; }
if test "X$MIXED_CYGWIN" = "Xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
-$as_echo_n "checking if we mix msys with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
+printf %s "checking if we mix msys with another native compiler... " >&6; }
if test "X$MIXED_MSYS" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
-$as_echo_n "checking if we mix WSL with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
+printf %s "checking if we mix WSL with another native compiler... " >&6; }
if test "X$MIXED_WSL" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -3346,13 +4062,14 @@ fi
# Check whether --enable-megaco_reentrant_flex_scanner was given.
-if test "${enable_megaco_reentrant_flex_scanner+set}" = set; then :
+if test ${enable_megaco_reentrant_flex_scanner+y}
+then :
enableval=$enable_megaco_reentrant_flex_scanner; if test x${enable_megaco_reentrant_flex_scanner} = xno ; then
ENABLE_REENTRANT_MEGACO_FLEX_SCANNER=false
else
ENABLE_REENTRANT_MEGACO_FLEX_SCANNER=true
fi
-else
+else $as_nop
ENABLE_REENTRANT_MEGACO_FLEX_SCANNER=true
fi
@@ -3364,11 +4081,12 @@ for ac_prog in flex lex
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LEX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LEX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$LEX"; then
ac_cv_prog_LEX="$LEX" # Let the user override the test.
else
@@ -3376,11 +4094,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_LEX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3391,11 +4113,11 @@ fi
fi
LEX=$ac_cv_prog_LEX
if test -n "$LEX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5
-$as_echo "$LEX" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LEX" >&5
+printf "%s\n" "$LEX" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3403,15 +4125,26 @@ fi
done
test -n "$LEX" || LEX=":"
-if test "x$LEX" != "x:"; then
- cat >conftest.l <<_ACEOF
+ if test "x$LEX" != "x:"; then
+ cat >conftest.l <<_ACEOF
+%{
+#ifdef __cplusplus
+extern "C"
+#endif
+int yywrap(void);
+%}
%%
a { ECHO; }
b { REJECT; }
c { yymore (); }
d { yyless (1); }
e { /* IRIX 6.5 flex 2.5.4 underquotes its yyless argument. */
- yyless ((input () != 0)); }
+#ifdef __cplusplus
+ yyless ((yyinput () != 0));
+#else
+ yyless ((input () != 0));
+#endif
+ }
f { unput (yytext[0]); }
. { BEGIN INITIAL; }
%%
@@ -3419,101 +4152,144 @@ f { unput (yytext[0]); }
extern char *yytext;
#endif
int
+yywrap (void)
+{
+ return 1;
+}
+int
main (void)
{
- return ! yylex () + ! yywrap ();
+ return ! yylex ();
}
_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex output file root" >&5
+printf %s "checking for lex output file root... " >&6; }
+if test ${ac_cv_prog_lex_root+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ac_cv_prog_lex_root=unknown
{ { ac_try="$LEX conftest.l"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$LEX conftest.l") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking lex output file root" >&5
-$as_echo_n "checking lex output file root... " >&6; }
-if ${ac_cv_prog_lex_root+:} false; then :
- $as_echo_n "(cached) " >&6
-else
-
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } &&
if test -f lex.yy.c; then
ac_cv_prog_lex_root=lex.yy
elif test -f lexyy.c; then
ac_cv_prog_lex_root=lexyy
-else
- as_fn_error $? "cannot find output from $LEX; giving up" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5
-$as_echo "$ac_cv_prog_lex_root" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_root" >&5
+printf "%s\n" "$ac_cv_prog_lex_root" >&6; }
+if test "$ac_cv_prog_lex_root" = unknown
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot find output from $LEX; giving up on $LEX" >&5
+printf "%s\n" "$as_me: WARNING: cannot find output from $LEX; giving up on $LEX" >&2;}
+ LEX=: LEXLIB=
+fi
LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
-if test -z "${LEXLIB+set}"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking lex library" >&5
-$as_echo_n "checking lex library... " >&6; }
-if ${ac_cv_lib_lex+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test ${LEXLIB+y}
+then :
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for lex library" >&5
+printf %s "checking for lex library... " >&6; }
+if test ${ac_cv_lib_lex+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+
+ ac_save_LIBS="$LIBS"
+ ac_found=false
+ for ac_cv_lib_lex in 'none needed' -lfl -ll 'not found'; do
+ case $ac_cv_lib_lex in #(
+ 'none needed') :
+ ;; #(
+ 'not found') :
+ break ;; #(
+ *) :
+ LIBS="$ac_cv_lib_lex $ac_save_LIBS" ;; #(
+ *) :
+ ;;
+esac
- ac_save_LIBS=$LIBS
- ac_cv_lib_lex='none needed'
- for ac_lib in '' -lfl -ll; do
- LIBS="$ac_lib $ac_save_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
`cat $LEX_OUTPUT_ROOT.c`
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
- ac_cv_lib_lex=$ac_lib
+if ac_fn_c_try_link "$LINENO"
+then :
+ ac_found=:
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
- test "$ac_cv_lib_lex" != 'none needed' && break
+ if $ac_found; then
+ break
+ fi
done
- LIBS=$ac_save_LIBS
+ LIBS="$ac_save_LIBS"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5
-$as_echo "$ac_cv_lib_lex" >&6; }
- test "$ac_cv_lib_lex" != 'none needed' && LEXLIB=$ac_cv_lib_lex
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lex" >&5
+printf "%s\n" "$ac_cv_lib_lex" >&6; }
+ if test "$ac_cv_lib_lex" = 'not found'
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: required lex library not found; giving up on $LEX" >&5
+printf "%s\n" "$as_me: WARNING: required lex library not found; giving up on $LEX" >&2;}
+ LEX=: LEXLIB=
+elif test "$ac_cv_lib_lex" = 'none needed'
+then :
+ LEXLIB=''
+else $as_nop
+ LEXLIB=$ac_cv_lib_lex
fi
+fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5
-$as_echo_n "checking whether yytext is a pointer... " >&6; }
-if ${ac_cv_prog_lex_yytext_pointer+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+if test "$LEX" != :
+then :
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether yytext is a pointer" >&5
+printf %s "checking whether yytext is a pointer... " >&6; }
+if test ${ac_cv_prog_lex_yytext_pointer+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
# POSIX says lex can declare yytext either as a pointer or an array; the
# default is implementation-dependent. Figure out which it is, since
# not all implementations provide the %pointer and %array declarations.
ac_cv_prog_lex_yytext_pointer=no
-ac_save_LIBS=$LIBS
-LIBS="$LEXLIB $ac_save_LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#define YYTEXT_POINTER 1
`cat $LEX_OUTPUT_ROOT.c`
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_lex_yytext_pointer=yes
fi
-rm -f core conftest.err conftest.$ac_objext \
- conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_save_LIBS
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5
-$as_echo "$ac_cv_prog_lex_yytext_pointer" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_lex_yytext_pointer" >&5
+printf "%s\n" "$ac_cv_prog_lex_yytext_pointer" >&6; }
if test $ac_cv_prog_lex_yytext_pointer = yes; then
-$as_echo "#define YYTEXT_POINTER 1" >>confdefs.h
+printf "%s\n" "#define YYTEXT_POINTER 1" >>confdefs.h
+
+fi
fi
rm -f conftest.l $LEX_OUTPUT_ROOT.c
@@ -3553,25 +4329,25 @@ int main ( int argc, char * argv[] )
return 0;
}
EOF
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for reentrant capable flex" >&5
-$as_echo_n "checking for reentrant capable flex... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for reentrant capable flex" >&5
+printf %s "checking for reentrant capable flex... " >&6; }
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$flex_compile\""; } >&5
(eval $flex_compile) 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && test -s conftest.c; then
ENABLE_REENTRANT_MEGACO_FLEX_SCANNER=true
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
echo "configure: failed program was:" 1>&5
cat conftest.flex 1>&5
echo "configure: PATH was $PATH" 1>&5
ENABLE_REENTRANT_MEGACO_FLEX_SCANNER=false
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -3582,13 +4358,14 @@ fi
# Check whether --enable-megaco_flex_scanner_lineno was given.
-if test "${enable_megaco_flex_scanner_lineno+set}" = set; then :
+if test ${enable_megaco_flex_scanner_lineno+y}
+then :
enableval=$enable_megaco_flex_scanner_lineno; if test x${enable_megaco_flex_scanner_lineno} = xno ; then
ENABLE_MEGACO_FLEX_SCANNER_LINENO=false
else
ENABLE_MEGACO_FLEX_SCANNER_LINENO=true
fi
-else
+else $as_nop
ENABLE_MEGACO_FLEX_SCANNER_LINENO=true
fi
@@ -3613,43 +4390,50 @@ fi
if test "x$GCC" = xyes; then
# Treat certain GCC warnings as errors
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $CFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CFLAGS="-Werror=return-type $CFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
fi
# Check whether --enable-sanitizers was given.
-if test "${enable_sanitizers+set}" = set; then :
+if test ${enable_sanitizers+y}
+then :
enableval=$enable_sanitizers;
case "$enableval" in
no) sanitizers= ;;
@@ -3662,432 +4446,69 @@ LDFLAGS="$LDFLAGS $sanitizers"
fi
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
+done
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-fi
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-fi
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
fi
-done
-
-
-
NEED_NPTL_PTHREAD_H=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
-$as_echo_n "checking for native win32 threads... " >&6; }
-if test "X$host_os" = "Xwin32"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
+printf %s "checking for native win32 threads... " >&6; }
+if test "X$host_os" = "Xwin32"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
THR_DEFS="-DWIN32_THREADS"
THR_LIBS=
THR_LIB_NAME=win32_threads
THR_LIB_TYPE=win32_threads
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
THR_DEFS=
THR_LIBS=
THR_LIB_NAME=
THR_LIB_TYPE=posix_unknown
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
-$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+printf %s "checking for pthread_create in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4096,40 +4517,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_pthread_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_pthread_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = xyes
+then :
THR_LIBS="-lpthread"
fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
-$as_echo_n "checking for pthread_create in -lc_r... " >&6; }
-if ${ac_cv_lib_c_r_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
+printf %s "checking for pthread_create in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc_r $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4138,96 +4561,112 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_r_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_c_r_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
-$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
-if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_create" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_create" = xyes
+then :
THR_LIBS="-lc_r"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
-if test "x$ac_cv_func_pthread_create" = xyes; then :
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
+if test "x$ac_cv_func_pthread_create" = xyes
+then :
THR_LIBS="none_needed"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
-$as_echo_n "checking if the '-pthread' switch can be used... " >&6; }
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
+printf %s "checking if the '-pthread' switch can be used... " >&6; }
saved_cflags=$CFLAGS
CFLAGS="$CFLAGS -pthread"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
-main ()
+main (void)
{
pthread_create((void*)0,(void*)0,(void*)0,(void*)0);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
THR_DEFS="-pthread"
THR_LIBS="-pthread"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS=$saved_cflags
if test "x$THR_LIBS" != "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- fi
- if test "x$THR_LIBS" != "x"; then
+fi
+
+ if test "x$THR_LIBS" != "x"
+then :
+
THR_DEFS="$THR_DEFS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS"
THR_LIB_NAME=pthread
if test "x$THR_LIBS" = "xnone_needed"; then
THR_LIBS=
fi
- case $host_os in
- solaris*)
- THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS" ;;
- linux*)
+ case $host_os in #(
+ solaris*) :
+
+ THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS"
+ ;; #(
+ linux*) :
+
THR_DEFS="$THR_DEFS -D_POSIX_THREAD_SAFE_FUNCTIONS"
-if test "$cross_compiling" != "yes"; then
+if test "$cross_compiling" != "yes"
+then :
+
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -4235,11 +4674,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4251,23 +4694,26 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-else
+
+else $as_nop
+
host_getconf="$host_alias-getconf"
# Extract the first word of "$host_getconf", so it can be a program name with args.
set dummy $host_getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -4275,11 +4721,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="$host_getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4291,25 +4741,28 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""; then
+ if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""
+then :
+
GETCONF=
prfx="$erl_xcomp_sysroot"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}getconf", so it can be a program name with args.
set dummy ${ac_tool_prefix}getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_GETCONF="$GETCONF" # Let the user override the test with a path.
@@ -4320,11 +4773,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4336,11 +4793,11 @@ esac
fi
GETCONF=$ac_cv_path_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4349,11 +4806,12 @@ if test -z "$ac_cv_path_GETCONF"; then
ac_pt_GETCONF=$GETCONF
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $ac_pt_GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_GETCONF="$ac_pt_GETCONF" # Let the user override the test with a path.
@@ -4364,11 +4822,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4380,11 +4842,11 @@ esac
fi
ac_pt_GETCONF=$ac_cv_path_ac_pt_GETCONF
if test -n "$ac_pt_GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
-$as_echo "$ac_pt_GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
+printf "%s\n" "$ac_pt_GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_pt_GETCONF" = x; then
@@ -4392,8 +4854,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
GETCONF=$ac_pt_GETCONF
@@ -4402,11 +4864,13 @@ else
GETCONF="$ac_cv_path_GETCONF"
fi
- fi
+
+fi
+
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
-$as_echo_n "checking for Native POSIX Thread Library... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
+printf %s "checking for Native POSIX Thread Library... " >&6; }
libpthr_vsn=`$GETCONF GNU_LIBPTHREAD_VERSION 2>/dev/null`
if test $? -eq 0; then
case "$libpthr_vsn" in
@@ -4422,24 +4886,28 @@ $as_echo_n "checking for Native POSIX Thread Library... " >&6; }
else
nptl=no
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
-$as_echo "$nptl" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
+printf "%s\n" "$nptl" >&6; }
if test $nptl = cross; then
nptl=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
-$as_echo "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
+printf "%s\n" "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
fi
- if test $nptl = yes; then
+ if test $nptl = yes
+then :
+
THR_LIB_TYPE=posix_nptl
need_nptl_incldir=no
- ac_fn_c_check_header_mongrel "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_nptl_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_nptl_pthread_h" = xyes
+then :
need_nptl_incldir=yes
NEED_NPTL_PTHREAD_H=yes
fi
+ if test $need_nptl_incldir = yes
+then :
- if test $need_nptl_incldir = yes; then
# Ahh...
nptl_path="$C_INCLUDE_PATH:$CPATH"
if test X$cross_compiling != Xyes; then
@@ -4460,13 +4928,13 @@ fi
IFS=$save_ifs
nptl_incldir=
for dir in $nptl_ws_path; do
- as_ac_Header=`$as_echo "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ as_ac_Header=`printf "%s\n" "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
nptl_incldir=$dir/nptl
fi
-
if test "x$nptl_incldir" != "x"; then
THR_DEFS="$THR_DEFS -isystem $nptl_incldir"
break
@@ -4475,38 +4943,43 @@ fi
if test "x$nptl_incldir" = "x"; then
as_fn_error $? "Failed to locate nptl system include directory" "$LINENO" 5
fi
- fi
- fi
- ;;
- *) ;;
- esac
+
+fi
+
+fi
+ ;; #(
+ *) :
+ ;;
+esac
saved_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $THR_DEFS"
- ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
-$as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h
fi
-
- ac_fn_c_check_header_mongrel "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes
+then :
\
-$as_echo "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
fi
-
CPPFLAGS=$saved_cppflags
- fi
+
+fi
+
fi
@@ -4550,181 +5023,253 @@ case "$host_cpu" in
esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Wdeclaration-after-statement to DED_WARN_FLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WARN_FLAGS="-Wdeclaration-after-statement $DED_WARN_FLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=return-type $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=implicit to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=implicit $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=implicit $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=undef to DED_WERRORFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=undef $DED_WERRORFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_WERRORFLAGS="-Werror=undef $DED_WERRORFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
DED_SYS_INCLUDE="-I${ERL_TOP}/erts/emulator/beam -I${ERL_TOP}/erts/include -I${ERL_TOP}/erts/include/$host -I${ERL_TOP}/erts/include/internal -I${ERL_TOP}/erts/include/internal/$host -I${ERL_TOP}/erts/emulator/sys/$DED_OSTYPE -I${ERL_TOP}/erts/emulator/sys/common"
DED_INCLUDE=$DED_SYS_INCLUDE
DED_CFLAGS="$CFLAGS $CPPFLAGS $DED_CFLAGS"
-if test "x$GCC" = xyes; then
+if test "x$GCC" = xyes
+then :
+
# Use -fno-common for gcc, that is link error if multiple definitions of
# global variables are encountered. This is ISO C compliant.
# Until version 10, gcc has had -fcommon as default, which allows and merges
# such dubious duplicates.
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-common to DED_CFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-fno-common $DED_CFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
DED_CFLAGS="-fno-common $DED_CFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+
+
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-strict-aliasing to DED_CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-strict-aliasing to DED_CFLAGS (via CFLAGS)... " >&6; }
+ saved_CFLAGS=$CFLAGS;
+ CFLAGS="-fno-strict-aliasing $DED_CFLAGS";
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ can_enable_flag=true
+else $as_nop
+ can_enable_flag=false
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS=$saved_CFLAGS;
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+ DED_CFLAGS="-fno-strict-aliasing $DED_CFLAGS"
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
DED_STATIC_CFLAGS="$DED_CFLAGS"
DED_CFLAGS="$DED_CFLAGS -fPIC"
# Remove -fPIE and -fno-PIE
DED_CFLAGS=`echo $DED_CFLAGS | sed 's/-f\(no-\)\?PIE//g'`
+
fi
DED_EXT=so
@@ -4811,17 +5356,19 @@ case $host_os in
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -4830,14 +5377,12 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
case "$ac_cv_sizeof_void_p" in
@@ -4904,11 +5449,12 @@ test "$DED_LDFLAGS_CONFTEST" != "" || DED_LDFLAGS_CONFTEST="$DED_LDFLAGS"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_DED_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_DED_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$DED_LD"; then
ac_cv_prog_DED_LD="$DED_LD" # Let the user override the test.
else
@@ -4916,11 +5462,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_DED_LD="${ac_tool_prefix}ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4931,11 +5481,11 @@ fi
fi
DED_LD=$ac_cv_prog_DED_LD
if test -n "$DED_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
-$as_echo "$DED_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
+printf "%s\n" "$DED_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4944,11 +5494,12 @@ if test -z "$ac_cv_prog_DED_LD"; then
ac_ct_DED_LD=$DED_LD
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_DED_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_DED_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_DED_LD"; then
ac_cv_prog_ac_ct_DED_LD="$ac_ct_DED_LD" # Let the user override the test.
else
@@ -4956,11 +5507,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_DED_LD="ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4971,11 +5526,11 @@ fi
fi
ac_ct_DED_LD=$ac_cv_prog_ac_ct_DED_LD
if test -n "$ac_ct_DED_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DED_LD" >&5
-$as_echo "$ac_ct_DED_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DED_LD" >&5
+printf "%s\n" "$ac_ct_DED_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_DED_LD" = x; then
@@ -4983,8 +5538,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
DED_LD=$ac_ct_DED_LD
@@ -4995,37 +5550,37 @@ fi
test "$DED_LD" != "false" || as_fn_error $? "No linker found" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for static compiler flags" >&5
-$as_echo_n "checking for static compiler flags... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for static compiler flags" >&5
+printf %s "checking for static compiler flags... " >&6; }
DED_STATIC_CFLAGS="$DED_WERRORFLAGS $DED_WFLAGS $DED_THR_DEFS $DED_STATIC_CFLAGS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_STATIC_CFLAGS" >&5
-$as_echo "$DED_STATIC_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for basic compiler flags for loadable drivers" >&5
-$as_echo_n "checking for basic compiler flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_STATIC_CFLAGS" >&5
+printf "%s\n" "$DED_STATIC_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for basic compiler flags for loadable drivers" >&5
+printf %s "checking for basic compiler flags for loadable drivers... " >&6; }
DED_BASIC_CFLAGS=$DED_CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
-$as_echo "$DED_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compiler flags for loadable drivers" >&5
-$as_echo_n "checking for compiler flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
+printf "%s\n" "$DED_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for compiler flags for loadable drivers" >&5
+printf %s "checking for compiler flags for loadable drivers... " >&6; }
DED_CFLAGS="$DED_WERRORFLAGS $DED_WARN_FLAGS $DED_THR_DEFS $DED_CFLAGS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
-$as_echo "$DED_CFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker for loadable drivers" >&5
-$as_echo_n "checking for linker for loadable drivers... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
-$as_echo "$DED_LD" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable drivers" >&5
-$as_echo_n "checking for linker flags for loadable drivers... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LDFLAGS" >&5
-$as_echo "$DED_LDFLAGS" >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 'runtime library path' linker flag" >&5
-$as_echo_n "checking for 'runtime library path' linker flag... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_CFLAGS" >&5
+printf "%s\n" "$DED_CFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker for loadable drivers" >&5
+printf %s "checking for linker for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD" >&5
+printf "%s\n" "$DED_LD" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for linker flags for loadable drivers" >&5
+printf %s "checking for linker flags for loadable drivers... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LDFLAGS" >&5
+printf "%s\n" "$DED_LDFLAGS" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for 'runtime library path' linker flag" >&5
+printf %s "checking for 'runtime library path' linker flag... " >&6; }
if test "x$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" != "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&5
-$as_echo "$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&5
+printf "%s\n" "$DED_LD_FLAG_RUNTIME_LIBRARY_PATH" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
-$as_echo "not found" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+printf "%s\n" "not found" >&6; }
fi
@@ -5050,11 +5605,12 @@ fi
# Extract the first word of "perl", so it can be a program name with args.
set dummy perl; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PERL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PERL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$PERL"; then
ac_cv_prog_PERL="$PERL" # Let the user override the test.
else
@@ -5062,11 +5618,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_PERL="perl"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5078,11 +5638,11 @@ fi
fi
PERL=$ac_cv_prog_PERL
if test -n "$PERL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+printf "%s\n" "$PERL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5119,8 +5679,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -5150,15 +5710,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -5172,8 +5732,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -5226,7 +5786,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -5242,8 +5802,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -5266,14 +5826,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -5283,46 +5845,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -5331,13 +5893,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -5346,8 +5901,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -5359,30 +5918,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -5395,13 +5934,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -5428,18 +5968,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -5451,12 +5993,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -5487,7 +6030,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -5509,6 +6052,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -5522,6 +6069,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -5563,7 +6116,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -5572,7 +6125,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -5635,7 +6188,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -5684,14 +6237,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -5728,21 +6283,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -5770,7 +6325,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -5784,7 +6339,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -5809,7 +6364,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -6037,7 +6592,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -6045,17 +6600,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -6072,7 +6627,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -6096,9 +6651,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -6151,8 +6706,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -6194,9 +6749,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -6243,8 +6798,8 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
ac_config_files="$ac_config_files src/flex/$host/Makefile:src/flex/Makefile.in"
@@ -6276,8 +6831,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -6307,15 +6862,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -6329,8 +6884,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -6383,7 +6938,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -6399,8 +6954,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -6423,14 +6978,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -6440,46 +6997,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -6488,13 +7045,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -6503,8 +7053,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -6516,30 +7070,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -6552,13 +7086,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -6585,18 +7120,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -6608,12 +7145,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -6644,7 +7182,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -6666,6 +7204,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -6679,6 +7221,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -6720,7 +7268,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -6729,7 +7277,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -6792,7 +7340,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -6841,14 +7389,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -6885,21 +7435,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -6927,7 +7477,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -6941,7 +7491,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -6967,7 +7517,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -7195,7 +7745,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -7203,17 +7753,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -7230,7 +7780,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -7254,9 +7804,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -7309,8 +7859,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -7352,9 +7902,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -7401,8 +7951,9 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
diff --git a/lib/megaco/configure.in b/lib/megaco/configure.ac
index 789fbbed04..ce65e54a85 100644
--- a/lib/megaco/configure.in
+++ b/lib/megaco/configure.ac
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. -*-m4-*-
dnl
dnl %CopyrightBegin%
dnl
-dnl Copyright Ericsson AB 2001-2020. All Rights Reserved.
+dnl Copyright Ericsson AB 2001-2021. All Rights Reserved.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
@@ -23,15 +23,15 @@ dnl define([AC_CACHE_LOAD], )dnl
dnl define([AC_CACHE_SAVE], )dnl
-AC_INIT(vsn.mk)
+AC_INIT
+AC_CONFIG_SRCDIR([vsn.mk])
+AC_PREREQ([2.71])
-AC_CONFIG_AUX_DIRS(${ERL_TOP}/erts/autoconf)
+m4_include([otp.m4])
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- AC_CANONICAL_HOST
-else
- host_os=win32
-fi
+AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf])
+
+ERL_CANONICAL_SYSTEM_TYPE
dnl ----------------------------------------------------------------------
dnl Checks for programs.
@@ -42,7 +42,7 @@ AC_PROG_CC
LM_WINDOWS_ENVIRONMENT
AC_DEFUN(ERL_REENTRANT_FLEX,
-[flex_compile='$LEX -R -Pconftest -oconftest.c conftest.flex 1>&AC_FD_CC'
+[flex_compile='$LEX -R -Pconftest -oconftest.c conftest.flex 1>&AS_MESSAGE_LOG_FD'
changequote(253, 273)dnl
cat > conftest.flex <<EOF
/*
@@ -79,9 +79,9 @@ if AC_TRY_EVAL(flex_compile) && test -s conftest.c; then
$1])
AC_MSG_RESULT([yes])
else
- echo "configure: failed program was:" 1>&AC_FD_CC
- cat conftest.flex 1>&AC_FD_CC
- echo "configure: PATH was $PATH" 1>&AC_FD_CC
+ echo "configure: failed program was:" 1>&AS_MESSAGE_LOG_FD
+ cat conftest.flex 1>&AS_MESSAGE_LOG_FD
+ echo "configure: PATH was $PATH" 1>&AS_MESSAGE_LOG_FD
ifelse([$2], , , [
$2
])dnl
@@ -108,7 +108,7 @@ dnl
dnl flex is needed by megaco. lex wont do!
dnl
-AC_PROG_LEX
+AC_PROG_LEX([noyywrap])
if test "$LEX" != flex; then
ENABLE_MEGACO_FLEX_SCANNER=false
else
@@ -189,6 +189,8 @@ if test "$PERL" = no_perl; then
AC_MSG_ERROR([Perl is required to build the flex scanner!])
fi
-AC_OUTPUT(examples/meas/Makefile:examples/meas/Makefile.in)
-AC_OUTPUT(src/flex/$host/Makefile:src/flex/Makefile.in)
+AC_CONFIG_FILES([examples/meas/Makefile:examples/meas/Makefile.in])
+AC_OUTPUT
+AC_CONFIG_FILES([src/flex/$host/Makefile:src/flex/Makefile.in])
+AC_OUTPUT
diff --git a/lib/megaco/examples/meas/Makefile.in b/lib/megaco/examples/meas/Makefile.in
index 4ff5cd2703..1dc3361167 100644
--- a/lib/megaco/examples/meas/Makefile.in
+++ b/lib/megaco/examples/meas/Makefile.in
@@ -95,8 +95,8 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/megaco/examples/simple/Makefile b/lib/megaco/examples/simple/Makefile
index 00c0b7e65e..6dab19e25f 100644
--- a/lib/megaco/examples/simple/Makefile
+++ b/lib/megaco/examples/simple/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2016. All Rights Reserved.
+# Copyright Ericsson AB 2001-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -105,8 +105,8 @@ endif
# ----------------------------------------------------
opt: $(TARGET_FILES)
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/megaco/src/app/Makefile b/lib/megaco/src/app/Makefile
index ab45548099..c681b88428 100644
--- a/lib/megaco/src/app/Makefile
+++ b/lib/megaco/src/app/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2007-2016. All Rights Reserved.
+# Copyright Ericsson AB 2007-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -74,8 +74,8 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/megaco/src/binary/Makefile b/lib/megaco/src/binary/Makefile
index 9e33fe3ae5..9ecb649f0c 100644
--- a/lib/megaco/src/binary/Makefile
+++ b/lib/megaco/src/binary/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2020. All Rights Reserved.
+# Copyright Ericsson AB 2000-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -100,8 +100,8 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: prebuild $(TARGET_FILES)
diff --git a/lib/megaco/src/engine/Makefile b/lib/megaco/src/engine/Makefile
index 869b516b05..cc4974e09d 100644
--- a/lib/megaco/src/engine/Makefile
+++ b/lib/megaco/src/engine/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2016. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -74,8 +74,8 @@ ERL_COMPILE_FLAGS += \
$(TARGET_FILES): $(BEHAVIOUR_TARGET_FILES)
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/megaco/src/flex/Makefile.in b/lib/megaco/src/flex/Makefile.in
index cd409fa54f..3649e2c392 100644
--- a/lib/megaco/src/flex/Makefile.in
+++ b/lib/megaco/src/flex/Makefile.in
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2020. All Rights Reserved.
+# Copyright Ericsson AB 2001-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -187,9 +187,9 @@ endif
# ----------------------------------------------------
ifeq ($(ENABLE_MEGACO_FLEX_SCANNER),true)
-debug opt: $(TARGET_FILES) $(C_TARGETS) solibs
+$(TYPES): $(TARGET_FILES) $(C_TARGETS) solibs
else
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
endif
clean:
diff --git a/lib/megaco/src/tcp/Makefile b/lib/megaco/src/tcp/Makefile
index d07db3fa4b..ef4232244a 100644
--- a/lib/megaco/src/tcp/Makefile
+++ b/lib/megaco/src/tcp/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2016. All Rights Reserved.
+# Copyright Ericsson AB 2000-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -67,8 +67,8 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/megaco/src/text/Makefile b/lib/megaco/src/text/Makefile
index bb5f80403b..6872b0ec04 100644
--- a/lib/megaco/src/text/Makefile
+++ b/lib/megaco/src/text/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2020. All Rights Reserved.
+# Copyright Ericsson AB 2000-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -81,8 +81,8 @@ endif
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/megaco/src/udp/Makefile b/lib/megaco/src/udp/Makefile
index 028a63e98e..5699c3e952 100644
--- a/lib/megaco/src/udp/Makefile
+++ b/lib/megaco/src/udp/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2016. All Rights Reserved.
+# Copyright Ericsson AB 2000-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -66,8 +66,8 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/megaco/test/Makefile b/lib/megaco/test/Makefile
index 0ea33883db..57437e50a6 100644
--- a/lib/megaco/test/Makefile
+++ b/lib/megaco/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2020. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -128,7 +128,7 @@ endif
# Targets
# ----------------------------------------------------
-tests debug opt: $(BUILDTARGET)
+tests $(TYPES): $(BUILDTARGET)
targets: $(TARGET_FILES)
diff --git a/lib/megaco/test/megaco_examples_SUITE.erl b/lib/megaco/test/megaco_examples_SUITE.erl
index dc3dfb7967..6c1df0d4ec 100644
--- a/lib/megaco/test/megaco_examples_SUITE.erl
+++ b/lib/megaco/test/megaco_examples_SUITE.erl
@@ -342,12 +342,16 @@ simple(suite) ->
[];
simple(Config) when is_list(Config) ->
process_flag(trap_exit, true),
- d("simple -> create node name(s)"),
- [_Local, MGC, MG] = ?LIB:mk_nodes(3), %% Grrr
+
+ d("simple -> create (3) node name(s) (includes the own node)"),
+ %% We actually need two (nodes), but the function includes the own node,
+ %% so we need to ask for one more.
+ [_Local, MGC, MG] = ?MK_NODES(3),
Nodes = [MGC, MG],
- d("simple -> start nodes"),
- ok = ?LIB:start_nodes(Nodes, ?MODULE, ?LINE),
+ d("simple -> start nodes: "
+ "~n ~p", [Nodes]),
+ ok = ?START_NODES(Nodes, true),
MGCId = "MGC",
MGId = "MG",
@@ -472,11 +476,9 @@ simple(Config) when is_list(Config) ->
ok
end,
- d("simple -> stop ~p", [MGC]),
- slave:stop(MGC),
-
- d("simple -> stop ~p", [MG]),
- slave:stop(MG),
+ d("simple -> stop nodes"
+ "~n ~p", [Nodes]),
+ ?STOP_NODES(Nodes),
d("simple -> done", []),
ok.
diff --git a/lib/megaco/test/megaco_test_lib.erl b/lib/megaco/test/megaco_test_lib.erl
index 8e7c3bec68..6f9b31ca7d 100644
--- a/lib/megaco/test/megaco_test_lib.erl
+++ b/lib/megaco/test/megaco_test_lib.erl
@@ -2234,20 +2234,24 @@ lookup_config(Key,Config) ->
[]
end.
-mk_nodes(N) when (N > 0) ->
- mk_nodes(N, []).
-mk_nodes(0, Nodes) ->
+mk_nodes(1 = _N) ->
+ [node()];
+mk_nodes(N) when is_integer(N) andalso (N > 1) ->
+ OwnNode = node(),
+ [Name0, Host] = node_to_name_and_host(OwnNode),
+ Uniq = erlang:unique_integer([positive]),
+ Name =
+ list_to_atom(lists:concat([Name0, "_", integer_to_list(Uniq)])),
+ [OwnNode | mk_nodes(N-1, Name, Host, [])].
+
+mk_nodes(0, _BaseName, _Host, Nodes) ->
Nodes;
-mk_nodes(N, []) ->
- mk_nodes(N - 1, [node()]);
-mk_nodes(N, Nodes) when N > 0 ->
- Head = hd(Nodes),
- [Name, Host] = node_to_name_and_host(Head),
- Nodes ++ [mk_node(I, Name, Host) || I <- lists:seq(1, N)].
-
-mk_node(N, Name, Host) ->
- list_to_atom(lists:concat([Name ++ integer_to_list(N) ++ "@" ++ Host])).
+mk_nodes(N, BaseName, Host, Nodes) ->
+ mk_nodes(N-1, BaseName, Host, [mk_node(N, BaseName, Host)|Nodes]).
+
+mk_node(N, BaseName, Host) ->
+ list_to_atom(lists:concat([BaseName, "_", integer_to_list(N), "@", Host])).
%% Returns [Name, Host]
node_to_name_and_host(Node) ->
@@ -2310,23 +2314,33 @@ start_node(Node, Force, Retry, File, Line) ->
pang ->
[Name, Host] = node_to_name_and_host(Node),
Pa = filename:dirname(code:which(?MODULE)),
- Args = " -pa " ++ Pa ++
+ Args0 = " -pa " ++ Pa ++
" -s " ++ atom_to_list(megaco_test_sys_monitor) ++ " start" ++
" -s global sync",
+ Args = string:tokens(Args0, [$\ ]),
p("try start node ~p", [Node]),
- case slave:start_link(Host, Name, Args) of
- {ok, NewNode} when NewNode =:= Node ->
+ PeerOpts = #{name => Name,
+ host => Host,
+ args => Args},
+ case peer:start(PeerOpts) of
+ {ok, _Peer, NewNode} when NewNode =:= Node ->
p("node ~p started - now set path, cwd and sync", [Node]),
- Path = code:get_path(),
+ Path = code:get_path(),
{ok, Cwd} = file:get_cwd(),
- true = rpc:call(Node, code, set_path, [Path]),
- ok = rpc:call(Node, file, set_cwd, [Cwd]),
- true = rpc:call(Node, code, set_path, [Path]),
- {_, []} = rpc:multicall(global, sync, []),
+ true = rpc:call(Node, code, set_path, [Path]),
+ ok = rpc:call(Node, file, set_cwd, [Cwd]),
+ true = rpc:call(Node, code, set_path, [Path]),
+ {_, []} = rpc:multicall(global, sync, []),
ok;
+ {ok, _Peer, NewNode} ->
+ e("wrong node started: "
+ "~n Expected: ~p"
+ "~n Got: ~p", [Node, NewNode]),
+ stop_node(NewNode),
+ fatal_skip({invalid_node_start, NewNode, Node}, File, Line);
Other ->
e("failed starting node ~p: ~p", [Node, Other]),
- fatal_skip({cannot_start_node, Node, Other}, File, Line)
+ fatal_skip({cannot_start_node, Node, Other}, File, Line)
end
end.
diff --git a/lib/megaco/test/megaco_test_lib.hrl b/lib/megaco/test/megaco_test_lib.hrl
index 43a1bfd0f8..add30a73d6 100644
--- a/lib/megaco/test/megaco_test_lib.hrl
+++ b/lib/megaco/test/megaco_test_lib.hrl
@@ -95,6 +95,7 @@
?LIB:prepare_test_case([init, {stop_app, megaco}],
N, Config, ?FILE, ?LINE)).
+-define(MK_NODES(N), ?LIB:mk_nodes(N)).
-define(START_NODE(Node, Force), ?LIB:start_node(Node, Force, ?FILE, ?LINE)).
-define(START_NODE(Node), ?START_NODE(Node, false)).
-define(START_NODES(Nodes, Force), ?LIB:start_nodes(Nodes, Force, ?FILE, ?LINE)).
diff --git a/lib/mnesia/doc/src/Mnesia_chap3.xmlsrc b/lib/mnesia/doc/src/Mnesia_chap3.xmlsrc
index 41c85d97f1..eb25f57787 100644
--- a/lib/mnesia/doc/src/Mnesia_chap3.xmlsrc
+++ b/lib/mnesia/doc/src/Mnesia_chap3.xmlsrc
@@ -177,7 +177,7 @@ Transformer =
which identifies the particular record in that table. The
combination of the table name and a key is an arity two tuple
<c>{Tab, Key}</c> called the OID. For more information about
- the relationship beween the record name and the table name, see
+ the relationship between the record name and the table name, see
<seeguide marker="Mnesia_chap4#recordnames_tablenames">Record Names versus Table Names</seeguide>.
</p>
<p>What makes the <c>Mnesia</c> data model an extended relational model
diff --git a/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc b/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
index fd9bea8323..937caf10f0 100644
--- a/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
+++ b/lib/mnesia/doc/src/Mnesia_chap4.xmlsrc
@@ -520,10 +520,10 @@
<list type="ordered">
<item>It is much more efficient.
</item>
- <item>The funcion
+ <item>The function
<seemfa marker="mnesia#dirty_update_counter/2">dirty_update_counter/2</seemfa>
is performed as an atomic operation although it is not protected
- by a transaction. Therfore no table update is lost if two
+ by a transaction. Therefore no table update is lost if two
processes simultaneously execute the function
<c>dirty_update_counter/2</c>.
</item>
diff --git a/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc b/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc
index ef5e136446..3ef8d08220 100644
--- a/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc
+++ b/lib/mnesia/doc/src/Mnesia_chap7.xmlsrc
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2020</year>
+ <year>1997</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -720,7 +720,7 @@ dets:close(N).</pre>
</item>
<item><c>Source</c> and <c>Target</c> are opaque data used
exclusively by the modules <c>SourceMod</c> and
- <c>TargetMod</c> for initializing the backup medias.
+ <c>TargetMod</c> for initializing the backup media.
</item>
<item><c>Acc</c> is an initial accumulator value.
</item>
diff --git a/lib/mnesia/doc/src/mnesia.xml b/lib/mnesia/doc/src/mnesia.xml
index 9791a57610..b79398f302 100644
--- a/lib/mnesia/doc/src/mnesia.xml
+++ b/lib/mnesia/doc/src/mnesia.xml
@@ -1153,7 +1153,7 @@ mnesia:create_table(person,
or negative number. However, counters can never become less
than zero. There are two significant differences between
this function and the action of first reading the record,
- performing the arithmetics, and then writing the record:</p>
+ performing the arithmetic, and then writing the record:</p>
<list type="bulleted">
<item>It is much more efficient.
</item>
diff --git a/lib/mnesia/examples/Makefile b/lib/mnesia/examples/Makefile
index 5580f0bdcb..e5eb2de940 100644
--- a/lib/mnesia/examples/Makefile
+++ b/lib/mnesia/examples/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2016. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -66,7 +66,7 @@ EBIN = .
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES) *~
diff --git a/lib/mnesia/examples/bench/README b/lib/mnesia/examples/bench/README
index b8209b19b8..52225c5f7d 100644
--- a/lib/mnesia/examples/bench/README
+++ b/lib/mnesia/examples/bench/README
@@ -45,7 +45,7 @@ In order to be able to automatically start remote Erlang nodes,
you need to:
- put the $ERL_TOP/bin directory in your path on all nodes
- - bind IP adresses to hostnames (e.g via DNS or /etc/hosts)
+ - bind IP addresses to hostnames (e.g via DNS or /etc/hosts)
- enable usage of ssh so it does not prompt for password
If you cannot achieve this, it is possible to run the benchmark
@@ -79,11 +79,11 @@ Given some arguments such as
Args = ['YourConfigFile', {statistics_detail, debug}].
-the invokation of
+the invocation of
bench:run(Args).
-is equivivalent with:
+is equivalent with:
SlaveNodes = bench:start_all(Args).
bench:populate(Args).
diff --git a/lib/mnesia/examples/mnesia_tpcb.erl b/lib/mnesia/examples/mnesia_tpcb.erl
index fb39ee321d..6a78d4f1d0 100644
--- a/lib/mnesia/examples/mnesia_tpcb.erl
+++ b/lib/mnesia/examples/mnesia_tpcb.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@
%% a database system.
%%
%% The definition of the TPC-B states lots of detailed rules and
-%% conditions that must be fullfilled, e.g. how the ACID (atomicity,
+%% conditions that must be fulfilled, e.g. how the ACID (atomicity,
%% consistency, isolation and durability) properties are verified,
%% how the random numbers must be distributed, minimum sizes of
%% the different types of records, minimum duration of the benchmark,
diff --git a/lib/mnesia/include/Makefile b/lib/mnesia/include/Makefile
index 6eed4d716f..1c96482d87 100644
--- a/lib/mnesia/include/Makefile
+++ b/lib/mnesia/include/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1998-2016. All Rights Reserved.
+# Copyright Ericsson AB 1998-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -42,7 +42,7 @@ INCLUDE_FILES =
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/mnesia/src/Makefile b/lib/mnesia/src/Makefile
index dce7a359d3..72aa054fb3 100644
--- a/lib/mnesia/src/Makefile
+++ b/lib/mnesia/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -106,8 +106,8 @@ ERL_COMPILE_FLAGS += \
opt: $(TARGET_FILES)
-debug:
- @${MAKE} TYPE=debug
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/mnesia/src/mnesia.erl b/lib/mnesia/src/mnesia.erl
index 35e2d8dd10..bb5858b3f8 100644
--- a/lib/mnesia/src/mnesia.erl
+++ b/lib/mnesia/src/mnesia.erl
@@ -513,7 +513,7 @@ wrap_trans(State, Fun, Args, Retries, Mod, Kind) ->
%% read lock is only set on the first node
%% Nodes may either be a list of nodes or one node as an atom
%% Mnesia on all Nodes must be connected to each other, but
-%% it is not neccessary that they are up and running.
+%% it is not necessary that they are up and running.
-spec lock(LockItem, LockKind) -> list() | tuple() | no_return() when
LockItem :: {'record', table(), Key::term()} |
{'table', table()} |
diff --git a/lib/mnesia/src/mnesia_backup.erl b/lib/mnesia/src/mnesia_backup.erl
index 719e010c17..2cbf164b9f 100644
--- a/lib/mnesia/src/mnesia_backup.erl
+++ b/lib/mnesia/src/mnesia_backup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -30,7 +30,7 @@
%% write an own module the same interface as mnesia_backup and
%% configure Mnesia so the alternate module performs the actual
%% accesses to the backup media. This means that the user may put
-%% the backup on medias that Mnesia does not know about, possibly
+%% the backup on media that Mnesia does not know about, possibly
%% on hosts where Erlang is not running.
%%
%% The OpaqueData argument is never interpreted by other parts of
diff --git a/lib/mnesia/src/mnesia_bup.erl b/lib/mnesia/src/mnesia_bup.erl
index 4b4be695d2..1fe7f4ae26 100644
--- a/lib/mnesia/src/mnesia_bup.erl
+++ b/lib/mnesia/src/mnesia_bup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -809,7 +809,7 @@ restore_tables(Recs, Header, Schema, Ext, {start, LocalTabs}) ->
restore_tables([], _Header, _Schema, _Ext, State) ->
State.
-%% Creates all neccessary dat files and inserts
+%% Creates all necessary dat files and inserts
%% the table definitions in the schema table
%%
%% Returns a list of local_tab tuples for all local tables
diff --git a/lib/mnesia/src/mnesia_checkpoint.erl b/lib/mnesia/src/mnesia_checkpoint.erl
index c67c740036..fce588444b 100644
--- a/lib/mnesia/src/mnesia_checkpoint.erl
+++ b/lib/mnesia/src/mnesia_checkpoint.erl
@@ -306,7 +306,7 @@ really_retain(Name, Tab) ->
%%
%% {min, MinTabs}
%% Minimize redundancy and only keep checkpoint info together with
-%% one replica, preferrably at the local node. If any node involved
+%% one replica, preferably at the local node. If any node involved
%% the checkpoint goes down, the checkpoint is deactivated.
%%
%% {max, MaxTabs}
@@ -319,7 +319,7 @@ really_retain(Name, Tab) ->
%% {ram_overrides_dump, Tabs}
%% Only applicable for ram_copies. Bool controls which versions of
%% the records that should be included in the checkpoint state.
-%% true means that the latest comitted records in ram (i.e. the
+%% true means that the latest committed records in ram (i.e. the
%% records that the application accesses) should be included
%% in the checkpoint. false means that the records dumped to
%% dat-files (the records that will be loaded at startup) should
diff --git a/lib/mnesia/src/mnesia_controller.erl b/lib/mnesia/src/mnesia_controller.erl
index 5ea3a896e1..04bf18987b 100644
--- a/lib/mnesia/src/mnesia_controller.erl
+++ b/lib/mnesia/src/mnesia_controller.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -342,7 +342,7 @@ get_network_copy(Tid, Tab, Cs) ->
ok ->
Reason = {dumper,{add_table_copy, Tid}},
Work = #net_load{table = Tab,reason = Reason,cstruct = Cs},
- %% I'll need this cause it's linked trough the subscriber
+ %% I'll need this cause it's linked through the subscriber
%% might be solved by using monitor in subscr instead.
process_flag(trap_exit, true),
Load = load_table_fun(Work),
@@ -375,7 +375,7 @@ get_network_copy(Tid, Tab, Cs) ->
%% no need for sync, since mnesia_controller not started yet
%% schema_trans ->
%% already synced with mnesia_controller since the dumper
-%% is syncronously started from mnesia_controller
+%% is synchronously started from mnesia_controller
create_table(Tab) ->
{loaded, ok} = mnesia_loader:disc_load_table(Tab, {dumper,create_table}).
@@ -1017,7 +1017,7 @@ handle_cast(Msg, State) when State#state.schema_is_merged /= true ->
%% This must be done after schema_is_merged otherwise adopt_orphan
%% might trigger a table load from wrong nodes as a result of that we don't
-%% know which tables we can load safly first.
+%% know which tables we can load safely first.
handle_cast({im_running, Node, NewFriends}, State) ->
LocalTabs = mnesia_lib:local_active_tables() -- [schema],
RemoveLocalOnly = fun(Tab) -> not val({Tab, local_content}) end,
@@ -1447,7 +1447,7 @@ orphan_tables([Tab | Tabs], Node, Ns, Local, Remote) ->
case lists:member(Node, DiscCopyHolders) of
_ when BeingCreated == true ->
orphan_tables(Tabs, Node, Ns, Local, Remote);
- _ when Read == node() -> %% Allready loaded
+ _ when Read == node() -> %% Already loaded
orphan_tables(Tabs, Node, Ns, Local, Remote);
true when Active == [] ->
case DiscCopyHolders -- Ns of
@@ -2166,7 +2166,7 @@ load_and_reply(ReplyTo, Worker) ->
spawn_link(SendAndReply).
%% Now it is time to load the table
-%% but first we must check if it still is neccessary
+%% but first we must check if it still is necessary
load_table_fun(#net_load{cstruct=Cs, table=Tab, reason=Reason, opt_reply_to=ReplyTo}) ->
LocalC = val({Tab, local_content}),
AccessMode = val({Tab, access_mode}),
diff --git a/lib/mnesia/src/mnesia_dumper.erl b/lib/mnesia/src/mnesia_dumper.erl
index 1264efeb68..d5e45863f4 100644
--- a/lib/mnesia/src/mnesia_dumper.erl
+++ b/lib/mnesia/src/mnesia_dumper.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -526,8 +526,8 @@ disc_delete_table(Tab, Storage) ->
disc_delete_indecies(Tab, Cs, Storage) ->
case storage_semantics(Storage) of
disc_only_copies ->
- Indecies = Cs#cstruct.index,
- mnesia_index:del_transient(Tab, Indecies, Storage);
+ Indices = Cs#cstruct.index,
+ mnesia_index:del_transient(Tab, Indices, Storage);
_ ->
ok
end.
@@ -815,7 +815,7 @@ insert_op(Tid, _, {op, create_table, TabDef}, InPlace, InitBy) ->
ram_copies ->
ignore;
_ ->
- %% Indecies are still created by loader
+ %% Indices are still created by loader
disc_delete_indecies(Tab, Cs, Storage)
%% disc_delete_table(Tab, Storage)
end,
@@ -1433,10 +1433,10 @@ chunk_from_log(eof, _, _, _) ->
%%
%% This is a poor mans substitute for a fair scheduler algorithm
%% in the Erlang emulator. The mnesia_dumper process performs many
-%% costly BIF invokations and must pay for this. But since the
+%% costly BIF invocations and must pay for this. But since the
%% Emulator does not handle this properly we must compensate for
%% this with some form of load regulation of ourselves in order to
-%% not steal all computation power in the Erlang Emulator ans make
+%% not steal all computation power in the Erlang Emulator and make
%% other processes starve. Hopefully this is a temporary solution.
start_regulator() ->
diff --git a/lib/mnesia/src/mnesia_frag.erl b/lib/mnesia/src/mnesia_frag.erl
index 8f7dd321b0..1b4b55e071 100644
--- a/lib/mnesia/src/mnesia_frag.erl
+++ b/lib/mnesia/src/mnesia_frag.erl
@@ -1,7 +1,7 @@
%%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1103,7 +1103,7 @@ make_add_node(Tab, Node) ->
mnesia:abort({bad_type, Tab, Node}).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Delet a node from the node pool of a fragmented table
+%% Delete a node from the node pool of a fragmented table
make_multi_del_node(Tab, Node) ->
verify_multi(Tab),
diff --git a/lib/mnesia/src/mnesia_lib.erl b/lib/mnesia/src/mnesia_lib.erl
index 4dce5cefc0..37380fba87 100644
--- a/lib/mnesia/src/mnesia_lib.erl
+++ b/lib/mnesia/src/mnesia_lib.erl
@@ -568,10 +568,10 @@ set_remote_where_to_read(Tab, Ignore) ->
end,
Available = mnesia_lib:intersect(val({current, db_nodes}), Valid -- Ignore),
DiscOnlyC = val({Tab, disc_only_copies}),
- Prefered = Available -- DiscOnlyC,
+ Preferred = Available -- DiscOnlyC,
if
- Prefered /= [] ->
- set({Tab, where_to_read}, hd(Prefered));
+ Preferred /= [] ->
+ set({Tab, where_to_read}, hd(Preferred));
Available /= [] ->
set({Tab, where_to_read}, hd(Available));
true ->
@@ -936,7 +936,7 @@ error_desc(mnesia_down) -> "A transaction involving objects at some remote "
"node which died while transaction was executing"
"*and* object(s) are no longer available elsewhere"
"in the network";
-error_desc(not_a_db_node) -> "A node which is non existant in "
+error_desc(not_a_db_node) -> "A node which is non existent in "
"the schema was mentioned";
error_desc(bad_type) -> "Bad type on some provided arguments";
error_desc(node_not_running) -> "Node not running";
diff --git a/lib/mnesia/src/mnesia_loader.erl b/lib/mnesia/src/mnesia_loader.erl
index da43a521a4..bf1faede62 100644
--- a/lib/mnesia/src/mnesia_loader.erl
+++ b/lib/mnesia/src/mnesia_loader.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -267,7 +267,7 @@ init_receiver(Node, Tab,Storage,Cs,Reason) ->
end,
%% Check that table still exists
Active = val({Tab, active_replicas}),
- %% Check that we havn't loaded it already
+ %% Check that we haven't loaded it already
case val({Tab,where_to_read}) == node() of
true -> ok;
_ ->
@@ -334,7 +334,7 @@ table_init_fun(SenderPid, Storage) ->
ok
end.
-%% Add_table_copy get's it's own locks.
+%% Add_table_copy gets it's own locks.
start_receiver(Tab,Storage,Cs,SenderPid,TabSize,DetsData,{dumper,{add_table_copy,_}}) ->
Init = table_init_fun(SenderPid, Storage),
case do_init_table(Tab,Storage,Cs,SenderPid,TabSize,DetsData,self(), Init) of
diff --git a/lib/mnesia/src/mnesia_locker.erl b/lib/mnesia/src/mnesia_locker.erl
index 671dea2a14..66f08580fa 100644
--- a/lib/mnesia/src/mnesia_locker.erl
+++ b/lib/mnesia/src/mnesia_locker.erl
@@ -201,14 +201,14 @@ loop(State) ->
end;
%% If test_set_sticky fails, we send this to all nodes
- %% after aquiring a real write lock on Oid
+ %% after acquiring a real write lock on Oid
{stick, {Tab, _}, N} ->
?ets_insert(mnesia_sticky_locks, {Tab, N}),
loop(State);
%% The caller which sends this message, must have first
- %% aquired a write lock on the entire table
+ %% acquired a write lock on the entire table
{unstick, Tab} ->
?ets_delete(mnesia_sticky_locks, Tab),
loop(State);
@@ -649,7 +649,7 @@ ix_read_res(Tab,IxKey,Pos) ->
%% ********************* end server code ********************
%% The following code executes at the client side of a transactions
-%% Aquire a write lock, but do a read, used by
+%% Acquire a write lock, but do a read, used by
%% mnesia:wread/1
rwlock(Tid, Store, Oid) ->
@@ -712,7 +712,7 @@ check_majority(Tab, HaveNs) ->
ok
end.
-%% aquire a sticky wlock, a sticky lock is a lock
+%% acquire a sticky wlock, a sticky lock is a lock
%% which remains at this node after the termination of the
%% transaction.
@@ -809,11 +809,11 @@ dirty_sticky_lock(Tab, Key, Nodes, Lock) ->
sticky_wlock_table(Tid, Store, Tab) ->
sticky_lock(Tid, Store, {Tab, ?ALL}, write).
-%% aquire a wlock on Oid
+%% acquire a wlock on Oid
%% We store a {Tabname, write, Tid} in all locktables
%% on all nodes containing a copy of Tabname
%% We also store an item {{locks, Tab, Key}, write} in the
-%% local store when we have aquired the lock.
+%% local store when we have acquired the lock.
%%
wlock(Tid, Store, Oid) ->
wlock(Tid, Store, Oid, _CheckMajority = true).
@@ -882,7 +882,7 @@ get_wlocks_on_nodes([Node | Tail], Orig, Store, Request, Oid) ->
case node() of
Node -> %% Local done try one more
get_wlocks_on_nodes(Tail, Orig, Store, Request, Oid);
- _ -> %% The first succeded cont with the rest
+ _ -> %% The first succeeded cont with the rest
get_wlocks_on_nodes(Tail, Store, Request),
receive_wlocks(Tail, Orig, Store, Oid)
end;
@@ -996,7 +996,7 @@ return_granted_or_nodes(_ , _Nodes) -> granted.
%% locks table on the node where we actually do pick up the object
%% and we also store an item {lock, Oid, read} in our local store
%% so that we can release any locks we hold when we commit.
-%% This function not only aquires a read lock, but also reads the object
+%% This function not only acquires a read lock, but also reads the object
%% Oid's are always {Tab, Key} tuples
rlock(Tid, Store, Oid) ->
diff --git a/lib/mnesia/src/mnesia_log.erl b/lib/mnesia/src/mnesia_log.erl
index 03411ace41..b1514bfbe6 100644
--- a/lib/mnesia/src/mnesia_log.erl
+++ b/lib/mnesia/src/mnesia_log.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -48,7 +48,7 @@
%% with the same interface as mnesia_backup and configure
%% Mnesia so the alternate module performs the actual accesses
%% to the backup media. This means that the user may put the
-%% backup on medias that Mnesia does not know about possibly on
+%% backup on media that Mnesia does not know about possibly on
%% hosts where Erlang is not running.
%%
%% All these logs have to some extent a common structure.
@@ -93,7 +93,7 @@
%% The log file structure for the mnesia_down log is as follows.
%%
%% After the mnesia log section follows a mnesia_down section
-%% containg lists with yoyo records as single element.
+%% containing lists with yoyo records as single element.
%%
%% +-----------------+
%% | mnesia log head |
diff --git a/lib/mnesia/src/mnesia_monitor.erl b/lib/mnesia/src/mnesia_monitor.erl
index aee84887dc..dbd4a9c42f 100644
--- a/lib/mnesia/src/mnesia_monitor.erl
+++ b/lib/mnesia/src/mnesia_monitor.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -136,7 +136,7 @@ unsafe_create_external(Tab, Alias, Mod, Cs) ->
disconnect(Node) ->
cast({disconnect, Node}).
-%% Returns GoodNoodes
+%% Returns GoodNodes
%% Creates a link to each compatible monitor and
%% protocol_version to agreed version upon success
diff --git a/lib/mnesia/src/mnesia_recover.erl b/lib/mnesia/src/mnesia_recover.erl
index 36b4a29fc2..820e142994 100644
--- a/lib/mnesia/src/mnesia_recover.erl
+++ b/lib/mnesia/src/mnesia_recover.erl
@@ -130,7 +130,7 @@ allow_garb() ->
cast(allow_garb).
-%% The transaction log has either been swiched (latest -> previous) or
+%% The transaction log has either been switched (latest -> previous) or
%% there is nothing to be dumped. This means that the previous
%% transaction log only may contain commit records which refers to
%% transactions noted in the last two of the 'Prev' tables. All other
@@ -428,7 +428,7 @@ check_what_happened([H | T], Aborts, Commits) ->
check_what_happened([], Aborts, Commits) ->
if
Aborts == 0, Commits == 0 -> aborted; % None of the active nodes knows
- Aborts > 0 -> aborted; % Someody has aborted
+ Aborts > 0 -> aborted; % Somebody has aborted
Aborts == 0, Commits > 0 -> committed % All has committed
end.
@@ -674,7 +674,7 @@ handle_call({connect_nodes, Ns}, From, State) ->
erlang:send_after(2, self(), {connect_nodes,Ns,From}),
{noreply, State};
[] ->
- %% No good noodes to connect to!
+ %% No good nodes to connect to!
%% We can't use reply here because this function can be
%% called from handle_info
gen_server:reply(From, {[], AlreadyConnected}),
@@ -1083,7 +1083,7 @@ merge_decisions(Node, D, NewD0) ->
NewD#decision.outcome == aborted ->
%% Interesting! We have already committed,
%% but someone else has aborted. Now we
- %% have a nice little inconcistency. The
+ %% have a nice little inconsistency. The
%% other guy (or some one else) has
%% enforced a recovery decision when
%% max_wait_for_decision was exceeded.
@@ -1096,11 +1096,11 @@ merge_decisions(Node, D, NewD0) ->
OldD#decision{outcome = aborted};
OldD#decision.outcome == aborted ->
- %% aborted overrrides anything
+ %% aborted overrides anything
OldD#decision{outcome = aborted};
NewD#decision.outcome == aborted ->
- %% aborted overrrides anything
+ %% aborted overrides anything
OldD#decision{outcome = aborted};
OldD#decision.outcome == committed,
@@ -1236,7 +1236,7 @@ arrange([To | ToNodes], D, Acc, ForceSend) when is_record(D, decision) ->
arrange([To | ToNodes], {trans_tid, serial, Serial}, Acc, ForceSend) ->
%% Do the lamport thing plus release the others
- %% from uncertainity.
+ %% from uncertainty.
Acc2 = add_decision(To, {trans_tid, serial, Serial}, Acc),
arrange(ToNodes, {trans_tid, serial, Serial}, Acc2, ForceSend);
diff --git a/lib/mnesia/src/mnesia_schema.erl b/lib/mnesia/src/mnesia_schema.erl
index ed7f362cf6..994c1b070e 100644
--- a/lib/mnesia/src/mnesia_schema.erl
+++ b/lib/mnesia/src/mnesia_schema.erl
@@ -957,13 +957,13 @@ get_ext_types_disc_() ->
[]
end.
-%% Convert attribute name to integer if neccessary
+%% Convert attribute name to integer if necessary
attr_tab_to_pos(_Tab, Pos) when is_integer(Pos) ->
Pos;
attr_tab_to_pos(Tab, Attr) ->
attr_to_pos(Attr, val({Tab, attributes})).
-%% Convert attribute name to integer if neccessary
+%% Convert attribute name to integer if necessary
attr_to_pos({_} = P, _) -> P;
attr_to_pos(Pos, _Attrs) when is_integer(Pos) ->
Pos;
@@ -1024,14 +1024,14 @@ verify_cstruct(#cstruct{} = Cs) ->
expand_index_attrs(#cstruct{index = Ix, attributes = Attrs,
name = Tab} = Cs) ->
- Prefered = prefered_index_types(Cs),
- expand_index_attrs(Ix, Tab, Attrs, Prefered).
+ Preferred = prefered_index_types(Cs),
+ expand_index_attrs(Ix, Tab, Attrs, Preferred).
-expand_index_attrs(Ix, Tab, Attrs, Prefered) ->
+expand_index_attrs(Ix, Tab, Attrs, Preferred) ->
lists:map(fun(P) when is_integer(P); is_atom(P) ->
- {attr_to_pos(P, Attrs), Prefered};
+ {attr_to_pos(P, Attrs), Preferred};
({A} = P) when is_atom(A) ->
- {P, Prefered};
+ {P, Preferred};
({P, Type}) ->
{attr_to_pos(P, Attrs), Type};
(_Other) ->
@@ -1352,7 +1352,7 @@ check_active([], _Expl, _Tab) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Function for definining an external backend type
+%% Function for defining an external backend type
add_backend_type(Name, Module) ->
case schema_transaction(fun() -> do_add_backend_type(Name, Module) end) of
@@ -3093,7 +3093,7 @@ ext_real_suffixes(Ext) ->
[M || {_,M} <- Ext])
catch
error:E ->
- verbose("Cant find real ext suffixes (~tp)~n", [E]),
+ verbose("Can't find real ext suffixes (~tp)~n", [E]),
[]
end.
@@ -3102,7 +3102,7 @@ ext_tmp_suffixes(Ext) ->
[M || {_,M} <- Ext])
catch
error:E ->
- verbose("Cant find tmp ext suffixes (~tp)~n", [E]),
+ verbose("Can't find tmp ext suffixes (~tp)~n", [E]),
[]
end.
diff --git a/lib/mnesia/src/mnesia_snmp_hook.erl b/lib/mnesia/src/mnesia_snmp_hook.erl
index 58a20c6051..93a04d44f8 100644
--- a/lib/mnesia/src/mnesia_snmp_hook.erl
+++ b/lib/mnesia/src/mnesia_snmp_hook.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -134,7 +134,7 @@ keys_to_oid(N, Key, Oid, Types) ->
%%--------------------------------------------------
%% The reverse of the above, i.e. snmp oid to mnesia key.
%% This can be lookup up in tree but that might be on a remote node.
-%% It's probably faster to look it up, but use when it migth be remote
+%% It's probably faster to look it up, but use when it might be remote
oid_to_key(Oid, Tab) ->
[{key, Types}] = mnesia_lib:val({Tab,snmp}),
oid_to_key_1(Types, Oid).
@@ -208,7 +208,7 @@ get_next_index(Name, RowIndex) ->
%% Purpose: Get the mnesia key corresponding to the RowIndex.
%% Args: Name is the name of the table (atom)
%% RowIndex is an Oid
-%% Returns: {ok, Key} | undefiend
+%% Returns: {ok, Key} | undefined
%%-----------------------------------------------------------------
get_mnesia_key(Name, RowIndex) ->
Tree = mnesia_lib:val({Name, {index, snmp}}),
diff --git a/lib/mnesia/src/mnesia_subscr.erl b/lib/mnesia/src/mnesia_subscr.erl
index 21a308cfb6..d0c298e425 100644
--- a/lib/mnesia/src/mnesia_subscr.erl
+++ b/lib/mnesia/src/mnesia_subscr.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -148,7 +148,7 @@ report_table_event(Tab, Tid, Obj, Op) ->
end
end.
-%% Backwards compatible for the moment when mnesia_tm get's updated!
+%% Backwards compatible for the moment when mnesia_tm gets updated!
report_table_event(Subscr, Tab, Tid, Obj, Op) ->
report_table_event(Subscr, Tab, Tid, Obj, Op, undefined).
@@ -173,7 +173,7 @@ report_table_event({subscribers, S1, S2}, Tab, Tid, Obj, Op, Old) ->
Extended = what(Tab, Tid, Obj, Op, Old),
deliver(S2, Extended);
-%% Backwards compatible for the moment when mnesia_tm get's updated!
+%% Backwards compatible for the moment when mnesia_tm gets updated!
report_table_event({subscribers, Subscr}, Tab, Tid, Obj, Op, Old) ->
report_table_event({subscribers, Subscr, []}, Tab, Tid, Obj, Op, Old).
diff --git a/lib/mnesia/src/mnesia_tm.erl b/lib/mnesia/src/mnesia_tm.erl
index 5a070cf0cd..847cd0074b 100644
--- a/lib/mnesia/src/mnesia_tm.erl
+++ b/lib/mnesia/src/mnesia_tm.erl
@@ -181,7 +181,7 @@ tmpid(Pid) ->
%% Returns a list of participant transaction Tid's
mnesia_down(Node) ->
- %% Syncronously call needed in order to avoid
+ %% Synchronously call needed in order to avoid
%% race with mnesia_tm's coordinator processes
%% that may restart and acquire new locks.
%% mnesia_monitor takes care of the sync
@@ -598,7 +598,7 @@ recover_coordinator(Tid, Etabs) ->
recover_coordinator(Tid, Protocol, Outcome, Local, DiscNs, RamNs),
?eval_debug_fun({?MODULE, recover_coordinator, post},
[{tid, Tid}, {outcome, Outcome}, {prot, Protocol}]);
- false -> %% When killed before store havn't been copied to
+ false -> %% When killed before store haven't been copied to
ok %% to the new nested trans store.
end
catch _:Reason:Stacktrace ->
@@ -881,7 +881,7 @@ try_again(_) -> no.
%% We can only restart toplevel transactions.
%% If a deadlock situation occurs in a nested transaction
%% The whole thing including all nested transactions need to be
-%% restarted. The stack is thus popped by a consequtive series of
+%% restarted. The stack is thus popped by a consecutive series of
%% exit({aborted, #cyclic{}}) calls
restart(Mod, Tid, Ts, Fun, Args, Factor0, Retries0, Type, Why) ->
@@ -1070,7 +1070,7 @@ dirty(Protocol, Item) ->
async_dirty ->
%% Send commit records to the other involved nodes,
%% but do only wait for one node to complete.
- %% Preferrably, the local node if possible.
+ %% Preferably, the local node if possible.
ReadNode = val({Tab, where_to_read}),
{WaitFor, FirstRes} = async_send_dirty(Tid, CR, Tab, ReadNode),
@@ -1088,7 +1088,7 @@ dirty(Protocol, Item) ->
%% This is the commit function, The first thing it does,
%% is to find out which nodes that have been participating
%% in this particular transaction, all of the mnesia_locker:lock*
-%% functions insert the names of the nodes where it aquires locks
+%% functions insert the names of the nodes where it acquires locks
%% into the local shadow Store
%% This function exacutes in the context of the user process
t_commit(Type) ->
@@ -1379,7 +1379,7 @@ multi_commit(read_only, _Maj = [], Tid, CR, _Store) ->
multi_commit(sym_trans, _Maj = [], Tid, CR, Store) ->
%% This lightweight commit protocol is used when all
- %% the involved tables are replicated symetrically.
+ %% the involved tables are replicated symmetrically.
%% Their storage types must match on each node.
%%
%% 1 Ask the other involved nodes if they want to commit
@@ -1431,7 +1431,7 @@ multi_commit(sym_trans, _Maj = [], Tid, CR, Store) ->
multi_commit(sync_sym_trans, _Maj = [], Tid, CR, Store) ->
%% This protocol is the same as sym_trans except that it
- %% uses syncronized calls to disk_log and syncronized commits
+ %% uses synchronized calls to disk_log and synchronized commits
%% when several nodes are involved.
{DiscNs, RamNs} = commit_nodes(CR, [], []),
@@ -1754,7 +1754,7 @@ commit_participant(Protocol, Coord, Tid, Bin, C0, DiscNs, _RamNs) ->
do_abort(Tid, Bin) when is_binary(Bin) ->
%% Possible optimization:
- %% If we want we could pass arround a flag
+ %% If we want we could pass around a flag
%% that tells us whether the binary contains
%% schema ops or not. Only if the binary
%% contains schema ops there are meningful
diff --git a/lib/mnesia/test/Makefile b/lib/mnesia/test/Makefile
index b77be46e7a..378bcc44d0 100644
--- a/lib/mnesia/test/Makefile
+++ b/lib/mnesia/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -98,7 +98,7 @@ EBIN = .
# Targets
# ----------------------------------------------------
-tests debug opt: $(TARGET_FILES)
+tests $(TYPES): $(TARGET_FILES)
$(TARGET_FILES): $(HRL_FILES)
diff --git a/lib/mnesia/test/mnesia_SUITE.erl b/lib/mnesia/test/mnesia_SUITE.erl
index 5e95e1dce7..711d4b86d3 100644
--- a/lib/mnesia/test/mnesia_SUITE.erl
+++ b/lib/mnesia/test/mnesia_SUITE.erl
@@ -42,7 +42,7 @@ suite() -> [{ct_hooks,[{ts_install_cth,[{nodenames,2}]}]}].
%% Verify that Mnesia really is a distributed real-time DBMS.
%% This is the test suite of the Mnesia DBMS. The test suite
-%% covers many aspects of usage and is indended to be developed
+%% covers many aspects of usage and is intended to be developed
%% incrementally. The test suite is divided into a hierarchy of test
%% suites where the leafs actually implements the test cases.
%% The intention of each test case and sub test suite can be
diff --git a/lib/mnesia/test/mnesia_atomicity_test.erl b/lib/mnesia/test/mnesia_atomicity_test.erl
index 4764f9e7c0..e079100a4c 100644
--- a/lib/mnesia/test/mnesia_atomicity_test.erl
+++ b/lib/mnesia/test/mnesia_atomicity_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -111,7 +111,7 @@ explicit_abort_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a transaction on one node
{success, [A]} = ?start_activities([Node1]),
- %% store an object in the Tab - first tranaction
+ %% store an object in the Tab - first transaction
?start_transactions([A]),
A ! fun() ->
mnesia:write(Rec1A) % returns ok when successful
@@ -136,7 +136,7 @@ explicit_abort_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a second transactionprocess, after the first failed
{success, [B]} = ?start_activities([Node1]),
- %% check, whether the interupted transaction had no influence on the db
+ %% check, whether the interrupted transaction had no influence on the db
?start_transactions([B]),
B ! fun() ->
?match([Rec1A], mnesia:read({Tab, 1})),
@@ -163,7 +163,7 @@ runtime_error_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a transaction on one node
{success, [A]} = ?start_activities([Node1]),
- %% store an object in the Tab - first tranaction
+ %% store an object in the Tab - first transaction
?start_transactions([A]),
A ! fun() ->
mnesia:write(Rec1A) % returns ok when successful
@@ -188,7 +188,7 @@ runtime_error_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a second transactionprocess, after the first failed
{success, [B]} = ?start_activities([Node1]),
- %% check, whether the interupted transaction had no influence on the db
+ %% check, whether the interrupted transaction had no influence on the db
?start_transactions([B]),
B ! fun() ->
?match([Rec1A], mnesia:read({Tab, 1})),
@@ -215,7 +215,7 @@ kill_self_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a transaction on one node
{success, [A]} = ?start_activities([Node1]),
- %% store an object in the Tab - first tranaction
+ %% store an object in the Tab - first transaction
?start_transactions([A]),
A ! fun() ->
mnesia:write(Rec1A) % returns ok when successful
@@ -244,7 +244,7 @@ kill_self_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a second transactionprocess, after the first failed
{success, [B]} = ?start_activities([Node1]),
- %% check, whether the interupted transaction had no influence on the db
+ %% check, whether the interrupted transaction had no influence on the db
?start_transactions([B]),
B ! fun() ->
?match([Rec1A], mnesia:read({Tab, 1})),
@@ -271,7 +271,7 @@ throw_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a transaction on one node
{success, [A]} = ?start_activities([Node1]),
- %% store an object in the Tab - first tranaction
+ %% store an object in the Tab - first transaction
?start_transactions([A]),
A ! fun() ->
mnesia:write(Rec1A) % returns ok when successful
@@ -297,7 +297,7 @@ throw_in_middle_of_trans(Config) when is_list(Config) ->
%% Start a second transactionprocess, after the first failed
{success, [B]} = ?start_activities([Node1]),
- %% check, whether the interupted transaction had no influence on the db
+ %% check, whether the interrupted transaction had no influence on the db
?start_transactions([B]),
B ! fun() ->
?match([Rec1A], mnesia:read({Tab, 1})),
@@ -542,7 +542,7 @@ start_lock_waiter(BlockOpA, BlockOpB, Config) ->
io:format("waiting for A (~p on ~p) to be in the queue ~n", [A, [N1, N2]]),
wait_for_a(A, [N1, N2]),
- io:format("Queus ~p~n",
+ io:format("Queues ~p~n",
[[{N,rpc:call(N, mnesia, system_info, [lock_queue])} || N <- Nodes]]),
KillNode = node(B),
@@ -743,7 +743,7 @@ start_restart_check(RestartOp, ReplicaNeed, Config) ->
Wait(Wait),
A ! go_ahead,
- %% the sticky write doesnt work on remote nodes !!!
+ %% the sticky write doesn't work on remote nodes !!!
ExpectedMsg =
case RestartOp of
sw when ReplicaNeed == two ->
@@ -765,7 +765,7 @@ start_restart_check(RestartOp, ReplicaNeed, Config) ->
%% the expected result depends on the transaction of
- %% fun A - when that doesnt change the object in the
+ %% fun A - when that doesn't change the object in the
%% table (e.g. it is a read) then the predefined
%% value {Tabname, 1, c} is expected to be the result here
diff --git a/lib/mnesia/test/mnesia_config_backup.erl b/lib/mnesia/test/mnesia_config_backup.erl
index 239101ca92..a39e41f63d 100644
--- a/lib/mnesia/test/mnesia_config_backup.erl
+++ b/lib/mnesia/test/mnesia_config_backup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@
%% write an own module the same interface as mnesia_backup and
%% configure Mnesia so the alternate module performs the actual
%% accesses to the backup media. This means that the user may put
-%% the backup on medias that Mnesia does not know about, possibly
+%% the backup on media that Mnesia does not know about, possibly
%% on hosts where Erlang is not running.
%%
%% The OpaqueData argument is never interpreted by other parts of
diff --git a/lib/mnesia/test/mnesia_config_test.erl b/lib/mnesia/test/mnesia_config_test.erl
index 7f584e35f9..79872ab33a 100644
--- a/lib/mnesia/test/mnesia_config_test.erl
+++ b/lib/mnesia/test/mnesia_config_test.erl
@@ -937,7 +937,7 @@ start_first_one_disc_less_then_two_more_disc_less(Config) when is_list(Config) -
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
schema_location_and_extra_db_nodes_combinations(doc)->
- ["Test schema loaction and extra_db_nodes combinations."];
+ ["Test schema location and extra_db_nodes combinations."];
schema_location_and_extra_db_nodes_combinations(suite) -> [];
schema_location_and_extra_db_nodes_combinations(Config) when is_list(Config) ->
[N1, N2] = Nodes = ?init(2, Config),
diff --git a/lib/mnesia/test/mnesia_consistency_test.erl b/lib/mnesia/test/mnesia_consistency_test.erl
index 46bafaf65c..2be17e69c2 100644
--- a/lib/mnesia/test/mnesia_consistency_test.erl
+++ b/lib/mnesia/test/mnesia_consistency_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -341,7 +341,7 @@ receive_messages(ListOfMsgs) ->
?verbose("I (~p) got msg ~p from ~p ~n", [self(),Msg, Pid]),
[{Pid, Msg} | receive_messages(ListOfMsgs -- [Msg])]
end;
- Else -> ?warning("Recevied unexpected Msg~n ~p ~n", [Else])
+ Else -> ?warning("Received unexpected Msg~n ~p ~n", [Else])
after timer:minutes(3) ->
?error("Timeout in receive msgs while waiting for ~p~n",
[ListOfMsgs])
diff --git a/lib/mnesia/test/mnesia_durability_test.erl b/lib/mnesia/test/mnesia_durability_test.erl
index ccbfdc9738..986d0efcb5 100644
--- a/lib/mnesia/test/mnesia_durability_test.erl
+++ b/lib/mnesia/test/mnesia_durability_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -503,7 +503,7 @@ load_when_down_from_all_other_replica_nodes(Config) when is_list(Config) ->
?match([], mnesia_test_lib:kill_mnesia([N2])),
?match({atomic,ok},rpc:call(N3,mnesia,transaction,[Write_one,[33,33]])),
?match([], mnesia_test_lib:kill_mnesia([N3])),
- ?verbose("Mnesia stoped on all three nodes.~n",[]),
+ ?verbose("Mnesia stopped on all three nodes.~n",[]),
%%Start Mnesia on N3; wait for 'test_rec' table to load
?match(ok, rpc:call(N3, mnesia, start, [])),
@@ -528,7 +528,7 @@ load_when_down_from_all_other_replica_nodes(Config) when is_list(Config) ->
late_load_transforms_into_disc_load(doc) ->
["Difficult case that needs instrumentation of Mnesia.",
"A table is force loaded, and Mnesia decides to load it from another ",
- "Mnesia node because it is avaliable there. The other Mnesia node then ",
+ "Mnesia node because it is available there. The other Mnesia node then ",
"dies in mid copy which shall make the first Mnesia node to really ",
"force load from disc.",
"Check this by starting N1 and N2 and replicating a table between ",
@@ -1028,7 +1028,7 @@ master_nodes(Config) when is_list(Config) ->
?match({timeout, [Tab]}, rpc:call(A, mnesia, wait_for_tables, [[Tab], 2000])),
%% Test 6: Force load on table that couldn't be loaded due to master
- %% table setttings, loads other active replicas i.e. from C
+ %% table settings, loads other active replicas i.e. from C
?match(yes, rpc:call(A, mnesia, force_load_table, [Tab])),
?match(ok, rpc:call(A, mnesia, wait_for_tables, [[Tab], 3000])),
@@ -1041,7 +1041,7 @@ master_nodes(Config) when is_list(Config) ->
?match([{Tab, 1, update_2}], rpc:call(C, mnesia, dirty_read, [{Tab, 1}])),
%% Test 7: Master [B] and B is down the table should not be loaded,
- %% force_load when there are no active replicas availible
+ %% force_load when there are no active replicas available
%% should generate a load of a local table
?match(ok, rpc:call(A, mnesia, set_master_nodes, [Tab, [B]])),
@@ -1138,7 +1138,7 @@ master_on_non_local_tables(Config) when is_list(Config) ->
remote_force_load_with_local_master_node(doc) ->
["Force load a table on a remote node while the ",
"local node is down. Start the local node and ",
- "verfify that the tables is loaded from disc locally "
+ "verify that the tables is loaded from disc locally "
"if the local node has itself as master node and ",
"the remote node has both the local and remote node ",
"as master nodes"];
@@ -1345,13 +1345,13 @@ dump_ram_copies(Config) when is_list(Config) ->
%% start Mnesia only on node 3
?verbose("starting mnesia on Node3~n",[]),
- %% test_lib:mnesia_start doesnt work, because it waits
+ %% test_lib:mnesia_start doesn't work, because it waits
%% for the schema on all nodes ... ???
?match(ok,rpc:call(Node3,mnesia,start,[]) ),
?match(ok,rpc:call(Node3,mnesia,wait_for_tables,
[[Tab],timer:seconds(30)] ) ),
- %% node3 shall have the conents of the dump
+ %% node3 shall have the contents of the dump
cross_check_tables([C],Tab,{[{Tab,1,4711}],[{Tab,2,42}],[{Tab,3,256}]}),
%% start Mnesia on the other 2 nodes, too
@@ -1569,7 +1569,7 @@ receive_messages(ListOfMsgs) ->
[{Pid, Msg} | receive_messages(ListOfMsgs -- [Msg])]
end;
- Else -> ?warning("Recevied unexpected Msg~n ~p ~n", [Else])
+ Else -> ?warning("Received unexpected Msg~n ~p ~n", [Else])
after timer:seconds(40) ->
?error("Timeout in receive msgs while waiting for ~p~n",
[ListOfMsgs])
diff --git a/lib/mnesia/test/mnesia_evil_coverage_test.erl b/lib/mnesia/test/mnesia_evil_coverage_test.erl
index 1c84774e6f..68ab9a53b7 100644
--- a/lib/mnesia/test/mnesia_evil_coverage_test.erl
+++ b/lib/mnesia/test/mnesia_evil_coverage_test.erl
@@ -696,7 +696,7 @@ verify_ll_queue(N) ->
?match(granted,mnesia_controller:block_controller()),
case mnesia_controller:get_info(1000) of
{info,{state,_,true,[],_Loader,[],[],[],_,_,_,_,_,_}} ->
- %% Very slow SMP machines havn't loaded it yet..
+ %% Very slow SMP machines haven't loaded it yet..
mnesia_controller:unblock_controller(),
timer:sleep(10),
verify_ll_queue(N-1);
@@ -1295,7 +1295,7 @@ offline_set_master_nodes(Config) when is_list(Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Syncronize table with log or disc
+%% Synchronize table with log or disc
%%
%% Dump ram tables on disc
@@ -2091,7 +2091,7 @@ test_ext_sub(Tab1, Tab2, Tab3) ->
subscribe_standard(doc) ->
- ["Tests system events and the orignal table events"];
+ ["Tests system events and the original table events"];
subscribe_standard(suite) -> [];
subscribe_standard(Config) when is_list(Config)->
[N1, N2]=?acquire_nodes(2, Config),
diff --git a/lib/mnesia/test/mnesia_isolation_test.erl b/lib/mnesia/test/mnesia_isolation_test.erl
index b3cb26831c..14a2cc02de 100644
--- a/lib/mnesia/test/mnesia_isolation_test.erl
+++ b/lib/mnesia/test/mnesia_isolation_test.erl
@@ -967,7 +967,7 @@ snmp_open_table(Config) when is_list(Config) ->
A ! end_trans, %% Kill A, locks should be released
?match_receive({A,{atomic,end_trans}}),
- %% Locks released! op should be exec. Can take a while (thats the timeout)
+ %% Locks released! op should be exec. Can take a while (that's the timeout)
receive
Msg -> ?match({Pid, {atomic, ok}}, Msg)
after
@@ -999,7 +999,7 @@ snmp_close_table(Config) when is_list(Config) ->
A ! end_trans, %% Kill A, locks should be released
?match_receive({A,{atomic,end_trans}}),
- %% Locks released! op should be exec. Can take a while (thats the timeout)
+ %% Locks released! op should be exec. Can take a while (that's the timeout)
receive
Msg -> ?match({Pid, {atomic, ok}}, Msg)
after
@@ -1723,7 +1723,7 @@ write_shadows(Config) when is_list(Config) ->
?match({atomic, ok}, mnesia:transaction(Fun1)),
Fun2 = fun() ->
- %% write shadow old write - is the confirmed value visable
+ %% write shadow old write - is the confirmed value visible
%% in the shadow ?
?match([RecA1], mnesia:read({Tab, a})),
?match([RecA1], mnesia:wread({Tab, a})),
@@ -1732,14 +1732,14 @@ write_shadows(Config) when is_list(Config) ->
?match([RecA1], mnesia:index_match_object(PatA1, ValPos)),
?match([RecA1], mnesia:index_read(Tab, 1, ValPos)),
- %% write shadow new write - is a new value visable instead
+ %% write shadow new write - is a new value visible instead
%% of the old value ?
?match(ok, mnesia:write(RecA2)),
?match([RecA2], mnesia:read({Tab, a})),
?match([RecA2], mnesia:wread({Tab, a})),
?match([], mnesia:match_object(PatA1)), %% delete shadow old but not new write
- ?match([RecA2], mnesia:match_object(PatA2)), %% is the new value visable
+ ?match([RecA2], mnesia:match_object(PatA2)), %% is the new value visible
?match([a], mnesia:all_keys(Tab)),
?match([RecA2], mnesia:index_match_object(PatA2, ValPos)),
@@ -1792,7 +1792,7 @@ delete_shadows(Config) when is_list(Config) ->
?match([], mnesia:index_match_object(PatA1, ValPos)),
?match([], mnesia:index_read(Tab, 1, ValPos)),
- %% delete shadow old but not new write - is the new value visable
+ %% delete shadow old but not new write - is the new value visible
%% when the old one was deleted ?
?match(ok, mnesia:write(RecA2)),
@@ -1877,7 +1877,7 @@ write_delete_shadows_bag(Config) when is_list(Config) ->
?match([], mnesia:index_match_object(PatA1, ValPos)),
?match([], mnesia:index_read(Tab, 1, ValPos)),
- %% delete shadow old but not new write - are both new value visable
+ %% delete shadow old but not new write - are both new value visible
%% when the old one was deleted ?
?match(ok, mnesia:write(RecA2)),
?match(ok, mnesia:write(RecA3)),
@@ -2137,7 +2137,7 @@ removed_resources([_N1,N2,N3], DeleteRes) ->
nasty(suite) -> [];
nasty(doc) ->
- ["Tries to fullfill a rather nasty locking scenario, where we have had "
+ ["Tries to fulfill a rather nasty locking scenario, where we have had "
"bugs, the testcase tries a combination of locks in locker queue"];
%% This testcase no longer works as it was intended to show errors when
diff --git a/lib/mnesia/test/mnesia_recovery_test.erl b/lib/mnesia/test/mnesia_recovery_test.erl
index b5749408f8..abf8652a02 100644
--- a/lib/mnesia/test/mnesia_recovery_test.erl
+++ b/lib/mnesia/test/mnesia_recovery_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1341,7 +1341,7 @@ garb_of_decisions(Kill, Nodes, Tid_list, Trans_res) ->
case length(Tid_list) of
1 ->
%% If there was only one transaction, it should be logged as
- %% comitted on every node!
+ %% committed on every node!
[Tid1] = Tid_list,
verify_garb_transient_logs(Nodes, [Tid1], committed);
2 ->
@@ -1455,7 +1455,7 @@ receive_messages(ListOfMsgs, File, Line) ->
[{Pid, Msg} | receive_messages(ListOfMsgs -- [Msg], File, Line)]
end;
Else -> mnesia_test_lib:log("<>WARNING<>~n"
- "Recevied unexpected or bad formatted msg~n ~p ~n"
+ "Received unexpected or bad formatted msg~n ~p ~n"
"While waiting for ~p~n",
[Else, ListOfMsgs], File, Line),
receive_messages(ListOfMsgs, File, Line)
diff --git a/lib/mnesia/test/mnesia_test_lib.erl b/lib/mnesia/test/mnesia_test_lib.erl
index 9794915026..e7fe419dfc 100644
--- a/lib/mnesia/test/mnesia_test_lib.erl
+++ b/lib/mnesia/test/mnesia_test_lib.erl
@@ -62,7 +62,7 @@
%%% test(TestCases)
%%%
%%% Run parts of the test suite. Uses test/2.
-%%% Reads Config from mnesia_test.config and starts them if neccessary.
+%%% Reads Config from mnesia_test.config and starts them if necessary.
%%% Kills Mnesia and wipes out the Mnesia directories as a starter.
%%%
%%% test(TestCases, Config)
@@ -722,7 +722,7 @@ kill_tc(Pid, Time) ->
"in ~p min~n", [Time div (1000*60)]),
Files = mnesia_lib:dist_coredump(),
?log("Cores dumped to:~n ~p~n", [Files]),
- %% Genarate erlang crashdumps.
+ %% Generate erlang crashdumps.
%% GenDump = fun(Node) ->
%% File = "CRASH_" ++ atom_to_list(Node) ++ ".dump",
%% rpc:call(Node, os, putenv, ["ERL_CRASH_DUMP", File]),
diff --git a/lib/mnesia/test/mnesia_tpcb.erl b/lib/mnesia/test/mnesia_tpcb.erl
index fb39ee321d..6a78d4f1d0 100644
--- a/lib/mnesia/test/mnesia_tpcb.erl
+++ b/lib/mnesia/test/mnesia_tpcb.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@
%% a database system.
%%
%% The definition of the TPC-B states lots of detailed rules and
-%% conditions that must be fullfilled, e.g. how the ACID (atomicity,
+%% conditions that must be fulfilled, e.g. how the ACID (atomicity,
%% consistency, isolation and durability) properties are verified,
%% how the random numbers must be distributed, minimum sizes of
%% the different types of records, minimum duration of the benchmark,
diff --git a/lib/mnesia/test/mnesia_trans_access_test.erl b/lib/mnesia/test/mnesia_trans_access_test.erl
index 65206a85af..b33b807bfc 100644
--- a/lib/mnesia/test/mnesia_trans_access_test.erl
+++ b/lib/mnesia/test/mnesia_trans_access_test.erl
@@ -722,7 +722,7 @@ nested_transactions(Config, Child, Father) ->
{[{Tab, father, not_updated}], [{Tab, child, not_updated}]}
end,
- %% Syncronize things!!
+ %% Synchronize things!!
?match({atomic, ok}, mnesia:sync_transaction(fun() -> mnesia:write({Tab, sync, sync}) end)),
?match(ChildRes, rpc:call(Node1, mnesia, dirty_read, [{Tab, child}])),
@@ -1196,7 +1196,7 @@ index_delete_object(Config) when is_list(Config) ->
?verify_mnesia(Nodes, []).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Add and drop indecies
+%% Add and drop indices
add_table_index_ram(suite) -> [];
diff --git a/lib/observer/doc/src/observer_ug.xml b/lib/observer/doc/src/observer_ug.xml
index b0e8ef5872..348e613c85 100644
--- a/lib/observer/doc/src/observer_ug.xml
+++ b/lib/observer/doc/src/observer_ug.xml
@@ -252,7 +252,7 @@
<section>
<title>Sockets Tab</title>
- <p>Tab <em>Sockets</em> is devided into two parts.
+ <p>Tab <em>Sockets</em> is divided into two parts.
The first part contains general
<seeerl marker="kernel:socket"><c>socket</c></seeerl>
information and the second part
@@ -314,7 +314,7 @@
<title>Table Viewer Tab</title>
<p>Tab <em>Table Viewer</em> lists tables. By default, ETS tables
are displayed whereas unreadable private ETS tables and tables created by OTP
- applications are not diplayed. Use menu <em>View</em> to view "system"
+ applications are not displayed. Use menu <em>View</em> to view "system"
ETS tables, unreadable ETS tables, or Mnesia tables.
</p>
<p>Double-click to view the table content, or right-click and
@@ -360,7 +360,7 @@
the <em>Ports</em> tab. A special <em>new</em> identifier,
meaning all processes, or ports, started after trace start, can
be added with buttons <em>Add 'new' Processes</em> and <em>Add
- 'new' Ports</em>, respecively.
+ 'new' Ports</em>, respectively.
</p>
<p>
When adding processes or ports, a window with trace options is
diff --git a/lib/observer/doc/src/ttb_ug.xml b/lib/observer/doc/src/ttb_ug.xml
index be24db1aac..0411694c4e 100644
--- a/lib/observer/doc/src/ttb_ug.xml
+++ b/lib/observer/doc/src/ttb_ug.xml
@@ -394,7 +394,7 @@ check(stop) ->
this way is then merged with all other traces.</p>
<p>The autostart feature requires more data to be stored on
traced nodes. By default, the data is stored automatically
- to the file named "ttb_autostart.bin" in the currect working directory
+ to the file named "ttb_autostart.bin" in the current working directory
(cwd) of the traced node.
Users can change this behaviour (that is, on diskless
nodes) by specifying their own module to handle autostart data
diff --git a/lib/observer/src/Makefile b/lib/observer/src/Makefile
index 4280557d45..2edb2ceb3e 100644
--- a/lib/observer/src/Makefile
+++ b/lib/observer/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2002-2021. All Rights Reserved.
+# Copyright Ericsson AB 2002-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -128,7 +128,7 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-opt debug: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/observer/src/cdv_proc_cb.erl b/lib/observer/src/cdv_proc_cb.erl
index 11830065b7..dafd8ab5d2 100644
--- a/lib/observer/src/cdv_proc_cb.erl
+++ b/lib/observer/src/cdv_proc_cb.erl
@@ -153,7 +153,7 @@ info_fields() ->
{"Old Binary vheap", old_bin_vheap},
{"Binary vheap unused", bin_vheap_unused},
{"Old Binary vheap unused", old_bin_vheap_unused},
- {"Number of Heap Fragements", num_heap_frag},
+ {"Number of Heap Fragments", num_heap_frag},
{"Heap Fragment Data",heap_frag_data},
{"New Heap Start", new_heap_start},
{"New Heap Top", new_heap_top},
diff --git a/lib/observer/src/crashdump_viewer.erl b/lib/observer/src/crashdump_viewer.erl
index b876ce2945..a2f88986af 100644
--- a/lib/observer/src/crashdump_viewer.erl
+++ b/lib/observer/src/crashdump_viewer.erl
@@ -1652,7 +1652,7 @@ read_heap_lines_1(Fd, Acc) ->
%% Reduce the memory consumption by converting the
%% line to a binary. Measurements show that it may also
- %% be benefical for performance, too, because it makes the
+ %% be beneficial for performance, too, because it makes the
%% garbage collections cheaper.
Line = list_to_binary(Line1),
@@ -3357,7 +3357,7 @@ collect(Pids,Acc) ->
collect(lists:delete(Pid,Pids),[Result|Acc]);
{'DOWN', _Ref, process, Pid, _Error} ->
Warning =
- "WARNING: an error occured while parsing data.\n" ++
+ "WARNING: an error occurred while parsing data.\n" ++
case get(truncated) of
true -> "This might be because the dump is truncated.\n";
false -> ""
diff --git a/lib/observer/src/crashdump_viewer.hrl b/lib/observer/src/crashdump_viewer.hrl
index 856e558e6c..b6362f6d9d 100644
--- a/lib/observer/src/crashdump_viewer.hrl
+++ b/lib/observer/src/crashdump_viewer.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -42,7 +42,7 @@
}).
-record(proc,
- %% Initial data according to the follwoing:
+ %% Initial data according to the following:
%%
%% msg_q_len, reds, memory and stack_heap are integers because it must
%% be possible to sort on them. All other fields are strings
diff --git a/lib/observer/src/etop.erl b/lib/observer/src/etop.erl
index f0990f1f25..78ffe658e4 100644
--- a/lib/observer/src/etop.erl
+++ b/lib/observer/src/etop.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@ help() ->
"Options are:~n"
" node atom Required The erlang node to measure ~n"
" port integer The used port, NOTE: due to a bug this program~n"
- " will hang if the port is not avaiable~n"
+ " will hang if the port is not available~n"
" accumulate boolean If true execution time is accumulated ~n"
" lines integer Number of displayed processes~n"
" interval integer Display update interval in secs~n"
diff --git a/lib/observer/src/observer.app.src b/lib/observer/src/observer.app.src
index 09f959dabf..4cc1e870e5 100644
--- a/lib/observer/src/observer.app.src
+++ b/lib/observer/src/observer.app.src
@@ -69,5 +69,3 @@
{env, []},
{runtime_dependencies, ["wx-1.2","stdlib-3.13","runtime_tools-1.17",
"kernel-8.1","et-1.5","erts-11.0"]}]}.
-
-
diff --git a/lib/observer/src/observer_procinfo.erl b/lib/observer/src/observer_procinfo.erl
index 7ffdba262a..a22f76a4c7 100644
--- a/lib/observer/src/observer_procinfo.erl
+++ b/lib/observer/src/observer_procinfo.erl
@@ -339,7 +339,7 @@ fetch_state_info2(Pid, M) ->
%% Formatted status ?
case lists:keyfind(format_status, 1, rpc:call(node(Pid), M, module_info, [exports])) of
false -> Opt = {"Format", unknown};
- _ -> Opt = {"Format", overriden}
+ _ -> Opt = {"Format", overridden}
end,
[{"Behaviour", B}, Opt, {"State",OtherFormat}];
{badrpc,{'EXIT',{timeout, _}}} -> []
diff --git a/lib/observer/src/observer_trace_wx.erl b/lib/observer/src/observer_trace_wx.erl
index 5b8d4f5568..5b4e98a909 100644
--- a/lib/observer/src/observer_trace_wx.erl
+++ b/lib/observer/src/observer_trace_wx.erl
@@ -361,7 +361,7 @@ handle_event(#wx{event = #wxCommand{type = command_togglebutton_clicked, command
(TProcs == []) andalso (TPorts == []) andalso throw({error, "No processes or ports traced"}),
(Nodes == []) andalso throw({error, "No nodes traced"}),
HaveCallTrace = fun(#titem{opts=Os}) -> lists:member(functions,Os) end,
- WStr = "Call trace actived but no trace patterns used",
+ WStr = "Call trace activated but no trace patterns used",
(TPs == []) andalso lists:any(HaveCallTrace, TProcs) andalso
observer_wx:create_txt_dialog(Panel, WStr, "Warning", ?wxICON_WARNING),
@@ -763,7 +763,7 @@ do_add_patterns({Module, NewPs}, State=#state{tpatterns=TPs0, m_view=Mview, f_vi
{Old, [], []} ->
State;
{MPatterns, _New, _Changed} ->
- %% if dynamicly updates update New and Changed
+ %% if dynamically updates update New and Changed
TPs = dict:store(Module, MPatterns, TPs0),
update_modules_view(lists:sort(dict:fetch_keys(TPs)), Module, Mview),
update_functions_view(dict:fetch(Module, TPs), Fview),
@@ -1048,7 +1048,7 @@ textformat(Trace) when element(1, Trace) == trace_ts, tuple_size(Trace) >= 4 ->
textformat(Trace) when element(1, Trace) == drop, tuple_size(Trace) =:= 2 ->
io_lib:format("*** Dropped ~p messages.~n", [element(2,Trace)]);
textformat(Trace) when element(1, Trace) == seq_trace, tuple_size(Trace) >= 3 ->
- io_lib:format("*** Seq trace not implmented.~n", []);
+ io_lib:format("*** Seq trace not implemented.~n", []);
textformat(_) ->
"".
diff --git a/lib/observer/src/observer_wx.erl b/lib/observer/src/observer_wx.erl
index 07e2fb1b29..282651f979 100644
--- a/lib/observer/src/observer_wx.erl
+++ b/lib/observer/src/observer_wx.erl
@@ -29,6 +29,7 @@
%% Includes
-include_lib("wx/include/wx.hrl").
+-include_lib("kernel/include/file.hrl").
-include("observer_defs.hrl").
@@ -157,7 +158,7 @@ setup(#state{frame = Frame} = State) ->
wxNotebook:connect(Notebook, command_notebook_page_changed,
[{skip, true}, {id, ?ID_NOTEBOOK}]),
wxFrame:connect(Frame, close_window, []),
- wxMenu:connect(Frame, command_menu_selected),
+ wxMenu:connect(Frame, command_menu_selected, [{skip, true}]),
wxFrame:show(Frame),
%% Freeze and thaw is buggy currently
@@ -390,6 +391,10 @@ handle_event(#wx{id = Id, event = #wxCommand{type = command_menu_selected}},
end,
{noreply, change_node_view(Node, LState)};
+handle_event(#wx{id = Id, event = #wxCommand{type = command_menu_selected}}, State)
+ when Id >= ?wxID_OSX_MENU_FIRST, Id =< ?wxID_OSX_MENU_LAST ->
+ {noreply, State};
+
handle_event(Event, #state{active_tab=Pid} = State) ->
Pid ! Event,
{noreply, State}.
@@ -558,7 +563,7 @@ try_rpc(Node, Mod, Func, Args) ->
return_to_localnode(Frame, Node) ->
case node() =/= Node of
true ->
- create_txt_dialog(Frame, "Error occured on remote node",
+ create_txt_dialog(Frame, "Error occurred on remote node",
"Error", ?wxICON_ERROR),
disconnect_node(Node);
false ->
@@ -658,14 +663,16 @@ create_connect_dialog(connect, #state{frame = Frame}) ->
wxWindow:setSizerAndFit(Dialog, VSizer),
wxSizer:setSizeHints(VSizer, Dialog),
{ok,[[HomeDir]]} = init:get_argument(home),
- CookiePath = filename:join(HomeDir, ".erlang.cookie"),
- DefaultCookie = case filelib:is_file(CookiePath) of
- true ->
- {ok, Bin} = file:read_file(CookiePath),
- binary_to_list(Bin);
- false ->
- ""
- end,
+ XDGHome = filename:basedir(user_config,"erlang"),
+ DefaultCookie =
+ case file:path_open([HomeDir,XDGHome], ".erlang.cookie", [read]) of
+ {ok, File, _} ->
+ {ok, #file_info{ size = Sz }} = file:read_file_info(File),
+ {ok, Data} = file:read(File, Sz),
+ Data;
+ _ ->
+ ""
+ end,
wxTextCtrl:setValue(CookieCtrl, DefaultCookie),
case wxDialog:showModal(Dialog) of
?wxID_OK ->
@@ -833,7 +840,7 @@ is_rb_compatible(Node) ->
is_rb_server_running(Node, LogState) ->
%% If already started, somebody else may use it.
- %% We cannot use it too, as far log file would be overriden. Not fair.
+ %% We cannot use it too, as far log file would be overridden. Not fair.
case rpc:block_call(Node, erlang, whereis, [rb_server]) of
Pid when is_pid(Pid), (LogState == false) ->
throw("Error: rb_server is already started and maybe used by someone.");
diff --git a/lib/observer/src/ttb.erl b/lib/observer/src/ttb.erl
index 29a572d7fe..c4161f4e2a 100644
--- a/lib/observer/src/ttb.erl
+++ b/lib/observer/src/ttb.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1199,7 +1199,7 @@ start_client(FileOrWrap,Traci) ->
{fun handler/2, dict:to_list(Traci)}).
handler(Trace,Traci) ->
- %%We return our own Traci so that it not necesarry to look it up
+ %%We return our own Traci so that it not necessary to look it up
%%This may take time if something huge has been written to it
receive
{get,Collector} -> Collector ! {self(),{Trace,Traci}};
diff --git a/lib/observer/src/ttb_et.erl b/lib/observer/src/ttb_et.erl
index f90a7f6dcf..39c4c2180c 100644
--- a/lib/observer/src/ttb_et.erl
+++ b/lib/observer/src/ttb_et.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -52,7 +52,7 @@ collector(Trace) ->
%% all events backwards and collect call/return information:
%%
%% MFA collected from return_to events is added to call and
-%% return_from events as {caller,MFA} and {return_to,MFA} respecively.
+%% return_from events as {caller,MFA} and {return_to,MFA} respectively.
%% MFA collected from call events is added to return_to events as
%% {return_from,MFA}
%%
diff --git a/lib/observer/test/Makefile b/lib/observer/test/Makefile
index 1dc7a7e11b..8c7ca2fcfc 100644
--- a/lib/observer/test/Makefile
+++ b/lib/observer/test/Makefile
@@ -68,7 +68,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) \
$(MODULES) > $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/observer/test/crashdump_helper.erl b/lib/observer/test/crashdump_helper.erl
index 83455def93..8a5dd1011c 100644
--- a/lib/observer/test/crashdump_helper.erl
+++ b/lib/observer/test/crashdump_helper.erl
@@ -25,7 +25,7 @@
dump_persistent_terms/0,
create_persistent_terms/0,
dump_global_literals/0]).
--compile(r20).
+-compile(r22).
-include_lib("common_test/include/ct.hrl").
n1_proc(N2,Creator) ->
diff --git a/lib/observer/test/crashdump_viewer_SUITE.erl b/lib/observer/test/crashdump_viewer_SUITE.erl
index 230ab6ceed..2777e5f995 100644
--- a/lib/observer/test/crashdump_viewer_SUITE.erl
+++ b/lib/observer/test/crashdump_viewer_SUITE.erl
@@ -187,7 +187,7 @@ start_stop(Config) when is_list(Config) ->
ok.
recv_downs([]) ->
- ct:log("'DOWN' received from all registered proceses~n", []),
+ ct:log("'DOWN' received from all registered processes~n", []),
ok;
recv_downs(Regs) ->
receive
diff --git a/lib/observer/test/etop_SUITE.erl b/lib/observer/test/etop_SUITE.erl
index e324c9bbb1..8b112cba37 100644
--- a/lib/observer/test/etop_SUITE.erl
+++ b/lib/observer/test/etop_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@
-define(default_timeout, test_server:minutes(1)).
init_per_testcase(_Case, Config) ->
- ?line Dog=test_server:timetrap(?default_timeout),
+ Dog=test_server:timetrap(?default_timeout),
[{watchdog, Dog}|Config].
end_per_testcase(Case, Config) ->
try apply(?MODULE,Case,[cleanup,Config])
@@ -64,23 +64,23 @@ end_per_group(_GroupName, Config) ->
%% Start etop with text presentation
text(_) ->
- ?line {ok,Node} = test_server:start_node(node2,peer,[]),
+ {ok,Node} = test_server:start_node(node2,peer,[]),
%% Must spawn this process, else the test case will never end.
- ?line spawn_link(etop,start,[[{node,Node},{output,text},{interval,3}]]),
- ?line timer:sleep(4000),
- ?line etop:config(interval,2),
- ?line timer:sleep(3000),
- ?line etop:config(lines,5),
- ?line timer:sleep(3000),
- ?line etop:config(accumulate,true),
- ?line timer:sleep(3000),
- ?line etop:config(sort,reductions),
- ?line timer:sleep(3000),
- ?line etop:config(sort,memory),
- ?line timer:sleep(3000),
- ?line etop:config(sort,msg_q),
- ?line timer:sleep(3000),
+ spawn_link(etop,start,[[{node,Node},{output,text},{interval,3}]]),
+ timer:sleep(4000),
+ etop:config(interval,2),
+ timer:sleep(3000),
+ etop:config(lines,5),
+ timer:sleep(3000),
+ etop:config(accumulate,true),
+ timer:sleep(3000),
+ etop:config(sort,reductions),
+ timer:sleep(3000),
+ etop:config(sort,memory),
+ timer:sleep(3000),
+ etop:config(sort,msg_q),
+ timer:sleep(3000),
ok.
text(cleanup,_Config) ->
etop:stop(),
@@ -93,26 +93,26 @@ text_tracing_off(suite) ->
text_tracing_off(doc) ->
["Start etop with text presentation, and tracing turned off"];
text_tracing_off(Config) when is_list(Config) ->
- ?line {ok,Node} = test_server:start_node(node2,peer,[]),
+ {ok,Node} = test_server:start_node(node2,peer,[]),
%% Must spawn this process, else the test case will never end.
- ?line spawn_link(etop,start,[[{node,Node},
+ spawn_link(etop,start,[[{node,Node},
{output,text},
{interval,3},
{tracing,off}]]),
- ?line timer:sleep(4000),
- ?line etop:config(interval,2),
- ?line timer:sleep(3000),
- ?line etop:config(lines,5),
- ?line timer:sleep(3000),
- ?line etop:config(accumulate,true),
- ?line timer:sleep(3000),
- ?line etop:config(sort,memory),
- ?line timer:sleep(3000),
- ?line etop:config(sort,msg_q),
- ?line timer:sleep(3000),
- ?line etop:config(sort,runtime), % this should not crash, but has no effect
- ?line timer:sleep(3000),
+ timer:sleep(4000),
+ etop:config(interval,2),
+ timer:sleep(3000),
+ etop:config(lines,5),
+ timer:sleep(3000),
+ etop:config(accumulate,true),
+ timer:sleep(3000),
+ etop:config(sort,memory),
+ timer:sleep(3000),
+ etop:config(sort,msg_q),
+ timer:sleep(3000),
+ etop:config(sort,runtime), % this should not crash, but has no effect
+ timer:sleep(3000),
ok.
text_tracing_off(cleanup,_Config) ->
etop:stop(),
diff --git a/lib/observer/test/observer_SUITE.erl b/lib/observer/test/observer_SUITE.erl
index 575f63b956..8e8e3d5386 100644
--- a/lib/observer/test/observer_SUITE.erl
+++ b/lib/observer/test/observer_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -139,7 +139,7 @@ app_file(suite) ->
app_file(doc) ->
["Testing .app file"];
app_file(Config) when is_list(Config) ->
- ?line ok = test_server:app_test(observer),
+ ok = test_server:app_test(observer),
ok.
%% Testing .appup file
@@ -159,7 +159,7 @@ basic(Config) when is_list(Config) ->
wx:new(),
?P("basic -> try wx destroy"),
wx:destroy(),
- timer:send_after(100, "foobar"),
+ timer:start(),
?P("basic -> try start distribution"),
{foo, node@machine} ! dummy_msg, %% start distribution stuff
%% Otherwise ever lasting servers gets added to procs
diff --git a/lib/observer/test/ttb_SUITE.erl b/lib/observer/test/ttb_SUITE.erl
index ab02cdabb4..d44f89d92c 100644
--- a/lib/observer/test/ttb_SUITE.erl
+++ b/lib/observer/test/ttb_SUITE.erl
@@ -2,7 +2,7 @@
%% %CopyrightBegin%
%%
%%
-%% Copyright Ericsson AB 2002-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -40,7 +40,7 @@
-define(DIRNAME, "ddtemp").
init_per_testcase(Case, Config) ->
- ?line Dog=test_server:timetrap(?default_timeout),
+ Dog=test_server:timetrap(?default_timeout),
ttb:stop(),
rm(?OUTPUT),
[rm(Upload) || Upload<-filelib:wildcard("ttb_upload*")],
@@ -115,74 +115,74 @@ file(suite) ->
file(doc) ->
["Start tracing on multiple nodes, single file"];
file(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"file"),
- ?line {ok,[Node]} =
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"file"),
+ {ok,[Node]} =
ttb:tracer(Node,[{file, File},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{S,[{matched,Node,_}]}]} = ttb:p(S,call),
- ?line {ok,[OtherNode]} =
+ {ok,[{S,[{matched,Node,_}]}]} = ttb:p(S,call),
+ {ok,[OtherNode]} =
ttb:tracer([Node,OtherNode],[{file, File},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[]} = ttb:tracer([Node,OtherNode],
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[]} = ttb:tracer([Node,OtherNode],
[{file, File},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(filename:join(Privdir,atom_to_list(Node)++"-file")),
- ?line ok = ttb:format(filename:join(Privdir,
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(filename:join(Privdir,atom_to_list(Node)++"-file")),
+ ok = ttb:format(filename:join(Privdir,
atom_to_list(OtherNode)++"-file")),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace,
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
ok.
file(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
file_no_pi(suite) ->
[];
file_no_pi(doc) ->
["Start tracing on multiple nodes, single file, no process information"];
file_no_pi(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"file"),
- ?line {ok,[_,_]} =
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"file"),
+ {ok,[_,_]} =
ttb:tracer([Node,OtherNode],[{file, File},
{handler,{fun myhandler/4, S}},
{process_info,false}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(filename:join(Privdir,atom_to_list(Node)++"-file")),
- ?line ok = ttb:format(filename:join(Privdir,
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(filename:join(Privdir,atom_to_list(Node)++"-file")),
+ ok = ttb:format(filename:join(Privdir,
atom_to_list(OtherNode)++"-file")),
- ?line [{trace_ts,LocalProc,call,{?MODULE,foo,[]}, {_,_,_}},
+ [{trace_ts,LocalProc,call,{?MODULE,foo,[]}, {_,_,_}},
end_of_trace,
{trace_ts,RemoteProc,call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
- ?line true = is_pid(LocalProc),
- ?line true = is_pid(RemoteProc),
+ true = is_pid(LocalProc),
+ true = is_pid(RemoteProc),
ok.
file_no_pi(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
file_fetch(suite) ->
@@ -190,67 +190,67 @@ file_fetch(suite) ->
file_fetch(doc) ->
["stop with the fetch option, i.e. collect all files when ttb is stopped"];
file_fetch(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line ThisDir = filename:join(Privdir,this),
- ?line ok = file:make_dir(ThisDir),
- ?line OtherDir = filename:join(Privdir,other),
- ?line ok = file:make_dir(OtherDir),
- ?line ThisFile = filename:join(ThisDir,"file_fetch"),
- ?line OtherFile = filename:join(OtherDir,"file_fetch"),
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ ThisDir = filename:join(Privdir,this),
+ ok = file:make_dir(ThisDir),
+ OtherDir = filename:join(Privdir,other),
+ ok = file:make_dir(OtherDir),
+ ThisFile = filename:join(ThisDir,"file_fetch"),
+ OtherFile = filename:join(OtherDir,"file_fetch"),
%% I'm setting priv_dir as cwd, so ttb_upload directory is created there
%% and not in any other strange place!
- ?line {ok,Cwd} = file:get_cwd(),
- ?line ok = file:set_cwd(Privdir),
+ {ok,Cwd} = file:get_cwd(),
+ ok = file:set_cwd(Privdir),
- ?line {ok,[Node]} =
+ {ok,[Node]} =
ttb:tracer(Node,[{file, ThisFile},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[OtherNode]} =
+ {ok,[OtherNode]} =
ttb:tracer([OtherNode],[{file, OtherFile},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line test_server:capture_start(),
- ?line ttb:stop([return_fetch_dir]),
- ?line test_server:capture_stop(),
- ?line [StoreString] = test_server:capture_get(),
- ?line UploadDir =
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ test_server:capture_start(),
+ ttb:stop([return_fetch_dir]),
+ test_server:capture_stop(),
+ [StoreString] = test_server:capture_get(),
+ UploadDir =
lists:last(string:lexemes(lists:flatten(StoreString),"$ \n")),
%% check that files are no longer in original directories...
- ?line ok = check_gone(ThisDir,atom_to_list(Node)++"-file_fetch"),
- ?line ok = check_gone(ThisDir,atom_to_list(Node)++"-file_fetch.ti"),
-% ?line false = lists:member(TrcLog,ThisList),
-% ?line false = lists:member(TIFile,ThisList),
+ ok = check_gone(ThisDir,atom_to_list(Node)++"-file_fetch"),
+ ok = check_gone(ThisDir,atom_to_list(Node)++"-file_fetch.ti"),
+% false = lists:member(TrcLog,ThisList),
+% false = lists:member(TIFile,ThisList),
- ?line {ok,OtherList} = file:list_dir(OtherDir),
- ?line false = lists:member(atom_to_list(OtherNode)++"-file_fetch",OtherList),
- ?line false = lists:member(atom_to_list(OtherNode)++"-file_fetch.ti",
+ {ok,OtherList} = file:list_dir(OtherDir),
+ false = lists:member(atom_to_list(OtherNode)++"-file_fetch",OtherList),
+ false = lists:member(atom_to_list(OtherNode)++"-file_fetch.ti",
OtherList),
%% but instead in ttb_upload directory, where they can be formatted
- ?line ok = ttb:format(filename:join(UploadDir,
+ ok = ttb:format(filename:join(UploadDir,
atom_to_list(Node)++"-file_fetch")),
- ?line ok = ttb:format(filename:join(UploadDir,
+ ok = ttb:format(filename:join(UploadDir,
atom_to_list(OtherNode)++"-file_fetch")),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace,
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
- ?line ok = file:set_cwd(Cwd),
+ ok = file:set_cwd(Cwd),
ok.
file_fetch(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
wrap(suite) ->
@@ -258,44 +258,44 @@ wrap(suite) ->
wrap(doc) ->
["Start tracing on multiple nodes, wrap files"];
wrap(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"wrap"),
- ?line {ok,[_,_]} =
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"wrap"),
+ {ok,[_,_]} =
ttb:tracer([Node,OtherNode],[{file, {wrap,File,200,3}},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(filename:join(Privdir,
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(filename:join(Privdir,
atom_to_list(Node)++"-wrap.*.wrp")),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
- ?line ok = ttb:format(filename:join(Privdir,
+ ok = ttb:format(filename:join(Privdir,
atom_to_list(OtherNode)++"-wrap.*.wrp")),
- ?line [{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
%% Check that merge does not crash even if the timestamp flag is not on.
- ?line ok = ttb:format(
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-wrap.*.wrp"),
filename:join(Privdir,
atom_to_list(OtherNode)++"-wrap.*.wrp")],[{disable_sort,true}]),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},
@@ -305,37 +305,37 @@ wrap(Config) when is_list(Config) ->
ok.
wrap(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
wrap_merge(suite) ->
[];
wrap_merge(doc) ->
["Start tracing on multiple nodes, wrap files, merge logs from both nodes"];
wrap_merge(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"wrap_merge"),
- ?line {ok,[_,_]} =
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"wrap_merge"),
+ {ok,[_,_]} =
ttb:tracer([Node,OtherNode],[{file, {wrap,File,200,3}},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]}=ttb:p(all,[call,timestamp]),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]}=ttb:p(all,[call,timestamp]),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-wrap_merge.*.wrp"),
filename:join(Privdir,
atom_to_list(OtherNode)++"-wrap_merge.*.wrp")]),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},_},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},_},
{trace_ts,_,call,{?MODULE,foo,[]},_},
{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},_},
{trace_ts,_,call,{?MODULE,foo,[]},_},
@@ -345,7 +345,7 @@ wrap_merge(Config) when is_list(Config) ->
ok.
wrap_merge(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
wrap_merge_fetch_format(suite) ->
@@ -353,31 +353,31 @@ wrap_merge_fetch_format(suite) ->
wrap_merge_fetch_format(doc) ->
["Start tracing on multiple nodes, wrap files, fetch and format at stop"];
wrap_merge_fetch_format(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"wrap_merge_fetch_format"),
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"wrap_merge_fetch_format"),
%% I'm setting priv_dir as cwd, so ttb_upload directory is created there
%% and not in any other strange place!
- ?line {ok,Cwd} = file:get_cwd(),
- ?line ok = file:set_cwd(Privdir),
+ {ok,Cwd} = file:get_cwd(),
+ ok = file:set_cwd(Privdir),
- ?line {ok,[_,_]} =
+ {ok,[_,_]} =
ttb:tracer([Node,OtherNode],[{file, {wrap,File,200,3}},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]}=ttb:p(all,[call,timestamp]),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([format]),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},_},
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]}=ttb:p(all,[call,timestamp]),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([format]),
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},_},
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},_},
{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},_},
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},_},
@@ -385,55 +385,55 @@ wrap_merge_fetch_format(Config) when is_list(Config) ->
{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},_},
end_of_trace] = flush(),
- ?line ok = file:set_cwd(Cwd),
+ ok = file:set_cwd(Cwd),
ok.
wrap_merge_fetch_format(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
write_config1(suite) ->
[];
write_config1(doc) ->
["Write config given commands"];
write_config1(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
-
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"write_config1"),
- ?line ok = ttb:write_config(File,
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"write_config1"),
+ ok = ttb:write_config(File,
[{ttb,tracer,[[Node,OtherNode],
[{file, File},
{handler,{fun myhandler/4,S}}]]},
{ttb,p,[all,call]},
{ttb,tp,[?MODULE,foo,[]]}]),
- ?line [_,_,_] = ttb:list_config(File),
- ?line ok = ttb:run_config(File),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ [_,_,_] = ttb:list_config(File),
+ ok = ttb:run_config(File),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-write_config1"),
filename:join(Privdir,
atom_to_list(OtherNode)++"-write_config1")]),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,Other,call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
case metatest(Other,OtherNode,Privdir,"-write_config1.ti") of
{error,Reason} ->
timer:sleep(5000),
- ?line ok = ttb:format(
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-write_config1"),
filename:join(Privdir,
atom_to_list(OtherNode)++
"-write_config1")]),
- ?line io:format("\nTrying again: ~p\n",[flush()]),
- ?line ct:fail(Reason);
+ io:format("\nTrying again: ~p\n",[flush()]),
+ ct:fail(Reason);
ok ->
ok
end,
@@ -441,58 +441,58 @@ write_config1(Config) when is_list(Config) ->
write_config1(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
write_config2(suite) ->
[];
write_config2(doc) ->
["Write config from history (all)"];
write_config2(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"write_config2"),
- ?line {ok,[_,_]} =
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"write_config2"),
+ {ok,[_,_]} =
ttb:tracer([Node,OtherNode],[{file, File},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ok = ttb:write_config(File,all),
- ?line ttb:stop(),
- ?line [_,_,_] = ttb:list_config(File),
- ?line ok = ttb:run_config(File),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ok = ttb:write_config(File,all),
+ ttb:stop(),
+ [_,_,_] = ttb:list_config(File),
+ ok = ttb:run_config(File),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-write_config2"),
filename:join(Privdir,
atom_to_list(OtherNode)++"-write_config2")]),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,Other,call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
case metatest(Other,OtherNode,Privdir,"-write_config2.ti") of
{error,Reason} ->
timer:sleep(5000),
- ?line ok = ttb:format(
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-write_config2"),
filename:join(Privdir,
atom_to_list(OtherNode)++
"-write_config2")]),
- ?line io:format("\nTrying again: ~p\n",[flush()]),
- ?line ct:fail(Reason);
+ io:format("\nTrying again: ~p\n",[flush()]),
+ ct:fail(Reason);
ok ->
ok
end,
ok.
write_config2(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
write_config3(suite) ->
@@ -500,65 +500,65 @@ write_config3(suite) ->
write_config3(doc) ->
["Write config from history (selected and append)"];
write_config3(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"write_config3"),
- ?line {ok,[_,_]} =
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"write_config3"),
+ {ok,[_,_]} =
ttb:tracer([Node,OtherNode],[{file, File},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ok = ttb:write_config(File,[1,2]),
- ?line ttb:stop([nofetch]),
- ?line [_,_] = ttb:list_config(File),
- ?line ok = ttb:run_config(File),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ok = ttb:write_config(File,[1,2]),
+ ttb:stop([nofetch]),
+ [_,_] = ttb:list_config(File),
+ ok = ttb:run_config(File),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-write_config3"),
filename:join(Privdir,
atom_to_list(OtherNode)++"-write_config3")]),
- ?line [end_of_trace] = flush(), %foo is not traced
+ [end_of_trace] = flush(), %foo is not traced
- ?line ok = ttb:write_config(File,[{ttb,tp,[?MODULE,foo,[]]}],
+ ok = ttb:write_config(File,[{ttb,tp,[?MODULE,foo,[]]}],
[append]),
- ?line [_,_,_] = ttb:list_config(File),
- ?line ok = ttb:run_config(File),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ [_,_,_] = ttb:list_config(File),
+ ok = ttb:run_config(File),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-write_config3"),
filename:join(Privdir,
atom_to_list(OtherNode)++"-write_config3")]),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
{trace_ts,Other,call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
case metatest(Other,OtherNode,Privdir,"-write_config3.ti") of
{error,Reason} ->
timer:sleep(5000),
- ?line ok = ttb:format(
+ ok = ttb:format(
[filename:join(Privdir,
atom_to_list(Node)++"-write_config3"),
filename:join(Privdir,
atom_to_list(OtherNode)++
"-write_config3")]),
- ?line io:format("\nTrying again: ~p\n",[flush()]),
- ?line ct:fail(Reason);
+ io:format("\nTrying again: ~p\n",[flush()]),
+ ct:fail(Reason);
ok ->
ok
end,
ok.
write_config3(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
@@ -567,39 +567,39 @@ history(suite) ->
history(doc) ->
["List history and execute entry from history"];
history(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
-
- ?line Nodes = [Node,OtherNode],
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"history"),
- ?line StartOpts = [{file, File},
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+
+ Nodes = [Node,OtherNode],
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"history"),
+ StartOpts = [{file, File},
{handler,{fun myhandler/4, S}}],
- ?line {ok,[_,_]} = ttb:tracer(Nodes,StartOpts),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:ctp(?MODULE,foo),
- ?line [{1,{ttb,tracer,[Nodes,StartOpts]}},
+ {ok,[_,_]} = ttb:tracer(Nodes,StartOpts),
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:ctp(?MODULE,foo),
+ [{1,{ttb,tracer,[Nodes,StartOpts]}},
{2,{ttb,p,[all,call]}},
{3,{ttb,tp,[?MODULE,foo,[]]}},
{4,{ttb,ctp,[?MODULE,foo]}}] = ttb:list_history(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ok = ttb:run_history(3),
- ?line ?MODULE:foo(),
- ?line ok = ttb:run_history([3,4]),
- ?line ?MODULE:foo(),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ok = ttb:run_history(3),
+ ?MODULE:foo(),
+ ok = ttb:run_history([3,4]),
+ ?MODULE:foo(),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,atom_to_list(Node)++"-history"),
filename:join(Privdir,atom_to_list(OtherNode)++"-history")]),
- ?line [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
ok.
history(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
write_trace_info(suite) ->
@@ -607,34 +607,34 @@ write_trace_info(suite) ->
write_trace_info(doc) ->
["Write trace info and give handler explicitly in format command"];
write_trace_info(Config) when is_list(Config) ->
- ?line Node = node(),
- ?line {ok,OtherNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"write_trace_info"),
- ?line {ok,[_,_]} =
+ Node = node(),
+ {ok,OtherNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"write_trace_info"),
+ {ok,[_,_]} =
ttb:tracer([Node,OtherNode],[{file, File},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line ok = ttb:write_trace_info(mytraceinfo,fun() -> node() end),
- ?line ?MODULE:foo(),
- ?line rpc:call(OtherNode,?MODULE,foo,[]),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ {ok,[{all,[{matched,_,_},{matched,_,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,_,1},{matched,_,1}]} = ttb:tp(?MODULE,foo,[]),
+ ok = ttb:write_trace_info(mytraceinfo,fun() -> node() end),
+ ?MODULE:foo(),
+ rpc:call(OtherNode,?MODULE,foo,[]),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,atom_to_list(Node)++"-write_trace_info"),
filename:join(Privdir,
atom_to_list(OtherNode)++"-write_trace_info")],
[{handler,{fun otherhandler/4,S}}]),
- ?line [{{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},[Node]},
+ [{{trace_ts,{S,_,Node},call,{?MODULE,foo,[]},{_,_,_}},[Node]},
{{trace_ts,{_,_,OtherNode},call,{?MODULE,foo,[]},{_,_,_}},[OtherNode]},
end_of_trace] = flush(),
ok.
write_trace_info(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
seq_trace(suite) ->
@@ -642,22 +642,22 @@ seq_trace(suite) ->
seq_trace(doc) ->
["Test sequential tracing"];
seq_trace(Config) when is_list(Config) ->
- ?line S = self(),
+ S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"seq_trace"),
- ?line {ok,[Node]} = ttb:tracer(node(),[{file,File},
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"seq_trace"),
+ {ok,[Node]} = ttb:tracer(node(),[{file,File},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{new,[{matched,Node,0}]}]} = ttb:p(new,call),
- ?line {ok,[{matched,Node,1},{saved,1}]} =
+ {ok,[{new,[{matched,Node,0}]}]} = ttb:p(new,call),
+ {ok,[{matched,Node,1},{saved,1}]} =
ttb:tpl(?MODULE,seq,0,ttb:seq_trigger_ms(send)),
- ?line Start = spawn(fun() -> seq() end),
- ?line timer:sleep(300),
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(
+ Start = spawn(fun() -> seq() end),
+ timer:sleep(300),
+ ttb:stop([nofetch]),
+ ok = ttb:format(
[filename:join(Privdir,atom_to_list(Node)++"-seq_trace")]),
- ?line [{trace_ts,StartProc,call,{?MODULE,seq,[]},{_,_,_}},
+ [{trace_ts,StartProc,call,{?MODULE,seq,[]},{_,_,_}},
{seq_trace,0,{send,{First, Seq0},StartProc,P1Proc,SpawnRequest1}},
{seq_trace,0,{send,{Seq0, Seq1},P1Proc,StartProc,SpawnReply1}},
{seq_trace,0,{send,{Seq2, Seq3},StartProc,P2Proc,SpawnRequest2}},
@@ -726,68 +726,68 @@ diskless(suite) ->
diskless(doc) ->
["Start tracing on diskless remote node"];
diskless(Config) when is_list(Config) ->
- ?line {ok,RemoteNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"diskless"),
- ?line {ok,[RemoteNode]} =
+ {ok,RemoteNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"diskless"),
+ {ok,[RemoteNode]} =
ttb:tracer([RemoteNode],[{file, {local, File}},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,RemoteNode,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,RemoteNode,1}]} = ttb:tp(?MODULE,foo,[]),
+ {ok,[{all,[{matched,RemoteNode,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,RemoteNode,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line rpc:call(RemoteNode,?MODULE,foo,[]),
- ?line timer:sleep(5000), % needed for the IP port to flush
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(filename:join(Privdir,
+ rpc:call(RemoteNode,?MODULE,foo,[]),
+ timer:sleep(5000), % needed for the IP port to flush
+ ttb:stop([nofetch]),
+ ok = ttb:format(filename:join(Privdir,
atom_to_list(RemoteNode)++"-diskless")),
- ?line [{trace_ts,{_,_,RemoteNode},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{_,_,RemoteNode},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
ok.
diskless(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
diskless_wrap(suite) ->
[];
diskless_wrap(doc) ->
["Start tracing on diskless remote node, save to local wrapped file"];
diskless_wrap(Config) when is_list(Config) ->
- ?line {ok,RemoteNode} = test_server:start_node(node2,slave,[]),
- ?line c:nl(?MODULE),
- ?line S = self(),
- ?line Privdir=priv_dir(Config),
- ?line File = filename:join(Privdir,"diskless"),
- ?line {ok,[RemoteNode]} =
+ {ok,RemoteNode} = test_server:start_node(node2,slave,[]),
+ c:nl(?MODULE),
+ S = self(),
+ Privdir=priv_dir(Config),
+ File = filename:join(Privdir,"diskless"),
+ {ok,[RemoteNode]} =
ttb:tracer([RemoteNode],[{file, {local, {wrap,File,200,3}}},
{handler,{fun myhandler/4, S}}]),
- ?line {ok,[{all,[{matched,RemoteNode,_}]}]} = ttb:p(all,call),
- ?line {ok,[{matched,RemoteNode,1}]} = ttb:tp(?MODULE,foo,[]),
+ {ok,[{all,[{matched,RemoteNode,_}]}]} = ttb:p(all,call),
+ {ok,[{matched,RemoteNode,1}]} = ttb:tp(?MODULE,foo,[]),
- ?line rpc:call(RemoteNode,?MODULE,foo,[]),
- ?line timer:sleep(5000), % needed for the IP port to flush
- ?line ttb:stop([nofetch]),
- ?line ok = ttb:format(filename:join(Privdir,
+ rpc:call(RemoteNode,?MODULE,foo,[]),
+ timer:sleep(5000), % needed for the IP port to flush
+ ttb:stop([nofetch]),
+ ok = ttb:format(filename:join(Privdir,
atom_to_list(RemoteNode)++"-diskless.*.wrp")),
- ?line [{trace_ts,{_,_,RemoteNode},call,{?MODULE,foo,[]},{_,_,_}},
+ [{trace_ts,{_,_,RemoteNode},call,{?MODULE,foo,[]},{_,_,_}},
end_of_trace] = flush(),
ok.
diskless_wrap(cleanup,_Config) ->
- ?line test_server:stop_node(ttb_helper:get_node(node2)).
+ test_server:stop_node(ttb_helper:get_node(node2)).
otp_4967_1(suite) ->
[];
otp_4967_1(doc) ->
["OTP-4967: clear flag"];
otp_4967_1(Config) when is_list(Config) ->
- ?line {ok,[Node]} = ttb:tracer(),
- ?line {ok,[{all,[{matched,Node,_}]}]} = ttb:p(all,call),
- ?line {ok,[{all,[{matched,Node,_}]}]} = ttb:p(all,clear),
- ?line stopped = ttb:stop(),
+ {ok,[Node]} = ttb:tracer(),
+ {ok,[{all,[{matched,Node,_}]}]} = ttb:p(all,call),
+ {ok,[{all,[{matched,Node,_}]}]} = ttb:p(all,clear),
+ stopped = ttb:stop(),
ok.
@@ -797,37 +797,37 @@ otp_4967_2(doc) ->
["OTP-4967: Trace message sent to {Name, Node}"];
otp_4967_2(Config) when is_list(Config) ->
io:format("1: ~p",[erlang:timestamp()]),
- ?line Privdir = priv_dir(Config),
+ Privdir = priv_dir(Config),
io:format("2: ~p",[erlang:timestamp()]),
- ?line File = filename:join(Privdir,"otp_4967"),
+ File = filename:join(Privdir,"otp_4967"),
io:format("3: ~p",[erlang:timestamp()]),
- ?line S = self(),
+ S = self(),
io:format("4: ~p",[erlang:timestamp()]),
- ?line {ok,[Node]} =
+ {ok,[Node]} =
ttb:tracer(node(),[{file, File},
{handler,{fun myhandler/4, S}}]),
io:format("5: ~p",[erlang:timestamp()]),
%% Test that delayed registration of a process works.
receive after 200 -> ok end,
- ?line register(otp_4967,self()),
+ register(otp_4967,self()),
io:format("6: ~p",[erlang:timestamp()]),
- ?line {ok,[{S,[{matched,Node,1}]}]} = ttb:p(self(),s),
+ {ok,[{S,[{matched,Node,1}]}]} = ttb:p(self(),s),
io:format("7: ~p",[erlang:timestamp()]),
- ?line {otp_4967,node()} ! heihopp,
+ {otp_4967,node()} ! heihopp,
io:format("8: ~p",[erlang:timestamp()]),
- ?line stopped = ttb:stop([format]),
+ stopped = ttb:stop([format]),
io:format("9: ~p",[erlang:timestamp()]),
- ?line Msgs = flush(),
+ Msgs = flush(),
io:format("10: ~p",[erlang:timestamp()]),
- ?line io:format("Messages received: \n~p\n",[Msgs]),
+ io:format("Messages received: \n~p\n",[Msgs]),
io:format("11: ~p",[erlang:timestamp()]),
- ?line true = lists:member(heihopp,Msgs), % the heihopp message itself
+ true = lists:member(heihopp,Msgs), % the heihopp message itself
io:format("13: ~p",[erlang:timestamp()]),
- ?line {value,{trace_ts,_,send,heihopp,{_,otp_4967,Node},{_,_,_}}} =
+ {value,{trace_ts,_,send,heihopp,{_,otp_4967,Node},{_,_,_}}} =
lists:keysearch(heihopp,4,Msgs), % trace trace of the heihopp message
io:format("14: ~p",[erlang:timestamp()]),
- ?line end_of_trace = lists:last(Msgs), % end of the trace
+ end_of_trace = lists:last(Msgs), % end of the trace
ok.
@@ -876,7 +876,7 @@ flush(Acc) ->
end.
foo() ->
- %% Sync between nodes is not always exact, so here is a litle timeout to
+ %% Sync between nodes is not always exact, so here is a little timeout to
%% make sure traces come i correct sequence when merging.
%% In the real world there is no way to avoid this kind of trouble
timer:sleep(100),
@@ -909,8 +909,8 @@ metatest(Proc,Node,Privdir,Filename) ->
end.
check_gone(Dir,File) ->
- ?line {ok,List} = file:list_dir(Dir),
- ?line case lists:member(File,List) of
+ {ok,List} = file:list_dir(Dir),
+ case lists:member(File,List) of
true ->
timer:sleep(2000),
{ok,NewList} = file:list_dir(Dir),
@@ -928,11 +928,11 @@ check_gone(Dir,File) ->
end.
start_client_and_server() ->
- ?line {ok,ClientNode} = test_server:start_node(client,slave,[]),
- ?line ok = ttb_helper:c(code, add_paths, [code:get_path()]),
- ?line {ok,ServerNode} = test_server:start_node(server,slave,[]),
- ?line ok = ttb_helper:s(code, add_paths, [code:get_path()]),
- ?line ttb_helper:clear(),
+ {ok,ClientNode} = test_server:start_node(client,slave,[]),
+ ok = ttb_helper:c(code, add_paths, [code:get_path()]),
+ {ok,ServerNode} = test_server:start_node(server,slave,[]),
+ ok = ttb_helper:s(code, add_paths, [code:get_path()]),
+ ttb_helper:clear(),
{ServerNode, ClientNode}.
stop_client_and_server() ->
@@ -940,8 +940,8 @@ stop_client_and_server() ->
ServerNode = ttb_helper:get_node(server),
erlang:monitor_node(ClientNode,true),
erlang:monitor_node(ServerNode,true),
- ?line test_server:stop_node(ClientNode),
- ?line test_server:stop_node(ServerNode),
+ test_server:stop_node(ClientNode),
+ test_server:stop_node(ServerNode),
wait_for_client_and_server_stop(ClientNode,ServerNode).
wait_for_client_and_server_stop(undefined,undefined) ->
@@ -957,20 +957,20 @@ wait_for_client_and_server_stop(ClientNode,ServerNode) ->
end.
begin_trace(ServerNode, ClientNode, Dest) ->
- ?line {ok, _} =
+ {ok, _} =
ttb:tracer([ServerNode,ClientNode],[{file, Dest}]),
- ?line ttb:p(all, call),
- ?line ttb:tp(server, received, []),
- ?line ttb:tp(client, put, []),
- ?line ttb:tp(client, get, []).
+ ttb:p(all, call),
+ ttb:tp(server, received, []),
+ ttb:tp(client, put, []),
+ ttb:tp(client, get, []).
begin_trace_local(ServerNode, ClientNode, Dest) ->
- ?line {ok, _} =
+ {ok, _} =
ttb:tracer([ServerNode,ClientNode],[{file, Dest}]),
- ?line ttb:p(all, call),
- ?line ttb:tpl(server, received, []),
- ?line ttb:tpl(client, put, []),
- ?line ttb:tpl(client, get, []).
+ ttb:p(all, call),
+ ttb:tpl(server, received, []),
+ ttb:tpl(client, put, []),
+ ttb:tpl(client, get, []).
check_size(N, Dest, Output, ServerNode, ClientNode) ->
begin_trace(ServerNode, ClientNode, Dest),
@@ -997,16 +997,16 @@ fetch_when_no_option_given(suite) ->
fetch_when_no_option_given(doc) ->
["Fetch when no option given"];
fetch_when_no_option_given(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line {ok, Privdir} = file:get_cwd(),
- ?line [] = filelib:wildcard(filename:join(Privdir,"ttb_upload_temptest*")),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ {ok, Privdir} = file:get_cwd(),
+ [] = filelib:wildcard(filename:join(Privdir,"ttb_upload_temptest*")),
begin_trace(ServerNode, ClientNode, ?FNAME),
- ?line ttb_helper:msgs(4),
- ?line stopped = ttb:stop(),
- ?line [_] = filelib:wildcard(filename:join(Privdir,"ttb_upload_temptest*")).
+ ttb_helper:msgs(4),
+ stopped = ttb:stop(),
+ [_] = filelib:wildcard(filename:join(Privdir,"ttb_upload_temptest*")).
fetch_when_no_option_given(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
basic_ttb_run_ip_port(suite) ->
@@ -1014,123 +1014,123 @@ basic_ttb_run_ip_port(suite) ->
basic_ttb_run_ip_port(doc) ->
["Basic ttb run ip port"];
basic_ttb_run_ip_port(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line check_size(1, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode),
- ?line check_size(2, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode),
- ?line check_size(10, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ check_size(1, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode),
+ check_size(2, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode),
+ check_size(10, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode).
basic_ttb_run_ip_port(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
basic_ttb_run_file_port(suite) ->
[];
basic_ttb_run_file_port(doc) ->
["Basic ttb run file port"];
basic_ttb_run_file_port(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line check_size(1, ?FNAME, ?OUTPUT, ServerNode, ClientNode),
- ?line check_size(2, ?FNAME, ?OUTPUT, ServerNode, ClientNode),
- ?line check_size(10, ?FNAME, ?OUTPUT, ServerNode, ClientNode).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ check_size(1, ?FNAME, ?OUTPUT, ServerNode, ClientNode),
+ check_size(2, ?FNAME, ?OUTPUT, ServerNode, ClientNode),
+ check_size(10, ?FNAME, ?OUTPUT, ServerNode, ClientNode).
basic_ttb_run_file_port(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
return_fetch_dir_implies_fetch(suite) ->
[];
return_fetch_dir_implies_fetch(doc) ->
["Return_fetch_dir implies fetch"];
return_fetch_dir_implies_fetch(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace(ServerNode, ClientNode, ?FNAME),
- ?line ttb_helper:msgs(2),
- ?line {_,_} = ttb:stop([return_fetch_dir]).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace(ServerNode, ClientNode, ?FNAME),
+ ttb_helper:msgs(2),
+ {_,_} = ttb:stop([return_fetch_dir]).
return_fetch_dir_implies_fetch(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
logfile_name_in_fetch_dir(suite) ->
[];
logfile_name_in_fetch_dir(doc) ->
["Logfile name in fetch dir"];
logfile_name_in_fetch_dir(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace(ServerNode, ClientNode, {local, ?FNAME}),
- ?line {_,Dir} = ttb:stop([return_fetch_dir]),
- ?line P1 = lists:nth(3, string:lexemes(filename:basename(Dir), "_")),
- ?line P2 = hd(string:lexemes(P1, "-")),
- ?line _File = P2.
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace(ServerNode, ClientNode, {local, ?FNAME}),
+ {_,Dir} = ttb:stop([return_fetch_dir]),
+ P1 = lists:nth(3, string:lexemes(filename:basename(Dir), "_")),
+ P2 = hd(string:lexemes(P1, "-")),
+ _File = P2.
logfile_name_in_fetch_dir(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
upload_to_my_logdir(suite) ->
[];
upload_to_my_logdir(doc) ->
["Upload to my logdir"];
upload_to_my_logdir(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line {ok, _} =
+ {ServerNode, ClientNode} = start_client_and_server(),
+ {ok, _} =
ttb:tracer([ServerNode,ClientNode],[{file, ?FNAME}]),
- ?line {stopped,_} = ttb:stop([return_fetch_dir, {fetch_dir, ?DIRNAME}]),
- ?line true = filelib:is_file(?DIRNAME),
- ?line [] = filelib:wildcard("ttb_upload_"++?FNAME).
+ {stopped,_} = ttb:stop([return_fetch_dir, {fetch_dir, ?DIRNAME}]),
+ true = filelib:is_file(?DIRNAME),
+ [] = filelib:wildcard("ttb_upload_"++?FNAME).
upload_to_my_logdir(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
upload_to_my_existing_logdir(suite) ->
[];
upload_to_my_existing_logdir(doc) ->
["Upload to my existing logdir"];
upload_to_my_existing_logdir(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line ok = file:make_dir(?DIRNAME),
- ?line {ok, _} =
+ {ServerNode, ClientNode} = start_client_and_server(),
+ ok = file:make_dir(?DIRNAME),
+ {ok, _} =
ttb:tracer([ServerNode,ClientNode],[{file, ?FNAME}]),
- ?line {error,_,_} = (catch ttb:stop([return_fetch_dir, {fetch_dir, ?DIRNAME}])),
- ?line {stopped,_} = ttb:stop(return_fetch_dir).
+ {error,_,_} = (catch ttb:stop([return_fetch_dir, {fetch_dir, ?DIRNAME}])),
+ {stopped,_} = ttb:stop(return_fetch_dir).
upload_to_my_existing_logdir(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
fetch_with_options_not_as_list(suite) ->
[];
fetch_with_options_not_as_list(doc) ->
["Fetch with options not as list"];
fetch_with_options_not_as_list(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line {ok, _} =
+ {ServerNode, ClientNode} = start_client_and_server(),
+ {ok, _} =
ttb:tracer([ServerNode,ClientNode],[{file, ?FNAME}]),
- ?line {stopped, D} = ttb:stop(return_fetch_dir),
- ?line false = filelib:is_file(?OUTPUT),
- ?line ttb:format(D, {out, ?OUTPUT}),
- ?line true = filelib:is_file(?OUTPUT).
+ {stopped, D} = ttb:stop(return_fetch_dir),
+ false = filelib:is_file(?OUTPUT),
+ ttb:format(D, {out, ?OUTPUT}),
+ true = filelib:is_file(?OUTPUT).
fetch_with_options_not_as_list(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
error_when_formatting_multiple_files_4393(suite) ->
[];
error_when_formatting_multiple_files_4393(doc) ->
["Error when formatting multiple files"];
error_when_formatting_multiple_files_4393(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace(ServerNode, ClientNode, ?FNAME),
- ?line ttb_helper:msgs(2),
- ?line {_, Dir} = ttb:stop(return_fetch_dir),
- ?line Files = [filename:join(Dir, atom_to_list(ServerNode) ++ "-" ++ ?FNAME),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace(ServerNode, ClientNode, ?FNAME),
+ ttb_helper:msgs(2),
+ {_, Dir} = ttb:stop(return_fetch_dir),
+ Files = [filename:join(Dir, atom_to_list(ServerNode) ++ "-" ++ ?FNAME),
filename:join(Dir, atom_to_list(ClientNode) ++ "-" ++ ?FNAME)],
- ?line ok = ttb:format(Files).
+ ok = ttb:format(Files).
error_when_formatting_multiple_files_4393(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
format_on_trace_stop(suite) ->
[];
format_on_trace_stop(doc) ->
["Format on trace stop"];
format_on_trace_stop(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace(ServerNode, ClientNode, {local, ?FNAME}),
- ?line ttb_helper:msgs_ip(2),
- ?line file:delete("HANDLER_OK"),
- ?line {_,_} = ttb:stop([fetch, return_fetch_dir, {format, {handler, marking_call_handler()}}]),
- ?line true = filelib:is_file("HANDLER_OK"),
- ?line ok = file:delete("HANDLER_OK").
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace(ServerNode, ClientNode, {local, ?FNAME}),
+ ttb_helper:msgs_ip(2),
+ file:delete("HANDLER_OK"),
+ {_,_} = ttb:stop([fetch, return_fetch_dir, {format, {handler, marking_call_handler()}}]),
+ true = filelib:is_file("HANDLER_OK"),
+ ok = file:delete("HANDLER_OK").
format_on_trace_stop(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
%% The following three tests are for the issue "fixes fetch fail when nodes on the same host
%% have different cwd"
@@ -1139,41 +1139,41 @@ trace_to_remote_files_on_localhost_with_different_pwd(suite) ->
trace_to_remote_files_on_localhost_with_different_pwd(doc) ->
["Trace to remote files on localhost with different pwd"];
trace_to_remote_files_on_localhost_with_different_pwd(Config) when is_list(Config) ->
- ?line {ok, OldDir} = file:get_cwd(),
- ?line ok = file:set_cwd(".."),
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line check_size(2, ?FNAME, ?OUTPUT, ServerNode, ClientNode),
- ?line ok = file:set_cwd(OldDir).
+ {ok, OldDir} = file:get_cwd(),
+ ok = file:set_cwd(".."),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ check_size(2, ?FNAME, ?OUTPUT, ServerNode, ClientNode),
+ ok = file:set_cwd(OldDir).
trace_to_remote_files_on_localhost_with_different_pwd(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
trace_to_local_files_on_localhost_with_different_pwd(suite) ->
[];
trace_to_local_files_on_localhost_with_different_pwd(doc) ->
["Trace to local files on localhost with different pwd"];
trace_to_local_files_on_localhost_with_different_pwd(Config) when is_list(Config) ->
- ?line {ok, OldDir} = file:get_cwd(),
- ?line ok = file:set_cwd(".."),
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line check_size(2, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode),
- ?line ok = file:set_cwd(OldDir).
+ {ok, OldDir} = file:get_cwd(),
+ ok = file:set_cwd(".."),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ check_size(2, {local, ?FNAME}, ?OUTPUT, ServerNode, ClientNode),
+ ok = file:set_cwd(OldDir).
trace_to_local_files_on_localhost_with_different_pwd(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
trace_to_remote_files_on_localhost_with_different_pwd_abs(suite) ->
[];
trace_to_remote_files_on_localhost_with_different_pwd_abs(doc) ->
["Trace to remote files on localhost with different pwd abs"];
trace_to_remote_files_on_localhost_with_different_pwd_abs(Config) when is_list(Config) ->
- ?line {ok, OldDir} = file:get_cwd(),
- ?line ok = file:set_cwd(".."),
- ?line {ok, Path} = file:get_cwd(),
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line File = filename:join(Path, ?FNAME),
- ?line check_size(2, File, ?OUTPUT, ServerNode, ClientNode),
- ?line ok = file:set_cwd(OldDir).
+ {ok, OldDir} = file:get_cwd(),
+ ok = file:set_cwd(".."),
+ {ok, Path} = file:get_cwd(),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ File = filename:join(Path, ?FNAME),
+ check_size(2, File, ?OUTPUT, ServerNode, ClientNode),
+ ok = file:set_cwd(OldDir).
trace_to_remote_files_on_localhost_with_different_pwd_abs(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
%% Trace is not affected by changes of cwd on control node or remote nodes during tracing
%% (three tests)
@@ -1182,20 +1182,20 @@ changing_cwd_on_control_node(suite) ->
changing_cwd_on_control_node(doc) ->
["Changing cwd on control node during tracing is safe"];
changing_cwd_on_control_node(Config) when is_list(Config) ->
- ?line {ok, OldDir} = file:get_cwd(),
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace(ServerNode, ClientNode, ?FNAME),
- ?line NumMsgs = 3,
- ?line ttb_helper:msgs(NumMsgs),
- ?line ok = file:set_cwd(".."),
- ?line ttb_helper:msgs(NumMsgs),
- ?line {_, D} = ttb:stop([fetch, return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]),
- ?line {ok, Ret} = file:consult(?OUTPUT),
+ {ok, OldDir} = file:get_cwd(),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace(ServerNode, ClientNode, ?FNAME),
+ NumMsgs = 3,
+ ttb_helper:msgs(NumMsgs),
+ ok = file:set_cwd(".."),
+ ttb_helper:msgs(NumMsgs),
+ {_, D} = ttb:stop([fetch, return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]),
+ {ok, Ret} = file:consult(?OUTPUT),
check_output(2*(NumMsgs + 1),Ret),
ok = file:set_cwd(OldDir).
changing_cwd_on_control_node(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
changing_cwd_on_control_node_with_local_trace(suite) ->
[];
@@ -1216,156 +1216,156 @@ changing_cwd_on_control_node_with_local_trace(Config) when is_list(Config) ->
check_output(Expected, Ret),
ok = file:set_cwd(OldDir).
changing_cwd_on_control_node_with_local_trace(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
changing_cwd_on_remote_node(suite) ->
[];
changing_cwd_on_remote_node(doc) ->
["Changing cwd on remote node during tracing is safe"];
changing_cwd_on_remote_node(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace(ServerNode, ClientNode, ?FNAME),
- ?line NumMsgs = 2,
- ?line ttb_helper:msgs(NumMsgs),
- ?line ok = rpc:call(ClientNode, file, set_cwd, [".."]),
- ?line ttb_helper:msgs(NumMsgs),
- ?line {_, D} = ttb:stop([fetch, return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]),
- ?line {ok, Ret} = file:consult(?OUTPUT),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace(ServerNode, ClientNode, ?FNAME),
+ NumMsgs = 2,
+ ttb_helper:msgs(NumMsgs),
+ ok = rpc:call(ClientNode, file, set_cwd, [".."]),
+ ttb_helper:msgs(NumMsgs),
+ {_, D} = ttb:stop([fetch, return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]),
+ {ok, Ret} = file:consult(?OUTPUT),
check_output(2*(NumMsgs + 1),Ret).
changing_cwd_on_remote_node(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
one_command_trace_setup(suite) ->
[];
one_command_trace_setup(doc) ->
["One command trace setup"];
one_command_trace_setup(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line ttb:start_trace([ClientNode, ServerNode],
+ {ServerNode, ClientNode} = start_client_and_server(),
+ ttb:start_trace([ClientNode, ServerNode],
[{server, received, '_', []},
{client, put, 1, []},
{client, get, '_', []}],
{all, call},
[{file, ?FNAME}]),
- ?line ttb_helper:msgs(2),
- ?line {_, D} = ttb:stop(return_fetch_dir),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]),
- ?line {ok, Ret} = file:consult(?OUTPUT),
- ?line 5 = length(Ret).
+ ttb_helper:msgs(2),
+ {_, D} = ttb:stop(return_fetch_dir),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]),
+ {ok, Ret} = file:consult(?OUTPUT),
+ 5 = length(Ret).
one_command_trace_setup(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
dbg_style_fetch(suite) ->
[];
dbg_style_fetch(doc) ->
["Dbg style fetch"];
dbg_style_fetch(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line DirSize = length(element(2, file:list_dir("."))),
- ?line ttb:start_trace([ClientNode, ServerNode],
+ {ServerNode, ClientNode} = start_client_and_server(),
+ DirSize = length(element(2, file:list_dir("."))),
+ ttb:start_trace([ClientNode, ServerNode],
[{server, received, '_', []},
{client, put, 1, []},
{client, get, '_', []}],
{all, call},
[{shell, only}]),
- ?line DirSize = length(element(2, file:list_dir("."))),
- ?line ttb_helper:msgs(2),
- ?line DirSize = length(element(2, file:list_dir("."))),
- ?line stopped, ttb:stop(format),
+ DirSize = length(element(2, file:list_dir("."))),
+ ttb_helper:msgs(2),
+ DirSize = length(element(2, file:list_dir("."))),
+ stopped, ttb:stop(format),
%%+1 -> ttb_last_trace
- ?line true = (DirSize + 1 == length(element(2, file:list_dir(".")))),
- ?line {ok,[{all, [{matched,_,_}, {matched,_,_}]}]} =
+ true = (DirSize + 1 == length(element(2, file:list_dir(".")))),
+ {ok,[{all, [{matched,_,_}, {matched,_,_}]}]} =
ttb:start_trace([ClientNode, ServerNode],
[{server, received, '_', []},
{client, put, 1, []},
{client, get, '_', []}],
{all, call},
[{shell, only}]),
- ?line ttb:stop().
+ ttb:stop().
dbg_style_fetch(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
shell_tracing_init(suite) ->
[];
shell_tracing_init(doc) ->
["Shell tracing init"];
shell_tracing_init(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line ttb:tracer([ClientNode, ServerNode], shell),
- ?line ttb:stop(),
- ?line ttb:tracer([ClientNode, ServerNode],
+ {ServerNode, ClientNode} = start_client_and_server(),
+ ttb:tracer([ClientNode, ServerNode], shell),
+ ttb:stop(),
+ ttb:tracer([ClientNode, ServerNode],
[{file, {local, ?FNAME}}, shell]),
- ?line ttb:stop(),
- ?line local_client_required_on_shell_tracing =
+ ttb:stop(),
+ local_client_required_on_shell_tracing =
try ttb:tracer([ClientNode, ServerNode],[{file, ?FNAME}, shell])
catch
exit:local_client_required_on_shell_tracing ->
local_client_required_on_shell_tracing
end.
shell_tracing_init(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
only_one_state_for_format_handler(suite) ->
[];
only_one_state_for_format_handler(doc) ->
["Only one state for format handler"];
only_one_state_for_format_handler(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_local(ServerNode, ClientNode, ?FNAME),
- ?line ttb_helper:msgs(2),
- ?line {_, D} = ttb:stop([return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, counter_call_handler()}]),
- ?line {ok, Ret} = file:consult(?OUTPUT),
- ?line [5] = Ret.
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_local(ServerNode, ClientNode, ?FNAME),
+ ttb_helper:msgs(2),
+ {_, D} = ttb:stop([return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, counter_call_handler()}]),
+ {ok, Ret} = file:consult(?OUTPUT),
+ [5] = Ret.
only_one_state_for_format_handler(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
only_one_state_with_default_format_handler(suite) ->
[];
only_one_state_with_default_format_handler(doc) ->
["Only one state with default format handler"];
only_one_state_with_default_format_handler(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_local(ServerNode, ClientNode, ?FNAME),
- ?line ttb_helper:msgs(2),
- ?line {_, D} = ttb:stop([return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}]),
- ?line true = filelib:is_file(?OUTPUT).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_local(ServerNode, ClientNode, ?FNAME),
+ ttb_helper:msgs(2),
+ {_, D} = ttb:stop([return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}]),
+ true = filelib:is_file(?OUTPUT).
only_one_state_with_default_format_handler(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
only_one_state_with_initial_format_handler(suite) ->
[];
only_one_state_with_initial_format_handler(doc) ->
["Only one state with initial format handler"];
only_one_state_with_initial_format_handler(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line {ok, _} =
+ {ServerNode, ClientNode} = start_client_and_server(),
+ {ok, _} =
ttb:tracer([ServerNode,ClientNode],[{file, ?FNAME}, {handler, counter_call_handler()}]),
- ?line ttb:p(all, call),
- ?line ttb:tpl(server, received, []),
- ?line ttb:tpl(client, put, []),
- ?line ttb:tpl(client, get, []),
- ?line ttb_helper:msgs(2),
- ?line {_, D} = ttb:stop([return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}]),
- ?line {ok, Ret} = file:consult(?OUTPUT),
- ?line [5] = Ret.
+ ttb:p(all, call),
+ ttb:tpl(server, received, []),
+ ttb:tpl(client, put, []),
+ ttb:tpl(client, get, []),
+ ttb_helper:msgs(2),
+ {_, D} = ttb:stop([return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}]),
+ {ok, Ret} = file:consult(?OUTPUT),
+ [5] = Ret.
only_one_state_with_initial_format_handler(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
run_trace_with_shortcut(Shortcut, Ret, F) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line {ok, _} =
+ {ServerNode, ClientNode} = start_client_and_server(),
+ {ok, _} =
ttb:tracer([ServerNode,ClientNode],[{file, ?FNAME}]),
- ?line ttb:p(all, call),
- ?line ttb:F(client, put, Shortcut),
- ?line ttb_helper:msgs(2),
- ?line {_, D} = ttb:stop([return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, ret_caller_call_handler()}]),
- ?line {ok, Ret} =file:consult(?OUTPUT),
- ?line stop_client_and_server().
+ ttb:p(all, call),
+ ttb:F(client, put, Shortcut),
+ ttb_helper:msgs(2),
+ {_, D} = ttb:stop([return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, ret_caller_call_handler()}]),
+ {ok, Ret} =file:consult(?OUTPUT),
+ stop_client_and_server().
fun_for(return) ->
{codestr, "fun(_) -> return_trace() end"};
@@ -1377,48 +1377,48 @@ run_trace_with_shortcut1(suite) ->
run_trace_with_shortcut1(doc) ->
["Run trace with shortcut 1"];
run_trace_with_shortcut1(Config) when is_list(Config) ->
- ?line run_trace_with_shortcut(caller, [ok,ok], tp),
- ?line run_trace_with_shortcut(caller, [ok,ok], tpl).
+ run_trace_with_shortcut(caller, [ok,ok], tp),
+ run_trace_with_shortcut(caller, [ok,ok], tpl).
run_trace_with_shortcut1(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
run_trace_with_shortcut2(suite) ->
[];
run_trace_with_shortcut2(doc) ->
["Run trace with shortcut 2"];
run_trace_with_shortcut2(Config) when is_list(Config) ->
- ?line run_trace_with_shortcut(return, [ok,ok], tp),
- ?line run_trace_with_shortcut(return, [ok,ok], tpl).
+ run_trace_with_shortcut(return, [ok,ok], tp),
+ run_trace_with_shortcut(return, [ok,ok], tpl).
run_trace_with_shortcut2(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
run_trace_with_shortcut3(suite) ->
[];
run_trace_with_shortcut3(doc) ->
["Run trace with shortcut 3"];
run_trace_with_shortcut3(Config) when is_list(Config) ->
- ?line run_trace_with_shortcut(fun_for(return), [ok,ok], tp),
- ?line run_trace_with_shortcut(fun_for(return), [ok,ok], tpl).
+ run_trace_with_shortcut(fun_for(return), [ok,ok], tp),
+ run_trace_with_shortcut(fun_for(return), [ok,ok], tpl).
run_trace_with_shortcut3(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
run_trace_with_shortcut4(suite) ->
[];
run_trace_with_shortcut4(doc) ->
["Run trace with shortcut 4"];
run_trace_with_shortcut4(Config) when is_list(Config) ->
- ?line run_trace_with_shortcut(fun_for(msg_false), [], tp),
- ?line run_trace_with_shortcut(fun_for(msg_false), [], tpl).
+ run_trace_with_shortcut(fun_for(msg_false), [], tp),
+ run_trace_with_shortcut(fun_for(msg_false), [], tpl).
run_trace_with_shortcut4(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
cant_specify_local_and_flush(suite) ->
[];
cant_specify_local_and_flush(doc) ->
["Can't specify local and flush"];
cant_specify_local_and_flush(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line flush_unsupported_with_ip_trace_port =
+ {ServerNode, ClientNode} = start_client_and_server(),
+ flush_unsupported_with_ip_trace_port =
try ttb:tracer([ServerNode, ClientNode],
[{flush, 1000}, {file, {local, ?FNAME}}])
catch
@@ -1426,37 +1426,37 @@ cant_specify_local_and_flush(Config) when is_list(Config) ->
flush_unsupported_with_ip_trace_port
end.
cant_specify_local_and_flush(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
trace_sorted_by_default(suite) ->
[];
trace_sorted_by_default(doc) ->
["Trace sorted by default"];
trace_sorted_by_default(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_local(ServerNode, ClientNode, ?FILE),
- ?line ttb_helper:msgs(2),
- ?line {_, D} = ttb:stop([return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, node_call_handler()}, {disable_sort, false}]),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_local(ServerNode, ClientNode, ?FILE),
+ ttb_helper:msgs(2),
+ {_, D} = ttb:stop([return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, node_call_handler()}, {disable_sort, false}]),
{ok, Ret} = file:consult(?OUTPUT),
- ?line [ClientNode,ServerNode,ClientNode,ServerNode,ServerNode] = Ret.
+ [ClientNode,ServerNode,ClientNode,ServerNode,ServerNode] = Ret.
trace_sorted_by_default(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
disable_sorting(suite) ->
[];
disable_sorting(doc) ->
["Disable sorting"];
disable_sorting(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_local(ServerNode, ClientNode, ?FILE),
- ?line ttb_helper:msgs(2),
- ?line {_, D} = ttb:stop([return_fetch_dir]),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, node_call_handler()}, {disable_sort, true}]),
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_local(ServerNode, ClientNode, ?FILE),
+ ttb_helper:msgs(2),
+ {_, D} = ttb:stop([return_fetch_dir]),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, node_call_handler()}, {disable_sort, true}]),
{ok, Ret} = file:consult(?OUTPUT),
- ?line [ClientNode,ClientNode,ServerNode,ServerNode,ServerNode] = Ret.
+ [ClientNode,ClientNode,ServerNode,ServerNode,ServerNode] = Ret.
disable_sorting(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
%% -----------------------------------------------------------------------------
%% tests for autoresume of tracing
@@ -1467,71 +1467,71 @@ trace_resumed_after_node_restart(suite) ->
trace_resumed_after_node_restart(doc) ->
["Test trace resumed after node restart, trace to files on remote node."];
trace_resumed_after_node_restart(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_with_resume(ServerNode, ClientNode, ?FNAME),
- ?line logic(2,6,file).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_with_resume(ServerNode, ClientNode, ?FNAME),
+ logic(2,6,file).
trace_resumed_after_node_restart(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
trace_resumed_after_node_restart_ip(suite) ->
[];
trace_resumed_after_node_restart_ip(doc) ->
["Test trace resumed after node restart, trace via tcp/ip to local node."];
trace_resumed_after_node_restart_ip(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_with_resume(ServerNode, ClientNode, {local, ?FNAME}),
- ?line logic(2,6,local).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_with_resume(ServerNode, ClientNode, {local, ?FNAME}),
+ logic(2,6,local).
trace_resumed_after_node_restart_ip(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
trace_resumed_after_node_restart_wrap(suite) ->
[];
trace_resumed_after_node_restart_wrap(doc) ->
["Test trace resumed after node restart, wrap option."];
trace_resumed_after_node_restart_wrap(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_with_resume(ServerNode, ClientNode, {wrap, ?FNAME, 10, 4}),
- ?line logic(1,4,file).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_with_resume(ServerNode, ClientNode, {wrap, ?FNAME, 10, 4}),
+ logic(1,4,file).
trace_resumed_after_node_restart_wrap(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
trace_resumed_after_node_restart_wrap_mult(suite) ->
[];
trace_resumed_after_node_restart_wrap_mult(doc) ->
["Test trace resumed after node restart, wrap option, multiple files."];
trace_resumed_after_node_restart_wrap_mult(Config) when is_list(Config) ->
- ?line {ServerNode, ClientNode} = start_client_and_server(),
- ?line begin_trace_with_resume(ServerNode, ClientNode, {wrap, ?FNAME, 10, 4}),
- ?line logic(20,8,file).
+ {ServerNode, ClientNode} = start_client_and_server(),
+ begin_trace_with_resume(ServerNode, ClientNode, {wrap, ?FNAME, 10, 4}),
+ logic(20,8,file).
trace_resumed_after_node_restart_wrap_mult(cleanup,_Config) ->
- ?line stop_client_and_server().
+ stop_client_and_server().
logic(N, M, TracingType) ->
helper_msgs(N, TracingType),
test_server:stop_node(ttb_helper:get_node(client)),
timer:sleep(2500),
- ?line {ok,_ClientNode} = test_server:start_node(client,slave,[]),
+ {ok,_ClientNode} = test_server:start_node(client,slave,[]),
ct:log("client started",[]),
- ?line ok = ttb_helper:c(code, add_paths, [code:get_path()]),
+ ok = ttb_helper:c(code, add_paths, [code:get_path()]),
ct:log("paths added",[]),
- ?line ttb_helper:c(client, init, []),
+ ttb_helper:c(client, init, []),
ct:log("client initiated",[]),
- ?line helper_msgs(N, TracingType),
+ helper_msgs(N, TracingType),
ct:log("helper msgs sent and flushed",[]),
- ?line {_, D} = ttb:stop([return_fetch_dir]),
+ {_, D} = ttb:stop([return_fetch_dir]),
ct:log("stopped ~p",[D]),
- ?line ttb:format(D, [{out, ?OUTPUT}, {handler, ret_caller_call_handler2()}]),
+ ttb:format(D, [{out, ?OUTPUT}, {handler, ret_caller_call_handler2()}]),
ct:log("formatted ~p",[{D,?OUTPUT}]),
- ?line {ok, Ret} = file:consult(?OUTPUT),
+ {ok, Ret} = file:consult(?OUTPUT),
ct:log("consulted: ~p",[Ret]),
check_output(M,Ret).
begin_trace_with_resume(ServerNode, ClientNode, Dest) ->
- ?line {ok, _} = ttb:tracer([ServerNode,ClientNode], [{file, Dest}, resume]),
- ?line ttb:p(all, [call, timestamp]),
- ?line ttb:tp(server, received, []),
- ?line ttb:tp(client, put, []),
- ?line ttb:tp(client, get, []).
+ {ok, _} = ttb:tracer([ServerNode,ClientNode], [{file, Dest}, resume]),
+ ttb:p(all, [call, timestamp]),
+ ttb:tp(server, received, []),
+ ttb:tp(client, put, []),
+ ttb:tp(client, get, []).
ret_caller_call_handler2() ->
{fun(A, {trace_ts, _, call, _, _} ,_,_) -> io:format(A, "ok.~n", []);
diff --git a/lib/odbc/configure b/lib/odbc/configure
index a167f1b0ec..e429e5a946 100755
--- a/lib/odbc/configure
+++ b/lib/odbc/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,42 +167,53 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -228,14 +221,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -253,18 +253,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -291,6 +292,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -308,6 +310,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -322,7 +332,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -331,7 +341,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -370,12 +380,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -387,18 +398,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -410,9 +430,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -439,7 +459,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -483,7 +503,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -497,6 +517,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -510,6 +534,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -575,50 +606,46 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
ac_unique_file="c_src/odbcserver.c"
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
+ac_header_c_list=
ac_subst_vars='LTLIBOBJS
LIBOBJS
ODBC_INCLUDE
@@ -629,7 +656,6 @@ THR_DEFS
GETCONF
EGREP
GREP
-CPP
RM
LD
SET_MAKE
@@ -642,6 +668,10 @@ CPPFLAGS
LDFLAGS
CFLAGS
CC
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -702,8 +732,7 @@ CC
CFLAGS
LDFLAGS
LIBS
-CPPFLAGS
-CPP'
+CPPFLAGS'
# Initialize some variables set by options.
@@ -772,8 +801,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -814,9 +841,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -840,9 +867,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1053,9 +1080,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1069,9 +1096,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1115,9 +1142,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1133,7 +1160,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1197,7 +1224,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1315,6 +1342,7 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1344,7 +1372,6 @@ Some influential environment variables:
LIBS libraries to pass to the linker, e.g. -l<library>
CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
you have headers in a nonstandard directory <include dir>
- CPP C preprocessor
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
@@ -1365,9 +1392,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1395,7 +1422,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1403,7 +1431,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1413,9 +1441,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1432,14 +1460,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1447,14 +1475,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1470,14 +1499,14 @@ fi
ac_fn_c_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1485,17 +1514,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1516,11 +1546,12 @@ fi
ac_fn_c_check_func ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
@@ -1528,16 +1559,9 @@ else
#define $2 innocuous_$2
/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $2 (); below.
- Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- <limits.h> exists even on freestanding compilers. */
-
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+ which can conflict with char $2 (); below. */
+#include <limits.h>
#undef $2
/* Override any GCC internal prototype to avoid an error.
@@ -1555,194 +1579,29 @@ choke me
#endif
int
-main ()
+main (void)
{
return $2 ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_func
-# ac_fn_c_try_cpp LINENO
-# ----------------------
-# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
-ac_fn_c_try_cpp ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
- ac_status=$?
- if test -s conftest.err; then
- grep -v '^ *+' conftest.err >conftest.er1
- cat conftest.er1 >&5
- mv -f conftest.er1 conftest.err
- fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } > conftest.i && {
- test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
- test ! -s conftest.err
- }; then :
- ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=1
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_cpp
-
-# ac_fn_c_try_run LINENO
-# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
-ac_fn_c_try_run ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if { { ac_try="$ac_link"
-case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_link") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
- ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
- ac_retval=$ac_status
-fi
- rm -rf conftest.dSYM conftest_ipa8_conftest.oo
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
- as_fn_set_status $ac_retval
-
-} # ac_fn_c_try_run
-
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
@@ -1750,26 +1609,28 @@ fi
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
@@ -1781,17 +1642,18 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_check_type ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
eval "$3=no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof ($2))
return 0;
@@ -1799,12 +1661,13 @@ if (sizeof ($2))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof (($2)))
return 0;
@@ -1812,18 +1675,19 @@ if (sizeof (($2)))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
eval "$3=yes"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_type
@@ -1835,16 +1699,17 @@ $as_echo "$ac_res" >&6; }
ac_fn_c_check_member ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
-$as_echo_n "checking for $2.$3... " >&6; }
-if eval \${$4+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
+printf %s "checking for $2.$3... " >&6; }
+if eval test \${$4+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
-main ()
+main (void)
{
static $2 ac_aggr;
if (ac_aggr.$3)
@@ -1853,14 +1718,15 @@ return 0;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$4=yes"
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$5
int
-main ()
+main (void)
{
static $2 ac_aggr;
if (sizeof ac_aggr.$3)
@@ -1869,22 +1735,66 @@ return 0;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$4=yes"
-else
+else $as_nop
eval "$4=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$4
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_member
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
+ac_fn_c_try_run ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ if { { ac_try="$ac_link"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_link") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+ { { case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+printf "%s\n" "$ac_try_echo"; } >&5
+ (eval "$ac_try") 2>&5
+ ac_status=$?
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
+ ac_retval=0
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=$ac_status
+fi
+ rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
@@ -1899,7 +1809,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
@@ -1909,14 +1819,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=0 ac_mid=0
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -1926,9 +1837,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid; break
-else
+else $as_nop
as_fn_arith $ac_mid + 1 && ac_lo=$as_val
if test $ac_lo -le $ac_mid; then
ac_lo= ac_hi=
@@ -1936,14 +1848,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
@@ -1953,14 +1865,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=-1 ac_mid=-1
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
@@ -1970,9 +1883,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=$ac_mid; break
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
if test $ac_mid -le $ac_hi; then
ac_lo= ac_hi=
@@ -1980,14 +1894,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
ac_lo= ac_hi=
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
@@ -1995,7 +1909,7 @@ while test "x$ac_lo" != "x$ac_hi"; do
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -2005,12 +1919,13 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
@@ -2020,12 +1935,12 @@ esac
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.val", "w");
@@ -2053,9 +1968,10 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
+else $as_nop
ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -2067,14 +1983,34 @@ rm -f conftest.val
as_fn_set_status $ac_retval
} # ac_fn_c_compute_int
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -2107,8 +2043,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -2143,7 +2083,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -2178,11 +2118,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -2193,8 +2135,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -2218,7 +2160,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -2226,14 +2168,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -2241,15 +2183,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -2257,8 +2199,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -2272,63 +2214,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -2338,19 +2265,434 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${ERL_TOP}/make/autoconf"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2361,12 +2703,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2375,24 +2717,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2402,11 +2744,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2420,57 +2763,125 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_aux_dir=
-for ac_dir in ${ERL_TOP}/erts/autoconf; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in ${ERL_TOP}/erts/autoconf" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2489,21 +2900,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2522,22 +2934,116 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
else
- host_os=win32
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
-# Check whether --with-odbc was given.
-if test "${with_odbc+set}" = set; then :
- withval=$with_odbc;
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ # Adjust for local legacy windows hack...
+ case $host in #(
+ local-*-windows) :
+
+ host=win32
+ host_os=win32
+ host_vendor=
+ host_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $build in #(
+ local-*-windows) :
+
+ build=win32
+ build_os=win32
+ build_vendor=
+ build_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $target in #(
+ local-*-windows) :
+
+ target=win32
+ target_os=win32
+ target_vendor=
+ target_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+ if test "$cross_compiling" = "yes" -a "$build" = "$host"
+then :
+ as_fn_error $? "
+ Cross compiling with the same canonicalized 'host' value
+ as the canonicalized 'build' value.
+
+ We are cross compiling since the '--host=$host_alias'
+ and the '--build=$build_alias' arguments differ. When
+ cross compiling Erlang/OTP, also the canonicalized values of
+ the '--build' and the '--host' arguments *must* differ. The
+ canonicalized values of these arguments however both equals:
+ $host
+
+ You can check the canonical value by passing a value as
+ argument to the 'make/autoconf/config.sub' script.
+ " "$LINENO" 5
fi
-if test "$with_odbc" = "no"; then
- rm -f "$ERL_TOP/lib/odbc/SKIP"
+# Check whether --with-odbc was given.
+if test ${with_odbc+y}
+then :
+ withval=$with_odbc;
+fi
+
-else
erl_xcomp_without_sysroot=no
if test "$cross_compiling" = "yes"; then
@@ -2549,6 +3055,15 @@ else
fi
+
+
+
+
+
+
+
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2557,11 +3072,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2569,11 +3085,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2584,11 +3104,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2597,11 +3117,12 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2609,11 +3130,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2624,11 +3149,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -2636,8 +3161,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2650,11 +3175,12 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2662,11 +3188,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2677,11 +3207,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2690,11 +3220,12 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2703,15 +3234,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2727,18 +3262,18 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2749,11 +3284,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2761,11 +3297,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2776,11 +3316,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2793,11 +3333,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2805,11 +3346,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2820,11 +3365,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2836,8 +3381,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2845,25 +3390,129 @@ esac
fi
fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -2873,7 +3522,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -2881,7 +3530,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -2893,9 +3542,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -2916,11 +3565,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
@@ -2937,7 +3587,7 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
@@ -2953,44 +3603,46 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
+else $as_nop
ac_file=''
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -3004,15 +3656,15 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -3021,7 +3673,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
@@ -3033,8 +3685,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -3042,10 +3694,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -3053,39 +3705,40 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3099,11 +3752,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -3112,31 +3766,32 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3146,29 +3801,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
@@ -3177,57 +3836,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
+else $as_nop
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -3242,94 +3904,144 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
-
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
fi
ac_ext=c
@@ -3350,123 +4062,124 @@ MIXED_VSL=no
MIXED_VC=no
MIXED_MINGW=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
-$as_echo_n "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
+printf %s "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" != "xyes"; then
if test -x /usr/bin/msys-?.0.dll; then
CFLAGS="$CFLAGS -O2"
MIXED_MSYS=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
-$as_echo "MSYS and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
+printf "%s\n" "MSYS and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
MIXED_CYGWIN=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
-$as_echo "Cygwin and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
+printf "%s\n" "Cygwin and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /bin/wslpath; then
CFLAGS="$CFLAGS -O2"
MIXED_WSL=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
-$as_echo "WSL and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
+printf "%s\n" "WSL and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not within any known env" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$MIXED_MSYS" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
-$as_echo_n "checking for mixed cygwin and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
+printf %s "checking for mixed cygwin and native MinGW environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" = x"yes"; then
if test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with cygwin" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
-$as_echo_n "checking for mixed MSYS and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
+printf %s "checking for mixed MSYS and native MinGW environment... " >&6; }
if test "x$GCC" = x"yes"; then
if test -x /usr/bin/msys-=.0.dll; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with msys" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
-$as_echo_n "checking if we mix cygwin with any native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
+printf %s "checking if we mix cygwin with any native compiler... " >&6; }
if test "X$MIXED_CYGWIN" = "Xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
-$as_echo_n "checking if we mix msys with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
+printf %s "checking if we mix msys with another native compiler... " >&6; }
if test "X$MIXED_MSYS" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
-$as_echo_n "checking if we mix WSL with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
+printf %s "checking if we mix WSL with another native compiler... " >&6; }
if test "X$MIXED_WSL" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
-ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval test \${ac_cv_prog_make_${ac_make}_set+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
@@ -3482,12 +4195,12 @@ esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
SET_MAKE=
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
SET_MAKE="MAKE=${MAKE-make}"
fi
@@ -3496,11 +4209,12 @@ for ac_prog in ld.sh
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$LD"; then
ac_cv_prog_LD="$LD" # Let the user override the test.
else
@@ -3508,11 +4222,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_LD="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3523,11 +4241,11 @@ fi
fi
LD=$ac_cv_prog_LD
if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3537,11 +4255,12 @@ done
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$LD"; then
ac_cv_prog_LD="$LD" # Let the user override the test.
else
@@ -3549,11 +4268,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_LD="${ac_tool_prefix}ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3564,11 +4287,11 @@ fi
fi
LD=$ac_cv_prog_LD
if test -n "$LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
-$as_echo "$LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+printf "%s\n" "$LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3577,11 +4300,12 @@ if test -z "$ac_cv_prog_LD"; then
ac_ct_LD=$LD
# Extract the first word of "ld", so it can be a program name with args.
set dummy ld; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_LD+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_LD+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_LD"; then
ac_cv_prog_ac_ct_LD="$ac_ct_LD" # Let the user override the test.
else
@@ -3589,11 +4313,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_LD="ld"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3604,11 +4332,11 @@ fi
fi
ac_ct_LD=$ac_cv_prog_ac_ct_LD
if test -n "$ac_ct_LD"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5
-$as_echo "$ac_ct_LD" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5
+printf "%s\n" "$ac_ct_LD" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_LD" = x; then
@@ -3616,8 +4344,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
LD=$ac_ct_LD
@@ -3633,11 +4361,12 @@ _search_path=/bin:/usr/bin:/usr/local/bin:$PATH
# Extract the first word of "rm", so it can be a program name with args.
set dummy rm; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_RM+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_RM+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $RM in
[\\/]* | ?:[\\/]*)
ac_cv_path_RM="$RM" # Let the user override the test with a path.
@@ -3647,11 +4376,15 @@ else
for as_dir in $_search_path
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_RM="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3664,11 +4397,11 @@ esac
fi
RM=$ac_cv_path_RM
if test -n "$RM"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5
-$as_echo "$RM" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RM" >&5
+printf "%s\n" "$RM" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3679,6 +4412,115 @@ fi
_search_path=
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
+do
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
+ fi
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
+ fi
+done
+
+
+
+
+
+
+
+
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
+
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+printf %s "checking for grep that handles long lines and -e... " >&6; }
+if test ${ac_cv_path_GREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -z "$GREP"; then
+ ac_path_GREP_found=false
+ # Loop through the user's path and test for each of PROGNAME-LIST
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in grep ggrep
+ do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ ac_path_GREP="$as_dir$ac_prog$ac_exec_ext"
+ as_fn_executable_p "$ac_path_GREP" || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+ # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+ ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+ ac_count=0
+ printf %s 0123456789 >"conftest.in"
+ while :
+ do
+ cat "conftest.in" "conftest.in" >"conftest.tmp"
+ mv "conftest.tmp" "conftest.in"
+ cp "conftest.in" "conftest.nl"
+ printf "%s\n" 'GREP' >> "conftest.nl"
+ "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+ diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+ as_fn_arith $ac_count + 1 && ac_count=$as_val
+ if test $ac_count -gt ${ac_path_GREP_max-0}; then
+ # Best one so far, save it but keep looking for a better one
+ ac_cv_path_GREP="$ac_path_GREP"
+ ac_path_GREP_max=$ac_count
+ fi
+ # 10*(2^10) chars as input seems more than enough
+ test $ac_count -gt 10 && break
+ done
+ rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+ $ac_path_GREP_found && break 3
+ done
+ done
+ done
+IFS=$as_save_IFS
+ if test -z "$ac_cv_path_GREP"; then
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ fi
+else
+ ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+printf "%s\n" "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+if test "$with_odbc" = "no"
+then :
+
+
+ rm -f "$ERL_TOP/lib/odbc/SKIP"
+
+
+else $as_nop
+
+
+
# Sockets
#--------------------------------------------------------------------
# Check for the existence of the -lsocket and -lnsl libraries.
@@ -3698,20 +4540,23 @@ _search_path=
# if -lsocket doesn't work by itself.
#--------------------------------------------------------------------
erl_checkBoth=0
-
ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
-if test "x$ac_cv_func_connect" = xyes; then :
+if test "x$ac_cv_func_connect" = xyes
+then :
erl_checkSocket=0
-else
+else $as_nop
erl_checkSocket=1
fi
-if test "$erl_checkSocket" = 1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
-$as_echo_n "checking for socket in -lsocket... " >&6; }
-if ${ac_cv_lib_socket_socket+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test "$erl_checkSocket" = 1
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
+printf %s "checking for socket in -lsocket... " >&6; }
+if test ${ac_cv_lib_socket_socket+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3720,56 +4565,62 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char socket ();
int
-main ()
+main (void)
{
return socket ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_socket_socket=yes
-else
+else $as_nop
ac_cv_lib_socket_socket=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
-$as_echo "$ac_cv_lib_socket_socket" >&6; }
-if test "x$ac_cv_lib_socket_socket" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
+printf "%s\n" "$ac_cv_lib_socket_socket" >&6; }
+if test "x$ac_cv_lib_socket_socket" = xyes
+then :
LIBS="$LIBS -lsocket"
-else
+else $as_nop
erl_checkBoth=1
fi
+
fi
-if test "$erl_checkBoth" = 1; then
+if test "$erl_checkBoth" = 1
+then :
+
tk_oldLibs=$LIBS
LIBS="$LIBS -lsocket -lnsl"
ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept"
-if test "x$ac_cv_func_accept" = xyes; then :
+if test "x$ac_cv_func_accept" = xyes
+then :
odbc_erl_checkNsl=0
-else
+else $as_nop
LIBS=$tk_oldLibs
fi
+
fi
ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
-if test "x$ac_cv_func_gethostbyname" = xyes; then :
-
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lnsl" >&5
-$as_echo_n "checking for main in -lnsl... " >&6; }
-if ${ac_cv_lib_nsl_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+if test "x$ac_cv_func_gethostbyname" = xyes
+then :
+
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lnsl" >&5
+printf %s "checking for main in -lnsl... " >&6; }
+if test ${ac_cv_lib_nsl_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lnsl $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3777,37 +4628,41 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
int
-main ()
+main (void)
{
return main ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_nsl_main=yes
-else
+else $as_nop
ac_cv_lib_nsl_main=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_main" >&5
-$as_echo "$ac_cv_lib_nsl_main" >&6; }
-if test "x$ac_cv_lib_nsl_main" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_main" >&5
+printf "%s\n" "$ac_cv_lib_nsl_main" >&6; }
+if test "x$ac_cv_lib_nsl_main" = xyes
+then :
LIBS="$LIBS -lnsl"
fi
fi
-case "$host_os" in
- haiku*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lnetwork" >&5
-$as_echo_n "checking for socket in -lnetwork... " >&6; }
-if ${ac_cv_lib_network_socket+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+case "$host_os" in #(
+ haiku*) :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for socket in -lnetwork" >&5
+printf %s "checking for socket in -lnetwork... " >&6; }
+if test ${ac_cv_lib_network_socket+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lnetwork $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -3816,247 +4671,47 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char socket ();
int
-main ()
+main (void)
{
return socket ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_network_socket=yes
-else
+else $as_nop
ac_cv_lib_network_socket=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_socket" >&5
-$as_echo "$ac_cv_lib_network_socket" >&6; }
-if test "x$ac_cv_lib_network_socket" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBNETWORK 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_socket" >&5
+printf "%s\n" "$ac_cv_lib_network_socket" >&6; }
+if test "x$ac_cv_lib_network_socket" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBNETWORK 1" >>confdefs.h
LIBS="-lnetwork $LIBS"
fi
- ;;
-esac
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
- Syntax error
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
-
-else
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether nonexistent headers
- # can be detected and how.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ac_nonexistent.h>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- # Broken: success on invalid input.
-continue
-else
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
-
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details" "$LINENO" 5; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+ ;; #(
+ *) :
+ ;;
esac
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+printf %s "checking for egrep... " >&6; }
+if test ${ac_cv_path_EGREP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
then ac_cv_path_EGREP="$GREP -E"
else
@@ -4067,10 +4722,15 @@ else
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_prog in egrep
+ do
for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+ ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext"
as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
# Check for GNU $ac_path_EGREP
@@ -4079,13 +4739,13 @@ case `"$ac_path_EGREP" --version 2>&1` in
ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
+ printf %s 0123456789 >"conftest.in"
while :
do
cat "conftest.in" "conftest.in" >"conftest.tmp"
mv "conftest.tmp" "conftest.in"
cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
+ printf "%s\n" 'EGREP' >> "conftest.nl"
"$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
as_fn_arith $ac_count + 1 && ac_count=$as_val
@@ -4114,195 +4774,87 @@ fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+printf "%s\n" "$ac_cv_path_EGREP" >&6; }
EGREP="$ac_cv_path_EGREP"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-int
-main ()
-{
+ac_fn_c_check_header_compile "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h" "$ac_includes_default"
+if test "x$ac_cv_header_fcntl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_FCNTL_H 1" >>confdefs.h
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_fn_c_check_header_compile "$LINENO" "netdb.h" "ac_cv_header_netdb_h" "$ac_includes_default"
+if test "x$ac_cv_header_netdb_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_NETDB_H 1" >>confdefs.h
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
fi
-rm -f conftest*
+ac_fn_c_check_header_compile "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default"
+if test "x$ac_cv_header_stdlib_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STDLIB_H 1" >>confdefs.h
fi
+ac_fn_c_check_header_compile "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default"
+if test "x$ac_cv_header_string_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_STRING_H 1" >>confdefs.h
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
fi
-rm -f conftest*
+ac_fn_c_check_header_compile "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_socket_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_SOCKET_H 1" >>confdefs.h
fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-for ac_header in fcntl.h netdb.h stdlib.h string.h sys/socket.h winsock2.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
+ac_fn_c_check_header_compile "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
+if test "x$ac_cv_header_winsock2_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINSOCK2_H 1" >>confdefs.h
fi
-done
-
-for ac_header in windows.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default"
-if test "x$ac_cv_header_windows_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_WINDOWS_H 1
-_ACEOF
+ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default"
+if test "x$ac_cv_header_windows_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h
fi
-done
-
-for ac_header in sql.h sqlext.h
+ for ac_header in sql.h sqlext.h
do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_WINDOWS_H
# include <windows.h>
#endif
"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define `printf "%s\n" "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
odbc_required_headers=yes
-else
+else $as_nop
odbc_required_headers=no
fi
done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
-$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
-if ${ac_cv_c_const+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5
+printf %s "checking for an ANSI C-conforming const... " >&6; }
+if test ${ac_cv_c_const+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __cplusplus
@@ -4315,7 +4867,7 @@ main ()
/* NEC SVR4.0.2 mips cc rejects this. */
struct point {int x, y;};
static struct point const zero = {0,0};
- /* AIX XL C 1.02.0.0 rejects this.
+ /* IBM XL C 1.02.0.0 rejects this.
It does not let you subtract one const X* pointer from another in
an arm of an if-expression whose if-part is not a constant
expression */
@@ -4343,7 +4895,7 @@ main ()
iptr p = 0;
++p;
}
- { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying
+ { /* IBM XL C 1.02.0.0 rejects this sort of thing, saying
"k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
struct s { int j; const int *ap[3]; } bx;
struct s *b = &bx; b->j = 5;
@@ -4359,29 +4911,29 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_c_const=yes
-else
+else $as_nop
ac_cv_c_const=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
-$as_echo "$ac_cv_c_const" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5
+printf "%s\n" "$ac_cv_c_const" >&6; }
if test $ac_cv_c_const = no; then
-$as_echo "#define const /**/" >>confdefs.h
+printf "%s\n" "#define const /**/" >>confdefs.h
fi
ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
-if test "x$ac_cv_type_size_t" = xyes; then :
+if test "x$ac_cv_type_size_t" = xyes
+then :
-else
+else $as_nop
-cat >>confdefs.h <<_ACEOF
-#define size_t unsigned int
-_ACEOF
+printf "%s\n" "#define size_t unsigned int" >>confdefs.h
fi
@@ -4392,27 +4944,27 @@ ac_fn_c_check_member "$LINENO" "struct sockaddr_in6" "sin6_addr" "ac_cv_member_s
#include <netinet/in.h>
#endif
"
-if test "x$ac_cv_member_struct_sockaddr_in6_sin6_addr" = xyes; then :
+if test "x$ac_cv_member_struct_sockaddr_in6_sin6_addr" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_ADDR 1
-_ACEOF
+printf "%s\n" "#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_ADDR 1" >>confdefs.h
fi
-for ac_func in memset socket
-do :
- as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
-ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
+ac_fn_c_check_func "$LINENO" "memset" "ac_cv_func_memset"
+if test "x$ac_cv_func_memset" = xyes
+then :
+ printf "%s\n" "#define HAVE_MEMSET 1" >>confdefs.h
+
+fi
+ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket"
+if test "x$ac_cv_func_socket" = xyes
+then :
+ printf "%s\n" "#define HAVE_SOCKET 1" >>confdefs.h
fi
-done
# ODBC
@@ -4422,29 +4974,34 @@ $RM -f "$ERL_TOP/lib/odbc/SKIP"
NEED_NPTL_PTHREAD_H=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
-$as_echo_n "checking for native win32 threads... " >&6; }
-if test "X$host_os" = "Xwin32"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for native win32 threads" >&5
+printf %s "checking for native win32 threads... " >&6; }
+if test "X$host_os" = "Xwin32"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
THR_DEFS="-DWIN32_THREADS"
THR_LIBS=
THR_LIB_NAME=win32_threads
THR_LIB_TYPE=win32_threads
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
THR_DEFS=
THR_LIBS=
THR_LIB_NAME=
THR_LIB_TYPE=posix_unknown
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
-$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
-if ${ac_cv_lib_pthread_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
+printf %s "checking for pthread_create in -lpthread... " >&6; }
+if test ${ac_cv_lib_pthread_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4453,40 +5010,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_pthread_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_pthread_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
-$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
-if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_pthread_pthread_create" >&6; }
+if test "x$ac_cv_lib_pthread_pthread_create" = xyes
+then :
THR_LIBS="-lpthread"
fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
-$as_echo_n "checking for pthread_create in -lc_r... " >&6; }
-if ${ac_cv_lib_c_r_pthread_create+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5
+printf %s "checking for pthread_create in -lc_r... " >&6; }
+if test ${ac_cv_lib_c_r_pthread_create+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lc_r $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4495,96 +5054,112 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char pthread_create ();
int
-main ()
+main (void)
{
return pthread_create ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_c_r_pthread_create=yes
-else
+else $as_nop
ac_cv_lib_c_r_pthread_create=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
-$as_echo "$ac_cv_lib_c_r_pthread_create" >&6; }
-if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5
+printf "%s\n" "$ac_cv_lib_c_r_pthread_create" >&6; }
+if test "x$ac_cv_lib_c_r_pthread_create" = xyes
+then :
THR_LIBS="-lc_r"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
-if test "x$ac_cv_func_pthread_create" = xyes; then :
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
+if test "x$ac_cv_func_pthread_create" = xyes
+then :
THR_LIBS="none_needed"
fi
- fi
- if test "x$THR_LIBS" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
-$as_echo_n "checking if the '-pthread' switch can be used... " >&6; }
+fi
+
+ if test "x$THR_LIBS" = "x"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the '-pthread' switch can be used" >&5
+printf %s "checking if the '-pthread' switch can be used... " >&6; }
saved_cflags=$CFLAGS
CFLAGS="$CFLAGS -pthread"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <pthread.h>
int
-main ()
+main (void)
{
pthread_create((void*)0,(void*)0,(void*)0,(void*)0);
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
THR_DEFS="-pthread"
THR_LIBS="-pthread"
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS=$saved_cflags
if test "x$THR_LIBS" != "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- fi
- if test "x$THR_LIBS" != "x"; then
+fi
+
+ if test "x$THR_LIBS" != "x"
+then :
+
THR_DEFS="$THR_DEFS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS"
THR_LIB_NAME=pthread
if test "x$THR_LIBS" = "xnone_needed"; then
THR_LIBS=
fi
- case $host_os in
- solaris*)
- THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS" ;;
- linux*)
+ case $host_os in #(
+ solaris*) :
+
+ THR_DEFS="$THR_DEFS -D_POSIX_PTHREAD_SEMANTICS"
+ ;; #(
+ linux*) :
+
THR_DEFS="$THR_DEFS -D_POSIX_THREAD_SAFE_FUNCTIONS"
-if test "$cross_compiling" != "yes"; then
+if test "$cross_compiling" != "yes"
+then :
+
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -4592,11 +5167,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4608,23 +5187,26 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-else
+
+else $as_nop
+
host_getconf="$host_alias-getconf"
# Extract the first word of "$host_getconf", so it can be a program name with args.
set dummy $host_getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$GETCONF"; then
ac_cv_prog_GETCONF="$GETCONF" # Let the user override the test.
else
@@ -4632,11 +5214,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_GETCONF="$host_getconf"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4648,25 +5234,28 @@ fi
fi
GETCONF=$ac_cv_prog_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
- if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""; then
+ if test "$GETCONF" = "false" && test "$erl_xcomp_sysroot" != ""
+then :
+
GETCONF=
prfx="$erl_xcomp_sysroot"
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}getconf", so it can be a program name with args.
set dummy ${ac_tool_prefix}getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_GETCONF="$GETCONF" # Let the user override the test with a path.
@@ -4677,11 +5266,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4693,11 +5286,11 @@ esac
fi
GETCONF=$ac_cv_path_GETCONF
if test -n "$GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
-$as_echo "$GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GETCONF" >&5
+printf "%s\n" "$GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4706,11 +5299,12 @@ if test -z "$ac_cv_path_GETCONF"; then
ac_pt_GETCONF=$GETCONF
# Extract the first word of "getconf", so it can be a program name with args.
set dummy getconf; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_ac_pt_GETCONF+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_ac_pt_GETCONF+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $ac_pt_GETCONF in
[\\/]* | ?:[\\/]*)
ac_cv_path_ac_pt_GETCONF="$ac_pt_GETCONF" # Let the user override the test with a path.
@@ -4721,11 +5315,15 @@ as_dummy=""$prfx/usr/bin:$prfx/bin:$prfx/usr/local/bin""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_ac_pt_GETCONF="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_ac_pt_GETCONF="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4737,11 +5335,11 @@ esac
fi
ac_pt_GETCONF=$ac_cv_path_ac_pt_GETCONF
if test -n "$ac_pt_GETCONF"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
-$as_echo "$ac_pt_GETCONF" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_GETCONF" >&5
+printf "%s\n" "$ac_pt_GETCONF" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_pt_GETCONF" = x; then
@@ -4749,8 +5347,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
GETCONF=$ac_pt_GETCONF
@@ -4759,11 +5357,13 @@ else
GETCONF="$ac_cv_path_GETCONF"
fi
- fi
+
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
-$as_echo_n "checking for Native POSIX Thread Library... " >&6; }
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Native POSIX Thread Library" >&5
+printf %s "checking for Native POSIX Thread Library... " >&6; }
libpthr_vsn=`$GETCONF GNU_LIBPTHREAD_VERSION 2>/dev/null`
if test $? -eq 0; then
case "$libpthr_vsn" in
@@ -4779,24 +5379,28 @@ $as_echo_n "checking for Native POSIX Thread Library... " >&6; }
else
nptl=no
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
-$as_echo "$nptl" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $nptl" >&5
+printf "%s\n" "$nptl" >&6; }
if test $nptl = cross; then
nptl=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
-$as_echo "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: result yes guessed because of cross compilation" >&5
+printf "%s\n" "$as_me: WARNING: result yes guessed because of cross compilation" >&2;}
fi
- if test $nptl = yes; then
+ if test $nptl = yes
+then :
+
THR_LIB_TYPE=posix_nptl
need_nptl_incldir=no
- ac_fn_c_check_header_mongrel "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_nptl_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "nptl/pthread.h" "ac_cv_header_nptl_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_nptl_pthread_h" = xyes
+then :
need_nptl_incldir=yes
NEED_NPTL_PTHREAD_H=yes
fi
+ if test $need_nptl_incldir = yes
+then :
- if test $need_nptl_incldir = yes; then
# Ahh...
nptl_path="$C_INCLUDE_PATH:$CPATH"
if test X$cross_compiling != Xyes; then
@@ -4817,13 +5421,13 @@ fi
IFS=$save_ifs
nptl_incldir=
for dir in $nptl_ws_path; do
- as_ac_Header=`$as_echo "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
-ac_fn_c_check_header_mongrel "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+ as_ac_Header=`printf "%s\n" "ac_cv_header_$dir/nptl/pthread.h" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$dir/nptl/pthread.h" "$as_ac_Header" "$ac_includes_default"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"
+then :
nptl_incldir=$dir/nptl
fi
-
if test "x$nptl_incldir" != "x"; then
THR_DEFS="$THR_DEFS -isystem $nptl_incldir"
break
@@ -4832,38 +5436,43 @@ fi
if test "x$nptl_incldir" = "x"; then
as_fn_error $? "Failed to locate nptl system include directory" "$LINENO" 5
fi
- fi
- fi
- ;;
- *) ;;
- esac
+
+fi
+
+fi
+ ;; #(
+ *) :
+ ;;
+esac
saved_cppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $THR_DEFS"
- ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_h" = xyes
+then :
-$as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h
fi
-
- ac_fn_c_check_header_mongrel "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
-if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes; then :
+ ac_fn_c_check_header_compile "$LINENO" "pthread/mit/pthread.h" "ac_cv_header_pthread_mit_pthread_h" "$ac_includes_default"
+if test "x$ac_cv_header_pthread_mit_pthread_h" = xyes
+then :
\
-$as_echo "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
+printf "%s\n" "#define HAVE_MIT_PTHREAD_H 1" >>confdefs.h
fi
-
CPPFLAGS=$saved_cppflags
- fi
+
+fi
+
fi
@@ -4872,8 +5481,9 @@ fi
odbc_lib_link_success=no
- case $host_os in
- darwin1[0-9].*)
+case $host_os in #(
+ darwin1[0-9].*) :
+
TARGET_FLAGS="-DUNIX"
if test ! -d "$with_odbc" || test "$with_odbc" = "yes"; then
ODBC_LIB= -L"/usr/local/lib"
@@ -4883,11 +5493,12 @@ odbc_lib_link_success=no
ODBC_INCLUDE="-I$with_odbc/include"
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -liodbc" >&5
-$as_echo_n "checking for SQLAllocHandle in -liodbc... " >&6; }
-if ${ac_cv_lib_iodbc_SQLAllocHandle+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -liodbc" >&5
+printf %s "checking for SQLAllocHandle in -liodbc... " >&6; }
+if test ${ac_cv_lib_iodbc_SQLAllocHandle+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-liodbc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4896,43 +5507,44 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char SQLAllocHandle ();
int
-main ()
+main (void)
{
return SQLAllocHandle ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_iodbc_SQLAllocHandle=yes
-else
+else $as_nop
ac_cv_lib_iodbc_SQLAllocHandle=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iodbc_SQLAllocHandle" >&5
-$as_echo "$ac_cv_lib_iodbc_SQLAllocHandle" >&6; }
-if test "x$ac_cv_lib_iodbc_SQLAllocHandle" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_iodbc_SQLAllocHandle" >&5
+printf "%s\n" "$ac_cv_lib_iodbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_iodbc_SQLAllocHandle" = xyes
+then :
ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes
fi
- ;;
- haiku*)
+ ;; #(
+ haiku*) :
+
TARGET_FLAGS="-DUNIX"
ODBC_LIB= -L"/system/lib"
ODBC_INCLUDE="-I/system/develop/headers"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
-$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
-if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+printf %s "checking for SQLAllocHandle in -lodbc... " >&6; }
+if test ${ac_cv_lib_odbc_SQLAllocHandle+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lodbc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4941,41 +5553,42 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char SQLAllocHandle ();
int
-main ()
+main (void)
{
return SQLAllocHandle ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_odbc_SQLAllocHandle=yes
-else
+else $as_nop
ac_cv_lib_odbc_SQLAllocHandle=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
-$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
-if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+printf "%s\n" "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes
+then :
ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes
fi
- ;;
- win32|cygwin)
+ ;; #(
+ win32|cygwin) :
+
TARGET_FLAGS="-DWIN32"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lws2_32" >&5
-$as_echo_n "checking for main in -lws2_32... " >&6; }
-if ${ac_cv_lib_ws2_32_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lws2_32" >&5
+printf %s "checking for main in -lws2_32... " >&6; }
+if test ${ac_cv_lib_ws2_32_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lws2_32 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -4983,28 +5596,28 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
int
-main ()
+main (void)
{
return main ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_ws2_32_main=yes
-else
+else $as_nop
ac_cv_lib_ws2_32_main=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32_main" >&5
-$as_echo "$ac_cv_lib_ws2_32_main" >&6; }
-if test "x$ac_cv_lib_ws2_32_main" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBWS2_32 1
-_ACEOF
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ws2_32_main" >&5
+printf "%s\n" "$ac_cv_lib_ws2_32_main" >&6; }
+if test "x$ac_cv_lib_ws2_32_main" = xyes
+then :
+ printf "%s\n" "#define HAVE_LIBWS2_32 1" >>confdefs.h
LIBS="-lws2_32 $LIBS"
@@ -5017,11 +5630,12 @@ fi
ODBC_LIB=-L"$with_odbc/lib"
ODBC_INCLUDE="-I$with_odbc/include"
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lodbc32" >&5
-$as_echo_n "checking for main in -lodbc32... " >&6; }
-if ${ac_cv_lib_odbc32_main+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for main in -lodbc32" >&5
+printf %s "checking for main in -lodbc32... " >&6; }
+if test ${ac_cv_lib_odbc32_main+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lodbc32 $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5029,55 +5643,62 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
int
-main ()
+main (void)
{
return main ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_odbc32_main=yes
-else
+else $as_nop
ac_cv_lib_odbc32_main=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc32_main" >&5
-$as_echo "$ac_cv_lib_odbc32_main" >&6; }
-if test "x$ac_cv_lib_odbc32_main" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc32_main" >&5
+printf "%s\n" "$ac_cv_lib_odbc32_main" >&6; }
+if test "x$ac_cv_lib_odbc32_main" = xyes
+then :
ODBC_LIB="$ODBC_LIB -lodbc32"; odbc_lib_link_success=yes
fi
- ;;
- *)
+ ;; #(
+ *) :
+
TARGET_FLAGS="-DUNIX"
- case "$erl_xcomp_without_sysroot-$with_odbc" in
- yes-yes | yes- )
+ case "$erl_xcomp_without_sysroot-$with_odbc" in #(
+ yes-yes | yes-) :
+
msg="Dont know where to search for odbc (setting erl_xcomp_sysroot will help)"
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $msg" >&5
-$as_echo "$as_me: WARNING: $msg" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $msg" >&5
+printf "%s\n" "$as_me: WARNING: $msg" >&2;}
echo "$msg" > "$ERL_TOP/lib/odbc/SKIP"
odbc_lib_link_success=wont_try
- ;;
- no-yes | no- )
+ ;; #(
+ no-yes | no-) :
+
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -5086,18 +5707,16 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for odbc in standard locations" >&5
-$as_echo_n "checking for odbc in standard locations... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for odbc in standard locations" >&5
+printf %s "checking for odbc in standard locations... " >&6; }
for rdir in /usr/local/odbc /usr/local /usr/odbc \
/usr /opt/local/pgm/odbc /usr/local/pgm/odbc \
"$with_odbc"; do
@@ -5116,19 +5735,20 @@ $as_echo_n "checking for odbc in standard locations... " >&6; }
break
done
if test "x$is_odbc_std_location" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No odbc library found skipping odbc" >&5
-$as_echo "$as_me: WARNING: No odbc library found skipping odbc" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: No odbc library found skipping odbc" >&5
+printf "%s\n" "$as_me: WARNING: No odbc library found skipping odbc" >&2;}
echo "No odbc library found" > "$ERL_TOP/lib/odbc/SKIP"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ODBC_LIB" >&5
-$as_echo "$ODBC_LIB" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
-$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
-if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ODBC_LIB" >&5
+printf "%s\n" "$ODBC_LIB" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+printf %s "checking for SQLAllocHandle in -lodbc... " >&6; }
+if test ${ac_cv_lib_odbc_SQLAllocHandle+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lodbc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5137,44 +5757,44 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char SQLAllocHandle ();
int
-main ()
+main (void)
{
return SQLAllocHandle ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_odbc_SQLAllocHandle=yes
-else
+else $as_nop
ac_cv_lib_odbc_SQLAllocHandle=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
-$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
-if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+printf "%s\n" "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes
+then :
ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes
fi
fi
- ;;
+ ;; #(
+ *) :
- *)
ODBC_LIB=-L"$with_odbc/lib"
ODBC_INCLUDE="-I$with_odbc/include"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
-$as_echo_n "checking for SQLAllocHandle in -lodbc... " >&6; }
-if ${ac_cv_lib_odbc_SQLAllocHandle+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for SQLAllocHandle in -lodbc" >&5
+printf %s "checking for SQLAllocHandle in -lodbc... " >&6; }
+if test ${ac_cv_lib_odbc_SQLAllocHandle+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_check_lib_save_LIBS=$LIBS
LIBS="-lodbc $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -5183,93 +5803,103 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
-#ifdef __cplusplus
-extern "C"
-#endif
char SQLAllocHandle ();
int
-main ()
+main (void)
{
return SQLAllocHandle ();
;
return 0;
}
_ACEOF
-if ac_fn_c_try_link "$LINENO"; then :
+if ac_fn_c_try_link "$LINENO"
+then :
ac_cv_lib_odbc_SQLAllocHandle=yes
-else
+else $as_nop
ac_cv_lib_odbc_SQLAllocHandle=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
-$as_echo "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
-if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes; then :
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_odbc_SQLAllocHandle" >&5
+printf "%s\n" "$ac_cv_lib_odbc_SQLAllocHandle" >&6; }
+if test "x$ac_cv_lib_odbc_SQLAllocHandle" = xyes
+then :
ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes
fi
- ;;
- esac
- ;;
+ ;;
+esac
+ ;;
esac
if test $odbc_required_headers = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"ODBC library - header check failed\"" >&5
-$as_echo "$as_me: WARNING: \"ODBC library - header check failed\"" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"ODBC library - header check failed\"" >&5
+printf "%s\n" "$as_me: WARNING: \"ODBC library - header check failed\"" >&2;}
echo "ODBC library - header check failed" > $ERL_TOP/lib/odbc/SKIP
fi
if test $odbc_lib_link_success = no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \"ODBC library - link check failed\"" >&5
-$as_echo "$as_me: WARNING: \"ODBC library - link check failed\"" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: \"ODBC library - link check failed\"" >&5
+printf "%s\n" "$as_me: WARNING: \"ODBC library - link check failed\"" >&2;}
echo "ODBC library - link check failed" > $ERL_TOP/lib/odbc/SKIP
fi
+
fi
-if test "x$GCC" = xyes; then
+if test "x$GCC" = xyes
+then :
+
# Treat certain GCC warnings as errors
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $CFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CFLAGS="-Werror=return-type $CFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+
fi
# Check whether --enable-sanitizers was given.
-if test "${enable_sanitizers+set}" = set; then :
+if test ${enable_sanitizers+y}
+then :
enableval=$enable_sanitizers;
case "$enableval" in
no) sanitizers= ;;
@@ -5311,8 +5941,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -5342,15 +5972,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -5364,8 +5994,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -5418,7 +6048,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -5434,8 +6064,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -5458,14 +6088,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -5475,46 +6107,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -5523,13 +6155,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -5538,8 +6163,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -5551,30 +6180,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -5587,13 +6196,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -5620,18 +6230,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -5643,12 +6255,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -5679,7 +6292,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -5701,6 +6314,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -5714,6 +6331,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -5755,7 +6378,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -5764,7 +6387,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -5827,7 +6450,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -5876,14 +6499,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -5920,21 +6545,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -5962,7 +6587,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -5976,7 +6601,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -6001,7 +6626,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -6229,7 +6854,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -6237,17 +6862,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -6264,7 +6889,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -6288,9 +6913,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -6343,8 +6968,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -6386,9 +7011,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -6435,7 +7060,8 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
diff --git a/lib/odbc/configure.in b/lib/odbc/configure.ac
index f11eb70796..dfc3a6ec04 100644
--- a/lib/odbc/configure.in
+++ b/lib/odbc/configure.ac
@@ -23,27 +23,21 @@ dnl define([AC_CACHE_SAVE], )dnl
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(c_src/odbcserver.c)
+AC_INIT
+AC_CONFIG_SRCDIR([c_src/odbcserver.c])
+AC_PREREQ([2.71])
-AC_CONFIG_AUX_DIRS(${ERL_TOP}/erts/autoconf)
+m4_include([otp.m4])
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- AC_CANONICAL_HOST
-else
- host_os=win32
-fi
+AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf])
+
+ERL_CANONICAL_SYSTEM_TYPE
AC_ARG_WITH(odbc,
[ --with-odbc=PATH specify location of ODBC include and lib
--with-odbc use ODBC (default)
--without-odbc don't use ODBC])
-if test "$with_odbc" = "no"; then
-
- rm -f "$ERL_TOP/lib/odbc/SKIP"
-
-else dnl "$with_odbc" != "no"
-
ERL_XCOMP_SYSROOT_INIT
dnl Checks for programs.
@@ -70,6 +64,15 @@ fi
_search_path=
+AS_IF([test "$with_odbc" = "no"],
+ [
+
+ rm -f "$ERL_TOP/lib/odbc/SKIP"
+
+ ],
+ [
+ dnl "$with_odbc" != "no"
+
# Sockets
#--------------------------------------------------------------------
@@ -91,23 +94,27 @@ _search_path=
#--------------------------------------------------------------------
erl_checkBoth=0
AC_CHECK_FUNC(connect, erl_checkSocket=0, erl_checkSocket=1)
-if test "$erl_checkSocket" = 1; then
+AS_IF([test "$erl_checkSocket" = 1],
+ [
AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket", erl_checkBoth=1)
-fi
-if test "$erl_checkBoth" = 1; then
+ ])
+AS_IF([test "$erl_checkBoth" = 1],
+ [
tk_oldLibs=$LIBS
LIBS="$LIBS -lsocket -lnsl"
AC_CHECK_FUNC(accept, odbc_erl_checkNsl=0, [LIBS=$tk_oldLibs])
-fi
+ ])
AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main, [LIBS="$LIBS -lnsl"]))
-case "$host_os" in
- haiku*)
+AS_CASE(["$host_os"],
+ [haiku*],
+ [
AC_CHECK_LIB(network, socket)
- ;;
-esac
+ ])
dnl Checks for header files.
-AC_HEADER_STDC
+AC_CHECK_INCLUDES_DEFAULT
+AC_PROG_EGREP
+
AC_CHECK_HEADERS([fcntl.h netdb.h stdlib.h string.h sys/socket.h winsock2.h])
AC_CHECK_HEADERS([windows.h])
AC_CHECK_HEADERS([sql.h sqlext.h], [odbc_required_headers=yes], [odbc_required_headers=no],
@@ -139,8 +146,10 @@ AC_SUBST(THR_LIBS)
odbc_lib_link_success=no
AC_SUBST(TARGET_FLAGS)
- case $host_os in
- darwin1[[0-9]].*)
+AS_CASE([$host_os],
+
+ [darwin1[[0-9]].*],
+ [
TARGET_FLAGS="-DUNIX"
if test ! -d "$with_odbc" || test "$with_odbc" = "yes"; then
ODBC_LIB= -L"/usr/local/lib"
@@ -151,15 +160,19 @@ AC_SUBST(TARGET_FLAGS)
fi
AC_CHECK_LIB(iodbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes])
- ;;
- haiku*)
+ ],
+
+ [haiku*],
+ [
TARGET_FLAGS="-DUNIX"
ODBC_LIB= -L"/system/lib"
ODBC_INCLUDE="-I/system/develop/headers"
dnl Haiku's package manager will deal with this for us
AC_CHECK_LIB(odbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes])
- ;;
- win32|cygwin)
+ ],
+
+ [win32|cygwin],
+ [
TARGET_FLAGS="-DWIN32"
AC_CHECK_LIB(ws2_32, main)
if test ! -d "$with_odbc" || test "$with_odbc" = "yes"; then
@@ -170,17 +183,22 @@ AC_SUBST(TARGET_FLAGS)
ODBC_INCLUDE="-I$with_odbc/include"
fi
AC_CHECK_LIB(odbc32, main, [ODBC_LIB="$ODBC_LIB -lodbc32"; odbc_lib_link_success=yes])
- ;;
- *)
+ ],
+
+ [
TARGET_FLAGS="-DUNIX"
- case "$erl_xcomp_without_sysroot-$with_odbc" in
- yes-yes | yes- )
+ AS_CASE(["$erl_xcomp_without_sysroot-$with_odbc"],
+
+ [yes-yes | yes-],
+ [
msg="Dont know where to search for odbc (setting erl_xcomp_sysroot will help)"
AC_MSG_WARN([$msg])
echo "$msg" > "$ERL_TOP/lib/odbc/SKIP"
odbc_lib_link_success=wont_try
- ;;
- no-yes | no- )
+ ],
+
+ [no-yes | no-],
+ [
AC_CHECK_SIZEOF(void *)
AC_MSG_CHECKING([for odbc in standard locations])
for rdir in /usr/local/odbc /usr/local /usr/odbc \
@@ -209,16 +227,14 @@ AC_SUBST(TARGET_FLAGS)
AC_MSG_RESULT($ODBC_LIB)
AC_CHECK_LIB(odbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes])
fi
- ;;
+ ],
- *)
+ [
ODBC_LIB=-L"$with_odbc/lib"
ODBC_INCLUDE="-I$with_odbc/include"
AC_CHECK_LIB(odbc, SQLAllocHandle,[ODBC_LIB="$ODBC_LIB -lodbc"; odbc_lib_link_success=yes])
- ;;
- esac
- ;;
-esac
+ ])
+ ])
if test $odbc_required_headers = no; then
AC_MSG_WARN(["ODBC library - header check failed"])
@@ -232,12 +248,13 @@ fi
AC_SUBST(ODBC_LIB)
AC_SUBST(ODBC_INCLUDE)
-fi dnl "$with_odbc" != "no"
+ ]) dnl "$with_odbc" != "no"
-if test "x$GCC" = xyes; then
+AS_IF([test "x$GCC" = xyes],
+ [
# Treat certain GCC warnings as errors
LM_TRY_ENABLE_CFLAG([-Werror=return-type], [CFLAGS])
-fi
+ ])
dnl ----------------------------------------------------------------------
dnl Enable -fsanitize= flags.
@@ -259,4 +276,5 @@ CFLAGS="$CFLAGS $sanitizers"
LDFLAGS="$LDFLAGS $sanitizers"
])
-AC_OUTPUT(c_src/$host/Makefile:c_src/Makefile.in)
+AC_CONFIG_FILES([c_src/$host/Makefile:c_src/Makefile.in])
+AC_OUTPUT
diff --git a/lib/odbc/src/Makefile b/lib/odbc/src/Makefile
index 7ca59495ed..e18628e94d 100644
--- a/lib/odbc/src/Makefile
+++ b/lib/odbc/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2016. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -83,7 +83,7 @@ ERL_COMPILE_FLAGS += -I$(INCLUDE) \
#debug:
# @${MAKE} TYPE=debug opt
-debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/odbc/test/Makefile b/lib/odbc/test/Makefile
index c90f76a83d..87caa54c61 100644
--- a/lib/odbc/test/Makefile
+++ b/lib/odbc/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2016. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -76,7 +76,7 @@ ERL_COMPILE_FLAGS += $(INCLUDES) \
# Targets
# ----------------------------------------------------
-tests debug opt: $(BUILDTARGET)
+tests $(TYPES): $(BUILDTARGET)
targets: $(TARGET_FILES)
diff --git a/lib/odbc/test/mysql.erl b/lib/odbc/test/mysql.erl
index 69b136e743..1bba1482c9 100644
--- a/lib/odbc/test/mysql.erl
+++ b/lib/odbc/test/mysql.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2011-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2011-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@
%-------------------------------------------------------------------------
connection_string() ->
- case test_server:os_type() of
+ case os:type() of
{unix, linux} ->
"DSN=MySQL;Database=odbctest;Uid=odbctest;Pwd=gurka;CHARSET=utf8;SSTMT=SET NAMES 'utf8';";
{unix, sunos} ->
diff --git a/lib/odbc/test/postgres.erl b/lib/odbc/test/postgres.erl
index 7c45e48899..717d42a505 100644
--- a/lib/odbc/test/postgres.erl
+++ b/lib/odbc/test/postgres.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@
%-------------------------------------------------------------------------
connection_string() ->
- case test_server:os_type() of
+ case os:type() of
{unix, sunos} ->
"DSN=Postgres;UID=odbctest";
{unix, linux} ->
diff --git a/lib/os_mon/c_src/memsup.c b/lib/os_mon/c_src/memsup.c
index 7ea7456003..3cc13c905b 100644
--- a/lib/os_mon/c_src/memsup.c
+++ b/lib/os_mon/c_src/memsup.c
@@ -66,7 +66,7 @@
* This program communicates with Erlang through the standard
* input and output file descriptors (0 and 1). These descriptors
* (and the standard error descriptor 2) must NOT be closed
- * explicitely by this program at termination (in UNIX it is
+ * explicitly by this program at termination (in UNIX it is
* taken care of by the operating system itself; in VxWorks
* it is taken care of by the spawn driver part of the Emulator).
*
@@ -176,7 +176,7 @@ static void print_error(const char *,...);
* PageTables: 9368 kB 2.5.41+
* VmallocTotal: 34359738367 kB ?? total size of vmalloc memory area
* VmallocUsed: 57376 kB ?? amount of vmalloc area which is used
- * VmallocChunk: 34359677947 kB ?? largest contigious block of vmalloc area which is free
+ * VmallocChunk: 34359677947 kB ?? largest contiguous block of vmalloc area which is free
* ReverseMaps: 5738 2.5.41+ number of rmap pte chains
* SwapCached: 0 kB 2.5.??+
* HugePages_Total: 0 2.5.??+
diff --git a/lib/os_mon/c_src/nteventlog/elog_format.h b/lib/os_mon/c_src/nteventlog/elog_format.h
index d92e2a81c3..e753100001 100644
--- a/lib/os_mon/c_src/nteventlog/elog_format.h
+++ b/lib/os_mon/c_src/nteventlog/elog_format.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2016. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@ char *format_message(MessageFiles mf, DWORD id,
* Formats an eventlog message with the messagefiles
* in mf, the ID id, the stringarray strings,
* containing numstrings strings into buff.
- * if bufflen is to small or anything else failes,
+ * if bufflen is to small or anything else fails,
* the return value is NULL.
*/
diff --git a/lib/os_mon/c_src/nteventlog/elog_main.c b/lib/os_mon/c_src/nteventlog/elog_main.c
index a7b59e516b..bed558f80f 100644
--- a/lib/os_mon/c_src/nteventlog/elog_main.c
+++ b/lib/os_mon/c_src/nteventlog/elog_main.c
@@ -285,7 +285,7 @@ BOOL output_record(char *category, EVENTLOGRECORD *event){
* number and timestamp, and sends them to
* stdout. If timestamp does
* not correspond with record number, the
- * log is concidered wrapped around
+ * log is considered wrapped around
* and is reread from the beginning.
* time is ignored if 0.
* If record_number is 0, the whole log is read (if there is one).
diff --git a/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.c b/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.c
index 1920268af9..96a2625e73 100644
--- a/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.c
+++ b/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2016. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@ static char *stdin_buff = NULL;
static int stdin_siz = 0;
static int stdin_len = 0;
static int stdin_eof = 0;
-/* end syncronized objects */
+/* end synchronized objects */
static int stdin_is_console = 0;
static HANDLE stdin_event;
diff --git a/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.h b/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.h
index b8f08bb412..4677477753 100644
--- a/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.h
+++ b/lib/os_mon/c_src/nteventlog/elog_pipe_stdin.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2016. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -22,11 +22,11 @@
/*
* Module: elog_pipe_stdin
* Purpouse: Read data from stdin when stdin is a pipe
- * and deliver events only when data is really availabel or
+ * and deliver events only when data is really available or
* end of file is reached.
* If we would wait on an ordinary pipe handle, we
* would return immediately as it's always "signaled".
- * some kind of asyncronous I/O in the win32 way is
+ * some kind of asynchronous I/O in the win32 way is
* not possible as it's not supported on anonymous pipes
* (besides we have not opened the file ourselves so we
* cannot specify that we want async I/O...).
@@ -66,7 +66,7 @@ BOOL setup_pipe_stdin(void);
/*
* Initializes the module, returns TRUE if OK.
* If stdin is a console, no thread is created
- * and the event objet returned by get_Stdin_event
+ * and the event object returned by get_Stdin_event
* will be the console handle.
* Check if stdin was a console with the console_stdin()
* function.
diff --git a/lib/os_mon/c_src/win32sysinfo.c b/lib/os_mon/c_src/win32sysinfo.c
index 67b3f74910..1c9590fb8b 100644
--- a/lib/os_mon/c_src/win32sysinfo.c
+++ b/lib/os_mon/c_src/win32sysinfo.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1997-2016. All Rights Reserved.
+ * Copyright Ericsson AB 1997-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -55,7 +55,7 @@
* get_disk_info 'd'Driveroot (where Driveroot is a string like this "A:\\"
* (request info of specific drive)
- * The result is returned with the same format as above exept that
+ * The result is returned with the same format as above except that
* Type will be DRIVE_NOT_EXIST if the drive does not exist.
*
* get_mem_info 'm' (request info about memory)
diff --git a/lib/os_mon/doc/src/notes.xml b/lib/os_mon/doc/src/notes.xml
index f510329619..263eadad85 100644
--- a/lib/os_mon/doc/src/notes.xml
+++ b/lib/os_mon/doc/src/notes.xml
@@ -698,7 +698,7 @@
<list>
<item>
<p>
- Memsup did not read memory correctly on MaxOSX
+ Memsup did not read memory correctly on macOS X
Snowleopard. This has now been corrected. (Thanks to Joel
Reymont)</p>
<p>
diff --git a/lib/os_mon/src/Makefile b/lib/os_mon/src/Makefile
index 48a896265b..e28fb12548 100644
--- a/lib/os_mon/src/Makefile
+++ b/lib/os_mon/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -65,7 +65,7 @@ ERL_COMPILE_FLAGS += -I$(INCLUDE) -Werror
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/os_mon/src/os_mon.app.src b/lib/os_mon/src/os_mon.app.src
index 2b1f7dc85b..76d056de04 100644
--- a/lib/os_mon/src/os_mon.app.src
+++ b/lib/os_mon/src/os_mon.app.src
@@ -31,4 +31,4 @@
{start_memsup, true},
{start_os_sup, false}]},
{mod, {os_mon, []}},
- {runtime_dependencies, ["stdlib-2.0","sasl-2.4","kernel-3.0","erts-6.0"]}]}.
+ {runtime_dependencies, ["stdlib-3.4","sasl-2.4","kernel-3.0","erts-6.0"]}]}.
diff --git a/lib/os_mon/test/Makefile b/lib/os_mon/test/Makefile
index 73618e5fae..d8dc4e57c7 100644
--- a/lib/os_mon/test/Makefile
+++ b/lib/os_mon/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2021. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -64,7 +64,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES)\
> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/os_mon/test/cpu_sup_SUITE.erl b/lib/os_mon/test/cpu_sup_SUITE.erl
index 03aa6cd355..79a7285bd9 100644
--- a/lib/os_mon/test/cpu_sup_SUITE.erl
+++ b/lib/os_mon/test/cpu_sup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- case test_server:os_type() of
+ case os:type() of
{unix, sunos} ->
[load_api, util_api, util_values, port, unavailable];
{unix, linux} ->
diff --git a/lib/os_mon/test/disksup_SUITE.erl b/lib/os_mon/test/disksup_SUITE.erl
index fe27ea9046..1775456514 100644
--- a/lib/os_mon/test/disksup_SUITE.erl
+++ b/lib/os_mon/test/disksup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -61,7 +61,7 @@ all() ->
Bugs = [otp_5910],
Always = [api, config, alarm, port, posix_only, unavailable,
parse_df_output_posix, parse_df_output_susv3] ++ Bugs,
- case test_server:os_type() of
+ case os:type() of
{unix, _OSname} -> Always;
{win32, _OSname} -> Always;
_OS -> [unavailable]
@@ -404,7 +404,7 @@ check_get_disk_data() ->
% filter get_disk_data and remove entriew with zero capacity
% "non-normal" filesystems report zero capacity
-% - Perhaps errorneous 'df -k -l'?
+% - Perhaps erroneous 'df -k -l'?
% - Always list filesystems by type '-t ufs,zfs,..' instead?
% It is unclear what the intention was from the beginning.
get_disk_data() ->
diff --git a/lib/os_mon/test/memsup_SUITE.erl b/lib/os_mon/test/memsup_SUITE.erl
index b2944e2804..1f66ea0afa 100644
--- a/lib/os_mon/test/memsup_SUITE.erl
+++ b/lib/os_mon/test/memsup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -63,7 +63,7 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- All = case test_server:os_type() of
+ All = case os:type() of
{unix, sunos} ->
[api, alarm1, alarm2, process, config, timeout,
unavailable, port];
@@ -551,7 +551,7 @@ timeout(Config) when is_list(Config) ->
%% Linux should be handled the same way as solaris.
- % TimeoutMsg = case test_server:os_type() of
+ % TimeoutMsg = case os:type() of
% {unix, sunos} -> ext_collection_timeout;
% {unix, linux} -> reg_collection_timeout
% end,
@@ -722,14 +722,14 @@ otp_5910(Config) when is_list(Config) ->
ok = application:start(os_mon),
ok.
-improved_system_memory_data(Config) ->
- {ok, Node} = start_node(Config),
+improved_system_memory_data(Config) when is_list(Config) ->
+ {ok, Peer, Node} = ?CT_PEER(),
ok = rpc:call(Node, application, start, [sasl]),
ok = rpc:call(Node, application, start, [os_mon]),
ExtMemData = rpc:call(Node, memsup, get_system_memory_data, []),
- stop_node(Node),
+ peer:stop(Peer),
Tags = ?SYSTEM_MEMORY_DATA_TAGS,
AvailableMemoryPresent
@@ -785,7 +785,7 @@ force_collection(TimerRef) ->
erlang:trace(whereis(memsup), false, ['receive']),
flush(),
collection_timeout;
- timout ->
+ timeout ->
erlang:trace(whereis(memsup), false, ['receive']),
flush(),
timeout;
@@ -802,20 +802,3 @@ flush() ->
after 0 ->
ok
end.
-
-start_node(Config) ->
- start_node(Config, "").
-
-start_node(Config, Args) when is_list(Config) ->
- Pa = filename:dirname(code:which(?MODULE)),
- Name = list_to_atom(atom_to_list(?MODULE)
- ++ "-"
- ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-"
- ++ integer_to_list(erlang:system_time(second))
- ++ "-"
- ++ integer_to_list(erlang:unique_integer([positive]))),
- test_server:start_node(Name, slave, [{args, "-pa "++Pa++" "++Args}]).
-
-stop_node(Node) ->
- test_server:stop_node(Node).
diff --git a/lib/os_mon/test/os_mon_SUITE.erl b/lib/os_mon/test/os_mon_SUITE.erl
index c373b5d851..7eec6d0eaf 100644
--- a/lib/os_mon/test/os_mon_SUITE.erl
+++ b/lib/os_mon/test/os_mon_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- case test_server:os_type() of
+ case os:type() of
{unix, sunos} -> [app_file, appup_file, config];
_OS -> [app_file, appup_file]
end.
diff --git a/lib/os_mon/test/os_sup_SUITE.erl b/lib/os_mon/test/os_sup_SUITE.erl
index febd3b5f12..75bcfdd075 100644
--- a/lib/os_mon/test/os_sup_SUITE.erl
+++ b/lib/os_mon/test/os_sup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- case test_server:os_type() of
+ case os:type() of
{unix, sunos} -> [message, config, port];
{win32, _OSname} -> [message];
OS ->
@@ -76,7 +76,7 @@ message(Config) when is_list(Config) ->
%% Check with message_receptor that it has been received
ct:sleep({seconds,1}),
Msg =
- case test_server:os_type() of
+ case os:type() of
{unix, sunos} ->
{?TAG, Data};
{win32, _} ->
diff --git a/lib/parsetools/doc/src/leex.xml b/lib/parsetools/doc/src/leex.xml
index 153374e16a..357ed86f44 100644
--- a/lib/parsetools/doc/src/leex.xml
+++ b/lib/parsetools/doc/src/leex.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2009</year><year>2020</year>
+ <year>2009</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -222,13 +222,13 @@ io:request(InFile, {get_until,unicode,Prompt,Module,token,[Line]})
<c>[]</c>.</p>
<p>This functions differs from <c>token</c> in that it will
- continue to scan tokens upto and including an
+ continue to scan tokens up to and including an
<c>{end_token,Token}</c> has been scanned (see next
section). It will then return all the tokens. This is
typically used for scanning grammars like Erlang where there
is an explicit end token, <c>'.'</c>. If no end token is
found then the whole file will be scanned and returned. If
- an error occurs then all tokens upto and including the next
+ an error occurs then all tokens up to and including the next
end token will be skipped.</p>
<p>It is not designed to be called directly by an application
diff --git a/lib/parsetools/doc/src/notes.xml b/lib/parsetools/doc/src/notes.xml
index 32a95f51a8..7f18fb17f2 100644
--- a/lib/parsetools/doc/src/notes.xml
+++ b/lib/parsetools/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1997</year><year>2021</year>
+ <year>1997</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -456,7 +456,7 @@
<section><title>Improvements and New Features</title>
<list>
<item>
- <p> The formating of Yecc's error messages has been
+ <p> The formatting of Yecc's error messages has been
improved. (Thanks to Joe Armstrong.) </p>
<p>
Own Id: OTP-8919</p>
diff --git a/lib/parsetools/doc/src/yecc.xml b/lib/parsetools/doc/src/yecc.xml
index 60c1bdb8f0..218cec5330 100644
--- a/lib/parsetools/doc/src/yecc.xml
+++ b/lib/parsetools/doc/src/yecc.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -361,7 +361,7 @@ element -> list : '$1'. </code>
<c>(a b c).</c>. This still assumes that this was the first
input line that the scanner tokenized:</p>
<code type="none">
-{cons, {atom, 1, a,} {cons, {atom, 1, b},
+{cons, {atom, 1, a}, {cons, {atom, 1, b},
{cons, {atom, 1, c}, nil}}} </code>
<p>The associated code contains <c>pseudo variables</c> <c>'$1'</c>, <c>'$2'</c>, <c>'$3'</c>, etc. which refer to (are
bound to) the values associated previously by the parser with
diff --git a/lib/parsetools/include/leexinc.hrl b/lib/parsetools/include/leexinc.hrl
index 2a74c252ff..8dfc42f479 100644
--- a/lib/parsetools/include/leexinc.hrl
+++ b/lib/parsetools/include/leexinc.hrl
@@ -32,7 +32,7 @@ string(Ics0, L0, Tcs, Ts) ->
case yystate(yystate(), Ics0, L0, 0, reject, 0) of
{A,Alen,Ics1,L1} -> % Accepting end state
string_cont(Ics1, L1, yyaction(A, Alen, Tcs, L0), Ts);
- {A,Alen,Ics1,L1,_S1} -> % Accepting transistion state
+ {A,Alen,Ics1,L1,_S1} -> % Accepting transition state
string_cont(Ics1, L1, yyaction(A, Alen, Tcs, L0), Ts);
{reject,_Alen,Tlen,_Ics1,L1,_S1} -> % After a non-accepting state
{error,{L0,?MODULE,{illegal,yypre(Tcs, Tlen+1)}},L1};
diff --git a/lib/parsetools/src/Makefile b/lib/parsetools/src/Makefile
index ba206904ec..c7971750a7 100644
--- a/lib/parsetools/src/Makefile
+++ b/lib/parsetools/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2016. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -66,7 +66,7 @@ ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/stdlib/include \
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/parsetools/src/leex.erl b/lib/parsetools/src/leex.erl
index 37f3fb7114..15803b3b82 100644
--- a/lib/parsetools/src/leex.erl
+++ b/lib/parsetools/src/leex.erl
@@ -575,7 +575,7 @@ collect_action(Ifile, Chars, L0, Cont0) ->
%% parse_rule(RegExpString, RegExpLine, ActionTokens, Macros, Counter, State) ->
%% {ok,{RE,Action},ActionData,State}.
-%% Parse one regexp after performing macro substition.
+%% Parse one regexp after performing macro substitution.
parse_rule(S, Line, [{dot,_}], Ms, N, St) ->
case parse_rule_regexp(S, Ms, St) of
@@ -1126,7 +1126,7 @@ comp_crs([], Last) -> [{Last,maxchar}].
%% build_dfa(NFA, NfaFirstState) -> {DFA,DfaFirstState}.
%% Build a DFA from an NFA using "subset construction". The major
%% difference from the book is that we keep the marked and unmarked
-%% DFA states in seperate lists. New DFA states are added to the
+%% DFA states in separate lists. New DFA states are added to the
%% unmarked list and states are marked by moving them to the marked
%% list. We assume that the NFA accepting state numbers are in
%% ascending order for the rules and use ordsets to keep this order.
@@ -1264,7 +1264,7 @@ accept([], _) -> noaccept.
%% minimise_dfa(DFA, DfaFirst) -> {DFA,DfaFirst}.
%% Minimise the DFA by removing equivalent states. We consider a
%% state if both the transitions and the their accept state is the
-%% same. First repeatedly run throught the DFA state list removing
+%% same. First repeatedly run through the DFA state list removing
%% equivalent states and updating remaining transitions with
%% remaining equivalent state numbers. When no more reductions are
%% possible then pack the remaining state numbers to get consecutive
diff --git a/lib/parsetools/src/parsetools.app.src b/lib/parsetools/src/parsetools.app.src
index a7b258820a..e67e3e38f2 100644
--- a/lib/parsetools/src/parsetools.app.src
+++ b/lib/parsetools/src/parsetools.app.src
@@ -12,7 +12,7 @@
{env, [{file_util_search_methods,[{"", ""}, {"ebin", "esrc"}, {"ebin", "src"}]}
]
},
- {runtime_dependencies, ["stdlib-2.5","kernel-3.0","erts-6.0"]}
+ {runtime_dependencies, ["stdlib-3.4","kernel-3.0","erts-6.0"]}
]
}.
diff --git a/lib/parsetools/src/yecc.erl b/lib/parsetools/src/yecc.erl
index 0e5b5d4388..5b2a9efe4d 100644
--- a/lib/parsetools/src/yecc.erl
+++ b/lib/parsetools/src/yecc.erl
@@ -117,7 +117,7 @@
%% when debugging).
%% Non-terminals are also given integer codes, starting with -1. The
-%% absolut value of the code is used for indexing a tuple of lists of
+%% absolute value of the code is used for indexing a tuple of lists of
%% rules.
-define(SYMBOLS_AS_CODES, true).
@@ -1317,7 +1317,7 @@ compute_state(Seed, Tables) ->
Closure = keysort(1, erase()),
state_items(Closure, [], [], Tables#tabs.rp_rhs).
-%% Collects a uniqe id for the state (all rule pointers).
+%% Collects a unique id for the state (all rule pointers).
state_items([{RP, LA} | L], Is, Id, RpRhs) ->
I = #item{rule_pointer = RP, look_ahead = LA, rhs = element(RP, RpRhs)},
state_items(L, [I | Is], [RP | Id], RpRhs);
@@ -1911,13 +1911,13 @@ report_conflict(Conflict, St, ActionName, How) ->
if
St#yecc.verbose ->
io:fwrite(<<"~s\n">>, [format_conflict(Conflict)]),
- Formated = format_symbol(ActionName),
+ Formatted = format_symbol(ActionName),
case How of
prec ->
- io:fwrite(<<"Resolved in favor of ~ts.\n\n">>, [Formated]);
+ io:fwrite(<<"Resolved in favor of ~ts.\n\n">>, [Formatted]);
default ->
io:fwrite(<<"Conflict resolved in favor of ~ts.\n\n">>,
- [Formated])
+ [Formatted])
end;
true ->
ok
@@ -2130,7 +2130,7 @@ output_goto_fini(F, NT, #yecc{includefile_version = {1,1}}=St0) ->
[F]),
fwrite(St,
?YECC_BUG(<<"{~ts, State, missing_in_goto_table}">>,
- [quoted_atom(St0, NT)]),
+ [quoted_atom(NT)]),
[]);
output_goto_fini(_F, _NT, St) ->
fwrite(St, <<".\n\n">>, []).
@@ -2255,13 +2255,13 @@ output_action(St, State, Terminal, #reduce{}=Action, IsFirst, SI) ->
output_action(St0, State, Terminal, #shift{state = NewState}, IsFirst, _SI) ->
St10 = delim(St0, IsFirst),
St = fwrite(St10, <<"yeccpars2_~w(S, ~ts, Ss, Stack, T, Ts, Tzr) ->\n">>,
- [State, quoted_atom(St10, Terminal)]),
+ [State, quoted_atom(Terminal)]),
output_call_to_includefile(NewState, St);
output_action(St0, State, Terminal, accept, IsFirst, _SI) ->
St10 = delim(St0, IsFirst),
St = fwrite(St10,
<<"yeccpars2_~w(_S, ~ts, _Ss, Stack, _T, _Ts, _Tzr) ->\n">>,
- [State, quoted_atom(St10, Terminal)]),
+ [State, quoted_atom(Terminal)]),
fwrite(St, <<" {ok, hd(Stack)}">>, []);
output_action(St, _State, _Terminal, nonassoc, _IsFirst, _SI) ->
St.
@@ -2287,7 +2287,7 @@ output_reduce(St0, State, Terminal,
IsFirst, StateInfo) ->
St10 = delim(St0, IsFirst),
QuotedTerminal = if
- is_atom(Terminal) -> quoted_atom(St10, Terminal);
+ is_atom(Terminal) -> quoted_atom(Terminal);
true -> Terminal
end,
St20 = fwrite(St10,
@@ -2341,11 +2341,13 @@ delim(St, true) ->
delim(St, false) ->
fwrite(St, <<";\n">>, []).
-quoted_atom(#yecc{encoding = latin1}, Atom) when is_atom(Atom) ->
- io_lib:write_atom_as_latin1(Atom);
-quoted_atom(_St, Atomic) ->
- io_lib:write(Atomic).
-
+%% Always quote atoms to ensure compatibility with future reserved words.
+quoted_atom(Atom) when is_atom(Atom) ->
+ case lists:flatten(io_lib:write_atom_as_latin1(Atom)) of
+ "'" ++ _ = Quoted -> Quoted;
+ NotQuoted -> ["'", NotQuoted, "'"]
+ end.
+
output_inlined(St, UserCodeActions, Infile) ->
foldl(fun(#user_code{funname = InlinedFunctionName,
action = Action}, St_0) ->
@@ -2407,13 +2409,23 @@ output_nowarn(St, Function, Suffix, Arity) ->
inlined_function_name(St, State, Terminal) ->
End = case Terminal of
"Cat" -> [];
- _ -> [quoted_atom(St, Terminal)]
+ _ -> [safe_atom_chars(St, Terminal)]
end,
list_to_atom(concat([yeccpars2_, State, '_'] ++ End)).
-compile({nowarn_unused_function,function_name/3}).
function_name(St, Name, Suf) ->
- list_to_atom(concat([Name, '_'] ++ [quoted_atom(St, Suf)])).
+ list_to_atom(concat([Name, '_', safe_atom_chars(St, Suf)])).
+
+safe_atom_chars(St, Atom) when is_atom(Atom) ->
+ case St of
+ #yecc{encoding = latin1} ->
+ io_lib:write_atom_as_latin1(Atom);
+ #yecc{} ->
+ atom_to_list(Atom)
+ end;
+safe_atom_chars(_St, Atomic) ->
+ io_lib:write(Atomic).
rule(RulePointer, St) ->
#rule{n = N, location = Location, symbols = Symbols} =
diff --git a/lib/parsetools/test/Makefile b/lib/parsetools/test/Makefile
index 046b29067b..d494953f1e 100644
--- a/lib/parsetools/test/Makefile
+++ b/lib/parsetools/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2016. All Rights Reserved.
+# Copyright Ericsson AB 2005-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -54,7 +54,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES)\
> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/parsetools/test/leex_SUITE.erl b/lib/parsetools/test/leex_SUITE.erl
index 1518c5d91e..09a6e026bd 100644
--- a/lib/parsetools/test/leex_SUITE.erl
+++ b/lib/parsetools/test/leex_SUITE.erl
@@ -1043,7 +1043,7 @@ otp_11286(doc) ->
"OTP-11286. A Unicode filename bug; both Leex and Yecc.";
otp_11286(suite) -> [];
otp_11286(Config) when is_list(Config) ->
- Node = start_node(otp_11286, "+fnu"),
+ {ok, Peer, Node} = ?CT_PEER(["+fnu"]),
Dir = ?privdir,
UName = [1024] ++ "u",
UDir = filename:join(Dir, UName),
@@ -1087,7 +1087,7 @@ otp_11286(Config) when is_list(Config) ->
{ok,_,_} = rpc:call(Node, compile, file,
[Scannerfile,[basic_validation,return]]),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
otp_13916(doc) ->
@@ -1127,8 +1127,6 @@ otp_13916(Config) when is_list(Config) ->
ok.
otp_14285(Config) ->
- Dir = ?privdir,
-
Ts = [{otp_14285_1,
<<"%% encoding: latin-1\n"
"Definitions.\n"
@@ -1210,17 +1208,6 @@ erlang:display({erlfile,ErlFile}),
{ok, compiler_warnings, []} = compile:file(ErlFile, [return]),
ok.
-start_node(Name, Args) ->
- [_,Host] = string:tokens(atom_to_list(node()), "@"),
- ct:log("Trying to start ~w@~s~n", [Name,Host]),
- case test_server:start_node(Name, peer, [{args,Args}]) of
- {error,Reason} ->
- ct:fail(Reason);
- {ok,Node} ->
- ct:log("Node ~p started~n", [Node]),
- Node
- end.
-
unwritable(Fname) ->
{ok, Info} = file:read_file_info(Fname),
Mode = Info#file_info.mode - 8#00200,
diff --git a/lib/parsetools/test/yecc_SUITE.erl b/lib/parsetools/test/yecc_SUITE.erl
index 5162315076..c0f03edd9e 100644
--- a/lib/parsetools/test/yecc_SUITE.erl
+++ b/lib/parsetools/test/yecc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -269,7 +269,7 @@ syntax(Config) when is_list(Config) ->
nt -> t.">>),
{ok,_,[{_,[{{2,13},yecc,bad_declaration}]}]} =
yecc:file(Filename, Ret),
- ?line {ok,_,[{_,[{2,yecc,bad_declaration}]}]} =
+ {ok,_,[{_,[{2,yecc,bad_declaration}]}]} =
yecc:file(Filename, [{error_location, line} | Ret]),
%% Syntax error found by yeccparser.
@@ -1851,7 +1851,7 @@ otp_7969(Config) when is_list(Config) ->
ok.
otp_8919(doc) ->
- "OTP-8919. Improve formating of Yecc error messages.";
+ "OTP-8919. Improve formatting of Yecc error messages.";
otp_8919(suite) -> [];
otp_8919(Config) when is_list(Config) ->
A1 = erl_anno:new(1),
@@ -2042,7 +2042,7 @@ otp_11286(doc) ->
"OTP-11286. A Unicode filename bug; both Leex and Yecc.";
otp_11286(suite) -> [];
otp_11286(Config) when is_list(Config) ->
- Node = start_node(otp_11286, "+fnu"),
+ {ok, Peer, Node} = ?CT_PEER(["+fnu"]),
Dir = ?privdir,
UName = [1024] ++ "u",
UDir = filename:join(Dir, UName),
@@ -2082,7 +2082,7 @@ otp_11286(Config) when is_list(Config) ->
Opts = [return, warn_unused_vars,{outdir,Dir}],
{ok,_,_} = rpc:call(Node, compile, file, [ErlFile, Opts]),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
otp_14285(Config) ->
@@ -2214,17 +2214,6 @@ otp_17535(Config) when is_list(Config) ->
{ok, _, []} = compile:file(ErlFile, [return]),
ok.
-start_node(Name, Args) ->
- [_,Host] = string:tokens(atom_to_list(node()), "@"),
- ct:log("Trying to start ~w@~s~n", [Name,Host]),
- case test_server:start_node(Name, peer, [{args,Args}]) of
- {error,Reason} ->
- ct:fail(Reason);
- {ok,Node} ->
- ct:log("Node ~p started~n", [Node]),
- Node
- end.
-
yeccpre_size() ->
yeccpre_size(default_yeccpre()).
diff --git a/lib/public_key/.gitignore b/lib/public_key/.gitignore
index d30fe62c9d..8d0ebe018f 100644
--- a/lib/public_key/.gitignore
+++ b/lib/public_key/.gitignore
@@ -1,7 +1,9 @@
# public_key
-asn1/*.asn1db
-asn1/*.erl
-asn1/*.hrl
+src/*.asn1db
+src/OTP-PUB-KEY.erl
+src/OTP-PUB-KEY.hrl
+src/PKCS-FRAME.erl
+src/PKCS-FRAME.hrl
include/OTP-PUB-KEY.hrl
include/PKCS-FRAME.hrl
diff --git a/lib/public_key/asn1/ECPrivateKey.asn1 b/lib/public_key/asn1/ECPrivateKey.asn1
index e0f4c3a011..926afe5b29 100644
--- a/lib/public_key/asn1/ECPrivateKey.asn1
+++ b/lib/public_key/asn1/ECPrivateKey.asn1
@@ -19,7 +19,7 @@ ECPrivateKey ::= SEQUENCE {
privateKey CurvePrivateKey,
parameters [0] EcpkParameters OPTIONAL,
publicKey [1] CurvePublicKey OPTIONAL,
- -- Should be PKCS-8 Attributes but problem at the moment with PKCS-8 beeing part
+ -- Should be PKCS-8 Attributes but problem at the moment with PKCS-8 being part
-- of PCKS-FRAME and PKIX1Algorithms88 is part of OTP-PUB-KEY. Procrastinate
-- the solution as it mostly not used anyway
attributes ANY OPTIONAL
diff --git a/lib/public_key/asn1/Makefile b/lib/public_key/asn1/Makefile
index 1fef168463..d33e13fb14 100644
--- a/lib/public_key/asn1/Makefile
+++ b/lib/public_key/asn1/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2020. All Rights Reserved.
+# Copyright Ericsson AB 2008-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -18,6 +18,9 @@
# %CopyrightEnd%
#
+EGEN = ../src
+ESRC = ../src
+
include $(ERL_TOP)/make/target.mk
include $(ERL_TOP)/make/$(TARGET)/otp.mk
@@ -39,28 +42,26 @@ RELSYSDIR = $(RELEASE_PATH)/lib/public_key-$(VSN)
.SUFFIXES: .asn1
.PRECIOUS: %.erl
+INCLUDE = ../include
+EBIN = ../ebin
+
ASN_TOP = OTP-PUB-KEY PKCS-FRAME
ASN_MODULES = PKIX1Explicit88 PKIX1Implicit88 PKIX1Algorithms88 \
PKIXAttributeCertificate PKCS-1 PKCS-3 PKCS-7 PKCS-8 PKCS-10 PKCS5v2-0 OTP-PKIX \
InformationFramework RFC5639 CMSAesRsaesOaep
ASN_ASNS = $(ASN_MODULES:%=%.asn1)
-ASN_ERLS = $(ASN_TOP:%=%.erl)
+ASN_ERLS = $(ASN_TOP:%=$(ESRC)/%.erl)
ASN_HRLS = $(ASN_TOP:%=%.hrl)
ASN_CONFIGS = OTP-PUB-KEY.asn1config
ASN_DBS = $(ASN_MODULES:%=%.asn1db) OTP-PUB-KEY.asn1db
ASN_TABLES = $(ASN_MODULES:%=%.table)
-GEN_MODULES =
-GEN_ERLS = $(GEN_MODULES:%=%.erl)
ERL_MODULES = $(ASN_TOP) $(GEN_MODULES)
TARGET_FILES= $(ERL_MODULES:%=$(EBIN)/%.$(EMULATOR))
HRL_FILES = $(ASN_HRLS:%=$(INCLUDE)/%)
-INCLUDE = ../include
-EBIN = ../ebin
-
# ----------------------------------------------------
# FLAGS
# ----------------------------------------------------
@@ -73,18 +74,18 @@ ASN_FLAGS = -bber +der +noobj +asn1config
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES) $(HRL_FILES)
+$(TYPES): $(TARGET_FILES) $(HRL_FILES)
clean:
- -rm -f $(ASN_ERLS) $(GEN_ERLS) $(ASN_HRLS) $(HRL_FILES) $(ASN_DBS) \
+ -rm -f $(ASN_ERLS) $(ASN_HRLS) $(HRL_FILES) $(ASN_DBS) \
$(ASN_TABLES) $(TARGET_FILES) *.beam *~
docs:
-%.erl %.hrl: %.set.asn
- $(asn_verbose)erlc $(ASN_FLAGS) $<
+$(ESRC)/%.erl $(ESRC)/%.hrl: %.set.asn
+ $(asn_verbose)erlc $(ASN_FLAGS) -o $(ESRC) $<
-$(INCLUDE)/%.hrl: %.hrl
+$(INCLUDE)/%.hrl: $(ESRC)/%.hrl
$(gen_verbose)cp -p $< $@
# ----------------------------------------------------
@@ -96,8 +97,10 @@ release_spec: opt
$(INSTALL_DIR) "$(RELSYSDIR)/include"
$(INSTALL_DATA) $(HRL_FILES) "$(RELSYSDIR)/include"
$(INSTALL_DIR) "$(RELSYSDIR)/asn1"
- $(INSTALL_DATA) $(ASN_ASNS) $(ASN_ERLS) $(ASN_HRLS) $(ASN_CONFIGS) \
- $(GEN_ERLS) "$(RELSYSDIR)/asn1"
+ $(INSTALL_DATA) $(ASN_ASNS) $(ASN_CONFIGS) \
+ "$(RELSYSDIR)/asn1"
+ $(INSTALL_DIR) "$(RELSYSDIR)/src"
+ $(INSTALL_DATA) $(ASN_ERLS) "$(RELSYSDIR)/src"
$(INSTALL_DIR) "$(RELSYSDIR)/ebin"
$(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
@@ -106,7 +109,7 @@ release_docs_spec:
#
# Dependencies
-$(EBIN)/OTP-PUB-KEY.beam: OTP-PUB-KEY.erl OTP-PUB-KEY.hrl
+$(EBIN)/OTP-PUB-KEY.beam: $(ESRC)/OTP-PUB-KEY.erl $(INCLUDE)/OTP-PUB-KEY.hrl
OTP-PUB-KEY.erl OTP-PUB-KEY.hrl: OTP-PUB-KEY.asn1db
OTP-PUB-KEY.asn1db: PKIX1Algorithms88.asn1 \
PKIX1Explicit88.asn1 \
@@ -120,7 +123,7 @@ OTP-PUB-KEY.asn1db: PKIX1Algorithms88.asn1 \
OTP-PKIX.asn1 \
RFC5639.asn1
-$(EBIN)/PKCS-FRAME.beam: PKCS-FRAME.erl PKCS-FRAME.hrl
+$(EBIN)/PKCS-FRAME.beam: $(ESRC)/PKCS-FRAME.erl $(INCLUDE)/PKCS-FRAME.hrl
PKCS-FRAME.erl PKCS-FRAME.hrl: PKCS-FRAME.asn1db
PKCS-FRAME.asn1db: PKCS5v2-0.asn1\
PKCS-8.asn1\
diff --git a/lib/public_key/doc/src/notes.xml b/lib/public_key/doc/src/notes.xml
index b31f51491b..2b711b4e40 100644
--- a/lib/public_key/doc/src/notes.xml
+++ b/lib/public_key/doc/src/notes.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2021</year>
+ <year>2022</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -426,7 +426,7 @@
<list>
<item>
<p>
- Support Pasword based encryption with AES</p>
+ Support Password based encryption with AES</p>
<p>
Own Id: OTP-15870 Aux Id: ERL-952 </p>
</item>
@@ -597,7 +597,7 @@
</item>
<item>
<p>
- Compleate PKCS-8 encoding support and enhance the
+ Complete PKCS-8 encoding support and enhance the
decoding of 'PrivateKeyInfo' to conform to the rest of
Erlang public_key API.</p>
<p>
@@ -694,7 +694,7 @@
saltlength setting<br/> * X9.31 RSA padding.<br/> * sha,
sha224, sha256, sha384, and sha512 for dss signatures as
mentioned in NIST SP 800-57 Part 1.<br/> * ripemd160 to
- be used for rsa signatures.</p>
+ be used for RSA signatures.</p>
<p>
This is a manual merge of half of the pull request 838 by
potatosalad from Sept 2015.</p>
@@ -705,7 +705,7 @@
<p>
Add API function pkix_test_data/1 for facilitating
automated testing. This is useful for applications that
- preform X509-certifcate path validation of so called
+ perform X509-certifcate path validation of so called
certificate chains, such as TLS.</p>
<p>
Own Id: OTP-14181</p>
@@ -889,7 +889,7 @@
</item>
<item>
<p>
- Add different upper bounds for diffrent string types as
+ Add different upper bounds for different string types as
suggested by comment in PKIX1Explicit88.</p>
<p>
Own Id: OTP-13132</p>
@@ -1093,7 +1093,7 @@
<item>
<p>
Add support for ISO oids 1.3.14.3.2.29 and 1.3.14.3.2.27
- that are somtimes used instead of the PKCS defined oids
+ that are sometimes used instead of the PKCS defined oids
1.2.840.113549.1.1.5 and 1.2.840.10040.4.3. Add function
pkix_sign_types:/1 that translates oids to to algorithm
atoms ex:</p>
@@ -1186,7 +1186,7 @@
<item>
<p>
ssh_decode now handles comments, at the end of the line,
- containing withe spaces correctly</p>
+ containing with spaces correctly</p>
<p>
Own Id: OTP-9361</p>
</item>
@@ -1204,7 +1204,7 @@
<list>
<item>
<p>
- public_key now supports PKCS-10 and includes exprimental
+ public_key now supports PKCS-10 and includes experimental
support for PKCS-7</p>
<p>
Own Id: OTP-10509 Aux Id: kunagi-291 [202] </p>
diff --git a/lib/public_key/doc/src/public_key.xml b/lib/public_key/doc/src/public_key.xml
index 76179ceb6f..29efda524f 100644
--- a/lib/public_key/doc/src/public_key.xml
+++ b/lib/public_key/doc/src/public_key.xml
@@ -122,10 +122,7 @@
<datatype>
<name name="ed_public_key"/>
- <name name="ed_legacy_pubkey"/>
<desc>
- <warning><p>The tagged ed_pub format will not be returned from any public_key
- functions but can be used as input, should be considered deprecated.</p></warning>
</desc>
</datatype>
@@ -145,10 +142,7 @@
<datatype>
<name name="ed_private_key"/>
- <name name="ed_legacy_privkey"/>
<desc>
- <warning><p>The tagged ed_pri format will not be returned from any public_key
- functions but can be used as input, should be considered deprecated.</p></warning>
</desc>
</datatype>
@@ -271,14 +265,6 @@
</desc>
</datatype>
- <datatype>
- <name name="ssh_file"/>
- <desc>
- </desc>
- </datatype>
-
-
-
</datatypes>
@@ -801,7 +787,7 @@ fun(#'DistributionPoint'{}, #'CertificateList'{},
critical = false}]
</code>
<p>Hostname is the result of calling net_adm:localhost() in the Erlang node
- where this funcion is called.
+ where this function is called.
</p></item>
</taglist>
@@ -953,106 +939,6 @@ end
</func>
<func>
- <name name="ssh_decode" arity="2" since="OTP R14B03"/>
- <fsummary>Decodes an SSH file-binary.</fsummary>
- <desc>
- <note>
- <p>This function is deprecated and should not be used in new programs. Use
- <seemfa marker="ssh:ssh_file#decode/2">ssh_file:decode/2</seemfa>
- instead.
- </p>
- </note>
- <p>Decodes an SSH file-binary. In the case of <c>known_hosts</c> or
- <c>auth_keys</c>, the binary can include one or more lines of the
- file. Returns a list of public keys and their attributes, possible
- attribute values depends on the file type represented by the
- binary.
- </p>
- <p>If the <c>Type</c> is <c>ssh2_pubkey</c>, the result will be
- <c>Decoded_ssh2_pubkey</c>. Otherwise it will be <c>Decoded_OtherType</c>.
- </p>
- <taglist>
- <tag>RFC4716 attributes - see RFC 4716.</tag>
- <item><p>{headers, [{string(), utf8_string()}]}</p></item>
- <tag>auth_key attributes - see manual page for sshd.</tag>
- <item>{comment, string()}</item>
- <item>{options, [string()]}</item>
- <item><p>{bits, integer()} - In SSH version 1 files.</p></item>
- <tag>known_host attributes - see manual page for sshd.</tag>
- <item>{hostnames, [string()]}</item>
- <item>{comment, string()}</item>
- <item><p>{bits, integer()} - In SSH version 1 files.</p></item>
- </taglist>
- <p>Example: <c>{ok, SshBin} = file:read_file("known_hosts")</c>.
- </p>
- <p>If <c>Type</c> is <c>public_key</c> the binary can be either
- an RFC4716 public key or an OpenSSH public key.</p>
- </desc>
- </func>
-
- <func>
- <name name="ssh_encode" arity="2" since="OTP R14B03"/>
- <fsummary>Encodes a list of SSH file entries to a binary.</fsummary>
- <desc>
- <note>
- <p>This function is deprecated and should not be used in new programs. Use
- <seemfa marker="ssh:ssh_file#encode/2">ssh_file:encode/2</seemfa>
- instead.
- </p>
- </note>
- <p>Encodes a list of SSH file entries (public keys and attributes) to a binary. Possible
- attributes depend on the file type, see
- <seemfa marker="#ssh_decode/2"> ssh_decode/2 </seemfa>.
- </p>
- <p>If the <c>Type</c> is <c>ssh2_pubkey</c>, the <c>InData</c> shall be
- <c>InData_ssh2_pubkey</c>. Otherwise it shall be <c>OtherInData</c>.
- </p>
- </desc>
- </func>
-
- <func>
- <name since="OTP 19.2">ssh_hostkey_fingerprint(HostKey) -> string()</name>
- <name since="OTP 19.2">ssh_hostkey_fingerprint(DigestType, HostKey) -> string()</name>
- <name since="OTP 19.2">ssh_hostkey_fingerprint([DigestType], HostKey) -> [string()]</name>
- <fsummary>Calculates a ssh fingerprint for a hostkey.</fsummary>
- <type>
- <v>HostKey = <seetype marker="#public_key">public_key()</seetype></v>
- <v>DigestType = <seetype marker="#digest_type">digest_type()</seetype></v>
- </type>
- <desc>
- <p>Calculates a ssh fingerprint from a public host key as openssh does.</p>
- <note>
- <p>This function is deprecated and should not be used in new programs. Use
- <seemfa marker="ssh:ssh#hostkey_fingerprint/1">ssh:hostkey_fingerprint/1</seemfa> or
- <seemfa marker="ssh:ssh#hostkey_fingerprint/2">ssh:hostkey_fingerprint/2</seemfa>
- instead.
- </p>
- </note>
- <p>The algorithm in <c>ssh_hostkey_fingerprint/1</c> is md5 to be compatible with older
- ssh-keygen commands. The string from the second variant is prepended by the algorithm name
- in uppercase as in newer ssh-keygen commands.</p>
- <p>Examples:</p>
- <code>
- 2> public_key:ssh_hostkey_fingerprint(Key).
- "f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
-
- 3> public_key:ssh_hostkey_fingerprint(md5,Key).
- "MD5:f5:64:a6:c1:5a:cb:9f:0a:10:46:a2:5c:3e:2f:57:84"
-
- 4> public_key:ssh_hostkey_fingerprint(sha,Key).
- "SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY"
-
- 5> public_key:ssh_hostkey_fingerprint(sha256,Key).
- "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"
-
- 6> public_key:ssh_hostkey_fingerprint([sha,sha256],Key).
- ["SHA1:bSLY/C4QXLDL/Iwmhyg0PGW9UbY",
- "SHA256:aZGXhabfbf4oxglxltItWeHU7ub3Dc31NcNw2cMJePQ"]
- </code>
- </desc>
- </func>
-
- <func>
<name name="verify" arity="4" since="OTP R14B"/>
<name name="verify" arity="5" since="OTP 20.1"/>
<fsummary>Verifies a digital signature.</fsummary>
diff --git a/lib/public_key/doc/src/using_public_key.xml b/lib/public_key/doc/src/using_public_key.xml
index b783785347..2a8203121d 100644
--- a/lib/public_key/doc/src/using_public_key.xml
+++ b/lib/public_key/doc/src/using_public_key.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2011</year><year>2021</year>
+ <year>2011</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -87,7 +87,7 @@
<p>An RSA private key encrypted with a password can look as follows:</p>
<code>1> {ok, PemBin} = file:read_file("rsa.pem").
-{ok,&lt;&lt;"Bag Attribut"...&gt;&gt;}</code>
+{ok,&lt;&lt;"Bag Attribute"...&gt;&gt;}</code>
<p>The following PEM file has only one entry, a private RSA key:</p>
<code>2>[RSAEntry] = public_key:pem_decode(PemBin).
@@ -382,7 +382,7 @@ Msg = public_key:decrypt_public(RsaEncrypted, PublicKey),</code>
Msg = public_key:decrypt_private(RsaEncrypted, PrivateKey),</code>
<note><p>You normally do only one of the encrypt or decrypt operations,
- and the peer does the other. This normaly used in legacy applications
+ and the peer does the other. This normally used in legacy applications
as a primitive digital signature.
</p></note>
@@ -426,12 +426,12 @@ true = public_key:verify(Digest, none, Signature, PublicKey),</code>
checks that the certificate is not revoked, not forged or not out-of-date.
</p>
<p>There are however attacks that are not detected by those checks. Suppose a bad guy has
- succeded with a DNS infection. Then the client could belive it is connecting to one host but
+ succeeded with a DNS infection. Then the client could believe it is connecting to one host but
ends up at another but evil one. Though it is evil, it could have a perfectly legal
certificate! The certificate has a valid signature, it is not revoked, the certificate chain
is not faked and has a trusted root and so on.
</p>
- <p>To detect that the server is not the intended one, the client must additionaly perform
+ <p>To detect that the server is not the intended one, the client must additionally perform
a <i>hostname verification</i>. This procedure is described in
<url href="https://tools.ietf.org/html/rfc6125">RFC 6125</url>. The idea is that the certificate
lists the hostnames it could be fetched from. This is checked by the certificate issuer when
@@ -447,13 +447,13 @@ true = public_key:verify(Digest, none, Signature, PublicKey),</code>
It is possible for a client to hook in modified rules using the options list.
</p>
<p>Some terminology is needed: the certificate presents hostname(s) on which it is valid.
- Those are called <i>Presented IDs</i>. The hostname(s) the client belives it connects to
+ Those are called <i>Presented IDs</i>. The hostname(s) the client believes it connects to
are called <i>Reference IDs</i>. The matching rules aims to verify that there is at least
one of the Reference IDs that matches one of the Presented IDs. If not, the verification fails.
</p>
<p>The IDs contains normal fully qualified domain names like e.g <c>foo.example.com</c>,
but IP addresses are not recommended. The rfc describes why this is not recommended as well
- as security considerations about how to aquire the Reference IDs.
+ as security considerations about how to acquire the Reference IDs.
</p>
<p>Internationalized domain names are not supported.
</p>
@@ -525,7 +525,7 @@ true = public_key:verify(Digest, none, Signature, PublicKey),</code>
field, the <c>Subject</c> field MUST NOT be used for host name checking, even if it contains
valid CN names.
Therefore only <c>kb.example.org</c> and <c>https://www.example.org</c> matches. The match fails
- both for <c>example.com</c> and <c>foo.example.com</c> becuase they are in the <c>Subject</c>
+ both for <c>example.com</c> and <c>foo.example.com</c> because they are in the <c>Subject</c>
field which is not checked because the <c>Subject Alternate Name</c> field is present.
</p>
</section>
@@ -599,7 +599,7 @@ true = public_key:verify(Digest, none, Signature, PublicKey),</code>
<marker id="redefining_match_op"></marker>
<title>Re-defining the match operation</title>
<p>The default matching handles dns_id and uri_id. In an uri_id the value is tested for
- equality with a value from the <c>Subject Alternate Name</c>. If som other kind of matching
+ equality with a value from the <c>Subject Alternate Name</c>. If some other kind of matching
is needed, use the <c>match_fun</c> option.
</p>
<p>The <c>match_fun</c> takes two arguments and returns either <c>true</c>,
@@ -626,8 +626,8 @@ true = public_key:verify(Digest, none, Signature, PublicKey),</code>
field and from the <c>Subject Alternate Name</c> field.
</p>
<p>The default matching transformes the ascii values in strings to lowercase before comparing.
- The <c>match_fun</c> is however called without any transfomation applied to the strings. The
- reason is to enable the user to do unforseen handling of the strings where the original format
+ The <c>match_fun</c> is however called without any transformation applied to the strings. The
+ reason is to enable the user to do unforeseen handling of the strings where the original format
is needed.
</p>
</section>
@@ -672,99 +672,4 @@ true = public_key:verify(Digest, none, Signature, PublicKey),</code>
</section>
</section>
- <section>
- <title>SSH Files</title>
-
- <p>SSH typically uses PEM files for private keys but has its
- own file format for storing public keys. The <c>public_key</c>
- application can be used to parse the content of SSH public-key files.</p>
-
- <section>
- <title>RFC 4716 SSH Public-Key Files</title>
-
- <p>RFC 4716 SSH files looks confusingly like PEM files,
- but there are some differences:</p>
- <code>1> {ok, SshBin} = file:read_file("ssh2_rsa_pub").
-{ok, &lt;&lt;"---- BEGIN SSH2 PUBLIC KEY ----\nAAAA"...&gt;&gt;}</code>
-
- <p>This is equivalent to calling <c>public_key:ssh_decode(SshBin, rfc4716_public_key)</c>:
- </p>
- <code>2> public_key:ssh_decode(SshBin, public_key).
-[{#'RSAPublicKey'{modulus = 794430685...91663,
- publicExponent = 35}, []}]</code>
-
- </section>
-
- <section>
- <title>OpenSSH Public-Key Format</title>
- <p>OpenSSH public-key format looks as follows:</p>
- <code>1> {ok, SshBin} = file:read_file("openssh_dsa_pub").
-{ok,&lt;&lt;"ssh-dss AAAAB3Nza"...&gt;&gt;}</code>
-
- <p>This is equivalent to calling <c>public_key:ssh_decode(SshBin, openssh_public_key)</c>:
- </p>
- <code>2> public_key:ssh_decode(SshBin, public_key).
-[{{15642692...694280725,
- #'Dss-Parms'{p = 17291273936...696123221,
- q = 1255626590179665817295475654204371833735706001853,
- g = 10454211196...480338645}},
- [{comment,"dhopson@VMUbuntu-DSH"}]}]</code>
- </section>
-
- <section>
- <title>Known Hosts - OpenSSH Format</title>
- <p>Known hosts - OpenSSH format looks as follows:</p>
- <code>1> {ok, SshBin} = file:read_file("known_hosts").
-{ok,&lt;&lt;"hostname.domain.com,192.168.0.1 ssh-rsa AAAAB...&gt;&gt;}</code>
-
- <p>Returns a list of public keys and their related attributes.
- Each pair of key and attribute corresponds to one entry in
- the known hosts file:</p>
-
- <code>2> public_key:ssh_decode(SshBin, known_hosts).
-[{#'RSAPublicKey'{modulus = 1498979460408...72721699,
- publicExponent = 35},
- [{hostnames,["hostname.domain.com","192.168.0.1"]}]},
- {#'RSAPublicKey'{modulus = 14989794604088...2721699,
- publicExponent = 35},
- [{comment,"foo@bar.com"},
- {hostnames,["|1|BWO5qDxk/cFH0wa05JLdHn+j6xQ=|rXQvIxh5cDD3C43k5DPDamawVNA="]}]}]</code>
- </section>
-
- <section>
- <title>Authorized Keys - OpenSSH Format</title>
- <p>Authorized keys - OpenSSH format looks as follows:</p>
-
- <code>1> {ok, SshBin} = file:read_file("auth_keys").
-{ok, &lt;&lt;"command=\"dump /home\",no-pty,no-port-forwarding ssh-rsa AAA...&gt;&gt;}</code>
-
- <p>Returns a list of public keys and their related attributes.
- Each pair of key and attribute corresponds to one entry in
- the authorized key file:</p>
-
- <code>2> public_key:ssh_decode(SshBin, auth_keys).
-[{#'RSAPublicKey'{modulus = 794430685...691663,
- publicExponent = 35},
- [{comment,"dhopson@VMUbuntu-DSH"},
- {options,["command=\"dump/home\"","no-pty",
- "no-port-forwarding"]}]},
- {{1564269258491...607694280725,
- #'Dss-Parms'{p = 17291273936185...763696123221,
- q = 1255626590179665817295475654204371833735706001853,
- g = 10454211195705...60511039590076780999046480338645}},
- [{comment,"dhopson@VMUbuntu-DSH"}]}]</code>
- </section>
-
- <section>
- <title>Creating an SSH File from Public-Key Data</title>
-
- <p>If you got a public key <c>PubKey</c> and a related list of
- attributes <c>Attributes</c> as returned
- by <c>ssh_decode/2</c>, you can create a new SSH file, for example:</p>
- <code>N> SshBin = public_key:ssh_encode([{PubKey, Attributes}], openssh_public_key),
-&lt;&lt;"ssh-rsa "...&gt;&gt;
-N+1> file:write_file("id_rsa.pub", SshBin).
-ok</code>
- </section>
- </section>
</chapter>
diff --git a/lib/public_key/src/Makefile b/lib/public_key/src/Makefile
index e27f02eea9..01f7b9ca5f 100644
--- a/lib/public_key/src/Makefile
+++ b/lib/public_key/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2021. All Rights Reserved.
+# Copyright Ericsson AB 2008-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -85,7 +85,7 @@ ERL_COMPILE_FLAGS += $(PUB_KEY_ERL_FLAGS) \
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(HRL_FILES)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(HRL_FILES)
$(EBIN)/pubkey_ssh.$(EMULATOR): pubkey_moduli.hrl
diff --git a/lib/public_key/src/pubkey_cert.erl b/lib/public_key/src/pubkey_cert.erl
index abe69d9ae2..630981c841 100644
--- a/lib/public_key/src/pubkey_cert.erl
+++ b/lib/public_key/src/pubkey_cert.erl
@@ -72,7 +72,7 @@ verify_data(DerCert) ->
-spec init_validation_state(#'OTPCertificate'{}, integer(), list()) ->
#path_validation_state{}.
%%
-%% Description: Creates inital version of path_validation_state for
+%% Description: Creates initial version of path_validation_state for
%% basic path validation of x509 certificates.
%%--------------------------------------------------------------------
init_validation_state(#'OTPCertificate'{} = OtpCert, DefaultPathLen,
@@ -247,7 +247,7 @@ validate_extensions(OtpCert, ValidationState, UserState, VerifyFun) ->
-spec normalize_general_name({rdnSequence, term()}| binary()) -> {rdnSequence, term()}.
%%
%% Description: Normalizes a general name so that it can be easily
-%% compared to another genral name.
+%% compared to another general name.
%%--------------------------------------------------------------------
normalize_general_name({rdnSequence, Issuer}) ->
NormIssuer = do_normalize_general_name(Issuer),
@@ -1301,7 +1301,7 @@ cert_chain(Role, IssuerCert, IssuerKey, [PeerOpts], _, Acc) ->
cert_chain(Role, IssuerCert, IssuerKey, [CAOpts | Rest], N, Acc) ->
Key = gen_key(proplists:get_value(key, CAOpts, default_key_gen())),
Cert = cert(Role, public_key:pkix_decode_cert(IssuerCert, otp), IssuerKey, Key, "webadmin",
- " Intermidiate CA " ++ integer_to_list(N), CAOpts, ca),
+ " Intermediate CA " ++ integer_to_list(N), CAOpts, ca),
cert_chain(Role, Cert, Key, Rest, N+1, [{IssuerCert, encode_key(IssuerKey)} | Acc]).
cert(Role, #'OTPCertificate'{tbsCertificate = #'OTPTBSCertificate'{subject = Issuer}},
diff --git a/lib/public_key/src/pubkey_cert_records.erl b/lib/public_key/src/pubkey_cert_records.erl
index 592bd4c938..d837d8cf7b 100644
--- a/lib/public_key/src/pubkey_cert_records.erl
+++ b/lib/public_key/src/pubkey_cert_records.erl
@@ -44,7 +44,7 @@ decode_cert(DerCert) ->
%%--------------------------------------------------------------------
-spec transform(term(), encode | decode) ->term().
%%
-%% Description: Transforms between encoded and decode otp formated
+%% Description: Transforms between encoded and decode otp formatted
%% certificate parts.
%%--------------------------------------------------------------------
diff --git a/lib/public_key/src/pubkey_crl.erl b/lib/public_key/src/pubkey_crl.erl
index 7115424863..5bbc34ba53 100644
--- a/lib/public_key/src/pubkey_crl.erl
+++ b/lib/public_key/src/pubkey_crl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -298,7 +298,7 @@ is_all_reasons(Mask, AllReasonsFun) ->
%% As the "uspecified" reason should not
%% be explicitly used according to RFC 3280
%% and the conformance tests have test cases
- %% that should succed, and that does not specify
+ %% that should succeed, and that does not specify
%% "unspecified", we tolorate that it is not included.
sets:is_subset(sets:del_element(unspecified, AllReasons), Mask)
end.
diff --git a/lib/public_key/src/pubkey_pbe.erl b/lib/public_key/src/pubkey_pbe.erl
index dc327567e4..27c21129b4 100644
--- a/lib/public_key/src/pubkey_pbe.erl
+++ b/lib/public_key/src/pubkey_pbe.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2011-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2011-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@
%%====================================================================
%%--------------------------------------------------------------------
--spec encode(binary(), string(), string(), term()) -> binary().
+-spec encode(binary(), iodata(), string(), term()) -> binary().
%%
%% Description: Performs password based encoding
%%--------------------------------------------------------------------
@@ -57,7 +57,7 @@ encode(Data, Password, "AES-256-CBC"= Cipher, KeyDevParams) ->
crypto:crypto_one_time(aes_256_cbc, Key, IV, pbe_pad(Data, block_size(aes_256_cbc)), true).
%%--------------------------------------------------------------------
--spec decode(binary(), string(), string(), term()) -> binary().
+-spec decode(binary(), iodata(), string(), term()) -> binary().
%%
%% Description: Performs password based decoding
%%--------------------------------------------------------------------
diff --git a/lib/public_key/src/pubkey_pem.erl b/lib/public_key/src/pubkey_pem.erl
index 4aa965e14f..e28fd4019c 100644
--- a/lib/public_key/src/pubkey_pem.erl
+++ b/lib/public_key/src/pubkey_pem.erl
@@ -72,7 +72,7 @@ encode(PemEntries) ->
-spec decipher({public_key:pki_asn1_type(), DerEncrypted::binary(),
{Cipher :: string(), Salt :: iodata() | #'PBES2-params'{}
| {#'PBEParameter'{}, atom()}}},
- string()) -> Der::binary().
+ iodata()) -> Der::binary().
%%
%% Description: Deciphers a decrypted pem entry.
%%--------------------------------------------------------------------
@@ -82,7 +82,7 @@ decipher({_, DecryptDer, {Cipher, KeyDevParams}}, Password) ->
%%--------------------------------------------------------------------
-spec cipher(Der::binary(), {Cipher :: string(), Salt :: iodata() | #'PBES2-params'{}
| {#'PBEParameter'{}, atom()}},
- string()) -> binary().
+ iodata()) -> binary().
%%
%% Description: Ciphers a PEM entry
%%--------------------------------------------------------------------
diff --git a/lib/public_key/src/pubkey_ssh.erl b/lib/public_key/src/pubkey_ssh.erl
index 9a9505f558..36c3ebf558 100644
--- a/lib/public_key/src/pubkey_ssh.erl
+++ b/lib/public_key/src/pubkey_ssh.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2011-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2011-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -19,71 +19,17 @@
%%
-module(pubkey_ssh).
--include("public_key.hrl").
-include("pubkey_moduli.hrl").
-
--export([decode/2, encode/2,
- dh_gex_group/4,
- dh_gex_group_sizes/0,
-pad/2, new_openssh_encode/1, new_openssh_decode/1 % For test and experiments
+-export([dh_gex_group/4,
+ dh_gex_group_sizes/0
]).
--define(UINT32(X), X:32/unsigned-big-integer).
--define(STRING(X), ?UINT32((byte_size(X))), (X)/binary).
-
--define(DEC_BIN(X,Len), ?UINT32(Len), X:Len/binary ).
--define(DEC_MPINT(I,Len), ?DEC_INT(I,Len) ).
--define(DEC_INT(I,Len), ?UINT32(Len), I:Len/big-signed-integer-unit:8 ).
-
--define(Empint(X), (mpint(X))/binary ).
--define(Estring(X), (string(X))/binary ).
-
--define(b64enc(X), base64:encode(iolist_to_binary(X)) ).
--define(b64mime_dec(X), base64:mime_decode(iolist_to_binary(X)) ).
-
-%% Max encoded line length is 72, but conformance examples use 68
-%% Comment from rfc 4716: "The following are some examples of public
-%% key files that are compliant (note that the examples all wrap
-%% before 72 bytes to meet IETF document requirements; however, they
-%% are still compliant.)" So we choose to use 68 also.
--define(ENCODED_LINE_LENGTH, 68).
-
-
%%====================================================================
%% Internal application API
%%====================================================================
%%--------------------------------------------------------------------
-%% Description: Decodes a ssh file-binary.
-%%--------------------------------------------------------------------
-decode(Bin, public_key)->
- PKtype =
- case binary:match(Bin, begin_marker()) of
- nomatch -> openssh_public_key;
- _ -> rfc4716_public_key
- end,
- decode(Bin, PKtype);
-decode(Bin, rfc4716_public_key) ->
- rfc4716_decode(Bin);
-decode(Bin, ssh2_pubkey) ->
- ssh2_pubkey_decode(Bin);
-decode(Bin, new_openssh) ->
- new_openssh_decode(Bin);
-decode(Bin, Type) ->
- openssh_decode(Bin, Type).
-
-%%--------------------------------------------------------------------
-%% Description: Encodes a list of ssh file entries.
-%%--------------------------------------------------------------------
-encode(Bin, ssh2_pubkey) ->
- ssh2_pubkey_encode(Bin);
-encode(Entries, Type) ->
- iolist_to_binary(lists:map(fun({Key, Attributes}) ->
- do_encode(Type, Key, Attributes)
- end, Entries)).
-
-%%--------------------------------------------------------------------
%% Description: Returns Generator and Modulus given MinSize, WantedSize
%% and MaxSize
%%--------------------------------------------------------------------
@@ -102,6 +48,11 @@ dh_gex_group(Min, N, Max, Groups) ->
dh_gex_group_sizes()->
[KeyLen || {KeyLen,_} <- ?dh_default_groups].
+
+%%--------------------------------------------------------------------
+%%% Internal functions
+%%--------------------------------------------------------------------
+
%% Select the one with K closest to N but within the interval [Min,Max]
select_by_keylen(Min, N, Max, [{K,_Gs}|Groups]) when K < Min ->
@@ -123,533 +74,3 @@ select_by_keylen(Min, N, Max, [{K,Gs}|Groups], {Kprev,GsPrev}) ->
select_by_keylen(_Min, _N, _Max, [],GPprev) ->
%% is between Min and Max
GPprev.
-
-
-%%--------------------------------------------------------------------
-%%% Internal functions
-%%--------------------------------------------------------------------
-begin_marker() ->
- <<"---- BEGIN SSH2 PUBLIC KEY ----">>.
-end_marker() ->
- <<"---- END SSH2 PUBLIC KEY ----">>.
-
-rfc4716_decode(Bin) ->
- Lines = binary:split(Bin, <<"\n">>, [global]),
- do_rfc4716_decode(Lines, []).
-
-do_rfc4716_decode([<<"---- BEGIN SSH2 PUBLIC KEY ----", _/binary>> | Lines], Acc) ->
- do_rfc4716_decode(Lines, Acc);
-%% Ignore empty lines before or after begin/end - markers.
-do_rfc4716_decode([<<>> | Lines], Acc) ->
- do_rfc4716_decode(Lines, Acc);
-do_rfc4716_decode([], Acc) ->
- lists:reverse(Acc);
-do_rfc4716_decode(Lines, Acc) ->
- {Headers, PubKey, Rest} = rfc4716_decode_lines(Lines, []),
- case Headers of
- [_|_] ->
- do_rfc4716_decode(Rest, [{PubKey, [{headers, Headers}]} | Acc]);
- _ ->
- do_rfc4716_decode(Rest, [{PubKey, []} | Acc])
- end.
-
-rfc4716_decode_lines([Line | Lines], Acc) ->
- case binary:last(Line) of
- $\\ ->
- NewLine = binary:replace(Line,<<"\\">>, hd(Lines), []),
- rfc4716_decode_lines([NewLine | tl(Lines)], Acc);
- _ ->
- rfc4716_decode_line(Line, Lines, Acc)
- end.
-
-rfc4716_decode_line(Line, Lines, Acc) ->
- case binary:split(Line, <<":">>) of
- [Tag, Value] ->
- rfc4716_decode_lines(Lines, [{string_decode(Tag), unicode_decode(Value)} | Acc]);
- _ ->
- {Body, Rest} = join_entry([Line | Lines], []),
- {lists:reverse(Acc), rfc4716_pubkey_decode(?b64mime_dec(Body)), Rest}
- end.
-
-join_entry([<<"---- END SSH2 PUBLIC KEY ----", _/binary>>| Lines], Entry) ->
- {lists:reverse(Entry), Lines};
-join_entry([Line | Lines], Entry) ->
- join_entry(Lines, [Line | Entry]).
-
-
-rfc4716_pubkey_decode(BinKey) -> ssh2_pubkey_decode(BinKey).
-
-
-%% From https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key
-new_openssh_decode(<<"openssh-key-v1",0,
- ?DEC_BIN(CipherName, _L1),
- ?DEC_BIN(KdfName, _L2),
- ?DEC_BIN(KdfOptions, _L3),
- ?UINT32(N), % number of keys
- ?DEC_BIN(PublicKey, _L4),
- ?DEC_BIN(Encrypted, _L5),
- _Rest/binary
- >>) ->
- %%io:format("CipherName = ~p~nKdfName = ~p~nKdfOptions = ~p~nPublicKey = ~p~nN = ~p~nEncrypted = ~p~nRest = ~p~n", [CipherName, KdfName, KdfOptions, PublicKey, N, Encrypted, _Rest]),
- new_openssh_decode(CipherName, KdfName, KdfOptions, PublicKey, N, Encrypted).
-
-new_openssh_decode(<<"none">>, <<"none">>, <<"">>, _PublicKey, 1,
- <<?UINT32(CheckInt),
- ?UINT32(CheckInt),
- ?DEC_BIN(Type, _Lt),
- ?DEC_BIN(PubKey, _Lpu),
- ?DEC_BIN(PrivPubKey, _Lpripub),
- ?DEC_BIN(_Comment, _C1),
- _Pad/binary>>) ->
- case {Type,PrivPubKey} of
- {<<"ssh-ed25519">>,
- <<PrivKey:32/binary, PubKey:32/binary>>} ->
- {ed_pri, ed25519, PubKey, PrivKey};
-
- {<<"ssh-ed448">>,
- <<PrivKey:57/binary, PubKey/binary>>} -> % "Intelligent" guess from
- % https://tools.ietf.org/html/draft-ietf-curdle-ssh-ed25519-ed448
- {ed_pri, ed448, PubKey, PrivKey}
- end.
-
-
-new_openssh_encode({ed_pri,_,PubKey,PrivKey}=Key) ->
- Type = key_type(Key),
- CheckInt = 17*256+17, %crypto:strong_rand_bytes(4),
- Comment = <<>>,
- PublicKey = <<?STRING(Type),?STRING(PubKey)>>,
- CipherName = <<"none">>,
- KdfName = <<"none">>,
- KdfOptions = <<>>,
- BlockSize = 8, % Crypto dependent
- NumKeys = 1,
- Encrypted0 = <<?UINT32(CheckInt),
- ?UINT32(CheckInt),
- ?STRING(Type),
- ?STRING(PubKey),
- ?STRING(<<PrivKey/binary,PubKey/binary>>),
- ?STRING(Comment)
- >>,
- Pad = pad(size(Encrypted0), BlockSize),
- Encrypted = <<Encrypted0/binary, Pad/binary>>,
- <<"openssh-key-v1",0,
- ?STRING(CipherName),
- ?STRING(KdfName),
- ?STRING(KdfOptions),
- ?UINT32(NumKeys),
- ?STRING(PublicKey),
- ?STRING(Encrypted)>>.
-
-pad(N, BlockSize) when N>BlockSize -> pad(N rem BlockSize, BlockSize);
-pad(N, BlockSize) -> list_to_binary(lists:seq(1,BlockSize-N)).
-
-
-openssh_decode(Bin, FileType) ->
- Lines = binary:split(Bin, <<"\n">>, [global]),
- do_openssh_decode(FileType, Lines, []).
-
-do_openssh_decode(_, [], Acc) ->
- lists:reverse(Acc);
-%% Ignore empty lines
-do_openssh_decode(FileType, [<<>> | Lines], Acc) ->
- do_openssh_decode(FileType, Lines, Acc);
-%% Ignore lines that start with #
-do_openssh_decode(FileType,[<<"#", _/binary>> | Lines], Acc) ->
- do_openssh_decode(FileType, Lines, Acc);
-do_openssh_decode(auth_keys = FileType, [Line | Lines], Acc) ->
- case decode_auth_keys(Line) of
- {ssh2, {options, [Options, KeyType, Base64Enc| Comment]}} ->
- do_openssh_decode(FileType, Lines,
- [{openssh_pubkey_decode(KeyType, Base64Enc),
- decode_comment(Comment) ++ [{options, comma_list_decode(Options)}]} | Acc]);
- {ssh2, {no_options, [KeyType, Base64Enc| Comment]}} ->
- do_openssh_decode(FileType, Lines,
- [{openssh_pubkey_decode(KeyType, Base64Enc),
- decode_comment(Comment)} | Acc]);
- {ssh1, {options, [Options, Bits, Exponent, Modulus | Comment]}} ->
- do_openssh_decode(FileType, Lines,
- [{ssh1_rsa_pubkey_decode(Modulus, Exponent),
- decode_comment(Comment) ++ [{options, comma_list_decode(Options)},
- {bits, integer_decode(Bits)}]
- } | Acc]);
- {ssh1, {no_options, [Bits, Exponent, Modulus | Comment]}} ->
- do_openssh_decode(FileType, Lines,
- [{ssh1_rsa_pubkey_decode(Modulus, Exponent),
- decode_comment(Comment) ++ [{bits, integer_decode(Bits)}]
- } | Acc])
- end;
-
-do_openssh_decode(known_hosts = FileType, [Line | Lines], Acc) ->
- case decode_known_hosts(Line) of
- {ssh2, [HostNames, KeyType, Base64Enc| Comment]} ->
- do_openssh_decode(FileType, Lines,
- [{openssh_pubkey_decode(KeyType, Base64Enc),
- decode_comment(Comment) ++
- [{hostnames, comma_list_decode(HostNames)}]}| Acc]);
- {ssh1, [HostNames, Bits, Exponent, Modulus | Comment]} ->
- do_openssh_decode(FileType, Lines,
- [{ssh1_rsa_pubkey_decode(Modulus, Exponent),
- decode_comment(Comment) ++
- [{hostnames, comma_list_decode(HostNames)},
- {bits, integer_decode(Bits)}]}
- | Acc])
- end;
-
-do_openssh_decode(openssh_public_key = FileType, [Line | Lines], Acc) ->
- [KeyType, Base64Enc | Comment0] = split_n(2, Line, []),
- KnownKeyType =
- case KeyType of
- <<"ssh-rsa">> -> true;
- <<"ssh-dss">> -> true;
- <<"ecdsa-sha2-",Curve/binary>> -> is_ssh_curvename(Curve);
- <<"ssh-ed25519">> -> true;
- <<"ssh-ed448">> -> true;
- _ -> false
- end,
-
- case Comment0 of
- [] when KnownKeyType==true ->
- do_openssh_decode(FileType, Lines,
- [{openssh_pubkey_decode(KeyType, Base64Enc),
- []} | Acc]);
- _ when KnownKeyType==true ->
- Comment = string:strip(string_decode(iolist_to_binary(Comment0)), right, $\n),
- do_openssh_decode(FileType, Lines,
- [{openssh_pubkey_decode(KeyType, Base64Enc),
- [{comment, Comment}]} | Acc]);
- _ when KnownKeyType==false ->
- do_openssh_decode(FileType, Lines, Acc)
- end.
-
-
-decode_comment([]) ->
- [];
-decode_comment(Comment) ->
- [{comment, string_decode(iolist_to_binary(Comment))}].
-
-
-openssh_pubkey_decode(Type, Base64Enc) ->
- try
- <<?DEC_BIN(Type,_TL), Bin/binary>> = ?b64mime_dec(Base64Enc),
- ssh2_pubkey_decode(Type, Bin)
- catch
- _:_ ->
- {Type, ?b64mime_dec(Base64Enc)}
- end.
-
-
-ssh1_rsa_pubkey_decode(MBin, EBin) ->
- #'RSAPublicKey'{modulus = integer_decode(MBin),
- publicExponent = integer_decode(EBin)}.
-
-integer_decode(BinStr) ->
- list_to_integer(binary_to_list(BinStr)).
-
-string_decode(BinStr) ->
- unicode_decode(BinStr).
-
-unicode_decode(BinStr) ->
- unicode:characters_to_list(BinStr).
-
-comma_list_decode(BinOpts) ->
- CommaList = binary:split(BinOpts, <<",">>, [global]),
- lists:map(fun(Item) ->
- binary_to_list(Item)
- end, CommaList).
-
-do_encode(rfc4716_public_key, Key, Attributes) ->
- rfc4716_encode(Key, proplists:get_value(headers, Attributes, []), []);
-
-do_encode(Type, Key, Attributes) ->
- openssh_encode(Type, Key, Attributes).
-
-rfc4716_encode(Key, [],[]) ->
- iolist_to_binary([begin_marker(),"\n",
- split_lines(?b64enc(ssh2_pubkey_encode(Key))),
- "\n", end_marker(), "\n"]);
-rfc4716_encode(Key, [], [_|_] = Acc) ->
- iolist_to_binary([begin_marker(), "\n",
- lists:reverse(Acc),
- split_lines(?b64enc(ssh2_pubkey_encode(Key))),
- "\n", end_marker(), "\n"]);
-rfc4716_encode(Key, [ Header | Headers], Acc) ->
- LinesStr = rfc4716_encode_header(Header),
- rfc4716_encode(Key, Headers, [LinesStr | Acc]).
-
-rfc4716_encode_header({Tag, Value}) ->
- TagLen = length(Tag),
- ValueLen = length(Value),
- case TagLen + 1 + ValueLen of
- N when N > ?ENCODED_LINE_LENGTH ->
- NumOfChars = ?ENCODED_LINE_LENGTH - (TagLen + 1),
- {First, Rest} = lists:split(NumOfChars, Value),
- [Tag,":" , First, [$\\], "\n", rfc4716_encode_value(Rest) , "\n"];
- _ ->
- [Tag, ":", Value, "\n"]
- end.
-
-rfc4716_encode_value(Value) ->
- case length(Value) of
- N when N > ?ENCODED_LINE_LENGTH ->
- {First, Rest} = lists:split(?ENCODED_LINE_LENGTH, Value),
- [First, [$\\], "\n", rfc4716_encode_value(Rest)];
- _ ->
- Value
- end.
-
-openssh_encode(openssh_public_key, Key, Attributes) ->
- Comment = proplists:get_value(comment, Attributes, ""),
- Enc = ?b64enc(ssh2_pubkey_encode(Key)),
- iolist_to_binary([key_type(Key), " ", Enc, " ", Comment, "\n"]);
-
-openssh_encode(auth_keys, Key, Attributes) ->
- Comment = proplists:get_value(comment, Attributes, ""),
- Options = proplists:get_value(options, Attributes, undefined),
- Bits = proplists:get_value(bits, Attributes, undefined),
- case Bits of
- undefined ->
- openssh_ssh2_auth_keys_encode(Options, Key, Comment);
- _ ->
- openssh_ssh1_auth_keys_encode(Options, Bits, Key, Comment)
- end;
-openssh_encode(known_hosts, Key, Attributes) ->
- Comment = proplists:get_value(comment, Attributes, ""),
- Hostnames = proplists:get_value(hostnames, Attributes),
- Bits = proplists:get_value(bits, Attributes, undefined),
- case Bits of
- undefined ->
- openssh_ssh2_know_hosts_encode(Hostnames, Key, Comment);
- _ ->
- openssh_ssh1_known_hosts_encode(Hostnames, Bits, Key, Comment)
- end.
-
-openssh_ssh2_auth_keys_encode(undefined, Key, Comment) ->
- iolist_to_binary([key_type(Key)," ", ?b64enc(ssh2_pubkey_encode(Key)), line_end(Comment)]);
-openssh_ssh2_auth_keys_encode(Options, Key, Comment) ->
- iolist_to_binary([comma_list_encode(Options, []), " ",
- key_type(Key)," ", ?b64enc(ssh2_pubkey_encode(Key)), line_end(Comment)]).
-
-openssh_ssh1_auth_keys_encode(undefined, Bits,
- #'RSAPublicKey'{modulus = N, publicExponent = E},
- Comment) ->
- iolist_to_binary([integer_to_list(Bits), " ", integer_to_list(E), " ", integer_to_list(N),
- line_end(Comment)]);
-openssh_ssh1_auth_keys_encode(Options, Bits,
- #'RSAPublicKey'{modulus = N, publicExponent = E},
- Comment) ->
- iolist_to_binary([comma_list_encode(Options, []), " ", integer_to_list(Bits),
- " ", integer_to_list(E), " ", integer_to_list(N), line_end(Comment)]).
-
-openssh_ssh2_know_hosts_encode(Hostnames, Key, Comment) ->
- iolist_to_binary([comma_list_encode(Hostnames, []), " ",
- key_type(Key)," ", ?b64enc(ssh2_pubkey_encode(Key)), line_end(Comment)]).
-
-openssh_ssh1_known_hosts_encode(Hostnames, Bits,
- #'RSAPublicKey'{modulus = N, publicExponent = E},
- Comment) ->
- iolist_to_binary([comma_list_encode(Hostnames, [])," ", integer_to_list(Bits)," ",
- integer_to_list(E)," ", integer_to_list(N), line_end(Comment)]).
-
-line_end("") ->
- "\n";
-line_end(Comment) ->
- [" ", Comment, "\n"].
-
-key_type(#'RSAPublicKey'{}) -> <<"ssh-rsa">>;
-key_type({_, #'Dss-Parms'{}}) -> <<"ssh-dss">>;
-key_type({ed_pub,ed25519,_}) -> <<"ssh-ed25519">>;
-key_type({ed_pub,ed448,_}) -> <<"ssh-ed448">>;
-key_type({ed_pri,ed25519,_,_}) -> <<"ssh-ed25519">>;
-key_type({ed_pri,ed448,_,_}) -> <<"ssh-ed448">>;
-key_type({#'ECPoint'{}, {namedCurve,Curve}}) -> <<"ecdsa-sha2-", (public_key:oid2ssh_curvename(Curve))/binary>>.
-
-comma_list_encode([Option], []) ->
- Option;
-comma_list_encode([Option], Acc) ->
- Acc ++ "," ++ Option;
-comma_list_encode([Option | Rest], []) ->
- comma_list_encode(Rest, Option);
-comma_list_encode([Option | Rest], Acc) ->
- comma_list_encode(Rest, Acc ++ "," ++ Option).
-
-
-ssh2_pubkey_encode(#'RSAPublicKey'{modulus = N, publicExponent = E}) ->
- <<?STRING(<<"ssh-rsa">>), ?Empint(E), ?Empint(N)>>;
-ssh2_pubkey_encode({Y, #'Dss-Parms'{p = P, q = Q, g = G}}) ->
- <<?STRING(<<"ssh-dss">>), ?Empint(P), ?Empint(Q), ?Empint(G), ?Empint(Y)>>;
-ssh2_pubkey_encode(Key={#'ECPoint'{point = Q}, {namedCurve,OID}}) ->
- Curve = public_key:oid2ssh_curvename(OID),
- <<?STRING(key_type(Key)), ?Estring(Curve), ?Estring(Q)>>;
-ssh2_pubkey_encode({ed_pub, ed25519, Key}) ->
- <<?STRING(<<"ssh-ed25519">>), ?Estring(Key)>>;
-ssh2_pubkey_encode({ed_pub, ed448, Key}) ->
- <<?STRING(<<"ssh-ed448">>), ?Estring(Key)>>.
-
-
-
-ssh2_pubkey_decode(<<?DEC_BIN(Type,_TL), Bin/binary>>) ->
- ssh2_pubkey_decode(Type, Bin).
-
-%% ssh2_pubkey_decode(<<"rsa-sha2-256">>, Bin) -> ssh2_pubkey_decode(<<"ssh-rsa">>, Bin);
-%% ssh2_pubkey_decode(<<"rsa-sha2-512">>, Bin) -> ssh2_pubkey_decode(<<"ssh-rsa">>, Bin);
-ssh2_pubkey_decode(<<"ssh-rsa">>,
- <<?DEC_INT(E, _EL),
- ?DEC_INT(N, _NL)>>) ->
- #'RSAPublicKey'{modulus = N,
- publicExponent = E};
-
-ssh2_pubkey_decode(<<"ssh-dss">>,
- <<?DEC_INT(P, _PL),
- ?DEC_INT(Q, _QL),
- ?DEC_INT(G, _GL),
- ?DEC_INT(Y, _YL)>>) ->
- {Y, #'Dss-Parms'{p = P,
- q = Q,
- g = G}};
-
-ssh2_pubkey_decode(<<"ecdsa-sha2-",Id/binary>>,
- <<?DEC_BIN(Id, _IL),
- ?DEC_BIN(Q, _QL)>>) ->
- {#'ECPoint'{point = Q}, {namedCurve,public_key:ssh_curvename2oid(Id)}};
-
-ssh2_pubkey_decode(<<"ssh-ed25519">>,
- <<?DEC_BIN(Key, _L)>>) ->
- {ed_pub, ed25519, Key};
-
-ssh2_pubkey_decode(<<"ssh-ed448">>,
- <<?DEC_BIN(Key, _L)>>) ->
- {ed_pub, ed448, Key}.
-
-
-
-
-is_key_field(<<"ssh-dss">>) -> true;
-is_key_field(<<"ssh-rsa">>) -> true;
-is_key_field(<<"ssh-ed25519">>) -> true;
-is_key_field(<<"ssh-ed448">>) -> true;
-is_key_field(<<"ecdsa-sha2-",Id/binary>>) -> is_ssh_curvename(Id);
-is_key_field(_) -> false.
-
-is_bits_field(Part) ->
- try list_to_integer(binary_to_list(Part)) of
- _ ->
- true
- catch _:_ ->
- false
- end.
-
-split_lines(<<Text:?ENCODED_LINE_LENGTH/binary>>) ->
- [Text];
-split_lines(<<Text:?ENCODED_LINE_LENGTH/binary, Rest/binary>>) ->
- [Text, $\n | split_lines(Rest)];
-split_lines(Bin) ->
- [Bin].
-
-decode_auth_keys(Line) ->
- [First, Rest] = binary:split(Line, <<" ">>, []),
- case is_key_field(First) of
- true ->
- {ssh2, decode_auth_keys_ssh2(First, Rest)};
- false ->
- case is_bits_field(First) of
- true ->
- {ssh1, decode_auth_keys_ssh1(First, Rest)};
- false ->
- decode_auth_keys(First, Rest)
- end
- end.
-
-decode_auth_keys(First, Line) ->
- [Second, Rest] = binary:split(Line, <<" ">>, []),
- case is_key_field(Second) of
- true ->
- {ssh2, decode_auth_keys_ssh2(First, Second, Rest)};
- false ->
- case is_bits_field(Second) of
- true ->
- {ssh1, decode_auth_keys_ssh1(First, Second, Rest)};
- false ->
- decode_auth_keys(<<First/binary, Second/binary>>, Rest)
- end
- end.
-
-decode_auth_keys_ssh2(KeyType, Rest) ->
- {no_options, [KeyType | split_n(1, Rest, [])]}.
-
-decode_auth_keys_ssh2(Options, Next, Rest) ->
- {options, [Options, Next | split_n(1, Rest, [])]}.
-
-decode_auth_keys_ssh1(Options, Next, Rest) ->
- {options, [Options, Next | split_n(2, Rest, [])]}.
-
-decode_auth_keys_ssh1(First, Rest) ->
- {no_options, [First | split_n(2, Rest, [])]}.
-
-decode_known_hosts(Line) ->
- [First, Rest] = binary:split(Line, <<" ">>, []),
- [Second, Rest1] = binary:split(Rest, <<" ">>, []),
-
- case is_bits_field(Second) of
- true ->
- {ssh1, decode_known_hosts_ssh1(First, Second, Rest1)};
- false ->
- {ssh2, decode_known_hosts_ssh2(First, Second, Rest1)}
- end.
-
-decode_known_hosts_ssh1(Hostnames, Bits, Rest) ->
- [Hostnames, Bits | split_n(2, Rest, [])].
-
-decode_known_hosts_ssh2(Hostnames, KeyType, Rest) ->
- [Hostnames, KeyType | split_n(1, Rest, [])].
-
-split_n(0, <<>>, Acc) ->
- lists:reverse(Acc);
-split_n(0, Bin, Acc) ->
- lists:reverse([Bin | Acc]);
-split_n(N, Bin, Acc) ->
- case binary:split(Bin, <<" ">>, []) of
- [First, Rest] ->
- split_n(N-1, Rest, [First | Acc]);
- [Last] ->
- split_n(0, <<>>, [Last | Acc])
- end.
-%% large integer in a binary with 32bit length
-%% MP representaion (SSH2)
-mpint(X) when X < 0 -> mpint_neg(X);
-mpint(X) -> mpint_pos(X).
-
-mpint_neg(X) ->
- Bin = int_to_bin_neg(X, []),
- <<?STRING(Bin)>>.
-
-mpint_pos(X) ->
- Bin = int_to_bin_pos(X, []),
- <<MSB,_/binary>> = Bin,
- if MSB band 16#80 == 16#80 ->
- B = << 0, Bin/binary>>,
- <<?STRING(B)>>;
- true ->
- <<?STRING(Bin)>>
- end.
-
-int_to_bin_pos(0,Ds=[_|_]) ->
- list_to_binary(Ds);
-int_to_bin_pos(X,Ds) ->
- int_to_bin_pos(X bsr 8, [(X band 255)|Ds]).
-
-int_to_bin_neg(-1, Ds=[MSB|_]) when MSB >= 16#80 ->
- list_to_binary(Ds);
-int_to_bin_neg(X,Ds) ->
- int_to_bin_neg(X bsr 8, [(X band 255)|Ds]).
-
-
-string(X) when is_binary(X) ->
- << ?STRING(X) >>;
-string(X) ->
- B = list_to_binary(X),
- << ?STRING(B) >>.
-
-is_ssh_curvename(Id) -> try public_key:ssh_curvename2oid(Id) of _ -> true
- catch _:_ -> false
- end.
-
diff --git a/lib/public_key/src/public_key.app.src b/lib/public_key/src/public_key.app.src
index 6be7cd3bc4..74d7a28354 100644
--- a/lib/public_key/src/public_key.app.src
+++ b/lib/public_key/src/public_key.app.src
@@ -15,7 +15,7 @@
{applications, [asn1, crypto, kernel, stdlib]},
{registered, []},
{env, []},
- {runtime_dependencies, ["stdlib-3.5","kernel-3.0","erts-6.0","crypto-3.8",
+ {runtime_dependencies, ["stdlib-3.5","kernel-3.0","erts-6.0","crypto-4.6",
"asn1-3.0"]}
]
}.
diff --git a/lib/public_key/src/public_key.erl b/lib/public_key/src/public_key.erl
index 276be6bb87..14b6043286 100644
--- a/lib/public_key/src/public_key.erl
+++ b/lib/public_key/src/public_key.erl
@@ -52,7 +52,6 @@
pkix_path_validation/3,
pkix_verify_hostname/2, pkix_verify_hostname/3,
pkix_verify_hostname_match_fun/1,
- ssh_curvename2oid/1, oid2ssh_curvename/1,
pkix_crls_validate/3,
pkix_dist_point/1,
pkix_dist_points/1,
@@ -68,23 +67,14 @@
]).
%%----------------
-%% To be moved to ssh and deprecated:
--export([ssh_decode/2, ssh_encode/2,
- ssh_hostkey_fingerprint/1, ssh_hostkey_fingerprint/2
- ]).
-
--deprecated([{ssh_decode,2, "use ssh_file:decode/2 instead"},
- {ssh_encode,2, "use ssh_file:encode/2 instead"},
- {ssh_hostkey_fingerprint,1, "use ssh:hostkey_fingerprint/1 instead"},
- {ssh_hostkey_fingerprint,2, "use ssh:hostkey_fingerprint/2 instead"}
- ]).
-
--compile([{nowarn_deprecated_function,
- [{public_key,ssh_decode,2},
- {public_key,ssh_encode,2}
- ]}
+%% Moved to ssh
+-removed([{ssh_decode,2, "use ssh_file:decode/2 instead"},
+ {ssh_encode,2, "use ssh_file:encode/2 instead"},
+ {ssh_hostkey_fingerprint,1, "use ssh:hostkey_fingerprint/1 instead"},
+ {ssh_hostkey_fingerprint,2, "use ssh:hostkey_fingerprint/2 instead"}
]).
+-export([ssh_curvename2oid/1, oid2ssh_curvename/1]).
%% When removing for OTP-25.0, remember to also remove
%% - most of pubkey_ssh.erl except
%% + dh_gex_group/4
@@ -100,7 +90,6 @@
pem_entry/0,
pki_asn1_type/0,
asn1_type/0,
- ssh_file/0,
der_encoded/0,
key_params/0,
digest_type/0,
@@ -131,9 +120,7 @@
-type ec_public_key() :: {#'ECPoint'{}, ecpk_parameters_api()}.
-type ec_private_key() :: #'ECPrivateKey'{}.
-type ed_public_key() :: {#'ECPoint'{}, ed_params()}.
--type ed_legacy_pubkey() :: {ed_pub, ed25519|ed448, Key::binary()}.
-type ed_private_key() :: #'ECPrivateKey'{parameters :: ed_params()}.
--type ed_legacy_privkey() :: {ed_pri, ed25519|ed448, Pub::binary(), Priv::binary()}.
-type ed_oid_name() :: 'id-Ed25519' | 'id-Ed448'.
-type ed_params() :: {namedCurve, ed_oid_name()}.
-type key_params() :: #'DHParameter'{} | {namedCurve, oid()} | #'ECParameters'{} |
@@ -158,8 +145,6 @@
-type salt() :: binary(). % crypto:strong_rand_bytes(8)
-type asn1_type() :: atom(). %% see "OTP-PUB-KEY.hrl
--type ssh_file() :: openssh_public_key | rfc4716_public_key | known_hosts |
- auth_keys.
-type digest_type() :: none % None is for backwards compatibility
| sha1 % Backwards compatibility
| crypto:rsa_digest_type()
@@ -235,15 +220,13 @@ pem_entry_decode({'SubjectPublicKeyInfo', Der, _}) ->
ECCParams = der_decode('EcpkParameters', Params),
{#'ECPoint'{point = Key0}, ECCParams}
end;
-pem_entry_decode({{no_asn1,new_openssh}, Special, not_encrypted}) ->
- ssh_decode(Special, new_openssh);
pem_entry_decode({Asn1Type, Der, not_encrypted}) when is_atom(Asn1Type),
is_binary(Der) ->
der_decode(Asn1Type, Der).
-spec pem_entry_decode(PemEntry, Password) -> term() when
PemEntry :: pem_entry(),
- Password :: string() | fun(() -> string()).
+ Password :: iodata() | fun(() -> iodata()).
pem_entry_decode(PemEntry, PasswordFun) when is_function(PasswordFun) ->
pem_entry_decode(PemEntry, PasswordFun());
pem_entry_decode({Asn1Type, Der, not_encrypted}, _) when is_atom(Asn1Type),
@@ -313,7 +296,7 @@ pem_entry_encode(Asn1Type, Entity) when is_atom(Asn1Type) ->
Entity :: term(),
InfoPwd :: {CipherInfo,Password},
CipherInfo :: cipher_info(),
- Password :: string() .
+ Password :: iodata() .
pem_entry_encode(Asn1Type, Entity, {{Cipher, #'PBES2-params'{}} = CipherInfo,
Password}) when is_atom(Asn1Type) andalso
is_list(Password) andalso
@@ -827,7 +810,7 @@ pkix_hash_type('id-md5') ->
-spec sign(Msg, DigestType, Key) ->
Signature when Msg :: binary() | {digest,binary()},
DigestType :: digest_type(),
- Key :: private_key() | ed_legacy_privkey(),
+ Key :: private_key(),
Signature :: binary() .
sign(DigestOrPlainText, DigestType, Key) ->
sign(DigestOrPlainText, DigestType, Key, []).
@@ -835,7 +818,7 @@ sign(DigestOrPlainText, DigestType, Key) ->
-spec sign(Msg, DigestType, Key, Options) ->
Signature when Msg :: binary() | {digest,binary()},
DigestType :: digest_type(),
- Key :: private_key() | ed_legacy_privkey(),
+ Key :: private_key(),
Options :: crypto:pk_sign_verify_opts(),
Signature :: binary() .
sign(Digest, none, Key = #'DSAPrivateKey'{}, Options) when is_binary(Digest) ->
@@ -846,7 +829,12 @@ sign(DigestOrPlainText, DigestType, Key, Options) ->
badarg ->
erlang:error(badarg, [DigestOrPlainText, DigestType, Key, Options]);
{Algorithm, CryptoKey} ->
- crypto:sign(Algorithm, DigestType, DigestOrPlainText, CryptoKey, Options)
+ try crypto:sign(Algorithm, DigestType, DigestOrPlainText, CryptoKey, Options)
+ catch %% Compatible with old error schema
+ error:{notsup,_,_} -> error(notsup);
+ error:{error,_,_} -> error(error);
+ error:{badarg,_,_} -> error(badarg)
+ end
end.
%%--------------------------------------------------------------------
@@ -856,7 +844,7 @@ sign(DigestOrPlainText, DigestType, Key, Options) ->
boolean() when Msg :: binary() | {digest, binary()},
DigestType :: digest_type(),
Signature :: binary(),
- Key :: public_key() | ed_legacy_pubkey().
+ Key :: public_key().
verify(DigestOrPlainText, DigestType, Signature, Key) ->
verify(DigestOrPlainText, DigestType, Signature, Key, []).
@@ -865,7 +853,7 @@ verify(DigestOrPlainText, DigestType, Signature, Key) ->
boolean() when Msg :: binary() | {digest, binary()},
DigestType :: digest_type(),
Signature :: binary(),
- Key :: public_key() | ed_legacy_pubkey(),
+ Key :: public_key(),
Options :: crypto:pk_sign_verify_opts().
verify(Digest, none, Signature, Key = {_, #'Dss-Parms'{}}, Options) when is_binary(Digest) ->
@@ -876,7 +864,12 @@ verify(DigestOrPlainText, DigestType, Signature, Key, Options) when is_binary(Si
badarg ->
erlang:error(badarg, [DigestOrPlainText, DigestType, Signature, Key, Options]);
{Algorithm, CryptoKey} ->
- crypto:verify(Algorithm, DigestType, DigestOrPlainText, Signature, CryptoKey, Options)
+ try crypto:verify(Algorithm, DigestType, DigestOrPlainText, Signature, CryptoKey, Options)
+ catch %% Compatible with old error schema
+ error:{notsup,_,_} -> error(notsup);
+ error:{error,_,_} -> error(error);
+ error:{badarg,_,_} -> error(badarg)
+ end
end;
verify(_,_,_,_,_) ->
%% If Signature is a bitstring and not a binary we know already at this
@@ -1301,58 +1294,6 @@ pkix_verify_hostname_match_fun(https) ->
end.
%%--------------------------------------------------------------------
--spec ssh_decode(SshBin, Type) ->
- Decoded
- when SshBin :: binary(),
- Type :: ssh2_pubkey | OtherType | InternalType,
- OtherType :: public_key | ssh_file(),
- InternalType :: new_openssh,
- Decoded :: Decoded_ssh2_pubkey
- | Decoded_OtherType,
- Decoded_ssh2_pubkey :: public_key() | ed_legacy_pubkey(),
- Decoded_OtherType :: [{public_key() | ed_legacy_pubkey(), Attributes}],
- Attributes :: [{atom(),term()}] .
-%%
-%% Description: Decodes a ssh file-binary. In the case of know_hosts
-%% or auth_keys the binary may include one or more lines of the
-%% file. Returns a list of public keys and their attributes, possible
-%% attribute values depends on the file type represented by the
-%% binary.
-%%--------------------------------------------------------------------
-ssh_decode(SshBin, Type) when is_binary(SshBin),
- Type == public_key;
- Type == rfc4716_public_key;
- Type == openssh_public_key;
- Type == auth_keys;
- Type == known_hosts;
- Type == ssh2_pubkey;
- Type == new_openssh ->
- pubkey_ssh:decode(SshBin, Type).
-
-%%--------------------------------------------------------------------
--spec ssh_encode(InData, Type) ->
- binary()
- when Type :: ssh2_pubkey | OtherType,
- OtherType :: public_key | ssh_file(),
- InData :: InData_ssh2_pubkey | OtherInData,
- InData_ssh2_pubkey :: public_key() | ed_legacy_pubkey(),
- OtherInData :: [{Key,Attributes}],
- Key :: public_key() | ed_legacy_pubkey(),
- Attributes :: [{atom(),term()}] .
-%%
-%% Description: Encodes a list of ssh file entries (public keys and
-%% attributes) to a binary. Possible attributes depends on the file
-%% type.
-%%--------------------------------------------------------------------
-ssh_encode(Entries, Type) when is_list(Entries),
- Type == rfc4716_public_key;
- Type == openssh_public_key;
- Type == auth_keys;
- Type == known_hosts;
- Type == ssh2_pubkey ->
- pubkey_ssh:encode(Entries, Type).
-
-%%--------------------------------------------------------------------
-spec ssh_curvename2oid(binary()) -> oid().
%% Description: Converts from the ssh name of elliptic curves to
@@ -1371,51 +1312,6 @@ oid2ssh_curvename(?'secp256r1') -> <<"nistp256">>;
oid2ssh_curvename(?'secp384r1') -> <<"nistp384">>;
oid2ssh_curvename(?'secp521r1') -> <<"nistp521">>.
-%%--------------------------------------------------------------------
--spec ssh_hostkey_fingerprint(public_key()) -> string().
-
-ssh_hostkey_fingerprint(Key) ->
- sshfp_string(md5, public_key:ssh_encode(Key,ssh2_pubkey) ).
-
-
--spec ssh_hostkey_fingerprint( digest_type(), public_key()) -> string()
- ; ([digest_type()], public_key()) -> [string()]
- .
-ssh_hostkey_fingerprint(HashAlgs, Key) when is_list(HashAlgs) ->
- EncKey = public_key:ssh_encode(Key, ssh2_pubkey),
- [sshfp_full_string(HashAlg,EncKey) || HashAlg <- HashAlgs];
-ssh_hostkey_fingerprint(HashAlg, Key) when is_atom(HashAlg) ->
- EncKey = public_key:ssh_encode(Key, ssh2_pubkey),
- sshfp_full_string(HashAlg, EncKey).
-
-
-sshfp_string(HashAlg, EncodedKey) ->
- %% Other HashAlgs than md5 will be printed with
- %% other formats than hextstr by
- %% ssh-keygen -E <alg> -lf <file>
- fp_fmt(sshfp_fmt(HashAlg), crypto:hash(HashAlg, EncodedKey)).
-
-sshfp_full_string(HashAlg, EncKey) ->
- lists:concat([sshfp_alg_name(HashAlg),
- [$: | sshfp_string(HashAlg, EncKey)]
- ]).
-
-sshfp_alg_name(sha) -> "SHA1";
-sshfp_alg_name(Alg) -> string:to_upper(atom_to_list(Alg)).
-
-sshfp_fmt(md5) -> hexstr;
-sshfp_fmt(_) -> b64.
-
-fp_fmt(hexstr, Bin) ->
- lists:flatten(string:join([io_lib:format("~2.16.0b",[C1]) || <<C1>> <= Bin], ":"));
-fp_fmt(b64, Bin) ->
- %% This function clause *seems* to be
- %% [C || C<-base64:encode_to_string(Bin), C =/= $=]
- %% but I am not sure. Must be checked.
- B64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
- BitsInLast = 8*size(Bin) rem 6,
- Padding = (6-BitsInLast) rem 6, % Want BitsInLast = [1:5] to map to padding [5:1] and 0 -> 0
- [lists:nth(C+1,B64Chars) || <<C:6>> <= <<Bin/binary,0:Padding>> ].
%%--------------------------------------------------------------------
-spec short_name_hash(Name) -> string() when Name :: issuer_name() .
@@ -2049,8 +1945,8 @@ match_wild(_, _) -> false.
%% Match the parts after the only wildcard by comparing them from the end
match_wild_suffixes(A, B) -> match_wild_sfx(lists:reverse(A), lists:reverse(B)).
-match_wild_sfx([$*|_], _) -> false; % Bad name (no wildcards alowed)
-match_wild_sfx(_, [$*|_]) -> false; % Bad pattern (no more wildcards alowed)
+match_wild_sfx([$*|_], _) -> false; % Bad name (no wildcards allowed)
+match_wild_sfx(_, [$*|_]) -> false; % Bad pattern (no more wildcards allowed)
match_wild_sfx([A|Ar], [A|Br]) -> match_wild_sfx(Ar, Br);
match_wild_sfx(Ar, []) -> not lists:member($*, Ar); % Chk for bad name (= wildcards)
match_wild_sfx(_, _) -> false.
diff --git a/lib/public_key/test/Makefile b/lib/public_key/test/Makefile
index 89e82a5f34..6c39c534d2 100644
--- a/lib/public_key/test/Makefile
+++ b/lib/public_key/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2020. All Rights Reserved.
+# Copyright Ericsson AB 2008-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -32,8 +32,7 @@ MODULES= \
erl_make_certs \
public_key_SUITE \
pbe_SUITE \
- pkits_SUITE \
- pubkey_ssh_SUITE
+ pkits_SUITE
ERL_FILES= $(MODULES:%=%.erl)
@@ -63,7 +62,7 @@ EBIN = .
# Targets
# ----------------------------------------------------
-tests debug opt: $(TARGET_FILES)
+tests $(TYPES): $(TARGET_FILES)
clean:
diff --git a/lib/public_key/test/erl_make_certs.erl b/lib/public_key/test/erl_make_certs.erl
index e2a94dd886..a56c8e3691 100644
--- a/lib/public_key/test/erl_make_certs.erl
+++ b/lib/public_key/test/erl_make_certs.erl
@@ -47,7 +47,7 @@
%% {title, Title}
%% {dnQualifer, DnQ}
%% issuer = {Issuer, IssuerKey} true (i.e. a ca cert is created)
-%% (obs IssuerKey migth be {Key, Password}
+%% (obs IssuerKey might be {Key, Password}
%% key = KeyFile|KeyBin|rsa|dsa|ec Subject PublicKey rsa, dsa or ec generates key
%%
%%
@@ -368,7 +368,7 @@ make_key(ec, _Opts) ->
gen_rsa2(Size) ->
try
- %% The numbers 2048,17 is choosen to not cause the cryptolib on
+ %% The numbers 2048,17 is chosen to not cause the cryptolib on
%% FIPS-enabled test machines be mad at us.
public_key:generate_key({rsa, 2048, 17})
catch
diff --git a/lib/public_key/test/pkits_SUITE.erl b/lib/public_key/test/pkits_SUITE.erl
index ba3efdba09..9cd71adce1 100644
--- a/lib/public_key/test/pkits_SUITE.erl
+++ b/lib/public_key/test/pkits_SUITE.erl
@@ -300,24 +300,24 @@ end_per_testcase(_Func, Config) ->
%%--------------------------- signature_verification--------------------------------------------------
valid_rsa_signature() ->
- [{doc, "Test rsa signatur verification"}].
+ [{doc, "Test rsa signature verification"}].
valid_rsa_signature(Config) when is_list(Config) ->
run([{ "4.1.1", "Valid Certificate Path Test1 EE", ok}]).
invalid_rsa_signature() ->
- [{doc,"Test rsa signatur verification"}].
+ [{doc,"Test rsa signature verification"}].
invalid_rsa_signature(Config) when is_list(Config) ->
run([{ "4.1.2", "Invalid CA Signature Test2 EE", {bad_cert,invalid_signature}},
{ "4.1.3", "Invalid EE Signature Test3 EE", {bad_cert,invalid_signature}}]).
valid_dsa_signature() ->
- [{doc,"Test dsa signatur verification"}].
+ [{doc,"Test dsa signature verification"}].
valid_dsa_signature(Config) when is_list(Config) ->
run([{ "4.1.4", "Valid DSA Signatures Test4 EE", ok},
{ "4.1.5", "Valid DSA Parameter Inheritance Test5 EE", ok}]).
invalid_dsa_signature() ->
- [{doc,"Test dsa signatur verification"}].
+ [{doc,"Test dsa signature verification"}].
invalid_dsa_signature(Config) when is_list(Config) ->
run([{ "4.1.6", "Invalid DSA Signature Test6 EE",{bad_cert,invalid_signature}}]).
@@ -805,7 +805,7 @@ invalid_crl_issuer(Config) when is_list(Config) ->
]).
%% Although this test is valid it has a circular dependency. As a result
-%% an attempt is made to reursively checks a CRL path and rejected due to
+%% an attempt is made to recursively checks a CRL path and rejected due to
%% a CRL path validation error. PKITS notes suggest this test does not
%% need to be run due to this issue.
%% { "4.14.30", "Valid cRLIssuer Test30", 54 }
diff --git a/lib/public_key/test/pubkey_ssh_SUITE.erl b/lib/public_key/test/pubkey_ssh_SUITE.erl
deleted file mode 100644
index 4b7c2082ba..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE.erl
+++ /dev/null
@@ -1,457 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%%
--module(pubkey_ssh_SUITE).
-
-%% This test suite tests thoose functions until they are removed
--compile([{nowarn_deprecated_function,
- [{public_key,ssh_decode,2},
- {public_key,ssh_encode,2},
- {public_key,ssh_hostkey_fingerprint,1},
- {public_key,ssh_hostkey_fingerprint,2}
- ]}
- ]).
-
--include_lib("common_test/include/ct.hrl").
--include_lib("public_key/include/public_key.hrl").
-
--export([
- suite/0,
- all/0,
- groups/0,
- init_per_suite/1,
- end_per_suite/1,
- init_per_group/2,
- end_per_group/2,
- init_per_testcase/2,
- end_per_testcase/2,
-
- ssh_rsa_public_key/1,
- ssh_dsa_public_key/1,
- ssh_ecdsa_public_key/1,
- ssh_rfc4716_rsa_comment/1,
- ssh_rfc4716_dsa_comment/1,
- ssh_rfc4716_rsa_subject/1,
- ssh_known_hosts/1,
- ssh1_known_hosts/1,
- ssh_auth_keys/1,
- ssh1_auth_keys/1,
- ssh_openssh_public_key_with_comment/1,
- ssh_openssh_public_key_long_header/1,
-
- ssh_hostkey_fingerprint_md5_implicit/1,
- ssh_hostkey_fingerprint_md5/1,
- ssh_hostkey_fingerprint_sha/1,
- ssh_hostkey_fingerprint_sha256/1,
- ssh_hostkey_fingerprint_sha384/1,
- ssh_hostkey_fingerprint_sha512/1,
- ssh_hostkey_fingerprint_list/1
- ]).
-
-
--define(TIMEOUT, 120000). % 2 min
-
-
-%%--------------------------------------------------------------------
-%% Common Test interface functions -----------------------------------
-%%--------------------------------------------------------------------
-
-suite() ->
- [].
-
-all() ->
- [{group, ssh_public_key_decode_encode},
- {group, ssh_hostkey_fingerprint}
- ].
-
-groups() ->
- [{ssh_public_key_decode_encode, [],
- [ssh_rsa_public_key, ssh_dsa_public_key, ssh_ecdsa_public_key,
- ssh_rfc4716_rsa_comment, ssh_rfc4716_dsa_comment,
- ssh_rfc4716_rsa_subject,
- ssh_known_hosts,
- ssh_auth_keys, ssh1_known_hosts, ssh1_auth_keys, ssh_openssh_public_key_with_comment,
- ssh_openssh_public_key_long_header]},
-
- {ssh_hostkey_fingerprint, [],
- [ssh_hostkey_fingerprint_md5_implicit,
- ssh_hostkey_fingerprint_md5,
- ssh_hostkey_fingerprint_sha,
- ssh_hostkey_fingerprint_sha256,
- ssh_hostkey_fingerprint_sha384,
- ssh_hostkey_fingerprint_sha512,
- ssh_hostkey_fingerprint_list]}
- ].
-%%-------------------------------------------------------------------
-init_per_suite(Config) ->
- application:stop(crypto),
- try crypto:start() of
- ok ->
- application:start(asn1),
- Config
- catch _:_ ->
- {skip, "Crypto did not start"}
- end.
-
-end_per_suite(_Config) ->
- application:stop(asn1),
- application:stop(crypto).
-
-%%-------------------------------------------------------------------
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(_GroupName, Config) ->
- Config.
-%%-------------------------------------------------------------------
-init_per_testcase(ssh_hostkey_fingerprint_md5_implicit, Config) ->
- init_fingerprint_testcase([md5], Config);
-
-init_per_testcase(ssh_hostkey_fingerprint_md5, Config) ->
- init_fingerprint_testcase([md5], Config);
-
-init_per_testcase(ssh_hostkey_fingerprint_sha, Config) ->
- init_fingerprint_testcase([sha], Config);
-
-init_per_testcase(ssh_hostkey_fingerprint_sha256, Config) ->
- init_fingerprint_testcase([sha256], Config);
-
-init_per_testcase(ssh_hostkey_fingerprint_sha384, Config) ->
- init_fingerprint_testcase([sha384], Config);
-
-init_per_testcase(ssh_hostkey_fingerprint_sha512, Config) ->
- init_fingerprint_testcase([sha512], Config);
-
-init_per_testcase(ssh_hostkey_fingerprint_list , Config) ->
- init_fingerprint_testcase([sha,md5], Config);
-
-init_per_testcase(_, Config) ->
- init_common_per_testcase(Config).
-
-
-init_fingerprint_testcase(Algs, Config) ->
- Hashs = proplists:get_value(hashs, crypto:supports(), []),
- case Algs -- Hashs of
- [] -> init_common_per_testcase(Config);
- UnsupportedAlgs -> {skip,{UnsupportedAlgs,not_supported}}
- end.
-
-init_common_per_testcase(Config0) ->
- Config = lists:keydelete(watchdog, 1, Config0),
- Dog = ct:timetrap(?TIMEOUT),
- [{watchdog, Dog} | Config].
-
-
-end_per_testcase(_TestCase, _Config) ->
- ok.
-
-%%--------------------------------------------------------------------
-%% Test Cases --------------------------------------------------------
-%%--------------------------------------------------------------------
-ssh_rsa_public_key(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, RSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_rsa_pub")),
- [{PubKey, Attributes1}] = public_key:ssh_decode(RSARawSsh2, public_key),
- [{PubKey, Attributes1}] = public_key:ssh_decode(RSARawSsh2, rfc4716_public_key),
-
- {ok, RSARawOpenSsh} = file:read_file(filename:join(Datadir, "openssh_rsa_pub")),
- [{PubKey, Attributes2}] = public_key:ssh_decode(RSARawOpenSsh, public_key),
- [{PubKey, Attributes2}] = public_key:ssh_decode(RSARawOpenSsh, openssh_public_key),
-
- %% Can not check EncodedSSh == RSARawSsh2 and EncodedOpenSsh
- %% = RSARawOpenSsh as line breakpoints may differ
-
- EncodedSSh = public_key:ssh_encode([{PubKey, Attributes1}], rfc4716_public_key),
- EncodedOpenSsh = public_key:ssh_encode([{PubKey, Attributes2}], openssh_public_key),
-
- [{PubKey, Attributes1}] =
- public_key:ssh_decode(EncodedSSh, public_key),
- [{PubKey, Attributes2}] =
- public_key:ssh_decode(EncodedOpenSsh, public_key).
-
-%%--------------------------------------------------------------------
-ssh_dsa_public_key(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, DSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_dsa_pub")),
- [{PubKey, Attributes1}] = public_key:ssh_decode(DSARawSsh2, public_key),
- [{PubKey, Attributes1}] = public_key:ssh_decode(DSARawSsh2, rfc4716_public_key),
-
- {ok, DSARawOpenSsh} = file:read_file(filename:join(Datadir, "openssh_dsa_pub")),
- [{PubKey, Attributes2}] = public_key:ssh_decode(DSARawOpenSsh, public_key),
- [{PubKey, Attributes2}] = public_key:ssh_decode(DSARawOpenSsh, openssh_public_key),
-
- %% Can not check EncodedSSh == DSARawSsh2 and EncodedOpenSsh
- %% = DSARawOpenSsh as line breakpoints may differ
-
- EncodedSSh = public_key:ssh_encode([{PubKey, Attributes1}], rfc4716_public_key),
- EncodedOpenSsh = public_key:ssh_encode([{PubKey, Attributes2}], openssh_public_key),
-
- [{PubKey, Attributes1}] =
- public_key:ssh_decode(EncodedSSh, public_key),
- [{PubKey, Attributes2}] =
- public_key:ssh_decode(EncodedOpenSsh, public_key).
-
-%%--------------------------------------------------------------------
-ssh_ecdsa_public_key(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, ECDSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_ecdsa_pub")),
- [{PubKey, Attributes1}] = public_key:ssh_decode(ECDSARawSsh2, public_key),
- [{PubKey, Attributes1}] = public_key:ssh_decode(ECDSARawSsh2, rfc4716_public_key),
-
- {ok, ECDSARawOpenSsh} = file:read_file(filename:join(Datadir, "openssh_ecdsa_pub")),
- [{PubKey, Attributes2}] = public_key:ssh_decode(ECDSARawOpenSsh, public_key),
- [{PubKey, Attributes2}] = public_key:ssh_decode(ECDSARawOpenSsh, openssh_public_key),
-
- %% Can not check EncodedSSh == ECDSARawSsh2 and EncodedOpenSsh
- %% = ECDSARawOpenSsh as line breakpoints may differ
-
- EncodedSSh = public_key:ssh_encode([{PubKey, Attributes1}], rfc4716_public_key),
- EncodedOpenSsh = public_key:ssh_encode([{PubKey, Attributes2}], openssh_public_key),
-
- [{PubKey, Attributes1}] =
- public_key:ssh_decode(EncodedSSh, public_key),
- [{PubKey, Attributes2}] =
- public_key:ssh_decode(EncodedOpenSsh, public_key).
-
-%%--------------------------------------------------------------------
-ssh_rfc4716_rsa_comment(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, RSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_rsa_comment_pub")),
- [{#'RSAPublicKey'{} = PubKey, Attributes}] =
- public_key:ssh_decode(RSARawSsh2, public_key),
-
- Headers = proplists:get_value(headers, Attributes),
-
- Value = proplists:get_value("Comment", Headers, undefined),
- true = Value =/= undefined,
- RSARawSsh2 = public_key:ssh_encode([{PubKey, Attributes}], rfc4716_public_key).
-
-%%--------------------------------------------------------------------
-ssh_rfc4716_dsa_comment(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, DSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_dsa_comment_pub")),
- [{{_, #'Dss-Parms'{}} = PubKey, Attributes}] =
- public_key:ssh_decode(DSARawSsh2, public_key),
-
- Headers = proplists:get_value(headers, Attributes),
-
- Value = proplists:get_value("Comment", Headers, undefined),
- true = Value =/= undefined,
-
- %% Can not check Encoded == DSARawSsh2 as line continuation breakpoints may differ
- Encoded = public_key:ssh_encode([{PubKey, Attributes}], rfc4716_public_key),
- [{PubKey, Attributes}] =
- public_key:ssh_decode(Encoded, public_key).
-
-%%--------------------------------------------------------------------
-ssh_rfc4716_rsa_subject(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, RSARawSsh2} = file:read_file(filename:join(Datadir, "ssh2_subject_pub")),
- [{#'RSAPublicKey'{} = PubKey, Attributes}] =
- public_key:ssh_decode(RSARawSsh2, public_key),
-
- Headers = proplists:get_value(headers, Attributes),
-
- Value = proplists:get_value("Subject", Headers, undefined),
- true = Value =/= undefined,
-
- %% Can not check Encoded == RSARawSsh2 as line continuation breakpoints may differ
- Encoded = public_key:ssh_encode([{PubKey, Attributes}], rfc4716_public_key),
- [{PubKey, Attributes}] =
- public_key:ssh_decode(Encoded, public_key).
-
-%%--------------------------------------------------------------------
-ssh_known_hosts(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, SshKnownHosts} = file:read_file(filename:join(Datadir, "known_hosts")),
- [{#'RSAPublicKey'{}, Attributes1}, {#'RSAPublicKey'{}, Attributes2},
- {#'RSAPublicKey'{}, Attributes3}, {#'RSAPublicKey'{}, Attributes4}] = Decoded =
- public_key:ssh_decode(SshKnownHosts, known_hosts),
-
- Comment1 = undefined,
- Comment2 = "foo@bar.com",
- Comment3 = "Comment with whitespaces",
- Comment4 = "foo@bar.com Comment with whitespaces",
-
- Comment1 = proplists:get_value(comment, Attributes1, undefined),
- Comment2 = proplists:get_value(comment, Attributes2),
- Comment3 = proplists:get_value(comment, Attributes3),
- Comment4 = proplists:get_value(comment, Attributes4),
-
- Value1 = proplists:get_value(hostnames, Attributes1, undefined),
- Value2 = proplists:get_value(hostnames, Attributes2, undefined),
- true = (Value1 =/= undefined) and (Value2 =/= undefined),
-
- Encoded = public_key:ssh_encode(Decoded, known_hosts),
- Decoded = public_key:ssh_decode(Encoded, known_hosts).
-
-%%--------------------------------------------------------------------
-ssh1_known_hosts(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, SshKnownHosts} = file:read_file(filename:join(Datadir, "ssh1_known_hosts")),
- [{#'RSAPublicKey'{}, Attributes1}, {#'RSAPublicKey'{}, Attributes2},{#'RSAPublicKey'{}, Attributes3}]
- = Decoded = public_key:ssh_decode(SshKnownHosts, known_hosts),
-
- Value1 = proplists:get_value(hostnames, Attributes1, undefined),
- Value2 = proplists:get_value(hostnames, Attributes2, undefined),
- true = (Value1 =/= undefined) and (Value2 =/= undefined),
-
- Comment ="dhopson@VMUbuntu-DSH comment with whitespaces",
- Comment = proplists:get_value(comment, Attributes3),
-
- Encoded = public_key:ssh_encode(Decoded, known_hosts),
- Decoded = public_key:ssh_decode(Encoded, known_hosts).
-
-%%--------------------------------------------------------------------
-ssh_auth_keys(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, SshAuthKeys} = file:read_file(filename:join(Datadir, "auth_keys")),
- [{#'RSAPublicKey'{}, Attributes1}, {{_, #'Dss-Parms'{}}, Attributes2},
- {#'RSAPublicKey'{}, Attributes3}, {{_, #'Dss-Parms'{}}, Attributes4}
- ] = Decoded =
- public_key:ssh_decode(SshAuthKeys, auth_keys),
-
- Value1 = proplists:get_value(options, Attributes1, undefined),
- true = Value1 =/= undefined,
-
- Comment1 = Comment2 = "dhopson@VMUbuntu-DSH",
- Comment3 = Comment4 ="dhopson@VMUbuntu-DSH comment with whitespaces",
-
- Comment1 = proplists:get_value(comment, Attributes1),
- Comment2 = proplists:get_value(comment, Attributes2),
- Comment3 = proplists:get_value(comment, Attributes3),
- Comment4 = proplists:get_value(comment, Attributes4),
-
- Encoded = public_key:ssh_encode(Decoded, auth_keys),
- Decoded = public_key:ssh_decode(Encoded, auth_keys).
-
-%%--------------------------------------------------------------------
-ssh1_auth_keys(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, SshAuthKeys} = file:read_file(filename:join(Datadir, "ssh1_auth_keys")),
- [{#'RSAPublicKey'{}, Attributes1},
- {#'RSAPublicKey'{}, Attributes2}, {#'RSAPublicKey'{}, Attributes3},
- {#'RSAPublicKey'{}, Attributes4}, {#'RSAPublicKey'{}, Attributes5}] = Decoded =
- public_key:ssh_decode(SshAuthKeys, auth_keys),
-
- Value1 = proplists:get_value(bits, Attributes2, undefined),
- Value2 = proplists:get_value(bits, Attributes3, undefined),
- true = (Value1 =/= undefined) and (Value2 =/= undefined),
-
- Comment2 = Comment3 = "dhopson@VMUbuntu-DSH",
- Comment4 = Comment5 ="dhopson@VMUbuntu-DSH comment with whitespaces",
-
- undefined = proplists:get_value(comment, Attributes1, undefined),
- Comment2 = proplists:get_value(comment, Attributes2),
- Comment3 = proplists:get_value(comment, Attributes3),
- Comment4 = proplists:get_value(comment, Attributes4),
- Comment5 = proplists:get_value(comment, Attributes5),
-
- Encoded = public_key:ssh_encode(Decoded, auth_keys),
- Decoded = public_key:ssh_decode(Encoded, auth_keys).
-
-%%--------------------------------------------------------------------
-ssh_openssh_public_key_with_comment(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok, DSARawOpenSsh} = file:read_file(filename:join(Datadir, "openssh_dsa_with_comment_pub")),
- [{{_, #'Dss-Parms'{}}, _}] = public_key:ssh_decode(DSARawOpenSsh, openssh_public_key).
-
-%%--------------------------------------------------------------------
-ssh_openssh_public_key_long_header(Config) when is_list(Config) ->
- Datadir = proplists:get_value(data_dir, Config),
-
- {ok,RSARawOpenSsh} = file:read_file(filename:join(Datadir, "ssh_rsa_long_header_pub")),
- [{#'RSAPublicKey'{}, _}] = Decoded = public_key:ssh_decode(RSARawOpenSsh, public_key),
-
- Encoded = public_key:ssh_encode(Decoded, rfc4716_public_key),
- Decoded = public_key:ssh_decode(Encoded, rfc4716_public_key).
-
-%%--------------------------------------------------------------------
-%% Check of different host keys left to later
-ssh_hostkey_fingerprint_md5_implicit(_Config) ->
- Expected = "4b:0b:63:de:0f:a7:3a:ab:2c:cc:2d:d1:21:37:1d:3a",
- Expected = public_key:ssh_hostkey_fingerprint(ssh_hostkey(rsa)).
-
-%%--------------------------------------------------------------------
-%% Check of different host keys left to later
-ssh_hostkey_fingerprint_md5(_Config) ->
- Expected = "MD5:4b:0b:63:de:0f:a7:3a:ab:2c:cc:2d:d1:21:37:1d:3a",
- Expected = public_key:ssh_hostkey_fingerprint(md5, ssh_hostkey(rsa)).
-
-%%--------------------------------------------------------------------
-%% Since this kind of fingerprint is not available yet on standard
-%% distros, we do like this instead. The Expected is generated with:
-%% $ openssh-7.3p1/ssh-keygen -E sha1 -lf <file>
-%% 2048 SHA1:Soammnaqg06jrm2jivMSnzQGlmk none@example.org (RSA)
-ssh_hostkey_fingerprint_sha(_Config) ->
- Expected = "SHA1:Soammnaqg06jrm2jivMSnzQGlmk",
- Expected = public_key:ssh_hostkey_fingerprint(sha, ssh_hostkey(rsa)).
-
-%%--------------------------------------------------------------------
-%% Since this kind of fingerprint is not available yet on standard
-%% distros, we do like this instead.
-ssh_hostkey_fingerprint_sha256(_Config) ->
- Expected = "SHA256:T7F1BahkJWR7iJO8+rpzWOPbp7LZP4MlNrDExdNYOvY",
- Expected = public_key:ssh_hostkey_fingerprint(sha256, ssh_hostkey(rsa)).
-
-%%--------------------------------------------------------------------
-%% Since this kind of fingerprint is not available yet on standard
-%% distros, we do like this instead.
-ssh_hostkey_fingerprint_sha384(_Config) ->
- Expected = "SHA384:QhkLoGNI4KXdPvC//HxxSCP3uTQVADqxdajbgm+Gkx9zqz8N94HyP1JmH8C4/aEl",
- Expected = public_key:ssh_hostkey_fingerprint(sha384, ssh_hostkey(rsa)).
-
-%%--------------------------------------------------------------------
-%% Since this kind of fingerprint is not available yet on standard
-%% distros, we do like this instead.
-ssh_hostkey_fingerprint_sha512(_Config) ->
- Expected = "SHA512:ezUismvm3ADQQb6Nm0c1DwQ6ydInlJNfsnSQejFkXNmABg1Aenk9oi45CXeBOoTnlfTsGG8nFDm0smP10PBEeA",
- Expected = public_key:ssh_hostkey_fingerprint(sha512, ssh_hostkey(rsa)).
-
-%%--------------------------------------------------------------------
-%% Since this kind of fingerprint is not available yet on standard
-%% distros, we do like this instead.
-ssh_hostkey_fingerprint_list(_Config) ->
- Expected = ["SHA1:Soammnaqg06jrm2jivMSnzQGlmk",
- "MD5:4b:0b:63:de:0f:a7:3a:ab:2c:cc:2d:d1:21:37:1d:3a"],
- Expected = public_key:ssh_hostkey_fingerprint([sha,md5], ssh_hostkey(rsa)).
-
-%%--------------------------------------------------------------------
-%% Internal functions ------------------------------------------------
-%%--------------------------------------------------------------------
-ssh_hostkey(rsa) ->
- [{PKdecoded,_}] =
- public_key:ssh_decode(
- <<"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYXcYmsyJBstl4EfFYzfQJmSiUE162zvSGSoMYybShYOI6rnnyvvihfw8Aml+2gZ716F2tqG48FQ/yPZEGWNPMrCejPpJctaPWhpNdNMJ8KFXSEgr5bY2mEpa19DHmuDeXKzeJJ+X7s3fVdYc4FMk5731KIW6Huf019ZnTxbx0VKG6b1KAJBg3vpNsDxEMwQ4LFMB0JHVklOTzbxmpaeULuIxvl65A+eGeFVeo2Q+YI9UnwY1vSgmc9Azwy8Ie9Z0HpQBN5I7Uc5xnknT8V6xDhgNfXEfzsgsRdDfZLECt1WO/1gP9wkosvAGZWt5oG8pbNQWiQdFq536ck8WQD9WD none@example.org">>,
- public_key),
- PKdecoded.
-
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/auth_keys b/lib/public_key/test/pubkey_ssh_SUITE_data/auth_keys
deleted file mode 100644
index 8be7357a06..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/auth_keys
+++ /dev/null
@@ -1,7 +0,0 @@
-command="dump /home",no-pty,no-port-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAwrr66r8n6B8Y0zMF3dOpXEapIQD9DiYQ6D6/zwor9o39jSkHNiMMER/GETBbzP83LOcekm02aRjo55ArO7gPPVvCXbrirJu9pkm4AC4BBre5xSLS7soyzwbigFruM8G63jSXqpHqJ/ooi168sKMC2b0Ncsi+JlTfNYlDXJVLKEeZgZOInQyMmtisaDTUQWTIv1snAizf4iIYENuAkGYGNCL77u5Y5VOu5eQipvFajTnps9QvUx/zdSFYn9e2sulWM3Bxc/S4IJ67JWHVRpfJxGi3hinRBH8WQdXuUwdJJTiJHKPyYrrM7Q6Xq4TOMFtcRuLDC6u3BXM1L0gBvHPNOnD5l2Lp5EjUkQ9CBf2j4A4gfH+iWQZyk08esAG/iwArAVxkl368+dkbMWOXL8BN4x5zYgdzoeypQZZ2RKH780MCTSo4WQ19DP8pw+9q3bSFC9H3xYAxrKAJNWjeTUJOTrTe+mWXXU770gYyQTxa2ycnYrlZucn1S3vsvn6eq7NZZ8NRbyv1n15Ocg+nHK4fuKOrwPhU3NbKQwtjb0Wsxx1gAmQqIOLTpAdsrAauPxC7TPYA5qQVCphvimKuhQM/1gMV225JrnjspVlthCzuFYUjXOKC3wxz6FFEtwnXu3uC5bVVkmkNadJmD21gD23yk4BraGXVYpRMIB+X+OTUUI8= dhopson@VMUbuntu-DSH
-
-ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dhopson@VMUbuntu-DSH
-
-command="dump /home",no-pty,no-port-forwarding ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAwrr66r8n6B8Y0zMF3dOpXEapIQD9DiYQ6D6/zwor9o39jSkHNiMMER/GETBbzP83LOcekm02aRjo55ArO7gPPVvCXbrirJu9pkm4AC4BBre5xSLS7soyzwbigFruM8G63jSXqpHqJ/ooi168sKMC2b0Ncsi+JlTfNYlDXJVLKEeZgZOInQyMmtisaDTUQWTIv1snAizf4iIYENuAkGYGNCL77u5Y5VOu5eQipvFajTnps9QvUx/zdSFYn9e2sulWM3Bxc/S4IJ67JWHVRpfJxGi3hinRBH8WQdXuUwdJJTiJHKPyYrrM7Q6Xq4TOMFtcRuLDC6u3BXM1L0gBvHPNOnD5l2Lp5EjUkQ9CBf2j4A4gfH+iWQZyk08esAG/iwArAVxkl368+dkbMWOXL8BN4x5zYgdzoeypQZZ2RKH780MCTSo4WQ19DP8pw+9q3bSFC9H3xYAxrKAJNWjeTUJOTrTe+mWXXU770gYyQTxa2ycnYrlZucn1S3vsvn6eq7NZZ8NRbyv1n15Ocg+nHK4fuKOrwPhU3NbKQwtjb0Wsxx1gAmQqIOLTpAdsrAauPxC7TPYA5qQVCphvimKuhQM/1gMV225JrnjspVlthCzuFYUjXOKC3wxz6FFEtwnXu3uC5bVVkmkNadJmD21gD23yk4BraGXVYpRMIB+X+OTUUI8= dhopson@VMUbuntu-DSH comment with whitespaces
-
-ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dhopson@VMUbuntu-DSH comment with whitespaces
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/known_hosts b/lib/public_key/test/pubkey_ssh_SUITE_data/known_hosts
deleted file mode 100644
index 3c3af68178..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/known_hosts
+++ /dev/null
@@ -1,8 +0,0 @@
-hostname.domain.com,192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA1XY18+zA8VNK2YkzygOkMqUxHSTfxT1Xxx8CgDZgcQH8HUhPssW5ttvG8nKetlPQZAVk1C4WkWS1y5b3ekBhZTIxocp9Joc6V1+f2EOfO2mSLRwB16RGrdw6q7msrBXTC/dl+hF45kMMzVNzqxnSMVOa0sEPK2zK6Sg3Vi9fCSM=
-
-|1|BWO5qDxk/cFH0wa05JLdHn+j6xQ=|rXQvIxh5cDD3C43k5DPDamawVNA= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA1XY18+zA8VNK2YkzygOkMqUxHSTfxT1Xxx8CgDZgcQH8HUhPssW5ttvG8nKetlPQZAVk1C4WkWS1y5b3ekBhZTIxocp9Joc6V1+f2EOfO2mSLRwB16RGrdw6q7msrBXTC/dl+hF45kMMzVNzqxnSMVOa0sEPK2zK6Sg3Vi9fCSM= foo@bar.com
-
-hostname.domain.com,192.168.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA1XY18+zA8VNK2YkzygOkMqUxHSTfxT1Xxx8CgDZgcQH8HUhPssW5ttvG8nKetlPQZAVk1C4WkWS1y5b3ekBhZTIxocp9Joc6V1+f2EOfO2mSLRwB16RGrdw6q7msrBXTC/dl+hF45kMMzVNzqxnSMVOa0sEPK2zK6Sg3Vi9fCSM= Comment with whitespaces
-
-|1|BWO5qDxk/cFH0wa05JLdHn+j6xQ=|rXQvIxh5cDD3C43k5DPDamawVNA= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA1XY18+zA8VNK2YkzygOkMqUxHSTfxT1Xxx8CgDZgcQH8HUhPssW5ttvG8nKetlPQZAVk1C4WkWS1y5b3ekBhZTIxocp9Joc6V1+f2EOfO2mSLRwB16RGrdw6q7msrBXTC/dl+hF45kMMzVNzqxnSMVOa0sEPK2zK6Sg3Vi9fCSM= foo@bar.com Comment with whitespaces
-
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_pub
deleted file mode 100644
index a765ba8189..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_pub
+++ /dev/null
@@ -1 +0,0 @@
-ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_with_comment_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_with_comment_pub
deleted file mode 100644
index d5a34a3f78..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_dsa_with_comment_pub
+++ /dev/null
@@ -1,3 +0,0 @@
-#This should be ignored!!
-
-ssh-dss AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbETW6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdHYI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5cvwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGfJ0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAAvioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACBAN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HSn24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_ecdsa_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_ecdsa_pub
deleted file mode 100644
index a49b4264b8..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_ecdsa_pub
+++ /dev/null
@@ -1 +0,0 @@
-ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIJrVlKYIT+MlxxRx5BFXisHHkcGMAAKv2dguUeOsutsYyzs9JAczvl6c+Sypra5+qOi2LHPXw6GGluuXcOssOM= uabhnil@elxadlj3q32
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_rsa_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_rsa_pub
deleted file mode 100644
index 0a0838db40..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/openssh_rsa_pub
+++ /dev/null
@@ -1 +0,0 @@
-ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAgEAwrr66r8n6B8Y0zMF3dOpXEapIQD9DiYQ6D6/zwor9o39jSkHNiMMER/GETBbzP83LOcekm02aRjo55ArO7gPPVvCXbrirJu9pkm4AC4BBre5xSLS7soyzwbigFruM8G63jSXqpHqJ/ooi168sKMC2b0Ncsi+JlTfNYlDXJVLKEeZgZOInQyMmtisaDTUQWTIv1snAizf4iIYENuAkGYGNCL77u5Y5VOu5eQipvFajTnps9QvUx/zdSFYn9e2sulWM3Bxc/S4IJ67JWHVRpfJxGi3hinRBH8WQdXuUwdJJTiJHKPyYrrM7Q6Xq4TOMFtcRuLDC6u3BXM1L0gBvHPNOnD5l2Lp5EjUkQ9CBf2j4A4gfH+iWQZyk08esAG/iwArAVxkl368+dkbMWOXL8BN4x5zYgdzoeypQZZ2RKH780MCTSo4WQ19DP8pw+9q3bSFC9H3xYAxrKAJNWjeTUJOTrTe+mWXXU770gYyQTxa2ycnYrlZucn1S3vsvn6eq7NZZ8NRbyv1n15Ocg+nHK4fuKOrwPhU3NbKQwtjb0Wsxx1gAmQqIOLTpAdsrAauPxC7TPYA5qQVCphvimKuhQM/1gMV225JrnjspVlthCzuFYUjXOKC3wxz6FFEtwnXu3uC5bVVkmkNadJmD21gD23yk4BraGXVYpRMIB+X+OTUUI8= dhopson@VMUbuntu-DSH
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_auth_keys b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_auth_keys
deleted file mode 100644
index ac3d61b4c7..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_auth_keys
+++ /dev/null
@@ -1,9 +0,0 @@
-1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663
-
-1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH
-
-command="dump /home",no-pty,no-port-forwarding 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH
-
-1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH comment with whitespaces
-
-command="dump /home",no-pty,no-port-forwarding 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH comment with whitespaces
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_known_hosts b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_known_hosts
deleted file mode 100644
index 835b16ab67..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh1_known_hosts
+++ /dev/null
@@ -1,3 +0,0 @@
-hostname.domain.com,192.168.0.1 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH
-hostname2.domain.com,192.168.0.2 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663
-hostname3.domain.com,192.168.0.3 1024 35 794430685278501116412873221867658581245241426828503388129294124540165981586596106773643485704743298698207838825035605868404742682423919455523383721081589378970796492944950066480951790660582889972423189943567111507801410254720228911513553205592856585541922662924268445466959576882300405064708497308004255650466014242855505233634626075778108365396568863197935915425650388910408127232583533503834009244199384570662092164277923946411149853110048365318587554141774139652307149492021035538341281427025252592933784473453522113124752189378715431529801894015739903371171585194505182320772654217490509848165365152457990491089951560694728469571221819385402117009544812199223715540348068497710535492913376699508575875577554607325905000745578091554027803374110357015655416894607641289462159580964951182385869168785183135763253784745647466464331174922663455073627501620274348748413309761116542324505123795743603781806636788810617169341018091186028310551725315297135354426735951943325476221811539822892501042385411792050504283745898099390893596941969752683246939665141002098430129617772928840718016009187577151479855846883928332010147501182201528575840364152774917950524127063432334646746291719251739989499132767590205934821590545762802261107691663 dhopson@VMUbuntu-DSH comment with whitespaces
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_comment_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_comment_pub
deleted file mode 100644
index ca5089dbd7..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_comment_pub
+++ /dev/null
@@ -1,13 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-Comment: This is my public key for use on \
-servers which I don't like.
-AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbET
-W6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdH
-YI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5c
-vwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGf
-J0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAA
-vioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACB
-AN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HS
-n24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5
-sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_pub
deleted file mode 100644
index a5e38be81a..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_dsa_pub
+++ /dev/null
@@ -1,12 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-Comment: DSA Public Key for use with MyIsp
-AAAAB3NzaC1kc3MAAACBAPY8ZOHY2yFSJA6XYC9HRwNHxaehvx5wOJ0rzZdzoSOXxbET
-W6ToHv8D1UJ/z+zHo9Fiko5XybZnDIaBDHtblQ+Yp7StxyltHnXF1YLfKD1G4T6JYrdH
-YI14Om1eg9e4NnCRleaqoZPF3UGfZia6bXrGTQf3gJq2e7Yisk/gF+1VAAAAFQDb8D5c
-vwHWTZDPfX0D2s9Rd7NBvQAAAIEAlN92+Bb7D4KLYk3IwRbXblwXdkPggA4pfdtW9vGf
-J0/RHd+NjB4eo1D+0dix6tXwYGN7PKS5R/FXPNwxHPapcj9uL1Jn2AWQ2dsknf+i/FAA
-vioUPkmdMc0zuWoSOEsSNhVDtX3WdvVcGcBq9cetzrtOKWOocJmJ80qadxTRHtUAAACB
-AN7CY+KKv1gHpRzFwdQm7HK9bb1LAo2KwaoXnadFgeptNBQeSXG1vO+JsvphVMBJc9HS
-n24VYtYtsMu74qXviYjziVucWKjjKEb11juqnF0GDlB3VVmxHLmxnAz643WK42Z7dLM5
-sY29ouezv4Xz2PuMch5VGPP+CDqzCM4loWgV
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_ecdsa_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_ecdsa_pub
deleted file mode 100644
index 702e5c4fde..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_ecdsa_pub
+++ /dev/null
@@ -1,6 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-Comment: "256-bit ECDSA, converted by uabhnil@elxadlj3q32 from OpenSSH"
-AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIJrVlKYIT+MlxxRx5
-BFXisHHkcGMAAKv2dguUeOsutsYyzs9JAczvl6c+Sypra5+qOi2LHPXw6GGluuXcOssOM=
-
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_comment_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_comment_pub
deleted file mode 100644
index e4d446147c..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_comment_pub
+++ /dev/null
@@ -1,7 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-Comment: "1024-bit RSA, converted from OpenSSH by me@example.com"
-x-command: /home/me/bin/lock-in-guest.sh
-AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
-YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
-5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_pub
deleted file mode 100644
index 761088b517..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_rsa_pub
+++ /dev/null
@@ -1,13 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-AAAAB3NzaC1yc2EAAAABIwAAAgEAwrr66r8n6B8Y0zMF3dOpXEapIQD9DiYQ6D6/zwor9o
-39jSkHNiMMER/GETBbzP83LOcekm02aRjo55ArO7gPPVvCXbrirJu9pkm4AC4BBre5xSLS
-7soyzwbigFruM8G63jSXqpHqJ/ooi168sKMC2b0Ncsi+JlTfNYlDXJVLKEeZgZOInQyMmt
-isaDTUQWTIv1snAizf4iIYENuAkGYGNCL77u5Y5VOu5eQipvFajTnps9QvUx/zdSFYn9e2
-sulWM3Bxc/S4IJ67JWHVRpfJxGi3hinRBH8WQdXuUwdJJTiJHKPyYrrM7Q6Xq4TOMFtcRu
-LDC6u3BXM1L0gBvHPNOnD5l2Lp5EjUkQ9CBf2j4A4gfH+iWQZyk08esAG/iwArAVxkl368
-+dkbMWOXL8BN4x5zYgdzoeypQZZ2RKH780MCTSo4WQ19DP8pw+9q3bSFC9H3xYAxrKAJNW
-jeTUJOTrTe+mWXXU770gYyQTxa2ycnYrlZucn1S3vsvn6eq7NZZ8NRbyv1n15Ocg+nHK4f
-uKOrwPhU3NbKQwtjb0Wsxx1gAmQqIOLTpAdsrAauPxC7TPYA5qQVCphvimKuhQM/1gMV22
-5JrnjspVlthCzuFYUjXOKC3wxz6FFEtwnXu3uC5bVVkmkNadJmD21gD23yk4BraGXVYpRM
-IB+X+OTUUI8=
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_subject_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_subject_pub
deleted file mode 100644
index 8b8ccda8ba..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh2_subject_pub
+++ /dev/null
@@ -1,8 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-Subject: me
-Comment: 1024-bit rsa, created by me@example.com Mon Jan 15 \
-08:31:24 2001
-AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4
-596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4
-soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_comment_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_comment_pub
deleted file mode 100644
index 7b42ced93e..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_comment_pub
+++ /dev/null
@@ -1,9 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-Comment: This is an example of a very very very very looooooooooooo\
-ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\
-commment
-x-command: /home/me/bin/lock-in-guest.sh
-AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
-YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
-5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_header_pub b/lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_header_pub
deleted file mode 100644
index 7b42ced93e..0000000000
--- a/lib/public_key/test/pubkey_ssh_SUITE_data/ssh_rsa_long_header_pub
+++ /dev/null
@@ -1,9 +0,0 @@
----- BEGIN SSH2 PUBLIC KEY ----
-Comment: This is an example of a very very very very looooooooooooo\
-ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\
-commment
-x-command: /home/me/bin/lock-in-guest.sh
-AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
-YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
-5TT4SfsUu/iKy9lUcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=
----- END SSH2 PUBLIC KEY ----
diff --git a/lib/public_key/test/public_key_SUITE.erl b/lib/public_key/test/public_key_SUITE.erl
index 80c76827c6..b3227b5c7e 100644
--- a/lib/public_key/test/public_key_SUITE.erl
+++ b/lib/public_key/test/public_key_SUITE.erl
@@ -673,7 +673,7 @@ pkix(Config) when is_list(Config) ->
true = lists:member(IssuerId, CaIds),
- %% Should be normalized allready
+ %% Should be normalized already
TestStr = {rdnSequence,
[[{'AttributeTypeAndValue', {2,5,4,3},{printableString,"ERLANGCA"}}],
[{'AttributeTypeAndValue', {2,5,4,3},{printableString," erlang ca "}}]]},
@@ -887,19 +887,19 @@ pkix_verify_hostname_subjAltName(Config) ->
true = public_key:pkix_verify_hostname(Cert, [{dns_id,"kb.example.org"}]),
true = public_key:pkix_verify_hostname(Cert, [{dns_id,"KB.EXAMPLE.ORG"}]),
- %% Check that a dns_id does not match a DNS subjAltName wiht wildcard
+ %% Check that a dns_id does not match a DNS subjAltName with wildcard
false = public_key:pkix_verify_hostname(Cert, [{dns_id,"other.example.org"}]),
- %% Check that a dns_id does match a DNS subjAltName wiht wildcard with matchfun
+ %% Check that a dns_id does match a DNS subjAltName with wildcard with matchfun
MatchFun = {match_fun, public_key:pkix_verify_hostname_match_fun(https)},
true = public_key:pkix_verify_hostname(Cert, [{dns_id,"other.example.org"}], [MatchFun]),
true = public_key:pkix_verify_hostname(Cert, [{dns_id,"OTHER.EXAMPLE.ORG"}], [MatchFun]),
- %% Check that a uri_id does not match a DNS subjAltName wiht wildcard
+ %% Check that a uri_id does not match a DNS subjAltName with wildcard
false = public_key:pkix_verify_hostname(Cert, [{uri_id,"https://other.example.org"}]),
false = public_key:pkix_verify_hostname(Cert, [{uri_id,"https://OTHER.EXAMPLE.ORG"}]),
- %% Check that a dns_id does match a DNS subjAltName wiht wildcard with matchfun
+ %% Check that a dns_id does match a DNS subjAltName with wildcard with matchfun
true = public_key:pkix_verify_hostname(Cert, [{uri_id,"https://other.example.org"}], [MatchFun]),
true = public_key:pkix_verify_hostname(Cert, [{uri_id,"https://OTHER.EXAMPLE.ORG"}], [MatchFun]),
true = public_key:pkix_verify_hostname(Cert, [{uri_id,"https://OTHER.example.org"}], [MatchFun]),
diff --git a/lib/reltool/Makefile b/lib/reltool/Makefile
index 94534ee2b7..50ac3b443e 100644
--- a/lib/reltool/Makefile
+++ b/lib/reltool/Makefile
@@ -37,5 +37,6 @@ SPECIAL_TARGETS =
include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=wx sasl
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/reltool/doc/src/notes.xml b/lib/reltool/doc/src/notes.xml
index d469c8d9a9..40ea90d83d 100644
--- a/lib/reltool/doc/src/notes.xml
+++ b/lib/reltool/doc/src/notes.xml
@@ -404,7 +404,7 @@
reltool config does not contain all applications that are
listed as <c>{applications,Applications}</c> in a
<c>.app</c> file, then these applications are
- autmatically added when creating the <c>.rel</c> file.
+ automatically added when creating the <c>.rel</c> file.
For 'included_applications', the behaviour was not the
same. I.e. if a <c>rel</c> spec in the reltool config did
not contain all applications that are listed as
@@ -508,7 +508,7 @@
<item> Status bar now indicates that reltool is working
(Processing libraries...) for all configuration changes,
and when generating target system. </item> <item> Title
- of dependecies column in app and mod window is changed
+ of dependencies column in app and mod window is changed
from "Modules used by others" to "Modules using this".
</item> </list>
<p>
@@ -668,7 +668,7 @@
<p>
Allow the same module name in multiple applications
visible to reltool, as long as all but one of the
- applications/modules are explicitely excluded. (Thanks to
+ applications/modules are explicitly excluded. (Thanks to
Andrew Gopienko and Jay Nelson)</p>
<p>
Own Id: OTP-9229</p>
diff --git a/lib/reltool/doc/src/reltool.xml b/lib/reltool/doc/src/reltool.xml
index 136ec2ed69..49c5424969 100644
--- a/lib/reltool/doc/src/reltool.xml
+++ b/lib/reltool/doc/src/reltool.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2009</year>
- <year>2018</year>
+ <year>2022</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -386,7 +386,7 @@
will be chosen.</p>
<p>Note that in order for reltool to sort application versions
and thereby be able to select the latest, it is required that
- the version id for the application consits of integers and
+ the version id for the application consists of integers and
dots only, for example <c>1</c>, <c>2.0</c> or
<c>3.17.1</c>.</p>
</item>
@@ -402,7 +402,7 @@
will be chosen.</p>
<p>Note that in order for reltool to sort application versions
and thereby be able to select the latest, it is required that
- the version id for the application consits of integers and
+ the version id for the application consists of integers and
dots only, for example <c>1</c>, <c>2.0</c> or
<c>3.17.1</c>.</p>
</item>
diff --git a/lib/reltool/doc/src/reltool_examples.xml b/lib/reltool/doc/src/reltool_examples.xml
index b77217dbf7..76db47a760 100644
--- a/lib/reltool/doc/src/reltool_examples.xml
+++ b/lib/reltool/doc/src/reltool_examples.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2009</year>
- <year>2021</year>
+ <year>2022</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -432,16 +432,13 @@ Eshell V10.0 (abort with ^G)
[{copy_file,"makewhatis"},{copy_file,"format_man_pages"}]},
{create_dir,"usr",
[{create_dir,"lib",
- [{copy_file,"liberts.a"},
- {copy_file,"liberl_interface_st.a"},
- {copy_file,"liberts_r.a"},
+ [{copy_file,"liberl_interface_st.a"},
{copy_file,"libic.a"},
{copy_file,"liberl_interface.a"},
{copy_file,"libei_st.a"},
{copy_file,"libei.a"}]},
{create_dir,"include",
- [{copy_file,"erl_memory_trace_parser.h"},
- {copy_file,"driver_int.h"},
+ [{copy_file,"driver_int.h"},
{copy_file,"ei_connect.h"},
{copy_file,"ei.h"},
{copy_file,"erl_nif_api_funcs.h"},
@@ -476,8 +473,7 @@ Eshell V10.0 (abort with ^G)
{copy_file,"liberts_internal_r.a"},
{copy_file,"libethread.a"},
{copy_file,"README"}]},
- {copy_file,"liberts.a"},
- {copy_file,"liberts_r.a"}]},
+ ]},
{create_dir,"src",[{copy_file,"setuid_socket_wrap.c"}]},
{create_dir,"doc",[]},
{create_dir,"man",[]},
@@ -488,7 +484,6 @@ Eshell V10.0 (abort with ^G)
{copy_file,[...]},
{copy_file,...},
{...}|...]},
- {copy_file,"erl_memory_trace_parser.h"},
{copy_file,"driver_int.h"},
{copy_file,"erl_nif_api_funcs.h"},
{copy_file,"erl_fixed_size_int_types.h"},
diff --git a/lib/reltool/doc/src/reltool_usage.xml b/lib/reltool/doc/src/reltool_usage.xml
index 743d5fa366..c30684907a 100644
--- a/lib/reltool/doc/src/reltool_usage.xml
+++ b/lib/reltool/doc/src/reltool_usage.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2009</year>
- <year>2016</year>
+ <year>2022</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -261,7 +261,7 @@
<p>Note that in order for reltool to sort application versions and
thereby be able to select the latest, it is required that the
- version id for the application consits of integers and dots only,
+ version id for the application consists of integers and dots only,
for example <c>1</c>, <c>2.0</c> or <c>3.17.1</c>.</p>
<p>By default the <c>Application inclusion policy</c> on system
diff --git a/lib/reltool/examples/Makefile b/lib/reltool/examples/Makefile
index cc29c88ba3..b2e424b91a 100644
--- a/lib/reltool/examples/Makefile
+++ b/lib/reltool/examples/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -60,7 +60,7 @@ EBIN = .
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES) *~
diff --git a/lib/reltool/src/Makefile b/lib/reltool/src/Makefile
index 4bddee4664..173a557d58 100644
--- a/lib/reltool/src/Makefile
+++ b/lib/reltool/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -65,8 +65,8 @@ ERL_COMPILE_FLAGS += +'{parse_transform,sys_pre_attributes}' \
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/reltool/src/reltool_server.erl b/lib/reltool/src/reltool_server.erl
index 43e9d50b18..de7d73bf37 100644
--- a/lib/reltool/src/reltool_server.erl
+++ b/lib/reltool/src/reltool_server.erl
@@ -1012,7 +1012,7 @@ mod_recap_dependencies(S, A, [#mod{name = ModName}=M1 | Mods], Acc, IsIncl) ->
ets:insert(S#state.mod_tab, M3),
mod_recap_dependencies(S, A, Mods, [M3 | Acc], IsIncl2);
[_] when A#app.is_included==false; M1#mod.incl_cond==exclude ->
- %% App is explicitely excluded so it is ok that the module
+ %% App is explicitly excluded so it is ok that the module
%% record does not exist for this module in this
%% application.
mod_recap_dependencies(S, A, Mods, [M1 | Acc], IsIncl);
diff --git a/lib/reltool/src/reltool_target.erl b/lib/reltool/src/reltool_target.erl
index 773e752ad4..1a0f868be8 100644
--- a/lib/reltool/src/reltool_target.erl
+++ b/lib/reltool/src/reltool_target.erl
@@ -677,7 +677,7 @@ del_apps([], Apps) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Create the load path used in the generated script.
%% If PathFlag is true a script intended to be used as a complete
-%% system (e.g. in an embbeded system), i.e. all applications are
+%% system (e.g. in an embedded system), i.e. all applications are
%% located under $ROOT/lib.
%% Otherwise all paths are set according to dir per application.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/reltool/test/Makefile b/lib/reltool/test/Makefile
index 838e9a34f6..789019cf7d 100644
--- a/lib/reltool/test/Makefile
+++ b/lib/reltool/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -58,7 +58,7 @@ EBIN = .
# Targets
# ----------------------------------------------------
-tests debug opt: $(TARGET_FILES)
+tests $(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/reltool/test/reltool_server_SUITE.erl b/lib/reltool/test/reltool_server_SUITE.erl
index c775aa1225..11ae6d6da2 100644
--- a/lib/reltool/test/reltool_server_SUITE.erl
+++ b/lib/reltool/test/reltool_server_SUITE.erl
@@ -2722,7 +2722,7 @@ os_cmd(Cmd) when is_list(Cmd) ->
[]->
{99, []};
Return->
- %% Find the position of the status code wich is last in the string
+ %% Find the position of the status code which is last in the string
%% prepended with #
case string:split(Return, "$#", trailing) of
[_] -> %% This happens only if the sh command pipe is somehow interrupted
diff --git a/lib/runtime_tools/c_src/trace_file_drv.c b/lib/runtime_tools/c_src/trace_file_drv.c
index e7fd5968c1..37a8149777 100644
--- a/lib/runtime_tools/c_src/trace_file_drv.c
+++ b/lib/runtime_tools/c_src/trace_file_drv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1999-2016. All Rights Reserved.
+ * Copyright Ericsson AB 1999-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -117,7 +117,7 @@
** 0 = binary, 1 = drop
** If Op is 1, then Size reflects the number of dropped messages. The
** op 1 is never used in this driver.
-** Size, a 32 bit interger in network byte order:
+** Size, a 32 bit integer in network byte order:
** Either the size of the binary term, or the number of packet's dropped.
** Term, an array of bytes:
** An erlang term in the external format or simply empty if Op == 1, the
diff --git a/lib/runtime_tools/c_src/trace_ip_drv.c b/lib/runtime_tools/c_src/trace_ip_drv.c
index 195558f958..c6f42b3b52 100644
--- a/lib/runtime_tools/c_src/trace_ip_drv.c
+++ b/lib/runtime_tools/c_src/trace_ip_drv.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1999-2016. All Rights Reserved.
+ * Copyright Ericsson AB 1999-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -68,7 +68,7 @@
** The number of messages to que up before dropping.
** Fl, ascii string representing a flag byte:
** 0x1 -> Drop oldest when que is full (instead of last arrived)
-** 0x2 -> Fill the que even if noone is listening.
+** 0x2 -> Fill the que even if no one is listening.
**
** The package sent over the network looks like this:
** +--+--------+-----------------------------------+
@@ -77,7 +77,7 @@
** Op, a char:
** 0 = binary, 1 = drop
** If Op is 1, then Size reflects the number of dropped messages.
-** Size, a 32 bit interger in network byte order:
+** Size, a 32 bit integer in network byte order:
** Either the size of the binary term, or the number of packet's dropped.
** Term, an array of bytes:
** An erlang term in the external format or simply empty if Op == 1, the
@@ -86,7 +86,7 @@
/*
** SO, most of the differences between WinDoze and Posixish OS'es
-** is handeled here, but the multiplexing (driver_select) is also quite
+** is handled here, but the multiplexing (driver_select) is also quite
** interesting, see my_driver_select further down in the file...
*/
@@ -677,7 +677,7 @@ static TraceIpMessage *make_buffer(int datasiz, unsigned char op,
/*
** Add message to que, discarding in a politically correct way...
-** The FLAG_DROP_OLDEST is currently ingored...
+** The FLAG_DROP_OLDEST is currently ignored...
*/
static void enque_message(TraceIpData *data, char *buff, int bufflen,
int byteswritten)
diff --git a/lib/runtime_tools/doc/src/LTTng.xml b/lib/runtime_tools/doc/src/LTTng.xml
index 7567d4ba43..00e1537176 100644
--- a/lib/runtime_tools/doc/src/LTTng.xml
+++ b/lib/runtime_tools/doc/src/LTTng.xml
@@ -521,7 +521,7 @@ Eshell V8.0 (abort with ^G)
<pre>1> <input>l(dyntrace).</input>
{module,dyntrace}</pre>
- <p>All tracepoints via dyntrace are now visibile and can be listed through <c>lttng list -u</c>.</p>
+ <p>All tracepoints via dyntrace are now visible and can be listed through <c>lttng list -u</c>.</p>
<p>Enable the process_register LTTng tracepoint for Erlang.</p>
diff --git a/lib/runtime_tools/doc/src/dbg.xml b/lib/runtime_tools/doc/src/dbg.xml
index 7532ec692d..ba7641ffa9 100644
--- a/lib/runtime_tools/doc/src/dbg.xml
+++ b/lib/runtime_tools/doc/src/dbg.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -1156,20 +1156,12 @@ hello</pre>
</func>
<func>
<name since="">stop() -> ok</name>
- <fsummary>Stop the <c>dbg</c>server and the tracing of all processes.</fsummary>
- <desc>
- <p>Stops the <c>dbg</c> server and clears all trace flags for
- all processes and all local trace patterns for all functions. Also
- shuts down all trace clients and closes all trace ports.</p>
- <p>Note that no global trace patterns are affected by this
- function.</p>
- </desc>
- </func>
- <func>
- <name since="">stop_clear() -> ok</name>
<fsummary>Stop the <c>dbg</c>server and the tracing of all processes, and clears trace patterns.</fsummary>
<desc>
- <p>Same as stop/0, but also clears all trace patterns on global functions calls.</p>
+ <p>Stops the <c>dbg</c> server, clears all trace flags for
+ all processes, clears all trace patterns for all functions,
+ clears trace patterns for send/receive, shuts down all trace clients,
+ and closes all trace ports.</p>
</desc>
</func>
</funcs>
diff --git a/lib/runtime_tools/doc/src/dyntrace.xml b/lib/runtime_tools/doc/src/dyntrace.xml
index d3b348e850..5971740b87 100644
--- a/lib/runtime_tools/doc/src/dyntrace.xml
+++ b/lib/runtime_tools/doc/src/dyntrace.xml
@@ -171,7 +171,7 @@
<desc>
<p>This function controls if user tags are to be spread to other processes with the next message. Spreading of user tags work like spreading of sequential trace tokens, so that a received user tag will be active in the process until the next message arrives (if that message does not also contain the user tag.</p>
<p>This functionality is used when a client process communicates with a file i/o-server to spread the user tag to the I/O-server and then down to the efile_drv driver. By using <c>spread_tag/1</c> and <c>restore_tag/1</c>, one can enable or disable spreading of user tags to other processes and then restore the previous state of the user tag. The TagData returned from this call contains all previous information so the state (including any previously spread user tags) will be completely restored by a later call to <c>restore_tag/1</c>.</p>
- <p>The <seeerl marker="kernel:file">file</seeerl> module already spread's tags, so there is noo need to manually call these function to get user tags spread to the efile driver through that module.</p>
+ <p>The <seeerl marker="kernel:file">file</seeerl> module already spread's tags, so there is no need to manually call these function to get user tags spread to the efile driver through that module.</p>
<p>The most use of this function would be if one for example uses the <seeerl marker="stdlib:io">io</seeerl> module to communicate with an I/O-server for a regular file, like in the following example:</p>
<pre>
f() ->
diff --git a/lib/runtime_tools/doc/src/erts_alloc_config.xml b/lib/runtime_tools/doc/src/erts_alloc_config.xml
index fb5d08be9d..af41d64881 100644
--- a/lib/runtime_tools/doc/src/erts_alloc_config.xml
+++ b/lib/runtime_tools/doc/src/erts_alloc_config.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2007</year><year>2021</year>
+ <year>2007</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -32,11 +32,11 @@
<module since="">erts_alloc_config</module>
<modulesummary>Configuration tool for erts_alloc</modulesummary>
<description>
- <note>
- <p><c>erts_alloc_config</c> is currently an experimental
- tool and might be subject to backward incompatible
- changes.</p>
- </note>
+ <warning>
+ <p>This (experimental) tool no longer produces good configurations and
+ cannot be fixed in a reasonably backwards compatible manner. It has
+ therefore been scheduled for removal in <c>OTP 26.0</c>.</p>
+ </warning>
<p><seecref marker="erts:erts_alloc">erts_alloc(3)</seecref> is an
Erlang Run-Time System internal memory allocator library.
<c>erts_alloc_config</c> is intended to be used to aid creation
diff --git a/lib/runtime_tools/doc/src/system_information.xml b/lib/runtime_tools/doc/src/system_information.xml
index f52f461ddb..b8ccc73418 100644
--- a/lib/runtime_tools/doc/src/system_information.xml
+++ b/lib/runtime_tools/doc/src/system_information.xml
@@ -74,7 +74,7 @@
versions</seeguide> of the same application installed in the
system, but you do not use a
<seeguide marker="system/system_principles:system_principles#BOOTSCRIPT">boot
- script</seeguide> identifing the correct application version.</p>
+ script</seeguide> identifying the correct application version.</p>
</item>
</taglist>
<p>Currently the sanity check is limited to verifying
diff --git a/lib/runtime_tools/src/Makefile b/lib/runtime_tools/src/Makefile
index 76286c5499..8e8c4074f5 100644
--- a/lib/runtime_tools/src/Makefile
+++ b/lib/runtime_tools/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2018. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -79,7 +79,7 @@ ERL_COMPILE_FLAGS += \
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/runtime_tools/src/appmon_info.erl b/lib/runtime_tools/src/appmon_info.erl
index ebff52664d..ad08a6c66f 100644
--- a/lib/runtime_tools/src/appmon_info.erl
+++ b/lib/runtime_tools/src/appmon_info.erl
@@ -40,11 +40,11 @@
%% have a nice public interface function which should handle task
%% administration. Tasks are identified by a "key" consisting of
%% three items, the requesting pid, the name of the task and the
-%% task auxillary parameter. The requesting pid is the pid of the
+%% task auxiliary parameter. The requesting pid is the pid of the
%% callee (in the appmon case it can be the node window for
%% instance), the task name is whatever name the task is given
%% (in the appmon case it can be app, app_ctrl or load). The task
-%% name can be seen as the type of the task. The task auxillary
+%% name can be seen as the type of the task. The task auxiliary
%% parameter is an all purpose parameter that have a different
%% meaning for each type of task so in appmon the Aux for app
%% contains the root pid of the monitored application and in
@@ -136,7 +136,7 @@
%%----------------------------------------------------------------------
%% Public interface
%%
-%% The Aux parameter is an auxillary parameter that can be used
+%% The Aux parameter is an auxiliary parameter that can be used
%% freely by the requesting process, it is included in the work
%% task key. appmon uses it for storing the node name when
%% requesting load and app_ctrl tasks, and appmon_a uses it for
@@ -149,7 +149,7 @@
%% Do not use gen_server:start_link because we do not want the
%% appmon_info to die when initiating process dies unless special
%% conditions apply.
-%% Uhu, we don't??? Made a fix so that this proces DOES indeed die
+%% Uhu, we don't??? Made a fix so that this process DOES indeed die
%% if it's starter dies. /Gunilla
start_link(Node, Client, Opts) ->
rpc:call(Node, ?MODULE, start_link2, [self(), Client, Opts]).
@@ -473,7 +473,7 @@ get_pid(X) when is_tuple(X) -> element(2, X).
%----------------------------------------------------------------------
%%---------------------------------------------------------------------
-%% Handling process trees of processses that are linked to each other
+%% Handling process trees of processes that are linked to each other
do_find_proc(Mode, DB, GL, Avoid) ->
case get_next(DB) of
diff --git a/lib/runtime_tools/src/dbg.erl b/lib/runtime_tools/src/dbg.erl
index 7dd3c452e5..d5be9ac6a9 100644
--- a/lib/runtime_tools/src/dbg.erl
+++ b/lib/runtime_tools/src/dbg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -595,17 +595,23 @@ c(Parent, M, F, A, Flags) ->
Parent ! {self(), Res}.
stop() ->
+ {ok, _} = ctp(),
+ {ok, _} = ctpe('receive'),
+ {ok, _} = ctpe('send'),
+
Mref = erlang:monitor(process, dbg),
catch dbg ! {self(),stop},
+
receive
- {'DOWN',Mref,_,_,_} ->
- ok
+ {'DOWN',Mref,_,_,_} -> ok
end.
+%% This is a vestigial function that used to be documented as a variant of
+%% `stop/0` that also clears global function traces. Since `stop/0` now clears
+%% all tracing as the user would expect it to, we've removed this from the
+%% documentation but keep it around for backwards compatibility, much like
+%% `queue:lait`.
stop_clear() ->
- {ok, _} = ctp(),
- {ok, _} = ctpe('receive'),
- {ok, _} = ctpe('send'),
stop().
%%% Calling the server.
diff --git a/lib/runtime_tools/src/erts_alloc_config.erl b/lib/runtime_tools/src/erts_alloc_config.erl
index ed36fe0589..18587b0475 100644
--- a/lib/runtime_tools/src/erts_alloc_config.erl
+++ b/lib/runtime_tools/src/erts_alloc_config.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -31,6 +31,9 @@
-module(erts_alloc_config).
+-deprecated({'_','_', "this module will be removed in OTP 26.0. See the "
+ "documentation for details"}).
+
-record(state, {have_scenario = false,
alloc}).
@@ -265,13 +268,13 @@ strategy_str(aoff) ->
strategy_str(aoffcbf) ->
"Address order first fit carrier best fit";
strategy_str(aoffcaobf) ->
- "Address order first fit carrier adress order best fit";
+ "Address order first fit carrier address order best fit";
strategy_str(ageffcaoff) ->
"Age order first fit carrier address order first fit";
strategy_str(ageffcbf) ->
"Age order first fit carrier best fit";
strategy_str(ageffcaobf) ->
- "Age order first fit carrier adress order best fit".
+ "Age order first fit carrier address order best fit".
default_acul(A, S) ->
case carrier_migration_support(S) of
diff --git a/lib/runtime_tools/src/system_information.erl b/lib/runtime_tools/src/system_information.erl
index 9bbb87dfb4..73b4e24847 100644
--- a/lib/runtime_tools/src/system_information.erl
+++ b/lib/runtime_tools/src/system_information.erl
@@ -849,7 +849,7 @@ get_apps([Path|Paths], Apps) ->
[AppFile] ->
get_apps(Paths, [app_file_to_app(AppFile) | Apps]);
[_AppFile| _] = AppFiles ->
- %% Strange with multple .app files... Lets put them
+ %% Strange with multiple .app files... Lets put them
%% all in the list and see what we get...
lists:map(fun (AF) ->
app_file_to_app(AF)
diff --git a/lib/runtime_tools/test/Makefile b/lib/runtime_tools/test/Makefile
index e5a087f3ad..f899d53f7f 100644
--- a/lib/runtime_tools/test/Makefile
+++ b/lib/runtime_tools/test/Makefile
@@ -42,7 +42,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES)\
> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
@@ -65,5 +65,6 @@ release_tests_spec: make_emakefile
$(INSTALL_DATA) $(EMAKEFILE) runtime_tools.cover "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
@tar cf - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -)
+ $(INSTALL_DATA) $(ERL_TOP)/make/otp_version_tickets "$(RELSYSDIR)/system_information_SUITE_data"
release_docs_spec:
diff --git a/lib/runtime_tools/test/dbg_SUITE.erl b/lib/runtime_tools/test/dbg_SUITE.erl
index 44e9b7d00d..209af7be19 100644
--- a/lib/runtime_tools/test/dbg_SUITE.erl
+++ b/lib/runtime_tools/test/dbg_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -161,9 +161,9 @@ message(Config) when is_list(Config) ->
send(Config) when is_list(Config) ->
{ok, _} = start(),
- Node = start_slave(),
+ {ok, Peer, Node} = ?CT_PEER(),
rpc:call(Node, code, add_patha,
- [filename:join(proplists:get_value(data_dir, Config), "..")]),
+ [filename:dirname(proplists:get_value(data_dir, Config))]),
try
Echo = fun F() ->
receive {From, M} ->
@@ -172,7 +172,7 @@ send(Config) when is_list(Config) ->
end
end,
Rcvr = spawn_link(Echo),
- RemoteRcvr = spawn_link(Node, Echo),
+ RemoteRcvr = spawn(Node, Echo),
{ok, [{matched, _, 1}]} = dbg:p(Rcvr, send),
@@ -222,7 +222,7 @@ send(Config) when is_list(Config) ->
%% Test that distributed dbg works
dbg:tracer(Node, process, {fun myhandler/2, self()}),
Rcvr2 = spawn_link(Echo),
- RemoteRcvr2 = spawn_link(Node, Echo),
+ RemoteRcvr2 = spawn(Node, Echo),
dbg:p(Rcvr2, [send]),
dbg:p(RemoteRcvr2, [send]),
dbg:tpe(send, [{['_', hej],[],[]}]),
@@ -235,7 +235,8 @@ send(Config) when is_list(Config) ->
ok
after
- dbg:stop_clear()
+ dbg:stop_clear(),
+ peer:stop(Peer)
end.
send_test(Pid, Pattern, Msg, TraceEvent) ->
@@ -270,7 +271,7 @@ send_test_rcv(Pid, Msg, S, TraceEvent) ->
recv(Config) when is_list(Config) ->
{ok, _} = start(),
- Node = start_slave(),
+ {ok, Peer, Node} = ?CT_PEER(),
rpc:call(Node, code, add_patha,
[filename:join(proplists:get_value(data_dir, Config), "..")]),
try
@@ -281,7 +282,7 @@ recv(Config) when is_list(Config) ->
end
end,
Rcvr = spawn_link(Echo),
- RemoteRcvr = spawn_link(Node, Echo),
+ RemoteRcvr = spawn(Node, Echo),
{ok, [{matched, _, 1}]} = dbg:p(Rcvr, 'receive'),
@@ -333,7 +334,7 @@ recv(Config) when is_list(Config) ->
%% Test that distributed dbg works
dbg:tracer(Node, process, {fun myhandler/2, self()}),
Rcvr2 = spawn_link(Echo),
- RemoteRcvr2 = spawn_link(Node, Echo),
+ RemoteRcvr2 = spawn(Node, Echo),
dbg:p(Rcvr2, ['receive']),
dbg:p(RemoteRcvr2, ['receive']),
dbg:tpe('receive', [{[node(), '_', '$1'],[{'==',{element,2,'$1'}, hej}],[]}]),
@@ -346,7 +347,8 @@ recv(Config) when is_list(Config) ->
ok
after
- dbg:stop_clear()
+ dbg:stop_clear(),
+ peer:stop(Peer)
end.
recv_test(Pid, Pattern, Msg, TraceEvent) ->
@@ -382,7 +384,7 @@ recv_test_rcv(Pid, Msg, TraceEvent) ->
%% Simple test of distributed tracing
distributed(Config) when is_list(Config) ->
{ok, _} = start(),
- Node = start_slave(),
+ {ok, Peer, Node} = ?CT_PEER(),
try
RexPid = rpc:call(Node, erlang, whereis, [rex]),
RexPidList = pid_to_list(RexPid),
@@ -411,7 +413,7 @@ distributed(Config) when is_list(Config) ->
stop()
after
dbg:stop_clear(),
- stop_slave(Node)
+ peer:stop(Peer)
end,
ok.
@@ -870,7 +872,7 @@ distributed_erl_tracer(Config) ->
ok = load_nif(Config),
LNode = node(),
- RNode = start_slave(),
+ {ok, Peer, RNode} = ?CT_PEER(),
true = rpc:call(RNode, code, add_patha, [filename:join(proplists:get_value(data_dir, Config), "..")]),
ok = rpc:call(RNode, ?MODULE, load_nif, [Config]),
@@ -899,7 +901,7 @@ distributed_erl_tracer(Config) ->
RCall = spawn_link(RNode, fun() -> ?MODULE:dummy() end),
[{RCall, call, RNifProxy, RCall, {?MODULE, dummy, []}, #{}}] = flush(),
-
+ peer:stop(Peer),
ok.
load_nif(Config) ->
@@ -922,29 +924,6 @@ trace(_, _, _, _, _) ->
%% Support functions
%%
-start_slave() ->
- Name = "asdkxlkmd" ++ integer_to_list(erlang:unique_integer([positive])),
- {ok, Node} = test_server:start_node(Name,slave,[]),
- ok = wait_node(Node, 15),
- Node.
-
-stop_slave(Node) ->
- test_server:stop_node(Node).
-
-wait_node(_,0) ->
- no;
-wait_node(Node, N) ->
- case net_adm:ping(Node) of
- pong ->
- ok;
- pang ->
- receive
- after 1000 ->
- ok
- end,
- wait_node(Node, N - 1)
- end.
-
myhandler(Message, {wait_for_go,Pid}) ->
receive
{go,Pid} ->
diff --git a/lib/runtime_tools/test/dbg_SUITE_data/dbg_test.erl b/lib/runtime_tools/test/dbg_SUITE_data/dbg_test.erl
index 68ece5936e..3e7c39f8ab 100644
--- a/lib/runtime_tools/test/dbg_SUITE_data/dbg_test.erl
+++ b/lib/runtime_tools/test/dbg_SUITE_data/dbg_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -23,10 +23,10 @@
%%% This module implements a priority queue as defined in
%%% "Priority Queues and the STL" by Mark Nelson in Dr.Dobb's Journal, Jan 1996
%%% see http://web2.airmail.net/markn/articles/pq_stl/priority.htm for more
-%%% information. (A heap implementation is planned aswell)
+%%% information. (A heap implementation is planned as well)
%%%----------------------------------------------------------------------
%%% The items of the queue is kept priority sorted, and because of that,
-%%% a push() operation costs more than a pop() operation (wich only
+%%% a push() operation costs more than a pop() operation (which only
%%% needs to return the top item of the queue(read: list)).
%%%----------------------------------------------------------------------
%%% The priority queue can be deceptively nice to use when creating for
diff --git a/lib/runtime_tools/test/erts_alloc_config_SUITE.erl b/lib/runtime_tools/test/erts_alloc_config_SUITE.erl
index ed24cce0bf..10a9560b73 100644
--- a/lib/runtime_tools/test/erts_alloc_config_SUITE.erl
+++ b/lib/runtime_tools/test/erts_alloc_config_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -76,9 +76,9 @@ basic(Config) when is_list(Config) ->
os:putenv("ERL_ZFLAGS", ZFlgs ++ SbctMod),
- {ok, Node1} = start_node(Config),
+ {ok, Peer1, Node1} = ?CT_PEER(),
ok = rpc:call(Node1, ?MODULE, make_basic_config, [ErtsAllocConfig]),
- stop_node(Node1),
+ peer:stop(Peer1),
display_file(ErtsAllocConfig),
@@ -90,13 +90,12 @@ basic(Config) when is_list(Config) ->
os:putenv("ERL_ZFLAGS", ZFlgs),
- {ok, Node2} = start_node(Config,
- "-args_file " ++ ErtsAllocConfig
- ++ " -args_file " ++ ManualConfig),
+ {ok, Peer2, Node2} = ?CT_PEER(["-args_file", ErtsAllocConfig,
+ "-args_file", ManualConfig]),
{_, _, _, Cfg} = rpc:call(Node2, erlang, system_info, [allocator]),
- stop_node(Node2),
+ peer:stop(Peer2),
{value,{binary_alloc, BCfg}} = lists:keysearch(binary_alloc, 1, Cfg),
{value,{sbct, 2097152}} = lists:keysearch(sbct, 1, BCfg),
@@ -160,26 +159,6 @@ display_file(FileName) ->
io:format("eof: ~s~n", [FileName]),
ok.
-mk_name(Config) when is_list(Config) ->
- {A, B, C} = erlang:timestamp(),
- list_to_atom(atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ "-" ++ integer_to_list(A)
- ++ "-" ++ integer_to_list(B)
- ++ "-" ++ integer_to_list(C)).
-
-start_node(Config) ->
- start_node(Config, "").
-
-start_node(Config, Args) ->
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(mk_name(Config),
- slave,
- [{args, "-pa " ++ Pa ++ " " ++ Args}]).
-
-stop_node(Node) ->
- true = test_server:stop_node(Node).
-
privfile(Name, Config) ->
filename:join([proplists:get_value(priv_dir, Config),
atom_to_list(proplists:get_value(testcase, Config)) ++ "." ++ Name]).
diff --git a/lib/runtime_tools/test/system_information_SUITE.erl b/lib/runtime_tools/test/system_information_SUITE.erl
index a5a025a1cf..824b9bc5f0 100644
--- a/lib/runtime_tools/test/system_information_SUITE.erl
+++ b/lib/runtime_tools/test/system_information_SUITE.erl
@@ -182,6 +182,19 @@ end_per_group(_GroupName, _Config) ->
%% Note: This function is free to add any key/value pairs to the Config
%% variable, but should NOT alter/remove any existing entries.
%%--------------------------------------------------------------------
+init_per_testcase(sanity_check, Config) ->
+ %% We check if the test results were released using a version
+ %% of Erlang/OTP that was a tagged version or not. On a non-tagged
+ %% version this testcase most likely will fail.
+ case file:read_file(
+ filename:join(
+ proplists:get_value(data_dir,Config), "otp_version_tickets")) of
+ {ok,<<"DEVELOPMENT",_/binary>>} ->
+ {skip, "This is a development version, test might fail "
+ "because of incorrect version numbers"};
+ {ok,S} ->
+ Config
+ end;
init_per_testcase(_TestCase, Config) ->
Config.
diff --git a/lib/sasl/Makefile b/lib/sasl/Makefile
index 4f32f0ec0c..4b04c1aee4 100644
--- a/lib/sasl/Makefile
+++ b/lib/sasl/Makefile
@@ -37,5 +37,6 @@ SPECIAL_TARGETS =
include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=tools
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/sasl/doc/src/release_handler.xml b/lib/sasl/doc/src/release_handler.xml
index 55ec4cdb0f..cb9ce94f15 100644
--- a/lib/sasl/doc/src/release_handler.xml
+++ b/lib/sasl/doc/src/release_handler.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -202,6 +202,7 @@
</func>
<func>
+ <name since="OTP @OTP-17304@">create_RELEASES(RelDir, RelFile, AppDirs) -> ok | {error, Reason}</name>
<name since="">create_RELEASES(Root, RelDir, RelFile, AppDirs) -> ok | {error, Reason}</name>
<fsummary>Creates an initial <c>RELEASES</c> file.</fsummary>
<type>
@@ -215,12 +216,19 @@
<p>Creates an initial <c>RELEASES</c> file to be used by the
release handler. This file must exist to install new
releases.</p>
- <p><c>Root</c> is the root of the installation (<c>$ROOT</c>) as
- described earlier. <c>RelDir</c> is the directory where
- the <c>RELEASES</c> file is to be created (normally
- <c>$ROOT/releases</c>). <c>RelFile</c> is the name
- of the <c>.rel</c> file that describes the initial release,
- including the extension <c>.rel</c>.</p>
+ <p><c>Root</c> is the root of the installation (<c>$ROOT</c>)
+ as described earlier. <c>RelDir</c> is the directory where the
+ <c>RELEASES</c> file is to be created (normally
+ <c>$ROOT/releases</c>). <c>RelFile</c> is the name of the
+ <c>.rel</c> file that describes the initial release, including
+ the extension <c>.rel</c>. If <c>Root</c> is not given,
+ the <c>RELEASES</c> file will be location independent (i.e, it
+ will not contain absolute paths unless there are absolute
+ paths in <c>AppDirs</c>). A <c>RELEASES</c> file should be
+ made location independent if the installation's <c>$ROOT</c>
+ is unknown. The <c>release_handler</c> module will interpret
+ relative paths in a running system's <c>RELEASES</c> file as
+ being relative to <c>$ROOT</c>.</p>
<p><c>AppDirs</c> can be used to specify from where the modules
for the specified applications are to be loaded. <c>App</c> is
the name of an application, <c>Vsn</c> is the version, and
diff --git a/lib/sasl/examples/src/Makefile b/lib/sasl/examples/src/Makefile
index e8b903f252..6b6f872221 100644
--- a/lib/sasl/examples/src/Makefile
+++ b/lib/sasl/examples/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2010-2016. All Rights Reserved.
+# Copyright Ericsson AB 2010-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -fr $(TARGET_FILES) *~ *.beam
diff --git a/lib/sasl/examples/src/target_system.erl b/lib/sasl/examples/src/target_system.erl
index b3d6748306..8a68dd379d 100644
--- a/lib/sasl/examples/src/target_system.erl
+++ b/lib/sasl/examples/src/target_system.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2011-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2011-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -35,9 +35,9 @@ create(RelFileName,SystoolsOpts) ->
Dir = filename:dirname(RelFileName),
PlainRelFileName = filename:join(Dir,"plain"),
PlainRelFile = PlainRelFileName ++ ".rel",
- io:fwrite("Reading file: ~tp ...~n", [RelFile]),
+ io:fwrite("Reading file: ~ts ...~n", [RelFile]),
{ok, [RelSpec]} = file:consult(RelFile),
- io:fwrite("Creating file: ~tp from ~tp ...~n",
+ io:fwrite("Creating file: ~ts from ~ts ...~n",
[PlainRelFile, RelFile]),
{release,
{RelName, RelVsn},
@@ -67,32 +67,32 @@ create(RelFileName,SystoolsOpts) ->
make_script(RelFileName,SystoolsOpts),
TarFileName = RelFileName ++ ".tar.gz",
- io:fwrite("Creating tar file ~tp ...~n", [TarFileName]),
+ io:fwrite("Creating tar file ~ts ...~n", [TarFileName]),
make_tar(RelFileName,SystoolsOpts),
TmpDir = filename:join(Dir,"tmp"),
io:fwrite("Creating directory ~tp ...~n",[TmpDir]),
file:make_dir(TmpDir),
- io:fwrite("Extracting ~tp into directory ~tp ...~n", [TarFileName,TmpDir]),
+ io:fwrite("Extracting ~ts into directory ~ts ...~n", [TarFileName,TmpDir]),
extract_tar(TarFileName, TmpDir),
TmpBinDir = filename:join([TmpDir, "bin"]),
ErtsBinDir = filename:join([TmpDir, "erts-" ++ ErtsVsn, "bin"]),
- io:fwrite("Deleting \"erl\" and \"start\" in directory ~tp ...~n",
+ io:fwrite("Deleting \"erl\" and \"start\" in directory ~ts ...~n",
[ErtsBinDir]),
file:delete(filename:join([ErtsBinDir, "erl"])),
file:delete(filename:join([ErtsBinDir, "start"])),
- io:fwrite("Creating temporary directory ~tp ...~n", [TmpBinDir]),
+ io:fwrite("Creating temporary directory ~ts ...~n", [TmpBinDir]),
file:make_dir(TmpBinDir),
- io:fwrite("Copying file \"~ts.boot\" to ~tp ...~n",
+ io:fwrite("Copying file \"~ts.boot\" to ~ts ...~n",
[PlainRelFileName, filename:join([TmpBinDir, "start.boot"])]),
copy_file(PlainRelFileName++".boot",filename:join([TmpBinDir, "start.boot"])),
io:fwrite("Copying files \"epmd\", \"run_erl\" and \"to_erl\" from \n"
- "~tp to ~tp ...~n",
+ "~ts to ~ts ...~n",
[ErtsBinDir, TmpBinDir]),
copy_file(filename:join([ErtsBinDir, "epmd"]),
filename:join([TmpBinDir, "epmd"]), [preserve]),
@@ -104,15 +104,15 @@ create(RelFileName,SystoolsOpts) ->
%% This is needed if 'start' script created from 'start.src' shall
%% be used as it points out this directory as log dir for 'run_erl'
TmpLogDir = filename:join([TmpDir, "log"]),
- io:fwrite("Creating temporary directory ~tp ...~n", [TmpLogDir]),
+ io:fwrite("Creating temporary directory ~ts ...~n", [TmpLogDir]),
ok = file:make_dir(TmpLogDir),
StartErlDataFile = filename:join([TmpDir, "releases", "start_erl.data"]),
- io:fwrite("Creating ~tp ...~n", [StartErlDataFile]),
+ io:fwrite("Creating ~ts ...~n", [StartErlDataFile]),
StartErlData = io_lib:fwrite("~s ~s~n", [ErtsVsn, RelVsn]),
write_file(StartErlDataFile, StartErlData),
- io:fwrite("Recreating tar file ~tp from contents in directory ~tp ...~n",
+ io:fwrite("Recreating tar file ~ts from contents in directory ~ts ...~n",
[TarFileName,TmpDir]),
{ok, Tar} = erl_tar:open(TarFileName, [write, compressed]),
%% {ok, Cwd} = file:get_cwd(),
@@ -125,14 +125,14 @@ create(RelFileName,SystoolsOpts) ->
erl_tar:add(Tar, filename:join(TmpDir,"log"), "log", []),
erl_tar:close(Tar),
%% file:set_cwd(Cwd),
- io:fwrite("Removing directory ~tp ...~n",[TmpDir]),
+ io:fwrite("Removing directory ~ts ...~n",[TmpDir]),
remove_dir_tree(TmpDir),
ok.
install(RelFileName, RootDir) ->
TarFile = RelFileName ++ ".tar.gz",
- io:fwrite("Extracting ~tp ...~n", [TarFile]),
+ io:fwrite("Extracting ~ts ...~n", [TarFile]),
extract_tar(TarFile, RootDir),
StartErlDataFile = filename:join([RootDir, "releases", "start_erl.data"]),
{ok, StartErlData} = read_txt_file(StartErlDataFile),
diff --git a/lib/sasl/src/Makefile b/lib/sasl/src/Makefile
index 16a42caf11..490e03595d 100644
--- a/lib/sasl/src/Makefile
+++ b/lib/sasl/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2020. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -69,7 +69,7 @@ ERL_COMPILE_FLAGS += -I../../stdlib/include -Werror
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/sasl/src/release_handler.erl b/lib/sasl/src/release_handler.erl
index 48feac1a21..7635b1ef78 100644
--- a/lib/sasl/src/release_handler.erl
+++ b/lib/sasl/src/release_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@
%% External exports
-export([start_link/0,
- create_RELEASES/1, create_RELEASES/2, create_RELEASES/4,
+ create_RELEASES/1, create_RELEASES/2, create_RELEASES/3, create_RELEASES/4,
unpack_release/1,
check_install_release/1, check_install_release/2,
install_release/1, install_release/2, new_emulator_upgrade/2,
@@ -43,7 +43,13 @@
-export([do_write_release/3, do_copy_file/2, do_copy_files/2,
do_copy_files/1, do_rename_files/1, do_remove_files/1,
remove_file/1, do_write_file/2, do_write_file/3,
- do_ensure_RELEASES/1]).
+ do_ensure_RELEASES/1,
+ consult/2,
+ root_dir_relative_read_file_info/1,
+ root_dir_relative_read_file/1,
+ root_dir_relative_rename_file/2,
+ root_dir_relative_make_dir/1,
+ root_dir_relative_ensure_dir/1]).
-record(state, {unpurged = [],
root,
@@ -134,9 +140,9 @@
%%
%% It is configurable where the start file is located, and what it
%% is called.
-%% The paramater is {sasl, start_prg} = File
+%% The parameter is {sasl, start_prg} = File
%% It is also configurable where the releases directory is located.
-%% Default is $ROOT/releases. $RELDIR overrids, and
+%% Default is $ROOT/releases. $RELDIR overrides, and
%% {sasl, releases_dir} overrides both.
%%-----------------------------------------------------------------
start_link() ->
@@ -162,7 +168,7 @@ unpack_release(ReleaseName) ->
%% Purpose: Checks the relup script for the specified version.
%% The release must be unpacked.
%% Options = [purge] - all old code that can be soft purged
-%% will be purged if all checks succeeds. This can be usefull
+%% will be purged if all checks succeeds. This can be useful
%% in order to reduce time needed in the following call to
%% install_release.
%% Returns: {ok, FromVsn, Descr} | {error, Reason}
@@ -298,7 +304,7 @@ remove_release(Vsn) ->
%% .rel.
%% The release dir will be created. The necessary files can
%% be installed by calling install_file/2.
-%% The release_handler remebers where all libs are located.
+%% The release_handler remembers where all libs are located.
%% If remove_release is called later,
%% those libs are removed as well (if no other releases uses
%% them).
@@ -378,6 +384,8 @@ create_RELEASES([Root, RelFile | LibDirs]) ->
create_RELEASES(Root, RelFile) ->
create_RELEASES(Root, filename:join(Root, "releases"), RelFile, []).
+create_RELEASES(RelDir, RelFile, LibDirs) ->
+ create_RELEASES("", RelDir, RelFile, LibDirs).
create_RELEASES(Root, RelDir, RelFile, LibDirs) ->
case catch check_rel(Root, RelFile, LibDirs, false) of
{error, Reason } ->
@@ -397,7 +405,8 @@ create_RELEASES(Root, RelDir, RelFile, LibDirs) ->
%% located under Dir/ebin
%% Purpose: Upgrade to the version in Dir according to an appup file
%%-----------------------------------------------------------------
-upgrade_app(App, NewDir) ->
+upgrade_app(App, NewDir1) ->
+ NewDir = root_dir_relative_path(NewDir1),
try upgrade_script(App, NewDir) of
{ok, NewVsn, Script} ->
eval_appup_script(App, NewVsn, NewDir, Script)
@@ -435,7 +444,8 @@ downgrade_app(App, OldVsn, OldDir) ->
{error, Reason}
end.
-upgrade_script(App, NewDir) ->
+upgrade_script(App, NewDir1) ->
+ NewDir = root_dir_relative_path(NewDir1),
OldVsn = ensure_running(App),
OldDir = code:lib_dir(App),
{NewVsn, Script} = find_script(App, NewDir, OldVsn, up),
@@ -489,7 +499,8 @@ ensure_running(App) ->
end.
find_script(App, Dir, OldVsn, UpOrDown) ->
- Appup = filename:join([Dir, "ebin", atom_to_list(App)++".appup"]),
+ Appup1 = filename:join([Dir, "ebin", atom_to_list(App)++".appup"]),
+ Appup = root_dir_relative_path(Appup1),
case file:consult(Appup) of
{ok, [{NewVsn, UpFromScripts, DownToScripts}]} ->
Scripts = case UpOrDown of
@@ -522,7 +533,7 @@ read_app(App, Vsn, Dir) ->
read_appspec(App, Dir) ->
AppS = atom_to_list(App),
- Path = [filename:join(Dir, "ebin")],
+ Path = [root_dir_relative_path(filename:join(Dir, "ebin"))],
case file:path_consult(Path, AppS++".app") of
{ok, AppSpecL, _File} ->
AppSpecL;
@@ -833,7 +844,9 @@ do_unpack_release(Root, RelDir, ReleaseName, Releases) ->
Rel = ReleaseName ++ ".rel",
_ = extract_rel_file(filename:join("releases", Rel), Tar, Root),
RelFile = filename:join(RelDir, Rel),
- Release = check_rel(Root, RelFile, false),
+ %% Send an empty string as Root as the library locations should
+ %% appear as paths relative to the root
+ Release = check_rel("", RelFile, false),
#release{vsn = Vsn} = Release,
case lists:keysearch(Vsn, #release.vsn, Releases) of
{value, _} -> throw({error, {existing_release, Vsn}});
@@ -850,8 +863,8 @@ do_unpack_release(Root, RelDir, ReleaseName, Releases) ->
copy_file(RelFile, Dir, false),
%% Clean release
- _ = file:delete(Tar),
- _ = file:delete(RelFile),
+ _ = root_dir_relative_file_delete(Tar),
+ _ = root_dir_relative_file_delete(RelFile),
{ok, NewReleases, Vsn}.
@@ -883,7 +896,19 @@ check_rel_data({release, {Name, Vsn}, {erts, EVsn}, Libs}, Root, LibDirs,
check_path(Path, Masters),
Path;
_ ->
- filename:join([Root, "lib", LibName])
+ %% If Root is an empty string,
+ %% we assume that the path is
+ %% relative to code:root_dir()
+ %% and save a relative
+ %% path. This is done to make it
+ %% easy to create a relocatable
+ %% RELEASES file.
+ case string:length(Root) of
+ 0 ->
+ filename:join("lib", LibName);
+ _ ->
+ filename:join([Root, "lib", LibName])
+ end
end,
{Lib, LibVsn, LibDir}
end,
@@ -894,7 +919,7 @@ check_rel_data(RelData, _Root, _LibDirs, _Masters) ->
throw({error, {bad_rel_data, RelData}}).
check_path(Path) ->
- check_path_response(Path, file:read_file_info(Path)).
+ check_path_response(Path, root_dir_relative_read_file_info(Path)).
check_path(Path, false) -> check_path(Path);
check_path(Path, Masters) -> check_path_master(Masters, Path).
@@ -904,7 +929,7 @@ check_path(Path, Masters) -> check_path_master(Masters, Path).
%% at one node it should not exist at any other node either.
%%-----------------------------------------------------------------
check_path_master([Master|Ms], Path) ->
- case rpc:call(Master, file, read_file_info, [Path]) of
+ case rpc:call(Master, ?MODULE, root_dir_relative_read_file_info, [Path]) of
{badrpc, _} -> consult_master(Ms, Path);
Res -> check_path_response(Path, Res)
end;
@@ -1168,7 +1193,7 @@ new_emulator_rm_tmp_release(?tmp_vsn(_)=TmpVsn,EVsn,NewVsn,
new_emulator_rm_tmp_release(_,_,_,_,Releases,_) ->
Releases.
-%% Rename the tempoarary service (for erts ugprade) to the real ToVsn
+%% Rename the temporary service (for erts ugprade) to the real ToVsn
rename_tmp_service(EVsn,TmpVsn,NewVsn) ->
FromName = hd(string:lexemes(atom_to_list(node()),"@")) ++ "_" ++ TmpVsn,
ToName = hd(string:lexemes(atom_to_list(node()),"@")) ++ "_" ++ NewVsn,
@@ -1573,14 +1598,14 @@ memlib(_Lib, []) -> false.
%% recursively remove file or directory
remove_file(File) ->
- case file:read_link_info(File) of
+ case root_dir_relative_read_link_info(File) of
{ok, Info} when Info#file_info.type==directory ->
- case file:list_dir(File) of
+ case root_dir_relative_list_dir(File) of
{ok, Files} ->
lists:foreach(fun(File2) ->
remove_file(filename:join(File,File2))
end, Files),
- case file:del_dir(File) of
+ case root_dir_relative_dir_delete(File) of
ok -> ok;
{error, Reason} -> throw({error, Reason})
end;
@@ -1588,7 +1613,7 @@ remove_file(File) ->
throw({error, Reason})
end;
{ok, _Info} ->
- case file:delete(File) of
+ case root_dir_relative_file_delete(File) of
ok -> ok;
{error, Reason} -> throw({error, Reason})
end;
@@ -1599,7 +1624,8 @@ remove_file(File) ->
do_write_file(File, Str) ->
do_write_file(File, Str, []).
-do_write_file(File, Str, FileOpts) ->
+do_write_file(File1, Str, FileOpts) ->
+ File = root_dir_relative_path(File1),
case file:open(File, [write | FileOpts]) of
{ok, Fd} ->
io:put_chars(Fd, Str),
@@ -1822,13 +1848,13 @@ check_file_masters(_FileName, _Type, []) ->
%% Type == regular | directory
do_check_file(FileName, Type) ->
- case file:read_file_info(FileName) of
+ case root_dir_relative_read_file_info(FileName) of
{ok, Info} when Info#file_info.type==Type -> ok;
{error, _Reason} -> throw({error, {no_such_file, FileName}})
end.
do_check_file(Master, FileName, Type) ->
- case rpc:call(Master, file, read_file_info, [FileName]) of
+ case rpc:call(Master, ?MODULE, root_dir_relative_read_file_info, [FileName]) of
{ok, Info} when Info#file_info.type==Type -> ok;
_ -> throw({error, {no_such_file, {Master, FileName}}})
end.
@@ -1871,7 +1897,8 @@ write_releases_1(Dir, NewReleases, Masters) ->
write_releases_m(Dir, NewReleases, Masters).
do_write_release(Dir, RELEASES, NewReleases) ->
- case file:open(filename:join(Dir, RELEASES), [write,{encoding,utf8}]) of
+ ReleasesFile = root_dir_relative_path(filename:join(Dir, RELEASES)),
+ case file:open(ReleasesFile, [write,{encoding,utf8}]) of
{ok, Fd} ->
ok = io:format(Fd, "%% ~s~n~tp.~n",
[epp:encoding_to_string(utf8),NewReleases]),
@@ -1908,7 +1935,8 @@ write_releases_m(Dir, NewReleases, Masters) ->
remove_files(all, [Backup, Change], Masters),
ok;
{error, {Master, R}} ->
- takewhile(Master, Masters, file, rename,
+ takewhile(Master, Masters, ?MODULE,
+ root_dir_relative_rename_file,
[Backup, RelFile]),
remove_files(all, [Backup, Change], Masters),
throw({error, {Master, R, move_releases}})
@@ -1959,9 +1987,9 @@ do_copy_file(File, Dir) ->
do_copy_file1(File, File2).
do_copy_file1(File, File2) ->
- case file:read_file(File) of
+ case root_dir_relative_read_file(File) of
{ok, Bin} ->
- case file:write_file(File2, Bin) of
+ case root_dir_relative_write_file(File2, Bin) of
ok -> ok;
{error, Reason} ->
{error, {Reason, File2}}
@@ -1995,7 +2023,9 @@ do_copy_files([]) ->
%%-----------------------------------------------------------------
%% Rename each Src file to Dest file in the list of files.
%%-----------------------------------------------------------------
-do_rename_files([{Src, Dest}|Files]) ->
+do_rename_files([{Src1, Dest1}|Files]) ->
+ Src = root_dir_relative_path(Src1),
+ Dest = root_dir_relative_path(Dest1),
case file:rename(Src, Dest) of
ok -> do_rename_files(Files);
Error -> Error
@@ -2007,7 +2037,7 @@ do_rename_files([]) ->
%% Remove a list of files. Ignore failure.
%%-----------------------------------------------------------------
do_remove_files([File|Files]) ->
- _ = file:delete(File),
+ _ = root_dir_relative_file_delete(File),
do_remove_files(Files);
do_remove_files([]) ->
ok.
@@ -2018,7 +2048,7 @@ do_remove_files([]) ->
%% If not create an empty RELEASES file.
%%-----------------------------------------------------------------
do_ensure_RELEASES(RelFile) ->
- case file:read_file_info(RelFile) of
+ case root_dir_relative_read_file_info(RelFile) of
{ok, _} -> ok;
_ -> do_write_file(RelFile, "[]. ")
end.
@@ -2026,11 +2056,16 @@ do_ensure_RELEASES(RelFile) ->
%%-----------------------------------------------------------------
%% Make a directory, ignore failures (captured later).
%%-----------------------------------------------------------------
-make_dir(Dir, false) ->
+make_dir(Dir1, false) ->
+ Dir = root_dir_relative_path(Dir1),
_ = file:make_dir(Dir),
ok;
make_dir(Dir, Masters) ->
- lists:foreach(fun(Master) -> rpc:call(Master, file, make_dir, [Dir]) end,
+ lists:foreach(fun(Master) -> rpc:call(Master,
+ ?MODULE,
+ root_dir_relative_make_dir,
+ [Dir])
+ end,
Masters).
%%-----------------------------------------------------------------
@@ -2068,7 +2103,7 @@ takewhile(Master, Masters, M, F, A) ->
end, Masters),
ok.
-consult(File, false) -> file:consult(File);
+consult(File, false) -> file:consult(root_dir_relative_path(File));
consult(File, Masters) -> consult_master(Masters, File).
%%-----------------------------------------------------------------
@@ -2077,7 +2112,7 @@ consult(File, Masters) -> consult_master(Masters, File).
%% not exist at any other node either.
%%-----------------------------------------------------------------
consult_master([Master|Ms], File) ->
- case rpc:call(Master, file, consult, [File]) of
+ case rpc:call(Master, ?MODULE, consult, [File, false]) of
{badrpc, _} -> consult_master(Ms, File);
Res -> Res
end;
@@ -2085,12 +2120,12 @@ consult_master([], _File) ->
{error, no_master}.
read_file(File, false) ->
- file:read_file(File);
+ root_dir_relative_read_file(File);
read_file(File, Masters) ->
read_master(Masters, File).
write_file(File, Data, false) ->
- case file:write_file(File, Data) of
+ case root_dir_relative_write_file(File, Data) of
ok -> ok;
Error -> throw(Error)
end;
@@ -2101,12 +2136,12 @@ write_file(File, Data, Masters) ->
end.
ensure_dir(File, false) ->
- case filelib:ensure_dir(File) of
+ case root_dir_relative_ensure_dir(File) of
ok -> ok;
Error -> throw(Error)
end;
ensure_dir(File, Masters) ->
- case at_all_masters(Masters,filelib,ensure_dir,[File]) of
+ case at_all_masters(Masters,?MODULE,root_dir_relative_ensure_dir,[File]) of
ok -> ok;
Error -> throw(Error)
end.
@@ -2130,7 +2165,7 @@ remove_files(Master, Files, Masters) ->
%% not exist at any other node either.
%%-----------------------------------------------------------------
read_master([Master|Ms], File) ->
- case rpc:call(Master, file, read_file, [File]) of
+ case rpc:call(Master, ?MODULE, root_dir_relative_read_file, [File]) of
{badrpc, _} -> read_master(Ms, File);
Res -> Res
end;
@@ -2275,7 +2310,7 @@ safe_write_file_m(File, Data, FileOpts, Masters) ->
%%
%% A different situation is when the same application version is used
%% in old and new release, but the path has changed. This is not
-%% handled here - instead it must be explicitely indicated by the
+%% handled here - instead it must be explicitly indicated by the
%% 'update_paths' option to release_handler:install_release/2 if the
%% code path shall be updated then.
%% -----------------------------------------------------------------
@@ -2299,3 +2334,47 @@ get_releases_with_status([ {_, _, _, ReleaseStatus } = Head | Tail],
get_releases_with_status(Tail, Status, [Head | Acc]);
get_releases_with_status([_ | Tail], Status, Acc) ->
get_releases_with_status(Tail, Status, Acc).
+
+root_dir_relative_read_link_info(File) ->
+ file:read_link_info(root_dir_relative_path(File)).
+
+root_dir_relative_list_dir(File) ->
+ file:list_dir(root_dir_relative_path(File)).
+
+root_dir_relative_file_delete(File) ->
+ file:delete(root_dir_relative_path(File)).
+
+root_dir_relative_dir_delete(File) ->
+ file:del_dir(root_dir_relative_path(File)).
+
+root_dir_relative_path(Pathname) ->
+ case filename:pathtype(Pathname) of
+ relative ->
+ filename:join(code:root_dir(), Pathname);
+ _ ->
+ Pathname
+ end.
+
+root_dir_relative_write_file(File, Bin) ->
+ file:write_file(root_dir_relative_path(File), Bin).
+
+%% The root_dir_relative* functions below are exported so that they
+%% can be called on other nodes with rpc
+
+root_dir_relative_read_file_info(Path) ->
+ file:read_file_info(root_dir_relative_path(Path)).
+
+root_dir_relative_read_file(File) ->
+ file:read_file(root_dir_relative_path(File)).
+
+root_dir_relative_rename_file(Source1, Destination1) ->
+ Source = root_dir_relative_path(Source1),
+ Destination = root_dir_relative_path(Destination1),
+ file:rename(Source, Destination).
+
+root_dir_relative_make_dir(Dir) ->
+ file:make_dir(root_dir_relative_path(Dir)).
+
+root_dir_relative_ensure_dir(Dir) ->
+ filelib:ensure_dir(root_dir_relative_path(Dir)).
+
diff --git a/lib/sasl/src/release_handler_1.erl b/lib/sasl/src/release_handler_1.erl
index ede7df186b..3a5883dfb9 100644
--- a/lib/sasl/src/release_handler_1.erl
+++ b/lib/sasl/src/release_handler_1.erl
@@ -248,7 +248,7 @@ syntax_check_script([]) ->
%% {load_object_code, [Mod1, Mod2]},
%% % delete old version
%% {remove, {Mod1, brutal_purge}}, {remove, {Mod2, brutal_purge}},
-%% % now, some procs migth be running prev current (now old) version
+%% % now, some procs might be running prev current (now old) version
%% % kill them, and load new version
%% {load, {Mod1, brutal_purge}}, {load, {Mod2, brutal_purge}}
%% % now, there is one version of the code (new, current)
@@ -279,7 +279,7 @@ syntax_check_script([]) ->
%% If a process doesn't repsond - never mind. It will be killed
%% later on (if a purge is performed).
%% Hmm, we must do something smart here... we should probably kill it,
-%% but we cant, because its supervisor will restart it directly! Maybe
+%% but we can't, because its supervisor will restart it directly! Maybe
%% we should keep a list of those, call supervisor:terminate_child()
%% when all others are suspended, and call sup:restart_child() when the
%% others are resumed.
@@ -313,7 +313,7 @@ eval({load_object_code, {Lib, LibVsn, Modules}}, EvalState) ->
{NewBins, NewVsns} =
lists:foldl(fun(Mod, {Bins, Vsns}) ->
File = lists:concat([Mod, Ext]),
- FName = filename:join([LibDir, "ebin", File]),
+ FName = root_dir_relative_path(filename:join([LibDir, "ebin", File])),
case erl_prim_loader:get_file(FName) of
{ok, Bin, FName2} ->
NVsns = add_vsns(Mod, Bin, Vsns),
@@ -340,14 +340,15 @@ eval(point_of_no_return, EvalState) ->
EvalState#eval_state.libdirs
end,
lists:foreach(fun({Lib, _LibVsn, LibDir}) ->
- Ebin = filename:join(LibDir,"ebin"),
+ Ebin = root_dir_relative_path(filename:join(LibDir,"ebin")),
code:replace_path(Lib, Ebin)
end,
Libs),
EvalState;
eval({load, {Mod, _PrePurgeMethod, PostPurgeMethod}}, EvalState) ->
Bins = EvalState#eval_state.bins,
- {value, {_Mod, Bin, File}} = lists:keysearch(Mod, 1, Bins),
+ {value, {_Mod, Bin, File1}} = lists:keysearch(Mod, 1, Bins),
+ File = root_dir_relative_path(File1),
% load_binary kills all procs running old code
% if soft_purge, we know that there are no such procs now
{module,_} = code:load_binary(Mod, File, Bin),
@@ -804,3 +805,12 @@ get_vsn(Bin) ->
Vsn
end
end.
+
+root_dir_relative_path(Pathname) ->
+ case filename:pathtype(Pathname) of
+ relative ->
+ filename:join(code:root_dir(), Pathname);
+ _ ->
+ Pathname
+ end.
+
diff --git a/lib/sasl/src/sasl.app.src b/lib/sasl/src/sasl.app.src
index 293af504df..8fc41ca506 100644
--- a/lib/sasl/src/sasl.app.src
+++ b/lib/sasl/src/sasl.app.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -42,6 +42,6 @@
{applications, [kernel, stdlib]},
{env, []},
{mod, {sasl, []}},
- {runtime_dependencies, ["tools-2.6.14","stdlib-3.4","kernel-5.3",
+ {runtime_dependencies, ["tools-2.6.14","stdlib-3.4","kernel-6.0",
"erts-10.2"]}]}.
diff --git a/lib/sasl/src/systools.erl b/lib/sasl/src/systools.erl
index a97db3a20e..889cf924a3 100644
--- a/lib/sasl/src/systools.erl
+++ b/lib/sasl/src/systools.erl
@@ -43,7 +43,7 @@
%%-----------------------------------------------------------------
%% Options is a list of {path, Path} | silent | local where path sets
-%% the search path, silent supresses error message printing on console,
+%% the search path, silent suppresses error message printing on console,
%% local generates a script with references to the directories there
%% the applications are found.
%%-----------------------------------------------------------------
@@ -57,7 +57,7 @@ make_script(RelName, Opt) ->
%%-----------------------------------------------------------------
%% Options is a list of {path, Path} | silent |
%% {dirs, [src,include,examples,..]} | {erts, ErtsDir} where path
-%% sets the search path, silent supresses error message printing on console,
+%% sets the search path, silent suppresses error message printing on console,
%% dirs includes the specified directories (per application) in the
%% release package and erts specifies that the erts-Vsn/bin directory
%% should be included in the release package and there it can be found.
@@ -116,8 +116,8 @@ script2boot(File, Output0, _Opt) ->
%%-----------------------------------------------------------------
%% Options is a list of {path, Path} | silent | noexec where path sets
-%% search path, silent supresses error message printing on console,
-%% noexec supresses writing the output "relup" file
+%% search path, silent suppresses error message printing on console,
+%% noexec suppresses writing the output "relup" file
%%-----------------------------------------------------------------
make_relup(ReleaseName, UpNameList, DownNameList) ->
systools_relup:mk_relup(ReleaseName, UpNameList, DownNameList, []).
diff --git a/lib/sasl/src/systools_make.erl b/lib/sasl/src/systools_make.erl
index ca4fb4300a..fd2a14954a 100644
--- a/lib/sasl/src/systools_make.erl
+++ b/lib/sasl/src/systools_make.erl
@@ -56,7 +56,7 @@
%% Create a boot script from a release file.
%% Options is a list of {path, Path} | silent | local
%% | warnings_as_errors
-%% where path sets the search path, silent supresses error message
+%% where path sets the search path, silent suppresses error message
%% printing on console, local generates a script with references
%% to the directories there the applications are found,
%% and warnings_as_errors treats warnings as errors.
@@ -195,7 +195,7 @@ do_make_hybrid_boot(TmpVsn, OldBoot, NewBoot, Args) ->
{script,{_RelName1,_RelVsn1},OldScript} = binary_to_term(OldBoot),
{script,{NewRelName,_RelVsn2},NewScript} = binary_to_term(NewBoot),
- %% Everyting upto kernel_load_completed must come from the new script
+ %% Everything up to kernel_load_completed must come from the new script
Fun1 = fun({progress,kernel_load_completed}) -> false;
(_) -> true
end,
@@ -345,7 +345,7 @@ add_apply_upgrade(Script,Args) ->
%% Create a release package from a release file.
%% Options is a list of {path, Path} | silent |
%% {dirs, [src,include,examples,..]} | {erts, ErtsDir} where path
-%% sets the search path, silent supresses error message printing,
+%% sets the search path, silent suppresses error message printing,
%% dirs includes the specified directories (per application) in the
%% release package and erts specifies that the erts-Vsn/bin directory
%% should be included in the release package and there it can be found.
@@ -674,7 +674,7 @@ parse_application({application, Name, Dict}, File, Vsn, Incls)
parse_application(Other, _, _, _) ->
{error, {badly_formatted_application, Other}}.
-%% Test if all included applications specifed in the .rel file
+%% Test if all included applications specified in the .rel file
%% exists in the {included_applications,Incs} specified in the
%% .app file.
override_include(Name, Incs, Incls) ->
@@ -1162,12 +1162,36 @@ smart_guess(Dir,IncPath) ->
D1 = reverse(D),
Dirs = [filename:join(D1 ++ ["src"]),
filename:join(D1 ++ ["src", "e_src"])],
- {Dirs,Dirs ++ IncPath};
+ RecurseDirs = add_subdirs(Dirs),
+ {RecurseDirs,RecurseDirs ++ IncPath};
_ ->
{[Dir],[Dir] ++ IncPath}
end.
%%______________________________________________________________________
+%% add_subdirs([Dirs]) -> [Dirs]
+%% Take the directories that were used for a guess, and search them
+%% recursively. This is required for applications relying on varying
+%% nested directories. One example within OTP is the `wx' application,
+%% which has auto-generated modules in `src/gen/' and then fail any
+%% systools check.
+
+add_subdirs([]) ->
+ [];
+add_subdirs([Dir|Dirs]) ->
+ case filelib:is_dir(Dir) of
+ false ->
+ %% Keep the bad guess, but put it last in the search order
+ %% since we won't find anything there. Handling of errors
+ %% for unfound file is done in `locate_src/2'
+ add_subdirs(Dirs) ++ [Dir];
+ true ->
+ SubDirs = [File || File <- filelib:wildcard(filename:join(Dir, "**")),
+ filelib:is_dir(File)],
+ [Dir|SubDirs] ++ add_subdirs(Dirs)
+ end.
+
+%%______________________________________________________________________
%% generate_script(#release,
%% [{{Name,Vsn},#application}], Flags) ->
%% ok | {error, Error}
@@ -1346,7 +1370,7 @@ find_all(CheckingApp, [Name|T], L, Visited, Found, NotFound) ->
case find_app(Name, L) of
{value, App} ->
{_A,R} = App,
- %% It is OK to have a dependecy like
+ %% It is OK to have a dependency like
%% X includes Y, Y uses X.
case lists:member(CheckingApp, R#application.includes) of
true ->
@@ -1386,7 +1410,7 @@ del_apps([], L) ->
%%______________________________________________________________________
%% Create the load path used in the generated script.
%% If PathFlag is true a script intended to be used as a complete
-%% system (e.g. in an embbeded system), i.e. all applications are
+%% system (e.g. in an embedded system), i.e. all applications are
%% located under $ROOT/lib.
%% Otherwise all paths are set according to dir per application.
@@ -1755,7 +1779,7 @@ add_system_files(Tar, RelName, Release, Path1) ->
%% (well, actually the boot file was looked for in the same
%% directory as RelName, which is not necessarily the same as cwd)
%% --
- %% but also in the path specfied as an option to systools:make_tar
+ %% but also in the path specified as an option to systools:make_tar
%% (but make sure to search the RelName directory and cwd first)
Path = case filename:dirname(RelName) of
"." ->
diff --git a/lib/sasl/test/Makefile b/lib/sasl/test/Makefile
index 2a782bcf61..11c2a9e69f 100644
--- a/lib/sasl/test/Makefile
+++ b/lib/sasl/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2011-2016. All Rights Reserved.
+# Copyright Ericsson AB 2011-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -35,10 +35,13 @@ MODULES= \
systools_rc_SUITE \
rb_SUITE \
rh_test_lib \
+ otp_vsns
ERL_FILES= $(MODULES:%=%.erl)
-HRL_FILES= test_lib.hrl
+EXTRA_FILES= $(ERL_TOP)/otp_versions.table
+
+HRL_FILES=
TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
INSTALL_PROGS= $(TARGET_FILES)
@@ -68,7 +71,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES)\
>> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
@@ -87,9 +90,10 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) "$(RELSYSDIR)"
- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)"
+ $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(EXTRA_FILES) "$(RELSYSDIR)"
$(INSTALL_DATA) sasl.spec sasl.cover $(EMAKEFILE) "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
@tar cfh - *_SUITE_data | (cd "$(RELSYSDIR)"; tar xf -)
+ $(INSTALL_DATA) $(ERL_TOP)/make/otp_version_tickets "$(RELSYSDIR)/sasl_SUITE_data"
release_docs_spec:
diff --git a/lib/sasl/test/installer.erl b/lib/sasl/test/installer.erl
index 2c5c9d725a..05b0156574 100644
--- a/lib/sasl/test/installer.erl
+++ b/lib/sasl/test/installer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2011-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2011-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,8 +20,6 @@
-module(installer).
--include("test_lib.hrl").
-
%%-compile(export_all).
-export([install_1/2]).
-export([install_2/1]).
@@ -330,7 +328,7 @@ install_11(TestNode) ->
true = lists:member("a-1.0", Libs),
false = lists:member("a-1.1", Libs),
{ok, Dirs} = file:list_dir(code:root_dir()),
- ErtsDir = "erts-"++?ertsvsn,
+ ErtsDir = "erts-"++rh_test_lib:old_app_vsn(erts),
[ErtsDir] = lists:filter(fun(Dir) -> lists:prefix("erts-",Dir) end, Dirs),
?print(["install_11 file checks ok"]),
ok.
@@ -383,7 +381,7 @@ install_14(TestNode) ->
%%%-----------------------------------------------------------------
-%%% Ths test checks that an upgrade which both upgrades to a new
+%%% The test checks that an upgrade which both upgrades to a new
%%% emulator version, and had a restart_emulator option to
%%% systools:make_relup will be restarted twice on upgrade.
%%% (On downgrade it will happen only once.)
@@ -413,7 +411,7 @@ upgrade_restart_2(TestNode) ->
{"SASL-test","P2B"} ->
upgrade_restart_2a(TestNode);
{"SASL-test","__new_emulator__P1G"} ->
- %% catched the node too early - give it another try
+ %% caught the node too early - give it another try
{wait,whereis(init)}
end.
@@ -918,7 +916,9 @@ start_client_unix(TestNode,Sname,Node) ->
start_client_win32(TestNode,Client,ClientSname) ->
Name = atom_to_list(ClientSname) ++ "_P1G",
RootDir = code:root_dir(),
- ErtsBinDir = filename:join([RootDir,"erts-"++?ertsvsn,"bin"]),
+ ErtsBinDir = filename:join([RootDir,
+ "erts-"++rh_test_lib:old_app_vsn(erts),
+ "bin"]),
{ClientArgs,RelClientDir} = rh_test_lib:get_client_args(Client,ClientSname,
RootDir),
diff --git a/lib/sasl/test/otp_vsns.erl b/lib/sasl/test/otp_vsns.erl
new file mode 100644
index 0000000000..d88fb8a815
--- /dev/null
+++ b/lib/sasl/test/otp_vsns.erl
@@ -0,0 +1,160 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2021. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+-module(otp_vsns).
+
+-export([read_state/0, read_state/1, branch_latest/2, branch_vsns/2, app_vsn/3]).
+
+read_state() ->
+ File = "otp_versions.table",
+ Dir = filename:dirname(code:which(?MODULE)),
+ Alt0 = filename:join([Dir, File]),
+ case file:read_file_info(Alt0) of
+ {ok, _} ->
+ read_state(Alt0);
+ _ ->
+ Alt1 = filename:join([Dir, "..", "priv", File]),
+ case file:read_file_info(Alt1) of
+ {ok, _} ->
+ read_state(Alt1);
+ _ ->
+ error(no_otp_versions_table)
+ end
+ end.
+
+read_state(OtpVsnsTabFile) ->
+ {ok, OtpVsnsTabData} = file:read_file(OtpVsnsTabFile),
+ lists:foldl(fun (OtpAppVsnsBin, Acc0) ->
+ [OtpVsnBin
+ | AppVsnBins] = binary:split(OtpAppVsnsBin,
+ [<<" ">>,
+ <<":">>,
+ <<"#">>],
+ [global, trim_all]),
+ OtpVsn = mk_vsn(OtpVsnBin),
+ AppList = lists:map(fun (AppVsnBin) ->
+ AppVsn = mk_vsn(AppVsnBin),
+ {App, _} = AppVsn,
+ {App, AppVsn}
+ end,
+ AppVsnBins),
+ AppMap = maps:from_list(AppList),
+ Acc1 = maps:put(OtpVsn, AppMap, Acc0),
+ Acc2 = update_branch(OtpVsn, Acc1),
+ update_branch_versions(OtpVsn, Acc2)
+ end,
+ #{},
+ binary:split(OtpVsnsTabData, <<"\n">>, [global, trim_all])).
+
+branch_latest(State, "maint-" ++ RelStr) ->
+ mk_vsn_str(maps:get({maint, list_to_integer(RelStr)}, State)).
+
+branch_vsns(State, "maint-" ++ RelStr) ->
+ Rel = list_to_integer(RelStr),
+ NrmlVsns = lists:map(fun (V) -> mk_vsn_str(V) end,
+ maps:get({normal_maint_vsns, Rel}, State)),
+ case maps:get({maint, Rel}, State) of
+ {'OTP', [_, _]} ->
+ NrmlVsns;
+ {'OTP', [_, _, _]} ->
+ NrmlVsns;
+ {'OTP', [_, _, _, _]} = Vsn ->
+ add_branched_vsns(1, Vsn, NrmlVsns)
+ end.
+
+add_branched_vsns(MinorPatch,
+ {'OTP', [_Major, _Minor, _Patch, MinorPatch]} = Vsn,
+ VsnStrs) ->
+ [mk_vsn_str(Vsn) | VsnStrs];
+add_branched_vsns(N,
+ {'OTP', [Major, Minor, Patch, _MinorPatch]} = Vsn,
+ VsnStrs) ->
+ VsnStr = mk_vsn_str({'OTP', [Major, Minor, Patch, N]}),
+ add_branched_vsns(N+1, Vsn, [VsnStr | VsnStrs]).
+
+app_vsn(State, "OTP-"++OtpVsn, App) ->
+ AppMap = maps:get({'OTP', vsnstr2vsnlist(OtpVsn)}, State),
+ mk_vsn_str(maps:get(list_to_atom(App), AppMap)).
+
+mk_vsn_str({App, Vsn}) ->
+ VsnStr = lists:flatten(lists:join($., lists:map(fun (V) ->
+ integer_to_list(V)
+ end, Vsn))),
+ atom_to_list(App) ++ "-" ++ VsnStr.
+
+mk_vsn(AppVsnBin) ->
+ [AppBin, VsnBin] = binary:split(AppVsnBin, <<"-">>),
+ {binary_to_atom(AppBin), vsnstr2vsnlist(VsnBin)}.
+
+vsnstr2vsnlist(VsnStr) ->
+ lists:map(fun (SV) when is_list(SV) ->
+ list_to_integer(SV);
+ (BV) when is_binary(BV) ->
+ binary_to_integer(BV)
+ end, string:lexemes(VsnStr, ".")).
+
+update_branch({'OTP', [Major, Minor | _] = Vsn} = OtpVsn,
+ VsnMap) when length(Vsn) =< 4 ->
+ Branch = {maint, Major},
+ case maps:get(Branch, VsnMap, undefined) of
+ undefined ->
+ maps:put(Branch, OtpVsn, VsnMap);
+ {'OTP', [Major, OldMinor | _] = OldVsn} ->
+ if OldMinor < Minor ->
+ maps:put(Branch, OtpVsn, VsnMap);
+ OldMinor > Minor ->
+ VsnMap;
+ true ->
+ {Patch, MinorPatch} = get_patch_vsns(Vsn),
+ {OldPatch, OldMinorPatch} = get_patch_vsns(OldVsn),
+ if OldPatch < Patch ->
+ maps:put(Branch, OtpVsn, VsnMap);
+ OldPatch > Patch ->
+ VsnMap;
+ OldMinorPatch < MinorPatch ->
+ maps:put(Branch, OtpVsn, VsnMap);
+ true ->
+ VsnMap
+ end
+ end
+ end;
+update_branch({'OTP', [_Major, _Minor | _]}, VsnMap) ->
+ VsnMap.
+
+update_branch_versions({'OTP', [Rel | _] = Vsn} = OtpVsn,
+ VsnMap) when length(Vsn) =< 3 ->
+ %% Save normal versions. Branched versions are added on request
+ %% since we do not know the right branch until all versions has
+ %% been parsed.
+ BranchVsnsKey = {normal_maint_vsns, Rel},
+ OtherOtpVsns = case maps:get(BranchVsnsKey, VsnMap, undefined) of
+ undefined -> [];
+ Vsns -> Vsns
+ end,
+ maps:put(BranchVsnsKey, [OtpVsn|OtherOtpVsns], VsnMap);
+update_branch_versions({'OTP', _}, VsnMap) ->
+ VsnMap.
+
+get_patch_vsns([_Major, _Minor]) ->
+ {0, 0};
+get_patch_vsns([_Major, _Minor, Patch]) ->
+ {Patch, 0};
+get_patch_vsns([_, _, Patch, MinorPatch | _]) ->
+ {Patch, MinorPatch}.
diff --git a/lib/sasl/test/release_handler_SUITE.erl b/lib/sasl/test/release_handler_SUITE.erl
index f545590247..f0433fd522 100644
--- a/lib/sasl/test/release_handler_SUITE.erl
+++ b/lib/sasl/test/release_handler_SUITE.erl
@@ -20,7 +20,8 @@
-module(release_handler_SUITE).
-include_lib("common_test/include/ct.hrl").
--include("test_lib.hrl").
+-include_lib("stdlib/include/assert.hrl").
+-include_lib("kernel/include/file.hrl").
-compile([export_all, nowarn_export_all]).
-export([scheduler_wall_time/0, garbage_collect/0]). %% rpc'ed
@@ -60,17 +61,16 @@ win32_cases() ->
%% Cases that can be run on all platforms
cases() ->
- [otp_2740, otp_2760, otp_5761, otp_9402, otp_9417,
- otp_9395_check_old_code, otp_9395_check_and_purge,
- otp_9395_update_many_mods, otp_9395_rm_many_mods,
+ [otp_9395_check_old_code,
instructions, eval_appup, eval_appup_with_restart,
- supervisor_which_children_timeout,
- release_handler_which_releases, install_release_syntax_check,
- upgrade_supervisor, upgrade_supervisor_fail, otp_9864,
- otp_10463_upgrade_script_regexp, no_dot_erlang, unicode_upgrade].
+ install_release_syntax_check,
+ otp_10463_upgrade_script_regexp, no_dot_erlang, move_system,
+ {group, absolute}, {group, relative}].
groups() ->
- [{release,[],
+ [{absolute,[],root_dir_cases()},
+ {relative,[],root_dir_cases()},
+ {release,[],
[
{group,release_single},
{group,release_gg}
@@ -87,6 +87,22 @@ groups() ->
upgrade_gg
]}].
+%% Testcases that are to be run with and without an absolute root dir
+root_dir_cases() ->
+ [supervisor_which_children_timeout,
+ release_handler_which_releases,
+ otp_2760,
+ otp_5761,
+ otp_9402,
+ otp_9417,
+ otp_9395_check_and_purge,
+ otp_9395_update_many_mods,
+ otp_9395_rm_many_mods,
+ otp_9864,
+ upgrade_supervisor,
+ upgrade_supervisor_fail,
+ unicode_upgrade].
+
%% {group,release}
%% Top group for all cases using run_erl
init_per_group(release, Config) ->
@@ -161,8 +177,10 @@ init_per_group(release_gg, Config0) ->
Snames),
test_server:timetrap_cancel(Dog),
- [{snames,Snames}|Config].
-
+ [{snames,Snames}|Config];
+init_per_group(Group, Config) when Group =:= absolute;
+ Group =:= relative ->
+ [{root_dir, Group}|Config].
end_per_group(release, Config) ->
Dog = test_server:timetrap(?default_timeout),
@@ -244,6 +262,252 @@ gg_node_snames(Config) ->
%%%-----------------------------------------------------------------
%%% TEST CASES
+%% Test that a release can be location independent (i.e., if all
+%% paths related to the release are relative to the ROOTDIR of the
+%% release, then one can move the release to a different directory and
+%% it should still work).
+move_system(Conf) when is_list(Conf) ->
+
+ DataDir = ?config(data_dir, Conf),
+ TestRootDir = filename:join(priv_dir(Conf), ?FUNCTION_NAME),
+ ErtsBinDir = filename:join("erts-" ++ find_vsn_app(erts), "bin"),
+
+ %% Remove old test data
+ file:del_dir_r(filename:join(TestRootDir,"system")),
+ file:del_dir_r(filename:join(TestRootDir,"system_moved")),
+ file:del_dir_r(filename:join(TestRootDir,"system_moved_again")),
+
+ %% Create TAR file for release A
+ ReleaseATarFile = create_release_package(DataDir, "hello_server", "A"),
+ SystemPath = filename:join(TestRootDir, "system"),
+ ok = erl_tar:extract(ReleaseATarFile, [{cwd, SystemPath}, compressed]),
+ RelDir = filename:join(SystemPath, "releases"),
+ SystemRelFile = filename:join(RelDir, "hello_server-A.rel"),
+
+ %% Create a location independent RELEASES file. Library paths in the releases
+ %% file are assumed to be relative to the RootDir.
+ ok = release_handler:create_RELEASES(RelDir, SystemRelFile, []),
+
+ %% Create the bin directory with links (or copies on windows) to the erts directory
+ file:make_dir(filename:join(SystemPath,"bin")),
+ case os:type() of
+ {win32, _} ->
+ {ok,_} = file:copy(
+ filelib:wildcard(filename:join([SystemPath,ErtsBinDir,"erl.exe"])),
+ filename:join([SystemPath,"bin","erl.exe"]));
+ _ ->
+ ok = file:make_symlink(
+ filename:join(["..",ErtsBinDir,"erl"]),
+ filename:join([SystemPath,"bin","erl"]))
+ end,
+
+ %% Test that the location independent system can start and run
+ {ok, Peer, Node} = start_remote_node(SystemPath, "A"),
+ hello = erpc:call(Node, app_callback_module, get_response, []),
+ peer:stop(Peer),
+
+ %% Should still work after copying the system and corrupting the source
+ NewSystemPath = filename:join(TestRootDir, "system_moved"),
+ copy_r(SystemPath, NewSystemPath),
+ [file:del_dir_r(F) || F <- filelib:wildcard(filename:join([SystemPath,"lib","stdlib*"]))],
+ file:del_dir_r(filename:join(SystemPath,"releases")),
+ {ok, MovedPeer, MovedNode} = start_remote_node(NewSystemPath, "A"),
+ hello = erpc:call(MovedNode, app_callback_module, get_response, []),
+ peer:stop(MovedPeer),
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %% Let us now try if a system upgrade also works with a location independent system %
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ ReleaseBTarFile = create_release_package(DataDir, "hello_server_new", "B"),
+
+ BPackDest = filename:join([NewSystemPath, "releases", filename:basename(ReleaseBTarFile)]),
+ {ok, _ } = file:copy(ReleaseBTarFile, BPackDest),
+ BTarFileName = filename:basename(ReleaseBTarFile),
+ NameToUnpack = filename:rootname(BTarFileName, ".tar.gz"),
+ %% Start remote node with release A
+ {ok, PeerA, NodeA} = start_remote_node(NewSystemPath, "A"),
+
+ %% Set current working directory to something irrelevant as the
+ %% current working directory should not affect if a system is
+ %% location independent or not
+ ok = erpc:call(NodeA, file, set_cwd, ["/"]),
+ %% Let us check our app
+ hello = erpc:call(NodeA, app_callback_module, get_response, []),
+ %% Install the next release
+ {ok, "B"} = erpc:call(NodeA, release_handler, unpack_release, [NameToUnpack]),
+ %% We can now create relup file
+ AppUpSrc = filename:join([DataDir, "relocatable_release", "hello_server_new",
+ "ebin", "hello_server.appup"]),
+ AppUpDest = filename:join([NewSystemPath, "lib", "hello_server-B", "ebin", "hello_server.appup"]),
+ {ok, _} = file:copy(AppUpSrc, AppUpDest),
+ %% Run command to create the relup file
+ ok = systools:make_relup(
+ filename:join([NewSystemPath, "releases", "B", "hello_server-B"]),
+ [filename:join([NewSystemPath, "releases", "A", "hello_server-A"])],
+ [filename:join([NewSystemPath, "releases", "A", "hello_server-A"])],
+ [{outdir,filename:join([NewSystemPath, "releases","B"])},
+ {path,[NewSystemPath ++ "/lib/hello_server-A/ebin/",
+ NewSystemPath ++ "/lib/hello_server-B/ebin/"]}]
+ ),
+ %% Install the B version
+ {ok, "A", _} = erpc:call(NodeA, release_handler, install_release, ["B"]),
+ %% Check that the releases info looks ok
+ true = lists:any(fun({"hello_server", "B", _, current}) ->
+ true;
+ (_) ->
+ false
+ end,
+ erpc:call(NodeA, release_handler, which_releases, [])),
+ %% Make sure the old module gets replaced
+ ok = erpc:call(NodeA, app_callback_module, update, []),
+ %% Check that the upgrade worked
+ hej = erpc:call(NodeA, app_callback_module, get_response, []),
+
+ case os:type() of
+ {win32, _} ->
+ %% We cannot make release permanent on windows due to
+ %% not having permissions to edit services.
+ %% And symlinks to do not on windows, so we don't test
+ %% anything more there.
+ peer:stop(PeerA);
+ _ ->
+ move_system_unix(NodeA, PeerA, TestRootDir, ErtsBinDir, NewSystemPath)
+
+ end.
+
+move_system_unix(NodeA, PeerA, TestRootDir, ErtsBinDir, NewSystemPath) ->
+ %% Make the upgrade permanent
+ ok = erpc:call(NodeA, release_handler, make_permanent, ["B"]),
+ %% Check that it still works
+ hej = erpc:call(NodeA, app_callback_module, get_response, []),
+ true = lists:any(fun({"hello_server", "B", _, permanent}) ->
+ true;
+ (_) ->
+ false
+ end,
+ erpc:call(NodeA, release_handler, which_releases, [])),
+ ok = peer:stop(PeerA),
+
+ %% We will now move the install and check that everything still seems to be working fine
+ NewSystemPath2 = filename:join(TestRootDir, "system_moved_again"),
+ ok = file:rename(NewSystemPath, NewSystemPath2),
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %% Create a symlink to moved system and test that if we set the path to
+ %% contain the symlink it will work.
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ ok = file:make_symlink(
+ filename:join([NewSystemPath2, ErtsBinDir, "erl"]),
+ filename:join(TestRootDir, "erl")),
+
+ Name = peer:random_name(),
+ LinkNode = list_to_atom(Name++"@"++lists:last(string:split(atom_to_list(node()),"@"))),
+
+ %% We cannot use ?CT_PEER here because it uses spawn_executable and that
+ %% does not search the PATH for which program to run.
+ Port = open_port(
+ {spawn,"erl -sname " ++ Name ++ " -boot " ++
+ filename:join([NewSystemPath2, "releases", "B", "start"])},
+ [{env,[{"PATH",TestRootDir ++ ":" ++ os:getenv("PATH")}]}]),
+
+ %% Wait for node to start
+ receive _ -> ok end,
+
+ hej = erpc:call(LinkNode, app_callback_module, get_response, []),
+
+ true = catch port_close(Port),
+ ct:log("~p",[(fun F() -> receive M -> [M | F()] after 0 -> [] end end)()]),
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ %% Test that we can do a downgrade of the moved system
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ {ok, PeerB, NodeB} = start_remote_node(NewSystemPath2, "B"),
+
+ %% Change current working directory to something irrelevant
+ ok = erpc:call(NodeB, file, set_cwd, ["/"]),
+ {ok, "/"} = erpc:call(NodeB, file, get_cwd, []),
+ %% Check that we are using version B
+ hej = erpc:call(NodeB, app_callback_module, get_response, []),
+ %% Downgrade to version A
+ {ok, "A", _} = erpc:call(NodeB, release_handler, install_release, ["A"]),
+ true = lists:any(fun({"hello_server", "A", _, current}) ->
+ true;
+ (_) ->
+ false
+ end,
+ erpc:call(NodeB, release_handler, which_releases, [])),
+ %% Make sure that the module is reloaded
+ ok = erpc:call(NodeB, app_callback_module, update, []),
+ %% Make sure that we are on version A
+ hello = erpc:call(NodeB, app_callback_module, get_response, []),
+ %% Make the downgrade permanent
+ ok = erpc:call(NodeB, release_handler, make_permanent, ["A"]),
+ %% Test that remove release works
+ ok = erpc:call(NodeB, release_handler, remove_release, ["B"]),
+ %% B should not exist anymore
+ false = lists:any(fun({"hello_server", "B", _, _}) ->
+ true;
+ (_) ->
+ false
+ end,
+ erpc:call(NodeB, release_handler, which_releases, [])),
+ ok = erpc:call(NodeB, app_callback_module, update, []),
+ %% We should still get hello
+ hello = erpc:call(NodeB, app_callback_module, get_response, []),
+ ok = peer:stop(PeerB),
+
+ ok.
+
+start_remote_node(SystemPath, RelVsn) ->
+ SystemErlPath = filename:join([SystemPath, "bin", "erl"]),
+ ?CT_PEER(#{ exec => SystemErlPath,
+ args => ["-boot",filename:join([SystemPath,"releases", RelVsn, "start"])]}).
+
+create_release_package(DataDir, SourceDir, RelVsn) ->
+ ReleaseSource = filename:join(DataDir, "relocatable_release"),
+ AppSrc = filename:join(ReleaseSource, SourceDir),
+ OldCWD = file:get_cwd(),
+ file:set_cwd(AppSrc),
+ os:cmd("erl -make"),
+ file:set_cwd(OldCWD),
+ RelFileScr = filename:join(ReleaseSource, "hello_server-"++ RelVsn ++".rel.src"),
+ RelFileDst = filename:join(ReleaseSource, "hello_server-"++ RelVsn ++".rel"),
+ {ok, RelFileTxt1} = file:read_file(RelFileScr),
+ RelFileTxt = fix_rel_file_vsns(["erts", "kernel", "stdlib", "sasl"],
+ RelFileTxt1),
+ ok = file:write_file(RelFileDst, RelFileTxt),
+ AppPath = filename:join([ReleaseSource, SourceDir, "ebin"]),
+ RelFileWithoutEnding = filename:join(ReleaseSource, "hello_server-" ++ RelVsn),
+ ok = systools:make_script(RelFileWithoutEnding, [local, {path, [AppPath]}]),
+ ok = systools:make_tar(RelFileWithoutEnding, [{erts, code:root_dir()}, {path, [AppPath]}]),
+ SystemPath = filename:join(ReleaseSource, "system"),
+ file:make_dir(SystemPath),
+ InitialTarPath = filename:join(ReleaseSource, "hello_server-"++ RelVsn ++".tar.gz"),
+ InitialTarPath.
+
+fix_rel_file_vsns(Apps, Txt) ->
+ Res =
+ lists:foldl(
+ fun(App, TxtAcc) ->
+ string:replace(TxtAcc,
+ "%" ++ App ++ "_VSN" ++ "%" ,
+ find_vsn_app(erlang:list_to_atom(App)))
+ end,
+ Txt,
+ Apps),
+ erlang:iolist_to_binary(lists:flatten(Res)).
+
+find_vsn_app(erts) ->
+ Str = erlang:system_info(system_version),
+ {match, [{Start, Len} | _]} = re:run(Str, "erts-(\\d\\.?)+"),
+ ErtsStr = string:substr(Str, Start+1, Len),
+ [_, Vsn] = string:split(ErtsStr, "-"),
+ Vsn;
+find_vsn_app(App) ->
+ Apps = application:which_applications(),
+ [Vsn] = [Vsn || {AppX, _, Vsn} <- Apps, AppX =:= App],
+ Vsn.
+
%% Executed instead of release group when no run_erl program exists
no_run_erl(Config) when is_list(Config) ->
@@ -390,7 +654,7 @@ upgrade_restart(Conf) when is_list(Conf) ->
ok ->
ok;
{wait,TestNodeInit2a} ->
- %% We catched the node too early - it was supposed to
+ %% We caught the node too early - it was supposed to
%% restart twice, so let's wait for one more restart.
wait_nodes_up([{TestNode,TestNodeInit2a}],"upgrade_restart_2a",[]),
ok = rpc_inst(TestNode, upgrade_restart_2a, [])
@@ -618,7 +882,7 @@ supervisor_which_children_timeout(Conf) ->
DataDir = ?config(data_dir,Conf),
LibDir = filename:join([DataDir,release_handler_timeouts]),
- Rel1 = create_and_install_fake_first_release(Dir,[{dummy,"0.1",LibDir}]),
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,[{dummy,"0.1",LibDir}]),
{ok, Node} = t_start_node(supervisor_which_children_timeout, Rel1, []),
Proc = rpc:call(Node, erlang, whereis, [dummy_sup_2]),
@@ -657,7 +921,7 @@ release_handler_which_releases(Conf) ->
DataDir = ?config(data_dir,Conf),
LibDir = filename:join([DataDir,release_handler_timeouts]),
- Rel1 = create_and_install_fake_first_release(Dir,[{dummy,"0.1",LibDir}]),
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,[{dummy,"0.1",LibDir}]),
{ok, Node} = t_start_node(release_handler_which_releases, Rel1, []),
Releases0 = rpc:call(Node, release_handler, which_releases, []),
@@ -713,7 +977,7 @@ otp_2760(Conf) ->
DataDir = ?config(data_dir,Conf),
LibDir = filename:join([DataDir,app1_app2,lib1]),
- Rel1 = create_and_install_fake_first_release(Dir,[{app1,"1.0",LibDir}]),
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,[{app1,"1.0",LibDir}]),
Rel2 = create_fake_upgrade_release(Dir,"after",[],{[Rel1],[Rel1],[LibDir]}),
Rel2Dir = filename:dirname(Rel2),
@@ -751,7 +1015,7 @@ otp_5761(Conf) when is_list(Conf) ->
LibDir2 = filename:join(RelDir, "lib2"),
%% Create the releases
- Rel1 = create_and_install_fake_first_release(Dir,
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,
[{app1,"1.0",LibDir1},
{app2,"1.0",LibDir1}]),
Rel2 = create_fake_upgrade_release(Dir,
@@ -830,7 +1094,7 @@ otp_9402(Conf) when is_list(Conf) ->
LibDir = filename:join(?config(data_dir, Conf), "lib"),
%% Create the releases
- Rel1 = create_and_install_fake_first_release(Dir,
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,
[{a,"1.1",LibDir}]),
Rel2 = create_fake_upgrade_release(Dir,
"2",
@@ -897,7 +1161,7 @@ otp_9417(Conf) when is_list(Conf) ->
LibDir = filename:join(?config(data_dir, Conf), "lib"),
%% Create the releases
- Rel1 = create_and_install_fake_first_release(Dir,
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,
[{b,"1.0",LibDir}]),
Rel2 = create_fake_upgrade_release(Dir,
"2",
@@ -1010,7 +1274,7 @@ otp_9395_check_and_purge(Conf) when is_list(Conf) ->
LibDir = filename:join(?config(data_dir, Conf), "lib"),
%% Create the releases
- Rel1 = create_and_install_fake_first_release(Dir,
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,
[{b,"1.0",LibDir}]),
Rel2 = create_fake_upgrade_release(Dir,
"2",
@@ -1076,7 +1340,7 @@ otp_9395_update_many_mods(Conf) when is_list(Conf) ->
LibDir = filename:join(?config(data_dir, Conf), "lib"),
%% Create the releases
- Rel1 = create_and_install_fake_first_release(Dir,
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,
[{many_mods,"1.0",LibDir}]),
Rel2 = create_fake_upgrade_release(Dir,
"2",
@@ -1191,7 +1455,7 @@ otp_9395_rm_many_mods(Conf) when is_list(Conf) ->
LibDir = filename:join(?config(data_dir, Conf), "lib"),
%% Create the releases
- Rel1 = create_and_install_fake_first_release(Dir,
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,
[{many_mods,"1.0",LibDir}]),
Rel2 = create_fake_upgrade_release(Dir,
"2",
@@ -1303,7 +1567,7 @@ do_otp_9864(Conf) ->
LibDir2 = filename:join(Dir, "lib2"),
%% Create the releases
- Rel1 = create_and_install_fake_first_release(Dir,
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,
[{app1,"1.0",LibDir1},
{app2,"1.0",LibDir1}]),
Rel2 = create_fake_upgrade_release(Dir,
@@ -1359,7 +1623,7 @@ upgrade_supervisor(Conf) when is_list(Conf) ->
%% Create the releases
Lib1 = [{a,"1.0",LibDir}],
Lib2 = [{a,"9.0",LibDir}],
- Rel1 = create_and_install_fake_first_release(Dir,Lib1),
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,Lib1),
Rel2 = create_fake_upgrade_release(Dir,"2",Lib2,{[Rel1],[Rel1],[LibDir]}),
Rel1Dir = filename:dirname(Rel1),
Rel2Dir = filename:dirname(Rel2),
@@ -1416,7 +1680,7 @@ upgrade_supervisor_fail(Conf) when is_list(Conf) ->
%% Create the releases
Lib1 = [{a,"1.0",LibDir}],
Lib2 = [{a,"9.1",LibDir}],
- Rel1 = create_and_install_fake_first_release(Dir,Lib1),
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,Lib1),
Rel2 = create_fake_upgrade_release(Dir,"2",Lib2,{[Rel1],[Rel1],[LibDir]}),
Rel1Dir = filename:dirname(Rel1),
Rel2Dir = filename:dirname(Rel2),
@@ -1926,7 +2190,7 @@ unicode_upgrade(Conf) ->
%% Create the releases
RelName = "unicode_rel_αβ",
- Rel1 = create_and_install_fake_first_release(Dir,{RelName,"1"},
+ Rel1 = create_and_install_fake_first_release(Conf,Dir,{RelName,"1"},
[{u,"1.0",LibDir}]),
Rel2 = create_fake_upgrade_release(Dir,
{RelName,"2"},
@@ -2241,7 +2505,7 @@ copy_tree(Conf, Src, NewName, DestDir) ->
TempTarName = filename:join(PrivDir, "temp_tar_file.tar"),
%% Not compressing tar file here since that would increase test
%% suite time by almost 100%, and the tar file is deleted
- %% imediately anyway.
+ %% immediately anyway.
{ok,Tar} = erl_tar:open(TempTarName, [write]),
ok = erl_tar:add(Tar, Src, NewName, []),
ok = erl_tar:close(Tar),
@@ -2405,6 +2669,17 @@ create_p1g(Conf,TargetDir) ->
filename:join([DataDir,lib,"installer-1.0",ebin])),
copy_file(filename:join(DataDir, "../rh_test_lib.beam"),
filename:join([DataDir,lib,"installer-1.0",ebin])),
+ copy_file(filename:join(DataDir, "../otp_vsns.beam"),
+ filename:join([DataDir,lib,"installer-1.0",ebin])),
+
+ InstPrivDir = filename:join([DataDir,lib,"installer-1.0","priv"]),
+ case file:read_file_info(InstPrivDir) of
+ {ok, _} ->
+ ok;
+ _ ->
+ ok = file:make_dir(InstPrivDir)
+ end,
+ copy_file(filename:join(DataDir, "../otp_versions.table"), InstPrivDir),
%% Create .rel, .script and .boot files
RelName = "rel0",
@@ -2650,7 +2925,7 @@ permanent_p1h(Node) ->
ok = rpc_inst(Node, permanent_p1h, []).
%% For each node in ToNodes, create a target installation which is
-%% indentical to the target installation for FromNode.
+%% identical to the target installation for FromNode.
copy_installed(Conf,FromNode,ToNodes) ->
PrivDir = priv_dir(Conf),
DataDir = ?config(data_dir,Conf),
@@ -2832,9 +3107,9 @@ cover_fun(Node,Func) ->
%% current running OTP release. It includes kernel, stdlib and sasl,
%% and possibly other applications if they are listed in AppDirs =
%% [{App,Vsn,LibDir}]
-create_and_install_fake_first_release(Dir,AppDirs) ->
- create_and_install_fake_first_release(Dir,init:script_id(),AppDirs).
-create_and_install_fake_first_release(Dir,{RelName,RelVsn},AppDirs) ->
+create_and_install_fake_first_release(Conf,Dir,AppDirs) ->
+ create_and_install_fake_first_release(Conf,Dir,init:script_id(),AppDirs).
+create_and_install_fake_first_release(Conf,Dir,{RelName,RelVsn},AppDirs) ->
{Rel,_} = create_fake_release(Dir,RelName,RelVsn,AppDirs),
ReleasesDir = filename:join(Dir, "releases"),
RelDir = filename:dirname(Rel),
@@ -2847,13 +3122,21 @@ create_and_install_fake_first_release(Dir,{RelName,RelVsn},AppDirs) ->
ok = copy_file(Rel++".boot",filename:join(RelVsnDir, "start.boot")),
ok = copy_file(filename:join(RelDir,"sys.config"),RelVsnDir),
- ok = release_handler:create_RELEASES(code:root_dir(),
- ReleasesDir,
- Rel++".rel",
- AppDirs),
-
+ case proplists:get_value(root_dir, Conf, relative) of
+ relative ->
+ ok = release_handler:create_RELEASES(
+ ReleasesDir,
+ Rel++".rel",
+ AppDirs);
+ absolute ->
+ ok = release_handler:create_RELEASES(
+ code:root_dir(),
+ ReleasesDir,
+ Rel++".rel",
+ AppDirs)
+ end,
Rel.
-
+
%% This function create a new release, including a relup file. It can
%% be upgraded to from the release created by
%% create_and_install_fake_first_release/2. Unpack first by calls to
@@ -2940,9 +3223,7 @@ modify_tar_win32(Conf, TarFileName) ->
app_dir(App,Vsn) ->
atom_to_list(App) ++ "-" ++ vsn(App,Vsn).
-vsn(erts,old) -> ?ertsvsn;
-vsn(kernel,old) -> ?kernelvsn;
-vsn(stdlib,old) -> ?stdlibvsn;
+vsn(App,old) -> rh_test_lib:old_app_vsn(App);
vsn(erts,current) -> erlang:system_info(version);
vsn(App,current) ->
{ok,Vsn} = application:get_key(App,vsn),
@@ -2950,3 +3231,20 @@ vsn(App,current) ->
system_lib(PrivDir) ->
filename:join(PrivDir,"system_lib").
+
+copy_r(Src, Dst) ->
+ {ok,S} = file:read_file_info(Src),
+ case S#file_info.type of
+ directory ->
+ {ok,Names} = file:list_dir(Src),
+ ok = filelib:ensure_dir(Dst),
+ ok = file:make_dir(Dst),
+ lists:foreach(
+ fun(Name) ->
+ copy_r(filename:join(Src, Name),
+ filename:join(Dst, Name))
+ end, Names);
+ _ ->
+ {ok,_NumBytesCopied} = file:copy(Src, Dst),
+ ok = file:write_file_info(Dst, S)
+ end.
diff --git a/lib/sasl/test/release_handler_SUITE_data/lib/installer-1.0/ebin/installer.app b/lib/sasl/test/release_handler_SUITE_data/lib/installer-1.0/ebin/installer.app
index e1391c0605..b1622307bb 100644
--- a/lib/sasl/test/release_handler_SUITE_data/lib/installer-1.0/ebin/installer.app
+++ b/lib/sasl/test/release_handler_SUITE_data/lib/installer-1.0/ebin/installer.app
@@ -1,6 +1,6 @@
{application, installer,
[{description, "Installer application"},
{vsn, "1.0"},
- {modules, [installer,rh_test_lib]},
+ {modules, [installer,rh_test_lib,otp_vsns]},
{registered, []},
{applications, [kernel, stdlib, sasl]}]}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-A.rel.src b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-A.rel.src
new file mode 100644
index 0000000000..8b8ec2eff6
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-A.rel.src
@@ -0,0 +1,8 @@
+{release,
+ {"hello_server", "A"},
+ {erts, "%erts_VSN%"},
+ [{kernel, "%kernel_VSN%"},
+ {stdlib, "%stdlib_VSN%"},
+ {sasl, "%sasl_VSN%"},
+ {hello_server, "A"}]
+}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-B.rel.src b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-B.rel.src
new file mode 100644
index 0000000000..c966ad48ec
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server-B.rel.src
@@ -0,0 +1,8 @@
+{release,
+ {"hello_server", "B"},
+ {erts, "%erts_VSN%"},
+ [{kernel, "%kernel_VSN%"},
+ {stdlib, "%stdlib_VSN%"},
+ {sasl, "%sasl_VSN%"},
+ {hello_server, "B"}]
+}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/Emakefile b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/Emakefile
new file mode 100644
index 0000000000..8e1f951aee
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/Emakefile
@@ -0,0 +1,2 @@
+{"src/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
+{"test/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/.gitignore b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/.gitignore
new file mode 100644
index 0000000000..1ef2775ff8
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/.gitignore
@@ -0,0 +1 @@
+*.beam \ No newline at end of file
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/hello_server.app b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/hello_server.app
new file mode 100644
index 0000000000..697bd7add4
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/ebin/hello_server.app
@@ -0,0 +1,7 @@
+{application, hello_server,
+ [{description, "Simple server that sends back hello"},
+ {vsn, "A"},
+ {modules, [app_callback_module, hello_server]},
+ {registered, [hello_server]},
+ {applications, [kernel, stdlib, sasl]},
+ {mod, {app_callback_module,[]}}]}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/app_callback_module.erl b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/app_callback_module.erl
new file mode 100644
index 0000000000..0d988ab8f6
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/app_callback_module.erl
@@ -0,0 +1,26 @@
+-module(app_callback_module).
+
+-behaviour(application).
+
+-export([start/2, stop/1, get_response/0, update/0]).
+
+start(_Type, _Args) ->
+ Pid = hello_server:start_server(),
+ global:register_name(hello_server, Pid),
+ {ok, Pid}.
+
+update() ->
+ global:whereis_name(hello_server) ! update,
+ ok.
+
+get_response() ->
+ global:whereis_name(hello_server) ! self(),
+ receive
+ A ->
+ A
+ end.
+
+stop(_State) ->
+ Pid = global:whereis_name(hello_server),
+ hello_server:stop(Pid),
+ ok.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/hello_server.erl b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/hello_server.erl
new file mode 100644
index 0000000000..1008e1f4e2
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server/src/hello_server.erl
@@ -0,0 +1,20 @@
+-module(hello_server).
+
+-export([start_server/0, stop/1, loop/0]).
+
+start_server() ->
+ erlang:spawn_link(?MODULE, loop, []).
+
+stop(Pid) ->
+ Pid ! stop.
+
+loop() ->
+ receive
+ stop ->
+ ok;
+ update ->
+ ?MODULE:loop();
+ Sender ->
+ Sender ! hello,
+ loop()
+ end.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/Emakefile b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/Emakefile
new file mode 100644
index 0000000000..8e1f951aee
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/Emakefile
@@ -0,0 +1,2 @@
+{"src/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
+{"test/*", [debug_info, {i,"include/"}, {outdir, "ebin/"}]}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/.gitignore b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/.gitignore
new file mode 100644
index 0000000000..1ef2775ff8
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/.gitignore
@@ -0,0 +1 @@
+*.beam \ No newline at end of file
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.app b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.app
new file mode 100644
index 0000000000..1e1426344b
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.app
@@ -0,0 +1,7 @@
+{application, hello_server,
+ [{description, "Simple server that sends back hej"},
+ {vsn, "B"},
+ {modules, [app_callback_module, hello_server]},
+ {registered, [hello_server]},
+ {applications, [kernel, stdlib, sasl]},
+ {mod, {app_callback_module,[]}}]}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.appup b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.appup
new file mode 100644
index 0000000000..1aa16cd39c
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/ebin/hello_server.appup
@@ -0,0 +1,3 @@
+{"B",
+ [{"A", [{load_module, hello_server}]}],
+ [{"A", [{load_module, hello_server}]}]}.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/app_callback_module.erl b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/app_callback_module.erl
new file mode 100644
index 0000000000..0d988ab8f6
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/app_callback_module.erl
@@ -0,0 +1,26 @@
+-module(app_callback_module).
+
+-behaviour(application).
+
+-export([start/2, stop/1, get_response/0, update/0]).
+
+start(_Type, _Args) ->
+ Pid = hello_server:start_server(),
+ global:register_name(hello_server, Pid),
+ {ok, Pid}.
+
+update() ->
+ global:whereis_name(hello_server) ! update,
+ ok.
+
+get_response() ->
+ global:whereis_name(hello_server) ! self(),
+ receive
+ A ->
+ A
+ end.
+
+stop(_State) ->
+ Pid = global:whereis_name(hello_server),
+ hello_server:stop(Pid),
+ ok.
diff --git a/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/hello_server.erl b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/hello_server.erl
new file mode 100644
index 0000000000..d40309457a
--- /dev/null
+++ b/lib/sasl/test/release_handler_SUITE_data/relocatable_release/hello_server_new/src/hello_server.erl
@@ -0,0 +1,20 @@
+-module(hello_server).
+
+-export([start_server/0, stop/1, loop/0]).
+
+start_server() ->
+ erlang:spawn_link(?MODULE, loop, []).
+
+stop(Pid) ->
+ Pid ! stop.
+
+loop() ->
+ receive
+ stop ->
+ ok;
+ update ->
+ ?MODULE:loop();
+ Sender ->
+ Sender ! hej,
+ loop()
+ end.
diff --git a/lib/sasl/test/rh_test_lib.erl b/lib/sasl/test/rh_test_lib.erl
index 6425fce7a7..dba45bece6 100644
--- a/lib/sasl/test/rh_test_lib.erl
+++ b/lib/sasl/test/rh_test_lib.erl
@@ -12,13 +12,15 @@
-export([clean_dir/1,
clean_dir/2]).
+-export([old_app_vsn/1]).
+
-include_lib("kernel/include/file.hrl").
cmd(Cmd,Args,Env) ->
case open_port({spawn_executable, Cmd}, [{args,Args},{env,Env}]) of
Port when is_port(Port) ->
unlink(Port),
- catch erlang:port_close(Port), % migth already be closed, so catching
+ catch erlang:port_close(Port), % might already be closed, so catching
ok;
Error ->
Error
@@ -160,3 +162,23 @@ rm_rf([File|Files],Save) ->
end;
rm_rf([],_) ->
ok.
+
+old_app_vsn(App) ->
+ %% Get oldest application version (erts, kernel, sasl,
+ %% stdlib) we support upgrade from, i.e., the first
+ %% application version in the release two releases
+ %% prior to current release...
+ State = case get('__otp_vsns_state__') of
+ undefined ->
+ S = otp_vsns:read_state(),
+ put('__otp_vsns_state__', S),
+ S;
+ S ->
+ S
+ end,
+ Rel = integer_to_list(list_to_integer(erlang:system_info(otp_release))-2),
+ AppVsn = otp_vsns:app_vsn(State, "OTP-"++Rel++".0", atom_to_list(App)),
+ [_, Vsn] = string:lexemes(AppVsn, "-"),
+ Vsn.
+
+
diff --git a/lib/sasl/test/sasl_SUITE.erl b/lib/sasl/test/sasl_SUITE.erl
index 1b377db903..bbebce83ae 100644
--- a/lib/sasl/test/sasl_SUITE.erl
+++ b/lib/sasl/test/sasl_SUITE.erl
@@ -32,7 +32,7 @@
log_file/1,
utc_log/1]).
--compile(r21).
+-compile(r22).
all() ->
[log_mf_h_env, log_file, app_test, appup_test, utc_log].
@@ -60,6 +60,19 @@ end_per_group(_GroupName, Config) ->
Config.
+init_per_testcase(appup_test, Config) ->
+ %% We check if the test results were released using a version
+ %% of Erlang/OTP that was a tagged version or not. On a non-tagged
+ %% version this testcase most likely will fail.
+ case file:read_file(
+ filename:join(
+ proplists:get_value(data_dir,Config), "otp_version_tickets")) of
+ {ok,<<"DEVELOPMENT",_/binary>>} ->
+ {skip, "This is a development version, test might fail "
+ "because of incorrect version numbers"};
+ {ok,S} ->
+ Config
+ end;
init_per_testcase(_Case, Config) ->
Config.
end_per_testcase(_Case, _Config) ->
@@ -74,8 +87,6 @@ app_test(Config) when is_list(Config) ->
appup_test(_Config) ->
appup_tests(sasl,create_test_vsns(sasl)).
-appup_tests(_App,{[],[]}) ->
- {skip,"no previous releases available"};
appup_tests(App,{OkVsns0,NokVsns}) ->
application:load(App),
{_,_,Vsn} = lists:keyfind(App,1,application:loaded_applications()),
@@ -88,8 +99,7 @@ appup_tests(App,{OkVsns0,NokVsns}) ->
OkVsns0 ->
OkVsns0;
Ok ->
- ct:log("Current version, ~p, is same as in previous release.~n"
- "Removing this from the list of ok versions.",
+ ct:log("Removed current version ~p from the list of ok versions to test.",
[Vsn]),
Ok
end,
@@ -104,57 +114,46 @@ appup_tests(App,{OkVsns0,NokVsns}) ->
ok.
create_test_vsns(App) ->
- ThisMajor = erlang:system_info(otp_release),
- FirstMajor = previous_major(ThisMajor),
- SecondMajor = previous_major(previous_major(FirstMajor)),
- Ok = app_vsn(App,[ThisMajor,FirstMajor]),
- Nok0 = app_vsn(App,[SecondMajor]),
+ S = otp_vsns:read_state(),
+ Rel = list_to_integer(erlang:system_info(otp_release)),
+ AppStr = atom_to_list(App),
+ Ok = ok_app_vsns(S, Rel, AppStr),
+ Nok0 = nok_app_vsns(S, Rel, AppStr, hd(Ok)),
Nok = case Ok of
- [Ok1|_] ->
- [Ok1 ++ ",1" | Nok0]; % illegal
- _ ->
- Nok0
- end,
- {Ok,Nok}.
-
-previous_major("17") ->
- "r16b";
-previous_major("r16b") ->
- "r15b";
-previous_major(Rel) ->
- integer_to_list(list_to_integer(Rel)-1).
-
-app_vsn(App,[R|Rs]) ->
- OldRel =
- case test_server:is_release_available(R) of
- true ->
- {release,R};
- false ->
- case ct:get_config({otp_releases,list_to_atom(R)}) of
- undefined ->
- false;
- Prog0 ->
- case os:find_executable(Prog0) of
- false ->
- false;
- Prog ->
- {prog,Prog}
- end
- end
- end,
- case OldRel of
- false ->
- app_vsn(App,Rs);
- _ ->
- {ok,N} = test_server:start_node(prevrel,peer,[{erl,[OldRel]}]),
- _ = rpc:call(N,application,load,[App]),
- As = rpc:call(N,application,loaded_applications,[]),
- {_,_,V} = lists:keyfind(App,1,As),
- test_server:stop_node(N),
- [V|app_vsn(App,Rs)]
- end;
-app_vsn(_App,[]) ->
- [].
+ [Ok1|_] ->
+ [Ok1 ++ ",1" | Nok0]; % illegal
+ _ ->
+ Nok0
+ end,
+ {Ok, Nok}.
+
+ok_app_vsns(S, Rel, AppStr) ->
+ AppVsns0 = get_rel_app_vsns(S, Rel-2, AppStr),
+ AppVsns1 = get_rel_app_vsns(S, Rel-1, AppStr),
+ AppVsns2 = try
+ get_rel_app_vsns(S, Rel, AppStr)
+ catch
+ _:_ -> []
+ end,
+ lists:usort(AppVsns2 ++ AppVsns1 ++ AppVsns0).
+
+nok_app_vsns(S, Rel, AppStr, EarliestOkVsn) ->
+ AppVsns0 = get_rel_app_vsns(S, Rel-4, AppStr),
+ AppVsns1 = get_rel_app_vsns(S, Rel-3, AppStr),
+ %% Earliest OK version may exist in not OK versions
+ %% as well if there were no application version bump
+ %% between two releases, so we need to remove it
+ %% if that is the case...
+ lists:usort(AppVsns1 ++ AppVsns0) -- EarliestOkVsn.
+
+get_rel_app_vsns(S, Rel, App) ->
+ RelStr = integer_to_list(Rel),
+ OtpVsns = otp_vsns:branch_vsns(S, "maint-"++RelStr),
+ lists:map(fun (OtpVsn) ->
+ AppVsn = otp_vsns:app_vsn(S, OtpVsn, App),
+ [_, Vsn] = string:lexemes(AppVsn, "-"),
+ Vsn
+ end, OtpVsns).
check_appup([Vsn|Vsns],Instrs,Expected) ->
case systools_relup:appup_search_for_version(Vsn, Instrs) of
diff --git a/lib/sasl/test/sasl_report_SUITE.erl b/lib/sasl/test/sasl_report_SUITE.erl
index 42672358c0..fb607d02ca 100644
--- a/lib/sasl/test/sasl_report_SUITE.erl
+++ b/lib/sasl/test/sasl_report_SUITE.erl
@@ -95,12 +95,8 @@ gen_server_crash(Config, Encoding, FormatterOpts, Min, Max) ->
ok = file:write_file(ConfigFileName ++ ".config",
io_lib:format("[{kernel, ~p},~n{sasl, ~p}].",
[KernelConfig,SaslConfig])),
- {ok,Node} =
- test_server:start_node(
- TC, peer,
- [{args, ["-pa ",filename:dirname(code:which(?MODULE)),
- " -boot start_sasl -kernel start_timer true "
- "-config ",ConfigFileName]}]),
+ {ok,Peer,Node} = ?CT_PEER(["-boot", "start_sasl", "-kernel", "start_timer", "true",
+ "-config", ConfigFileName]),
%% Set depth or chars_limit.
ok = rpc:call(Node,logger,update_formatter_config,[default,FormatterOpts]),
@@ -126,7 +122,7 @@ gen_server_crash(Config, Encoding, FormatterOpts, Min, Max) ->
ok = rpc:call(Node,logger_std_h,filesync,[default]),
ok = rpc:call(Node,logger_std_h,filesync,[sasl]),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok = logger:remove_primary_filter(no_remote),
check_file(KernelLog, utf8, Min, Max),
diff --git a/lib/sasl/test/systools_SUITE.erl b/lib/sasl/test/systools_SUITE.erl
index ef863581a5..801660ddac 100644
--- a/lib/sasl/test/systools_SUITE.erl
+++ b/lib/sasl/test/systools_SUITE.erl
@@ -106,6 +106,9 @@ init_per_suite(Config) when is_list(Config) ->
%% Compile source files in the copy directory.
Sources = filelib:wildcard(fname([CopyDir,'*','*','*','*','*.erl'])),
lists:foreach(fun compile_source/1, Sources),
+ %% Deal with subdirectories, if any
+ SubSources = filelib:wildcard(fname([CopyDir,'*','*','*','*','*','*.erl'])),
+ lists:foreach(fun compile_subsource/1, SubSources),
[{copy_dir, CopyDir}, {cwd,Cwd}, {path,Path} | Config].
@@ -122,6 +125,16 @@ compile_source(File) ->
ok = file:write_file(OutFileTemp, Code),
file:rename(OutFileTemp, OutFile).
+compile_subsource(File) ->
+ %% Same as compile_source/1 but works a subdirectory lower
+ U = filename:dirname(filename:dirname(filename:dirname(File))),
+ Base = filename:rootname(filename:basename(File)),
+ OutFile = filename:join([U,"ebin",Base++".beam"]),
+ OutFileTemp = OutFile ++ "#",
+ {ok,_,Code} = compile:file(File, [binary]),
+ ok = file:write_file(OutFileTemp, Code),
+ file:rename(OutFileTemp, OutFile).
+
end_per_suite(Config) when is_list(Config) ->
rh_test_lib:clean_dir(?privdir),
Config.
@@ -278,9 +291,7 @@ unicode_script(Config) when is_list(Config) ->
%% Need to do this on a separate node to make sure it has unicode
%% filename mode (+fnu*)
- {ok,HostStr} = inet:gethostname(),
- Host = list_to_atom(HostStr),
- {ok,Node} = ct_slave:start(Host,unicode_script_node,[{erl_flags,"+fnui"}]),
+ {ok,Peer,Node} = ?CT_PEER(["+fnui"]),
ok = rpc:call(Node,erl_tar,extract,
[TarFile, [{cwd,UnicodeLibDir},compressed]]),
@@ -313,10 +324,11 @@ unicode_script(Config) when is_list(Config) ->
rpc:call(Node,code,add_pathz,[filename:dirname(code:which(?MODULE))]),
rpc:call(Node,?MODULE,delete_tree,[UnicodeLibDir]),
+ peer:stop(Peer),
+
ok.
unicode_script(cleanup,Config) ->
- _ = ct_slave:stop(unicode_script_node),
file:delete(fname(?privdir, "unicode_app.tgz")),
ok.
@@ -1386,7 +1398,7 @@ src_tests_tar(Config) when is_list(Config) ->
%% make_tar: Check that make_tar handles generation and placement of
%% tar files for variables outside the main tar file.
-%% Test the {var_tar, include | ownfile | omit} optio.
+%% Test the {var_tar, include | ownfile | omit} option.
var_tar(Config) when is_list(Config) ->
{ok, OldDir} = file:get_cwd(),
PSAVE = code:get_path(), % Save path
diff --git a/lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/ebin/db.app b/lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/ebin/db.app
index a1025c306a..28d0f80d34 100644
--- a/lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/ebin/db.app
+++ b/lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/ebin/db.app
@@ -1,7 +1,7 @@
{application, db,
[{description, "ERICSSON NR FOR DB"},
{vsn, "2.1"},
- {modules, [db1, db2]},
+ {modules, [db1, db2, db3]},
{registered, []},
{applications, []},
{env, []},
diff --git a/lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/src/sub/db3.erl b/lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/src/sub/db3.erl
new file mode 100644
index 0000000000..010249638f
--- /dev/null
+++ b/lib/sasl/test/systools_SUITE_data/d_missing_src/lib/db-2.1/src/sub/db3.erl
@@ -0,0 +1,3 @@
+-module(db3).
+-vsn("1.0").
+
diff --git a/lib/sasl/test/test_lib.hrl b/lib/sasl/test/test_lib.hrl
deleted file mode 100644
index 6f02666b87..0000000000
--- a/lib/sasl/test/test_lib.hrl
+++ /dev/null
@@ -1,3 +0,0 @@
--define(ertsvsn,"10.4").
--define(kernelvsn,"6.4").
--define(stdlibvsn,"3.9").
diff --git a/lib/snmp/bin/snmp-v2tov1.pl b/lib/snmp/bin/snmp-v2tov1.pl
index f9ecfc9dd8..6f1e73087d 100644
--- a/lib/snmp/bin/snmp-v2tov1.pl
+++ b/lib/snmp/bin/snmp-v2tov1.pl
@@ -64,7 +64,7 @@ line: while (<>) {
next line;
}
- # Translate TEXTUAL-CONVENTION into an ordinary type assignement.
+ # Translate TEXTUAL-CONVENTION into an ordinary type assignment.
# Place comments around body.
if (/TEXTUAL-CONVENTION/ && ($str == 0)) {
$textual = 1;
diff --git a/lib/snmp/configure b/lib/snmp/configure
index 65d95918cc..4b5b98172f 100755
--- a/lib/snmp/configure
+++ b/lib/snmp/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,41 +167,52 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -227,14 +220,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -252,18 +252,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -290,6 +291,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -307,6 +309,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -321,7 +331,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -330,7 +340,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -369,12 +379,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -386,18 +397,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -409,9 +429,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -438,7 +458,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -482,7 +502,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -496,6 +516,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -509,6 +533,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -574,17 +605,21 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
-
-ac_unique_file="vsn.mk"
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
+
+ac_unique_file="src/app/snmp.app.src"
ac_subst_vars='LTLIBOBJS
LIBOBJS
PERL
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -707,8 +742,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -749,9 +782,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -775,9 +808,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -988,9 +1021,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1004,9 +1037,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1050,9 +1083,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1068,7 +1101,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1132,7 +1165,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1250,6 +1283,7 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1273,9 +1307,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1303,7 +1337,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1311,7 +1346,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1321,9 +1356,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1333,14 +1368,34 @@ fi
## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -1373,8 +1428,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -1409,7 +1468,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -1444,11 +1503,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -1459,8 +1520,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -1484,7 +1545,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -1492,14 +1553,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -1507,15 +1568,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -1523,8 +1584,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -1538,69 +1599,152 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
done
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${ERL_TOP}/make/autoconf"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -1611,12 +1755,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -1625,24 +1769,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -1652,11 +1796,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -1670,57 +1815,126 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_aux_dir=
-for ac_dir in ${ERL_TOP}/erts/autoconf; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in ${ERL_TOP}/erts/autoconf" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -1739,21 +1953,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -1772,20 +1987,116 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
else
- host_os=win32
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+ # Adjust for local legacy windows hack...
+ case $host in #(
+ local-*-windows) :
+
+ host=win32
+ host_os=win32
+ host_vendor=
+ host_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $build in #(
+ local-*-windows) :
+
+ build=win32
+ build_os=win32
+ build_vendor=
+ build_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $target in #(
+ local-*-windows) :
+
+ target=win32
+ target_os=win32
+ target_vendor=
+ target_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+ if test "$cross_compiling" = "yes" -a "$build" = "$host"
+then :
+ as_fn_error $? "
+ Cross compiling with the same canonicalized 'host' value
+ as the canonicalized 'build' value.
+
+ We are cross compiling since the '--host=$host_alias'
+ and the '--build=$build_alias' arguments differ. When
+ cross compiling Erlang/OTP, also the canonicalized values of
+ the '--build' and the '--host' arguments *must* differ. The
+ canonicalized values of these arguments however both equals:
+ $host
+
+ You can check the canonical value by passing a value as
+ argument to the 'make/autoconf/config.sub' script.
+ " "$LINENO" 5
+fi
+
# Extract the first word of "perl", so it can be a program name with args.
set dummy perl; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_PERL+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_PERL+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$PERL"; then
ac_cv_prog_PERL="$PERL" # Let the user override the test.
else
@@ -1793,11 +2104,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_PERL="perl"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -1809,11 +2124,11 @@ fi
fi
PERL=$ac_cv_prog_PERL
if test -n "$PERL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
-$as_echo "$PERL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5
+printf "%s\n" "$PERL" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -1874,7 +2189,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -1890,8 +2205,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -1914,14 +2229,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -1931,46 +2248,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -1979,13 +2296,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -1994,8 +2304,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -2007,30 +2321,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -2043,13 +2337,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -2076,18 +2371,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -2099,12 +2396,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -2135,7 +2433,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -2157,6 +2455,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -2170,6 +2472,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -2211,7 +2519,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -2220,7 +2528,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -2283,7 +2591,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -2332,14 +2640,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -2376,21 +2686,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -2418,7 +2728,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -2432,7 +2742,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -2457,7 +2767,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -2685,7 +2995,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -2693,17 +3003,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -2720,7 +3030,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -2744,9 +3054,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -2799,8 +3109,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -2842,9 +3152,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -2891,8 +3201,9 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
+
diff --git a/lib/snmp/configure.in b/lib/snmp/configure.ac
index bac042ccca..c87c38dc68 100644
--- a/lib/snmp/configure.in
+++ b/lib/snmp/configure.ac
@@ -2,21 +2,19 @@
define([AC_CACHE_LOAD], )dnl
define([AC_CACHE_SAVE], )dnl
-AC_INIT(vsn.mk)
+AC_INIT
+AC_CONFIG_SRCDIR([src/app/snmp.app.src])
+AC_PREREQ([2.71])
-AC_CONFIG_AUX_DIRS(${ERL_TOP}/erts/autoconf)
-
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- AC_CANONICAL_HOST
-else
- host_os=win32
-fi
+m4_include([otp.m4])
+AC_CONFIG_AUX_DIRS([${ERL_TOP}/make/autoconf])
dnl ----------------------------------------------------------------------
dnl Checks for programs.
dnl ----------------------------------------------------------------------
+ERL_CANONICAL_SYSTEM_TYPE
AC_CHECK_PROG(PERL, perl, perl, no_perl)
if test "$PERL" = no_perl; then
@@ -24,5 +22,6 @@ if test "$PERL" = no_perl; then
fi
-AC_OUTPUT(mibs/Makefile:mibs/Makefile.in)
+AC_CONFIG_FILES([mibs/Makefile:mibs/Makefile.in])
+AC_OUTPUT
diff --git a/lib/snmp/doc/src/notes.xml b/lib/snmp/doc/src/notes.xml
index a37e57e1f3..26aa02f794 100644
--- a/lib/snmp/doc/src/notes.xml
+++ b/lib/snmp/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -214,7 +214,7 @@
<p>
[manager] In a function handling snmp errors, an unused
result (_Error) could result in matching issues and
- therefor case clause runtime errors (crash). Note that
+ therefore case clause runtime errors (crash). Note that
this would only happen in *very* unusual error cases.</p>
<p>
Own Id: OTP-17161</p>
@@ -1074,7 +1074,7 @@
<list>
<item>
<p>
- Improved cryptocraphic capability.</p>
+ Improved cryptographic capability.</p>
<p>
Own Id: OTP-12452</p>
</item>
@@ -1330,7 +1330,7 @@
<p>Add (atl) log conversion block option. </p>
<p>It is now possible to request that the Audit Trail Log should
be blocked during conversion (<c>log_to_txt</c> or <c>log_to_io</c>).
- This could be usefull when coverting an entire large log (when
+ This could be useful when converting an entire large log (when
there is a chance it may otherwise wrap during conversion). </p>
<p>See
agent
@@ -1801,7 +1801,7 @@
<list type="bulleted">
<item>
- <p>[agent] Sematic fixes to SNMP-USER-BASED-SM-MIB.
+ <p>[agent] Semantic fixes to SNMP-USER-BASED-SM-MIB.
The semantics allow the <c>usmUserAuthKeyChange</c> and
<c>usmUserPrivKeyChange</c> objects to be written to in the
same set requests that also creates and clones the user.
@@ -1910,7 +1910,7 @@
<item>
<p>[manager] Introduced a new transport module,
<c>snmpm_net_if_mt</c>,
- which handles all incomming and outgoing
+ which handles all incoming and outgoing
traffic in newly created processes. The message/request is
processed and then the process exits. </p>
<p>Own Id: OTP-9876</p>
@@ -1924,7 +1924,7 @@
<item>
<p>[agent] Improve error handling while reading agent config files.
- Some files contain mandatory information and is therefor themself
+ Some files contain mandatory information and is therefore themself
mandatory. </p>
<p>Own Id: OTP-9943</p>
</item>
@@ -2111,8 +2111,8 @@
conflict. When dumping the vacm table to disk, a temoporary
file with a fixed name was used. If the table dumping
(snmpa_vacm:dump_table/0) was initiated from several different
- processes in rapid succesion, the dumping could fail because the
- different processes was simultaniously trying to write to the
+ processes in rapid succession, the dumping could fail because the
+ different processes was simultaneously trying to write to the
same file. This problem has been eliminated by creating a unique
name for the temporary file. </p>
<p>Own Id: OTP-9851</p>
@@ -2575,7 +2575,7 @@
<p>See
<seeerl marker="snmpa#send_notification2">
snmpa:send_notification2/3</seeerl> for more info.
- See also the incomming net-if messages when sending a
+ See also the incoming net-if messages when sending a
<seeguide marker="snmp_agent_netif#im_send_pdu">trap</seeguide>
(send_pdu message) and
<seeguide marker="snmp_agent_netif#im_send_pdu_req">
diff --git a/lib/snmp/doc/src/notes_history.xml b/lib/snmp/doc/src/notes_history.xml
index ed71a86e83..cd65aec57d 100644
--- a/lib/snmp/doc/src/notes_history.xml
+++ b/lib/snmp/doc/src/notes_history.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2020</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -438,7 +438,7 @@
<item>
<p>[agent] The main agent type header file contained some miss-information
regarding the type of the entrytype field of the me-record, causing
- unneccessary confusion.</p>
+ unnecessary confusion.</p>
<p>Own Id: OTP-8116</p>
<p>Aux Id: Seq 11312</p>
</item>
@@ -490,7 +490,7 @@
<item>
<p>[agent] A manager could no longer use the SNMPv3 user "initial"
- as this was interpretated as the first step of the discovery. </p>
+ as this was interpreted as the first step of the discovery. </p>
<p>Introduced a new terminating option, <c>trigger_username</c> to
make it possible to configure the username the agent reacts to.
Default is <c>""</c>. </p>
@@ -514,7 +514,7 @@
<item>
<p>[agent] The main agent type header file contained some miss-information
regarding the type of the entrytype field of the me-record, causing
- unneccessary confusion.</p>
+ unnecessary confusion.</p>
<p>Own Id: OTP-8116</p>
<p>Aux Id: Seq 11312</p>
</item>
@@ -1397,7 +1397,7 @@
<item>
<p>[agent] Uninstalling MEs when unloading mibs incorrect and
- therefor never done. </p>
+ therefore never done. </p>
<p>Own Id: OTP-7153</p>
</item>
@@ -2175,7 +2175,7 @@
<item>
<p>[manager] Improve handling of empty messages. Today
when receiving an empty (size = 0) udp message, this
- will result in a decode failure (a catched function
+ will result in a decode failure (a caught function
clause), which in turn will be passed on to the user,
via a call to the
<seeerl marker="snmpm_user#handle_error">handle_error</seeerl>
diff --git a/lib/snmp/doc/src/snmp.xml b/lib/snmp/doc/src/snmp.xml
index 9a4e123cb2..cc866b9f99 100644
--- a/lib/snmp/doc/src/snmp.xml
+++ b/lib/snmp/doc/src/snmp.xml
@@ -381,7 +381,7 @@
<c>Stop</c> is the stop (last) date and time to which log
events will be converted.
The <c>Block</c> argument indicates if the log should be blocked
- during conversion. This could be usefull when converting large
+ during conversion. This could be useful when converting large
logs (when otherwise the log could wrap during conversion).
Defaults to <c>true</c>.
</p>
diff --git a/lib/snmp/doc/src/snmp_app.xml b/lib/snmp/doc/src/snmp_app.xml
index 87002e8189..0613de3158 100644
--- a/lib/snmp/doc/src/snmp_app.xml
+++ b/lib/snmp/doc/src/snmp_app.xml
@@ -224,7 +224,7 @@ in the snmp_config file!
<note>
<p>Even with multi-threaded set to <c>extended</c>
there is still a risk for 'reorder' when sending inform-requsts,
- which require a response (and may therefor require resending). </p>
+ which require a response (and may therefore require resending). </p>
<p>Also, there is of course no way to guarantee order once the
package is on the network. </p>
</note>
@@ -376,7 +376,7 @@ in the snmp_config file!
behaviour. </p>
<p>Several entities (<c>mib-server</c> via the its data module and
the <c>symbolic-store</c>) of the snmp agent uses this for storage
- of miscelaneous mib related data retrieved while loading a mib. </p>
+ of miscellaneous mib related data retrieved while loading a mib. </p>
<p>There are several implementations provided with the agent:
<c>snmpa_mib_storage_ets</c>, <c>snmpa_mib_storage_dets</c> and
<c>snmpa_mib_storage_mnesia</c>. </p>
@@ -386,7 +386,7 @@ in the snmp_config file!
<tag><marker id="agent_mst_options"></marker>
<c><![CDATA[mib_storage_options() = list() <optional>]]></c></tag>
<item>
- <p>This is implementattion depended. That is, it depends on the
+ <p>This is implementation depended. That is, it depends on the
module. For each module a specific set of options are valid.
For the module provided with the app, these options are supported: </p>
<list type="bulleted">
diff --git a/lib/snmp/doc/src/snmp_config.xml b/lib/snmp/doc/src/snmp_config.xml
index 4f3dcb6f02..0b8d786a2d 100644
--- a/lib/snmp/doc/src/snmp_config.xml
+++ b/lib/snmp/doc/src/snmp_config.xml
@@ -209,7 +209,7 @@
<note>
<p>Even with multi-threaded set to <c>extended</c>
there is still a risk for 'reorder' when sending inform-requsts,
- which require a response (and may therefor require resending). </p>
+ which require a response (and may therefore require resending). </p>
<p>Also, there is of course no way to guarantee order once the
package is on the network. </p>
</note>
diff --git a/lib/snmp/doc/src/snmp_def_instr_functions.xml b/lib/snmp/doc/src/snmp_def_instr_functions.xml
index 5fbcfaf2db..5a59f1bae5 100644
--- a/lib/snmp/doc/src/snmp_def_instr_functions.xml
+++ b/lib/snmp/doc/src/snmp_def_instr_functions.xml
@@ -99,7 +99,7 @@
</item>
<item><c>genErr</c>. Used if an error occurred. Note,
this should be an internal processing error, e.g. a caused
- by a programing fault somewhere. If the variable does not
+ by a programming fault somewhere. If the variable does not
exist, use <c>{noValue, noSuchName}</c> or
<c>{noValue, noSuchInstance}</c>.
</item>
@@ -275,7 +275,7 @@
</item>
<item><c>genErr</c>. Used if an error occurred. Note that
this should be an internal processing error, e.g. a caused
- by a programing fault somewhere. If some column does not
+ by a programming fault somewhere. If some column does not
exist, use <c>{noValue, noSuchName}</c> or
<c>{noValue, noSuchInstance}</c>.
</item>
@@ -322,7 +322,7 @@
<item><c>{NextOid, NextValue}</c>, where <c>NextOid</c>
is the lexicographic next OBJECT IDENTIFIER for the
corresponding column. This should be specified as the
- OBJECT IDENTIFER part following the table entry. This
+ OBJECT IDENTIFIER part following the table entry. This
means that the first integer is the column number and
the rest is a specification of the keys.
<c>NextValue</c> is the value of this element.
@@ -336,7 +336,7 @@
the column that caused the error. <c>Column</c> must be
one of the columns in the <c>Cols</c> list. Note that
this should be an internal processing error, e.g. a caused
- by a programing fault somewhere. If some column does not
+ by a programming fault somewhere. If some column does not
exist, you must return the next accessible element (or
<c>endOfTable</c>).
</item>
diff --git a/lib/snmp/doc/src/snmp_index.xml b/lib/snmp/doc/src/snmp_index.xml
index 9c8e6b8b33..108266e608 100644
--- a/lib/snmp/doc/src/snmp_index.xml
+++ b/lib/snmp/doc/src/snmp_index.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1997</year><year>2020</year>
+ <year>1997</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -123,7 +123,7 @@ get_next_pid(Oid, SnmpIndex) ->
</p>
<p>For example, if the SNMP table has two INDEX columns, the first
one an OCTET STRING with size 2, and the second one an OBJECT
- IDENTIFER, the corresponding <c>key_types</c> parameter would be
+ IDENTIFIER, the corresponding <c>key_types</c> parameter would be
<c>{fix_string, string}</c>.
</p>
<p>The <c>key()</c> type correlates to the <c>key_types()</c>
diff --git a/lib/snmp/doc/src/snmp_manager_netif.xml b/lib/snmp/doc/src/snmp_manager_netif.xml
index f6c9e642cf..a790a7e7f3 100644
--- a/lib/snmp/doc/src/snmp_manager_netif.xml
+++ b/lib/snmp/doc/src/snmp_manager_netif.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2004</year><year>2020</year>
+ <year>2004</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -63,8 +63,8 @@
The (supervising) process simply sends a
<seeguide marker="#im_ping">ping</seeguide> message and expects a
<seeguide marker="#om_pong">pong</seeguide> message response
- (withing a specific time).
- The interval between each <c>ping/pong</c> exhange is user configurable.
+ (within a specific time).
+ The interval between each <c>ping/pong</c> exchange is user configurable.
As is the time that is allowed for the
<seeguide marker="#om_pong">pong</seeguide>
message to arrive.
diff --git a/lib/snmp/doc/src/snmpa.xml b/lib/snmp/doc/src/snmpa.xml
index fb341f8f79..c7ddd10d67 100644
--- a/lib/snmp/doc/src/snmpa.xml
+++ b/lib/snmp/doc/src/snmpa.xml
@@ -587,7 +587,7 @@ notification_delivery_info() = #snmpa_notification_delivery_info{}
<c>LogName</c> defaults to "snmpa_log".
<c>LogFile</c> defaults to "snmpa.log". </p>
<p>The <c>Block</c> option indicates if the log should be blocked
- during conversion. This could be usefull when converting large
+ during conversion. This could be useful when converting large
logs (when otherwise the log could wrap during conversion).
Defaults to <c>true</c>. </p>
<p>See <seeerl marker="snmp#log_to_txt">snmp:log_to_txt</seeerl>
@@ -628,7 +628,7 @@ notification_delivery_info() = #snmpa_notification_delivery_info{}
<c>LogName</c> defaults to "snmpa_log".
<c>LogFile</c> defaults to "snmpa.log".</p>
<p>The <c>Block</c> option indicates if the log should be blocked
- during conversion. This could be usefull when converting large
+ during conversion. This could be useful when converting large
logs (when otherwise the log could wrap during conversion).
Defaults to <c>true</c>. </p>
<p>See <seeerl marker="snmp#log_to_io">snmp:log_to_io</seeerl>
@@ -772,7 +772,7 @@ notification_delivery_info() = #snmpa_notification_delivery_info{}
<v>Agent = pid() | atom()</v>
</type>
<desc>
- <p>Retreive the size of the mib server cache. </p>
+ <p>Retrieve the size of the mib server cache. </p>
<marker id="gc_mibs_cache"></marker>
</desc>
@@ -1104,7 +1104,7 @@ snmp_agent:register_subagent(SA1,[1,2,3], SA2).
</list>
<p>The 'process oid' "tag" that can be provided with the
- variable name / oids is indended to be used for oid post
+ variable name / oids is intended to be used for oid post
processing. The value '<c>keep</c>', which is the default, leaves
the oid as is. The value '<c>truncate</c>', will cause the oid
to be "truncated". That is, any trailing ".0" will be removed. </p>
@@ -1126,8 +1126,8 @@ snmp_agent:register_subagent(SA1,[1,2,3], SA2).
of this data, with one exception:
Any tuple containing the atom
<c>snmpa_default_notification_extra_info</c>
- may be used by the agent and is therefor <em>reserved</em>. </p>
- <p>See the net-if incomming messages for sending a
+ may be used by the agent and is therefore <em>reserved</em>. </p>
+ <p>See the net-if incoming messages for sending a
<seeguide marker="snmp_agent_netif#im_send_pdu">
trap</seeguide> and
<seeguide marker="snmp_agent_netif#im_send_pdu_req">
diff --git a/lib/snmp/doc/src/snmpa_mib_data.xml b/lib/snmp/doc/src/snmpa_mib_data.xml
index 1937e0f780..3dcfdc5865 100644
--- a/lib/snmp/doc/src/snmpa_mib_data.xml
+++ b/lib/snmp/doc/src/snmpa_mib_data.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2013</year><year>2020</year>
+ <year>2013</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -363,7 +363,7 @@
</type>
<desc>
<p>Perform a backup of the mib-server data. </p>
- <p>Note that its implementation dependant (and also
+ <p>Note that its implementation dependent (and also
dependent on mib-storage is used) if a backup is possible. </p>
<marker id="code_change"></marker>
diff --git a/lib/snmp/doc/src/snmpa_mpd.xml b/lib/snmp/doc/src/snmpa_mpd.xml
index e9294430bd..3235352608 100644
--- a/lib/snmp/doc/src/snmpa_mpd.xml
+++ b/lib/snmp/doc/src/snmpa_mpd.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1999</year><year>2020</year>
+ <year>1999</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -170,7 +170,7 @@
<c>To</c> is a list of destination addresses and
their corresponding security parameters. This value is
received in the same message from the agent and then transformed
- trough <seeerl marker="#process_taddrs"><c>process_taddrs</c></seeerl>
+ through <seeerl marker="#process_taddrs"><c>process_taddrs</c></seeerl>
before passed to this function.</p>
<note>
diff --git a/lib/snmp/doc/src/snmpm.xml b/lib/snmp/doc/src/snmpm.xml
index bb0826f2ce..8807851518 100644
--- a/lib/snmp/doc/src/snmpm.xml
+++ b/lib/snmp/doc/src/snmpm.xml
@@ -130,7 +130,7 @@ sec_level() = noAuthNoPriv | authNoPriv | authPriv
<item>
<p>During the start of a system, when a client application
<em>could</em> start prior to the SNMP manager but is dependent
- upon it, and therefor has to wait for it to start.</p>
+ upon it, and therefore has to wait for it to start.</p>
</item>
<item>
<p>When the SNMP manager has crashed, the dependent client
@@ -558,59 +558,10 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<p>For <c>SnmpInfo</c>, see the user callback function
<seeerl marker="snmpm_user#handle_report">handle_report</seeerl>.</p>
- <!-- <marker id="sync_get"></marker> -->
<marker id="async_get2"></marker>
</desc>
</func>
- <!-- DEPRECATED
- <func>
- <name since="">sync_get(UserId, TargetName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get(UserId, TargetName, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get(UserId, TargetName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get(UserId, TargetName, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get(UserId, TargetName, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <fsummary>Synchronous <c>get-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>ContextName = string()</v>
- <v>Oids = [oid()]</v>
- <v>Timeout = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>SnmpReply = snmp_reply()</v>
- <v>Remaining = integer()</v>
- <v>Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
- <v>R = term()</v>
- <v>SecInfo = [sec_info()]</v>
- <v>sec_info() = {sec_tag(), ExpectedValue, ReceivedValue}</v>
- <v>sec_tag() = atom()</v>
- <v>ExpectedValue = ReceivedValue = term()</v>
- <v>SnmpInfo = term()</v>
- </type>
- <desc>
- <p>Synchronous <c>get-request</c>. </p>
- <p><c>Remaining</c> is the remaining time of the given or
- default timeout time.</p>
- <p>When <em>Reason</em> is <em>{send_failed, ...}</em> it means that
- the net_if process failed to send the message. This could happen
- because of any number of reasons, i.e. encoding error. <em>R</em>
- is the actual reason in this case. </p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
- <p>For <c>SnmpInfo</c>, see the user callback function
- <seeerl marker="snmpm_user#handle_report">handle_report</seeerl>.</p>
-
- <marker id="async_get2"></marker>
- </desc>
- </func>
- -->
-
<func>
<name since="OTP R14B03">async_get2(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason}</name>
<name since="OTP R14B03">async_get2(UserId, TargetName, Oids, SendOpts) -> {ok, ReqId} | {error, Reason}</name>
@@ -649,49 +600,10 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
for <em>this</em> request, they override any configuration done
when the agent was registered. </p>
- <!-- <marker id="async_get"></marker> -->
<marker id="sync_get_next2"></marker>
</desc>
</func>
- <!-- DEPRECATED
- <func>
- <name since="">async_get(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get(UserId, TargetName, ContextName, Oids) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get(UserId, TargetName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get(UserId, TargetName, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get(UserId, TargetName, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
- <fsummary>Asynchronous <c>get-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>ContextName = string()</v>
- <v>Oids = [oid()]</v>
- <v>Expire = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>ReqId = term()</v>
- <v>Reason = term()</v>
- </type>
- <desc>
- <p>Asynchronous <c>get-request</c>.</p>
- <p>The reply, if it arrives, will be delivered to the user
- through a call to the snmpm_user callback function
- <c>handle_pdu</c>.</p>
- <p>The <c>Expire</c> time indicates for how long the request is
- valid (after which the manager is free to delete it).</p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
-
- <marker id="sync_get_next2"></marker>
- </desc>
- </func>
- -->
-
<func>
<name since="OTP R14B03">sync_get_next2(UserId, TargetName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
<name since="OTP R14B03">sync_get_next2(UserId, TargetName, Oids, SendOpts) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
@@ -742,50 +654,9 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<p>For <c>SnmpInfo</c>, see the user callback function
<seeerl marker="snmpm_user#handle_report">handle_report</seeerl>.</p>
- <!-- <marker id="sync_get_next"></marker> -->
- <marker id="async_get_next2"></marker>
- </desc>
- </func>
-
- <!-- DEPRECATED
- <func>
- <name since="">sync_get_next(UserId, TargetName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_next(UserId, TargetName, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_next(UserId, TargetName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_next(UserId, TargetName, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_next(UserId, TargetName, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <fsummary>Synchronous <c>get-next-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>ContextName = string()</v>
- <v>Oids = [oid()]</v>
- <v>Timeout = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>SnmpReply = snmp_reply()</v>
- <v>Remaining = integer()</v>
- <v>Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
- <v>R = term()</v>
- </type>
- <desc>
- <p>Synchronous <c>get-next-request</c>. </p>
- <p><c>Remaining</c> time of the given or default timeout time.</p>
- <p>When <em>Reason</em> is <em>{send_failed, ...}</em> it means that
- the net_if process failed to send the message. This could happen
- because of any number of reasons, i.e. encoding error. <em>R</em>
- is the actual reason in this case. </p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
-
<marker id="async_get_next2"></marker>
</desc>
</func>
- -->
<func>
<name since="OTP R14B03">async_get_next2(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason}</name>
@@ -822,48 +693,10 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
for <em>this</em> request, they override any configuration done
when the agent was registered. </p>
- <!-- <marker id="async_get_next"></marker> -->
<marker id="sync_set2"></marker>
</desc>
</func>
- <!-- DEPRECATED
- <func>
- <name since="">async_get_next(UserId, TargetName, Oids) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_next(UserId, TargetName, ContextName, Oids) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_next(UserId, TargetName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_next(UserId, TargetName, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_next(UserId, TargetName, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
- <fsummary>Asynchronous <c>get-next-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>ContextName = string()</v>
- <v>Oids = [oid()]</v>
- <v>Expire = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>ReqId = integer()</v>
- <v>Reason = term()</v>
- </type>
- <desc>
- <p>Asynchronous <c>get-next-request</c>. </p>
- <p>The reply will be delivered to the user through a call
- to the snmpm_user callback function <c>handle_pdu</c>.</p>
- <p>The <c>Expire</c> time indicates for how long the request is
- valid (after which the manager is free to delete it).</p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
-
- <marker id="sync_set2"></marker>
- </desc>
- </func>
- -->
-
<func>
<name since="OTP R14B03">sync_set2(UserId, TargetName, VarsAndVals) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
<name since="OTP R14B03">sync_set2(UserId, TargetName, VarsAndVals, SendOpts) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
@@ -917,52 +750,9 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<p>For <c>SnmpInfo</c>, see the user callback function
<seeerl marker="snmpm_user#handle_report">handle_report</seeerl>.</p>
- <!-- <marker id="sync_set"></marker> -->
- <marker id="async_set2"></marker>
- </desc>
- </func>
-
- <!-- DEPRECATED
- <func>
- <name since="">sync_set(UserId, TargetName, VarsAndVals) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_set(UserId, TargetName, ContextName, VarsAndVals) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_set(UserId, TargetName, VarsAndVals, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_set(UserId, TargetName, ContextName, VarsAndVals, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_set(UserId, TargetName, ContextName, VarsAndVals, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <fsummary>Synchronous <c>set-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>ContextName = string()</v>
- <v>VarsAndVals = vars_and_vals()</v>
- <v>Timeout = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>SnmpReply = snmp_reply()</v>
- <v>Remaining = integer()</v>
- <v>Reason = {send_failed, ReqId, ActualReason} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
- <v>ActualReason = term()</v>
- </type>
- <desc>
- <p>Synchronous <c>set-request</c>. </p>
- <p><c>Remaining</c> time of the given or default timeout time.</p>
- <p>When <em>Reason</em> is <em>{send_failed, ...}</em> it means that
- the net_if process failed to send the message. This could happen
- because of any number of reasons, i.e. encoding error. <em>R</em>
- is the actual reason in this case. </p>
- <p>When <em>var_and_val()</em> is <em>{oid(), value()}</em>, the
- manager makes an educated guess based on the loaded mibs. </p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
-
<marker id="async_set2"></marker>
</desc>
</func>
- -->
<func>
<name since="OTP R14B03">async_set2(UserId, TargetName, VarsAndVals) -> {ok, ReqId} | {error, Reason}</name>
@@ -1004,48 +794,9 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
for <em>this</em> request, they override any configuration done
when the agent was registered. </p>
- <!-- <marker id="async_set"></marker> -->
- <marker id="sync_get_bulk2"></marker>
- </desc>
- </func>
-
- <!-- DEPRECATED
- <func>
- <name since="">async_set(UserId, TargetName, VarsAndVals) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_set(UserId, TargetName, ContextName, VarsAndVals) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_set(UserId, TargetName, VarsAndVals, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_set(UserId, TargetName, ContextName, VarsAndVals, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_set(UserId, TargetName, ContextName, VarsAndVals, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
- <fsummary>Asynchronous <c>set-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>VarsAndVals = vars_and_vals()</v>
- <v>Expire = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>ReqId = term()</v>
- <v>Reason = term()</v>
- </type>
- <desc>
- <p>Asynchronous <c>set-request</c>. </p>
- <p>The reply will be delivered to the user through a call
- to the snmpm_user callback function <c>handle_pdu</c>.</p>
- <p>The <c>Expire</c> time indicates for how long the request is
- valid (after which the manager is free to delete it).</p>
- <p>When <em>var_and_val()</em> is <em>{oid(), value()}</em>, the
- manager makes an educated guess based on the loaded mibs. </p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
-
<marker id="sync_get_bulk2"></marker>
</desc>
</func>
- -->
<func>
<name since="OTP R14B03">sync_get_bulk2(UserId, TragetName, NonRep, MaxRep, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
@@ -1099,52 +850,10 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<p>For <c>SnmpInfo</c>, see the user callback function
<seeerl marker="snmpm_user#handle_report">handle_report</seeerl>.</p>
- <!-- <marker id="sync_get_bulk"></marker> -->
<marker id="async_get_bulk2"></marker>
</desc>
</func>
- <!-- DEPRECATED
- <func>
- <name since="">sync_get_bulk(UserId, TragetName, NonRep, MaxRep, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_bulk(UserId, TragetName, NonRep, MaxRep, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids, Timeout) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <name since="">sync_get_bulk(UserId, TragetName, NonRep, MaxRep, ContextName, Oids, Timeout, ExtraInfo) -> {ok, SnmpReply, Remaining} | {error, Reason}</name>
- <fsummary>Synchronous <c>get-bulk-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>NonRep = integer()</v>
- <v>MaxRep = integer()</v>
- <v>ContextName = string()</v>
- <v>Oids = [oid()]</v>
- <v>Timeout = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>SnmpReply = snmp_reply()</v>
- <v>Remaining = integer()</v>
- <v>Reason = {send_failed, ReqId, R} | {invalid_sec_info, SecInfo, SnmpInfo} | term()</v>
- </type>
- <desc>
- <p>Synchronous <c>get-bulk-request</c> (See RFC1905).</p>
- <p><c>Remaining</c> time of the given or default timeout time.</p>
- <p>When <em>Reason</em> is <em>{send_failed, ...}</em> it means that
- the net_if process failed to send the message. This could happen
- because of any number of reasons, i.e. encoding error. <em>R</em>
- is the actual reason in this case. </p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
-
- <marker id="async_get_bulk2"></marker>
- </desc>
- </func>
- -->
-
<func>
<name since="OTP R14B03">async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids) -> {ok, ReqId} | {error, Reason}</name>
<name since="OTP R14B03">async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts) -> {ok, ReqId} | {error, Reason}</name>
@@ -1182,49 +891,9 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
for <em>this</em> request, they override any configuration done
when the agent was registered. </p>
- <!-- <marker id="async_get_bulk"></marker> -->
- <marker id="cancel_async_request"></marker>
- </desc>
- </func>
-
- <!-- DEPRECATED
- <func>
- <name since="">async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids, Expire) -> {ok, ReqId} | {error, Reason}</name>
- <name since="">async_get_bulk(UserId, TargetName, NonRep, MaxRep, ContextName, Oids, Expire, ExtraInfo) -> {ok, ReqId} | {error, Reason}</name>
- <fsummary>Asynchronous <c>get-bulk-request</c></fsummary>
- <type>
- <v>UserId = term()</v>
- <v>TargetName = target_name()</v>
- <v>NonRep = integer()</v>
- <v>MaxRep = integer()</v>
- <v>ContextName = string()</v>
- <v>Oids = [oid()]</v>
- <v>Expire = integer()</v>
- <v>ExtraInfo = term()</v>
- <v>ReqId = integer()</v>
- <v>Reason = term()</v>
- </type>
- <desc>
- <p>Asynchronous <c>get-bulk-request</c> (See RFC1905).</p>
- <p>The reply will be delivered to the user through a call
- to the snmpm_user callback function <c>handle_pdu</c>.</p>
- <p>The <c>Expire</c> time indicates for how long the request is
- valid (after which the manager is free to delete it).</p>
- <p><c>ExtraInfo</c> is an opaque data structure passed on to
- the net-if process. The net-if process included in this
- application makes, with one exception, no use of this info,
- so the only use for it in such a configuration (when using the
- built in net-if) would be tracing. The one usage exception is:
- <em>Any</em> tuple with <c>snmpm_extra_info_tag</c> as its first
- element is reserved for internal use. </p>
-
<marker id="cancel_async_request"></marker>
</desc>
</func>
- -->
<func>
<name since="">cancel_async_request(UserId, ReqId) -> ok | {error, Reason}</name>
@@ -1274,7 +943,7 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<c>LogName</c> defaults to "snmpm_log".
<c>LogFile</c> defaults to "snmpm.log".</p>
<p>The <c>Block</c> argument indicates if the log should be blocked
- during conversion. This could be usefull when converting large
+ during conversion. This could be useful when converting large
logs (when otherwise the log could wrap during conversion).
Defaults to <c>true</c>. </p>
<p>See <seeerl marker="snmp#log_to_txt">snmp:log_to_txt</seeerl>
@@ -1316,7 +985,7 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<c>LogName</c> defaults to "snmpm_log".
<c>LogFile</c> defaults to "snmpm.log".</p>
<p>The <c>Block</c> argument indicates if the log should be blocked
- during conversion. This could be usefull when converting large
+ during conversion. This could be useful when converting large
logs (when otherwise the log could wrap during conversion).
Defaults to <c>true</c>. </p>
<p>See <seeerl marker="snmp#log_to_io">snmp:log_to_io</seeerl>
@@ -1465,7 +1134,7 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<v>Reason = term()</v>
</type>
<desc>
- <p>Retreive the type (asn1 bertype) of an oid.</p>
+ <p>Retrieve the type (asn1 bertype) of an oid.</p>
<marker id="backup"></marker>
</desc>
@@ -1527,7 +1196,7 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
</type>
<desc>
<p>Restart the indicated process (<c>Ref</c>). Note that its not
- without risk to restart a process, and should therefor be used
+ without risk to restart a process, and should therefore be used
with care. </p>
<marker id="format_reason"></marker>
@@ -1558,9 +1227,9 @@ priv_key = [integer()] (length is 16 if priv = usmDESPrivProtocol | usmAesCfb1
<seeerl marker="snmpm_user#handle_error">handle_error</seeerl> user callback function.</p>
</item>
</list>
- <p><c>Prefix</c> should either be an indention string
+ <p><c>Prefix</c> should either be an indentation string
(e.g. a list of spaces) or a positive integer (which will be used
- to create the indention string of that length).</p>
+ to create the indentation string of that length).</p>
</desc>
</func>
</funcs>
diff --git a/lib/snmp/doc/src/structure.fig b/lib/snmp/doc/src/structure.fig
index c7feff6f47..c50a5b74b3 100644
--- a/lib/snmp/doc/src/structure.fig
+++ b/lib/snmp/doc/src/structure.fig
@@ -30,7 +30,7 @@ Inches
2400 900 8625 900 8625 6000 2400 6000 2400 900
2 2 0 1 -1 7 0 0 -1 0.000 0 0 -1 0 0 5
8625 6000 8625 6000 8625 6000 8625 6000 8625 6000
-4 0 -1 0 0 0 12 0.0000 4 135 1230 3525 3000 Assosiacition file\001
+4 0 -1 0 0 0 12 0.0000 4 135 1230 3525 3000 Association file\001
4 0 -1 0 0 0 12 0.0000 4 180 990 3750 1575 SNMP Agent\001
4 0 -1 0 0 0 12 0.0000 4 135 345 4050 1950 MIB\001
4 0 -1 0 0 0 12 0.0000 4 180 1080 3075 4275 snmp_local_db\001
diff --git a/lib/snmp/examples/ex1/Makefile b/lib/snmp/examples/ex1/Makefile
index a3d02ea778..b4e7c7f2dd 100644
--- a/lib/snmp/examples/ex1/Makefile
+++ b/lib/snmp/examples/ex1/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2016. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -67,7 +67,7 @@ TARGET_FILES= \
# Targets
# ----------------------------------------------------
-debug opt: build
+$(TYPES): build
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/snmp/examples/ex2/Makefile b/lib/snmp/examples/ex2/Makefile
index 624a1df2ee..829297e802 100644
--- a/lib/snmp/examples/ex2/Makefile
+++ b/lib/snmp/examples/ex2/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2006-2016. All Rights Reserved.
+# Copyright Ericsson AB 2006-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -69,7 +69,7 @@ TARGET_FILES= \
# Targets
# ----------------------------------------------------
-debug opt: build
+$(TYPES): build
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/snmp/mibs/Makefile.in b/lib/snmp/mibs/Makefile.in
index 6419009a6a..428587617f 100644
--- a/lib/snmp/mibs/Makefile.in
+++ b/lib/snmp/mibs/Makefile.in
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -127,7 +127,7 @@ endif
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
$(ERL_TOP)/lib/snmp/bin/snmp-v2tov1: $(ERL_TOP)/lib/snmp/bin/snmp-v2tov1.src
$(gen_verbose)$(PERL) -p -e 's?%PERL%?$(PERL)? ' < $< > $@
diff --git a/lib/snmp/priv/conf/agent/Makefile b/lib/snmp/priv/conf/agent/Makefile
index e905f55999..7e8f4ef6c6 100644
--- a/lib/snmp/priv/conf/agent/Makefile
+++ b/lib/snmp/priv/conf/agent/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2016. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@ include files.mk
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/snmp/priv/conf/manager/Makefile b/lib/snmp/priv/conf/manager/Makefile
index 27024c171f..0659b900eb 100644
--- a/lib/snmp/priv/conf/manager/Makefile
+++ b/lib/snmp/priv/conf/manager/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2016. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -44,7 +44,7 @@ include files.mk
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/snmp/src/agent/Makefile b/lib/snmp/src/agent/Makefile
index 1da0f33c9d..815b9f16cc 100644
--- a/lib/snmp/src/agent/Makefile
+++ b/lib/snmp/src/agent/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -110,8 +110,8 @@ ERL_COMPILE_FLAGS += -I../../include \
# Targets
# ----------------------------------------------------
-debug:
- @$(MAKE) TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt:
@$(MAKE) behaviour_targets
diff --git a/lib/snmp/src/agent/modules.mk b/lib/snmp/src/agent/modules.mk
index 39c9aca1cd..32df6a9a9b 100644
--- a/lib/snmp/src/agent/modules.mk
+++ b/lib/snmp/src/agent/modules.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2019. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -41,9 +41,9 @@ MIB_MODULES = \
snmp_view_based_acm_mib
# snmpa is "plain" interface module but also defines some agent specific types
-# and therefor must be compiled before the modules that use them, including
+# and therefore must be compiled before the modules that use them, including
# the behaviour modules...
-# Some of the MIB modules also define types used elsewhere and therefor
+# Some of the MIB modules also define types used elsewhere and therefore
# has to be built before the other mods.
# snmpa_mib_data_ttln
MODULES = \
diff --git a/lib/snmp/src/agent/snmp_framework_mib.erl b/lib/snmp/src/agent/snmp_framework_mib.erl
index 5db686d29b..3f2179c11e 100644
--- a/lib/snmp/src/agent/snmp_framework_mib.erl
+++ b/lib/snmp/src/agent/snmp_framework_mib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -474,7 +474,7 @@ delete_context(Key) ->
%%-----------------------------------------------------------------
%% Instrumentation functions
-%% Retreive functions are also used internally by the agent, so
+%% Retrieve functions are also used internally by the agent, so
%% don't change the interface without changing those functions.
%% Note that if these functions implementations are changed,
%% an error can make the agent crash, as no error detection is
diff --git a/lib/snmp/src/agent/snmp_generic.erl b/lib/snmp/src/agent/snmp_generic.erl
index 429f78abd0..6419503322 100644
--- a/lib/snmp/src/agent/snmp_generic.erl
+++ b/lib/snmp/src/agent/snmp_generic.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2019. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -134,7 +134,7 @@ table_max_col(NameDb, Col) -> % ret largest element in Col
%%------------------------------------------------------------------
-%% Theses functions could be in the MIB for simple
+%% These functions could be in the MIB for simple
%% variables or tables, i.e. vars without complex
%% set-operations. If there are complex set op, an
%% extra layer-function should be added, and that
@@ -566,7 +566,7 @@ table_create_rest(Col, Max, StatusCol, Status, Cols, NoAccs) when Col =< Max->
%% Defs is a list of {Col, DefVal}, in Column order.
%% Returns a new row (a list of values) with the same values as
%% InitRow, except if InitRow has value noinit in a column, and
-%% the corresponing Col has a DefVal in Defs, then the DefVal
+%% the corresponding Col has a DefVal in Defs, then the DefVal
%% will be the new value.
%%------------------------------------------------------------------
table_defaults(InitRow, Defs) -> table_defaults(InitRow, 1, Defs).
diff --git a/lib/snmp/src/agent/snmp_generic_mnesia.erl b/lib/snmp/src/agent/snmp_generic_mnesia.erl
index 131b9b0368..e2e8bba8c5 100644
--- a/lib/snmp/src/agent/snmp_generic_mnesia.erl
+++ b/lib/snmp/src/agent/snmp_generic_mnesia.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -37,7 +37,7 @@
%%%-----------------------------------------------------------------
%%------------------------------------------------------------------
-%% Theses functions could be in the MIB for simple
+%% These functions could be in the MIB for simple
%% variables or tables, i.e. vars without complex
%% set-operations. If there are complex set op, an
%% extra layer-function should be added, and that
diff --git a/lib/snmp/src/agent/snmp_shadow_table.erl b/lib/snmp/src/agent/snmp_shadow_table.erl
index f9181f70a7..12aa659213 100644
--- a/lib/snmp/src/agent/snmp_shadow_table.erl
+++ b/lib/snmp/src/agent/snmp_shadow_table.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2015. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -93,9 +93,9 @@ update(Name, UpdateFunc, Interval) ->
%% Args: Extra = {Name, SnmpKey, Attributes, Interval, UpdateFunc}
%% Purpose: Instrumentation function for the table.
%% Name is the name of the table
-%% SnmpKey is the snmpkey as it should be specifed in order
+%% SnmpKey is the snmpkey as it should be specified in order
%% to create the Mnesia table as an SNMP table
-%% Attributes is the attributes as it should be specifed in order
+%% Attributes is the attributes as it should be specified in order
%% to create the Mnesia table as an SNMP table
%% Interval is the minimum time in milliseconds between two
%% updates of the table
diff --git a/lib/snmp/src/agent/snmp_target_mib.erl b/lib/snmp/src/agent/snmp_target_mib.erl
index 22fd3acb84..30a3f08749 100644
--- a/lib/snmp/src/agent/snmp_target_mib.erl
+++ b/lib/snmp/src/agent/snmp_target_mib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2019. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -595,7 +595,7 @@ get_target_addr({Tab, mnesia}, Key) ->
snmpTargetAddrRowStatus = ?'RowStatus_active'}} ->
case get_target_params(Params) of
undefined ->
- config_err("Failed retreiving target params [~p]"
+ config_err("Failed retrieving target params [~p]"
"~n for ~p [~p]", [Params, Key, TAddress]),
{error, {not_found, {target_params, Key, Params}}};
TargetParams ->
@@ -612,7 +612,7 @@ get_target_addr(TabDb, Key) ->
_Storage, ?'RowStatus_active', _TargetEngineId,_TMask,_MMS} ->
case get_target_params(Params) of
undefined ->
- config_err("Failed retreiving target params [~p]"
+ config_err("Failed retrieving target params [~p]"
"~n for target ~p [~p]",
[Params, Key, TAddress]),
{error, {not_found, {target_params, Key, Params}}};
diff --git a/lib/snmp/src/agent/snmp_user_based_sm_mib.erl b/lib/snmp/src/agent/snmp_user_based_sm_mib.erl
index 0b94f4604a..e75cb7c5ce 100644
--- a/lib/snmp/src/agent/snmp_user_based_sm_mib.erl
+++ b/lib/snmp/src/agent/snmp_user_based_sm_mib.erl
@@ -830,7 +830,7 @@ validate_set(Error, _RowIndex, _Cols) ->
%%-----------------------------------------------------------------
%% Here's the alg: If this is the first time the CloneFrom is written,
%% we must check that the CloneFrom row exists, so we can invoke the
-%% clone process in the set phase. Otherwise, the set succed, with
+%% clone process in the set phase. Otherwise, the set succeed, with
%% no further checks.
%%-----------------------------------------------------------------
validate_clone_from(RowIndex, Cols) ->
@@ -902,7 +902,7 @@ validate_auth_protocol(RowIndex, Cols) ->
%% now; set is ok if new protocol is usmNoAuthProtocol
case AuthProtocol of
?usmNoAuthProtocol ->
- %% Check that the Priv protocl is noPriv
+ %% Check that the Priv protocol is noPriv
case get_priv_proto(RowIndex, Cols) of
?usmNoPrivProtocol -> ok;
_ -> inconsistentValue(?usmUserAuthProtocol)
@@ -928,7 +928,7 @@ validate_auth_protocol(RowIndex, Cols) ->
%% hash function.
case AuthProtocol of
?usmNoAuthProtocol ->
- %% Check that the Priv protocl is noPriv
+ %% Check that the Priv protocol is noPriv
case get_priv_proto(RowIndex, Cols) of
?usmNoPrivProtocol -> ok;
_ -> inconsistentValue(?usmUserAuthProtocol)
diff --git a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl
index a5a65d9326..6fcd92bf03 100644
--- a/lib/snmp/src/agent/snmp_view_based_acm_mib.erl
+++ b/lib/snmp/src/agent/snmp_view_based_acm_mib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2019. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -285,7 +285,7 @@ delete_sec2group(Key) ->
{error, delete_failed}
end.
-%% NOTE: This function must be used in conjuction with
+%% NOTE: This function must be used in conjunction with
%% snmpa_vacm:dump_table.
%% That is, when all access has been added, call
%% snmpa_vacm:dump_table/0
@@ -357,7 +357,7 @@ init_vacm_mnesia() ->
%% The 5 is intentional: It is a trick to get a tuple with the
%% columns needed by the vacm ets-table (corresponding to the
- %% tuple read from the config files). Therefor, 5 since it it
+ %% tuple read from the config files). Therefore, 5 since it it
%% is not a real foi...
snmp_generic:table_foreach({vacmAccessTable, mnesia}, F, 5).
@@ -1048,7 +1048,7 @@ imask2emask(IMask) ->
imask2emask([], EMask) ->
lists:reverse(EMask);
imask2emask(IMask, EMask) ->
- %% Make sure we have atleast 8 bits
+ %% Make sure we have at least 8 bits
%% (maybe extend with 1's)
IMask2 =
case length(IMask) of
diff --git a/lib/snmp/src/agent/snmpa.erl b/lib/snmp/src/agent/snmpa.erl
index 995e6d627d..74205e5716 100644
--- a/lib/snmp/src/agent/snmpa.erl
+++ b/lib/snmp/src/agent/snmpa.erl
@@ -149,6 +149,11 @@
%% Options specific to the above module
-type mib_storage_options() :: list().
+-type mib_module() :: atom().
+-type table_name() :: atom().
+-type variable_name() :: atom().
+-type mib_info() :: {mib_module(), [table_name()], [variable_name()]}.
+
%%-----------------------------------------------------------------
%% This utility function is used to convert an old SNMP application
@@ -340,11 +345,11 @@ unload_mib(Agent, Mib) ->
end.
unload_mibs(Mibs) ->
- unload_mibs(snmp_master_agent, Mibs, false).
+ unload_mibs(snmp_master_agent, Mibs).
unload_mibs(Agent, Mibs) when is_list(Mibs) ->
- snmpa_agent:unload_mibs(Agent, Mibs);
+ unload_mibs(Agent, Mibs, false);
unload_mibs(Mibs, Force)
- when is_list(Mibs) andalso ((Force =:= true) orelse (Force =:= false)) ->
+ when is_list(Mibs) andalso is_boolean(Force) ->
unload_mibs(snmp_master_agent, Mibs, Force).
-spec unload_mibs(Agent :: pid() | atom(),
@@ -353,7 +358,7 @@ unload_mibs(Mibs, Force)
ok | {error, {'unload aborted at', MibName :: string(), InternalReason :: not_loaded | term()}}.
unload_mibs(Agent, Mibs, Force)
- when is_list(Mibs) andalso ((Force =:= true) orelse (Force =:= false)) ->
+ when is_list(Mibs) andalso is_boolean(Force) ->
snmpa_agent:unload_mibs(Agent, Mibs, Force).
@@ -369,6 +374,8 @@ whereis_mib(Agent, Mib) when is_atom(Mib) ->
%% -
+-spec mibs_info() -> [mib_info()].
+
mibs_info() ->
[
{snmp_standard_mib,
diff --git a/lib/snmp/src/agent/snmpa_acm.erl b/lib/snmp/src/agent/snmpa_acm.erl
index de67df8a06..74efae4ad5 100644
--- a/lib/snmp/src/agent/snmpa_acm.erl
+++ b/lib/snmp/src/agent/snmpa_acm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -234,7 +234,7 @@ invalidate_ca_cache() ->
%%-----------------------------------------------------------------
%% NOTE: The do_get MUST be executed in the Master agents's
-%% context. Therefor, force master-agent to do a GET to
+%% context. Therefore, force master-agent to do a GET to
%% retrieve the value for snmpEnableAuthenTraps.
%% A user may have another impl. than default for this
%% variable.
diff --git a/lib/snmp/src/agent/snmpa_agent.erl b/lib/snmp/src/agent/snmpa_agent.erl
index 5039b08391..c1675e40f8 100644
--- a/lib/snmp/src/agent/snmpa_agent.erl
+++ b/lib/snmp/src/agent/snmpa_agent.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -65,18 +65,11 @@
-export([increment_counter/3]).
-export([restart_worker/1, restart_set_worker/1, restart_notif_worker/1]).
-%% For backward compatibillity
--export([send_trap/6, send_trap/7]).
-
%% Internal exports
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
terminate/2, code_change/3, tr_var/2, tr_varbind/1,
handle_pdu/8, worker/4, worker_loop/2,
do_send_trap/7, do_send_trap/8]).
-%% <BACKWARD-COMPAT>
--export([handle_pdu/7,
- load_mibs/2, unload_mibs/2]).
-%% </BACKWARD-COMPAT>
-include("snmpa_internal.hrl").
@@ -559,21 +552,9 @@ subagent_set(SubAgent, Arguments) ->
call(SubAgent, {subagent_set, Arguments, PduData}).
-%% Called by administrator (not agent; deadlock would occur)
-%% <BACKWARD-COMPAT>
-load_mibs(Agent, Mibs) ->
- load_mibs(Agent, Mibs, false).
-%% </BACKWARD-COMPAT>
-
load_mibs(Agent, Mibs, Force) ->
call(Agent, {load_mibs, Mibs, Force}).
-%% Called by administrator (not agent; deadlock would occur)
-%% <BACKWARD-COMPAT>
-unload_mibs(Agent, Mibs) ->
- unload_mibs(Agent, Mibs, false).
-%% </BACKWARD-COMPAT>
-
unload_mibs(Agent, Mibs, Force) ->
call(Agent, {unload_mibs, Mibs, Force}).
@@ -622,51 +603,6 @@ send_notification(Agent, Notification, SendOpts) ->
Msg = {send_notif, Notification, SendOpts},
maybe_call(Agent, Msg).
-%% <BACKWARD-COMPAT>
-send_trap(Agent, Trap, NotifyName, CtxName, Recv, Varbinds) ->
- ?d("send_trap -> entry with"
- "~n self(): ~p"
- "~n Agent: ~p [~p]"
- "~n Trap: ~p"
- "~n NotifyName: ~p"
- "~n CtxName: ~p"
- "~n Recv: ~p"
- "~n Varbinds: ~p",
- [self(), Agent, wis(Agent),
- Trap, NotifyName, CtxName, Recv, Varbinds]),
- SendOpts = [
- {receiver, Recv},
- {varbinds, Varbinds},
- {name, NotifyName},
- {context, CtxName},
- {extra, ?DEFAULT_NOTIF_EXTRA_INFO}
- ],
- send_notification(Agent, Trap, SendOpts).
-
-send_trap(Agent, Trap, NotifyName, CtxName, Recv, Varbinds, LocalEngineID) ->
- ?d("send_trap -> entry with"
- "~n self(): ~p"
- "~n Agent: ~p [~p]"
- "~n Trap: ~p"
- "~n NotifyName: ~p"
- "~n CtxName: ~p"
- "~n Recv: ~p"
- "~n Varbinds: ~p"
- "~n LocalEngineID: ~p",
- [self(), Agent, wis(Agent),
- Trap, NotifyName, CtxName, Recv, Varbinds, LocalEngineID]),
- SendOpts = [
- {receiver, Recv},
- {varbinds, Varbinds},
- {name, NotifyName},
- {context, CtxName},
- {extra, ?DEFAULT_NOTIF_EXTRA_INFO},
- {local_engine_id, LocalEngineID}
- ],
- send_notification(Agent, Trap, SendOpts).
-
-%% </BACKWARD-COMPAT>
-
%% -- Discovery functions --
@@ -863,51 +799,6 @@ handle_info({send_notif, Notification, SendOpts}, S) ->
{noreply, S}
end;
-%% <BACKWARD-COMPAT>
-handle_info({send_trap, Trap, NotifyName, ContextName, Recv, Varbinds}, S) ->
- ?vlog("[handle_info] send trap request:"
- "~n Trap: ~p"
- "~n NotifyName: ~p"
- "~n ContextName: ~p"
- "~n Recv: ~p"
- "~n Varbinds: ~p",
- [Trap, NotifyName, ContextName, Recv, Varbinds]),
- ExtraInfo = ?DEFAULT_NOTIF_EXTRA_INFO,
- LocalEngineID = local_engine_id(S),
- case (catch handle_send_trap(S, Trap, NotifyName, ContextName,
- Recv, Varbinds, LocalEngineID, ExtraInfo)) of
- {ok, NewS} ->
- {noreply, NewS};
- {'EXIT', R} ->
- ?vinfo("Trap not sent:~n ~p", [R]),
- {noreply, S};
- _ ->
- {noreply, S}
- end;
-
-handle_info({send_trap, Trap, NotifyName, ContextName, Recv, Varbinds,
- LocalEngineID}, S) ->
- ?vlog("[handle_info] send trap request:"
- "~n Trap: ~p"
- "~n NotifyName: ~p"
- "~n ContextName: ~p"
- "~n Recv: ~p"
- "~n Varbinds: ~p"
- "~n LocalEngineID: ~p",
- [Trap, NotifyName, ContextName, Recv, Varbinds, LocalEngineID]),
- ExtraInfo = ?DEFAULT_NOTIF_EXTRA_INFO,
- case (catch handle_send_trap(S, Trap, NotifyName, ContextName,
- Recv, Varbinds, LocalEngineID, ExtraInfo)) of
- {ok, NewS} ->
- {noreply, NewS};
- {'EXIT', R} ->
- ?vinfo("Trap not sent:~n ~p", [R]),
- {noreply, S};
- _ ->
- {noreply, S}
- end;
-%% </BACKWARD-COMPAT>
-
handle_info({forward_trap, TrapRecord, NotifyName, ContextName,
Recv, Varbinds, ExtraInfo}, S) ->
?vlog("[handle_info] forward trap request:"
@@ -929,30 +820,6 @@ handle_info({forward_trap, TrapRecord, NotifyName, ContextName,
{noreply, S}
end;
-%% <BACKWARD-COMPAT>
-handle_info({forward_trap, TrapRecord, NotifyName, ContextName,
- Recv, Varbinds}, S) ->
- ?vlog("[handle_info] forward trap request:"
- "~n TrapRecord: ~p"
- "~n NotifyName: ~p"
- "~n ContextName: ~p"
- "~n Recv: ~p"
- "~n Varbinds: ~p",
- [TrapRecord, NotifyName, ContextName, Recv, Varbinds]),
- ExtraInfo = ?DEFAULT_NOTIF_EXTRA_INFO,
- LocalEngineID = ?DEFAULT_LOCAL_ENGINE_ID,
- case (catch maybe_send_trap(S, TrapRecord, NotifyName, ContextName,
- Recv, Varbinds, LocalEngineID, ExtraInfo)) of
- {ok, NewS} ->
- {noreply, NewS};
- {'EXIT', R} ->
- ?vinfo("Trap not sent:~n ~p", [R]),
- {noreply, S};
- _ ->
- {noreply, S}
- end;
-%% </BACKWARD-COMPAT>
-
handle_info({backup_done, Reply}, #state{backup = {_, From}} = S) ->
?vlog("[handle_info] backup done:"
"~n Reply: ~p", [Reply]),
@@ -1075,55 +942,6 @@ handle_call({send_notif, Notification, SendOpts}, _From, S) ->
{reply, {error, send_failed}, S}
end;
-%% <BACKWARD-COMPAT>
-handle_call({send_trap, Trap, NotifyName, ContextName, Recv, Varbinds},
- _From, S) ->
- ?vlog("[handle_call] send trap request:"
- "~n Trap: ~p"
- "~n NotifyName: ~p"
- "~n ContextName: ~p"
- "~n Recv: ~p"
- "~n Varbinds: ~p",
- [Trap, NotifyName, ContextName, Recv, Varbinds]),
- ExtraInfo = ?DEFAULT_NOTIF_EXTRA_INFO,
- LocalEngineID = local_engine_id(S),
- case (catch handle_send_trap(S, Trap, NotifyName, ContextName,
- Recv, Varbinds, LocalEngineID, ExtraInfo)) of
- {ok, NewS} ->
- {reply, ok, NewS};
- {'EXIT', Reason} ->
- ?vinfo("Trap not sent:~n ~p", [Reason]),
- {reply, {error, {send_failed, Reason}}, S};
- _ ->
- ?vinfo("Trap not sent", []),
- {reply, {error, send_failed}, S}
- end;
-
-handle_call({send_trap, Trap, NotifyName,
- ContextName, Recv, Varbinds, LocalEngineID},
- _From, S) ->
- ?vlog("[handle_call] send trap request:"
- "~n Trap: ~p"
- "~n NotifyName: ~p"
- "~n ContextName: ~p"
- "~n Recv: ~p"
- "~n Varbinds: ~p"
- "~n LocalEngineID: ~p",
- [Trap, NotifyName, ContextName, Recv, Varbinds, LocalEngineID]),
- ExtraInfo = ?DEFAULT_NOTIF_EXTRA_INFO,
- case (catch handle_send_trap(S, Trap, NotifyName, ContextName,
- Recv, Varbinds, LocalEngineID, ExtraInfo)) of
- {ok, NewS} ->
- {reply, ok, NewS};
- {'EXIT', Reason} ->
- ?vinfo("Trap not sent:~n ~p", [Reason]),
- {reply, {error, {send_failed, Reason}}, S};
- _ ->
- ?vinfo("Trap not sent", []),
- {reply, {error, send_failed}, S}
- end;
-%% </BACKWARD-COMPAT>
-
handle_call({discovery,
TargetName, Notification, ContextName, Vbs, DiscoHandler,
ExtraInfo},
@@ -1262,22 +1080,10 @@ handle_call({unregister_subagent, SubTreeOid}, _From, S) ->
end,
{reply, Reply, S};
-%% <BACKWARD-COMPAT>
-handle_call({load_mibs, Mibs}, _From, S) ->
- ?vlog("load mibs ~p", [Mibs]),
- {reply, snmpa_mib:load_mibs(get(mibserver), Mibs), S};
-%% </BACKWARD-COMPAT>
-
handle_call({load_mibs, Mibs, Force}, _From, S) ->
?vlog("[~w] load mibs ~p", [Force, Mibs]),
{reply, snmpa_mib:load_mibs(get(mibserver), Mibs, Force), S};
-%% <BACKWARD-COMPAT>
-handle_call({unload_mibs, Mibs}, _From, S) ->
- ?vlog("unload mibs ~p", [Mibs]),
- {reply, snmpa_mib:unload_mibs(get(mibserver), Mibs), S};
-%% </BACKWARD-COMPAT>
-
handle_call({unload_mibs, Mibs, Force}, _From, S) ->
?vlog("[~w] unload mibs ~p", [Force, Mibs]),
{reply, snmpa_mib:unload_mibs(get(mibserver), Mibs, Force), S};
@@ -1876,46 +1682,6 @@ worker_loop(Master, Report) ->
exit(normal);
-
-
- %% *************************************************************
- %%
- %% Kept for backward compatibillity reasons
- %%
- %% *************************************************************
-
- {Vsn, Pdu, PduMS, ACMData, Address, Extra} ->
- ?vtrace("worker_loop -> received request", []),
- handle_pdu2(Vsn, Pdu, PduMS, ACMData, Address,
- ?DEFAULT_GB_MAX_VBS, Extra),
- Master ! worker_available;
-
- %% We don't trap exits!
- {TrapRec, NotifyName, ContextName, Recv, Vbs} ->
- ?vtrace("worker_loop -> send trap:"
- "~n ~p", [TrapRec]),
- snmpa_trap:send_trap(TrapRec, NotifyName,
- ContextName, Recv, Vbs, get(net_if)),
- Master ! worker_available;
-
- %% We don't trap exits!
- {send_trap,
- TrapRec, NotifyName, ContextName, Recv, Vbs, LocalEngineID,
- ExtraInfo} ->
- ?vtrace("worker_loop -> send trap:"
- "~n ~p", [TrapRec]),
- snmpa_trap:send_trap(TrapRec, NotifyName,
- ContextName, Recv, Vbs,
- LocalEngineID, ExtraInfo,
- get(net_if)),
- Master ! worker_available;
-
- {verbosity, Verbosity} ->
- put(verbosity, snmp_verbosity:validate(Verbosity));
-
- terminate ->
- exit(normal);
-
_X ->
%% ignore
ignore_unknown
@@ -1972,12 +1738,6 @@ handle_snmp_pdu(_, _Vsn, _Pdu, _PduMS, _ACMData, _Address, _Extra, S) ->
S.
-%% Called via the spawn_thread function
-%% <BACKWARD-COMPAT>
-handle_pdu(Vsn, Pdu, PduMS, ACMData, Address, Extra, Dict) ->
- handle_pdu(Vsn, Pdu, PduMS, ACMData, Address, ?DEFAULT_GB_MAX_VBS, Extra,
- Dict).
-%% </BACKWARD-COMPAT>
handle_pdu(Vsn, Pdu, PduMS, ACMData, Address, GbMaxVBs, Extra, Dict) ->
lists:foreach(fun({Key, Val}) -> put(Key, Val) end, Dict),
put(sname, pdu_handler_short_name(get(sname))),
@@ -2373,7 +2133,7 @@ handle_discovery_response(#state{disco = #disco{target = TargetName,
"~n ManagerEngineId: ~p", [TargetName, ManagerEngineId]),
%% This is end of stage 1.
%% So, first we need to update the database with the EngineId of the
- %% manager and then deside if we should continue with stage 2. E.g.
+ %% manager and then decide if we should continue with stage 2. E.g.
%% establish authenticated communication.
case snmp_target_mib:set_target_engine_id(TargetName, ManagerEngineId) of
true when Disco#disco.sec_level =:= ?'SnmpSecurityLevel_noAuthNoPriv' ->
@@ -2766,7 +2526,7 @@ validate_next_v1_2([], _MibView, Res) ->
%% column, we'll try to find the next instance. This will be the
%% next row in the table, which is a Counter64 value as well. This
%% means that we will loop through the entire table, until we find
-%% a column that isn't a Counter64 column. We can optimze this by
+%% a column that isn't a Counter64 column. We can optimize this by
%% adding 1 to the column-no in the oid of this instance.
%% If the table is implemented by a subagent this does not help,
%% we'll call that subagent many times. But it shouldn't be any
diff --git a/lib/snmp/src/agent/snmpa_general_db.erl b/lib/snmp/src/agent/snmpa_general_db.erl
index a1e91b2b3c..306bb79769 100644
--- a/lib/snmp/src/agent/snmpa_general_db.erl
+++ b/lib/snmp/src/agent/snmpa_general_db.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@
%% Open or create a database table. In the mnesia/dets case,
%% where the table is stored on disc, it could be of interest
%% to clear the table. This is controlled by the Action parameter.
-%% An empty node list ([]), is traslated into a list containing
+%% An empty node list ([]), is translated into a list containing
%% only the own node.
%% ---------------------------------------------------------------
open({mnesia,Nodes,clear}, Name, RecName, Attr, Type) when is_list(Nodes) ->
diff --git a/lib/snmp/src/agent/snmpa_get.erl b/lib/snmp/src/agent/snmpa_get.erl
index c4f4f44095..7c8afe3569 100644
--- a/lib/snmp/src/agent/snmpa_get.erl
+++ b/lib/snmp/src/agent/snmpa_get.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2019-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2019-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -143,7 +143,7 @@ do_get_local([], Res, _IsNotification) ->
%%-----------------------------------------------------------------
%% Func: do_get_subagents/2
%% Purpose: Loop the list of varbinds for different subagents.
-%% For each of them, call sub_agent_get to retreive
+%% For each of them, call sub_agent_get to retrieve
%% the values for them.
%% Returns: {noError, 0, ListOfNewVarbinds} |
%% {ErrorStatus, ErrorIndex, []}
@@ -928,7 +928,7 @@ validate_tab_next_res(TooMany, [], Mfa, _Res, _, _, I) ->
%%-----------------------------------------------------------------
%% Func: get_next_sa/4
%% Purpose: Loop the list of varbinds for the subagent.
-%% Call subagent_get_next to retreive
+%% Call subagent_get_next to retrieve
%% the next varbinds.
%% Returns: {ok, ListOfNewVbs, ListOfEndOfMibViewsVbs} |
%% {ErrorStatus, ErrorIndex}
diff --git a/lib/snmp/src/agent/snmpa_local_db.erl b/lib/snmp/src/agent/snmpa_local_db.erl
index c9093fcdb9..63879f1acb 100644
--- a/lib/snmp/src/agent/snmpa_local_db.erl
+++ b/lib/snmp/src/agent/snmpa_local_db.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2019. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -663,7 +663,7 @@ code_change(_Vsn, State, _Extra) ->
%%----------------------------------------------------------
handle_backup(D, BackupDir) ->
- %% First check that we do not wrote to the corrent db-dir...
+ %% First check that we do not wrote to the current db-dir...
?vtrace("handle_backup -> entry with"
"~n D: ~p"
"~n BackupDir: ~p", [D, BackupDir]),
@@ -1215,7 +1215,7 @@ cast(Msg) ->
%% ----------------------------------------------------------------
%% DETS wrapper functions
-%% The purpose of these fuctions is basically to hide the shadow
+%% The purpose of these functions is basically to hide the shadow
%% table.
%% Changes are made both in dets and in the shadow table.
%% Reads are made from the shadow table.
diff --git a/lib/snmp/src/agent/snmpa_mib.erl b/lib/snmp/src/agent/snmpa_mib.erl
index fe98fc2585..23d5468897 100644
--- a/lib/snmp/src/agent/snmpa_mib.erl
+++ b/lib/snmp/src/agent/snmpa_mib.erl
@@ -47,11 +47,6 @@
-export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2,
code_change/3]).
-%% <BACKWARD-COMPAT>
--export([load_mibs/2, unload_mibs/2]).
-%% </BACKWARD-COMPAT>
-
-
-include_lib("kernel/include/file.hrl").
-include("snmpa_internal.hrl").
-include("snmp_types.hrl").
@@ -204,11 +199,6 @@ next(MibServer, Oid, MibView) ->
%% Returns: ok | {error, Reason}
%%----------------------------------------------------------------------
-%% <BACKWARD-COMPAT>
-load_mibs(MibServer, Mibs) ->
- load_mibs(MibServer, Mibs, false).
-%% </BACKWARD-COMPAT>
-
load_mibs(MibServer, Mibs, Force) ->
call(MibServer, {load_mibs, Mibs, Force}).
@@ -219,10 +209,6 @@ load_mibs(MibServer, Mibs, Force) ->
%% Force is a boolean
%% Returns: ok | {error, Reason}
%%----------------------------------------------------------------------
-%% <BACKWARD-COMPAT>
-unload_mibs(MibServer, Mibs) ->
- unload_mibs(MibServer, Mibs, false).
-%% </BACKWARD-COMPAT>
unload_mibs(MibServer, Mibs, Force) ->
call(MibServer, {unload_mibs, Mibs, Force}).
@@ -514,11 +500,6 @@ handle_call({next, Oid, MibView}, _From,
?vdebug("next -> Reply: ~p", [Reply]),
{reply, Reply, NewState};
-%% <BACKWARD-COMPAT>
-handle_call({load_mibs, Mibs}, From, State) ->
- handle_call({load_mibs, Mibs, false}, From, State);
-%% </BACKWARD-COMPAT>
-
handle_call({load_mibs, Mibs, Force}, _From,
#state{data = Data,
teo = TeOverride,
@@ -540,11 +521,6 @@ handle_call({load_mibs, Mibs, Force}, _From,
Mod:sync(NData),
{reply, Reply, State#state{data = NData, cache = NewCache}};
-%% <BACKWARD-COMPAT>
-handle_call({unload_mibs, Mibs}, From, State) ->
- handle_call({unload_mibs, Mibs, false}, From, State);
-%% </BACKWARD-COMPAT>
-
handle_call({unload_mibs, Mibs, Force}, _From,
#state{data = Data,
teo = TeOverride,
diff --git a/lib/snmp/src/agent/snmpa_mib_data_ttln.erl b/lib/snmp/src/agent/snmpa_mib_data_ttln.erl
index 959230b1dd..0c39489852 100644
--- a/lib/snmp/src/agent/snmpa_mib_data_ttln.erl
+++ b/lib/snmp/src/agent/snmpa_mib_data_ttln.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -753,7 +753,7 @@ find_node(_D, Node, _RestOfOid, _RevOid) ->
%% {subagent, SubAgentPid, SAOid} |
%% {variable, MibEntry, VarOid} |
%% {table, TableOid, TableRestOid, MibEntry}
-%% If a variable is returnes, it is in the MibView.
+%% If a variable is returns, it is in the MibView.
%% If a table or subagent is returned, it *may* be in the MibView.
%%-----------------------------------------------------------------
next(#mib_data{tree = T} = D, Oid, MibView) ->
@@ -778,7 +778,7 @@ next_node(_D, undefined_node, _Oid, _RevOidSoFar, _MibView) ->
next_node(_D, {tree, Tree, {table_entry, _Id}}, [Int | _Oid],
_RevOidSoFar, _MibView)
when Int+1 > size(Tree) ->
- ?vtrace("next_node(tree,table_entry) -> entry when not found whith"
+ ?vtrace("next_node(tree,table_entry) -> entry when not found within"
"~n Int: ~p"
"~n size(Tree): ~p", [Int, size(Tree)]),
false;
diff --git a/lib/snmp/src/agent/snmpa_mib_data_tttn.erl b/lib/snmp/src/agent/snmpa_mib_data_tttn.erl
index 9b4493a03f..b0d5312e2c 100644
--- a/lib/snmp/src/agent/snmpa_mib_data_tttn.erl
+++ b/lib/snmp/src/agent/snmpa_mib_data_tttn.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -780,7 +780,7 @@ find_node(_D, Node, _RestOfOid, _RevOid) ->
%% {subagent, SubAgentPid, SAOid} |
%% {variable, MibEntry, VarOid} |
%% {table, TableOid, TableRestOid, MibEntry}
-%% If a variable is returnes, it is in the MibView.
+%% If a variable is returns, it is in the MibView.
%% If a table or subagent is returned, it *may* be in the MibView.
%%-----------------------------------------------------------------
next(#mib_data{tree = T} = D, Oid, MibView) ->
@@ -805,7 +805,7 @@ next_node(_D, undefined_node, _Oid, _RevOidSoFar, _MibView) ->
next_node(_D, {tree, Tree, {table_entry, _Id}}, [Int | _Oid],
_RevOidSoFar, _MibView)
when Int+1 > size(Tree) ->
- ?vtrace("next_node(tree,table_entry) -> entry when not found whith"
+ ?vtrace("next_node(tree,table_entry) -> entry when not found within"
"~n Int: ~p"
"~n size(Tree): ~p", [Int, size(Tree)]),
false;
diff --git a/lib/snmp/src/agent/snmpa_mib_lib.erl b/lib/snmp/src/agent/snmpa_mib_lib.erl
index ecdf968458..ad2840a33f 100644
--- a/lib/snmp/src/agent/snmpa_mib_lib.erl
+++ b/lib/snmp/src/agent/snmpa_mib_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ table_del_row({Tab, Db} = TabDb, Key) ->
%%%-----------------------------------------------------------------
-%%% Retreives the entire table. Used for debugging
+%%% Retrieves the entire table. Used for debugging
%%%-----------------------------------------------------------------
get_table(NameDb, FOI) ->
diff --git a/lib/snmp/src/agent/snmpa_mib_storage.erl b/lib/snmp/src/agent/snmpa_mib_storage.erl
index d46dab0be0..508af51f18 100644
--- a/lib/snmp/src/agent/snmpa_mib_storage.erl
+++ b/lib/snmp/src/agent/snmpa_mib_storage.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -46,7 +46,7 @@
%% (of the behaviour), this is done using the *Options* argument.
%% ---------------------------------------------------------------
-%% Options is callback module dependant
+%% Options is callback module dependent
-callback open(Name :: atom(),
RecName :: atom(),
diff --git a/lib/snmp/src/agent/snmpa_mpd.erl b/lib/snmp/src/agent/snmpa_mpd.erl
index 0d40840d35..89075d0aef 100644
--- a/lib/snmp/src/agent/snmpa_mpd.erl
+++ b/lib/snmp/src/agent/snmpa_mpd.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -53,7 +53,7 @@
%%%-----------------------------------------------------------------
-%%% This module implemets the Message Processing and Dispatch part of
+%%% This module implements the Message Processing and Dispatch part of
%%% the multi-lingual SNMP agent.
%%%
%%% The MPD is responsible for:
@@ -70,7 +70,7 @@
%%% the counters only, it does not provide instrumentation functions
%%% for the counters.
%%%
-%%% With the terms defined in rfc2271, this module implememts part
+%%% With the terms defined in rfc2271, this module implements part
%%% of the Dispatcher and the Message Processing functionality.
%%%-----------------------------------------------------------------
init(Vsns) ->
diff --git a/lib/snmp/src/agent/snmpa_net_if.erl b/lib/snmp/src/agent/snmpa_net_if.erl
index bd19a32159..0f4ab6e65f 100644
--- a/lib/snmp/src/agent/snmpa_net_if.erl
+++ b/lib/snmp/src/agent/snmpa_net_if.erl
@@ -52,7 +52,7 @@
%% Also, the request-reponder and trap-sender transport(s),
%% has different needs.
%% The trap-sender transport will send more data then it will receive.
-%% Therefor, we should be able to specify;
+%% Therefore, we should be able to specify;
%% bind_to, no_reuse_address, recbuf and sndbuf individually:
%% {intAgentTransports,
%% [{transportDomainUdpIpv4, {{141,213,11,24}, PortInfo},
@@ -122,7 +122,7 @@
%% Note that since informs require confirmation,
%% an ephemeral socket cannot be removed immediately
%% when it has been "used up".
-%% We need to keep it for some time to receive responces
+%% We need to keep it for some time to receive responses
%% and in case a resend is needed!.
%% </EPHEMERAL-FOR-FUTUR-USE>
@@ -573,7 +573,7 @@ loop(#state{transports = Transports,
?vdebug("loop(~p)", [S]),
receive
{udp, Socket, IpAddr, IpPort, Packet} = Msg ->
- ?vlog("got paket from ~w:~w on ~w", [IpAddr, IpPort, Socket]),
+ ?vlog("got packet from ~w:~w on ~w", [IpAddr, IpPort, Socket]),
case lists:keyfind(Socket, #transport.socket, Transports) of
#transport{socket = Socket, domain = Domain} = Transport ->
From =
@@ -679,18 +679,6 @@ loop(#state{transports = Transports,
loop(NewS);
%% Discovery Inform
- %% <BACKWARD-COMPAT>
- {send_discovery, Pdu, MsgData, To, From} ->
- ?vdebug("received send discovery request: "
- "~n Pdu: ~p"
- "~n To: ~p"
- "~n From: ~p",
- [Pdu, To, toname(From)]),
- NewS = handle_send_discovery(S, Pdu, MsgData, To, From),
- loop(NewS);
- %% </BACKWARD-COMPAT>
-
- %% Discovery Inform
{send_discovery, Pdu, MsgData, To, From, ExtraInfo} ->
?vdebug("received send discovery request: "
"~n Pdu: ~p"
@@ -2123,7 +2111,7 @@ get_inet_backend(Opts, DefaultOpts) ->
get_socket_opt(inet_backend, Opts, DefaultOpts, use_default).
%% <EPHEMERAL-FOR-FUTUR-USE>
-%% This is not realy a socket option, but rather socket 'meta'
+%% This is not really a socket option, but rather socket 'meta'
%% information. Its still put together with the actual socket
%% options.
%% get_ephemeral(SocketOpts) ->
diff --git a/lib/snmp/src/agent/snmpa_network_interface_filter.erl b/lib/snmp/src/agent/snmpa_network_interface_filter.erl
index 1524a6447b..d67d945b8a 100644
--- a/lib/snmp/src/agent/snmpa_network_interface_filter.erl
+++ b/lib/snmp/src/agent/snmpa_network_interface_filter.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ behaviour_info(_) ->
%% accept_recv({domain(), address()}) -> boolean()
-%% Called at the receiption of a message
+%% Called at the reception of a message
%% (before *any* processing has been done).
%%
%% accept_send({domain(), address()}) -> boolean()
diff --git a/lib/snmp/src/agent/snmpa_set_lib.erl b/lib/snmp/src/agent/snmpa_set_lib.erl
index 89580ad8e1..5943b850bf 100644
--- a/lib/snmp/src/agent/snmpa_set_lib.erl
+++ b/lib/snmp/src/agent/snmpa_set_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -37,7 +37,7 @@
%% Input is a sorted Varbinds list.
%% Output is either ok or {ErrIndex, ErrCode}.
%%* 1) IF the variable is outside the mib view THEN noAccess.
-%%* 2a) IF the varaible doesn't exist THEN notWritable.
+%%* 2a) IF the variable doesn't exist THEN notWritable.
%% 2b) IF mib isn't able to create instances of the variable (for
%% example in a table) THEN noCreation.
%%* 3) IF the new value provided is of the wrong ASN.1 type THEN wrongType.
@@ -59,7 +59,7 @@
%%
%% SNMPv1 (see rfc1157:4.1.5)
%%* 1) IF variable not available for set in the mibview THEN noSuchName.
-%%* 2) IF variable exists, but doesn't permit writeing THEN readOnly.
+%%* 2) IF variable exists, but doesn't permit writing THEN readOnly.
%%* 3) IF provided value doesn't match ASN.1 type THEN badValue.
%% 4) IF any other error THEN genErr.
%% 5) Otherwise ok!
diff --git a/lib/snmp/src/agent/snmpa_supervisor.erl b/lib/snmp/src/agent/snmpa_supervisor.erl
index 7d5c6da2c8..215851f23c 100644
--- a/lib/snmp/src/agent/snmpa_supervisor.erl
+++ b/lib/snmp/src/agent/snmpa_supervisor.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2019. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -259,7 +259,7 @@ init([AgentType, Opts]) ->
%% -- mib storage --
%% MibStorage has only one mandatory part: module
- %% Everything else is module dependent and therefor
+ %% Everything else is module dependent and therefore
%% put in a special option: options
MibStorage =
case get_opt(mib_storage, Opts, [{module, snmpa_mib_storage_ets}]) of
diff --git a/lib/snmp/src/agent/snmpa_svbl.erl b/lib/snmp/src/agent/snmpa_svbl.erl
index 8955bed0f2..a42d16de3a 100644
--- a/lib/snmp/src/agent/snmpa_svbl.erl
+++ b/lib/snmp/src/agent/snmpa_svbl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -91,7 +91,7 @@ insert_key(Key, Value, []) ->
[{Key, [Value]}].
%%-----------------------------------------------------------------
-%% Tranforms a list of {Oid, Vb} to a 2-tuple with all
+%% Transforms a list of {Oid, Vb} to a 2-tuple with all
%% Oids and all Vbs. These lists will be reversed.
%%-----------------------------------------------------------------
sa_split(Vbs) -> sa_split(Vbs, [], []).
@@ -137,7 +137,7 @@ unpack(Rest, [Row | Rows], []) ->
%% OrgIndex should not be present when we call the is_set_ok/set/undo
%% table functions. They just see the list of cols, and if an error
-%% occurs, they return the column nunber.
+%% occurs, they return the column number.
%% Also, delete duplicate columns. If a SET is performed with duplicate
%% columns, it is undefined which column to use. We just pick one.
delete_org_index([{RowIndex, Cols} | Rows]) ->
diff --git a/lib/snmp/src/agent/snmpa_target_cache.erl b/lib/snmp/src/agent/snmpa_target_cache.erl
index 72caf72b33..dab6eacddc 100644
--- a/lib/snmp/src/agent/snmpa_target_cache.erl
+++ b/lib/snmp/src/agent/snmpa_target_cache.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -200,7 +200,7 @@ do_init(Prio, Opts) ->
%%
%% (1) As long as there are no _waiting_ or active write locks,
-%% read-locks will allways be granted
+%% read-locks will always be granted
%% (2) When there are no active readers, write-locks will be
%% granted.
%% (3) When there are active readers (clients with read-locks),
@@ -490,7 +490,7 @@ handle_cast({unlock, Pid},
writer = Writer,
waiting = StillWaiting}};
- %% If we have no active lockers, this may be a bug and therefor
+ %% If we have no active lockers, this may be a bug and therefore
%% see if we can activate some of the waiting
_ when (State#state.active_count == 0) ->
?vdebug("unlock -> could not find locker", []),
@@ -661,7 +661,7 @@ handle_maybe_active_or_waiting_down(Pid,
[#locker{state = active, type = read}] when (Cnt == 1) ->
%% 1) This means that the writer must be waiting
%% 2) The last reader terminated,
- %% time to activate the wating writer
+ %% time to activate the waiting writer
%% If this was the last one, then we must
%% activate the waiting writer.
ets:delete(?LOCKER_TAB, Pid),
diff --git a/lib/snmp/src/agent/snmpa_trap.erl b/lib/snmp/src/agent/snmpa_trap.erl
index 9ee854b67d..be1a2a2a85 100644
--- a/lib/snmp/src/agent/snmpa_trap.erl
+++ b/lib/snmp/src/agent/snmpa_trap.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -34,11 +34,6 @@
send_inform/6]).
-export([init_discovery_inform/13, send_discovery_inform/5]).
-%% <BACKWARD-COMPAT>
--export([send_discovery/5,
- init_discovery_inform/12]).
-%% </BACKWARD-COMPAT>
-
-include_lib("snmp/include/snmp_types.hrl").
-include_lib("snmp/src/agent/snmpa_internal.hrl").
-include_lib("snmp/include/SNMPv2-MIB.hrl").
@@ -74,9 +69,9 @@
%% operation, and so on, until eventually the MA will receive the
%% info. The MA then fills in the gaps, and at this point all
%% oids and types must be known, otherwise an error is signalled,
-%% and the opertaion is aborted. For the unknown values for some
+%% and the operation is aborted. For the unknown values for some
%% oids, a get-operation is performed by the MA. This will
-%% retreive the missing values.
+%% retrieve the missing values.
%% At this point, all oid, types and values are known, so the MA
%% can distribute the traps according to the information in the
%% internal tables.
@@ -128,7 +123,7 @@
%% Initialize as many variables as possible.
%% Returns: {ok, TrapRecord, <list of Var>} | error
%% where Var is returned from initiate_vars.
-%% NOTE: Executed at the inital SA
+%% NOTE: Executed at the initial SA
%%-----------------------------------------------------------------
construct_trap(Trap, Varbinds) ->
?vdebug("construct_trap -> entry with"
@@ -218,7 +213,7 @@ alias2oid(Alias, Append) ->
%% {{Process, VariableOid}, Value} |
%% {{Process, VariableAtom}, Value} |
%% {TableColAtom, RowIndex, Value}
-%% NOTE: Executed at the inital SA
+%% NOTE: Executed at the initial SA
%%-----------------------------------------------------------------
initiate_vars([{Oid, Asn1Type} | T], Varbinds) ->
case delete_oid_from_varbinds(Oid, Varbinds) of
@@ -410,7 +405,7 @@ send_trap(TrapRec, NotifyName, ContextName, Recv, Vbs, ExtraInfo, NetIf) ->
LocalEngineID, ExtraInfo, NetIf).
%% The agent normally does not care about the result,
-%% but since it can be usefull when debugging, add
+%% but since it can be useful when debugging, add
%% some info when we fail to send the trap(s).
send_trap(TrapRec, NotifyName, ContextName, Recv, Vbs, LocalEngineID,
ExtraInfo, NetIf) ->
@@ -438,9 +433,6 @@ do_send_trap(TrapRec, NotifyName, ContextName, Recv, Vbs,
send_trap_pdus(Dests, ContextName, {TrapRec, VarbindList}, [], [], [],
Recv, LocalEngineID, ExtraInfo, NetIf).
-send_discovery(TargetName, Record, ContextName, Vbs, NetIf) ->
- ExtraInfo = ?DEFAULT_NOTIF_EXTRA_INFO,
- send_discovery(TargetName, Record, ContextName, Vbs, NetIf, ExtraInfo).
send_discovery(TargetName, Record, ContextName, Vbs, NetIf, ExtraInfo) ->
case find_dest(TargetName) of
{ok, Dest} ->
@@ -718,16 +710,6 @@ send_discovery_pdu(Record, Dest, Vbs,
init_discovery_inform(Parent,
Dest,
SecModel, SecName, SecLevel, TargetName,
- ContextName, Timeout, Retry, Vbs, NetIf, Verbosity) ->
- ExtraInfo = ?DEFAULT_NOTIF_EXTRA_INFO,
- init_discovery_inform(Parent,
- Dest,
- SecModel, SecName, SecLevel, TargetName,
- ContextName, Timeout, Retry, Vbs, NetIf,
- Verbosity, ExtraInfo).
-init_discovery_inform(Parent,
- Dest,
- SecModel, SecName, SecLevel, TargetName,
ContextName, Timeout, Retry, Vbs, NetIf,
Verbosity, ExtraInfo) ->
put(verbosity, Verbosity),
diff --git a/lib/snmp/src/agent/snmpa_usm.erl b/lib/snmp/src/agent/snmpa_usm.erl
index c65fcf2f8c..3417bb1aa9 100644
--- a/lib/snmp/src/agent/snmpa_usm.erl
+++ b/lib/snmp/src/agent/snmpa_usm.erl
@@ -62,7 +62,7 @@
%% Func: process_incoming_msg(Packet, Data, SecParams, SecLevel) ->
%% {ok, {SecEngineID, SecName, ScopedPDUBytes, SecData}} |
%% {error, Reason} | {error, Reason, ErrorInfo}
-%% Return value may be throwed.
+%% Return value may be thrown.
%% Types: Reason -> term()
%% Purpose:
%%-----------------------------------------------------------------
@@ -373,7 +373,7 @@ is_auth(AuthProtocol, AuthKey, AuthParams, Packet, SecName,
(TermDiscoStage2 =:= plain)) -> %% 3.2.7a
?vtrace("is_auth -> terminating discovery stage 2 - plain",[]),
%% This will *always* result in the manager *not*
- %% beeing in timewindow
+ %% being in timewindow
authoritative(SecName,
MsgAuthEngineBoots, MsgAuthEngineTime,
LocalEngineID);
diff --git a/lib/snmp/src/agent/snmpa_vacm.erl b/lib/snmp/src/agent/snmpa_vacm.erl
index d7d588c30d..5540fb8d32 100644
--- a/lib/snmp/src/agent/snmpa_vacm.erl
+++ b/lib/snmp/src/agent/snmpa_vacm.erl
@@ -306,7 +306,7 @@ dump_table() ->
%% time dumping the table.
unique_table_name(Pre) ->
%% We want something that is guaranteed to be unique,
- %% therefor we use erlang:timestamp() instead of os:timestamp()
+ %% therefore we use erlang:timestamp() instead of os:timestamp()
unique_table_name(Pre, erlang:timestamp()).
unique_table_name(Pre, {_A, _B, C} = Now) ->
@@ -378,7 +378,7 @@ get_access_row(Key, GroupKey, ContextName, SecModel, SecLevel, Score, Found) ->
{ok, NScore} when NScore > Score ->
get_access_row(NextKey, GroupKey, ContextName,
SecModel, SecLevel, NScore, Row);
- {ok, _} -> % e.g. a throwed {ok, 0}
+ {ok, _} -> % e.g. a thrown {ok, 0}
get_access_row(NextKey, GroupKey, ContextName,
SecModel, SecLevel, Score, Found);
false ->
diff --git a/lib/snmp/src/app/Makefile b/lib/snmp/src/app/Makefile
index 02800462a4..f5a74aa78e 100644
--- a/lib/snmp/src/app/Makefile
+++ b/lib/snmp/src/app/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2021. All Rights Reserved.
+# Copyright Ericsson AB 2003-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -109,8 +109,8 @@ ERL_COMPILE_FLAGS += -I../misc \
# Targets
# ----------------------------------------------------
-debug:
- @$(MAKE) TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/snmp/src/app/snmp.app.src b/lib/snmp/src/app/snmp.app.src
index 2159fb5b4b..a18ea083fd 100644
--- a/lib/snmp/src/app/snmp.app.src
+++ b/lib/snmp/src/app/snmp.app.src
@@ -142,4 +142,4 @@
{applications, [kernel, stdlib]},
{mod, {snmp_app, []}},
{runtime_dependencies, ["stdlib-2.5","runtime_tools-1.8.14","mnesia-4.12",
- "kernel-8.0","erts-12.0","crypto-3.3"]}]}.
+ "kernel-8.0","erts-12.0","crypto-4.6"]}]}.
diff --git a/lib/snmp/src/app/snmp.config b/lib/snmp/src/app/snmp.config
index f35a636157..f5222245f1 100644
--- a/lib/snmp/src/app/snmp.config
+++ b/lib/snmp/src/app/snmp.config
@@ -36,8 +36,8 @@
%% {verbosity, verbosity()} |
%% {options, net_if_options()}
%% net_if_options() -> [net_if_option()]
-%% net_if_option() -> Note that these are basically dependant on which net-if
-%% module is beeing used, but the options described here
+%% net_if_option() -> Note that these are basically dependent on which net-if
+%% module is being used, but the options described here
%% are the ones that snmp_net_if (the default value for
%% the module option) handles:
%% {bind_to, bool()} |
@@ -77,8 +77,8 @@
%% {verbosity, verbosity()} |
%% {options, mgr_net_if_options()}
%% mgr_net_if_options() -> [mgr_net_if_option()]
-%% mgr_net_if_option() -> Note that these are basically dependant on which
-%% net-if module is beeing used, but the options
+%% mgr_net_if_option() -> Note that these are basically dependent on which
+%% net-if module is being used, but the options
%% described here are the ones of the snmpm_net_if
%% (the default value for the module option):
%% {recbuf, integer()} |
diff --git a/lib/snmp/src/app/snmp.erl b/lib/snmp/src/app/snmp.erl
index bc6a803eaa..c1f1c12acd 100644
--- a/lib/snmp/src/app/snmp.erl
+++ b/lib/snmp/src/app/snmp.erl
@@ -264,7 +264,7 @@ set_module_trace(Module, Opts) ->
{value, {return_trace, false}} ->
[];
_ ->
- %% Default is allways to include return values
+ %% Default is always to include return values
[{return_trace}]
end,
TraceRes =
@@ -665,7 +665,7 @@ short_time({{Y,M,D},{H,Mi,S}}) ->
[y1(Y), y2(Y), M, D, H, Mi, S, 0].
%% This function will only be called if there has been some
-%% validation error, and as it is strict, it allways returns
+%% validation error, and as it is strict, it always returns
%% false.
strict_validation(_What, _Data) ->
false.
diff --git a/lib/snmp/src/compile/Makefile b/lib/snmp/src/compile/Makefile
index bbd7f99378..d37eaf9636 100644
--- a/lib/snmp/src/compile/Makefile
+++ b/lib/snmp/src/compile/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2021. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -90,8 +90,8 @@ YRL_FLAGS = -o .
# Targets
# ----------------------------------------------------
-debug:
- @${MAKE} TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/snmp/src/compile/snmpc.erl b/lib/snmp/src/compile/snmpc.erl
index 4249799195..4fcc6e2342 100644
--- a/lib/snmp/src/compile/snmpc.erl
+++ b/lib/snmp/src/compile/snmpc.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2019. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1322,7 +1322,7 @@ define_cols([{#mc_object_type{name = NameOfCol,
entrytype = table_column,
access = NewAccess,
description = Description,
- units = Units, %% Propably not usefull
+ units = Units, %% Probably not useful
assocList = [{table_name,TableName} | Defval]}),
define_cols(Rest,SubIndex+1,Fields,NameOfEntry,TableName,
[ColumnME|ColMEs]);
diff --git a/lib/snmp/src/compile/snmpc.src b/lib/snmp/src/compile/snmpc.src
index e64b6607c4..0f6831cc17 100644
--- a/lib/snmp/src/compile/snmpc.src
+++ b/lib/snmp/src/compile/snmpc.src
@@ -3,7 +3,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -355,7 +355,7 @@ usage() ->
"~n For example snmp/mibs/ "
"~n The current workin dir and the "
"~n <snmp-home>/priv/mibs "
- "~n are always listed last the includ path. "
+ "~n are always listed last the include path. "
"~n --db <DB> - Database to used for the default instrumentation."
"~n Defaults to volatile."
"~n --sgc - This option (skip group check), if present, "
diff --git a/lib/snmp/src/compile/snmpc_lib.erl b/lib/snmp/src/compile/snmpc_lib.erl
index 0cff8c5456..b04ab3af84 100644
--- a/lib/snmp/src/compile/snmpc_lib.erl
+++ b/lib/snmp/src/compile/snmpc_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -903,7 +903,7 @@ test_index_positions(Line, Indexes, ColMEs) ->
TLI = lists:filter(IsTLI, Indexes),
test_index_positions_impl(Line, TLI, ColMEs).
-%% An table that augments another cannot conatin any index,
+%% An table that augments another cannot contain any index,
%% so the first non-index column is always the first column.
augments_first_non_index_column([]) ->
none;
diff --git a/lib/snmp/src/compile/snmpc_mib_gram.yrl b/lib/snmp/src/compile/snmpc_mib_gram.yrl
index 14a668127e..1a970b97ea 100644
--- a/lib/snmp/src/compile/snmpc_mib_gram.yrl
+++ b/lib/snmp/src/compile/snmpc_mib_gram.yrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -453,7 +453,7 @@ variables -> objectname : ['$1'].
variables -> variables ',' objectname : ['$3' | '$1'].
implies -> '::=' : '$1'.
-implies -> ':' ':' '=' : w("Sloppy asignment on line ~p", [line_of('$1')]), '$1'.
+implies -> ':' ':' '=' : w("Sloppy assignment on line ~p", [line_of('$1')]), '$1'.
descriptionfield -> string : lreverse(descriptionfield, val('$1')).
descriptionfield -> '$empty' : undefined.
description -> 'DESCRIPTION' string : lreverse(description, val('$2')).
@@ -1071,7 +1071,7 @@ bits_to_bytes([], 1, _Byte) -> % empty bitstring
[];
bits_to_bytes([], 256, _Byte) -> % correct; multiple of 8
[];
-% If we are to support arbitrary length of bitstrings. This migth
+% If we are to support arbitrary length of bitstrings. This might
% be needed in the new SMI.
%bits_to_bytes([], N, Byte) ->
% [Byte];
diff --git a/lib/snmp/src/compile/snmpc_mib_to_hrl.erl b/lib/snmp/src/compile/snmpc_mib_to_hrl.erl
index c214bca93c..b041a6414b 100644
--- a/lib/snmp/src/compile/snmpc_mib_to_hrl.erl
+++ b/lib/snmp/src/compile/snmpc_mib_to_hrl.erl
@@ -33,7 +33,7 @@
%% Args: MibName = string() without extension.
%% Purpose: Produce a .hrl file with oid for tables and variables,
%% column numbers for columns and values for enums.
-%% Writes only the first occurence of a name. Prints a
+%% Writes only the first occurrence of a name. Prints a
%% warning if a duplicate name is found.
%% Returns: ok | {error, Reason}
%% Note: The Mib must be compiled.
diff --git a/lib/snmp/src/compile/snmpc_tok.erl b/lib/snmp/src/compile/snmpc_tok.erl
index 9114cc90de..fa40dd3237 100644
--- a/lib/snmp/src/compile/snmpc_tok.erl
+++ b/lib/snmp/src/compile/snmpc_tok.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -273,7 +273,7 @@ tokenise([10| T]) -> tokenise(T);
tokenise([13| T]) -> tokenise(T);
tokenise([32| T]) -> tokenise(T);
-%% Handle singe characters like { } [ ] + = ...
+%% Handle single characters like { } [ ] + = ...
tokenise([Ch | T]) ->
Atm = list_to_atom([Ch]),
{{Atm, get(line)}, T};
diff --git a/lib/snmp/src/manager/Makefile b/lib/snmp/src/manager/Makefile
index 6f5f5d01f9..693ef75469 100644
--- a/lib/snmp/src/manager/Makefile
+++ b/lib/snmp/src/manager/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2021. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -100,8 +100,8 @@ ERL_COMPILE_FLAGS += -I../../include \
# Targets
# ----------------------------------------------------
-debug:
- @$(MAKE) TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt:
@$(MAKE) behaviour_targets
diff --git a/lib/snmp/src/manager/snmpm.erl b/lib/snmp/src/manager/snmpm.erl
index ffa6b0012c..6c6a22e1f1 100644
--- a/lib/snmp/src/manager/snmpm.erl
+++ b/lib/snmp/src/manager/snmpm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -96,18 +96,6 @@
-export([format_reason/1, format_reason/2]).
-%% Backward compatibility exports (API version "2")
--export([
- sync_get/3, sync_get/4, sync_get/5, sync_get/6,
- async_get/3, async_get/4, async_get/5, async_get/6,
- sync_get_next/3, sync_get_next/4, sync_get_next/5, sync_get_next/6,
- async_get_next/3, async_get_next/4, async_get_next/5, async_get_next/6,
- sync_set/3, sync_set/4, sync_set/5, sync_set/6,
- async_set/3, async_set/4, async_set/5, async_set/6,
- sync_get_bulk/5, sync_get_bulk/6, sync_get_bulk/7, sync_get_bulk/8,
- async_get_bulk/5, async_get_bulk/6, async_get_bulk/7, async_get_bulk/8
- ]).
-
%% Application internal export
-export([start_link/3, snmpm_start_verify/2, snmpm_start_verify/3]).
-export([target_name/1, target_name/2]).
@@ -119,49 +107,6 @@
]).
--deprecated(
- [
- {sync_get, 3, "use snmpm:sync_get2/3 instead."},
- {sync_get, 4, "use snmpm:sync_get2/4 instead."},
- {sync_get, 5, "use snmpm:sync_get2/4 instead."},
- {sync_get, 6, "use snmpm:sync_get2/4 instead."},
-
- {async_get, 3, "use snmpm:async_get2/3 instead."},
- {async_get, 4, "use snmpm:async_get2/4 instead."},
- {async_get, 5, "use snmpm:async_get2/4 instead."},
- {async_get, 6, "use snmpm:async_get2/4 instead."},
-
- {sync_get_next, 3, "use snmpm:sync_get_next2/3 instead."},
- {sync_get_next, 4, "use snmpm:sync_get_next2/4 instead."},
- {sync_get_next, 5, "use snmpm:sync_get_next2/4 instead."},
- {sync_get_next, 6, "use snmpm:sync_get_next2/4 instead."},
-
- {async_get_next, 3, "use snmpm:async_get_next2/3 instead."},
- {async_get_next, 4, "use snmpm:async_get_next2/4 instead."},
- {async_get_next, 5, "use snmpm:async_get_next2/4 instead."},
- {async_get_next, 6, "use snmpm:async_get_next2/4 instead."},
-
- {sync_set, 3, "use snmpm:sync_set2/3 instead."},
- {sync_set, 4, "use snmpm:sync_set2/4 instead."},
- {sync_set, 5, "use snmpm:sync_set2/4 instead."},
- {sync_set, 6, "use snmpm:sync_set2/4 instead."},
-
- {async_set, 3, "use snmpm:async_set2/3 instead."},
- {async_set, 4, "use snmpm:async_set2/4 instead."},
- {async_set, 5, "use snmpm:async_set2/4 instead."},
- {async_set, 6, "use snmpm:async_set2/4 instead."},
-
- {sync_get_bulk, 5, "use snmpm:sync_get_bulk2/5 instead."},
- {sync_get_bulk, 6, "use snmpm:sync_get_bulk2/6 instead."},
- {sync_get_bulk, 7, "use snmpm:sync_get_bulk2/6 instead."},
- {sync_get_bulk, 8, "use snmpm:sync_get_bulk2/6 instead."},
-
- {async_get_bulk, 5, "use snmpm:async_get_bulk2/5 instead."},
- {async_get_bulk, 6, "use snmpm:async_get_bulk2/6 instead."},
- {async_get_bulk, 7, "use snmpm:async_get_bulk2/6 instead."},
- {async_get_bulk, 8, "use snmpm:async_get_bulk2/6 instead."}
- ]).
-
-include_lib("snmp/src/misc/snmp_debug.hrl").
-include_lib("snmp/include/snmp_types.hrl").
-include("snmpm_atl.hrl").
@@ -206,14 +151,14 @@ simple_conf() ->
{ok, _} ->
ok;
_ ->
- ok = snmp_config:write_manager_config(Cwd, "",
+ ok = snmp_config:write_manager_config(Cwd, "",
[{port, 5000},
{engine_id, "mgrEngine"},
{max_message_size, 484}])
end,
Conf = [{dir, Cwd}, {db_dir, Cwd}],
[{versions, Vsns}, {config, Conf}].
-
+
%% Simple start. Start a manager with default values.
start_link() ->
start_link(simple_conf()).
@@ -379,7 +324,7 @@ restart(net_if = What) ->
%% The manager entity responsible for a specific agent.
%% Module is the callback module (snmpm_user behaviour) which
%% will be called whenever something happens (detected
-%% agent, incomming reply or incomming trap/notification).
+%% agent, incoming reply or incoming trap/notification).
%% Note that this could have already been done as a
%% consequence of the node config.
register_user(Id, Module, Data) ->
@@ -549,7 +494,7 @@ which_usm_users(EngineID) when is_list(EngineID) ->
%% -- Requests --
-%% --- synchroneous get-request ---
+%% --- synchronous get-request ---
%%
sync_get2(UserId, TargetName, Oids) ->
@@ -559,29 +504,6 @@ sync_get2(UserId, TargetName, Oids, SendOpts)
when is_list(Oids) andalso is_list(SendOpts) ->
snmpm_server:sync_get(UserId, TargetName, Oids, SendOpts).
-%% <BACKWARD-COMPAT>
-sync_get(UserId, TargetName, Oids) ->
- sync_get2(UserId, TargetName, Oids).
-
-sync_get(UserId, TargetName, Oids, Timeout)
- when is_list(Oids) andalso is_integer(Timeout) ->
- SendOpts = [{timeout, Timeout}],
- sync_get2(UserId, TargetName, Oids, SendOpts);
-sync_get(UserId, TargetName, Context, [OH|_] = Oids)
- when is_list(Context) andalso is_list(OH) ->
- SendOpts = [{context, Context}],
- sync_get2(UserId, TargetName, Oids, SendOpts).
-
-sync_get(UserId, TargetName, Context, Oids, Timeout) ->
- SendOpts = [{context, Context}, {timeout, Timeout}],
- sync_get2(UserId, TargetName, Oids, SendOpts).
-
-sync_get(UserId, TargetName, Context, Oids, Timeout, ExtraInfo) ->
- SendOpts = [{context, Context}, {timeout, Timeout}, {extra, ExtraInfo}],
- sync_get2(UserId, TargetName, Oids, SendOpts).
-%% </BACKWARD-COMPAT>
-
-
%% --- asynchronous get-request ---
%%
@@ -596,29 +518,8 @@ async_get2(UserId, TargetName, Oids, SendOpts)
when is_list(Oids) andalso is_list(SendOpts) ->
snmpm_server:async_get(UserId, TargetName, Oids, SendOpts).
-%% <BACKWARD-COMPAT>
-async_get(UserId, TargetName, Oids) ->
- async_get2(UserId, TargetName, Oids).
-
-async_get(UserId, TargetName, Oids, Expire) when is_integer(Expire) ->
- SendOpts = [{timeout, Expire}],
- async_get2(UserId, TargetName, Oids, SendOpts);
-async_get(UserId, TargetName, Context, Oids)
- when is_list(Context) andalso is_list(Oids) ->
- SendOpts = [{context, Context}],
- async_get2(UserId, TargetName, Oids, SendOpts).
-
-async_get(UserId, TargetName, Context, Oids, Expire) ->
- SendOpts = [{timeout, Expire}, {context, Context}],
- async_get2(UserId, TargetName, Oids, SendOpts).
-async_get(UserId, TargetName, Context, Oids, Expire, ExtraInfo) ->
- SendOpts = [{timeout, Expire}, {context, Context}, {extra, ExtraInfo}],
- async_get2(UserId, TargetName, Oids, SendOpts).
-%% </BACKWARD-COMPAT>
-
-
-%% --- synchroneous get_next-request ---
+%% --- synchronous get_next-request ---
%%
sync_get_next2(UserId, TargetName, Oids) ->
@@ -628,28 +529,6 @@ sync_get_next2(UserId, TargetName, Oids, SendOpts)
when is_list(Oids) andalso is_list(SendOpts) ->
snmpm_server:sync_get_next(UserId, TargetName, Oids, SendOpts).
-%% <BACKWARD-COMPAT>
-sync_get_next(UserId, TargetName, Oids) ->
- sync_get_next2(UserId, TargetName, Oids).
-
-sync_get_next(UserId, TargetName, Oids, Timeout)
- when is_list(Oids) andalso is_integer(Timeout) ->
- SendOpts = [{timeout, Timeout}],
- sync_get_next2(UserId, TargetName, Oids, SendOpts);
-sync_get_next(UserId, TargetName, Context, Oids)
- when is_list(Context) andalso is_list(Oids) ->
- SendOpts = [{context, Context}],
- sync_get_next2(UserId, TargetName, Oids, SendOpts).
-
-sync_get_next(UserId, TargetName, Context, Oids, Timeout) ->
- SendOpts = [{timeout, Timeout}, {context, Context}],
- sync_get_next2(UserId, TargetName, Oids, SendOpts).
-
-sync_get_next(UserId, TargetName, Context, Oids, Timeout, ExtraInfo) ->
- SendOpts = [{timeout, Timeout}, {context, Context}, {extra, ExtraInfo}],
- sync_get_next2(UserId, TargetName, Oids, SendOpts).
-%% </BACKWARD-COMPAT>
-
%% --- asynchronous get_next-request ---
%%
@@ -661,30 +540,8 @@ async_get_next2(UserId, TargetName, Oids, SendOpts)
when is_list(Oids) andalso is_list(SendOpts) ->
snmpm_server:async_get_next(UserId, TargetName, Oids, SendOpts).
-%% <BACKWARD-COMPAT>
-async_get_next(UserId, TargetName, Oids) ->
- async_get_next2(UserId, TargetName, Oids).
-async_get_next(UserId, TargetName, Oids, Expire)
- when is_list(Oids) andalso is_integer(Expire) ->
- SendOpts = [{timeout, Expire}],
- async_get_next2(UserId, TargetName, Oids, SendOpts);
-async_get_next(UserId, TargetName, Context, Oids)
- when is_list(Context) andalso is_list(Oids) ->
- SendOpts = [{context, Context}],
- async_get_next2(UserId, TargetName, Oids, SendOpts).
-
-async_get_next(UserId, TargetName, Context, Oids, Expire) ->
- SendOpts = [{timeout, Expire}, {context, Context}],
- async_get_next2(UserId, TargetName, Oids, SendOpts).
-
-async_get_next(UserId, TargetName, Context, Oids, Expire, ExtraInfo) ->
- SendOpts = [{timeout, Expire}, {context, Context}, {extra, ExtraInfo}],
- async_get_next2(UserId, TargetName, Oids, SendOpts).
-%% </BACKWARD-COMPAT>
-
-
-%% --- synchroneous set-request ---
+%% --- synchronous set-request ---
%%
sync_set2(UserId, TargetName, VarsAndVals) ->
@@ -694,28 +551,6 @@ sync_set2(UserId, TargetName, VarsAndVals, SendOpts)
when is_list(VarsAndVals) andalso is_list(SendOpts) ->
snmpm_server:sync_set(UserId, TargetName, VarsAndVals, SendOpts).
-%% <BACKWARD-COMPAT>
-sync_set(UserId, TargetName, VarsAndVals) ->
- sync_set2(UserId, TargetName, VarsAndVals).
-
-sync_set(UserId, TargetName, VarsAndVals, Timeout)
- when is_list(VarsAndVals) andalso is_integer(Timeout) ->
- SendOpts = [{timeout, Timeout}],
- sync_set2(UserId, TargetName, VarsAndVals, SendOpts);
-sync_set(UserId, TargetName, Context, VarsAndVals)
- when is_list(Context) andalso is_list(VarsAndVals) ->
- SendOpts = [{context, Context}],
- sync_set2(UserId, TargetName, VarsAndVals, SendOpts).
-
-sync_set(UserId, TargetName, Context, VarsAndVals, Timeout) ->
- SendOpts = [{timeout, Timeout}, {context, Context}],
- sync_set2(UserId, TargetName, VarsAndVals, SendOpts).
-
-sync_set(UserId, TargetName, Context, VarsAndVals, Timeout, ExtraInfo) ->
- SendOpts = [{timeout, Timeout}, {context, Context}, {extra, ExtraInfo}],
- sync_set2(UserId, TargetName, VarsAndVals, SendOpts).
-%% </BACKWARD-COMPAT>
-
%% --- asynchronous set-request ---
%%
@@ -727,30 +562,8 @@ async_set2(UserId, TargetName, VarsAndVals, SendOpts)
when is_list(VarsAndVals) andalso is_list(SendOpts) ->
snmpm_server:async_set(UserId, TargetName, VarsAndVals, SendOpts).
-%% <BACKWARD-COMPAT>
-async_set(UserId, TargetName, VarsAndVals) ->
- async_set2(UserId, TargetName, VarsAndVals).
-
-async_set(UserId, TargetName, VarsAndVals, Expire)
- when is_list(VarsAndVals) andalso is_integer(Expire) ->
- SendOpts = [{timeout, Expire}],
- async_set2(UserId, TargetName, VarsAndVals, SendOpts);
-async_set(UserId, TargetName, Context, VarsAndVals)
- when is_list(Context) andalso is_list(VarsAndVals) ->
- SendOpts = [{context, Context}],
- async_set2(UserId, TargetName, VarsAndVals, SendOpts).
-
-async_set(UserId, TargetName, Context, VarsAndVals, Expire) ->
- SendOpts = [{timeout, Expire}, {context, Context}],
- async_set2(UserId, TargetName, VarsAndVals, SendOpts).
-
-async_set(UserId, TargetName, Context, VarsAndVals, Expire, ExtraInfo) ->
- SendOpts = [{timeout, Expire}, {context, Context}, {extra, ExtraInfo}],
- async_set2(UserId, TargetName, VarsAndVals, SendOpts).
-%% </BACKWARD-COMPAT>
-
-%% --- synchroneous get-bulk ---
+%% --- synchronous get-bulk ---
%%
sync_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids) ->
@@ -764,35 +577,6 @@ sync_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts)
snmpm_server:sync_get_bulk(UserId, TargetName,
NonRep, MaxRep, Oids, SendOpts).
-%% <BACKWARD-COMPAT>
-sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids) ->
- sync_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids).
-
-sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids, Timeout)
- when is_integer(NonRep) andalso
- is_integer(MaxRep) andalso
- is_list(Oids) andalso
- is_integer(Timeout) ->
- SendOpts = [{timeout, Timeout}],
- sync_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts);
-sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids)
- when is_integer(NonRep) andalso
- is_integer(MaxRep) andalso
- is_list(Context) andalso
- is_list(Oids) ->
- SendOpts = [{context, Context}],
- sync_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts).
-
-sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Timeout) ->
- SendOpts = [{timeout, Timeout}, {context, Context}],
- sync_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts).
-
-sync_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Timeout,
- ExtraInfo) ->
- SendOpts = [{timeout, Timeout}, {context, Context}, {extra, ExtraInfo}],
- sync_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts).
-%% </BACKWARD-COMPAT>
-
%% --- asynchronous get-bulk ---
%%
@@ -808,35 +592,6 @@ async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts)
snmpm_server:async_get_bulk(UserId, TargetName,
NonRep, MaxRep, Oids, SendOpts).
-%% <BACKWARD-COMPAT>
-async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids) ->
- async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids).
-
-async_get_bulk(UserId, TargetName, NonRep, MaxRep, Oids, Expire)
- when is_integer(NonRep) andalso
- is_integer(MaxRep) andalso
- is_list(Oids) andalso
- is_integer(Expire) ->
- SendOpts = [{timeout, Expire}],
- async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts);
-async_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids)
- when is_integer(NonRep) andalso
- is_integer(MaxRep) andalso
- is_list(Context) andalso
- is_list(Oids) ->
- SendOpts = [{context, Context}],
- async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts).
-
-async_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Expire) ->
- SendOpts = [{timeout, Expire}, {context, Context}],
- async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts).
-
-async_get_bulk(UserId, TargetName, NonRep, MaxRep, Context, Oids, Expire,
- ExtraInfo) ->
- SendOpts = [{timeout, Expire}, {context, Context}, {extra, ExtraInfo}],
- async_get_bulk2(UserId, TargetName, NonRep, MaxRep, Oids, SendOpts).
-%% </BACKWARD-COMPAT>
-
cancel_async_request(UserId, ReqId) ->
@@ -1081,7 +836,7 @@ sys_up_time() ->
%%% printable string of the error reason received from either:
%%%
%%% * If any of the sync/async get/get-next/set/get-bulk
-%%% returnes {error, Reason}
+%%% returns {error, Reason}
%%% * The Reason parameter in the handle_error user callback
%%% function
%%%
diff --git a/lib/snmp/src/manager/snmpm_config.erl b/lib/snmp/src/manager/snmpm_config.erl
index 8e3dc3be6e..d5394d4298 100644
--- a/lib/snmp/src/manager/snmpm_config.erl
+++ b/lib/snmp/src/manager/snmpm_config.erl
@@ -38,7 +38,7 @@
register_agent/3, unregister_agent/2,
agent_info/0, agent_info/2, agent_info/3,
- update_agent_info/3, update_agent_info/4,
+ update_agent_info/3,
which_agents/0, which_agents/1,
is_known_engine_id/2,
@@ -94,9 +94,7 @@
%% Backward compatibillity exports
-export([
- register_user/3,
unregister_agent/3,
- update_agent_info/5,
is_known_engine_id/3,
get_agent_engine_id/2,
get_agent_engine_max_message_size/2,
@@ -109,12 +107,15 @@
check_manager_config/2,
check_user_config/1,
check_agent_config/1,
- check_usm_user_config/1]).
+ check_usm_user_config/1
+ ]).
%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- code_change/3, terminate/2]).
+-export([
+ init/1, handle_call/3, handle_cast/2, handle_info/2,
+ code_change/3, terminate/2
+ ]).
%% Includes:
@@ -192,10 +193,6 @@ is_started() ->
backup(BackupDir) when is_list(BackupDir) ->
call({backup, BackupDir}).
-%% Backward compatibillity
-register_user(UserId, UserMod, UserData) ->
- register_user(UserId, UserMod, UserData, []).
-
register_user(UserId, UserMod, UserData, DefaultAgentConfig)
when (UserId =/= ?DEFAULT_USER) andalso is_list(DefaultAgentConfig) ->
case (catch verify_user_behaviour(UserMod)) of
@@ -215,20 +212,6 @@ register_user(UserId, _UserMod, _UserData, DefaultAgentConfig)
register_user(UserId, _, _, _) ->
{error, {bad_user_id, UserId}}.
-%% default_agent_config(DefaultAgentConfig) ->
-%% {ok, SystemDefaultAgentConfig} = agent_info(),
-%% default_agent_config(SystemDefaultAgentConfig, DefaultAgentConfig).
-
-%% default_agent_config([], DefaultAgentConfig) ->
-%% DefaultAgentConfig;
-%% default_agent_config([{Key, _} = Entry|T], DefaultAgentConfig) ->
-%% case lists:keymember(Key, 1, DefaultAgentConfig) of
-%% true ->
-%% default_agent_config(T, DefaultAgentConfig);
-%% false ->
-%% default_agent_config(T, [Entry|DefaultAgentConfig])
-%% end.
-
verify_user_behaviour(UserMod) ->
case snmp_misc:verify_behaviour(snmpm_user, UserMod) of
@@ -547,23 +530,6 @@ which_agents(UserId) ->
update_agent_info(UserId, TargetName, Info) ->
call({update_agent_info, UserId, TargetName, Info}).
-%% <BACKWARD-COMPAT-2>
-%% This is wrapped in the interface module, so this function is
-%% only here to catch code-upgrade problems.
-update_agent_info(UserId, TargetName, Item, Val) ->
- update_agent_info(UserId, TargetName, [{Item, Val}]).
-%% </BACKWARD-COMPAT-2>
-
-%% <BACKWARD-COMPAT-1>
-update_agent_info(UserId, Addr, Port, Item, Val) ->
- case agent_info(Addr, Port, target_name) of
- {ok, TargetName} ->
- update_agent_info(UserId, TargetName, Item, Val);
- Error ->
- Error
- end.
-%% </BACKWARD-COMPAT-1>
-
is_known_engine_id(EngineID, TargetName) ->
case agent_info(TargetName, engine_id) of
{ok, EngineID} ->
@@ -2531,18 +2497,6 @@ handle_call({update_agent_info, UserId, TargetName, Info},
Reply = handle_update_agent_info(UserId, TargetName, Info),
{reply, Reply, State};
-%% <BACKWARD-COMPAT>
-handle_call({update_agent_info, UserId, TargetName, Item, Val},
- _From, State) ->
- ?vlog("received update_agent_info request: "
- "~n UserId: ~p"
- "~n TargetName: ~p"
- "~n Item: ~p"
- "~n Val: ~p", [UserId, TargetName, Item, Val]),
- Reply = handle_update_agent_info(UserId, TargetName, Item, Val),
- {reply, Reply, State};
-%% </BACKWARD-COMPAT>
-
handle_call({register_usm_user, User}, _From, State) ->
?vlog("received register_usm_user request: "
"~n User: ~p", [User]),
@@ -2793,7 +2747,7 @@ stop_backup_server({Pid, _}) when is_pid(Pid) ->
%%----------------------------------------------------------
handle_backup(D, BackupDir) ->
- %% First check that we do not wrote to the corrent db-dir...
+ %% First check that we do not wrote to the current db-dir...
?vtrace("handle_backup -> entry with"
"~n D: ~p"
"~n BackupDir: ~p", [D, BackupDir]),
@@ -2915,6 +2869,7 @@ handle_register_agent(UserId, TargetName, Config) ->
" FixedConfig: ~p", [FixedConfig]),
do_handle_register_agent(
TargetName, [{user_id, UserId}|FixedConfig]),
+
%% <DIRTY-BACKWARD-COMPATIBILLITY>
%% And now for some (backward compatibillity)
%% dirty crossref stuff
@@ -2928,25 +2883,6 @@ handle_register_agent(UserId, TargetName, Config) ->
{{Domain, Address, target_name}, TargetName}),
%% </DIRTY-BACKWARD-COMPATIBILLITY>
-%% %% First, insert this users default config
-%% ?vtrace("handle_register_agent -> store default config", []),
-%% do_handle_register_agent(TargetName, DefConfig),
-%% %% Second, insert the config for this agent
-%% ?vtrace("handle_register_agent -> store config", []),
-%% do_handle_register_agent(TargetName,
-%% [{user_id, UserId}|Config]),
-%% %% <DIRTY-BACKWARD-COMPATIBILLITY>
-%% %% And now for some (backward compatibillity)
-%% %% dirty crossref stuff
-%% ?vtrace("handle_register_agent -> lookup taddress", []),
-%% {ok, {Addr, Port} = TAddress} =
-%% agent_info(TargetName, taddress),
-%% ?vtrace("handle_register_agent -> taddress: ~p",
-%% [TAddress]),
-%% ?vtrace("handle_register_agent -> register cross-ref fix", []),
-%% ets:insert(snmpm_agent_table,
-%% {{Addr, Port, target_name}, TargetName}),
-%% %% </DIRTY-BACKWARD-COMPATIBILLITY>
ok;
_ ->
{error, {not_found, UserId}}
@@ -3051,14 +2987,6 @@ handle_update_agent_info(TargetName, Info) ->
{error, {failed_info_verification, Info, T, E}}
end.
-handle_update_agent_info(UserId, TargetName, Item, Val) ->
- ?vdebug("handle_update_agent_info -> entry with"
- "~n UserId: ~p"
- "~n TargetName: ~p"
- "~n Item: ~p"
- "~n Val: ~p", [UserId, TargetName, Item, Val]),
- handle_update_agent_info(TargetName, [{Item, Val}]).
-
do_update_agent_info(TargetName, Info) ->
?vtrace("do_update_agent_info -> entry with~n"
" TargetName: ~p~n"
diff --git a/lib/snmp/src/manager/snmpm_mpd.erl b/lib/snmp/src/manager/snmpm_mpd.erl
index 85821ccb94..77e93cd0a3 100644
--- a/lib/snmp/src/manager/snmpm_mpd.erl
+++ b/lib/snmp/src/manager/snmpm_mpd.erl
@@ -46,7 +46,7 @@
%%%-----------------------------------------------------------------
-%%% This module implemets the Message Processing and Dispatch part of
+%%% This module implements the Message Processing and Dispatch part of
%%% the multi-lingual SNMP agent.
%%%
%%% The MPD is responsible for:
@@ -63,7 +63,7 @@
%%% the counters only, it does not provide instrumentation functions
%%% for the counters.
%%%
-%%% With the terms defined in rfc2271, this module implememts part
+%%% With the terms defined in rfc2271, this module implements part
%%% of the Dispatcher and the Message Processing functionality.
%%%-----------------------------------------------------------------
init(Vsns) ->
@@ -585,7 +585,7 @@ sec_module(?SEC_USM) ->
%% securityEngineID is set to the value of the target entity's
%% snmpEngineID.
%%
-%% As we never send traps, the SecEngineID is allways the
+%% As we never send traps, the SecEngineID is always the
%% snmpEngineID of the target entity!
sec_engine_id(TargetName) ->
case get_agent_engine_id(TargetName) of
@@ -600,7 +600,7 @@ sec_engine_id(TargetName) ->
%% BMK BMK BMK
-%% This one looks very similar to lik generate_v1_v2c_response_msg!
+%% This one looks very similar to link generate_v1_v2c_response_msg!
%% Common/shared? Should there be differences?
%%
generate_v1_v2c_msg(Vsn, Pdu, Community, Log) ->
@@ -870,7 +870,7 @@ get_max_message_size() ->
{ok, MMS} ->
MMS;
E ->
- user_err("failed retreiving engine max message size: ~w", [E]),
+ user_err("failed retrieving engine max message size: ~w", [E]),
484
end.
diff --git a/lib/snmp/src/manager/snmpm_net_if.erl b/lib/snmp/src/manager/snmpm_net_if.erl
index af78308147..54772c2d64 100644
--- a/lib/snmp/src/manager/snmpm_net_if.erl
+++ b/lib/snmp/src/manager/snmpm_net_if.erl
@@ -782,7 +782,7 @@ maybe_handle_recv_msg(Domain, Addr, Bytes, State) ->
fun (Pid, Class, Reason, Stacktrace) ->
warning_msg(
"Worker process (~p) terminated "
- "while processing (incomming) message from %s:~n"
+ "while processing (incoming) message from %s:~n"
"~w:~w at ~p",
[Pid, snmp_conf:mk_addr_string({Domain, Addr}),
Class, Reason, Stacktrace])
diff --git a/lib/snmp/src/manager/snmpm_network_interface_filter.erl b/lib/snmp/src/manager/snmpm_network_interface_filter.erl
index 35bec4e7e7..54fa8645df 100644
--- a/lib/snmp/src/manager/snmpm_network_interface_filter.erl
+++ b/lib/snmp/src/manager/snmpm_network_interface_filter.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ behaviour_info(_) ->
%% accept_recv(address(), port()) -> boolean()
-%% Called at the receiption of a message
+%% Called at the reception of a message
%% (before *any* processing has been done).
%%
%% accept_send(address(), port()) -> boolean()
diff --git a/lib/snmp/src/manager/snmpm_server.erl b/lib/snmp/src/manager/snmpm_server.erl
index ca18637b8d..0da35c9bb3 100644
--- a/lib/snmp/src/manager/snmpm_server.erl
+++ b/lib/snmp/src/manager/snmpm_server.erl
@@ -571,24 +571,6 @@ handle_call({sync_get, Pid, UserId, TargetName, Oids, SendOpts},
{reply, Error, State}
end;
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({sync_get,
- Pid, UserId, TargetName, CtxName, Oids, Timeout, ExtraInfo},
- From, State) ->
- ?vlog("[~p,~p,~p] received sync_get request for: "
- "~n ~p", [UserId, TargetName, CtxName, Oids]),
- case (catch handle_sync_get(Pid,
- UserId, TargetName, CtxName, Oids,
- Timeout, ExtraInfo, From, State)) of
- ok ->
- {noreply, State};
- Error ->
- {reply, Error, State}
- end;
-%% </BACKWARD-COMPAT>
-
-
handle_call({sync_get_next, Pid, UserId, TargetName, Oids, SendOpts},
From, State) ->
?vlog("[~p,~p] received sync_get_next request for: "
@@ -603,24 +585,6 @@ handle_call({sync_get_next, Pid, UserId, TargetName, Oids, SendOpts},
end;
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({sync_get_next,
- Pid, UserId, TargetName, CtxName, Oids, Timeout, ExtraInfo},
- From, State) ->
- ?vlog("[~p,~p,~p] received sync_get_next request for"
- "~n ~p", [UserId, TargetName, CtxName, Oids]),
- case (catch handle_sync_get_next(Pid,
- UserId, TargetName, CtxName, Oids,
- Timeout, ExtraInfo, From, State)) of
- ok ->
- {noreply, State};
- Error ->
- {reply, Error, State}
- end;
-%% </BACKWARD-COMPAT>
-
-
%% Check agent version? This op not in v1
handle_call({sync_get_bulk,
Pid, UserId, TargetName, NonRep, MaxRep, Oids, SendOpts},
@@ -636,24 +600,6 @@ handle_call({sync_get_bulk,
{reply, Error, State}
end;
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({sync_get_bulk, Pid, UserId, TargetName,
- NonRep, MaxRep, CtxName, Oids, Timeout, ExtraInfo},
- From, State) ->
- ?vlog("[~p,~p] received sync_get_bulk request for: ~p"
- "~n ~p", [UserId, TargetName, CtxName, Oids]),
- case (catch handle_sync_get_bulk(Pid,
- UserId, TargetName, CtxName,
- NonRep, MaxRep, Oids,
- Timeout, ExtraInfo, From, State)) of
- ok ->
- {noreply, State};
- Error ->
- {reply, Error, State}
- end;
-%% </BACKWARD-COMPAT>
-
handle_call({sync_set,
Pid, UserId, TargetName, VarsAndVals, SendOpts},
@@ -670,24 +616,6 @@ handle_call({sync_set,
end;
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({sync_set, Pid, UserId, TargetName,
- CtxName, VarsAndVals, Timeout, ExtraInfo},
- From, State) ->
- ?vlog("[~p,~p,~p] received sync_set request for: "
- "~n ~p", [UserId, TargetName, CtxName, VarsAndVals]),
- case (catch handle_sync_set(Pid,
- UserId, TargetName, CtxName, VarsAndVals,
- Timeout, ExtraInfo, From, State)) of
- ok ->
- {noreply, State};
- Error ->
- {reply, Error, State}
- end;
-%% </BACKWARD-COMPAT>
-
-
handle_call({async_get, Pid, UserId, TargetName, Oids, SendOpts},
_From, State) ->
?vlog("[~p,~p] received async_get request for: "
@@ -698,19 +626,6 @@ handle_call({async_get, Pid, UserId, TargetName, Oids, SendOpts},
{reply, Reply, State};
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({async_get, Pid, UserId, TargetName,
- CtxName, Oids, Expire, ExtraInfo},
- _From, State) ->
- ?vlog("[~p,~p,~p] received async_get request for: "
- "~n ~p", [UserId, TargetName, CtxName, Oids]),
- Reply = (catch handle_async_get(Pid, UserId, TargetName, CtxName, Oids,
- Expire, ExtraInfo, State)),
- {reply, Reply, State};
-%% </BACKWARD-COMPAT>
-
-
handle_call({async_get_next, Pid, UserId, TargetName, Oids, SendOpts},
_From, State) ->
?vlog("[~p,~p] received async_get_next request for: "
@@ -721,19 +636,6 @@ handle_call({async_get_next, Pid, UserId, TargetName, Oids, SendOpts},
{reply, Reply, State};
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({async_get_next, Pid, UserId, TargetName,
- CtxName, Oids, Expire, ExtraInfo},
- _From, State) ->
- ?vlog("[~p,~p,~p] received async_get_next request for: ",
- [UserId, TargetName, CtxName, Oids]),
- Reply = (catch handle_async_get_next(Pid, UserId, TargetName, CtxName,
- Oids, Expire, ExtraInfo, State)),
- {reply, Reply, State};
-%% </BACKWARD-COMPAT>
-
-
%% Check agent version? This op not in v1
handle_call({async_get_bulk,
Pid, UserId, TargetName, NonRep, MaxRep, Oids, SendOpts},
@@ -747,21 +649,6 @@ handle_call({async_get_bulk,
{reply, Reply, State};
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({async_get_bulk, Pid, UserId, TargetName,
- NonRep, MaxRep, CtxName, Oids, Expire, ExtraInfo},
- _From, State) ->
- ?vlog("[~p,~p,~p] received async_get_bulk request for: "
- "~n ~p", [UserId, TargetName, CtxName, Oids]),
- Reply = (catch handle_async_get_bulk(Pid,
- UserId, TargetName, CtxName,
- NonRep, MaxRep, Oids,
- Expire, ExtraInfo, State)),
- {reply, Reply, State};
-%% </BACKWARD-COMPAT>
-
-
handle_call({async_set,
Pid, UserId, TargetName, VarsAndVals, SendOpts},
_From, State) ->
@@ -773,19 +660,6 @@ handle_call({async_set,
{reply, Reply, State};
-%% <BACKWARD-COMPAT>
-%% The only case where this would be called is during code upgrade
-handle_call({async_set, Pid, UserId, TargetName,
- CtxName, VarsAndVals, Expire, ExtraInfo},
- _From, State) ->
- ?vlog("[~p,~p,~p] received async_set request for: "
- "~n ~p", [UserId, TargetName, CtxName, VarsAndVals]),
- Reply = (catch handle_async_set(Pid, UserId, TargetName, CtxName,
- VarsAndVals, Expire, ExtraInfo, State)),
- {reply, Reply, State};
-%% </BACKWARD-COMPAT>
-
-
handle_call({cancel_async_request, UserId, ReqId}, _From, State) ->
?vlog("received cancel_async_request request", []),
Reply = (catch handle_cancel_async_request(UserId, ReqId, State)),
@@ -1024,16 +898,6 @@ terminate(Reason, #state{nis_pid = NIS, gct = GCT, cbproxy = CBP}) ->
%%
%%----------------------------------------------------------------------
-handle_sync_get(Pid, UserId, TargetName, CtxName, Oids, Timeout, ExtraInfo,
- From, State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Timeout},
- {extra, ExtraInfo}
- ],
- handle_sync_get(Pid, UserId, TargetName, Oids, SendOpts, From, State).
-
handle_sync_get(Pid, UserId, TargetName, Oids, SendOpts, From, State) ->
?vtrace("handle_sync_get -> entry with"
"~n Pid: ~p"
@@ -1076,16 +940,6 @@ handle_sync_get(Pid, UserId, TargetName, Oids, SendOpts, From, State) ->
Error
end.
-handle_sync_get_next(Pid, UserId, TargetName, CtxName, Oids, Timeout,
- ExtraInfo, From, State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Timeout},
- {extra, ExtraInfo}
- ],
- handle_sync_get_next(Pid, UserId, TargetName, Oids, SendOpts, From, State).
-
handle_sync_get_next(Pid, UserId, TargetName, Oids, SendOpts,
From, State) ->
?vtrace("handle_sync_get_next -> entry with"
@@ -1131,18 +985,6 @@ handle_sync_get_next(Pid, UserId, TargetName, Oids, SendOpts,
end.
-handle_sync_get_bulk(Pid, UserId, TargetName, CtxName,
- NonRep, MaxRep, Oids, Timeout,
- ExtraInfo, From, State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Timeout},
- {extra, ExtraInfo}
- ],
- handle_sync_get_bulk(Pid, UserId, TargetName, NonRep, MaxRep, Oids,
- SendOpts, From, State).
-
handle_sync_get_bulk(Pid, UserId, TargetName, NonRep, MaxRep, Oids, SendOpts,
From, State) ->
?vtrace("handle_sync_get_bulk -> entry with"
@@ -1190,17 +1032,6 @@ handle_sync_get_bulk(Pid, UserId, TargetName, NonRep, MaxRep, Oids, SendOpts,
end.
-handle_sync_set(Pid, UserId, TargetName, CtxName, VarsAndVals, Timeout,
- ExtraInfo, From, State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Timeout},
- {extra, ExtraInfo}
- ],
- handle_sync_set(Pid, UserId, TargetName, VarsAndVals, SendOpts,
- From, State).
-
handle_sync_set(Pid, UserId, TargetName, VarsAndVals, SendOpts, From, State) ->
?vtrace("handle_sync_set -> entry with"
"~n Pid: ~p"
@@ -1245,16 +1076,6 @@ handle_sync_set(Pid, UserId, TargetName, VarsAndVals, SendOpts, From, State) ->
end.
-handle_async_get(Pid, UserId, TargetName, CtxName, Oids, Expire, ExtraInfo,
- State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Expire},
- {extra, ExtraInfo}
- ],
- handle_async_get(Pid, UserId, TargetName, Oids, SendOpts, State).
-
handle_async_get(Pid, UserId, TargetName, Oids, SendOpts, State) ->
?vtrace("handle_async_get -> entry with"
"~n Pid: ~p"
@@ -1294,16 +1115,6 @@ handle_async_get(Pid, UserId, TargetName, Oids, SendOpts, State) ->
end.
-handle_async_get_next(Pid, UserId, TargetName, CtxName, Oids, Expire,
- ExtraInfo, State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Expire},
- {extra, ExtraInfo}
- ],
- handle_async_get_next(Pid, UserId, TargetName, Oids, SendOpts, State).
-
handle_async_get_next(Pid, UserId, TargetName, Oids, SendOpts, State) ->
?vtrace("handle_async_get_next -> entry with"
"~n Pid: ~p"
@@ -1343,19 +1154,6 @@ handle_async_get_next(Pid, UserId, TargetName, Oids, SendOpts, State) ->
end.
-handle_async_get_bulk(Pid, UserId, TargetName, CtxName,
- NonRep, MaxRep, Oids, Expire,
- ExtraInfo, State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Expire},
- {extra, ExtraInfo}
- ],
- handle_async_get_bulk(Pid,
- UserId, TargetName, NonRep, MaxRep, Oids, SendOpts,
- State).
-
handle_async_get_bulk(Pid,
UserId, TargetName, NonRep, MaxRep, Oids, SendOpts,
State) ->
@@ -1398,16 +1196,6 @@ handle_async_get_bulk(Pid,
end.
-handle_async_set(Pid, UserId, TargetName, CtxName, VarsAndVals, Expire,
- ExtraInfo, State) ->
- SendOpts =
- [
- {context, CtxName},
- {timeout, Expire},
- {extra, ExtraInfo}
- ],
- handle_async_set(Pid, UserId, TargetName, VarsAndVals, SendOpts, State).
-
handle_async_set(Pid, UserId, TargetName, VarsAndVals, SendOpts, State) ->
?vtrace("handle_async_set -> entry with"
"~n Pid: ~p"
@@ -1549,14 +1337,14 @@ handle_snmp_error(#pdu{request_id = ReqId} = Pdu, Reason, State) ->
_ ->
%% reply to outstanding request, for which there is no
%% longer any owner (the user has unregistered).
- %% Therefor send it to the default user
+ %% Therefore send it to the default user
case snmpm_config:user_info() of
{ok, DefUserId, DefMod, DefData} ->
handle_error(DefUserId, DefMod, Reason, ReqId,
DefData, State),
maybe_delete(Disco, ReqId);
_ ->
- error_msg("failed retreiving the default user "
+ error_msg("failed retrieving the default user "
"info handling error [~w]: "
"~n~w", [ReqId, Reason])
end
@@ -1604,7 +1392,7 @@ handle_snmp_error(#pdu{request_id = ReqId} = Pdu, Reason, State) ->
handle_error(DefUserId, DefMod, Reason,
ReqId, DefData, State);
_ ->
- error_msg("failed retreiving the default "
+ error_msg("failed retrieving the default "
"user info handling error [~w]: "
"~n~w",[ReqId, Reason])
end
@@ -1636,7 +1424,7 @@ handle_snmp_error(Domain, Addr, ReqId, Reason, State) ->
handle_error(DefUserId, DefMod, Reason,
ReqId, DefData, State);
_Error2 ->
- error_msg("failed retreiving the default user "
+ error_msg("failed retrieving the default user "
"info handling snmp error "
"<~p,~p>: ~n~w~n~w",
[Domain, Addr, ReqId, Reason])
@@ -1648,7 +1436,7 @@ handle_snmp_error(Domain, Addr, ReqId, Reason, State) ->
handle_error(DefUserId, DefMod, Reason,
ReqId, DefData, State);
_Error4 ->
- error_msg("failed retreiving the default user "
+ error_msg("failed retrieving the default user "
"info handling snmp error "
"<~p,~p>: ~n~w~n~w",
[Domain, Addr, ReqId, Reason])
@@ -1721,7 +1509,7 @@ handle_snmp_pdu(#pdu{type = 'get-response', request_id = ReqId} = Pdu,
_Error ->
%% reply to outstanding request, for which there is no
%% longer any owner (the user has unregistered).
- %% Therefor send it to the default user
+ %% Therefore send it to the default user
case snmpm_config:user_info() of
{ok, DefUserId, DefMod, DefData} ->
handle_pdu(
@@ -1730,7 +1518,7 @@ handle_snmp_pdu(#pdu{type = 'get-response', request_id = ReqId} = Pdu,
ReqId, SnmpResponse, DefData, State),
maybe_delete(Disco, ReqId);
Error ->
- error_msg("failed retreiving the default user "
+ error_msg("failed retrieving the default user "
"info handling pdu from "
"~p <~p,~p>: ~n~w~n~w",
[Target, Domain, Addr, Error, Pdu])
@@ -1808,7 +1596,7 @@ handle_snmp_pdu(#pdu{type = 'get-response', request_id = ReqId} = Pdu,
handle_error(DefUserId, DefMod, Reason,
ReqId, DefData, State);
Error ->
- error_msg("failed retreiving the default "
+ error_msg("failed retrieving the default "
"user info handling (old) "
"pdu from "
"<~p,~p>: ~n~w~n~w",
@@ -1835,7 +1623,7 @@ handle_snmp_pdu(#pdu{type = 'get-response', request_id = ReqId} = Pdu,
pdu, ignore,
SnmpInfo, DefData, State);
Error ->
- error_msg("failed retreiving the default user "
+ error_msg("failed retrieving the default user "
"info handling (old) pdu when no user "
"found from "
"<~p,~p>: ~n~w~n~w",
@@ -2105,7 +1893,7 @@ do_handle_snmp_trap(SnmpTrapInfo, Domain, Addr, State) ->
Error1 ->
%% User no longer exists, unregister agent
- ?vlog("[trap] failed retreiving user info for "
+ ?vlog("[trap] failed retrieving user info for "
"user ~p: "
"~n ~p", [UserId, Error1]),
case snmpm_config:unregister_agent(UserId, Target) of
@@ -2120,7 +1908,7 @@ do_handle_snmp_trap(SnmpTrapInfo, Domain, Addr, State) ->
SnmpTrapInfo, DefData, State);
Error2 ->
error_msg(
- "failed retreiving the default "
+ "failed retrieving the default "
"user info handling report from "
"~p <~p,~p>: ~n~w~n~w",
[Target, Domain, Addr,
@@ -2142,7 +1930,7 @@ do_handle_snmp_trap(SnmpTrapInfo, Domain, Addr, State) ->
Error4 ->
%% Unknown agent, pass it on to the default user
- ?vlog("[trap] failed retreiving user id for agent <~p,~p>: "
+ ?vlog("[trap] failed retrieving user id for agent <~p,~p>: "
"~n Error: ~p"
"~n when"
"~n Users: ~p"
@@ -2159,7 +1947,7 @@ do_handle_snmp_trap(SnmpTrapInfo, Domain, Addr, State) ->
SnmpTrapInfo, DefData, State);
Error5 ->
error_msg(
- "failed retreiving "
+ "failed retrieving "
"the default user info, handling trap from <~p,~p>:"
"~n Error: ~p"
"~n Trap Info: ~p",
@@ -2290,7 +2078,7 @@ handle_snmp_inform(
case snmpm_config:unregister_agent(UserId, Target) of
ok ->
%% Try use the default user
- ?vlog("[inform] failed retreiving user "
+ ?vlog("[inform] failed retrieving user "
"info for user ~p:"
"~n ~p", [UserId, Error1]),
case snmpm_config:user_info() of
@@ -2301,7 +2089,7 @@ handle_snmp_inform(
inform, Ref,
SnmpInform, DefData, State);
Error2 ->
- error_msg("failed retreiving the default "
+ error_msg("failed retrieving the default "
"user info handling inform from "
"~p <~p,~p>: ~n~w~n~w",
[Target, Domain, Addr,
@@ -2322,7 +2110,7 @@ handle_snmp_inform(
Error4 ->
%% Unknown agent, pass it on to the default user
- ?vlog("[inform] failed retreiving user id for agent <~p,~p>: "
+ ?vlog("[inform] failed retrieving user id for agent <~p,~p>: "
"~n ~p", [Domain, Addr, Error4]),
case snmpm_config:user_info() of
{ok, DefUserId, DefMod, DefData} ->
@@ -2332,7 +2120,7 @@ handle_snmp_inform(
inform, Ref,
SnmpInform, DefData, State);
Error5 ->
- error_msg("failed retreiving "
+ error_msg("failed retrieving "
"the default user info handling inform from "
"<~p,~p>: ~n~w~n~w",
[Domain, Addr, Error5, Pdu])
@@ -2492,7 +2280,7 @@ handle_snmp_report(
SnmpReport, Data, State);
Error1 ->
%% User no longer exists, unregister agent
- ?vlog("[report] failed retreiving user info "
+ ?vlog("[report] failed retrieving user info "
"for user ~p:"
" ~n ~p", [UserId, Error1]),
case snmpm_config:unregister_agent(UserId, Target) of
@@ -2506,7 +2294,7 @@ handle_snmp_report(
SnmpReport, DefData, State);
Error2 ->
- error_msg("failed retreiving the default "
+ error_msg("failed retrieving the default "
"user info handling report from "
"~p <~p,~p>: ~n~w~n~w",
[Target, Domain, Addr,
@@ -2527,7 +2315,7 @@ handle_snmp_report(
Error4 ->
%% Unknown agent, pass it on to the default user
- ?vlog("[report] failed retreiving user id for agent <~p,~p>: "
+ ?vlog("[report] failed retrieving user id for agent <~p,~p>: "
"~n ~p", [Domain, Addr, Error4]),
case snmpm_config:user_info() of
{ok, DefUserId, DefMod, DefData} ->
@@ -2536,7 +2324,7 @@ handle_snmp_report(
report, ignore,
SnmpReport, DefData, State);
Error5 ->
- error_msg("failed retreiving "
+ error_msg("failed retrieving "
"the default user info handling report from "
"<~p,~p>: ~n~w~n~w",
[Domain, Addr, Error5, Pdu])
@@ -2551,7 +2339,7 @@ handle_snmp_report(CrapReport, Domain, Addr, _State) ->
%% This could be from a failed get-request, so we might have a user
%% waiting for a reply here. If there is, we handle this as an failed
-%% get-response (except for tha data which is different). Otherwise,
+%% get-response (except for the data which is different). Otherwise,
%% we handle it as an error (reported via the handle_error callback
%% function).
handle_snmp_report(
@@ -2624,7 +2412,7 @@ handle_snmp_report(
Data, State);
Error ->
%% Oh crap, use the default user
- ?vlog("[report] failed retreiving user info for "
+ ?vlog("[report] failed retrieving user info for "
"user ~p:"
" ~n ~p", [UserId, Error]),
case snmpm_config:user_info() of
@@ -2632,7 +2420,7 @@ handle_snmp_report(
handle_error(DefUserId, DefMod, Reason,
ReqId, DefData, State);
Error ->
- error_msg("failed retreiving the "
+ error_msg("failed retrieving the "
"default user "
"info handling report from "
"<~p,~p>: ~n~w~n~w~n~w",
@@ -2642,7 +2430,7 @@ handle_snmp_report(
end;
Error ->
%% Unknown agent, pass it on to the default user
- ?vlog("[report] failed retreiving user id for "
+ ?vlog("[report] failed retrieving user id for "
"agent <~p,~p>: "
"~n ~p", [Domain, Addr, Error]),
case snmpm_config:user_info() of
@@ -2650,7 +2438,7 @@ handle_snmp_report(
handle_error(DefUserId, DefMod, Reason, ReqId,
DefData, State);
Error ->
- error_msg("failed retreiving "
+ error_msg("failed retrieving "
"the default user info handling "
"report from "
"<~p,~p>: ~n~w~n~w~n~w",
diff --git a/lib/snmp/src/manager/snmpm_usm.erl b/lib/snmp/src/manager/snmpm_usm.erl
index 7ba91b86e7..08a70c6ca6 100644
--- a/lib/snmp/src/manager/snmpm_usm.erl
+++ b/lib/snmp/src/manager/snmpm_usm.erl
@@ -60,7 +60,7 @@ init() ->
%% Func: process_incoming_msg(Packet, Data, SecParams, SecLevel) ->
%% {ok, {SecEngineID, SecName, ScopedPDUBytes, SecData}} |
%% {error, Reason} | {error, Reason, ErrorInfo}
-%% Return value may be throwed.
+%% Return value may be thrown.
%% Types: Reason -> term()
%% Purpose:
%%-----------------------------------------------------------------
@@ -331,7 +331,7 @@ try_decrypt(usmAesCfb128Protocol,
%% SecData, SecLevel) ->
%% {ok, {SecEngineID, SecName, ScopedPDUBytes, SecData}} |
%% {error, Reason} | {error, Reason, ErrorInfo}
-%% Return value may be throwed.
+%% Return value may be thrown.
%% Types: Reason -> term()
%% Purpose:
%%-----------------------------------------------------------------
diff --git a/lib/snmp/src/misc/Makefile b/lib/snmp/src/misc/Makefile
index eca2d949d2..e92506e855 100644
--- a/lib/snmp/src/misc/Makefile
+++ b/lib/snmp/src/misc/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2021. All Rights Reserved.
+# Copyright Ericsson AB 2003-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -100,8 +100,8 @@ ERL_COMPILE_FLAGS += -I../../include \
# Targets
# ----------------------------------------------------
-debug:
- @$(MAKE) TYPE=debug opt
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
opt: $(TARGET_FILES)
diff --git a/lib/snmp/src/misc/snmp_conf.erl b/lib/snmp/src/misc/snmp_conf.erl
index 39c18777c7..33db74e1e0 100644
--- a/lib/snmp/src/misc/snmp_conf.erl
+++ b/lib/snmp/src/misc/snmp_conf.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -163,7 +163,7 @@ no_gen(_Dir, _R) -> [].
no_order(_, _) -> true.
no_filter(X) -> X.
-%% Order tuples on element N with Keys first in appearence order.
+%% Order tuples on element N with Keys first in appearance order.
%%
%% An ordering function (A, B) shall return true iff
%% A is less than or equal to B i.e shall return
@@ -924,7 +924,7 @@ check_transport_address(transportDomainUdpIpv4 = _Domain,
when ?is_ipv4_addr(A0, A1, A2, A3) ->
case PortInfo of
system ->
- %% The actual port number will be choosen
+ %% The actual port number will be chosen
%% by the system (create with port = 0)
%% when the socket is created.
true;
@@ -946,7 +946,7 @@ check_transport_address(transportDomainUdpIpv6 = _Domain,
when ?is_ipv6_addr(A0, A1, A2, A3, A4, A5, A6, A7) ->
case PortInfo of
system ->
- %% The actual port number will be choosen
+ %% The actual port number will be chosen
%% by the system (create with port = 0)
%% when the socket is created.
true;
diff --git a/lib/snmp/src/misc/snmp_config.erl b/lib/snmp/src/misc/snmp_config.erl
index 928b469c06..44a9044a29 100644
--- a/lib/snmp/src/misc/snmp_config.erl
+++ b/lib/snmp/src/misc/snmp_config.erl
@@ -504,7 +504,7 @@ config_agent_transports(ID) ->
config_agent_transports(ID, []).
config_agent_transports(ID, []) ->
- i(ID ++ ". Configure atleast one transport: "),
+ i(ID ++ ". Configure at least one transport: "),
T = config_agent_transport(ID),
config_agent_transports(ID, [T]);
config_agent_transports(ID, Acc) ->
@@ -1103,7 +1103,7 @@ verify_max_message_size(MMS) ->
I when is_integer(I) andalso (I >= 484) ->
{ok, I};
I when is_integer(I) ->
- {error, "invalid max message size (must be atleast 484): " ++ MMS};
+ {error, "invalid max message size (must be at least 484): " ++ MMS};
_ ->
{error, "invalid max message size: " ++ MMS}
end.
@@ -1167,7 +1167,7 @@ verify_db_init_error(R) ->
verify_notif_type("trap") -> {ok, trap};
verify_notif_type("inform") -> {ok, inform};
-verify_notif_type(NT) -> {error, "invalid notifcation type: " ++ NT}.
+verify_notif_type(NT) -> {error, "invalid notification type: " ++ NT}.
verify_sec_type("none") -> {ok, none};
@@ -2648,7 +2648,7 @@ write_sys_config_file_agent_config_opt(Fid, {verbosity, Verb}) ->
ok = io:format(Fid, "{verbosity, ~w}", [Verb]).
-%% This is only present if there is atleast one option
+%% This is only present if there is at least one option
write_sys_config_file_agent_atl_opts(Fid, [Opt]) ->
write_sys_config_file_agent_atl_opt(Fid, Opt),
ok = io:format(Fid, "]", []),
@@ -2670,7 +2670,7 @@ write_sys_config_file_agent_atl_opt(Fid, {seqno, SeqNo}) ->
ok = io:format(Fid, "{seqno, ~w}", [SeqNo]).
-%% These options are allways there
+%% These options are always there
write_sys_config_file_agent_disco_opts(Fid, [Opt]) ->
write_sys_config_file_agent_disco_opt(Fid, Opt),
ok = io:format(Fid, "]", []),
@@ -2776,7 +2776,7 @@ write_sys_config_file_manager_config_opt(Fid, {verbosity, Verb}) ->
ok = io:format(Fid, "{verbosity, ~w}", [Verb]).
-%% This is only present if there is atleast one option
+%% This is only present if there is at least one option
write_sys_config_file_manager_atl_opts(Fid, [Opt]) ->
write_sys_config_file_manager_atl_opt(Fid, Opt),
ok = io:format(Fid, "]", []),
@@ -2807,7 +2807,7 @@ header() ->
[?MODULE, ?version, Y, Mo, D, H, Mi, S]).
-%% *If* these functions are successfull, they successfully return
+%% *If* these functions are successful, they successfully return
%% (value is ignored), but they fail preferably with
%% throw({error, Reason}). Other exceptions are also handled.
@@ -2862,7 +2862,7 @@ write_config_file(Dir, FileName, Order, Check, Write, Entries)
end
catch
throw:E:S ->
- d("File write of ~s throwed: "
+ d("File write of ~s thrown: "
"~n ~p"
"~n ~p"
"~n", [FileName, E, S]),
@@ -2881,7 +2881,7 @@ write_config_file(Dir, FileName, Write, Entries, Fd) ->
close_config_file(Dir, FileName, Fd)
catch
throw:E:S ->
- d("File write of ~s throwed: "
+ d("File write of ~s thrown: "
"~n ~p"
"~n ~p"
"~n", [FileName, E, S]),
@@ -2954,7 +2954,7 @@ append_config_file(Dir, FileName, Order, Check, Write, Entries, Fd) ->
close_config_file(Dir, FileName, Fd)
catch
throw:E:S ->
- d("File append of ~s throwed: "
+ d("File append of ~s thrown: "
"~n ~p"
"~n ~p"
"~n", [FileName, E, S]),
@@ -2997,7 +2997,7 @@ read_config_file(Dir, FileName, Order, Check)
{ok, verify_lines(SortedLines, Check, undefined, [])}
catch
throw:E:S ->
- d("File read of ~s throwed: "
+ d("File read of ~s thrown: "
"~n ~p"
"~n ~p"
"~n", [FileName, E, S]),
diff --git a/lib/snmp/src/misc/snmp_log.erl b/lib/snmp/src/misc/snmp_log.erl
index 8a4dfa621b..158883810f 100644
--- a/lib/snmp/src/misc/snmp_log.erl
+++ b/lib/snmp/src/misc/snmp_log.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2019. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1068,7 +1068,7 @@ log_open2(Name, File, SeqNoGen, Size, Repair, Notify) ->
end.
-%% We need to make sure we do not end up in an infinit loop
+%% We need to make sure we do not end up in an infinite loop
%% Take the number of files of the wrap log and add 2 (for
%% the index and size files).
do_log_open(Name, File, {_, N} = Size, snmp_repair = _Repair, Notify) ->
diff --git a/lib/snmp/src/misc/snmp_misc.erl b/lib/snmp/src/misc/snmp_misc.erl
index b02cf9d82e..18d5800651 100644
--- a/lib/snmp/src/misc/snmp_misc.erl
+++ b/lib/snmp/src/misc/snmp_misc.erl
@@ -492,7 +492,7 @@ format_pdu(PDU, MiniMib) when is_record(PDU, pdu) ->
(T =:= 'get-bulk-request') ->
"";
true ->
- io_lib:format("*!*!* An error occured. *!*!* ~n"
+ io_lib:format("*!*!* An error occurred. *!*!* ~n"
"Error status = ~w, index = ~w.~n",
[ES, EI])
end,
diff --git a/lib/snmp/src/misc/snmp_note_store.erl b/lib/snmp/src/misc/snmp_note_store.erl
index 606dd8ce4f..e842f3d3fa 100644
--- a/lib/snmp/src/misc/snmp_note_store.erl
+++ b/lib/snmp/src/misc/snmp_note_store.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -156,7 +156,7 @@ handle_call({set_note, Lifetime, Key, Value}, _From,
{reply, Val, NState};
_Crap ->
?vinfo("handle_call(set_note) -> "
- "failed retreiving system start time from ~w: "
+ "failed retrieving system start time from ~w: "
"~n ~p", [Mod, _Crap]),
{reply, {error, failed_retreive_system_start_time}, State}
end;
@@ -317,13 +317,13 @@ timer(Pid, passive, Timeout) ->
?MODULE:timer(Pid, passive, Timeout);
activate ->
- ?d("timer(deactive) -> activate request, send ack",[]),
+ ?d("timer(deactivate) -> activate request, send ack",[]),
Pid ! activated,
- ?d("timer(deactive) -> activate",[]),
+ ?d("timer(deactivate) -> activate",[]),
?MODULE:timer(Pid, active, Timeout) % code replacement
after
Timeout ->
- ?d("timer(deactive) -> timeout",[]),
+ ?d("timer(deactivate) -> timeout",[]),
?MODULE:timer(Pid, passive, Timeout)
end;
timer(Pid, active, Timeout) ->
diff --git a/lib/snmp/src/misc/snmp_usm.erl b/lib/snmp/src/misc/snmp_usm.erl
index 9652e3a3ff..9c05c7d616 100644
--- a/lib/snmp/src/misc/snmp_usm.erl
+++ b/lib/snmp/src/misc/snmp_usm.erl
@@ -411,7 +411,7 @@ des_decrypt(PrivKey, MsgPrivParams, EncData)
DesKey = [A,B,C,D,E,F,G,H],
Salt = MsgPrivParams,
IV = list_to_binary(snmp_misc:str_xor(PreIV, Salt)),
- %% Whatabout errors here??? E.g. not a mulitple of 8!
+ %% Whatabout errors here??? E.g. not a multiple of 8!
Data = binary_to_list(crypto:crypto_one_time(?BLOCK_CIPHER_DES,
DesKey, IV, EncData, false)),
Data2 = snmp_pdus:strip_encrypted_scoped_pdu_data(Data),
@@ -438,7 +438,7 @@ aes_decrypt(PrivKey, MsgPrivParams, EncData, EngineBoots, EngineTime)
AesKey = PrivKey,
Salt = MsgPrivParams,
IV = list_to_binary([?i32(EngineBoots), ?i32(EngineTime) | Salt]),
- %% Whatabout errors here??? E.g. not a mulitple of 8!
+ %% Whatabout errors here??? E.g. not a multiple of 8!
Data = binary_to_list(crypto:crypto_one_time(?BLOCK_CIPHER_AES(AesKey),
AesKey, IV, EncData, false)),
Data2 = snmp_pdus:strip_encrypted_scoped_pdu_data(Data),
diff --git a/lib/snmp/test/Makefile b/lib/snmp/test/Makefile
index e9bd50f6d8..ac25a0d0b3 100644
--- a/lib/snmp/test/Makefile
+++ b/lib/snmp/test/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2020. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -176,7 +176,7 @@ $(SNMP_BIN_TARGET_DIR)/%.hrl: $(SNMP_BIN_TARGET_DIR)/%.bin
# Targets
# ----------------------------------------------------
-tests debug opt: $(BUILDTARGET)
+tests $(TYPES): $(BUILDTARGET)
.PHONY: emakebuild
diff --git a/lib/snmp/test/exp/.gitignore b/lib/snmp/test/exp/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/snmp/test/exp/.gitignore
+++ /dev/null
diff --git a/lib/snmp/test/exp/snmp_agent_bl_test.erl b/lib/snmp/test/exp/snmp_agent_bl_test.erl
deleted file mode 100644
index 943426d8c2..0000000000
--- a/lib/snmp/test/exp/snmp_agent_bl_test.erl
+++ /dev/null
@@ -1,5634 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(snmp_agent_bl_test).
-
-%% TODO
-%% * Test fault-tolerance (kill master etc)
-%%
-
-% -include_lib("kernel/include/file.hrl").
-% -include("test_server.hrl").
-% -include("snmp_test_lib.hrl").
-% -define(SNMP_USE_V3, true).
-% -include_lib("snmp/include/snmp_types.hrl").
-
-%% -include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl").
-
-
-% -define(klas1, [1,3,6,1,2,1,7]).
-% -define(klas2, [1,3,6,1,2,1,9]).
-% -define(klas3, [1,3,6,1,2,1,8,1]).
-% -define(klas4, [1,3,6,1,2,1,8,4]).
-% -define(sa, [1,3,6,1,4,1,193,2]).
-% -define(system, [1,3,6,1,2,1,1]).
-% -define(snmp, [1,3,6,1,2,1,11]).
-% -define(snmpTraps, [1,3,6,1,6,3,1,1,5]).
-% -define(ericsson, [1,3,6,1,4,1,193]).
-% -define(testTrap, [1,3,6,1,2,1,15,0]).
-% -define(xDescr, [1,3,6,1,2,1,17,1]).
-% -define(xDescr2, [1,3,6,1,2,1,17,2]).
-
-% -define(active, 1).
-% -define(notInService, 2).
-% -define(notReady, 3).
-% -define(createAndGo, 4).
-% -define(createAndWait, 5).
-% -define(destroy, 6).
-
-% -define(TRAP_UDP, 5000).
-
-% -define(tooBigStr, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").
-
--define(str(X), snmp_pdus:bits_to_str(X)).
-
--define(break(), begin io:format(user, "break at line ~w: pid: ~p\n",
- [?LINE, self()]),
- receive cont -> ok end
- end).
-
-
--import(snmp_test_mgr, [gn/1, g/1, s/1, gb/3]).
--define(v1_2(V1,V2),
- case get(vsn) of
- v1 -> V1;
- _ -> V2
- end).
-
--define(v1_2_3(V1,V2,V3),
- case get(vsn) of
- v1 -> V1;
- v2 -> V2;
- _ -> V3
- end).
-
-all(suite) -> {req,
- [mnesia, distribution,
- {local_slave_nodes, 2}, {time, 360}],
- [{conf, init_all, cases(), finish_all}]}.
-
-init_per_testcase(_Case, Config) when list(Config) ->
- Dog = test_server:timetrap(test_server:minutes(6)),
- [{watchdog, Dog}|Config].
-
-end_per_testcase(_Case, Config) when list(Config) ->
- Dog = ?config(watchdog, Config),
- test_server:timetrap_cancel(Dog),
- Config.
-
-cases() ->
- [
- app_info,
- test_v1, test_v2, test_v1_v2, test_v3,
- test_multi_threaded,
- mib_storage,
- tickets
- ].
-
-
-%%%-----------------------------------------------------------------
-%%% The test case structure is as follows:
-%%%
-%%% init_all - starts mnesia,
-%%%
-%%% init_v1 - starts agent
-%%% simple
-%%% big - e.g. starts/stops subagent, load/unloads mibs
-%%% init_mul
-%%% mul_get
-%%% mul_set
-%%% <etc>
-%%% finish_mul
-%%% <etc>
-%%% finish_v1
-%%%
-%%% init_v2 - starts agent
-%%% finish_v2
-%%%
-%%% init_bilingual - starts agent
-%%% finish_bilingual
-%%%
-%%% finish_all
-%%%
-%%% There is still one problem with these testsuites. If one test
-%%% fails, it may not be possible to run some other cases, as it
-%%% may have e.g. created some row or loaded some table, that it
-%%% didn't undo (since it failed).
-%%%-----------------------------------------------------------------
-
-init_all(Config0) when list(Config0) ->
- ?LOG("init_all -> entry with"
- "~n Config0: ~p",[Config0]),
-
- %% --
- %% Fix config:
- %%
-
- DataDir0 = ?config(data_dir, Config0),
- DataDir1 = filename:split(filename:absname(DataDir0)),
- [_|DataDir2] = lists:reverse(DataDir1),
- DataDir3 = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),
- Config1 = lists:keydelete(data_dir, 1, Config0),
- Config = [{data_dir, DataDir3 ++ "/"}|Config1],
-
- %% --
- %% Start nodes
- %%
-
- ?line {ok, SaNode} = start_node(snmp_sa),
- ?line {ok, MgrNode} = start_node(snmp_mgr),
-
-
- %% --
- %% Create necessary files
- %%
-
- Dir = ?config(priv_dir, Config),
- ?DBG("init_all -> Dir ~p", [Dir]),
-
- DataDir = ?config(data_dir, Config),
- ?DBG("init_all -> DataDir ~p", [DataDir]),
-
- file:make_dir(MgrDir = filename:join(Dir, "mgr_dir/")),
- ?DBG("init_all -> MgrDir ~p", [MgrDir]),
-
- file:make_dir(AgentDir = filename:join(Dir, "agent_dir/")),
- ?DBG("init_all -> AgentDir ~p", [AgentDir]),
-
- file:make_dir(SaDir = filename:join(Dir, "sa_dir/")),
- ?DBG("init_all -> SaDir ~p", [SaDir]),
-
-
- %% --
- %% Start and initiate mnesia
- %%
-
- ?DBG("init_all -> load application mnesia", []),
- ?line ok = application:load(mnesia),
-
- ?DBG("init_all -> load application mnesia on node ~p", [SaNode]),
- ?line ok = rpc:call(SaNode, application, load, [mnesia]),
-
- ?DBG("init_all -> application mnesia: set_env dir",[]),
- ?line application_controller:set_env(mnesia, dir,
- filename:join(Dir, "Mnesia1")),
-
- ?DBG("init_all -> application mnesia: set_env dir on node ~p",[SaNode]),
- ?line rpc:call(SaNode, application_controller, set_env,
- [mnesia, dir, filename:join(Dir, "Mnesia2")]),
-
- ?DBG("init_all -> create mnesia schema",[]),
- ?line ok = mnesia:create_schema([SaNode, node()]),
-
- ?DBG("init_all -> start application mnesia",[]),
- ?line ok = application:start(mnesia),
-
- ?DBG("init_all -> start application mnesia on ~p",[SaNode]),
- ?line ok = rpc:call(SaNode, application, start, [mnesia]),
- Ip = ?LOCALHOST(),
- [{snmp_sa, SaNode},
- {snmp_mgr, MgrNode},
- {agent_dir, AgentDir ++ "/"},
- {mgr_dir, MgrDir ++ "/"},
- {sa_dir, SaDir ++ "/"},
- {mib_dir, DataDir},
- {ip, Ip} |
- Config].
-
-finish_all(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- stop_node(SaNode),
- stop_node(MgrNode),
- application:stop(mnesia).
-
-start_v1_agent(Config) when list(Config) ->
- start_agent(Config, [v1]).
-
-start_v1_agent(Config,Opts) when list(Config), list(Opts) ->
- start_agent(Config, [v1], Opts).
-
-start_v2_agent(Config) when list(Config) ->
- start_agent(Config, [v2]).
-
-start_v3_agent(Config) when list(Config) ->
- start_agent(Config, [v3]).
-
-start_bilingual_agent(Config) when list(Config) ->
- start_agent(Config, [v1,v2]).
-
-start_multi_threaded_agent(Config) when list(Config) ->
- start_agent(Config, [v2], [{snmp_multi_threaded, true}]).
-
-stop_agent(Config) when list(Config) ->
- ?LOG("stop_agent -> entry with"
- "~n Config: ~p",[Config]),
-
- {Sup, Par} = ?config(snmp_sup, Config),
- ?DBG("stop_agent -> attempt to stop (sup) ~p"
- "~n Sup: ~p"
- "~n Par: ~p",
- [Sup,
- (catch process_info(Sup)),
- (catch process_info(Par))]),
- stop_sup(Sup, Par),
-
- {Sup2, Par2} = ?config(snmp_sub, Config),
- ?DBG("stop_agent -> attempt to stop (sub) ~p"
- "~n Sup2: ~p"
- "~n Par2: ~p",
- [Sup2,
- (catch process_info(Sup2)),
- (catch process_info(Par2))]),
- stop_sup(Sup2, Par2),
-
- ?DBG("stop_agent -> done - now cleanup config", []),
- C1 = lists:keydelete(snmp_sup, 1, Config),
- lists:keydelete(snmp_sub, 1, C1).
-
-
-stop_sup(Pid, _) when node(Pid) == node() ->
- case (catch process_info(Pid)) of
- PI when list(PI) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- exit(Pid, kill),
- await_stopped(Pid, Ref);
- {'EXIT', _Reason} ->
- ?LOG("stop_sup -> ~p not running", [Pid]),
- ok
- end;
-stop_sup(Pid, _) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- ?LOG("stop_sup -> Ref: ~p", [Ref]),
- %% Pid ! {'EXIT', Parent, shutdown}, % usch
- exit(Pid, kill),
- await_stopped(Pid, Ref).
-
-await_stopped(Pid, Ref) ->
- receive
- {'DOWN', Ref, process, Pid, _Reason} ->
- ?DBG("received down message for ~p", [Pid]),
- ok
- after 10000 ->
- ?INF("await_stopped -> timeout for ~p",[Pid]),
- erlang:demonitor(Ref),
- ?FAIL({failed_stop,Pid})
- end.
-
-
-start_agent(Config, Vsn) ->
- start_agent(Config, Vsn, []).
-start_agent(Config, Vsn, Opts) ->
- ?LOG("start_agent -> entry (~p) with"
- "~n Config: ~p"
- "~n Vsn: ~p"
- "~n Opts: ~p",[node(), Config, Vsn, Opts]),
-
- ?line AgentDir = ?config(agent_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
-
- snmp_app_env_init(vsn_init(Vsn) ++
- [{audit_trail_log, read_write_log},
- {audit_trail_log_dir, AgentDir},
- {audit_trail_log_size, {10240, 10}},
- {force_config_reload, false},
- {snmp_agent_type, master},
- {snmp_config_dir, AgentDir},
- {snmp_db_dir, AgentDir},
- {snmp_local_db_auto_repair, true},
- {snmp_master_agent_verbosity, trace},
- {snmp_supervisor_verbosity, trace},
- {snmp_mibserver_verbosity, trace},
- {snmp_symbolic_store_verbosity, trace},
- {snmp_note_store_verbosity, trace},
- {snmp_net_if_verbosity, trace}],
- Opts),
-
-
- process_flag(trap_exit,true),
-
- {ok, AppSup} = snmp_app_sup:start_link(),
- unlink(AppSup),
- ?DBG("start_agent -> snmp app supervisor: ~p",[AppSup]),
-
- ?DBG("start_agent -> start master agent (old style)",[]),
- Sup = case (catch snmpa_app:start(normal)) of
- {ok, S} ->
- ?DBG("start_agent -> started, Sup: ~p",[S]),
- S;
-
- Else ->
- ?DBG("start_agent -> unknown result: ~n~p",[Else]),
- %% Get info about the apps we depend on
- MnesiaInfo = mnesia_running(),
- ?FAIL({start_failed,Else,MnesiaInfo})
- end,
-
- ?DBG("start_agent -> unlink from supervisor",[]),
- ?line unlink(Sup),
- ?line SaDir = ?config(sa_dir, Config),
- ?DBG("start_agent -> (rpc) start sub on ~p",[SaNode]),
- ?line {ok, Sub} = rpc:call(SaNode, ?MODULE, start_sub, [SaDir]),
- ?DBG("start_agent -> done",[]),
- ?line [{snmp_sup, {Sup, self()}}, {snmp_sub, Sub} | Config].
-
-
-vsn_init(Vsn) ->
- vsn_init([v1,v2,v3], Vsn, []).
-
-vsn_init([], _Vsn, Acc) ->
- Acc;
-vsn_init([V|Vsns], Vsn, Acc) ->
- case lists:member(V, Vsn) of
- true ->
- vsn_init(Vsns, Vsn, [{V, true}|Acc]);
- false ->
- vsn_init(Vsns, Vsn, [{V, false}|Acc])
- end.
-
-snmp_app_env_init(Env0, Opts) ->
- ?DBG("snmp_app_env_init -> unload snmp",[]),
- ?line application:unload(snmp),
- ?DBG("snmp_app_env_init -> load snmp",[]),
- ?line application:load(snmp),
- ?DBG("snmp_app_env_init -> initiate (snmp) application env",[]),
- F1 = fun({Key,Val} = New, Acc0) ->
- ?DBG("snmp_app_env_init -> "
- "updating setting ~p to ~p", [Key, Val]),
- case lists:keyreplace(Key, 1, Acc0, New) of
- Acc0 ->
- [New|Acc0];
- Acc ->
- Acc
- end
- end,
- Env = lists:foldr(F1, Env0, Opts),
- ?DBG("snmp_app_env_init -> Env: ~p",[Env]),
- F2 = fun({Key,Val}) ->
- ?DBG("snmp_app_env_init -> setting ~p to ~p",[Key, Val]),
- application_controller:set_env(snmp, Key, Val)
- end,
- lists:foreach(F2, Env).
-
-
-
-
-%% Test if application is running
-mnesia_running() -> ?IS_MNESIA_RUNNING().
-crypto_running() -> ?IS_CRYPTO_RUNNING().
-
-
-start_sub(Dir) ->
- ?DBG("start_sub -> entry",[]),
- Opts = [{db_dir, Dir},
- {supervisor, [{verbosity, trace}]}],
- %% BMK BMK
-% {ok, P} = snmp_supervisor:start_sub(Dir),
- {ok, P} = snmpa_supervisor:start_sub_sup(Opts),
- unlink(P),
- {ok, {P, self()}}.
-
-create_tables(SaNode) ->
- ?line {atomic, ok} = mnesia:create_table([{name, friendsTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, kompissTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, snmp_variables},
- {attributes, [a1,a2]}]).
-
-delete_tables() ->
- mnesia:delete_table(friendsTable2),
- mnesia:delete_table(kompissTable2),
- mnesia:delete_table(snmp_variables).
-
-%% Creation is done in runtime!
-delete_mib_storage_mnesia_tables() ->
- mnesia:delete_table(snmpa_mib_data),
- mnesia:delete_table(snmpa_mib_tree),
- mnesia:delete_table(snmpa_symbolic_store).
-
-%%-----------------------------------------------------------------
-%% A test case is always one of:
-%% - v1 specific case
-%% - v2 specific case
-%% - v1 and v2 case
-%% All v1 specific cases are prefixed with v1_, and all v2 with
-%% v2_. E.g. v1_trap/v2_trap.
-%%
-%% All other cases are shared. However, the testserver uses the name
-%% of the case to generate a file for that case. The same case cannot
-%% be used in different configurations in the same suite. Therefore
-%% all these functions exists in two variants, the base function
-%% <base>, and a second version <base>_2. There may be several
-%% versions as well, <base>_N.
-%%-----------------------------------------------------------------
-mib_storage(suite) -> [
- mib_storage_ets,
- mib_storage_dets,
- mib_storage_mnesia,
- mib_storage_size_check_ets,
- mib_storage_size_check_dets,
- mib_storage_size_check_mnesia,
- mib_storage_varm_dets,
- mib_storage_varm_mnesia
- ].
-
-mib_storage_ets(suite) -> {req, [], {conf, init_mib_storage_ets,
- mib_storage_ets_cases(),
- finish_mib_storage_ets}}.
-
-mib_storage_dets(suite) -> {req, [], {conf, init_mib_storage_dets,
- mib_storage_dets_cases(),
- finish_mib_storage_dets}}.
-
-mib_storage_mnesia(suite) -> {req, [], {conf, init_mib_storage_mnesia,
- mib_storage_mnesia_cases(),
- finish_mib_storage_mnesia}}.
-
-mib_storage_size_check_ets(suite) ->
- {req, [], {conf,
- init_size_check_mse,
- mse_size_check_cases(),
- finish_size_check_mse}}.
-
-mib_storage_size_check_dets(suite) ->
- {req, [], {conf,
- init_size_check_msd,
- msd_size_check_cases(),
- finish_size_check_msd}}.
-
-mib_storage_size_check_mnesia(suite) ->
- {req, [], {conf,
- init_size_check_msm,
- msm_size_check_cases(),
- finish_size_check_msm}}.
-
-mib_storage_varm_dets(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_dets,
- varm_mib_storage_dets_cases(),
- finish_varm_mib_storage_dets}}.
-
-mib_storage_varm_mnesia(suite) ->
- {req, [], {conf,
- init_varm_mib_storage_mnesia,
- varm_mib_storage_mnesia_cases(),
- finish_varm_mib_storage_mnesia}}.
-
-mib_storage_ets_cases() ->
- [
- mse_simple,
- mse_v1_processing,
- mse_big,
- mse_big2,
- mse_loop_mib,
- mse_api,
- mse_sa_register,
- mse_v1_trap,
- mse_sa_error,
- mse_next_across_sa,
- mse_undo,
- mse_standard_mib,
- mse_community_mib,
- mse_framework_mib,
- mse_target_mib,
- mse_notification_mib,
- mse_view_based_acm_mib,
- mse_sparse_table,
- mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
- [
- msd_simple,
- msd_v1_processing,
- msd_big,
- msd_big2,
- msd_loop_mib,
- msd_api,
- msd_sa_register,
- msd_v1_trap,
- msd_sa_error,
- msd_next_across_sa,
- msd_undo,
- msd_standard_mib,
- msd_community_mib,
- msd_framework_mib,
- msd_target_mib,
- msd_notification_mib,
- msd_view_based_acm_mib,
- msd_sparse_table,
- msd_me_of,
- msd_mib_of
- ].
-
-mib_storage_mnesia_cases() ->
- [
- msm_simple,
- msm_v1_processing,
- msm_big,
- msm_big2,
- msm_loop_mib,
- msm_api,
- msm_sa_register,
- msm_v1_trap,
- msm_sa_error,
- msm_next_across_sa,
- msm_undo,
- msm_standard_mib,
- msm_community_mib,
- msm_framework_mib,
- msm_target_mib,
- msm_notification_mib,
- msm_view_based_acm_mib,
- msm_sparse_table,
- msm_me_of,
- msm_mib_of
- ].
-
-mse_size_check_cases() ->
- [mse_size_check].
-
-msd_size_check_cases() ->
- [msd_size_check].
-
-msm_size_check_cases() ->
- [msm_size_check].
-
-varm_mib_storage_dets_cases() ->
- [msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
- [msm_varm_mib_start].
-
-init_mib_storage_ets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,ets},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- init_ms(Config, [MibStorage]).
-
-init_ms(Config, Opts) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts1 = [MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity|Opts],
- [{vsn, v1} | start_v1_agent(Config,Opts1)].
-
-init_size_check_mse(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, ets},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msd(Config) when list(Config) ->
- AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage, {dets, AgentDir}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msm(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, {mnesia,[]}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_ms(Config, Opts) when list(Config) ->
- SaNode = ?GCONF(snmp_sa, Config),
- %% We are using v3 here, so crypto must be supported or else...
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- create_tables(SaNode),
- AgentDir = ?GCONF(agent_dir, Config),
- MgrDir = ?GCONF(mgr_dir, Config),
- Ip = ?GCONF(ip, Config),
- ?line ok =
- config([v3], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_agent(Config, [v3], Opts)].
-
-init_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_dets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-init_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_mnesia -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-finish_mib_storage_ets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_ets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_dets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_dets -> entry", []),
- delete_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_size_check_mse(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msd(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msm(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_ms(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%% These are just interface functions to fool the test server
-mse_simple(X) -> simple(X).
-mse_v1_processing(X) -> v1_processing(X).
-mse_big(X) -> big(X).
-mse_big2(X) -> big2(X).
-mse_loop_mib(X) -> loop_mib(X).
-mse_api(X) -> api(X).
-mse_sa_register(X) -> sa_register(X).
-mse_v1_trap(X) -> v1_trap(X).
-mse_sa_error(X) -> sa_error(X).
-mse_next_across_sa(X) -> next_across_sa(X).
-mse_undo(X) -> undo(X).
-mse_standard_mib(X) -> snmp_standard_mib(X).
-mse_community_mib(X) -> snmp_community_mib(X).
-mse_framework_mib(X) -> snmp_framework_mib(X).
-mse_target_mib(X) -> snmp_target_mib(X).
-mse_notification_mib(X) -> snmp_notification_mib(X).
-mse_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-mse_sparse_table(X) -> sparse_table(X).
-mse_me_of(X) -> ms_me_of(X).
-mse_mib_of(X) -> ms_mib_of(X).
-
-msd_simple(X) -> simple(X).
-msd_v1_processing(X) -> v1_processing(X).
-msd_big(X) -> big(X).
-msd_big2(X) -> big2(X).
-msd_loop_mib(X) -> loop_mib(X).
-msd_api(X) -> api(X).
-msd_sa_register(X) -> sa_register(X).
-msd_v1_trap(X) -> v1_trap(X).
-msd_sa_error(X) -> sa_error(X).
-msd_next_across_sa(X) -> next_across_sa(X).
-msd_undo(X) -> undo(X).
-msd_standard_mib(X) -> snmp_standard_mib(X).
-msd_community_mib(X) -> snmp_community_mib(X).
-msd_framework_mib(X) -> snmp_framework_mib(X).
-msd_target_mib(X) -> snmp_target_mib(X).
-msd_notification_mib(X) -> snmp_notification_mib(X).
-msd_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msd_sparse_table(X) -> sparse_table(X).
-msd_me_of(X) -> ms_me_of(X).
-msd_mib_of(X) -> ms_mib_of(X).
-
-msm_simple(X) -> simple(X).
-msm_v1_processing(X) -> v1_processing(X).
-msm_big(X) -> big(X).
-msm_big2(X) -> big2(X).
-msm_loop_mib(X) -> loop_mib(X).
-msm_api(X) -> api(X).
-msm_sa_register(X) -> sa_register(X).
-msm_v1_trap(X) -> v1_trap(X).
-msm_sa_error(X) -> sa_error(X).
-msm_next_across_sa(X) -> next_across_sa(X).
-msm_undo(X) -> undo(X).
-msm_standard_mib(X) -> snmp_standard_mib(X).
-msm_community_mib(X) -> snmp_community_mib(X).
-msm_framework_mib(X) -> snmp_framework_mib(X).
-msm_target_mib(X) -> snmp_target_mib(X).
-msm_notification_mib(X) -> snmp_notification_mib(X).
-msm_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msm_sparse_table(X) -> sparse_table(X).
-msm_me_of(X) -> ms_me_of(X).
-msm_mib_of(X) -> ms_mib_of(X).
-
-
-mse_size_check(X) -> p("mse_size_check..."), ms_size_check(X).
-msd_size_check(X) -> p("msd_size_check..."), ms_size_check(X).
-msm_size_check(X) -> p("msm_size_check..."), ms_size_check(X).
-
-msd_varm_mib_start(X) -> p("msd_varm_mib_start..."), varm_mib_start(X).
-msm_varm_mib_start(X) -> p("msm_varm_mib_start..."), varm_mib_start(X).
-
-ms_size_check(suite) -> [];
-ms_size_check(Config) when list(Config) ->
- p("ms_size_check..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?LOG("mib server size check...", []),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMPv2-MIB"),
- ?line load_master_std("SNMPv2-TM"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMPv2-MIB"),
- ?line unload_master("SNMPv2-TM"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-
-varm_mib_start(suite) -> [];
-varm_mib_start(Config) when list(Config) ->
- p("varm_mib_start..."),
- ?LOG("varm_mib_start -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- %% Start the agent
- Opts = ?GCONF(agent_opts, Config),
- Config1 = start_v1_agent(Config, Opts),
-
- %% Sleep some in order for the agent to start properly
- ?DBG("varm_mib_start -> sleep some (before loading mobs)", []),
- ?SLEEP(5000),
-
- %% Load all the mibs
- HardwiredMibs = loaded_mibs(),
- ?DBG("varm_mib_start -> load all mibs", []),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
-
- %% Unload the hardwired mibs
- ?DBG("varm_mib_start -> sleep some (before unloading hardwired mibs)", []),
- ?SLEEP(1000),
- ?DBG("varm_mib_start -> unload (hardwired) mibs", []),
- ?line unload_mibs(HardwiredMibs), %% unload hardwired
-
- ?DBG("varm_mib_start -> sleep some (before stopping agent)", []),
- ?SLEEP(1000),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- Config2 = stop_agent(Config1),
-
- %% Sleep some in order for the agent to stop properly
- ?DBG("varm_mib_start -> sleep some (before re-starting the agent)", []),
- ?SLEEP(5000),
-
- %% Start the agent (again)
- ?DBG("varm_mib_start -> start the agent", []),
- Config3 = start_v1_agent(Config2, Opts),
-
- ?DBG("varm_mib_start -> sleep some (before starting tests)", []),
- ?SLEEP(5000),
-
- %% Perform the test(s)
- ?DBG("varm_mib_start -> perform the tests", []),
- try_test(snmp_community_mib),
- try_test(snmp_framework_mib),
- try_test(snmp_target_mib),
- try_test(snmp_notification_mib),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- stop_agent(Config3),
- ok.
-
-
--define(snmpTrapCommunity_instance, [1,3,6,1,6,3,18,1,4,0]).
--define(vacmViewSpinLock_instance, [1,3,6,1,6,3,16,1,5,1,0]).
--define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-ms_me_of(suite) -> [];
-ms_me_of(Config) when list(Config) ->
- p("ms_me_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_me_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = me_of(?snmpTrapCommunity_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = me_of(?vacmViewSpinLock_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = me_of(?usmStatsNotInTimeWindows_instance),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-me_of(Oid) ->
- case snmpa:me_of(Oid) of
- {ok, #me{oid = Oid}} ->
- ok;
- {ok, #me{oid = OtherOid}} ->
- case lists:reverse(Oid) of
- [0|Rest] ->
- case lists:reverse(Rest) of
- OtherOid ->
- ok;
- AnotherOid ->
- {error, {invalid_oid, Oid, AnotherOid}}
- end;
- _ ->
- {error, {invalid_oid, Oid, OtherOid}}
- end;
- {error, Reason} ->
- {error, Reason};
- Else ->
- {error, Else}
- end.
-
-
-ms_mib_of(suite) -> [];
-ms_mib_of(Config) when list(Config) ->
- p("ms_mib_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_mib_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = mib_of(?snmpTrapCommunity_instance, 'SNMP-COMMUNITY-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = mib_of(?vacmViewSpinLock_instance, 'SNMP-VIEW-BASED-ACM-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = mib_of(?usmStatsNotInTimeWindows_instance,
- 'SNMP-USER-BASED-SM-MIB'),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-mib_of(Oid, ExpectedMibName) ->
- ?DBG("mib_of -> entry with"
- "~n Oid: ~p"
- "~n ExpectedMibName: ~p", [Oid, ExpectedMibName]),
- %% case snmpa:mib_of(Oid) of
- MibOf = snmpa:mib_of(Oid),
- ?DBG("mib_of -> MibOf: ~n~p", [MibOf]),
- case MibOf of
- {ok, ExpectedMibName} ->
- ok;
- {ok, OtherMibName} ->
- {error, {invalid_mib, ExpectedMibName, OtherMibName}};
- {error, Reason} ->
- {error, Reason};
- Else ->
- ?DBG("mib_of -> Else: ~n~p", [Else]),
- {error, Else}
- end.
-
-
-app_info(suite) -> [];
-app_info(Config) when list(Config) ->
- SnmpDir = app_dir(snmp),
- SslDir = app_dir(ssl),
- CryptoDir = app_dir(crypto),
- Attr = snmp:module_info(attributes),
- AppVsn =
- case lists:keysearch(app_vsn, 1, Attr) of
- {value, {app_vsn, V}} ->
- V;
- false ->
- "undefined"
- end,
- io:format("Root dir: ~s~n"
- "SNMP: Application dir: ~s~n"
- " Application ver: ~s~n"
- "SSL: Application dir: ~s~n"
- "CRYPTO: Application dir: ~s~n",
- [code:root_dir(), SnmpDir, AppVsn, SslDir, CryptoDir]),
- ok.
-
-app_dir(App) ->
- case code:lib_dir(App) of
- D when list(D) ->
- filename:basename(D);
- {error, _Reason} ->
- "undefined"
- end.
-
-
-test_v1(suite) -> {req, [], {conf, init_v1, v1_cases(), finish_v1}}.
-
-%v1_cases() -> [loop_mib];
-v1_cases() ->
- [simple,
- db_notify_client,
- v1_processing, big, big2, loop_mib,
- api, subagent, mnesia, multiple_reqs,
- sa_register, v1_trap, sa_error, next_across_sa, undo, reported_bugs,
- standard_mibs, sparse_table, cnt_64,
- opaque,
- % opaque].
-
- change_target_addr_config].
-
-init_v1(Config) when list(Config) ->
- ?line SaNode = ?config(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v1} | start_v1_agent(Config)].
-
-finish_v1(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-test_v2(suite) -> {req, [], {conf, init_v2, v2_cases(), finish_v2}}.
-
-%v2_cases() -> [loop_mib_2];
-v2_cases() ->
- [simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2,
- multiple_reqs_2, sa_register_2, v2_trap, v2_inform, sa_error_2,
- next_across_sa_2, undo_2, reported_bugs_2, standard_mibs_2,
- v2_types, implied, sparse_table_2, cnt_64_2, opaque_2, v2_caps].
-
-init_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_v2_agent(Config)].
-
-finish_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-test_v1_v2(suite) -> {req, [], {conf, init_v1_v2, v1_v2_cases(), finish_v1_v2}}.
-
-v1_v2_cases() ->
- [simple_bi].
-
-init_v1_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v1,v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, bilingual} | start_bilingual_agent(Config)].
-
-finish_v1_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-test_v3(suite) -> {req, [], {conf, init_v3, v3_cases(), finish_v3}}.
-
-%v3_cases() -> [loop_mib_3];
-v3_cases() ->
- [simple_3, v3_processing,
- big_3, big2_3, api_3, subagent_3, mnesia_3, loop_mib_3,
- multiple_reqs_3, sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, reported_bugs_3, standard_mibs_3,
- v3_security,
- v2_types_3, implied_3, sparse_table_3, cnt_64_3, opaque_3, v2_caps_3].
-
-init_v3(Config) when list(Config) ->
- %% Make sure crypto works, otherwise start_agent will fail
- %% and we will be stuck with a bunch of mnesia tables for
- %% the rest of this suite...
- ?DBG("start_agent -> start crypto app",[]),
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v3], MgrDir, AgentDir,
- tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_v3_agent(Config)].
-
-finish_v3(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-test_multi_threaded(suite) -> {req, [], {conf, init_mt, mt_cases(), finish_mt}}.
-
-mt_cases() ->
- [multi_threaded, mt_trap].
-
-init_mt(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_multi_threaded_agent(Config)].
-
-finish_mt(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-%% This one *must* be run first in each case.
-init_case(Config) when list(Config) ->
- ?DBG("init_case -> entry with"
- "~n Config: ~p", [Config]),
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- MasterNode = node(),
-
- SaHost = ?HOSTNAME(SaNode),
- MgrHost = ?HOSTNAME(MgrNode),
- MasterHost = ?HOSTNAME(MasterNode),
- {ok, MasterIP} = snmp_misc:ip(MasterHost),
- {ok, MIP} = snmp_misc:ip(MgrHost),
- {ok, SIP} = snmp_misc:ip(SaHost),
-
-
- put(mgr_node, MgrNode),
- put(sa_node, SaNode),
- put(master_node, MasterNode),
- put(sa_host, SaHost),
- put(mgr_host, MgrHost),
- put(master_host, MasterHost),
- put(mip, tuple_to_list(MIP)),
- put(masterip , tuple_to_list(MasterIP)),
- put(sip, tuple_to_list(SIP)),
-
- MibDir = ?config(mib_dir, Config),
- put(mib_dir, MibDir),
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- put(std_mib_dir, StdM),
-
- MgrDir = ?config(mgr_dir, Config),
- put(mgr_dir, MgrDir),
-
- put(vsn, ?config(vsn, Config)),
- ?DBG("init_case -> exit with"
- "~n MasterNode: ~p"
- "~n SaNode: ~p"
- "~n MgrNode: ~p"
- "~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]),
- {SaNode, MgrNode, MibDir}.
-
-load_master(Mib) ->
- ?DBG("load_master -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(mib_dir) ++ Mib]).
-
-load_master_std(Mib) ->
- ?DBG("load_master_std -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(std_mib_dir) ++ Mib]).
-
-unload_master(Mib) ->
- ?DBG("unload_master -> entry with"
- "~n Mib: ~p", [Mib]),
- ok = snmpa:unload_mibs(snmp_master_agent, [Mib]).
-
-loaded_mibs() ->
- ?DBG("loaded_mibs -> entry",[]),
- Info = snmpa:info(snmp_master_agent),
- {value, {loaded_mibs, Mibs}} = lists:keysearch(loaded_mibs, 1, Info),
- [atom_to_list(Mib) || {Mib,_,_} <- Mibs].
-
-unload_mibs(Mibs) ->
- ?DBG("unload_mibs -> entry with"
- "~n Mibs: ~p", [Mibs]),
- ok = snmpa:unload_mibs(snmp_master_agent, Mibs).
-
-start_subagent(SaNode, RegTree, Mib) ->
- ?DBG("start_subagent -> entry with"
- "~n SaNode: ~p"
- "~n RegTree: ~p"
- "~n Mib: ~p", [SaNode, RegTree, Mib]),
- MA = whereis(snmp_master_agent),
- ?DBG("start_subagent -> MA: ~p", [MA]),
- MibDir = get(mib_dir),
- Mib1 = join(MibDir,Mib),
- %% BMK BMK
-% case rpc:call(SaNode,snmp_supervisor,start_subagent,[MA,RegTree,[Mib1]]) of
- case rpc:call(SaNode, snmpa_supervisor,
- start_sub_agent, [MA, RegTree, [Mib1]]) of
- {ok, SA} ->
- ?DBG("start_subagent -> SA: ~p", [SA]),
- {ok, SA};
- Error ->
- ?FAIL({subagent_start_failed, SaNode, Error, [MA, RegTree, Mib1]})
- end.
-
-stop_subagent(SA) ->
- ?DBG("stop_subagent -> entry with"
- "~n SA: ~p", [SA]),
- %% BNK BMK
- %% rpc:call(node(SA), snmp_supervisor, stop_subagent, [SA]).
- rpc:call(node(SA), snmpa_supervisor, stop_sub_agent, [SA]).
-
-%%-----------------------------------------------------------------
-%% This function takes care of the old OTP-SNMPEA-MIB.
-%% Unfortunately, the testcases were written to use the data in the
-%% internal tables, and these table are now obsolete and not used
-%% by the agent. Therefore, we emulate them by using
-%% OLD-SNMPEA-MIB, which uses the default impl. of all tables.
-%%
-%% These two rows must exist in intCommunityTable
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
-%% (But with the manager's IP address)
-%%
-%%-----------------------------------------------------------------
-init_old() ->
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [6 | "public"],
- {get(mip), "public", 2, 2}),
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [13 | "standard trap"],
- {get(mip), "standard trap", 2, 1}),
- snmpa_local_db:variable_set(intAgentIpAddress, [127,0,0,1]).
-
-
-
-simple(suite) -> [];
-simple(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(simple_standard_test).
-
-simple_2(X) -> simple(X).
-
-simple_bi(suite) -> [];
-simple_bi(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(vsn, v1), % First, try v1 manager
- try_test(simple_standard_test),
-
- put(vsn, v2), % Then, try v2 manager
- try_test(simple_standard_test).
-
-simple_3(X) ->
- simple(X).
-
-big(suite) -> [];
-big(Config) when list(Config) ->
- ?DBG("big -> entry", []),
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?DBG("big -> SA: ~p", [SA]),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-big_2(X) -> big(X).
-
-big_3(X) -> big(X).
-
-
-big2(suite) -> [];
-big2(Config) when list(Config) ->
- %% This is exactly the same tests as 'big', but with the
- %% v2 equivalent of the mibs.
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1-v2"),
- ?line load_master("OLD-SNMPEA-MIB-v2"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB-v2").
-
-big2_2(X) -> big2(X).
-
-big2_3(X) -> big2(X).
-
-
-multi_threaded(suite) -> [];
-multi_threaded(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(multi_threaded_test),
- ?line unload_master("Test1").
-
-mt_trap(suite) -> [];
-mt_trap(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- ?line load_master("TestTrapv2"),
- try_test(mt_trap_test, [MA]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("Test1").
-
-v2_types(suite) -> [];
-v2_types(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(types_v2_test),
- ?line unload_master("Test1").
-
-v2_types_3(X) -> v2_types(X).
-
-
-implied(suite) -> [];
-implied(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(implied_test,[MA]),
- ?line unload_master("Test1").
-
-implied_3(X) -> implied(X).
-
-
-sparse_table(suite) -> [];
-sparse_table(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(sparse_table_test),
- ?line unload_master("Test1").
-
-sparse_table_2(X) -> sparse_table(X).
-
-sparse_table_3(X) -> sparse_table(X).
-
-cnt_64(suite) -> [];
-cnt_64(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(cnt_64_test, [MA]),
- ?line unload_master("Test1").
-
-cnt_64_2(X) -> cnt_64(X).
-
-cnt_64_3(X) -> cnt_64(X).
-
-opaque(suite) -> [];
-opaque(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(opaque_test),
- ?line unload_master("Test1").
-
-opaque_2(X) -> opaque(X).
-
-opaque_3(X) -> opaque(X).
-
-
-change_target_addr_config(suite) -> [];
-change_target_addr_config(Config) when list(Config) ->
- p("Testing changing target address config..."),
- ?LOG("change_target_addr_config -> entry",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(sname,snmp_suite),
- put(verbosity,trace),
-
- MA = whereis(snmp_master_agent),
-
- ?LOG("change_target_addr_config -> load TestTrap",[]),
- ?line load_master("TestTrap"),
-
- ?LOG("change_target_addr_config -> set trace verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,trace),
-
- %% First send some traps that will arive att the original manager
- ?LOG("change_target_addr_config -> send trap",[]),
- try_test(ma_trap1, [MA]),
-
- ?LOG("change_target_addr_config -> set silence verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,silence),
-
- %% Start new dummy listener
- ?LOG("change_target_addr_config -> start dummy manager",[]),
- ?line {ok,Pid,NewPort} = dummy_manager_start(MA),
-
- %% Reconfigure
- ?LOG("change_target_addr_config -> reconfigure",[]),
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_addr_conf(AgentDir, NewPort),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- %% Send the trap again
- ?LOG("change_target_addr_config -> send trap again",[]),
- catch dummy_manager_send_trap2(Pid),
-
- ?LOG("change_target_addr_config -> await trap ack",[]),
- catch dummy_manager_await_trap2_ack(),
-
- ?LOG("change_target_addr_config -> stop dummy manager",[]),
- ?line ok = dummy_manager_stop(Pid),
-
- ?LOG("change_target_addr_config -> reset target address config",[]),
- ?line reset_target_addr_conf(AgentDir),
-
- ?LOG("change_target_addr_config -> unload TestTrap",[]),
- ?line unload_master("TestTrap").
-
-
-dummy_manager_start(MA) ->
- ?DBG("dummy_manager_start -> entry",[]),
- Pid = spawn(get(mgr_node), ?MODULE,dummy_manager_init,[self(),MA]),
- ?DBG("dummy_manager_start -> Pid: ~p",[Pid]),
- await_dummy_manager_started(Pid).
-
-await_dummy_manager_started(Pid) ->
- receive
- {dummy_manager_started,Pid,Port} ->
- ?DBG("dummy_manager_start -> acknowledge received with"
- "~n Port: ~p",[Port]),
- {ok,Pid,Port};
- {'EXIT', Pid, Reason} ->
- {error, Pid, Reason};
- O ->
- ?LOG("dummy_manager_start -> received unknown message:"
- "~n ~p",[O]),
- await_dummy_manager_started(Pid)
- end.
-
-dummy_manager_stop(Pid) ->
- ?DBG("dummy_manager_stop -> entry with Pid: ~p",[Pid]),
- Pid ! stop,
- receive
- {dummy_manager_stopping, Pid} ->
- ?DBG("dummy_manager_stop -> acknowledge received",[]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_stop -> timeout",[]),
- timeout
- end.
-
-dummy_manager_send_trap2(Pid) ->
- ?DBG("dummy_manager_send_trap2 -> entry",[]),
- Pid ! {send_trap,testTrap2}.
-
-dummy_manager_await_trap2_ack() ->
- ?DBG("dummy_manager_await_trap2 -> entry",[]),
- receive
- {received_trap,Trap} ->
- ?LOG("dummy_manager_await_trap2 -> received trap: ~p",[Trap]),
- %% Note:
- %% Without this sleep the v2_inform_i testcase failes! There
- %% is no relation between these two test cases as far as I
- %% able to figure out...
- sleep(60000),
- ok;
- O ->
- ?ERR("dummy_manager_await_trap2 -> unexpected message: ~p",[O]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_await_trap2 -> timeout",[]),
- timeout
- end.
-
-dummy_manager_init(Parent,MA) ->
- ?DBG("dummy_manager_init -> entry with"
- "~n Parent: ~p"
- "~n MA: ~p",[Parent,MA]),
- {ok,S} = gen_udp:open(0,[{recbuf,65535}]),
- ?DBG("dummy_manager_init -> S: ~p",[S]),
- {ok,Port} = inet:port(S),
- ?DBG("dummy_manager_init -> Port: ~p",[Port]),
- Parent ! {dummy_manager_started,self(),Port},
- dummy_manager_loop(Parent,S,MA).
-
-dummy_manager_loop(P,S,MA) ->
- ?LOG("dummy_manager_loop -> ready for receive",[]),
- receive
- {send_trap,Trap} ->
- ?LOG("dummy_manager_loop -> received trap send request"
- "~n Trap: ~p",[Trap]),
- snmpa:send_trap(MA, Trap, "standard trap"),
- dummy_manager_loop(P,S,MA);
- {udp, _UdpId, Ip, UdpPort, Bytes} ->
- ?LOG("dummy_manager_loop -> received upd message"
- "~n from: ~p:~p"
- "~n size: ~p",
- [Ip, UdpPort, dummy_manager_message_sz(Bytes)]),
- R = dummy_manager_handle_message(Bytes),
- ?DBG("dummy_manager_loop -> R: ~p",[R]),
- P ! R,
- dummy_manager_loop(P,S,MA);
- stop ->
- ?DBG("dummy_manager_loop -> received stop request",[]),
- P ! {dummy_manager_stopping, self()},
- gen_udp:close(S),
- exit(normal);
- O ->
- ?LOG("dummy_manager_loop -> received unknown message:"
- "~n ~p",[O]),
- dummy_manager_loop(P,S,MA)
- end.
-
-dummy_manager_message_sz(B) when binary(B) ->
- size(B);
-dummy_manager_message_sz(L) when list(L) ->
- length(L);
-dummy_manager_message_sz(_) ->
- undefined.
-
-dummy_manager_handle_message(Bytes) ->
- case (catch snmp_pdus:dec_message(Bytes)) of
- {'EXIT',Reason} ->
- ?ERR("dummy_manager_handle_message -> "
- "failed decoding message only:~n ~p",[Reason]),
- {error,Reason};
- M ->
- ?DBG("dummy_manager_handle_message -> decoded message:"
- "~n ~p",[M]),
- {received_trap,M}
- end.
-
-
-api(suite) -> [];
-api(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(api_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-api_2(X) -> api(X).
-
-api_3(X) -> api(X).
-
-
-subagent(suite) -> [];
-subagent(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- try_test(load_test_sa),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
-
- p("Loading previous subagent mib in master and testing..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(load_test),
-
- p("Unloading previous subagent mib in master and testing..."),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(unreg_test),
- p("Testing register subagent..."),
- rpc:call(SaNode, snmp, register_subagent,
- [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- ?line stop_subagent(SA),
- try_test(unreg_test).
-
-subagent_2(X) -> subagent(X).
-
-subagent_3(X) -> subagent(X).
-
-
-mnesia(suite) -> [];
-mnesia(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent with mnesia impl..."),
- {ok, SA} = start_subagent(SaNode, ?klas2, "Klas2"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- try_test(big_test_2),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA).
-
-mnesia_2(X) -> mnesia(X).
-
-mnesia_3(X) -> mnesia(X).
-
-
-multiple_reqs(suite) ->
- {req, [], {conf, init_mul, mul_cases(), finish_mul}}.
-
-mul_cases() ->
- [mul_get, mul_get_err, mul_next, mul_next_err, mul_set_err].
-
-multiple_reqs_2(suite) ->
- {req, [], {conf, init_mul, mul_cases_2(), finish_mul}}.
-
-multiple_reqs_3(_X) ->
- {req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-
-
-mul_cases_2() ->
- [mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2, mul_set_err_2].
-
-
-mul_cases_3() ->
- [mul_get_3, mul_get_err_3, mul_next_3, mul_next_err_3, mul_set_err_3].
-
-
-init_mul(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- [{mul_sub, SA} | Config].
-
-finish_mul(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- SA = ?config(mul_sub, Config),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA),
- lists:keydelete(mul_sub, 1, Config).
-
-mul_get(suite) -> [];
-mul_get(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get..."),
- try_test(do_mul_get).
-
-mul_get_2(X) -> mul_get(X).
-
-mul_get_3(X) -> mul_get(X).
-
-
-mul_get_err(suite) -> [];
-mul_get_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get with error..."),
- try_test(do_mul_get_err).
-
-mul_get_err_2(X) -> mul_get_err(X).
-
-mul_get_err_3(X) -> mul_get_err(X).
-
-
-mul_next(suite) -> [];
-mul_next(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next).
-
-mul_next_2(X) -> mul_next(X).
-
-mul_next_3(X) -> mul_next(X).
-
-
-mul_next_err(suite) -> [];
-mul_next_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next_err).
-
-mul_next_err_2(X) -> mul_next_err(X).
-
-mul_next_err_3(X) -> mul_next_err(X).
-
-
-mul_set(suite) -> [];
-mul_set(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set..."),
- try_test(do_mul_set).
-
-mul_set_2(X) -> mul_set(X).
-
-mul_set_3(X) -> mul_set(X).
-
-
-mul_set_err(suite) -> [];
-mul_set_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set with error..."),
- try_test(do_mul_set_err).
-
-mul_set_err_2(X) -> mul_set_err(X).
-
-mul_set_err_3(X) -> mul_set_err(X).
-
-
-sa_register(suite) -> [];
-sa_register(Config) when list(Config) ->
- ?DBG("sa_register -> entry", []),
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?DBG("sa_register -> start subagent", []),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
-
- ?DBG("sa_register -> unregister subagent", []),
- p("Testing unregister subagent (2)..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Loading SA-MIB..."),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:load_mibs(SA, [MibDir ++ "SA-MIB"]),
- ?DBG("sa_register -> register subagent", []),
- rpc:call(SaNode, snmp, register_subagent, [MA,?sa,SA]),
- try_test(sa_mib),
-
- ?DBG("sa_register -> stop subagent", []),
- ?line stop_subagent(SA).
-
-sa_register_2(X) -> sa_register(X).
-
-sa_register_3(X) -> sa_register(X).
-
-
-v1_trap(suite) -> [];
-v1_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_trap1, [MA]),
- try_test(ma_trap2, [MA]),
- try_test(ma_v2_2_v1_trap, [MA]),
- try_test(ma_v2_2_v1_trap2, [MA]),
-
- p("Testing trap sending from subagent..."),
- try_test(sa_trap1, [SA]),
- try_test(sa_trap2, [SA]),
- try_test(sa_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v2_trap(suite) -> [];
-v2_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
-
- try_test(ma_v2_trap1, [MA]),
- try_test(ma_v2_trap2, [MA]),
- try_test(ma_v1_2_v2_trap, [MA]),
- try_test(ma_v1_2_v2_trap2, [MA]),
-
- try_test(sa_mib),
- p("Testing trap sending from subagent..."),
- try_test(sa_v1_2_v2_trap1, [SA]),
- try_test(sa_v1_2_v2_trap2, [SA]),
- try_test(sa_v1_2_v2_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v3_trap(X) ->
- v2_trap(X).
-
-v2_inform(suite) ->
- {req, [], {conf, init_v2_inform, [v2_inform_i], finish_v2_inform}}.
-
-v3_inform(_X) ->
- %% v2_inform(X).
- {req, [], {conf, init_v3_inform, [v3_inform_i], finish_v3_inform}}.
-
-init_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-init_v3_inform(X) ->
- init_v2_inform(X).
-
-finish_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-finish_v3_inform(X) ->
- finish_v2_inform(X).
-
-
-
-v2_inform_i(suite) -> [];
-v2_inform_i(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing inform sending from master agent... NOTE! This test\ntakes a "
- "few minutes (5) to complete."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_v2_inform1, [MA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2").
-
-v3_inform_i(X) -> v2_inform_i(X).
-
-
-sa_error(suite) -> [];
-sa_error(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing sa bad value (is_set_ok)..."),
- try_test(sa_errs_bad_value),
-
- p("Testing sa gen err (set)..."),
- try_test(sa_errs_gen_err),
-
- p("Testing too big..."),
- try_test(sa_too_big),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- stop_subagent(SA).
-
-sa_error_2(X) -> sa_error(X).
-
-sa_error_3(X) -> sa_error(X).
-
-
-next_across_sa(suite) -> [];
-next_across_sa(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Loading another subagent mib..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas1"]),
-
- rpc:call(SaNode, snmp, register_subagent, [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- p("Testing next across subagent (endOfMibView from SA)..."),
- try_test(next_across_sa),
-
- p("Unloading mib"),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Starting another subagent"),
- ?line {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
- p("Testing next across subagent (wrong prefix from SA)..."),
- try_test(next_across_sa),
-
- stop_subagent(SA),
- stop_subagent(SA2).
-
-next_across_sa_2(X) -> next_across_sa(X).
-
-next_across_sa_3(X) -> next_across_sa(X).
-
-
-undo(suite) -> [];
-undo(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing undo phase at master agent..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas4"]),
- try_test(undo_test),
- try_test(api_test2),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas3"]),
-
- p("Testing bad return values from instrum. funcs..."),
- try_test(bad_return),
-
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas4"]),
-
- p("Testing undo phase at subagent..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas4"]),
- ?line ok = snmpa:register_subagent(MA, ?klas3, SA),
- ?line ok = snmpa:register_subagent(MA, ?klas4, SA),
- try_test(undo_test),
- try_test(api_test3),
-
- p("Testing undo phase across master/subagents..."),
- try_test(undo_test),
- try_test(api_test3),
- stop_subagent(SA).
-
-undo_2(X) -> undo(X).
-
-undo_3(X) -> undo(X).
-
-%% Req. Test2
-v1_processing(suite) -> [];
-v1_processing(Config) when list(Config) ->
- ?DBG("v1_processing -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v1_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v2_processing(suite) -> [];
-v2_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v3_processing(suite) -> [];
-v3_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc), % same as v2!
- ?line unload_master("Test2").
-
-
-%% We'll try get/set/trap and inform for all the auth & priv protocols.
-%% For informs, the mgr is auth-engine. The agent has to sync. This is
-%% accomplished by the first inform sent. That one will generate a
-%% report, which makes it in sync. The notification-generating
-%% application times out, and send again. This time it'll work.
-v3_security(suite) -> [v3_crypto_basic, v3_md5_auth, v3_sha_auth, v3_des_priv].
-
-v3_crypto_basic(suite) -> [];
-v3_crypto_basic(_Config) ->
- EID = [0,0,0,0,0,0,0,0,0,0,0,2],
- %% From rfc2274 appendix A.3.1
- ?line KMd5_1 = snmp:passwd2localized_key(md5, "maplesyrup", EID),
- ?line [16#52,16#6f,16#5e,16#ed,16#9f,16#cc,16#e2,16#6f,
- 16#89,16#64,16#c2,16#93,16#07,16#87,16#d8,16#2b] =
- KMd5_1,
- %% From rfc2274 appendix A.3.2
- ?line KSHA_1 = snmp:passwd2localized_key(sha, "maplesyrup", EID),
- ?line [16#66,16#95,16#fe,16#bc,16#92,16#88,16#e3,16#62,16#82,16#23,
- 16#5f,16#c7,16#15,16#1f,16#12,16#84,16#97,16#b3,16#8f,16#3f] =
- KSHA_1,
- %% From rfc2274, appendix A.5.1
- ?line KMd5_2 = snmp:passwd2localized_key(md5, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#88,16#05,16#61,16#51,16#41,16#67,16#6c,16#c9,
- 16#19,16#61,16#74,16#e7,16#42,16#a3,16#25,16#51] =
- snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- %% From rfc2274, appendix A.5.2
- ?line KSHA_2 = snmp:passwd2localized_key(sha, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#9c,16#10,16#17,16#f4,
- 16#fd,16#48,16#3d,16#2d,16#e8,16#d5,16#fa,16#db,
- 16#f8,16#43,16#92,16#cb,16#06,16#45,16#70,16#51] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2, 20,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- KSHA_1t = lists:sublist(KSHA_1, 16),
- KSHA_2t = lists:sublist(KSHA_2, 16),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#7e,16#f8,16#d8,16#a4,16#c9,16#cd,16#b2,16#6b,
- 16#47,16#59,16#1c,16#d8,16#52,16#ff,16#88,16#b5] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1t, KSHA_2t, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
-
- %% Try with correct random
- ?line Kc1 = snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2),
- ?line KMd5_2 = snmp_user_based_sm_mib:extract_new_key(md5, KMd5_1, Kc1),
- ?line Kc2 = snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2),
- ?line KSHA_2 = snmp_user_based_sm_mib:extract_new_key(sha, KSHA_1, Kc2),
- ok.
-
-
-
-v3_md5_auth(suite) -> [];
-v3_md5_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing MD5 authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authMD5", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authMD5"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_sha_auth(suite) -> [];
-v3_sha_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing SHA authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authSHA", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authSHA"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_des_priv(suite) -> [];
-v3_des_priv(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing DES encryption...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "privDES", authPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-%% -define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-%% Make sure mgr is in sync with agent
-v3_sync(Funcs) ->
- ?DBG("v3_sync -> entry with Funcs: ~p",[Funcs]),
- g([[sysDescr, 0]]),
- expect(432, report, [{?usmStatsNotInTimeWindows_instance, any}]),
- g([[sysDescr, 0]]),
- expect(433, [{[sysDescr,0], any}]),
- lists:foreach(fun({Func, Args}) -> apply(?MODULE, Func, Args) end, Funcs).
-
-v3_inform_sync(MA) ->
- ?DBG("v3_sync -> entry with MA: ~p => Send notification",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver,
- "standard inform", []),
- %% Make sure agent is in sync with mgr...
- ?DBG("v3_sync -> wait some time: ",[]),
- sleep(20000), % more than 1500*10 in target_addr.conf
- ?DBG("v3_sync -> await response",[]),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]).
-
-
-v2_caps(suite) -> [];
-v2_caps(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(v2_caps_i, [node()]).
-
-v2_caps_3(X) -> v2_caps(X).
-
-
-v2_caps_i(Node) ->
- ?line Idx = rpc:call(Node, snmp, add_agent_caps, [[1,2,3,4,5], "test cap"]),
- g([[sysORID, Idx], [sysORDescr, Idx]]),
- ?line expect(1, [{[sysORID, Idx], [1,2,3,4,5]},
- {[sysORDescr, Idx], "test cap"}]),
- ?line rpc:call(Node, snmp, del_agent_caps, [Idx]),
- g([[sysORID, Idx]]),
- ?line expect(2, [{[sysORID, Idx], noSuchInstance}]).
-
-
-%% Req. Test2
-v1_proc() ->
- ?DBG("v1_proc -> entry", []),
- %% According to RFC1157.
- %% Template: <Section>:<list no>
- v1_get_p(),
- v1_get_next_p(),
- v1_set_p().
-
-
-v1_get_p() ->
- %% 4.1.2:1
- g([[test2]]),
- ?line expect(10, noSuchName, 1, [{[test2], 'NULL'}]),
- g([[tDescr]]),
- ?line expect(11, noSuchName, 1, [{[tDescr], 'NULL'}]),
- g([[tDescr2,0]]),
- ?line expect(12, noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
- g([[tDescr3,0]]),
- ?line expect(131, noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
- g([[tDescr4,0]]),
- ?line expect(132, noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(14, noSuchName, 2, [{[sysDescr, 0], 'NULL'},
- {[tDescr,0], 'NULL'}]),
- g([[sysDescr,3]]),
- ?line expect(15, noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
-
- %% 4.1.2:2
- g([[tTable]]),
- ?line expect(20, noSuchName, 1, [{[tTable], 'NULL'}]),
- g([[tEntry]]),
- ?line expect(21, noSuchName, 1, [{[tEntry], 'NULL'}]),
-
- %% 4.1.2:3
- g([[tTooBig, 0]]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.2:4
- g([[tGenErr1, 0]]),
- ?line expect(40, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(41, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(42, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]).
-
-
-v1_get_next_p() ->
- %% 4.1.3:1
- gn([[1,3,7,1]]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
- gn([[tDescr2]]),
- ?line expect(11, tooBig, 0, any),
-
- %% 4.1.3:2
- gn([[tTooBig]]),
- io:format("We currently don't handle tooBig correct!!!\n"),
-% ?line expect(20, tooBig, 0, [{[tTooBig], 'NULL'}]),
- ?line expect(20, tooBig, 0, any),
-
- %% 4.1.3:3
- gn([[tGenErr1]]),
-% ?line expect(40, genErr, 1, [{[tGenErr1], 'NULL'}]),
- ?line expect(40, genErr, 1, any),
- gn([[tGenErr2]]),
-% ?line expect(41, genErr, 1, [{[tGenErr2], 'NULL'}]),
- ?line expect(41, genErr, 1, any),
- gn([[sysDescr], [tGenErr3]]),
-% ?line expect(42, genErr, 2, [{[sysDescr], 'NULL'},
-% {[tGenErr3], 'NULL'}]).
- ?line expect(42, genErr, 2, any).
-
-v1_set_p() ->
- %% 4.1.5:1
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(12, noSuchName, 1, [{[tDescr3,0], "read-only"}]),
- s([{[tDescr3], s, "noSuchObject"}]),
- ?line expect(13, noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
- s([{[tDescr3,1], s, "noSuchInstance"}]),
- ?line expect(14, noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
- s([{[tDescr2,0], s, "inconsistentName"}]),
- ?line expect(15, noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
-
- %% 4.1.5:2
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(20, badValue, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(21, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.1.5:3
- %% The standard is quite incorrect here. The resp pdu was too big. In
- %% the resp pdu, we have the original vbs. In the tooBig pdu we still
- %% have to original vbs => the tooBig pdu is too big as well!!! It
- %% may not get it to the manager, unless the agent uses 'NULL' instead
- %% of the std-like original value.
- s([{[tTooBig, 0], s, ?tooBigStr}]),
- %% according to std:
-% ?line expect(30, tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.5:4
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(40, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
- s([{[tDescr2, 0], s, "commit_fail"}]),
- ?line expect(41, genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
-
-%% Req. Test2
-v2_proc() ->
- %% According to RFC1905.
- %% Template: <Section>:<list no>
- ?DBG("v2_proc -> entry",[]),
- v2_get_p(),
- v2_get_next_p(),
- v2_get_bulk_p(),
- v2_set_p().
-
-v2_get_p() ->
- %% 4.2.1:2
- ?DBG("v2_get_p -> entry",[]),
- g([[test2]]),
- ?line expect(10, [{[test2], noSuchObject}]),
- g([[tDescr]]),
- ?line expect(11, [{[tDescr], noSuchObject}]),
- g([[tDescr4,0]]),
- ?line expect(12, [{[tDescr4,0], noSuchObject}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"},
- {[tDescr,0], noSuchObject}]),
- g([[tTable]]),
- ?line expect(14, [{[tTable], noSuchObject}]),
- g([[tEntry]]),
- ?line expect(15, [{[tEntry], noSuchObject}]),
-
- %% 4.2.1:3
- g([[tDescr2,0]]), %% instrum ret noSuchName!!!
- ?line expect(20, [{[tDescr2,0], noSuchInstance}]),
- g([[tDescr3,0]]),
- ?line expect(21, [{[tDescr3,0], noSuchInstance}]),
- g([[sysDescr,3]]),
- ?line expect(22, [{[sysDescr, 3], noSuchInstance}]),
- g([[tIndex,1]]),
- ?line expect(23, [{[tIndex, 1], noSuchInstance}]),
-
- %% 4.2.1 - any other error: genErr
- g([[tGenErr1, 0]]),
- ?line expect(30, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(31, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(32, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]),
-
- %% 4.2.1 - tooBig
- g([[tTooBig, 0]]),
- ?line expect(40, tooBig, 0, []).
-
-
-v2_get_next_p() ->
- %% 4.2.2:2
- ?DBG("v2_get_next_p -> entry",[]),
- gn([[1,3,7,1]]),
- ?line expect(10, [{[1,3,7,1], endOfMibView}]),
- gn([[sysDescr], [1,3,7,1]]),
- ?line expect(11, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gn([[tCnt2, 1]]),
- ?line expect(12, [{[tCnt2,2], 100}]),
- gn([[tCnt2, 2]]),
- ?line expect(12, [{[tCnt2,2], endOfMibView}]),
-
- %% 4.2.2 - any other error: genErr
- gn([[tGenErr1]]),
- ?line expect(20, genErr, 1, [{[tGenErr1], 'NULL'}]),
- gn([[tGenErr2]]),
- ?line expect(21, genErr, 1, [{[tGenErr2], 'NULL'}]),
- gn([[sysDescr], [tGenErr3]]),
- ?line expect(22, genErr, 2, [{[sysDescr], 'NULL'},
- {[tGenErr3], 'NULL'}]),
-
- %% 4.2.2 - tooBig
- gn([[tTooBig]]),
- ?line expect(20, tooBig, 0, []).
-
-v2_get_bulk_p() ->
- %% 4.2.3
- ?DBG("v2_get_bulk_p -> entry",[]),
- gb(1, 1, []),
- ?line expect(10, []),
- gb(-1, 1, []),
- ?line expect(11, []),
- gb(-1, -1, []),
- ?line expect(12, []),
- gb(-1, -1, []),
- ?line expect(13, []),
- gb(2, 0, [[sysDescr], [1,3,7,1]]),
- ?line expect(14, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(1, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(15, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(0, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(16, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(2, 2, [[sysDescr], [1,3,7,1], [sysDescr], [1,3,7,1]]),
- ?line expect(17, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(1, 2, [[sysDescr], [sysDescr], [tTooBig]]),
- ?line expect(18, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[sysDescr, 0], "Erlang SNMP agent"}]),
-
- gb(1,12, [[tDescr2], [sysDescr]]), % next one after tDescr2 is tTooBig.
- ?line expect(19, []),
-
- gb(2,2, [[sysDescr], [sysObjectID], [tGenErr1], [sysDescr]]),
- ?line expect(20, genErr, 3, [{[sysDescr], 'NULL'},
- {[sysObjectID], 'NULL'},
- {[tGenErr1], 'NULL'},
- {[sysDescr], 'NULL'}]),
- gb(0, 2, [[tCnt2, 1]]),
- ?line expect(21, [{[tCnt2,2], 100},
- {[tCnt2,2], endOfMibView}]).
-
-
-v2_set_p() ->
- %% 4.2.5:1
- ?DBG("v2_set_p -> entry",[]),
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noAccess, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noAccess, 1, [{[tDescr,0], "outside mibview"}]),
-
- %% 4.2.5:2
- s([{[1,3,6,1,0], s, "noSuchObject"}]),
- ?line expect(20, notWritable, 1, [{[1,3,6,1,0], "noSuchObject"}]),
-
- %% 4.2.5:3
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(30, wrongType, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(31, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.2.5:4
- s([{[tStr, 0], s, ""}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], ""}]),
- s([{[tStr, 0], s, "12345"}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], "12345"}]),
-
- %% 4.2.5:5 - N/A
-
- %% 4.2.5:6
- s([{[tInt1, 0], i, 0}]),
- ?line expect(60, wrongValue, 1, [{[tInt1, 0], 0}]),
- s([{[tInt1, 0], i, 5}]),
- ?line expect(61, wrongValue, 1, [{[tInt1, 0], 5}]),
- s([{[tInt2, 0], i, 0}]),
- ?line expect(62, wrongValue, 1, [{[tInt2, 0], 0}]),
- s([{[tInt2, 0], i, 5}]),
- ?line expect(63, wrongValue, 1, [{[tInt2, 0], 5}]),
- s([{[tInt3, 0], i, 5}]),
- ?line expect(64, wrongValue, 1, [{[tInt3, 0], 5}]),
-
- %% 4.2.5:7
- s([{[tDescrX, 1, 1], s, "noCreation"}]),
- ?line expect(70, noCreation, 1, [{[tDescrX, 1, 1], "noCreation"}]),
-
- %% 4.2.5:8
- s([{[tDescrX, 1, 2], s, "inconsistentName"}]),
- ?line expect(80, inconsistentName, 1,
- [{[tDescrX, 1, 2], "inconsistentName"}]),
-
- %% 4.2.5:9
- s([{[tCnt, 1, 2], i, 5}]),
- ?line expect(90, notWritable, 1, [{[tCnt, 1, 2], 5}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(90, notWritable, 1, [{[tDescr3,0], "read-only"}]),
-
- %% 4.2.5:10
- s([{[tDescr2,0], s, "inconsistentValue"}]),
- ?line expect(100, inconsistentValue, 1,
- [{[tDescr2,0], "inconsistentValue"}]),
-
- %% 4.2.5:11
- s([{[tDescr2,0], s, "resourceUnavailable"}]),
- ?line expect(110, resourceUnavailable, 1,
- [{[tDescr2,0],"resourceUnavailable"}]),
-
- %% 4.2.5:12
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(120, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]).
-
- %% commitFailed and undoFailed is tested by the 'undo' case.
-
-
-%% Req. OLD-SNMPEA-MIB
-table_test() ->
- io:format("Testing simple get, next and set on communityTable...~n"),
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
- Key1c3 = [intCommunityViewIndex,get(mip),is("public")],
- Key2c3 = [intCommunityViewIndex,get(mip),is("standard trap")],
- Key1c4 = [intCommunityAccess,get(mip),is("public")],
- EndKey = [intCommunityEntry,[9],get(mip),is("public")],
- gn([[intCommunityEntry]]),
- ?line expect(7, [{Key1c3, 2}]),
- gn([[intCommunityTable]]),
- ?line expect(71, [{Key1c3, 2}]),
- gn([[community]]),
- ?line expect(72, [{Key1c3, 2}]),
- gn([[otpSnmpeaMIB]]),
- ?line expect(73, [{Key1c3, 2}]),
- gn([[ericsson]]),
- ?line expect(74, [{Key1c3, 2}]),
- gn([Key1c3]),
- ?line expect(8, [{Key2c3, 2}]),
- gn([Key2c3]),
- ?line expect(9, [{Key1c4, 2}]),
- gn([EndKey]),
- AgentIp = [intAgentIpAddress,0],
- ?line expect(10, [{AgentIp, any}]),
- g([Key1c3]),
- ?line expect(11, [{Key1c3, 2}]),
- g([EndKey]),
- ?line ?v1_2(expect(12, noSuchName, 1, any),
- expect(12, [{EndKey, noSuchObject}])),
-
- io:format("Testing row creation/deletion on communityTable...~n"),
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
- s([{NewKeyc5, ?createAndGo}]),
- ?line expect(14, ?v1_2(badValue, inconsistentValue), 1,any),
- s([{NewKeyc5, ?createAndGo}, {NewKeyc3, 2}, {NewKeyc4, 2}]),
- ?line expect(15, [{NewKeyc5, ?createAndGo},{NewKeyc3, 2}, {NewKeyc4, 2}]),
- g([NewKeyc4]),
- ?line expect(16, [{NewKeyc4, 2}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(17, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc4, 2}]),
- ?line expect(18, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc4, 2}]),
- s([{NewKeyc5, ?createAndWait}]),
- ?line expect(19, [{NewKeyc5, ?createAndWait}]),
- g([NewKeyc5]),
- ?line expect(20, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc4, 2}]),
- ?line expect(21, [{NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(22, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc3, 2}]),
- ?line expect(23, [{NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(24, [{NewKeyc5, ?notInService}]),
- s([{NewKeyc5, ?active}]),
- ?line expect(25, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(26, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc3, 3}]),
- ?line expect(27, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc3, 3}]),
- otp_1128().
-
-%% Req. system group
-simple_standard_test() ->
- ?DBG("simple_standard_test -> entry",[]),
- gn([[1,1]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3]]),
- ?line expect(11, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6]]),
- ?line expect(12, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1]]),
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2]]),
- ?line expect(14, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1]]),
- ?line expect(15, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1,1]]),
- ?line expect(16, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[sysDescr]]),
- ?line expect(17, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr,0]]),
- ?line expect(2, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr]]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{[sysDescr], noSuchObject}])),
- g([[1,6,7,0]]),
- ?line ?v1_2(expect(41, noSuchName, 1, any),
- expect(3, [{[1,6,7,0], noSuchObject}])),
- gn([[1,13]]),
- ?line ?v1_2(expect(4, noSuchName,1, any),
- expect(4, [{[1,13], endOfMibView}])),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
- g([[sysLocation, 0]]),
- ?line expect(6, [{[sysLocation, 0], "new_value"}]),
- io:format("Testing noSuchName and badValue...~n"),
- s([{[sysServices,0], 3}]),
- ?line expect(61, ?v1_2(noSuchName, notWritable), 1, any),
- s([{[sysLocation, 0], i, 3}]),
- ?line expect(62, ?v1_2(badValue, wrongType), 1, any),
- ?DBG("simple_standard_test -> done",[]),
- ok.
-
-%% This is run in the agent node
-db_notify_client(suite) -> [];
-db_notify_client(Config) when list(Config) ->
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("~n\tSaNode: ~p~n\tMgrNode: ~p~n\tMibDir: ~p",
- [SaNode,MgrNode,MibDir]),
- snmpa_local_db:register_notify_client(self(),?MODULE),
-
- %% This call (the manager) will issue to set operations, so
- %% we expect to receive to notify(insert) calls.
- try_test(db_notify_client_test),
-
- ?DBG("await first notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("first notify received",[]),ok
- end,
-
- ?DBG("await second notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("second notify received",[]),ok
- end,
-
- snmpa_local_db:unregister_notify_client(self()).
-
-
-%% This is run in the manager node
-db_notify_client_test() ->
- ?DBG("set first new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
-
- ?DBG("set second new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]).
-
-notify(Pid,What) ->
- ?DBG("notify(~p,~p) -> called",[Pid,What]),
- Pid ! {db_notify_test_reply,What}.
-
-
-%% Req: system group, OLD-SNMPEA-MIB, Klas1
-big_test() ->
- ?DBG("big_test -> testing simple next/get/set @ master agent...",[]),
- simple_standard_test(),
-
- ?DBG("big_test -> testing simple next/get/set @ subagent...",[]),
- gn([[klas1]]),
- ?line expect(1, [{[fname,0], ""}]),
- g([[fname,0]]),
- ?line expect(2, [{[fname,0], ""}]),
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[fname,0]]),
- ?line expect(4, [{[fname,0], "test set"}]),
-
- ?DBG("big_test -> "
- "testing next from last instance in master to subagent...",[]),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname,0], "test set"}]),
- s([{[fname,0], s, ""}]),
- ?line expect(52, [{[fname,0], ""}]),
-
- table_test(),
-
- ?DBG("big_test -> adding one row in subagent table",[]),
- _FTab = [friendsEntry],
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {[friendsEntry, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [friendsEntry, [3, 3]]]),
- ?line expect(7, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?active}]),
- s([{[friendsEntry, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry, [3, 3]], ?destroy}]),
-
- otp_1131(),
-
- ?DBG("big_test -> adding two rows in subagent table with special INDEX",
- []),
- s([{[kompissEntry, [1, 3]], s, "kompis3"},
- {[kompissEntry, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?createAndGo}]),
- g([[kompissEntry, [1, 3]],
- [kompissEntry, [2, 3]]]),
- ?line expect(10, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- gn([[kompissEntry, [1]],
- [kompissEntry, [2]]]),
- ?line expect(11, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- s([{[kompissEntry, [1, 2]], s, "kompis3"},
- {[kompissEntry, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry, [1, 1]],
- [kompissEntry, [2, 1]]]),
- ?line expect(13, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?active}]),
- s([{[kompissEntry, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry, [2, 3]], ?destroy}]),
- s([{[kompissEntry, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry, [2, 2]], ?destroy}]),
- ?DBG("big_test -> done",[]),
- ok.
-
-%% Req. system group, Klas2, OLD-SNMPEA-MIB
-big_test_2() ->
- p("Testing simple next/get/set @ master agent (2)..."),
- simple_standard_test(),
-
- p("Testing simple next/get/set @ subagent (2)..."),
- gn([[klas2]]),
- ?line expect(1, [{[fname2,0], ""}]),
- g([[fname2,0]]),
- ?line expect(2, [{[fname2,0], ""}]),
- s([{[fname2,0], s, "test set"}]),
- ?line expect(3, [{[fname2,0], "test set"}]),
- g([[fname2,0]]),
- ?line expect(4, [{[fname2,0], "test set"}]),
-
- otp_1298(),
-
- p("Testing next from last object in master to subagent (2)..."),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname2,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname2,0], "test set"}]),
-
- table_test(),
-
- p("Adding one row in subagent table (2)"),
- _FTab = [friendsEntry2],
- s([{[friendsEntry2, [2, 3]], s, "kompis3"},
- {[friendsEntry2, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?createAndGo}]),
- g([[friendsEntry2, [2, 3]],
- [friendsEntry2, [3, 3]]]),
- ?line expect(7, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?active}]),
- s([{[friendsEntry2, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry2, [3, 3]], ?destroy}]),
-
- p("Adding two rows in subagent table with special INDEX (2)"),
- s([{[kompissEntry2, [1, 3]], s, "kompis3"},
- {[kompissEntry2, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?createAndGo}]),
- g([[kompissEntry2, [1, 3]],
- [kompissEntry2, [2, 3]]]),
- ?line expect(10, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- gn([[kompissEntry2, [1]],
- [kompissEntry2, [2]]]),
- ?line expect(11, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- s([{[kompissEntry2, [1, 2]], s, "kompis3"},
- {[kompissEntry2, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry2, [1, 1]],
- [kompissEntry2, [2, 1]]]),
- ?line expect(13, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?active}]),
- s([{[kompissEntry2, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry2, [2, 3]], ?destroy}]),
- s([{[kompissEntry2, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry2, [2, 2]], ?destroy}]),
- ok.
-
-%% Req. Test1
-multi_threaded_test() ->
- p("Testing multi threaded agent..."),
- g([[multiStr,0]]),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(1, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "pelle"}]),
- ?line expect(2, [{[sysLocation, 0], "pelle"}]),
- Pid ! continue,
- ?line expect(3, [{[multiStr,0], "ok"}]),
-
- s([{[multiStr, 0], s, "block"}]),
- Pid2 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(4, [{[sysUpTime,0], any}]),
- g([[multiStr,0]]),
- Pid3 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(5, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "kalle"}]),
- Pid3 ! continue,
- ?line expect(6, [{[multiStr,0], "ok"}]),
- Pid2 ! continue,
- ?line expect(7, [{[multiStr,0], "block"}]),
- ?line expect(8, [{[sysLocation,0], "kalle"}]).
-
-%% Req. Test1, TestTrapv2
-mt_trap_test(MA) ->
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- snmpa:send_trap(MA, mtTrap, "standard trap"),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(2, [{[sysUpTime,0], any}]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- Pid ! continue,
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [2]},
- {[multiStr,0], "ok"}]).
-
-
-get_multi_pid() ->
- get_multi_pid(10).
-get_multi_pid(0) ->
- ?line ?FAIL(no_global_name);
-get_multi_pid(N) ->
- sleep(1000),
- case global:whereis_name(snmp_multi_tester) of
- Pid when pid(Pid) -> Pid;
- _ -> get_multi_pid(N-1)
- end.
-
-%% Req. Test1
-types_v2_test() ->
- p("Testing v2 types..."),
-
- s([{[bits1,0], 2#10}]),
- ?line expect(1, [{[bits1,0], ?str(2#10)}]),
- g([[bits1,0]]),
- ?line expect(2, [{[bits1,0], ?str(2#101)}]),
-
- s([{[bits2,0], 2#11000000110}]),
- ?line expect(3, [{[bits2,0], ?str(2#11000000110)}]),
- g([[bits2,0]]),
- ?line expect(4, [{[bits2,0], ?str(2#11000000110)}]),
-
- g([[bits3,0]]),
- ?line expect(50, genErr, 1, any),
-
- g([[bits4,0]]),
- ?line expect(51, genErr, 1, any),
-
- s([{[bits1,0], s, [2#10]}]),
- ?line expect(6, ?v1_2(badValue, wrongValue), 1, any),
-
- s([{[bits2,0], 2#11001001101010011}]),
- ?line expect(7, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%% Req. Test1
-implied_test(MA) ->
- ?LOG("implied_test -> start",[]),
- p("Testing IMPLIED..."),
-
- snmpa:verbosity(MA,trace),
- snmpa:verbosity(MA,trace),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = "apa",
- Idx2 = "qq",
- ?DBG("implied_test -> (send) create row 1 '~s' in table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?createAndGo}, {[testDescr, Idx1],s,"row 1"}]),
- ?line expect(1, [{[testStatus, Idx1], ?createAndGo},
- {[testDescr, Idx1], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?createAndGo}, {[testDescr, Idx2],s,"row 2"}]),
- ?line expect(2, [{[testStatus, Idx2], ?createAndGo},
- {[testDescr, Idx2], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr)",[]),
- gn([[testDescr]]),
- ?line expect(3, [{[testDescr,Idx1], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr) of row 1",[]),
- gn([[testDescr,Idx1]]),
- ?line expect(4, [{[testDescr,Idx2], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?destroy}]),
- ?line expect(5, [{[testStatus, Idx1], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?destroy}]),
- ?line expect(6, [{[testStatus, Idx2], ?destroy}]),
-
- %% Try the same in other table
- Idx3 = [1, "apa"],
- Idx4 = [1, "qq"],
- ?DBG("implied_test -> (send) create row 1 '~s' in table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?createAndGo}, {[testDescr2,Idx3],s,"row 1"}]),
- ?line expect(1, [{[testStatus2, Idx3], ?createAndGo},
- {[testDescr2, Idx3], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?createAndGo}, {[testDescr2,Idx4],s,"row 2"}]),
- ?line expect(2, [{[testStatus2, Idx4], ?createAndGo},
- {[testDescr2, Idx4], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr2)",[]),
- gn([[testDescr2]]),
- ?line expect(3, [{[testDescr2,Idx3], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr2) of row 1",[]),
- gn([[testDescr2,Idx3]]),
- ?line expect(4, [{[testDescr2,Idx4], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?destroy}]),
- ?line expect(5, [{[testStatus2, Idx3], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?destroy}]),
- ?line expect(6, [{[testStatus2, Idx4], ?destroy}]),
-
- snmpa:verbosity(MA,log),
-
- ?LOG("implied_test -> done",[]).
-
-
-
-%% Req. Test1
-sparse_table_test() ->
- p("Testing sparse table..."),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- s([{[sparseStatus, Idx1], i, ?createAndGo},
- {[sparseDescr, Idx1], s, "row 1"}]),
- ?line expect(1, [{[sparseStatus, Idx1], ?createAndGo},
- {[sparseDescr, Idx1], "row 1"}]),
- s([{[sparseStatus, Idx2], i, ?createAndGo},
- {[sparseDescr, Idx2], s, "row 2"}]),
- ?line expect(2, [{[sparseStatus, Idx2], ?createAndGo},
- {[sparseDescr, Idx2], "row 2"}]),
- ?v1_2(gn([[sparseIndex], [sparseDescr,Idx1], [sparseDescr,Idx2],
- [sparseStatus,Idx1], [sparseStatus,Idx2]]),
- gb(0,5,[[sparseIndex]])),
- ?line expect(3, [{[sparseDescr,Idx1], "row 1"},
- {[sparseDescr,Idx2], "row 2"},
- {[sparseStatus,Idx1], ?active},
- {[sparseStatus,Idx2], ?active},
- {[sparseStr,0], "slut"}]),
- % Delete the rows
- s([{[sparseStatus, Idx1], i, ?destroy}]),
- ?line expect(4, [{[sparseStatus, Idx1], ?destroy}]),
- s([{[sparseStatus, Idx2], i, ?destroy}]),
- ?line expect(5, [{[sparseStatus, Idx2], ?destroy}]).
-
-
-%% Req. Test1
-cnt_64_test(MA) ->
- ?LOG("start cnt64 test (~p)",[MA]),
- snmpa:verbosity(MA,trace),
- ?LOG("start cnt64 test",[]),
- p("Testing Counter64, and at the same time, RowStatus is not last column"),
-
- ?DBG("get cnt64",[]),
- g([[cnt64,0]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(1, noSuchName, 1, any),
- expect(1, [{[cnt64,0],18446744073709551615}])),
- ?DBG("get-next cnt64",[]),
- gn([[cnt64]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(2, [{[cnt64Str,0], "after cnt64"}]),
- expect(2, [{[cnt64,0],18446744073709551615}])),
- ?DBG("send cntTrap",[]),
- snmpa:send_trap(MA,cntTrap,"standard trap",[{sysContact,"pelle"},
- {cnt64, 10},
- {sysLocation, "here"}]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, trap, [test], 6, 1, [{[sysContact,0], "pelle"},
- {[sysLocation,0], "here"}]),
- expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [1]},
- {[sysContact,0], "pelle"},
- {[cnt64,0], 10},
- {[sysLocation,0], "here"}])),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- ?DBG("create row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(1, [{[cntStatus, Idx1], ?createAndGo}]),
- ?DBG("create row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(2, [{[cntStatus, Idx2], ?createAndGo}]),
-
- ?DBG("get-next (cntIndex)",[]),
- gn([[cntIndex]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, [{[cntStatus,Idx1], ?active}]),
- expect(3, [{[cntCnt,Idx1], 0}])),
- % Delete the rows
- ?DBG("delete row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(4, [{[cntStatus, Idx1], ?destroy}]),
- ?DBG("delete row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(5, [{[cntStatus, Idx2], ?destroy}]),
- catch snmpa:verbosity(MA,log),
- ?DBG("done",[]),
- ok.
-
-%% Req. Test1
-opaque_test() ->
- p("Testing Opaque datatype..."),
- g([[opaqueObj,0]]),
- ?line expect(1, [{[opaqueObj,0], "opaque-data"}]).
-
-%% Req. OLD-SNMPEA-MIB
-api_test(MaNode) ->
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [intAgentIpAddress]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp,
- oid_to_name, [OID]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [[1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int, [intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp,
- int_to_enum, ['RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['xxRowStatus', 1]),
- ?line case snmp:date_and_time() of
- List when list(List), length(List) == 8 -> ok;
- List when list(List), length(List) == 11 -> ok
- end.
-
-%% Req. Klas3
-api_test2() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]),
- g([[fname4,0]]),
- ?line expect(2, [{[fname4,0], 1}]).
-
-api_test3() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]).
-
-
-unreg_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[snmpInPkts, 0], any}]).
-
-load_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[fname,0], ""}]).
-
-%% Req. Klas1
-load_test_sa() ->
- gn([[?v1_2(sysServices,sysORLastChange), 0]]),
- ?line expect(1, [{[fname,0], any}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_get() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0], Key1c4, [fname,0],Key1c3,
- [sysName,0]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,0], "test"}]),
- g([[1,3,7,1], Key1c4, [sysDescr,0], [1,3,7,2], Key1c3, [sysDescr,0]]),
- ?line ?v1_2(expect(2, noSuchName, [1,4], any),
- expect(2, [{[1,3,7,1], noSuchObject},
- {Key1c4, 2},
- {[sysDescr,0], "Erlang SNMP agent"},
- {[1,3,7,2], noSuchObject},
- {Key1c3, 2},
- {[sysDescr,0], "Erlang SNMP agent"}])).
-
-%% Req. v1, system group, Klas1, OLD-SNMPEA-MIB, *ej* Klas3.
-do_mul_get_err() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0],Key1c4,[fname,0], Key1c3, [sysName,2]]),
- ?line ?v1_2(expect(1, noSuchName, 5, any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,2], noSuchInstance}])),
- g([[sysDescr,0],Key1c4,[fname3,0], Key1c3, [sysName,1]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname3,0], noSuchObject},
- {Key1c3, 2},
- {[sysName,1], noSuchInstance}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [fname],Key1c3s,[sysName]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2}, {[fname,0], "test set"},
- {Key1c3, 2}, {[sysName,0], "test"}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next_err() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [1,3,6,999], [fname],[1,3,90], Key1c3s,[sysName]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[1,3,6,999], endOfMibView},
- {[fname,0], "test set"},
- {[1,3,90], endOfMibView},
- {Key1c3, 2},
- {[sysName,0], "test"}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set() ->
- p("Adding one row in subagent table, and one in master table"),
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, [{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [sysLocation,0],
- [friendsEntry, [3, 3]]]),
- ?line expect(2, [{[friendsEntry, [2, 3]], "kompis3"},
- {[sysLocation,0], "new_value"},
- {[friendsEntry, [3, 3]], ?active}]),
- g([NewKeyc4]),
- ?line expect(3, [{NewKeyc4, 2}]),
- s([{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]),
- ?line expect(4, [{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- p("Adding one row in subagent table, and one in master table"),
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {NewKeyc3, 2},
- {[sysUpTime,0], 45}, % sysUpTime (readOnly)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, notWritable), 3, any),
- g([[friendsEntry, [2, 3]]]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{[friendsEntry, [2,3]], noSuchInstance}])),
- g([NewKeyc4]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB
-sa_mib() ->
- g([[sa, [2,0]]]),
- ?line expect(1, [{[sa, [2,0]], 3}]),
- s([{[sa, [1,0]], s, "sa_test"}]),
- ?line expect(2, [{[sa, [1,0]], "sa_test"}]).
-
-ma_trap1(MA) ->
- snmpa:send_trap(MA, testTrap2, "standard trap"),
- ?line expect(1, trap, [system], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]),
- snmpa:send_trap(MA, testTrap1, "standard trap"),
- ?line expect(2, trap, [1,2,3] , 1, 0, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]).
-
-ma_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap2(MA) ->
- snmpa:send_trap(MA,linkUp,"standard trap",[{ifIndex, [1], 1},
- {ifAdminStatus, [1], 1},
- {ifOperStatus, [1], 2}]),
- ?line expect(3, trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
- {[ifAdminStatus, 1], 1},
- {[ifOperStatus, 1], 2}]).
-
-sa_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(5, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "pelle"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(6, trap, [ericsson], 6, 2, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]}]).
-
-ma_v2_trap1(MA) ->
- ?DBG("ma_v2_traps -> entry with MA = ~p => "
- "send standard trap: testTrapv22",[MA]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_traps -> send standard trap: testTrapv21",[]),
- snmpa:send_trap(MA, testTrapv21, "standard trap"),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmp ++ [1]}]).
-
-ma_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"}]).
-
-%% Note: This test case takes a while... actually a couple of minutes.
-ma_v2_inform1(MA) ->
- ?DBG("ma_v2_inform -> entry with MA = ~p => "
- "send notification: testTrapv22",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver, "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag1, self()},
- "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag1, [_]} ->
- ok;
- {snmp_targets, tag1, Addrs1} ->
- ?line ?FAIL({bad_addrs, Addrs1})
- after
- 5000 ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag1, {got_response, _}} ->
- ok;
- {snmp_notification, tag1, {no_response, _}} ->
- ?line ?FAIL(no_response)
- after
- 20000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
-
- %%
- %% -- The rest is possibly erroneous...
- %%
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag2, self()},
- "standard inform", []),
- ?line expect(2, {inform, false},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag2, [_]} ->
- ok;
- {snmp_targets, tag2, Addrs2} ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag2) timeout",[]),
- ?line ?FAIL({bad_addrs, Addrs2})
- after
- 5000 ->
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag2, {got_response, _}} ->
- ?line ?FAIL(got_response);
- {snmp_notification, tag2, {no_response, _}} ->
- ok
- after
- 240000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag2) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end.
-
-
-ma_v1_2_v2_trap(MA) ->
- snmpa:send_trap(MA,linkDown,"standard trap",[{ifIndex, [1], 1}]),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmpTraps ++ [3]},
- {[ifIndex, 1], 1},
- {[snmpTrapEnterprise, 0], [1,2,3]}]).
-
-
-ma_v1_2_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"},
- {[snmpTrapEnterprise, 0], ?system}]).
-
-
-sa_v1_2_v2_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-sa_v1_2_v2_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]], "pelle"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-sa_v1_2_v2_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 2]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_bad_value() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 5}, % badValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, badValue, 2, any),
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 6}, % wrongValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, ?v1_2(badValue, wrongValue), 2, any),
- g([NewKeyc4]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_gen_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},{NewKeyc4, 2},
- {NewKeyc5, ?createAndGo}, {[sa, [3,0]], 5}]),
- ?line expect(1, genErr, 4, any),
-% The row might have been added; we don't know.
-% (as a matter of fact we do - it is added, because the agent
-% first sets its own vars, and then th SAs. Lets destroy it.
- s([{NewKeyc5, ?destroy}]),
- ?line expect(2, [{NewKeyc5, ?destroy}]).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_too_big() ->
- g([[sa, [4,0]]]),
- ?line expect(1, tooBig).
-
-%% Req. Klas1, system group, snmp group (v1/v2)
-next_across_sa() ->
- gn([[sysDescr],[klas1,5]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {[snmpInPkts, 0], any}]).
-
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]). -> noError
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]). -> {badValue, 2}
-%% snmp_test_mgr:s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]). -> {genErr, 2}
-%% Req. Klas3, Klas4
-undo_test() ->
- s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- ?line expect(1, [{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]),
- ?line expect(2, ?v1_2(badValue, inconsistentValue), 2, any),
- s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]),
- ?line expect(3, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]),
- ?line expect(4, ?v1_2(genErr, commitFailed), 1, any),
-% unfortunatly we don't know if we'll get undoFailed or commitFailed.
-% it depends on which order the agent traverses the varbind list.
-% s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]),
-% ?line expect(5, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]),
- ?line expect(6, genErr, 2, any).
-
-%% Req. Klas3, Klas4
-bad_return() ->
- g([[fStatus4,4],
- [fName4,4]]),
- ?line expect(4, genErr, 2, any),
- g([[fStatus4,5],
- [fName4,5]]),
- ?line expect(5, genErr, 1, any),
- g([[fStatus4,6],
- [fName4,6]]),
- ?line expect(6, genErr, 2, any),
- gn([[fStatus4,7],
- [fName4,7]]),
- ?line expect(7, genErr, 2, any),
- gn([[fStatus4,8],
- [fName4,8]]),
- ?line expect(8, genErr, 1, any),
- gn([[fStatus4,9],
- [fName4,9]]),
- ?line expect(9, genErr, 2, any).
-
-
-%%%-----------------------------------------------------------------
-%%% Test the implementation of standard mibs.
-%%% We should *at least* try to GET all variables, just to make
-%%% sure the instrumentation functions work.
-%%% Note that many of the functions in the standard mib is
-%%% already tested by the normal tests.
-%%%-----------------------------------------------------------------
-standard_mibs(suite) ->
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib,
- snmp_target_mib, snmp_notification_mib,
- snmp_view_based_acm_mib].
-
-standard_mibs_2(suite) ->
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2,
- snmp_target_mib_2, snmp_notification_mib_2,
- snmp_view_based_acm_mib_2].
-
-standard_mibs_3(suite) ->
- [snmpv2_mib_3,snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3].
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v1.
-%% o Test the counters and control objects in SNMP-STANDARD-MIB
-%%-----------------------------------------------------------------
-snmp_standard_mib(suite) -> [];
-snmp_standard_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?DBG("snmp_standard_mib -> std_mib_init", []),
- try_test(std_mib_init),
-
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- InBadVsns = try_test(std_mib_a),
- put(vsn, v2),
- ?DBG("snmp_standard_mib -> std_mib_read", []),
- try_test(std_mib_read),
- put(vsn, v1),
-
- ?DBG("snmp_standard_mib -> std_mib_b (~w)", [InBadVsns]),
- Bad = try_test(std_mib_b, [InBadVsns]),
- ?DBG("snmp_standard_mib -> std_mib_read (community: 'bad community')", []),
- try_test(std_mib_read, [], [{community, "bad community"}]),
- ?DBG("snmp_standard_mib -> std_mib_write (community: 'public')", []),
- try_test(std_mib_write, [], [{community, "public"}]),
- ?DBG("snmp_standard_mib -> std_mib_asn_err", []),
- try_test(std_mib_asn_err),
- ?DBG("snmp_standard_mib -> std_mib_c (~w)", [Bad]),
- try_test(std_mib_c, [Bad]),
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- try_test(standard_mib_a),
-
- ?DBG("snmp_standard_mib -> std_mib_finish", []),
- try_test(std_mib_finish),
- ?DBG("snmp_standard_mib -> std_mib_test_finish", []),
- try_test(standard_mib_test_finish, [], [{community, "bad community"}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_a() ->
- ?line [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
- ?line [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
- ?line OutPkts2 = OutPkts + 1,
- %% There are some more counters we could test here, but it's not that
- %% important, since they are removed from SNMPv2-MIB.
- ok.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_init() ->
- %% disable authentication failure traps. (otherwise w'd get many of
- %% them - this is also a test to see that it works).
- s([{[snmpEnableAuthenTraps,0], 2}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 2}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_finish() ->
- %% enable again
- s([{[snmpEnableAuthenTraps,0], 1}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 1}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_test_finish() ->
- %% force a authenticationFailure
- std_mib_write(),
- %% check that we got a trap
- ?line expect(2, trap, [1,2,3], 4, 0, []).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_read() ->
- ?DBG("std_mib_read -> entry", []),
- g([[sysUpTime,0]]), % try a bad <something>; msg dropped, no reply
- ?DBG("std_mib_read -> await timeout (i.e. no reply)", []),
- ?line expect(1, timeout). % make sure we don't get a trap!
-
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_write() ->
- ?DBG("std_mib_write -> entry", []),
- s([{[sysLocation, 0], "new_value"}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_asn_err() ->
- snmp_test_mgr:send_bytes([48,99,67,12,0,0,0,0,0,0,5]).
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v2 and v3.
-%% o Test the counters and control objects in SNMPv2-MIB
-%%-----------------------------------------------------------------
-snmpv2_mib_2(suite) -> [];
-snmpv2_mib_2(Config) when list(Config) ->
- ?LOG("snmpv2_mib_2 -> start",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?DBG("snmpv2_mib_2 -> standard mib init",[]),
- try_test(std_mib_init),
-
- ?DBG("snmpv2_mib_2 -> get number of (so far) bad versions",[]),
- InBadVsns = try_test(std_mib_a),
-
- ?DBG("snmpv2_mib_2 -> make a bad version read",[]),
- put(vsn, v1),
- try_test(std_mib_read),
-
- ?DBG("snmpv2_mib_2 -> bad version read",[]),
- put(vsn, v2),
- Bad = try_test(std_mib_b, [InBadVsns]),
-
- ?DBG("snmpv2_mib_2 -> read with bad community",[]),
- try_test(std_mib_read, [], [{community, "bad community"}]),
-
- ?DBG("snmpv2_mib_2 -> write with public community",[]),
- try_test(std_mib_write, [], [{community, "public"}]),
-
- ?DBG("snmpv2_mib_2 -> asn err",[]),
- try_test(std_mib_asn_err),
-
- ?DBG("snmpv2_mib_2 -> check counters",[]),
- try_test(std_mib_c, [Bad]),
-
- ?DBG("snmpv2_mib_2 -> get som counters",[]),
- try_test(snmpv2_mib_a),
-
- ?DBG("snmpv2_mib_2 -> enable auth traps, and await some",[]),
- try_test(std_mib_finish),
-
- ?DBG("snmpv2_mib_2 -> force auth failure, and await trap, "
- "then disable auth traps",[]),
- try_test(snmpv2_mib_test_finish, [], [{community, "bad community"}]),
-
- ?LOG("snmpv2_mib_2 -> done",[]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_3(suite) -> [];
-snmpv2_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- InBadVsns = try_test(std_mib_a),
- put(vsn, v1),
- try_test(std_mib_read),
- put(vsn, v3),
- _Bad = try_test(std_mib_b, [InBadVsns]),
- try_test(snmpv2_mib_a),
-
- try_test(std_mib_finish).
-
--define(authenticationFailure, [1,3,6,1,6,3,1,1,5,5]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_test_finish() ->
- %% force a authenticationFailure
- ?DBG("ma_v2_inform -> write to std mib",[]),
- std_mib_write(),
-
- %% check that we got a trap
- ?DBG("ma_v2_inform -> await trap",[]),
- ?line expect(2, v2trap, [{[sysUpTime,0], any},
- {[snmpTrapOID,0], ?authenticationFailure}]),
-
- %% and the the inform
- ?DBG("ma_v2_inform -> await inform",[]),
- ?line expect(2, {inform,true}, [{[sysUpTime,0], any},
- {[snmpTrapOID,0],?authenticationFailure}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_a() ->
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
-
- ?line [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
- InBadVsns.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_b(InBadVsns) ->
- ?line [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
- ?line InBadVsns2 = InBadVsns + 1,
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
- ?line [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
- get_req(4, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- {InBadCommunityNames, InBadCommunityUses, InASNErrs}.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_c({InBadCommunityNames, InBadCommunityUses, InASNErrs}) ->
- ?line [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
- get_req(1, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- ?line InBadCommunityNames2 = InBadCommunityNames + 1,
- ?line InBadCommunityUses2 = InBadCommunityUses + 1,
- ?line InASNErrs2 = InASNErrs + 1.
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_a() ->
- ?line [SetSerial] = get_req(2, [[snmpSetSerialNo,0]]),
- s([{[snmpSetSerialNo,0], SetSerial}, {[sysLocation, 0], "val2"}]),
- ?line expect(3, [{[snmpSetSerialNo,0], SetSerial},
- {[sysLocation, 0], "val2"}]),
- s([{[sysLocation, 0], "val3"}, {[snmpSetSerialNo,0], SetSerial}]),
- ?line expect(4, inconsistentValue, 2,
- [{[sysLocation, 0], "val3"},
- {[snmpSetSerialNo,0], SetSerial}]),
- ?line ["val2"] = get_req(5, [[sysLocation,0]]).
-
-
-%%-----------------------------------------------------------------
-%% o Bad community uses/name is tested already
-%% in SNMPv2-MIB and STANDARD-MIB.
-%% o Test add/deletion of rows.
-%%-----------------------------------------------------------------
-snmp_community_mib(suite) -> [];
-snmp_community_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- try_test(snmp_community_mib),
- ?line unload_master("SNMP-COMMUNITY-MIB").
-
-snmp_community_mib_2(X) -> snmp_community_mib(X).
-
-%% Req. SNMP-COMMUNITY-MIB
-snmp_community_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o Test engine boots / time
-%%-----------------------------------------------------------------
-snmp_framework_mib(suite) -> [];
-snmp_framework_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- try_test(snmp_framework_mib),
- ?line unload_master("SNMP-FRAMEWORK-MIB").
-
-snmp_framework_mib_2(X) -> snmp_framework_mib(X).
-
-snmp_framework_mib_3(suite) -> [];
-snmp_framework_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(snmp_framework_mib).
-
-
-%% Req. SNMP-FRAMEWORK-MIB
-snmp_framework_mib() ->
- ?line ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
- ?line [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
- sleep(5000),
- ?line [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
- if
- EngineTime+7 < EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- EngineTime+4 > EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- true -> ok
- end,
- ?line case get_req(4, [[snmpEngineBoots,0]]) of
- [Boots] when integer(Boots) -> ok;
- Else -> ?FAIL(Else)
- end,
- ok.
-
-%%-----------------------------------------------------------------
-%% o Test the counters
-%%-----------------------------------------------------------------
-snmp_mpd_mib_3(suite) -> [];
-snmp_mpd_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- UnknownPDUHs = try_test(snmp_mpd_mib_a),
- try_test(snmp_mpd_mib_b, [], [{context_engine_id, "bad engine"}]),
- try_test(snmp_mpd_mib_c, [UnknownPDUHs]).
-
-
-%% Req. SNMP-MPD-MIB
-snmp_mpd_mib_a() ->
- ?line [UnknownSecs, InvalidMsgs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0]]),
- Pdu = #pdu{type = 'get-request',
- request_id = 23,
- error_status = noError,
- error_index = 0,
- varbinds = []},
- SPdu = #scopedPdu{contextEngineID = "agentEngine",
- contextName = "",
- data = Pdu},
- ?line SPDUBytes = snmp_pdus:enc_scoped_pdu(SPdu),
- V3Hdr1 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [7],
- msgSecurityModel = 23, % bad sec model
- msgSecurityParameters = []},
- V3Hdr2 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [6], % bad flag combination
- msgSecurityModel = 3,
- msgSecurityParameters = []},
- Message1 = #message{version = 'version-3', vsn_hdr = V3Hdr1,
- data = SPDUBytes},
- Message2 = #message{version = 'version-3', vsn_hdr = V3Hdr2,
- data = SPDUBytes},
- ?line MsgBytes1 = snmp_pdus:enc_message_only(Message1),
- ?line MsgBytes2 = snmp_pdus:enc_message_only(Message2),
- snmp_test_mgr:send_bytes(MsgBytes1),
- snmp_test_mgr:send_bytes(MsgBytes2),
-
- ?line [UnknownSecs2, InvalidMsgs2, UnknownPDUHs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0],
- [snmpUnknownPDUHandlers, 0]]),
- ?line UnknownSecs2 = UnknownSecs + 1,
- ?line InvalidMsgs2 = InvalidMsgs + 1,
- UnknownPDUHs.
-
--define(snmpUnknownPDUHandlers_instance, [1,3,6,1,6,3,11,2,1,3,0]).
-snmp_mpd_mib_b() ->
- g([[sysUpTime,0]]),
- ?line expect(1, report, [{?snmpUnknownPDUHandlers_instance, any}]).
-
-
-snmp_mpd_mib_c(UnknownPDUHs) ->
- ?line [UnknownPDUHs2] = get_req(1, [[snmpUnknownPDUHandlers, 0]]),
- ?line UnknownPDUHs2 = UnknownPDUHs + 1.
-
-
-snmp_target_mib(suite) -> [];
-snmp_target_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-TARGET-MIB"),
- try_test(snmp_target_mib),
- ?line unload_master("SNMP-TARGET-MIB").
-
-snmp_target_mib_2(X) -> snmp_target_mib(X).
-
-snmp_target_mib_3(X) -> snmp_target_mib(X).
-
-snmp_target_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-snmp_notification_mib(suite) -> [];
-snmp_notification_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- try_test(snmp_notification_mib),
- ?line unload_master("SNMP-NOTIFICATION-MIB").
-
-snmp_notification_mib_2(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib_3(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o add/delete views and try them
-%% o try boundaries
-%%-----------------------------------------------------------------
-snmp_view_based_acm_mib(suite) -> [];
-snmp_view_based_acm_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master("Test2"),
- snmp_view_based_acm_mib(),
- ?line unload_master("Test2"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-snmp_view_based_acm_mib_2(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib_3(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib() ->
- snmpa:verbosity(net_if,trace),
- snmpa:verbosity(master_agent,trace),
- ?LOG("start snmp_view_based_acm_mib test",[]),
- %% The user "no-rights" is present in USM, and is mapped to security
- %% name 'no-rights", which is not present in VACM.
- %% So, we'll add rights for it, try them and delete them.
- %% We'll give "no-rights" write access to tDescr.0 and read access
- %% to tDescr2.0
- %% These are the options we'll use to the mgr
- Opts = [{user, "no-rights"}, {community, "no-rights"}],
- %% Find the valid secmodel, and one invalid secmodel.
- {SecMod, InvSecMod} =
- case get(vsn) of
- v1 -> {?SEC_V1, ?SEC_V2C};
- v2 -> {?SEC_V2C, ?SEC_USM};
- v3 -> {?SEC_USM, ?SEC_V1}
- end,
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Now, add a mapping from "no-rights" -> "no-rights-group"
- GRow1Status = [vacmSecurityToGroupStatus,[SecMod, 9,"no-rights"]],
- GRow1 =
- [{[vacmGroupName, [SecMod, 9,"no-rights"]], "no-rights-group"},
- {GRow1Status, ?createAndGo}],
- ?DBG("set '~p'",[GRow1]),
- ?line try_test(do_set, [GRow1]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create a mapping for another sec model, and make sure it dosn't
- %% give us access
- GRow2Status = [vacmSecurityToGroupStatus,[InvSecMod, 9,"no-rights"]],
- GRow2 = [{[vacmGroupName, [InvSecMod, 9, "no-rights"]], "initial"},
- {GRow2Status, ?createAndGo}],
-
- ?DBG("set '~p'",[GRow2]),
- ?line try_test(do_set, [GRow2]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [GRow2Status]),
-
- RVName = "rv_name",
- WVName = "wv_name",
-
- %% Access row
- ARow1Idx = [15 | "no-rights-group"] ++ [0, ?SEC_ANY, 1],
- ARow1Status = [vacmAccessStatus, ARow1Idx],
- ARow1 = [{[vacmAccessContextMatch, ARow1Idx], 1},
- {[vacmAccessReadViewName, ARow1Idx], RVName},
- {[vacmAccessWriteViewName, ARow1Idx], WVName},
- {ARow1Status, ?createAndGo}],
-
- %% This access row would give acces, if InvSecMod was valid.
- ARow2Idx = [15 | "no-rights-group"] ++ [0, InvSecMod, 1],
- ARow2Status = [vacmAccessStatus, ARow2Idx],
- ARow2 = [{[vacmAccessContextMatch, ARow2Idx], 1},
- {[vacmAccessReadViewName, ARow2Idx], "internet"},
- {[vacmAccessWriteViewName, ARow2Idx], "internet"},
- {ARow2Status, ?createAndGo}],
-
- ?line try_test(do_set, [ARow2]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [ARow2Status]),
-
-
- %% Add valid row
- ?line try_test(do_set, [ARow1]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create the view family
- VRow1Idx = mk_ln(RVName) ++ mk_ln(?xDescr), % object access
- VRow2Idx = mk_ln(RVName) ++ mk_ln(?xDescr2 ++ [0]), % instance access
- VRow3Idx = mk_ln(WVName) ++ mk_ln(?xDescr), % object access
- VRow4Idx = mk_ln(WVName) ++ mk_ln(?xDescr ++ [0]), % instance access
- VRow1Status = [vacmViewTreeFamilyStatus, VRow1Idx],
- VRow2Status = [vacmViewTreeFamilyStatus, VRow2Idx],
- VRow3Status = [vacmViewTreeFamilyStatus, VRow3Idx],
- VRow4Status = [vacmViewTreeFamilyStatus, VRow4Idx],
-
- ?line try_test(add_row, [VRow1Status]),
- ?line try_test(add_row, [VRow2Status]),
- ?line try_test(add_row, [VRow3Status]),
-
- %% We're supposed to have access now...
- ?line try_test(use_rights, [], Opts),
-
- %% Change Row3 to Row4
- ?line try_test(del_row, [VRow3Status]),
- ?line try_test(add_row, [VRow4Status]),
-
- %% We should still have access...
- ?line try_test(use_rights, [], Opts),
-
- %% Delete rows
- ?line try_test(del_row, [GRow1Status]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete rest of rows
- ?line try_test(del_row, [ARow1Status]),
- ?line try_test(del_row, [VRow1Status]),
- ?line try_test(del_row, [VRow2Status]),
- ?line try_test(del_row, [VRow4Status]),
-
- ?line try_test(use_no_rights, [], Opts),
- snmpa:verbosity(master_agent,log).
-
-do_set(Row) ->
- s(Row),
- expect(1, Row).
-
-add_row(RowStatus) ->
- s([{RowStatus, ?createAndGo}]),
- expect(1, [{RowStatus, ?createAndGo}]).
-
-del_row(RowStatus) ->
- s([{RowStatus, ?destroy}]),
- expect(1, [{RowStatus, ?destroy}]).
-
-
-
-use_no_rights() ->
- g([[xDescr,0]]),
- ?v1_2_3(expect(11, noSuchName, 1, any),
- expect(12, [{[xDescr,0], noSuchObject}]),
- expect(13, authorizationError, 1, any)),
- g([[xDescr2,0]]),
- ?v1_2_3(expect(21, noSuchName, 1, any),
- expect(22, [{[xDescr2,0], noSuchObject}]),
- expect(23, authorizationError, 1, any)),
- gn([[xDescr]]),
- ?v1_2_3(expect(31, noSuchName, 1, any),
- expect(32, [{[xDescr], endOfMibView}]),
- expect(33, authorizationError, 1, any)),
- s([{[xDescr,0], "tryit"}]),
- ?v1_2_3(expect(41, noSuchName, 1, any),
- expect(42, noAccess, 1, any),
- expect(43, authorizationError, 1, any)).
-
-
-use_rights() ->
- g([[xDescr,0]]),
- expect(1, [{[xDescr,0], any}]),
- g([[xDescr2,0]]),
- expect(2, [{[xDescr2,0], any}]),
- s([{[xDescr,0], "tryit"}]),
- expect(3, noError, 0, any),
- g([[xDescr,0]]),
- expect(4, [{[xDescr,0], "tryit"}]).
-
-mk_ln(X) ->
- [length(X) | X].
-
-%%-----------------------------------------------------------------
-%% o add/delete users and try them
-%% o test all secLevels
-%% o test all combinations of protocols
-%% o try bad ops; check counters
-%%-----------------------------------------------------------------
-snmp_user_based_sm_mib_3(suite) -> [];
-snmp_user_based_sm_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- _AgentDir = ?config(agent_dir, Config),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
-
- %% The newUser used here already has VACM access.
-
- %% Add a new user in the simplest way; just createAndGo
- try_test(v3_sync, [[{usm_add_user1, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new user
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey1 = snmp:passwd2localized_key(sha, "new sha password", "agentEngine"),
- DesKey1 = lists:sublist(ShaKey1, 16),
-
- %% Change the new user's keys - 1
- try_test(v3_sync, [[{usm_key_change1, [ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- MgrDir = ?config(mgr_dir, Config),
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey2 = snmp:passwd2localized_key(sha, "newer password", "agentEngine"),
- DesKey2 = lists:sublist(ShaKey2, 16),
-
- %% Change the new user's keys - 2
- ?line try_test(v3_sync,
- [[{usm_key_change2, [ShaKey1, DesKey1, ShaKey2, DesKey2]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- reset_usm_mgr(MgrDir),
- ?line rewrite_usm_mgr(MgrDir, ShaKey2, DesKey2),
- ?line load_master("Test2"),
- ?line try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Change the new user's keys - 3
- ?line try_test(v3_sync,
- [[{usm_key_change3, [ShaKey2, DesKey2, ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new keys
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Try some read requests
- ?line try_test(v3_sync, [[{usm_read, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Delete the new user
- ?line try_test(v3_sync, [[{usm_del_user, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try some bad requests
- ?line try_test(v3_sync, [[{usm_bad, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("SNMP-USER-BASED-SM-MIB").
-
--define(usmUserSecurityName, [1,3,6,1,6,3,15,1,2,2,1,3]).
-
-usm_add_user1() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
-usm_use_user() ->
- v2_proc().
-
-
-%% Change own public keys
-usm_key_change1(ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_shaxxxxxxxxxx",
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_desxxxxxx",
- DesKey),
- Vbs1 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change own private keys
-usm_key_change2(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change other's public keys
-usm_key_change3(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange}],
- s(Vbs1),
- ?line expect(1, noAccess, 1, any),
- Vbs2 = [{[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs2),
- ?line expect(2, noAccess, 1, any),
-
-
- Vbs3 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs3),
- ?line expect(1, Vbs3).
-
-usm_read() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ?line g([[usmUserSecurityName, NewRowIndex],
- [usmUserCloneFrom, NewRowIndex],
- [usmUserAuthKeyChange, NewRowIndex],
- [usmUserOwnAuthKeyChange, NewRowIndex],
- [usmUserPrivKeyChange, NewRowIndex],
- [usmUserOwnPrivKeyChange, NewRowIndex]]),
- ?line expect(1,
- [{[usmUserSecurityName, NewRowIndex], "newUser"},
- {[usmUserCloneFrom, NewRowIndex], [0,0]},
- {[usmUserAuthKeyChange, NewRowIndex], ""},
- {[usmUserOwnAuthKeyChange, NewRowIndex], ""},
- {[usmUserPrivKeyChange, NewRowIndex], ""},
- {[usmUserOwnPrivKeyChange, NewRowIndex], ""}]),
- ok.
-
-
-
-usm_del_user() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- Vbs1 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
--define(usmUserCloneFrom, [1,3,6,1,6,3,15,1,2,2,1,4]).
-
--define(usmNoAuthProtocol, [1,3,6,1,6,3,10,1,1,1]).
-
--define(usmHMACMD5AuthProtocol, [1,3,6,1,6,3,10,1,1,2]).
-
--define(usmHMACSHAAuthProtocol, [1,3,6,1,6,3,10,1,1,3]).
-
--define(usmNoPrivProtocol, [1,3,6,1,6,3,10,1,2,1]).
-
--define(usmDESPrivProtocol, [1,3,6,1,6,3,10,1,2,2]).
-
-usm_bad() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer1 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDOS"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer1},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, inconsistentName, 1, any),
-
- RowPointer2 = ?usmUserCloneFrom ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs2 = [{[usmUserCloneFrom, NewRowIndex], RowPointer2},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs2),
- ?line expect(2, wrongValue, 1, any),
-
- RowPointer3 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs3 = [{[usmUserCloneFrom, NewRowIndex], RowPointer3},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs3),
- ?line expect(3, Vbs3),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmNoAuthProtocol}]),
- ?line expect(4, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmHMACMD5AuthProtocol}]),
- ?line expect(5, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmDESPrivProtocol}]),
- ?line expect(6, wrongValue, 1, any),
- ?line s([{[usmUserPrivProtocol, NewRowIndex], ?usmHMACSHAAuthProtocol}]),
- ?line expect(7, wrongValue, 1, any),
-
- Vbs4 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs4),
- ?line expect(1, Vbs4),
-
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Loop through entire MIB, to make sure that all instrum. funcs
-%% works.
-%% Load all std mibs that are not loaded by default.
-%%-----------------------------------------------------------------
-loop_mib(suite) -> [];
-loop_mib(Config) when list(Config) ->
- ?LOG("loop_mib -> initiate case",[]),
- %% snmpa:verbosity(master_agent,debug),
- %% snmpa:verbosity(mib_server,info),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib -> load mib SNMP-COMMUNITY-MIB",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> load mib SNMP-MPD-MIB",[]),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> load mib SNMP-TARGET-MIB",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> load mib SNMP-NOTIFICATION-MIB",[]),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> load mib SNMP-FRAMEWORK-MIB",[]),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> load mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?DBG("loop_mib -> try",[]),
- try_test(loop_mib_1),
- ?DBG("loop_mib -> unload mib SNMP-COMMUNITY-MIB",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-MPD-MIB",[]),
- ?line unload_master("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-TARGET-MIB",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-NOTIFICATION-MIB",[]),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-FRAMEWORK-MIB",[]),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- %% snmpa:verbosity(master_agent,log),
- %% snmpa:verbosity(mib_server,silence),
- ?LOG("loop_mib -> done",[]).
-
-
-loop_mib_2(suite) -> [];
-loop_mib_2(Config) when list(Config) ->
- ?LOG("loop_mib_2 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_2 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_2 -> load mibs",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_2 -> unload mibs",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?LOG("loop_mib_2 -> done",[]).
-
-
-loop_mib_3(suite) -> [];
-loop_mib_3(Config) when list(Config) ->
- ?LOG("loop_mib_3 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_3 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_3 -> load mibs",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_3 -> unload mibs",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?LOG("loop_mib_3 -> done",[]).
-
-
-%% Req. As many mibs all possible
-loop_mib_1() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_1([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_1(Oid, N) ->
- ?DBG("loop_it_1 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_1 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_1 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_1(NOid, N+1);
- #pdu{type='get-response', error_status=noSuchName, error_index=1,
- varbinds=[_]} ->
- ?DBG("loop_it_1 -> done",[]),
- N;
-
- #pdu{type = Type, error_status = Err, error_index = Idx,
- varbinds = Vbs} ->
- exit({unexpected_pdu, ?LINE, Type, Err, Idx, Vbs})
- end.
-
-%% Req. As many mibs all possible
-loop_mib_2() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_2([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_2(Oid, N) ->
- ?DBG("loop_it_2 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid, value = endOfMibView}]} ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p",[NOid]),
- N;
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_2 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_2(NOid, N+1)
- end.
-
-
-%%%-----------------------------------------------------------------
-%%% Testing of reported bugs and other tickets.
-%%%-----------------------------------------------------------------
-
-reported_bugs(suite) ->
- [otp_1128, otp_1129, otp_1131, otp_1162,
- otp_1222, otp_1298, otp_1331, otp_1338,
- otp_1342, otp_2776, otp_2979, otp_3187, otp_3725].
-
-reported_bugs_2(suite) ->
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2].
-
-reported_bugs_3(suite) ->
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542].
-
-
-%% These are (ticket) test cases where the initiation has to be done
-%% individually.
-tickets(suite) ->
- [otp_4394].
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1128
-%% Slogan: Bug in handling of createAndWait set-requests.
-%%-----------------------------------------------------------------
-otp_1128(suite) -> [];
-otp_1128(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1128),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1128_2(X) -> otp_1128(X).
-
-otp_1128_3(X) -> otp_1128(X).
-
-otp_1128() ->
- io:format("Testing bug reported in ticket OTP-1128...~n"),
-
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
-
- s([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- ?line expect(28, [{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(29, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- ?line expect(30, [{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(31, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(32, [{NewKeyc5, ?destroy}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1129, OTP-1169
-%% Slogan: snmpa:int_to_enum crashes on bad oids
-%%-----------------------------------------------------------------
-otp_1129(suite) -> [];
-otp_1129(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- try_test(otp_1129_i, [node()]),
- ?line unload_master("Klas3").
-
-otp_1129_2(X) -> otp_1129(X).
-
-otp_1129_3(X) -> otp_1129(X).
-
-otp_1129_i(MaNode) ->
- io:format("Testing bug reported in ticket OTP-1129...~n"),
- false = rpc:call(MaNode, snmp, int_to_enum, [iso, 1]),
- false = rpc:call(MaNode, snmp, int_to_enum, [isox, 1]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1131
-%% Slogan: Agent crashes / erlang node halts if RowIndex in a
-%% setrequest is of bad type, e.g. an INDEX {INTEGER},
-%% and RowIdenx [3,2].
-%%-----------------------------------------------------------------
-otp_1131(suite) -> [];
-otp_1131(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas1"),
- try_test(otp_1131),
- ?line unload_master("Klas1").
-
-otp_1131_2(X) -> otp_1131(X).
-
-otp_1131_3(X) -> otp_1131(X).
-
-otp_1131() ->
- io:format("Testing bug reported in ticket OTP-1131...~n"),
- s([{[friendsEntry, [2, 3, 1]], s, "kompis3"},
- {[friendsEntry, [3, 3, 1]], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 2, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1162
-%% Slogan: snmp_agent can't handle wrongValue from instrum.func
-%%-----------------------------------------------------------------
-otp_1162(suite) -> [];
-otp_1162(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
- try_test(otp_1162),
- stop_subagent(SA).
-
-otp_1162_2(X) -> otp_1162(X).
-
-otp_1162_3(X) -> otp_1162(X).
-
-otp_1162() ->
- s([{[sa, [2,0]], 6}]), % wrongValue (i is_set_ok)
- ?line expect(1, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1222
-%% Slogan: snmp agent crash if faulty index is returned from instrum
-%%-----------------------------------------------------------------
-otp_1222(suite) -> [];
-otp_1222(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- ?line load_master("Klas4"),
- try_test(otp_1222),
- ?line unload_master("Klas3"),
- ?line unload_master("Klas4").
-
-otp_1222_2(X) -> otp_1222(X).
-
-otp_1222_3(X) -> otp_1222(X).
-
-otp_1222() ->
- io:format("Testing bug reported in ticket OTP-1222...~n"),
- s([{[fStatus4,1], 4}, {[fName4,1], 1}]),
- ?line expect(1, genErr, 0, any),
- s([{[fStatus4,2], 4}, {[fName4,2], 1}]),
- ?line expect(2, genErr, 0, any).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1298
-%% Slogan: Negative INTEGER values are treated as positive.
-%%-----------------------------------------------------------------
-otp_1298(suite) -> [];
-otp_1298(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1298),
- ?line unload_master("Klas2").
-
-otp_1298_2(X) -> otp_1298(X).
-
-otp_1298_3(X) -> otp_1298(X).
-
-otp_1298() ->
- io:format("Testing bug reported in ticket OTP-1298...~n"),
- s([{[fint,0], -1}]),
- ?line expect(1298, [{[fint,0], -1}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1331
-%% Slogan: snmp_generic should return noError when deleting non-ex row
-%%-----------------------------------------------------------------
-otp_1331(suite) -> [];
-otp_1331(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1331),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1331_2(X) -> otp_1331(X).
-
-otp_1331_3(X) -> otp_1331(X).
-
-otp_1331() ->
- NewKeyc5 = [intCommunityStatus,[127,32,0,0],is("test")],
- s([{NewKeyc5, ?destroy}]),
- ?line expect(1, [{NewKeyc5, ?destroy}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1338
-%% Slogan: snmp bug in initialisation of default values for mnesia tabs
-%%-----------------------------------------------------------------
-otp_1338(suite) -> [];
-otp_1338(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1338),
- ?line unload_master("Klas2").
-
-otp_1338_2(X) -> otp_1338(X).
-
-otp_1338_3(X) -> otp_1338(X).
-
-otp_1338() ->
- s([{[kStatus2, 7], i, ?createAndGo}]),
- ?line expect(1, [{[kStatus2, 7], ?createAndGo}]),
- g([[kName2, 7]]),
- ?line expect(2, [{[kName2, 7], "JJJ"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1342
-%% Slogan: default impl of snmp table can't handle bad index access,
-%% Set when INDEX is read-write gets into an infinite loop!
-%%-----------------------------------------------------------------
-otp_1342(suite) -> [];
-otp_1342(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas4"),
- try_test(otp_1342),
- ?line unload_master("Klas4").
-
-otp_1342_2(X) -> otp_1342(X).
-
-otp_1342_3(X) -> otp_1342(X).
-
-otp_1342() ->
- s([{[fIndex5, 1], i, 1},
- {[fName5, 1], i, 3},
- {[fStatus5, 1], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 3, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1366
-%% Slogan: snmp traps not sent to all managers
-%% Note: NYI! We need a way to tell the test server that we need
-%% mgrs on two different machines.
-%%-----------------------------------------------------------------
-otp_1366(suite) -> [];
-otp_1366(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1366),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1366_2(X) -> otp_1366(X).
-
-otp_1366_3(X) -> otp_1366(X).
-
-otp_1366() ->
- ?INF("NOT YET IMPLEMENTED", []),
- 'NYI'.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2776
-%% Slogan: snmp:validate_date_and_time() fails when time is 00:00
-%%-----------------------------------------------------------------
-otp_2776(suite) -> [];
-otp_2776(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_2776).
-
-otp_2776_2(X) -> otp_2776(X).
-
-otp_2776_3(X) -> otp_2776(X).
-
-otp_2776() ->
- io:format("Testing bug reported in ticket OTP-2776...~n"),
-
- Dt01_valid = [19,98,9,1,1,0,23,0,43,0,0],
- Dt02_valid = [19,98,9,1,0,0,0,0,43,0,0], % This is what is fixed: 00:00
- Dt03_valid = [19,98,2,28,1,0,23,0,43,0,0],
- Dt04_invalid = [19,98,2,29,1,0,23,0,43,0,0],
- Dt05_valid = [19,96,2,29,1,0,23,0,43,0,0],
- Dt06_valid = [20,0,2,29,1,0,23,0,43,0,0],
- Dt07_invalid = [19,96,2,30,1,0,23,0,43,0,0], % This is also fixed: 30/2
- Dt08_valid = [19,98,4,30,1,0,23,0,43,0,0],
- Dt09_invalid = [19,98,4,31,1,0,23,0,43,0,0], % This is also fixed: 31/4
- Dt10_invalid = [],
- Dt11_invalid = [kalle,hobbe],
- L = [{ 1, true, Dt01_valid},
- { 2, true, Dt02_valid},
- { 3, true, Dt03_valid},
- { 4, false, Dt04_invalid},
- { 5, true, Dt05_valid},
- { 6, true, Dt06_valid},
- { 7, false, Dt07_invalid},
- { 8, true, Dt08_valid},
- { 9, false, Dt09_invalid},
- {10, false, Dt10_invalid},
- {11, false, Dt11_invalid}],
-
- ?line ok = validate_dat(L).
-
-
-validate_dat(L) -> validate_dat(L,[]).
-
-validate_dat([],V) ->
- Fun = fun({_,X}) -> case X of
- ok -> false;
- _ -> true
- end
- end,
- validate_dat1( lists:reverse( lists:filter(Fun,V) ) );
-validate_dat([{Id,E,Dat}|T],V) ->
- validate_dat(T,[validate_dat2(Id,E,Dat) | V]).
-
-validate_dat1([]) -> ok;
-validate_dat1(L) -> {error,L}.
-
-validate_dat2(Id, E, Dat) ->
- Res = case {E,snmp:validate_date_and_time(Dat)} of
- {E,E} -> ok;
- {E,A} -> {E,A}
- end,
- {Id, Res}.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2979
-%% Slogan: get-next on more than 1 column in an empty table
-%% returns bad response.
-%%-----------------------------------------------------------------
-otp_2979(suite) -> [];
-otp_2979(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Test1"),
- ?line init_old(),
- try_test(otp_2979),
- ?line unload_master("Test1").
-
-otp_2979_2(X) -> otp_2979(X).
-
-otp_2979_3(X) -> otp_2979(X).
-
-otp_2979() ->
- gn([[sparseDescr], [sparseStatus]]),
- ?line expect(1, [{[sparseStr,0], "slut"},
- {[sparseStr,0], "slut"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3187
-%% Slogan: get-next on vacmAccessTable for colums > 5 returns
-%% endOfTable - should return value.
-%%-----------------------------------------------------------------
-otp_3187(suite) -> [];
-otp_3187(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- otp_3187(),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-otp_3187_2(X) -> otp_3187(X).
-
-otp_3187_3(X) -> otp_3187(X).
-
-otp_3187() ->
- ?line Elements =
- snmp_view_based_acm_mib:vacmAccessTable(get_next,[],[4,5,6]),
- lists:foreach(fun(E) ->
- ?line if E == endOfTable ->
- ?FAIL(endOfTable);
- true -> ok
- end
- end, Elements).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3542
-%% Slogan:
-%%-----------------------------------------------------------------
-otp_3542(suite) -> [];
-otp_3542(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_3542).
-
-otp_3542() ->
- io:format("SNMP v3 discovery...~n"),
- ?line Res = snmp_test_mgr:d(),
- io:format("SNMP v3 discovery result: ~p~n",[Res]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3725
-%% Slogan: Slow response time on snmpa:int_to_enum
-%%-----------------------------------------------------------------
-otp_3725(suite) -> [];
-otp_3725(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_3725_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req. OLD-SNMPEA-MIB
-otp_3725_test(MaNode) ->
- io:format("Testing feature requested in ticket OTP-3725...~n"),
- ?line rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
- ?line Db = rpc:call(MaNode,snmp,get_symbolic_store_db,[]),
- ?DBG("otp_3725_test -> Db = ~p",[Db]),
-
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [Db, intAgentIpAddress]),
- ?DBG("otp_3725_test -> name_to_oid for ~p: ~p",[intAgentIpAddress,OID]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp, oid_to_name,
- [Db,OID]),
- ?DBG("otp_3725_test -> oid_to_name for ~p: ~p",[OID,intAgentIpAddress]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [Db, intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [Db, [1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, 'RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'xxRowStatus', 1]),
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-4394
-%% Slogan: Target mib tag list check invalid
-%%-----------------------------------------------------------------
-
-
-otp_4394(suite) -> {req, [], {conf,
- init_otp_4394,
- [otp_4394_test],
- finish_otp_4394}}.
-
-init_otp_4394(Config) when list(Config) ->
- ?DBG("init_otp_4394 -> entry with"
- "~n Config: ~p", [Config]),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line otp_4394_config(AgentDir, MgrDir, Ip),
- MasterAgentVerbosity = {master_agent_verbosity, trace},
- NetIfVerbosity = {net_if_verbosity, trace},
- Opts = [MasterAgentVerbosity,NetIfVerbosity],
- [{vsn, v1} | start_v1_agent(Config,Opts)].
-
-otp_4394_config(AgentDir, MgrDir, Ip0) ->
- ?DBG("otp_4394_config -> entry with"
- "~n AgentDir: ~p"
- "~n MgrDir: ~p"
- "~n Ip0: ~p", [AgentDir, MgrDir, Ip0]),
- Vsn = [v1],
- Ip = tuple_to_list(Ip0),
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsn, Ip,
- ?TRAP_UDP, Ip, 4000,
- "OTP-4394 test"),
- ?line case update_usm(Vsn, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsn, MgrDir);
- false ->
- ?line ok
- end,
- C1 = {"a", "all-rights", "initial", "", "pc"},
- C2 = {"c", "secret", "secret_name", "", "secret_tag"},
- ?line write_community_conf(AgentDir, [C1, C2]),
- ?line update_vacm(Vsn, AgentDir),
- Ta1 = {"shelob v1",
- [134,138,177,177], 5000, 1500, 3, %% Använd Ip och modda
- "pc1",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [],
- 2048},
- Ta2 = {"bifur v1",
- [134,138,177,75], 5000, 1500, 3, %% Använd Ip
- "pc2",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [], 2048},
- ?line write_target_addr_conf(AgentDir, [Ta1, Ta2]),
- ?line write_target_params_conf(AgentDir, Vsn),
- ?line write_notify_conf(AgentDir),
- ok.
-
-
-
-finish_otp_4394(Config) when list(Config) ->
- ?DBG("finish_otp_4394 -> entry", []),
- C1 = stop_agent(Config),
- delete_files(C1),
- erase(mgr_node),
- lists:keydelete(vsn, 1, C1).
-
-otp_4394_test(suite) -> [];
-otp_4394_test(Config) ->
- ?DBG("otp_4394_test -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_4394_test1),
- ?DBG("otp_4394_test -> done", []),
- ok.
-
-otp_4394_test1() ->
- ?DBG("otp_4394_test1 -> entry", []),
- gn([[1,1]]),
- Res =
- case snmp_test_mgr:expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]) of
- %% {error, 1, {"?",[]}, {"~w",[timeout]}}
- {error, 1, _, {_, [timeout]}} ->
- ?DBG("otp_4394_test1 -> expected result: timeout", []),
- ok;
- Else ->
- Else
- end,
- ?DBG("otp_4394_test1 -> done with: ~p", [Res]),
- Res.
-
-
-%%%--------------------------------------------------
-%%% Used to test the standard mib with our
-%%% configuration.
-%%%--------------------------------------------------
-run(F, A, Opts) ->
- M = get(mib_dir),
- Dir = get(mgr_dir),
- User = snmp_misc:get_option(user, Opts, "all-rights"),
- SecLevel = snmp_misc:get_option(sec_level, Opts, noAuthNoPriv),
- EngineID = snmp_misc:get_option(engine_id, Opts, "agentEngine"),
- CtxEngineID = snmp_misc:get_option(context_engine_id, Opts, EngineID),
- Community = snmp_misc:get_option(community, Opts, "all-rights"),
- ?DBG("run -> start crypto app",[]),
- Crypto = ?CRYPTO_START(),
- ?DBG("run -> Crypto: ~p",[Crypto]),
- catch snmp_test_mgr:stop(), % If we had a running mgr from a failed case
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- ?DBG("run -> config:~n"
- "\tM: ~p~n"
- "\tDir: ~p~n"
- "\tUser: ~p~n"
- "\tSecLevel: ~p~n"
- "\tEngineID: ~p~n"
- "\tCtxEngineID: ~p~n"
- "\tCommunity: ~p~n"
- "\tStdM: ~p",
- [M,Dir,User,SecLevel,EngineID,CtxEngineID,Community,StdM]),
- case snmp_test_mgr:start([%% {agent, snmp_test_lib:hostname()},
- {packet_server_debug,true},
- {debug,true},
- {agent, get(master_host)},
- {agent_udp, 4000},
- {trap_udp, 5000},
- {recbuf,65535},
- quiet,
- get(vsn),
- {community, Community},
- {user, User},
- {sec_level, SecLevel},
- {engine_id, EngineID},
- {context_engine_id, CtxEngineID},
- {dir, Dir},
- {mibs, mibs(StdM, M)}]) of
- {ok, _Pid} ->
- Res = apply(?MODULE, F, A),
- catch snmp_test_mgr:stop(),
- Res;
- Err ->
- io:format("Error starting manager: ~p\n", [Err]),
- catch snmp_test_mgr:stop(),
- ?line exit({mgr_start, Err})
- end.
-
-
-mibs(StdMibDir,MibDir) ->
- [join(StdMibDir, ?v1_2("STANDARD-MIB.bin", "SNMPv2-MIB.bin")),
- join(MibDir, "OLD-SNMPEA-MIB.bin"),
- join(StdMibDir, "SNMP-FRAMEWORK-MIB"),
- join(StdMibDir, "SNMP-MPD-MIB"),
- join(StdMibDir, "SNMP-VIEW-BASED-ACM-MIB"),
- join(StdMibDir, "SNMP-USER-BASED-SM-MIB"),
- join(StdMibDir, "SNMP-TARGET-MIB"),
- join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
- join(MibDir, "Klas1.bin"),
- join(MibDir, "Klas2.bin"),
- join(MibDir, "Klas3.bin"),
- join(MibDir, "Klas4.bin"),
- join(MibDir, "SA-MIB.bin"),
- join(MibDir, "TestTrap.bin"),
- join(MibDir, "Test1.bin"),
- join(MibDir, "Test2.bin"),
- join(MibDir, "TestTrapv2.bin")].
-
-join(D,F) ->
- filename:join(D,F).
-
-%% string used in index
-is(S) -> [length(S) | S].
-
-try_test(Func) ->
- call(get(mgr_node), ?MODULE, run, [Func, [], []]).
-
-try_test(Func, A) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, []]).
-
-try_test(Func, A, Opts) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, Opts]).
-
-call(N,M,F,A) ->
- ?DBG("call -> entry with~n"
- " N: ~p~n"
- " M: ~p~n"
- " F: ~p~n"
- " A: ~p~n"
- " when~n"
- " get(): ~p",
- [N,M,F,A,get()]),
- spawn(N, ?MODULE, wait, [self(),get(),M,F,A]),
- receive
- {done, {'EXIT', Rn}, Loc} ->
- ?DBG("call -> returned ~p",[{done, {'EXIT', Rn}, Loc}]),
- put(test_server_loc, Loc),
- exit(Rn);
- {done, Ret, Zed} ->
- ?DBG("call -> returned ~p~n",[{done, Ret, Zed}]),
- Ret
- end.
-
-wait(From, Env, M, F, A) ->
- ?DBG("wait -> entry with ~n"
- "\tFrom: ~p~n"
- "\tEnv: ~p",[From,Env]),
- lists:foreach(fun({K,V}) -> put(K,V) end, Env),
- Rn = (catch apply(M, F, A)),
- ?DBG("wait -> Rn: ~n~p", [Rn]),
- From ! {done, Rn, get(test_server_loc)},
- exit(Rn).
-
-expect(A,B) -> ok = snmp_test_mgr:expect(A,B).
-expect(A,B,C) -> ok = snmp_test_mgr:expect(A,B,C).
-expect(A,B,C,D) -> ok = snmp_test_mgr:expect(A,B,C,D).
-expect(A,B,C,D,E,F) -> ok = snmp_test_mgr:expect(A,B,C,D,E,F).
-
-get_req(Id, Vars) ->
- ?DBG("get_req -> entry with~n"
- "\tId: ~p~n"
- "\tVars: ~p",[Id,Vars]),
- g(Vars),
- ?DBG("get_req -> await response",[]),
- {ok, Val} = snmp_test_mgr:get_response(Id, Vars),
- ?DBG("get_req -> response: ~p",[Val]),
- Val.
-
-get_next_req(Vars) ->
- ?DBG("get_next_req -> entry with Vars '~p', send request",[Vars]),
- gn(Vars),
- ?DBG("get_next_req -> await response",[]),
- Response = snmp_test_mgr:receive_response(),
- ?DBG("get_next_req -> response: ~p",[Response]),
- Response.
-
-
-
-start_node(Name) ->
- ?LOG("start_node -> entry with Name: ~p",[Name]),
- M = list_to_atom(?HOSTNAME(node())),
- ?DBG("start_node -> M: ~p",[M]),
- Pa = filename:dirname(code:which(?MODULE)),
- ?DBG("start_node -> Pa: ~p",[Pa]),
-
- Args = case init:get_argument('CC_TEST') of
- {ok, [[]]} ->
- " -pa /clearcase/otp/libraries/snmp/ebin ";
- {ok, [[Path]]} ->
- " -pa " ++ Path;
- error ->
- ""
- end,
- %% Do not use start_link!!! (the proc that calls this one is tmp)
- ?DBG("start_node -> Args: ~p~n",[Args]),
- A = Args ++ " -pa " ++ Pa,
- case (catch ?START_NODE(Name, A)) of
- {ok, Node} ->
- %% Tell the test_server to not clean up things it never started.
- ?DBG("start_node -> Node: ~p",[Node]),
- {ok, Node};
- Else ->
- ?ERR("start_node -> failed with(other): Else: ~p",[Else]),
- ?line ?FAIL(Else)
- end.
-
-
-stop_node(Node) ->
- ?LOG("stop_node -> Node: ~p",[Node]),
- rpc:cast(Node, erlang, halt, []).
-
-p(X) ->
- io:format(user, X++"\n", []).
-
-sleep(X) ->
- receive
- after
- X -> ok
- end.
-
-%%%-----------------------------------------------------------------
-%%% Configuration
-%%%-----------------------------------------------------------------
-config(Vsns, MgrDir, AgentDir, MIp, AIp) ->
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsns, MIp,
- ?TRAP_UDP, AIp, 4000,
- "test"),
- ?line case update_usm(Vsns, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsns, MgrDir);
- false ->
- ?line ok
- end,
- ?line update_community(Vsns, AgentDir),
- ?line update_vacm(Vsns, AgentDir),
- ?line write_target_addr_conf(AgentDir, MIp, ?TRAP_UDP, Vsns),
- ?line write_target_params_conf(AgentDir, Vsns),
- ?line write_notify_conf(AgentDir),
- ok.
-
-delete_files(Config) ->
- Dir = ?config(agent_dir, Config),
- {ok, List} = file:list_dir(Dir),
- lists:foreach(fun(FName) -> file:delete(filename:join(Dir, FName)) end,
- List).
-
-update_usm(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-update_usm_mgr(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-rewrite_usm_mgr(Dir, ShaKey, DesKey) ->
- ?line ok = file:rename(filename:join(Dir,"usm.conf"),
- filename:join(Dir,"usm.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),write),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- file:close(Fid).
-
-reset_usm_mgr(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"usm.old"),
- filename:join(Dir,"usm.conf")).
-
-
-update_community([v3], _Dir) -> ok;
-update_community(_, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{\"no-rights\",\"no-rights\",\"no-rights\",\"\",\"\"}.\n",
- []),
- file:close(Fid).
-
-
--define(tDescr_instance, [1,3,6,1,2,1,16,1,0]).
-update_vacm(_Vsn, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"vacm.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authMD5\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authSHA\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"privDES\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"newUser\",\"initial\"}.\n",[]),
- ok = io:format(Fid, "{vacmViewTreeFamily, \"internet\", "
- "~w, excluded, null}.\n", [?tDescr_instance]),
- file:close(Fid).
-
-
-vacm_ver(v1) -> v1;
-vacm_ver(v2) -> v2c;
-vacm_ver(v3) -> usm.
-
-
-write_community_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),write),
- ok = write_community_conf1(Fid, Confs),
- file:close(Fid).
-
-write_community_conf1(_, []) ->
- ok;
-write_community_conf1(Fid, [{ComIdx, ComName, SecName, CtxName, TransTag}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", \"~s\", \"~s\", \"~s\", \"~s\"}.~n",
- [ComIdx, ComName, SecName, CtxName, TransTag]),
- write_community_conf1(Fid, Confs).
-
-
-write_target_addr_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- ok = write_target_addr_conf1(Fid, Confs),
- file:close(Fid).
-
-
-write_target_addr_conf1(_, []) ->
- ok;
-write_target_addr_conf1(Fid,
- [{Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", ~w, ~w, ~w, ~w, \"~s\", \"~s\", \"~s\", ~w, ~w}.~n",
- [Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz]),
- write_target_addr_conf1(Fid, Confs).
-
-write_target_addr_conf(Dir, ManagerIp, UDP, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- lists:foreach(fun(Vsn) ->
- ok = io:format(Fid,
- "{\"~s\", ~w, ~w, 1500, 3, "
- "\"std_trap\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP, mk_param(Vsn)]),
- case Vsn of
- v1 -> ok;
- v2 ->
- ok = io:format(Fid,
- "{\"~s.2\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)]);
- v3 ->
- ok = io:format(Fid,
- "{\"~s.3\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\", "
- "\"mgrEngine\", [], 1024}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)])
- end
- end,
- Vsns),
- file:close(Fid).
-
-mk_param(v1) -> "target_v1";
-mk_param(v2) -> "target_v2";
-mk_param(v3) -> "target_v3".
-
-mk_ip([A,B,C,D], Vsn) ->
- io_lib:format("~w.~w.~w.~w ~w", [A,B,C,D,Vsn]).
-
-
-rewrite_target_addr_conf(Dir,NewPort) ->
- TAFile = filename:join(Dir, "target_addr.conf"),
- ?DBG("rewrite_target_addr_conf -> read target file info of address config file",[]),
- case file:read_file_info(TAFile) of
- {ok, _} -> ok;
- {error, R} -> ?ERR("failure reading file info of "
- "target address config file: ~p",[R]),
- ok
- end,
-
- ?line [TrapAddr|Addrs] =
- snmp_conf:read(TAFile,fun(R) -> rewrite_target_addr_conf1(R) end),
-
- ?DBG("rewrite_target_addr_conf -> TrapAddr: ~p",[TrapAddr]),
-
- NewAddrs = [rewrite_target_addr_conf2(NewPort,TrapAddr)|Addrs],
-
- ?DBG("rewrite_target_addr_conf -> NewAddrs: ~p",[NewAddrs]),
-
- ?line ok = file:rename(filename:join(Dir,"target_addr.conf"),
- filename:join(Dir,"target_addr.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
-
- ?line ok = rewrite_target_addr_conf3(Fid,NewAddrs),
-
- file:close(Fid).
-
-rewrite_target_addr_conf1(O) ->
- {ok,O}.
-
-rewrite_target_addr_conf2(NewPort,{Name,Ip,_Port,Timeout,Retry,
- "std_trap",EngineId}) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with std_trap",[]),
- {Name,Ip,NewPort,Timeout,Retry,"std_trap",EngineId};
-rewrite_target_addr_conf2(_NewPort,O) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with "
- "~n O: ~p",[O]),
- O.
-
-
-rewrite_target_addr_conf3(_,[]) -> ok;
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,
- ParamName,EngineId}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(1) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % ParamsName
- "\"~s\"}.", % EngineId
- [Name,Ip,Port,Timeout,Retry,ParamName,EngineId]),
- rewrite_target_addr_conf3(Fid,T);
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,TagList,
- ParamName,EngineId,TMask,MMS}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(2) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % TagList
- "\"~s\", " % ParamsName
- "\"~s\"," % EngineId
- "~p, " % TMask
- "~p}.", % MMS
- [Name,Ip,Port,Timeout,Retry,TagList,ParamName,
- EngineId,TMask,MMS]),
- rewrite_target_addr_conf3(Fid,T).
-
-reset_target_addr_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_addr.old"),
- filename:join(Dir,"target_addr.conf")).
-
-write_target_params_conf(Dir, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- lists:foreach(fun(Vsn) ->
- MP = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> v3
- end,
- SM = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> usm
- end,
- ok = io:format(Fid, "{\"target_~w\", ~w, ~w, "
- "\"all-rights\", noAuthNoPriv}.~n",
- [Vsn, MP, SM])
- end,
- Vsns),
- file:close(Fid).
-
-rewrite_target_params_conf(Dir, SecName, SecLevel) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.conf"),
- filename:join(Dir,"target_params.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- ?line ok = io:format(Fid, "{\"target_v3\", v3, usm, \"~s\", ~w}.~n",
- [SecName, SecLevel]),
- file:close(Fid).
-
-reset_target_params_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.old"),
- filename:join(Dir,"target_params.conf")).
-
-write_notify_conf(Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"notify.conf"),write),
- ok = io:format(Fid, "{\"standard trap\", \"std_trap\", trap}.~n", []),
- ok = io:format(Fid, "{\"standard inform\", \"std_inform\",inform}.~n", []),
- file:close(Fid).
-
-ver_to_trap_str([v1]) -> "v1";
-ver_to_trap_str([v2]) -> "v2";
-% default is to use the latest snmp version
-ver_to_trap_str([v1,v2]) -> "v2".
-
-
-
-write_view_conf(Dir) ->
- {ok, Fid} = file:open(a(Dir,"view.conf"),write),
- ok = io:format(Fid, "{2, [1,3,6], included, null}.~n", []),
- ok = io:format(Fid, "{2, ~w, excluded, null}.~n", [?tDescr_instance]),
- file:close(Fid).
-
-a(A,B) -> lists:append(A,B).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-copy_file(From, To) ->
- {ok, Bin} = file:read_file(From),
- ok = file:write_file(To, Bin).
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-display_memory_usage() ->
- Info = snmpa:info(snmp_master_agent),
- TreeSize = lists_key1search(tree_size_bytes, Info),
- ProcMem = lists_key1search(process_memory, Info),
- MibDbSize = lists_key1search([db_memory,mib], Info),
- NodeDbSize = lists_key1search([db_memory,node], Info),
- TreeDbSize = lists_key1search([db_memory,tree], Info),
- ?INF("Memory usage: "
- "~n Tree size: ~p"
- "~n Process memory size: ~p"
- "~n Mib db size: ~p"
- "~n Node db size: ~p"
- "~n Tree db size: ~p",
- [TreeSize, ProcMem, MibDbSize, NodeDbSize, TreeDbSize]).
-
-lists_key1search([], Res) ->
- Res;
-lists_key1search([Key|Keys], List) when atom(Key), list(List) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- lists_key1search(Keys, Val);
- false ->
- undefined
- end;
-lists_key1search(Key, List) when atom(Key) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- Val;
- false ->
- undefined
- end.
-
-
-regs() ->
- lists:sort(registered()).
diff --git a/lib/snmp/test/exp/snmp_agent_ms_test.erl b/lib/snmp/test/exp/snmp_agent_ms_test.erl
deleted file mode 100644
index 7c8967d302..0000000000
--- a/lib/snmp/test/exp/snmp_agent_ms_test.erl
+++ /dev/null
@@ -1,5636 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(snmp_agent_ms_test).
-
-%% TODO
-%% * Test fault-tolerance (kill master etc)
-%%
-
--compile(export_all).
-
--define(application, snmp).
-
--include_lib("kernel/include/file.hrl").
--include_lib("common_test/include/ct.hrl").
--include("snmp_test_lib.hrl").
--define(SNMP_USE_V3, true).
--include_lib("snmp/include/snmp_types.hrl").
-%% -include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl").
-
-
--define(klas1, [1,3,6,1,2,1,7]).
--define(klas2, [1,3,6,1,2,1,9]).
--define(klas3, [1,3,6,1,2,1,8,1]).
--define(klas4, [1,3,6,1,2,1,8,4]).
--define(sa, [1,3,6,1,4,1,193,2]).
--define(system, [1,3,6,1,2,1,1]).
--define(snmp, [1,3,6,1,2,1,11]).
--define(snmpTraps, [1,3,6,1,6,3,1,1,5]).
--define(ericsson, [1,3,6,1,4,1,193]).
--define(testTrap, [1,3,6,1,2,1,15,0]).
--define(xDescr, [1,3,6,1,2,1,17,1]).
--define(xDescr2, [1,3,6,1,2,1,17,2]).
-
--define(active, 1).
--define(notInService, 2).
--define(notReady, 3).
--define(createAndGo, 4).
--define(createAndWait, 5).
--define(destroy, 6).
-
--define(TRAP_UDP, 5000).
-
--define(tooBigStr, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").
-
--define(str(X), snmp_pdus:bits_to_str(X)).
-
--define(break(), begin io:format(user, "break at line ~w: pid: ~p\n",
- [?LINE, self()]),
- receive cont -> ok end
- end).
-
-
--import(snmp_test_mgr, [gn/1, g/1, s/1, gb/3]).
--define(v1_2(V1,V2),
- case get(vsn) of
- v1 -> V1;
- _ -> V2
- end).
-
--define(v1_2_3(V1,V2,V3),
- case get(vsn) of
- v1 -> V1;
- v2 -> V2;
- _ -> V3
- end).
-
-all() ->
-[cases()].
-
-groups() ->
- [{mib_storage, [],
- [{group, mib_storage_ets}, {group, mib_storage_dets},
- {group, mib_storage_mnesia},
- {group, mib_storage_size_check_ets},
- {group, mib_storage_size_check_dets},
- {group, mib_storage_size_check_mnesia},
- {group, mib_storage_varm_dets},
- {group, mib_storage_varm_mnesia}]},
- {mib_storage_ets, [], mib_storage_ets_cases()},
- {mib_storage_dets, [], mib_storage_dets_cases()},
- {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
- {mib_storage_size_check_ets, [],
- mse_size_check_cases()},
- {mib_storage_size_check_dets, [],
- msd_size_check_cases()},
- {mib_storage_size_check_mnesia, [],
- msm_size_check_cases()},
- {mib_storage_varm_dets, [],
- varm_mib_storage_dets_cases()},
- {mib_storage_varm_mnesia, [],
- varm_mib_storage_mnesia_cases()},
- {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
- {test_v1_v2, [], v1_v2_cases()},
- {test_v3, [], v3_cases()},
- {test_multi_threaded, [], mt_cases()},
- {multiple_reqs, [], mul_cases()},
- {multiple_reqs_2, [], mul_cases_2()},
- {v2_inform, [], [v2_inform_i]},
- {v3_security, [],
- [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
- v3_des_priv]},
- {standard_mibs, [],
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib, snmp_target_mib,
- snmp_notification_mib, snmp_view_based_acm_mib]},
- {standard_mibs_2, [],
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2, snmp_target_mib_2,
- snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
- {standard_mibs_3, [],
- [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
- {reported_bugs, [],
- [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
- otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
- otp_2979, otp_3187, otp_3725]},
- {reported_bugs_2, [],
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
- {reported_bugs_3, [],
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542]},
- {tickets, [], [{group, otp_4394}]},
- {otp_4394, [], [otp_4394_test]}].
-
-init_per_group(otp_4394, Config) ->
- init_otp_4394(Config);
-init_per_group(v2_inform, Config) ->
- init_v2_inform(Config);
-init_per_group(multiple_reqs_2, Config) ->
- init_mul(Config);
-init_per_group(multiple_reqs, Config) ->
- init_mul(Config);
-init_per_group(test_multi_threaded, Config) ->
- init_mt(Config);
-init_per_group(test_v3, Config) ->
- init_v3(Config);
-init_per_group(test_v1_v2, Config) ->
- init_v1_v2(Config);
-init_per_group(test_v2, Config) ->
- init_v2(Config);
-init_per_group(test_v1, Config) ->
- init_v1(Config);
-init_per_group(mib_storage_varm_mnesia, Config) ->
- init_varm_mib_storage_mnesia(Config);
-init_per_group(mib_storage_varm_dets, Config) ->
- init_varm_mib_storage_dets(Config);
-init_per_group(mib_storage_size_check_mnesia, Config) ->
- init_size_check_msm(Config);
-init_per_group(mib_storage_size_check_dets, Config) ->
- init_size_check_msd(Config);
-init_per_group(mib_storage_size_check_ets, Config) ->
- init_size_check_mse(Config);
-init_per_group(mib_storage_mnesia, Config) ->
- init_mib_storage_mnesia(Config);
-init_per_group(mib_storage_dets, Config) ->
- init_mib_storage_dets(Config);
-init_per_group(mib_storage_ets, Config) ->
- init_mib_storage_ets(Config);
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(otp_4394, Config) ->
- finish_otp_4394(Config);
-end_per_group(v2_inform, Config) ->
- finish_v2_inform(Config);
-end_per_group(multiple_reqs_2, Config) ->
- finish_mul(Config);
-end_per_group(multiple_reqs, Config) ->
- finish_mul(Config);
-end_per_group(test_multi_threaded, Config) ->
- finish_mt(Config);
-end_per_group(test_v3, Config) ->
- finish_v3(Config);
-end_per_group(test_v1_v2, Config) ->
- finish_v1_v2(Config);
-end_per_group(test_v2, Config) ->
- finish_v2(Config);
-end_per_group(test_v1, Config) ->
- finish_v1(Config);
-end_per_group(mib_storage_varm_mnesia, Config) ->
- finish_varm_mib_storage_mnesia(Config);
-end_per_group(mib_storage_varm_dets, Config) ->
- finish_varm_mib_storage_dets(Config);
-end_per_group(mib_storage_size_check_mnesia, Config) ->
- finish_size_check_msm(Config);
-end_per_group(mib_storage_size_check_dets, Config) ->
- finish_size_check_msd(Config);
-end_per_group(mib_storage_size_check_ets, Config) ->
- finish_size_check_mse(Config);
-end_per_group(mib_storage_mnesia, Config) ->
- finish_mib_storage_mnesia(Config);
-end_per_group(mib_storage_dets, Config) ->
- finish_mib_storage_dets(Config);
-end_per_group(mib_storage_ets, Config) ->
- finish_mib_storage_ets(Config);
-end_per_group(_GroupName, Config) ->
- Config.
-
-
-init_per_testcase(_Case, Config) when list(Config) ->
- Dog = test_server:timetrap(test_server:minutes(6)),
- [{watchdog, Dog}|Config].
-
-end_per_testcase(_Case, Config) when list(Config) ->
- Dog = ?config(watchdog, Config),
- test_server:timetrap_cancel(Dog),
- Config.
-
-cases() ->
- [
- app_info,
- {group, test_v1}, {group, test_v2},
- {group, test_v1_v2}, {group, test_v3},
- {group, test_multi_threaded}, {group, mib_storage},
- {group, tickets}
- ].
-
-
-%%%-----------------------------------------------------------------
-%%% The test case structure is as follows:
-%%%
-%%% init_all - starts mnesia,
-%%%
-%%% init_v1 - starts agent
-%%% simple
-%%% big - e.g. starts/stops subagent, load/unloads mibs
-%%% init_mul
-%%% mul_get
-%%% mul_set
-%%% <etc>
-%%% finish_mul
-%%% <etc>
-%%% finish_v1
-%%%
-%%% init_v2 - starts agent
-%%% finish_v2
-%%%
-%%% init_bilingual - starts agent
-%%% finish_bilingual
-%%%
-%%% finish_all
-%%%
-%%% There is still one problem with these testsuites. If one test
-%%% fails, it may not be possible to run some other cases, as it
-%%% may have e.g. created some row or loaded some table, that it
-%%% didn't undo (since it failed).
-%%%-----------------------------------------------------------------
-
-init_all(Config0) when list(Config0) ->
- ?LOG("init_all -> entry with"
- "~n Config0: ~p",[Config0]),
-
- %% --
- %% Fix config:
- %%
-
- DataDir0 = ?config(data_dir, Config0),
- DataDir1 = filename:split(filename:absname(DataDir0)),
- [_|DataDir2] = lists:reverse(DataDir1),
- DataDir3 = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),
- Config1 = lists:keydelete(data_dir, 1, Config0),
- Config = [{data_dir, DataDir3 ++ "/"}|Config1],
-
- %% --
- %% Start nodes
- %%
-
- ?line {ok, SaNode} = start_node(snmp_sa),
- ?line {ok, MgrNode} = start_node(snmp_mgr),
-
-
- %% --
- %% Create necessary files
- %%
-
- Dir = ?config(priv_dir, Config),
- ?DBG("init_all -> Dir ~p", [Dir]),
-
- DataDir = ?config(data_dir, Config),
- ?DBG("init_all -> DataDir ~p", [DataDir]),
-
- file:make_dir(MgrDir = filename:join(Dir, "mgr_dir/")),
- ?DBG("init_all -> MgrDir ~p", [MgrDir]),
-
- file:make_dir(AgentDir = filename:join(Dir, "agent_dir/")),
- ?DBG("init_all -> AgentDir ~p", [AgentDir]),
-
- file:make_dir(SaDir = filename:join(Dir, "sa_dir/")),
- ?DBG("init_all -> SaDir ~p", [SaDir]),
-
-
- %% --
- %% Start and initiate mnesia
- %%
-
- ?DBG("init_all -> load application mnesia", []),
- ?line ok = application:load(mnesia),
-
- ?DBG("init_all -> load application mnesia on node ~p", [SaNode]),
- ?line ok = rpc:call(SaNode, application, load, [mnesia]),
-
- ?DBG("init_all -> application mnesia: set_env dir",[]),
- ?line application_controller:set_env(mnesia, dir,
- filename:join(Dir, "Mnesia1")),
-
- ?DBG("init_all -> application mnesia: set_env dir on node ~p",[SaNode]),
- ?line rpc:call(SaNode, application_controller, set_env,
- [mnesia, dir, filename:join(Dir, "Mnesia2")]),
-
- ?DBG("init_all -> create mnesia schema",[]),
- ?line ok = mnesia:create_schema([SaNode, node()]),
-
- ?DBG("init_all -> start application mnesia",[]),
- ?line ok = application:start(mnesia),
-
- ?DBG("init_all -> start application mnesia on ~p",[SaNode]),
- ?line ok = rpc:call(SaNode, application, start, [mnesia]),
- Ip = ?LOCALHOST(),
- [{snmp_sa, SaNode},
- {snmp_mgr, MgrNode},
- {agent_dir, AgentDir ++ "/"},
- {mgr_dir, MgrDir ++ "/"},
- {sa_dir, SaDir ++ "/"},
- {mib_dir, DataDir},
- {ip, Ip} |
- Config].
-
-finish_all(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- stop_node(SaNode),
- stop_node(MgrNode),
- application:stop(mnesia).
-
-start_v1_agent(Config) when list(Config) ->
- start_agent(Config, [v1]).
-
-start_v1_agent(Config,Opts) when list(Config), list(Opts) ->
- start_agent(Config, [v1], Opts).
-
-start_v2_agent(Config) when list(Config) ->
- start_agent(Config, [v2]).
-
-start_v3_agent(Config) when list(Config) ->
- start_agent(Config, [v3]).
-
-start_bilingual_agent(Config) when list(Config) ->
- start_agent(Config, [v1,v2]).
-
-start_multi_threaded_agent(Config) when list(Config) ->
- start_agent(Config, [v2], [{snmp_multi_threaded, true}]).
-
-stop_agent(Config) when list(Config) ->
- ?LOG("stop_agent -> entry with"
- "~n Config: ~p",[Config]),
-
- {Sup, Par} = ?config(snmp_sup, Config),
- ?DBG("stop_agent -> attempt to stop (sup) ~p"
- "~n Sup: ~p"
- "~n Par: ~p",
- [Sup,
- (catch process_info(Sup)),
- (catch process_info(Par))]),
- stop_sup(Sup, Par),
-
- {Sup2, Par2} = ?config(snmp_sub, Config),
- ?DBG("stop_agent -> attempt to stop (sub) ~p"
- "~n Sup2: ~p"
- "~n Par2: ~p",
- [Sup2,
- (catch process_info(Sup2)),
- (catch process_info(Par2))]),
- stop_sup(Sup2, Par2),
-
- ?DBG("stop_agent -> done - now cleanup config", []),
- C1 = lists:keydelete(snmp_sup, 1, Config),
- lists:keydelete(snmp_sub, 1, C1).
-
-
-stop_sup(Pid, _) when node(Pid) == node() ->
- case (catch process_info(Pid)) of
- PI when list(PI) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- exit(Pid, kill),
- await_stopped(Pid, Ref);
- {'EXIT', _Reason} ->
- ?LOG("stop_sup -> ~p not running", [Pid]),
- ok
- end;
-stop_sup(Pid, _) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- ?LOG("stop_sup -> Ref: ~p", [Ref]),
- %% Pid ! {'EXIT', Parent, shutdown}, % usch
- exit(Pid, kill),
- await_stopped(Pid, Ref).
-
-await_stopped(Pid, Ref) ->
- receive
- {'DOWN', Ref, process, Pid, _Reason} ->
- ?DBG("received down message for ~p", [Pid]),
- ok
- after 10000 ->
- ?INF("await_stopped -> timeout for ~p",[Pid]),
- erlang:demonitor(Ref),
- ?FAIL({failed_stop,Pid})
- end.
-
-
-start_agent(Config, Vsn) ->
- start_agent(Config, Vsn, []).
-start_agent(Config, Vsn, Opts) ->
- ?LOG("start_agent -> entry (~p) with"
- "~n Config: ~p"
- "~n Vsn: ~p"
- "~n Opts: ~p",[node(), Config, Vsn, Opts]),
-
- ?line AgentDir = ?config(agent_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
-
- snmp_app_env_init(vsn_init(Vsn) ++
- [{audit_trail_log, read_write_log},
- {audit_trail_log_dir, AgentDir},
- {audit_trail_log_size, {10240, 10}},
- {force_config_reload, false},
- {snmp_agent_type, master},
- {snmp_config_dir, AgentDir},
- {snmp_db_dir, AgentDir},
- {snmp_local_db_auto_repair, true},
- {snmp_master_agent_verbosity, trace},
- {snmp_supervisor_verbosity, trace},
- {snmp_mibserver_verbosity, trace},
- {snmp_symbolic_store_verbosity, trace},
- {snmp_note_store_verbosity, trace},
- {snmp_net_if_verbosity, trace}],
- Opts),
-
-
- process_flag(trap_exit,true),
-
- {ok, AppSup} = snmp_app_sup:start_link(),
- unlink(AppSup),
- ?DBG("start_agent -> snmp app supervisor: ~p",[AppSup]),
-
- ?DBG("start_agent -> start master agent (old style)",[]),
- Sup = case (catch snmpa_app:start(normal)) of
- {ok, S} ->
- ?DBG("start_agent -> started, Sup: ~p",[S]),
- S;
-
- Else ->
- ?DBG("start_agent -> unknown result: ~n~p",[Else]),
- %% Get info about the apps we depend on
- MnesiaInfo = mnesia_running(),
- ?FAIL({start_failed,Else,MnesiaInfo})
- end,
-
- ?DBG("start_agent -> unlink from supervisor",[]),
- ?line unlink(Sup),
- ?line SaDir = ?config(sa_dir, Config),
- ?DBG("start_agent -> (rpc) start sub on ~p",[SaNode]),
- ?line {ok, Sub} = rpc:call(SaNode, ?MODULE, start_sub, [SaDir]),
- ?DBG("start_agent -> done",[]),
- ?line [{snmp_sup, {Sup, self()}}, {snmp_sub, Sub} | Config].
-
-
-vsn_init(Vsn) ->
- vsn_init([v1,v2,v3], Vsn, []).
-
-vsn_init([], _Vsn, Acc) ->
- Acc;
-vsn_init([V|Vsns], Vsn, Acc) ->
- case lists:member(V, Vsn) of
- true ->
- vsn_init(Vsns, Vsn, [{V, true}|Acc]);
- false ->
- vsn_init(Vsns, Vsn, [{V, false}|Acc])
- end.
-
-snmp_app_env_init(Env0, Opts) ->
- ?DBG("snmp_app_env_init -> unload snmp",[]),
- ?line application:unload(snmp),
- ?DBG("snmp_app_env_init -> load snmp",[]),
- ?line application:load(snmp),
- ?DBG("snmp_app_env_init -> initiate (snmp) application env",[]),
- F1 = fun({Key,Val} = New, Acc0) ->
- ?DBG("snmp_app_env_init -> "
- "updating setting ~p to ~p", [Key, Val]),
- case lists:keyreplace(Key, 1, Acc0, New) of
- Acc0 ->
- [New|Acc0];
- Acc ->
- Acc
- end
- end,
- Env = lists:foldr(F1, Env0, Opts),
- ?DBG("snmp_app_env_init -> Env: ~p",[Env]),
- F2 = fun({Key,Val}) ->
- ?DBG("snmp_app_env_init -> setting ~p to ~p",[Key, Val]),
- application_controller:set_env(snmp, Key, Val)
- end,
- lists:foreach(F2, Env).
-
-
-
-
-%% Test if application is running
-mnesia_running() -> ?IS_MNESIA_RUNNING().
-crypto_running() -> ?IS_CRYPTO_RUNNING().
-
-
-start_sub(Dir) ->
- ?DBG("start_sub -> entry",[]),
- Opts = [{db_dir, Dir},
- {supervisor, [{verbosity, trace}]}],
- %% BMK BMK
-% {ok, P} = snmp_supervisor:start_sub(Dir),
- {ok, P} = snmpa_supervisor:start_sub_sup(Opts),
- unlink(P),
- {ok, {P, self()}}.
-
-create_tables(SaNode) ->
- ?line {atomic, ok} = mnesia:create_table([{name, friendsTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, kompissTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, snmp_variables},
- {attributes, [a1,a2]}]).
-
-delete_tables() ->
- mnesia:delete_table(friendsTable2),
- mnesia:delete_table(kompissTable2),
- mnesia:delete_table(snmp_variables).
-
-%% Creation is done in runtime!
-delete_mib_storage_mnesia_tables() ->
- mnesia:delete_table(snmpa_mib_data),
- mnesia:delete_table(snmpa_mib_tree),
- mnesia:delete_table(snmpa_symbolic_store).
-
-%%-----------------------------------------------------------------
-%% A test case is always one of:
-%% - v1 specific case
-%% - v2 specific case
-%% - v1 and v2 case
-%% All v1 specific cases are prefixed with v1_, and all v2 with
-%% v2_. E.g. v1_trap/v2_trap.
-%%
-%% All other cases are shared. However, the testserver uses the name
-%% of the case to generate a file for that case. The same case cannot
-%% be used in different configurations in the same suite. Therefore
-%% all these functions exists in two variants, the base function
-%% <base>, and a second version <base>_2. There may be several
-%% versions as well, <base>_N.
-%%-----------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-mib_storage_ets_cases() ->
-[mse_simple, mse_v1_processing, mse_big, mse_big2,
- mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
- mse_sa_error, mse_next_across_sa, mse_undo,
- mse_standard_mib, mse_community_mib, mse_framework_mib,
- mse_target_mib, mse_notification_mib,
- mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
-[msd_simple, msd_v1_processing, msd_big, msd_big2,
- msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
- msd_sa_error, msd_next_across_sa, msd_undo,
- msd_standard_mib, msd_community_mib, msd_framework_mib,
- msd_target_mib, msd_notification_mib,
- msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
- msd_mib_of].
-
-mib_storage_mnesia_cases() ->
-[msm_simple, msm_v1_processing, msm_big, msm_big2,
- msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
- msm_sa_error, msm_next_across_sa, msm_undo,
- msm_standard_mib, msm_community_mib, msm_framework_mib,
- msm_target_mib, msm_notification_mib,
- msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
- msm_mib_of].
-
-mse_size_check_cases() ->
-[mse_size_check].
-
-msd_size_check_cases() ->
-[msd_size_check].
-
-msm_size_check_cases() ->
-[msm_size_check].
-
-varm_mib_storage_dets_cases() ->
-[msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
-[msm_varm_mib_start].
-
-init_mib_storage_ets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,ets},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- init_ms(Config, [MibStorage]).
-
-init_ms(Config, Opts) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts1 = [MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity|Opts],
- [{vsn, v1} | start_v1_agent(Config,Opts1)].
-
-init_size_check_mse(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, ets},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msd(Config) when list(Config) ->
- AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage, {dets, AgentDir}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msm(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, {mnesia,[]}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_ms(Config, Opts) when list(Config) ->
- SaNode = ?GCONF(snmp_sa, Config),
- %% We are using v3 here, so crypto must be supported or else...
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- create_tables(SaNode),
- AgentDir = ?GCONF(agent_dir, Config),
- MgrDir = ?GCONF(mgr_dir, Config),
- Ip = ?GCONF(ip, Config),
- ?line ok =
- config([v3], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_agent(Config, [v3], Opts)].
-
-init_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_dets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-init_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_mnesia -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-finish_mib_storage_ets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_ets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_dets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_dets -> entry", []),
- delete_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_size_check_mse(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msd(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msm(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_ms(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%% These are just interface functions to fool the test server
-mse_simple(X) -> simple(X).
-mse_v1_processing(X) -> v1_processing(X).
-mse_big(X) -> big(X).
-mse_big2(X) -> big2(X).
-mse_loop_mib(X) -> loop_mib(X).
-mse_api(X) -> api(X).
-mse_sa_register(X) -> sa_register(X).
-mse_v1_trap(X) -> v1_trap(X).
-mse_sa_error(X) -> sa_error(X).
-mse_next_across_sa(X) -> next_across_sa(X).
-mse_undo(X) -> undo(X).
-mse_standard_mib(X) -> snmp_standard_mib(X).
-mse_community_mib(X) -> snmp_community_mib(X).
-mse_framework_mib(X) -> snmp_framework_mib(X).
-mse_target_mib(X) -> snmp_target_mib(X).
-mse_notification_mib(X) -> snmp_notification_mib(X).
-mse_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-mse_sparse_table(X) -> sparse_table(X).
-mse_me_of(X) -> ms_me_of(X).
-mse_mib_of(X) -> ms_mib_of(X).
-
-msd_simple(X) -> simple(X).
-msd_v1_processing(X) -> v1_processing(X).
-msd_big(X) -> big(X).
-msd_big2(X) -> big2(X).
-msd_loop_mib(X) -> loop_mib(X).
-msd_api(X) -> api(X).
-msd_sa_register(X) -> sa_register(X).
-msd_v1_trap(X) -> v1_trap(X).
-msd_sa_error(X) -> sa_error(X).
-msd_next_across_sa(X) -> next_across_sa(X).
-msd_undo(X) -> undo(X).
-msd_standard_mib(X) -> snmp_standard_mib(X).
-msd_community_mib(X) -> snmp_community_mib(X).
-msd_framework_mib(X) -> snmp_framework_mib(X).
-msd_target_mib(X) -> snmp_target_mib(X).
-msd_notification_mib(X) -> snmp_notification_mib(X).
-msd_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msd_sparse_table(X) -> sparse_table(X).
-msd_me_of(X) -> ms_me_of(X).
-msd_mib_of(X) -> ms_mib_of(X).
-
-msm_simple(X) -> simple(X).
-msm_v1_processing(X) -> v1_processing(X).
-msm_big(X) -> big(X).
-msm_big2(X) -> big2(X).
-msm_loop_mib(X) -> loop_mib(X).
-msm_api(X) -> api(X).
-msm_sa_register(X) -> sa_register(X).
-msm_v1_trap(X) -> v1_trap(X).
-msm_sa_error(X) -> sa_error(X).
-msm_next_across_sa(X) -> next_across_sa(X).
-msm_undo(X) -> undo(X).
-msm_standard_mib(X) -> snmp_standard_mib(X).
-msm_community_mib(X) -> snmp_community_mib(X).
-msm_framework_mib(X) -> snmp_framework_mib(X).
-msm_target_mib(X) -> snmp_target_mib(X).
-msm_notification_mib(X) -> snmp_notification_mib(X).
-msm_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msm_sparse_table(X) -> sparse_table(X).
-msm_me_of(X) -> ms_me_of(X).
-msm_mib_of(X) -> ms_mib_of(X).
-
-
-mse_size_check(X) -> p("mse_size_check..."), ms_size_check(X).
-msd_size_check(X) -> p("msd_size_check..."), ms_size_check(X).
-msm_size_check(X) -> p("msm_size_check..."), ms_size_check(X).
-
-msd_varm_mib_start(X) -> p("msd_varm_mib_start..."), varm_mib_start(X).
-msm_varm_mib_start(X) -> p("msm_varm_mib_start..."), varm_mib_start(X).
-
-ms_size_check(suite) -> [];
-ms_size_check(Config) when list(Config) ->
- p("ms_size_check..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?LOG("mib server size check...", []),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMPv2-MIB"),
- ?line load_master_std("SNMPv2-TM"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMPv2-MIB"),
- ?line unload_master("SNMPv2-TM"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-
-varm_mib_start(suite) -> [];
-varm_mib_start(Config) when list(Config) ->
- p("varm_mib_start..."),
- ?LOG("varm_mib_start -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- %% Start the agent
- Opts = ?GCONF(agent_opts, Config),
- Config1 = start_v1_agent(Config, Opts),
-
- %% Sleep some in order for the agent to start properly
- ?DBG("varm_mib_start -> sleep some (before loading mobs)", []),
- ?SLEEP(5000),
-
- %% Load all the mibs
- HardwiredMibs = loaded_mibs(),
- ?DBG("varm_mib_start -> load all mibs", []),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
-
- %% Unload the hardwired mibs
- ?DBG("varm_mib_start -> sleep some (before unloading hardwired mibs)", []),
- ?SLEEP(1000),
- ?DBG("varm_mib_start -> unload (hardwired) mibs", []),
- ?line unload_mibs(HardwiredMibs), %% unload hardwired
-
- ?DBG("varm_mib_start -> sleep some (before stopping agent)", []),
- ?SLEEP(1000),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- Config2 = stop_agent(Config1),
-
- %% Sleep some in order for the agent to stop properly
- ?DBG("varm_mib_start -> sleep some (before re-starting the agent)", []),
- ?SLEEP(5000),
-
- %% Start the agent (again)
- ?DBG("varm_mib_start -> start the agent", []),
- Config3 = start_v1_agent(Config2, Opts),
-
- ?DBG("varm_mib_start -> sleep some (before starting tests)", []),
- ?SLEEP(5000),
-
- %% Perform the test(s)
- ?DBG("varm_mib_start -> perform the tests", []),
- try_test(snmp_community_mib),
- try_test(snmp_framework_mib),
- try_test(snmp_target_mib),
- try_test(snmp_notification_mib),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- stop_agent(Config3),
- ok.
-
-
--define(snmpTrapCommunity_instance, [1,3,6,1,6,3,18,1,4,0]).
--define(vacmViewSpinLock_instance, [1,3,6,1,6,3,16,1,5,1,0]).
--define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-ms_me_of(suite) -> [];
-ms_me_of(Config) when list(Config) ->
- p("ms_me_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_me_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = me_of(?snmpTrapCommunity_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = me_of(?vacmViewSpinLock_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = me_of(?usmStatsNotInTimeWindows_instance),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-me_of(Oid) ->
- case snmpa:me_of(Oid) of
- {ok, #me{oid = Oid}} ->
- ok;
- {ok, #me{oid = OtherOid}} ->
- case lists:reverse(Oid) of
- [0|Rest] ->
- case lists:reverse(Rest) of
- OtherOid ->
- ok;
- AnotherOid ->
- {error, {invalid_oid, Oid, AnotherOid}}
- end;
- _ ->
- {error, {invalid_oid, Oid, OtherOid}}
- end;
- {error, Reason} ->
- {error, Reason};
- Else ->
- {error, Else}
- end.
-
-
-ms_mib_of(suite) -> [];
-ms_mib_of(Config) when list(Config) ->
- p("ms_mib_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_mib_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = mib_of(?snmpTrapCommunity_instance, 'SNMP-COMMUNITY-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = mib_of(?vacmViewSpinLock_instance, 'SNMP-VIEW-BASED-ACM-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = mib_of(?usmStatsNotInTimeWindows_instance,
- 'SNMP-USER-BASED-SM-MIB'),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-mib_of(Oid, ExpectedMibName) ->
- ?DBG("mib_of -> entry with"
- "~n Oid: ~p"
- "~n ExpectedMibName: ~p", [Oid, ExpectedMibName]),
- %% case snmpa:mib_of(Oid) of
- MibOf = snmpa:mib_of(Oid),
- ?DBG("mib_of -> MibOf: ~n~p", [MibOf]),
- case MibOf of
- {ok, ExpectedMibName} ->
- ok;
- {ok, OtherMibName} ->
- {error, {invalid_mib, ExpectedMibName, OtherMibName}};
- {error, Reason} ->
- {error, Reason};
- Else ->
- ?DBG("mib_of -> Else: ~n~p", [Else]),
- {error, Else}
- end.
-
-
-app_info(suite) -> [];
-app_info(Config) when list(Config) ->
- SnmpDir = app_dir(snmp),
- SslDir = app_dir(ssl),
- CryptoDir = app_dir(crypto),
- Attr = snmp:module_info(attributes),
- AppVsn =
- case lists:keysearch(app_vsn, 1, Attr) of
- {value, {app_vsn, V}} ->
- V;
- false ->
- "undefined"
- end,
- io:format("Root dir: ~s~n"
- "SNMP: Application dir: ~s~n"
- " Application ver: ~s~n"
- "SSL: Application dir: ~s~n"
- "CRYPTO: Application dir: ~s~n",
- [code:root_dir(), SnmpDir, AppVsn, SslDir, CryptoDir]),
- ok.
-
-app_dir(App) ->
- case code:lib_dir(App) of
- D when list(D) ->
- filename:basename(D);
- {error, _Reason} ->
- "undefined"
- end.
-
-
-
-%v1_cases() -> [loop_mib];
-v1_cases() ->
-[simple, db_notify_client, v1_processing, big, big2,
- loop_mib, api, subagent, mnesia, {group, multiple_reqs},
- sa_register, v1_trap, sa_error, next_across_sa, undo,
- {group, reported_bugs}, {group, standard_mibs},
- sparse_table, cnt_64, opaque, change_target_addr_config].
-
-init_v1(Config) when list(Config) ->
- ?line SaNode = ?config(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v1} | start_v1_agent(Config)].
-
-finish_v1(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v2_cases() -> [loop_mib_2];
-v2_cases() ->
-[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
- sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
- next_across_sa_2, undo_2, {group, reported_bugs_2},
- {group, standard_mibs_2}, v2_types, implied,
- sparse_table_2, cnt_64_2, opaque_2, v2_caps].
-
-init_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_v2_agent(Config)].
-
-finish_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-v1_v2_cases() ->
-[simple_bi].
-
-init_v1_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v1,v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, bilingual} | start_bilingual_agent(Config)].
-
-finish_v1_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v3_cases() -> [loop_mib_3];
-v3_cases() ->
-[simple_3, v3_processing, big_3, big2_3, api_3,
- subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
- sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, {group, reported_bugs_3},
- {group, standard_mibs_3}, {group, v3_security},
- v2_types_3, implied_3, sparse_table_3, cnt_64_3,
- opaque_3, v2_caps_3].
-
-init_v3(Config) when list(Config) ->
- %% Make sure crypto works, otherwise start_agent will fail
- %% and we will be stuck with a bunch of mnesia tables for
- %% the rest of this suite...
- ?DBG("start_agent -> start crypto app",[]),
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v3], MgrDir, AgentDir,
- tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_v3_agent(Config)].
-
-finish_v3(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-mt_cases() ->
-[multi_threaded, mt_trap].
-
-init_mt(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_multi_threaded_agent(Config)].
-
-finish_mt(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-%% This one *must* be run first in each case.
-init_case(Config) when list(Config) ->
- ?DBG("init_case -> entry with"
- "~n Config: ~p", [Config]),
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- MasterNode = node(),
-
- SaHost = ?HOSTNAME(SaNode),
- MgrHost = ?HOSTNAME(MgrNode),
- MasterHost = ?HOSTNAME(MasterNode),
- {ok, MasterIP} = snmp_misc:ip(MasterHost),
- {ok, MIP} = snmp_misc:ip(MgrHost),
- {ok, SIP} = snmp_misc:ip(SaHost),
-
-
- put(mgr_node, MgrNode),
- put(sa_node, SaNode),
- put(master_node, MasterNode),
- put(sa_host, SaHost),
- put(mgr_host, MgrHost),
- put(master_host, MasterHost),
- put(mip, tuple_to_list(MIP)),
- put(masterip , tuple_to_list(MasterIP)),
- put(sip, tuple_to_list(SIP)),
-
- MibDir = ?config(mib_dir, Config),
- put(mib_dir, MibDir),
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- put(std_mib_dir, StdM),
-
- MgrDir = ?config(mgr_dir, Config),
- put(mgr_dir, MgrDir),
-
- put(vsn, ?config(vsn, Config)),
- ?DBG("init_case -> exit with"
- "~n MasterNode: ~p"
- "~n SaNode: ~p"
- "~n MgrNode: ~p"
- "~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]),
- {SaNode, MgrNode, MibDir}.
-
-load_master(Mib) ->
- ?DBG("load_master -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(mib_dir) ++ Mib]).
-
-load_master_std(Mib) ->
- ?DBG("load_master_std -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(std_mib_dir) ++ Mib]).
-
-unload_master(Mib) ->
- ?DBG("unload_master -> entry with"
- "~n Mib: ~p", [Mib]),
- ok = snmpa:unload_mibs(snmp_master_agent, [Mib]).
-
-loaded_mibs() ->
- ?DBG("loaded_mibs -> entry",[]),
- Info = snmpa:info(snmp_master_agent),
- {value, {loaded_mibs, Mibs}} = lists:keysearch(loaded_mibs, 1, Info),
- [atom_to_list(Mib) || {Mib,_,_} <- Mibs].
-
-unload_mibs(Mibs) ->
- ?DBG("unload_mibs -> entry with"
- "~n Mibs: ~p", [Mibs]),
- ok = snmpa:unload_mibs(snmp_master_agent, Mibs).
-
-start_subagent(SaNode, RegTree, Mib) ->
- ?DBG("start_subagent -> entry with"
- "~n SaNode: ~p"
- "~n RegTree: ~p"
- "~n Mib: ~p", [SaNode, RegTree, Mib]),
- MA = whereis(snmp_master_agent),
- ?DBG("start_subagent -> MA: ~p", [MA]),
- MibDir = get(mib_dir),
- Mib1 = join(MibDir,Mib),
- %% BMK BMK
-% case rpc:call(SaNode,snmp_supervisor,start_subagent,[MA,RegTree,[Mib1]]) of
- case rpc:call(SaNode, snmpa_supervisor,
- start_sub_agent, [MA, RegTree, [Mib1]]) of
- {ok, SA} ->
- ?DBG("start_subagent -> SA: ~p", [SA]),
- {ok, SA};
- Error ->
- ?FAIL({subagent_start_failed, SaNode, Error, [MA, RegTree, Mib1]})
- end.
-
-stop_subagent(SA) ->
- ?DBG("stop_subagent -> entry with"
- "~n SA: ~p", [SA]),
- %% BNK BMK
- %% rpc:call(node(SA), snmp_supervisor, stop_subagent, [SA]).
- rpc:call(node(SA), snmpa_supervisor, stop_sub_agent, [SA]).
-
-%%-----------------------------------------------------------------
-%% This function takes care of the old OTP-SNMPEA-MIB.
-%% Unfortunately, the testcases were written to use the data in the
-%% internal tables, and these table are now obsolete and not used
-%% by the agent. Therefore, we emulate them by using
-%% OLD-SNMPEA-MIB, which uses the default impl. of all tables.
-%%
-%% These two rows must exist in intCommunityTable
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
-%% (But with the manager's IP address)
-%%
-%%-----------------------------------------------------------------
-init_old() ->
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [6 | "public"],
- {get(mip), "public", 2, 2}),
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [13 | "standard trap"],
- {get(mip), "standard trap", 2, 1}),
- snmpa_local_db:variable_set(intAgentIpAddress, [127,0,0,1]).
-
-
-
-simple(suite) -> [];
-simple(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(simple_standard_test).
-
-simple_2(X) -> simple(X).
-
-simple_bi(suite) -> [];
-simple_bi(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(vsn, v1), % First, try v1 manager
- try_test(simple_standard_test),
-
- put(vsn, v2), % Then, try v2 manager
- try_test(simple_standard_test).
-
-simple_3(X) ->
- simple(X).
-
-big(suite) -> [];
-big(Config) when list(Config) ->
- ?DBG("big -> entry", []),
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?DBG("big -> SA: ~p", [SA]),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-big_2(X) -> big(X).
-
-big_3(X) -> big(X).
-
-
-big2(suite) -> [];
-big2(Config) when list(Config) ->
- %% This is exactly the same tests as 'big', but with the
- %% v2 equivalent of the mibs.
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1-v2"),
- ?line load_master("OLD-SNMPEA-MIB-v2"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB-v2").
-
-big2_2(X) -> big2(X).
-
-big2_3(X) -> big2(X).
-
-
-multi_threaded(suite) -> [];
-multi_threaded(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(multi_threaded_test),
- ?line unload_master("Test1").
-
-mt_trap(suite) -> [];
-mt_trap(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- ?line load_master("TestTrapv2"),
- try_test(mt_trap_test, [MA]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("Test1").
-
-v2_types(suite) -> [];
-v2_types(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(types_v2_test),
- ?line unload_master("Test1").
-
-v2_types_3(X) -> v2_types(X).
-
-
-implied(suite) -> [];
-implied(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(implied_test,[MA]),
- ?line unload_master("Test1").
-
-implied_3(X) -> implied(X).
-
-
-sparse_table(suite) -> [];
-sparse_table(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(sparse_table_test),
- ?line unload_master("Test1").
-
-sparse_table_2(X) -> sparse_table(X).
-
-sparse_table_3(X) -> sparse_table(X).
-
-cnt_64(suite) -> [];
-cnt_64(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(cnt_64_test, [MA]),
- ?line unload_master("Test1").
-
-cnt_64_2(X) -> cnt_64(X).
-
-cnt_64_3(X) -> cnt_64(X).
-
-opaque(suite) -> [];
-opaque(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(opaque_test),
- ?line unload_master("Test1").
-
-opaque_2(X) -> opaque(X).
-
-opaque_3(X) -> opaque(X).
-
-
-change_target_addr_config(suite) -> [];
-change_target_addr_config(Config) when list(Config) ->
- p("Testing changing target address config..."),
- ?LOG("change_target_addr_config -> entry",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(sname,snmp_suite),
- put(verbosity,trace),
-
- MA = whereis(snmp_master_agent),
-
- ?LOG("change_target_addr_config -> load TestTrap",[]),
- ?line load_master("TestTrap"),
-
- ?LOG("change_target_addr_config -> set trace verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,trace),
-
- %% First send some traps that will arive att the original manager
- ?LOG("change_target_addr_config -> send trap",[]),
- try_test(ma_trap1, [MA]),
-
- ?LOG("change_target_addr_config -> set silence verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,silence),
-
- %% Start new dummy listener
- ?LOG("change_target_addr_config -> start dummy manager",[]),
- ?line {ok,Pid,NewPort} = dummy_manager_start(MA),
-
- %% Reconfigure
- ?LOG("change_target_addr_config -> reconfigure",[]),
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_addr_conf(AgentDir, NewPort),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- %% Send the trap again
- ?LOG("change_target_addr_config -> send trap again",[]),
- catch dummy_manager_send_trap2(Pid),
-
- ?LOG("change_target_addr_config -> await trap ack",[]),
- catch dummy_manager_await_trap2_ack(),
-
- ?LOG("change_target_addr_config -> stop dummy manager",[]),
- ?line ok = dummy_manager_stop(Pid),
-
- ?LOG("change_target_addr_config -> reset target address config",[]),
- ?line reset_target_addr_conf(AgentDir),
-
- ?LOG("change_target_addr_config -> unload TestTrap",[]),
- ?line unload_master("TestTrap").
-
-
-dummy_manager_start(MA) ->
- ?DBG("dummy_manager_start -> entry",[]),
- Pid = spawn(get(mgr_node), ?MODULE,dummy_manager_init,[self(),MA]),
- ?DBG("dummy_manager_start -> Pid: ~p",[Pid]),
- await_dummy_manager_started(Pid).
-
-await_dummy_manager_started(Pid) ->
- receive
- {dummy_manager_started,Pid,Port} ->
- ?DBG("dummy_manager_start -> acknowledge received with"
- "~n Port: ~p",[Port]),
- {ok,Pid,Port};
- {'EXIT', Pid, Reason} ->
- {error, Pid, Reason};
- O ->
- ?LOG("dummy_manager_start -> received unknown message:"
- "~n ~p",[O]),
- await_dummy_manager_started(Pid)
- end.
-
-dummy_manager_stop(Pid) ->
- ?DBG("dummy_manager_stop -> entry with Pid: ~p",[Pid]),
- Pid ! stop,
- receive
- {dummy_manager_stopping, Pid} ->
- ?DBG("dummy_manager_stop -> acknowledge received",[]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_stop -> timeout",[]),
- timeout
- end.
-
-dummy_manager_send_trap2(Pid) ->
- ?DBG("dummy_manager_send_trap2 -> entry",[]),
- Pid ! {send_trap,testTrap2}.
-
-dummy_manager_await_trap2_ack() ->
- ?DBG("dummy_manager_await_trap2 -> entry",[]),
- receive
- {received_trap,Trap} ->
- ?LOG("dummy_manager_await_trap2 -> received trap: ~p",[Trap]),
- %% Note:
- %% Without this sleep the v2_inform_i testcase failes! There
- %% is no relation between these two test cases as far as I
- %% able to figure out...
- sleep(60000),
- ok;
- O ->
- ?ERR("dummy_manager_await_trap2 -> unexpected message: ~p",[O]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_await_trap2 -> timeout",[]),
- timeout
- end.
-
-dummy_manager_init(Parent,MA) ->
- ?DBG("dummy_manager_init -> entry with"
- "~n Parent: ~p"
- "~n MA: ~p",[Parent,MA]),
- {ok,S} = gen_udp:open(0,[{recbuf,65535}]),
- ?DBG("dummy_manager_init -> S: ~p",[S]),
- {ok,Port} = inet:port(S),
- ?DBG("dummy_manager_init -> Port: ~p",[Port]),
- Parent ! {dummy_manager_started,self(),Port},
- dummy_manager_loop(Parent,S,MA).
-
-dummy_manager_loop(P,S,MA) ->
- ?LOG("dummy_manager_loop -> ready for receive",[]),
- receive
- {send_trap,Trap} ->
- ?LOG("dummy_manager_loop -> received trap send request"
- "~n Trap: ~p",[Trap]),
- snmpa:send_trap(MA, Trap, "standard trap"),
- dummy_manager_loop(P,S,MA);
- {udp, _UdpId, Ip, UdpPort, Bytes} ->
- ?LOG("dummy_manager_loop -> received upd message"
- "~n from: ~p:~p"
- "~n size: ~p",
- [Ip, UdpPort, dummy_manager_message_sz(Bytes)]),
- R = dummy_manager_handle_message(Bytes),
- ?DBG("dummy_manager_loop -> R: ~p",[R]),
- P ! R,
- dummy_manager_loop(P,S,MA);
- stop ->
- ?DBG("dummy_manager_loop -> received stop request",[]),
- P ! {dummy_manager_stopping, self()},
- gen_udp:close(S),
- exit(normal);
- O ->
- ?LOG("dummy_manager_loop -> received unknown message:"
- "~n ~p",[O]),
- dummy_manager_loop(P,S,MA)
- end.
-
-dummy_manager_message_sz(B) when binary(B) ->
- size(B);
-dummy_manager_message_sz(L) when list(L) ->
- length(L);
-dummy_manager_message_sz(_) ->
- undefined.
-
-dummy_manager_handle_message(Bytes) ->
- case (catch snmp_pdus:dec_message(Bytes)) of
- {'EXIT',Reason} ->
- ?ERR("dummy_manager_handle_message -> "
- "failed decoding message only:~n ~p",[Reason]),
- {error,Reason};
- M ->
- ?DBG("dummy_manager_handle_message -> decoded message:"
- "~n ~p",[M]),
- {received_trap,M}
- end.
-
-
-api(suite) -> [];
-api(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(api_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-api_2(X) -> api(X).
-
-api_3(X) -> api(X).
-
-
-subagent(suite) -> [];
-subagent(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- try_test(load_test_sa),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
-
- p("Loading previous subagent mib in master and testing..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(load_test),
-
- p("Unloading previous subagent mib in master and testing..."),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(unreg_test),
- p("Testing register subagent..."),
- rpc:call(SaNode, snmp, register_subagent,
- [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- ?line stop_subagent(SA),
- try_test(unreg_test).
-
-subagent_2(X) -> subagent(X).
-
-subagent_3(X) -> subagent(X).
-
-
-mnesia(suite) -> [];
-mnesia(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent with mnesia impl..."),
- {ok, SA} = start_subagent(SaNode, ?klas2, "Klas2"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- try_test(big_test_2),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA).
-
-mnesia_2(X) -> mnesia(X).
-
-mnesia_3(X) -> mnesia(X).
-
-
-
-mul_cases() ->
-[mul_get, mul_get_err, mul_next, mul_next_err,
- mul_set_err].
-
-
-multiple_reqs_3(_X) ->
- {req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-
-
-mul_cases_2() ->
-[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
- mul_set_err_2].
-
-
-mul_cases_3() ->
- [mul_get_3, mul_get_err_3, mul_next_3, mul_next_err_3, mul_set_err_3].
-
-
-init_mul(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- [{mul_sub, SA} | Config].
-
-finish_mul(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- SA = ?config(mul_sub, Config),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA),
- lists:keydelete(mul_sub, 1, Config).
-
-mul_get(suite) -> [];
-mul_get(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get..."),
- try_test(do_mul_get).
-
-mul_get_2(X) -> mul_get(X).
-
-mul_get_3(X) -> mul_get(X).
-
-
-mul_get_err(suite) -> [];
-mul_get_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get with error..."),
- try_test(do_mul_get_err).
-
-mul_get_err_2(X) -> mul_get_err(X).
-
-mul_get_err_3(X) -> mul_get_err(X).
-
-
-mul_next(suite) -> [];
-mul_next(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next).
-
-mul_next_2(X) -> mul_next(X).
-
-mul_next_3(X) -> mul_next(X).
-
-
-mul_next_err(suite) -> [];
-mul_next_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next_err).
-
-mul_next_err_2(X) -> mul_next_err(X).
-
-mul_next_err_3(X) -> mul_next_err(X).
-
-
-mul_set(suite) -> [];
-mul_set(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set..."),
- try_test(do_mul_set).
-
-mul_set_2(X) -> mul_set(X).
-
-mul_set_3(X) -> mul_set(X).
-
-
-mul_set_err(suite) -> [];
-mul_set_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set with error..."),
- try_test(do_mul_set_err).
-
-mul_set_err_2(X) -> mul_set_err(X).
-
-mul_set_err_3(X) -> mul_set_err(X).
-
-
-sa_register(suite) -> [];
-sa_register(Config) when list(Config) ->
- ?DBG("sa_register -> entry", []),
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?DBG("sa_register -> start subagent", []),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
-
- ?DBG("sa_register -> unregister subagent", []),
- p("Testing unregister subagent (2)..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Loading SA-MIB..."),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:load_mibs(SA, [MibDir ++ "SA-MIB"]),
- ?DBG("sa_register -> register subagent", []),
- rpc:call(SaNode, snmp, register_subagent, [MA,?sa,SA]),
- try_test(sa_mib),
-
- ?DBG("sa_register -> stop subagent", []),
- ?line stop_subagent(SA).
-
-sa_register_2(X) -> sa_register(X).
-
-sa_register_3(X) -> sa_register(X).
-
-
-v1_trap(suite) -> [];
-v1_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_trap1, [MA]),
- try_test(ma_trap2, [MA]),
- try_test(ma_v2_2_v1_trap, [MA]),
- try_test(ma_v2_2_v1_trap2, [MA]),
-
- p("Testing trap sending from subagent..."),
- try_test(sa_trap1, [SA]),
- try_test(sa_trap2, [SA]),
- try_test(sa_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v2_trap(suite) -> [];
-v2_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
-
- try_test(ma_v2_trap1, [MA]),
- try_test(ma_v2_trap2, [MA]),
- try_test(ma_v1_2_v2_trap, [MA]),
- try_test(ma_v1_2_v2_trap2, [MA]),
-
- try_test(sa_mib),
- p("Testing trap sending from subagent..."),
- try_test(sa_v1_2_v2_trap1, [SA]),
- try_test(sa_v1_2_v2_trap2, [SA]),
- try_test(sa_v1_2_v2_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v3_trap(X) ->
- v2_trap(X).
-
-
-v3_inform(_X) ->
- %% v2_inform(X).
- {req, [], {conf, init_v3_inform, [v3_inform_i], finish_v3_inform}}.
-
-init_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-init_v3_inform(X) ->
- init_v2_inform(X).
-
-finish_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-finish_v3_inform(X) ->
- finish_v2_inform(X).
-
-
-
-v2_inform_i(suite) -> [];
-v2_inform_i(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing inform sending from master agent... NOTE! This test\ntakes a "
- "few minutes (5) to complete."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_v2_inform1, [MA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2").
-
-v3_inform_i(X) -> v2_inform_i(X).
-
-
-sa_error(suite) -> [];
-sa_error(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing sa bad value (is_set_ok)..."),
- try_test(sa_errs_bad_value),
-
- p("Testing sa gen err (set)..."),
- try_test(sa_errs_gen_err),
-
- p("Testing too big..."),
- try_test(sa_too_big),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- stop_subagent(SA).
-
-sa_error_2(X) -> sa_error(X).
-
-sa_error_3(X) -> sa_error(X).
-
-
-next_across_sa(suite) -> [];
-next_across_sa(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Loading another subagent mib..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas1"]),
-
- rpc:call(SaNode, snmp, register_subagent, [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- p("Testing next across subagent (endOfMibView from SA)..."),
- try_test(next_across_sa),
-
- p("Unloading mib"),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Starting another subagent"),
- ?line {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
- p("Testing next across subagent (wrong prefix from SA)..."),
- try_test(next_across_sa),
-
- stop_subagent(SA),
- stop_subagent(SA2).
-
-next_across_sa_2(X) -> next_across_sa(X).
-
-next_across_sa_3(X) -> next_across_sa(X).
-
-
-undo(suite) -> [];
-undo(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing undo phase at master agent..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas4"]),
- try_test(undo_test),
- try_test(api_test2),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas3"]),
-
- p("Testing bad return values from instrum. funcs..."),
- try_test(bad_return),
-
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas4"]),
-
- p("Testing undo phase at subagent..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas4"]),
- ?line ok = snmpa:register_subagent(MA, ?klas3, SA),
- ?line ok = snmpa:register_subagent(MA, ?klas4, SA),
- try_test(undo_test),
- try_test(api_test3),
-
- p("Testing undo phase across master/subagents..."),
- try_test(undo_test),
- try_test(api_test3),
- stop_subagent(SA).
-
-undo_2(X) -> undo(X).
-
-undo_3(X) -> undo(X).
-
-%% Req. Test2
-v1_processing(suite) -> [];
-v1_processing(Config) when list(Config) ->
- ?DBG("v1_processing -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v1_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v2_processing(suite) -> [];
-v2_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v3_processing(suite) -> [];
-v3_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc), % same as v2!
- ?line unload_master("Test2").
-
-
-%% We'll try get/set/trap and inform for all the auth & priv protocols.
-%% For informs, the mgr is auth-engine. The agent has to sync. This is
-%% accomplished by the first inform sent. That one will generate a
-%% report, which makes it in sync. The notification-generating
-%% application times out, and send again. This time it'll work.
-
-v3_crypto_basic(suite) -> [];
-v3_crypto_basic(_Config) ->
- EID = [0,0,0,0,0,0,0,0,0,0,0,2],
- %% From rfc2274 appendix A.3.1
- ?line KMd5_1 = snmp:passwd2localized_key(md5, "maplesyrup", EID),
- ?line [16#52,16#6f,16#5e,16#ed,16#9f,16#cc,16#e2,16#6f,
- 16#89,16#64,16#c2,16#93,16#07,16#87,16#d8,16#2b] =
- KMd5_1,
- %% From rfc2274 appendix A.3.2
- ?line KSHA_1 = snmp:passwd2localized_key(sha, "maplesyrup", EID),
- ?line [16#66,16#95,16#fe,16#bc,16#92,16#88,16#e3,16#62,16#82,16#23,
- 16#5f,16#c7,16#15,16#1f,16#12,16#84,16#97,16#b3,16#8f,16#3f] =
- KSHA_1,
- %% From rfc2274, appendix A.5.1
- ?line KMd5_2 = snmp:passwd2localized_key(md5, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#88,16#05,16#61,16#51,16#41,16#67,16#6c,16#c9,
- 16#19,16#61,16#74,16#e7,16#42,16#a3,16#25,16#51] =
- snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- %% From rfc2274, appendix A.5.2
- ?line KSHA_2 = snmp:passwd2localized_key(sha, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#9c,16#10,16#17,16#f4,
- 16#fd,16#48,16#3d,16#2d,16#e8,16#d5,16#fa,16#db,
- 16#f8,16#43,16#92,16#cb,16#06,16#45,16#70,16#51] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2, 20,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- KSHA_1t = lists:sublist(KSHA_1, 16),
- KSHA_2t = lists:sublist(KSHA_2, 16),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#7e,16#f8,16#d8,16#a4,16#c9,16#cd,16#b2,16#6b,
- 16#47,16#59,16#1c,16#d8,16#52,16#ff,16#88,16#b5] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1t, KSHA_2t, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
-
- %% Try with correct random
- ?line Kc1 = snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2),
- ?line KMd5_2 = snmp_user_based_sm_mib:extract_new_key(md5, KMd5_1, Kc1),
- ?line Kc2 = snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2),
- ?line KSHA_2 = snmp_user_based_sm_mib:extract_new_key(sha, KSHA_1, Kc2),
- ok.
-
-
-
-v3_md5_auth(suite) -> [];
-v3_md5_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing MD5 authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authMD5", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authMD5"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_sha_auth(suite) -> [];
-v3_sha_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing SHA authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authSHA", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authSHA"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_des_priv(suite) -> [];
-v3_des_priv(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing DES encryption...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "privDES", authPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-%% -define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-%% Make sure mgr is in sync with agent
-v3_sync(Funcs) ->
- ?DBG("v3_sync -> entry with Funcs: ~p",[Funcs]),
- g([[sysDescr, 0]]),
- expect(432, report, [{?usmStatsNotInTimeWindows_instance, any}]),
- g([[sysDescr, 0]]),
- expect(433, [{[sysDescr,0], any}]),
- lists:foreach(fun({Func, Args}) -> apply(?MODULE, Func, Args) end, Funcs).
-
-v3_inform_sync(MA) ->
- ?DBG("v3_sync -> entry with MA: ~p => Send notification",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver,
- "standard inform", []),
- %% Make sure agent is in sync with mgr...
- ?DBG("v3_sync -> wait some time: ",[]),
- sleep(20000), % more than 1500*10 in target_addr.conf
- ?DBG("v3_sync -> await response",[]),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]).
-
-
-v2_caps(suite) -> [];
-v2_caps(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(v2_caps_i, [node()]).
-
-v2_caps_3(X) -> v2_caps(X).
-
-
-v2_caps_i(Node) ->
- ?line Idx = rpc:call(Node, snmp, add_agent_caps, [[1,2,3,4,5], "test cap"]),
- g([[sysORID, Idx], [sysORDescr, Idx]]),
- ?line expect(1, [{[sysORID, Idx], [1,2,3,4,5]},
- {[sysORDescr, Idx], "test cap"}]),
- ?line rpc:call(Node, snmp, del_agent_caps, [Idx]),
- g([[sysORID, Idx]]),
- ?line expect(2, [{[sysORID, Idx], noSuchInstance}]).
-
-
-%% Req. Test2
-v1_proc() ->
- ?DBG("v1_proc -> entry", []),
- %% According to RFC1157.
- %% Template: <Section>:<list no>
- v1_get_p(),
- v1_get_next_p(),
- v1_set_p().
-
-
-v1_get_p() ->
- %% 4.1.2:1
- g([[test2]]),
- ?line expect(10, noSuchName, 1, [{[test2], 'NULL'}]),
- g([[tDescr]]),
- ?line expect(11, noSuchName, 1, [{[tDescr], 'NULL'}]),
- g([[tDescr2,0]]),
- ?line expect(12, noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
- g([[tDescr3,0]]),
- ?line expect(131, noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
- g([[tDescr4,0]]),
- ?line expect(132, noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(14, noSuchName, 2, [{[sysDescr, 0], 'NULL'},
- {[tDescr,0], 'NULL'}]),
- g([[sysDescr,3]]),
- ?line expect(15, noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
-
- %% 4.1.2:2
- g([[tTable]]),
- ?line expect(20, noSuchName, 1, [{[tTable], 'NULL'}]),
- g([[tEntry]]),
- ?line expect(21, noSuchName, 1, [{[tEntry], 'NULL'}]),
-
- %% 4.1.2:3
- g([[tTooBig, 0]]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.2:4
- g([[tGenErr1, 0]]),
- ?line expect(40, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(41, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(42, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]).
-
-
-v1_get_next_p() ->
- %% 4.1.3:1
- gn([[1,3,7,1]]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
- gn([[tDescr2]]),
- ?line expect(11, tooBig, 0, any),
-
- %% 4.1.3:2
- gn([[tTooBig]]),
- io:format("We currently don't handle tooBig correct!!!\n"),
-% ?line expect(20, tooBig, 0, [{[tTooBig], 'NULL'}]),
- ?line expect(20, tooBig, 0, any),
-
- %% 4.1.3:3
- gn([[tGenErr1]]),
-% ?line expect(40, genErr, 1, [{[tGenErr1], 'NULL'}]),
- ?line expect(40, genErr, 1, any),
- gn([[tGenErr2]]),
-% ?line expect(41, genErr, 1, [{[tGenErr2], 'NULL'}]),
- ?line expect(41, genErr, 1, any),
- gn([[sysDescr], [tGenErr3]]),
-% ?line expect(42, genErr, 2, [{[sysDescr], 'NULL'},
-% {[tGenErr3], 'NULL'}]).
- ?line expect(42, genErr, 2, any).
-
-v1_set_p() ->
- %% 4.1.5:1
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(12, noSuchName, 1, [{[tDescr3,0], "read-only"}]),
- s([{[tDescr3], s, "noSuchObject"}]),
- ?line expect(13, noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
- s([{[tDescr3,1], s, "noSuchInstance"}]),
- ?line expect(14, noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
- s([{[tDescr2,0], s, "inconsistentName"}]),
- ?line expect(15, noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
-
- %% 4.1.5:2
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(20, badValue, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(21, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.1.5:3
- %% The standard is quite incorrect here. The resp pdu was too big. In
- %% the resp pdu, we have the original vbs. In the tooBig pdu we still
- %% have to original vbs => the tooBig pdu is too big as well!!! It
- %% may not get it to the manager, unless the agent uses 'NULL' instead
- %% of the std-like original value.
- s([{[tTooBig, 0], s, ?tooBigStr}]),
- %% according to std:
-% ?line expect(30, tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.5:4
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(40, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
- s([{[tDescr2, 0], s, "commit_fail"}]),
- ?line expect(41, genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
-
-%% Req. Test2
-v2_proc() ->
- %% According to RFC1905.
- %% Template: <Section>:<list no>
- ?DBG("v2_proc -> entry",[]),
- v2_get_p(),
- v2_get_next_p(),
- v2_get_bulk_p(),
- v2_set_p().
-
-v2_get_p() ->
- %% 4.2.1:2
- ?DBG("v2_get_p -> entry",[]),
- g([[test2]]),
- ?line expect(10, [{[test2], noSuchObject}]),
- g([[tDescr]]),
- ?line expect(11, [{[tDescr], noSuchObject}]),
- g([[tDescr4,0]]),
- ?line expect(12, [{[tDescr4,0], noSuchObject}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"},
- {[tDescr,0], noSuchObject}]),
- g([[tTable]]),
- ?line expect(14, [{[tTable], noSuchObject}]),
- g([[tEntry]]),
- ?line expect(15, [{[tEntry], noSuchObject}]),
-
- %% 4.2.1:3
- g([[tDescr2,0]]), %% instrum ret noSuchName!!!
- ?line expect(20, [{[tDescr2,0], noSuchInstance}]),
- g([[tDescr3,0]]),
- ?line expect(21, [{[tDescr3,0], noSuchInstance}]),
- g([[sysDescr,3]]),
- ?line expect(22, [{[sysDescr, 3], noSuchInstance}]),
- g([[tIndex,1]]),
- ?line expect(23, [{[tIndex, 1], noSuchInstance}]),
-
- %% 4.2.1 - any other error: genErr
- g([[tGenErr1, 0]]),
- ?line expect(30, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(31, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(32, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]),
-
- %% 4.2.1 - tooBig
- g([[tTooBig, 0]]),
- ?line expect(40, tooBig, 0, []).
-
-
-v2_get_next_p() ->
- %% 4.2.2:2
- ?DBG("v2_get_next_p -> entry",[]),
- gn([[1,3,7,1]]),
- ?line expect(10, [{[1,3,7,1], endOfMibView}]),
- gn([[sysDescr], [1,3,7,1]]),
- ?line expect(11, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gn([[tCnt2, 1]]),
- ?line expect(12, [{[tCnt2,2], 100}]),
- gn([[tCnt2, 2]]),
- ?line expect(12, [{[tCnt2,2], endOfMibView}]),
-
- %% 4.2.2 - any other error: genErr
- gn([[tGenErr1]]),
- ?line expect(20, genErr, 1, [{[tGenErr1], 'NULL'}]),
- gn([[tGenErr2]]),
- ?line expect(21, genErr, 1, [{[tGenErr2], 'NULL'}]),
- gn([[sysDescr], [tGenErr3]]),
- ?line expect(22, genErr, 2, [{[sysDescr], 'NULL'},
- {[tGenErr3], 'NULL'}]),
-
- %% 4.2.2 - tooBig
- gn([[tTooBig]]),
- ?line expect(20, tooBig, 0, []).
-
-v2_get_bulk_p() ->
- %% 4.2.3
- ?DBG("v2_get_bulk_p -> entry",[]),
- gb(1, 1, []),
- ?line expect(10, []),
- gb(-1, 1, []),
- ?line expect(11, []),
- gb(-1, -1, []),
- ?line expect(12, []),
- gb(-1, -1, []),
- ?line expect(13, []),
- gb(2, 0, [[sysDescr], [1,3,7,1]]),
- ?line expect(14, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(1, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(15, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(0, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(16, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(2, 2, [[sysDescr], [1,3,7,1], [sysDescr], [1,3,7,1]]),
- ?line expect(17, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(1, 2, [[sysDescr], [sysDescr], [tTooBig]]),
- ?line expect(18, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[sysDescr, 0], "Erlang SNMP agent"}]),
-
- gb(1,12, [[tDescr2], [sysDescr]]), % next one after tDescr2 is tTooBig.
- ?line expect(19, []),
-
- gb(2,2, [[sysDescr], [sysObjectID], [tGenErr1], [sysDescr]]),
- ?line expect(20, genErr, 3, [{[sysDescr], 'NULL'},
- {[sysObjectID], 'NULL'},
- {[tGenErr1], 'NULL'},
- {[sysDescr], 'NULL'}]),
- gb(0, 2, [[tCnt2, 1]]),
- ?line expect(21, [{[tCnt2,2], 100},
- {[tCnt2,2], endOfMibView}]).
-
-
-v2_set_p() ->
- %% 4.2.5:1
- ?DBG("v2_set_p -> entry",[]),
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noAccess, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noAccess, 1, [{[tDescr,0], "outside mibview"}]),
-
- %% 4.2.5:2
- s([{[1,3,6,1,0], s, "noSuchObject"}]),
- ?line expect(20, notWritable, 1, [{[1,3,6,1,0], "noSuchObject"}]),
-
- %% 4.2.5:3
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(30, wrongType, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(31, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.2.5:4
- s([{[tStr, 0], s, ""}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], ""}]),
- s([{[tStr, 0], s, "12345"}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], "12345"}]),
-
- %% 4.2.5:5 - N/A
-
- %% 4.2.5:6
- s([{[tInt1, 0], i, 0}]),
- ?line expect(60, wrongValue, 1, [{[tInt1, 0], 0}]),
- s([{[tInt1, 0], i, 5}]),
- ?line expect(61, wrongValue, 1, [{[tInt1, 0], 5}]),
- s([{[tInt2, 0], i, 0}]),
- ?line expect(62, wrongValue, 1, [{[tInt2, 0], 0}]),
- s([{[tInt2, 0], i, 5}]),
- ?line expect(63, wrongValue, 1, [{[tInt2, 0], 5}]),
- s([{[tInt3, 0], i, 5}]),
- ?line expect(64, wrongValue, 1, [{[tInt3, 0], 5}]),
-
- %% 4.2.5:7
- s([{[tDescrX, 1, 1], s, "noCreation"}]),
- ?line expect(70, noCreation, 1, [{[tDescrX, 1, 1], "noCreation"}]),
-
- %% 4.2.5:8
- s([{[tDescrX, 1, 2], s, "inconsistentName"}]),
- ?line expect(80, inconsistentName, 1,
- [{[tDescrX, 1, 2], "inconsistentName"}]),
-
- %% 4.2.5:9
- s([{[tCnt, 1, 2], i, 5}]),
- ?line expect(90, notWritable, 1, [{[tCnt, 1, 2], 5}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(90, notWritable, 1, [{[tDescr3,0], "read-only"}]),
-
- %% 4.2.5:10
- s([{[tDescr2,0], s, "inconsistentValue"}]),
- ?line expect(100, inconsistentValue, 1,
- [{[tDescr2,0], "inconsistentValue"}]),
-
- %% 4.2.5:11
- s([{[tDescr2,0], s, "resourceUnavailable"}]),
- ?line expect(110, resourceUnavailable, 1,
- [{[tDescr2,0],"resourceUnavailable"}]),
-
- %% 4.2.5:12
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(120, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]).
-
- %% commitFailed and undoFailed is tested by the 'undo' case.
-
-
-%% Req. OLD-SNMPEA-MIB
-table_test() ->
- io:format("Testing simple get, next and set on communityTable...~n"),
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
- Key1c3 = [intCommunityViewIndex,get(mip),is("public")],
- Key2c3 = [intCommunityViewIndex,get(mip),is("standard trap")],
- Key1c4 = [intCommunityAccess,get(mip),is("public")],
- EndKey = [intCommunityEntry,[9],get(mip),is("public")],
- gn([[intCommunityEntry]]),
- ?line expect(7, [{Key1c3, 2}]),
- gn([[intCommunityTable]]),
- ?line expect(71, [{Key1c3, 2}]),
- gn([[community]]),
- ?line expect(72, [{Key1c3, 2}]),
- gn([[otpSnmpeaMIB]]),
- ?line expect(73, [{Key1c3, 2}]),
- gn([[ericsson]]),
- ?line expect(74, [{Key1c3, 2}]),
- gn([Key1c3]),
- ?line expect(8, [{Key2c3, 2}]),
- gn([Key2c3]),
- ?line expect(9, [{Key1c4, 2}]),
- gn([EndKey]),
- AgentIp = [intAgentIpAddress,0],
- ?line expect(10, [{AgentIp, any}]),
- g([Key1c3]),
- ?line expect(11, [{Key1c3, 2}]),
- g([EndKey]),
- ?line ?v1_2(expect(12, noSuchName, 1, any),
- expect(12, [{EndKey, noSuchObject}])),
-
- io:format("Testing row creation/deletion on communityTable...~n"),
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
- s([{NewKeyc5, ?createAndGo}]),
- ?line expect(14, ?v1_2(badValue, inconsistentValue), 1,any),
- s([{NewKeyc5, ?createAndGo}, {NewKeyc3, 2}, {NewKeyc4, 2}]),
- ?line expect(15, [{NewKeyc5, ?createAndGo},{NewKeyc3, 2}, {NewKeyc4, 2}]),
- g([NewKeyc4]),
- ?line expect(16, [{NewKeyc4, 2}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(17, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc4, 2}]),
- ?line expect(18, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc4, 2}]),
- s([{NewKeyc5, ?createAndWait}]),
- ?line expect(19, [{NewKeyc5, ?createAndWait}]),
- g([NewKeyc5]),
- ?line expect(20, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc4, 2}]),
- ?line expect(21, [{NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(22, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc3, 2}]),
- ?line expect(23, [{NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(24, [{NewKeyc5, ?notInService}]),
- s([{NewKeyc5, ?active}]),
- ?line expect(25, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(26, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc3, 3}]),
- ?line expect(27, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc3, 3}]),
- otp_1128().
-
-%% Req. system group
-simple_standard_test() ->
- ?DBG("simple_standard_test -> entry",[]),
- gn([[1,1]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3]]),
- ?line expect(11, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6]]),
- ?line expect(12, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1]]),
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2]]),
- ?line expect(14, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1]]),
- ?line expect(15, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1,1]]),
- ?line expect(16, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[sysDescr]]),
- ?line expect(17, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr,0]]),
- ?line expect(2, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr]]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{[sysDescr], noSuchObject}])),
- g([[1,6,7,0]]),
- ?line ?v1_2(expect(41, noSuchName, 1, any),
- expect(3, [{[1,6,7,0], noSuchObject}])),
- gn([[1,13]]),
- ?line ?v1_2(expect(4, noSuchName,1, any),
- expect(4, [{[1,13], endOfMibView}])),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
- g([[sysLocation, 0]]),
- ?line expect(6, [{[sysLocation, 0], "new_value"}]),
- io:format("Testing noSuchName and badValue...~n"),
- s([{[sysServices,0], 3}]),
- ?line expect(61, ?v1_2(noSuchName, notWritable), 1, any),
- s([{[sysLocation, 0], i, 3}]),
- ?line expect(62, ?v1_2(badValue, wrongType), 1, any),
- ?DBG("simple_standard_test -> done",[]),
- ok.
-
-%% This is run in the agent node
-db_notify_client(suite) -> [];
-db_notify_client(Config) when list(Config) ->
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("~n\tSaNode: ~p~n\tMgrNode: ~p~n\tMibDir: ~p",
- [SaNode,MgrNode,MibDir]),
- snmpa_local_db:register_notify_client(self(),?MODULE),
-
- %% This call (the manager) will issue to set operations, so
- %% we expect to receive to notify(insert) calls.
- try_test(db_notify_client_test),
-
- ?DBG("await first notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("first notify received",[]),ok
- end,
-
- ?DBG("await second notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("second notify received",[]),ok
- end,
-
- snmpa_local_db:unregister_notify_client(self()).
-
-
-%% This is run in the manager node
-db_notify_client_test() ->
- ?DBG("set first new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
-
- ?DBG("set second new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]).
-
-notify(Pid,What) ->
- ?DBG("notify(~p,~p) -> called",[Pid,What]),
- Pid ! {db_notify_test_reply,What}.
-
-
-%% Req: system group, OLD-SNMPEA-MIB, Klas1
-big_test() ->
- ?DBG("big_test -> testing simple next/get/set @ master agent...",[]),
- simple_standard_test(),
-
- ?DBG("big_test -> testing simple next/get/set @ subagent...",[]),
- gn([[klas1]]),
- ?line expect(1, [{[fname,0], ""}]),
- g([[fname,0]]),
- ?line expect(2, [{[fname,0], ""}]),
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[fname,0]]),
- ?line expect(4, [{[fname,0], "test set"}]),
-
- ?DBG("big_test -> "
- "testing next from last instance in master to subagent...",[]),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname,0], "test set"}]),
- s([{[fname,0], s, ""}]),
- ?line expect(52, [{[fname,0], ""}]),
-
- table_test(),
-
- ?DBG("big_test -> adding one row in subagent table",[]),
- _FTab = [friendsEntry],
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {[friendsEntry, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [friendsEntry, [3, 3]]]),
- ?line expect(7, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?active}]),
- s([{[friendsEntry, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry, [3, 3]], ?destroy}]),
-
- otp_1131(),
-
- ?DBG("big_test -> adding two rows in subagent table with special INDEX",
- []),
- s([{[kompissEntry, [1, 3]], s, "kompis3"},
- {[kompissEntry, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?createAndGo}]),
- g([[kompissEntry, [1, 3]],
- [kompissEntry, [2, 3]]]),
- ?line expect(10, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- gn([[kompissEntry, [1]],
- [kompissEntry, [2]]]),
- ?line expect(11, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- s([{[kompissEntry, [1, 2]], s, "kompis3"},
- {[kompissEntry, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry, [1, 1]],
- [kompissEntry, [2, 1]]]),
- ?line expect(13, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?active}]),
- s([{[kompissEntry, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry, [2, 3]], ?destroy}]),
- s([{[kompissEntry, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry, [2, 2]], ?destroy}]),
- ?DBG("big_test -> done",[]),
- ok.
-
-%% Req. system group, Klas2, OLD-SNMPEA-MIB
-big_test_2() ->
- p("Testing simple next/get/set @ master agent (2)..."),
- simple_standard_test(),
-
- p("Testing simple next/get/set @ subagent (2)..."),
- gn([[klas2]]),
- ?line expect(1, [{[fname2,0], ""}]),
- g([[fname2,0]]),
- ?line expect(2, [{[fname2,0], ""}]),
- s([{[fname2,0], s, "test set"}]),
- ?line expect(3, [{[fname2,0], "test set"}]),
- g([[fname2,0]]),
- ?line expect(4, [{[fname2,0], "test set"}]),
-
- otp_1298(),
-
- p("Testing next from last object in master to subagent (2)..."),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname2,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname2,0], "test set"}]),
-
- table_test(),
-
- p("Adding one row in subagent table (2)"),
- _FTab = [friendsEntry2],
- s([{[friendsEntry2, [2, 3]], s, "kompis3"},
- {[friendsEntry2, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?createAndGo}]),
- g([[friendsEntry2, [2, 3]],
- [friendsEntry2, [3, 3]]]),
- ?line expect(7, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?active}]),
- s([{[friendsEntry2, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry2, [3, 3]], ?destroy}]),
-
- p("Adding two rows in subagent table with special INDEX (2)"),
- s([{[kompissEntry2, [1, 3]], s, "kompis3"},
- {[kompissEntry2, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?createAndGo}]),
- g([[kompissEntry2, [1, 3]],
- [kompissEntry2, [2, 3]]]),
- ?line expect(10, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- gn([[kompissEntry2, [1]],
- [kompissEntry2, [2]]]),
- ?line expect(11, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- s([{[kompissEntry2, [1, 2]], s, "kompis3"},
- {[kompissEntry2, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry2, [1, 1]],
- [kompissEntry2, [2, 1]]]),
- ?line expect(13, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?active}]),
- s([{[kompissEntry2, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry2, [2, 3]], ?destroy}]),
- s([{[kompissEntry2, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry2, [2, 2]], ?destroy}]),
- ok.
-
-%% Req. Test1
-multi_threaded_test() ->
- p("Testing multi threaded agent..."),
- g([[multiStr,0]]),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(1, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "pelle"}]),
- ?line expect(2, [{[sysLocation, 0], "pelle"}]),
- Pid ! continue,
- ?line expect(3, [{[multiStr,0], "ok"}]),
-
- s([{[multiStr, 0], s, "block"}]),
- Pid2 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(4, [{[sysUpTime,0], any}]),
- g([[multiStr,0]]),
- Pid3 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(5, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "kalle"}]),
- Pid3 ! continue,
- ?line expect(6, [{[multiStr,0], "ok"}]),
- Pid2 ! continue,
- ?line expect(7, [{[multiStr,0], "block"}]),
- ?line expect(8, [{[sysLocation,0], "kalle"}]).
-
-%% Req. Test1, TestTrapv2
-mt_trap_test(MA) ->
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- snmpa:send_trap(MA, mtTrap, "standard trap"),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(2, [{[sysUpTime,0], any}]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- Pid ! continue,
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [2]},
- {[multiStr,0], "ok"}]).
-
-
-get_multi_pid() ->
- get_multi_pid(10).
-get_multi_pid(0) ->
- ?line ?FAIL(no_global_name);
-get_multi_pid(N) ->
- sleep(1000),
- case global:whereis_name(snmp_multi_tester) of
- Pid when pid(Pid) -> Pid;
- _ -> get_multi_pid(N-1)
- end.
-
-%% Req. Test1
-types_v2_test() ->
- p("Testing v2 types..."),
-
- s([{[bits1,0], 2#10}]),
- ?line expect(1, [{[bits1,0], ?str(2#10)}]),
- g([[bits1,0]]),
- ?line expect(2, [{[bits1,0], ?str(2#101)}]),
-
- s([{[bits2,0], 2#11000000110}]),
- ?line expect(3, [{[bits2,0], ?str(2#11000000110)}]),
- g([[bits2,0]]),
- ?line expect(4, [{[bits2,0], ?str(2#11000000110)}]),
-
- g([[bits3,0]]),
- ?line expect(50, genErr, 1, any),
-
- g([[bits4,0]]),
- ?line expect(51, genErr, 1, any),
-
- s([{[bits1,0], s, [2#10]}]),
- ?line expect(6, ?v1_2(badValue, wrongValue), 1, any),
-
- s([{[bits2,0], 2#11001001101010011}]),
- ?line expect(7, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%% Req. Test1
-implied_test(MA) ->
- ?LOG("implied_test -> start",[]),
- p("Testing IMPLIED..."),
-
- snmpa:verbosity(MA,trace),
- snmpa:verbosity(MA,trace),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = "apa",
- Idx2 = "qq",
- ?DBG("implied_test -> (send) create row 1 '~s' in table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?createAndGo}, {[testDescr, Idx1],s,"row 1"}]),
- ?line expect(1, [{[testStatus, Idx1], ?createAndGo},
- {[testDescr, Idx1], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?createAndGo}, {[testDescr, Idx2],s,"row 2"}]),
- ?line expect(2, [{[testStatus, Idx2], ?createAndGo},
- {[testDescr, Idx2], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr)",[]),
- gn([[testDescr]]),
- ?line expect(3, [{[testDescr,Idx1], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr) of row 1",[]),
- gn([[testDescr,Idx1]]),
- ?line expect(4, [{[testDescr,Idx2], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?destroy}]),
- ?line expect(5, [{[testStatus, Idx1], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?destroy}]),
- ?line expect(6, [{[testStatus, Idx2], ?destroy}]),
-
- %% Try the same in other table
- Idx3 = [1, "apa"],
- Idx4 = [1, "qq"],
- ?DBG("implied_test -> (send) create row 1 '~s' in table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?createAndGo}, {[testDescr2,Idx3],s,"row 1"}]),
- ?line expect(1, [{[testStatus2, Idx3], ?createAndGo},
- {[testDescr2, Idx3], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?createAndGo}, {[testDescr2,Idx4],s,"row 2"}]),
- ?line expect(2, [{[testStatus2, Idx4], ?createAndGo},
- {[testDescr2, Idx4], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr2)",[]),
- gn([[testDescr2]]),
- ?line expect(3, [{[testDescr2,Idx3], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr2) of row 1",[]),
- gn([[testDescr2,Idx3]]),
- ?line expect(4, [{[testDescr2,Idx4], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?destroy}]),
- ?line expect(5, [{[testStatus2, Idx3], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?destroy}]),
- ?line expect(6, [{[testStatus2, Idx4], ?destroy}]),
-
- snmpa:verbosity(MA,log),
-
- ?LOG("implied_test -> done",[]).
-
-
-
-%% Req. Test1
-sparse_table_test() ->
- p("Testing sparse table..."),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- s([{[sparseStatus, Idx1], i, ?createAndGo},
- {[sparseDescr, Idx1], s, "row 1"}]),
- ?line expect(1, [{[sparseStatus, Idx1], ?createAndGo},
- {[sparseDescr, Idx1], "row 1"}]),
- s([{[sparseStatus, Idx2], i, ?createAndGo},
- {[sparseDescr, Idx2], s, "row 2"}]),
- ?line expect(2, [{[sparseStatus, Idx2], ?createAndGo},
- {[sparseDescr, Idx2], "row 2"}]),
- ?v1_2(gn([[sparseIndex], [sparseDescr,Idx1], [sparseDescr,Idx2],
- [sparseStatus,Idx1], [sparseStatus,Idx2]]),
- gb(0,5,[[sparseIndex]])),
- ?line expect(3, [{[sparseDescr,Idx1], "row 1"},
- {[sparseDescr,Idx2], "row 2"},
- {[sparseStatus,Idx1], ?active},
- {[sparseStatus,Idx2], ?active},
- {[sparseStr,0], "slut"}]),
- % Delete the rows
- s([{[sparseStatus, Idx1], i, ?destroy}]),
- ?line expect(4, [{[sparseStatus, Idx1], ?destroy}]),
- s([{[sparseStatus, Idx2], i, ?destroy}]),
- ?line expect(5, [{[sparseStatus, Idx2], ?destroy}]).
-
-
-%% Req. Test1
-cnt_64_test(MA) ->
- ?LOG("start cnt64 test (~p)",[MA]),
- snmpa:verbosity(MA,trace),
- ?LOG("start cnt64 test",[]),
- p("Testing Counter64, and at the same time, RowStatus is not last column"),
-
- ?DBG("get cnt64",[]),
- g([[cnt64,0]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(1, noSuchName, 1, any),
- expect(1, [{[cnt64,0],18446744073709551615}])),
- ?DBG("get-next cnt64",[]),
- gn([[cnt64]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(2, [{[cnt64Str,0], "after cnt64"}]),
- expect(2, [{[cnt64,0],18446744073709551615}])),
- ?DBG("send cntTrap",[]),
- snmpa:send_trap(MA,cntTrap,"standard trap",[{sysContact,"pelle"},
- {cnt64, 10},
- {sysLocation, "here"}]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, trap, [test], 6, 1, [{[sysContact,0], "pelle"},
- {[sysLocation,0], "here"}]),
- expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [1]},
- {[sysContact,0], "pelle"},
- {[cnt64,0], 10},
- {[sysLocation,0], "here"}])),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- ?DBG("create row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(1, [{[cntStatus, Idx1], ?createAndGo}]),
- ?DBG("create row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(2, [{[cntStatus, Idx2], ?createAndGo}]),
-
- ?DBG("get-next (cntIndex)",[]),
- gn([[cntIndex]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, [{[cntStatus,Idx1], ?active}]),
- expect(3, [{[cntCnt,Idx1], 0}])),
- % Delete the rows
- ?DBG("delete row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(4, [{[cntStatus, Idx1], ?destroy}]),
- ?DBG("delete row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(5, [{[cntStatus, Idx2], ?destroy}]),
- catch snmpa:verbosity(MA,log),
- ?DBG("done",[]),
- ok.
-
-%% Req. Test1
-opaque_test() ->
- p("Testing Opaque datatype..."),
- g([[opaqueObj,0]]),
- ?line expect(1, [{[opaqueObj,0], "opaque-data"}]).
-
-%% Req. OLD-SNMPEA-MIB
-api_test(MaNode) ->
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [intAgentIpAddress]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp,
- oid_to_name, [OID]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [[1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int, [intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp,
- int_to_enum, ['RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['xxRowStatus', 1]),
- ?line case snmp:date_and_time() of
- List when list(List), length(List) == 8 -> ok;
- List when list(List), length(List) == 11 -> ok
- end.
-
-%% Req. Klas3
-api_test2() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]),
- g([[fname4,0]]),
- ?line expect(2, [{[fname4,0], 1}]).
-
-api_test3() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]).
-
-
-unreg_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[snmpInPkts, 0], any}]).
-
-load_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[fname,0], ""}]).
-
-%% Req. Klas1
-load_test_sa() ->
- gn([[?v1_2(sysServices,sysORLastChange), 0]]),
- ?line expect(1, [{[fname,0], any}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_get() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0], Key1c4, [fname,0],Key1c3,
- [sysName,0]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,0], "test"}]),
- g([[1,3,7,1], Key1c4, [sysDescr,0], [1,3,7,2], Key1c3, [sysDescr,0]]),
- ?line ?v1_2(expect(2, noSuchName, [1,4], any),
- expect(2, [{[1,3,7,1], noSuchObject},
- {Key1c4, 2},
- {[sysDescr,0], "Erlang SNMP agent"},
- {[1,3,7,2], noSuchObject},
- {Key1c3, 2},
- {[sysDescr,0], "Erlang SNMP agent"}])).
-
-%% Req. v1, system group, Klas1, OLD-SNMPEA-MIB, *ej* Klas3.
-do_mul_get_err() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0],Key1c4,[fname,0], Key1c3, [sysName,2]]),
- ?line ?v1_2(expect(1, noSuchName, 5, any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,2], noSuchInstance}])),
- g([[sysDescr,0],Key1c4,[fname3,0], Key1c3, [sysName,1]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname3,0], noSuchObject},
- {Key1c3, 2},
- {[sysName,1], noSuchInstance}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [fname],Key1c3s,[sysName]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2}, {[fname,0], "test set"},
- {Key1c3, 2}, {[sysName,0], "test"}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next_err() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [1,3,6,999], [fname],[1,3,90], Key1c3s,[sysName]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[1,3,6,999], endOfMibView},
- {[fname,0], "test set"},
- {[1,3,90], endOfMibView},
- {Key1c3, 2},
- {[sysName,0], "test"}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set() ->
- p("Adding one row in subagent table, and one in master table"),
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, [{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [sysLocation,0],
- [friendsEntry, [3, 3]]]),
- ?line expect(2, [{[friendsEntry, [2, 3]], "kompis3"},
- {[sysLocation,0], "new_value"},
- {[friendsEntry, [3, 3]], ?active}]),
- g([NewKeyc4]),
- ?line expect(3, [{NewKeyc4, 2}]),
- s([{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]),
- ?line expect(4, [{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- p("Adding one row in subagent table, and one in master table"),
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {NewKeyc3, 2},
- {[sysUpTime,0], 45}, % sysUpTime (readOnly)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, notWritable), 3, any),
- g([[friendsEntry, [2, 3]]]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{[friendsEntry, [2,3]], noSuchInstance}])),
- g([NewKeyc4]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB
-sa_mib() ->
- g([[sa, [2,0]]]),
- ?line expect(1, [{[sa, [2,0]], 3}]),
- s([{[sa, [1,0]], s, "sa_test"}]),
- ?line expect(2, [{[sa, [1,0]], "sa_test"}]).
-
-ma_trap1(MA) ->
- snmpa:send_trap(MA, testTrap2, "standard trap"),
- ?line expect(1, trap, [system], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]),
- snmpa:send_trap(MA, testTrap1, "standard trap"),
- ?line expect(2, trap, [1,2,3] , 1, 0, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]).
-
-ma_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap2(MA) ->
- snmpa:send_trap(MA,linkUp,"standard trap",[{ifIndex, [1], 1},
- {ifAdminStatus, [1], 1},
- {ifOperStatus, [1], 2}]),
- ?line expect(3, trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
- {[ifAdminStatus, 1], 1},
- {[ifOperStatus, 1], 2}]).
-
-sa_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(5, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "pelle"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(6, trap, [ericsson], 6, 2, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]}]).
-
-ma_v2_trap1(MA) ->
- ?DBG("ma_v2_traps -> entry with MA = ~p => "
- "send standard trap: testTrapv22",[MA]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_traps -> send standard trap: testTrapv21",[]),
- snmpa:send_trap(MA, testTrapv21, "standard trap"),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmp ++ [1]}]).
-
-ma_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"}]).
-
-%% Note: This test case takes a while... actually a couple of minutes.
-ma_v2_inform1(MA) ->
- ?DBG("ma_v2_inform -> entry with MA = ~p => "
- "send notification: testTrapv22",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver, "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag1, self()},
- "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag1, [_]} ->
- ok;
- {snmp_targets, tag1, Addrs1} ->
- ?line ?FAIL({bad_addrs, Addrs1})
- after
- 5000 ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag1, {got_response, _}} ->
- ok;
- {snmp_notification, tag1, {no_response, _}} ->
- ?line ?FAIL(no_response)
- after
- 20000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
-
- %%
- %% -- The rest is possibly erroneous...
- %%
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag2, self()},
- "standard inform", []),
- ?line expect(2, {inform, false},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag2, [_]} ->
- ok;
- {snmp_targets, tag2, Addrs2} ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag2) timeout",[]),
- ?line ?FAIL({bad_addrs, Addrs2})
- after
- 5000 ->
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag2, {got_response, _}} ->
- ?line ?FAIL(got_response);
- {snmp_notification, tag2, {no_response, _}} ->
- ok
- after
- 240000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag2) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end.
-
-
-ma_v1_2_v2_trap(MA) ->
- snmpa:send_trap(MA,linkDown,"standard trap",[{ifIndex, [1], 1}]),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmpTraps ++ [3]},
- {[ifIndex, 1], 1},
- {[snmpTrapEnterprise, 0], [1,2,3]}]).
-
-
-ma_v1_2_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"},
- {[snmpTrapEnterprise, 0], ?system}]).
-
-
-sa_v1_2_v2_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-sa_v1_2_v2_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]], "pelle"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-sa_v1_2_v2_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 2]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_bad_value() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 5}, % badValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, badValue, 2, any),
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 6}, % wrongValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, ?v1_2(badValue, wrongValue), 2, any),
- g([NewKeyc4]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_gen_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},{NewKeyc4, 2},
- {NewKeyc5, ?createAndGo}, {[sa, [3,0]], 5}]),
- ?line expect(1, genErr, 4, any),
-% The row might have been added; we don't know.
-% (as a matter of fact we do - it is added, because the agent
-% first sets its own vars, and then th SAs. Lets destroy it.
- s([{NewKeyc5, ?destroy}]),
- ?line expect(2, [{NewKeyc5, ?destroy}]).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_too_big() ->
- g([[sa, [4,0]]]),
- ?line expect(1, tooBig).
-
-%% Req. Klas1, system group, snmp group (v1/v2)
-next_across_sa() ->
- gn([[sysDescr],[klas1,5]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {[snmpInPkts, 0], any}]).
-
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]). -> noError
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]). -> {badValue, 2}
-%% snmp_test_mgr:s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]). -> {genErr, 2}
-%% Req. Klas3, Klas4
-undo_test() ->
- s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- ?line expect(1, [{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]),
- ?line expect(2, ?v1_2(badValue, inconsistentValue), 2, any),
- s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]),
- ?line expect(3, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]),
- ?line expect(4, ?v1_2(genErr, commitFailed), 1, any),
-% unfortunatly we don't know if we'll get undoFailed or commitFailed.
-% it depends on which order the agent traverses the varbind list.
-% s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]),
-% ?line expect(5, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]),
- ?line expect(6, genErr, 2, any).
-
-%% Req. Klas3, Klas4
-bad_return() ->
- g([[fStatus4,4],
- [fName4,4]]),
- ?line expect(4, genErr, 2, any),
- g([[fStatus4,5],
- [fName4,5]]),
- ?line expect(5, genErr, 1, any),
- g([[fStatus4,6],
- [fName4,6]]),
- ?line expect(6, genErr, 2, any),
- gn([[fStatus4,7],
- [fName4,7]]),
- ?line expect(7, genErr, 2, any),
- gn([[fStatus4,8],
- [fName4,8]]),
- ?line expect(8, genErr, 1, any),
- gn([[fStatus4,9],
- [fName4,9]]),
- ?line expect(9, genErr, 2, any).
-
-
-%%%-----------------------------------------------------------------
-%%% Test the implementation of standard mibs.
-%%% We should *at least* try to GET all variables, just to make
-%%% sure the instrumentation functions work.
-%%% Note that many of the functions in the standard mib is
-%%% already tested by the normal tests.
-%%%-----------------------------------------------------------------
-
-
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v1.
-%% o Test the counters and control objects in SNMP-STANDARD-MIB
-%%-----------------------------------------------------------------
-snmp_standard_mib(suite) -> [];
-snmp_standard_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?DBG("snmp_standard_mib -> std_mib_init", []),
- try_test(std_mib_init),
-
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- InBadVsns = try_test(std_mib_a),
- put(vsn, v2),
- ?DBG("snmp_standard_mib -> std_mib_read", []),
- try_test(std_mib_read),
- put(vsn, v1),
-
- ?DBG("snmp_standard_mib -> std_mib_b (~w)", [InBadVsns]),
- Bad = try_test(std_mib_b, [InBadVsns]),
- ?DBG("snmp_standard_mib -> std_mib_read (community: 'bad community')", []),
- try_test(std_mib_read, [], [{community, "bad community"}]),
- ?DBG("snmp_standard_mib -> std_mib_write (community: 'public')", []),
- try_test(std_mib_write, [], [{community, "public"}]),
- ?DBG("snmp_standard_mib -> std_mib_asn_err", []),
- try_test(std_mib_asn_err),
- ?DBG("snmp_standard_mib -> std_mib_c (~w)", [Bad]),
- try_test(std_mib_c, [Bad]),
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- try_test(standard_mib_a),
-
- ?DBG("snmp_standard_mib -> std_mib_finish", []),
- try_test(std_mib_finish),
- ?DBG("snmp_standard_mib -> std_mib_test_finish", []),
- try_test(standard_mib_test_finish, [], [{community, "bad community"}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_a() ->
- ?line [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
- ?line [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
- ?line OutPkts2 = OutPkts + 1,
- %% There are some more counters we could test here, but it's not that
- %% important, since they are removed from SNMPv2-MIB.
- ok.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_init() ->
- %% disable authentication failure traps. (otherwise w'd get many of
- %% them - this is also a test to see that it works).
- s([{[snmpEnableAuthenTraps,0], 2}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 2}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_finish() ->
- %% enable again
- s([{[snmpEnableAuthenTraps,0], 1}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 1}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_test_finish() ->
- %% force a authenticationFailure
- std_mib_write(),
- %% check that we got a trap
- ?line expect(2, trap, [1,2,3], 4, 0, []).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_read() ->
- ?DBG("std_mib_read -> entry", []),
- g([[sysUpTime,0]]), % try a bad <something>; msg dropped, no reply
- ?DBG("std_mib_read -> await timeout (i.e. no reply)", []),
- ?line expect(1, timeout). % make sure we don't get a trap!
-
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_write() ->
- ?DBG("std_mib_write -> entry", []),
- s([{[sysLocation, 0], "new_value"}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_asn_err() ->
- snmp_test_mgr:send_bytes([48,99,67,12,0,0,0,0,0,0,5]).
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v2 and v3.
-%% o Test the counters and control objects in SNMPv2-MIB
-%%-----------------------------------------------------------------
-snmpv2_mib_2(suite) -> [];
-snmpv2_mib_2(Config) when list(Config) ->
- ?LOG("snmpv2_mib_2 -> start",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?DBG("snmpv2_mib_2 -> standard mib init",[]),
- try_test(std_mib_init),
-
- ?DBG("snmpv2_mib_2 -> get number of (so far) bad versions",[]),
- InBadVsns = try_test(std_mib_a),
-
- ?DBG("snmpv2_mib_2 -> make a bad version read",[]),
- put(vsn, v1),
- try_test(std_mib_read),
-
- ?DBG("snmpv2_mib_2 -> bad version read",[]),
- put(vsn, v2),
- Bad = try_test(std_mib_b, [InBadVsns]),
-
- ?DBG("snmpv2_mib_2 -> read with bad community",[]),
- try_test(std_mib_read, [], [{community, "bad community"}]),
-
- ?DBG("snmpv2_mib_2 -> write with public community",[]),
- try_test(std_mib_write, [], [{community, "public"}]),
-
- ?DBG("snmpv2_mib_2 -> asn err",[]),
- try_test(std_mib_asn_err),
-
- ?DBG("snmpv2_mib_2 -> check counters",[]),
- try_test(std_mib_c, [Bad]),
-
- ?DBG("snmpv2_mib_2 -> get som counters",[]),
- try_test(snmpv2_mib_a),
-
- ?DBG("snmpv2_mib_2 -> enable auth traps, and await some",[]),
- try_test(std_mib_finish),
-
- ?DBG("snmpv2_mib_2 -> force auth failure, and await trap, "
- "then disable auth traps",[]),
- try_test(snmpv2_mib_test_finish, [], [{community, "bad community"}]),
-
- ?LOG("snmpv2_mib_2 -> done",[]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_3(suite) -> [];
-snmpv2_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- InBadVsns = try_test(std_mib_a),
- put(vsn, v1),
- try_test(std_mib_read),
- put(vsn, v3),
- _Bad = try_test(std_mib_b, [InBadVsns]),
- try_test(snmpv2_mib_a),
-
- try_test(std_mib_finish).
-
--define(authenticationFailure, [1,3,6,1,6,3,1,1,5,5]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_test_finish() ->
- %% force a authenticationFailure
- ?DBG("ma_v2_inform -> write to std mib",[]),
- std_mib_write(),
-
- %% check that we got a trap
- ?DBG("ma_v2_inform -> await trap",[]),
- ?line expect(2, v2trap, [{[sysUpTime,0], any},
- {[snmpTrapOID,0], ?authenticationFailure}]),
-
- %% and the the inform
- ?DBG("ma_v2_inform -> await inform",[]),
- ?line expect(2, {inform,true}, [{[sysUpTime,0], any},
- {[snmpTrapOID,0],?authenticationFailure}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_a() ->
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
-
- ?line [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
- InBadVsns.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_b(InBadVsns) ->
- ?line [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
- ?line InBadVsns2 = InBadVsns + 1,
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
- ?line [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
- get_req(4, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- {InBadCommunityNames, InBadCommunityUses, InASNErrs}.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_c({InBadCommunityNames, InBadCommunityUses, InASNErrs}) ->
- ?line [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
- get_req(1, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- ?line InBadCommunityNames2 = InBadCommunityNames + 1,
- ?line InBadCommunityUses2 = InBadCommunityUses + 1,
- ?line InASNErrs2 = InASNErrs + 1.
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_a() ->
- ?line [SetSerial] = get_req(2, [[snmpSetSerialNo,0]]),
- s([{[snmpSetSerialNo,0], SetSerial}, {[sysLocation, 0], "val2"}]),
- ?line expect(3, [{[snmpSetSerialNo,0], SetSerial},
- {[sysLocation, 0], "val2"}]),
- s([{[sysLocation, 0], "val3"}, {[snmpSetSerialNo,0], SetSerial}]),
- ?line expect(4, inconsistentValue, 2,
- [{[sysLocation, 0], "val3"},
- {[snmpSetSerialNo,0], SetSerial}]),
- ?line ["val2"] = get_req(5, [[sysLocation,0]]).
-
-
-%%-----------------------------------------------------------------
-%% o Bad community uses/name is tested already
-%% in SNMPv2-MIB and STANDARD-MIB.
-%% o Test add/deletion of rows.
-%%-----------------------------------------------------------------
-snmp_community_mib(suite) -> [];
-snmp_community_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- try_test(snmp_community_mib),
- ?line unload_master("SNMP-COMMUNITY-MIB").
-
-snmp_community_mib_2(X) -> snmp_community_mib(X).
-
-%% Req. SNMP-COMMUNITY-MIB
-snmp_community_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o Test engine boots / time
-%%-----------------------------------------------------------------
-snmp_framework_mib(suite) -> [];
-snmp_framework_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- try_test(snmp_framework_mib),
- ?line unload_master("SNMP-FRAMEWORK-MIB").
-
-snmp_framework_mib_2(X) -> snmp_framework_mib(X).
-
-snmp_framework_mib_3(suite) -> [];
-snmp_framework_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(snmp_framework_mib).
-
-
-%% Req. SNMP-FRAMEWORK-MIB
-snmp_framework_mib() ->
- ?line ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
- ?line [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
- sleep(5000),
- ?line [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
- if
- EngineTime+7 < EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- EngineTime+4 > EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- true -> ok
- end,
- ?line case get_req(4, [[snmpEngineBoots,0]]) of
- [Boots] when integer(Boots) -> ok;
- Else -> ?FAIL(Else)
- end,
- ok.
-
-%%-----------------------------------------------------------------
-%% o Test the counters
-%%-----------------------------------------------------------------
-snmp_mpd_mib_3(suite) -> [];
-snmp_mpd_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- UnknownPDUHs = try_test(snmp_mpd_mib_a),
- try_test(snmp_mpd_mib_b, [], [{context_engine_id, "bad engine"}]),
- try_test(snmp_mpd_mib_c, [UnknownPDUHs]).
-
-
-%% Req. SNMP-MPD-MIB
-snmp_mpd_mib_a() ->
- ?line [UnknownSecs, InvalidMsgs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0]]),
- Pdu = #pdu{type = 'get-request',
- request_id = 23,
- error_status = noError,
- error_index = 0,
- varbinds = []},
- SPdu = #scopedPdu{contextEngineID = "agentEngine",
- contextName = "",
- data = Pdu},
- ?line SPDUBytes = snmp_pdus:enc_scoped_pdu(SPdu),
- V3Hdr1 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [7],
- msgSecurityModel = 23, % bad sec model
- msgSecurityParameters = []},
- V3Hdr2 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [6], % bad flag combination
- msgSecurityModel = 3,
- msgSecurityParameters = []},
- Message1 = #message{version = 'version-3', vsn_hdr = V3Hdr1,
- data = SPDUBytes},
- Message2 = #message{version = 'version-3', vsn_hdr = V3Hdr2,
- data = SPDUBytes},
- ?line MsgBytes1 = snmp_pdus:enc_message_only(Message1),
- ?line MsgBytes2 = snmp_pdus:enc_message_only(Message2),
- snmp_test_mgr:send_bytes(MsgBytes1),
- snmp_test_mgr:send_bytes(MsgBytes2),
-
- ?line [UnknownSecs2, InvalidMsgs2, UnknownPDUHs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0],
- [snmpUnknownPDUHandlers, 0]]),
- ?line UnknownSecs2 = UnknownSecs + 1,
- ?line InvalidMsgs2 = InvalidMsgs + 1,
- UnknownPDUHs.
-
--define(snmpUnknownPDUHandlers_instance, [1,3,6,1,6,3,11,2,1,3,0]).
-snmp_mpd_mib_b() ->
- g([[sysUpTime,0]]),
- ?line expect(1, report, [{?snmpUnknownPDUHandlers_instance, any}]).
-
-
-snmp_mpd_mib_c(UnknownPDUHs) ->
- ?line [UnknownPDUHs2] = get_req(1, [[snmpUnknownPDUHandlers, 0]]),
- ?line UnknownPDUHs2 = UnknownPDUHs + 1.
-
-
-snmp_target_mib(suite) -> [];
-snmp_target_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-TARGET-MIB"),
- try_test(snmp_target_mib),
- ?line unload_master("SNMP-TARGET-MIB").
-
-snmp_target_mib_2(X) -> snmp_target_mib(X).
-
-snmp_target_mib_3(X) -> snmp_target_mib(X).
-
-snmp_target_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-snmp_notification_mib(suite) -> [];
-snmp_notification_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- try_test(snmp_notification_mib),
- ?line unload_master("SNMP-NOTIFICATION-MIB").
-
-snmp_notification_mib_2(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib_3(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o add/delete views and try them
-%% o try boundaries
-%%-----------------------------------------------------------------
-snmp_view_based_acm_mib(suite) -> [];
-snmp_view_based_acm_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master("Test2"),
- snmp_view_based_acm_mib(),
- ?line unload_master("Test2"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-snmp_view_based_acm_mib_2(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib_3(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib() ->
- snmpa:verbosity(net_if,trace),
- snmpa:verbosity(master_agent,trace),
- ?LOG("start snmp_view_based_acm_mib test",[]),
- %% The user "no-rights" is present in USM, and is mapped to security
- %% name 'no-rights", which is not present in VACM.
- %% So, we'll add rights for it, try them and delete them.
- %% We'll give "no-rights" write access to tDescr.0 and read access
- %% to tDescr2.0
- %% These are the options we'll use to the mgr
- Opts = [{user, "no-rights"}, {community, "no-rights"}],
- %% Find the valid secmodel, and one invalid secmodel.
- {SecMod, InvSecMod} =
- case get(vsn) of
- v1 -> {?SEC_V1, ?SEC_V2C};
- v2 -> {?SEC_V2C, ?SEC_USM};
- v3 -> {?SEC_USM, ?SEC_V1}
- end,
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Now, add a mapping from "no-rights" -> "no-rights-group"
- GRow1Status = [vacmSecurityToGroupStatus,[SecMod, 9,"no-rights"]],
- GRow1 =
- [{[vacmGroupName, [SecMod, 9,"no-rights"]], "no-rights-group"},
- {GRow1Status, ?createAndGo}],
- ?DBG("set '~p'",[GRow1]),
- ?line try_test(do_set, [GRow1]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create a mapping for another sec model, and make sure it dosn't
- %% give us access
- GRow2Status = [vacmSecurityToGroupStatus,[InvSecMod, 9,"no-rights"]],
- GRow2 = [{[vacmGroupName, [InvSecMod, 9, "no-rights"]], "initial"},
- {GRow2Status, ?createAndGo}],
-
- ?DBG("set '~p'",[GRow2]),
- ?line try_test(do_set, [GRow2]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [GRow2Status]),
-
- RVName = "rv_name",
- WVName = "wv_name",
-
- %% Access row
- ARow1Idx = [15 | "no-rights-group"] ++ [0, ?SEC_ANY, 1],
- ARow1Status = [vacmAccessStatus, ARow1Idx],
- ARow1 = [{[vacmAccessContextMatch, ARow1Idx], 1},
- {[vacmAccessReadViewName, ARow1Idx], RVName},
- {[vacmAccessWriteViewName, ARow1Idx], WVName},
- {ARow1Status, ?createAndGo}],
-
- %% This access row would give acces, if InvSecMod was valid.
- ARow2Idx = [15 | "no-rights-group"] ++ [0, InvSecMod, 1],
- ARow2Status = [vacmAccessStatus, ARow2Idx],
- ARow2 = [{[vacmAccessContextMatch, ARow2Idx], 1},
- {[vacmAccessReadViewName, ARow2Idx], "internet"},
- {[vacmAccessWriteViewName, ARow2Idx], "internet"},
- {ARow2Status, ?createAndGo}],
-
- ?line try_test(do_set, [ARow2]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [ARow2Status]),
-
-
- %% Add valid row
- ?line try_test(do_set, [ARow1]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create the view family
- VRow1Idx = mk_ln(RVName) ++ mk_ln(?xDescr), % object access
- VRow2Idx = mk_ln(RVName) ++ mk_ln(?xDescr2 ++ [0]), % instance access
- VRow3Idx = mk_ln(WVName) ++ mk_ln(?xDescr), % object access
- VRow4Idx = mk_ln(WVName) ++ mk_ln(?xDescr ++ [0]), % instance access
- VRow1Status = [vacmViewTreeFamilyStatus, VRow1Idx],
- VRow2Status = [vacmViewTreeFamilyStatus, VRow2Idx],
- VRow3Status = [vacmViewTreeFamilyStatus, VRow3Idx],
- VRow4Status = [vacmViewTreeFamilyStatus, VRow4Idx],
-
- ?line try_test(add_row, [VRow1Status]),
- ?line try_test(add_row, [VRow2Status]),
- ?line try_test(add_row, [VRow3Status]),
-
- %% We're supposed to have access now...
- ?line try_test(use_rights, [], Opts),
-
- %% Change Row3 to Row4
- ?line try_test(del_row, [VRow3Status]),
- ?line try_test(add_row, [VRow4Status]),
-
- %% We should still have access...
- ?line try_test(use_rights, [], Opts),
-
- %% Delete rows
- ?line try_test(del_row, [GRow1Status]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete rest of rows
- ?line try_test(del_row, [ARow1Status]),
- ?line try_test(del_row, [VRow1Status]),
- ?line try_test(del_row, [VRow2Status]),
- ?line try_test(del_row, [VRow4Status]),
-
- ?line try_test(use_no_rights, [], Opts),
- snmpa:verbosity(master_agent,log).
-
-do_set(Row) ->
- s(Row),
- expect(1, Row).
-
-add_row(RowStatus) ->
- s([{RowStatus, ?createAndGo}]),
- expect(1, [{RowStatus, ?createAndGo}]).
-
-del_row(RowStatus) ->
- s([{RowStatus, ?destroy}]),
- expect(1, [{RowStatus, ?destroy}]).
-
-
-
-use_no_rights() ->
- g([[xDescr,0]]),
- ?v1_2_3(expect(11, noSuchName, 1, any),
- expect(12, [{[xDescr,0], noSuchObject}]),
- expect(13, authorizationError, 1, any)),
- g([[xDescr2,0]]),
- ?v1_2_3(expect(21, noSuchName, 1, any),
- expect(22, [{[xDescr2,0], noSuchObject}]),
- expect(23, authorizationError, 1, any)),
- gn([[xDescr]]),
- ?v1_2_3(expect(31, noSuchName, 1, any),
- expect(32, [{[xDescr], endOfMibView}]),
- expect(33, authorizationError, 1, any)),
- s([{[xDescr,0], "tryit"}]),
- ?v1_2_3(expect(41, noSuchName, 1, any),
- expect(42, noAccess, 1, any),
- expect(43, authorizationError, 1, any)).
-
-
-use_rights() ->
- g([[xDescr,0]]),
- expect(1, [{[xDescr,0], any}]),
- g([[xDescr2,0]]),
- expect(2, [{[xDescr2,0], any}]),
- s([{[xDescr,0], "tryit"}]),
- expect(3, noError, 0, any),
- g([[xDescr,0]]),
- expect(4, [{[xDescr,0], "tryit"}]).
-
-mk_ln(X) ->
- [length(X) | X].
-
-%%-----------------------------------------------------------------
-%% o add/delete users and try them
-%% o test all secLevels
-%% o test all combinations of protocols
-%% o try bad ops; check counters
-%%-----------------------------------------------------------------
-snmp_user_based_sm_mib_3(suite) -> [];
-snmp_user_based_sm_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- _AgentDir = ?config(agent_dir, Config),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
-
- %% The newUser used here already has VACM access.
-
- %% Add a new user in the simplest way; just createAndGo
- try_test(v3_sync, [[{usm_add_user1, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new user
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey1 = snmp:passwd2localized_key(sha, "new sha password", "agentEngine"),
- DesKey1 = lists:sublist(ShaKey1, 16),
-
- %% Change the new user's keys - 1
- try_test(v3_sync, [[{usm_key_change1, [ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- MgrDir = ?config(mgr_dir, Config),
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey2 = snmp:passwd2localized_key(sha, "newer password", "agentEngine"),
- DesKey2 = lists:sublist(ShaKey2, 16),
-
- %% Change the new user's keys - 2
- ?line try_test(v3_sync,
- [[{usm_key_change2, [ShaKey1, DesKey1, ShaKey2, DesKey2]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- reset_usm_mgr(MgrDir),
- ?line rewrite_usm_mgr(MgrDir, ShaKey2, DesKey2),
- ?line load_master("Test2"),
- ?line try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Change the new user's keys - 3
- ?line try_test(v3_sync,
- [[{usm_key_change3, [ShaKey2, DesKey2, ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new keys
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Try some read requests
- ?line try_test(v3_sync, [[{usm_read, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Delete the new user
- ?line try_test(v3_sync, [[{usm_del_user, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try some bad requests
- ?line try_test(v3_sync, [[{usm_bad, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("SNMP-USER-BASED-SM-MIB").
-
--define(usmUserSecurityName, [1,3,6,1,6,3,15,1,2,2,1,3]).
-
-usm_add_user1() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
-usm_use_user() ->
- v2_proc().
-
-
-%% Change own public keys
-usm_key_change1(ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_shaxxxxxxxxxx",
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_desxxxxxx",
- DesKey),
- Vbs1 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change own private keys
-usm_key_change2(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change other's public keys
-usm_key_change3(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange}],
- s(Vbs1),
- ?line expect(1, noAccess, 1, any),
- Vbs2 = [{[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs2),
- ?line expect(2, noAccess, 1, any),
-
-
- Vbs3 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs3),
- ?line expect(1, Vbs3).
-
-usm_read() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ?line g([[usmUserSecurityName, NewRowIndex],
- [usmUserCloneFrom, NewRowIndex],
- [usmUserAuthKeyChange, NewRowIndex],
- [usmUserOwnAuthKeyChange, NewRowIndex],
- [usmUserPrivKeyChange, NewRowIndex],
- [usmUserOwnPrivKeyChange, NewRowIndex]]),
- ?line expect(1,
- [{[usmUserSecurityName, NewRowIndex], "newUser"},
- {[usmUserCloneFrom, NewRowIndex], [0,0]},
- {[usmUserAuthKeyChange, NewRowIndex], ""},
- {[usmUserOwnAuthKeyChange, NewRowIndex], ""},
- {[usmUserPrivKeyChange, NewRowIndex], ""},
- {[usmUserOwnPrivKeyChange, NewRowIndex], ""}]),
- ok.
-
-
-
-usm_del_user() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- Vbs1 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
--define(usmUserCloneFrom, [1,3,6,1,6,3,15,1,2,2,1,4]).
-
--define(usmNoAuthProtocol, [1,3,6,1,6,3,10,1,1,1]).
-
--define(usmHMACMD5AuthProtocol, [1,3,6,1,6,3,10,1,1,2]).
-
--define(usmHMACSHAAuthProtocol, [1,3,6,1,6,3,10,1,1,3]).
-
--define(usmNoPrivProtocol, [1,3,6,1,6,3,10,1,2,1]).
-
--define(usmDESPrivProtocol, [1,3,6,1,6,3,10,1,2,2]).
-
-usm_bad() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer1 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDOS"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer1},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, inconsistentName, 1, any),
-
- RowPointer2 = ?usmUserCloneFrom ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs2 = [{[usmUserCloneFrom, NewRowIndex], RowPointer2},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs2),
- ?line expect(2, wrongValue, 1, any),
-
- RowPointer3 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs3 = [{[usmUserCloneFrom, NewRowIndex], RowPointer3},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs3),
- ?line expect(3, Vbs3),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmNoAuthProtocol}]),
- ?line expect(4, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmHMACMD5AuthProtocol}]),
- ?line expect(5, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmDESPrivProtocol}]),
- ?line expect(6, wrongValue, 1, any),
- ?line s([{[usmUserPrivProtocol, NewRowIndex], ?usmHMACSHAAuthProtocol}]),
- ?line expect(7, wrongValue, 1, any),
-
- Vbs4 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs4),
- ?line expect(1, Vbs4),
-
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Loop through entire MIB, to make sure that all instrum. funcs
-%% works.
-%% Load all std mibs that are not loaded by default.
-%%-----------------------------------------------------------------
-loop_mib(suite) -> [];
-loop_mib(Config) when list(Config) ->
- ?LOG("loop_mib -> initiate case",[]),
- %% snmpa:verbosity(master_agent,debug),
- %% snmpa:verbosity(mib_server,info),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib -> load mib SNMP-COMMUNITY-MIB",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> load mib SNMP-MPD-MIB",[]),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> load mib SNMP-TARGET-MIB",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> load mib SNMP-NOTIFICATION-MIB",[]),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> load mib SNMP-FRAMEWORK-MIB",[]),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> load mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?DBG("loop_mib -> try",[]),
- try_test(loop_mib_1),
- ?DBG("loop_mib -> unload mib SNMP-COMMUNITY-MIB",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-MPD-MIB",[]),
- ?line unload_master("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-TARGET-MIB",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-NOTIFICATION-MIB",[]),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-FRAMEWORK-MIB",[]),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- %% snmpa:verbosity(master_agent,log),
- %% snmpa:verbosity(mib_server,silence),
- ?LOG("loop_mib -> done",[]).
-
-
-loop_mib_2(suite) -> [];
-loop_mib_2(Config) when list(Config) ->
- ?LOG("loop_mib_2 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_2 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_2 -> load mibs",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_2 -> unload mibs",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?LOG("loop_mib_2 -> done",[]).
-
-
-loop_mib_3(suite) -> [];
-loop_mib_3(Config) when list(Config) ->
- ?LOG("loop_mib_3 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_3 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_3 -> load mibs",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_3 -> unload mibs",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?LOG("loop_mib_3 -> done",[]).
-
-
-%% Req. As many mibs all possible
-loop_mib_1() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_1([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_1(Oid, N) ->
- ?DBG("loop_it_1 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_1 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_1 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_1(NOid, N+1);
- #pdu{type='get-response', error_status=noSuchName, error_index=1,
- varbinds=[_]} ->
- ?DBG("loop_it_1 -> done",[]),
- N;
-
- #pdu{type = Type, error_status = Err, error_index = Idx,
- varbinds = Vbs} ->
- exit({unexpected_pdu, ?LINE, Type, Err, Idx, Vbs})
- end.
-
-%% Req. As many mibs all possible
-loop_mib_2() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_2([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_2(Oid, N) ->
- ?DBG("loop_it_2 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid, value = endOfMibView}]} ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p",[NOid]),
- N;
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_2 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_2(NOid, N+1)
- end.
-
-
-%%%-----------------------------------------------------------------
-%%% Testing of reported bugs and other tickets.
-%%%-----------------------------------------------------------------
-
-
-
-
-
-%% These are (ticket) test cases where the initiation has to be done
-%% individually.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1128
-%% Slogan: Bug in handling of createAndWait set-requests.
-%%-----------------------------------------------------------------
-otp_1128(suite) -> [];
-otp_1128(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1128),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1128_2(X) -> otp_1128(X).
-
-otp_1128_3(X) -> otp_1128(X).
-
-otp_1128() ->
- io:format("Testing bug reported in ticket OTP-1128...~n"),
-
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
-
- s([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- ?line expect(28, [{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(29, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- ?line expect(30, [{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(31, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(32, [{NewKeyc5, ?destroy}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1129, OTP-1169
-%% Slogan: snmpa:int_to_enum crashes on bad oids
-%%-----------------------------------------------------------------
-otp_1129(suite) -> [];
-otp_1129(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- try_test(otp_1129_i, [node()]),
- ?line unload_master("Klas3").
-
-otp_1129_2(X) -> otp_1129(X).
-
-otp_1129_3(X) -> otp_1129(X).
-
-otp_1129_i(MaNode) ->
- io:format("Testing bug reported in ticket OTP-1129...~n"),
- false = rpc:call(MaNode, snmp, int_to_enum, [iso, 1]),
- false = rpc:call(MaNode, snmp, int_to_enum, [isox, 1]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1131
-%% Slogan: Agent crashes / erlang node halts if RowIndex in a
-%% setrequest is of bad type, e.g. an INDEX {INTEGER},
-%% and RowIdenx [3,2].
-%%-----------------------------------------------------------------
-otp_1131(suite) -> [];
-otp_1131(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas1"),
- try_test(otp_1131),
- ?line unload_master("Klas1").
-
-otp_1131_2(X) -> otp_1131(X).
-
-otp_1131_3(X) -> otp_1131(X).
-
-otp_1131() ->
- io:format("Testing bug reported in ticket OTP-1131...~n"),
- s([{[friendsEntry, [2, 3, 1]], s, "kompis3"},
- {[friendsEntry, [3, 3, 1]], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 2, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1162
-%% Slogan: snmp_agent can't handle wrongValue from instrum.func
-%%-----------------------------------------------------------------
-otp_1162(suite) -> [];
-otp_1162(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
- try_test(otp_1162),
- stop_subagent(SA).
-
-otp_1162_2(X) -> otp_1162(X).
-
-otp_1162_3(X) -> otp_1162(X).
-
-otp_1162() ->
- s([{[sa, [2,0]], 6}]), % wrongValue (i is_set_ok)
- ?line expect(1, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1222
-%% Slogan: snmp agent crash if faulty index is returned from instrum
-%%-----------------------------------------------------------------
-otp_1222(suite) -> [];
-otp_1222(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- ?line load_master("Klas4"),
- try_test(otp_1222),
- ?line unload_master("Klas3"),
- ?line unload_master("Klas4").
-
-otp_1222_2(X) -> otp_1222(X).
-
-otp_1222_3(X) -> otp_1222(X).
-
-otp_1222() ->
- io:format("Testing bug reported in ticket OTP-1222...~n"),
- s([{[fStatus4,1], 4}, {[fName4,1], 1}]),
- ?line expect(1, genErr, 0, any),
- s([{[fStatus4,2], 4}, {[fName4,2], 1}]),
- ?line expect(2, genErr, 0, any).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1298
-%% Slogan: Negative INTEGER values are treated as positive.
-%%-----------------------------------------------------------------
-otp_1298(suite) -> [];
-otp_1298(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1298),
- ?line unload_master("Klas2").
-
-otp_1298_2(X) -> otp_1298(X).
-
-otp_1298_3(X) -> otp_1298(X).
-
-otp_1298() ->
- io:format("Testing bug reported in ticket OTP-1298...~n"),
- s([{[fint,0], -1}]),
- ?line expect(1298, [{[fint,0], -1}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1331
-%% Slogan: snmp_generic should return noError when deleting non-ex row
-%%-----------------------------------------------------------------
-otp_1331(suite) -> [];
-otp_1331(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1331),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1331_2(X) -> otp_1331(X).
-
-otp_1331_3(X) -> otp_1331(X).
-
-otp_1331() ->
- NewKeyc5 = [intCommunityStatus,[127,32,0,0],is("test")],
- s([{NewKeyc5, ?destroy}]),
- ?line expect(1, [{NewKeyc5, ?destroy}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1338
-%% Slogan: snmp bug in initialisation of default values for mnesia tabs
-%%-----------------------------------------------------------------
-otp_1338(suite) -> [];
-otp_1338(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1338),
- ?line unload_master("Klas2").
-
-otp_1338_2(X) -> otp_1338(X).
-
-otp_1338_3(X) -> otp_1338(X).
-
-otp_1338() ->
- s([{[kStatus2, 7], i, ?createAndGo}]),
- ?line expect(1, [{[kStatus2, 7], ?createAndGo}]),
- g([[kName2, 7]]),
- ?line expect(2, [{[kName2, 7], "JJJ"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1342
-%% Slogan: default impl of snmp table can't handle bad index access,
-%% Set when INDEX is read-write gets into an infinite loop!
-%%-----------------------------------------------------------------
-otp_1342(suite) -> [];
-otp_1342(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas4"),
- try_test(otp_1342),
- ?line unload_master("Klas4").
-
-otp_1342_2(X) -> otp_1342(X).
-
-otp_1342_3(X) -> otp_1342(X).
-
-otp_1342() ->
- s([{[fIndex5, 1], i, 1},
- {[fName5, 1], i, 3},
- {[fStatus5, 1], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 3, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1366
-%% Slogan: snmp traps not sent to all managers
-%% Note: NYI! We need a way to tell the test server that we need
-%% mgrs on two different machines.
-%%-----------------------------------------------------------------
-otp_1366(suite) -> [];
-otp_1366(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1366),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1366_2(X) -> otp_1366(X).
-
-otp_1366_3(X) -> otp_1366(X).
-
-otp_1366() ->
- ?INF("NOT YET IMPLEMENTED", []),
- 'NYI'.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2776
-%% Slogan: snmp:validate_date_and_time() fails when time is 00:00
-%%-----------------------------------------------------------------
-otp_2776(suite) -> [];
-otp_2776(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_2776).
-
-otp_2776_2(X) -> otp_2776(X).
-
-otp_2776_3(X) -> otp_2776(X).
-
-otp_2776() ->
- io:format("Testing bug reported in ticket OTP-2776...~n"),
-
- Dt01_valid = [19,98,9,1,1,0,23,0,43,0,0],
- Dt02_valid = [19,98,9,1,0,0,0,0,43,0,0], % This is what is fixed: 00:00
- Dt03_valid = [19,98,2,28,1,0,23,0,43,0,0],
- Dt04_invalid = [19,98,2,29,1,0,23,0,43,0,0],
- Dt05_valid = [19,96,2,29,1,0,23,0,43,0,0],
- Dt06_valid = [20,0,2,29,1,0,23,0,43,0,0],
- Dt07_invalid = [19,96,2,30,1,0,23,0,43,0,0], % This is also fixed: 30/2
- Dt08_valid = [19,98,4,30,1,0,23,0,43,0,0],
- Dt09_invalid = [19,98,4,31,1,0,23,0,43,0,0], % This is also fixed: 31/4
- Dt10_invalid = [],
- Dt11_invalid = [kalle,hobbe],
- L = [{ 1, true, Dt01_valid},
- { 2, true, Dt02_valid},
- { 3, true, Dt03_valid},
- { 4, false, Dt04_invalid},
- { 5, true, Dt05_valid},
- { 6, true, Dt06_valid},
- { 7, false, Dt07_invalid},
- { 8, true, Dt08_valid},
- { 9, false, Dt09_invalid},
- {10, false, Dt10_invalid},
- {11, false, Dt11_invalid}],
-
- ?line ok = validate_dat(L).
-
-
-validate_dat(L) -> validate_dat(L,[]).
-
-validate_dat([],V) ->
- Fun = fun({_,X}) -> case X of
- ok -> false;
- _ -> true
- end
- end,
- validate_dat1( lists:reverse( lists:filter(Fun,V) ) );
-validate_dat([{Id,E,Dat}|T],V) ->
- validate_dat(T,[validate_dat2(Id,E,Dat) | V]).
-
-validate_dat1([]) -> ok;
-validate_dat1(L) -> {error,L}.
-
-validate_dat2(Id, E, Dat) ->
- Res = case {E,snmp:validate_date_and_time(Dat)} of
- {E,E} -> ok;
- {E,A} -> {E,A}
- end,
- {Id, Res}.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2979
-%% Slogan: get-next on more than 1 column in an empty table
-%% returns bad response.
-%%-----------------------------------------------------------------
-otp_2979(suite) -> [];
-otp_2979(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Test1"),
- ?line init_old(),
- try_test(otp_2979),
- ?line unload_master("Test1").
-
-otp_2979_2(X) -> otp_2979(X).
-
-otp_2979_3(X) -> otp_2979(X).
-
-otp_2979() ->
- gn([[sparseDescr], [sparseStatus]]),
- ?line expect(1, [{[sparseStr,0], "slut"},
- {[sparseStr,0], "slut"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3187
-%% Slogan: get-next on vacmAccessTable for colums > 5 returns
-%% endOfTable - should return value.
-%%-----------------------------------------------------------------
-otp_3187(suite) -> [];
-otp_3187(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- otp_3187(),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-otp_3187_2(X) -> otp_3187(X).
-
-otp_3187_3(X) -> otp_3187(X).
-
-otp_3187() ->
- ?line Elements =
- snmp_view_based_acm_mib:vacmAccessTable(get_next,[],[4,5,6]),
- lists:foreach(fun(E) ->
- ?line if E == endOfTable ->
- ?FAIL(endOfTable);
- true -> ok
- end
- end, Elements).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3542
-%% Slogan:
-%%-----------------------------------------------------------------
-otp_3542(suite) -> [];
-otp_3542(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_3542).
-
-otp_3542() ->
- io:format("SNMP v3 discovery...~n"),
- ?line Res = snmp_test_mgr:d(),
- io:format("SNMP v3 discovery result: ~p~n",[Res]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3725
-%% Slogan: Slow response time on snmpa:int_to_enum
-%%-----------------------------------------------------------------
-otp_3725(suite) -> [];
-otp_3725(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_3725_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req. OLD-SNMPEA-MIB
-otp_3725_test(MaNode) ->
- io:format("Testing feature requested in ticket OTP-3725...~n"),
- ?line rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
- ?line Db = rpc:call(MaNode,snmp,get_symbolic_store_db,[]),
- ?DBG("otp_3725_test -> Db = ~p",[Db]),
-
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [Db, intAgentIpAddress]),
- ?DBG("otp_3725_test -> name_to_oid for ~p: ~p",[intAgentIpAddress,OID]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp, oid_to_name,
- [Db,OID]),
- ?DBG("otp_3725_test -> oid_to_name for ~p: ~p",[OID,intAgentIpAddress]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [Db, intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [Db, [1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, 'RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'xxRowStatus', 1]),
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-4394
-%% Slogan: Target mib tag list check invalid
-%%-----------------------------------------------------------------
-
-
-
-init_otp_4394(Config) when list(Config) ->
- ?DBG("init_otp_4394 -> entry with"
- "~n Config: ~p", [Config]),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line otp_4394_config(AgentDir, MgrDir, Ip),
- MasterAgentVerbosity = {master_agent_verbosity, trace},
- NetIfVerbosity = {net_if_verbosity, trace},
- Opts = [MasterAgentVerbosity,NetIfVerbosity],
- [{vsn, v1} | start_v1_agent(Config,Opts)].
-
-otp_4394_config(AgentDir, MgrDir, Ip0) ->
- ?DBG("otp_4394_config -> entry with"
- "~n AgentDir: ~p"
- "~n MgrDir: ~p"
- "~n Ip0: ~p", [AgentDir, MgrDir, Ip0]),
- Vsn = [v1],
- Ip = tuple_to_list(Ip0),
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsn, Ip,
- ?TRAP_UDP, Ip, 4000,
- "OTP-4394 test"),
- ?line case update_usm(Vsn, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsn, MgrDir);
- false ->
- ?line ok
- end,
- C1 = {"a", "all-rights", "initial", "", "pc"},
- C2 = {"c", "secret", "secret_name", "", "secret_tag"},
- ?line write_community_conf(AgentDir, [C1, C2]),
- ?line update_vacm(Vsn, AgentDir),
- Ta1 = {"shelob v1",
- [134,138,177,177], 5000, 1500, 3, %% Använd Ip och modda
- "pc1",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [],
- 2048},
- Ta2 = {"bifur v1",
- [134,138,177,75], 5000, 1500, 3, %% Använd Ip
- "pc2",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [], 2048},
- ?line write_target_addr_conf(AgentDir, [Ta1, Ta2]),
- ?line write_target_params_conf(AgentDir, Vsn),
- ?line write_notify_conf(AgentDir),
- ok.
-
-
-
-finish_otp_4394(Config) when list(Config) ->
- ?DBG("finish_otp_4394 -> entry", []),
- C1 = stop_agent(Config),
- delete_files(C1),
- erase(mgr_node),
- lists:keydelete(vsn, 1, C1).
-
-otp_4394_test(suite) -> [];
-otp_4394_test(Config) ->
- ?DBG("otp_4394_test -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_4394_test1),
- ?DBG("otp_4394_test -> done", []),
- ok.
-
-otp_4394_test1() ->
- ?DBG("otp_4394_test1 -> entry", []),
- gn([[1,1]]),
- Res =
- case snmp_test_mgr:expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]) of
- %% {error, 1, {"?",[]}, {"~w",[timeout]}}
- {error, 1, _, {_, [timeout]}} ->
- ?DBG("otp_4394_test1 -> expected result: timeout", []),
- ok;
- Else ->
- Else
- end,
- ?DBG("otp_4394_test1 -> done with: ~p", [Res]),
- Res.
-
-
-%%%--------------------------------------------------
-%%% Used to test the standard mib with our
-%%% configuration.
-%%%--------------------------------------------------
-run(F, A, Opts) ->
- M = get(mib_dir),
- Dir = get(mgr_dir),
- User = snmp_misc:get_option(user, Opts, "all-rights"),
- SecLevel = snmp_misc:get_option(sec_level, Opts, noAuthNoPriv),
- EngineID = snmp_misc:get_option(engine_id, Opts, "agentEngine"),
- CtxEngineID = snmp_misc:get_option(context_engine_id, Opts, EngineID),
- Community = snmp_misc:get_option(community, Opts, "all-rights"),
- ?DBG("run -> start crypto app",[]),
- Crypto = ?CRYPTO_START(),
- ?DBG("run -> Crypto: ~p",[Crypto]),
- catch snmp_test_mgr:stop(), % If we had a running mgr from a failed case
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- ?DBG("run -> config:~n"
- "\tM: ~p~n"
- "\tDir: ~p~n"
- "\tUser: ~p~n"
- "\tSecLevel: ~p~n"
- "\tEngineID: ~p~n"
- "\tCtxEngineID: ~p~n"
- "\tCommunity: ~p~n"
- "\tStdM: ~p",
- [M,Dir,User,SecLevel,EngineID,CtxEngineID,Community,StdM]),
- case snmp_test_mgr:start([%% {agent, snmp_test_lib:hostname()},
- {packet_server_debug,true},
- {debug,true},
- {agent, get(master_host)},
- {agent_udp, 4000},
- {trap_udp, 5000},
- {recbuf,65535},
- quiet,
- get(vsn),
- {community, Community},
- {user, User},
- {sec_level, SecLevel},
- {engine_id, EngineID},
- {context_engine_id, CtxEngineID},
- {dir, Dir},
- {mibs, mibs(StdM, M)}]) of
- {ok, _Pid} ->
- Res = apply(?MODULE, F, A),
- catch snmp_test_mgr:stop(),
- Res;
- Err ->
- io:format("Error starting manager: ~p\n", [Err]),
- catch snmp_test_mgr:stop(),
- ?line exit({mgr_start, Err})
- end.
-
-
-mibs(StdMibDir,MibDir) ->
- [join(StdMibDir, ?v1_2("STANDARD-MIB.bin", "SNMPv2-MIB.bin")),
- join(MibDir, "OLD-SNMPEA-MIB.bin"),
- join(StdMibDir, "SNMP-FRAMEWORK-MIB"),
- join(StdMibDir, "SNMP-MPD-MIB"),
- join(StdMibDir, "SNMP-VIEW-BASED-ACM-MIB"),
- join(StdMibDir, "SNMP-USER-BASED-SM-MIB"),
- join(StdMibDir, "SNMP-TARGET-MIB"),
- join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
- join(MibDir, "Klas1.bin"),
- join(MibDir, "Klas2.bin"),
- join(MibDir, "Klas3.bin"),
- join(MibDir, "Klas4.bin"),
- join(MibDir, "SA-MIB.bin"),
- join(MibDir, "TestTrap.bin"),
- join(MibDir, "Test1.bin"),
- join(MibDir, "Test2.bin"),
- join(MibDir, "TestTrapv2.bin")].
-
-join(D,F) ->
- filename:join(D,F).
-
-%% string used in index
-is(S) -> [length(S) | S].
-
-try_test(Func) ->
- call(get(mgr_node), ?MODULE, run, [Func, [], []]).
-
-try_test(Func, A) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, []]).
-
-try_test(Func, A, Opts) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, Opts]).
-
-call(N,M,F,A) ->
- ?DBG("call -> entry with~n"
- " N: ~p~n"
- " M: ~p~n"
- " F: ~p~n"
- " A: ~p~n"
- " when~n"
- " get(): ~p",
- [N,M,F,A,get()]),
- spawn(N, ?MODULE, wait, [self(),get(),M,F,A]),
- receive
- {done, {'EXIT', Rn}, Loc} ->
- ?DBG("call -> returned ~p",[{done, {'EXIT', Rn}, Loc}]),
- put(test_server_loc, Loc),
- exit(Rn);
- {done, Ret, Zed} ->
- ?DBG("call -> returned ~p~n",[{done, Ret, Zed}]),
- Ret
- end.
-
-wait(From, Env, M, F, A) ->
- ?DBG("wait -> entry with ~n"
- "\tFrom: ~p~n"
- "\tEnv: ~p",[From,Env]),
- lists:foreach(fun({K,V}) -> put(K,V) end, Env),
- Rn = (catch apply(M, F, A)),
- ?DBG("wait -> Rn: ~n~p", [Rn]),
- From ! {done, Rn, get(test_server_loc)},
- exit(Rn).
-
-expect(A,B) -> ok = snmp_test_mgr:expect(A,B).
-expect(A,B,C) -> ok = snmp_test_mgr:expect(A,B,C).
-expect(A,B,C,D) -> ok = snmp_test_mgr:expect(A,B,C,D).
-expect(A,B,C,D,E,F) -> ok = snmp_test_mgr:expect(A,B,C,D,E,F).
-
-get_req(Id, Vars) ->
- ?DBG("get_req -> entry with~n"
- "\tId: ~p~n"
- "\tVars: ~p",[Id,Vars]),
- g(Vars),
- ?DBG("get_req -> await response",[]),
- {ok, Val} = snmp_test_mgr:get_response(Id, Vars),
- ?DBG("get_req -> response: ~p",[Val]),
- Val.
-
-get_next_req(Vars) ->
- ?DBG("get_next_req -> entry with Vars '~p', send request",[Vars]),
- gn(Vars),
- ?DBG("get_next_req -> await response",[]),
- Response = snmp_test_mgr:receive_response(),
- ?DBG("get_next_req -> response: ~p",[Response]),
- Response.
-
-
-
-start_node(Name) ->
- ?LOG("start_node -> entry with Name: ~p",[Name]),
- M = list_to_atom(?HOSTNAME(node())),
- ?DBG("start_node -> M: ~p",[M]),
- Pa = filename:dirname(code:which(?MODULE)),
- ?DBG("start_node -> Pa: ~p",[Pa]),
-
- Args = case init:get_argument('CC_TEST') of
- {ok, [[]]} ->
- " -pa /clearcase/otp/libraries/snmp/ebin ";
- {ok, [[Path]]} ->
- " -pa " ++ Path;
- error ->
- ""
- end,
- %% Do not use start_link!!! (the proc that calls this one is tmp)
- ?DBG("start_node -> Args: ~p~n",[Args]),
- A = Args ++ " -pa " ++ Pa,
- case (catch ?START_NODE(Name, A)) of
- {ok, Node} ->
- %% Tell the test_server to not clean up things it never started.
- ?DBG("start_node -> Node: ~p",[Node]),
- {ok, Node};
- Else ->
- ?ERR("start_node -> failed with(other): Else: ~p",[Else]),
- ?line ?FAIL(Else)
- end.
-
-
-stop_node(Node) ->
- ?LOG("stop_node -> Node: ~p",[Node]),
- rpc:cast(Node, erlang, halt, []).
-
-p(X) ->
- io:format(user, X++"\n", []).
-
-sleep(X) ->
- receive
- after
- X -> ok
- end.
-
-%%%-----------------------------------------------------------------
-%%% Configuration
-%%%-----------------------------------------------------------------
-config(Vsns, MgrDir, AgentDir, MIp, AIp) ->
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsns, MIp,
- ?TRAP_UDP, AIp, 4000,
- "test"),
- ?line case update_usm(Vsns, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsns, MgrDir);
- false ->
- ?line ok
- end,
- ?line update_community(Vsns, AgentDir),
- ?line update_vacm(Vsns, AgentDir),
- ?line write_target_addr_conf(AgentDir, MIp, ?TRAP_UDP, Vsns),
- ?line write_target_params_conf(AgentDir, Vsns),
- ?line write_notify_conf(AgentDir),
- ok.
-
-delete_files(Config) ->
- Dir = ?config(agent_dir, Config),
- {ok, List} = file:list_dir(Dir),
- lists:foreach(fun(FName) -> file:delete(filename:join(Dir, FName)) end,
- List).
-
-update_usm(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-update_usm_mgr(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-rewrite_usm_mgr(Dir, ShaKey, DesKey) ->
- ?line ok = file:rename(filename:join(Dir,"usm.conf"),
- filename:join(Dir,"usm.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),write),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- file:close(Fid).
-
-reset_usm_mgr(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"usm.old"),
- filename:join(Dir,"usm.conf")).
-
-
-update_community([v3], _Dir) -> ok;
-update_community(_, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{\"no-rights\",\"no-rights\",\"no-rights\",\"\",\"\"}.\n",
- []),
- file:close(Fid).
-
-
--define(tDescr_instance, [1,3,6,1,2,1,16,1,0]).
-update_vacm(_Vsn, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"vacm.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authMD5\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authSHA\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"privDES\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"newUser\",\"initial\"}.\n",[]),
- ok = io:format(Fid, "{vacmViewTreeFamily, \"internet\", "
- "~w, excluded, null}.\n", [?tDescr_instance]),
- file:close(Fid).
-
-
-vacm_ver(v1) -> v1;
-vacm_ver(v2) -> v2c;
-vacm_ver(v3) -> usm.
-
-
-write_community_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),write),
- ok = write_community_conf1(Fid, Confs),
- file:close(Fid).
-
-write_community_conf1(_, []) ->
- ok;
-write_community_conf1(Fid, [{ComIdx, ComName, SecName, CtxName, TransTag}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", \"~s\", \"~s\", \"~s\", \"~s\"}.~n",
- [ComIdx, ComName, SecName, CtxName, TransTag]),
- write_community_conf1(Fid, Confs).
-
-
-write_target_addr_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- ok = write_target_addr_conf1(Fid, Confs),
- file:close(Fid).
-
-
-write_target_addr_conf1(_, []) ->
- ok;
-write_target_addr_conf1(Fid,
- [{Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", ~w, ~w, ~w, ~w, \"~s\", \"~s\", \"~s\", ~w, ~w}.~n",
- [Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz]),
- write_target_addr_conf1(Fid, Confs).
-
-write_target_addr_conf(Dir, ManagerIp, UDP, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- lists:foreach(fun(Vsn) ->
- ok = io:format(Fid,
- "{\"~s\", ~w, ~w, 1500, 3, "
- "\"std_trap\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP, mk_param(Vsn)]),
- case Vsn of
- v1 -> ok;
- v2 ->
- ok = io:format(Fid,
- "{\"~s.2\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)]);
- v3 ->
- ok = io:format(Fid,
- "{\"~s.3\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\", "
- "\"mgrEngine\", [], 1024}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)])
- end
- end,
- Vsns),
- file:close(Fid).
-
-mk_param(v1) -> "target_v1";
-mk_param(v2) -> "target_v2";
-mk_param(v3) -> "target_v3".
-
-mk_ip([A,B,C,D], Vsn) ->
- io_lib:format("~w.~w.~w.~w ~w", [A,B,C,D,Vsn]).
-
-
-rewrite_target_addr_conf(Dir,NewPort) ->
- TAFile = filename:join(Dir, "target_addr.conf"),
- ?DBG("rewrite_target_addr_conf -> read target file info of address config file",[]),
- case file:read_file_info(TAFile) of
- {ok, _} -> ok;
- {error, R} -> ?ERR("failure reading file info of "
- "target address config file: ~p",[R]),
- ok
- end,
-
- ?line [TrapAddr|Addrs] =
- snmp_conf:read(TAFile,fun(R) -> rewrite_target_addr_conf1(R) end),
-
- ?DBG("rewrite_target_addr_conf -> TrapAddr: ~p",[TrapAddr]),
-
- NewAddrs = [rewrite_target_addr_conf2(NewPort,TrapAddr)|Addrs],
-
- ?DBG("rewrite_target_addr_conf -> NewAddrs: ~p",[NewAddrs]),
-
- ?line ok = file:rename(filename:join(Dir,"target_addr.conf"),
- filename:join(Dir,"target_addr.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
-
- ?line ok = rewrite_target_addr_conf3(Fid,NewAddrs),
-
- file:close(Fid).
-
-rewrite_target_addr_conf1(O) ->
- {ok,O}.
-
-rewrite_target_addr_conf2(NewPort,{Name,Ip,_Port,Timeout,Retry,
- "std_trap",EngineId}) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with std_trap",[]),
- {Name,Ip,NewPort,Timeout,Retry,"std_trap",EngineId};
-rewrite_target_addr_conf2(_NewPort,O) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with "
- "~n O: ~p",[O]),
- O.
-
-
-rewrite_target_addr_conf3(_,[]) -> ok;
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,
- ParamName,EngineId}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(1) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % ParamsName
- "\"~s\"}.", % EngineId
- [Name,Ip,Port,Timeout,Retry,ParamName,EngineId]),
- rewrite_target_addr_conf3(Fid,T);
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,TagList,
- ParamName,EngineId,TMask,MMS}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(2) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % TagList
- "\"~s\", " % ParamsName
- "\"~s\"," % EngineId
- "~p, " % TMask
- "~p}.", % MMS
- [Name,Ip,Port,Timeout,Retry,TagList,ParamName,
- EngineId,TMask,MMS]),
- rewrite_target_addr_conf3(Fid,T).
-
-reset_target_addr_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_addr.old"),
- filename:join(Dir,"target_addr.conf")).
-
-write_target_params_conf(Dir, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- lists:foreach(fun(Vsn) ->
- MP = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> v3
- end,
- SM = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> usm
- end,
- ok = io:format(Fid, "{\"target_~w\", ~w, ~w, "
- "\"all-rights\", noAuthNoPriv}.~n",
- [Vsn, MP, SM])
- end,
- Vsns),
- file:close(Fid).
-
-rewrite_target_params_conf(Dir, SecName, SecLevel) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.conf"),
- filename:join(Dir,"target_params.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- ?line ok = io:format(Fid, "{\"target_v3\", v3, usm, \"~s\", ~w}.~n",
- [SecName, SecLevel]),
- file:close(Fid).
-
-reset_target_params_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.old"),
- filename:join(Dir,"target_params.conf")).
-
-write_notify_conf(Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"notify.conf"),write),
- ok = io:format(Fid, "{\"standard trap\", \"std_trap\", trap}.~n", []),
- ok = io:format(Fid, "{\"standard inform\", \"std_inform\",inform}.~n", []),
- file:close(Fid).
-
-ver_to_trap_str([v1]) -> "v1";
-ver_to_trap_str([v2]) -> "v2";
-% default is to use the latest snmp version
-ver_to_trap_str([v1,v2]) -> "v2".
-
-
-
-write_view_conf(Dir) ->
- {ok, Fid} = file:open(a(Dir,"view.conf"),write),
- ok = io:format(Fid, "{2, [1,3,6], included, null}.~n", []),
- ok = io:format(Fid, "{2, ~w, excluded, null}.~n", [?tDescr_instance]),
- file:close(Fid).
-
-a(A,B) -> lists:append(A,B).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-copy_file(From, To) ->
- {ok, Bin} = file:read_file(From),
- ok = file:write_file(To, Bin).
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-display_memory_usage() ->
- Info = snmpa:info(snmp_master_agent),
- TreeSize = lists_key1search(tree_size_bytes, Info),
- ProcMem = lists_key1search(process_memory, Info),
- MibDbSize = lists_key1search([db_memory,mib], Info),
- NodeDbSize = lists_key1search([db_memory,node], Info),
- TreeDbSize = lists_key1search([db_memory,tree], Info),
- ?INF("Memory usage: "
- "~n Tree size: ~p"
- "~n Process memory size: ~p"
- "~n Mib db size: ~p"
- "~n Node db size: ~p"
- "~n Tree db size: ~p",
- [TreeSize, ProcMem, MibDbSize, NodeDbSize, TreeDbSize]).
-
-lists_key1search([], Res) ->
- Res;
-lists_key1search([Key|Keys], List) when atom(Key), list(List) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- lists_key1search(Keys, Val);
- false ->
- undefined
- end;
-lists_key1search(Key, List) when atom(Key) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- Val;
- false ->
- undefined
- end.
-
-
-regs() ->
- lists:sort(registered()).
diff --git a/lib/snmp/test/exp/snmp_agent_mt_test.erl b/lib/snmp/test/exp/snmp_agent_mt_test.erl
deleted file mode 100644
index bd9162fa65..0000000000
--- a/lib/snmp/test/exp/snmp_agent_mt_test.erl
+++ /dev/null
@@ -1,5636 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(snmp_agent_mt_test).
-
-%% TODO
-%% * Test fault-tolerance (kill master etc)
-%%
-
--compile(export_all).
-
--define(application, snmp).
-
--include_lib("kernel/include/file.hrl").
--include_lib("common_test/include/ct.hrl").
--include("snmp_test_lib.hrl").
--define(SNMP_USE_V3, true).
--include_lib("snmp/include/snmp_types.hrl").
-%% -include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl").
-
-
--define(klas1, [1,3,6,1,2,1,7]).
--define(klas2, [1,3,6,1,2,1,9]).
--define(klas3, [1,3,6,1,2,1,8,1]).
--define(klas4, [1,3,6,1,2,1,8,4]).
--define(sa, [1,3,6,1,4,1,193,2]).
--define(system, [1,3,6,1,2,1,1]).
--define(snmp, [1,3,6,1,2,1,11]).
--define(snmpTraps, [1,3,6,1,6,3,1,1,5]).
--define(ericsson, [1,3,6,1,4,1,193]).
--define(testTrap, [1,3,6,1,2,1,15,0]).
--define(xDescr, [1,3,6,1,2,1,17,1]).
--define(xDescr2, [1,3,6,1,2,1,17,2]).
-
--define(active, 1).
--define(notInService, 2).
--define(notReady, 3).
--define(createAndGo, 4).
--define(createAndWait, 5).
--define(destroy, 6).
-
--define(TRAP_UDP, 5000).
-
--define(tooBigStr, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").
-
--define(str(X), snmp_pdus:bits_to_str(X)).
-
--define(break(), begin io:format(user, "break at line ~w: pid: ~p\n",
- [?LINE, self()]),
- receive cont -> ok end
- end).
-
-
--import(snmp_test_mgr, [gn/1, g/1, s/1, gb/3]).
--define(v1_2(V1,V2),
- case get(vsn) of
- v1 -> V1;
- _ -> V2
- end).
-
--define(v1_2_3(V1,V2,V3),
- case get(vsn) of
- v1 -> V1;
- v2 -> V2;
- _ -> V3
- end).
-
-all() ->
-[cases()].
-
-groups() ->
- [{mib_storage, [],
- [{group, mib_storage_ets}, {group, mib_storage_dets},
- {group, mib_storage_mnesia},
- {group, mib_storage_size_check_ets},
- {group, mib_storage_size_check_dets},
- {group, mib_storage_size_check_mnesia},
- {group, mib_storage_varm_dets},
- {group, mib_storage_varm_mnesia}]},
- {mib_storage_ets, [], mib_storage_ets_cases()},
- {mib_storage_dets, [], mib_storage_dets_cases()},
- {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
- {mib_storage_size_check_ets, [],
- mse_size_check_cases()},
- {mib_storage_size_check_dets, [],
- msd_size_check_cases()},
- {mib_storage_size_check_mnesia, [],
- msm_size_check_cases()},
- {mib_storage_varm_dets, [],
- varm_mib_storage_dets_cases()},
- {mib_storage_varm_mnesia, [],
- varm_mib_storage_mnesia_cases()},
- {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
- {test_v1_v2, [], v1_v2_cases()},
- {test_v3, [], v3_cases()},
- {test_multi_threaded, [], mt_cases()},
- {multiple_reqs, [], mul_cases()},
- {multiple_reqs_2, [], mul_cases_2()},
- {v2_inform, [], [v2_inform_i]},
- {v3_security, [],
- [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
- v3_des_priv]},
- {standard_mibs, [],
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib, snmp_target_mib,
- snmp_notification_mib, snmp_view_based_acm_mib]},
- {standard_mibs_2, [],
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2, snmp_target_mib_2,
- snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
- {standard_mibs_3, [],
- [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
- {reported_bugs, [],
- [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
- otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
- otp_2979, otp_3187, otp_3725]},
- {reported_bugs_2, [],
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
- {reported_bugs_3, [],
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542]},
- {tickets, [], [{group, otp_4394}]},
- {otp_4394, [], [otp_4394_test]}].
-
-init_per_group(otp_4394, Config) ->
- init_otp_4394(Config);
-init_per_group(v2_inform, Config) ->
- init_v2_inform(Config);
-init_per_group(multiple_reqs_2, Config) ->
- init_mul(Config);
-init_per_group(multiple_reqs, Config) ->
- init_mul(Config);
-init_per_group(test_multi_threaded, Config) ->
- init_mt(Config);
-init_per_group(test_v3, Config) ->
- init_v3(Config);
-init_per_group(test_v1_v2, Config) ->
- init_v1_v2(Config);
-init_per_group(test_v2, Config) ->
- init_v2(Config);
-init_per_group(test_v1, Config) ->
- init_v1(Config);
-init_per_group(mib_storage_varm_mnesia, Config) ->
- init_varm_mib_storage_mnesia(Config);
-init_per_group(mib_storage_varm_dets, Config) ->
- init_varm_mib_storage_dets(Config);
-init_per_group(mib_storage_size_check_mnesia, Config) ->
- init_size_check_msm(Config);
-init_per_group(mib_storage_size_check_dets, Config) ->
- init_size_check_msd(Config);
-init_per_group(mib_storage_size_check_ets, Config) ->
- init_size_check_mse(Config);
-init_per_group(mib_storage_mnesia, Config) ->
- init_mib_storage_mnesia(Config);
-init_per_group(mib_storage_dets, Config) ->
- init_mib_storage_dets(Config);
-init_per_group(mib_storage_ets, Config) ->
- init_mib_storage_ets(Config);
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(otp_4394, Config) ->
- finish_otp_4394(Config);
-end_per_group(v2_inform, Config) ->
- finish_v2_inform(Config);
-end_per_group(multiple_reqs_2, Config) ->
- finish_mul(Config);
-end_per_group(multiple_reqs, Config) ->
- finish_mul(Config);
-end_per_group(test_multi_threaded, Config) ->
- finish_mt(Config);
-end_per_group(test_v3, Config) ->
- finish_v3(Config);
-end_per_group(test_v1_v2, Config) ->
- finish_v1_v2(Config);
-end_per_group(test_v2, Config) ->
- finish_v2(Config);
-end_per_group(test_v1, Config) ->
- finish_v1(Config);
-end_per_group(mib_storage_varm_mnesia, Config) ->
- finish_varm_mib_storage_mnesia(Config);
-end_per_group(mib_storage_varm_dets, Config) ->
- finish_varm_mib_storage_dets(Config);
-end_per_group(mib_storage_size_check_mnesia, Config) ->
- finish_size_check_msm(Config);
-end_per_group(mib_storage_size_check_dets, Config) ->
- finish_size_check_msd(Config);
-end_per_group(mib_storage_size_check_ets, Config) ->
- finish_size_check_mse(Config);
-end_per_group(mib_storage_mnesia, Config) ->
- finish_mib_storage_mnesia(Config);
-end_per_group(mib_storage_dets, Config) ->
- finish_mib_storage_dets(Config);
-end_per_group(mib_storage_ets, Config) ->
- finish_mib_storage_ets(Config);
-end_per_group(_GroupName, Config) ->
- Config.
-
-
-init_per_testcase(_Case, Config) when list(Config) ->
- Dog = test_server:timetrap(test_server:minutes(6)),
- [{watchdog, Dog}|Config].
-
-end_per_testcase(_Case, Config) when list(Config) ->
- Dog = ?config(watchdog, Config),
- test_server:timetrap_cancel(Dog),
- Config.
-
-cases() ->
- [
- app_info,
- {group, test_v1}, {group, test_v2},
- {group, test_v1_v2}, {group, test_v3},
- {group, test_multi_threaded}, {group, mib_storage},
- {group, tickets}
- ].
-
-
-%%%-----------------------------------------------------------------
-%%% The test case structure is as follows:
-%%%
-%%% init_all - starts mnesia,
-%%%
-%%% init_v1 - starts agent
-%%% simple
-%%% big - e.g. starts/stops subagent, load/unloads mibs
-%%% init_mul
-%%% mul_get
-%%% mul_set
-%%% <etc>
-%%% finish_mul
-%%% <etc>
-%%% finish_v1
-%%%
-%%% init_v2 - starts agent
-%%% finish_v2
-%%%
-%%% init_bilingual - starts agent
-%%% finish_bilingual
-%%%
-%%% finish_all
-%%%
-%%% There is still one problem with these testsuites. If one test
-%%% fails, it may not be possible to run some other cases, as it
-%%% may have e.g. created some row or loaded some table, that it
-%%% didn't undo (since it failed).
-%%%-----------------------------------------------------------------
-
-init_all(Config0) when list(Config0) ->
- ?LOG("init_all -> entry with"
- "~n Config0: ~p",[Config0]),
-
- %% --
- %% Fix config:
- %%
-
- DataDir0 = ?config(data_dir, Config0),
- DataDir1 = filename:split(filename:absname(DataDir0)),
- [_|DataDir2] = lists:reverse(DataDir1),
- DataDir3 = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),
- Config1 = lists:keydelete(data_dir, 1, Config0),
- Config = [{data_dir, DataDir3 ++ "/"}|Config1],
-
- %% --
- %% Start nodes
- %%
-
- ?line {ok, SaNode} = start_node(snmp_sa),
- ?line {ok, MgrNode} = start_node(snmp_mgr),
-
-
- %% --
- %% Create necessary files
- %%
-
- Dir = ?config(priv_dir, Config),
- ?DBG("init_all -> Dir ~p", [Dir]),
-
- DataDir = ?config(data_dir, Config),
- ?DBG("init_all -> DataDir ~p", [DataDir]),
-
- file:make_dir(MgrDir = filename:join(Dir, "mgr_dir/")),
- ?DBG("init_all -> MgrDir ~p", [MgrDir]),
-
- file:make_dir(AgentDir = filename:join(Dir, "agent_dir/")),
- ?DBG("init_all -> AgentDir ~p", [AgentDir]),
-
- file:make_dir(SaDir = filename:join(Dir, "sa_dir/")),
- ?DBG("init_all -> SaDir ~p", [SaDir]),
-
-
- %% --
- %% Start and initiate mnesia
- %%
-
- ?DBG("init_all -> load application mnesia", []),
- ?line ok = application:load(mnesia),
-
- ?DBG("init_all -> load application mnesia on node ~p", [SaNode]),
- ?line ok = rpc:call(SaNode, application, load, [mnesia]),
-
- ?DBG("init_all -> application mnesia: set_env dir",[]),
- ?line application_controller:set_env(mnesia, dir,
- filename:join(Dir, "Mnesia1")),
-
- ?DBG("init_all -> application mnesia: set_env dir on node ~p",[SaNode]),
- ?line rpc:call(SaNode, application_controller, set_env,
- [mnesia, dir, filename:join(Dir, "Mnesia2")]),
-
- ?DBG("init_all -> create mnesia schema",[]),
- ?line ok = mnesia:create_schema([SaNode, node()]),
-
- ?DBG("init_all -> start application mnesia",[]),
- ?line ok = application:start(mnesia),
-
- ?DBG("init_all -> start application mnesia on ~p",[SaNode]),
- ?line ok = rpc:call(SaNode, application, start, [mnesia]),
- Ip = ?LOCALHOST(),
- [{snmp_sa, SaNode},
- {snmp_mgr, MgrNode},
- {agent_dir, AgentDir ++ "/"},
- {mgr_dir, MgrDir ++ "/"},
- {sa_dir, SaDir ++ "/"},
- {mib_dir, DataDir},
- {ip, Ip} |
- Config].
-
-finish_all(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- stop_node(SaNode),
- stop_node(MgrNode),
- application:stop(mnesia).
-
-start_v1_agent(Config) when list(Config) ->
- start_agent(Config, [v1]).
-
-start_v1_agent(Config,Opts) when list(Config), list(Opts) ->
- start_agent(Config, [v1], Opts).
-
-start_v2_agent(Config) when list(Config) ->
- start_agent(Config, [v2]).
-
-start_v3_agent(Config) when list(Config) ->
- start_agent(Config, [v3]).
-
-start_bilingual_agent(Config) when list(Config) ->
- start_agent(Config, [v1,v2]).
-
-start_multi_threaded_agent(Config) when list(Config) ->
- start_agent(Config, [v2], [{snmp_multi_threaded, true}]).
-
-stop_agent(Config) when list(Config) ->
- ?LOG("stop_agent -> entry with"
- "~n Config: ~p",[Config]),
-
- {Sup, Par} = ?config(snmp_sup, Config),
- ?DBG("stop_agent -> attempt to stop (sup) ~p"
- "~n Sup: ~p"
- "~n Par: ~p",
- [Sup,
- (catch process_info(Sup)),
- (catch process_info(Par))]),
- stop_sup(Sup, Par),
-
- {Sup2, Par2} = ?config(snmp_sub, Config),
- ?DBG("stop_agent -> attempt to stop (sub) ~p"
- "~n Sup2: ~p"
- "~n Par2: ~p",
- [Sup2,
- (catch process_info(Sup2)),
- (catch process_info(Par2))]),
- stop_sup(Sup2, Par2),
-
- ?DBG("stop_agent -> done - now cleanup config", []),
- C1 = lists:keydelete(snmp_sup, 1, Config),
- lists:keydelete(snmp_sub, 1, C1).
-
-
-stop_sup(Pid, _) when node(Pid) == node() ->
- case (catch process_info(Pid)) of
- PI when list(PI) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- exit(Pid, kill),
- await_stopped(Pid, Ref);
- {'EXIT', _Reason} ->
- ?LOG("stop_sup -> ~p not running", [Pid]),
- ok
- end;
-stop_sup(Pid, _) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- ?LOG("stop_sup -> Ref: ~p", [Ref]),
- %% Pid ! {'EXIT', Parent, shutdown}, % usch
- exit(Pid, kill),
- await_stopped(Pid, Ref).
-
-await_stopped(Pid, Ref) ->
- receive
- {'DOWN', Ref, process, Pid, _Reason} ->
- ?DBG("received down message for ~p", [Pid]),
- ok
- after 10000 ->
- ?INF("await_stopped -> timeout for ~p",[Pid]),
- erlang:demonitor(Ref),
- ?FAIL({failed_stop,Pid})
- end.
-
-
-start_agent(Config, Vsn) ->
- start_agent(Config, Vsn, []).
-start_agent(Config, Vsn, Opts) ->
- ?LOG("start_agent -> entry (~p) with"
- "~n Config: ~p"
- "~n Vsn: ~p"
- "~n Opts: ~p",[node(), Config, Vsn, Opts]),
-
- ?line AgentDir = ?config(agent_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
-
- snmp_app_env_init(vsn_init(Vsn) ++
- [{audit_trail_log, read_write_log},
- {audit_trail_log_dir, AgentDir},
- {audit_trail_log_size, {10240, 10}},
- {force_config_reload, false},
- {snmp_agent_type, master},
- {snmp_config_dir, AgentDir},
- {snmp_db_dir, AgentDir},
- {snmp_local_db_auto_repair, true},
- {snmp_master_agent_verbosity, trace},
- {snmp_supervisor_verbosity, trace},
- {snmp_mibserver_verbosity, trace},
- {snmp_symbolic_store_verbosity, trace},
- {snmp_note_store_verbosity, trace},
- {snmp_net_if_verbosity, trace}],
- Opts),
-
-
- process_flag(trap_exit,true),
-
- {ok, AppSup} = snmp_app_sup:start_link(),
- unlink(AppSup),
- ?DBG("start_agent -> snmp app supervisor: ~p",[AppSup]),
-
- ?DBG("start_agent -> start master agent (old style)",[]),
- Sup = case (catch snmpa_app:start(normal)) of
- {ok, S} ->
- ?DBG("start_agent -> started, Sup: ~p",[S]),
- S;
-
- Else ->
- ?DBG("start_agent -> unknown result: ~n~p",[Else]),
- %% Get info about the apps we depend on
- MnesiaInfo = mnesia_running(),
- ?FAIL({start_failed,Else,MnesiaInfo})
- end,
-
- ?DBG("start_agent -> unlink from supervisor",[]),
- ?line unlink(Sup),
- ?line SaDir = ?config(sa_dir, Config),
- ?DBG("start_agent -> (rpc) start sub on ~p",[SaNode]),
- ?line {ok, Sub} = rpc:call(SaNode, ?MODULE, start_sub, [SaDir]),
- ?DBG("start_agent -> done",[]),
- ?line [{snmp_sup, {Sup, self()}}, {snmp_sub, Sub} | Config].
-
-
-vsn_init(Vsn) ->
- vsn_init([v1,v2,v3], Vsn, []).
-
-vsn_init([], _Vsn, Acc) ->
- Acc;
-vsn_init([V|Vsns], Vsn, Acc) ->
- case lists:member(V, Vsn) of
- true ->
- vsn_init(Vsns, Vsn, [{V, true}|Acc]);
- false ->
- vsn_init(Vsns, Vsn, [{V, false}|Acc])
- end.
-
-snmp_app_env_init(Env0, Opts) ->
- ?DBG("snmp_app_env_init -> unload snmp",[]),
- ?line application:unload(snmp),
- ?DBG("snmp_app_env_init -> load snmp",[]),
- ?line application:load(snmp),
- ?DBG("snmp_app_env_init -> initiate (snmp) application env",[]),
- F1 = fun({Key,Val} = New, Acc0) ->
- ?DBG("snmp_app_env_init -> "
- "updating setting ~p to ~p", [Key, Val]),
- case lists:keyreplace(Key, 1, Acc0, New) of
- Acc0 ->
- [New|Acc0];
- Acc ->
- Acc
- end
- end,
- Env = lists:foldr(F1, Env0, Opts),
- ?DBG("snmp_app_env_init -> Env: ~p",[Env]),
- F2 = fun({Key,Val}) ->
- ?DBG("snmp_app_env_init -> setting ~p to ~p",[Key, Val]),
- application_controller:set_env(snmp, Key, Val)
- end,
- lists:foreach(F2, Env).
-
-
-
-
-%% Test if application is running
-mnesia_running() -> ?IS_MNESIA_RUNNING().
-crypto_running() -> ?IS_CRYPTO_RUNNING().
-
-
-start_sub(Dir) ->
- ?DBG("start_sub -> entry",[]),
- Opts = [{db_dir, Dir},
- {supervisor, [{verbosity, trace}]}],
- %% BMK BMK
-% {ok, P} = snmp_supervisor:start_sub(Dir),
- {ok, P} = snmpa_supervisor:start_sub_sup(Opts),
- unlink(P),
- {ok, {P, self()}}.
-
-create_tables(SaNode) ->
- ?line {atomic, ok} = mnesia:create_table([{name, friendsTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, kompissTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, snmp_variables},
- {attributes, [a1,a2]}]).
-
-delete_tables() ->
- mnesia:delete_table(friendsTable2),
- mnesia:delete_table(kompissTable2),
- mnesia:delete_table(snmp_variables).
-
-%% Creation is done in runtime!
-delete_mib_storage_mnesia_tables() ->
- mnesia:delete_table(snmpa_mib_data),
- mnesia:delete_table(snmpa_mib_tree),
- mnesia:delete_table(snmpa_symbolic_store).
-
-%%-----------------------------------------------------------------
-%% A test case is always one of:
-%% - v1 specific case
-%% - v2 specific case
-%% - v1 and v2 case
-%% All v1 specific cases are prefixed with v1_, and all v2 with
-%% v2_. E.g. v1_trap/v2_trap.
-%%
-%% All other cases are shared. However, the testserver uses the name
-%% of the case to generate a file for that case. The same case cannot
-%% be used in different configurations in the same suite. Therefore
-%% all these functions exists in two variants, the base function
-%% <base>, and a second version <base>_2. There may be several
-%% versions as well, <base>_N.
-%%-----------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-mib_storage_ets_cases() ->
-[mse_simple, mse_v1_processing, mse_big, mse_big2,
- mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
- mse_sa_error, mse_next_across_sa, mse_undo,
- mse_standard_mib, mse_community_mib, mse_framework_mib,
- mse_target_mib, mse_notification_mib,
- mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
-[msd_simple, msd_v1_processing, msd_big, msd_big2,
- msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
- msd_sa_error, msd_next_across_sa, msd_undo,
- msd_standard_mib, msd_community_mib, msd_framework_mib,
- msd_target_mib, msd_notification_mib,
- msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
- msd_mib_of].
-
-mib_storage_mnesia_cases() ->
-[msm_simple, msm_v1_processing, msm_big, msm_big2,
- msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
- msm_sa_error, msm_next_across_sa, msm_undo,
- msm_standard_mib, msm_community_mib, msm_framework_mib,
- msm_target_mib, msm_notification_mib,
- msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
- msm_mib_of].
-
-mse_size_check_cases() ->
-[mse_size_check].
-
-msd_size_check_cases() ->
-[msd_size_check].
-
-msm_size_check_cases() ->
-[msm_size_check].
-
-varm_mib_storage_dets_cases() ->
-[msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
-[msm_varm_mib_start].
-
-init_mib_storage_ets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,ets},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- init_ms(Config, [MibStorage]).
-
-init_ms(Config, Opts) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts1 = [MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity|Opts],
- [{vsn, v1} | start_v1_agent(Config,Opts1)].
-
-init_size_check_mse(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, ets},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msd(Config) when list(Config) ->
- AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage, {dets, AgentDir}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msm(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, {mnesia,[]}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_ms(Config, Opts) when list(Config) ->
- SaNode = ?GCONF(snmp_sa, Config),
- %% We are using v3 here, so crypto must be supported or else...
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- create_tables(SaNode),
- AgentDir = ?GCONF(agent_dir, Config),
- MgrDir = ?GCONF(mgr_dir, Config),
- Ip = ?GCONF(ip, Config),
- ?line ok =
- config([v3], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_agent(Config, [v3], Opts)].
-
-init_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_dets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-init_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_mnesia -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-finish_mib_storage_ets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_ets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_dets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_dets -> entry", []),
- delete_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_size_check_mse(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msd(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msm(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_ms(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%% These are just interface functions to fool the test server
-mse_simple(X) -> simple(X).
-mse_v1_processing(X) -> v1_processing(X).
-mse_big(X) -> big(X).
-mse_big2(X) -> big2(X).
-mse_loop_mib(X) -> loop_mib(X).
-mse_api(X) -> api(X).
-mse_sa_register(X) -> sa_register(X).
-mse_v1_trap(X) -> v1_trap(X).
-mse_sa_error(X) -> sa_error(X).
-mse_next_across_sa(X) -> next_across_sa(X).
-mse_undo(X) -> undo(X).
-mse_standard_mib(X) -> snmp_standard_mib(X).
-mse_community_mib(X) -> snmp_community_mib(X).
-mse_framework_mib(X) -> snmp_framework_mib(X).
-mse_target_mib(X) -> snmp_target_mib(X).
-mse_notification_mib(X) -> snmp_notification_mib(X).
-mse_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-mse_sparse_table(X) -> sparse_table(X).
-mse_me_of(X) -> ms_me_of(X).
-mse_mib_of(X) -> ms_mib_of(X).
-
-msd_simple(X) -> simple(X).
-msd_v1_processing(X) -> v1_processing(X).
-msd_big(X) -> big(X).
-msd_big2(X) -> big2(X).
-msd_loop_mib(X) -> loop_mib(X).
-msd_api(X) -> api(X).
-msd_sa_register(X) -> sa_register(X).
-msd_v1_trap(X) -> v1_trap(X).
-msd_sa_error(X) -> sa_error(X).
-msd_next_across_sa(X) -> next_across_sa(X).
-msd_undo(X) -> undo(X).
-msd_standard_mib(X) -> snmp_standard_mib(X).
-msd_community_mib(X) -> snmp_community_mib(X).
-msd_framework_mib(X) -> snmp_framework_mib(X).
-msd_target_mib(X) -> snmp_target_mib(X).
-msd_notification_mib(X) -> snmp_notification_mib(X).
-msd_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msd_sparse_table(X) -> sparse_table(X).
-msd_me_of(X) -> ms_me_of(X).
-msd_mib_of(X) -> ms_mib_of(X).
-
-msm_simple(X) -> simple(X).
-msm_v1_processing(X) -> v1_processing(X).
-msm_big(X) -> big(X).
-msm_big2(X) -> big2(X).
-msm_loop_mib(X) -> loop_mib(X).
-msm_api(X) -> api(X).
-msm_sa_register(X) -> sa_register(X).
-msm_v1_trap(X) -> v1_trap(X).
-msm_sa_error(X) -> sa_error(X).
-msm_next_across_sa(X) -> next_across_sa(X).
-msm_undo(X) -> undo(X).
-msm_standard_mib(X) -> snmp_standard_mib(X).
-msm_community_mib(X) -> snmp_community_mib(X).
-msm_framework_mib(X) -> snmp_framework_mib(X).
-msm_target_mib(X) -> snmp_target_mib(X).
-msm_notification_mib(X) -> snmp_notification_mib(X).
-msm_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msm_sparse_table(X) -> sparse_table(X).
-msm_me_of(X) -> ms_me_of(X).
-msm_mib_of(X) -> ms_mib_of(X).
-
-
-mse_size_check(X) -> p("mse_size_check..."), ms_size_check(X).
-msd_size_check(X) -> p("msd_size_check..."), ms_size_check(X).
-msm_size_check(X) -> p("msm_size_check..."), ms_size_check(X).
-
-msd_varm_mib_start(X) -> p("msd_varm_mib_start..."), varm_mib_start(X).
-msm_varm_mib_start(X) -> p("msm_varm_mib_start..."), varm_mib_start(X).
-
-ms_size_check(suite) -> [];
-ms_size_check(Config) when list(Config) ->
- p("ms_size_check..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?LOG("mib server size check...", []),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMPv2-MIB"),
- ?line load_master_std("SNMPv2-TM"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMPv2-MIB"),
- ?line unload_master("SNMPv2-TM"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-
-varm_mib_start(suite) -> [];
-varm_mib_start(Config) when list(Config) ->
- p("varm_mib_start..."),
- ?LOG("varm_mib_start -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- %% Start the agent
- Opts = ?GCONF(agent_opts, Config),
- Config1 = start_v1_agent(Config, Opts),
-
- %% Sleep some in order for the agent to start properly
- ?DBG("varm_mib_start -> sleep some (before loading mobs)", []),
- ?SLEEP(5000),
-
- %% Load all the mibs
- HardwiredMibs = loaded_mibs(),
- ?DBG("varm_mib_start -> load all mibs", []),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
-
- %% Unload the hardwired mibs
- ?DBG("varm_mib_start -> sleep some (before unloading hardwired mibs)", []),
- ?SLEEP(1000),
- ?DBG("varm_mib_start -> unload (hardwired) mibs", []),
- ?line unload_mibs(HardwiredMibs), %% unload hardwired
-
- ?DBG("varm_mib_start -> sleep some (before stopping agent)", []),
- ?SLEEP(1000),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- Config2 = stop_agent(Config1),
-
- %% Sleep some in order for the agent to stop properly
- ?DBG("varm_mib_start -> sleep some (before re-starting the agent)", []),
- ?SLEEP(5000),
-
- %% Start the agent (again)
- ?DBG("varm_mib_start -> start the agent", []),
- Config3 = start_v1_agent(Config2, Opts),
-
- ?DBG("varm_mib_start -> sleep some (before starting tests)", []),
- ?SLEEP(5000),
-
- %% Perform the test(s)
- ?DBG("varm_mib_start -> perform the tests", []),
- try_test(snmp_community_mib),
- try_test(snmp_framework_mib),
- try_test(snmp_target_mib),
- try_test(snmp_notification_mib),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- stop_agent(Config3),
- ok.
-
-
--define(snmpTrapCommunity_instance, [1,3,6,1,6,3,18,1,4,0]).
--define(vacmViewSpinLock_instance, [1,3,6,1,6,3,16,1,5,1,0]).
--define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-ms_me_of(suite) -> [];
-ms_me_of(Config) when list(Config) ->
- p("ms_me_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_me_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = me_of(?snmpTrapCommunity_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = me_of(?vacmViewSpinLock_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = me_of(?usmStatsNotInTimeWindows_instance),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-me_of(Oid) ->
- case snmpa:me_of(Oid) of
- {ok, #me{oid = Oid}} ->
- ok;
- {ok, #me{oid = OtherOid}} ->
- case lists:reverse(Oid) of
- [0|Rest] ->
- case lists:reverse(Rest) of
- OtherOid ->
- ok;
- AnotherOid ->
- {error, {invalid_oid, Oid, AnotherOid}}
- end;
- _ ->
- {error, {invalid_oid, Oid, OtherOid}}
- end;
- {error, Reason} ->
- {error, Reason};
- Else ->
- {error, Else}
- end.
-
-
-ms_mib_of(suite) -> [];
-ms_mib_of(Config) when list(Config) ->
- p("ms_mib_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_mib_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = mib_of(?snmpTrapCommunity_instance, 'SNMP-COMMUNITY-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = mib_of(?vacmViewSpinLock_instance, 'SNMP-VIEW-BASED-ACM-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = mib_of(?usmStatsNotInTimeWindows_instance,
- 'SNMP-USER-BASED-SM-MIB'),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-mib_of(Oid, ExpectedMibName) ->
- ?DBG("mib_of -> entry with"
- "~n Oid: ~p"
- "~n ExpectedMibName: ~p", [Oid, ExpectedMibName]),
- %% case snmpa:mib_of(Oid) of
- MibOf = snmpa:mib_of(Oid),
- ?DBG("mib_of -> MibOf: ~n~p", [MibOf]),
- case MibOf of
- {ok, ExpectedMibName} ->
- ok;
- {ok, OtherMibName} ->
- {error, {invalid_mib, ExpectedMibName, OtherMibName}};
- {error, Reason} ->
- {error, Reason};
- Else ->
- ?DBG("mib_of -> Else: ~n~p", [Else]),
- {error, Else}
- end.
-
-
-app_info(suite) -> [];
-app_info(Config) when list(Config) ->
- SnmpDir = app_dir(snmp),
- SslDir = app_dir(ssl),
- CryptoDir = app_dir(crypto),
- Attr = snmp:module_info(attributes),
- AppVsn =
- case lists:keysearch(app_vsn, 1, Attr) of
- {value, {app_vsn, V}} ->
- V;
- false ->
- "undefined"
- end,
- io:format("Root dir: ~s~n"
- "SNMP: Application dir: ~s~n"
- " Application ver: ~s~n"
- "SSL: Application dir: ~s~n"
- "CRYPTO: Application dir: ~s~n",
- [code:root_dir(), SnmpDir, AppVsn, SslDir, CryptoDir]),
- ok.
-
-app_dir(App) ->
- case code:lib_dir(App) of
- D when list(D) ->
- filename:basename(D);
- {error, _Reason} ->
- "undefined"
- end.
-
-
-
-%v1_cases() -> [loop_mib];
-v1_cases() ->
-[simple, db_notify_client, v1_processing, big, big2,
- loop_mib, api, subagent, mnesia, {group, multiple_reqs},
- sa_register, v1_trap, sa_error, next_across_sa, undo,
- {group, reported_bugs}, {group, standard_mibs},
- sparse_table, cnt_64, opaque, change_target_addr_config].
-
-init_v1(Config) when list(Config) ->
- ?line SaNode = ?config(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v1} | start_v1_agent(Config)].
-
-finish_v1(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v2_cases() -> [loop_mib_2];
-v2_cases() ->
-[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
- sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
- next_across_sa_2, undo_2, {group, reported_bugs_2},
- {group, standard_mibs_2}, v2_types, implied,
- sparse_table_2, cnt_64_2, opaque_2, v2_caps].
-
-init_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_v2_agent(Config)].
-
-finish_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-v1_v2_cases() ->
-[simple_bi].
-
-init_v1_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v1,v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, bilingual} | start_bilingual_agent(Config)].
-
-finish_v1_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v3_cases() -> [loop_mib_3];
-v3_cases() ->
-[simple_3, v3_processing, big_3, big2_3, api_3,
- subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
- sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, {group, reported_bugs_3},
- {group, standard_mibs_3}, {group, v3_security},
- v2_types_3, implied_3, sparse_table_3, cnt_64_3,
- opaque_3, v2_caps_3].
-
-init_v3(Config) when list(Config) ->
- %% Make sure crypto works, otherwise start_agent will fail
- %% and we will be stuck with a bunch of mnesia tables for
- %% the rest of this suite...
- ?DBG("start_agent -> start crypto app",[]),
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v3], MgrDir, AgentDir,
- tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_v3_agent(Config)].
-
-finish_v3(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-mt_cases() ->
-[multi_threaded, mt_trap].
-
-init_mt(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_multi_threaded_agent(Config)].
-
-finish_mt(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-%% This one *must* be run first in each case.
-init_case(Config) when list(Config) ->
- ?DBG("init_case -> entry with"
- "~n Config: ~p", [Config]),
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- MasterNode = node(),
-
- SaHost = ?HOSTNAME(SaNode),
- MgrHost = ?HOSTNAME(MgrNode),
- MasterHost = ?HOSTNAME(MasterNode),
- {ok, MasterIP} = snmp_misc:ip(MasterHost),
- {ok, MIP} = snmp_misc:ip(MgrHost),
- {ok, SIP} = snmp_misc:ip(SaHost),
-
-
- put(mgr_node, MgrNode),
- put(sa_node, SaNode),
- put(master_node, MasterNode),
- put(sa_host, SaHost),
- put(mgr_host, MgrHost),
- put(master_host, MasterHost),
- put(mip, tuple_to_list(MIP)),
- put(masterip , tuple_to_list(MasterIP)),
- put(sip, tuple_to_list(SIP)),
-
- MibDir = ?config(mib_dir, Config),
- put(mib_dir, MibDir),
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- put(std_mib_dir, StdM),
-
- MgrDir = ?config(mgr_dir, Config),
- put(mgr_dir, MgrDir),
-
- put(vsn, ?config(vsn, Config)),
- ?DBG("init_case -> exit with"
- "~n MasterNode: ~p"
- "~n SaNode: ~p"
- "~n MgrNode: ~p"
- "~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]),
- {SaNode, MgrNode, MibDir}.
-
-load_master(Mib) ->
- ?DBG("load_master -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(mib_dir) ++ Mib]).
-
-load_master_std(Mib) ->
- ?DBG("load_master_std -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(std_mib_dir) ++ Mib]).
-
-unload_master(Mib) ->
- ?DBG("unload_master -> entry with"
- "~n Mib: ~p", [Mib]),
- ok = snmpa:unload_mibs(snmp_master_agent, [Mib]).
-
-loaded_mibs() ->
- ?DBG("loaded_mibs -> entry",[]),
- Info = snmpa:info(snmp_master_agent),
- {value, {loaded_mibs, Mibs}} = lists:keysearch(loaded_mibs, 1, Info),
- [atom_to_list(Mib) || {Mib,_,_} <- Mibs].
-
-unload_mibs(Mibs) ->
- ?DBG("unload_mibs -> entry with"
- "~n Mibs: ~p", [Mibs]),
- ok = snmpa:unload_mibs(snmp_master_agent, Mibs).
-
-start_subagent(SaNode, RegTree, Mib) ->
- ?DBG("start_subagent -> entry with"
- "~n SaNode: ~p"
- "~n RegTree: ~p"
- "~n Mib: ~p", [SaNode, RegTree, Mib]),
- MA = whereis(snmp_master_agent),
- ?DBG("start_subagent -> MA: ~p", [MA]),
- MibDir = get(mib_dir),
- Mib1 = join(MibDir,Mib),
- %% BMK BMK
-% case rpc:call(SaNode,snmp_supervisor,start_subagent,[MA,RegTree,[Mib1]]) of
- case rpc:call(SaNode, snmpa_supervisor,
- start_sub_agent, [MA, RegTree, [Mib1]]) of
- {ok, SA} ->
- ?DBG("start_subagent -> SA: ~p", [SA]),
- {ok, SA};
- Error ->
- ?FAIL({subagent_start_failed, SaNode, Error, [MA, RegTree, Mib1]})
- end.
-
-stop_subagent(SA) ->
- ?DBG("stop_subagent -> entry with"
- "~n SA: ~p", [SA]),
- %% BNK BMK
- %% rpc:call(node(SA), snmp_supervisor, stop_subagent, [SA]).
- rpc:call(node(SA), snmpa_supervisor, stop_sub_agent, [SA]).
-
-%%-----------------------------------------------------------------
-%% This function takes care of the old OTP-SNMPEA-MIB.
-%% Unfortunately, the testcases were written to use the data in the
-%% internal tables, and these table are now obsolete and not used
-%% by the agent. Therefore, we emulate them by using
-%% OLD-SNMPEA-MIB, which uses the default impl. of all tables.
-%%
-%% These two rows must exist in intCommunityTable
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
-%% (But with the manager's IP address)
-%%
-%%-----------------------------------------------------------------
-init_old() ->
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [6 | "public"],
- {get(mip), "public", 2, 2}),
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [13 | "standard trap"],
- {get(mip), "standard trap", 2, 1}),
- snmpa_local_db:variable_set(intAgentIpAddress, [127,0,0,1]).
-
-
-
-simple(suite) -> [];
-simple(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(simple_standard_test).
-
-simple_2(X) -> simple(X).
-
-simple_bi(suite) -> [];
-simple_bi(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(vsn, v1), % First, try v1 manager
- try_test(simple_standard_test),
-
- put(vsn, v2), % Then, try v2 manager
- try_test(simple_standard_test).
-
-simple_3(X) ->
- simple(X).
-
-big(suite) -> [];
-big(Config) when list(Config) ->
- ?DBG("big -> entry", []),
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?DBG("big -> SA: ~p", [SA]),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-big_2(X) -> big(X).
-
-big_3(X) -> big(X).
-
-
-big2(suite) -> [];
-big2(Config) when list(Config) ->
- %% This is exactly the same tests as 'big', but with the
- %% v2 equivalent of the mibs.
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1-v2"),
- ?line load_master("OLD-SNMPEA-MIB-v2"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB-v2").
-
-big2_2(X) -> big2(X).
-
-big2_3(X) -> big2(X).
-
-
-multi_threaded(suite) -> [];
-multi_threaded(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(multi_threaded_test),
- ?line unload_master("Test1").
-
-mt_trap(suite) -> [];
-mt_trap(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- ?line load_master("TestTrapv2"),
- try_test(mt_trap_test, [MA]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("Test1").
-
-v2_types(suite) -> [];
-v2_types(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(types_v2_test),
- ?line unload_master("Test1").
-
-v2_types_3(X) -> v2_types(X).
-
-
-implied(suite) -> [];
-implied(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(implied_test,[MA]),
- ?line unload_master("Test1").
-
-implied_3(X) -> implied(X).
-
-
-sparse_table(suite) -> [];
-sparse_table(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(sparse_table_test),
- ?line unload_master("Test1").
-
-sparse_table_2(X) -> sparse_table(X).
-
-sparse_table_3(X) -> sparse_table(X).
-
-cnt_64(suite) -> [];
-cnt_64(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(cnt_64_test, [MA]),
- ?line unload_master("Test1").
-
-cnt_64_2(X) -> cnt_64(X).
-
-cnt_64_3(X) -> cnt_64(X).
-
-opaque(suite) -> [];
-opaque(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(opaque_test),
- ?line unload_master("Test1").
-
-opaque_2(X) -> opaque(X).
-
-opaque_3(X) -> opaque(X).
-
-
-change_target_addr_config(suite) -> [];
-change_target_addr_config(Config) when list(Config) ->
- p("Testing changing target address config..."),
- ?LOG("change_target_addr_config -> entry",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(sname,snmp_suite),
- put(verbosity,trace),
-
- MA = whereis(snmp_master_agent),
-
- ?LOG("change_target_addr_config -> load TestTrap",[]),
- ?line load_master("TestTrap"),
-
- ?LOG("change_target_addr_config -> set trace verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,trace),
-
- %% First send some traps that will arive att the original manager
- ?LOG("change_target_addr_config -> send trap",[]),
- try_test(ma_trap1, [MA]),
-
- ?LOG("change_target_addr_config -> set silence verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,silence),
-
- %% Start new dummy listener
- ?LOG("change_target_addr_config -> start dummy manager",[]),
- ?line {ok,Pid,NewPort} = dummy_manager_start(MA),
-
- %% Reconfigure
- ?LOG("change_target_addr_config -> reconfigure",[]),
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_addr_conf(AgentDir, NewPort),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- %% Send the trap again
- ?LOG("change_target_addr_config -> send trap again",[]),
- catch dummy_manager_send_trap2(Pid),
-
- ?LOG("change_target_addr_config -> await trap ack",[]),
- catch dummy_manager_await_trap2_ack(),
-
- ?LOG("change_target_addr_config -> stop dummy manager",[]),
- ?line ok = dummy_manager_stop(Pid),
-
- ?LOG("change_target_addr_config -> reset target address config",[]),
- ?line reset_target_addr_conf(AgentDir),
-
- ?LOG("change_target_addr_config -> unload TestTrap",[]),
- ?line unload_master("TestTrap").
-
-
-dummy_manager_start(MA) ->
- ?DBG("dummy_manager_start -> entry",[]),
- Pid = spawn(get(mgr_node), ?MODULE,dummy_manager_init,[self(),MA]),
- ?DBG("dummy_manager_start -> Pid: ~p",[Pid]),
- await_dummy_manager_started(Pid).
-
-await_dummy_manager_started(Pid) ->
- receive
- {dummy_manager_started,Pid,Port} ->
- ?DBG("dummy_manager_start -> acknowledge received with"
- "~n Port: ~p",[Port]),
- {ok,Pid,Port};
- {'EXIT', Pid, Reason} ->
- {error, Pid, Reason};
- O ->
- ?LOG("dummy_manager_start -> received unknown message:"
- "~n ~p",[O]),
- await_dummy_manager_started(Pid)
- end.
-
-dummy_manager_stop(Pid) ->
- ?DBG("dummy_manager_stop -> entry with Pid: ~p",[Pid]),
- Pid ! stop,
- receive
- {dummy_manager_stopping, Pid} ->
- ?DBG("dummy_manager_stop -> acknowledge received",[]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_stop -> timeout",[]),
- timeout
- end.
-
-dummy_manager_send_trap2(Pid) ->
- ?DBG("dummy_manager_send_trap2 -> entry",[]),
- Pid ! {send_trap,testTrap2}.
-
-dummy_manager_await_trap2_ack() ->
- ?DBG("dummy_manager_await_trap2 -> entry",[]),
- receive
- {received_trap,Trap} ->
- ?LOG("dummy_manager_await_trap2 -> received trap: ~p",[Trap]),
- %% Note:
- %% Without this sleep the v2_inform_i testcase failes! There
- %% is no relation between these two test cases as far as I
- %% able to figure out...
- sleep(60000),
- ok;
- O ->
- ?ERR("dummy_manager_await_trap2 -> unexpected message: ~p",[O]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_await_trap2 -> timeout",[]),
- timeout
- end.
-
-dummy_manager_init(Parent,MA) ->
- ?DBG("dummy_manager_init -> entry with"
- "~n Parent: ~p"
- "~n MA: ~p",[Parent,MA]),
- {ok,S} = gen_udp:open(0,[{recbuf,65535}]),
- ?DBG("dummy_manager_init -> S: ~p",[S]),
- {ok,Port} = inet:port(S),
- ?DBG("dummy_manager_init -> Port: ~p",[Port]),
- Parent ! {dummy_manager_started,self(),Port},
- dummy_manager_loop(Parent,S,MA).
-
-dummy_manager_loop(P,S,MA) ->
- ?LOG("dummy_manager_loop -> ready for receive",[]),
- receive
- {send_trap,Trap} ->
- ?LOG("dummy_manager_loop -> received trap send request"
- "~n Trap: ~p",[Trap]),
- snmpa:send_trap(MA, Trap, "standard trap"),
- dummy_manager_loop(P,S,MA);
- {udp, _UdpId, Ip, UdpPort, Bytes} ->
- ?LOG("dummy_manager_loop -> received upd message"
- "~n from: ~p:~p"
- "~n size: ~p",
- [Ip, UdpPort, dummy_manager_message_sz(Bytes)]),
- R = dummy_manager_handle_message(Bytes),
- ?DBG("dummy_manager_loop -> R: ~p",[R]),
- P ! R,
- dummy_manager_loop(P,S,MA);
- stop ->
- ?DBG("dummy_manager_loop -> received stop request",[]),
- P ! {dummy_manager_stopping, self()},
- gen_udp:close(S),
- exit(normal);
- O ->
- ?LOG("dummy_manager_loop -> received unknown message:"
- "~n ~p",[O]),
- dummy_manager_loop(P,S,MA)
- end.
-
-dummy_manager_message_sz(B) when binary(B) ->
- size(B);
-dummy_manager_message_sz(L) when list(L) ->
- length(L);
-dummy_manager_message_sz(_) ->
- undefined.
-
-dummy_manager_handle_message(Bytes) ->
- case (catch snmp_pdus:dec_message(Bytes)) of
- {'EXIT',Reason} ->
- ?ERR("dummy_manager_handle_message -> "
- "failed decoding message only:~n ~p",[Reason]),
- {error,Reason};
- M ->
- ?DBG("dummy_manager_handle_message -> decoded message:"
- "~n ~p",[M]),
- {received_trap,M}
- end.
-
-
-api(suite) -> [];
-api(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(api_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-api_2(X) -> api(X).
-
-api_3(X) -> api(X).
-
-
-subagent(suite) -> [];
-subagent(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- try_test(load_test_sa),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
-
- p("Loading previous subagent mib in master and testing..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(load_test),
-
- p("Unloading previous subagent mib in master and testing..."),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(unreg_test),
- p("Testing register subagent..."),
- rpc:call(SaNode, snmp, register_subagent,
- [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- ?line stop_subagent(SA),
- try_test(unreg_test).
-
-subagent_2(X) -> subagent(X).
-
-subagent_3(X) -> subagent(X).
-
-
-mnesia(suite) -> [];
-mnesia(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent with mnesia impl..."),
- {ok, SA} = start_subagent(SaNode, ?klas2, "Klas2"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- try_test(big_test_2),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA).
-
-mnesia_2(X) -> mnesia(X).
-
-mnesia_3(X) -> mnesia(X).
-
-
-
-mul_cases() ->
-[mul_get, mul_get_err, mul_next, mul_next_err,
- mul_set_err].
-
-
-multiple_reqs_3(_X) ->
- {req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-
-
-mul_cases_2() ->
-[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
- mul_set_err_2].
-
-
-mul_cases_3() ->
- [mul_get_3, mul_get_err_3, mul_next_3, mul_next_err_3, mul_set_err_3].
-
-
-init_mul(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- [{mul_sub, SA} | Config].
-
-finish_mul(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- SA = ?config(mul_sub, Config),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA),
- lists:keydelete(mul_sub, 1, Config).
-
-mul_get(suite) -> [];
-mul_get(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get..."),
- try_test(do_mul_get).
-
-mul_get_2(X) -> mul_get(X).
-
-mul_get_3(X) -> mul_get(X).
-
-
-mul_get_err(suite) -> [];
-mul_get_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get with error..."),
- try_test(do_mul_get_err).
-
-mul_get_err_2(X) -> mul_get_err(X).
-
-mul_get_err_3(X) -> mul_get_err(X).
-
-
-mul_next(suite) -> [];
-mul_next(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next).
-
-mul_next_2(X) -> mul_next(X).
-
-mul_next_3(X) -> mul_next(X).
-
-
-mul_next_err(suite) -> [];
-mul_next_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next_err).
-
-mul_next_err_2(X) -> mul_next_err(X).
-
-mul_next_err_3(X) -> mul_next_err(X).
-
-
-mul_set(suite) -> [];
-mul_set(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set..."),
- try_test(do_mul_set).
-
-mul_set_2(X) -> mul_set(X).
-
-mul_set_3(X) -> mul_set(X).
-
-
-mul_set_err(suite) -> [];
-mul_set_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set with error..."),
- try_test(do_mul_set_err).
-
-mul_set_err_2(X) -> mul_set_err(X).
-
-mul_set_err_3(X) -> mul_set_err(X).
-
-
-sa_register(suite) -> [];
-sa_register(Config) when list(Config) ->
- ?DBG("sa_register -> entry", []),
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?DBG("sa_register -> start subagent", []),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
-
- ?DBG("sa_register -> unregister subagent", []),
- p("Testing unregister subagent (2)..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Loading SA-MIB..."),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:load_mibs(SA, [MibDir ++ "SA-MIB"]),
- ?DBG("sa_register -> register subagent", []),
- rpc:call(SaNode, snmp, register_subagent, [MA,?sa,SA]),
- try_test(sa_mib),
-
- ?DBG("sa_register -> stop subagent", []),
- ?line stop_subagent(SA).
-
-sa_register_2(X) -> sa_register(X).
-
-sa_register_3(X) -> sa_register(X).
-
-
-v1_trap(suite) -> [];
-v1_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_trap1, [MA]),
- try_test(ma_trap2, [MA]),
- try_test(ma_v2_2_v1_trap, [MA]),
- try_test(ma_v2_2_v1_trap2, [MA]),
-
- p("Testing trap sending from subagent..."),
- try_test(sa_trap1, [SA]),
- try_test(sa_trap2, [SA]),
- try_test(sa_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v2_trap(suite) -> [];
-v2_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
-
- try_test(ma_v2_trap1, [MA]),
- try_test(ma_v2_trap2, [MA]),
- try_test(ma_v1_2_v2_trap, [MA]),
- try_test(ma_v1_2_v2_trap2, [MA]),
-
- try_test(sa_mib),
- p("Testing trap sending from subagent..."),
- try_test(sa_v1_2_v2_trap1, [SA]),
- try_test(sa_v1_2_v2_trap2, [SA]),
- try_test(sa_v1_2_v2_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v3_trap(X) ->
- v2_trap(X).
-
-
-v3_inform(_X) ->
- %% v2_inform(X).
- {req, [], {conf, init_v3_inform, [v3_inform_i], finish_v3_inform}}.
-
-init_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-init_v3_inform(X) ->
- init_v2_inform(X).
-
-finish_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-finish_v3_inform(X) ->
- finish_v2_inform(X).
-
-
-
-v2_inform_i(suite) -> [];
-v2_inform_i(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing inform sending from master agent... NOTE! This test\ntakes a "
- "few minutes (5) to complete."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_v2_inform1, [MA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2").
-
-v3_inform_i(X) -> v2_inform_i(X).
-
-
-sa_error(suite) -> [];
-sa_error(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing sa bad value (is_set_ok)..."),
- try_test(sa_errs_bad_value),
-
- p("Testing sa gen err (set)..."),
- try_test(sa_errs_gen_err),
-
- p("Testing too big..."),
- try_test(sa_too_big),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- stop_subagent(SA).
-
-sa_error_2(X) -> sa_error(X).
-
-sa_error_3(X) -> sa_error(X).
-
-
-next_across_sa(suite) -> [];
-next_across_sa(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Loading another subagent mib..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas1"]),
-
- rpc:call(SaNode, snmp, register_subagent, [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- p("Testing next across subagent (endOfMibView from SA)..."),
- try_test(next_across_sa),
-
- p("Unloading mib"),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Starting another subagent"),
- ?line {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
- p("Testing next across subagent (wrong prefix from SA)..."),
- try_test(next_across_sa),
-
- stop_subagent(SA),
- stop_subagent(SA2).
-
-next_across_sa_2(X) -> next_across_sa(X).
-
-next_across_sa_3(X) -> next_across_sa(X).
-
-
-undo(suite) -> [];
-undo(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing undo phase at master agent..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas4"]),
- try_test(undo_test),
- try_test(api_test2),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas3"]),
-
- p("Testing bad return values from instrum. funcs..."),
- try_test(bad_return),
-
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas4"]),
-
- p("Testing undo phase at subagent..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas4"]),
- ?line ok = snmpa:register_subagent(MA, ?klas3, SA),
- ?line ok = snmpa:register_subagent(MA, ?klas4, SA),
- try_test(undo_test),
- try_test(api_test3),
-
- p("Testing undo phase across master/subagents..."),
- try_test(undo_test),
- try_test(api_test3),
- stop_subagent(SA).
-
-undo_2(X) -> undo(X).
-
-undo_3(X) -> undo(X).
-
-%% Req. Test2
-v1_processing(suite) -> [];
-v1_processing(Config) when list(Config) ->
- ?DBG("v1_processing -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v1_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v2_processing(suite) -> [];
-v2_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v3_processing(suite) -> [];
-v3_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc), % same as v2!
- ?line unload_master("Test2").
-
-
-%% We'll try get/set/trap and inform for all the auth & priv protocols.
-%% For informs, the mgr is auth-engine. The agent has to sync. This is
-%% accomplished by the first inform sent. That one will generate a
-%% report, which makes it in sync. The notification-generating
-%% application times out, and send again. This time it'll work.
-
-v3_crypto_basic(suite) -> [];
-v3_crypto_basic(_Config) ->
- EID = [0,0,0,0,0,0,0,0,0,0,0,2],
- %% From rfc2274 appendix A.3.1
- ?line KMd5_1 = snmp:passwd2localized_key(md5, "maplesyrup", EID),
- ?line [16#52,16#6f,16#5e,16#ed,16#9f,16#cc,16#e2,16#6f,
- 16#89,16#64,16#c2,16#93,16#07,16#87,16#d8,16#2b] =
- KMd5_1,
- %% From rfc2274 appendix A.3.2
- ?line KSHA_1 = snmp:passwd2localized_key(sha, "maplesyrup", EID),
- ?line [16#66,16#95,16#fe,16#bc,16#92,16#88,16#e3,16#62,16#82,16#23,
- 16#5f,16#c7,16#15,16#1f,16#12,16#84,16#97,16#b3,16#8f,16#3f] =
- KSHA_1,
- %% From rfc2274, appendix A.5.1
- ?line KMd5_2 = snmp:passwd2localized_key(md5, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#88,16#05,16#61,16#51,16#41,16#67,16#6c,16#c9,
- 16#19,16#61,16#74,16#e7,16#42,16#a3,16#25,16#51] =
- snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- %% From rfc2274, appendix A.5.2
- ?line KSHA_2 = snmp:passwd2localized_key(sha, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#9c,16#10,16#17,16#f4,
- 16#fd,16#48,16#3d,16#2d,16#e8,16#d5,16#fa,16#db,
- 16#f8,16#43,16#92,16#cb,16#06,16#45,16#70,16#51] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2, 20,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- KSHA_1t = lists:sublist(KSHA_1, 16),
- KSHA_2t = lists:sublist(KSHA_2, 16),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#7e,16#f8,16#d8,16#a4,16#c9,16#cd,16#b2,16#6b,
- 16#47,16#59,16#1c,16#d8,16#52,16#ff,16#88,16#b5] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1t, KSHA_2t, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
-
- %% Try with correct random
- ?line Kc1 = snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2),
- ?line KMd5_2 = snmp_user_based_sm_mib:extract_new_key(md5, KMd5_1, Kc1),
- ?line Kc2 = snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2),
- ?line KSHA_2 = snmp_user_based_sm_mib:extract_new_key(sha, KSHA_1, Kc2),
- ok.
-
-
-
-v3_md5_auth(suite) -> [];
-v3_md5_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing MD5 authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authMD5", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authMD5"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_sha_auth(suite) -> [];
-v3_sha_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing SHA authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authSHA", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authSHA"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_des_priv(suite) -> [];
-v3_des_priv(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing DES encryption...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "privDES", authPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-%% -define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-%% Make sure mgr is in sync with agent
-v3_sync(Funcs) ->
- ?DBG("v3_sync -> entry with Funcs: ~p",[Funcs]),
- g([[sysDescr, 0]]),
- expect(432, report, [{?usmStatsNotInTimeWindows_instance, any}]),
- g([[sysDescr, 0]]),
- expect(433, [{[sysDescr,0], any}]),
- lists:foreach(fun({Func, Args}) -> apply(?MODULE, Func, Args) end, Funcs).
-
-v3_inform_sync(MA) ->
- ?DBG("v3_sync -> entry with MA: ~p => Send notification",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver,
- "standard inform", []),
- %% Make sure agent is in sync with mgr...
- ?DBG("v3_sync -> wait some time: ",[]),
- sleep(20000), % more than 1500*10 in target_addr.conf
- ?DBG("v3_sync -> await response",[]),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]).
-
-
-v2_caps(suite) -> [];
-v2_caps(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(v2_caps_i, [node()]).
-
-v2_caps_3(X) -> v2_caps(X).
-
-
-v2_caps_i(Node) ->
- ?line Idx = rpc:call(Node, snmp, add_agent_caps, [[1,2,3,4,5], "test cap"]),
- g([[sysORID, Idx], [sysORDescr, Idx]]),
- ?line expect(1, [{[sysORID, Idx], [1,2,3,4,5]},
- {[sysORDescr, Idx], "test cap"}]),
- ?line rpc:call(Node, snmp, del_agent_caps, [Idx]),
- g([[sysORID, Idx]]),
- ?line expect(2, [{[sysORID, Idx], noSuchInstance}]).
-
-
-%% Req. Test2
-v1_proc() ->
- ?DBG("v1_proc -> entry", []),
- %% According to RFC1157.
- %% Template: <Section>:<list no>
- v1_get_p(),
- v1_get_next_p(),
- v1_set_p().
-
-
-v1_get_p() ->
- %% 4.1.2:1
- g([[test2]]),
- ?line expect(10, noSuchName, 1, [{[test2], 'NULL'}]),
- g([[tDescr]]),
- ?line expect(11, noSuchName, 1, [{[tDescr], 'NULL'}]),
- g([[tDescr2,0]]),
- ?line expect(12, noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
- g([[tDescr3,0]]),
- ?line expect(131, noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
- g([[tDescr4,0]]),
- ?line expect(132, noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(14, noSuchName, 2, [{[sysDescr, 0], 'NULL'},
- {[tDescr,0], 'NULL'}]),
- g([[sysDescr,3]]),
- ?line expect(15, noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
-
- %% 4.1.2:2
- g([[tTable]]),
- ?line expect(20, noSuchName, 1, [{[tTable], 'NULL'}]),
- g([[tEntry]]),
- ?line expect(21, noSuchName, 1, [{[tEntry], 'NULL'}]),
-
- %% 4.1.2:3
- g([[tTooBig, 0]]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.2:4
- g([[tGenErr1, 0]]),
- ?line expect(40, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(41, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(42, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]).
-
-
-v1_get_next_p() ->
- %% 4.1.3:1
- gn([[1,3,7,1]]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
- gn([[tDescr2]]),
- ?line expect(11, tooBig, 0, any),
-
- %% 4.1.3:2
- gn([[tTooBig]]),
- io:format("We currently don't handle tooBig correct!!!\n"),
-% ?line expect(20, tooBig, 0, [{[tTooBig], 'NULL'}]),
- ?line expect(20, tooBig, 0, any),
-
- %% 4.1.3:3
- gn([[tGenErr1]]),
-% ?line expect(40, genErr, 1, [{[tGenErr1], 'NULL'}]),
- ?line expect(40, genErr, 1, any),
- gn([[tGenErr2]]),
-% ?line expect(41, genErr, 1, [{[tGenErr2], 'NULL'}]),
- ?line expect(41, genErr, 1, any),
- gn([[sysDescr], [tGenErr3]]),
-% ?line expect(42, genErr, 2, [{[sysDescr], 'NULL'},
-% {[tGenErr3], 'NULL'}]).
- ?line expect(42, genErr, 2, any).
-
-v1_set_p() ->
- %% 4.1.5:1
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(12, noSuchName, 1, [{[tDescr3,0], "read-only"}]),
- s([{[tDescr3], s, "noSuchObject"}]),
- ?line expect(13, noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
- s([{[tDescr3,1], s, "noSuchInstance"}]),
- ?line expect(14, noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
- s([{[tDescr2,0], s, "inconsistentName"}]),
- ?line expect(15, noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
-
- %% 4.1.5:2
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(20, badValue, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(21, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.1.5:3
- %% The standard is quite incorrect here. The resp pdu was too big. In
- %% the resp pdu, we have the original vbs. In the tooBig pdu we still
- %% have to original vbs => the tooBig pdu is too big as well!!! It
- %% may not get it to the manager, unless the agent uses 'NULL' instead
- %% of the std-like original value.
- s([{[tTooBig, 0], s, ?tooBigStr}]),
- %% according to std:
-% ?line expect(30, tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.5:4
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(40, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
- s([{[tDescr2, 0], s, "commit_fail"}]),
- ?line expect(41, genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
-
-%% Req. Test2
-v2_proc() ->
- %% According to RFC1905.
- %% Template: <Section>:<list no>
- ?DBG("v2_proc -> entry",[]),
- v2_get_p(),
- v2_get_next_p(),
- v2_get_bulk_p(),
- v2_set_p().
-
-v2_get_p() ->
- %% 4.2.1:2
- ?DBG("v2_get_p -> entry",[]),
- g([[test2]]),
- ?line expect(10, [{[test2], noSuchObject}]),
- g([[tDescr]]),
- ?line expect(11, [{[tDescr], noSuchObject}]),
- g([[tDescr4,0]]),
- ?line expect(12, [{[tDescr4,0], noSuchObject}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"},
- {[tDescr,0], noSuchObject}]),
- g([[tTable]]),
- ?line expect(14, [{[tTable], noSuchObject}]),
- g([[tEntry]]),
- ?line expect(15, [{[tEntry], noSuchObject}]),
-
- %% 4.2.1:3
- g([[tDescr2,0]]), %% instrum ret noSuchName!!!
- ?line expect(20, [{[tDescr2,0], noSuchInstance}]),
- g([[tDescr3,0]]),
- ?line expect(21, [{[tDescr3,0], noSuchInstance}]),
- g([[sysDescr,3]]),
- ?line expect(22, [{[sysDescr, 3], noSuchInstance}]),
- g([[tIndex,1]]),
- ?line expect(23, [{[tIndex, 1], noSuchInstance}]),
-
- %% 4.2.1 - any other error: genErr
- g([[tGenErr1, 0]]),
- ?line expect(30, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(31, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(32, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]),
-
- %% 4.2.1 - tooBig
- g([[tTooBig, 0]]),
- ?line expect(40, tooBig, 0, []).
-
-
-v2_get_next_p() ->
- %% 4.2.2:2
- ?DBG("v2_get_next_p -> entry",[]),
- gn([[1,3,7,1]]),
- ?line expect(10, [{[1,3,7,1], endOfMibView}]),
- gn([[sysDescr], [1,3,7,1]]),
- ?line expect(11, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gn([[tCnt2, 1]]),
- ?line expect(12, [{[tCnt2,2], 100}]),
- gn([[tCnt2, 2]]),
- ?line expect(12, [{[tCnt2,2], endOfMibView}]),
-
- %% 4.2.2 - any other error: genErr
- gn([[tGenErr1]]),
- ?line expect(20, genErr, 1, [{[tGenErr1], 'NULL'}]),
- gn([[tGenErr2]]),
- ?line expect(21, genErr, 1, [{[tGenErr2], 'NULL'}]),
- gn([[sysDescr], [tGenErr3]]),
- ?line expect(22, genErr, 2, [{[sysDescr], 'NULL'},
- {[tGenErr3], 'NULL'}]),
-
- %% 4.2.2 - tooBig
- gn([[tTooBig]]),
- ?line expect(20, tooBig, 0, []).
-
-v2_get_bulk_p() ->
- %% 4.2.3
- ?DBG("v2_get_bulk_p -> entry",[]),
- gb(1, 1, []),
- ?line expect(10, []),
- gb(-1, 1, []),
- ?line expect(11, []),
- gb(-1, -1, []),
- ?line expect(12, []),
- gb(-1, -1, []),
- ?line expect(13, []),
- gb(2, 0, [[sysDescr], [1,3,7,1]]),
- ?line expect(14, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(1, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(15, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(0, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(16, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(2, 2, [[sysDescr], [1,3,7,1], [sysDescr], [1,3,7,1]]),
- ?line expect(17, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(1, 2, [[sysDescr], [sysDescr], [tTooBig]]),
- ?line expect(18, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[sysDescr, 0], "Erlang SNMP agent"}]),
-
- gb(1,12, [[tDescr2], [sysDescr]]), % next one after tDescr2 is tTooBig.
- ?line expect(19, []),
-
- gb(2,2, [[sysDescr], [sysObjectID], [tGenErr1], [sysDescr]]),
- ?line expect(20, genErr, 3, [{[sysDescr], 'NULL'},
- {[sysObjectID], 'NULL'},
- {[tGenErr1], 'NULL'},
- {[sysDescr], 'NULL'}]),
- gb(0, 2, [[tCnt2, 1]]),
- ?line expect(21, [{[tCnt2,2], 100},
- {[tCnt2,2], endOfMibView}]).
-
-
-v2_set_p() ->
- %% 4.2.5:1
- ?DBG("v2_set_p -> entry",[]),
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noAccess, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noAccess, 1, [{[tDescr,0], "outside mibview"}]),
-
- %% 4.2.5:2
- s([{[1,3,6,1,0], s, "noSuchObject"}]),
- ?line expect(20, notWritable, 1, [{[1,3,6,1,0], "noSuchObject"}]),
-
- %% 4.2.5:3
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(30, wrongType, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(31, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.2.5:4
- s([{[tStr, 0], s, ""}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], ""}]),
- s([{[tStr, 0], s, "12345"}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], "12345"}]),
-
- %% 4.2.5:5 - N/A
-
- %% 4.2.5:6
- s([{[tInt1, 0], i, 0}]),
- ?line expect(60, wrongValue, 1, [{[tInt1, 0], 0}]),
- s([{[tInt1, 0], i, 5}]),
- ?line expect(61, wrongValue, 1, [{[tInt1, 0], 5}]),
- s([{[tInt2, 0], i, 0}]),
- ?line expect(62, wrongValue, 1, [{[tInt2, 0], 0}]),
- s([{[tInt2, 0], i, 5}]),
- ?line expect(63, wrongValue, 1, [{[tInt2, 0], 5}]),
- s([{[tInt3, 0], i, 5}]),
- ?line expect(64, wrongValue, 1, [{[tInt3, 0], 5}]),
-
- %% 4.2.5:7
- s([{[tDescrX, 1, 1], s, "noCreation"}]),
- ?line expect(70, noCreation, 1, [{[tDescrX, 1, 1], "noCreation"}]),
-
- %% 4.2.5:8
- s([{[tDescrX, 1, 2], s, "inconsistentName"}]),
- ?line expect(80, inconsistentName, 1,
- [{[tDescrX, 1, 2], "inconsistentName"}]),
-
- %% 4.2.5:9
- s([{[tCnt, 1, 2], i, 5}]),
- ?line expect(90, notWritable, 1, [{[tCnt, 1, 2], 5}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(90, notWritable, 1, [{[tDescr3,0], "read-only"}]),
-
- %% 4.2.5:10
- s([{[tDescr2,0], s, "inconsistentValue"}]),
- ?line expect(100, inconsistentValue, 1,
- [{[tDescr2,0], "inconsistentValue"}]),
-
- %% 4.2.5:11
- s([{[tDescr2,0], s, "resourceUnavailable"}]),
- ?line expect(110, resourceUnavailable, 1,
- [{[tDescr2,0],"resourceUnavailable"}]),
-
- %% 4.2.5:12
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(120, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]).
-
- %% commitFailed and undoFailed is tested by the 'undo' case.
-
-
-%% Req. OLD-SNMPEA-MIB
-table_test() ->
- io:format("Testing simple get, next and set on communityTable...~n"),
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
- Key1c3 = [intCommunityViewIndex,get(mip),is("public")],
- Key2c3 = [intCommunityViewIndex,get(mip),is("standard trap")],
- Key1c4 = [intCommunityAccess,get(mip),is("public")],
- EndKey = [intCommunityEntry,[9],get(mip),is("public")],
- gn([[intCommunityEntry]]),
- ?line expect(7, [{Key1c3, 2}]),
- gn([[intCommunityTable]]),
- ?line expect(71, [{Key1c3, 2}]),
- gn([[community]]),
- ?line expect(72, [{Key1c3, 2}]),
- gn([[otpSnmpeaMIB]]),
- ?line expect(73, [{Key1c3, 2}]),
- gn([[ericsson]]),
- ?line expect(74, [{Key1c3, 2}]),
- gn([Key1c3]),
- ?line expect(8, [{Key2c3, 2}]),
- gn([Key2c3]),
- ?line expect(9, [{Key1c4, 2}]),
- gn([EndKey]),
- AgentIp = [intAgentIpAddress,0],
- ?line expect(10, [{AgentIp, any}]),
- g([Key1c3]),
- ?line expect(11, [{Key1c3, 2}]),
- g([EndKey]),
- ?line ?v1_2(expect(12, noSuchName, 1, any),
- expect(12, [{EndKey, noSuchObject}])),
-
- io:format("Testing row creation/deletion on communityTable...~n"),
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
- s([{NewKeyc5, ?createAndGo}]),
- ?line expect(14, ?v1_2(badValue, inconsistentValue), 1,any),
- s([{NewKeyc5, ?createAndGo}, {NewKeyc3, 2}, {NewKeyc4, 2}]),
- ?line expect(15, [{NewKeyc5, ?createAndGo},{NewKeyc3, 2}, {NewKeyc4, 2}]),
- g([NewKeyc4]),
- ?line expect(16, [{NewKeyc4, 2}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(17, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc4, 2}]),
- ?line expect(18, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc4, 2}]),
- s([{NewKeyc5, ?createAndWait}]),
- ?line expect(19, [{NewKeyc5, ?createAndWait}]),
- g([NewKeyc5]),
- ?line expect(20, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc4, 2}]),
- ?line expect(21, [{NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(22, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc3, 2}]),
- ?line expect(23, [{NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(24, [{NewKeyc5, ?notInService}]),
- s([{NewKeyc5, ?active}]),
- ?line expect(25, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(26, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc3, 3}]),
- ?line expect(27, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc3, 3}]),
- otp_1128().
-
-%% Req. system group
-simple_standard_test() ->
- ?DBG("simple_standard_test -> entry",[]),
- gn([[1,1]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3]]),
- ?line expect(11, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6]]),
- ?line expect(12, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1]]),
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2]]),
- ?line expect(14, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1]]),
- ?line expect(15, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1,1]]),
- ?line expect(16, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[sysDescr]]),
- ?line expect(17, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr,0]]),
- ?line expect(2, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr]]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{[sysDescr], noSuchObject}])),
- g([[1,6,7,0]]),
- ?line ?v1_2(expect(41, noSuchName, 1, any),
- expect(3, [{[1,6,7,0], noSuchObject}])),
- gn([[1,13]]),
- ?line ?v1_2(expect(4, noSuchName,1, any),
- expect(4, [{[1,13], endOfMibView}])),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
- g([[sysLocation, 0]]),
- ?line expect(6, [{[sysLocation, 0], "new_value"}]),
- io:format("Testing noSuchName and badValue...~n"),
- s([{[sysServices,0], 3}]),
- ?line expect(61, ?v1_2(noSuchName, notWritable), 1, any),
- s([{[sysLocation, 0], i, 3}]),
- ?line expect(62, ?v1_2(badValue, wrongType), 1, any),
- ?DBG("simple_standard_test -> done",[]),
- ok.
-
-%% This is run in the agent node
-db_notify_client(suite) -> [];
-db_notify_client(Config) when list(Config) ->
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("~n\tSaNode: ~p~n\tMgrNode: ~p~n\tMibDir: ~p",
- [SaNode,MgrNode,MibDir]),
- snmpa_local_db:register_notify_client(self(),?MODULE),
-
- %% This call (the manager) will issue to set operations, so
- %% we expect to receive to notify(insert) calls.
- try_test(db_notify_client_test),
-
- ?DBG("await first notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("first notify received",[]),ok
- end,
-
- ?DBG("await second notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("second notify received",[]),ok
- end,
-
- snmpa_local_db:unregister_notify_client(self()).
-
-
-%% This is run in the manager node
-db_notify_client_test() ->
- ?DBG("set first new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
-
- ?DBG("set second new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]).
-
-notify(Pid,What) ->
- ?DBG("notify(~p,~p) -> called",[Pid,What]),
- Pid ! {db_notify_test_reply,What}.
-
-
-%% Req: system group, OLD-SNMPEA-MIB, Klas1
-big_test() ->
- ?DBG("big_test -> testing simple next/get/set @ master agent...",[]),
- simple_standard_test(),
-
- ?DBG("big_test -> testing simple next/get/set @ subagent...",[]),
- gn([[klas1]]),
- ?line expect(1, [{[fname,0], ""}]),
- g([[fname,0]]),
- ?line expect(2, [{[fname,0], ""}]),
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[fname,0]]),
- ?line expect(4, [{[fname,0], "test set"}]),
-
- ?DBG("big_test -> "
- "testing next from last instance in master to subagent...",[]),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname,0], "test set"}]),
- s([{[fname,0], s, ""}]),
- ?line expect(52, [{[fname,0], ""}]),
-
- table_test(),
-
- ?DBG("big_test -> adding one row in subagent table",[]),
- _FTab = [friendsEntry],
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {[friendsEntry, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [friendsEntry, [3, 3]]]),
- ?line expect(7, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?active}]),
- s([{[friendsEntry, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry, [3, 3]], ?destroy}]),
-
- otp_1131(),
-
- ?DBG("big_test -> adding two rows in subagent table with special INDEX",
- []),
- s([{[kompissEntry, [1, 3]], s, "kompis3"},
- {[kompissEntry, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?createAndGo}]),
- g([[kompissEntry, [1, 3]],
- [kompissEntry, [2, 3]]]),
- ?line expect(10, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- gn([[kompissEntry, [1]],
- [kompissEntry, [2]]]),
- ?line expect(11, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- s([{[kompissEntry, [1, 2]], s, "kompis3"},
- {[kompissEntry, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry, [1, 1]],
- [kompissEntry, [2, 1]]]),
- ?line expect(13, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?active}]),
- s([{[kompissEntry, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry, [2, 3]], ?destroy}]),
- s([{[kompissEntry, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry, [2, 2]], ?destroy}]),
- ?DBG("big_test -> done",[]),
- ok.
-
-%% Req. system group, Klas2, OLD-SNMPEA-MIB
-big_test_2() ->
- p("Testing simple next/get/set @ master agent (2)..."),
- simple_standard_test(),
-
- p("Testing simple next/get/set @ subagent (2)..."),
- gn([[klas2]]),
- ?line expect(1, [{[fname2,0], ""}]),
- g([[fname2,0]]),
- ?line expect(2, [{[fname2,0], ""}]),
- s([{[fname2,0], s, "test set"}]),
- ?line expect(3, [{[fname2,0], "test set"}]),
- g([[fname2,0]]),
- ?line expect(4, [{[fname2,0], "test set"}]),
-
- otp_1298(),
-
- p("Testing next from last object in master to subagent (2)..."),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname2,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname2,0], "test set"}]),
-
- table_test(),
-
- p("Adding one row in subagent table (2)"),
- _FTab = [friendsEntry2],
- s([{[friendsEntry2, [2, 3]], s, "kompis3"},
- {[friendsEntry2, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?createAndGo}]),
- g([[friendsEntry2, [2, 3]],
- [friendsEntry2, [3, 3]]]),
- ?line expect(7, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?active}]),
- s([{[friendsEntry2, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry2, [3, 3]], ?destroy}]),
-
- p("Adding two rows in subagent table with special INDEX (2)"),
- s([{[kompissEntry2, [1, 3]], s, "kompis3"},
- {[kompissEntry2, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?createAndGo}]),
- g([[kompissEntry2, [1, 3]],
- [kompissEntry2, [2, 3]]]),
- ?line expect(10, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- gn([[kompissEntry2, [1]],
- [kompissEntry2, [2]]]),
- ?line expect(11, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- s([{[kompissEntry2, [1, 2]], s, "kompis3"},
- {[kompissEntry2, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry2, [1, 1]],
- [kompissEntry2, [2, 1]]]),
- ?line expect(13, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?active}]),
- s([{[kompissEntry2, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry2, [2, 3]], ?destroy}]),
- s([{[kompissEntry2, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry2, [2, 2]], ?destroy}]),
- ok.
-
-%% Req. Test1
-multi_threaded_test() ->
- p("Testing multi threaded agent..."),
- g([[multiStr,0]]),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(1, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "pelle"}]),
- ?line expect(2, [{[sysLocation, 0], "pelle"}]),
- Pid ! continue,
- ?line expect(3, [{[multiStr,0], "ok"}]),
-
- s([{[multiStr, 0], s, "block"}]),
- Pid2 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(4, [{[sysUpTime,0], any}]),
- g([[multiStr,0]]),
- Pid3 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(5, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "kalle"}]),
- Pid3 ! continue,
- ?line expect(6, [{[multiStr,0], "ok"}]),
- Pid2 ! continue,
- ?line expect(7, [{[multiStr,0], "block"}]),
- ?line expect(8, [{[sysLocation,0], "kalle"}]).
-
-%% Req. Test1, TestTrapv2
-mt_trap_test(MA) ->
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- snmpa:send_trap(MA, mtTrap, "standard trap"),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(2, [{[sysUpTime,0], any}]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- Pid ! continue,
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [2]},
- {[multiStr,0], "ok"}]).
-
-
-get_multi_pid() ->
- get_multi_pid(10).
-get_multi_pid(0) ->
- ?line ?FAIL(no_global_name);
-get_multi_pid(N) ->
- sleep(1000),
- case global:whereis_name(snmp_multi_tester) of
- Pid when pid(Pid) -> Pid;
- _ -> get_multi_pid(N-1)
- end.
-
-%% Req. Test1
-types_v2_test() ->
- p("Testing v2 types..."),
-
- s([{[bits1,0], 2#10}]),
- ?line expect(1, [{[bits1,0], ?str(2#10)}]),
- g([[bits1,0]]),
- ?line expect(2, [{[bits1,0], ?str(2#101)}]),
-
- s([{[bits2,0], 2#11000000110}]),
- ?line expect(3, [{[bits2,0], ?str(2#11000000110)}]),
- g([[bits2,0]]),
- ?line expect(4, [{[bits2,0], ?str(2#11000000110)}]),
-
- g([[bits3,0]]),
- ?line expect(50, genErr, 1, any),
-
- g([[bits4,0]]),
- ?line expect(51, genErr, 1, any),
-
- s([{[bits1,0], s, [2#10]}]),
- ?line expect(6, ?v1_2(badValue, wrongValue), 1, any),
-
- s([{[bits2,0], 2#11001001101010011}]),
- ?line expect(7, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%% Req. Test1
-implied_test(MA) ->
- ?LOG("implied_test -> start",[]),
- p("Testing IMPLIED..."),
-
- snmpa:verbosity(MA,trace),
- snmpa:verbosity(MA,trace),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = "apa",
- Idx2 = "qq",
- ?DBG("implied_test -> (send) create row 1 '~s' in table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?createAndGo}, {[testDescr, Idx1],s,"row 1"}]),
- ?line expect(1, [{[testStatus, Idx1], ?createAndGo},
- {[testDescr, Idx1], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?createAndGo}, {[testDescr, Idx2],s,"row 2"}]),
- ?line expect(2, [{[testStatus, Idx2], ?createAndGo},
- {[testDescr, Idx2], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr)",[]),
- gn([[testDescr]]),
- ?line expect(3, [{[testDescr,Idx1], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr) of row 1",[]),
- gn([[testDescr,Idx1]]),
- ?line expect(4, [{[testDescr,Idx2], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?destroy}]),
- ?line expect(5, [{[testStatus, Idx1], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?destroy}]),
- ?line expect(6, [{[testStatus, Idx2], ?destroy}]),
-
- %% Try the same in other table
- Idx3 = [1, "apa"],
- Idx4 = [1, "qq"],
- ?DBG("implied_test -> (send) create row 1 '~s' in table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?createAndGo}, {[testDescr2,Idx3],s,"row 1"}]),
- ?line expect(1, [{[testStatus2, Idx3], ?createAndGo},
- {[testDescr2, Idx3], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?createAndGo}, {[testDescr2,Idx4],s,"row 2"}]),
- ?line expect(2, [{[testStatus2, Idx4], ?createAndGo},
- {[testDescr2, Idx4], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr2)",[]),
- gn([[testDescr2]]),
- ?line expect(3, [{[testDescr2,Idx3], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr2) of row 1",[]),
- gn([[testDescr2,Idx3]]),
- ?line expect(4, [{[testDescr2,Idx4], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?destroy}]),
- ?line expect(5, [{[testStatus2, Idx3], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?destroy}]),
- ?line expect(6, [{[testStatus2, Idx4], ?destroy}]),
-
- snmpa:verbosity(MA,log),
-
- ?LOG("implied_test -> done",[]).
-
-
-
-%% Req. Test1
-sparse_table_test() ->
- p("Testing sparse table..."),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- s([{[sparseStatus, Idx1], i, ?createAndGo},
- {[sparseDescr, Idx1], s, "row 1"}]),
- ?line expect(1, [{[sparseStatus, Idx1], ?createAndGo},
- {[sparseDescr, Idx1], "row 1"}]),
- s([{[sparseStatus, Idx2], i, ?createAndGo},
- {[sparseDescr, Idx2], s, "row 2"}]),
- ?line expect(2, [{[sparseStatus, Idx2], ?createAndGo},
- {[sparseDescr, Idx2], "row 2"}]),
- ?v1_2(gn([[sparseIndex], [sparseDescr,Idx1], [sparseDescr,Idx2],
- [sparseStatus,Idx1], [sparseStatus,Idx2]]),
- gb(0,5,[[sparseIndex]])),
- ?line expect(3, [{[sparseDescr,Idx1], "row 1"},
- {[sparseDescr,Idx2], "row 2"},
- {[sparseStatus,Idx1], ?active},
- {[sparseStatus,Idx2], ?active},
- {[sparseStr,0], "slut"}]),
- % Delete the rows
- s([{[sparseStatus, Idx1], i, ?destroy}]),
- ?line expect(4, [{[sparseStatus, Idx1], ?destroy}]),
- s([{[sparseStatus, Idx2], i, ?destroy}]),
- ?line expect(5, [{[sparseStatus, Idx2], ?destroy}]).
-
-
-%% Req. Test1
-cnt_64_test(MA) ->
- ?LOG("start cnt64 test (~p)",[MA]),
- snmpa:verbosity(MA,trace),
- ?LOG("start cnt64 test",[]),
- p("Testing Counter64, and at the same time, RowStatus is not last column"),
-
- ?DBG("get cnt64",[]),
- g([[cnt64,0]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(1, noSuchName, 1, any),
- expect(1, [{[cnt64,0],18446744073709551615}])),
- ?DBG("get-next cnt64",[]),
- gn([[cnt64]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(2, [{[cnt64Str,0], "after cnt64"}]),
- expect(2, [{[cnt64,0],18446744073709551615}])),
- ?DBG("send cntTrap",[]),
- snmpa:send_trap(MA,cntTrap,"standard trap",[{sysContact,"pelle"},
- {cnt64, 10},
- {sysLocation, "here"}]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, trap, [test], 6, 1, [{[sysContact,0], "pelle"},
- {[sysLocation,0], "here"}]),
- expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [1]},
- {[sysContact,0], "pelle"},
- {[cnt64,0], 10},
- {[sysLocation,0], "here"}])),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- ?DBG("create row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(1, [{[cntStatus, Idx1], ?createAndGo}]),
- ?DBG("create row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(2, [{[cntStatus, Idx2], ?createAndGo}]),
-
- ?DBG("get-next (cntIndex)",[]),
- gn([[cntIndex]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, [{[cntStatus,Idx1], ?active}]),
- expect(3, [{[cntCnt,Idx1], 0}])),
- % Delete the rows
- ?DBG("delete row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(4, [{[cntStatus, Idx1], ?destroy}]),
- ?DBG("delete row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(5, [{[cntStatus, Idx2], ?destroy}]),
- catch snmpa:verbosity(MA,log),
- ?DBG("done",[]),
- ok.
-
-%% Req. Test1
-opaque_test() ->
- p("Testing Opaque datatype..."),
- g([[opaqueObj,0]]),
- ?line expect(1, [{[opaqueObj,0], "opaque-data"}]).
-
-%% Req. OLD-SNMPEA-MIB
-api_test(MaNode) ->
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [intAgentIpAddress]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp,
- oid_to_name, [OID]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [[1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int, [intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp,
- int_to_enum, ['RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['xxRowStatus', 1]),
- ?line case snmp:date_and_time() of
- List when list(List), length(List) == 8 -> ok;
- List when list(List), length(List) == 11 -> ok
- end.
-
-%% Req. Klas3
-api_test2() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]),
- g([[fname4,0]]),
- ?line expect(2, [{[fname4,0], 1}]).
-
-api_test3() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]).
-
-
-unreg_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[snmpInPkts, 0], any}]).
-
-load_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[fname,0], ""}]).
-
-%% Req. Klas1
-load_test_sa() ->
- gn([[?v1_2(sysServices,sysORLastChange), 0]]),
- ?line expect(1, [{[fname,0], any}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_get() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0], Key1c4, [fname,0],Key1c3,
- [sysName,0]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,0], "test"}]),
- g([[1,3,7,1], Key1c4, [sysDescr,0], [1,3,7,2], Key1c3, [sysDescr,0]]),
- ?line ?v1_2(expect(2, noSuchName, [1,4], any),
- expect(2, [{[1,3,7,1], noSuchObject},
- {Key1c4, 2},
- {[sysDescr,0], "Erlang SNMP agent"},
- {[1,3,7,2], noSuchObject},
- {Key1c3, 2},
- {[sysDescr,0], "Erlang SNMP agent"}])).
-
-%% Req. v1, system group, Klas1, OLD-SNMPEA-MIB, *ej* Klas3.
-do_mul_get_err() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0],Key1c4,[fname,0], Key1c3, [sysName,2]]),
- ?line ?v1_2(expect(1, noSuchName, 5, any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,2], noSuchInstance}])),
- g([[sysDescr,0],Key1c4,[fname3,0], Key1c3, [sysName,1]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname3,0], noSuchObject},
- {Key1c3, 2},
- {[sysName,1], noSuchInstance}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [fname],Key1c3s,[sysName]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2}, {[fname,0], "test set"},
- {Key1c3, 2}, {[sysName,0], "test"}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next_err() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [1,3,6,999], [fname],[1,3,90], Key1c3s,[sysName]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[1,3,6,999], endOfMibView},
- {[fname,0], "test set"},
- {[1,3,90], endOfMibView},
- {Key1c3, 2},
- {[sysName,0], "test"}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set() ->
- p("Adding one row in subagent table, and one in master table"),
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, [{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [sysLocation,0],
- [friendsEntry, [3, 3]]]),
- ?line expect(2, [{[friendsEntry, [2, 3]], "kompis3"},
- {[sysLocation,0], "new_value"},
- {[friendsEntry, [3, 3]], ?active}]),
- g([NewKeyc4]),
- ?line expect(3, [{NewKeyc4, 2}]),
- s([{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]),
- ?line expect(4, [{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- p("Adding one row in subagent table, and one in master table"),
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {NewKeyc3, 2},
- {[sysUpTime,0], 45}, % sysUpTime (readOnly)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, notWritable), 3, any),
- g([[friendsEntry, [2, 3]]]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{[friendsEntry, [2,3]], noSuchInstance}])),
- g([NewKeyc4]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB
-sa_mib() ->
- g([[sa, [2,0]]]),
- ?line expect(1, [{[sa, [2,0]], 3}]),
- s([{[sa, [1,0]], s, "sa_test"}]),
- ?line expect(2, [{[sa, [1,0]], "sa_test"}]).
-
-ma_trap1(MA) ->
- snmpa:send_trap(MA, testTrap2, "standard trap"),
- ?line expect(1, trap, [system], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]),
- snmpa:send_trap(MA, testTrap1, "standard trap"),
- ?line expect(2, trap, [1,2,3] , 1, 0, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]).
-
-ma_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap2(MA) ->
- snmpa:send_trap(MA,linkUp,"standard trap",[{ifIndex, [1], 1},
- {ifAdminStatus, [1], 1},
- {ifOperStatus, [1], 2}]),
- ?line expect(3, trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
- {[ifAdminStatus, 1], 1},
- {[ifOperStatus, 1], 2}]).
-
-sa_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(5, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "pelle"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(6, trap, [ericsson], 6, 2, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]}]).
-
-ma_v2_trap1(MA) ->
- ?DBG("ma_v2_traps -> entry with MA = ~p => "
- "send standard trap: testTrapv22",[MA]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_traps -> send standard trap: testTrapv21",[]),
- snmpa:send_trap(MA, testTrapv21, "standard trap"),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmp ++ [1]}]).
-
-ma_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"}]).
-
-%% Note: This test case takes a while... actually a couple of minutes.
-ma_v2_inform1(MA) ->
- ?DBG("ma_v2_inform -> entry with MA = ~p => "
- "send notification: testTrapv22",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver, "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag1, self()},
- "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag1, [_]} ->
- ok;
- {snmp_targets, tag1, Addrs1} ->
- ?line ?FAIL({bad_addrs, Addrs1})
- after
- 5000 ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag1, {got_response, _}} ->
- ok;
- {snmp_notification, tag1, {no_response, _}} ->
- ?line ?FAIL(no_response)
- after
- 20000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
-
- %%
- %% -- The rest is possibly erroneous...
- %%
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag2, self()},
- "standard inform", []),
- ?line expect(2, {inform, false},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag2, [_]} ->
- ok;
- {snmp_targets, tag2, Addrs2} ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag2) timeout",[]),
- ?line ?FAIL({bad_addrs, Addrs2})
- after
- 5000 ->
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag2, {got_response, _}} ->
- ?line ?FAIL(got_response);
- {snmp_notification, tag2, {no_response, _}} ->
- ok
- after
- 240000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag2) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end.
-
-
-ma_v1_2_v2_trap(MA) ->
- snmpa:send_trap(MA,linkDown,"standard trap",[{ifIndex, [1], 1}]),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmpTraps ++ [3]},
- {[ifIndex, 1], 1},
- {[snmpTrapEnterprise, 0], [1,2,3]}]).
-
-
-ma_v1_2_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"},
- {[snmpTrapEnterprise, 0], ?system}]).
-
-
-sa_v1_2_v2_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-sa_v1_2_v2_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]], "pelle"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-sa_v1_2_v2_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 2]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_bad_value() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 5}, % badValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, badValue, 2, any),
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 6}, % wrongValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, ?v1_2(badValue, wrongValue), 2, any),
- g([NewKeyc4]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_gen_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},{NewKeyc4, 2},
- {NewKeyc5, ?createAndGo}, {[sa, [3,0]], 5}]),
- ?line expect(1, genErr, 4, any),
-% The row might have been added; we don't know.
-% (as a matter of fact we do - it is added, because the agent
-% first sets its own vars, and then th SAs. Lets destroy it.
- s([{NewKeyc5, ?destroy}]),
- ?line expect(2, [{NewKeyc5, ?destroy}]).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_too_big() ->
- g([[sa, [4,0]]]),
- ?line expect(1, tooBig).
-
-%% Req. Klas1, system group, snmp group (v1/v2)
-next_across_sa() ->
- gn([[sysDescr],[klas1,5]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {[snmpInPkts, 0], any}]).
-
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]). -> noError
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]). -> {badValue, 2}
-%% snmp_test_mgr:s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]). -> {genErr, 2}
-%% Req. Klas3, Klas4
-undo_test() ->
- s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- ?line expect(1, [{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]),
- ?line expect(2, ?v1_2(badValue, inconsistentValue), 2, any),
- s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]),
- ?line expect(3, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]),
- ?line expect(4, ?v1_2(genErr, commitFailed), 1, any),
-% unfortunatly we don't know if we'll get undoFailed or commitFailed.
-% it depends on which order the agent traverses the varbind list.
-% s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]),
-% ?line expect(5, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]),
- ?line expect(6, genErr, 2, any).
-
-%% Req. Klas3, Klas4
-bad_return() ->
- g([[fStatus4,4],
- [fName4,4]]),
- ?line expect(4, genErr, 2, any),
- g([[fStatus4,5],
- [fName4,5]]),
- ?line expect(5, genErr, 1, any),
- g([[fStatus4,6],
- [fName4,6]]),
- ?line expect(6, genErr, 2, any),
- gn([[fStatus4,7],
- [fName4,7]]),
- ?line expect(7, genErr, 2, any),
- gn([[fStatus4,8],
- [fName4,8]]),
- ?line expect(8, genErr, 1, any),
- gn([[fStatus4,9],
- [fName4,9]]),
- ?line expect(9, genErr, 2, any).
-
-
-%%%-----------------------------------------------------------------
-%%% Test the implementation of standard mibs.
-%%% We should *at least* try to GET all variables, just to make
-%%% sure the instrumentation functions work.
-%%% Note that many of the functions in the standard mib is
-%%% already tested by the normal tests.
-%%%-----------------------------------------------------------------
-
-
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v1.
-%% o Test the counters and control objects in SNMP-STANDARD-MIB
-%%-----------------------------------------------------------------
-snmp_standard_mib(suite) -> [];
-snmp_standard_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?DBG("snmp_standard_mib -> std_mib_init", []),
- try_test(std_mib_init),
-
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- InBadVsns = try_test(std_mib_a),
- put(vsn, v2),
- ?DBG("snmp_standard_mib -> std_mib_read", []),
- try_test(std_mib_read),
- put(vsn, v1),
-
- ?DBG("snmp_standard_mib -> std_mib_b (~w)", [InBadVsns]),
- Bad = try_test(std_mib_b, [InBadVsns]),
- ?DBG("snmp_standard_mib -> std_mib_read (community: 'bad community')", []),
- try_test(std_mib_read, [], [{community, "bad community"}]),
- ?DBG("snmp_standard_mib -> std_mib_write (community: 'public')", []),
- try_test(std_mib_write, [], [{community, "public"}]),
- ?DBG("snmp_standard_mib -> std_mib_asn_err", []),
- try_test(std_mib_asn_err),
- ?DBG("snmp_standard_mib -> std_mib_c (~w)", [Bad]),
- try_test(std_mib_c, [Bad]),
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- try_test(standard_mib_a),
-
- ?DBG("snmp_standard_mib -> std_mib_finish", []),
- try_test(std_mib_finish),
- ?DBG("snmp_standard_mib -> std_mib_test_finish", []),
- try_test(standard_mib_test_finish, [], [{community, "bad community"}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_a() ->
- ?line [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
- ?line [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
- ?line OutPkts2 = OutPkts + 1,
- %% There are some more counters we could test here, but it's not that
- %% important, since they are removed from SNMPv2-MIB.
- ok.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_init() ->
- %% disable authentication failure traps. (otherwise w'd get many of
- %% them - this is also a test to see that it works).
- s([{[snmpEnableAuthenTraps,0], 2}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 2}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_finish() ->
- %% enable again
- s([{[snmpEnableAuthenTraps,0], 1}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 1}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_test_finish() ->
- %% force a authenticationFailure
- std_mib_write(),
- %% check that we got a trap
- ?line expect(2, trap, [1,2,3], 4, 0, []).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_read() ->
- ?DBG("std_mib_read -> entry", []),
- g([[sysUpTime,0]]), % try a bad <something>; msg dropped, no reply
- ?DBG("std_mib_read -> await timeout (i.e. no reply)", []),
- ?line expect(1, timeout). % make sure we don't get a trap!
-
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_write() ->
- ?DBG("std_mib_write -> entry", []),
- s([{[sysLocation, 0], "new_value"}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_asn_err() ->
- snmp_test_mgr:send_bytes([48,99,67,12,0,0,0,0,0,0,5]).
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v2 and v3.
-%% o Test the counters and control objects in SNMPv2-MIB
-%%-----------------------------------------------------------------
-snmpv2_mib_2(suite) -> [];
-snmpv2_mib_2(Config) when list(Config) ->
- ?LOG("snmpv2_mib_2 -> start",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?DBG("snmpv2_mib_2 -> standard mib init",[]),
- try_test(std_mib_init),
-
- ?DBG("snmpv2_mib_2 -> get number of (so far) bad versions",[]),
- InBadVsns = try_test(std_mib_a),
-
- ?DBG("snmpv2_mib_2 -> make a bad version read",[]),
- put(vsn, v1),
- try_test(std_mib_read),
-
- ?DBG("snmpv2_mib_2 -> bad version read",[]),
- put(vsn, v2),
- Bad = try_test(std_mib_b, [InBadVsns]),
-
- ?DBG("snmpv2_mib_2 -> read with bad community",[]),
- try_test(std_mib_read, [], [{community, "bad community"}]),
-
- ?DBG("snmpv2_mib_2 -> write with public community",[]),
- try_test(std_mib_write, [], [{community, "public"}]),
-
- ?DBG("snmpv2_mib_2 -> asn err",[]),
- try_test(std_mib_asn_err),
-
- ?DBG("snmpv2_mib_2 -> check counters",[]),
- try_test(std_mib_c, [Bad]),
-
- ?DBG("snmpv2_mib_2 -> get som counters",[]),
- try_test(snmpv2_mib_a),
-
- ?DBG("snmpv2_mib_2 -> enable auth traps, and await some",[]),
- try_test(std_mib_finish),
-
- ?DBG("snmpv2_mib_2 -> force auth failure, and await trap, "
- "then disable auth traps",[]),
- try_test(snmpv2_mib_test_finish, [], [{community, "bad community"}]),
-
- ?LOG("snmpv2_mib_2 -> done",[]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_3(suite) -> [];
-snmpv2_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- InBadVsns = try_test(std_mib_a),
- put(vsn, v1),
- try_test(std_mib_read),
- put(vsn, v3),
- _Bad = try_test(std_mib_b, [InBadVsns]),
- try_test(snmpv2_mib_a),
-
- try_test(std_mib_finish).
-
--define(authenticationFailure, [1,3,6,1,6,3,1,1,5,5]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_test_finish() ->
- %% force a authenticationFailure
- ?DBG("ma_v2_inform -> write to std mib",[]),
- std_mib_write(),
-
- %% check that we got a trap
- ?DBG("ma_v2_inform -> await trap",[]),
- ?line expect(2, v2trap, [{[sysUpTime,0], any},
- {[snmpTrapOID,0], ?authenticationFailure}]),
-
- %% and the the inform
- ?DBG("ma_v2_inform -> await inform",[]),
- ?line expect(2, {inform,true}, [{[sysUpTime,0], any},
- {[snmpTrapOID,0],?authenticationFailure}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_a() ->
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
-
- ?line [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
- InBadVsns.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_b(InBadVsns) ->
- ?line [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
- ?line InBadVsns2 = InBadVsns + 1,
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
- ?line [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
- get_req(4, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- {InBadCommunityNames, InBadCommunityUses, InASNErrs}.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_c({InBadCommunityNames, InBadCommunityUses, InASNErrs}) ->
- ?line [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
- get_req(1, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- ?line InBadCommunityNames2 = InBadCommunityNames + 1,
- ?line InBadCommunityUses2 = InBadCommunityUses + 1,
- ?line InASNErrs2 = InASNErrs + 1.
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_a() ->
- ?line [SetSerial] = get_req(2, [[snmpSetSerialNo,0]]),
- s([{[snmpSetSerialNo,0], SetSerial}, {[sysLocation, 0], "val2"}]),
- ?line expect(3, [{[snmpSetSerialNo,0], SetSerial},
- {[sysLocation, 0], "val2"}]),
- s([{[sysLocation, 0], "val3"}, {[snmpSetSerialNo,0], SetSerial}]),
- ?line expect(4, inconsistentValue, 2,
- [{[sysLocation, 0], "val3"},
- {[snmpSetSerialNo,0], SetSerial}]),
- ?line ["val2"] = get_req(5, [[sysLocation,0]]).
-
-
-%%-----------------------------------------------------------------
-%% o Bad community uses/name is tested already
-%% in SNMPv2-MIB and STANDARD-MIB.
-%% o Test add/deletion of rows.
-%%-----------------------------------------------------------------
-snmp_community_mib(suite) -> [];
-snmp_community_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- try_test(snmp_community_mib),
- ?line unload_master("SNMP-COMMUNITY-MIB").
-
-snmp_community_mib_2(X) -> snmp_community_mib(X).
-
-%% Req. SNMP-COMMUNITY-MIB
-snmp_community_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o Test engine boots / time
-%%-----------------------------------------------------------------
-snmp_framework_mib(suite) -> [];
-snmp_framework_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- try_test(snmp_framework_mib),
- ?line unload_master("SNMP-FRAMEWORK-MIB").
-
-snmp_framework_mib_2(X) -> snmp_framework_mib(X).
-
-snmp_framework_mib_3(suite) -> [];
-snmp_framework_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(snmp_framework_mib).
-
-
-%% Req. SNMP-FRAMEWORK-MIB
-snmp_framework_mib() ->
- ?line ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
- ?line [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
- sleep(5000),
- ?line [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
- if
- EngineTime+7 < EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- EngineTime+4 > EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- true -> ok
- end,
- ?line case get_req(4, [[snmpEngineBoots,0]]) of
- [Boots] when integer(Boots) -> ok;
- Else -> ?FAIL(Else)
- end,
- ok.
-
-%%-----------------------------------------------------------------
-%% o Test the counters
-%%-----------------------------------------------------------------
-snmp_mpd_mib_3(suite) -> [];
-snmp_mpd_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- UnknownPDUHs = try_test(snmp_mpd_mib_a),
- try_test(snmp_mpd_mib_b, [], [{context_engine_id, "bad engine"}]),
- try_test(snmp_mpd_mib_c, [UnknownPDUHs]).
-
-
-%% Req. SNMP-MPD-MIB
-snmp_mpd_mib_a() ->
- ?line [UnknownSecs, InvalidMsgs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0]]),
- Pdu = #pdu{type = 'get-request',
- request_id = 23,
- error_status = noError,
- error_index = 0,
- varbinds = []},
- SPdu = #scopedPdu{contextEngineID = "agentEngine",
- contextName = "",
- data = Pdu},
- ?line SPDUBytes = snmp_pdus:enc_scoped_pdu(SPdu),
- V3Hdr1 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [7],
- msgSecurityModel = 23, % bad sec model
- msgSecurityParameters = []},
- V3Hdr2 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [6], % bad flag combination
- msgSecurityModel = 3,
- msgSecurityParameters = []},
- Message1 = #message{version = 'version-3', vsn_hdr = V3Hdr1,
- data = SPDUBytes},
- Message2 = #message{version = 'version-3', vsn_hdr = V3Hdr2,
- data = SPDUBytes},
- ?line MsgBytes1 = snmp_pdus:enc_message_only(Message1),
- ?line MsgBytes2 = snmp_pdus:enc_message_only(Message2),
- snmp_test_mgr:send_bytes(MsgBytes1),
- snmp_test_mgr:send_bytes(MsgBytes2),
-
- ?line [UnknownSecs2, InvalidMsgs2, UnknownPDUHs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0],
- [snmpUnknownPDUHandlers, 0]]),
- ?line UnknownSecs2 = UnknownSecs + 1,
- ?line InvalidMsgs2 = InvalidMsgs + 1,
- UnknownPDUHs.
-
--define(snmpUnknownPDUHandlers_instance, [1,3,6,1,6,3,11,2,1,3,0]).
-snmp_mpd_mib_b() ->
- g([[sysUpTime,0]]),
- ?line expect(1, report, [{?snmpUnknownPDUHandlers_instance, any}]).
-
-
-snmp_mpd_mib_c(UnknownPDUHs) ->
- ?line [UnknownPDUHs2] = get_req(1, [[snmpUnknownPDUHandlers, 0]]),
- ?line UnknownPDUHs2 = UnknownPDUHs + 1.
-
-
-snmp_target_mib(suite) -> [];
-snmp_target_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-TARGET-MIB"),
- try_test(snmp_target_mib),
- ?line unload_master("SNMP-TARGET-MIB").
-
-snmp_target_mib_2(X) -> snmp_target_mib(X).
-
-snmp_target_mib_3(X) -> snmp_target_mib(X).
-
-snmp_target_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-snmp_notification_mib(suite) -> [];
-snmp_notification_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- try_test(snmp_notification_mib),
- ?line unload_master("SNMP-NOTIFICATION-MIB").
-
-snmp_notification_mib_2(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib_3(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o add/delete views and try them
-%% o try boundaries
-%%-----------------------------------------------------------------
-snmp_view_based_acm_mib(suite) -> [];
-snmp_view_based_acm_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master("Test2"),
- snmp_view_based_acm_mib(),
- ?line unload_master("Test2"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-snmp_view_based_acm_mib_2(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib_3(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib() ->
- snmpa:verbosity(net_if,trace),
- snmpa:verbosity(master_agent,trace),
- ?LOG("start snmp_view_based_acm_mib test",[]),
- %% The user "no-rights" is present in USM, and is mapped to security
- %% name 'no-rights", which is not present in VACM.
- %% So, we'll add rights for it, try them and delete them.
- %% We'll give "no-rights" write access to tDescr.0 and read access
- %% to tDescr2.0
- %% These are the options we'll use to the mgr
- Opts = [{user, "no-rights"}, {community, "no-rights"}],
- %% Find the valid secmodel, and one invalid secmodel.
- {SecMod, InvSecMod} =
- case get(vsn) of
- v1 -> {?SEC_V1, ?SEC_V2C};
- v2 -> {?SEC_V2C, ?SEC_USM};
- v3 -> {?SEC_USM, ?SEC_V1}
- end,
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Now, add a mapping from "no-rights" -> "no-rights-group"
- GRow1Status = [vacmSecurityToGroupStatus,[SecMod, 9,"no-rights"]],
- GRow1 =
- [{[vacmGroupName, [SecMod, 9,"no-rights"]], "no-rights-group"},
- {GRow1Status, ?createAndGo}],
- ?DBG("set '~p'",[GRow1]),
- ?line try_test(do_set, [GRow1]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create a mapping for another sec model, and make sure it dosn't
- %% give us access
- GRow2Status = [vacmSecurityToGroupStatus,[InvSecMod, 9,"no-rights"]],
- GRow2 = [{[vacmGroupName, [InvSecMod, 9, "no-rights"]], "initial"},
- {GRow2Status, ?createAndGo}],
-
- ?DBG("set '~p'",[GRow2]),
- ?line try_test(do_set, [GRow2]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [GRow2Status]),
-
- RVName = "rv_name",
- WVName = "wv_name",
-
- %% Access row
- ARow1Idx = [15 | "no-rights-group"] ++ [0, ?SEC_ANY, 1],
- ARow1Status = [vacmAccessStatus, ARow1Idx],
- ARow1 = [{[vacmAccessContextMatch, ARow1Idx], 1},
- {[vacmAccessReadViewName, ARow1Idx], RVName},
- {[vacmAccessWriteViewName, ARow1Idx], WVName},
- {ARow1Status, ?createAndGo}],
-
- %% This access row would give acces, if InvSecMod was valid.
- ARow2Idx = [15 | "no-rights-group"] ++ [0, InvSecMod, 1],
- ARow2Status = [vacmAccessStatus, ARow2Idx],
- ARow2 = [{[vacmAccessContextMatch, ARow2Idx], 1},
- {[vacmAccessReadViewName, ARow2Idx], "internet"},
- {[vacmAccessWriteViewName, ARow2Idx], "internet"},
- {ARow2Status, ?createAndGo}],
-
- ?line try_test(do_set, [ARow2]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [ARow2Status]),
-
-
- %% Add valid row
- ?line try_test(do_set, [ARow1]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create the view family
- VRow1Idx = mk_ln(RVName) ++ mk_ln(?xDescr), % object access
- VRow2Idx = mk_ln(RVName) ++ mk_ln(?xDescr2 ++ [0]), % instance access
- VRow3Idx = mk_ln(WVName) ++ mk_ln(?xDescr), % object access
- VRow4Idx = mk_ln(WVName) ++ mk_ln(?xDescr ++ [0]), % instance access
- VRow1Status = [vacmViewTreeFamilyStatus, VRow1Idx],
- VRow2Status = [vacmViewTreeFamilyStatus, VRow2Idx],
- VRow3Status = [vacmViewTreeFamilyStatus, VRow3Idx],
- VRow4Status = [vacmViewTreeFamilyStatus, VRow4Idx],
-
- ?line try_test(add_row, [VRow1Status]),
- ?line try_test(add_row, [VRow2Status]),
- ?line try_test(add_row, [VRow3Status]),
-
- %% We're supposed to have access now...
- ?line try_test(use_rights, [], Opts),
-
- %% Change Row3 to Row4
- ?line try_test(del_row, [VRow3Status]),
- ?line try_test(add_row, [VRow4Status]),
-
- %% We should still have access...
- ?line try_test(use_rights, [], Opts),
-
- %% Delete rows
- ?line try_test(del_row, [GRow1Status]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete rest of rows
- ?line try_test(del_row, [ARow1Status]),
- ?line try_test(del_row, [VRow1Status]),
- ?line try_test(del_row, [VRow2Status]),
- ?line try_test(del_row, [VRow4Status]),
-
- ?line try_test(use_no_rights, [], Opts),
- snmpa:verbosity(master_agent,log).
-
-do_set(Row) ->
- s(Row),
- expect(1, Row).
-
-add_row(RowStatus) ->
- s([{RowStatus, ?createAndGo}]),
- expect(1, [{RowStatus, ?createAndGo}]).
-
-del_row(RowStatus) ->
- s([{RowStatus, ?destroy}]),
- expect(1, [{RowStatus, ?destroy}]).
-
-
-
-use_no_rights() ->
- g([[xDescr,0]]),
- ?v1_2_3(expect(11, noSuchName, 1, any),
- expect(12, [{[xDescr,0], noSuchObject}]),
- expect(13, authorizationError, 1, any)),
- g([[xDescr2,0]]),
- ?v1_2_3(expect(21, noSuchName, 1, any),
- expect(22, [{[xDescr2,0], noSuchObject}]),
- expect(23, authorizationError, 1, any)),
- gn([[xDescr]]),
- ?v1_2_3(expect(31, noSuchName, 1, any),
- expect(32, [{[xDescr], endOfMibView}]),
- expect(33, authorizationError, 1, any)),
- s([{[xDescr,0], "tryit"}]),
- ?v1_2_3(expect(41, noSuchName, 1, any),
- expect(42, noAccess, 1, any),
- expect(43, authorizationError, 1, any)).
-
-
-use_rights() ->
- g([[xDescr,0]]),
- expect(1, [{[xDescr,0], any}]),
- g([[xDescr2,0]]),
- expect(2, [{[xDescr2,0], any}]),
- s([{[xDescr,0], "tryit"}]),
- expect(3, noError, 0, any),
- g([[xDescr,0]]),
- expect(4, [{[xDescr,0], "tryit"}]).
-
-mk_ln(X) ->
- [length(X) | X].
-
-%%-----------------------------------------------------------------
-%% o add/delete users and try them
-%% o test all secLevels
-%% o test all combinations of protocols
-%% o try bad ops; check counters
-%%-----------------------------------------------------------------
-snmp_user_based_sm_mib_3(suite) -> [];
-snmp_user_based_sm_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- _AgentDir = ?config(agent_dir, Config),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
-
- %% The newUser used here already has VACM access.
-
- %% Add a new user in the simplest way; just createAndGo
- try_test(v3_sync, [[{usm_add_user1, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new user
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey1 = snmp:passwd2localized_key(sha, "new sha password", "agentEngine"),
- DesKey1 = lists:sublist(ShaKey1, 16),
-
- %% Change the new user's keys - 1
- try_test(v3_sync, [[{usm_key_change1, [ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- MgrDir = ?config(mgr_dir, Config),
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey2 = snmp:passwd2localized_key(sha, "newer password", "agentEngine"),
- DesKey2 = lists:sublist(ShaKey2, 16),
-
- %% Change the new user's keys - 2
- ?line try_test(v3_sync,
- [[{usm_key_change2, [ShaKey1, DesKey1, ShaKey2, DesKey2]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- reset_usm_mgr(MgrDir),
- ?line rewrite_usm_mgr(MgrDir, ShaKey2, DesKey2),
- ?line load_master("Test2"),
- ?line try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Change the new user's keys - 3
- ?line try_test(v3_sync,
- [[{usm_key_change3, [ShaKey2, DesKey2, ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new keys
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Try some read requests
- ?line try_test(v3_sync, [[{usm_read, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Delete the new user
- ?line try_test(v3_sync, [[{usm_del_user, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try some bad requests
- ?line try_test(v3_sync, [[{usm_bad, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("SNMP-USER-BASED-SM-MIB").
-
--define(usmUserSecurityName, [1,3,6,1,6,3,15,1,2,2,1,3]).
-
-usm_add_user1() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
-usm_use_user() ->
- v2_proc().
-
-
-%% Change own public keys
-usm_key_change1(ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_shaxxxxxxxxxx",
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_desxxxxxx",
- DesKey),
- Vbs1 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change own private keys
-usm_key_change2(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change other's public keys
-usm_key_change3(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange}],
- s(Vbs1),
- ?line expect(1, noAccess, 1, any),
- Vbs2 = [{[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs2),
- ?line expect(2, noAccess, 1, any),
-
-
- Vbs3 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs3),
- ?line expect(1, Vbs3).
-
-usm_read() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ?line g([[usmUserSecurityName, NewRowIndex],
- [usmUserCloneFrom, NewRowIndex],
- [usmUserAuthKeyChange, NewRowIndex],
- [usmUserOwnAuthKeyChange, NewRowIndex],
- [usmUserPrivKeyChange, NewRowIndex],
- [usmUserOwnPrivKeyChange, NewRowIndex]]),
- ?line expect(1,
- [{[usmUserSecurityName, NewRowIndex], "newUser"},
- {[usmUserCloneFrom, NewRowIndex], [0,0]},
- {[usmUserAuthKeyChange, NewRowIndex], ""},
- {[usmUserOwnAuthKeyChange, NewRowIndex], ""},
- {[usmUserPrivKeyChange, NewRowIndex], ""},
- {[usmUserOwnPrivKeyChange, NewRowIndex], ""}]),
- ok.
-
-
-
-usm_del_user() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- Vbs1 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
--define(usmUserCloneFrom, [1,3,6,1,6,3,15,1,2,2,1,4]).
-
--define(usmNoAuthProtocol, [1,3,6,1,6,3,10,1,1,1]).
-
--define(usmHMACMD5AuthProtocol, [1,3,6,1,6,3,10,1,1,2]).
-
--define(usmHMACSHAAuthProtocol, [1,3,6,1,6,3,10,1,1,3]).
-
--define(usmNoPrivProtocol, [1,3,6,1,6,3,10,1,2,1]).
-
--define(usmDESPrivProtocol, [1,3,6,1,6,3,10,1,2,2]).
-
-usm_bad() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer1 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDOS"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer1},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, inconsistentName, 1, any),
-
- RowPointer2 = ?usmUserCloneFrom ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs2 = [{[usmUserCloneFrom, NewRowIndex], RowPointer2},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs2),
- ?line expect(2, wrongValue, 1, any),
-
- RowPointer3 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs3 = [{[usmUserCloneFrom, NewRowIndex], RowPointer3},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs3),
- ?line expect(3, Vbs3),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmNoAuthProtocol}]),
- ?line expect(4, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmHMACMD5AuthProtocol}]),
- ?line expect(5, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmDESPrivProtocol}]),
- ?line expect(6, wrongValue, 1, any),
- ?line s([{[usmUserPrivProtocol, NewRowIndex], ?usmHMACSHAAuthProtocol}]),
- ?line expect(7, wrongValue, 1, any),
-
- Vbs4 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs4),
- ?line expect(1, Vbs4),
-
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Loop through entire MIB, to make sure that all instrum. funcs
-%% works.
-%% Load all std mibs that are not loaded by default.
-%%-----------------------------------------------------------------
-loop_mib(suite) -> [];
-loop_mib(Config) when list(Config) ->
- ?LOG("loop_mib -> initiate case",[]),
- %% snmpa:verbosity(master_agent,debug),
- %% snmpa:verbosity(mib_server,info),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib -> load mib SNMP-COMMUNITY-MIB",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> load mib SNMP-MPD-MIB",[]),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> load mib SNMP-TARGET-MIB",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> load mib SNMP-NOTIFICATION-MIB",[]),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> load mib SNMP-FRAMEWORK-MIB",[]),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> load mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?DBG("loop_mib -> try",[]),
- try_test(loop_mib_1),
- ?DBG("loop_mib -> unload mib SNMP-COMMUNITY-MIB",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-MPD-MIB",[]),
- ?line unload_master("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-TARGET-MIB",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-NOTIFICATION-MIB",[]),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-FRAMEWORK-MIB",[]),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- %% snmpa:verbosity(master_agent,log),
- %% snmpa:verbosity(mib_server,silence),
- ?LOG("loop_mib -> done",[]).
-
-
-loop_mib_2(suite) -> [];
-loop_mib_2(Config) when list(Config) ->
- ?LOG("loop_mib_2 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_2 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_2 -> load mibs",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_2 -> unload mibs",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?LOG("loop_mib_2 -> done",[]).
-
-
-loop_mib_3(suite) -> [];
-loop_mib_3(Config) when list(Config) ->
- ?LOG("loop_mib_3 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_3 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_3 -> load mibs",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_3 -> unload mibs",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?LOG("loop_mib_3 -> done",[]).
-
-
-%% Req. As many mibs all possible
-loop_mib_1() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_1([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_1(Oid, N) ->
- ?DBG("loop_it_1 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_1 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_1 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_1(NOid, N+1);
- #pdu{type='get-response', error_status=noSuchName, error_index=1,
- varbinds=[_]} ->
- ?DBG("loop_it_1 -> done",[]),
- N;
-
- #pdu{type = Type, error_status = Err, error_index = Idx,
- varbinds = Vbs} ->
- exit({unexpected_pdu, ?LINE, Type, Err, Idx, Vbs})
- end.
-
-%% Req. As many mibs all possible
-loop_mib_2() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_2([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_2(Oid, N) ->
- ?DBG("loop_it_2 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid, value = endOfMibView}]} ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p",[NOid]),
- N;
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_2 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_2(NOid, N+1)
- end.
-
-
-%%%-----------------------------------------------------------------
-%%% Testing of reported bugs and other tickets.
-%%%-----------------------------------------------------------------
-
-
-
-
-
-%% These are (ticket) test cases where the initiation has to be done
-%% individually.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1128
-%% Slogan: Bug in handling of createAndWait set-requests.
-%%-----------------------------------------------------------------
-otp_1128(suite) -> [];
-otp_1128(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1128),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1128_2(X) -> otp_1128(X).
-
-otp_1128_3(X) -> otp_1128(X).
-
-otp_1128() ->
- io:format("Testing bug reported in ticket OTP-1128...~n"),
-
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
-
- s([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- ?line expect(28, [{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(29, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- ?line expect(30, [{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(31, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(32, [{NewKeyc5, ?destroy}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1129, OTP-1169
-%% Slogan: snmpa:int_to_enum crashes on bad oids
-%%-----------------------------------------------------------------
-otp_1129(suite) -> [];
-otp_1129(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- try_test(otp_1129_i, [node()]),
- ?line unload_master("Klas3").
-
-otp_1129_2(X) -> otp_1129(X).
-
-otp_1129_3(X) -> otp_1129(X).
-
-otp_1129_i(MaNode) ->
- io:format("Testing bug reported in ticket OTP-1129...~n"),
- false = rpc:call(MaNode, snmp, int_to_enum, [iso, 1]),
- false = rpc:call(MaNode, snmp, int_to_enum, [isox, 1]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1131
-%% Slogan: Agent crashes / erlang node halts if RowIndex in a
-%% setrequest is of bad type, e.g. an INDEX {INTEGER},
-%% and RowIdenx [3,2].
-%%-----------------------------------------------------------------
-otp_1131(suite) -> [];
-otp_1131(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas1"),
- try_test(otp_1131),
- ?line unload_master("Klas1").
-
-otp_1131_2(X) -> otp_1131(X).
-
-otp_1131_3(X) -> otp_1131(X).
-
-otp_1131() ->
- io:format("Testing bug reported in ticket OTP-1131...~n"),
- s([{[friendsEntry, [2, 3, 1]], s, "kompis3"},
- {[friendsEntry, [3, 3, 1]], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 2, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1162
-%% Slogan: snmp_agent can't handle wrongValue from instrum.func
-%%-----------------------------------------------------------------
-otp_1162(suite) -> [];
-otp_1162(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
- try_test(otp_1162),
- stop_subagent(SA).
-
-otp_1162_2(X) -> otp_1162(X).
-
-otp_1162_3(X) -> otp_1162(X).
-
-otp_1162() ->
- s([{[sa, [2,0]], 6}]), % wrongValue (i is_set_ok)
- ?line expect(1, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1222
-%% Slogan: snmp agent crash if faulty index is returned from instrum
-%%-----------------------------------------------------------------
-otp_1222(suite) -> [];
-otp_1222(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- ?line load_master("Klas4"),
- try_test(otp_1222),
- ?line unload_master("Klas3"),
- ?line unload_master("Klas4").
-
-otp_1222_2(X) -> otp_1222(X).
-
-otp_1222_3(X) -> otp_1222(X).
-
-otp_1222() ->
- io:format("Testing bug reported in ticket OTP-1222...~n"),
- s([{[fStatus4,1], 4}, {[fName4,1], 1}]),
- ?line expect(1, genErr, 0, any),
- s([{[fStatus4,2], 4}, {[fName4,2], 1}]),
- ?line expect(2, genErr, 0, any).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1298
-%% Slogan: Negative INTEGER values are treated as positive.
-%%-----------------------------------------------------------------
-otp_1298(suite) -> [];
-otp_1298(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1298),
- ?line unload_master("Klas2").
-
-otp_1298_2(X) -> otp_1298(X).
-
-otp_1298_3(X) -> otp_1298(X).
-
-otp_1298() ->
- io:format("Testing bug reported in ticket OTP-1298...~n"),
- s([{[fint,0], -1}]),
- ?line expect(1298, [{[fint,0], -1}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1331
-%% Slogan: snmp_generic should return noError when deleting non-ex row
-%%-----------------------------------------------------------------
-otp_1331(suite) -> [];
-otp_1331(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1331),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1331_2(X) -> otp_1331(X).
-
-otp_1331_3(X) -> otp_1331(X).
-
-otp_1331() ->
- NewKeyc5 = [intCommunityStatus,[127,32,0,0],is("test")],
- s([{NewKeyc5, ?destroy}]),
- ?line expect(1, [{NewKeyc5, ?destroy}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1338
-%% Slogan: snmp bug in initialisation of default values for mnesia tabs
-%%-----------------------------------------------------------------
-otp_1338(suite) -> [];
-otp_1338(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1338),
- ?line unload_master("Klas2").
-
-otp_1338_2(X) -> otp_1338(X).
-
-otp_1338_3(X) -> otp_1338(X).
-
-otp_1338() ->
- s([{[kStatus2, 7], i, ?createAndGo}]),
- ?line expect(1, [{[kStatus2, 7], ?createAndGo}]),
- g([[kName2, 7]]),
- ?line expect(2, [{[kName2, 7], "JJJ"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1342
-%% Slogan: default impl of snmp table can't handle bad index access,
-%% Set when INDEX is read-write gets into an infinite loop!
-%%-----------------------------------------------------------------
-otp_1342(suite) -> [];
-otp_1342(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas4"),
- try_test(otp_1342),
- ?line unload_master("Klas4").
-
-otp_1342_2(X) -> otp_1342(X).
-
-otp_1342_3(X) -> otp_1342(X).
-
-otp_1342() ->
- s([{[fIndex5, 1], i, 1},
- {[fName5, 1], i, 3},
- {[fStatus5, 1], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 3, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1366
-%% Slogan: snmp traps not sent to all managers
-%% Note: NYI! We need a way to tell the test server that we need
-%% mgrs on two different machines.
-%%-----------------------------------------------------------------
-otp_1366(suite) -> [];
-otp_1366(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1366),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1366_2(X) -> otp_1366(X).
-
-otp_1366_3(X) -> otp_1366(X).
-
-otp_1366() ->
- ?INF("NOT YET IMPLEMENTED", []),
- 'NYI'.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2776
-%% Slogan: snmp:validate_date_and_time() fails when time is 00:00
-%%-----------------------------------------------------------------
-otp_2776(suite) -> [];
-otp_2776(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_2776).
-
-otp_2776_2(X) -> otp_2776(X).
-
-otp_2776_3(X) -> otp_2776(X).
-
-otp_2776() ->
- io:format("Testing bug reported in ticket OTP-2776...~n"),
-
- Dt01_valid = [19,98,9,1,1,0,23,0,43,0,0],
- Dt02_valid = [19,98,9,1,0,0,0,0,43,0,0], % This is what is fixed: 00:00
- Dt03_valid = [19,98,2,28,1,0,23,0,43,0,0],
- Dt04_invalid = [19,98,2,29,1,0,23,0,43,0,0],
- Dt05_valid = [19,96,2,29,1,0,23,0,43,0,0],
- Dt06_valid = [20,0,2,29,1,0,23,0,43,0,0],
- Dt07_invalid = [19,96,2,30,1,0,23,0,43,0,0], % This is also fixed: 30/2
- Dt08_valid = [19,98,4,30,1,0,23,0,43,0,0],
- Dt09_invalid = [19,98,4,31,1,0,23,0,43,0,0], % This is also fixed: 31/4
- Dt10_invalid = [],
- Dt11_invalid = [kalle,hobbe],
- L = [{ 1, true, Dt01_valid},
- { 2, true, Dt02_valid},
- { 3, true, Dt03_valid},
- { 4, false, Dt04_invalid},
- { 5, true, Dt05_valid},
- { 6, true, Dt06_valid},
- { 7, false, Dt07_invalid},
- { 8, true, Dt08_valid},
- { 9, false, Dt09_invalid},
- {10, false, Dt10_invalid},
- {11, false, Dt11_invalid}],
-
- ?line ok = validate_dat(L).
-
-
-validate_dat(L) -> validate_dat(L,[]).
-
-validate_dat([],V) ->
- Fun = fun({_,X}) -> case X of
- ok -> false;
- _ -> true
- end
- end,
- validate_dat1( lists:reverse( lists:filter(Fun,V) ) );
-validate_dat([{Id,E,Dat}|T],V) ->
- validate_dat(T,[validate_dat2(Id,E,Dat) | V]).
-
-validate_dat1([]) -> ok;
-validate_dat1(L) -> {error,L}.
-
-validate_dat2(Id, E, Dat) ->
- Res = case {E,snmp:validate_date_and_time(Dat)} of
- {E,E} -> ok;
- {E,A} -> {E,A}
- end,
- {Id, Res}.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2979
-%% Slogan: get-next on more than 1 column in an empty table
-%% returns bad response.
-%%-----------------------------------------------------------------
-otp_2979(suite) -> [];
-otp_2979(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Test1"),
- ?line init_old(),
- try_test(otp_2979),
- ?line unload_master("Test1").
-
-otp_2979_2(X) -> otp_2979(X).
-
-otp_2979_3(X) -> otp_2979(X).
-
-otp_2979() ->
- gn([[sparseDescr], [sparseStatus]]),
- ?line expect(1, [{[sparseStr,0], "slut"},
- {[sparseStr,0], "slut"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3187
-%% Slogan: get-next on vacmAccessTable for colums > 5 returns
-%% endOfTable - should return value.
-%%-----------------------------------------------------------------
-otp_3187(suite) -> [];
-otp_3187(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- otp_3187(),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-otp_3187_2(X) -> otp_3187(X).
-
-otp_3187_3(X) -> otp_3187(X).
-
-otp_3187() ->
- ?line Elements =
- snmp_view_based_acm_mib:vacmAccessTable(get_next,[],[4,5,6]),
- lists:foreach(fun(E) ->
- ?line if E == endOfTable ->
- ?FAIL(endOfTable);
- true -> ok
- end
- end, Elements).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3542
-%% Slogan:
-%%-----------------------------------------------------------------
-otp_3542(suite) -> [];
-otp_3542(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_3542).
-
-otp_3542() ->
- io:format("SNMP v3 discovery...~n"),
- ?line Res = snmp_test_mgr:d(),
- io:format("SNMP v3 discovery result: ~p~n",[Res]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3725
-%% Slogan: Slow response time on snmpa:int_to_enum
-%%-----------------------------------------------------------------
-otp_3725(suite) -> [];
-otp_3725(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_3725_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req. OLD-SNMPEA-MIB
-otp_3725_test(MaNode) ->
- io:format("Testing feature requested in ticket OTP-3725...~n"),
- ?line rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
- ?line Db = rpc:call(MaNode,snmp,get_symbolic_store_db,[]),
- ?DBG("otp_3725_test -> Db = ~p",[Db]),
-
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [Db, intAgentIpAddress]),
- ?DBG("otp_3725_test -> name_to_oid for ~p: ~p",[intAgentIpAddress,OID]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp, oid_to_name,
- [Db,OID]),
- ?DBG("otp_3725_test -> oid_to_name for ~p: ~p",[OID,intAgentIpAddress]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [Db, intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [Db, [1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, 'RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'xxRowStatus', 1]),
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-4394
-%% Slogan: Target mib tag list check invalid
-%%-----------------------------------------------------------------
-
-
-
-init_otp_4394(Config) when list(Config) ->
- ?DBG("init_otp_4394 -> entry with"
- "~n Config: ~p", [Config]),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line otp_4394_config(AgentDir, MgrDir, Ip),
- MasterAgentVerbosity = {master_agent_verbosity, trace},
- NetIfVerbosity = {net_if_verbosity, trace},
- Opts = [MasterAgentVerbosity,NetIfVerbosity],
- [{vsn, v1} | start_v1_agent(Config,Opts)].
-
-otp_4394_config(AgentDir, MgrDir, Ip0) ->
- ?DBG("otp_4394_config -> entry with"
- "~n AgentDir: ~p"
- "~n MgrDir: ~p"
- "~n Ip0: ~p", [AgentDir, MgrDir, Ip0]),
- Vsn = [v1],
- Ip = tuple_to_list(Ip0),
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsn, Ip,
- ?TRAP_UDP, Ip, 4000,
- "OTP-4394 test"),
- ?line case update_usm(Vsn, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsn, MgrDir);
- false ->
- ?line ok
- end,
- C1 = {"a", "all-rights", "initial", "", "pc"},
- C2 = {"c", "secret", "secret_name", "", "secret_tag"},
- ?line write_community_conf(AgentDir, [C1, C2]),
- ?line update_vacm(Vsn, AgentDir),
- Ta1 = {"shelob v1",
- [134,138,177,177], 5000, 1500, 3, %% Använd Ip och modda
- "pc1",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [],
- 2048},
- Ta2 = {"bifur v1",
- [134,138,177,75], 5000, 1500, 3, %% Använd Ip
- "pc2",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [], 2048},
- ?line write_target_addr_conf(AgentDir, [Ta1, Ta2]),
- ?line write_target_params_conf(AgentDir, Vsn),
- ?line write_notify_conf(AgentDir),
- ok.
-
-
-
-finish_otp_4394(Config) when list(Config) ->
- ?DBG("finish_otp_4394 -> entry", []),
- C1 = stop_agent(Config),
- delete_files(C1),
- erase(mgr_node),
- lists:keydelete(vsn, 1, C1).
-
-otp_4394_test(suite) -> [];
-otp_4394_test(Config) ->
- ?DBG("otp_4394_test -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_4394_test1),
- ?DBG("otp_4394_test -> done", []),
- ok.
-
-otp_4394_test1() ->
- ?DBG("otp_4394_test1 -> entry", []),
- gn([[1,1]]),
- Res =
- case snmp_test_mgr:expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]) of
- %% {error, 1, {"?",[]}, {"~w",[timeout]}}
- {error, 1, _, {_, [timeout]}} ->
- ?DBG("otp_4394_test1 -> expected result: timeout", []),
- ok;
- Else ->
- Else
- end,
- ?DBG("otp_4394_test1 -> done with: ~p", [Res]),
- Res.
-
-
-%%%--------------------------------------------------
-%%% Used to test the standard mib with our
-%%% configuration.
-%%%--------------------------------------------------
-run(F, A, Opts) ->
- M = get(mib_dir),
- Dir = get(mgr_dir),
- User = snmp_misc:get_option(user, Opts, "all-rights"),
- SecLevel = snmp_misc:get_option(sec_level, Opts, noAuthNoPriv),
- EngineID = snmp_misc:get_option(engine_id, Opts, "agentEngine"),
- CtxEngineID = snmp_misc:get_option(context_engine_id, Opts, EngineID),
- Community = snmp_misc:get_option(community, Opts, "all-rights"),
- ?DBG("run -> start crypto app",[]),
- Crypto = ?CRYPTO_START(),
- ?DBG("run -> Crypto: ~p",[Crypto]),
- catch snmp_test_mgr:stop(), % If we had a running mgr from a failed case
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- ?DBG("run -> config:~n"
- "\tM: ~p~n"
- "\tDir: ~p~n"
- "\tUser: ~p~n"
- "\tSecLevel: ~p~n"
- "\tEngineID: ~p~n"
- "\tCtxEngineID: ~p~n"
- "\tCommunity: ~p~n"
- "\tStdM: ~p",
- [M,Dir,User,SecLevel,EngineID,CtxEngineID,Community,StdM]),
- case snmp_test_mgr:start([%% {agent, snmp_test_lib:hostname()},
- {packet_server_debug,true},
- {debug,true},
- {agent, get(master_host)},
- {agent_udp, 4000},
- {trap_udp, 5000},
- {recbuf,65535},
- quiet,
- get(vsn),
- {community, Community},
- {user, User},
- {sec_level, SecLevel},
- {engine_id, EngineID},
- {context_engine_id, CtxEngineID},
- {dir, Dir},
- {mibs, mibs(StdM, M)}]) of
- {ok, _Pid} ->
- Res = apply(?MODULE, F, A),
- catch snmp_test_mgr:stop(),
- Res;
- Err ->
- io:format("Error starting manager: ~p\n", [Err]),
- catch snmp_test_mgr:stop(),
- ?line exit({mgr_start, Err})
- end.
-
-
-mibs(StdMibDir,MibDir) ->
- [join(StdMibDir, ?v1_2("STANDARD-MIB.bin", "SNMPv2-MIB.bin")),
- join(MibDir, "OLD-SNMPEA-MIB.bin"),
- join(StdMibDir, "SNMP-FRAMEWORK-MIB"),
- join(StdMibDir, "SNMP-MPD-MIB"),
- join(StdMibDir, "SNMP-VIEW-BASED-ACM-MIB"),
- join(StdMibDir, "SNMP-USER-BASED-SM-MIB"),
- join(StdMibDir, "SNMP-TARGET-MIB"),
- join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
- join(MibDir, "Klas1.bin"),
- join(MibDir, "Klas2.bin"),
- join(MibDir, "Klas3.bin"),
- join(MibDir, "Klas4.bin"),
- join(MibDir, "SA-MIB.bin"),
- join(MibDir, "TestTrap.bin"),
- join(MibDir, "Test1.bin"),
- join(MibDir, "Test2.bin"),
- join(MibDir, "TestTrapv2.bin")].
-
-join(D,F) ->
- filename:join(D,F).
-
-%% string used in index
-is(S) -> [length(S) | S].
-
-try_test(Func) ->
- call(get(mgr_node), ?MODULE, run, [Func, [], []]).
-
-try_test(Func, A) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, []]).
-
-try_test(Func, A, Opts) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, Opts]).
-
-call(N,M,F,A) ->
- ?DBG("call -> entry with~n"
- " N: ~p~n"
- " M: ~p~n"
- " F: ~p~n"
- " A: ~p~n"
- " when~n"
- " get(): ~p",
- [N,M,F,A,get()]),
- spawn(N, ?MODULE, wait, [self(),get(),M,F,A]),
- receive
- {done, {'EXIT', Rn}, Loc} ->
- ?DBG("call -> returned ~p",[{done, {'EXIT', Rn}, Loc}]),
- put(test_server_loc, Loc),
- exit(Rn);
- {done, Ret, Zed} ->
- ?DBG("call -> returned ~p~n",[{done, Ret, Zed}]),
- Ret
- end.
-
-wait(From, Env, M, F, A) ->
- ?DBG("wait -> entry with ~n"
- "\tFrom: ~p~n"
- "\tEnv: ~p",[From,Env]),
- lists:foreach(fun({K,V}) -> put(K,V) end, Env),
- Rn = (catch apply(M, F, A)),
- ?DBG("wait -> Rn: ~n~p", [Rn]),
- From ! {done, Rn, get(test_server_loc)},
- exit(Rn).
-
-expect(A,B) -> ok = snmp_test_mgr:expect(A,B).
-expect(A,B,C) -> ok = snmp_test_mgr:expect(A,B,C).
-expect(A,B,C,D) -> ok = snmp_test_mgr:expect(A,B,C,D).
-expect(A,B,C,D,E,F) -> ok = snmp_test_mgr:expect(A,B,C,D,E,F).
-
-get_req(Id, Vars) ->
- ?DBG("get_req -> entry with~n"
- "\tId: ~p~n"
- "\tVars: ~p",[Id,Vars]),
- g(Vars),
- ?DBG("get_req -> await response",[]),
- {ok, Val} = snmp_test_mgr:get_response(Id, Vars),
- ?DBG("get_req -> response: ~p",[Val]),
- Val.
-
-get_next_req(Vars) ->
- ?DBG("get_next_req -> entry with Vars '~p', send request",[Vars]),
- gn(Vars),
- ?DBG("get_next_req -> await response",[]),
- Response = snmp_test_mgr:receive_response(),
- ?DBG("get_next_req -> response: ~p",[Response]),
- Response.
-
-
-
-start_node(Name) ->
- ?LOG("start_node -> entry with Name: ~p",[Name]),
- M = list_to_atom(?HOSTNAME(node())),
- ?DBG("start_node -> M: ~p",[M]),
- Pa = filename:dirname(code:which(?MODULE)),
- ?DBG("start_node -> Pa: ~p",[Pa]),
-
- Args = case init:get_argument('CC_TEST') of
- {ok, [[]]} ->
- " -pa /clearcase/otp/libraries/snmp/ebin ";
- {ok, [[Path]]} ->
- " -pa " ++ Path;
- error ->
- ""
- end,
- %% Do not use start_link!!! (the proc that calls this one is tmp)
- ?DBG("start_node -> Args: ~p~n",[Args]),
- A = Args ++ " -pa " ++ Pa,
- case (catch ?START_NODE(Name, A)) of
- {ok, Node} ->
- %% Tell the test_server to not clean up things it never started.
- ?DBG("start_node -> Node: ~p",[Node]),
- {ok, Node};
- Else ->
- ?ERR("start_node -> failed with(other): Else: ~p",[Else]),
- ?line ?FAIL(Else)
- end.
-
-
-stop_node(Node) ->
- ?LOG("stop_node -> Node: ~p",[Node]),
- rpc:cast(Node, erlang, halt, []).
-
-p(X) ->
- io:format(user, X++"\n", []).
-
-sleep(X) ->
- receive
- after
- X -> ok
- end.
-
-%%%-----------------------------------------------------------------
-%%% Configuration
-%%%-----------------------------------------------------------------
-config(Vsns, MgrDir, AgentDir, MIp, AIp) ->
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsns, MIp,
- ?TRAP_UDP, AIp, 4000,
- "test"),
- ?line case update_usm(Vsns, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsns, MgrDir);
- false ->
- ?line ok
- end,
- ?line update_community(Vsns, AgentDir),
- ?line update_vacm(Vsns, AgentDir),
- ?line write_target_addr_conf(AgentDir, MIp, ?TRAP_UDP, Vsns),
- ?line write_target_params_conf(AgentDir, Vsns),
- ?line write_notify_conf(AgentDir),
- ok.
-
-delete_files(Config) ->
- Dir = ?config(agent_dir, Config),
- {ok, List} = file:list_dir(Dir),
- lists:foreach(fun(FName) -> file:delete(filename:join(Dir, FName)) end,
- List).
-
-update_usm(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-update_usm_mgr(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-rewrite_usm_mgr(Dir, ShaKey, DesKey) ->
- ?line ok = file:rename(filename:join(Dir,"usm.conf"),
- filename:join(Dir,"usm.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),write),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- file:close(Fid).
-
-reset_usm_mgr(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"usm.old"),
- filename:join(Dir,"usm.conf")).
-
-
-update_community([v3], _Dir) -> ok;
-update_community(_, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{\"no-rights\",\"no-rights\",\"no-rights\",\"\",\"\"}.\n",
- []),
- file:close(Fid).
-
-
--define(tDescr_instance, [1,3,6,1,2,1,16,1,0]).
-update_vacm(_Vsn, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"vacm.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authMD5\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authSHA\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"privDES\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"newUser\",\"initial\"}.\n",[]),
- ok = io:format(Fid, "{vacmViewTreeFamily, \"internet\", "
- "~w, excluded, null}.\n", [?tDescr_instance]),
- file:close(Fid).
-
-
-vacm_ver(v1) -> v1;
-vacm_ver(v2) -> v2c;
-vacm_ver(v3) -> usm.
-
-
-write_community_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),write),
- ok = write_community_conf1(Fid, Confs),
- file:close(Fid).
-
-write_community_conf1(_, []) ->
- ok;
-write_community_conf1(Fid, [{ComIdx, ComName, SecName, CtxName, TransTag}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", \"~s\", \"~s\", \"~s\", \"~s\"}.~n",
- [ComIdx, ComName, SecName, CtxName, TransTag]),
- write_community_conf1(Fid, Confs).
-
-
-write_target_addr_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- ok = write_target_addr_conf1(Fid, Confs),
- file:close(Fid).
-
-
-write_target_addr_conf1(_, []) ->
- ok;
-write_target_addr_conf1(Fid,
- [{Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", ~w, ~w, ~w, ~w, \"~s\", \"~s\", \"~s\", ~w, ~w}.~n",
- [Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz]),
- write_target_addr_conf1(Fid, Confs).
-
-write_target_addr_conf(Dir, ManagerIp, UDP, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- lists:foreach(fun(Vsn) ->
- ok = io:format(Fid,
- "{\"~s\", ~w, ~w, 1500, 3, "
- "\"std_trap\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP, mk_param(Vsn)]),
- case Vsn of
- v1 -> ok;
- v2 ->
- ok = io:format(Fid,
- "{\"~s.2\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)]);
- v3 ->
- ok = io:format(Fid,
- "{\"~s.3\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\", "
- "\"mgrEngine\", [], 1024}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)])
- end
- end,
- Vsns),
- file:close(Fid).
-
-mk_param(v1) -> "target_v1";
-mk_param(v2) -> "target_v2";
-mk_param(v3) -> "target_v3".
-
-mk_ip([A,B,C,D], Vsn) ->
- io_lib:format("~w.~w.~w.~w ~w", [A,B,C,D,Vsn]).
-
-
-rewrite_target_addr_conf(Dir,NewPort) ->
- TAFile = filename:join(Dir, "target_addr.conf"),
- ?DBG("rewrite_target_addr_conf -> read target file info of address config file",[]),
- case file:read_file_info(TAFile) of
- {ok, _} -> ok;
- {error, R} -> ?ERR("failure reading file info of "
- "target address config file: ~p",[R]),
- ok
- end,
-
- ?line [TrapAddr|Addrs] =
- snmp_conf:read(TAFile,fun(R) -> rewrite_target_addr_conf1(R) end),
-
- ?DBG("rewrite_target_addr_conf -> TrapAddr: ~p",[TrapAddr]),
-
- NewAddrs = [rewrite_target_addr_conf2(NewPort,TrapAddr)|Addrs],
-
- ?DBG("rewrite_target_addr_conf -> NewAddrs: ~p",[NewAddrs]),
-
- ?line ok = file:rename(filename:join(Dir,"target_addr.conf"),
- filename:join(Dir,"target_addr.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
-
- ?line ok = rewrite_target_addr_conf3(Fid,NewAddrs),
-
- file:close(Fid).
-
-rewrite_target_addr_conf1(O) ->
- {ok,O}.
-
-rewrite_target_addr_conf2(NewPort,{Name,Ip,_Port,Timeout,Retry,
- "std_trap",EngineId}) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with std_trap",[]),
- {Name,Ip,NewPort,Timeout,Retry,"std_trap",EngineId};
-rewrite_target_addr_conf2(_NewPort,O) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with "
- "~n O: ~p",[O]),
- O.
-
-
-rewrite_target_addr_conf3(_,[]) -> ok;
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,
- ParamName,EngineId}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(1) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % ParamsName
- "\"~s\"}.", % EngineId
- [Name,Ip,Port,Timeout,Retry,ParamName,EngineId]),
- rewrite_target_addr_conf3(Fid,T);
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,TagList,
- ParamName,EngineId,TMask,MMS}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(2) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % TagList
- "\"~s\", " % ParamsName
- "\"~s\"," % EngineId
- "~p, " % TMask
- "~p}.", % MMS
- [Name,Ip,Port,Timeout,Retry,TagList,ParamName,
- EngineId,TMask,MMS]),
- rewrite_target_addr_conf3(Fid,T).
-
-reset_target_addr_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_addr.old"),
- filename:join(Dir,"target_addr.conf")).
-
-write_target_params_conf(Dir, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- lists:foreach(fun(Vsn) ->
- MP = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> v3
- end,
- SM = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> usm
- end,
- ok = io:format(Fid, "{\"target_~w\", ~w, ~w, "
- "\"all-rights\", noAuthNoPriv}.~n",
- [Vsn, MP, SM])
- end,
- Vsns),
- file:close(Fid).
-
-rewrite_target_params_conf(Dir, SecName, SecLevel) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.conf"),
- filename:join(Dir,"target_params.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- ?line ok = io:format(Fid, "{\"target_v3\", v3, usm, \"~s\", ~w}.~n",
- [SecName, SecLevel]),
- file:close(Fid).
-
-reset_target_params_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.old"),
- filename:join(Dir,"target_params.conf")).
-
-write_notify_conf(Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"notify.conf"),write),
- ok = io:format(Fid, "{\"standard trap\", \"std_trap\", trap}.~n", []),
- ok = io:format(Fid, "{\"standard inform\", \"std_inform\",inform}.~n", []),
- file:close(Fid).
-
-ver_to_trap_str([v1]) -> "v1";
-ver_to_trap_str([v2]) -> "v2";
-% default is to use the latest snmp version
-ver_to_trap_str([v1,v2]) -> "v2".
-
-
-
-write_view_conf(Dir) ->
- {ok, Fid} = file:open(a(Dir,"view.conf"),write),
- ok = io:format(Fid, "{2, [1,3,6], included, null}.~n", []),
- ok = io:format(Fid, "{2, ~w, excluded, null}.~n", [?tDescr_instance]),
- file:close(Fid).
-
-a(A,B) -> lists:append(A,B).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-copy_file(From, To) ->
- {ok, Bin} = file:read_file(From),
- ok = file:write_file(To, Bin).
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-display_memory_usage() ->
- Info = snmpa:info(snmp_master_agent),
- TreeSize = lists_key1search(tree_size_bytes, Info),
- ProcMem = lists_key1search(process_memory, Info),
- MibDbSize = lists_key1search([db_memory,mib], Info),
- NodeDbSize = lists_key1search([db_memory,node], Info),
- TreeDbSize = lists_key1search([db_memory,tree], Info),
- ?INF("Memory usage: "
- "~n Tree size: ~p"
- "~n Process memory size: ~p"
- "~n Mib db size: ~p"
- "~n Node db size: ~p"
- "~n Tree db size: ~p",
- [TreeSize, ProcMem, MibDbSize, NodeDbSize, TreeDbSize]).
-
-lists_key1search([], Res) ->
- Res;
-lists_key1search([Key|Keys], List) when atom(Key), list(List) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- lists_key1search(Keys, Val);
- false ->
- undefined
- end;
-lists_key1search(Key, List) when atom(Key) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- Val;
- false ->
- undefined
- end.
-
-
-regs() ->
- lists:sort(registered()).
diff --git a/lib/snmp/test/exp/snmp_agent_v1_test.erl b/lib/snmp/test/exp/snmp_agent_v1_test.erl
deleted file mode 100644
index f3b49f3bfd..0000000000
--- a/lib/snmp/test/exp/snmp_agent_v1_test.erl
+++ /dev/null
@@ -1,2674 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(snmp_agent_v1_test).
-
-%% TODO
-%% * Test fault-tolerance (kill master etc)
-%%
-
--export([]).
-
--define(application, snmp).
-
--include_lib("kernel/include/file.hrl").
--include_lib("common_test/include/ct.hrl").
--include("snmp_test_lib.hrl").
--define(SNMP_USE_V3, true).
--include_lib("snmp/include/snmp_types.hrl").
-
-
--define(klas1, [1,3,6,1,2,1,7]).
--define(klas2, [1,3,6,1,2,1,9]).
--define(klas3, [1,3,6,1,2,1,8,1]).
--define(klas4, [1,3,6,1,2,1,8,4]).
--define(sa, [1,3,6,1,4,1,193,2]).
--define(system, [1,3,6,1,2,1,1]).
--define(snmp, [1,3,6,1,2,1,11]).
--define(snmpTraps, [1,3,6,1,6,3,1,1,5]).
--define(ericsson, [1,3,6,1,4,1,193]).
--define(testTrap, [1,3,6,1,2,1,15,0]).
--define(xDescr, [1,3,6,1,2,1,17,1]).
--define(xDescr2, [1,3,6,1,2,1,17,2]).
-
--define(active, 1).
--define(notInService, 2).
--define(notReady, 3).
--define(createAndGo, 4).
--define(createAndWait, 5).
--define(destroy, 6).
-
--define(TRAP_UDP, 5000).
-
--define(tooBigStr, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").
-
-
-%% -- test manager defines --
--define(MGR, snmp_test_mgr).
--define(GN(X), ?MGR:gn(X)).
--define(G(X), ?MGR:g(X)).
--define(S(X), ?MGR:s(X)).
--define(GB(X), ?MGR:gb(X)).
--define(SEND_BYTES(X), ?MGR:send_bytes(X)).
-
-%% -- agent test lib defines --
--define(LIB, snmp_agent_test_lib).
--define(INIT_CASE(X), ?LIB:init_case(X)).
--define(TRY_TEST1(A), ?LIB:try_test(A)).
--define(TRY_TEST2(A, B), ?LIB:try_test(A, B)).
--define(TRY_TEST3(A, B, C), ?LIB:try_test(A, B, C)).
--define(START_SA(A, B, C), ?LIB:start_subagent(A, B, C)).
--define(STOP_SA(A), ?LIB:stop_subagent(A)).
--define(P1(C), ?LIB:p(C)).
--define(P2(F), ?LIB:p(F,[])).
--define(P3(F,A), ?LIB:p(F,A)).
--define(RPC(N, F, A), ?LIB:rpc(N, F, A)).
-
-
--define(v1_2(V1,V2),
- case get(vsn) of
- v1 -> V1;
- _ -> V2
- end).
-
--define(v1_2_3(V1,V2,V3),
- case get(vsn) of
- v1 -> V1;
- v2 -> V2;
- _ -> V3
- end).
-
-all(suite) -> {req,
- [mnesia, distribution,
- {local_slave_nodes, 2}, {time, 360}],
- [{conf, init, cases(), finish}]}.
-
-init_per_testcase(_Case, Config) when list(Config) ->
- Dog = test_server:timetrap(test_server:minutes(6)),
- [{watchdog, Dog}|Config].
-
-end_per_testcase(_Case, Config) when list(Config) ->
- Dog = ?config(watchdog, Config),
- test_server:timetrap_cancel(Dog),
- Config.
-
-cases() ->
- [simple,
- db_notify_client,
- processing,
- big,
- big2,
- %% implied,
- loop_mib,
- api,
- subagent,
- mnesia,
- multiple_reqs,
- sa_register,
- v1_trap,
- sa_error,
- next_across_sa,
- undo,
- standard_mibs,
- sparse_table,
- cnt_64,
- opaque,
- %% opaque].
-
- change_target_addr_config,
-
- reported_bugs,
- tickets
- ].
-
-
-init(Config) ->
- init_all(Config),
- init_v1(Config).
-
-finish(Config) ->
- finish_v1(Config),
- finish_all(Config).
-
-init_v1(Config) when list(Config) ->
- ?line SaNode = ?config(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v1} | start_v1_agent(Config)].
-
-finish_v1(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%%-----------------------------------------------------------------
-%% This function takes care of the old OTP-SNMPEA-MIB.
-%% Unfortunately, the testcases were written to use the data in the
-%% internal tables, and these table are now obsolete and not used
-%% by the agent. Therefore, we emulate them by using
-%% OLD-SNMPEA-MIB, which uses the default impl. of all tables.
-%%
-%% These two rows must exist in intCommunityTable
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
-%% (But with the manager's IP address)
-%%
-%%-----------------------------------------------------------------
-init_old() ->
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [6 | "public"],
- {get(mip), "public", 2, 2}),
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [13 | "standard trap"],
- {get(mip), "standard trap", 2, 1}),
- snmpa_local_db:variable_set(intAgentIpAddress, [127,0,0,1]).
-
-
-%% =========================================================================
-%%
-%% C A S E S
-%%
-%% =========================================================================
-
-%% -- simple --
-
-simple(suite) -> [];
-simple(Config) when list(Config) ->
- ?P1(simple),
- ?INIT_CASE(Config),
-
- ?TRY_TEST1(simple_standard_test).
-
-simple_standard_test() ->
- ?DBG("simple_standard_test -> entry",[]),
- ?GN([[1,1]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?GN([[1,3]]),
- ?line expect(11, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?GN([[1,3,6]]),
- ?line expect(12, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?GN([[1,3,6,1]]),
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?GN([[1,3,6,1,2]]),
- ?line expect(14, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?GN([[1,3,6,1,2,1]]),
- ?line expect(15, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?GN([[1,3,6,1,2,1,1]]),
- ?line expect(16, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?GN([[sysDescr]]),
- ?line expect(17, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?G([[sysDescr,0]]),
- ?line expect(2, [{[sysDescr,0], "Erlang SNMP agent"}]),
-
- ?G([[sysDescr]]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{[sysDescr], noSuchObject}])),
-
- ?G([[1,6,7,0]]),
- ?line ?v1_2(expect(41, noSuchName, 1, any),
- expect(3, [{[1,6,7,0], noSuchObject}])),
-
- ?GN([[1,13]]),
- ?line ?v1_2(expect(4, noSuchName,1, any),
- expect(4, [{[1,13], endOfMibView}])),
-
- ?S([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
-
- ?G([[sysLocation, 0]]),
- ?line expect(6, [{[sysLocation, 0], "new_value"}]),
-
- io:format("Testing noSuchName and badValue...~n"),
- ?S([{[sysServices,0], 3}]),
- ?line expect(61, ?v1_2(noSuchName, notWritable), 1, any),
-
- ?S([{[sysLocation, 0], i, 3}]),
- ?line expect(62, ?v1_2(badValue, wrongType), 1, any),
- ?DBG("simple_standard_test -> done",[]),
- ok.
-
-
-%% -- db_notify_client --
-
-%% This is run in the agent node
-db_notify_client(suite) -> [];
-db_notify_client(Config) when list(Config) ->
- ?P1(db_notify_client),
- {SaNode, MgrNode, MibDir} = ?INIT_CASE(Config),
- ?DBG("~n\tSaNode: ~p~n\tMgrNode: ~p~n\tMibDir: ~p",
- [SaNode,MgrNode,MibDir]),
- snmpa_local_db:register_notify_client(self(),?MODULE),
-
- %% This call (the manager) will issue to set operations, so
- %% we expect to receive to notify(insert) calls.
- ?TRY_TEST1(db_notify_client_test),
-
- ?DBG("await first notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("first notify received",[]),ok
- end,
-
- ?DBG("await second notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("second notify received",[]),ok
- end,
-
- snmpa_local_db:unregister_notify_client(self()).
-
-
-%% This is run in the manager node
-db_notify_client_test() ->
- ?DBG("set first new sysLocation",[]),
- ?S([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
-
- ?DBG("set second new sysLocation",[]),
- ?S([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]).
-
-notify(Pid,What) ->
- ?DBG("notify(~p,~p) -> called",[Pid,What]),
- Pid ! {db_notify_test_reply,What}.
-
-
-%% -- processing --
-
-%% Req. Test2
-processing(suite) -> [];
-processing(Config) when list(Config) ->
- ?P1(processing),
- ?INIT_CASE(Config),
-
- ?line load_master("Test2"),
- ?TRY_TEST1(v1_proc),
- ?line unload_master("Test2").
-
-v1_proc() ->
- ?DBG("v1_proc -> entry", []),
- %% According to RFC1157.
- %% Template: <Section>:<list no>
- v1_get_p(),
- v1_get_next_p(),
- v1_set_p().
-
-v1_get_p() ->
- %% 4.1.2:1
- ?G([[test2]]),
- ?line expect(10, noSuchName, 1, [{[test2], 'NULL'}]),
- ?G([[tDescr]]),
- ?line expect(11, noSuchName, 1, [{[tDescr], 'NULL'}]),
- ?G([[tDescr2,0]]),
- ?line expect(12, noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
- ?G([[tDescr3,0]]),
- ?line expect(131, noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
- ?G([[tDescr4,0]]),
- ?line expect(132, noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
- ?G([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(14, noSuchName, 2, [{[sysDescr, 0], 'NULL'},
- {[tDescr,0], 'NULL'}]),
- ?G([[sysDescr,3]]),
- ?line expect(15, noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
-
- %% 4.1.2:2
- ?G([[tTable]]),
- ?line expect(20, noSuchName, 1, [{[tTable], 'NULL'}]),
- ?G([[tEntry]]),
- ?line expect(21, noSuchName, 1, [{[tEntry], 'NULL'}]),
-
- %% 4.1.2:3
- ?G([[tTooBig, 0]]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.2:4
- ?G([[tGenErr1, 0]]),
- ?line expect(40, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- ?G([[tGenErr2, 0]]),
- ?line expect(41, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- ?G([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(42, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]).
-
-v1_get_next_p() ->
- %% 4.1.3:1
- ?GN([[1,3,7,1]]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
-
- ?GN([[tDescr2]]),
- ?line expect(11, tooBig, 0, any),
-
- %% 4.1.3:2
- ?GN([[tTooBig]]),
- io:format("We currently don't handle tooBig correct!!!\n"),
- %% ?line expect(20, tooBig, 0, [{[tTooBig], 'NULL'}]),
- ?line expect(20, tooBig, 0, any),
-
- %% 4.1.3:3
- ?GN([[tGenErr1]]),
- %% ?line expect(40, genErr, 1, [{[tGenErr1], 'NULL'}]),
- ?line expect(40, genErr, 1, any),
-
- ?GN([[tGenErr2]]),
- %% ?line expect(41, genErr, 1, [{[tGenErr2], 'NULL'}]),
- ?line expect(41, genErr, 1, any),
-
- ?GN([[sysDescr], [tGenErr3]]),
- %% ?line expect(42, genErr, 2, [{[sysDescr], 'NULL'},
- %% {[tGenErr3], 'NULL'}]).
- ?line expect(42, genErr, 2, any).
-
-v1_set_p() ->
- %% 4.1.5:1
- ?S([{[1,3,7,0], i, 4}]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,0], 4}]),
-
- ?S([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
-
- ?S([{[tDescr3,0], s, "read-only"}]),
- ?line expect(12, noSuchName, 1, [{[tDescr3,0], "read-only"}]),
-
- ?S([{[tDescr3], s, "noSuchObject"}]),
- ?line expect(13, noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
-
- ?S([{[tDescr3,1], s, "noSuchInstance"}]),
- ?line expect(14, noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
-
- ?S([{[tDescr2,0], s, "inconsistentName"}]),
- ?line expect(15, noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
-
- %% 4.1.5:2
- ?S([{[tDescr2, 0], i, 4}]),
- ?line expect(20, badValue, 1, [{[tDescr2, 0], 4}]),
-
- ?S([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(21, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.1.5:3
- %% The standard is quite incorrect here. The resp pdu was too big. In
- %% the resp pdu, we have the original vbs. In the tooBig pdu we still
- %% have to original vbs => the tooBig pdu is too big as well!!! It
- %% may not get it to the manager, unless the agent uses 'NULL' instead
- %% of the std-like original value.
- ?S([{[tTooBig, 0], s, ?tooBigStr}]),
- %% according to std:
- %% ?line expect(30, tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.5:4
- ?S([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(40, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
-
- ?S([{[tDescr2, 0], s, "commit_fail"}]),
- ?line expect(41, genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
-
-
-%% -- big --
-
-big(suite) -> [];
-big(Config) when list(Config) ->
- ?P1(big),
- {SaNode, _MgrNode, _MibDir} = ?INIT_CASE(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = ?START_SA(SaNode, ?klas1, "Klas1"),
- ?DBG("big -> SA: ~p", [SA]),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- ?TRY_TEST1(big_test),
-
- ?line ?STOP_SA(SA),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req: system group, OLD-SNMPEA-MIB, Klas1
-big_test() ->
- ?DBG("big_test -> testing simple next/get/set @ master agent...",[]),
- simple_standard_test(),
-
- ?DBG("big_test -> testing simple next/get/set @ subagent...",[]),
- ?GN([[klas1]]),
- ?line expect(1, [{[fname,0], ""}]),
-
- ?G([[fname,0]]),
- ?line expect(2, [{[fname,0], ""}]),
-
- ?S([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
-
- ?G([[fname,0]]),
- ?line expect(4, [{[fname,0], "test set"}]),
-
- ?DBG("big_test -> "
- "testing next from last instance in master to subagent...",[]),
- ?GN([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname,0], "test set"}]),
-
- ?GN([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname,0], "test set"}]),
- ?S([{[fname,0], s, ""}]),
- ?line expect(52, [{[fname,0], ""}]),
-
- table_test(),
-
- ?DBG("big_test -> adding one row in subagent table",[]),
- _FTab = [friendsEntry],
- ?S([{[friendsEntry, [2, 3]], s, "kompis3"},
- {[friendsEntry, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
-
- ?G([[friendsEntry, [2, 3]],
- [friendsEntry, [3, 3]]]),
- ?line expect(7, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?active}]),
-
- ?S([{[friendsEntry, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry, [3, 3]], ?destroy}]),
-
- otp_1131(),
-
- ?DBG("big_test -> adding two rows in subagent table with special INDEX",
- []),
- ?S([{[kompissEntry, [1, 3]], s, "kompis3"},
- {[kompissEntry, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?createAndGo}]),
-
- ?G([[kompissEntry, [1, 3]],
- [kompissEntry, [2, 3]]]),
- ?line expect(10, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
-
- ?GN([[kompissEntry, [1]],
- [kompissEntry, [2]]]),
- ?line expect(11, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
-
- ?S([{[kompissEntry, [1, 2]], s, "kompis3"},
- {[kompissEntry, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?createAndGo}]),
-
- ?GN([[kompissEntry, [1, 1]],
- [kompissEntry, [2, 1]]]),
- ?line expect(13, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?active}]),
-
- ?S([{[kompissEntry, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry, [2, 3]], ?destroy}]),
-
- ?S([{[kompissEntry, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry, [2, 2]], ?destroy}]),
- ?DBG("big_test -> done",[]),
- ok.
-
-
-%% Req. system group, Klas2, OLD-SNMPEA-MIB
-big_test_2() ->
- ?P1(big_test_2),
-
- ?P2("Testing simple next/get/set @ master agent (2)..."),
- simple_standard_test(),
-
- p("Testing simple next/get/set @ subagent (2)..."),
- ?GN([[klas2]]),
- ?line expect(1, [{[fname2,0], ""}]),
-
- ?G([[fname2,0]]),
- ?line expect(2, [{[fname2,0], ""}]),
-
- ?S([{[fname2,0], s, "test set"}]),
- ?line expect(3, [{[fname2,0], "test set"}]),
-
- ?G([[fname2,0]]),
- ?line expect(4, [{[fname2,0], "test set"}]),
-
- otp_1298(),
-
- ?P2("Testing next from last object in master to subagent (2)..."),
- ?GN([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname2,0], "test set"}]),
-
- ?GN([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname2,0], "test set"}]),
-
- table_test(),
-
- ?P2("Adding one row in subagent table (2)"),
- ?S([{[friendsEntry2, [2, 3]], s, "kompis3"},
- {[friendsEntry2, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?createAndGo}]),
-
- ?G([[friendsEntry2, [2, 3]],
- [friendsEntry2, [3, 3]]]),
- ?line expect(7, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?active}]),
-
- ?S([{[friendsEntry2, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry2, [3, 3]], ?destroy}]),
-
- ?P2("Adding two rows in subagent table with special INDEX (2)"),
- ?S([{[kompissEntry2, [1, 3]], s, "kompis3"},
- {[kompissEntry2, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?createAndGo}]),
- ?G([[kompissEntry2, [1, 3]],
- [kompissEntry2, [2, 3]]]),
- ?line expect(10, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- ?GN([[kompissEntry2, [1]],
- [kompissEntry2, [2]]]),
- ?line expect(11, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
-
- ?S([{[kompissEntry2, [1, 2]], s, "kompis3"},
- {[kompissEntry2, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?createAndGo}]),
-
- ?GN([[kompissEntry2, [1, 1]],
- [kompissEntry2, [2, 1]]]),
- ?line expect(13, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?active}]),
-
- ?S([{[kompissEntry2, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry2, [2, 3]], ?destroy}]),
-
- ?S([{[kompissEntry2, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry2, [2, 2]], ?destroy}]),
- ok.
-
-
-%% -- bug2 --
-
-big2(suite) -> [];
-big2(Config) when list(Config) ->
- ?P1(big2),
- %% This is exactly the same tests as 'big', but with the
- %% v2 equivalent of the mibs.
- {SaNode, _MgrNode, _MibDir} = ?INIT_CASE(Config),
-
- ?P2("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = ?START_SA(SaNode, ?klas1, "Klas1-v2"),
- ?line load_master("OLD-SNMPEA-MIB-v2"),
- ?line init_old(),
-
- ?TRY_TEST1(big_test),
-
- ?line ?STOP_SUBAGENT(SA),
- ?line unload_master("OLD-SNMPEA-MIB-v2").
-
-
-implied(suite) -> [];
-implied(Config) when list(Config) ->
- ?P1(implied),
- ?INIT_CASE(Config),
-
- ?line load_master("Test1"),
-
- ?TRY_TEST2(implied_test,[whereis(snmp_master_agent)]),
-
- ?line unload_master("Test1").
-
-%% Req. Test1
-implied_test(MA) ->
- ?LOG("implied_test -> start",[]),
-
- snmpa:verbosity(MA,trace),
- snmpa:verbosity(MA,trace),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = "apa",
- Idx2 = "qq",
-
- ?DBG("implied_test -> (send) create row 1 '~s' in table 1",[Idx1]),
- ?S([{[testStatus, Idx1], i, ?createAndGo}, {[testDescr, Idx1],s,"row 1"}]),
- ?line expect(1, [{[testStatus, Idx1], ?createAndGo},
- {[testDescr, Idx1], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 1",[Idx2]),
-
- ?S([{[testStatus, Idx2], i, ?createAndGo}, {[testDescr, Idx2],s,"row 2"}]),
- ?line expect(2, [{[testStatus, Idx2], ?createAndGo},
- {[testDescr, Idx2], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr)",[]),
-
- ?GN([[testDescr]]),
- ?line expect(3, [{[testDescr,Idx1], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr) of row 1",[]),
-
- ?GN([[testDescr,Idx1]]),
- ?line expect(4, [{[testDescr,Idx2], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 1",[Idx1]),
- ?S([{[testStatus, Idx1], i, ?destroy}]),
- ?line expect(5, [{[testStatus, Idx1], ?destroy}]),
-
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 1",[Idx2]),
- ?S([{[testStatus, Idx2], i, ?destroy}]),
- ?line expect(6, [{[testStatus, Idx2], ?destroy}]),
-
- %% Try the same in other table
- Idx3 = [1, "apa"],
- Idx4 = [1, "qq"],
- ?DBG("implied_test -> (send) create row 1 '~s' in table 2",[Idx3]),
- ?S([{[testStatus2, Idx3], i, ?createAndGo}, {[testDescr2,Idx3],s,"row 1"}]),
- ?line expect(1, [{[testStatus2, Idx3], ?createAndGo},
- {[testDescr2, Idx3], "row 1"}]),
-
- ?DBG("implied_test -> (send) create row 2 '~s' in table 2",[Idx4]),
- ?S([{[testStatus2, Idx4], i, ?createAndGo},
- {[testDescr2,Idx4],s,"row 2"}]),
- ?line expect(2, [{[testStatus2, Idx4], ?createAndGo},
- {[testDescr2, Idx4], "row 2"}]),
-
- ?DBG("implied_test -> get-next(testDescr2)",[]),
- ?GN([[testDescr2]]),
- ?line expect(3, [{[testDescr2,Idx3], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr2) of row 1",[]),
-
- ?GN([[testDescr2,Idx3]]),
- ?line expect(4, [{[testDescr2,Idx4], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 2",[Idx3]),
- ?S([{[testStatus2, Idx3], i, ?destroy}]),
- ?line expect(5, [{[testStatus2, Idx3], ?destroy}]),
-
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 2",[Idx4]),
- ?S([{[testStatus2, Idx4], i, ?destroy}]),
- ?line expect(6, [{[testStatus2, Idx4], ?destroy}]),
-
- snmpa:verbosity(MA,log),
-
- ?LOG("implied_test -> done",[]).
-
-
-%% -- loop_mib --
-
-%%-----------------------------------------------------------------
-%% Loop through entire MIB, to make sure that all instrum. funcs
-%% works.
-%% Load all std mibs that are not loaded by default.
-%%-----------------------------------------------------------------
-loop_mib(suite) -> [];
-loop_mib(Config) when list(Config) ->
- ?P1(loop_mib),
- %% snmpa:verbosity(master_agent,debug),
- %% snmpa:verbosity(mib_server,info),
- {SaNode, MgrNode, MibDir} = ?INIT_CASE(Config),
- ?DBG("loop_mib -> "
- "~n SaNode: ~p"
- "~n MgrNode: ~p"
- "~n MibDir: ~p", [SaNode, MgrNode, MibDir]),
-
- ?DBG("loop_mib -> load mib SNMP-COMMUNITY-MIB",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> load mib SNMP-MPD-MIB",[]),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> load mib SNMP-TARGET-MIB",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> load mib SNMP-NOTIFICATION-MIB",[]),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> load mib SNMP-FRAMEWORK-MIB",[]),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> load mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?DBG("loop_mib -> try",[]),
-
- ?TRY_TEST1(loop_mib),
-
- ?DBG("loop_mib -> unload mib SNMP-COMMUNITY-MIB",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-MPD-MIB",[]),
- ?line unload_master("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-TARGET-MIB",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-NOTIFICATION-MIB",[]),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-FRAMEWORK-MIB",[]),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- %% snmpa:verbosity(master_agent,log),
- %% snmpa:verbosity(mib_server,silence),
- ?LOG("loop_mib -> done",[]).
-
-%% Req. As many mibs all possible
-loop_mib() ->
- ?DBG("loop_mib -> entry",[]),
- N = loop_it([1,1], 0),
- ?P3("found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-loop_it(Oid, N) ->
- ?DBG("loop_it -> entry with"
- "~n Oid: ~p"
- "~n N: ~p", [Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it -> "
- "~n NOid: ~p"
- "~n Value: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_1 -> "
- "~n Value2: ~p",[Value2]),
- loop_it(NOid, N+1);
-
- #pdu{type='get-response', error_status=noSuchName, error_index=1,
- varbinds=[_]} ->
- ?DBG("loop_it -> done",[]),
- N;
-
- #pdu{type = Type, error_status = Err, error_index = Idx,
- varbinds = Vbs} ->
- exit({unexpected_pdu, ?LINE, Type, Err, Idx, Vbs})
-
- end.
-
-
-%% -- api --
-
-api(suite) -> [];
-api(Config) when list(Config) ->
- ?P1(api),
- ?INIY_CASE(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- ?TRY_TEST2(api_test, [node()]),
-
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req. OLD-SNMPEA-MIB
-api_test(MaNode) ->
- ?line {value, OID} = ?RPC(MaNode, name_to_oid, [intAgentIpAddress]),
- ?line {value, intAgentIpAddress} = ?RPC(MaNode, oid_to_name, [OID]),
- ?line false = ?RPC(MaNode, name_to_oid, [intAgentIpAddres]),
- ?line false = ?RPC(MaNode, oid_to_name, [[1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = ?RPC(MaNode, enum_to_int, [intViewType, excluded]),
- ?line {value, excluded} = ?RPC(MaNode, int_to_enum, [intViewType, 2]),
- ?line false = ?RPC(MaNode, enum_to_int, [intViewType, exclude]),
- ?line false = ?RPC(MaNode, enum_to_int, [intAgentIpAddress, exclude]),
- ?line false = ?RPC(MaNode, enum_to_int, [intAgentIpAddre, exclude]),
- ?line false = ?RPC(MaNode, int_to_enum, [intViewType, 3]),
- ?line false = ?RPC(MaNode, int_to_enum, [intAgentIpAddress, 2]),
- ?line false = ?RPC(MaNode, int_to_enum, [intAgentIpAddre, 2]),
- ?line {value, active} = ?RPC(MaNode, int_to_enum, ['RowStatus', ?active]),
- ?line {value, ?destroy} =
- ?RPC(MaNode, enum_to_int, ['RowStatus', destroy]),
- ?line false = ?RPC(MaNode, enum_to_int, ['RowStatus', xxxdestroy]),
- ?line false = ?RPC(MaNode, enum_to_int, ['xxRowStatus', destroy]),
- ?line false = ?RPC(MaNode, int_to_enum, ['RowStatus', 25]),
- ?line false = ?RPC(MaNode, int_to_enum, ['xxRowStatus', 1]),
- ?line case snmp:date_and_time() of
- List when list(List), length(List) == 8 -> ok;
- List when list(List), length(List) == 11 -> ok
- end.
-
-
-%% -- subagent --
-
-subagent(suite) -> [];
-subagent(Config) when list(Config) ->
- ?P1(subagent),
- {SaNode, _MgrNode, MibDir} = ?INIT_CASE(Config),
-
- ?line {ok, SA} = ?START_SA(SaNode, ?klas1, "Klas1"),
-
- ?TRY_TEST1(load_test_sa),
-
- ?P2("Testing unregister subagent [~w]...", [SA]),
- MA = whereis(snmp_master_agent),
- ?RPC(SaNode, unregister_subagent, [MA, SA]),
- ?TRY_TEST1(unreg_test),
-
- ?P2("Loading previous subagent mib in master and testing..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas1"]),
- ?TRY_TEST1(load_test),
-
- ?P2("Unloading previous subagent mib in master and testing..."),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas1"]),
-
- ?TRY_TEST1(unreg_test),
-
- ?P2("Testing register subagent..."),
- ?RPC(SaNode, register_subagent, [MA, ?klas1, SA]),
- ?TRY_TEST1(load_test_sa),
-
- ?line ?STOP_SA(SA),
- ?TRY_TEST1(unreg_test).
-
-%% Req. Klas1
-load_test_sa() ->
- ?GN([[?v1_2(sysServices,sysORLastChange), 0]]),
- ?line expect(1, [{[fname,0], any}]).
-
-unreg_test() ->
- ?GN([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[snmpInPkts, 0], any}]).
-
-load_test() ->
- ?GN([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[fname,0], ""}]).
-
-
-%% -- mnesia --
-
-mnesia(suite) -> [];
-mnesia(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent with mnesia impl..."),
- {ok, SA} = start_subagent(SaNode, ?klas2, "Klas2"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- ?TRY_TEST1(big_test_2),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- ?TRY_TEST1(unreg_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA).
-
-
-%% -- multiple_reqs --
-
-multiple_reqs(suite) ->
- {req, [], {conf, init_mul, mul_cases(), finish_mul}}.
-
-mul_cases() ->
- [mul_get, mul_get_err, mul_next, mul_next_err, mul_set_err].
-
-init_mul(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- [{mul_sub, SA} | Config].
-
-finish_mul(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- SA = ?config(mul_sub, Config),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA),
- lists:keydelete(mul_sub, 1, Config).
-
-
-%% -- mul_get --
-
-mul_get(suite) -> [];
-mul_get(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get..."),
- ?TRY_TEST1(do_mul_get).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_get() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0], Key1c4, [fname,0],Key1c3,
- [sysName,0]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,0], "test"}]),
- g([[1,3,7,1], Key1c4, [sysDescr,0], [1,3,7,2], Key1c3, [sysDescr,0]]),
- ?line ?v1_2(expect(2, noSuchName, [1,4], any),
- expect(2, [{[1,3,7,1], noSuchObject},
- {Key1c4, 2},
- {[sysDescr,0], "Erlang SNMP agent"},
- {[1,3,7,2], noSuchObject},
- {Key1c3, 2},
- {[sysDescr,0], "Erlang SNMP agent"}])).
-
-
-%% -- mul_get_err --
-
-mul_get_err(suite) -> [];
-mul_get_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get with error..."),
- ?TRY_TEST1(do_mul_get_err).
-
-%% Req. v1, system group, Klas1, OLD-SNMPEA-MIB, *ej* Klas3.
-do_mul_get_err() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0],Key1c4,[fname,0], Key1c3, [sysName,2]]),
- ?line ?v1_2(expect(1, noSuchName, 5, any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,2], noSuchInstance}])),
- g([[sysDescr,0],Key1c4,[fname3,0], Key1c3, [sysName,1]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname3,0], noSuchObject},
- {Key1c3, 2},
- {[sysName,1], noSuchInstance}])).
-
-
-%% -- mul_next --
-
-mul_next(suite) -> [];
-mul_next(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- ?TRY_TEST1(do_mul_next).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [fname],Key1c3s,[sysName]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2}, {[fname,0], "test set"},
- {Key1c3, 2}, {[sysName,0], "test"}]).
-
-
-%% -- mul_next_err --
-
-mul_next_err(suite) -> [];
-mul_next_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- ?TRY_TEST1(do_mul_next_err).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next_err() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [1,3,6,999], [fname],[1,3,90], Key1c3s,[sysName]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[1,3,6,999], endOfMibView},
- {[fname,0], "test set"},
- {[1,3,90], endOfMibView},
- {Key1c3, 2},
- {[sysName,0], "test"}])).
-
-
-%% -- mul_set --
-
-mul_set(suite) -> [];
-mul_set(Config) when list(Config) ->
- ?P(mul_set),
- ?INIT_CASE(Config),
-
- ?TRY_TEST1(do_mul_set).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set() ->
- p("Adding one row in subagent table, and one in master table"),
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, [{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [sysLocation,0],
- [friendsEntry, [3, 3]]]),
- ?line expect(2, [{[friendsEntry, [2, 3]], "kompis3"},
- {[sysLocation,0], "new_value"},
- {[friendsEntry, [3, 3]], ?active}]),
- g([NewKeyc4]),
- ?line expect(3, [{NewKeyc4, 2}]),
- s([{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]),
- ?line expect(4, [{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]).
-
-
-%% -- mul_set_err --
-
-mul_set_err(suite) -> [];
-mul_set_err(Config) when list(Config) ->
- ?P(mul_set_err),
- ?INIT_CASE(Config),
-
- ?TRY_TEST1(do_mul_set_err).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- p("Adding one row in subagent table, and one in master table"),
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {NewKeyc3, 2},
- {[sysUpTime,0], 45}, % sysUpTime (readOnly)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, notWritable), 3, any),
- g([[friendsEntry, [2, 3]]]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{[friendsEntry, [2,3]], noSuchInstance}])),
- g([NewKeyc4]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{NewKeyc4, noSuchInstance}])).
-
-
-%% -- sa_register --
-
-sa_register(suite) -> [];
-sa_register(Config) when list(Config) ->
- ?P1(sa_register),
- {SaNode, _MgrNode, MibDir} = ?INIT_CASE(Config),
-
- ?DBG("sa_register -> start subagent", []),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
-
- ?DBG("sa_register -> unregister subagent", []),
- ?P2("Testing unregister subagent (2)..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- ?TRY_TEST1(unreg_test),
-
- ?P2("Loading SA-MIB..."),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:load_mibs(SA, [MibDir ++ "SA-MIB"]),
- ?DBG("sa_register -> register subagent", []),
- rpc:call(SaNode, snmp, register_subagent, [MA,?sa,SA]),
- ?TRY_TEST1(sa_mib),
-
- ?DBG("sa_register -> stop subagent", []),
- ?line stop_subagent(SA).
-
-%% Req. SA-MIB
-sa_mib() ->
- g([[sa, [2,0]]]),
- ?line expect(1, [{[sa, [2,0]], 3}]),
- s([{[sa, [1,0]], s, "sa_test"}]),
- ?line expect(2, [{[sa, [1,0]], "sa_test"}]).
-
-
-%% -- v1_trap --
-
-v1_trap(suite) -> [];
-v1_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- ?TRY_TEST2(ma_trap1, [MA]),
- ?TRY_TEST2(ma_trap2, [MA]),
- ?TRY_TEST2(ma_v2_2_v1_trap, [MA]),
- ?TRY_TEST2(ma_v2_2_v1_trap2, [MA]),
-
- p("Testing trap sending from subagent..."),
- ?TRY_TEST2(sa_trap1, [SA]),
- ?TRY_TEST2(sa_trap2, [SA]),
- ?TRY_TEST2(sa_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-ma_trap1(MA) ->
- snmpa:send_trap(MA, testTrap2, "standard trap"),
- ?line expect(1, trap, [system], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]),
- snmpa:send_trap(MA, testTrap1, "standard trap"),
- ?line expect(2, trap, [1,2,3] , 1, 0, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]).
-
-ma_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap2(MA) ->
- snmpa:send_trap(MA,linkUp,"standard trap",[{ifIndex, [1], 1},
- {ifAdminStatus, [1], 1},
- {ifOperStatus, [1], 2}]),
- ?line expect(3, trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
- {[ifAdminStatus, 1], 1},
- {[ifOperStatus, 1], 2}]).
-
-sa_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(5, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "pelle"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(6, trap, [ericsson], 6, 2, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]}]).
-
-ma_v2_trap1(MA) ->
- ?DBG("ma_v2_traps -> entry with MA = ~p => "
- "send standard trap: testTrapv22",[MA]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_traps -> send standard trap: testTrapv21",[]),
- snmpa:send_trap(MA, testTrapv21, "standard trap"),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmp ++ [1]}]).
-
-ma_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"}]).
-
-ma_v1_2_v2_trap(MA) ->
- snmpa:send_trap(MA,linkDown,"standard trap",[{ifIndex, [1], 1}]),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmpTraps ++ [3]},
- {[ifIndex, 1], 1},
- {[snmpTrapEnterprise, 0], [1,2,3]}]).
-
-
-ma_v1_2_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"},
- {[snmpTrapEnterprise, 0], ?system}]).
-
-
-sa_v1_2_v2_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-sa_v1_2_v2_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]], "pelle"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-sa_v1_2_v2_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 2]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-%% -- sa_error --
-
-sa_error(suite) -> [];
-sa_error(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing sa bad value (is_set_ok)..."),
- ?TRY_TEST1(sa_errs_bad_value),
-
- p("Testing sa gen err (set)..."),
- ?TRY_TEST1(sa_errs_gen_err),
-
- p("Testing too big..."),
- ?TRY_TEST1(sa_too_big),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- stop_subagent(SA).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_bad_value() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 5}, % badValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, badValue, 2, any),
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 6}, % wrongValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, ?v1_2(badValue, wrongValue), 2, any),
- g([NewKeyc4]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_gen_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},{NewKeyc4, 2},
- {NewKeyc5, ?createAndGo}, {[sa, [3,0]], 5}]),
- ?line expect(1, genErr, 4, any),
-% The row might have been added; we don't know.
-% (as a matter of fact we do - it is added, because the agent
-% first sets its own vars, and then th SAs. Lets destroy it.
- s([{NewKeyc5, ?destroy}]),
- ?line expect(2, [{NewKeyc5, ?destroy}]).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_too_big() ->
- g([[sa, [4,0]]]),
- ?line expect(1, tooBig).
-
-
-%% -- next_across_sa --
-
-next_across_sa(suite) -> [];
-next_across_sa(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Loading another subagent mib..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas1"]),
-
- rpc:call(SaNode, snmp, register_subagent, [MA, ?klas1, SA]),
- ?TRY_TEST1(load_test_sa),
-
- p("Testing next across subagent (endOfMibView from SA)..."),
- ?TRY_TEST1(next_across_sa),
-
- p("Unloading mib"),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- ?TRY_TEST1(unreg_test),
-
- p("Starting another subagent"),
- ?line {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
- p("Testing next across subagent (wrong prefix from SA)..."),
- ?TRY_TEST1(next_across_sa),
-
- stop_subagent(SA),
- stop_subagent(SA2).
-
-%% Req. Klas1, system group, snmp group (v1/v2)
-next_across_sa() ->
- gn([[sysDescr],[klas1,5]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {[snmpInPkts, 0], any}]).
-
-
-%% -- undo --
-
-undo(suite) -> [];
-undo(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing undo phase at master agent..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas4"]),
- ?TRY_TEST1(undo_test),
- ?TRY_TEST1(api_test2),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas3"]),
-
- p("Testing bad return values from instrum. funcs..."),
- ?TRY_TEST1(bad_return),
-
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas4"]),
-
- p("Testing undo phase at subagent..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas4"]),
- ?line ok = snmpa:register_subagent(MA, ?klas3, SA),
- ?line ok = snmpa:register_subagent(MA, ?klas4, SA),
- ?TRY_TEST1(undo_test),
- ?TRY_TEST1(api_test3),
-
- p("Testing undo phase across master/subagents..."),
- ?TRY_TEST1(undo_test),
- ?TRY_TEST1(api_test3),
- stop_subagent(SA).
-
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]). -> noError
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]). -> {badValue, 2}
-%% snmp_test_mgr:s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]). -> {genErr, 2}
-%% Req. Klas3, Klas4
-undo_test() ->
- s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- ?line expect(1, [{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]),
- ?line expect(2, ?v1_2(badValue, inconsistentValue), 2, any),
- s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]),
- ?line expect(3, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]),
- ?line expect(4, ?v1_2(genErr, commitFailed), 1, any),
- %% unfortunatly we don't know if we'll get undoFailed or commitFailed.
- %% it depends on which order the agent traverses the varbind list.
- %% s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]),
- %% ?line expect(5, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]),
- ?line expect(6, genErr, 2, any).
-
-%% Req. Klas3, Klas4
-bad_return() ->
- g([[fStatus4,4],
- [fName4,4]]),
- ?line expect(4, genErr, 2, any),
- g([[fStatus4,5],
- [fName4,5]]),
- ?line expect(5, genErr, 1, any),
- g([[fStatus4,6],
- [fName4,6]]),
- ?line expect(6, genErr, 2, any),
- gn([[fStatus4,7],
- [fName4,7]]),
- ?line expect(7, genErr, 2, any),
- gn([[fStatus4,8],
- [fName4,8]]),
- ?line expect(8, genErr, 1, any),
- gn([[fStatus4,9],
- [fName4,9]]),
- ?line expect(9, genErr, 2, any).
-
-
-%% -- standard_mibs --
-
-%%%-----------------------------------------------------------------
-%%% Test the implementation of standard mibs.
-%%% We should *at least* try to GET all variables, just to make
-%%% sure the instrumentation functions work.
-%%% Note that many of the functions in the standard mib is
-%%% already tested by the normal tests.
-%%%-----------------------------------------------------------------
-standard_mibs(suite) ->
- [snmp_standard_mib,
- snmp_community_mib,
- snmp_framework_mib,
- snmp_target_mib,
- snmp_notification_mib,
- snmp_view_based_acm_mib].
-
-
-%% -- snmp_standard_mib --
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v1.
-%% o Test the counters and control objects in SNMP-STANDARD-MIB
-%%-----------------------------------------------------------------
-snmp_standard_mib(suite) -> [];
-snmp_standard_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?DBG("snmp_standard_mib -> std_mib_init", []),
- ?TRY_TEST1(std_mib_init),
-
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- InBadVsns = ?TRY_TEST1(std_mib_a),
- put(vsn, v2),
- ?DBG("snmp_standard_mib -> std_mib_read", []),
- ?TRY_TEST1(std_mib_read),
- put(vsn, v1),
-
- ?DBG("snmp_standard_mib -> std_mib_b (~w)", [InBadVsns]),
- Bad = ?TRY_TEST2(std_mib_b, [InBadVsns]),
- ?DBG("snmp_standard_mib -> std_mib_read (community: 'bad community')", []),
- ?TRY_TEST3(std_mib_read, [], [{community, "bad community"}]),
- ?DBG("snmp_standard_mib -> std_mib_write (community: 'public')", []),
- ?TRY_TEST3(std_mib_write, [], [{community, "public"}]),
- ?DBG("snmp_standard_mib -> std_mib_asn_err", []),
- ?TRY_TEST1(std_mib_asn_err),
- ?DBG("snmp_standard_mib -> std_mib_c (~w)", [Bad]),
- ?TRY_TEST2(std_mib_c, [Bad]),
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- ?TRY_TEST1(standard_mib_a),
-
- ?DBG("snmp_standard_mib -> std_mib_finish", []),
- ?TRY_TEST1(std_mib_finish),
- ?DBG("snmp_standard_mib -> std_mib_test_finish", []),
- ?TRY_TEST3(standard_mib_test_finish, [], [{community, "bad community"}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_a() ->
- ?line [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
- ?line [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
- ?line OutPkts2 = OutPkts + 1,
- %% There are some more counters we could test here, but it's not that
- %% important, since they are removed from SNMPv2-MIB.
- ok.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_init() ->
- %% disable authentication failure traps. (otherwise w'd get many of
- %% them - this is also a test to see that it works).
- s([{[snmpEnableAuthenTraps,0], 2}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 2}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_finish() ->
- %% enable again
- s([{[snmpEnableAuthenTraps,0], 1}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 1}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_test_finish() ->
- %% force a authenticationFailure
- std_mib_write(),
- %% check that we got a trap
- ?line expect(2, trap, [1,2,3], 4, 0, []).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_read() ->
- ?DBG("std_mib_read -> entry", []),
- g([[sysUpTime,0]]), % try a bad <something>; msg dropped, no reply
- ?DBG("std_mib_read -> await timeout (i.e. no reply)", []),
- ?line expect(1, timeout). % make sure we don't get a trap!
-
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_write() ->
- ?DBG("std_mib_write -> entry", []),
- s([{[sysLocation, 0], "new_value"}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_asn_err() ->
- ?SEND_BYTES([48,99,67,12,0,0,0,0,0,0,5]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_a() ->
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
-
- ?line [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
- InBadVsns.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_b(InBadVsns) ->
- ?line [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
- ?line InBadVsns2 = InBadVsns + 1,
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
- ?line [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
- get_req(4, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- {InBadCommunityNames, InBadCommunityUses, InASNErrs}.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_c({InBadCommunityNames, InBadCommunityUses, InASNErrs}) ->
- ?line [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
- get_req(1, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- ?line InBadCommunityNames2 = InBadCommunityNames + 1,
- ?line InBadCommunityUses2 = InBadCommunityUses + 1,
- ?line InASNErrs2 = InASNErrs + 1.
-
-
-%% -- snmp_community_mib --
-
-%%-----------------------------------------------------------------
-%% o Bad community uses/name is tested already
-%% in SNMPv2-MIB and STANDARD-MIB.
-%% o Test add/deletion of rows.
-%%-----------------------------------------------------------------
-snmp_community_mib(suite) -> [];
-snmp_community_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?TRY_TEST1(snmp_community_mib),
- ?line unload_master("SNMP-COMMUNITY-MIB").
-
-snmp_community_mib_2(X) -> snmp_community_mib(X).
-
-%% Req. SNMP-COMMUNITY-MIB
-snmp_community_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-
-%% -- snmp_framework_mib --
-
-%%-----------------------------------------------------------------
-%% o Test engine boots / time
-%%-----------------------------------------------------------------
-snmp_framework_mib(suite) -> [];
-snmp_framework_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?TRY_TEST1(snmp_framework_mib),
- ?line unload_master("SNMP-FRAMEWORK-MIB").
-
-%% Req. SNMP-FRAMEWORK-MIB
-snmp_framework_mib() ->
- ?line ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
- ?line [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
- sleep(5000),
- ?line [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
- if
- EngineTime+7 < EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- EngineTime+4 > EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- true -> ok
- end,
- ?line case get_req(4, [[snmpEngineBoots,0]]) of
- [Boots] when integer(Boots) -> ok;
- Else -> ?FAIL(Else)
- end,
- ok.
-
-
-%% -- snmp_target_mib --
-
-snmp_target_mib(suite) -> [];
-snmp_target_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?TRY_TEST1(snmp_target_mib),
- ?line unload_master("SNMP-TARGET-MIB").
-
-snmp_target_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-
-%% -- snmp_notification_mib --
-
-snmp_notification_mib(suite) -> [];
-snmp_notification_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?TRY_TEST1(snmp_notification_mib),
- ?line unload_master("SNMP-NOTIFICATION-MIB").
-
-snmp_notification_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-
-%% -- snmp_view_based_acm_mib --
-
-%%-----------------------------------------------------------------
-%% o add/delete views and try them
-%% o try boundaries
-%%-----------------------------------------------------------------
-snmp_view_based_acm_mib(suite) -> [];
-snmp_view_based_acm_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master("Test2"),
- snmp_view_based_acm_mib(),
- ?line unload_master("Test2"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-snmp_view_based_acm_mib() ->
- snmpa:verbosity(net_if,trace),
- snmpa:verbosity(master_agent,trace),
- ?LOG("start snmp_view_based_acm_mib test",[]),
- %% The user "no-rights" is present in USM, and is mapped to security
- %% name 'no-rights", which is not present in VACM.
- %% So, we'll add rights for it, try them and delete them.
- %% We'll give "no-rights" write access to tDescr.0 and read access
- %% to tDescr2.0
- %% These are the options we'll use to the mgr
- Opts = [{user, "no-rights"}, {community, "no-rights"}],
- %% Find the valid secmodel, and one invalid secmodel.
- {SecMod, InvSecMod} =
- case get(vsn) of
- v1 -> {?SEC_V1, ?SEC_V2C};
- v2 -> {?SEC_V2C, ?SEC_USM};
- v3 -> {?SEC_USM, ?SEC_V1}
- end,
- ?DBG("assign rights for 'no-rights'",[]),
- ?line ?TRY_TEST3(use_no_rights, [], Opts),
-
- %% Now, add a mapping from "no-rights" -> "no-rights-group"
- GRow1Status = [vacmSecurityToGroupStatus,[SecMod, 9,"no-rights"]],
- GRow1 =
- [{[vacmGroupName, [SecMod, 9,"no-rights"]], "no-rights-group"},
- {GRow1Status, ?createAndGo}],
- ?DBG("set '~p'",[GRow1]),
- ?line ?TRY_TEST2(do_set, [GRow1]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line ?TRY_TEST3(use_no_rights, [], Opts),
-
- %% Create a mapping for another sec model, and make sure it dosn't
- %% give us access
- GRow2Status = [vacmSecurityToGroupStatus,[InvSecMod, 9,"no-rights"]],
- GRow2 = [{[vacmGroupName, [InvSecMod, 9, "no-rights"]], "initial"},
- {GRow2Status, ?createAndGo}],
-
- ?DBG("set '~p'",[GRow2]),
- ?line ?TRY_TEST2(do_set, [GRow2]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line ?TRY_TEST3(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line ?TRY_TEST2(del_row, [GRow2Status]),
-
- RVName = "rv_name",
- WVName = "wv_name",
-
- %% Access row
- ARow1Idx = [15 | "no-rights-group"] ++ [0, ?SEC_ANY, 1],
- ARow1Status = [vacmAccessStatus, ARow1Idx],
- ARow1 = [{[vacmAccessContextMatch, ARow1Idx], 1},
- {[vacmAccessReadViewName, ARow1Idx], RVName},
- {[vacmAccessWriteViewName, ARow1Idx], WVName},
- {ARow1Status, ?createAndGo}],
-
- %% This access row would give acces, if InvSecMod was valid.
- ARow2Idx = [15 | "no-rights-group"] ++ [0, InvSecMod, 1],
- ARow2Status = [vacmAccessStatus, ARow2Idx],
- ARow2 = [{[vacmAccessContextMatch, ARow2Idx], 1},
- {[vacmAccessReadViewName, ARow2Idx], "internet"},
- {[vacmAccessWriteViewName, ARow2Idx], "internet"},
- {ARow2Status, ?createAndGo}],
-
- ?line ?TRY_TEST2(do_set, [ARow2]),
-
- ?line ?TRY_TEST3(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line ?TRY_TEST2(del_row, [ARow2Status]),
-
-
- %% Add valid row
- ?line ?TRY_TEST2(do_set, [ARow1]),
-
- ?line ?TRY_TEST3(use_no_rights, [], Opts),
-
- %% Create the view family
- VRow1Idx = mk_ln(RVName) ++ mk_ln(?xDescr), % object access
- VRow2Idx = mk_ln(RVName) ++ mk_ln(?xDescr2 ++ [0]), % instance access
- VRow3Idx = mk_ln(WVName) ++ mk_ln(?xDescr), % object access
- VRow4Idx = mk_ln(WVName) ++ mk_ln(?xDescr ++ [0]), % instance access
- VRow1Status = [vacmViewTreeFamilyStatus, VRow1Idx],
- VRow2Status = [vacmViewTreeFamilyStatus, VRow2Idx],
- VRow3Status = [vacmViewTreeFamilyStatus, VRow3Idx],
- VRow4Status = [vacmViewTreeFamilyStatus, VRow4Idx],
-
- ?line ?TRY_TEST2(add_row, [VRow1Status]),
- ?line ?TRY_TEST2(add_row, [VRow2Status]),
- ?line ?TRY_TEST2(add_row, [VRow3Status]),
-
- %% We're supposed to have access now...
- ?line ?TRY_TEST3(use_rights, [], Opts),
-
- %% Change Row3 to Row4
- ?line ?TRY_TEST2(del_row, [VRow3Status]),
- ?line ?TRY_TEST2(add_row, [VRow4Status]),
-
- %% We should still have access...
- ?line ?TRY_TEST3(use_rights, [], Opts),
-
- %% Delete rows
- ?line ?TRY_TEST2(del_row, [GRow1Status]),
-
- ?line ?TRY_TEST3(use_no_rights, [], Opts),
-
- %% Delete rest of rows
- ?line ?TRY_TEST2(del_row, [ARow1Status]),
- ?line ?TRY_TEST2(del_row, [VRow1Status]),
- ?line ?TRY_TEST2(del_row, [VRow2Status]),
- ?line ?TRY_TEST2(del_row, [VRow4Status]),
-
- ?line ?TRY_TEST3(use_no_rights, [], Opts),
- snmpa:verbosity(master_agent,log).
-
-do_set(Row) ->
- s(Row),
- expect(1, Row).
-
-add_row(RowStatus) ->
- s([{RowStatus, ?createAndGo}]),
- expect(1, [{RowStatus, ?createAndGo}]).
-
-del_row(RowStatus) ->
- s([{RowStatus, ?destroy}]),
- expect(1, [{RowStatus, ?destroy}]).
-
-
-
-use_no_rights() ->
- g([[xDescr,0]]),
- ?v1_2_3(expect(11, noSuchName, 1, any),
- expect(12, [{[xDescr,0], noSuchObject}]),
- expect(13, authorizationError, 1, any)),
- g([[xDescr2,0]]),
- ?v1_2_3(expect(21, noSuchName, 1, any),
- expect(22, [{[xDescr2,0], noSuchObject}]),
- expect(23, authorizationError, 1, any)),
- gn([[xDescr]]),
- ?v1_2_3(expect(31, noSuchName, 1, any),
- expect(32, [{[xDescr], endOfMibView}]),
- expect(33, authorizationError, 1, any)),
- s([{[xDescr,0], "tryit"}]),
- ?v1_2_3(expect(41, noSuchName, 1, any),
- expect(42, noAccess, 1, any),
- expect(43, authorizationError, 1, any)).
-
-
-use_rights() ->
- g([[xDescr,0]]),
- expect(1, [{[xDescr,0], any}]),
- g([[xDescr2,0]]),
- expect(2, [{[xDescr2,0], any}]),
- s([{[xDescr,0], "tryit"}]),
- expect(3, noError, 0, any),
- g([[xDescr,0]]),
- expect(4, [{[xDescr,0], "tryit"}]).
-
-
-%% -- sparse_table --
-
-sparse_table(suite) -> [];
-sparse_table(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = ?INIT_CASE(Config),
-
- ?line load_master("Test1"),
- ?TRY_TEST1(sparse_table_test),
- ?line unload_master("Test1").
-
-%% Req. Test1
-sparse_table_test() ->
- p("Testing sparse table..."),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- s([{[sparseStatus, Idx1], i, ?createAndGo},
- {[sparseDescr, Idx1], s, "row 1"}]),
- ?line expect(1, [{[sparseStatus, Idx1], ?createAndGo},
- {[sparseDescr, Idx1], "row 1"}]),
- s([{[sparseStatus, Idx2], i, ?createAndGo},
- {[sparseDescr, Idx2], s, "row 2"}]),
- ?line expect(2, [{[sparseStatus, Idx2], ?createAndGo},
- {[sparseDescr, Idx2], "row 2"}]),
- ?v1_2(gn([[sparseIndex], [sparseDescr,Idx1], [sparseDescr,Idx2],
- [sparseStatus,Idx1], [sparseStatus,Idx2]]),
- gb(0,5,[[sparseIndex]])),
- ?line expect(3, [{[sparseDescr,Idx1], "row 1"},
- {[sparseDescr,Idx2], "row 2"},
- {[sparseStatus,Idx1], ?active},
- {[sparseStatus,Idx2], ?active},
- {[sparseStr,0], "slut"}]),
- % Delete the rows
- s([{[sparseStatus, Idx1], i, ?destroy}]),
- ?line expect(4, [{[sparseStatus, Idx1], ?destroy}]),
- s([{[sparseStatus, Idx2], i, ?destroy}]),
- ?line expect(5, [{[sparseStatus, Idx2], ?destroy}]).
-
-
-%% -- cnt_64 --
-
-cnt_64(suite) -> [];
-cnt_64(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = ?INIT_CASE(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- ?TRY_TEST2(cnt_64_test, [MA]),
- ?line unload_master("Test1").
-
-%% Req. Test1
-cnt_64_test(MA) ->
- ?LOG("start cnt64 test (~p)",[MA]),
- snmpa:verbosity(MA,trace),
- ?LOG("start cnt64 test",[]),
- p("Testing Counter64, and at the same time, RowStatus is not last column"),
-
- ?DBG("get cnt64",[]),
- g([[cnt64,0]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(1, noSuchName, 1, any),
- expect(1, [{[cnt64,0],18446744073709551615}])),
- ?DBG("get-next cnt64",[]),
- gn([[cnt64]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(2, [{[cnt64Str,0], "after cnt64"}]),
- expect(2, [{[cnt64,0],18446744073709551615}])),
- ?DBG("send cntTrap",[]),
- snmpa:send_trap(MA,cntTrap,"standard trap",[{sysContact,"pelle"},
- {cnt64, 10},
- {sysLocation, "here"}]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, trap, [test], 6, 1, [{[sysContact,0], "pelle"},
- {[sysLocation,0], "here"}]),
- expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [1]},
- {[sysContact,0], "pelle"},
- {[cnt64,0], 10},
- {[sysLocation,0], "here"}])),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- ?DBG("create row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(1, [{[cntStatus, Idx1], ?createAndGo}]),
- ?DBG("create row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(2, [{[cntStatus, Idx2], ?createAndGo}]),
-
- ?DBG("get-next (cntIndex)",[]),
- gn([[cntIndex]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, [{[cntStatus,Idx1], ?active}]),
- expect(3, [{[cntCnt,Idx1], 0}])),
- % Delete the rows
- ?DBG("delete row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(4, [{[cntStatus, Idx1], ?destroy}]),
- ?DBG("delete row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(5, [{[cntStatus, Idx2], ?destroy}]),
- catch snmpa:verbosity(MA,log),
- ?DBG("done",[]),
- ok.
-
-
-%% -- opaque --
-
-opaque(suite) -> [];
-opaque(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = ?INIT_CASE(Config),
-
- ?line load_master("Test1"),
- ?TRY_TEST1(opaque_test),
- ?line unload_master("Test1").
-
-%% Req. Test1
-opaque_test() ->
- p("Testing Opaque datatype..."),
- g([[opaqueObj,0]]),
- ?line expect(1, [{[opaqueObj,0], "opaque-data"}]).
-
-
-%% -- change_target_addr_config --
-
-change_target_addr_config(suite) -> [];
-change_target_addr_config(Config) when list(Config) ->
- p("Testing changing target address config..."),
- ?LOG("change_target_addr_config -> entry",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(sname,snmp_suite),
- put(verbosity,trace),
-
- MA = whereis(snmp_master_agent),
-
- ?LOG("change_target_addr_config -> load TestTrap",[]),
- ?line load_master("TestTrap"),
-
- ?LOG("change_target_addr_config -> set trace verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,trace),
-
- %% First send some traps that will arive att the original manager
- ?LOG("change_target_addr_config -> send trap",[]),
- ?TRY_TEST2(ma_trap1, [MA]),
-
- ?LOG("change_target_addr_config -> set silence verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,silence),
-
- %% Start new dummy listener
- ?LOG("change_target_addr_config -> start dummy manager",[]),
- ?line {ok,Pid,NewPort} = dummy_manager_start(MA),
-
- %% Reconfigure
- ?LOG("change_target_addr_config -> reconfigure",[]),
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_addr_conf(AgentDir, NewPort),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- %% Send the trap again
- ?LOG("change_target_addr_config -> send trap again",[]),
- catch dummy_manager_send_trap2(Pid),
-
- ?LOG("change_target_addr_config -> await trap ack",[]),
- catch dummy_manager_await_trap2_ack(),
-
- ?LOG("change_target_addr_config -> stop dummy manager",[]),
- ?line ok = dummy_manager_stop(Pid),
-
- ?LOG("change_target_addr_config -> reset target address config",[]),
- ?line reset_target_addr_conf(AgentDir),
-
- ?LOG("change_target_addr_config -> unload TestTrap",[]),
- ?line unload_master("TestTrap").
-
-
-dummy_manager_start(MA) ->
- ?DBG("dummy_manager_start -> entry",[]),
- Pid = spawn(get(mgr_node), ?MODULE,dummy_manager_init,[self(),MA]),
- ?DBG("dummy_manager_start -> Pid: ~p",[Pid]),
- await_dummy_manager_started(Pid).
-
-await_dummy_manager_started(Pid) ->
- receive
- {dummy_manager_started,Pid,Port} ->
- ?DBG("dummy_manager_start -> acknowledge received with"
- "~n Port: ~p",[Port]),
- {ok,Pid,Port};
- {'EXIT', Pid, Reason} ->
- {error, Pid, Reason};
- O ->
- ?LOG("dummy_manager_start -> received unknown message:"
- "~n ~p",[O]),
- await_dummy_manager_started(Pid)
- end.
-
-dummy_manager_stop(Pid) ->
- ?DBG("dummy_manager_stop -> entry with Pid: ~p",[Pid]),
- Pid ! stop,
- receive
- {dummy_manager_stopping, Pid} ->
- ?DBG("dummy_manager_stop -> acknowledge received",[]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_stop -> timeout",[]),
- timeout
- end.
-
-dummy_manager_send_trap2(Pid) ->
- ?DBG("dummy_manager_send_trap2 -> entry",[]),
- Pid ! {send_trap,testTrap2}.
-
-dummy_manager_await_trap2_ack() ->
- ?DBG("dummy_manager_await_trap2 -> entry",[]),
- receive
- {received_trap,Trap} ->
- ?LOG("dummy_manager_await_trap2 -> received trap: ~p",[Trap]),
- %% Note:
- %% Without this sleep the v2_inform_i testcase failes! There
- %% is no relation between these two test cases as far as I
- %% able to figure out...
- sleep(60000),
- ok;
- O ->
- ?ERR("dummy_manager_await_trap2 -> unexpected message: ~p",[O]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_await_trap2 -> timeout",[]),
- timeout
- end.
-
-dummy_manager_init(Parent,MA) ->
- ?DBG("dummy_manager_init -> entry with"
- "~n Parent: ~p"
- "~n MA: ~p",[Parent,MA]),
- {ok,S} = gen_udp:open(0,[{recbuf,65535}]),
- ?DBG("dummy_manager_init -> S: ~p",[S]),
- {ok,Port} = inet:port(S),
- ?DBG("dummy_manager_init -> Port: ~p",[Port]),
- Parent ! {dummy_manager_started,self(),Port},
- dummy_manager_loop(Parent,S,MA).
-
-dummy_manager_loop(P,S,MA) ->
- ?LOG("dummy_manager_loop -> ready for receive",[]),
- receive
- {send_trap,Trap} ->
- ?LOG("dummy_manager_loop -> received trap send request"
- "~n Trap: ~p",[Trap]),
- snmpa:send_trap(MA, Trap, "standard trap"),
- dummy_manager_loop(P,S,MA);
- {udp, _UdpId, Ip, UdpPort, Bytes} ->
- ?LOG("dummy_manager_loop -> received upd message"
- "~n from: ~p:~p"
- "~n size: ~p",
- [Ip, UdpPort, dummy_manager_message_sz(Bytes)]),
- R = dummy_manager_handle_message(Bytes),
- ?DBG("dummy_manager_loop -> R: ~p",[R]),
- P ! R,
- dummy_manager_loop(P,S,MA);
- stop ->
- ?DBG("dummy_manager_loop -> received stop request",[]),
- P ! {dummy_manager_stopping, self()},
- gen_udp:close(S),
- exit(normal);
- O ->
- ?LOG("dummy_manager_loop -> received unknown message:"
- "~n ~p",[O]),
- dummy_manager_loop(P,S,MA)
- end.
-
-dummy_manager_message_sz(B) when binary(B) ->
- size(B);
-dummy_manager_message_sz(L) when list(L) ->
- length(L);
-dummy_manager_message_sz(_) ->
- undefined.
-
-dummy_manager_handle_message(Bytes) ->
- case (catch snmp_pdus:dec_message(Bytes)) of
- {'EXIT',Reason} ->
- ?ERR("dummy_manager_handle_message -> "
- "failed decoding message only:~n ~p",[Reason]),
- {error,Reason};
- M ->
- ?DBG("dummy_manager_handle_message -> decoded message:"
- "~n ~p",[M]),
- {received_trap,M}
- end.
-
-
-%% -- reported_bugs --
-
-%%%-----------------------------------------------------------------
-%%% Testing of reported bugs and other tickets.
-%%%-----------------------------------------------------------------
-
-reported_bugs(suite) ->
- [otp_1128, otp_1129, otp_1131, otp_1162,
- otp_1222, otp_1298, otp_1331, otp_1338,
- otp_1342, otp_2776, otp_2979, otp_3187, otp_3725].
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1128
-%% Slogan: Bug in handling of createAndWait set-requests.
-%%-----------------------------------------------------------------
-otp_1128(suite) -> [];
-otp_1128(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?TRY_TEST1(otp_1128),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1128() ->
- io:format("Testing bug reported in ticket OTP-1128...~n"),
-
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
-
- s([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- ?line expect(28, [{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(29, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- ?line expect(30, [{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(31, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(32, [{NewKeyc5, ?destroy}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1129, OTP-1169
-%% Slogan: snmpa:int_to_enum crashes on bad oids
-%%-----------------------------------------------------------------
-otp_1129(suite) -> [];
-otp_1129(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- ?TRY_TEST2(otp_1129_i, [node()]),
- ?line unload_master("Klas3").
-
-otp_1129_i(MaNode) ->
- io:format("Testing bug reported in ticket OTP-1129...~n"),
- false = rpc:call(MaNode, snmp, int_to_enum, [iso, 1]),
- false = rpc:call(MaNode, snmp, int_to_enum, [isox, 1]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1131
-%% Slogan: Agent crashes / erlang node halts if RowIndex in a
-%% setrequest is of bad type, e.g. an INDEX {INTEGER},
-%% and RowIdenx [3,2].
-%%-----------------------------------------------------------------
-otp_1131(suite) -> [];
-otp_1131(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas1"),
- ?TRY_TEST1(otp_1131),
- ?line unload_master("Klas1").
-
-otp_1131() ->
- io:format("Testing bug reported in ticket OTP-1131...~n"),
- s([{[friendsEntry, [2, 3, 1]], s, "kompis3"},
- {[friendsEntry, [3, 3, 1]], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 2, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1162
-%% Slogan: snmp_agent can't handle wrongValue from instrum.func
-%%-----------------------------------------------------------------
-otp_1162(suite) -> [];
-otp_1162(Config) when list(Config) ->
- ?P1(otp_1162),
- {SaNode, _MgrNode, _MibDir} = ?INIT_CASE(Config),
- ?line {ok, SA} = ?START_SA(SaNode, ?sa, "SA-MIB"),
- ?TRY_TEST1(otp_1162),
- ?STOP_SA(SA).
-
-otp_1162() ->
- s([{[sa, [2,0]], 6}]), % wrongValue (i is_set_ok)
- ?line expect(1, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1222
-%% Slogan: snmp agent crash if faulty index is returned from instrum
-%%-----------------------------------------------------------------
-otp_1222(suite) -> [];
-otp_1222(Config) when list(Config) ->
- ?P1(otp_1222),
- ?INIT_CASE(Config),
- ?line load_master("Klas3"),
- ?line load_master("Klas4"),
- ?TRY_TEST1(otp_1222),
- ?line unload_master("Klas3"),
- ?line unload_master("Klas4").
-
-otp_1222() ->
- io:format("Testing bug reported in ticket OTP-1222...~n"),
- s([{[fStatus4,1], 4}, {[fName4,1], 1}]),
- ?line expect(1, genErr, 0, any),
- s([{[fStatus4,2], 4}, {[fName4,2], 1}]),
- ?line expect(2, genErr, 0, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1298
-%% Slogan: Negative INTEGER values are treated as positive.
-%%-----------------------------------------------------------------
-otp_1298(suite) -> [];
-otp_1298(Config) when list(Config) ->
- ?P1(otp_1298),
- ?INIT_CASE(Config),
- ?line load_master("Klas2"),
- ?TRY_TEST1(otp_1298),
- ?line unload_master("Klas2").
-
-otp_1298() ->
- io:format("Testing bug reported in ticket OTP-1298...~n"),
- s([{[fint,0], -1}]),
- ?line expect(1298, [{[fint,0], -1}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1331
-%% Slogan: snmp_generic should return noError when deleting non-ex row
-%%-----------------------------------------------------------------
-otp_1331(suite) -> [];
-otp_1331(Config) when list(Config) ->
- ?P1(otp_1331),
- ?INIT_CASE(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?TRY_TEST1(otp_1331),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1331() ->
- NewKeyc5 = [intCommunityStatus,[127,32,0,0],is("test")],
- s([{NewKeyc5, ?destroy}]),
- ?line expect(1, [{NewKeyc5, ?destroy}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1338
-%% Slogan: snmp bug in initialisation of default values for mnesia tabs
-%%-----------------------------------------------------------------
-otp_1338(suite) -> [];
-otp_1338(Config) when list(Config) ->
- ?P1(otp_1338),
- ?INIT_CASE(Config),
- ?line load_master("Klas2"),
- ?TRY_TEST1(otp_1338),
- ?line unload_master("Klas2").
-
-otp_1338() ->
- s([{[kStatus2, 7], i, ?createAndGo}]),
- ?line expect(1, [{[kStatus2, 7], ?createAndGo}]),
- g([[kName2, 7]]),
- ?line expect(2, [{[kName2, 7], "JJJ"}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1342
-%% Slogan: default impl of snmp table can't handle bad index access,
-%% Set when INDEX is read-write gets into an infinite loop!
-%%-----------------------------------------------------------------
-otp_1342(suite) -> [];
-otp_1342(Config) when list(Config) ->
- ?P1(otp_1342),
- ?INIT_CASE(Config),
- ?line load_master("Klas4"),
- ?TRY_TEST1(otp_1342),
- ?line unload_master("Klas4").
-
-otp_1342() ->
- s([{[fIndex5, 1], i, 1},
- {[fName5, 1], i, 3},
- {[fStatus5, 1], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 3, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1366
-%% Slogan: snmp traps not sent to all managers
-%% Note: NYI! We need a way to tell the test server that we need
-%% mgrs on two different machines.
-%%-----------------------------------------------------------------
-otp_1366(suite) -> [];
-otp_1366(Config) when list(Config) ->
- ?P1(otp_1366),
- ?INIT_CASE(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?TRY_TEST1(otp_1366),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1366() ->
- ?INF("NOT YET IMPLEMENTED", []),
- 'NYI'.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2776
-%% Slogan: snmp:validate_date_and_time() fails when time is 00:00
-%%-----------------------------------------------------------------
-otp_2776(suite) -> [];
-otp_2776(Config) when list(Config) ->
- ?P1(otp_2776),
- ?INIT_CASE(Config),
- ?TRY_TEST1(otp_2776).
-
-otp_2776() ->
- io:format("Testing bug reported in ticket OTP-2776...~n"),
-
- Dt01_valid = [19,98,9,1,1,0,23,0,43,0,0],
- Dt02_valid = [19,98,9,1,0,0,0,0,43,0,0], % This is what is fixed: 00:00
- Dt03_valid = [19,98,2,28,1,0,23,0,43,0,0],
- Dt04_invalid = [19,98,2,29,1,0,23,0,43,0,0],
- Dt05_valid = [19,96,2,29,1,0,23,0,43,0,0],
- Dt06_valid = [20,0,2,29,1,0,23,0,43,0,0],
- Dt07_invalid = [19,96,2,30,1,0,23,0,43,0,0], % This is also fixed: 30/2
- Dt08_valid = [19,98,4,30,1,0,23,0,43,0,0],
- Dt09_invalid = [19,98,4,31,1,0,23,0,43,0,0], % This is also fixed: 31/4
- Dt10_invalid = [],
- Dt11_invalid = [kalle,hobbe],
- L = [{ 1, true, Dt01_valid},
- { 2, true, Dt02_valid},
- { 3, true, Dt03_valid},
- { 4, false, Dt04_invalid},
- { 5, true, Dt05_valid},
- { 6, true, Dt06_valid},
- { 7, false, Dt07_invalid},
- { 8, true, Dt08_valid},
- { 9, false, Dt09_invalid},
- {10, false, Dt10_invalid},
- {11, false, Dt11_invalid}],
-
- ?line ok = validate_dat(L).
-
-
-validate_dat(L) -> validate_dat(L,[]).
-
-validate_dat([],V) ->
- Fun = fun({_,X}) -> case X of
- ok -> false;
- _ -> true
- end
- end,
- validate_dat1( lists:reverse( lists:filter(Fun,V) ) );
-validate_dat([{Id,E,Dat}|T],V) ->
- validate_dat(T,[validate_dat2(Id,E,Dat) | V]).
-
-validate_dat1([]) -> ok;
-validate_dat1(L) -> {error,L}.
-
-validate_dat2(Id, E, Dat) ->
- Res = case {E,snmp:validate_date_and_time(Dat)} of
- {E,E} -> ok;
- {E,A} -> {E,A}
- end,
- {Id, Res}.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2979
-%% Slogan: get-next on more than 1 column in an empty table
-%% returns bad response.
-%%-----------------------------------------------------------------
-otp_2979(suite) -> [];
-otp_2979(Config) when list(Config) ->
- ?P1(otp_2979),
- ?INIT_CASE(Config),
- ?line load_master("Test1"),
- ?line init_old(),
- ?TRY_TEST1(otp_2979),
- ?line unload_master("Test1").
-
-otp_2979() ->
- gn([[sparseDescr], [sparseStatus]]),
- ?line expect(1, [{[sparseStr,0], "slut"},
- {[sparseStr,0], "slut"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3187
-%% Slogan: get-next on vacmAccessTable for colums > 5 returns
-%% endOfTable - should return value.
-%%-----------------------------------------------------------------
-otp_3187(suite) -> [];
-otp_3187(Config) when list(Config) ->
- ?P1(otp_3187),
- ?INIT_CASE(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- otp_3187(),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-otp_3187() ->
- ?line Elements =
- snmp_view_based_acm_mib:vacmAccessTable(get_next,[],[4,5,6]),
- lists:foreach(fun(E) ->
- ?line if E == endOfTable ->
- ?FAIL(endOfTable);
- true -> ok
- end
- end, Elements).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3542
-%% Slogan:
-%%-----------------------------------------------------------------
-otp_3542(suite) -> [];
-otp_3542(Config) when list(Config) ->
- ?P1(otp_3542),
- ?INIT_CASE(Config),
- ?TRY_TEST1(otp_3542).
-
-otp_3542() ->
- io:format("SNMP v3 discovery...~n"),
- ?line Res = snmp_test_mgr:d(),
- io:format("SNMP v3 discovery result: ~p~n",[Res]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3725
-%% Slogan: Slow response time on snmpa:int_to_enum
-%%-----------------------------------------------------------------
-otp_3725(suite) -> [];
-otp_3725(Config) when list(Config) ->
- ?P1(otp_3725),
- ?INIT_CASE(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?TRY_TEST2(otp_3725_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req. OLD-SNMPEA-MIB
-otp_3725_test(MaNode) ->
- io:format("Testing feature requested in ticket OTP-3725...~n"),
- ?line rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
- ?line Db = rpc:call(MaNode,snmp,get_symbolic_store_db,[]),
- ?DBG("otp_3725_test -> Db = ~p",[Db]),
-
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [Db, intAgentIpAddress]),
- ?DBG("otp_3725_test -> name_to_oid for ~p: ~p",[intAgentIpAddress,OID]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp, oid_to_name,
- [Db,OID]),
- ?DBG("otp_3725_test -> oid_to_name for ~p: ~p",[OID,intAgentIpAddress]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [Db, intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [Db, [1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, 'RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'xxRowStatus', 1]),
- ok.
-
-
-%% -- tickets --
-
-%% These are (ticket) test cases where the initiation has to be done
-%% individually.
-tickets(suite) ->
- [otp_4394].
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-4394
-%% Slogan: Target mib tag list check invalid
-%%-----------------------------------------------------------------
-
-otp_4394(suite) -> {req, [], {conf,
- init_otp_4394,
- [otp_4394_test],
- finish_otp_4394}}.
-
-init_otp_4394(Config) when list(Config) ->
- ?DBG("init_otp_4394 -> entry with"
- "~n Config: ~p", [Config]),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line otp_4394_config(AgentDir, MgrDir, Ip),
- MasterAgentVerbosity = {master_agent_verbosity, trace},
- NetIfVerbosity = {net_if_verbosity, trace},
- Opts = [MasterAgentVerbosity,NetIfVerbosity],
- [{vsn, v1} | start_v1_agent(Config,Opts)].
-
-otp_4394_config(AgentDir, MgrDir, Ip0) ->
- ?DBG("otp_4394_config -> entry with"
- "~n AgentDir: ~p"
- "~n MgrDir: ~p"
- "~n Ip0: ~p", [AgentDir, MgrDir, Ip0]),
- Vsn = [v1],
- Ip = tuple_to_list(Ip0),
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsn, Ip,
- ?TRAP_UDP, Ip, 4000,
- "OTP-4394 test"),
- ?line case update_usm(Vsn, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsn, MgrDir);
- false ->
- ?line ok
- end,
- C1 = {"a", "all-rights", "initial", "", "pc"},
- C2 = {"c", "secret", "secret_name", "", "secret_tag"},
- ?line write_community_conf(AgentDir, [C1, C2]),
- ?line update_vacm(Vsn, AgentDir),
- Ta1 = {"shelob v1",
- [134,138,177,177], 5000, 1500, 3, %% Använd Ip och modda
- "pc1",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [],
- 2048},
- Ta2 = {"bifur v1",
- [134,138,177,75], 5000, 1500, 3, %% Använd Ip
- "pc2",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [], 2048},
- ?line write_target_addr_conf(AgentDir, [Ta1, Ta2]),
- ?line write_target_params_conf(AgentDir, Vsn),
- ?line write_notify_conf(AgentDir),
- ok.
-
-finish_otp_4394(Config) when list(Config) ->
- ?DBG("finish_otp_4394 -> entry", []),
- C1 = stop_agent(Config),
- delete_files(C1),
- erase(mgr_node),
- lists:keydelete(vsn, 1, C1).
-
-otp_4394_test(suite) -> [];
-otp_4394_test(Config) ->
- ?P1(otp_4394_test),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?TRY_TEST1(otp_4394_test1),
- ?DBG("otp_4394_test -> done", []),
- ok.
-
-otp_4394_test1() ->
- ?DBG("otp_4394_test1 -> entry", []),
- gn([[1,1]]),
- Res =
- case snmp_test_mgr:expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]) of
- %% {error, 1, {"?",[]}, {"~w",[timeout]}}
- {error, 1, _, {_, [timeout]}} ->
- ?DBG("otp_4394_test1 -> expected result: timeout", []),
- ok;
- Else ->
- Else
- end,
- ?DBG("otp_4394_test1 -> done with: ~p", [Res]),
- Res.
-
-
-mk_ln(X) ->
- [length(X) | X].
-
-
-
-%% string used in index
-is(S) -> [length(S) | S].
-
-expect(A,B) -> ok = ?MGR:expect(A,B).
-expect(A,B,C) -> ok = ?MGR:expect(A,B,C).
-expect(A,B,C,D) -> ok = ?MGR:expect(A,B,C,D).
-expect(A,B,C,D,E,F) -> ok = ?MGR:expect(A,B,C,D,E,F).
-
diff --git a/lib/snmp/test/exp/snmp_agent_v2_test.erl b/lib/snmp/test/exp/snmp_agent_v2_test.erl
deleted file mode 100644
index 07ff1ed422..0000000000
--- a/lib/snmp/test/exp/snmp_agent_v2_test.erl
+++ /dev/null
@@ -1,5636 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(snmp_agent_v2_test).
-
-%% TODO
-%% * Test fault-tolerance (kill master etc)
-%%
-
--compile(export_all).
-
--define(application, snmp).
-
--include_lib("kernel/include/file.hrl").
--include_lib("common_test/include/ct.hrl").
--include("snmp_test_lib.hrl").
--define(SNMP_USE_V3, true).
--include_lib("snmp/include/snmp_types.hrl").
-%% -include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl").
-
-
--define(klas1, [1,3,6,1,2,1,7]).
--define(klas2, [1,3,6,1,2,1,9]).
--define(klas3, [1,3,6,1,2,1,8,1]).
--define(klas4, [1,3,6,1,2,1,8,4]).
--define(sa, [1,3,6,1,4,1,193,2]).
--define(system, [1,3,6,1,2,1,1]).
--define(snmp, [1,3,6,1,2,1,11]).
--define(snmpTraps, [1,3,6,1,6,3,1,1,5]).
--define(ericsson, [1,3,6,1,4,1,193]).
--define(testTrap, [1,3,6,1,2,1,15,0]).
--define(xDescr, [1,3,6,1,2,1,17,1]).
--define(xDescr2, [1,3,6,1,2,1,17,2]).
-
--define(active, 1).
--define(notInService, 2).
--define(notReady, 3).
--define(createAndGo, 4).
--define(createAndWait, 5).
--define(destroy, 6).
-
--define(TRAP_UDP, 5000).
-
--define(tooBigStr, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").
-
--define(str(X), snmp_pdus:bits_to_str(X)).
-
--define(break(), begin io:format(user, "break at line ~w: pid: ~p\n",
- [?LINE, self()]),
- receive cont -> ok end
- end).
-
-
--import(snmp_test_mgr, [gn/1, g/1, s/1, gb/3]).
--define(v1_2(V1,V2),
- case get(vsn) of
- v1 -> V1;
- _ -> V2
- end).
-
--define(v1_2_3(V1,V2,V3),
- case get(vsn) of
- v1 -> V1;
- v2 -> V2;
- _ -> V3
- end).
-
-all() ->
-[cases()].
-
-groups() ->
- [{mib_storage, [],
- [{group, mib_storage_ets}, {group, mib_storage_dets},
- {group, mib_storage_mnesia},
- {group, mib_storage_size_check_ets},
- {group, mib_storage_size_check_dets},
- {group, mib_storage_size_check_mnesia},
- {group, mib_storage_varm_dets},
- {group, mib_storage_varm_mnesia}]},
- {mib_storage_ets, [], mib_storage_ets_cases()},
- {mib_storage_dets, [], mib_storage_dets_cases()},
- {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
- {mib_storage_size_check_ets, [],
- mse_size_check_cases()},
- {mib_storage_size_check_dets, [],
- msd_size_check_cases()},
- {mib_storage_size_check_mnesia, [],
- msm_size_check_cases()},
- {mib_storage_varm_dets, [],
- varm_mib_storage_dets_cases()},
- {mib_storage_varm_mnesia, [],
- varm_mib_storage_mnesia_cases()},
- {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
- {test_v1_v2, [], v1_v2_cases()},
- {test_v3, [], v3_cases()},
- {test_multi_threaded, [], mt_cases()},
- {multiple_reqs, [], mul_cases()},
- {multiple_reqs_2, [], mul_cases_2()},
- {v2_inform, [], [v2_inform_i]},
- {v3_security, [],
- [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
- v3_des_priv]},
- {standard_mibs, [],
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib, snmp_target_mib,
- snmp_notification_mib, snmp_view_based_acm_mib]},
- {standard_mibs_2, [],
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2, snmp_target_mib_2,
- snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
- {standard_mibs_3, [],
- [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
- {reported_bugs, [],
- [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
- otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
- otp_2979, otp_3187, otp_3725]},
- {reported_bugs_2, [],
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
- {reported_bugs_3, [],
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542]},
- {tickets, [], [{group, otp_4394}]},
- {otp_4394, [], [otp_4394_test]}].
-
-init_per_group(otp_4394, Config) ->
- init_otp_4394(Config);
-init_per_group(v2_inform, Config) ->
- init_v2_inform(Config);
-init_per_group(multiple_reqs_2, Config) ->
- init_mul(Config);
-init_per_group(multiple_reqs, Config) ->
- init_mul(Config);
-init_per_group(test_multi_threaded, Config) ->
- init_mt(Config);
-init_per_group(test_v3, Config) ->
- init_v3(Config);
-init_per_group(test_v1_v2, Config) ->
- init_v1_v2(Config);
-init_per_group(test_v2, Config) ->
- init_v2(Config);
-init_per_group(test_v1, Config) ->
- init_v1(Config);
-init_per_group(mib_storage_varm_mnesia, Config) ->
- init_varm_mib_storage_mnesia(Config);
-init_per_group(mib_storage_varm_dets, Config) ->
- init_varm_mib_storage_dets(Config);
-init_per_group(mib_storage_size_check_mnesia, Config) ->
- init_size_check_msm(Config);
-init_per_group(mib_storage_size_check_dets, Config) ->
- init_size_check_msd(Config);
-init_per_group(mib_storage_size_check_ets, Config) ->
- init_size_check_mse(Config);
-init_per_group(mib_storage_mnesia, Config) ->
- init_mib_storage_mnesia(Config);
-init_per_group(mib_storage_dets, Config) ->
- init_mib_storage_dets(Config);
-init_per_group(mib_storage_ets, Config) ->
- init_mib_storage_ets(Config);
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(otp_4394, Config) ->
- finish_otp_4394(Config);
-end_per_group(v2_inform, Config) ->
- finish_v2_inform(Config);
-end_per_group(multiple_reqs_2, Config) ->
- finish_mul(Config);
-end_per_group(multiple_reqs, Config) ->
- finish_mul(Config);
-end_per_group(test_multi_threaded, Config) ->
- finish_mt(Config);
-end_per_group(test_v3, Config) ->
- finish_v3(Config);
-end_per_group(test_v1_v2, Config) ->
- finish_v1_v2(Config);
-end_per_group(test_v2, Config) ->
- finish_v2(Config);
-end_per_group(test_v1, Config) ->
- finish_v1(Config);
-end_per_group(mib_storage_varm_mnesia, Config) ->
- finish_varm_mib_storage_mnesia(Config);
-end_per_group(mib_storage_varm_dets, Config) ->
- finish_varm_mib_storage_dets(Config);
-end_per_group(mib_storage_size_check_mnesia, Config) ->
- finish_size_check_msm(Config);
-end_per_group(mib_storage_size_check_dets, Config) ->
- finish_size_check_msd(Config);
-end_per_group(mib_storage_size_check_ets, Config) ->
- finish_size_check_mse(Config);
-end_per_group(mib_storage_mnesia, Config) ->
- finish_mib_storage_mnesia(Config);
-end_per_group(mib_storage_dets, Config) ->
- finish_mib_storage_dets(Config);
-end_per_group(mib_storage_ets, Config) ->
- finish_mib_storage_ets(Config);
-end_per_group(_GroupName, Config) ->
- Config.
-
-
-init_per_testcase(_Case, Config) when list(Config) ->
- Dog = test_server:timetrap(test_server:minutes(6)),
- [{watchdog, Dog}|Config].
-
-end_per_testcase(_Case, Config) when list(Config) ->
- Dog = ?config(watchdog, Config),
- test_server:timetrap_cancel(Dog),
- Config.
-
-cases() ->
- [
- app_info,
- {group, test_v1}, {group, test_v2},
- {group, test_v1_v2}, {group, test_v3},
- {group, test_multi_threaded}, {group, mib_storage},
- {group, tickets}
- ].
-
-
-%%%-----------------------------------------------------------------
-%%% The test case structure is as follows:
-%%%
-%%% init_all - starts mnesia,
-%%%
-%%% init_v1 - starts agent
-%%% simple
-%%% big - e.g. starts/stops subagent, load/unloads mibs
-%%% init_mul
-%%% mul_get
-%%% mul_set
-%%% <etc>
-%%% finish_mul
-%%% <etc>
-%%% finish_v1
-%%%
-%%% init_v2 - starts agent
-%%% finish_v2
-%%%
-%%% init_bilingual - starts agent
-%%% finish_bilingual
-%%%
-%%% finish_all
-%%%
-%%% There is still one problem with these testsuites. If one test
-%%% fails, it may not be possible to run some other cases, as it
-%%% may have e.g. created some row or loaded some table, that it
-%%% didn't undo (since it failed).
-%%%-----------------------------------------------------------------
-
-init_all(Config0) when list(Config0) ->
- ?LOG("init_all -> entry with"
- "~n Config0: ~p",[Config0]),
-
- %% --
- %% Fix config:
- %%
-
- DataDir0 = ?config(data_dir, Config0),
- DataDir1 = filename:split(filename:absname(DataDir0)),
- [_|DataDir2] = lists:reverse(DataDir1),
- DataDir3 = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),
- Config1 = lists:keydelete(data_dir, 1, Config0),
- Config = [{data_dir, DataDir3 ++ "/"}|Config1],
-
- %% --
- %% Start nodes
- %%
-
- ?line {ok, SaNode} = start_node(snmp_sa),
- ?line {ok, MgrNode} = start_node(snmp_mgr),
-
-
- %% --
- %% Create necessary files
- %%
-
- Dir = ?config(priv_dir, Config),
- ?DBG("init_all -> Dir ~p", [Dir]),
-
- DataDir = ?config(data_dir, Config),
- ?DBG("init_all -> DataDir ~p", [DataDir]),
-
- file:make_dir(MgrDir = filename:join(Dir, "mgr_dir/")),
- ?DBG("init_all -> MgrDir ~p", [MgrDir]),
-
- file:make_dir(AgentDir = filename:join(Dir, "agent_dir/")),
- ?DBG("init_all -> AgentDir ~p", [AgentDir]),
-
- file:make_dir(SaDir = filename:join(Dir, "sa_dir/")),
- ?DBG("init_all -> SaDir ~p", [SaDir]),
-
-
- %% --
- %% Start and initiate mnesia
- %%
-
- ?DBG("init_all -> load application mnesia", []),
- ?line ok = application:load(mnesia),
-
- ?DBG("init_all -> load application mnesia on node ~p", [SaNode]),
- ?line ok = rpc:call(SaNode, application, load, [mnesia]),
-
- ?DBG("init_all -> application mnesia: set_env dir",[]),
- ?line application_controller:set_env(mnesia, dir,
- filename:join(Dir, "Mnesia1")),
-
- ?DBG("init_all -> application mnesia: set_env dir on node ~p",[SaNode]),
- ?line rpc:call(SaNode, application_controller, set_env,
- [mnesia, dir, filename:join(Dir, "Mnesia2")]),
-
- ?DBG("init_all -> create mnesia schema",[]),
- ?line ok = mnesia:create_schema([SaNode, node()]),
-
- ?DBG("init_all -> start application mnesia",[]),
- ?line ok = application:start(mnesia),
-
- ?DBG("init_all -> start application mnesia on ~p",[SaNode]),
- ?line ok = rpc:call(SaNode, application, start, [mnesia]),
- Ip = ?LOCALHOST(),
- [{snmp_sa, SaNode},
- {snmp_mgr, MgrNode},
- {agent_dir, AgentDir ++ "/"},
- {mgr_dir, MgrDir ++ "/"},
- {sa_dir, SaDir ++ "/"},
- {mib_dir, DataDir},
- {ip, Ip} |
- Config].
-
-finish_all(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- stop_node(SaNode),
- stop_node(MgrNode),
- application:stop(mnesia).
-
-start_v1_agent(Config) when list(Config) ->
- start_agent(Config, [v1]).
-
-start_v1_agent(Config,Opts) when list(Config), list(Opts) ->
- start_agent(Config, [v1], Opts).
-
-start_v2_agent(Config) when list(Config) ->
- start_agent(Config, [v2]).
-
-start_v3_agent(Config) when list(Config) ->
- start_agent(Config, [v3]).
-
-start_bilingual_agent(Config) when list(Config) ->
- start_agent(Config, [v1,v2]).
-
-start_multi_threaded_agent(Config) when list(Config) ->
- start_agent(Config, [v2], [{snmp_multi_threaded, true}]).
-
-stop_agent(Config) when list(Config) ->
- ?LOG("stop_agent -> entry with"
- "~n Config: ~p",[Config]),
-
- {Sup, Par} = ?config(snmp_sup, Config),
- ?DBG("stop_agent -> attempt to stop (sup) ~p"
- "~n Sup: ~p"
- "~n Par: ~p",
- [Sup,
- (catch process_info(Sup)),
- (catch process_info(Par))]),
- stop_sup(Sup, Par),
-
- {Sup2, Par2} = ?config(snmp_sub, Config),
- ?DBG("stop_agent -> attempt to stop (sub) ~p"
- "~n Sup2: ~p"
- "~n Par2: ~p",
- [Sup2,
- (catch process_info(Sup2)),
- (catch process_info(Par2))]),
- stop_sup(Sup2, Par2),
-
- ?DBG("stop_agent -> done - now cleanup config", []),
- C1 = lists:keydelete(snmp_sup, 1, Config),
- lists:keydelete(snmp_sub, 1, C1).
-
-
-stop_sup(Pid, _) when node(Pid) == node() ->
- case (catch process_info(Pid)) of
- PI when list(PI) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- exit(Pid, kill),
- await_stopped(Pid, Ref);
- {'EXIT', _Reason} ->
- ?LOG("stop_sup -> ~p not running", [Pid]),
- ok
- end;
-stop_sup(Pid, _) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- ?LOG("stop_sup -> Ref: ~p", [Ref]),
- %% Pid ! {'EXIT', Parent, shutdown}, % usch
- exit(Pid, kill),
- await_stopped(Pid, Ref).
-
-await_stopped(Pid, Ref) ->
- receive
- {'DOWN', Ref, process, Pid, _Reason} ->
- ?DBG("received down message for ~p", [Pid]),
- ok
- after 10000 ->
- ?INF("await_stopped -> timeout for ~p",[Pid]),
- erlang:demonitor(Ref),
- ?FAIL({failed_stop,Pid})
- end.
-
-
-start_agent(Config, Vsn) ->
- start_agent(Config, Vsn, []).
-start_agent(Config, Vsn, Opts) ->
- ?LOG("start_agent -> entry (~p) with"
- "~n Config: ~p"
- "~n Vsn: ~p"
- "~n Opts: ~p",[node(), Config, Vsn, Opts]),
-
- ?line AgentDir = ?config(agent_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
-
- snmp_app_env_init(vsn_init(Vsn) ++
- [{audit_trail_log, read_write_log},
- {audit_trail_log_dir, AgentDir},
- {audit_trail_log_size, {10240, 10}},
- {force_config_reload, false},
- {snmp_agent_type, master},
- {snmp_config_dir, AgentDir},
- {snmp_db_dir, AgentDir},
- {snmp_local_db_auto_repair, true},
- {snmp_master_agent_verbosity, trace},
- {snmp_supervisor_verbosity, trace},
- {snmp_mibserver_verbosity, trace},
- {snmp_symbolic_store_verbosity, trace},
- {snmp_note_store_verbosity, trace},
- {snmp_net_if_verbosity, trace}],
- Opts),
-
-
- process_flag(trap_exit,true),
-
- {ok, AppSup} = snmp_app_sup:start_link(),
- unlink(AppSup),
- ?DBG("start_agent -> snmp app supervisor: ~p",[AppSup]),
-
- ?DBG("start_agent -> start master agent (old style)",[]),
- Sup = case (catch snmpa_app:start(normal)) of
- {ok, S} ->
- ?DBG("start_agent -> started, Sup: ~p",[S]),
- S;
-
- Else ->
- ?DBG("start_agent -> unknown result: ~n~p",[Else]),
- %% Get info about the apps we depend on
- MnesiaInfo = mnesia_running(),
- ?FAIL({start_failed,Else,MnesiaInfo})
- end,
-
- ?DBG("start_agent -> unlink from supervisor",[]),
- ?line unlink(Sup),
- ?line SaDir = ?config(sa_dir, Config),
- ?DBG("start_agent -> (rpc) start sub on ~p",[SaNode]),
- ?line {ok, Sub} = rpc:call(SaNode, ?MODULE, start_sub, [SaDir]),
- ?DBG("start_agent -> done",[]),
- ?line [{snmp_sup, {Sup, self()}}, {snmp_sub, Sub} | Config].
-
-
-vsn_init(Vsn) ->
- vsn_init([v1,v2,v3], Vsn, []).
-
-vsn_init([], _Vsn, Acc) ->
- Acc;
-vsn_init([V|Vsns], Vsn, Acc) ->
- case lists:member(V, Vsn) of
- true ->
- vsn_init(Vsns, Vsn, [{V, true}|Acc]);
- false ->
- vsn_init(Vsns, Vsn, [{V, false}|Acc])
- end.
-
-snmp_app_env_init(Env0, Opts) ->
- ?DBG("snmp_app_env_init -> unload snmp",[]),
- ?line application:unload(snmp),
- ?DBG("snmp_app_env_init -> load snmp",[]),
- ?line application:load(snmp),
- ?DBG("snmp_app_env_init -> initiate (snmp) application env",[]),
- F1 = fun({Key,Val} = New, Acc0) ->
- ?DBG("snmp_app_env_init -> "
- "updating setting ~p to ~p", [Key, Val]),
- case lists:keyreplace(Key, 1, Acc0, New) of
- Acc0 ->
- [New|Acc0];
- Acc ->
- Acc
- end
- end,
- Env = lists:foldr(F1, Env0, Opts),
- ?DBG("snmp_app_env_init -> Env: ~p",[Env]),
- F2 = fun({Key,Val}) ->
- ?DBG("snmp_app_env_init -> setting ~p to ~p",[Key, Val]),
- application_controller:set_env(snmp, Key, Val)
- end,
- lists:foreach(F2, Env).
-
-
-
-
-%% Test if application is running
-mnesia_running() -> ?IS_MNESIA_RUNNING().
-crypto_running() -> ?IS_CRYPTO_RUNNING().
-
-
-start_sub(Dir) ->
- ?DBG("start_sub -> entry",[]),
- Opts = [{db_dir, Dir},
- {supervisor, [{verbosity, trace}]}],
- %% BMK BMK
-% {ok, P} = snmp_supervisor:start_sub(Dir),
- {ok, P} = snmpa_supervisor:start_sub_sup(Opts),
- unlink(P),
- {ok, {P, self()}}.
-
-create_tables(SaNode) ->
- ?line {atomic, ok} = mnesia:create_table([{name, friendsTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, kompissTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, snmp_variables},
- {attributes, [a1,a2]}]).
-
-delete_tables() ->
- mnesia:delete_table(friendsTable2),
- mnesia:delete_table(kompissTable2),
- mnesia:delete_table(snmp_variables).
-
-%% Creation is done in runtime!
-delete_mib_storage_mnesia_tables() ->
- mnesia:delete_table(snmpa_mib_data),
- mnesia:delete_table(snmpa_mib_tree),
- mnesia:delete_table(snmpa_symbolic_store).
-
-%%-----------------------------------------------------------------
-%% A test case is always one of:
-%% - v1 specific case
-%% - v2 specific case
-%% - v1 and v2 case
-%% All v1 specific cases are prefixed with v1_, and all v2 with
-%% v2_. E.g. v1_trap/v2_trap.
-%%
-%% All other cases are shared. However, the testserver uses the name
-%% of the case to generate a file for that case. The same case cannot
-%% be used in different configurations in the same suite. Therefore
-%% all these functions exists in two variants, the base function
-%% <base>, and a second version <base>_2. There may be several
-%% versions as well, <base>_N.
-%%-----------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-mib_storage_ets_cases() ->
-[mse_simple, mse_v1_processing, mse_big, mse_big2,
- mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
- mse_sa_error, mse_next_across_sa, mse_undo,
- mse_standard_mib, mse_community_mib, mse_framework_mib,
- mse_target_mib, mse_notification_mib,
- mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
-[msd_simple, msd_v1_processing, msd_big, msd_big2,
- msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
- msd_sa_error, msd_next_across_sa, msd_undo,
- msd_standard_mib, msd_community_mib, msd_framework_mib,
- msd_target_mib, msd_notification_mib,
- msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
- msd_mib_of].
-
-mib_storage_mnesia_cases() ->
-[msm_simple, msm_v1_processing, msm_big, msm_big2,
- msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
- msm_sa_error, msm_next_across_sa, msm_undo,
- msm_standard_mib, msm_community_mib, msm_framework_mib,
- msm_target_mib, msm_notification_mib,
- msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
- msm_mib_of].
-
-mse_size_check_cases() ->
-[mse_size_check].
-
-msd_size_check_cases() ->
-[msd_size_check].
-
-msm_size_check_cases() ->
-[msm_size_check].
-
-varm_mib_storage_dets_cases() ->
-[msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
-[msm_varm_mib_start].
-
-init_mib_storage_ets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,ets},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- init_ms(Config, [MibStorage]).
-
-init_ms(Config, Opts) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts1 = [MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity|Opts],
- [{vsn, v1} | start_v1_agent(Config,Opts1)].
-
-init_size_check_mse(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, ets},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msd(Config) when list(Config) ->
- AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage, {dets, AgentDir}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msm(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, {mnesia,[]}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_ms(Config, Opts) when list(Config) ->
- SaNode = ?GCONF(snmp_sa, Config),
- %% We are using v3 here, so crypto must be supported or else...
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- create_tables(SaNode),
- AgentDir = ?GCONF(agent_dir, Config),
- MgrDir = ?GCONF(mgr_dir, Config),
- Ip = ?GCONF(ip, Config),
- ?line ok =
- config([v3], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_agent(Config, [v3], Opts)].
-
-init_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_dets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-init_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_mnesia -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-finish_mib_storage_ets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_ets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_dets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_dets -> entry", []),
- delete_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_size_check_mse(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msd(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msm(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_ms(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%% These are just interface functions to fool the test server
-mse_simple(X) -> simple(X).
-mse_v1_processing(X) -> v1_processing(X).
-mse_big(X) -> big(X).
-mse_big2(X) -> big2(X).
-mse_loop_mib(X) -> loop_mib(X).
-mse_api(X) -> api(X).
-mse_sa_register(X) -> sa_register(X).
-mse_v1_trap(X) -> v1_trap(X).
-mse_sa_error(X) -> sa_error(X).
-mse_next_across_sa(X) -> next_across_sa(X).
-mse_undo(X) -> undo(X).
-mse_standard_mib(X) -> snmp_standard_mib(X).
-mse_community_mib(X) -> snmp_community_mib(X).
-mse_framework_mib(X) -> snmp_framework_mib(X).
-mse_target_mib(X) -> snmp_target_mib(X).
-mse_notification_mib(X) -> snmp_notification_mib(X).
-mse_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-mse_sparse_table(X) -> sparse_table(X).
-mse_me_of(X) -> ms_me_of(X).
-mse_mib_of(X) -> ms_mib_of(X).
-
-msd_simple(X) -> simple(X).
-msd_v1_processing(X) -> v1_processing(X).
-msd_big(X) -> big(X).
-msd_big2(X) -> big2(X).
-msd_loop_mib(X) -> loop_mib(X).
-msd_api(X) -> api(X).
-msd_sa_register(X) -> sa_register(X).
-msd_v1_trap(X) -> v1_trap(X).
-msd_sa_error(X) -> sa_error(X).
-msd_next_across_sa(X) -> next_across_sa(X).
-msd_undo(X) -> undo(X).
-msd_standard_mib(X) -> snmp_standard_mib(X).
-msd_community_mib(X) -> snmp_community_mib(X).
-msd_framework_mib(X) -> snmp_framework_mib(X).
-msd_target_mib(X) -> snmp_target_mib(X).
-msd_notification_mib(X) -> snmp_notification_mib(X).
-msd_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msd_sparse_table(X) -> sparse_table(X).
-msd_me_of(X) -> ms_me_of(X).
-msd_mib_of(X) -> ms_mib_of(X).
-
-msm_simple(X) -> simple(X).
-msm_v1_processing(X) -> v1_processing(X).
-msm_big(X) -> big(X).
-msm_big2(X) -> big2(X).
-msm_loop_mib(X) -> loop_mib(X).
-msm_api(X) -> api(X).
-msm_sa_register(X) -> sa_register(X).
-msm_v1_trap(X) -> v1_trap(X).
-msm_sa_error(X) -> sa_error(X).
-msm_next_across_sa(X) -> next_across_sa(X).
-msm_undo(X) -> undo(X).
-msm_standard_mib(X) -> snmp_standard_mib(X).
-msm_community_mib(X) -> snmp_community_mib(X).
-msm_framework_mib(X) -> snmp_framework_mib(X).
-msm_target_mib(X) -> snmp_target_mib(X).
-msm_notification_mib(X) -> snmp_notification_mib(X).
-msm_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msm_sparse_table(X) -> sparse_table(X).
-msm_me_of(X) -> ms_me_of(X).
-msm_mib_of(X) -> ms_mib_of(X).
-
-
-mse_size_check(X) -> p("mse_size_check..."), ms_size_check(X).
-msd_size_check(X) -> p("msd_size_check..."), ms_size_check(X).
-msm_size_check(X) -> p("msm_size_check..."), ms_size_check(X).
-
-msd_varm_mib_start(X) -> p("msd_varm_mib_start..."), varm_mib_start(X).
-msm_varm_mib_start(X) -> p("msm_varm_mib_start..."), varm_mib_start(X).
-
-ms_size_check(suite) -> [];
-ms_size_check(Config) when list(Config) ->
- p("ms_size_check..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?LOG("mib server size check...", []),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMPv2-MIB"),
- ?line load_master_std("SNMPv2-TM"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMPv2-MIB"),
- ?line unload_master("SNMPv2-TM"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-
-varm_mib_start(suite) -> [];
-varm_mib_start(Config) when list(Config) ->
- p("varm_mib_start..."),
- ?LOG("varm_mib_start -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- %% Start the agent
- Opts = ?GCONF(agent_opts, Config),
- Config1 = start_v1_agent(Config, Opts),
-
- %% Sleep some in order for the agent to start properly
- ?DBG("varm_mib_start -> sleep some (before loading mobs)", []),
- ?SLEEP(5000),
-
- %% Load all the mibs
- HardwiredMibs = loaded_mibs(),
- ?DBG("varm_mib_start -> load all mibs", []),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
-
- %% Unload the hardwired mibs
- ?DBG("varm_mib_start -> sleep some (before unloading hardwired mibs)", []),
- ?SLEEP(1000),
- ?DBG("varm_mib_start -> unload (hardwired) mibs", []),
- ?line unload_mibs(HardwiredMibs), %% unload hardwired
-
- ?DBG("varm_mib_start -> sleep some (before stopping agent)", []),
- ?SLEEP(1000),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- Config2 = stop_agent(Config1),
-
- %% Sleep some in order for the agent to stop properly
- ?DBG("varm_mib_start -> sleep some (before re-starting the agent)", []),
- ?SLEEP(5000),
-
- %% Start the agent (again)
- ?DBG("varm_mib_start -> start the agent", []),
- Config3 = start_v1_agent(Config2, Opts),
-
- ?DBG("varm_mib_start -> sleep some (before starting tests)", []),
- ?SLEEP(5000),
-
- %% Perform the test(s)
- ?DBG("varm_mib_start -> perform the tests", []),
- try_test(snmp_community_mib),
- try_test(snmp_framework_mib),
- try_test(snmp_target_mib),
- try_test(snmp_notification_mib),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- stop_agent(Config3),
- ok.
-
-
--define(snmpTrapCommunity_instance, [1,3,6,1,6,3,18,1,4,0]).
--define(vacmViewSpinLock_instance, [1,3,6,1,6,3,16,1,5,1,0]).
--define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-ms_me_of(suite) -> [];
-ms_me_of(Config) when list(Config) ->
- p("ms_me_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_me_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = me_of(?snmpTrapCommunity_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = me_of(?vacmViewSpinLock_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = me_of(?usmStatsNotInTimeWindows_instance),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-me_of(Oid) ->
- case snmpa:me_of(Oid) of
- {ok, #me{oid = Oid}} ->
- ok;
- {ok, #me{oid = OtherOid}} ->
- case lists:reverse(Oid) of
- [0|Rest] ->
- case lists:reverse(Rest) of
- OtherOid ->
- ok;
- AnotherOid ->
- {error, {invalid_oid, Oid, AnotherOid}}
- end;
- _ ->
- {error, {invalid_oid, Oid, OtherOid}}
- end;
- {error, Reason} ->
- {error, Reason};
- Else ->
- {error, Else}
- end.
-
-
-ms_mib_of(suite) -> [];
-ms_mib_of(Config) when list(Config) ->
- p("ms_mib_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_mib_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = mib_of(?snmpTrapCommunity_instance, 'SNMP-COMMUNITY-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = mib_of(?vacmViewSpinLock_instance, 'SNMP-VIEW-BASED-ACM-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = mib_of(?usmStatsNotInTimeWindows_instance,
- 'SNMP-USER-BASED-SM-MIB'),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-mib_of(Oid, ExpectedMibName) ->
- ?DBG("mib_of -> entry with"
- "~n Oid: ~p"
- "~n ExpectedMibName: ~p", [Oid, ExpectedMibName]),
- %% case snmpa:mib_of(Oid) of
- MibOf = snmpa:mib_of(Oid),
- ?DBG("mib_of -> MibOf: ~n~p", [MibOf]),
- case MibOf of
- {ok, ExpectedMibName} ->
- ok;
- {ok, OtherMibName} ->
- {error, {invalid_mib, ExpectedMibName, OtherMibName}};
- {error, Reason} ->
- {error, Reason};
- Else ->
- ?DBG("mib_of -> Else: ~n~p", [Else]),
- {error, Else}
- end.
-
-
-app_info(suite) -> [];
-app_info(Config) when list(Config) ->
- SnmpDir = app_dir(snmp),
- SslDir = app_dir(ssl),
- CryptoDir = app_dir(crypto),
- Attr = snmp:module_info(attributes),
- AppVsn =
- case lists:keysearch(app_vsn, 1, Attr) of
- {value, {app_vsn, V}} ->
- V;
- false ->
- "undefined"
- end,
- io:format("Root dir: ~s~n"
- "SNMP: Application dir: ~s~n"
- " Application ver: ~s~n"
- "SSL: Application dir: ~s~n"
- "CRYPTO: Application dir: ~s~n",
- [code:root_dir(), SnmpDir, AppVsn, SslDir, CryptoDir]),
- ok.
-
-app_dir(App) ->
- case code:lib_dir(App) of
- D when list(D) ->
- filename:basename(D);
- {error, _Reason} ->
- "undefined"
- end.
-
-
-
-%v1_cases() -> [loop_mib];
-v1_cases() ->
-[simple, db_notify_client, v1_processing, big, big2,
- loop_mib, api, subagent, mnesia, {group, multiple_reqs},
- sa_register, v1_trap, sa_error, next_across_sa, undo,
- {group, reported_bugs}, {group, standard_mibs},
- sparse_table, cnt_64, opaque, change_target_addr_config].
-
-init_v1(Config) when list(Config) ->
- ?line SaNode = ?config(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v1} | start_v1_agent(Config)].
-
-finish_v1(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v2_cases() -> [loop_mib_2];
-v2_cases() ->
-[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
- sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
- next_across_sa_2, undo_2, {group, reported_bugs_2},
- {group, standard_mibs_2}, v2_types, implied,
- sparse_table_2, cnt_64_2, opaque_2, v2_caps].
-
-init_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_v2_agent(Config)].
-
-finish_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-v1_v2_cases() ->
-[simple_bi].
-
-init_v1_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v1,v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, bilingual} | start_bilingual_agent(Config)].
-
-finish_v1_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v3_cases() -> [loop_mib_3];
-v3_cases() ->
-[simple_3, v3_processing, big_3, big2_3, api_3,
- subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
- sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, {group, reported_bugs_3},
- {group, standard_mibs_3}, {group, v3_security},
- v2_types_3, implied_3, sparse_table_3, cnt_64_3,
- opaque_3, v2_caps_3].
-
-init_v3(Config) when list(Config) ->
- %% Make sure crypto works, otherwise start_agent will fail
- %% and we will be stuck with a bunch of mnesia tables for
- %% the rest of this suite...
- ?DBG("start_agent -> start crypto app",[]),
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v3], MgrDir, AgentDir,
- tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_v3_agent(Config)].
-
-finish_v3(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-mt_cases() ->
-[multi_threaded, mt_trap].
-
-init_mt(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_multi_threaded_agent(Config)].
-
-finish_mt(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-%% This one *must* be run first in each case.
-init_case(Config) when list(Config) ->
- ?DBG("init_case -> entry with"
- "~n Config: ~p", [Config]),
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- MasterNode = node(),
-
- SaHost = ?HOSTNAME(SaNode),
- MgrHost = ?HOSTNAME(MgrNode),
- MasterHost = ?HOSTNAME(MasterNode),
- {ok, MasterIP} = snmp_misc:ip(MasterHost),
- {ok, MIP} = snmp_misc:ip(MgrHost),
- {ok, SIP} = snmp_misc:ip(SaHost),
-
-
- put(mgr_node, MgrNode),
- put(sa_node, SaNode),
- put(master_node, MasterNode),
- put(sa_host, SaHost),
- put(mgr_host, MgrHost),
- put(master_host, MasterHost),
- put(mip, tuple_to_list(MIP)),
- put(masterip , tuple_to_list(MasterIP)),
- put(sip, tuple_to_list(SIP)),
-
- MibDir = ?config(mib_dir, Config),
- put(mib_dir, MibDir),
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- put(std_mib_dir, StdM),
-
- MgrDir = ?config(mgr_dir, Config),
- put(mgr_dir, MgrDir),
-
- put(vsn, ?config(vsn, Config)),
- ?DBG("init_case -> exit with"
- "~n MasterNode: ~p"
- "~n SaNode: ~p"
- "~n MgrNode: ~p"
- "~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]),
- {SaNode, MgrNode, MibDir}.
-
-load_master(Mib) ->
- ?DBG("load_master -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(mib_dir) ++ Mib]).
-
-load_master_std(Mib) ->
- ?DBG("load_master_std -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(std_mib_dir) ++ Mib]).
-
-unload_master(Mib) ->
- ?DBG("unload_master -> entry with"
- "~n Mib: ~p", [Mib]),
- ok = snmpa:unload_mibs(snmp_master_agent, [Mib]).
-
-loaded_mibs() ->
- ?DBG("loaded_mibs -> entry",[]),
- Info = snmpa:info(snmp_master_agent),
- {value, {loaded_mibs, Mibs}} = lists:keysearch(loaded_mibs, 1, Info),
- [atom_to_list(Mib) || {Mib,_,_} <- Mibs].
-
-unload_mibs(Mibs) ->
- ?DBG("unload_mibs -> entry with"
- "~n Mibs: ~p", [Mibs]),
- ok = snmpa:unload_mibs(snmp_master_agent, Mibs).
-
-start_subagent(SaNode, RegTree, Mib) ->
- ?DBG("start_subagent -> entry with"
- "~n SaNode: ~p"
- "~n RegTree: ~p"
- "~n Mib: ~p", [SaNode, RegTree, Mib]),
- MA = whereis(snmp_master_agent),
- ?DBG("start_subagent -> MA: ~p", [MA]),
- MibDir = get(mib_dir),
- Mib1 = join(MibDir,Mib),
- %% BMK BMK
-% case rpc:call(SaNode,snmp_supervisor,start_subagent,[MA,RegTree,[Mib1]]) of
- case rpc:call(SaNode, snmpa_supervisor,
- start_sub_agent, [MA, RegTree, [Mib1]]) of
- {ok, SA} ->
- ?DBG("start_subagent -> SA: ~p", [SA]),
- {ok, SA};
- Error ->
- ?FAIL({subagent_start_failed, SaNode, Error, [MA, RegTree, Mib1]})
- end.
-
-stop_subagent(SA) ->
- ?DBG("stop_subagent -> entry with"
- "~n SA: ~p", [SA]),
- %% BNK BMK
- %% rpc:call(node(SA), snmp_supervisor, stop_subagent, [SA]).
- rpc:call(node(SA), snmpa_supervisor, stop_sub_agent, [SA]).
-
-%%-----------------------------------------------------------------
-%% This function takes care of the old OTP-SNMPEA-MIB.
-%% Unfortunately, the testcases were written to use the data in the
-%% internal tables, and these table are now obsolete and not used
-%% by the agent. Therefore, we emulate them by using
-%% OLD-SNMPEA-MIB, which uses the default impl. of all tables.
-%%
-%% These two rows must exist in intCommunityTable
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
-%% (But with the manager's IP address)
-%%
-%%-----------------------------------------------------------------
-init_old() ->
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [6 | "public"],
- {get(mip), "public", 2, 2}),
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [13 | "standard trap"],
- {get(mip), "standard trap", 2, 1}),
- snmpa_local_db:variable_set(intAgentIpAddress, [127,0,0,1]).
-
-
-
-simple(suite) -> [];
-simple(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(simple_standard_test).
-
-simple_2(X) -> simple(X).
-
-simple_bi(suite) -> [];
-simple_bi(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(vsn, v1), % First, try v1 manager
- try_test(simple_standard_test),
-
- put(vsn, v2), % Then, try v2 manager
- try_test(simple_standard_test).
-
-simple_3(X) ->
- simple(X).
-
-big(suite) -> [];
-big(Config) when list(Config) ->
- ?DBG("big -> entry", []),
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?DBG("big -> SA: ~p", [SA]),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-big_2(X) -> big(X).
-
-big_3(X) -> big(X).
-
-
-big2(suite) -> [];
-big2(Config) when list(Config) ->
- %% This is exactly the same tests as 'big', but with the
- %% v2 equivalent of the mibs.
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1-v2"),
- ?line load_master("OLD-SNMPEA-MIB-v2"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB-v2").
-
-big2_2(X) -> big2(X).
-
-big2_3(X) -> big2(X).
-
-
-multi_threaded(suite) -> [];
-multi_threaded(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(multi_threaded_test),
- ?line unload_master("Test1").
-
-mt_trap(suite) -> [];
-mt_trap(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- ?line load_master("TestTrapv2"),
- try_test(mt_trap_test, [MA]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("Test1").
-
-v2_types(suite) -> [];
-v2_types(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(types_v2_test),
- ?line unload_master("Test1").
-
-v2_types_3(X) -> v2_types(X).
-
-
-implied(suite) -> [];
-implied(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(implied_test,[MA]),
- ?line unload_master("Test1").
-
-implied_3(X) -> implied(X).
-
-
-sparse_table(suite) -> [];
-sparse_table(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(sparse_table_test),
- ?line unload_master("Test1").
-
-sparse_table_2(X) -> sparse_table(X).
-
-sparse_table_3(X) -> sparse_table(X).
-
-cnt_64(suite) -> [];
-cnt_64(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(cnt_64_test, [MA]),
- ?line unload_master("Test1").
-
-cnt_64_2(X) -> cnt_64(X).
-
-cnt_64_3(X) -> cnt_64(X).
-
-opaque(suite) -> [];
-opaque(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(opaque_test),
- ?line unload_master("Test1").
-
-opaque_2(X) -> opaque(X).
-
-opaque_3(X) -> opaque(X).
-
-
-change_target_addr_config(suite) -> [];
-change_target_addr_config(Config) when list(Config) ->
- p("Testing changing target address config..."),
- ?LOG("change_target_addr_config -> entry",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(sname,snmp_suite),
- put(verbosity,trace),
-
- MA = whereis(snmp_master_agent),
-
- ?LOG("change_target_addr_config -> load TestTrap",[]),
- ?line load_master("TestTrap"),
-
- ?LOG("change_target_addr_config -> set trace verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,trace),
-
- %% First send some traps that will arive att the original manager
- ?LOG("change_target_addr_config -> send trap",[]),
- try_test(ma_trap1, [MA]),
-
- ?LOG("change_target_addr_config -> set silence verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,silence),
-
- %% Start new dummy listener
- ?LOG("change_target_addr_config -> start dummy manager",[]),
- ?line {ok,Pid,NewPort} = dummy_manager_start(MA),
-
- %% Reconfigure
- ?LOG("change_target_addr_config -> reconfigure",[]),
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_addr_conf(AgentDir, NewPort),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- %% Send the trap again
- ?LOG("change_target_addr_config -> send trap again",[]),
- catch dummy_manager_send_trap2(Pid),
-
- ?LOG("change_target_addr_config -> await trap ack",[]),
- catch dummy_manager_await_trap2_ack(),
-
- ?LOG("change_target_addr_config -> stop dummy manager",[]),
- ?line ok = dummy_manager_stop(Pid),
-
- ?LOG("change_target_addr_config -> reset target address config",[]),
- ?line reset_target_addr_conf(AgentDir),
-
- ?LOG("change_target_addr_config -> unload TestTrap",[]),
- ?line unload_master("TestTrap").
-
-
-dummy_manager_start(MA) ->
- ?DBG("dummy_manager_start -> entry",[]),
- Pid = spawn(get(mgr_node), ?MODULE,dummy_manager_init,[self(),MA]),
- ?DBG("dummy_manager_start -> Pid: ~p",[Pid]),
- await_dummy_manager_started(Pid).
-
-await_dummy_manager_started(Pid) ->
- receive
- {dummy_manager_started,Pid,Port} ->
- ?DBG("dummy_manager_start -> acknowledge received with"
- "~n Port: ~p",[Port]),
- {ok,Pid,Port};
- {'EXIT', Pid, Reason} ->
- {error, Pid, Reason};
- O ->
- ?LOG("dummy_manager_start -> received unknown message:"
- "~n ~p",[O]),
- await_dummy_manager_started(Pid)
- end.
-
-dummy_manager_stop(Pid) ->
- ?DBG("dummy_manager_stop -> entry with Pid: ~p",[Pid]),
- Pid ! stop,
- receive
- {dummy_manager_stopping, Pid} ->
- ?DBG("dummy_manager_stop -> acknowledge received",[]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_stop -> timeout",[]),
- timeout
- end.
-
-dummy_manager_send_trap2(Pid) ->
- ?DBG("dummy_manager_send_trap2 -> entry",[]),
- Pid ! {send_trap,testTrap2}.
-
-dummy_manager_await_trap2_ack() ->
- ?DBG("dummy_manager_await_trap2 -> entry",[]),
- receive
- {received_trap,Trap} ->
- ?LOG("dummy_manager_await_trap2 -> received trap: ~p",[Trap]),
- %% Note:
- %% Without this sleep the v2_inform_i testcase failes! There
- %% is no relation between these two test cases as far as I
- %% able to figure out...
- sleep(60000),
- ok;
- O ->
- ?ERR("dummy_manager_await_trap2 -> unexpected message: ~p",[O]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_await_trap2 -> timeout",[]),
- timeout
- end.
-
-dummy_manager_init(Parent,MA) ->
- ?DBG("dummy_manager_init -> entry with"
- "~n Parent: ~p"
- "~n MA: ~p",[Parent,MA]),
- {ok,S} = gen_udp:open(0,[{recbuf,65535}]),
- ?DBG("dummy_manager_init -> S: ~p",[S]),
- {ok,Port} = inet:port(S),
- ?DBG("dummy_manager_init -> Port: ~p",[Port]),
- Parent ! {dummy_manager_started,self(),Port},
- dummy_manager_loop(Parent,S,MA).
-
-dummy_manager_loop(P,S,MA) ->
- ?LOG("dummy_manager_loop -> ready for receive",[]),
- receive
- {send_trap,Trap} ->
- ?LOG("dummy_manager_loop -> received trap send request"
- "~n Trap: ~p",[Trap]),
- snmpa:send_trap(MA, Trap, "standard trap"),
- dummy_manager_loop(P,S,MA);
- {udp, _UdpId, Ip, UdpPort, Bytes} ->
- ?LOG("dummy_manager_loop -> received upd message"
- "~n from: ~p:~p"
- "~n size: ~p",
- [Ip, UdpPort, dummy_manager_message_sz(Bytes)]),
- R = dummy_manager_handle_message(Bytes),
- ?DBG("dummy_manager_loop -> R: ~p",[R]),
- P ! R,
- dummy_manager_loop(P,S,MA);
- stop ->
- ?DBG("dummy_manager_loop -> received stop request",[]),
- P ! {dummy_manager_stopping, self()},
- gen_udp:close(S),
- exit(normal);
- O ->
- ?LOG("dummy_manager_loop -> received unknown message:"
- "~n ~p",[O]),
- dummy_manager_loop(P,S,MA)
- end.
-
-dummy_manager_message_sz(B) when binary(B) ->
- size(B);
-dummy_manager_message_sz(L) when list(L) ->
- length(L);
-dummy_manager_message_sz(_) ->
- undefined.
-
-dummy_manager_handle_message(Bytes) ->
- case (catch snmp_pdus:dec_message(Bytes)) of
- {'EXIT',Reason} ->
- ?ERR("dummy_manager_handle_message -> "
- "failed decoding message only:~n ~p",[Reason]),
- {error,Reason};
- M ->
- ?DBG("dummy_manager_handle_message -> decoded message:"
- "~n ~p",[M]),
- {received_trap,M}
- end.
-
-
-api(suite) -> [];
-api(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(api_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-api_2(X) -> api(X).
-
-api_3(X) -> api(X).
-
-
-subagent(suite) -> [];
-subagent(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- try_test(load_test_sa),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
-
- p("Loading previous subagent mib in master and testing..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(load_test),
-
- p("Unloading previous subagent mib in master and testing..."),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(unreg_test),
- p("Testing register subagent..."),
- rpc:call(SaNode, snmp, register_subagent,
- [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- ?line stop_subagent(SA),
- try_test(unreg_test).
-
-subagent_2(X) -> subagent(X).
-
-subagent_3(X) -> subagent(X).
-
-
-mnesia(suite) -> [];
-mnesia(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent with mnesia impl..."),
- {ok, SA} = start_subagent(SaNode, ?klas2, "Klas2"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- try_test(big_test_2),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA).
-
-mnesia_2(X) -> mnesia(X).
-
-mnesia_3(X) -> mnesia(X).
-
-
-
-mul_cases() ->
-[mul_get, mul_get_err, mul_next, mul_next_err,
- mul_set_err].
-
-
-multiple_reqs_3(_X) ->
- {req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-
-
-mul_cases_2() ->
-[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
- mul_set_err_2].
-
-
-mul_cases_3() ->
- [mul_get_3, mul_get_err_3, mul_next_3, mul_next_err_3, mul_set_err_3].
-
-
-init_mul(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- [{mul_sub, SA} | Config].
-
-finish_mul(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- SA = ?config(mul_sub, Config),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA),
- lists:keydelete(mul_sub, 1, Config).
-
-mul_get(suite) -> [];
-mul_get(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get..."),
- try_test(do_mul_get).
-
-mul_get_2(X) -> mul_get(X).
-
-mul_get_3(X) -> mul_get(X).
-
-
-mul_get_err(suite) -> [];
-mul_get_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get with error..."),
- try_test(do_mul_get_err).
-
-mul_get_err_2(X) -> mul_get_err(X).
-
-mul_get_err_3(X) -> mul_get_err(X).
-
-
-mul_next(suite) -> [];
-mul_next(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next).
-
-mul_next_2(X) -> mul_next(X).
-
-mul_next_3(X) -> mul_next(X).
-
-
-mul_next_err(suite) -> [];
-mul_next_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next_err).
-
-mul_next_err_2(X) -> mul_next_err(X).
-
-mul_next_err_3(X) -> mul_next_err(X).
-
-
-mul_set(suite) -> [];
-mul_set(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set..."),
- try_test(do_mul_set).
-
-mul_set_2(X) -> mul_set(X).
-
-mul_set_3(X) -> mul_set(X).
-
-
-mul_set_err(suite) -> [];
-mul_set_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set with error..."),
- try_test(do_mul_set_err).
-
-mul_set_err_2(X) -> mul_set_err(X).
-
-mul_set_err_3(X) -> mul_set_err(X).
-
-
-sa_register(suite) -> [];
-sa_register(Config) when list(Config) ->
- ?DBG("sa_register -> entry", []),
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?DBG("sa_register -> start subagent", []),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
-
- ?DBG("sa_register -> unregister subagent", []),
- p("Testing unregister subagent (2)..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Loading SA-MIB..."),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:load_mibs(SA, [MibDir ++ "SA-MIB"]),
- ?DBG("sa_register -> register subagent", []),
- rpc:call(SaNode, snmp, register_subagent, [MA,?sa,SA]),
- try_test(sa_mib),
-
- ?DBG("sa_register -> stop subagent", []),
- ?line stop_subagent(SA).
-
-sa_register_2(X) -> sa_register(X).
-
-sa_register_3(X) -> sa_register(X).
-
-
-v1_trap(suite) -> [];
-v1_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_trap1, [MA]),
- try_test(ma_trap2, [MA]),
- try_test(ma_v2_2_v1_trap, [MA]),
- try_test(ma_v2_2_v1_trap2, [MA]),
-
- p("Testing trap sending from subagent..."),
- try_test(sa_trap1, [SA]),
- try_test(sa_trap2, [SA]),
- try_test(sa_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v2_trap(suite) -> [];
-v2_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
-
- try_test(ma_v2_trap1, [MA]),
- try_test(ma_v2_trap2, [MA]),
- try_test(ma_v1_2_v2_trap, [MA]),
- try_test(ma_v1_2_v2_trap2, [MA]),
-
- try_test(sa_mib),
- p("Testing trap sending from subagent..."),
- try_test(sa_v1_2_v2_trap1, [SA]),
- try_test(sa_v1_2_v2_trap2, [SA]),
- try_test(sa_v1_2_v2_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v3_trap(X) ->
- v2_trap(X).
-
-
-v3_inform(_X) ->
- %% v2_inform(X).
- {req, [], {conf, init_v3_inform, [v3_inform_i], finish_v3_inform}}.
-
-init_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-init_v3_inform(X) ->
- init_v2_inform(X).
-
-finish_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-finish_v3_inform(X) ->
- finish_v2_inform(X).
-
-
-
-v2_inform_i(suite) -> [];
-v2_inform_i(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing inform sending from master agent... NOTE! This test\ntakes a "
- "few minutes (5) to complete."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_v2_inform1, [MA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2").
-
-v3_inform_i(X) -> v2_inform_i(X).
-
-
-sa_error(suite) -> [];
-sa_error(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing sa bad value (is_set_ok)..."),
- try_test(sa_errs_bad_value),
-
- p("Testing sa gen err (set)..."),
- try_test(sa_errs_gen_err),
-
- p("Testing too big..."),
- try_test(sa_too_big),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- stop_subagent(SA).
-
-sa_error_2(X) -> sa_error(X).
-
-sa_error_3(X) -> sa_error(X).
-
-
-next_across_sa(suite) -> [];
-next_across_sa(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Loading another subagent mib..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas1"]),
-
- rpc:call(SaNode, snmp, register_subagent, [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- p("Testing next across subagent (endOfMibView from SA)..."),
- try_test(next_across_sa),
-
- p("Unloading mib"),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Starting another subagent"),
- ?line {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
- p("Testing next across subagent (wrong prefix from SA)..."),
- try_test(next_across_sa),
-
- stop_subagent(SA),
- stop_subagent(SA2).
-
-next_across_sa_2(X) -> next_across_sa(X).
-
-next_across_sa_3(X) -> next_across_sa(X).
-
-
-undo(suite) -> [];
-undo(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing undo phase at master agent..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas4"]),
- try_test(undo_test),
- try_test(api_test2),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas3"]),
-
- p("Testing bad return values from instrum. funcs..."),
- try_test(bad_return),
-
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas4"]),
-
- p("Testing undo phase at subagent..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas4"]),
- ?line ok = snmpa:register_subagent(MA, ?klas3, SA),
- ?line ok = snmpa:register_subagent(MA, ?klas4, SA),
- try_test(undo_test),
- try_test(api_test3),
-
- p("Testing undo phase across master/subagents..."),
- try_test(undo_test),
- try_test(api_test3),
- stop_subagent(SA).
-
-undo_2(X) -> undo(X).
-
-undo_3(X) -> undo(X).
-
-%% Req. Test2
-v1_processing(suite) -> [];
-v1_processing(Config) when list(Config) ->
- ?DBG("v1_processing -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v1_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v2_processing(suite) -> [];
-v2_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v3_processing(suite) -> [];
-v3_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc), % same as v2!
- ?line unload_master("Test2").
-
-
-%% We'll try get/set/trap and inform for all the auth & priv protocols.
-%% For informs, the mgr is auth-engine. The agent has to sync. This is
-%% accomplished by the first inform sent. That one will generate a
-%% report, which makes it in sync. The notification-generating
-%% application times out, and send again. This time it'll work.
-
-v3_crypto_basic(suite) -> [];
-v3_crypto_basic(_Config) ->
- EID = [0,0,0,0,0,0,0,0,0,0,0,2],
- %% From rfc2274 appendix A.3.1
- ?line KMd5_1 = snmp:passwd2localized_key(md5, "maplesyrup", EID),
- ?line [16#52,16#6f,16#5e,16#ed,16#9f,16#cc,16#e2,16#6f,
- 16#89,16#64,16#c2,16#93,16#07,16#87,16#d8,16#2b] =
- KMd5_1,
- %% From rfc2274 appendix A.3.2
- ?line KSHA_1 = snmp:passwd2localized_key(sha, "maplesyrup", EID),
- ?line [16#66,16#95,16#fe,16#bc,16#92,16#88,16#e3,16#62,16#82,16#23,
- 16#5f,16#c7,16#15,16#1f,16#12,16#84,16#97,16#b3,16#8f,16#3f] =
- KSHA_1,
- %% From rfc2274, appendix A.5.1
- ?line KMd5_2 = snmp:passwd2localized_key(md5, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#88,16#05,16#61,16#51,16#41,16#67,16#6c,16#c9,
- 16#19,16#61,16#74,16#e7,16#42,16#a3,16#25,16#51] =
- snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- %% From rfc2274, appendix A.5.2
- ?line KSHA_2 = snmp:passwd2localized_key(sha, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#9c,16#10,16#17,16#f4,
- 16#fd,16#48,16#3d,16#2d,16#e8,16#d5,16#fa,16#db,
- 16#f8,16#43,16#92,16#cb,16#06,16#45,16#70,16#51] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2, 20,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- KSHA_1t = lists:sublist(KSHA_1, 16),
- KSHA_2t = lists:sublist(KSHA_2, 16),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#7e,16#f8,16#d8,16#a4,16#c9,16#cd,16#b2,16#6b,
- 16#47,16#59,16#1c,16#d8,16#52,16#ff,16#88,16#b5] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1t, KSHA_2t, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
-
- %% Try with correct random
- ?line Kc1 = snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2),
- ?line KMd5_2 = snmp_user_based_sm_mib:extract_new_key(md5, KMd5_1, Kc1),
- ?line Kc2 = snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2),
- ?line KSHA_2 = snmp_user_based_sm_mib:extract_new_key(sha, KSHA_1, Kc2),
- ok.
-
-
-
-v3_md5_auth(suite) -> [];
-v3_md5_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing MD5 authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authMD5", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authMD5"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_sha_auth(suite) -> [];
-v3_sha_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing SHA authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authSHA", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authSHA"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_des_priv(suite) -> [];
-v3_des_priv(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing DES encryption...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "privDES", authPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-%% -define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-%% Make sure mgr is in sync with agent
-v3_sync(Funcs) ->
- ?DBG("v3_sync -> entry with Funcs: ~p",[Funcs]),
- g([[sysDescr, 0]]),
- expect(432, report, [{?usmStatsNotInTimeWindows_instance, any}]),
- g([[sysDescr, 0]]),
- expect(433, [{[sysDescr,0], any}]),
- lists:foreach(fun({Func, Args}) -> apply(?MODULE, Func, Args) end, Funcs).
-
-v3_inform_sync(MA) ->
- ?DBG("v3_sync -> entry with MA: ~p => Send notification",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver,
- "standard inform", []),
- %% Make sure agent is in sync with mgr...
- ?DBG("v3_sync -> wait some time: ",[]),
- sleep(20000), % more than 1500*10 in target_addr.conf
- ?DBG("v3_sync -> await response",[]),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]).
-
-
-v2_caps(suite) -> [];
-v2_caps(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(v2_caps_i, [node()]).
-
-v2_caps_3(X) -> v2_caps(X).
-
-
-v2_caps_i(Node) ->
- ?line Idx = rpc:call(Node, snmp, add_agent_caps, [[1,2,3,4,5], "test cap"]),
- g([[sysORID, Idx], [sysORDescr, Idx]]),
- ?line expect(1, [{[sysORID, Idx], [1,2,3,4,5]},
- {[sysORDescr, Idx], "test cap"}]),
- ?line rpc:call(Node, snmp, del_agent_caps, [Idx]),
- g([[sysORID, Idx]]),
- ?line expect(2, [{[sysORID, Idx], noSuchInstance}]).
-
-
-%% Req. Test2
-v1_proc() ->
- ?DBG("v1_proc -> entry", []),
- %% According to RFC1157.
- %% Template: <Section>:<list no>
- v1_get_p(),
- v1_get_next_p(),
- v1_set_p().
-
-
-v1_get_p() ->
- %% 4.1.2:1
- g([[test2]]),
- ?line expect(10, noSuchName, 1, [{[test2], 'NULL'}]),
- g([[tDescr]]),
- ?line expect(11, noSuchName, 1, [{[tDescr], 'NULL'}]),
- g([[tDescr2,0]]),
- ?line expect(12, noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
- g([[tDescr3,0]]),
- ?line expect(131, noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
- g([[tDescr4,0]]),
- ?line expect(132, noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(14, noSuchName, 2, [{[sysDescr, 0], 'NULL'},
- {[tDescr,0], 'NULL'}]),
- g([[sysDescr,3]]),
- ?line expect(15, noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
-
- %% 4.1.2:2
- g([[tTable]]),
- ?line expect(20, noSuchName, 1, [{[tTable], 'NULL'}]),
- g([[tEntry]]),
- ?line expect(21, noSuchName, 1, [{[tEntry], 'NULL'}]),
-
- %% 4.1.2:3
- g([[tTooBig, 0]]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.2:4
- g([[tGenErr1, 0]]),
- ?line expect(40, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(41, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(42, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]).
-
-
-v1_get_next_p() ->
- %% 4.1.3:1
- gn([[1,3,7,1]]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
- gn([[tDescr2]]),
- ?line expect(11, tooBig, 0, any),
-
- %% 4.1.3:2
- gn([[tTooBig]]),
- io:format("We currently don't handle tooBig correct!!!\n"),
-% ?line expect(20, tooBig, 0, [{[tTooBig], 'NULL'}]),
- ?line expect(20, tooBig, 0, any),
-
- %% 4.1.3:3
- gn([[tGenErr1]]),
-% ?line expect(40, genErr, 1, [{[tGenErr1], 'NULL'}]),
- ?line expect(40, genErr, 1, any),
- gn([[tGenErr2]]),
-% ?line expect(41, genErr, 1, [{[tGenErr2], 'NULL'}]),
- ?line expect(41, genErr, 1, any),
- gn([[sysDescr], [tGenErr3]]),
-% ?line expect(42, genErr, 2, [{[sysDescr], 'NULL'},
-% {[tGenErr3], 'NULL'}]).
- ?line expect(42, genErr, 2, any).
-
-v1_set_p() ->
- %% 4.1.5:1
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(12, noSuchName, 1, [{[tDescr3,0], "read-only"}]),
- s([{[tDescr3], s, "noSuchObject"}]),
- ?line expect(13, noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
- s([{[tDescr3,1], s, "noSuchInstance"}]),
- ?line expect(14, noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
- s([{[tDescr2,0], s, "inconsistentName"}]),
- ?line expect(15, noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
-
- %% 4.1.5:2
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(20, badValue, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(21, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.1.5:3
- %% The standard is quite incorrect here. The resp pdu was too big. In
- %% the resp pdu, we have the original vbs. In the tooBig pdu we still
- %% have to original vbs => the tooBig pdu is too big as well!!! It
- %% may not get it to the manager, unless the agent uses 'NULL' instead
- %% of the std-like original value.
- s([{[tTooBig, 0], s, ?tooBigStr}]),
- %% according to std:
-% ?line expect(30, tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.5:4
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(40, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
- s([{[tDescr2, 0], s, "commit_fail"}]),
- ?line expect(41, genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
-
-%% Req. Test2
-v2_proc() ->
- %% According to RFC1905.
- %% Template: <Section>:<list no>
- ?DBG("v2_proc -> entry",[]),
- v2_get_p(),
- v2_get_next_p(),
- v2_get_bulk_p(),
- v2_set_p().
-
-v2_get_p() ->
- %% 4.2.1:2
- ?DBG("v2_get_p -> entry",[]),
- g([[test2]]),
- ?line expect(10, [{[test2], noSuchObject}]),
- g([[tDescr]]),
- ?line expect(11, [{[tDescr], noSuchObject}]),
- g([[tDescr4,0]]),
- ?line expect(12, [{[tDescr4,0], noSuchObject}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"},
- {[tDescr,0], noSuchObject}]),
- g([[tTable]]),
- ?line expect(14, [{[tTable], noSuchObject}]),
- g([[tEntry]]),
- ?line expect(15, [{[tEntry], noSuchObject}]),
-
- %% 4.2.1:3
- g([[tDescr2,0]]), %% instrum ret noSuchName!!!
- ?line expect(20, [{[tDescr2,0], noSuchInstance}]),
- g([[tDescr3,0]]),
- ?line expect(21, [{[tDescr3,0], noSuchInstance}]),
- g([[sysDescr,3]]),
- ?line expect(22, [{[sysDescr, 3], noSuchInstance}]),
- g([[tIndex,1]]),
- ?line expect(23, [{[tIndex, 1], noSuchInstance}]),
-
- %% 4.2.1 - any other error: genErr
- g([[tGenErr1, 0]]),
- ?line expect(30, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(31, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(32, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]),
-
- %% 4.2.1 - tooBig
- g([[tTooBig, 0]]),
- ?line expect(40, tooBig, 0, []).
-
-
-v2_get_next_p() ->
- %% 4.2.2:2
- ?DBG("v2_get_next_p -> entry",[]),
- gn([[1,3,7,1]]),
- ?line expect(10, [{[1,3,7,1], endOfMibView}]),
- gn([[sysDescr], [1,3,7,1]]),
- ?line expect(11, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gn([[tCnt2, 1]]),
- ?line expect(12, [{[tCnt2,2], 100}]),
- gn([[tCnt2, 2]]),
- ?line expect(12, [{[tCnt2,2], endOfMibView}]),
-
- %% 4.2.2 - any other error: genErr
- gn([[tGenErr1]]),
- ?line expect(20, genErr, 1, [{[tGenErr1], 'NULL'}]),
- gn([[tGenErr2]]),
- ?line expect(21, genErr, 1, [{[tGenErr2], 'NULL'}]),
- gn([[sysDescr], [tGenErr3]]),
- ?line expect(22, genErr, 2, [{[sysDescr], 'NULL'},
- {[tGenErr3], 'NULL'}]),
-
- %% 4.2.2 - tooBig
- gn([[tTooBig]]),
- ?line expect(20, tooBig, 0, []).
-
-v2_get_bulk_p() ->
- %% 4.2.3
- ?DBG("v2_get_bulk_p -> entry",[]),
- gb(1, 1, []),
- ?line expect(10, []),
- gb(-1, 1, []),
- ?line expect(11, []),
- gb(-1, -1, []),
- ?line expect(12, []),
- gb(-1, -1, []),
- ?line expect(13, []),
- gb(2, 0, [[sysDescr], [1,3,7,1]]),
- ?line expect(14, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(1, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(15, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(0, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(16, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(2, 2, [[sysDescr], [1,3,7,1], [sysDescr], [1,3,7,1]]),
- ?line expect(17, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(1, 2, [[sysDescr], [sysDescr], [tTooBig]]),
- ?line expect(18, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[sysDescr, 0], "Erlang SNMP agent"}]),
-
- gb(1,12, [[tDescr2], [sysDescr]]), % next one after tDescr2 is tTooBig.
- ?line expect(19, []),
-
- gb(2,2, [[sysDescr], [sysObjectID], [tGenErr1], [sysDescr]]),
- ?line expect(20, genErr, 3, [{[sysDescr], 'NULL'},
- {[sysObjectID], 'NULL'},
- {[tGenErr1], 'NULL'},
- {[sysDescr], 'NULL'}]),
- gb(0, 2, [[tCnt2, 1]]),
- ?line expect(21, [{[tCnt2,2], 100},
- {[tCnt2,2], endOfMibView}]).
-
-
-v2_set_p() ->
- %% 4.2.5:1
- ?DBG("v2_set_p -> entry",[]),
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noAccess, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noAccess, 1, [{[tDescr,0], "outside mibview"}]),
-
- %% 4.2.5:2
- s([{[1,3,6,1,0], s, "noSuchObject"}]),
- ?line expect(20, notWritable, 1, [{[1,3,6,1,0], "noSuchObject"}]),
-
- %% 4.2.5:3
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(30, wrongType, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(31, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.2.5:4
- s([{[tStr, 0], s, ""}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], ""}]),
- s([{[tStr, 0], s, "12345"}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], "12345"}]),
-
- %% 4.2.5:5 - N/A
-
- %% 4.2.5:6
- s([{[tInt1, 0], i, 0}]),
- ?line expect(60, wrongValue, 1, [{[tInt1, 0], 0}]),
- s([{[tInt1, 0], i, 5}]),
- ?line expect(61, wrongValue, 1, [{[tInt1, 0], 5}]),
- s([{[tInt2, 0], i, 0}]),
- ?line expect(62, wrongValue, 1, [{[tInt2, 0], 0}]),
- s([{[tInt2, 0], i, 5}]),
- ?line expect(63, wrongValue, 1, [{[tInt2, 0], 5}]),
- s([{[tInt3, 0], i, 5}]),
- ?line expect(64, wrongValue, 1, [{[tInt3, 0], 5}]),
-
- %% 4.2.5:7
- s([{[tDescrX, 1, 1], s, "noCreation"}]),
- ?line expect(70, noCreation, 1, [{[tDescrX, 1, 1], "noCreation"}]),
-
- %% 4.2.5:8
- s([{[tDescrX, 1, 2], s, "inconsistentName"}]),
- ?line expect(80, inconsistentName, 1,
- [{[tDescrX, 1, 2], "inconsistentName"}]),
-
- %% 4.2.5:9
- s([{[tCnt, 1, 2], i, 5}]),
- ?line expect(90, notWritable, 1, [{[tCnt, 1, 2], 5}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(90, notWritable, 1, [{[tDescr3,0], "read-only"}]),
-
- %% 4.2.5:10
- s([{[tDescr2,0], s, "inconsistentValue"}]),
- ?line expect(100, inconsistentValue, 1,
- [{[tDescr2,0], "inconsistentValue"}]),
-
- %% 4.2.5:11
- s([{[tDescr2,0], s, "resourceUnavailable"}]),
- ?line expect(110, resourceUnavailable, 1,
- [{[tDescr2,0],"resourceUnavailable"}]),
-
- %% 4.2.5:12
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(120, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]).
-
- %% commitFailed and undoFailed is tested by the 'undo' case.
-
-
-%% Req. OLD-SNMPEA-MIB
-table_test() ->
- io:format("Testing simple get, next and set on communityTable...~n"),
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
- Key1c3 = [intCommunityViewIndex,get(mip),is("public")],
- Key2c3 = [intCommunityViewIndex,get(mip),is("standard trap")],
- Key1c4 = [intCommunityAccess,get(mip),is("public")],
- EndKey = [intCommunityEntry,[9],get(mip),is("public")],
- gn([[intCommunityEntry]]),
- ?line expect(7, [{Key1c3, 2}]),
- gn([[intCommunityTable]]),
- ?line expect(71, [{Key1c3, 2}]),
- gn([[community]]),
- ?line expect(72, [{Key1c3, 2}]),
- gn([[otpSnmpeaMIB]]),
- ?line expect(73, [{Key1c3, 2}]),
- gn([[ericsson]]),
- ?line expect(74, [{Key1c3, 2}]),
- gn([Key1c3]),
- ?line expect(8, [{Key2c3, 2}]),
- gn([Key2c3]),
- ?line expect(9, [{Key1c4, 2}]),
- gn([EndKey]),
- AgentIp = [intAgentIpAddress,0],
- ?line expect(10, [{AgentIp, any}]),
- g([Key1c3]),
- ?line expect(11, [{Key1c3, 2}]),
- g([EndKey]),
- ?line ?v1_2(expect(12, noSuchName, 1, any),
- expect(12, [{EndKey, noSuchObject}])),
-
- io:format("Testing row creation/deletion on communityTable...~n"),
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
- s([{NewKeyc5, ?createAndGo}]),
- ?line expect(14, ?v1_2(badValue, inconsistentValue), 1,any),
- s([{NewKeyc5, ?createAndGo}, {NewKeyc3, 2}, {NewKeyc4, 2}]),
- ?line expect(15, [{NewKeyc5, ?createAndGo},{NewKeyc3, 2}, {NewKeyc4, 2}]),
- g([NewKeyc4]),
- ?line expect(16, [{NewKeyc4, 2}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(17, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc4, 2}]),
- ?line expect(18, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc4, 2}]),
- s([{NewKeyc5, ?createAndWait}]),
- ?line expect(19, [{NewKeyc5, ?createAndWait}]),
- g([NewKeyc5]),
- ?line expect(20, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc4, 2}]),
- ?line expect(21, [{NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(22, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc3, 2}]),
- ?line expect(23, [{NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(24, [{NewKeyc5, ?notInService}]),
- s([{NewKeyc5, ?active}]),
- ?line expect(25, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(26, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc3, 3}]),
- ?line expect(27, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc3, 3}]),
- otp_1128().
-
-%% Req. system group
-simple_standard_test() ->
- ?DBG("simple_standard_test -> entry",[]),
- gn([[1,1]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3]]),
- ?line expect(11, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6]]),
- ?line expect(12, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1]]),
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2]]),
- ?line expect(14, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1]]),
- ?line expect(15, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1,1]]),
- ?line expect(16, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[sysDescr]]),
- ?line expect(17, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr,0]]),
- ?line expect(2, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr]]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{[sysDescr], noSuchObject}])),
- g([[1,6,7,0]]),
- ?line ?v1_2(expect(41, noSuchName, 1, any),
- expect(3, [{[1,6,7,0], noSuchObject}])),
- gn([[1,13]]),
- ?line ?v1_2(expect(4, noSuchName,1, any),
- expect(4, [{[1,13], endOfMibView}])),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
- g([[sysLocation, 0]]),
- ?line expect(6, [{[sysLocation, 0], "new_value"}]),
- io:format("Testing noSuchName and badValue...~n"),
- s([{[sysServices,0], 3}]),
- ?line expect(61, ?v1_2(noSuchName, notWritable), 1, any),
- s([{[sysLocation, 0], i, 3}]),
- ?line expect(62, ?v1_2(badValue, wrongType), 1, any),
- ?DBG("simple_standard_test -> done",[]),
- ok.
-
-%% This is run in the agent node
-db_notify_client(suite) -> [];
-db_notify_client(Config) when list(Config) ->
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("~n\tSaNode: ~p~n\tMgrNode: ~p~n\tMibDir: ~p",
- [SaNode,MgrNode,MibDir]),
- snmpa_local_db:register_notify_client(self(),?MODULE),
-
- %% This call (the manager) will issue to set operations, so
- %% we expect to receive to notify(insert) calls.
- try_test(db_notify_client_test),
-
- ?DBG("await first notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("first notify received",[]),ok
- end,
-
- ?DBG("await second notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("second notify received",[]),ok
- end,
-
- snmpa_local_db:unregister_notify_client(self()).
-
-
-%% This is run in the manager node
-db_notify_client_test() ->
- ?DBG("set first new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
-
- ?DBG("set second new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]).
-
-notify(Pid,What) ->
- ?DBG("notify(~p,~p) -> called",[Pid,What]),
- Pid ! {db_notify_test_reply,What}.
-
-
-%% Req: system group, OLD-SNMPEA-MIB, Klas1
-big_test() ->
- ?DBG("big_test -> testing simple next/get/set @ master agent...",[]),
- simple_standard_test(),
-
- ?DBG("big_test -> testing simple next/get/set @ subagent...",[]),
- gn([[klas1]]),
- ?line expect(1, [{[fname,0], ""}]),
- g([[fname,0]]),
- ?line expect(2, [{[fname,0], ""}]),
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[fname,0]]),
- ?line expect(4, [{[fname,0], "test set"}]),
-
- ?DBG("big_test -> "
- "testing next from last instance in master to subagent...",[]),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname,0], "test set"}]),
- s([{[fname,0], s, ""}]),
- ?line expect(52, [{[fname,0], ""}]),
-
- table_test(),
-
- ?DBG("big_test -> adding one row in subagent table",[]),
- _FTab = [friendsEntry],
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {[friendsEntry, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [friendsEntry, [3, 3]]]),
- ?line expect(7, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?active}]),
- s([{[friendsEntry, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry, [3, 3]], ?destroy}]),
-
- otp_1131(),
-
- ?DBG("big_test -> adding two rows in subagent table with special INDEX",
- []),
- s([{[kompissEntry, [1, 3]], s, "kompis3"},
- {[kompissEntry, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?createAndGo}]),
- g([[kompissEntry, [1, 3]],
- [kompissEntry, [2, 3]]]),
- ?line expect(10, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- gn([[kompissEntry, [1]],
- [kompissEntry, [2]]]),
- ?line expect(11, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- s([{[kompissEntry, [1, 2]], s, "kompis3"},
- {[kompissEntry, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry, [1, 1]],
- [kompissEntry, [2, 1]]]),
- ?line expect(13, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?active}]),
- s([{[kompissEntry, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry, [2, 3]], ?destroy}]),
- s([{[kompissEntry, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry, [2, 2]], ?destroy}]),
- ?DBG("big_test -> done",[]),
- ok.
-
-%% Req. system group, Klas2, OLD-SNMPEA-MIB
-big_test_2() ->
- p("Testing simple next/get/set @ master agent (2)..."),
- simple_standard_test(),
-
- p("Testing simple next/get/set @ subagent (2)..."),
- gn([[klas2]]),
- ?line expect(1, [{[fname2,0], ""}]),
- g([[fname2,0]]),
- ?line expect(2, [{[fname2,0], ""}]),
- s([{[fname2,0], s, "test set"}]),
- ?line expect(3, [{[fname2,0], "test set"}]),
- g([[fname2,0]]),
- ?line expect(4, [{[fname2,0], "test set"}]),
-
- otp_1298(),
-
- p("Testing next from last object in master to subagent (2)..."),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname2,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname2,0], "test set"}]),
-
- table_test(),
-
- p("Adding one row in subagent table (2)"),
- _FTab = [friendsEntry2],
- s([{[friendsEntry2, [2, 3]], s, "kompis3"},
- {[friendsEntry2, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?createAndGo}]),
- g([[friendsEntry2, [2, 3]],
- [friendsEntry2, [3, 3]]]),
- ?line expect(7, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?active}]),
- s([{[friendsEntry2, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry2, [3, 3]], ?destroy}]),
-
- p("Adding two rows in subagent table with special INDEX (2)"),
- s([{[kompissEntry2, [1, 3]], s, "kompis3"},
- {[kompissEntry2, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?createAndGo}]),
- g([[kompissEntry2, [1, 3]],
- [kompissEntry2, [2, 3]]]),
- ?line expect(10, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- gn([[kompissEntry2, [1]],
- [kompissEntry2, [2]]]),
- ?line expect(11, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- s([{[kompissEntry2, [1, 2]], s, "kompis3"},
- {[kompissEntry2, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry2, [1, 1]],
- [kompissEntry2, [2, 1]]]),
- ?line expect(13, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?active}]),
- s([{[kompissEntry2, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry2, [2, 3]], ?destroy}]),
- s([{[kompissEntry2, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry2, [2, 2]], ?destroy}]),
- ok.
-
-%% Req. Test1
-multi_threaded_test() ->
- p("Testing multi threaded agent..."),
- g([[multiStr,0]]),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(1, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "pelle"}]),
- ?line expect(2, [{[sysLocation, 0], "pelle"}]),
- Pid ! continue,
- ?line expect(3, [{[multiStr,0], "ok"}]),
-
- s([{[multiStr, 0], s, "block"}]),
- Pid2 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(4, [{[sysUpTime,0], any}]),
- g([[multiStr,0]]),
- Pid3 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(5, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "kalle"}]),
- Pid3 ! continue,
- ?line expect(6, [{[multiStr,0], "ok"}]),
- Pid2 ! continue,
- ?line expect(7, [{[multiStr,0], "block"}]),
- ?line expect(8, [{[sysLocation,0], "kalle"}]).
-
-%% Req. Test1, TestTrapv2
-mt_trap_test(MA) ->
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- snmpa:send_trap(MA, mtTrap, "standard trap"),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(2, [{[sysUpTime,0], any}]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- Pid ! continue,
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [2]},
- {[multiStr,0], "ok"}]).
-
-
-get_multi_pid() ->
- get_multi_pid(10).
-get_multi_pid(0) ->
- ?line ?FAIL(no_global_name);
-get_multi_pid(N) ->
- sleep(1000),
- case global:whereis_name(snmp_multi_tester) of
- Pid when pid(Pid) -> Pid;
- _ -> get_multi_pid(N-1)
- end.
-
-%% Req. Test1
-types_v2_test() ->
- p("Testing v2 types..."),
-
- s([{[bits1,0], 2#10}]),
- ?line expect(1, [{[bits1,0], ?str(2#10)}]),
- g([[bits1,0]]),
- ?line expect(2, [{[bits1,0], ?str(2#101)}]),
-
- s([{[bits2,0], 2#11000000110}]),
- ?line expect(3, [{[bits2,0], ?str(2#11000000110)}]),
- g([[bits2,0]]),
- ?line expect(4, [{[bits2,0], ?str(2#11000000110)}]),
-
- g([[bits3,0]]),
- ?line expect(50, genErr, 1, any),
-
- g([[bits4,0]]),
- ?line expect(51, genErr, 1, any),
-
- s([{[bits1,0], s, [2#10]}]),
- ?line expect(6, ?v1_2(badValue, wrongValue), 1, any),
-
- s([{[bits2,0], 2#11001001101010011}]),
- ?line expect(7, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%% Req. Test1
-implied_test(MA) ->
- ?LOG("implied_test -> start",[]),
- p("Testing IMPLIED..."),
-
- snmpa:verbosity(MA,trace),
- snmpa:verbosity(MA,trace),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = "apa",
- Idx2 = "qq",
- ?DBG("implied_test -> (send) create row 1 '~s' in table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?createAndGo}, {[testDescr, Idx1],s,"row 1"}]),
- ?line expect(1, [{[testStatus, Idx1], ?createAndGo},
- {[testDescr, Idx1], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?createAndGo}, {[testDescr, Idx2],s,"row 2"}]),
- ?line expect(2, [{[testStatus, Idx2], ?createAndGo},
- {[testDescr, Idx2], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr)",[]),
- gn([[testDescr]]),
- ?line expect(3, [{[testDescr,Idx1], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr) of row 1",[]),
- gn([[testDescr,Idx1]]),
- ?line expect(4, [{[testDescr,Idx2], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?destroy}]),
- ?line expect(5, [{[testStatus, Idx1], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?destroy}]),
- ?line expect(6, [{[testStatus, Idx2], ?destroy}]),
-
- %% Try the same in other table
- Idx3 = [1, "apa"],
- Idx4 = [1, "qq"],
- ?DBG("implied_test -> (send) create row 1 '~s' in table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?createAndGo}, {[testDescr2,Idx3],s,"row 1"}]),
- ?line expect(1, [{[testStatus2, Idx3], ?createAndGo},
- {[testDescr2, Idx3], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?createAndGo}, {[testDescr2,Idx4],s,"row 2"}]),
- ?line expect(2, [{[testStatus2, Idx4], ?createAndGo},
- {[testDescr2, Idx4], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr2)",[]),
- gn([[testDescr2]]),
- ?line expect(3, [{[testDescr2,Idx3], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr2) of row 1",[]),
- gn([[testDescr2,Idx3]]),
- ?line expect(4, [{[testDescr2,Idx4], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?destroy}]),
- ?line expect(5, [{[testStatus2, Idx3], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?destroy}]),
- ?line expect(6, [{[testStatus2, Idx4], ?destroy}]),
-
- snmpa:verbosity(MA,log),
-
- ?LOG("implied_test -> done",[]).
-
-
-
-%% Req. Test1
-sparse_table_test() ->
- p("Testing sparse table..."),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- s([{[sparseStatus, Idx1], i, ?createAndGo},
- {[sparseDescr, Idx1], s, "row 1"}]),
- ?line expect(1, [{[sparseStatus, Idx1], ?createAndGo},
- {[sparseDescr, Idx1], "row 1"}]),
- s([{[sparseStatus, Idx2], i, ?createAndGo},
- {[sparseDescr, Idx2], s, "row 2"}]),
- ?line expect(2, [{[sparseStatus, Idx2], ?createAndGo},
- {[sparseDescr, Idx2], "row 2"}]),
- ?v1_2(gn([[sparseIndex], [sparseDescr,Idx1], [sparseDescr,Idx2],
- [sparseStatus,Idx1], [sparseStatus,Idx2]]),
- gb(0,5,[[sparseIndex]])),
- ?line expect(3, [{[sparseDescr,Idx1], "row 1"},
- {[sparseDescr,Idx2], "row 2"},
- {[sparseStatus,Idx1], ?active},
- {[sparseStatus,Idx2], ?active},
- {[sparseStr,0], "slut"}]),
- % Delete the rows
- s([{[sparseStatus, Idx1], i, ?destroy}]),
- ?line expect(4, [{[sparseStatus, Idx1], ?destroy}]),
- s([{[sparseStatus, Idx2], i, ?destroy}]),
- ?line expect(5, [{[sparseStatus, Idx2], ?destroy}]).
-
-
-%% Req. Test1
-cnt_64_test(MA) ->
- ?LOG("start cnt64 test (~p)",[MA]),
- snmpa:verbosity(MA,trace),
- ?LOG("start cnt64 test",[]),
- p("Testing Counter64, and at the same time, RowStatus is not last column"),
-
- ?DBG("get cnt64",[]),
- g([[cnt64,0]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(1, noSuchName, 1, any),
- expect(1, [{[cnt64,0],18446744073709551615}])),
- ?DBG("get-next cnt64",[]),
- gn([[cnt64]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(2, [{[cnt64Str,0], "after cnt64"}]),
- expect(2, [{[cnt64,0],18446744073709551615}])),
- ?DBG("send cntTrap",[]),
- snmpa:send_trap(MA,cntTrap,"standard trap",[{sysContact,"pelle"},
- {cnt64, 10},
- {sysLocation, "here"}]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, trap, [test], 6, 1, [{[sysContact,0], "pelle"},
- {[sysLocation,0], "here"}]),
- expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [1]},
- {[sysContact,0], "pelle"},
- {[cnt64,0], 10},
- {[sysLocation,0], "here"}])),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- ?DBG("create row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(1, [{[cntStatus, Idx1], ?createAndGo}]),
- ?DBG("create row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(2, [{[cntStatus, Idx2], ?createAndGo}]),
-
- ?DBG("get-next (cntIndex)",[]),
- gn([[cntIndex]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, [{[cntStatus,Idx1], ?active}]),
- expect(3, [{[cntCnt,Idx1], 0}])),
- % Delete the rows
- ?DBG("delete row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(4, [{[cntStatus, Idx1], ?destroy}]),
- ?DBG("delete row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(5, [{[cntStatus, Idx2], ?destroy}]),
- catch snmpa:verbosity(MA,log),
- ?DBG("done",[]),
- ok.
-
-%% Req. Test1
-opaque_test() ->
- p("Testing Opaque datatype..."),
- g([[opaqueObj,0]]),
- ?line expect(1, [{[opaqueObj,0], "opaque-data"}]).
-
-%% Req. OLD-SNMPEA-MIB
-api_test(MaNode) ->
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [intAgentIpAddress]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp,
- oid_to_name, [OID]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [[1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int, [intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp,
- int_to_enum, ['RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['xxRowStatus', 1]),
- ?line case snmp:date_and_time() of
- List when list(List), length(List) == 8 -> ok;
- List when list(List), length(List) == 11 -> ok
- end.
-
-%% Req. Klas3
-api_test2() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]),
- g([[fname4,0]]),
- ?line expect(2, [{[fname4,0], 1}]).
-
-api_test3() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]).
-
-
-unreg_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[snmpInPkts, 0], any}]).
-
-load_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[fname,0], ""}]).
-
-%% Req. Klas1
-load_test_sa() ->
- gn([[?v1_2(sysServices,sysORLastChange), 0]]),
- ?line expect(1, [{[fname,0], any}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_get() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0], Key1c4, [fname,0],Key1c3,
- [sysName,0]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,0], "test"}]),
- g([[1,3,7,1], Key1c4, [sysDescr,0], [1,3,7,2], Key1c3, [sysDescr,0]]),
- ?line ?v1_2(expect(2, noSuchName, [1,4], any),
- expect(2, [{[1,3,7,1], noSuchObject},
- {Key1c4, 2},
- {[sysDescr,0], "Erlang SNMP agent"},
- {[1,3,7,2], noSuchObject},
- {Key1c3, 2},
- {[sysDescr,0], "Erlang SNMP agent"}])).
-
-%% Req. v1, system group, Klas1, OLD-SNMPEA-MIB, *ej* Klas3.
-do_mul_get_err() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0],Key1c4,[fname,0], Key1c3, [sysName,2]]),
- ?line ?v1_2(expect(1, noSuchName, 5, any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,2], noSuchInstance}])),
- g([[sysDescr,0],Key1c4,[fname3,0], Key1c3, [sysName,1]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname3,0], noSuchObject},
- {Key1c3, 2},
- {[sysName,1], noSuchInstance}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [fname],Key1c3s,[sysName]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2}, {[fname,0], "test set"},
- {Key1c3, 2}, {[sysName,0], "test"}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next_err() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [1,3,6,999], [fname],[1,3,90], Key1c3s,[sysName]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[1,3,6,999], endOfMibView},
- {[fname,0], "test set"},
- {[1,3,90], endOfMibView},
- {Key1c3, 2},
- {[sysName,0], "test"}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set() ->
- p("Adding one row in subagent table, and one in master table"),
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, [{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [sysLocation,0],
- [friendsEntry, [3, 3]]]),
- ?line expect(2, [{[friendsEntry, [2, 3]], "kompis3"},
- {[sysLocation,0], "new_value"},
- {[friendsEntry, [3, 3]], ?active}]),
- g([NewKeyc4]),
- ?line expect(3, [{NewKeyc4, 2}]),
- s([{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]),
- ?line expect(4, [{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- p("Adding one row in subagent table, and one in master table"),
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {NewKeyc3, 2},
- {[sysUpTime,0], 45}, % sysUpTime (readOnly)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, notWritable), 3, any),
- g([[friendsEntry, [2, 3]]]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{[friendsEntry, [2,3]], noSuchInstance}])),
- g([NewKeyc4]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB
-sa_mib() ->
- g([[sa, [2,0]]]),
- ?line expect(1, [{[sa, [2,0]], 3}]),
- s([{[sa, [1,0]], s, "sa_test"}]),
- ?line expect(2, [{[sa, [1,0]], "sa_test"}]).
-
-ma_trap1(MA) ->
- snmpa:send_trap(MA, testTrap2, "standard trap"),
- ?line expect(1, trap, [system], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]),
- snmpa:send_trap(MA, testTrap1, "standard trap"),
- ?line expect(2, trap, [1,2,3] , 1, 0, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]).
-
-ma_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap2(MA) ->
- snmpa:send_trap(MA,linkUp,"standard trap",[{ifIndex, [1], 1},
- {ifAdminStatus, [1], 1},
- {ifOperStatus, [1], 2}]),
- ?line expect(3, trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
- {[ifAdminStatus, 1], 1},
- {[ifOperStatus, 1], 2}]).
-
-sa_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(5, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "pelle"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(6, trap, [ericsson], 6, 2, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]}]).
-
-ma_v2_trap1(MA) ->
- ?DBG("ma_v2_traps -> entry with MA = ~p => "
- "send standard trap: testTrapv22",[MA]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_traps -> send standard trap: testTrapv21",[]),
- snmpa:send_trap(MA, testTrapv21, "standard trap"),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmp ++ [1]}]).
-
-ma_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"}]).
-
-%% Note: This test case takes a while... actually a couple of minutes.
-ma_v2_inform1(MA) ->
- ?DBG("ma_v2_inform -> entry with MA = ~p => "
- "send notification: testTrapv22",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver, "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag1, self()},
- "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag1, [_]} ->
- ok;
- {snmp_targets, tag1, Addrs1} ->
- ?line ?FAIL({bad_addrs, Addrs1})
- after
- 5000 ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag1, {got_response, _}} ->
- ok;
- {snmp_notification, tag1, {no_response, _}} ->
- ?line ?FAIL(no_response)
- after
- 20000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
-
- %%
- %% -- The rest is possibly erroneous...
- %%
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag2, self()},
- "standard inform", []),
- ?line expect(2, {inform, false},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag2, [_]} ->
- ok;
- {snmp_targets, tag2, Addrs2} ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag2) timeout",[]),
- ?line ?FAIL({bad_addrs, Addrs2})
- after
- 5000 ->
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag2, {got_response, _}} ->
- ?line ?FAIL(got_response);
- {snmp_notification, tag2, {no_response, _}} ->
- ok
- after
- 240000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag2) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end.
-
-
-ma_v1_2_v2_trap(MA) ->
- snmpa:send_trap(MA,linkDown,"standard trap",[{ifIndex, [1], 1}]),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmpTraps ++ [3]},
- {[ifIndex, 1], 1},
- {[snmpTrapEnterprise, 0], [1,2,3]}]).
-
-
-ma_v1_2_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"},
- {[snmpTrapEnterprise, 0], ?system}]).
-
-
-sa_v1_2_v2_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-sa_v1_2_v2_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]], "pelle"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-sa_v1_2_v2_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 2]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_bad_value() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 5}, % badValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, badValue, 2, any),
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 6}, % wrongValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, ?v1_2(badValue, wrongValue), 2, any),
- g([NewKeyc4]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_gen_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},{NewKeyc4, 2},
- {NewKeyc5, ?createAndGo}, {[sa, [3,0]], 5}]),
- ?line expect(1, genErr, 4, any),
-% The row might have been added; we don't know.
-% (as a matter of fact we do - it is added, because the agent
-% first sets its own vars, and then th SAs. Lets destroy it.
- s([{NewKeyc5, ?destroy}]),
- ?line expect(2, [{NewKeyc5, ?destroy}]).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_too_big() ->
- g([[sa, [4,0]]]),
- ?line expect(1, tooBig).
-
-%% Req. Klas1, system group, snmp group (v1/v2)
-next_across_sa() ->
- gn([[sysDescr],[klas1,5]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {[snmpInPkts, 0], any}]).
-
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]). -> noError
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]). -> {badValue, 2}
-%% snmp_test_mgr:s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]). -> {genErr, 2}
-%% Req. Klas3, Klas4
-undo_test() ->
- s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- ?line expect(1, [{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]),
- ?line expect(2, ?v1_2(badValue, inconsistentValue), 2, any),
- s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]),
- ?line expect(3, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]),
- ?line expect(4, ?v1_2(genErr, commitFailed), 1, any),
-% unfortunatly we don't know if we'll get undoFailed or commitFailed.
-% it depends on which order the agent traverses the varbind list.
-% s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]),
-% ?line expect(5, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]),
- ?line expect(6, genErr, 2, any).
-
-%% Req. Klas3, Klas4
-bad_return() ->
- g([[fStatus4,4],
- [fName4,4]]),
- ?line expect(4, genErr, 2, any),
- g([[fStatus4,5],
- [fName4,5]]),
- ?line expect(5, genErr, 1, any),
- g([[fStatus4,6],
- [fName4,6]]),
- ?line expect(6, genErr, 2, any),
- gn([[fStatus4,7],
- [fName4,7]]),
- ?line expect(7, genErr, 2, any),
- gn([[fStatus4,8],
- [fName4,8]]),
- ?line expect(8, genErr, 1, any),
- gn([[fStatus4,9],
- [fName4,9]]),
- ?line expect(9, genErr, 2, any).
-
-
-%%%-----------------------------------------------------------------
-%%% Test the implementation of standard mibs.
-%%% We should *at least* try to GET all variables, just to make
-%%% sure the instrumentation functions work.
-%%% Note that many of the functions in the standard mib is
-%%% already tested by the normal tests.
-%%%-----------------------------------------------------------------
-
-
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v1.
-%% o Test the counters and control objects in SNMP-STANDARD-MIB
-%%-----------------------------------------------------------------
-snmp_standard_mib(suite) -> [];
-snmp_standard_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?DBG("snmp_standard_mib -> std_mib_init", []),
- try_test(std_mib_init),
-
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- InBadVsns = try_test(std_mib_a),
- put(vsn, v2),
- ?DBG("snmp_standard_mib -> std_mib_read", []),
- try_test(std_mib_read),
- put(vsn, v1),
-
- ?DBG("snmp_standard_mib -> std_mib_b (~w)", [InBadVsns]),
- Bad = try_test(std_mib_b, [InBadVsns]),
- ?DBG("snmp_standard_mib -> std_mib_read (community: 'bad community')", []),
- try_test(std_mib_read, [], [{community, "bad community"}]),
- ?DBG("snmp_standard_mib -> std_mib_write (community: 'public')", []),
- try_test(std_mib_write, [], [{community, "public"}]),
- ?DBG("snmp_standard_mib -> std_mib_asn_err", []),
- try_test(std_mib_asn_err),
- ?DBG("snmp_standard_mib -> std_mib_c (~w)", [Bad]),
- try_test(std_mib_c, [Bad]),
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- try_test(standard_mib_a),
-
- ?DBG("snmp_standard_mib -> std_mib_finish", []),
- try_test(std_mib_finish),
- ?DBG("snmp_standard_mib -> std_mib_test_finish", []),
- try_test(standard_mib_test_finish, [], [{community, "bad community"}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_a() ->
- ?line [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
- ?line [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
- ?line OutPkts2 = OutPkts + 1,
- %% There are some more counters we could test here, but it's not that
- %% important, since they are removed from SNMPv2-MIB.
- ok.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_init() ->
- %% disable authentication failure traps. (otherwise w'd get many of
- %% them - this is also a test to see that it works).
- s([{[snmpEnableAuthenTraps,0], 2}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 2}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_finish() ->
- %% enable again
- s([{[snmpEnableAuthenTraps,0], 1}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 1}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_test_finish() ->
- %% force a authenticationFailure
- std_mib_write(),
- %% check that we got a trap
- ?line expect(2, trap, [1,2,3], 4, 0, []).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_read() ->
- ?DBG("std_mib_read -> entry", []),
- g([[sysUpTime,0]]), % try a bad <something>; msg dropped, no reply
- ?DBG("std_mib_read -> await timeout (i.e. no reply)", []),
- ?line expect(1, timeout). % make sure we don't get a trap!
-
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_write() ->
- ?DBG("std_mib_write -> entry", []),
- s([{[sysLocation, 0], "new_value"}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_asn_err() ->
- snmp_test_mgr:send_bytes([48,99,67,12,0,0,0,0,0,0,5]).
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v2 and v3.
-%% o Test the counters and control objects in SNMPv2-MIB
-%%-----------------------------------------------------------------
-snmpv2_mib_2(suite) -> [];
-snmpv2_mib_2(Config) when list(Config) ->
- ?LOG("snmpv2_mib_2 -> start",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?DBG("snmpv2_mib_2 -> standard mib init",[]),
- try_test(std_mib_init),
-
- ?DBG("snmpv2_mib_2 -> get number of (so far) bad versions",[]),
- InBadVsns = try_test(std_mib_a),
-
- ?DBG("snmpv2_mib_2 -> make a bad version read",[]),
- put(vsn, v1),
- try_test(std_mib_read),
-
- ?DBG("snmpv2_mib_2 -> bad version read",[]),
- put(vsn, v2),
- Bad = try_test(std_mib_b, [InBadVsns]),
-
- ?DBG("snmpv2_mib_2 -> read with bad community",[]),
- try_test(std_mib_read, [], [{community, "bad community"}]),
-
- ?DBG("snmpv2_mib_2 -> write with public community",[]),
- try_test(std_mib_write, [], [{community, "public"}]),
-
- ?DBG("snmpv2_mib_2 -> asn err",[]),
- try_test(std_mib_asn_err),
-
- ?DBG("snmpv2_mib_2 -> check counters",[]),
- try_test(std_mib_c, [Bad]),
-
- ?DBG("snmpv2_mib_2 -> get som counters",[]),
- try_test(snmpv2_mib_a),
-
- ?DBG("snmpv2_mib_2 -> enable auth traps, and await some",[]),
- try_test(std_mib_finish),
-
- ?DBG("snmpv2_mib_2 -> force auth failure, and await trap, "
- "then disable auth traps",[]),
- try_test(snmpv2_mib_test_finish, [], [{community, "bad community"}]),
-
- ?LOG("snmpv2_mib_2 -> done",[]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_3(suite) -> [];
-snmpv2_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- InBadVsns = try_test(std_mib_a),
- put(vsn, v1),
- try_test(std_mib_read),
- put(vsn, v3),
- _Bad = try_test(std_mib_b, [InBadVsns]),
- try_test(snmpv2_mib_a),
-
- try_test(std_mib_finish).
-
--define(authenticationFailure, [1,3,6,1,6,3,1,1,5,5]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_test_finish() ->
- %% force a authenticationFailure
- ?DBG("ma_v2_inform -> write to std mib",[]),
- std_mib_write(),
-
- %% check that we got a trap
- ?DBG("ma_v2_inform -> await trap",[]),
- ?line expect(2, v2trap, [{[sysUpTime,0], any},
- {[snmpTrapOID,0], ?authenticationFailure}]),
-
- %% and the the inform
- ?DBG("ma_v2_inform -> await inform",[]),
- ?line expect(2, {inform,true}, [{[sysUpTime,0], any},
- {[snmpTrapOID,0],?authenticationFailure}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_a() ->
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
-
- ?line [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
- InBadVsns.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_b(InBadVsns) ->
- ?line [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
- ?line InBadVsns2 = InBadVsns + 1,
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
- ?line [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
- get_req(4, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- {InBadCommunityNames, InBadCommunityUses, InASNErrs}.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_c({InBadCommunityNames, InBadCommunityUses, InASNErrs}) ->
- ?line [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
- get_req(1, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- ?line InBadCommunityNames2 = InBadCommunityNames + 1,
- ?line InBadCommunityUses2 = InBadCommunityUses + 1,
- ?line InASNErrs2 = InASNErrs + 1.
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_a() ->
- ?line [SetSerial] = get_req(2, [[snmpSetSerialNo,0]]),
- s([{[snmpSetSerialNo,0], SetSerial}, {[sysLocation, 0], "val2"}]),
- ?line expect(3, [{[snmpSetSerialNo,0], SetSerial},
- {[sysLocation, 0], "val2"}]),
- s([{[sysLocation, 0], "val3"}, {[snmpSetSerialNo,0], SetSerial}]),
- ?line expect(4, inconsistentValue, 2,
- [{[sysLocation, 0], "val3"},
- {[snmpSetSerialNo,0], SetSerial}]),
- ?line ["val2"] = get_req(5, [[sysLocation,0]]).
-
-
-%%-----------------------------------------------------------------
-%% o Bad community uses/name is tested already
-%% in SNMPv2-MIB and STANDARD-MIB.
-%% o Test add/deletion of rows.
-%%-----------------------------------------------------------------
-snmp_community_mib(suite) -> [];
-snmp_community_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- try_test(snmp_community_mib),
- ?line unload_master("SNMP-COMMUNITY-MIB").
-
-snmp_community_mib_2(X) -> snmp_community_mib(X).
-
-%% Req. SNMP-COMMUNITY-MIB
-snmp_community_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o Test engine boots / time
-%%-----------------------------------------------------------------
-snmp_framework_mib(suite) -> [];
-snmp_framework_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- try_test(snmp_framework_mib),
- ?line unload_master("SNMP-FRAMEWORK-MIB").
-
-snmp_framework_mib_2(X) -> snmp_framework_mib(X).
-
-snmp_framework_mib_3(suite) -> [];
-snmp_framework_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(snmp_framework_mib).
-
-
-%% Req. SNMP-FRAMEWORK-MIB
-snmp_framework_mib() ->
- ?line ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
- ?line [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
- sleep(5000),
- ?line [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
- if
- EngineTime+7 < EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- EngineTime+4 > EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- true -> ok
- end,
- ?line case get_req(4, [[snmpEngineBoots,0]]) of
- [Boots] when integer(Boots) -> ok;
- Else -> ?FAIL(Else)
- end,
- ok.
-
-%%-----------------------------------------------------------------
-%% o Test the counters
-%%-----------------------------------------------------------------
-snmp_mpd_mib_3(suite) -> [];
-snmp_mpd_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- UnknownPDUHs = try_test(snmp_mpd_mib_a),
- try_test(snmp_mpd_mib_b, [], [{context_engine_id, "bad engine"}]),
- try_test(snmp_mpd_mib_c, [UnknownPDUHs]).
-
-
-%% Req. SNMP-MPD-MIB
-snmp_mpd_mib_a() ->
- ?line [UnknownSecs, InvalidMsgs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0]]),
- Pdu = #pdu{type = 'get-request',
- request_id = 23,
- error_status = noError,
- error_index = 0,
- varbinds = []},
- SPdu = #scopedPdu{contextEngineID = "agentEngine",
- contextName = "",
- data = Pdu},
- ?line SPDUBytes = snmp_pdus:enc_scoped_pdu(SPdu),
- V3Hdr1 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [7],
- msgSecurityModel = 23, % bad sec model
- msgSecurityParameters = []},
- V3Hdr2 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [6], % bad flag combination
- msgSecurityModel = 3,
- msgSecurityParameters = []},
- Message1 = #message{version = 'version-3', vsn_hdr = V3Hdr1,
- data = SPDUBytes},
- Message2 = #message{version = 'version-3', vsn_hdr = V3Hdr2,
- data = SPDUBytes},
- ?line MsgBytes1 = snmp_pdus:enc_message_only(Message1),
- ?line MsgBytes2 = snmp_pdus:enc_message_only(Message2),
- snmp_test_mgr:send_bytes(MsgBytes1),
- snmp_test_mgr:send_bytes(MsgBytes2),
-
- ?line [UnknownSecs2, InvalidMsgs2, UnknownPDUHs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0],
- [snmpUnknownPDUHandlers, 0]]),
- ?line UnknownSecs2 = UnknownSecs + 1,
- ?line InvalidMsgs2 = InvalidMsgs + 1,
- UnknownPDUHs.
-
--define(snmpUnknownPDUHandlers_instance, [1,3,6,1,6,3,11,2,1,3,0]).
-snmp_mpd_mib_b() ->
- g([[sysUpTime,0]]),
- ?line expect(1, report, [{?snmpUnknownPDUHandlers_instance, any}]).
-
-
-snmp_mpd_mib_c(UnknownPDUHs) ->
- ?line [UnknownPDUHs2] = get_req(1, [[snmpUnknownPDUHandlers, 0]]),
- ?line UnknownPDUHs2 = UnknownPDUHs + 1.
-
-
-snmp_target_mib(suite) -> [];
-snmp_target_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-TARGET-MIB"),
- try_test(snmp_target_mib),
- ?line unload_master("SNMP-TARGET-MIB").
-
-snmp_target_mib_2(X) -> snmp_target_mib(X).
-
-snmp_target_mib_3(X) -> snmp_target_mib(X).
-
-snmp_target_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-snmp_notification_mib(suite) -> [];
-snmp_notification_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- try_test(snmp_notification_mib),
- ?line unload_master("SNMP-NOTIFICATION-MIB").
-
-snmp_notification_mib_2(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib_3(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o add/delete views and try them
-%% o try boundaries
-%%-----------------------------------------------------------------
-snmp_view_based_acm_mib(suite) -> [];
-snmp_view_based_acm_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master("Test2"),
- snmp_view_based_acm_mib(),
- ?line unload_master("Test2"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-snmp_view_based_acm_mib_2(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib_3(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib() ->
- snmpa:verbosity(net_if,trace),
- snmpa:verbosity(master_agent,trace),
- ?LOG("start snmp_view_based_acm_mib test",[]),
- %% The user "no-rights" is present in USM, and is mapped to security
- %% name 'no-rights", which is not present in VACM.
- %% So, we'll add rights for it, try them and delete them.
- %% We'll give "no-rights" write access to tDescr.0 and read access
- %% to tDescr2.0
- %% These are the options we'll use to the mgr
- Opts = [{user, "no-rights"}, {community, "no-rights"}],
- %% Find the valid secmodel, and one invalid secmodel.
- {SecMod, InvSecMod} =
- case get(vsn) of
- v1 -> {?SEC_V1, ?SEC_V2C};
- v2 -> {?SEC_V2C, ?SEC_USM};
- v3 -> {?SEC_USM, ?SEC_V1}
- end,
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Now, add a mapping from "no-rights" -> "no-rights-group"
- GRow1Status = [vacmSecurityToGroupStatus,[SecMod, 9,"no-rights"]],
- GRow1 =
- [{[vacmGroupName, [SecMod, 9,"no-rights"]], "no-rights-group"},
- {GRow1Status, ?createAndGo}],
- ?DBG("set '~p'",[GRow1]),
- ?line try_test(do_set, [GRow1]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create a mapping for another sec model, and make sure it dosn't
- %% give us access
- GRow2Status = [vacmSecurityToGroupStatus,[InvSecMod, 9,"no-rights"]],
- GRow2 = [{[vacmGroupName, [InvSecMod, 9, "no-rights"]], "initial"},
- {GRow2Status, ?createAndGo}],
-
- ?DBG("set '~p'",[GRow2]),
- ?line try_test(do_set, [GRow2]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [GRow2Status]),
-
- RVName = "rv_name",
- WVName = "wv_name",
-
- %% Access row
- ARow1Idx = [15 | "no-rights-group"] ++ [0, ?SEC_ANY, 1],
- ARow1Status = [vacmAccessStatus, ARow1Idx],
- ARow1 = [{[vacmAccessContextMatch, ARow1Idx], 1},
- {[vacmAccessReadViewName, ARow1Idx], RVName},
- {[vacmAccessWriteViewName, ARow1Idx], WVName},
- {ARow1Status, ?createAndGo}],
-
- %% This access row would give acces, if InvSecMod was valid.
- ARow2Idx = [15 | "no-rights-group"] ++ [0, InvSecMod, 1],
- ARow2Status = [vacmAccessStatus, ARow2Idx],
- ARow2 = [{[vacmAccessContextMatch, ARow2Idx], 1},
- {[vacmAccessReadViewName, ARow2Idx], "internet"},
- {[vacmAccessWriteViewName, ARow2Idx], "internet"},
- {ARow2Status, ?createAndGo}],
-
- ?line try_test(do_set, [ARow2]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [ARow2Status]),
-
-
- %% Add valid row
- ?line try_test(do_set, [ARow1]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create the view family
- VRow1Idx = mk_ln(RVName) ++ mk_ln(?xDescr), % object access
- VRow2Idx = mk_ln(RVName) ++ mk_ln(?xDescr2 ++ [0]), % instance access
- VRow3Idx = mk_ln(WVName) ++ mk_ln(?xDescr), % object access
- VRow4Idx = mk_ln(WVName) ++ mk_ln(?xDescr ++ [0]), % instance access
- VRow1Status = [vacmViewTreeFamilyStatus, VRow1Idx],
- VRow2Status = [vacmViewTreeFamilyStatus, VRow2Idx],
- VRow3Status = [vacmViewTreeFamilyStatus, VRow3Idx],
- VRow4Status = [vacmViewTreeFamilyStatus, VRow4Idx],
-
- ?line try_test(add_row, [VRow1Status]),
- ?line try_test(add_row, [VRow2Status]),
- ?line try_test(add_row, [VRow3Status]),
-
- %% We're supposed to have access now...
- ?line try_test(use_rights, [], Opts),
-
- %% Change Row3 to Row4
- ?line try_test(del_row, [VRow3Status]),
- ?line try_test(add_row, [VRow4Status]),
-
- %% We should still have access...
- ?line try_test(use_rights, [], Opts),
-
- %% Delete rows
- ?line try_test(del_row, [GRow1Status]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete rest of rows
- ?line try_test(del_row, [ARow1Status]),
- ?line try_test(del_row, [VRow1Status]),
- ?line try_test(del_row, [VRow2Status]),
- ?line try_test(del_row, [VRow4Status]),
-
- ?line try_test(use_no_rights, [], Opts),
- snmpa:verbosity(master_agent,log).
-
-do_set(Row) ->
- s(Row),
- expect(1, Row).
-
-add_row(RowStatus) ->
- s([{RowStatus, ?createAndGo}]),
- expect(1, [{RowStatus, ?createAndGo}]).
-
-del_row(RowStatus) ->
- s([{RowStatus, ?destroy}]),
- expect(1, [{RowStatus, ?destroy}]).
-
-
-
-use_no_rights() ->
- g([[xDescr,0]]),
- ?v1_2_3(expect(11, noSuchName, 1, any),
- expect(12, [{[xDescr,0], noSuchObject}]),
- expect(13, authorizationError, 1, any)),
- g([[xDescr2,0]]),
- ?v1_2_3(expect(21, noSuchName, 1, any),
- expect(22, [{[xDescr2,0], noSuchObject}]),
- expect(23, authorizationError, 1, any)),
- gn([[xDescr]]),
- ?v1_2_3(expect(31, noSuchName, 1, any),
- expect(32, [{[xDescr], endOfMibView}]),
- expect(33, authorizationError, 1, any)),
- s([{[xDescr,0], "tryit"}]),
- ?v1_2_3(expect(41, noSuchName, 1, any),
- expect(42, noAccess, 1, any),
- expect(43, authorizationError, 1, any)).
-
-
-use_rights() ->
- g([[xDescr,0]]),
- expect(1, [{[xDescr,0], any}]),
- g([[xDescr2,0]]),
- expect(2, [{[xDescr2,0], any}]),
- s([{[xDescr,0], "tryit"}]),
- expect(3, noError, 0, any),
- g([[xDescr,0]]),
- expect(4, [{[xDescr,0], "tryit"}]).
-
-mk_ln(X) ->
- [length(X) | X].
-
-%%-----------------------------------------------------------------
-%% o add/delete users and try them
-%% o test all secLevels
-%% o test all combinations of protocols
-%% o try bad ops; check counters
-%%-----------------------------------------------------------------
-snmp_user_based_sm_mib_3(suite) -> [];
-snmp_user_based_sm_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- _AgentDir = ?config(agent_dir, Config),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
-
- %% The newUser used here already has VACM access.
-
- %% Add a new user in the simplest way; just createAndGo
- try_test(v3_sync, [[{usm_add_user1, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new user
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey1 = snmp:passwd2localized_key(sha, "new sha password", "agentEngine"),
- DesKey1 = lists:sublist(ShaKey1, 16),
-
- %% Change the new user's keys - 1
- try_test(v3_sync, [[{usm_key_change1, [ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- MgrDir = ?config(mgr_dir, Config),
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey2 = snmp:passwd2localized_key(sha, "newer password", "agentEngine"),
- DesKey2 = lists:sublist(ShaKey2, 16),
-
- %% Change the new user's keys - 2
- ?line try_test(v3_sync,
- [[{usm_key_change2, [ShaKey1, DesKey1, ShaKey2, DesKey2]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- reset_usm_mgr(MgrDir),
- ?line rewrite_usm_mgr(MgrDir, ShaKey2, DesKey2),
- ?line load_master("Test2"),
- ?line try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Change the new user's keys - 3
- ?line try_test(v3_sync,
- [[{usm_key_change3, [ShaKey2, DesKey2, ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new keys
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Try some read requests
- ?line try_test(v3_sync, [[{usm_read, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Delete the new user
- ?line try_test(v3_sync, [[{usm_del_user, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try some bad requests
- ?line try_test(v3_sync, [[{usm_bad, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("SNMP-USER-BASED-SM-MIB").
-
--define(usmUserSecurityName, [1,3,6,1,6,3,15,1,2,2,1,3]).
-
-usm_add_user1() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
-usm_use_user() ->
- v2_proc().
-
-
-%% Change own public keys
-usm_key_change1(ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_shaxxxxxxxxxx",
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_desxxxxxx",
- DesKey),
- Vbs1 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change own private keys
-usm_key_change2(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change other's public keys
-usm_key_change3(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange}],
- s(Vbs1),
- ?line expect(1, noAccess, 1, any),
- Vbs2 = [{[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs2),
- ?line expect(2, noAccess, 1, any),
-
-
- Vbs3 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs3),
- ?line expect(1, Vbs3).
-
-usm_read() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ?line g([[usmUserSecurityName, NewRowIndex],
- [usmUserCloneFrom, NewRowIndex],
- [usmUserAuthKeyChange, NewRowIndex],
- [usmUserOwnAuthKeyChange, NewRowIndex],
- [usmUserPrivKeyChange, NewRowIndex],
- [usmUserOwnPrivKeyChange, NewRowIndex]]),
- ?line expect(1,
- [{[usmUserSecurityName, NewRowIndex], "newUser"},
- {[usmUserCloneFrom, NewRowIndex], [0,0]},
- {[usmUserAuthKeyChange, NewRowIndex], ""},
- {[usmUserOwnAuthKeyChange, NewRowIndex], ""},
- {[usmUserPrivKeyChange, NewRowIndex], ""},
- {[usmUserOwnPrivKeyChange, NewRowIndex], ""}]),
- ok.
-
-
-
-usm_del_user() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- Vbs1 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
--define(usmUserCloneFrom, [1,3,6,1,6,3,15,1,2,2,1,4]).
-
--define(usmNoAuthProtocol, [1,3,6,1,6,3,10,1,1,1]).
-
--define(usmHMACMD5AuthProtocol, [1,3,6,1,6,3,10,1,1,2]).
-
--define(usmHMACSHAAuthProtocol, [1,3,6,1,6,3,10,1,1,3]).
-
--define(usmNoPrivProtocol, [1,3,6,1,6,3,10,1,2,1]).
-
--define(usmDESPrivProtocol, [1,3,6,1,6,3,10,1,2,2]).
-
-usm_bad() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer1 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDOS"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer1},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, inconsistentName, 1, any),
-
- RowPointer2 = ?usmUserCloneFrom ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs2 = [{[usmUserCloneFrom, NewRowIndex], RowPointer2},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs2),
- ?line expect(2, wrongValue, 1, any),
-
- RowPointer3 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs3 = [{[usmUserCloneFrom, NewRowIndex], RowPointer3},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs3),
- ?line expect(3, Vbs3),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmNoAuthProtocol}]),
- ?line expect(4, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmHMACMD5AuthProtocol}]),
- ?line expect(5, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmDESPrivProtocol}]),
- ?line expect(6, wrongValue, 1, any),
- ?line s([{[usmUserPrivProtocol, NewRowIndex], ?usmHMACSHAAuthProtocol}]),
- ?line expect(7, wrongValue, 1, any),
-
- Vbs4 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs4),
- ?line expect(1, Vbs4),
-
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Loop through entire MIB, to make sure that all instrum. funcs
-%% works.
-%% Load all std mibs that are not loaded by default.
-%%-----------------------------------------------------------------
-loop_mib(suite) -> [];
-loop_mib(Config) when list(Config) ->
- ?LOG("loop_mib -> initiate case",[]),
- %% snmpa:verbosity(master_agent,debug),
- %% snmpa:verbosity(mib_server,info),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib -> load mib SNMP-COMMUNITY-MIB",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> load mib SNMP-MPD-MIB",[]),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> load mib SNMP-TARGET-MIB",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> load mib SNMP-NOTIFICATION-MIB",[]),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> load mib SNMP-FRAMEWORK-MIB",[]),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> load mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?DBG("loop_mib -> try",[]),
- try_test(loop_mib_1),
- ?DBG("loop_mib -> unload mib SNMP-COMMUNITY-MIB",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-MPD-MIB",[]),
- ?line unload_master("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-TARGET-MIB",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-NOTIFICATION-MIB",[]),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-FRAMEWORK-MIB",[]),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- %% snmpa:verbosity(master_agent,log),
- %% snmpa:verbosity(mib_server,silence),
- ?LOG("loop_mib -> done",[]).
-
-
-loop_mib_2(suite) -> [];
-loop_mib_2(Config) when list(Config) ->
- ?LOG("loop_mib_2 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_2 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_2 -> load mibs",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_2 -> unload mibs",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?LOG("loop_mib_2 -> done",[]).
-
-
-loop_mib_3(suite) -> [];
-loop_mib_3(Config) when list(Config) ->
- ?LOG("loop_mib_3 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_3 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_3 -> load mibs",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_3 -> unload mibs",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?LOG("loop_mib_3 -> done",[]).
-
-
-%% Req. As many mibs all possible
-loop_mib_1() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_1([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_1(Oid, N) ->
- ?DBG("loop_it_1 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_1 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_1 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_1(NOid, N+1);
- #pdu{type='get-response', error_status=noSuchName, error_index=1,
- varbinds=[_]} ->
- ?DBG("loop_it_1 -> done",[]),
- N;
-
- #pdu{type = Type, error_status = Err, error_index = Idx,
- varbinds = Vbs} ->
- exit({unexpected_pdu, ?LINE, Type, Err, Idx, Vbs})
- end.
-
-%% Req. As many mibs all possible
-loop_mib_2() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_2([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_2(Oid, N) ->
- ?DBG("loop_it_2 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid, value = endOfMibView}]} ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p",[NOid]),
- N;
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_2 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_2(NOid, N+1)
- end.
-
-
-%%%-----------------------------------------------------------------
-%%% Testing of reported bugs and other tickets.
-%%%-----------------------------------------------------------------
-
-
-
-
-
-%% These are (ticket) test cases where the initiation has to be done
-%% individually.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1128
-%% Slogan: Bug in handling of createAndWait set-requests.
-%%-----------------------------------------------------------------
-otp_1128(suite) -> [];
-otp_1128(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1128),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1128_2(X) -> otp_1128(X).
-
-otp_1128_3(X) -> otp_1128(X).
-
-otp_1128() ->
- io:format("Testing bug reported in ticket OTP-1128...~n"),
-
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
-
- s([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- ?line expect(28, [{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(29, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- ?line expect(30, [{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(31, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(32, [{NewKeyc5, ?destroy}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1129, OTP-1169
-%% Slogan: snmpa:int_to_enum crashes on bad oids
-%%-----------------------------------------------------------------
-otp_1129(suite) -> [];
-otp_1129(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- try_test(otp_1129_i, [node()]),
- ?line unload_master("Klas3").
-
-otp_1129_2(X) -> otp_1129(X).
-
-otp_1129_3(X) -> otp_1129(X).
-
-otp_1129_i(MaNode) ->
- io:format("Testing bug reported in ticket OTP-1129...~n"),
- false = rpc:call(MaNode, snmp, int_to_enum, [iso, 1]),
- false = rpc:call(MaNode, snmp, int_to_enum, [isox, 1]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1131
-%% Slogan: Agent crashes / erlang node halts if RowIndex in a
-%% setrequest is of bad type, e.g. an INDEX {INTEGER},
-%% and RowIdenx [3,2].
-%%-----------------------------------------------------------------
-otp_1131(suite) -> [];
-otp_1131(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas1"),
- try_test(otp_1131),
- ?line unload_master("Klas1").
-
-otp_1131_2(X) -> otp_1131(X).
-
-otp_1131_3(X) -> otp_1131(X).
-
-otp_1131() ->
- io:format("Testing bug reported in ticket OTP-1131...~n"),
- s([{[friendsEntry, [2, 3, 1]], s, "kompis3"},
- {[friendsEntry, [3, 3, 1]], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 2, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1162
-%% Slogan: snmp_agent can't handle wrongValue from instrum.func
-%%-----------------------------------------------------------------
-otp_1162(suite) -> [];
-otp_1162(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
- try_test(otp_1162),
- stop_subagent(SA).
-
-otp_1162_2(X) -> otp_1162(X).
-
-otp_1162_3(X) -> otp_1162(X).
-
-otp_1162() ->
- s([{[sa, [2,0]], 6}]), % wrongValue (i is_set_ok)
- ?line expect(1, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1222
-%% Slogan: snmp agent crash if faulty index is returned from instrum
-%%-----------------------------------------------------------------
-otp_1222(suite) -> [];
-otp_1222(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- ?line load_master("Klas4"),
- try_test(otp_1222),
- ?line unload_master("Klas3"),
- ?line unload_master("Klas4").
-
-otp_1222_2(X) -> otp_1222(X).
-
-otp_1222_3(X) -> otp_1222(X).
-
-otp_1222() ->
- io:format("Testing bug reported in ticket OTP-1222...~n"),
- s([{[fStatus4,1], 4}, {[fName4,1], 1}]),
- ?line expect(1, genErr, 0, any),
- s([{[fStatus4,2], 4}, {[fName4,2], 1}]),
- ?line expect(2, genErr, 0, any).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1298
-%% Slogan: Negative INTEGER values are treated as positive.
-%%-----------------------------------------------------------------
-otp_1298(suite) -> [];
-otp_1298(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1298),
- ?line unload_master("Klas2").
-
-otp_1298_2(X) -> otp_1298(X).
-
-otp_1298_3(X) -> otp_1298(X).
-
-otp_1298() ->
- io:format("Testing bug reported in ticket OTP-1298...~n"),
- s([{[fint,0], -1}]),
- ?line expect(1298, [{[fint,0], -1}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1331
-%% Slogan: snmp_generic should return noError when deleting non-ex row
-%%-----------------------------------------------------------------
-otp_1331(suite) -> [];
-otp_1331(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1331),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1331_2(X) -> otp_1331(X).
-
-otp_1331_3(X) -> otp_1331(X).
-
-otp_1331() ->
- NewKeyc5 = [intCommunityStatus,[127,32,0,0],is("test")],
- s([{NewKeyc5, ?destroy}]),
- ?line expect(1, [{NewKeyc5, ?destroy}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1338
-%% Slogan: snmp bug in initialisation of default values for mnesia tabs
-%%-----------------------------------------------------------------
-otp_1338(suite) -> [];
-otp_1338(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1338),
- ?line unload_master("Klas2").
-
-otp_1338_2(X) -> otp_1338(X).
-
-otp_1338_3(X) -> otp_1338(X).
-
-otp_1338() ->
- s([{[kStatus2, 7], i, ?createAndGo}]),
- ?line expect(1, [{[kStatus2, 7], ?createAndGo}]),
- g([[kName2, 7]]),
- ?line expect(2, [{[kName2, 7], "JJJ"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1342
-%% Slogan: default impl of snmp table can't handle bad index access,
-%% Set when INDEX is read-write gets into an infinite loop!
-%%-----------------------------------------------------------------
-otp_1342(suite) -> [];
-otp_1342(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas4"),
- try_test(otp_1342),
- ?line unload_master("Klas4").
-
-otp_1342_2(X) -> otp_1342(X).
-
-otp_1342_3(X) -> otp_1342(X).
-
-otp_1342() ->
- s([{[fIndex5, 1], i, 1},
- {[fName5, 1], i, 3},
- {[fStatus5, 1], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 3, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1366
-%% Slogan: snmp traps not sent to all managers
-%% Note: NYI! We need a way to tell the test server that we need
-%% mgrs on two different machines.
-%%-----------------------------------------------------------------
-otp_1366(suite) -> [];
-otp_1366(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1366),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1366_2(X) -> otp_1366(X).
-
-otp_1366_3(X) -> otp_1366(X).
-
-otp_1366() ->
- ?INF("NOT YET IMPLEMENTED", []),
- 'NYI'.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2776
-%% Slogan: snmp:validate_date_and_time() fails when time is 00:00
-%%-----------------------------------------------------------------
-otp_2776(suite) -> [];
-otp_2776(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_2776).
-
-otp_2776_2(X) -> otp_2776(X).
-
-otp_2776_3(X) -> otp_2776(X).
-
-otp_2776() ->
- io:format("Testing bug reported in ticket OTP-2776...~n"),
-
- Dt01_valid = [19,98,9,1,1,0,23,0,43,0,0],
- Dt02_valid = [19,98,9,1,0,0,0,0,43,0,0], % This is what is fixed: 00:00
- Dt03_valid = [19,98,2,28,1,0,23,0,43,0,0],
- Dt04_invalid = [19,98,2,29,1,0,23,0,43,0,0],
- Dt05_valid = [19,96,2,29,1,0,23,0,43,0,0],
- Dt06_valid = [20,0,2,29,1,0,23,0,43,0,0],
- Dt07_invalid = [19,96,2,30,1,0,23,0,43,0,0], % This is also fixed: 30/2
- Dt08_valid = [19,98,4,30,1,0,23,0,43,0,0],
- Dt09_invalid = [19,98,4,31,1,0,23,0,43,0,0], % This is also fixed: 31/4
- Dt10_invalid = [],
- Dt11_invalid = [kalle,hobbe],
- L = [{ 1, true, Dt01_valid},
- { 2, true, Dt02_valid},
- { 3, true, Dt03_valid},
- { 4, false, Dt04_invalid},
- { 5, true, Dt05_valid},
- { 6, true, Dt06_valid},
- { 7, false, Dt07_invalid},
- { 8, true, Dt08_valid},
- { 9, false, Dt09_invalid},
- {10, false, Dt10_invalid},
- {11, false, Dt11_invalid}],
-
- ?line ok = validate_dat(L).
-
-
-validate_dat(L) -> validate_dat(L,[]).
-
-validate_dat([],V) ->
- Fun = fun({_,X}) -> case X of
- ok -> false;
- _ -> true
- end
- end,
- validate_dat1( lists:reverse( lists:filter(Fun,V) ) );
-validate_dat([{Id,E,Dat}|T],V) ->
- validate_dat(T,[validate_dat2(Id,E,Dat) | V]).
-
-validate_dat1([]) -> ok;
-validate_dat1(L) -> {error,L}.
-
-validate_dat2(Id, E, Dat) ->
- Res = case {E,snmp:validate_date_and_time(Dat)} of
- {E,E} -> ok;
- {E,A} -> {E,A}
- end,
- {Id, Res}.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2979
-%% Slogan: get-next on more than 1 column in an empty table
-%% returns bad response.
-%%-----------------------------------------------------------------
-otp_2979(suite) -> [];
-otp_2979(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Test1"),
- ?line init_old(),
- try_test(otp_2979),
- ?line unload_master("Test1").
-
-otp_2979_2(X) -> otp_2979(X).
-
-otp_2979_3(X) -> otp_2979(X).
-
-otp_2979() ->
- gn([[sparseDescr], [sparseStatus]]),
- ?line expect(1, [{[sparseStr,0], "slut"},
- {[sparseStr,0], "slut"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3187
-%% Slogan: get-next on vacmAccessTable for colums > 5 returns
-%% endOfTable - should return value.
-%%-----------------------------------------------------------------
-otp_3187(suite) -> [];
-otp_3187(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- otp_3187(),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-otp_3187_2(X) -> otp_3187(X).
-
-otp_3187_3(X) -> otp_3187(X).
-
-otp_3187() ->
- ?line Elements =
- snmp_view_based_acm_mib:vacmAccessTable(get_next,[],[4,5,6]),
- lists:foreach(fun(E) ->
- ?line if E == endOfTable ->
- ?FAIL(endOfTable);
- true -> ok
- end
- end, Elements).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3542
-%% Slogan:
-%%-----------------------------------------------------------------
-otp_3542(suite) -> [];
-otp_3542(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_3542).
-
-otp_3542() ->
- io:format("SNMP v3 discovery...~n"),
- ?line Res = snmp_test_mgr:d(),
- io:format("SNMP v3 discovery result: ~p~n",[Res]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3725
-%% Slogan: Slow response time on snmpa:int_to_enum
-%%-----------------------------------------------------------------
-otp_3725(suite) -> [];
-otp_3725(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_3725_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req. OLD-SNMPEA-MIB
-otp_3725_test(MaNode) ->
- io:format("Testing feature requested in ticket OTP-3725...~n"),
- ?line rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
- ?line Db = rpc:call(MaNode,snmp,get_symbolic_store_db,[]),
- ?DBG("otp_3725_test -> Db = ~p",[Db]),
-
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [Db, intAgentIpAddress]),
- ?DBG("otp_3725_test -> name_to_oid for ~p: ~p",[intAgentIpAddress,OID]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp, oid_to_name,
- [Db,OID]),
- ?DBG("otp_3725_test -> oid_to_name for ~p: ~p",[OID,intAgentIpAddress]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [Db, intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [Db, [1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, 'RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'xxRowStatus', 1]),
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-4394
-%% Slogan: Target mib tag list check invalid
-%%-----------------------------------------------------------------
-
-
-
-init_otp_4394(Config) when list(Config) ->
- ?DBG("init_otp_4394 -> entry with"
- "~n Config: ~p", [Config]),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line otp_4394_config(AgentDir, MgrDir, Ip),
- MasterAgentVerbosity = {master_agent_verbosity, trace},
- NetIfVerbosity = {net_if_verbosity, trace},
- Opts = [MasterAgentVerbosity,NetIfVerbosity],
- [{vsn, v1} | start_v1_agent(Config,Opts)].
-
-otp_4394_config(AgentDir, MgrDir, Ip0) ->
- ?DBG("otp_4394_config -> entry with"
- "~n AgentDir: ~p"
- "~n MgrDir: ~p"
- "~n Ip0: ~p", [AgentDir, MgrDir, Ip0]),
- Vsn = [v1],
- Ip = tuple_to_list(Ip0),
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsn, Ip,
- ?TRAP_UDP, Ip, 4000,
- "OTP-4394 test"),
- ?line case update_usm(Vsn, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsn, MgrDir);
- false ->
- ?line ok
- end,
- C1 = {"a", "all-rights", "initial", "", "pc"},
- C2 = {"c", "secret", "secret_name", "", "secret_tag"},
- ?line write_community_conf(AgentDir, [C1, C2]),
- ?line update_vacm(Vsn, AgentDir),
- Ta1 = {"shelob v1",
- [134,138,177,177], 5000, 1500, 3, %% Använd Ip och modda
- "pc1",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [],
- 2048},
- Ta2 = {"bifur v1",
- [134,138,177,75], 5000, 1500, 3, %% Använd Ip
- "pc2",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [], 2048},
- ?line write_target_addr_conf(AgentDir, [Ta1, Ta2]),
- ?line write_target_params_conf(AgentDir, Vsn),
- ?line write_notify_conf(AgentDir),
- ok.
-
-
-
-finish_otp_4394(Config) when list(Config) ->
- ?DBG("finish_otp_4394 -> entry", []),
- C1 = stop_agent(Config),
- delete_files(C1),
- erase(mgr_node),
- lists:keydelete(vsn, 1, C1).
-
-otp_4394_test(suite) -> [];
-otp_4394_test(Config) ->
- ?DBG("otp_4394_test -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_4394_test1),
- ?DBG("otp_4394_test -> done", []),
- ok.
-
-otp_4394_test1() ->
- ?DBG("otp_4394_test1 -> entry", []),
- gn([[1,1]]),
- Res =
- case snmp_test_mgr:expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]) of
- %% {error, 1, {"?",[]}, {"~w",[timeout]}}
- {error, 1, _, {_, [timeout]}} ->
- ?DBG("otp_4394_test1 -> expected result: timeout", []),
- ok;
- Else ->
- Else
- end,
- ?DBG("otp_4394_test1 -> done with: ~p", [Res]),
- Res.
-
-
-%%%--------------------------------------------------
-%%% Used to test the standard mib with our
-%%% configuration.
-%%%--------------------------------------------------
-run(F, A, Opts) ->
- M = get(mib_dir),
- Dir = get(mgr_dir),
- User = snmp_misc:get_option(user, Opts, "all-rights"),
- SecLevel = snmp_misc:get_option(sec_level, Opts, noAuthNoPriv),
- EngineID = snmp_misc:get_option(engine_id, Opts, "agentEngine"),
- CtxEngineID = snmp_misc:get_option(context_engine_id, Opts, EngineID),
- Community = snmp_misc:get_option(community, Opts, "all-rights"),
- ?DBG("run -> start crypto app",[]),
- Crypto = ?CRYPTO_START(),
- ?DBG("run -> Crypto: ~p",[Crypto]),
- catch snmp_test_mgr:stop(), % If we had a running mgr from a failed case
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- ?DBG("run -> config:~n"
- "\tM: ~p~n"
- "\tDir: ~p~n"
- "\tUser: ~p~n"
- "\tSecLevel: ~p~n"
- "\tEngineID: ~p~n"
- "\tCtxEngineID: ~p~n"
- "\tCommunity: ~p~n"
- "\tStdM: ~p",
- [M,Dir,User,SecLevel,EngineID,CtxEngineID,Community,StdM]),
- case snmp_test_mgr:start([%% {agent, snmp_test_lib:hostname()},
- {packet_server_debug,true},
- {debug,true},
- {agent, get(master_host)},
- {agent_udp, 4000},
- {trap_udp, 5000},
- {recbuf,65535},
- quiet,
- get(vsn),
- {community, Community},
- {user, User},
- {sec_level, SecLevel},
- {engine_id, EngineID},
- {context_engine_id, CtxEngineID},
- {dir, Dir},
- {mibs, mibs(StdM, M)}]) of
- {ok, _Pid} ->
- Res = apply(?MODULE, F, A),
- catch snmp_test_mgr:stop(),
- Res;
- Err ->
- io:format("Error starting manager: ~p\n", [Err]),
- catch snmp_test_mgr:stop(),
- ?line exit({mgr_start, Err})
- end.
-
-
-mibs(StdMibDir,MibDir) ->
- [join(StdMibDir, ?v1_2("STANDARD-MIB.bin", "SNMPv2-MIB.bin")),
- join(MibDir, "OLD-SNMPEA-MIB.bin"),
- join(StdMibDir, "SNMP-FRAMEWORK-MIB"),
- join(StdMibDir, "SNMP-MPD-MIB"),
- join(StdMibDir, "SNMP-VIEW-BASED-ACM-MIB"),
- join(StdMibDir, "SNMP-USER-BASED-SM-MIB"),
- join(StdMibDir, "SNMP-TARGET-MIB"),
- join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
- join(MibDir, "Klas1.bin"),
- join(MibDir, "Klas2.bin"),
- join(MibDir, "Klas3.bin"),
- join(MibDir, "Klas4.bin"),
- join(MibDir, "SA-MIB.bin"),
- join(MibDir, "TestTrap.bin"),
- join(MibDir, "Test1.bin"),
- join(MibDir, "Test2.bin"),
- join(MibDir, "TestTrapv2.bin")].
-
-join(D,F) ->
- filename:join(D,F).
-
-%% string used in index
-is(S) -> [length(S) | S].
-
-try_test(Func) ->
- call(get(mgr_node), ?MODULE, run, [Func, [], []]).
-
-try_test(Func, A) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, []]).
-
-try_test(Func, A, Opts) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, Opts]).
-
-call(N,M,F,A) ->
- ?DBG("call -> entry with~n"
- " N: ~p~n"
- " M: ~p~n"
- " F: ~p~n"
- " A: ~p~n"
- " when~n"
- " get(): ~p",
- [N,M,F,A,get()]),
- spawn(N, ?MODULE, wait, [self(),get(),M,F,A]),
- receive
- {done, {'EXIT', Rn}, Loc} ->
- ?DBG("call -> returned ~p",[{done, {'EXIT', Rn}, Loc}]),
- put(test_server_loc, Loc),
- exit(Rn);
- {done, Ret, Zed} ->
- ?DBG("call -> returned ~p~n",[{done, Ret, Zed}]),
- Ret
- end.
-
-wait(From, Env, M, F, A) ->
- ?DBG("wait -> entry with ~n"
- "\tFrom: ~p~n"
- "\tEnv: ~p",[From,Env]),
- lists:foreach(fun({K,V}) -> put(K,V) end, Env),
- Rn = (catch apply(M, F, A)),
- ?DBG("wait -> Rn: ~n~p", [Rn]),
- From ! {done, Rn, get(test_server_loc)},
- exit(Rn).
-
-expect(A,B) -> ok = snmp_test_mgr:expect(A,B).
-expect(A,B,C) -> ok = snmp_test_mgr:expect(A,B,C).
-expect(A,B,C,D) -> ok = snmp_test_mgr:expect(A,B,C,D).
-expect(A,B,C,D,E,F) -> ok = snmp_test_mgr:expect(A,B,C,D,E,F).
-
-get_req(Id, Vars) ->
- ?DBG("get_req -> entry with~n"
- "\tId: ~p~n"
- "\tVars: ~p",[Id,Vars]),
- g(Vars),
- ?DBG("get_req -> await response",[]),
- {ok, Val} = snmp_test_mgr:get_response(Id, Vars),
- ?DBG("get_req -> response: ~p",[Val]),
- Val.
-
-get_next_req(Vars) ->
- ?DBG("get_next_req -> entry with Vars '~p', send request",[Vars]),
- gn(Vars),
- ?DBG("get_next_req -> await response",[]),
- Response = snmp_test_mgr:receive_response(),
- ?DBG("get_next_req -> response: ~p",[Response]),
- Response.
-
-
-
-start_node(Name) ->
- ?LOG("start_node -> entry with Name: ~p",[Name]),
- M = list_to_atom(?HOSTNAME(node())),
- ?DBG("start_node -> M: ~p",[M]),
- Pa = filename:dirname(code:which(?MODULE)),
- ?DBG("start_node -> Pa: ~p",[Pa]),
-
- Args = case init:get_argument('CC_TEST') of
- {ok, [[]]} ->
- " -pa /clearcase/otp/libraries/snmp/ebin ";
- {ok, [[Path]]} ->
- " -pa " ++ Path;
- error ->
- ""
- end,
- %% Do not use start_link!!! (the proc that calls this one is tmp)
- ?DBG("start_node -> Args: ~p~n",[Args]),
- A = Args ++ " -pa " ++ Pa,
- case (catch ?START_NODE(Name, A)) of
- {ok, Node} ->
- %% Tell the test_server to not clean up things it never started.
- ?DBG("start_node -> Node: ~p",[Node]),
- {ok, Node};
- Else ->
- ?ERR("start_node -> failed with(other): Else: ~p",[Else]),
- ?line ?FAIL(Else)
- end.
-
-
-stop_node(Node) ->
- ?LOG("stop_node -> Node: ~p",[Node]),
- rpc:cast(Node, erlang, halt, []).
-
-p(X) ->
- io:format(user, X++"\n", []).
-
-sleep(X) ->
- receive
- after
- X -> ok
- end.
-
-%%%-----------------------------------------------------------------
-%%% Configuration
-%%%-----------------------------------------------------------------
-config(Vsns, MgrDir, AgentDir, MIp, AIp) ->
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsns, MIp,
- ?TRAP_UDP, AIp, 4000,
- "test"),
- ?line case update_usm(Vsns, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsns, MgrDir);
- false ->
- ?line ok
- end,
- ?line update_community(Vsns, AgentDir),
- ?line update_vacm(Vsns, AgentDir),
- ?line write_target_addr_conf(AgentDir, MIp, ?TRAP_UDP, Vsns),
- ?line write_target_params_conf(AgentDir, Vsns),
- ?line write_notify_conf(AgentDir),
- ok.
-
-delete_files(Config) ->
- Dir = ?config(agent_dir, Config),
- {ok, List} = file:list_dir(Dir),
- lists:foreach(fun(FName) -> file:delete(filename:join(Dir, FName)) end,
- List).
-
-update_usm(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-update_usm_mgr(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-rewrite_usm_mgr(Dir, ShaKey, DesKey) ->
- ?line ok = file:rename(filename:join(Dir,"usm.conf"),
- filename:join(Dir,"usm.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),write),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- file:close(Fid).
-
-reset_usm_mgr(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"usm.old"),
- filename:join(Dir,"usm.conf")).
-
-
-update_community([v3], _Dir) -> ok;
-update_community(_, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{\"no-rights\",\"no-rights\",\"no-rights\",\"\",\"\"}.\n",
- []),
- file:close(Fid).
-
-
--define(tDescr_instance, [1,3,6,1,2,1,16,1,0]).
-update_vacm(_Vsn, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"vacm.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authMD5\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authSHA\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"privDES\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"newUser\",\"initial\"}.\n",[]),
- ok = io:format(Fid, "{vacmViewTreeFamily, \"internet\", "
- "~w, excluded, null}.\n", [?tDescr_instance]),
- file:close(Fid).
-
-
-vacm_ver(v1) -> v1;
-vacm_ver(v2) -> v2c;
-vacm_ver(v3) -> usm.
-
-
-write_community_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),write),
- ok = write_community_conf1(Fid, Confs),
- file:close(Fid).
-
-write_community_conf1(_, []) ->
- ok;
-write_community_conf1(Fid, [{ComIdx, ComName, SecName, CtxName, TransTag}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", \"~s\", \"~s\", \"~s\", \"~s\"}.~n",
- [ComIdx, ComName, SecName, CtxName, TransTag]),
- write_community_conf1(Fid, Confs).
-
-
-write_target_addr_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- ok = write_target_addr_conf1(Fid, Confs),
- file:close(Fid).
-
-
-write_target_addr_conf1(_, []) ->
- ok;
-write_target_addr_conf1(Fid,
- [{Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", ~w, ~w, ~w, ~w, \"~s\", \"~s\", \"~s\", ~w, ~w}.~n",
- [Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz]),
- write_target_addr_conf1(Fid, Confs).
-
-write_target_addr_conf(Dir, ManagerIp, UDP, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- lists:foreach(fun(Vsn) ->
- ok = io:format(Fid,
- "{\"~s\", ~w, ~w, 1500, 3, "
- "\"std_trap\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP, mk_param(Vsn)]),
- case Vsn of
- v1 -> ok;
- v2 ->
- ok = io:format(Fid,
- "{\"~s.2\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)]);
- v3 ->
- ok = io:format(Fid,
- "{\"~s.3\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\", "
- "\"mgrEngine\", [], 1024}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)])
- end
- end,
- Vsns),
- file:close(Fid).
-
-mk_param(v1) -> "target_v1";
-mk_param(v2) -> "target_v2";
-mk_param(v3) -> "target_v3".
-
-mk_ip([A,B,C,D], Vsn) ->
- io_lib:format("~w.~w.~w.~w ~w", [A,B,C,D,Vsn]).
-
-
-rewrite_target_addr_conf(Dir,NewPort) ->
- TAFile = filename:join(Dir, "target_addr.conf"),
- ?DBG("rewrite_target_addr_conf -> read target file info of address config file",[]),
- case file:read_file_info(TAFile) of
- {ok, _} -> ok;
- {error, R} -> ?ERR("failure reading file info of "
- "target address config file: ~p",[R]),
- ok
- end,
-
- ?line [TrapAddr|Addrs] =
- snmp_conf:read(TAFile,fun(R) -> rewrite_target_addr_conf1(R) end),
-
- ?DBG("rewrite_target_addr_conf -> TrapAddr: ~p",[TrapAddr]),
-
- NewAddrs = [rewrite_target_addr_conf2(NewPort,TrapAddr)|Addrs],
-
- ?DBG("rewrite_target_addr_conf -> NewAddrs: ~p",[NewAddrs]),
-
- ?line ok = file:rename(filename:join(Dir,"target_addr.conf"),
- filename:join(Dir,"target_addr.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
-
- ?line ok = rewrite_target_addr_conf3(Fid,NewAddrs),
-
- file:close(Fid).
-
-rewrite_target_addr_conf1(O) ->
- {ok,O}.
-
-rewrite_target_addr_conf2(NewPort,{Name,Ip,_Port,Timeout,Retry,
- "std_trap",EngineId}) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with std_trap",[]),
- {Name,Ip,NewPort,Timeout,Retry,"std_trap",EngineId};
-rewrite_target_addr_conf2(_NewPort,O) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with "
- "~n O: ~p",[O]),
- O.
-
-
-rewrite_target_addr_conf3(_,[]) -> ok;
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,
- ParamName,EngineId}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(1) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % ParamsName
- "\"~s\"}.", % EngineId
- [Name,Ip,Port,Timeout,Retry,ParamName,EngineId]),
- rewrite_target_addr_conf3(Fid,T);
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,TagList,
- ParamName,EngineId,TMask,MMS}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(2) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % TagList
- "\"~s\", " % ParamsName
- "\"~s\"," % EngineId
- "~p, " % TMask
- "~p}.", % MMS
- [Name,Ip,Port,Timeout,Retry,TagList,ParamName,
- EngineId,TMask,MMS]),
- rewrite_target_addr_conf3(Fid,T).
-
-reset_target_addr_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_addr.old"),
- filename:join(Dir,"target_addr.conf")).
-
-write_target_params_conf(Dir, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- lists:foreach(fun(Vsn) ->
- MP = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> v3
- end,
- SM = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> usm
- end,
- ok = io:format(Fid, "{\"target_~w\", ~w, ~w, "
- "\"all-rights\", noAuthNoPriv}.~n",
- [Vsn, MP, SM])
- end,
- Vsns),
- file:close(Fid).
-
-rewrite_target_params_conf(Dir, SecName, SecLevel) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.conf"),
- filename:join(Dir,"target_params.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- ?line ok = io:format(Fid, "{\"target_v3\", v3, usm, \"~s\", ~w}.~n",
- [SecName, SecLevel]),
- file:close(Fid).
-
-reset_target_params_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.old"),
- filename:join(Dir,"target_params.conf")).
-
-write_notify_conf(Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"notify.conf"),write),
- ok = io:format(Fid, "{\"standard trap\", \"std_trap\", trap}.~n", []),
- ok = io:format(Fid, "{\"standard inform\", \"std_inform\",inform}.~n", []),
- file:close(Fid).
-
-ver_to_trap_str([v1]) -> "v1";
-ver_to_trap_str([v2]) -> "v2";
-% default is to use the latest snmp version
-ver_to_trap_str([v1,v2]) -> "v2".
-
-
-
-write_view_conf(Dir) ->
- {ok, Fid} = file:open(a(Dir,"view.conf"),write),
- ok = io:format(Fid, "{2, [1,3,6], included, null}.~n", []),
- ok = io:format(Fid, "{2, ~w, excluded, null}.~n", [?tDescr_instance]),
- file:close(Fid).
-
-a(A,B) -> lists:append(A,B).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-copy_file(From, To) ->
- {ok, Bin} = file:read_file(From),
- ok = file:write_file(To, Bin).
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-display_memory_usage() ->
- Info = snmpa:info(snmp_master_agent),
- TreeSize = lists_key1search(tree_size_bytes, Info),
- ProcMem = lists_key1search(process_memory, Info),
- MibDbSize = lists_key1search([db_memory,mib], Info),
- NodeDbSize = lists_key1search([db_memory,node], Info),
- TreeDbSize = lists_key1search([db_memory,tree], Info),
- ?INF("Memory usage: "
- "~n Tree size: ~p"
- "~n Process memory size: ~p"
- "~n Mib db size: ~p"
- "~n Node db size: ~p"
- "~n Tree db size: ~p",
- [TreeSize, ProcMem, MibDbSize, NodeDbSize, TreeDbSize]).
-
-lists_key1search([], Res) ->
- Res;
-lists_key1search([Key|Keys], List) when atom(Key), list(List) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- lists_key1search(Keys, Val);
- false ->
- undefined
- end;
-lists_key1search(Key, List) when atom(Key) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- Val;
- false ->
- undefined
- end.
-
-
-regs() ->
- lists:sort(registered()).
diff --git a/lib/snmp/test/exp/snmp_agent_v3_test.erl b/lib/snmp/test/exp/snmp_agent_v3_test.erl
deleted file mode 100644
index 49f98b5178..0000000000
--- a/lib/snmp/test/exp/snmp_agent_v3_test.erl
+++ /dev/null
@@ -1,5635 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(snmp_agent_v3_test).
-
-%% TODO
-%% * Test fault-tolerance (kill master etc)
-%%
-
--compile(export_all).
-
--define(application, snmp).
-
--include_lib("kernel/include/file.hrl").
--include_lib("common_test/include/ct.hrl").
--include("snmp_test_lib.hrl").
--define(SNMP_USE_V3, true).
--include_lib("snmp/include/snmp_types.hrl").
-%% -include_lib("snmp/include/SNMP-COMMUNITY-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-VIEW-BASED-ACM-MIB.hrl").
-%% -include_lib("snmp/include/SNMP-USER-BASED-SM-MIB.hrl").
-
-
--define(klas1, [1,3,6,1,2,1,7]).
--define(klas2, [1,3,6,1,2,1,9]).
--define(klas3, [1,3,6,1,2,1,8,1]).
--define(klas4, [1,3,6,1,2,1,8,4]).
--define(sa, [1,3,6,1,4,1,193,2]).
--define(system, [1,3,6,1,2,1,1]).
--define(snmp, [1,3,6,1,2,1,11]).
--define(snmpTraps, [1,3,6,1,6,3,1,1,5]).
--define(ericsson, [1,3,6,1,4,1,193]).
--define(testTrap, [1,3,6,1,2,1,15,0]).
--define(xDescr, [1,3,6,1,2,1,17,1]).
--define(xDescr2, [1,3,6,1,2,1,17,2]).
-
--define(active, 1).
--define(notInService, 2).
--define(notReady, 3).
--define(createAndGo, 4).
--define(createAndWait, 5).
--define(destroy, 6).
-
--define(TRAP_UDP, 5000).
-
--define(tooBigStr, "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").
-
--define(str(X), snmp_pdus:bits_to_str(X)).
-
--define(break(), begin io:format(user, "break at line ~w: pid: ~p\n",
- [?LINE, self()]),
- receive cont -> ok end
- end).
-
-
--import(snmp_test_mgr, [gn/1, g/1, s/1, gb/3]).
--define(v1_2(V1,V2),
- case get(vsn) of
- v1 -> V1;
- _ -> V2
- end).
-
--define(v1_2_3(V1,V2,V3),
- case get(vsn) of
- v1 -> V1;
- v2 -> V2;
- _ -> V3
- end).
-
-all() ->
-[cases()].
-
-groups() ->
- [{mib_storage, [],
- [{group, mib_storage_ets}, {group, mib_storage_dets},
- {group, mib_storage_mnesia},
- {group, mib_storage_size_check_ets},
- {group, mib_storage_size_check_dets},
- {group, mib_storage_size_check_mnesia},
- {group, mib_storage_varm_dets},
- {group, mib_storage_varm_mnesia}]},
- {mib_storage_ets, [], mib_storage_ets_cases()},
- {mib_storage_dets, [], mib_storage_dets_cases()},
- {mib_storage_mnesia, [], mib_storage_mnesia_cases()},
- {mib_storage_size_check_ets, [],
- mse_size_check_cases()},
- {mib_storage_size_check_dets, [],
- msd_size_check_cases()},
- {mib_storage_size_check_mnesia, [],
- msm_size_check_cases()},
- {mib_storage_varm_dets, [],
- varm_mib_storage_dets_cases()},
- {mib_storage_varm_mnesia, [],
- varm_mib_storage_mnesia_cases()},
- {test_v1, [], v1_cases()}, {test_v2, [], v2_cases()},
- {test_v1_v2, [], v1_v2_cases()},
- {test_v3, [], v3_cases()},
- {test_multi_threaded, [], mt_cases()},
- {multiple_reqs, [], mul_cases()},
- {multiple_reqs_2, [], mul_cases_2()},
- {v2_inform, [], [v2_inform_i]},
- {v3_security, [],
- [v3_crypto_basic, v3_md5_auth, v3_sha_auth,
- v3_des_priv]},
- {standard_mibs, [],
- [snmp_standard_mib, snmp_community_mib,
- snmp_framework_mib, snmp_target_mib,
- snmp_notification_mib, snmp_view_based_acm_mib]},
- {standard_mibs_2, [],
- [snmpv2_mib_2, snmp_community_mib_2,
- snmp_framework_mib_2, snmp_target_mib_2,
- snmp_notification_mib_2, snmp_view_based_acm_mib_2]},
- {standard_mibs_3, [],
- [snmpv2_mib_3, snmp_framework_mib_3, snmp_mpd_mib_3,
- snmp_target_mib_3, snmp_notification_mib_3,
- snmp_view_based_acm_mib_3, snmp_user_based_sm_mib_3]},
- {reported_bugs, [],
- [otp_1128, otp_1129, otp_1131, otp_1162, otp_1222,
- otp_1298, otp_1331, otp_1338, otp_1342, otp_2776,
- otp_2979, otp_3187, otp_3725]},
- {reported_bugs_2, [],
- [otp_1128_2, otp_1129_2, otp_1131_2, otp_1162_2,
- otp_1222_2, otp_1298_2, otp_1331_2, otp_1338_2,
- otp_1342_2, otp_2776_2, otp_2979_2, otp_3187_2]},
- {reported_bugs_3, [],
- [otp_1128_3, otp_1129_3, otp_1131_3, otp_1162_3,
- otp_1222_3, otp_1298_3, otp_1331_3, otp_1338_3,
- otp_1342_3, otp_2776_3, otp_2979_3, otp_3187_3,
- otp_3542]},
- {tickets, [], [{group, otp_4394}]},
- {otp_4394, [], [otp_4394_test]}].
-
-init_per_group(otp_4394, Config) ->
- init_otp_4394(Config);
-init_per_group(v2_inform, Config) ->
- init_v2_inform(Config);
-init_per_group(multiple_reqs_2, Config) ->
- init_mul(Config);
-init_per_group(multiple_reqs, Config) ->
- init_mul(Config);
-init_per_group(test_multi_threaded, Config) ->
- init_mt(Config);
-init_per_group(test_v3, Config) ->
- init_v3(Config);
-init_per_group(test_v1_v2, Config) ->
- init_v1_v2(Config);
-init_per_group(test_v2, Config) ->
- init_v2(Config);
-init_per_group(test_v1, Config) ->
- init_v1(Config);
-init_per_group(mib_storage_varm_mnesia, Config) ->
- init_varm_mib_storage_mnesia(Config);
-init_per_group(mib_storage_varm_dets, Config) ->
- init_varm_mib_storage_dets(Config);
-init_per_group(mib_storage_size_check_mnesia, Config) ->
- init_size_check_msm(Config);
-init_per_group(mib_storage_size_check_dets, Config) ->
- init_size_check_msd(Config);
-init_per_group(mib_storage_size_check_ets, Config) ->
- init_size_check_mse(Config);
-init_per_group(mib_storage_mnesia, Config) ->
- init_mib_storage_mnesia(Config);
-init_per_group(mib_storage_dets, Config) ->
- init_mib_storage_dets(Config);
-init_per_group(mib_storage_ets, Config) ->
- init_mib_storage_ets(Config);
-init_per_group(_GroupName, Config) ->
- Config.
-
-end_per_group(otp_4394, Config) ->
- finish_otp_4394(Config);
-end_per_group(v2_inform, Config) ->
- finish_v2_inform(Config);
-end_per_group(multiple_reqs_2, Config) ->
- finish_mul(Config);
-end_per_group(multiple_reqs, Config) ->
- finish_mul(Config);
-end_per_group(test_multi_threaded, Config) ->
- finish_mt(Config);
-end_per_group(test_v3, Config) ->
- finish_v3(Config);
-end_per_group(test_v1_v2, Config) ->
- finish_v1_v2(Config);
-end_per_group(test_v2, Config) ->
- finish_v2(Config);
-end_per_group(test_v1, Config) ->
- finish_v1(Config);
-end_per_group(mib_storage_varm_mnesia, Config) ->
- finish_varm_mib_storage_mnesia(Config);
-end_per_group(mib_storage_varm_dets, Config) ->
- finish_varm_mib_storage_dets(Config);
-end_per_group(mib_storage_size_check_mnesia, Config) ->
- finish_size_check_msm(Config);
-end_per_group(mib_storage_size_check_dets, Config) ->
- finish_size_check_msd(Config);
-end_per_group(mib_storage_size_check_ets, Config) ->
- finish_size_check_mse(Config);
-end_per_group(mib_storage_mnesia, Config) ->
- finish_mib_storage_mnesia(Config);
-end_per_group(mib_storage_dets, Config) ->
- finish_mib_storage_dets(Config);
-end_per_group(mib_storage_ets, Config) ->
- finish_mib_storage_ets(Config);
-end_per_group(_GroupName, Config) ->
- Config.
-
-
-init_per_testcase(_Case, Config) when list(Config) ->
- Dog = test_server:timetrap(test_server:minutes(6)),
- [{watchdog, Dog}|Config].
-
-end_per_testcase(_Case, Config) when list(Config) ->
- Dog = ?config(watchdog, Config),
- test_server:timetrap_cancel(Dog),
- Config.
-
-cases() ->
- [
- app_info, {group, test_v1}, {group, test_v2},
- {group, test_v1_v2}, {group, test_v3},
- {group, test_multi_threaded}, {group, mib_storage},
- {group, tickets}
- ].
-
-
-%%%-----------------------------------------------------------------
-%%% The test case structure is as follows:
-%%%
-%%% init_all - starts mnesia,
-%%%
-%%% init_v1 - starts agent
-%%% simple
-%%% big - e.g. starts/stops subagent, load/unloads mibs
-%%% init_mul
-%%% mul_get
-%%% mul_set
-%%% <etc>
-%%% finish_mul
-%%% <etc>
-%%% finish_v1
-%%%
-%%% init_v2 - starts agent
-%%% finish_v2
-%%%
-%%% init_bilingual - starts agent
-%%% finish_bilingual
-%%%
-%%% finish_all
-%%%
-%%% There is still one problem with these testsuites. If one test
-%%% fails, it may not be possible to run some other cases, as it
-%%% may have e.g. created some row or loaded some table, that it
-%%% didn't undo (since it failed).
-%%%-----------------------------------------------------------------
-
-init_all(Config0) when list(Config0) ->
- ?LOG("init_all -> entry with"
- "~n Config0: ~p",[Config0]),
-
- %% --
- %% Fix config:
- %%
-
- DataDir0 = ?config(data_dir, Config0),
- DataDir1 = filename:split(filename:absname(DataDir0)),
- [_|DataDir2] = lists:reverse(DataDir1),
- DataDir3 = filename:join(lists:reverse(DataDir2) ++ [?snmp_test_data]),
- Config1 = lists:keydelete(data_dir, 1, Config0),
- Config = [{data_dir, DataDir3 ++ "/"}|Config1],
-
- %% --
- %% Start nodes
- %%
-
- ?line {ok, SaNode} = start_node(snmp_sa),
- ?line {ok, MgrNode} = start_node(snmp_mgr),
-
-
- %% --
- %% Create necessary files
- %%
-
- Dir = ?config(priv_dir, Config),
- ?DBG("init_all -> Dir ~p", [Dir]),
-
- DataDir = ?config(data_dir, Config),
- ?DBG("init_all -> DataDir ~p", [DataDir]),
-
- file:make_dir(MgrDir = filename:join(Dir, "mgr_dir/")),
- ?DBG("init_all -> MgrDir ~p", [MgrDir]),
-
- file:make_dir(AgentDir = filename:join(Dir, "agent_dir/")),
- ?DBG("init_all -> AgentDir ~p", [AgentDir]),
-
- file:make_dir(SaDir = filename:join(Dir, "sa_dir/")),
- ?DBG("init_all -> SaDir ~p", [SaDir]),
-
-
- %% --
- %% Start and initiate mnesia
- %%
-
- ?DBG("init_all -> load application mnesia", []),
- ?line ok = application:load(mnesia),
-
- ?DBG("init_all -> load application mnesia on node ~p", [SaNode]),
- ?line ok = rpc:call(SaNode, application, load, [mnesia]),
-
- ?DBG("init_all -> application mnesia: set_env dir",[]),
- ?line application_controller:set_env(mnesia, dir,
- filename:join(Dir, "Mnesia1")),
-
- ?DBG("init_all -> application mnesia: set_env dir on node ~p",[SaNode]),
- ?line rpc:call(SaNode, application_controller, set_env,
- [mnesia, dir, filename:join(Dir, "Mnesia2")]),
-
- ?DBG("init_all -> create mnesia schema",[]),
- ?line ok = mnesia:create_schema([SaNode, node()]),
-
- ?DBG("init_all -> start application mnesia",[]),
- ?line ok = application:start(mnesia),
-
- ?DBG("init_all -> start application mnesia on ~p",[SaNode]),
- ?line ok = rpc:call(SaNode, application, start, [mnesia]),
- Ip = ?LOCALHOST(),
- [{snmp_sa, SaNode},
- {snmp_mgr, MgrNode},
- {agent_dir, AgentDir ++ "/"},
- {mgr_dir, MgrDir ++ "/"},
- {sa_dir, SaDir ++ "/"},
- {mib_dir, DataDir},
- {ip, Ip} |
- Config].
-
-finish_all(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- stop_node(SaNode),
- stop_node(MgrNode),
- application:stop(mnesia).
-
-start_v1_agent(Config) when list(Config) ->
- start_agent(Config, [v1]).
-
-start_v1_agent(Config,Opts) when list(Config), list(Opts) ->
- start_agent(Config, [v1], Opts).
-
-start_v2_agent(Config) when list(Config) ->
- start_agent(Config, [v2]).
-
-start_v3_agent(Config) when list(Config) ->
- start_agent(Config, [v3]).
-
-start_bilingual_agent(Config) when list(Config) ->
- start_agent(Config, [v1,v2]).
-
-start_multi_threaded_agent(Config) when list(Config) ->
- start_agent(Config, [v2], [{snmp_multi_threaded, true}]).
-
-stop_agent(Config) when list(Config) ->
- ?LOG("stop_agent -> entry with"
- "~n Config: ~p",[Config]),
-
- {Sup, Par} = ?config(snmp_sup, Config),
- ?DBG("stop_agent -> attempt to stop (sup) ~p"
- "~n Sup: ~p"
- "~n Par: ~p",
- [Sup,
- (catch process_info(Sup)),
- (catch process_info(Par))]),
- stop_sup(Sup, Par),
-
- {Sup2, Par2} = ?config(snmp_sub, Config),
- ?DBG("stop_agent -> attempt to stop (sub) ~p"
- "~n Sup2: ~p"
- "~n Par2: ~p",
- [Sup2,
- (catch process_info(Sup2)),
- (catch process_info(Par2))]),
- stop_sup(Sup2, Par2),
-
- ?DBG("stop_agent -> done - now cleanup config", []),
- C1 = lists:keydelete(snmp_sup, 1, Config),
- lists:keydelete(snmp_sub, 1, C1).
-
-
-stop_sup(Pid, _) when node(Pid) == node() ->
- case (catch process_info(Pid)) of
- PI when list(PI) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- exit(Pid, kill),
- await_stopped(Pid, Ref);
- {'EXIT', _Reason} ->
- ?LOG("stop_sup -> ~p not running", [Pid]),
- ok
- end;
-stop_sup(Pid, _) ->
- ?LOG("stop_sup -> attempt to stop ~p", [Pid]),
- Ref = erlang:monitor(process, Pid),
- ?LOG("stop_sup -> Ref: ~p", [Ref]),
- %% Pid ! {'EXIT', Parent, shutdown}, % usch
- exit(Pid, kill),
- await_stopped(Pid, Ref).
-
-await_stopped(Pid, Ref) ->
- receive
- {'DOWN', Ref, process, Pid, _Reason} ->
- ?DBG("received down message for ~p", [Pid]),
- ok
- after 10000 ->
- ?INF("await_stopped -> timeout for ~p",[Pid]),
- erlang:demonitor(Ref),
- ?FAIL({failed_stop,Pid})
- end.
-
-
-start_agent(Config, Vsn) ->
- start_agent(Config, Vsn, []).
-start_agent(Config, Vsn, Opts) ->
- ?LOG("start_agent -> entry (~p) with"
- "~n Config: ~p"
- "~n Vsn: ~p"
- "~n Opts: ~p",[node(), Config, Vsn, Opts]),
-
- ?line AgentDir = ?config(agent_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
-
- snmp_app_env_init(vsn_init(Vsn) ++
- [{audit_trail_log, read_write_log},
- {audit_trail_log_dir, AgentDir},
- {audit_trail_log_size, {10240, 10}},
- {force_config_reload, false},
- {snmp_agent_type, master},
- {snmp_config_dir, AgentDir},
- {snmp_db_dir, AgentDir},
- {snmp_local_db_auto_repair, true},
- {snmp_master_agent_verbosity, trace},
- {snmp_supervisor_verbosity, trace},
- {snmp_mibserver_verbosity, trace},
- {snmp_symbolic_store_verbosity, trace},
- {snmp_note_store_verbosity, trace},
- {snmp_net_if_verbosity, trace}],
- Opts),
-
-
- process_flag(trap_exit,true),
-
- {ok, AppSup} = snmp_app_sup:start_link(),
- unlink(AppSup),
- ?DBG("start_agent -> snmp app supervisor: ~p",[AppSup]),
-
- ?DBG("start_agent -> start master agent (old style)",[]),
- Sup = case (catch snmpa_app:start(normal)) of
- {ok, S} ->
- ?DBG("start_agent -> started, Sup: ~p",[S]),
- S;
-
- Else ->
- ?DBG("start_agent -> unknown result: ~n~p",[Else]),
- %% Get info about the apps we depend on
- MnesiaInfo = mnesia_running(),
- ?FAIL({start_failed,Else,MnesiaInfo})
- end,
-
- ?DBG("start_agent -> unlink from supervisor",[]),
- ?line unlink(Sup),
- ?line SaDir = ?config(sa_dir, Config),
- ?DBG("start_agent -> (rpc) start sub on ~p",[SaNode]),
- ?line {ok, Sub} = rpc:call(SaNode, ?MODULE, start_sub, [SaDir]),
- ?DBG("start_agent -> done",[]),
- ?line [{snmp_sup, {Sup, self()}}, {snmp_sub, Sub} | Config].
-
-
-vsn_init(Vsn) ->
- vsn_init([v1,v2,v3], Vsn, []).
-
-vsn_init([], _Vsn, Acc) ->
- Acc;
-vsn_init([V|Vsns], Vsn, Acc) ->
- case lists:member(V, Vsn) of
- true ->
- vsn_init(Vsns, Vsn, [{V, true}|Acc]);
- false ->
- vsn_init(Vsns, Vsn, [{V, false}|Acc])
- end.
-
-snmp_app_env_init(Env0, Opts) ->
- ?DBG("snmp_app_env_init -> unload snmp",[]),
- ?line application:unload(snmp),
- ?DBG("snmp_app_env_init -> load snmp",[]),
- ?line application:load(snmp),
- ?DBG("snmp_app_env_init -> initiate (snmp) application env",[]),
- F1 = fun({Key,Val} = New, Acc0) ->
- ?DBG("snmp_app_env_init -> "
- "updating setting ~p to ~p", [Key, Val]),
- case lists:keyreplace(Key, 1, Acc0, New) of
- Acc0 ->
- [New|Acc0];
- Acc ->
- Acc
- end
- end,
- Env = lists:foldr(F1, Env0, Opts),
- ?DBG("snmp_app_env_init -> Env: ~p",[Env]),
- F2 = fun({Key,Val}) ->
- ?DBG("snmp_app_env_init -> setting ~p to ~p",[Key, Val]),
- application_controller:set_env(snmp, Key, Val)
- end,
- lists:foreach(F2, Env).
-
-
-
-
-%% Test if application is running
-mnesia_running() -> ?IS_MNESIA_RUNNING().
-crypto_running() -> ?IS_CRYPTO_RUNNING().
-
-
-start_sub(Dir) ->
- ?DBG("start_sub -> entry",[]),
- Opts = [{db_dir, Dir},
- {supervisor, [{verbosity, trace}]}],
- %% BMK BMK
-% {ok, P} = snmp_supervisor:start_sub(Dir),
- {ok, P} = snmpa_supervisor:start_sub_sup(Opts),
- unlink(P),
- {ok, {P, self()}}.
-
-create_tables(SaNode) ->
- ?line {atomic, ok} = mnesia:create_table([{name, friendsTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, kompissTable2},
- {ram_copies, [SaNode]},
- {snmp, [{key, integer}]},
- {attributes, [a1,a2,a3]}]),
- ?line {atomic, ok} = mnesia:create_table([{name, snmp_variables},
- {attributes, [a1,a2]}]).
-
-delete_tables() ->
- mnesia:delete_table(friendsTable2),
- mnesia:delete_table(kompissTable2),
- mnesia:delete_table(snmp_variables).
-
-%% Creation is done in runtime!
-delete_mib_storage_mnesia_tables() ->
- mnesia:delete_table(snmpa_mib_data),
- mnesia:delete_table(snmpa_mib_tree),
- mnesia:delete_table(snmpa_symbolic_store).
-
-%%-----------------------------------------------------------------
-%% A test case is always one of:
-%% - v1 specific case
-%% - v2 specific case
-%% - v1 and v2 case
-%% All v1 specific cases are prefixed with v1_, and all v2 with
-%% v2_. E.g. v1_trap/v2_trap.
-%%
-%% All other cases are shared. However, the testserver uses the name
-%% of the case to generate a file for that case. The same case cannot
-%% be used in different configurations in the same suite. Therefore
-%% all these functions exists in two variants, the base function
-%% <base>, and a second version <base>_2. There may be several
-%% versions as well, <base>_N.
-%%-----------------------------------------------------------------
-
-
-
-
-
-
-
-
-
-mib_storage_ets_cases() ->
-[mse_simple, mse_v1_processing, mse_big, mse_big2,
- mse_loop_mib, mse_api, mse_sa_register, mse_v1_trap,
- mse_sa_error, mse_next_across_sa, mse_undo,
- mse_standard_mib, mse_community_mib, mse_framework_mib,
- mse_target_mib, mse_notification_mib,
- mse_view_based_acm_mib, mse_sparse_table, mse_me_of,
- mse_mib_of].
-
-mib_storage_dets_cases() ->
-[msd_simple, msd_v1_processing, msd_big, msd_big2,
- msd_loop_mib, msd_api, msd_sa_register, msd_v1_trap,
- msd_sa_error, msd_next_across_sa, msd_undo,
- msd_standard_mib, msd_community_mib, msd_framework_mib,
- msd_target_mib, msd_notification_mib,
- msd_view_based_acm_mib, msd_sparse_table, msd_me_of,
- msd_mib_of].
-
-mib_storage_mnesia_cases() ->
-[msm_simple, msm_v1_processing, msm_big, msm_big2,
- msm_loop_mib, msm_api, msm_sa_register, msm_v1_trap,
- msm_sa_error, msm_next_across_sa, msm_undo,
- msm_standard_mib, msm_community_mib, msm_framework_mib,
- msm_target_mib, msm_notification_mib,
- msm_view_based_acm_mib, msm_sparse_table, msm_me_of,
- msm_mib_of].
-
-mse_size_check_cases() ->
-[mse_size_check].
-
-msd_size_check_cases() ->
-[msd_size_check].
-
-msm_size_check_cases() ->
-[msm_size_check].
-
-varm_mib_storage_dets_cases() ->
-[msd_varm_mib_start].
-
-varm_mib_storage_mnesia_cases() ->
-[msm_varm_mib_start].
-
-init_mib_storage_ets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,ets},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- init_ms(Config, [MibStorage]).
-
-init_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- init_ms(Config, [MibStorage]).
-
-init_ms(Config, Opts) when list(Config) ->
- ?LOG("init_mib_storage_ets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts1 = [MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity|Opts],
- [{vsn, v1} | start_v1_agent(Config,Opts1)].
-
-init_size_check_mse(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, ets},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msd(Config) when list(Config) ->
- AgentDir = ?GCONF(agent_dir, Config),
- MibStorage = {snmp_mib_storage, {dets, AgentDir}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_msm(Config) when list(Config) ->
- MibStorage = {snmp_mib_storage, {mnesia,[]}},
- init_size_check_ms(Config, [MibStorage]).
-
-init_size_check_ms(Config, Opts) when list(Config) ->
- SaNode = ?GCONF(snmp_sa, Config),
- %% We are using v3 here, so crypto must be supported or else...
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- create_tables(SaNode),
- AgentDir = ?GCONF(agent_dir, Config),
- MgrDir = ?GCONF(mgr_dir, Config),
- Ip = ?GCONF(ip, Config),
- ?line ok =
- config([v3], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_agent(Config, [v3], Opts)].
-
-init_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_dets -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{dets,AgentDir}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-init_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("init_varm_mib_storage_mnesia -> entry", []),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?GCONF(agent_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- MibStorage = {snmp_mib_storage,{mnesia,[]}},
- MasterAgentVerbosity = {snmp_master_agent_verbosity, trace},
- MibsVerbosity = {snmp_mibserver_verbosity, trace},
- SymStoreVerbosity = {snmp_symbolic_store_verbosity, trace},
- Opts = [MibStorage,MasterAgentVerbosity,MibsVerbosity,SymStoreVerbosity],
- [{vsn, v1}, {agent_opts,Opts} | Config].
-
-finish_mib_storage_ets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_ets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_mib_storage_dets -> entry", []),
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- C2 = lists:keydelete(vsn, 1, C1),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_dets(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_dets -> entry", []),
- delete_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_varm_mib_storage_mnesia(Config) when list(Config) ->
- ?LOG("finish_varm_mib_storage_mnesia -> entry", []),
- delete_tables(),
- delete_mib_storage_mnesia_tables(),
- %% C1 = stop_agent(Config), % In case something went wrong...
- delete_files(Config),
- C2 = lists:keydelete(vsn, 1, Config),
- lists:keydelete(agent_opts, 1, C2).
-
-finish_size_check_mse(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msd(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_msm(Config) when list(Config) ->
- finish_size_check_ms(Config).
-
-finish_size_check_ms(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%% These are just interface functions to fool the test server
-mse_simple(X) -> simple(X).
-mse_v1_processing(X) -> v1_processing(X).
-mse_big(X) -> big(X).
-mse_big2(X) -> big2(X).
-mse_loop_mib(X) -> loop_mib(X).
-mse_api(X) -> api(X).
-mse_sa_register(X) -> sa_register(X).
-mse_v1_trap(X) -> v1_trap(X).
-mse_sa_error(X) -> sa_error(X).
-mse_next_across_sa(X) -> next_across_sa(X).
-mse_undo(X) -> undo(X).
-mse_standard_mib(X) -> snmp_standard_mib(X).
-mse_community_mib(X) -> snmp_community_mib(X).
-mse_framework_mib(X) -> snmp_framework_mib(X).
-mse_target_mib(X) -> snmp_target_mib(X).
-mse_notification_mib(X) -> snmp_notification_mib(X).
-mse_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-mse_sparse_table(X) -> sparse_table(X).
-mse_me_of(X) -> ms_me_of(X).
-mse_mib_of(X) -> ms_mib_of(X).
-
-msd_simple(X) -> simple(X).
-msd_v1_processing(X) -> v1_processing(X).
-msd_big(X) -> big(X).
-msd_big2(X) -> big2(X).
-msd_loop_mib(X) -> loop_mib(X).
-msd_api(X) -> api(X).
-msd_sa_register(X) -> sa_register(X).
-msd_v1_trap(X) -> v1_trap(X).
-msd_sa_error(X) -> sa_error(X).
-msd_next_across_sa(X) -> next_across_sa(X).
-msd_undo(X) -> undo(X).
-msd_standard_mib(X) -> snmp_standard_mib(X).
-msd_community_mib(X) -> snmp_community_mib(X).
-msd_framework_mib(X) -> snmp_framework_mib(X).
-msd_target_mib(X) -> snmp_target_mib(X).
-msd_notification_mib(X) -> snmp_notification_mib(X).
-msd_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msd_sparse_table(X) -> sparse_table(X).
-msd_me_of(X) -> ms_me_of(X).
-msd_mib_of(X) -> ms_mib_of(X).
-
-msm_simple(X) -> simple(X).
-msm_v1_processing(X) -> v1_processing(X).
-msm_big(X) -> big(X).
-msm_big2(X) -> big2(X).
-msm_loop_mib(X) -> loop_mib(X).
-msm_api(X) -> api(X).
-msm_sa_register(X) -> sa_register(X).
-msm_v1_trap(X) -> v1_trap(X).
-msm_sa_error(X) -> sa_error(X).
-msm_next_across_sa(X) -> next_across_sa(X).
-msm_undo(X) -> undo(X).
-msm_standard_mib(X) -> snmp_standard_mib(X).
-msm_community_mib(X) -> snmp_community_mib(X).
-msm_framework_mib(X) -> snmp_framework_mib(X).
-msm_target_mib(X) -> snmp_target_mib(X).
-msm_notification_mib(X) -> snmp_notification_mib(X).
-msm_view_based_acm_mib(X) -> snmp_view_based_acm_mib(X).
-msm_sparse_table(X) -> sparse_table(X).
-msm_me_of(X) -> ms_me_of(X).
-msm_mib_of(X) -> ms_mib_of(X).
-
-
-mse_size_check(X) -> p("mse_size_check..."), ms_size_check(X).
-msd_size_check(X) -> p("msd_size_check..."), ms_size_check(X).
-msm_size_check(X) -> p("msm_size_check..."), ms_size_check(X).
-
-msd_varm_mib_start(X) -> p("msd_varm_mib_start..."), varm_mib_start(X).
-msm_varm_mib_start(X) -> p("msm_varm_mib_start..."), varm_mib_start(X).
-
-ms_size_check(suite) -> [];
-ms_size_check(Config) when list(Config) ->
- p("ms_size_check..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?LOG("mib server size check...", []),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMPv2-MIB"),
- ?line load_master_std("SNMPv2-TM"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMPv2-MIB"),
- ?line unload_master("SNMPv2-TM"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-
-varm_mib_start(suite) -> [];
-varm_mib_start(Config) when list(Config) ->
- p("varm_mib_start..."),
- ?LOG("varm_mib_start -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- %% Start the agent
- Opts = ?GCONF(agent_opts, Config),
- Config1 = start_v1_agent(Config, Opts),
-
- %% Sleep some in order for the agent to start properly
- ?DBG("varm_mib_start -> sleep some (before loading mobs)", []),
- ?SLEEP(5000),
-
- %% Load all the mibs
- HardwiredMibs = loaded_mibs(),
- ?DBG("varm_mib_start -> load all mibs", []),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
-
- %% Unload the hardwired mibs
- ?DBG("varm_mib_start -> sleep some (before unloading hardwired mibs)", []),
- ?SLEEP(1000),
- ?DBG("varm_mib_start -> unload (hardwired) mibs", []),
- ?line unload_mibs(HardwiredMibs), %% unload hardwired
-
- ?DBG("varm_mib_start -> sleep some (before stopping agent)", []),
- ?SLEEP(1000),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- Config2 = stop_agent(Config1),
-
- %% Sleep some in order for the agent to stop properly
- ?DBG("varm_mib_start -> sleep some (before re-starting the agent)", []),
- ?SLEEP(5000),
-
- %% Start the agent (again)
- ?DBG("varm_mib_start -> start the agent", []),
- Config3 = start_v1_agent(Config2, Opts),
-
- ?DBG("varm_mib_start -> sleep some (before starting tests)", []),
- ?SLEEP(5000),
-
- %% Perform the test(s)
- ?DBG("varm_mib_start -> perform the tests", []),
- try_test(snmp_community_mib),
- try_test(snmp_framework_mib),
- try_test(snmp_target_mib),
- try_test(snmp_notification_mib),
-
- %% Stop the agent (without deleting the stored files)
- ?DBG("varm_mib_start -> stop the agent", []),
- stop_agent(Config3),
- ok.
-
-
--define(snmpTrapCommunity_instance, [1,3,6,1,6,3,18,1,4,0]).
--define(vacmViewSpinLock_instance, [1,3,6,1,6,3,16,1,5,1,0]).
--define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-ms_me_of(suite) -> [];
-ms_me_of(Config) when list(Config) ->
- p("ms_me_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_me_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = me_of(?snmpTrapCommunity_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = me_of(?vacmViewSpinLock_instance),
-
- ?DBG("ms_me_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = me_of(?usmStatsNotInTimeWindows_instance),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-me_of(Oid) ->
- case snmpa:me_of(Oid) of
- {ok, #me{oid = Oid}} ->
- ok;
- {ok, #me{oid = OtherOid}} ->
- case lists:reverse(Oid) of
- [0|Rest] ->
- case lists:reverse(Rest) of
- OtherOid ->
- ok;
- AnotherOid ->
- {error, {invalid_oid, Oid, AnotherOid}}
- end;
- _ ->
- {error, {invalid_oid, Oid, OtherOid}}
- end;
- {error, Reason} ->
- {error, Reason};
- Else ->
- {error, Else}
- end.
-
-
-ms_mib_of(suite) -> [];
-ms_mib_of(Config) when list(Config) ->
- p("ms_mib_of..."),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?SLEEP(2000),
-
- ?line display_memory_usage(),
-
-
- ?DBG("ms_mib_of -> find ~w from SNMP-COMMUNITY-MIB",
- [?snmpTrapCommunity_instance]),
- ?line ok = mib_of(?snmpTrapCommunity_instance, 'SNMP-COMMUNITY-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
- [?vacmViewSpinLock_instance]),
- ?line ok = mib_of(?vacmViewSpinLock_instance, 'SNMP-VIEW-BASED-ACM-MIB'),
-
- ?DBG("ms_mib_of -> find ~w from SNMP-USER-BASED-SM-MIB",
- [?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = mib_of(?usmStatsNotInTimeWindows_instance,
- 'SNMP-USER-BASED-SM-MIB'),
-
-
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
-
- ok.
-
-mib_of(Oid, ExpectedMibName) ->
- ?DBG("mib_of -> entry with"
- "~n Oid: ~p"
- "~n ExpectedMibName: ~p", [Oid, ExpectedMibName]),
- %% case snmpa:mib_of(Oid) of
- MibOf = snmpa:mib_of(Oid),
- ?DBG("mib_of -> MibOf: ~n~p", [MibOf]),
- case MibOf of
- {ok, ExpectedMibName} ->
- ok;
- {ok, OtherMibName} ->
- {error, {invalid_mib, ExpectedMibName, OtherMibName}};
- {error, Reason} ->
- {error, Reason};
- Else ->
- ?DBG("mib_of -> Else: ~n~p", [Else]),
- {error, Else}
- end.
-
-
-app_info(suite) -> [];
-app_info(Config) when list(Config) ->
- SnmpDir = app_dir(snmp),
- SslDir = app_dir(ssl),
- CryptoDir = app_dir(crypto),
- Attr = snmp:module_info(attributes),
- AppVsn =
- case lists:keysearch(app_vsn, 1, Attr) of
- {value, {app_vsn, V}} ->
- V;
- false ->
- "undefined"
- end,
- io:format("Root dir: ~s~n"
- "SNMP: Application dir: ~s~n"
- " Application ver: ~s~n"
- "SSL: Application dir: ~s~n"
- "CRYPTO: Application dir: ~s~n",
- [code:root_dir(), SnmpDir, AppVsn, SslDir, CryptoDir]),
- ok.
-
-app_dir(App) ->
- case code:lib_dir(App) of
- D when list(D) ->
- filename:basename(D);
- {error, _Reason} ->
- "undefined"
- end.
-
-
-
-%v1_cases() -> [loop_mib];
-v1_cases() ->
-[simple, db_notify_client, v1_processing, big, big2,
- loop_mib, api, subagent, mnesia, {group, multiple_reqs},
- sa_register, v1_trap, sa_error, next_across_sa, undo,
- {group, reported_bugs}, {group, standard_mibs},
- sparse_table, cnt_64, opaque, change_target_addr_config].
-
-init_v1(Config) when list(Config) ->
- ?line SaNode = ?config(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line config([v1], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v1} | start_v1_agent(Config)].
-
-finish_v1(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v2_cases() -> [loop_mib_2];
-v2_cases() ->
-[simple_2, v2_processing, big_2, big2_2, loop_mib_2,
- api_2, subagent_2, mnesia_2, {group, multiple_reqs_2},
- sa_register_2, v2_trap, {group, v2_inform}, sa_error_2,
- next_across_sa_2, undo_2, {group, reported_bugs_2},
- {group, standard_mibs_2}, v2_types, implied,
- sparse_table_2, cnt_64_2, opaque_2, v2_caps].
-
-init_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_v2_agent(Config)].
-
-finish_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-v1_v2_cases() ->
-[simple_bi].
-
-init_v1_v2(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- config([v1,v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, bilingual} | start_bilingual_agent(Config)].
-
-finish_v1_v2(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-%v3_cases() -> [loop_mib_3];
-v3_cases() ->
-[simple_3, v3_processing, big_3, big2_3, api_3,
- subagent_3, mnesia_3, loop_mib_3, multiple_reqs_3,
- sa_register_3, v3_trap, v3_inform, sa_error_3,
- next_across_sa_3, undo_3, {group, reported_bugs_3},
- {group, standard_mibs_3}, {group, v3_security},
- v2_types_3, implied_3, sparse_table_3, cnt_64_3,
- opaque_3, v2_caps_3].
-
-init_v3(Config) when list(Config) ->
- %% Make sure crypto works, otherwise start_agent will fail
- %% and we will be stuck with a bunch of mnesia tables for
- %% the rest of this suite...
- ?DBG("start_agent -> start crypto app",[]),
- case ?CRYPTO_START() of
- ok ->
- case ?CRYPTO_SUPPORT() of
- {no, Reason} ->
- ?SKIP({unsupported_encryption, Reason});
- yes ->
- ok
- end;
- {error, Reason} ->
- ?SKIP({failed_starting_crypto, Reason})
- end,
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v3], MgrDir, AgentDir,
- tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v3} | start_v3_agent(Config)].
-
-finish_v3(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-
-mt_cases() ->
-[multi_threaded, mt_trap].
-
-init_mt(Config) when list(Config) ->
- SaNode = ?config(snmp_sa, Config),
- create_tables(SaNode),
- AgentDir = ?config(agent_dir, Config),
- MgrDir = ?config(mgr_dir, Config),
- Ip = ?config(ip, Config),
- ?line ok = config([v2], MgrDir, AgentDir, tuple_to_list(Ip), tuple_to_list(Ip)),
- [{vsn, v2} | start_multi_threaded_agent(Config)].
-
-finish_mt(Config) when list(Config) ->
- delete_tables(),
- C1 = stop_agent(Config),
- delete_files(C1),
- lists:keydelete(vsn, 1, C1).
-
-%% This one *must* be run first in each case.
-init_case(Config) when list(Config) ->
- ?DBG("init_case -> entry with"
- "~n Config: ~p", [Config]),
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
- MasterNode = node(),
-
- SaHost = ?HOSTNAME(SaNode),
- MgrHost = ?HOSTNAME(MgrNode),
- MasterHost = ?HOSTNAME(MasterNode),
- {ok, MasterIP} = snmp_misc:ip(MasterHost),
- {ok, MIP} = snmp_misc:ip(MgrHost),
- {ok, SIP} = snmp_misc:ip(SaHost),
-
-
- put(mgr_node, MgrNode),
- put(sa_node, SaNode),
- put(master_node, MasterNode),
- put(sa_host, SaHost),
- put(mgr_host, MgrHost),
- put(master_host, MasterHost),
- put(mip, tuple_to_list(MIP)),
- put(masterip , tuple_to_list(MasterIP)),
- put(sip, tuple_to_list(SIP)),
-
- MibDir = ?config(mib_dir, Config),
- put(mib_dir, MibDir),
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- put(std_mib_dir, StdM),
-
- MgrDir = ?config(mgr_dir, Config),
- put(mgr_dir, MgrDir),
-
- put(vsn, ?config(vsn, Config)),
- ?DBG("init_case -> exit with"
- "~n MasterNode: ~p"
- "~n SaNode: ~p"
- "~n MgrNode: ~p"
- "~n MibDir: ~p", [MasterNode, SaNode, MgrNode, MibDir]),
- {SaNode, MgrNode, MibDir}.
-
-load_master(Mib) ->
- ?DBG("load_master -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(mib_dir) ++ Mib]).
-
-load_master_std(Mib) ->
- ?DBG("load_master_std -> entry with"
- "~n Mib: ~p", [Mib]),
- snmpa:unload_mibs(snmp_master_agent, [Mib]), % Unload for safety
- ok = snmpa:load_mibs(snmp_master_agent, [get(std_mib_dir) ++ Mib]).
-
-unload_master(Mib) ->
- ?DBG("unload_master -> entry with"
- "~n Mib: ~p", [Mib]),
- ok = snmpa:unload_mibs(snmp_master_agent, [Mib]).
-
-loaded_mibs() ->
- ?DBG("loaded_mibs -> entry",[]),
- Info = snmpa:info(snmp_master_agent),
- {value, {loaded_mibs, Mibs}} = lists:keysearch(loaded_mibs, 1, Info),
- [atom_to_list(Mib) || {Mib,_,_} <- Mibs].
-
-unload_mibs(Mibs) ->
- ?DBG("unload_mibs -> entry with"
- "~n Mibs: ~p", [Mibs]),
- ok = snmpa:unload_mibs(snmp_master_agent, Mibs).
-
-start_subagent(SaNode, RegTree, Mib) ->
- ?DBG("start_subagent -> entry with"
- "~n SaNode: ~p"
- "~n RegTree: ~p"
- "~n Mib: ~p", [SaNode, RegTree, Mib]),
- MA = whereis(snmp_master_agent),
- ?DBG("start_subagent -> MA: ~p", [MA]),
- MibDir = get(mib_dir),
- Mib1 = join(MibDir,Mib),
- %% BMK BMK
-% case rpc:call(SaNode,snmp_supervisor,start_subagent,[MA,RegTree,[Mib1]]) of
- case rpc:call(SaNode, snmpa_supervisor,
- start_sub_agent, [MA, RegTree, [Mib1]]) of
- {ok, SA} ->
- ?DBG("start_subagent -> SA: ~p", [SA]),
- {ok, SA};
- Error ->
- ?FAIL({subagent_start_failed, SaNode, Error, [MA, RegTree, Mib1]})
- end.
-
-stop_subagent(SA) ->
- ?DBG("stop_subagent -> entry with"
- "~n SA: ~p", [SA]),
- %% BNK BMK
- %% rpc:call(node(SA), snmp_supervisor, stop_subagent, [SA]).
- rpc:call(node(SA), snmpa_supervisor, stop_sub_agent, [SA]).
-
-%%-----------------------------------------------------------------
-%% This function takes care of the old OTP-SNMPEA-MIB.
-%% Unfortunately, the testcases were written to use the data in the
-%% internal tables, and these table are now obsolete and not used
-%% by the agent. Therefore, we emulate them by using
-%% OLD-SNMPEA-MIB, which uses the default impl. of all tables.
-%%
-%% These two rows must exist in intCommunityTable
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
-%% (But with the manager's IP address)
-%%
-%%-----------------------------------------------------------------
-init_old() ->
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [6 | "public"],
- {get(mip), "public", 2, 2}),
- snmpa_local_db:table_create_row(intCommunityTable,
- get(mip) ++ [13 | "standard trap"],
- {get(mip), "standard trap", 2, 1}),
- snmpa_local_db:variable_set(intAgentIpAddress, [127,0,0,1]).
-
-
-
-simple(suite) -> [];
-simple(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(simple_standard_test).
-
-simple_2(X) -> simple(X).
-
-simple_bi(suite) -> [];
-simple_bi(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(vsn, v1), % First, try v1 manager
- try_test(simple_standard_test),
-
- put(vsn, v2), % Then, try v2 manager
- try_test(simple_standard_test).
-
-simple_3(X) ->
- simple(X).
-
-big(suite) -> [];
-big(Config) when list(Config) ->
- ?DBG("big -> entry", []),
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?DBG("big -> SA: ~p", [SA]),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-big_2(X) -> big(X).
-
-big_3(X) -> big(X).
-
-
-big2(suite) -> [];
-big2(Config) when list(Config) ->
- %% This is exactly the same tests as 'big', but with the
- %% v2 equivalent of the mibs.
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1-v2"),
- ?line load_master("OLD-SNMPEA-MIB-v2"),
- ?line init_old(),
- try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB-v2").
-
-big2_2(X) -> big2(X).
-
-big2_3(X) -> big2(X).
-
-
-multi_threaded(suite) -> [];
-multi_threaded(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(multi_threaded_test),
- ?line unload_master("Test1").
-
-mt_trap(suite) -> [];
-mt_trap(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- ?line load_master("TestTrapv2"),
- try_test(mt_trap_test, [MA]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("Test1").
-
-v2_types(suite) -> [];
-v2_types(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(types_v2_test),
- ?line unload_master("Test1").
-
-v2_types_3(X) -> v2_types(X).
-
-
-implied(suite) -> [];
-implied(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(implied_test,[MA]),
- ?line unload_master("Test1").
-
-implied_3(X) -> implied(X).
-
-
-sparse_table(suite) -> [];
-sparse_table(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(sparse_table_test),
- ?line unload_master("Test1").
-
-sparse_table_2(X) -> sparse_table(X).
-
-sparse_table_3(X) -> sparse_table(X).
-
-cnt_64(suite) -> [];
-cnt_64(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test1"),
- try_test(cnt_64_test, [MA]),
- ?line unload_master("Test1").
-
-cnt_64_2(X) -> cnt_64(X).
-
-cnt_64_3(X) -> cnt_64(X).
-
-opaque(suite) -> [];
-opaque(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test1"),
- try_test(opaque_test),
- ?line unload_master("Test1").
-
-opaque_2(X) -> opaque(X).
-
-opaque_3(X) -> opaque(X).
-
-
-change_target_addr_config(suite) -> [];
-change_target_addr_config(Config) when list(Config) ->
- p("Testing changing target address config..."),
- ?LOG("change_target_addr_config -> entry",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- put(sname,snmp_suite),
- put(verbosity,trace),
-
- MA = whereis(snmp_master_agent),
-
- ?LOG("change_target_addr_config -> load TestTrap",[]),
- ?line load_master("TestTrap"),
-
- ?LOG("change_target_addr_config -> set trace verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,trace),
-
- %% First send some traps that will arive att the original manager
- ?LOG("change_target_addr_config -> send trap",[]),
- try_test(ma_trap1, [MA]),
-
- ?LOG("change_target_addr_config -> set silence verbosity for local_db",[]),
- ?line snmpa:verbosity(local_db,silence),
-
- %% Start new dummy listener
- ?LOG("change_target_addr_config -> start dummy manager",[]),
- ?line {ok,Pid,NewPort} = dummy_manager_start(MA),
-
- %% Reconfigure
- ?LOG("change_target_addr_config -> reconfigure",[]),
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_addr_conf(AgentDir, NewPort),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- %% Send the trap again
- ?LOG("change_target_addr_config -> send trap again",[]),
- catch dummy_manager_send_trap2(Pid),
-
- ?LOG("change_target_addr_config -> await trap ack",[]),
- catch dummy_manager_await_trap2_ack(),
-
- ?LOG("change_target_addr_config -> stop dummy manager",[]),
- ?line ok = dummy_manager_stop(Pid),
-
- ?LOG("change_target_addr_config -> reset target address config",[]),
- ?line reset_target_addr_conf(AgentDir),
-
- ?LOG("change_target_addr_config -> unload TestTrap",[]),
- ?line unload_master("TestTrap").
-
-
-dummy_manager_start(MA) ->
- ?DBG("dummy_manager_start -> entry",[]),
- Pid = spawn(get(mgr_node), ?MODULE,dummy_manager_init,[self(),MA]),
- ?DBG("dummy_manager_start -> Pid: ~p",[Pid]),
- await_dummy_manager_started(Pid).
-
-await_dummy_manager_started(Pid) ->
- receive
- {dummy_manager_started,Pid,Port} ->
- ?DBG("dummy_manager_start -> acknowledge received with"
- "~n Port: ~p",[Port]),
- {ok,Pid,Port};
- {'EXIT', Pid, Reason} ->
- {error, Pid, Reason};
- O ->
- ?LOG("dummy_manager_start -> received unknown message:"
- "~n ~p",[O]),
- await_dummy_manager_started(Pid)
- end.
-
-dummy_manager_stop(Pid) ->
- ?DBG("dummy_manager_stop -> entry with Pid: ~p",[Pid]),
- Pid ! stop,
- receive
- {dummy_manager_stopping, Pid} ->
- ?DBG("dummy_manager_stop -> acknowledge received",[]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_stop -> timeout",[]),
- timeout
- end.
-
-dummy_manager_send_trap2(Pid) ->
- ?DBG("dummy_manager_send_trap2 -> entry",[]),
- Pid ! {send_trap,testTrap2}.
-
-dummy_manager_await_trap2_ack() ->
- ?DBG("dummy_manager_await_trap2 -> entry",[]),
- receive
- {received_trap,Trap} ->
- ?LOG("dummy_manager_await_trap2 -> received trap: ~p",[Trap]),
- %% Note:
- %% Without this sleep the v2_inform_i testcase failes! There
- %% is no relation between these two test cases as far as I
- %% able to figure out...
- sleep(60000),
- ok;
- O ->
- ?ERR("dummy_manager_await_trap2 -> unexpected message: ~p",[O]),
- ok
- after 10000 ->
- ?ERR("dummy_manager_await_trap2 -> timeout",[]),
- timeout
- end.
-
-dummy_manager_init(Parent,MA) ->
- ?DBG("dummy_manager_init -> entry with"
- "~n Parent: ~p"
- "~n MA: ~p",[Parent,MA]),
- {ok,S} = gen_udp:open(0,[{recbuf,65535}]),
- ?DBG("dummy_manager_init -> S: ~p",[S]),
- {ok,Port} = inet:port(S),
- ?DBG("dummy_manager_init -> Port: ~p",[Port]),
- Parent ! {dummy_manager_started,self(),Port},
- dummy_manager_loop(Parent,S,MA).
-
-dummy_manager_loop(P,S,MA) ->
- ?LOG("dummy_manager_loop -> ready for receive",[]),
- receive
- {send_trap,Trap} ->
- ?LOG("dummy_manager_loop -> received trap send request"
- "~n Trap: ~p",[Trap]),
- snmpa:send_trap(MA, Trap, "standard trap"),
- dummy_manager_loop(P,S,MA);
- {udp, _UdpId, Ip, UdpPort, Bytes} ->
- ?LOG("dummy_manager_loop -> received upd message"
- "~n from: ~p:~p"
- "~n size: ~p",
- [Ip, UdpPort, dummy_manager_message_sz(Bytes)]),
- R = dummy_manager_handle_message(Bytes),
- ?DBG("dummy_manager_loop -> R: ~p",[R]),
- P ! R,
- dummy_manager_loop(P,S,MA);
- stop ->
- ?DBG("dummy_manager_loop -> received stop request",[]),
- P ! {dummy_manager_stopping, self()},
- gen_udp:close(S),
- exit(normal);
- O ->
- ?LOG("dummy_manager_loop -> received unknown message:"
- "~n ~p",[O]),
- dummy_manager_loop(P,S,MA)
- end.
-
-dummy_manager_message_sz(B) when binary(B) ->
- size(B);
-dummy_manager_message_sz(L) when list(L) ->
- length(L);
-dummy_manager_message_sz(_) ->
- undefined.
-
-dummy_manager_handle_message(Bytes) ->
- case (catch snmp_pdus:dec_message(Bytes)) of
- {'EXIT',Reason} ->
- ?ERR("dummy_manager_handle_message -> "
- "failed decoding message only:~n ~p",[Reason]),
- {error,Reason};
- M ->
- ?DBG("dummy_manager_handle_message -> decoded message:"
- "~n ~p",[M]),
- {received_trap,M}
- end.
-
-
-api(suite) -> [];
-api(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(api_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-api_2(X) -> api(X).
-
-api_3(X) -> api(X).
-
-
-subagent(suite) -> [];
-subagent(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- try_test(load_test_sa),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
-
- p("Loading previous subagent mib in master and testing..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(load_test),
-
- p("Unloading previous subagent mib in master and testing..."),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas1"]),
- try_test(unreg_test),
- p("Testing register subagent..."),
- rpc:call(SaNode, snmp, register_subagent,
- [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- ?line stop_subagent(SA),
- try_test(unreg_test).
-
-subagent_2(X) -> subagent(X).
-
-subagent_3(X) -> subagent(X).
-
-
-mnesia(suite) -> [];
-mnesia(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Starting subagent with mnesia impl..."),
- {ok, SA} = start_subagent(SaNode, ?klas2, "Klas2"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
-
- try_test(big_test_2),
-
- p("Testing unregister subagent..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, SA]),
- try_test(unreg_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA).
-
-mnesia_2(X) -> mnesia(X).
-
-mnesia_3(X) -> mnesia(X).
-
-
-
-mul_cases() ->
-[mul_get, mul_get_err, mul_next, mul_next_err,
- mul_set_err].
-
-
-multiple_reqs_3(_X) ->
- {req, [], {conf, init_mul, mul_cases_3(), finish_mul}}.
-
-
-mul_cases_2() ->
-[mul_get_2, mul_get_err_2, mul_next_2, mul_next_err_2,
- mul_set_err_2].
-
-
-mul_cases_3() ->
- [mul_get_3, mul_get_err_3, mul_next_3, mul_next_err_3, mul_set_err_3].
-
-
-init_mul(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- [{mul_sub, SA} | Config].
-
-finish_mul(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- SA = ?config(mul_sub, Config),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA),
- lists:keydelete(mul_sub, 1, Config).
-
-mul_get(suite) -> [];
-mul_get(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get..."),
- try_test(do_mul_get).
-
-mul_get_2(X) -> mul_get(X).
-
-mul_get_3(X) -> mul_get(X).
-
-
-mul_get_err(suite) -> [];
-mul_get_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple get with error..."),
- try_test(do_mul_get_err).
-
-mul_get_err_2(X) -> mul_get_err(X).
-
-mul_get_err_3(X) -> mul_get_err(X).
-
-
-mul_next(suite) -> [];
-mul_next(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next).
-
-mul_next_2(X) -> mul_next(X).
-
-mul_next_3(X) -> mul_next(X).
-
-
-mul_next_err(suite) -> [];
-mul_next_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple next..."),
- try_test(do_mul_next_err).
-
-mul_next_err_2(X) -> mul_next_err(X).
-
-mul_next_err_3(X) -> mul_next_err(X).
-
-
-mul_set(suite) -> [];
-mul_set(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set..."),
- try_test(do_mul_set).
-
-mul_set_2(X) -> mul_set(X).
-
-mul_set_3(X) -> mul_set(X).
-
-
-mul_set_err(suite) -> [];
-mul_set_err(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing multiple set with error..."),
- try_test(do_mul_set_err).
-
-mul_set_err_2(X) -> mul_set_err(X).
-
-mul_set_err_3(X) -> mul_set_err(X).
-
-
-sa_register(suite) -> [];
-sa_register(Config) when list(Config) ->
- ?DBG("sa_register -> entry", []),
- {SaNode, _MgrNode, MibDir} = init_case(Config),
-
- ?DBG("sa_register -> start subagent", []),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
-
- ?DBG("sa_register -> unregister subagent", []),
- p("Testing unregister subagent (2)..."),
- MA = whereis(snmp_master_agent),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Loading SA-MIB..."),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- ?DBG("sa_register -> unload mibs", []),
- snmpa:load_mibs(SA, [MibDir ++ "SA-MIB"]),
- ?DBG("sa_register -> register subagent", []),
- rpc:call(SaNode, snmp, register_subagent, [MA,?sa,SA]),
- try_test(sa_mib),
-
- ?DBG("sa_register -> stop subagent", []),
- ?line stop_subagent(SA).
-
-sa_register_2(X) -> sa_register(X).
-
-sa_register_3(X) -> sa_register(X).
-
-
-v1_trap(suite) -> [];
-v1_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_trap1, [MA]),
- try_test(ma_trap2, [MA]),
- try_test(ma_v2_2_v1_trap, [MA]),
- try_test(ma_v2_2_v1_trap2, [MA]),
-
- p("Testing trap sending from subagent..."),
- try_test(sa_trap1, [SA]),
- try_test(sa_trap2, [SA]),
- try_test(sa_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v2_trap(suite) -> [];
-v2_trap(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing trap sending from master agent..."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
-
- try_test(ma_v2_trap1, [MA]),
- try_test(ma_v2_trap2, [MA]),
- try_test(ma_v1_2_v2_trap, [MA]),
- try_test(ma_v1_2_v2_trap2, [MA]),
-
- try_test(sa_mib),
- p("Testing trap sending from subagent..."),
- try_test(sa_v1_2_v2_trap1, [SA]),
- try_test(sa_v1_2_v2_trap2, [SA]),
- try_test(sa_v1_2_v2_trap3, [SA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
-
- ?line stop_subagent(SA).
-
-v3_trap(X) ->
- v2_trap(X).
-
-
-v3_inform(_X) ->
- %% v2_inform(X).
- {req, [], {conf, init_v3_inform, [v3_inform_i], finish_v3_inform}}.
-
-init_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-init_v3_inform(X) ->
- init_v2_inform(X).
-
-finish_v2_inform(Config) when list(Config) ->
- _Dir = ?config(agent_dir, Config),
-% snmp_internal_mib:configure(Dir),
- Config.
-
-finish_v3_inform(X) ->
- finish_v2_inform(X).
-
-
-
-v2_inform_i(suite) -> [];
-v2_inform_i(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- p("Testing inform sending from master agent... NOTE! This test\ntakes a "
- "few minutes (5) to complete."),
- MA = whereis(snmp_master_agent),
-
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(ma_v2_inform1, [MA]),
-
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2").
-
-v3_inform_i(X) -> v2_inform_i(X).
-
-
-sa_error(suite) -> [];
-sa_error(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing sa bad value (is_set_ok)..."),
- try_test(sa_errs_bad_value),
-
- p("Testing sa gen err (set)..."),
- try_test(sa_errs_gen_err),
-
- p("Testing too big..."),
- try_test(sa_too_big),
-
- ?line unload_master("OLD-SNMPEA-MIB"),
- stop_subagent(SA).
-
-sa_error_2(X) -> sa_error(X).
-
-sa_error_3(X) -> sa_error(X).
-
-
-next_across_sa(suite) -> [];
-next_across_sa(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Loading another subagent mib..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas1"]),
-
- rpc:call(SaNode, snmp, register_subagent, [MA, ?klas1, SA]),
- try_test(load_test_sa),
-
- p("Testing next across subagent (endOfMibView from SA)..."),
- try_test(next_across_sa),
-
- p("Unloading mib"),
- snmpa:unload_mibs(SA, [MibDir ++ "Klas1"]),
- rpc:call(SaNode, snmp, unregister_subagent, [MA, ?klas1]),
- try_test(unreg_test),
-
- p("Starting another subagent"),
- ?line {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
- p("Testing next across subagent (wrong prefix from SA)..."),
- try_test(next_across_sa),
-
- stop_subagent(SA),
- stop_subagent(SA2).
-
-next_across_sa_2(X) -> next_across_sa(X).
-
-next_across_sa_3(X) -> next_across_sa(X).
-
-
-undo(suite) -> [];
-undo(Config) when list(Config) ->
- {SaNode, _MgrNode, MibDir} = init_case(Config),
- MA = whereis(snmp_master_agent),
-
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
-
- p("Testing undo phase at master agent..."),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(MA, [MibDir ++ "Klas4"]),
- try_test(undo_test),
- try_test(api_test2),
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas3"]),
-
- p("Testing bad return values from instrum. funcs..."),
- try_test(bad_return),
-
- ?line ok = snmpa:unload_mibs(MA, [MibDir ++ "Klas4"]),
-
- p("Testing undo phase at subagent..."),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas3"]),
- ?line ok = snmpa:load_mibs(SA, [MibDir ++ "Klas4"]),
- ?line ok = snmpa:register_subagent(MA, ?klas3, SA),
- ?line ok = snmpa:register_subagent(MA, ?klas4, SA),
- try_test(undo_test),
- try_test(api_test3),
-
- p("Testing undo phase across master/subagents..."),
- try_test(undo_test),
- try_test(api_test3),
- stop_subagent(SA).
-
-undo_2(X) -> undo(X).
-
-undo_3(X) -> undo(X).
-
-%% Req. Test2
-v1_processing(suite) -> [];
-v1_processing(Config) when list(Config) ->
- ?DBG("v1_processing -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v1_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v2_processing(suite) -> [];
-v2_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc),
- ?line unload_master("Test2").
-
-%% Req. Test2
-v3_processing(suite) -> [];
-v3_processing(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("Test2"),
- try_test(v2_proc), % same as v2!
- ?line unload_master("Test2").
-
-
-%% We'll try get/set/trap and inform for all the auth & priv protocols.
-%% For informs, the mgr is auth-engine. The agent has to sync. This is
-%% accomplished by the first inform sent. That one will generate a
-%% report, which makes it in sync. The notification-generating
-%% application times out, and send again. This time it'll work.
-
-v3_crypto_basic(suite) -> [];
-v3_crypto_basic(_Config) ->
- EID = [0,0,0,0,0,0,0,0,0,0,0,2],
- %% From rfc2274 appendix A.3.1
- ?line KMd5_1 = snmp:passwd2localized_key(md5, "maplesyrup", EID),
- ?line [16#52,16#6f,16#5e,16#ed,16#9f,16#cc,16#e2,16#6f,
- 16#89,16#64,16#c2,16#93,16#07,16#87,16#d8,16#2b] =
- KMd5_1,
- %% From rfc2274 appendix A.3.2
- ?line KSHA_1 = snmp:passwd2localized_key(sha, "maplesyrup", EID),
- ?line [16#66,16#95,16#fe,16#bc,16#92,16#88,16#e3,16#62,16#82,16#23,
- 16#5f,16#c7,16#15,16#1f,16#12,16#84,16#97,16#b3,16#8f,16#3f] =
- KSHA_1,
- %% From rfc2274, appendix A.5.1
- ?line KMd5_2 = snmp:passwd2localized_key(md5, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#88,16#05,16#61,16#51,16#41,16#67,16#6c,16#c9,
- 16#19,16#61,16#74,16#e7,16#42,16#a3,16#25,16#51] =
- snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- %% From rfc2274, appendix A.5.2
- ?line KSHA_2 = snmp:passwd2localized_key(sha, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#9c,16#10,16#17,16#f4,
- 16#fd,16#48,16#3d,16#2d,16#e8,16#d5,16#fa,16#db,
- 16#f8,16#43,16#92,16#cb,16#06,16#45,16#70,16#51] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2, 20,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
- KSHA_1t = lists:sublist(KSHA_1, 16),
- KSHA_2t = lists:sublist(KSHA_2, 16),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
- 16#7e,16#f8,16#d8,16#a4,16#c9,16#cd,16#b2,16#6b,
- 16#47,16#59,16#1c,16#d8,16#52,16#ff,16#88,16#b5] =
- snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1t, KSHA_2t, 16,
- [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
-
- %% Try with correct random
- ?line Kc1 = snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2),
- ?line KMd5_2 = snmp_user_based_sm_mib:extract_new_key(md5, KMd5_1, Kc1),
- ?line Kc2 = snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2),
- ?line KSHA_2 = snmp_user_based_sm_mib:extract_new_key(sha, KSHA_1, Kc2),
- ok.
-
-
-
-v3_md5_auth(suite) -> [];
-v3_md5_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing MD5 authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authMD5", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authMD5"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_sha_auth(suite) -> [];
-v3_sha_auth(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing SHA authentication...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "authSHA", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authNoPriv}, {user, "authSHA"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-v3_des_priv(suite) -> [];
-v3_des_priv(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- p("Testing DES encryption...takes a few seconds..."),
-
- AgentDir = ?config(agent_dir, Config),
- ?line rewrite_target_params_conf(AgentDir, "privDES", authPriv),
- ?line snmp_target_mib:reconfigure(AgentDir),
-
- MA = whereis(snmp_master_agent),
-
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
-
- try_test(v3_sync, [[{v2_proc, []},
- {ma_v2_trap1, [MA]},
- {v3_inform_sync, [MA]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentDir).
-
-%% -define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-
-%% Make sure mgr is in sync with agent
-v3_sync(Funcs) ->
- ?DBG("v3_sync -> entry with Funcs: ~p",[Funcs]),
- g([[sysDescr, 0]]),
- expect(432, report, [{?usmStatsNotInTimeWindows_instance, any}]),
- g([[sysDescr, 0]]),
- expect(433, [{[sysDescr,0], any}]),
- lists:foreach(fun({Func, Args}) -> apply(?MODULE, Func, Args) end, Funcs).
-
-v3_inform_sync(MA) ->
- ?DBG("v3_sync -> entry with MA: ~p => Send notification",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver,
- "standard inform", []),
- %% Make sure agent is in sync with mgr...
- ?DBG("v3_sync -> wait some time: ",[]),
- sleep(20000), % more than 1500*10 in target_addr.conf
- ?DBG("v3_sync -> await response",[]),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]).
-
-
-v2_caps(suite) -> [];
-v2_caps(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- try_test(v2_caps_i, [node()]).
-
-v2_caps_3(X) -> v2_caps(X).
-
-
-v2_caps_i(Node) ->
- ?line Idx = rpc:call(Node, snmp, add_agent_caps, [[1,2,3,4,5], "test cap"]),
- g([[sysORID, Idx], [sysORDescr, Idx]]),
- ?line expect(1, [{[sysORID, Idx], [1,2,3,4,5]},
- {[sysORDescr, Idx], "test cap"}]),
- ?line rpc:call(Node, snmp, del_agent_caps, [Idx]),
- g([[sysORID, Idx]]),
- ?line expect(2, [{[sysORID, Idx], noSuchInstance}]).
-
-
-%% Req. Test2
-v1_proc() ->
- ?DBG("v1_proc -> entry", []),
- %% According to RFC1157.
- %% Template: <Section>:<list no>
- v1_get_p(),
- v1_get_next_p(),
- v1_set_p().
-
-
-v1_get_p() ->
- %% 4.1.2:1
- g([[test2]]),
- ?line expect(10, noSuchName, 1, [{[test2], 'NULL'}]),
- g([[tDescr]]),
- ?line expect(11, noSuchName, 1, [{[tDescr], 'NULL'}]),
- g([[tDescr2,0]]),
- ?line expect(12, noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
- g([[tDescr3,0]]),
- ?line expect(131, noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
- g([[tDescr4,0]]),
- ?line expect(132, noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(14, noSuchName, 2, [{[sysDescr, 0], 'NULL'},
- {[tDescr,0], 'NULL'}]),
- g([[sysDescr,3]]),
- ?line expect(15, noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
-
- %% 4.1.2:2
- g([[tTable]]),
- ?line expect(20, noSuchName, 1, [{[tTable], 'NULL'}]),
- g([[tEntry]]),
- ?line expect(21, noSuchName, 1, [{[tEntry], 'NULL'}]),
-
- %% 4.1.2:3
- g([[tTooBig, 0]]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.2:4
- g([[tGenErr1, 0]]),
- ?line expect(40, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(41, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(42, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]).
-
-
-v1_get_next_p() ->
- %% 4.1.3:1
- gn([[1,3,7,1]]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
- gn([[tDescr2]]),
- ?line expect(11, tooBig, 0, any),
-
- %% 4.1.3:2
- gn([[tTooBig]]),
- io:format("We currently don't handle tooBig correct!!!\n"),
-% ?line expect(20, tooBig, 0, [{[tTooBig], 'NULL'}]),
- ?line expect(20, tooBig, 0, any),
-
- %% 4.1.3:3
- gn([[tGenErr1]]),
-% ?line expect(40, genErr, 1, [{[tGenErr1], 'NULL'}]),
- ?line expect(40, genErr, 1, any),
- gn([[tGenErr2]]),
-% ?line expect(41, genErr, 1, [{[tGenErr2], 'NULL'}]),
- ?line expect(41, genErr, 1, any),
- gn([[sysDescr], [tGenErr3]]),
-% ?line expect(42, genErr, 2, [{[sysDescr], 'NULL'},
-% {[tGenErr3], 'NULL'}]).
- ?line expect(42, genErr, 2, any).
-
-v1_set_p() ->
- %% 4.1.5:1
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noSuchName, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(12, noSuchName, 1, [{[tDescr3,0], "read-only"}]),
- s([{[tDescr3], s, "noSuchObject"}]),
- ?line expect(13, noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
- s([{[tDescr3,1], s, "noSuchInstance"}]),
- ?line expect(14, noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
- s([{[tDescr2,0], s, "inconsistentName"}]),
- ?line expect(15, noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
-
- %% 4.1.5:2
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(20, badValue, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(21, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.1.5:3
- %% The standard is quite incorrect here. The resp pdu was too big. In
- %% the resp pdu, we have the original vbs. In the tooBig pdu we still
- %% have to original vbs => the tooBig pdu is too big as well!!! It
- %% may not get it to the manager, unless the agent uses 'NULL' instead
- %% of the std-like original value.
- s([{[tTooBig, 0], s, ?tooBigStr}]),
- %% according to std:
-% ?line expect(30, tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
- ?line expect(30, tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
-
- %% 4.1.5:4
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(40, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
- s([{[tDescr2, 0], s, "commit_fail"}]),
- ?line expect(41, genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
-
-%% Req. Test2
-v2_proc() ->
- %% According to RFC1905.
- %% Template: <Section>:<list no>
- ?DBG("v2_proc -> entry",[]),
- v2_get_p(),
- v2_get_next_p(),
- v2_get_bulk_p(),
- v2_set_p().
-
-v2_get_p() ->
- %% 4.2.1:2
- ?DBG("v2_get_p -> entry",[]),
- g([[test2]]),
- ?line expect(10, [{[test2], noSuchObject}]),
- g([[tDescr]]),
- ?line expect(11, [{[tDescr], noSuchObject}]),
- g([[tDescr4,0]]),
- ?line expect(12, [{[tDescr4,0], noSuchObject}]),
- g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"},
- {[tDescr,0], noSuchObject}]),
- g([[tTable]]),
- ?line expect(14, [{[tTable], noSuchObject}]),
- g([[tEntry]]),
- ?line expect(15, [{[tEntry], noSuchObject}]),
-
- %% 4.2.1:3
- g([[tDescr2,0]]), %% instrum ret noSuchName!!!
- ?line expect(20, [{[tDescr2,0], noSuchInstance}]),
- g([[tDescr3,0]]),
- ?line expect(21, [{[tDescr3,0], noSuchInstance}]),
- g([[sysDescr,3]]),
- ?line expect(22, [{[sysDescr, 3], noSuchInstance}]),
- g([[tIndex,1]]),
- ?line expect(23, [{[tIndex, 1], noSuchInstance}]),
-
- %% 4.2.1 - any other error: genErr
- g([[tGenErr1, 0]]),
- ?line expect(30, genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
- g([[tGenErr2, 0]]),
- ?line expect(31, genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
- g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line expect(32, genErr, 2, [{[sysDescr, 0], 'NULL'},
- {[tGenErr3, 0], 'NULL'}]),
-
- %% 4.2.1 - tooBig
- g([[tTooBig, 0]]),
- ?line expect(40, tooBig, 0, []).
-
-
-v2_get_next_p() ->
- %% 4.2.2:2
- ?DBG("v2_get_next_p -> entry",[]),
- gn([[1,3,7,1]]),
- ?line expect(10, [{[1,3,7,1], endOfMibView}]),
- gn([[sysDescr], [1,3,7,1]]),
- ?line expect(11, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gn([[tCnt2, 1]]),
- ?line expect(12, [{[tCnt2,2], 100}]),
- gn([[tCnt2, 2]]),
- ?line expect(12, [{[tCnt2,2], endOfMibView}]),
-
- %% 4.2.2 - any other error: genErr
- gn([[tGenErr1]]),
- ?line expect(20, genErr, 1, [{[tGenErr1], 'NULL'}]),
- gn([[tGenErr2]]),
- ?line expect(21, genErr, 1, [{[tGenErr2], 'NULL'}]),
- gn([[sysDescr], [tGenErr3]]),
- ?line expect(22, genErr, 2, [{[sysDescr], 'NULL'},
- {[tGenErr3], 'NULL'}]),
-
- %% 4.2.2 - tooBig
- gn([[tTooBig]]),
- ?line expect(20, tooBig, 0, []).
-
-v2_get_bulk_p() ->
- %% 4.2.3
- ?DBG("v2_get_bulk_p -> entry",[]),
- gb(1, 1, []),
- ?line expect(10, []),
- gb(-1, 1, []),
- ?line expect(11, []),
- gb(-1, -1, []),
- ?line expect(12, []),
- gb(-1, -1, []),
- ?line expect(13, []),
- gb(2, 0, [[sysDescr], [1,3,7,1]]),
- ?line expect(14, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(1, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(15, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView}]),
- gb(0, 2, [[sysDescr], [1,3,7,1]]),
- ?line expect(16, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(2, 2, [[sysDescr], [1,3,7,1], [sysDescr], [1,3,7,1]]),
- ?line expect(17, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysDescr, 0], "Erlang SNMP agent"},
- {[1,3,7,1], endOfMibView},
- {[sysObjectID, 0], [1,2,3]},
- {[1,3,7,1], endOfMibView}]),
-
- gb(1, 2, [[sysDescr], [sysDescr], [tTooBig]]),
- ?line expect(18, [{[sysDescr, 0], "Erlang SNMP agent"},
- {[sysDescr, 0], "Erlang SNMP agent"}]),
-
- gb(1,12, [[tDescr2], [sysDescr]]), % next one after tDescr2 is tTooBig.
- ?line expect(19, []),
-
- gb(2,2, [[sysDescr], [sysObjectID], [tGenErr1], [sysDescr]]),
- ?line expect(20, genErr, 3, [{[sysDescr], 'NULL'},
- {[sysObjectID], 'NULL'},
- {[tGenErr1], 'NULL'},
- {[sysDescr], 'NULL'}]),
- gb(0, 2, [[tCnt2, 1]]),
- ?line expect(21, [{[tCnt2,2], 100},
- {[tCnt2,2], endOfMibView}]).
-
-
-v2_set_p() ->
- %% 4.2.5:1
- ?DBG("v2_set_p -> entry",[]),
- s([{[1,3,7,0], i, 4}]),
- ?line expect(10, noAccess, 1, [{[1,3,7,0], 4}]),
- s([{[tDescr,0], s, "outside mibview"}]),
- ?line expect(11, noAccess, 1, [{[tDescr,0], "outside mibview"}]),
-
- %% 4.2.5:2
- s([{[1,3,6,1,0], s, "noSuchObject"}]),
- ?line expect(20, notWritable, 1, [{[1,3,6,1,0], "noSuchObject"}]),
-
- %% 4.2.5:3
- s([{[tDescr2, 0], i, 4}]),
- ?line expect(30, wrongType, 1, [{[tDescr2, 0], 4}]),
- s([{[tDescr2, 0], s, "badValue"}]),
- ?line expect(31, badValue, 1, [{[tDescr2, 0], "badValue"}]),
-
- %% 4.2.5:4
- s([{[tStr, 0], s, ""}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], ""}]),
- s([{[tStr, 0], s, "12345"}]),
- ?line expect(40, wrongLength, 1, [{[tStr, 0], "12345"}]),
-
- %% 4.2.5:5 - N/A
-
- %% 4.2.5:6
- s([{[tInt1, 0], i, 0}]),
- ?line expect(60, wrongValue, 1, [{[tInt1, 0], 0}]),
- s([{[tInt1, 0], i, 5}]),
- ?line expect(61, wrongValue, 1, [{[tInt1, 0], 5}]),
- s([{[tInt2, 0], i, 0}]),
- ?line expect(62, wrongValue, 1, [{[tInt2, 0], 0}]),
- s([{[tInt2, 0], i, 5}]),
- ?line expect(63, wrongValue, 1, [{[tInt2, 0], 5}]),
- s([{[tInt3, 0], i, 5}]),
- ?line expect(64, wrongValue, 1, [{[tInt3, 0], 5}]),
-
- %% 4.2.5:7
- s([{[tDescrX, 1, 1], s, "noCreation"}]),
- ?line expect(70, noCreation, 1, [{[tDescrX, 1, 1], "noCreation"}]),
-
- %% 4.2.5:8
- s([{[tDescrX, 1, 2], s, "inconsistentName"}]),
- ?line expect(80, inconsistentName, 1,
- [{[tDescrX, 1, 2], "inconsistentName"}]),
-
- %% 4.2.5:9
- s([{[tCnt, 1, 2], i, 5}]),
- ?line expect(90, notWritable, 1, [{[tCnt, 1, 2], 5}]),
- s([{[tDescr3,0], s, "read-only"}]),
- ?line expect(90, notWritable, 1, [{[tDescr3,0], "read-only"}]),
-
- %% 4.2.5:10
- s([{[tDescr2,0], s, "inconsistentValue"}]),
- ?line expect(100, inconsistentValue, 1,
- [{[tDescr2,0], "inconsistentValue"}]),
-
- %% 4.2.5:11
- s([{[tDescr2,0], s, "resourceUnavailable"}]),
- ?line expect(110, resourceUnavailable, 1,
- [{[tDescr2,0],"resourceUnavailable"}]),
-
- %% 4.2.5:12
- s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line expect(120, genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]).
-
- %% commitFailed and undoFailed is tested by the 'undo' case.
-
-
-%% Req. OLD-SNMPEA-MIB
-table_test() ->
- io:format("Testing simple get, next and set on communityTable...~n"),
-%% {[147,214,36,45], "public", 2, readWrite}.
-%% {[147,214,36,45], "standard trap", 2, read}.
- Key1c3 = [intCommunityViewIndex,get(mip),is("public")],
- Key2c3 = [intCommunityViewIndex,get(mip),is("standard trap")],
- Key1c4 = [intCommunityAccess,get(mip),is("public")],
- EndKey = [intCommunityEntry,[9],get(mip),is("public")],
- gn([[intCommunityEntry]]),
- ?line expect(7, [{Key1c3, 2}]),
- gn([[intCommunityTable]]),
- ?line expect(71, [{Key1c3, 2}]),
- gn([[community]]),
- ?line expect(72, [{Key1c3, 2}]),
- gn([[otpSnmpeaMIB]]),
- ?line expect(73, [{Key1c3, 2}]),
- gn([[ericsson]]),
- ?line expect(74, [{Key1c3, 2}]),
- gn([Key1c3]),
- ?line expect(8, [{Key2c3, 2}]),
- gn([Key2c3]),
- ?line expect(9, [{Key1c4, 2}]),
- gn([EndKey]),
- AgentIp = [intAgentIpAddress,0],
- ?line expect(10, [{AgentIp, any}]),
- g([Key1c3]),
- ?line expect(11, [{Key1c3, 2}]),
- g([EndKey]),
- ?line ?v1_2(expect(12, noSuchName, 1, any),
- expect(12, [{EndKey, noSuchObject}])),
-
- io:format("Testing row creation/deletion on communityTable...~n"),
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
- s([{NewKeyc5, ?createAndGo}]),
- ?line expect(14, ?v1_2(badValue, inconsistentValue), 1,any),
- s([{NewKeyc5, ?createAndGo}, {NewKeyc3, 2}, {NewKeyc4, 2}]),
- ?line expect(15, [{NewKeyc5, ?createAndGo},{NewKeyc3, 2}, {NewKeyc4, 2}]),
- g([NewKeyc4]),
- ?line expect(16, [{NewKeyc4, 2}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(17, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc4, 2}]),
- ?line expect(18, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc4, 2}]),
- s([{NewKeyc5, ?createAndWait}]),
- ?line expect(19, [{NewKeyc5, ?createAndWait}]),
- g([NewKeyc5]),
- ?line expect(20, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc4, 2}]),
- ?line expect(21, [{NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(22, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc3, 2}]),
- ?line expect(23, [{NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(24, [{NewKeyc5, ?notInService}]),
- s([{NewKeyc5, ?active}]),
- ?line expect(25, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(26, [{NewKeyc5, ?destroy}]),
- s([{NewKeyc3, 3}]),
- ?line expect(27, ?v1_2(noSuchName, inconsistentName), 1,[{NewKeyc3, 3}]),
- otp_1128().
-
-%% Req. system group
-simple_standard_test() ->
- ?DBG("simple_standard_test -> entry",[]),
- gn([[1,1]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3]]),
- ?line expect(11, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6]]),
- ?line expect(12, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1]]),
- ?line expect(13, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2]]),
- ?line expect(14, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1]]),
- ?line expect(15, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[1,3,6,1,2,1,1]]),
- ?line expect(16, [{[sysDescr,0], "Erlang SNMP agent"}]),
- gn([[sysDescr]]),
- ?line expect(17, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr,0]]),
- ?line expect(2, [{[sysDescr,0], "Erlang SNMP agent"}]),
- g([[sysDescr]]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{[sysDescr], noSuchObject}])),
- g([[1,6,7,0]]),
- ?line ?v1_2(expect(41, noSuchName, 1, any),
- expect(3, [{[1,6,7,0], noSuchObject}])),
- gn([[1,13]]),
- ?line ?v1_2(expect(4, noSuchName,1, any),
- expect(4, [{[1,13], endOfMibView}])),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
- g([[sysLocation, 0]]),
- ?line expect(6, [{[sysLocation, 0], "new_value"}]),
- io:format("Testing noSuchName and badValue...~n"),
- s([{[sysServices,0], 3}]),
- ?line expect(61, ?v1_2(noSuchName, notWritable), 1, any),
- s([{[sysLocation, 0], i, 3}]),
- ?line expect(62, ?v1_2(badValue, wrongType), 1, any),
- ?DBG("simple_standard_test -> done",[]),
- ok.
-
-%% This is run in the agent node
-db_notify_client(suite) -> [];
-db_notify_client(Config) when list(Config) ->
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("~n\tSaNode: ~p~n\tMgrNode: ~p~n\tMibDir: ~p",
- [SaNode,MgrNode,MibDir]),
- snmpa_local_db:register_notify_client(self(),?MODULE),
-
- %% This call (the manager) will issue to set operations, so
- %% we expect to receive to notify(insert) calls.
- try_test(db_notify_client_test),
-
- ?DBG("await first notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("first notify received",[]),ok
- end,
-
- ?DBG("await second notify",[]),
- receive
- {db_notify_test_reply,insert} -> ?DBG("second notify received",[]),ok
- end,
-
- snmpa_local_db:unregister_notify_client(self()).
-
-
-%% This is run in the manager node
-db_notify_client_test() ->
- ?DBG("set first new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]),
-
- ?DBG("set second new sysLocation",[]),
- s([{[sysLocation, 0], "new_value"}]),
- ?line expect(5, [{[sysLocation, 0], "new_value"}]).
-
-notify(Pid,What) ->
- ?DBG("notify(~p,~p) -> called",[Pid,What]),
- Pid ! {db_notify_test_reply,What}.
-
-
-%% Req: system group, OLD-SNMPEA-MIB, Klas1
-big_test() ->
- ?DBG("big_test -> testing simple next/get/set @ master agent...",[]),
- simple_standard_test(),
-
- ?DBG("big_test -> testing simple next/get/set @ subagent...",[]),
- gn([[klas1]]),
- ?line expect(1, [{[fname,0], ""}]),
- g([[fname,0]]),
- ?line expect(2, [{[fname,0], ""}]),
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[fname,0]]),
- ?line expect(4, [{[fname,0], "test set"}]),
-
- ?DBG("big_test -> "
- "testing next from last instance in master to subagent...",[]),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname,0], "test set"}]),
- s([{[fname,0], s, ""}]),
- ?line expect(52, [{[fname,0], ""}]),
-
- table_test(),
-
- ?DBG("big_test -> adding one row in subagent table",[]),
- _FTab = [friendsEntry],
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {[friendsEntry, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [friendsEntry, [3, 3]]]),
- ?line expect(7, [{[friendsEntry, [2, 3]], "kompis3"},
- {[friendsEntry, [3, 3]], ?active}]),
- s([{[friendsEntry, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry, [3, 3]], ?destroy}]),
-
- otp_1131(),
-
- ?DBG("big_test -> adding two rows in subagent table with special INDEX",
- []),
- s([{[kompissEntry, [1, 3]], s, "kompis3"},
- {[kompissEntry, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?createAndGo}]),
- g([[kompissEntry, [1, 3]],
- [kompissEntry, [2, 3]]]),
- ?line expect(10, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- gn([[kompissEntry, [1]],
- [kompissEntry, [2]]]),
- ?line expect(11, [{[kompissEntry, [1, 3]], "kompis3"},
- {[kompissEntry, [2, 3]], ?active}]),
- s([{[kompissEntry, [1, 2]], s, "kompis3"},
- {[kompissEntry, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry, [1, 1]],
- [kompissEntry, [2, 1]]]),
- ?line expect(13, [{[kompissEntry, [1, 2]], "kompis3"},
- {[kompissEntry, [2, 2]], ?active}]),
- s([{[kompissEntry, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry, [2, 3]], ?destroy}]),
- s([{[kompissEntry, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry, [2, 2]], ?destroy}]),
- ?DBG("big_test -> done",[]),
- ok.
-
-%% Req. system group, Klas2, OLD-SNMPEA-MIB
-big_test_2() ->
- p("Testing simple next/get/set @ master agent (2)..."),
- simple_standard_test(),
-
- p("Testing simple next/get/set @ subagent (2)..."),
- gn([[klas2]]),
- ?line expect(1, [{[fname2,0], ""}]),
- g([[fname2,0]]),
- ?line expect(2, [{[fname2,0], ""}]),
- s([{[fname2,0], s, "test set"}]),
- ?line expect(3, [{[fname2,0], "test set"}]),
- g([[fname2,0]]),
- ?line expect(4, [{[fname2,0], "test set"}]),
-
- otp_1298(),
-
- p("Testing next from last object in master to subagent (2)..."),
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(5, [{[fname2,0], "test set"}]),
- gn([[1,1],
- [?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(51, [{[sysDescr,0], "Erlang SNMP agent"},
- {[fname2,0], "test set"}]),
-
- table_test(),
-
- p("Adding one row in subagent table (2)"),
- _FTab = [friendsEntry2],
- s([{[friendsEntry2, [2, 3]], s, "kompis3"},
- {[friendsEntry2, [3, 3]], i, ?createAndGo}]),
- ?line expect(6, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?createAndGo}]),
- g([[friendsEntry2, [2, 3]],
- [friendsEntry2, [3, 3]]]),
- ?line expect(7, [{[friendsEntry2, [2, 3]], "kompis3"},
- {[friendsEntry2, [3, 3]], ?active}]),
- s([{[friendsEntry2, [3, 3]], i, ?destroy}]),
- ?line expect(8, [{[friendsEntry2, [3, 3]], ?destroy}]),
-
- p("Adding two rows in subagent table with special INDEX (2)"),
- s([{[kompissEntry2, [1, 3]], s, "kompis3"},
- {[kompissEntry2, [2, 3]], i, ?createAndGo}]),
- ?line expect(9, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?createAndGo}]),
- g([[kompissEntry2, [1, 3]],
- [kompissEntry2, [2, 3]]]),
- ?line expect(10, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- gn([[kompissEntry2, [1]],
- [kompissEntry2, [2]]]),
- ?line expect(11, [{[kompissEntry2, [1, 3]], "kompis3"},
- {[kompissEntry2, [2, 3]], ?active}]),
- s([{[kompissEntry2, [1, 2]], s, "kompis3"},
- {[kompissEntry2, [2, 2]], i, ?createAndGo}]),
- ?line expect(12, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?createAndGo}]),
- gn([[kompissEntry2, [1, 1]],
- [kompissEntry2, [2, 1]]]),
- ?line expect(13, [{[kompissEntry2, [1, 2]], "kompis3"},
- {[kompissEntry2, [2, 2]], ?active}]),
- s([{[kompissEntry2, [2, 3]], i, ?destroy}]),
- ?line expect(14, [{[kompissEntry2, [2, 3]], ?destroy}]),
- s([{[kompissEntry2, [2, 2]], i, ?destroy}]),
- ?line expect(15, [{[kompissEntry2, [2, 2]], ?destroy}]),
- ok.
-
-%% Req. Test1
-multi_threaded_test() ->
- p("Testing multi threaded agent..."),
- g([[multiStr,0]]),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(1, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "pelle"}]),
- ?line expect(2, [{[sysLocation, 0], "pelle"}]),
- Pid ! continue,
- ?line expect(3, [{[multiStr,0], "ok"}]),
-
- s([{[multiStr, 0], s, "block"}]),
- Pid2 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(4, [{[sysUpTime,0], any}]),
- g([[multiStr,0]]),
- Pid3 = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(5, [{[sysUpTime,0], any}]),
- s([{[sysLocation, 0], s, "kalle"}]),
- Pid3 ! continue,
- ?line expect(6, [{[multiStr,0], "ok"}]),
- Pid2 ! continue,
- ?line expect(7, [{[multiStr,0], "block"}]),
- ?line expect(8, [{[sysLocation,0], "kalle"}]).
-
-%% Req. Test1, TestTrapv2
-mt_trap_test(MA) ->
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- snmpa:send_trap(MA, mtTrap, "standard trap"),
- Pid = get_multi_pid(),
- g([[sysUpTime,0]]),
- ?line expect(2, [{[sysUpTime,0], any}]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- Pid ! continue,
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [2]},
- {[multiStr,0], "ok"}]).
-
-
-get_multi_pid() ->
- get_multi_pid(10).
-get_multi_pid(0) ->
- ?line ?FAIL(no_global_name);
-get_multi_pid(N) ->
- sleep(1000),
- case global:whereis_name(snmp_multi_tester) of
- Pid when pid(Pid) -> Pid;
- _ -> get_multi_pid(N-1)
- end.
-
-%% Req. Test1
-types_v2_test() ->
- p("Testing v2 types..."),
-
- s([{[bits1,0], 2#10}]),
- ?line expect(1, [{[bits1,0], ?str(2#10)}]),
- g([[bits1,0]]),
- ?line expect(2, [{[bits1,0], ?str(2#101)}]),
-
- s([{[bits2,0], 2#11000000110}]),
- ?line expect(3, [{[bits2,0], ?str(2#11000000110)}]),
- g([[bits2,0]]),
- ?line expect(4, [{[bits2,0], ?str(2#11000000110)}]),
-
- g([[bits3,0]]),
- ?line expect(50, genErr, 1, any),
-
- g([[bits4,0]]),
- ?line expect(51, genErr, 1, any),
-
- s([{[bits1,0], s, [2#10]}]),
- ?line expect(6, ?v1_2(badValue, wrongValue), 1, any),
-
- s([{[bits2,0], 2#11001001101010011}]),
- ?line expect(7, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%% Req. Test1
-implied_test(MA) ->
- ?LOG("implied_test -> start",[]),
- p("Testing IMPLIED..."),
-
- snmpa:verbosity(MA,trace),
- snmpa:verbosity(MA,trace),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = "apa",
- Idx2 = "qq",
- ?DBG("implied_test -> (send) create row 1 '~s' in table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?createAndGo}, {[testDescr, Idx1],s,"row 1"}]),
- ?line expect(1, [{[testStatus, Idx1], ?createAndGo},
- {[testDescr, Idx1], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?createAndGo}, {[testDescr, Idx2],s,"row 2"}]),
- ?line expect(2, [{[testStatus, Idx2], ?createAndGo},
- {[testDescr, Idx2], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr)",[]),
- gn([[testDescr]]),
- ?line expect(3, [{[testDescr,Idx1], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr) of row 1",[]),
- gn([[testDescr,Idx1]]),
- ?line expect(4, [{[testDescr,Idx2], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 1",[Idx1]),
- s([{[testStatus, Idx1], i, ?destroy}]),
- ?line expect(5, [{[testStatus, Idx1], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 1",[Idx2]),
- s([{[testStatus, Idx2], i, ?destroy}]),
- ?line expect(6, [{[testStatus, Idx2], ?destroy}]),
-
- %% Try the same in other table
- Idx3 = [1, "apa"],
- Idx4 = [1, "qq"],
- ?DBG("implied_test -> (send) create row 1 '~s' in table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?createAndGo}, {[testDescr2,Idx3],s,"row 1"}]),
- ?line expect(1, [{[testStatus2, Idx3], ?createAndGo},
- {[testDescr2, Idx3], "row 1"}]),
- ?DBG("implied_test -> (send) create row 2 '~s' in table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?createAndGo}, {[testDescr2,Idx4],s,"row 2"}]),
- ?line expect(2, [{[testStatus2, Idx4], ?createAndGo},
- {[testDescr2, Idx4], "row 2"}]),
- ?DBG("implied_test -> get-next(testDescr2)",[]),
- gn([[testDescr2]]),
- ?line expect(3, [{[testDescr2,Idx3], "row 1"}]),
- ?DBG("implied_test -> get-next(testDescr2) of row 1",[]),
- gn([[testDescr2,Idx3]]),
- ?line expect(4, [{[testDescr2,Idx4], "row 2"}]),
-
- % Delete the rows
- ?DBG("implied_test -> (send) delete row 1 '~s' from table 2",[Idx3]),
- s([{[testStatus2, Idx3], i, ?destroy}]),
- ?line expect(5, [{[testStatus2, Idx3], ?destroy}]),
- ?DBG("implied_test -> (send) delete row 2 '~s' from table 2",[Idx4]),
- s([{[testStatus2, Idx4], i, ?destroy}]),
- ?line expect(6, [{[testStatus2, Idx4], ?destroy}]),
-
- snmpa:verbosity(MA,log),
-
- ?LOG("implied_test -> done",[]).
-
-
-
-%% Req. Test1
-sparse_table_test() ->
- p("Testing sparse table..."),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- s([{[sparseStatus, Idx1], i, ?createAndGo},
- {[sparseDescr, Idx1], s, "row 1"}]),
- ?line expect(1, [{[sparseStatus, Idx1], ?createAndGo},
- {[sparseDescr, Idx1], "row 1"}]),
- s([{[sparseStatus, Idx2], i, ?createAndGo},
- {[sparseDescr, Idx2], s, "row 2"}]),
- ?line expect(2, [{[sparseStatus, Idx2], ?createAndGo},
- {[sparseDescr, Idx2], "row 2"}]),
- ?v1_2(gn([[sparseIndex], [sparseDescr,Idx1], [sparseDescr,Idx2],
- [sparseStatus,Idx1], [sparseStatus,Idx2]]),
- gb(0,5,[[sparseIndex]])),
- ?line expect(3, [{[sparseDescr,Idx1], "row 1"},
- {[sparseDescr,Idx2], "row 2"},
- {[sparseStatus,Idx1], ?active},
- {[sparseStatus,Idx2], ?active},
- {[sparseStr,0], "slut"}]),
- % Delete the rows
- s([{[sparseStatus, Idx1], i, ?destroy}]),
- ?line expect(4, [{[sparseStatus, Idx1], ?destroy}]),
- s([{[sparseStatus, Idx2], i, ?destroy}]),
- ?line expect(5, [{[sparseStatus, Idx2], ?destroy}]).
-
-
-%% Req. Test1
-cnt_64_test(MA) ->
- ?LOG("start cnt64 test (~p)",[MA]),
- snmpa:verbosity(MA,trace),
- ?LOG("start cnt64 test",[]),
- p("Testing Counter64, and at the same time, RowStatus is not last column"),
-
- ?DBG("get cnt64",[]),
- g([[cnt64,0]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(1, noSuchName, 1, any),
- expect(1, [{[cnt64,0],18446744073709551615}])),
- ?DBG("get-next cnt64",[]),
- gn([[cnt64]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(2, [{[cnt64Str,0], "after cnt64"}]),
- expect(2, [{[cnt64,0],18446744073709551615}])),
- ?DBG("send cntTrap",[]),
- snmpa:send_trap(MA,cntTrap,"standard trap",[{sysContact,"pelle"},
- {cnt64, 10},
- {sysLocation, "here"}]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, trap, [test], 6, 1, [{[sysContact,0], "pelle"},
- {[sysLocation,0], "here"}]),
- expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?testTrap ++ [1]},
- {[sysContact,0], "pelle"},
- {[cnt64,0], 10},
- {[sysLocation,0], "here"}])),
-
- %% Create two rows, check that they are get-nexted in correct order.
- Idx1 = 1,
- Idx2 = 2,
- ?DBG("create row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(1, [{[cntStatus, Idx1], ?createAndGo}]),
- ?DBG("create row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?createAndGo}]),
- ?DBG("await response",[]),
- ?line expect(2, [{[cntStatus, Idx2], ?createAndGo}]),
-
- ?DBG("get-next (cntIndex)",[]),
- gn([[cntIndex]]),
- ?DBG("await response",[]),
- ?line ?v1_2(expect(3, [{[cntStatus,Idx1], ?active}]),
- expect(3, [{[cntCnt,Idx1], 0}])),
- % Delete the rows
- ?DBG("delete row (cntStatus): ~p",[Idx1]),
- s([{[cntStatus, Idx1], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(4, [{[cntStatus, Idx1], ?destroy}]),
- ?DBG("delete row (cntStatus): ~p",[Idx2]),
- s([{[cntStatus, Idx2], i, ?destroy}]),
- ?DBG("await response",[]),
- ?line expect(5, [{[cntStatus, Idx2], ?destroy}]),
- catch snmpa:verbosity(MA,log),
- ?DBG("done",[]),
- ok.
-
-%% Req. Test1
-opaque_test() ->
- p("Testing Opaque datatype..."),
- g([[opaqueObj,0]]),
- ?line expect(1, [{[opaqueObj,0], "opaque-data"}]).
-
-%% Req. OLD-SNMPEA-MIB
-api_test(MaNode) ->
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [intAgentIpAddress]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp,
- oid_to_name, [OID]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [[1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int, [intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp,
- int_to_enum, ['RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp,
- enum_to_int, ['xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, ['xxRowStatus', 1]),
- ?line case snmp:date_and_time() of
- List when list(List), length(List) == 8 -> ok;
- List when list(List), length(List) == 11 -> ok
- end.
-
-%% Req. Klas3
-api_test2() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]),
- g([[fname4,0]]),
- ?line expect(2, [{[fname4,0], 1}]).
-
-api_test3() ->
- g([[fname3,0]]),
- ?line expect(1, [{[fname3,0], "ok"}]).
-
-
-unreg_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[snmpInPkts, 0], any}]).
-
-load_test() ->
- gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line expect(1, [{[fname,0], ""}]).
-
-%% Req. Klas1
-load_test_sa() ->
- gn([[?v1_2(sysServices,sysORLastChange), 0]]),
- ?line expect(1, [{[fname,0], any}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_get() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0], Key1c4, [fname,0],Key1c3,
- [sysName,0]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,0], "test"}]),
- g([[1,3,7,1], Key1c4, [sysDescr,0], [1,3,7,2], Key1c3, [sysDescr,0]]),
- ?line ?v1_2(expect(2, noSuchName, [1,4], any),
- expect(2, [{[1,3,7,1], noSuchObject},
- {Key1c4, 2},
- {[sysDescr,0], "Erlang SNMP agent"},
- {[1,3,7,2], noSuchObject},
- {Key1c3, 2},
- {[sysDescr,0], "Erlang SNMP agent"}])).
-
-%% Req. v1, system group, Klas1, OLD-SNMPEA-MIB, *ej* Klas3.
-do_mul_get_err() ->
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- g([[sysDescr,0],Key1c4,[fname,0], Key1c3, [sysName,2]]),
- ?line ?v1_2(expect(1, noSuchName, 5, any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname,0], "test set"},
- {Key1c3, 2},
- {[sysName,2], noSuchInstance}])),
- g([[sysDescr,0],Key1c4,[fname3,0], Key1c3, [sysName,1]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[fname3,0], noSuchObject},
- {Key1c3, 2},
- {[sysName,1], noSuchInstance}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [fname],Key1c3s,[sysName]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2}, {[fname,0], "test set"},
- {Key1c3, 2}, {[sysName,0], "test"}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_next_err() ->
- Key1c3s = [intCommunityEntry,[3],get(mip),is("publi")],
- Key1c4s = [intCommunityEntry,[4],get(mip),is("publi")],
- Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
- Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
- s([{[fname,0], s, "test set"}]),
- ?line expect(3, [{[fname,0], "test set"}]),
- gn([[sysDescr], Key1c4s, [1,3,6,999], [fname],[1,3,90], Key1c3s,[sysName]]),
- ?line ?v1_2(expect(1, noSuchName, [3,5], any),
- expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {Key1c4, 2},
- {[1,3,6,999], endOfMibView},
- {[fname,0], "test set"},
- {[1,3,90], endOfMibView},
- {Key1c3, 2},
- {[sysName,0], "test"}])).
-
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set() ->
- p("Adding one row in subagent table, and one in master table"),
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, [{[friendsEntry, [2, 3]], "kompis3"},
- {NewKeyc3, 2},
- {[sysLocation,0], "new_value"},
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- g([[friendsEntry, [2, 3]],
- [sysLocation,0],
- [friendsEntry, [3, 3]]]),
- ?line expect(2, [{[friendsEntry, [2, 3]], "kompis3"},
- {[sysLocation,0], "new_value"},
- {[friendsEntry, [3, 3]], ?active}]),
- g([NewKeyc4]),
- ?line expect(3, [{NewKeyc4, 2}]),
- s([{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]),
- ?line expect(4, [{[friendsEntry, [3, 3]], ?destroy},
- {NewKeyc5, ?destroy}]).
-
-%% Req. system group, Klas1, OLD-SNMPEA-MIB
-do_mul_set_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- p("Adding one row in subagent table, and one in master table"),
- s([{[friendsEntry, [2, 3]], s, "kompis3"},
- {NewKeyc3, 2},
- {[sysUpTime,0], 45}, % sysUpTime (readOnly)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2},
- {[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, notWritable), 3, any),
- g([[friendsEntry, [2, 3]]]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{[friendsEntry, [2,3]], noSuchInstance}])),
- g([NewKeyc4]),
- ?line ?v1_2(expect(3, noSuchName, 1, any),
- expect(3, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB
-sa_mib() ->
- g([[sa, [2,0]]]),
- ?line expect(1, [{[sa, [2,0]], 3}]),
- s([{[sa, [1,0]], s, "sa_test"}]),
- ?line expect(2, [{[sa, [1,0]], "sa_test"}]).
-
-ma_trap1(MA) ->
- snmpa:send_trap(MA, testTrap2, "standard trap"),
- ?line expect(1, trap, [system], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]),
- snmpa:send_trap(MA, testTrap1, "standard trap"),
- ?line expect(2, trap, [1,2,3] , 1, 0, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"}]).
-
-ma_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]).
-
-ma_v2_2_v1_trap2(MA) ->
- snmpa:send_trap(MA,linkUp,"standard trap",[{ifIndex, [1], 1},
- {ifAdminStatus, [1], 1},
- {ifOperStatus, [1], 2}]),
- ?line expect(3, trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
- {[ifAdminStatus, 1], 1},
- {[ifOperStatus, 1], 2}]).
-
-sa_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(5, trap, [ericsson], 6, 1, [{[system, [4,0]],
- "pelle"},
- {[sa, [1,0]], "sa_test"}]).
-
-sa_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(6, trap, [ericsson], 6, 2, [{[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]}]).
-
-ma_v2_trap1(MA) ->
- ?DBG("ma_v2_traps -> entry with MA = ~p => "
- "send standard trap: testTrapv22",[MA]),
- snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line expect(1, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_traps -> send standard trap: testTrapv21",[]),
- snmpa:send_trap(MA, testTrapv21, "standard trap"),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmp ++ [1]}]).
-
-ma_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"}]).
-
-%% Note: This test case takes a while... actually a couple of minutes.
-ma_v2_inform1(MA) ->
- ?DBG("ma_v2_inform -> entry with MA = ~p => "
- "send notification: testTrapv22",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver, "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag1, self()},
- "standard inform", []),
- ?line expect(1, {inform, true},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag1, [_]} ->
- ok;
- {snmp_targets, tag1, Addrs1} ->
- ?line ?FAIL({bad_addrs, Addrs1})
- after
- 5000 ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag1, {got_response, _}} ->
- ok;
- {snmp_notification, tag1, {no_response, _}} ->
- ?line ?FAIL(no_response)
- after
- 20000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag1) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end,
-
- %%
- %% -- The rest is possibly erroneous...
- %%
-
- ?DBG("ma_v2_inform -> send notification: testTrapv22",[]),
- snmpa:send_notification(MA, testTrapv22, {tag2, self()},
- "standard inform", []),
- ?line expect(2, {inform, false},
- [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]}]),
- ?DBG("ma_v2_inform -> await targets",[]),
- receive
- {snmp_targets, tag2, [_]} ->
- ok;
- {snmp_targets, tag2, Addrs2} ->
- ?ERR("ma_v2_inform1 -> awaiting snmp_targets(tag2) timeout",[]),
- ?line ?FAIL({bad_addrs, Addrs2})
- after
- 5000 ->
- ?line ?FAIL(nothing_at_all)
- end,
- ?DBG("ma_v2_inform -> await notification",[]),
- receive
- {snmp_notification, tag2, {got_response, _}} ->
- ?line ?FAIL(got_response);
- {snmp_notification, tag2, {no_response, _}} ->
- ok
- after
- 240000 ->
- ?ERR("ma_v2_inform1 -> "
- "awaiting snmp_notification(tag2) timeout",[]),
- ?line ?FAIL(nothing_at_all)
- end.
-
-
-ma_v1_2_v2_trap(MA) ->
- snmpa:send_trap(MA,linkDown,"standard trap",[{ifIndex, [1], 1}]),
- ?line expect(2, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?snmpTraps ++ [3]},
- {[ifIndex, 1], 1},
- {[snmpTrapEnterprise, 0], [1,2,3]}]).
-
-
-ma_v1_2_v2_trap2(MA) ->
- snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line expect(3, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?system ++ [0,1]},
- {[system, [4,0]], "pelle"},
- {[snmpTrapEnterprise, 0], ?system}]).
-
-
-sa_v1_2_v2_trap1(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-sa_v1_2_v2_trap2(SA) ->
- snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
- {[system, [4,0]], "pelle"},
- {[sa, [1,0]], "sa_test"},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-sa_v1_2_v2_trap3(SA) ->
- snmpa:send_trap(SA, saTrap2, "standard trap",
- [{intViewSubtree, [4], [1,2,3,4]}]),
- ?line expect(4, v2trap, [{[sysUpTime, 0], any},
- {[snmpTrapOID, 0], ?ericsson ++ [0, 2]},
- {[system, [4,0]],
- "{mbj,eklas}@erlang.ericsson.se"},
- {[sa, [1,0]], "sa_test"},
- {[intViewSubtree,4],[1,2,3,4]},
- {[snmpTrapEnterprise, 0], ?ericsson}]).
-
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_bad_value() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 5}, % badValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, badValue, 2, any),
- s([{NewKeyc3, 2},
- {[sa, [2,0]], 6}, % wrongValue (i is_set_ok)
- {NewKeyc5, ?createAndGo},
- {NewKeyc4, 2}]),
- ?line expect(1, ?v1_2(badValue, wrongValue), 2, any),
- g([NewKeyc4]),
- ?line ?v1_2(expect(2, noSuchName, 1, any),
- expect(2, [{NewKeyc4, noSuchInstance}])).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_errs_gen_err() ->
- NewKeyc3 = [intCommunityEntry,[3],get(mip),is("test")],
- NewKeyc4 = [intCommunityEntry,[4],get(mip),is("test")],
- NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
- s([{NewKeyc3, 2},{NewKeyc4, 2},
- {NewKeyc5, ?createAndGo}, {[sa, [3,0]], 5}]),
- ?line expect(1, genErr, 4, any),
-% The row might have been added; we don't know.
-% (as a matter of fact we do - it is added, because the agent
-% first sets its own vars, and then th SAs. Lets destroy it.
- s([{NewKeyc5, ?destroy}]),
- ?line expect(2, [{NewKeyc5, ?destroy}]).
-
-%% Req. SA-MIB, OLD-SNMPEA-MIB
-sa_too_big() ->
- g([[sa, [4,0]]]),
- ?line expect(1, tooBig).
-
-%% Req. Klas1, system group, snmp group (v1/v2)
-next_across_sa() ->
- gn([[sysDescr],[klas1,5]]),
- ?line expect(1, [{[sysDescr,0], "Erlang SNMP agent"},
- {[snmpInPkts, 0], any}]).
-
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]). -> noError
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]). -> {badValue, 2}
-%% snmp_test_mgr:s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]). -> {genErr, 1}
-%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]). -> {genErr, 2}
-%% Req. Klas3, Klas4
-undo_test() ->
- s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- ?line expect(1, [{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]),
- ?line expect(2, ?v1_2(badValue, inconsistentValue), 2, any),
- s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]),
- ?line expect(3, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]),
- ?line expect(4, ?v1_2(genErr, commitFailed), 1, any),
-% unfortunatly we don't know if we'll get undoFailed or commitFailed.
-% it depends on which order the agent traverses the varbind list.
-% s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]),
-% ?line expect(5, ?v1_2(genErr, undoFailed), 1, any),
- s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]),
- ?line expect(6, genErr, 2, any).
-
-%% Req. Klas3, Klas4
-bad_return() ->
- g([[fStatus4,4],
- [fName4,4]]),
- ?line expect(4, genErr, 2, any),
- g([[fStatus4,5],
- [fName4,5]]),
- ?line expect(5, genErr, 1, any),
- g([[fStatus4,6],
- [fName4,6]]),
- ?line expect(6, genErr, 2, any),
- gn([[fStatus4,7],
- [fName4,7]]),
- ?line expect(7, genErr, 2, any),
- gn([[fStatus4,8],
- [fName4,8]]),
- ?line expect(8, genErr, 1, any),
- gn([[fStatus4,9],
- [fName4,9]]),
- ?line expect(9, genErr, 2, any).
-
-
-%%%-----------------------------------------------------------------
-%%% Test the implementation of standard mibs.
-%%% We should *at least* try to GET all variables, just to make
-%%% sure the instrumentation functions work.
-%%% Note that many of the functions in the standard mib is
-%%% already tested by the normal tests.
-%%%-----------------------------------------------------------------
-
-
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v1.
-%% o Test the counters and control objects in SNMP-STANDARD-MIB
-%%-----------------------------------------------------------------
-snmp_standard_mib(suite) -> [];
-snmp_standard_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?DBG("snmp_standard_mib -> std_mib_init", []),
- try_test(std_mib_init),
-
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- InBadVsns = try_test(std_mib_a),
- put(vsn, v2),
- ?DBG("snmp_standard_mib -> std_mib_read", []),
- try_test(std_mib_read),
- put(vsn, v1),
-
- ?DBG("snmp_standard_mib -> std_mib_b (~w)", [InBadVsns]),
- Bad = try_test(std_mib_b, [InBadVsns]),
- ?DBG("snmp_standard_mib -> std_mib_read (community: 'bad community')", []),
- try_test(std_mib_read, [], [{community, "bad community"}]),
- ?DBG("snmp_standard_mib -> std_mib_write (community: 'public')", []),
- try_test(std_mib_write, [], [{community, "public"}]),
- ?DBG("snmp_standard_mib -> std_mib_asn_err", []),
- try_test(std_mib_asn_err),
- ?DBG("snmp_standard_mib -> std_mib_c (~w)", [Bad]),
- try_test(std_mib_c, [Bad]),
- ?DBG("snmp_standard_mib -> std_mib_a", []),
- try_test(standard_mib_a),
-
- ?DBG("snmp_standard_mib -> std_mib_finish", []),
- try_test(std_mib_finish),
- ?DBG("snmp_standard_mib -> std_mib_test_finish", []),
- try_test(standard_mib_test_finish, [], [{community, "bad community"}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_a() ->
- ?line [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
- ?line [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
- ?line OutPkts2 = OutPkts + 1,
- %% There are some more counters we could test here, but it's not that
- %% important, since they are removed from SNMPv2-MIB.
- ok.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_init() ->
- %% disable authentication failure traps. (otherwise w'd get many of
- %% them - this is also a test to see that it works).
- s([{[snmpEnableAuthenTraps,0], 2}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 2}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_finish() ->
- %% enable again
- s([{[snmpEnableAuthenTraps,0], 1}]),
- ?line expect(1, [{[snmpEnableAuthenTraps, 0], 1}]).
-
-%% Req. SNMP-STANDARD-MIB
-standard_mib_test_finish() ->
- %% force a authenticationFailure
- std_mib_write(),
- %% check that we got a trap
- ?line expect(2, trap, [1,2,3], 4, 0, []).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_read() ->
- ?DBG("std_mib_read -> entry", []),
- g([[sysUpTime,0]]), % try a bad <something>; msg dropped, no reply
- ?DBG("std_mib_read -> await timeout (i.e. no reply)", []),
- ?line expect(1, timeout). % make sure we don't get a trap!
-
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_write() ->
- ?DBG("std_mib_write -> entry", []),
- s([{[sysLocation, 0], "new_value"}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_asn_err() ->
- snmp_test_mgr:send_bytes([48,99,67,12,0,0,0,0,0,0,5]).
-
-%%-----------------------------------------------------------------
-%% For this test, the agent is configured for v2 and v3.
-%% o Test the counters and control objects in SNMPv2-MIB
-%%-----------------------------------------------------------------
-snmpv2_mib_2(suite) -> [];
-snmpv2_mib_2(Config) when list(Config) ->
- ?LOG("snmpv2_mib_2 -> start",[]),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?DBG("snmpv2_mib_2 -> standard mib init",[]),
- try_test(std_mib_init),
-
- ?DBG("snmpv2_mib_2 -> get number of (so far) bad versions",[]),
- InBadVsns = try_test(std_mib_a),
-
- ?DBG("snmpv2_mib_2 -> make a bad version read",[]),
- put(vsn, v1),
- try_test(std_mib_read),
-
- ?DBG("snmpv2_mib_2 -> bad version read",[]),
- put(vsn, v2),
- Bad = try_test(std_mib_b, [InBadVsns]),
-
- ?DBG("snmpv2_mib_2 -> read with bad community",[]),
- try_test(std_mib_read, [], [{community, "bad community"}]),
-
- ?DBG("snmpv2_mib_2 -> write with public community",[]),
- try_test(std_mib_write, [], [{community, "public"}]),
-
- ?DBG("snmpv2_mib_2 -> asn err",[]),
- try_test(std_mib_asn_err),
-
- ?DBG("snmpv2_mib_2 -> check counters",[]),
- try_test(std_mib_c, [Bad]),
-
- ?DBG("snmpv2_mib_2 -> get som counters",[]),
- try_test(snmpv2_mib_a),
-
- ?DBG("snmpv2_mib_2 -> enable auth traps, and await some",[]),
- try_test(std_mib_finish),
-
- ?DBG("snmpv2_mib_2 -> force auth failure, and await trap, "
- "then disable auth traps",[]),
- try_test(snmpv2_mib_test_finish, [], [{community, "bad community"}]),
-
- ?LOG("snmpv2_mib_2 -> done",[]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_3(suite) -> [];
-snmpv2_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- InBadVsns = try_test(std_mib_a),
- put(vsn, v1),
- try_test(std_mib_read),
- put(vsn, v3),
- _Bad = try_test(std_mib_b, [InBadVsns]),
- try_test(snmpv2_mib_a),
-
- try_test(std_mib_finish).
-
--define(authenticationFailure, [1,3,6,1,6,3,1,1,5,5]).
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_test_finish() ->
- %% force a authenticationFailure
- ?DBG("ma_v2_inform -> write to std mib",[]),
- std_mib_write(),
-
- %% check that we got a trap
- ?DBG("ma_v2_inform -> await trap",[]),
- ?line expect(2, v2trap, [{[sysUpTime,0], any},
- {[snmpTrapOID,0], ?authenticationFailure}]),
-
- %% and the the inform
- ?DBG("ma_v2_inform -> await inform",[]),
- ?line expect(2, {inform,true}, [{[sysUpTime,0], any},
- {[snmpTrapOID,0],?authenticationFailure}]).
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_a() ->
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
-
- ?line [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
- InBadVsns.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_b(InBadVsns) ->
- ?line [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
- ?line InBadVsns2 = InBadVsns + 1,
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
- ?line [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
- get_req(4, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- {InBadCommunityNames, InBadCommunityUses, InASNErrs}.
-
-%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
-std_mib_c({InBadCommunityNames, InBadCommunityUses, InASNErrs}) ->
- ?line [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
- get_req(1, [[snmpInBadCommunityNames,0],
- [snmpInBadCommunityUses,0],
- [snmpInASNParseErrs, 0]]),
- ?line InBadCommunityNames2 = InBadCommunityNames + 1,
- ?line InBadCommunityUses2 = InBadCommunityUses + 1,
- ?line InASNErrs2 = InASNErrs + 1.
-
-%% Req. SNMPv2-MIB
-snmpv2_mib_a() ->
- ?line [SetSerial] = get_req(2, [[snmpSetSerialNo,0]]),
- s([{[snmpSetSerialNo,0], SetSerial}, {[sysLocation, 0], "val2"}]),
- ?line expect(3, [{[snmpSetSerialNo,0], SetSerial},
- {[sysLocation, 0], "val2"}]),
- s([{[sysLocation, 0], "val3"}, {[snmpSetSerialNo,0], SetSerial}]),
- ?line expect(4, inconsistentValue, 2,
- [{[sysLocation, 0], "val3"},
- {[snmpSetSerialNo,0], SetSerial}]),
- ?line ["val2"] = get_req(5, [[sysLocation,0]]).
-
-
-%%-----------------------------------------------------------------
-%% o Bad community uses/name is tested already
-%% in SNMPv2-MIB and STANDARD-MIB.
-%% o Test add/deletion of rows.
-%%-----------------------------------------------------------------
-snmp_community_mib(suite) -> [];
-snmp_community_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- try_test(snmp_community_mib),
- ?line unload_master("SNMP-COMMUNITY-MIB").
-
-snmp_community_mib_2(X) -> snmp_community_mib(X).
-
-%% Req. SNMP-COMMUNITY-MIB
-snmp_community_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o Test engine boots / time
-%%-----------------------------------------------------------------
-snmp_framework_mib(suite) -> [];
-snmp_framework_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- try_test(snmp_framework_mib),
- ?line unload_master("SNMP-FRAMEWORK-MIB").
-
-snmp_framework_mib_2(X) -> snmp_framework_mib(X).
-
-snmp_framework_mib_3(suite) -> [];
-snmp_framework_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(snmp_framework_mib).
-
-
-%% Req. SNMP-FRAMEWORK-MIB
-snmp_framework_mib() ->
- ?line ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
- ?line [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
- sleep(5000),
- ?line [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
- if
- EngineTime+7 < EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- EngineTime+4 > EngineTime2 ->
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
- true -> ok
- end,
- ?line case get_req(4, [[snmpEngineBoots,0]]) of
- [Boots] when integer(Boots) -> ok;
- Else -> ?FAIL(Else)
- end,
- ok.
-
-%%-----------------------------------------------------------------
-%% o Test the counters
-%%-----------------------------------------------------------------
-snmp_mpd_mib_3(suite) -> [];
-snmp_mpd_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- UnknownPDUHs = try_test(snmp_mpd_mib_a),
- try_test(snmp_mpd_mib_b, [], [{context_engine_id, "bad engine"}]),
- try_test(snmp_mpd_mib_c, [UnknownPDUHs]).
-
-
-%% Req. SNMP-MPD-MIB
-snmp_mpd_mib_a() ->
- ?line [UnknownSecs, InvalidMsgs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0]]),
- Pdu = #pdu{type = 'get-request',
- request_id = 23,
- error_status = noError,
- error_index = 0,
- varbinds = []},
- SPdu = #scopedPdu{contextEngineID = "agentEngine",
- contextName = "",
- data = Pdu},
- ?line SPDUBytes = snmp_pdus:enc_scoped_pdu(SPdu),
- V3Hdr1 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [7],
- msgSecurityModel = 23, % bad sec model
- msgSecurityParameters = []},
- V3Hdr2 = #v3_hdr{msgID = 21,
- msgMaxSize = 484,
- msgFlags = [6], % bad flag combination
- msgSecurityModel = 3,
- msgSecurityParameters = []},
- Message1 = #message{version = 'version-3', vsn_hdr = V3Hdr1,
- data = SPDUBytes},
- Message2 = #message{version = 'version-3', vsn_hdr = V3Hdr2,
- data = SPDUBytes},
- ?line MsgBytes1 = snmp_pdus:enc_message_only(Message1),
- ?line MsgBytes2 = snmp_pdus:enc_message_only(Message2),
- snmp_test_mgr:send_bytes(MsgBytes1),
- snmp_test_mgr:send_bytes(MsgBytes2),
-
- ?line [UnknownSecs2, InvalidMsgs2, UnknownPDUHs] =
- get_req(1, [[snmpUnknownSecurityModels,0],
- [snmpInvalidMsgs,0],
- [snmpUnknownPDUHandlers, 0]]),
- ?line UnknownSecs2 = UnknownSecs + 1,
- ?line InvalidMsgs2 = InvalidMsgs + 1,
- UnknownPDUHs.
-
--define(snmpUnknownPDUHandlers_instance, [1,3,6,1,6,3,11,2,1,3,0]).
-snmp_mpd_mib_b() ->
- g([[sysUpTime,0]]),
- ?line expect(1, report, [{?snmpUnknownPDUHandlers_instance, any}]).
-
-
-snmp_mpd_mib_c(UnknownPDUHs) ->
- ?line [UnknownPDUHs2] = get_req(1, [[snmpUnknownPDUHandlers, 0]]),
- ?line UnknownPDUHs2 = UnknownPDUHs + 1.
-
-
-snmp_target_mib(suite) -> [];
-snmp_target_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-TARGET-MIB"),
- try_test(snmp_target_mib),
- ?line unload_master("SNMP-TARGET-MIB").
-
-snmp_target_mib_2(X) -> snmp_target_mib(X).
-
-snmp_target_mib_3(X) -> snmp_target_mib(X).
-
-snmp_target_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-snmp_notification_mib(suite) -> [];
-snmp_notification_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- try_test(snmp_notification_mib),
- ?line unload_master("SNMP-NOTIFICATION-MIB").
-
-snmp_notification_mib_2(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib_3(X) -> snmp_notification_mib(X).
-
-snmp_notification_mib() ->
- ?INF("NOT YET IMPLEMENTED", []),
- nyi.
-
-%%-----------------------------------------------------------------
-%% o add/delete views and try them
-%% o try boundaries
-%%-----------------------------------------------------------------
-snmp_view_based_acm_mib(suite) -> [];
-snmp_view_based_acm_mib(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master("Test2"),
- snmp_view_based_acm_mib(),
- ?line unload_master("Test2"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-snmp_view_based_acm_mib_2(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib_3(X) -> snmp_view_based_acm_mib(X).
-
-snmp_view_based_acm_mib() ->
- snmpa:verbosity(net_if,trace),
- snmpa:verbosity(master_agent,trace),
- ?LOG("start snmp_view_based_acm_mib test",[]),
- %% The user "no-rights" is present in USM, and is mapped to security
- %% name 'no-rights", which is not present in VACM.
- %% So, we'll add rights for it, try them and delete them.
- %% We'll give "no-rights" write access to tDescr.0 and read access
- %% to tDescr2.0
- %% These are the options we'll use to the mgr
- Opts = [{user, "no-rights"}, {community, "no-rights"}],
- %% Find the valid secmodel, and one invalid secmodel.
- {SecMod, InvSecMod} =
- case get(vsn) of
- v1 -> {?SEC_V1, ?SEC_V2C};
- v2 -> {?SEC_V2C, ?SEC_USM};
- v3 -> {?SEC_USM, ?SEC_V1}
- end,
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Now, add a mapping from "no-rights" -> "no-rights-group"
- GRow1Status = [vacmSecurityToGroupStatus,[SecMod, 9,"no-rights"]],
- GRow1 =
- [{[vacmGroupName, [SecMod, 9,"no-rights"]], "no-rights-group"},
- {GRow1Status, ?createAndGo}],
- ?DBG("set '~p'",[GRow1]),
- ?line try_test(do_set, [GRow1]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create a mapping for another sec model, and make sure it dosn't
- %% give us access
- GRow2Status = [vacmSecurityToGroupStatus,[InvSecMod, 9,"no-rights"]],
- GRow2 = [{[vacmGroupName, [InvSecMod, 9, "no-rights"]], "initial"},
- {GRow2Status, ?createAndGo}],
-
- ?DBG("set '~p'",[GRow2]),
- ?line try_test(do_set, [GRow2]),
-
- ?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [GRow2Status]),
-
- RVName = "rv_name",
- WVName = "wv_name",
-
- %% Access row
- ARow1Idx = [15 | "no-rights-group"] ++ [0, ?SEC_ANY, 1],
- ARow1Status = [vacmAccessStatus, ARow1Idx],
- ARow1 = [{[vacmAccessContextMatch, ARow1Idx], 1},
- {[vacmAccessReadViewName, ARow1Idx], RVName},
- {[vacmAccessWriteViewName, ARow1Idx], WVName},
- {ARow1Status, ?createAndGo}],
-
- %% This access row would give acces, if InvSecMod was valid.
- ARow2Idx = [15 | "no-rights-group"] ++ [0, InvSecMod, 1],
- ARow2Status = [vacmAccessStatus, ARow2Idx],
- ARow2 = [{[vacmAccessContextMatch, ARow2Idx], 1},
- {[vacmAccessReadViewName, ARow2Idx], "internet"},
- {[vacmAccessWriteViewName, ARow2Idx], "internet"},
- {ARow2Status, ?createAndGo}],
-
- ?line try_test(do_set, [ARow2]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete that row
- ?line try_test(del_row, [ARow2Status]),
-
-
- %% Add valid row
- ?line try_test(do_set, [ARow1]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Create the view family
- VRow1Idx = mk_ln(RVName) ++ mk_ln(?xDescr), % object access
- VRow2Idx = mk_ln(RVName) ++ mk_ln(?xDescr2 ++ [0]), % instance access
- VRow3Idx = mk_ln(WVName) ++ mk_ln(?xDescr), % object access
- VRow4Idx = mk_ln(WVName) ++ mk_ln(?xDescr ++ [0]), % instance access
- VRow1Status = [vacmViewTreeFamilyStatus, VRow1Idx],
- VRow2Status = [vacmViewTreeFamilyStatus, VRow2Idx],
- VRow3Status = [vacmViewTreeFamilyStatus, VRow3Idx],
- VRow4Status = [vacmViewTreeFamilyStatus, VRow4Idx],
-
- ?line try_test(add_row, [VRow1Status]),
- ?line try_test(add_row, [VRow2Status]),
- ?line try_test(add_row, [VRow3Status]),
-
- %% We're supposed to have access now...
- ?line try_test(use_rights, [], Opts),
-
- %% Change Row3 to Row4
- ?line try_test(del_row, [VRow3Status]),
- ?line try_test(add_row, [VRow4Status]),
-
- %% We should still have access...
- ?line try_test(use_rights, [], Opts),
-
- %% Delete rows
- ?line try_test(del_row, [GRow1Status]),
-
- ?line try_test(use_no_rights, [], Opts),
-
- %% Delete rest of rows
- ?line try_test(del_row, [ARow1Status]),
- ?line try_test(del_row, [VRow1Status]),
- ?line try_test(del_row, [VRow2Status]),
- ?line try_test(del_row, [VRow4Status]),
-
- ?line try_test(use_no_rights, [], Opts),
- snmpa:verbosity(master_agent,log).
-
-do_set(Row) ->
- s(Row),
- expect(1, Row).
-
-add_row(RowStatus) ->
- s([{RowStatus, ?createAndGo}]),
- expect(1, [{RowStatus, ?createAndGo}]).
-
-del_row(RowStatus) ->
- s([{RowStatus, ?destroy}]),
- expect(1, [{RowStatus, ?destroy}]).
-
-
-
-use_no_rights() ->
- g([[xDescr,0]]),
- ?v1_2_3(expect(11, noSuchName, 1, any),
- expect(12, [{[xDescr,0], noSuchObject}]),
- expect(13, authorizationError, 1, any)),
- g([[xDescr2,0]]),
- ?v1_2_3(expect(21, noSuchName, 1, any),
- expect(22, [{[xDescr2,0], noSuchObject}]),
- expect(23, authorizationError, 1, any)),
- gn([[xDescr]]),
- ?v1_2_3(expect(31, noSuchName, 1, any),
- expect(32, [{[xDescr], endOfMibView}]),
- expect(33, authorizationError, 1, any)),
- s([{[xDescr,0], "tryit"}]),
- ?v1_2_3(expect(41, noSuchName, 1, any),
- expect(42, noAccess, 1, any),
- expect(43, authorizationError, 1, any)).
-
-
-use_rights() ->
- g([[xDescr,0]]),
- expect(1, [{[xDescr,0], any}]),
- g([[xDescr2,0]]),
- expect(2, [{[xDescr2,0], any}]),
- s([{[xDescr,0], "tryit"}]),
- expect(3, noError, 0, any),
- g([[xDescr,0]]),
- expect(4, [{[xDescr,0], "tryit"}]).
-
-mk_ln(X) ->
- [length(X) | X].
-
-%%-----------------------------------------------------------------
-%% o add/delete users and try them
-%% o test all secLevels
-%% o test all combinations of protocols
-%% o try bad ops; check counters
-%%-----------------------------------------------------------------
-snmp_user_based_sm_mib_3(suite) -> [];
-snmp_user_based_sm_mib_3(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- _AgentDir = ?config(agent_dir, Config),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
-
- %% The newUser used here already has VACM access.
-
- %% Add a new user in the simplest way; just createAndGo
- try_test(v3_sync, [[{usm_add_user1, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new user
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey1 = snmp:passwd2localized_key(sha, "new sha password", "agentEngine"),
- DesKey1 = lists:sublist(ShaKey1, 16),
-
- %% Change the new user's keys - 1
- try_test(v3_sync, [[{usm_key_change1, [ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- MgrDir = ?config(mgr_dir, Config),
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
-
- ShaKey2 = snmp:passwd2localized_key(sha, "newer password", "agentEngine"),
- DesKey2 = lists:sublist(ShaKey2, 16),
-
- %% Change the new user's keys - 2
- ?line try_test(v3_sync,
- [[{usm_key_change2, [ShaKey1, DesKey1, ShaKey2, DesKey2]}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
-
- %% Try to use the new keys
- reset_usm_mgr(MgrDir),
- ?line rewrite_usm_mgr(MgrDir, ShaKey2, DesKey2),
- ?line load_master("Test2"),
- ?line try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Change the new user's keys - 3
- ?line try_test(v3_sync,
- [[{usm_key_change3, [ShaKey2, DesKey2, ShaKey1, DesKey1]}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try to use the new keys
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
- try_test(v3_sync, [[{usm_use_user, []}]],
- [{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
- reset_usm_mgr(MgrDir),
-
- %% Try some read requests
- ?line try_test(v3_sync, [[{usm_read, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Delete the new user
- ?line try_test(v3_sync, [[{usm_del_user, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- %% Try some bad requests
- ?line try_test(v3_sync, [[{usm_bad, []}]],
- [{sec_level, authPriv}, {user, "privDES"}]),
-
- ?line unload_master("SNMP-USER-BASED-SM-MIB").
-
--define(usmUserSecurityName, [1,3,6,1,6,3,15,1,2,2,1,3]).
-
-usm_add_user1() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
-usm_use_user() ->
- v2_proc().
-
-
-%% Change own public keys
-usm_key_change1(ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_shaxxxxxxxxxx",
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- "passwd_desxxxxxx",
- DesKey),
- Vbs1 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change own private keys
-usm_key_change2(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs1),
- ?line expect(1, Vbs1).
-
-%% Change other's public keys
-usm_key_change3(OldShaKey, OldDesKey, ShaKey, DesKey) ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ShaKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldShaKey,
- ShaKey),
- DesKeyChange = snmp_user_based_sm_mib:mk_key_change(sha,
- OldDesKey,
- DesKey),
- Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange}],
- s(Vbs1),
- ?line expect(1, noAccess, 1, any),
- Vbs2 = [{[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs2),
- ?line expect(2, noAccess, 1, any),
-
-
- Vbs3 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
- {[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
- s(Vbs3),
- ?line expect(1, Vbs3).
-
-usm_read() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ?line g([[usmUserSecurityName, NewRowIndex],
- [usmUserCloneFrom, NewRowIndex],
- [usmUserAuthKeyChange, NewRowIndex],
- [usmUserOwnAuthKeyChange, NewRowIndex],
- [usmUserPrivKeyChange, NewRowIndex],
- [usmUserOwnPrivKeyChange, NewRowIndex]]),
- ?line expect(1,
- [{[usmUserSecurityName, NewRowIndex], "newUser"},
- {[usmUserCloneFrom, NewRowIndex], [0,0]},
- {[usmUserAuthKeyChange, NewRowIndex], ""},
- {[usmUserOwnAuthKeyChange, NewRowIndex], ""},
- {[usmUserPrivKeyChange, NewRowIndex], ""},
- {[usmUserOwnPrivKeyChange, NewRowIndex], ""}]),
- ok.
-
-
-
-usm_del_user() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- Vbs1 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs1),
- ?line expect(1, Vbs1),
- ok.
-
--define(usmUserCloneFrom, [1,3,6,1,6,3,15,1,2,2,1,4]).
-
--define(usmNoAuthProtocol, [1,3,6,1,6,3,10,1,1,1]).
-
--define(usmHMACMD5AuthProtocol, [1,3,6,1,6,3,10,1,1,2]).
-
--define(usmHMACSHAAuthProtocol, [1,3,6,1,6,3,10,1,1,3]).
-
--define(usmNoPrivProtocol, [1,3,6,1,6,3,10,1,2,1]).
-
--define(usmDESPrivProtocol, [1,3,6,1,6,3,10,1,2,2]).
-
-usm_bad() ->
- NewRowIndex = [11,"agentEngine", 7, "newUser"],
- RowPointer1 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDOS"],
- Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer1},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line expect(1, inconsistentName, 1, any),
-
- RowPointer2 = ?usmUserCloneFrom ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs2 = [{[usmUserCloneFrom, NewRowIndex], RowPointer2},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs2),
- ?line expect(2, wrongValue, 1, any),
-
- RowPointer3 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
- Vbs3 = [{[usmUserCloneFrom, NewRowIndex], RowPointer3},
- {[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs3),
- ?line expect(3, Vbs3),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmNoAuthProtocol}]),
- ?line expect(4, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmHMACMD5AuthProtocol}]),
- ?line expect(5, inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmDESPrivProtocol}]),
- ?line expect(6, wrongValue, 1, any),
- ?line s([{[usmUserPrivProtocol, NewRowIndex], ?usmHMACSHAAuthProtocol}]),
- ?line expect(7, wrongValue, 1, any),
-
- Vbs4 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs4),
- ?line expect(1, Vbs4),
-
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Loop through entire MIB, to make sure that all instrum. funcs
-%% works.
-%% Load all std mibs that are not loaded by default.
-%%-----------------------------------------------------------------
-loop_mib(suite) -> [];
-loop_mib(Config) when list(Config) ->
- ?LOG("loop_mib -> initiate case",[]),
- %% snmpa:verbosity(master_agent,debug),
- %% snmpa:verbosity(mib_server,info),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib -> load mib SNMP-COMMUNITY-MIB",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> load mib SNMP-MPD-MIB",[]),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> load mib SNMP-TARGET-MIB",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> load mib SNMP-NOTIFICATION-MIB",[]),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> load mib SNMP-FRAMEWORK-MIB",[]),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> load mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?DBG("loop_mib -> try",[]),
- try_test(loop_mib_1),
- ?DBG("loop_mib -> unload mib SNMP-COMMUNITY-MIB",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-MPD-MIB",[]),
- ?line unload_master("SNMP-MPD-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-TARGET-MIB",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-NOTIFICATION-MIB",[]),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-FRAMEWORK-MIB",[]),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?DBG("loop_mib -> unload mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- %% snmpa:verbosity(master_agent,log),
- %% snmpa:verbosity(mib_server,silence),
- ?LOG("loop_mib -> done",[]).
-
-
-loop_mib_2(suite) -> [];
-loop_mib_2(Config) when list(Config) ->
- ?LOG("loop_mib_2 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_2 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_2 -> load mibs",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_2 -> unload mibs",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?LOG("loop_mib_2 -> done",[]).
-
-
-loop_mib_3(suite) -> [];
-loop_mib_3(Config) when list(Config) ->
- ?LOG("loop_mib_3 -> initiate case",[]),
- {SaNode, MgrNode, MibDir} = init_case(Config),
- ?DBG("loop_mib_3 -> ~n"
- "\tSaNode: ~p~n"
- "\tMgrNode: ~p~n"
- "\tMibDir: ~p",[SaNode, MgrNode, MibDir]),
- ?DBG("loop_mib_3 -> load mibs",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- try_test(loop_mib_2),
- ?DBG("loop_mib_3 -> unload mibs",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?LOG("loop_mib_3 -> done",[]).
-
-
-%% Req. As many mibs all possible
-loop_mib_1() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_1([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_1(Oid, N) ->
- ?DBG("loop_it_1 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_1 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_1 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_1(NOid, N+1);
- #pdu{type='get-response', error_status=noSuchName, error_index=1,
- varbinds=[_]} ->
- ?DBG("loop_it_1 -> done",[]),
- N;
-
- #pdu{type = Type, error_status = Err, error_index = Idx,
- varbinds = Vbs} ->
- exit({unexpected_pdu, ?LINE, Type, Err, Idx, Vbs})
- end.
-
-%% Req. As many mibs all possible
-loop_mib_2() ->
- ?DBG("loop_mib_1 -> entry",[]),
- N = loop_it_2([1,1], 0),
- io:format(user, "found ~w varibles\n", [N]),
- ?line N = if N < 100 -> 100;
- true -> N
- end.
-
-
-loop_it_2(Oid, N) ->
- ?DBG("loop_it_2 -> entry with~n"
- "\tOid: ~p~n"
- "\tN: ~p",[Oid,N]),
- case get_next_req([Oid]) of
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid, value = endOfMibView}]} ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p",[NOid]),
- N;
- #pdu{type='get-response', error_status=noError, error_index=0,
- varbinds=[#varbind{oid = NOid,value = Value}]} when NOid > Oid ->
- ?DBG("loop_it_2 -> ~n"
- "\tNOid: ~p~n"
- "\tValue: ~p",[NOid,Value]),
- ?line [Value2] = get_req(1, [NOid]), % must not be same
- ?DBG("loop_it_2 -> ~n"
- "\tValue2: ~p",[Value2]),
- loop_it_2(NOid, N+1)
- end.
-
-
-%%%-----------------------------------------------------------------
-%%% Testing of reported bugs and other tickets.
-%%%-----------------------------------------------------------------
-
-
-
-
-
-%% These are (ticket) test cases where the initiation has to be done
-%% individually.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1128
-%% Slogan: Bug in handling of createAndWait set-requests.
-%%-----------------------------------------------------------------
-otp_1128(suite) -> [];
-otp_1128(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1128),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1128_2(X) -> otp_1128(X).
-
-otp_1128_3(X) -> otp_1128(X).
-
-otp_1128() ->
- io:format("Testing bug reported in ticket OTP-1128...~n"),
-
- NewKeyc3 = [intCommunityViewIndex,get(mip),is("test")],
- NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
- NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
-
- s([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- ?line expect(28, [{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- g([NewKeyc5]),
- ?line expect(29, [{NewKeyc5, ?notReady}]),
- s([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- ?line expect(30, [{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- g([NewKeyc5]),
- ?line expect(31, [{NewKeyc5, ?active}]),
- s([{NewKeyc5, ?destroy}]),
- ?line expect(32, [{NewKeyc5, ?destroy}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1129, OTP-1169
-%% Slogan: snmpa:int_to_enum crashes on bad oids
-%%-----------------------------------------------------------------
-otp_1129(suite) -> [];
-otp_1129(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- try_test(otp_1129_i, [node()]),
- ?line unload_master("Klas3").
-
-otp_1129_2(X) -> otp_1129(X).
-
-otp_1129_3(X) -> otp_1129(X).
-
-otp_1129_i(MaNode) ->
- io:format("Testing bug reported in ticket OTP-1129...~n"),
- false = rpc:call(MaNode, snmp, int_to_enum, [iso, 1]),
- false = rpc:call(MaNode, snmp, int_to_enum, [isox, 1]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1131
-%% Slogan: Agent crashes / erlang node halts if RowIndex in a
-%% setrequest is of bad type, e.g. an INDEX {INTEGER},
-%% and RowIdenx [3,2].
-%%-----------------------------------------------------------------
-otp_1131(suite) -> [];
-otp_1131(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas1"),
- try_test(otp_1131),
- ?line unload_master("Klas1").
-
-otp_1131_2(X) -> otp_1131(X).
-
-otp_1131_3(X) -> otp_1131(X).
-
-otp_1131() ->
- io:format("Testing bug reported in ticket OTP-1131...~n"),
- s([{[friendsEntry, [2, 3, 1]], s, "kompis3"},
- {[friendsEntry, [3, 3, 1]], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 2, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1162
-%% Slogan: snmp_agent can't handle wrongValue from instrum.func
-%%-----------------------------------------------------------------
-otp_1162(suite) -> [];
-otp_1162(Config) when list(Config) ->
- {SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
- try_test(otp_1162),
- stop_subagent(SA).
-
-otp_1162_2(X) -> otp_1162(X).
-
-otp_1162_3(X) -> otp_1162(X).
-
-otp_1162() ->
- s([{[sa, [2,0]], 6}]), % wrongValue (i is_set_ok)
- ?line expect(1, ?v1_2(badValue, wrongValue), 1, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1222
-%% Slogan: snmp agent crash if faulty index is returned from instrum
-%%-----------------------------------------------------------------
-otp_1222(suite) -> [];
-otp_1222(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas3"),
- ?line load_master("Klas4"),
- try_test(otp_1222),
- ?line unload_master("Klas3"),
- ?line unload_master("Klas4").
-
-otp_1222_2(X) -> otp_1222(X).
-
-otp_1222_3(X) -> otp_1222(X).
-
-otp_1222() ->
- io:format("Testing bug reported in ticket OTP-1222...~n"),
- s([{[fStatus4,1], 4}, {[fName4,1], 1}]),
- ?line expect(1, genErr, 0, any),
- s([{[fStatus4,2], 4}, {[fName4,2], 1}]),
- ?line expect(2, genErr, 0, any).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1298
-%% Slogan: Negative INTEGER values are treated as positive.
-%%-----------------------------------------------------------------
-otp_1298(suite) -> [];
-otp_1298(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1298),
- ?line unload_master("Klas2").
-
-otp_1298_2(X) -> otp_1298(X).
-
-otp_1298_3(X) -> otp_1298(X).
-
-otp_1298() ->
- io:format("Testing bug reported in ticket OTP-1298...~n"),
- s([{[fint,0], -1}]),
- ?line expect(1298, [{[fint,0], -1}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1331
-%% Slogan: snmp_generic should return noError when deleting non-ex row
-%%-----------------------------------------------------------------
-otp_1331(suite) -> [];
-otp_1331(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1331),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1331_2(X) -> otp_1331(X).
-
-otp_1331_3(X) -> otp_1331(X).
-
-otp_1331() ->
- NewKeyc5 = [intCommunityStatus,[127,32,0,0],is("test")],
- s([{NewKeyc5, ?destroy}]),
- ?line expect(1, [{NewKeyc5, ?destroy}]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1338
-%% Slogan: snmp bug in initialisation of default values for mnesia tabs
-%%-----------------------------------------------------------------
-otp_1338(suite) -> [];
-otp_1338(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas2"),
- try_test(otp_1338),
- ?line unload_master("Klas2").
-
-otp_1338_2(X) -> otp_1338(X).
-
-otp_1338_3(X) -> otp_1338(X).
-
-otp_1338() ->
- s([{[kStatus2, 7], i, ?createAndGo}]),
- ?line expect(1, [{[kStatus2, 7], ?createAndGo}]),
- g([[kName2, 7]]),
- ?line expect(2, [{[kName2, 7], "JJJ"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1342
-%% Slogan: default impl of snmp table can't handle bad index access,
-%% Set when INDEX is read-write gets into an infinite loop!
-%%-----------------------------------------------------------------
-otp_1342(suite) -> [];
-otp_1342(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Klas4"),
- try_test(otp_1342),
- ?line unload_master("Klas4").
-
-otp_1342_2(X) -> otp_1342(X).
-
-otp_1342_3(X) -> otp_1342(X).
-
-otp_1342() ->
- s([{[fIndex5, 1], i, 1},
- {[fName5, 1], i, 3},
- {[fStatus5, 1], i, ?createAndGo}]),
- ?line expect(1, ?v1_2(noSuchName, noCreation), 3, any).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-1366
-%% Slogan: snmp traps not sent to all managers
-%% Note: NYI! We need a way to tell the test server that we need
-%% mgrs on two different machines.
-%%-----------------------------------------------------------------
-otp_1366(suite) -> [];
-otp_1366(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_1366),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-otp_1366_2(X) -> otp_1366(X).
-
-otp_1366_3(X) -> otp_1366(X).
-
-otp_1366() ->
- ?INF("NOT YET IMPLEMENTED", []),
- 'NYI'.
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2776
-%% Slogan: snmp:validate_date_and_time() fails when time is 00:00
-%%-----------------------------------------------------------------
-otp_2776(suite) -> [];
-otp_2776(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_2776).
-
-otp_2776_2(X) -> otp_2776(X).
-
-otp_2776_3(X) -> otp_2776(X).
-
-otp_2776() ->
- io:format("Testing bug reported in ticket OTP-2776...~n"),
-
- Dt01_valid = [19,98,9,1,1,0,23,0,43,0,0],
- Dt02_valid = [19,98,9,1,0,0,0,0,43,0,0], % This is what is fixed: 00:00
- Dt03_valid = [19,98,2,28,1,0,23,0,43,0,0],
- Dt04_invalid = [19,98,2,29,1,0,23,0,43,0,0],
- Dt05_valid = [19,96,2,29,1,0,23,0,43,0,0],
- Dt06_valid = [20,0,2,29,1,0,23,0,43,0,0],
- Dt07_invalid = [19,96,2,30,1,0,23,0,43,0,0], % This is also fixed: 30/2
- Dt08_valid = [19,98,4,30,1,0,23,0,43,0,0],
- Dt09_invalid = [19,98,4,31,1,0,23,0,43,0,0], % This is also fixed: 31/4
- Dt10_invalid = [],
- Dt11_invalid = [kalle,hobbe],
- L = [{ 1, true, Dt01_valid},
- { 2, true, Dt02_valid},
- { 3, true, Dt03_valid},
- { 4, false, Dt04_invalid},
- { 5, true, Dt05_valid},
- { 6, true, Dt06_valid},
- { 7, false, Dt07_invalid},
- { 8, true, Dt08_valid},
- { 9, false, Dt09_invalid},
- {10, false, Dt10_invalid},
- {11, false, Dt11_invalid}],
-
- ?line ok = validate_dat(L).
-
-
-validate_dat(L) -> validate_dat(L,[]).
-
-validate_dat([],V) ->
- Fun = fun({_,X}) -> case X of
- ok -> false;
- _ -> true
- end
- end,
- validate_dat1( lists:reverse( lists:filter(Fun,V) ) );
-validate_dat([{Id,E,Dat}|T],V) ->
- validate_dat(T,[validate_dat2(Id,E,Dat) | V]).
-
-validate_dat1([]) -> ok;
-validate_dat1(L) -> {error,L}.
-
-validate_dat2(Id, E, Dat) ->
- Res = case {E,snmp:validate_date_and_time(Dat)} of
- {E,E} -> ok;
- {E,A} -> {E,A}
- end,
- {Id, Res}.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-2979
-%% Slogan: get-next on more than 1 column in an empty table
-%% returns bad response.
-%%-----------------------------------------------------------------
-otp_2979(suite) -> [];
-otp_2979(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master("Test1"),
- ?line init_old(),
- try_test(otp_2979),
- ?line unload_master("Test1").
-
-otp_2979_2(X) -> otp_2979(X).
-
-otp_2979_3(X) -> otp_2979(X).
-
-otp_2979() ->
- gn([[sparseDescr], [sparseStatus]]),
- ?line expect(1, [{[sparseStr,0], "slut"},
- {[sparseStr,0], "slut"}]).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3187
-%% Slogan: get-next on vacmAccessTable for colums > 5 returns
-%% endOfTable - should return value.
-%%-----------------------------------------------------------------
-otp_3187(suite) -> [];
-otp_3187(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- otp_3187(),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
-
-otp_3187_2(X) -> otp_3187(X).
-
-otp_3187_3(X) -> otp_3187(X).
-
-otp_3187() ->
- ?line Elements =
- snmp_view_based_acm_mib:vacmAccessTable(get_next,[],[4,5,6]),
- lists:foreach(fun(E) ->
- ?line if E == endOfTable ->
- ?FAIL(endOfTable);
- true -> ok
- end
- end, Elements).
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3542
-%% Slogan:
-%%-----------------------------------------------------------------
-otp_3542(suite) -> [];
-otp_3542(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_3542).
-
-otp_3542() ->
- io:format("SNMP v3 discovery...~n"),
- ?line Res = snmp_test_mgr:d(),
- io:format("SNMP v3 discovery result: ~p~n",[Res]).
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-3725
-%% Slogan: Slow response time on snmpa:int_to_enum
-%%-----------------------------------------------------------------
-otp_3725(suite) -> [];
-otp_3725(Config) when list(Config) ->
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
-
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
- try_test(otp_3725_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
-
-%% Req. OLD-SNMPEA-MIB
-otp_3725_test(MaNode) ->
- io:format("Testing feature requested in ticket OTP-3725...~n"),
- ?line rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
- ?line Db = rpc:call(MaNode,snmp,get_symbolic_store_db,[]),
- ?DBG("otp_3725_test -> Db = ~p",[Db]),
-
- ?line {value, OID} = rpc:call(MaNode, snmp, name_to_oid,
- [Db, intAgentIpAddress]),
- ?DBG("otp_3725_test -> name_to_oid for ~p: ~p",[intAgentIpAddress,OID]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmp, oid_to_name,
- [Db,OID]),
- ?DBG("otp_3725_test -> oid_to_name for ~p: ~p",[OID,intAgentIpAddress]),
- ?line false = rpc:call(MaNode, snmp, name_to_oid, [Db, intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmp, oid_to_name,
- [Db, [1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intViewType, 2]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, intViewType, 3]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum,
- [Db, intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmp, int_to_enum,
- [Db, 'RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmp, enum_to_int,
- [Db, 'xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmp, int_to_enum, [Db, 'xxRowStatus', 1]),
- ok.
-
-
-%%-----------------------------------------------------------------
-%% Ticket: OTP-4394
-%% Slogan: Target mib tag list check invalid
-%%-----------------------------------------------------------------
-
-
-
-init_otp_4394(Config) when list(Config) ->
- ?DBG("init_otp_4394 -> entry with"
- "~n Config: ~p", [Config]),
- ?line AgentDir = ?config(agent_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line otp_4394_config(AgentDir, MgrDir, Ip),
- MasterAgentVerbosity = {master_agent_verbosity, trace},
- NetIfVerbosity = {net_if_verbosity, trace},
- Opts = [MasterAgentVerbosity,NetIfVerbosity],
- [{vsn, v1} | start_v1_agent(Config,Opts)].
-
-otp_4394_config(AgentDir, MgrDir, Ip0) ->
- ?DBG("otp_4394_config -> entry with"
- "~n AgentDir: ~p"
- "~n MgrDir: ~p"
- "~n Ip0: ~p", [AgentDir, MgrDir, Ip0]),
- Vsn = [v1],
- Ip = tuple_to_list(Ip0),
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsn, Ip,
- ?TRAP_UDP, Ip, 4000,
- "OTP-4394 test"),
- ?line case update_usm(Vsn, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsn, MgrDir);
- false ->
- ?line ok
- end,
- C1 = {"a", "all-rights", "initial", "", "pc"},
- C2 = {"c", "secret", "secret_name", "", "secret_tag"},
- ?line write_community_conf(AgentDir, [C1, C2]),
- ?line update_vacm(Vsn, AgentDir),
- Ta1 = {"shelob v1",
- [134,138,177,177], 5000, 1500, 3, %% Använd Ip och modda
- "pc1",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [],
- 2048},
- Ta2 = {"bifur v1",
- [134,138,177,75], 5000, 1500, 3, %% Använd Ip
- "pc2",
- "target_v1", "",
- %% [255,255,255,255,0,0],
- [], 2048},
- ?line write_target_addr_conf(AgentDir, [Ta1, Ta2]),
- ?line write_target_params_conf(AgentDir, Vsn),
- ?line write_notify_conf(AgentDir),
- ok.
-
-
-
-finish_otp_4394(Config) when list(Config) ->
- ?DBG("finish_otp_4394 -> entry", []),
- C1 = stop_agent(Config),
- delete_files(C1),
- erase(mgr_node),
- lists:keydelete(vsn, 1, C1).
-
-otp_4394_test(suite) -> [];
-otp_4394_test(Config) ->
- ?DBG("otp_4394_test -> entry", []),
- {_SaNode, _MgrNode, _MibDir} = init_case(Config),
- try_test(otp_4394_test1),
- ?DBG("otp_4394_test -> done", []),
- ok.
-
-otp_4394_test1() ->
- ?DBG("otp_4394_test1 -> entry", []),
- gn([[1,1]]),
- Res =
- case snmp_test_mgr:expect(1, [{[sysDescr,0], "Erlang SNMP agent"}]) of
- %% {error, 1, {"?",[]}, {"~w",[timeout]}}
- {error, 1, _, {_, [timeout]}} ->
- ?DBG("otp_4394_test1 -> expected result: timeout", []),
- ok;
- Else ->
- Else
- end,
- ?DBG("otp_4394_test1 -> done with: ~p", [Res]),
- Res.
-
-
-%%%--------------------------------------------------
-%%% Used to test the standard mib with our
-%%% configuration.
-%%%--------------------------------------------------
-run(F, A, Opts) ->
- M = get(mib_dir),
- Dir = get(mgr_dir),
- User = snmp_misc:get_option(user, Opts, "all-rights"),
- SecLevel = snmp_misc:get_option(sec_level, Opts, noAuthNoPriv),
- EngineID = snmp_misc:get_option(engine_id, Opts, "agentEngine"),
- CtxEngineID = snmp_misc:get_option(context_engine_id, Opts, EngineID),
- Community = snmp_misc:get_option(community, Opts, "all-rights"),
- ?DBG("run -> start crypto app",[]),
- Crypto = ?CRYPTO_START(),
- ?DBG("run -> Crypto: ~p",[Crypto]),
- catch snmp_test_mgr:stop(), % If we had a running mgr from a failed case
- StdM = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
- ?DBG("run -> config:~n"
- "\tM: ~p~n"
- "\tDir: ~p~n"
- "\tUser: ~p~n"
- "\tSecLevel: ~p~n"
- "\tEngineID: ~p~n"
- "\tCtxEngineID: ~p~n"
- "\tCommunity: ~p~n"
- "\tStdM: ~p",
- [M,Dir,User,SecLevel,EngineID,CtxEngineID,Community,StdM]),
- case snmp_test_mgr:start([%% {agent, snmp_test_lib:hostname()},
- {packet_server_debug,true},
- {debug,true},
- {agent, get(master_host)},
- {agent_udp, 4000},
- {trap_udp, 5000},
- {recbuf,65535},
- quiet,
- get(vsn),
- {community, Community},
- {user, User},
- {sec_level, SecLevel},
- {engine_id, EngineID},
- {context_engine_id, CtxEngineID},
- {dir, Dir},
- {mibs, mibs(StdM, M)}]) of
- {ok, _Pid} ->
- Res = apply(?MODULE, F, A),
- catch snmp_test_mgr:stop(),
- Res;
- Err ->
- io:format("Error starting manager: ~p\n", [Err]),
- catch snmp_test_mgr:stop(),
- ?line exit({mgr_start, Err})
- end.
-
-
-mibs(StdMibDir,MibDir) ->
- [join(StdMibDir, ?v1_2("STANDARD-MIB.bin", "SNMPv2-MIB.bin")),
- join(MibDir, "OLD-SNMPEA-MIB.bin"),
- join(StdMibDir, "SNMP-FRAMEWORK-MIB"),
- join(StdMibDir, "SNMP-MPD-MIB"),
- join(StdMibDir, "SNMP-VIEW-BASED-ACM-MIB"),
- join(StdMibDir, "SNMP-USER-BASED-SM-MIB"),
- join(StdMibDir, "SNMP-TARGET-MIB"),
- join(StdMibDir, "SNMP-NOTIFICATION-MIB"),
- join(MibDir, "Klas1.bin"),
- join(MibDir, "Klas2.bin"),
- join(MibDir, "Klas3.bin"),
- join(MibDir, "Klas4.bin"),
- join(MibDir, "SA-MIB.bin"),
- join(MibDir, "TestTrap.bin"),
- join(MibDir, "Test1.bin"),
- join(MibDir, "Test2.bin"),
- join(MibDir, "TestTrapv2.bin")].
-
-join(D,F) ->
- filename:join(D,F).
-
-%% string used in index
-is(S) -> [length(S) | S].
-
-try_test(Func) ->
- call(get(mgr_node), ?MODULE, run, [Func, [], []]).
-
-try_test(Func, A) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, []]).
-
-try_test(Func, A, Opts) ->
- call(get(mgr_node), ?MODULE, run, [Func, A, Opts]).
-
-call(N,M,F,A) ->
- ?DBG("call -> entry with~n"
- " N: ~p~n"
- " M: ~p~n"
- " F: ~p~n"
- " A: ~p~n"
- " when~n"
- " get(): ~p",
- [N,M,F,A,get()]),
- spawn(N, ?MODULE, wait, [self(),get(),M,F,A]),
- receive
- {done, {'EXIT', Rn}, Loc} ->
- ?DBG("call -> returned ~p",[{done, {'EXIT', Rn}, Loc}]),
- put(test_server_loc, Loc),
- exit(Rn);
- {done, Ret, Zed} ->
- ?DBG("call -> returned ~p~n",[{done, Ret, Zed}]),
- Ret
- end.
-
-wait(From, Env, M, F, A) ->
- ?DBG("wait -> entry with ~n"
- "\tFrom: ~p~n"
- "\tEnv: ~p",[From,Env]),
- lists:foreach(fun({K,V}) -> put(K,V) end, Env),
- Rn = (catch apply(M, F, A)),
- ?DBG("wait -> Rn: ~n~p", [Rn]),
- From ! {done, Rn, get(test_server_loc)},
- exit(Rn).
-
-expect(A,B) -> ok = snmp_test_mgr:expect(A,B).
-expect(A,B,C) -> ok = snmp_test_mgr:expect(A,B,C).
-expect(A,B,C,D) -> ok = snmp_test_mgr:expect(A,B,C,D).
-expect(A,B,C,D,E,F) -> ok = snmp_test_mgr:expect(A,B,C,D,E,F).
-
-get_req(Id, Vars) ->
- ?DBG("get_req -> entry with~n"
- "\tId: ~p~n"
- "\tVars: ~p",[Id,Vars]),
- g(Vars),
- ?DBG("get_req -> await response",[]),
- {ok, Val} = snmp_test_mgr:get_response(Id, Vars),
- ?DBG("get_req -> response: ~p",[Val]),
- Val.
-
-get_next_req(Vars) ->
- ?DBG("get_next_req -> entry with Vars '~p', send request",[Vars]),
- gn(Vars),
- ?DBG("get_next_req -> await response",[]),
- Response = snmp_test_mgr:receive_response(),
- ?DBG("get_next_req -> response: ~p",[Response]),
- Response.
-
-
-
-start_node(Name) ->
- ?LOG("start_node -> entry with Name: ~p",[Name]),
- M = list_to_atom(?HOSTNAME(node())),
- ?DBG("start_node -> M: ~p",[M]),
- Pa = filename:dirname(code:which(?MODULE)),
- ?DBG("start_node -> Pa: ~p",[Pa]),
-
- Args = case init:get_argument('CC_TEST') of
- {ok, [[]]} ->
- " -pa /clearcase/otp/libraries/snmp/ebin ";
- {ok, [[Path]]} ->
- " -pa " ++ Path;
- error ->
- ""
- end,
- %% Do not use start_link!!! (the proc that calls this one is tmp)
- ?DBG("start_node -> Args: ~p~n",[Args]),
- A = Args ++ " -pa " ++ Pa,
- case (catch ?START_NODE(Name, A)) of
- {ok, Node} ->
- %% Tell the test_server to not clean up things it never started.
- ?DBG("start_node -> Node: ~p",[Node]),
- {ok, Node};
- Else ->
- ?ERR("start_node -> failed with(other): Else: ~p",[Else]),
- ?line ?FAIL(Else)
- end.
-
-
-stop_node(Node) ->
- ?LOG("stop_node -> Node: ~p",[Node]),
- rpc:cast(Node, erlang, halt, []).
-
-p(X) ->
- io:format(user, X++"\n", []).
-
-sleep(X) ->
- receive
- after
- X -> ok
- end.
-
-%%%-----------------------------------------------------------------
-%%% Configuration
-%%%-----------------------------------------------------------------
-config(Vsns, MgrDir, AgentDir, MIp, AIp) ->
- ?line snmp_config:write_agent_snmp_files(AgentDir, Vsns, MIp,
- ?TRAP_UDP, AIp, 4000,
- "test"),
- ?line case update_usm(Vsns, AgentDir) of
- true ->
- ?line copy_file(filename:join(AgentDir, "usm.conf"),
- filename:join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsns, MgrDir);
- false ->
- ?line ok
- end,
- ?line update_community(Vsns, AgentDir),
- ?line update_vacm(Vsns, AgentDir),
- ?line write_target_addr_conf(AgentDir, MIp, ?TRAP_UDP, Vsns),
- ?line write_target_params_conf(AgentDir, Vsns),
- ?line write_notify_conf(AgentDir),
- ok.
-
-delete_files(Config) ->
- Dir = ?config(agent_dir, Config),
- {ok, List} = file:list_dir(Dir),
- lists:foreach(fun(FName) -> file:delete(filename:join(Dir, FName)) end,
- List).
-
-update_usm(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"agentEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"all-rights\", "
- "\"all-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"no-rights\", "
- "\"no-rights\", zeroDotZero, "
- "usmNoAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authMD5\", "
- "\"authMD5\", zeroDotZero, "
- "usmHMACMD5AuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_md5xxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"authSHA\", "
- "\"authSHA\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmNoPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"\"}.\n", []),
- ok = io:format(Fid, "{\"mgrEngine\", \"privDES\", "
- "\"privDES\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-update_usm_mgr(Vsns, Dir) ->
- case lists:member(v3, Vsns) of
- true ->
- {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),[read,write]),
- file:position(Fid, eof),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"passwd_shaxxxxxxxxxx\", \"passwd_desxxxxxx\"}.\n",
- []),
- file:close(Fid),
- true;
- false ->
- false
- end.
-
-rewrite_usm_mgr(Dir, ShaKey, DesKey) ->
- ?line ok = file:rename(filename:join(Dir,"usm.conf"),
- filename:join(Dir,"usm.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"usm.conf"),write),
- ok = io:format(Fid, "{\"agentEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- ok = io:format(Fid, "{\"mgrEngine\", \"newUser\", "
- "\"newUser\", zeroDotZero, "
- "usmHMACSHAAuthProtocol, \"\", \"\", "
- "usmDESPrivProtocol, \"\", \"\", \"\", "
- "\"~s\", \"~s\"}.\n",
- [ShaKey, DesKey]),
- file:close(Fid).
-
-reset_usm_mgr(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"usm.old"),
- filename:join(Dir,"usm.conf")).
-
-
-update_community([v3], _Dir) -> ok;
-update_community(_, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{\"no-rights\",\"no-rights\",\"no-rights\",\"\",\"\"}.\n",
- []),
- file:close(Fid).
-
-
--define(tDescr_instance, [1,3,6,1,2,1,16,1,0]).
-update_vacm(_Vsn, Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"vacm.conf"),[read,write]),
- file:position(Fid, eof),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authMD5\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"authSHA\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"privDES\",\"initial\"}.\n",[]),
- ok=io:format(Fid,"{vacmSecurityToGroup,usm,\"newUser\",\"initial\"}.\n",[]),
- ok = io:format(Fid, "{vacmViewTreeFamily, \"internet\", "
- "~w, excluded, null}.\n", [?tDescr_instance]),
- file:close(Fid).
-
-
-vacm_ver(v1) -> v1;
-vacm_ver(v2) -> v2c;
-vacm_ver(v3) -> usm.
-
-
-write_community_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"community.conf"),write),
- ok = write_community_conf1(Fid, Confs),
- file:close(Fid).
-
-write_community_conf1(_, []) ->
- ok;
-write_community_conf1(Fid, [{ComIdx, ComName, SecName, CtxName, TransTag}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", \"~s\", \"~s\", \"~s\", \"~s\"}.~n",
- [ComIdx, ComName, SecName, CtxName, TransTag]),
- write_community_conf1(Fid, Confs).
-
-
-write_target_addr_conf(Dir, Confs) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- ok = write_target_addr_conf1(Fid, Confs),
- file:close(Fid).
-
-
-write_target_addr_conf1(_, []) ->
- ok;
-write_target_addr_conf1(Fid,
- [{Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz}|Confs]) ->
- ok = io:format(Fid, "{\"~s\", ~w, ~w, ~w, ~w, \"~s\", \"~s\", \"~s\", ~w, ~w}.~n",
- [Name, Ip, Port, Timeout, Retry, TagList, ParamName,
- EngineId, TMask, MaxMsgSz]),
- write_target_addr_conf1(Fid, Confs).
-
-write_target_addr_conf(Dir, ManagerIp, UDP, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
- lists:foreach(fun(Vsn) ->
- ok = io:format(Fid,
- "{\"~s\", ~w, ~w, 1500, 3, "
- "\"std_trap\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP, mk_param(Vsn)]),
- case Vsn of
- v1 -> ok;
- v2 ->
- ok = io:format(Fid,
- "{\"~s.2\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\"}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)]);
- v3 ->
- ok = io:format(Fid,
- "{\"~s.3\",~w,~w,1500,3, "
- "\"std_inform\", \"~s\", "
- "\"mgrEngine\", [], 1024}.~n",
- [mk_ip(ManagerIp, Vsn),
- ManagerIp, UDP,
- mk_param(Vsn)])
- end
- end,
- Vsns),
- file:close(Fid).
-
-mk_param(v1) -> "target_v1";
-mk_param(v2) -> "target_v2";
-mk_param(v3) -> "target_v3".
-
-mk_ip([A,B,C,D], Vsn) ->
- io_lib:format("~w.~w.~w.~w ~w", [A,B,C,D,Vsn]).
-
-
-rewrite_target_addr_conf(Dir,NewPort) ->
- TAFile = filename:join(Dir, "target_addr.conf"),
- ?DBG("rewrite_target_addr_conf -> read target file info of address config file",[]),
- case file:read_file_info(TAFile) of
- {ok, _} -> ok;
- {error, R} -> ?ERR("failure reading file info of "
- "target address config file: ~p",[R]),
- ok
- end,
-
- ?line [TrapAddr|Addrs] =
- snmp_conf:read(TAFile,fun(R) -> rewrite_target_addr_conf1(R) end),
-
- ?DBG("rewrite_target_addr_conf -> TrapAddr: ~p",[TrapAddr]),
-
- NewAddrs = [rewrite_target_addr_conf2(NewPort,TrapAddr)|Addrs],
-
- ?DBG("rewrite_target_addr_conf -> NewAddrs: ~p",[NewAddrs]),
-
- ?line ok = file:rename(filename:join(Dir,"target_addr.conf"),
- filename:join(Dir,"target_addr.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_addr.conf"),write),
-
- ?line ok = rewrite_target_addr_conf3(Fid,NewAddrs),
-
- file:close(Fid).
-
-rewrite_target_addr_conf1(O) ->
- {ok,O}.
-
-rewrite_target_addr_conf2(NewPort,{Name,Ip,_Port,Timeout,Retry,
- "std_trap",EngineId}) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with std_trap",[]),
- {Name,Ip,NewPort,Timeout,Retry,"std_trap",EngineId};
-rewrite_target_addr_conf2(_NewPort,O) ->
- ?LOG("rewrite_target_addr_conf2 -> entry with "
- "~n O: ~p",[O]),
- O.
-
-
-rewrite_target_addr_conf3(_,[]) -> ok;
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,
- ParamName,EngineId}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(1) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % ParamsName
- "\"~s\"}.", % EngineId
- [Name,Ip,Port,Timeout,Retry,ParamName,EngineId]),
- rewrite_target_addr_conf3(Fid,T);
-rewrite_target_addr_conf3(Fid,[{Name,Ip,Port,Timeout,Retry,TagList,
- ParamName,EngineId,TMask,MMS}|T]) ->
- ?LOG("rewrite_target_addr_conf3 -> write(2) ~s",[ParamName]),
- io:format(Fid,
- "{\"~s\", " % Name
- "~p, " % Ip
- "~p, " % Port
- "~p, " % Timeout
- "~p, " % Retry
- "\"~s\", " % TagList
- "\"~s\", " % ParamsName
- "\"~s\"," % EngineId
- "~p, " % TMask
- "~p}.", % MMS
- [Name,Ip,Port,Timeout,Retry,TagList,ParamName,
- EngineId,TMask,MMS]),
- rewrite_target_addr_conf3(Fid,T).
-
-reset_target_addr_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_addr.old"),
- filename:join(Dir,"target_addr.conf")).
-
-write_target_params_conf(Dir, Vsns) ->
- {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- lists:foreach(fun(Vsn) ->
- MP = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> v3
- end,
- SM = if Vsn == v1 -> v1;
- Vsn == v2 -> v2c;
- Vsn == v3 -> usm
- end,
- ok = io:format(Fid, "{\"target_~w\", ~w, ~w, "
- "\"all-rights\", noAuthNoPriv}.~n",
- [Vsn, MP, SM])
- end,
- Vsns),
- file:close(Fid).
-
-rewrite_target_params_conf(Dir, SecName, SecLevel) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.conf"),
- filename:join(Dir,"target_params.old")),
- ?line {ok, Fid} = file:open(filename:join(Dir,"target_params.conf"),write),
- ?line ok = io:format(Fid, "{\"target_v3\", v3, usm, \"~s\", ~w}.~n",
- [SecName, SecLevel]),
- file:close(Fid).
-
-reset_target_params_conf(Dir) ->
- ?line ok = file:rename(filename:join(Dir,"target_params.old"),
- filename:join(Dir,"target_params.conf")).
-
-write_notify_conf(Dir) ->
- {ok, Fid} = file:open(filename:join(Dir,"notify.conf"),write),
- ok = io:format(Fid, "{\"standard trap\", \"std_trap\", trap}.~n", []),
- ok = io:format(Fid, "{\"standard inform\", \"std_inform\",inform}.~n", []),
- file:close(Fid).
-
-ver_to_trap_str([v1]) -> "v1";
-ver_to_trap_str([v2]) -> "v2";
-% default is to use the latest snmp version
-ver_to_trap_str([v1,v2]) -> "v2".
-
-
-
-write_view_conf(Dir) ->
- {ok, Fid} = file:open(a(Dir,"view.conf"),write),
- ok = io:format(Fid, "{2, [1,3,6], included, null}.~n", []),
- ok = io:format(Fid, "{2, ~w, excluded, null}.~n", [?tDescr_instance]),
- file:close(Fid).
-
-a(A,B) -> lists:append(A,B).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-copy_file(From, To) ->
- {ok, Bin} = file:read_file(From),
- ok = file:write_file(To, Bin).
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-display_memory_usage() ->
- Info = snmpa:info(snmp_master_agent),
- TreeSize = lists_key1search(tree_size_bytes, Info),
- ProcMem = lists_key1search(process_memory, Info),
- MibDbSize = lists_key1search([db_memory,mib], Info),
- NodeDbSize = lists_key1search([db_memory,node], Info),
- TreeDbSize = lists_key1search([db_memory,tree], Info),
- ?INF("Memory usage: "
- "~n Tree size: ~p"
- "~n Process memory size: ~p"
- "~n Mib db size: ~p"
- "~n Node db size: ~p"
- "~n Tree db size: ~p",
- [TreeSize, ProcMem, MibDbSize, NodeDbSize, TreeDbSize]).
-
-lists_key1search([], Res) ->
- Res;
-lists_key1search([Key|Keys], List) when atom(Key), list(List) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- lists_key1search(Keys, Val);
- false ->
- undefined
- end;
-lists_key1search(Key, List) when atom(Key) ->
- case lists:keysearch(Key, 1, List) of
- {value, {Key, Val}} ->
- Val;
- false ->
- undefined
- end.
-
-
-regs() ->
- lists:sort(registered()).
diff --git a/lib/snmp/test/klas3.erl b/lib/snmp/test/klas3.erl
index 9a5c388170..40002e8413 100644
--- a/lib/snmp/test/klas3.erl
+++ b/lib/snmp/test/klas3.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -131,7 +131,7 @@ ftab2(set, [2], _Cols) ->
ftab2(set, _, _Cols) ->
{noError, 0};
-%% Unfortunatly we can't force the undo - we don't know which var
+%% Unfortunately we can't force the undo - we don't know which var
%% is tried first.
%ftab2(undo, [3], Cols) ->
% % bad column - In: col 2 & 3
diff --git a/lib/snmp/test/snmp_agent_SUITE.erl b/lib/snmp/test/snmp_agent_SUITE.erl
index bf942715cd..e1172626af 100644
--- a/lib/snmp/test/snmp_agent_SUITE.erl
+++ b/lib/snmp/test/snmp_agent_SUITE.erl
@@ -524,7 +524,7 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
- %% This is a temporary messure to ensure that we can
+ %% This is a temporary measure to ensure that we can
%% test the socket backend without effecting *all*
%% applications on *all* machines.
%% This flag is set only for *one* host.
@@ -721,7 +721,7 @@ end_per_suite(Config0) when is_list(Config0) ->
case snmp_test_mgr_counter_server:stop() of
{ok, Counters} ->
- ?IPRINT("end_per_suite -> sucessfully stopped counter server"
+ ?IPRINT("end_per_suite -> successfully stopped counter server"
"~n Counters: ~p", [Counters]);
{error, Reason} ->
@@ -873,7 +873,7 @@ init_per_group2(GroupName, Config) ->
init_per_group_ipv6(GroupName, Config, Init) ->
%% <OS-CONDITIONAL-SKIP>
- %% This is a higly questionable test.
+ %% This is a highly questionable test.
%% But until we have time to figure out what IPv6 issues
%% are actually causing the failures...
OSSkipable = [{unix,
@@ -1330,7 +1330,7 @@ stop_agent(Config) ->
create_tables(SaNode) ->
- %% ?line {atomic, ok} = mnesia:create_table([{name, friendsTable2},
+ %% {atomic, ok} = mnesia:create_table([{name, friendsTable2},
%% {ram_copies, [SaNode]},
%% {snmp, [{key, integer}]},
%% {attributes, [a1,a2,a3]}]),
@@ -1338,7 +1338,7 @@ create_tables(SaNode) ->
{ram_copies, [SaNode]},
{snmp, [{key, integer}]},
{attributes, [a1,a2,a3]}]),
- %% ?line {atomic, ok} = mnesia:create_table([{name, kompissTable2},
+ %% {atomic, ok} = mnesia:create_table([{name, kompissTable2},
%% {ram_copies, [SaNode]},
%% {snmp, [{key, integer}]},
%% {attributes, [a1,a2,a3]}]),
@@ -1346,7 +1346,7 @@ create_tables(SaNode) ->
{ram_copies, [SaNode]},
{snmp, [{key, integer}]},
{attributes, [a1,a2,a3]}]),
- %% ?line {atomic, ok} = mnesia:create_table([{name, snmp_variables},
+ %% {atomic, ok} = mnesia:create_table([{name, snmp_variables},
%% {attributes, [a1,a2]}]),
mnesia_create_table_or_fail([{name, snmp_variables},
{attributes, [a1,a2]}]),
@@ -1526,14 +1526,14 @@ init_mib_storage_ets(Config) when is_list(Config) ->
init_mib_storage_dets(Config) when is_list(Config) ->
?IPRINT("init_mib_storage_dets -> entry"),
- ?line AgentDbDir = ?GCONF(agent_db_dir, Config),
+ AgentDbDir = ?GCONF(agent_db_dir, Config),
MibStorage = {mib_storage, [{module, snmpa_mib_storage_dets},
{options, [{dir, AgentDbDir}]}]},
init_ms(Config, [MibStorage]).
init_mib_storage_mnesia(Config) when is_list(Config) ->
?IPRINT("init_mib_storage_mnesia -> entry"),
- ?line AgentNode = ?GCONF(snmp_master, Config),
+ AgentNode = ?GCONF(snmp_master, Config),
MibStorage = {mib_storage, [{module, snmpa_mib_storage_mnesia},
{options, [{nodes, [AgentNode]}]}]},
init_ms(Config, [MibStorage]).
@@ -1542,12 +1542,12 @@ init_ms(Config, Opts) when is_list(Config) ->
?IPRINT("init_ms -> entry with"
"~n Config: ~p"
"~n Opts: ~p", [Config, Opts]),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentConfDir = ?GCONF(agent_conf_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentConfDir,
+ SaNode = ?GCONF(snmp_sa, Config),
+ create_tables(SaNode),
+ AgentConfDir = ?GCONF(agent_conf_dir, Config),
+ MgrDir = ?GCONF(mgr_dir, Config),
+ Ip = ?GCONF(ip, Config),
+ config([v1], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip)),
MasterAgentVerbosity = {agent_verbosity, trace},
MibsVerbosity = {mib_server, [{verbosity, trace}]},
@@ -1566,7 +1566,7 @@ init_ms(Config, Opts) when is_list(Config) ->
%% init_size_check_ms(Config, [MibStorage]).
init_size_check_msm(Config) when is_list(Config) ->
- ?line AgentNode = ?GCONF(snmp_master, Config),
+ AgentNode = ?GCONF(snmp_master, Config),
MibStorage = {mib_storage, [{module, snmpa_mib_storage_mnesia},
{options, [{nodes, [AgentNode]}]}]},
init_size_check_ms(Config, [MibStorage]).
@@ -1594,19 +1594,19 @@ init_size_check_ms(Config, Opts) when is_list(Config) ->
AgentConfDir = ?GCONF(agent_conf_dir, Config),
MgrDir = ?GCONF(mgr_dir, Config),
Ip = ?GCONF(ip, Config),
- ?line ok = config([v3], MgrDir, AgentConfDir,
+ ok = config([v3], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip)),
[{vsn, v3} | start_v3_agent(Config, Opts)].
init_varm_mib_storage_dets(Config) when is_list(Config) ->
?IPRINT("init_varm_mib_storage_dets -> entry"),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentDbDir = ?GCONF(agent_db_dir, Config),
- ?line AgentConfDir = ?GCONF(agent_conf_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentConfDir,
+ SaNode = ?GCONF(snmp_sa, Config),
+ create_tables(SaNode),
+ AgentDbDir = ?GCONF(agent_db_dir, Config),
+ AgentConfDir = ?GCONF(agent_conf_dir, Config),
+ MgrDir = ?GCONF(mgr_dir, Config),
+ Ip = ?GCONF(ip, Config),
+ config([v1], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip)),
MibStorage = {mib_storage, [{module, snmpa_mib_storage_dets},
{options, [{dir, AgentDbDir}]}]},
@@ -1621,14 +1621,14 @@ init_varm_mib_storage_dets(Config) when is_list(Config) ->
init_varm_mib_storage_mnesia(Config) when is_list(Config) ->
?IPRINT("init_varm_mib_storage_mnesia -> entry"),
- ?line SaNode = ?GCONF(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentConfDir = ?GCONF(agent_conf_dir, Config),
- ?line MgrDir = ?GCONF(mgr_dir, Config),
- ?line Ip = ?GCONF(ip, Config),
- ?line config([v1], MgrDir, AgentConfDir,
+ SaNode = ?GCONF(snmp_sa, Config),
+ create_tables(SaNode),
+ AgentConfDir = ?GCONF(agent_conf_dir, Config),
+ MgrDir = ?GCONF(mgr_dir, Config),
+ Ip = ?GCONF(ip, Config),
+ config([v1], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip)),
- ?line AgentNode = ?GCONF(snmp_master, Config),
+ AgentNode = ?GCONF(snmp_master, Config),
MibStorage = {mib_storage, [{module, snmpa_mib_storage_mnesia},
{options, [{nodes, [AgentNode]}]}]},
MasterAgentVerbosity = {agent_verbosity, trace},
@@ -1803,49 +1803,47 @@ msm_varm_mib_start(X) ->
?P(msm_varm_mib_start),
varm_mib_start(X).
-ms_size_check(suite) -> [];
ms_size_check(Config) when is_list(Config) ->
?P(ms_size_check),
init_case(Config),
?IPRINT("mib server size check..."),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMPv2-MIB"),
- ?line load_master_std("SNMPv2-TM"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
+ load_master_std("OTP-SNMPEA-MIB"),
+ load_master_std("SNMP-COMMUNITY-MIB"),
+ load_master_std("SNMP-FRAMEWORK-MIB"),
+ load_master_std("SNMP-MPD-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-USER-BASED-SM-MIB"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master_std("SNMPv2-MIB"),
+ load_master_std("SNMPv2-TM"),
?SLEEP(2000),
- ?line display_memory_usage(),
+ display_memory_usage(),
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMPv2-MIB"),
- ?line unload_master("SNMPv2-TM"),
+ unload_master("OTP-SNMPEA-MIB"),
+ unload_master("SNMP-COMMUNITY-MIB"),
+ unload_master("SNMP-FRAMEWORK-MIB"),
+ unload_master("SNMP-MPD-MIB"),
+ unload_master("SNMP-NOTIFICATION-MIB"),
+ unload_master("SNMP-TARGET-MIB"),
+ unload_master("SNMP-USER-BASED-SM-MIB"),
+ unload_master("SNMP-VIEW-BASED-ACM-MIB"),
+ unload_master("SNMPv2-MIB"),
+ unload_master("SNMPv2-TM"),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
ok.
-varm_mib_start(suite) -> [];
varm_mib_start(Config) when is_list(Config) ->
?P(varm_mib_start),
?IPRINT("varm_mib_start -> entry"),
@@ -1862,16 +1860,16 @@ varm_mib_start(Config) when is_list(Config) ->
%% Load all the mibs
HardwiredMibs = loaded_mibs(),
?DBG("varm_mib_start -> load all mibs", []),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-COMMUNITY-MIB"),
+ load_master_std("SNMP-FRAMEWORK-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
%% Unload the hardwired mibs
?DBG("varm_mib_start -> sleep some (before unloading hardwired mibs)", []),
?SLEEP(1000),
?DBG("varm_mib_start -> unload (hardwired) mibs", []),
- ?line unload_mibs(HardwiredMibs), %% unload hardwired
+ unload_mibs(HardwiredMibs), %% unload hardwired
?DBG("varm_mib_start -> sleep some (before stopping agent)", []),
?SLEEP(1000),
@@ -1908,51 +1906,50 @@ varm_mib_start(Config) when is_list(Config) ->
-define(vacmViewSpinLock_instance, [1,3,6,1,6,3,16,1,5,1,0]).
-define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
-ms_me_of(suite) -> [];
ms_me_of(Config) when is_list(Config) ->
?P(ms_me_of),
init_case(Config),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
+ load_master_std("OTP-SNMPEA-MIB"),
+ load_master_std("SNMP-COMMUNITY-MIB"),
+ load_master_std("SNMP-FRAMEWORK-MIB"),
+ load_master_std("SNMP-MPD-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
?SLEEP(2000),
- ?line display_memory_usage(),
+ display_memory_usage(),
?DBG("ms_me_of -> find ~w from SNMP-COMMUNITY-MIB",
[?snmpTrapCommunity_instance]),
- ?line ok = me_of(?snmpTrapCommunity_instance),
+ ok = me_of(?snmpTrapCommunity_instance),
?DBG("ms_me_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
[?vacmViewSpinLock_instance]),
- ?line ok = me_of(?vacmViewSpinLock_instance),
+ ok = me_of(?vacmViewSpinLock_instance),
?DBG("ms_me_of -> find ~w from SNMP-USER-BASED-SM-MIB",
[?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = me_of(?usmStatsNotInTimeWindows_instance),
+ {error, _} = me_of(?usmStatsNotInTimeWindows_instance),
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
+ unload_master("OTP-SNMPEA-MIB"),
+ unload_master("SNMP-COMMUNITY-MIB"),
+ unload_master("SNMP-FRAMEWORK-MIB"),
+ unload_master("SNMP-MPD-MIB"),
+ unload_master("SNMP-NOTIFICATION-MIB"),
+ unload_master("SNMP-TARGET-MIB"),
+ unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
ok.
@@ -1979,52 +1976,51 @@ me_of(Oid) ->
end.
-ms_mib_of(suite) -> [];
ms_mib_of(Config) when is_list(Config) ->
?P(ms_mib_of),
init_case(Config),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
- ?line load_master_std("OTP-SNMPEA-MIB"),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
+ load_master_std("OTP-SNMPEA-MIB"),
+ load_master_std("SNMP-COMMUNITY-MIB"),
+ load_master_std("SNMP-FRAMEWORK-MIB"),
+ load_master_std("SNMP-MPD-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
?SLEEP(2000),
- ?line display_memory_usage(),
+ display_memory_usage(),
?DBG("ms_mib_of -> find ~w from SNMP-COMMUNITY-MIB",
[?snmpTrapCommunity_instance]),
- ?line ok = mib_of(?snmpTrapCommunity_instance, 'SNMP-COMMUNITY-MIB'),
+ ok = mib_of(?snmpTrapCommunity_instance, 'SNMP-COMMUNITY-MIB'),
?DBG("ms_mib_of -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
[?vacmViewSpinLock_instance]),
- ?line ok = mib_of(?vacmViewSpinLock_instance, 'SNMP-VIEW-BASED-ACM-MIB'),
+ ok = mib_of(?vacmViewSpinLock_instance, 'SNMP-VIEW-BASED-ACM-MIB'),
?DBG("ms_mib_of -> find ~w from SNMP-USER-BASED-SM-MIB",
[?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = mib_of(?usmStatsNotInTimeWindows_instance,
+ {error, _} = mib_of(?usmStatsNotInTimeWindows_instance,
'SNMP-USER-BASED-SM-MIB'),
- ?line unload_master("OTP-SNMPEA-MIB"),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
+ unload_master("OTP-SNMPEA-MIB"),
+ unload_master("SNMP-COMMUNITY-MIB"),
+ unload_master("SNMP-FRAMEWORK-MIB"),
+ unload_master("SNMP-MPD-MIB"),
+ unload_master("SNMP-NOTIFICATION-MIB"),
+ unload_master("SNMP-TARGET-MIB"),
+ unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
ok.
@@ -2062,7 +2058,6 @@ misc_cases() ->
create_local_db_dir
].
-app_info(suite) -> [];
app_info(Config) when is_list(Config) ->
?P(app_info),
SnmpDir = app_dir(snmp),
@@ -2100,8 +2095,6 @@ create_local_db_dir(Config) when is_list(Config) ->
erlang:unique_integer([positive])},
[As,Bs,Cs] = [integer_to_list(I) || I <- tuple_to_list(T)],
DbDir = filename:join([DataDir, As, Bs, Cs]),
- Name = list_to_atom(atom_to_list(create_local_db_dir)
- ++"_"++As++"_"++Bs++"_"++Cs),
?IPRINT("try ensuring db-dir does not exist"),
try del_dir(DbDir, 3) of
ok ->
@@ -2114,20 +2107,13 @@ create_local_db_dir(Config) when is_list(Config) ->
"~n Stack: ~p", [C, E, S]),
throw({skip, "Failed pre db-dir cleanup"})
end,
- ?IPRINT("try start node ~p", [Name]),
- case ?ALIB:start_node(Name) of
- {ok, Node} ->
- {DbDir, Node};
- {error, Reason} ->
- ?WPRINT("Failed starting node ~p:"
- "~n ~p", [Reason]),
- throw({skip, ?F("Failed starting node ~p", [Name])})
- end
+ {ok, Peer, Node} = ?START_PEER(""),
+ {DbDir, Peer, Node}
end,
Case = fun do_create_local_db_dir/1,
- Post = fun({DbDir, Node}) ->
+ Post = fun({DbDir, Peer, Node}) ->
?IPRINT("try stop node ~p", [Node]),
- ?ALIB:stop_node(Node),
+ peer:stop(Peer),
?IPRINT("try delete db-dir"),
try del_dir(DbDir, 3)
catch
@@ -2142,7 +2128,7 @@ create_local_db_dir(Config) when is_list(Config) ->
end,
?TC_TRY(create_local_db_dir, Pre, Case, Post).
-do_create_local_db_dir({DbDir, Node}) ->
+do_create_local_db_dir({DbDir, _Peer, Node}) ->
?P(create_local_db_dir),
%% first start with a nonexisting DbDir
Fun1 = fun() ->
@@ -2254,13 +2240,13 @@ v1_cases_ipv6() ->
].
init_v1(Config) when is_list(Config) ->
- ?line SaNode = ?config(snmp_sa, Config),
- ?line create_tables(SaNode),
- ?line AgentConfDir = ?config(agent_conf_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line IpFamily = config_ipfamily(Config),
- ?line config(
+ SaNode = ?config(snmp_sa, Config),
+ create_tables(SaNode),
+ AgentConfDir = ?config(agent_conf_dir, Config),
+ MgrDir = ?config(mgr_dir, Config),
+ Ip = ?config(ip, Config),
+ IpFamily = config_ipfamily(Config),
+ config(
[v1], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip), IpFamily),
[{vsn, v1} | start_v1_agent(Config)].
@@ -2462,7 +2448,7 @@ init_v3(Config) when is_list(Config) ->
MgrDir = ?config(mgr_dir, Config),
Ip = ?config(ip, Config),
IpFamily = config_ipfamily(Config),
- ?line ok =
+ ok =
config(
[v3], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip), IpFamily),
@@ -2495,7 +2481,7 @@ init_mt(Config, MT) when is_list(Config) ->
AgentConfDir = ?config(agent_conf_dir, Config),
MgrDir = ?config(mgr_dir, Config),
Ip = ?config(ip, Config),
- ?line ok = config([v2], MgrDir, AgentConfDir,
+ ok = config([v2], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip)),
[{vsn, v2} | start_multi_threaded_agent(Config, MT)].
@@ -2574,7 +2560,6 @@ init_old() ->
-simple(suite) -> [];
simple(Config) when is_list(Config) ->
?P(simple),
init_case(Config),
@@ -2586,7 +2571,6 @@ simple(Config) when is_list(Config) ->
simple_2(X) -> ?P(simple_2), simple(X).
-simple_bi(suite) -> [];
simple_bi(Config) when is_list(Config) ->
?P(simple_bi),
init_case(Config),
@@ -2600,7 +2584,6 @@ simple_bi(Config) when is_list(Config) ->
simple_3(X) ->
?P(simple_3), simple(X).
-big(suite) -> [];
big(Config) when is_list(Config) ->
?P(big),
%% put(sname, {?MODULE, big}),
@@ -2609,12 +2592,12 @@ big(Config) when is_list(Config) ->
{SaNode, _MgrNode, _MibDir} = init_case(Config),
?NPRINT("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
+ pong = net_adm:ping(SaNode),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
+ {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
?DBG("big -> SA: ~p", [SA]),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
snmpa:dump_mibs(),
snmpa:dump_mibs("dumped_mibs.txt"),
@@ -2622,15 +2605,14 @@ big(Config) when is_list(Config) ->
try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB").
+ stop_subagent(SA),
+ unload_master("OLD-SNMPEA-MIB").
big_2(X) -> ?P(big_2), big(X).
big_3(X) -> ?P(big_3), big(X).
-big2(suite) -> [];
big2(Config) when is_list(Config) ->
?P(big2),
%% This is exactly the same tests as 'big', but with the
@@ -2638,110 +2620,102 @@ big2(Config) when is_list(Config) ->
{SaNode, _MgrNode, _MibDir} = init_case(Config),
?NPRINT("Starting subagent..."),
- ?line pong = net_adm:ping(SaNode),
+ pong = net_adm:ping(SaNode),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1-v2"),
- ?line load_master("OLD-SNMPEA-MIB-v2"),
- ?line init_old(),
+ {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1-v2"),
+ load_master("OLD-SNMPEA-MIB-v2"),
+ init_old(),
try_test(big_test),
- ?line stop_subagent(SA),
- ?line unload_master("OLD-SNMPEA-MIB-v2").
+ stop_subagent(SA),
+ unload_master("OLD-SNMPEA-MIB-v2").
big2_2(X) -> ?P(big2_2), big2(X).
big2_3(X) -> ?P(big2_3), big2(X).
-multi_threaded(suite) -> [];
multi_threaded(Config) when is_list(Config) ->
?P(multi_threaded),
init_case(Config),
- ?line load_master("Test1"),
+ load_master("Test1"),
try_test(multi_threaded_test),
- ?line unload_master("Test1").
+ unload_master("Test1").
-mt_trap(suite) -> [];
mt_trap(Config) when is_list(Config) ->
?P(mt_trap),
init_case(Config),
MA = whereis(snmp_master_agent),
MT = ?config(multi_threaded, Config),
- ?line load_master("Test1"),
- ?line load_master("TestTrapv2"),
+ load_master("Test1"),
+ load_master("TestTrapv2"),
try_test(mt_trap_test, [MA, MT]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("Test1"),
+ unload_master("TestTrapv2"),
+ unload_master("Test1"),
ok.
-v2_types(suite) -> [];
v2_types(Config) when is_list(Config) ->
?P(v2_types),
init_case(Config),
- ?line load_master("Test1"),
+ load_master("Test1"),
try_test(types_v2_test),
- ?line unload_master("Test1").
+ unload_master("Test1").
v2_types_3(X) -> ?P(v2_types_3), v2_types(X).
-implied(suite) -> [];
implied(Config) when is_list(Config) ->
?P(implied),
init_case(Config),
MA = whereis(snmp_master_agent),
- ?line load_master("Test1"),
+ load_master("Test1"),
try_test(implied_test,[MA]),
- ?line unload_master("Test1").
+ unload_master("Test1").
implied_3(X) -> ?P(implied_3), implied(X).
-sparse_table(suite) -> [];
sparse_table(Config) when is_list(Config) ->
?P(sparse_table),
init_case(Config),
- ?line load_master("Test1"),
+ load_master("Test1"),
try_test(sparse_table_test),
- ?line unload_master("Test1").
+ unload_master("Test1").
sparse_table_2(X) -> ?P(sparse_table_2), sparse_table(X).
sparse_table_3(X) -> ?P(sparse_table_3), sparse_table(X).
-cnt_64(suite) -> [];
cnt_64(Config) when is_list(Config) ->
?P(cnt_64),
init_case(Config),
MA = whereis(snmp_master_agent),
- ?line load_master("Test1"),
+ load_master("Test1"),
try_test(cnt_64_test, [MA]),
- ?line unload_master("Test1").
+ unload_master("Test1").
cnt_64_2(X) -> ?P(cnt_64_2), cnt_64(X).
cnt_64_3(X) -> ?P(cnt_64_3), cnt_64(X).
-opaque(suite) -> [];
opaque(Config) when is_list(Config) ->
?P(opaque),
init_case(Config),
- ?line load_master("Test1"),
+ load_master("Test1"),
try_test(opaque_test),
- ?line unload_master("Test1").
+ unload_master("Test1").
opaque_2(X) -> ?P(opaque_2), opaque(X).
opaque_3(X) -> ?P(opaque_2), opaque(X).
-change_target_addr_config(suite) -> [];
change_target_addr_config(Config) when is_list(Config) ->
?P(change_target_addr_config),
?IPRINT("change_target_addr_config -> entry"),
@@ -2753,27 +2727,27 @@ change_target_addr_config(Config) when is_list(Config) ->
MA = whereis(snmp_master_agent),
?IPRINT("change_target_addr_config -> load TestTrap"),
- ?line load_master("TestTrap"),
+ load_master("TestTrap"),
?IPRINT("change_target_addr_config -> set trace verbosity for local_db"),
- ?line snmpa:verbosity(local_db,trace),
+ snmpa:verbosity(local_db,trace),
- %% First send some traps that will arive att the original manager
+ %% First send some traps that will arrive att the original manager
?IPRINT("change_target_addr_config -> send trap"),
try_test(ma_trap1, [MA]),
?IPRINT("change_target_addr_config -> set silence verbosity for local_db"),
- ?line snmpa:verbosity(local_db, silence),
+ snmpa:verbosity(local_db, silence),
%% Start new dummy listener
?IPRINT("change_target_addr_config -> start dummy manager"),
- ?line {ok,Pid,NewPort} = dummy_manager_start(MA),
+ {ok,Pid,NewPort} = dummy_manager_start(MA),
%% Reconfigure
?IPRINT("change_target_addr_config -> reconfigure"),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_addr_conf(AgentConfDir, NewPort),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_addr_conf(AgentConfDir, NewPort),
+ snmp_target_mib:reconfigure(AgentConfDir),
%% Send the trap again
?IPRINT("change_target_addr_config -> send trap again"),
@@ -2783,13 +2757,13 @@ change_target_addr_config(Config) when is_list(Config) ->
catch dummy_manager_await_trap2_ack(),
?IPRINT("change_target_addr_config -> stop dummy manager"),
- ?line ok = dummy_manager_stop(Pid),
+ ok = dummy_manager_stop(Pid),
?IPRINT("change_target_addr_config -> reset target address config"),
- ?line reset_target_addr_conf(AgentConfDir),
+ reset_target_addr_conf(AgentConfDir),
?IPRINT("change_target_addr_config -> unload TestTrap"),
- ?line unload_master("TestTrap").
+ unload_master("TestTrap").
dummy_manager_start(MA) ->
@@ -2838,7 +2812,7 @@ dummy_manager_await_trap2_ack() ->
{received_trap, _Trap} ->
?IPRINT("dummy_manager_await_trap2 -> received trap: ~p", [_Trap]),
%% Note:
- %% Without this sleep the v2_inform_i testcase failes! There
+ %% Without this sleep the v2_inform_i testcase fails! There
%% is no relation between these two test cases as far as I
%% able to figure out...
?SLEEP(60000),
@@ -2913,27 +2887,25 @@ dummy_manager_handle_message(Bytes) ->
end.
-api(suite) -> [];
api(Config) when is_list(Config) ->
?P(api),
init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
try_test(api_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
+ unload_master("OLD-SNMPEA-MIB").
api_2(X) -> ?P(api_2), api(X).
api_3(X) -> ?P(api_3), api(X).
-subagent(suite) -> [];
subagent(Config) when is_list(Config) ->
?P(subagent),
{SaNode, _MgrNode, MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
+ {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
try_test(load_test_sa),
?NPRINT("Testing unregister subagent..."),
@@ -2942,11 +2914,11 @@ subagent(Config) when is_list(Config) ->
try_test(unreg_test),
?NPRINT("Loading previous subagent mib in master and testing..."),
- ?line ok = snmpa:load_mib(MA, join(MibDir, "Klas1")),
+ ok = snmpa:load_mib(MA, join(MibDir, "Klas1")),
try_test(load_test),
?NPRINT("Unloading previous subagent mib in master and testing..."),
- ?line ok = snmpa:unload_mib(MA, join(MibDir, "Klas1")),
+ ok = snmpa:unload_mib(MA, join(MibDir, "Klas1")),
try_test(unreg_test),
?NPRINT("Testing register subagent..."),
@@ -2954,7 +2926,7 @@ subagent(Config) when is_list(Config) ->
[MA, ?klas1, SA]),
try_test(load_test_sa),
- ?line stop_subagent(SA),
+ stop_subagent(SA),
try_test(unreg_test).
subagent_2(X) -> ?P(subagent_2), subagent(X).
@@ -2970,15 +2942,14 @@ subagent_3(X) ->
subagent(X).
-mnesia(suite) -> [];
mnesia(Config) when is_list(Config) ->
?P(mnesia),
{SaNode, _MgrNode, _MibDir} = init_case(Config),
?NPRINT("Starting subagent with mnesia impl..."),
{ok, SA} = start_subagent(SaNode, ?klas2, "Klas2"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
try_test(big_test_2),
@@ -2986,8 +2957,8 @@ mnesia(Config) when is_list(Config) ->
MA = whereis(snmp_master_agent),
rpc:call(SaNode, snmpa, unregister_subagent, [MA, SA]),
try_test(unreg_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA).
+ unload_master("OLD-SNMPEA-MIB"),
+ stop_subagent(SA).
mnesia_2(X) -> ?P(mnesia_2), mnesia(X).
@@ -3030,9 +3001,9 @@ mul_cases_3() ->
init_mul(Config) when is_list(Config) ->
{SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
[{mul_sub, SA} | Config].
finish_mul(Config) when is_list(Config) ->
@@ -3040,11 +3011,10 @@ finish_mul(Config) when is_list(Config) ->
SA = ?config(mul_sub, Config),
- ?line unload_master("OLD-SNMPEA-MIB"),
- ?line stop_subagent(SA),
+ unload_master("OLD-SNMPEA-MIB"),
+ stop_subagent(SA),
lists:keydelete(mul_sub, 1, Config).
-mul_get(suite) -> [];
mul_get(Config) when is_list(Config) ->
?P(mul_get),
init_case(Config),
@@ -3057,7 +3027,6 @@ mul_get_2(X) -> ?P(mul_get_2), mul_get(X).
mul_get_3(X) -> ?P(mul_get_3), mul_get(X).
-mul_get_err(suite) -> [];
mul_get_err(Config) when is_list(Config) ->
?P(mul_get_err),
init_case(Config),
@@ -3070,7 +3039,6 @@ mul_get_err_2(X) -> ?P(mul_get_err_2), mul_get_err(X).
mul_get_err_3(X) -> ?P(mul_get_err_3), mul_get_err(X).
-mul_next(suite) -> [];
mul_next(Config) when is_list(Config) ->
?P(mul_next),
init_case(Config),
@@ -3083,7 +3051,6 @@ mul_next_2(X) -> ?P(mul_next_2), mul_next(X).
mul_next_3(X) -> ?P(mul_next_3), mul_next(X).
-mul_next_err(suite) -> [];
mul_next_err(Config) when is_list(Config) ->
?P(mul_next_err),
init_case(Config),
@@ -3096,7 +3063,6 @@ mul_next_err_2(X) -> ?P(mul_next_err_2), mul_next_err(X).
mul_next_err_3(X) -> ?P(mul_next_err_3), mul_next_err(X).
-mul_set(suite) -> [];
mul_set(Config) when is_list(Config) ->
?P(mul_set),
init_case(Config),
@@ -3109,7 +3075,6 @@ mul_set_2(X) -> ?P(mul_set_2), mul_set(X).
mul_set_3(X) -> ?P(mul_set_3), mul_set(X).
-mul_set_err(suite) -> [];
mul_set_err(Config) when is_list(Config) ->
?P(mul_set_err),
init_case(Config),
@@ -3122,14 +3087,13 @@ mul_set_err_2(X) -> ?P(mul_set_err_2), mul_set_err(X).
mul_set_err_3(X) -> ?P(mul_set_err_3), mul_set_err(X).
-sa_register(suite) -> [];
sa_register(Config) when is_list(Config) ->
?P(sa_register),
{SaNode, _MgrNode, MibDir} = init_case(Config),
?DBG("sa_register -> start subagent", []),
?NPRINT("start subagent..."),
- ?line {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
+ {ok, SA} = start_subagent(SaNode, ?klas1, "Klas1"),
?DBG("sa_register -> unregister subagent", []),
?NPRINT("Testing unregister subagent (2)..."),
@@ -3153,14 +3117,13 @@ sa_register(Config) when is_list(Config) ->
?NPRINT("stop subagent..."),
?DBG("sa_register -> stop subagent", []),
- ?line stop_subagent(SA).
+ stop_subagent(SA).
sa_register_2(X) -> ?P(sa_register_2), sa_register(X).
sa_register_3(X) -> ?P(sa_register_3), sa_register(X).
-v1_trap(suite) -> [];
v1_trap(Config) when is_list(Config) ->
?P(v1_trap),
trap1(Config).
@@ -3169,14 +3132,14 @@ trap1(Config) ->
{SaNode, _MgrNode, _MibDir} = init_case(Config),
?NPRINT("start subagent..."),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
+ {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
?NPRINT("Testing trap sending from master agent..."),
MA = whereis(snmp_master_agent),
?NPRINT("load TestTrap & TestTrapv2..."),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
?NPRINT("Testing trap sending from master-agent..."),
try_test(ma_trap1, [MA]),
@@ -3190,13 +3153,12 @@ trap1(Config) ->
try_test(sa_trap3, [SA]),
?NPRINT("unload TestTrap & TestTrapv2..."),
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("TestTrapv2"),
?NPRINT("stop subagent..."),
- ?line stop_subagent(SA).
+ stop_subagent(SA).
-v2_trap(suite) -> [];
v2_trap(Config) when is_list(Config) ->
?P(v2_trap),
trap2(Config).
@@ -3205,14 +3167,14 @@ trap2(Config) ->
{SaNode, _MgrNode, _MibDir} = init_case(Config),
?NPRINT("start subagent..."),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
+ {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
?NPRINT("Testing trap sending from master agent..."),
MA = whereis(snmp_master_agent),
?NPRINT("load TestTrap & TestTrapv2..."),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
?NPRINT("Testing trap sending from master-agent..."),
try_test(ma_v2_trap1, [MA]),
@@ -3228,13 +3190,12 @@ trap2(Config) ->
try_test(sa_v1_2_v2_trap3, [SA]),
?NPRINT("unload TestTrap & TestTrapv2..."),
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("TestTrapv2"),
?NPRINT("stop subagent..."),
- ?line stop_subagent(SA).
+ stop_subagent(SA).
-v3_trap(suite) -> [];
v3_trap(Config) when is_list(Config) ->
%% <CONDITIONAL-SKIP>
Skippable = [{unix, [darwin]}],
@@ -3273,7 +3234,6 @@ v2_inform_cases() ->
v2_inform_i
].
-v2_inform_i(suite) -> [];
v2_inform_i(Config) when is_list(Config) ->
?P(v2_inform_i),
inform_i(Config).
@@ -3284,8 +3244,8 @@ inform_i(Config) ->
MA = whereis(snmp_master_agent),
?NPRINT("load TestTrap & TestTrapv2..."),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
?NPRINT("Testing inform sending from master agent... "
"~nNOTE! This test takes a few minutes (10) to complete."),
@@ -3295,8 +3255,8 @@ inform_i(Config) ->
try_test(ma_v2_inform3, [MA]),
?NPRINT("unload TestTrap & TestTrapv2..."),
- ?line unload_master("TestTrap"),
- ?line unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("TestTrapv2"),
ok.
v3_inform_i(X) ->
@@ -3310,17 +3270,16 @@ v3_inform_i(X) ->
inform_i(X).
-sa_error(suite) -> [];
sa_error(Config) when is_list(Config) ->
?P(sa_error),
{SaNode, _MgrNode, _MibDir} = init_case(Config),
?NPRINT("load OLD-SNMPEA-MIB..."),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
?NPRINT("start subagent..."),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
+ {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
?NPRINT("Testing sa bad value (is_set_ok)..."),
try_test(sa_errs_bad_value),
@@ -3332,7 +3291,7 @@ sa_error(Config) when is_list(Config) ->
try_test(sa_too_big),
?NPRINT("unload OLD-SNMPEA-MIB..."),
- ?line unload_master("OLD-SNMPEA-MIB"),
+ unload_master("OLD-SNMPEA-MIB"),
?NPRINT("stop subagent..."),
stop_subagent(SA).
@@ -3352,17 +3311,16 @@ sa_error_3(X) ->
sa_error(X).
-next_across_sa(suite) -> [];
next_across_sa(Config) when is_list(Config) ->
?P(next_across_sa),
{SaNode, _MgrNode, MibDir} = init_case(Config),
MA = whereis(snmp_master_agent),
?NPRINT("start subagent (1)..."),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
+ {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
?NPRINT("Loading another subagent mib (Klas1)..."),
- ?line ok = snmpa:load_mib(SA, MibDir ++ "Klas1"),
+ ok = snmpa:load_mib(SA, MibDir ++ "Klas1"),
?NPRINT("register subagent..."),
rpc:call(SaNode, snmpa, register_subagent, [MA, ?klas1, SA]),
@@ -3379,7 +3337,7 @@ next_across_sa(Config) when is_list(Config) ->
try_test(unreg_test),
?NPRINT("Starting another subagent (2) "),
- ?line {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
+ {ok, SA2} = start_subagent(SaNode, ?klas1, "Klas1"),
?NPRINT("Testing next across subagent (wrong prefix from SA)..."),
try_test(next_across_sa_test),
@@ -3404,7 +3362,6 @@ next_across_sa_3(X) ->
next_across_sa(X).
-undo(suite) -> [];
undo(Config) when is_list(Config) ->
?P(undo),
{SaNode, _MgrNode, MibDir} = init_case(Config),
@@ -3412,30 +3369,30 @@ undo(Config) when is_list(Config) ->
MA = whereis(snmp_master_agent),
?NPRINT("start subagent (1)..."),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
+ {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
?NPRINT("Load Klas3 & Klas4..."),
- ?line ok = snmpa:load_mib(MA, join(MibDir, "Klas3")),
- ?line ok = snmpa:load_mib(MA, join(MibDir, "Klas4")),
+ ok = snmpa:load_mib(MA, join(MibDir, "Klas3")),
+ ok = snmpa:load_mib(MA, join(MibDir, "Klas4")),
?NPRINT("Testing undo phase at master agent..."),
try_test(undo_test),
try_test(api_test2),
?NPRINT("Unload Klas3..."),
- ?line ok = snmpa:unload_mib(MA, join(MibDir, "Klas3")),
+ ok = snmpa:unload_mib(MA, join(MibDir, "Klas3")),
?NPRINT("Testing bad return values from instrum. funcs..."),
try_test(bad_return),
?NPRINT("Unload Klas4..."),
- ?line ok = snmpa:unload_mib(MA, join(MibDir, "Klas4")),
+ ok = snmpa:unload_mib(MA, join(MibDir, "Klas4")),
?NPRINT("Testing undo phase at subagent..."),
- ?line ok = snmpa:load_mib(SA, join(MibDir, "Klas3")),
- ?line ok = snmpa:load_mib(SA, join(MibDir, "Klas4")),
- ?line ok = snmpa:register_subagent(MA, ?klas3, SA),
- ?line ok = snmpa:register_subagent(MA, ?klas4, SA),
+ ok = snmpa:load_mib(SA, join(MibDir, "Klas3")),
+ ok = snmpa:load_mib(SA, join(MibDir, "Klas4")),
+ ok = snmpa:register_subagent(MA, ?klas3, SA),
+ ok = snmpa:register_subagent(MA, ?klas4, SA),
try_test(undo_test),
try_test(api_test3),
@@ -3461,47 +3418,44 @@ undo_3(X) ->
undo(X).
%% Req. Test2
-v1_processing(suite) -> [];
v1_processing(Config) when is_list(Config) ->
?P(v1_processing),
?DBG("v1_processing -> entry", []),
init_case(Config),
?NPRINT("Load Test2..."),
- ?line load_master("Test2"),
+ load_master("Test2"),
try_test(v1_proc),
?NPRINT("Unload Test2..."),
- ?line unload_master("Test2").
+ unload_master("Test2").
%% Req. Test2
-v2_processing(suite) -> [];
v2_processing(Config) when is_list(Config) ->
?P(v2_processing),
init_case(Config),
?NPRINT("Load Test2..."),
- ?line load_master("Test2"),
+ load_master("Test2"),
try_test(v2_proc),
?NPRINT("Unload Test2..."),
- ?line unload_master("Test2").
+ unload_master("Test2").
%% Req. Test2
-v3_processing(suite) -> [];
v3_processing(Config) when is_list(Config) ->
?P(v3_processing),
init_case(Config),
?NPRINT("Load Test2..."),
- ?line load_master("Test2"),
+ load_master("Test2"),
try_test(v2_proc), % same as v2!
?NPRINT("Unload Test2..."),
- ?line unload_master("Test2").
+ unload_master("Test2").
%% We'll try get/set/trap and inform for all the auth & priv protocols.
@@ -3523,31 +3477,30 @@ v3_security_cases() ->
].
-v3_crypto_basic(suite) -> [];
v3_crypto_basic(_Config) ->
?P(v3_crypto_basic),
EID = [0,0,0,0,0,0,0,0,0,0,0,2],
%% From rfc2274 appendix A.3.1
- ?line KMd5_1 = snmp:passwd2localized_key(md5, "maplesyrup", EID),
- ?line [16#52,16#6f,16#5e,16#ed,16#9f,16#cc,16#e2,16#6f,
+ KMd5_1 = snmp:passwd2localized_key(md5, "maplesyrup", EID),
+ [16#52,16#6f,16#5e,16#ed,16#9f,16#cc,16#e2,16#6f,
16#89,16#64,16#c2,16#93,16#07,16#87,16#d8,16#2b] =
KMd5_1,
%% From rfc2274 appendix A.3.2
- ?line KSHA_1 = snmp:passwd2localized_key(sha, "maplesyrup", EID),
- ?line [16#66,16#95,16#fe,16#bc,16#92,16#88,16#e3,16#62,16#82,16#23,
+ KSHA_1 = snmp:passwd2localized_key(sha, "maplesyrup", EID),
+ [16#66,16#95,16#fe,16#bc,16#92,16#88,16#e3,16#62,16#82,16#23,
16#5f,16#c7,16#15,16#1f,16#12,16#84,16#97,16#b3,16#8f,16#3f] =
KSHA_1,
%% From rfc2274, appendix A.5.1
- ?line KMd5_2 = snmp:passwd2localized_key(md5, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
+ KMd5_2 = snmp:passwd2localized_key(md5, "newsyrup", EID),
+ [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
16#88,16#05,16#61,16#51,16#41,16#67,16#6c,16#c9,
16#19,16#61,16#74,16#e7,16#42,16#a3,16#25,16#51] =
snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2, 16,
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
%% From rfc2274, appendix A.5.2
- ?line KSHA_2 = snmp:passwd2localized_key(sha, "newsyrup", EID),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
+ KSHA_2 = snmp:passwd2localized_key(sha, "newsyrup", EID),
+ [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
16#00,16#00,16#00,16#00,16#9c,16#10,16#17,16#f4,
16#fd,16#48,16#3d,16#2d,16#e8,16#d5,16#fa,16#db,
@@ -3556,7 +3509,7 @@ v3_crypto_basic(_Config) ->
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
KSHA_1t = lists:sublist(KSHA_1, 16),
KSHA_2t = lists:sublist(KSHA_2, 16),
- ?line [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
+ [16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
16#00,16#00,16#00,16#00,16#00,16#00,16#00,16#00,
16#7e,16#f8,16#d8,16#a4,16#c9,16#cd,16#b2,16#6b,
16#47,16#59,16#1c,16#d8,16#52,16#ff,16#88,16#b5] =
@@ -3564,15 +3517,14 @@ v3_crypto_basic(_Config) ->
[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),
%% Try with correct random
- ?line Kc1 = snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2),
- ?line KMd5_2 = snmp_user_based_sm_mib:extract_new_key(md5, KMd5_1, Kc1),
- ?line Kc2 = snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2),
- ?line KSHA_2 = snmp_user_based_sm_mib:extract_new_key(sha, KSHA_1, Kc2),
+ Kc1 = snmp_user_based_sm_mib:mk_key_change(md5, KMd5_1, KMd5_2),
+ KMd5_2 = snmp_user_based_sm_mib:extract_new_key(md5, KMd5_1, Kc1),
+ Kc2 = snmp_user_based_sm_mib:mk_key_change(sha, KSHA_1, KSHA_2),
+ KSHA_2 = snmp_user_based_sm_mib:extract_new_key(sha, KSHA_1, Kc2),
ok.
-v3_md5_auth(suite) -> [];
v3_md5_auth(Config) when is_list(Config) ->
?P(v3_md5_auth),
init_case(Config),
@@ -3580,26 +3532,25 @@ v3_md5_auth(Config) when is_list(Config) ->
?NPRINT("Testing MD5 authentication...takes a few seconds..."),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_params_conf(AgentConfDir, "authMD5", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_params_conf(AgentConfDir, "authMD5", authNoPriv),
+ snmp_target_mib:reconfigure(AgentConfDir),
MA = whereis(snmp_master_agent),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
try_test(v3_sync, [[{v2_proc, []},
{ma_v2_trap1, [MA]},
{v3_inform_sync, [MA]}]],
[{sec_level, authNoPriv}, {user, "authMD5"}]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentConfDir).
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
+ reset_target_params_conf(AgentConfDir).
-v3_sha_auth(suite) -> [];
v3_sha_auth(Config) when is_list(Config) ->
?P(v3_sha_auth),
init_case(Config),
@@ -3607,28 +3558,27 @@ v3_sha_auth(Config) when is_list(Config) ->
?NPRINT("Testing SHA authentication...takes a few seconds..."),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_params_conf(AgentConfDir, "authSHA", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_params_conf(AgentConfDir, "authSHA", authNoPriv),
+ snmp_target_mib:reconfigure(AgentConfDir),
MA = whereis(snmp_master_agent),
snmp_user_based_sm_mib:usmUserTable(print),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
try_test(v3_sync, [[{v2_proc, []},
{ma_v2_trap1, [MA]},
{v3_inform_sync, [MA]}]],
[{sec_level, authNoPriv}, {user, "authSHA"}]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentConfDir).
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
+ reset_target_params_conf(AgentConfDir).
-v3_sha224_auth(suite) -> [];
v3_sha224_auth(Config) when is_list(Config) ->
?P(v3_sha224_auth),
init_case(Config),
@@ -3636,28 +3586,27 @@ v3_sha224_auth(Config) when is_list(Config) ->
?NPRINT("Testing SHA224 authentication...takes a few seconds..."),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_params_conf(AgentConfDir, "authSHA224", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_params_conf(AgentConfDir, "authSHA224", authNoPriv),
+ snmp_target_mib:reconfigure(AgentConfDir),
MA = whereis(snmp_master_agent),
snmp_user_based_sm_mib:usmUserTable(print),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
try_test(v3_sync, [[{v2_proc, []},
{ma_v2_trap1, [MA]},
{v3_inform_sync, [MA]}]],
[{sec_level, authNoPriv}, {user, "authSHA224"}]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentConfDir).
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
+ reset_target_params_conf(AgentConfDir).
-v3_sha256_auth(suite) -> [];
v3_sha256_auth(Config) when is_list(Config) ->
?P(v3_sha256_auth),
init_case(Config),
@@ -3665,28 +3614,27 @@ v3_sha256_auth(Config) when is_list(Config) ->
?NPRINT("Testing SHA256 authentication...takes a few seconds..."),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_params_conf(AgentConfDir, "authSHA256", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_params_conf(AgentConfDir, "authSHA256", authNoPriv),
+ snmp_target_mib:reconfigure(AgentConfDir),
MA = whereis(snmp_master_agent),
snmp_user_based_sm_mib:usmUserTable(print),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
try_test(v3_sync, [[{v2_proc, []},
{ma_v2_trap1, [MA]},
{v3_inform_sync, [MA]}]],
[{sec_level, authNoPriv}, {user, "authSHA256"}]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentConfDir).
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
+ reset_target_params_conf(AgentConfDir).
-v3_sha384_auth(suite) -> [];
v3_sha384_auth(Config) when is_list(Config) ->
?P(v3_sha384_auth),
init_case(Config),
@@ -3694,28 +3642,27 @@ v3_sha384_auth(Config) when is_list(Config) ->
?NPRINT("Testing SHA authentication...takes a few seconds..."),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_params_conf(AgentConfDir, "authSHA384", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_params_conf(AgentConfDir, "authSHA384", authNoPriv),
+ snmp_target_mib:reconfigure(AgentConfDir),
MA = whereis(snmp_master_agent),
snmp_user_based_sm_mib:usmUserTable(print),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
try_test(v3_sync, [[{v2_proc, []},
{ma_v2_trap1, [MA]},
{v3_inform_sync, [MA]}]],
[{sec_level, authNoPriv}, {user, "authSHA384"}]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentConfDir).
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
+ reset_target_params_conf(AgentConfDir).
-v3_sha512_auth(suite) -> [];
v3_sha512_auth(Config) when is_list(Config) ->
?P(v3_sha512_auth),
init_case(Config),
@@ -3723,28 +3670,27 @@ v3_sha512_auth(Config) when is_list(Config) ->
?NPRINT("Testing SHA512 authentication...takes a few seconds..."),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_params_conf(AgentConfDir, "authSHA512", authNoPriv),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_params_conf(AgentConfDir, "authSHA512", authNoPriv),
+ snmp_target_mib:reconfigure(AgentConfDir),
MA = whereis(snmp_master_agent),
snmp_user_based_sm_mib:usmUserTable(print),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
try_test(v3_sync, [[{v2_proc, []},
{ma_v2_trap1, [MA]},
{v3_inform_sync, [MA]}]],
[{sec_level, authNoPriv}, {user, "authSHA512"}]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentConfDir).
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
+ reset_target_params_conf(AgentConfDir).
-v3_des_priv(suite) -> [];
v3_des_priv(Config) when is_list(Config) ->
?P(v3_des_priv),
init_case(Config),
@@ -3752,26 +3698,26 @@ v3_des_priv(Config) when is_list(Config) ->
?NPRINT("Testing DES encryption...takes a few seconds..."),
AgentConfDir = ?config(agent_conf_dir, Config),
- ?line rewrite_target_params_conf(AgentConfDir, "privDES", authPriv),
- ?line snmp_target_mib:reconfigure(AgentConfDir),
+ rewrite_target_params_conf(AgentConfDir, "privDES", authPriv),
+ snmp_target_mib:reconfigure(AgentConfDir),
MA = whereis(snmp_master_agent),
snmp_user_based_sm_mib:usmUserTable(print),
- ?line load_master("Test2"),
- ?line load_master("TestTrap"),
- ?line load_master("TestTrapv2"),
+ load_master("Test2"),
+ load_master("TestTrap"),
+ load_master("TestTrapv2"),
try_test(v3_sync, [[{v2_proc, []},
{ma_v2_trap1, [MA]},
{v3_inform_sync, [MA]}]],
[{sec_level, authPriv}, {user, "privDES"}]),
- ?line unload_master("TestTrapv2"),
- ?line unload_master("TestTrap"),
- ?line unload_master("Test2"),
- ?line reset_target_params_conf(AgentConfDir).
+ unload_master("TestTrapv2"),
+ unload_master("TestTrap"),
+ unload_master("Test2"),
+ reset_target_params_conf(AgentConfDir).
%% -define(usmStatsNotInTimeWindows_instance, [1,3,6,1,6,3,15,1,1,2,0]).
@@ -3786,18 +3732,17 @@ v3_sync(Funcs) ->
v3_inform_sync(MA) ->
?DBG("v3_sync -> entry with MA: ~p => Send notification",[MA]),
- ?line snmpa:send_notification(MA, testTrapv22, no_receiver,
+ snmpa:send_notification(MA, testTrapv22, no_receiver,
"standard inform", []),
%% Make sure agent is in sync with mgr...
?DBG("v3_sync -> wait some time: ",[]),
?SLEEP(20000), % more than 1500*10 in target_addr.conf
?DBG("v3_sync -> await response",[]),
- ?line ?expect2({inform, true},
+ ?expect2({inform, true},
[{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?system ++ [0,1]}]).
-v2_caps(suite) -> [];
v2_caps(Config) when is_list(Config) ->
?P(v2_caps),
init_case(Config),
@@ -3808,13 +3753,13 @@ v2_caps_3(X) -> ?P(v2_caps_3), v2_caps(X).
v2_caps_i(Node) ->
- ?line Idx = rpc:call(Node, snmpa, add_agent_caps, [[1,2,3,4,5], "test cap"]),
+ Idx = rpc:call(Node, snmpa, add_agent_caps, [[1,2,3,4,5], "test cap"]),
g([[sysORID, Idx], [sysORDescr, Idx]]),
- ?line ?expect1([{[sysORID, Idx], [1,2,3,4,5]},
+ ?expect1([{[sysORID, Idx], [1,2,3,4,5]},
{[sysORDescr, Idx], "test cap"}]),
- ?line rpc:call(Node, snmpa, del_agent_caps, [Idx]),
+ rpc:call(Node, snmpa, del_agent_caps, [Idx]),
g([[sysORID, Idx]]),
- ?line ?expect1([{[sysORID, Idx], noSuchInstance}]).
+ ?expect1([{[sysORID, Idx], noSuchInstance}]).
%% Req. Test2
@@ -3830,85 +3775,85 @@ v1_proc() ->
v1_get_p() ->
%% 4.1.2:1
g([[test2]]),
- ?line ?expect3(noSuchName, 1, [{[test2], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[test2], 'NULL'}]),
g([[tDescr]]),
- ?line ?expect3(noSuchName, 1, [{[tDescr], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[tDescr], 'NULL'}]),
g([[tDescr2,0]]),
- ?line ?expect3(noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[tDescr2,0], 'NULL'}]),
g([[tDescr3,0]]),
- ?line ?expect3(noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[tDescr3,0], 'NULL'}]),
g([[tDescr4,0]]),
- ?line ?expect3(noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[tDescr4,0], 'NULL'}]),
g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line ?expect3(noSuchName, 2, [{[sysDescr, 0], 'NULL'},
+ ?expect3(noSuchName, 2, [{[sysDescr, 0], 'NULL'},
{[tDescr,0], 'NULL'}]),
g([[sysDescr,3]]),
- ?line ?expect3(noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[sysDescr, 3], 'NULL'}]),
%% 4.1.2:2
g([[tTable]]),
- ?line ?expect3(noSuchName, 1, [{[tTable], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[tTable], 'NULL'}]),
g([[tEntry]]),
- ?line ?expect3(noSuchName, 1, [{[tEntry], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[tEntry], 'NULL'}]),
%% 4.1.2:3
g([[tTooBig, 0]]),
- ?line ?expect3(tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
+ ?expect3(tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
%% 4.1.2:4
g([[tGenErr1, 0]]),
- ?line ?expect3(genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
+ ?expect3(genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
g([[tGenErr2, 0]]),
- ?line ?expect3(genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
+ ?expect3(genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line ?expect3(genErr, 2, [{[sysDescr, 0], 'NULL'},
+ ?expect3(genErr, 2, [{[sysDescr, 0], 'NULL'},
{[tGenErr3, 0], 'NULL'}]).
v1_get_next_p() ->
%% 4.1.3:1
gn([[1,3,7,1]]),
- ?line ?expect3(noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
+ ?expect3(noSuchName, 1, [{[1,3,7,1], 'NULL'}]),
gn([[tDescr2]]),
- ?line ?expect3(tooBig, 0, any),
+ ?expect3(tooBig, 0, any),
%% 4.1.3:2
gn([[tTooBig]]),
io:format("We currently don't handle tooBig correct!!!\n"),
- ?line ?expect3(tooBig, 0, any),
+ ?expect3(tooBig, 0, any),
%% 4.1.3:3
gn([[tGenErr1]]),
- ?line ?expect3(genErr, 1, any),
+ ?expect3(genErr, 1, any),
gn([[tGenErr2]]),
- ?line ?expect3(genErr, 1, any),
+ ?expect3(genErr, 1, any),
gn([[sysDescr], [tGenErr3]]),
- ?line ?expect3(genErr, 2, any).
+ ?expect3(genErr, 2, any).
v1_set_p() ->
%% 4.1.5:1
s([{[1,3,7,0], i, 4}]),
- ?line ?expect3(noSuchName, 1, [{[1,3,7,0], 4}]),
+ ?expect3(noSuchName, 1, [{[1,3,7,0], 4}]),
s([{[tDescr,0], s, "outside mibview"}]),
- ?line ?expect3(noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
+ ?expect3(noSuchName, 1, [{[tDescr,0], "outside mibview"}]),
s([{[tDescr3,0], s, "read-only"}]),
- ?line ?expect3(noSuchName, 1, [{[tDescr3,0], "read-only"}]),
+ ?expect3(noSuchName, 1, [{[tDescr3,0], "read-only"}]),
s([{[tDescr3], s, "noSuchObject"}]),
- ?line ?expect3(noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
+ ?expect3(noSuchName, 1, [{[tDescr3], "noSuchObject"}]),
s([{[tDescr3,1], s, "noSuchInstance"}]),
- ?line ?expect3(noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
+ ?expect3(noSuchName, 1, [{[tDescr3,1], "noSuchInstance"}]),
s([{[tDescr2,0], s, "inconsistentName"}]),
- ?line ?expect3(noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
+ ?expect3(noSuchName, 1, [{[tDescr2,0], "inconsistentName"}]),
%% 4.1.5:2
s([{[tDescr2, 0], i, 4}]),
- ?line ?expect3(badValue, 1, [{[tDescr2, 0], 4}]),
+ ?expect3(badValue, 1, [{[tDescr2, 0], 4}]),
s([{[tDescr2, 0], s, "badValue"}]),
- ?line ?expect3(badValue, 1, [{[tDescr2, 0], "badValue"}]),
+ ?expect3(badValue, 1, [{[tDescr2, 0], "badValue"}]),
%% 4.1.5:3
%% The standard is quite incorrect here. The resp pdu was too big. In
@@ -3918,14 +3863,14 @@ v1_set_p() ->
%% of the std-like original value.
s([{[tTooBig, 0], s, ?tooBigStr}]),
%% according to std:
-% ?line ?expect3(tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
- ?line ?expect3(tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
+% ?expect3(tooBig, 0, [{[tTooBig, 0], ?tooBigStr}]),
+ ?expect3(tooBig, 0, [{[tTooBig, 0], 'NULL'}]),
%% 4.1.5:4
s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line ?expect3(genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
+ ?expect3(genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]),
s([{[tDescr2, 0], s, "commit_fail"}]),
- ?line ?expect3(genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
+ ?expect3(genErr, 1, [{[tDescr2, 0], "commit_fail"}]).
%% Req. Test2
v2_proc() ->
@@ -3941,94 +3886,94 @@ v2_get_p() ->
%% 4.2.1:2
?DBG("v2_get_p -> entry",[]),
g([[test2]]),
- ?line ?expect1([{[test2], noSuchObject}]),
+ ?expect1([{[test2], noSuchObject}]),
g([[tDescr]]),
- ?line ?expect1([{[tDescr], noSuchObject}]),
+ ?expect1([{[tDescr], noSuchObject}]),
g([[tDescr4,0]]),
- ?line ?expect1([{[tDescr4,0], noSuchObject}]),
+ ?expect1([{[tDescr4,0], noSuchObject}]),
g([[sysDescr, 0], [tDescr,0]]), % Outside mibview
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{[tDescr,0], noSuchObject}]),
g([[tTable]]),
- ?line ?expect1([{[tTable], noSuchObject}]),
+ ?expect1([{[tTable], noSuchObject}]),
g([[tEntry]]),
- ?line ?expect1([{[tEntry], noSuchObject}]),
+ ?expect1([{[tEntry], noSuchObject}]),
%% 4.2.1:3
g([[tDescr2,0]]), %% instrum ret noSuchName!!!
- ?line ?expect1([{[tDescr2,0], noSuchInstance}]),
+ ?expect1([{[tDescr2,0], noSuchInstance}]),
g([[tDescr3,0]]),
- ?line ?expect1([{[tDescr3,0], noSuchInstance}]),
+ ?expect1([{[tDescr3,0], noSuchInstance}]),
g([[sysDescr,3]]),
- ?line ?expect1([{[sysDescr, 3], noSuchInstance}]),
+ ?expect1([{[sysDescr, 3], noSuchInstance}]),
g([[tIndex,1]]),
- ?line ?expect1([{[tIndex, 1], noSuchInstance}]),
+ ?expect1([{[tIndex, 1], noSuchInstance}]),
%% 4.2.1 - any other error: genErr
g([[tGenErr1, 0]]),
- ?line ?expect3(genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
+ ?expect3(genErr, 1, [{[tGenErr1, 0], 'NULL'}]),
g([[tGenErr2, 0]]),
- ?line ?expect3(genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
+ ?expect3(genErr, 1, [{[tGenErr2, 0], 'NULL'}]),
g([[sysDescr, 0], [tGenErr3, 0]]),
- ?line ?expect3(genErr, 2, [{[sysDescr, 0], 'NULL'},
+ ?expect3(genErr, 2, [{[sysDescr, 0], 'NULL'},
{[tGenErr3, 0], 'NULL'}]),
%% 4.2.1 - tooBig
g([[tTooBig, 0]]),
- ?line ?expect3(tooBig, 0, []).
+ ?expect3(tooBig, 0, []).
v2_get_next_p() ->
%% 4.2.2:2
?DBG("v2_get_next_p -> entry",[]),
gn([[1,3,7,1]]),
- ?line ?expect1([{[1,3,7,1], endOfMibView}]),
+ ?expect1([{[1,3,7,1], endOfMibView}]),
gn([[sysDescr], [1,3,7,1]]),
- ?line ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
{[1,3,7,1], endOfMibView}]),
gn([[tCnt2, 1]]),
- ?line ?expect1([{[tCnt2,2], 100}]),
+ ?expect1([{[tCnt2,2], 100}]),
gn([[tCnt2, 2]]),
- ?line ?expect1([{[tCnt2,2], endOfMibView}]),
+ ?expect1([{[tCnt2,2], endOfMibView}]),
%% 4.2.2 - any other error: genErr
gn([[tGenErr1]]),
- ?line ?expect3(genErr, 1, [{[tGenErr1], 'NULL'}]),
+ ?expect3(genErr, 1, [{[tGenErr1], 'NULL'}]),
gn([[tGenErr2]]),
- ?line ?expect3(genErr, 1, [{[tGenErr2], 'NULL'}]),
+ ?expect3(genErr, 1, [{[tGenErr2], 'NULL'}]),
gn([[sysDescr], [tGenErr3]]),
- ?line ?expect3(genErr, 2, [{[sysDescr], 'NULL'},
+ ?expect3(genErr, 2, [{[sysDescr], 'NULL'},
{[tGenErr3], 'NULL'}]),
%% 4.2.2 - tooBig
gn([[tTooBig]]),
- ?line ?expect3(tooBig, 0, []).
+ ?expect3(tooBig, 0, []).
v2_get_bulk_p() ->
%% 4.2.3
?DBG("v2_get_bulk_p -> entry",[]),
gb(1, 1, []),
- ?line ?expect1([]),
+ ?expect1([]),
gb(-1, 1, []),
- ?line ?expect1([]),
+ ?expect1([]),
gb(-1, -1, []),
- ?line ?expect1([]),
+ ?expect1([]),
gb(-1, -1, []),
- ?line ?expect1([]),
+ ?expect1([]),
gb(2, 0, [[sysDescr], [1,3,7,1]]),
- ?line ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
{[1,3,7,1], endOfMibView}]),
gb(1, 2, [[sysDescr], [1,3,7,1]]),
- ?line ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
{[1,3,7,1], endOfMibView}]),
gb(0, 2, [[sysDescr], [1,3,7,1]]),
- ?line ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
{[1,3,7,1], endOfMibView},
{[sysObjectID, 0], [1,2,3]},
{[1,3,7,1], endOfMibView}]),
gb(2, 2, [[sysDescr], [1,3,7,1], [sysDescr], [1,3,7,1]]),
- ?line ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
{[1,3,7,1], endOfMibView},
{[sysDescr, 0], "Erlang SNMP agent"},
{[1,3,7,1], endOfMibView},
@@ -4036,19 +3981,19 @@ v2_get_bulk_p() ->
{[1,3,7,1], endOfMibView}]),
gb(1, 2, [[sysDescr], [sysDescr], [tTooBig]]),
- ?line ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr, 0], "Erlang SNMP agent"},
{[sysDescr, 0], "Erlang SNMP agent"}]),
gb(1,12, [[tDescr2], [sysDescr]]), % next one after tDescr2 is tTooBig.
- ?line ?expect1([]),
+ ?expect1([]),
gb(2,2, [[sysDescr], [sysObjectID], [tGenErr1], [sysDescr]]),
- ?line ?expect3(genErr, 3, [{[sysDescr], 'NULL'},
+ ?expect3(genErr, 3, [{[sysDescr], 'NULL'},
{[sysObjectID], 'NULL'},
{[tGenErr1], 'NULL'},
{[sysDescr], 'NULL'}]),
gb(0, 2, [[tCnt2, 1]]),
- ?line ?expect1([{[tCnt2,2], 100},
+ ?expect1([{[tCnt2,2], 100},
{[tCnt2,2], endOfMibView}]).
@@ -4056,68 +4001,68 @@ v2_set_p() ->
%% 4.2.5:1
?DBG("v2_set_p -> entry",[]),
s([{[1,3,7,0], i, 4}]),
- ?line ?expect3(noAccess, 1, [{[1,3,7,0], 4}]),
+ ?expect3(noAccess, 1, [{[1,3,7,0], 4}]),
s([{[tDescr,0], s, "outside mibview"}]),
- ?line ?expect3(noAccess, 1, [{[tDescr,0], "outside mibview"}]),
+ ?expect3(noAccess, 1, [{[tDescr,0], "outside mibview"}]),
%% 4.2.5:2
s([{[1,3,6,1,0], s, "noSuchObject"}]),
- ?line ?expect3(notWritable, 1, [{[1,3,6,1,0], "noSuchObject"}]),
+ ?expect3(notWritable, 1, [{[1,3,6,1,0], "noSuchObject"}]),
%% 4.2.5:3
s([{[tDescr2, 0], i, 4}]),
- ?line ?expect3(wrongType, 1, [{[tDescr2, 0], 4}]),
+ ?expect3(wrongType, 1, [{[tDescr2, 0], 4}]),
s([{[tDescr2, 0], s, "badValue"}]),
- ?line ?expect3(badValue, 1, [{[tDescr2, 0], "badValue"}]),
+ ?expect3(badValue, 1, [{[tDescr2, 0], "badValue"}]),
%% 4.2.5:4
s([{[tStr, 0], s, ""}]),
- ?line ?expect3(wrongLength, 1, [{[tStr, 0], ""}]),
+ ?expect3(wrongLength, 1, [{[tStr, 0], ""}]),
s([{[tStr, 0], s, "12345"}]),
- ?line ?expect3(wrongLength, 1, [{[tStr, 0], "12345"}]),
+ ?expect3(wrongLength, 1, [{[tStr, 0], "12345"}]),
%% 4.2.5:5 - N/A
%% 4.2.5:6
s([{[tInt1, 0], i, 0}]),
- ?line ?expect3(wrongValue, 1, [{[tInt1, 0], 0}]),
+ ?expect3(wrongValue, 1, [{[tInt1, 0], 0}]),
s([{[tInt1, 0], i, 5}]),
- ?line ?expect3(wrongValue, 1, [{[tInt1, 0], 5}]),
+ ?expect3(wrongValue, 1, [{[tInt1, 0], 5}]),
s([{[tInt2, 0], i, 0}]),
- ?line ?expect3(wrongValue, 1, [{[tInt2, 0], 0}]),
+ ?expect3(wrongValue, 1, [{[tInt2, 0], 0}]),
s([{[tInt2, 0], i, 5}]),
- ?line ?expect3(wrongValue, 1, [{[tInt2, 0], 5}]),
+ ?expect3(wrongValue, 1, [{[tInt2, 0], 5}]),
s([{[tInt3, 0], i, 5}]),
- ?line ?expect3(wrongValue, 1, [{[tInt3, 0], 5}]),
+ ?expect3(wrongValue, 1, [{[tInt3, 0], 5}]),
%% 4.2.5:7
s([{[tDescrX, 1, 1], s, "noCreation"}]),
- ?line ?expect3(noCreation, 1, [{[tDescrX, 1, 1], "noCreation"}]),
+ ?expect3(noCreation, 1, [{[tDescrX, 1, 1], "noCreation"}]),
%% 4.2.5:8
s([{[tDescrX, 1, 2], s, "inconsistentName"}]),
- ?line ?expect3(inconsistentName, 1,
+ ?expect3(inconsistentName, 1,
[{[tDescrX, 1, 2], "inconsistentName"}]),
%% 4.2.5:9
s([{[tCnt, 1, 2], i, 5}]),
- ?line ?expect3(notWritable, 1, [{[tCnt, 1, 2], 5}]),
+ ?expect3(notWritable, 1, [{[tCnt, 1, 2], 5}]),
s([{[tDescr3,0], s, "read-only"}]),
- ?line ?expect3(notWritable, 1, [{[tDescr3,0], "read-only"}]),
+ ?expect3(notWritable, 1, [{[tDescr3,0], "read-only"}]),
%% 4.2.5:10
s([{[tDescr2,0], s, "inconsistentValue"}]),
- ?line ?expect3(inconsistentValue, 1,
+ ?expect3(inconsistentValue, 1,
[{[tDescr2,0], "inconsistentValue"}]),
%% 4.2.5:11
s([{[tDescr2,0], s, "resourceUnavailable"}]),
- ?line ?expect3(resourceUnavailable, 1,
+ ?expect3(resourceUnavailable, 1,
[{[tDescr2,0],"resourceUnavailable"}]),
%% 4.2.5:12
s([{[tDescr2, 0], s, "is_set_ok_fail"}]),
- ?line ?expect3(genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]).
+ ?expect3(genErr, 1, [{[tDescr2, 0], "is_set_ok_fail"}]).
%% commitFailed and undoFailed is tested by the 'undo' case.
@@ -4131,26 +4076,26 @@ table_test() ->
Key1c4 = [intCommunityAccess,get(mip),is("public")],
EndKey = [intCommunityEntry,[9],get(mip),is("public")],
gn([[intCommunityEntry]]),
- ?line ?expect1([{Key1c3, 2}]),
+ ?expect1([{Key1c3, 2}]),
gn([[intCommunityTable]]),
- ?line ?expect1([{Key1c3, 2}]),
+ ?expect1([{Key1c3, 2}]),
gn([[community]]),
- ?line ?expect1([{Key1c3, 2}]),
+ ?expect1([{Key1c3, 2}]),
gn([[otpSnmpeaMIB]]),
- ?line ?expect1([{Key1c3, 2}]),
+ ?expect1([{Key1c3, 2}]),
gn([[ericsson]]),
- ?line ?expect1([{Key1c3, 2}]),
+ ?expect1([{Key1c3, 2}]),
gn([Key1c3]),
- ?line ?expect1([{Key2c3, 2}]),
+ ?expect1([{Key2c3, 2}]),
gn([Key2c3]),
- ?line ?expect1([{Key1c4, 2}]),
+ ?expect1([{Key1c4, 2}]),
gn([EndKey]),
AgentIp = [intAgentIpAddress,0],
- ?line ?expect1([{AgentIp, any}]),
+ ?expect1([{AgentIp, any}]),
g([Key1c3]),
- ?line ?expect1([{Key1c3, 2}]),
+ ?expect1([{Key1c3, 2}]),
g([EndKey]),
- ?line ?v1_2(?expect3(noSuchName, 1, any),
+ ?v1_2(?expect3(noSuchName, 1, any),
?expect1([{EndKey, noSuchObject}])),
io:format("Testing row creation/deletion on communityTable...~n"),
@@ -4158,33 +4103,33 @@ table_test() ->
NewKeyc4 = [intCommunityAccess,get(mip),is("test")],
NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
s([{NewKeyc5, ?createAndGo}]),
- ?line ?expect3(?v1_2(badValue, inconsistentValue), 1, any),
+ ?expect3(?v1_2(badValue, inconsistentValue), 1, any),
s([{NewKeyc5, ?createAndGo}, {NewKeyc3, 2}, {NewKeyc4, 2}]),
- ?line ?expect1([{NewKeyc5, ?createAndGo},{NewKeyc3, 2}, {NewKeyc4, 2}]),
+ ?expect1([{NewKeyc5, ?createAndGo},{NewKeyc3, 2}, {NewKeyc4, 2}]),
g([NewKeyc4]),
- ?line ?expect1([{NewKeyc4, 2}]),
+ ?expect1([{NewKeyc4, 2}]),
s([{NewKeyc5, ?destroy}]),
- ?line ?expect1([{NewKeyc5, ?destroy}]),
+ ?expect1([{NewKeyc5, ?destroy}]),
s([{NewKeyc4, 2}]),
- ?line ?expect3(?v1_2(noSuchName, inconsistentName), 1, [{NewKeyc4, 2}]),
+ ?expect3(?v1_2(noSuchName, inconsistentName), 1, [{NewKeyc4, 2}]),
s([{NewKeyc5, ?createAndWait}]),
- ?line ?expect1([{NewKeyc5, ?createAndWait}]),
+ ?expect1([{NewKeyc5, ?createAndWait}]),
g([NewKeyc5]),
- ?line ?expect1([{NewKeyc5, ?notReady}]),
+ ?expect1([{NewKeyc5, ?notReady}]),
s([{NewKeyc4, 2}]),
- ?line ?expect1([{NewKeyc4, 2}]),
+ ?expect1([{NewKeyc4, 2}]),
g([NewKeyc5]),
- ?line ?expect1([{NewKeyc5, ?notReady}]),
+ ?expect1([{NewKeyc5, ?notReady}]),
s([{NewKeyc3, 2}]),
- ?line ?expect1([{NewKeyc3, 2}]),
+ ?expect1([{NewKeyc3, 2}]),
g([NewKeyc5]),
- ?line ?expect1([{NewKeyc5, ?notInService}]),
+ ?expect1([{NewKeyc5, ?notInService}]),
s([{NewKeyc5, ?active}]),
- ?line ?expect1([{NewKeyc5, ?active}]),
+ ?expect1([{NewKeyc5, ?active}]),
s([{NewKeyc5, ?destroy}]),
- ?line ?expect1([{NewKeyc5, ?destroy}]),
+ ?expect1([{NewKeyc5, ?destroy}]),
s([{NewKeyc3, 3}]),
- ?line ?expect3(?v1_2(noSuchName, inconsistentName), 1, [{NewKeyc3, 3}]),
+ ?expect3(?v1_2(noSuchName, inconsistentName), 1, [{NewKeyc3, 3}]),
otp_1128_test(),
ok.
@@ -4192,46 +4137,45 @@ table_test() ->
simple_standard_test() ->
?DBG("simple_standard_test -> entry",[]),
gn([[1,1]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
gn([[1,3]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
gn([[1,3,6]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
gn([[1,3,6,1]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
gn([[1,3,6,1,2]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
gn([[1,3,6,1,2,1]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
gn([[1,3,6,1,2,1,1]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
gn([[sysDescr]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
g([[sysDescr,0]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"}]),
g([[sysDescr]]),
- ?line ?v1_2(?expect3(noSuchName, 1, any),
+ ?v1_2(?expect3(noSuchName, 1, any),
?expect1([{[sysDescr], noSuchObject}])),
g([[1,6,7,0]]),
- ?line ?v1_2(?expect3(noSuchName, 1, any),
+ ?v1_2(?expect3(noSuchName, 1, any),
?expect1([{[1,6,7,0], noSuchObject}])),
gn([[1,13]]),
- ?line ?v1_2(?expect3(noSuchName,1, any),
+ ?v1_2(?expect3(noSuchName,1, any),
?expect1([{[1,13], endOfMibView}])),
s([{[sysLocation, 0], "new_value"}]),
- ?line ?expect1([{[sysLocation, 0], "new_value"}]),
+ ?expect1([{[sysLocation, 0], "new_value"}]),
g([[sysLocation, 0]]),
- ?line ?expect1([{[sysLocation, 0], "new_value"}]),
+ ?expect1([{[sysLocation, 0], "new_value"}]),
io:format("Testing noSuchName and badValue...~n"),
s([{[sysServices,0], 3}]),
- ?line ?expect3(?v1_2(noSuchName, notWritable), 1, any),
+ ?expect3(?v1_2(noSuchName, notWritable), 1, any),
s([{[sysLocation, 0], i, 3}]),
- ?line ?expect3(?v1_2(badValue, wrongType), 1, any),
+ ?expect3(?v1_2(badValue, wrongType), 1, any),
?DBG("simple_standard_test -> done",[]),
ok.
%% This is run in the agent node
-db_notify_client(suite) -> [];
db_notify_client(Config) when is_list(Config) ->
?P(db_notify_client),
{_SaNode, _MgrNode, _MibDir} = init_case(Config),
@@ -4280,11 +4224,11 @@ db_notify_client(Config) when is_list(Config) ->
db_notify_client_test() ->
?DBG("set first new sysLocation",[]),
s([{[sysLocation, 0], "new_value"}]),
- ?line ?expect1([{[sysLocation, 0], "new_value"}]),
+ ?expect1([{[sysLocation, 0], "new_value"}]),
?DBG("set second new sysLocation",[]),
s([{[sysLocation, 0], "new_value"}]),
- ?line ?expect1([{[sysLocation, 0], "new_value"}]).
+ ?expect1([{[sysLocation, 0], "new_value"}]).
%% Callback function
notify(Pid, What) ->
@@ -4300,23 +4244,23 @@ big_test() ->
?DBG("big_test -> testing simple next/get/set @ subagent...",[]),
gn([[klas1]]),
- ?line ?expect1([{[fname,0], ""}]),
+ ?expect1([{[fname,0], ""}]),
g([[fname,0]]),
- ?line ?expect1([{[fname,0], ""}]),
+ ?expect1([{[fname,0], ""}]),
s([{[fname,0], s, "test set"}]),
- ?line ?expect1([{[fname,0], "test set"}]),
+ ?expect1([{[fname,0], "test set"}]),
g([[fname,0]]),
- ?line ?expect1([{[fname,0], "test set"}]),
+ ?expect1([{[fname,0], "test set"}]),
?DBG("big_test -> "
"testing next from last instance in master to subagent...",[]),
gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line ?expect1([{[fname,0], "test set"}]),
+ ?expect1([{[fname,0], "test set"}]),
gn([[1,1], [?v1_2(sysServices, sysORLastChange),0]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{[fname,0], "test set"}]),
s([{[fname,0], s, ""}]),
- ?line ?expect1([{[fname,0], ""}]),
+ ?expect1([{[fname,0], ""}]),
table_test(),
@@ -4324,14 +4268,14 @@ big_test() ->
_FTab = [friendsEntry],
s([{[friendsEntry, [2, 3]], s, "kompis3"},
{[friendsEntry, [3, 3]], i, ?createAndGo}]),
- ?line ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
+ ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
{[friendsEntry, [3, 3]], ?createAndGo}]),
g([[friendsEntry, [2, 3]],
[friendsEntry, [3, 3]]]),
- ?line ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
+ ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
{[friendsEntry, [3, 3]], ?active}]),
s([{[friendsEntry, [3, 3]], i, ?destroy}]),
- ?line ?expect1([{[friendsEntry, [3, 3]], ?destroy}]),
+ ?expect1([{[friendsEntry, [3, 3]], ?destroy}]),
otp_1131_test(),
@@ -4339,28 +4283,28 @@ big_test() ->
[]),
s([{[kompissEntry, [1, 3]], s, "kompis3"},
{[kompissEntry, [2, 3]], i, ?createAndGo}]),
- ?line ?expect1([{[kompissEntry, [1, 3]], "kompis3"},
+ ?expect1([{[kompissEntry, [1, 3]], "kompis3"},
{[kompissEntry, [2, 3]], ?createAndGo}]),
g([[kompissEntry, [1, 3]],
[kompissEntry, [2, 3]]]),
- ?line ?expect1([{[kompissEntry, [1, 3]], "kompis3"},
+ ?expect1([{[kompissEntry, [1, 3]], "kompis3"},
{[kompissEntry, [2, 3]], ?active}]),
gn([[kompissEntry, [1]],
[kompissEntry, [2]]]),
- ?line ?expect1([{[kompissEntry, [1, 3]], "kompis3"},
+ ?expect1([{[kompissEntry, [1, 3]], "kompis3"},
{[kompissEntry, [2, 3]], ?active}]),
s([{[kompissEntry, [1, 2]], s, "kompis3"},
{[kompissEntry, [2, 2]], i, ?createAndGo}]),
- ?line ?expect1([{[kompissEntry, [1, 2]], "kompis3"},
+ ?expect1([{[kompissEntry, [1, 2]], "kompis3"},
{[kompissEntry, [2, 2]], ?createAndGo}]),
gn([[kompissEntry, [1, 1]],
[kompissEntry, [2, 1]]]),
- ?line ?expect1([{[kompissEntry, [1, 2]], "kompis3"},
+ ?expect1([{[kompissEntry, [1, 2]], "kompis3"},
{[kompissEntry, [2, 2]], ?active}]),
s([{[kompissEntry, [2, 3]], i, ?destroy}]),
- ?line ?expect1([{[kompissEntry, [2, 3]], ?destroy}]),
+ ?expect1([{[kompissEntry, [2, 3]], ?destroy}]),
s([{[kompissEntry, [2, 2]], i, ?destroy}]),
- ?line ?expect1([{[kompissEntry, [2, 2]], ?destroy}]),
+ ?expect1([{[kompissEntry, [2, 2]], ?destroy}]),
?DBG("big_test -> done",[]),
ok.
@@ -4371,21 +4315,21 @@ big_test_2() ->
?NPRINT("Testing simple next/get/set @ subagent (2)..."),
gn([[klas2]]),
- ?line ?expect1([{[fname2,0], ""}]),
+ ?expect1([{[fname2,0], ""}]),
g([[fname2,0]]),
- ?line ?expect1([{[fname2,0], ""}]),
+ ?expect1([{[fname2,0], ""}]),
s([{[fname2,0], s, "test set"}]),
- ?line ?expect1([{[fname2,0], "test set"}]),
+ ?expect1([{[fname2,0], "test set"}]),
g([[fname2,0]]),
- ?line ?expect1([{[fname2,0], "test set"}]),
+ ?expect1([{[fname2,0], "test set"}]),
otp_1298_test(),
?NPRINT("Testing next from last object in master to subagent (2)..."),
gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line ?expect1([{[fname2,0], "test set"}]),
+ ?expect1([{[fname2,0], "test set"}]),
gn([[1,1], [?v1_2(sysServices, sysORLastChange),0]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{[fname2,0], "test set"}]),
table_test(),
@@ -4394,40 +4338,40 @@ big_test_2() ->
_FTab = [friendsEntry2],
s([{[friendsEntry2, [2, 3]], s, "kompis3"},
{[friendsEntry2, [3, 3]], i, ?createAndGo}]),
- ?line ?expect1([{[friendsEntry2, [2, 3]], "kompis3"},
+ ?expect1([{[friendsEntry2, [2, 3]], "kompis3"},
{[friendsEntry2, [3, 3]], ?createAndGo}]),
g([[friendsEntry2, [2, 3]],
[friendsEntry2, [3, 3]]]),
- ?line ?expect1([{[friendsEntry2, [2, 3]], "kompis3"},
+ ?expect1([{[friendsEntry2, [2, 3]], "kompis3"},
{[friendsEntry2, [3, 3]], ?active}]),
s([{[friendsEntry2, [3, 3]], i, ?destroy}]),
- ?line ?expect1([{[friendsEntry2, [3, 3]], ?destroy}]),
+ ?expect1([{[friendsEntry2, [3, 3]], ?destroy}]),
?NPRINT("Adding two rows in subagent table with special INDEX (2)"),
s([{[kompissEntry2, [1, 3]], s, "kompis3"},
{[kompissEntry2, [2, 3]], i, ?createAndGo}]),
- ?line ?expect1([{[kompissEntry2, [1, 3]], "kompis3"},
+ ?expect1([{[kompissEntry2, [1, 3]], "kompis3"},
{[kompissEntry2, [2, 3]], ?createAndGo}]),
g([[kompissEntry2, [1, 3]],
[kompissEntry2, [2, 3]]]),
- ?line ?expect1([{[kompissEntry2, [1, 3]], "kompis3"},
+ ?expect1([{[kompissEntry2, [1, 3]], "kompis3"},
{[kompissEntry2, [2, 3]], ?active}]),
gn([[kompissEntry2, [1]],
[kompissEntry2, [2]]]),
- ?line ?expect1([{[kompissEntry2, [1, 3]], "kompis3"},
+ ?expect1([{[kompissEntry2, [1, 3]], "kompis3"},
{[kompissEntry2, [2, 3]], ?active}]),
s([{[kompissEntry2, [1, 2]], s, "kompis3"},
{[kompissEntry2, [2, 2]], i, ?createAndGo}]),
- ?line ?expect1([{[kompissEntry2, [1, 2]], "kompis3"},
+ ?expect1([{[kompissEntry2, [1, 2]], "kompis3"},
{[kompissEntry2, [2, 2]], ?createAndGo}]),
gn([[kompissEntry2, [1, 1]],
[kompissEntry2, [2, 1]]]),
- ?line ?expect1([{[kompissEntry2, [1, 2]], "kompis3"},
+ ?expect1([{[kompissEntry2, [1, 2]], "kompis3"},
{[kompissEntry2, [2, 2]], ?active}]),
s([{[kompissEntry2, [2, 3]], i, ?destroy}]),
- ?line ?expect1([{[kompissEntry2, [2, 3]], ?destroy}]),
+ ?expect1([{[kompissEntry2, [2, 3]], ?destroy}]),
s([{[kompissEntry2, [2, 2]], i, ?destroy}]),
- ?line ?expect1([{[kompissEntry2, [2, 2]], ?destroy}]),
+ ?expect1([{[kompissEntry2, [2, 2]], ?destroy}]),
ok.
%% Req. Test1
@@ -4436,26 +4380,26 @@ multi_threaded_test() ->
g([[multiStr,0]]),
Pid = get_multi_pid(),
g([[sysUpTime,0]]),
- ?line ?expect1([{[sysUpTime,0], any}]),
+ ?expect1([{[sysUpTime,0], any}]),
s([{[sysLocation, 0], s, "pelle"}]),
- ?line ?expect1([{[sysLocation, 0], "pelle"}]),
+ ?expect1([{[sysLocation, 0], "pelle"}]),
Pid ! continue,
- ?line ?expect1([{[multiStr,0], "ok"}]),
+ ?expect1([{[multiStr,0], "ok"}]),
s([{[multiStr, 0], s, "block"}]),
Pid2 = get_multi_pid(),
g([[sysUpTime,0]]),
- ?line ?expect1([{[sysUpTime,0], any}]),
+ ?expect1([{[sysUpTime,0], any}]),
g([[multiStr,0]]),
Pid3 = get_multi_pid(),
g([[sysUpTime,0]]),
- ?line ?expect1([{[sysUpTime,0], any}]),
+ ?expect1([{[sysUpTime,0], any}]),
s([{[sysLocation, 0], s, "kalle"}]),
Pid3 ! continue,
- ?line ?expect1([{[multiStr,0], "ok"}]),
+ ?expect1([{[multiStr,0], "ok"}]),
Pid2 ! continue,
- ?line ?expect1([{[multiStr,0], "block"}]),
- ?line ?expect1([{[sysLocation,0], "kalle"}]).
+ ?expect1([{[multiStr,0], "block"}]),
+ ?expect1([{[sysLocation,0], "kalle"}]).
%% Req. Test1, TestTrapv2
mt_trap_test(MA, MT) ->
@@ -4463,12 +4407,12 @@ mt_trap_test(MA, MT) ->
?IPRINT("mt_trap_test(01) -> issue testTrapv22 (standard trap)", []),
snmpa:send_trap(MA, testTrapv22, "standard trap"),
?IPRINT("mt_trap_test(02) -> await v2trap", []),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?system ++ [0,1]}]),
%% multi-threaded = true
%% This will *lock* the 'main thread' of a multi-threaded agent,
- %% the worker state will be 'busy'. Therefor when a new request
+ %% the worker state will be 'busy'. Therefore when a new request
%% arrives a new *temporary* worker will be spawned.
?IPRINT("mt_trap_test(03) -> issue mtTrap (standard trap)", []),
snmpa:send_trap(MA, mtTrap, "standard trap"),
@@ -4477,7 +4421,7 @@ mt_trap_test(MA, MT) ->
g([[sysUpTime,0]]),
?IPRINT("mt_trap_test(06) -> await sysUpTime", []),
- ?line ?expect1([{[sysUpTime,0], any}]),
+ ?expect1([{[sysUpTime,0], any}]),
%% This will *only* work if multi-threaded is 'true', not 'extended'
%% since in the latter case all notifications are serialized through
@@ -4488,7 +4432,7 @@ mt_trap_test(MA, MT) ->
?IPRINT("mt_trap_test(07) -> issue testTrapv22 (standard trap)", []),
snmpa:send_trap(MA, testTrapv22, "standard trap"),
?IPRINT("mt_trap_test(08) -> await v2trap", []),
- ?line ?expect2(v2trap,
+ ?expect2(v2trap,
[{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?system ++ [0,1]}]);
true ->
@@ -4499,7 +4443,7 @@ mt_trap_test(MA, MT) ->
Pid ! continue,
?IPRINT("mt_trap_test(10) -> await v2trap", []),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?testTrap ++ [2]},
{[multiStr,0], "ok"}]),
?IPRINT("mt_trap_test(11) -> done", []),
@@ -4509,7 +4453,7 @@ mt_trap_test(MA, MT) ->
get_multi_pid() ->
get_multi_pid(10).
get_multi_pid(0) ->
- ?line ?FAIL(no_global_name);
+ ?FAIL(no_global_name);
get_multi_pid(N) ->
?SLEEP(1000),
case global:whereis_name(snmp_multi_tester) of
@@ -4522,26 +4466,26 @@ types_v2_test() ->
?NPRINT("Testing v2 types..."),
s([{[bits1,0], 2#10}]),
- ?line ?expect1([{[bits1,0], ?str(2#10)}]),
+ ?expect1([{[bits1,0], ?str(2#10)}]),
g([[bits1,0]]),
- ?line ?expect1([{[bits1,0], ?str(2#101)}]),
+ ?expect1([{[bits1,0], ?str(2#101)}]),
s([{[bits2,0], 2#11000000110}]),
- ?line ?expect1([{[bits2,0], ?str(2#11000000110)}]),
+ ?expect1([{[bits2,0], ?str(2#11000000110)}]),
g([[bits2,0]]),
- ?line ?expect1([{[bits2,0], ?str(2#11000000110)}]),
+ ?expect1([{[bits2,0], ?str(2#11000000110)}]),
g([[bits3,0]]),
- ?line ?expect3(genErr, 1, any),
+ ?expect3(genErr, 1, any),
g([[bits4,0]]),
- ?line ?expect3(genErr, 1, any),
+ ?expect3(genErr, 1, any),
s([{[bits1,0], s, [2#10]}]),
- ?line ?expect3(?v1_2(badValue, wrongValue), 1, any),
+ ?expect3(?v1_2(badValue, wrongValue), 1, any),
s([{[bits2,0], 2#11001001101010011}]),
- ?line ?expect3(?v1_2(badValue, wrongValue), 1, any).
+ ?expect3(?v1_2(badValue, wrongValue), 1, any).
%% Req. Test1
@@ -4557,52 +4501,52 @@ implied_test(MA) ->
Idx2 = "qq",
?DBG("implied_test -> (send) create row 1 '~s' in table 1",[Idx1]),
s([{[testStatus, Idx1], i, ?createAndGo}, {[testDescr, Idx1],s,"row 1"}]),
- ?line ?expect1([{[testStatus, Idx1], ?createAndGo},
+ ?expect1([{[testStatus, Idx1], ?createAndGo},
{[testDescr, Idx1], "row 1"}]),
?DBG("implied_test -> (send) create row 2 '~s' in table 1",[Idx2]),
s([{[testStatus, Idx2], i, ?createAndGo}, {[testDescr, Idx2],s,"row 2"}]),
- ?line ?expect1([{[testStatus, Idx2], ?createAndGo},
+ ?expect1([{[testStatus, Idx2], ?createAndGo},
{[testDescr, Idx2], "row 2"}]),
?DBG("implied_test -> get-next(testDescr)",[]),
gn([[testDescr]]),
- ?line ?expect1([{[testDescr,Idx1], "row 1"}]),
+ ?expect1([{[testDescr,Idx1], "row 1"}]),
?DBG("implied_test -> get-next(testDescr) of row 1",[]),
gn([[testDescr,Idx1]]),
- ?line ?expect1([{[testDescr,Idx2], "row 2"}]),
+ ?expect1([{[testDescr,Idx2], "row 2"}]),
% Delete the rows
?DBG("implied_test -> (send) delete row 1 '~s' from table 1",[Idx1]),
s([{[testStatus, Idx1], i, ?destroy}]),
- ?line ?expect1([{[testStatus, Idx1], ?destroy}]),
+ ?expect1([{[testStatus, Idx1], ?destroy}]),
?DBG("implied_test -> (send) delete row 2 '~s' from table 1",[Idx2]),
s([{[testStatus, Idx2], i, ?destroy}]),
- ?line ?expect1([{[testStatus, Idx2], ?destroy}]),
+ ?expect1([{[testStatus, Idx2], ?destroy}]),
%% Try the same in other table
Idx3 = [1, "apa"],
Idx4 = [1, "qq"],
?DBG("implied_test -> (send) create row 1 '~s' in table 2",[Idx3]),
s([{[testStatus2, Idx3], i, ?createAndGo}, {[testDescr2,Idx3],s,"row 1"}]),
- ?line ?expect1([{[testStatus2, Idx3], ?createAndGo},
+ ?expect1([{[testStatus2, Idx3], ?createAndGo},
{[testDescr2, Idx3], "row 1"}]),
?DBG("implied_test -> (send) create row 2 '~s' in table 2",[Idx4]),
s([{[testStatus2, Idx4], i, ?createAndGo}, {[testDescr2,Idx4],s,"row 2"}]),
- ?line ?expect1([{[testStatus2, Idx4], ?createAndGo},
+ ?expect1([{[testStatus2, Idx4], ?createAndGo},
{[testDescr2, Idx4], "row 2"}]),
?DBG("implied_test -> get-next(testDescr2)",[]),
gn([[testDescr2]]),
- ?line ?expect1([{[testDescr2,Idx3], "row 1"}]),
+ ?expect1([{[testDescr2,Idx3], "row 1"}]),
?DBG("implied_test -> get-next(testDescr2) of row 1",[]),
gn([[testDescr2,Idx3]]),
- ?line ?expect1([{[testDescr2,Idx4], "row 2"}]),
+ ?expect1([{[testDescr2,Idx4], "row 2"}]),
% Delete the rows
?DBG("implied_test -> (send) delete row 1 '~s' from table 2",[Idx3]),
s([{[testStatus2, Idx3], i, ?destroy}]),
- ?line ?expect1([{[testStatus2, Idx3], ?destroy}]),
+ ?expect1([{[testStatus2, Idx3], ?destroy}]),
?DBG("implied_test -> (send) delete row 2 '~s' from table 2",[Idx4]),
s([{[testStatus2, Idx4], i, ?destroy}]),
- ?line ?expect1([{[testStatus2, Idx4], ?destroy}]),
+ ?expect1([{[testStatus2, Idx4], ?destroy}]),
snmpa:verbosity(MA, log),
@@ -4620,25 +4564,25 @@ sparse_table_test() ->
Idx2 = 2,
s([{[sparseStatus, Idx1], i, ?createAndGo},
{[sparseDescr, Idx1], s, "row 1"}]),
- ?line ?expect1([{[sparseStatus, Idx1], ?createAndGo},
+ ?expect1([{[sparseStatus, Idx1], ?createAndGo},
{[sparseDescr, Idx1], "row 1"}]),
s([{[sparseStatus, Idx2], i, ?createAndGo},
{[sparseDescr, Idx2], s, "row 2"}]),
- ?line ?expect1([{[sparseStatus, Idx2], ?createAndGo},
+ ?expect1([{[sparseStatus, Idx2], ?createAndGo},
{[sparseDescr, Idx2], "row 2"}]),
?v1_2(gn([[sparseIndex], [sparseDescr,Idx1], [sparseDescr,Idx2],
[sparseStatus,Idx1], [sparseStatus,Idx2]]),
gb(0,5,[[sparseIndex]])),
- ?line ?expect1([{[sparseDescr,Idx1], "row 1"},
+ ?expect1([{[sparseDescr,Idx1], "row 1"},
{[sparseDescr,Idx2], "row 2"},
{[sparseStatus,Idx1], ?active},
{[sparseStatus,Idx2], ?active},
{[sparseStr,0], "slut"}]),
%% Delete the rows
s([{[sparseStatus, Idx1], i, ?destroy}]),
- ?line ?expect1([{[sparseStatus, Idx1], ?destroy}]),
+ ?expect1([{[sparseStatus, Idx1], ?destroy}]),
s([{[sparseStatus, Idx2], i, ?destroy}]),
- ?line ?expect1([{[sparseStatus, Idx2], ?destroy}]).
+ ?expect1([{[sparseStatus, Idx2], ?destroy}]).
%% Req. Test1
@@ -4653,12 +4597,12 @@ cnt_64_test(MA) ->
?DBG("get cnt64",[]),
g([[cnt64,0]]),
?DBG("await response",[]),
- ?line ?v1_2(?expect3(noSuchName, 1, any),
+ ?v1_2(?expect3(noSuchName, 1, any),
?expect1([{[cnt64,0],18446744073709551615}])),
?DBG("get-next cnt64",[]),
gn([[cnt64]]),
?DBG("await response",[]),
- ?line ?v1_2(?expect1([{[cnt64Str,0], "after cnt64"}]),
+ ?v1_2(?expect1([{[cnt64Str,0], "after cnt64"}]),
?expect1([{[cnt64,0],18446744073709551615}])),
?DBG("send cntTrap",[]),
snmpa:send_trap(MA,cntTrap,"standard trap",[
@@ -4667,7 +4611,7 @@ cnt_64_test(MA) ->
{sysLocation, "here"}
]),
?DBG("await response",[]),
- ?line ?v1_2(?expect5(trap, [test], 6, 1, [{[sysContact,0], "pelle"},
+ ?v1_2(?expect5(trap, [test], 6, 1, [{[sysContact,0], "pelle"},
{[sysLocation,0], "here"}]),
?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?testTrap ++ [1]},
@@ -4681,26 +4625,26 @@ cnt_64_test(MA) ->
?DBG("create row (cntStatus): ~p",[Idx1]),
s([{[cntStatus, Idx1], i, ?createAndGo}]),
?DBG("await response",[]),
- ?line ?expect1([{[cntStatus, Idx1], ?createAndGo}]),
+ ?expect1([{[cntStatus, Idx1], ?createAndGo}]),
?DBG("create row (cntStatus): ~p",[Idx2]),
s([{[cntStatus, Idx2], i, ?createAndGo}]),
?DBG("await response",[]),
- ?line ?expect1([{[cntStatus, Idx2], ?createAndGo}]),
+ ?expect1([{[cntStatus, Idx2], ?createAndGo}]),
?DBG("get-next (cntIndex)",[]),
gn([[cntIndex]]),
?DBG("await response",[]),
- ?line ?v1_2(?expect1([{[cntStatus,Idx1], ?active}]),
+ ?v1_2(?expect1([{[cntStatus,Idx1], ?active}]),
?expect1([{[cntCnt,Idx1], 0}])),
% Delete the rows
?DBG("delete row (cntStatus): ~p",[Idx1]),
s([{[cntStatus, Idx1], i, ?destroy}]),
?DBG("await response",[]),
- ?line ?expect1([{[cntStatus, Idx1], ?destroy}]),
+ ?expect1([{[cntStatus, Idx1], ?destroy}]),
?DBG("delete row (cntStatus): ~p",[Idx2]),
s([{[cntStatus, Idx2], i, ?destroy}]),
?DBG("await response",[]),
- ?line ?expect1([{[cntStatus, Idx2], ?destroy}]),
+ ?expect1([{[cntStatus, Idx2], ?destroy}]),
catch snmpa:verbosity(MA, log),
?DBG("done",[]),
ok.
@@ -4709,40 +4653,40 @@ cnt_64_test(MA) ->
opaque_test() ->
?NPRINT("Testing Opaque datatype..."),
g([[opaqueObj,0]]),
- ?line ?expect1([{[opaqueObj,0], "opaque-data"}]).
+ ?expect1([{[opaqueObj,0], "opaque-data"}]).
%% Req. OLD-SNMPEA-MIB
api_test(MaNode) ->
- ?line {value, OID} = rpc:call(MaNode, snmpa, name_to_oid,
+ {value, OID} = rpc:call(MaNode, snmpa, name_to_oid,
[intAgentIpAddress]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmpa,
+ {value, intAgentIpAddress} = rpc:call(MaNode, snmpa,
oid_to_name, [OID]),
- ?line false = rpc:call(MaNode, snmpa, name_to_oid, [intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmpa, oid_to_name,
+ false = rpc:call(MaNode, snmpa, name_to_oid, [intAgentIpAddres]),
+ false = rpc:call(MaNode, snmpa, oid_to_name,
[[1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmpa, enum_to_int,
+ {value, 2} = rpc:call(MaNode, snmpa, enum_to_int,
[intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmpa, int_to_enum,
+ {value, excluded} = rpc:call(MaNode, snmpa, int_to_enum,
[intViewType, 2]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int, [intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int,
+ false = rpc:call(MaNode, snmpa, enum_to_int, [intViewType, exclude]),
+ false = rpc:call(MaNode, snmpa, enum_to_int,
[intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int,
+ false = rpc:call(MaNode, snmpa, enum_to_int,
[intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, [intViewType, 3]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, [intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, [intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmpa,
+ false = rpc:call(MaNode, snmpa, int_to_enum, [intViewType, 3]),
+ false = rpc:call(MaNode, snmpa, int_to_enum, [intAgentIpAddress, 2]),
+ false = rpc:call(MaNode, snmpa, int_to_enum, [intAgentIpAddre, 2]),
+ {value, active} = rpc:call(MaNode, snmpa,
int_to_enum, ['RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmpa,
+ {value, ?destroy} = rpc:call(MaNode, snmpa,
enum_to_int, ['RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmpa,
+ false = rpc:call(MaNode, snmpa,
enum_to_int, ['RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmpa,
+ false = rpc:call(MaNode, snmpa,
enum_to_int, ['xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, ['RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, ['xxRowStatus', 1]),
- ?line case snmp:date_and_time() of
+ false = rpc:call(MaNode, snmpa, int_to_enum, ['RowStatus', 25]),
+ false = rpc:call(MaNode, snmpa, int_to_enum, ['xxRowStatus', 1]),
+ case snmp:date_and_time() of
List when is_list(List), length(List) == 8 -> ok;
List when is_list(List), length(List) == 11 -> ok
end.
@@ -4750,42 +4694,42 @@ api_test(MaNode) ->
%% Req. Klas3
api_test2() ->
g([[fname3,0]]),
- ?line ?expect1([{[fname3,0], "ok"}]),
+ ?expect1([{[fname3,0], "ok"}]),
g([[fname4,0]]),
- ?line ?expect1([{[fname4,0], 1}]).
+ ?expect1([{[fname4,0], 1}]).
api_test3() ->
g([[fname3,0]]),
- ?line ?expect1([{[fname3,0], "ok"}]).
+ ?expect1([{[fname3,0], "ok"}]).
unreg_test() ->
gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line ?expect1([{[snmpInPkts, 0], any}]).
+ ?expect1([{[snmpInPkts, 0], any}]).
load_test() ->
gn([[?v1_2(sysServices, sysORLastChange),0]]),
- ?line ?expect1([{[fname,0], ""}]).
+ ?expect1([{[fname,0], ""}]).
%% Req. Klas1
load_test_sa() ->
gn([[?v1_2(sysServices,sysORLastChange), 0]]),
- ?line ?expect1([{[fname,0], any}]).
+ ?expect1([{[fname,0], any}]).
%% Req. system group, Klas1, OLD-SNMPEA-MIB
do_mul_get() ->
Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
s([{[fname,0], s, "test set"}]),
- ?line ?expect1([{[fname,0], "test set"}]),
+ ?expect1([{[fname,0], "test set"}]),
g([[sysDescr,0], Key1c4, [fname,0],Key1c3,[sysName,0]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{Key1c4, 2},
{[fname,0], "test set"},
{Key1c3, 2},
{[sysName,0], "test"}]),
g([[1,3,7,1], Key1c4, [sysDescr,0], [1,3,7,2], Key1c3, [sysDescr,0]]),
- ?line ?v1_2(?expect3(noSuchName, [1,4], any),
+ ?v1_2(?expect3(noSuchName, [1,4], any),
?expect1([{[1,3,7,1], noSuchObject},
{Key1c4, 2},
{[sysDescr,0], "Erlang SNMP agent"},
@@ -4798,16 +4742,16 @@ do_mul_get_err() ->
Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
s([{[fname,0], s, "test set"}]),
- ?line ?expect1([{[fname,0], "test set"}]),
+ ?expect1([{[fname,0], "test set"}]),
g([[sysDescr,0],Key1c4,[fname,0], Key1c3, [sysName,2]]),
- ?line ?v1_2(?expect3(noSuchName, 5, any),
+ ?v1_2(?expect3(noSuchName, 5, any),
?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{Key1c4, 2},
{[fname,0], "test set"},
{Key1c3, 2},
{[sysName,2], noSuchInstance}])),
g([[sysDescr,0],Key1c4,[fname3,0], Key1c3, [sysName,1]]),
- ?line ?v1_2(?expect3(noSuchName, [3,5], any),
+ ?v1_2(?expect3(noSuchName, [3,5], any),
?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{Key1c4, 2},
{[fname3,0], noSuchObject},
@@ -4822,9 +4766,9 @@ do_mul_next() ->
Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
s([{[fname,0], s, "test set"}]),
- ?line ?expect1([{[fname,0], "test set"}]),
+ ?expect1([{[fname,0], "test set"}]),
gn([[sysDescr], Key1c4s, [fname],Key1c3s,[sysName]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{Key1c4, 2}, {[fname,0], "test set"},
{Key1c3, 2}, {[sysName,0], "test"}]).
@@ -4835,9 +4779,9 @@ do_mul_next_err() ->
Key1c3 = [intCommunityEntry,[3],get(mip),is("public")],
Key1c4 = [intCommunityEntry,[4],get(mip),is("public")],
s([{[fname,0], s, "test set"}]),
- ?line ?expect1([{[fname,0], "test set"}]),
+ ?expect1([{[fname,0], "test set"}]),
gn([[sysDescr], Key1c4s, [1,3,6,999], [fname],[1,3,90], Key1c3s,[sysName]]),
- ?line ?v1_2(?expect3(noSuchName, [3,5], any),
+ ?v1_2(?expect3(noSuchName, [3,5], any),
?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{Key1c4, 2},
{[1,3,6,999], endOfMibView},
@@ -4859,7 +4803,7 @@ do_mul_set() ->
{NewKeyc5, ?createAndGo},
{NewKeyc4, 2},
{[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
+ ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
{NewKeyc3, 2},
{[sysLocation,0], "new_value"},
{NewKeyc5, ?createAndGo},
@@ -4868,14 +4812,14 @@ do_mul_set() ->
g([[friendsEntry, [2, 3]],
[sysLocation,0],
[friendsEntry, [3, 3]]]),
- ?line ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
+ ?expect1([{[friendsEntry, [2, 3]], "kompis3"},
{[sysLocation,0], "new_value"},
{[friendsEntry, [3, 3]], ?active}]),
g([NewKeyc4]),
- ?line ?expect1([{NewKeyc4, 2}]),
+ ?expect1([{NewKeyc4, 2}]),
s([{[friendsEntry, [3, 3]], ?destroy},
{NewKeyc5, ?destroy}]),
- ?line ?expect1([{[friendsEntry, [3, 3]], ?destroy},
+ ?expect1([{[friendsEntry, [3, 3]], ?destroy},
{NewKeyc5, ?destroy}]).
%% Req. system group, Klas1, OLD-SNMPEA-MIB
@@ -4890,46 +4834,46 @@ do_mul_set_err() ->
{NewKeyc5, ?createAndGo},
{NewKeyc4, 2},
{[friendsEntry, [3, 3]], ?createAndGo}]),
- ?line ?expect3(?v1_2(noSuchName, notWritable), 3, any),
+ ?expect3(?v1_2(noSuchName, notWritable), 3, any),
g([[friendsEntry, [2, 3]]]),
- ?line ?v1_2(?expect3(noSuchName, 1, any),
+ ?v1_2(?expect3(noSuchName, 1, any),
?expect1([{[friendsEntry, [2,3]], noSuchInstance}])),
g([NewKeyc4]),
- ?line ?v1_2(?expect3(noSuchName, 1, any),
+ ?v1_2(?expect3(noSuchName, 1, any),
?expect1([{NewKeyc4, noSuchInstance}])).
%% Req. SA-MIB
sa_mib() ->
g([[sa, [2,0]]]),
- ?line ?expect1([{[sa, [2,0]], 3}]),
+ ?expect1([{[sa, [2,0]], 3}]),
s([{[sa, [1,0]], s, "sa_test"}]),
- ?line ?expect1([{[sa, [1,0]], "sa_test"}]),
+ ?expect1([{[sa, [1,0]], "sa_test"}]),
ok.
ma_trap1(MA) ->
ok = snmpa:send_trap(MA, testTrap2, "standard trap"),
- ?line ?expect5(trap, [system], 6, 1, [{[system, [4,0]],
+ ?expect5(trap, [system], 6, 1, [{[system, [4,0]],
"{mbj,eklas}@erlang.ericsson.se"}]),
ok = snmpa:send_trap(MA, testTrap1, "standard trap"),
- ?line ?expect5(trap, [1,2,3] , 1, 0, [{[system, [4,0]],
+ ?expect5(trap, [1,2,3] , 1, 0, [{[system, [4,0]],
"{mbj,eklas}@erlang.ericsson.se"}]),
ok.
ma_trap2(MA) ->
snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line ?expect5(trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]),
+ ?expect5(trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]),
ok.
ma_v2_2_v1_trap(MA) ->
snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line ?expect5(trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]),
+ ?expect5(trap, [system], 6, 1, [{[system, [4,0]], "pelle"}]),
ok.
ma_v2_2_v1_trap2(MA) ->
snmpa:send_trap(MA,linkUp,"standard trap",[{ifIndex, [1], 1},
{ifAdminStatus, [1], 1},
{ifOperStatus, [1], 2}]),
- ?line ?expect5(trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
+ ?expect5(trap, [1,2,3], 3, 0, [{[ifIndex, 1], 1},
{[ifAdminStatus, 1], 1},
{[ifOperStatus, 1], 2}]),
ok.
@@ -4949,7 +4893,7 @@ sa_trap1(SA) ->
%% io:format("sa_trap1 -> SA trap send: "
%% "~n TSRes: ~p"
%% "~n", [TSRes]),
- ?line ?expect5(trap, [ericsson], 6, 1, [{[system, [4,0]],
+ ?expect5(trap, [ericsson], 6, 1, [{[system, [4,0]],
"{mbj,eklas}@erlang.ericsson.se"},
{[sa, [1,0]], "sa_test"}]),
snmpa:verbosity(SA, {subagents, silence}),
@@ -4957,14 +4901,14 @@ sa_trap1(SA) ->
sa_trap2(SA) ->
snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line ?expect5(trap, [ericsson], 6, 1, [{[system, [4,0]], "pelle"},
+ ?expect5(trap, [ericsson], 6, 1, [{[system, [4,0]], "pelle"},
{[sa, [1,0]], "sa_test"}]),
ok.
sa_trap3(SA) ->
snmpa:send_trap(SA, saTrap2, "standard trap",
[{intViewSubtree, [4], [1,2,3,4]}]),
- ?line ?expect5(trap, [ericsson], 6, 2, [{[system, [4,0]],
+ ?expect5(trap, [ericsson], 6, 2, [{[system, [4,0]],
"{mbj,eklas}@erlang.ericsson.se"},
{[sa, [1,0]], "sa_test"},
{[intViewSubtree,4],[1,2,3,4]}]),
@@ -4974,17 +4918,17 @@ ma_v2_trap1(MA) ->
?DBG("ma_v2_traps -> entry with MA = ~p => "
"send standard trap: testTrapv22",[MA]),
snmpa:send_trap(MA, testTrapv22, "standard trap"),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?system ++ [0,1]}]),
?DBG("ma_v2_traps -> send standard trap: testTrapv21",[]),
snmpa:send_trap(MA, testTrapv21, "standard trap"),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?snmp ++ [1]}]),
ok.
ma_v2_trap2(MA) ->
snmpa:send_trap(MA,testTrapv22,"standard trap",[{sysContact,"pelle"}]),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?system ++ [0,1]},
{[system, [4,0]], "pelle"}]).
@@ -5389,10 +5333,10 @@ command_handler([{_No, _Desc, Cmd}|Rest]) ->
%% command_handler(Rest);
%% {error, Reason} ->
%% ?EPRINT("command_handler -> ~w error: ~n~p", [_No, Reason]),
- %% ?line ?FAIL(Reason);
+ %% ?FAIL(Reason);
%% Error ->
%% ?EPRINT("command_handler -> ~w unexpected: ~n~p", [_No, Error]),
- %% ?line ?FAIL({unexpected_command_result, Error})
+ %% ?FAIL({unexpected_command_result, Error})
%% end.
try Cmd() of
ok ->
@@ -5404,7 +5348,7 @@ command_handler([{_No, _Desc, Cmd}|Rest]) ->
if
(SysEvs =:= []) ->
?EPRINT("command_handler -> ~w error: ~n~p", [_No, Reason]),
- ?line ?FAIL(Reason);
+ ?FAIL(Reason);
true ->
?WPRINT("command_handler -> "
"failed when we got system events: "
@@ -5420,7 +5364,7 @@ command_handler([{_No, _Desc, Cmd}|Rest]) ->
(SysEvs =:= []) ->
?EPRINT("command_handler -> "
"~w unexpected: ~n~p", [_No, Error]),
- ?line ?FAIL({unexpected_command_result, Error});
+ ?FAIL({unexpected_command_result, Error});
true ->
?WPRINT("command_handler -> "
"unexpected when we got system events: "
@@ -5431,32 +5375,32 @@ command_handler([{_No, _Desc, Cmd}|Rest]) ->
end
catch
C:E:S ->
- ?IPRINT("command_handler -> command ~w catched", [_No]),
+ ?IPRINT("command_handler -> command ~w caught", [_No]),
SysEvs = snmp_test_global_sys_monitor:events(),
if
(SysEvs =:= []) ->
- ?EPRINT("command_handler -> ~w catched: "
+ ?EPRINT("command_handler -> ~w caught: "
"~n Class: ~p"
"~n Error: ~p"
"~n Stack: ~p", [_No, C, E, S]),
- ?line ?FAIL({catched_command_result, {C, E, S}});
+ ?FAIL({catched_command_result, {C, E, S}});
true ->
?WPRINT("command_handler -> "
- "catched when we got system events: "
- "~n Catched: "
+ "caught when we got system events: "
+ "~n Caught: "
"~n Class: ~p"
"~n Error: ~p"
"~n Stack: ~p"
"~n Sys Events: ~p"
"~n", [C, E, S, SysEvs]),
- ?SKIP([{catched, {C, E, S}}, {system_events, SysEvs}])
+ ?SKIP([{caught, {C, E, S}}, {system_events, SysEvs}])
end
end.
ma_v1_2_v2_trap(MA) ->
snmpa:send_trap(MA,linkDown,"standard trap",[{ifIndex, [1], 1}]),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?snmpTraps ++ [3]},
{[ifIndex, 1], 1},
{[snmpTrapEnterprise, 0], [1,2,3]}]).
@@ -5464,7 +5408,7 @@ ma_v1_2_v2_trap(MA) ->
ma_v1_2_v2_trap2(MA) ->
snmpa:send_trap(MA,testTrap2,"standard trap",[{sysContact,"pelle"}]),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?system ++ [0,1]},
{[system, [4,0]], "pelle"},
{[snmpTrapEnterprise, 0], ?system}]).
@@ -5473,7 +5417,7 @@ ma_v1_2_v2_trap2(MA) ->
sa_v1_2_v2_trap1(SA) ->
snmpa:verbosity(SA, {subagents, trace}),
snmpa:send_trap(SA, saTrap, "standard trap"),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
{[system, [4,0]],
"{mbj,eklas}@erlang.ericsson.se"},
@@ -5485,7 +5429,7 @@ sa_v1_2_v2_trap1(SA) ->
sa_v1_2_v2_trap2(SA) ->
snmpa:verbosity(SA, {subagents, trace}),
snmpa:send_trap(SA, saTrap, "standard trap",[{sysContact,"pelle"}]),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?ericsson ++ [0, 1]},
{[system, [4,0]], "pelle"},
{[sa, [1,0]], "sa_test"},
@@ -5498,7 +5442,7 @@ sa_v1_2_v2_trap3(SA) ->
snmpa:verbosity(SA, {subagents, trace}),
snmpa:send_trap(SA, saTrap2, "standard trap",
[{intViewSubtree, [4], [1,2,3,4]}]),
- ?line ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], ?ericsson ++ [0, 2]},
{[system, [4,0]],
"{mbj,eklas}@erlang.ericsson.se"},
@@ -5518,14 +5462,14 @@ sa_errs_bad_value() ->
{[sa, [2,0]], 5}, % badValue (i is_set_ok)
{NewKeyc5, ?createAndGo},
{NewKeyc4, 2}]),
- ?line ?expect3(badValue, 2, any),
+ ?expect3(badValue, 2, any),
s([{NewKeyc3, 2},
{[sa, [2,0]], 6}, % wrongValue (i is_set_ok)
{NewKeyc5, ?createAndGo},
{NewKeyc4, 2}]),
- ?line ?expect3(?v1_2(badValue, wrongValue), 2, any),
+ ?expect3(?v1_2(badValue, wrongValue), 2, any),
g([NewKeyc4]),
- ?line ?v1_2(?expect3(noSuchName, 1, any),
+ ?v1_2(?expect3(noSuchName, 1, any),
?expect1([{NewKeyc4, noSuchInstance}])).
%% Req. SA-MIB, OLD-SNMPEA-MIB
@@ -5535,22 +5479,22 @@ sa_errs_gen_err() ->
NewKeyc5 = [intCommunityEntry,[5],get(mip),is("test")],
s([{NewKeyc3, 2},{NewKeyc4, 2},
{NewKeyc5, ?createAndGo}, {[sa, [3,0]], 5}]),
- ?line ?expect3(genErr, 4, any),
+ ?expect3(genErr, 4, any),
% The row might have been added; we don't know.
% (as a matter of fact we do - it is added, because the agent
% first sets its own vars, and then th SAs. Lets destroy it.
s([{NewKeyc5, ?destroy}]),
- ?line ?expect1([{NewKeyc5, ?destroy}]).
+ ?expect1([{NewKeyc5, ?destroy}]).
%% Req. SA-MIB, OLD-SNMPEA-MIB
sa_too_big() ->
g([[sa, [4,0]]]),
- ?line ?expect1(tooBig).
+ ?expect1(tooBig).
%% Req. Klas1, system group, snmp group (v1/v2)
next_across_sa_test() ->
gn([[sysDescr],[klas1,5]]),
- ?line ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
+ ?expect1([{[sysDescr,0], "Erlang SNMP agent"},
{[snmpInPkts, 0], any}]).
%% snmp_test_mgr:s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]). -> noError
@@ -5562,40 +5506,40 @@ next_across_sa_test() ->
%% Req. Klas3, Klas4
undo_test() ->
s([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
- ?line ?expect1([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
+ ?expect1([{[fStatus3, 1], 4}, {[fname3,0], "ok"}]),
s([{[fStatus3, 1], 4}, {[fname3,0], "hoj"}]),
- ?line ?expect3(?v1_2(badValue, inconsistentValue), 2, any),
+ ?expect3(?v1_2(badValue, inconsistentValue), 2, any),
s([{[fStatus3, 3], 4}, {[fname3,0], "hoj"}]),
- ?line ?expect3(?v1_2(genErr, undoFailed), 1, any),
+ ?expect3(?v1_2(genErr, undoFailed), 1, any),
s([{[fStatus3, 4], 4}, {[fname3,0], "ok"}]),
- ?line ?expect3(?v1_2(genErr, commitFailed), 1, any),
-% unfortunatly we don't know if we'll get undoFailed or commitFailed.
+ ?expect3(?v1_2(genErr, commitFailed), 1, any),
+% unfortunately we don't know if we'll get undoFailed or commitFailed.
% it depends on which order the agent traverses the varbind list.
% s([{[fStatus3, 4], 4}, {[fname3,0], "ufail"}]),
-% ?line expect(5, ?v1_2(genErr, undoFailed), 1, any),
+% expect(5, ?v1_2(genErr, undoFailed), 1, any),
s([{[fStatus3, 1], 4}, {[fname3,0], "xfail"}]),
- ?line ?expect3(genErr, 2, any).
+ ?expect3(genErr, 2, any).
%% Req. Klas3, Klas4
bad_return() ->
g([[fStatus4,4],
[fName4,4]]),
- ?line ?expect3(genErr, 2, any),
+ ?expect3(genErr, 2, any),
g([[fStatus4,5],
[fName4,5]]),
- ?line ?expect3(genErr, 1, any),
+ ?expect3(genErr, 1, any),
g([[fStatus4,6],
[fName4,6]]),
- ?line ?expect3(genErr, 2, any),
+ ?expect3(genErr, 2, any),
gn([[fStatus4,7],
[fName4,7]]),
- ?line ?expect3(genErr, 2, any),
+ ?expect3(genErr, 2, any),
gn([[fStatus4,8],
[fName4,8]]),
- ?line ?expect3(genErr, 1, any),
+ ?expect3(genErr, 1, any),
gn([[fStatus4,9],
[fName4,9]]),
- ?line ?expect3(genErr, 2, any).
+ ?expect3(genErr, 2, any).
%%%-----------------------------------------------------------------
@@ -5630,7 +5574,6 @@ standard_mibs_cases_ipv6() ->
%% For this test, the agent is configured for v1.
%% o Test the counters and control objects in SNMP-STANDARD-MIB
%%-----------------------------------------------------------------
-snmp_standard_mib(suite) -> [];
snmp_standard_mib(Config) when is_list(Config) ->
?P(snmp_standard_mib),
init_case(Config),
@@ -5671,9 +5614,9 @@ snmp_standard_mib(Config) when is_list(Config) ->
%% Req. SNMP-STANDARD-MIB
standard_mib_a() ->
- ?line [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
- ?line [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
- ?line OutPkts2 = OutPkts + 1,
+ [OutPkts] = get_req(2, [[snmpOutPkts,0]]),
+ [OutPkts2] = get_req(3, [[snmpOutPkts,0]]),
+ OutPkts2 = OutPkts + 1,
%% There are some more counters we could test here, but it's not that
%% important, since they are removed from SNMPv2-MIB.
ok.
@@ -5683,27 +5626,27 @@ std_mib_init() ->
%% disable authentication failure traps. (otherwise w'd get many of
%% them - this is also a test to see that it works).
s([{[snmpEnableAuthenTraps,0], 2}]),
- ?line ?expect1([{[snmpEnableAuthenTraps, 0], 2}]).
+ ?expect1([{[snmpEnableAuthenTraps, 0], 2}]).
%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
std_mib_finish() ->
%% enable again
s([{[snmpEnableAuthenTraps,0], 1}]),
- ?line ?expect1([{[snmpEnableAuthenTraps, 0], 1}]).
+ ?expect1([{[snmpEnableAuthenTraps, 0], 1}]).
%% Req. SNMP-STANDARD-MIB
standard_mib_test_finish() ->
%% force a authenticationFailure (should result in a trap)
std_mib_write(),
%% check that we got a trap
- ?line ?expect5(trap, [1,2,3], 4, 0, []).
+ ?expect5(trap, [1,2,3], 4, 0, []).
%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
std_mib_read() ->
?DBG("std_mib_read -> entry", []),
g([[sysUpTime,0]]), % try a bad <something>; msg dropped, no reply
?DBG("std_mib_read -> await timeout (i.e. no reply)", []),
- ?line ?expect1(timeout). % make sure we don't get a trap!
+ ?expect1(timeout). % make sure we don't get a trap!
%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
@@ -5731,7 +5674,6 @@ standard_mibs2_cases() ->
%% For this test, the agent is configured for v2 and v3.
%% o Test the counters and control objects in SNMPv2-MIB
%%-----------------------------------------------------------------
-snmpv2_mib_2(suite) -> [];
snmpv2_mib_2(Config) when is_list(Config) ->
?P(snmpv2_mib_2),
?IPRINT("snmpv2_mib_2 -> start"),
@@ -5763,7 +5705,7 @@ snmpv2_mib_2(Config) when is_list(Config) ->
?DBG("snmpv2_mib_2 -> check counters",[]),
try_test(std_mib_c, [Bad]),
- ?DBG("snmpv2_mib_2 -> get som counters",[]),
+ ?DBG("snmpv2_mib_2 -> get some counters",[]),
try_test(snmpv2_mib_a),
?DBG("snmpv2_mib_2 -> enable auth traps, and await some",[]),
@@ -5790,7 +5732,6 @@ standard_mibs3_cases() ->
%% Req. SNMPv2-MIB
-snmpv2_mib_3(suite) -> [];
snmpv2_mib_3(Config) when is_list(Config) ->
%% <CONDITIONAL-SKIP>
Skippable = [{unix, [darwin]}],
@@ -5820,31 +5761,31 @@ snmpv2_mib_test_finish() ->
%% check that we got a trap
?DBG("ma_v2_inform -> await trap",[]),
- ?line ?expect2(v2trap, [{[sysUpTime,0], any},
+ ?expect2(v2trap, [{[sysUpTime,0], any},
{[snmpTrapOID,0], ?authenticationFailure}]),
%% and the the inform
?DBG("ma_v2_inform -> await inform",[]),
- ?line ?expect2({inform,true}, [{[sysUpTime,0], any},
+ ?expect2({inform,true}, [{[sysUpTime,0], any},
{[snmpTrapOID,0],?authenticationFailure}]).
%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
std_mib_a() ->
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
+ [InPkts] = get_req(2, [[snmpInPkts,0]]),
+ [InPkts2] = get_req(3, [[snmpInPkts,0]]),
+ InPkts2 = InPkts + 1,
- ?line [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
+ [InBadVsns] = get_req(4, [[snmpInBadVersions,0]]),
InBadVsns.
%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
std_mib_b(InBadVsns) ->
- ?line [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
- ?line InBadVsns2 = InBadVsns + 1,
- ?line [InPkts] = get_req(2, [[snmpInPkts,0]]),
- ?line [InPkts2] = get_req(3, [[snmpInPkts,0]]),
- ?line InPkts2 = InPkts + 1,
- ?line [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
+ [InBadVsns2] = get_req(1, [[snmpInBadVersions,0]]),
+ InBadVsns2 = InBadVsns + 1,
+ [InPkts] = get_req(2, [[snmpInPkts,0]]),
+ [InPkts2] = get_req(3, [[snmpInPkts,0]]),
+ InPkts2 = InPkts + 1,
+ [InBadCommunityNames, InBadCommunityUses, InASNErrs] =
get_req(4, [[snmpInBadCommunityNames,0],
[snmpInBadCommunityUses,0],
[snmpInASNParseErrs, 0]]),
@@ -5852,25 +5793,25 @@ std_mib_b(InBadVsns) ->
%% Req. SNMP-STANDARD-MIB | SNMPv2-MIB
std_mib_c({InBadCommunityNames, InBadCommunityUses, InASNErrs}) ->
- ?line [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
+ [InBadCommunityNames2, InBadCommunityUses2, InASNErrs2] =
get_req(1, [[snmpInBadCommunityNames,0],
[snmpInBadCommunityUses,0],
[snmpInASNParseErrs, 0]]),
- ?line InBadCommunityNames2 = InBadCommunityNames + 1,
- ?line InBadCommunityUses2 = InBadCommunityUses + 1,
- ?line InASNErrs2 = InASNErrs + 1.
+ InBadCommunityNames2 = InBadCommunityNames + 1,
+ InBadCommunityUses2 = InBadCommunityUses + 1,
+ InASNErrs2 = InASNErrs + 1.
%% Req. SNMPv2-MIB
snmpv2_mib_a() ->
- ?line [SetSerial] = get_req(2, [[snmpSetSerialNo,0]]),
+ [SetSerial] = get_req(2, [[snmpSetSerialNo,0]]),
s([{[snmpSetSerialNo,0], SetSerial}, {[sysLocation, 0], "val2"}]),
- ?line ?expect1([{[snmpSetSerialNo,0], SetSerial},
+ ?expect1([{[snmpSetSerialNo,0], SetSerial},
{[sysLocation, 0], "val2"}]),
s([{[sysLocation, 0], "val3"}, {[snmpSetSerialNo,0], SetSerial}]),
- ?line ?expect3(inconsistentValue, 2,
+ ?expect3(inconsistentValue, 2,
[{[sysLocation, 0], "val3"},
{[snmpSetSerialNo,0], SetSerial}]),
- ?line ["val2"] = get_req(5, [[sysLocation,0]]),
+ ["val2"] = get_req(5, [[sysLocation,0]]),
ok.
@@ -5879,13 +5820,12 @@ snmpv2_mib_a() ->
%% in SNMPv2-MIB and STANDARD-MIB.
%% o Test add/deletion of rows.
%%-----------------------------------------------------------------
-snmp_community_mib(suite) -> [];
snmp_community_mib(Config) when is_list(Config) ->
?P(snmp_community_mib),
init_case(Config),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
+ load_master_std("SNMP-COMMUNITY-MIB"),
try_test(snmp_community_mib_test),
- ?line unload_master("SNMP-COMMUNITY-MIB").
+ unload_master("SNMP-COMMUNITY-MIB").
snmp_community_mib_2(X) -> ?P(snmp_community_mib_2), snmp_community_mib(X).
@@ -5898,17 +5838,15 @@ snmp_community_mib_test() ->
%%-----------------------------------------------------------------
%% o Test engine boots / time
%%-----------------------------------------------------------------
-snmp_framework_mib(suite) -> [];
snmp_framework_mib(Config) when is_list(Config) ->
?P(snmp_framework_mib),
init_case(Config),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
+ load_master_std("SNMP-FRAMEWORK-MIB"),
try_test(snmp_framework_mib_test),
- ?line unload_master("SNMP-FRAMEWORK-MIB").
+ unload_master("SNMP-FRAMEWORK-MIB").
snmp_framework_mib_2(X) -> ?P(snmp_framework_mib_2), snmp_framework_mib(X).
-snmp_framework_mib_3(suite) -> [];
snmp_framework_mib_3(Config) when is_list(Config) ->
?P(snmp_framework_mib_3),
init_case(Config),
@@ -5921,7 +5859,7 @@ snmp_framework_mib_3(Config) when is_list(Config) ->
%% the same as the number of seconds we sleep (5 in this case).
%% But because, on some (slow or/and high loaded) hosts, the actual
%% time we sleep could be a lot larger (due to, for instance, scheduling).
-%% Therefor we must take that into account when we check if the
+%% Therefore we must take that into account when we check if the
%% Engine Time diff (between the two checks) is acceptably.
snmp_framework_mib_test() ->
@@ -5935,13 +5873,13 @@ snmp_framework_mib_test() ->
]),
Sleep = 5,
- ?line ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
+ ["agentEngine"] = get_req(1, [[snmpEngineID,0]]),
T1 = snmp_misc:now(ms),
- ?line [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
+ [EngineTime] = get_req(2, [[snmpEngineTime,0]]),
T2 = snmp_misc:now(ms),
?SLEEP(?SECS(Sleep)),
T3 = snmp_misc:now(ms),
- ?line [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
+ [EngineTime2] = get_req(3, [[snmpEngineTime,0]]),
T4 = snmp_misc:now(ms),
%% Ok, we tried to sleep 5 seconds, but how long did we actually sleep
@@ -5988,18 +5926,18 @@ snmp_framework_mib_test() ->
?EPRINT("snmp_framework_mib -> (High) Engine Time diff (~w) too large: "
"~n ~w < ~w",
[EngineTimeDiff, HighEngineTime, EngineTime2]),
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
+ ?FAIL({too_large_diff, EngineTime, EngineTime2});
(LowEngineTime > EngineTime2) ->
?EPRINT("snmp_framework_mib -> (Low) Engine Time diff (~w) too large: "
"~n ~w > ~w",
[EngineTimeDiff, LowEngineTime, EngineTime2]),
- ?line ?FAIL({too_large_diff, EngineTime, EngineTime2});
+ ?FAIL({too_large_diff, EngineTime, EngineTime2});
true ->
ok
end,
T5 = snmp_misc:now(ms),
- ?line case get_req(4, [[snmpEngineBoots,0]]) of
+ case get_req(4, [[snmpEngineBoots,0]]) of
[Boots] when is_integer(Boots) ->
T6 = snmp_misc:now(ms),
?IPRINT("snmp_framework_mib -> "
@@ -6016,7 +5954,6 @@ snmp_framework_mib_test() ->
%%-----------------------------------------------------------------
%% o Test the counters
%%-----------------------------------------------------------------
-snmp_mpd_mib_3(suite) -> [];
snmp_mpd_mib_3(Config) when is_list(Config) ->
%% <CONDITIONAL-SKIP>
Skippable = [{unix, [darwin]}],
@@ -6033,7 +5970,7 @@ snmp_mpd_mib_3(Config) when is_list(Config) ->
%% Req. SNMP-MPD-MIB
snmp_mpd_mib_a() ->
- ?line [UnknownSecs, InvalidMsgs] =
+ [UnknownSecs, InvalidMsgs] =
get_req(1, [[snmpUnknownSecurityModels,0],
[snmpInvalidMsgs,0]]),
Pdu = #pdu{type = 'get-request',
@@ -6044,7 +5981,7 @@ snmp_mpd_mib_a() ->
SPdu = #scopedPdu{contextEngineID = "agentEngine",
contextName = "",
data = Pdu},
- ?line SPDUBytes = snmp_pdus:enc_scoped_pdu(SPdu),
+ SPDUBytes = snmp_pdus:enc_scoped_pdu(SPdu),
V3Hdr1 = #v3_hdr{msgID = 21,
msgMaxSize = 484,
msgFlags = [7],
@@ -6059,38 +5996,37 @@ snmp_mpd_mib_a() ->
data = SPDUBytes},
Message2 = #message{version = 'version-3', vsn_hdr = V3Hdr2,
data = SPDUBytes},
- ?line MsgBytes1 = snmp_pdus:enc_message_only(Message1),
- ?line MsgBytes2 = snmp_pdus:enc_message_only(Message2),
+ MsgBytes1 = snmp_pdus:enc_message_only(Message1),
+ MsgBytes2 = snmp_pdus:enc_message_only(Message2),
snmp_test_mgr:send_bytes(MsgBytes1),
snmp_test_mgr:send_bytes(MsgBytes2),
- ?line [UnknownSecs2, InvalidMsgs2, UnknownPDUHs] =
+ [UnknownSecs2, InvalidMsgs2, UnknownPDUHs] =
get_req(1, [[snmpUnknownSecurityModels,0],
[snmpInvalidMsgs,0],
[snmpUnknownPDUHandlers, 0]]),
- ?line UnknownSecs2 = UnknownSecs + 1,
- ?line InvalidMsgs2 = InvalidMsgs + 1,
+ UnknownSecs2 = UnknownSecs + 1,
+ InvalidMsgs2 = InvalidMsgs + 1,
UnknownPDUHs.
-define(snmpUnknownPDUHandlers_instance, [1,3,6,1,6,3,11,2,1,3,0]).
snmp_mpd_mib_b() ->
g([[sysUpTime,0]]),
- ?line ?expect2(report, [{?snmpUnknownPDUHandlers_instance, any}]).
+ ?expect2(report, [{?snmpUnknownPDUHandlers_instance, any}]).
snmp_mpd_mib_c(UnknownPDUHs) ->
- ?line [UnknownPDUHs2] = get_req(1, [[snmpUnknownPDUHandlers, 0]]),
- ?line UnknownPDUHs2 = UnknownPDUHs + 1,
+ [UnknownPDUHs2] = get_req(1, [[snmpUnknownPDUHandlers, 0]]),
+ UnknownPDUHs2 = UnknownPDUHs + 1,
ok.
-snmp_target_mib(suite) -> [];
snmp_target_mib(Config) when is_list(Config) ->
?P(snmp_target_mib),
init_case(Config),
- ?line load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
try_test(snmp_target_mib_test),
- ?line unload_master("SNMP-TARGET-MIB").
+ unload_master("SNMP-TARGET-MIB").
snmp_target_mib_2(X) -> ?P(snmp_target_mib_2), snmp_target_mib(X).
@@ -6100,13 +6036,12 @@ snmp_target_mib_test() ->
?NPRINT("NOT YET IMPLEMENTED"),
nyi.
-snmp_notification_mib(suite) -> [];
snmp_notification_mib(Config) when is_list(Config) ->
?P(snmp_notification_mib),
init_case(Config),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
try_test(snmp_notification_mib_test),
- ?line unload_master("SNMP-NOTIFICATION-MIB").
+ unload_master("SNMP-NOTIFICATION-MIB").
snmp_notification_mib_2(X) -> ?P(snmp_notification_mib_2),
snmp_notification_mib(X).
@@ -6123,16 +6058,15 @@ snmp_notification_mib_test() ->
%% o add/delete views and try them
%% o try boundaries
%%-----------------------------------------------------------------
-snmp_view_based_acm_mib(suite) -> [];
snmp_view_based_acm_mib(Config) when is_list(Config) ->
?P(snmp_view_based_acm_mib),
init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master("Test2"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master("Test2"),
snmp_view_based_acm_mib(),
- ?line unload_master("Test2"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
+ unload_master("Test2"),
+ unload_master("SNMP-VIEW-BASED-ACM-MIB").
snmp_view_based_acm_mib_2(X) ->
?P(snmp_view_based_acm_mib_2),
@@ -6167,7 +6101,7 @@ snmp_view_based_acm_mib() ->
v3 -> {?SEC_USM, ?SEC_V1}
end,
?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
+ try_test(use_no_rights, [], Opts),
%% Now, add a mapping from "no-rights" -> "no-rights-group"
GRow1Status = [vacmSecurityToGroupStatus,[SecMod, 9,"no-rights"]],
@@ -6175,25 +6109,25 @@ snmp_view_based_acm_mib() ->
[{[vacmGroupName, [SecMod, 9,"no-rights"]], "no-rights-group"},
{GRow1Status, ?createAndGo}],
?DBG("set '~p'",[GRow1]),
- ?line try_test(do_set, [GRow1]),
+ try_test(do_set, [GRow1]),
?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
+ try_test(use_no_rights, [], Opts),
- %% Create a mapping for another sec model, and make sure it dosn't
+ %% Create a mapping for another sec model, and make sure it doesn't
%% give us access
GRow2Status = [vacmSecurityToGroupStatus,[InvSecMod, 9,"no-rights"]],
GRow2 = [{[vacmGroupName, [InvSecMod, 9, "no-rights"]], "initial"},
{GRow2Status, ?createAndGo}],
?DBG("set '~p'",[GRow2]),
- ?line try_test(do_set, [GRow2]),
+ try_test(do_set, [GRow2]),
?DBG("assign rights for 'no-rights'",[]),
- ?line try_test(use_no_rights, [], Opts),
+ try_test(use_no_rights, [], Opts),
%% Delete that row
- ?line try_test(del_row, [GRow2Status]),
+ try_test(del_row, [GRow2Status]),
RVName = "rv_name",
WVName = "wv_name",
@@ -6206,7 +6140,7 @@ snmp_view_based_acm_mib() ->
{[vacmAccessWriteViewName, ARow1Idx], WVName},
{ARow1Status, ?createAndGo}],
- %% This access row would give acces, if InvSecMod was valid.
+ %% This access row would give access, if InvSecMod was valid.
ARow2Idx = [15 | "no-rights-group"] ++ [0, InvSecMod, 1],
ARow2Status = [vacmAccessStatus, ARow2Idx],
ARow2 = [{[vacmAccessContextMatch, ARow2Idx], 1},
@@ -6214,18 +6148,18 @@ snmp_view_based_acm_mib() ->
{[vacmAccessWriteViewName, ARow2Idx], "internet"},
{ARow2Status, ?createAndGo}],
- ?line try_test(do_set, [ARow2]),
+ try_test(do_set, [ARow2]),
- ?line try_test(use_no_rights, [], Opts),
+ try_test(use_no_rights, [], Opts),
%% Delete that row
- ?line try_test(del_row, [ARow2Status]),
+ try_test(del_row, [ARow2Status]),
%% Add valid row
- ?line try_test(do_set, [ARow1]),
+ try_test(do_set, [ARow1]),
- ?line try_test(use_no_rights, [], Opts),
+ try_test(use_no_rights, [], Opts),
%% Create the view family
VRow1Idx = mk_ln(RVName) ++ mk_ln(?xDescr), % object access
@@ -6237,32 +6171,32 @@ snmp_view_based_acm_mib() ->
VRow3Status = [vacmViewTreeFamilyStatus, VRow3Idx],
VRow4Status = [vacmViewTreeFamilyStatus, VRow4Idx],
- ?line try_test(add_row, [VRow1Status]),
- ?line try_test(add_row, [VRow2Status]),
- ?line try_test(add_row, [VRow3Status]),
+ try_test(add_row, [VRow1Status]),
+ try_test(add_row, [VRow2Status]),
+ try_test(add_row, [VRow3Status]),
%% We're supposed to have access now...
- ?line try_test(use_rights, [], Opts),
+ try_test(use_rights, [], Opts),
%% Change Row3 to Row4
- ?line try_test(del_row, [VRow3Status]),
- ?line try_test(add_row, [VRow4Status]),
+ try_test(del_row, [VRow3Status]),
+ try_test(add_row, [VRow4Status]),
%% We should still have access...
- ?line try_test(use_rights, [], Opts),
+ try_test(use_rights, [], Opts),
%% Delete rows
- ?line try_test(del_row, [GRow1Status]),
+ try_test(del_row, [GRow1Status]),
- ?line try_test(use_no_rights, [], Opts),
+ try_test(use_no_rights, [], Opts),
%% Delete rest of rows
- ?line try_test(del_row, [ARow1Status]),
- ?line try_test(del_row, [VRow1Status]),
- ?line try_test(del_row, [VRow2Status]),
- ?line try_test(del_row, [VRow4Status]),
+ try_test(del_row, [ARow1Status]),
+ try_test(del_row, [VRow1Status]),
+ try_test(del_row, [VRow2Status]),
+ try_test(del_row, [VRow4Status]),
- ?line try_test(use_no_rights, [], Opts),
+ try_test(use_no_rights, [], Opts),
snmpa:verbosity(master_agent,log).
do_set(Row) ->
@@ -6318,7 +6252,6 @@ mk_ln(X) ->
%% o test all combinations of protocols
%% o try bad ops; check counters
%%-----------------------------------------------------------------
-snmp_user_based_sm_mib_3(suite) -> [];
snmp_user_based_sm_mib_3(Config) when is_list(Config) ->
%% <CONDITIONAL-SKIP>
Skippable = [{unix, [darwin]}],
@@ -6330,7 +6263,7 @@ snmp_user_based_sm_mib_3(Config) when is_list(Config) ->
init_case(Config),
_AgentDir = ?config(agent_conf_dir, Config),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
+ load_master_std("SNMP-USER-BASED-SM-MIB"),
%% The newUser used here already has VACM access.
@@ -6339,10 +6272,10 @@ snmp_user_based_sm_mib_3(Config) when is_list(Config) ->
[{sec_level, authPriv}, {user, "privDES"}]),
%% Try to use the new user
- ?line load_master("Test2"),
+ load_master("Test2"),
try_test(v3_sync, [[{usm_use_user, []}]],
[{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
+ unload_master("Test2"),
ShaKey1 = snmp:passwd2localized_key(sha, "new sha password", "agentEngine"),
DesKey1 = lists:sublist(ShaKey1, 16),
@@ -6353,55 +6286,55 @@ snmp_user_based_sm_mib_3(Config) when is_list(Config) ->
%% Try to use the new keys
MgrDir = ?config(mgr_dir, Config),
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
+ rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
+ load_master("Test2"),
try_test(v3_sync, [[{usm_use_user, []}]],
[{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
+ unload_master("Test2"),
ShaKey2 = snmp:passwd2localized_key(sha, "newer password", "agentEngine"),
DesKey2 = lists:sublist(ShaKey2, 16),
%% Change the new user's keys - 2
- ?line try_test(v3_sync,
+ try_test(v3_sync,
[[{usm_key_change2, [ShaKey1, DesKey1, ShaKey2, DesKey2]}]],
[{sec_level, authPriv}, {user, "newUser"}]),
%% Try to use the new keys
reset_usm_mgr(MgrDir),
- ?line rewrite_usm_mgr(MgrDir, ShaKey2, DesKey2),
- ?line load_master("Test2"),
- ?line try_test(v3_sync, [[{usm_use_user, []}]],
+ rewrite_usm_mgr(MgrDir, ShaKey2, DesKey2),
+ load_master("Test2"),
+ try_test(v3_sync, [[{usm_use_user, []}]],
[{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
+ unload_master("Test2"),
reset_usm_mgr(MgrDir),
%% Change the new user's keys - 3
- ?line try_test(v3_sync,
+ try_test(v3_sync,
[[{usm_key_change3, [ShaKey2, DesKey2, ShaKey1, DesKey1]}]],
[{sec_level, authPriv}, {user, "privDES"}]),
%% Try to use the new keys
- ?line rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
- ?line load_master("Test2"),
+ rewrite_usm_mgr(MgrDir, ShaKey1, DesKey1),
+ load_master("Test2"),
try_test(v3_sync, [[{usm_use_user, []}]],
[{sec_level, authPriv}, {user, "newUser"}]),
- ?line unload_master("Test2"),
+ unload_master("Test2"),
reset_usm_mgr(MgrDir),
%% Try some read requests
- ?line try_test(v3_sync, [[{usm_read, []}]],
+ try_test(v3_sync, [[{usm_read, []}]],
[{sec_level, authPriv}, {user, "privDES"}]),
%% Delete the new user
- ?line try_test(v3_sync, [[{usm_del_user, []}]],
+ try_test(v3_sync, [[{usm_del_user, []}]],
[{sec_level, authPriv}, {user, "privDES"}]),
%% Try some bad requests
- ?line try_test(v3_sync, [[{usm_bad, []}]],
+ try_test(v3_sync, [[{usm_bad, []}]],
[{sec_level, authPriv}, {user, "privDES"}]),
- ?line unload_master("SNMP-USER-BASED-SM-MIB").
+ unload_master("SNMP-USER-BASED-SM-MIB").
-define(usmUserSecurityName, [1,3,6,1,6,3,15,1,2,2,1,3]).
@@ -6410,8 +6343,8 @@ usm_add_user1() ->
RowPointer = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer},
{[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line ?expect1(Vbs1),
+ s(Vbs1),
+ ?expect1(Vbs1),
ok.
usm_use_user() ->
@@ -6430,7 +6363,7 @@ usm_key_change1(ShaKey, DesKey) ->
Vbs1 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
{[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
s(Vbs1),
- ?line ?expect1(Vbs1).
+ ?expect1(Vbs1).
%% Change own private keys
usm_key_change2(OldShaKey, OldDesKey, ShaKey, DesKey) ->
@@ -6444,7 +6377,7 @@ usm_key_change2(OldShaKey, OldDesKey, ShaKey, DesKey) ->
Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange},
{[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
s(Vbs1),
- ?line ?expect1(Vbs1).
+ ?expect1(Vbs1).
%% Change other's public keys
usm_key_change3(OldShaKey, OldDesKey, ShaKey, DesKey) ->
@@ -6457,27 +6390,27 @@ usm_key_change3(OldShaKey, OldDesKey, ShaKey, DesKey) ->
DesKey),
Vbs1 = [{[usmUserOwnAuthKeyChange, NewRowIndex], ShaKeyChange}],
s(Vbs1),
- ?line ?expect3(noAccess, 1, any),
+ ?expect3(noAccess, 1, any),
Vbs2 = [{[usmUserOwnPrivKeyChange, NewRowIndex], DesKeyChange}],
s(Vbs2),
- ?line ?expect3(noAccess, 1, any),
+ ?expect3(noAccess, 1, any),
Vbs3 = [{[usmUserAuthKeyChange, NewRowIndex], ShaKeyChange},
{[usmUserPrivKeyChange, NewRowIndex], DesKeyChange}],
s(Vbs3),
- ?line ?expect1(Vbs3),
+ ?expect1(Vbs3),
ok.
usm_read() ->
NewRowIndex = [11,"agentEngine", 7, "newUser"],
- ?line g([[usmUserSecurityName, NewRowIndex],
+ g([[usmUserSecurityName, NewRowIndex],
[usmUserCloneFrom, NewRowIndex],
[usmUserAuthKeyChange, NewRowIndex],
[usmUserOwnAuthKeyChange, NewRowIndex],
[usmUserPrivKeyChange, NewRowIndex],
[usmUserOwnPrivKeyChange, NewRowIndex]]),
- ?line ?expect1([{[usmUserSecurityName, NewRowIndex], "newUser"},
+ ?expect1([{[usmUserSecurityName, NewRowIndex], "newUser"},
{[usmUserCloneFrom, NewRowIndex], [0,0]},
{[usmUserAuthKeyChange, NewRowIndex], ""},
{[usmUserOwnAuthKeyChange, NewRowIndex], ""},
@@ -6490,8 +6423,8 @@ usm_read() ->
usm_del_user() ->
NewRowIndex = [11,"agentEngine", 7, "newUser"],
Vbs1 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs1),
- ?line ?expect1(Vbs1),
+ s(Vbs1),
+ ?expect1(Vbs1),
ok.
-define(usmUserCloneFrom, [1,3,6,1,6,3,15,1,2,2,1,4]).
@@ -6511,32 +6444,32 @@ usm_bad() ->
RowPointer1 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDOS"],
Vbs1 = [{[usmUserCloneFrom, NewRowIndex], RowPointer1},
{[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs1),
- ?line ?expect3(inconsistentName, 1, any),
+ s(Vbs1),
+ ?expect3(inconsistentName, 1, any),
RowPointer2 = ?usmUserCloneFrom ++ [11|"agentEngine"] ++ [7|"privDES"],
Vbs2 = [{[usmUserCloneFrom, NewRowIndex], RowPointer2},
{[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs2),
- ?line ?expect3(wrongValue, 1, any),
+ s(Vbs2),
+ ?expect3(wrongValue, 1, any),
RowPointer3 = ?usmUserSecurityName ++ [11|"agentEngine"] ++ [7|"privDES"],
Vbs3 = [{[usmUserCloneFrom, NewRowIndex], RowPointer3},
{[usmUserStatus, NewRowIndex], ?createAndGo}],
- ?line s(Vbs3),
- ?line ?expect1(Vbs3),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmNoAuthProtocol}]),
- ?line ?expect3(inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmHMACMD5AuthProtocol}]),
- ?line ?expect3(inconsistentValue, 1, any),
- ?line s([{[usmUserAuthProtocol, NewRowIndex], ?usmDESPrivProtocol}]),
- ?line ?expect3(wrongValue, 1, any),
- ?line s([{[usmUserPrivProtocol, NewRowIndex], ?usmHMACSHAAuthProtocol}]),
- ?line ?expect3(wrongValue, 1, any),
+ s(Vbs3),
+ ?expect1(Vbs3),
+ s([{[usmUserAuthProtocol, NewRowIndex], ?usmNoAuthProtocol}]),
+ ?expect3(inconsistentValue, 1, any),
+ s([{[usmUserAuthProtocol, NewRowIndex], ?usmHMACMD5AuthProtocol}]),
+ ?expect3(inconsistentValue, 1, any),
+ s([{[usmUserAuthProtocol, NewRowIndex], ?usmDESPrivProtocol}]),
+ ?expect3(wrongValue, 1, any),
+ s([{[usmUserPrivProtocol, NewRowIndex], ?usmHMACSHAAuthProtocol}]),
+ ?expect3(wrongValue, 1, any),
Vbs4 = [{[usmUserStatus, NewRowIndex], ?destroy}],
- ?line s(Vbs4),
- ?line ?expect1(Vbs4),
+ s(Vbs4),
+ ?expect1(Vbs4),
ok.
@@ -6545,7 +6478,6 @@ usm_bad() ->
%% works.
%% Load all std mibs that are not loaded by default.
%%-----------------------------------------------------------------
-loop_mib_1(suite) -> [];
loop_mib_1(Config) when is_list(Config) ->
?P(loop_mib_1),
?IPRINT("loop_mib_1 -> initiate case"),
@@ -6556,40 +6488,39 @@ loop_mib_1(Config) when is_list(Config) ->
"\tMgrNode: ~p~n"
"\tMibDir: ~p",[_SaNode, _MgrNode, _MibDir]),
?DBG("loop_mib_1 -> load mib SNMP-COMMUNITY-MIB",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
+ load_master_std("SNMP-COMMUNITY-MIB"),
?DBG("loop_mib_1 -> load mib SNMP-MPD-MIB",[]),
- ?line load_master_std("SNMP-MPD-MIB"),
+ load_master_std("SNMP-MPD-MIB"),
?DBG("loop_mib_1 -> load mib SNMP-TARGET-MIB",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
?DBG("loop_mib_1 -> load mib SNMP-NOTIFICATION-MIB",[]),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
?DBG("loop_mib_1 -> load mib SNMP-FRAMEWORK-MIB",[]),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
+ load_master_std("SNMP-FRAMEWORK-MIB"),
?DBG("loop_mib_1 -> load mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
?DBG("loop_mib_1 -> try",[]),
try_test(loop_mib_1_test),
?DBG("loop_mib_1 -> unload mib SNMP-COMMUNITY-MIB",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
+ unload_master("SNMP-COMMUNITY-MIB"),
?DBG("loop_mib_1 -> unload mib SNMP-MPD-MIB",[]),
- ?line unload_master("SNMP-MPD-MIB"),
+ unload_master("SNMP-MPD-MIB"),
?DBG("loop_mib_1 -> unload mib SNMP-TARGET-MIB",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
+ unload_master("SNMP-TARGET-MIB"),
?DBG("loop_mib_1 -> unload mib SNMP-NOTIFICATION-MIB",[]),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
+ unload_master("SNMP-NOTIFICATION-MIB"),
?DBG("loop_mib_1 -> unload mib SNMP-FRAMEWORK-MIB",[]),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
+ unload_master("SNMP-FRAMEWORK-MIB"),
?DBG("loop_mib_1 -> unload mib SNMP-VIEW-BASED-ACM-MIB",[]),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
+ unload_master("SNMP-VIEW-BASED-ACM-MIB"),
%% snmpa:verbosity(master_agent,log),
%% snmpa:verbosity(mib_server,silence),
?IPRINT("loop_mib_1 -> done"),
ok.
-loop_mib_2(suite) -> [];
loop_mib_2(Config) when is_list(Config) ->
?P(loop_mib_2),
?IPRINT("loop_mib_2 -> initiate case"),
@@ -6599,27 +6530,26 @@ loop_mib_2(Config) when is_list(Config) ->
"\tMgrNode: ~p~n"
"\tMibDir: ~p", [_SaNode, _MgrNode, _MibDir]),
?DBG("loop_mib_2 -> load mibs",[]),
- ?line load_master_std("SNMP-COMMUNITY-MIB"),
- ?line load_master_std("SNMP-MPD-MIB"),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-FRAMEWORK-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master_std("SNMP-COMMUNITY-MIB"),
+ load_master_std("SNMP-MPD-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-FRAMEWORK-MIB"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
try_test(loop_mib_2_test),
?DBG("loop_mib_2 -> unload mibs",[]),
- ?line unload_master("SNMP-COMMUNITY-MIB"),
- ?line unload_master("SNMP-MPD-MIB"),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-FRAMEWORK-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
+ unload_master("SNMP-COMMUNITY-MIB"),
+ unload_master("SNMP-MPD-MIB"),
+ unload_master("SNMP-TARGET-MIB"),
+ unload_master("SNMP-NOTIFICATION-MIB"),
+ unload_master("SNMP-FRAMEWORK-MIB"),
+ unload_master("SNMP-VIEW-BASED-ACM-MIB"),
?IPRINT("loop_mib_2 -> done"),
ok.
-loop_mib_3(suite) -> [];
loop_mib_3(Config) when is_list(Config) ->
?P(loop_mib_3),
?IPRINT("loop_mib_3 -> initiate case"),
@@ -6629,18 +6559,18 @@ loop_mib_3(Config) when is_list(Config) ->
"\tMgrNode: ~p~n"
"\tMibDir: ~p", [_SaNode, _MgrNode, _MibDir]),
?DBG("loop_mib_3 -> load mibs",[]),
- ?line load_master_std("SNMP-TARGET-MIB"),
- ?line load_master_std("SNMP-NOTIFICATION-MIB"),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
- ?line load_master_std("SNMP-USER-BASED-SM-MIB"),
+ load_master_std("SNMP-TARGET-MIB"),
+ load_master_std("SNMP-NOTIFICATION-MIB"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master_std("SNMP-USER-BASED-SM-MIB"),
try_test(loop_mib_3_test),
?DBG("loop_mib_3 -> unload mibs",[]),
- ?line unload_master("SNMP-TARGET-MIB"),
- ?line unload_master("SNMP-NOTIFICATION-MIB"),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB"),
- ?line unload_master("SNMP-USER-BASED-SM-MIB"),
+ unload_master("SNMP-TARGET-MIB"),
+ unload_master("SNMP-NOTIFICATION-MIB"),
+ unload_master("SNMP-VIEW-BASED-ACM-MIB"),
+ unload_master("SNMP-USER-BASED-SM-MIB"),
?IPRINT("loop_mib_3 -> done"),
ok.
@@ -6649,8 +6579,8 @@ loop_mib_3(Config) when is_list(Config) ->
loop_mib_1_test() ->
?IPRINT("loop_mib_1_test -> entry"),
N = loop_it_1([1,1], 0),
- ?IPRINT("found ~w varibles", [N]),
- ?line N = if N < 100 -> 100;
+ ?IPRINT("found ~w variables", [N]),
+ N = if N < 100 -> 100;
true -> N
end.
@@ -6668,7 +6598,7 @@ loop_it_1(Oid, N) ->
"expected intermediate (get-next) result: "
"~n NOid: ~p"
"~n Value: ~p", [NOid, _Value]),
- ?line [_Value2] = get_req(1, [NOid]), % must not be same
+ [_Value2] = get_req(1, [NOid]), % must not be same
?IPRINT("loop_it_1_test -> expected intermediate (get) result: "
"~n Value2: ~p", [_Value2]),
loop_it_1(NOid, N+1);
@@ -6679,7 +6609,7 @@ loop_it_1(Oid, N) ->
varbinds = Vbs} ->
?EPRINT("loop_it_1_test -> unexpected (get-response) vbs: "
"~n Vbs: ~p", [Vbs]),
- ?line ?FAIL({unexpected_vbs,
+ ?FAIL({unexpected_vbs,
[{get_next_oid, Oid},
{counter, N},
{varbinds, Vbs}]});
@@ -6699,7 +6629,7 @@ loop_it_1(Oid, N) ->
"~n Err: ~p"
"~n Idx: ~p"
"~n Vbs: ~p", [Err, Idx, Vbs]),
- ?line ?FAIL({unexpected_pdu,
+ ?FAIL({unexpected_pdu,
[{get_next_oid, Oid},
{counter, N},
{error_status, Err},
@@ -6715,7 +6645,7 @@ loop_it_1(Oid, N) ->
"~n Err: ~p"
"~n Idx: ~p"
"~n Vbs: ~p", [Type, Err, Idx, Vbs]),
- ?line ?FAIL({unexpected_pdu,
+ ?FAIL({unexpected_pdu,
[{get_next_oid, Oid},
{counter, N},
{type, Type},
@@ -6735,7 +6665,7 @@ loop_it_1(Oid, N) ->
(SysEvs =:= []) ->
?EPRINT("loop_it_1_test -> error: "
"~n ~p", [Reason]),
- ?line ?FAIL([{get_next_oid, Oid},
+ ?FAIL([{get_next_oid, Oid},
{counter, N},
{reason, Reason}]);
@@ -6754,8 +6684,8 @@ loop_it_1(Oid, N) ->
loop_mib_2_test() ->
?IPRINT("loop_mib_2_test -> entry"),
N = loop_it_2([1,1], 0),
- ?IPRINT("found ~w varibles", [N]),
- ?line N = if N < 100 -> 100;
+ ?IPRINT("found ~w variables", [N]),
+ N = if N < 100 -> 100;
true -> N
end.
@@ -6781,7 +6711,7 @@ loop_it_2(Oid, N) ->
"expected intermediate (get-next) result: "
"~n NOid: ~p"
"~n Value: ~p", [NOid, _Value]),
- ?line [_Value2] = get_req(1, [NOid]), % must not be same
+ [_Value2] = get_req(1, [NOid]), % must not be same
?IPRINT("loop_it_2 -> expected intermediate (get) result: "
"~n Value2: ~p", [_Value2]),
loop_it_2(NOid, N+1);
@@ -6792,7 +6722,7 @@ loop_it_2(Oid, N) ->
varbinds = Vbs} ->
?EPRINT("loop_it_2 -> unexpected (get-response) vbs: "
"~n Vbs: ~p", [Vbs]),
- ?line ?FAIL({unexpected_vbs,
+ ?FAIL({unexpected_vbs,
[{get_next_oid, Oid},
{counter, N},
{varbinds, Vbs}]});
@@ -6805,7 +6735,7 @@ loop_it_2(Oid, N) ->
"~n ES: ~p"
"~n EI: ~p"
"~n Vbs: ~p", [ES, EI, Vbs]),
- ?line ?FAIL({unexpected_pdu,
+ ?FAIL({unexpected_pdu,
[{get_next_oid, Oid},
{counter, N},
{error_status, ES},
@@ -6821,7 +6751,7 @@ loop_it_2(Oid, N) ->
"~n ES: ~p"
"~n EI: ~p"
"~n Vbs: ~p", [Type, ES, EI, Vbs]),
- ?line ?FAIL({unexpected_pdu,
+ ?FAIL({unexpected_pdu,
[{get_next_oid, Oid},
{counter, N},
{type, Type},
@@ -6841,7 +6771,7 @@ loop_it_2(Oid, N) ->
(SysEvs =:= []) ->
?EPRINT("loop_it_2 -> error: "
"~n ~p", [Reason]),
- ?line ?FAIL([{get_next_oid, Oid},
+ ?FAIL([{get_next_oid, Oid},
{counter, N},
{reason, Reason}]);
@@ -6922,15 +6852,14 @@ reported_bugs3_cases() ->
%% Ticket: OTP-1128
%% Slogan: Bug in handling of createAndWait set-requests.
%%-----------------------------------------------------------------
-otp_1128(suite) -> [];
otp_1128(Config) when is_list(Config) ->
?P(otp_1128),
init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
try_test(otp_1128_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
+ unload_master("OLD-SNMPEA-MIB"),
ok.
otp_1128_2(X) -> ?P(otp_1128_2), otp_1128(X).
@@ -6945,15 +6874,15 @@ otp_1128_test() ->
NewKeyc5 = [intCommunityStatus,get(mip),is("test")],
s([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
- ?line ?expect1([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
+ ?expect1([{NewKeyc5, ?createAndWait}, {NewKeyc4, 2}]),
g([NewKeyc5]),
- ?line ?expect1([{NewKeyc5, ?notReady}]),
+ ?expect1([{NewKeyc5, ?notReady}]),
s([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
- ?line ?expect1([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
+ ?expect1([{NewKeyc5, ?active}, {NewKeyc3, 2}]),
g([NewKeyc5]),
- ?line ?expect1([{NewKeyc5, ?active}]),
+ ?expect1([{NewKeyc5, ?active}]),
s([{NewKeyc5, ?destroy}]),
- ?line ?expect1([{NewKeyc5, ?destroy}]),
+ ?expect1([{NewKeyc5, ?destroy}]),
ok.
@@ -6961,13 +6890,12 @@ otp_1128_test() ->
%% Ticket: OTP-1129, OTP-1169
%% Slogan: snmpa:int_to_enum crashes on bad oids
%%-----------------------------------------------------------------
-otp_1129(suite) -> [];
otp_1129(Config) when is_list(Config) ->
?P(otp_1129),
init_case(Config),
- ?line load_master("Klas3"),
+ load_master("Klas3"),
try_test(otp_1129_i, [node()]),
- ?line unload_master("Klas3"),
+ unload_master("Klas3"),
ok.
otp_1129_2(X) -> ?P(otp_1129_2), otp_1129(X).
@@ -6986,14 +6914,13 @@ otp_1129_i(MaNode) ->
%% setrequest is of bad type, e.g. an INDEX {INTEGER},
%% and RowIdenx [3,2].
%%-----------------------------------------------------------------
-otp_1131(suite) -> [];
otp_1131(Config) when is_list(Config) ->
?P(otp_1131),
init_case(Config),
- ?line load_master("Klas1"),
+ load_master("Klas1"),
try_test(otp_1131_test),
- ?line unload_master("Klas1").
+ unload_master("Klas1").
otp_1131_2(X) -> ?P(otp_1131_2), otp_1131(X).
@@ -7046,7 +6973,7 @@ otp_1131_test() ->
io:format("Testing bug reported in ticket OTP-1131...~n"),
s([{[friendsEntry, [2, 3, 1]], s, "kompis3"},
{[friendsEntry, [3, 3, 1]], i, ?createAndGo}]),
- ?line ?expect3(?v1_2(noSuchName, noCreation), 2, any),
+ ?expect3(?v1_2(noSuchName, noCreation), 2, any),
ok.
@@ -7054,11 +6981,10 @@ otp_1131_test() ->
%% Ticket: OTP-1162
%% Slogan: snmp_agent can't handle wrongValue from instrum.func
%%-----------------------------------------------------------------
-otp_1162(suite) -> [];
otp_1162(Config) when is_list(Config) ->
?P(otp_1162),
{SaNode, _MgrNode, _MibDir} = init_case(Config),
- ?line {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
+ {ok, SA} = start_subagent(SaNode, ?sa, "SA-MIB"),
try_test(otp_1162_test),
stop_subagent(SA).
@@ -7068,7 +6994,7 @@ otp_1162_3(X) -> ?P(otp_1162_3), otp_1162(X).
otp_1162_test() ->
s([{[sa, [2,0]], 6}]), % wrongValue (i is_set_ok)
- ?line ?expect3(?v1_2(badValue, wrongValue), 1, any),
+ ?expect3(?v1_2(badValue, wrongValue), 1, any),
ok.
@@ -7076,15 +7002,14 @@ otp_1162_test() ->
%% Ticket: OTP-1222
%% Slogan: snmp agent crash if faulty index is returned from instrum
%%-----------------------------------------------------------------
-otp_1222(suite) -> [];
otp_1222(Config) when is_list(Config) ->
?P(otp_1222),
init_case(Config),
- ?line load_master("Klas3"),
- ?line load_master("Klas4"),
+ load_master("Klas3"),
+ load_master("Klas4"),
try_test(otp_1222_test),
- ?line unload_master("Klas3"),
- ?line unload_master("Klas4"),
+ unload_master("Klas3"),
+ unload_master("Klas4"),
ok.
otp_1222_2(X) -> ?P(otp_1222_2), otp_1222(X).
@@ -7094,9 +7019,9 @@ otp_1222_3(X) -> ?P(otp_1222_3), otp_1222(X).
otp_1222_test() ->
io:format("Testing bug reported in ticket OTP-1222...~n"),
s([{[fStatus4,1], 4}, {[fName4,1], 1}]),
- ?line ?expect3(genErr, 0, any),
+ ?expect3(genErr, 0, any),
s([{[fStatus4,2], 4}, {[fName4,2], 1}]),
- ?line ?expect3(genErr, 0, any),
+ ?expect3(genErr, 0, any),
ok.
@@ -7104,14 +7029,13 @@ otp_1222_test() ->
%% Ticket: OTP-1298
%% Slogan: Negative INTEGER values are treated as positive.
%%-----------------------------------------------------------------
-otp_1298(suite) -> [];
otp_1298(Config) when is_list(Config) ->
?P(otp_1298),
init_case(Config),
- ?line load_master("Klas2"),
+ load_master("Klas2"),
try_test(otp_1298_test),
- ?line unload_master("Klas2"),
+ unload_master("Klas2"),
ok.
otp_1298_2(X) -> ?P(otp_1298_2), otp_1298(X).
@@ -7121,7 +7045,7 @@ otp_1298_3(X) -> ?P(otp_1298_3), otp_1298(X).
otp_1298_test() ->
io:format("Testing bug reported in ticket OTP-1298...~n"),
s([{[fint,0], -1}]),
- ?line ?expect1([{[fint,0], -1}]),
+ ?expect1([{[fint,0], -1}]),
ok.
@@ -7129,14 +7053,13 @@ otp_1298_test() ->
%% Ticket: OTP-1331
%% Slogan: snmp_generic should return noError when deleting non-ex row
%%-----------------------------------------------------------------
-otp_1331(suite) -> [];
otp_1331(Config) when is_list(Config) ->
?P(otp_1331),
init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
try_test(otp_1331_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
+ unload_master("OLD-SNMPEA-MIB"),
ok.
otp_1331_2(X) -> ?P(otp_1331_2), otp_1331(X).
@@ -7146,7 +7069,7 @@ otp_1331_3(X) -> ?P(otp_1331_3), otp_1331(X).
otp_1331_test() ->
NewKeyc5 = [intCommunityStatus,[127,32,0,0],is("test")],
s([{NewKeyc5, ?destroy}]),
- ?line ?expect1([{NewKeyc5, ?destroy}]),
+ ?expect1([{NewKeyc5, ?destroy}]),
ok.
@@ -7154,14 +7077,13 @@ otp_1331_test() ->
%% Ticket: OTP-1338
%% Slogan: snmp bug in initialisation of default values for mnesia tabs
%%-----------------------------------------------------------------
-otp_1338(suite) -> [];
otp_1338(Config) when is_list(Config) ->
?P(otp_1338),
init_case(Config),
- ?line load_master("Klas2"),
+ load_master("Klas2"),
try_test(otp_1338_test),
- ?line unload_master("Klas2").
+ unload_master("Klas2").
otp_1338_2(X) -> ?P(otp_1338_2), otp_1338(X).
@@ -7169,9 +7091,9 @@ otp_1338_3(X) -> ?P(otp_1338_3), otp_1338(X).
otp_1338_test() ->
s([{[kStatus2, 7], i, ?createAndGo}]),
- ?line ?expect1([{[kStatus2, 7], ?createAndGo}]),
+ ?expect1([{[kStatus2, 7], ?createAndGo}]),
g([[kName2, 7]]),
- ?line ?expect1([{[kName2, 7], "JJJ"}]).
+ ?expect1([{[kName2, 7], "JJJ"}]).
%%-----------------------------------------------------------------
@@ -7179,13 +7101,12 @@ otp_1338_test() ->
%% Slogan: default impl of snmp table can't handle bad index access,
%% Set when INDEX is read-write gets into an infinite loop!
%%-----------------------------------------------------------------
-otp_1342(suite) -> [];
otp_1342(Config) when is_list(Config) ->
?P(otp_1342),
init_case(Config),
- ?line load_master("Klas4"),
+ load_master("Klas4"),
try_test(otp_1342_test),
- ?line unload_master("Klas4"),
+ unload_master("Klas4"),
ok.
otp_1342_2(X) -> ?P(otp_1342_2), otp_1342(X).
@@ -7196,7 +7117,7 @@ otp_1342_test() ->
s([{[fIndex5, 1], i, 1},
{[fName5, 1], i, 3},
{[fStatus5, 1], i, ?createAndGo}]),
- ?line ?expect3(?v1_2(noSuchName, noCreation), 3, any),
+ ?expect3(?v1_2(noSuchName, noCreation), 3, any),
ok.
@@ -7206,14 +7127,13 @@ otp_1342_test() ->
%% Note: NYI! We need a way to tell the test server that we need
%% mgrs on two different machines.
%%-----------------------------------------------------------------
-otp_1366(suite) -> [];
otp_1366(Config) when is_list(Config) ->
?P(otp_1366),
init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
try_test(otp_1366_test),
- ?line unload_master("OLD-SNMPEA-MIB"),
+ unload_master("OLD-SNMPEA-MIB"),
ok.
otp_1366_2(X) -> ?P(otp_1366_2), otp_1366(X).
@@ -7229,7 +7149,6 @@ otp_1366_test() ->
%% Ticket: OTP-2776
%% Slogan: snmp:validate_date_and_time() fails when time is 00:00
%%-----------------------------------------------------------------
-otp_2776(suite) -> [];
otp_2776(Config) when is_list(Config) ->
?P(otp_2776),
init_case(Config),
@@ -7265,7 +7184,7 @@ otp_2776_test() ->
{10, false, Dt10_invalid},
{11, false, Dt11_invalid}],
- ?line ok = validate_dat(L).
+ ok = validate_dat(L).
validate_dat(L) -> validate_dat(L,[]).
@@ -7296,14 +7215,13 @@ validate_dat2(Id, E, Dat) ->
%% Slogan: get-next on more than 1 column in an empty table
%% returns bad response.
%%-----------------------------------------------------------------
-otp_2979(suite) -> [];
otp_2979(Config) when is_list(Config) ->
?P(otp_2979),
init_case(Config),
- ?line load_master("Test1"),
- ?line init_old(),
+ load_master("Test1"),
+ init_old(),
try_test(otp_2979_test),
- ?line unload_master("Test1").
+ unload_master("Test1").
otp_2979_2(X) -> ?P(otp_2979_2), otp_2979(X).
@@ -7311,33 +7229,32 @@ otp_2979_3(X) -> ?P(otp_2979_3), otp_2979(X).
otp_2979_test() ->
gn([[sparseDescr], [sparseStatus]]),
- ?line ?expect1([{[sparseStr,0], "slut"},
+ ?expect1([{[sparseStr,0], "slut"},
{[sparseStr,0], "slut"}]),
ok.
%%-----------------------------------------------------------------
%% Ticket: OTP-3187
-%% Slogan: get-next on vacmAccessTable for colums > 5 returns
+%% Slogan: get-next on vacmAccessTable for columns > 5 returns
%% endOfTable - should return value.
%%-----------------------------------------------------------------
-otp_3187(suite) -> [];
otp_3187(Config) when is_list(Config) ->
?P(otp_3187),
init_case(Config),
- ?line load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
+ load_master_std("SNMP-VIEW-BASED-ACM-MIB"),
otp_3187_test(),
- ?line unload_master("SNMP-VIEW-BASED-ACM-MIB").
+ unload_master("SNMP-VIEW-BASED-ACM-MIB").
otp_3187_2(X) -> ?P(otp_3187_2), otp_3187(X).
otp_3187_3(X) -> ?P(otp_3187_3), otp_3187(X).
otp_3187_test() ->
- ?line Elements =
+ Elements =
snmp_view_based_acm_mib:vacmAccessTable(get_next,[],[4,5,6]),
lists:foreach(fun(E) ->
- ?line if E == endOfTable ->
+ if E == endOfTable ->
?FAIL(endOfTable);
true -> ok
end
@@ -7347,7 +7264,6 @@ otp_3187_test() ->
%% Ticket: OTP-3542
%% Slogan:
%%-----------------------------------------------------------------
-otp_3542(suite) -> [];
otp_3542(Config) when is_list(Config) ->
?P(otp_3542),
init_case(Config),
@@ -7355,7 +7271,7 @@ otp_3542(Config) when is_list(Config) ->
otp_3542_test() ->
io:format("SNMP v3 discovery...~n"),
- ?line Res = snmp_test_mgr:d(),
+ Res = snmp_test_mgr:d(),
io:format("SNMP v3 discovery result: ~p~n",[Res]).
@@ -7363,57 +7279,56 @@ otp_3542_test() ->
%% Ticket: OTP-3725
%% Slogan: Slow response time on snmpa:int_to_enum
%%-----------------------------------------------------------------
-otp_3725(suite) -> [];
otp_3725(Config) when is_list(Config) ->
?P(otp_3725),
init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
try_test(otp_3725_test, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
+ unload_master("OLD-SNMPEA-MIB").
%% Req. OLD-SNMPEA-MIB
otp_3725_test(MaNode) ->
io:format("Testing feature requested in ticket OTP-3725...~n"),
- ?line rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
- ?line Db = rpc:call(MaNode, snmpa, get_symbolic_store_db, []),
+ rpc:call(MaNode,snmpa,verbosity,[symbolic_store,trace]),
+ Db = rpc:call(MaNode, snmpa, get_symbolic_store_db, []),
?DBG("otp_3725_test -> Db = ~p", [Db]),
- ?line {value, OID} = rpc:call(MaNode, snmpa, name_to_oid,
+ {value, OID} = rpc:call(MaNode, snmpa, name_to_oid,
[Db, intAgentIpAddress]),
?DBG("otp_3725_test -> name_to_oid for ~p: ~p", [intAgentIpAddress,OID]),
- ?line {value, intAgentIpAddress} = rpc:call(MaNode, snmpa, oid_to_name,
+ {value, intAgentIpAddress} = rpc:call(MaNode, snmpa, oid_to_name,
[Db,OID]),
?DBG("otp_3725_test -> oid_to_name for ~p: ~p", [OID, intAgentIpAddress]),
- ?line false = rpc:call(MaNode, snmpa, name_to_oid, [Db, intAgentIpAddres]),
- ?line false = rpc:call(MaNode, snmpa, oid_to_name,
+ false = rpc:call(MaNode, snmpa, name_to_oid, [Db, intAgentIpAddres]),
+ false = rpc:call(MaNode, snmpa, oid_to_name,
[Db, [1,5,32,3,54,3,3,34,4]]),
- ?line {value, 2} = rpc:call(MaNode, snmpa, enum_to_int,
+ {value, 2} = rpc:call(MaNode, snmpa, enum_to_int,
[Db, intViewType, excluded]),
- ?line {value, excluded} = rpc:call(MaNode, snmpa, int_to_enum,
+ {value, excluded} = rpc:call(MaNode, snmpa, int_to_enum,
[Db, intViewType, 2]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int,
+ false = rpc:call(MaNode, snmpa, enum_to_int,
[Db, intViewType, exclude]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int,
+ false = rpc:call(MaNode, snmpa, enum_to_int,
[Db, intAgentIpAddress, exclude]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int,
+ false = rpc:call(MaNode, snmpa, enum_to_int,
[Db, intAgentIpAddre, exclude]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, [Db, intViewType, 3]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum,
+ false = rpc:call(MaNode, snmpa, int_to_enum, [Db, intViewType, 3]),
+ false = rpc:call(MaNode, snmpa, int_to_enum,
[Db, intAgentIpAddress, 2]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum,
+ false = rpc:call(MaNode, snmpa, int_to_enum,
[Db, intAgentIpAddre, 2]),
- ?line {value, active} = rpc:call(MaNode, snmpa, int_to_enum,
+ {value, active} = rpc:call(MaNode, snmpa, int_to_enum,
[Db, 'RowStatus', ?active]),
- ?line {value, ?destroy} = rpc:call(MaNode, snmpa, enum_to_int,
+ {value, ?destroy} = rpc:call(MaNode, snmpa, enum_to_int,
[Db, 'RowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int,
+ false = rpc:call(MaNode, snmpa, enum_to_int,
[Db, 'RowStatus', xxxdestroy]),
- ?line false = rpc:call(MaNode, snmpa, enum_to_int,
+ false = rpc:call(MaNode, snmpa, enum_to_int,
[Db, 'xxRowStatus', destroy]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, [Db, 'RowStatus', 25]),
- ?line false = rpc:call(MaNode, snmpa, int_to_enum, [Db, 'xxRowStatus', 1]),
+ false = rpc:call(MaNode, snmpa, int_to_enum, [Db, 'RowStatus', 25]),
+ false = rpc:call(MaNode, snmpa, int_to_enum, [Db, 'xxRowStatus', 1]),
ok.
@@ -7425,10 +7340,10 @@ otp_3725_test(MaNode) ->
otp_4394_init(Config) when is_list(Config) ->
?DBG("otp_4394_init -> entry with"
"~n Config: ~p", [Config]),
- ?line AgentConfDir = ?config(agent_conf_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line otp_4394_config(AgentConfDir, MgrDir, Ip),
+ AgentConfDir = ?config(agent_conf_dir, Config),
+ MgrDir = ?config(mgr_dir, Config),
+ Ip = ?config(ip, Config),
+ otp_4394_config(AgentConfDir, MgrDir, Ip),
MasterAgentVerbosity = {master_agent_verbosity, trace},
NetIfVerbosity = {net_if_verbosity, trace},
Opts = [MasterAgentVerbosity, NetIfVerbosity],
@@ -7441,21 +7356,21 @@ otp_4394_config(AgentConfDir, MgrDir, Ip0) ->
"~n Ip0: ~p", [AgentConfDir, MgrDir, Ip0]),
Vsn = [v1],
Ip = tuple_to_list(Ip0),
- ?line snmp_config:write_agent_snmp_files(AgentConfDir, Vsn, Ip,
+ snmp_config:write_agent_snmp_files(AgentConfDir, Vsn, Ip,
?TRAP_UDP, Ip, 4000,
"OTP-4394 test"),
- ?line case update_usm(Vsn, AgentConfDir) of
+ case update_usm(Vsn, AgentConfDir) of
true ->
- ?line copy_file(join(AgentConfDir, "usm.conf"),
+ copy_file(join(AgentConfDir, "usm.conf"),
join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsn, MgrDir);
+ update_usm_mgr(Vsn, MgrDir);
false ->
- ?line ok
+ ok
end,
C1 = {"a", "all-rights", "initial", "", "pc"},
C2 = {"c", "secret", "secret_name", "", "secret_tag"},
- ?line write_community_conf(AgentConfDir, [C1, C2]),
- ?line update_vacm(Vsn, AgentConfDir),
+ write_community_conf(AgentConfDir, [C1, C2]),
+ update_vacm(Vsn, AgentConfDir),
Ta1 = {"shelob v1",
[134,138,177,177], 5000, 1500, 3, %% Use Ip and modify
"pc1",
@@ -7469,9 +7384,9 @@ otp_4394_config(AgentConfDir, MgrDir, Ip0) ->
"target_v1", "",
%% [255,255,255,255,0,0],
[], 2048},
- ?line write_target_addr_conf(AgentConfDir, [Ta1, Ta2]),
- ?line write_target_params_conf(AgentConfDir, Vsn),
- ?line write_notify_conf(AgentConfDir),
+ write_target_addr_conf(AgentConfDir, [Ta1, Ta2]),
+ write_target_params_conf(AgentConfDir, Vsn),
+ write_notify_conf(AgentConfDir),
ok.
otp_4394_finish(Config) when is_list(Config) ->
@@ -7481,7 +7396,6 @@ otp_4394_finish(Config) when is_list(Config) ->
erase(mgr_node),
lists:keydelete(vsn, 1, C1).
-otp_4394(suite) -> [];
otp_4394(Config) ->
?P(otp_4394),
?DBG("otp_4394 -> entry", []),
@@ -7519,10 +7433,10 @@ otp_7157_init(Config) when is_list(Config) ->
?DBG("init_otp_7157 -> entry with"
"~n Config: ~p", [Config]),
- ?line AgentConfDir = ?config(agent_conf_dir, Config),
- ?line MgrDir = ?config(mgr_dir, Config),
- ?line Ip = ?config(ip, Config),
- ?line config([v2], MgrDir, AgentConfDir,
+ AgentConfDir = ?config(agent_conf_dir, Config),
+ MgrDir = ?config(mgr_dir, Config),
+ Ip = ?config(ip, Config),
+ config([v2], MgrDir, AgentConfDir,
tuple_to_list(Ip), tuple_to_list(Ip)),
MasterAgentVerbosity = {master_agent_verbosity, trace},
NetIfVerbosity = {net_if_verbosity, trace},
@@ -7537,15 +7451,14 @@ otp_7157_finish(Config) when is_list(Config) ->
erase(mgr_node),
lists:keydelete(vsn, 1, C1).
-otp_7157(suite) -> [];
otp_7157(Config) ->
?P(otp_7157),
?DBG("otp_7157 -> entry", []),
init_case(Config),
MA = whereis(snmp_master_agent),
- ?line load_master("Test1"),
+ load_master("Test1"),
try_test(otp_7157_test, [MA]),
- ?line unload_master("Test1"),
+ unload_master("Test1"),
?DBG("otp_7157 -> done", []),
ok.
@@ -7562,7 +7475,7 @@ otp_7157_test(MA) ->
?DBG("await response",[]),
%% We don't really care about the values, just the vb order.
- ?line ok = ?expect2(v2trap, [{[sysUpTime, 0], any},
+ ok = ?expect2(v2trap, [{[sysUpTime, 0], any},
{[snmpTrapOID, 0], any},
{[sysContact, 0], any},
{[cnt64, 0], any},
@@ -7588,7 +7501,6 @@ otp16092_cases() ->
otp_16092_simple_start_and_stop4 % invalid content
].
-otp_16092_simple_start_and_stop1(suite) -> [];
otp_16092_simple_start_and_stop1(Config) ->
?P(otp_16092_simple_start_and_stop1),
?DBG("otp_16092_simple_start_and_stop1 -> entry", []),
@@ -7605,7 +7517,6 @@ otp_16092_simple_start_and_stop1(Config) ->
Result.
-otp_16092_simple_start_and_stop2(suite) -> [];
otp_16092_simple_start_and_stop2(Config) ->
?P(otp_16092_simple_start_and_stop2),
?DBG("otp_16092_simple_start_and_stop2 -> entry", []),
@@ -7622,7 +7533,6 @@ otp_16092_simple_start_and_stop2(Config) ->
Result.
-otp_16092_simple_start_and_stop3(suite) -> [];
otp_16092_simple_start_and_stop3(Config) ->
?P(otp_16092_simple_start_and_stop3),
?DBG("otp_16092_simple_start_and_stop3 -> entry", []),
@@ -7641,7 +7551,6 @@ otp_16092_simple_start_and_stop3(Config) ->
Result.
-otp_16092_simple_start_and_stop4(suite) -> [];
otp_16092_simple_start_and_stop4(Config) ->
?P(otp_16092_simple_start_and_stop4),
?DBG("otp_16092_simple_start_and_stop4 -> entry", []),
@@ -7670,11 +7579,11 @@ otp_16092_try(TC) ->
end.
otp_16092_simple_start_and_stop(Config, ESO, Expected) ->
- ?line ConfDir = ?config(agent_conf_dir, Config),
- ?line DbDir = ?config(agent_db_dir, Config),
+ ConfDir = ?config(agent_conf_dir, Config),
+ DbDir = ?config(agent_db_dir, Config),
?NPRINT("try start agent node"),
- {ok, Node} = ?ALIB:start_node(agent_16092),
+ {ok, Peer, Node} = ?START_PEER("-agent"),
Vsns = [v1],
IP = tuple_to_list(?config(ip, Config)),
@@ -7706,7 +7615,7 @@ otp_16092_simple_start_and_stop(Config, ESO, Expected) ->
otp16092_try_start_and_stop_agent(Node, Opts, Expected),
?NPRINT("try stop agent node ~p", [Node]),
- ?ALIB:stop_node(Node),
+ peer:stop(Peer),
?SLEEP(1000),
@@ -7794,9 +7703,8 @@ otp8395({init, Config}) when is_list(Config) ->
%% --
%% Start nodes
%%
- FName = ?FUNCTION_NAME,
- {ok, AgentNode} = start_node(mk_node_name(FName, agent)),
- {ok, ManagerNode} = start_node(mk_node_name(FName, manager)),
+ {ok, AgentPeer, AgentNode} = ?START_PEER("-agent"),
+ {ok, ManagerPeer, ManagerNode} = ?START_PEER("-manager"),
%% --
%% Mnesia init
@@ -7846,12 +7754,14 @@ otp8395({init, Config}) when is_list(Config) ->
Config2 = start_agent([{host, Host},
{ip, Ip},
{ipfamily, IpFamily},
+ {agent_peer, AgentPeer},
{agent_node, AgentNode},
{agent_host, AgentHost},
{agent_ip, AgentIP},
%% {sub_agent_node, SubAgentNode},
%% {sub_agent_host, SubAgentHost},
- %% {sub_agent_ip, SubAgentIP},
+ %% {sub_agent_ip, SubAgentIP},
+ {manager_peer, ManagerPeer},
{manager_node, ManagerNode},
{manager_host, ManagerHost},
{manager_ip, ManagerIP}|Config]),
@@ -7867,7 +7777,6 @@ otp8395({fin, Config}) when is_list(Config) ->
"~n Config: ~p", [Config]),
AgentNode = ?config(agent_node, Config),
- ManagerNode = ?config(manager_node, Config),
%% -
%% Stop agent (this is the nice way to do it,
@@ -7890,14 +7799,14 @@ otp8395({fin, Config}) when is_list(Config) ->
%%
?DBG("otp8395(fin) -> stop agent node", []),
- stop_node(AgentNode),
+ peer:stop(?config(agent_peer, Config)),
%% -
%% Stop the manager node
%%
?DBG("otp8395(fin) -> stop manager node", []),
- stop_node(ManagerNode),
+ peer:stop(?config(manager_peer, Config)),
wd_stop(Config);
@@ -8156,7 +8065,7 @@ otp16649(N, Config) ->
AgentNode = ?config(agent_node, Config),
ManagerNode = ?config(manager_node, Config),
- ?line AInfo = rpc:call(AgentNode, snmpa, info, []),
+ AInfo = rpc:call(AgentNode, snmpa, info, []),
?IPRINT("Agent Info: "
"~n ~p", [AInfo]),
@@ -8189,25 +8098,25 @@ otp16649(N, Config) ->
AgentTrapPortNo = otp16649_which_trap_port_no(TIs),
?IPRINT("(mgr) register user"),
- ?line ok = otp16649_mgr_reg_user(ManagerNode),
+ ok = otp16649_mgr_reg_user(ManagerNode),
?IPRINT("(mgr) register agent"),
TargetBase = "otp16649-agent-",
ReqTarget = TargetBase ++ "req",
TrapTarget = TargetBase ++ "trap",
- ?line ok = otp16649_mgr_reg_agent(ManagerNode,
+ ok = otp16649_mgr_reg_agent(ManagerNode,
?config(ipfamily, Config),
?config(tdomain, Config),
ReqTarget, AgentReqPortNo),
- ?line ok = otp16649_mgr_reg_agent(ManagerNode,
+ ok = otp16649_mgr_reg_agent(ManagerNode,
?config(ipfamily, Config),
?config(tdomain, Config),
TrapTarget, AgentTrapPortNo),
?IPRINT("(mgr) simple (sync) get request"),
Oids = [?sysObjectID_instance, ?sysDescr_instance, ?sysUpTime_instance],
- ?line ok = case otp16649_mgr_get_req(ManagerNode, Oids) of
+ ok = case otp16649_mgr_get_req(ManagerNode, Oids) of
{ok, {noError, 0, ReplyOids}, _} ->
?IPRINT("(mgr) simple (sync) successful reply: "
"~n ~p", [ReplyOids]),
@@ -8224,10 +8133,10 @@ otp16649(N, Config) ->
?IPRINT("load TestTrap..."),
MibDir = ?config(mib_dir, Config),
- ?line ok = otp16649_agent_load_mib(AgentNode, MibDir, "TestTrap"),
+ ok = otp16649_agent_load_mib(AgentNode, MibDir, "TestTrap"),
?IPRINT("(agent) send trap (testTrap2)"),
- ?line ok = otp16649_agent_send_trap(AgentNode, testTrap2),
+ ok = otp16649_agent_send_trap(AgentNode, testTrap2),
TDomain = ?config(tdomain, Config),
@@ -8245,7 +8154,7 @@ otp16649(N, Config) ->
case TDomain of
transportDomainUdpIpv4 ->
?IPRINT("TIMEOUT"),
- ?line exit(timeout);
+ exit(timeout);
transportDomainUdpIpv6 ->
?IPRINT("expected timeout - "
"v1 trap's can only be sent on IPv4 domains"),
@@ -8255,10 +8164,10 @@ otp16649(N, Config) ->
?IPRINT("load TestTrapv2..."),
- ?line ok = otp16649_agent_load_mib(AgentNode, MibDir, "TestTrapv2"),
+ ok = otp16649_agent_load_mib(AgentNode, MibDir, "TestTrapv2"),
?IPRINT("(agent) send trap (testTrapv22)"),
- ?line ok = otp16649_agent_send_trap(AgentNode, testTrapv22),
+ ok = otp16649_agent_send_trap(AgentNode, testTrapv22),
receive
{handle_trap, From_v2, TrapTarget,
@@ -8270,7 +8179,7 @@ otp16649(N, Config) ->
after 5000 ->
?IPRINT("TIMEOUT"),
- ?line exit(timeout)
+ exit(timeout)
end,
?IPRINT("done"),
@@ -8287,10 +8196,8 @@ otp16649_init(N, AgentPreTransports, Config) ->
%% Start nodes
%%
- ?IPRINT("start (agent and mansger) nodes"),
-
- {ok, AgentNode} = start_node(otp16649_mk_name(N, agent)),
- {ok, ManagerNode} = start_node(otp16649_mk_name(N, manager)),
+ {ok, AgentPeer, AgentNode} = ?START_PEER("-agent"),
+ {ok, ManagerPeer, ManagerNode} = ?START_PEER("-manager"),
%% --
%% Misc
@@ -8340,16 +8247,18 @@ otp16649_init(N, AgentPreTransports, Config) ->
AgentPreTransports2 = [F(T) || T <- AgentPreTransports],
?IPRINT("write agent config files"),
- ?line ok = snmp_config:write_agent_snmp_files(
+ ok = snmp_config:write_agent_snmp_files(
AgentConfDir, Vsns,
TransportDomain, {ManagerIP, ?MGR_PORT}, AgentPreTransports2,
"test"),
?IPRINT("start agent"),
Config2 = start_agent([{host, Host},
+ {agent_peer, AgentPeer},
{agent_node, AgentNode},
{agent_host, AgentHost},
{agent_ip, AgentIP},
+ {manager_peer, ManagerPeer},
{manager_node, ManagerNode},
{manager_host, ManagerHost},
{manager_ip, ManagerIP}|Config]),
@@ -8364,15 +8273,15 @@ otp16649_init(N, AgentPreTransports, Config) ->
MgrTopDir = ?config(manager_top_dir, Config),
MgrDbDir = filename:join(MgrTopDir, "db/"),
MgrConfDir = filename:join(MgrTopDir, "conf/"),
- ?line ok = file:make_dir(MgrConfDir),
+ ok = file:make_dir(MgrConfDir),
MgrDbDir = filename:join(MgrTopDir, "db/"),
- ?line ok = file:make_dir(MgrDbDir),
+ ok = file:make_dir(MgrDbDir),
MgrLogDir = filename:join(MgrTopDir, "log/"),
- ?line ok = file:make_dir(MgrLogDir),
+ ok = file:make_dir(MgrLogDir),
?IPRINT("write manager config files"),
MgrTransports = [{TransportDomain, {ManagerIP0, ?MGR_PORT}}],
- ?line ok = snmp_config:write_manager_snmp_files(
+ ok = snmp_config:write_manager_snmp_files(
MgrConfDir,
MgrTransports,
?MGR_MMS, ?MGR_ENGINE_ID),
@@ -8382,19 +8291,12 @@ otp16649_init(N, AgentPreTransports, Config) ->
{manager_log_dir, MgrLogDir} | Config2],
?IPRINT("start manager"),
- ?line ok = start_manager(Config3),
+ ok = start_manager(Config3),
?DBG("otp16649_init -> done when"
"~n Config2: ~p", [Config3]),
[{agent_raw_transports, AgentPreTransports} | Config3].
-mk_node_name(FName, Post) when is_atom(FName) andalso is_atom(Post) ->
- list_to_atom(?F("~w_~w", [FName, Post])).
-
-otp16649_mk_name(N, Post) when is_integer(N) andalso is_atom(Post) ->
- mk_node_name(otp16649, list_to_atom(?F("~w_~w", [N, Post]))).
-%% list_to_atom(?F("otp16649_~w_~w", [N, Post])).
-
otp16649_fin(N, Config) when is_integer(N) ->
?IPRINT("otp16649_fin -> entry with"
@@ -8402,14 +8304,13 @@ otp16649_fin(N, Config) when is_integer(N) ->
"~n Config: ~p", [N, Config]),
ManagerNode = ?config(manager_node, Config),
- AgentNode = ?config(agent_node, Config),
%% -
%% Stop agent (this is the nice way to do it,
%% so logs and files can be closed in the proper way).
%%
- ?line AgentTopSup = ?config(agent_sup, Config),
+ AgentTopSup = ?config(agent_sup, Config),
stop_standalone_agent(AgentTopSup),
@@ -8425,7 +8326,7 @@ otp16649_fin(N, Config) when is_integer(N) ->
%%
?DBG("otp16649_fin -> stop manager node", []),
- stop_node(ManagerNode),
+ peer:stop(?config(manager_peer, Config)),
%%
@@ -8433,7 +8334,7 @@ otp16649_fin(N, Config) when is_integer(N) ->
%%
?DBG("otp16649_fin -> stop agent node", []),
- stop_node(AgentNode),
+ peer:stop(?config(agent_peer, Config)),
?DBG("otp16649_fin -> done", []),
Config1 = lists:keydelete(manager_node, 1, Config),
@@ -8624,7 +8525,7 @@ start_agent(Config, Opts) ->
process_flag(trap_exit, true),
- ?line {ok, AgentTopSup} = start_standalone_agent(AgentNode, AgentConfig),
+ {ok, AgentTopSup} = start_standalone_agent(AgentNode, AgentConfig),
[{agent_sup, AgentTopSup} | Config].
@@ -8719,7 +8620,7 @@ start_manager(Config) ->
{net_if, [{verbosity, trace}]},
{note_store, [{verbosity, trace}]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
- ?line ok = start_standalone_manager(Node, Opts).
+ ok = start_standalone_manager(Node, Opts).
start_standalone_manager(Node, Config) ->
@@ -8756,18 +8657,17 @@ nkill(Pid, Reason, N) when N > 0 ->
%% Slogan: info test
%%-----------------------------------------------------------------
-info_test(suite) -> [];
info_test(Config) when is_list(Config) ->
?P(info_test),
init_case(Config),
- ?line load_master("OLD-SNMPEA-MIB"),
- ?line init_old(),
+ load_master("OLD-SNMPEA-MIB"),
+ init_old(),
try_test(do_info, [node()]),
- ?line unload_master("OLD-SNMPEA-MIB").
+ unload_master("OLD-SNMPEA-MIB").
do_info(MaNode) ->
- ?line Info = rpc:call(MaNode, snmpa, info, []),
+ Info = rpc:call(MaNode, snmpa, info, []),
?DBG("info_test1 -> Info: ~n~p", [Info]),
Keys = [vsns,
stats_counters,
@@ -8854,15 +8754,6 @@ get_next_req(Vars) ->
?ALIB:get_next_req(Vars).
-start_node(Name) ->
- ?ALIB:start_node(Name).
-
-stop_node(undefined) ->
- ok;
-stop_node(Node) ->
- ?ALIB:stop_node(Node).
-
-
%%%-----------------------------------------------------------------
%%% Configuration
%%%-----------------------------------------------------------------
@@ -9075,14 +8966,12 @@ lists_key1search(Key, List) when is_atom(Key) ->
init_v1_agent(Config) ->
%% --
%% Start nodes
- %%
-
- FName = ?config(fname, Config),
- {ok, AgentNode} = start_node(mk_node_name(FName, agent)),
+ %%
+ {ok, AgentPeer, AgentNode} = ?START_PEER("-agent"),
%% We don't use a manager in this test but the (common) config
%% function takes an argument that is derived from this
- {ok, ManagerNode} = start_node(mk_node_name(FName, manager)),
+ {ok, ManagerPeer, ManagerNode} = ?START_PEER("-manager"),
%% --
%% Mnesia init
@@ -9134,6 +9023,7 @@ init_v1_agent(Config) ->
Config2 = start_agent([{host, Host},
{ip, Ip},
+ {agent_peer, AgentPeer},
{agent_node, AgentNode},
{agent_host, AgentHost},
{agent_ip, AgentIP},
@@ -9141,6 +9031,7 @@ init_v1_agent(Config) ->
%% We need this here since without it
%% fin_v1_agent will not be able to stop!
+ {manager_peer, ManagerPeer},
{manager_node, ManagerNode}|Config]),
%% --
@@ -9151,7 +9042,6 @@ init_v1_agent(Config) ->
fin_v1_agent(Config) ->
AgentNode = ?config(agent_node, Config),
- ManagerNode = ?config(manager_node, Config),
%% -
%% Stop agent (this is the nice way to do it,
@@ -9170,7 +9060,7 @@ fin_v1_agent(Config) ->
%% -
%% Stop the agent node
%%
- stop_node(AgentNode),
+ peer:stop(?config(agent_peer, Config)),
%% SubAgentNode = ?config(sub_agent_node, Config),
@@ -9180,7 +9070,7 @@ fin_v1_agent(Config) ->
%% -
%% Stop the manager node
%%
- stop_node(ManagerNode),
+ peer:stop(?config(manager_peer, Config)),
wd_stop(Config).
diff --git a/lib/snmp/test/snmp_agent_mibs_SUITE.erl b/lib/snmp/test/snmp_agent_mibs_SUITE.erl
index f4130aed65..3fc9f55371 100644
--- a/lib/snmp/test/snmp_agent_mibs_SUITE.erl
+++ b/lib/snmp/test/snmp_agent_mibs_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -163,7 +163,7 @@ init_per_testcase(Case, Config0) when is_list(Config0) ->
Config1 = ?LIB:fix_data_dir(Config0),
CaseTopDir = ?LIB:init_testcase_top_dir(Case, Config1),
DbDir = join(CaseTopDir, "db_dir/"),
- ?line ok = file:make_dir(DbDir),
+ ok = file:make_dir(DbDir),
init_per_testcase2(Case, [{db_dir, DbDir},
{case_top_dir, CaseTopDir} | Config1]).
@@ -215,7 +215,6 @@ end_per_testcase1(_Case, Config) when is_list(Config) ->
%% Test functions
%%======================================================================
-start_and_stop(suite) -> [];
start_and_stop(Config) when is_list(Config) ->
tc_try(start_and_start,
fun() -> do_start_and_stop(Config) end).
@@ -224,20 +223,19 @@ do_start_and_stop(_Config) ->
Prio = normal,
Verbosity = trace,
- ?line sym_start(Prio, Verbosity),
- ?line MibsPid = mibs_start(Prio, Verbosity),
+ sym_start(Prio, Verbosity),
+ MibsPid = mibs_start(Prio, Verbosity),
- ?line mibs_info(MibsPid),
+ mibs_info(MibsPid),
- ?line mibs_stop(MibsPid),
- ?line sym_stop(),
+ mibs_stop(MibsPid),
+ sym_stop(),
ok.
%% ---------------------------------------------------------------------
-load_unload(suite) -> [];
load_unload(Config) when is_list(Config) ->
tc_try(load_unload,
fun() -> do_load_unload(Config) end).
@@ -250,44 +248,44 @@ do_load_unload(Config) ->
MibDir = ?config(data_dir, Config),
?DBG("load_unload -> start symbolic store", []),
- ?line sym_start(Prio, Verbosity),
+ sym_start(Prio, Verbosity),
?DBG("load_unload -> start mib server", []),
- ?line MibsPid = mibs_start(Prio, Verbosity),
+ MibsPid = mibs_start(Prio, Verbosity),
?DBG("load_unload -> load one not already loaded mib", []),
- ?line ok = verify_loaded_mibs(MibsPid, MibDir, []),
- ?line ok = load_mibs(MibsPid, MibDir, ["Test2"]),
- ?line ok = verify_loaded_mibs(MibsPid, MibDir, ["Test2"]),
+ ok = verify_loaded_mibs(MibsPid, MibDir, []),
+ ok = load_mibs(MibsPid, MibDir, ["Test2"]),
+ ok = verify_loaded_mibs(MibsPid, MibDir, ["Test2"]),
?DBG("load_unload -> try load one *already loaded* mib", []),
EMib = join(MibDir, "Test2"),
- ?line {error, {'load aborted at', EMib, already_loaded}} =
+ {error, {'load aborted at', EMib, already_loaded}} =
load_mibs(MibsPid, MibDir, ["Test2"]),
?DBG("load_unload -> load 2 not already loaded mibs", []),
- ?line ok = load_mibs(MibsPid, MibDir, ["TestTrap", "TestTrapv2"]),
- ?line ok = verify_loaded_mibs(MibsPid, MibDir,
+ ok = load_mibs(MibsPid, MibDir, ["TestTrap", "TestTrapv2"]),
+ ok = verify_loaded_mibs(MibsPid, MibDir,
["Test2", "TestTrap", "TestTrapv2"]),
?DBG("load_unload -> unload one loaded mib", []),
- ?line ok = unload_mibs(MibsPid, ["Test2"]),
- ?line ok = verify_loaded_mibs(MibsPid, MibDir, ["TestTrap", "TestTrapv2"]),
+ ok = unload_mibs(MibsPid, ["Test2"]),
+ ok = verify_loaded_mibs(MibsPid, MibDir, ["TestTrap", "TestTrapv2"]),
?DBG("load_unload -> try unload two loaded mibs and one not loaded", []),
- ?line {error, {'unload aborted at', "Test2", not_loaded}} =
+ {error, {'unload aborted at', "Test2", not_loaded}} =
unload_mibs(MibsPid, ["TestTrap","Test2","TestTrapv2"]),
- ?line ok = verify_loaded_mibs(MibsPid, MibDir, ["TestTrapv2"]),
+ ok = verify_loaded_mibs(MibsPid, MibDir, ["TestTrapv2"]),
?DBG("load_unload -> unload the remaining loaded mib", []),
- ?line ok = unload_mibs(MibsPid, ["TestTrapv2"]),
- ?line ok = verify_loaded_mibs(MibsPid, MibDir, []),
+ ok = unload_mibs(MibsPid, ["TestTrapv2"]),
+ ok = verify_loaded_mibs(MibsPid, MibDir, []),
?DBG("load_unload -> stop mib server", []),
- ?line mibs_stop(MibsPid),
+ mibs_stop(MibsPid),
?DBG("load_unload -> stop symbolic store", []),
- ?line sym_stop(),
+ sym_stop(),
?DBG("load_unload -> done", []),
ok.
@@ -296,15 +294,11 @@ do_load_unload(Config) ->
%% ---------------------------------------------------------------------
-size_check_ets1(suite) ->
- [];
size_check_ets1(Config) when is_list(Config) ->
MibStorage = [{module, snmpa_mib_storage_ets}],
do_size_check(size_check_ets1,
[{mib_storage, MibStorage}|Config]).
-size_check_ets2(suite) ->
- [];
size_check_ets2(Config) when is_list(Config) ->
Dir = ?config(db_dir, Config),
MibStorage = [{module, snmpa_mib_storage_ets},
@@ -312,8 +306,6 @@ size_check_ets2(Config) when is_list(Config) ->
do_size_check(size_check_ets2,
[{mib_storage, MibStorage}|Config]).
-size_check_ets2_bad_file1(suite) ->
- [];
size_check_ets2_bad_file1(Config) when is_list(Config) ->
Dir = ?config(db_dir, Config),
%% Ensure that the bad file does not cause any problems (action = clear)
@@ -323,8 +315,6 @@ size_check_ets2_bad_file1(Config) when is_list(Config) ->
do_size_check(size_check_ets2_bad_file1,
[{mib_storage, MibStorage}|Config]).
-size_check_ets3(suite) ->
- [];
size_check_ets3(Config) when is_list(Config) ->
Dir = ?config(db_dir, Config),
MibStorage = [{module, snmpa_mib_storage_ets},
@@ -333,8 +323,6 @@ size_check_ets3(Config) when is_list(Config) ->
do_size_check(size_check_ets3,
[{mib_storage, MibStorage}|Config]).
-size_check_ets3_bad_file1(suite) ->
- [];
size_check_ets3_bad_file1(Config) when is_list(Config) ->
Dir = ?config(db_dir, Config),
%% Ensure that the bad file does not cause any problems (action = clear)
@@ -345,8 +333,6 @@ size_check_ets3_bad_file1(Config) when is_list(Config) ->
do_size_check(size_check_ets3_bad_file1,
[{mib_storage, MibStorage}|Config]).
-size_check_dets(suite) ->
- [];
size_check_dets(Config) when is_list(Config) ->
Dir = ?config(db_dir, Config),
MibStorage = [{module, snmpa_mib_storage_dets},
@@ -354,8 +340,6 @@ size_check_dets(Config) when is_list(Config) ->
do_size_check(size_check_dets,
[{mib_storage, MibStorage}|Config]).
-size_check_mnesia(suite) ->
- [];
size_check_mnesia(Config) when is_list(Config) ->
MibStorage = [{module, snmpa_mib_storage_mnesia},
{options, [{nodes, []}]}],
@@ -385,9 +369,9 @@ do_size_check(Config) ->
StdMibDir = filename:join(code:priv_dir(snmp), "mibs") ++ "/",
?IPRINT("do_size_check -> start symbolic store", []),
- ?line sym_start(Prio, MibStorage, Verbosity),
+ sym_start(Prio, MibStorage, Verbosity),
?IPRINT("do_size_check -> start mib server", []),
- ?line MibsPid = mibs_start(Prio, MibStorage, Verbosity),
+ MibsPid = mibs_start(Prio, MibStorage, Verbosity),
Mibs = ["Test2", "TestTrap", "TestTrapv2"],
StdMibs = ["OTP-SNMPEA-MIB",
@@ -403,23 +387,23 @@ do_size_check(Config) ->
"SNMPv2-TM"],
?IPRINT("do_size_check -> load std mibs", []),
- ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+ load_mibs(MibsPid, StdMibDir, StdMibs),
?IPRINT("do_size_check -> load (own) mibs", []),
- ?line load_mibs(MibsPid, MibDir, Mibs),
+ load_mibs(MibsPid, MibDir, Mibs),
?SLEEP(2000),
?IPRINT("do_size_check -> display mem usage", []),
- ?line display_memory_usage(MibsPid),
+ display_memory_usage(MibsPid),
?IPRINT("do_size_check -> unload (own) mibs", []),
- ?line unload_mibs(MibsPid, Mibs),
+ unload_mibs(MibsPid, Mibs),
?IPRINT("do_size_check -> unload std mibs", []),
- ?line unload_mibs(MibsPid, StdMibs),
+ unload_mibs(MibsPid, StdMibs),
?IPRINT("do_size_check -> stop mib server", []),
- ?line mibs_stop(MibsPid),
+ mibs_stop(MibsPid),
?IPRINT("do_size_check -> stop symbolic store", []),
- ?line sym_stop(),
+ sym_stop(),
?IPRINT("do_size_check -> done", []),
ok.
@@ -427,7 +411,6 @@ do_size_check(Config) ->
%% ---------------------------------------------------------------------
-me_lookup(suite) -> [];
me_lookup(Config) when is_list(Config) ->
tc_try(me_lookup,
fun() -> do_me_lookup(Config) end).
@@ -451,40 +434,39 @@ do_me_lookup(Config) ->
"SNMPv2-TM"],
?DBG("me_lookup -> start symbolic store", []),
- ?line sym_start(Prio, Verbosity),
+ sym_start(Prio, Verbosity),
?DBG("me_lookup -> start mib server", []),
- ?line MibsPid = mibs_start(Prio, Verbosity),
+ MibsPid = mibs_start(Prio, Verbosity),
?DBG("me_lookup -> load mibs", []),
- ?line load_mibs(MibsPid, MibDir, Mibs),
+ load_mibs(MibsPid, MibDir, Mibs),
?DBG("me_lookup -> load std mibs", []),
- ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+ load_mibs(MibsPid, StdMibDir, StdMibs),
?DBG("me_lookup -> find ~w from SNMP-COMMUNITY-MIB",
[?snmpTrapCommunity_instance]),
- ?line ok = me_lookup(MibsPid, ?snmpTrapCommunity_instance),
+ ok = me_lookup(MibsPid, ?snmpTrapCommunity_instance),
?DBG("me_lookup -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
[?vacmViewSpinLock_instance]),
- ?line ok = me_lookup(MibsPid, ?vacmViewSpinLock_instance),
+ ok = me_lookup(MibsPid, ?vacmViewSpinLock_instance),
?DBG("me_lookup -> find ~w from SNMP-USER-BASED-SM-MIB",
[?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = me_lookup(MibsPid, ?usmStatsNotInTimeWindows_instance),
+ {error, _} = me_lookup(MibsPid, ?usmStatsNotInTimeWindows_instance),
?DBG("me_lookup -> stop mib server", []),
- ?line mibs_stop(MibsPid),
+ mibs_stop(MibsPid),
?DBG("me_lookup -> stop symbolic store", []),
- ?line sym_stop(),
+ sym_stop(),
ok.
%% ---------------------------------------------------------------------
-which_mib(suite) -> [];
which_mib(Config) when is_list(Config) ->
tc_try(which_mib,
fun() -> do_which_mib(Config) end).
@@ -508,43 +490,42 @@ do_which_mib(Config) ->
"SNMPv2-TM"],
?DBG("which_mib -> start symbolic store", []),
- ?line sym_start(Prio, Verbosity),
+ sym_start(Prio, Verbosity),
?DBG("which_mib -> start mib server", []),
- ?line MibsPid = mibs_start(Prio, Verbosity),
+ MibsPid = mibs_start(Prio, Verbosity),
?DBG("which_mib -> load mibs", []),
- ?line load_mibs(MibsPid, MibDir, Mibs),
+ load_mibs(MibsPid, MibDir, Mibs),
?DBG("which_mib -> load std mibs", []),
- ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+ load_mibs(MibsPid, StdMibDir, StdMibs),
?DBG("which_mib -> find ~w from SNMP-COMMUNITY-MIB",
[?snmpTrapCommunity_instance]),
- ?line ok = which_mib(MibsPid, ?snmpTrapCommunity_instance,
+ ok = which_mib(MibsPid, ?snmpTrapCommunity_instance,
"SNMP-COMMUNITY-MIB"),
?DBG("which_mib -> find ~w from SNMP-VIEW-BASED-ACM-MIB",
[?vacmViewSpinLock_instance]),
- ?line ok = which_mib(MibsPid, ?vacmViewSpinLock_instance,
+ ok = which_mib(MibsPid, ?vacmViewSpinLock_instance,
"SNMP-VIEW-BASED-ACM-MIB"),
?DBG("which_mib -> find ~w from SNMP-USER-BASED-SM-MIB (not loaded)",
[?usmStatsNotInTimeWindows_instance]),
- ?line {error, _} = which_mib(MibsPid, ?usmStatsNotInTimeWindows_instance,
+ {error, _} = which_mib(MibsPid, ?usmStatsNotInTimeWindows_instance,
"SNMP-USER-BASED-SM-MIB"),
?DBG("which_mib -> stop mib server", []),
- ?line mibs_stop(MibsPid),
+ mibs_stop(MibsPid),
?DBG("which_mib -> stop symbolic store", []),
- ?line sym_stop(),
+ sym_stop(),
ok.
%% ---------------------------------------------------------------------
-cache_test(suite) -> [];
cache_test(Config) when is_list(Config) ->
tc_try(cache_test,
fun() -> do_cache_test(Config) end).
@@ -571,7 +552,7 @@ do_cache_test(Config) ->
"SNMPv2-TM"],
?IPRINT("cache_test -> start symbolic store"),
- ?line sym_start(Prio, MibStorage, silence), % Verbosity),
+ sym_start(Prio, MibStorage, silence), % Verbosity),
?IPRINT("cache_test -> start mib server"),
GcLimit = 3,
@@ -580,25 +561,25 @@ do_cache_test(Config) ->
{age, Age},
{gclimit, GcLimit},
{gcverbose, true}],
- ?line MibsPid = mibs_start(Prio, MibStorage, [], Verbosity, CacheOpts),
+ MibsPid = mibs_start(Prio, MibStorage, [], Verbosity, CacheOpts),
?NPRINT("Info before load mibs: "
"~n ~p", [snmpa_mib:info(MibsPid)]),
?IPRINT("cache_test -> load mibs"),
- ?line load_mibs(MibsPid, MibDir, Mibs),
+ load_mibs(MibsPid, MibDir, Mibs),
?NPRINT("Info before load std mibs: "
"~n ~p", [snmpa_mib:info(MibsPid)]),
?IPRINT("cache_test -> load std mibs"),
- ?line load_mibs(MibsPid, StdMibDir, StdMibs),
+ load_mibs(MibsPid, StdMibDir, StdMibs),
?NPRINT("Info (after mibs load but) before populate: "
"~n ~p", [snmpa_mib:info(MibsPid)]),
?IPRINT("cache_test -> populate the cache"),
- ?line ok = populate(MibsPid),
+ ok = populate(MibsPid),
?NPRINT("Info after populate: "
"~n ~p", [snmpa_mib:info(MibsPid)]),
@@ -625,10 +606,10 @@ do_cache_test(Config) ->
?IPRINT("cache_test -> subscribe to GC events"),
- ?line ok = snmpa_mib:subscribe_gc_events(MibsPid),
+ ok = snmpa_mib:subscribe_gc_events(MibsPid),
?IPRINT("cache_test -> enable cache autogc"),
- ?line ok = snmpa_mib:enable_cache_autogc(MibsPid),
+ ok = snmpa_mib:enable_cache_autogc(MibsPid),
?IPRINT("cache_test -> wait 65 seconds to allow gc to happen"),
?SLEEP(timer:seconds(65)),
@@ -738,10 +719,10 @@ do_cache_test(Config) ->
?IPRINT("cache_test -> stop mib server"),
- ?line mibs_stop(MibsPid),
+ mibs_stop(MibsPid),
?IPRINT("cache_test -> stop symbolic store"),
- ?line sym_stop(),
+ sym_stop(),
?IPRINT("cache_test -> end"),
ok.
@@ -873,13 +854,13 @@ mnesia_start(Opts) ->
mnesia_start(Opts, [node()]).
mnesia_start(Opts, Nodes) ->
- %% We can accept mnesia beeing loaded but *not* started.
+ %% We can accept mnesia being loaded but *not* started.
%% If its started it *may* contain data that will invalidate
%% this test case.
?IPRINT("mnesia_start -> try load mnesia when:"
"~n Loaded: ~p"
"~n Running: ~p", [apps_loaded(), apps_running()]),
- ?line ok = case application:load(mnesia) of
+ ok = case application:load(mnesia) of
ok ->
ok;
{error, {already_loaded, mnesia}} ->
@@ -890,11 +871,11 @@ mnesia_start(Opts, Nodes) ->
F = fun({Key, Val}) ->
?IPRINT("mnesia_start -> try set mnesia env: "
"~n ~p -> ~p", [Key, Val]),
- ?line application_controller:set_env(mnesia, Key, Val)
+ application_controller:set_env(mnesia, Key, Val)
end,
lists:foreach(F, Opts),
?IPRINT("mnesia_start -> create mnesia schema on ~p", [Nodes]),
- ?line case mnesia:create_schema(Nodes) of
+ case mnesia:create_schema(Nodes) of
ok ->
ok;
{error, {_, {already_exist, _}}} ->
@@ -904,7 +885,7 @@ mnesia_start(Opts, Nodes) ->
?F("Failed create mnesia schema: ~p", [SchemaReason])})
end,
?IPRINT("mnesia_start -> start mnesia", []),
- ?line case application:start(mnesia) of
+ case application:start(mnesia) of
ok ->
ok;
{error, {already_started, mnesia}} ->
@@ -988,13 +969,13 @@ mibs_info(Pid) ->
load_mibs(Pid, Dir, Mibs0) ->
Mibs = [join(Dir, Mib) || Mib <- Mibs0],
- Res = snmpa_mib:load_mibs(Pid, Mibs),
+ Res = snmpa_mib:load_mibs(Pid, Mibs, false),
%% ?DBG("load_mibs -> "
%% "~n Res: ~p", [Res]),
Res.
unload_mibs(Pid, Mibs) ->
- Res = snmpa_mib:unload_mibs(Pid, Mibs),
+ Res = snmpa_mib:unload_mibs(Pid, Mibs, false),
%% ?DBG("unload_mibs -> "
%% "~n Res: ~p", [Res]),
Res.
@@ -1093,11 +1074,11 @@ tc_try(Name, TC) ->
tc_try(Name, Init, TC)
when is_atom(Name) andalso is_function(Init, 0) andalso is_function(TC, 0) ->
Pre = fun() ->
- {ok, Node} = ?ALIB:start_node(unique(Name)),
+ {ok, Peer, Node} = ?START_PEER(atom_to_list(Name)),
ok = run_on(Node, Init),
- Node
+ {Peer, Node}
end,
- Case = fun(Node) ->
+ Case = fun({_Peer, Node}) ->
monitor_node(Node, true),
Pid = spawn_link(Node, TC),
receive
@@ -1125,7 +1106,7 @@ tc_try(Name, Init, TC)
exit(Reason)
end
end,
- Post = fun(Node) ->
+ Post = fun({Peer, Node}) ->
receive
{nodedown, Node} ->
?NPRINT("node ~p (already) stopped", [Node]),
@@ -1133,7 +1114,7 @@ tc_try(Name, Init, TC)
after 0 ->
monitor_node(Node, true),
?NPRINT("try stop node ~p", [Node]),
- ?STOP_NODE(Node),
+ peer:stop(Peer),
receive
{nodedown, Node} ->
?NPRINT("node ~p stopped", [Node]),
@@ -1156,9 +1137,6 @@ run_on(Node, F) when is_atom(Node) andalso is_function(F, 0) ->
monitor_node(Node, false),
Reason
end.
-
-unique(PreName) ->
- list_to_atom(?F("~w_~w", [PreName, erlang:system_time(millisecond)])).
%% --
diff --git a/lib/snmp/test/snmp_agent_test_lib.erl b/lib/snmp/test/snmp_agent_test_lib.erl
index 199296593f..41e656e7dc 100644
--- a/lib/snmp/test/snmp_agent_test_lib.erl
+++ b/lib/snmp/test/snmp_agent_test_lib.erl
@@ -33,8 +33,6 @@
start_subagent/3, stop_subagent/1,
start_sub_sup/1, start_sub_sup/2,
- start_node/1, stop_node/1,
-
load_master/1, load_master_std/1, unload_master/1,
loaded_mibs/0, unload_mibs/1,
@@ -131,11 +129,16 @@ init_all(Config) when is_list(Config) ->
%%
?IPRINT("init_all -> start sub-agent node"),
- ?line {ok, SaNode} = start_node(snmp_sa),
+ Args = ["-s", "snmp_test_sys_monitor", "start", "-s", "global", "sync"],
+
+ {ok, SaPeer, SaNode} = ?CT_PEER(#{name => ?CT_PEER_NAME(snmp_sa), args => Args}),
+ unlink(SaPeer), %% must unlink, otherwise peer will exit before test case
?IPRINT("init_all -> start manager node"),
- ?line {ok, MgrNode} = start_node(snmp_mgr),
+ {ok, MgrPeer, MgrNode} = ?CT_PEER(#{name => ?CT_PEER_NAME(snmp_mgr), args => Args}),
+ unlink(MgrPeer), %% must unlink, otherwise peer will exit before test case
+ global:sync(),
%% --
%% Create necessary files ( and dirs )
@@ -147,37 +150,37 @@ init_all(Config) when is_list(Config) ->
?IPRINT("init_all -> create agent dir"),
AgentDir = join(GroupTopDir, "agent/"),
- ?line ok = file:make_dir(AgentDir),
+ ok = file:make_dir(AgentDir),
?DBG("init_all -> AgentDir ~p", [AgentDir]),
?IPRINT("init_all -> create agent db dir"),
AgentDbDir = join(AgentDir, "db/"),
- ?line ok = file:make_dir(AgentDbDir),
+ ok = file:make_dir(AgentDbDir),
?DBG("init_all -> AgentDbDir ~p", [AgentDbDir]),
?IPRINT("init_all -> create agent log dir"),
AgentLogDir = join(AgentDir, "log/"),
- ?line ok = file:make_dir(AgentLogDir),
+ ok = file:make_dir(AgentLogDir),
?DBG("init_all -> AgentLogDir ~p", [AgentLogDir]),
?IPRINT("init_all -> create agent config dir"),
AgentConfDir = join(AgentDir, "conf/"),
- ?line ok = file:make_dir(AgentConfDir),
+ ok = file:make_dir(AgentConfDir),
?DBG("init_all -> AgentConfDir ~p", [AgentConfDir]),
?IPRINT("init_all -> create manager dir"),
MgrDir = join(GroupTopDir, "mgr/"),
- ?line ok = file:make_dir(MgrDir),
+ ok = file:make_dir(MgrDir),
?DBG("init_all -> MgrDir ~p", [MgrDir]),
?IPRINT("init_all -> create sub-agent dir"),
SaDir = join(GroupTopDir, "sa/"),
- ?line ok = file:make_dir(SaDir),
+ ok = file:make_dir(SaDir),
?DBG("init_all -> SaDir ~p", [SaDir]),
?IPRINT("init_all -> create sub-agent db dir"),
SaDbDir = join(SaDir, "db/"),
- ?line ok = file:make_dir(SaDbDir),
+ ok = file:make_dir(SaDbDir),
?DBG("init_all -> SaDbDir ~p", [SaDbDir]),
%% MibDir = ?config(mib_dir, Config),
@@ -189,35 +192,37 @@ init_all(Config) when is_list(Config) ->
%%
?IPRINT("init_all -> load mnesia application (local)"),
- ?line ok = application:load(mnesia),
+ ok = application:load(mnesia),
?IPRINT("init_all -> load application mnesia on node ~p", [SaNode]),
- ?line ok = rpc:call(SaNode, application, load, [mnesia]),
+ ok = rpc:call(SaNode, application, load, [mnesia]),
?IPRINT("init_all -> application mnesia (local): set_env dir"),
- ?line application_controller:set_env(mnesia, dir,
+ application_controller:set_env(mnesia, dir,
join(AgentDbDir, "Mnesia1")),
?IPRINT("init_all -> application mnesia: set_env dir on node ~p", [SaNode]),
- ?line rpc:call(SaNode, application_controller, set_env,
+ rpc:call(SaNode, application_controller, set_env,
[mnesia, dir, join(SaDir, "Mnesia2")]),
?IPRINT("init_all -> create mnesia schema"),
- ?line ok = mnesia:create_schema([SaNode, node()]),
+ ok = mnesia:create_schema([SaNode, node()]),
?IPRINT("init_all -> start application mnesia (local)"),
- ?line ok = application:start(mnesia),
+ ok = application:start(mnesia),
?IPRINT("init_all -> start application mnesia on ~p", [SaNode]),
- ?line ok = rpc:call(SaNode, application, start, [mnesia]),
+ ok = rpc:call(SaNode, application, start, [mnesia]),
?IPRINT("init_all -> get localhost"),
Ip = ?LOCALHOST(),
?IPRINT("init_all -> done when"
"~n Nodes: ~p", [nodes()]),
- [{snmp_sa, SaNode},
- {snmp_mgr, MgrNode},
+ [{snmp_sa, SaNode},
+ {snmp_sa_peer, SaPeer},
+ {snmp_mgr, MgrNode},
+ {snmp_mgr_peer, MgrPeer},
{snmp_master, node()},
{agent_dir, AgentDir ++ "/"},
{agent_db_dir, AgentDbDir ++ "/"},
@@ -237,14 +242,12 @@ finish_all(Config) when is_list(Config) ->
"~n Config: ~p"
"~n Nodes: ~p", [Config, nodes()]),
- SaNode = ?config(snmp_sa, Config),
- MgrNode = ?config(snmp_mgr, Config),
+ SaPeer = ?config(snmp_sa_peer, Config),
+ MgrPeer = ?config(snmp_mgr_peer, Config),
- ?IPRINT("finish_all -> stop sub-agent node ~p", [SaNode]),
- stop_node(SaNode),
+ peer:stop(SaPeer),
- ?IPRINT("finish_all -> stop manager node ~p", [MgrNode]),
- stop_node(MgrNode),
+ peer:stop(MgrPeer),
?IPRINT("finish_all -> stop mnesia application"),
application:stop(mnesia),
@@ -579,13 +582,13 @@ tc_run(Mod, Func, Args, Opts) ->
?EPRINT("Failed starting (test) manager: "
"~n ~p", [Reason]),
(catch snmp_test_mgr:stop()),
- ?line ?FAIL({mgr_start_error, Reason});
+ ?FAIL({mgr_start_error, Reason});
Err ->
?EPRINT("Failed starting (test) manager: "
"~n ~p", [Err]),
(catch snmp_test_mgr:stop()),
- ?line ?FAIL({mgr_start_failure, Err})
+ ?FAIL({mgr_start_failure, Err})
end.
%% We have some crap machines that generate this every now and then
@@ -597,7 +600,7 @@ tc_run_skip_check(_Mod, _Func, _Args,
?SKIP([{reason, Reason}]);
%% We have hosts (mostly *very* slooow VMs) that
%% can timeout anything. Since we are basically
-%% testing communication, we therefor must check
+%% testing communication, we therefore must check
%% for system events at every failure. Grrr!
tc_run_skip_check(Mod, Func, Args, Reason, Cat) ->
SysEvs = snmp_test_global_sys_monitor:events(),
@@ -608,7 +611,7 @@ tc_run_skip_check(Mod, Func, Args, Reason, Cat) ->
"~n ~p~n", [Cat, Reason]),
?FAIL({apply_failed, {Mod, Func, Args}, Reason});
true ->
- ?WPRINT("apply (~w) catched "
+ ?WPRINT("apply (~w) caught "
"when we got system events: "
"~n Reason: ~p"
"~n Sys Events: ~p"
@@ -670,11 +673,11 @@ start_agent(Config, Vsns, Opts) ->
"~n Vsns: ~p"
"~n Opts: ~p", [node(), Config, Vsns, Opts]),
- ?line AgentLogDir = ?config(agent_log_dir, Config),
- ?line AgentConfDir = ?config(agent_conf_dir, Config),
- ?line AgentDbDir = ?config(agent_db_dir, Config),
- ?line SaNode = ?config(snmp_sa, Config),
- ?line InetBackend = ?config(socket_create_opts, Config),
+ AgentLogDir = ?config(agent_log_dir, Config),
+ AgentConfDir = ?config(agent_conf_dir, Config),
+ AgentDbDir = ?config(agent_db_dir, Config),
+ SaNode = ?config(snmp_sa, Config),
+ InetBackend = ?config(socket_create_opts, Config),
Env = app_agent_env_init(
[{versions, Vsns},
@@ -706,26 +709,26 @@ start_agent(Config, Vsns, Opts) ->
?DBG("start_agent -> snmp app supervisor: ~p", [AppSup]),
?IPRINT("start_agent -> try start master agent",[]),
- ?line Sup = start_sup(Env),
- ?line unlink(Sup),
+ Sup = start_sup(Env),
+ unlink(Sup),
?DBG("start_agent -> snmp supervisor: ~p", [Sup]),
?IPRINT("start_agent -> try (rpc) start sub agent on ~p", [SaNode]),
- ?line SaDir = ?config(sa_dir, Config),
- ?line {ok, Sub} = start_sub_sup(SaNode, SaDir),
+ SaDir = ?config(sa_dir, Config),
+ {ok, Sub} = start_sub_sup(SaNode, SaDir),
?DBG("start_agent -> done", []),
- ?line [{snmp_app_sup, AppSup},
+ [{snmp_app_sup, AppSup},
{snmp_sup, {Sup, self()}},
{snmp_sub, Sub} | Config].
app_agent_env_init(Env0, Opts) ->
?DBG("app_agent_env_init -> unload snmp",[]),
- ?line application:unload(snmp),
+ application:unload(snmp),
?DBG("app_agent_env_init -> load snmp",[]),
- ?line application:load(snmp),
+ application:load(snmp),
?DBG("app_agent_env_init -> "
"merge or maybe replace (snmp agent) app env",[]),
@@ -1306,7 +1309,7 @@ do_expect(Err, Idx, ExpVBs, To)
when is_atom(Err) andalso
(is_integer(Idx) orelse is_list(Idx) orelse (Idx == any)) ->
Check = fun(_, R) -> R end,
- io_format_expect("'get-response' withing ~w ms with"
+ io_format_expect("'get-response' within ~w ms with"
"~n Error: ~p"
"~n Index: ~p"
"~n Varbinds: ~p", [To, Err, Idx, ExpVBs]),
@@ -1639,41 +1642,6 @@ get_next_req(Vars) ->
Response.
-%% --- start and stop nodes ---
-
-start_node(Name) ->
- ?IPRINT("start_node -> entry with"
- "~n Name: ~p"
- "~n when"
- "~n hostname of this node: ~p",
- [Name, list_to_atom(?HOSTNAME(node()))]),
-
- Pa = filename:dirname(code:which(?MODULE)),
- ?DBG("start_node -> Pa: ~p", [Pa]),
-
- A = " -pa " ++ Pa ++
- " -s " ++ atom_to_list(snmp_test_sys_monitor) ++ " start" ++
- " -s global sync",
- case ?START_NODE(Name, A) of
- {ok, Node} ->
- ?DBG("start_node -> Node: ~p", [Node]),
- global:sync(),
- {ok, Node};
- {error, Reason} ->
- ?WPRINT("start_node -> failed starting node ~p:"
- "~n Reason: ~p", [Name, Reason]),
- ?line ?SKIP({failed_start_node, Reason});
- Else ->
- ?EPRINT("start_node -> failed starting node ~p:"
- "~n ~p", [Name, Else]),
- ?line ?FAIL(Else)
- end.
-
-
-stop_node(Node) ->
- ?IPRINT("stop_node -> Node: ~p", [Node]),
- ?STOP_NODE(Node).
-
%%%-----------------------------------------------------------------
%%% Configuration
@@ -1691,13 +1659,13 @@ config(Vsns, MgrDir, AgentConfDir, MIp, AIp, IpFamily) ->
"~n AIp: ~p"
"~n IpFamily: ~p",
[Vsns, MgrDir, AgentConfDir, MIp, AIp, IpFamily]),
- ?line {Domain, ManagerAddr} =
+ {Domain, ManagerAddr} =
case IpFamily of
inet6 ->
TransportDomain6 = transportDomainUdpIpv6,
AgentAddr6 = {AIp, 4000},
ManagerAddr6 = {MIp, ?TRAP_UDP},
- ?line ok =
+ ok =
snmp_config:write_agent_snmp_files(
AgentConfDir, Vsns,
TransportDomain6, ManagerAddr6, AgentAddr6, "test"),
@@ -1710,32 +1678,32 @@ config(Vsns, MgrDir, AgentConfDir, MIp, AIp, IpFamily) ->
%% [#{addr => {AIp2, 4000}, kind => req_responder},
%% #{addr => {AIp2, 4001}, kind => trap_sender}],
AgentPreTransport = [#{addr => {AIp2, 4000}}],
- ?line ok =
+ ok =
snmp_config:write_agent_snmp_files(
AgentConfDir, Vsns,
TransportDomain4, ManagerAddr4, AgentPreTransport,
"test"),
{TransportDomain4, ManagerAddr4};
_ ->
- ?line ok =
+ ok =
snmp_config:write_agent_snmp_files(
AgentConfDir, Vsns, MIp, ?TRAP_UDP, AIp, 4000, "test"),
{snmpUDPDomain, {MIp, ?TRAP_UDP}}
end,
- ?line case update_usm(Vsns, AgentConfDir) of
+ case update_usm(Vsns, AgentConfDir) of
true ->
- ?line copy_file(join(AgentConfDir, "usm.conf"),
+ copy_file(join(AgentConfDir, "usm.conf"),
join(MgrDir, "usm.conf")),
- ?line update_usm_mgr(Vsns, MgrDir);
+ update_usm_mgr(Vsns, MgrDir);
false ->
- ?line ok
+ ok
end,
- ?line update_community(Vsns, AgentConfDir),
- ?line update_vacm(Vsns, AgentConfDir),
- ?line write_target_addr_conf(AgentConfDir, Domain, ManagerAddr, Vsns),
- ?line write_target_params_conf(AgentConfDir, Vsns),
- ?line write_notify_conf(AgentConfDir),
+ update_community(Vsns, AgentConfDir),
+ update_vacm(Vsns, AgentConfDir),
+ write_target_addr_conf(AgentConfDir, Domain, ManagerAddr, Vsns),
+ write_target_params_conf(AgentConfDir, Vsns),
+ write_notify_conf(AgentConfDir),
ok.
maybe_fix_addr(Addr) when is_list(Addr) ->
@@ -1843,7 +1811,7 @@ update_usm(Vsns, Dir) ->
usmHMACSHAAuthProtocol, "", "",
usmDESPrivProtocol, "", "", "",
"passwd_shaxxxxxxxxxx", "passwd_desxxxxxx"}],
- ?line ok = snmp_config:update_agent_usm_config(Dir, Conf),
+ ok = snmp_config:update_agent_usm_config(Dir, Conf),
true;
false ->
false
@@ -1862,14 +1830,14 @@ update_usm_mgr(Vsns, Dir) ->
usmDESPrivProtocol, "", "", "",
"passwd_shaxxxxxxxxxx", "passwd_desxxxxxx"}],
- ?line ok = snmp_config:update_agent_usm_config(Dir, Conf),
+ ok = snmp_config:update_agent_usm_config(Dir, Conf),
true;
false ->
false
end.
rewrite_usm_mgr(Dir, ShaKey, DesKey) ->
- ?line ok = file:rename(join(Dir,"usm.conf"),
+ ok = file:rename(join(Dir,"usm.conf"),
join(Dir,"usm.old")),
Conf = [{"agentEngine", "newUser", "newUser", zeroDotZero,
usmHMACSHAAuthProtocol, "", "",
@@ -1877,10 +1845,10 @@ rewrite_usm_mgr(Dir, ShaKey, DesKey) ->
{"mgrEngine", "newUser", "newUser", zeroDotZero,
usmHMACSHAAuthProtocol, "", "",
usmDESPrivProtocol, "", "", "", ShaKey, DesKey}],
- ?line ok = snmp_config:write_agent_usm_config(Dir, "", Conf).
+ ok = snmp_config:write_agent_usm_config(Dir, "", Conf).
reset_usm_mgr(Dir) ->
- ?line ok = file:rename(join(Dir,"usm.old"),
+ ok = file:rename(join(Dir,"usm.old"),
join(Dir,"usm.conf")).
@@ -1888,7 +1856,7 @@ update_community([v3], _Dir) ->
ok;
update_community(_, Dir) ->
Conf = [{"no-rights", "no-rights", "no-rights", "", ""}],
- ?line ok = snmp_config:update_agent_community_config(Dir, Conf).
+ ok = snmp_config:update_agent_community_config(Dir, Conf).
-define(tDescr_instance, [1,3,6,1,2,1,16,1,0]).
@@ -1903,17 +1871,17 @@ update_vacm(_Vsn, Dir) ->
{vacmSecurityToGroup, usm, "newUser", "initial"},
{vacmViewTreeFamily, "internet", ?tDescr_instance,
excluded, null}],
- ?line ok = snmp_config:update_agent_vacm_config(Dir, Conf).
+ ok = snmp_config:update_agent_vacm_config(Dir, Conf).
write_community_conf(Dir, Conf) ->
- ?line ok = snmp_config:write_agent_community_config(Dir, "", Conf).
+ ok = snmp_config:write_agent_community_config(Dir, "", Conf).
write_target_addr_conf(Dir, Conf) ->
- ?line ok = snmp_config:write_agent_target_addr_config(Dir, "", Conf).
+ ok = snmp_config:write_agent_target_addr_config(Dir, "", Conf).
write_target_addr_conf(Dir, Ip_or_Domain, Port_or_Addr, Vsns) ->
- ?line ok =
+ ok =
snmp_config:write_agent_snmp_target_addr_conf(
Dir, Ip_or_Domain, Port_or_Addr, Vsns).
@@ -1930,7 +1898,7 @@ rewrite_target_addr_conf(Dir, NewPort) ->
ok
end,
- ?line [TrapAddr|Addrs] =
+ [TrapAddr|Addrs] =
snmp_conf:read(TAFile, fun rewrite_target_addr_conf_check/1),
?DBG("rewrite_target_addr_conf -> TrapAddr: ~p",[TrapAddr]),
@@ -1939,10 +1907,10 @@ rewrite_target_addr_conf(Dir, NewPort) ->
?DBG("rewrite_target_addr_conf -> NewAddrs: ~p",[NewAddrs]),
- ?line ok = file:rename(join(Dir,"target_addr.conf"),
+ ok = file:rename(join(Dir,"target_addr.conf"),
join(Dir,"target_addr.old")),
- ?line ok = snmp_config:write_agent_target_addr_config(Dir, "", NewAddrs).
+ ok = snmp_config:write_agent_target_addr_config(Dir, "", NewAddrs).
rewrite_target_addr_conf_check(O) ->
{ok,O}.
@@ -1958,7 +1926,7 @@ rewrite_target_addr_conf2(_NewPort,O) ->
O.
reset_target_addr_conf(Dir) ->
- ?line ok = file:rename(join(Dir, "target_addr.old"),
+ ok = file:rename(join(Dir, "target_addr.old"),
join(Dir, "target_addr.conf")).
write_target_params_conf(Dir, Vsns) ->
@@ -1967,28 +1935,28 @@ write_target_params_conf(Dir, Vsns) ->
(v3) -> {"target_v3", v3, usm, "all-rights", noAuthNoPriv}
end,
Conf = [F(Vsn) || Vsn <- Vsns],
- ?line ok = snmp_config:write_agent_target_params_config(Dir, "", Conf).
+ ok = snmp_config:write_agent_target_params_config(Dir, "", Conf).
rewrite_target_params_conf(Dir, SecName, SecLevel)
when is_list(SecName) andalso is_atom(SecLevel) ->
- ?line ok = file:rename(join(Dir,"target_params.conf"),
+ ok = file:rename(join(Dir,"target_params.conf"),
join(Dir,"target_params.old")),
Conf = [{"target_v3", v3, usm, SecName, SecLevel}],
- ?line ok = snmp_config:write_agent_target_params_config(Dir, "", Conf).
+ ok = snmp_config:write_agent_target_params_config(Dir, "", Conf).
reset_target_params_conf(Dir) ->
- ?line ok = file:rename(join(Dir,"target_params.old"),
+ ok = file:rename(join(Dir,"target_params.old"),
join(Dir,"target_params.conf")).
write_notify_conf(Dir) ->
Conf = [{"standard trap", "std_trap", trap},
{"standard inform", "std_inform", inform}],
- ?line ok = snmp_config:write_agent_notify_config(Dir, "", Conf).
+ ok = snmp_config:write_agent_notify_config(Dir, "", Conf).
write_view_conf(Dir) ->
Conf = [{2, [1,3,6], included, null},
{2, ?tDescr_instance, excluded, null}],
- ?line ok = snmp_config:write_agent_view_config(Dir, "", Conf).
+ ok = snmp_config:write_agent_view_config(Dir, "", Conf).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/snmp/test/snmp_compiler_SUITE.erl b/lib/snmp/test/snmp_compiler_SUITE.erl
index f4ba914919..9cc47397a8 100644
--- a/lib/snmp/test/snmp_compiler_SUITE.erl
+++ b/lib/snmp/test/snmp_compiler_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -197,14 +197,14 @@ description(Config) when is_list(Config) ->
Desctext = "This is a test description",
Oid = [1,3,6,1,2,1,15,1],
write_mib(MibSrcName,Desctext),
- ?line {ok,_} = snmpc:compile(MibSrcName, [{outdir, Dir},
+ {ok,_} = snmpc:compile(MibSrcName, [{outdir, Dir},
{group_check, false},
{warnings, false},
{description, false}]),
MIB1 = read_mib(MibBinName),
%% ?IPRINT("description -> MIB1: ~n~p~n", [MIB1]),
check_mib(MIB1#mib.mes, Oid, undefined),
- ?line {ok,_} = snmpc:compile(MibSrcName, [{outdir, Dir},
+ {ok,_} = snmpc:compile(MibSrcName, [{outdir, Dir},
{group_check, false},
{warnings, false},
{description, true}]),
@@ -228,8 +228,8 @@ oid_conflicts(Config) when is_list(Config) ->
Dir = ?config(case_top_dir, Config),
Mib = join(Dir,"TESTv2.mib"),
- ?line ok = write_oid_conflict_mib(Mib),
- ?line {error,compilation_failed} =
+ ok = write_oid_conflict_mib(Mib),
+ {error,compilation_failed} =
snmpc:compile(Mib,[{outdir, Dir},{verbosity,trace}]),
ok.
@@ -263,21 +263,21 @@ agent_capabilities(Config) when is_list(Config) ->
SnmpMibsDir = join(SnmpPrivDir, "mibs"),
Dir = ?config(mib_dir, Config),
AcMib = join(Dir,"AC-TEST-MIB.mib"),
- ?line {ok, MibFile1} = snmpc:compile(AcMib, [options,
+ {ok, MibFile1} = snmpc:compile(AcMib, [options,
version,
{i, [SnmpMibsDir]},
{outdir, Dir},
{verbosity, trace}]),
- ?line {ok, Mib1} = snmp_misc:read_mib(MibFile1),
- ?line {ok, MibFile2} = snmpc:compile(AcMib, [options,
+ {ok, Mib1} = snmp_misc:read_mib(MibFile1),
+ {ok, MibFile2} = snmpc:compile(AcMib, [options,
version,
agent_capabilities,
{i, [SnmpMibsDir]},
{outdir, Dir},
{verbosity, trace}]),
- ?line {ok, Mib2} = snmp_misc:read_mib(MibFile2),
+ {ok, Mib2} = snmp_misc:read_mib(MibFile2),
MEDiff = Mib2#mib.mes -- Mib1#mib.mes,
- %% This is a rather pathetic test, but it is somthing...
+ %% This is a rather pathetic test, but it is something...
?IPRINT("agent_capabilities -> "
"~n MEDiff: ~p"
"~n Mib1: ~p"
@@ -304,21 +304,21 @@ module_compliance(Config) when is_list(Config) ->
SnmpMibsDir = join(SnmpPrivDir, "mibs"),
Dir = ?config(mib_dir, Config),
AcMib = join(Dir,"MC-TEST-MIB.mib"),
- ?line {ok, MibFile1} = snmpc:compile(AcMib, [options,
+ {ok, MibFile1} = snmpc:compile(AcMib, [options,
version,
{i, [SnmpMibsDir]},
{outdir, Dir},
{verbosity, trace}]),
- ?line {ok, Mib1} = snmp_misc:read_mib(MibFile1),
- ?line {ok, MibFile2} = snmpc:compile(AcMib, [options,
+ {ok, Mib1} = snmp_misc:read_mib(MibFile1),
+ {ok, MibFile2} = snmpc:compile(AcMib, [options,
version,
module_compliance,
{i, [SnmpMibsDir]},
{outdir, Dir},
{verbosity, trace}]),
- ?line {ok, Mib2} = snmp_misc:read_mib(MibFile2),
+ {ok, Mib2} = snmp_misc:read_mib(MibFile2),
MEDiff = Mib2#mib.mes -- Mib1#mib.mes,
- %% This is a rather pathetic test, but it is somthing...
+ %% This is a rather pathetic test, but it is something...
?IPRINT("module_compliance -> "
"~n MEDiff: ~p"
"~n Mib1: ~p"
@@ -369,7 +369,7 @@ otp_6150(Config) when is_list(Config) ->
Dir = ?config(case_top_dir, Config),
MibDir = ?config(mib_dir, Config),
MibFile = join(MibDir, "ERICSSON-TOP-MIB.mib"),
- ?line {ok, Mib} =
+ {ok, Mib} =
snmpc:compile(MibFile, [{outdir, Dir}, {verbosity, trace}]),
?IPRINT("otp_6150 -> Mib: "
"~n ~p", [Mib]),
@@ -422,7 +422,7 @@ otp_8595(Config) when is_list(Config) ->
Dir = ?config(case_top_dir, Config),
MibDir = ?config(mib_dir, Config),
MibFile = join(MibDir, "OTP8595-MIB.mib"),
- ?line {ok, Mib} =
+ {ok, Mib} =
snmpc:compile(MibFile, [{outdir, Dir},
{verbosity, trace},
{group_check, false}]),
@@ -442,7 +442,7 @@ otp_10799(Config) when is_list(Config) ->
Dir = ?config(case_top_dir, Config),
MibDir = ?config(mib_dir, Config),
MibFile = join(MibDir, "OTP10799-MIB.mib"),
- ?line {ok, Mib} =
+ {ok, Mib} =
snmpc:compile(MibFile, [{outdir, Dir}, {verbosity, trace}]),
?IPRINT("Mib: "
"~n ~p", [Mib]),
@@ -461,7 +461,7 @@ otp_10808(Config) when is_list(Config) ->
Dir = ?config(case_top_dir, Config),
MibDir = ?config(mib_dir, Config),
MibFile = join(MibDir, "OTP10808-MIB.mib"),
- ?line {ok, Mib} =
+ {ok, Mib} =
snmpc:compile(MibFile, [{outdir, Dir},
{verbosity, trace},
{group_check, false}]),
@@ -483,7 +483,7 @@ otp_14145(Config) when is_list(Config) ->
MibDir = ?config(mib_dir, Config),
MibName = "OTP14145-MIB",
MibFile = join(MibDir, MibName++".mib"),
- ?line {ok, MibBin} =
+ {ok, MibBin} =
snmpc:compile(MibFile, [{outdir, Dir},
{verbosity, trace},
{group_check, false},
@@ -509,7 +509,7 @@ otp_13014(Config) when is_list(Config) ->
MibDir = ?config(mib_dir, Config),
MibName = "Test-LLDP-MIB",
MibFile = join(MibDir, MibName++".mib"),
- ?line {ok, MibBin} =
+ {ok, MibBin} =
snmpc:compile(MibFile, [{outdir, Dir},
{verbosity, log},
{group_check, false},
@@ -544,7 +544,7 @@ otp_14196(Config) when is_list(Config) ->
Dir = ?config(case_top_dir, Config),
MibDir = ?config(mib_dir, Config),
MibFile = join(MibDir, "OTP14196-MIB.mib"),
- ?line {ok, Mib} =
+ {ok, Mib} =
snmpc:compile(MibFile, [{outdir, Dir}, {verbosity, trace}]),
?IPRINT("Mib: "
"~n ~p", [Mib]),
@@ -564,13 +564,13 @@ augments_extra_info(Config) when is_list(Config) ->
MibDir = ?config(mib_dir, Config),
Test2File = join(MibDir, "Test2.mib"),
Test3File = join(MibDir, "Test3.mib"),
- ?line {ok, Test2BinFile} =
+ {ok, Test2BinFile} =
snmpc:compile(Test2File, [{outdir, Dir},
{verbosity, silence},
{group_check, false}]),
?IPRINT("Test2BinFile: "
"~n ~p", [Test2BinFile]),
- ?line {ok, Test3BinFile} =
+ {ok, Test3BinFile} =
snmpc:compile(Test3File, [{i, [MibDir]},
{outdir, Dir},
{verbosity, silence},
diff --git a/lib/snmp/test/snmp_conf_SUITE.erl b/lib/snmp/test/snmp_conf_SUITE.erl
index 698cf2d6f3..ae5cbc9c5a 100644
--- a/lib/snmp/test/snmp_conf_SUITE.erl
+++ b/lib/snmp/test/snmp_conf_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -181,7 +181,7 @@ init_per_testcase(fd_leak_check = _Case, Config) when is_list(Config) ->
%% Something strange happens when we use pfiles from within erlang,
%% so skip the test for now
- %% For some reason even though 'which' exists (atleast in
+ %% For some reason even though 'which' exists (at least in
%% a tcsh shell), it hangs when called via os:cmd/1.
%% And type produces results that is not so easy to
%% "analyze". So, we 'try it' and know that it starts
@@ -239,14 +239,14 @@ check_mandatory(Config) when is_list(Config) ->
{b, mandatory},
{d, {value, 20202}},
{e, {value, "kalle"}}],
- ?line {ok, _L1} = verify_mandatory(A1, B1),
+ {ok, _L1} = verify_mandatory(A1, B1),
?DBG("check_mandatory -> L1: ~p", [L1]),
A2 = [{a, hej}, {c, 10}, {d, 10101}, {f, 10.88}],
B2 = [{a, {value, hejsan}},
{b, mandatory},
{d, {value, 20202}},
{e, {value, "kalle"}}],
- ?line ok = verify_not_mandatory(A2, B2),
+ ok = verify_not_mandatory(A2, B2),
ok.
verify_mandatory(A, B) ->
@@ -283,16 +283,16 @@ verify_not_mandatory(A, B) ->
check_integer1(suite) -> [];
check_integer1(Config) when is_list(Config) ->
?P(check_integer1),
- ?line ok = verify_int(0),
- ?line ok = verify_int(16#FF),
- ?line ok = verify_int(16#FFFF),
- ?line ok = verify_int(16#FFFFFFFF),
- ?line ok = verify_int(-1),
- ?line ok = verify_int(-333),
+ ok = verify_int(0),
+ ok = verify_int(16#FF),
+ ok = verify_int(16#FFFF),
+ ok = verify_int(16#FFFFFFFF),
+ ok = verify_int(-1),
+ ok = verify_int(-333),
- ?line ok = verify_not_int("kalle & hobbe"),
- ?line ok = verify_not_int(kalle_och_hobbe),
- ?line ok = verify_not_int(1.5),
+ ok = verify_not_int("kalle & hobbe"),
+ ok = verify_not_int(kalle_och_hobbe),
+ ok = verify_not_int(1.5),
ok.
@@ -318,49 +318,49 @@ check_integer2(suite) -> [];
check_integer2(Config) when is_list(Config) ->
?P(check_integer2),
- ?line ok = verify_int(0, any),
- ?line ok = verify_int(-22222, any),
- ?line ok = verify_int(33333, any),
- ?line ok = verify_int(1, pos),
- ?line ok = verify_int(9999, pos),
- ?line ok = verify_int(-1, neg),
- ?line ok = verify_int(-9999, neg),
- ?line ok = verify_int(1, {gt, 0}),
- ?line ok = verify_int(88888, {gt, -255}),
- ?line ok = verify_int(88888, {gte, -255}),
- ?line ok = verify_int(88888, {gte, 88888}),
- ?line ok = verify_int(88888, {lt, 88889}),
- ?line ok = verify_int(88888, {lte, 88888}),
- ?line ok = verify_int(88888, {eq, 88888}),
- ?line ok = verify_int(88888, {range, 88887,88889}),
-
- ?line ok = verify_not_int("kalle & hobbe", any),
- ?line ok = verify_not_int(kalle_och_hobbe, any),
- ?line ok = verify_not_int(1.5, any),
-
- ?line ok = verify_not_int(0, pos),
- ?line ok = verify_not_int(-22222, pos),
- ?line ok = verify_not_int(33333, neg),
- ?line ok = verify_not_int(0, {gt, 0}),
- ?line ok = verify_not_int(33333, {gt, 99999}),
- ?line ok = verify_not_int(33333, {gt, 33333}),
- ?line ok = verify_not_int(33333, {gte, 33334}),
- ?line ok = verify_not_int(33333, {lt, 33333}),
- ?line ok = verify_not_int(33333, {lte, 33332}),
- ?line ok = verify_not_int(33333, {eq, 33332}),
- ?line ok = verify_not_int(33333, {eq, -33333}),
- ?line ok = verify_not_int(33333, {range, 33334, 33338}),
- ?line ok = verify_not_int(33339, {range, 33334, 33338}),
- ?line ok = verify_not_int(33333, {gt, kalle}),
- ?line ok = verify_not_int(33333, {gt, 1.55}),
- ?line ok = verify_not_int(33333, {gte, "hejsan"}),
- ?line ok = verify_not_int(33333, {lt, hobbe}),
- ?line ok = verify_not_int(33333, {lte, 1.7666}),
- ?line ok = verify_not_int(33333, {eq, 33333.0}),
- ?line ok = verify_not_int(33333, {eq, -33333.0}),
- ?line ok = verify_not_int(33333, {range, kalle, 33338}),
- ?line ok = verify_not_int(33339, {range, 33334, kalle}),
- ?line ok = verify_not_int(33339, {kalle, 33334, kalle}),
+ ok = verify_int(0, any),
+ ok = verify_int(-22222, any),
+ ok = verify_int(33333, any),
+ ok = verify_int(1, pos),
+ ok = verify_int(9999, pos),
+ ok = verify_int(-1, neg),
+ ok = verify_int(-9999, neg),
+ ok = verify_int(1, {gt, 0}),
+ ok = verify_int(88888, {gt, -255}),
+ ok = verify_int(88888, {gte, -255}),
+ ok = verify_int(88888, {gte, 88888}),
+ ok = verify_int(88888, {lt, 88889}),
+ ok = verify_int(88888, {lte, 88888}),
+ ok = verify_int(88888, {eq, 88888}),
+ ok = verify_int(88888, {range, 88887,88889}),
+
+ ok = verify_not_int("kalle & hobbe", any),
+ ok = verify_not_int(kalle_och_hobbe, any),
+ ok = verify_not_int(1.5, any),
+
+ ok = verify_not_int(0, pos),
+ ok = verify_not_int(-22222, pos),
+ ok = verify_not_int(33333, neg),
+ ok = verify_not_int(0, {gt, 0}),
+ ok = verify_not_int(33333, {gt, 99999}),
+ ok = verify_not_int(33333, {gt, 33333}),
+ ok = verify_not_int(33333, {gte, 33334}),
+ ok = verify_not_int(33333, {lt, 33333}),
+ ok = verify_not_int(33333, {lte, 33332}),
+ ok = verify_not_int(33333, {eq, 33332}),
+ ok = verify_not_int(33333, {eq, -33333}),
+ ok = verify_not_int(33333, {range, 33334, 33338}),
+ ok = verify_not_int(33339, {range, 33334, 33338}),
+ ok = verify_not_int(33333, {gt, kalle}),
+ ok = verify_not_int(33333, {gt, 1.55}),
+ ok = verify_not_int(33333, {gte, "hejsan"}),
+ ok = verify_not_int(33333, {lt, hobbe}),
+ ok = verify_not_int(33333, {lte, 1.7666}),
+ ok = verify_not_int(33333, {eq, 33333.0}),
+ ok = verify_not_int(33333, {eq, -33333.0}),
+ ok = verify_not_int(33333, {range, kalle, 33338}),
+ ok = verify_not_int(33339, {range, 33334, kalle}),
+ ok = verify_not_int(33339, {kalle, 33334, kalle}),
ok.
@@ -385,10 +385,10 @@ verify_not_int(Val, Cond) ->
check_string1(suite) -> [];
check_string1(Config) when is_list(Config) ->
?P(check_string1),
- ?line ok = verify_string("kalle & hobbe"),
- ?line ok = verify_not_string(kalle_hobbe),
- ?line ok = verify_not_string(1000),
- ?line ok = verify_not_string(1.0),
+ ok = verify_string("kalle & hobbe"),
+ ok = verify_not_string(kalle_hobbe),
+ ok = verify_not_string(1000),
+ ok = verify_not_string(1.0),
ok.
verify_string(Val) ->
@@ -414,21 +414,21 @@ check_string2(suite) -> [];
check_string2(Config) when is_list(Config) ->
?P(check_string2),
Str = "kalle & hobbe",
- ?line ok = verify_string(Str, any),
- ?line ok = verify_string(Str, {gt, length(Str) - 1}),
- ?line ok = verify_string(Str, {gte, length(Str)}),
- ?line ok = verify_string(Str, {lt, length(Str) + 1}),
- ?line ok = verify_string(Str, {lte, length(Str)}),
- ?line ok = verify_string(Str, length(Str)),
-
- ?line ok = verify_not_string(kalle_hobbe, any),
- ?line ok = verify_not_string(1000, any),
- ?line ok = verify_not_string(1.0, any),
- ?line ok = verify_not_string(Str, {gt, length(Str)}),
- ?line ok = verify_not_string(Str, {gte, length(Str) + 1}),
- ?line ok = verify_not_string(Str, {lt, length(Str)}),
- ?line ok = verify_not_string(Str, {lte, length(Str) - 1}),
- ?line ok = verify_not_string(Str, length(Str) + 1),
+ ok = verify_string(Str, any),
+ ok = verify_string(Str, {gt, length(Str) - 1}),
+ ok = verify_string(Str, {gte, length(Str)}),
+ ok = verify_string(Str, {lt, length(Str) + 1}),
+ ok = verify_string(Str, {lte, length(Str)}),
+ ok = verify_string(Str, length(Str)),
+
+ ok = verify_not_string(kalle_hobbe, any),
+ ok = verify_not_string(1000, any),
+ ok = verify_not_string(1.0, any),
+ ok = verify_not_string(Str, {gt, length(Str)}),
+ ok = verify_not_string(Str, {gte, length(Str) + 1}),
+ ok = verify_not_string(Str, {lt, length(Str)}),
+ ok = verify_not_string(Str, {lte, length(Str) - 1}),
+ ok = verify_not_string(Str, length(Str) + 1),
ok.
verify_string(Val, Limit) ->
@@ -454,10 +454,10 @@ check_atom(suite) -> [];
check_atom(Config) when is_list(Config) ->
?P(check_atom),
Atoms = [{kalle, "kalle"}, {hobbe, "hobbe"}, {dummy, "dummy"}],
- ?line ok = verify_atom(kalle, Atoms),
- ?line ok = verify_not_atom(anka, Atoms),
- ?line ok = verify_not_atom("kalle", Atoms),
- ?line ok = verify_not_atom(1000, Atoms),
+ ok = verify_atom(kalle, Atoms),
+ ok = verify_not_atom(anka, Atoms),
+ ok = verify_not_atom("kalle", Atoms),
+ ok = verify_not_atom(1000, Atoms),
ok.
verify_atom(Val, Atoms) ->
@@ -482,13 +482,13 @@ verify_not_atom(Val, Atoms) ->
check_ip(suite) -> [];
check_ip(Config) when is_list(Config) ->
?P(check_ip),
- ?line ok = verify_ip([1,2,3,4]),
- ?line ok = verify_not_ip([1,2,3]),
- ?line ok = verify_not_ip([1,2,3,4,5]),
- ?line ok = verify_not_ip(kalle),
- ?line ok = verify_not_ip(1000),
- ?line ok = verify_not_ip([1,2,3.0,4]),
- ?line ok = verify_not_ip([1,two,3,4]),
+ ok = verify_ip([1,2,3,4]),
+ ok = verify_not_ip([1,2,3]),
+ ok = verify_not_ip([1,2,3,4,5]),
+ ok = verify_not_ip(kalle),
+ ok = verify_not_ip(1000),
+ ok = verify_not_ip([1,2,3.0,4]),
+ ok = verify_not_ip([1,two,3,4]),
ok.
verify_ip(Val) ->
@@ -515,13 +515,13 @@ verify_not_ip(Val) ->
check_taddress(suite) -> [];
check_taddress(Config) when is_list(Config) ->
?P(check_taddress),
- ?line ok = verify_taddress([1,2,3,4,5,6]),
- ?line ok = verify_not_taddress([1,2,3,4,5]),
- ?line ok = verify_not_taddress([1,2,3,4,5,6,7]),
- ?line ok = verify_not_taddress(kalle),
- ?line ok = verify_not_taddress(1000),
- ?line ok = verify_not_taddress([1,2,3.0,4,5,6]),
- ?line ok = verify_not_taddress([1,two,3,4,5,6]),
+ ok = verify_taddress([1,2,3,4,5,6]),
+ ok = verify_not_taddress([1,2,3,4,5]),
+ ok = verify_not_taddress([1,2,3,4,5,6,7]),
+ ok = verify_not_taddress(kalle),
+ ok = verify_not_taddress(1000),
+ ok = verify_not_taddress([1,2,3.0,4,5,6]),
+ ok = verify_not_taddress([1,two,3,4,5,6]),
ok.
verify_taddress(Val) ->
@@ -548,15 +548,15 @@ check_packet_size(Config) when is_list(Config) ->
?P(check_packet_size),
Min = 484,
Max = 2147483647,
- ?line ok = verify_packet_size(Min),
- ?line ok = verify_packet_size(2*Min),
- ?line ok = verify_packet_size(Max),
- ?line ok = verify_not_packet_size(Min-1),
- ?line ok = verify_not_packet_size(Max+1),
- ?line ok = verify_not_packet_size(kalle),
- ?line ok = verify_not_packet_size("kalle"),
- ?line ok = verify_not_packet_size(1.0),
- ?line ok = verify_not_packet_size(1.0*Max),
+ ok = verify_packet_size(Min),
+ ok = verify_packet_size(2*Min),
+ ok = verify_packet_size(Max),
+ ok = verify_not_packet_size(Min-1),
+ ok = verify_not_packet_size(Max+1),
+ ok = verify_not_packet_size(kalle),
+ ok = verify_not_packet_size("kalle"),
+ ok = verify_not_packet_size(1.0),
+ ok = verify_not_packet_size(1.0*Max),
ok.
verify_packet_size(Val) ->
@@ -583,14 +583,14 @@ check_oid(Config) when is_list(Config) ->
?P(check_oid),
[_,_|Rest] = ?otpSnmpeaModule,
ErrOid = [6,16|Rest],
- ?line ok = verify_oid(?system),
- ?line ok = verify_oid(?sysDescr_instance),
- ?line ok = verify_oid(?otpSnmpeaModule),
- ?line ok = verify_not_oid(kalle),
- ?line ok = verify_not_oid("kalle"),
- ?line ok = verify_not_oid(1000),
- ?line ok = verify_not_oid(1.0),
- ?line ok = verify_not_oid(ErrOid),
+ ok = verify_oid(?system),
+ ok = verify_oid(?sysDescr_instance),
+ ok = verify_oid(?otpSnmpeaModule),
+ ok = verify_not_oid(kalle),
+ ok = verify_not_oid("kalle"),
+ ok = verify_not_oid(1000),
+ ok = verify_not_oid(1.0),
+ ok = verify_not_oid(ErrOid),
ok.
verify_oid(Val) ->
@@ -618,15 +618,15 @@ check_sec_model1(Config) when is_list(Config) ->
Exclude1 = [],
Exclude2 = [v1],
Exclude3 = [v1,usm],
- ?line ok = verify_sec_model(any, Exclude1),
- ?line ok = verify_sec_model(v1, Exclude1),
- ?line ok = verify_sec_model(v2c, Exclude1),
- ?line ok = verify_sec_model(usm, Exclude1),
- ?line ok = verify_sec_model(any, Exclude2),
- ?line ok = verify_sec_model(v2c, Exclude2),
- ?line ok = verify_not_sec_model(v1, Exclude2),
- ?line ok = verify_not_sec_model(v1, Exclude3),
- ?line ok = verify_not_sec_model(usm, Exclude3),
+ ok = verify_sec_model(any, Exclude1),
+ ok = verify_sec_model(v1, Exclude1),
+ ok = verify_sec_model(v2c, Exclude1),
+ ok = verify_sec_model(usm, Exclude1),
+ ok = verify_sec_model(any, Exclude2),
+ ok = verify_sec_model(v2c, Exclude2),
+ ok = verify_not_sec_model(v1, Exclude2),
+ ok = verify_not_sec_model(v1, Exclude3),
+ ok = verify_not_sec_model(usm, Exclude3),
ok.
verify_sec_model(Val, Exclude) ->
@@ -651,24 +651,24 @@ verify_not_sec_model(Val, Exclude) ->
check_sec_model2(suite) -> [];
check_sec_model2(Config) when is_list(Config) ->
?P(check_sec_model2),
- ?line ok = verify_sec_model(v1, v1, []),
- ?line ok = verify_sec_model(v1, v1, [v2c]),
- ?line ok = verify_sec_model(v2c, v2c, []),
- ?line ok = verify_sec_model(v2c, v2c, [v1]),
- ?line ok = verify_sec_model(v3, usm, []),
- ?line ok = verify_sec_model(v3, usm, [v2c]),
- ?line ok = verify_not_sec_model(v1, v2c, []),
- ?line ok = verify_not_sec_model(v1, v3, [v2c]),
- ?line ok = verify_not_sec_model(v1, v1, [v1]),
- ?line ok = verify_not_sec_model(v2c, v1, []),
- ?line ok = verify_not_sec_model(v2c, v3, [v3]),
- ?line ok = verify_not_sec_model(v2c, v2c, [v2c]),
- ?line ok = verify_not_sec_model(v3, v1, []),
- ?line ok = verify_not_sec_model(v3, v2c, [v1]),
- ?line ok = verify_not_sec_model(v3, v3, [v2c]),
- ?line ok = verify_not_sec_model(kalle, v3, []),
- ?line ok = verify_not_sec_model(1000, v3, []),
- ?line ok = verify_not_sec_model(1.0, v3, []),
+ ok = verify_sec_model(v1, v1, []),
+ ok = verify_sec_model(v1, v1, [v2c]),
+ ok = verify_sec_model(v2c, v2c, []),
+ ok = verify_sec_model(v2c, v2c, [v1]),
+ ok = verify_sec_model(v3, usm, []),
+ ok = verify_sec_model(v3, usm, [v2c]),
+ ok = verify_not_sec_model(v1, v2c, []),
+ ok = verify_not_sec_model(v1, v3, [v2c]),
+ ok = verify_not_sec_model(v1, v1, [v1]),
+ ok = verify_not_sec_model(v2c, v1, []),
+ ok = verify_not_sec_model(v2c, v3, [v3]),
+ ok = verify_not_sec_model(v2c, v2c, [v2c]),
+ ok = verify_not_sec_model(v3, v1, []),
+ ok = verify_not_sec_model(v3, v2c, [v1]),
+ ok = verify_not_sec_model(v3, v3, [v2c]),
+ ok = verify_not_sec_model(kalle, v3, []),
+ ok = verify_not_sec_model(1000, v3, []),
+ ok = verify_not_sec_model(1.0, v3, []),
ok.
@@ -694,13 +694,13 @@ verify_not_sec_model(M1, M2, Exclude) ->
check_sec_level(suite) -> [];
check_sec_level(Config) when is_list(Config) ->
?P(check_sec_level),
- ?line ok = verify_sec_level(noAuthNoPriv),
- ?line ok = verify_sec_level(authNoPriv),
- ?line ok = verify_sec_level(authPriv),
- ?line ok = verify_not_sec_level(kalle),
- ?line ok = verify_not_sec_level("noAuthNoPriv"),
- ?line ok = verify_not_sec_level(1000),
- ?line ok = verify_not_sec_level(1.0),
+ ok = verify_sec_level(noAuthNoPriv),
+ ok = verify_sec_level(authNoPriv),
+ ok = verify_sec_level(authPriv),
+ ok = verify_not_sec_level(kalle),
+ ok = verify_not_sec_level("noAuthNoPriv"),
+ ok = verify_not_sec_level(1000),
+ ok = verify_not_sec_level(1.0),
ok.
@@ -730,30 +730,30 @@ verify_not_sec_level(Val) ->
check_timer(suite) -> [];
check_timer(Config) when is_list(Config) ->
?P(check_timer),
- ?line ok = verify_timer(infinity),
- ?line ok = verify_timer(1),
- ?line ok = verify_timer(10),
- ?line ok = verify_timer(2147483647),
- ?line ok = verify_timer(2*2147483647),
- ?line ok = verify_timer({1,1,0,0}),
- ?line ok = verify_timer({10,10,10,10}),
- ?line ok = verify_timer({2147483647,2147483647,2147483647,2147483647}),
- ?line ok = verify_not_timer(ytinifni),
- ?line ok = verify_not_timer("ytinifni"),
- ?line ok = verify_not_timer(0),
- ?line ok = verify_not_timer(-10),
- ?line ok = verify_not_timer({0,1,0,0}),
- ?line ok = verify_not_timer({1,0,0,0}),
- ?line ok = verify_not_timer({1,1,-1,0}),
- ?line ok = verify_not_timer({1,1,0,-1}),
- ?line ok = verify_not_timer({1.0,1,0,0}),
- ?line ok = verify_not_timer({1,1.0,0,0}),
- ?line ok = verify_not_timer({1,1,1.0,0}),
- ?line ok = verify_not_timer({1,1,0,1.0}),
- ?line ok = verify_not_timer({"1",1,0,0}),
- ?line ok = verify_not_timer({1,"1",0,0}),
- ?line ok = verify_not_timer({1,1,"0",0}),
- ?line ok = verify_not_timer({1,1,0,"0"}),
+ ok = verify_timer(infinity),
+ ok = verify_timer(1),
+ ok = verify_timer(10),
+ ok = verify_timer(2147483647),
+ ok = verify_timer(2*2147483647),
+ ok = verify_timer({1,1,0,0}),
+ ok = verify_timer({10,10,10,10}),
+ ok = verify_timer({2147483647,2147483647,2147483647,2147483647}),
+ ok = verify_not_timer(ytinifni),
+ ok = verify_not_timer("ytinifni"),
+ ok = verify_not_timer(0),
+ ok = verify_not_timer(-10),
+ ok = verify_not_timer({0,1,0,0}),
+ ok = verify_not_timer({1,0,0,0}),
+ ok = verify_not_timer({1,1,-1,0}),
+ ok = verify_not_timer({1,1,0,-1}),
+ ok = verify_not_timer({1.0,1,0,0}),
+ ok = verify_not_timer({1,1.0,0,0}),
+ ok = verify_not_timer({1,1,1.0,0}),
+ ok = verify_not_timer({1,1,0,1.0}),
+ ok = verify_not_timer({"1",1,0,0}),
+ ok = verify_not_timer({1,"1",0,0}),
+ ok = verify_not_timer({1,1,"0",0}),
+ ok = verify_not_timer({1,1,0,"0"}),
ok.
verify_timer(Val) ->
diff --git a/lib/snmp/test/snmp_log_SUITE.erl b/lib/snmp/test/snmp_log_SUITE.erl
index caa7a10076..e4d8414506 100644
--- a/lib/snmp/test/snmp_log_SUITE.erl
+++ b/lib/snmp/test/snmp_log_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -169,7 +169,7 @@ init_per_testcase(Case, Config) when is_list(Config) ->
Error ->
?FAIL({failed_creating_subsuite_top_dir, Error})
end,
- ?line ok = file:make_dir(CaseDir),
+ ok = file:make_dir(CaseDir),
Dog = ?WD_START(?MINS(5)),
[{log_dir, CaseDir}, {watchdog, Dog}|Config].
@@ -199,11 +199,11 @@ open_and_close(Config) when is_list(Config) ->
File = join(Dir, "snmp_test.log"),
Size = {1024, 10},
Repair = true,
- ?line {ok, Log} = snmp_log:create(Name, File, Size, Repair),
- ?line ok = snmp_log:sync(Log),
- ?line {ok, Info} = snmp_log:info(Log),
+ {ok, Log} = snmp_log:create(Name, File, Size, Repair),
+ ok = snmp_log:sync(Log),
+ {ok, Info} = snmp_log:info(Log),
display_info(Info),
- ?line ok = snmp_log:close(Log).
+ ok = snmp_log:close(Log).
%%======================================================================
@@ -219,7 +219,7 @@ open_write_and_close1(Config) when is_list(Config) ->
?DBG("open_write_and_close1 -> start", []),
SeqNoGen = none,
- ?line ok = open_write_and_close(SeqNoGen, Config),
+ ok = open_write_and_close(SeqNoGen, Config),
?DBG("open_write_and_close1 -> done", []),
ok.
@@ -238,7 +238,7 @@ open_write_and_close2(Config) when is_list(Config) ->
?DBG("open_write_and_close2 -> start", []),
SeqNoGen = disabled,
- ?line ok = open_write_and_close(SeqNoGen, Config),
+ ok = open_write_and_close(SeqNoGen, Config),
?DBG("open_write_and_close2 -> done", []),
ok.
@@ -258,7 +258,7 @@ open_write_and_close3(Config) when is_list(Config) ->
seqno_init(),
SeqNoGen = {?MODULE, next_seqno, [10, 100]},
- ?line ok = open_write_and_close(SeqNoGen, Config),
+ ok = open_write_and_close(SeqNoGen, Config),
seqno_finish(),
?DBG("open_write_and_close2 -> done", []),
@@ -279,7 +279,7 @@ open_write_and_close4(Config) when is_list(Config) ->
seqno_init(),
SeqNoGen = fun() -> next_seqno(10, 100) end,
- ?line ok = open_write_and_close(SeqNoGen, Config),
+ ok = open_write_and_close(SeqNoGen, Config),
seqno_finish(),
?DBG("open_write_and_close2 -> done", []),
@@ -319,7 +319,7 @@ open_write_and_close(SeqNoGen, Config) ->
Repair = true,
?DBG("open_write_and_close -> create log", []),
- ?line {ok, Log} =
+ {ok, Log} =
case SeqNoGen of
none ->
snmp_log:create(Name, File, Size, Repair);
@@ -332,10 +332,10 @@ open_write_and_close(SeqNoGen, Config) ->
?DBG("open_write_and_close1 -> create messages to log", []),
%% A request
- ?line Req = get_next_request(Vsn, Community, [1,1], 1, 235779012),
+ Req = get_next_request(Vsn, Community, [1,1], 1, 235779012),
%% A reply
- ?line Rep = get_response(Vsn, Community,
+ Rep = get_response(Vsn, Community,
[1,3,6,1,2,1,1,1,0], 'OCTET STRING',
"Erlang SNMP agent", 1, 235779012),
@@ -348,17 +348,17 @@ open_write_and_close(SeqNoGen, Config) ->
Addr = ?LOCALHOST(),
Port = 162,
Logger = fun(Packet) ->
- ?line ok = snmp_log:log(Log, Packet, Addr, Port)
+ ok = snmp_log:log(Log, Packet, Addr, Port)
end,
lists:foreach(Logger, Msgs),
check_notify(),
?DBG("open_write_and_close1 -> display info", []),
- ?line {ok, Info} = snmp_log:info(Log),
+ {ok, Info} = snmp_log:info(Log),
display_info(Info),
?DBG("open_write_and_close1 -> close log", []),
- ?line ok = snmp_log:close(Log),
+ ok = snmp_log:close(Log),
?DBG("open_write_and_close -> done", []),
ok.
@@ -381,7 +381,7 @@ log_to_io1(Config) when is_list(Config) ->
Size = {1024, 10},
Repair = true,
?DBG("log_to_io1 -> create log", []),
- ?line {ok, Log} = snmp_log:create(Name, File, Size, Repair),
+ {ok, Log} = snmp_log:create(Name, File, Size, Repair),
?DBG("log_to_io1 -> create messages to log", []),
Msgs = messages(),
@@ -390,7 +390,7 @@ log_to_io1(Config) when is_list(Config) ->
Addr = ?LOCALHOST(),
Port = 162,
Logger = fun(Packet) ->
- ?line ok = snmp_log:log(Log, Packet, Addr, Port)
+ ok = snmp_log:log(Log, Packet, Addr, Port)
end,
BatchLogger = fun(Time) ->
lists:foreach(Logger, Msgs),
@@ -403,14 +403,14 @@ log_to_io1(Config) when is_list(Config) ->
lists:foreach(BatchLogger, To),
?DBG("log_to_io1 -> display info", []),
- ?line {ok, Info} = snmp_log:info(Log),
+ {ok, Info} = snmp_log:info(Log),
display_info(Info),
?DBG("log_to_io1 -> do the convert to io (stdout)", []),
? line ok = snmp:log_to_io(Dir, [], Name, File, false),
?DBG("log_to_io1 -> close log", []),
- ?line ok = snmp_log:close(Log),
+ ok = snmp_log:close(Log),
?DBG("log_to_io1 -> done", []),
ok.
@@ -438,20 +438,20 @@ log_to_io2(Config) when is_list(Config) ->
Repair = true,
?DBG("log_to_io2 -> create log writer process", []),
- ?line {ok, Log, Logger} =
+ {ok, Log, Logger} =
log_writer_start(Name, File, Size, Repair, Factor),
?DBG("log_to_io2 -> create log reader process", []),
- ?line {ok, Reader} = log_reader_start(),
+ {ok, Reader} = log_reader_start(),
?DBG("log_to_io2 -> wait some time", []),
?SLEEP(5000),
?DBG("log_to_io2 -> display log info", []),
- ?line log_writer_info(Logger),
+ log_writer_info(Logger),
?DBG("log_to_io2 -> instruct the log writer to sleep some", []),
- ?line ok = log_writer_sleep(Logger, 5000),
+ ok = log_writer_sleep(Logger, 5000),
?DBG("log_to_io2 -> instruct the log reader to log to io", []),
Res =
@@ -470,14 +470,14 @@ log_to_io2(Config) when is_list(Config) ->
?DBG("log_to_io2 -> log to io failed: "
"~n Error: ~p"
"~n Info: ~p", [Error, Info]),
- ?line ?FAIL({log_lo_io_failed, Error, Info})
+ ?FAIL({log_lo_io_failed, Error, Info})
end,
?DBG("log_to_io2 -> instruct the log writer to stop", []),
- ?line log_writer_stop(Logger),
+ log_writer_stop(Logger),
?DBG("log_to_io2 -> instruct the log reader to stop", []),
- ?line log_reader_stop(Reader),
+ log_reader_stop(Reader),
?DBG("log_to_io2 -> done", []),
ok.
@@ -494,7 +494,7 @@ log_to_txt1(Config) when is_list(Config) ->
Name = "snmp_test_l2t1",
SeqNoGen = disabled,
- ?line ok = log_to_txt(Name, SeqNoGen, Config),
+ ok = log_to_txt(Name, SeqNoGen, Config),
?DBG("log_to_txt1 -> done", []),
ok.
@@ -513,7 +513,7 @@ log_to_txt2(Config) when is_list(Config) ->
Name = "snmp_test_l2t2",
seqno_init(),
SeqNoGen = {?MODULE, next_seqno, [1, 100]},
- ?line ok = log_to_txt(Name, SeqNoGen, Config),
+ ok = log_to_txt(Name, SeqNoGen, Config),
seqno_finish(),
?DBG("log_to_txt2 -> done", []),
@@ -531,7 +531,7 @@ log_to_txt(Name, SeqNoGen, Config) when is_list(Config) ->
Repair = true,
?DBG("log_to_txt -> create log", []),
- ?line {ok, Log} =
+ {ok, Log} =
case SeqNoGen of
none ->
snmp_log:create(Name, File, Size, Repair);
@@ -546,7 +546,7 @@ log_to_txt(Name, SeqNoGen, Config) when is_list(Config) ->
Addr = ?LOCALHOST(),
Port = 162,
Logger = fun(Packet) ->
- ?line ok = snmp_log:log(Log, Packet, Addr, Port)
+ ok = snmp_log:log(Log, Packet, Addr, Port)
end,
BatchLogger = fun(Time) ->
lists:foreach(Logger, Msgs),
@@ -561,22 +561,22 @@ log_to_txt(Name, SeqNoGen, Config) when is_list(Config) ->
Stop = calendar:local_time(),
?DBG("log_to_txt -> display info", []),
- ?line {ok, Info} = snmp_log:info(Log),
+ {ok, Info} = snmp_log:info(Log),
display_info(Info),
Out1a = join(Dir, "snmp_text-1-unblocked.txt"),
?DBG("log_to_txt -> do the convert to a text file (~s) unblocked", [Out1a]),
- ?line ok = snmp:log_to_txt(Dir, [], Out1a, Log, File, false),
+ ok = snmp:log_to_txt(Dir, [], Out1a, Log, File, false),
- ?line {ok, #file_info{size = Size1a}} = file:read_file_info(Out1a),
+ {ok, #file_info{size = Size1a}} = file:read_file_info(Out1a),
?DBG("log_to_txt -> text file size: ~p", [Size1a]),
validate_size(Size1a),
Out1b = join(Dir, "snmp_text-1-blocked.txt"),
?DBG("log_to_txt -> do the convert to a text file (~s) blocked", [Out1b]),
- ?line ok = snmp:log_to_txt(Dir, [], Out1b, Log, File, true),
+ ok = snmp:log_to_txt(Dir, [], Out1b, Log, File, true),
- ?line {ok, #file_info{size = Size1b}} = file:read_file_info(Out1b),
+ {ok, #file_info{size = Size1b}} = file:read_file_info(Out1b),
?DBG("log_to_txt -> text file size: ~p", [Size1b]),
validate_size(Size1b, {eq, Size1a}),
@@ -585,9 +585,9 @@ log_to_txt(Name, SeqNoGen, Config) when is_list(Config) ->
"~n Start: ~p"
"~n Stop: ~p"
"~n Out2: ~p", [Start, Stop, Out2]),
- ?line ok = snmp:log_to_txt(Dir, [], Out2, Log, File, Start, Stop),
+ ok = snmp:log_to_txt(Dir, [], Out2, Log, File, Start, Stop),
- ?line {ok, #file_info{size = Size2}} = file:read_file_info(Out2),
+ {ok, #file_info{size = Size2}} = file:read_file_info(Out2),
?DBG("log_to_txt -> text file size: ~p", [Size2]),
validate_size(Size2, {le, Size1a}),
@@ -615,14 +615,14 @@ log_to_txt(Name, SeqNoGen, Config) when is_list(Config) ->
"~n Start2: ~p"
"~n Stop2: ~p"
"~n Out3: ~p", [Start2, Stop2, Out3]),
- ?line ok = snmp:log_to_txt(Dir, [], Out3, Log, File, Start2, Stop2),
+ ok = snmp:log_to_txt(Dir, [], Out3, Log, File, Start2, Stop2),
- ?line {ok, #file_info{size = Size3}} = file:read_file_info(Out3),
+ {ok, #file_info{size = Size3}} = file:read_file_info(Out3),
?DBG("log_to_txt -> text file size: ~p", [Size3]),
validate_size(Size3, {l, Size1a}),
?DBG("log_to_txt -> close log", []),
- ?line ok = snmp_log:close(Log),
+ ok = snmp_log:close(Log),
?DBG("log_to_txt -> done", []),
ok.
@@ -659,20 +659,20 @@ log_to_txt3(Config) when is_list(Config) ->
Mibs = [join(StdMibDir, "SNMPv2-MIB")],
?DBG("log_to_txt3 -> create log writer process", []),
- ?line {ok, Log, Logger} =
+ {ok, Log, Logger} =
log_writer_start(Name, LogFile, Size, Repair, Factor),
?DBG("log_to_txt3 -> create log reader process", []),
- ?line {ok, Reader} = log_reader_start(),
+ {ok, Reader} = log_reader_start(),
?DBG("log_to_txt3 -> wait some time", []),
?SLEEP(5000),
?DBG("log_to_txt3 -> display log info", []),
- ?line log_writer_info(Logger),
+ log_writer_info(Logger),
?DBG("log_to_txt3 -> instruct the log writer to sleep some", []),
- ?line ok = log_writer_sleep(Logger, 5000),
+ ok = log_writer_sleep(Logger, 5000),
?DBG("log_to_txt3 -> instruct the log reader to log to txt", []),
Res =
@@ -690,7 +690,7 @@ log_to_txt3(Config) when is_list(Config) ->
case Res of
{ok, _Info} ->
?DBG("log_to_txt3 -> ~n Info: ~p", [_Info]),
- ?line {ok, #file_info{size = FileSize}} =
+ {ok, #file_info{size = FileSize}} =
file:read_file_info(TxtFile),
?DBG("log_to_txt3 -> text file size: ~p", [FileSize]),
validate_size(FileSize);
@@ -698,14 +698,14 @@ log_to_txt3(Config) when is_list(Config) ->
?EPRINT("log to txt failed: "
"~n Error: ~p"
"~n Info: ~p", [Error, Info]),
- ?line ?FAIL({log_lo_txt_failed, Error, Info})
+ ?FAIL({log_lo_txt_failed, Error, Info})
end,
?DBG("log_to_txt3 -> instruct the log writer to stop", []),
- ?line log_writer_stop(Logger),
+ log_writer_stop(Logger),
?DBG("log_to_txt3 -> instruct the log reader to stop", []),
- ?line log_reader_stop(Reader),
+ log_reader_stop(Reader),
?IPRINT("log_to_txt3 -> done", []),
ok.
@@ -801,7 +801,7 @@ log_writer_main(Name, File, Size, Repair, P, Factor) ->
Addr = ?LOCALHOST(),
Port = 162,
Logger = fun(Packet) ->
- ?line ok = snmp_log:log(Log, Packet, Addr, Port)
+ ok = snmp_log:log(Log, Packet, Addr, Port)
end,
BatchLogger = fun(Time) ->
lists:foreach(Logger, Msgs),
diff --git a/lib/snmp/test/snmp_manager_SUITE.erl b/lib/snmp/test/snmp_manager_SUITE.erl
index fc4d73ac7f..51b45d9ec4 100644
--- a/lib/snmp/test/snmp_manager_SUITE.erl
+++ b/lib/snmp/test/snmp_manager_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -62,9 +62,9 @@
register_user1/1,
- register_agent_old/1,
- register_agent2/1,
- register_agent3/1,
+ register_agent_old/0, register_agent_old/1,
+ register_agent2/0, register_agent2/1,
+ register_agent3/0, register_agent3/1,
info/1,
usm_priv_aes/1,
@@ -73,30 +73,30 @@
usm_sha384_priv_aes/1,
usm_sha512_priv_aes/1,
- simple_sync_get3/1,
- simple_async_get3/1,
+ simple_sync_get3/0, simple_sync_get3/1,
+ simple_async_get3/0, simple_async_get3/1,
- simple_sync_get_next3/1,
- simple_async_get_next3_cbp_def/1,
- simple_async_get_next3_cbp_temp/1,
- simple_async_get_next3_cbp_perm/1,
+ simple_sync_get_next3/0, simple_sync_get_next3/1,
+ simple_async_get_next3_cbp_def/0, simple_async_get_next3_cbp_def/1,
+ simple_async_get_next3_cbp_temp/0, simple_async_get_next3_cbp_temp/1,
+ simple_async_get_next3_cbp_perm/0, simple_async_get_next3_cbp_perm/1,
- simple_sync_set3/1,
- simple_async_set3_cbp_def/1,
- simple_async_set3_cbp_temp/1,
- simple_async_set3_cbp_perm/1,
+ simple_sync_set3/0, simple_sync_set3/1,
+ simple_async_set3_cbp_def/0, simple_async_set3_cbp_def/1,
+ simple_async_set3_cbp_temp/0, simple_async_set3_cbp_temp/1,
+ simple_async_set3_cbp_perm/0, simple_async_set3_cbp_perm/1,
- simple_sync_get_bulk3/1,
- simple_async_get_bulk3_cbp_def/1,
- simple_async_get_bulk3_cbp_temp/1,
- simple_async_get_bulk3_cbp_perm/1,
-
- simple_v3_exchange_md5/1,
- simple_v3_exchange_sha/1,
- simple_v3_exchange_sha224/1,
- simple_v3_exchange_sha256/1,
- simple_v3_exchange_sha384/1,
- simple_v3_exchange_sha512/1,
+ simple_sync_get_bulk3/0, simple_sync_get_bulk3/1,
+ simple_async_get_bulk3_cbp_def/0, simple_async_get_bulk3_cbp_def/1,
+ simple_async_get_bulk3_cbp_temp/0, simple_async_get_bulk3_cbp_temp/1,
+ simple_async_get_bulk3_cbp_perm/0, simple_async_get_bulk3_cbp_perm/1,
+
+ simple_v3_exchange_md5/0, simple_v3_exchange_md5/1,
+ simple_v3_exchange_sha/0, simple_v3_exchange_sha/1,
+ simple_v3_exchange_sha224/0, simple_v3_exchange_sha224/1,
+ simple_v3_exchange_sha256/0, simple_v3_exchange_sha256/1,
+ simple_v3_exchange_sha384/0, simple_v3_exchange_sha384/1,
+ simple_v3_exchange_sha512/0, simple_v3_exchange_sha512/1,
discovery/1,
@@ -113,9 +113,9 @@
report/1,
- otp8015_1/1,
+ otp8015_1/0, otp8015_1/1,
- otp8395_1/1
+ otp8395_1/0, otp8395_1/1
]).
@@ -156,7 +156,7 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
- %% This is a temporary messure to ensure that we can
+ %% This is a temporary measure to ensure that we can
%% test the socket backend without effecting *all*
%% applications on *all* machines.
%% This flag is set only for *one* host.
@@ -577,7 +577,7 @@ init_per_testcase(Case, Config) when is_list(Config) ->
{skip, {Reason, Mod, Line}};
C:E:_ when ((C =:= throw) orelse
(C =:= exit)) ->
- {skip, {catched, C, E}}
+ {skip, {caught, C, E}}
end
end,
?IPRINT("init_per_testcase end when"
@@ -598,29 +598,29 @@ init_per_testcase2(Case, Config) ->
MgrTopDir = filename:join(CaseTopDir, "manager/"),
?DBG("init_per_testcase2 -> try create manager top dir: ~n~p",
[MgrTopDir]),
- ?line ok = file:make_dir(MgrTopDir),
+ ok = file:make_dir(MgrTopDir),
MgrConfDir = filename:join(MgrTopDir, "conf/"),
- ?line ok = file:make_dir(MgrConfDir),
+ ok = file:make_dir(MgrConfDir),
MgrDbDir = filename:join(MgrTopDir, "db/"),
- ?line ok = file:make_dir(MgrDbDir),
+ ok = file:make_dir(MgrDbDir),
MgrLogDir = filename:join(MgrTopDir, "log/"),
- ?line ok = file:make_dir(MgrLogDir),
+ ok = file:make_dir(MgrLogDir),
%% -- Agent dirs --
AgTopDir = filename:join(CaseTopDir, "agent/"),
- ?line ok = file:make_dir(AgTopDir),
+ ok = file:make_dir(AgTopDir),
AgConfDir = filename:join(AgTopDir, "conf/"),
- ?line ok = file:make_dir(AgConfDir),
+ ok = file:make_dir(AgConfDir),
AgDbDir = filename:join(AgTopDir, "db/"),
- ?line ok = file:make_dir(AgDbDir),
+ ok = file:make_dir(AgDbDir),
AgLogDir = filename:join(AgTopDir, "log/"),
- ?line ok = file:make_dir(AgLogDir),
+ ok = file:make_dir(AgLogDir),
Family = proplists:get_value(ipfamily, Config, inet),
@@ -654,18 +654,18 @@ init_per_testcase2(Case, Config) ->
?DBG("init [~w] Nodes [2]: ~p", [Case, erlang:nodes()]),
Conf2.
-init_per_testcase3(simple_v3_exchange_md5 = _Case, Config) ->
- init_v3_testcase([{auth_alg, md5} | Config]);
-init_per_testcase3(simple_v3_exchange_sha = _Case, Config) ->
- init_v3_testcase([{auth_alg, sha} | Config]);
-init_per_testcase3(simple_v3_exchange_sha224 = _Case, Config) ->
- init_v3_testcase([{auth_alg, sha224} | Config]);
-init_per_testcase3(simple_v3_exchange_sha256 = _Case, Config) ->
- init_v3_testcase([{auth_alg, sha256} | Config]);
-init_per_testcase3(simple_v3_exchange_sha384 = _Case, Config) ->
- init_v3_testcase([{auth_alg, sha384} | Config]);
-init_per_testcase3(simple_v3_exchange_sha512 = _Case, Config) ->
- init_v3_testcase([{auth_alg, sha512} | Config]);
+init_per_testcase3(simple_v3_exchange_md5 = Case, Config) ->
+ init_v3_testcase(Case, [{auth_alg, md5} | Config]);
+init_per_testcase3(simple_v3_exchange_sha = Case, Config) ->
+ init_v3_testcase(Case, [{auth_alg, sha} | Config]);
+init_per_testcase3(simple_v3_exchange_sha224 = Case, Config) ->
+ init_v3_testcase(Case, [{auth_alg, sha224} | Config]);
+init_per_testcase3(simple_v3_exchange_sha256 = Case, Config) ->
+ init_v3_testcase(Case, [{auth_alg, sha256} | Config]);
+init_per_testcase3(simple_v3_exchange_sha384 = Case, Config) ->
+ init_v3_testcase(Case, [{auth_alg, sha384} | Config]);
+init_per_testcase3(simple_v3_exchange_sha512 = Case, Config) ->
+ init_v3_testcase(Case, [{auth_alg, sha512} | Config]);
init_per_testcase3(Case, Config) ->
ApiCases02 =
[
@@ -744,8 +744,8 @@ init_per_testcase3(Case, Config) ->
end,
%% We don't need to try catch this (init_agent)
%% since we have a try catch "higher up"...
- Conf3 = init_agent(Conf2),
- Conf4 = try init_manager(AutoInform, Conf3)
+ Conf3 = init_agent(Case, Conf2),
+ Conf4 = try init_manager(Case, AutoInform, Conf3)
catch AC:AE:_ ->
%% Ouch we need to clean up:
%% The init_agent starts an agent node!
@@ -771,9 +771,9 @@ init_per_testcase3(Case, Config) ->
Config
end.
-init_v3_testcase(Conf) ->
- Conf2 = init_v3_agent(Conf),
- Conf3 = try init_v3_manager(Conf2)
+init_v3_testcase(Case, Conf) ->
+ Conf2 = init_v3_agent(Case, Conf),
+ Conf3 = try init_v3_manager(Case, Conf2)
catch AC:AE:AS ->
%% Ouch we need to clean up:
%% The init_agent starts an agent node!
@@ -896,7 +896,6 @@ end_per_testcase2(Case, Config) ->
%% Test functions
%%======================================================================
-simple_start_and_stop1(suite) -> [];
simple_start_and_stop1(Config) when is_list(Config) ->
?TC_TRY(simple_start_and_stop1,
fun() -> do_simple_start_and_stop1(Config) end).
@@ -930,17 +929,16 @@ do_simple_start_and_stop1(Config) ->
%%======================================================================
-simple_start_and_stop2(suite) -> [];
simple_start_and_stop2(Config) when is_list(Config) ->
Pre = fun() ->
- ManagerNode = start_manager_node(),
+ ManagerNode = start_node(simple_start_and_stop2),
[ManagerNode]
end,
Case = fun(State) -> do_simple_start_and_stop2(State, Config) end,
- Post = fun([ManagerNode]) -> stop_node(ManagerNode) end,
+ Post = fun([{ManagerPeer, _ManagerNode}]) -> peer:stop(ManagerPeer) end,
?TC_TRY(simple_start_and_stop2, Pre, Case, Post).
-do_simple_start_and_stop2([ManagerNode], Config) ->
+do_simple_start_and_stop2([{_ManagerPeer, ManagerNode}], Config) ->
?IPRINT("starting with Config: "
"~n ~p"
"~n", [Config]),
@@ -958,20 +956,20 @@ do_simple_start_and_stop2([ManagerNode], Config) ->
?IPRINT("try load snmp application"),
- ?line ok = load_snmp(ManagerNode),
+ ok = load_snmp(ManagerNode),
?IPRINT("try set manager env for the snmp application"),
- ?line ok = set_mgr_env(ManagerNode, Opts),
+ ok = set_mgr_env(ManagerNode, Opts),
?IPRINT("try starting snmp application (with only manager)"),
- ?line ok = start_snmp(ManagerNode),
+ ok = start_snmp(ManagerNode),
?IPRINT("started"),
?SLEEP(1000),
?IPRINT("try stopping snmp application (with only manager)"),
- ?line ok = stop_snmp(ManagerNode),
+ ok = stop_snmp(ManagerNode),
?SLEEP(1000),
?IPRINT("end"),
@@ -981,7 +979,6 @@ do_simple_start_and_stop2([ManagerNode], Config) ->
%%======================================================================
-simple_start_and_stop3(suite) -> [];
simple_start_and_stop3(Config) when is_list(Config) ->
?TC_TRY(simple_start_and_stop3,
fun() -> do_simple_start_and_stop3(Config) end).
@@ -1021,7 +1018,6 @@ do_simple_start_and_stop3(Config) ->
%%======================================================================
-simple_start_and_monitor_crash1(suite) -> [];
simple_start_and_monitor_crash1(Config) when is_list(Config) ->
?TC_TRY(simple_start_and_monitor_crash1,
fun() -> do_simple_start_and_monitor_crash1(Config) end).
@@ -1085,7 +1081,6 @@ do_simple_start_and_monitor_crash1(Config) ->
%%======================================================================
-simple_start_and_monitor_crash2(suite) -> [];
simple_start_and_monitor_crash2(Config) when is_list(Config) ->
Cond = fun() -> case os:type() of
{unix, netbsd} ->
@@ -1191,7 +1186,6 @@ simulate_crash(NumKills, _) ->
%%======================================================================
-notify_started01(suite) -> [];
notify_started01(Config) when is_list(Config) ->
?TC_TRY(notify_started01,
fun() -> do_notify_started01(Config) end).
@@ -1283,7 +1277,6 @@ snmpm_starter(Opts, To) ->
%%======================================================================
-notify_started02(suite) -> [];
notify_started02(Config) when is_list(Config) ->
?TC_TRY(notify_started02,
fun() -> notify_started02_cond(Config) end,
@@ -1509,7 +1502,6 @@ ns02_ctrl_loop(Opts, N) ->
%%======================================================================
-info(suite) -> [];
info(Config) when is_list(Config) ->
Pre = fun() ->
SCO = ?config(socket_create_opts, Config),
@@ -1612,7 +1604,6 @@ verify_info([{Key, SubKeys}|Keys], Info) ->
%% USM privacy fails with AES in OTP 22.2.3. Test to prevent
%% regression in future releases.
%%
-usm_priv_aes(suite) -> [];
usm_priv_aes(Config) when is_list(Config) ->
Pre = fun() ->
SCO = ?config(socket_create_opts, Config),
@@ -1645,7 +1636,6 @@ usm_priv_aes(Config) when is_list(Config) ->
%%======================================================================
-usm_sha224_priv_aes(suite) -> [];
usm_sha224_priv_aes(Config) when is_list(Config) ->
Pre = fun() ->
SCO = ?config(socket_create_opts, Config),
@@ -1678,7 +1668,6 @@ usm_sha224_priv_aes(Config) when is_list(Config) ->
%%======================================================================
-usm_sha256_priv_aes(suite) -> [];
usm_sha256_priv_aes(Config) when is_list(Config) ->
Pre = fun() ->
SCO = ?config(socket_create_opts, Config),
@@ -1711,7 +1700,6 @@ usm_sha256_priv_aes(Config) when is_list(Config) ->
%%======================================================================
-usm_sha384_priv_aes(suite) -> [];
usm_sha384_priv_aes(Config) when is_list(Config) ->
Pre = fun() ->
SCO = ?config(socket_create_opts, Config),
@@ -1744,7 +1732,6 @@ usm_sha384_priv_aes(Config) when is_list(Config) ->
%%======================================================================
-usm_sha512_priv_aes(suite) -> [];
usm_sha512_priv_aes(Config) when is_list(Config) ->
Pre = fun() ->
SCO = ?config(socket_create_opts, Config),
@@ -1921,17 +1908,16 @@ do_usm_priv_aes(AuthAlg, Config) ->
%%======================================================================
-register_user1(suite) -> [];
register_user1(Config) when is_list(Config) ->
Pre = fun() ->
- ManagerNode = start_manager_node(),
+ ManagerNode = start_node(register_user1),
[ManagerNode]
end,
Case = fun(State) -> do_register_user1(State, Config) end,
- Post = fun([ManagerNode]) -> stop_node(ManagerNode) end,
+ Post = fun([{ManagerPeer, _ManagerNode}]) -> peer:stop(ManagerPeer) end,
?TC_TRY(register_user1, Pre, Case, Post).
-do_register_user1([ManagerNode], Config) ->
+do_register_user1([{_ManagerPeer, ManagerNode}], Config) ->
?IPRINT("starting with Config: "
"~n ~p"
"~n", [Config]),
@@ -1949,13 +1935,13 @@ do_register_user1([ManagerNode], Config) ->
?IPRINT("load snmp application"),
- ?line ok = load_snmp(ManagerNode),
+ ok = load_snmp(ManagerNode),
?IPRINT("set manager env for the snmp application"),
- ?line ok = set_mgr_env(ManagerNode, Opts),
+ ok = set_mgr_env(ManagerNode, Opts),
?IPRINT("starting snmp application (with only manager)"),
- ?line ok = start_snmp(ManagerNode),
+ ok = start_snmp(ManagerNode),
?IPRINT("started"),
@@ -1964,41 +1950,41 @@ do_register_user1([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("try register user(s)"),
- ?line ok = mgr_register_user(ManagerNode, calvin, snmpm_user_default,
+ ok = mgr_register_user(ManagerNode, calvin, snmpm_user_default,
[self(), "various misc info"]),
Users1 = mgr_which_users(ManagerNode),
?IPRINT("users: ~p~n", [Users1]),
- ?line ok = verify_users(Users1, [calvin]),
+ ok = verify_users(Users1, [calvin]),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
- ?line ok = mgr_register_user(ManagerNode, hobbe, snmpm_user_default,
+ ok = mgr_register_user(ManagerNode, hobbe, snmpm_user_default,
{"misc info", self()}),
Users2 = mgr_which_users(ManagerNode),
?IPRINT("users: ~p~n", [Users2]),
- ?line ok = verify_users(Users2, [calvin, hobbe]),
+ ok = verify_users(Users2, [calvin, hobbe]),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("try unregister user(s)"),
- ?line ok = mgr_unregister_user(ManagerNode, calvin),
+ ok = mgr_unregister_user(ManagerNode, calvin),
Users3 = mgr_which_users(ManagerNode),
?IPRINT("users: ~p~n", [Users3]),
- ?line ok = verify_users(Users3, [hobbe]),
+ ok = verify_users(Users3, [hobbe]),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
- ?line ok = mgr_unregister_user(ManagerNode, hobbe),
+ ok = mgr_unregister_user(ManagerNode, hobbe),
Users4 = mgr_which_users(ManagerNode),
?IPRINT("users: ~p~n", [Users4]),
- ?line ok = verify_users(Users4, []),
+ ok = verify_users(Users4, []),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?SLEEP(1000),
?IPRINT("stop snmp application (with only manager)"),
- ?line ok = stop_snmp(ManagerNode),
+ ok = stop_snmp(ManagerNode),
?SLEEP(1000),
@@ -2019,20 +2005,19 @@ verify_users(ActualUsers0, [User|RegUsers]) ->
%%======================================================================
-register_agent_old(doc) ->
- ["Test registration of agents with the OLD interface functions"];
-register_agent_old(suite) ->
- [];
+register_agent_old() ->
+ [{doc, "Test registration of agents with the OLD interface functions"}].
+
register_agent_old(Config) when is_list(Config) ->
Pre = fun() ->
- ManagerNode = start_manager_node(),
+ ManagerNode = start_node(register_agent_old),
[ManagerNode]
end,
Case = fun(State) -> do_register_agent_old(State, Config) end,
- Post = fun([ManagerNode]) -> stop_node(ManagerNode) end,
+ Post = fun([{ManagerPeer, _ManagerNode}]) -> peer:stop(ManagerPeer) end,
?TC_TRY(register_agent_old, Pre, Case, Post).
-do_register_agent_old([ManagerNode], Config) ->
+do_register_agent_old([{_ManagerPeer, ManagerNode}], Config) ->
?IPRINT("starting with Config: "
"~n ~p"
"~n", [Config]),
@@ -2050,13 +2035,13 @@ do_register_agent_old([ManagerNode], Config) ->
?IPRINT("load snmp application"),
- ?line ok = load_snmp(ManagerNode),
+ ok = load_snmp(ManagerNode),
?IPRINT("set manager env for the snmp application"),
- ?line ok = set_mgr_env(ManagerNode, Opts),
+ ok = set_mgr_env(ManagerNode, Opts),
?IPRINT("starting snmp application (with only manager)"),
- ?line ok = start_snmp(ManagerNode),
+ ok = start_snmp(ManagerNode),
?IPRINT("started"),
@@ -2065,15 +2050,15 @@ do_register_agent_old([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("register user(s) user_alfa & user_beta"),
- ?line ok = mgr_register_user(ManagerNode, user_alfa, snmpm_user_default, []),
- ?line ok = mgr_register_user(ManagerNode, user_beta, snmpm_user_default, []),
+ ok = mgr_register_user(ManagerNode, user_alfa, snmpm_user_default, []),
+ ok = mgr_register_user(ManagerNode, user_beta, snmpm_user_default, []),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("register agent(s)"),
- ?line ok = mgr_register_agent(ManagerNode, user_alfa, 5000, []),
- ?line ok = mgr_register_agent(ManagerNode, user_alfa, 5001, []),
- ?line ok = mgr_register_agent(ManagerNode, user_beta, 5002, []),
- ?line ok = mgr_register_agent(ManagerNode, user_beta, 5003, []),
+ ok = mgr_register_agent(ManagerNode, user_alfa, 5000, []),
+ ok = mgr_register_agent(ManagerNode, user_alfa, 5001, []),
+ ok = mgr_register_agent(ManagerNode, user_beta, 5002, []),
+ ok = mgr_register_agent(ManagerNode, user_beta, 5003, []),
?IPRINT("verify all agent(s): expect 4"),
case mgr_which_agents(ManagerNode) of
@@ -2106,7 +2091,7 @@ do_register_agent_old([ManagerNode], Config) ->
"~n ~p", [mgr_info(ManagerNode)]),
?IPRINT("unregister user user_alfa"),
- ?line ok = mgr_unregister_user(ManagerNode, user_alfa),
+ ok = mgr_unregister_user(ManagerNode, user_alfa),
?IPRINT("verify all agent(s): expect 2"),
case mgr_which_agents(ManagerNode) of
@@ -2120,8 +2105,8 @@ do_register_agent_old([ManagerNode], Config) ->
"~n ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("unregister user_beta agents"),
- ?line ok = mgr_unregister_agent(ManagerNode, user_beta, 5002),
- ?line ok = mgr_unregister_agent(ManagerNode, user_beta, 5003),
+ ok = mgr_unregister_agent(ManagerNode, user_beta, 5002),
+ ok = mgr_unregister_agent(ManagerNode, user_beta, 5003),
?IPRINT("verify all agent(s): expect 0"),
case mgr_which_agents(ManagerNode) of
@@ -2136,7 +2121,7 @@ do_register_agent_old([ManagerNode], Config) ->
"~n ~p", [mgr_info(ManagerNode)]),
?IPRINT("unregister user hobbe"),
- ?line ok = mgr_unregister_user(ManagerNode, user_beta),
+ ok = mgr_unregister_user(ManagerNode, user_beta),
?IPRINT("manager info: "
"~n ~p", [mgr_info(ManagerNode)]),
@@ -2144,7 +2129,7 @@ do_register_agent_old([ManagerNode], Config) ->
?SLEEP(1000),
?IPRINT("stop snmp application (with only manager)"),
- ?line ok = stop_snmp(ManagerNode),
+ ok = stop_snmp(ManagerNode),
?SLEEP(1000),
?IPRINT("end"),
@@ -2154,20 +2139,19 @@ do_register_agent_old([ManagerNode], Config) ->
%%======================================================================
-register_agent2(doc) ->
- ["Test registration of agents with the NEW interface functions"];
-register_agent2(suite) ->
- [];
+register_agent2() ->
+ [{doc, "Test registration of agents with the NEW interface functions"}].
+
register_agent2(Config) when is_list(Config) ->
Pre = fun() ->
- ManagerNode = start_manager_node(),
+ ManagerNode = start_node(register_agent2),
[ManagerNode]
end,
Case = fun(State) -> do_register_agent2(State, Config) end,
- Post = fun([ManagerNode]) -> stop_node(ManagerNode) end,
+ Post = fun([{ManagerPeer, _ManagerNode}]) -> peer:stop(ManagerPeer) end,
?TC_TRY(register_agent2, Pre, Case, Post).
-do_register_agent2([ManagerNode], Config) ->
+do_register_agent2([{_ManagerPeer, ManagerNode}], Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
@@ -2184,13 +2168,13 @@ do_register_agent2([ManagerNode], Config) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("load snmp application"),
- ?line ok = load_snmp(ManagerNode),
+ ok = load_snmp(ManagerNode),
?IPRINT("set manager env for the snmp application"),
- ?line ok = set_mgr_env(ManagerNode, Opts),
+ ok = set_mgr_env(ManagerNode, Opts),
?IPRINT("starting snmp application (with only manager)"),
- ?line ok = start_snmp(ManagerNode),
+ ok = start_snmp(ManagerNode),
?IPRINT("started"),
@@ -2199,28 +2183,28 @@ do_register_agent2([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("register user(s) user_alfa & user_beta"),
- ?line ok = mgr_register_user(ManagerNode, user_alfa, snmpm_user_default, []),
- ?line ok = mgr_register_user(ManagerNode, user_beta, snmpm_user_default, []),
+ ok = mgr_register_user(ManagerNode, user_alfa, snmpm_user_default, []),
+ ok = mgr_register_user(ManagerNode, user_beta, snmpm_user_default, []),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("register agent(s)"),
TargetName1 = "agent1",
- ?line ok = mgr_register_agent(ManagerNode, user_alfa, TargetName1,
+ ok = mgr_register_agent(ManagerNode, user_alfa, TargetName1,
[{address, LocalHost},
{port, 5001},
{engine_id, "agentEngineId-1"}]),
TargetName2 = "agent2",
- ?line ok = mgr_register_agent(ManagerNode, user_alfa, TargetName2,
+ ok = mgr_register_agent(ManagerNode, user_alfa, TargetName2,
[{address, LocalHost},
{port, 5002},
{engine_id, "agentEngineId-2"}]),
TargetName3 = "agent3",
- ?line ok = mgr_register_agent(ManagerNode, user_beta, TargetName3,
+ ok = mgr_register_agent(ManagerNode, user_beta, TargetName3,
[{address, LocalHost},
{port, 5003},
{engine_id, "agentEngineId-3"}]),
TargetName4 = "agent4",
- ?line ok = mgr_register_agent(ManagerNode, user_beta, TargetName4,
+ ok = mgr_register_agent(ManagerNode, user_beta, TargetName4,
[{address, LocalHost},
{port, 5004},
{engine_id, "agentEngineId-4"}]),
@@ -2255,7 +2239,7 @@ do_register_agent2([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("unregister user user_alfa"),
- ?line ok = mgr_unregister_user(ManagerNode, user_alfa),
+ ok = mgr_unregister_user(ManagerNode, user_alfa),
?IPRINT("verify all agent(s): expect 2"),
case mgr_which_agents(ManagerNode) of
@@ -2268,8 +2252,8 @@ do_register_agent2([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("unregister user_beta agents"),
- ?line ok = mgr_unregister_agent(ManagerNode, user_beta, TargetName3),
- ?line ok = mgr_unregister_agent(ManagerNode, user_beta, TargetName4),
+ ok = mgr_unregister_agent(ManagerNode, user_beta, TargetName3),
+ ok = mgr_unregister_agent(ManagerNode, user_beta, TargetName4),
?IPRINT("verify all agent(s): expect 0"),
case mgr_which_agents(ManagerNode) of
@@ -2283,14 +2267,14 @@ do_register_agent2([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("unregister user user_beta"),
- ?line ok = mgr_unregister_user(ManagerNode, user_beta),
+ ok = mgr_unregister_user(ManagerNode, user_beta),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?SLEEP(1000),
?IPRINT("stop snmp application (with only manager)"),
- ?line ok = stop_snmp(ManagerNode),
+ ok = stop_snmp(ManagerNode),
?SLEEP(1000),
@@ -2299,21 +2283,20 @@ do_register_agent2([ManagerNode], Config) ->
%%======================================================================
-register_agent3(doc) ->
- ["Test registration of agents with the NEW interface functions "
- "and specifying transport domain"];
-register_agent3(suite) ->
- [];
+register_agent3() ->
+ [{doc, "Test registration of agents with the NEW interface functions "
+ "and specifying transport domain"}].
+
register_agent3(Config) when is_list(Config) ->
Pre = fun() ->
- ManagerNode = start_manager_node(),
+ ManagerNode = start_node(register_agent3),
[ManagerNode]
end,
Case = fun(State) -> do_register_agent3(State, Config) end,
- Post = fun([ManagerNode]) -> stop_node(ManagerNode) end,
+ Post = fun([{ManagerPeer, _ManagerNode}]) -> peer:stop(ManagerPeer) end,
?TC_TRY(register_agent3, Pre, Case, Post).
-do_register_agent3([ManagerNode], Config) ->
+do_register_agent3([{_ManagerPeer, ManagerNode}], Config) ->
?IPRINT("starting with Config: "
"~n ~p", [Config]),
@@ -2332,13 +2315,13 @@ do_register_agent3([ManagerNode], Config) ->
?IPRINT("load snmp application"),
- ?line ok = load_snmp(ManagerNode),
+ ok = load_snmp(ManagerNode),
?IPRINT("set manager env for the snmp application"),
- ?line ok = set_mgr_env(ManagerNode, Opts),
+ ok = set_mgr_env(ManagerNode, Opts),
?IPRINT("starting snmp application (with only manager)"),
- ?line ok = start_snmp(ManagerNode),
+ ok = start_snmp(ManagerNode),
?IPRINT("started"),
@@ -2347,25 +2330,25 @@ do_register_agent3([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("register user(s) user_alfa & user_beta"),
- ?line ok = mgr_register_user(ManagerNode, user_alfa, snmpm_user_default, []),
- ?line ok = mgr_register_user(ManagerNode, user_beta, snmpm_user_default, []),
+ ok = mgr_register_user(ManagerNode, user_alfa, snmpm_user_default, []),
+ ok = mgr_register_user(ManagerNode, user_beta, snmpm_user_default, []),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("register agent(s)"),
TargetName1 = "agent2",
- ?line ok = mgr_register_agent(ManagerNode, user_alfa, TargetName1,
+ ok = mgr_register_agent(ManagerNode, user_alfa, TargetName1,
[{tdomain, transportDomainUdpIpv4},
{address, LocalHost},
{port, 5001},
{engine_id, "agentEngineId-1"}]),
TargetName2 = "agent3",
- ?line ok = mgr_register_agent(ManagerNode, user_alfa, TargetName2,
+ ok = mgr_register_agent(ManagerNode, user_alfa, TargetName2,
[{tdomain, transportDomainUdpIpv6},
{address, {0,0,0,0,0,0,0,1}},
{port, 5002},
{engine_id, "agentEngineId-2"}]),
TargetName3 = "agent4",
- ?line {error, {unsupported_domain, _} = Reason4} =
+ {error, {unsupported_domain, _} = Reason4} =
mgr_register_agent(ManagerNode, user_beta, TargetName3,
[{tdomain, transportDomainTcpIpv4},
{address, LocalHost},
@@ -2373,7 +2356,7 @@ do_register_agent3([ManagerNode], Config) ->
{engine_id, "agentEngineId-3"}]),
?IPRINT("Expected registration failure: ~p", [Reason4]),
TargetName4 = "agent5",
- ?line {error, {unknown_domain, _} = Reason5} =
+ {error, {unknown_domain, _} = Reason5} =
mgr_register_agent(ManagerNode, user_beta, TargetName4,
[{tdomain, transportDomainUdpIpv4_bad},
{address, LocalHost},
@@ -2411,7 +2394,7 @@ do_register_agent3([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("unregister user user_alfa"),
- ?line ok = mgr_unregister_user(ManagerNode, user_alfa),
+ ok = mgr_unregister_user(ManagerNode, user_alfa),
?IPRINT("verify all agent(s): expect 0"),
case mgr_which_agents(ManagerNode) of
@@ -2435,14 +2418,14 @@ do_register_agent3([ManagerNode], Config) ->
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?IPRINT("unregister user user_beta"),
- ?line ok = mgr_unregister_user(ManagerNode, user_beta),
+ ok = mgr_unregister_user(ManagerNode, user_beta),
?IPRINT("manager info: ~p~n", [mgr_info(ManagerNode)]),
?SLEEP(1000),
?IPRINT("stop snmp application (with only manager)"),
- ?line ok = stop_snmp(ManagerNode),
+ ok = stop_snmp(ManagerNode),
?SLEEP(1000),
@@ -2451,9 +2434,9 @@ do_register_agent3([ManagerNode], Config) ->
%%======================================================================
-simple_sync_get3(doc) ->
- ["Simple sync get-request - Version 3 API (TargetName and send-opts)"];
-simple_sync_get3(suite) -> [];
+simple_sync_get3() ->
+ [{doc, "Simple sync get-request - Version 3 API (TargetName and send-opts)"}].
+
simple_sync_get3(Config) when is_list(Config) ->
?TC_TRY(simple_sync_get3,
fun() -> do_simple_sync_get3(Config) end).
@@ -2493,12 +2476,12 @@ do_simple_sync_get3(Config, Get, PostVerify) ->
?IPRINT("issue get-request without loading the mib"),
Oids1 = [?sysObjectID_instance, ?sysDescr_instance, ?sysUpTime_instance],
- ?line ok = do_simple_sync_get3(Node, TargetName, Oids1, Get, PostVerify),
+ ok = do_simple_sync_get3(Node, TargetName, Oids1, Get, PostVerify),
?IPRINT("issue get-request after first loading the mibs"),
- ?line ok = mgr_user_load_mib(Node, std_mib()),
+ ok = mgr_user_load_mib(Node, std_mib()),
Oids2 = [[sysObjectID, 0], [sysDescr, 0], [sysUpTime, 0]],
- ?line ok = do_simple_sync_get3(Node, TargetName, Oids2, Get, PostVerify),
+ ok = do_simple_sync_get3(Node, TargetName, Oids2, Get, PostVerify),
ok.
do_simple_sync_get3(Node, TargetName, Oids, Get, PostVerify)
@@ -2506,7 +2489,7 @@ do_simple_sync_get3(Node, TargetName, Oids, Get, PostVerify)
?IPRINT("try get for ~p (on ~p):"
"~n Oids: ~p", [TargetName, Node, Oids]),
- ?line Reply =
+ Reply =
case Get(Node, TargetName, Oids) of
{ok, R, _Rem} ->
?IPRINT("get reply: "
@@ -2522,7 +2505,7 @@ do_simple_sync_get3(Node, TargetName, Oids, Get, PostVerify)
%% verify that the operation actually worked:
%% The order should be the same, so no need to search
- ?line ok = case Reply of
+ ok = case Reply of
{noError, 0, [#varbind{oid = ?sysObjectID_instance,
value = SysObjectID},
#varbind{oid = ?sysDescr_instance,
@@ -2582,9 +2565,9 @@ sag_verify_vbs([Vb|_], [E|_]) ->
%%======================================================================
-simple_async_get3(doc) ->
- ["Simple (async) get-request - Version 3 API (TargetName and send-opts)"];
-simple_async_get3(suite) -> [];
+simple_async_get3() ->
+ [{doc, "Simple (async) get-request - Version 3 API (TargetName and send-opts)"}].
+
simple_async_get3(Config) when is_list(Config) ->
?TC_TRY(simple_async_get3,
fun() -> do_simple_async_get3(Config) end).
@@ -2613,10 +2596,10 @@ do_simple_async_get3(Config) ->
Res.
do_simple_async_sync_get3(Config, MgrNode, AgentNode, Get, PostVerify) ->
- ?line ok = mgr_user_load_mib(MgrNode, std_mib()),
+ ok = mgr_user_load_mib(MgrNode, std_mib()),
Test2Mib = test2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
do_simple_async_sync_get3(fun() -> mgr_info(MgrNode) end,
fun() -> agent_info(AgentNode) end,
Get, PostVerify).
@@ -2666,7 +2649,7 @@ do_simple_async_sync_get3(MgrInfo, AgentInfo, Get, PostVerify)
?IPRINT("agent info when starting test: "
"~n ~p", [AgentInfo()]),
- ?line ok = async_exec(Requests, []),
+ ok = async_exec(Requests, []),
?IPRINT("manager info when ending test: "
"~n ~p", [MgrInfo()]),
@@ -2715,10 +2698,10 @@ check_ssgn_vbs([Vb|_], [E|_]) ->
%%======================================================================
-simple_sync_get_next3(doc) ->
- ["Simple (sync) get_next-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_sync_get_next3(suite) -> [];
+simple_sync_get_next3() ->
+ [{doc, "Simple (sync) get_next-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_sync_get_next3(Config) when is_list(Config) ->
process_flag(trap_exit, true),
put(tname, ssgn3),
@@ -2753,32 +2736,32 @@ do_simple_sync_get_next3(Config, GetNext, PostVerify)
%% -- 1 --
Oids01 = [[1,3,7,1]],
VF01 = fun(X) -> verify_ssgn_reply1(X, [{[1,3,7,1],endOfMibView}]) end,
- ?line ok = do_simple_get_next(1,
+ ok = do_simple_get_next(1,
MgrNode, TargetName, Oids01, VF01,
GetNext, PostVerify),
- ?line ok = mgr_user_load_mib(MgrNode, std_mib()),
+ ok = mgr_user_load_mib(MgrNode, std_mib()),
%% -- 2 --
Oids02 = [[sysDescr], [1,3,7,1]],
VF02 = fun(X) ->
verify_ssgn_reply1(X, [?sysDescr_instance, endOfMibView])
end,
- ?line ok = do_simple_get_next(2,
+ ok = do_simple_get_next(2,
MgrNode, TargetName, Oids02, VF02,
GetNext, PostVerify),
Test2Mib = test2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
%% -- 3 --
- ?line {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
+ {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
Oids03 = [[TCnt2, 1]],
VF03 = fun(X) ->
verify_ssgn_reply1(X, [{fl([TCnt2,2]), 100}])
end,
- ?line ok = do_simple_get_next(3,
+ ok = do_simple_get_next(3,
MgrNode, TargetName, Oids03, VF03,
GetNext, PostVerify),
@@ -2787,48 +2770,48 @@ do_simple_sync_get_next3(Config, GetNext, PostVerify)
VF04 = fun(X) ->
verify_ssgn_reply1(X, [{fl([TCnt2,2]), endOfMibView}])
end,
- ?line ok = do_simple_get_next(4,
+ ok = do_simple_get_next(4,
MgrNode, TargetName, Oids04, VF04,
GetNext, PostVerify),
%% -- 5 --
- ?line {ok, [TGenErr1|_]} = mgr_user_name_to_oid(MgrNode, tGenErr1),
+ {ok, [TGenErr1|_]} = mgr_user_name_to_oid(MgrNode, tGenErr1),
Oids05 = [TGenErr1],
VF05 = fun(X) ->
verify_ssgn_reply2(X, {genErr, 1, [TGenErr1]})
end,
- ?line ok = do_simple_get_next(5,
+ ok = do_simple_get_next(5,
MgrNode, TargetName, Oids05, VF05,
GetNext, PostVerify),
%% -- 6 --
- ?line {ok, [TGenErr2|_]} = mgr_user_name_to_oid(MgrNode, tGenErr2),
+ {ok, [TGenErr2|_]} = mgr_user_name_to_oid(MgrNode, tGenErr2),
Oids06 = [TGenErr2],
VF06 = fun(X) ->
verify_ssgn_reply2(X, {genErr, 1, [TGenErr2]})
end,
- ?line ok = do_simple_get_next(6,
+ ok = do_simple_get_next(6,
MgrNode, TargetName, Oids06, VF06,
GetNext, PostVerify),
%% -- 7 --
- ?line {ok, [TGenErr3|_]} = mgr_user_name_to_oid(MgrNode, tGenErr3),
+ {ok, [TGenErr3|_]} = mgr_user_name_to_oid(MgrNode, tGenErr3),
Oids07 = [[sysDescr], TGenErr3],
VF07 = fun(X) ->
verify_ssgn_reply2(X, {genErr, 2,
[?sysDescr, TGenErr3]})
end,
- ?line ok = do_simple_get_next(7,
+ ok = do_simple_get_next(7,
MgrNode, TargetName, Oids07, VF07,
GetNext, PostVerify),
%% -- 8 --
- ?line {ok, [TTooBig|_]} = mgr_user_name_to_oid(MgrNode, tTooBig),
+ {ok, [TTooBig|_]} = mgr_user_name_to_oid(MgrNode, tTooBig),
Oids08 = [TTooBig],
VF08 = fun(X) ->
verify_ssgn_reply2(X, {tooBig, 0, []})
end,
- ?line ok = do_simple_get_next(8,
+ ok = do_simple_get_next(8,
MgrNode, TargetName, Oids08, VF08,
GetNext, PostVerify),
ok.
@@ -2850,24 +2833,24 @@ do_simple_get_next(N, Node, TargetName, Oids, Verify, GetNext, PostVerify) ->
%%======================================================================
-simple_async_get_next3_cbp_def(doc) ->
- ["Simple (async) get_next-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_async_get_next3_cbp_def(suite) -> [];
+simple_async_get_next3_cbp_def() ->
+ [{doc, "Simple (async) get_next-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_async_get_next3_cbp_def(Config) when is_list(Config) ->
simple_async_get_next3(ssgn2_cbp_def, Config).
-simple_async_get_next3_cbp_temp(doc) ->
- ["Simple (async) get_next-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_async_get_next3_cbp_temp(suite) -> [];
+simple_async_get_next3_cbp_temp() ->
+ [{doc, "Simple (async) get_next-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_async_get_next3_cbp_temp(Config) when is_list(Config) ->
simple_async_get_next3(ssgn2_cbp_temp, Config).
-simple_async_get_next3_cbp_perm(doc) ->
- ["Simple (async) get_next-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_async_get_next3_cbp_perm(suite) -> [];
+simple_async_get_next3_cbp_perm() ->
+ [{doc, "Simple (async) get_next-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_async_get_next3_cbp_perm(Config) when is_list(Config) ->
simple_async_get_next3(ssgn2_cbp_perm, Config).
@@ -2884,10 +2867,10 @@ do_simple_async_get_next3(Config) ->
AgentNode = ?config(agent_node, Config),
TargetName = ?config(manager_agent_target_name, Config),
- ?line ok = mgr_user_load_mib(MgrNode, std_mib()),
+ ok = mgr_user_load_mib(MgrNode, std_mib()),
Test2Mib = test2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
Self = self(),
Msg = simple_async_get_next3,
@@ -2911,11 +2894,11 @@ do_simple_async_get_next3(Config) ->
do_simple_async_get_next3(MgrNode, AgentNode, GetNext, PostVerify)
when is_function(GetNext, 1) andalso is_function(PostVerify, 1) ->
- ?line {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
- ?line {ok, [TGenErr1|_]} = mgr_user_name_to_oid(MgrNode, tGenErr1),
- ?line {ok, [TGenErr2|_]} = mgr_user_name_to_oid(MgrNode, tGenErr2),
- ?line {ok, [TGenErr3|_]} = mgr_user_name_to_oid(MgrNode, tGenErr3),
- ?line {ok, [TTooBig|_]} = mgr_user_name_to_oid(MgrNode, tTooBig),
+ {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
+ {ok, [TGenErr1|_]} = mgr_user_name_to_oid(MgrNode, tGenErr1),
+ {ok, [TGenErr2|_]} = mgr_user_name_to_oid(MgrNode, tGenErr2),
+ {ok, [TGenErr3|_]} = mgr_user_name_to_oid(MgrNode, tGenErr3),
+ {ok, [TTooBig|_]} = mgr_user_name_to_oid(MgrNode, tTooBig),
Requests =
[
@@ -2983,7 +2966,7 @@ do_simple_async_get_next3(MgrNode, AgentNode, GetNext, PostVerify)
?IPRINT("agent info when starting test: "
"~n ~p", [agent_info(AgentNode)]),
- ?line ok = async_exec(Requests, []),
+ ok = async_exec(Requests, []),
?IPRINT("manager info when ending test: "
"~n ~p", [mgr_info(MgrNode)]),
@@ -3012,9 +2995,9 @@ value_of_vavs([{_Oid, Val}|VAVs], Acc) ->
%%======================================================================
-simple_sync_set3(doc) ->
- ["Simple (sync) set-request - Version 3 API (TargetName with send-opts)"];
-simple_sync_set3(suite) -> [];
+simple_sync_set3() ->
+ [{doc, "Simple (sync) set-request - Version 3 API (TargetName with send-opts)"}].
+
simple_sync_set3(Config) when is_list(Config) ->
?TC_TRY(simple_sync_set3,
fun() -> do_simple_sync_set3(Config) end).
@@ -3054,22 +3037,22 @@ do_simple_sync_set3(Config, Set, PostVerify)
{?sysName_instance, s, Val11},
{?sysLocation_instance, s, Val12}
],
- ?line ok = do_simple_set3(Node, TargetName, VAVs1, Set, PostVerify),
+ ok = do_simple_set3(Node, TargetName, VAVs1, Set, PostVerify),
?IPRINT("issue set-request after first loading the mibs"),
- ?line ok = mgr_user_load_mib(Node, std_mib()),
+ ok = mgr_user_load_mib(Node, std_mib()),
Val21 = "Sune Anka",
Val22 = "Gothenburg",
VAVs2 = [
{[sysName, 0], Val21},
{[sysLocation, 0], Val22}
],
- ?line ok = do_simple_set3(Node, TargetName, VAVs2, Set, PostVerify),
+ ok = do_simple_set3(Node, TargetName, VAVs2, Set, PostVerify),
ok.
do_simple_set3(Node, TargetName, VAVs, Set, PostVerify) ->
[SysName, SysLoc] = value_of_vavs(VAVs),
- ?line {ok, Reply, _Rem} = Set(Node, TargetName, VAVs),
+ {ok, Reply, _Rem} = Set(Node, TargetName, VAVs),
?DBG("~n Reply: ~p"
"~n Rem: ~w", [Reply, _Rem]),
@@ -3077,7 +3060,7 @@ do_simple_set3(Node, TargetName, VAVs, Set, PostVerify) ->
%% verify that the operation actually worked:
%% The order should be the same, so no need to search
%% The value we get should be exactly the same as we sent
- ?line ok = case Reply of
+ ok = case Reply of
{noError, 0, [#varbind{oid = ?sysName_instance,
value = SysName},
#varbind{oid = ?sysLocation_instance,
@@ -3127,21 +3110,21 @@ sas_verify_vbs([Vb|_], [E|_]) ->
%%======================================================================
-simple_async_set3_cbp_def(doc) ->
- ["Simple (async) set-request - Version 3 API (TargetName with send-opts)"];
-simple_async_set3_cbp_def(suite) -> [];
+simple_async_set3_cbp_def() ->
+ [{doc, "Simple (async) set-request - Version 3 API (TargetName with send-opts)"}].
+
simple_async_set3_cbp_def(Config) when is_list(Config) ->
simple_async_set3(sas3_cbp_def, Config).
-simple_async_set3_cbp_temp(doc) ->
- ["Simple (async) set-request - Version 3 API (TargetName with send-opts)"];
-simple_async_set3_cbp_temp(suite) -> [];
+simple_async_set3_cbp_temp() ->
+ [{doc, "Simple (async) set-request - Version 3 API (TargetName with send-opts)"}].
+
simple_async_set3_cbp_temp(Config) when is_list(Config) ->
simple_async_set3(sas3_cbp_temp, Config).
-simple_async_set3_cbp_perm(doc) ->
- ["Simple (async) set-request - Version 3 API (TargetName with send-opts)"];
-simple_async_set3_cbp_perm(suite) -> [];
+simple_async_set3_cbp_perm() ->
+ [{doc, "Simple (async) set-request - Version 3 API (TargetName with send-opts)"}].
+
simple_async_set3_cbp_perm(Config) when is_list(Config) ->
simple_async_set3(sas3_cbp_perm, Config).
@@ -3157,10 +3140,10 @@ do_simple_async_set3(Config) ->
AgentNode = ?config(agent_node, Config),
TargetName = ?config(manager_agent_target_name, Config),
- ?line ok = mgr_user_load_mib(MgrNode, std_mib()),
+ ok = mgr_user_load_mib(MgrNode, std_mib()),
Test2Mib = test2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
Self = self(),
Msg = simple_async_set3,
@@ -3217,7 +3200,7 @@ do_simple_async_set3(MgrNode, AgentNode, Set, PostVerify) ->
?IPRINT("agent info when starting test: "
"~n ~p", [agent_info(AgentNode)]),
- ?line ok = async_exec(Requests, []),
+ ok = async_exec(Requests, []),
?IPRINT("manager info when ending test: "
"~n ~p", [mgr_info(MgrNode)]),
@@ -3270,10 +3253,10 @@ check_ssgb_vbs([R|_], [E|_]) ->
%%======================================================================
-simple_sync_get_bulk3(doc) ->
- ["Simple (sync) get_bulk-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_sync_get_bulk3(suite) -> [];
+simple_sync_get_bulk3() ->
+ [{doc, "Simple (sync) get_bulk-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_sync_get_bulk3(Config) when is_list(Config) ->
?TC_TRY(simple_sync_get_bulk3,
fun() -> do_simple_sync_get_bulk3(Config) end).
@@ -3310,34 +3293,34 @@ do_simple_sync_get_bulk3(Config) ->
do_simple_sync_get_bulk3(Config, MgrNode, AgentNode, GetBulk, PostVerify) ->
%% -- 1 --
- ?line ok = do_simple_get_bulk3(1,
+ ok = do_simple_get_bulk3(1,
1, 1, [],
fun verify_ssgb_reply1/1,
GetBulk, PostVerify),
%% -- 2 --
- ?line ok = do_simple_get_bulk3(2,
+ ok = do_simple_get_bulk3(2,
-1, 1, [],
fun verify_ssgb_reply1/1,
GetBulk, PostVerify),
%% -- 3 --
- ?line ok = do_simple_get_bulk3(3,
+ ok = do_simple_get_bulk3(3,
-1, -1, [],
fun verify_ssgb_reply1/1,
GetBulk, PostVerify),
- ?line ok = mgr_user_load_mib(MgrNode, std_mib()),
+ ok = mgr_user_load_mib(MgrNode, std_mib()),
%% -- 4 --
VF04 = fun(X) ->
verify_ssgb_reply2(X, [?sysDescr_instance, endOfMibView])
end,
- ?line ok = do_simple_get_bulk3(4,
+ ok = do_simple_get_bulk3(4,
2, 0, [[sysDescr],[1,3,7,1]], VF04,
GetBulk, PostVerify),
%% -- 5 --
- ?line ok = do_simple_get_bulk3(5,
+ ok = do_simple_get_bulk3(5,
1, 2, [[sysDescr],[1,3,7,1]], VF04,
GetBulk, PostVerify),
@@ -3347,7 +3330,7 @@ do_simple_sync_get_bulk3(Config, MgrNode, AgentNode, GetBulk, PostVerify) ->
[?sysDescr_instance, endOfMibView,
?sysObjectID_instance, endOfMibView])
end,
- ?line ok = do_simple_get_bulk3(6,
+ ok = do_simple_get_bulk3(6,
0, 2, [[sysDescr],[1,3,7,1]], VF06,
GetBulk, PostVerify),
@@ -3358,15 +3341,15 @@ do_simple_sync_get_bulk3(Config, MgrNode, AgentNode, GetBulk, PostVerify) ->
?sysDescr_instance, endOfMibView,
?sysObjectID_instance, endOfMibView])
end,
- ?line ok = do_simple_get_bulk3(7,
+ ok = do_simple_get_bulk3(7,
2, 2,
[[sysDescr],[1,3,7,1],[sysDescr],[1,3,7,1]],
VF07,
GetBulk, PostVerify),
Test2Mib = test2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
%% -- 8 --
VF08 = fun(X) ->
@@ -3374,14 +3357,14 @@ do_simple_sync_get_bulk3(Config, MgrNode, AgentNode, GetBulk, PostVerify) ->
[?sysDescr_instance,
?sysDescr_instance])
end,
- ?line ok = do_simple_get_bulk3(8,
+ ok = do_simple_get_bulk3(8,
1, 2,
[[sysDescr],[sysDescr],[tTooBig]],
VF08,
GetBulk, PostVerify),
%% -- 9 --
- ?line ok = do_simple_get_bulk3(9,
+ ok = do_simple_get_bulk3(9,
1, 12,
[[tDescr2], [sysDescr]],
fun verify_ssgb_reply1/1,
@@ -3395,7 +3378,7 @@ do_simple_sync_get_bulk3(Config, MgrNode, AgentNode, GetBulk, PostVerify) ->
{?tGenErr1, 'NULL'},
{?sysDescr, 'NULL'}])
end,
- ?line ok = do_simple_get_bulk3(10,
+ ok = do_simple_get_bulk3(10,
2, 2,
[[sysDescr],
[sysObjectID],
@@ -3405,14 +3388,14 @@ do_simple_sync_get_bulk3(Config, MgrNode, AgentNode, GetBulk, PostVerify) ->
GetBulk, PostVerify),
%% -- 11 --
- ?line {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
+ {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
?IPRINT("TCnt2: ~p", [TCnt2]),
VF11 = fun(X) ->
verify_ssgb_reply2(X,
[{fl([TCnt2,2]), 100},
{fl([TCnt2,2]), endOfMibView}])
end,
- ?line ok = do_simple_get_bulk3(11,
+ ok = do_simple_get_bulk3(11,
0, 2,
[[TCnt2, 1]], VF11,
GetBulk, PostVerify),
@@ -3440,10 +3423,10 @@ do_simple_get_bulk3(N,
%%======================================================================
-simple_async_get_bulk3_cbp_def(doc) ->
- ["Simple (async) get_bulk-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_async_get_bulk3_cbp_def(suite) -> [];
+simple_async_get_bulk3_cbp_def() ->
+ [{doc, "Simple (async) get_bulk-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_async_get_bulk3_cbp_def(Config) when is_list(Config) ->
simple_async_get_bulk3(sagb3_cbp_def, Config).
@@ -3460,10 +3443,10 @@ do_simple_async_get_bulk3(Config) ->
AgentNode = ?config(agent_node, Config),
TargetName = ?config(manager_agent_target_name, Config),
- ?line ok = mgr_user_load_mib(MgrNode, std_mib()),
+ ok = mgr_user_load_mib(MgrNode, std_mib()),
Test2Mib = test2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
Self = self(),
Msg = simple_async_get_bulk3,
@@ -3519,7 +3502,7 @@ do_simple_async_get_bulk3(MgrNode, AgentNode, GetBulk, PostVerify) ->
{?tGenErr1, 'NULL'},
{?sysDescr, 'NULL'}]))
end,
- ?line {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
+ {ok, [TCnt2|_]} = mgr_user_name_to_oid(MgrNode, tCnt2),
VF11 = fun(X) ->
PostVerify(
verify_ssgb_reply2(X,
@@ -3602,7 +3585,7 @@ do_simple_async_get_bulk3(MgrNode, AgentNode, GetBulk, PostVerify) ->
?IPRINT("agent info when starting test: "
"~n ~p", [agent_info(AgentNode)]),
- ?line ok = async_exec(Requests, []),
+ ok = async_exec(Requests, []),
?IPRINT("manager info when ending test: "
"~n ~p", [mgr_info(MgrNode)]),
@@ -3618,59 +3601,59 @@ async_gb_exec3(Node, TargetName, {NR, MR, Oids}, SendOpts) ->
%%======================================================================
-simple_async_get_bulk3_cbp_temp(doc) ->
- ["Simple (async) get_bulk-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_async_get_bulk3_cbp_temp(suite) -> [];
+simple_async_get_bulk3_cbp_temp() ->
+ [{doc, "Simple (async) get_bulk-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_async_get_bulk3_cbp_temp(Config) when is_list(Config) ->
simple_async_get_bulk3(sagb3_cbp_temp, Config).
%%======================================================================
-simple_async_get_bulk3_cbp_perm(doc) ->
- ["Simple (async) get_bulk-request - "
- "Version 3 API (TargetName with send-opts)"];
-simple_async_get_bulk3_cbp_perm(suite) -> [];
+simple_async_get_bulk3_cbp_perm() ->
+ [{doc, "Simple (async) get_bulk-request - "
+ "Version 3 API (TargetName with send-opts)"}].
+
simple_async_get_bulk3_cbp_perm(Config) when is_list(Config) ->
simple_async_get_bulk3(sagb3_cbp_perm, Config).
%%======================================================================
-simple_v3_exchange_md5(doc) ->
- ["Simple message exchange using v3 (MD5) messages"];
-simple_v3_exchange_md5(suite) -> [];
+simple_v3_exchange_md5() ->
+ [{doc, "Simple message exchange using v3 (MD5) messages"}].
+
simple_v3_exchange_md5(Config) when is_list(Config) ->
simple_v3_exchange(Config).
-simple_v3_exchange_sha(doc) ->
- ["Simple message exchange using v3 (SHA) messages"];
-simple_v3_exchange_sha(suite) -> [];
+simple_v3_exchange_sha() ->
+ [{doc, "Simple message exchange using v3 (SHA) messages"}].
+
simple_v3_exchange_sha(Config) when is_list(Config) ->
simple_v3_exchange(Config).
-simple_v3_exchange_sha224(doc) ->
- ["Simple message exchange using v3 (SHA224) messages"];
-simple_v3_exchange_sha224(suite) -> [];
+simple_v3_exchange_sha224() ->
+ [{doc, "Simple message exchange using v3 (SHA224) messages"}].
+
simple_v3_exchange_sha224(Config) when is_list(Config) ->
simple_v3_exchange(Config).
-simple_v3_exchange_sha256(doc) ->
- ["Simple message exchange using v3 (SHA256) messages"];
-simple_v3_exchange_sha256(suite) -> [];
+simple_v3_exchange_sha256() ->
+ [{doc, "Simple message exchange using v3 (SHA256) messages"}].
+
simple_v3_exchange_sha256(Config) when is_list(Config) ->
simple_v3_exchange(Config).
-simple_v3_exchange_sha384(doc) ->
- ["Simple message exchange using v3 (SHA384) messages"];
-simple_v3_exchange_sha384(suite) -> [];
+simple_v3_exchange_sha384() ->
+ [{doc, "Simple message exchange using v3 (SHA384) messages"}].
+
simple_v3_exchange_sha384(Config) when is_list(Config) ->
simple_v3_exchange(Config).
-simple_v3_exchange_sha512(doc) ->
- ["Simple message exchange using v3 (SHA512) messages"];
-simple_v3_exchange_sha512(suite) -> [];
+simple_v3_exchange_sha512() ->
+ [{doc, "Simple message exchange using v3 (SHA512) messages"}].
+
simple_v3_exchange_sha512(Config) when is_list(Config) ->
simple_v3_exchange(Config).
@@ -3707,7 +3690,6 @@ simple_v3_exchange(Config) when is_list(Config) ->
%%======================================================================
-discovery(suite) -> [];
discovery(Config) when is_list(Config) ->
?SKIP(not_yet_implemented).
@@ -3772,7 +3754,6 @@ verify_trap(Trap, [{Id, Verifier}|Verifiers]) ->
%%======================================================================
-trap1(suite) -> [];
trap1(Config) when is_list(Config) ->
?TC_TRY(trap1,
fun() -> do_trap1(Config) end).
@@ -3785,16 +3766,16 @@ do_trap1(Config) ->
MgrNode = ?config(manager_node, Config),
AgentNode = ?config(agent_node, Config),
- ?line ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
+ ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
Test2Mib = test2_mib(Config),
TestTrapMib = test_trap_mib(Config),
TestTrapv2Mib = test_trap_v2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapMib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, TestTrapMib),
- ?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapMib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, TestTrapMib),
+ ok = agent_load_mib(AgentNode, TestTrapv2Mib),
%% Version 1 trap verification function:
VerifyTrap_v1 =
@@ -3933,7 +3914,6 @@ do_trap1(Config) ->
%%======================================================================
-trap2(suite) -> [];
trap2(Config) when is_list(Config) ->
?TC_TRY(trap2,
fun() -> do_trap2(Config) end).
@@ -3946,16 +3926,16 @@ do_trap2(Config) ->
MgrNode = ?config(manager_node, Config),
AgentNode = ?config(agent_node, Config),
- ?line ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
+ ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
Test2Mib = test2_mib(Config),
TestTrapMib = test_trap_mib(Config),
TestTrapv2Mib = test_trap_v2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapMib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, TestTrapMib),
- ?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapMib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, TestTrapMib),
+ ok = agent_load_mib(AgentNode, TestTrapv2Mib),
%% Version 1 trap verification function:
VerifyTrap_v1 =
@@ -4132,7 +4112,6 @@ do_trap2(Config) ->
%%======================================================================
-inform1(suite) -> [];
inform1(Config) when is_list(Config) ->
?TC_TRY(inform1,
fun() -> do_inform1(Config) end).
@@ -4145,16 +4124,16 @@ do_inform1(Config) ->
MgrNode = ?config(manager_node, Config),
AgentNode = ?config(agent_node, Config),
- ?line ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
+ ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
Test2Mib = test2_mib(Config),
TestTrapMib = test_trap_mib(Config),
TestTrapv2Mib = test_trap_v2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapMib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, TestTrapMib),
- ?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapMib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, TestTrapMib),
+ ok = agent_load_mib(AgentNode, TestTrapv2Mib),
Cmd1 =
@@ -4252,7 +4231,7 @@ do_inform1(Config) ->
Commands =
[
{1, "Manager and agent info at start of test", Cmd1},
- {2, "Send notifcation [no receiver] from agent", Cmd2},
+ {2, "Send notification [no receiver] from agent", Cmd2},
{3, "Await first inform to manager - do not reply", Cmd3},
{4, "Await second inform to manager - reply", Cmd4},
{5, "Sleep some time (5 sec)", Cmd5},
@@ -4266,7 +4245,6 @@ do_inform1(Config) ->
%%======================================================================
-inform2(suite) -> [];
inform2(Config) when is_list(Config) ->
?TC_TRY(inform2,
fun() -> do_inform2(Config) end).
@@ -4281,16 +4259,16 @@ do_inform2(Config) ->
%% Addr = ?config(ip, Config),
%% Port = ?AGENT_PORT,
- ?line ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
+ ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
Test2Mib = test2_mib(Config),
TestTrapMib = test_trap_mib(Config),
TestTrapv2Mib = test_trap_v2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapMib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, TestTrapMib),
- ?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapMib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, TestTrapMib),
+ ok = agent_load_mib(AgentNode, TestTrapv2Mib),
Cmd1 =
fun() ->
@@ -4428,7 +4406,7 @@ do_inform2(Config) ->
Commands =
[
{1, "Manager and agent info at start of test", Cmd1},
- {2, "Send notifcation [no receiver] from agent", Cmd2},
+ {2, "Send notification [no receiver] from agent", Cmd2},
{3, "Await inform-sent acknowledge from agent", Cmd3},
{4, "Await first inform to manager - do not reply", Cmd4},
{5, "Await second inform to manager - reply", Cmd5},
@@ -4444,7 +4422,6 @@ do_inform2(Config) ->
%%======================================================================
-inform3(suite) -> [];
inform3(Config) when is_list(Config) ->
?TC_TRY(inform3,
fun() -> do_inform3(Config) end).
@@ -4456,16 +4433,16 @@ do_inform3(Config) ->
MgrNode = ?config(manager_node, Config),
AgentNode = ?config(agent_node, Config),
- ?line ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
+ ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
Test2Mib = test2_mib(Config),
TestTrapMib = test_trap_mib(Config),
TestTrapv2Mib = test_trap_v2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapMib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, TestTrapMib),
- ?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapMib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, TestTrapMib),
+ ok = agent_load_mib(AgentNode, TestTrapv2Mib),
Cmd1 =
fun() ->
@@ -4567,7 +4544,7 @@ do_inform3(Config) ->
Commands =
[
{1, "Manager and agent info at start of test", Cmd1},
- {2, "Send notifcation from agent", Cmd2},
+ {2, "Send notification from agent", Cmd2},
{3, "await inform-sent acknowledge from agent", Cmd3},
{4, "Await first inform to manager - do not reply", Cmd4},
{5, "Await first inform to manager - do not reply", Cmd4},
@@ -4584,7 +4561,6 @@ do_inform3(Config) ->
%%======================================================================
-inform4(suite) -> [];
inform4(Config) when is_list(Config) ->
?TC_TRY(inform4,
fun() -> do_inform4(Config) end).
@@ -4596,16 +4572,16 @@ do_inform4(Config) ->
MgrNode = ?config(manager_node, Config),
AgentNode = ?config(agent_node, Config),
- ?line ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
+ ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
Test2Mib = test2_mib(Config),
TestTrapMib = test_trap_mib(Config),
TestTrapv2Mib = test_trap_v2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapMib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, TestTrapMib),
- ?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapMib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, TestTrapMib),
+ ok = agent_load_mib(AgentNode, TestTrapv2Mib),
Cmd1 =
fun() ->
@@ -4693,7 +4669,7 @@ do_inform4(Config) ->
Commands =
[
{1, "Manager and agent info at start of test", Cmd1},
- {2, "Send notifcation [no receiver] from agent", Cmd2},
+ {2, "Send notification [no receiver] from agent", Cmd2},
{3, "Await inform to manager", Cmd3},
%% {4, "Await error info (because of erroneous config)", Cmd4},
{5, "Sleep some time (1 sec)", Cmd5},
@@ -4709,15 +4685,12 @@ do_inform4(Config) ->
%%
%% Test: ts:run(snmp, snmp_manager_test, inform_swarm_cbp_def, [batch]).
-inform_swarm_cbp_def(suite) -> [];
inform_swarm_cbp_def(Config) when is_list(Config) ->
inform_swarm(is_cbp_def, 1500, Config).
-inform_swarm_cbp_temp(suite) -> [];
inform_swarm_cbp_temp(Config) when is_list(Config) ->
inform_swarm(is_cbp_temp, 1500, Config).
-inform_swarm_cbp_perm(suite) -> [];
inform_swarm_cbp_perm(Config) when is_list(Config) ->
inform_swarm(is_cbp_perm, 1800, Config).
@@ -4736,16 +4709,16 @@ do_inform_swarm(NumI, Config) ->
AgentNode = ?config(agent_node, Config),
Factor = ?config(snmp_factor, Config),
- ?line ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
+ ok = mgr_user_load_mib(MgrNode, snmpv2_mib()),
Test2Mib = test2_mib(Config),
TestTrapMib = test_trap_mib(Config),
TestTrapv2Mib = test_trap_v2_mib(Config),
- ?line ok = mgr_user_load_mib(MgrNode, Test2Mib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapMib),
- ?line ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
- ?line ok = agent_load_mib(AgentNode, Test2Mib),
- ?line ok = agent_load_mib(AgentNode, TestTrapMib),
- ?line ok = agent_load_mib(AgentNode, TestTrapv2Mib),
+ ok = mgr_user_load_mib(MgrNode, Test2Mib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapMib),
+ ok = mgr_user_load_mib(MgrNode, TestTrapv2Mib),
+ ok = agent_load_mib(AgentNode, Test2Mib),
+ ok = agent_load_mib(AgentNode, TestTrapMib),
+ ok = agent_load_mib(AgentNode, TestTrapv2Mib),
NumInforms = NumI div Factor,
Collector = self(),
@@ -4807,7 +4780,7 @@ do_inform_swarm(NumI, Config) ->
Commands =
[
{1, "Manager and agent info at start of test", Cmd1},
- {2, ?F("Send ~p notifcation(s) from agent", [NumInforms]), Cmd2},
+ {2, ?F("Send ~p notification(s) from agent", [NumInforms]), Cmd2},
{3, "Await send-ack(s)/inform(s)/response(s)", Cmd3},
{4, "Sleep some time (1 sec)", Cmd4},
{5, "Manager and agent info after test completion", Cmd1}
@@ -4823,7 +4796,7 @@ inform_swarm_collector(N) ->
%% Note that we need to deal with re-transmissions!
%% That is, the agent did not receive the ack in time,
-%% and therefor did a re-transmit. This means that we
+%% and therefore did a re-transmit. This means that we
%% expect to receive more inform's then we actually
%% sent. So for success we assume:
%%
@@ -4900,7 +4873,6 @@ inform_swarm_collector(N, SentAckCnt, RecvCnt, RespCnt, Timeout) ->
%%======================================================================
-report(suite) -> [];
report(Config) when is_list(Config) ->
?SKIP(not_yet_implemented).
@@ -4908,8 +4880,9 @@ report(Config) when is_list(Config) ->
%%======================================================================
-otp8015_1(doc) -> ["OTP-8015:1 - testing the new api-function."];
-otp8015_1(suite) -> [];
+otp8015_1() ->
+ [{doc, "OTP-8015:1 - testing the new api-function."}].
+
otp8015_1(Config) when is_list(Config) ->
Pre = fun() ->
SCO = ?config(socket_create_opts, Config),
@@ -4965,8 +4938,9 @@ do_otp8015_1(Config) ->
%%======================================================================
-otp8395_1(doc) -> ["OTP-8395:1 - simple get with ATL sequence numbering."];
-otp8395_1(suite) -> [];
+otp8395_1() ->
+ [{doc, "OTP-8395:1 - simple get with ATL sequence numbering."}].
+
otp8395_1(Config) when is_list(Config) ->
?TC_TRY(otp8395_1,
fun() -> do_otp8395_1(Config) end).
@@ -4984,7 +4958,7 @@ async_exec([], Acc) ->
async_verify(async_collector(Acc, []));
async_exec([{Id, Data, Exec, Ver}|Reqs], Acc) ->
?IPRINT("issue async request ~w", [Id]),
- ?line {ok, ReqId} = Exec(Data),
+ {ok, ReqId} = Exec(Data),
async_exec(Reqs, [{ReqId, Id, Ver}|Acc]).
async_collector([], Acc) ->
@@ -5079,17 +5053,17 @@ command_handler([{No, Desc, Cmd}|Cmds]) ->
{error, Reason} ->
?EPRINT("Command_handler -> ~w error: "
"~n ~p", [No, Reason]),
- ?line ?FAIL({command_failed, No, Reason});
+ ?FAIL({command_failed, No, Reason});
Error ->
?EPRINT("Command_handler -> ~w unexpected: "
"~n ~p", [No, Error]),
- ?line ?FAIL({unexpected_command_result, No, Error})
+ ?FAIL({unexpected_command_result, No, Error})
end.
%% -- Misc manager functions --
-init_manager(AutoInform, Config) ->
+init_manager(Case, AutoInform, Config) ->
?IPRINT("init_manager -> entry with"
"~n AutoInform: ~p"
@@ -5099,7 +5073,7 @@ init_manager(AutoInform, Config) ->
%% Start node
%%
- ?line Node = start_manager_node(),
+ {Peer, Node} = start_node(lists:concat([Case, "-mgr"])),
%% The point with this (try catch block) is to be
%% able to do some cleanup in case we fail to
@@ -5114,13 +5088,13 @@ init_manager(AutoInform, Config) ->
%% Start and initiate crypto on manager node
%%
- ?line ok = init_crypto(Node),
+ ok = init_crypto(Node),
%%
%% Write manager config
%%
- ?line ok = write_manager_config(Config),
+ ok = write_manager_config(Config),
IRB = case AutoInform of
true ->
@@ -5128,7 +5102,7 @@ init_manager(AutoInform, Config) ->
_ ->
user
end,
- Conf = [{manager_node, Node}, {irb, IRB} | Config],
+ Conf = [{manager_node, Node}, {manager_peer, Peer}, {irb, IRB} | Config],
Vsns = [v1,v2,v3],
start_manager(Node, Vsns, Conf)
end
@@ -5138,7 +5112,7 @@ init_manager(AutoInform, Config) ->
"~n Reason: ~p"
"~n StackTrace: ~p", [Reason, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
erlang:raise(C, E, S);
C:E:S ->
?EPRINT("Failure during manager start: "
@@ -5146,11 +5120,11 @@ init_manager(AutoInform, Config) ->
"~n Error: ~p"
"~n StackTrace: ~p", [C, E, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
?FAIL({failed_starting_manager, C, E, S})
end.
-init_v3_manager(Config) ->
+init_v3_manager(Case, Config) ->
?IPRINT("init_v3_manager -> entry with"
"~n Config: ~p", [Config]),
@@ -5159,8 +5133,7 @@ init_v3_manager(Config) ->
%% Start node
%%
- %% ?line Node = self(),
- ?line Node = start_unique_manager_node(),
+ {Peer, Node} = start_node(lists:concat([Case, "-v3mgr"])),
%% The point with this (try catch block) is to be
%% able to do some cleanup in case we fail to
@@ -5175,7 +5148,7 @@ init_v3_manager(Config) ->
%% Start and initiate crypto on manager node
%%
- ?line ok = init_crypto(Node),
+ ok = init_crypto(Node),
%%
%% Write manager config
@@ -5183,10 +5156,10 @@ init_v3_manager(Config) ->
%% DomainType is just a "dummy" arg to make the
%% function choose transportDomainUdpIpv4 as transport domain.
- ?line ok = write_manager_config(transport, Config),
+ ok = write_manager_config(transport, Config),
IRB = auto,
- Conf = [{manager_node, Node}, {irb, IRB} | Config],
+ Conf = [{manager_node, Node}, {manager_peer, Peer}, {irb, IRB} | Config],
Vsns = [v3],
start_manager(Node, Vsns, Conf)
end
@@ -5196,7 +5169,7 @@ init_v3_manager(Config) ->
"~n Reason: ~p"
"~n StackTrace: ~p", [Reason, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
erlang:raise(C, E, S);
C:E:S ->
?EPRINT("Failure during manager start: "
@@ -5204,7 +5177,7 @@ init_v3_manager(Config) ->
"~n Error: ~p"
"~n StackTrace: ~p", [C, E, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
?FAIL({failed_starting_manager, C, E, S})
end.
@@ -5215,7 +5188,7 @@ fin_manager(Config) ->
Node = ?config(manager_node, Config),
StopMgrRes = stop_manager(Node),
StopCryptoRes = fin_crypto(Node),
- StopNode = stop_node(Node),
+ StopNode = peer:stop(?config(manager_peer, Config)),
?IPRINT("fin_manager -> stop apps and (mgr node ~p) node results: "
"~n SNMP Mgr: ~p"
"~n Crypto: ~p"
@@ -5226,7 +5199,7 @@ fin_manager(Config) ->
%% -- Misc agent functions --
-init_agent(Config) ->
+init_agent(Case, Config) ->
?IPRINT("init_agent -> entry with"
"~n Config: ~p", [Config]),
@@ -5240,7 +5213,7 @@ init_agent(Config) ->
%% Start node
%%
- ?line Node = start_agent_node(),
+ {Peer, Node} = start_node(lists:concat([Case, "-agent"])),
%% The point with this (try catch block) is to be
%% able to do some cleanup in case we fail to
@@ -5255,14 +5228,14 @@ init_agent(Config) ->
%% Start and initiate mnesia on agent node
%%
- ?line ok = init_mnesia(Node, Dir, ?config(mnesia_debug, Config)),
+ ok = init_mnesia(Node, Dir, ?config(mnesia_debug, Config)),
%% --
%% Start and initiate crypto on agent node
%%
- ?line ok = init_crypto(Node),
+ ok = init_crypto(Node),
%%
@@ -5270,9 +5243,9 @@ init_agent(Config) ->
%%
Vsns = [v1,v2],
- ?line ok = write_agent_config(Vsns, Config),
+ ok = write_agent_config(Vsns, Config),
- Conf = [{agent_node, Node},
+ Conf = [{agent_node, Node}, {agent_peer, Peer},
{mib_dir, MibDir} | Config],
%%
@@ -5287,7 +5260,7 @@ init_agent(Config) ->
"~n Reason: ~p"
"~n StackTrace: ~p", [Reason, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
erlang:raise(C, E, S);
C:E:S ->
?EPRINT("Failure during agent start: "
@@ -5295,12 +5268,12 @@ init_agent(Config) ->
"~n Error: ~p"
"~n StackTrace: ~p", [C, E, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
?FAIL({failed_starting_agent, C, E, S})
end.
-init_v3_agent(Config) ->
+init_v3_agent(Case, Config) ->
?IPRINT("init_v3_agent -> entry with"
"~n Config: ~p", [Config]),
@@ -5315,7 +5288,7 @@ init_v3_agent(Config) ->
%%
%% ?line Node = self(),
- ?line Node = start_unique_agent_node(),
+ ?line {Peer, Node} = start_node(lists:concat([Case, "-v3agent"])),
%% The point with this (try catch block) is to be
%% able to do some cleanup in case we fail to
@@ -5330,7 +5303,7 @@ init_v3_agent(Config) ->
%% Start and initiate crypto on agent node
%%
- ?line ok = init_crypto(Node),
+ ok = init_crypto(Node),
%%
@@ -5338,9 +5311,9 @@ init_v3_agent(Config) ->
%%
Vsns = [v3],
- ?line ok = write_agent_config(Vsns, Config),
+ ok = write_agent_config(Vsns, Config),
- Conf = [{agent_node, Node},
+ Conf = [{agent_node, Node}, {agent_peer, Peer},
{mib_dir, MibDir} | Config],
%%
@@ -5355,7 +5328,7 @@ init_v3_agent(Config) ->
"~n Reason: ~p"
"~n StackTrace: ~p", [Reason, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
erlang:raise(C, E, S);
C:E:S ->
?EPRINT("Failure during agent start: "
@@ -5363,7 +5336,7 @@ init_v3_agent(Config) ->
"~n Error: ~p"
"~n StackTrace: ~p", [C, E, S]),
%% And now, *try* to cleanup
- (catch stop_node(Node)),
+ (catch peer:stop(Peer)),
?FAIL({failed_starting_agent, C, E, S})
end.
@@ -5373,7 +5346,7 @@ fin_agent(Config) ->
StopAgentRes = stop_agent(Node),
StopCryptoRes = fin_crypto(Node),
StopMnesiaRes = fin_mnesia(Node),
- StopNode = stop_node(Node),
+ StopNode = peer:stop(?config(agent_peer, Config)),
?IPRINT("fin_agent -> stop apps and (agent node ~p) node results: "
"~n SNMP Agent: ~p"
"~n Crypto: ~p"
@@ -5386,7 +5359,7 @@ fin_v3_agent(Config) ->
Node = ?config(agent_node, Config),
StopAgentRes = stop_agent(Node),
StopCryptoRes = fin_crypto(Node),
- StopNode = stop_node(Node),
+ StopNode = peer:stop(?config(agent_peer, Config)),
?IPRINT("fin_agent -> stop apps and (agent node ~p) node results: "
"~n SNMP Agent: ~p"
"~n Crypto: ~p"
@@ -5400,52 +5373,52 @@ init_mnesia(Node, Dir, MnesiaDebug)
init_mnesia(Node, Dir, ?DEFAULT_MNESIA_DEBUG);
init_mnesia(Node, Dir, MnesiaDebug) ->
?DBG("init_mnesia -> load application mnesia", []),
- ?line ok = load_mnesia(Node),
+ ok = load_mnesia(Node),
?DBG("init_mnesia -> application mnesia: set_env dir: ~n~p",[Dir]),
- ?line ok = set_mnesia_env(Node, dir, filename:join(Dir, "mnesia")),
+ ok = set_mnesia_env(Node, dir, filename:join(Dir, "mnesia")),
%% Just in case, only set (known to be) valid values for debug
if
((MnesiaDebug =:= debug) orelse (MnesiaDebug =:= trace)) ->
?DBG("init_mnesia -> application mnesia: set_env debug: ~w",
[MnesiaDebug]),
- ?line ok = set_mnesia_env(Node, debug, MnesiaDebug);
+ ok = set_mnesia_env(Node, debug, MnesiaDebug);
true ->
ok
end,
?DBG("init_mnesia -> create mnesia schema",[]),
- ?line case create_schema(Node) of
+ case create_schema(Node) of
ok ->
ok;
{error, {Node, {already_exists, Node}}} ->
- ?line ok = delete_schema(Node),
- ?line ok = create_schema(Node);
+ ok = delete_schema(Node),
+ ok = create_schema(Node);
Error ->
?FAIL({failed_creating_mnesia_schema, Error})
end,
?DBG("init_mnesia -> start application mnesia",[]),
- ?line ok = start_mnesia(Node),
+ ok = start_mnesia(Node),
?DBG("init_mnesia -> create tables",[]),
- ?line ok = create_tables(Node),
+ ok = create_tables(Node),
ok.
fin_mnesia(Node) ->
- ?line ok = delete_tables(Node),
- ?line ok = stop_mnesia(Node),
+ ok = delete_tables(Node),
+ ok = stop_mnesia(Node),
ok.
init_crypto(Node) ->
- ?line ok = load_crypto(Node),
- ?line ok = start_crypto(Node),
+ ok = load_crypto(Node),
+ ok = start_crypto(Node),
ok.
fin_crypto(Node) ->
- ?line ok = stop_crypto(Node),
+ ok = stop_crypto(Node),
ok.
@@ -5662,7 +5635,7 @@ init_mgr_user(Conf) ->
Node = ?config(manager_node, Conf),
%% UserId = ?config(user_id, Conf),
- ?line {ok, User} = mgr_user_start(Node),
+ {ok, User} = mgr_user_start(Node),
?DBG("start_mgr_user -> User: ~p", [User]),
link(User),
@@ -5675,7 +5648,7 @@ init_mgr_v3_user(Conf) ->
Node = ?config(manager_node, Conf),
%% UserId = ?config(user_id, Conf),
- ?line {ok, User} = mgr_user_start(Node),
+ {ok, User} = mgr_user_start(Node),
?IPRINT("start_mgr_v3_user -> User: ~p", [User]),
link(User),
@@ -5687,7 +5660,7 @@ init_mgr_v3_user(Conf) ->
[ {auth, select_auth_proto(AuthAlg)},
{auth_key, AuthKey}
],
- ?line ok = mgr_register_usm_user(Node, EngineID, SecName, Credentials),
+ ok = mgr_register_usm_user(Node, EngineID, SecName, Credentials),
?IPRINT("start_mgr_v3_user -> done"),
[{user_pid, User} | Conf].
@@ -5723,7 +5696,7 @@ fin_mgr_user(Conf) ->
User = ?config(user_pid, Conf),
unlink(User),
Node = ?config(manager_node, Conf),
- ?line ok = mgr_user_stop(Node),
+ ok = mgr_user_stop(Node),
Conf.
init_mgr_user_data1(Conf) ->
@@ -5732,7 +5705,7 @@ init_mgr_user_data1(Conf) ->
IpFamily = ?config(ipfamily, Conf),
Ip = ?config(ip, Conf),
Port = ?AGENT_PORT,
- ?line ok =
+ ok =
case IpFamily of
inet ->
mgr_user_register_agent(
@@ -5750,19 +5723,19 @@ init_mgr_user_data1(Conf) ->
_Agents = mgr_user_which_own_agents(Node),
?DBG("Own agents: ~p", [_Agents]),
- ?line {ok, _DefAgentConf} = mgr_user_agent_info(Node, TargetName, all),
+ {ok, _DefAgentConf} = mgr_user_agent_info(Node, TargetName, all),
?DBG("Default agent config: ~n~p", [_DefAgentConf]),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
community, "all-rights"),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
sec_name, "all-rights"),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
engine_id, "agentEngine"),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
max_message_size, 1024),
- ?line {ok, _AgentConf} = mgr_user_agent_info(Node, TargetName, all),
+ {ok, _AgentConf} = mgr_user_agent_info(Node, TargetName, all),
?DBG("Updated agent config: ~n~p", [_AgentConf]),
Conf.
@@ -5774,7 +5747,7 @@ init_mgr_user_data2(Conf) ->
IpFamily = ?config(ipfamily, Conf),
Ip = ?config(ip, Conf),
Port = ?AGENT_PORT,
- ?line ok =
+ ok =
case IpFamily of
inet ->
mgr_user_register_agent(
@@ -5792,17 +5765,17 @@ init_mgr_user_data2(Conf) ->
_Agents = mgr_user_which_own_agents(Node),
?DBG("Own agents: ~p", [_Agents]),
- ?line {ok, _DefAgentConf} = mgr_user_agent_info(Node, TargetName, all),
+ {ok, _DefAgentConf} = mgr_user_agent_info(Node, TargetName, all),
?DBG("Default agent config: ~n~p", [_DefAgentConf]),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
community, "all-rights"),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
sec_name, "all-rights"),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
max_message_size, 1024),
- ?line {ok, _AgentConf} = mgr_user_agent_info(Node, TargetName, all),
+ {ok, _AgentConf} = mgr_user_agent_info(Node, TargetName, all),
?DBG("Updated agent config: ~n~p", [_AgentConf]),
Conf.
@@ -5814,7 +5787,7 @@ init_mgr_v3_user_data(Conf) ->
IpFamily = ?config(ipfamily, Conf),
Ip = ?config(ip, Conf),
Port = ?AGENT_PORT,
- ?line ok =
+ ok =
case IpFamily of
inet ->
mgr_user_register_agent(
@@ -5834,22 +5807,22 @@ init_mgr_v3_user_data(Conf) ->
_Agents = mgr_user_which_own_agents(Node),
?IPRINT("Own agents: ~p", [_Agents]),
- ?line {ok, _DefAgentConf} = mgr_user_agent_info(Node, TargetName, all),
+ {ok, _DefAgentConf} = mgr_user_agent_info(Node, TargetName, all),
?IPRINT("Default agent config: ~n~p", [_DefAgentConf]),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
community, "all-rights"),
SecName = select_secname_from_authalg(?config(auth_alg, Conf)),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
sec_name, SecName),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
sec_level, authNoPriv),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
sec_model, usm),
- ?line ok = mgr_user_update_agent_info(Node, TargetName,
+ ok = mgr_user_update_agent_info(Node, TargetName,
max_message_size, 1024),
- ?line {ok, _AgentConf} = mgr_user_agent_info(Node, TargetName, all),
+ {ok, _AgentConf} = mgr_user_agent_info(Node, TargetName, all),
?IPRINT("Updated agent config: ~n~p", [_AgentConf]),
Conf.
@@ -5992,9 +5965,9 @@ start_manager(Node, Vsns, Conf0, _Opts) ->
{cbproxy, CBP},
{netif_sup, NIS}]},
{net_if, NetIfConf}],
- ?line ok = set_mgr_env(Node, Env),
+ ok = set_mgr_env(Node, Env),
- ?line ok = try start_snmp(Node) of
+ ok = try start_snmp(Node) of
ok ->
ok;
{error, Reason} ->
@@ -6059,9 +6032,9 @@ start_agent(Node, Vsns, Conf0, _Opts) ->
%% (which will cause problems for some test cases).
{options, [{bind_to, true}]}]},
{multi_threaded, true}],
- ?line ok = set_agent_env(Node, Env),
+ ok = set_agent_env(Node, Env),
- ?line try start_snmp(Node) of
+ try start_snmp(Node) of
ok ->
ok;
{error, Reason} ->
@@ -6100,87 +6073,12 @@ agent_info(Node) ->
%% -- Misc node operation wrapper functions --
-unique(PreName) ->
- list_to_atom(?F("~w_~w", [PreName, erlang:system_time(millisecond)])).
-
-start_agent_node() ->
- start_node(snmp_agent).
-
-start_unique_agent_node() ->
- start_unique_node(snmp_agent).
-
-start_manager_node() ->
- start_node(snmp_manager).
-
-start_unique_manager_node() ->
- start_unique_node(snmp_manager).
-
-%% Generate a "unique" (node-) name and start a node with this name.
-start_unique_node(BaseName) when is_atom(BaseName) ->
- start_node(unique(BaseName), false).
-
-start_node(Name) ->
- start_node(Name, true).
-start_node(Name, Retry) ->
-
- ?IPRINT("start_node -> entry with"
- "~n Name: ~p"
- "~n when"
- "~n hostname of this node: ~p",
- [Name, list_to_atom(?HOSTNAME(node()))]),
-
- Pa = filename:dirname(code:which(?MODULE)),
-
- A = " -pa " ++ Pa ++
- " -s " ++ atom_to_list(snmp_test_sys_monitor) ++ " start" ++
- " -s global sync",
- try ?START_NODE(Name, A) of
- {ok, Node} ->
- global:sync(),
- Node;
- {error, timeout} ->
- ?EPRINT("Failed starting node ~p: timeout", [Name]),
- ?line ?FAIL({error_starting_node, Name, timeout});
- {error, {already_running, Node}} when (Retry =:= true) ->
- %% Ouch
- %% Either we previously failed to (properly) stop the node
- %% or it was a failed start, that reported failure (for instance
- %% timeout) but actually succeeded. Regardless, we don't know
- %% the state of this node, so (try) stop it and then (re-) try
- %% start again.
- ?WPRINT("Failed starting node ~p: Already Running - try stop", [Node]),
- case ?STOP_NODE(Node) of
- true ->
- ?IPRINT("Successfully stopped old node ~p", [Node]),
- start_node(Name, false);
- false ->
- ?EPRINT("Failed stop old node ~p", [Node]),
- ?line ?FAIL({error_starting_node, Node, Retry, already_running})
- end;
- {error, {already_running, Node}} ->
- ?EPRINT("Failed starting node ~p: Already Running", [Node]),
- ?line ?FAIL({error_starting_node, Node, Retry, already_running});
- {error, Reason} ->
- ?EPRINT("Failed starting node ~p: ~p", [Name, Reason]),
- ?line ?FAIL({error_starting_node, Name, Reason})
- catch
- exit:{suite_failed, Reason} ->
- ?EPRINT("(suite) Failed starting node ~p: ~p", [Name, Reason]),
- ?line ?FAIL({failed_starting_node, Name, Reason})
- end.
-
-
-stop_node(Node) when (Node =:= self()) ->
- ok;%?line ?FAIL({stop_own_node, Node});
-stop_node(Node) ->
- case ?STOP_NODE(Node) of
- true ->
- ok;
- false ->
- ?line ?FAIL({failed_stop_node, Node})
- end.
-
-
+start_node(Case) ->
+ Args = ["-s", "snmp_test_sys_monitor", "start", "-s", "global", "sync"],
+ Name = peer:random_name(lists:concat([?MODULE, "-", Case])),
+ {ok, Peer, Node} = ?CT_PEER(#{name => Name, args => Args}),
+ global:sync(),
+ {Peer, Node}.
%% -- Misc config wrapper functions --
@@ -6224,21 +6122,21 @@ write_manager_conf(Dir, Str) ->
write_agent_config(Vsns, Conf) ->
Dir = ?config(agent_conf_dir, Conf),
- ?line Ip = tuple_to_list(?config(ip, Conf)),
- ?line Domain =
+ Ip = tuple_to_list(?config(ip, Conf)),
+ Domain =
case ?config(ipfamily, Conf) of
inet ->
transportDomainUdpIpv4;
inet6 ->
transportDomainUdpIpv6
end,
- ?line ok = write_agent_config_files(Dir, Vsns, Domain, Ip),
- ?line ok = update_agent_usm(Vsns, Dir),
- ?line ok = update_agent_community(Vsns, Dir),
- ?line ok = update_agent_vacm(Vsns, Dir),
- ?line ok = write_agent_target_addr_conf(Dir, Domain, Ip, Vsns),
- ?line ok = write_agent_target_params_conf(Dir, Vsns),
- ?line ok = write_agent_notify_conf(Dir),
+ ok = write_agent_config_files(Dir, Vsns, Domain, Ip),
+ ok = update_agent_usm(Vsns, Dir),
+ ok = update_agent_community(Vsns, Dir),
+ ok = update_agent_vacm(Vsns, Dir),
+ ok = write_agent_target_addr_conf(Dir, Domain, Ip, Vsns),
+ ok = write_agent_target_params_conf(Dir, Vsns),
+ ok = write_agent_notify_conf(Dir),
ok.
write_agent_config_files(Dir, Vsns, Domain, Ip) ->
@@ -6381,8 +6279,8 @@ write_agent_notify_conf(Dir) ->
write_conf_file(Dir, File, Str) ->
- ?line {ok, Fd} = file:open(filename:join(Dir, File), write),
- ?line ok = io:format(Fd, "~s", [Str]),
+ {ok, Fd} = file:open(filename:join(Dir, File), write),
+ ok = io:format(Fd, "~s", [Str]),
file:close(Fd).
diff --git a/lib/snmp/test/snmp_manager_config_SUITE.erl b/lib/snmp/test/snmp_manager_config_SUITE.erl
index f70f506fb0..933be4e016 100644
--- a/lib/snmp/test/snmp_manager_config_SUITE.erl
+++ b/lib/snmp/test/snmp_manager_config_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -272,22 +272,22 @@ init_per_testcase(Case, Config) when is_list(Config) ->
SuiteTopDir = ?config(snmp_suite_top_dir, Config),
CaseTopDir = filename:join(SuiteTopDir, atom_to_list(Case)),
- ?line ok = file:make_dir(CaseTopDir),
+ ok = file:make_dir(CaseTopDir),
?IPRINT("init_per_testcase -> CaseTopDir: ~p", [CaseTopDir]),
MgrTopDir = filename:join(CaseTopDir, "manager/"),
- ?line ok = file:make_dir(MgrTopDir),
+ ok = file:make_dir(MgrTopDir),
MgrConfDir = filename:join(MgrTopDir, "conf/"),
- ?line ok = file:make_dir(MgrConfDir),
+ ok = file:make_dir(MgrConfDir),
MgrDbDir = filename:join(MgrTopDir, "db/"),
case Case of
start_with_create_db_and_dir_opt ->
ok;
_ ->
- ?line ok = file:make_dir(MgrDbDir)
+ ok = file:make_dir(MgrDbDir)
end,
MgrLogDir = filename:join(MgrTopDir, "log/"),
- ?line ok = file:make_dir(MgrLogDir),
+ ok = file:make_dir(MgrLogDir),
Config1 = [{case_top_dir, CaseTopDir},
{manager_dir, MgrTopDir},
{manager_conf_dir, MgrConfDir},
@@ -308,7 +308,7 @@ end_per_testcase(_Case, Config) when is_list(Config) ->
?IPRINT("system events during test: "
"~n ~p", [snmp_test_global_sys_monitor:events()]),
- %% The cleanup is removed due to some really discusting NFS behaviour...
+ %% The cleanup is removed due to some really disgusting NFS behaviour...
%% Also, it can always be useful to retain "all the stuff" after
%% the test case in case of debugging...
Config.
@@ -338,8 +338,8 @@ simple_start_and_stop(Conf) when is_list(Conf) ->
Opts = [{versions, [v1]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
- ?line {ok, _Pid} = snmpm_config:start_link(Opts),
- ?line ok = snmpm_config:stop(),
+ {ok, _Pid} = snmpm_config:start_link(Opts),
+ ok = snmpm_config:stop(),
ok.
@@ -367,7 +367,7 @@ start_without_mandatory_opts1(Conf) when is_list(Conf) ->
?IPRINT("config option, but no dir"),
Opts = [{priority, normal},
{config, [{verbosity, trace}, {db_dir, DbDir}]}, {mibs, []}],
- ?line {error, {missing_mandatory,dir}} = config_start(Opts),
+ {error, {missing_mandatory,dir}} = config_start(Opts),
?IPRINT("done"),
ok.
@@ -395,7 +395,7 @@ start_without_mandatory_opts2(Conf) when is_list(Conf) ->
?IPRINT("no config option"),
Opts = [{priority, normal},
{mibs, []}],
- ?line {error, {missing_mandatory,config,[dir, db_dir]}} =
+ {error, {missing_mandatory,config,[dir, db_dir]}} =
config_start(Opts),
?IPRINT("done"),
@@ -456,8 +456,8 @@ start_with_all_valid_opts(Conf) when is_list(Conf) ->
{priority, Prio},
{mibs, Mibs},
{versions, Vsns}],
- ?line {ok, _Pid} = config_start(Opts),
- ?line ok = config_stop(),
+ {ok, _Pid} = config_start(Opts),
+ ok = config_stop(),
?IPRINT("done"),
ok.
@@ -510,10 +510,10 @@ start_with_unknown_opts(Conf) when is_list(Conf) ->
{priority, Prio},
{mibs, Mibs},
{versions, Vsns}],
- ?line {ok, _Pid} = config_start(Opts),
+ {ok, _Pid} = config_start(Opts),
?IPRINT("(config) started - now stop"),
- ?line ok = config_stop(),
+ ok = config_stop(),
?IPRINT("done"),
ok.
@@ -544,35 +544,35 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
NetIfOpts1 = [{module, snmpm_user}], %% Behaviour check will fail
Opts01 = [{config, ConfigOpts}, {versions, [v1]},
{net_if, NetIfOpts1}],
- ?line {error, Reason01} = config_start(Opts01),
+ {error, Reason01} = config_start(Opts01),
?IPRINT("net-if (module) res: ~p", [Reason01]),
?IPRINT("net-if - incorrect verbosity"),
NetIfOpts2 = [{verbosity, invalid_verbosity}],
Opts02 = [{config, ConfigOpts}, {versions, [v1]},
{net_if, NetIfOpts2}],
- ?line {error, Reason02} = config_start(Opts02),
+ {error, Reason02} = config_start(Opts02),
?IPRINT("net-if (verbosity) res: ~p", [Reason02]),
?IPRINT("net-if - incorrect options"),
NetIfOpts3 = [{options, invalid_options}],
Opts03 = [{config, ConfigOpts}, {versions, [v1]},
{net_if, NetIfOpts3}],
- ?line {error, Reason03} = config_start(Opts03),
+ {error, Reason03} = config_start(Opts03),
?IPRINT("net-if (options) res: ~p", [Reason03]),
?IPRINT("server - incorrect timeout (1)"),
ServerOpts1 = [{timeout, invalid_timeout}],
Opts08 = [{config, ConfigOpts}, {versions, [v1]},
{server, ServerOpts1}],
- ?line {error, Reason08} = config_start(Opts08),
+ {error, Reason08} = config_start(Opts08),
?IPRINT("server (timeout) res: ~p", [Reason08]),
?IPRINT("server - incorrect timeout (2)"),
ServerOpts2 = [{timeout, 0}],
Opts09 = [{config, ConfigOpts}, {versions, [v1]},
{server, ServerOpts2}],
- ?line {error, Reason09} = config_start(Opts09),
+ {error, Reason09} = config_start(Opts09),
?IPRINT("server (timeout) res: ~p", [Reason09]),
?IPRINT("server - incorrect timeout (3)"),
@@ -580,7 +580,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts10 = [{config, ConfigOpts},
{versions, [v1]},
{server, ServerOpts3}],
- ?line {error, Reason10} = config_start(Opts10),
+ {error, Reason10} = config_start(Opts10),
?IPRINT("server (timeout) res: ~p", [Reason10]),
?IPRINT("server - incorrect verbosity"),
@@ -588,7 +588,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts11 = [{config, ConfigOpts},
{versions, [v1]},
{server, ServerOpts4}],
- ?line {error, Reason11} = config_start(Opts11),
+ {error, Reason11} = config_start(Opts11),
?IPRINT("server (verbosity) res: ~p", [Reason11]),
?IPRINT("note-store - incorrect timeout (1)"),
@@ -596,7 +596,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts12 = [{config, ConfigOpts},
{versions, [v1]},
{note_store, NoteStoreOpts1}],
- ?line {error, Reason12} = config_start(Opts12),
+ {error, Reason12} = config_start(Opts12),
?IPRINT("note-store (timeout) res: ~p", [Reason12]),
?IPRINT("note-store - incorrect timeout (2)"),
@@ -604,7 +604,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts13 = [{config, ConfigOpts},
{versions, [v1]},
{note_store, NoteStoreOpts2}],
- ?line {error, Reason13} = config_start(Opts13),
+ {error, Reason13} = config_start(Opts13),
?IPRINT("note-store (timeout) res: ~p", [Reason13]),
?IPRINT("note-store - incorrect timeout (3)"),
@@ -612,7 +612,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts14 = [{config, ConfigOpts},
{versions, [v1]},
{note_store, NoteStoreOpts3}],
- ?line {error, Reason14} = config_start(Opts14),
+ {error, Reason14} = config_start(Opts14),
?IPRINT("note-store (timeout) res: ~p", [Reason14]),
?IPRINT("note-store - incorrect verbosity"),
@@ -620,28 +620,28 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts15 = [{config, ConfigOpts},
{versions, [v1]},
{note_store, NoteStoreOpts4}],
- ?line {error, Reason15} = config_start(Opts15),
+ {error, Reason15} = config_start(Opts15),
?IPRINT("note-store (verbosity) res: ~p", [Reason15]),
?IPRINT("config - incorrect dir (1)"),
ConfigOpts1 = [{dir, invalid_dir}],
Opts16 = [{config, ConfigOpts1},
{versions, [v1]}],
- ?line {error, Reason16} = config_start(Opts16),
+ {error, Reason16} = config_start(Opts16),
?IPRINT("config (dir) res: ~p", [Reason16]),
?IPRINT("config - incorrect dir (2)"),
ConfigOpts2 = [{dir, "/invalid/dir"}],
Opts17 = [{config, ConfigOpts2},
{versions, [v1]}],
- ?line {error, Reason17} = config_start(Opts17),
+ {error, Reason17} = config_start(Opts17),
?IPRINT("config (dir) res: ~p", [Reason17]),
?IPRINT("config - incorrect verbosity"),
ConfigOpts3 = [{dir, ConfDir}, {verbosity, invalid_verbosity}],
Opts18 = [{config, ConfigOpts3},
{versions, [v1]}],
- ?line {error, Reason18} = config_start(Opts18),
+ {error, Reason18} = config_start(Opts18),
?IPRINT("config (verbosity) res: ~p", [Reason18]),
?IPRINT("mibs - incorrect mibs (1)"),
@@ -649,7 +649,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts19 = [{config, ConfigOpts},
{versions, [v1]},
{mibs, Mibs1}],
- ?line {error, Reason19} = config_start(Opts19),
+ {error, Reason19} = config_start(Opts19),
?IPRINT("mibs (mibs) res: ~p", [Reason19]),
?IPRINT("mibs - incorrect mibs (2)"),
@@ -657,7 +657,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts20 = [{config, ConfigOpts},
{versions, [v1]},
{mibs, Mibs2}],
- ?line {error, Reason20} = config_start(Opts20),
+ {error, Reason20} = config_start(Opts20),
?IPRINT("mibs (mibs) res: ~p", [Reason20]),
?IPRINT("prio - incorrect prio"),
@@ -665,7 +665,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts21 = [{config, ConfigOpts},
{versions, [v1]},
{priority, Prio1}],
- ?line {error, Reason21} = config_start(Opts21),
+ {error, Reason21} = config_start(Opts21),
?IPRINT("prio (prio) res: ~p", [Reason21]),
?IPRINT("atl - incorrect type"),
@@ -676,7 +676,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts22 = [{config, ConfigOpts},
{versions, [v1]},
{audit_trail_log, ATL1}],
- ?line {error, Reason22} = config_start(Opts22),
+ {error, Reason22} = config_start(Opts22),
?IPRINT("atl (type) res: ~p", [Reason22]),
?IPRINT("atl - incorrect dir (1)"),
@@ -687,7 +687,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts23 = [{config, ConfigOpts},
{versions, [v1]},
{audit_trail_log, ATL2}],
- ?line {error, Reason23} = config_start(Opts23),
+ {error, Reason23} = config_start(Opts23),
?IPRINT("atl (dir) res: ~p", [Reason23]),
?IPRINT("atl - incorrect dir (2)"),
@@ -698,7 +698,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts24 = [{config, ConfigOpts},
{versions, [v1]},
{audit_trail_log, ATL3}],
- ?line {error, Reason24} = config_start(Opts24),
+ {error, Reason24} = config_start(Opts24),
?IPRINT("atl (dir) res: ~p", [Reason24]),
?IPRINT("atl - incorrect size (1)"),
@@ -709,7 +709,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts25 = [{config, ConfigOpts},
{versions, [v1]},
{audit_trail_log, ATL4}],
- ?line {error, Reason25} = config_start(Opts25),
+ {error, Reason25} = config_start(Opts25),
?IPRINT("atl (size) res: ~p", [Reason25]),
?IPRINT("atl - incorrect size (2)"),
@@ -720,7 +720,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts26 = [{config, ConfigOpts},
{versions, [v1]},
{audit_trail_log, ATL5}],
- ?line {error, Reason26} = config_start(Opts26),
+ {error, Reason26} = config_start(Opts26),
?IPRINT("atl (size) res: ~p", [Reason26]),
?IPRINT("atl - incorrect size (3)"),
@@ -731,7 +731,7 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts27 = [{config, ConfigOpts},
{versions, [v1]},
{audit_trail_log, ATL6}],
- ?line {error, Reason27} = config_start(Opts27),
+ {error, Reason27} = config_start(Opts27),
?IPRINT("atl (size) res: ~p", [Reason27]),
?IPRINT("atl - incorrect repair"),
@@ -742,21 +742,21 @@ start_with_incorrect_opts(Conf) when is_list(Conf) ->
Opts28 = [{config, ConfigOpts},
{versions, [v1]},
{audit_trail_log, ATL7}],
- ?line {error, Reason28} = config_start(Opts28),
+ {error, Reason28} = config_start(Opts28),
?IPRINT("atl (repair) res: ~p", [Reason28]),
?IPRINT("version - incorrect versions (1)"),
Vsns1 = invalid_vsns,
Opts29 = [{config, ConfigOpts},
{versions, Vsns1}],
- ?line {error, Reason29} = config_start(Opts29),
+ {error, Reason29} = config_start(Opts29),
?IPRINT("versions (versions) res: ~p", [Reason29]),
?IPRINT("version - incorrect versions (2)"),
Vsns2 = [v1,v2,v3,v9],
Opts30 = [{config, ConfigOpts},
{versions, Vsns2}],
- ?line {error, Reason30} = config_start(Opts30),
+ {error, Reason30} = config_start(Opts30),
?IPRINT("versions (versions) res: ~p", [Reason30]),
?IPRINT("done"),
@@ -784,136 +784,136 @@ start_with_invalid_manager_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("write manager config file with invalid IP address (1)"),
write_manager_conf(ConfDir,
"arne-anka", "4001", "500", "\"bmkEngine\""),
- ?line {error, Reason11} = config_start(Opts),
+ {error, Reason11} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason11]),
- ?line {failed_reading, _, _, 1, {parse_error, _}} = Reason11,
+ {failed_reading, _, _, 1, {parse_error, _}} = Reason11,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid IP address (2)"),
write_manager_conf(ConfDir,
"arne_anka", "4001", "500", "\"bmkEngine\""),
- ?line {error, Reason12} = config_start(Opts),
+ {error, Reason12} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason12]),
- ?line {failed_check, _, _, 2, {bad_address, _}} = Reason12,
+ {failed_check, _, _, 2, {bad_address, _}} = Reason12,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid IP address (3)"),
write_manager_conf(ConfDir,
"9999", "4001", "500", "\"bmkEngine\""),
- ?line {error, Reason13} = config_start(Opts),
+ {error, Reason13} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason13]),
- ?line {failed_check, _, _, 2, {bad_address, _}} = Reason13,
+ {failed_check, _, _, 2, {bad_address, _}} = Reason13,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid port (2)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "kalle-anka", "500", "\"bmkEngine\""),
- ?line {error, Reason21} = config_start(Opts),
+ {error, Reason21} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason21]),
- ?line {failed_reading, _, _, 2, {parse_error, _}} = Reason21,
+ {failed_reading, _, _, 2, {parse_error, _}} = Reason21,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid port (1)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "-1", "500", "\"bmkEngine\""),
- ?line {error, Reason22} = config_start(Opts),
+ {error, Reason22} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason22]),
io:format("Reason22: ~p~n", [Reason22]),
- ?line {failed_check, _, _, 3, {bad_port, _}} = Reason22,
+ {failed_check, _, _, 3, {bad_port, _}} = Reason22,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid port (3)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "\"kalle-anka\"", "500", "\"bmkEngine\""),
- ?line {error, Reason23} = config_start(Opts),
+ {error, Reason23} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason23]),
- ?line {failed_check, _, _, 3, {bad_port, _}} = Reason23,
+ {failed_check, _, _, 3, {bad_port, _}} = Reason23,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid EngineID (1)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "4001", "500", "bmkEngine"),
- ?line {error, Reason31} = config_start(Opts),
+ {error, Reason31} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason31]),
- ?line {failed_check, _, _, 5, {invalid_string, _}} = Reason31,
+ {failed_check, _, _, 5, {invalid_string, _}} = Reason31,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid EngineID (2)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "4001", "500", "{1,2,3}"),
- ?line {error, Reason32} = config_start(Opts),
+ {error, Reason32} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason32]),
- ?line {failed_check, _, _, 5, {invalid_string, _}} = Reason32,
+ {failed_check, _, _, 5, {invalid_string, _}} = Reason32,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid EngineID (3)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "4001", "500", "10101"),
- ?line {error, Reason33} = config_start(Opts),
+ {error, Reason33} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason33]),
- ?line {failed_check, _, _, 5, {invalid_string, _}} = Reason33,
+ {failed_check, _, _, 5, {invalid_string, _}} = Reason33,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid MMS (1)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "4001", "483", "\"bmkEngine\""),
- ?line {error, Reason41} = config_start(Opts),
+ {error, Reason41} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason41]),
- ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason41,
+ {failed_check, _, _, 4, {invalid_integer, _}} = Reason41,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid MMS (2)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "4001", "-1", "\"bmkEngine\""),
- ?line {error, Reason42} = config_start(Opts),
+ {error, Reason42} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason42]),
- ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason42,
+ {failed_check, _, _, 4, {invalid_integer, _}} = Reason42,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid MMS (3)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "4001", "\"kalle-anka\"", "\"bmkEngine\""),
- ?line {error, Reason43} = config_start(Opts),
+ {error, Reason43} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason43]),
- ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason43,
+ {failed_check, _, _, 4, {invalid_integer, _}} = Reason43,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with invalid MMS (4)"),
write_manager_conf(ConfDir,
"[134,138,177,189]", "4001", "kalle_anka", "\"bmkEngine\""),
- ?line {error, Reason44} = config_start(Opts),
+ {error, Reason44} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason44]),
- ?line {failed_check, _, _, 4, {invalid_integer, _}} = Reason44,
+ {failed_check, _, _, 4, {invalid_integer, _}} = Reason44,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with unknown option"),
write_manager_conf(ConfDir,
"{kalle, anka}."),
- ?line {error, Reason51} = config_start(Opts),
+ {error, Reason51} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason51]),
- ?line {failed_check, _, _, 1, {unknown_config, _}} = Reason51,
+ {failed_check, _, _, 1, {unknown_config, _}} = Reason51,
config_ensure_not_running(),
%% --
?IPRINT("write manager config file with unknown option"),
write_manager_conf(ConfDir,
"kalle_anka."),
- ?line {error, Reason52} = config_start(Opts),
+ {error, Reason52} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason52]),
- ?line {failed_check, _, _, 1, {unknown_config, _}} = Reason52,
+ {failed_check, _, _, 1, {unknown_config, _}} = Reason52,
config_ensure_not_running(),
?IPRINT("done"),
@@ -945,73 +945,73 @@ start_with_invalid_users_conf_file1(Conf) when is_list(Conf) ->
%% --
?IPRINT("write users config file with invalid module (1)"),
write_users_conf(ConfDir, [{"kalle", "kalle", "dummy"}]),
- ?line {error, Reason11} = config_start(Opts),
+ {error, Reason11} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason11]),
- ?line {failed_check, _, _, _, {bad_module, kalle}} = Reason11,
+ {failed_check, _, _, _, {bad_module, kalle}} = Reason11,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid module (1)"),
write_users_conf(ConfDir, [{"kalle", "snmpm", "dummy"}]),
- ?line {error, Reason12} = config_start(Opts),
+ {error, Reason12} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason12]),
- ?line {failed_check, _, _, _, {bad_module, _}} = Reason12,
+ {failed_check, _, _, _, {bad_module, _}} = Reason12,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid module (2)"),
write_users_conf(ConfDir, [{"kalle1", "10101", "dummy"}]),
- ?line {error, Reason13} = config_start(Opts),
+ {error, Reason13} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason13]),
- ?line {failed_check, _, _, _, {bad_module, _}} = Reason13,
+ {failed_check, _, _, _, {bad_module, _}} = Reason13,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid user tuple (1)"),
write_users_conf2(ConfDir, "{kalle, snmpm_user_default}."),
- ?line {error, Reason21} = config_start(Opts),
+ {error, Reason21} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason21]),
- ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason21,
+ {failed_check, _, _, _, {bad_user_config, _}} = Reason21,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid user tuple (2)"),
write_users_conf2(ConfDir, "{kalle, snmpm_user_default, kalle, [], olle}."),
- ?line {error, Reason22} = config_start(Opts),
+ {error, Reason22} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason22]),
- ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason22,
+ {failed_check, _, _, _, {bad_user_config, _}} = Reason22,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid user tuple (3)"),
write_users_conf2(ConfDir, "snmpm_user_default."),
- ?line {error, Reason23} = config_start(Opts),
+ {error, Reason23} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason23]),
- ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason23,
+ {failed_check, _, _, _, {bad_user_config, _}} = Reason23,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid user tuple (4)"),
write_users_conf2(ConfDir, "[kalle, snmpm_user_default, kalle]."),
- ?line {error, Reason24} = config_start(Opts),
+ {error, Reason24} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason24]),
- ?line {failed_check, _, _, _, {bad_user_config, _}} = Reason24,
+ {failed_check, _, _, _, {bad_user_config, _}} = Reason24,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid user agent default config (1)"),
write_users_conf2(ConfDir, "{kalle, snmpm_user_default, kalle, olle}."),
- ?line {error, Reason31} = config_start(Opts),
+ {error, Reason31} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason31]),
- ?line {failed_check, _, _, _, {bad_default_agent_config, _}} = Reason31,
+ {failed_check, _, _, _, {bad_default_agent_config, _}} = Reason31,
config_ensure_not_running(),
%% --
?IPRINT("write users config file with invalid user agent default config (2)"),
write_users_conf2(ConfDir, "{kalle, snmpm_user_default, kalle, [olle]}."),
- ?line {error, Reason32} = config_start(Opts),
+ {error, Reason32} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason32]),
- %% ?line {failed_check, _, _, _, {bad_default_agent_config, _}} = Reason32,
+ %% {failed_check, _, _, _, {bad_default_agent_config, _}} = Reason32,
case Reason32 of
{failed_check, _, _, _, {bad_default_agent_config, _}} ->
ok;
@@ -1059,7 +1059,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason11} ->
?IPRINT("start failed (as expected): ~p", [Reason11]),
- ?line {failed_reading, _, _, _, {parse_error, _}} = Reason11,
+ {failed_reading, _, _, _, {parse_error, _}} = Reason11,
config_ensure_not_running();
OK_11 ->
config_ensure_not_running(),
@@ -1073,7 +1073,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason21} ->
?IPRINT("start failed (as expected): ~p", [Reason21]),
- ?line {failed_reading, _, _, _, {parse_error, _}} = Reason21,
+ {failed_reading, _, _, _, {parse_error, _}} = Reason21,
config_ensure_not_running();
OK_21 ->
config_ensure_not_running(),
@@ -1087,7 +1087,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason22} ->
?IPRINT("start failed (as expected): ~p", [Reason22]),
- ?line {failed_check, _, _, _, {invalid_string, _}} = Reason22,
+ {failed_check, _, _, _, {invalid_string, _}} = Reason22,
config_ensure_not_running();
OK_22 ->
config_ensure_not_running(),
@@ -1101,7 +1101,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason23} ->
?IPRINT("start failed (as expected): ~p", [Reason23]),
- ?line {failed_check, _, _, _, {invalid_string, _}} = Reason23,
+ {failed_check, _, _, _, {invalid_string, _}} = Reason23,
config_ensure_not_running();
OK_23 ->
config_ensure_not_running(),
@@ -1115,7 +1115,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason31} ->
?IPRINT("start failed (as expected): ~p", [Reason31]),
- ?line {failed_reading, _, _, _, {parse_error, _}} = Reason31,
+ {failed_reading, _, _, _, {parse_error, _}} = Reason31,
config_ensure_not_running();
OK_31 ->
config_ensure_not_running(),
@@ -1129,7 +1129,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason32} ->
?IPRINT("start failed (as expected): ~p", [Reason32]),
- ?line {failed_check, _, _, _, {invalid_string, _}} = Reason32,
+ {failed_check, _, _, _, {invalid_string, _}} = Reason32,
config_ensure_not_running();
OK_32 ->
config_ensure_not_running(),
@@ -1143,7 +1143,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason33} ->
?IPRINT("start failed (as expected): ~p", [Reason33]),
- ?line {failed_check, _, _, _, {invalid_string, _}} = Reason33,
+ {failed_check, _, _, _, {invalid_string, _}} = Reason33,
config_ensure_not_running();
OK_33 ->
config_ensure_not_running(),
@@ -1157,7 +1157,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason51} ->
?IPRINT("start failed (as expected): ~p", [Reason51]),
- ?line {failed_check, _, _, _, {bad_domain, _}} = Reason51,
+ {failed_check, _, _, _, {bad_domain, _}} = Reason51,
config_ensure_not_running();
OK_51 ->
config_ensure_not_running(),
@@ -1171,7 +1171,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason52} ->
?IPRINT("start failed (as expected): ~p", [Reason52]),
- ?line {failed_check, _, _, _, {bad_address, _}} = Reason52,
+ {failed_check, _, _, _, {bad_address, _}} = Reason52,
config_ensure_not_running();
OK_52 ->
config_ensure_not_running(),
@@ -1185,7 +1185,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason53} ->
?IPRINT("start failed (as expected): ~p", [Reason53]),
- ?line {failed_check, _, _, _, {bad_address, _}} = Reason53,
+ {failed_check, _, _, _, {bad_address, _}} = Reason53,
config_ensure_not_running();
OK_53 ->
config_ensure_not_running(),
@@ -1199,7 +1199,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, Reason54} ->
?IPRINT("start failed (as expected): ~p", [Reason54]),
- ?line {failed_check, _, _, _, {bad_address, _}} = Reason54,
+ {failed_check, _, _, _, {bad_address, _}} = Reason54,
config_ensure_not_running();
OK_54 ->
config_ensure_not_running(),
@@ -1210,162 +1210,162 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 55] write agents config file with invalid ip (5)"),
Agent55 = setelement(4, Agent0, "[192,168,0,arne]"),
write_agents_conf(ConfDir, [Agent55]),
- ?line {error, Reason55} = config_start(Opts),
+ {error, Reason55} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason55]),
- ?line {failed_check, _, _, _, {bad_address, _}} = Reason55,
+ {failed_check, _, _, _, {bad_address, _}} = Reason55,
config_ensure_not_running(),
%% --
?IPRINT("[test 61] write agents config file with invalid port (1)"),
Agent61 = setelement(5, Agent0, "kalle_anka"),
write_agents_conf(ConfDir, [Agent61]),
- ?line {error, Reason61} = config_start(Opts),
+ {error, Reason61} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason61]),
- ?line {failed_check, _, _, _, {bad_address, _}} = Reason61,
+ {failed_check, _, _, _, {bad_address, _}} = Reason61,
config_ensure_not_running(),
%% --
?IPRINT("[test 62] write agents config file with invalid port (2)"),
Agent62 = setelement(5, Agent0, "-1"),
write_agents_conf(ConfDir, [Agent62]),
- ?line {error, Reason62} = config_start(Opts),
+ {error, Reason62} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason62]),
- ?line {failed_check, _, _, _, {bad_address, _}} = Reason62,
+ {failed_check, _, _, _, {bad_address, _}} = Reason62,
config_ensure_not_running(),
%% --
?IPRINT("[test 63] write agents config file with invalid port (3)"),
Agent63 = setelement(5, Agent0, "\"100\""),
write_agents_conf(ConfDir, [Agent63]),
- ?line {error, Reason63} = config_start(Opts),
+ {error, Reason63} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason63]),
- ?line {failed_check, _, _, _, {bad_address, _}} = Reason63,
+ {failed_check, _, _, _, {bad_address, _}} = Reason63,
config_ensure_not_running(),
%% --
?IPRINT("[test 71] write agents config file with invalid engine-id (1)"),
Agent71 = setelement(6, Agent0, "kalle_anka"),
write_agents_conf(ConfDir, [Agent71]),
- ?line {error, Reason71} = config_start(Opts),
+ {error, Reason71} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason71]),
- ?line {failed_check, _, _, _, {invalid_string, _}} = Reason71,
+ {failed_check, _, _, _, {invalid_string, _}} = Reason71,
config_ensure_not_running(),
%% --
?IPRINT("[test 72] write agents config file with invalid engine-id (2)"),
Agent72 = setelement(6, Agent0, "10101"),
write_agents_conf(ConfDir, [Agent72]),
- ?line {error, Reason72} = config_start(Opts),
+ {error, Reason72} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason72]),
- ?line {failed_check, _, _, _, {invalid_string, _}} = Reason72,
+ {failed_check, _, _, _, {invalid_string, _}} = Reason72,
config_ensure_not_running(),
%% --
?IPRINT("[test 81] write agents config file with invalid timeout (1)"),
Agent81 = setelement(7, Agent0, "kalle_anka"),
write_agents_conf(ConfDir, [Agent81]),
- ?line {error, Reason81} = config_start(Opts),
+ {error, Reason81} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason81]),
- ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason81,
+ {failed_check, _, _, _, {invalid_timer, _}} = Reason81,
config_ensure_not_running(),
%% --
?IPRINT("[test 82] write agents config file with invalid timeout (2)"),
Agent82 = setelement(7, Agent0, "-1"),
write_agents_conf(ConfDir, [Agent82]),
- ?line {error, Reason82} = config_start(Opts),
+ {error, Reason82} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason82]),
- ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason82,
+ {failed_check, _, _, _, {invalid_timer, _}} = Reason82,
config_ensure_not_running(),
%% --
?IPRINT("[test 83] write agents config file with invalid timeout (3)"),
Agent83 = setelement(7, Agent0, "{1000, 1, 10, kalle}"),
write_agents_conf(ConfDir, [Agent83]),
- ?line {error, Reason83} = config_start(Opts),
+ {error, Reason83} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason83]),
- ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason83,
+ {failed_check, _, _, _, {invalid_timer, _}} = Reason83,
config_ensure_not_running(),
%% --
?IPRINT("[test 84] write agents config file with invalid timeout (4)"),
Agent84 = setelement(7, Agent0, "{1000, -1, 10, 10}"),
write_agents_conf(ConfDir, [Agent84]),
- ?line {error, Reason84} = config_start(Opts),
+ {error, Reason84} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason84]),
- ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason84,
+ {failed_check, _, _, _, {invalid_timer, _}} = Reason84,
config_ensure_not_running(),
%% --
?IPRINT("[test 85] write agents config file with invalid timeout (5)"),
Agent85 = setelement(7, Agent0, "{1000, 1, -100, 10}"),
write_agents_conf(ConfDir, [Agent85]),
- ?line {error, Reason85} = config_start(Opts),
+ {error, Reason85} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason85]),
- ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason85,
+ {failed_check, _, _, _, {invalid_timer, _}} = Reason85,
config_ensure_not_running(),
%% --
?IPRINT("[test 86] write agents config file with invalid timeout (6)"),
Agent86 = setelement(7, Agent0, "{1000, 1, 100, -1}"),
write_agents_conf(ConfDir, [Agent86]),
- ?line {error, Reason86} = config_start(Opts),
+ {error, Reason86} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason86]),
- ?line {failed_check, _, _, _, {invalid_timer, _}} = Reason86,
+ {failed_check, _, _, _, {invalid_timer, _}} = Reason86,
config_ensure_not_running(),
%% --
?IPRINT("[test 91] write agents config file with invalid max-message-size (1)"),
Agent91 = setelement(8, Agent0, "483"),
write_agents_conf(ConfDir, [Agent91]),
- ?line {error, Reason91} = config_start(Opts),
+ {error, Reason91} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason91]),
- ?line {failed_check, _, _, _, {invalid_packet_size, _}} = Reason91,
+ {failed_check, _, _, _, {invalid_packet_size, _}} = Reason91,
config_ensure_not_running(),
%% --
?IPRINT("[test 92] write agents config file with invalid max-message-size (2)"),
Agent92 = setelement(8, Agent0, "kalle_anka"),
write_agents_conf(ConfDir, [Agent92]),
- ?line {error, Reason92} = config_start(Opts),
+ {error, Reason92} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason92]),
- ?line {failed_check, _, _, _, {invalid_packet_size, _}} = Reason92,
+ {failed_check, _, _, _, {invalid_packet_size, _}} = Reason92,
config_ensure_not_running(),
%% --
?IPRINT("[test A1] write agents config file with invalid version (1)"),
AgentA1 = setelement(9, Agent0, "1"),
write_agents_conf(ConfDir, [AgentA1]),
- ?line {error, ReasonA1} = config_start(Opts),
+ {error, ReasonA1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [ReasonA1]),
- ?line {failed_check, _, _, _, {bad_version, _}} = ReasonA1,
+ {failed_check, _, _, _, {bad_version, _}} = ReasonA1,
config_ensure_not_running(),
%% --
?IPRINT("[test A2] write agents config file with invalid version (2)"),
AgentA2 = setelement(9, Agent0, "v30"),
write_agents_conf(ConfDir, [AgentA2]),
- ?line {error, ReasonA2} = config_start(Opts),
+ {error, ReasonA2} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [ReasonA2]),
- ?line {failed_check, _, _, _, {bad_version, _}} = ReasonA2,
+ {failed_check, _, _, _, {bad_version, _}} = ReasonA2,
config_ensure_not_running(),
%% --
?IPRINT("[test B1] write agents config file with invalid sec-model (1)"),
AgentB1 = setelement(10, Agent0, "\"any\""),
write_agents_conf(ConfDir, [AgentB1]),
- ?line {error, ReasonB1} = config_start(Opts),
+ {error, ReasonB1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [ReasonB1]),
- ?line {failed_check, _, _, _, {invalid_sec_model, _}} = ReasonB1,
+ {failed_check, _, _, _, {invalid_sec_model, _}} = ReasonB1,
config_ensure_not_running(),
%% --
?IPRINT("[test B2] write agents config file with invalid sec-model (2)"),
AgentB2 = setelement(10, Agent0, "v3"),
write_agents_conf(ConfDir, [AgentB2]),
- ?line {error, ReasonB2} = config_start(Opts),
+ {error, ReasonB2} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [ReasonB2]),
- ?line {failed_check, _, _, _, {invalid_sec_model, _}} = ReasonB2,
+ {failed_check, _, _, _, {invalid_sec_model, _}} = ReasonB2,
config_ensure_not_running(),
%% --
@@ -1375,7 +1375,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, ReasonC1} ->
?IPRINT("start failed (as expected): ~p", [ReasonC1]),
- ?line {failed_check, _, _, _, {bad_sec_name, _}} = ReasonC1,
+ {failed_check, _, _, _, {bad_sec_name, _}} = ReasonC1,
config_ensure_not_running();
OK_C1 ->
config_ensure_not_running(),
@@ -1389,7 +1389,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, ReasonC2} ->
?IPRINT("start failed (as expected): ~p", [ReasonC2]),
- ?line {failed_check, _, _, _, {bad_sec_name, _}} = ReasonC2,
+ {failed_check, _, _, _, {bad_sec_name, _}} = ReasonC2,
config_ensure_not_running();
OK_C2 ->
config_ensure_not_running(),
@@ -1403,7 +1403,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, ReasonD1} ->
?IPRINT("start failed (as expected): ~p", [ReasonD1]),
- ?line {failed_check, _, _, _, {invalid_sec_level, _}} = ReasonD1,
+ {failed_check, _, _, _, {invalid_sec_level, _}} = ReasonD1,
config_ensure_not_running();
OK_D1 ->
config_ensure_not_running(),
@@ -1417,7 +1417,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, ReasonD2} ->
?IPRINT("start failed (as expected): ~p", [ReasonD2]),
- ?line {failed_check, _, _, _, {invalid_sec_level, _}} = ReasonD2,
+ {failed_check, _, _, _, {invalid_sec_level, _}} = ReasonD2,
config_ensure_not_running();
OK_D2 ->
config_ensure_not_running(),
@@ -1430,7 +1430,7 @@ start_with_invalid_agents_conf_file1(Conf) when is_list(Conf) ->
case config_start(Opts) of
{error, ReasonE1} ->
?IPRINT("start failed (as expected): ~p", [ReasonE1]),
- ?line {failed_check, _, _, _, {bad_agent_config, _}} = ReasonE1,
+ {failed_check, _, _, _, {bad_agent_config, _}} = ReasonE1,
config_ensure_not_running();
OK_E1 ->
config_ensure_not_running(),
@@ -1487,146 +1487,146 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 11] write usm config file with invalid engine-id (1)"),
Usm11 = setelement(1, Usm0, "kalle-anka"),
write_usm_conf(ConfDir, [Usm11]),
- ?line {error, Reason11} = config_start(Opts),
+ {error, Reason11} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason11]),
- ?line {failed_reading, _, _, _, {parse_error, _}} = Reason11,
+ {failed_reading, _, _, _, {parse_error, _}} = Reason11,
config_ensure_not_running(),
%% --
?IPRINT("[test 12] write usm config file with invalid engine-id (2)"),
Usm12 = setelement(1, Usm0, "kalle_anka"),
write_usm_conf(ConfDir, [Usm12]),
- ?line {error, Reason12} = config_start(Opts),
+ {error, Reason12} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason12]),
- ?line {failed_check, _, _, _, {bad_usm_engine_id, _}} = Reason12,
+ {failed_check, _, _, _, {bad_usm_engine_id, _}} = Reason12,
config_ensure_not_running(),
%% --
?IPRINT("[test 13] write usm config file with invalid engine-id (3)"),
Usm13 = setelement(1, Usm1, "10101"),
write_usm_conf(ConfDir, [Usm13]),
- ?line {error, Reason13} = config_start(Opts),
+ {error, Reason13} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason13]),
- ?line {failed_check, _, _, _, {bad_usm_engine_id, _}} = Reason13,
+ {failed_check, _, _, _, {bad_usm_engine_id, _}} = Reason13,
config_ensure_not_running(),
%% --
?IPRINT("[test 21] write usm config file with invalid user-name (1)"),
Usm21 = setelement(2, Usm0, "kalle_anka"),
write_usm_conf(ConfDir, [Usm21]),
- ?line {error, Reason21} = config_start(Opts),
+ {error, Reason21} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason21]),
- ?line {failed_check, _, _, _, {bad_usm_user_name, _}} = Reason21,
+ {failed_check, _, _, _, {bad_usm_user_name, _}} = Reason21,
config_ensure_not_running(),
%% --
?IPRINT("[test 22] write usm config file with invalid user-name (1)"),
Usm22 = setelement(2, Usm1, "10101"),
write_usm_conf(ConfDir, [Usm22]),
- ?line {error, Reason22} = config_start(Opts),
+ {error, Reason22} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason22]),
- ?line {failed_check, _, _, _, {bad_usm_user_name, _}} = Reason22,
+ {failed_check, _, _, _, {bad_usm_user_name, _}} = Reason22,
config_ensure_not_running(),
%% --
?IPRINT("[test 31] write usm config file with invalid sec-name (1)"),
Usm31 = setelement(3, Usm1, "kalle_anka"),
write_usm_conf(ConfDir, [Usm31]),
- ?line {error, Reason31} = config_start(Opts),
+ {error, Reason31} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason31]),
- ?line {failed_check, _, _, _, {bad_usm_sec_name, _}} = Reason31,
+ {failed_check, _, _, _, {bad_usm_sec_name, _}} = Reason31,
config_ensure_not_running(),
%% --
?IPRINT("[test 32] write usm config file with invalid sec-name (2)"),
Usm32 = setelement(3, Usm1, "10101"),
write_usm_conf(ConfDir, [Usm32]),
- ?line {error, Reason32} = config_start(Opts),
+ {error, Reason32} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason32]),
- ?line {failed_check, _, _, _, {bad_usm_sec_name, _}} = Reason32,
+ {failed_check, _, _, _, {bad_usm_sec_name, _}} = Reason32,
config_ensure_not_running(),
%% --
?IPRINT("[test 41] write usm config file with invalid auth-protocol (1)"),
Usm41 = setelement(3, Usm0, "\"usmNoAuthProtocol\""),
write_usm_conf(ConfDir, [Usm41]),
- ?line {error, Reason41} = config_start(Opts),
+ {error, Reason41} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason41]),
- ?line {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason41,
+ {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason41,
config_ensure_not_running(),
%% --
?IPRINT("[test 42] write usm config file with invalid auth-protocol (2)"),
Usm42 = setelement(3, Usm0, "kalle"),
write_usm_conf(ConfDir, [Usm42]),
- ?line {error, Reason42} = config_start(Opts),
+ {error, Reason42} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason42]),
- ?line {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason42,
+ {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason42,
config_ensure_not_running(),
%% --
?IPRINT("[test 43] write usm config file with invalid auth-protocol (3)"),
Usm43 = setelement(3, Usm0, "10101"),
write_usm_conf(ConfDir, [Usm43]),
- ?line {error, Reason43} = config_start(Opts),
+ {error, Reason43} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason43]),
- ?line {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason43,
+ {failed_check, _, _, _, {invalid_auth_protocol, _}} = Reason43,
config_ensure_not_running(),
%% --
?IPRINT("[test 51.1] write (auth md5) usm config file with invalid auth-key (1)"),
Usm51_1 = setelement(3, Usm0, "usmHMACMD5AuthProtocol"),
write_usm_conf(ConfDir, [Usm51_1]),
- ?line {error, Reason51_1} = config_start(Opts),
+ {error, Reason51_1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason51_1]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason51_1,
+ {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason51_1,
config_ensure_not_running(),
%% --
?IPRINT("[test 51.2] write (auth md5) usm config file with invalid auth-key (2)"),
Usm51_2 = setelement(4, Usm51_1, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5]"),
write_usm_conf(ConfDir, [Usm51_2]),
- ?line {error, Reason51_2} = config_start(Opts),
+ {error, Reason51_2} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason51_2]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, 15}} = Reason51_2,
+ {failed_check, _, _, _, {invalid_auth_key, _, 15}} = Reason51_2,
config_ensure_not_running(),
%% --
?IPRINT("[test 51.3] write (auth md5) usm config file with invalid auth-key (3)"),
Usm51_3 = setelement(4, Usm51_1, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]"),
write_usm_conf(ConfDir, [Usm51_3]),
- ?line {error, Reason51_3} = config_start(Opts),
+ {error, Reason51_3} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason51_3]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, 17}} = Reason51_3,
+ {failed_check, _, _, _, {invalid_auth_key, _, 17}} = Reason51_3,
config_ensure_not_running(),
%% --
?IPRINT("[test 51.4] write (auth md5) usm config file with invalid auth-key (4)"),
Usm51_4 = setelement(4, Usm51_1, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,kalle]"),
write_usm_conf(ConfDir, [Usm51_4]),
- ?line maybe_start_crypto(), %% Make sure it's started...
- ?line {error, Reason51_4} = config_start(Opts),
- ?line ok = maybe_stop_crypto(),
+ maybe_start_crypto(), %% Make sure it's started...
+ {error, Reason51_4} = config_start(Opts),
+ ok = maybe_stop_crypto(),
?IPRINT("start failed (as expected): ~p", [Reason51_4]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason51_4,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason51_4,
config_ensure_not_running(),
%% --
?IPRINT("[test 51.5] write (auth md5) usm config file with invalid auth-key (5)"),
Usm51_5 = setelement(4, Usm51_1, "arne_anka"),
write_usm_conf(ConfDir, [Usm51_5]),
- ?line {error, Reason51_5} = config_start(Opts),
+ {error, Reason51_5} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason51_5]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason51_5,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason51_5,
config_ensure_not_running(),
%% --
?IPRINT("[test 51.6] write (auth md5) usm config file with invalid auth-key (6)"),
Usm51_6 = setelement(4, Usm51_1, "10101"),
write_usm_conf(ConfDir, [Usm51_6]),
- ?line {error, Reason51_6} = config_start(Opts),
+ {error, Reason51_6} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason51_6]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason51_6,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason51_6,
config_ensure_not_running(),
@@ -1635,29 +1635,29 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 52.1] write (auth sha) usm config file with invalid auth-key (1)"),
Usm52_1 = setelement(3, Usm0, "usmHMACSHAAuthProtocol"),
write_usm_conf(ConfDir, [Usm52_1]),
- ?line {error, Reason52_1} = config_start(Opts),
+ {error, Reason52_1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason52_1]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason52_1,
+ {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason52_1,
config_ensure_not_running(),
%% --
?IPRINT("[test 52.2] write (auth sha) usm config file with invalid auth-key (2)"),
Usm52_2 = setelement(4, Usm52_1, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]"),
write_usm_conf(ConfDir, [Usm52_2]),
- ?line {error, Reason52_2} = config_start(Opts),
+ {error, Reason52_2} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason52_2]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, 16}} = Reason52_2,
+ {failed_check, _, _, _, {invalid_auth_key, _, 16}} = Reason52_2,
config_ensure_not_running(),
%% --
?IPRINT("[test 52.3] write (auth sha) usm config file with invalid auth-key (3)"),
Usm52_3 = setelement(4, Usm52_1, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,ka]"),
write_usm_conf(ConfDir, [Usm52_3]),
- ?line ok = maybe_start_crypto(),
- ?line {error, Reason52_3} = config_start(Opts),
- ?line ok = maybe_stop_crypto(),
+ ok = maybe_start_crypto(),
+ {error, Reason52_3} = config_start(Opts),
+ ok = maybe_stop_crypto(),
?IPRINT("start failed (as expected): ~p", [Reason52_3]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason52_3,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason52_3,
config_ensure_not_running(),
@@ -1666,9 +1666,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 53.1] write (auth sha224) usm config file with invalid auth-key (1)"),
Usm53_1 = setelement(3, Usm0, "usmHMAC128SHA224AuthProtocol"),
write_usm_conf(ConfDir, [Usm53_1]),
- ?line {error, Reason53_1} = config_start(Opts),
+ {error, Reason53_1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason53_1]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason53_1,
+ {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason53_1,
config_ensure_not_running(),
%% --
@@ -1676,7 +1676,7 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm53_2 = setelement(4, Usm53_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8]"),
write_usm_conf(ConfDir, [Usm53_2]),
- ?line {ok, _} = config_start(Opts),
+ {ok, _} = config_start(Opts),
?IPRINT("expected start success"),
config_ensure_not_running(),
@@ -1685,9 +1685,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm53_3 = setelement(4, Usm53_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]"),
write_usm_conf(ConfDir, [Usm53_3]),
- ?line {error, Reason53_3} = config_start(Opts),
+ {error, Reason53_3} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason53_3]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, 27}} = Reason53_3,
+ {failed_check, _, _, _, {invalid_auth_key, _, 27}} = Reason53_3,
config_ensure_not_running(),
%% --
@@ -1695,11 +1695,11 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm53_4 = setelement(4, Usm53_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,ka]"),
write_usm_conf(ConfDir, [Usm53_4]),
- ?line ok = maybe_start_crypto(),
- ?line {error, Reason53_4} = config_start(Opts),
- ?line ok = maybe_stop_crypto(),
+ ok = maybe_start_crypto(),
+ {error, Reason53_4} = config_start(Opts),
+ ok = maybe_stop_crypto(),
?IPRINT("start failed (as expected): ~p", [Reason53_4]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason53_4,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason53_4,
config_ensure_not_running(),
@@ -1707,9 +1707,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 54.1] write (auth sha256) usm config file with invalid auth-key (1)"),
Usm54_1 = setelement(3, Usm0, "usmHMAC192SHA256AuthProtocol"),
write_usm_conf(ConfDir, [Usm54_1]),
- ?line {error, Reason54_1} = config_start(Opts),
+ {error, Reason54_1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason54_1]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason54_1,
+ {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason54_1,
config_ensure_not_running(),
%% --
@@ -1717,7 +1717,7 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm54_2 = setelement(4, Usm54_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2]"),
write_usm_conf(ConfDir, [Usm54_2]),
- ?line {ok, _} = config_start(Opts),
+ {ok, _} = config_start(Opts),
?IPRINT("expected start success"),
config_ensure_not_running(),
@@ -1726,9 +1726,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm54_3 = setelement(4, Usm54_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1]"),
write_usm_conf(ConfDir, [Usm54_3]),
- ?line {error, Reason54_3} = config_start(Opts),
+ {error, Reason54_3} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason54_3]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, 31}} = Reason54_3,
+ {failed_check, _, _, _, {invalid_auth_key, _, 31}} = Reason54_3,
config_ensure_not_running(),
%% --
@@ -1736,11 +1736,11 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm54_4 = setelement(4, Usm54_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,ka]"),
write_usm_conf(ConfDir, [Usm54_4]),
- ?line ok = maybe_start_crypto(),
- ?line {error, Reason54_4} = config_start(Opts),
- ?line ok = maybe_stop_crypto(),
+ ok = maybe_start_crypto(),
+ {error, Reason54_4} = config_start(Opts),
+ ok = maybe_stop_crypto(),
?IPRINT("start failed (as expected): ~p", [Reason54_4]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason54_4,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason54_4,
config_ensure_not_running(),
@@ -1748,9 +1748,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 55.1] write (auth sha384) usm config file with invalid auth-key (1)"),
Usm55_1 = setelement(3, Usm0, "usmHMAC256SHA384AuthProtocol"),
write_usm_conf(ConfDir, [Usm55_1]),
- ?line {error, Reason55_1} = config_start(Opts),
+ {error, Reason55_1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason55_1]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason55_1,
+ {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason55_1,
config_ensure_not_running(),
%% --
@@ -1758,7 +1758,7 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm55_2 = setelement(4, Usm55_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8]"),
write_usm_conf(ConfDir, [Usm55_2]),
- ?line {ok, _} = config_start(Opts),
+ {ok, _} = config_start(Opts),
?IPRINT("expected start success"),
config_ensure_not_running(),
@@ -1767,9 +1767,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm55_3 = setelement(4, Usm55_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]"),
write_usm_conf(ConfDir, [Usm55_3]),
- ?line {error, Reason55_3} = config_start(Opts),
+ {error, Reason55_3} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason55_3]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, 47}} = Reason55_3,
+ {failed_check, _, _, _, {invalid_auth_key, _, 47}} = Reason55_3,
config_ensure_not_running(),
%% --
@@ -1777,11 +1777,11 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm55_4 = setelement(4, Usm55_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,ka]"),
write_usm_conf(ConfDir, [Usm55_4]),
- ?line ok = maybe_start_crypto(),
- ?line {error, Reason55_4} = config_start(Opts),
- ?line ok = maybe_stop_crypto(),
+ ok = maybe_start_crypto(),
+ {error, Reason55_4} = config_start(Opts),
+ ok = maybe_stop_crypto(),
?IPRINT("start failed (as expected): ~p", [Reason55_4]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason55_4,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason55_4,
config_ensure_not_running(),
@@ -1789,9 +1789,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 56.1] write (auth sha512) usm config file with invalid auth-key (1)"),
Usm56_1 = setelement(3, Usm0, "usmHMAC384SHA512AuthProtocol"),
write_usm_conf(ConfDir, [Usm56_1]),
- ?line {error, Reason56_1} = config_start(Opts),
+ {error, Reason56_1} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason56_1]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason56_1,
+ {failed_check, _, _, _, {invalid_auth_key, _, _}} = Reason56_1,
config_ensure_not_running(),
%% --
@@ -1799,7 +1799,7 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm56_2 = setelement(4, Usm56_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4]"),
write_usm_conf(ConfDir, [Usm56_2]),
- ?line {ok, _} = config_start(Opts),
+ {ok, _} = config_start(Opts),
?IPRINT("expected start success"),
config_ensure_not_running(),
@@ -1808,9 +1808,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm56_3 = setelement(4, Usm56_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3]"),
write_usm_conf(ConfDir, [Usm56_3]),
- ?line {error, Reason56_3} = config_start(Opts),
+ {error, Reason56_3} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason56_3]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _, 63}} = Reason56_3,
+ {failed_check, _, _, _, {invalid_auth_key, _, 63}} = Reason56_3,
config_ensure_not_running(),
%% --
@@ -1818,11 +1818,11 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
Usm56_4 = setelement(4, Usm56_1,
"[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,ka]"),
write_usm_conf(ConfDir, [Usm56_4]),
- ?line ok = maybe_start_crypto(),
- ?line {error, Reason56_4} = config_start(Opts),
- ?line ok = maybe_stop_crypto(),
+ ok = maybe_start_crypto(),
+ {error, Reason56_4} = config_start(Opts),
+ ok = maybe_stop_crypto(),
?IPRINT("start failed (as expected): ~p", [Reason56_4]),
- ?line {failed_check, _, _, _, {invalid_auth_key, _}} = Reason56_4,
+ {failed_check, _, _, _, {invalid_auth_key, _}} = Reason56_4,
config_ensure_not_running(),
@@ -1830,83 +1830,83 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
?IPRINT("[test 61] write usm config file with invalid priv-protocol (1)"),
Usm61 = setelement(5, Usm0, "\"usmNoPrivProtocol\""),
write_usm_conf(ConfDir, [Usm61]),
- ?line {error, Reason61} = config_start(Opts),
+ {error, Reason61} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason61]),
- ?line {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason61,
+ {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason61,
config_ensure_not_running(),
%% --
?IPRINT("[test 62] write usm config file with invalid priv-protocol (2)"),
Usm62 = setelement(5, Usm0, "kalle"),
write_usm_conf(ConfDir, [Usm62]),
- ?line {error, Reason62} = config_start(Opts),
+ {error, Reason62} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason62]),
- ?line {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason62,
+ {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason62,
config_ensure_not_running(),
%% --
?IPRINT("[test 63] write usm config file with invalid priv-protocol (3)"),
Usm63 = setelement(5, Usm0, "10101"),
write_usm_conf(ConfDir, [Usm63]),
- ?line {error, Reason63} = config_start(Opts),
+ {error, Reason63} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason63]),
- ?line {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason63,
+ {failed_check, _, _, _, {invalid_priv_protocol, _}} = Reason63,
config_ensure_not_running(),
%% --
?IPRINT("[test 71] write usm config file with invalid priv-key (1)"),
Usm71 = setelement(5, Usm0, "usmDESPrivProtocol"),
write_usm_conf(ConfDir, [Usm71]),
- ?line {error, Reason71} = config_start(Opts),
+ {error, Reason71} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason71]),
- ?line {failed_check, _, _, _, {invalid_priv_key, _, _}} = Reason71,
+ {failed_check, _, _, _, {invalid_priv_key, _, _}} = Reason71,
config_ensure_not_running(),
%% --
?IPRINT("[test 72] write usm config file with invalid priv-key (2)"),
Usm72 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5]"),
write_usm_conf(ConfDir, [Usm72]),
- ?line {error, Reason72} = config_start(Opts),
+ {error, Reason72} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason72]),
- ?line {failed_check, _, _, _, {invalid_priv_key, _, 15}} = Reason72,
+ {failed_check, _, _, _, {invalid_priv_key, _, 15}} = Reason72,
config_ensure_not_running(),
%% --
?IPRINT("[test 73] write usm config file with invalid priv-key (3)"),
Usm73 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]"),
write_usm_conf(ConfDir, [Usm73]),
- ?line {error, Reason73} = config_start(Opts),
+ {error, Reason73} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason73]),
- ?line {failed_check, _, _, _, {invalid_priv_key, _, 17}} = Reason73,
+ {failed_check, _, _, _, {invalid_priv_key, _, 17}} = Reason73,
config_ensure_not_running(),
%% --
?IPRINT("[test 74] write usm config file with invalid priv-key (4)"),
Usm74 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,kalle]"),
write_usm_conf(ConfDir, [Usm74]),
- ?line ok = maybe_start_crypto(),
- ?line {error, Reason74} = config_start(Opts),
- ?line ok = maybe_stop_crypto(),
+ ok = maybe_start_crypto(),
+ {error, Reason74} = config_start(Opts),
+ ok = maybe_stop_crypto(),
?IPRINT("start failed (as expected): ~p", [Reason74]),
- ?line {failed_check, _, _, _, {invalid_priv_key, _}} = Reason74,
+ {failed_check, _, _, _, {invalid_priv_key, _}} = Reason74,
config_ensure_not_running(),
%% --
?IPRINT("[test 75] write usm config file with invalid priv-key (5)"),
Usm75 = setelement(6, Usm71, "arne_anka"),
write_usm_conf(ConfDir, [Usm75]),
- ?line {error, Reason75} = config_start(Opts),
+ {error, Reason75} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason75]),
- ?line {failed_check, _, _, _, {invalid_priv_key, _}} = Reason75,
+ {failed_check, _, _, _, {invalid_priv_key, _}} = Reason75,
config_ensure_not_running(),
%% --
?IPRINT("[test 76] write usm config file with invalid priv-key (6)"),
Usm76 = setelement(6, Usm71, "10101"),
write_usm_conf(ConfDir, [Usm76]),
- ?line {error, Reason76} = config_start(Opts),
+ {error, Reason76} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason76]),
- ?line {failed_check, _, _, _, {invalid_priv_key, _}} = Reason76,
+ {failed_check, _, _, _, {invalid_priv_key, _}} = Reason76,
config_ensure_not_running(),
%% --
@@ -1919,9 +1919,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
"when crypto not started (7)"),
Usm77 = setelement(6, Usm71, "[1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]"),
write_usm_conf(ConfDir, [Usm77]),
- ?line {error, Reason77} = config_start(Opts),
+ {error, Reason77} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason77]),
- ?line {failed_check, _, _, _, {unsupported_crypto, _}} = Reason77,
+ {failed_check, _, _, _, {unsupported_crypto, _}} = Reason77,
config_ensure_not_running();
_ ->
%% This function is only present in version 2.0 or greater.
@@ -1933,9 +1933,9 @@ start_with_invalid_usm_conf_file1(Conf) when is_list(Conf) ->
%% --
?IPRINT("[test 78] write usm config file with invalid usm (1)"),
write_usm_conf2(ConfDir, "{\"bmkEngine\", \"swiusmcf\"}."),
- ?line {error, Reason81} = config_start(Opts),
+ {error, Reason81} = config_start(Opts),
?IPRINT("start failed (as expected): ~p", [Reason81]),
- ?line {failed_check, _, _, _, {bad_usm_config, _}} = Reason81,
+ {failed_check, _, _, _, {bad_usm_config, _}} = Reason81,
config_ensure_not_running(),
?IPRINT("done"),
@@ -1996,17 +1996,17 @@ simple_system_op(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("start config"),
- ?line {ok, _Pid} = config_start(Opts),
+ {ok, _Pid} = config_start(Opts),
- ?IPRINT("retreive various configs"),
- ?line {ok, _Time} = snmpm_config:system_start_time(),
- ?line {ok, _EngineId} = snmpm_config:get_engine_id(),
- ?line {ok, _MMS} = snmpm_config:get_engine_max_message_size(),
+ ?IPRINT("retrieve various configs"),
+ {ok, _Time} = snmpm_config:system_start_time(),
+ {ok, _EngineId} = snmpm_config:get_engine_id(),
+ {ok, _MMS} = snmpm_config:get_engine_max_message_size(),
- ?IPRINT("attempt to retreive nonexisting"),
- ?line {error, not_found} = snmpm_config:system_info(kalle),
+ ?IPRINT("attempt to retrieve nonexisting"),
+ {error, not_found} = snmpm_config:system_info(kalle),
- ?line ok = config_stop(),
+ ok = config_stop(),
config_ensure_not_running(),
?IPRINT("done"),
@@ -2092,7 +2092,7 @@ register_agent_using_file(Conf) when is_list(Conf) ->
Case = fun(_) -> do_register_agent_using_file(Conf) end,
Post = fun(_) ->
?IPRINT("stop config process"),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
config_ensure_not_running(),
ok
end,
@@ -2151,49 +2151,49 @@ do_register_agent_using_file(Conf) ->
%% --
?IPRINT("start the config process"),
- ?line {ok, _Pid} = config_start(Opts),
+ {ok, _Pid} = config_start(Opts),
%% --
?IPRINT("which agents"),
- ?line [_, _] = All = snmpm_config:which_agents(),
+ [_, _] = All = snmpm_config:which_agents(),
?IPRINT("all agents: ~n ~p", [All]),
- ?line [A1] = snmpm_config:which_agents(UserId1),
+ [A1] = snmpm_config:which_agents(UserId1),
?IPRINT("agents belonging to ~w: ~n ~p", [UserId1, A1]),
- ?line [A2] = snmpm_config:which_agents(UserId2),
+ [A2] = snmpm_config:which_agents(UserId2),
?IPRINT("agents belonging to ~w: ~n ~p", [UserId2, A2]),
%% --
?IPRINT("All info for agent <~w,~w>", [AgentAddr1, AgentPort1]),
- ?line {ok, AllInfo1} =
+ {ok, AllInfo1} =
snmpm_config:agent_info(AgentAddr1, AgentPort1, all),
?IPRINT("all agent info for agent: ~n ~p", [AllInfo1]),
%% --
?IPRINT("EngineID (~p) for agent <~w,~w>", [EngineID1, AgentAddr1, AgentPort1]),
- ?line {ok, EngineID1} =
+ {ok, EngineID1} =
snmpm_config:agent_info(AgentAddr1, AgentPort1, engine_id),
%% --
?IPRINT("All info for agent <~w,~w>", [AgentAddr2, AgentPort2]),
- ?line {ok, AllInfo2} =
+ {ok, AllInfo2} =
snmpm_config:agent_info(AgentAddr2, AgentPort2, all),
?IPRINT("all agent info for agent: ~n ~p", [AllInfo2]),
%% --
?IPRINT("EngineID (~p) for agent <~w,~w>", [EngineID2, AgentAddr2, AgentPort2]),
- ?line {ok, EngineID2} =
+ {ok, EngineID2} =
snmpm_config:agent_info(AgentAddr2, AgentPort2, engine_id),
%% --
- ?line {ok, MMS2} =
+ {ok, MMS2} =
snmpm_config:agent_info(AgentAddr2, AgentPort2, max_message_size),
NewMMS21 = 2048,
?IPRINT("try update agent info max-message-size to ~w for agent <~w,~w>",
[NewMMS21, AgentAddr2, AgentPort2]),
- ?line ok = snmpm_config:update_agent_info(UserId2, AgentAddr2, AgentPort2,
- max_message_size, NewMMS21),
- ?line {ok, NewMMS21} =
+ ok = update_agent_info(UserId2, AgentAddr2, AgentPort2,
+ max_message_size, NewMMS21),
+ {ok, NewMMS21} =
snmpm_config:agent_info(AgentAddr2, AgentPort2, max_message_size),
%% --
@@ -2201,11 +2201,11 @@ do_register_agent_using_file(Conf) ->
"for agent <~w,~w> "
"with user ~w (not owner)",
[NewMMS21, AgentAddr2, AgentPort2, UserId1]),
- ?line {error, Reason01} =
- snmpm_config:update_agent_info(UserId1, AgentAddr2, AgentPort2,
- max_message_size, NewMMS21),
+ {error, Reason01} =
+ update_agent_info(UserId1, AgentAddr2, AgentPort2,
+ max_message_size, NewMMS21),
?IPRINT("expected failure. Reason01: ~p", [Reason01]),
- ?line {ok, NewMMS21} =
+ {ok, NewMMS21} =
snmpm_config:agent_info(AgentAddr2, AgentPort2, max_message_size),
%% --
@@ -2213,9 +2213,9 @@ do_register_agent_using_file(Conf) ->
?IPRINT("try (and fail) to update agent info max-message-size to ~w "
"for agent <~w,~w>",
[NewMMS22, AgentAddr2, AgentPort2]),
- ?line {error, Reason02} =
- snmpm_config:update_agent_info(UserId1, AgentAddr2, AgentPort2,
- max_message_size, NewMMS22),
+ {error, Reason02} =
+ update_agent_info(UserId1, AgentAddr2, AgentPort2,
+ max_message_size, NewMMS22),
?IPRINT("expected failure. Reason02: ~p", [Reason02]),
%% --
@@ -2245,7 +2245,7 @@ register_agent_using_function(Conf) when is_list(Conf) ->
register_agent_failed_using_function1(suite) -> [];
register_agent_failed_using_function1(doc) ->
- "Register agents failng using the API (function) with incorrect "
+ "Register agents failing using the API (function) with incorrect "
"config (1).";
register_agent_failed_using_function1(Conf) when is_list(Conf) ->
put(tname, "REG-AG-FAIL-USING-FUNC-1"),
@@ -2318,26 +2318,26 @@ register_usm_user_using_file(Conf) when is_list(Conf) ->
%% --
?IPRINT("start the config process"),
- ?line {ok, _Pid} = config_start(Opts),
+ {ok, _Pid} = config_start(Opts),
%% --
?IPRINT("lookup 1 (ok)"),
- ?line {ok, #usm_user{name = UserName1} = User1} =
+ {ok, #usm_user{name = UserName1} = User1} =
snmpm_config:get_usm_user_from_sec_name(SecEngineID, SecName1),
?IPRINT("User: ~p", [User1]),
?IPRINT("lookup 2 (ok)"),
- ?line {ok, #usm_user{name = UserName2} = User2} =
+ {ok, #usm_user{name = UserName2} = User2} =
snmpm_config:get_usm_user_from_sec_name(SecEngineID, SecName2),
?IPRINT("User: ~p", [User2]),
?IPRINT("lookup 3 (error)"),
- ?line {error, not_found} =
+ {error, not_found} =
snmpm_config:get_usm_user_from_sec_name(SecEngineID, SecName2 ++ "_1"),
%% --
?IPRINT("stop config process"),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
config_ensure_not_running(),
%% --
@@ -2386,7 +2386,7 @@ register_usm_user_using_function(Conf) when is_list(Conf) ->
%% --
?IPRINT("start the config process"),
- ?line {ok, _Pid} = config_start(Opts),
+ {ok, _Pid} = config_start(Opts),
%% --
?IPRINT("register usm user's"),
@@ -2400,9 +2400,9 @@ register_usm_user_using_function(Conf) when is_list(Conf) ->
{auth_key, [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]},
{priv, usmNoPrivProtocol}],
- ?line ok = snmpm_config:register_usm_user(EngineID, UserName1, UsmConfig1),
+ ok = snmpm_config:register_usm_user(EngineID, UserName1, UsmConfig1),
?IPRINT("try register user 1 again (error)"),
- ?line {error, {already_registered, EngineID, UserName1}} =
+ {error, {already_registered, EngineID, UserName1}} =
snmpm_config:register_usm_user(EngineID, UserName1, UsmConfig1),
?IPRINT("register user 2 (ok)"),
@@ -2411,7 +2411,7 @@ register_usm_user_using_function(Conf) when is_list(Conf) ->
UsmConfig2 = [{auth, usmHMACMD5AuthProtocol},
{auth_key, [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]},
{priv, usmNoPrivProtocol}],
- ?line ok = snmpm_config:register_usm_user(EngineID, UserName2, UsmConfig2),
+ ok = snmpm_config:register_usm_user(EngineID, UserName2, UsmConfig2),
?IPRINT("register user 3 (ok)"),
UserName3 = "samu3",
@@ -2420,7 +2420,7 @@ register_usm_user_using_function(Conf) when is_list(Conf) ->
{auth, usmHMACMD5AuthProtocol},
{auth_key, [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]},
{priv, usmNoPrivProtocol}],
- ?line ok = snmpm_config:register_usm_user(EngineID, UserName3, UsmConfig3),
+ ok = snmpm_config:register_usm_user(EngineID, UserName3, UsmConfig3),
?IPRINT("register user 4 (ok)"),
UserName4 = "samu4",
@@ -2430,35 +2430,35 @@ register_usm_user_using_function(Conf) when is_list(Conf) ->
{auth_key, [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6]},
{priv, usmAesCfb128Protocol},
{priv_key, [190,54,66,227,33,171,152,0,133,223,204,155,109,111,77,44]}],
- ?line ok = snmpm_config:register_usm_user(EngineID, UserName4, UsmConfig4),
+ ok = snmpm_config:register_usm_user(EngineID, UserName4, UsmConfig4),
?IPRINT("lookup 1 (ok)"),
- ?line {ok, #usm_user{name = UserName1} = User1} =
+ {ok, #usm_user{name = UserName1} = User1} =
snmpm_config:get_usm_user_from_sec_name(EngineID, SecName1),
?IPRINT("User: ~p", [User1]),
?IPRINT("lookup 2 (ok)"),
- ?line {ok, #usm_user{name = UserName2} = User2} =
+ {ok, #usm_user{name = UserName2} = User2} =
snmpm_config:get_usm_user_from_sec_name(EngineID, SecName2),
?IPRINT("User: ~p", [User2]),
?IPRINT("lookup 3 (ok)"),
- ?line {ok, #usm_user{name = UserName3} = User3} =
+ {ok, #usm_user{name = UserName3} = User3} =
snmpm_config:get_usm_user_from_sec_name(EngineID, SecName3),
?IPRINT("User: ~p", [User3]),
?IPRINT("lookup 4 (ok)"),
- ?line {ok, #usm_user{name = UserName4} = User4} =
+ {ok, #usm_user{name = UserName4} = User4} =
snmpm_config:get_usm_user_from_sec_name(EngineID, SecName4),
?IPRINT("User: ~p", [User4]),
?IPRINT("lookup 5 (error)"),
- ?line {error, not_found} =
+ {error, not_found} =
snmpm_config:get_usm_user_from_sec_name(EngineID, SecName4 ++ "_1"),
%% --
?IPRINT("stop config process"),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
config_ensure_not_running(),
%% --
@@ -2535,7 +2535,7 @@ update_usm_user_info(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("Start config server"),
- ?line {ok, _Pid} = snmpm_config:start_link(Opts),
+ {ok, _Pid} = snmpm_config:start_link(Opts),
?IPRINT("Register usm user"),
EngineID = "engine",
@@ -2551,9 +2551,9 @@ update_usm_user_info(Conf) when is_list(Conf) ->
ok = snmpm_config:register_usm_user(EngineID, UsmUser, UsmConfig),
?IPRINT("verify user user config"),
- ?line {ok, AuthProto} = snmpm_config:usm_user_info(EngineID, UsmUser, auth),
- ?line {ok, AuthKey} = snmpm_config:usm_user_info(EngineID, UsmUser, auth_key),
- ?line {ok, PrivProto1} = snmpm_config:usm_user_info(EngineID, UsmUser, priv),
+ {ok, AuthProto} = snmpm_config:usm_user_info(EngineID, UsmUser, auth),
+ {ok, AuthKey} = snmpm_config:usm_user_info(EngineID, UsmUser, auth_key),
+ {ok, PrivProto1} = snmpm_config:usm_user_info(EngineID, UsmUser, priv),
?IPRINT("usm user update 1"),
PrivProto2 = usmAesCfb128Protocol,
@@ -2562,22 +2562,22 @@ update_usm_user_info(Conf) when is_list(Conf) ->
ok = snmpm_config:update_usm_user_info(EngineID, UsmUser, priv_key, PrivKey2),
?IPRINT("verify updated user user config after update 1"),
- ?line {ok, AuthProto} = snmpm_config:usm_user_info(EngineID, UsmUser, auth),
- ?line {ok, AuthKey} = snmpm_config:usm_user_info(EngineID, UsmUser, auth_key),
- ?line {ok, PrivProto2} = snmpm_config:usm_user_info(EngineID, UsmUser, priv),
- ?line {ok, PrivKey2} = snmpm_config:usm_user_info(EngineID, UsmUser, priv_key),
+ {ok, AuthProto} = snmpm_config:usm_user_info(EngineID, UsmUser, auth),
+ {ok, AuthKey} = snmpm_config:usm_user_info(EngineID, UsmUser, auth_key),
+ {ok, PrivProto2} = snmpm_config:usm_user_info(EngineID, UsmUser, priv),
+ {ok, PrivKey2} = snmpm_config:usm_user_info(EngineID, UsmUser, priv_key),
?IPRINT("usm user update 2"),
PrivProto3 = PrivProto1,
ok = snmpm_config:update_usm_user_info(EngineID, UsmUser, priv, PrivProto3),
?IPRINT("verify updated user user config after update 2"),
- ?line {ok, AuthProto} = snmpm_config:usm_user_info(EngineID, UsmUser, auth),
- ?line {ok, AuthKey} = snmpm_config:usm_user_info(EngineID, UsmUser, auth_key),
- ?line {ok, PrivProto3} = snmpm_config:usm_user_info(EngineID, UsmUser, priv),
+ {ok, AuthProto} = snmpm_config:usm_user_info(EngineID, UsmUser, auth),
+ {ok, AuthKey} = snmpm_config:usm_user_info(EngineID, UsmUser, auth_key),
+ {ok, PrivProto3} = snmpm_config:usm_user_info(EngineID, UsmUser, priv),
?IPRINT("Stop config server"),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
?IPRINT("done"),
ok.
@@ -2595,7 +2595,7 @@ update_usm_user_info(Conf) when is_list(Conf) ->
create_and_increment(suite) -> [];
create_and_increment(doc) ->
- "Craete and increment counters.";
+ "Create and increment counters.";
create_and_increment(Conf) when is_list(Conf) ->
put(tname, "CRE-AND-INC"),
?IPRINT("start"),
@@ -2609,7 +2609,7 @@ create_and_increment(Conf) when is_list(Conf) ->
Opts = [{versions, [v1]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
- ?line {ok, _Pid} = snmpm_config:start_link(Opts),
+ {ok, _Pid} = snmpm_config:start_link(Opts),
%% Random init
?SNMP_RAND_SEED(),
@@ -2618,10 +2618,10 @@ create_and_increment(Conf) when is_list(Conf) ->
IncVal = 42,
EndVal = StartVal + IncVal,
- ?line StartVal = snmpm_config:cre_counter(test_id, StartVal),
- ?line EndVal = snmpm_config:incr_counter(test_id, IncVal),
+ StartVal = snmpm_config:cre_counter(test_id, StartVal),
+ EndVal = snmpm_config:incr_counter(test_id, IncVal),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
config_ensure_not_running(),
ok.
@@ -2652,27 +2652,27 @@ stats_create_and_increment(Conf) when is_list(Conf) ->
Opts = [{versions, [v1]},
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
- ?line {ok, _Pid} = snmpm_config:start_link(Opts),
+ {ok, _Pid} = snmpm_config:start_link(Opts),
?IPRINT("stats table (1): ~p", [ets:tab2list(snmpm_stats_table)]),
- ?line 0 = snmpm_config:maybe_cre_stats_counter(stats1, 0),
+ 0 = snmpm_config:maybe_cre_stats_counter(stats1, 0),
?IPRINT("stats table (2): ~p", [ets:tab2list(snmpm_stats_table)]),
- ?line ok = snmpm_config:maybe_cre_stats_counter(stats1, 0),
+ ok = snmpm_config:maybe_cre_stats_counter(stats1, 0),
?IPRINT("stats table (3): ~p", [ets:tab2list(snmpm_stats_table)]),
- ?line 1 = snmpm_config:maybe_cre_stats_counter(stats2, 1),
+ 1 = snmpm_config:maybe_cre_stats_counter(stats2, 1),
?IPRINT("stats table (4): ~p", [ets:tab2list(snmpm_stats_table)]),
- ?line 10 = snmpm_config:cre_stats_counter(stats3, 10),
+ 10 = snmpm_config:cre_stats_counter(stats3, 10),
?IPRINT("stats table (5): ~p", [ets:tab2list(snmpm_stats_table)]),
Stats1Inc = fun() -> snmpm_config:incr_stats_counter(stats1, 1) end,
- ?line 10 = loop(10, -1, Stats1Inc),
+ 10 = loop(10, -1, Stats1Inc),
?IPRINT("stats table (6): ~p", [ets:tab2list(snmpm_stats_table)]),
- ?line ok = snmpm_config:reset_stats_counter(stats1),
+ ok = snmpm_config:reset_stats_counter(stats1),
- ?line 10 = loop(10, -1, Stats1Inc),
+ 10 = loop(10, -1, Stats1Inc),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
config_ensure_not_running(),
ok.
@@ -2710,13 +2710,13 @@ otp_7219(Config) when is_list(Config) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("start manager config"),
- ?line {ok, _Pid1} = snmpm_config:start_link(Opts1),
+ {ok, _Pid1} = snmpm_config:start_link(Opts1),
?IPRINT("get some manager config"),
{ok, {user, _}} = snmpm_config:system_info(net_if_irb),
?IPRINT("stop manager config"),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
config_ensure_not_running(),
IRB_TO = 15322,
@@ -2725,13 +2725,13 @@ otp_7219(Config) when is_list(Config) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("start manager config"),
- ?line {ok, _Pid2} = snmpm_config:start_link(Opts2),
+ {ok, _Pid2} = snmpm_config:start_link(Opts2),
?IPRINT("get some manager config"),
{ok, {user, IRB_TO}} = snmpm_config:system_info(net_if_irb),
?IPRINT("stop manager config"),
- ?line ok = snmpm_config:stop(),
+ ok = snmpm_config:stop(),
config_ensure_not_running(),
?IPRINT("done"),
@@ -2808,7 +2808,7 @@ otp8395(Conf, SeqNoVal, Expect) ->
case config_start(Opts) of
{ok, _Pid} when (Expect =:= ok) ->
- ?line ok = config_stop(),
+ ok = config_stop(),
ok;
{ok, _Pid} when (Expect =/= ok) ->
config_stop(),
@@ -2867,7 +2867,7 @@ otp_8395_4(Conf) when is_list(Conf) ->
{mibs, Mibs},
{versions, Vsns}],
- ?line {ok, _Pid} = config_start(Opts),
+ {ok, _Pid} = config_start(Opts),
Counter = otp_8395_4,
Initial = 10,
@@ -2885,7 +2885,7 @@ otp_8395_4(Conf) when is_list(Conf) ->
Val2 = Initial + Increment,
Val2 = otp8395_incr_counter(Counter, Initial, Increment, Max),
- ?line ok = config_stop(),
+ ok = config_stop(),
?IPRINT("done"),
ok.
@@ -2899,6 +2899,14 @@ otp8395_incr_counter(Counter, Initial, Increment, Max) ->
%% Internal functions
%%======================================================================
+update_agent_info(UserId, Addr, Port, Item, Val) ->
+ case snmpm_config:agent_info(Addr, Port, target_name) of
+ {ok, TargetName} ->
+ snmpm_config:update_agent_info(UserId, TargetName, [{Item, Val}]);
+ Error ->
+ Error
+ end.
+
config_start(Opts) ->
(catch snmpm_config:start_link(Opts)).
@@ -3016,7 +3024,7 @@ write_usm_conf2(Dir, Str) ->
write_conf_file(Dir, File, Str) ->
case file:open(filename:join(Dir, File), write) of
{ok, Fd} ->
- ?line ok = io:format(Fd, "~s", [Str]),
+ ok = io:format(Fd, "~s", [Str]),
file:close(Fd);
{error, Reason} ->
Info =
diff --git a/lib/snmp/test/snmp_manager_user_SUITE.erl b/lib/snmp/test/snmp_manager_user_SUITE.erl
index 04a75232b7..b4789bfe89 100644
--- a/lib/snmp/test/snmp_manager_user_SUITE.erl
+++ b/lib/snmp/test/snmp_manager_user_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -202,16 +202,16 @@ init_per_testcase(Case, Config) when is_list(Config) ->
SuiteTopDir = ?config(snmp_suite_top_dir, Config),
CaseTopDir = filename:join(SuiteTopDir, atom_to_list(Case)),
- ?line ok = file:make_dir(CaseTopDir),
+ ok = file:make_dir(CaseTopDir),
?IPRINT("init_per_testcase -> CaseTopDir: ~p", [CaseTopDir]),
MgrTopDir = filename:join(CaseTopDir, "manager/"),
- ?line ok = file:make_dir(MgrTopDir),
+ ok = file:make_dir(MgrTopDir),
MgrConfDir = filename:join(MgrTopDir, "conf/"),
- ?line ok = file:make_dir(MgrConfDir),
+ ok = file:make_dir(MgrConfDir),
MgrDbDir = filename:join(MgrTopDir, "db/"),
- ?line ok = file:make_dir(MgrDbDir),
+ ok = file:make_dir(MgrDbDir),
MgrLogDir = filename:join(MgrTopDir, "log/"),
- ?line ok = file:make_dir(MgrLogDir),
+ ok = file:make_dir(MgrLogDir),
Config1 = [{case_top_dir, CaseTopDir},
{manager_dir, MgrTopDir},
@@ -267,24 +267,24 @@ simple_register_and_unregister1(Conf) when is_list(Conf) ->
Id = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user(Pid, Id),
+ ok = register_user(Pid, Id),
- ?line [Id] = Users2 = which_users(),
+ [Id] = Users2 = which_users(),
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = unregister_user(Pid),
+ ok = unregister_user(Pid),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line stop_user(Pid),
+ stop_user(Pid),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -319,15 +319,15 @@ simple_register_and_unregister2(Conf) when is_list(Conf) ->
Id1 = make_ref(),
Id2 = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user(Pid, Id1),
- ?line ok = register_user(Pid, Id2),
+ ok = register_user(Pid, Id1),
+ ok = register_user(Pid, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -338,15 +338,15 @@ simple_register_and_unregister2(Conf) when is_list(Conf) ->
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = unregister_user(Pid, Id1),
- ?line ok = unregister_user(Pid, Id2),
+ ok = unregister_user(Pid, Id1),
+ ok = unregister_user(Pid, Id2),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line stop_user(Pid),
+ stop_user(Pid),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -381,16 +381,16 @@ simple_register_and_unregister3(Conf) when is_list(Conf) ->
Id1 = make_ref(),
Id2 = make_ref(),
- ?line Pid1 = start_user(),
- ?line Pid2 = start_user(),
+ Pid1 = start_user(),
+ Pid2 = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user(Pid1, Id1),
- ?line ok = register_user(Pid2, Id2),
+ ok = register_user(Pid1, Id1),
+ ok = register_user(Pid2, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -401,16 +401,16 @@ simple_register_and_unregister3(Conf) when is_list(Conf) ->
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = unregister_user(Pid1, Id1),
- ?line ok = unregister_user(Pid2, Id2),
+ ok = unregister_user(Pid1, Id1),
+ ok = unregister_user(Pid2, Id2),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line stop_user(Pid1),
- ?line stop_user(Pid2),
+ stop_user(Pid1),
+ stop_user(Pid2),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -437,29 +437,29 @@ register_and_crash1(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
- ?line ok = snmpm:start_link(Opts),
+ ok = snmpm:start_link(Opts),
?SLEEP(1000),
Id = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user(Pid, Id),
+ ok = register_user(Pid, Id),
- ?line [Id] = Users2 = which_users(),
+ [Id] = Users2 = which_users(),
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = simulate_crash(Pid),
+ ok = simulate_crash(Pid),
- ?line [Id] = Users3 = which_users(),
+ [Id] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -487,22 +487,22 @@ register_and_crash2(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
- ?line ok = snmpm:start_link(Opts),
+ ok = snmpm:start_link(Opts),
?SLEEP(1000),
Id1 = make_ref(),
Id2 = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user(Pid, Id1),
- ?line ok = register_user(Pid, Id2),
+ ok = register_user(Pid, Id1),
+ ok = register_user(Pid, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -512,9 +512,9 @@ register_and_crash2(Conf) when is_list(Conf) ->
end,
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = simulate_crash(Pid),
+ ok = simulate_crash(Pid),
- ?line Users3 = case which_users() of
+ Users3 = case which_users() of
[Id1, Id2] = U3 ->
U3;
[Id2, Id1] = U4 ->
@@ -525,7 +525,7 @@ register_and_crash2(Conf) when is_list(Conf) ->
?IPRINT("Users3: ~p", [Users3]),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -614,31 +614,31 @@ simple_register_monitor_and_unregister1(Conf) when is_list(Conf) ->
Id = make_ref(),
?IPRINT("start user"),
- ?line Pid = start_user(),
+ Pid = start_user(),
?IPRINT("get users (=0)"),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
?IPRINT("register monitored user"),
- ?line ok = register_user_monitor(Pid, Id),
+ ok = register_user_monitor(Pid, Id),
?IPRINT("get users (=1)"),
- ?line [Id] = Users2 = which_users(),
+ [Id] = Users2 = which_users(),
?IPRINT("Users2: ~p", [Users2]),
?IPRINT("unregister monitored user"),
- ?line unregister_user(Pid),
+ unregister_user(Pid),
?IPRINT("get users (=0)"),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
?IPRINT("start user"),
- ?line stop_user(Pid),
+ stop_user(Pid),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -674,15 +674,15 @@ simple_register_monitor_and_unregister2(Conf) when is_list(Conf) ->
Id1 = make_ref(),
Id2 = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user_monitor(Pid, Id1),
- ?line ok = register_user_monitor(Pid, Id2),
+ ok = register_user_monitor(Pid, Id1),
+ ok = register_user_monitor(Pid, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -692,15 +692,15 @@ simple_register_monitor_and_unregister2(Conf) when is_list(Conf) ->
end,
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = unregister_user(Pid, Id1),
- ?line ok = unregister_user(Pid, Id2),
+ ok = unregister_user(Pid, Id1),
+ ok = unregister_user(Pid, Id2),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line stop_user(Pid),
+ stop_user(Pid),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -737,15 +737,15 @@ simple_register_monitor_and_unregister3(Conf) when is_list(Conf) ->
Id1 = make_ref(),
Id2 = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user(Pid, Id1),
- ?line ok = register_user_monitor(Pid, Id2),
+ ok = register_user(Pid, Id1),
+ ok = register_user_monitor(Pid, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -755,14 +755,14 @@ simple_register_monitor_and_unregister3(Conf) when is_list(Conf) ->
end,
?IPRINT("Users2: ~p", [Users2]),
- ?line unregister_user(Pid),
+ unregister_user(Pid),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line stop_user(Pid),
+ stop_user(Pid),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -789,31 +789,31 @@ register_monitor_and_crash1(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
- ?line ok = snmpm:start_link(Opts),
+ ok = snmpm:start_link(Opts),
?SLEEP(1000),
Id = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user_monitor(Pid, Id),
+ ok = register_user_monitor(Pid, Id),
- ?line [Id] = Users2 = which_users(),
+ [Id] = Users2 = which_users(),
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = simulate_crash(Pid),
+ ok = simulate_crash(Pid),
?SLEEP(1000),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -842,22 +842,22 @@ register_monitor_and_crash2(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
- ?line ok = snmpm:start_link(Opts),
+ ok = snmpm:start_link(Opts),
?SLEEP(1000),
Id1 = make_ref(),
Id2 = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user_monitor(Pid, Id1),
- ?line ok = register_user_monitor(Pid, Id2),
+ ok = register_user_monitor(Pid, Id1),
+ ok = register_user_monitor(Pid, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -867,15 +867,15 @@ register_monitor_and_crash2(Conf) when is_list(Conf) ->
end,
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = simulate_crash(Pid),
+ ok = simulate_crash(Pid),
?SLEEP(1000),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -924,22 +924,22 @@ register_monitor_and_crash3(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("try starting manager"),
- ?line ok = snmpm:start_link(Opts),
+ ok = snmpm:start_link(Opts),
?SLEEP(1000),
Id1 = make_ref(),
Id2 = make_ref(),
- ?line Pid = start_user(),
+ Pid = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user(Pid, Id1),
- ?line ok = register_user_monitor(Pid, Id2),
+ ok = register_user(Pid, Id1),
+ ok = register_user_monitor(Pid, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -949,15 +949,15 @@ register_monitor_and_crash3(Conf) when is_list(Conf) ->
end,
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = simulate_crash(Pid),
+ ok = simulate_crash(Pid),
?SLEEP(1000),
- ?line [Id1] = Users3 = which_users(),
+ [Id1] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -986,7 +986,7 @@ register_monitor_and_crash4(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("start manager"),
- ?line ok = snmpm:start_link(Opts),
+ ok = snmpm:start_link(Opts),
?SLEEP(1000),
@@ -994,16 +994,16 @@ register_monitor_and_crash4(Conf) when is_list(Conf) ->
Id2 = make_ref(),
?IPRINT("start user processes"),
- ?line Pid1 = start_user(),
- ?line Pid2 = start_user(),
+ Pid1 = start_user(),
+ Pid2 = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user_monitor(Pid1, Id1),
- ?line ok = register_user_monitor(Pid2, Id2),
+ ok = register_user_monitor(Pid1, Id1),
+ ok = register_user_monitor(Pid2, Id2),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -1013,17 +1013,17 @@ register_monitor_and_crash4(Conf) when is_list(Conf) ->
end,
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = simulate_crash(Pid1),
+ ok = simulate_crash(Pid1),
?SLEEP(1000),
- ?line [Id2] = Users3 = which_users(),
+ [Id2] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line stop_user(Pid2),
+ stop_user(Pid2),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -1054,7 +1054,7 @@ register_monitor_and_crash5(Conf) when is_list(Conf) ->
{config, [{verbosity, trace}, {dir, ConfDir}, {db_dir, DbDir}]}],
?IPRINT("start manager"),
- ?line ok = snmpm:start_link(Opts),
+ ok = snmpm:start_link(Opts),
?SLEEP(1000),
@@ -1062,14 +1062,14 @@ register_monitor_and_crash5(Conf) when is_list(Conf) ->
Id2 = tomat, %% make_ref(),
?IPRINT("start user processes"),
- ?line Pid1 = start_user(),
- ?line Pid2 = start_user(),
+ Pid1 = start_user(),
+ Pid2 = start_user(),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = register_user_monitor(Pid1, Id1),
- ?line ok = register_user_monitor(Pid2, Id2),
+ ok = register_user_monitor(Pid1, Id1),
+ ok = register_user_monitor(Pid2, Id2),
LocalHost = snmp_test_lib:localhost(),
@@ -1083,16 +1083,16 @@ register_monitor_and_crash5(Conf) when is_list(Conf) ->
Port2 = 5002,
EngineId2 = "agentEngineId-2",
- ?line ok = register_agent(Pid1,
+ ok = register_agent(Pid1,
Id1, TargetName1, [{address, Address1},
{port, Port1},
{engine_id, EngineId1}]),
- ?line ok = register_agent(Pid2,
+ ok = register_agent(Pid2,
Id2, TargetName2, [{address, Address2},
{port, Port2},
{engine_id, EngineId2}]),
- ?line Users2 = case which_users() of
+ Users2 = case which_users() of
[Id1, Id2] = U1 ->
U1;
[Id2, Id1] = U2 ->
@@ -1103,7 +1103,7 @@ register_monitor_and_crash5(Conf) when is_list(Conf) ->
?IPRINT("Users2: ~p", [Users2]),
?IPRINT("verify all agent(s): expect 2"),
- ?line Agents1 = case which_agents() of
+ Agents1 = case which_agents() of
[TargetName1, TargetName2] = A1 ->
A1;
[TargetName2, TargetName1] = A2 ->
@@ -1113,21 +1113,21 @@ register_monitor_and_crash5(Conf) when is_list(Conf) ->
end,
?IPRINT("Agents1: ~p", [Agents1]),
- ?line ok = simulate_crash(Pid1),
+ ok = simulate_crash(Pid1),
?IPRINT("wait some time"),
?SLEEP(1000),
- ?line [Id2] = Users3 = which_users(),
+ [Id2] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line [TargetName2] = Agents2 = which_agents(),
+ [TargetName2] = Agents2 = which_agents(),
?IPRINT("Agents2: ~p", [Agents2]),
- ?line stop_user(Pid2),
+ stop_user(Pid2),
?IPRINT("stop manager"),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -1217,20 +1217,20 @@ otp7902(Conf) when is_list(Conf) ->
?SLEEP(1000),
- ?line [] = Users1 = which_users(),
+ [] = Users1 = which_users(),
?IPRINT("Users1: ~p", [Users1]),
- ?line ok = snmp_manager_user_old:start(),
+ ok = snmp_manager_user_old:start(),
- ?line [_] = Users2 = which_users(),
+ [_] = Users2 = which_users(),
?IPRINT("Users2: ~p", [Users2]),
- ?line ok = snmp_manager_user_old:stop(),
+ ok = snmp_manager_user_old:stop(),
- ?line [] = Users3 = which_users(),
+ [] = Users3 = which_users(),
?IPRINT("Users3: ~p", [Users3]),
- ?line ok = snmpm:stop(),
+ ok = snmpm:stop(),
?IPRINT("end"),
ok.
@@ -1312,7 +1312,7 @@ write_manager_conf(Dir, Str) ->
write_conf_file(Dir, File, Str) ->
- ?line {ok, Fd} = file:open(filename:join(Dir, File), write),
- ?line ok = io:format(Fd, "~s", [Str]),
+ {ok, Fd} = file:open(filename:join(Dir, File), write),
+ ok = io:format(Fd, "~s", [Str]),
file:close(Fd).
diff --git a/lib/snmp/test/snmp_note_store_SUITE.erl b/lib/snmp/test/snmp_note_store_SUITE.erl
index 3b6d9f9fcd..469178c372 100644
--- a/lib/snmp/test/snmp_note_store_SUITE.erl
+++ b/lib/snmp/test/snmp_note_store_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -239,7 +239,7 @@ do_notes({_, Pid}, _Config) ->
info(suite) ->
[];
info(doc) ->
- ["Testing that we can retreive process info."];
+ ["Testing that we can retrieve process info."];
info(Config) when is_list(Config) ->
Pre = fun() ->
?IPRINT("try start note-store"),
diff --git a/lib/snmp/test/snmp_test_data/RFC1213-MIB.mib b/lib/snmp/test/snmp_test_data/RFC1213-MIB.mib
index 0421e64d62..eeb2535d7d 100644
--- a/lib/snmp/test/snmp_test_data/RFC1213-MIB.mib
+++ b/lib/snmp/test/snmp_test_data/RFC1213-MIB.mib
@@ -684,7 +684,7 @@
Setting this object to a null string (one of zero
length) has the effect of invaliding the
corresponding entry in the atTable object. That
- is, it effectively dissasociates the interface
+ is, it effectively disassociates the interface
identified with said entry from the mapping
identified with said entry. It is an
implementation-specific matter as to whether the
@@ -1256,7 +1256,7 @@
Setting this object to the value invalid(2) has
the effect of invalidating the corresponding entry
in the ipRouteTable object. That is, it
- effectively dissasociates the destination
+ effectively disassociates the destination
identified with said entry from the route
identified with said entry. It is an
implementation-specific matter as to whether the
@@ -1475,7 +1475,7 @@
Setting this object to the value invalid(2) has
the effect of invalidating the corresponding entry
in the ipNetToMediaTable. That is, it effectively
- dissasociates the interface identified with said
+ disassociates the interface identified with said
entry from the mapping identified with said entry.
It is an implementation-specific matter as to
whether the agent removes an invalidated entry
diff --git a/lib/snmp/test/snmp_test_data/SNMPv2-MIB.mib b/lib/snmp/test/snmp_test_data/SNMPv2-MIB.mib
index e45d9d91da..995be37f80 100644
--- a/lib/snmp/test/snmp_test_data/SNMPv2-MIB.mib
+++ b/lib/snmp/test/snmp_test_data/SNMPv2-MIB.mib
@@ -221,7 +221,7 @@ sysORUpTime OBJECT-TYPE
STATUS current
DESCRIPTION
"The value of sysUpTime at the time this conceptual row was
- last instanciated."
+ last instantiated."
::= { sysOREntry 4 }
diff --git a/lib/snmp/test/snmp_test_data/Test-LLDP-MIB.mib b/lib/snmp/test/snmp_test_data/Test-LLDP-MIB.mib
index 40a9fc79e1..41b8057223 100644
--- a/lib/snmp/test/snmp_test_data/Test-LLDP-MIB.mib
+++ b/lib/snmp/test/snmp_test_data/Test-LLDP-MIB.mib
@@ -30,7 +30,7 @@ t-lldpMIB MODULE-IDENTITY
"This is the ripped out bits and pieces of LLDP-MIB
that triggered a compilation problem for Erlang/OTP's
MIB compiler due to an AUGMENTS in lldpConfigManAddrEntry
- refering to a not yet defined OBJECT-TYPE lldpLocManAddrEntry.
+ referring to a not yet defined OBJECT-TYPE lldpLocManAddrEntry.
Rip and rewrite done 2017.
Management Information Base module for LLDP configuration,
@@ -199,7 +199,7 @@ lldpLocManAddrLen OBJECT-TYPE
The management address length field is needed so that the
receiving systems that do not implement SNMP will not be
required to implement an iana family numbers/address length
- equivalency table in order to decode the management adress."
+ equivalency table in order to decode the management address."
REFERENCE
"IEEE 802.1AB-2005 9.5.9.2"
::= { lldpLocManAddrEntry 2 }
diff --git a/lib/snmp/test/snmp_test_data/TestTrapv2.mib b/lib/snmp/test/snmp_test_data/TestTrapv2.mib
index 679ddc14b0..2ba59451f5 100644
--- a/lib/snmp/test/snmp_test_data/TestTrapv2.mib
+++ b/lib/snmp/test/snmp_test_data/TestTrapv2.mib
@@ -44,14 +44,14 @@ tst OBJECT IDENTIFIER ::= { system 0 }
testTrapv21 NOTIFICATION-TYPE
STATUS current
DESCRIPTION
- "This trap is exactly the v2 correspondance of testTrap1 in
+ "This trap is exactly the v2 correspondence of testTrap1 in
TestTrap mib."
::= { snmp 1 }
testTrapv22 NOTIFICATION-TYPE
STATUS current
DESCRIPTION
- "This trap is exactly the v2 correspondance of testTrap2 in
+ "This trap is exactly the v2 correspondence of testTrap2 in
TestTrap mib."
::= { system 0 1 }
diff --git a/lib/snmp/test/snmp_test_global_sys_monitor.erl b/lib/snmp/test/snmp_test_global_sys_monitor.erl
index 1c90fff686..e3f59c05e4 100644
--- a/lib/snmp/test/snmp_test_global_sys_monitor.erl
+++ b/lib/snmp/test/snmp_test_global_sys_monitor.erl
@@ -199,7 +199,7 @@ cast(Msg) ->
ok
catch
C:E:_ ->
- {error, {catched, C, E}}
+ {error, {caught, C, E}}
end.
%% call(Req) ->
@@ -217,7 +217,7 @@ cast(Msg) ->
%% end
%% catch
%% C:E:_ ->
-%% {error, {catched, C, E}}
+%% {error, {caught, C, E}}
%% end.
call(Req, Timeout) when (Timeout =:= infinity) ->
@@ -229,7 +229,7 @@ call(Req, Timeout) when is_integer(Timeout) andalso (Timeout > 1000) ->
call(Req, Timeout) when is_integer(Timeout) ->
call(Req, Timeout, Timeout div 2).
-%% This peace of wierdness is because on some machines this call has
+%% This peace of weirdness is because on some machines this call has
%% hung (in a call during end_per_testcase, which had a 1 min timeout,
%% or if that was the total time for the test case).
%% But because it hung there, we don't really know where it got stuck.
@@ -249,7 +249,7 @@ call(Req, Timeout1, Timeout2) ->
end
catch
C:E:_ ->
- exit({error, {catched, C, E}})
+ exit({error, {caught, C, E}})
end
end,
{Pid, Mon} = spawn_monitor(F),
diff --git a/lib/snmp/test/snmp_test_lib.erl b/lib/snmp/test/snmp_test_lib.erl
index 95aab43deb..68244b3f80 100644
--- a/lib/snmp/test/snmp_test_lib.erl
+++ b/lib/snmp/test/snmp_test_lib.erl
@@ -26,7 +26,7 @@
-export([tc_try/2, tc_try/3,
tc_try/4, tc_try/5]).
-export([proxy_call/3]).
--export([hostname/0, hostname/1, localhost/0, localhost/1, os_type/0, sz/1,
+-export([hostname/0, hostname/1, localhost/0, localhost/1, sz/1,
display_suite_info/1]).
-export([non_pc_tc_maybe_skip/4,
os_based_skip/1,
@@ -41,8 +41,7 @@
-export([hours/1, minutes/1, seconds/1, sleep/1]).
-export([flush_mqueue/0, mqueue/0, mqueue/1, trap_exit/0, trap_exit/1]).
-export([ping/1, local_nodes/0, nodes_on/1]).
--export([start_node/2, stop_node/1]).
--export([is_app_running/1,
+-export([is_app_running/1,
is_crypto_running/0, is_mnesia_running/0, is_snmp_running/0,
ensure_not_running/3]).
-export([crypto_start/0, crypto_support/0]).
@@ -71,7 +70,7 @@
%% conditions.
%% Pre: A fun that is nominally part of the test case
%% but is an initiation that must be "undone". This is
-%% done by the Post fun (regardless if the TC is successfull
+%% done by the Post fun (regardless if the TC is successful
%% or not). Example: Starts a couple of nodes,
%% TC: The test case fun
%% Post: A fun that undo what was done by the Pre fun.
@@ -119,7 +118,7 @@ tc_try(Case, TCCond, Pre, TC, Post)
(C =:= exit) ->
tc_print("test case (~w) skip: try post", [C]),
(catch Post(State)),
- tc_end( f("skipping(catched,~w,tc)", [C]) ),
+ tc_end( f("skipping(caught,~w,tc)", [C]) ),
SKIP;
C:E:S ->
%% We always check the system events
@@ -130,7 +129,7 @@ tc_try(Case, TCCond, Pre, TC, Post)
[] ->
tc_print("test case failed: try post"),
(catch Post(State)),
- tc_end( f("failed(catched,~w,tc)", [C]) ),
+ tc_end( f("failed(caught,~w,tc)", [C]) ),
erlang:raise(C, E, S);
SysEvs ->
tc_print("System Events received during tc: "
@@ -150,7 +149,7 @@ tc_try(Case, TCCond, Pre, TC, Post)
catch
C:{skip, _} = SKIP when (C =:= throw) orelse
(C =:= exit) ->
- tc_end( f("skipping(catched,~w,tc-pre)", [C]) ),
+ tc_end( f("skipping(caught,~w,tc-pre)", [C]) ),
SKIP;
C:E:S ->
%% We always check the system events
@@ -162,7 +161,7 @@ tc_try(Case, TCCond, Pre, TC, Post)
"~n E: ~p"
"~n S: ~p",
[C, E, S]),
- tc_end( f("auto-skip(catched,~w,tc-pre)", [C]) ),
+ tc_end( f("auto-skip(caught,~w,tc-pre)", [C]) ),
SKIP = {skip, f("TC-Pre failure (~w)", [C])},
SKIP;
SysEvs ->
@@ -186,13 +185,13 @@ tc_try(Case, TCCond, Pre, TC, Post)
exit({tc_cond_failed, Reason})
catch
C:{skip, _} = SKIP when ((C =:= throw) orelse (C =:= exit)) ->
- tc_end( f("skipping(catched,~w,cond)", [C]) ),
+ tc_end( f("skipping(caught,~w,cond)", [C]) ),
SKIP;
C:E:S ->
%% We always check the system events before we accept a failure
case snmp_test_global_sys_monitor:events() of
[] ->
- tc_end( f("failed(catched,~w,cond)", [C]) ),
+ tc_end( f("failed(caught,~w,cond)", [C]) ),
erlang:raise(C, E, S);
SysEvs ->
tc_print("System Events received: "
@@ -412,16 +411,6 @@ sz(B) when is_binary(B) ->
sz(O) ->
{unknown_size,O}.
-
-os_type() ->
- case (catch test_server:os_type()) of
- {'EXIT', _} ->
- %% Pre-R10 test server does not have this function
- os:type();
- OsType ->
- OsType
- end.
-
display_suite_info(SUITE) when is_atom(SUITE) ->
(catch do_display_suite_info(SUITE)).
@@ -968,7 +957,7 @@ skip(Reason, Module, Line) ->
exit({skip, String}).
-%% This function prints various host info, which might be usefull
+%% This function prints various host info, which might be useful
%% when analyzing the test suite (results).
%% It also returns a "factor" that can be used when deciding
%% the load for some test cases. Such as run time or number of
@@ -2468,15 +2457,6 @@ nodes_on(Host) when is_list(Host) ->
net_adm:world_list([list_to_atom(Host)]).
-start_node(Name, Args) ->
- Opts = [{cleanup, false}, {args, Args}],
- test_server:start_node(Name, peer, Opts).
-
-
-stop_node(Node) ->
- test_server:stop_node(Node).
-
-
%% ----------------------------------------------------------------
%% Application and Crypto utility functions
%%
diff --git a/lib/snmp/test/snmp_test_lib.hrl b/lib/snmp/test/snmp_test_lib.hrl
index ea7732eba8..0678696c04 100644
--- a/lib/snmp/test/snmp_test_lib.hrl
+++ b/lib/snmp/test/snmp_test_lib.hrl
@@ -103,9 +103,6 @@
-define(PING(N), ?LIB:ping(N)).
-define(LNODES(), ?LIB:local_nodes()).
-define(NODES(H), ?LIB:nodes_on(H)).
--define(START_NODE(N,A), ?LIB:start_node(N,A)).
--define(STOP_NODE(N), ?LIB:stop_node(N)).
-
%% - Application and Crypto utility macros -
@@ -158,3 +155,8 @@
-define(FTS(), snmp_misc:formated_timestamp()).
-define(FTS(TS), snmp_misc:format_timestamp(TS)).
+%% This needs to be a macro-definition to capture ?FUNCTION_NAME and ?MODULE.
+-define (START_PEER(Kind), ?CT_PEER(#{
+ name => ?CT_PEER_NAME(atom_to_list(?FUNCTION_NAME) ++ Kind),
+ args => ["-s", "snmp_test_sys_monitor", "start", "-s", "global", "sync"]
+})).
diff --git a/lib/snmp/test/snmp_test_manager.erl b/lib/snmp/test/snmp_test_manager.erl
index 38ec1d9ce3..1bd1351a76 100644
--- a/lib/snmp/test/snmp_test_manager.erl
+++ b/lib/snmp/test/snmp_test_manager.erl
@@ -155,7 +155,7 @@ parse_opts(Opts) ->
MgrDir = get_opt(dir, get_opt(config, MgrOpts, [])),
- %% Retreive the agent configuration
+ %% Retrieve the agent configuration
AgentConf = get_opt(agent_config, Opts),
AgentTarget = get_opt(agent_target, Opts),
{MgrDir, MgrConf, MgrOpts, AgentTarget, AgentConf}.
diff --git a/lib/snmp/test/snmp_test_mgr_counter_server.erl b/lib/snmp/test/snmp_test_mgr_counter_server.erl
index 697afdf799..49f273e04a 100644
--- a/lib/snmp/test/snmp_test_mgr_counter_server.erl
+++ b/lib/snmp/test/snmp_test_mgr_counter_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2014-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2014-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
%% agent test suite is implemented in such a way that the
%% agent is started once and then used for several test cases.
%% Each request is given a request id which *was* generated using
-%% random! It is therefor possible, although unlikely, that a
+%% random! It is therefore possible, although unlikely, that a
%% request may get a request id that has recently been used,
%% which will cause the agent to silently reject the request.
%% For this reason, we start this server at the start of the
diff --git a/lib/snmp/test/snmp_test_mgr_misc.erl b/lib/snmp/test/snmp_test_mgr_misc.erl
index 506ceb6a5e..73f338c01c 100644
--- a/lib/snmp/test/snmp_test_mgr_misc.erl
+++ b/lib/snmp/test/snmp_test_mgr_misc.erl
@@ -394,7 +394,7 @@ handle_v1_or_v2_message(Mgr, _UdpId, Ip, UdpPort, _AgentIp,
end.
-%% This function assumes that the agent and the manager (thats us)
+%% This function assumes that the agent and the manager (that's us)
%% has the same version.
check_discovery_result('version-3', DiscoReqMsg, DiscoRspMsg) ->
ReqMsgID = getMsgID(DiscoReqMsg),
@@ -776,7 +776,7 @@ ensure_dead_kill(Pid, MRef, Timeout) ->
display_incomming_message(M) ->
- display_message("Incomming",M).
+ display_message("Incoming",M).
display_outgoing_message(M) ->
display_message("Outgoing", M).
diff --git a/lib/snmp/test/snmp_test_server.erl b/lib/snmp/test/snmp_test_server.erl
index ac874e47be..0eb7065b85 100644
--- a/lib/snmp/test/snmp_test_server.erl
+++ b/lib/snmp/test/snmp_test_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -322,7 +322,7 @@ display_failed(Failed) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Verify that the actual result of a test case matches the exected one
+%% Verify that the actual result of a test case matches the expected one
%% Returns the actual result
%% Stores the result in the process dictionary if mismatch
diff --git a/lib/snmp/test/snmp_to_snmpnet_SUITE.erl b/lib/snmp/test/snmp_to_snmpnet_SUITE.erl
index 1152c8ec49..6a659e6aed 100644
--- a/lib/snmp/test/snmp_to_snmpnet_SUITE.erl
+++ b/lib/snmp/test/snmp_to_snmpnet_SUITE.erl
@@ -411,7 +411,7 @@ erlang_agent_netsnmp_get(Config) when is_list(Config) ->
"~n ~s", [Rest]),
throw({skip, Rest});
Any ->
- ct:pal("Received unexpected reponse: "
+ ct:pal("Received unexpected response: "
"~n ~p", [Any]),
exit({unexpected, Any})
end || Transport <- Transports],
diff --git a/lib/snmp/test/snmp_to_snmpnet_SUITE_data/TestTrapv2.mib b/lib/snmp/test/snmp_to_snmpnet_SUITE_data/TestTrapv2.mib
index 679ddc14b0..2ba59451f5 100644
--- a/lib/snmp/test/snmp_to_snmpnet_SUITE_data/TestTrapv2.mib
+++ b/lib/snmp/test/snmp_to_snmpnet_SUITE_data/TestTrapv2.mib
@@ -44,14 +44,14 @@ tst OBJECT IDENTIFIER ::= { system 0 }
testTrapv21 NOTIFICATION-TYPE
STATUS current
DESCRIPTION
- "This trap is exactly the v2 correspondance of testTrap1 in
+ "This trap is exactly the v2 correspondence of testTrap1 in
TestTrap mib."
::= { snmp 1 }
testTrapv22 NOTIFICATION-TYPE
STATUS current
DESCRIPTION
- "This trap is exactly the v2 correspondance of testTrap2 in
+ "This trap is exactly the v2 correspondence of testTrap2 in
TestTrap mib."
::= { system 0 1 }
diff --git a/lib/snmp/test/test-mibs/RFC1213-MIB.mib b/lib/snmp/test/test-mibs/RFC1213-MIB.mib
index 0421e64d62..eeb2535d7d 100644
--- a/lib/snmp/test/test-mibs/RFC1213-MIB.mib
+++ b/lib/snmp/test/test-mibs/RFC1213-MIB.mib
@@ -684,7 +684,7 @@
Setting this object to a null string (one of zero
length) has the effect of invaliding the
corresponding entry in the atTable object. That
- is, it effectively dissasociates the interface
+ is, it effectively disassociates the interface
identified with said entry from the mapping
identified with said entry. It is an
implementation-specific matter as to whether the
@@ -1256,7 +1256,7 @@
Setting this object to the value invalid(2) has
the effect of invalidating the corresponding entry
in the ipRouteTable object. That is, it
- effectively dissasociates the destination
+ effectively disassociates the destination
identified with said entry from the route
identified with said entry. It is an
implementation-specific matter as to whether the
@@ -1475,7 +1475,7 @@
Setting this object to the value invalid(2) has
the effect of invalidating the corresponding entry
in the ipNetToMediaTable. That is, it effectively
- dissasociates the interface identified with said
+ disassociates the interface identified with said
entry from the mapping identified with said entry.
It is an implementation-specific matter as to
whether the agent removes an invalidated entry
diff --git a/lib/snmp/test/test-mibs/SNMPv2-MIB.mib b/lib/snmp/test/test-mibs/SNMPv2-MIB.mib
index 0c5418b9ce..e07e5ae16b 100644
--- a/lib/snmp/test/test-mibs/SNMPv2-MIB.mib
+++ b/lib/snmp/test/test-mibs/SNMPv2-MIB.mib
@@ -221,7 +221,7 @@ sysORUpTime OBJECT-TYPE
STATUS current
DESCRIPTION
"The value of sysUpTime at the time this conceptual row was
- last instanciated."
+ last instantiated."
::= { sysOREntry 4 }
@@ -375,7 +375,7 @@ tst OBJECT IDENTIFIER ::= { system 0 }
testTrapv22 NOTIFICATION-TYPE
STATUS current
DESCRIPTION
- "This trap is exactly the v2 correspondance of testTrap2 in
+ "This trap is exactly the v2 correspondence of testTrap2 in
TestTrap mib."
::= { system 0 1 }
diff --git a/lib/snmp/test/test-mibs/SNMPv2-TC.mib b/lib/snmp/test/test-mibs/SNMPv2-TC.mib
index 1d75c4bbd8..f6051f7a71 100644
--- a/lib/snmp/test/test-mibs/SNMPv2-TC.mib
+++ b/lib/snmp/test/test-mibs/SNMPv2-TC.mib
@@ -629,7 +629,7 @@ value | | see 1| ->C| ->D
time should be long enough to allow for human response time
(including `think time') between the creation of the
conceptual row and the setting of the status to `active'.
- In the absense of such information in the DESCRIPTION
+ In the absence of such information in the DESCRIPTION
clause, it is suggested that this period be approximately 5
minutes in length. This removal action applies not only to
newly-created rows, but also to previously active rows which
diff --git a/lib/snmp/test/test-mibs/SNMPv2-test.mib b/lib/snmp/test/test-mibs/SNMPv2-test.mib
index b02be09138..f435660b2c 100644
--- a/lib/snmp/test/test-mibs/SNMPv2-test.mib
+++ b/lib/snmp/test/test-mibs/SNMPv2-test.mib
@@ -163,7 +163,7 @@ sysQ OBJECT-TYPE
MAX-ACCESS read-write
STATUS current
DESCRIPTION
- "The auxiliar the SYNTAX."
+ "The auxiliary the SYNTAX."
DEFVAL { { a, b } }
::= { system 11 }
@@ -231,7 +231,7 @@ sysORUpTime OBJECT-TYPE
STATUS current
DESCRIPTION
"The value of sysUpTime at the time this conceptual row was
- last instanciated."
+ last instantiated."
::= { sysOREntry 4 }
diff --git a/lib/snmp/test/test_config/Makefile b/lib/snmp/test/test_config/Makefile
index 1e53f51b83..af765cfa5a 100644
--- a/lib/snmp/test/test_config/Makefile
+++ b/lib/snmp/test/test_config/Makefile
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2016. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -117,7 +117,7 @@ endif
# Targets
# ----------------------------------------------------
-tests debug opt: $(TARGETS)
+tests $(TYPES): $(TARGETS)
clean:
rm -f $(CONFIG_FILES)
diff --git a/lib/ssh/doc/src/SSH_app.xml b/lib/ssh/doc/src/SSH_app.xml
index 8f3b5fc80b..4d12669c1e 100644
--- a/lib/ssh/doc/src/SSH_app.xml
+++ b/lib/ssh/doc/src/SSH_app.xml
@@ -282,7 +282,7 @@
</section>
<section>
<title>Unicode support</title>
- <p>Unicode filenames are supported if the emulator and the underlaying OS support it. See section DESCRIPTION in the
+ <p>Unicode filenames are supported if the emulator and the underlying OS support it. See section DESCRIPTION in the
<seeerl marker="kernel:file">file</seeerl> manual page in Kernel for information about this subject.
</p>
<p>The shell and the cli both support unicode.
diff --git a/lib/ssh/doc/src/configurations.xml b/lib/ssh/doc/src/configurations.xml
index cd55e87027..d4172d0ad8 100644
--- a/lib/ssh/doc/src/configurations.xml
+++ b/lib/ssh/doc/src/configurations.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2020</year>
+ <year>2020</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -250,7 +250,7 @@ ok
]).
{ok,&gt;0.118.0>}
</code>
- <p>We check which algoritms are negotiated by the client and the server, and note that
+ <p>We check which algorithms are negotiated by the client and the server, and note that
the (only) <c>kex</c> algorithm <c>'curve25519-sha256@libssh.org'</c> was selected:
</p>
<code>
diff --git a/lib/ssh/doc/src/configure_algos.xml b/lib/ssh/doc/src/configure_algos.xml
index acc6269da5..df4ed145a6 100644
--- a/lib/ssh/doc/src/configure_algos.xml
+++ b/lib/ssh/doc/src/configure_algos.xml
@@ -75,15 +75,15 @@
<tag><c>public_key</c></tag>
<item>
<p>Server host key</p>
- <p>The asymetric encryption algorithm used in the server's private-public host key pair.
+ <p>The asymmetric encryption algorithm used in the server's private-public host key pair.
Examples include the well-known RSA <c>'ssh-rsa'</c> and elliptic curve <c>'ecdsa-sha2-nistp521'</c>.
</p>
</item>
<tag><c>cipher</c></tag>
<item>
- <p>Symetric cipher algorithm used for the payload encryption. This algorithm will use the key calculated
- in the kex phase (together with other info) to genereate the actual key used. Examples are
+ <p>Symmetric cipher algorithm used for the payload encryption. This algorithm will use the key calculated
+ in the kex phase (together with other info) to generate the actual key used. Examples are
tripple-DES <c>'3des-cbc'</c> and one of many AES variants <c>'aes192-ctr'</c>.
</p>
<p>This list is actually two - one for each direction server-to-client and client-to-server. Therefore it
@@ -110,13 +110,13 @@
<section>
<title>The SSH app's mechanism</title>
- <p>The set of algorithms that the SSH app uses by default depends on the algoritms supported by the:</p>
+ <p>The set of algorithms that the SSH app uses by default depends on the algorithms supported by the:</p>
<list>
<item><p><seeerl marker="crypto:crypto">crypto</seeerl> app,</p>
</item>
- <item><p>The cryptolib OTP is linked with, usally the one the OS uses, probably OpenSSL,</p>
+ <item><p>The cryptolib OTP is linked with, usually the one the OS uses, probably OpenSSL,</p>
</item>
- <item><p>and finaly what the SSH app implements</p>
+ <item><p>and finally what the SSH app implements</p>
</item>
</list>
<p>Due to this, it impossible to list in documentation what algorithms that are available in a certain installation.</p>
@@ -170,7 +170,7 @@
<p>To forsee the effect of an option there is an experimental function <c>ssh:chk_algos_opts(Opts)</c>.
It mangles the options <c>preferred_algorithms</c>
- and <c>modify_algorithms</c> in the same way as <c>ssh:dameon</c>, <c>ssh:connect</c> and their friends does.</p>
+ and <c>modify_algorithms</c> in the same way as <c>ssh:daemon</c>, <c>ssh:connect</c> and their friends does.</p>
<section>
<title>Example 1</title>
@@ -322,7 +322,7 @@
<section>
<title>Example 5</title>
<p>As an example let's add the Diffie-Hellman Group1 first in the kex list. It is supported according to
- <seeapp marker="SSH_app#supported_algos">Supported algoritms</seeapp>.</p>
+ <seeapp marker="SSH_app#supported_algos">Supported algorithms</seeapp>.</p>
<code type="erl">
5> ssh:chk_algos_opts(
[{modify_algorithms,
diff --git a/lib/ssh/doc/src/hardening.xml b/lib/ssh/doc/src/hardening.xml
index c1d3f7669c..5bfe903472 100644
--- a/lib/ssh/doc/src/hardening.xml
+++ b/lib/ssh/doc/src/hardening.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2017</year>
- <year>2020</year>
+ <year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -64,7 +64,7 @@
<item>
If the client fails to send the first ssh message after a tcp connection setup
within this time (in milliseconds), the connection is closed.
- The default value is 30 seconds. This is actualy a generous time, so it can lowered
+ The default value is 30 seconds. This is actually a generous time, so it can lowered
to make the daemon less prone to DoS attacks.
</item>
<tag><seetype marker="ssh#negotiation_timeout_daemon_option">negotiation_timeout</seetype></tag>
@@ -251,7 +251,7 @@ end.
<code>
ssh:daemon(1234, [{id_string,"hi there"}, ... ]).
</code>
- <p>and the deamon will present itself as:</p>
+ <p>and the daemon will present itself as:</p>
<pre>SSH-2.0-hi there</pre>
<p>It is possible to replace the string with one randomly generated for each connection attempt.
See the reference manual for <seetype marker="ssh#id_string_common_option">id_string</seetype>.
diff --git a/lib/ssh/doc/src/notes.xml b/lib/ssh/doc/src/notes.xml
index 54904de950..4e644e6c0e 100644
--- a/lib/ssh/doc/src/notes.xml
+++ b/lib/ssh/doc/src/notes.xml
@@ -1125,7 +1125,7 @@
input/output, the I/O was erroneously handled by the
*server's* group leader, so the I/O turned up in the the
server's Erlang shell (if any). The user at the client
- side did therefor not see that I/O.</p>
+ side did therefore not see that I/O.</p>
<p>
This is corrected now, so the client - for example the
ssh OS shell command - handles the I/O. The user could
@@ -1670,7 +1670,7 @@
</item>
<item>
<p>
- The type specifications in SSH are completly reworked and
+ The type specifications in SSH are completely reworked and
the following types are renamed:</p>
<p>
<c>ssh:ssh_connection_ref()</c> is changed to
@@ -1935,7 +1935,7 @@
</item>
<item>
<p>
- Fix rare spurios shutdowns of ssh servers when receiveing
+ Fix rare spurious shutdowns of ssh servers when receiving
<c>{'EXIT',_,normal}</c> messages.</p>
<p>
Own Id: OTP-15018</p>
@@ -2386,7 +2386,7 @@
<list>
<item>
<p>
- Fix rare spurios shutdowns of ssh servers when receiveing
+ Fix rare spurious shutdowns of ssh servers when receiving
<c>{'EXIT',_,normal}</c> messages.</p>
<p>
Own Id: OTP-15018</p>
@@ -2618,7 +2618,7 @@
<item>
<p>
If a client illegaly sends an info-line and then
- immediatly closes the TCP-connection, a badmatch
+ immediately closes the TCP-connection, a badmatch
exception was raised.</p>
<p>
Own Id: OTP-13966</p>
@@ -2831,7 +2831,7 @@
<list>
<item>
<p>
- Fix rare spurios shutdowns of ssh servers when receiveing
+ Fix rare spurious shutdowns of ssh servers when receiving
<c>{'EXIT',_,normal}</c> messages.</p>
<p>
Own Id: OTP-15018</p>
@@ -3453,7 +3453,7 @@
<p>
The possible values are: <c>{id_string,string()}</c> and
<c>{id_string,random}</c>. The latter will make ssh
- generate a random nonsence id-string for each new
+ generate a random nonsense id-string for each new
connection.</p>
<p>
Own Id: OTP-12659</p>
@@ -3579,7 +3579,7 @@
<p>
The possible values are: <c>{id_string,string()}</c> and
<c>{id_string,random}</c>. The latter will make ssh
- generate a random nonsence id-string for each new
+ generate a random nonsense id-string for each new
connection.</p>
<p>
Own Id: OTP-12659</p>
@@ -4242,7 +4242,7 @@
<list>
<item>
<p>
- ssh:daemon will get feeded with an argument even if it is
+ ssh:daemon will get fed with an argument even if it is
not a valid expression.</p>
<p>
Own Id: OTP-10975</p>
@@ -4590,7 +4590,7 @@
<list>
<item>
<p>
- All keys in authorized_keys are considerd, wrongly only
+ All keys in authorized_keys are considered, wrongly only
the first one was before.</p>
<p>
Own Id: OTP-7235</p>
@@ -4964,7 +4964,7 @@
<list>
<item>
<p>
- Now clear all processes when a connnection is terminated.</p>
+ Now clear all processes when a connection is terminated.</p>
<p>
Own Id: OTP-8121 Aux Id:</p>
</item>
@@ -5062,13 +5062,13 @@
<list>
<item>
<p>
- ssh_sftp:start_channel/3 did not handle timout correctly.</p>
+ ssh_sftp:start_channel/3 did not handle timeout correctly.</p>
<p>
Own Id: OTP-8159 Aux Id: seq11386</p>
</item>
<item>
<p>
- If a progress message was not recieved after invoking ssh:connect/3
+ If a progress message was not received after invoking ssh:connect/3
the call could hang for ever. A timeout option has also been added.</p>
<p>
Own Id: OTP-8160 Aux Id: seq11386</p>
diff --git a/lib/ssh/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml
index 44188ea34c..b6c84f40b4 100644
--- a/lib/ssh/doc/src/ssh.xml
+++ b/lib/ssh/doc/src/ssh.xml
@@ -64,7 +64,7 @@
<p>To just run a shell on a remote machine, there are functions that bundles the needed
three steps needed into one:
<seemfa marker="#shell/1">shell/1,2,3</seemfa>.
- Similarily, to just open an sftp (file transfer) connection to a remote machine, the simplest way is to use
+ Similarly, to just open an sftp (file transfer) connection to a remote machine, the simplest way is to use
<seemfa marker="ssh_sftp#start_channel/1">ssh_sftp:start_channel/1,2,3</seemfa>.
</p>
<p>To write your own client channel handler, use the behaviour
@@ -102,7 +102,7 @@
<seetype marker="ssh_file#user_dir_common_option"><c>user_dir</c></seetype> and
<seetype marker="ssh_file#system_dir_daemon_option"><c>system_dir</c></seetype>.
</p>
- <p>A completly different storage could be interfaced by writing call-back modules
+ <p>A completely different storage could be interfaced by writing call-back modules
using the behaviours
<seeerl marker="ssh_client_key_api">ssh_client_key_api</seeerl> and/or
<seeerl marker="ssh_server_key_api">ssh_server_key_api</seeerl>.
@@ -440,8 +440,8 @@
</p>
<p>In case of the <c>{direct, exec_fun()}</c> variant or no exec-option at all,
all reads from <c>standard_input</c> will be from the received data-events of type 0.
- Those are sent by the client. Similarily all writes to <c>standard_output</c>
- will be sent as data-events to the client. An OS shell client like the command 'ssh' will usally use
+ Those are sent by the client. Similarly all writes to <c>standard_output</c>
+ will be sent as data-events to the client. An OS shell client like the command 'ssh' will usually use
stdin and stdout for the user interface.
</p>
<p>The option cooperates with the daemon-option <seetype marker="#shell_daemon_option"><c>shell</c></seetype>
@@ -605,7 +605,7 @@
<seetype marker="#pwdfun_4"><c>pwdfun_4()</c></seetype>
</tag>
<item>
- <p>Provides a function for password validation. This could used for calling an external system or handeling
+ <p>Provides a function for password validation. This could used for calling an external system or handling
passwords stored as hash values.
</p>
<p>This fun can also be used to make delays in authentication tries for example by calling
@@ -1051,7 +1051,7 @@
<desc>
<p>Modifies the list of algorithms to use in the algorithm negotiation. The modifications are
applied after the option <c>preferred_algorithms</c> (if existing) is applied.</p>
- <p>The algoritm for modifications works like this:</p>
+ <p>The algorithm for modifications works like this:</p>
<list>
<item>
<p>Input is the <c>modify_algs_list()</c> and a set of algorithms <c>A</c>
@@ -1318,7 +1318,7 @@
<p>are allowed. The excluded options are reserved by the SSH application.
</p>
<warning>
- <p>This is an extremly dangerous function. You use it on your own risk.</p>
+ <p>This is an extremely dangerous function. You use it on your own risk.</p>
<p>Some options are OS and OS version dependent.
Do not use it unless you know what effect your option values will have
on an TCP stream.</p>
@@ -1340,7 +1340,7 @@
</desc>
</func>
-<!-- DEAMON/1,2,3 -->
+<!-- DAEMON/1,2,3 -->
<func>
<name since="">daemon(Port | TcpSocket) -> Result</name>
<name since="">daemon(Port | TcpSocket, Options) -> Result</name>
@@ -1374,7 +1374,7 @@
An 'ip'-option will be discarded if present.</item>
<item>if <c>HostAddress</c> is the atom <c>loopback</c>, the listening address
- is <c>loopback</c> and an loopback address will be choosen by the underlying layers.
+ is <c>loopback</c> and an loopback address will be chosen by the underlying layers.
An 'ip'-option will be discarded if present.</item>
<item>if <c>HostAddress</c> is the atom <c>any</c> and no 'ip'-option is present, the listening address is
@@ -1433,7 +1433,7 @@
interactive shell on that remote host.
</p>
<p>As an alternative, an already open TCP socket could be passed to the function in <c>TcpSocket</c>.
- The SSH initiation and negotiation will be initiated on that one and finaly a shell will be started
+ The SSH initiation and negotiation will be initiated on that one and finally a shell will be started
on the host at the other end of the TCP socket.
</p>
<p>For a description of the options, see <seetype marker="#client_options">Client Options</seetype>.</p>
diff --git a/lib/ssh/doc/src/ssh_agent.xml b/lib/ssh/doc/src/ssh_agent.xml
index a6ff511f2f..ceada72371 100644
--- a/lib/ssh/doc/src/ssh_agent.xml
+++ b/lib/ssh/doc/src/ssh_agent.xml
@@ -52,7 +52,7 @@
</code>
<p>
The agent communication is established through a UNIX domain socket. By default, the socket path
- will be fetched from the <c>SSH_AUTH_SOCK</c> enviroment variable, which is the default socket path in the agent
+ will be fetched from the <c>SSH_AUTH_SOCK</c> environment variable, which is the default socket path in the agent
implementation of
<url href="http://www.openssh.com">OpenSSH</url>.
</p>
diff --git a/lib/ssh/doc/src/ssh_client_key_api.xml b/lib/ssh/doc/src/ssh_client_key_api.xml
index a81d0d3274..cb20724496 100644
--- a/lib/ssh/doc/src/ssh_client_key_api.xml
+++ b/lib/ssh/doc/src/ssh_client_key_api.xml
@@ -69,7 +69,7 @@
<v>ConnectOptions = <seetype marker="#client_key_cb_options">client_key_cb_options()</seetype></v>
</type>
<desc>
- <p>This function is retired in favour for <c>Module:add_host_key/4</c> which is the prefered API function.
+ <p>This function is retired in favour for <c>Module:add_host_key/4</c> which is the preferred API function.
The calling SSH application will still try the <c>add_host_key/3</c> if the call to <c>add_host_key/4</c> failed.
</p>
<p>Adds a host key to the set of trusted host keys.</p>
@@ -96,10 +96,10 @@
</type>
<desc>
<p>Adds a host key to the set of trusted host keys.</p>
- <p>This function is prefered to the old <c>Module:add_host_key/3</c> since it also uses
+ <p>This function is preferred to the old <c>Module:add_host_key/3</c> since it also uses
the peer host port number and may return an error message.</p>
<p>The OTP/SSH application first calls this function in the callback module, and then
- the old <c>Module:add_host_key/3</c> for compatibilty.</p>
+ the old <c>Module:add_host_key/3</c> for compatibility.</p>
</desc>
</func>
@@ -121,7 +121,7 @@
<v>Result = boolean()</v>
</type>
<desc>
- <p>This function is retired in favour for <c>Module:is_host_key/5</c> which is the prefered API function.
+ <p>This function is retired in favour for <c>Module:is_host_key/5</c> which is the preferred API function.
The calling SSH application will still try the <c>is_host_key/4</c> if the call to <c>is_host_key/5</c> failed.
</p>
<p>Checks if a host key is trusted.</p>
@@ -155,10 +155,10 @@
</type>
<desc>
<p>Checks if a host key is trusted.</p>
- <p>This function is prefered to the old <c>Module:is_host_key/4</c> since it also uses
+ <p>This function is preferred to the old <c>Module:is_host_key/4</c> since it also uses
the peer host port number and may return an error message.</p>
<p>The OTP/SSH application first calls this function in the callback module, and then
- the old <c>Module:is_host_key/4</c> for compatibilty.</p>
+ the old <c>Module:is_host_key/4</c> for compatibility.</p>
</desc>
</func>
diff --git a/lib/ssh/doc/src/ssh_connection.xml b/lib/ssh/doc/src/ssh_connection.xml
index cd4b9c0f85..899bd0c2b7 100644
--- a/lib/ssh/doc/src/ssh_connection.xml
+++ b/lib/ssh/doc/src/ssh_connection.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2008</year>
- <year>2020</year>
+ <year>2022</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -85,7 +85,7 @@
<name name="req_status"/>
<desc>
<p>The status of a request.
- Coresponds to the <c>SSH_MSG_CHANNEL_SUCCESS</c> and <c>SSH_MSG_CHANNEL_FAILURE</c> values in
+ Corresponds to the <c>SSH_MSG_CHANNEL_SUCCESS</c> and <c>SSH_MSG_CHANNEL_FAILURE</c> values in
<url href="https://tools.ietf.org/html/rfc4254#section-5.4">RFC 4254, Section 5.4</url>.
</p>
</desc>
diff --git a/lib/ssh/doc/src/ssh_file.xml b/lib/ssh/doc/src/ssh_file.xml
index e97bb5b37f..eda93b8961 100644
--- a/lib/ssh/doc/src/ssh_file.xml
+++ b/lib/ssh/doc/src/ssh_file.xml
@@ -66,7 +66,7 @@
<title>Daemons</title>
<p>Daemons uses all files stored in the <seeerl marker="#SYSDIR">SYSDIR</seeerl> directory.
</p>
- <p>Optionaly, in case of <c>publickey</c> authorization, one or more of the remote user's public keys
+ <p>Optionally, in case of <c>publickey</c> authorization, one or more of the remote user's public keys
in the <seeerl marker="#USERDIR">USERDIR</seeerl> directory are used.
See the files
<seeerl marker="#FILE-authorized_keys"><c>USERDIR/authorized_keys</c></seeerl> and
@@ -223,7 +223,7 @@ key :: % encoded key from eg ssh_host_*.pub
<datatype>
<name name="key"/>
<desc>
- <p>The key representation.</p>
+ <p>The key representation</p>
</desc>
</datatype>
@@ -232,8 +232,6 @@ key :: % encoded key from eg ssh_host_*.pub
<name name="openssh_key_v1_attributes"/>
<desc>
<p>Types for the experimental implementaition of the <c>openssh_key_v1</c> format.
- The <c>#ECPoint{}</c> and <c>ECPrivateKey{}</c> are not used for Edwards curves
- (ed25519 and ed448), but will be in next major release.
</p>
</desc>
</datatype>
@@ -285,7 +283,7 @@ key :: % encoded key from eg ssh_host_*.pub
<item><seeerl marker="#FILE-authorized_keys"><c>USERDIR/authorized_keys</c></seeerl></item>
<item><seeerl marker="#FILE-authorized_keys2"><c>USERDIR/authorized_keys2</c></seeerl></item>
</list>
- <p>This functions discards all options in the begining of the lines of thoose files when reading them.
+ <p>This functions discards all options in the beginning of the lines of thoose files when reading them.
</p>
</desc>
</func>
@@ -375,7 +373,7 @@ key :: % encoded key from eg ssh_host_*.pub
an RFC4716 public key or an OpenSSH public key.</p>
<note>
<p>The following key types have been renamed from the deprecated
- <seemfa marker="public_key:public_key#ssh_decode/2">public_key:ssh_decode/2</seemfa>:</p>
+ <c>public_key:ssh_decode/2</c>:</p>
<list>
<item>rfc4716_public_key -> rfc4716_key</item>
<item>openssh_public_key -> openssh_key</item>
@@ -391,8 +389,7 @@ key :: % encoded key from eg ssh_host_*.pub
<desc>
<p>Encodes a list of SSH file entries (public keys and attributes) to a binary.</p>
<note>
- <p>The following key types have been renamed from the deprecated
- <seemfa marker="public_key:public_key#ssh_encode/2">public_key:ssh_encode/2</seemfa>:</p>
+ <p>The following key types have been renamed from the removed <c>public_key:ssh_encode/2</c>:</p>
<list>
<item>rfc4716_public_key -> rfc4716_key</item>
<item>openssh_public_key -> openssh_key</item>
diff --git a/lib/ssh/doc/src/ssh_sftp.xml b/lib/ssh/doc/src/ssh_sftp.xml
index 6e30c1e20d..c035f74b3a 100644
--- a/lib/ssh/doc/src/ssh_sftp.xml
+++ b/lib/ssh/doc/src/ssh_sftp.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2005</year><year>2020</year>
+ <year>2005</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -96,7 +96,7 @@
<seemfa marker="crypto:crypto#crypto_init/4">crypto:crypto_init/4</seemfa>
or similar. The <c>crypto_state()</c> is the state such a function may return.
</p>
- <p>If the selected cipher needs to have the input data partioned into
+ <p>If the selected cipher needs to have the input data partitioned into
blocks of a certain size, the <c>init_fun()</c> should return the second
form of return value with the <c>chunk_size()</c> set to the block size.
If the <c>chunk_size()</c> is <c>undefined</c>, the size of the <c>PlainBin</c>s varies,
diff --git a/lib/ssh/doc/src/terminology.xml b/lib/ssh/doc/src/terminology.xml
index 9766276192..78a24f1618 100644
--- a/lib/ssh/doc/src/terminology.xml
+++ b/lib/ssh/doc/src/terminology.xml
@@ -44,7 +44,7 @@
cause confusion.
</p>
<p>The term is used differently in <url href="http://www.openssh.com">OpenSSH</url> and SSH in Erlang/OTP.
- The reason is the different environments and use cases that are not immediatly obvious.
+ The reason is the different environments and use cases that are not immediately obvious.
</p>
<p>This chapter aims at explaining the differences and giving a rationale for why Erlang/OTP handles "user" as
it does.
@@ -95,8 +95,8 @@
</p>
</section>
<section>
- <title>The SSH server on UNIX/Linux/etc after a succesful authentication</title>
- <p>After a succesful incoming authentication, a new process runs as the just authenticated user.</p>
+ <title>The SSH server on UNIX/Linux/etc after a successful authentication</title>
+ <p>After a successful incoming authentication, a new process runs as the just authenticated user.</p>
<p>Next step is to start a service according to the ssh request. In case of a request of a shell,
a new one is started which handles the OS-commands that arrives from the client (that's "you").
</p>
@@ -166,7 +166,7 @@
</list>
</section>
<section>
- <title>The Erlang/OTP SSH server after a succesful authentication</title>
+ <title>The Erlang/OTP SSH server after a successful authentication</title>
<p>After a successful authentication an <i>Erlang process</i> is handling the service request from the remote
ssh client. The rights of that process are those of the user of the OS process running the Erlang emulator.
</p>
diff --git a/lib/ssh/doc/src/using_ssh.xml b/lib/ssh/doc/src/using_ssh.xml
index a127b66607..648b59ab23 100644
--- a/lib/ssh/doc/src/using_ssh.xml
+++ b/lib/ssh/doc/src/using_ssh.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2012</year>
- <year>2020</year>
+ <year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -201,7 +201,7 @@ ok
<p>To close the connection, call the function <seemfa marker="ssh#close/1"><c>ssh:close(ConnectionRef)</c></seemfa>.
As an alternative, set the option
<seetype marker="ssh#max_idle_time_common_option"><c>{idle_time, 1}</c></seetype>
- when opening the connection. This will cause the connection to be closed automaticaly when there are
+ when opening the connection. This will cause the connection to be closed automatically when there are
no channels open for the specified time period, in this case 1 ms.
</p>
</section>
diff --git a/lib/ssh/examples/Makefile b/lib/ssh/examples/Makefile
index d7d47eb3ae..1b05d65cb5 100644
--- a/lib/ssh/examples/Makefile
+++ b/lib/ssh/examples/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2015. All Rights Reserved.
+# Copyright Ericsson AB 2005-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -56,7 +56,7 @@ EBIN = .
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
debug: ERLC_FLAGS += -Ddebug
diff --git a/lib/ssh/src/Makefile b/lib/ssh/src/Makefile
index cc3cfe9e96..2fcb164301 100644
--- a/lib/ssh/src/Makefile
+++ b/lib/ssh/src/Makefile
@@ -159,7 +159,7 @@ $(DEP_FILE): $(ERL_FILES)
| sed 's@^sshd_@$$(EBIN)/sshd_@' \
> $(DEP_FILE)
-debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(DEP_FILE)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(DEP_FILE)
clean:
rm -f $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(BEHAVIOUR_TARGET_FILES)
diff --git a/lib/ssh/src/ssh.app.src b/lib/ssh/src/ssh.app.src
index c7ad417bef..2cb8d80488 100644
--- a/lib/ssh/src/ssh.app.src
+++ b/lib/ssh/src/ssh.app.src
@@ -59,8 +59,8 @@
{mod, {ssh_app, []}},
{runtime_dependencies, [
"crypto-5.0",
- "erts-9.0",
- "kernel-5.3",
+ "erts-11.0",
+ "kernel-6.0",
"public_key-1.6.1",
"stdlib-3.15",
"runtime_tools-1.15.1"
diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl
index f655f0db45..320a1992bc 100644
--- a/lib/ssh/src/ssh.erl
+++ b/lib/ssh/src/ssh.erl
@@ -108,7 +108,7 @@ start(Type) ->
{ok, _} ->
%% Clear cached default_algorithms (if exists) ...
ssh_transport:clear_default_algorithms_env(),
- %% ... and rebuld them taking configure options in account
+ %% ... and rebuild them taking configure options in account
ssh_transport:default_algorithms(),
ok;
Other ->
diff --git a/lib/ssh/src/ssh_auth.hrl b/lib/ssh/src/ssh_auth.hrl
index 56314ca6d9..842beb5186 100644
--- a/lib/ssh/src/ssh_auth.hrl
+++ b/lib/ssh/src/ssh_auth.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -59,7 +59,7 @@
-record(ssh_msg_userauth_passwd_changereq,
{
prompt, %% string
- languge %% string
+ language %% string
}).
-record(ssh_msg_userauth_pk_ok,
diff --git a/lib/ssh/src/ssh_client_key_api.erl b/lib/ssh/src/ssh_client_key_api.erl
index 367d78bf22..1cc153904f 100644
--- a/lib/ssh/src/ssh_client_key_api.erl
+++ b/lib/ssh/src/ssh_client_key_api.erl
@@ -82,7 +82,7 @@
%%% in the argument Host with the port Port.
%%%
%%% Due to compatibility reasons, the OTP/SSH application first
-%%% trys add_host_key/4 and then the old add_host_key/3
+%%% tries add_host_key/4 and then the old add_host_key/3
-callback add_host_key(Host :: inet:ip_address() | inet:hostname()
| [inet:ip_address() | inet:hostname()],
diff --git a/lib/ssh/src/ssh_connection.erl b/lib/ssh/src/ssh_connection.erl
index f504cd5813..4d7ec91a49 100644
--- a/lib/ssh/src/ssh_connection.erl
+++ b/lib/ssh/src/ssh_connection.erl
@@ -177,7 +177,7 @@
Command :: string()
} .
-%%% This function is soley to convince all
+%%% This function is solely to convince all
%%% checks that the type event() exists...
-export([dummy/1]).
-spec dummy(event()) -> false.
@@ -404,7 +404,7 @@ ptty_alloc(ConnectionHandler, Channel, Options0, TimeOut) ->
).
%%--------------------------------------------------------------------
-%% Not yet officialy supported! The following functions are part of the
+%% Not yet officially supported! The following functions are part of the
%% initial contributed ssh application. They are untested. Do we want them?
%% Should they be documented and tested?
%%--------------------------------------------------------------------
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl
index b2545c4db4..d64d308f5d 100644
--- a/lib/ssh/src/ssh_connection_handler.erl
+++ b/lib/ssh/src/ssh_connection_handler.erl
@@ -425,7 +425,7 @@ init([Role, Socket, Opts]) when Role==client ; Role==server ->
end.
%%%----------------------------------------------------------------
-%%% Connection start and initalization helpers
+%%% Connection start and initialization helpers
init_connection_record(Role, Socket, Opts) ->
{WinSz, PktSz} = init_inet_buffers_window(Socket),
@@ -625,7 +625,7 @@ handle_event(internal, {version_exchange,Version}, {hello,Role}, D0) ->
{NumVsn, StrVsn} = ssh_transport:handle_hello_version(Version),
case handle_version(NumVsn, StrVsn, D0#data.ssh_params) of
{ok, Ssh1} ->
- %% Since the hello part is finnished correctly, we set the
+ %% Since the hello part is finished correctly, we set the
%% socket to the packet handling mode (including recbuf size):
inet:setopts(D0#data.socket, [{packet,0},
{mode,binary},
@@ -651,7 +651,7 @@ handle_event(state_timeout, no_hello_received, {hello,_Role}=StateName, D0 = #da
Time = ?GET_OPT(hello_timeout, Ssh0#ssh.opts),
{Shutdown, D} =
?send_disconnect(?SSH_DISCONNECT_PROTOCOL_ERROR,
- lists:concat(["No HELLO recieved within ",ssh_lib:format_time_ms(Time)]),
+ lists:concat(["No HELLO received within ",ssh_lib:format_time_ms(Time)]),
StateName, D0),
{stop, Shutdown, D};
@@ -939,7 +939,7 @@ handle_event({call,From}, {request, ChannelPid, ChannelId, Type, Data, Timeout},
{error,Error} ->
{keep_state, D0, {reply,From,{error,Error}}};
D ->
- %% Note reply to channel will happen later when reply is recived from peer on the socket
+ %% Note reply to channel will happen later when reply is received from peer on the socket
start_channel_request_timer(ChannelId, From, Timeout),
{keep_state, D, cond_set_idle_timer(D)}
end;
@@ -950,7 +950,7 @@ handle_event({call,From}, {request, ChannelId, Type, Data, Timeout}, StateName,
{error,Error} ->
{keep_state, D0, {reply,From,{error,Error}}};
D ->
- %% Note reply to channel will happen later when reply is recived from peer on the socket
+ %% Note reply to channel will happen later when reply is received from peer on the socket
start_channel_request_timer(ChannelId, From, Timeout),
{keep_state, D, cond_set_idle_timer(D)}
end;
@@ -1242,7 +1242,7 @@ handle_event(info, {'EXIT', _Sup, Reason}, StateName, _D) ->
{stop, {shutdown, Reason}};
Reason == normal ->
- %% An exit normal should not cause a server to crash. This has happend...
+ %% An exit normal should not cause a server to crash. This has happened...
keep_state_and_data;
true ->
@@ -1583,7 +1583,7 @@ handle_ssh_msg_ext_info(#ssh_msg_ext_info{data=Data}, D0) ->
ext_info({"server-sig-algs",SigAlgsStr},
D0 = #data{ssh_params=#ssh{role=client,
userauth_pubkeys=ClientSigAlgs}=Ssh0}) ->
- %% ClientSigAlgs are the pub_key algortithms that:
+ %% ClientSigAlgs are the pub_key algorithms that:
%% 1) is usable, that is, the user has such a public key and
%% 2) is either the default list or set by the caller
%% with the client option 'pref_public_key_algs'
diff --git a/lib/ssh/src/ssh_daemon_channel.erl b/lib/ssh/src/ssh_daemon_channel.erl
index 30c4773a7a..899c99d610 100644
--- a/lib/ssh/src/ssh_daemon_channel.erl
+++ b/lib/ssh/src/ssh_daemon_channel.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@
-module(ssh_daemon_channel).
-%% API to server side channel that can be pluged into the erlang ssh daemeon
+%% API to server side channel that can be plugged into the erlang ssh daemeon
-callback init(Args :: term()) ->
{ok, State :: term()} | {ok, State :: term(), timeout() | hibernate} |
{stop, Reason :: term()} | ignore.
diff --git a/lib/ssh/src/ssh_dbg.erl b/lib/ssh/src/ssh_dbg.erl
index 54a88a479f..afeaa5b040 100644
--- a/lib/ssh/src/ssh_dbg.erl
+++ b/lib/ssh/src/ssh_dbg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -156,7 +156,7 @@ go_on() ->
on(IsOn).
%%%----------------------------------------------------------------
-shrink_bin(B) when is_binary(B), size(B)>256 -> {'*** SHRINKED BIN',
+shrink_bin(B) when is_binary(B), size(B)>256 -> {'*** SHRUNK BIN',
size(B),
element(1,split_binary(B,64)),
'...',
@@ -167,13 +167,13 @@ shrink_bin(T) when is_tuple(T) -> list_to_tuple(shrink_bin(tuple_to_list(T)));
shrink_bin(X) -> X.
%%%----------------------------------------------------------------
-%% Replace any occurence of {Name,...}, with "#Name{}"
+%% Replace any occurrence of {Name,...}, with "#Name{}"
reduce_state(T, RecordExample) ->
Name = element(1, RecordExample),
Arity = size(RecordExample),
reduce_state(T, Name, Arity).
-%% Replace any occurence of {Name,...}, with "#Name{}"
+%% Replace any occurrence of {Name,...}, with "#Name{}"
reduce_state(T, Name, Arity) when element(1,T) == Name,
size(T) == Arity ->
lists:concat(['#',Name,'{}']);
@@ -400,7 +400,7 @@ try_all_types_in_all_modules(TypesOn, Arg, WriteFun, Acc0) ->
catch
_:_ ->
%% and finally, signal for special formatting
- %% if noone else formats it
+ %% if no one else formats it
Acc
end
end
diff --git a/lib/ssh/src/ssh_file.erl b/lib/ssh/src/ssh_file.erl
index 5a1b4def87..9644aef646 100644
--- a/lib/ssh/src/ssh_file.erl
+++ b/lib/ssh/src/ssh_file.erl
@@ -66,10 +66,7 @@
-type optimize_key_lookup() :: {optimize, time|space} .
-type key() :: public_key:public_key() | public_key:private_key() .
--type experimental_openssh_key_v1() :: [{key()
- | {ed_pri, ed25519|ed448, Pub::binary(), Priv::binary()}
- | {ed_pub, ed25519|ed448, Key::binary()},
- openssh_key_v1_attributes()}].
+-type experimental_openssh_key_v1() :: [{key(), openssh_key_v1_attributes()}].
-type openssh_key_v1_attributes() :: [{atom(),term()}].
%%%================================================================
@@ -604,7 +601,7 @@ find_host_key(_, _, _, []) ->
revoked_key(Hosts, KeyType, EncKey, [<<"@revoked ",RestLine/binary>> | Lines]) ->
case binary:split(RestLine, <<" ">>, [global,trim_all]) of
[Patterns, KeyType, EncKey|_Comment] ->
- %% Very likeley to be a revoked key,
+ %% Very likely to be a revoked key,
%% but does any of the hosts match the pattern?
case host_match(Hosts, Patterns) of
true ->
@@ -1101,7 +1098,7 @@ check_padding(Bin, BlockSize) ->
end.
%%%----------------------------------------------------------------
-%% KeyPairs :: [ {Pub,Priv,Comment} | {ed_pri{_,_,_},Comment} ]
+%% KeyPairs :: [ {Pub,Priv,Comment} ]
openssh_key_v1_encode(KeyPairs) ->
CipherName = <<"none">>,
BlockSize = ?NON_CRYPT_BLOCKSIZE, % Cipher dependent
@@ -1127,8 +1124,9 @@ openssh_key_v1_encode(KeyPairs) ->
openssh_key_v1_encode_pub_keys(KeyPairs) ->
openssh_key_v1_encode_pub_keys(KeyPairs, []).
-openssh_key_v1_encode_pub_keys([{{ed_pri,Alg,PubKey,_},_C}|Ks], Acc) ->
- Bk = ssh_message:ssh2_pubkey_encode({ed_pub,Alg,PubKey}),
+openssh_key_v1_encode_pub_keys([{Priv = #'ECPrivateKey'{}, _Cmnt} | Ks], Acc) ->
+ Pub = ssh_transport:extract_public_key(Priv),
+ Bk = ssh_message:ssh2_pubkey_encode(Pub),
openssh_key_v1_encode_pub_keys(Ks, [<<?STRING(Bk)>>|Acc]);
openssh_key_v1_encode_pub_keys([{K,_,_C}|Ks], Acc) ->
Bk = ssh_message:ssh2_pubkey_encode(K),
@@ -1136,11 +1134,12 @@ openssh_key_v1_encode_pub_keys([{K,_,_C}|Ks], Acc) ->
openssh_key_v1_encode_pub_keys([], Acc) ->
list_to_binary(lists:reverse(Acc)).
+
%%%----
openssh_key_v1_encode_priv_keys_cmnts(KeyPairs) ->
openssh_key_v1_encode_priv_keys_cmnts(KeyPairs, []).
-openssh_key_v1_encode_priv_keys_cmnts([{K={ed_pri,_,_,_},C} | Ks], Acc) ->
+openssh_key_v1_encode_priv_keys_cmnts([{K = #'ECPrivateKey'{}, C} | Ks], Acc) ->
Bk = ssh_message:ssh2_privkey_encode(K),
openssh_key_v1_encode_priv_keys_cmnts(Ks, [<<Bk/binary,?STRING(C)>>|Acc]);
openssh_key_v1_encode_priv_keys_cmnts([{_,K,C}|Ks], Acc) ->
diff --git a/lib/ssh/src/ssh_fsm_userauth_client.erl b/lib/ssh/src/ssh_fsm_userauth_client.erl
index e24e0e2f9a..73c8446639 100644
--- a/lib/ssh/src/ssh_fsm_userauth_client.erl
+++ b/lib/ssh/src/ssh_fsm_userauth_client.erl
@@ -55,13 +55,13 @@ callback_mode() ->
%%% ######## {userauth, client} ####
-%%---- #ssh_msg_ext_info could follow after the key exchange, both the intial and the re-negotiation
+%%---- #ssh_msg_ext_info could follow after the key exchange, both the initial and the re-negotiation
handle_event(internal, #ssh_msg_ext_info{}=Msg, {userauth,client}, D0) ->
%% FIXME: need new state to receive this msg!
D = ssh_connection_handler:handle_ssh_msg_ext_info(Msg, D0),
{keep_state, D};
-%%---- recevied userauth success from the server
+%%---- received userauth success from the server
handle_event(internal, #ssh_msg_userauth_success{}, {userauth,client}, D0=#data{ssh_params = Ssh}) ->
ssh_auth:ssh_msg_userauth_result(success),
ssh_connection_handler:handshake(ssh_connected, D0),
@@ -80,7 +80,7 @@ handle_event(internal, #ssh_msg_userauth_failure{}, {userauth,client}=StateName,
handle_event(internal, #ssh_msg_userauth_failure{authentications = Methods}, StateName={userauth,client},
D0 = #data{ssh_params = Ssh0}) ->
- %% The prefered authentication method failed, try next method
+ %% The preferred authentication method failed, try next method
Ssh1 = case Ssh0#ssh.userauth_methods of
none ->
%% Server tells us which authentication methods that are allowed
diff --git a/lib/ssh/src/ssh_info.erl b/lib/ssh/src/ssh_info.erl
index b1b4d0ea56..aa7324b588 100644
--- a/lib/ssh/src/ssh_info.erl
+++ b/lib/ssh/src/ssh_info.erl
@@ -20,7 +20,7 @@
%%
%%----------------------------------------------------------------------
-%% Purpose: Print some info of a running ssh aplication.
+%% Purpose: Print some info of a running ssh application.
%%----------------------------------------------------------------------
-module(ssh_info).
diff --git a/lib/ssh/src/ssh_message.erl b/lib/ssh/src/ssh_message.erl
index 8ed662b3de..3c1ea65038 100644
--- a/lib/ssh/src/ssh_message.erl
+++ b/lib/ssh/src/ssh_message.erl
@@ -34,6 +34,8 @@
-export([ssh2_pubkey_decode/1,
ssh2_pubkey_encode/1,
ssh2_privkey_decode2/1,
+ oid2ssh_curvename/1,
+ ssh_curvename2oid/1,
%% experimental:
ssh2_privkey_encode/1
]).
@@ -172,7 +174,7 @@ encode(#ssh_msg_userauth_pk_ok{
<<?Ebyte(?SSH_MSG_USERAUTH_PK_OK), ?Estring(Alg), ?Ebinary(KeyBlob)>>;
encode(#ssh_msg_userauth_passwd_changereq{prompt = Prompt,
- languge = Lang
+ language = Lang
})->
<<?Ebyte(?SSH_MSG_USERAUTH_PASSWD_CHANGEREQ), ?Estring_utf8(Prompt), ?Estring(Lang)>>;
@@ -438,7 +440,7 @@ decode(<<?BYTE(?SSH_MSG_USERAUTH_INFO_REQUEST),
decode(<<?BYTE(?SSH_MSG_USERAUTH_PASSWD_CHANGEREQ), ?DEC_BIN(Prompt,__0), ?DEC_BIN(Lang,__1) >>) ->
#ssh_msg_userauth_passwd_changereq{
prompt = Prompt,
- languge = Lang
+ language = Lang
};
%%% Unhandled message, also masked by same 1:st byte value as ?SSH_MSG_USERAUTH_INFO_REQUEST:
@@ -571,20 +573,29 @@ decode(<<?BYTE(?SSH_MSG_DEBUG), ?BYTE(Bool), ?DEC_BIN(Msg,__0), ?DEC_BIN(Lang,__
%%%-------- public key --------
ssh2_pubkey_encode(#'RSAPublicKey'{modulus = N, publicExponent = E}) ->
<<?STRING(<<"ssh-rsa">>), ?Empint(E), ?Empint(N)>>;
+
ssh2_pubkey_encode({Y, #'Dss-Parms'{p = P, q = Q, g = G}}) ->
<<?STRING(<<"ssh-dss">>), ?Empint(P), ?Empint(Q), ?Empint(G), ?Empint(Y)>>;
+
+ssh2_pubkey_encode({#'ECPoint'{point = Q}, {namedCurve,OID}}) when OID == ?'id-Ed25519' orelse
+ OID == ?'id-Ed448' ->
+ {KeyType, _} = oid2ssh_curvename(OID),
+ <<?STRING(KeyType), ?Estring(Q)>>;
+
+ssh2_pubkey_encode(#'ECPrivateKey'{parameters = {namedCurve,OID},
+ publicKey = Key}) when OID == ?'id-Ed25519' orelse
+ OID == ?'id-Ed448' ->
+ {KeyType, _} = oid2ssh_curvename(OID),
+ <<?STRING(KeyType), ?Estring(Key)>>;
+
+ssh2_pubkey_encode(#'ECPrivateKey'{parameters = {namedCurve,OID},
+ publicKey = Key}) ->
+ {KeyType,Curve} = oid2ssh_curvename(OID),
+ <<?STRING(KeyType), ?STRING(Curve), ?Estring(Key)>>;
+
ssh2_pubkey_encode({#'ECPoint'{point = Q}, {namedCurve,OID}}) ->
- Curve = public_key:oid2ssh_curvename(OID),
- KeyType = <<"ecdsa-sha2-", Curve/binary>>,
- <<?STRING(KeyType), ?STRING(Curve), ?Estring(Q)>>;
-ssh2_pubkey_encode({ed_pub, ed25519, Key}) ->
- <<?STRING(<<"ssh-ed25519">>), ?Estring(Key)>>;
-ssh2_pubkey_encode({ed_pub, ed448, Key}) ->
- <<?STRING(<<"ssh-ed448">>), ?Estring(Key)>>;
-ssh2_pubkey_encode({ed_pri, ed25519, Key, _}) ->
- <<?STRING(<<"ssh-ed25519">>), ?Estring(Key)>>;
-ssh2_pubkey_encode({ed_pri, ed448, Key, _}) ->
- <<?STRING(<<"ssh-ed448">>), ?Estring(Key)>>.
+ {KeyType,Curve} = oid2ssh_curvename(OID),
+ <<?STRING(KeyType), ?STRING(Curve), ?Estring(Q)>>.
%%%--------
ssh2_pubkey_decode(KeyBlob) ->
@@ -608,26 +619,23 @@ ssh2_pubkey_decode2(<<?UINT32(7), "ssh-dss",
q = Q,
g = G}
}, Rest};
-ssh2_pubkey_decode2(<<?UINT32(TL), "ecdsa-sha2-",KeyRest/binary>>) ->
- Sz = TL-11,
- <<_Curve:Sz/binary,
- ?DEC_BIN(SshName, _IL),
- ?DEC_BIN(Q, _QL),
- Rest/binary>> = KeyRest,
- OID = public_key:ssh_curvename2oid(SshName),
- {{#'ECPoint'{point = Q}, {namedCurve,OID}
- }, Rest};
-ssh2_pubkey_decode2(<<?UINT32(11), "ssh-ed25519",
- ?DEC_BIN(Key, _L),
- Rest/binary>>) ->
- {{ed_pub, ed25519, Key},
- Rest};
-ssh2_pubkey_decode2(<<?UINT32(9), "ssh-ed448",
- ?DEC_BIN(Key, _L),
- Rest/binary>>) ->
- {{ed_pub, ed448, Key},
+
+ssh2_pubkey_decode2(<<?DEC_BIN(SshCurveName,SCNL), Rest0/binary>>) ->
+ {Pub, Rest} =
+ case {SshCurveName, Rest0} of
+ {<<"ecdsa-sha2-", _/binary>>,
+ <<?DEC_BIN(_Curve, _IL),
+ ?DEC_BIN(Q, _QL),
+ Rest1/binary>>} -> {Q, Rest1};
+
+ {<<"ssh-ed",_/binary>>,
+ <<?DEC_BIN(Key, _L),
+ Rest1/binary>>} -> {Key, Rest1}
+ end,
+ OID = ssh_curvename2oid(SshCurveName),
+ {{#'ECPoint'{point = Pub}, {namedCurve,OID}},
Rest}.
-
+
%%%-------- private key --------
%% dialyser... ssh2_privkey_decode(KeyBlob) ->
@@ -674,20 +682,26 @@ ssh2_privkey_encode(#'ECPrivateKey'
{version = 1,
parameters = {namedCurve,OID},
privateKey = Priv,
+ publicKey = Pub
+ }) when OID == ?'id-Ed25519' orelse
+ OID == ?'id-Ed448' ->
+ {CurveName,_} = oid2ssh_curvename(OID),
+ <<?STRING(CurveName),
+ ?STRING(Pub),
+ ?STRING(Priv)>>;
+
+ssh2_privkey_encode(#'ECPrivateKey'
+ {version = 1,
+ parameters = {namedCurve,OID},
+ privateKey = Priv,
publicKey = Q
}) ->
- CurveName = public_key:oid2ssh_curvename(OID),
- <<?STRING(<<"ecdsa-sha2-",CurveName/binary>>),
- ?STRING(<<"ecdsa-sha2-",CurveName/binary>>), % Yes
+ {CurveName,_} = oid2ssh_curvename(OID),
+ <<?STRING(CurveName),
+ ?STRING(CurveName), % SIC!
?STRING(Q),
- ?STRING(Priv)>>;
+ ?STRING(Priv)>>.
-ssh2_privkey_encode({ed_pri, Alg, Pub, Priv}) ->
- Name = atom_to_binary(Alg),
- <<?STRING(<<"ssh-",Name/binary>>),
- ?STRING(Pub),
- ?STRING(<<Priv/binary,Pub/binary>>)>>.
-
%%%--------
ssh2_privkey_decode2(<<?UINT32(7), "ssh-rsa",
?DEC_INT(N, _NL), % Yes, N and E is reversed relative pubkey format
@@ -721,34 +735,49 @@ ssh2_privkey_decode2(<<?UINT32(7), "ssh-dss",
y = Y,
x = X
}, Rest};
-ssh2_privkey_decode2(<<?UINT32(TL), "ecdsa-sha2-",KeyRest/binary>>) ->
- Sz = TL-11,
- <<_Curve:Sz/binary,
- ?DEC_BIN(CurveName, _SNN),
- ?DEC_BIN(Q, _QL),
- ?DEC_BIN(Priv, _PrivL),
- Rest/binary>> = KeyRest,
- OID = public_key:ssh_curvename2oid(CurveName),
+
+ssh2_privkey_decode2(<<?DEC_BIN(SshCurveName,SCNL), Rest0/binary>>) ->
+ {Pub, Priv, Rest} =
+ case {SshCurveName, Rest0} of
+ {<<"ecdsa-sha2-",_/binary>>,
+ <<?DEC_BIN(_Curve, _IL),
+ ?DEC_BIN(Pub1, _QL),
+ ?DEC_BIN(Priv1, _PrivL),
+ Rest1/binary>>} ->
+ {Pub1, Priv1, Rest1};
+
+ {<<"ssh-ed",_/binary>>,
+ <<?DEC_BIN(Pub1, PL),
+ ?DEC_BIN(PrivPub, PPL),
+ Rest1/binary>>} ->
+ PL = PPL div 2,
+ <<Priv1:PL/binary, _/binary>> = PrivPub,
+ {Pub1, Priv1, Rest1}
+ end,
+ OID = ssh_curvename2oid(SshCurveName),
{#'ECPrivateKey'{version = 1,
parameters = {namedCurve,OID},
privateKey = Priv,
- publicKey = Q
- }, Rest};
-ssh2_privkey_decode2(<<?UINT32(11), "ssh-ed25519",
- ?DEC_BIN(Pub,_Lpub),
- 64:32/unsigned-big-integer,
- Priv:32/binary,
- _Pub:32/binary,
- Rest/binary>>) ->
- {{ed_pri, ed25519, Pub, Priv}, Rest};
-ssh2_privkey_decode2(<<?UINT32(9), "ssh-ed448",
- ?DEC_BIN(Pub,_Lpub),
- 114:32/unsigned-big-integer,
- Priv:57/binary,
- _Pub:57/binary,
- Rest/binary>>) ->
- {{ed_pri, ed448, Pub, Priv}, Rest}.
-
+ publicKey = Pub
+ }, Rest}.
+
+
+%% Description: Converts from the ssh name of elliptic curves to
+%% the OIDs.
+%%--------------------------------------------------------------------
+ssh_curvename2oid(<<"ssh-ed25519">>) -> ?'id-Ed25519';
+ssh_curvename2oid(<<"ssh-ed448">> ) -> ?'id-Ed448';
+ssh_curvename2oid(<<"ecdsa-sha2-nistp256">>) -> ?'secp256r1';
+ssh_curvename2oid(<<"ecdsa-sha2-nistp384">>) -> ?'secp384r1';
+ssh_curvename2oid(<<"ecdsa-sha2-nistp521">>) -> ?'secp521r1'.
+
+%% Description: Converts from elliptic curve OIDs to the ssh name.
+%%--------------------------------------------------------------------
+oid2ssh_curvename(?'id-Ed25519')-> {<<"ssh-ed25519">>, 'n/a'};
+oid2ssh_curvename(?'id-Ed448') -> {<<"ssh-ed448">>, 'n/a'};
+oid2ssh_curvename(?'secp256r1') -> {<<"ecdsa-sha2-nistp256">>, <<"nistp256">>};
+oid2ssh_curvename(?'secp384r1') -> {<<"ecdsa-sha2-nistp384">>, <<"nistp384">>};
+oid2ssh_curvename(?'secp521r1') -> {<<"ecdsa-sha2-nistp521">>, <<"nistp521">>}.
%%%================================================================
%%%
@@ -810,13 +839,8 @@ encode_signature(#'RSAPublicKey'{}, SigAlg, Signature) ->
encode_signature({_, #'Dss-Parms'{}}, _SigAlg, Signature) ->
<<?Ebinary(<<"ssh-dss">>), ?Ebinary(Signature)>>;
encode_signature({#'ECPoint'{}, {namedCurve,OID}}, _SigAlg, Signature) ->
- Curve = public_key:oid2ssh_curvename(OID),
- <<?Ebinary(<<"ecdsa-sha2-",Curve/binary>>), ?Ebinary(Signature)>>;
-encode_signature({ed_pub, ed25519,_}, _SigAlg, Signature) ->
- <<?Ebinary(<<"ssh-ed25519">>), ?Ebinary(Signature)>>;
-encode_signature({ed_pub, ed448,_}, _SigAlg, Signature) ->
- <<?Ebinary(<<"ssh-ed448">>), ?Ebinary(Signature)>>.
-
+ {SshCurveName,_} = oid2ssh_curvename(OID),
+ <<?Ebinary(<<SshCurveName/binary>>), ?Ebinary(Signature)>>.
%%%################################################################
diff --git a/lib/ssh/src/ssh_options.erl b/lib/ssh/src/ssh_options.erl
index e06c2ed27c..686fa27b58 100644
--- a/lib/ssh/src/ssh_options.erl
+++ b/lib/ssh/src/ssh_options.erl
@@ -295,7 +295,7 @@ save({Inet,false}, _Defs, OptMap) when Inet==inet ; Inet==inet6 -> OptMap;
save({special_trpt_args,T}, _Defs, OptMap) when is_map(OptMap) ->
OptMap#{socket_options := [T | maps:get(socket_options,OptMap)]};
-%% and finaly the 'real stuff':
+%% and finally the 'real stuff':
save({Key,Value}, Defs, OptMap) when is_map(OptMap) ->
try (check_fun(Key,Defs))(Value)
of
@@ -1070,11 +1070,11 @@ normalize_mod_algs([K|Ks], KVs0, Acc, UseDefaultAlgs) ->
normalize_mod_algs(Ks, KVs, [{K,Vs} | Acc], UseDefaultAlgs);
normalize_mod_algs([], [], Acc, _) ->
%% No values left in the key-value list after removing the expected entries
- %% (thats good)
+ %% (that's good)
lists:reverse(Acc);
normalize_mod_algs([], [{K,_}|_], _, _) ->
%% Some values left in the key-value list after removing the expected entries
- %% (thats bad)
+ %% (that's bad)
case ssh_transport:algo_class(K) of
true -> error_in_check(K, "Duplicate key");
false -> error_in_check(K, "Unknown key")
diff --git a/lib/ssh/src/ssh_server_channel.erl b/lib/ssh/src/ssh_server_channel.erl
index 6339f13cad..87d32ccfb0 100644
--- a/lib/ssh/src/ssh_server_channel.erl
+++ b/lib/ssh/src/ssh_server_channel.erl
@@ -25,7 +25,7 @@
-module(ssh_server_channel).
-%% API to server side channel that can be pluged into the erlang ssh daemeon
+%% API to server side channel that can be plugged into the erlang ssh daemeon
-callback init(Args :: term()) ->
{ok, State :: term()} | {ok, State :: term(), timeout() | hibernate} |
{stop, Reason :: term()} | ignore.
diff --git a/lib/ssh/src/ssh_server_key_api.erl b/lib/ssh/src/ssh_server_key_api.erl
index addf46ef78..d668c8f61b 100644
--- a/lib/ssh/src/ssh_server_key_api.erl
+++ b/lib/ssh/src/ssh_server_key_api.erl
@@ -29,7 +29,7 @@
%%% The option key_cb_private is to pass options needed by other
%%% callback modules than the default ssh_file.erl
%%%
-%%% If ssh:deamon(n, [ {key_cb_private, {hi,{there}}} ]
+%%% If ssh:daemon(n, [ {key_cb_private, {hi,{there}}} ]
%%% is called, the term() will be {hi,{there}}
-type daemon_key_cb_options(T) :: [{key_cb_private,[T]} | ssh:daemon_option()].
diff --git a/lib/ssh/src/ssh_sftp.erl b/lib/ssh/src/ssh_sftp.erl
index c91f9d67ee..1558904928 100644
--- a/lib/ssh/src/ssh_sftp.erl
+++ b/lib/ssh/src/ssh_sftp.erl
@@ -78,7 +78,7 @@
mode, % read | write (=from or to buffer by user)
crypto_state,
crypto_fun, % For encode or decode depending on the mode field
- size = 0, % # bytes "before" the current buffer for the postion call
+ size = 0, % # bytes "before" the current buffer for the position call
chunksize, % The size of the chunks to be sent or received
enc_text_buf = <<>>, % Encrypted text
@@ -1224,7 +1224,7 @@ terminate(_Reason, State) ->
%% Internal functions
%%====================================================================
legacy_timeout(UserOptions) ->
- %% Make both connect_timeout and timeout defined if exaclty one of them is defined:
+ %% Make both connect_timeout and timeout defined if exactly one of them is defined:
case {proplists:get_value(connect_timeout, UserOptions),
proplists:get_value(timeout, UserOptions)} of
{undefined, undefined} ->
@@ -1582,7 +1582,7 @@ erase_handle(Handle, State) ->
State#state{inf = FI}.
%%
-%% Caluclate a integer offset
+%% Calculate a integer offset
%%
lseek_position(Handle, Pos, State) ->
case maps:find(Handle, State#state.inf) of
@@ -1719,7 +1719,7 @@ do_the_read_buf(Pid, SftpHandle, WantedLen, Packet, FileOpTimeout,
chunksize = undefined
})
when size(EncBuf0) > 0 ->
- %% We have (at least) one decodable byte waiting for decodeing.
+ %% We have (at least) one decodable byte waiting for decoding.
{ok,DecodedBin,B} = apply_crypto(EncBuf0, B0),
do_the_read_buf(Pid, SftpHandle, WantedLen, Packet, FileOpTimeout,
B#bufinf{plain_text_buf = <<PlainBuf0/binary, DecodedBin/binary>>,
@@ -1732,7 +1732,7 @@ do_the_read_buf(Pid, SftpHandle, WantedLen, Packet, FileOpTimeout,
chunksize = ChunkSize0
})
when size(EncBuf0) >= ChunkSize0 ->
- %% We have (at least) one chunk of decodable bytes waiting for decodeing.
+ %% We have (at least) one chunk of decodable bytes waiting for decoding.
<<ToDecode:ChunkSize0/binary, EncBuf/binary>> = EncBuf0,
{ok,DecodedBin,B} = apply_crypto(ToDecode, B0),
do_the_read_buf(Pid, SftpHandle, WantedLen, Packet, FileOpTimeout,
diff --git a/lib/ssh/src/ssh_sftpd.erl b/lib/ssh/src/ssh_sftpd.erl
index 27b97716eb..c86ed2cb81 100644
--- a/lib/ssh/src/ssh_sftpd.erl
+++ b/lib/ssh/src/ssh_sftpd.erl
@@ -102,7 +102,7 @@ init(Options) ->
%% Get the root of the file system (symlinks must be followed,
%% otherwise the realpath call won't work). But since symbolic links
- %% isn't supported on all plattforms we have to use the root property
+ %% isn't supported on all platforms we have to use the root property
%% supplied by the user.
{Root, State} =
case resolve_symlinks(Root0,
diff --git a/lib/ssh/src/ssh_shell.erl b/lib/ssh/src/ssh_shell.erl
index bd11afa080..4ab11487a9 100644
--- a/lib/ssh/src/ssh_shell.erl
+++ b/lib/ssh/src/ssh_shell.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
-include("ssh_connect.hrl").
%%% As this is an user interactive client it behaves like a daemon
-%%% channel inspite of it being a client.
+%%% channel in spite of it being a client.
-behaviour(ssh_server_channel).
%% ssh_server_channel callbacks
diff --git a/lib/ssh/src/ssh_system_sup.erl b/lib/ssh/src/ssh_system_sup.erl
index 728a10974c..712ca9a7fc 100644
--- a/lib/ssh/src/ssh_system_sup.erl
+++ b/lib/ssh/src/ssh_system_sup.erl
@@ -122,7 +122,7 @@ start_subsystem(Role, Address=#address{}, Socket, Options0) ->
{error,Error};
error:timeout ->
%% The connection was started, but the takover procedure timed out,
- %% therefor it exists a subtree, but it is not quite ready and
+ %% therefore it exists a subtree, but it is not quite ready and
%% must be removed (by the supervisor above):
supervisor:terminate_child(SysPid, Id),
{error, connection_start_timeout}
@@ -219,7 +219,7 @@ find_system_sup(Role, Address0) ->
case addresses(Role, Address0) of
[{SysSupPid,Address}] -> {ok,{SysSupPid,Address}};
[] -> {error,not_found};
- [_,_|_] -> {error,ambigous}
+ [_,_|_] -> {error,ambiguous}
end.
sup(client) -> sshc_sup;
diff --git a/lib/ssh/src/ssh_transport.erl b/lib/ssh/src/ssh_transport.erl
index e43c345130..6fa704b917 100644
--- a/lib/ssh/src/ssh_transport.erl
+++ b/lib/ssh/src/ssh_transport.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -932,22 +932,20 @@ extract_public_key(#'DSAPrivateKey'{y = Y, p = P, q = Q, g = G}) ->
{Y, #'Dss-Parms'{p=P, q=Q, g=G}};
extract_public_key(#'ECPrivateKey'{parameters = {namedCurve,OID},
publicKey = Pub0, privateKey = Priv}) when
- OID == ?'id-Ed25519'orelse
+ OID == ?'id-Ed25519' orelse
OID == ?'id-Ed448' ->
case {pubkey_cert_records:namedCurves(OID), Pub0} of
{Alg, asn1_NOVALUE} ->
%% If we're missing the public key, we can create it with
%% the private key.
{Pub, Priv} = crypto:generate_key(eddsa, Alg, Priv),
- {ed_pub, Alg, Pub};
- {Alg, Pub} ->
- {ed_pub, Alg, Pub}
+ {#'ECPoint'{point=Pub}, {namedCurve,OID}};
+ {_Alg, Pub} ->
+ {#'ECPoint'{point=Pub}, {namedCurve,OID}}
end;
extract_public_key(#'ECPrivateKey'{parameters = {namedCurve,OID},
publicKey = Q}) when is_tuple(OID) ->
{#'ECPoint'{point=Q}, {namedCurve,OID}};
-extract_public_key({ed_pri, Alg, Pub, _Priv}) ->
- {ed_pub, Alg, Pub};
extract_public_key(#{engine:=_, key_id:=_, algorithm:=Alg} = M) ->
case {Alg, crypto:privkey_to_pubkey(Alg, M)} of
{rsa, [E,N]} ->
@@ -1274,8 +1272,8 @@ alg_final(rcv, SSH0) ->
select_all(CL, SL) when length(CL) + length(SL) < ?MAX_NUM_ALGORITHMS ->
- %% algortihms only used by client
- %% NOTE: an algorithm occuring more than once in CL will still be present
+ %% algorithms only used by client
+ %% NOTE: an algorithm occurring more than once in CL will still be present
%% in CLonly. This is not a problem for nice clients.
CLonly = CL -- SL,
@@ -1546,7 +1544,7 @@ do_verify(PlainText, HashAlg, Sig, {_, #'Dss-Parms'{}} = Key, _) ->
_ ->
false
end;
-do_verify(PlainText, HashAlg, Sig, {#'ECPoint'{},_} = Key, _) ->
+do_verify(PlainText, HashAlg, Sig, {#'ECPoint'{},_} = Key, _) when HashAlg =/= undefined ->
case Sig of
<<?UINT32(Rlen),R:Rlen/big-signed-integer-unit:8,
?UINT32(Slen),S:Slen/big-signed-integer-unit:8>> ->
@@ -2061,40 +2059,27 @@ valid_key_sha_alg(private, #'RSAPrivateKey'{}, 'ssh-rsa' ) -> true;
valid_key_sha_alg(public, {_, #'Dss-Parms'{}}, 'ssh-dss') -> true;
valid_key_sha_alg(private, #'DSAPrivateKey'{}, 'ssh-dss') -> true;
-valid_key_sha_alg(public, {ed_pub, ed25519,_}, 'ssh-ed25519') -> true;
-valid_key_sha_alg(private, {ed_pri, ed25519,_,_},'ssh-ed25519') -> true;
-valid_key_sha_alg(private, #'ECPrivateKey'{parameters = {namedCurve,OID}},'ssh-ed25519') when OID == ?'id-Ed25519' -> true;
-valid_key_sha_alg(public, {ed_pub, ed448,_}, 'ssh-ed448') -> true;
-valid_key_sha_alg(private, {ed_pri, ed448,_,_}, 'ssh-ed448') -> true;
-valid_key_sha_alg(private, #'ECPrivateKey'{parameters = {namedCurve,OID}},'ssh-ed448') when OID == ?'id-Ed448' -> true;
-
-valid_key_sha_alg(public, {#'ECPoint'{},{namedCurve,OID}}, Alg) when is_tuple(OID) ->
+valid_key_sha_alg(public, {#'ECPoint'{},{namedCurve,OID}}, Alg) ->
valid_key_sha_alg_ec(OID, Alg);
-valid_key_sha_alg(private, #'ECPrivateKey'{parameters = {namedCurve,OID}}, Alg) when is_tuple(OID) ->
+valid_key_sha_alg(private, #'ECPrivateKey'{parameters = {namedCurve,OID}}, Alg) ->
valid_key_sha_alg_ec(OID, Alg);
valid_key_sha_alg(_, _, _) -> false.
-
-valid_key_sha_alg_ec(OID, Alg) ->
- try
- Curve = public_key:oid2ssh_curvename(OID),
- Alg == list_to_existing_atom("ecdsa-sha2-" ++ binary_to_list(Curve))
- catch
- _:_ -> false
- end.
+
+
+valid_key_sha_alg_ec(OID, Alg) when is_tuple(OID) ->
+ {SshCurveType, _} = ssh_message:oid2ssh_curvename(OID),
+ Alg == binary_to_atom(SshCurveType);
+valid_key_sha_alg_ec(_, _) -> false.
+
-dialyzer({no_match, public_algo/1}).
public_algo(#'RSAPublicKey'{}) -> 'ssh-rsa'; % FIXME: Not right with draft-curdle-rsa-sha2
public_algo({_, #'Dss-Parms'{}}) -> 'ssh-dss';
-public_algo({ed_pub, ed25519,_}) -> 'ssh-ed25519';
-public_algo({ed_pub, ed448,_}) -> 'ssh-ed448';
public_algo({#'ECPoint'{},{namedCurve,OID}}) when is_tuple(OID) ->
- SshName = public_key:oid2ssh_curvename(OID),
- try list_to_existing_atom("ecdsa-sha2-" ++ binary_to_list(SshName))
- catch
- _:_ -> undefined
- end.
+ {SshCurveType, _} = ssh_message:oid2ssh_curvename(OID),
+ binary_to_atom(SshCurveType).
sha('ssh-rsa') -> sha;
diff --git a/lib/ssh/src/ssh_transport.hrl b/lib/ssh/src/ssh_transport.hrl
index f424a4ff63..009d85cb79 100644
--- a/lib/ssh/src/ssh_transport.hrl
+++ b/lib/ssh/src/ssh_transport.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,7 +20,7 @@
%%
%%----------------------------------------------------------------------
-%% Purpose: Record and constant defenitions for the SSH-tansport layer
+%% Purpose: Record and constant definitions for the SSH-tansport layer
%% protocol see RFC 4253
%%----------------------------------------------------------------------
diff --git a/lib/ssh/src/ssh_xfer.hrl b/lib/ssh/src/ssh_xfer.hrl
index 07467c474b..bc2e1fa20c 100644
--- a/lib/ssh/src/ssh_xfer.hrl
+++ b/lib/ssh/src/ssh_xfer.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -226,7 +226,7 @@
-record(ssh_xfer_attr,
{
- type, %% regular, dirctory, symlink, ...
+ type, %% regular, directory, symlink, ...
size,
owner,
group,
diff --git a/lib/ssh/test/Makefile b/lib/ssh/test/Makefile
index 54d20cf8db..e07806f488 100644
--- a/lib/ssh/test/Makefile
+++ b/lib/ssh/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2021. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -105,7 +105,7 @@ EBIN = .
# Targets
# ----------------------------------------------------
-tests debug opt: emakebuild $(TARGET_FILES)
+tests $(TYPES): emakebuild $(TARGET_FILES)
.PHONY: emakebuild
diff --git a/lib/ssh/test/property_test/ssh_eqc_client_server.erl b/lib/ssh/test/property_test/ssh_eqc_client_server.erl
index 4bfc23d5ff..432fc87900 100644
--- a/lib/ssh/test/property_test/ssh_eqc_client_server.erl
+++ b/lib/ssh/test/property_test/ssh_eqc_client_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -299,7 +299,7 @@ do(Pid, Fun, Timeout) when is_function(Fun,0) ->
%%%----------------
%%% Start a new connection
-%%% Precondition: deamon exists
+%%% Precondition: daemon exists
ssh_open_connection_pre(S) -> S#state.servers /= [].
diff --git a/lib/ssh/test/property_test/ssh_eqc_encode_decode.erl b/lib/ssh/test/property_test/ssh_eqc_encode_decode.erl
index 843a2b5a3c..b34d36dfdb 100644
--- a/lib/ssh/test/property_test/ssh_eqc_encode_decode.erl
+++ b/lib/ssh/test/property_test/ssh_eqc_encode_decode.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -250,7 +250,7 @@ msg_code(Num) -> Name
-include_lib("ssh/src/ssh_connect.hrl").
-include_lib("ssh/src/ssh_transport.hrl").
-%%% Encoding and decodeing is asymetric so out=binary in=string. Sometimes. :(
+%%% Encoding and decoding is asymmetric so out=binary in=string. Sometimes. :(
-define(fix_asym_Xdh_reply(S),
fix_asym(#S{public_host_key = Key, h_sig = {Alg,Sig}} = M) ->
M#S{public_host_key = {Key, list_to_atom(Alg)}, h_sig = Sig}
diff --git a/lib/ssh/test/ssh_basic_SUITE.erl b/lib/ssh/test/ssh_basic_SUITE.erl
index 0c6bb4365f..cc74d5e725 100644
--- a/lib/ssh/test/ssh_basic_SUITE.erl
+++ b/lib/ssh/test/ssh_basic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -22,6 +22,7 @@
-module(ssh_basic_SUITE).
+-include_lib("public_key/include/public_key.hrl").
-include_lib("common_test/include/ct.hrl").
-include_lib("kernel/include/inet.hrl").
-include_lib("kernel/include/file.hrl").
@@ -251,7 +252,7 @@ appup_test(Config) when is_list(Config) ->
%%--------------------------------------------------------------------
%%% Test that we can set some misc options not tested elsewhere
%%% some options not yet present are not decided if we should support or
-%%% if they need thier own test case.
+%%% if they need their own test case.
misc_ssh_options(Config) when is_list(Config) ->
SystemDir = filename:join(proplists:get_value(priv_dir, Config), system),
UserDir = proplists:get_value(priv_dir, Config),
@@ -520,7 +521,7 @@ shell_socket(Config) when is_list(Config) ->
ct:log("~p:~p udp socket failed ok", [?MODULE,?LINE]),
gen_udp:close(BadSock),
- %% And finaly test with passive mode (which should work):
+ %% And finally test with passive mode (which should work):
IO = ssh_test_lib:start_io_server(),
{ok,Sock} = gen_tcp:connect(Host, Port, [{active,false}]),
Shell = ssh_test_lib:start_shell(Sock, IO, [{user_dir,UserDir}]),
@@ -659,7 +660,7 @@ cli_exit_status(Config) when is_list(Config) ->
%%--------------------------------------------------------------------
%%% Test that get correct error message if you try to start a daemon
-%%% on an adress that already runs a daemon see also seq10667
+%%% on an address that already runs a daemon see also seq10667
daemon_already_started(Config) when is_list(Config) ->
SystemDir = proplists:get_value(data_dir, Config),
UserDir = proplists:get_value(priv_dir, Config),
@@ -783,12 +784,14 @@ ssh_file_is_host_key(Config) ->
ct:log("Dir = ~p", [Dir]),
KnownHosts = filename:join(Dir, "known_hosts"),
- Key1 = {ed_pub,ed25519,<<73,72,235,162,96,101,154,59,217,114,123,192,96,105,250,29,
- 214,76,60,63,167,21,221,118,246,168,152,2,7,172,137,125>>},
- Key2 = {ed_pub,ed448,<<95,215,68,155,89,180,97,253,44,231,135,236,97,106,212,106,29,
- 161,52,36,133,167,14,31,138,14,167,93,128,233,103,120,237,241,
- 36,118,155,70,199,6,27,214,120,61,241,229,15,108,209,250,26,
- 190,175,232,37,97,128>>},
+ Key1 = {#'ECPoint'{point = <<73,72,235,162,96,101,154,59,217,114,123,192,96,105,250,29,
+ 214,76,60,63,167,21,221,118,246,168,152,2,7,172,137,125>>},
+ {namedCurve,?'id-Ed25519'}},
+ Key2 = {#'ECPoint'{point = <<95,215,68,155,89,180,97,253,44,231,135,236,97,106,212,106,29,
+ 161,52,36,133,167,14,31,138,14,167,93,128,233,103,120,237,241,
+ 36,118,155,70,199,6,27,214,120,61,241,229,15,108,209,250,26,
+ 190,175,232,37,97,128>>},
+ {namedCurve,?'id-Ed448'}},
Key3 = {'RSAPublicKey',26565213557098441060571713941539431805641814292761836797158846333985276408616038302348064841541244792430014595960643885863857366044141899534486816837416587694213836843799730043696945690516841209754307951050689906601353687467659852190777927968674989320642319504162787468947018505175948989102544757855693228490011564030927714896252701919941617689227585365348356580525802093985552564228730275431222515673065363441446158870936027338182083252824862151536327733046243804704721201548991176621134884093279416695997338124856506800535228380202243308550318880784741179703553922258881924287662178348044420509921666661119986374777,
65537},
@@ -831,13 +834,14 @@ ssh_file_is_host_key_misc(Config) ->
ct:log("Dir = ~p", [Dir]),
KnownHosts = filename:join(Dir, "known_hosts"),
- Key1 = {ed_pub,ed25519,<<73,72,235,162,96,101,154,59,217,114,123,192,96,105,250,29,
- 214,76,60,63,167,21,221,118,246,168,152,2,7,172,137,125>>},
- Key2 = {ed_pub,ed448,<<95,215,68,155,89,180,97,253,44,231,135,236,97,106,212,106,29,
- 161,52,36,133,167,14,31,138,14,167,93,128,233,103,120,237,241,
- 36,118,155,70,199,6,27,214,120,61,241,229,15,108,209,250,26,
- 190,175,232,37,97,128>>},
-
+ Key1 = {#'ECPoint'{point = <<73,72,235,162,96,101,154,59,217,114,123,192,96,105,250,29,
+ 214,76,60,63,167,21,221,118,246,168,152,2,7,172,137,125>>},
+ {namedCurve,?'id-Ed25519'}},
+ Key2 = {#'ECPoint'{point = <<95,215,68,155,89,180,97,253,44,231,135,236,97,106,212,106,29,
+ 161,52,36,133,167,14,31,138,14,167,93,128,233,103,120,237,241,
+ 36,118,155,70,199,6,27,214,120,61,241,229,15,108,209,250,26,
+ 190,175,232,37,97,128>>},
+ {namedCurve,?'id-Ed448'}},
FileContents = <<"h11,h12,!h12 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIElI66JgZZo72XJ7wGBp+h3WTDw/pxXddvaomAIHrIl9\n",
%% Key revoked later in file:
"h22 ssh-ed448 AAAACXNzaC1lZDQ0OAAAADlf10SbWbRh/Sznh+xhatRqHaE0JIWnDh"
@@ -871,13 +875,14 @@ ssh_file_is_auth_key(Config) ->
ct:log("Dir = ~p", [Dir]),
AuthKeys = filename:join(Dir, "authorized_keys"),
- Key1 = {ed_pub,ed25519,<<73,72,235,162,96,101,154,59,217,114,123,192,96,105,250,29,
- 214,76,60,63,167,21,221,118,246,168,152,2,7,172,137,125>>},
- Key2 = {ed_pub,ed448,<<95,215,68,155,89,180,97,253,44,231,135,236,97,106,212,106,29,
- 161,52,36,133,167,14,31,138,14,167,93,128,233,103,120,237,241,
- 36,118,155,70,199,6,27,214,120,61,241,229,15,108,209,250,26,
- 190,175,232,37,97,128>>},
-
+ Key1 = {#'ECPoint'{point = <<73,72,235,162,96,101,154,59,217,114,123,192,96,105,250,29,
+ 214,76,60,63,167,21,221,118,246,168,152,2,7,172,137,125>>},
+ {namedCurve,?'id-Ed25519'}},
+ Key2 = {#'ECPoint'{point = <<95,215,68,155,89,180,97,253,44,231,135,236,97,106,212,106,29,
+ 161,52,36,133,167,14,31,138,14,167,93,128,233,103,120,237,241,
+ 36,118,155,70,199,6,27,214,120,61,241,229,15,108,209,250,26,
+ 190,175,232,37,97,128>>},
+ {namedCurve,?'id-Ed448'}},
FileContents = <<" \n",
"# A test file\n",
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIElI66JgZZo72XJ7wGBp+h3WTDw/pxXddvaomAIHrIl9 foo@example.com\n",
@@ -1393,7 +1398,7 @@ login_bad_pwd_no_retry(Config, AuthMethods) ->
{ok,Conn} ->
ssh:close(Conn),
ssh:stop_daemon(DaemonRef),
- {fail, "Connect erroneosly succeded"}
+ {fail, "Connect erroneosly succeeded"}
end
end.
@@ -1465,7 +1470,7 @@ setopts_getopts(Config) ->
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
%% Due to timing the error message may or may not be delivered to
-%% the "tcp-application" before the socket closed message is recived
+%% the "tcp-application" before the socket closed message is received
check_error("Invalid state") -> ok;
check_error("Connection closed") -> ok;
check_error("Selection of key exchange algorithm failed"++_) -> ok;
@@ -1582,7 +1587,7 @@ prompt_prefix() ->
new_do_shell_prompt(IO, N, type, Str, More) ->
ct:log("Matched prompt ~p to trigger sending of next line to server",[N]),
IO ! {input, self(), Str++"\r\n"},
- ct:log("Promt '~p> ', Sent ~ts",[N,Str++"\r\n"]),
+ ct:log("Prompt '~p> ', Sent ~ts",[N,Str++"\r\n"]),
new_do_shell(IO, N, More);
new_do_shell_prompt(IO, N, Op, Str, More) ->
ct:log("Matched prompt ~p",[N]),
diff --git a/lib/ssh/test/ssh_chan_behaviours_SUITE.erl b/lib/ssh/test/ssh_chan_behaviours_SUITE.erl
index df37918228..c0ab325126 100644
--- a/lib/ssh/test/ssh_chan_behaviours_SUITE.erl
+++ b/lib/ssh/test/ssh_chan_behaviours_SUITE.erl
@@ -104,7 +104,7 @@ end_per_testcase(_TC, Config) ->
%%--------------------------------------------------------------------
%% Test Cases --------------------------------------------------------
%%--------------------------------------------------------------------
-%% Try start a subsystem whos name is not known by the server
+%% Try start a subsystem whose name is not known by the server
noexist_subsystem(Config) ->
C = proplists:get_value(connref, Config),
{ok, Ch} = ssh_connection:session_channel(C, infinity),
@@ -135,7 +135,7 @@ defined_subsystem(Config) ->
?EXPECT({ssh_cm, C, {closed,Ch1}}, []), % self() is instead of a proper channel handler
ok.
-%% Try to start and stop a subsystem from a ssh_client_channel behviour
+%% Try to start and stop a subsystem from a ssh_client_channel behaviour
subsystem_client(Config) ->
C = proplists:get_value(connref, Config),
diff --git a/lib/ssh/test/ssh_compat_SUITE.erl b/lib/ssh/test/ssh_compat_SUITE.erl
index 56127e98e2..0b1357ca05 100644
--- a/lib/ssh/test/ssh_compat_SUITE.erl
+++ b/lib/ssh/test/ssh_compat_SUITE.erl
@@ -80,7 +80,7 @@ groups() ->
ssh_image_versions() ->
try
%% Find all useful containers in such a way that undefined command, too low
- %% priviliges, no containers and containers found give meaningful result:
+ %% privileges, no containers and containers found give meaningful result:
L0 = ["REPOSITORY"++_|_] = string:tokens(os:cmd("docker images"), "\r\n"),
[["REPOSITORY","TAG"|_]|L1] = [string:tokens(E, " ") || E<-L0],
[list_to_atom(V) || [?DOCKER_PFX,V|_] <- L1]
@@ -151,7 +151,7 @@ init_per_group(G, Config0) ->
ct:comment("~s",[NewCmnt])
end,
AuthMethods =
- %% This should be obtained by quering the peer, but that
+ %% This should be obtained by querying the peer, but that
%% is a bit hard. It is possible with ssh_protocol_SUITE
%% techniques, but it can wait.
case Vssh of
@@ -409,7 +409,7 @@ send_recv_big_with_renegotiate_otp_is_client(Config) ->
Data = << <<X:32>> || X <- lists:seq(1, HalfSizeBytes div 4)>>,
%% Send the data. Must spawn a process to avoid deadlock. The client will block
- %% until all is sent through the send window. But the server will stop receiveing
+ %% until all is sent through the send window. But the server will stop receiving
%% when the servers send-window towards the client is full.
%% Since the client can't receive before the server has received all but 655k from the client
%% ssh_connection:send/4 is blocking...
@@ -875,7 +875,7 @@ new_dir(Config) ->
%%--------------------------------------------------------------------
%%
-%% Find the intersection of algoritms for otp ssh and the docker ssh.
+%% Find the intersection of algorithms for otp ssh and the docker ssh.
%% Returns {ok, ServerHello, Server, ClientHello, Client} where Server are the algorithms common
%% with the docker server and analogous for Client.
%%
@@ -1097,7 +1097,7 @@ receive_hello(S, Ack) ->
receive_kexinit(_S, <<PacketLen:32, PaddingLen:8, PayloadAndPadding/binary>>)
- when PacketLen < 5000, % heuristic max len to stop huge attempts if packet decodeing get out of sync
+ when PacketLen < 5000, % heuristic max len to stop huge attempts if packet decoding get out of sync
size(PayloadAndPadding) >= (PacketLen-1) % Need more bytes?
->
ct:log("Has all ~p packet bytes",[PacketLen]),
diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl
index 1e79f0a622..78a0f65edb 100644
--- a/lib/ssh/test/ssh_connection_SUITE.erl
+++ b/lib/ssh/test/ssh_connection_SUITE.erl
@@ -209,7 +209,7 @@ end_per_suite(_Config) ->
init_per_group(openssh, Config) ->
case ssh_test_lib:gen_tcp_connect(?SSH_DEFAULT_PORT, []) of
{error,econnrefused} ->
- {skip,"No openssh deamon (econnrefused)"};
+ {skip,"No openssh daemon (econnrefused)"};
{ok, Socket} ->
gen_tcp:close(Socket),
ssh_test_lib:openssh_sanity_check(Config)
@@ -679,7 +679,7 @@ do_interrupted_send(Config, SendSize, EchoSize) ->
ct:log("~p:~p got expected data",[?MODULE,?LINE]),
ok;
Other ->
- ct:log("~p:~p unexpect: ~p", [?MODULE,?LINE,Other]),
+ ct:log("~p:~p unexpected: ~p", [?MODULE,?LINE,Other]),
{fail,"unexpected result in listener"}
catch
Class:Exception ->
@@ -1236,7 +1236,7 @@ start_shell_sock_daemon_exec_multi(Config) ->
receive
{ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"echo testing\n">>}} ->
Parent ! {answer_received,self()},
- ct:log("~p:~p: recevied result on connection ~p", [?MODULE,?LINE,ConnectionRef])
+ ct:log("~p:~p: received result on connection ~p", [?MODULE,?LINE,ConnectionRef])
after 5000 ->
ct:fail("Exec Timeout")
end
diff --git a/lib/ssh/test/ssh_options_SUITE.erl b/lib/ssh/test/ssh_options_SUITE.erl
index 82c8b956c9..594378cda3 100644
--- a/lib/ssh/test/ssh_options_SUITE.erl
+++ b/lib/ssh/test/ssh_options_SUITE.erl
@@ -1412,7 +1412,7 @@ max_sessions(Config, ParallelLogin, Connect0) when is_function(Connect0,2) ->
ct:log("Connections up: ~p",[Connections]),
[_|_] = Connections,
- %% N w try one more than alowed:
+ %% N w try one more than allowed:
ct:pal("Info Report expected here (if not disabled) ...",[]),
try Connect(Host,Port)
of
@@ -1442,7 +1442,7 @@ try_to_connect(Connect, Host, Port, Pid, Tref, N) ->
of
_ConnectionRef1 ->
timer:cancel(Tref),
- ct:log("Step 3 ok: could set up one more connection after killing one. Thats good.",[]),
+ ct:log("Step 3 ok: could set up one more connection after killing one. That's good.",[]),
ssh:stop_daemon(Pid),
receive % flush.
timeout_no_connection -> ok
@@ -1634,7 +1634,7 @@ config_file(Config) ->
ct:log("c2.config:~n~s", [Cnfs]),
%% Start the slave node with the configuration just made:
- {ok,Node} = start_node(random_node_name(?MODULE), ConfFile),
+ {ok, Peer, Node} = ?CT_PEER(["-config", ConfFile]),
R0 = rpc:call(Node, ssh, default_algorithms, []),
ct:log("R0 = ~p",[R0]),
@@ -1679,7 +1679,7 @@ config_file(Config) ->
{options,Os2} = rpc:call(Node, ssh, connection_info, [C2, options]),
ct:log("C2 opts:~n~p~n~nalgorithms:~n~p~n~noptions:~n~p", [C2_Opts,As2,Os2]),
- stop_node_nice(Node)
+ peer:stop(Peer)
end.
%%%----------------------------------------------------------------
@@ -1732,7 +1732,7 @@ config_file_modify_algorithms_order(Config) ->
ct:log("c3.config:~n~s", [Cnfs]),
%% Start the slave node with the configuration just made:
- {ok,Node} = start_node(random_node_name(?MODULE), ConfFile),
+ {ok, Peer, Node} = ?CT_PEER(["-config", ConfFile]),
R0 = rpc:call(Node, ssh, default_algorithms, []),
ct:log("R0 = ~p",[R0]),
@@ -1769,10 +1769,10 @@ config_file_modify_algorithms_order(Config) ->
ConnOptions = proplists:get_value(options, ConnInfo),
ConnPrefAlgs = proplists:get_value(preferred_algorithms, ConnOptions),
- %% And now, are all levels appied in right order:
+ %% And now, are all levels applied in right order:
[K3,K2] = proplists:get_value(kex, ConnPrefAlgs),
- stop_node_nice(Node)
+ peer:stop(Peer)
end.
@@ -1780,21 +1780,6 @@ config_file_modify_algorithms_order(Config) ->
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
-start_node(Name, ConfigFile) ->
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, slave, [{args,
- " -pa " ++ Pa ++
- " -config " ++ ConfigFile}]).
-
-stop_node_nice(Node) when is_atom(Node) ->
- test_server:stop_node(Node).
-
-random_node_name(BaseName) ->
- L = integer_to_list(erlang:unique_integer([positive])),
- lists:concat([BaseName,"___",L]).
-
-%%%----
-
expected_ssh_vsn(Str) ->
try
{ok,L} = application:get_all_key(ssh),
@@ -1804,7 +1789,7 @@ expected_ssh_vsn(Str) ->
"\r\n" -> true;
_ -> false
catch
- _:_ -> true %% ssh not started so we dont't know
+ _:_ -> true %% ssh not started so we don't know
end.
diff --git a/lib/ssh/test/ssh_protocol_SUITE.erl b/lib/ssh/test/ssh_protocol_SUITE.erl
index 7e94bf60c7..dbe862eab6 100644
--- a/lib/ssh/test/ssh_protocol_SUITE.erl
+++ b/lib/ssh/test/ssh_protocol_SUITE.erl
@@ -717,7 +717,7 @@ client_info_line(Config) ->
%%% The server does not send the extension because
%%% the client does not tell the server to send it
no_ext_info_s1(Config) ->
- %% Start the dameon
+ %% Start the daemon
Server = {Pid,_,_} = ssh_test_lib:daemon([{send_ext_info,true},
{system_dir, system_dir(Config)}]),
{ok,AfterKexState} = connect_and_kex([{server,Server}|Config]),
@@ -732,7 +732,7 @@ no_ext_info_s1(Config) ->
%%% The server does not send the extension because
%%% the server is not configured to send it
no_ext_info_s2(Config) ->
- %% Start the dameon
+ %% Start the daemon
Server = {Pid,_,_} = ssh_test_lib:daemon([{send_ext_info,false},
{system_dir, system_dir(Config)}]),
{ok,AfterKexState} = connect_and_kex([{extra_options,[{recv_ext_info,true}]},
@@ -748,7 +748,7 @@ no_ext_info_s2(Config) ->
%%%--------------------------------------------------------------------
%%% The server sends the extension
ext_info_s(Config) ->
- %% Start the dameon
+ %% Start the daemon
Server = {Pid,_,_} = ssh_test_lib:daemon([{send_ext_info,true},
{system_dir, system_dir(Config)}]),
{ok,AfterKexState} = connect_and_kex([{extra_options,[{recv_ext_info,true}]},
@@ -984,7 +984,7 @@ chk_pref_algs(Config,
ExpectedKex,
ExpectedCiphers,
ServerPrefOpts) ->
- %% Start the dameon
+ %% Start the daemon
case ssh_test_lib:daemon(
[{send_ext_info,false},
{recv_ext_info,false},
@@ -1103,7 +1103,7 @@ std_connect({Host,Port}, Config, Opts) ->
std_connect(Host, Port, Config, Opts) ->
{User,Pwd} = server_user_password(Config),
ssh:connect(Host, Port,
- %% Prefere User's Opts to the default opts
+ %% Prefer User's Opts to the default opts
[O || O = {Tag,_} <- [{user,User},{password,Pwd},
{silently_accept_hosts, true},
{save_accepted_host, false},
diff --git a/lib/ssh/test/ssh_pubkey_SUITE.erl b/lib/ssh/test/ssh_pubkey_SUITE.erl
index 81c32e0197..d03d4e61c5 100644
--- a/lib/ssh/test/ssh_pubkey_SUITE.erl
+++ b/lib/ssh/test/ssh_pubkey_SUITE.erl
@@ -836,8 +836,8 @@ chk_known_hosts(Config) ->
%%%----------------------------------------------------------------
-try_connect({skip,Reson}) ->
- {skip,Reson};
+try_connect({skip,Reason}) ->
+ {skip,Reason};
try_connect(Config) ->
SystemDir = proplists:get_value(system_dir, Config),
UserDir = proplists:get_value(user_dir, Config),
diff --git a/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_comment_pub b/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_comment_pub
index 7b42ced93e..bca5a375ca 100644
--- a/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_comment_pub
+++ b/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_comment_pub
@@ -1,7 +1,7 @@
---- BEGIN SSH2 PUBLIC KEY ----
Comment: This is an example of a very very very very looooooooooooo\
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\
-commment
+comment
x-command: /home/me/bin/lock-in-guest.sh
AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
diff --git a/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_header_pub b/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_header_pub
index 7b42ced93e..bca5a375ca 100644
--- a/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_header_pub
+++ b/lib/ssh/test/ssh_pubkey_SUITE_data/public_key/ssh_rsa_long_header_pub
@@ -1,7 +1,7 @@
---- BEGIN SSH2 PUBLIC KEY ----
Comment: This is an example of a very very very very looooooooooooo\
ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong\
-commment
+comment
x-command: /home/me/bin/lock-in-guest.sh
AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRb
YYFw8pfGesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ
diff --git a/lib/ssh/test/ssh_relay.erl b/lib/ssh/test/ssh_relay.erl
index 3bb4cb2071..f7aac11c7c 100644
--- a/lib/ssh/test/ssh_relay.erl
+++ b/lib/ssh/test/ssh_relay.erl
@@ -313,7 +313,7 @@ listen(Parent, LSock) ->
do_listen(Parent, LSock).
do_listen(Parent, LSock) ->
- %% So annoying there is no select-like sematic for this
+ %% So annoying there is no select-like semantics for this
case gen_tcp:accept(LSock, ?ACCEPT_TMO) of
{ok, Sock} ->
Parent ! {accept, Sock},
diff --git a/lib/ssh/test/ssh_sftpd_SUITE.erl b/lib/ssh/test/ssh_sftpd_SUITE.erl
index 70a0049730..42677b7613 100644
--- a/lib/ssh/test/ssh_sftpd_SUITE.erl
+++ b/lib/ssh/test/ssh_sftpd_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -405,7 +405,7 @@ rename_file(Config) when is_list(Config) ->
NewReqId1 = NewReqId + 1,
file:copy(FileName, NewFileName),
- %% No owerwrite
+ %% No overwrite
{ok, <<?SSH_FXP_STATUS, ?UINT32(NewReqId1),
?UINT32(?SSH_FX_FILE_ALREADY_EXISTS), _/binary>>, _} =
rename(FileName, NewFileName, Cm, Channel, NewReqId1, 6,
@@ -685,7 +685,7 @@ access_outside_root(Config) when is_list(Config) ->
BadFilePath = filename:join([BaseDir, bad]),
ok = file:write_file(BadFilePath, <<>>),
{Cm, Channel} = proplists:get_value(sftp, Config),
- %% Try to access a file parallell to the RootDir:
+ %% Try to access a file parallel to the RootDir:
try_access("/../bad", Cm, Channel, 0),
%% Try to access the same file via the CWD which is /b relative to the RootDir:
try_access("../../bad", Cm, Channel, 1).
@@ -717,7 +717,7 @@ try_access(Path, Cm, Channel, ReqId) ->
end
end;
_ ->
- ct:fail("Completly unexpected return: ~p", [Return])
+ ct:fail("Completely unexpected return: ~p", [Return])
end.
%%--------------------------------------------------------------------
diff --git a/lib/ssh/test/ssh_test_lib.erl b/lib/ssh/test/ssh_test_lib.erl
index acabb66a48..08c9638213 100644
--- a/lib/ssh/test/ssh_test_lib.erl
+++ b/lib/ssh/test/ssh_test_lib.erl
@@ -627,14 +627,14 @@ default_algorithms(sshc, DaemonOptions) ->
{hostport,Srvr,{_Host,Port}} ->
spawn(fun()-> os:cmd(lists:concat(["ssh -o \"StrictHostKeyChecking no\" -p ",Port," localhost"])) end)
after ?TIMEOUT ->
- ct:fail("No server respons (timeout) 1")
+ ct:fail("No server response (timeout) 1")
end,
receive
{result,Srvr,L} ->
L
after ?TIMEOUT ->
- ct:fail("No server respons (timeout) 2")
+ ct:fail("No server response (timeout) 2")
end.
run_fake_ssh({ok,InitialState}) ->
@@ -940,7 +940,7 @@ create_random_dir(Config) ->
Name;
{error,eexist} ->
%% The Name already denotes an existing file system object, try again.
- %% The likelyhood of always generating an existing file name is low
+ %% The likelihood of always generating an existing file name is low
create_random_dir(Config)
end.
diff --git a/lib/ssh/test/ssh_to_openssh_SUITE.erl b/lib/ssh/test/ssh_to_openssh_SUITE.erl
index a36b4036a5..c61907ec28 100644
--- a/lib/ssh/test/ssh_to_openssh_SUITE.erl
+++ b/lib/ssh/test/ssh_to_openssh_SUITE.erl
@@ -91,7 +91,7 @@ init_per_suite(Config) ->
?CHECK_CRYPTO(
case gen_tcp:connect("localhost", ?SSH_DEFAULT_PORT, []) of
{error,econnrefused} ->
- {skip,"No openssh deamon (econnrefused)"};
+ {skip,"No openssh daemon (econnrefused)"};
_ ->
ssh_test_lib:openssh_sanity_check(
[{ptty_supported, ssh_test_lib:ptty_supported()}
diff --git a/lib/ssh/test/ssh_trpt_test_lib.erl b/lib/ssh/test/ssh_trpt_test_lib.erl
index eea392bd35..6d3f4544ce 100644
--- a/lib/ssh/test/ssh_trpt_test_lib.erl
+++ b/lib/ssh/test/ssh_trpt_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -47,7 +47,7 @@
prints = [],
return_value,
- %% Packet retrival and decryption
+ %% Packet retrieval and decryption
decrypted_data_buffer = <<>>,
encrypted_data_buffer = <<>>,
aead_data = <<>>,
@@ -343,7 +343,7 @@ send(S0=#s{alg_neg={undefined,PeerMsg}}, Msg=#ssh_msg_kexinit{}) ->
S1#s{alg = Cx#ssh.algorithms}
catch
Class:Exc ->
- save_prints({"Algoritm negotiation failed at line ~p:~p~n~p:~s~nPeer: ~s~n Own: ~s~n",
+ save_prints({"Algorithm negotiation failed at line ~p:~p~n~p:~s~nPeer: ~s~n Own: ~s~n",
[?MODULE,?LINE,Class,format_msg(Exc),format_msg(PeerMsg),format_msg(Msg)]},
S1)
end;
@@ -361,8 +361,8 @@ send(S0, ssh_msg_kexdh_init) when ?role(S0) == client ->
try ssh_transport:handle_kexinit_msg(PeerMsg, OwnMsg, S0#s.ssh)
catch
Class:Exc ->
- fail("Algoritm negotiation failed!",
- {"Algoritm negotiation failed at line ~p:~p~n~p:~s~nPeer: ~s~n Own: ~s",
+ fail("Algorithm negotiation failed!",
+ {"Algorithm negotiation failed at line ~p:~p~n~p:~s~nPeer: ~s~n Own: ~s",
[?MODULE,?LINE,Class,format_msg(Exc),format_msg(PeerMsg),format_msg(OwnMsg)]},
S0)
end,
@@ -429,7 +429,7 @@ recv(S0 = #s{}) ->
%% Must see hello before binary messages
try_find_crlf(<<>>, S1);
true ->
- %% Has seen hello, therefore no more crlf-messages are alowed.
+ %% Has seen hello, therefore no more crlf-messages are allowed.
S = receive_binary_msg(S1),
case PeerMsg = S#s.return_value of
#ssh_msg_kexinit{} ->
@@ -451,7 +451,7 @@ recv(S0 = #s{}) ->
alg = C#ssh.algorithms}
catch
Class:Exc ->
- save_prints({"Algoritm negotiation failed at line ~p:~p~n~p:~s~nPeer: ~s~n Own: ~s~n",
+ save_prints({"Algorithm negotiation failed at line ~p:~p~n~p:~s~nPeer: ~s~n Own: ~s~n",
[?MODULE,?LINE,Class,format_msg(Exc),format_msg(PeerMsg),format_msg(OwnMsg)]},
S#s{alg_neg = {OwnMsg, PeerMsg}})
end
@@ -650,7 +650,7 @@ ok({error,E}) -> erlang:error(E).
%%%================================================================
%%%
-%%% Formating of records
+%%% Formatting of records
%%%
format_msg(M) -> format_msg(M, 0).
diff --git a/lib/ssh/test/ssh_upgrade_SUITE.erl b/lib/ssh/test/ssh_upgrade_SUITE.erl
index 7c7c93e04b..b96fa896bb 100644
--- a/lib/ssh/test/ssh_upgrade_SUITE.erl
+++ b/lib/ssh/test/ssh_upgrade_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2014-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2014-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -98,7 +98,7 @@ minor_upgrade(Config) when is_list(Config) ->
%%%
%%%----------------------------------------------------------------
-%%% Initialyze system before upgrade test starts.
+%%% Initialize system before upgrade test starts.
%%% Called by ct_release_test:upgrade/4
upgrade_init(CTData, State) ->
{ok, AppUp={_, _, Up, _Down}} = ct_release_test:get_appup(CTData, ssh),
diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml
index 8c63b1d698..1388111ee5 100644
--- a/lib/ssl/doc/src/ssl.xml
+++ b/lib/ssl/doc/src/ssl.xml
@@ -919,6 +919,18 @@ fun(srp, Username :: binary(), UserState :: term()) ->
</datatype>
<datatype>
+ <name name="spawn_opts"/>
+ <desc><p>Configures spawn options of TLS sender and receiver processes.</p>
+ <p>Setting up garbage collection options can be helpful for trade-offs between
+ CPU usage and Memory usage.
+ See <seemfa marker="erts:erlang#spawn_opt/2"><c>erlang:spawn_opt/2</c></seemfa>.</p>
+ <p>For dist connections, default sender option is <c>[...{priority, max}]</c>, this priority
+ option cannot be changed. For all connections, <c>...link</c> is added to receiver and cannot
+ be changed.</p>
+ </desc>
+ </datatype>
+
+ <datatype>
<name name="keep_secrets"/>
<desc><p>Configures a TLS 1.3 connection for keylogging</p>
<p>In order to retrieve keylog information on a TLS 1.3 connection, it must be configured
diff --git a/lib/ssl/examples/certs/Makefile b/lib/ssl/examples/certs/Makefile
index 5c456c6a1a..817ff2b00d 100644
--- a/lib/ssl/examples/certs/Makefile
+++ b/lib/ssl/examples/certs/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2016. All Rights Reserved.
+# Copyright Ericsson AB 2003-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -42,7 +42,7 @@ TARGET_FILES=
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -fr $(TARGET_FILES) *~ *.beam
diff --git a/lib/ssl/examples/src/Makefile b/lib/ssl/examples/src/Makefile
index 7335bb2bb8..8b0435bfc4 100644
--- a/lib/ssl/examples/src/Makefile
+++ b/lib/ssl/examples/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2016. All Rights Reserved.
+# Copyright Ericsson AB 2003-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -fr $(TARGET_FILES) *~ *.beam
diff --git a/lib/ssl/src/Makefile b/lib/ssl/src/Makefile
index 1e55bb497d..789bed5c3f 100644
--- a/lib/ssl/src/Makefile
+++ b/lib/ssl/src/Makefile
@@ -173,7 +173,7 @@ ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/kernel/src \
# Targets
# ----------------------------------------------------
-opt debug: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(DEP_FILE)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(DEP_FILE)
deps: $(DEP_FILE)
diff --git a/lib/ssl/src/inet_tls_dist.erl b/lib/ssl/src/inet_tls_dist.erl
index c234bf81be..f0b5da43b3 100644
--- a/lib/ssl/src/inet_tls_dist.erl
+++ b/lib/ssl/src/inet_tls_dist.erl
@@ -440,7 +440,7 @@ gen_accept_connection(
Driver, AcceptPid, DistCtrl,
MyNode, Allowed, SetupTime, Kernel)
end,
- [link, {priority, max}])).
+ dist_util:net_ticker_spawn_options())).
do_accept(
_Driver, AcceptPid, DistCtrl, MyNode, Allowed, SetupTime, Kernel) ->
@@ -539,7 +539,7 @@ gen_setup(Driver, Node, Type, MyNode, LongOrShortNames, SetupTime) ->
Kernel = self(),
monitor_pid(
spawn_opt(setup_fun(Driver, Kernel, Node, Type, MyNode, LongOrShortNames, SetupTime),
- [link, {priority, max}])).
+ dist_util:net_ticker_spawn_options())).
-spec setup_fun(_,_,_,_,_,_,_) -> fun(() -> no_return()).
setup_fun(Driver, Kernel, Node, Type, MyNode, LongOrShortNames, SetupTime) ->
diff --git a/lib/ssl/src/ssl.app.src b/lib/ssl/src/ssl.app.src
index a43a84f26d..a52b6cc463 100644
--- a/lib/ssl/src/ssl.app.src
+++ b/lib/ssl/src/ssl.app.src
@@ -85,6 +85,6 @@
{applications, [crypto, public_key, kernel, stdlib]},
{env, []},
{mod, {ssl_app, []}},
- {runtime_dependencies, ["stdlib-3.12","public_key-1.11.3","kernel-8.0",
+ {runtime_dependencies, ["stdlib-3.12","public_key-1.11.3","kernel-@OTP-17617@",
"erts-10.0","crypto-5.0", "inets-5.10.7",
"runtime_tools-1.15.1"]}]}.
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index e61ffa6cc9..a0217198ae 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -26,6 +26,7 @@
-module(ssl).
-include_lib("public_key/include/public_key.hrl").
+-include_lib("kernel/include/logger.hrl").
-include("ssl_internal.hrl").
-include("ssl_api.hrl").
@@ -334,7 +335,9 @@
{ssl_imp, ssl_imp()} |
{session_tickets, session_tickets()} |
{key_update_at, key_update_at()} |
- {middlebox_comp_mode, middlebox_comp_mode()}.
+ {middlebox_comp_mode, middlebox_comp_mode()} |
+ {receiver_spawn_opts, spawn_opts()} |
+ {sender_spawn_opts, spawn_opts()}.
-type protocol() :: tls | dtls.
-type handshake_completion() :: hello | full.
@@ -347,7 +350,7 @@
key_id := crypto:key_id(),
password => crypto:password()}. % exported
-type key_pem() :: file:filename().
--type key_password() :: string() | fun(() -> string()).
+-type key_password() :: iodata() | fun(() -> iodata()).
-type cipher_suites() :: ciphers().
-type ciphers() :: [erl_cipher_suite()] |
string(). % (according to old API) exported
@@ -391,6 +394,7 @@
-type middlebox_comp_mode() :: boolean().
-type client_early_data() :: binary().
-type server_early_data() :: disabled | enabled.
+-type spawn_opts() :: [erlang:spawn_opt_option()].
%% -------------------------------------------------------------------------------------------------------
@@ -2299,7 +2303,7 @@ validate_option(partial_chain, Value, _)
when is_function(Value) ->
Value;
validate_option(password, Value, _)
- when is_list(Value) ->
+ when is_list(Value); is_binary(Value) ->
Value;
validate_option(password, Value, _)
when is_function(Value, 0) ->
@@ -2313,6 +2317,9 @@ validate_option(psk_identity, undefined, _) ->
validate_option(psk_identity, Identity, _)
when is_list(Identity), Identity =/= "", length(Identity) =< 65535 ->
binary_filename(Identity);
+validate_option(receiver_spawn_opts, Value, _)
+ when is_list(Value) ->
+ Value;
validate_option(renegotiate_at, Value, _) when is_integer(Value) ->
erlang:min(Value, ?DEFAULT_RENEGOTIATE_AT);
validate_option(reuse_session, undefined, _) ->
@@ -2335,6 +2342,9 @@ validate_option(reuse_sessions, save = Value, _) ->
validate_option(secure_renegotiate, Value, _)
when is_boolean(Value) ->
Value;
+validate_option(sender_spawn_opts, Value, _)
+ when is_list(Value) ->
+ Value;
validate_option(server_name_indication, Value, _)
when is_list(Value) ->
%% RFC 6066, Section 3: Currently, the only server names supported are
@@ -2856,7 +2866,7 @@ maybe_client_warn_no_verify(#{verify := verify_none,
warn_verify_none := true,
log_level := LogLevel}, client) ->
ssl_logger:log(warning, LogLevel, #{description => "Authenticity is not established by certificate path validation",
- reason => "Option {verify, verify_peer} and cacertfile/cacerts is missing"}, #{});
+ reason => "Option {verify, verify_peer} and cacertfile/cacerts is missing"}, ?LOCATION);
maybe_client_warn_no_verify(_,_) ->
%% Warning not needed. Note client certificate validation is optional in TLS
ok.
diff --git a/lib/ssl/src/ssl_gen_statem.erl b/lib/ssl/src/ssl_gen_statem.erl
index 01c6a5beef..6aba9c1b71 100644
--- a/lib/ssl/src/ssl_gen_statem.erl
+++ b/lib/ssl/src/ssl_gen_statem.erl
@@ -102,24 +102,28 @@
%%% Initial Erlang process setup
%%--------------------------------------------------------------------
%%--------------------------------------------------------------------
--spec start_link(client| server, pid(), ssl:host(), inet:port_number(), port(), list(), pid(), tuple()) ->
+-spec start_link(client| server, pid(), ssl:host(), inet:port_number(), port(), tuple(), pid(), tuple()) ->
{ok, pid()} | ignore | {error, reason()}.
%%
%% Description: Creates a process which calls Module:init/1 to
%% choose appropriat gen_statem and initialize.
%%--------------------------------------------------------------------
-start_link(Role, Sender, Host, Port, Socket, Options, User, CbInfo) ->
- {ok, proc_lib:spawn_link(?MODULE, init, [[Role, Sender, Host, Port, Socket, Options, User, CbInfo]])}.
+start_link(Role, Sender, Host, Port, Socket, {#{receiver_spawn_opts := ReceiverOpts}, _, _} = Options, User, CbInfo) ->
+ Opts = [link | proplists:delete(link, ReceiverOpts)],
+ Pid = proc_lib:spawn_opt(?MODULE, init, [[Role, Sender, Host, Port, Socket, Options, User, CbInfo]], Opts),
+ {ok, Pid}.
%%--------------------------------------------------------------------
--spec start_link(atom(), ssl:host(), inet:port_number(), port(), list(), pid(), tuple()) ->
+-spec start_link(atom(), ssl:host(), inet:port_number(), port(), tuple(), pid(), tuple()) ->
{ok, pid()} | ignore | {error, reason()}.
%%
%% Description: Creates a gen_statem process which calls Module:init/1 to
%% initialize.
%%--------------------------------------------------------------------
-start_link(Role, Host, Port, Socket, Options, User, CbInfo) ->
- {ok, proc_lib:spawn_link(?MODULE, init, [[Role, Host, Port, Socket, Options, User, CbInfo]])}.
+start_link(Role, Host, Port, Socket, {#{receiver_spawn_opts := ReceiverOpts}, _, _} = Options, User, CbInfo) ->
+ Opts = [link | proplists:delete(link, ReceiverOpts)],
+ Pid = proc_lib:spawn_opt(?MODULE, init, [[Role, Host, Port, Socket, Options, User, CbInfo]], Opts),
+ {ok, Pid}.
%%--------------------------------------------------------------------
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl
index 837f7c0249..a109e30f18 100644
--- a/lib/ssl/src/ssl_handshake.erl
+++ b/lib/ssl/src/ssl_handshake.erl
@@ -2081,7 +2081,7 @@ digitally_signed(Version, Msg, HashAlgo, PrivateKey, SignAlgo) ->
Signature ->
Signature
catch
- error:badkey->
+ error:_ ->
throw(?ALERT_REC(?FATAL, ?HANDSHAKE_FAILURE, bad_key(PrivateKey)))
end.
diff --git a/lib/ssl/src/ssl_internal.hrl b/lib/ssl/src/ssl_internal.hrl
index a611f237d0..4e87ea0acb 100644
--- a/lib/ssl/src/ssl_internal.hrl
+++ b/lib/ssl/src/ssl_internal.hrl
@@ -154,6 +154,7 @@
hibernate_after => {infinity, [versions]},
honor_cipher_order => {false, [versions]},
honor_ecc_order => {undefined, [versions]},
+ keep_secrets => {false, [versions]},
key => {undefined, [versions]},
keyfile => {undefined, [versions,
certfile]},
@@ -177,11 +178,12 @@
password => {"", [versions]},
protocol => {tls, []},
psk_identity => {undefined, [versions]},
+ receiver_spawn_opts => {[], [versions]},
renegotiate_at => {?DEFAULT_RENEGOTIATE_AT, [versions]},
reuse_session => {undefined, [versions]},
reuse_sessions => {true, [versions]},
secure_renegotiate => {true, [versions]},
- keep_secrets => {false, [versions]},
+ sender_spawn_opts => {[], [versions]},
server_name_indication => {undefined, [versions]},
session_tickets => {disabled, [versions]},
signature_algs => {undefined, [versions]},
diff --git a/lib/ssl/src/tls_gen_connection.erl b/lib/ssl/src/tls_gen_connection.erl
index 89cc945e21..7ec2df936f 100644
--- a/lib/ssl/src/tls_gen_connection.erl
+++ b/lib/ssl/src/tls_gen_connection.erl
@@ -70,20 +70,19 @@
close/4,
protocol_name/0]).
--define(DIST_CNTRL_SPAWN_OPTS, [{priority, max}]).
-
%%====================================================================
%% Internal application API
%%====================================================================
%%====================================================================
%% Setup
%%====================================================================
-start_fsm(Role, Host, Port, Socket, {#{erl_dist := false},_, Trackers} = Opts,
- User, {CbModule, _,_, _, _} = CbInfo,
+start_fsm(Role, Host, Port, Socket,
+ {#{erl_dist := false, sender_spawn_opts := SenderOpts}, _, Trackers} = Opts,
+ User, {CbModule, _, _, _, _} = CbInfo,
Timeout) ->
- try
- {ok, DynSup} = tls_connection_sup:start_child([]),
- {ok, Sender} = tls_dyn_connection_sup:start_child(DynSup, sender, []),
+ try
+ {ok, DynSup} = tls_connection_sup:start_child([]),
+ {ok, Sender} = tls_dyn_connection_sup:start_child(DynSup, sender, [[{spawn_opt, SenderOpts}]]),
{ok, Pid} = tls_dyn_connection_sup:start_child(DynSup, receiver, [Role, Sender, Host, Port, Socket,
Opts, User, CbInfo]),
{ok, SslSocket} = ssl_gen_statem:socket_control(?MODULE, Socket, [Pid, Sender], CbModule, Trackers),
@@ -93,12 +92,14 @@ start_fsm(Role, Host, Port, Socket, {#{erl_dist := false},_, Trackers} = Opts,
Error
end;
-start_fsm(Role, Host, Port, Socket, {#{erl_dist := true},_, Trackers} = Opts,
- User, {CbModule, _,_, _, _} = CbInfo,
+start_fsm(Role, Host, Port, Socket,
+ {#{erl_dist := true, sender_spawn_opts := SenderOpts}, _, Trackers} = Opts,
+ User, {CbModule, _, _, _, _} = CbInfo,
Timeout) ->
- try
- {ok, DynSup} = tls_connection_sup:start_child_dist([]),
- {ok, Sender} = tls_dyn_connection_sup:start_child(DynSup, sender, [[{spawn_opt, ?DIST_CNTRL_SPAWN_OPTS}]]),
+ try
+ SenderOpts1 = [{priority, max} | proplists:delete(priority, SenderOpts)],
+ {ok, DynSup} = tls_connection_sup:start_child_dist([]),
+ {ok, Sender} = tls_dyn_connection_sup:start_child(DynSup, sender, [[{spawn_opt, SenderOpts1}]]),
{ok, Pid} = tls_dyn_connection_sup:start_child(DynSup, receiver, [Role, Sender, Host, Port, Socket,
Opts, User, CbInfo]),
{ok, SslSocket} = ssl_gen_statem:socket_control(?MODULE, Socket, [Pid, Sender], CbModule, Trackers),
diff --git a/lib/ssl/src/tls_socket.erl b/lib/ssl/src/tls_socket.erl
index 80073952fc..779043f1de 100644
--- a/lib/ssl/src/tls_socket.erl
+++ b/lib/ssl/src/tls_socket.erl
@@ -391,10 +391,10 @@ code_change(_OldVsn, State, _Extra) ->
call(Pid, Msg) ->
gen_server:call(Pid, Msg, infinity).
-start_tls_server_connection(SslOpts, ConnectionCb, Transport, Port, Socket, EmOpts, Trackers, CbInfo) ->
+start_tls_server_connection(#{sender_spawn_opts := SenderOpts} = SslOpts, ConnectionCb, Transport, Port, Socket, EmOpts, Trackers, CbInfo) ->
try
{ok, DynSup} = tls_connection_sup:start_child([]),
- {ok, Sender} = tls_dyn_connection_sup:start_child(DynSup, sender, []),
+ {ok, Sender} = tls_dyn_connection_sup:start_child(DynSup, sender, [[{spawn_opt, SenderOpts}]]),
ConnArgs = [server, Sender, "localhost", Port, Socket,
{SslOpts, emulated_socket_options(EmOpts, #socket_options{}), Trackers}, self(), CbInfo],
{ok, Pid} = tls_dyn_connection_sup:start_child(DynSup, receiver, ConnArgs),
diff --git a/lib/ssl/test/Makefile b/lib/ssl/test/Makefile
index 7b7534bce8..9272ab0988 100644
--- a/lib/ssl/test/Makefile
+++ b/lib/ssl/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2021. All Rights Reserved.
+# Copyright Ericsson AB 1999-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -148,7 +148,7 @@ ERL_COMPILE_FLAGS += $(INCLUDES)
# Targets
# ----------------------------------------------------
-tests debug opt: $(BUILDTARGET)
+tests $(TYPES): $(BUILDTARGET)
targets: $(TARGET_FILES)
@@ -177,7 +177,7 @@ release_spec: opt
release_tests_spec: opt
$(INSTALL_DIR) "$(RELSYSDIR)"
$(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(HRL_FILES_NEEDED_IN_TEST) $(COVER_FILE) "$(RELSYSDIR)"
- $(INSTALL_DATA) ssl.spec ssl_bench.spec ssl.cover "$(RELSYSDIR)"
+ $(INSTALL_DATA) ssl.spec ssl_bench.spec ssl_gh.spec ssl.cover "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
@tar cf - *_SUITE_data property_test | (cd "$(RELSYSDIR)"; tar xf -)
diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl
index 573337e134..e5d9ed14b8 100644
--- a/lib/ssl/test/ssl_basic_SUITE.erl
+++ b/lib/ssl/test/ssl_basic_SUITE.erl
@@ -54,6 +54,8 @@
cipher_format/1,
tls_versions_option/0,
tls_versions_option/1,
+ spawn_opts_option/0,
+ spawn_opts_option/1,
eccs/0,
eccs/1,
cipher_suites/0,
@@ -83,6 +85,7 @@
result_ok/1,
protocol_info_result/1,
version_info_result/1,
+ min_heap_size_info/1,
connect_dist_s/1,
connect_dist_c/1,
dummy/1
@@ -119,6 +122,7 @@ basic_tests() ->
fallback,
cipher_format,
tls_versions_option,
+ spawn_opts_option,
eccs,
cipher_suites,
cipher_suites_mix,
@@ -444,6 +448,29 @@ tls_versions_option(Config) when is_list(Config) ->
end,
ssl_test_lib:check_client_alert(ErrClient, protocol_version).
+spawn_opts_option() ->
+ [{doc,"Test API spawn_opts option to sender/receiver."}].
+spawn_opts_option(Config) when is_list(Config) ->
+ ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+ ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, min_heap_size_info, []}},
+ {options, [{sender_spawn_opts, [{min_heap_size, 1598}]},
+ {receiver_spawn_opts, [{min_heap_size, 2586}]} | ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE, min_heap_size_info, []}},
+ {options, [{sender_spawn_opts, [{min_heap_size, 1598}]},
+ {receiver_spawn_opts, [{min_heap_size, 2586}]} | ClientOpts]}]),
+
+ ssl_test_lib:check_result(Server, {ok, 2586, 1598}, Client, {ok, 2586, 1598}).
+
fake_root() ->
[{doc,"Test that we can not use a fake root signed by other key but with correct name and serial number."}].
fake_root(Config) when is_list(Config) ->
@@ -775,6 +802,11 @@ version_info_result(Socket) ->
{ok, [{version, Version}]} = ssl:connection_information(Socket, [version]),
{ok, Version}.
+min_heap_size_info(#sslsocket{pid = [Receiver, Sender]}) ->
+ {garbage_collection, ReceiverGc} = process_info(Receiver, garbage_collection),
+ {garbage_collection, SenderGc} = process_info(Sender, garbage_collection),
+ {ok, proplists:get_value(min_heap_size, ReceiverGc), proplists:get_value(min_heap_size, SenderGc)}.
+
connect_dist_s(S) ->
Msg = term_to_binary({erlang,term}),
diff --git a/lib/ssl/test/ssl_dist_SUITE.erl b/lib/ssl/test/ssl_dist_SUITE.erl
index 854c349689..79e4859b8c 100644
--- a/lib/ssl/test/ssl_dist_SUITE.erl
+++ b/lib/ssl/test/ssl_dist_SUITE.erl
@@ -54,6 +54,8 @@
listen_options/1,
connect_options/0,
connect_options/1,
+ net_ticker_spawn_options/0,
+ net_ticker_spawn_options/1,
use_interface/0,
use_interface/1,
verify_fun_fail/0,
@@ -74,6 +76,7 @@
listen_options_test/3,
do_connect_options/2,
connect_options_test/3,
+ net_ticker_spawn_options_test/3,
verify_fun_fail_test/3,
verify_fun_pass_test/3,
verify_pass_always/3,
@@ -111,6 +114,7 @@ all() ->
listen_port_options,
listen_options,
connect_options,
+ net_ticker_spawn_options,
use_interface,
verify_fun_fail,
verify_fun_pass,
@@ -339,6 +343,22 @@ connect_options() ->
connect_options(Config) when is_list(Config) ->
try_setting_priority(fun do_connect_options/2, Config).
+%%--------------------------------------------------------------------
+net_ticker_spawn_options() ->
+ [{doc, "Test net_ticker_spawn_options"}].
+net_ticker_spawn_options(Config) when is_list(Config) ->
+ FullsweepString0 = "[{fullsweep_after,0}]",
+ FullsweepString =
+ case os:cmd("echo [{a,1}]") of
+ "[{a,1}]"++_ ->
+ FullsweepString0;
+ _ ->
+ %% Some shells need quoting of [{}]
+ "'"++FullsweepString0++"'"
+ end,
+ Options = "-kernel net_ticker_spawn_options "++FullsweepString,
+ gen_dist_test(net_ticker_spawn_options_test, [{tls_only_basic_opts, Options} | Config]).
+
%%--------------------------------------------------------------------
use_interface() ->
@@ -693,6 +713,23 @@ connect_options_test(NH1, NH2, Config) ->
%% Node 2 will not, since it only applies to outbound connections.
[] = Elevated2.
+net_ticker_spawn_options_test(NH1, NH2, _Config) ->
+ Node1 = NH1#node_handle.nodename,
+ Node2 = NH2#node_handle.nodename,
+
+ pong = apply_on_ssl_node(NH1, fun () -> net_adm:ping(Node2) end),
+
+ FullsweepOptionNode1 =
+ apply_on_ssl_node(NH1, fun () -> get_dist_util_fullsweep_option(Node2) end),
+ FullsweepOptionNode2 =
+ apply_on_ssl_node(NH2, fun () -> get_dist_util_fullsweep_option(Node1) end),
+
+ ct:pal("FullsweepOptionNode1: ~p~n", [FullsweepOptionNode1]),
+ ct:pal("FullsweepOptionNode2: ~p~n", [FullsweepOptionNode2]),
+
+ 0 = FullsweepOptionNode1,
+ 0 = FullsweepOptionNode2.
+
verify_fun_fail_test(NH1, NH2, _) ->
Node2 = NH2#node_handle.nodename,
@@ -734,6 +771,14 @@ get_socket_priorities() ->
{ok,[{priority,Priority}]} <-
[inet:getopts(Port, [priority]) || Port <- inet_ports()]].
+get_dist_util_fullsweep_option(Node) ->
+ SenderPid = proplists:get_value(Node, erlang:system_info(dist_ctrl)),
+ {links, Links1} = erlang:process_info(SenderPid, links),
+ {links, Links2} = erlang:process_info(whereis(net_kernel), links),
+ [DistUtilPid] = [X || X <- Links1, Y <- Links2, X =:= Y],
+ {garbage_collection, GCOpts} = erlang:process_info(DistUtilPid, garbage_collection),
+ proplists:get_value(fullsweep_after, GCOpts).
+
inet_ports() ->
[Port || Port <- erlang:ports(),
element(2, erlang:port_info(Port, name)) =:= "tcp_inet"].
diff --git a/lib/ssl/test/ssl_gh.spec b/lib/ssl/test/ssl_gh.spec
new file mode 100644
index 0000000000..6942caa68e
--- /dev/null
+++ b/lib/ssl/test/ssl_gh.spec
@@ -0,0 +1,15 @@
+% {merge_tests,false}.
+{alias,dir,"../ssl_test"}.
+
+{suites,dir,all}.
+{skip_suites,dir,[openssl_ocsp_SUITE],"Unstable testcases"}.
+{skip_groups,all_nodes, dir, openssl_session_ticket_SUITE, 'openssl_server',
+ {cases,[openssl_server_hrr]},"Unstable testcases"}.
+{skip_groups,dir,ssl_bench_SUITE,setup,"Benchmarks run separately"}.
+{skip_groups,dir,ssl_bench_SUITE,payload,"Benchmarks run separately"}.
+{skip_groups,dir,ssl_bench_SUITE,pem_cache,"Benchmarks run separately"}.
+{skip_groups,dir,ssl_dist_bench_SUITE,setup,"Benchmarks run separately"}.
+{skip_groups,dir,ssl_dist_bench_SUITE,roundtrip,"Benchmarks run separately"}.
+{skip_groups,dir,ssl_dist_bench_SUITE,throughput,"Benchmarks run separately"}.
+{skip_groups,dir,ssl_dist_bench_SUITE,sched_utilization,"Benchmarks run separately"}.
+
diff --git a/lib/stdlib/Makefile b/lib/stdlib/Makefile
index 45ca3f3b6a..f1db3c77e3 100644
--- a/lib/stdlib/Makefile
+++ b/lib/stdlib/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -37,5 +37,14 @@ SPECIAL_TARGETS =
include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=compiler crypto
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
+
+# Enable feature maybe_expr in runtime when running tests.
+# This is very non local and somewhat ugly.
+.PHONY: test
+test:
+ $(MAKE) TEST_NEEDS_RELEASE=$(TEST_NEEDS_RELEASE) \
+ ERL_ARGS="-enable-feature maybe_expr $(ERL_ARGS)" \
+ -f $(ERL_TOP)/make/app_targets.mk $@
diff --git a/lib/stdlib/doc/src/Makefile b/lib/stdlib/doc/src/Makefile
index 8bbf5b3800..8e60498fd6 100644
--- a/lib/stdlib/doc/src/Makefile
+++ b/lib/stdlib/doc/src/Makefile
@@ -74,6 +74,7 @@ XML_REF3_FILES = \
ms_transform.xml \
orddict.xml \
ordsets.xml \
+ peer.xml \
pool.xml \
proc_lib.xml \
proplists.xml \
diff --git a/lib/stdlib/doc/src/array.xml b/lib/stdlib/doc/src/array.xml
index 7764831eb5..bfe97c7f89 100644
--- a/lib/stdlib/doc/src/array.xml
+++ b/lib/stdlib/doc/src/array.xml
@@ -300,7 +300,7 @@ A3 = array:fix(A2).</pre>
<fsummary>Create a new array according to the specified options.
</fsummary>
<desc>
- <p>Creates a new array according to the specified otions. By default,
+ <p>Creates a new array according to the specified options. By default,
the array is extendible and has initial size zero. Array indices
start at <c>0</c>.</p>
<p><c><anno>Options</anno></c> is a single term or a list of terms,
diff --git a/lib/stdlib/doc/src/beam_lib.xml b/lib/stdlib/doc/src/beam_lib.xml
index bc550c1494..62c9504a01 100644
--- a/lib/stdlib/doc/src/beam_lib.xml
+++ b/lib/stdlib/doc/src/beam_lib.xml
@@ -138,8 +138,11 @@ io:fwrite("~s~n", [erl_prettypr:format(erl_syntax:form_list(AC))]).</code>
<section>
<title>.erlang.crypt</title>
<p><c>beam_lib</c> searches for <c>.erlang.crypt</c> in the current
- directory and then the home directory for the current user. If
- the file is found and contains a key, <c>beam_lib</c>
+ directory, then the <seeerl marker="erts:init#home">
+ user&apos;s home directory</seeerl> and then
+ <seeerl marker="stdlib:filename#user_config">
+ <c>filename:basedir(user_config, "erlang")</c></seeerl>.
+ If the file is found and contains a key, <c>beam_lib</c>
implicitly creates a crypto key fun and registers it.</p>
<p>File <c>.erlang.crypt</c> is to contain a single list of tuples:</p>
diff --git a/lib/stdlib/doc/src/calendar.xml b/lib/stdlib/doc/src/calendar.xml
index 213bca365d..fd42939a81 100644
--- a/lib/stdlib/doc/src/calendar.xml
+++ b/lib/stdlib/doc/src/calendar.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2020</year>
+ <year>1996</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -124,6 +124,13 @@
<datatype>
<name name="weeknum"/>
</datatype>
+ <datatype>
+ <name name="rfc3339_time_unit"/>
+ <desc><note><p>
+ The <c>native</c> time unit was added to <c>rfc3339_time_unit()</c>
+ in OTP 25.0.</p></note>
+ </desc>
+ </datatype>
</datatypes>
<funcs>
@@ -321,7 +328,6 @@
<name name="rfc3339_to_system_time" arity="2" since="OTP 21.0"/>
<fsummary>Convert from RFC 3339 timestamp to system time.</fsummary>
<type name="rfc3339_string"/>
- <type name="rfc3339_time_unit"/>
<desc>
<p>Converts an RFC 3339 timestamp into system time. The data format
of RFC 3339 timestamps is described by
@@ -378,7 +384,6 @@
<fsummary>Convert from system to RFC 3339 timestamp.</fsummary>
<type name="offset"/>
<type name="rfc3339_string"/>
- <type name="rfc3339_time_unit"/>
<desc>
<p>Converts a system time into an RFC 3339 timestamp. The data format
of RFC 3339 timestamps is described by
@@ -401,12 +406,13 @@
<tag><c>{unit, Unit}</c></tag>
<item><p>The time unit of <c><anno>Time</anno></c>. The
default is <c>second</c>. If some other unit is given
- (<c>millisecond</c>, <c>microsecond</c>, or
- <c>nanosecond</c>), the formatted string includes a
+ (<c>millisecond</c>, <c>microsecond</c>, <c>nanosecond</c>, or
+ <c>native</c>), the formatted string includes a
fraction of a second. The number of fractional second
digits is three, six, or nine depending on what time unit
- is chosen. Notice that trailing zeros are not removed from
- the fraction.
+ is chosen. For <c>native</c> three fractional digits are
+ included. Notice that trailing zeros are not removed from the
+ fraction.
</p>
</item>
</taglist>
diff --git a/lib/stdlib/doc/src/erl_eval.xml b/lib/stdlib/doc/src/erl_eval.xml
index 41566d9aec..45d9a150ea 100644
--- a/lib/stdlib/doc/src/erl_eval.xml
+++ b/lib/stdlib/doc/src/erl_eval.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -273,10 +273,13 @@ Func(Name, Arguments, Bindings)</code>
<taglist>
<tag><c>{value,Func}</c></tag>
<item>
- <p>This defines a non-local function handler that is called with:</p>
- <code type="none">
-Func(FuncSpec, Arguments)</code>
- <p><c>FuncSpec</c> is the name of the function on the form
+ <p>This defines a non-local function handler. The function
+ may be called with two arguments:</p>
+ <code type="none">Func(FuncSpec, Arguments)</code>
+ <p>or three arguments:</p>
+ <code type="none">Func(Anno, FuncSpec, Arguments)</code>
+ <p><c>Anno</c> is the <c>erl_anno:anno()</c> of the node,
+ <c>FuncSpec</c> is the name of the function on the form
<c>{Module,Function}</c> or a fun, and <c>Arguments</c> is a
list of the <em>evaluated</em> arguments. The function
handler returns the value of the function. To
diff --git a/lib/stdlib/doc/src/erl_pp.xml b/lib/stdlib/doc/src/erl_pp.xml
index 79b85eb06a..721a567faa 100644
--- a/lib/stdlib/doc/src/erl_pp.xml
+++ b/lib/stdlib/doc/src/erl_pp.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>1996</year>
- <year>2021</year>
+ <year>2022</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -45,6 +45,14 @@
<p>All functions can have an optional argument, which specifies a hook
that is called if an attempt is made to print an unknown form.</p>
+
+ <p>Note that if the functions in this module are used to convert
+ abstract code back to Erlang source code, the enclosing function
+ should first be processed by <seemfa
+ marker="#legalize_vars/1"><c>legalize_vars/1</c></seemfa> in order
+ to ensure that the output is semantically equivalent to the
+ abstract code.</p>
+
</description>
<datatypes>
@@ -146,6 +154,29 @@
but only for the guard test <c><anno>Guard</anno></c>.</p>
</desc>
</func>
+
+ <func>
+ <name name="legalize_vars" arity="1" since="OTP @OTP-17742@"/>
+ <fsummary>Ensure all variable names are valid.</fsummary>
+ <desc>
+ <p>The Erlang compiler will, when expanding records to tuples,
+ introduce new variables in the abstract representation. As the
+ expansion is done on the abstract representation, the compiler
+ can safely name the new variables with names that are not
+ syntactically valid in Erlang source code (the name starts
+ with a lowercase letter), thus ensuring the uniqueness of the
+ new names.</p>
+
+ <p>The above strategy leads to problems if a user wants to
+ convert the abstract representation, using the functions of
+ this module back to Erlang source code. Typically, pattern
+ variables are output as atoms thus changing the sematics of
+ the program. To solve this problem <c>legalize_vars/1</c>,
+ when run on the abstract representation of a function, will
+ return an equivalent function where all variables will have
+ syntactically valid names.</p>
+ </desc>
+ </func>
</funcs>
<section>
diff --git a/lib/stdlib/doc/src/ets.xml b/lib/stdlib/doc/src/ets.xml
index 8f4c013145..7aa5bb52a8 100644
--- a/lib/stdlib/doc/src/ets.xml
+++ b/lib/stdlib/doc/src/ets.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -283,7 +283,7 @@ true
<datatypes>
<datatype>
- <name name="access"/>
+ <name name="table_access"/>
</datatype>
<datatype>
<name>continuation()</name>
@@ -297,17 +297,17 @@ true
</datatype>
<datatype>
<name name="match_spec"/>
- <desc><p>A match specification, see above.</p></desc>
+ <desc><p>A match specification, see <seeerl marker="#match_spec">Match Specifications</seeerl>.</p></desc>
</datatype>
<datatype>
- <name name="comp_match_spec"/>
+ <name name="compiled_match_spec"/>
<desc><p>A compiled match specification.</p></desc>
</datatype>
<datatype>
<name name="match_pattern"/>
</datatype>
<datatype>
- <name name="tab"/>
+ <name name="table"/>
</datatype>
<datatype>
<name name="tid"/>
@@ -315,7 +315,7 @@ true
<seemfa marker="#new/2"><c>new/2</c></seemfa>.</p></desc>
</datatype>
<datatype>
- <name name="type"/>
+ <name name="table_type"/>
</datatype>
</datatypes>
@@ -339,7 +339,7 @@ true
<name name="delete" arity="1" since=""/>
<fsummary>Delete an entire ETS table.</fsummary>
<desc>
- <p>Deletes the entire table <c><anno>Tab</anno></c>.</p>
+ <p>Deletes the entire table <c><anno>Table</anno></c>.</p>
</desc>
</func>
@@ -349,7 +349,8 @@ true
table.</fsummary>
<desc>
<p>Deletes all objects with key <c><anno>Key</anno></c> from table
- <c><anno>Tab</anno></c>.</p>
+ <c><anno>Table</anno></c>. This function succeeds even if
+ no objects with key <c><anno>Key</anno></c> exist.</p>
</desc>
</func>
@@ -357,7 +358,7 @@ true
<name name="delete_all_objects" arity="1" since=""/>
<fsummary>Delete all objects in an ETS table.</fsummary>
<desc>
- <p>Delete all objects in the ETS table <c><anno>Tab</anno></c>.
+ <p>Delete all objects in the ETS table <c><anno>Table</anno></c>.
The operation is guaranteed to be
<seeerl marker="#concurrency">atomic and isolated</seeerl>.</p>
</desc>
@@ -382,7 +383,7 @@ true
<p>Reads a file produced by <seemfa marker="#tab2file/2">
<c>tab2file/2</c></seemfa> or
<seemfa marker="#tab2file/3"><c>tab2file/3</c></seemfa> and
- creates the corresponding table <c><anno>Tab</anno></c>.</p>
+ creates the corresponding table <c><anno>Table</anno></c>.</p>
<p>Equivalent to <c>file2tab(<anno>Filename</anno>, [])</c>.</p>
</desc>
</func>
@@ -394,7 +395,7 @@ true
<p>Reads a file produced by <seemfa marker="#tab2file/2">
<c>tab2file/2</c></seemfa> or <seemfa marker="#tab2file/3">
<c>tab2file/3</c></seemfa> and creates the
- corresponding table <c><anno>Tab</anno></c>.</p>
+ corresponding table <c><anno>Table</anno></c>.</p>
<p>The only supported option is <c>{verify,boolean()}</c>.
If verification is turned on (by specifying <c>{verify,true}</c>),
the function uses whatever information is present in the file to
@@ -424,7 +425,7 @@ true
<fsummary>Return the first key in an ETS table.</fsummary>
<desc>
<p>Returns the first key <c><anno>Key</anno></c> in table
- <c><anno>Tab</anno></c>. For an <c>ordered_set</c> table, the first
+ <c><anno>Table</anno></c>. For an <c>ordered_set</c> table, the first
key in Erlang term order is returned. For other
table types, the first key according to the internal
order of the table is returned. If the table is empty,
@@ -554,8 +555,8 @@ Error: fun containing local Erlang function calls
<fsummary>Change owner of a table.</fsummary>
<desc>
<p>Make process <c><anno>Pid</anno></c> the new owner of table
- <c><anno>Tab</anno></c>. If successful, message
- <c>{'ETS-TRANSFER',<anno>Tab</anno>,FromPid,<anno>GiftData</anno>}</c>
+ <c><anno>Table</anno></c>. If successful, message
+ <c>{'ETS-TRANSFER',<anno>Table</anno>,FromPid,<anno>GiftData</anno>}</c>
is sent to the new owner.</p>
<p>The process <c><anno>Pid</anno></c> must be alive, local, and not
already the owner of the table.
@@ -580,7 +581,7 @@ Error: fun containing local Erlang function calls
<name name="i" arity="1" since=""/>
<fsummary>Browse an ETS table on a terminal.</fsummary>
<desc>
- <p>Browses table <c><anno>Tab</anno></c> on a terminal.</p>
+ <p>Browses table <c><anno>Table</anno></c> on a terminal.</p>
</desc>
</func>
@@ -588,10 +589,10 @@ Error: fun containing local Erlang function calls
<name name="info" arity="1" since=""/>
<fsummary>Return information about an <c>table</c>.</fsummary>
<desc>
- <p>Returns information about table <c><anno>Tab</anno></c> as a list of
- tuples. If <c><anno>Tab</anno></c> has the correct type
+ <p>Returns information about table <c><anno>Table</anno></c> as a list of
+ tuples. If <c><anno>Table</anno></c> has the correct type
for a table identifier, but does not refer to an existing ETS
- table, <c>undefined</c> is returned. If <c><anno>Tab</anno></c> is
+ table, <c>undefined</c> is returned. If <c><anno>Table</anno></c> is
not of the correct type, a <c>badarg</c> exception is raised.</p>
<taglist>
<tag><c>{compressed, boolean()}</c></tag>
@@ -616,7 +617,7 @@ Error: fun containing local Erlang function calls
<item>
<p>The key position.</p>
</item>
- <tag><c>{memory, integer() >= 0</c></tag>
+ <tag><c>{memory, integer() >= 0}</c></tag>
<item>
<p>The number of words allocated to the table.</p>
</item>
@@ -637,16 +638,16 @@ Error: fun containing local Erlang function calls
<item>
<p>The pid of the owner of the table.</p>
</item>
- <tag><c>{protection,</c> <seetype marker="#access">
+ <tag><c>{protection,</c> <seetype marker="#table_access">
<c>access()</c></seetype><c>}</c></tag>
<item>
<p>The table access rights.</p>
</item>
- <tag><c>{size, integer() >= 0</c></tag>
+ <tag><c>{size, integer() >= 0}</c></tag>
<item>
<p>The number of objects inserted in the table.</p>
</item>
- <tag><c>{type,</c> <seetype marker="#type">
+ <tag><c>{type,</c> <seetype marker="#table_type">
<c>type()</c></seetype><c>}</c></tag>
<item>
<p>The table type.</p>
@@ -656,9 +657,9 @@ Error: fun containing local Erlang function calls
<p>Indicates whether the table uses <c>read_concurrency</c> or
not.</p>
</item>
- <tag><c>{write_concurrency, boolean()}</c></tag>
+ <tag><c>{write_concurrency, WriteConcurrencyAlternative}</c></tag>
<item>
- <p>Indicates whether the table uses <c>write_concurrency</c>.</p>
+ <p>Indicates which <c>write_concurrency</c> option the table uses.</p>
</item>
</taglist>
<note><p>The execution time of this function is affected by
@@ -677,9 +678,9 @@ Error: fun containing local Erlang function calls
an ETS table.</fsummary>
<desc>
<p>Returns the information associated with <c>Item</c> for table
- <c><anno>Tab</anno></c>, or returns <c>undefined</c> if <c>Tab</c>
+ <c><anno>Table</anno></c>, or returns <c>undefined</c> if <c>Table</c>
does not refer an existing ETS table. If
- <c><anno>Tab</anno></c> is
+ <c><anno>Table</anno></c> is
not of the correct type, or if <c><anno>Item</anno></c> is not
one of the allowed values, a <c>badarg</c> exception is raised.</p>
<p>In addition to the <c>{<anno>Item</anno>,<anno>Value</anno>}</c>
@@ -769,7 +770,7 @@ Error: fun containing local Erlang function calls
<name name="init_table" arity="2" since=""/>
<fsummary>Replace all objects of an ETS table.</fsummary>
<desc>
- <p>Replaces the existing objects of table <c><anno>Tab</anno></c> with
+ <p>Replaces the existing objects of table <c><anno>Table</anno></c> with
objects created by calling the input function
<c><anno>InitFun</anno></c>,
see below. This function is provided for compatibility with
@@ -801,7 +802,7 @@ Error: fun containing local Erlang function calls
<desc>
<p>Inserts the object or all of the objects in list
<c><anno>ObjectOrObjects</anno></c> into table
- <c><anno>Tab</anno></c>.</p>
+ <c><anno>Table</anno></c>.</p>
<list type="bulleted">
<item>
<p>If the table type is <c>set</c> and the key of the inserted
@@ -880,7 +881,7 @@ Error: fun containing local Erlang function calls
<c>ordered_set</c>.</fsummary>
<desc>
<p>Returns the last key <c><anno>Key</anno></c> according to Erlang
- term order in table <c>Tab</c> of type <c>ordered_set</c>. For
+ term order in table <c>Table</c> of type <c>ordered_set</c>. For
other table types, the function is synonymous to
<seemfa marker="#first/1"><c>first/1</c></seemfa>.
If the table is empty, <c>'$end_of_table'</c> is returned.</p>
@@ -895,7 +896,7 @@ Error: fun containing local Erlang function calls
</fsummary>
<desc>
<p>Returns a list of all objects with key <c><anno>Key</anno></c> in
- table <c><anno>Tab</anno></c>.</p>
+ table <c><anno>Table</anno></c>.</p>
<list type="bulleted">
<item>
<p>For tables of type <c>set</c>, <c>bag</c>, or
@@ -934,7 +935,7 @@ Error: fun containing local Erlang function calls
<fsummary>Return the <c>Pos</c>:th element of all objects with a
specified key in an ETS table.</fsummary>
<desc>
- <p>For a table <c><anno>Tab</anno></c> of type <c>set</c> or
+ <p>For a table <c><anno>Table</anno></c> of type <c>set</c> or
<c>ordered_set</c>, the function returns the
<c><anno>Pos</anno></c>:th
element of the object with key <c><anno>Key</anno></c>.</p>
@@ -971,7 +972,7 @@ Error: fun containing local Erlang function calls
<fsummary>Match the objects in an ETS table against a pattern.
</fsummary>
<desc>
- <p>Matches the objects in table <c><anno>Tab</anno></c> against
+ <p>Matches the objects in table <c><anno>Table</anno></c> against
pattern <c><anno>Pattern</anno></c>.</p>
<p>A pattern is a term that can contain:</p>
<list type="bulleted">
@@ -1026,7 +1027,7 @@ Error: fun containing local Erlang function calls
ETS table.</fsummary>
<desc>
<p>Deletes all objects that match pattern <c><anno>Pattern</anno></c>
- from table <c><anno>Tab</anno></c>. For a description of patterns,
+ from table <c><anno>Table</anno></c>. For a description of patterns,
see <seemfa marker="#match/2"><c>match/2</c></seemfa>.</p>
</desc>
</func>
@@ -1051,7 +1052,7 @@ Error: fun containing local Erlang function calls
<fsummary>Match the objects in an ETS table against a pattern.
</fsummary>
<desc>
- <p>Matches the objects in table <c><anno>Tab</anno></c> against
+ <p>Matches the objects in table <c><anno>Table</anno></c> against
pattern <c><anno>Pattern</anno></c>. For a description of patterns,
see <seemfa marker="#match/2"><c>match/2</c></seemfa>.
The function returns a list of all objects that
@@ -1258,17 +1259,24 @@ ets:select(Table, MatchSpec),</code>
when the owner terminates.</p>
<marker id="new_2_write_concurrency"></marker>
</item>
- <tag><c>{write_concurrency,boolean()}</c></tag>
+ <tag><c>{write_concurrency,WriteConcurrencyAlternative}</c></tag>
<item>
<p>Performance tuning. Defaults to <c>false</c>, in which case an
operation that
mutates (writes to) the table obtains exclusive access,
blocking any concurrent access of the same table until finished.
- If set to <c>true</c>, the table is optimized to concurrent
+ If set to <c>true</c>, the table is optimized for concurrent
write access. Different objects of the same table can be mutated
(and read) by concurrent processes. This is achieved to some
degree at the expense of memory consumption and the performance
of sequential access and concurrent reading.</p>
+ <p>The <c>auto</c> alternative for the
+ <c>write_concurrency</c> option is similar to the
+ <c>true</c> option but automatically adjusts the
+ synchronization granularity during runtime depending on how the
+ table is used. This is the recommended
+ <c>write_concurrency</c> option when using Erlang/OTP 25
+ and above as it performs well in most scenarios.</p>
<p>The <c>write_concurrency</c> option can be combined with the options
<seeerl marker="#new_2_read_concurrency">
<c>read_concurrency</c></seeerl> and
@@ -1278,12 +1286,9 @@ ets:select(Table, MatchSpec),</code>
concurrent read bursts and large concurrent
write bursts are common; for more information, see option
<seeerl marker="#new_2_read_concurrency">
- <c>read_concurrency</c></seeerl>. The <c>decentralized_counters</c>
- option is turned on by default for tables of type <c>ordered_set</c>
- with the <c>write_concurrency</c> option enabled, and the
- <c>decentralized_counters</c> option is turned off by default for
- all other table types.
- For more information, see the documentation for the
+ <c>read_concurrency</c></seeerl>. It is almost always a
+ good idea to combine the <c>write_concurrency</c> option
+ with the
<seeerl marker="#new_2_decentralized_counters">
<c>decentralized_counters</c></seeerl> option.</p>
<p>Notice that this option does not change any guarantees about
@@ -1291,17 +1296,24 @@ ets:select(Table, MatchSpec),</code>
Functions that makes such promises over many objects (like
<seemfa marker="#insert/2"><c>insert/2</c></seemfa>)
gain less (or nothing) from this option.</p>
- <p>The memory consumption inflicted by both <c>write_concurrency</c>
- and <c>read_concurrency</c> is a constant overhead per table for
- <c>set</c>, <c>bag</c> and <c>duplicate_bag</c>. For
- <c>ordered_set</c> the memory overhead depends on the number
- of inserted objects and the amount of actual detected
- concurrency in runtime. The memory overhead can be especially
- large when both options are combined.</p>
+ <p>The memory consumption inflicted by both
+ <c>write_concurrency</c> and <c>read_concurrency</c> is a
+ constant overhead per table for <c>set</c>, <c>bag</c> and
+ <c>duplicate_bag</c> when the <c>true</c> alternative for
+ the <c>write_concurrency</c> option is not used. For
+ all tables with the <c>auto</c> alternative and <c>ordered_set</c>
+ tables with <c>true</c> alternative the
+ memory overhead depends on the amount of actual detected concurrency during
+ runtime. The memory overhead can be especially large when
+ both <c>write_concurrency</c> and <c>read_concurrency</c> are combined.</p>
<note>
<p>Prior to stdlib-3.7 (OTP-22.0) <c>write_concurrency</c> had no
effect on <c>ordered_set</c>.</p>
</note>
+ <note>
+ <p>The <c>auto</c> alternative for the <c>write_concurrency</c>
+ option is only available in OTP-25.0 and above.</p>
+ </note>
<marker id="new_2_read_concurrency"></marker>
</item>
<tag><c>{read_concurrency,boolean()}</c></tag>
@@ -1332,12 +1344,15 @@ ets:select(Table, MatchSpec),</code>
<tag><c>{decentralized_counters,boolean()}</c></tag>
<item>
<p>
- Performance tuning. Defaults to <c>true</c> for tables
- of type <c>ordered_set</c> with the
- <seeerl marker="#new_2_write_concurrency">
- <c>write_concurrency</c></seeerl> option enabled, and defaults to
- false for all other table types. This option has no effect if
- the <c>write_concurrency</c> option is set to <c>false</c>.</p>
+ Performance tuning. Defaults to <c>true</c> for all
+ tables with the <c>write_concurrency</c> option set
+ to <c>auto</c>. For
+ tables of type <c>ordered_set</c> the option also
+ defaults to true when the <c>write_concurrency</c> option
+ is set to <c>true</c>. The option defaults to
+ <c>false</c> for all other configurations. This option
+ has no effect if the <c>write_concurrency</c> option is
+ set to <c>false</c>.</p>
<p>
When this option is set to <c>true</c>, the table is optimized for
frequent concurrent calls to operations that modify the tables
@@ -1378,7 +1393,7 @@ ets:select(Table, MatchSpec),</code>
<fsummary>Return the next key in an ETS table.</fsummary>
<desc>
<p>Returns the next key <c><anno>Key2</anno></c>, following key
- <c><anno>Key1</anno></c> in table <c><anno>Tab</anno></c>. For table
+ <c><anno>Key1</anno></c> in table <c><anno>Table</anno></c>. For table
type <c>ordered_set</c>, the next key in Erlang term order is
returned. For other table types, the next key
according to the internal order of the table is returned. If no
@@ -1403,7 +1418,7 @@ ets:select(Table, MatchSpec),</code>
<desc>
<p>Returns the previous key <c><anno>Key2</anno></c>, preceding key
<c><anno>Key1</anno></c> according to Erlang term order in table
- <c><anno>Tab</anno></c> of type <c>ordered_set</c>. For other
+ <c><anno>Table</anno></c> of type <c>ordered_set</c>. For other
table types, the function is synonymous to
<seemfa marker="#next/2"><c>next/2</c></seemfa>.
If no previous key exists, <c>'$end_of_table'</c> is returned.</p>
@@ -1416,7 +1431,7 @@ ets:select(Table, MatchSpec),</code>
<name name="rename" arity="2" since=""/>
<fsummary>Rename a named ETS table.</fsummary>
<desc>
- <p>Renames the named table <c><anno>Tab</anno></c> to the new name
+ <p>Renames the named table <c><anno>Table</anno></c> to the new name
<c><anno>Name</anno></c>. Afterwards, the old name cannot be used to
access the table. Renaming an unnamed table has no effect.</p>
</desc>
@@ -1488,9 +1503,9 @@ ets:select(ets:repair_continuation(MaybeBroken,MS)).</code>
<seemfa marker="#select/3"><c>select/3</c></seemfa> &amp;
<seemfa marker="#select/1"><c>select/1</c></seemfa>.</p>
<p>A process fixes a table by calling
- <c>safe_fixtable(<anno>Tab</anno>, true)</c>. The table remains
+ <c>safe_fixtable(<anno>Table</anno>, true)</c>. The table remains
fixed until the process releases it by calling
- <c>safe_fixtable(<anno>Tab</anno>, false)</c>, or until the process
+ <c>safe_fixtable(<anno>Table</anno>, false)</c>, or until the process
terminates.</p>
<p>If many processes fix a table, the table remains fixed
until all processes have released it (or terminated).
@@ -1506,21 +1521,21 @@ ets:select(ets:repair_continuation(MaybeBroken,MS)).</code>
<c>next/2</c> is called.</p>
<p><em>Example:</em></p>
<code type="none">
-clean_all_with_value(Tab,X) ->
- safe_fixtable(Tab,true),
- clean_all_with_value(Tab,X,ets:first(Tab)),
- safe_fixtable(Tab,false).
+clean_all_with_value(Table,X) ->
+ safe_fixtable(Table,true),
+ clean_all_with_value(Table,X,ets:first(Table)),
+ safe_fixtable(Table,false).
-clean_all_with_value(Tab,X,'$end_of_table') ->
+clean_all_with_value(Table,X,'$end_of_table') ->
true;
-clean_all_with_value(Tab,X,Key) ->
- case ets:lookup(Tab,Key) of
+clean_all_with_value(Table,X,Key) ->
+ case ets:lookup(Table,Key) of
[{Key,X}] ->
- ets:delete(Tab,Key);
+ ets:delete(Table,Key);
_ ->
true
end,
- clean_all_with_value(Tab,X,ets:next(Tab,Key)).</code>
+ clean_all_with_value(Table,X,ets:next(Table,Key)).</code>
<p>Notice that deleted objects are not freed from a
fixed table until it has been released. If a process fixes a
table but never releases it, the memory used by the deleted
@@ -1528,7 +1543,7 @@ clean_all_with_value(Tab,X,Key) ->
the table also degrades significantly.</p>
<p>To retrieve information about which processes have fixed which
tables, use <seeerl marker="#info_2_safe_fixed_monotonic_time">
- <c>info(Tab, safe_fixed_monotonic_time)</c></seeerl>. A system with
+ <c>info(Table, safe_fixed_monotonic_time)</c></seeerl>. A system with
many processes fixing tables can need a monitor that sends alarms
when tables have been fixed for too long.</p>
<p>Notice that <c>safe_fixtable/2</c> is not necessary for table type
@@ -1556,7 +1571,7 @@ clean_all_with_value(Tab,X,Key) ->
<fsummary>Match the objects in an ETS table against a
match specification.</fsummary>
<desc>
- <p>Matches the objects in table <c><anno>Tab</anno></c> using a
+ <p>Matches the objects in table <c><anno>Table</anno></c> using a
<seeerl marker="#match_spec">match specification</seeerl>.
This is a more general call than
<seemfa marker="#match/2"><c>match/2</c></seemfa> and
@@ -1585,23 +1600,23 @@ Result = "Term construct"</code>
match variables in a list), so that the following
<c>match/2</c> expression:</p>
<code type="none">
-ets:match(Tab,{'$1','$2','$3'})</code>
+ets:match(Table,{'$1','$2','$3'})</code>
<p>is exactly equivalent to:</p>
<code type="none">
-ets:select(Tab,[{{'$1','$2','$3'},[],['$$']}])</code>
+ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])</code>
<p>And that the following <c>match_object/2</c> call:</p>
<code type="none">
-ets:match_object(Tab,{'$1','$2','$1'})</code>
+ets:match_object(Table,{'$1','$2','$1'})</code>
<p>is exactly equivalent to</p>
<code type="none">
-ets:select(Tab,[{{'$1','$2','$1'},[],['$_']}])</code>
+ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])</code>
<p>Composite terms can be constructed in the <c>Result</c> part
either by simply writing a list, so that the following code:</p>
<code type="none">
-ets:select(Tab,[{{'$1','$2','$3'},[],['$$']}])</code>
+ets:select(Table,[{{'$1','$2','$3'},[],['$$']}])</code>
<p>gives the same output as:</p>
<code type="none">
-ets:select(Tab,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])</code>
+ets:select(Table,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])</code>
<p>That is, all the bound variables in the match head as a list. If
tuples are to be constructed, one has to write a tuple of
arity 1 where the single element in the tuple is the tuple
@@ -1609,10 +1624,10 @@ ets:select(Tab,[{{'$1','$2','$3'},[],[['$1','$2','$3']]}])</code>
for a <c>Guard</c>).</p>
<p>Therefore the following call:</p>
<code type="none">
-ets:select(Tab,[{{'$1','$2','$1'},[],['$_']}])</code>
+ets:select(Table,[{{'$1','$2','$1'},[],['$_']}])</code>
<p>gives the same output as:</p>
<code type="none">
-ets:select(Tab,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])</code>
+ets:select(Table,[{{'$1','$2','$1'},[],[{{'$1','$2','$3'}}]}])</code>
<p>This syntax is equivalent to the syntax used in the trace
patterns (see the
<seeerl marker="runtime_tools:dbg">
@@ -1674,7 +1689,7 @@ is_integer(X), is_integer(Y), X + Y < 4711]]></code>
specification and return the number of objects for which the match
specification returned <c>true</c>.</fsummary>
<desc>
- <p>Matches the objects in table <c><anno>Tab</anno></c> using a
+ <p>Matches the objects in table <c><anno>Table</anno></c> using a
<seeerl marker="#match_spec">match specification</seeerl>. If the
match specification returns <c>true</c> for an object, that object
considered a match and is counted. For any other result from
@@ -1693,7 +1708,7 @@ is_integer(X), is_integer(Y), X + Y < 4711]]></code>
specification and delete objects where the match specification
returns <c>true</c>.</fsummary>
<desc>
- <p>Matches the objects in table <c><anno>Tab</anno></c> using a
+ <p>Matches the objects in table <c><anno>Table</anno></c> using a
<seeerl marker="#match_spec">match specification</seeerl>. If the
match specification returns <c>true</c> for an object, that object is
removed from the table. For any other result from the match
@@ -1715,7 +1730,7 @@ is_integer(X), is_integer(Y), X + Y < 4711]]></code>
<name name="select_replace" arity="2" since="OTP 20.0"/>
<fsummary>Match and replace objects atomically in an ETS table</fsummary>
<desc>
- <p>Matches the objects in the table <c><anno>Tab</anno></c> using a
+ <p>Matches the objects in the table <c><anno>Table</anno></c> using a
<seeerl marker="#match_spec">match specification</seeerl>. For each
matched object, the existing object is replaced with
the match specification result.</p>
@@ -1833,7 +1848,7 @@ Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
<c>first</c>/<c>next</c> or <c>last</c>/<c>prev</c> are to be used
instead.</p>
<p>Returns all objects in slot <c><anno>I</anno></c> of table
- <c><anno>Tab</anno></c>. A table can be traversed by repeatedly
+ <c><anno>Table</anno></c>. A table can be traversed by repeatedly
calling the function,
starting with the first slot <c><anno>I</anno>=0</c> and
ending when <c>'$end_of_table'</c> is returned.
@@ -1853,10 +1868,10 @@ Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
<name name="tab2file" arity="2" since=""/>
<fsummary>Dump an ETS table to a file.</fsummary>
<desc>
- <p>Dumps table <c><anno>Tab</anno></c> to file
+ <p>Dumps table <c><anno>Table</anno></c> to file
<c><anno>Filename</anno></c>.</p>
<p>Equivalent to
- <c>tab2file(<anno>Tab</anno>, <anno>Filename</anno>,[])</c></p>
+ <c>tab2file(<anno>Table</anno>, <anno>Filename</anno>,[])</c></p>
</desc>
</func>
@@ -1864,7 +1879,7 @@ Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
<name name="tab2file" arity="3" since=""/>
<fsummary>Dump an ETS table to a file.</fsummary>
<desc>
- <p>Dumps table <c><anno>Tab</anno></c> to file
+ <p>Dumps table <c><anno>Table</anno></c> to file
<c><anno>Filename</anno></c>.</p>
<p>When dumping the table, some information about the table
is dumped to a header at the beginning of the dump. This
@@ -1911,7 +1926,7 @@ Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
<name name="tab2list" arity="1" since=""/>
<fsummary>Return a list of all objects in an ETS table.</fsummary>
<desc>
- <p>Returns a list of all objects in table <c><anno>Tab</anno></c>.</p>
+ <p>Returns a list of all objects in table <c><anno>Table</anno></c>.</p>
</desc>
</func>
@@ -2005,7 +2020,7 @@ Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
tables, Dets tables,
and lists are also recognized by QLC as sources of
data. Calling <c>table/1,2</c> is the means to make the
- ETS table <c>Tab</c> usable to QLC.</p>
+ ETS table <c>Table</c> usable to QLC.</p>
<p>When there are only simple restrictions on the key position,
QLC uses <seemfa marker="#lookup/2"><c>lookup/2</c></seemfa>
to look up the keys. When
@@ -2053,12 +2068,12 @@ Success = (1 =:= ets:select_replace(T, [{Old, [], [{const, New}]}])),
<p>An explicit match specification is here used to traverse the
table:</p>
<pre>
-9> <input>true = ets:insert(Tab = ets:new(t, []), [{1,a},{2,b},{3,c},{4,d}]),</input>
+9> <input>true = ets:insert(Table = ets:new(t, []), [{1,a},{2,b},{3,c},{4,d}]),</input>
<input>MS = ets:fun2ms(fun({X,Y}) when (X > 1) or (X &lt; 5) -> {Y} end),</input>
-<input>QH1 = ets:table(Tab, [{traverse, {select, MS}}]).</input></pre>
+<input>QH1 = ets:table(Table, [{traverse, {select, MS}}]).</input></pre>
<p>An example with an implicit match specification:</p>
<pre>
-10> <input>QH2 = qlc:q([{Y} || {X,Y} &lt;- ets:table(Tab), (X > 1) or (X &lt; 5)]).</input></pre>
+10> <input>QH2 = qlc:q([{Y} || {X,Y} &lt;- ets:table(Table), (X > 1) or (X &lt; 5)]).</input></pre>
<p>The latter example is equivalent to the former, which
can be verified using function <c>qlc:info/1</c>:</p>
<pre>
@@ -2076,7 +2091,7 @@ true</pre>
ETS table.</fsummary>
<desc>
<p>Returns and removes a list of all objects with key
- <c><anno>Key</anno></c> in table <c><anno>Tab</anno></c>.</p>
+ <c><anno>Key</anno></c> in table <c><anno>Table</anno></c>.</p>
<p>The specified <c><anno>Key</anno></c> is used to identify the object
by either <em>comparing equal</em> the key of an object in an
<c>ordered_set</c> table, or <em>matching</em> in other types of
@@ -2118,7 +2133,7 @@ true</pre>
</fsummary>
<desc>
<p>Fills an already created/opened Dets table with the objects
- in the already opened ETS table named <c><anno>Tab</anno></c>.
+ in the already opened ETS table named <c><anno>Table</anno></c>.
The Dets table is emptied before the objects are inserted.</p>
</desc>
</func>
@@ -2131,7 +2146,7 @@ true</pre>
<name name="update_counter" arity="3" clause_i="3" since=""/>
<name name="update_counter" arity="4" clause_i="3" since="OTP 18.0"/>
<fsummary>Update a counter object in an ETS table.</fsummary>
- <type variable="Tab"/>
+ <type variable="Table"/>
<type variable="Key"/>
<type variable="UpdateOp" name_i="1"/>
<type variable="Pos" name_i="1"/>
@@ -2145,7 +2160,7 @@ true</pre>
object into the table again. The operation is guaranteed to be
<seeerl marker="#concurrency">atomic and isolated</seeerl>.</p>
<p>This function destructively update the object with key
- <c><anno>Key</anno></c> in table <c><anno>Tab</anno></c> by adding
+ <c><anno>Key</anno></c> in table <c><anno>Table</anno></c> by adding
<c><anno>Incr</anno></c> to the element at position
<c><anno>Pos</anno></c>. The new counter value is
returned. If no position is specified, the element directly
@@ -2211,7 +2226,7 @@ true</pre>
<name name="update_element" arity="3" clause_i="2" since=""/>
<fsummary>Update the <c>Pos</c>:th element of the object with a
specified key in an ETS table.</fsummary>
- <type variable="Tab"/>
+ <type variable="Table"/>
<type variable="Key"/>
<type variable="Value"/>
<type variable="Pos"/>
@@ -2220,7 +2235,7 @@ true</pre>
elements within an object, without the trouble of having to look up,
update, and write back the entire object.</p>
<p>This function destructively updates the object with key
- <c><anno>Key</anno></c> in table <c><anno>Tab</anno></c>.
+ <c><anno>Key</anno></c> in table <c><anno>Table</anno></c>.
The element at position <c><anno>Pos</anno></c> is given
the value <c><anno>Value</anno></c>.</p>
<p>A list of <c>{<anno>Pos</anno>,<anno>Value</anno>}</c> can be
diff --git a/lib/stdlib/doc/src/filelib.xml b/lib/stdlib/doc/src/filelib.xml
index 815eb23931..84e1d2a260 100644
--- a/lib/stdlib/doc/src/filelib.xml
+++ b/lib/stdlib/doc/src/filelib.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2003</year><year>2021</year>
+ <year>2003</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -108,6 +108,23 @@
</func>
<func>
+ <name name="ensure_path" arity="1" since="OTP @OTP-17953@"/>
+ <fsummary>Ensure that all parent directories for a target directory exist.</fsummary>
+ <desc>
+ <p>Ensures that all parent directories for the specified path
+ <c><anno>Path</anno></c> exist, trying to create them if
+ necessary.</p>
+ <p>Unlike <seemfa
+ marker="#ensure_dir/1"><c>ensure_dir/1</c></seemfa>, this
+ function will attempt to create all path segments as a
+ directory, including the last segment.</p>
+ <p>Returns <c>ok</c> if all parent directories already exist
+ or can be created. Returns <c>{error, <anno>Reason</anno>}</c> if
+ some parent directory does not exist and cannot be created.</p>
+ </desc>
+ </func>
+
+ <func>
<name name="file_size" arity="1" since=""/>
<fsummary>Return the size in bytes of a file.</fsummary>
<desc>
diff --git a/lib/stdlib/doc/src/filename.xml b/lib/stdlib/doc/src/filename.xml
index 46e2b2378f..76baf4982e 100644
--- a/lib/stdlib/doc/src/filename.xml
+++ b/lib/stdlib/doc/src/filename.xml
@@ -136,7 +136,7 @@
<p>Joins an absolute directory with a relative filename. Similar to
<seemfa marker="#join/2"><c>join/2</c></seemfa>, but on platforms
with tight restrictions on raw filename length and no support for
- symbolic links (read: VxWorks), leading parent directory components
+ symbolic links, leading parent directory components
in <c><anno>Filename</anno></c> are matched against trailing
directory components in <c><anno>Dir</anno></c> so they can be
removed from the result - minimizing its length.</p>
@@ -188,7 +188,7 @@ basedir(<anno>PathsType</anno>, <anno>Application</anno>, #{})</seeerl>.
The options <c>'author'</c> and <c>'version'</c> are only used with <c>'windows'</c> option mode.
</p>
<list type="bulleted">
- <item><c>user_cache</c>
+ <item><marker id="user_cache"/><c>user_cache</c>
<p>The path location is intended for transient data files on a local machine.</p>
<p>
On Linux:
@@ -212,7 +212,7 @@ basedir(<anno>PathsType</anno>, <anno>Application</anno>, #{})</seeerl>.
5> <input>filename:basedir(user_cache, "My App", #{author=>"Erlang",version=>"1.2"}).</input>
"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Cache"</pre>
</item>
- <item><c>user_config</c>
+ <item><marker id="user_config"/><c>user_config</c>
<p>
The path location is intended for persistent configuration files.
</p>
@@ -232,7 +232,7 @@ basedir(<anno>PathsType</anno>, <anno>Application</anno>, #{})</seeerl>.
2> <input>filename:basedir(user_config, "My App", #{author=>"Erlang", version=>"1.2"}).</input>
"c:/Users/otptest/AppData/Roaming/Erlang/My App/1.2"</pre>
</item>
- <item><c>user_data</c>
+ <item><marker id="user_data"/><c>user_data</c>
<p>
The path location is intended for persistent data files.
</p>
@@ -252,7 +252,7 @@ basedir(<anno>PathsType</anno>, <anno>Application</anno>, #{})</seeerl>.
9> <input>filename:basedir(user_data, "My App",#{author=>"Erlang",version=>"1.2"}).</input>
"c:/Users/otptest/AppData/Local/Erlang/My App/1.2"</pre>
</item>
- <item><c>user_log</c>
+ <item><marker id="user_log"/><c>user_log</c>
<p>The path location is intended for transient log files on a local machine.</p>
<p>
On Linux:
@@ -269,11 +269,11 @@ basedir(<anno>PathsType</anno>, <anno>Application</anno>, #{})</seeerl>.
13> <input>filename:basedir(user_log, "My App",#{author=>"Erlang",version=>"1.2"}).</input>
"c:/Users/otptest/AppData/Local/Erlang/My App/1.2/Logs"</pre>
</item>
- <item><c>site_config</c><p>
+ <item><marker id="site_config"/><c>site_config</c><p>
On Linux:
Respects the os environment variable <c>XDG_CONFIG_DIRS</c>.</p>
<pre>
-5> <input>filename:basedir(site_data, "my_application", #{os=>linux}).</input>
+5> <input>filename:basedir(site_config, "my_application", #{os=>linux}).</input>
["/usr/local/share/my_application",
"/usr/share/my_application"]
6> <input>os:getenv("XDG_CONFIG_DIRS").</input>
@@ -290,7 +290,7 @@ true
5> <input>filename:basedir(site_config, "my_application", #{os=>darwin}).</input>
["/Library/Application Support/my_application"]</pre>
</item>
- <item><c>site_data</c><p>
+ <item><marker id="site_data"/><c>site_data</c><p>
On Linux:
Respects the os environment variable <c>XDG_DATA_DIRS</c>.</p>
<pre>
diff --git a/lib/stdlib/doc/src/gen_event.xml b/lib/stdlib/doc/src/gen_event.xml
index 44682e91e2..676d643072 100644
--- a/lib/stdlib/doc/src/gen_event.xml
+++ b/lib/stdlib/doc/src/gen_event.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -119,24 +119,89 @@ gen_event:stop -----> Module:terminate/2
<datatype>
<name name="handler"/>
</datatype>
+
<datatype>
<name name="handler_args"/>
</datatype>
+
<datatype>
<name name="add_handler_ret"/>
</datatype>
+
<datatype>
<name name="del_handler_ret"/>
</datatype>
+
+ <datatype>
+ <name name="emgr_ref"/>
+ </datatype>
+
<datatype>
<name name="request_id"/>
<desc>
<p>
- A request handle, see <seemfa marker="#send_request/3"> <c>send_request/3</c> </seemfa>
+ An opaque request identifier. See
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
for details.
</p>
</desc>
</datatype>
+
+ <datatype>
+ <name name="request_id_collection"/>
+ <desc>
+ <p>
+ An opaque collection of request identifiers
+ (<seetype marker="#request_id"><c>request_id()</c></seetype>)
+ where each request identifier can be associated with a label
+ chosen by the user. For more information see
+ <seemfa marker="#reqids_new/0"><c>reqids_new/0</c></seemfa>.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="response_timeout"/>
+ <desc>
+ <p>
+ Used to set a time limit on how long to wait for a response using
+ either
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ or
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ The time unit used is <c>millisecond</c>. Currently valid values:
+ </p>
+ <taglist>
+ <tag><c>0..4294967295</c></tag>
+ <item><p>
+ Timeout relative to current time in milliseconds.
+ </p></item>
+ <tag><c>infinity</c></tag>
+ <item><p>
+ Infinite timeout. That is, the operation will never time out.
+ </p></item>
+ <tag><c>{abs, Timeout}</c></tag>
+ <item><p>
+ An absolute
+ <seemfa marker="erts:erlang#monotonic_time/1">Erlang monotonic time</seemfa>
+ timeout in milliseconds. That is, the operation will time out when
+ <seemfa marker="erts:erlang#monotonic_time/1"><c>erlang:monotonic_time(millisecond)</c></seemfa>
+ returns a value larger than or equal to <c>Timeout</c>. <c>Timeout</c>
+ is not allowed to identify a time further into the future than <c>4294967295</c>
+ milliseconds. Identifying the timeout using an absolute timeout value
+ is especially handy when you have a deadline for responses corresponding
+ to a complete collection of requests
+ (<seetype marker="#request_id_collection"><c>request_id_collection()</c></seetype>)
+,
+ since you do not have to recalculate the relative time until the deadline
+ over and over again.
+ </p></item>
+ </taglist>
+ </desc>
+ </datatype>
+
</datatypes>
<funcs>
@@ -207,14 +272,17 @@ gen_event:stop -----> Module:terminate/2
<desc>
<p>Adds a new event handler in the same way as
<seemfa marker="#add_handler/3"><c>add_handler/3</c></seemfa>,
- but also supervises the connection between the event handler
+ but also supervises the connection by linking the event handler
and the calling process.</p>
<list type="bulleted">
<item>If the calling process later terminates with <c>Reason</c>,
- the event manager deletes the event handler by calling
+ the event manager deletes any supervised event handlers by calling
<seemfa marker="#Module:terminate/2">
- <c>Module:terminate/2</c></seemfa>
- with <c>{stop,Reason}</c> as argument.
+ <c>Module:terminate/2</c></seemfa>,
+ then calls
+ <seemfa marker="#Module:handle_info/2">
+ <c>Module:handle_info/2</c></seemfa>
+ for each remaining handler.
</item>
<item>
<p>If the event handler is deleted later, the event manager
@@ -292,31 +360,41 @@ gen_event:stop -----> Module:terminate/2
unexpected value <c>Term</c>, this function returns
<c>{error,{'EXIT',Reason}}</c> or <c>{error,Term}</c>,
respectively.</p>
+ <p>
+ When this call fails it
+ <seemfa marker="erts:erlang#exit/1">exits</seemfa>
+ the calling process.
+ The exit term is on the form
+ <c>{Reason,&nbsp;Location}</c> where
+ <c>Location&nbsp;=&nbsp;{gen_event,call,ArgList}</c>.
+ See
+ <seemfa marker="gen_server#call/3">
+ <c>gen_server:call/3</c>
+ </seemfa>
+ that has a description of relevant
+ values for the <c>Reason</c> in the exit term.
+ </p>
</desc>
</func>
-
<func>
- <name since="OTP 23.0">check_response(Msg, RequestId) -> Result</name>
- <fsummary>Check if a message is a reply from a server.</fsummary>
- <type>
- <v>Msg = term()</v>
- <v>RequestId = request_id()</v>
- <v>Result = {reply, Reply} | no_reply | {error, Error}</v>
- <v>Reply = Error = term()</v>
- </type>
+ <name name="check_response" arity="2" since="OTP 23.0"/>
+ <fsummary>Check if a message is a response to an asynchronous call request
+ to a generic event manager.</fsummary>
<desc>
<p>
- This function is used to check if a previously received
- message, for example by <c>receive</c> or
- <c>handle_info/2</c>, is a result of a request made with
+ Check if <c><anno>Msg</anno></c> is a response corresponding
+ to the request identifier <c><anno>ReqId</anno></c>. The request
+ must have been made by
<seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>.
- If <c>Msg</c> is a reply to the handle <c>RequestId</c>
- the result of the request is returned in <c>Reply</c>.
- Otherwise returns <c>no_reply</c> and no cleanup is done, and
- thus the function shall be invoked repeatedly until a reply
- is returned.
</p>
+ <p>
+ If <c><anno>Msg</anno></c> is a response corresponding to
+ <c><anno>ReqId</anno></c> the response is returned; otherwise,
+ <c>no_reply</c> is returned and no cleanup is done, and
+ thus the function must be invoked repeatedly until a response
+ is returned.
+ </p>
<p>
If the specified event handler is not
installed, the function returns <c>{error,bad_module}</c>. If
@@ -329,6 +407,74 @@ gen_event:stop -----> Module:terminate/2
</desc>
</func>
+ <func>
+ <name name="check_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Check if a message is a response to an asynchronous call request
+ to a generic event manager.</fsummary>
+ <desc>
+ <p>
+ Check if <c><anno>Msg</anno></c> is a response corresponding
+ to a request identifier saved in <c><anno>ReqIdCollection</anno></c>.
+ All request identifiers of <c><anno>ReqIdCollection</anno></c>
+ must correspond to requests that have been made using
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa> or
+ <seemfa marker="#send_request/5"><c>send_request/5</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">saving the request id</seemfa>
+ in a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/5"><c>send_request/5</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>check_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned. If <c><anno>Msg</anno></c>
+ does not correspond to any of the request identifiers in
+ <c><anno>ReqIdCollection</anno></c>, the atom
+ <c>no_reply</c> is returned.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>check_response/3</c>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>check_response/3</c>, it will always
+ return <c>no_reply</c>.
+ </p>
+ </desc>
+ </func>
+
<func>
<name since="">delete_handler(EventMgrRef, Handler, Args) -> Result</name>
<fsummary>Delete an event handler from a generic event manager.</fsummary>
@@ -392,34 +538,29 @@ gen_event:stop -----> Module:terminate/2
does not exist, unless it is specified as <c>Name</c>.</p>
</desc>
</func>
-
+
<func>
- <name since="OTP 24.0">receive_response(RequestId, Timeout) -> Result</name>
- <fsummary>Receive for a reply from a server.</fsummary>
- <type>
- <v>RequestId = request_id()</v>
- <v>Reply = term()</v>
- <v>Timeout = timeout()</v>
- <v>Result = {reply, Reply} | timeout | {error, Error}</v>
- <v>Reply = Error = term()</v>
- </type>
+ <name name="receive_response" arity="2" clause_i="1" since="OTP 24.0"/>
+ <fsummary>Receive a response to an asynchronous call request
+ to a generic event manager.</fsummary>
<desc>
<p>
- This function is used to receive for a reply of a request made with
- <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
- to the event manager. This function must be called from the same
- process from which <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
- was made.
+ Receive a response corresponding to the request identifier
+ <c><anno>ReqId</anno></c>- The request must have been made by
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
+ to the <c>gen_statem</c> process. This function must be called
+ from the same process from which
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
+ was made.
</p>
<p>
- <c>Timeout</c> is an integer greater then or equal to zero
- that specifies how many milliseconds to wait for an reply, or
- the atom <c>infinity</c> to wait indefinitely.
- If no reply is received within the specified
- time, the function returns <c>timeout</c>. Assuming that the
+ <c><anno>Timeout</anno></c> specifies how long to wait for
+ a response. If no response is received within the specified time,
+ the function returns <c>timeout</c>. Assuming that the
server executes on a node supporting aliases (introduced in
- OTP 24) no response will be received after a timeout. Otherwise,
- a garbage response might be received at a later time.
+ OTP 24) the request will also be abandoned. That is, no
+ response will be received after a timeout. Otherwise, a
+ stray response might be received at a later time.
</p>
<p>
The return value <c>Reply</c> is defined in the return value
@@ -436,44 +577,197 @@ gen_event:stop -----> Module:terminate/2
</p>
<p>
The difference between
- <seemfa marker="#wait_response/2"><c>wait_response()</c></seemfa>
- and <c>receive_response()</c> is that <c>receive_response()</c>
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>
+ and <c>receive_response/2</c> is that <c>receive_response/2</c>
abandons the request at timeout so that a potential future
- response is ignored, while <c>wait_response()</c> does not.
+ response is ignored, while <c>wait_response/2</c> does not.
</p>
</desc>
</func>
<func>
- <name since="OTP 23.0">send_request(EventMgrRef, Handler, Request) -> RequestId</name>
- <fsummary>Send a request to a generic event manager.</fsummary>
- <type>
- <v>EventMgrRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Handler = Module | {Module,Id}</v>
- <v>&nbsp;Module = atom()</v>
- <v>&nbsp;Id = term()</v>
- <v>Request = term()</v>
- <v>RequestId = request_id()</v>
- </type>
+ <name name="receive_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Receive a response to an asynchronous call request
+ to a generic event manager.</fsummary>
+ <desc>
+ <p>
+ Receive a response corresponding to a request identifier saved
+ in <c><anno>ReqIdCollection</anno></c>. All request identifiers
+ of <c><anno>ReqIdCollection</anno></c> must correspond to requests
+ that have been made using
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa> or
+ <seemfa marker="#send_request/5"><c>send_request/5</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">adding the request id</seemfa>
+ in a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/5"><c>send_request/5</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ will be wrapped in a 3-tuple. The first element of this tuple equals
+ the value that would have been produced by <c>receive_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned.
+ </p>
+ <p>
+ <c><anno>Timeout</anno></c> specifies how long to wait for
+ a response. If no response is received within the specified time,
+ the function returns <c>timeout</c>. Assuming that the
+ server executes on a node supporting aliases (introduced in
+ OTP 24) all requests identified by <c><anno>ReqIdCollection</anno></c>
+ will also be abandoned. That is, no responses will be received
+ after a timeout. Otherwise, stray responses might be received
+ at a later time.
+ </p>
+ <p>
+ The difference between <c>receive_response/3</c> and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>
+ is that <c>receive_response/3</c> abandons the requests at timeout
+ so that potential future responses are ignored, while
+ <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>receive_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>receive_response/3</c>, it will always block
+ until a timeout determined by <c><anno>Timeout</anno></c> is
+ triggered.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_add" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Save a request identifier.</fsummary>
+ <desc>
+ <p>
+ Saves <c><anno>ReqId</anno></c> and associates a <c><anno>Label</anno></c>
+ with the request identifier by adding this information to
+ <c><anno>ReqIdCollection</anno></c> and returning the
+ resulting request identifier collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_new" arity="0" since="OTP @OTP-17784@"/>
+ <fsummary>Create a new empty request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns a new empty request identifier collection. A
+ request identifier collection can be utilized in order
+ the handle multiple outstanding requests.
+ </p>
+ <p>
+ Request identifiers of requests made by
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
+ can be saved in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ </p>
+ <p>
+ <seemfa marker="#reqids_size/1"><c>reqids_size/1</c></seemfa>
+ can be used to determine the amount of request identifiers in a
+ request identifier collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_size" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>Get size of a request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns the amount of request identifiers saved in
+ <c><anno>ReqIdCollection</anno></c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_to_list" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>List a request identifiers.</fsummary>
+ <desc>
+ <p>
+ Returns a list of <c>{<anno>ReqId</anno>, <anno>Label</anno>}</c>
+ tuples which corresponds to all request identifiers with their
+ associated labels present in the <c><anno>ReqIdCollection</anno></c>
+ collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="send_request" arity="3" since="OTP 23.0"/>
+ <fsummary>Send an asyncronous call request to a generic event manager.</fsummary>
<desc>
<p>
- Sends a request to event handler <c>Handler</c> installed in
- event manager <c>EventMgrRef</c> and returns a handle
- <c>RequestId</c>. The return value <c>RequestId</c> shall
- later be used with <seemfa marker="#receive_response/2">
- <c>receive_response/2</c></seemfa>, <seemfa marker="#wait_response/2">
- <c>wait_response/2</c></seemfa>, or <seemfa
- marker="#check_response/2">
- <c>check_response/2</c></seemfa> in the same process to
- fetch the actual result of the request.
+ Sends an asynchronous <c>call</c> request <c><anno>Request</anno></c> to
+ event handler <c><anno>Handler</anno></c> installed in the event manager
+ identified by <c><anno>EventMgrRef</anno></c> and returns a request
+ identifier <c>ReqId</c>. The return value <c><anno>ReqId</anno></c>
+ shall later be used with
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>, or
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>
+ to fetch the actual result of the request. Besides passing
+ the request identifier directly to these functions, it can also be
+ saved in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>, or
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ If you are about to save the request identifier in a request identifier
+ collection, you may want to consider using
+ <seemfa marker="#send_request/5"><c>send_request/5</c></seemfa>
+ instead.
</p>
<p>
- The call <c>gen_event:wait_response(gen_event:send_request(EventMgrRef,Handler,Request), Timeout)</c>
+ The call <c>gen_event:receive_response(gen_event:send_request(<anno>EventMgrRef</anno>,
+ <anno>Handler</anno>, <anno>Request</anno>), Timeout)</c>
can be seen as equivalent to
- <seemfa marker="#call/3"><c>gen_event:call(EventMgrRef,Handler,Request,Timeout)</c></seemfa>,
+ <seemfa marker="#call/3"><c>gen_event:call(<anno>EventMgrRef</anno>,
+ <anno>Handler</anno>, <anno>Request</anno>, Timeout)</c></seemfa>,
ignoring the error handling.
</p>
<p>
@@ -487,6 +781,38 @@ gen_event:stop -----> Module:terminate/2
</desc>
</func>
+
+ <func>
+ <name name="send_request" arity="5" since="OTP @OTP-17784@"/>
+ <fsummary>Sends a request to a generic server.</fsummary>
+ <desc>
+ <p>
+ Sends an asynchronous <c>call</c> request <c><anno>Request</anno></c> to
+ event handler <c><anno>Handler</anno></c> installed in the event manager
+ identified by <c><anno>EventMgrRef</anno></c>.
+ The <c><anno>Label</anno></c> will be associated with the request
+ identifier of the operation and added to the returned request
+ identifier collection <c><anno>NewReqIdCollection</anno></c>.
+ The collection can later be used in order to get one response
+ corresponding to a request in the collection by passing the
+ collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ </p>
+
+ <p>
+ The same as calling
+ <seemfa marker="#reqids_add/3"><c>gen_event:reqids_add</c></seemfa>(<seemfa
+ marker="#send_request/3"><c>gen_event:send_request</c></seemfa><c>(<anno>EventMgrRef</anno>,
+ <anno>Handler</anno>, <anno>Request</anno>), <anno>Label</anno>,
+ <anno>ReqIdCollection</anno>)</c>, but calling <c>send_request/5</c>
+ is slightly more efficient.
+ </p>
+ </desc>
+ </func>
+
<func>
<name since="">start() -> Result</name>
<name since="">start(EventMgrName | Options) -> Result</name>
@@ -637,10 +963,16 @@ gen_event:stop -----> Module:terminate/2
specifies how many milliseconds to wait for the event manager to
terminate, or the atom <c>infinity</c> to wait
indefinitely. Defaults to <c>infinity</c>. If the
- event manager has not terminated within the specified time, a
- <c>timeout</c> exception is raised.</p>
- <p>If the process does not exist, a <c>noproc</c> exception
- is raised.</p>
+ event manager has not terminated within the specified time,
+ the call exits the calling process
+ with reason <c>timeout</c>.</p>
+ <p>
+ If the process does not exist, the call exits
+ the calling process with reason <c>noproc</c>,
+ and with reason <c>{nodedown,Node}</c>
+ if the connection fails to the remote <c>Node</c>
+ where the server runs.
+ </p>
<p>For a description of <c>EventMgrRef</c>, see
<seemfa marker="#add_handler/3"><c>add_handler/3</c></seemfa>.</p>
</desc>
@@ -719,30 +1051,24 @@ gen_event:stop -----> Module:terminate/2
</func>
<func>
- <name since="OTP 23.0">wait_response(RequestId, Timeout) -> Result</name>
- <fsummary>Wait for a reply from a server.</fsummary>
- <type>
- <v>RequestId = request_id()</v>
- <v>Reply = term()</v>
- <v>Timeout = timeout()</v>
- <v>Result = {reply, Reply} | timeout | {error, Error}</v>
- <v>Reply = Error = term()</v>
- </type>
+ <name name="wait_response" arity="2" since="OTP 23.0"/>
+ <fsummary>Wait or poll for a response to an asynchronous call request
+ to a generic event manager.</fsummary>
<desc>
<p>
- This function is used to wait for a reply of a request made with
- <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
- to the event manager. This function must be called from the same
- process from which <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
- was made.
+ Wait for a response corresponding to the request identifier
+ <c><anno>ReqId</anno></c>. The request must have been made by
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
+ to the <c>gen_statem</c> process. This function must be called
+ from the same process from which
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa>
+ was made.
</p>
<p>
- <c>Timeout</c> is an integer greater then or equal to zero
- that specifies how many milliseconds to wait for an reply, or
- the atom <c>infinity</c> to wait indefinitely.
- If no reply is received within the specified
+ <c><anno>WaitTime</anno></c> specifies how long to wait for
+ a response. If no response is received within the specified
time, the function returns <c>timeout</c> and no cleanup is
- done, and thus the function must be invoked repeatedly until a
+ done, and thus the function can be invoked repeatedly until a
reply is returned.
</p>
<p>
@@ -760,15 +1086,93 @@ gen_event:stop -----> Module:terminate/2
</p>
<p>
The difference between
- <seemfa marker="#receive_response/2"><c>receive_response()</c></seemfa>
- and <c>wait_response()</c> is that <c>receive_response()</c>
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>
+ and <c>wait_response/2</c> is that <c>receive_response/2</c>
abandons the request at timeout so that a potential future
- response is ignored, while <c>wait_response()</c> does not.
+ response is ignored, while <c>wait_response/2</c> does not.
</p>
</desc>
</func>
<func>
+ <name name="wait_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Wait or poll for a response to an asynchronous call request
+ to a generic event manager.</fsummary>
+ <desc>
+ <p>
+ Wait for a response corresponding to a request identifier saved
+ in <c><anno>ReqIdCollection</anno></c>. All request identifiers
+ of <c><anno>ReqIdCollection</anno></c> must correspond to requests
+ that have been made using
+ <seemfa marker="#send_request/3"><c>send_request/3</c></seemfa> or
+ <seemfa marker="#send_request/5"><c>send_request/5</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">saving the request id</seemfa> in
+ a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/5"><c>send_request/5</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>wait_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, <c>no_request</c>
+ will be returned. If no response is received before the
+ <c><anno>WaitTime</anno></c> timeout has triggered, the atom
+ <c>timeout</c> is returned. It is valid to continue waiting for a
+ response as many times as needed up until a response has been received
+ and completed by <c>check_response()</c>, <c>receive_response()</c>,
+ or <c>wait_response()</c>.
+ </p>
+ <p>
+ The difference between
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>
+ and <c>wait_response/3</c> is that <c>receive_response/3</c>
+ abandons requests at timeout so that a potential future
+ responses are ignored, while <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>wait_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>wait_response/3</c>, it will always block
+ until a timeout determined by <c><anno>WaitTime</anno></c> is
+ triggered and then return <c>no_reply</c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
<name since="">which_handlers(EventMgrRef) -> [Handler]</name>
<fsummary>Return all event handlers installed in a generic event manager.
</fsummary>
@@ -835,6 +1239,77 @@ gen_event:stop -----> Module:terminate/2
</func>
<func>
+ <name since="OTP @OTP-17351@">Module:format_status(Status) -> NewStatus</name>
+ <fsummary>Optional function for providing a term describing the
+ current event handler state.</fsummary>
+ <type>
+ <v>Status = #{ state => State,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ message => Message,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ reason => Reason,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ log => Log }</v>
+ <v>NewStatus = Status</v>
+ <v>State = Message = Reason = term()</v>
+ <v>Log = [<seetype marker="sys#system_event">sys:system_event()</seetype>]</v>
+ </type>
+ <desc>
+ <note>
+ <p>This callback is optional, so event handler modules need
+ not export it. If a handler does not export this function,
+ the <c>gen_event</c> module uses the handler state directly for
+ the purposes described below.</p>
+ <p>
+ If this callback is exported but fails, to hide possibly sensitive
+ data, the default function will instead return the fact that
+ <c>format_status/1</c> has crashed.</p>
+ </note>
+ <p>This function is called by a <c>gen_event</c> process in the
+ following situations:</p>
+ <list type="bulleted">
+ <item>One of <seemfa marker="sys#get_status/1">
+ <c>sys:get_status/1,2</c></seemfa>
+ is invoked to get the <c>gen_event</c> status.</item>
+ <item>The event handler terminates abnormally and <c>gen_event</c>
+ logs an error.</item>
+ </list>
+ <p>This callback is to be used to limit the status of the event handler before
+ returned by <seemfa marker="sys#get_status/1"><c>sys:get_status/1,2</c></seemfa> or
+ sent to <seeerl marker="kernel:logger"><c>logger</c></seeerl>. The status
+ of the event handler is passed as a map with the following associations:
+ </p>
+ <taglist>
+ <tag><c>state => term()</c></tag>
+ <item>The internal state of the event handler.</item>
+ <tag><c>message => term()</c></tag>
+ <item>The message that caused the event handler to terminate.</item>
+ <tag><c>reason => term()</c></tag>
+ <item>The reason that caused the event handler to terminate.</item>
+ <tag><c>log => [</c><seetype marker="sys#system_event"><c>sys:system_event/0</c></seetype><c>]</c></tag>
+ <item>The <seemfa marker="sys#log/2">sys log</seemfa> of the server.</item>
+ </taglist>
+ <p>New associations may be added into the status map without prior notice.</p>
+ <p>The function is to return <c>NewStatus</c>, a map containing the same
+ associations as the input map.</p>
+ <p>Two possible use cases for this callback is to either remove
+ sensitive information from the state so that it not printed in log files,
+ or to remove large irrelevant terms of state that clutter the logs.</p>
+ <code type="erl"><![CDATA[
+format_status(Status) ->
+ maps:map(
+ fun(state,State) ->
+ maps:remove(private_key, State);
+ (message,{password, _Pass}) ->
+ {password, removed};
+ (_,Value) ->
+ Value
+ end, Status).
+]]></code>
+ </desc>
+ </func>
+
+ <func>
<name since="OTP R14B">Module:format_status(Opt, [PDict, State]) -> Status</name>
<fsummary>Optional function for providing a term describing the
current event handler state.</fsummary>
@@ -845,6 +1320,11 @@ gen_event:stop -----> Module:terminate/2
<v>Status = term()</v>
</type>
<desc>
+ <warning>
+ <p>This callback is deprecated, in new code use <seemfa marker="#Module:format_status/1">
+ format_status/1</seemfa>. If a <seemfa marker="#Module:format_status/1">format_status/1</seemfa>
+ callback exists, then this function will never be called.</p>
+ </warning>
<note>
<p>This callback is optional, so event handler modules need
not export it. If a handler does not export this function,
@@ -1005,6 +1485,14 @@ gen_event:stop -----> Module:terminate/2
an event manager receives any other message than an event or
a synchronous request (or a system message).</p>
<p><c>Info</c> is the received message.</p>
+ <p>In particular, this callback will be made when a process terminated
+ after calling
+ <seemfa marker="#add_sup_handler/3">
+ <c>add_sup_handler/3</c></seemfa>. Any event handler
+ attached to an event manager which in turn has a supervised handler
+ should expect callbacks of the shape
+ <seemfa marker="#Module:handle_info/2">
+ <c>Module:handle_info({'EXIT', Pid, Reason}, State)</c></seemfa>.</p>
<p>For a description of <c>State</c> and possible return values, see
<seemfa marker="#Module:handle_event/2">
<c>Module:handle_event/2</c></seemfa>.</p>
diff --git a/lib/stdlib/doc/src/gen_server.xml b/lib/stdlib/doc/src/gen_server.xml
index c0c806c309..6f5a650acc 100644
--- a/lib/stdlib/doc/src/gen_server.xml
+++ b/lib/stdlib/doc/src/gen_server.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -109,632 +109,1349 @@ gen_server:abcast -----> Module:handle_cast/2
</description>
+
+
+ <datatypes>
+ <datatype>
+ <name name="server_name"/>
+ <desc>
+ <p>
+ Name specification to use when starting a <c>gen_server</c>.
+ See functions
+ <seemfa marker="#start/3"><c>start/3,4</c></seemfa>,
+ <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>,
+ <seemfa marker="#start_monitor/3"><c>start_monitor/3,4</c></seemfa>,
+ <seemfa marker="#enter_loop/3"><c>enter_loop/3,4,5</c></seemfa>,
+ and the type
+ <seetype marker="#server_ref"><c>server_ref()</c></seetype>
+ below.
+ </p>
+ <taglist>
+ <tag><c>{local,<anno>LocalName</anno>}</c></tag>
+ <item>
+ <p>
+ Register the <c>gen_server</c> locally
+ as <c><anno>LocalName</anno></c> using
+ <seemfa marker="erts:erlang#register/2">
+ <c>register/2</c></seemfa>.
+ </p>
+ </item>
+ <tag><c>{global,<anno>GlobalName</anno>}</c></tag>
+ <item>
+ <p>
+ Register the <c>gen_server</c> process id
+ globally as <c>GlobalName</c> using
+ <seemfa marker="kernel:global#register_name/2">
+ <c>global:register_name/2</c></seemfa>.
+ </p>
+ </item>
+ <tag><c>{via,<anno>RegMod</anno>,<anno>ViaName</anno>}</c></tag>
+ <item>
+ <p>
+ Register the <c>gen_server</c> process with the registry
+ represented by <c><anno>RegMod</anno></c>.
+ The <c><anno>RegMod</anno></c> callback is to export
+ the functions <c>register_name/2</c>, <c>unregister_name/1</c>,
+ <c>whereis_name/1</c>, and <c>send/2</c>, which are to behave
+ like the corresponding functions in
+ <seeerl marker="kernel:global"><c>global</c></seeerl>.
+ Thus, <c>{via,global,<anno>GlobalName</anno>}</c>
+ is a valid reference equivalent to
+ <c>{global,<anno>GlobalName</anno>}</c>.
+ </p>
+ </item>
+ </taglist>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="server_ref"/>
+ <desc>
+ <p>
+ Server specification to use when addressing
+ a <c>gen_server</c>.
+ See <seemfa marker="#call/2"><c>call/2,3</c></seemfa>,
+ <seemfa marker="#cast/2"><c>cast/2</c></seemfa>,
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>,
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>,
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ <seemfa marker="#stop/1"><c>stop/2,3</c></seemfa>
+ and the type
+ <seetype marker="#server_name"><c>server_name()</c></seetype>
+ above.
+ </p>
+ <p>It can be:</p>
+ <taglist>
+ <tag><c>pid()</c></tag>
+ <item>
+ <p>
+ The <c>gen_server</c>'s process identifier.
+ </p>
+ </item>
+ <tag><c><anno>LocalName</anno></c></tag>
+ <item>
+ <p>
+ The <c>gen_server</c> is locally registered
+ as <c><anno>LocalName</anno></c> with
+ <seemfa marker="erts:erlang#register/2">
+ <c>register/2</c></seemfa>.
+ </p>
+ </item>
+ <tag><c>{<anno>Name</anno>,<anno>Node</anno>}</c></tag>
+ <item>
+ <p>
+ The <c>gen_server</c> is locally registered
+ on another node.
+ </p>
+ </item>
+ <tag><c>{global,<anno>GlobalName</anno>}</c></tag>
+ <item>
+ <p>
+ The <c>gen_server</c> is globally registered in
+ <seeerl marker="kernel:global"><c>global</c></seeerl>.
+ </p>
+ </item>
+ <tag><c>{via,<anno>RegMod</anno>,<anno>ViaName</anno>}</c></tag>
+ <item>
+ <p>
+ The <c>gen_server</c> is registered in
+ an alternative process registry.
+ The registry callback module <c><anno>RegMod</anno></c>
+ is to export functions
+ <c>register_name/2</c>, <c>unregister_name/1</c>,
+ <c>whereis_name/1</c>, and <c>send/2</c>,
+ which are to behave like the corresponding functions in
+ <seeerl marker="kernel:global"><c>global</c></seeerl>.
+ Thus, <c>{via,global,<anno>GlobalName</anno>}</c>
+ is the same as <c>{global,<anno>GlobalName</anno>}</c>.
+ </p>
+ </item>
+ </taglist>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="start_opt"/>
+ <desc>
+ <p>
+ Options that can be used when starting
+ a <c>gen_server</c> server through, for example,
+ <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>.
+ </p>
+ <taglist>
+ <tag><c>{timeout,<anno>Timeout</anno>}</c></tag>
+ <item>
+ <p>
+ How many milliseconds the <c>gen_server</c> process is allowed
+ to spend initializing or it is terminated and the
+ start function returns <c>{error,timeout}</c>.
+ </p>
+ </item>
+ <tag>
+ <c>{spawn_opt,<anno>SpawnOptions</anno>}</c>
+ </tag>
+ <item>
+ <p>
+ The <c><anno>SpawnOptions</anno></c> option list
+ is passed to the function used to spawn
+ the <c>gen_server</c>; see
+ <seemfa marker="erts:erlang#spawn_opt/2">
+ <c>spawn_opt/2</c></seemfa>.
+ </p>
+ <note>
+ <p>
+ Using spawn option <c>monitor</c> is not
+ allowed, it causes a <c>badarg</c> failure.
+ </p>
+ </note>
+ </item>
+ <tag><c>enter_loop_opt()</c></tag>
+ <item>
+ <p>
+ See the type
+ <seetype marker="#enter_loop_opt"><c>enter_loop_opt()</c></seetype>
+ below for more start options that are also allowed by
+ <seemfa marker="#enter_loop/3"><c>enter_loop/3,4,5</c></seemfa>.
+ </p>
+ </item>
+ </taglist>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="enter_loop_opt"/>
+ <desc>
+ <p>
+ Options that can be used when starting
+ a <c>gen_server</c> server through
+ <seemfa marker="#enter_loop/3"><c>enter_loop/3-5</c></seemfa>
+ or the start functions such as
+ <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>.
+ </p>
+ <taglist>
+ <tag><c>{hibernate_after,<anno>HibernateAfterTimeout</anno>}</c></tag>
+ <item>
+ <p>
+ Specifies that the <c>gen_server</c> process awaits
+ any message for <c>HibernateAfterTimeout</c> milliseconds and
+ if no message is received, the process goes into hibernation
+ automatically (by calling
+ <seemfa marker="proc_lib#hibernate/3">
+ <c>proc_lib:hibernate/3</c></seemfa>).
+ </p>
+ </item>
+ <tag><c>{debug,<anno>Dbgs</anno>}</c></tag>
+ <item>
+ <p>
+ For every entry in <c><anno>Dbgs</anno></c>,
+ the corresponding function in
+ <seeerl marker="sys"><c>sys(3)</c></seeerl> is called.
+ </p>
+ </item>
+ </taglist>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="start_ret"/>
+ <desc>
+ <p>
+ Return value from the
+ <seemfa marker="#start/3"><c>start/3,4</c></seemfa>
+ and
+ <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>
+ functions.
+ </p>
+ <taglist>
+ <tag><c>{ok,<anno>Pid</anno>}</c></tag>
+ <item>
+ <p>
+ The <c>gen_server</c> process was succesfully created
+ and initialized, with the process identifier
+ <c><anno>Pid</anno></c>.
+ </p>
+ </item>
+ <tag><c>{error,{already_started,OtherPid}}</c></tag>
+ <item>
+ <p>
+ A process with the specified <c>ServerName</c> exists already
+ with the process identifier <c>OtherPid</c>.
+ This <c>gen_server</c> was not started.
+ </p>
+ </item>
+ <tag><c>ignore</c></tag>
+ <item>
+ <p>
+ <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>
+ returned <c>ignore</c>, the <c>gen_server</c> process
+ is terminated. An exit signal <c>normal</c> is sent
+ to linked processes and ports.
+ </p>
+ </item>
+ <tag><c>{error,<anno>Reason</anno>}</c></tag>
+ <item>
+ <p>
+ <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>
+ returned <c>{stop,<anno>Reason</anno>}</c>
+ or failed with <c><anno>Reason</anno></c>.
+ The <c>gen_server</c> process is terminated and
+ an exit signal with the same <c><anno>Reason</anno></c>
+ is sent to linked processes and ports.
+ </p>
+ </item>
+ </taglist>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="start_mon_ret"/>
+ <desc>
+ <p>
+ Return value from the
+ <seemfa marker="#start_monitor/3"><c>start_monitor/3,4</c></seemfa>
+ functions.
+ The same as type
+ <seetype marker="#start_ret"><c>start_ret()</c></seetype>
+ except that for a succesful start it returns both
+ the process identifier <c><anno>Pid</anno></c> and a
+ <seemfa marker="erts:erlang#monitor/2"><c>monitor/2,3</c></seemfa>
+ <c>reference()</c> <c><anno>MonRef</anno></c>.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="from"/>
+ <desc>
+ <p>
+ Destination, given to the <c>gen_server</c>
+ as the first argument to the callback function
+ <seemfa marker="#Module:handle_call/3"><c>Module:handle_call/3</c></seemfa>,
+ to be used by the when replying through
+ <seemfa marker="#reply/2"><c>reply/2</c></seemfa>
+ (instead of through the callback function's return value)
+ to the process <c><anno>Client</anno></c>
+ that has called the <c>gen_server</c> using
+ <seemfa marker="#call/2"><c>call/2,3</c></seemfa>.
+ <c><anno>Tag</anno></c> is a term that is unique
+ for this call/request instance.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="reply_tag"/>
+ <desc>
+ <p>
+ A handle that associates a reply to the corresponding request.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="request_id"/>
+ <desc>
+ <p>
+ An opaque request identifier. See
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
+ for details.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="request_id_collection"/>
+ <desc>
+ <p>
+ An opaque collection of request identifiers
+ (<seetype marker="#request_id"><c>request_id()</c></seetype>)
+ where each request identifier can be associated with a label
+ chosen by the user. For more information see
+ <seemfa marker="#reqids_new/0"><c>reqids_new/0</c></seemfa>.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="response_timeout"/>
+ <desc>
+ <p>
+ Used to set a time limit on how long to wait for a response using
+ either
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ or
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ The time unit used is <c>millisecond</c>. Currently valid values:
+ </p>
+ <taglist>
+ <tag><c>0..4294967295</c></tag>
+ <item><p>
+ Timeout relative to current time in milliseconds.
+ </p></item>
+ <tag><c>infinity</c></tag>
+ <item><p>
+ Infinite timeout. That is, the operation will never time out.
+ </p></item>
+ <tag><c>{abs, Timeout}</c></tag>
+ <item><p>
+ An absolute
+ <seemfa marker="erts:erlang#monotonic_time/1">Erlang monotonic time</seemfa>
+ timeout in milliseconds. That is, the operation will time out when
+ <seemfa marker="erts:erlang#monotonic_time/1"><c>erlang:monotonic_time(millisecond)</c></seemfa>
+ returns a value larger than or equal to <c>Timeout</c>. <c>Timeout</c>
+ is not allowed to identify a time further into the future than <c>4294967295</c>
+ milliseconds. Identifying the timeout using an absolute timeout value
+ is especially handy when you have a deadline for responses corresponding
+ to a complete collection of requests
+ (<seetype marker="#request_id_collection"><c>request_id_collection()</c></seetype>)
+,
+ since you do not have to recalculate the relative time until the deadline
+ over and over again.
+ </p></item>
+ </taglist>
+ </desc>
+ </datatype>
+ </datatypes>
+
+
+
<funcs>
<func>
- <name since="">abcast(Name, Request) -> abcast</name>
- <name since="">abcast(Nodes, Name, Request) -> abcast</name>
- <fsummary>Send an asynchronous request to many generic servers.</fsummary>
- <type>
- <v>Nodes = [Node]</v>
- <v>&nbsp;Node = atom()</v>
- <v>Name = atom()</v>
- <v>Request = term()</v>
- </type>
+ <name name="abcast" arity="2" since=""/>
+ <name name="abcast" arity="3" since=""/>
+ <fsummary>
+ Send an asynchronous request to many generic servers.
+ </fsummary>
<desc>
- <p>Sends an asynchronous request to the <c>gen_server</c> processes
- locally registered as <c>Name</c> at the specified nodes. The function
+ <p>
+ Sends an asynchronous request to the <c>gen_server</c> processes
+ locally registered as <c><anno>Name</anno></c>
+ at the specified nodes. The function
returns immediately and ignores nodes that do not exist, or
- where the <c>gen_server</c> <c>Name</c> does not exist.
+ where the <c>gen_server</c>
+ <c><anno>Name</anno></c> does not exist.
The <c>gen_server</c> processes call
<seemfa marker="#Module:handle_cast/2">
- <c>Module:handle_cast/2</c></seemfa> to handle the request.</p>
- <p>For a description of the arguments, see
- <seemfa marker="#multi_call/2"><c>multi_call/2,3,4</c></seemfa>.</p>
+ <c>Module:handle_cast/2</c>
+ </seemfa> to handle the request.
+ </p>
+ <p>
+ For a description of the arguments, see
+ <seemfa marker="#multi_call/2"><c>multi_call/2,3,4</c></seemfa>.
+ </p>
</desc>
</func>
<func>
- <name since="">call(ServerRef, Request) -> Reply</name>
- <name since="">call(ServerRef, Request, Timeout) -> Reply</name>
+ <name name="call" arity="2" since=""/>
+ <name name="call" arity="3" since=""/>
<fsummary>Make a synchronous call to a generic server.</fsummary>
- <type>
- <v>ServerRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Request = term()</v>
- <v>Timeout = int()>0 | infinity</v>
- <v>Reply = term()</v>
- </type>
<desc>
- <p>Makes a synchronous call to the <c>ServerRef</c> of the
- <c>gen_server</c> process
+ <p>
+ Makes a synchronous call to the
+ <c><anno>ServerRef</anno></c> of the <c>gen_server</c> process
by sending a request and waiting until a reply arrives or a
time-out occurs. The <c>gen_server</c> process calls
<seemfa marker="#Module:handle_call/3">
- <c>Module:handle_call/3</c></seemfa> to handle the request.</p>
- <p><c>ServerRef</c> can be any of the following:</p>
- <list type="bulleted">
- <item>The pid</item>
- <item><c>Name</c>, if the <c>gen_server</c> process is locally
- registered</item>
- <item><c>{Name,Node}</c>, if the <c>gen_server</c> process is locally
- registered at another node</item>
- <item><c>{global,GlobalName}</c>, if the <c>gen_server</c> process is
- globally registered</item>
- <item><c>{via,Module,ViaName}</c>, if the <c>gen_server</c> process is
- registered through an alternative process registry</item>
- </list>
- <p><c>Request</c> is any term that is passed as the
- first argument to <c>Module:handle_call/3</c>.</p>
- <p><c>Timeout</c> is an integer greater than zero that
+ <c>Module:handle_call/3</c>
+ </seemfa>
+ to handle the request.
+ </p>
+ <p>
+ See also <c><anno>ServerRef</anno></c>'s type
+ <seetype marker="#server_ref"><c>server_ref()</c></seetype>.
+ </p>
+ <p>
+ <c><anno>Request</anno></c> is any term that is passed as the
+ first argument to <c>Module:handle_call/3</c>.
+ </p>
+ <p>
+ <c><anno>Timeout</anno></c> is an integer that
specifies how many milliseconds to wait for a reply, or
- the atom <c>infinity</c> to wait indefinitely. Defaults to
- 5000. If no reply is received within the specified time,
- the function call fails. If the caller catches the failure
- and continues running, and the server is just late with the reply,
- it can arrive at any time later into the message queue of the caller.
- The caller must in this case be prepared for this
- and discard any such garbage messages that are two element
- tuples with a reference as the first element.</p>
- <p>The return value <c>Reply</c> is defined in the return value
- of <c>Module:handle_call/3</c>.</p>
- <p>The call can fail for many reasons, including time-out and the
- called <c>gen_server</c> process dying before or during the call.</p>
+ the atom <c>infinity</c> to wait indefinitely.
+ Defaults to 5000.
+ If no reply is received within the specified time,
+ this function exits the calling process with an exit term
+ containing <c>Reason&nbsp;=&nbsp;timeout</c> as described below.
+ </p>
+ <note>
+ <p>
+ If the caller uses (<c>try</c>...)<c>catch</c>
+ to avoid process exit,
+ and the server happens to just be late with the reply,
+ it may arrive to the process message queue any time later.
+ The calling process must therefore after catching a time-out exit
+ be prepared to receive garbage message(s)
+ on the form <c>{reference(),&nbsp;_}</c>
+ and deal with them appropriately (discard them)
+ so they do not clog the process message queue
+ or gets mistaken for other messages.
+ </p>
+ </note>
+ <p>
+ The return value <c><anno>Reply</anno></c>
+ is passed from the return value of <c>Module:handle_call/3</c>.
+ </p>
+ <p>
+ This call may exit the callling process
+ with an exit term on the form
+ <c>{Reason,&nbsp;Location}</c> where
+ <c>Location&nbsp;=&nbsp;{gen_server,call,ArgList}</c>
+ and <c>Reason</c> can be (at least) one of:
+ </p>
+ <taglist>
+ <tag><c>timeout</c></tag>
+ <item>
+ <p>
+ The call was aborted after waiting
+ <c><anno>Timeout</anno></c> milliseconds for a reply,
+ as described above.
+ </p>
+ </item>
+ <tag><c>noproc</c></tag>
+ <item>
+ <p>
+ The <c><anno>ServerRef</anno></c> refers to
+ a server by name (it is not a <c>pid()</c>)
+ and looking up the server process failed,
+ or the <c>pid()</c> was already terminated.
+ </p>
+ </item>
+ <tag><c>{nodedown,Node}</c></tag>
+ <item>
+ <p>
+ The <c><anno>ServerRef</anno></c> refers to a server
+ on the remote node <c>Node</c> and the connection
+ to that node failed.
+ </p>
+ </item>
+ <tag><c>calling_self</c></tag>
+ <item>
+ <p>A call to <c>self()</c> would hang indefinitely.</p>
+ </item>
+ <tag>
+ <c>shutdown</c><br/>
+ </tag>
+ <item>
+ <p>
+ The server was stopped during the call
+ by its supervisor. See also
+ <seemfa marker="#stop/3"><c>stop/3</c></seemfa>.
+ </p>
+ </item>
+ <tag>
+ <c>normal</c><br/>
+ <c>{shutdown,Term}</c><br/>
+ </tag>
+ <item>
+ <p>
+ The server stopped during the call by returning
+ <c>{stop,Reason,_}</c> from its
+ <seemfa marker="#Module:handle_call/3">
+ <c>Module:handle_call/3</c>
+ </seemfa>
+ callback, without replying. See also
+ <seemfa marker="#stop/3"><c>stop/3</c></seemfa>.
+ </p>
+ </item>
+ <tag><c>_OtherTerm</c></tag>
+ <item>
+ <p>
+ The server process exited during the call,
+ with reason <c>Reason</c>. Either by returning
+ <c>{stop,Reason,_}</c> from its
+ <seemfa marker="#Module:handle_call/3">
+ <c>Module:handle_call/3</c>
+ </seemfa>
+ callback (without replying),
+ by raising an exception,
+ or due to getting an exit signal it did not trap.
+ </p>
+ </item>
+ </taglist>
</desc>
</func>
<func>
- <name since="">cast(ServerRef, Request) -> ok</name>
+ <name name="cast" arity="2" since=""/>
<fsummary>Send an asynchronous request to a generic server.</fsummary>
- <type>
- <v>ServerRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Request = term()</v>
- </type>
<desc>
- <p>Sends an asynchronous request to the <c>ServerRef</c> of the
- <c>gen_server</c> process
- and returns <c>ok</c> immediately, ignoring
- if the destination node or <c>gen_server</c> process does not exist.
+ <p>
+ Sends an asynchronous request to the
+ <c><anno>ServerRef</anno></c> of the
+ <c>gen_server</c> process and returns <c>ok</c> immediately,
+ ignoring if the destination node or <c>gen_server</c> process
+ does not exist.
The <c>gen_server</c> process calls
<seemfa marker="#Module:handle_cast/2">
- <c>Module:handle_cast/2</c></seemfa> to handle the request.</p>
- <p>For a description of <c>ServerRef</c>, see
- <seemfa marker="#call/2"><c>call/2,3</c></seemfa>.</p>
- <p><c>Request</c> is any term that is passed as one
- of the arguments to <c>Module:handle_cast/2</c>.</p>
+ <c>Module:handle_cast/2</c>
+ </seemfa>
+ to handle the request.
+ </p>
+ <p>
+ See also <c><anno>ServerRef</anno></c>'s type
+ <seetype marker="#server_ref"><c>server_ref()</c></seetype>.
+ </p>
+ <p>
+ <c><anno>Request</anno></c> is any term that is passed as
+ the first argument to <c>Module:handle_cast/2</c>.
+ </p>
</desc>
</func>
<func>
- <name since="OTP-23">check_response(Msg, RequestId) -> Result</name>
- <fsummary>Check if a message is a reply from a server.</fsummary>
- <type>
- <v>RequestId = term()</v>
- <v>Result = {reply, Reply} | no_reply | {error, {Reason, ServerRef}}</v>
- <v>Msg = Reply = term()</v>
- <v>Timeout = timeout()</v>
- <v>Reason = term()</v>
- <v>ServerRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- </type>
+ <name name="check_response" arity="2" since="OTP 23.0"/>
+ <fsummary>Check if a message is a response from a server.</fsummary>
<desc>
<p>
- This function is used to check if a previously received
- message, for example by <c>receive</c> or
- <c>handle_info/2</c>, is a result of a request made with
- <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>.
- If <c>Msg</c> is a reply to the handle <c>RequestId</c>
- the result of the request is returned in <c>Reply</c>.
- Otherwise returns <c>no_reply</c> and no cleanup is done, and
- thus the function must be invoked repeatedly until a reply
- is returned.
+ Check if <c><anno>Msg</anno></c> is a response corresponding
+ to the request identifier <c><anno>ReqId</anno></c>. The request
+ must have been made by
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>,
+ and it must have been made by the same process calling
+ this function.
</p>
+ <p>
+ If <c><anno>Msg</anno></c> is a response corresponding to
+ <c><anno>ReqId</anno></c> the response is returned; otherwise,
+ <c>no_reply</c> is returned and no cleanup is done, and
+ thus the function must be invoked repeatedly until a response
+ is returned.
+ </p>
<p>
- The return value <c>Reply</c> is defined in the return value
- of <c>Module:handle_call/3</c>.
+ The return value <c><anno>Reply</anno></c> is passed from the
+ return value of <c>Module:handle_call/3</c>.
</p>
<p>
The function returns an error if the <c>gen_server</c>
- dies before or during this request.
+ died before a reply was sent.
</p>
</desc>
</func>
+
+ <func>
+ <name name="check_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Check if a message is a response from a server.</fsummary>
+ <desc>
+ <p>
+ Check if <c><anno>Msg</anno></c> is a response corresponding
+ to a request identifier saved in <c><anno>ReqIdCollection</anno></c>.
+ All request identifiers of <c><anno>ReqIdCollection</anno></c>
+ must correspond to requests that have been made using
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa> or
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">saving the request id</seemfa>
+ in a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>check_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned. If <c><anno>Msg</anno></c>
+ does not correspond to any of the request identifiers in
+ <c><anno>ReqIdCollection</anno></c>, the atom
+ <c>no_reply</c> is returned.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>check_response/3</c>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>check_response/3</c>, it will always
+ return <c>no_reply</c>.
+ </p>
+ </desc>
+ </func>
<func>
- <name since="">enter_loop(Module, Options, State)</name>
- <name since="">enter_loop(Module, Options, State, ServerName)</name>
- <name since="">enter_loop(Module, Options, State, Timeout)</name>
- <name since="">enter_loop(Module, Options, State, ServerName, Timeout)</name>
+ <name name="enter_loop" arity="3" since=""/>
+ <name name="enter_loop" arity="4" clause_i="1" since=""/>
+ <name name="enter_loop" arity="4" clause_i="2" since=""/>
+ <name name="enter_loop" arity="4" clause_i="3" since=""/>
+ <name name="enter_loop" arity="4" clause_i="4" since=""/>
+ <name name="enter_loop" arity="5" clause_i="1" since=""/>
+ <name name="enter_loop" arity="5" clause_i="2" since=""/>
+ <name name="enter_loop" arity="5" clause_i="3" since=""/>
<fsummary>Enter the <c>gen_server</c> receive loop.</fsummary>
- <type>
- <v>Module = atom()</v>
- <v>Options = [Option]</v>
- <v>&nbsp;Option = {debug,Dbgs} | {hibernate_after,HibernateAfterTimeout}</v>
- <v>&nbsp;&nbsp;Dbgs = [Dbg]</v>
- <v>&nbsp;&nbsp;&nbsp;Dbg = trace | log | statistics</v>
- <v>&nbsp;&nbsp;&nbsp;&nbsp;| {log_to_file,FileName} | {install,{Func,FuncState}}</v>
- <v>State = term()</v>
- <v>ServerName = {local,Name} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName}</v>
- <v>&nbsp;Name = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Timeout = int() | infinity</v>
- </type>
<desc>
- <p>Makes an existing process into a <c>gen_server</c> process. Does not
- return, instead the calling process enters the <c>gen_server</c>
- process receive
- loop and becomes a <c>gen_server</c> process. The process
- <em>must</em> have been started using one of the start functions in
- <seeerl marker="proc_lib"><c>proc_lib(3)</c></seeerl>. The user is
- responsible for any initialization of the process, including
- registering a name for it.</p>
- <p>This function is useful when a more complex initialization procedure
- is needed than the <c>gen_server</c> process behavior provides.</p>
- <p><c>Module</c>, <c>Options</c>, and <c>ServerName</c> have
+ <p>
+ Makes an existing process a <c>gen_server</c> process.
+ Does not return, instead the calling process enters
+ the <c>gen_server</c> process receive loop
+ and becomes a <c>gen_server</c> process.
+ The process <em>must</em> have been started using
+ one of the start functions in
+ <seeerl marker="proc_lib"><c>proc_lib(3)</c></seeerl>.
+ The user is responsible for any initialization of the process,
+ including registering a name for it.
+ </p>
+ <p>
+ This function is useful when a more complex
+ initialization procedure is needed
+ than the <c>gen_server</c> process behavior provides.
+ </p>
+ <p>
+ <c><anno>Module</anno></c>, <c><anno>Options</anno></c>,
+ and <c><anno>ServerName</anno></c> have
the same meanings as when calling
- <seemfa marker="#start_link/3"><c>start[_link|_monitor]/3,4</c></seemfa>.
- However, if <c>ServerName</c> is specified, the process must
- have been registered accordingly <em>before</em> this function
- is called.</p>
- <p><c>State</c> and <c>Timeout</c> have the same meanings as in
+ <seemfa marker="#start_link/3">
+ <c>start[_link|_monitor]/3,4</c>
+ </seemfa>
+ or it can be <c>self()</c> for an anonymous server,
+ which is the same as calling an <c>enter_loop/3,4</c> function
+ without a <c><anno>ServerName</anno></c> argument.
+ However, if <c><anno>ServerName</anno></c> is specified
+ (and not as <c>self()</c>),
+ the process must have been registered accordingly
+ <em>before</em> this function is called.
+ </p>
+ <p>
+ <c><anno>State</anno></c>, <c><anno>Timeout</anno></c>,
+ <c><anno>Hibernate</anno></c> and <c><anno>Cont</anno></c> have the same meanings as in
the return value of
- <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>.
- The callback module <c>Module</c> does not need to
- export an <c>init/1</c> function.</p>
- <p>The function fails if the calling process was not started by a
+ <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>,
+ which is <em>not</em> called when <c>enter_loop/3,4,5</c> is used.
+ Note that to adhere to the
+ <seeguide marker="system/design_principles:gen_server_concepts">
+ gen_server Behaviour
+ </seeguide>
+ such a callback function needs to be defined,
+ and it might as well be the one used when starting
+ the <c>gen_server</c> process through <c>proc_lib</c>,
+ and then be the one that calls <c>enter_loop/3,4,5</c>.
+ But if such a <c>Module:init/1</c> function
+ in for example error cases cannot call
+ <c>enter_loop/3,4,5</c>, it should return a value
+ that follows the type specification for
+ <c>Module:init/1</c> such as <c>ignore</c>,
+ although that value will be lost
+ when returning to the spawning function.
+ </p>
+ <p>
+ This function fails if the calling process was not started by a
<c>proc_lib</c> start function, or if it is not registered
- according to <c>ServerName</c>.</p>
+ according to <c><anno>ServerName</anno></c>.
+ </p>
</desc>
</func>
<func>
- <name since="">multi_call(Name, Request) -> Result</name>
- <name since="">multi_call(Nodes, Name, Request) -> Result</name>
- <name since="">multi_call(Nodes, Name, Request, Timeout) -> Result</name>
+ <name name="multi_call" arity="2" since=""/>
+ <name name="multi_call" arity="3" since=""/>
+ <name name="multi_call" arity="4" since=""/>
<fsummary>Make a synchronous call to many generic servers.</fsummary>
- <type>
- <v>Nodes = [Node]</v>
- <v>&nbsp;Node = atom()</v>
- <v>Name = atom()</v>
- <v>Request = term()</v>
- <v>Timeout = int()>=0 | infinity</v>
- <v>Result = {Replies,BadNodes}</v>
- <v>&nbsp;Replies = [{Node,Reply}]</v>
- <v>&nbsp;&nbsp;Reply = term()</v>
- <v>BadNodes = [Node]</v>
- </type>
<desc>
- <p>Makes a synchronous call to all <c>gen_server</c> processes locally
- registered as <c>Name</c> at the specified nodes by first
- sending a request to every node and then waits for
- the replies. The <c>gen_server</c> process calls
+ <p>
+ Makes a synchronous call to all <c>gen_server</c> processes
+ locally registered as <c><anno>Name</anno></c>
+ at the specified nodes,
+ by first sending the request to the nodes,
+ and then waiting for the replies.
+ The <c>gen_server</c> processes on the nodes call
<seemfa marker="#Module:handle_call/3">
- <c>Module:handle_call/3</c></seemfa> to handle the request.</p>
- <p>The function returns a tuple <c>{Replies,BadNodes}</c>, where
- <c>Replies</c> is a list of <c>{Node,Reply}</c> and
- <c>BadNodes</c> is a list of node that either did not exist,
- or where the <c>gen_server</c> <c>Name</c> did not exist or did not
- reply.</p>
- <p><c>Nodes</c> is a list of node names to which the request
- is to be sent. Default value is the list of all known nodes
- <c>[node()|nodes()]</c>.</p>
- <p><c>Name</c> is the locally registered name of each
- <c>gen_server</c> process.</p>
- <p><c>Request</c> is any term that is passed as the first
- argument to <c>Module:handle_call/3</c>.</p>
- <p><c>Timeout</c> is an integer greater than zero that
- specifies how many milliseconds to wait for each reply, or
- the atom <c>infinity</c> to wait indefinitely. Defaults
- to <c>infinity</c>. If no reply is received from a node within
- the specified time, the node is added to <c>BadNodes</c>.</p>
- <p>When a reply <c>Reply</c> is received from the <c>gen_server</c>
- process at a node <c>Node</c>, <c>{Node,Reply}</c> is added to
- <c>Replies</c>. <c>Reply</c> is defined in the return value of
- <c>Module:handle_call/3</c>.</p>
+ <c>Module:handle_call/3</c>
+ </seemfa>
+ to handle the request.
+ </p>
+ <p>
+ The function returns a tuple
+ <c>{<anno>Replies</anno>,<anno>BadNodes</anno>}</c>,
+ where <c><anno>Replies</anno></c> is a list of
+ <c>{<anno>Node</anno>,<anno>Reply</anno>}</c> tuples,
+ and <c><anno>BadNodes</anno></c> is a list of nodes
+ that either did not exist,
+ where <c><anno>Name</anno></c>
+ was not a registered <c>gen_server</c>,
+ or where it did not reply.
+ </p>
+ <p>
+ <c><anno>Nodes</anno></c> is a list of node names
+ to which the request is to be sent.
+ Default value is the list of all known nodes
+ <c>[node()|nodes()]</c>.
+ </p>
+ <p>
+ <c><anno>Name</anno></c> is the locally registered name
+ for each <c>gen_server</c> process.
+ </p>
+ <p>
+ <c><anno>Request</anno></c> is any term that is passed
+ as the first argument to <c>Module:handle_call/3</c>.
+ </p>
+ <p>
+ <c><anno>Timeout</anno></c> is an integer that
+ specifies how many milliseconds to wait for all replies,
+ or the atom <c>infinity</c> to wait indefinitely,
+ which is the default.
+ If no reply is received from a node within the specified time,
+ the node is added to <c><anno>BadNodes</anno></c>.
+ </p>
+ <p>
+ When a reply <c><anno>Reply</anno></c> is received
+ from the <c>gen_server</c> process
+ at a node <c><anno>Node</anno></c>,
+ <c>{<anno>Node</anno>,<anno>Reply</anno>}</c> is added to
+ <c><anno>Replies</anno></c>.
+ <c><anno>Reply</anno></c> is passed from the return value of
+ <c>Module:handle_call/3</c>.
+ </p>
<warning>
- <p>If one of the nodes cannot process monitors, for example,
+ <p>
+ If one of the nodes cannot process monitors, for example,
C or Java nodes, and the <c>gen_server</c> process is not started
when the requests are sent, but starts within 2 seconds,
this function waits the whole <c>Timeout</c>,
- which may be infinity.</p>
+ which may be infinity.
+ </p>
<p>This problem does not exist if all nodes are Erlang nodes.</p>
</warning>
- <p>To prevent late answers (after the time-out) from polluting
- the message queue of the caller, a middleman process is used to
- do the calls. Late answers are then discarded
- when they arrive to a terminated process.</p>
+ <p>
+ To prevent late answers (after the time-out) from polluting
+ the message queue of the caller, a middleman process is used
+ to do the calls. Late answers are then discarded
+ when they arrive to a terminated process.
+ </p>
</desc>
</func>
<func>
- <name since="OTP 24.0">receive_response(RequestId, Timeout) -> Result</name>
- <fsummary>Receive for a reply from a server.</fsummary>
- <type>
- <v>RequestId = term()</v>
- <v>Result = {reply, Reply} | timeout | {error, {Reason, ServerRef}}</v>
- <v>Reply = term()</v>
- <v>Timeout = timeout()</v>
- <v>Reason = term()</v>
- <v>ServerRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- </type>
+ <name name="receive_response" arity="2" since="OTP 24.0"/>
+ <fsummary>Receive a response from a server.</fsummary>
<desc>
<p>
- This function is used to receive a reply of a request made with
- <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
- to a <c>gen_server</c> process. This function must be called
- from the same process from which
- <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
- was made.
+ Receive a response corresponding to the request identifier
+ <c><anno>ReqId</anno></c>. The request must have been made by
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>,
+ and it must have been made by the same process calling
+ this function.
</p>
<p>
- <c>Timeout</c> is an integer greater then or equal to zero
- that specifies how many milliseconds to wait for an reply, or
- the atom <c>infinity</c> to wait indefinitely.
- If no reply is received within the specified
- time, the function returns <c>timeout</c>. Assuming that the
+ <c><anno>Timeout</anno></c> specifies how long to wait for
+ a response. If no response is received within the specified time,
+ the function returns <c>timeout</c>. Assuming that the
server executes on a node supporting aliases (introduced in
- OTP 24) no response will be received after a timeout. Otherwise,
- a garbage response might be received at a later time.
+ OTP 24) the request will also be abandoned. That is, no
+ response will be received after a timeout. Otherwise, a
+ stray response might be received at a later time.
</p>
<p>
- The return value <c>Reply</c> is defined in the return value
- of <c>Module:handle_call/3</c>.
+ The return value <c><anno>Reply</anno></c> is passed from the
+ return value of <c>Module:handle_call/3</c>.
</p>
<p>
The function returns an error if the <c>gen_server</c>
- dies before or during this request.
+ died before a reply was sent.
</p>
<p>
- The difference between
- <seemfa marker="#wait_response/2"><c>wait_response()</c></seemfa>
- and <c>receive_response()</c> is that <c>receive_response()</c>
- abandons the request at timeout so that a potential future
- response is ignored, while <c>wait_response()</c> does not.
+ The difference between <c>receive_response/2</c> and
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>
+ is that <c>receive_response/2</c> abandons the request at
+ timeout so that a potential future response is ignored, while
+ <c>wait_response/2</c> does not.
</p>
</desc>
</func>
<func>
- <name since="">reply(Client, Reply) -> ok</name>
+ <name name="receive_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Receive a response from a server.</fsummary>
+ <desc>
+ <p>
+ Receive a response corresponding to a request identifier saved
+ in <c><anno>ReqIdCollection</anno></c>. All request identifiers
+ of <c><anno>ReqIdCollection</anno></c> must correspond to requests
+ that have been made using
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa> or
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">adding the request id</seemfa>
+ in a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ will be wrapped in a 3-tuple. The first element of this tuple equals
+ the value that would have been produced by <c>receive_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned.
+ </p>
+ <p>
+ <c><anno>Timeout</anno></c> specifies how long to wait for
+ a response. If no response is received within the specified time,
+ the function returns <c>timeout</c>. Assuming that the
+ server executes on a node supporting aliases (introduced in
+ OTP 24) all requests identified by <c><anno>ReqIdCollection</anno></c>
+ will also be abandoned. That is, no responses will be received
+ after a timeout. Otherwise, stray responses might be received
+ at a later time.
+ </p>
+ <p>
+ The difference between <c>receive_response/3</c> and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>
+ is that <c>receive_response/3</c> abandons the requests at timeout
+ so that potential future responses are ignored, while
+ <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>receive_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>receive_response/3</c>, it will always block
+ until a timeout determined by <c><anno>Timeout</anno></c> is
+ triggered.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reply" arity="2" since=""/>
<fsummary>Send a reply to a client.</fsummary>
- <type>
- <v>Client - see below</v>
- <v>Reply = term()</v>
- </type>
<desc>
- <p>This function can be used by a <c>gen_server</c> process to
+ <p>
+ This function can be used by a <c>gen_server</c> process to
explicitly send a reply to a client that called
<seemfa marker="#call/2"><c>call/2,3</c></seemfa> or
<seemfa marker="#multi_call/2"><c>multi_call/2,3,4</c></seemfa>,
- when the reply cannot be defined in the return value of
+ when the reply cannot be passed in the return value of
<seemfa marker="#Module:handle_call/3">
- <c>Module:handle_call/3</c></seemfa>.</p>
- <p><c>Client</c> must be the <c>From</c> argument provided to
- the callback function. <c>Reply</c> is any term
- given back to the client as the return value of
- <c>call/2,3</c> or <c>multi_call/2,3,4</c>.</p>
+ <c>Module:handle_call/3</c></seemfa>.
+ </p>
+ <p>
+ <c><anno>Client</anno></c> must be the <c>From</c> argument
+ provided to the <c>handle_call</c> callback function.
+ <c><anno>Reply</anno></c> is any term
+ passed back to the client as the return value of
+ <c>call/2,3</c> or <c>multi_call/2,3,4</c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_add" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Save a request identifier.</fsummary>
+ <desc>
+ <p>
+ Saves <c><anno>ReqId</anno></c> and associates a <c><anno>Label</anno></c>
+ with the request identifier by adding this information to
+ <c><anno>ReqIdCollection</anno></c> and returning the
+ resulting request identifier collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_new" arity="0" since="OTP @OTP-17784@"/>
+ <fsummary>Create a new empty request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns a new empty request identifier collection. A
+ request identifier collection can be utilized in order
+ the handle multiple outstanding requests.
+ </p>
+ <p>
+ Request identifiers of requests made by
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
+ can be saved in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ </p>
+ <p>
+ <seemfa marker="#reqids_size/1"><c>reqids_size/1</c></seemfa>
+ can be used to determine the amount of request identifiers in a
+ request identifier collection.
+ </p>
</desc>
</func>
<func>
- <name since="OTP 23.0">send_request(ServerRef, Request) -> RequestId</name>
+ <name name="reqids_size" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>Get size of a request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns the amount of request identifiers saved in
+ <c><anno>ReqIdCollection</anno></c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_to_list" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>List a request identifiers.</fsummary>
+ <desc>
+ <p>
+ Returns a list of <c>{<anno>ReqId</anno>, <anno>Label</anno>}</c>
+ tuples which corresponds to all request identifiers with their
+ associated labels present in the <c><anno>ReqIdCollection</anno></c>
+ collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="send_request" arity="2" since="OTP 23.0"/>
<fsummary>Sends a request to a generic server.</fsummary>
- <type>
- <v>ServerRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>RequestId = term()</v>
- <v>Timeout = int()>0 | infinity</v>
- <v>Request = term()</v>
- </type>
<desc>
<p>
- Sends a request to the <c>ServerRef</c> of the
- <c>gen_server</c> process and returns a handle <c>RequestId</c>.
- The return value <c>RequestId</c> shall later be used with
+ Sends an asynchronous <c>call</c> request <c><anno>Request</anno></c>
+ to the <c>gen_server</c> process identified by <c><anno>ServerRef</anno></c>
+ and returns a request identifier <c><anno>ReqId</anno></c>. The return
+ value <c><anno>ReqId</anno></c> shall later be used with
<seemfa marker="#receive_response/2"> <c>receive_response/2</c></seemfa>,
<seemfa marker="#wait_response/2"> <c>wait_response/2</c></seemfa>, or
<seemfa marker="#check_response/2"> <c>check_response/2</c></seemfa>
- to fetch the actual result of the request.
+ to fetch the actual result of the request. Besides passing
+ the request identifier directly to these functions, it can also be
+ saved in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>, or
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ If you are about to save the request identifier in a request identifier
+ collection, you may want to consider using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>
+ instead.
</p>
<p>
- The call <c>gen_server:wait_response(gen_server:send_request(ServerRef,Request), Timeout)</c>
- can be seen as equivalent to
- <seemfa marker="#call/3"><c>gen_server:call(Server,Request,Timeout)</c></seemfa>,
- ignoring the error handling.
+ The call <c>gen_server:receive_response(gen_server:send_request(<anno>ServerRef</anno>,
+ <anno>Request</anno>), Timeout)</c> can be seen as equivalent to
+ <seemfa marker="#call/3"><c>gen_server:call(<anno>ServerRef</anno>, <anno>Request</anno>,
+ Timeout)</c></seemfa>, ignoring the error handling.
</p>
<p>
The <c>gen_server</c> process calls
- <seemfa marker="#Module:handle_call/3"> <c>Module:handle_call/3</c></seemfa>
+ <seemfa marker="#Module:handle_call/3">
+ <c>Module:handle_call/3</c>
+ </seemfa>
to handle the request.
</p>
- <p><c>ServerRef</c> can be any of the following:</p>
- <list type="bulleted">
- <item>The pid</item>
- <item><c>Name</c>, if the <c>gen_server</c> process is locally
- registered</item>
- <item><c>{Name,Node}</c>, if the <c>gen_server</c> process is locally
- registered at another node</item>
- <item><c>{global,GlobalName}</c>, if the <c>gen_server</c> process is
- globally registered</item>
- <item><c>{via,Module,ViaName}</c>, if the <c>gen_server</c> process is
- registered through an alternative process registry</item>
- </list>
- <p><c>Request</c> is any term that is passed as the first
- argument to <c>Module:handle_call/3</c>.</p>
+ <p>
+ See the type
+ <seetype marker="#server_ref"><c>server_ref()</c></seetype>
+ for the possible values for <c><anno>ServerRef</anno></c>.
+ </p>
+ <p>
+ <c><anno>Request</anno></c> is any term that is passed
+ as the first argument to <c>Module:handle_call/3</c>.
+ </p>
</desc>
</func>
<func>
- <name since="">start(Module, Args, Options) -> Result</name>
- <name since="">start(ServerName, Module, Args, Options) -> Result</name>
+ <name name="send_request" arity="4" since="OTP @OTP-17784@"/>
+ <fsummary>Sends a request to a generic server.</fsummary>
+ <desc>
+ <p>
+ Sends an asynchronous <c>call</c> request <c><anno>Request</anno></c>
+ to the <c>gen_server</c> process identified by <c><anno>ServerRef</anno></c>.
+ The <c><anno>Label</anno></c> will be associated with the request
+ identifier of the operation and added to the returned request
+ identifier collection <c><anno>NewReqIdCollection</anno></c>.
+ The collection can later be used in order to get one response
+ corresponding to a request in the collection by passing the
+ collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ </p>
+
+ <p>
+ The same as calling
+ <seemfa marker="#reqids_add/3"><c>gen_server:reqids_add</c></seemfa>(<seemfa
+ marker="#send_request/2"><c>gen_server:send_request</c></seemfa><c>(<anno>ServerRef</anno>,
+ <anno>Request</anno>), <anno>Label</anno>,
+ <anno>ReqIdCollection</anno>)</c>, but calling <c>send_request/4</c>
+ is slightly more efficient.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="start" arity="3" since=""/>
+ <name name="start" arity="4" since=""/>
<fsummary>Create a standalone <c>gen_server</c> process.</fsummary>
- <type>
- <v>ServerName = {local,Name} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName}</v>
- <v>&nbsp;Name = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Module = atom()</v>
- <v>Args = term()</v>
- <v>Options = [Option]</v>
- <v>&nbsp;Option = {debug,Dbgs} | {timeout,Time} | {hibernate_after,HibernateAfterTimeout} | {spawn_opt,SOpts}</v>
- <v>&nbsp;&nbsp;Dbgs = [Dbg]</v>
- <v>&nbsp;&nbsp;&nbsp;Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}</v>
- <v>&nbsp;&nbsp;SOpts = [term()]</v>
- <v>Result = {ok,Pid} | ignore | {error,Error}</v>
- <v>&nbsp;Pid = pid()</v>
- <v>&nbsp;Error = {already_started,Pid} | term()</v>
- </type>
<desc>
- <p>Creates a standalone <c>gen_server</c> process, that is, a
+ <p>
+ Creates a standalone <c>gen_server</c> process, that is, a
<c>gen_server</c> process that is not part of a supervision tree
and thus has no supervisor.</p>
- <p>For a description of arguments and return values, see
- <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>.</p>
+ <p>
+ Other than that see
+ <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>.
+ </p>
</desc>
</func>
<func>
- <name since="">start_link(Module, Args, Options) -> Result</name>
- <name since="">start_link(ServerName, Module, Args, Options) -> Result</name>
- <fsummary>Create a <c>gen_server</c> process in a supervision tree.
+ <name name="start_link" arity="3" since=""/>
+ <name name="start_link" arity="4" since=""/>
+ <fsummary>
+ Create a <c>gen_server</c> process in a supervision tree.
</fsummary>
- <type>
- <v>ServerName = {local,Name} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName}</v>
- <v>&nbsp;Name = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Module = atom()</v>
- <v>Args = term()</v>
- <v>Options = [Option]</v>
- <v>&nbsp;Option = {debug,Dbgs} | {timeout,Time} | {hibernate_after,HibernateAfterTimeout} | {spawn_opt,SOpts}</v>
- <v>&nbsp;&nbsp;Dbgs = [Dbg]</v>
- <v>&nbsp;&nbsp;&nbsp;Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}</v>
- <v>&nbsp;&nbsp;SOpts = [term()]</v>
- <v>Result = {ok,Pid} | ignore | {error,Error}</v>
- <v>&nbsp;Pid = pid()</v>
- <v>&nbsp;Error = {already_started,Pid} | term()</v>
- </type>
<desc>
- <p>Creates a <c>gen_server</c> process as part of a supervision tree.
+ <p>
+ Creates a <c>gen_server</c> process as part of a supervision tree.
This function is to be called, directly or indirectly, by
the supervisor. For example, it ensures that
- the <c>gen_server</c> process is linked to the supervisor.</p>
- <p>The <c>gen_server</c> process calls
- <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa> to
- initialize. To ensure a synchronized startup procedure,
+ the <c>gen_server</c> process is linked to the supervisor.
+ </p>
+ <p>
+ The <c>gen_server</c> process calls
+ <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>
+ to initialize.
+ To ensure a synchronized startup procedure,
<c>start_link/3,4</c> does not return until
- <c>Module:init/1</c> has returned.</p>
- <list type="bulleted">
- <item>
- <p>If <c>ServerName={local,Name}</c>, the <c>gen_server</c> process
- is registered locally as <c>Name</c> using <c>register/2</c>.</p>
- </item>
- <item>
- <p>If <c>ServerName={global,GlobalName}</c>, the <c>gen_server</c>
- process id registered globally as <c>GlobalName</c> using
- <seemfa marker="kernel:global#register_name/2">
- <c>global:register_name/2</c></seemfa> If no name is
- provided, the <c>gen_server</c> process is not registered.</p>
- </item>
- <item>
- <p>If <c>ServerName={via,Module,ViaName}</c>, the <c>gen_server</c>
- process registers with the registry represented by <c>Module</c>.
- The <c>Module</c> callback is to export the functions
- <c>register_name/2</c>, <c>unregister_name/1</c>,
- <c>whereis_name/1</c>, and <c>send/2</c>, which are to behave
- like the corresponding functions in
- <seeerl marker="kernel:global"><c>global</c></seeerl>.
- Thus, <c>{via,global,GlobalName}</c> is a valid reference.</p>
- </item>
- </list>
- <p><c>Module</c> is the name of the callback module.</p>
- <p><c>Args</c> is any term that is passed as
+ <c>Module:init/1</c> has returned.
+ </p>
+ <p>
+ Using the argument <c><anno>ServerName</anno></c>
+ creates a <c>gen_server</c> with a registered name.
+ See type
+ <seetype marker="#server_name"><c>server_name()</c></seetype>
+ for different name registrations.
+ If no <c><anno>ServerName</anno></c> is provided,
+ the <c>gen_server</c> process is not registered.
+ </p>
+ <p>
+ <c><anno>Module</anno></c> is the name of the callback module.
+ </p>
+ <p>
+ <c><anno>Args</anno></c> is any term that is passed as
the argument to
- <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>.</p>
- <list type="bulleted">
- <item>
- <p>If option <c>{timeout,Time}</c> is present, the <c>gen_server</c>
- process is allowed to spend <c>Time</c> milliseconds
- initializing or it is terminated and the start function
- returns <c>{error,timeout}</c>.</p>
- </item>
- <item>
- <p>If option <c>{hibernate_after,HibernateAfterTimeout}</c> is present, the <c>gen_server</c>
- process awaits any message for <c>HibernateAfterTimeout</c> milliseconds and
- if no message is received, the process goes into hibernation automatically
- (by calling <seemfa marker="proc_lib#hibernate/3"><c>proc_lib:hibernate/3</c></seemfa>).</p>
- </item>
- <item>
- <p>If option <c>{debug,Dbgs}</c> is present,
- the corresponding <c>sys</c> function is called for each
- item in <c>Dbgs</c>; see
- <seeerl marker="sys"><c>sys(3)</c></seeerl>.</p>
- </item>
- <item>
- <p>If option <c>{spawn_opt,SOpts}</c> is present,
- <c>SOpts</c> is passed as option list to
- the <c>spawn_opt</c> BIF, which is used to spawn
- the <c>gen_server</c> process; see
- <seemfa marker="erts:erlang#spawn_opt/2">
- <c>spawn_opt/2</c></seemfa>.</p>
- </item>
- </list>
- <note>
- <p>Using spawn option <c>monitor</c> is not
- allowed, it causes the function to fail with reason
- <c>badarg</c>.</p>
- </note>
- <p>If the <c>gen_server</c> process is successfully created and
- initialized, the function returns <c>{ok,Pid}</c>, where <c>Pid</c>
- is the pid of the <c>gen_server</c> process. If a process with the
- specified <c>ServerName</c> exists already, the function returns
- <c>{error,{already_started,Pid}}</c>, where <c>Pid</c> is
- the pid of that process.</p>
- <p>If <c>Module:init/1</c> fails with <c>Reason</c>,
- the function returns <c>{error,Reason}</c>. If
- <c>Module:init/1</c> returns <c>{stop,Reason}</c> or
- <c>ignore</c>, the process is terminated and the function
- returns <c>{error,Reason}</c> or <c>ignore</c>, respectively.
- An exit signal with the same <c>Reason</c> (or <c>normal</c> if
- <c>Module:init/1</c> returns <c>ignore</c>) is sent to linked
- processes and ports.</p>
+ <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>.
+ </p>
+ <p>
+ See type
+ <seetype marker="#start_opt"><c>start_opt()</c></seetype>
+ for <c><anno>Options</anno></c> when starting
+ the <c>gen_server</c> process.
+ </p>
+ <p>
+ See type
+ <seetype marker="#start_ret"><c>start_ret()</c></seetype>
+ for a description this function's return values.
+ </p>
</desc>
</func>
<func>
- <name since="OTP 23.0">start_monitor(Module, Args, Options) -> Result</name>
- <name since="OTP 23.0">start_monitor(ServerName, Module, Args, Options) -> Result</name>
+ <name name="start_monitor" arity="3" since="OTP 23.0"/>
+ <name name="start_monitor" arity="4" since="OTP 23.0"/>
<fsummary>Create a standalone <c>gen_server</c> process.</fsummary>
- <type>
- <v>ServerName = {local,Name} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName}</v>
- <v>&nbsp;Name = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Module = atom()</v>
- <v>Args = term()</v>
- <v>Options = [Option]</v>
- <v>&nbsp;Option = {debug,Dbgs} | {timeout,Time} | {hibernate_after,HibernateAfterTimeout} | {spawn_opt,SOpts}</v>
- <v>&nbsp;&nbsp;Dbgs = [Dbg]</v>
- <v>&nbsp;&nbsp;&nbsp;Dbg = trace | log | statistics | {log_to_file,FileName} | {install,{Func,FuncState}}</v>
- <v>&nbsp;&nbsp;SOpts = [term()]</v>
- <v>Result = {ok,{Pid,Mon}} | ignore | {error,Error}</v>
- <v>&nbsp;Pid = pid()</v>
- <v>&nbsp;Error = {already_started,Pid} | term()</v>
- </type>
<desc>
- <p>Creates a standalone <c>gen_server</c> process, that is, a
+ <p>
+ Creates a standalone <c>gen_server</c> process, that is, a
<c>gen_server</c> process that is not part of a supervision tree
(and thus has no supervisor) and atomically sets up a monitor to
- the newly created server.</p>
- <p>For a description of arguments and return values, see
- <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>.
- Note that the return value on successful start differs from
- <c>start_link/3,4</c>. <c>start_monitor/3,4</c> will return
- <c>{ok,{Pid,Mon}}</c> where <c>Pid</c> is the process identifier
- of the server, and <c>Mon</c> is a reference to the monitor
- set up to monitor the server. If the start is not successful,
- the caller will be blocked until the <c>DOWN</c> message has
- been received and removed from the message queue.</p>
+ the newly created server.
+ </p>
+ <p>
+ Other than that see
+ <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>.
+ Note that the return value for a successful start differs
+ in that it returns a monitor <c>reference</c>.
+ See type
+ <seetype marker="#start_mon_ret"><c>start_mon_ret()</c></seetype>.
+ </p>
+ <p>
+ If the start is not successful,
+ the caller will be blocked until the monitor's
+ <c>'DOWN'</c> message has been received
+ and removed from the message queue.
+ </p>
</desc>
</func>
<func>
- <name since="OTP 18.0">stop(ServerRef) -> ok</name>
- <name since="OTP 18.0">stop(ServerRef, Reason, Timeout) -> ok</name>
+ <name name="stop" arity="1" since="OTP 18.0"/>
+ <name name="stop" arity="3" since="OTP 18.0"/>
<fsummary>Synchronously stop a generic server.</fsummary>
- <type>
- <v>ServerRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- <v>Reason = term()</v>
- <v>Timeout = int()>0 | infinity</v>
- </type>
<desc>
- <p>Orders a generic server to exit with the specified <c>Reason</c>
- and waits for it to terminate. The <c>gen_server</c> process calls
+ <p>
+ Orders the generic server specified by
+ <c><anno>ServerRef</anno></c> to exit
+ with the specified <c><anno>Reason</anno></c>,
+ default 'normal', and waits for it to terminate.
+ The <c>gen_server</c> process calls
<seemfa marker="#Module:terminate/2">
- <c>Module:terminate/2</c></seemfa> before exiting.</p>
- <p>The function returns <c>ok</c> if the server terminates
+ <c>Module:terminate/2</c>
+ </seemfa>
+ before exiting.
+ </p>
+ <p>
+ The function returns <c>ok</c> if the server terminates
with the expected reason. Any other reason than <c>normal</c>,
<c>shutdown</c>, or <c>{shutdown,Term}</c> causes an
error report to be issued using
<seeerl marker="kernel:logger"><c>logger(3)</c></seeerl>.
- An exit signal with the same reason is sent to linked processes
- and ports.
- The default <c>Reason</c> is <c>normal</c>.</p>
- <p><c>Timeout</c> is an integer greater than zero that
+ An exit signal with the same reason
+ is sent to linked processes and ports.
+ </p>
+ <p>
+ <c><anno>Timeout</anno></c> is an integer that
specifies how many milliseconds to wait for the server to
terminate, or the atom <c>infinity</c> to wait
- indefinitely. Defaults to <c>infinity</c>. If the
- server has not terminated within the specified time, a
- <c>timeout</c> exception is raised.</p>
- <p>If the process does not exist, a <c>noproc</c> exception
- is raised.</p>
+ indefinitely, which is the default. If the
+ server has not terminated within the specified time,
+ the call exits the calling process
+ with reason <c>timeout</c>.
+ </p>
+ <p>
+ If the process does not exist, the call exits
+ the calling process with reason <c>noproc</c>,
+ and with reason <c>{nodedown,Node}</c>
+ if the connection fails to the remote <c>Node</c>
+ where the server runs.
+ </p>
</desc>
</func>
<func>
- <name since="OTP 23.0">wait_response(RequestId, Timeout) -> Result</name>
- <fsummary>Wait for a reply from a server.</fsummary>
- <type>
- <v>RequestId = term()</v>
- <v>Result = {reply, Reply} | timeout | {error, {Reason, ServerRef}}</v>
- <v>Reply = term()</v>
- <v>Timeout = timeout()</v>
- <v>Reason = term()</v>
- <v>ServerRef = Name | {Name,Node} | {global,GlobalName}</v>
- <v>&nbsp;&nbsp;| {via,Module,ViaName} | pid()</v>
- <v>&nbsp;Node = atom()</v>
- <v>&nbsp;GlobalName = ViaName = term()</v>
- </type>
+ <name name="wait_response" arity="2" since="OTP 23.0"/>
+ <fsummary>Wait or poll for a response from a server.</fsummary>
<desc>
<p>
- This function is used to wait for a reply of a request made with
- <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
- from the <c>gen_server</c> process. This function must be called
- from the same process from which
- <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
- was made.
+ Wait for a response corresponding to the request identifier
+ <c><anno>ReqId</anno></c>. The request must have been made by
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>,
+ and it must have been made by the same process calling
+ this function.
</p>
<p>
- <c>Timeout</c> is an integer greater then or equal to zero
- that specifies how many milliseconds to wait for an reply, or
- the atom <c>infinity</c> to wait indefinitely.
- If no reply is received within the specified
+ <c><anno>WaitTime</anno></c> specifies how long to wait for
+ a reply. If no reply is received within the specified
time, the function returns <c>timeout</c> and no cleanup is
done, and thus the function can be invoked repeatedly until a
reply is returned.
</p>
<p>
- The return value <c>Reply</c> is defined in the return value
- of <c>Module:handle_call/3</c>.
+ The return value <c><anno>Reply</anno></c> is passed from the
+ return value of <c>Module:handle_call/3</c>.
</p>
<p>
The function returns an error if the <c>gen_server</c>
- dies before or during this request.
+ died before a reply was sent.
</p>
<p>
The difference between
- <seemfa marker="#receive_response/2"><c>receive_response()</c></seemfa>
- and <c>wait_response()</c> is that <c>receive_response()</c>
- abandons the request at timeout so that a potential future
- response is ignored, while <c>wait_response()</c> does not.
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>
+ and <c>wait_response/2</c> is that <c>receive_response/2</c>
+ abandons the request at time-out so that a potential future
+ response is ignored, while <c>wait_response/2</c> does not.
</p>
</desc>
</func>
+
+ <func>
+ <name name="wait_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Wait or poll for a response from a server.</fsummary>
+ <desc>
+ <p>
+ Wait for a response corresponding to a request identifier saved
+ in <c><anno>ReqIdCollection</anno></c>. All request identifiers
+ of <c><anno>ReqIdCollection</anno></c> must correspond to requests
+ that have been made using
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa> or
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">saving the request id</seemfa> in
+ a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>wait_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, <c>no_request</c>
+ will be returned. If no response is received before the
+ <c><anno>WaitTime</anno></c> timeout has triggered, the atom
+ <c>timeout</c> is returned. It is valid to continue waiting for a
+ response as many times as needed up until a response has been received
+ and completed by <c>check_response()</c>, <c>receive_response()</c>,
+ or <c>wait_response()</c>.
+ </p>
+ <p>
+ The difference between
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>
+ and <c>wait_response/3</c> is that <c>receive_response/3</c>
+ abandons requests at timeout so that a potential future
+ responses are ignored, while <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>wait_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>wait_response/3</c>, it will always block
+ until a timeout determined by <c><anno>WaitTime</anno></c> is
+ triggered and then return <c>no_reply</c>.
+ </p>
+ </desc>
+ </func>
</funcs>
@@ -788,6 +1505,79 @@ gen_server:abcast -----> Module:handle_cast/2
</func>
<func>
+ <name since="OTP @OTP-17351@">Module:format_status(Status) -> NewStatus</name>
+ <fsummary>Optional function for providing a term describing the
+ current <c>gen_server</c> status.</fsummary>
+ <type>
+ <v>Status = #{ state => State,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ message => Message,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ reason => Reason,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ log => Log }</v>
+ <v>NewStatus = Status</v>
+ <v>State = Message = Reason = term()</v>
+ <v>Log = [<seetype marker="sys#system_event">sys:system_event()</seetype>]</v>
+ </type>
+ <desc>
+ <note>
+ <p>This callback is optional, so callback modules need not
+ export it. The <c>gen_server</c> module provides a default
+ implementation of this function that returns the callback
+ module state.</p>
+ <p>
+ If this callback is exported but fails, to hide possibly sensitive
+ data, the default function will instead return the fact that
+ <c>format_status/1</c> has crashed.</p>
+ </note>
+ <p>This function is called by a <c>gen_server</c> process in the following situations:</p>
+ <list type="bulleted">
+ <item>
+ <p><seemfa marker="sys#get_status/1"><c>sys:get_status/1,2</c></seemfa>
+ is invoked to get the <c>gen_server</c> status.</p>
+ </item>
+ <item>
+ <p>The <c>gen_server</c> process terminates abnormally and logs an error.</p>
+ </item>
+ </list>
+ <p>This callback is to be used to limit the status of the process before
+ returned by <seemfa marker="sys#get_status/1"><c>sys:get_status/1,2</c></seemfa> or
+ sent to <seeerl marker="kernel:logger"><c>logger</c></seeerl>. The status
+ of the server is passed as a map with the following associations:
+ </p>
+ <taglist>
+ <tag><c>state => term()</c></tag>
+ <item>The internal state of the <c>gen_server</c> process.</item>
+ <tag><c>message => term()</c></tag>
+ <item>The message that caused the server to terminate.</item>
+ <tag><c>reason => term()</c></tag>
+ <item>The reason that caused the server to terminate.</item>
+ <tag><c>log => [</c><seetype marker="sys#system_event"><c>sys:system_event/0</c></seetype><c>]</c></tag>
+ <item>The <seemfa marker="sys#log/2">sys log</seemfa> of the server.</item>
+ </taglist>
+ <p>New associations may be added into the status map without prior notice.</p>
+ <p>The function is to return <c>NewStatus</c>, a map containing the same
+ associations as the input map.</p>
+ <p>Two possible use cases for this callback is to either remove
+ sensitive information from the state so that it not printed in log files,
+ or to remove large irrelevant terms of state that do clutter the logs.</p>
+ <p>Example:</p>
+ <code type="erl"><![CDATA[
+format_status(Status) ->
+ maps:map(
+ fun(state,State) ->
+ maps:remove(private_key, State);
+ (message,{password, _Pass}) ->
+ {password, removed};
+ (_,Value) ->
+ Value
+ end, Status).
+]]></code>
+ </desc>
+ </func>
+
+ <func>
<name since="OTP R13B04">Module:format_status(Opt, [PDict, State]) -> Status</name>
<fsummary>Optional function for providing a term describing the
current <c>gen_server</c> status.</fsummary>
@@ -798,6 +1588,11 @@ gen_server:abcast -----> Module:handle_cast/2
<v>Status = term()</v>
</type>
<desc>
+ <warning>
+ <p>This callback is deprecated, in new code use <seemfa marker="#Module:format_status/1">
+ format_status/1</seemfa>. If a <seemfa marker="#Module:format_status/1">format_status/1</seemfa>
+ callback exists, then this function will never be called.</p>
+ </warning>
<note>
<p>This callback is optional, so callback modules need not
export it. The <c>gen_server</c> module provides a default
@@ -852,18 +1647,24 @@ gen_server:abcast -----> Module:handle_cast/2
<fsummary>Handle a synchronous request.</fsummary>
<type>
<v>Request = term()</v>
- <v>From = {pid(),Tag}</v>
+ <v>From = <seetype marker="#from">from()</seetype></v>
<v>State = term()</v>
- <v>Result = {reply,Reply,NewState} | {reply,Reply,NewState,Timeout}</v>
+ <v>Result = {reply,Reply,NewState}</v>
+ <v>&nbsp;&nbsp;| {reply,Reply,NewState,Timeout}</v>
<v>&nbsp;&nbsp;| {reply,Reply,NewState,hibernate}</v>
<v>&nbsp;&nbsp;| {reply,Reply,NewState,{continue,Continue}}</v>
- <v>&nbsp;&nbsp;| {noreply,NewState} | {noreply,NewState,Timeout}</v>
+ <v>&nbsp;&nbsp;| {noreply,NewState}</v>
+ <v>&nbsp;&nbsp;| {noreply,NewState,Timeout}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,hibernate}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,{continue,Continue}}</v>
- <v>&nbsp;&nbsp;| {stop,Reason,Reply,NewState} | {stop,Reason,NewState}</v>
+ <v>&nbsp;&nbsp;| {stop,Reason,Reply,NewState}</v>
+ <v>&nbsp;&nbsp;| {stop,Reason,NewState}</v>
<v>&nbsp;Reply = term()</v>
<v>&nbsp;NewState = term()</v>
- <v>&nbsp;Timeout = int()>=0 | infinity</v>
+ <v>
+ &nbsp;Timeout =
+ <seetype marker="erts:erlang#timeout">timeout()</seetype>
+ </v>
<v>&nbsp;Continue = term()</v>
<v>&nbsp;Reason = term()</v>
</type>
@@ -872,45 +1673,109 @@ gen_server:abcast -----> Module:handle_cast/2
<seemfa marker="#call/2"><c>call/2,3</c></seemfa> or
<seemfa marker="#multi_call/2"><c>multi_call/2,3,4</c></seemfa>,
this function is called to handle the request.</p>
- <p><c>Request</c> is the <c>Request</c> argument provided
- to <c>call</c> or <c>multi_call</c>.</p>
- <p><c>From</c> is a tuple <c>{Pid,Tag}</c>, where <c>Pid</c> is
- the pid of the client and <c>Tag</c> is a unique tag.</p>
<p><c>State</c> is the internal state of the <c>gen_server</c>
- process.</p>
- <list type="bulleted">
+ process, and <c>NewState</c> a possibly updated one.</p>
+ <p><c>Request</c> is passed from the same argument provided
+ to <c>call</c> or <c>multi_call</c>.</p>
+ <p>The return value <c>Result</c> is interpreted as follows:</p>
+ <taglist>
+ <tag>
+ <c>{reply,Reply,NewState}</c><br/>
+ <c>{reply,Reply,NewState,_}</c>
+ </tag>
<item>
- <p>If <c>{reply,Reply,NewState}</c> is returned,
- <c>{reply,Reply,NewState,Timeout}</c> or
- <c>{reply,Reply,NewState,hibernate}</c>, <c>Reply</c> is
- given back to <c>From</c> as the return value of
- <c>call/2,3</c> or included in the return value of
- <c>multi_call/2,3,4</c>. The <c>gen_server</c> process then
- continues executing with the possibly updated internal state
- <c>NewState</c>.</p>
- <p>For a description of <c>Timeout</c> and <c>hibernate</c>, see
- <seemfa marker="#Module:init/1"><c>Module:init/1</c></seemfa>.</p>
+ <p>
+ The <c>Reply</c> value is sent back to the client request
+ and there becomes its return value.
+ </p>
+ <p>
+ The <c>gen_server</c> process continues executing
+ with the possibly updated internal state <c>NewState</c>.
+ </p>
</item>
+ <tag>
+ <c>{noreply,NewState}</c><br/>
+ <c>{noreply,NewState,_}</c>
+ </tag>
<item>
- <p>If <c>{noreply,NewState}</c> is returned,
- <c>{noreply,NewState,Timeout}</c>, or
- <c>{noreply,NewState,hibernate}</c>, the <c>gen_server</c>
- process continues executing with <c>NewState</c>. Any reply to
- <c>From</c> must be specified explicitly using
- <seemfa marker="#reply/2"><c>reply/2</c></seemfa>.</p>
+ <p>
+ The <c>gen_server</c> process continues executing
+ with the possibly updated internal state <c>NewState</c>.
+ </p>
+ <p>
+ A reply to the client request has to be created by calling
+ <seemfa marker="#reply/2"><c>reply(From,&nbsp;Reply)</c></seemfa>,
+ either in this or in a later callback.
+ </p>
</item>
+ <tag>
+ <c>{reply,_,_,Timeout}</c><br/>
+ <c>{noreply,_,Timeout}</c>
+ </tag>
<item>
- <p>If <c>{stop,Reason,Reply,NewState}</c> is returned,
- <c>Reply</c> is given back to <c>From</c>.</p>
+ <p>
+ If an integer <c>Timeout</c> is provided, a time-out occurs
+ unless a request or a message is received within
+ that many milliseconds. A time-out is represented by
+ the atom <c>timeout</c> to be handled by the
+ <seemfa marker="#Module:handle_info/2">
+ <c>Module:handle_info/2</c>
+ </seemfa>
+ callback function.
+ <c>Timeout&nbsp;=:=&nbsp;infinity</c>
+ can be used to wait indefinitely, which is the same as
+ returning a value without a <c>Timeout</c> member.
+ </p>
</item>
+ <tag>
+ <c>{reply,_,_,hibernate}</c><br/>
+ <c>{noreply,_,hibernate}</c>
+ </tag>
<item>
- <p>If <c>{stop,Reason,NewState}</c> is returned, any reply
- to <c>From</c> must be specified explicitly using
- <seemfa marker="#reply/2"><c>reply/2</c></seemfa>.
- The <c>gen_server</c> process then calls
- <c>Module:terminate(Reason,NewState)</c> and terminates.</p>
+ <p>
+ The process goes into hibernation waiting for
+ the next message to arrive (by calling
+ <seemfa marker="proc_lib#hibernate/3">
+ <c>proc_lib:hibernate/3</c></seemfa>).
+ </p>
</item>
- </list>
+ <tag>
+ <c>{reply,_,_,{continue,Continue}}</c><br/>
+ <c>{noreply,_,{continue,Continue}}</c>
+ </tag>
+ <item>
+ <p>
+ The process will execute the
+ <seemfa marker="#Module:handle_continue/2">
+ <c>Module:handle_continue/2</c>
+ </seemfa>
+ callback function, with <c>Continue</c> as the first argument.
+ </p>
+ </item>
+ <tag>
+ <c>{stop,Reason,NewState}</c><br/>
+ <c>{stop,Reason,Reply,NewState}</c>
+ </tag>
+ <item>
+ <p>
+ The <c>gen_server</c> process will call
+ <seemfa marker="#Module:terminate/2">
+ <c>Module:terminate(Reason,NewState)</c>
+ </seemfa>
+ and then terminate.
+ </p>
+ <p>
+ <c>{stop,_,Reply,_}</c> will create
+ a reply to the client request just as
+ <c>{reply,Reply,...}</c> while
+ <c>{stop,_,_}</c> will not,
+ so just as for <c>{noreply,NewState,...}</c>
+ a reply has to be created by calling
+ <c>reply(From,&nbsp;Reply)</c>
+ before returning <c>{stop,_,_}</c>.
+ </p>
+ </item>
+ </taglist>
</desc>
</func>
@@ -920,12 +1785,16 @@ gen_server:abcast -----> Module:handle_cast/2
<type>
<v>Request = term()</v>
<v>State = term()</v>
- <v>Result = {noreply,NewState} | {noreply,NewState,Timeout}</v>
+ <v>Result = {noreply,NewState}</v>
+ <v>&nbsp;&nbsp;| {noreply,NewState,Timeout}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,hibernate}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,{continue,Continue}}</v>
<v>&nbsp;&nbsp;| {stop,Reason,NewState}</v>
<v>&nbsp;NewState = term()</v>
- <v>&nbsp;Timeout = int()>=0 | infinity</v>
+ <v>
+ &nbsp;Timeout =
+ <seetype marker="erts:erlang#timeout">timeout()</seetype>
+ </v>
<v>&nbsp;Continue = term()</v>
<v>&nbsp;Reason = term()</v>
</type>
@@ -946,25 +1815,31 @@ gen_server:abcast -----> Module:handle_cast/2
<type>
<v>Continue = term()</v>
<v>State = term()</v>
- <v>Result = {noreply,NewState} | {noreply,NewState,Timeout}</v>
+ <v>Result = {noreply,NewState}</v>
+ <v>&nbsp;&nbsp;| {noreply,NewState,Timeout}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,hibernate}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,{continue,Continue}}</v>
<v>&nbsp;&nbsp;| {stop,Reason,NewState}</v>
<v>&nbsp;NewState = term()</v>
- <v>&nbsp;Timeout = int()>=0 | infinity</v>
+ <v>
+ &nbsp;Timeout =
+ <seetype marker="erts:erlang#timeout">timeout()</seetype>
+ </v>
<v>&nbsp;Continue = term()</v>
<v>&nbsp;Reason = normal | term()</v>
</type>
<desc>
<note>
<p>This callback is optional, so callback modules need to
- export it only if they return <c>{continue,Continue}</c>
- from another callback. If continue is used and the callback
- is not implemented, the process will exit with <c>undef</c>
- error.</p>
+ export it only if they return one of the tuples containing
+ <c>{continue,Continue}</c>
+ from another callback. If such a <c>{continue,_}</c> tuple
+ is used and the callback is not implemented,
+ the process will exit with <c>undef</c> error.</p>
</note>
- <p>This function is called by a <c>gen_server</c> process whenever
- a previous callback returns <c>{continue, Continue}</c>.
+ <p>This function is called by a <c>gen_server</c> process
+ whenever a previous callback returns
+ one of the tuples containing <c>{continue, Continue}</c>.
<c>handle_continue/2</c> is invoked immediately after the previous
callback, which makes it useful for performing work after
initialization or for splitting the work in a callback in
@@ -981,12 +1856,16 @@ gen_server:abcast -----> Module:handle_cast/2
<type>
<v>Info = timeout | term()</v>
<v>State = term()</v>
- <v>Result = {noreply,NewState} | {noreply,NewState,Timeout}</v>
+ <v>Result = {noreply,NewState}</v>
+ <v>&nbsp;&nbsp;| {noreply,NewState,Timeout}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,hibernate}</v>
<v>&nbsp;&nbsp;| {noreply,NewState,{continue,Continue}}</v>
<v>&nbsp;&nbsp;| {stop,Reason,NewState}</v>
<v>&nbsp;NewState = term()</v>
- <v>&nbsp;Timeout = int()>=0 | infinity</v>
+ <v>
+ &nbsp;Timeout =
+ <seetype marker="erts:erlang#timeout">timeout()</seetype>
+ </v>
<v>&nbsp;Reason = normal | term()</v>
</type>
<desc>
@@ -1012,10 +1891,17 @@ gen_server:abcast -----> Module:handle_cast/2
<fsummary>Initialize process and internal state.</fsummary>
<type>
<v>Args = term()</v>
- <v>Result = {ok,State} | {ok,State,Timeout} | {ok,State,hibernate}</v>
- <v>&nbsp;| {ok,State,{continue,Continue}} | {stop,Reason} | ignore</v>
+ <v>Result = {ok,State}</v>
+ <v>&nbsp;&nbsp;| {ok,State,Timeout}</v>
+ <v>&nbsp;&nbsp;| {ok,State,hibernate}</v>
+ <v>&nbsp;&nbsp;| {ok,State,{continue,Continue}}</v>
+ <v>&nbsp;&nbsp;| {stop,Reason}</v>
+ <v>&nbsp;&nbsp;| ignore</v>
<v>&nbsp;State = term()</v>
- <v>&nbsp;Timeout = int()>=0 | infinity</v>
+ <v>
+ &nbsp;Timeout =
+ <seetype marker="erts:erlang#timeout">timeout()</seetype>
+ </v>
<v>&nbsp;Reason = term()</v>
</type>
<desc>
@@ -1026,35 +1912,50 @@ gen_server:abcast -----> Module:handle_cast/2
this function is called by the new process to initialize.</p>
<p><c>Args</c> is the <c>Args</c> argument provided to the start
function.</p>
- <p>If the initialization is successful, the function is to
- return <c>{ok,State}</c>, <c>{ok,State,Timeout}</c>,
- <c>{ok,State,hibernate}</c>, or <c>{ok,State,{continue,Continue}}</c>
- where <c>State</c> is the internal state of the <c>gen_server</c>
- process.</p>
- <p>If an integer time-out value is provided, a time-out occurs
- unless a request or a message is received within
- <c>Timeout</c> milliseconds. A time-out is represented by
- the atom <c>timeout</c>, which is to be handled by the
- <seemfa marker="#Module:handle_info/2">
- <c>Module:handle_info/2</c></seemfa> callback function. The atom
- <c>infinity</c> can be used to wait indefinitely, this is
- the default value.</p>
- <p>If <c>hibernate</c> is specified instead of a time-out value,
- the process goes into
- hibernation when waiting for the next message to arrive (by calling
- <seemfa marker="proc_lib#hibernate/3">
- <c>proc_lib:hibernate/3</c></seemfa>).</p>
- <p>If <c>{continue,Continue}</c> is specified, the process will
- execute the <seemfa marker="#Module:handle_continue/2">
- <c>Module:handle_continue/2</c></seemfa> callback function, with
- <c>Continue</c> as the first argument.</p>
- <p>If the initialization fails, the function is to return
- <c>{stop,Reason}</c>, where <c>Reason</c> is any term, or
- <c>ignore</c>. An exit signal with this <c>Reason</c> (or with reason
- <c>normal</c> if <c>ignore</c> is returned) is sent to linked
- processes and ports, notably to the process starting the gen_server
- when <seemfa marker="#start_link/3"><c>start_link/3,4</c></seemfa>
- is used.</p>
+ <p>The return value <c>Result</c> is interpreted as follows:</p>
+ <taglist>
+ <tag>
+ <c>{ok,State}</c><br/>
+ <c>{ok,State,_}</c>
+ </tag>
+ <item>
+ <p>
+ Initialization was succesful and <c>State</c>
+ is the internal state of the <c>gen_server</c> process.
+ </p>
+ </item>
+ <tag>
+ <c>{ok,_,Timeout}</c><br/>
+ <c>{ok,_,hibernate}</c><br/>
+ <c>{ok,_,{continue,Continue}}</c>
+ </tag>
+ <item>
+ <p>
+ See the corresponding return values from
+ <seemfa marker="#Module:handle_call/3">
+ <c>Module:handle_call/3</c>
+ </seemfa>
+ for a description of this tuple member.
+ </p>
+ </item>
+ <tag>
+ <c>{stop,Reason}</c><br/>
+ <c>ignore</c>
+ </tag>
+ <item>
+ <p>
+ Initialization failed.
+ An exit signal with this <c>Reason</c>
+ (or with reason <c>normal</c> if <c>ignore</c> is returned)
+ is sent to linked processes and ports,
+ notably to the process starting the gen_server when
+ <seemfa marker="#start_link/3">
+ <c>start_link/3,4</c>
+ </seemfa>
+ is used.
+ </p>
+ </item>
+ </taglist>
</desc>
</func>
@@ -1104,11 +2005,14 @@ gen_server:abcast -----> Module:handle_cast/2
<c>'EXIT'</c> message from its parent. <c>Reason</c> is the same
as in the <c>'EXIT'</c> message.</p>
<p>Otherwise, the <c>gen_server</c> process terminates immediately.</p>
- <p>Notice that for any other reason than <c>normal</c>,
- <c>shutdown</c>, or <c>{shutdown,Term}</c>, the <c>gen_server</c>
- process is assumed to terminate because of an error and
- an error report is issued using
- <seeerl marker="kernel:logger"><c>logger(3)</c></seeerl>.</p>
+ <p>
+ Notice that for any other reason than <c>normal</c>,
+ <c>shutdown</c>, or <c>{shutdown,Term}</c>, see
+ <seemfa marker="#stop/3"><c>stop/3</c></seemfa>,
+ the <c>gen_server</c> process is assumed to terminate
+ because of an error, and an error report is issued using
+ <seeerl marker="kernel:logger"><c>logger(3)</c></seeerl>.
+ </p>
<p>When the gen_server process exits, an exit signal with the same
reason is sent to linked processes and ports.</p>
</desc>
diff --git a/lib/stdlib/doc/src/gen_statem.xml b/lib/stdlib/doc/src/gen_statem.xml
index fd3d11bbcf..6711addc1c 100644
--- a/lib/stdlib/doc/src/gen_statem.xml
+++ b/lib/stdlib/doc/src/gen_statem.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2016</year><year>2021</year>
+ <year>2016</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -639,6 +639,14 @@ handle_event(_, _, State, Data) ->
</desc>
</datatype>
<datatype>
+ <name name="reply_tag"/>
+ <desc>
+ <p>
+ A handle that associates a reply to the corresponding request.
+ </p>
+ </desc>
+ </datatype>
+ <datatype>
<name name="state"/>
<desc>
<p>
@@ -1246,8 +1254,8 @@ handle_event(_, _, State, Data) ->
such as the
<seeerl marker="#state callback">state callback</seeerl>,
<seemfa marker="#Module:code_change/4"><c><anno>NewModule</anno>:code_change/4</c></seemfa>,
- <seemfa marker="#Module:format_status/2">
- <c><anno>NewModule</anno>:format_status/2</c>
+ <seemfa marker="#Module:format_status/1">
+ <c><anno>NewModule</anno>:format_status/1</c>
</seemfa>
and
<seemfa marker="#Module:terminate/3">
@@ -1616,11 +1624,67 @@ handle_event(_, _, State, Data) ->
<name name="request_id"/>
<desc>
<p>
- A request handle, see <seemfa marker="#send_request/2"> <c>send_request/2</c> </seemfa>
+ An opaque request identifier. See
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
for details.
</p>
</desc>
</datatype>
+
+ <datatype>
+ <name name="request_id_collection"/>
+ <desc>
+ <p>
+ An opaque collection of request identifiers
+ (<seetype marker="#request_id"><c>request_id()</c></seetype>)
+ where each request identifier can be associated with a label
+ chosen by the user. For more information see
+ <seemfa marker="#reqids_new/0"><c>reqids_new/0</c></seemfa>.
+ </p>
+ </desc>
+ </datatype>
+
+ <datatype>
+ <name name="response_timeout"/>
+ <desc>
+ <p>
+ Used to set a time limit on how long to wait for a response using
+ either
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ or
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ The time unit used is <c>millisecond</c>. Currently valid values:
+ </p>
+ <taglist>
+ <tag><c>0..4294967295</c></tag>
+ <item><p>
+ Timeout relative to current time in milliseconds.
+ </p></item>
+ <tag><c>infinity</c></tag>
+ <item><p>
+ Infinite timeout. That is, the operation will never time out.
+ </p></item>
+ <tag><c>{abs, Timeout}</c></tag>
+ <item><p>
+ An absolute
+ <seemfa marker="erts:erlang#monotonic_time/1">Erlang monotonic time</seemfa>
+ timeout in milliseconds. That is, the operation will time out when
+ <seemfa marker="erts:erlang#monotonic_time/1"><c>erlang:monotonic_time(millisecond)</c></seemfa>
+ returns a value larger than or equal to <c>Timeout</c>. <c>Timeout</c>
+ is not allowed to identify a time further into the future than <c>4294967295</c>
+ milliseconds. Identifying the timeout using an absolute timeout value
+ is especially handy when you have a deadline for responses corresponding
+ to a complete collection of requests
+ (<seetype marker="#request_id_collection"><c>request_id_collection()</c></seetype>)
+,
+ since you do not have to recalculate the relative time until the deadline
+ over and over again.
+ </p></item>
+ </taglist>
+ </desc>
+ </datatype>
</datatypes>
<funcs>
@@ -1698,6 +1762,20 @@ handle_event(_, _, State, Data) ->
The call can also fail, for example, if the <c>gen_statem</c>
dies before or during this function call.
</p>
+ <p>
+ When this call fails it
+ <seemfa marker="erts:erlang#exit/1">exits</seemfa>
+ the calling process.
+ The exit term is on the form
+ <c>{Reason,&nbsp;Location}</c> where
+ <c>Location&nbsp;=&nbsp;{gen_statem,call,ArgList}</c>.
+ See
+ <seemfa marker="gen_server#call/3">
+ <c>gen_server:call/3</c>
+ </seemfa>
+ that has a description of relevant
+ values for the <c>Reason</c> in the exit term.
+ </p>
</desc>
</func>
@@ -1722,15 +1800,15 @@ handle_event(_, _, State, Data) ->
</func>
<func>
- <name name="check_response" arity="2" since="OTP-23"/>
+ <name name="check_response" arity="2" since="OTP 23.0"/>
<fsummary>Check if a message is a reply from a server.</fsummary>
<desc>
<p>
- This function is used to check if a previously received
- message, for example by <c>receive</c> or
- <c>handle_info/2</c>, is a result of a request made with
+ Check if <c><anno>Msg</anno></c> is a response corresponding
+ to the request identifier <c><anno>ReqId</anno></c>. The request
+ must have been made by
<seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>.
- If <c>Msg</c> is a reply to the handle <c>RequestId</c>
+ If <c>Msg</c> is a reply to the handle <c>ReqId</c>
the result of the request is returned in <c>Reply</c>.
Otherwise returns <c>no_reply</c> and no cleanup is done, and
thus the function shall be invoked repeatedly until a reply
@@ -1753,6 +1831,73 @@ handle_event(_, _, State, Data) ->
</func>
<func>
+ <name name="check_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Check if a message is a reply from a server.</fsummary>
+ <desc>
+ <p>
+ Check if <c><anno>Msg</anno></c> is a response corresponding
+ to a request identifier saved in <c><anno>ReqIdCollection</anno></c>.
+ All request identifiers of <c><anno>ReqIdCollection</anno></c>
+ must correspond to requests that have been made using
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa> or
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">saving the request id</seemfa>
+ in a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#check_response/2"><c>check_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>check_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned. If <c><anno>Msg</anno></c>
+ does not correspond to any of the request identifiers in
+ <c><anno>ReqIdCollection</anno></c>, the atom
+ <c>no_reply</c> is returned.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>check_response/3</c>,
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>check_response/3</c>, it will always
+ return <c>no_reply</c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
<name name="enter_loop" arity="4" since="OTP 19.1"/>
<fsummary>Enter the <c>gen_statem</c> receive loop.</fsummary>
<desc>
@@ -1849,11 +1994,23 @@ handle_event(_, _, State, Data) ->
<func>
<name name="receive_response" arity="1" since="OTP 24.0"/>
- <name name="receive_response" arity="2" since="OTP 24.0"/>
<fsummary>Receive for a reply from a server.</fsummary>
<desc>
<p>
- This function is used to receive for a reply of a request made with
+ The same as calling
+ <seemfa marker="#receive_response/2"><c>gen_statem:receive_response(ReqId,
+ infinity)</c></seemfa>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="receive_response" arity="2" clause_i="1" since="OTP 24.0"/>
+ <fsummary>Receive for a reply from a server.</fsummary>
+ <desc>
+ <p>
+ Receive a response corresponding to the request identifier
+ <c><anno>ReqId</anno></c>- The request must have been made by
<seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
to the <c>gen_statem</c> process. This function must be called
from the same process from which
@@ -1861,15 +2018,13 @@ handle_event(_, _, State, Data) ->
was made.
</p>
<p>
- <c>Timeout</c> is an integer greater then or equal to zero
- that specifies how many milliseconds to wait for an reply, or
- the atom <c>infinity</c> to wait indefinitely. Defaults to
- <c>infinity</c>.
- If no reply is received within the specified
- time, the function returns <c>timeout</c>. Assuming that the
+ <c><anno>Timeout</anno></c> specifies how long to wait for
+ a response. If no response is received within the specified time,
+ the function returns <c>timeout</c>. Assuming that the
server executes on a node supporting aliases (introduced in
- OTP 24) no response will be received after a timeout. Otherwise,
- a garbage response might be received at a later time.
+ OTP 24) the request will also be abandoned. That is, no
+ response will be received after a timeout. Otherwise, a
+ stray response might be received at a later time.
</p>
<p>
The return value <c><anno>Reply</anno></c> is generated when a
@@ -1886,13 +2041,94 @@ handle_event(_, _, State, Data) ->
</p>
<p>
The difference between
- <seemfa marker="#wait_response/2"><c>wait_response()</c></seemfa>
- and <c>receive_response()</c> is that <c>receive_response()</c>
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>
+ and <c>receive_response/2</c> is that <c>receive_response/2</c>
abandons the request at timeout so that a potential future
- response is ignored, while <c>wait_response()</c> does not.
+ response is ignored, while <c>wait_response/2</c> does not.
</p>
</desc>
</func>
+
+ <func>
+ <name name="receive_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Receive a response from a server.</fsummary>
+ <desc>
+ <p>
+ Receive a response corresponding to a request identifier saved
+ in <c><anno>ReqIdCollection</anno></c>. All request identifiers
+ of <c><anno>ReqIdCollection</anno></c> must correspond to requests
+ that have been made using
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa> or
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">adding the request id</seemfa>
+ in a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ will be wrapped in a 3-tuple. The first element of this tuple equals
+ the value that would have been produced by <c>receive_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, the atom
+ <c>no_request</c> will be returned.
+ </p>
+ <p>
+ <c><anno>Timeout</anno></c> specifies how long to wait for
+ a response. If no response is received within the specified time,
+ the function returns <c>timeout</c>. Assuming that the
+ server executes on a node supporting aliases (introduced in
+ OTP 24) all requests identified by <c><anno>ReqIdCollection</anno></c>
+ will also be abandoned. That is, no responses will be received
+ after a timeout. Otherwise, stray responses might be received
+ at a later time.
+ </p>
+ <p>
+ The difference between <c>receive_response/3</c> and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>
+ is that <c>receive_response/3</c> abandons the requests at timeout
+ so that potential future responses are ignored, while
+ <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>receive_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>receive_response/3</c>, it will always block
+ until a timeout determined by <c><anno>Timeout</anno></c> is
+ triggered.
+ </p>
+ </desc>
+ </func>
<func>
<name name="reply" arity="1" since="OTP 19.0"/>
@@ -1928,20 +2164,98 @@ handle_event(_, _, State, Data) ->
</func>
<func>
- <name name="send_request" arity="2" since="OTP-23"/>
- <fsummary>Send a request to a <c>gen_statem</c>.</fsummary>
+ <name name="reqids_add" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Save a request identifier.</fsummary>
<desc>
+ <p>
+ Saves <c><anno>ReqId</anno></c> and associates a <c><anno>Label</anno></c>
+ with the request identifier by adding this information to
+ <c><anno>ReqIdCollection</anno></c> and returning the
+ resulting request identifier collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_new" arity="0" since="OTP @OTP-17784@"/>
+ <fsummary>Create a new empty request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns a new empty request identifier collection. A
+ request identifier collection can be utilized in order
+ the handle multiple outstanding requests.
+ </p>
<p>
- Sends a request to the <c>gen_statem</c>
- <seetype marker="#server_ref"><c><anno>ServerRef</anno></c></seetype>
- and returns a handle <c><anno>RequestId</anno></c>.
- </p>
+ Request identifiers of requests made by
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
+ can be saved in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ </p>
+ <p>
+ <seemfa marker="#reqids_size/1"><c>reqids_size/1</c></seemfa>
+ can be used to determine the amount of request identifiers in a
+ request identifier collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_size" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>Get size of a request identifier collection.</fsummary>
+ <desc>
+ <p>
+ Returns the amount of request identifiers saved in
+ <c><anno>ReqIdCollection</anno></c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="reqids_to_list" arity="1" since="OTP @OTP-17784@"/>
+ <fsummary>List a request identifiers.</fsummary>
+ <desc>
<p>
- The return value <c><anno>RequestId</anno></c> shall later be used with
- <seemfa marker="#receive_response/2"> <c>receive_response/1,2</c></seemfa>,
- <seemfa marker="#wait_response/2"> <c>wait_response/1,2</c></seemfa>, or
+ Returns a list of <c>{<anno>ReqId</anno>, <anno>Label</anno>}</c>
+ tuples which corresponds to all request identifiers with their
+ associated labels present in the <c><anno>ReqIdCollection</anno></c>
+ collection.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="send_request" arity="2" since="OTP 23.0"/>
+ <fsummary>Send a request to a <c>gen_statem</c>.</fsummary>
+ <desc>
+ <p>
+ Sends an asynchronous <c>call</c> request <c><anno>Request</anno></c>
+ to the <c>gen_statem</c> process identified by <c><anno>ServerRef</anno></c>
+ and returns a request identifier <c><anno>ReqId</anno></c>. The return
+ value <c><anno>ReqId</anno></c> shall later be used with
+ <seemfa marker="#receive_response/2"> <c>receive_response/2</c></seemfa>,
+ <seemfa marker="#wait_response/2"> <c>wait_response/2</c></seemfa>, or
<seemfa marker="#check_response/2"> <c>check_response/2</c></seemfa>
- to fetch the actual result of the request.
+ to fetch the actual result of the request. Besides passing
+ the request identifier directly to these functions, it can also be
+ saved in a request identifier collection using
+ <seemfa marker="#reqids_add/3"><c>reqids_add/3</c></seemfa>.
+ Such a collection of request identifiers can later be used in
+ order to get one response corresponding to a request in the
+ collection by passing the collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>, or
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ If you are about to save the request identifier in a request identifier
+ collection, you may want to consider using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>
+ instead.
</p>
<p>
The call <c>gen_statem:wait_response(gen_statem:send_request(ServerRef,Request), Timeout)</c>
@@ -1972,6 +2286,36 @@ handle_event(_, _, State, Data) ->
</func>
<func>
+ <name name="send_request" arity="4" since="OTP @OTP-17784@"/>
+ <fsummary>Sends a request to a generic server.</fsummary>
+ <desc>
+ <p>
+ Sends an asynchronous <c>call</c> request <c><anno>Request</anno></c>
+ to the <c>gen_statem</c> process identified by <c><anno>ServerRef</anno></c>.
+ The <c><anno>Label</anno></c> will be associated with the request
+ identifier of the operation and added to the returned request
+ identifier collection <c><anno>NewReqIdCollection</anno></c>.
+ The collection can later be used in order to get one response
+ corresponding to a request in the collection by passing the
+ collection as argument to
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>,
+ <seemfa marker="#wait_response/3"><c>wait_response/3</c></seemfa>,
+ or,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>.
+ </p>
+
+ <p>
+ The same as calling
+ <seemfa marker="#reqids_add/3"><c>gen_statem:reqids_add</c></seemfa>(<seemfa
+ marker="#send_request/2"><c>statem:send_request</c></seemfa><c>(<anno>ServerRef</anno>,
+ <anno>Request</anno>), <anno>Label</anno>,
+ <anno>ReqIdCollection</anno>)</c>, but calling <c>send_request/4</c>
+ is slightly more efficient.
+ </p>
+ </desc>
+ </func>
+
+ <func>
<name name="start" arity="3" since="OTP 19.0"/>
<name name="start" arity="4" since="OTP 19.0"/>
<fsummary>Create a standalone <c>gen_statem</c> process.</fsummary>
@@ -2186,22 +2530,38 @@ handle_event(_, _, State, Data) ->
terminate, or the atom <c>infinity</c> to wait indefinitely.
Defaults to <c>infinity</c>.
If the server does not terminate within the specified time,
- a <c>timeout</c> exception is raised.
- </p>
- <p>
- If the process does not exist, a <c>noproc</c> exception
- is raised.
+ the call exits the calling process
+ with reason <c>timeout</c>.
</p>
+ <p>
+ If the process does not exist, the call exits
+ the calling process with reason <c>noproc</c>,
+ and with reason <c>{nodedown,Node}</c>
+ if the connection fails to the remote <c>Node</c>
+ where the server runs.
+ </p>
</desc>
</func>
<func>
- <name name="wait_response" arity="1" since="OTP 23.0"/>
- <name name="wait_response" arity="2" since="OTP 23.0"/>
+ <name name="wait_response" arity="1" clause_i="1" since="OTP 23.0"/>
<fsummary>Wait for a reply from a server.</fsummary>
<desc>
<p>
- This function is used to wait for a reply of a request made with
+ The same as calling
+ <seemfa marker="#receive_response/2"><c>gen_statem:receive_response(ReqId,
+ infinity)</c></seemfa>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="wait_response" arity="2" since="OTP 23.0"/>
+ <fsummary>Wait or poll for a reply from a server.</fsummary>
+ <desc>
+ <p>
+ Wait for a response corresponding to the request identifier
+ <c><anno>ReqId</anno></c>. The request must have been made by
<seemfa marker="#send_request/2"><c>send_request/2</c></seemfa>
to the <c>gen_statem</c> process. This function must be called
from the same process from which
@@ -2209,11 +2569,8 @@ handle_event(_, _, State, Data) ->
was made.
</p>
<p>
- <c>Timeout</c> is an integer greater then or equal to zero
- that specifies how many milliseconds to wait for an reply, or
- the atom <c>infinity</c> to wait indefinitely. Defaults to
- <c>infinity</c>.
- If no reply is received within the specified
+ <c><anno>WaitTime</anno></c> specifies how long to wait for
+ a reply. If no reply is received within the specified
time, the function returns <c>timeout</c> and no cleanup is
done, and thus the function can be invoked repeatedly until a
reply is returned.
@@ -2233,13 +2590,90 @@ handle_event(_, _, State, Data) ->
</p>
<p>
The difference between
- <seemfa marker="#receive_response/2"><c>receive_response()</c></seemfa>
- and <c>wait_response()</c> is that <c>receive_response()</c>
+ <seemfa marker="#receive_response/2"><c>receive_response/2</c></seemfa>
+ and <c>wait_response/2</c> is that <c>receive_response/2</c>
abandons the request at timeout so that a potential future
- response is ignored, while <c>wait_response()</c> does not.
+ response is ignored, while <c>wait_response/2</c> does not.
</p>
</desc>
</func>
+
+ <func>
+ <name name="wait_response" arity="3" since="OTP @OTP-17784@"/>
+ <fsummary>Wait or poll for a response from a server.</fsummary>
+ <desc>
+ <p>
+ Wait for a response corresponding to a request identifier saved
+ in <c><anno>ReqIdCollection</anno></c>. All request identifiers
+ of <c><anno>ReqIdCollection</anno></c> must correspond to requests
+ that have been made using
+ <seemfa marker="#send_request/2"><c>send_request/2</c></seemfa> or
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>,
+ and all request must have been made by the process calling this
+ function.
+ </p>
+ <p>
+ The <c><anno>Label</anno></c> in the response equals the
+ <c><anno>Label</anno></c> associated with the request identifier
+ that the response corresponds to. The <c><anno>Label</anno></c>
+ of a request identifier is associated when
+ <seemfa marker="#reqids_add/3">saving the request id</seemfa> in
+ a request identifier collection, or when sending the request using
+ <seemfa marker="#send_request/4"><c>send_request/4</c></seemfa>.
+ </p>
+ <p>
+ Compared to
+ <seemfa marker="#wait_response/2"><c>wait_response/2</c></seemfa>,
+ the returned result associated with a specific request identifier
+ or an exception associated with a specific request identifier will
+ be wrapped in a 3-tuple. The first element of this tuple equals the
+ value that would have been produced by <c>wait_response/2</c>,
+ the second element equals the <c><anno>Label</anno></c> associated
+ with the specific request identifier, and the third element
+ <c><anno>NewReqIdCollection</anno></c> is a possibly modified
+ request identifier collection.
+ </p>
+ <p>
+ If <c><anno>ReqIdCollection</anno></c> is empty, <c>no_request</c>
+ will be returned. If no response is received before the
+ <c><anno>WaitTime</anno></c> timeout has triggered, the atom
+ <c>timeout</c> is returned. It is valid to continue waiting for a
+ response as many times as needed up until a response has been received
+ and completed by <c>check_response()</c>, <c>receive_response()</c>,
+ or <c>wait_response()</c>.
+ </p>
+ <p>
+ The difference between
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>
+ and <c>wait_response/3</c> is that <c>receive_response/3</c>
+ abandons requests at timeout so that a potential future
+ responses are ignored, while <c>wait_response/3</c> does not.
+ </p>
+ <p>
+ If <c><anno>Delete</anno></c> equals <c>true</c>, the association
+ with <c><anno>Label</anno></c> will have been deleted from
+ <c><anno>ReqIdCollection</anno></c> in the resulting
+ <c><anno>NewReqIdCollection</anno></c>. If
+ <c><anno>Delete</anno></c> equals <c>false</c>,
+ <c><anno>NewReqIdCollection</anno></c> will equal
+ <c><anno>ReqIdCollection</anno></c>. Note that deleting an
+ association is not for free and that a collection containing
+ already handled requests can still be used by subsequent calls to
+ <c>wait_response/3</c>,
+ <seemfa marker="#check_response/3"><c>check_response/3</c></seemfa>,
+ and
+ <seemfa marker="#receive_response/3"><c>receive_response/3</c></seemfa>.
+ However, without deleting handled associations, the above calls will
+ not be able to detect when there are no more outstanding requests to
+ handle, so you will have to keep track of this some other way than
+ relying on a <c>no_request</c> return. Note that if you pass a
+ collection only containing associations of already handled or
+ abandoned requests to <c>wait_response/3</c>, it will always block
+ until a timeout determined by <c><anno>WaitTime</anno></c> is
+ triggered and then return <c>no_reply</c>.
+ </p>
+ </desc>
+ </func>
</funcs>
@@ -2480,6 +2914,106 @@ init(Args) -> erlang:error(not_implemented, [Args]).</pre>
</func>
<func>
+ <name since="OTP @OTP-17351@">Module:format_status(Status) -> NewStatus</name>
+ <fsummary>Optional function for providing a term describing the
+ current <c>gen_statem</c> status.</fsummary>
+ <type>
+ <v>Status = #{ state => <seetype marker="#state">state()</seetype>,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ reason => term(),</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ data => <seetype marker="#data">data()</seetype>,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ queue => Queue,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ postponed => Postponed,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ timeouts => Timeouts,</v>
+ <v>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+ log => Log }</v>
+ <v>NewStatus = Status</v>
+ <v>Queue = Postponed = [{EventType,EventContent}]</v>
+ <v>EventType = <seetype marker="#event_type">event_type()</seetype></v>
+ <v>Timeouts = [{<seetype marker="#timeout_event_type">timeout_event_type()</seetype>,EventContent}]</v>
+ <v>EventContent = term()</v>
+ <v>Log = [<seetype marker="sys#system_event">sys:system_event()</seetype>]</v>
+ </type>
+ <desc>
+ <note>
+ <p>
+ This callback is optional, so a callback module does not need
+ to export it. The <c>gen_statem</c> module provides a default
+ implementation of this function that returns
+ <c>{State,Data}</c>.
+ </p>
+ <p>
+ If this callback is exported but fails,
+ to hide possibly sensitive data,
+ the default function will instead return <c>{State,Info}</c>,
+ where <c>Info</c> says nothing but the fact that
+ <c>format_status/2</c> has crashed.
+ </p>
+ </note>
+ <p>This function is called by a <c>gen_statem</c> process when
+ any of the following apply:</p>
+ <list type="bulleted">
+ <item>
+ <p><seemfa marker="sys#get_status/1"><c>sys:get_status/1,2</c></seemfa>
+ is invoked to get the <c>gen_statem</c> status.</p>
+ </item>
+ <item>
+ <p>The <c>gen_statem</c> process terminates abnormally and logs an error.</p>
+ </item>
+ </list>
+ <p>
+ This function is useful for changing the form and
+ appearance of the <c>gen_statem</c> status for these cases. A
+ callback module wishing to change the
+ <seemfa marker="sys#get_status/1"><c>sys:get_status/1,2</c></seemfa>
+ return value and how
+ its status appears in termination error logs exports an
+ instance of <c>format_status/1</c>, which returns a map
+ describing the current status of the <c>gen_statem</c>.
+ </p>
+ <taglist>
+ <tag><c>state => </c><seetype marker="#state"><c>state()</c></seetype></tag>
+ <item>The current state of the <c>gen_statem</c> process.</item>
+ <tag><c>data => </c><seetype marker="#data"><c>data()</c></seetype></tag>
+ <item>The state data of the the <c>gen_statem</c> process.</item>
+ <tag><c>reason => term()</c></tag>
+ <item>The reason that caused the state machine to terminate.</item>
+ <tag><c>queue => [{</c><seetype marker="#event_type"><c>event_type()</c></seetype><c>,term()}]</c></tag>
+ <item>The event queue of the <c>gen_statem</c> process.</item>
+ <tag><c>postponed => [{</c><seetype marker="#event_type"><c>event_type()</c></seetype><c>,term()}]</c></tag>
+ <item>The <seetype marker="#postpone">postponed</seetype> events queue of the <c>gen_statem</c> process.</item>
+ <tag><c>log => [</c><seetype marker="sys#system_event"><c>sys:system_event/0</c></seetype><c>]</c></tag>
+ <item>The <seemfa marker="sys#log/2">sys log</seemfa> of the server.</item>
+ </taglist>
+ <p>New associations may be added into the status map without prior notice.</p>
+ <p>The function is to return <c>NewStatus</c>, a map containing the same
+ associations as the input map.</p>
+ <p>
+ One use case for this function is to return compact alternative
+ state representations to avoid having large state terms
+ printed in log files. Another use is to hide sensitive data from
+ being written to the error log.
+ </p>
+ <p>Example:</p>
+ <code type="erl"><![CDATA[
+format_status(Status) ->
+ maps:map(
+ fun(state,State) ->
+ maps:remove(private_key, State);
+ (message,{password, _Pass}) ->
+ {password, removed};
+ (_,Value) ->
+ Value
+ end, Status).
+]]></code>
+ </desc>
+ </func>
+
+ <func>
<name since="OTP 19.0">Module:format_status(Opt, [PDict,State,Data]) ->
Status
</name>
@@ -2502,6 +3036,11 @@ init(Args) -> erlang:error(not_implemented, [Args]).</pre>
<v>Status = term()</v>
</type>
<desc>
+ <warning>
+ <p>This callback is deprecated, in new code use <seemfa marker="#Module:format_status/1">
+ format_status/1</seemfa>. If a <seemfa marker="#Module:format_status/1">format_status/1</seemfa>
+ callback exists, then this function will never be called.</p>
+ </warning>
<note>
<p>
This callback is optional, so a callback module does not need
diff --git a/lib/stdlib/doc/src/lists.xml b/lib/stdlib/doc/src/lists.xml
index f7b4506f14..455f4295e4 100644
--- a/lib/stdlib/doc/src/lists.xml
+++ b/lib/stdlib/doc/src/lists.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2021</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -175,6 +175,48 @@
</func>
<func>
+ <name name="enumerate" arity="1" since="OTP @OTP-17523@"/>
+ <fsummary>Annotates elements with their index.</fsummary>
+ <desc>
+ <p>Returns <c><anno>List1</anno></c> with each element
+ <c>H</c> replaced by a tuple of form <c>{I, H}</c> where
+ <c>I</c> is the position of <c>H</c> in
+ <c><anno>List1</anno></c>. The enumeration starts with 1 and
+ increases by 1 in each step.</p>
+ <p>That is, <c>enumerate/1</c> behaves as if it had been defined as follows:</p>
+ <code type="erl">
+enumerate(List) ->
+ {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+1} end, 1, List),
+ List1.</code>
+ <p><em>Example:</em></p>
+ <pre>
+> <input>lists:enumerate([a,b,c]).</input>
+[{1,a},{2,b},{3,c}]</pre>
+ </desc>
+ </func>
+
+ <func>
+ <name name="enumerate" arity="2" since="OTP @OTP-17523@"/>
+ <fsummary>Annotates elements with their index.</fsummary>
+ <desc>
+ <p>Returns <c><anno>List1</anno></c> with each element
+ <c>H</c> replaced by a tuple of form <c>{I, H}</c> where
+ <c>I</c> is the position of <c>H</c> in
+ <c><anno>List1</anno></c>. The enumeration starts with
+ <c><anno>Index</anno></c> and increases by 1 in each step.</p>
+ <p>That is, <c>enumerate/2</c> behaves as if it had been defined as follows:</p>
+ <code type="erl">
+enumerate(I, List) ->
+ {List1, _ } = lists:mapfoldl(fun(T, Acc) -> {{Acc, T}, Acc+1} end, I, List),
+ List1.</code>
+ <p><em>Example:</em></p>
+ <pre>
+> <input>lists:enumerate(10, [a,b,c]).</input>
+[{10,a},{11,b},{12,c}]</pre>
+ </desc>
+ </func>
+
+ <func>
<name name="filter" arity="2" since=""/>
<fsummary>Select elements that satisfy a predicate.</fsummary>
<desc>
@@ -1084,6 +1126,43 @@ splitwith(Pred, List) ->
[[a,x,1],[b,y,2],[c,z,3]]</pre>
</desc>
</func>
+
+ <func>
+ <name name="uniq" arity="1" since="OTP 25.0"/>
+ <fsummary>Removes duplicate elements of a list preserving the order.</fsummary>
+ <desc>
+ <p>Returns a list containing the elements of
+ <c><anno>List1</anno></c> with duplicated elements removed
+ (preserving the order of the elements). The first occurrence of
+ each element is kept.</p>
+ <p><em>Examples:</em></p>
+ <pre>
+> <input>lists:uniq(fun([3,3,1,2,1,2,3]).</input>
+[3,1,2]
+> <input>lists:uniq([a, a, 1, b, 2, a, 3]).</input>
+[a, 1, b, 2, 3]</pre>
+ </desc>
+ </func>
+
+ <func>
+ <name name="uniq" arity="2" since="OTP 25.0"/>
+ <fsummary>
+ Removes duplicate elements of a list using
+ a fun as a key preserving the order.
+ </fsummary>
+ <desc>
+ <p>Returns a list containing the elements of
+ <c><anno>List1</anno></c> without the elements for which
+ <c><anno>Fun</anno></c> returned duplicate values
+ (preserving the order of the elements). The first occurrence
+ of each element is kept.</p>
+ <p><em>Examples:</em></p>
+ <pre>
+> <input>lists:uniq(fun({X, _}) -> X end, [{b, 2}, {a, 1}, {c, 3}, {a, 2}]).</input>
+[{b, 2}, {a, 1}, {c, 3}]</pre>
+ </desc>
+ </func>
+
</funcs>
</erlref>
diff --git a/lib/stdlib/doc/src/maps.xml b/lib/stdlib/doc/src/maps.xml
index ea0f16eec9..b6869c5cb9 100644
--- a/lib/stdlib/doc/src/maps.xml
+++ b/lib/stdlib/doc/src/maps.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2013</year><year>2021</year>
+ <year>2013</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -606,7 +606,7 @@ error</code>
maps:update_with("new counter",Fun,42,Map).
#{"counter" => 1,"new counter" => 42}</code>
</desc>
- </func>
+ </func>
<func>
<name name="values" arity="1" since="OTP 17.0"/>
@@ -657,5 +657,39 @@ error</code>
#{1337 => "value two"}</code>
</desc>
</func>
+
+ <func>
+ <name name="groups_from_list" arity="2" since="OTP 25.0"/>
+ <fsummary>Splits the list into groups using a function as discriminator.</fsummary>
+ <desc>
+ <p>The result is a map where each key is given by <anno>Fun</anno>
+ and each value is a list of elements. The order of elements within
+ each list is preserved from the list.</p>
+ <p><em>Examples:</em></p>
+ <pre>
+> <input>maps:groups_from_list(fun(X) -> X rem 2 end, [1,2,3]).</input>
+#{0 => [2], 1 => [1, 3]}
+> <input>maps:groups_from_list(fun erlang:length/1, ["ant", "buffalo", "cat", "dingo"]).</input>
+#{3 => ["ant", "cat"], 5 => ["dingo"], 7 => ["buffalo"]}</pre>
+ </desc>
+ </func>
+
+ <func>
+ <name name="groups_from_list" arity="3" since="OTP 25.0"/>
+ <fsummary>Splits the list into groups using a function as discriminator.</fsummary>
+ <desc>
+ <p>The result is a map where each key is given by
+ <anno>Fun</anno> and each value is a list of elements given by
+ the <anno>ValueFun</anno>. The order of elements within each
+ list is preserved from the list.</p>
+ <p><em>Examples:</em></p>
+ <pre>
+> <input>maps:groups_from_list(fun(X) -> X rem 2 end, fun(X) -> X*X end, [1,2,3]).</input>
+#{0 => [4], 1 => [1, 9]}
+> <input>maps:groups_from_list(fun erlang:length/1, fun lists:reverse/1, ["ant", "buffalo", "cat", "dingo"]).</input>
+#{3 => ["tna","tac"],5 => ["ognid"],7 => ["olaffub"]}</pre>
+ </desc>
+ </func>
+
</funcs>
</erlref>
diff --git a/lib/stdlib/doc/src/ms_transform.xml b/lib/stdlib/doc/src/ms_transform.xml
index bde9223eb0..2df25805f0 100644
--- a/lib/stdlib/doc/src/ms_transform.xml
+++ b/lib/stdlib/doc/src/ms_transform.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2002</year><year>2020</year>
+ <year>2002</year><year>2021</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -389,8 +389,8 @@ ets:select(emp_tab, ets:fun2ms(
<item>
<p>The guard BIFs: <c>abs</c>, <c>element</c>,
<c>hd</c>, <c>length</c>,
- <c>node</c>, <c>round</c>, <c>size</c>, <c>tl</c>, <c>trunc</c>,
- <c>self</c></p>
+ <c>node</c>, <c>round</c>, <c>size</c>, <c>byte_size</c>, <c>tl</c>,
+ <c>trunc</c>, <c>binary_part</c>, <c>self</c></p>
</item>
</list>
diff --git a/lib/stdlib/doc/src/peer.xml b/lib/stdlib/doc/src/peer.xml
new file mode 100644
index 0000000000..6ac2c6b278
--- /dev/null
+++ b/lib/stdlib/doc/src/peer.xml
@@ -0,0 +1,608 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE erlref SYSTEM "erlref.dtd">
+
+<!-- %ExternalCopyright% -->
+
+<erlref>
+ <header>
+ <copyright>
+ <year>2021</year><year>2021</year>
+ <holder>Maxim Fedorov, WhatsApp Inc.</holder>
+ </copyright>
+ <legalnotice>
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+ </legalnotice>
+
+ <title>peer</title>
+ <prepared>maximfca@gmail.com</prepared>
+ <docno></docno>
+ <date></date>
+ <rev></rev>
+ <file>peer.xml</file>
+ </header>
+ <module since="OTP @OTP-17720@">peer</module>
+ <modulesummary>Start and control linked Erlang nodes.
+ </modulesummary>
+ <description>
+ <p>
+ This module provides functions for starting linked Erlang nodes.
+ The node spawning new nodes is called <em>origin</em>, and newly started
+ nodes are <em>peer</em> nodes, or peers. A peer node automatically
+ terminates when it loses the <em>control connection</em> to the origin. This
+ connection could be an Erlang distribution connection, or an alternative -
+ TCP or standard I/O. The alternative connection provides a way to execute
+ remote procedure calls even when Erlang Distribution is not available,
+ allowing to test the distribution itself.
+ </p>
+
+ <p>
+ Peer node terminal input/output is relayed through the origin.
+ If a standard I/O alternative connection is requested, console output
+ also goes via the origin, allowing debugging of node startup and boot
+ script execution (see <seecom marker="erts:erl#init_debug">
+ <c>-init_debug</c></seecom>). File I/O is not redirected, contrary to
+ <seeerl marker="slave"><c>slave(3)</c></seeerl> behaviour.
+ </p>
+
+ <p>
+ The peer node can start on the same or a different host (via <c>ssh</c>)
+ or in a separate container (for example Docker).
+ When the peer starts on the same host as the origin, it inherits
+ the current directory and environment variables from the origin.
+ </p>
+
+ <note>
+ <p>
+ This module is designed to facilitate multi-node testing with Common Test.
+ Use the <c>?CT_PEER()</c> macro to start a linked peer node according to
+ Common Test conventions: crash dumps written to specific location, node
+ name prefixed with module name, calling function, and origin OS process
+ ID). Use <seemfa marker="#random_name/1"><c>random_name/1</c></seemfa> to
+ create sufficiently unique node names if you need more control.
+ </p>
+ <p>
+ A peer node started without alternative connection behaves similarly
+ to <seeerl marker="slave"><c>slave(3)</c></seeerl>. When an alternative
+ connection is requested, the behaviour is similar to
+ <c>test_server:start_node(Name, peer, Args).</c>
+ </p> </note>
+
+ </description>
+
+ <section>
+ <title>Example</title>
+ <p>
+ The following example implements a test suite starting extra Erlang nodes.
+ It employs a number of techniques to speed up testing and reliably shut
+ down peer nodes:
+ </p>
+ <list>
+ <item>peers start linked to test runner process. If the test case fails,
+ the peer node is stopped automatically, leaving no rogue nodes running in
+ the background</item>
+ <item>arguments used to start the peer are saved in the control process
+ state for manual analysis. If the test case fails, the CRASH REPORT contains
+ these arguments</item>
+ <item>multiple test cases can run concurrently speeding up overall testing
+ process, peer node names are unique even when there are multiple instances
+ of the same test suite running in parallel</item>
+ </list>
+ <code type="erl">
+ -module(my_SUITE).
+ -behaviour(ct_suite).
+ -export([all/0, groups/0]).
+ -export([basic/1, args/1, named/1, restart_node/1, multi_node/1]).
+
+ -include_lib("common_test/include/ct.hrl").
+
+ groups() ->
+ [{quick, [parallel],
+ [basic, args, named, restart_node, multi_node]}].
+
+ all() ->
+ [{group, quick}].
+
+ basic(Config) when is_list(Config) ->
+ {ok, Peer, _Node} = ?CT_PEER(),
+ peer:stop(Peer).
+
+ args(Config) when is_list(Config) ->
+ %% specify additional arguments to the new node
+ {ok, Peer, _Node} = ?CT_PEER(["-emu_flavor", "smp"]),
+ peer:stop(Peer).
+
+ named(Config) when is_list(Config) ->
+ %% pass test case name down to function starting nodes
+ Peer = start_node_impl(named_test),
+ peer:stop(Peer).
+
+ start_node_impl(ActualTestCase) ->
+ {ok, Peer, Node} = ?CT_PEER(#{name => ?CT_PEER_NAME(ActualTestCase)}),
+ %% extra setup needed for multiple test cases
+ ok = rpc:call(Node, application, set_env, [kernel, key, value]),
+ Peer.
+
+ restart_node(Config) when is_list(Config) ->
+ Name = ?CT_PEER_NAME(),
+ {ok, Peer, Node} = ?CT_PEER(#{name => Name}),
+ peer:stop(Peer),
+ %% restart the node with the same name as before
+ {ok, Peer2, Node} = ?CT_PEER(#{name => Name, args => ["+fnl"]}),
+ peer:stop(Peer2).
+ </code>
+
+ <p>
+ The next example demonstrates how to start multiple nodes concurrently:
+ </p>
+ <code type="erl">
+ multi_node(Config) when is_list(Config) ->
+ Peers = [?CT_PEER(#{wait_boot => {self(), tag}})
+ || _ &lt;- lists:seq(1, 4)],
+ %% wait for all nodes to complete boot process, get their names:
+ _Nodes = [receive {tag, {started, Node, Peer}} -> Node end
+ || {ok, Peer} &lt;- Peers],
+ [peer:stop(Peer) || {ok, Peer} &lt;- Peers].
+ </code>
+
+ <p>
+ Start a peer on a different host. Requires <c>ssh</c> key-based
+ authentication set up, allowing "another_host" connection without password
+ prompt.
+ </p>
+ <code type="erl">
+ Ssh = os:find_executable("ssh"),
+ peer:start_link(#{exec => {Ssh, ["another_host", "erl"]},
+ connection => standard_io}),
+ </code>
+
+ <p>
+ The following Common Test case demonstrates Docker integration, starting two
+ containers with hostnames "one" and "two". In this example Erlang nodes
+ running inside containers form an Erlang cluster.
+ </p>
+ <code type="erl">
+ docker(Config) when is_list(Config) ->
+ Docker = os:find_executable("docker"),
+ PrivDir = proplists:get_value(priv_dir, Config),
+ build_release(PrivDir),
+ build_image(PrivDir),
+
+ %% start two Docker containers
+ {ok, Peer, Node} = peer:start_link(#{name => lambda,
+ connection => standard_io,
+ exec => {Docker, ["run", "-h", "one", "-i", "lambda"]}}),
+ {ok, Peer2, Node2} = peer:start_link(#{name => lambda,
+ connection => standard_io,
+ exec => {Docker, ["run", "-h", "two", "-i", "lambda"]}}),
+
+ %% find IP address of the second node using alternative connection RPC
+ {ok, Ips} = peer:call(Peer2, inet, getifaddrs, []),
+ {"eth0", Eth0} = lists:keyfind("eth0", 1, Ips),
+ {addr, Ip} = lists:keyfind(addr, 1, Eth0),
+
+ %% make first node to discover second one
+ ok = peer:call(Peer, inet_db, set_lookup, [[file]]),
+ ok = peer:call(Peer, inet_db, add_host, [Ip, ["two"]]),
+
+ %% join a cluster
+ true = peer:call(Peer, net_kernel, connect_node, [Node2]),
+ %% verify that second peer node has only the first node visible
+ [Node] = peer:call(Peer2, erlang, nodes, []),
+
+ %% stop peers, causing containers to also stop
+ peer:stop(Peer2),
+ peer:stop(Peer).
+
+ build_release(Dir) ->
+ %% load sasl.app file, otherwise application:get_key will fail
+ application:load(sasl),
+ %% create *.rel - release file
+ RelFile = filename:join(Dir, "lambda.rel"),
+ Release = {release, {"lambda", "1.0.0"},
+ {erts, erlang:system_info(version)},
+ [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end}
+ || App &lt;- [kernel, stdlib, sasl]]},
+ ok = file:write_file(RelFile, list_to_binary(lists:flatten(
+ io_lib:format("~tp.", [Release])))),
+ RelFileNoExt = filename:join(Dir, "lambda"),
+
+ %% create boot script
+ {ok, systools_make, []} = systools:make_script(RelFileNoExt,
+ [silent, {outdir, Dir}]),
+ %% package release into *.tar.gz
+ ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
+
+ build_image(Dir) ->
+ %% Create Dockerfile example, working only for Ubuntu 20.04
+ %% Expose port 4445, and make Erlang distribution to listen
+ %% on this port, and connect to it without EPMD
+ %% Set cookie on both nodes to be the same.
+ BuildScript = filename:join(Dir, "Dockerfile"),
+ Dockerfile =
+ "FROM ubuntu:20.04 as runner\n"
+ "EXPOSE 4445\n"
+ "WORKDIR /opt/lambda\n"
+ "COPY lambda.tar.gz /tmp\n"
+ "RUN tar -zxvf /tmp/lambda.tar.gz -C /opt/lambda\n"
+ "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++
+ "/bin/dyn_erl\", \"-boot\", \"/opt/lambda/releases/1.0.0/start\","
+ " \"-kernel\", \"inet_dist_listen_min\", \"4445\","
+ " \"-erl_epmd_port\", \"4445\","
+ " \"-setcookie\", \"secret\"]\n",
+ ok = file:write_file(BuildScript, Dockerfile),
+ os:cmd("docker build -t lambda " ++ Dir).
+ </code>
+ </section>
+
+ <datatypes>
+ <datatype>
+ <name name="start_options"/>
+ <desc>
+ <p>
+ Options that can be used when starting
+ a <c>peer</c> node through <seemfa marker="#start/1"><c>start/1</c></seemfa>
+ and <seemfa marker="#start_link/0"><c>start_link/0,1</c></seemfa>.
+ </p>
+ <taglist>
+ <tag><c>name</c></tag>
+ <item>
+ <p>
+ Node name (the part before "@"). When <c>name</c> is not specified, but <c>host</c>
+ is, <c>peer</c> follows compatibility behaviour and uses the origin node name.
+ </p>
+ </item>
+ <tag><c>host</c></tag>
+ <item>
+ <p>
+ Enforces a specific host name. Can be used to override the default
+ behaviour and start "node@localhost" instead of "node@realhostname".
+ </p>
+ </item>
+ <tag><c>longnames</c></tag>
+ <item>
+ <p>
+ Use long names to start a node. Default is taken from the origin
+ using <c>net_kernel:longnames()</c>. If the origin is not distributed,
+ short names is the default.
+ </p>
+ </item>
+ <tag><c>peer_down</c></tag>
+ <item>
+ <p>
+ Defines the peer control process behaviour when the control connection is
+ closed from the peer node side (for example when the peer crashes or dumps core).
+ When set to <c>stop</c> (default), a lost control connection causes
+ the control process to exit normally. Setting <c>peer_down</c> to <c>continue</c>
+ keeps the control process running, and <c>crash</c> will cause
+ the controlling process to exit abnormally.
+ </p>
+ </item>
+ <tag><c>exec</c></tag>
+ <item>
+ <p>
+ Alternative mechanism to start peer nodes with, for example, ssh instead of the
+ default bash.
+ </p>
+ </item>
+ <tag><c>connection</c></tag>
+ <item>
+ <p>Alternative connection specification. See the
+ <seetype marker="#connection"><c>connection</c> datatype</seetype>.</p>
+ </item>
+ <tag><c>args</c></tag>
+ <item>
+ <p>Extra command line arguments to append to the "erl" command. Arguments are
+ passed as is, no escaping or quoting is needed or accepted.</p>
+ </item>
+ <tag><c>env</c></tag>
+ <item>
+ <p>
+ List of environment variables with their values. This list is applied
+ to a locally started executable. If you need to change the environment of
+ the remote peer, adjust <c>args</c> to contain
+ <c>-env ENV_KEY ENV_VALUE</c>.
+ </p>
+ </item>
+ <tag><c>wait_boot</c></tag>
+ <item>
+ <p>Specifies the start/start_link timeout.
+ See <seetype marker="#wait_boot"><c>wait_boot</c> datatype</seetype>.
+ </p>
+ </item>
+ <tag><c>shutdown</c></tag>
+ <item>
+ <p>Specifies the peer node stopping behaviour. See
+ <seemfa marker="#stop/1"><c>stop()</c></seemfa>.</p>
+ </item>
+ </taglist>
+ </desc>
+ </datatype>
+ <datatype>
+ <name name="peer_state"/>
+ <desc><p>Peer node state.</p></desc>
+ </datatype>
+ <datatype>
+ <name name="connection"/>
+ <desc><p>Alternative connection between the origin and the peer. When the
+ connection closes, the peer node terminates automatically. If
+ the <c>peer_down</c> startup flag is set to <c>crash</c>, the controlling
+ process on the origin node exits with corresponding reason, effectively
+ providing a two-way link. </p>
+ <p>When <c>connection</c> is set to a port number, the origin starts listening on
+ the requested TCP port, and the peer node connects to the port. When it is set to
+ an <c>{IP, Port}</c> tuple, the origin listens only on the specified IP. The port
+ number can be set to 0 for automatic selection.
+ </p>
+ <p>Using the <c>standard_io</c> alternative connection starts the peer attached to
+ the origin (other connections use <c>-detached</c> flag to erl). In this mode
+ peer and origin communicate via stdin/stdout.
+ </p>
+ </desc>
+ </datatype>
+ <datatype>
+ <name name="exec"/>
+ <desc>
+ <p>
+ Overrides executable to start peer nodes with. By default it is
+ the path to "erl", taken from <c>init:get_argument(progname)</c>.
+ If <c>progname</c> is not known, <c>peer</c> makes best guess given the current
+ ERTS version.
+ </p>
+ <p>
+ When a tuple is passed, the first element is the path to executable,
+ and the second element is prepended to the final command line. This can be used
+ to start peers on a remote host or in a Docker container. See the examples
+ above.
+ </p>
+ <p>
+ This option is useful for testing backwards compatibility with previous releases,
+ installed at specific paths, or when the Erlang installation location
+ is missing from the <c>PATH</c>.
+ </p>
+ </desc>
+ </datatype>
+ <datatype>
+ <name name="wait_boot"/>
+ <desc><p>Specifies start/start_link timeout in milliseconds. Can be set to
+ <c>false</c>, allowing the peer to start asynchronously. If <c>{Pid, Tag}</c>
+ is specified instead of a timeout, the peer will send <c>Tag</c> to the
+ requested process.</p></desc>
+ </datatype>
+ <datatype>
+ <name name="disconnect_timeout"/>
+ <desc><p>Disconnect timeout. See
+ <seemfa marker="#stop/1"><c>stop()</c></seemfa>.</p></desc>
+ </datatype>
+ </datatypes>
+
+ <funcs>
+
+ <func>
+ <name name="call" arity="4" since="OTP @OTP-17720@"/>
+ <name name="call" arity="5" since="OTP @OTP-17720@"/>
+ <fsummary>Evaluates a function call on a peer node.</fsummary>
+ <desc>
+ <p>
+ Uses the alternative connection to
+ evaluate <c>apply(<anno>Module</anno>, <anno>Function</anno>,
+ <anno>Args</anno>)</c> on the peer node and returns
+ the corresponding value <c><anno>Result</anno></c>.
+ <c><anno>Timeout</anno></c> is an integer representing
+ the timeout in milliseconds or the atom <c>infinity</c>
+ which prevents the operation from ever timing out.
+ </p>
+ <p>
+ When an alternative connection is not requested, this
+ function will raise <c>exit</c> signal with the <c>noconnection</c>
+ reason. Use <seeerl marker="kernel:erpc"><c>erpc</c></seeerl> module
+ to communicate over Erlang distribution.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="cast" arity="4" since="OTP @OTP-17720@"/>
+ <fsummary>Evaluates a function call on a peer node ignoring the result.</fsummary>
+ <desc>
+ <p>
+ Uses the alternative connection to
+ evaluate <c>apply(<anno>Module</anno>, <anno>Function</anno>,
+ <anno>Args</anno>)</c> on the peer node. No response is delivered to the
+ calling process.
+ </p>
+ <p>
+ <c>peer:cast/4</c> fails silently when the alternative connection is not
+ configured. Use <seeerl marker="kernel:erpc"><c>erpc</c></seeerl> module
+ to communicate over Erlang distribution.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="send" arity="3" since="OTP @OTP-17720@"/>
+ <fsummary>Sends a message to a process on the peer node.</fsummary>
+ <desc>
+ <p>
+ Uses the alternative connection to send <anno>Message</anno> to a process on the
+ the peer node. Silently fails if no alternative connection is configured.
+ The process can be referenced by process ID or registered name.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="get_state" arity="1" since="OTP @OTP-17720@"/>
+ <fsummary>Returns peer node state.</fsummary>
+ <desc>
+ <p>Returns the peer node state. Th initial state is <c>booting</c>; the node stays in that
+ state until then boot script is complete, and then the node progresses to <c>running</c>.
+ If the node stops (gracefully or not), the state changes to <c>down</c>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="random_name" arity="0" since="OTP @OTP-17720@"/>
+ <fsummary>Creates a sufficiently unique node name.</fsummary>
+ <desc>
+ <p>
+ The same as <seemfa marker="#random_name/1"><c>random_name(peer)</c></seemfa>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="random_name" arity="1" since="OTP @OTP-17720@"/>
+ <fsummary>Creates a sufficiently unique node name given a prefix.</fsummary>
+ <desc>
+ <p>
+ Creates a sufficiently unique node name for the current host,
+ combining a prefix, a unique number, and the current OS process ID.
+ </p>
+ <note>
+ <p>
+ Use the <c>?CT_PEER(["erl_arg1"])</c> macro provided by Common Test
+ <c>-include_lib("common_test/include/ct.hrl")</c> for convenience.
+ It starts a new peer using Erlang distribution as the control channel,
+ supplies thes calling module's code path to the peer, and uses the calling
+ function name for the name prefix.
+ </p>
+ </note>
+ </desc>
+ </func>
+
+ <func>
+ <name name="start" arity="1" since="OTP @OTP-17720@"/>
+ <fsummary>Starts a peer node.</fsummary>
+ <desc>
+ <p>
+ Starts a peer node with the specified
+ <seetype marker="#start_options"><c>start_options()</c></seetype>.
+ Returns the controlling process and the full peer node name, unless
+ <c>wait_boot</c> is not requested and the host name is not known in advance.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="start_link" arity="0" since="OTP @OTP-17720@"/>
+ <fsummary>Starts a peer node, and links controlling process to caller process.</fsummary>
+ <desc>
+ <p>
+ The same as
+ <seemfa marker="#start_link/1"><c>start_link(#{name => random_name()})</c></seemfa>.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="start_link" arity="1" since="OTP @OTP-17720@"/>
+ <fsummary>Starts a peer node, and links controlling process to caller process.</fsummary>
+ <desc>
+ <p>Starts a peer node in the same way as <seemfa marker="#start/1"><c>start/1</c></seemfa>,
+ except that the peer node is linked to the currently
+ executing process. If that process terminates, the peer node
+ also terminates.</p>
+ <p>
+ Accepts <seetype marker="#start_options"><c>start_options()</c></seetype>.
+ Returns the controlling process and the full peer node name, unless <c>wait_boot</c> is not
+ requested and host name is not known in advance.
+ </p>
+ <p>
+ When the <c>standard_io</c> alternative connection is requested, and <c>wait_boot</c> is
+ not set to <c>false</c>, a failed peer boot sequence causes the caller to exit with
+ the <c>{boot_failed, {exit_status, ExitCode}}</c> reason.
+ </p>
+ </desc>
+ </func>
+
+ <func>
+ <name name="stop" arity="1" since="OTP @OTP-17720@"/>
+ <fsummary>Stop controlling process and terminate peer node.</fsummary>
+ <type name="disconnect_timeout"/>
+ <desc>
+ <p>
+ Stops a peer node. How the node is stopped depends on the
+ <seetype marker="#start_options"><c>shutdown</c></seetype>
+ option passed when starting the peer node. Currently the
+ following <c>shutdown</c> options are supported:
+ </p>
+ <taglist>
+ <tag><c>halt</c></tag>
+ <item><p>
+ This is the default shutdown behavior. It behaves as <c>shutdown</c>
+ option <c>{halt, DefaultTimeout}</c> where <c>DefaultTimeout</c>
+ currently equals <c>5000</c>.
+ </p></item>
+ <tag><c>{halt, Timeout :: disconnect_timeout()}</c></tag>
+ <item><p>
+ Triggers a call to
+ <seemfa marker="erts:erlang#halt/0"><c>erlang:halt()</c></seemfa>
+ on the peer node and then waits for the Erlang distribution
+ connection to the peer node to be taken down. If this connection
+ has not been taken down after <c>Timeout</c> milliseconds, it will
+ forcefully be taken down by <c>peer:stop/1</c>. See the
+ <seeerl marker="#dist_connection_close">warning</seeerl> below for
+ more info about this.
+ </p></item>
+ <tag><c>Timeout :: disconnect_timeout()</c></tag>
+ <item><p>
+ Triggers a call to
+ <seemfa marker="erts:init#stop/0"><c>init:stop()</c></seemfa>
+ on the peer node and then waits for the Erlang distribution
+ connection to the peer node to be taken down. If this connection
+ has not been taken down after <c>Timeout</c> milliseconds, it will
+ forcefully be taken down by <c>peer:stop/1</c>. See the
+ <seeerl marker="#dist_connection_close">warning</seeerl> below for
+ more info about this.
+ </p></item>
+ <tag><c>close</c></tag>
+ <item><p>
+ Close the <i>control connection</i> to the peer node and
+ return. This is the fastest way for the caller of
+ <c>peer:stop/1</c> to stop a peer node.
+ </p>
+ <p>
+ Note that if the Erlang distribution connection is not used as
+ control connection it might not have been taken down when
+ <c>peer:stop/1</c> returns. Also note that the
+ <seeerl marker="#dist_connection_close">warning</seeerl> below
+ applies when the Erlang distribution connection is used as control
+ connection.
+ </p>
+ </item>
+ </taglist>
+
+ <marker id="dist_connection_close"/>
+ <warning>
+ <p>
+ In the cases where the Erlang distribution connection is taken
+ down by <c>peer:stop/1</c>, other code independent of the peer
+ code might react to the connection loss before the peer node is
+ stopped which might cause undesirable effects. For example,
+ <seeerl marker="kernel:global#prevent_overlapping_partitions"><c>global</c></seeerl>
+ might trigger even more Erlang distribution connections to other
+ nodes to be taken down. The potential undesirable effects are,
+ however, not limited to this. It is hard to say what the effects
+ will be since these effects can be caused by any code with links
+ or monitors to something on the origin node, or code monitoring
+ the connection to the origin node.
+ </p>
+ </warning>
+ </desc>
+ </func>
+
+ </funcs>
+</erlref>
+
diff --git a/lib/stdlib/doc/src/rand.xml b/lib/stdlib/doc/src/rand.xml
index e7a2823bc0..4a9d2d1ea4 100644
--- a/lib/stdlib/doc/src/rand.xml
+++ b/lib/stdlib/doc/src/rand.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2015</year><year>2021</year>
+ <year>2015</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -376,6 +376,10 @@ tests. We suggest to use a sign test to extract a random Boolean value.</pre>
<name name="exs64_state"/>
<desc><p>Algorithm specific internal state</p></desc>
</datatype>
+ <datatype>
+ <name name="dummy_state"/>
+ <desc><p>Algorithm specific internal state</p></desc>
+ </datatype>
</datatypes>
<funcs>
diff --git a/lib/stdlib/doc/src/ref_man.xml b/lib/stdlib/doc/src/ref_man.xml
index e404b1a3c8..042c080cf2 100644
--- a/lib/stdlib/doc/src/ref_man.xml
+++ b/lib/stdlib/doc/src/ref_man.xml
@@ -74,6 +74,7 @@
<xi:include href="ms_transform.xml"/>
<xi:include href="orddict.xml"/>
<xi:include href="ordsets.xml"/>
+ <xi:include href="peer.xml"/>
<xi:include href="pool.xml"/>
<xi:include href="proc_lib.xml"/>
<xi:include href="proplists.xml"/>
diff --git a/lib/stdlib/doc/src/shell.xml b/lib/stdlib/doc/src/shell.xml
index dc68af4328..1e943261f5 100644
--- a/lib/stdlib/doc/src/shell.xml
+++ b/lib/stdlib/doc/src/shell.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1996</year><year>2020</year>
+ <year>1996</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -789,6 +789,14 @@ q - quit erlang
manual page. (Arguments in <c>ArgList</c> are evaluated before the
callback functions are called.)</p>
+ <p>From OTP 25.0, if there are errors evaluating Erlang constructs,
+ such as <c>badmatch</c> during pattern matching or <c>bad_generator</c>
+ in a comprehension, the evaluator will dispatch to
+ <c>erlang:raise(error, Reason, Stacktrace)</c>. This call will be
+ checked against the <c>non_local_allowed/3</c> callback function.
+ You can either forbid it, allow it, or redirect to another call of
+ your choice.</p>
+
<p>Argument <c>State</c> is a tuple
<c>{ShellState,ExprState}</c>. The return value <c>NewState</c>
has the same form. This can be used to carry a state between calls
diff --git a/lib/stdlib/doc/src/specs.xml b/lib/stdlib/doc/src/specs.xml
index 75266530f2..5f7e3555d8 100644
--- a/lib/stdlib/doc/src/specs.xml
+++ b/lib/stdlib/doc/src/specs.xml
@@ -41,6 +41,7 @@
<xi:include href="../specs/specs_ms_transform.xml"/>
<xi:include href="../specs/specs_orddict.xml"/>
<xi:include href="../specs/specs_ordsets.xml"/>
+ <xi:include href="../specs/specs_peer.xml"/>
<xi:include href="../specs/specs_pool.xml"/>
<xi:include href="../specs/specs_proc_lib.xml"/>
<xi:include href="../specs/specs_proplists.xml"/>
diff --git a/lib/stdlib/doc/src/timer.xml b/lib/stdlib/doc/src/timer.xml
index 2ff124885d..11279ff410 100644
--- a/lib/stdlib/doc/src/timer.xml
+++ b/lib/stdlib/doc/src/timer.xml
@@ -50,7 +50,9 @@
<p>Creating timers using
<seemfa marker="erts:erlang#send_after/3">erlang:send_after/3</seemfa> and
<seemfa marker="erts:erlang#start_timer/3">erlang:start_timer/3</seemfa>
- is much more efficient than using the timers provided by this module. See
+ is more efficient than using the timers provided by this module. However,
+ the timer module has been improved in OTP 25, making it more efficient and
+ less susceptible to being overloaded. See
<seeguide marker="system/efficiency_guide:commoncaveats#timer-module">the
Timer Module section in the Efficiency Guide</seeguide>.</p>
</description>
@@ -116,8 +118,9 @@
<c>exit_after(<anno>Time</anno>, self(),
<anno>Reason1</anno>)</c>.</p>
<p><c>exit_after/3</c> sends an exit signal with reason
- <c><anno>Reason1</anno></c> to
- pid <c><anno>Pid</anno></c>. Returns <c>{ok, <anno>TRef</anno>}</c>
+ <c><anno>Reason1</anno></c> to <c><anno>Target</anno></c>,
+ which can be a local process identifier or an atom of a registered
+ name. Returns <c>{ok, <anno>TRef</anno>}</c>
or <c>{error, <anno>Reason2</anno>}</c>.</p>
</desc>
</func>
@@ -149,7 +152,7 @@
<p><c>kill_after/1</c> is the same as
<c>exit_after(<anno>Time</anno>, self(), kill)</c>.</p>
<p><c>kill_after/2</c> is the same as
- <c>exit_after(<anno>Time</anno>, <anno>Pid</anno>, kill)</c>.</p>
+ <c>exit_after(<anno>Time</anno>, <anno>Target</anno>, kill)</c>.</p>
</desc>
</func>
@@ -190,15 +193,16 @@
<func>
<name name="send_after" arity="2" since=""/>
<name name="send_after" arity="3" since=""/>
- <fsummary>Send <c>Message</c> to <c>Pid</c> after a specified
+ <fsummary>Send <c>Message</c> to <c>Destination</c> after a specified
<c>Time</c>.</fsummary>
<desc>
<taglist>
<tag><c>send_after/3</c></tag>
<item>
- <p>Evaluates <c><anno>Pid</anno> ! <anno>Message</anno></c> after
- <c><anno>Time</anno></c> milliseconds. (<c><anno>Pid</anno></c>
- can also be an atom of a registered name.)</p>
+ <p>Evaluates <c><anno>Destination</anno> ! <anno>Message</anno></c> after
+ <c><anno>Time</anno></c> milliseconds. (<c><anno>Destination</anno></c> can
+ be a remote or local process identifier, an atom of a registered name or
+ a tuple <c>{RegName, Node}</c> for a registered name at another node.)</p>
<p>Returns <c>{ok, <anno>TRef</anno>}</c> or
<c>{error, <anno>Reason</anno>}</c>.</p>
<p>See also
@@ -223,10 +227,11 @@
<taglist>
<tag><c>send_interval/3</c></tag>
<item>
- <p>Evaluates <c><anno>Pid</anno> ! <anno>Message</anno></c>
+ <p>Evaluates <c><anno>Destination</anno> ! <anno>Message</anno></c>
repeatedly after <c><anno>Time</anno></c> milliseconds.
- (<c><anno>Pid</anno></c> can also be
- an atom of a registered name.)</p>
+ (<c><anno>Destination</anno></c> can be a remote or local process
+ identifier, an atom of a registered name or a tuple <c>{RegName, Node}</c>
+ for a registered name at another node.)</p>
<p>Returns <c>{ok, <anno>TRef</anno>}</c> or
<c>{error, <anno>Reason</anno>}</c>.</p>
</item>
@@ -249,6 +254,11 @@
or suspends the process forever if <c><anno>Time</anno></c> is the
atom <c>infinity</c>. Naturally, this
function does <em>not</em> return immediately.</p>
+ <note>
+ <p>Before OTP 25, <c>timer:sleep/1</c> did not accept integer
+ timeout values greater than <c>16#ffffffff</c>, that is, <c>2^32-1</c>.
+ Since OTP 25, arbitrarily high integer values are accepted.</p>
+ </note>
</desc>
</func>
@@ -350,4 +360,3 @@ timer:cancel(R),
<seemfa marker="#cancel/1"><c>cancel/1</c></seemfa>.</p>
</section>
</erlref>
-
diff --git a/lib/stdlib/doc/src/uri_string.xml b/lib/stdlib/doc/src/uri_string.xml
index 4fe24e656f..08fc09e150 100644
--- a/lib/stdlib/doc/src/uri_string.xml
+++ b/lib/stdlib/doc/src/uri_string.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2017</year><year>2020</year>
+ <year>2017</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -84,9 +84,14 @@
<item>Dissecting form-urlencoded query strings into a list of key-value pairs<br></br>
<seemfa marker="#dissect_query/1"><c>dissect_query/1</c></seemfa>
</item>
- <item>Decoding percent-encoded triplets<br></br>
+ <item>Decoding percent-encoded triplets in URI map or a specific component of URI<br></br>
<seemfa marker="#percent_decode/1"><c>percent_decode/1</c></seemfa>
</item>
+ <item>Preparing and retrieving application specific data included in URI components<br></br>
+ <seemfa marker="#quote/1"><c>quote/1</c></seemfa>
+ <seemfa marker="#quote/2"><c>quote/2</c></seemfa>
+ <seemfa marker="#unquote/1"><c>unquote/1</c></seemfa>
+ </item>
</list>
<p>There are four different encodings present during the handling of URIs:</p>
<list type="bulleted">
@@ -110,6 +115,15 @@
character encoding and it is usually defined by the protocol or surrounding text. This library
takes the same assumption, binary and percent-encoding are handled as one configuration unit,
they cannot be set to different values.</p>
+ <p>Quoting functions are intended to be used by URI producing application
+ during component preparation or retrieval phase to avoid conflicts between
+ data and characters used in URI syntax. Quoting functions use percent
+ encoding, but with different rules than for example during execution of
+ <c>recompose/1</c>. It is user responsibility to provide quoting
+ functions with application data only and using their output to combine an
+ URI component.<br></br>Quoting functions can for instance be used for constructing a path
+ component with a segment containing '/' character which should not collide with
+ '/' used as general delimiter in path component.</p>
</description>
<datatypes>
@@ -358,6 +372,48 @@
</func>
<func>
+ <name name="quote" arity="1" since="OTP 25.0"/>
+ <fsummary>Percent encode characters out of unreserved set.</fsummary>
+ <desc>
+ <p>Replaces characters out of unreserved set with their percent encoded equivalents.</p>
+ <p>Unreserved characters defined in
+ <url href="https://www.ietf.org/rfc/rfc3986.txt">RFC 3986</url> are not quoted.</p>
+ <p><em>Example:</em></p>
+ <pre>
+1> <input><![CDATA[uri_string:quote("SomeId/04").]]></input>
+<![CDATA["SomeId%2F04"]]>
+2> <input><![CDATA[uri_string:quote(<<"SomeId/04">>).]]></input>
+<![CDATA[<<"SomeId%2F04">>]]>
+ </pre>
+
+ <warning><p>Function is not aware about any URI component context and
+ should not be used on whole URI. If applied more than once on the same
+ data, might produce unexpected results.</p></warning>
+ </desc>
+ </func>
+
+ <func>
+ <name name="quote" arity="2" since="OTP 25.0"/>
+ <fsummary>Percent encode characters out of unreserved set and user defined
+ safe list.</fsummary>
+ <desc>
+ <p>Same as <c>quote/1</c>, but <c><anno>Safe</anno></c> allows user to
+ provide a list of characters to be protected from encoding.</p>
+ <p><em>Example:</em></p>
+ <pre>
+1> <input><![CDATA[uri_string:quote("SomeId/04", "/").]]></input>
+<![CDATA["SomeId/04"]]>
+2> <input><![CDATA[uri_string:quote(<<"SomeId/04">>, "/").]]></input>
+<![CDATA[<<"SomeId/04">>]]>
+ </pre>
+
+ <warning><p>Function is not aware about any URI component context and
+ should not be used on whole URI. If applied more than once on the same
+ data, might produce unexpected results.</p></warning>
+ </desc>
+ </func>
+
+ <func>
<name name="recompose" arity="1" since="OTP 21.0"/>
<fsummary>Recompose URI.</fsummary>
<desc>
@@ -445,5 +501,24 @@
</desc>
</func>
+ <func>
+ <name name="unquote" arity="1" since="OTP 25.0"/>
+ <fsummary>Percent decode characters.</fsummary>
+ <desc>
+ <p>Percent decode characters.</p>
+
+ <p><em>Example:</em></p>
+ <pre>
+1> <input><![CDATA[uri_string:unquote("SomeId%2F04").]]></input>
+<![CDATA["SomeId/04"]]>
+2> <input><![CDATA[uri_string:unquote(<<"SomeId%2F04">>).]]></input>
+<![CDATA[<<"SomeId/04">>]]>
+ </pre>
+
+ <warning><p>Function is not aware about any URI component context and
+ should not be used on whole URI. If applied more than once on the same
+ data, might produce unexpected results.</p></warning>
+ </desc>
+ </func>
</funcs>
</erlref>
diff --git a/lib/stdlib/doc/src/uri_string_usage.xml b/lib/stdlib/doc/src/uri_string_usage.xml
index 72851096b7..31e2c23c45 100644
--- a/lib/stdlib/doc/src/uri_string_usage.xml
+++ b/lib/stdlib/doc/src/uri_string_usage.xml
@@ -4,8 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2020</year>
- <year>2020</year>
+ <year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -294,12 +293,14 @@
and it happens when converting a
<seetype marker="uri_string#uri_map"><c>uri_map()</c></seetype>
into a <seetype marker="uri_string#uri_string"><c>uri_string()</c></seetype>.
- There is no equivalent to a raw percent-encoding function as percent-encoding
- shall be applied on the component level using different sets of allowed characters.
- Applying percent-encoding directly on an input URI would not be safe just as in
+ Applying any percent-encoding directly on an input URI would not be safe just as in
the case of
<seemfa marker="uri_string#percent_decode/1"><c>uri_string:percent_decode/1</c></seemfa>,
the output could be an invalid URI.
+ Quoting functions allow users to perform raw percent encoding and decoding
+ on application data which cannot be handled automatically by
+ <c>uri_string:recompose/1</c>. For example in scenario when user would
+ need to use '/' or sub-delimeter as data rather than delimeter in a path component.
</p>
</note>
</section>
diff --git a/lib/stdlib/examples/Makefile b/lib/stdlib/examples/Makefile
index 743ea87179..cbef038500 100644
--- a/lib/stdlib/examples/Makefile
+++ b/lib/stdlib/examples/Makefile
@@ -29,7 +29,7 @@ include ../vsn.mk
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/stdlib/examples/erl_id_trans.erl b/lib/stdlib/examples/erl_id_trans.erl
index 292c06506a..d9d1154515 100644
--- a/lib/stdlib/examples/erl_id_trans.erl
+++ b/lib/stdlib/examples/erl_id_trans.erl
@@ -502,6 +502,17 @@ expr({'catch',Anno,E0}) ->
%% No new variables added.
E1 = expr(E0),
{'catch',Anno,E1};
+expr({'maybe',MaybeAnno,Es0}) ->
+ Es = exprs(Es0),
+ {'maybe',MaybeAnno,Es};
+expr({'maybe',MaybeAnno,Es0,{'else',ElseAnno,Cs0}}) ->
+ Es = exprs(Es0),
+ Cs = clauses(Cs0),
+ {'maybe',MaybeAnno,Es,{'else',ElseAnno,Cs}};
+expr({maybe_match,Anno,P0,E0}) ->
+ E = expr(E0),
+ P = pattern(P0),
+ {maybe_match,Anno,P,E};
expr({match,Anno,P0,E0}) ->
E1 = expr(E0),
P1 = pattern(P0),
diff --git a/lib/stdlib/scripts/generate_ryu_table.escript b/lib/stdlib/scripts/generate_ryu_table.escript
deleted file mode 100755
index dce203401c..0000000000
--- a/lib/stdlib/scripts/generate_ryu_table.escript
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/env escript
-%% -*- erlang -*-
-%%! +A0
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2017-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--mode(compile).
-
--define(MOD, "io_lib_format_ryu_table").
-
--define(TABLE_SIZE, 326).
--define(INV_TABLE_SIZE, 342).
-
--define(POW5_BITCOUNT, 125).
--define(POW5_INV_BITCOUNT, 125).
-
-main(_) ->
- Values = [ values(X) || X <- lists:seq(0, ?TABLE_SIZE - 1)],
- InvValues = [ inv_values(X) || X <- lists:seq(0, ?INV_TABLE_SIZE - 1)],
-
- %% Make module
- {ok, Out} = file:open("../src/" ++ ?MOD ++ ".erl", [write]),
- gen_file(Out, Values, InvValues),
- ok = file:close(Out),
- ok.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-inv_values(X) ->
- Pow = pow5(X),
- Pow5len = log2floor(Pow),
- J = Pow5len + ?POW5_INV_BITCOUNT - 1,
- Inv = ((1 bsl J) div Pow) + 1,
- {X, Inv}.
-
-values(X) ->
- Pow = pow5(X),
- Pow5len = log2floor(Pow),
- Pow5 = Pow bsr (Pow5len - ?POW5_BITCOUNT),
- {X, Pow5}.
-
-pow5(0) ->
- 1;
-pow5(1) ->
- 5;
-pow5(X) ->
- 5 * pow5(X - 1).
-
-log2floor(Int) when is_integer(Int), Int > 0 ->
- log2floor(Int, 0).
-
-log2floor(0, N) ->
- N;
-log2floor(Int, N) ->
- log2floor(Int bsr 1, 1 + N).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-gen_file(Fd, Values, InvValues) ->
- gen_header(Fd),
- gen_pow5_static(Fd),
- gen_table(Fd, Values),
- gen_inv_table(Fd, InvValues),
- ok.
-
-gen_header(Fd) ->
- io:put_chars(Fd, "%%\n%% this file is generated do not modify\n"),
- io:put_chars(Fd, "%% see ../script/generate_ryu_table.escript\n\n"),
- io:put_chars(Fd, "-module(" ++ ?MOD ++").\n"),
- io:put_chars(Fd, "-export([pow5_bitcount/0, pow5_inv_bitcount/0, value/1, inv_value/1]).\n\n"),
- ok.
-
-gen_pow5_static(Fd) ->
- io:put_chars(Fd, "-spec pow5_bitcount() -> integer().\n"),
- io:format(Fd, "pow5_bitcount() -> ~p.~n~n", [?POW5_BITCOUNT]),
- io:put_chars(Fd, "-spec pow5_inv_bitcount() -> integer().\n"),
- io:format(Fd, "pow5_inv_bitcount() -> ~p.~n~n", [?POW5_INV_BITCOUNT]),
- ok.
-
-gen_table(Fd, Values) ->
- io:put_chars(Fd, "-spec value(integer()) -> integer().\n"),
- [io:format(Fd, "value(~p) -> ~p;~n", [Key, Val]) || {Key,Val} <- Values],
- io:put_chars(Fd, "value(_) -> error(function_clause).\n\n"),
- ok.
-
-gen_inv_table(Fd, Values) ->
- io:put_chars(Fd, "-spec inv_value(integer()) -> integer().\n"),
- [io:format(Fd, "inv_value(~p) -> ~p;~n", [Key, Val]) || {Key,Val} <- Values],
- io:put_chars(Fd, "inv_value(_) -> error(function_clause).\n"),
- ok.
-
diff --git a/lib/stdlib/scripts/update_deprecations b/lib/stdlib/scripts/update_deprecations
index ef6be3b5af..3c0d5ae3f9 100755
--- a/lib/stdlib/scripts/update_deprecations
+++ b/lib/stdlib/scripts/update_deprecations
@@ -4,7 +4,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -238,12 +238,10 @@ make_xml(Top, Type, OutFile, InfoText0) ->
Collected = make_xml_collect(Depr, RelKey, InfoTextMap, []),
All = make_xml_gen(lists:reverse(Collected), Type, OutDir),
- file:write_file(OutFile, All),
-
- ok.
+ ok = file:write_file(OutFile, All).
make_xml_info([{Tag,M,F,A,Text} | Attributes], Tag) ->
- [{{M,F,A}, Text} | make_xml_info(Attributes, Tag)];
+ [{{M,F,A}, info_string(Text)} | make_xml_info(Attributes, Tag)];
make_xml_info([_ | Attributes], Tag) ->
make_xml_info(Attributes, Tag);
make_xml_info([], _Tag) ->
diff --git a/lib/stdlib/src/Makefile b/lib/stdlib/src/Makefile
index 509648cb2b..b7b5ead962 100644
--- a/lib/stdlib/src/Makefile
+++ b/lib/stdlib/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2020. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -65,6 +65,7 @@ MODULES= \
erl_error \
erl_eval \
erl_expand_records \
+ erl_features \
erl_internal \
erl_lint \
erl_parse \
@@ -91,7 +92,6 @@ MODULES= \
io \
io_lib \
io_lib_format \
- io_lib_format_ryu_table \
io_lib_fread \
io_lib_pretty \
lists \
@@ -103,6 +103,7 @@ MODULES= \
orddict \
ordsets \
re \
+ peer \
pool \
proc_lib \
proplists \
@@ -169,7 +170,7 @@ ERL_COMPILE_FLAGS += -I../include -I../../kernel/include
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
clean:
rm -f $(TARGET_FILES)
diff --git a/lib/stdlib/src/beam_lib.erl b/lib/stdlib/src/beam_lib.erl
index 438d76e47f..c00edd9904 100644
--- a/lib/stdlib/src/beam_lib.erl
+++ b/lib/stdlib/src/beam_lib.erl
@@ -1150,11 +1150,12 @@ terminate(_Reason, _State) ->
ok.
crypto_key_fun_from_file() ->
+ UserConfig = filename:basedir(user_config,"erlang"),
case init:get_argument(home) of
{ok,[[Home]]} ->
- crypto_key_fun_from_file_1([".",Home]);
+ crypto_key_fun_from_file_1([".", Home, UserConfig]);
_ ->
- crypto_key_fun_from_file_1(["."])
+ crypto_key_fun_from_file_1([".", UserConfig])
end.
crypto_key_fun_from_file_1(Path) ->
diff --git a/lib/stdlib/src/c.erl b/lib/stdlib/src/c.erl
index 01b70f7f6a..88573d1df1 100644
--- a/lib/stdlib/src/c.erl
+++ b/lib/stdlib/src/c.erl
@@ -793,9 +793,10 @@ lm() ->
erlangrc() ->
case init:get_argument(home) of
- {ok,[[Home]]} ->
- erlangrc([Home]);
- _ ->
+ {ok,[[Home]]} ->
+ UserConfig = filename:basedir(user_config,"erlang"),
+ erlangrc([Home, UserConfig]);
+ _ ->
{error, enoent}
end.
diff --git a/lib/stdlib/src/calendar.erl b/lib/stdlib/src/calendar.erl
index 2f95f54312..cddb25f55d 100644
--- a/lib/stdlib/src/calendar.erl
+++ b/lib/stdlib/src/calendar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -94,11 +94,11 @@
-type yearweeknum() :: {year(),weeknum()}.
-type rfc3339_string() :: [byte(), ...].
-%% By design 'native' is not supported:
-type rfc3339_time_unit() :: 'microsecond'
| 'millisecond'
| 'nanosecond'
- | 'second'.
+ | 'second'
+ | 'native'.
%%----------------------------------------------------------------------
@@ -326,7 +326,7 @@ local_time_to_universal_time_dst(DateTime) ->
-spec now_to_datetime(Now) -> datetime1970() when
Now :: erlang:timestamp().
now_to_datetime({MSec, Sec, _uSec}) ->
- system_time_to_datetime(MSec*1000000 + Sec).
+ system_time_to_datetime(MSec*1_000_000 + Sec).
-spec now_to_universal_time(Now) -> datetime1970() when
Now :: erlang:timestamp().
@@ -444,7 +444,23 @@ system_time_to_rfc3339(Time) ->
system_time_to_rfc3339(Time, Options) ->
Unit = proplists:get_value(unit, Options, second),
- OffsetOption = proplists:get_value(offset, Options, ""),
+ OffsetOpt0 = proplists:get_value(offset, Options, ""),
+ case Unit of
+ native ->
+ TimeMS = erlang:convert_time_unit(Time, native, millisecond),
+ OffsetOpt1 =
+ if is_integer(OffsetOpt0) ->
+ erlang:convert_time_unit(OffsetOpt0, native,
+ millisecond);
+ true ->
+ OffsetOpt0
+ end,
+ system_time_to_rfc3339_do(TimeMS, Options, millisecond, OffsetOpt1);
+ _ ->
+ system_time_to_rfc3339_do(Time, Options, Unit, OffsetOpt0)
+ end.
+
+system_time_to_rfc3339_do(Time, Options, Unit, OffsetOption) ->
T = proplists:get_value(time_designator, Options, $T),
AdjustmentSecs = offset_adjustment(Time, Unit, OffsetOption),
Offset = offset(OffsetOption, AdjustmentSecs),
@@ -738,12 +754,13 @@ copy_sign(N1, _N2) -> N1.
factor(second) -> 1;
factor(millisecond) -> 1000;
-factor(microsecond) -> 1000000;
-factor(nanosecond) -> 1000000000.
+factor(microsecond) -> 1_000_000;
+factor(nanosecond) -> 1_000_000_000;
+factor(native) -> erlang:convert_time_unit(1, second, native).
log10(1000) -> 3;
-log10(1000000) -> 6;
-log10(1000000000) -> 9.
+log10(1_000_000) -> 6;
+log10(1_000_000_000) -> 9.
pad(0, S) ->
S;
diff --git a/lib/stdlib/src/dets.erl b/lib/stdlib/src/dets.erl
index 0488c2bef2..640ad7a81c 100644
--- a/lib/stdlib/src/dets.erl
+++ b/lib/stdlib/src/dets.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -149,7 +149,7 @@
proc :: 'undefined' | pid(), % the pid of the Dets process
match_program :: 'true'
| 'undefined'
- | {'match_spec', ets:comp_match_spec()}
+ | {'match_spec', ets:compiled_match_spec()}
}).
-record(open_args, {
@@ -321,7 +321,7 @@ foldl(Fun, Acc, Tab) ->
-spec from_ets(Name, EtsTab) -> 'ok' | {'error', Reason} when
Name :: tab_name(),
- EtsTab :: ets:tab(),
+ EtsTab :: ets:table(),
Reason :: term().
from_ets(DTab, ETab) ->
@@ -861,7 +861,7 @@ table_info(_Tab, _) ->
-spec to_ets(Name, EtsTab) -> EtsTab | {'error', Reason} when
Name :: tab_name(),
- EtsTab :: ets:tab(),
+ EtsTab :: ets:table(),
Reason :: term().
to_ets(DTab, ETab) ->
diff --git a/lib/stdlib/src/digraph.erl b/lib/stdlib/src/digraph.erl
index 6f9bbcd2bd..797839ac4e 100644
--- a/lib/stdlib/src/digraph.erl
+++ b/lib/stdlib/src/digraph.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -39,9 +39,9 @@
-export_type([graph/0, d_type/0, vertex/0, edge/0, label/0]).
--record(digraph, {vtab = notable :: ets:tab(),
- etab = notable :: ets:tab(),
- ntab = notable :: ets:tab(),
+-record(digraph, {vtab = notable :: ets:table(),
+ etab = notable :: ets:table(),
+ ntab = notable :: ets:table(),
cyclic = true :: boolean()}).
-opaque graph() :: #digraph{}.
diff --git a/lib/stdlib/src/epp.erl b/lib/stdlib/src/epp.erl
index 53b91530c5..1c2dbcb3bb 100644
--- a/lib/stdlib/src/epp.erl
+++ b/lib/stdlib/src/epp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -72,7 +72,11 @@
uses = #{} %Macro use structure
:: #{name() => [{argspec(), [used()]}]},
default_encoding = ?DEFAULT_ENCODING :: source_encoding(),
- pre_opened = false :: boolean(),
+ pre_opened = false :: boolean(),
+ in_prefix = true :: boolean(),
+ erl_scan_opts = [] :: [_],
+ features = [] :: [atom()],
+ else_reserved = false :: boolean(),
fname = [] :: function_name_type()
}).
@@ -131,12 +135,14 @@ open(Options) ->
Name ->
Self = self(),
Epp = spawn(fun() -> server(Self, Name, Options) end),
+ Extra = proplists:get_bool(extra, Options),
case epp_request(Epp) of
- {ok, Pid, Encoding} ->
- case proplists:get_bool(extra, Options) of
- true -> {ok, Pid, [{encoding, Encoding}]};
- false -> {ok, Pid}
- end;
+ {ok, Pid, Encoding} when Extra ->
+ {ok, Pid, [{encoding, Encoding}]};
+ {ok, Pid, _} ->
+ {ok, Pid};
+ {ok, Pid} when Extra ->
+ {ok, Pid, []};
Other ->
Other
end
@@ -239,6 +245,8 @@ format_error({error,Term}) ->
io_lib:format("-error(~tp).", [Term]);
format_error({warning,Term}) ->
io_lib:format("-warning(~tp).", [Term]);
+format_error(ftr_after_prefix) ->
+ "feature directive not allowed after anything interesting";
format_error(E) -> file:format_error(E).
-spec scan_file(FileName, Options) ->
@@ -297,6 +305,8 @@ parse_file(Ifile, Path, Predefs) ->
{'macros', PredefMacros :: macros()} |
{'default_encoding', DefEncoding :: source_encoding()} |
{'location',StartLocation :: erl_anno:location()} |
+ {'reserved_word_fun', Fun :: fun((atom()) -> boolean())} |
+ {'features', [Feature :: atom()]} |
'extra'],
Form :: erl_parse:abstract_form()
| {'error', ErrorInfo}
@@ -311,11 +321,13 @@ parse_file(Ifile, Options) ->
{ok,Epp} ->
Forms = parse_file(Epp),
close(Epp),
- {ok,Forms};
+ {ok, Forms};
{ok,Epp,Extra} ->
Forms = parse_file(Epp),
+ Epp ! {get_features, self()},
+ Ftrs = receive X -> X end,
close(Epp),
- {ok,Forms,Extra};
+ {ok, Forms, [{features, Ftrs} | Extra]};
{error,E} ->
{error,E}
end.
@@ -593,7 +605,8 @@ server(Pid, Name, Options) ->
init_server(Pid, FileName, Options, St0) ->
SourceName = proplists:get_value(source_name, Options, FileName),
Pdm = proplists:get_value(macros, Options, []),
- Ms0 = predef_macros(SourceName),
+ Features = proplists:get_value(features, Options, []),
+ Ms0 = predef_macros(SourceName, Features),
case user_predef(Pdm, Ms0) of
{ok,Ms1} ->
DefEncoding = proplists:get_value(default_encoding, Options,
@@ -604,11 +617,19 @@ init_server(Pid, FileName, Options, St0) ->
%% first in path
Path = [filename:dirname(FileName) |
proplists:get_value(includes, Options, [])],
+ ResWordFun =
+ proplists:get_value(reserved_word_fun, Options,
+ fun erl_scan:f_reserved_word/1),
%% the default location is 1 for backwards compatibility, not {1,1}
AtLocation = proplists:get_value(location, Options, 1),
+
St = St0#epp{delta=0, name=SourceName, name2=SourceName,
path=Path, location=AtLocation, macs=Ms1,
- default_encoding=DefEncoding},
+ default_encoding=DefEncoding,
+ erl_scan_opts =
+ [{reserved_word_fun, ResWordFun}],
+ features = Features,
+ else_reserved = ResWordFun('else')},
From = wait_request(St),
Anno = erl_anno:new(AtLocation),
enter_file_reply(From, file_name(SourceName), Anno,
@@ -622,10 +643,11 @@ init_server(Pid, FileName, Options, St0) ->
%% Initialise the macro dictionary with the default predefined macros,
%% FILE, LINE, MODULE as undefined, MACHINE and MACHINE value.
-predef_macros(File) ->
+predef_macros(File, EnabledFeatures) ->
Machine = list_to_atom(erlang:system_info(machine)),
Anno = line1(),
OtpVersion = list_to_integer(erlang:system_info(otp_release)),
+ AvailableFeatures = erl_features:features(),
Defs = [{'FILE', {none,[{string,Anno,File}]}},
{'FUNCTION_NAME', undefined},
{'FUNCTION_ARITY', undefined},
@@ -636,10 +658,38 @@ predef_macros(File) ->
{'BASE_MODULE_STRING', undefined},
{'MACHINE', {none,[{atom,Anno,Machine}]}},
{Machine, {none,[{atom,Anno,true}]}},
- {'OTP_RELEASE', {none,[{integer,Anno,OtpVersion}]}}
+ {'OTP_RELEASE', {none,[{integer,Anno,OtpVersion}]}},
+ %% FIXME Understand this has to be a list. Is it because
+ %% it takes an argument?
+ {'FEATURE_AVAILABLE', [ftr_macro(AvailableFeatures)]},
+ {'FEATURE_ENABLED', [ftr_macro(EnabledFeatures)]}
],
maps:from_list(Defs).
+%% Make macro definition from a list of features. The macro takes one
+%% argument and returns true when argument is available as a feature.
+ftr_macro(Features) ->
+ Anno = line1(),
+ Arg = 'X',
+ Fexp = fun(Ftr) -> [{'(', Anno},
+ {var, Anno, Arg},
+ {')', Anno},
+ {'==', Anno},
+ {atom, Anno, Ftr}]
+ end,
+ Body =
+ case Features of
+ [] -> [{atom, Anno, false}];
+ [Ftr| Ftrs] ->
+ [{'(', Anno}|
+ lists:foldl(fun(F, Expr) ->
+ Fexp(F) ++ [{'orelse', Anno} | Expr]
+ end,
+ Fexp(Ftr) ++ [{')', Anno}],
+ Ftrs)]
+ end,
+ {1, {[Arg], Body}}.
+
%% user_predef(PreDefMacros, Macros) ->
%% {ok,MacroDict} | {error,E}
%% Add the predefined macros to the macros dictionary. A macro without a
@@ -674,6 +724,9 @@ user_predef([], Ms) -> {ok,Ms}.
wait_request(St) ->
receive
{epp_request,From,scan_erl_form} -> From;
+ {get_features, From} ->
+ From ! St#epp.features,
+ wait_request(St);
{epp_request,From,macro_defs} ->
%% Return the old format to avoid any incompability issues.
Defs = [{{atom,K},V} || {K,V} <- maps:to_list(St#epp.macs)],
@@ -730,7 +783,11 @@ enter_file2(NewF, Pname, From, St0, AtLocation) ->
Anno = erl_anno:new(AtLocation),
enter_file_reply(From, Pname, Anno, AtLocation, code),
#epp{macs = Ms0,
- default_encoding = DefEncoding} = St0,
+ default_encoding = DefEncoding,
+ in_prefix = InPrefix,
+ erl_scan_opts = ScanOpts,
+ else_reserved = ElseReserved,
+ features = Ftrs} = St0,
Ms = Ms0#{'FILE':={none,[{string,Anno,Pname}]}},
%% update the head of the include path to be the directory of the new
%% source file, so that an included file can always include other files
@@ -742,6 +799,10 @@ enter_file2(NewF, Pname, From, St0, AtLocation) ->
_ = set_encoding(NewF, DefEncoding),
#epp{file=NewF,location=AtLocation,name=Pname,name2=Pname,delta=0,
sstk=[St0|St0#epp.sstk],path=Path,macs=Ms,
+ in_prefix = InPrefix,
+ features = Ftrs,
+ erl_scan_opts = ScanOpts,
+ else_reserved = ElseReserved,
default_encoding=DefEncoding}.
enter_file_reply(From, Name, LocationAnno, AtLocation, Where) ->
@@ -783,8 +844,16 @@ leave_file(From, St) ->
CurrLoc = add_line(OldLoc, Delta),
Anno = erl_anno:new(CurrLoc),
Ms0 = St#epp.macs,
+ InPrefix = St#epp.in_prefix,
+ Ftrs = St#epp.features,
+ ElseReserved = St#epp.else_reserved,
+ ScanOpts = St#epp.erl_scan_opts,
Ms = Ms0#{'FILE':={none,[{string,Anno,OldName2}]}},
- NextSt = OldSt#epp{sstk=Sts,macs=Ms,uses=St#epp.uses},
+ NextSt = OldSt#epp{sstk=Sts,macs=Ms,uses=St#epp.uses,
+ in_prefix = InPrefix,
+ features = Ftrs,
+ else_reserved = ElseReserved,
+ erl_scan_opts = ScanOpts},
enter_file_reply(From, OldName, Anno, CurrLoc, code),
case OldName2 =:= OldName of
true ->
@@ -806,27 +875,30 @@ leave_file(From, St) ->
%% scan_toks(Tokens, From, EppState)
scan_toks(From, St) ->
- case io:scan_erl_form(St#epp.file, '', St#epp.location) of
- {ok,Toks,Cl} ->
- scan_toks(Toks, From, St#epp{location=Cl});
- {error,E,Cl} ->
- epp_reply(From, {error,E}),
- wait_req_scan(St#epp{location=Cl});
- {eof,Cl} ->
- leave_file(From, St#epp{location=Cl});
- {error,_E} ->
+ #epp{file = File, location = Loc, erl_scan_opts = ScanOpts} = St,
+ case io:scan_erl_form(File, '', Loc, ScanOpts) of
+ {ok,Toks,Cl} ->
+ scan_toks(Toks, From, St#epp{location=Cl});
+ {error,E,Cl} ->
+ epp_reply(From, {error,E}),
+ wait_req_scan(St#epp{location=Cl});
+ {eof,Cl} ->
+ leave_file(From, St#epp{location=Cl});
+ {error,_E} ->
epp_reply(From, {error,{St#epp.location,epp,cannot_parse}}),
- leave_file(wait_request(St), St) %This serious, just exit!
+ leave_file(wait_request(St), St) %This serious, just exit!
end.
+scan_toks([{'-',_Lh},{atom,_Ld,feature}=Feature|Toks], From, St) ->
+ scan_feature(Toks, Feature, From, St);
scan_toks([{'-',_Lh},{atom,_Ld,define}=Define|Toks], From, St) ->
scan_define(Toks, Define, From, St);
scan_toks([{'-',_Lh},{atom,_Ld,undef}=Undef|Toks], From, St) ->
- scan_undef(Toks, Undef, From, St);
+ scan_undef(Toks, Undef, From, leave_prefix(St));
scan_toks([{'-',_Lh},{atom,_Ld,error}=Error|Toks], From, St) ->
- scan_err_warn(Toks, Error, From, St);
+ scan_err_warn(Toks, Error, From, leave_prefix(St));
scan_toks([{'-',_Lh},{atom,_Ld,warning}=Warn|Toks], From, St) ->
- scan_err_warn(Toks, Warn, From, St);
+ scan_err_warn(Toks, Warn, From, leave_prefix(St));
scan_toks([{'-',_Lh},{atom,_Li,include}=Inc|Toks], From, St) ->
scan_include(Toks, Inc, From, St);
scan_toks([{'-',_Lh},{atom,_Li,include_lib}=IncLib|Toks], From, St) ->
@@ -837,6 +909,10 @@ scan_toks([{'-',_Lh},{atom,_Li,ifndef}=IfnDef|Toks], From, St) ->
scan_ifndef(Toks, IfnDef, From, St);
scan_toks([{'-',_Lh},{atom,_Le,'else'}=Else|Toks], From, St) ->
scan_else(Toks, Else, From, St);
+%% conditionally allow else as a keyword
+scan_toks([{'-',_Lh},{'else',_Le}=Else|Toks], From, St)
+ when St#epp.else_reserved ->
+ scan_else(Toks, Else, From, St);
scan_toks([{'-',_Lh},{'if',_Le}=If|Toks], From, St) ->
scan_if(Toks, If, From, St);
scan_toks([{'-',_Lh},{atom,_Le,elif}=Elif|Toks], From, St) ->
@@ -854,13 +930,37 @@ scan_toks([{'-',_Lh},{atom,_Lf,file}=FileToken|Toks0], From, St) ->
scan_toks(Toks0, From, St) ->
case catch expand_macros(Toks0, St#epp{fname=Toks0}) of
Toks1 when is_list(Toks1) ->
+ InPrefix =
+ St#epp.in_prefix
+ andalso case Toks1 of
+ [] -> true;
+ [{'-', _Loc}, Tok | _] ->
+ in_prefix(Tok);
+ _ ->
+ false
+ end,
epp_reply(From, {ok,Toks1}),
- wait_req_scan(St#epp{macs=scan_module(Toks1, St#epp.macs)});
+ wait_req_scan(St#epp{in_prefix = InPrefix,
+ macs=scan_module(Toks1, St#epp.macs)});
{error,ErrL,What} ->
epp_reply(From, {error,{ErrL,epp,What}}),
wait_req_scan(St)
end.
+%% Determine whether we have passed the prefix where a -feature
+%% directive is allowed.
+in_prefix({atom, _, Atom}) ->
+ %% These directives are allowed inside the prefix
+ lists:member(Atom, ['module', 'feature',
+ 'if', 'else', 'elif', 'endif', 'ifdef', 'ifndef',
+ 'define', 'undef',
+ 'include', 'include_lib']);
+in_prefix(_T) ->
+ false.
+
+leave_prefix(#epp{} = St) ->
+ St#epp{in_prefix = false}.
+
scan_module([{'-',_Ah},{atom,_Am,module},{'(',_Al}|Ts], Ms) ->
scan_module_1(Ts, Ms);
scan_module([{'-',_Ah},{atom,_Am,extends},{'(',_Al}|Ts], Ms) ->
@@ -901,6 +1001,58 @@ scan_err_warn(Toks, {atom,_,Tag}=Token, From, St) ->
epp_reply(From, {error,{loc(T),epp,{bad,Tag}}}),
wait_req_scan(St).
+%% scan a feature directive
+scan_feature([{'(', _Ap}, {atom, _Am, Ind},
+ {',', _}, {atom, _, Ftr}, {')', _}, {dot, _}],
+ Feature, From, St)
+ when St#epp.in_prefix,
+ (Ind =:= enable
+ orelse Ind =:= disable) ->
+ case update_features(St, Ind, Ftr, loc(Feature)) of
+ {ok, St1} ->
+ scan_toks(From, St1);
+ {error, {{Mod, Reason}, ErrLoc}} ->
+ epp_reply(From, {error, {ErrLoc, Mod, Reason}}),
+ wait_req_scan(St)
+ end;
+scan_feature([{'(', _Ap}, {atom, _Am, _Ind},
+ {',', _}, {atom, _, _Ftr}, {')', _}, {dot, _}| _Toks],
+ Feature, From, St) when not St#epp.in_prefix ->
+ epp_reply(From, {error, {loc(Feature), epp,
+ ftr_after_prefix}}),
+ wait_req_scan(St);
+scan_feature(Toks, {atom, _, Tag} = Token, From, St) ->
+ T = no_match(Toks, Token),
+ epp_reply(From, {error,{loc(T),epp,{bad,Tag}}}),
+ wait_req_scan(St).
+
+%% FIXME Rewrite this
+update_features(St0, Ind, Ftr, Loc) ->
+ Ftrs0 = St0#epp.features,
+ ScanOpts = St0#epp.erl_scan_opts,
+ KeywordFun =
+ case proplists:get_value(reserved_word_fun, ScanOpts) of
+ undefined -> fun erl_scan:f_reserved_word/1;
+ Fun -> Fun
+ end,
+ case erl_features:keyword_fun(Ind, Ftr, Ftrs0, KeywordFun) of
+ {error, Reason} ->
+ {error, {Reason, Loc}};
+ {ok, ResWordFun1, Ftrs1} ->
+ Macs0 = St0#epp.macs,
+ Macs1 = Macs0#{'FEATURE_ENABLED' => [ftr_macro(Ftrs1)]},
+ %% ?liof("ok!\n", []),
+ %% FIXME WE need to keep any other scan_opts
+ %% present. Right now, there are no other, but
+ %% that might change.
+ StX = St0#epp{erl_scan_opts =
+ [{reserved_word_fun, ResWordFun1}],
+ features = Ftrs1,
+ else_reserved = ResWordFun1('else'),
+ macs = Macs1},
+ {ok, StX}
+ end.
+
%% scan_define(Tokens, DefineToken, From, EppState)
scan_define([{'(',_Ap},{Type,_Am,_}=Mac|Toks], Def, From, St)
@@ -1320,7 +1472,8 @@ new_location(Ln, {Le,_}, {Lf,_}) ->
%% nested conditionals and repeated 'else's.
skip_toks(From, St, [I|Sis]) ->
- case io:scan_erl_form(St#epp.file, '', St#epp.location) of
+ ElseReserved = St#epp.else_reserved,
+ case io:scan_erl_form(St#epp.file, '', St#epp.location, St#epp.erl_scan_opts) of
{ok,[{'-',_Ah},{atom,_Ai,ifdef}|_Toks],Cl} ->
skip_toks(From, St#epp{location=Cl}, [ifdef,I|Sis]);
{ok,[{'-',_Ah},{atom,_Ai,ifndef}|_Toks],Cl} ->
@@ -1329,6 +1482,9 @@ skip_toks(From, St, [I|Sis]) ->
skip_toks(From, St#epp{location=Cl}, ['if',I|Sis]);
{ok,[{'-',_Ah},{atom,_Ae,'else'}=Else|_Toks],Cl}->
skip_else(Else, From, St#epp{location=Cl}, [I|Sis]);
+ %% conditionally allow else as reserved word
+ {ok,[{'-',_Ah},{'else',_Ae}=Else|_Toks],Cl} when ElseReserved ->
+ skip_else(Else, From, St#epp{location=Cl}, [I|Sis]);
{ok,[{'-',_Ah},{atom,_Ae,'elif'}=Elif|Toks],Cl}->
skip_elif(Toks, Elif, From, St#epp{location=Cl}, [I|Sis]);
{ok,[{'-',_Ah},{atom,_Ae,endif}|_Toks],Cl} ->
diff --git a/lib/stdlib/src/erl_compile.erl b/lib/stdlib/src/erl_compile.erl
index 9701f77292..87af230c67 100644
--- a/lib/stdlib/src/erl_compile.erl
+++ b/lib/stdlib/src/erl_compile.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,7 +55,8 @@ compile_cmdline() ->
compile_cmdline1(List).
%% Run a compilation. Meant to be used by the compilation server.
--spec compile(list(), file:filename()) -> 'ok' | {'error', binary()}.
+-spec compile(list(), file:filename()) ->
+ 'ok' | {'error', binary()} | {'crash', {atom(), term(), term()}}.
compile(Args, Cwd) ->
try compile1(Args, #options{outdir=Cwd,cwd=Cwd}) of
ok ->
@@ -108,6 +109,9 @@ compile1(Files, Opts) ->
parse_generic_option("b"++Opt, T0, Opts) ->
{OutputType,T} = get_option("b", Opt, T0),
compile1(T, Opts#options{output_type=list_to_atom(OutputType)});
+%% parse_generic_option("c"++Opt, T0, Opts) ->
+%% {InputType,T} = get_option("c", Opt, T0),
+%% compile1(T, Opts#options{input_type=[$.| InputType]});
parse_generic_option("D"++Opt, T0, #options{defines=Defs}=Opts) ->
{Val0,T} = get_option("D", Opt, T0),
{Key0,Val1} = split_at_equals(Val0, []),
@@ -170,6 +174,25 @@ parse_generic_option("P", T, #options{specific=Spec}=Opts) ->
compile1(T, Opts#options{specific=['P'|Spec]});
parse_generic_option("S", T, #options{specific=Spec}=Opts) ->
compile1(T, Opts#options{specific=['S'|Spec]});
+parse_generic_option("enable-feature" ++ Str, T0,
+ #options{specific = Spec} = Opts) ->
+ {FtrStr, T} = get_option("enable-feature", Str, T0),
+ Feature = list_to_atom(FtrStr),
+ compile1(T, Opts#options{
+ specific = Spec ++ [{enable_feature, Feature}]});
+parse_generic_option("disable-feature" ++ Str, T0,
+ #options{specific = Spec} = Opts) ->
+ {FtrStr, T} = get_option("disable-feature", Str, T0),
+ Feature = list_to_atom(FtrStr),
+ compile1(T, Opts#options{specific = Spec ++ [{disable_feature, Feature}]});
+parse_generic_option("describe-feature" ++ Str, T0,
+ #options{specific = Spec} = Opts) ->
+ {FtrStr, T} = get_option("disable-feature", Str, T0),
+ Feature = list_to_atom(FtrStr),
+ compile1(T, Opts#options{specific =[{describe_feature, Feature}| Spec]});
+parse_generic_option("list-features", T,
+ #options{specific = Spec} = Opts) ->
+ compile1(T, Opts#options{specific =[{list_features, true}| Spec]});
parse_generic_option(Option, _T, _Opts) ->
usage(io_lib:format("Unknown option: -~ts\n", [Option])).
@@ -229,11 +252,24 @@ usage(Error) ->
{"-E","generate listing of expanded code (Erlang compiler)"},
{"-S","generate assembly listing (Erlang compiler)"},
{"-P","generate listing of preprocessed code (Erlang compiler)"},
+ {"-enable-feature <feature>",
+ "enable <feature> when compiling (Erlang compiler)"},
+ {"-disable-feature <feature>",
+ "disable <feature> when compiling (Erlang compiler)"},
+ {"-list-features",
+ "list short descriptions of available feature (Erlang compiler)"},
+ {"-describe-feature <feature>",
+ "show long description of <feature>"},
{"+term","pass the Erlang term unchanged to the compiler"}],
+ Fmt = fun(K, D) when length(K) < 15 ->
+ io_lib:format("~-14s ~s\n", [K, D]);
+ (K, D) ->
+ io_lib:format("~s\n~-14s ~s\n", [K, "", D])
+ end,
Msg = [Error,
"Usage: erlc [Options] file.ext ...\n",
"Options:\n",
- [io_lib:format("~-14s ~s\n", [K,D]) || {K,D} <- H]],
+ [Fmt(K, D) || {K,D} <- H]],
throw({error, Msg}).
get_option(_Name, [], [[C|_]=Option|T]) when C =/= $- ->
@@ -251,14 +287,19 @@ split_at_equals([], Acc) ->
{lists:reverse(Acc),[]}.
compile2(Files, #options{cwd=Cwd,includes=Incl,outfile=Outfile}=Opts0) ->
- Opts = Opts0#options{includes=lists:reverse(Incl)},
- case {Outfile,length(Files)} of
- {"", _} ->
- compile3(Files, Cwd, Opts);
- {[_|_], 1} ->
- compile3(Files, Cwd, Opts);
- {[_|_], _N} ->
- throw({error, "Output file name given, but more than one input file.\n"})
+ case show_info(Opts0) of
+ {ok, Msg} ->
+ throw({error, Msg});
+ false ->
+ Opts = Opts0#options{includes=lists:reverse(Incl)},
+ case {Outfile,length(Files)} of
+ {"", _} ->
+ compile3(Files, Cwd, Opts);
+ {[_|_], 1} ->
+ compile3(Files, Cwd, Opts);
+ {[_|_], _N} ->
+ throw({error, "Output file name given, but more than one input file.\n"})
+ end
end.
%% Compile the list of files, until done or compilation fails.
@@ -277,6 +318,28 @@ compile3([File|Rest], Cwd, Options) ->
compile3(Rest, Cwd, Options);
compile3([], _Cwd, _Options) -> ok.
+show_info(#options{specific = Spec}) ->
+ G = fun G0([]) -> undefined;
+ G0([E|Es]) ->
+ case proplists:get_value(E, Spec) of
+ undefined -> G0(Es);
+ V -> {E, V}
+ end
+ end,
+
+ case G([list_features, describe_feature]) of
+ {list_features, true} ->
+ Features = erl_features:features(),
+ Msg = ["Available features:\n",
+ [io_lib:format(" ~-13s ~s\n", [Ftr, erl_features:short(Ftr)])
+ || Ftr <- Features]],
+ {ok, Msg};
+ {describe_feature, Ftr} ->
+ {ok, erl_features:long(Ftr)};
+ _ ->
+ false
+ end.
+
%% Invoke the appropriate compiler, depending on the file extension.
compile_file("", Input, _Output, _Options) ->
throw({error, io_lib:format("File has no extension: ~ts~n", [Input])});
diff --git a/lib/stdlib/src/erl_error.erl b/lib/stdlib/src/erl_error.erl
index 7d5d9d8ae7..788e61ae10 100644
--- a/lib/stdlib/src/erl_error.erl
+++ b/lib/stdlib/src/erl_error.erl
@@ -269,6 +269,8 @@ explain_reason(restricted_shell_started, exit, [], _PF, _S, _Enc, _CL) ->
<<"restricted shell starts now">>;
explain_reason(restricted_shell_stopped, exit, [], _PF, _S, _Enc, _CL) ->
<<"restricted shell stopped">>;
+explain_reason(calling_self, exit, [], _PF, _S, _Enc, _CL) ->
+ <<"the current process attempted to call itself">>;
%% Other exit code:
explain_reason(Reason, Class, [], PF, S, _Enc, CL) ->
{L, _} = PF(Reason, (iolist_size(S)+1) + exited_size(Class), CL),
diff --git a/lib/stdlib/src/erl_eval.erl b/lib/stdlib/src/erl_eval.erl
index df2e6a25a1..987ba0cf0a 100644
--- a/lib/stdlib/src/erl_eval.erl
+++ b/lib/stdlib/src/erl_eval.erl
@@ -24,8 +24,7 @@
-export([exprs/2,exprs/3,exprs/4,expr/2,expr/3,expr/4,expr/5,
expr_list/2,expr_list/3,expr_list/4]).
-export([new_bindings/0,bindings/1,binding/2,add_binding/3,del_binding/2]).
--export([extended_parse_exprs/1, extended_parse_term/1,
- subst_values_for_vars/2]).
+-export([extended_parse_exprs/1, extended_parse_term/1]).
-export([is_constant_expr/1, partial_eval/1, eval_str/1]).
%% Is used by standalone Erlang (escript).
@@ -62,14 +61,17 @@
-type(func_spec() :: {Module :: module(), Function :: atom()} | function()).
-type(nlfun_handler() :: fun((FuncSpec :: func_spec(),
- Arguments :: [term()]) ->
- term())).
+ Arguments :: [term()]) -> term())
+ | fun((Anno :: erl_anno:anno(), FuncSpec :: func_spec(),
+ Arguments :: [term()]) -> term())).
-type(non_local_function_handler() :: {value, nlfun_handler()}
| none).
-define(STACKTRACE,
element(2, erlang:process_info(self(), current_stacktrace))).
+empty_fun_used_vars() -> #{}.
+
%% exprs(ExpressionSeq, Bindings)
%% exprs(ExpressionSeq, Bindings, LocalFuncHandler)
%% exprs(ExpressionSeq, Bindings, LocalFuncHandler, ExternalFuncHandler)
@@ -88,8 +90,8 @@
NewBindings :: binding_struct()).
exprs(Exprs, Bs) ->
case check_command(Exprs, Bs) of
- ok ->
- exprs(Exprs, Bs, none, none, none);
+ ok ->
+ exprs(Exprs, Bs, none, none, none, empty_fun_used_vars());
{error,{_Location,_Mod,Error}} ->
erlang:raise(error, Error, ?STACKTRACE)
end.
@@ -102,7 +104,7 @@ exprs(Exprs, Bs) ->
Value :: value(),
NewBindings :: binding_struct()).
exprs(Exprs, Bs, Lf) ->
- exprs(Exprs, Bs, Lf, none, none).
+ exprs(Exprs, Bs, Lf, none, none, empty_fun_used_vars()).
-spec(exprs(Expressions, Bindings, LocalFunctionHandler,
NonLocalFunctionHandler) ->
@@ -114,14 +116,51 @@ exprs(Exprs, Bs, Lf) ->
Value :: value(),
NewBindings :: binding_struct()).
exprs(Exprs, Bs, Lf, Ef) ->
- exprs(Exprs, Bs, Lf, Ef, none).
+ exprs(Exprs, Bs, Lf, Ef, none, empty_fun_used_vars()).
-exprs([E], Bs0, Lf, Ef, RBs) ->
- expr(E, Bs0, Lf, Ef, RBs);
-exprs([E|Es], Bs0, Lf, Ef, RBs) ->
+-spec(exprs(Expressions, Bindings, LocalFunctionHandler,
+ NonLocalFunctionHandler, ReturnFormat, FunUsedVars) ->
+ {value, Value, NewBindings} when
+ Expressions :: expressions(),
+ Bindings :: binding_struct(),
+ LocalFunctionHandler :: local_function_handler(),
+ NonLocalFunctionHandler :: non_local_function_handler(),
+ ReturnFormat :: none | value,
+ FunUsedVars :: erl_lint:fun_used_vars(),
+ Value :: value(),
+ NewBindings :: binding_struct()).
+exprs([E], Bs0, Lf, Ef, RBs, FUVs) ->
+ expr(E, Bs0, Lf, Ef, RBs, FUVs);
+exprs([E|Es], Bs0, Lf, Ef, RBs, FUVs) ->
RBs1 = none,
- {value,_V,Bs} = expr(E, Bs0, Lf, Ef, RBs1),
- exprs(Es, Bs, Lf, Ef, RBs).
+ {value,_V,Bs} = expr(E, Bs0, Lf, Ef, RBs1, FUVs),
+ exprs(Es, Bs, Lf, Ef, RBs, FUVs).
+
+%% maybe_match_exprs(Expression, Bindings, LocalFuncHandler, ExternalFuncHandler)
+%% Returns one of:
+%% {success,Value}
+%% {failure,Value}
+%% or raises an exception.
+
+maybe_match_exprs([{maybe_match,Anno,Lhs,Rhs0}|Es], Bs0, Lf, Ef) ->
+ {value,Rhs,Bs1} = expr(Rhs0, Bs0, Lf, Ef, none),
+ case match(Lhs, Rhs, Anno, Bs1, Bs1, Ef) of
+ {match,Bs} ->
+ case Es of
+ [] ->
+ {success,Rhs};
+ [_|_] ->
+ maybe_match_exprs(Es, Bs, Lf, Ef)
+ end;
+ nomatch ->
+ {failure,Rhs}
+ end;
+maybe_match_exprs([E], Bs0, Lf, Ef) ->
+ {value,V,_Bs} = expr(E, Bs0, Lf, Ef, none),
+ {success,V};
+maybe_match_exprs([E|Es], Bs0, Lf, Ef) ->
+ {value,_V,Bs} = expr(E, Bs0, Lf, Ef, none),
+ maybe_match_exprs(Es, Bs, Lf, Ef).
%% expr(Expression, Bindings)
%% expr(Expression, Bindings, LocalFuncHandler)
@@ -139,7 +178,7 @@ exprs([E|Es], Bs0, Lf, Ef, RBs) ->
NewBindings :: binding_struct()).
expr(E, Bs) ->
case check_command([E], Bs) of
- ok ->
+ ok ->
expr(E, Bs, none, none, none);
{error,{_Location,_Mod,Error}} ->
erlang:raise(error, Error, ?STACKTRACE)
@@ -185,9 +224,9 @@ fun_data(F) when is_function(F) ->
case erlang:fun_info(F, module) of
{module,?MODULE} ->
case erlang:fun_info(F, env) of
- {env,[{FBs,_FLf,_FEf,FCs}]} ->
+ {env,[{_FAnno,FBs,_FLf,_FEf,_FUVs,FCs}]} ->
{fun_data,FBs,FCs};
- {env,[{FBs,_FLf,_FEf,FCs,FName}]} ->
+ {env,[{_FAnno,FBs,_FLf,_FEf,_FUVs,FCs,FName}]} ->
{named_fun_data,FBs,FName,FCs}
end;
_ ->
@@ -206,92 +245,103 @@ fun_data(_T) ->
ReturnFormat :: none | value,
Value :: value(),
NewBindings :: binding_struct()).
-expr({var,_,V}, Bs, _Lf, _Ef, RBs) ->
+expr(Expr, Bs, Lf, Ef, Rbs) ->
+ expr(Expr, Bs, Lf, Ef, Rbs, empty_fun_used_vars()).
+
+-spec(expr(Expression, Bindings, LocalFunctionHandler,
+ NonLocalFunctionHandler, ReturnFormat, FunUsedVars) ->
+ {value, Value, NewBindings} | Value when
+ Expression :: expression(),
+ Bindings :: binding_struct(),
+ LocalFunctionHandler :: local_function_handler(),
+ NonLocalFunctionHandler :: non_local_function_handler(),
+ ReturnFormat :: none | value,
+ FunUsedVars :: erl_lint:fun_used_vars(),
+ Value :: value(),
+ NewBindings :: binding_struct()).
+expr({var,Anno,V}, Bs, _Lf, Ef, RBs, _FUVs) ->
case binding(V, Bs) of
{value,Val} ->
ret_expr(Val, Bs, RBs);
unbound -> % Cannot not happen if checked by erl_lint
- erlang:raise(error, {unbound,V}, ?STACKTRACE)
+ apply_error({unbound,V}, ?STACKTRACE, Anno, Bs, Ef, RBs)
end;
-expr({char,_,C}, Bs, _Lf, _Ef, RBs) ->
+expr({char,_,C}, Bs, _Lf, _Ef, RBs, _FUVs) ->
ret_expr(C, Bs, RBs);
-expr({integer,_,I}, Bs, _Lf, _Ef, RBs) ->
+expr({integer,_,I}, Bs, _Lf, _Ef, RBs, _FUVs) ->
ret_expr(I, Bs, RBs);
-expr({float,_,F}, Bs, _Lf, _Ef, RBs) ->
+expr({float,_,F}, Bs, _Lf, _Ef, RBs, _FUVs) ->
ret_expr(F, Bs, RBs);
-expr({atom,_,A}, Bs, _Lf, _Ef, RBs) ->
+expr({atom,_,A}, Bs, _Lf, _Ef, RBs, _FUVs) ->
ret_expr(A, Bs, RBs);
-expr({string,_,S}, Bs, _Lf, _Ef, RBs) ->
+expr({string,_,S}, Bs, _Lf, _Ef, RBs, _FUVs) ->
ret_expr(S, Bs, RBs);
-expr({nil, _}, Bs, _Lf, _Ef, RBs) ->
+expr({nil, _}, Bs, _Lf, _Ef, RBs, _FUVs) ->
ret_expr([], Bs, RBs);
-expr({cons,_,H0,T0}, Bs0, Lf, Ef, RBs) ->
- {value,H,Bs1} = expr(H0, Bs0, Lf, Ef, none),
- {value,T,Bs2} = expr(T0, Bs0, Lf, Ef, none),
- ret_expr([H|T], merge_bindings(Bs1, Bs2), RBs);
-expr({lc,_,E,Qs}, Bs, Lf, Ef, RBs) ->
- eval_lc(E, Qs, Bs, Lf, Ef, RBs);
-expr({bc,_,E,Qs}, Bs, Lf, Ef, RBs) ->
- eval_bc(E, Qs, Bs, Lf, Ef, RBs);
-expr({tuple,_,Es}, Bs0, Lf, Ef, RBs) ->
- {Vs,Bs} = expr_list(Es, Bs0, Lf, Ef),
+expr({cons,Anno,H0,T0}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,H,Bs1} = expr(H0, Bs0, Lf, Ef, none, FUVs),
+ {value,T,Bs2} = expr(T0, Bs0, Lf, Ef, none, FUVs),
+ ret_expr([H|T], merge_bindings(Bs1, Bs2, Anno, Ef), RBs);
+expr({lc,_,E,Qs}, Bs, Lf, Ef, RBs, FUVs) ->
+ eval_lc(E, Qs, Bs, Lf, Ef, RBs, FUVs);
+expr({bc,_,E,Qs}, Bs, Lf, Ef, RBs, FUVs) ->
+ eval_bc(E, Qs, Bs, Lf, Ef, RBs, FUVs);
+expr({tuple,_,Es}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {Vs,Bs} = expr_list(Es, Bs0, Lf, Ef, FUVs),
ret_expr(list_to_tuple(Vs), Bs, RBs);
-expr({record_field,_,_,Name,_}, _Bs, _Lf, _Ef, _RBs) ->
- erlang:raise(error, {undef_record,Name}, ?STACKTRACE);
-expr({record_index,_,Name,_}, _Bs, _Lf, _Ef, _RBs) ->
- erlang:raise(error, {undef_record,Name}, ?STACKTRACE);
-expr({record,_,Name,_}, _Bs, _Lf, _Ef, _RBs) ->
- erlang:raise(error, {undef_record,Name}, ?STACKTRACE);
-expr({record,_,_,Name,_}, _Bs, _Lf, _Ef, _RBs) ->
- erlang:raise(error, {undef_record,Name}, ?STACKTRACE);
+expr({record_field,Anno,_,Name,_}, Bs, _Lf, Ef, RBs, _FUVs) ->
+ apply_error({undef_record,Name}, ?STACKTRACE, Anno, Bs, Ef, RBs);
+expr({record_index,Anno,Name,_}, Bs, _Lf, Ef, RBs, _FUVs) ->
+ apply_error({undef_record,Name}, ?STACKTRACE, Anno, Bs, Ef, RBs);
+expr({record,Anno,Name,_}, Bs, _Lf, Ef, RBs, _FUVs) ->
+ apply_error({undef_record,Name}, ?STACKTRACE, Anno, Bs, Ef, RBs);
+expr({record,Anno,_,Name,_}, Bs, _Lf, Ef, RBs, _FUVs) ->
+ apply_error({undef_record,Name}, ?STACKTRACE, Anno, Bs, Ef, RBs);
%% map
-expr({map,_,Binding,Es}, Bs0, Lf, Ef, RBs) ->
- {value, Map0, Bs1} = expr(Binding, Bs0, Lf, Ef, none),
- {Vs,Bs2} = eval_map_fields(Es, Bs0, Lf, Ef),
+expr({map,Anno,Binding,Es}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value, Map0, Bs1} = expr(Binding, Bs0, Lf, Ef, none, FUVs),
+ {Vs,Bs2} = eval_map_fields(Es, Bs0, Lf, Ef, FUVs),
_ = maps:put(k, v, Map0), %Validate map.
Map1 = lists:foldl(fun ({map_assoc,K,V}, Mi) ->
maps:put(K, V, Mi);
({map_exact,K,V}, Mi) ->
maps:update(K, V, Mi)
end, Map0, Vs),
- ret_expr(Map1, merge_bindings(Bs2, Bs1), RBs);
-expr({map,_,Es}, Bs0, Lf, Ef, RBs) ->
- {Vs,Bs} = eval_map_fields(Es, Bs0, Lf, Ef),
+ ret_expr(Map1, merge_bindings(Bs2, Bs1, Anno, Ef), RBs);
+expr({map,_,Es}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {Vs,Bs} = eval_map_fields(Es, Bs0, Lf, Ef, FUVs),
ret_expr(lists:foldl(fun
({map_assoc,K,V}, Mi) -> maps:put(K,V,Mi)
end, maps:new(), Vs), Bs, RBs);
-expr({block,_,Es}, Bs, Lf, Ef, RBs) ->
- exprs(Es, Bs, Lf, Ef, RBs);
-expr({'if',_,Cs}, Bs, Lf, Ef, RBs) ->
- if_clauses(Cs, Bs, Lf, Ef, RBs);
-expr({'case',_,E,Cs}, Bs0, Lf, Ef, RBs) ->
- {value,Val,Bs} = expr(E, Bs0, Lf, Ef, none),
- case_clauses(Val, Cs, Bs, Lf, Ef, RBs);
-expr({'try',_,B,Cases,Catches,AB}, Bs, Lf, Ef, RBs) ->
- try_clauses(B, Cases, Catches, AB, Bs, Lf, Ef, RBs);
-expr({'receive',_,Cs}, Bs, Lf, Ef, RBs) ->
- receive_clauses(Cs, Bs, Lf, Ef, RBs);
-expr({'receive',_, Cs, E, TB}, Bs0, Lf, Ef, RBs) ->
- {value,T,Bs} = expr(E, Bs0, Lf, Ef, none),
- receive_clauses(T, Cs, {TB,Bs}, Bs0, Lf, Ef, RBs);
-expr({'fun',_Anno,{function,Mod0,Name0,Arity0}}, Bs0, Lf, Ef, RBs) ->
- {[Mod,Name,Arity],Bs} = expr_list([Mod0,Name0,Arity0], Bs0, Lf, Ef),
+expr({block,_,Es}, Bs, Lf, Ef, RBs, FUVs) ->
+ exprs(Es, Bs, Lf, Ef, RBs, FUVs);
+expr({'if',Anno,Cs}, Bs, Lf, Ef, RBs, FUVs) ->
+ if_clauses(Cs, Anno, Bs, Lf, Ef, RBs, FUVs);
+expr({'case',Anno,E,Cs}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,Val,Bs} = expr(E, Bs0, Lf, Ef, none, FUVs),
+ case_clauses(Val, Cs, Anno, Bs, Lf, Ef, RBs, FUVs);
+expr({'try',Anno,B,Cases,Catches,AB}, Bs, Lf, Ef, RBs, FUVs) ->
+ try_clauses(B, Cases, Catches, AB, Anno, Bs, Lf, Ef, RBs, FUVs);
+expr({'receive',_,Cs}, Bs, Lf, Ef, RBs, FUVs) ->
+ receive_clauses(Cs, Bs, Lf, Ef, RBs, FUVs);
+expr({'receive',_, Cs, E, TB}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,T,Bs} = expr(E, Bs0, Lf, Ef, none, FUVs),
+ receive_clauses(T, Cs, {TB,Bs}, Bs0, Lf, Ef, RBs, FUVs);
+expr({'fun',_Anno,{function,Mod0,Name0,Arity0}}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {[Mod,Name,Arity],Bs} = expr_list([Mod0,Name0,Arity0], Bs0, Lf, Ef, FUVs),
F = erlang:make_fun(Mod, Name, Arity),
- ret_expr(F, Bs, RBs);
-expr({'fun',_Anno,{function,Name,Arity}}, _Bs0, _Lf, _Ef, _RBs) -> % R8
+ ret_expr(F, Bs, RBs);
+expr({'fun',Anno,{function,Name,Arity}}, Bs0, _Lf, Ef, RBs, _FUVs) -> % R8
%% Don't know what to do...
- erlang:raise(error, undef, [{?MODULE,Name,Arity}|?STACKTRACE]);
-expr({'fun',Anno,{clauses,Cs}} = Ex, Bs, Lf, Ef, RBs) ->
- %% Save only used variables in the function environment.
- %% {value,L,V} are hidden while lint finds used variables.
- {Ex1, _} = hide_calls(Ex, 0),
- {ok,Used} = erl_lint:used_vars([Ex1], bindings(Bs)),
- En = filter_bindings(fun(K,_V) -> member(K,Used) end, Bs),
- Info = {En,Lf,Ef,Cs},
+ apply_error(undef, [{?MODULE,Name,Arity}|?STACKTRACE], Anno, Bs0, Ef, RBs);
+expr({'fun',Anno,{clauses,Cs}} = Ex, Bs, Lf, Ef, RBs, FUVs) ->
+ {En,NewFUVs} = fun_used_bindings(Ex, Cs, Bs, FUVs),
+ Info = {Anno,En,Lf,Ef,NewFUVs,Cs},
+
%% This is a really ugly hack!
- F =
+ F =
case length(element(3,hd(Cs))) of
0 -> fun () -> eval_fun([], Info) end;
1 -> fun (A) -> eval_fun([A], Info) end;
@@ -327,17 +377,14 @@ expr({'fun',Anno,{clauses,Cs}} = Ex, Bs, Lf, Ef, RBs) ->
eval_fun([A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T], Info) end;
_Other ->
L = erl_anno:location(Anno),
- erlang:raise(error, {'argument_limit',{'fun',L,to_terms(Cs)}},
- ?STACKTRACE)
+ Reason = {'argument_limit',{'fun',L,to_terms(Cs)}},
+ apply_error(Reason, ?STACKTRACE, Anno, Bs, Ef, RBs)
end,
ret_expr(F, Bs, RBs);
-expr({named_fun,Anno,Name,Cs} = Ex, Bs, Lf, Ef, RBs) ->
- %% Save only used variables in the function environment.
- %% {value,L,V} are hidden while lint finds used variables.
- {Ex1, _} = hide_calls(Ex, 0),
- {ok,Used} = erl_lint:used_vars([Ex1], bindings(Bs)),
- En = filter_bindings(fun(K,_V) -> member(K,Used) end, Bs),
- Info = {En,Lf,Ef,Cs,Name},
+expr({named_fun,Anno,Name,Cs} = Ex, Bs, Lf, Ef, RBs, FUVs) ->
+ {En,NewFUVs} = fun_used_bindings(Ex, Cs, Bs, FUVs),
+ Info = {Anno,En,Lf,Ef,NewFUVs,Cs,Name},
+
%% This is a really ugly hack!
F =
case length(element(3,hd(Cs))) of
@@ -380,58 +427,57 @@ expr({named_fun,Anno,Name,Cs} = Ex, Bs, Lf, Ef, RBs) ->
RF, Info) end;
_Other ->
L = erl_anno:location(Anno),
- erlang:raise(error, {'argument_limit',
- {named_fun,L,Name,to_terms(Cs)}},
- ?STACKTRACE)
+ Reason = {'argument_limit',{named_fun,L,Name,to_terms(Cs)}},
+ apply_error(Reason, ?STACKTRACE, Anno, Bs, Ef, RBs)
end,
ret_expr(F, Bs, RBs);
-expr({call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[{lc,_,_E,_Qs}=LC | As0]},
- Bs0, Lf, Ef, RBs) when length(As0) =< 1 ->
+expr({call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[{lc,_,_E,_Qs}=LC | As0]},
+ Bs0, Lf, Ef, RBs, FUVs) when length(As0) =< 1 ->
%% No expansion or evaluation of module name or function name.
MaxLine = find_maxline(LC),
{LC1, D} = hide_calls(LC, MaxLine),
case qlc:transform_from_evaluator(LC1, Bs0) of
{ok,{call,A,Remote,[QLC]}} ->
QLC1 = unhide_calls(QLC, MaxLine, D),
- expr({call,A,Remote,[QLC1 | As0]}, Bs0, Lf, Ef, RBs);
+ expr({call,A,Remote,[QLC1 | As0]}, Bs0, Lf, Ef, RBs, FUVs);
{not_ok,Error} ->
ret_expr(Error, Bs0, RBs)
end;
expr({call,A1,{remote,A2,{record_field,_,{atom,_,''},{atom,_,qlc}=Mod},
{atom,_,q}=Func},
- [{lc,_,_E,_Qs} | As0]=As},
- Bs, Lf, Ef, RBs) when length(As0) =< 1 ->
- expr({call,A1,{remote,A2,Mod,Func},As}, Bs, Lf, Ef, RBs);
-expr({call,_,{remote,_,Mod,Func},As0}, Bs0, Lf, Ef, RBs) ->
- {value,M,Bs1} = expr(Mod, Bs0, Lf, Ef, none),
- {value,F,Bs2} = expr(Func, Bs0, Lf, Ef, none),
- {As,Bs3} = expr_list(As0, merge_bindings(Bs1, Bs2), Lf, Ef),
+ [{lc,_,_E,_Qs} | As0]=As},
+ Bs, Lf, Ef, RBs, FUVs) when length(As0) =< 1 ->
+ expr({call,A1,{remote,A2,Mod,Func},As}, Bs, Lf, Ef, RBs, FUVs);
+expr({call,Anno,{remote,_,Mod,Func},As0}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,M,Bs1} = expr(Mod, Bs0, Lf, Ef, none, FUVs),
+ {value,F,Bs2} = expr(Func, Bs0, Lf, Ef, none, FUVs),
+ {As,Bs3} = expr_list(As0, merge_bindings(Bs1, Bs2, Anno, Ef), Lf, Ef, FUVs),
%% M could be a parameterized module (not an atom).
case is_atom(M) andalso erl_internal:bif(M, F, length(As)) of
true ->
- bif(F, As, Bs3, Ef, RBs);
+ bif(F, As, Anno, Bs3, Ef, RBs);
false ->
- do_apply(M, F, As, Bs3, Ef, RBs)
+ do_apply(M, F, As, Anno, Bs3, Ef, RBs)
end;
-expr({call,_,{atom,_,Func},As0}, Bs0, Lf, Ef, RBs) ->
+expr({call,Anno,{atom,_,Func},As0}, Bs0, Lf, Ef, RBs, FUVs) ->
case erl_internal:bif(Func, length(As0)) of
true ->
{As,Bs} = expr_list(As0, Bs0, Lf, Ef),
- bif(Func, As, Bs, Ef, RBs);
+ bif(Func, As, Anno, Bs, Ef, RBs);
false ->
- local_func(Func, As0, Bs0, Lf, Ef, RBs)
+ local_func(Func, As0, Anno, Bs0, Lf, Ef, RBs, FUVs)
end;
-expr({call,_,Func0,As0}, Bs0, Lf, Ef, RBs) -> % function or {Mod,Fun}
- {value,Func,Bs1} = expr(Func0, Bs0, Lf, Ef, none),
- {As,Bs2} = expr_list(As0, Bs1, Lf, Ef),
+expr({call,Anno,Func0,As0}, Bs0, Lf, Ef, RBs, FUVs) -> % function or {Mod,Fun}
+ {value,Func,Bs1} = expr(Func0, Bs0, Lf, Ef, none, FUVs),
+ {As,Bs2} = expr_list(As0, Bs1, Lf, Ef, FUVs),
case Func of
{M,F} when is_atom(M), is_atom(F) ->
- erlang:raise(error, {badfun,Func}, ?STACKTRACE);
+ apply_error({badfun,Func}, ?STACKTRACE, Anno, Bs0, Ef, RBs);
_ ->
- do_apply(Func, As, Bs2, Ef, RBs)
+ do_apply(Func, As, Anno, Bs2, Ef, RBs)
end;
-expr({'catch',_,Expr}, Bs0, Lf, Ef, RBs) ->
- try expr(Expr, Bs0, Lf, Ef, none) of
+expr({'catch',_,Expr}, Bs0, Lf, Ef, RBs, FUVs) ->
+ try expr(Expr, Bs0, Lf, Ef, none, FUVs) of
{value,V,Bs} ->
ret_expr(V, Bs, RBs)
catch
@@ -442,48 +488,65 @@ expr({'catch',_,Expr}, Bs0, Lf, Ef, RBs) ->
error:Reason:Stacktrace ->
ret_expr({'EXIT',{Reason,Stacktrace}}, Bs0, RBs)
end;
-expr({match,_,Lhs,Rhs0}, Bs0, Lf, Ef, RBs) ->
- {value,Rhs,Bs1} = expr(Rhs0, Bs0, Lf, Ef, none),
- case match(Lhs, Rhs, Bs1) of
+expr({match,Anno,Lhs,Rhs0}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,Rhs,Bs1} = expr(Rhs0, Bs0, Lf, Ef, none, FUVs),
+ case match(Lhs, Rhs, Anno, Bs1, Bs1, Ef) of
{match,Bs} ->
ret_expr(Rhs, Bs, RBs);
- nomatch -> erlang:raise(error, {badmatch,Rhs}, ?STACKTRACE)
+ nomatch -> apply_error({badmatch,Rhs}, ?STACKTRACE, Anno, Bs0, Ef, RBs)
+ end;
+expr({'maybe',_,Es}, Bs, Lf, Ef, RBs, _FUVs) ->
+ {_,Val} = maybe_match_exprs(Es, Bs, Lf, Ef),
+ ret_expr(Val, Bs, RBs);
+expr({'maybe',Anno,Es,{'else',_,Cs}}, Bs0, Lf, Ef, RBs, FUVs) ->
+ case maybe_match_exprs(Es, Bs0, Lf, Ef) of
+ {success,Val} ->
+ ret_expr(Val, Bs0, RBs);
+ {failure,Val} ->
+ case match_clause(Cs, [Val], Bs0, Lf, Ef) of
+ {B, Bs} ->
+ exprs(B, Bs, Lf, Ef, RBs, FUVs);
+ nomatch ->
+ apply_error({else_clause,Val}, ?STACKTRACE, Anno, Bs0, Ef, RBs)
+ end
end;
-expr({op,_,Op,A0}, Bs0, Lf, Ef, RBs) ->
- {value,A,Bs} = expr(A0, Bs0, Lf, Ef, none),
- eval_op(Op, A, Bs, Ef, RBs);
-expr({op,_,'andalso',L0,R0}, Bs0, Lf, Ef, RBs) ->
- {value,L,Bs1} = expr(L0, Bs0, Lf, Ef, none),
+expr({op,Anno,Op,A0}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,A,Bs} = expr(A0, Bs0, Lf, Ef, none, FUVs),
+ eval_op(Op, A, Anno, Bs, Ef, RBs);
+expr({op,Anno,'andalso',L0,R0}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,L,Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs),
V = case L of
true ->
- {value,R,_} = expr(R0, Bs1, Lf, Ef, none),
+ {value,R,_} = expr(R0, Bs1, Lf, Ef, none, FUVs),
R;
false -> false;
- _ -> erlang:raise(error, {badarg,L}, ?STACKTRACE)
+ _ -> apply_error({badarg,L}, ?STACKTRACE, Anno, Bs0, Ef, RBs)
end,
ret_expr(V, Bs1, RBs);
-expr({op,_,'orelse',L0,R0}, Bs0, Lf, Ef, RBs) ->
- {value,L,Bs1} = expr(L0, Bs0, Lf, Ef, none),
+expr({op,Anno,'orelse',L0,R0}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,L,Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs),
V = case L of
true -> true;
false ->
- {value,R,_} = expr(R0, Bs1, Lf, Ef, none),
+ {value,R,_} = expr(R0, Bs1, Lf, Ef, none, FUVs),
R;
- _ -> erlang:raise(error, {badarg,L}, ?STACKTRACE)
+ _ -> apply_error({badarg,L}, ?STACKTRACE, Anno, Bs0, Ef, RBs)
end,
ret_expr(V, Bs1, RBs);
-expr({op,_,Op,L0,R0}, Bs0, Lf, Ef, RBs) ->
- {value,L,Bs1} = expr(L0, Bs0, Lf, Ef, none),
- {value,R,Bs2} = expr(R0, Bs0, Lf, Ef, none),
- eval_op(Op, L, R, merge_bindings(Bs1, Bs2), Ef, RBs);
-expr({bin,_,Fs}, Bs0, Lf, Ef, RBs) ->
- EvalFun = fun(E, B) -> expr(E, B, Lf, Ef, none) end,
- {value,V,Bs} = eval_bits:expr_grp(Fs, Bs0, EvalFun),
+expr({op,Anno,Op,L0,R0}, Bs0, Lf, Ef, RBs, FUVs) ->
+ {value,L,Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs),
+ {value,R,Bs2} = expr(R0, Bs0, Lf, Ef, none, FUVs),
+ eval_op(Op, L, R, Anno, merge_bindings(Bs1, Bs2, Anno, Ef), Ef, RBs);
+expr({bin,_,Fs}, Bs0, Lf, Ef, RBs, FUVs) ->
+ EvalFun = fun(E, B) -> expr(E, B, Lf, Ef, none, FUVs) end,
+ ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, RBs) end,
+ {value,V,Bs} = eval_bits:expr_grp(Fs, Bs0, EvalFun, ErrorFun),
ret_expr(V, Bs, RBs);
-expr({remote,_,_,_}, _Bs, _Lf, _Ef, _RBs) ->
- erlang:raise(error, {badexpr,':'}, ?STACKTRACE);
-expr({value,_,Val}, Bs, _Lf, _Ef, RBs) -> % Special case straight values.
- ret_expr(Val, Bs, RBs).
+expr({remote,Anno,_,_}, Bs0, _Lf, Ef, RBs, _FUVs) ->
+ apply_error({badexpr,':'}, ?STACKTRACE, Anno, Bs0, Ef, RBs).
+
+apply_error(Reason, Stack, Anno, Bs0, Ef, RBs) ->
+ do_apply(erlang, raise, [error, Reason, Stack], Anno, Bs0, Ef, RBs).
find_maxline(LC) ->
put('$erl_eval_max_line', 0),
@@ -503,43 +566,52 @@ find_maxline(LC) ->
_ = erl_parse:map_anno(F, LC),
erase('$erl_eval_max_line').
+fun_used_bindings(Fun, Cs, Bs, FUVs) ->
+ {Used,InnerFUVs} =
+ case FUVs of
+ %% If this clause is in our fun used vars tree,
+ %% then we do not need to compute to traverse it again.
+ #{Cs := UsedAndFUVs} ->
+ UsedAndFUVs;
+
+ #{} ->
+ %% Save only used variables in the function environment.
+ AllUsedVars = erl_lint:used_vars([Fun], bindings(Bs)),
+
+ %% At the root we should see only a single function,
+ %% so we extract its used vars and its tree out.
+ [{_,UsedAndFUVs}] = maps:to_list(AllUsedVars),
+ UsedAndFUVs
+ end,
+
+ {filter_bindings(fun(K,_V) -> member(K,Used) end, Bs),InnerFUVs}.
+
hide_calls(LC, MaxLine) ->
LineId0 = MaxLine + 1,
{NLC, _, D} = hide(LC, LineId0, maps:new()),
{NLC, D}.
-%% v/1 and local calls are hidden.
-hide({value,L,V}, Id, D) ->
- A = erl_anno:new(Id),
- {{atom,A,ok}, Id+1, maps:put(Id, {value,L,V}, D)};
+%% Local calls are hidden from qlc so they are not expanded.
hide({call,A,{atom,_,N}=Atom,Args}, Id0, D0) ->
{NArgs, Id, D} = hide(Args, Id0, D0),
C = case erl_internal:bif(N, length(Args)) of
true ->
{call,A,Atom,NArgs};
- false ->
+ false ->
Anno = erl_anno:new(Id),
{call,Anno,{remote,A,{atom,A,m},{atom,A,f}},NArgs}
end,
{C, Id+1, maps:put(Id, {call,Atom}, D)};
-hide(T0, Id0, D0) when is_tuple(T0) ->
+hide(T0, Id0, D0) when is_tuple(T0) ->
{L, Id, D} = hide(tuple_to_list(T0), Id0, D0),
{list_to_tuple(L), Id, D};
-hide([E0 | Es0], Id0, D0) ->
+hide([E0 | Es0], Id0, D0) ->
{E, Id1, D1} = hide(E0, Id0, D0),
{Es, Id, D} = hide(Es0, Id1, D1),
{[E | Es], Id, D};
-hide(E, Id, D) ->
+hide(E, Id, D) ->
{E, Id, D}.
-unhide_calls({atom,A,ok}=E, MaxLine, D) ->
- L = erl_anno:line(A),
- if
- L > MaxLine ->
- map_get(L, D);
- true ->
- E
- end;
unhide_calls({call,Anno,{remote,A,{atom,A,m},{atom,A,f}}=F,Args},
MaxLine, D) ->
Line = erl_anno:line(Anno),
@@ -550,84 +622,71 @@ unhide_calls({call,Anno,{remote,A,{atom,A,m},{atom,A,f}}=F,Args},
true ->
{call,Anno,F,unhide_calls(Args, MaxLine, D)}
end;
-unhide_calls(T, MaxLine, D) when is_tuple(T) ->
+unhide_calls(T, MaxLine, D) when is_tuple(T) ->
list_to_tuple(unhide_calls(tuple_to_list(T), MaxLine, D));
-unhide_calls([E | Es], MaxLine, D) ->
+unhide_calls([E | Es], MaxLine, D) ->
[unhide_calls(E, MaxLine, D) | unhide_calls(Es, MaxLine, D)];
-unhide_calls(E, _MaxLine, _D) ->
+unhide_calls(E, _MaxLine, _D) ->
E.
-%% local_func(Function, Arguments, Bindings, LocalFuncHandler,
-%% ExternalFuncHandler, RBs) ->
+%% local_func(Function, Arguments, Anno, Bindings, LocalFuncHandler,
+%% ExternalFuncHandler, RBs, FunUsedVars) ->
%% {value,Value,Bindings} | Value when
%% LocalFuncHandler = {value,F} | {value,F,Eas} |
%% {eval,F} | {eval,F,Eas} | none.
-local_func(Func, As0, Bs0, {value,F}, Ef, value) ->
- {As1,_Bs1} = expr_list(As0, Bs0, {value,F}, Ef),
+local_func(Func, As0, _Anno, Bs0, {value,F}, Ef, value, FUVs) ->
+ {As1,_Bs1} = expr_list(As0, Bs0, {value,F}, Ef, FUVs),
%% Make tail recursive calls when possible.
F(Func, As1);
-local_func(Func, As0, Bs0, {value,F}, Ef, RBs) ->
- {As1,Bs1} = expr_list(As0, Bs0, {value,F}, Ef),
+local_func(Func, As0, _Anno, Bs0, {value,F}, Ef, RBs, FUVs) ->
+ {As1,Bs1} = expr_list(As0, Bs0, {value,F}, Ef, FUVs),
ret_expr(F(Func, As1), Bs1, RBs);
-local_func(Func, As0, Bs0, {value,F,Eas}, Ef, RBs) ->
+local_func(Func, As0, Anno, Bs0, {value,F,Eas}, Ef, RBs, FUVs) ->
Fun = fun(Name, Args) -> apply(F, [Name,Args|Eas]) end,
- local_func(Func, As0, Bs0, {value, Fun}, Ef, RBs);
-local_func(Func, As, Bs, {eval,F}, _Ef, RBs) ->
- local_func2(F(Func, As, Bs), RBs);
-local_func(Func, As, Bs, {eval,F,Eas}, _Ef, RBs) ->
- local_func2(apply(F, [Func,As,Bs|Eas]), RBs);
+ local_func(Func, As0, Anno, Bs0, {value, Fun}, Ef, RBs, FUVs);
+local_func(Func, As, Anno, Bs, {eval,F}, _Ef, RBs, _FUVs) ->
+ local_func2(F(Func, As, Bs), Anno, RBs);
+local_func(Func, As, Anno, Bs, {eval,F,Eas}, _Ef, RBs, _FUVs) ->
+ local_func2(apply(F, [Func,As,Bs|Eas]), Anno, RBs);
%% These two clauses are for backwards compatibility.
-local_func(Func, As0, Bs0, {M,F}, Ef, RBs) ->
- {As1,Bs1} = expr_list(As0, Bs0, {M,F}, Ef),
+local_func(Func, As0, _Anno, Bs0, {M,F}, Ef, RBs, FUVs) ->
+ {As1,Bs1} = expr_list(As0, Bs0, {M,F}, Ef, FUVs),
ret_expr(M:F(Func,As1), Bs1, RBs);
-local_func(Func, As, _Bs, {M,F,Eas}, _Ef, RBs) ->
- local_func2(apply(M, F, [Func,As|Eas]), RBs);
+local_func(Func, As, Anno, _Bs, {M,F,Eas}, _Ef, RBs, _FUVs) ->
+ local_func2(apply(M, F, [Func,As|Eas]), Anno, RBs);
%% Default unknown function handler to undefined function.
-local_func(Func, As0, _Bs0, none, _Ef, _RBs) ->
- erlang:raise(error, undef, [{?MODULE,Func,length(As0)}|?STACKTRACE]).
+local_func(Func, As0, Anno, Bs0, none, Ef, RBs, _FUVs) ->
+ apply_error(undef, [{?MODULE,Func,length(As0)}|?STACKTRACE], Anno, Bs0, Ef, RBs).
-local_func2({value,V,Bs}, RBs) ->
+local_func2({value,V,Bs}, _Anno, RBs) ->
ret_expr(V, Bs, RBs);
-local_func2({eval,F,As,Bs}, RBs) -> % This reply is not documented.
+local_func2({eval,F,As,Bs}, Anno, RBs) -> % This reply is not documented.
%% The shell found F. erl_eval tries to do a tail recursive call,
%% something the shell cannot do. Do not use Ef here.
- do_apply(F, As, Bs, none, RBs).
+ do_apply(F, As, Anno, Bs, none, RBs).
%% bif(Name, Arguments, RBs)
%% Evaluate the Erlang auto-imported function Name. erlang:apply/2,3
%% are "hidden" from the external function handler.
-bif(apply, [erlang,apply,As], Bs, Ef, RBs) ->
- bif(apply, As, Bs, Ef, RBs);
-bif(apply, [M,F,As], Bs, Ef, RBs) ->
- do_apply(M, F, As, Bs, Ef, RBs);
-bif(apply, [F,As], Bs, Ef, RBs) ->
- do_apply(F, As, Bs, Ef, RBs);
-bif(Name, As, Bs, Ef, RBs) ->
- do_apply(erlang, Name, As, Bs, Ef, RBs).
+bif(apply, [erlang,apply,As], Anno, Bs, Ef, RBs) ->
+ bif(apply, As, Anno, Bs, Ef, RBs);
+bif(apply, [M,F,As], Anno, Bs, Ef, RBs) ->
+ do_apply(M, F, As, Anno, Bs, Ef, RBs);
+bif(apply, [F,As], Anno, Bs, Ef, RBs) ->
+ do_apply(F, As, Anno, Bs, Ef, RBs);
+bif(Name, As, Anno, Bs, Ef, RBs) ->
+ do_apply(erlang, Name, As, Anno, Bs, Ef, RBs).
-%% do_apply(MF, Arguments, Bindings, ExternalFuncHandler, RBs) ->
+%% do_apply(Func, Arguments, Bindings, ExternalFuncHandler, RBs) ->
%% {value,Value,Bindings} | Value when
-%% ExternalFuncHandler = {value,F} | none.
-%% MF is a tuple {Module,Function} or a fun.
+%% ExternalFuncHandler = {value,F} | none,
+%% Func = fun()
-do_apply({M,F}=Func, As, Bs0, Ef, RBs)
- when tuple_size(M) >= 1, is_atom(element(1, M)), is_atom(F) ->
- case Ef of
- none when RBs =:= value ->
- %% Make tail recursive calls when possible.
- apply(M, F, As);
- none ->
- ret_expr(apply(M, F, As), Bs0, RBs);
- {value,Fun} when RBs =:= value ->
- Fun(Func, As);
- {value,Fun} ->
- ret_expr(Fun(Func, As), Bs0, RBs)
- end;
-do_apply(Func, As, Bs0, Ef, RBs) ->
+do_apply(Func, As, Anno, Bs0, Ef, RBs) ->
Env = if
- is_function(Func) ->
+ is_function(Func) ->
case {erlang:fun_info(Func, module),
erlang:fun_info(Func, env)} of
{{module,?MODULE},{env,Env1}} when Env1 =/= [] ->
@@ -635,12 +694,12 @@ do_apply(Func, As, Bs0, Ef, RBs) ->
_ ->
no_env
end;
- true ->
+ true ->
no_env
end,
case {Env,Ef} of
- {{env,[{FBs,FLf,FEf,FCs}]},_} ->
- %% If we are evaluting within another function body
+ {{env,[{FAnno,FBs,FLf,FEf,FFUVs,FCs}]},_} ->
+ %% If we are evaluting within another function body
%% (RBs =/= none), we return RBs when this function body
%% has been evalutated, otherwise we return Bs0, the
%% bindings when evalution of this function body started.
@@ -650,20 +709,20 @@ do_apply(Func, As, Bs0, Ef, RBs) ->
end,
case {erlang:fun_info(Func, arity), length(As)} of
{{arity, Arity}, Arity} ->
- eval_fun(FCs, As, FBs, FLf, FEf, NRBs);
+ eval_fun(FCs, As, FAnno, FBs, FLf, FEf, NRBs, FFUVs);
_ ->
- erlang:raise(error, {badarity,{Func,As}},?STACKTRACE)
+ apply_error({badarity,{Func,As}}, ?STACKTRACE, Anno, Bs0, Ef, RBs)
end;
- {{env,[{FBs,FLf,FEf,FCs,FName}]},_} ->
+ {{env,[{FAnno,FBs,FLf,FEf,FFUVs,FCs,FName}]},_} ->
NRBs = if
RBs =:= none -> Bs0;
true -> RBs
end,
case {erlang:fun_info(Func, arity), length(As)} of
{{arity, Arity}, Arity} ->
- eval_named_fun(FCs, As, FBs, FLf, FEf, FName, Func, NRBs);
+ eval_named_fun(FCs, As, FAnno, FBs, FLf, FEf, FName, Func, NRBs, FFUVs);
_ ->
- erlang:raise(error, {badarity,{Func,As}},?STACKTRACE)
+ apply_error({badarity,{Func,As}}, ?STACKTRACE, Anno, Bs0, Ef, RBs)
end;
{no_env,none} when RBs =:= value ->
%% Make tail recursive calls when possible.
@@ -671,12 +730,12 @@ do_apply(Func, As, Bs0, Ef, RBs) ->
{no_env,none} ->
ret_expr(apply(Func, As), Bs0, RBs);
{no_env,{value,F}} when RBs =:= value ->
- F(Func,As);
+ do_apply(F, Anno, Func, As);
{no_env,{value,F}} ->
- ret_expr(F(Func, As), Bs0, RBs)
+ ret_expr(do_apply(F, Anno, Func, As), Bs0, RBs)
end.
-do_apply(Mod, Func, As, Bs0, Ef, RBs) ->
+do_apply(Mod, Func, As, Anno, Bs0, Ef, RBs) ->
case Ef of
none when RBs =:= value ->
%% Make tail recursive calls when possible.
@@ -684,86 +743,92 @@ do_apply(Mod, Func, As, Bs0, Ef, RBs) ->
none ->
ret_expr(apply(Mod, Func, As), Bs0, RBs);
{value,F} when RBs =:= value ->
- F({Mod,Func}, As);
+ do_apply(F, Anno, {Mod,Func}, As);
{value,F} ->
- ret_expr(F({Mod,Func}, As), Bs0, RBs)
+ ret_expr(do_apply(F, Anno, {Mod,Func}, As), Bs0, RBs)
end.
-%% eval_lc(Expr, [Qualifier], Bindings, LocalFunctionHandler,
+do_apply(F, Anno, FunOrModFun, Args) when is_function(F, 3) ->
+ F(Anno, FunOrModFun, Args);
+do_apply(F, _Anno, FunOrModFun, Args) when is_function(F, 2) ->
+ F(FunOrModFun, Args).
+
+%% eval_lc(Expr, [Qualifier], Bindings, LocalFunctionHandler,
%% ExternalFuncHandler, RetBindings) ->
%% {value,Value,Bindings} | Value
-eval_lc(E, Qs, Bs, Lf, Ef, RBs) ->
- ret_expr(lists:reverse(eval_lc1(E, Qs, Bs, Lf, Ef, [])), Bs, RBs).
-
-eval_lc1(E, [{generate,_,P,L0}|Qs], Bs0, Lf, Ef, Acc0) ->
- {value,L1,_Bs1} = expr(L0, Bs0, Lf, Ef, none),
- CompFun = fun(Bs, Acc) -> eval_lc1(E, Qs, Bs, Lf, Ef, Acc) end,
- eval_generate(L1, P, Bs0, Lf, Ef, CompFun, Acc0);
-eval_lc1(E, [{b_generate,_,P,L0}|Qs], Bs0, Lf, Ef, Acc0) ->
- {value,Bin,_Bs1} = expr(L0, Bs0, Lf, Ef, none),
- CompFun = fun(Bs, Acc) -> eval_lc1(E, Qs, Bs, Lf, Ef, Acc) end,
- eval_b_generate(Bin, P, Bs0, Lf, Ef, CompFun, Acc0);
-eval_lc1(E, [F|Qs], Bs0, Lf, Ef, Acc) ->
- CompFun = fun(Bs) -> eval_lc1(E, Qs, Bs, Lf, Ef, Acc) end,
- eval_filter(F, Bs0, Lf, Ef, CompFun, Acc);
-eval_lc1(E, [], Bs, Lf, Ef, Acc) ->
- {value,V,_} = expr(E, Bs, Lf, Ef, none),
+eval_lc(E, Qs, Bs, Lf, Ef, RBs, FUVs) ->
+ ret_expr(lists:reverse(eval_lc1(E, Qs, Bs, Lf, Ef, FUVs, [])), Bs, RBs).
+
+eval_lc1(E, [{generate,Anno,P,L0}|Qs], Bs0, Lf, Ef, FUVs, Acc0) ->
+ {value,L1,_Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs),
+ CompFun = fun(Bs, Acc) -> eval_lc1(E, Qs, Bs, Lf, Ef, FUVs, Acc) end,
+ eval_generate(L1, P, Anno, Bs0, Lf, Ef, CompFun, Acc0);
+eval_lc1(E, [{b_generate,Anno,P,L0}|Qs], Bs0, Lf, Ef, FUVs, Acc0) ->
+ {value,Bin,_Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs),
+ CompFun = fun(Bs, Acc) -> eval_lc1(E, Qs, Bs, Lf, Ef, FUVs, Acc) end,
+ eval_b_generate(Bin, P, Anno, Bs0, Lf, Ef, CompFun, Acc0);
+eval_lc1(E, [F|Qs], Bs0, Lf, Ef, FUVs, Acc) ->
+ CompFun = fun(Bs) -> eval_lc1(E, Qs, Bs, Lf, Ef, FUVs, Acc) end,
+ eval_filter(F, Bs0, Lf, Ef, CompFun, FUVs, Acc);
+eval_lc1(E, [], Bs, Lf, Ef, FUVs, Acc) ->
+ {value,V,_} = expr(E, Bs, Lf, Ef, none, FUVs),
[V|Acc].
-%% eval_bc(Expr, [Qualifier], Bindings, LocalFunctionHandler,
+%% eval_bc(Expr, [Qualifier], Bindings, LocalFunctionHandler,
%% ExternalFuncHandler, RetBindings) ->
%% {value,Value,Bindings} | Value
-eval_bc(E, Qs, Bs, Lf, Ef, RBs) ->
- ret_expr(eval_bc1(E, Qs, Bs, Lf, Ef, <<>>), Bs, RBs).
-
-eval_bc1(E, [{b_generate,_,P,L0}|Qs], Bs0, Lf, Ef, Acc0) ->
- {value,Bin,_Bs1} = expr(L0, Bs0, Lf, Ef, none),
- CompFun = fun(Bs, Acc) -> eval_bc1(E, Qs, Bs, Lf, Ef, Acc) end,
- eval_b_generate(Bin, P, Bs0, Lf, Ef, CompFun, Acc0);
-eval_bc1(E, [{generate,_,P,L0}|Qs], Bs0, Lf, Ef, Acc0) ->
- {value,List,_Bs1} = expr(L0, Bs0, Lf, Ef, none),
- CompFun = fun(Bs, Acc) -> eval_bc1(E, Qs, Bs, Lf, Ef, Acc) end,
- eval_generate(List, P, Bs0, Lf, Ef, CompFun, Acc0);
-eval_bc1(E, [F|Qs], Bs0, Lf, Ef, Acc) ->
- CompFun = fun(Bs) -> eval_bc1(E, Qs, Bs, Lf, Ef, Acc) end,
- eval_filter(F, Bs0, Lf, Ef, CompFun, Acc);
-eval_bc1(E, [], Bs, Lf, Ef, Acc) ->
- {value,V,_} = expr(E, Bs, Lf, Ef, none),
+eval_bc(E, Qs, Bs, Lf, Ef, RBs, FUVs) ->
+ ret_expr(eval_bc1(E, Qs, Bs, Lf, Ef, FUVs, <<>>), Bs, RBs).
+
+eval_bc1(E, [{b_generate,Anno,P,L0}|Qs], Bs0, Lf, Ef, FUVs, Acc0) ->
+ {value,Bin,_Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs),
+ CompFun = fun(Bs, Acc) -> eval_bc1(E, Qs, Bs, Lf, Ef, FUVs, Acc) end,
+ eval_b_generate(Bin, P, Anno, Bs0, Lf, Ef, CompFun, Acc0);
+eval_bc1(E, [{generate,Anno,P,L0}|Qs], Bs0, Lf, Ef, FUVs, Acc0) ->
+ {value,List,_Bs1} = expr(L0, Bs0, Lf, Ef, none, FUVs),
+ CompFun = fun(Bs, Acc) -> eval_bc1(E, Qs, Bs, Lf, Ef, FUVs, Acc) end,
+ eval_generate(List, P, Anno, Bs0, Lf, Ef, CompFun, Acc0);
+eval_bc1(E, [F|Qs], Bs0, Lf, Ef, FUVs, Acc) ->
+ CompFun = fun(Bs) -> eval_bc1(E, Qs, Bs, Lf, Ef, FUVs, Acc) end,
+ eval_filter(F, Bs0, Lf, Ef, CompFun, FUVs, Acc);
+eval_bc1(E, [], Bs, Lf, Ef, FUVs, Acc) ->
+ {value,V,_} = expr(E, Bs, Lf, Ef, none, FUVs),
<<Acc/bitstring,V/bitstring>>.
-eval_generate([V|Rest], P, Bs0, Lf, Ef, CompFun, Acc) ->
- case match(P, V, new_bindings(Bs0), Bs0) of
+eval_generate([V|Rest], P, Anno, Bs0, Lf, Ef, CompFun, Acc) ->
+ case match(P, V, Anno, new_bindings(Bs0), Bs0, Ef) of
{match,Bsn} ->
Bs2 = add_bindings(Bsn, Bs0),
NewAcc = CompFun(Bs2, Acc),
- eval_generate(Rest, P, Bs0, Lf, Ef, CompFun, NewAcc);
- nomatch ->
- eval_generate(Rest, P, Bs0, Lf, Ef, CompFun, Acc)
+ eval_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, NewAcc);
+ nomatch ->
+ eval_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Acc)
end;
-eval_generate([], _P, _Bs0, _Lf, _Ef, _CompFun, Acc) ->
+eval_generate([], _P, _Anno, _Bs0, _Lf, _Ef, _CompFun, Acc) ->
Acc;
-eval_generate(Term, _P, _Bs0, _Lf, _Ef, _CompFun, _Acc) ->
- erlang:raise(error, {bad_generator,Term}, ?STACKTRACE).
+eval_generate(Term, _P, Anno, Bs0, _Lf, Ef, _CompFun, _Acc) ->
+ apply_error({bad_generator,Term}, ?STACKTRACE, Anno, Bs0, Ef, none).
-eval_b_generate(<<_/bitstring>>=Bin, P, Bs0, Lf, Ef, CompFun, Acc) ->
- Mfun = match_fun(Bs0),
+eval_b_generate(<<_/bitstring>>=Bin, P, Anno, Bs0, Lf, Ef, CompFun, Acc) ->
+ Mfun = match_fun(Bs0, Ef),
Efun = fun(Exp, Bs) -> expr(Exp, Bs, Lf, Ef, none) end,
- case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun) of
+ ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end,
+ case eval_bits:bin_gen(P, Bin, new_bindings(Bs0), Bs0, Mfun, Efun, ErrorFun) of
{match, Rest, Bs1} ->
Bs2 = add_bindings(Bs1, Bs0),
NewAcc = CompFun(Bs2, Acc),
- eval_b_generate(Rest, P, Bs0, Lf, Ef, CompFun, NewAcc);
+ eval_b_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, NewAcc);
{nomatch, Rest} ->
- eval_b_generate(Rest, P, Bs0, Lf, Ef, CompFun, Acc);
+ eval_b_generate(Rest, P, Anno, Bs0, Lf, Ef, CompFun, Acc);
done ->
Acc
end;
-eval_b_generate(Term, _P, _Bs0, _Lf, _Ef, _CompFun, _Acc) ->
- erlang:raise(error, {bad_generator,Term}, ?STACKTRACE).
+eval_b_generate(Term, _P, Anno, Bs0, _Lf, Ef, _CompFun, _Acc) ->
+ apply_error({bad_generator,Term}, ?STACKTRACE, Anno, Bs0, Ef, none).
-eval_filter(F, Bs0, Lf, Ef, CompFun, Acc) ->
+eval_filter(F, Bs0, Lf, Ef, CompFun, FUVs, Acc) ->
case erl_lint:is_guard_test(F) of
true ->
case guard_test(F, Bs0, Lf, Ef) of
@@ -771,11 +836,11 @@ eval_filter(F, Bs0, Lf, Ef, CompFun, Acc) ->
{value,false,_} -> Acc
end;
false ->
- case expr(F, Bs0, Lf, Ef, none) of
+ case expr(F, Bs0, Lf, Ef, none, FUVs) of
{value,true,Bs1} -> CompFun(Bs1);
{value,false,_} -> Acc;
- {value,V,_} ->
- erlang:raise(error, {bad_filter,V}, ?STACKTRACE)
+ {value,V,_} ->
+ apply_error({bad_filter,V}, ?STACKTRACE, element(2, F), Bs0, Ef, none)
end
end.
@@ -783,18 +848,18 @@ eval_filter(F, Bs0, Lf, Ef, CompFun, Acc) ->
%% ExternalFuncHandler) ->
%% {[{map_assoc | map_exact,Key,Value}],Bindings}
-eval_map_fields(Fs, Bs, Lf, Ef) ->
- eval_map_fields(Fs, Bs, Lf, Ef, []).
-
-eval_map_fields([{map_field_assoc,_,K0,V0}|Fs], Bs0, Lf, Ef, Acc) ->
- {value,K1,Bs1} = expr(K0, Bs0, Lf, Ef, none),
- {value,V1,Bs2} = expr(V0, Bs1, Lf, Ef, none),
- eval_map_fields(Fs, Bs2, Lf, Ef, [{map_assoc,K1,V1}|Acc]);
-eval_map_fields([{map_field_exact,_,K0,V0}|Fs], Bs0, Lf, Ef, Acc) ->
- {value,K1,Bs1} = expr(K0, Bs0, Lf, Ef, none),
- {value,V1,Bs2} = expr(V0, Bs1, Lf, Ef, none),
- eval_map_fields(Fs, Bs2, Lf, Ef, [{map_exact,K1,V1}|Acc]);
-eval_map_fields([], Bs, _Lf, _Ef, Acc) ->
+eval_map_fields(Fs, Bs, Lf, Ef, FUVs) ->
+ eval_map_fields(Fs, Bs, Lf, Ef, FUVs, []).
+
+eval_map_fields([{map_field_assoc,_,K0,V0}|Fs], Bs0, Lf, Ef, FUVs, Acc) ->
+ {value,K1,Bs1} = expr(K0, Bs0, Lf, Ef, none, FUVs),
+ {value,V1,Bs2} = expr(V0, Bs1, Lf, Ef, none, FUVs),
+ eval_map_fields(Fs, Bs2, Lf, Ef, FUVs, [{map_assoc,K1,V1}|Acc]);
+eval_map_fields([{map_field_exact,_,K0,V0}|Fs], Bs0, Lf, Ef, FUVs, Acc) ->
+ {value,K1,Bs1} = expr(K0, Bs0, Lf, Ef, none, FUVs),
+ {value,V1,Bs2} = expr(V0, Bs1, Lf, Ef, none, FUVs),
+ eval_map_fields(Fs, Bs2, Lf, Ef, FUVs, [{map_exact,K1,V1}|Acc]);
+eval_map_fields([], Bs, _Lf, _Ef, _FUVs, Acc) ->
{lists:reverse(Acc),Bs}.
@@ -810,48 +875,48 @@ ret_expr(V, Bs, none) ->
ret_expr(V, _Bs, RBs) when is_list(RBs); is_map(RBs) ->
{value,V,RBs}.
-%% eval_fun(Arguments, {Bindings,LocalFunctionHandler,
-%% ExternalFunctionHandler,Clauses}) -> Value
+%% eval_fun(Arguments, {Anno,Bindings,LocalFunctionHandler,
+%% ExternalFunctionHandler,FunUsedVars,Clauses}) -> Value
%% This function is called when the fun is called from compiled code
%% or from apply.
-eval_fun(As, {Bs0,Lf,Ef,Cs}) ->
- eval_fun(Cs, As, Bs0, Lf, Ef, value).
+eval_fun(As, {Anno,Bs0,Lf,Ef,FUVs,Cs}) ->
+ eval_fun(Cs, As, Anno, Bs0, Lf, Ef, value, FUVs).
-eval_fun([{clause,_,H,G,B}|Cs], As, Bs0, Lf, Ef, RBs) ->
- case match_list(H, As, new_bindings(Bs0), Bs0) of
+eval_fun([{clause,_,H,G,B}|Cs], As, Anno, Bs0, Lf, Ef, RBs, FUVs) ->
+ case match_list(H, As, Anno, new_bindings(Bs0), Bs0, Ef) of
{match,Bsn} -> % The new bindings for the head
Bs1 = add_bindings(Bsn, Bs0), % which then shadow!
case guard(G, Bs1, Lf, Ef) of
- true -> exprs(B, Bs1, Lf, Ef, RBs);
- false -> eval_fun(Cs, As, Bs0, Lf, Ef, RBs)
+ true -> exprs(B, Bs1, Lf, Ef, RBs, FUVs);
+ false -> eval_fun(Cs, As, Anno, Bs0, Lf, Ef, RBs, FUVs)
end;
nomatch ->
- eval_fun(Cs, As, Bs0, Lf, Ef, RBs)
+ eval_fun(Cs, As, Anno, Bs0, Lf, Ef, RBs, FUVs)
end;
-eval_fun([], As, _Bs, _Lf, _Ef, _RBs) ->
- erlang:raise(error, function_clause,
- [{?MODULE,'-inside-an-interpreted-fun-',As}|?STACKTRACE]).
+eval_fun([], As, Anno, Bs, _Lf, Ef, RBs, _FUVs) ->
+ Stack = [{?MODULE,'-inside-an-interpreted-fun-',As}|?STACKTRACE],
+ apply_error(function_clause, Stack, Anno, Bs, Ef, RBs).
-eval_named_fun(As, Fun, {Bs0,Lf,Ef,Cs,Name}) ->
- eval_named_fun(Cs, As, Bs0, Lf, Ef, Name, Fun, value).
+eval_named_fun(As, Fun, {Anno,Bs0,Lf,Ef,FUVs,Cs,Name}) ->
+ eval_named_fun(Cs, As, Anno, Bs0, Lf, Ef, Name, Fun, value, FUVs).
-eval_named_fun([{clause,_,H,G,B}|Cs], As, Bs0, Lf, Ef, Name, Fun, RBs) ->
+eval_named_fun([{clause,_,H,G,B}|Cs], As, Anno, Bs0, Lf, Ef, Name, Fun, RBs, FUVs) ->
Bs1 = add_binding(Name, Fun, Bs0),
- case match_list(H, As, new_bindings(Bs0), Bs1) of
+ case match_list(H, As, Anno, new_bindings(Bs0), Bs1, Ef) of
{match,Bsn} -> % The new bindings for the head
Bs2 = add_bindings(Bsn, Bs1), % which then shadow!
case guard(G, Bs2, Lf, Ef) of
- true -> exprs(B, Bs2, Lf, Ef, RBs);
- false -> eval_named_fun(Cs, As, Bs0, Lf, Ef, Name, Fun, RBs)
+ true -> exprs(B, Bs2, Lf, Ef, RBs, FUVs);
+ false -> eval_named_fun(Cs, As, Anno, Bs0, Lf, Ef, Name, Fun, RBs, FUVs)
end;
nomatch ->
- eval_named_fun(Cs, As, Bs0, Lf, Ef, Name, Fun, RBs)
+ eval_named_fun(Cs, As, Anno, Bs0, Lf, Ef, Name, Fun, RBs, FUVs)
end;
-eval_named_fun([], As, _Bs, _Lf, _Ef, _Name, _Fun, _RBs) ->
- erlang:raise(error, function_clause,
- [{?MODULE,'-inside-an-interpreted-fun-',As}|?STACKTRACE]).
+eval_named_fun([], As, Anno, Bs, _Lf, Ef, _Name, _Fun, RBs, _FUVs) ->
+ Stack = [{?MODULE,'-inside-an-interpreted-fun-',As}|?STACKTRACE],
+ apply_error(function_clause, Stack, Anno, Bs, Ef, RBs).
%% expr_list(ExpressionList, Bindings)
@@ -865,7 +930,7 @@ eval_named_fun([], As, _Bs, _Lf, _Ef, _Name, _Fun, _RBs) ->
ValueList :: [value()],
NewBindings :: binding_struct()).
expr_list(Es, Bs) ->
- expr_list(Es, Bs, none, none).
+ expr_list(Es, Bs, none, none, empty_fun_used_vars()).
-spec(expr_list(ExpressionList, Bindings, LocalFunctionHandler) ->
{ValueList, NewBindings} when
@@ -875,7 +940,7 @@ expr_list(Es, Bs) ->
ValueList :: [value()],
NewBindings :: binding_struct()).
expr_list(Es, Bs, Lf) ->
- expr_list(Es, Bs, Lf, none).
+ expr_list(Es, Bs, Lf, none, empty_fun_used_vars()).
-spec(expr_list(ExpressionList, Bindings, LocalFunctionHandler,
NonLocalFunctionHandler) ->
@@ -887,44 +952,47 @@ expr_list(Es, Bs, Lf) ->
ValueList :: [value()],
NewBindings :: binding_struct()).
expr_list(Es, Bs, Lf, Ef) ->
- expr_list(Es, [], Bs, Bs, Lf, Ef).
+ expr_list(Es, Bs, Lf, Ef, empty_fun_used_vars()).
-expr_list([E|Es], Vs, BsOrig, Bs0, Lf, Ef) ->
- {value,V,Bs1} = expr(E, BsOrig, Lf, Ef, none),
- expr_list(Es, [V|Vs], BsOrig, merge_bindings(Bs1, Bs0), Lf, Ef);
-expr_list([], Vs, _, Bs, _Lf, _Ef) ->
+expr_list(Es, Bs, Lf, Ef, FUVs) ->
+ expr_list(Es, [], Bs, Bs, Lf, Ef, FUVs).
+
+expr_list([E|Es], Vs, BsOrig, Bs0, Lf, Ef, FUVs) ->
+ {value,V,Bs1} = expr(E, BsOrig, Lf, Ef, none, FUVs),
+ expr_list(Es, [V|Vs], BsOrig, merge_bindings(Bs1, Bs0, element(2, E), Ef), Lf, Ef, FUVs);
+expr_list([], Vs, _, Bs, _Lf, _Ef, _FUVs) ->
{reverse(Vs),Bs}.
-eval_op(Op, Arg1, Arg2, Bs, Ef, RBs) ->
- do_apply(erlang, Op, [Arg1,Arg2], Bs, Ef, RBs).
+eval_op(Op, Arg1, Arg2, Anno, Bs, Ef, RBs) ->
+ do_apply(erlang, Op, [Arg1,Arg2], Anno, Bs, Ef, RBs).
-eval_op(Op, Arg, Bs, Ef, RBs) ->
- do_apply(erlang, Op, [Arg], Bs, Ef, RBs).
+eval_op(Op, Arg, Anno, Bs, Ef, RBs) ->
+ do_apply(erlang, Op, [Arg], Anno, Bs, Ef, RBs).
-%% if_clauses(Clauses, Bindings, LocalFuncHandler, ExtFuncHandler, RBs)
+%% if_clauses(Clauses, Anno, Bindings, LocalFuncHandler, ExtFuncHandler, RBs)
-if_clauses([{clause,_,[],G,B}|Cs], Bs, Lf, Ef, RBs) ->
+if_clauses([{clause,_,[],G,B}|Cs], Anno, Bs, Lf, Ef, RBs, FUVs) ->
case guard(G, Bs, Lf, Ef) of
- true -> exprs(B, Bs, Lf, Ef, RBs);
- false -> if_clauses(Cs, Bs, Lf, Ef, RBs)
+ true -> exprs(B, Bs, Lf, Ef, RBs, FUVs);
+ false -> if_clauses(Cs, Anno, Bs, Lf, Ef, RBs, FUVs)
end;
-if_clauses([], _Bs, _Lf, _Ef, _RBs) ->
- erlang:raise(error, if_clause, ?STACKTRACE).
+if_clauses([], Anno, Bs, _Lf, Ef, RBs, _FUVs) ->
+ apply_error(if_clause, ?STACKTRACE, Anno, Bs, Ef, RBs).
-%% try_clauses(Body, CaseClauses, CatchClauses, AfterBody, Bindings,
+%% try_clauses(Body, CaseClauses, CatchClauses, AfterBody, Anno, Bindings,
%% LocalFuncHandler, ExtFuncHandler, RBs)
-try_clauses(B, Cases, Catches, AB, Bs, Lf, Ef, RBs) ->
- check_stacktrace_vars(Catches, Bs),
- try exprs(B, Bs, Lf, Ef, none) of
+try_clauses(B, Cases, Catches, AB, Anno, Bs, Lf, Ef, RBs, FUVs) ->
+ check_stacktrace_vars(Catches, Anno, Bs, Ef, RBs),
+ try exprs(B, Bs, Lf, Ef, none, FUVs) of
{value,V,Bs1} when Cases =:= [] ->
ret_expr(V, Bs1, RBs);
{value,V,Bs1} ->
case match_clause(Cases, [V], Bs1, Lf, Ef) of
{B2,Bs2} ->
- exprs(B2, Bs2, Lf, Ef, RBs);
+ exprs(B2, Bs2, Lf, Ef, RBs, FUVs);
nomatch ->
- erlang:raise(error, {try_clause,V}, ?STACKTRACE)
+ apply_error({try_clause, V}, ?STACKTRACE, Anno, Bs, Ef, RBs)
end
catch
Class:Reason:Stacktrace when Catches =:= [] ->
@@ -933,63 +1001,63 @@ try_clauses(B, Cases, Catches, AB, Bs, Lf, Ef, RBs) ->
V = {Class,Reason,Stacktrace},
case match_clause(Catches, [V], Bs, Lf, Ef) of
{B2,Bs2} ->
- exprs(B2, Bs2, Lf, Ef, RBs);
+ exprs(B2, Bs2, Lf, Ef, RBs, FUVs);
nomatch ->
erlang:raise(Class, Reason, Stacktrace)
end
after
- if AB =:= [] ->
+ if AB =:= [] ->
Bs; % any
true ->
- exprs(AB, Bs, Lf, Ef, none)
+ exprs(AB, Bs, Lf, Ef, none, FUVs)
end
end.
-check_stacktrace_vars([{clause,_,[{tuple,_,[_,_,STV]}],_,_}|Cs], Bs) ->
+
+check_stacktrace_vars([{clause,_,[{tuple,_,[_,_,STV]}],_,_}|Cs], Anno, Bs, Ef, RBs) ->
case STV of
{var,_,V} ->
case binding(V, Bs) of
{value, _} ->
- erlang:raise(error, stacktrace_bound, ?STACKTRACE);
+ apply_error(stacktrace_bound, ?STACKTRACE, Anno, Bs, Ef, RBs);
unbound ->
- check_stacktrace_vars(Cs, Bs)
+ check_stacktrace_vars(Cs, Anno, Bs, Ef, RBs)
end;
_ ->
- erlang:raise(error,
- {illegal_stacktrace_variable,STV},
- ?STACKTRACE)
+ Reason = {illegal_stacktrace_variable,STV},
+ apply_error(Reason, ?STACKTRACE, Anno, Bs, Ef, RBs)
end;
-check_stacktrace_vars([], _Bs) ->
+check_stacktrace_vars([], _Anno, _Bs, _Ef, _RBs) ->
ok.
-%% case_clauses(Value, Clauses, Bindings, LocalFuncHandler, ExtFuncHandler,
-%% RBs)
+%% case_clauses(Value, Clauses, Anno, Bindings, LocalFuncHandler,
+%% ExtFuncHandler, RBs)
-case_clauses(Val, Cs, Bs, Lf, Ef, RBs) ->
+case_clauses(Val, Cs, Anno, Bs, Lf, Ef, RBs, FUVs) ->
case match_clause(Cs, [Val], Bs, Lf, Ef) of
{B, Bs1} ->
- exprs(B, Bs1, Lf, Ef, RBs);
+ exprs(B, Bs1, Lf, Ef, RBs, FUVs);
nomatch ->
- erlang:raise(error, {case_clause,Val}, ?STACKTRACE)
+ apply_error({case_clause,Val}, ?STACKTRACE, Anno, Bs, Ef, RBs)
end.
%%
-%% receive_clauses(Clauses, Bindings, LocalFuncHnd,ExtFuncHnd, RBs)
+%% receive_clauses(Clauses, Bindings, LocalFuncHnd, ExtFuncHnd, RBs)
%%
-receive_clauses(Cs, Bs, Lf, Ef, RBs) ->
- receive_clauses(infinity, Cs, unused, Bs, Lf, Ef, RBs).
+receive_clauses(Cs, Bs, Lf, Ef, RBs, FUVs) ->
+ receive_clauses(infinity, Cs, unused, Bs, Lf, Ef, RBs, FUVs).
%%
-%% receive_clauses(TimeOut, Clauses, TimeoutBody, Bindings,
+%% receive_clauses(TimeOut, Clauses, TimeoutBody, Bindings,
%% ExternalFuncHandler, LocalFuncHandler, RBs)
%%
-receive_clauses(T, Cs, TB, Bs, Lf, Ef, RBs) ->
+receive_clauses(T, Cs, TB, Bs, Lf, Ef, RBs, FUVs) ->
F = fun (M) -> match_clause(Cs, [M], Bs, Lf, Ef) end,
case prim_eval:'receive'(F, T) of
{B, Bs1} ->
- exprs(B, Bs1, Lf, Ef, RBs);
+ exprs(B, Bs1, Lf, Ef, RBs, FUVs);
timeout ->
{B, Bs1} = TB,
- exprs(B, Bs1, Lf, Ef, RBs)
+ exprs(B, Bs1, Lf, Ef, RBs, FUVs)
end.
%% match_clause -> {Body, Bindings} or nomatch
@@ -1006,8 +1074,8 @@ receive_clauses(T, Cs, TB, Bs, Lf, Ef, RBs) ->
match_clause(Cs, Vs, Bs, Lf) ->
match_clause(Cs, Vs, Bs, Lf, none).
-match_clause([{clause,_,H,G,B}|Cs], Vals, Bs, Lf, Ef) ->
- case match_list(H, Vals, Bs) of
+match_clause([{clause,Anno,H,G,B}|Cs], Vals, Bs, Lf, Ef) ->
+ case match_list(H, Vals, Anno, Bs, Bs, Ef) of
{match, Bs1} ->
case guard(G, Bs1, Lf, Ef) of
true -> {B, Bs1};
@@ -1045,7 +1113,7 @@ guard0([G|Gs], Bs0, Lf, Ef) ->
{value,false,_} -> false
end;
false ->
- erlang:raise(error, guard_expr, ?STACKTRACE)
+ apply_error(guard_expr, ?STACKTRACE, element(2, G), Bs0, Ef, none)
end;
guard0([], _Bs, _Lf, _Ef) -> true.
@@ -1068,7 +1136,7 @@ guard_test(G, Bs0, Lf, Ef) ->
expr_guard_test(G, Bs0, Lf, Ef) ->
try {value,true,_} = expr(G, Bs0, Lf, Ef, none)
catch error:_ -> {value,false,Bs0} end.
-
+
type_test(integer) -> is_integer;
type_test(float) -> is_float;
type_test(number) -> is_number;
@@ -1084,23 +1152,19 @@ type_test(record) -> is_record;
type_test(map) -> is_map;
type_test(Test) -> Test.
-
-%% match(Pattern, Term, Bindings) ->
-%% {match,NewBindings} | nomatch
+%% match(Pattern, Term, Anno, NewBindings, Bindings, ExternalFunHnd) ->
+%% {match,NewBindings} | nomatch
%% or erlang:error({illegal_pattern, Pattern}).
-%% Try to match Pattern against Term with the current bindings.
-
-match(Pat, Term, Bs) ->
- match(Pat, Term, Bs, Bs).
-
+%%
+%% Try to match Pattern against Term with the current bindings.
%% Bs are the bindings that are augmented with new bindings. BBs are
%% the bindings used for "binsize" variables (in <<X:Y>>, Y is a
%% binsize variable).
-match(Pat, Term, Bs, BBs) ->
- case catch match1(Pat, Term, Bs, BBs) of
+match(Pat, Term, Anno, Bs, BBs, Ef) ->
+ case catch match1(Pat, Term, Bs, BBs, Ef) of
invalid ->
- erlang:raise(error, {illegal_pattern,to_term(Pat)}, ?STACKTRACE);
+ apply_error({illegal_pattern,to_term(Pat)}, ?STACKTRACE, Anno, Bs, Ef, none);
Other ->
Other
end.
@@ -1109,29 +1173,29 @@ string_to_conses([], _, Tail) -> Tail;
string_to_conses([E|Rest], Anno, Tail) ->
{cons, Anno, {integer, Anno, E}, string_to_conses(Rest, Anno, Tail)}.
-match1({atom,_,A0}, A, Bs, _BBs) ->
+match1({atom,_,A0}, A, Bs, _BBs, _Ef) ->
case A of
A0 -> {match,Bs};
_ -> throw(nomatch)
end;
-match1({integer,_,I0}, I, Bs, _BBs) ->
+match1({integer,_,I0}, I, Bs, _BBs, _Ef) ->
case I of
I0 -> {match,Bs};
_ -> throw(nomatch)
end;
-match1({float,_,F0}, F, Bs, _BBs) ->
+match1({float,_,F0}, F, Bs, _BBs, _Ef) ->
case F of
F0 -> {match,Bs};
_ -> throw(nomatch)
end;
-match1({char,_,C0}, C, Bs, _BBs) ->
+match1({char,_,C0}, C, Bs, _BBs, _Ef) ->
case C of
C0 -> {match,Bs};
_ -> throw(nomatch)
end;
-match1({var,_,'_'}, _, Bs, _BBs) -> %Anonymous variable matches
+match1({var,_,'_'}, _, Bs, _BBs, _Ef) -> %Anonymous variable matches
{match,Bs}; % everything, no new bindings
-match1({var,_,Name}, Term, Bs, _BBs) ->
+match1({var,_,Name}, Term, Bs, _BBs, _Ef) ->
case binding(Name, Bs) of
{value,Term} ->
{match,Bs};
@@ -1140,34 +1204,34 @@ match1({var,_,Name}, Term, Bs, _BBs) ->
unbound ->
{match,add_binding(Name, Term, Bs)}
end;
-match1({match,_,Pat1,Pat2}, Term, Bs0, BBs) ->
- {match, Bs1} = match1(Pat1, Term, Bs0, BBs),
- match1(Pat2, Term, Bs1, BBs);
-match1({string,_,S0}, S, Bs, _BBs) ->
+match1({match,_,Pat1,Pat2}, Term, Bs0, BBs, Ef) ->
+ {match, Bs1} = match1(Pat1, Term, Bs0, BBs, Ef),
+ match1(Pat2, Term, Bs1, BBs, Ef);
+match1({string,_,S0}, S, Bs, _BBs, _Ef) ->
case S of
S0 -> {match,Bs};
_ -> throw(nomatch)
end;
-match1({nil,_}, Nil, Bs, _BBs) ->
+match1({nil,_}, Nil, Bs, _BBs, _Ef) ->
case Nil of
[] -> {match,Bs};
_ -> throw(nomatch)
end;
-match1({cons,_,H,T}, [H1|T1], Bs0, BBs) ->
- {match,Bs} = match1(H, H1, Bs0, BBs),
- match1(T, T1, Bs, BBs);
-match1({cons,_,_,_}, _, _Bs, _BBs) ->
+match1({cons,_,H,T}, [H1|T1], Bs0, BBs, Ef) ->
+ {match,Bs} = match1(H, H1, Bs0, BBs, Ef),
+ match1(T, T1, Bs, BBs, Ef);
+match1({cons,_,_,_}, _, _Bs, _BBs, _Ef) ->
throw(nomatch);
-match1({tuple,_,Elts}, Tuple, Bs, BBs)
+match1({tuple,_,Elts}, Tuple, Bs, BBs, Ef)
when length(Elts) =:= tuple_size(Tuple) ->
- match_tuple(Elts, Tuple, 1, Bs, BBs);
-match1({tuple,_,_}, _, _Bs, _BBs) ->
+ match_tuple(Elts, Tuple, 1, Bs, BBs, Ef);
+match1({tuple,_,_}, _, _Bs, _BBs, _Ef) ->
throw(nomatch);
-match1({map,_,Fs}, #{}=Map, Bs, BBs) ->
- match_map(Fs, Map, Bs, BBs);
-match1({map,_,_}, _, _Bs, _BBs) ->
+match1({map,_,Fs}, #{}=Map, Bs, BBs, Ef) ->
+ match_map(Fs, Map, Bs, BBs, Ef);
+match1({map,_,_}, _, _Bs, _BBs, _Ef) ->
throw(nomatch);
-match1({bin, _, Fs}, <<_/bitstring>>=B, Bs0, BBs) ->
+match1({bin, _, Fs}, <<_/bitstring>>=B, Bs0, BBs, Ef) ->
EvalFun = fun(E, Bs) ->
case erl_lint:is_guard_expr(E) of
true -> ok;
@@ -1180,74 +1244,72 @@ match1({bin, _, Fs}, <<_/bitstring>>=B, Bs0, BBs) ->
throw(invalid)
end
end,
- eval_bits:match_bits(Fs, B, Bs0, BBs, match_fun(BBs), EvalFun);
-match1({bin,_,_}, _, _Bs, _BBs) ->
+ ErrorFun = fun(A, R, S) -> apply_error(R, S, A, Bs0, Ef, none) end,
+ eval_bits:match_bits(Fs, B, Bs0, BBs, match_fun(BBs, Ef), EvalFun, ErrorFun);
+match1({bin,_,_}, _, _Bs, _BBs, _Ef) ->
throw(nomatch);
-match1({op,_,'++',{nil,_},R}, Term, Bs, BBs) ->
- match1(R, Term, Bs, BBs);
-match1({op,_,'++',{cons,Ai,{integer,A2,I},T},R}, Term, Bs, BBs) ->
- match1({cons,Ai,{integer,A2,I},{op,Ai,'++',T,R}}, Term, Bs, BBs);
-match1({op,_,'++',{cons,Ai,{char,A2,C},T},R}, Term, Bs, BBs) ->
- match1({cons,Ai,{char,A2,C},{op,Ai,'++',T,R}}, Term, Bs, BBs);
-match1({op,_,'++',{string,Ai,L},R}, Term, Bs, BBs) ->
- match1(string_to_conses(L, Ai, R), Term, Bs, BBs);
-match1({op,Anno,Op,A}, Term, Bs, BBs) ->
+match1({op,_,'++',{nil,_},R}, Term, Bs, BBs, Ef) ->
+ match1(R, Term, Bs, BBs, Ef);
+match1({op,_,'++',{cons,Ai,{integer,A2,I},T},R}, Term, Bs, BBs, Ef) ->
+ match1({cons,Ai,{integer,A2,I},{op,Ai,'++',T,R}}, Term, Bs, BBs, Ef);
+match1({op,_,'++',{cons,Ai,{char,A2,C},T},R}, Term, Bs, BBs, Ef) ->
+ match1({cons,Ai,{char,A2,C},{op,Ai,'++',T,R}}, Term, Bs, BBs, Ef);
+match1({op,_,'++',{string,Ai,L},R}, Term, Bs, BBs, Ef) ->
+ match1(string_to_conses(L, Ai, R), Term, Bs, BBs, Ef);
+match1({op,Anno,Op,A}, Term, Bs, BBs, Ef) ->
case partial_eval({op,Anno,Op,A}) of
{op,Anno,Op,A} ->
throw(invalid);
X ->
- match1(X, Term, Bs, BBs)
+ match1(X, Term, Bs, BBs, Ef)
end;
-match1({op,Anno,Op,L,R}, Term, Bs, BBs) ->
+match1({op,Anno,Op,L,R}, Term, Bs, BBs, Ef) ->
case partial_eval({op,Anno,Op,L,R}) of
{op,Anno,Op,L,R} ->
throw(invalid);
X ->
- match1(X, Term, Bs, BBs)
+ match1(X, Term, Bs, BBs, Ef)
end;
-match1(_, _, _Bs, _BBs) ->
+match1(_, _, _Bs, _BBs, _Ef) ->
throw(invalid).
-match_fun(BBs) ->
- fun(match, {L,R,Bs}) -> match1(L, R, Bs, BBs);
+match_fun(BBs, Ef) ->
+ fun(match, {L,R,Bs}) -> match1(L, R, Bs, BBs, Ef);
(binding, {Name,Bs}) -> binding(Name, Bs);
(add_binding, {Name,Val,Bs}) -> add_binding(Name, Val, Bs)
end.
-match_tuple([E|Es], Tuple, I, Bs0, BBs) ->
- {match,Bs} = match1(E, element(I, Tuple), Bs0, BBs),
- match_tuple(Es, Tuple, I+1, Bs, BBs);
-match_tuple([], _, _, Bs, _BBs) ->
+match_tuple([E|Es], Tuple, I, Bs0, BBs, Ef) ->
+ {match,Bs} = match1(E, element(I, Tuple), Bs0, BBs, Ef),
+ match_tuple(Es, Tuple, I+1, Bs, BBs, Ef);
+match_tuple([], _, _, Bs, _BBs, _Ef) ->
{match,Bs}.
-match_map([{map_field_exact, _, K, V}|Fs], Map, Bs0, BBs) ->
+match_map([{map_field_exact, _, K, V}|Fs], Map, Bs0, BBs, Ef) ->
Vm = try
{value, Ke, _} = expr(K, BBs),
maps:get(Ke,Map)
catch error:_ ->
throw(nomatch)
end,
- {match, Bs} = match1(V, Vm, Bs0, BBs),
- match_map(Fs, Map, Bs, BBs);
-match_map([], _, Bs, _) ->
+ {match, Bs} = match1(V, Vm, Bs0, BBs, Ef),
+ match_map(Fs, Map, Bs, BBs, Ef);
+match_map([], _, Bs, _, _) ->
{match, Bs}.
-%% match_list(PatternList, TermList, Bindings) ->
+%% match_list(PatternList, TermList, Anno, NewBindings, Bindings, ExternalFunHnd) ->
%% {match,NewBindings} | nomatch
%% Try to match a list of patterns against a list of terms with the
%% current bindings.
-match_list(Ps, Ts, Bs) ->
- match_list(Ps, Ts, Bs, Bs).
-
-match_list([P|Ps], [T|Ts], Bs0, BBs) ->
- case match(P, T, Bs0, BBs) of
- {match,Bs1} -> match_list(Ps, Ts, Bs1, BBs);
+match_list([P|Ps], [T|Ts], Anno, Bs0, BBs, Ef) ->
+ case match(P, T, Anno, Bs0, BBs, Ef) of
+ {match,Bs1} -> match_list(Ps, Ts, Anno, Bs1, BBs, Ef);
nomatch -> nomatch
end;
-match_list([], [], Bs, _BBs) ->
+match_list([], [], _Anno, Bs, _BBs, _Ef) ->
{match,Bs};
-match_list(_, _, _Bs, _BBs) ->
+match_list(_, _, _Anno, _Bs, _BBs, _Ef) ->
nomatch.
%% new_bindings()
@@ -1296,17 +1358,17 @@ add_bindings(Bs1, Bs2) ->
foldl(fun ({Name,Val}, Bs) -> orddict:store(Name, Val, Bs) end,
Bs2, orddict:to_list(Bs1)).
-merge_bindings(Bs1, Bs2) when is_map(Bs1), is_map(Bs2) ->
+merge_bindings(Bs1, Bs2, Anno, Ef) when is_map(Bs1), is_map(Bs2) ->
maps:merge_with(fun
(_K, V, V) -> V;
- (_K, _, V) -> erlang:raise(error, {badmatch,V}, ?STACKTRACE)
+ (_K, _, V) -> apply_error({badmatch,V}, ?STACKTRACE, Anno, Bs1, Ef, none)
end, Bs2, Bs1);
-merge_bindings(Bs1, Bs2) ->
+merge_bindings(Bs1, Bs2, Anno, Ef) ->
foldl(fun ({Name,Val}, Bs) ->
case orddict:find(Name, Bs) of
{ok,Val} -> Bs; %Already with SAME value
- {ok,V1} ->
- erlang:raise(error, {badmatch,V1}, ?STACKTRACE);
+ {ok,V1} ->
+ apply_error({badmatch,V1}, ?STACKTRACE, Anno, Bs1, Ef, none);
error -> orddict:store(Name, Val, Bs)
end end,
Bs2, orddict:to_list(Bs1)).
@@ -1323,28 +1385,6 @@ to_terms(Abstrs) ->
to_term(Abstr) ->
erl_parse:anno_to_term(Abstr).
-%% Substitute {value, A, Item} for {var, A, Var}, preserving A.
-%% {value, A, Item} is a shell/erl_eval convention, and for example
-%% the linter cannot handle it.
-
--spec subst_values_for_vars(ExprList, Bindings) -> [term()] when
- ExprList :: [erl_parse:abstract_expr()],
- Bindings :: binding_struct().
-
-subst_values_for_vars({var, A, V}=Var, Bs) ->
- case erl_eval:binding(V, Bs) of
- {value, Value} ->
- {value, A, Value};
- unbound ->
- Var
- end;
-subst_values_for_vars(L, Bs) when is_list(L) ->
- [subst_values_for_vars(E, Bs) || E <- L];
-subst_values_for_vars(T, Bs) when is_tuple(T) ->
- list_to_tuple(subst_values_for_vars(tuple_to_list(T), Bs));
-subst_values_for_vars(T, _Bs) ->
- T.
-
%% `Tokens' is assumed to have been scanned with the 'text' option.
%% The annotations of the returned expressions are locations.
%%
@@ -1353,18 +1393,17 @@ subst_values_for_vars(T, _Bs) ->
%% the items themselves are stored in the returned bindings.
-spec extended_parse_exprs(Tokens) ->
- {'ok', ExprList, Bindings} | {'error', ErrorInfo} when
+ {'ok', ExprList} | {'error', ErrorInfo} when
Tokens :: [erl_scan:token()],
ExprList :: [erl_parse:abstract_expr()],
- Bindings :: erl_eval:binding_struct(),
ErrorInfo :: erl_parse:error_info().
extended_parse_exprs(Tokens) ->
Ts = tokens_fixup(Tokens),
case erl_parse:parse_exprs(Ts) of
{ok, Exprs0} ->
- {Exprs, Bs} = expr_fixup(Exprs0),
- {ok, reset_expr_anno(Exprs), Bs};
+ Exprs = expr_fixup(Exprs0),
+ {ok, reset_expr_anno(Exprs)};
_ErrorInfo ->
erl_parse:parse_exprs(reset_token_anno(Ts))
end.
@@ -1382,7 +1421,7 @@ tokens_fixup([T|Ts]=Ts0) ->
token_fixup(Ts) ->
{AnnoL, NewTs, FixupTag} = unscannable(Ts),
String = lists:append([erl_anno:text(A) || A <- AnnoL]),
- _ = (fixup_fun(FixupTag))(String),
+ _ = validate_tag(FixupTag, String),
NewAnno = erl_anno:set_text(fixup_text(FixupTag), hd(AnnoL)),
{{string, NewAnno, String}, NewTs}.
@@ -1403,37 +1442,26 @@ unscannable([{'#', A1}, {var, A2, 'Ref'}, {'<', A3}, {float, A4, _},
{'.', A5}, {float, A6, _}, {'>', A7}|Ts]) ->
{[A1, A2, A3, A4, A5, A6, A7], Ts, reference}.
-expr_fixup(Expr0) ->
- {Expr, Bs, _} = expr_fixup(Expr0, erl_eval:new_bindings(), 1),
- {Expr, Bs}.
-
-expr_fixup({string,A,S}=T, Bs0, I) ->
- try string_fixup(A, S) of
- Value ->
- Var = new_var(I),
- Bs = erl_eval:add_binding(Var, Value, Bs0),
- {{var, A, Var}, Bs, I+1}
+expr_fixup({string,A,S}=T) ->
+ try string_fixup(A, S, T) of
+ Expr -> Expr
catch
- _:_ ->
- {T, Bs0, I}
+ _:_ -> T
end;
-expr_fixup(Tuple, Bs0, I0) when is_tuple(Tuple) ->
- {L, Bs, I} = expr_fixup(tuple_to_list(Tuple), Bs0, I0),
- {list_to_tuple(L), Bs, I};
-expr_fixup([E0|Es0], Bs0, I0) ->
- {E, Bs1, I1} = expr_fixup(E0, Bs0, I0),
- {Es, Bs, I} = expr_fixup(Es0, Bs1, I1),
- {[E|Es], Bs, I};
-expr_fixup(T, Bs, I) ->
- {T, Bs, I}.
-
-string_fixup(A, S) ->
- Text = erl_anno:text(A),
- FixupTag = fixup_tag(Text, S),
- (fixup_fun(FixupTag))(S).
-
-new_var(I) ->
- list_to_atom(lists:concat(['__ExtendedParseExprs_', I, '__'])).
+expr_fixup(Tuple) when is_tuple(Tuple) ->
+ L = expr_fixup(tuple_to_list(Tuple)),
+ list_to_tuple(L);
+expr_fixup([E0|Es0]) ->
+ E = expr_fixup(E0),
+ Es = expr_fixup(Es0),
+ [E|Es];
+expr_fixup(T) ->
+ T.
+
+string_fixup(Anno, String, Token) ->
+ Text = erl_anno:text(Anno),
+ FixupTag = fixup_tag(Text, String),
+ fixup_ast(FixupTag, Anno, String, Token).
reset_token_anno(Tokens) ->
[setelement(2, T, (reset_anno())(element(2, T))) || T <- Tokens].
@@ -1444,18 +1472,15 @@ reset_expr_anno(Exprs) ->
reset_anno() ->
fun(A) -> erl_anno:new(erl_anno:location(A)) end.
-fixup_fun(function) -> fun function/1;
-fixup_fun(pid) -> fun erlang:list_to_pid/1;
-fixup_fun(port) -> fun erlang:list_to_port/1;
-fixup_fun(reference) -> fun erlang:list_to_ref/1.
-
-function(S) ->
- %% External function.
- {ok, [_, _, _,
- {atom, _, Module}, _,
- {atom, _, Function}, _,
- {integer, _, Arity}|_], _} = erl_scan:string(S),
- erlang:make_fun(Module, Function, Arity).
+fixup_ast(pid, A, _S, T) ->
+ {call,A,{remote,A,{atom,A,erlang},{atom,A,list_to_pid}},[T]};
+fixup_ast(port, A, _S, T) ->
+ {call,A,{remote,A,{atom,A,erlang},{atom,A,list_to_port}},[T]};
+fixup_ast(reference, A, _S, T) ->
+ {call,A,{remote,A,{atom,A,erlang},{atom,A,list_to_ref}},[T]};
+fixup_ast(function, A, S, _T) ->
+ {Module, Function, Arity} = fixup_mfa(S),
+ {'fun',A,{function,{atom,A,Module},{atom,A,Function},{integer,A,Arity}}}.
fixup_text(function) -> "function";
fixup_text(pid) -> "pid";
@@ -1467,6 +1492,20 @@ fixup_tag("pid", "<"++_) -> pid;
fixup_tag("port", "#"++_) -> port;
fixup_tag("reference", "#"++_) -> reference.
+fixup_mfa(S) ->
+ {ok, [_, _, _,
+ {atom, _, Module}, _,
+ {atom, _, Function}, _,
+ {integer, _, Arity}|_], _} = erl_scan:string(S),
+ {Module, Function, Arity}.
+
+validate_tag(pid, String) -> erlang:list_to_pid(String);
+validate_tag(port, String) -> erlang:list_to_port(String);
+validate_tag(reference, String) -> erlang:list_to_ref(String);
+validate_tag(function, String) ->
+ {Module, Function, Arity} = fixup_mfa(String),
+ erlang:make_fun(Module, Function, Arity).
+
%%% End of extended_parse_exprs.
%% `Tokens' is assumed to have been scanned with the 'text' option.
@@ -1481,8 +1520,8 @@ fixup_tag("reference", "#"++_) -> reference.
extended_parse_term(Tokens) ->
case extended_parse_exprs(Tokens) of
- {ok, [Expr], Bindings} ->
- try normalise(Expr, Bindings) of
+ {ok, [Expr]} ->
+ try normalise(Expr) of
Term ->
{ok, Term}
catch
@@ -1490,7 +1529,7 @@ extended_parse_term(Tokens) ->
Loc = erl_anno:location(element(2, Expr)),
{error,{Loc,?MODULE,"bad term"}}
end;
- {ok, [_,Expr|_], _Bindings} ->
+ {ok, [_,Expr|_]} ->
Loc = erl_anno:location(element(2, Expr)),
{error,{Loc,?MODULE,"bad term"}};
{error, _} = Error ->
@@ -1498,46 +1537,47 @@ extended_parse_term(Tokens) ->
end.
%% From erl_parse.
-normalise({var, _, V}, Bs) ->
- {value, Value} = erl_eval:binding(V, Bs),
- Value;
-normalise({char,_,C}, _Bs) -> C;
-normalise({integer,_,I}, _Bs) -> I;
-normalise({float,_,F}, _Bs) -> F;
-normalise({atom,_,A}, _Bs) -> A;
-normalise({string,_,S}, _Bs) -> S;
-normalise({nil,_}, _Bs) -> [];
-normalise({bin,_,Fs}, Bs) ->
+normalise({char,_,C}) -> C;
+normalise({integer,_,I}) -> I;
+normalise({float,_,F}) -> F;
+normalise({atom,_,A}) -> A;
+normalise({string,_,S}) -> S;
+normalise({nil,_}) -> [];
+normalise({bin,_,Fs}) ->
{value, B, _} =
eval_bits:expr_grp(Fs, [],
fun(E, _) ->
- {value, normalise(E, Bs), []}
- end, [], true),
+ {value, normalise(E), []}
+ end),
B;
-normalise({cons,_,Head,Tail}, Bs) ->
- [normalise(Head, Bs)|normalise(Tail, Bs)];
-normalise({tuple,_,Args}, Bs) ->
- list_to_tuple(normalise_list(Args, Bs));
-normalise({map,_,Pairs}, Bs) ->
+normalise({cons,_,Head,Tail}) ->
+ [normalise(Head)|normalise(Tail)];
+normalise({tuple,_,Args}) ->
+ list_to_tuple(normalise_list(Args));
+normalise({map,_,Pairs}) ->
maps:from_list(lists:map(fun
%% only allow '=>'
({map_field_assoc,_,K,V}) ->
- {normalise(K, Bs),normalise(V, Bs)}
+ {normalise(K),normalise(V)}
end, Pairs));
%% Special case for unary +/-.
-normalise({op,_,'+',{char,_,I}}, _Bs) -> I;
-normalise({op,_,'+',{integer,_,I}}, _Bs) -> I;
-normalise({op,_,'+',{float,_,F}}, _Bs) -> F;
-normalise({op,_,'-',{char,_,I}}, _Bs) -> -I; %Weird, but compatible!
-normalise({op,_,'-',{integer,_,I}}, _Bs) -> -I;
-normalise({op,_,'-',{float,_,F}}, _Bs) -> -F;
-normalise({'fun',_,{function,{atom,_,M},{atom,_,F},{integer,_,A}}}, _Bs) ->
+normalise({op,_,'+',{char,_,I}}) -> I;
+normalise({op,_,'+',{integer,_,I}}) -> I;
+normalise({op,_,'+',{float,_,F}}) -> F;
+normalise({op,_,'-',{char,_,I}}) -> -I; %Weird, but compatible!
+normalise({op,_,'-',{integer,_,I}}) -> -I;
+normalise({op,_,'-',{float,_,F}}) -> -F;
+%% Special case for #...<>
+normalise({call,_,{remote,_,{atom,_,erlang},{atom,_,Fun}},[{string,_,S}]}) when
+ Fun =:= list_to_ref; Fun =:= list_to_port; Fun =:= list_to_pid ->
+ erlang:Fun(S);
+normalise({'fun',_,{function,{atom,_,M},{atom,_,F},{integer,_,A}}}) ->
%% Since "#Fun<M.F.A>" is recognized, "fun M:F/A" should be too.
fun M:F/A.
-normalise_list([H|T], Bs) ->
- [normalise(H, Bs)|normalise_list(T, Bs)];
-normalise_list([], _Bs) ->
+normalise_list([H|T]) ->
+ [normalise(H)|normalise_list(T)];
+normalise_list([]) ->
[].
%%----------------------------------------------------------------------------
diff --git a/lib/stdlib/src/erl_expand_records.erl b/lib/stdlib/src/erl_expand_records.erl
index 4c8ba0578b..5a720b00f3 100644
--- a/lib/stdlib/src/erl_expand_records.erl
+++ b/lib/stdlib/src/erl_expand_records.erl
@@ -406,6 +406,17 @@ expr({'try',Anno,Es0,Scs0,Ccs0,As0}, St0) ->
expr({'catch',Anno,E0}, St0) ->
{E,St1} = expr(E0, St0),
{{'catch',Anno,E},St1};
+expr({'maybe',MaybeAnno,Es0}, St0) ->
+ {Es,St1} = exprs(Es0, St0),
+ {{'maybe',MaybeAnno,Es},St1};
+expr({'maybe',MaybeAnno,Es0,{'else',ElseAnno,Cs0}}, St0) ->
+ {Es,St1} = exprs(Es0, St0),
+ {Cs,St2} = clauses(Cs0, St1),
+ {{'maybe',MaybeAnno,Es,{'else',ElseAnno,Cs}},St2};
+expr({maybe_match,Anno,P0,E0}, St0) ->
+ {E,St1} = expr(E0, St0),
+ {P,St2} = pattern(P0, St1),
+ {{maybe_match,Anno,P,E},St2};
expr({match,Anno,P0,E0}, St0) ->
{E,St1} = expr(E0, St0),
{P,St2} = pattern(P0, St1),
@@ -595,11 +606,11 @@ strict_get_record_field(Anno, R, {atom,_,F}=Index, Name, St0) ->
RAnno = mark_record(NAnno, St),
E = {'case',Anno,R,
[{clause,NAnno,[{tuple,RAnno,P}],[],[Var]},
- {clause,NAnno,[{var,NAnno,'_'}],[],
+ {clause,NAnno,[Var],[],
[{call,NAnno,{remote,NAnno,
{atom,NAnno,erlang},
{atom,NAnno,error}},
- [{tuple,NAnno,[{atom,NAnno,badrecord},{atom,NAnno,Name}]}]}]}]},
+ [{tuple,NAnno,[{atom,NAnno,badrecord},Var]}]}]}]},
expr(E, St);
true -> %In a guard.
Fs = record_fields(Name, Anno, St0),
@@ -714,7 +725,7 @@ record_match(R, Name, AnnoR, Fs, Us, St0) ->
[{clause,AnnoR,[{tuple,RAnno,[{atom,AnnoR,Name} | Ps]}],[],
[{tuple,RAnno,[{atom,AnnoR,Name} | News]}]},
{clause,NAnnoR,[{var,NAnnoR,'_'}],[],
- [call_error(NAnnoR, {tuple,NAnnoR,[{atom,NAnnoR,badrecord},{atom,NAnnoR,Name}]})]}
+ [call_error(NAnnoR, {tuple,NAnnoR,[{atom,NAnnoR,badrecord},R]})]}
]},
St1}.
@@ -752,7 +763,7 @@ record_setel(R, Name, Fs, Us0) ->
{atom,Anno,setelement}},[I,Acc,Val]} end,
R, Us)]},
{clause,NAnnoR,[{var,NAnnoR,'_'}],[],
- [call_error(NAnnoR, {tuple,NAnnoR,[{atom,NAnnoR,badrecord},{atom,NAnnoR,Name}]})]}]}.
+ [call_error(NAnnoR, {tuple,NAnnoR,[{atom,NAnnoR,badrecord},R]})]}]}.
%% Expand a call to record_info/2. We have checked that it is not
%% shadowed by an import.
diff --git a/lib/stdlib/src/erl_features.erl b/lib/stdlib/src/erl_features.erl
new file mode 100644
index 0000000000..e969293a92
--- /dev/null
+++ b/lib/stdlib/src/erl_features.erl
@@ -0,0 +1,572 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2021-2022. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(erl_features).
+
+%% FIXME divide the exported functions in public and internal for the
+%% sake of documentation.
+-export([features/0,
+ feature_info/1,
+ collect_features/1,
+ short/1,
+ long/1,
+ enabled_features/0,
+ is_valid_feature/1,
+ load_allowed/1,
+ keywords/0,
+ keywords/1,
+ keyword_fun/2,
+ keyword_fun/4,
+ enable_feature/1,
+ disable_feature/1,
+ format_error/1,
+ format_error/2]).
+
+-export([features_used/1]).
+
+-type type() :: 'extension' | 'backwards_incompatible_change'.
+-type status() :: 'experimental'
+ | 'approved'
+ | 'permanent'
+ | 'rejected'.
+-type release() :: non_neg_integer().
+-type error() :: {?MODULE, {'invalid_features', [atom()]}}.
+
+-define(VALID_FEATURE(Feature),
+ (case is_valid_feature(Feature) of
+ false ->
+ error(invalid_feature, [Feature],
+ [{error_info,
+ #{module => ?MODULE,
+ cause => #{1 => "unknown feature"}}}]);
+ true -> ok
+ end)).
+
+%% Specification about currently known features.
+feature_specs() ->
+ #{maybe_expr =>
+ #{short => "Value based error handling (EEP49)",
+ description =>
+ "Implementation of the maybe expression proposed in EEP49 -- "
+ "Value based error handling.",
+ status => experimental,
+ experimental => 25,
+ keywords => ['maybe', 'else'],
+ type => extension}}.
+
+%% Currently known features
+-spec features() -> [atom()].
+features() ->
+ Map = case persistent_term:get({?MODULE, feature_specs}, none) of
+ none -> init_specs();
+ M -> M
+ end,
+ maps:keys(Map).
+
+is_valid_feature(Ftr) ->
+ lists:member(Ftr, features()).
+
+-spec short(atom()) -> iolist().
+short(Feature) ->
+ #{short := Short,
+ status := Status} = Info = feature_info(Feature),
+ #{Status := Release} = Info,
+ io_lib:format("~-40s ~-12s (~p)", [Short, Status, Release]).
+
+long(Feature) ->
+ #{short := Short,
+ description := Description,
+ status := Status,
+ keywords := Keywords,
+ type := Type} = Info = feature_info(Feature),
+ StatusFmt = " ~-10s ~-12s (~p)\n",
+ History = [io_lib:format(StatusFmt, [T, S, R])
+ || {T, S, R} <- history(Status, Info)],
+ KeywordsStrs =
+ if Keywords == [] -> "";
+ true ->
+ io_lib:format(" ~-10s ~p\n", ["Keywords", Keywords])
+ end,
+ Lines = [{"~s - ~s\n", [Feature, Short]},
+ {" ~-10s ~s\n", ["Type", Type]},
+ {"~s", [History]},
+ {"~s", [KeywordsStrs]},
+ {"\n~s\n", [nqTeX(Description)]}],
+ [io_lib:format(FStr, Args) || {FStr, Args} <- Lines].
+
+history(Current, Info) ->
+ G = fun(Key, S) ->
+ case maps:find(Key, Info) of
+ error -> [];
+ {ok, R} -> [{S, Key, R}]
+ end
+ end,
+ F = fun(Key) -> G(Key, "") end,
+ History =
+ case Current of
+ experimental -> [];
+ rejected -> F(experimental);
+ approved -> F(experimental);
+ permanent -> F(approved) ++ F(experimental)
+ end,
+ G(Current, "Status") ++ History.
+
+%% Dead simple line breaking for better presentation.
+nqTeX(String) ->
+ Words = string:tokens(String, " "),
+ WithLens = lists:map(fun(W) -> {W, length(W)} end, Words),
+ adjust(WithLens).
+
+adjust(WLs) ->
+ adjust(0, WLs, []).
+
+adjust(_, [], Ws) ->
+ lists:reverse(tl(Ws));
+adjust(Col, [{W, L}| WLs], Ws) ->
+ case Col + L > 72 of
+ true ->
+ lists:reverse(["\n"| tl(Ws)])
+ ++ adjust(L+1, WLs, [" ", W]);
+ false ->
+ adjust(Col + L + 1, WLs, [" ", W| Ws])
+ end.
+
+
+-spec feature_info(atom()) -> FeatureInfoMap | no_return()
+ when
+ Description :: string(),
+ FeatureInfoMap ::
+ #{description := Description,
+ short := Description,
+ type := type(),
+ keywords := [atom()],
+ status := status(),
+ experimental => release(),
+ approved => release(),
+ permanent => release(),
+ rejected => release()
+ }.
+feature_info(Feature) ->
+ ?VALID_FEATURE(Feature),
+
+ Map = persistent_term:get({?MODULE, feature_specs}),
+ maps:get(Feature, Map).
+
+%% New keywords for a feature. The current set is just for
+%% tests and development.
+-spec keywords(atom()) -> [atom()].
+keywords(Ftr) ->
+ ?VALID_FEATURE(Ftr),
+
+ #{keywords := Keywords} = feature_info(Ftr),
+ Keywords.
+
+%% Internal - Ftr is valid
+keywords(Ftr, Map) ->
+ maps:get(keywords, maps:get(Ftr, Map)).
+
+%% Utilities
+%% Returns list of enabled features and a new keywords function
+%% -spec keyword_fun_add_feature(atom(), fun((atom()) -> boolean())) ->
+%% {'ok', fun((atom()) -> boolean())}
+%% | {'error', error()}.
+keyword_fun(Opts, KeywordFun) ->
+ %% Get items enabling or disabling features, preserving order.
+ IsFtr = fun({enable_feature, _}) -> true;
+ ({disable_feature, _}) -> true;
+ (_) -> false
+ end,
+ FeatureOps = lists:filter(IsFtr, Opts),
+ {AddFeatures, DelFeatures} = collect_features(FeatureOps),
+ %% FIXME check that all features are known at this stage so we
+ %% don't miss out on reporting any unknown features.
+
+ case keyword_fun_add_features(AddFeatures, KeywordFun) of
+ {ok, Fun} ->
+ case keyword_fun_remove_features(DelFeatures, Fun) of
+ {ok, FunX} ->
+ {ok, {AddFeatures -- DelFeatures, FunX}};
+ {error, _} = Error ->
+ %% FIXME We are missing potential incorrect
+ %% features being disabled
+ Error
+ end;
+ {error, _} = Error ->
+ Error
+ end.
+
+%% -spec keyword_fun_add_feature(atom(), fun((atom()) -> boolean())) ->
+%% {'ok', fun((atom()) -> boolean())}
+%% | {'error', error()}.
+keyword_fun(Ind, Feature, Ftrs, KeywordFun) ->
+ case is_valid_feature(Feature) of
+ true ->
+ case Ind of
+ enable ->
+ {ok,
+ add_feature(Feature, KeywordFun),
+ [Feature | Ftrs]};
+ disable ->
+ {ok,
+ remove_feature(Feature, KeywordFun),
+ Ftrs -- [Feature]}
+ end;
+ false ->
+ {error, {?MODULE, {invalid_features, [Feature]}}}
+ end.
+
+%% FIXME Rename this to reflect that it returns a function!
+add_feature(Feature, F) ->
+ Words = keywords(Feature),
+ fun(Word) ->
+ lists:member(Word, Words)
+ orelse F(Word)
+ end.
+
+%% FIXME Rename this to reflect that it returns a function!
+remove_feature(Feature, F) ->
+ Words = keywords(Feature),
+ fun(Word) ->
+ case lists:member(Word, Words) of
+ true -> false;
+ false -> F(Word)
+ end
+ end.
+
+-spec keyword_fun_add_features([atom()], fun((atom()) -> boolean())) ->
+ {'ok', fun((atom()) -> boolean())}
+ | {'error', error()}.
+keyword_fun_add_features(Features, F) ->
+ case lists:all(fun is_valid_feature/1, Features) of
+ true ->
+ {ok, lists:foldl(fun add_feature/2, F, Features)};
+ false ->
+ IsInvalid = fun(Ftr) -> not is_valid_feature(Ftr) end,
+ Invalid = lists:filter(IsInvalid, Features),
+ {error, {?MODULE, {invalid_features, Invalid}}}
+ end.
+
+-spec keyword_fun_remove_features([atom()], fun((atom()) -> boolean())) ->
+ {'ok', fun((atom()) -> boolean())}
+ | {'error', error()}.
+keyword_fun_remove_features(Features, F) ->
+ case lists:all(fun is_valid_feature/1, Features) of
+ true ->
+ {ok, lists:foldl(fun remove_feature/2, F, Features)};
+ false ->
+ IsInvalid = fun(Ftr) -> not is_valid_feature(Ftr) end,
+ Invalid = lists:filter(IsInvalid, Features),
+ {error, {?MODULE, {invalid_features, Invalid}}}
+ end.
+
+format_error(Reason, [{_M, _F, _Args, Info}| _St]) ->
+ ErrorInfo = proplists:get_value(error_info, Info, #{}),
+ ErrorMap = maps:get(cause, ErrorInfo),
+ ErrorMap#{reason => io_lib:format("~p: ~p", [?MODULE, Reason])}.
+
+format_error({invalid_features, Features}) ->
+ Fmt = fun F([Ftr]) -> io_lib:fwrite("'~p'", [Ftr]);
+ F([Ftr1, Ftr2]) ->
+ io_lib:fwrite("'~p' and '~p'", [Ftr1, Ftr2]);
+ F([Ftr| Ftrs]) ->
+ io_lib:fwrite("'~p', ~s", [Ftr, F(Ftrs)])
+ end,
+ case Features of
+ [Ftr] ->
+ io_lib:fwrite("the feature ~s does not exist.", [Fmt([Ftr])]);
+ Ftrs ->
+ io_lib:fwrite("the features ~s do not exist.", [Fmt(Ftrs)])
+ end.
+
+%% Hold the state of which features are currently enabled.
+%% This is almost static, so we go for an almost permanent state,
+%% i.e., use persistent_term.
+init_features() ->
+ Map = init_specs(),
+
+ persistent_term:put({?MODULE, enabled_features}, []),
+ persistent_term:put({?MODULE, keywords}, []),
+
+ RawOps = lists:filter(fun({Tag, _}) ->
+ Tag == 'enable-feature'
+ orelse Tag == 'disable-feature';
+ (_) -> false
+ end,
+ init:get_arguments()),
+
+ Cnv = fun('enable-feature') -> enable_feature;
+ ('disable-feature') -> disable_feature
+ end,
+
+ FeatureOps = lists:append(lists:map(fun({Tag, Strings}) ->
+ lists:map(fun(S) ->
+ {Tag, S} end,
+ Strings)
+ end,
+ RawOps)),
+
+ %% Convert failure, e.g., too long string for atom, to not
+ %% being a valid feature.
+ F = fun({Tag, String}) ->
+ try
+ Atom = list_to_atom(String),
+ case is_valid_feature(Atom) of
+ true -> {true, {Cnv(Tag), Atom}};
+ false when Atom == all ->
+ {true, {Cnv(Tag), Atom}};
+ false -> false
+ end
+ catch
+ _ -> false
+ end
+ end,
+ FOps = lists:filtermap(F, FeatureOps),
+ {Features, _} = collect_features(FOps),
+ {Enabled, Keywords} =
+ lists:foldl(fun(Ftr, {Ftrs, Keys}) ->
+ case lists:member(Ftr, Ftrs) of
+ true ->
+ {Ftrs, Keys};
+ false ->
+ {[Ftr| Ftrs],
+ keywords(Ftr, Map) ++ Keys}
+ end
+ end,
+ {[], []},
+ Features),
+
+ %% Save state
+ enabled_features(Enabled),
+ set_keywords(Keywords),
+ persistent_term:put({?MODULE, init_done}, true),
+ ok.
+
+init_specs() ->
+ Specs = case os:getenv("OTP_TEST_FEATURES") of
+ "true" -> test_features();
+ _ -> feature_specs()
+ end,
+ persistent_term:put({?MODULE, feature_specs}, Specs),
+ Specs.
+
+ensure_init() ->
+ case persistent_term:get({?MODULE, init_done}, false) of
+ true -> ok;
+ false ->
+ init_features()
+ end.
+
+%% FIXME - remove this. It should not be available at runtime. This
+%% is all done by the init code.
+enable_feature(Feature) ->
+ ?VALID_FEATURE(Feature),
+
+ Features = enabled_features(),
+ case lists:member(Feature, Features) of
+ true ->
+ %% already there, maybe raise an error
+ Features;
+ false ->
+ NewFeatures = [Feature| Features],
+ enabled_features(NewFeatures),
+ Keywords = keywords(),
+ New = keywords(Feature),
+ set_keywords(New ++ Keywords),
+ NewFeatures
+ end.
+
+disable_feature(Feature) ->
+ ?VALID_FEATURE(Feature),
+
+ Features = enabled_features(),
+ case lists:member(Feature, Features) of
+ true ->
+ NewFeatures = Features -- [Feature],
+ enabled_features(NewFeatures),
+ Keywords = keywords(),
+ Rem = keywords(Feature),
+ set_keywords(Keywords -- Rem),
+ NewFeatures;
+ false ->
+ %% Not there, possibly raise an error
+ Features
+ end.
+
+enabled_features() ->
+ ensure_init(),
+ persistent_term:get({?MODULE, enabled_features}).
+
+enabled_features(Ftrs) ->
+ persistent_term:put({?MODULE, enabled_features}, Ftrs).
+
+keywords() ->
+ ensure_init(),
+ persistent_term:get({?MODULE, keywords}).
+
+set_keywords(Words) ->
+ persistent_term:put({?MODULE, keywords}, Words).
+
+
+-spec load_allowed(binary()) -> boolean().
+load_allowed(Binary) ->
+ case erts_internal:beamfile_chunk(Binary, "Meta") of
+ undefined ->
+ true;
+ Meta ->
+ MetaData = erlang:binary_to_term(Meta),
+ case proplists:get_value(enabled_features, MetaData) of
+ undefined ->
+ true;
+ Used ->
+ Enabled = enabled_features(),
+ lists:all(fun(UFtr) ->
+ lists:member(UFtr, Enabled)
+ end,
+ Used)
+ end
+ end.
+
+
+%% Return features used by module or beam file
+features_used(Module) when is_atom(Module) ->
+ case code:get_object_code(Module) of
+ error ->
+ not_found;
+ {_Mod, Bin, _Fname} ->
+ features_in(Bin)
+ end;
+features_used(FName) when is_list(FName) ->
+ features_in(FName).
+
+features_in(NameOrBin) ->
+ case beam_lib:chunks(NameOrBin, ["Meta"], [allow_missing_chunks]) of
+ {ok, {_, [{_, missing_chunk}]}} ->
+ [];
+ {ok, {_, [{_, Meta}]}} ->
+ MetaData = erlang:binary_to_term(Meta),
+ proplists:get_value(enabled_features, MetaData, []);
+ _ ->
+ not_found
+ end.
+
+approved_features() ->
+ [Ftr || Ftr <- features(),
+ maps:get(status, feature_info(Ftr)) == approved].
+
+permanent_features() ->
+ [Ftr || Ftr <- features(),
+ maps:get(status, feature_info(Ftr)) == permanent].
+
+%% Interpret feature ops (enable or disable) to build the full set of
+%% features. The meta feature 'all' is expanded to all known
+%% features.
+collect_features(FOps) ->
+ %% Features enabled by default
+ Enabled = approved_features() ++ permanent_features(),
+ collect_features(FOps, Enabled, []).
+
+collect_features([], Add, Del) ->
+ {Add, Del};
+collect_features([{enable_feature, all}| FOps], Add, _Del) ->
+ All = features(),
+ Add1 = lists:foldl(fun add_ftr/2, Add, All),
+ collect_features(FOps, Add1, []);
+collect_features([{enable_feature, Feature}| FOps], Add, Del) ->
+ collect_features(FOps, add_ftr(Feature, Add), Del -- [Feature]);
+collect_features([{disable_feature, all}| FOps], _Add, Del) ->
+ %% Start over
+ All = features(),
+ collect_features(FOps, [], Del -- All);
+collect_features([{disable_feature, Feature}| FOps], Add, Del) ->
+ collect_features(FOps, Add -- [Feature],
+ add_ftr(Feature, Del)).
+
+add_ftr(F, []) ->
+ [F];
+add_ftr(F, [F| _] = Fs) ->
+ Fs;
+add_ftr(F, [F0| Fs]) ->
+ [F0| add_ftr(F, Fs)].
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% Test features - not present in a release
+test_features() ->
+ #{ifn_expr =>
+ #{short => "New expression `ifn cond -> body end`",
+ description =>
+ "Inclusion of expression `ifn cond -> body end`, which "
+ "evaluates `body` when cond is false. This is a truly "
+ "experimental feature, present only to show and use the "
+ "support for experimental features. Not extensively tested. "
+ "Implementated by a transformation in the parser.",
+ status => experimental,
+ experimental => 24,
+ keywords => ['ifn'],
+ type => extension},
+ ifnot_expr =>
+ #{short => "New expression `ifnot cond -> body end`",
+ description =>
+ "Inclusion of expression `ifnot cond -> body end`, which "
+ "evaluates `body` when cond is false. This is a truly "
+ "experimental feature, present only to show and use the "
+ "support for experimental features. Not extensively tested. "
+ "Similar to ifn_expr, but with a deeper implementation.",
+ status => experimental,
+ experimental => 25,
+ keywords => ['ifnot'],
+ type => extension},
+ unless_expr =>
+ #{short => "`unless <cond> -> <bodby> end",
+ description =>
+ "Introduction of new expression `unless <cond> -> <body> end."
+ " Truly experimental.",
+ status => experimental,
+ experimental => 25,
+ keywords => ['unless'],
+ type => extension},
+ maps =>
+ #{short => "Add maps as new data type",
+ description => "Add new low data type maps with syntactic "
+ "support in Erlang as well native support in the beam. "
+ "Insert, lookup and delete are asymptotically constant.",
+ status => permanent,
+ experimental => 17,
+ approved => 18,
+ permanent => 19,
+ keywords => [],
+ type => extension},
+ cond_expr =>
+ #{short => "Introduce general Lisp style conditional",
+ description =>
+ "Finally complement the painfully broken `if` "
+ "with a general conditional as in Lisp from the days of old.",
+ status => approved,
+ experimental => 24,
+ approved => 25,
+ keywords => [],
+ type => extension},
+ while_expr =>
+ #{short => "Introduce strange iterative expressions",
+ description =>
+ "Introduce looping constructs, with seemingly "
+ "destructive assignment and vague semantics.",
+ status => experimental,
+ experimental => 25,
+ keywords => ['while', 'until'],
+ type => extension}}.
diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl
index 76b6597055..3ae2bc41c4 100644
--- a/lib/stdlib/src/erl_lint.erl
+++ b/lib/stdlib/src/erl_lint.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@
-export([check_format_string/1]).
-export_type([error_info/0, error_description/0]).
+-export_type([fun_used_vars/0]). % Used from erl_eval.erl.
-import(lists, [all/2,any/2,
foldl/3,foldr/3,
@@ -93,6 +94,18 @@ value_option(Flag, Default, On, OnVal, Off, OffVal, Opts) ->
-record(typeinfo, {attr, anno}).
+-type type_id() :: {'export', []}
+ | {'record', atom()}
+ | {'spec', mfa()}
+ | {'type', ta()}.
+
+-record(used_type, {anno :: erl_anno:anno(),
+ at = {export, []} :: type_id()}).
+
+-type used_type() :: #used_type{}.
+
+-type fun_used_vars() :: #{erl_parse:abstract_expr() => {[atom()], fun_used_vars()}}.
+
%% Usage of records, functions, and imports. The variable table, which
%% is passed on as an argument, holds the usage of variables.
-record(usage, {
@@ -101,7 +114,7 @@ value_option(Flag, Default, On, OnVal, Off, OffVal, Opts) ->
used_records = gb_sets:new() %Used record definitions
:: gb_sets:set(atom()),
used_types = maps:new() %Used type definitions
- :: #{ta() := anno()}
+ :: #{ta() := [used_type()]}
}).
@@ -130,6 +143,7 @@ value_option(Flag, Default, On, OnVal, Off, OffVal, Opts) ->
not_removed=gb_sets:empty() %Not considered removed
:: gb_sets:set(module_or_mfa()),
func=[], %Current function
+ type_id=[], %Current type id
warn_format=0, %Warn format calls
enabled_warnings=[], %All enabled warnings (ordset).
nowarn_bif_clash=[], %All no warn bif clashes (ordset).
@@ -140,6 +154,8 @@ value_option(Flag, Default, On, OnVal, Off, OffVal, Opts) ->
%outside any fun or lc
xqlc= false :: boolean(), %true if qlc.hrl included
called= [] :: [{fa(),anno()}], %Called functions
+ fun_used_vars = undefined %Funs used vars
+ :: fun_used_vars() | undefined,
usage = #usage{} :: #usage{},
specs = maps:new() %Type specifications
:: #{mfa() => anno()},
@@ -153,7 +169,8 @@ value_option(Flag, Default, On, OnVal, Off, OffVal, Opts) ->
:: gb_sets:set(ta()),
bvt = none :: 'none' | [any()], %Variables in binary pattern
gexpr_context = guard %Context of guard expression
- :: gexpr_context()
+ :: gexpr_context(),
+ load_nif=false :: boolean() %true if calls erlang:load_nif/2
}).
-type lint_state() :: #lint{}.
@@ -182,6 +199,9 @@ format_error(invalid_call) ->
format_error(invalid_record) ->
"invalid record expression";
+format_error({future_feature, Ftr, Atom}) ->
+ io_lib:format("atom '~p' is reserved in the experimental feature '~p'",
+ [Atom, Ftr]);
format_error({attribute,A}) ->
io_lib:format("attribute ~tw after function definitions", [A]);
format_error({missing_qlc_hrl,A}) ->
@@ -190,6 +210,10 @@ format_error({redefine_import,{{F,A},M}}) ->
io_lib:format("function ~tw/~w already imported from ~w", [F,A,M]);
format_error({bad_inline,{F,A}}) ->
io_lib:format("inlined function ~tw/~w undefined", [F,A]);
+format_error({undefined_nif,{F,A}}) ->
+ io_lib:format("nif ~tw/~w undefined", [F,A]);
+format_error(no_load_nif) ->
+ io_lib:format("nifs defined, but no call to erlang:load_nif/2", []);
format_error({invalid_deprecated,D}) ->
io_lib:format("badly formed deprecated attribute ~tw", [D]);
format_error({bad_deprecated,{F,A}}) ->
@@ -518,10 +542,9 @@ used_vars(Exprs, BindingsList) ->
({V,_Val}, Vs0) -> [{V,{bound,unused,[]}} | Vs0]
end, [], BindingsList),
Vt = orddict:from_list(Vs),
- {Evt,_St} = exprs(set_file(Exprs, "nofile"), Vt, start()),
- {ok, foldl(fun({V,{_,used,_}}, L) -> [V | L];
- (_, L) -> L
- end, [], Evt)}.
+ St0 = (start())#lint{fun_used_vars=maps:new()},
+ {_Evt,St1} = exprs(Exprs, Vt, St0),
+ St1#lint.fun_used_vars.
%% module([Form]) ->
%% module([Form], FileName) ->
@@ -568,6 +591,7 @@ module(Forms, FileName) ->
ErrorInfo :: error_info()).
module(Forms, FileName, Opts0) ->
+ %% FIXME Hmm, this is not coherent with the semantics of features
%% We want the options given on the command line to take
%% precedence over options in the module.
Opts = compiler_options(Forms) ++ Opts0,
@@ -638,7 +662,10 @@ start(File, Opts) ->
true, Opts)},
{nif_inline,
bool_option(warn_nif_inline, nowarn_nif_inline,
- true, Opts)}
+ true, Opts)},
+ {keyword_warning,
+ bool_option(warn_keywords, nowarn_keywords,
+ false, Opts)}
],
Enabled1 = [Category || {Category,true} <- Enabled0],
Enabled = ordsets:from_list(Enabled1),
@@ -979,7 +1006,8 @@ post_traversal_check(Forms, St0) ->
StF = check_local_opaque_types(StE),
StG = check_dialyzer_attribute(Forms, StF),
StH = check_callback_information(StG),
- check_removed(Forms, StH).
+ StI = check_nifs(Forms, StH),
+ check_removed(Forms, StI).
%% check_behaviour(State0) -> State
%% Check that the behaviour attribute is valid.
@@ -1288,8 +1316,10 @@ check_undefined_types(#lint{usage=Usage,types=Def}=St0) ->
TA <- UTAs,
not is_map_key(TA, Def),
not is_default_type(TA)],
- foldl(fun ({TA,Anno}, St) ->
- add_error(Anno, {undefined_type,TA}, St)
+ foldl(fun ({TA,UsedTypeList}, St) ->
+ foldl( fun(#used_type{anno = Anno}, St1) ->
+ add_error(Anno, {undefined_type,TA}, St1)
+ end, St, UsedTypeList)
end, St0, Undef).
%% check_bif_clashes(Forms, State0) -> State
@@ -1310,6 +1340,19 @@ check_option_functions(Forms, Tag0, Type, St0) ->
Bad = [{FA,Anno} || {FA,Anno} <- FAsAnno, not member(FA, DefFunctions)],
func_location_error(Type, Bad, St0).
+check_nifs(Forms, St0) ->
+ FAsAnno = [{FA,Anno} || {attribute, Anno, nifs, Args} <- Forms,
+ FA <- Args],
+ St1 = case {FAsAnno, St0#lint.load_nif} of
+ {[{_,Anno1}|_], false} ->
+ add_warning(Anno1, no_load_nif, St0);
+ _ ->
+ St0
+ end,
+ DefFunctions = gb_sets:subtract(St1#lint.defined, gb_sets:from_list(pseudolocals())),
+ Bad = [{FA,Anno} || {FA,Anno} <- FAsAnno, not gb_sets:is_element(FA, DefFunctions)],
+ func_location_error(undefined_nif, Bad, St1).
+
nowarn_function(Tag, Opts) ->
ordsets:from_list([FA || {Tag1,FAs} <- Opts,
Tag1 =:= Tag,
@@ -1423,21 +1466,21 @@ export(Anno, Es, #lint{exports = Es0, called = Called} = St0) ->
-spec export_type(anno(), [ta()], lint_state()) -> lint_state().
%% Mark types as exported; also mark them as used from the export line.
-export_type(Anno, ETs, #lint{usage = Usage, exp_types = ETs0} = St0) ->
- UTs0 = Usage#usage.used_types,
- try foldl(fun ({T,A}=TA, {E,U,St2}) when is_atom(T), is_integer(A) ->
+export_type(Anno, ETs, #lint{exp_types = ETs0} = St0) ->
+ try foldl(fun ({T,A}=TA, {E,St2}) when is_atom(T), is_integer(A) ->
St = case gb_sets:is_element(TA, E) of
true ->
Warn = {duplicated_export_type,TA},
add_warning(Anno, Warn, St2);
false ->
- St2
+ St3 = St2#lint{type_id = {export, []}},
+ used_type(TA, Anno, St3)
end,
- {gb_sets:add_element(TA, E), maps:put(TA, Anno, U), St}
+ {gb_sets:add_element(TA, E), St}
end,
- {ETs0,UTs0,St0}, ETs) of
- {ETs1,UTs1,St1} ->
- St1#lint{usage = Usage#usage{used_types = UTs1}, exp_types = ETs1}
+ {ETs0,St0}, ETs) of
+ {ETs1,St1} ->
+ St1#lint{exp_types = ETs1}
catch
error:_ ->
add_error(Anno, {bad_export_type, ETs}, St0)
@@ -2248,12 +2291,16 @@ is_guard_test(Expression, Forms) ->
is_guard_test(Expression, Forms, IsOverridden) ->
RecordAttributes = [A || A = {attribute, _, record, _D} <- Forms],
+ is_guard_test1(set_file(Expression, "nofile"), RecordAttributes, IsOverridden).
+
+is_guard_test1(NoFileExpression, [], IsOverridden) ->
+ is_guard_test2(NoFileExpression, {maps:new(),IsOverridden});
+is_guard_test1(NoFileExpression, RecordAttributes, IsOverridden) ->
St0 = foldl(fun(Attr0, St1) ->
Attr = set_file(Attr0, "none"),
attribute_state(Attr, St1)
end, start(), RecordAttributes),
- is_guard_test2(set_file(Expression, "nofile"),
- {St0#lint.records,IsOverridden}).
+ is_guard_test2(NoFileExpression, {St0#lint.records,IsOverridden}).
%% is_guard_test2(Expression, RecordDefs :: dict:dict()) -> boolean().
is_guard_test2({call,Anno,{atom,Ar,record},[E,A]}, Info) ->
@@ -2566,6 +2613,23 @@ expr({match,_Anno,P,E}, Vt, St0) ->
{Pvt,Pnew,St2} = pattern(P, vtupdate(Evt, Vt), St1),
St = reject_invalid_alias_expr(P, E, Vt, St2),
{vtupdate(Pnew, vtmerge(Evt, Pvt)),St};
+expr({maybe_match,Anno,P,E}, Vt, St0) ->
+ expr({match,Anno,P,E}, Vt, St0);
+expr({'maybe',Anno,Es}, Vt, St) ->
+ %% No variables are exported.
+ {Evt0, St1} = exprs(Es, Vt, St),
+ Evt1 = vtupdate(vtunsafe({'maybe',Anno}, Evt0, Vt), Vt),
+ Evt2 = vtmerge(Evt0, Evt1),
+ {Evt2,St1};
+expr({'maybe',MaybeAnno,Es,{'else',ElseAnno,Cs}}, Vt, St) ->
+ %% No variables are exported.
+ {Evt0, St1} = exprs(Es, Vt, St),
+ Evt1 = vtupdate(vtunsafe({'maybe',MaybeAnno}, Evt0, Vt), Vt),
+ {Cvt0, St2} = icrt_clauses(Cs, {'else',ElseAnno}, Evt1, St1),
+ Cvt1 = vtupdate(vtunsafe({'else',ElseAnno}, Cvt0, Vt), Vt),
+ Evt2 = vtmerge(Evt0, Evt1),
+ Cvt2 = vtmerge(Cvt0, Cvt1),
+ {vtmerge(Evt2, Cvt2),St2};
%% No comparison or boolean operators yet.
expr({op,_Anno,_Op,A}, Vt, St) ->
expr(A, Vt, St);
@@ -2673,7 +2737,8 @@ record_def(Anno, Name, Fs0, St0) ->
St2 = St1#lint{records=maps:put(Name, {Anno,Fs1},
St1#lint.records)},
Types = [T || {typed_record_field, _, T} <- Fs0],
- check_type({type, nowarn(), product, Types}, St2)
+ St3 = St2#lint{type_id = {record, Name}},
+ check_type({type, nowarn(), product, Types}, St3)
end.
%% def_fields([RecDef], RecordName, State) -> {[DefField],State}.
@@ -2893,7 +2958,8 @@ type_def(Attr, Anno, TypeName, ProtoType, Args, St0) ->
fun(St) ->
NewDefs = maps:put(TypePair, Info, TypeDefs),
CheckType = {type, nowarn(), product, [ProtoType|Args]},
- check_type(CheckType, St#lint{types=NewDefs})
+ St1 = St#lint{types=NewDefs, type_id={type, TypePair}},
+ check_type(CheckType, St1)
end,
case is_default_type(TypePair) andalso
not member(no_auto_import_types, St0#lint.compile) of
@@ -3088,16 +3154,15 @@ check_record_types([], _Name, _DefFields, SeenVars, St, _SeenFields) ->
{SeenVars, St}.
used_type(TypePair, Anno, #lint{usage = Usage, file = File} = St) ->
- OldUsed = Usage#usage.used_types,
- UsedTypes = maps:put(TypePair, erl_anno:set_file(File, Anno), OldUsed),
- St#lint{usage=Usage#usage{used_types=UsedTypes}}.
+ Used = Usage#usage.used_types,
+ UsedType = #used_type{anno = erl_anno:set_file(File, Anno),
+ at = St#lint.type_id},
+ NewUsed = maps_prepend(TypePair, UsedType, Used),
+ St#lint{usage=Usage#usage{used_types=NewUsed}}.
is_default_type({Name, NumberOfTypeVariables}) ->
erl_internal:is_type(Name, NumberOfTypeVariables).
-%% OTP 24.0
-is_newly_introduced_builtin_type({nonempty_binary, 0}) -> true;
-is_newly_introduced_builtin_type({nonempty_bitstring, 0}) -> true;
is_newly_introduced_builtin_type({Name, _}) when is_atom(Name) -> false.
is_obsolete_builtin_type(TypePair) ->
@@ -3120,12 +3185,12 @@ spec_decl(Anno, MFA0, TypeSpecs, St00 = #lint{specs = Specs, module = Mod}) ->
case is_map_key(MFA, Specs) of
true -> add_error(Anno, {redefine_spec, MFA0}, St1);
false ->
- case MFA of
- {Mod, _, _} ->
- check_specs(TypeSpecs, spec_wrong_arity, Arity, St1);
- _ ->
- add_error(Anno, {bad_module, MFA}, St1)
- end
+ St2 = case MFA of
+ {Mod, _, _} -> St1;
+ _ -> add_error(Anno, {bad_module, MFA}, St1)
+ end,
+ St3 = St2#lint{type_id = {spec, MFA}},
+ check_specs(TypeSpecs, spec_wrong_arity, Arity, St3)
end.
%% callback_decl(Anno, Fun, Types, State) -> State.
@@ -3141,8 +3206,9 @@ callback_decl(Anno, MFA0, TypeSpecs,
St1 = St0#lint{callbacks = maps:put(MFA, Anno, Callbacks)},
case is_map_key(MFA, Callbacks) of
true -> add_error(Anno, {redefine_callback, MFA0}, St1);
- false -> check_specs(TypeSpecs, callback_wrong_arity,
- Arity, St1)
+ false ->
+ St2 = St1#lint{type_id = {spec, MFA}},
+ check_specs(TypeSpecs, callback_wrong_arity, Arity, St2)
end
end.
@@ -3263,11 +3329,10 @@ check_unused_types(Forms, St) ->
false -> St
end.
-check_unused_types_1(Forms, #lint{usage=Usage, types=Ts, exp_types=ExpTs}=St) ->
+check_unused_types_1(Forms, #lint{types=Ts}=St) ->
case [File || {attribute,_A,file,{File,_Anno}} <- Forms] of
[FirstFile|_] ->
- D = Usage#usage.used_types,
- L = gb_sets:to_list(ExpTs) ++ maps:keys(D),
+ L = reached_types(St),
UsedTypes = gb_sets:from_list(L),
FoldFun =
fun({{record, _}=_Type, 0}, _, AccSt) ->
@@ -3291,6 +3356,19 @@ check_unused_types_1(Forms, #lint{usage=Usage, types=Ts, exp_types=ExpTs}=St) ->
St
end.
+reached_types(#lint{usage = Usage}) ->
+ Es = [{From, {type, To}} ||
+ {To, UsedTs} <- maps:to_list(Usage#usage.used_types),
+ #used_type{at = From} <- UsedTs],
+ Initial = initially_reached_types(Es),
+ G = sofs:family_to_digraph(sofs:rel2fam(sofs:relation(Es))),
+ R = digraph_utils:reachable(Initial, G),
+ true = digraph:delete(G),
+ [T || {type, T} <- R].
+
+initially_reached_types(Es) ->
+ [FromTypeId || {{T, _}=FromTypeId, _} <- Es, T =/= type].
+
check_local_opaque_types(St) ->
#lint{types=Ts, exp_types=ExpTs} = St,
FoldFun =
@@ -3582,7 +3660,20 @@ handle_bitstring_gen_pat(_,St) ->
%% unless it was introduced in a fun or an lc. Only if pat_var finds
%% such variables can the correct line number be given.
+%% If fun_used_vars is set, we want to compute the tree of used
+%% vars across functions. This is by erl_eval to compute used vars
+%% without having to traverse the tree multiple times.
+
+fun_clauses(Cs, Vt, #lint{fun_used_vars=(#{}=FUV)} = St) ->
+ {Uvt, St0} = fun_clauses1(Cs, Vt, St#lint{fun_used_vars=maps:new()}),
+ #lint{fun_used_vars=InnerFUV} = St0,
+ UsedVars = [V || {V, {_, used, _}} <- Uvt],
+ OuterFUV = maps:put(Cs, {UsedVars, InnerFUV}, FUV),
+ {Uvt, St0#lint{fun_used_vars=OuterFUV}};
fun_clauses(Cs, Vt, St) ->
+ fun_clauses1(Cs, Vt, St).
+
+fun_clauses1(Cs, Vt, St) ->
OldRecDef = St#lint.recdef_top,
{Bvt,St2} = foldl(fun (C, {Bvt0, St0}) ->
{Cvt,St1} = fun_clause(C, Vt, St0),
@@ -3957,7 +4048,8 @@ check_remote_function(Anno, M, F, As, St0) ->
%% check_load_nif(Anno, ModName, FuncName, [Arg], State) -> State
%% Add warning if erlang:load_nif/2 is called when any kind of inlining has
%% been enabled.
-check_load_nif(Anno, erlang, load_nif, [_, _], St) ->
+check_load_nif(Anno, erlang, load_nif, [_, _], St0) ->
+ St = St0#lint{load_nif = true},
case is_warn_enabled(nif_inline, St) of
true -> check_nif_inline(Anno, St);
false -> St
@@ -4079,7 +4171,22 @@ test_overriden_by_local(Anno, OldTest, Arity, St) ->
%% keyword_warning(Anno, Atom, State) -> State.
%% Add warning for atoms that will be reserved keywords in the future.
%% (Currently, no such keywords to warn for.)
-keyword_warning(_Anno, _A, St) -> St.
+keyword_warning(Anno, Atom, St) ->
+ case is_warn_enabled(keyword_warning, St) of
+ true ->
+ Ftrs = erl_features:features(),
+ Reserved =
+ fun(Ftr) ->
+ lists:member(Atom, erl_features:keywords(Ftr))
+ end,
+ case lists:filter(Reserved, Ftrs) of
+ [] -> St;
+ [Ftr] ->
+ add_warning(Anno, {future_feature, Ftr, Atom}, St)
+ end;
+ false ->
+ St
+ end.
%% format_function(Anno, ModName, FuncName, [Arg], State) -> State.
%% Add warning for bad calls to io:fwrite/format functions.
@@ -4143,7 +4250,7 @@ check_format_2a(Fmt, FmtAnno, As) ->
false ->
Anno = element(2, As),
{warn,1,Anno,"format arguments not a list",[]};
- maybe ->
+ 'maybe' ->
Anno = erl_parse:first_anno(As),
{warn,2,Anno,"format arguments perhaps not a list",[]}
end.
@@ -4189,12 +4296,12 @@ arguments(N) ->
args_list({cons,_A,_H,T}) -> args_list(T);
%% Strange case: user has written something like [a | "bcd"]; pretend
%% we don't know:
-args_list({string,_A,_Cs}) -> maybe;
+args_list({string,_A,_Cs}) -> 'maybe';
args_list({nil,_A}) -> true;
args_list({atom,_,_}) -> false;
args_list({integer,_,_}) -> false;
args_list({float,_,_}) -> false;
-args_list(_Other) -> maybe.
+args_list(_Other) -> 'maybe'.
args_length({cons,_A,_H,T}) -> 1 + args_length(T);
args_length({nil,_A}) -> 0.
diff --git a/lib/stdlib/src/erl_parse.yrl b/lib/stdlib/src/erl_parse.yrl
index 33569d4a8d..6878af8886 100644
--- a/lib/stdlib/src/erl_parse.yrl
+++ b/lib/stdlib/src/erl_parse.yrl
@@ -48,13 +48,15 @@ top_type top_types type typed_expr typed_attr_val
type_sig type_sigs type_guard type_guards fun_type binary_type
type_spec spec_fun typed_exprs typed_record_fields field_types field_type
map_pair_types map_pair_type
-bin_base_type bin_unit_type.
+bin_base_type bin_unit_type
+maybe_expr maybe_match_exprs maybe_match.
Terminals
char integer float atom string var
'(' ')' ',' '->' '{' '}' '[' ']' '|' '||' '<-' ';' ':' '#' '.'
'after' 'begin' 'case' 'try' 'catch' 'end' 'fun' 'if' 'of' 'receive' 'when'
+'maybe' 'else'
'andalso' 'orelse'
'bnot' 'not'
'*' '/' 'div' 'rem' 'band' 'and'
@@ -63,6 +65,7 @@ char integer float atom string var
'==' '/=' '=<' '<' '>=' '>' '=:=' '=/=' '<=' '=>' ':='
'<<' '>>'
'!' '=' '::' '..' '...'
+'?='
'spec' 'callback' % helper
dot.
@@ -257,6 +260,7 @@ expr_max -> case_expr : '$1'.
expr_max -> receive_expr : '$1'.
expr_max -> fun_expr : '$1'.
expr_max -> try_expr : '$1'.
+expr_max -> maybe_expr : '$1'.
pat_expr -> pat_expr '=' pat_expr : {match,first_anno('$1'),'$1','$3'}.
pat_expr -> pat_expr comp_op pat_expr : ?mkop2('$1', '$2', '$3').
@@ -401,7 +405,6 @@ if_clauses -> if_clause ';' if_clauses : ['$1' | '$3'].
if_clause -> guard clause_body :
{clause,first_anno(hd(hd('$1'))),[],'$1','$2'}.
-
case_expr -> 'case' expr 'of' cr_clauses 'end' :
{'case',?anno('$1'),'$2','$4'}.
@@ -477,6 +480,21 @@ try_clause -> var ':' pat_expr try_opt_stacktrace clause_guard clause_body :
try_opt_stacktrace -> ':' var : '$2'.
try_opt_stacktrace -> '$empty' : '_'.
+
+maybe_expr -> 'maybe' maybe_match_exprs 'end' :
+ {'maybe',?anno('$1'),'$2'}.
+maybe_expr -> 'maybe' maybe_match_exprs 'else' cr_clauses 'end' :
+ %% `erl_lint` can produce a better warning when the position
+ %% of the `else` keyword is known.
+ {'maybe',?anno('$1'),'$2',{'else',?anno('$3'),'$4'}}.
+
+maybe_match_exprs -> maybe_match : ['$1'].
+maybe_match_exprs -> maybe_match ',' maybe_match_exprs : ['$1' | '$3'].
+maybe_match_exprs -> expr : ['$1'].
+maybe_match_exprs -> expr ',' maybe_match_exprs : ['$1' | '$3'].
+
+maybe_match -> expr '?=' expr : {maybe_match,?anno('$2'),'$1','$3'}.
+
argument_list -> '(' ')' : {[],?anno('$1')}.
argument_list -> '(' exprs ')' : {'$2',?anno('$1')}.
@@ -1397,7 +1415,7 @@ normalise({bin,_,Fs}) ->
eval_bits:expr_grp(Fs, [],
fun(E, _) ->
{value, normalise(E), []}
- end, [], true),
+ end),
B;
normalise({cons,_,Head,Tail}) ->
[normalise(Head)|normalise(Tail)];
diff --git a/lib/stdlib/src/erl_posix_msg.erl b/lib/stdlib/src/erl_posix_msg.erl
index b9ed4a3a9d..e86ba81170 100644
--- a/lib/stdlib/src/erl_posix_msg.erl
+++ b/lib/stdlib/src/erl_posix_msg.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2018. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -139,7 +139,7 @@ message_1(eprocunavail) -> <<"bad procedure for program">>;
message_1(eprogmismatch) -> <<"program version wrong">>;
message_1(eprogunavail) -> <<"RPC program not available">>;
message_1(eproto) -> <<"protocol error">>;
-message_1(eprotonosupport) -> <<"protocol not suppored">>;
+message_1(eprotonosupport) -> <<"protocol not supported">>;
message_1(eprototype) -> <<"protocol wrong type for socket">>;
message_1(erange) -> <<"math result unrepresentable">>;
message_1(erefused) -> <<"EREFUSED">>;
diff --git a/lib/stdlib/src/erl_pp.erl b/lib/stdlib/src/erl_pp.erl
index 74b42a3b40..191aa75698 100644
--- a/lib/stdlib/src/erl_pp.erl
+++ b/lib/stdlib/src/erl_pp.erl
@@ -24,7 +24,8 @@
-export([form/1,form/2,
attribute/1,attribute/2,function/1,function/2,
- guard/1,guard/2,exprs/1,exprs/2,exprs/3,expr/1,expr/2,expr/3,expr/4]).
+ guard/1,guard/2,exprs/1,exprs/2,exprs/3,expr/1,expr/2,expr/3,expr/4,
+ legalize_vars/1]).
-import(lists, [append/1,foldr/3,map/2,mapfoldl/3,reverse/1,reverse/2]).
-import(io_lib, [write/1,format/2]).
@@ -199,6 +200,34 @@ expr(E, I, P, Options) ->
?TEST(E),
frmt(lexpr(E, P, options(Options)), I, state(Options)).
+-spec(legalize_vars(Function) -> erl_parse:abstract_form() when
+ Function :: erl_parse:abstract_form()).
+
+legalize_vars({function,ANNO,Name0,Arity,Clauses0}) ->
+ ?TEST(F),
+ %% Collect all used variables in this function and classify them
+ %% as either syntactically valid or not.
+ F = fun({var,_Anno,Name}, {Valid, Invalid}) ->
+ Str = [First|_] = atom_to_list(Name),
+ case First of
+ X when X >= $a, X =< $z ->
+ {Valid,Invalid#{Name => Str}};
+ _ ->
+ {Valid#{Name => Name},Invalid}
+ end
+ end,
+ {Valid, Invalid} = fold_vars(F, {#{}, #{}}, Clauses0),
+ %% Make up an unique variable name for each key in Invalid, then
+ %% replace all invalid names.
+ Mapping = maps:fold(fun legalize_name/3, Valid, Invalid),
+ Subs = fun({var,Anno,Name}) ->
+ {var,Anno,map_get(Name, Mapping)}
+ end,
+ Clauses = map_vars(Subs, Clauses0),
+ {function,ANNO,Name0,Arity,Clauses};
+legalize_vars(Form) ->
+ erlang:error(badarg, [Form]).
+
%%%
%%% Local functions
%%%
@@ -675,12 +704,26 @@ lexpr({'catch',_,Expr}, Prec, Opts) ->
{P,R} = preop_prec('catch'),
El = {list,[{step,'catch',lexpr(Expr, R, Opts)}]},
maybe_paren(P, Prec, El);
+lexpr({'maybe',_,Es}, _, Opts) ->
+ {list,[{step,'maybe',body(Es, Opts)},{reserved,'end'}]};
+lexpr({'maybe',_,Es,{'else',_,Cs}}, _, Opts) ->
+ {list,[{step,'maybe',body(Es, Opts)},{step,'else',cr_clauses(Cs, Opts)},{reserved,'end'}]};
+lexpr({maybe_match,_,Lhs,Rhs}, _, Opts) ->
+ Pl = lexpr(Lhs, 0, Opts),
+ Rl = lexpr(Rhs, 0, Opts),
+ {list,[{cstep,[Pl,leaf(" ?=")],Rl}]};
lexpr({match,_,Lhs,Rhs}, Prec, Opts) ->
{L,P,R} = inop_prec('='),
Pl = lexpr(Lhs, L, Opts),
Rl = lexpr(Rhs, R, Opts),
El = {list,[{cstep,[Pl,' ='],Rl}]},
maybe_paren(P, Prec, El);
+lexpr({op,_,Op,Arg}, Prec, Opts) when Op =:= '+';
+ Op =:= '-' ->
+ {P,R} = preop_prec(Op),
+ Ol = {reserved, leaf(atom_to_list(Op))},
+ El = [Ol,lexpr(Arg, R, Opts)],
+ maybe_paren(P, Prec, El);
lexpr({op,_,Op,Arg}, Prec, Opts) ->
{P,R} = preop_prec(Op),
Ol = {reserved, leaf(format("~s ", [Op]))},
@@ -1324,7 +1367,7 @@ wordtable() ->
L = [begin {leaf,Sz,S} = leaf(W), {S,Sz} end ||
W <- [" ->"," =","<<",">>","[]","after","begin","case","catch",
"end","fun","if","of","receive","try","when"," ::","..",
- " |"]],
+ " |","maybe","else"]],
list_to_tuple(L).
word(' ->', WT) -> element(1, WT);
@@ -1345,4 +1388,39 @@ word('try', WT) -> element(15, WT);
word('when', WT) -> element(16, WT);
word(' ::', WT) -> element(17, WT);
word('..', WT) -> element(18, WT);
-word(' |', WT) -> element(19, WT).
+word(' |', WT) -> element(19, WT);
+word('maybe', WT) -> element(20, WT);
+word('else', WT) -> element(21, WT).
+
+%% Make up an unique variable name for Name that won't clash with any
+%% name in Used. We first try by converting the name to uppercase and
+%% if that fails we start prepending 'X'es until we find an unused
+%% name.
+legalize_name(InvalidName, StringName, Used) ->
+ Upper = string:to_upper(StringName),
+ NewName = list_to_atom(Upper),
+ case Used of
+ #{ NewName := _ } ->
+ legalize_name(InvalidName, [$X|StringName], Used);
+ #{} ->
+ Used#{ InvalidName => NewName }
+ end.
+
+fold_vars(F, Acc0, Forms) when is_list(Forms) ->
+ lists:foldl(fun(Elem, Acc) -> fold_vars(F, Acc, Elem) end, Acc0, Forms);
+fold_vars(F, Acc0, V={var,_,_}) ->
+ F(V, Acc0);
+fold_vars(F, Acc0, Form) when is_tuple(Form) ->
+ lists:foldl(fun(Elem, Acc) -> fold_vars(F, Acc, Elem) end,
+ Acc0, tuple_to_list(Form));
+fold_vars(_, Acc, _) ->
+ Acc.
+
+map_vars(F, Forms) when is_list(Forms) ->
+ [map_vars(F, Form) || Form <- Forms];
+map_vars(F, V={var,_,_}) ->
+ F(V);
+map_vars(F, Form) when is_tuple(Form) ->
+ list_to_tuple([map_vars(F, Elem) || Elem <- tuple_to_list(Form)]);
+map_vars(_, Form) ->
+ Form.
diff --git a/lib/stdlib/src/erl_scan.erl b/lib/stdlib/src/erl_scan.erl
index 5d988e7438..a30747b5e5 100644
--- a/lib/stdlib/src/erl_scan.erl
+++ b/lib/stdlib/src/erl_scan.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -52,7 +52,8 @@
%%% External exports
-export([string/1,string/2,string/3,tokens/3,tokens/4,
- format_error/1,reserved_word/1]).
+ format_error/1,reserved_word/1,
+ f_reserved_word/1]).
-export([column/1,end_location/1,line/1,location/1,text/1,
category/1,symbol/1]).
@@ -427,6 +428,11 @@ scan1([C|Cs], St, Line, Col, Toks) when ?WHITE_SPACE(C) ->
skip_white_space(Cs, St, Line, Col, Toks, 1)
end;
%% Punctuation characters and operators, first recognise multiples.
+%% ?= for the maybe ... else ... end construct
+scan1("?="++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "?=", '?=', 2);
+scan1("?"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
%% << <- <=
scan1("<<"++Cs, St, Line, Col, Toks) ->
tok2(Cs, St, Line, Col, Toks, "<<", '<<', 2);
@@ -1222,32 +1228,43 @@ tabs(8) -> "\t\t\t\t\t\t\t\t";
tabs(9) -> "\t\t\t\t\t\t\t\t\t";
tabs(10) -> "\t\t\t\t\t\t\t\t\t\t".
+%% Dynamic version of reserved_word that knows about the possibility
+%% that enabled features might change the set of reserved words.
-spec reserved_word(Atom :: atom()) -> boolean().
-reserved_word('after') -> true;
-reserved_word('begin') -> true;
-reserved_word('case') -> true;
-reserved_word('try') -> true;
-reserved_word('cond') -> true;
-reserved_word('catch') -> true;
-reserved_word('andalso') -> true;
-reserved_word('orelse') -> true;
-reserved_word('end') -> true;
-reserved_word('fun') -> true;
-reserved_word('if') -> true;
-reserved_word('let') -> true;
-reserved_word('of') -> true;
-reserved_word('receive') -> true;
-reserved_word('when') -> true;
-reserved_word('bnot') -> true;
-reserved_word('not') -> true;
-reserved_word('div') -> true;
-reserved_word('rem') -> true;
-reserved_word('band') -> true;
-reserved_word('and') -> true;
-reserved_word('bor') -> true;
-reserved_word('bxor') -> true;
-reserved_word('bsl') -> true;
-reserved_word('bsr') -> true;
-reserved_word('or') -> true;
-reserved_word('xor') -> true;
-reserved_word(_) -> false.
+reserved_word(Atom) ->
+ case f_reserved_word(Atom) of
+ true -> true;
+ false ->
+ lists:member(Atom, erl_features:keywords())
+ end.
+
+%% Static version of reserved_words. These represent the fixed set of
+%% reserved words.
+f_reserved_word('after') -> true;
+f_reserved_word('begin') -> true;
+f_reserved_word('case') -> true;
+f_reserved_word('try') -> true;
+f_reserved_word('cond') -> true;
+f_reserved_word('catch') -> true;
+f_reserved_word('andalso') -> true;
+f_reserved_word('orelse') -> true;
+f_reserved_word('end') -> true;
+f_reserved_word('fun') -> true;
+f_reserved_word('if') -> true;
+f_reserved_word('let') -> true;
+f_reserved_word('of') -> true;
+f_reserved_word('receive') -> true;
+f_reserved_word('when') -> true;
+f_reserved_word('bnot') -> true;
+f_reserved_word('not') -> true;
+f_reserved_word('div') -> true;
+f_reserved_word('rem') -> true;
+f_reserved_word('band') -> true;
+f_reserved_word('and') -> true;
+f_reserved_word('bor') -> true;
+f_reserved_word('bxor') -> true;
+f_reserved_word('bsl') -> true;
+f_reserved_word('bsr') -> true;
+f_reserved_word('or') -> true;
+f_reserved_word('xor') -> true;
+f_reserved_word(_) -> false.
diff --git a/lib/stdlib/src/erl_stdlib_errors.erl b/lib/stdlib/src/erl_stdlib_errors.erl
index 356ac0b792..e625d53852 100644
--- a/lib/stdlib/src/erl_stdlib_errors.erl
+++ b/lib/stdlib/src/erl_stdlib_errors.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2020-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2020-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -189,7 +189,20 @@ format_lists_error(keysearch, Args) ->
format_lists_error(member, [_Key, List]) ->
[[], must_be_list(List)];
format_lists_error(reverse, [List, _Acc]) ->
- [must_be_list(List)].
+ [must_be_list(List)];
+format_lists_error(seq, [First, Last, Inc]) ->
+ case [must_be_integer(First), must_be_integer(Last), must_be_integer(Inc)] of
+ [[], [], []] ->
+ IncError = if
+ (Inc =< 0 andalso First - Inc =< Last) ->
+ <<"not a positive increment">>;
+ (Inc >= 0 andalso First - Inc >= Last) ->
+ <<"not a negative increment">>
+ end,
+ [[], [], IncError];
+ Errors -> Errors
+ end.
+
format_maps_error(filter, Args) ->
format_maps_error(map, Args);
@@ -212,6 +225,10 @@ format_maps_error(get, [_Key,Map]) ->
true ->
[[],not_map]
end;
+format_maps_error(groups_from_list, [Fun, List]) ->
+ [must_be_fun(Fun, 1), must_be_list(List)];
+format_maps_error(groups_from_list, [Fun1, Fun2, List]) ->
+ [must_be_fun(Fun1, 1), must_be_fun(Fun2, 1), must_be_list(List)];
format_maps_error(get, [_,_,_]) ->
[[],not_map];
format_maps_error(intersect, [Map1, Map2]) ->
@@ -426,6 +443,11 @@ format_io_error(_, _, {io, arguments}, true) ->
[device_arguments];
format_io_error(_, _, {io, arguments}, false) ->
[{general,device_arguments}];
+%% calling_self, Io =:= self()
+format_io_error(_, _, {io, calling_self}, true) ->
+ [calling_self];
+format_io_error(_, _, {io, calling_self}, false) ->
+ [{general,calling_self}];
%% terminated, monitor(Io) failed
format_io_error(_, _, {io, terminated}, true) ->
[device_terminated];
@@ -1008,6 +1030,8 @@ expand_error(bad_update_op) ->
<<"not a valid update operation">>;
expand_error(bitstring) ->
<<"is a bitstring (expected a binary)">>;
+expand_error(calling_self) ->
+ <<"the device is not allowed to be the current process">>;
expand_error(counter_not_integer) ->
<<"the value in the given position, in the object, is not an integer">>;
expand_error(dead_process) ->
diff --git a/lib/stdlib/src/erl_tar.erl b/lib/stdlib/src/erl_tar.erl
index c689be30d8..dbabcb14bf 100644
--- a/lib/stdlib/src/erl_tar.erl
+++ b/lib/stdlib/src/erl_tar.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1019,11 +1019,14 @@ do_get_format({error, _} = Err, _Bin) ->
do_get_format(#header_v7{}=V7, Bin)
when is_binary(Bin), byte_size(Bin) =:= ?BLOCK_SIZE ->
Checksum = parse_octal(V7#header_v7.checksum),
- Chk1 = compute_checksum(Bin),
- Chk2 = compute_signed_checksum(Bin),
- if Checksum =/= Chk1 andalso Checksum =/= Chk2 ->
+ IsBadChecksum = case compute_checksum(Bin) of
+ Checksum -> false;
+ _ -> compute_signed_checksum(Bin) =/= Checksum
+ end,
+ case IsBadChecksum of
+ true ->
?FORMAT_UNKNOWN;
- true ->
+ false ->
%% guess magic
Ustar = to_ustar(V7, Bin),
Star = to_star(V7, Bin),
@@ -1203,6 +1206,9 @@ compute_signed_checksum(<<H1:?V7_CHKSUM/binary,
%% Returns the checksum of a binary.
checksum(Bin) -> checksum(Bin, 0).
+
+checksum(<<A/unsigned,B/unsigned,C/unsigned,D/unsigned,Rest/binary>>, Sum) ->
+ checksum(Rest, Sum+A+B+C+D);
checksum(<<A/unsigned,Rest/binary>>, Sum) ->
checksum(Rest, Sum+A);
checksum(<<>>, Sum) -> Sum.
@@ -1251,39 +1257,40 @@ parse_numeric(<<First, _/binary>> = Bin) ->
parse_octal(Bin)
end.
-parse_octal(Bin) when is_binary(Bin) ->
+parse_octal(<<Bin/binary>>) ->
%% skip leading/trailing zero bytes and spaces
- do_parse_octal(Bin, <<>>).
-do_parse_octal(<<>>, <<>>) ->
- 0;
-do_parse_octal(<<>>, Acc) ->
- case io_lib:fread("~8u", binary:bin_to_list(Acc)) of
- {error, _} -> throw({error, invalid_tar_checksum});
- {ok, [Octal], []} -> Octal;
- {ok, _, _} -> throw({error, invalid_tar_checksum})
- end;
-do_parse_octal(<<$\s,Rest/binary>>, Acc) ->
+ do_parse_octal(Bin, 0).
+
+do_parse_octal(<<$\s, Rest/binary>>, Acc) ->
do_parse_octal(Rest, Acc);
do_parse_octal(<<0, Rest/binary>>, Acc) ->
do_parse_octal(Rest, Acc);
do_parse_octal(<<C, Rest/binary>>, Acc) ->
- do_parse_octal(Rest, <<Acc/binary, C>>).
+ Digit = C - $0,
+ case Digit band 7 of
+ Digit ->
+ do_parse_octal(Rest, Acc bsl 3 bor Digit);
+ _ ->
+ throw({error, invalid_tar_checksum})
+ end;
+do_parse_octal(<<>>, Acc) ->
+ Acc.
parse_string(Bin) when is_binary(Bin) ->
- do_parse_string(Bin, <<>>).
-do_parse_string(<<>>, Acc) ->
- case unicode:characters_to_list(Acc) of
+ N = strlen(Bin, 0),
+ <<Prefix:N/binary,_/binary>> = Bin,
+ case unicode:characters_to_list(Prefix) of
Str when is_list(Str) ->
Str;
{incomplete, _Str, _Rest} ->
- binary:bin_to_list(Acc);
+ binary_to_list(Bin);
{error, _Str, _Rest} ->
throw({error, {bad_header, invalid_string}})
- end;
-do_parse_string(<<0, _/binary>>, Acc) ->
- do_parse_string(<<>>, Acc);
-do_parse_string(<<C, Rest/binary>>, Acc) ->
- do_parse_string(Rest, <<Acc/binary, C>>).
+ end.
+
+strlen(<<>>, N) -> N;
+strlen(<<0, _/binary>>, N) -> N;
+strlen(<<_, Rest/binary>>, N) -> strlen(Rest, N + 1).
convert_header(Bin, #reader{pos=Pos}=Reader)
when byte_size(Bin) =:= ?BLOCK_SIZE, (Pos rem ?BLOCK_SIZE) =:= 0 ->
diff --git a/lib/stdlib/src/ets.erl b/lib/stdlib/src/ets.erl
index 224937d4d3..979a75b231 100644
--- a/lib/stdlib/src/ets.erl
+++ b/lib/stdlib/src/ets.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -42,22 +42,27 @@
-export([i/0, i/1, i/2, i/3]).
--export_type([tab/0, tid/0, match_spec/0, comp_match_spec/0, match_pattern/0]).
+-export_type([table/0, table_access/0, table_type/0,
+ tid/0, match_spec/0, compiled_match_spec/0, match_pattern/0]).
%%-----------------------------------------------------------------------------
--type access() :: public | protected | private.
--type tab() :: atom() | tid().
--type type() :: set | ordered_set | bag | duplicate_bag.
--type continuation() :: '$end_of_table'
- | {tab(),integer(),integer(),comp_match_spec(),list(),integer()}
- | {tab(),_,_,integer(),comp_match_spec(),list(),integer(),integer()}.
+-type table_access() :: public | protected | private.
+-type table() :: atom() | tid().
+-type table_type() :: set | ordered_set | bag | duplicate_bag.
+-type continuation() :: '$end_of_table'
+ | {table(),integer(),integer(),compiled_match_spec(),list(),integer()}
+ | {table(),_,_,integer(),compiled_match_spec(),list(),integer(),integer()}.
--opaque tid() :: reference().
+-opaque tid() :: reference().
-type match_pattern() :: atom() | tuple().
-type match_spec() :: [{match_pattern(), [_], [_]}].
+%% Keep for backwards compatibility
+-export_type([tab/0, comp_match_spec/0]).
+-type tab() :: table().
+
%%-----------------------------------------------------------------------------
%%% BIFs
@@ -80,8 +85,8 @@
internal_delete_all/2,
internal_select_delete/2]).
--spec all() -> [Tab] when
- Tab :: tab().
+-spec all() -> [Table] when
+ Table :: table().
all() ->
receive_all(ets:internal_request_all(),
@@ -101,57 +106,57 @@ receive_all(Ref, N, All) ->
internal_request_all() ->
erlang:nif_error(undef).
--spec delete(Tab) -> true when
- Tab :: tab().
+-spec delete(Table) -> true when
+ Table :: table().
delete(_) ->
erlang:nif_error(undef).
--spec delete(Tab, Key) -> true when
- Tab :: tab(),
+-spec delete(Table, Key) -> true when
+ Table :: table(),
Key :: term().
delete(_, _) ->
erlang:nif_error(undef).
--spec delete_all_objects(Tab) -> true when
- Tab :: tab().
+-spec delete_all_objects(Table) -> true when
+ Table :: table().
-delete_all_objects(Tab) ->
- _ = ets:internal_delete_all(Tab, undefined),
+delete_all_objects(Table) ->
+ _ = ets:internal_delete_all(Table, undefined),
true.
--spec internal_delete_all(Tab, undefined) -> NumDeleted when
- Tab :: tab(),
+-spec internal_delete_all(Table, undefined) -> NumDeleted when
+ Table :: table(),
NumDeleted :: non_neg_integer().
internal_delete_all(_, _) ->
erlang:nif_error(undef).
--spec delete_object(Tab, Object) -> true when
- Tab :: tab(),
+-spec delete_object(Table, Object) -> true when
+ Table :: table(),
Object :: tuple().
delete_object(_, _) ->
erlang:nif_error(undef).
--spec first(Tab) -> Key | '$end_of_table' when
- Tab :: tab(),
+-spec first(Table) -> Key | '$end_of_table' when
+ Table :: table(),
Key :: term().
first(_) ->
erlang:nif_error(undef).
--spec give_away(Tab, Pid, GiftData) -> true when
- Tab :: tab(),
+-spec give_away(Table, Pid, GiftData) -> true when
+ Table :: table(),
Pid :: pid(),
GiftData :: term().
give_away(_, _, _) ->
erlang:nif_error(undef).
--spec info(Tab) -> InfoList | undefined when
- Tab :: tab(),
+-spec info(Table) -> InfoList | undefined when
+ Table :: table(),
InfoList :: [InfoTuple],
InfoTuple :: {compressed, boolean()}
| {decentralized_counters, boolean()}
@@ -163,17 +168,17 @@ give_away(_, _, _) ->
| {named_table, boolean()}
| {node, node()}
| {owner, pid()}
- | {protection, access()}
+ | {protection, table_access()}
| {size, non_neg_integer()}
- | {type, type()}
+ | {type, table_type()}
| {write_concurrency, boolean()}
| {read_concurrency, boolean()}.
info(_) ->
erlang:nif_error(undef).
--spec info(Tab, Item) -> Value | undefined when
- Tab :: tab(),
+-spec info(Table, Item) -> Value | undefined when
+ Table :: table(),
Item :: binary | compressed | decentralized_counters | fixed | heir | id | keypos | memory
| name | named_table | node | owner | protection
| safe_fixed | safe_fixed_monotonic_time | size | stats | type
@@ -183,15 +188,15 @@ info(_) ->
info(_, _) ->
erlang:nif_error(undef).
--spec insert(Tab, ObjectOrObjects) -> true when
- Tab :: tab(),
+-spec insert(Table, ObjectOrObjects) -> true when
+ Table :: table(),
ObjectOrObjects :: tuple() | [tuple()].
insert(_, _) ->
erlang:nif_error(undef).
--spec insert_new(Tab, ObjectOrObjects) -> boolean() when
- Tab :: tab(),
+-spec insert_new(Table, ObjectOrObjects) -> boolean() when
+ Table :: table(),
ObjectOrObjects :: tuple() | [tuple()].
insert_new(_, _) ->
@@ -203,23 +208,23 @@ insert_new(_, _) ->
is_compiled_ms(_) ->
erlang:nif_error(undef).
--spec last(Tab) -> Key | '$end_of_table' when
- Tab :: tab(),
+-spec last(Table) -> Key | '$end_of_table' when
+ Table :: table(),
Key :: term().
last(_) ->
erlang:nif_error(undef).
--spec lookup(Tab, Key) -> [Object] when
- Tab :: tab(),
+-spec lookup(Table, Key) -> [Object] when
+ Table :: table(),
Key :: term(),
Object :: tuple().
lookup(_, _) ->
erlang:nif_error(undef).
--spec lookup_element(Tab, Key, Pos) -> Elem when
- Tab :: tab(),
+-spec lookup_element(Table, Key, Pos) -> Elem when
+ Table :: table(),
Key :: term(),
Pos :: pos_integer(),
Elem :: term() | [term()].
@@ -227,17 +232,17 @@ lookup(_, _) ->
lookup_element(_, _, _) ->
erlang:nif_error(undef).
--spec match(Tab, Pattern) -> [Match] when
- Tab :: tab(),
+-spec match(Table, Pattern) -> [Match] when
+ Table :: table(),
Pattern :: match_pattern(),
Match :: [term()].
match(_, _) ->
erlang:nif_error(undef).
--spec match(Tab, Pattern, Limit) -> {[Match], Continuation} |
+-spec match(Table, Pattern, Limit) -> {[Match], Continuation} |
'$end_of_table' when
- Tab :: tab(),
+ Table :: table(),
Pattern :: match_pattern(),
Limit :: pos_integer(),
Match :: [term()],
@@ -254,17 +259,17 @@ match(_, _, _) ->
match(_) ->
erlang:nif_error(undef).
--spec match_object(Tab, Pattern) -> [Object] when
- Tab :: tab(),
+-spec match_object(Table, Pattern) -> [Object] when
+ Table :: table(),
Pattern :: match_pattern(),
Object :: tuple().
match_object(_, _) ->
erlang:nif_error(undef).
--spec match_object(Tab, Pattern, Limit) -> {[Object], Continuation} |
+-spec match_object(Table, Pattern, Limit) -> {[Object], Continuation} |
'$end_of_table' when
- Tab :: tab(),
+ Table :: table(),
Pattern :: match_pattern(),
Limit :: pos_integer(),
Object :: tuple(),
@@ -283,33 +288,34 @@ match_object(_) ->
-spec match_spec_compile(MatchSpec) -> CompiledMatchSpec when
MatchSpec :: match_spec(),
- CompiledMatchSpec :: comp_match_spec().
+ CompiledMatchSpec :: compiled_match_spec().
match_spec_compile(_) ->
erlang:nif_error(undef).
-spec match_spec_run_r(List, CompiledMatchSpec, list()) -> list() when
List :: [term()],
- CompiledMatchSpec :: comp_match_spec().
+ CompiledMatchSpec :: compiled_match_spec().
match_spec_run_r(_, _, _) ->
erlang:nif_error(undef).
--spec member(Tab, Key) -> boolean() when
- Tab :: tab(),
+-spec member(Table, Key) -> boolean() when
+ Table :: table(),
Key :: term().
member(_, _) ->
erlang:nif_error(undef).
--spec new(Name, Options) -> tid() | atom() when
+-spec new(Name, Options) -> table() when
Name :: atom(),
Options :: [Option],
Option :: Type | Access | named_table | {keypos,Pos}
| {heir, Pid :: pid(), HeirData} | {heir, none} | Tweaks,
- Type :: type(),
- Access :: access(),
- Tweaks :: {write_concurrency, boolean()}
+ Type :: table_type(),
+ Access :: table_access(),
+ WriteConcurrencyAlternative :: boolean() | auto,
+ Tweaks :: {write_concurrency, WriteConcurrencyAlternative}
| {read_concurrency, boolean()}
| {decentralized_counters, boolean()}
| compressed,
@@ -319,16 +325,16 @@ member(_, _) ->
new(_, _) ->
erlang:nif_error(undef).
--spec next(Tab, Key1) -> Key2 | '$end_of_table' when
- Tab :: tab(),
+-spec next(Table, Key1) -> Key2 | '$end_of_table' when
+ Table :: table(),
Key1 :: term(),
Key2 :: term().
next(_, _) ->
erlang:nif_error(undef).
--spec prev(Tab, Key1) -> Key2 | '$end_of_table' when
- Tab :: tab(),
+-spec prev(Table, Key1) -> Key2 | '$end_of_table' when
+ Table :: table(),
Key1 :: term(),
Key2 :: term().
@@ -336,31 +342,31 @@ prev(_, _) ->
erlang:nif_error(undef).
%% Shadowed by erl_bif_types: ets:rename/2
--spec rename(Tab, Name) -> Name when
- Tab :: tab(),
+-spec rename(Table, Name) -> Name when
+ Table :: table(),
Name :: atom().
rename(_, _) ->
erlang:nif_error(undef).
--spec safe_fixtable(Tab, Fix) -> true when
- Tab :: tab(),
+-spec safe_fixtable(Table, Fix) -> true when
+ Table :: table(),
Fix :: boolean().
safe_fixtable(_, _) ->
erlang:nif_error(undef).
--spec select(Tab, MatchSpec) -> [Match] when
- Tab :: tab(),
+-spec select(Table, MatchSpec) -> [Match] when
+ Table :: table(),
MatchSpec :: match_spec(),
Match :: term().
select(_, _) ->
erlang:nif_error(undef).
--spec select(Tab, MatchSpec, Limit) -> {[Match],Continuation} |
+-spec select(Table, MatchSpec, Limit) -> {[Match],Continuation} |
'$end_of_table' when
- Tab :: tab(),
+ Table :: table(),
MatchSpec :: match_spec(),
Limit :: pos_integer(),
Match :: term(),
@@ -376,51 +382,51 @@ select(_, _, _) ->
select(_) ->
erlang:nif_error(undef).
--spec select_count(Tab, MatchSpec) -> NumMatched when
- Tab :: tab(),
+-spec select_count(Table, MatchSpec) -> NumMatched when
+ Table :: table(),
MatchSpec :: match_spec(),
NumMatched :: non_neg_integer().
select_count(_, _) ->
erlang:nif_error(undef).
--spec select_delete(Tab, MatchSpec) -> NumDeleted when
- Tab :: tab(),
+-spec select_delete(Table, MatchSpec) -> NumDeleted when
+ Table :: table(),
MatchSpec :: match_spec(),
NumDeleted :: non_neg_integer().
-select_delete(Tab, [{'_',[],[true]}]) ->
- ets:internal_delete_all(Tab, undefined);
-select_delete(Tab, MatchSpec) ->
- ets:internal_select_delete(Tab, MatchSpec).
+select_delete(Table, [{'_',[],[true]}]) ->
+ ets:internal_delete_all(Table, undefined);
+select_delete(Table, MatchSpec) ->
+ ets:internal_select_delete(Table, MatchSpec).
--spec internal_select_delete(Tab, MatchSpec) -> NumDeleted when
- Tab :: tab(),
+-spec internal_select_delete(Table, MatchSpec) -> NumDeleted when
+ Table :: table(),
MatchSpec :: match_spec(),
NumDeleted :: non_neg_integer().
internal_select_delete(_, _) ->
erlang:nif_error(undef).
--spec select_replace(Tab, MatchSpec) -> NumReplaced when
- Tab :: tab(),
+-spec select_replace(Table, MatchSpec) -> NumReplaced when
+ Table :: table(),
MatchSpec :: match_spec(),
NumReplaced :: non_neg_integer().
select_replace(_, _) ->
erlang:nif_error(undef).
--spec select_reverse(Tab, MatchSpec) -> [Match] when
- Tab :: tab(),
+-spec select_reverse(Table, MatchSpec) -> [Match] when
+ Table :: table(),
MatchSpec :: match_spec(),
Match :: term().
select_reverse(_, _) ->
erlang:nif_error(undef).
--spec select_reverse(Tab, MatchSpec, Limit) -> {[Match],Continuation} |
+-spec select_reverse(Table, MatchSpec, Limit) -> {[Match],Continuation} |
'$end_of_table' when
- Tab :: tab(),
+ Table :: table(),
MatchSpec :: match_spec(),
Limit :: pos_integer(),
Match :: term(),
@@ -437,8 +443,8 @@ select_reverse(_, _, _) ->
select_reverse(_) ->
erlang:nif_error(undef).
--spec setopts(Tab, Opts) -> true when
- Tab :: tab(),
+-spec setopts(Table, Opts) -> true when
+ Table :: table(),
Opts :: Opt | [Opt],
Opt :: {heir, pid(), HeirData} | {heir,none},
HeirData :: term().
@@ -446,24 +452,24 @@ select_reverse(_) ->
setopts(_, _) ->
erlang:nif_error(undef).
--spec slot(Tab, I) -> [Object] | '$end_of_table' when
- Tab :: tab(),
+-spec slot(Table, I) -> [Object] | '$end_of_table' when
+ Table :: table(),
I :: non_neg_integer(),
Object :: tuple().
slot(_, _) ->
erlang:nif_error(undef).
--spec take(Tab, Key) -> [Object] when
- Tab :: tab(),
+-spec take(Table, Key) -> [Object] when
+ Table :: table(),
Key :: term(),
Object :: tuple().
take(_, _) ->
erlang:nif_error(undef).
--spec update_counter(Tab, Key, UpdateOp) -> Result when
- Tab :: tab(),
+-spec update_counter(Table, Key, UpdateOp) -> Result when
+ Table :: table(),
Key :: term(),
UpdateOp :: {Pos, Incr} | {Pos, Incr, Threshold, SetValue},
Pos :: integer(),
@@ -471,8 +477,8 @@ take(_, _) ->
Threshold :: integer(),
SetValue :: integer(),
Result :: integer();
- (Tab, Key, [UpdateOp]) -> [Result] when
- Tab :: tab(),
+ (Table, Key, [UpdateOp]) -> [Result] when
+ Table :: table(),
Key :: term(),
UpdateOp :: {Pos, Incr} | {Pos, Incr, Threshold, SetValue},
Pos :: integer(),
@@ -480,8 +486,8 @@ take(_, _) ->
Threshold :: integer(),
SetValue :: integer(),
Result :: integer();
- (Tab, Key, Incr) -> Result when
- Tab :: tab(),
+ (Table, Key, Incr) -> Result when
+ Table :: table(),
Key :: term(),
Incr :: integer(),
Result :: integer().
@@ -489,8 +495,8 @@ take(_, _) ->
update_counter(_, _, _) ->
erlang:nif_error(undef).
--spec update_counter(Tab, Key, UpdateOp, Default) -> Result when
- Tab :: tab(),
+-spec update_counter(Table, Key, UpdateOp, Default) -> Result when
+ Table :: table(),
Key :: term(),
UpdateOp :: {Pos, Incr}
| {Pos, Incr, Threshold, SetValue},
@@ -500,8 +506,8 @@ update_counter(_, _, _) ->
SetValue :: integer(),
Result :: integer(),
Default :: tuple();
- (Tab, Key, [UpdateOp], Default) -> [Result] when
- Tab :: tab(),
+ (Table, Key, [UpdateOp], Default) -> [Result] when
+ Table :: table(),
Key :: term(),
UpdateOp :: {Pos, Incr}
| {Pos, Incr, Threshold, SetValue},
@@ -511,8 +517,8 @@ update_counter(_, _, _) ->
SetValue :: integer(),
Result :: integer(),
Default :: tuple();
- (Tab, Key, Incr, Default) -> Result when
- Tab :: tab(),
+ (Table, Key, Incr, Default) -> Result when
+ Table :: table(),
Key :: term(),
Incr :: integer(),
Result :: integer(),
@@ -521,13 +527,13 @@ update_counter(_, _, _) ->
update_counter(_, _, _, _) ->
erlang:nif_error(undef).
--spec update_element(Tab, Key, ElementSpec :: {Pos, Value}) -> boolean() when
- Tab :: tab(),
+-spec update_element(Table, Key, ElementSpec :: {Pos, Value}) -> boolean() when
+ Table :: table(),
Key :: term(),
Pos :: pos_integer(),
Value :: term();
- (Tab, Key, ElementSpec :: [{Pos, Value}]) -> boolean() when
- Tab :: tab(),
+ (Table, Key, ElementSpec :: [{Pos, Value}]) -> boolean() when
+ Table :: table(),
Key :: term(),
Pos :: pos_integer(),
Value :: term().
@@ -542,11 +548,12 @@ whereis(_) ->
%%% End of BIFs
--opaque comp_match_spec() :: reference().
+-opaque compiled_match_spec() :: reference().
+-type comp_match_spec() :: compiled_match_spec().
-spec match_spec_run(List, CompiledMatchSpec) -> list() when
List :: [term()],
- CompiledMatchSpec :: comp_match_spec().
+ CompiledMatchSpec :: compiled_match_spec().
match_spec_run(List, CompiledMS) ->
lists:reverse(ets:match_spec_run_r(List, CompiledMS, [])).
@@ -613,9 +620,9 @@ fun2ms(ShellFun) when is_function(ShellFun) ->
shell]}})
end.
--spec foldl(Function, Acc0, Tab) -> Acc1 when
+-spec foldl(Function, Acc0, Table) -> Acc1 when
Function :: fun((Element :: term(), AccIn) -> AccOut),
- Tab :: tab(),
+ Table :: table(),
Acc0 :: term(),
Acc1 :: term(),
AccIn :: term(),
@@ -640,9 +647,9 @@ do_foldl(F, Accu0, Key, T) ->
ets:next(T, Key), T)
end.
--spec foldr(Function, Acc0, Tab) -> Acc1 when
+-spec foldr(Function, Acc0, Table) -> Acc1 when
Function :: fun((Element :: term(), AccIn) -> AccOut),
- Tab :: tab(),
+ Table :: table(),
Acc0 :: term(),
Acc1 :: term(),
AccIn :: term(),
@@ -667,8 +674,8 @@ do_foldr(F, Accu0, Key, T) ->
ets:prev(T, Key), T)
end.
--spec from_dets(Tab, DetsTab) -> 'true' when
- Tab :: tab(),
+-spec from_dets(Table, DetsTab) -> 'true' when
+ Table :: table(),
DetsTab :: dets:tab_name().
from_dets(EtsTable, DetsTable) ->
@@ -685,8 +692,8 @@ from_dets(EtsTable, DetsTable) ->
erlang:error(Unexpected,[EtsTable,DetsTable])
end.
--spec to_dets(Tab, DetsTab) -> DetsTab when
- Tab :: tab(),
+-spec to_dets(Table, DetsTab) -> DetsTab when
+ Table :: table(),
DetsTab :: dets:tab_name().
to_dets(EtsTable, DetsTable) ->
@@ -717,8 +724,8 @@ test_ms(Term, MS) ->
Error
end.
--spec init_table(Tab, InitFun) -> 'true' when
- Tab :: tab(),
+-spec init_table(Table, InitFun) -> 'true' when
+ Table :: table(),
InitFun :: fun((Arg) -> Res),
Arg :: 'read' | 'close',
Res :: 'end_of_input' | {Objects :: [term()], InitFun} | term().
@@ -746,8 +753,8 @@ init_table_sub(Table, [H|T]) ->
ets:insert(Table, H),
init_table_sub(Table, T).
--spec match_delete(Tab, Pattern) -> 'true' when
- Tab :: tab(),
+-spec match_delete(Table, Pattern) -> 'true' when
+ Table :: table(),
Pattern :: match_pattern().
match_delete(Table, Pattern) ->
@@ -756,8 +763,8 @@ match_delete(Table, Pattern) ->
%% Produce a list of tuples from a table
--spec tab2list(Tab) -> [Object] when
- Tab :: tab(),
+-spec tab2list(Table) -> [Object] when
+ Table :: table(),
Object :: tuple().
tab2list(T) ->
@@ -780,23 +787,23 @@ tab2list(T) ->
sync = false :: boolean()
}).
--spec tab2file(Tab, Filename) -> 'ok' | {'error', Reason} when
- Tab :: tab(),
+-spec tab2file(Table, Filename) -> 'ok' | {'error', Reason} when
+ Table :: table(),
Filename :: file:name(),
Reason :: term().
-tab2file(Tab, File) ->
- tab2file(Tab, File, []).
+tab2file(Table, File) ->
+ tab2file(Table, File, []).
--spec tab2file(Tab, Filename, Options) -> 'ok' | {'error', Reason} when
- Tab :: tab(),
+-spec tab2file(Table, Filename, Options) -> 'ok' | {'error', Reason} when
+ Table :: table(),
Filename :: file:name(),
Options :: [Option],
Option :: {'extended_info', [ExtInfo]} | {'sync', boolean()},
ExtInfo :: 'md5sum' | 'object_count',
Reason :: term().
-tab2file(Tab, File, Options) ->
+tab2file(Table, File, Options) ->
try
{ok, FtOptions} = parse_ft_options(Options),
_ = file:delete(File),
@@ -812,9 +819,9 @@ tab2file(Tab, File, Options) ->
throw(Reason)
end,
try
- Info0 = case ets:info(Tab) of
+ Info0 = case ets:info(Table) of
undefined ->
- %% erlang:error(badarg, [Tab, File, Options]);
+ %% erlang:error(badarg, [Table, File, Options]);
throw(badtab);
I ->
I
@@ -845,14 +852,14 @@ tab2file(Tab, File, Options) ->
end,
true}
end,
- ets:safe_fixtable(Tab,true),
+ ets:safe_fixtable(Table,true),
{NewState1,Num} = try
NewState = LogFun(InitState,Info),
dump_file(
- ets:select(Tab,[{'_',[],['$_']}],100),
+ ets:select(Table,[{'_',[],['$_']}],100),
LogFun, NewState, 0)
after
- (catch ets:safe_fixtable(Tab,false))
+ (catch ets:safe_fixtable(Table,false))
end,
EndInfo =
case FtOptions#filetab_options.object_count of
@@ -967,24 +974,24 @@ parse_ft_info_options(_,Malformed) ->
%% Opt := {verify,boolean()}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--spec file2tab(Filename) -> {'ok', Tab} | {'error', Reason} when
+-spec file2tab(Filename) -> {'ok', Table} | {'error', Reason} when
Filename :: file:name(),
- Tab :: tab(),
+ Table :: table(),
Reason :: term().
file2tab(File) ->
file2tab(File, []).
--spec file2tab(Filename, Options) -> {'ok', Tab} | {'error', Reason} when
+-spec file2tab(Filename, Options) -> {'ok', Table} | {'error', Reason} when
Filename :: file:name(),
- Tab :: tab(),
+ Table :: table(),
Options :: [Option],
Option :: {'verify', boolean()},
Reason :: term().
file2tab(File, Opts) ->
try
- {ok,Verify,TabArg} = parse_f2t_opts(Opts,false,[]),
+ {ok,Verify,TableArg} = parse_f2t_opts(Opts,false,[]),
Name = make_ref(),
{ok, Name} =
case disk_log:open([{name, Name},
@@ -1019,7 +1026,7 @@ file2tab(File, Opts) ->
true ->
ok
end,
- {ok, Tab, HeadCount} = create_tab(FullHeader, TabArg),
+ {ok, Table, HeadCount} = create_tab(FullHeader, TableArg),
StrippedOptions =
case Verify of
true ->
@@ -1061,17 +1068,17 @@ file2tab(File, Opts) ->
{false,0,[],DLContext}}
end,
try
- do_read_and_verify(ReadFun,InitState,Tab,
+ do_read_and_verify(ReadFun,InitState,Table,
StrippedOptions,HeadCount,Verify)
catch
throw:TReason ->
- ets:delete(Tab),
+ ets:delete(Table),
throw(TReason);
exit:ExReason ->
- ets:delete(Tab),
+ ets:delete(Table),
exit(ExReason);
error:ErReason:StackTrace ->
- ets:delete(Tab),
+ ets:delete(Table),
erlang:raise(error,ErReason,StackTrace)
end
after
@@ -1084,8 +1091,8 @@ file2tab(File, Opts) ->
{error,ExReason2}
end.
-do_read_and_verify(ReadFun,InitState,Tab,FtOptions,HeadCount,Verify) ->
- case load_table(ReadFun,InitState,Tab) of
+do_read_and_verify(ReadFun,InitState,Table,FtOptions,HeadCount,Verify) ->
+ case load_table(ReadFun,InitState,Table) of
{ok,{_,FinalCount,[],_}} ->
case {FtOptions#filetab_options.md5sum,
FtOptions#filetab_options.object_count} of
@@ -1104,7 +1111,7 @@ do_read_and_verify(ReadFun,InitState,Tab,FtOptions,HeadCount,Verify) ->
_ ->
throw(badfile)
end,
- {ok,Tab};
+ {ok,Table};
{ok,{FinalMD5State,FinalCount,['$end_of_table',LastInfo],_}} ->
ECount = case lists:keyfind(count,1,LastInfo) of
{count,N} ->
@@ -1152,17 +1159,17 @@ do_read_and_verify(ReadFun,InitState,Tab,FtOptions,HeadCount,Verify) ->
ok
end
end,
- {ok,Tab}
+ {ok,Table}
end.
-parse_f2t_opts([],Verify,Tab) ->
- {ok,Verify,Tab};
-parse_f2t_opts([{verify, true}|T],_OV,Tab) ->
- parse_f2t_opts(T,true,Tab);
-parse_f2t_opts([{verify,false}|T],OV,Tab) ->
- parse_f2t_opts(T,OV,Tab);
-parse_f2t_opts([{table,Tab}|T],OV,[]) ->
- parse_f2t_opts(T,OV,Tab);
+parse_f2t_opts([],Verify,Table) ->
+ {ok,Verify,Table};
+parse_f2t_opts([{verify, true}|T],_OV,Table) ->
+ parse_f2t_opts(T,true,Table);
+parse_f2t_opts([{verify,false}|T],OV,Table) ->
+ parse_f2t_opts(T,OV,Table);
+parse_f2t_opts([{table,Table}|T],OV,[]) ->
+ parse_f2t_opts(T,OV,Table);
parse_f2t_opts([Unexpected|_],_,_) ->
throw({unknown_option,Unexpected});
parse_f2t_opts(Malformed,_,_) ->
@@ -1331,17 +1338,17 @@ scan_for_endinfo([Term|T], Count) ->
{NewLast,NCount,Rest} = scan_for_endinfo(T, Count+1),
{NewLast,NCount,[Term | Rest]}.
-load_table(ReadFun, State, Tab) ->
+load_table(ReadFun, State, Table) ->
{NewState,NewData} = ReadFun(State),
case NewData of
[] ->
{ok,NewState};
List ->
- ets:insert(Tab, List),
- load_table(ReadFun, NewState, Tab)
+ ets:insert(Table, List),
+ load_table(ReadFun, NewState, Table)
end.
-create_tab(I, TabArg) ->
+create_tab(I, TableArg) ->
{name, Name} = lists:keyfind(name, 1, I),
{type, Type} = lists:keyfind(type, 1, I),
{protection, P} = lists:keyfind(protection, 1, I),
@@ -1365,16 +1372,16 @@ create_tab(I, TabArg) ->
{read_concurrency, _}=Rcc -> [Rcc | L4];
false -> L4
end,
- case TabArg of
+ case TableArg of
[] ->
try
- Tab = ets:new(Name, L5),
- {ok, Tab, Sz}
+ Table = ets:new(Name, L5),
+ {ok, Table, Sz}
catch _:_ ->
throw(cannot_create_table)
end;
_ ->
- {ok, TabArg, Sz}
+ {ok, TableArg, Sz}
end.
@@ -1446,15 +1453,15 @@ tabfile_info(File) when is_list(File) ; is_atom(File) ->
{error,ExReason}
end.
--spec table(Tab) -> QueryHandle when
- Tab :: tab(),
+-spec table(Table) -> QueryHandle when
+ Table :: table(),
QueryHandle :: qlc:query_handle().
-table(Tab) ->
- table(Tab, []).
+table(Table) ->
+ table(Table, []).
--spec table(Tab, Options) -> QueryHandle when
- Tab :: tab(),
+-spec table(Table, Options) -> QueryHandle when
+ Table :: table(),
QueryHandle :: qlc:query_handle(),
Options :: [Option] | Option,
Option :: {'n_objects', NObjects}
@@ -1463,25 +1470,25 @@ table(Tab) ->
TraverseMethod :: 'first_next' | 'last_prev'
| 'select' | {'select', MatchSpec :: match_spec()}.
-table(Tab, Opts) ->
+table(Table, Opts) ->
case options(Opts, [traverse, n_objects]) of
{badarg,_} ->
- erlang:error(badarg, [Tab, Opts]);
+ erlang:error(badarg, [Table, Opts]);
[[Traverse, NObjs], QlcOptions] ->
TF = case Traverse of
first_next ->
- fun() -> qlc_next(Tab, ets:first(Tab)) end;
+ fun() -> qlc_next(Table, ets:first(Table)) end;
last_prev ->
- fun() -> qlc_prev(Tab, ets:last(Tab)) end;
+ fun() -> qlc_prev(Table, ets:last(Table)) end;
select ->
- fun(MS) -> qlc_select(ets:select(Tab, MS, NObjs)) end;
+ fun(MS) -> qlc_select(ets:select(Table, MS, NObjs)) end;
{select, MS} ->
- fun() -> qlc_select(ets:select(Tab, MS, NObjs)) end
+ fun() -> qlc_select(ets:select(Table, MS, NObjs)) end
end,
- PreFun = fun(_) -> ets:safe_fixtable(Tab, true) end,
- PostFun = fun() -> ets:safe_fixtable(Tab, false) end,
- InfoFun = fun(Tag) -> table_info(Tab, Tag) end,
- KeyEquality = case ets:info(Tab, type) of
+ PreFun = fun(_) -> ets:safe_fixtable(Table, true) end,
+ PostFun = fun() -> ets:safe_fixtable(Table, false) end,
+ InfoFun = fun(Tag) -> table_info(Table, Tag) end,
+ KeyEquality = case ets:info(Table, type) of
ordered_set -> '==';
_ -> '=:='
end,
@@ -1491,28 +1498,28 @@ table(Tab, Opts) ->
undefined;
_ ->
fun(_Pos, [K]) ->
- ets:lookup(Tab, K);
+ ets:lookup(Table, K);
(_Pos, Ks) ->
- lists:flatmap(fun(K) -> ets:lookup(Tab, K)
+ lists:flatmap(fun(K) -> ets:lookup(Table, K)
end, Ks)
end
end,
FormatFun =
fun({all, _NElements, _ElementFun}) ->
- As = [Tab | [Opts || _ <- [[]], Opts =/= []]],
+ As = [Table | [Opts || _ <- [[]], Opts =/= []]],
{?MODULE, table, As};
({match_spec, MS}) ->
{?MODULE, table,
- [Tab, [{traverse, {select, MS}} |
+ [Table, [{traverse, {select, MS}} |
listify(Opts)]]};
({lookup, _KeyPos, [Value], _NElements, ElementFun}) ->
io_lib:format("~w:lookup(~w, ~w)",
- [?MODULE, Tab, ElementFun(Value)]);
+ [?MODULE, Table, ElementFun(Value)]);
({lookup, _KeyPos, Values, _NElements, ElementFun}) ->
Vals = [ElementFun(V) || V <- Values],
io_lib:format("lists:flatmap(fun(V) -> "
"~w:lookup(~w, V) end, ~w)",
- [?MODULE, Tab, Vals])
+ [?MODULE, Table, Vals])
end,
qlc:table(TF, [{pre_fun, PreFun}, {post_fun, PostFun},
{info_fun, InfoFun}, {format_fun, FormatFun},
@@ -1520,26 +1527,26 @@ table(Tab, Opts) ->
{lookup_fun, LookupFun}] ++ QlcOptions)
end.
-table_info(Tab, num_of_objects) ->
- ets:info(Tab, size);
-table_info(Tab, keypos) ->
- ets:info(Tab, keypos);
-table_info(Tab, is_unique_objects) ->
- ets:info(Tab, type) =/= duplicate_bag;
-table_info(Tab, is_sorted_key) ->
- ets:info(Tab, type) =:= ordered_set;
-table_info(_Tab, _) ->
+table_info(Table, num_of_objects) ->
+ ets:info(Table, size);
+table_info(Table, keypos) ->
+ ets:info(Table, keypos);
+table_info(Table, is_unique_objects) ->
+ ets:info(Table, type) =/= duplicate_bag;
+table_info(Table, is_sorted_key) ->
+ ets:info(Table, type) =:= ordered_set;
+table_info(_Table, _) ->
undefined.
-qlc_next(_Tab, '$end_of_table') ->
+qlc_next(_Table, '$end_of_table') ->
[];
-qlc_next(Tab, Key) ->
- ets:lookup(Tab, Key) ++ fun() -> qlc_next(Tab, ets:next(Tab, Key)) end.
+qlc_next(Table, Key) ->
+ ets:lookup(Table, Key) ++ fun() -> qlc_next(Table, ets:next(Table, Key)) end.
-qlc_prev(_Tab, '$end_of_table') ->
+qlc_prev(_Table, '$end_of_table') ->
[];
-qlc_prev(Tab, Key) ->
- ets:lookup(Tab, Key) ++ fun() -> qlc_prev(Tab, ets:prev(Tab, Key)) end.
+qlc_prev(Table, Key) ->
+ ets:lookup(Table, Key) ++ fun() -> qlc_prev(Table, ets:prev(Table, Key)) end.
qlc_select('$end_of_table') ->
[];
@@ -1604,20 +1611,20 @@ i() ->
tabs() ->
lists:sort(ets:all()).
-prinfo(Tab) ->
- case catch prinfo2(Tab) of
+prinfo(Table) ->
+ case catch prinfo2(Table) of
{'EXIT', _} ->
- io:format("~-10s ... unreadable \n", [to_string(Tab)]);
+ io:format("~-10s ... unreadable \n", [to_string(Table)]);
ok ->
ok
end.
-prinfo2(Tab) ->
- Name = ets:info(Tab, name),
- Type = ets:info(Tab, type),
- Size = ets:info(Tab, size),
- Mem = ets:info(Tab, memory),
- Owner = ets:info(Tab, owner),
- hform(Tab, Name, Type, Size, Mem, is_reg(Owner)).
+prinfo2(Table) ->
+ Name = ets:info(Table, name),
+ Type = ets:info(Table, type),
+ Size = ets:info(Table, size),
+ Mem = ets:info(Table, memory),
+ Owner = ets:info(Table, owner),
+ hform(Table, Name, Type, Size, Mem, is_reg(Owner)).
is_reg(Owner) ->
case process_info(Owner, registered_name) of
@@ -1651,69 +1658,69 @@ to_string(X) ->
lists:flatten(io_lib:format("~p", [X])).
%% view a specific table
--spec i(Tab) -> 'ok' when
- Tab :: tab().
+-spec i(Table) -> 'ok' when
+ Table :: table().
-i(Tab) ->
- i(Tab, 40).
+i(Table) ->
+ i(Table, 40).
--spec i(tab(), pos_integer()) -> 'ok'.
+-spec i(table(), pos_integer()) -> 'ok'.
-i(Tab, Height) ->
- i(Tab, Height, 80).
+i(Table, Height) ->
+ i(Table, Height, 80).
--spec i(tab(), pos_integer(), pos_integer()) -> 'ok'.
+-spec i(table(), pos_integer(), pos_integer()) -> 'ok'.
-i(Tab, Height, Width) ->
- First = ets:first(Tab),
- display_items(Height, Width, Tab, First, 1, 1).
+i(Table, Height, Width) ->
+ First = ets:first(Table),
+ display_items(Height, Width, Table, First, 1, 1).
-display_items(Height, Width, Tab, '$end_of_table', Turn, Opos) ->
+display_items(Height, Width, Table, '$end_of_table', Turn, Opos) ->
P = 'EOT (q)uit (p)Digits (k)ill /Regexp -->',
- choice(Height, Width, P, eot, Tab, '$end_of_table', Turn, Opos);
-display_items(Height, Width, Tab, Key, Turn, Opos) when Turn < Height ->
- do_display(Height, Width, Tab, Key, Turn, Opos);
-display_items(Height, Width, Tab, Key, Turn, Opos) when Turn >= Height ->
+ choice(Height, Width, P, eot, Table, '$end_of_table', Turn, Opos);
+display_items(Height, Width, Table, Key, Turn, Opos) when Turn < Height ->
+ do_display(Height, Width, Table, Key, Turn, Opos);
+display_items(Height, Width, Table, Key, Turn, Opos) when Turn >= Height ->
P = '(c)ontinue (q)uit (p)Digits (k)ill /Regexp -->',
- choice(Height, Width, P, normal, Tab, Key, Turn, Opos).
+ choice(Height, Width, P, normal, Table, Key, Turn, Opos).
-choice(Height, Width, P, Mode, Tab, Key, Turn, Opos) ->
+choice(Height, Width, P, Mode, Table, Key, Turn, Opos) ->
case get_line(P, "c\n") of
"c\n" when Mode =:= normal ->
- do_display(Height, Width, Tab, Key, 1, Opos);
+ do_display(Height, Width, Table, Key, 1, Opos);
"c\n" when is_tuple(Mode), element(1, Mode) =:= re ->
{re, Re} = Mode,
- re_search(Height, Width, Tab, Key, Re, 1, Opos);
+ re_search(Height, Width, Table, Key, Re, 1, Opos);
"q\n" ->
ok;
"k\n" ->
- ets:delete(Tab),
+ ets:delete(Table),
ok;
[$p|Digs] ->
catch case catch list_to_integer(nonl(Digs)) of
{'EXIT', _} ->
io:put_chars("Bad digits\n");
Number when Mode =:= normal ->
- print_number(Tab, ets:first(Tab), Number);
+ print_number(Table, ets:first(Table), Number);
Number when Mode =:= eot ->
- print_number(Tab, ets:first(Tab), Number);
+ print_number(Table, ets:first(Table), Number);
Number -> %% regexp
{re, Re} = Mode,
- print_re_num(Tab, ets:first(Tab), Number, Re)
+ print_re_num(Table, ets:first(Table), Number, Re)
end,
- choice(Height, Width, P, Mode, Tab, Key, Turn, Opos);
+ choice(Height, Width, P, Mode, Table, Key, Turn, Opos);
[$/|Regexp] -> %% from regexp
case re:compile(nonl(Regexp),[unicode]) of
{ok,Re} ->
- re_search(Height, Width, Tab, ets:first(Tab), Re, 1, 1);
+ re_search(Height, Width, Table, ets:first(Table), Re, 1, 1);
{error,{ErrorString,_Pos}} ->
io:format("~ts\n", [ErrorString]),
- choice(Height, Width, P, Mode, Tab, Key, Turn, Opos)
+ choice(Height, Width, P, Mode, Table, Key, Turn, Opos)
end;
eof ->
ok;
_ ->
- choice(Height, Width, P, Mode, Tab, Key, Turn, Opos)
+ choice(Height, Width, P, Mode, Table, Key, Turn, Opos)
end.
get_line(P, Default) ->
@@ -1731,22 +1738,22 @@ line_string(Other) -> Other.
nonl(S) -> string:trim(S, trailing, "$\n").
-print_number(Tab, Key, Num) ->
- Os = ets:lookup(Tab, Key),
+print_number(Table, Key, Num) ->
+ Os = ets:lookup(Table, Key),
Len = length(Os),
if
(Num - Len) < 1 ->
O = lists:nth(Num, Os),
io:format("~p~n", [O]); %% use ppterm here instead
true ->
- print_number(Tab, ets:next(Tab, Key), Num - Len)
+ print_number(Table, ets:next(Table, Key), Num - Len)
end.
-do_display(Height, Width, Tab, Key, Turn, Opos) ->
- Objs = ets:lookup(Tab, Key),
+do_display(Height, Width, Table, Key, Turn, Opos) ->
+ Objs = ets:lookup(Table, Key),
do_display_items(Height, Width, Objs, Opos),
Len = length(Objs),
- display_items(Height, Width, Tab, ets:next(Tab, Key), Turn+Len, Opos+Len).
+ display_items(Height, Width, Table, ets:next(Table, Key), Turn+Len, Opos+Len).
do_display_items(Height, Width, [Obj|Tail], Opos) ->
do_display_item(Height, Width, Obj, Opos),
@@ -1764,37 +1771,37 @@ do_display_item(_Height, Width, I, Opos) ->
end,
io:format("<~-4w> ~s~n", [Opos,L2]).
-re_search(Height, Width, Tab, '$end_of_table', Re, Turn, Opos) ->
+re_search(Height, Width, Table, '$end_of_table', Re, Turn, Opos) ->
P = 'EOT (q)uit (p)Digits (k)ill /Regexp -->',
- choice(Height, Width, P, {re, Re}, Tab, '$end_of_table', Turn, Opos);
-re_search(Height, Width, Tab, Key, Re, Turn, Opos) when Turn < Height ->
- re_display(Height, Width, Tab, Key, ets:lookup(Tab, Key), Re, Turn, Opos);
-re_search(Height, Width, Tab, Key, Re, Turn, Opos) ->
+ choice(Height, Width, P, {re, Re}, Table, '$end_of_table', Turn, Opos);
+re_search(Height, Width, Table, Key, Re, Turn, Opos) when Turn < Height ->
+ re_display(Height, Width, Table, Key, ets:lookup(Table, Key), Re, Turn, Opos);
+re_search(Height, Width, Table, Key, Re, Turn, Opos) ->
P = '(c)ontinue (q)uit (p)Digits (k)ill /Regexp -->',
- choice(Height, Width, P, {re, Re}, Tab, Key, Turn, Opos).
+ choice(Height, Width, P, {re, Re}, Table, Key, Turn, Opos).
-re_display(Height, Width, Tab, Key, [], Re, Turn, Opos) ->
- re_search(Height, Width, Tab, ets:next(Tab, Key), Re, Turn, Opos);
-re_display(Height, Width, Tab, Key, [H|T], Re, Turn, Opos) ->
+re_display(Height, Width, Table, Key, [], Re, Turn, Opos) ->
+ re_search(Height, Width, Table, ets:next(Table, Key), Re, Turn, Opos);
+re_display(Height, Width, Table, Key, [H|T], Re, Turn, Opos) ->
Str = to_string(H),
case re:run(Str, Re, [{capture,none}]) of
match ->
do_display_item(Height, Width, H, Opos),
- re_display(Height, Width, Tab, Key, T, Re, Turn+1, Opos+1);
+ re_display(Height, Width, Table, Key, T, Re, Turn+1, Opos+1);
nomatch ->
- re_display(Height, Width, Tab, Key, T, Re, Turn, Opos)
+ re_display(Height, Width, Table, Key, T, Re, Turn, Opos)
end.
print_re_num(_,'$end_of_table',_,_) -> ok;
-print_re_num(Tab, Key, Num, Re) ->
- Os = re_match(ets:lookup(Tab, Key), Re),
+print_re_num(Table, Key, Num, Re) ->
+ Os = re_match(ets:lookup(Table, Key), Re),
Len = length(Os),
if
(Num - Len) < 1 ->
O = lists:nth(Num, Os),
io:format("~p~n", [O]); %% use ppterm here instead
true ->
- print_re_num(Tab, ets:next(Tab, Key), Num - Len, Re)
+ print_re_num(Table, ets:next(Table, Key), Num - Len, Re)
end.
re_match([], _) -> [];
diff --git a/lib/stdlib/src/eval_bits.erl b/lib/stdlib/src/eval_bits.erl
index 966bc65902..b7c4d02ea5 100644
--- a/lib/stdlib/src/eval_bits.erl
+++ b/lib/stdlib/src/eval_bits.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -22,8 +22,8 @@
%% Avoid warning for local function error/1 clashing with autoimported BIF.
-compile({no_auto_import,[error/1]}).
--export([expr_grp/3,expr_grp/5,match_bits/6,
- match_bits/7,bin_gen/6]).
+-export([expr_grp/3,expr_grp/4,match_bits/6,
+ match_bits/7,bin_gen/6,bin_gen/7]).
-define(STACKTRACE,
element(2, erlang:process_info(self(), current_stacktrace))).
@@ -40,11 +40,13 @@
%% lookup a variable in the bindings, or add a new binding
%%
%% @type field(). Represents a field in a "bin".
+%%
+%% @type errorfun(). A closure invoked in case of errors.
%%% Part 1: expression evaluation (binary construction)
%% @spec expr_grp(Fields::[field()], Bindings::bindings(),
-%% EvalFun::evalfun(), term(), term()) ->
+%% EvalFun::evalfun(), ErrorFun::errorfun()) ->
%% {value, binary(), bindings()}
%%
%% @doc Returns a tuple with {value,Bin,Bs} where Bin is the binary
@@ -52,29 +54,23 @@
%% contains the present bindings. This function can also throw an
%% exception if the construction fails.
-expr_grp(Fields, Bindings, EvalFun, [], _) ->
- expr_grp(Fields, Bindings, EvalFun, <<>>);
-expr_grp(Fields, Bindings, EvalFun, ListOfBits, _) ->
- Bin = convert_list(ListOfBits),
- expr_grp(Fields, Bindings, EvalFun, Bin).
-
-convert_list(List) ->
- << <<X:1>> || X <- List >>.
+expr_grp(Fields, Bindings, EvalFun, ErrorFun) ->
+ expr_grp(Fields, Bindings, EvalFun, ErrorFun, <<>>).
expr_grp(Fields, Bindings, EvalFun) ->
- expr_grp(Fields, Bindings, EvalFun, <<>>).
+ expr_grp(Fields, Bindings, EvalFun, fun default_error/3, <<>>).
-expr_grp(FS, Bs0, Ef, Acc) ->
+expr_grp(FS, Bs0, EvalFun, ErrorFun, Acc) ->
%% Separate the evaluation of values, sizes, and TLS:s from the
%% creation of the binary in order to mimic compiled code when it
%% comes to loops and failures.
- {ListOfEvalField,Bs1} = expr_grp1(FS, Bs0, Ef, []),
+ {ListOfEvalField,Bs1} = expr_grp1(FS, Bs0, EvalFun, ErrorFun, [], 1),
{value,create_binary(ListOfEvalField, Acc),Bs1}.
-expr_grp1([Field | FS], Bs0, Ef, ListOfEvalField) ->
- {EvalField,Bs} = eval_field(Field, Bs0, Ef),
- expr_grp1(FS, Bs, Ef, [EvalField|ListOfEvalField]);
-expr_grp1([], Bs, _Ef, ListOfFieldData) ->
+expr_grp1([Field | FS], Bs0, EvalFun, ErrorFun, ListOfEvalField, Pos) ->
+ {EvalField,Bs} = eval_field(Field, Bs0, EvalFun, ErrorFun, Pos),
+ expr_grp1(FS, Bs, EvalFun, ErrorFun, [EvalField|ListOfEvalField], Pos + 1);
+expr_grp1([], Bs, _EvalFun, _ErrorFun, ListOfFieldData, _Pos) ->
{lists:reverse(ListOfFieldData),Bs}.
create_binary([EvalField|ListOfEvalField], Acc) ->
@@ -83,44 +79,54 @@ create_binary([EvalField|ListOfEvalField], Acc) ->
create_binary([], Acc) ->
Acc.
-eval_field({bin_element, _, {string, _, S}, {integer,_,8}, [integer,{unit,1},unsigned,big]}, Bs0, _Fun) ->
+eval_field({bin_element, _, {string, _, S}, {integer,_,8}, [integer,{unit,1},unsigned,big]}, Bs0, _Fun, _ErrorFun, _Pos) ->
Latin1 = [C band 16#FF || C <- S],
{fun() -> list_to_binary(Latin1) end,Bs0};
-eval_field({bin_element, _, {string, _, S}, default, default}, Bs0, _Fun) ->
+eval_field({bin_element, _, {string, _, S}, default, default}, Bs0, _Fun, _ErrorFun, _Pos) ->
Latin1 = [C band 16#FF || C <- S],
{fun() ->list_to_binary(Latin1) end,Bs0};
-eval_field({bin_element, Anno, {string, _, S}, Size0, Options0}, Bs0, Fun) ->
+eval_field({bin_element, Anno, {string, _, S}, Size0, Options0}, Bs0, Fun, ErrorFun, Pos) ->
{Size1,[Type,{unit,Unit},Sign,Endian]} =
- make_bit_type(Anno, Size0, Options0),
+ make_bit_type(Anno, Size0, Options0, ErrorFun),
{value,Size,Bs1} = Fun(Size1, Bs0),
{fun() ->
- Res = << <<(eval_exp_field1(C, Size, Unit,
- Type, Endian, Sign))/bitstring>> ||
+ Res = << <<(eval_exp_field1(Anno, C, Size, Unit,
+ Type, Endian, Sign, ErrorFun, Pos))/bitstring>> ||
C <- S >>,
case S of
"" -> % find errors also when the string is empty
- _ = eval_exp_field1(0, Size, Unit, Type, Endian, Sign),
+ _ = eval_exp_field1(Anno, 0, Size, Unit, Type, Endian, Sign, ErrorFun, Pos),
ok;
_ ->
ok
end,
Res
end,Bs1};
-eval_field({bin_element,Anno,E,Size0,Options0}, Bs0, Fun) ->
+eval_field({bin_element,Anno,E,Size0,Options0}, Bs0, Fun, ErrorFun, Pos) ->
{value,V,Bs1} = Fun(E, Bs0),
{Size1,[Type,{unit,Unit},Sign,Endian]} =
- make_bit_type(Anno, Size0, Options0),
+ make_bit_type(Anno, Size0, Options0, ErrorFun),
{value,Size,Bs} = Fun(Size1, Bs1),
- {fun() -> eval_exp_field1(V, Size, Unit, Type, Endian, Sign) end,Bs}.
+ {fun() -> eval_exp_field1(Anno, V, Size, Unit, Type, Endian, Sign, ErrorFun, Pos) end,Bs}.
-eval_exp_field1(V, Size, Unit, Type, Endian, Sign) ->
+eval_exp_field1(Anno, V, Size, Unit, Type, Endian, Sign, ErrorFun, Pos) ->
try
- eval_exp_field(V, Size, Unit, Type, Endian, Sign)
+ eval_exp_field(V, Size, Unit, Type, Endian, Sign)
catch
- error:system_limit ->
- erlang:raise(error, system_limit, ?STACKTRACE);
- error:_ ->
- erlang:raise(error, badarg, ?STACKTRACE)
+ error:system_limit:Stacktrace ->
+ ErrorFun(Anno, system_limit, add_eval_pos_to_error_info(Stacktrace, Pos));
+ error:_:Stacktrace ->
+ ErrorFun(Anno, badarg, add_eval_pos_to_error_info(Stacktrace, Pos))
+ end.
+
+add_eval_pos_to_error_info([{Mod, Fun, Arity, Meta0} = Head, _Skip | Rest], Pos) ->
+ case lists:keytake(error_info, 1, Meta0) of
+ {value, {error_info, #{} = Info}, Meta1} ->
+ Meta2 = Meta1 ++ [{error_info, Info#{override_segment_position => Pos}}],
+ [{Mod, Fun, Arity, Meta2} | Rest];
+
+ _ ->
+ [Head | Rest]
end.
eval_exp_field(Val, Size, Unit, integer, little, signed) ->
@@ -169,7 +175,8 @@ eval_exp_field(Val, Size, Unit, binary, _, _) ->
%%% Part 2: matching in binary comprehensions
%% @spec bin_gen(BinPattern::{bin,integer(),[field()]}, Bin::binary(),
%% GlobalEnv::bindings(), LocalEnv::bindings(),
-%% MatchFun::matchfun(), EvalFun::evalfun()) ->
+%% MatchFun::matchfun(), EvalFun::evalfun(),
+%% ErrorFun::errorfun()) ->
%% {match, binary(), bindings()} | {nomatch, binary()} | done
%%
%% @doc Used to perform matching in a comprehension. If the match
@@ -178,25 +185,28 @@ eval_exp_field(Val, Size, Unit, binary, _, _) ->
%% If nothing remains of the binary the atom 'done' is returned.
bin_gen({bin,_,Fs}, Bin, Bs0, BBs0, Mfun, Efun) ->
- bin_gen(Fs, Bin, Bs0, BBs0, Mfun, Efun, true).
+ bin_gen(Fs, Bin, Bs0, BBs0, Mfun, Efun, fun default_error/3, true).
+
+bin_gen({bin,_,Fs}, Bin, Bs0, BBs0, Mfun, Efun, ErrorFun) ->
+ bin_gen(Fs, Bin, Bs0, BBs0, Mfun, Efun, ErrorFun, true).
-bin_gen([F|Fs], Bin, Bs0, BBs0, Mfun, Efun, Flag)
+bin_gen([F|Fs], Bin, Bs0, BBs0, Mfun, Efun, ErrorFun, Flag)
when is_function(Mfun, 2), is_function(Efun, 2) ->
- case bin_gen_field(F, Bin, Bs0, BBs0, Mfun, Efun) of
+ case bin_gen_field(F, Bin, Bs0, BBs0, Mfun, Efun, ErrorFun) of
{match,Bs,BBs,Rest} ->
- bin_gen(Fs, Rest, Bs, BBs, Mfun, Efun, Flag);
+ bin_gen(Fs, Rest, Bs, BBs, Mfun, Efun, ErrorFun, Flag);
{nomatch,Rest} ->
- bin_gen(Fs, Rest, Bs0, BBs0, Mfun, Efun, false);
+ bin_gen(Fs, Rest, Bs0, BBs0, Mfun, Efun, ErrorFun, false);
done ->
done
end;
-bin_gen([], Bin, Bs0, _BBs0, _Mfun, _Efun, true) ->
+bin_gen([], Bin, Bs0, _BBs0, _Mfun, _Efun, _ErrorFun, true) ->
{match, Bin, Bs0};
-bin_gen([], Bin, _Bs0, _BBs0, _Mfun, _Efun, false) ->
+bin_gen([], Bin, _Bs0, _BBs0, _Mfun, _Efun, _ErrorFun, false) ->
{nomatch, Bin}.
bin_gen_field({bin_element,_,{string,_,S},default,default},
- Bin, Bs, BBs, _Mfun, _Efun) ->
+ Bin, Bs, BBs, _Mfun, _Efun, _ErrorFun) ->
Bits = try list_to_binary(S)
catch _:_ -> <<>>
end,
@@ -210,9 +220,9 @@ bin_gen_field({bin_element,_,{string,_,S},default,default},
done
end;
bin_gen_field({bin_element,Anno,{string,SAnno,S},Size0,Options0},
- Bin0, Bs0, BBs0, Mfun, Efun) ->
+ Bin0, Bs0, BBs0, Mfun, Efun, ErrorFun) ->
{Size1, [Type,{unit,Unit},Sign,Endian]} =
- make_bit_type(Anno, Size0, Options0),
+ make_bit_type(Anno, Size0, Options0, ErrorFun),
case catch Efun(Size1, BBs0) of
{value, Size, _BBs} -> %
F = fun(C, Bin, Bs, BBs) ->
@@ -222,9 +232,9 @@ bin_gen_field({bin_element,Anno,{string,SAnno,S},Size0,Options0},
bin_gen_field_string(S, Bin0, Bs0, BBs0, F)
end;
bin_gen_field({bin_element,Anno,VE,Size0,Options0},
- Bin, Bs0, BBs0, Mfun, Efun) ->
+ Bin, Bs0, BBs0, Mfun, Efun, ErrorFun) ->
{Size1, [Type,{unit,Unit},Sign,Endian]} =
- make_bit_type(Anno, Size0, Options0),
+ make_bit_type(Anno, Size0, Options0, ErrorFun),
V = erl_eval:partial_eval(VE),
NewV = coerce_to_float(V, Type),
case catch Efun(Size1, BBs0) of
@@ -264,41 +274,42 @@ bin_gen_field1(Bin, Type, Size, Unit, Sign, Endian, NewV, Bs0, BBs0, Mfun) ->
%%% Part 3: binary pattern matching
%% @spec match_bits(Fields::[field()], Bin::binary(),
%% GlobalEnv::bindings(), LocalEnv::bindings(),
-%% MatchFun::matchfun(),EvalFun::evalfun(), term()) ->
-%% {match, bindings()}
+%% MatchFun::matchfun(),EvalFun::evalfun(),
+%% ErrorFun::errorfun()) ->
+%% {match, bindings()}
%% @doc Used to perform matching. If the match succeeds a new
%% environment is returned. If the match have some syntactic or
%% semantic problem which would have been caught at compile time this
%% function throws 'invalid', if the matching fails for other reasons
%% the function throws 'nomatch'
-match_bits(Fs, Bin, Bs0, BBs, Mfun, Efun, _) ->
- match_bits(Fs, Bin, Bs0, BBs, Mfun, Efun).
+match_bits(Fs, Bin, Bs0, BBs, Mfun, Efun) ->
+ match_bits(Fs, Bin, Bs0, BBs, Mfun, Efun, fun default_error/3).
-match_bits(Fs, Bin, Bs0, BBs, Mfun, Efun)
- when is_function(Mfun, 2), is_function(Efun, 2) ->
- case catch match_bits_1(Fs, Bin, Bs0, BBs, Mfun, Efun) of
+match_bits(Fs, Bin, Bs0, BBs, Mfun, Efun, ErrorFun)
+ when is_function(Mfun, 2), is_function(Efun, 2), is_function(ErrorFun, 3) ->
+ case catch match_bits_1(Fs, Bin, Bs0, BBs, Mfun, Efun, ErrorFun) of
{match,Bs} -> {match,Bs};
invalid -> throw(invalid);
_Error -> throw(nomatch)
end.
-match_bits_1([], <<>>, Bs, _BBs, _Mfun, _Efun) ->
+match_bits_1([], <<>>, Bs, _BBs, _Mfun, _Efun, _ErrorFun) ->
{match,Bs};
-match_bits_1([F|Fs], Bits0, Bs0, BBs0, Mfun, Efun) ->
- {Bs,BBs,Bits} = match_field_1(F, Bits0, Bs0, BBs0, Mfun, Efun),
- match_bits_1(Fs, Bits, Bs, BBs, Mfun, Efun).
+match_bits_1([F|Fs], Bits0, Bs0, BBs0, Mfun, Efun, ErrorFun) ->
+ {Bs,BBs,Bits} = match_field_1(F, Bits0, Bs0, BBs0, Mfun, Efun, ErrorFun),
+ match_bits_1(Fs, Bits, Bs, BBs, Mfun, Efun, ErrorFun).
match_field_1({bin_element,_,{string,_,S},default,default},
- Bin, Bs, BBs, _Mfun, _Efun) ->
+ Bin, Bs, BBs, _Mfun, _Efun, _ErrorFun) ->
Bits = list_to_binary(S), % fails if there are characters > 255
Size = byte_size(Bits),
<<Bits:Size/binary,Rest/binary-unit:1>> = Bin,
{Bs,BBs,Rest};
match_field_1({bin_element,Anno,{string,SAnno,S},Size0,Options0},
- Bin0, Bs0, BBs0, Mfun, Efun) ->
+ Bin0, Bs0, BBs0, Mfun, Efun, ErrorFun) ->
{Size1, [Type,{unit,Unit},Sign,Endian]} =
- make_bit_type(Anno, Size0, Options0),
+ make_bit_type(Anno, Size0, Options0, ErrorFun),
Size2 = erl_eval:partial_eval(Size1),
{value, Size, _BBs} = Efun(Size2, BBs0),
F = fun(C, Bin, Bs, BBs) ->
@@ -307,9 +318,9 @@ match_field_1({bin_element,Anno,{string,SAnno,S},Size0,Options0},
end,
match_field_string(S, Bin0, Bs0, BBs0, F);
match_field_1({bin_element,Anno,VE,Size0,Options0},
- Bin, Bs0, BBs0, Mfun, Efun) ->
+ Bin, Bs0, BBs0, Mfun, Efun, ErrorFun) ->
{Size1, [Type,{unit,Unit},Sign,Endian]} =
- make_bit_type(Anno, Size0, Options0),
+ make_bit_type(Anno, Size0, Options0, ErrorFun),
V = erl_eval:partial_eval(VE),
NewV = coerce_to_float(V, Type),
Size2 = erl_eval:partial_eval(Size1),
@@ -410,15 +421,18 @@ get_float(Bin, Size, big) ->
{Val,Rest}.
%% Identical to the one in sys_pre_expand.
-make_bit_type(Anno, default, Type0) ->
+make_bit_type(Anno, default, Type0, ErrorFun) ->
case erl_bits:set_bit_type(default, Type0) of
{ok,all,Bt} -> {{atom,Anno,all},erl_bits:as_list(Bt)};
{ok,undefined,Bt} -> {{atom,Anno,undefined},erl_bits:as_list(Bt)};
{ok,Size,Bt} -> {{integer,Anno,Size},erl_bits:as_list(Bt)};
- {error,Reason} -> erlang:raise(error, Reason, ?STACKTRACE)
+ {error,Reason} -> ErrorFun(Anno, Reason, ?STACKTRACE)
end;
-make_bit_type(_Anno, Size, Type0) -> %Size evaluates to an integer or 'all'
+make_bit_type(Anno, Size, Type0, ErrorFun) -> %Size evaluates to an integer or 'all'
case erl_bits:set_bit_type(Size, Type0) of
{ok,Size,Bt} -> {Size,erl_bits:as_list(Bt)};
- {error,Reason} -> erlang:raise(error, Reason, ?STACKTRACE)
+ {error,Reason} -> ErrorFun(Anno, Reason, ?STACKTRACE)
end.
+
+default_error(_Anno, Reason, Stacktrace) ->
+ erlang:raise(error, Reason, Stacktrace).
diff --git a/lib/stdlib/src/filelib.erl b/lib/stdlib/src/filelib.erl
index 7f8c282a79..de08352398 100644
--- a/lib/stdlib/src/filelib.erl
+++ b/lib/stdlib/src/filelib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
%% File utilities.
-export([wildcard/1, wildcard/2, is_dir/1, is_file/1, is_regular/1]).
--export([fold_files/5, last_modified/1, file_size/1, ensure_dir/1]).
+-export([fold_files/5, last_modified/1, file_size/1, ensure_dir/1, ensure_path/1]).
-export([wildcard/3, is_dir/2, is_file/2, is_regular/2]).
-export([fold_files/6, last_modified/2, file_size/2]).
-export([find_file/2, find_file/3, find_source/1, find_source/2, find_source/3]).
@@ -218,6 +218,7 @@ do_file_size(File, Mod) ->
0
end.
+
%%----------------------------------------------------------------------
%% +type ensure_dir(X) -> ok | {error, Reason}.
%% +type X = filename() | dirname()
@@ -230,27 +231,37 @@ ensure_dir("/") ->
ok;
ensure_dir(F) ->
Dir = filename:dirname(F),
- case do_is_dir(Dir, file) of
- true ->
- ok;
- false when Dir =:= F ->
- %% Protect against infinite loop
- {error,einval};
- false ->
- _ = ensure_dir(Dir),
- case file:make_dir(Dir) of
- {error,eexist}=EExist ->
- case do_is_dir(Dir, file) of
- true ->
- ok;
- false ->
- EExist
- end;
- Err ->
- Err
- end
- end.
+ ensure_path(Dir).
+-spec ensure_path(Path) -> 'ok' | {'error', Reason} when
+ Path :: dirname_all(),
+ Reason :: file:posix().
+ensure_path("/") ->
+ ok;
+
+ensure_path(Path) ->
+ case do_is_dir(Path, file) of
+ true ->
+ ok;
+ false ->
+ case filename:dirname(Path) of
+ Parent when Parent =:= Path ->
+ {error,einval};
+ Parent ->
+ _ = ensure_path(Parent),
+ case file:make_dir(Path) of
+ {error,eexist}=EExist ->
+ case do_is_dir(Path, file) of
+ true ->
+ ok;
+ false ->
+ EExist
+ end;
+ Other ->
+ Other
+ end
+ end
+ end.
%%%
%%% Pattern matching using a compiled wildcard.
@@ -646,6 +657,7 @@ default_search_rules() ->
{".o", ".c", c_source_search_rules()},
{"", ".c", c_source_search_rules()},
{"", ".in", basic_source_search_rules()},
+ {".beam", ".asn1", asn1_source_search_rules()},
%% plain old directory rules, backwards compatible
{"", ""}] ++ erl_source_search_rules().
@@ -661,6 +673,9 @@ erl_source_search_rules() ->
c_source_search_rules() ->
[{"priv","c_src"}, {"priv","src"}, {"bin","c_src"}, {"bin","src"}, {"", "src"}].
+asn1_source_search_rules() ->
+ [{"ebin","src"},{"ebin","asn1"}].
+
%% Looks for a file relative to a given directory
-type find_file_rule() :: {ObjDirSuffix::string(), SrcDirSuffix::string()}.
diff --git a/lib/stdlib/src/gb_sets.erl b/lib/stdlib/src/gb_sets.erl
index 6d6f7d40ac..8dda0d4ee0 100644
--- a/lib/stdlib/src/gb_sets.erl
+++ b/lib/stdlib/src/gb_sets.erl
@@ -871,7 +871,7 @@ is_set(_) -> false.
Set1 :: set(Element),
Set2 :: set(Element).
-filter(F, S) ->
+filter(F, S) when is_function(F, 1) ->
from_ordset([X || X <- to_list(S), F(X)]).
-spec fold(Function, Acc0, Set) -> Acc1 when
diff --git a/lib/stdlib/src/gen.erl b/lib/stdlib/src/gen.erl
index 9a7ccaa312..363094fb15 100644
--- a/lib/stdlib/src/gen.erl
+++ b/lib/stdlib/src/gen.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -29,37 +29,58 @@
-export([start/5, start/6, debug_options/2, hibernate_after/1,
name/1, unregister_name/1, get_proc_name/1, get_parent/0,
call/3, call/4, reply/2,
- send_request/3, wait_response/2,
- receive_response/2, check_response/2,
+ send_request/3, send_request/5,
+ wait_response/2, receive_response/2, check_response/2,
+ wait_response/3, receive_response/3, check_response/3,
+ reqids_new/0, reqids_size/1,
+ reqids_add/3, reqids_to_list/1,
stop/1, stop/3]).
-export([init_it/6, init_it/7]).
--export([format_status_header/2]).
+-export([format_status_header/2, format_status/4]).
+-define(MAX_INT_TIMEOUT, 4294967295).
-define(default_timeout, 5000).
+-include("logger.hrl").
+
%%-----------------------------------------------------------------
+-export_type([reply_tag/0,
+ request_id/0,
+ request_id_collection/0]).
+
-type linkage() :: 'monitor' | 'link' | 'nolink'.
-type emgr_name() :: {'local', atom()}
| {'global', term()}
| {'via', Module :: module(), Name :: term()}.
--type start_ret() :: {'ok', pid()} | {'ok', {pid(), reference()}} | 'ignore' | {'error', term()}.
+-type start_ret() :: {'ok', pid()}
+ | {'ok', {pid(), reference()}}
+ | 'ignore'
+ | {'error', term()}.
--type debug_flag() :: 'trace' | 'log' | 'statistics' | 'debug'
- | {'logfile', string()}.
-type option() :: {'timeout', timeout()}
- | {'debug', [debug_flag()]}
+ | {'debug', [sys:debug_option()]}
| {'hibernate_after', timeout()}
| {'spawn_opt', [proc_lib:spawn_option()]}.
--type options() :: [option()].
-type server_ref() :: pid() | atom() | {atom(), node()}
| {global, term()} | {via, module(), term()}.
--type request_id() :: term().
+-opaque reply_tag() :: % As accepted by reply/2
+ reference()
+ | nonempty_improper_list('alias', reference())
+ | nonempty_improper_list(
+ nonempty_improper_list('alias', reference()), term()).
+
+-opaque request_id() :: reference().
+
+-opaque request_id_collection() :: map().
+
+-type response_timeout() ::
+ 0..?MAX_INT_TIMEOUT | 'infinity' | {abs, integer()}.
%%-----------------------------------------------------------------
%% Starts a generic process.
@@ -77,7 +98,7 @@
%% The 'already_started' is returned only if Name is given
%%-----------------------------------------------------------------
--spec start(module(), linkage(), emgr_name(), module(), term(), options()) ->
+-spec start(module(), linkage(), emgr_name(), module(), term(), [option()]) ->
start_ret().
start(GenMod, LinkP, Name, Mod, Args, Options) ->
@@ -88,7 +109,7 @@ start(GenMod, LinkP, Name, Mod, Args, Options) ->
{error, {already_started, Pid}}
end.
--spec start(module(), linkage(), module(), term(), options()) -> start_ret().
+-spec start(module(), linkage(), module(), term(), [option()]) -> start_ret().
start(GenMod, LinkP, Mod, Args, Options) ->
do_spawn(GenMod, LinkP, Mod, Args, Options).
@@ -201,6 +222,8 @@ call(Process, Label, Request, Timeout)
-dialyzer({no_improper_lists, do_call/4}).
+do_call(Process, _Label, _Request, _Timeout) when Process =:= self() ->
+ exit(calling_self);
do_call(Process, Label, Request, infinity)
when (is_pid(Process)
andalso (node(Process) == node()))
@@ -263,11 +286,12 @@ get_node(Process) ->
node(Process)
end.
--spec send_request(Name::server_ref(), Label::term(), Request::term()) -> request_id().
-send_request(Process, Label, Request) when is_pid(Process) ->
- do_send_request(Process, Label, Request);
-send_request(Process, Label, Request) ->
- Fun = fun(Pid) -> do_send_request(Pid, Label, Request) end,
+-spec send_request(Name::server_ref(), Tag::term(), Request::term()) ->
+ request_id().
+send_request(Process, Tag, Request) when is_pid(Process) ->
+ do_send_request(Process, Tag, Request);
+send_request(Process, Tag, Request) ->
+ Fun = fun(Pid) -> do_send_request(Pid, Tag, Request) end,
try do_for_proc(Process, Fun)
catch exit:Reason ->
%% Make send_request async and fake a down message
@@ -276,62 +300,232 @@ send_request(Process, Label, Request) ->
Mref
end.
+-spec send_request(Name::server_ref(), Tag::term(), Request::term(),
+ Label::term(), ReqIdCol::request_id_collection()) ->
+ request_id_collection().
+send_request(Process, Tag, Request, Label, ReqIdCol) when is_map(ReqIdCol) ->
+ maps:put(send_request(Process, Tag, Request), Label, ReqIdCol).
+
-dialyzer({no_improper_lists, do_send_request/3}).
-do_send_request(Process, Label, Request) ->
- Mref = erlang:monitor(process, Process, [{alias, demonitor}]),
- erlang:send(Process, {Label, {self(), [alias|Mref]}, Request}, [noconnect]),
- Mref.
+do_send_request(Process, Tag, Request) ->
+ ReqId = erlang:monitor(process, Process, [{alias, demonitor}]),
+ _ = erlang:send(Process, {Tag, {self(), [alias|ReqId]}, Request}, [noconnect]),
+ ReqId.
%%
%% Wait for a reply to the client.
%% Note: if timeout is returned monitors are kept.
--spec wait_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {term(), server_ref()}}.
-wait_response(Mref, Timeout) when is_reference(Mref) ->
+-spec wait_response(ReqId, Timeout) -> Result when
+ ReqId :: request_id(),
+ Timeout :: response_timeout(),
+ Resp :: {reply, Reply::term()} | {error, {Reason::term(), server_ref()}},
+ Result :: Resp | 'timeout'.
+
+wait_response(ReqId, Timeout) ->
+ TMO = timeout_value(Timeout),
receive
- {[alias|Mref], Reply} ->
- erlang:demonitor(Mref, [flush]),
+ {[alias|ReqId], Reply} ->
+ erlang:demonitor(ReqId, [flush]),
{reply, Reply};
- {'DOWN', Mref, _, Object, Reason} ->
+ {'DOWN', ReqId, _, Object, Reason} ->
{error, {Reason, Object}}
- after Timeout ->
+ after TMO ->
timeout
end.
--spec receive_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {term(), server_ref()}}.
-receive_response(Mref, Timeout) when is_reference(Mref) ->
+-spec wait_response(ReqIdCol, Timeout, Delete) -> Result when
+ ReqIdCol :: request_id_collection(),
+ Timeout :: response_timeout(),
+ Delete :: boolean(),
+ Resp :: {reply, Reply::term()} | {error, {Reason::term(), server_ref()}},
+ Result :: {Resp, Label::term(), NewReqIdCol::request_id_collection()} |
+ 'no_request' | 'timeout'.
+
+wait_response(ReqIdCol, Timeout, Delete) when map_size(ReqIdCol) == 0,
+ is_boolean(Delete) ->
+ _ = timeout_value(Timeout),
+ no_request;
+wait_response(ReqIdCol, Timeout, Delete) when is_map(ReqIdCol),
+ is_boolean(Delete) ->
+ TMO = timeout_value(Timeout),
receive
- {[alias|Mref], Reply} ->
- erlang:demonitor(Mref, [flush]),
+ {[alias|ReqId], _} = Msg when is_map_key(ReqId, ReqIdCol) ->
+ collection_result(Msg, ReqIdCol, Delete);
+ {'DOWN', ReqId, _, _, _} = Msg when is_map_key(ReqId, ReqIdCol) ->
+ collection_result(Msg, ReqIdCol, Delete)
+ after TMO ->
+ timeout
+ end.
+
+-spec receive_response(ReqId, Timeout) -> Result when
+ ReqId :: request_id(),
+ Timeout :: response_timeout(),
+ Resp :: {reply, Reply::term()} | {error, {Reason::term(), server_ref()}},
+ Result :: Resp | 'timeout'.
+
+receive_response(ReqId, Timeout) ->
+ TMO = timeout_value(Timeout),
+ receive
+ {[alias|ReqId], Reply} ->
+ erlang:demonitor(ReqId, [flush]),
{reply, Reply};
- {'DOWN', Mref, _, Object, Reason} ->
+ {'DOWN', ReqId, _, Object, Reason} ->
{error, {Reason, Object}}
- after Timeout ->
- erlang:demonitor(Mref, [flush]),
+ after TMO ->
+ erlang:demonitor(ReqId, [flush]),
receive
- {[alias|Mref], Reply} ->
+ {[alias|ReqId], Reply} ->
{reply, Reply}
after 0 ->
timeout
end
end.
--spec check_response(RequestId::term(), Key::request_id()) ->
- {reply, Reply::term()} | 'no_reply' | {error, {term(), server_ref()}}.
-check_response(Msg, Mref) when is_reference(Mref) ->
+-spec receive_response(ReqIdCol, Timeout, Delete) -> Result when
+ ReqIdCol :: request_id_collection(),
+ Timeout :: response_timeout(),
+ Delete :: boolean(),
+ Resp :: {reply, Reply::term()} | {error, {Reason::term(), server_ref()}},
+ Result :: {Resp, Label::term(), NewReqIdCol::request_id_collection()}
+ | 'no_request' | 'timeout'.
+
+receive_response(ReqIdCol, Timeout, Delete) when map_size(ReqIdCol) == 0,
+ is_boolean(Delete) ->
+ _ = timeout_value(Timeout),
+ no_request;
+receive_response(ReqIdCol, Timeout, Delete) when is_map(ReqIdCol),
+ is_boolean(Delete) ->
+ TMO = timeout_value(Timeout),
+ receive
+ {[alias|ReqId], _} = Msg when is_map_key(ReqId, ReqIdCol) ->
+ collection_result(Msg, ReqIdCol, Delete);
+ {'DOWN', Mref, _, _, _} = Msg when is_map_key(Mref, ReqIdCol) ->
+ collection_result(Msg, ReqIdCol, Delete)
+ after TMO ->
+ maps:foreach(fun (ReqId, _Label) when is_reference(ReqId) ->
+ erlang:demonitor(ReqId, [flush]);
+ (_, _) ->
+ error(badarg)
+ end, ReqIdCol),
+ flush_responses(ReqIdCol),
+ timeout
+ end.
+
+-spec check_response(Msg::term(), ReqIdOrReqIdCol) -> Result when
+ ReqIdOrReqIdCol :: request_id() | request_id_collection(),
+ ReqIdResp :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ ReqIdColResp :: {{reply, Reply::term()}, Label::term()} |
+ {{error, {Reason::term(), server_ref()}}, Label::term()},
+ Result :: ReqIdResp | ReqIdColResp | 'no_reply'.
+
+check_response(Msg, ReqId) when is_reference(ReqId) ->
case Msg of
- {[alias|Mref], Reply} ->
- erlang:demonitor(Mref, [flush]),
+ {[alias|ReqId], Reply} ->
+ erlang:demonitor(ReqId, [flush]),
{reply, Reply};
- {'DOWN', Mref, _, Object, Reason} ->
+ {'DOWN', ReqId, _, Object, Reason} ->
{error, {Reason, Object}};
_ ->
no_reply
+ end;
+check_response(_, _) ->
+ error(badarg).
+
+-spec check_response(Msg, ReqIdCol, Delete) -> Result when
+ Msg :: term(),
+ ReqIdCol :: request_id_collection(),
+ Delete :: boolean(),
+ Resp :: {reply, Reply::term()} | {error, {Reason::term(), server_ref()}},
+ Result :: {Resp, Label::term(), NewReqIdCol::request_id_collection()}
+ | 'no_request' | 'no_reply'.
+
+check_response(_Msg, ReqIdCol, Delete) when map_size(ReqIdCol) == 0,
+ is_boolean(Delete) ->
+ no_request;
+check_response(Msg, ReqIdCol, Delete) when is_map(ReqIdCol),
+ is_boolean(Delete) ->
+ case Msg of
+ {[alias|ReqId], _} = Msg when is_map_key(ReqId, ReqIdCol) ->
+ collection_result(Msg, ReqIdCol, Delete);
+ {'DOWN', Mref, _, _, _} = Msg when is_map_key(Mref, ReqIdCol) ->
+ collection_result(Msg, ReqIdCol, Delete);
+ _ ->
+ no_reply
+ end.
+
+collection_result({[alias|ReqId], Reply}, ReqIdCol, Delete) ->
+ _ = erlang:demonitor(ReqId, [flush]),
+ collection_result({reply, Reply}, ReqId, ReqIdCol, Delete);
+collection_result({'DOWN', ReqId, _, Object, Reason}, ReqIdCol, Delete) ->
+ collection_result({error, {Reason, Object}}, ReqId, ReqIdCol, Delete).
+
+collection_result(Resp, ReqId, ReqIdCol, false) ->
+ {Resp, maps:get(ReqId, ReqIdCol), ReqIdCol};
+collection_result(Resp, ReqId, ReqIdCol, true) ->
+ {Label, NewReqIdCol} = maps:take(ReqId, ReqIdCol),
+ {Resp, Label, NewReqIdCol}.
+
+flush_responses(ReqIdCol) ->
+ receive
+ {[alias|Mref], _Reply} when is_map_key(Mref, ReqIdCol) ->
+ flush_responses(ReqIdCol)
+ after 0 ->
+ ok
end.
+timeout_value(infinity) ->
+ infinity;
+timeout_value(Timeout) when 0 =< Timeout, Timeout =< ?MAX_INT_TIMEOUT ->
+ Timeout;
+timeout_value({abs, Timeout}) when is_integer(Timeout) ->
+ case Timeout - erlang:monotonic_time(millisecond) of
+ TMO when TMO < 0 ->
+ 0;
+ TMO when TMO > ?MAX_INT_TIMEOUT ->
+ error(badarg);
+ TMO ->
+ TMO
+ end;
+timeout_value(_) ->
+ error(badarg).
+
+-spec reqids_new() ->
+ NewReqIdCol::request_id_collection().
+
+reqids_new() ->
+ maps:new().
+
+-spec reqids_size(request_id_collection()) ->
+ non_neg_integer().
+reqids_size(ReqIdCol) when is_map(ReqIdCol) ->
+ maps:size(ReqIdCol);
+reqids_size(_) ->
+ error(badarg).
+
+-spec reqids_add(ReqId::request_id(), Label::term(),
+ ReqIdCol::request_id_collection()) ->
+ NewReqIdCol::request_id_collection().
+
+reqids_add(ReqId, _, ReqIdCol) when is_reference(ReqId),
+ is_map_key(ReqId, ReqIdCol) ->
+ error(badarg);
+reqids_add(ReqId, Label, ReqIdCol) when is_reference(ReqId),
+ is_map(ReqIdCol) ->
+ maps:put(ReqId, Label, ReqIdCol);
+reqids_add(_, _, _) ->
+ error(badarg).
+
+-spec reqids_to_list(ReqIdCol::request_id_collection()) ->
+ [{ReqId::request_id(), Label::term()}].
+
+reqids_to_list(ReqIdCol) when is_map(ReqIdCol) ->
+ maps:to_list(ReqIdCol);
+reqids_to_list(_) ->
+ error(badarg).
+
%%
%% Send a reply to the client.
%%
@@ -546,3 +740,41 @@ format_status_header(TagLine, RegName) when is_atom(RegName) ->
lists:concat([TagLine, " ", RegName]);
format_status_header(TagLine, Name) ->
{TagLine, Name}.
+
+-spec format_status(Mod :: module(), Opt :: terminate | normal, Status, Args) ->
+ ReturnStatus when
+ Status :: #{ atom() => term() },
+ ReturnStatus :: #{ atom() => term(), '$status' => term()},
+ Args :: list(term()) | undefined.
+format_status(Mod, Opt, Status, Args) ->
+ case {erlang:function_exported(Mod, format_status, 1),
+ erlang:function_exported(Mod, format_status, 2)} of
+ {true, _} ->
+ try Mod:format_status(Status) of
+ NewStatus when is_map(NewStatus) ->
+ MergedStatus = maps:merge(Status, NewStatus),
+ case maps:size(MergedStatus) =:= maps:size(NewStatus) of
+ true ->
+ MergedStatus;
+ false ->
+ Status#{ 'EXIT' => atom_to_list(Mod) ++ ":format_status/1 returned a map with unknown keys" }
+ end;
+ _ ->
+ Status#{ 'EXIT' => atom_to_list(Mod) ++ ":format_status/1 did not return a map" }
+ catch
+ _:_ ->
+ Status#{ 'EXIT' => atom_to_list(Mod) ++ ":format_status/1 crashed" }
+ end;
+ {false, true} when is_list(Args) ->
+ try Mod:format_status(Opt, Args) of
+ Result ->
+ Status#{ '$status' => Result }
+ catch
+ throw:Result ->
+ Status#{ '$status' => Result };
+ _:_ ->
+ Status#{ 'EXIT' => atom_to_list(Mod) ++ ":format_status/2 crashed" }
+ end;
+ {false, _} ->
+ Status
+ end.
diff --git a/lib/stdlib/src/gen_event.erl b/lib/stdlib/src/gen_event.erl
index 17b914e5da..3f5737f304 100644
--- a/lib/stdlib/src/gen_event.erl
+++ b/lib/stdlib/src/gen_event.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -43,7 +43,11 @@
notify/2, sync_notify/2,
add_handler/3, add_sup_handler/3, delete_handler/3, swap_handler/3,
swap_sup_handler/3, which_handlers/1, call/3, call/4,
- send_request/3, wait_response/2, receive_response/2, check_response/2,
+ send_request/3, send_request/5,
+ wait_response/2, receive_response/2, check_response/2,
+ wait_response/3, receive_response/3, check_response/3,
+ reqids_new/0, reqids_size/1,
+ reqids_add/3, reqids_to_list/1,
wake_hib/5]).
-export([init_it/6,
@@ -58,7 +62,7 @@
-export([format_log/1, format_log/2]).
-export_type([handler/0, handler_args/0, add_handler_ret/0,
- del_handler_ret/0]).
+ del_handler_ret/0, request_id/0, request_id_collection/0]).
-record(handler, {module :: atom(),
id = false,
@@ -118,9 +122,15 @@
PDict :: [{Key :: term(), Value :: term()}],
State :: term(),
Status :: term().
+-callback format_status(Status) -> NewStatus when
+ Status :: #{ state => term(),
+ message => term(),
+ reason => term(),
+ log => [sys:system_event()] },
+ NewStatus :: Status.
-optional_callbacks(
- [handle_info/2, terminate/2, code_change/3, format_status/2]).
+ [handle_info/2, terminate/2, code_change/3, format_status/1, format_status/2]).
%%---------------------------------------------------------------------------
@@ -141,7 +151,13 @@
| {'via', atom(), term()} | pid().
-type start_ret() :: {'ok', pid()} | {'error', term()}.
-type start_mon_ret() :: {'ok', {pid(),reference()}} | {'error', term()}.
--type request_id() :: term().
+
+-opaque request_id() :: gen:request_id().
+
+-opaque request_id_collection() :: gen:request_id_collection().
+
+-type response_timeout() ::
+ timeout() | {abs, integer()}.
%%---------------------------------------------------------------------------
@@ -236,32 +252,182 @@ call(M, Handler, Query) -> call1(M, Handler, Query).
-spec call(emgr_ref(), handler(), term(), timeout()) -> term().
call(M, Handler, Query, Timeout) -> call1(M, Handler, Query, Timeout).
--spec send_request(emgr_ref(), handler(), term()) -> request_id().
-send_request(M, Handler, Query) ->
- gen:send_request(M, self(), {call, Handler, Query}).
+-spec send_request(EventMgrRef::emgr_ref(), Handler::handler(), Request::term()) ->
+ ReqId::request_id().
+send_request(M, Handler, Request) ->
+ try
+ gen:send_request(M, self(), {call, Handler, Request})
+ catch
+ error:badarg ->
+ error(badarg, [M, Handler, Request])
+ end.
--spec wait_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), emgr_ref()}}.
-wait_response(RequestId, Timeout) ->
- case gen:wait_response(RequestId, Timeout) of
+-spec send_request(EventMgrRef::emgr_ref(),
+ Handler::handler(),
+ Request::term(),
+ Label::term(),
+ ReqIdCollection::request_id_collection()) ->
+ NewReqIdCollection::request_id_collection().
+send_request(M, Handler, Request, Label, ReqIdCol) ->
+ try
+ gen:send_request(M, self(), {call, Handler, Request}, Label, ReqIdCol)
+ catch
+ error:badarg ->
+ error(badarg, [M, Handler, Request, Label, ReqIdCol])
+ end.
+
+-spec wait_response(ReqId, WaitTime) -> Result when
+ ReqId :: request_id(),
+ WaitTime :: response_timeout(),
+ Response :: {reply, Reply::term()}
+ | {error, {Reason::term(), emgr_ref()}},
+ Result :: Response | 'timeout'.
+
+wait_response(ReqId, WaitTime) ->
+ try gen:wait_response(ReqId, WaitTime) of
{reply, {error, _} = Err} -> Err;
Return -> Return
+ catch
+ error:badarg ->
+ error(badarg, [ReqId, WaitTime])
end.
--spec receive_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), emgr_ref()}}.
-receive_response(RequestId, Timeout) ->
- case gen:receive_response(RequestId, Timeout) of
+-spec wait_response(ReqIdCollection, WaitTime, Delete) -> Result when
+ ReqIdCollection :: request_id_collection(),
+ WaitTime :: response_timeout(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), emgr_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'timeout'.
+
+wait_response(ReqIdCol, WaitTime, Delete) ->
+ try gen:wait_response(ReqIdCol, WaitTime, Delete) of
+ {{reply, {error, _} = Err}, Label, NewReqIdCol} ->
+ {Err, Label, NewReqIdCol};
+ Return ->
+ Return
+ catch
+ error:badarg ->
+ error(badarg, [ReqIdCol, WaitTime, Delete])
+ end.
+
+-spec receive_response(ReqId, Timeout) -> Result when
+ ReqId :: request_id(),
+ Timeout :: response_timeout(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), emgr_ref()}},
+ Result :: Response | 'timeout'.
+
+receive_response(ReqId, Timeout) ->
+ try gen:receive_response(ReqId, Timeout) of
{reply, {error, _} = Err} -> Err;
Return -> Return
+ catch
+ error:badarg ->
+ error(badarg, [ReqId, Timeout])
+ end.
+
+-spec receive_response(ReqIdCollection, Timeout, Delete) -> Result when
+ ReqIdCollection :: request_id_collection(),
+ Timeout :: response_timeout(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), emgr_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'timeout'.
+
+receive_response(ReqIdCol, Timeout, Delete) ->
+ try gen:receive_response(ReqIdCol, Timeout, Delete) of
+ {{reply, {error, _} = Err}, Label, NewReqIdCol} ->
+ {Err, Label, NewReqIdCol};
+ Return ->
+ Return
+ catch
+ error:badarg ->
+ error(badarg, [ReqIdCol, Timeout, Delete])
end.
--spec check_response(Msg::term(), RequestId::request_id()) ->
- {reply, Reply::term()} | 'no_reply' | {error, {Reason::term(), emgr_ref()}}.
-check_response(Msg, RequestId) ->
- case gen:check_response(Msg, RequestId) of
+-spec check_response(Msg, ReqId) -> Result when
+ Msg :: term(),
+ ReqId :: request_id(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), emgr_ref()}},
+ Result :: Response | 'no_reply'.
+
+check_response(Msg, ReqId) ->
+ try gen:check_response(Msg, ReqId) of
{reply, {error, _} = Err} -> Err;
Return -> Return
+ catch
+ error:badarg ->
+ error(badarg, [Msg, ReqId])
+ end.
+
+-spec check_response(Msg, ReqIdCollection, Delete) -> Result when
+ Msg :: term(),
+ ReqIdCollection :: request_id_collection(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), emgr_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'no_reply'.
+
+check_response(Msg, ReqIdCol, Delete) ->
+ try gen:check_response(Msg, ReqIdCol, Delete) of
+ {{reply, {error, _} = Err}, Label, NewReqIdCol} ->
+ {Err, Label, NewReqIdCol};
+ Return ->
+ Return
+ catch
+ error:badarg ->
+ error(badarg, [Msg, ReqIdCol, Delete])
+ end.
+
+-spec reqids_new() ->
+ NewReqIdCollection::request_id_collection().
+
+reqids_new() ->
+ gen:reqids_new().
+
+-spec reqids_size(ReqIdCollection::request_id_collection()) ->
+ non_neg_integer().
+
+reqids_size(ReqIdCollection) ->
+ try
+ gen:reqids_size(ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqIdCollection])
+ end.
+
+-spec reqids_add(ReqId::request_id(), Label::term(),
+ ReqIdCollection::request_id_collection()) ->
+ NewReqIdCollection::request_id_collection().
+
+reqids_add(ReqId, Label, ReqIdCollection) ->
+ try
+ gen:reqids_add(ReqId, Label, ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqId, Label, ReqIdCollection])
+ end.
+
+-spec reqids_to_list(ReqIdCollection::request_id_collection()) ->
+ [{ReqId::request_id(), Label::term()}].
+
+reqids_to_list(ReqIdCollection) ->
+ try
+ gen:reqids_to_list(ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqIdCollection])
end.
-spec delete_handler(emgr_ref(), handler(), term()) -> term().
@@ -776,6 +942,8 @@ do_terminate(Mod, Handler, Args, State, LastIn, SName, Reason) ->
ok
end.
+-spec report_terminate(_, How, _, _, _, _, _) -> ok when
+ How :: crash | normal | shutdown | {swapped, handler(), false | pid()}.
report_terminate(Handler, crash, {error, Why}, State, LastIn, SName, _) ->
report_terminate(Handler, Why, State, LastIn, SName);
report_terminate(Handler, How, _, State, LastIn, SName, _) ->
@@ -795,14 +963,34 @@ report_terminate(Handler, Reason, State, LastIn, SName) ->
report_error(_Handler, normal, _, _, _) -> ok;
report_error(_Handler, shutdown, _, _, _) -> ok;
report_error(_Handler, {swapped,_,_}, _, _, _) -> ok;
-report_error(Handler, Reason, State, LastIn, SName) ->
+report_error(Handler, Exit, State, LastIn, SName) ->
+
+ %% The reason comes from a catch expression, so we remove
+ %% the 'EXIT' and stacktrace from it so that the format_status
+ %% callback does not have deal with that.
+ {Reason, ReasonFun} =
+ case Exit of
+ {'EXIT',{R,ST}} ->
+ {R, fun(Reason) -> {'EXIT',{Reason,ST}} end};
+ {'EXIT',R} ->
+ {R, fun(Reason) -> {'EXIT',Reason} end};
+ R ->
+ {R, fun(Reason) -> Reason end}
+ end,
+ Status = gen:format_status(
+ Handler#handler.module,
+ terminate,
+ #{ state => State,
+ message => LastIn,
+ reason => Reason
+ },
+ [get(), State]),
?LOG_ERROR(#{label=>{gen_event,terminate},
handler=>handler(Handler),
name=>SName,
- last_message=>LastIn,
- state=>format_status(terminate,Handler#handler.module,
- get(),State),
- reason=>Reason},
+ last_message=>maps:get(message,Status),
+ state=>maps:get('$status',Status,maps:get(state,Status)),
+ reason=>ReasonFun(maps:get(reason,Status))},
#{domain=>[otp],
report_cb=>fun gen_event:format_log/2,
error_logger=>#{tag=>error,
@@ -869,10 +1057,10 @@ format_log_single(#{label:={gen_event,terminate},
Args1 =
case Depth of
unlimited ->
- [Handler,SName,Reason1,LastIn,State];
+ [Handler,SName,LastIn,State,Reason1];
_ ->
- [Handler,Depth,SName,Depth,Reason1,Depth,
- LastIn,Depth,State,Depth]
+ [Handler,Depth,SName,Depth,LastIn,Depth,
+ State,Depth,Reason1,Depth]
end,
{Format1, Args1};
format_log_single(#{label:={gen_event,no_handle_info},
@@ -992,24 +1180,19 @@ get_modules(MSL) ->
%% Status information
%%-----------------------------------------------------------------
format_status(Opt, StatusData) ->
- [PDict, SysState, Parent, _Debug, [ServerName, MSL, _HibernateAfterTimeout, _Hib]] = StatusData,
- Header = gen:format_status_header("Status for event handler",
- ServerName),
- FmtMSL = [MS#handler{state=format_status(Opt, Mod, PDict, State)}
- || #handler{module = Mod, state = State} = MS <- MSL],
+ [PDict, SysState, Parent, Debug, [ServerName, MSL, _HibernateAfterTimeout, _Hib]] = StatusData,
+ Header = gen:format_status_header("Status for event handler", ServerName),
+ {FmtMSL, Logs} =
+ lists:mapfoldl(
+ fun(#handler{module = Mod, state = State} = MS, Logs) ->
+ Status = gen:format_status(
+ Mod, Opt, #{ log => Logs, state => State },
+ [PDict, State]),
+ {MS#handler{state=maps:get('$status',Status,maps:get(state,Status))},
+ maps:get(log,Status)}
+ end, sys:get_log(Debug), MSL),
[{header, Header},
{data, [{"Status", SysState},
+ {"Logged Events", Logs},
{"Parent", Parent}]},
{items, {"Installed handlers", FmtMSL}}].
-
-format_status(Opt, Mod, PDict, State) ->
- case erlang:function_exported(Mod, format_status, 2) of
- true ->
- Args = [PDict, State],
- case catch Mod:format_status(Opt, Args) of
- {'EXIT', _} -> State;
- Else -> Else
- end;
- false ->
- State
- end.
diff --git a/lib/stdlib/src/gen_server.erl b/lib/stdlib/src/gen_server.erl
index 03541ccb50..14858e3eb5 100644
--- a/lib/stdlib/src/gen_server.erl
+++ b/lib/stdlib/src/gen_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -97,8 +97,11 @@
start_monitor/3, start_monitor/4,
stop/1, stop/3,
call/2, call/3,
- send_request/2, wait_response/2,
- receive_response/2, check_response/2,
+ send_request/2, send_request/4,
+ wait_response/2, receive_response/2, check_response/2,
+ wait_response/3, receive_response/3, check_response/3,
+ reqids_new/0, reqids_size/1,
+ reqids_add/3, reqids_to_list/1,
cast/2, reply/2,
abcast/2, abcast/3,
multi_call/2, multi_call/3, multi_call/4,
@@ -120,19 +123,28 @@
-include("logger.hrl").
+-export_type(
+ [from/0,
+ reply_tag/0,
+ request_id/0,
+ request_id_collection/0]).
+
+-export_type(
+ [server_name/0,
+ server_ref/0,
+ start_opt/0,
+ enter_loop_opt/0,
+ start_ret/0,
+ start_mon_ret/0]).
+
-define(
STACKTRACE(),
element(2, erlang:process_info(self(), current_stacktrace))).
-
--type server_ref() ::
- pid()
- | (LocalName :: atom())
- | {Name :: atom(), Node :: atom()}
- | {'global', GlobalName :: term()}
- | {'via', RegMod :: module(), ViaName :: term()}.
-
--type request_id() :: term().
+-define(
+ is_timeout(X),
+ ( (X) =:= infinity orelse ( is_integer(X) andalso (X) >= 0 ) )
+).
%%%=========================================================================
%%% API
@@ -141,7 +153,7 @@
-callback init(Args :: term()) ->
{ok, State :: term()} | {ok, State :: term(), timeout() | hibernate | {continue, term()}} |
{stop, Reason :: term()} | ignore.
--callback handle_call(Request :: term(), From :: {pid(), Tag :: term()},
+-callback handle_call(Request :: term(), From :: from(),
State :: term()) ->
{reply, Reply :: term(), NewState :: term()} |
{reply, Reply :: term(), NewState :: term(), timeout() | hibernate | {continue, term()}} |
@@ -168,6 +180,12 @@
-callback code_change(OldVsn :: (term() | {down, term()}), State :: term(),
Extra :: term()) ->
{ok, NewState :: term()} | {error, Reason :: term()}.
+-callback format_status(Status) -> NewStatus when
+ Status :: #{ state => term(),
+ message => term(),
+ reason => term(),
+ log => [sys:system_event()] },
+ NewStatus :: Status.
-callback format_status(Opt, StatusData) -> Status when
Opt :: 'normal' | 'terminate',
StatusData :: [PDict | State],
@@ -176,7 +194,20 @@
Status :: term().
-optional_callbacks(
- [handle_info/2, handle_continue/2, terminate/2, code_change/3, format_status/2]).
+ [handle_info/2, handle_continue/2, terminate/2, code_change/3,
+ format_status/1, format_status/2]).
+
+
+
+-type from() :: {Client :: pid(), Tag :: reply_tag()}.
+-opaque reply_tag() :: gen:reply_tag().
+
+-opaque request_id() :: gen:request_id().
+
+-opaque request_id_collection() :: gen:request_id_collection().
+
+-type response_timeout() ::
+ timeout() | {abs, integer()}.
%%% -----------------------------------------------------------------
%%% Starts a generic server.
@@ -194,23 +225,102 @@
%%% {error, {already_started, Pid}} |
%%% {error, Reason}
%%% -----------------------------------------------------------------
-start(Mod, Args, Options) ->
- gen:start(?MODULE, nolink, Mod, Args, Options).
-start(Name, Mod, Args, Options) ->
- gen:start(?MODULE, nolink, Name, Mod, Args, Options).
+-type server_name() :: % Duplicate of gen:emgr_name()
+ {'local', LocalName :: atom()}
+ | {'global', GlobalName :: term()}
+ | {'via', RegMod :: module(), ViaName :: term()}.
-start_link(Mod, Args, Options) ->
- gen:start(?MODULE, link, Mod, Args, Options).
+-type server_ref() :: % What gen:call/3,4 and gen:stop/1,3 accepts
+ pid()
+ | (LocalName :: atom())
+ | {Name :: atom(), Node :: atom()}
+ | {'global', GlobalName :: term()}
+ | {'via', RegMod :: module(), ViaName :: term()}.
-start_link(Name, Mod, Args, Options) ->
- gen:start(?MODULE, link, Name, Mod, Args, Options).
+-type start_opt() :: % Duplicate of gen:option()
+ {'timeout', Timeout :: timeout()}
+ | {'spawn_opt', SpawnOptions :: [proc_lib:spawn_option()]}
+ | enter_loop_opt().
+%%
+-type enter_loop_opt() :: % Some gen:option()s works for enter_loop/*
+ {'hibernate_after', HibernateAfterTimeout :: timeout()}
+ | {'debug', Dbgs :: [sys:debug_option()]}.
-start_monitor(Mod, Args, Options) ->
- gen:start(?MODULE, monitor, Mod, Args, Options).
+-type start_ret() :: % gen:start_ret() without monitor return
+ {'ok', Pid :: pid()}
+ | 'ignore'
+ | {'error', Reason :: term()}.
-start_monitor(Name, Mod, Args, Options) ->
- gen:start(?MODULE, monitor, Name, Mod, Args, Options).
+-type start_mon_ret() :: % gen:start_ret() with only monitor return
+ {'ok', {Pid :: pid(), MonRef :: reference()}}
+ | 'ignore'
+ | {'error', Reason :: term()}.
+
+%%% ---------------------------------------------------
+
+-spec start(
+ Module :: module(),
+ Args :: term(),
+ Options :: [start_opt()]
+ ) ->
+ start_ret().
+%%
+start(Module, Args, Options) ->
+ gen:start(?MODULE, nolink, Module, Args, Options).
+
+-spec start(
+ ServerName :: server_name(),
+ Module :: module(),
+ Args :: term(),
+ Options :: [start_opt()]
+ ) ->
+ start_ret().
+%%
+start(ServerName, Module, Args, Options) ->
+ gen:start(?MODULE, nolink, ServerName, Module, Args, Options).
+
+-spec start_link(
+ Module :: module(),
+ Args :: term(),
+ Options :: [start_opt()]
+ ) ->
+ start_ret().
+%%
+start_link(Module, Args, Options) ->
+ gen:start(?MODULE, link, Module, Args, Options).
+
+-spec start_link(
+ ServerName :: server_name(),
+ Module :: module(),
+ Args :: term(),
+ Options :: [start_opt()]
+ ) ->
+ start_ret().
+%%
+start_link(ServerName, Module, Args, Options) ->
+ gen:start(?MODULE, link, ServerName, Module, Args, Options).
+
+-spec start_monitor(
+ Module :: module(),
+ Args :: term(),
+ Options :: [start_opt()]
+ ) ->
+ start_mon_ret().
+%%
+start_monitor(Module, Args, Options) ->
+ gen:start(?MODULE, monitor, Module, Args, Options).
+
+-spec start_monitor(
+ ServerName :: server_name(),
+ Module :: module(),
+ Args :: term(),
+ Options :: [start_opt()]
+ ) ->
+ start_mon_ret().
+%%
+start_monitor(ServerName, Module, Args, Options) ->
+ gen:start(?MODULE, monitor, ServerName, Module, Args, Options).
%% -----------------------------------------------------------------
@@ -218,11 +328,22 @@ start_monitor(Name, Mod, Args, Options) ->
%% If the server is located at another node, that node will
%% be monitored.
%% -----------------------------------------------------------------
-stop(Name) ->
- gen:stop(Name).
-stop(Name, Reason, Timeout) ->
- gen:stop(Name, Reason, Timeout).
+-spec stop(
+ ServerRef :: server_ref()
+ ) -> ok.
+%%
+stop(ServerRef) ->
+ gen:stop(ServerRef).
+
+-spec stop(
+ ServerRef :: server_ref(),
+ Reason :: term(),
+ Timeout :: timeout()
+ ) -> ok.
+%%
+stop(ServerRef, Reason, Timeout) ->
+ gen:stop(ServerRef, Reason, Timeout).
%% -----------------------------------------------------------------
%% Make a call to a generic server.
@@ -231,20 +352,34 @@ stop(Name, Reason, Timeout) ->
%% If the client is trapping exits and is linked server termination
%% is handled here (? Shall we do that here (or rely on timeouts) ?).
%% -----------------------------------------------------------------
-call(Name, Request) ->
- case catch gen:call(Name, '$gen_call', Request) of
+
+-spec call(
+ ServerRef :: server_ref(),
+ Request :: term()
+ ) ->
+ Reply :: term().
+%%
+call(ServerRef, Request) ->
+ case catch gen:call(ServerRef, '$gen_call', Request) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
- exit({Reason, {?MODULE, call, [Name, Request]}})
+ exit({Reason, {?MODULE, call, [ServerRef, Request]}})
end.
-call(Name, Request, Timeout) ->
- case catch gen:call(Name, '$gen_call', Request, Timeout) of
+-spec call(
+ ServerRef :: server_ref(),
+ Request :: term(),
+ Timeout :: timeout()
+ ) ->
+ Reply :: term().
+%%
+call(ServerRef, Request, Timeout) ->
+ case catch gen:call(ServerRef, '$gen_call', Request, Timeout) of
{ok,Res} ->
Res;
{'EXIT',Reason} ->
- exit({Reason, {?MODULE, call, [Name, Request, Timeout]}})
+ exit({Reason, {?MODULE, call, [ServerRef, Request, Timeout]}})
end.
%% -----------------------------------------------------------------
@@ -252,28 +387,183 @@ call(Name, Request, Timeout) ->
%% used with wait_response/2 or check_response/2 to fetch the
%% result of the request.
--spec send_request(Name::server_ref(), Request::term()) -> request_id().
-send_request(Name, Request) ->
- gen:send_request(Name, '$gen_call', Request).
+-spec send_request(ServerRef::server_ref(), Request::term()) ->
+ ReqId::request_id().
+
+send_request(ServerRef, Request) ->
+ try
+ gen:send_request(ServerRef, '$gen_call', Request)
+ catch
+ error:badarg ->
+ error(badarg, [ServerRef, Request])
+ end.
+
+-spec send_request(ServerRef::server_ref(),
+ Request::term(),
+ Label::term(),
+ ReqIdCollection::request_id_collection()) ->
+ NewReqIdCollection::request_id_collection().
+
+send_request(ServerRef, Request, Label, ReqIdCol) ->
+ try
+ gen:send_request(ServerRef, '$gen_call', Request, Label, ReqIdCol)
+ catch
+ error:badarg ->
+ error(badarg, [ServerRef, Request, Label, ReqIdCol])
+ end.
+
+-spec wait_response(ReqId, WaitTime) -> Result when
+ ReqId :: request_id(),
+ WaitTime :: response_timeout(),
+ Response :: {reply, Reply::term()}
+ | {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'timeout'.
+
+wait_response(ReqId, WaitTime) ->
+ try
+ gen:wait_response(ReqId, WaitTime)
+ catch
+ error:badarg ->
+ error(badarg, [ReqId, WaitTime])
+ end.
+
+-spec wait_response(ReqIdCollection, WaitTime, Delete) -> Result when
+ ReqIdCollection :: request_id_collection(),
+ WaitTime :: response_timeout(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'timeout'.
+
+wait_response(ReqIdCol, WaitTime, Delete) ->
+ try
+ gen:wait_response(ReqIdCol, WaitTime, Delete)
+ catch
+ error:badarg ->
+ error(badarg, [ReqIdCol, WaitTime, Delete])
+ end.
--spec wait_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), server_ref()}}.
-wait_response(RequestId, Timeout) ->
- gen:wait_response(RequestId, Timeout).
+-spec receive_response(ReqId, Timeout) -> Result when
+ ReqId :: request_id(),
+ Timeout :: response_timeout(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'timeout'.
--spec receive_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {Reason::term(), server_ref()}}.
-receive_response(RequestId, Timeout) ->
- gen:receive_response(RequestId, Timeout).
+receive_response(ReqId, Timeout) ->
+ try
+ gen:receive_response(ReqId, Timeout)
+ catch
+ error:badarg ->
+ error(badarg, [ReqId, Timeout])
+ end.
--spec check_response(Msg::term(), RequestId::request_id()) ->
- {reply, Reply::term()} | 'no_reply' | {error, {Reason::term(), server_ref()}}.
-check_response(Msg, RequestId) ->
- gen:check_response(Msg, RequestId).
+-spec receive_response(ReqIdCollection, Timeout, Delete) -> Result when
+ ReqIdCollection :: request_id_collection(),
+ Timeout :: response_timeout(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'timeout'.
+
+receive_response(ReqIdCol, Timeout, Delete) ->
+ try
+ gen:receive_response(ReqIdCol, Timeout, Delete)
+ catch
+ error:badarg ->
+ error(badarg, [ReqIdCol, Timeout, Delete])
+ end.
+
+-spec check_response(Msg, ReqId) -> Result when
+ Msg :: term(),
+ ReqId :: request_id(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'no_reply'.
+
+check_response(Msg, ReqId) ->
+ try
+ gen:check_response(Msg, ReqId)
+ catch
+ error:badarg ->
+ error(badarg, [Msg, ReqId])
+ end.
+
+-spec check_response(Msg, ReqIdCollection, Delete) -> Result when
+ Msg :: term(),
+ ReqIdCollection :: request_id_collection(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'no_reply'.
+
+check_response(Msg, ReqIdCol, Delete) ->
+ try
+ gen:check_response(Msg, ReqIdCol, Delete)
+ catch
+ error:badarg ->
+ error(badarg, [Msg, ReqIdCol, Delete])
+ end.
+
+-spec reqids_new() ->
+ NewReqIdCollection::request_id_collection().
+
+reqids_new() ->
+ gen:reqids_new().
+
+-spec reqids_size(ReqIdCollection::request_id_collection()) ->
+ non_neg_integer().
+
+reqids_size(ReqIdCollection) ->
+ try
+ gen:reqids_size(ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqIdCollection])
+ end.
+
+-spec reqids_add(ReqId::request_id(), Label::term(),
+ ReqIdCollection::request_id_collection()) ->
+ NewReqIdCollection::request_id_collection().
+
+reqids_add(ReqId, Label, ReqIdCollection) ->
+ try
+ gen:reqids_add(ReqId, Label, ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqId, Label, ReqIdCollection])
+ end.
+
+-spec reqids_to_list(ReqIdCollection::request_id_collection()) ->
+ [{ReqId::request_id(), Label::term()}].
+
+reqids_to_list(ReqIdCollection) ->
+ try
+ gen:reqids_to_list(ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqIdCollection])
+ end.
%% -----------------------------------------------------------------
%% Make a cast to a generic server.
%% -----------------------------------------------------------------
+
+-spec cast(
+ ServerRef :: server_ref(),
+ Request :: term()
+ ) ->
+ ok.
+%%
cast({global,Name}, Request) ->
catch global:send(Name, cast_msg(Request)),
ok;
@@ -296,15 +586,36 @@ cast_msg(Request) -> {'$gen_cast',Request}.
%% -----------------------------------------------------------------
%% Send a reply to the client.
%% -----------------------------------------------------------------
-reply(From, Reply) ->
- gen:reply(From, Reply).
+
+-spec reply(
+ Client :: from(),
+ Reply :: term()
+ ) ->
+ ok.
+%%
+reply(Client, Reply) ->
+ gen:reply(Client, Reply).
%% -----------------------------------------------------------------
%% Asynchronous broadcast, returns nothing, it's just send 'n' pray
%%-----------------------------------------------------------------
+
+-spec abcast(
+ Name :: atom(),
+ Request :: term()
+ ) ->
+ abcast.
+%%
abcast(Name, Request) when is_atom(Name) ->
do_abcast([node() | nodes()], Name, cast_msg(Request)).
+-spec abcast(
+ Nodes :: [node()],
+ Name :: atom(),
+ Request :: term()
+ ) ->
+ abcast.
+%%
abcast(Nodes, Name, Request) when is_list(Nodes), is_atom(Name) ->
do_abcast(Nodes, Name, cast_msg(Request)).
@@ -323,19 +634,48 @@ do_abcast([], _,_) -> abcast.
%%% queue, it would probably become confused. Late answers will
%%% now arrive to the terminated middleman and so be discarded.
%%% -----------------------------------------------------------------
-multi_call(Name, Req)
- when is_atom(Name) ->
- do_multi_call([node() | nodes()], Name, Req, infinity).
-multi_call(Nodes, Name, Req)
+-spec multi_call(
+ Name :: atom(),
+ Request :: term()
+ ) ->
+ {Replies ::
+ [{Node :: node(), Reply :: term()}],
+ BadNodes :: [node()]
+ }.
+%%
+multi_call(Name, Request)
+ when is_atom(Name) ->
+ do_multi_call([node() | nodes()], Name, Request, infinity).
+
+-spec multi_call(
+ Nodes :: [node()],
+ Name :: atom(),
+ Request :: term()
+ ) ->
+ {Replies ::
+ [{Node :: node(), Reply :: term()}],
+ BadNodes :: [node()]
+ }.
+%%
+multi_call(Nodes, Name, Request)
when is_list(Nodes), is_atom(Name) ->
- do_multi_call(Nodes, Name, Req, infinity).
-
-multi_call(Nodes, Name, Req, infinity) ->
- do_multi_call(Nodes, Name, Req, infinity);
-multi_call(Nodes, Name, Req, Timeout)
- when is_list(Nodes), is_atom(Name), is_integer(Timeout), Timeout >= 0 ->
- do_multi_call(Nodes, Name, Req, Timeout).
+ do_multi_call(Nodes, Name, Request, infinity).
+
+-spec multi_call(
+ Nodes :: [node()],
+ Name :: atom(),
+ Request :: term(),
+ Timeout :: timeout()
+ ) ->
+ {Replies ::
+ [{Node :: node(), Reply :: term()}],
+ BadNodes :: [node()]
+ }.
+%%
+multi_call(Nodes, Name, Request, Timeout)
+ when is_list(Nodes), is_atom(Name), ?is_timeout(Timeout) ->
+ do_multi_call(Nodes, Name, Request, Timeout).
%%-----------------------------------------------------------------
@@ -349,25 +689,106 @@ multi_call(Nodes, Name, Req, Timeout)
%% The user is responsible for any initialization of the
%% process, including registering a name for it.
%%-----------------------------------------------------------------
-enter_loop(Mod, Options, State) ->
+
+-spec enter_loop(
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term()
+ ) ->
+ no_return().
+%%
+enter_loop(Mod, Options, State)
+ when is_atom(Mod), is_list(Options) ->
enter_loop(Mod, Options, State, self(), infinity).
+-spec enter_loop(
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term(),
+ ServerName :: server_name() | pid()
+ ) ->
+ no_return();
+ (
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term(),
+ Timeout :: timeout()
+ ) ->
+ no_return();
+ (
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term(),
+ Hibernate :: 'hibernate'
+ ) ->
+ no_return();
+ (
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term(),
+ Cont :: {'continue', term()}
+ ) ->
+ no_return().
+%%
enter_loop(Mod, Options, State, ServerName = {Scope, _})
- when Scope == local; Scope == global ->
+ when is_atom(Mod), is_list(Options), Scope == local;
+ is_atom(Mod), is_list(Options), Scope == global ->
enter_loop(Mod, Options, State, ServerName, infinity);
-
-enter_loop(Mod, Options, State, ServerName = {via, _, _}) ->
+%%
+enter_loop(Mod, Options, State, ServerName = {via, _, _})
+ when is_atom(Mod), is_list(Options) ->
enter_loop(Mod, Options, State, ServerName, infinity);
-
-enter_loop(Mod, Options, State, Timeout) ->
- enter_loop(Mod, Options, State, self(), Timeout).
-
-enter_loop(Mod, Options, State, ServerName, Timeout) ->
+%%
+enter_loop(Mod, Options, State, TimeoutOrHibernate)
+ when is_atom(Mod), is_list(Options), ?is_timeout(TimeoutOrHibernate);
+ is_atom(Mod), is_list(Options), TimeoutOrHibernate =:= hibernate ->
+ enter_loop(Mod, Options, State, self(), TimeoutOrHibernate);
+%%
+enter_loop(Mod, Options, State, {continue, _}=Continue)
+ when is_atom(Mod), is_list(Options) ->
+ enter_loop(Mod, Options, State, self(), Continue).
+
+-spec enter_loop(
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term(),
+ ServerName :: server_name() | pid(),
+ Timeout :: timeout()
+ ) ->
+ no_return();
+ (
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term(),
+ ServerName :: server_name() | pid(),
+ Hibernate :: 'hibernate'
+ ) ->
+ no_return();
+ (
+ Module :: module(),
+ Options :: [enter_loop_opt()],
+ State :: term(),
+ ServerName :: server_name() | pid(),
+ Cont :: {'continue', term()}
+ ) ->
+ no_return().
+%%
+enter_loop(Mod, Options, State, ServerName, TimeoutOrHibernate)
+ when is_atom(Mod), is_list(Options), ?is_timeout(TimeoutOrHibernate);
+ is_atom(Mod), is_list(Options), TimeoutOrHibernate =:= hibernate ->
Name = gen:get_proc_name(ServerName),
Parent = gen:get_parent(),
Debug = gen:debug_options(Name, Options),
HibernateAfterTimeout = gen:hibernate_after(Options),
- loop(Parent, Name, State, Mod, Timeout, HibernateAfterTimeout, Debug).
+ loop(Parent, Name, State, Mod, TimeoutOrHibernate, HibernateAfterTimeout, Debug);
+%%
+enter_loop(Mod, Options, State, ServerName, {continue, _}=Continue)
+ when is_atom(Mod), is_list(Options) ->
+ Name = gen:get_proc_name(ServerName),
+ Parent = gen:get_parent(),
+ Debug = gen:debug_options(Name, Options),
+ HibernateAfterTimeout = gen:hibernate_after(Options),
+ loop(Parent, Name, State, Mod, Continue, HibernateAfterTimeout, Debug).
%%%========================================================================
%%% Gen-callback functions
@@ -391,10 +812,14 @@ init_it(Starter, Parent, Name0, Mod, Args, Options) ->
{ok, {ok, State}} ->
proc_lib:init_ack(Starter, {ok, self()}),
loop(Parent, Name, State, Mod, infinity, HibernateAfterTimeout, Debug);
- {ok, {ok, State, TimeoutHibernateOrContinue}} ->
+ {ok, {ok, State, TimeoutOrHibernate}}
+ when ?is_timeout(TimeoutOrHibernate);
+ TimeoutOrHibernate =:= hibernate ->
proc_lib:init_ack(Starter, {ok, self()}),
- loop(Parent, Name, State, Mod, TimeoutHibernateOrContinue,
- HibernateAfterTimeout, Debug);
+ loop(Parent, Name, State, Mod, TimeoutOrHibernate, HibernateAfterTimeout, Debug);
+ {ok, {ok, State, {continue, _}=Continue}} ->
+ proc_lib:init_ack(Starter, {ok, self()}),
+ loop(Parent, Name, State, Mod, Continue, HibernateAfterTimeout, Debug);
{ok, {stop, Reason}} ->
%% For consistency, we must make sure that the
%% registered name (if any) is unregistered before
@@ -752,13 +1177,14 @@ handle_msg({'$gen_call', From, Msg}, Parent, Name, State, Mod, HibernateAfterTim
{ok, {reply, Reply, NState}} ->
reply(From, Reply),
loop(Parent, Name, NState, Mod, infinity, HibernateAfterTimeout, []);
- {ok, {reply, Reply, NState, Time1}} ->
+ {ok, {reply, Reply, NState, TimeoutOrHibernate}}
+ when ?is_timeout(TimeoutOrHibernate);
+ TimeoutOrHibernate =:= hibernate ->
reply(From, Reply),
- loop(Parent, Name, NState, Mod, Time1, HibernateAfterTimeout, []);
- {ok, {noreply, NState}} ->
- loop(Parent, Name, NState, Mod, infinity, HibernateAfterTimeout, []);
- {ok, {noreply, NState, Time1}} ->
- loop(Parent, Name, NState, Mod, Time1, HibernateAfterTimeout, []);
+ loop(Parent, Name, NState, Mod, TimeoutOrHibernate, HibernateAfterTimeout, []);
+ {ok, {reply, Reply, NState, {continue, _}=Continue}} ->
+ reply(From, Reply),
+ loop(Parent, Name, NState, Mod, Continue, HibernateAfterTimeout, []);
{ok, {stop, Reason, Reply, NState}} ->
try
terminate(Reason, ?STACKTRACE(), Name, From, Msg, Mod, NState, [])
@@ -777,17 +1203,14 @@ handle_msg({'$gen_call', From, Msg}, Parent, Name, State, Mod, HibernateAfterTim
{ok, {reply, Reply, NState}} ->
Debug1 = reply(Name, From, Reply, NState, Debug),
loop(Parent, Name, NState, Mod, infinity, HibernateAfterTimeout, Debug1);
- {ok, {reply, Reply, NState, Time1}} ->
+ {ok, {reply, Reply, NState, TimeoutOrHibernate}}
+ when ?is_timeout(TimeoutOrHibernate);
+ TimeoutOrHibernate =:= hibernate ->
Debug1 = reply(Name, From, Reply, NState, Debug),
- loop(Parent, Name, NState, Mod, Time1, HibernateAfterTimeout, Debug1);
- {ok, {noreply, NState}} ->
- Debug1 = sys:handle_debug(Debug, fun print_event/3, Name,
- {noreply, NState}),
- loop(Parent, Name, NState, Mod, infinity, HibernateAfterTimeout, Debug1);
- {ok, {noreply, NState, Time1}} ->
- Debug1 = sys:handle_debug(Debug, fun print_event/3, Name,
- {noreply, NState}),
- loop(Parent, Name, NState, Mod, Time1, HibernateAfterTimeout, Debug1);
+ loop(Parent, Name, NState, Mod, TimeoutOrHibernate, HibernateAfterTimeout, Debug1);
+ {ok, {reply, Reply, NState, {continue, _}=Continue}} ->
+ Debug1 = reply(Name, From, Reply, NState, Debug),
+ loop(Parent, Name, NState, Mod, Continue, HibernateAfterTimeout, Debug1);
{ok, {stop, Reason, Reply, NState}} ->
try
terminate(Reason, ?STACKTRACE(), Name, From, Msg, Mod, NState, Debug)
@@ -805,8 +1228,12 @@ handle_common_reply(Reply, Parent, Name, From, Msg, Mod, HibernateAfterTimeout,
case Reply of
{ok, {noreply, NState}} ->
loop(Parent, Name, NState, Mod, infinity, HibernateAfterTimeout, []);
- {ok, {noreply, NState, Time1}} ->
- loop(Parent, Name, NState, Mod, Time1, HibernateAfterTimeout, []);
+ {ok, {noreply, NState, TimeoutOrHibernate}}
+ when ?is_timeout(TimeoutOrHibernate);
+ TimeoutOrHibernate =:= hibernate ->
+ loop(Parent, Name, NState, Mod, TimeoutOrHibernate, HibernateAfterTimeout, []);
+ {ok, {noreply, NState, {continue, _}=Continue}} ->
+ loop(Parent, Name, NState, Mod, Continue, HibernateAfterTimeout, []);
{ok, {stop, Reason, NState}} ->
terminate(Reason, ?STACKTRACE(), Name, From, Msg, Mod, NState, []);
{'EXIT', Class, Reason, Stacktrace} ->
@@ -821,10 +1248,14 @@ handle_common_reply(Reply, Parent, Name, From, Msg, Mod, HibernateAfterTimeout,
Debug1 = sys:handle_debug(Debug, fun print_event/3, Name,
{noreply, NState}),
loop(Parent, Name, NState, Mod, infinity, HibernateAfterTimeout, Debug1);
- {ok, {noreply, NState, Time1}} ->
- Debug1 = sys:handle_debug(Debug, fun print_event/3, Name,
- {noreply, NState}),
- loop(Parent, Name, NState, Mod, Time1, HibernateAfterTimeout, Debug1);
+ {ok, {noreply, NState, TimeoutOrHibernate}}
+ when ?is_timeout(TimeoutOrHibernate);
+ TimeoutOrHibernate =:= hibernate ->
+ Debug1 = sys:handle_debug(Debug, fun print_event/3, Name, {noreply, NState}),
+ loop(Parent, Name, NState, Mod, TimeoutOrHibernate, HibernateAfterTimeout, Debug1);
+ {ok, {noreply, NState, {continue, _}=Continue}} ->
+ Debug1 = sys:handle_debug(Debug, fun print_event/3, Name, {noreply, NState}),
+ loop(Parent, Name, NState, Mod, Continue, HibernateAfterTimeout, Debug1);
{ok, {stop, Reason, NState}} ->
terminate(Reason, ?STACKTRACE(), Name, From, Msg, Mod, NState, Debug);
{'EXIT', Class, Reason, Stacktrace} ->
@@ -906,27 +1337,28 @@ print_event(Dev, Event, Name) ->
-spec terminate(_, _, _, _, _, _, _, _) -> no_return().
terminate(Reason, Stacktrace, Name, From, Msg, Mod, State, Debug) ->
- terminate(exit, Reason, Stacktrace, Reason, Name, From, Msg, Mod, State, Debug).
+ terminate(exit, Reason, Stacktrace, false, Name, From, Msg, Mod, State, Debug).
-spec terminate(_, _, _, _, _, _, _, _, _) -> no_return().
terminate(Class, Reason, Stacktrace, Name, From, Msg, Mod, State, Debug) ->
- ReportReason = {Reason, Stacktrace},
- terminate(Class, Reason, Stacktrace, ReportReason, Name, From, Msg, Mod, State, Debug).
+ terminate(Class, Reason, Stacktrace, true, Name, From, Msg, Mod, State, Debug).
-spec terminate(_, _, _, _, _, _, _, _, _, _) -> no_return().
-terminate(Class, Reason, Stacktrace, ReportReason, Name, From, Msg, Mod, State, Debug) ->
+terminate(Class, Reason, Stacktrace, ReportStacktrace, Name, From, Msg, Mod, State, Debug) ->
Reply = try_terminate(Mod, terminate_reason(Class, Reason, Stacktrace), State),
case Reply of
{'EXIT', C, R, S} ->
- error_info({R, S}, Name, From, Msg, Mod, State, Debug),
+ error_info(R, S, Name, From, Msg, Mod, State, Debug),
erlang:raise(C, R, S);
_ ->
case {Class, Reason} of
{exit, normal} -> ok;
{exit, shutdown} -> ok;
{exit, {shutdown,_}} -> ok;
- _ ->
- error_info(ReportReason, Name, From, Msg, Mod, State, Debug)
+ _ when ReportStacktrace ->
+ error_info(Reason, Stacktrace, Name, From, Msg, Mod, State, Debug);
+ _ ->
+ error_info(Reason, undefined, Name, From, Msg, Mod, State, Debug)
end
end,
case Stacktrace of
@@ -939,19 +1371,37 @@ terminate(Class, Reason, Stacktrace, ReportReason, Name, From, Msg, Mod, State,
terminate_reason(error, Reason, Stacktrace) -> {Reason, Stacktrace};
terminate_reason(exit, Reason, _Stacktrace) -> Reason.
-error_info(_Reason, application_controller, _From, _Msg, _Mod, _State, _Debug) ->
+error_info(_Reason, _ST, application_controller, _From, _Msg, _Mod, _State, _Debug) ->
%% OTP-5811 Don't send an error report if it's the system process
%% application_controller which is terminating - let init take care
%% of it instead
ok;
-error_info(Reason, Name, From, Msg, Mod, State, Debug) ->
+error_info(Reason, ST, Name, From, Msg, Mod, State, Debug) ->
Log = sys:get_log(Debug),
+ Status =
+ gen:format_status(Mod, terminate,
+ #{ reason => Reason,
+ state => State,
+ message => Msg,
+ log => Log },
+ [get(),State]),
+ ReportReason =
+ if ST == undefined ->
+ %% When ST is undefined, it should not be included in the
+ %% reported reason for the crash as it is then caused
+ %% by an invalid return from a callback and thus thus the
+ %% stacktrace is irrelevant.
+ maps:get(reason, Status);
+ true ->
+ {maps:get(reason, Status), ST}
+ end,
+
?LOG_ERROR(#{label=>{gen_server,terminate},
name=>Name,
- last_message=>Msg,
- state=>format_status(terminate, Mod, get(), State),
- log=>format_log_state(Mod, Log),
- reason=>Reason,
+ last_message=>maps:get(message,Status),
+ state=>maps:get('EXIT',Status,maps:get('$status',Status,maps:get(state,Status))),
+ log=>format_log_state(Mod,maps:get(log,Status)),
+ reason=>ReportReason,
client_info=>client_stacktrace(From)},
#{domain=>[otp],
report_cb=>fun gen_server:format_log/2,
@@ -1208,37 +1658,42 @@ mod(_) -> "t".
format_status(Opt, StatusData) ->
[PDict, SysState, Parent, Debug, [Name, State, Mod, _Time, _HibernateAfterTimeout]] = StatusData,
Header = gen:format_status_header("Status for generic server", Name),
- Log = sys:get_log(Debug),
- Specific = case format_status(Opt, Mod, PDict, State) of
- S when is_list(S) -> S;
- S -> [S]
- end,
+ Status =
+ case gen:format_status(Mod, Opt, #{ state => State, log => sys:get_log(Debug) },
+ [PDict, State]) of
+ #{ 'EXIT' := R } = M ->
+ M#{ '$status' => [{data,[{"State",R}]}] };
+ %% Status is set when the old format_status/2 is called,
+ %% so we do a little backwards compatibility dance here
+ #{ '$status' := S } = M when is_list(S) -> M;
+ #{ '$status' := S } = M -> M#{ '$status' := [S] };
+ #{ state := S } = M ->
+ M#{ '$status' => [{data, [{"State",S}] }] }
+ end,
[{header, Header},
{data, [{"Status", SysState},
{"Parent", Parent},
- {"Logged events", format_log_state(Mod, Log)}]} |
- Specific].
+ {"Logged events", format_log_state(Mod, maps:get(log,Status))}]} |
+ maps:get('$status',Status)].
format_log_state(Mod, Log) ->
- [case Event of
- {out,Msg,From,State} ->
- {out,Msg,From,format_status(terminate, Mod, get(), State)};
- {noreply,State} ->
- {noreply,format_status(terminate, Mod, get(), State)};
- _ -> Event
- end || Event <- Log].
-
-format_status(Opt, Mod, PDict, State) ->
- DefStatus = case Opt of
- terminate -> State;
- _ -> [{data, [{"State", State}]}]
- end,
- case erlang:function_exported(Mod, format_status, 2) of
- true ->
- case catch Mod:format_status(Opt, [PDict, State]) of
- {'EXIT', _} -> DefStatus;
- Else -> Else
- end;
- _ ->
- DefStatus
+ %% If format_status/1 was exported, the log has already been handled by
+ %% that call, so we should not pass all log events into the callback again.
+ case erlang:function_exported(Mod, format_status, 1) of
+ false ->
+ [case Event of
+ {out,Msg,From,State} ->
+ Status = gen:format_status(
+ Mod, terminate, #{ state => State },
+ [get(), State]),
+ {out, Msg, From, maps:get(state, Status) };
+ {noreply,State} ->
+ Status = gen:format_status(
+ Mod, terminate, #{ state => State },
+ [get(), State]),
+ {noreply, maps:get(state, Status)};
+ _ -> Event
+ end || Event <- Log];
+ true ->
+ Log
end.
diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl
index 30d40fefc5..f82965d925 100644
--- a/lib/stdlib/src/gen_statem.erl
+++ b/lib/stdlib/src/gen_statem.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2016-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2016-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -32,8 +32,12 @@
start_monitor/3,start_monitor/4,
stop/1,stop/3,
cast/2,call/2,call/3,
- send_request/2,wait_response/1,wait_response/2,
- receive_response/1,receive_response/2,check_response/2,
+ send_request/2, send_request/4,
+ wait_response/1, wait_response/2, wait_response/3,
+ receive_response/1, receive_response/2, receive_response/3,
+ check_response/2, check_response/3,
+ reqids_new/0, reqids_size/1,
+ reqids_add/3, reqids_to_list/1,
enter_loop/4,enter_loop/5,enter_loop/6,
reply/1,reply/2]).
@@ -61,6 +65,7 @@
-export_type(
[event_type/0,
from/0,
+ reply_tag/0,
callback_mode_result/0,
init_result/1,
init_result/2,
@@ -70,7 +75,9 @@
event_handler_result/2,
reply_action/0,
enter_action/0,
- action/0
+ action/0,
+ request_id/0,
+ request_id_collection/0
]).
%% Old types, not advertised
-export_type(
@@ -85,15 +92,17 @@
[server_name/0,
server_ref/0,
start_opt/0,
+ enter_loop_opt/0,
start_ret/0,
- enter_loop_opt/0]).
+ start_mon_ret/0]).
%%%==========================================================================
%%% Interface functions.
%%%==========================================================================
-type from() ::
- {To :: pid(), Tag :: term()}. % Reply-to specifier for call
+ {To :: pid(), Tag :: reply_tag()}. % Reply-to specifier for call
+-opaque reply_tag() :: gen:reply_tag().
-type state() ::
state_name() | % For StateName/3 callback functions
@@ -278,7 +287,12 @@
Replies :: [reply_action()] | reply_action(),
NewData :: DataType}.
--type request_id() :: term().
+-opaque request_id() :: gen:request_id().
+
+-opaque request_id_collection() :: gen:request_id_collection().
+
+-type response_timeout() ::
+ timeout() | {abs, integer()}.
%% The state machine init function. It is called only once and
%% the server is not running until this function has returned
@@ -347,6 +361,8 @@
%% often condensed way. For StatusOption =:= 'normal' the preferred
%% return term is [{data,[{"State",FormattedState}]}], and for
%% StatusOption =:= 'terminate' it is just FormattedState.
+%%
+%% Deprecated
-callback format_status(
StatusOption,
[ [{Key :: term(), Value :: term()}] |
@@ -355,8 +371,21 @@
Status :: term() when
StatusOption :: 'normal' | 'terminate'.
+%% Format the callback module status in some sensible that is
+%% often condensed way.
+-callback format_status(Status) -> NewStatus when
+ Status :: #{ state => state(),
+ data => data(),
+ reason => term(),
+ queue => [{event_type(), term()}],
+ postponed => [{event_type(), term()}],
+ timeouts => [{timeout_event_type(), term()}],
+ log => [sys:system_event()] },
+ NewStatus :: Status.
+
-optional_callbacks(
- [format_status/2, % Has got a default implementation
+ [format_status/1, % Has got a default implementation
+ format_status/2, % Has got a default implementation
terminate/3, % Has got a default implementation
code_change/4, % Only needed by advanced soft upgrade
%%
@@ -471,31 +500,37 @@ timeout_event_type(Type) ->
%%%==========================================================================
%%% API
--type server_name() ::
- {'global', GlobalName :: term()}
- | {'via', RegMod :: module(), Name :: term()}
- | {'local', atom()}.
--type server_ref() ::
+-type server_name() :: % Duplicate of gen:emgr_name()
+ {'local', atom()}
+ | {'global', GlobalName :: term()}
+ | {'via', RegMod :: module(), Name :: term()}.
+
+-type server_ref() :: % What gen:call/3,4 and gen:stop/1,3 accepts
pid()
| (LocalName :: atom())
| {Name :: atom(), Node :: atom()}
| {'global', GlobalName :: term()}
| {'via', RegMod :: module(), ViaName :: term()}.
--type start_opt() ::
+
+-type start_opt() :: % Duplicate of gen:option()
{'timeout', Time :: timeout()}
- | {'spawn_opt', [proc_lib:start_spawn_option()]}
+ | {'spawn_opt', [proc_lib:spawn_option()]}
| enter_loop_opt().
--type start_ret() ::
+%%
+-type enter_loop_opt() :: % Some gen:option()s works for enter_loop/*
+ {'hibernate_after', HibernateAfterTimeout :: timeout()}
+ | {'debug', Dbgs :: [sys:debug_option()]}.
+
+-type start_ret() :: % gen:start_ret() without monitor return
{'ok', pid()}
| 'ignore'
| {'error', term()}.
--type start_mon_ret() ::
+
+-type start_mon_ret() :: % gen:start_ret() with only monitor return
{'ok', {pid(),reference()}}
| 'ignore'
| {'error', term()}.
--type enter_loop_opt() ::
- {'hibernate_after', HibernateAfterTimeout :: timeout()}
- | {'debug', Dbgs :: [sys:debug_option()]}.
+
@@ -600,34 +635,189 @@ call(ServerRef, Request, Timeout) ->
call_clean(ServerRef, Request, Timeout, Timeout).
-spec send_request(ServerRef::server_ref(), Request::term()) ->
- RequestId::request_id().
+ ReqId::request_id().
send_request(Name, Request) ->
- gen:send_request(Name, '$gen_call', Request).
+ try
+ gen:send_request(Name, '$gen_call', Request)
+ catch
+ error:badarg ->
+ error(badarg, [Name, Request])
+ end.
+
+-spec send_request(ServerRef::server_ref(),
+ Request::term(),
+ Label::term(),
+ ReqIdCollection::request_id_collection()) ->
+ NewReqIdCollection::request_id_collection().
+
+send_request(ServerRef, Request, Label, ReqIdCol) ->
+ try
+ gen:send_request(ServerRef, '$gen_call', Request, Label, ReqIdCol)
+ catch
+ error:badarg ->
+ error(badarg, [ServerRef, Request, Label, ReqIdCol])
+ end.
+
+
+-spec wait_response(ReqId) -> Result when
+ ReqId :: request_id(),
+ Response :: {reply, Reply::term()}
+ | {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'timeout'.
+
+wait_response(ReqId) ->
+ wait_response(ReqId, infinity).
+
+-spec wait_response(ReqId, WaitTime) -> Result when
+ ReqId :: request_id(),
+ WaitTime :: response_timeout(),
+ Response :: {reply, Reply::term()}
+ | {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'timeout'.
+
+wait_response(ReqId, WaitTime) ->
+ try
+ gen:wait_response(ReqId, WaitTime)
+ catch
+ error:badarg ->
+ error(badarg, [ReqId, WaitTime])
+ end.
+
+-spec wait_response(ReqIdCollection, WaitTime, Delete) -> Result when
+ ReqIdCollection :: request_id_collection(),
+ WaitTime :: response_timeout(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'timeout'.
+
+wait_response(ReqIdCol, WaitTime, Delete) ->
+ try
+ gen:wait_response(ReqIdCol, WaitTime, Delete)
+ catch
+ error:badarg ->
+ error(badarg, [ReqIdCol, WaitTime, Delete])
+ end.
+
+-spec receive_response(ReqId) -> Result when
+ ReqId :: request_id(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'timeout'.
+
+receive_response(ReqId) ->
+ receive_response(ReqId, infinity).
+
+-spec receive_response(ReqId, Timeout) -> Result when
+ ReqId :: request_id(),
+ Timeout :: response_timeout(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'timeout'.
+
+receive_response(ReqId, Timeout) ->
+ try
+ gen:receive_response(ReqId, Timeout)
+ catch
+ error:badarg ->
+ error(badarg, [ReqId, Timeout])
+ end.
--spec wait_response(RequestId::request_id()) ->
- {reply, Reply::term()} | {error, {term(), server_ref()}}.
-wait_response(RequestId) ->
- gen:wait_response(RequestId, infinity).
+-spec receive_response(ReqIdCollection, Timeout, Delete) -> Result when
+ ReqIdCollection :: request_id_collection(),
+ Timeout :: response_timeout(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'timeout'.
+
+receive_response(ReqIdCol, Timeout, Delete) ->
+ try
+ gen:receive_response(ReqIdCol, Timeout, Delete)
+ catch
+ error:badarg ->
+ error(badarg, [ReqIdCol, Timeout, Delete])
+ end.
--spec wait_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {term(), server_ref()}}.
-wait_response(RequestId, Timeout) ->
- gen:wait_response(RequestId, Timeout).
+-spec check_response(Msg, ReqId) -> Result when
+ Msg :: term(),
+ ReqId :: request_id(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: Response | 'no_reply'.
+
+check_response(Msg, ReqId) ->
+ try
+ gen:check_response(Msg, ReqId)
+ catch
+ error:badarg ->
+ error(badarg, [Msg, ReqId])
+ end.
+
+-spec check_response(Msg, ReqIdCollection, Delete) -> Result when
+ Msg :: term(),
+ ReqIdCollection :: request_id_collection(),
+ Delete :: boolean(),
+ Response :: {reply, Reply::term()} |
+ {error, {Reason::term(), server_ref()}},
+ Result :: {Response,
+ Label::term(),
+ NewReqIdCollection::request_id_collection()} |
+ 'no_request' |
+ 'no_reply'.
+
+check_response(Msg, ReqIdCol, Delete) ->
+ try
+ gen:check_response(Msg, ReqIdCol, Delete)
+ catch
+ error:badarg ->
+ error(badarg, [Msg, ReqIdCol, Delete])
+ end.
--spec receive_response(RequestId::request_id()) ->
- {reply, Reply::term()} | {error, {term(), server_ref()}}.
-receive_response(RequestId) ->
- gen:receive_response(RequestId, infinity).
+-spec reqids_new() ->
+ NewReqIdCollection::request_id_collection().
+
+reqids_new() ->
+ gen:reqids_new().
+
+-spec reqids_size(ReqIdCollection::request_id_collection()) ->
+ non_neg_integer().
+
+reqids_size(ReqIdCollection) ->
+ try
+ gen:reqids_size(ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqIdCollection])
+ end.
+
+-spec reqids_add(ReqId::request_id(), Label::term(),
+ ReqIdCollection::request_id_collection()) ->
+ NewReqIdCollection::request_id_collection().
+
+reqids_add(ReqId, Label, ReqIdCollection) ->
+ try
+ gen:reqids_add(ReqId, Label, ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqId, Label, ReqIdCollection])
+ end.
--spec receive_response(RequestId::request_id(), timeout()) ->
- {reply, Reply::term()} | 'timeout' | {error, {term(), server_ref()}}.
-receive_response(RequestId, Timeout) ->
- gen:receive_response(RequestId, Timeout).
+-spec reqids_to_list(ReqIdCollection::request_id_collection()) ->
+ [{ReqId::request_id(), Label::term()}].
--spec check_response(Msg::term(), RequestId::request_id()) ->
- {reply, Reply::term()} | 'no_reply' | {error, {term(), server_ref()}}.
-check_response(Msg, RequestId) ->
- gen:check_response(Msg, RequestId).
+reqids_to_list(ReqIdCollection) ->
+ try
+ gen:reqids_to_list(ReqIdCollection)
+ catch
+ error:badarg -> error(badarg, [ReqIdCollection])
+ end.
%% Reply from a state machine callback to whom awaits in call/2
-spec reply([reply_action()] | reply_action()) -> ok.
@@ -694,9 +884,11 @@ call_dirty(ServerRef, Request, Timeout, T) ->
{ok,Reply} ->
Reply
catch
- Class:Reason:Stacktrace ->
+ %% 'gen' raises 'exit' for problems
+ Class:Reason:Stacktrace when Class =:= exit ->
erlang:raise(
Class,
+ %% Wrap the reason according to tradition
{Reason,{?MODULE,call,[ServerRef,Request,Timeout]}},
Stacktrace)
end.
@@ -738,12 +930,19 @@ call_clean(ServerRef, Request, Timeout, T) ->
{ok,Reply} ->
Reply
end;
- {Ref,Class,Reason,Stacktrace} ->
+ {Ref,Class,Reason,Stacktrace} when Class =:= exit ->
+ %% 'gen' raises 'exit' for problems
demonitor(Mref, [flush]),
+ %% Pretend it happened in this process
erlang:raise(
Class,
+ %% Wrap the reason according to tradition
{Reason,{?MODULE,call,[ServerRef,Request,Timeout]}},
Stacktrace);
+ {Ref,Class,Reason,Stacktrace} ->
+ demonitor(Mref, [flush]),
+ %% Pretend it happened in this process
+ erlang:raise(Class, Reason, Stacktrace);
{'DOWN',Mref,_,_,Reason} ->
%% There is a theoretical possibility that the
%% proxy process gets killed between try--of and !
@@ -902,22 +1101,39 @@ system_replace_state(
format_status(
Opt,
[PDict,SysState,Parent,Debug,
- {#params{name = Name, modules = Modules} = P,
- #state{postponed = Postponed, timers = Timers} = S}]) ->
+ {#params{name = Name, modules = [Mod | _] = Modules},
+ #state{postponed = Postponed, timers = Timers,
+ state_data = {State,Data}}}]) ->
Header = gen:format_status_header("Status for state machine", Name),
- Log = sys:get_log(Debug),
+
+ {NumTimers, ListTimers} = list_timeouts(Timers),
+ StatusMap = #{ state => State, data => Data,
+ postponed => Postponed, log => sys:get_log(Debug),
+ timeouts => ListTimers
+ },
+
+ NewStatusMap =
+ case gen:format_status(Mod, Opt, StatusMap, [PDict,State,Data]) of
+ #{ 'EXIT' := R } ->
+ Crashed = [{data,[{"State",{State,R}}]}],
+ StatusMap#{ '$status' => Crashed };
+ %% Status is set when the old format_status/2 is called,
+ %% so we do a little backwards compatibility dance here
+ #{ '$status' := L } = SM when is_list(L) -> SM;
+ #{ '$status' := T } = SM -> SM#{ '$status' := [T] };
+ #{ state := S, data := D } = SM ->
+ SM#{ '$status' => [{data,[{"State",{S,D}}]}]}
+ end,
+
[{header,Header},
{data,
[{"Status",SysState},
{"Parent",Parent},
{"Modules",Modules},
- {"Time-outs",list_timeouts(Timers)},
- {"Logged Events",Log},
- {"Postponed",Postponed}]} |
- case format_status(Opt, PDict, update_parent(P, Parent), S) of
- L when is_list(L) -> L;
- T -> [T]
- end].
+ {"Time-outs",{NumTimers,maps:get(timeouts,NewStatusMap)}},
+ {"Logged Events",maps:get(log,NewStatusMap)},
+ {"Postponed",maps:get(postponed,NewStatusMap)}]} |
+ maps:get('$status',NewStatusMap)].
%% Update #params.parent only if it differs. This should not
%% be possible today (OTP-22.0), but could happen for example
@@ -2399,25 +2615,44 @@ error_info(
Class, Reason, Stacktrace, Debug,
#params{
name = Name,
- modules = Modules,
+ modules = [Mod|_] = Modules,
callback_mode = CallbackMode,
- state_enter = StateEnter} = P,
+ state_enter = StateEnter},
#state{
postponed = Postponed,
- timers = Timers} = S,
+ timers = Timers,
+ state_data = {State,Data}},
Q) ->
- Log = sys:get_log(Debug),
+
+ {NumTimers,ListTimers} = list_timeouts(Timers),
+
+ Status =
+ gen:format_status(Mod, terminate,
+ #{ reason => Reason,
+ state => State,
+ data => Data,
+ queue => Q,
+ postponed => Postponed,
+ timeouts => ListTimers,
+ log => sys:get_log(Debug)},
+ [get(),State,Data]),
+ NewState = case maps:find('$status', Status) of
+ error ->
+ {maps:get(state,Status),maps:get(data,Status)};
+ {ok, S} ->
+ S
+ end,
?LOG_ERROR(#{label=>{gen_statem,terminate},
name=>Name,
- queue=>Q,
- postponed=>Postponed,
+ queue=>maps:get(queue,Status),
+ postponed=>maps:get(postponed,Status),
modules=>Modules,
callback_mode=>CallbackMode,
state_enter=>StateEnter,
- state=>format_status(terminate, get(), P, S),
- timeouts=>list_timeouts(Timers),
- log=>Log,
- reason=>{Class,Reason,Stacktrace},
+ state=>NewState,
+ timeouts=>{NumTimers,maps:get(timeouts,Status)},
+ log=>maps:get(log,Status),
+ reason=>{Class,maps:get(reason,Status),Stacktrace},
client_info=>client_stacktrace(Q)},
#{domain=>[otp],
report_cb=>fun gen_statem:format_log/2,
@@ -2750,34 +2985,6 @@ single(false) -> "".
mod(latin1) -> "";
mod(_) -> "t".
-%% Call Module:format_status/2 or return a default value
-format_status(
- Opt, PDict,
- #params{modules = [Module | _]},
- #state{state_data = {State,Data} = State_Data}) ->
- case erlang:function_exported(Module, format_status, 2) of
- true ->
- try Module:format_status(Opt, [PDict,State,Data])
- catch
- Result -> Result;
- _:_ ->
- format_status_default(
- Opt,
- {State,
- atom_to_list(Module) ++ ":format_status/2 crashed"})
- end;
- false ->
- format_status_default(Opt, State_Data)
- end.
-
-%% The default Module:format_status/3
-format_status_default(Opt, State_Data) ->
- case Opt of
- terminate ->
- State_Data;
- _ ->
- [{data,[{"State",State_Data}]}]
- end.
-compile({inline, [listify/1]}).
listify(Item) when is_list(Item) ->
diff --git a/lib/stdlib/src/io.erl b/lib/stdlib/src/io.erl
index d7158f64a8..18f6ef3dde 100644
--- a/lib/stdlib/src/io.erl
+++ b/lib/stdlib/src/io.erl
@@ -335,6 +335,7 @@ read(Io, Prompt, Pos0, Options) ->
conv_reason(arguments) -> badarg;
conv_reason(terminated) -> terminated;
+conv_reason(calling_self) -> calling_self;
conv_reason({no_translation,_,_}) -> no_translation;
conv_reason(_Reason) -> badarg.
@@ -596,6 +597,8 @@ request(Name, Request, ErrorTag) when is_atom(Name) ->
request(Pid, Request, ErrorTag)
end.
+execute_request(Pid, _Tuple, ErrorTag) when Pid =:= self() ->
+ {ErrorTag, calling_self};
execute_request(Pid, {Convert,Converted}, ErrorTag) ->
Mref = erlang:monitor(process, Pid),
Pid ! {io_request,self(),Mref,Converted},
diff --git a/lib/stdlib/src/io_lib_format.erl b/lib/stdlib/src/io_lib_format.erl
index 40b84405e8..fb77957036 100644
--- a/lib/stdlib/src/io_lib_format.erl
+++ b/lib/stdlib/src/io_lib_format.erl
@@ -539,268 +539,10 @@ float_data([_|Cs], Ds) ->
%% Returns a correctly rounded string that converts to Float when
%% read back with list_to_float/1.
-%%
-%% When abs(Float) < float(1 bsl 53) the shortest such string is
-%% returned, and otherwise the shortest such string using scientific
-%% notation is returned. That is, scientific notation is used if and
-%% only if scientific notation results in a shorter string than
-%% normal notation when abs(Float) < float(1 bsl 53), and scientific
-%% notation is used unconditionally if abs(Float) >= float(1 bsl
-%% 53). See comment in insert_decimal/2 for an explanation for why
-%% float(1 bsl 53) is chosen as cutoff point.
-%%
-%% The algorithm that is used to find the decimal number that is
-%% represented by the returned String is described in "Ryu: Fast
-%% Float-to-String Conversion" in Proceedings of 39th ACM SIGPLAN
-%% Conference on Programming Language Design and Implementation.
-%% https://dl.acm.org/doi/pdf/10.1145/3192366.3192369
-spec fwrite_g(float()) -> string().
fwrite_g(Float) ->
- case sign_mantissa_exponent(Float) of
- {0, 0, 0} -> "0.0";
- {1, 0, 0} -> "-0.0";
- {S, M, E} when E < 2047 ->
- {Place, Digits} =
- case is_small_int(M, E) of
- {int, M1, E1} ->
- compute_shortest_int(M1, E1);
- not_int ->
- fwrite_g_1(M, E)
- end,
- DigitList = insert_decimal(Place, Digits, Float),
- insert_minus(S, DigitList)
- end.
-
--define(BIG_POW, (1 bsl 52)).
--define(DECODE_CORRECTION, 1075).
-
-sign_mantissa_exponent(F) ->
- <<S:1, BE:11, M:52>> = <<F:64/float>>,
- {S, M , BE}.
-
-is_small_int(M, E) ->
- M2 = ?BIG_POW bor M,
- E2 = E - ?DECODE_CORRECTION,
- case E2 > 0 orelse E2 < -52 of
- true ->
- %% f = m2 * 2^e2 >= 2^53 is an integer.
- %% Ignore this case for now.
- %% or f < 1
- not_int;
- _ ->
- %% Since 2^52 <= m2 < 2^53 and 0 <= -e2 <= 52: 1 <= f = m2 / 2^-e2 < 2^53.
- %% Test if the lower -e2 bits of the significand are 0, i.e. whether the fraction is 0.
- Mask = (1 bsl -E2) - 1,
- Fraction = M2 band Mask,
- case Fraction of
- 0 ->
- %% f is an integer in the range [1, 2^53).
- %% Note: mantissa might contain trailing (decimal) 0's.
- {int, M2 bsr -E2, 0};
- _ ->
- not_int
- end
- end.
-
-%% For small integers in the range [1, 2^53), v.mantissa might contain trailing (decimal) zeros.
-compute_shortest_int(M, E) when M rem 10 =:= 0 ->
- Q = M div 10,
- compute_shortest_int(Q, E + 1);
-compute_shortest_int(M, E) ->
- {E, integer_to_list(M)}.
-
-fwrite_g_1(M, E) ->
- {Mf, Ef} = decode(M, E),
- Shift = mmshift(M, E),
- Mv = 4 * Mf,
- {Q, Vm, Vr, Vp, E10} = convert_to_decimal(Ef, Mv, Shift),
- Accept = M rem 2 == 0,
- {VmIsTrailingZero, VrIsTrailingZero, Vp1} = bounds(Mv, Q, Vp, Accept, Ef, Shift),
- {D1, E1} = compute_shortest(Vm, Vr, Vp1, VmIsTrailingZero, VrIsTrailingZero, Accept),
- {E1 + E10, integer_to_list(D1)}.
-
-decode(Mantissa, 0) ->
- {Mantissa, 1 - ?DECODE_CORRECTION - 2};
-decode(Mantissa, Exponent) ->
- {Mantissa + ?BIG_POW, Exponent - ?DECODE_CORRECTION - 2}.
-
-mmshift(0, E) when E > 1 ->
- 0;
-mmshift(_M, _E) ->
- 1.
-
-convert_to_decimal(E2, Mv, Shift) when E2 >= 0 ->
- Q = max(0, ((E2 * 78913) bsr 18) - 1),
- Mul = io_lib_format_ryu_table:inv_value(Q),
- K = io_lib_format_ryu_table:pow5_inv_bitcount() + pow5bits(Q) - 1,
- I = -E2 + Q + K,
- {Vm, Vr, Vp} = mulShiftAll(Mv, Shift, I, Mul),
- {Q, Vm, Vr, Vp, Q};
-
-convert_to_decimal(E2, Mv, Shift) when E2 < 0 ->
- Q = max(0, ((-E2 * 732923) bsr 20) - 1),
- I = -E2 - Q,
- K = pow5bits(I) - io_lib_format_ryu_table:pow5_bitcount(),
- From_file = io_lib_format_ryu_table:value(I),
- J = Q - K,
- {Vm, Vr, Vp} = mulShiftAll(Mv, Shift, J, From_file),
- E10 = E2 + Q,
- {Q, Vm, Vr, Vp, E10}.
-
-pow5bits(E) ->
- ((E * 1217359) bsr 19) + 1.
-
-mulShiftAll(Mv, Shift, J, Mul) ->
- A = mulShift64(Mv - 1 - Shift, Mul, J),
- B = mulShift64(Mv, Mul, J),
- C = mulShift64(Mv + 2,Mul, J),
- {A, B, C}.
-
-mulShift64(M, Mul, J) ->
- (M * Mul) bsr J.
-
-bounds(Mv, Q, Vp, _Accept, E2, _Shift) when E2 >= 0, Q =< 21, Mv rem 5 =:= 0 ->
- {false, multipleOfPowerOf5(Mv, Q) , Vp};
-bounds(Mv, Q, Vp, true, E2, Shift) when E2 >= 0, Q =< 21 ->
- {multipleOfPowerOf5(Mv - 1 - Shift, Q), false , Vp};
-bounds(Mv, Q, Vp, _Accept, E2, _Shift) when E2 >= 0, Q =< 21 ->
- {false, false , Vp - vpmodifier(multipleOfPowerOf5(Mv + 2, Q))};
-bounds(_Mv, Q, Vp, true, E2, Shift) when E2 < 0, Q =< 1 ->
- {Shift =:= 1, true, Vp};
-bounds(_Mv, Q, Vp, false, E2, _Shift) when E2 < 0, Q =< 1 ->
- {false, true, Vp - 1};
-bounds(Mv, Q, Vp, _Accept, E2, _Shift) when E2 < 0, Q < 63 ->
- {false, (Mv band ((1 bsl Q) -1 )) =:= 0, Vp};
-bounds(_Mv, _Q, Vp, _Accept, _E2, _Shift) ->
- {false, false, Vp}.
-
-multipleOfPowerOf5(Value, Q) ->
- pow5factor(Value) >= Q.
-
-pow5factor(Val) ->
- pow5factor(Val div 5, 0).
-
-pow5factor(Val, Count) when (Val rem 5) /= 0->
- Count;
-pow5factor(Val, Count) ->
- pow5factor(Val div 5, Count + 1).
-
-vpmodifier(true) ->
- 1;
-vpmodifier(false) ->
- 0.
-
-compute_shortest(Vm, Vr, Vp, false, false, _Accept) ->
- {Vm1, Vr1, Removed, RoundUp} =
- general_case(Vm, Vr, Vp, 0, false),
- Output = Vr1 + handle_normal_output_mod(Vr1, Vm1, RoundUp),
- {Output, Removed};
-compute_shortest(Vm, Vr, Vp, VmIsTrailingZero, VrIsTrailingZero, Accept) ->
- {Vm1, Vr1, Removed, LastRemovedDigit} =
- handle_trailing_zeros(Vm, Vr, Vp, VmIsTrailingZero, VrIsTrailingZero, 0, 0),
- Output = Vr1 + handle_zero_output_mod(Vr1, Vm1, Accept, VmIsTrailingZero, LastRemovedDigit),
- {Output, Removed}.
-
-general_case(Vm, Vr, Vp, Removed, RoundUp) when (Vp div 100) =< (Vm div 100)->
- general_case_10(Vm, Vr, Vp, Removed, RoundUp);
-general_case(Vm, Vr, Vp, Removed, _RU) ->
- VmD100 = Vm div 100,
- VrD100 = Vr div 100,
- VpD100 = Vp div 100,
- RoundUp = ((Vr rem 100) >= 50),
- general_case_10(VmD100, VrD100, VpD100, 2 + Removed, RoundUp).
-
-general_case_10(Vm, Vr, Vp, Removed, RoundUp)
- when (Vp div 10) =< (Vm div 10)->
- {Vm, Vr, Removed, RoundUp};
-general_case_10(Vm, Vr, Vp, Removed, _RU) ->
- VmD10 = Vm div 10,
- VrD10 = Vr div 10,
- VpD10 = Vp div 10,
- RoundUp = ((Vr rem 10) >= 5),
- general_case_10(VmD10, VrD10, VpD10, 1 + Removed, RoundUp).
-
-handle_normal_output_mod(Vr, Vm, RoundUp) when (Vm =:= Vr) or RoundUp ->
- 1;
-handle_normal_output_mod(_Vr, _Vm, _RoundUp) ->
- 0.
-
-handle_trailing_zeros(Vm, Vr, Vp, VmTZ, VrTZ, Removed, LastRemovedDigit)
- when (Vp div 10) =< (Vm div 10)->
- vmIsTrailingZero(Vm, Vr, Vp, VmTZ, VrTZ, Removed, LastRemovedDigit);
-handle_trailing_zeros(Vm, Vr, Vp, VmIsTrailingZero, VrIsTrailingZero, Removed, LastRemovedDigit) ->
- VmTZ = VmIsTrailingZero and ((Vm rem 10) =:= 0),
- VrTZ = VrIsTrailingZero and (LastRemovedDigit =:= 0),
- handle_trailing_zeros(Vm div 10, Vr div 10, Vp div 10, VmTZ, VrTZ, 1 + Removed, Vr rem 10).
-
-vmIsTrailingZero(Vm, Vr, _Vp, false = _VmTZ, VrTZ, Removed, LastRemovedDigit) ->
- handle_50_dotdot_0(Vm, Vr, VrTZ, Removed, LastRemovedDigit);
-vmIsTrailingZero(Vm, Vr, _Vp, _VmTZ, VrTZ, Removed, LastRemovedDigit) when (Vm rem 10) /= 0 ->
- handle_50_dotdot_0(Vm, Vr, VrTZ, Removed, LastRemovedDigit);
-vmIsTrailingZero(Vm, Vr, Vp, VmTZ, VrTZ, Removed, LastRemovedDigit) ->
- vmIsTrailingZero(Vm div 10, Vr div 10, Vp div 10, VmTZ, LastRemovedDigit == 0 andalso VrTZ, 1 + Removed, Vr rem 10).
-
-handle_50_dotdot_0(Vm, Vr, true, Removed, 5) when (Vr rem 2) =:= 0 ->
- {Vm, Vr, Removed, 4};
-handle_50_dotdot_0(Vm, Vr, _VrTZ, Removed, LastRemovedDigit) ->
- {Vm, Vr, Removed, LastRemovedDigit}.
-
-handle_zero_output_mod(_Vr, _Vm, _Accept, _VmTZ, LastRemovedDigit) when LastRemovedDigit >= 5 ->
- 1;
-handle_zero_output_mod(Vr, Vm, Accept, VmTZ, _LastRemovedDigit) when Vr =:= Vm, ((not Accept) or (not VmTZ)) ->
- 1;
-handle_zero_output_mod(_Vr, _Vm, _Accept, _VmTZ, _LastRemovedDigit) ->
- 0.
-
-insert_decimal(Place, S, Float) ->
- L = length(S),
- Exp = Place + L - 1,
- ExpL = integer_to_list(Exp),
- ExpCost = length(ExpL) + 2,
- if
- Place < 0 ->
- if
- Exp >= 0 ->
- {S0, S1} = lists:split(L + Place, S),
- S0 ++ "." ++ S1;
- 2 - Place - L =< ExpCost ->
- "0." ++ lists:duplicate(-Place - L, $0) ++ S;
- true ->
- insert_exp(ExpL, S)
- end;
- true ->
- Dot = if L =:= 1 -> 1; true -> 0 end,
- if
- %% All integers in the range [-2^53, 2^53] can
- %% be stored without loss of precision in an
- %% IEEE 754 64-bit double but 2^53+1 cannot be
- %% stored in an IEEE 754 64-bit double without
- %% loss of precision (float((1 bsl 53)+1) =:=
- %% float(1 bsl 53)). It thus makes sense to
- %% show floats that are >= 2^53 or <= -2^53 in
- %% scientific notation to indicate that the
- %% number is so large that there could be loss
- %% in precion when adding or subtracting 1.
- %%
- %% https://stackoverflow.com/questions/1848700/biggest-integer-that-can-be-stored-in-a-double?answertab=votes#tab-top
- ExpCost + Dot >= Place + 2 andalso abs(Float) < float(1 bsl 53) ->
- S ++ lists:duplicate(Place, $0) ++ ".0";
- true ->
- insert_exp(ExpL, S)
- end
- end.
-
-
-insert_exp(ExpL, [C]) ->
- [C] ++ ".0e" ++ ExpL;
-insert_exp(ExpL, [C | S]) ->
- [C] ++ "." ++ S ++ "e" ++ ExpL.
-
-insert_minus(0, Digits) ->
- Digits;
-insert_minus(1, Digits) ->
- [$-] ++ Digits.
+ float_to_list(Float, [short]).
%% fwrite_g(Float, Field, Adjust, Precision, PadChar)
%% Use the f form if Float is >= 0.1 and < 1.0e4,
diff --git a/lib/stdlib/src/io_lib_format_ryu_table.erl b/lib/stdlib/src/io_lib_format_ryu_table.erl
deleted file mode 100644
index b20268a939..0000000000
--- a/lib/stdlib/src/io_lib_format_ryu_table.erl
+++ /dev/null
@@ -1,686 +0,0 @@
-%%
-%% this file is generated do not modify
-%% see ../script/generate_ryu_table.escript
-
--module(io_lib_format_ryu_table).
--export([pow5_bitcount/0, pow5_inv_bitcount/0, value/1, inv_value/1]).
-
--spec pow5_bitcount() -> integer().
-pow5_bitcount() -> 125.
-
--spec pow5_inv_bitcount() -> integer().
-pow5_inv_bitcount() -> 125.
-
--spec value(integer()) -> integer().
-value(0) -> 21267647932558653966460912964485513216;
-value(1) -> 26584559915698317458076141205606891520;
-value(2) -> 33230699894622896822595176507008614400;
-value(3) -> 41538374868278621028243970633760768000;
-value(4) -> 25961484292674138142652481646100480000;
-value(5) -> 32451855365842672678315602057625600000;
-value(6) -> 40564819207303340847894502572032000000;
-value(7) -> 25353012004564588029934064107520000000;
-value(8) -> 31691265005705735037417580134400000000;
-value(9) -> 39614081257132168796771975168000000000;
-value(10) -> 24758800785707605497982484480000000000;
-value(11) -> 30948500982134506872478105600000000000;
-value(12) -> 38685626227668133590597632000000000000;
-value(13) -> 24178516392292583494123520000000000000;
-value(14) -> 30223145490365729367654400000000000000;
-value(15) -> 37778931862957161709568000000000000000;
-value(16) -> 23611832414348226068480000000000000000;
-value(17) -> 29514790517935282585600000000000000000;
-value(18) -> 36893488147419103232000000000000000000;
-value(19) -> 23058430092136939520000000000000000000;
-value(20) -> 28823037615171174400000000000000000000;
-value(21) -> 36028797018963968000000000000000000000;
-value(22) -> 22517998136852480000000000000000000000;
-value(23) -> 28147497671065600000000000000000000000;
-value(24) -> 35184372088832000000000000000000000000;
-value(25) -> 21990232555520000000000000000000000000;
-value(26) -> 27487790694400000000000000000000000000;
-value(27) -> 34359738368000000000000000000000000000;
-value(28) -> 21474836480000000000000000000000000000;
-value(29) -> 26843545600000000000000000000000000000;
-value(30) -> 33554432000000000000000000000000000000;
-value(31) -> 41943040000000000000000000000000000000;
-value(32) -> 26214400000000000000000000000000000000;
-value(33) -> 32768000000000000000000000000000000000;
-value(34) -> 40960000000000000000000000000000000000;
-value(35) -> 25600000000000000000000000000000000000;
-value(36) -> 32000000000000000000000000000000000000;
-value(37) -> 40000000000000000000000000000000000000;
-value(38) -> 25000000000000000000000000000000000000;
-value(39) -> 31250000000000000000000000000000000000;
-value(40) -> 39062500000000000000000000000000000000;
-value(41) -> 24414062500000000000000000000000000000;
-value(42) -> 30517578125000000000000000000000000000;
-value(43) -> 38146972656250000000000000000000000000;
-value(44) -> 23841857910156250000000000000000000000;
-value(45) -> 29802322387695312500000000000000000000;
-value(46) -> 37252902984619140625000000000000000000;
-value(47) -> 23283064365386962890625000000000000000;
-value(48) -> 29103830456733703613281250000000000000;
-value(49) -> 36379788070917129516601562500000000000;
-value(50) -> 22737367544323205947875976562500000000;
-value(51) -> 28421709430404007434844970703125000000;
-value(52) -> 35527136788005009293556213378906250000;
-value(53) -> 22204460492503130808472633361816406250;
-value(54) -> 27755575615628913510590791702270507812;
-value(55) -> 34694469519536141888238489627838134765;
-value(56) -> 21684043449710088680149056017398834228;
-value(57) -> 27105054312137610850186320021748542785;
-value(58) -> 33881317890172013562732900027185678482;
-value(59) -> 42351647362715016953416125033982098102;
-value(60) -> 26469779601696885595885078146238811314;
-value(61) -> 33087224502121106994856347682798514142;
-value(62) -> 41359030627651383743570434603498142678;
-value(63) -> 25849394142282114839731521627186339173;
-value(64) -> 32311742677852643549664402033982923967;
-value(65) -> 40389678347315804437080502542478654959;
-value(66) -> 25243548967072377773175314089049159349;
-value(67) -> 31554436208840472216469142611311449186;
-value(68) -> 39443045261050590270586428264139311483;
-value(69) -> 24651903288156618919116517665087069677;
-value(70) -> 30814879110195773648895647081358837096;
-value(71) -> 38518598887744717061119558851698546370;
-value(72) -> 24074124304840448163199724282311591481;
-value(73) -> 30092655381050560203999655352889489352;
-value(74) -> 37615819226313200254999569191111861690;
-value(75) -> 23509887016445750159374730744444913556;
-value(76) -> 29387358770557187699218413430556141945;
-value(77) -> 36734198463196484624023016788195177431;
-value(78) -> 22958874039497802890014385492621985894;
-value(79) -> 28698592549372253612517981865777482368;
-value(80) -> 35873240686715317015647477332221852960;
-value(81) -> 22420775429197073134779673332638658100;
-value(82) -> 28025969286496341418474591665798322625;
-value(83) -> 35032461608120426773093239582247903282;
-value(84) -> 21895288505075266733183274738904939551;
-value(85) -> 27369110631344083416479093423631174439;
-value(86) -> 34211388289180104270598866779538968048;
-value(87) -> 21382117680737565169124291737211855030;
-value(88) -> 26727647100921956461405364671514818788;
-value(89) -> 33409558876152445576756705839393523485;
-value(90) -> 41761948595190556970945882299241904356;
-value(91) -> 26101217871994098106841176437026190222;
-value(92) -> 32626522339992622633551470546282737778;
-value(93) -> 40783152924990778291939338182853422223;
-value(94) -> 25489470578119236432462086364283388889;
-value(95) -> 31861838222649045540577607955354236111;
-value(96) -> 39827297778311306925722009944192795139;
-value(97) -> 24892061111444566828576256215120496962;
-value(98) -> 31115076389305708535720320268900621202;
-value(99) -> 38893845486632135669650400336125776503;
-value(100) -> 24308653429145084793531500210078610314;
-value(101) -> 30385816786431355991914375262598262893;
-value(102) -> 37982270983039194989892969078247828616;
-value(103) -> 23738919364399496868683105673904892885;
-value(104) -> 29673649205499371085853882092381116106;
-value(105) -> 37092061506874213857317352615476395133;
-value(106) -> 23182538441796383660823345384672746958;
-value(107) -> 28978173052245479576029181730840933698;
-value(108) -> 36222716315306849470036477163551167122;
-value(109) -> 22639197697066780918772798227219479451;
-value(110) -> 28298997121333476148465997784024349314;
-value(111) -> 35373746401666845185582497230030436643;
-value(112) -> 22108591501041778240989060768769022902;
-value(113) -> 27635739376302222801236325960961278627;
-value(114) -> 34544674220377778501545407451201598284;
-value(115) -> 21590421387736111563465879657000998927;
-value(116) -> 26988026734670139454332349571251248659;
-value(117) -> 33735033418337674317915436964064060824;
-value(118) -> 42168791772922092897394296205080076030;
-value(119) -> 26355494858076308060871435128175047519;
-value(120) -> 32944368572595385076089293910218809399;
-value(121) -> 41180460715744231345111617387773511748;
-value(122) -> 25737787947340144590694760867358444843;
-value(123) -> 32172234934175180738368451084198056053;
-value(124) -> 40215293667718975922960563855247570067;
-value(125) -> 25134558542324359951850352409529731292;
-value(126) -> 31418198177905449939812940511912164115;
-value(127) -> 39272747722381812424766175639890205143;
-value(128) -> 24545467326488632765478859774931378214;
-value(129) -> 30681834158110790956848574718664222768;
-value(130) -> 38352292697638488696060718398330278460;
-value(131) -> 23970182936024055435037948998956424037;
-value(132) -> 29962728670030069293797436248695530047;
-value(133) -> 37453410837537586617246795310869412559;
-value(134) -> 23408381773460991635779247069293382849;
-value(135) -> 29260477216826239544724058836616728561;
-value(136) -> 36575596521032799430905073545770910702;
-value(137) -> 22859747825645499644315670966106819189;
-value(138) -> 28574684782056874555394588707633523986;
-value(139) -> 35718355977571093194243235884541904982;
-value(140) -> 22323972485981933246402022427838690614;
-value(141) -> 27904965607477416558002528034798363267;
-value(142) -> 34881207009346770697503160043497954084;
-value(143) -> 21800754380841731685939475027186221303;
-value(144) -> 27250942976052164607424343783982776628;
-value(145) -> 34063678720065205759280429729978470785;
-value(146) -> 21289799200040753599550268581236544241;
-value(147) -> 26612249000050941999437835726545680301;
-value(148) -> 33265311250063677499297294658182100376;
-value(149) -> 41581639062579596874121618322727625471;
-value(150) -> 25988524414112248046326011451704765919;
-value(151) -> 32485655517640310057907514314630957399;
-value(152) -> 40607069397050387572384392893288696749;
-value(153) -> 25379418373156492232740245558305435468;
-value(154) -> 31724272966445615290925306947881794335;
-value(155) -> 39655341208057019113656633684852242919;
-value(156) -> 24784588255035636946035396053032651824;
-value(157) -> 30980735318794546182544245066290814780;
-value(158) -> 38725919148493182728180306332863518475;
-value(159) -> 24203699467808239205112691458039699047;
-value(160) -> 30254624334760299006390864322549623809;
-value(161) -> 37818280418450373757988580403187029761;
-value(162) -> 23636425261531483598742862751991893600;
-value(163) -> 29545531576914354498428578439989867001;
-value(164) -> 36931914471142943123035723049987333751;
-value(165) -> 23082446544464339451897326906242083594;
-value(166) -> 28853058180580424314871658632802604493;
-value(167) -> 36066322725725530393589573291003255616;
-value(168) -> 22541451703578456495993483306877034760;
-value(169) -> 28176814629473070619991854133596293450;
-value(170) -> 35221018286841338274989817666995366813;
-value(171) -> 22013136429275836421868636041872104258;
-value(172) -> 27516420536594795527335795052340130322;
-value(173) -> 34395525670743494409169743815425162903;
-value(174) -> 21497203544214684005731089884640726814;
-value(175) -> 26871504430268355007163862355800908518;
-value(176) -> 33589380537835443758954827944751135647;
-value(177) -> 41986725672294304698693534930938919559;
-value(178) -> 26241703545183940436683459331836824724;
-value(179) -> 32802129431479925545854324164796030906;
-value(180) -> 41002661789349906932317905205995038632;
-value(181) -> 25626663618343691832698690753746899145;
-value(182) -> 32033329522929614790873363442183623931;
-value(183) -> 40041661903662018488591704302729529914;
-value(184) -> 25026038689788761555369815189205956196;
-value(185) -> 31282548362235951944212268986507445245;
-value(186) -> 39103185452794939930265336233134306557;
-value(187) -> 24439490907996837456415835145708941598;
-value(188) -> 30549363634996046820519793932136176997;
-value(189) -> 38186704543745058525649742415170221247;
-value(190) -> 23866690339840661578531089009481388279;
-value(191) -> 29833362924800826973163861261851735349;
-value(192) -> 37291703656001033716454826577314669186;
-value(193) -> 23307314785000646072784266610821668241;
-value(194) -> 29134143481250807590980333263527085302;
-value(195) -> 36417679351563509488725416579408856627;
-value(196) -> 22761049594727193430453385362130535392;
-value(197) -> 28451311993408991788066731702663169240;
-value(198) -> 35564139991761239735083414628328961550;
-value(199) -> 22227587494850774834427134142705600969;
-value(200) -> 27784484368563468543033917678382001211;
-value(201) -> 34730605460704335678792397097977501514;
-value(202) -> 21706628412940209799245248186235938446;
-value(203) -> 27133285516175262249056560232794923058;
-value(204) -> 33916606895219077811320700290993653822;
-value(205) -> 42395758619023847264150875363742067278;
-value(206) -> 26497349136889904540094297102338792048;
-value(207) -> 33121686421112380675117871377923490061;
-value(208) -> 41402108026390475843897339222404362576;
-value(209) -> 25876317516494047402435837014002726610;
-value(210) -> 32345396895617559253044796267503408262;
-value(211) -> 40431746119521949066305995334379260328;
-value(212) -> 25269841324701218166441247083987037705;
-value(213) -> 31587301655876522708051558854983797131;
-value(214) -> 39484127069845653385064448568729746414;
-value(215) -> 24677579418653533365665280355456091509;
-value(216) -> 30846974273316916707081600444320114386;
-value(217) -> 38558717841646145883852000555400142982;
-value(218) -> 24099198651028841177407500347125089364;
-value(219) -> 30123998313786051471759375433906361705;
-value(220) -> 37654997892232564339699219292382952131;
-value(221) -> 23534373682645352712312012057739345082;
-value(222) -> 29417967103306690890390015072174181352;
-value(223) -> 36772458879133363612987518840217726691;
-value(224) -> 22982786799458352258117199275136079181;
-value(225) -> 28728483499322940322646499093920098977;
-value(226) -> 35910604374153675403308123867400123721;
-value(227) -> 22444127733846047127067577417125077326;
-value(228) -> 28055159667307558908834471771406346657;
-value(229) -> 35068949584134448636043089714257933322;
-value(230) -> 21918093490084030397526931071411208326;
-value(231) -> 27397616862605037996908663839264010407;
-value(232) -> 34247021078256297496135829799080013009;
-value(233) -> 21404388173910185935084893624425008131;
-value(234) -> 26755485217387732418856117030531260163;
-value(235) -> 33444356521734665523570146288164075204;
-value(236) -> 41805445652168331904462682860205094006;
-value(237) -> 26128403532605207440289176787628183753;
-value(238) -> 32660504415756509300361470984535229692;
-value(239) -> 40825630519695636625451838730669037115;
-value(240) -> 25516019074809772890907399206668148197;
-value(241) -> 31895023843512216113634249008335185246;
-value(242) -> 39868779804390270142042811260418981558;
-value(243) -> 24917987377743918838776757037761863473;
-value(244) -> 31147484222179898548470946297202329342;
-value(245) -> 38934355277724873185588682871502911677;
-value(246) -> 24333972048578045740992926794689319798;
-value(247) -> 30417465060722557176241158493361649748;
-value(248) -> 38021831325903196470301448116702062185;
-value(249) -> 23763644578689497793938405072938788865;
-value(250) -> 29704555723361872242423006341173486082;
-value(251) -> 37130694654202340303028757926466857602;
-value(252) -> 23206684158876462689392973704041786001;
-value(253) -> 29008355198595578361741217130052232502;
-value(254) -> 36260443998244472952176521412565290627;
-value(255) -> 22662777498902795595110325882853306642;
-value(256) -> 28328471873628494493887907353566633302;
-value(257) -> 35410589842035618117359884191958291628;
-value(258) -> 22131618651272261323349927619973932267;
-value(259) -> 27664523314090326654187409524967415334;
-value(260) -> 34580654142612908317734261906209269168;
-value(261) -> 21612908839133067698583913691380793230;
-value(262) -> 27016136048916334623229892114225991537;
-value(263) -> 33770170061145418279037365142782489422;
-value(264) -> 42212712576431772848796706428478111778;
-value(265) -> 26382945360269858030497941517798819861;
-value(266) -> 32978681700337322538122426897248524826;
-value(267) -> 41223352125421653172653033621560656033;
-value(268) -> 25764595078388533232908146013475410020;
-value(269) -> 32205743847985666541135182516844262526;
-value(270) -> 40257179809982083176418978146055328157;
-value(271) -> 25160737381238801985261861341284580098;
-value(272) -> 31450921726548502481577326676605725123;
-value(273) -> 39313652158185628101971658345757156403;
-value(274) -> 24571032598866017563732286466098222752;
-value(275) -> 30713790748582521954665358082622778440;
-value(276) -> 38392238435728152443331697603278473050;
-value(277) -> 23995149022330095277082311002049045656;
-value(278) -> 29993936277912619096352888752561307070;
-value(279) -> 37492420347390773870441110940701633838;
-value(280) -> 23432762717119233669025694337938521149;
-value(281) -> 29290953396399042086282117922423151436;
-value(282) -> 36613691745498802607852647403028939295;
-value(283) -> 22883557340936751629907904626893087059;
-value(284) -> 28604446676170939537384880783616358824;
-value(285) -> 35755558345213674421731100979520448530;
-value(286) -> 22347223965758546513581938112200280331;
-value(287) -> 27934029957198183141977422640250350414;
-value(288) -> 34917537446497728927471778300312938018;
-value(289) -> 21823460904061080579669861437695586261;
-value(290) -> 27279326130076350724587326797119482826;
-value(291) -> 34099157662595438405734158496399353533;
-value(292) -> 21311973539122149003583849060249595958;
-value(293) -> 26639966923902686254479811325311994947;
-value(294) -> 33299958654878357818099764156639993684;
-value(295) -> 41624948318597947272624705195799992106;
-value(296) -> 26015592699123717045390440747374995066;
-value(297) -> 32519490873904646306738050934218743833;
-value(298) -> 40649363592380807883422563667773429791;
-value(299) -> 25405852245238004927139102292358393619;
-value(300) -> 31757315306547506158923877865447992024;
-value(301) -> 39696644133184382698654847331809990030;
-value(302) -> 24810402583240239186659279582381243769;
-value(303) -> 31013003229050298983324099477976554711;
-value(304) -> 38766254036312873729155124347470693389;
-value(305) -> 24228908772695546080721952717169183368;
-value(306) -> 30286135965869432600902440896461479210;
-value(307) -> 37857669957336790751128051120576849012;
-value(308) -> 23661043723335494219455031950360530633;
-value(309) -> 29576304654169367774318789937950663291;
-value(310) -> 36970380817711709717898487422438329114;
-value(311) -> 23106488011069818573686554639023955696;
-value(312) -> 28883110013837273217108193298779944620;
-value(313) -> 36103887517296591521385241623474930775;
-value(314) -> 22564929698310369700865776014671831734;
-value(315) -> 28206162122887962126082220018339789668;
-value(316) -> 35257702653609952657602775022924737085;
-value(317) -> 22036064158506220411001734389327960678;
-value(318) -> 27545080198132775513752167986659950848;
-value(319) -> 34431350247665969392190209983324938560;
-value(320) -> 21519593904791230870118881239578086600;
-value(321) -> 26899492380989038587648601549472608250;
-value(322) -> 33624365476236298234560751936840760312;
-value(323) -> 42030456845295372793200939921050950390;
-value(324) -> 26269035528309607995750587450656843994;
-value(325) -> 32836294410387009994688234313321054992;
-value(_) -> error(function_clause).
-
--spec inv_value(integer()) -> integer().
-inv_value(0) -> 42535295865117307932921825928971026433;
-inv_value(1) -> 34028236692093846346337460743176821146;
-inv_value(2) -> 27222589353675077077069968594541456917;
-inv_value(3) -> 21778071482940061661655974875633165534;
-inv_value(4) -> 34844914372704098658649559801013064854;
-inv_value(5) -> 27875931498163278926919647840810451883;
-inv_value(6) -> 22300745198530623141535718272648361506;
-inv_value(7) -> 35681192317648997026457149236237378410;
-inv_value(8) -> 28544953854119197621165719388989902728;
-inv_value(9) -> 22835963083295358096932575511191922183;
-inv_value(10) -> 36537540933272572955092120817907075492;
-inv_value(11) -> 29230032746618058364073696654325660394;
-inv_value(12) -> 23384026197294446691258957323460528315;
-inv_value(13) -> 37414441915671114706014331717536845304;
-inv_value(14) -> 29931553532536891764811465374029476243;
-inv_value(15) -> 23945242826029513411849172299223580995;
-inv_value(16) -> 38312388521647221458958675678757729591;
-inv_value(17) -> 30649910817317777167166940543006183673;
-inv_value(18) -> 24519928653854221733733552434404946938;
-inv_value(19) -> 39231885846166754773973683895047915101;
-inv_value(20) -> 31385508676933403819178947116038332081;
-inv_value(21) -> 25108406941546723055343157692830665665;
-inv_value(22) -> 40173451106474756888549052308529065064;
-inv_value(23) -> 32138760885179805510839241846823252051;
-inv_value(24) -> 25711008708143844408671393477458601641;
-inv_value(25) -> 41137613933030151053874229563933762625;
-inv_value(26) -> 32910091146424120843099383651147010100;
-inv_value(27) -> 26328072917139296674479506920917608080;
-inv_value(28) -> 42124916667422874679167211073468172928;
-inv_value(29) -> 33699933333938299743333768858774538343;
-inv_value(30) -> 26959946667150639794667015087019630674;
-inv_value(31) -> 21567957333720511835733612069615704539;
-inv_value(32) -> 34508731733952818937173779311385127263;
-inv_value(33) -> 27606985387162255149739023449108101810;
-inv_value(34) -> 22085588309729804119791218759286481448;
-inv_value(35) -> 35336941295567686591665950014858370317;
-inv_value(36) -> 28269553036454149273332760011886696254;
-inv_value(37) -> 22615642429163319418666208009509357003;
-inv_value(38) -> 36185027886661311069865932815214971205;
-inv_value(39) -> 28948022309329048855892746252171976964;
-inv_value(40) -> 23158417847463239084714197001737581571;
-inv_value(41) -> 37053468555941182535542715202780130514;
-inv_value(42) -> 29642774844752946028434172162224104411;
-inv_value(43) -> 23714219875802356822747337729779283529;
-inv_value(44) -> 37942751801283770916395740367646853646;
-inv_value(45) -> 30354201441027016733116592294117482917;
-inv_value(46) -> 24283361152821613386493273835293986334;
-inv_value(47) -> 38853377844514581418389238136470378133;
-inv_value(48) -> 31082702275611665134711390509176302507;
-inv_value(49) -> 24866161820489332107769112407341042006;
-inv_value(50) -> 39785858912782931372430579851745667209;
-inv_value(51) -> 31828687130226345097944463881396533767;
-inv_value(52) -> 25462949704181076078355571105117227014;
-inv_value(53) -> 40740719526689721725368913768187563222;
-inv_value(54) -> 32592575621351777380295131014550050577;
-inv_value(55) -> 26074060497081421904236104811640040462;
-inv_value(56) -> 41718496795330275046777767698624064739;
-inv_value(57) -> 33374797436264220037422214158899251791;
-inv_value(58) -> 26699837949011376029937771327119401433;
-inv_value(59) -> 21359870359209100823950217061695521147;
-inv_value(60) -> 34175792574734561318320347298712833834;
-inv_value(61) -> 27340634059787649054656277838970267067;
-inv_value(62) -> 21872507247830119243725022271176213654;
-inv_value(63) -> 34996011596528190789960035633881941846;
-inv_value(64) -> 27996809277222552631968028507105553477;
-inv_value(65) -> 22397447421778042105574422805684442782;
-inv_value(66) -> 35835915874844867368919076489095108450;
-inv_value(67) -> 28668732699875893895135261191276086760;
-inv_value(68) -> 22934986159900715116108208953020869408;
-inv_value(69) -> 36695977855841144185773134324833391053;
-inv_value(70) -> 29356782284672915348618507459866712843;
-inv_value(71) -> 23485425827738332278894805967893370274;
-inv_value(72) -> 37576681324381331646231689548629392439;
-inv_value(73) -> 30061345059505065316985351638903513951;
-inv_value(74) -> 24049076047604052253588281311122811161;
-inv_value(75) -> 38478521676166483605741250097796497857;
-inv_value(76) -> 30782817340933186884593000078237198286;
-inv_value(77) -> 24626253872746549507674400062589758629;
-inv_value(78) -> 39402006196394479212279040100143613806;
-inv_value(79) -> 31521604957115583369823232080114891045;
-inv_value(80) -> 25217283965692466695858585664091912836;
-inv_value(81) -> 40347654345107946713373737062547060537;
-inv_value(82) -> 32278123476086357370698989650037648430;
-inv_value(83) -> 25822498780869085896559191720030118744;
-inv_value(84) -> 41315998049390537434494706752048189990;
-inv_value(85) -> 33052798439512429947595765401638551992;
-inv_value(86) -> 26442238751609943958076612321310841594;
-inv_value(87) -> 42307582002575910332922579714097346550;
-inv_value(88) -> 33846065602060728266338063771277877240;
-inv_value(89) -> 27076852481648582613070451017022301792;
-inv_value(90) -> 21661481985318866090456360813617841434;
-inv_value(91) -> 34658371176510185744730177301788546293;
-inv_value(92) -> 27726696941208148595784141841430837035;
-inv_value(93) -> 22181357552966518876627313473144669628;
-inv_value(94) -> 35490172084746430202603701557031471404;
-inv_value(95) -> 28392137667797144162082961245625177124;
-inv_value(96) -> 22713710134237715329666368996500141699;
-inv_value(97) -> 36341936214780344527466190394400226718;
-inv_value(98) -> 29073548971824275621972952315520181375;
-inv_value(99) -> 23258839177459420497578361852416145100;
-inv_value(100) -> 37214142683935072796125378963865832159;
-inv_value(101) -> 29771314147148058236900303171092665728;
-inv_value(102) -> 23817051317718446589520242536874132582;
-inv_value(103) -> 38107282108349514543232388058998612131;
-inv_value(104) -> 30485825686679611634585910447198889705;
-inv_value(105) -> 24388660549343689307668728357759111764;
-inv_value(106) -> 39021856878949902892269965372414578822;
-inv_value(107) -> 31217485503159922313815972297931663058;
-inv_value(108) -> 24973988402527937851052777838345330446;
-inv_value(109) -> 39958381444044700561684444541352528714;
-inv_value(110) -> 31966705155235760449347555633082022971;
-inv_value(111) -> 25573364124188608359478044506465618377;
-inv_value(112) -> 40917382598701773375164871210344989403;
-inv_value(113) -> 32733906078961418700131896968275991523;
-inv_value(114) -> 26187124863169134960105517574620793218;
-inv_value(115) -> 41899399781070615936168828119393269149;
-inv_value(116) -> 33519519824856492748935062495514615319;
-inv_value(117) -> 26815615859885194199148049996411692255;
-inv_value(118) -> 21452492687908155359318439997129353804;
-inv_value(119) -> 34323988300653048574909503995406966087;
-inv_value(120) -> 27459190640522438859927603196325572870;
-inv_value(121) -> 21967352512417951087942082557060458296;
-inv_value(122) -> 35147764019868721740707332091296733273;
-inv_value(123) -> 28118211215894977392565865673037386618;
-inv_value(124) -> 22494568972715981914052692538429909295;
-inv_value(125) -> 35991310356345571062484308061487854871;
-inv_value(126) -> 28793048285076456849987446449190283897;
-inv_value(127) -> 23034438628061165479989957159352227118;
-inv_value(128) -> 36855101804897864767983931454963563388;
-inv_value(129) -> 29484081443918291814387145163970850711;
-inv_value(130) -> 23587265155134633451509716131176680569;
-inv_value(131) -> 37739624248215413522415545809882688910;
-inv_value(132) -> 30191699398572330817932436647906151128;
-inv_value(133) -> 24153359518857864654345949318324920902;
-inv_value(134) -> 38645375230172583446953518909319873443;
-inv_value(135) -> 30916300184138066757562815127455898755;
-inv_value(136) -> 24733040147310453406050252101964719004;
-inv_value(137) -> 39572864235696725449680403363143550406;
-inv_value(138) -> 31658291388557380359744322690514840325;
-inv_value(139) -> 25326633110845904287795458152411872260;
-inv_value(140) -> 40522612977353446860472733043858995616;
-inv_value(141) -> 32418090381882757488378186435087196493;
-inv_value(142) -> 25934472305506205990702549148069757194;
-inv_value(143) -> 41495155688809929585124078636911611511;
-inv_value(144) -> 33196124551047943668099262909529289209;
-inv_value(145) -> 26556899640838354934479410327623431367;
-inv_value(146) -> 42491039425341367895167056524197490187;
-inv_value(147) -> 33992831540273094316133645219357992150;
-inv_value(148) -> 27194265232218475452906916175486393720;
-inv_value(149) -> 21755412185774780362325532940389114976;
-inv_value(150) -> 34808659497239648579720852704622583961;
-inv_value(151) -> 27846927597791718863776682163698067169;
-inv_value(152) -> 22277542078233375091021345730958453735;
-inv_value(153) -> 35644067325173400145634153169533525976;
-inv_value(154) -> 28515253860138720116507322535626820781;
-inv_value(155) -> 22812203088110976093205858028501456625;
-inv_value(156) -> 36499524940977561749129372845602330600;
-inv_value(157) -> 29199619952782049399303498276481864480;
-inv_value(158) -> 23359695962225639519442798621185491584;
-inv_value(159) -> 37375513539561023231108477793896786534;
-inv_value(160) -> 29900410831648818584886782235117429227;
-inv_value(161) -> 23920328665319054867909425788093943382;
-inv_value(162) -> 38272525864510487788655081260950309411;
-inv_value(163) -> 30618020691608390230924065008760247529;
-inv_value(164) -> 24494416553286712184739252007008198023;
-inv_value(165) -> 39191066485258739495582803211213116837;
-inv_value(166) -> 31352853188206991596466242568970493469;
-inv_value(167) -> 25082282550565593277172994055176394776;
-inv_value(168) -> 40131652080904949243476790488282231641;
-inv_value(169) -> 32105321664723959394781432390625785313;
-inv_value(170) -> 25684257331779167515825145912500628250;
-inv_value(171) -> 41094811730846668025320233460001005200;
-inv_value(172) -> 32875849384677334420256186768000804160;
-inv_value(173) -> 26300679507741867536204949414400643328;
-inv_value(174) -> 42081087212386988057927919063041029325;
-inv_value(175) -> 33664869769909590446342335250432823460;
-inv_value(176) -> 26931895815927672357073868200346258768;
-inv_value(177) -> 21545516652742137885659094560277007015;
-inv_value(178) -> 34472826644387420617054551296443211223;
-inv_value(179) -> 27578261315509936493643641037154568979;
-inv_value(180) -> 22062609052407949194914912829723655183;
-inv_value(181) -> 35300174483852718711863860527557848292;
-inv_value(182) -> 28240139587082174969491088422046278634;
-inv_value(183) -> 22592111669665739975592870737637022907;
-inv_value(184) -> 36147378671465183960948593180219236651;
-inv_value(185) -> 28917902937172147168758874544175389321;
-inv_value(186) -> 23134322349737717735007099635340311457;
-inv_value(187) -> 37014915759580348376011359416544498331;
-inv_value(188) -> 29611932607664278700809087533235598665;
-inv_value(189) -> 23689546086131422960647270026588478932;
-inv_value(190) -> 37903273737810276737035632042541566291;
-inv_value(191) -> 30322618990248221389628505634033253033;
-inv_value(192) -> 24258095192198577111702804507226602426;
-inv_value(193) -> 38812952307517723378724487211562563882;
-inv_value(194) -> 31050361846014178702979589769250051106;
-inv_value(195) -> 24840289476811342962383671815400040885;
-inv_value(196) -> 39744463162898148739813874904640065415;
-inv_value(197) -> 31795570530318518991851099923712052332;
-inv_value(198) -> 25436456424254815193480879938969641866;
-inv_value(199) -> 40698330278807704309569407902351426985;
-inv_value(200) -> 32558664223046163447655526321881141588;
-inv_value(201) -> 26046931378436930758124421057504913271;
-inv_value(202) -> 41675090205499089212999073692007861233;
-inv_value(203) -> 33340072164399271370399258953606288986;
-inv_value(204) -> 26672057731519417096319407162885031189;
-inv_value(205) -> 21337646185215533677055525730308024951;
-inv_value(206) -> 34140233896344853883288841168492839922;
-inv_value(207) -> 27312187117075883106631072934794271938;
-inv_value(208) -> 21849749693660706485304858347835417550;
-inv_value(209) -> 34959599509857130376487773356536668080;
-inv_value(210) -> 27967679607885704301190218685229334464;
-inv_value(211) -> 22374143686308563440952174948183467571;
-inv_value(212) -> 35798629898093701505523479917093548114;
-inv_value(213) -> 28638903918474961204418783933674838491;
-inv_value(214) -> 22911123134779968963535027146939870793;
-inv_value(215) -> 36657797015647950341656043435103793269;
-inv_value(216) -> 29326237612518360273324834748083034615;
-inv_value(217) -> 23460990090014688218659867798466427692;
-inv_value(218) -> 37537584144023501149855788477546284307;
-inv_value(219) -> 30030067315218800919884630782037027446;
-inv_value(220) -> 24024053852175040735907704625629621957;
-inv_value(221) -> 38438486163480065177452327401007395130;
-inv_value(222) -> 30750788930784052141961861920805916104;
-inv_value(223) -> 24600631144627241713569489536644732884;
-inv_value(224) -> 39361009831403586741711183258631572614;
-inv_value(225) -> 31488807865122869393368946606905258091;
-inv_value(226) -> 25191046292098295514695157285524206473;
-inv_value(227) -> 40305674067357272823512251656838730356;
-inv_value(228) -> 32244539253885818258809801325470984285;
-inv_value(229) -> 25795631403108654607047841060376787428;
-inv_value(230) -> 41273010244973847371276545696602859885;
-inv_value(231) -> 33018408195979077897021236557282287908;
-inv_value(232) -> 26414726556783262317616989245825830326;
-inv_value(233) -> 42263562490853219708187182793321328522;
-inv_value(234) -> 33810849992682575766549746234657062818;
-inv_value(235) -> 27048679994146060613239796987725650254;
-inv_value(236) -> 21638943995316848490591837590180520204;
-inv_value(237) -> 34622310392506957584946940144288832325;
-inv_value(238) -> 27697848314005566067957552115431065860;
-inv_value(239) -> 22158278651204452854366041692344852688;
-inv_value(240) -> 35453245841927124566985666707751764301;
-inv_value(241) -> 28362596673541699653588533366201411441;
-inv_value(242) -> 22690077338833359722870826692961129153;
-inv_value(243) -> 36304123742133375556593322708737806644;
-inv_value(244) -> 29043298993706700445274658166990245316;
-inv_value(245) -> 23234639194965360356219726533592196253;
-inv_value(246) -> 37175422711944576569951562453747514004;
-inv_value(247) -> 29740338169555661255961249962998011203;
-inv_value(248) -> 23792270535644529004768999970398408963;
-inv_value(249) -> 38067632857031246407630399952637454340;
-inv_value(250) -> 30454106285624997126104319962109963472;
-inv_value(251) -> 24363285028499997700883455969687970778;
-inv_value(252) -> 38981256045599996321413529551500753244;
-inv_value(253) -> 31185004836479997057130823641200602595;
-inv_value(254) -> 24948003869183997645704658912960482076;
-inv_value(255) -> 39916806190694396233127454260736771322;
-inv_value(256) -> 31933444952555516986501963408589417058;
-inv_value(257) -> 25546755962044413589201570726871533646;
-inv_value(258) -> 40874809539271061742722513162994453834;
-inv_value(259) -> 32699847631416849394178010530395563067;
-inv_value(260) -> 26159878105133479515342408424316450454;
-inv_value(261) -> 41855804968213567224547853478906320726;
-inv_value(262) -> 33484643974570853779638282783125056581;
-inv_value(263) -> 26787715179656683023710626226500045265;
-inv_value(264) -> 21430172143725346418968500981200036212;
-inv_value(265) -> 34288275429960554270349601569920057938;
-inv_value(266) -> 27430620343968443416279681255936046351;
-inv_value(267) -> 21944496275174754733023745004748837081;
-inv_value(268) -> 35111194040279607572837992007598139329;
-inv_value(269) -> 28088955232223686058270393606078511463;
-inv_value(270) -> 22471164185778948846616314884862809171;
-inv_value(271) -> 35953862697246318154586103815780494673;
-inv_value(272) -> 28763090157797054523668883052624395738;
-inv_value(273) -> 23010472126237643618935106442099516591;
-inv_value(274) -> 36816755401980229790296170307359226545;
-inv_value(275) -> 29453404321584183832236936245887381236;
-inv_value(276) -> 23562723457267347065789548996709904989;
-inv_value(277) -> 37700357531627755305263278394735847982;
-inv_value(278) -> 30160286025302204244210622715788678386;
-inv_value(279) -> 24128228820241763395368498172630942709;
-inv_value(280) -> 38605166112386821432589597076209508334;
-inv_value(281) -> 30884132889909457146071677660967606667;
-inv_value(282) -> 24707306311927565716857342128774085334;
-inv_value(283) -> 39531690099084105146971747406038536534;
-inv_value(284) -> 31625352079267284117577397924830829227;
-inv_value(285) -> 25300281663413827294061918339864663382;
-inv_value(286) -> 40480450661462123670499069343783461410;
-inv_value(287) -> 32384360529169698936399255475026769128;
-inv_value(288) -> 25907488423335759149119404380021415303;
-inv_value(289) -> 41451981477337214638591047008034264484;
-inv_value(290) -> 33161585181869771710872837606427411587;
-inv_value(291) -> 26529268145495817368698270085141929270;
-inv_value(292) -> 42446829032793307789917232136227086832;
-inv_value(293) -> 33957463226234646231933785708981669466;
-inv_value(294) -> 27165970580987716985547028567185335573;
-inv_value(295) -> 21732776464790173588437622853748268458;
-inv_value(296) -> 34772442343664277741500196565997229533;
-inv_value(297) -> 27817953874931422193200157252797783626;
-inv_value(298) -> 22254363099945137754560125802238226901;
-inv_value(299) -> 35606980959912220407296201283581163042;
-inv_value(300) -> 28485584767929776325836961026864930433;
-inv_value(301) -> 22788467814343821060669568821491944347;
-inv_value(302) -> 36461548502950113697071310114387110955;
-inv_value(303) -> 29169238802360090957657048091509688764;
-inv_value(304) -> 23335391041888072766125638473207751011;
-inv_value(305) -> 37336625667020916425801021557132401617;
-inv_value(306) -> 29869300533616733140640817245705921294;
-inv_value(307) -> 23895440426893386512512653796564737035;
-inv_value(308) -> 38232704683029418420020246074503579256;
-inv_value(309) -> 30586163746423534736016196859602863405;
-inv_value(310) -> 24468930997138827788812957487682290724;
-inv_value(311) -> 39150289595422124462100731980291665158;
-inv_value(312) -> 31320231676337699569680585584233332127;
-inv_value(313) -> 25056185341070159655744468467386665702;
-inv_value(314) -> 40089896545712255449191149547818665122;
-inv_value(315) -> 32071917236569804359352919638254932098;
-inv_value(316) -> 25657533789255843487482335710603945678;
-inv_value(317) -> 41052054062809349579971737136966313085;
-inv_value(318) -> 32841643250247479663977389709573050468;
-inv_value(319) -> 26273314600197983731181911767658440375;
-inv_value(320) -> 42037303360316773969891058828253504599;
-inv_value(321) -> 33629842688253419175912847062602803679;
-inv_value(322) -> 26903874150602735340730277650082242944;
-inv_value(323) -> 21523099320482188272584222120065794355;
-inv_value(324) -> 34436958912771501236134755392105270968;
-inv_value(325) -> 27549567130217200988907804313684216774;
-inv_value(326) -> 22039653704173760791126243450947373419;
-inv_value(327) -> 35263445926678017265801989521515797471;
-inv_value(328) -> 28210756741342413812641591617212637977;
-inv_value(329) -> 22568605393073931050113273293770110382;
-inv_value(330) -> 36109768628918289680181237270032176610;
-inv_value(331) -> 28887814903134631744144989816025741288;
-inv_value(332) -> 23110251922507705395315991852820593031;
-inv_value(333) -> 36976403076012328632505586964512948849;
-inv_value(334) -> 29581122460809862906004469571610359079;
-inv_value(335) -> 23664897968647890324803575657288287263;
-inv_value(336) -> 37863836749836624519685721051661259621;
-inv_value(337) -> 30291069399869299615748576841329007697;
-inv_value(338) -> 24232855519895439692598861473063206158;
-inv_value(339) -> 38772568831832703508158178356901129852;
-inv_value(340) -> 31018055065466162806526542685520903882;
-inv_value(341) -> 24814444052372930245221234148416723105;
-inv_value(_) -> error(function_clause).
diff --git a/lib/stdlib/src/lists.erl b/lib/stdlib/src/lists.erl
index 161b5634b2..d2cb5aab3c 100644
--- a/lib/stdlib/src/lists.erl
+++ b/lib/stdlib/src/lists.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -22,29 +22,57 @@
-compile({no_auto_import,[max/2]}).
-compile({no_auto_import,[min/2]}).
--export([append/2, append/1, subtract/2, reverse/1,
- nth/2, nthtail/2, prefix/2, suffix/2, droplast/1, last/1,
- seq/2, seq/3, sum/1, duplicate/2, min/1, max/1, sublist/2, sublist/3,
- delete/2,
- unzip/1, unzip3/1, zip/2, zip3/3, zipwith/3, zipwith3/4,
- sort/1, merge/1, merge/2, rmerge/2, merge3/3, rmerge3/3,
- usort/1, umerge/1, umerge3/3, umerge/2, rumerge3/3, rumerge/2,
- concat/1, flatten/1, flatten/2, flatlength/1,
- keydelete/3, keyreplace/4, keytake/3, keystore/4,
- keysort/2, keymerge/3, rkeymerge/3, rukeymerge/3,
- ukeysort/2, ukeymerge/3, keymap/3]).
-
--export([merge/3, rmerge/3, sort/2, umerge/3, rumerge/3, usort/2]).
-
--export([all/2,any/2,map/2,flatmap/2,foldl/3,foldr/3,filter/2,
- partition/2,zf/2,filtermap/2,
- mapfoldl/3,mapfoldr/3,foreach/2,takewhile/2,dropwhile/2,
- search/2, splitwith/2,split/2,
- join/2]).
-
-%%% BIFs
+%% BIFs (implemented in the runtime system).
-export([keyfind/3, keymember/3, keysearch/3, member/2, reverse/2]).
+%% Miscellaneous list functions that don't take funs as
+%% arguments. Please keep in alphabetical order.
+-export([append/1, append/2, concat/1,
+ delete/2, droplast/1, duplicate/2,
+ enumerate/1, enumerate/2,
+ flatlength/1, flatten/1, flatten/2,
+ join/2, last/1, min/1, max/1,
+ nth/2, nthtail/2,
+ prefix/2, reverse/1, seq/2, seq/3,
+ split/2, sublist/2, sublist/3,
+ subtract/2, suffix/2, sum/1,
+ uniq/1, unzip/1, unzip3/1,
+ zip/2, zip3/3]).
+
+%% Functions taking a list of tuples and a position within the tuple.
+-export([keydelete/3, keyreplace/4, keymap/3,
+ keytake/3, keystore/4]).
+
+%% Sort functions that operate on list of tuples.
+-export([keymerge/3, keysort/2, ukeymerge/3, ukeysort/2]).
+
+%% Sort and merge functions.
+-export([merge/1, merge/2, merge/3, merge3/3,
+ sort/1, sort/2,
+ umerge/1, umerge/2, umerge/3, umerge3/3,
+ usort/1, usort/2]).
+
+%% Functions that take fun arguments (high-order functions). Please
+%% keep in alphabetical order.
+-export([all/2, any/2, dropwhile/2,
+ filter/2, filtermap/2, flatmap/2,
+ foldl/3, foldr/3, foreach/2,
+ map/2, mapfoldl/3, mapfoldr/3,
+ partition/2, search/2,
+ splitwith/2, takewhile/2, uniq/2,
+ zipwith/3, zipwith3/4]).
+
+%% Undocumented, but used within Erlang/OTP.
+-export([zf/2]).
+
+%% Undocumented and unused merge functions for lists sorted in reverse
+%% order. They are exported so that the fundamental building blocks
+%% for the sort functions can be tested. (Removing them would save
+%% very little because they are thin wrappers calling helper functions
+%% used by the documented sort functions.)
+-export([rkeymerge/3, rmerge/2, rmerge/3, rmerge3/3,
+ rukeymerge/3, rumerge/2, rumerge/3, rumerge3/3]).
+
%% Shadowed by erl_bif_types: lists:keyfind/3
-spec keyfind(Key, N, TupleList) -> Tuple | false when
Key :: term(),
@@ -259,16 +287,16 @@ seq_loop(0, _, L) ->
Incr :: integer(),
Seq :: [integer()].
-seq(First, Last, Inc)
- when is_integer(First), is_integer(Last), is_integer(Inc) ->
- if
- Inc > 0, First - Inc =< Last;
- Inc < 0, First - Inc >= Last ->
- N = (Last - First + Inc) div Inc,
- seq_loop(N, Inc*(N-1)+First, Inc, []);
- Inc =:= 0, First =:= Last ->
- seq_loop(1, First, Inc, [])
- end.
+seq(First, Last, Inc)
+ when is_integer(First), is_integer(Last), is_integer(Inc),
+ (Inc > 0 andalso First - Inc =< Last) orelse
+ (Inc < 0 andalso First - Inc >= Last) ->
+ N = (Last - First + Inc) div Inc,
+ seq_loop(N, Inc * (N - 1) + First, Inc, []);
+seq(Same, Same, 0) when is_integer(Same) ->
+ [Same];
+seq(First, Last, Inc) ->
+ erlang:error(badarg, [First, Last, Inc], [{error_info, #{module => erl_stdlib_errors}}]).
seq_loop(N, X, D, L) when N >= 4 ->
Y = X-D, Z = Y-D, W = Z-D,
@@ -957,6 +985,27 @@ keymap(Fun, Index, [Tup|Tail]) ->
keymap(Fun, Index, []) when is_integer(Index), Index >= 1,
is_function(Fun, 1) -> [].
+-spec enumerate(List1) -> List2 when
+ List1 :: [T],
+ List2 :: [{Index, T}],
+ Index :: integer(),
+ T :: term().
+enumerate(List1) when is_list(List1) ->
+ enumerate_1(1, List1).
+
+-spec enumerate(Index, List1) -> List2 when
+ List1 :: [T],
+ List2 :: [{Index, T}],
+ Index :: integer(),
+ T :: term().
+enumerate(Index, List1) when is_integer(Index), is_list(List1) ->
+ enumerate_1(Index, List1).
+
+enumerate_1(Index, [H|T]) ->
+ [{Index, H}|enumerate_1(Index + 1, T)];
+enumerate_1(_Index, []) ->
+ [].
+
%%% Suggestion from OTP-2948: sort and merge with Fun.
-spec sort(Fun, List1) -> List2 when
@@ -1213,24 +1262,46 @@ rumerge(T1, [H2 | T2]) ->
List :: [T],
T :: term().
-all(Pred, [Hd|Tail]) ->
+all(Pred, List) when is_function(Pred, 1) ->
+ case List of
+ [Hd | Tail] ->
+ case Pred(Hd) of
+ true -> all_1(Pred, Tail);
+ false -> false
+ end;
+ [] -> true
+ end.
+
+all_1(Pred, [Hd | Tail]) ->
case Pred(Hd) of
- true -> all(Pred, Tail);
- false -> false
+ true -> all_1(Pred, Tail);
+ false -> false
end;
-all(Pred, []) when is_function(Pred, 1) -> true.
+all_1(_Pred, []) ->
+ true.
-spec any(Pred, List) -> boolean() when
Pred :: fun((Elem :: T) -> boolean()),
List :: [T],
T :: term().
-any(Pred, [Hd|Tail]) ->
+any(Pred, List) when is_function(Pred, 1) ->
+ case List of
+ [Hd | Tail] ->
+ case Pred(Hd) of
+ true -> true;
+ false -> any_1(Pred, Tail)
+ end;
+ [] -> false
+ end.
+
+any_1(Pred, [Hd | Tail]) ->
case Pred(Hd) of
- true -> true;
- false -> any(Pred, Tail)
+ true -> true;
+ false -> any_1(Pred, Tail)
end;
-any(Pred, []) when is_function(Pred, 1) -> false.
+any_1(_Pred, []) ->
+ false.
-spec map(Fun, List1) -> List2 when
Fun :: fun((A) -> B),
@@ -1239,9 +1310,16 @@ any(Pred, []) when is_function(Pred, 1) -> false.
A :: term(),
B :: term().
-map(F, [H|T]) ->
- [F(H)|map(F, T)];
-map(F, []) when is_function(F, 1) -> [].
+map(F, List) when is_function(F, 1) ->
+ case List of
+ [Hd | Tail] -> [F(Hd) | map_1(F, Tail)];
+ [] -> []
+ end.
+
+map_1(F, [Hd | Tail]) ->
+ [F(Hd) | map_1(F, Tail)];
+map_1(_F, []) ->
+ [].
-spec flatmap(Fun, List1) -> List2 when
Fun :: fun((A) -> [B]),
@@ -1250,9 +1328,13 @@ map(F, []) when is_function(F, 1) -> [].
A :: term(),
B :: term().
-flatmap(F, [Hd|Tail]) ->
- F(Hd) ++ flatmap(F, Tail);
-flatmap(F, []) when is_function(F, 1) -> [].
+flatmap(F, List) when is_function(F, 1) ->
+ flatmap_1(F, List).
+
+flatmap_1(F, [Hd | Tail]) ->
+ F(Hd) ++ flatmap_1(F, Tail);
+flatmap_1(_F, []) ->
+ [].
-spec foldl(Fun, Acc0, List) -> Acc1 when
Fun :: fun((Elem :: T, AccIn) -> AccOut),
@@ -1263,9 +1345,16 @@ flatmap(F, []) when is_function(F, 1) -> [].
List :: [T],
T :: term().
-foldl(F, Accu, [Hd|Tail]) ->
- foldl(F, F(Hd, Accu), Tail);
-foldl(F, Accu, []) when is_function(F, 2) -> Accu.
+foldl(F, Accu, List) when is_function(F, 2) ->
+ case List of
+ [Hd | Tail] -> foldl_1(F, F(Hd, Accu), Tail);
+ [] -> Accu
+ end.
+
+foldl_1(F, Accu, [Hd | Tail]) ->
+ foldl_1(F, F(Hd, Accu), Tail);
+foldl_1(_F, Accu, []) ->
+ Accu.
-spec foldr(Fun, Acc0, List) -> Acc1 when
Fun :: fun((Elem :: T, AccIn) -> AccOut),
@@ -1276,9 +1365,13 @@ foldl(F, Accu, []) when is_function(F, 2) -> Accu.
List :: [T],
T :: term().
-foldr(F, Accu, [Hd|Tail]) ->
- F(Hd, foldr(F, Accu, Tail));
-foldr(F, Accu, []) when is_function(F, 2) -> Accu.
+foldr(F, Accu, List) when is_function(F, 2) ->
+ foldr_1(F, Accu, List).
+
+foldr_1(F, Accu, [Hd | Tail]) ->
+ F(Hd, foldr_1(F, Accu, Tail));
+foldr_1(_F, Accu, []) ->
+ Accu.
-spec filter(Pred, List1) -> List2 when
Pred :: fun((Elem :: T) -> boolean()),
@@ -1299,15 +1392,15 @@ filter(Pred, List) when is_function(Pred, 1) ->
NotSatisfying :: [T],
T :: term().
-partition(Pred, L) ->
- partition(Pred, L, [], []).
+partition(Pred, L) when is_function(Pred, 1) ->
+ partition_1(Pred, L, [], []).
-partition(Pred, [H | T], As, Bs) ->
+partition_1(Pred, [H | T], As, Bs) ->
case Pred(H) of
- true -> partition(Pred, T, [H | As], Bs);
- false -> partition(Pred, T, As, [H | Bs])
+ true -> partition_1(Pred, T, [H | As], Bs);
+ false -> partition_1(Pred, T, As, [H | Bs])
end;
-partition(Pred, [], As, Bs) when is_function(Pred, 1) ->
+partition_1(_Pred, [], As, Bs) ->
{reverse(As), reverse(Bs)}.
-spec filtermap(Fun, List1) -> List2 when
@@ -1317,16 +1410,20 @@ partition(Pred, [], As, Bs) when is_function(Pred, 1) ->
Elem :: term(),
Value :: term().
-filtermap(F, [Hd|Tail]) ->
+filtermap(F, List) when is_function(F, 1) ->
+ filtermap_1(F, List).
+
+filtermap_1(F, [Hd|Tail]) ->
case F(Hd) of
- true ->
- [Hd|filtermap(F, Tail)];
- {true,Val} ->
- [Val|filtermap(F, Tail)];
- false ->
- filtermap(F, Tail)
+ true ->
+ [Hd | filtermap_1(F, Tail)];
+ {true,Val} ->
+ [Val | filtermap_1(F, Tail)];
+ false ->
+ filtermap_1(F, Tail)
end;
-filtermap(F, []) when is_function(F, 1) -> [].
+filtermap_1(_F, []) ->
+ [].
-spec zf(fun((T) -> boolean() | {'true', X}), [T]) -> [(T | X)].
@@ -1338,10 +1435,14 @@ zf(F, L) ->
List :: [T],
T :: term().
-foreach(F, [Hd|Tail]) ->
+foreach(F, List) when is_function(F, 1) ->
+ foreach_1(F, List).
+
+foreach_1(F, [Hd | Tail]) ->
F(Hd),
- foreach(F, Tail);
-foreach(F, []) when is_function(F, 1) -> ok.
+ foreach_1(F, Tail);
+foreach_1(_F, []) ->
+ ok.
-spec mapfoldl(Fun, Acc0, List1) -> {List2, Acc1} when
Fun :: fun((A, AccIn) -> {B, AccOut}),
@@ -1354,11 +1455,15 @@ foreach(F, []) when is_function(F, 1) -> ok.
A :: term(),
B :: term().
-mapfoldl(F, Accu0, [Hd|Tail]) ->
- {R,Accu1} = F(Hd, Accu0),
- {Rs,Accu2} = mapfoldl(F, Accu1, Tail),
- {[R|Rs],Accu2};
-mapfoldl(F, Accu, []) when is_function(F, 2) -> {[],Accu}.
+mapfoldl(F, Accu, List) when is_function(F, 2) ->
+ mapfoldl_1(F, Accu, List).
+
+mapfoldl_1(F, Accu0, [Hd | Tail]) ->
+ {R, Accu1} = F(Hd, Accu0),
+ {Rs, Accu2} = mapfoldl_1(F, Accu1, Tail),
+ {[R | Rs], Accu2};
+mapfoldl_1(_F, Accu, []) ->
+ {[], Accu}.
-spec mapfoldr(Fun, Acc0, List1) -> {List2, Acc1} when
Fun :: fun((A, AccIn) -> {B, AccOut}),
@@ -1371,11 +1476,15 @@ mapfoldl(F, Accu, []) when is_function(F, 2) -> {[],Accu}.
A :: term(),
B :: term().
-mapfoldr(F, Accu0, [Hd|Tail]) ->
- {Rs,Accu1} = mapfoldr(F, Accu0, Tail),
- {R,Accu2} = F(Hd, Accu1),
- {[R|Rs],Accu2};
-mapfoldr(F, Accu, []) when is_function(F, 2) -> {[],Accu}.
+mapfoldr(F, Accu, List) when is_function(F, 2) ->
+ mapfoldr_1(F, Accu, List).
+
+mapfoldr_1(F, Accu0, [Hd|Tail]) ->
+ {Rs, Accu1} = mapfoldr_1(F, Accu0, Tail),
+ {R, Accu2} = F(Hd, Accu1),
+ {[R | Rs], Accu2};
+mapfoldr_1(_F, Accu, []) ->
+ {[], Accu}.
-spec takewhile(Pred, List1) -> List2 when
Pred :: fun((Elem :: T) -> boolean()),
@@ -1383,12 +1492,16 @@ mapfoldr(F, Accu, []) when is_function(F, 2) -> {[],Accu}.
List2 :: [T],
T :: term().
-takewhile(Pred, [Hd|Tail]) ->
+takewhile(Pred, List) when is_function(Pred, 1) ->
+ takewhile_1(Pred, List).
+
+takewhile_1(Pred, [Hd | Tail]) ->
case Pred(Hd) of
- true -> [Hd|takewhile(Pred, Tail)];
- false -> []
+ true -> [Hd | takewhile_1(Pred, Tail)];
+ false -> []
end;
-takewhile(Pred, []) when is_function(Pred, 1) -> [].
+takewhile_1(_Pred, []) ->
+ [].
-spec dropwhile(Pred, List1) -> List2 when
Pred :: fun((Elem :: T) -> boolean()),
@@ -1396,24 +1509,31 @@ takewhile(Pred, []) when is_function(Pred, 1) -> [].
List2 :: [T],
T :: term().
-dropwhile(Pred, [Hd|Tail]=Rest) ->
+dropwhile(Pred, List) when is_function(Pred, 1) ->
+ dropwhile_1(Pred, List).
+
+dropwhile_1(Pred, [Hd | Tail]=Rest) ->
case Pred(Hd) of
- true -> dropwhile(Pred, Tail);
- false -> Rest
+ true -> dropwhile_1(Pred, Tail);
+ false -> Rest
end;
-dropwhile(Pred, []) when is_function(Pred, 1) -> [].
+dropwhile_1(_Pred, []) ->
+ [].
-spec search(Pred, List) -> {value, Value} | false when
Pred :: fun((T) -> boolean()),
List :: [T],
Value :: T.
-search(Pred, [Hd|Tail]) ->
+search(Pred, List) when is_function(Pred, 1) ->
+ search_1(Pred, List).
+
+search_1(Pred, [Hd | Tail]) ->
case Pred(Hd) of
true -> {value, Hd};
- false -> search(Pred, Tail)
+ false -> search_1(Pred, Tail)
end;
-search(Pred, []) when is_function(Pred, 1) ->
+search_1(_Pred, []) ->
false.
-spec splitwith(Pred, List) -> {List1, List2} when
@@ -1424,14 +1544,14 @@ search(Pred, []) when is_function(Pred, 1) ->
T :: term().
splitwith(Pred, List) when is_function(Pred, 1) ->
- splitwith(Pred, List, []).
+ splitwith_1(Pred, List, []).
-splitwith(Pred, [Hd|Tail], Taken) ->
+splitwith_1(Pred, [Hd|Tail], Taken) ->
case Pred(Hd) of
- true -> splitwith(Pred, Tail, [Hd|Taken]);
+ true -> splitwith_1(Pred, Tail, [Hd|Taken]);
false -> {reverse(Taken), [Hd|Tail]}
end;
-splitwith(Pred, [], Taken) when is_function(Pred, 1) ->
+splitwith_1(_Pred, [], Taken) ->
{reverse(Taken),[]}.
-spec split(N, List1) -> {List2, List3} when
@@ -2855,3 +2975,44 @@ rufmerge2_2(H1, T1, Fun, [], M, H2M) ->
lists:reverse(T1, [H1, H2M | M])
end.
+%% uniq/1: return a new list with the unique elements of the given list
+
+-spec uniq(List1) -> List2 when
+ List1 :: [T],
+ List2 :: [T],
+ T :: term().
+
+uniq(L) ->
+ uniq_1(L, #{}).
+
+uniq_1([X | Xs], M) ->
+ case is_map_key(X, M) of
+ true ->
+ uniq_1(Xs, M);
+ false ->
+ [X | uniq_1(Xs, M#{X => true})]
+ end;
+uniq_1([], _) ->
+ [].
+
+%% uniq/2: return a new list with the unique elements of the given list using a function key
+
+-spec uniq(Fun, List1) -> List2 when
+ Fun :: fun((T) -> any()),
+ List1 :: [T],
+ List2 :: [T],
+ T :: term().
+
+uniq(F, L) when is_function(F, 1) ->
+ uniq_2(L, F, #{}).
+
+uniq_2([X | Xs], F, M) ->
+ Key = F(X),
+ case is_map_key(Key, M) of
+ true ->
+ uniq_2(Xs, F, M);
+ false ->
+ [X | uniq_2(Xs, F, M#{Key => true})]
+ end;
+uniq_2([], _, _) ->
+ [].
diff --git a/lib/stdlib/src/maps.erl b/lib/stdlib/src/maps.erl
index e6192eb22b..c7107031fb 100644
--- a/lib/stdlib/src/maps.erl
+++ b/lib/stdlib/src/maps.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,7 +26,8 @@
without/2, with/2,
iterator/1, next/1,
intersect/2, intersect_with/3,
- merge_with/3]).
+ merge_with/3,
+ groups_from_list/2, groups_from_list/3]).
%% BIFs
-export([get/2, find/2, from_list/1, from_keys/2,
@@ -497,6 +498,69 @@ with_1([K|Ks], Map) ->
end;
with_1([], _Map) -> [].
+%% groups_from_list/2 & groups_from_list/3
+
+-spec groups_from_list(Fun, List) -> MapOut when
+ Fun :: fun((Elem :: T) -> Selected),
+ MapOut :: #{Selected => List},
+ Selected :: term(),
+ List :: [T],
+ T :: term().
+
+groups_from_list(Fun, List0) when is_function(Fun, 1) ->
+ try lists:reverse(List0) of
+ List ->
+ groups_from_list_1(Fun, List, #{})
+ catch
+ error:_ ->
+ badarg_with_info([Fun, List0])
+ end;
+groups_from_list(Fun, List) ->
+ badarg_with_info([Fun, List]).
+
+groups_from_list_1(Fun, [H | Tail], Acc) ->
+ K = Fun(H),
+ NewAcc = case Acc of
+ #{K := Vs} -> Acc#{K := [H | Vs]};
+ #{} -> Acc#{K => [H]}
+ end,
+ groups_from_list_1(Fun, Tail, NewAcc);
+groups_from_list_1(_Fun, [], Acc) ->
+ Acc.
+
+-spec groups_from_list(Fun, ValueFun, List) -> MapOut when
+ Fun :: fun((Elem :: T) -> Key),
+ ValueFun :: fun((Elem :: T) -> ValOut),
+ MapOut :: #{Key := ListOut},
+ Key :: term(),
+ ValOut :: term(),
+ List :: [T],
+ ListOut :: [ValOut],
+ T :: term().
+
+groups_from_list(Fun, ValueFun, List0) when is_function(Fun, 1),
+ is_function(ValueFun, 1) ->
+ try lists:reverse(List0) of
+ List ->
+ groups_from_list_2(Fun, ValueFun, List, #{})
+ catch
+ error:_ ->
+ badarg_with_info([Fun, ValueFun, List0])
+ end;
+groups_from_list(Fun, ValueFun, List) ->
+ badarg_with_info([Fun, ValueFun, List]).
+
+groups_from_list_2(Fun, ValueFun, [H | Tail], Acc) ->
+ K = Fun(H),
+ V = ValueFun(H),
+ NewAcc = case Acc of
+ #{K := Vs} -> Acc#{K := [V | Vs]};
+ #{} -> Acc#{K => [V]}
+ end,
+ groups_from_list_2(Fun, ValueFun, Tail, NewAcc);
+groups_from_list_2(_Fun, _ValueFun, [], Acc) ->
+ Acc.
+
error_type(M) when is_map(M) -> badarg;
error_type(V) -> {badmap, V}.
diff --git a/lib/stdlib/src/ms_transform.erl b/lib/stdlib/src/ms_transform.erl
index 890267b439..dde8e572a3 100644
--- a/lib/stdlib/src/ms_transform.erl
+++ b/lib/stdlib/src/ms_transform.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -756,7 +756,12 @@ tg({bin_element,Anno,X,Y,Z},B) ->
tg({bin,Anno,List},B) ->
{bin,Anno,[tg(X,B) || X <- List]};
-
+
+tg({map_field_assoc, Anno, Field, Value}, B) ->
+ {map_field_assoc, Anno, tg(Field, B), tg(Value, B)};
+tg({map, Anno, List}, B) ->
+ {map, Anno, [tg(X, B) || X <- List]};
+
tg(T,B) when is_tuple(T), tuple_size(T) >= 2 ->
Element = element(1,T),
Anno = element(2,T),
@@ -858,6 +863,9 @@ th({var,Anno,Name},B,OB) ->
Trans ->
{{atom,Anno,Trans},B}
end;
+th({map_field_exact,Anno,Field,Value},B,OB) ->
+ {[NField, NValue], NB} = th([Field, Value], B, OB),
+ {{map_field_assoc,Anno,NField,NValue}, NB};
th([H|T],B,OB) ->
{NH,NB} = th(H,B,OB),
{NT,NNB} = th(T,NB,OB),
@@ -974,8 +982,11 @@ real_guard_function(node,1) -> true;
real_guard_function(round,1) -> true;
real_guard_function(size,1) -> true;
real_guard_function(bit_size,1) -> true;
+real_guard_function(byte_size,1) -> true;
real_guard_function(map_size,1) -> true;
real_guard_function(map_get,2) -> true;
+real_guard_function(binary_part,2) -> true;
+real_guard_function(binary_part,3) -> true;
real_guard_function(tl,1) -> true;
real_guard_function(trunc,1) -> true;
real_guard_function(self,0) -> true;
@@ -1123,7 +1134,7 @@ normalise({bin,_,Fs}) ->
eval_bits:expr_grp(Fs, [],
fun(E, _) ->
{value, normalise(E), []}
- end, [], true),
+ end),
B;
normalise({cons,_,Head,Tail}) ->
[normalise(Head)|normalise(Tail)];
@@ -1131,12 +1142,11 @@ normalise({op,_,'++',A,B}) ->
normalise(A) ++ normalise(B);
normalise({tuple,_,Args}) ->
list_to_tuple(normalise_list(Args));
-normalise({map,_,Pairs0}) ->
- Pairs1 = lists:map(fun ({map_field_exact,_,K,V}) ->
- {normalise(K),normalise(V)}
- end,
- Pairs0),
- maps:from_list(Pairs1);
+normalise({map,_,Pairs}) ->
+ maps:from_list(lists:map(fun
+ %% only allow '=>'
+ ({map_field_assoc,_,K,V}) -> {normalise(K),normalise(V)}
+ end, Pairs));
%% Special case for unary +/-.
normalise({op,_,'+',{char,_,I}}) -> I;
normalise({op,_,'+',{integer,_,I}}) -> I;
diff --git a/lib/stdlib/src/otp_internal.erl b/lib/stdlib/src/otp_internal.erl
index 86196d47d1..49fb28ec3a 100644
--- a/lib/stdlib/src/otp_internal.erl
+++ b/lib/stdlib/src/otp_internal.erl
@@ -35,6 +35,10 @@ obsolete(code, is_module_native, 1) ->
{deprecated, "HiPE has been removed", "OTP 26"};
obsolete(code, rehash, 0) ->
{deprecated, "the code path cache feature has been removed", "OTP 26"};
+obsolete(crypto, crypto_dyn_iv_init, 3) ->
+ {deprecated, "see the documentation for details", "OTP 27"};
+obsolete(crypto, crypto_dyn_iv_update, 3) ->
+ {deprecated, "see the documentation for details", "OTP 27"};
obsolete(crypto, rand_uniform, 2) ->
{deprecated, "use rand:uniform/1 instead"};
obsolete(disk_log, accessible_logs, 0) ->
@@ -54,17 +58,15 @@ obsolete(ftp, start_service, 1) ->
obsolete(ftp, stop_service, 1) ->
{deprecated, "use ftp:close/1 instead", "OTP 26"};
obsolete(http_uri, decode, 1) ->
- {deprecated, "use uri_string functions instead", "OTP 25"};
+ {deprecated, "use uri_string:unquote function instead", "OTP 26"};
obsolete(http_uri, encode, 1) ->
- {deprecated, "use uri_string functions instead", "OTP 25"};
-obsolete(http_uri, parse, 1) ->
- {deprecated, "use uri_string functions instead", "OTP 25"};
-obsolete(http_uri, parse, 2) ->
- {deprecated, "use uri_string functions instead", "OTP 25"};
-obsolete(http_uri, scheme_defaults, 0) ->
- {deprecated, "use uri_string functions instead", "OTP 25"};
+ {deprecated, "use uri_string:quote function instead", "OTP 26"};
obsolete(httpd, parse_query, 1) ->
{deprecated, "use uri_string:dissect_query/1 instead"};
+obsolete(httpd_util, decode_hex, 1) ->
+ {deprecated, "use uri_string:unquote function instead", "OTP 26"};
+obsolete(httpd_util, encode_hex, 1) ->
+ {deprecated, "use uri_string:quote function instead", "OTP 26"};
obsolete(httpd_util, flatlength, 1) ->
{deprecated, "use erlang:iolist_size/1 instead", "OTP 26"};
obsolete(httpd_util, hexlist_to_integer, 1) ->
@@ -83,84 +85,10 @@ obsolete(net, cast, 4) ->
{deprecated, "use rpc:cast/4 instead"};
obsolete(net, ping, 1) ->
{deprecated, "use net_adm:ping/1 instead"};
-obsolete(net, relay, 1) ->
- {deprecated, "use slave:relay/1 instead"};
obsolete(net, sleep, 1) ->
{deprecated, "use 'receive after T -> ok end' instead"};
-obsolete(public_key, ssh_decode, 2) ->
- {deprecated, "use ssh_file:decode/2 instead", "OTP 26"};
-obsolete(public_key, ssh_encode, 2) ->
- {deprecated, "use ssh_file:encode/2 instead", "OTP 26"};
-obsolete(public_key, ssh_hostkey_fingerprint, 1) ->
- {deprecated, "use ssh:hostkey_fingerprint/1 instead", "OTP 26"};
-obsolete(public_key, ssh_hostkey_fingerprint, 2) ->
- {deprecated, "use ssh:hostkey_fingerprint/2 instead", "OTP 26"};
obsolete(queue, lait, 1) ->
{deprecated, "use queue:liat/1 instead"};
-obsolete(snmpm, async_get, 3) ->
- {deprecated, "use snmpm:async_get2/3 instead.", "OTP 25"};
-obsolete(snmpm, async_get, 4) ->
- {deprecated, "use snmpm:async_get2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_get, 5) ->
- {deprecated, "use snmpm:async_get2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_get, 6) ->
- {deprecated, "use snmpm:async_get2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_get_bulk, 5) ->
- {deprecated, "use snmpm:async_get_bulk2/5 instead.", "OTP 25"};
-obsolete(snmpm, async_get_bulk, 6) ->
- {deprecated, "use snmpm:async_get_bulk2/6 instead.", "OTP 25"};
-obsolete(snmpm, async_get_bulk, 7) ->
- {deprecated, "use snmpm:async_get_bulk2/6 instead.", "OTP 25"};
-obsolete(snmpm, async_get_bulk, 8) ->
- {deprecated, "use snmpm:async_get_bulk2/6 instead.", "OTP 25"};
-obsolete(snmpm, async_get_next, 3) ->
- {deprecated, "use snmpm:async_get_next2/3 instead.", "OTP 25"};
-obsolete(snmpm, async_get_next, 4) ->
- {deprecated, "use snmpm:async_get_next2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_get_next, 5) ->
- {deprecated, "use snmpm:async_get_next2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_get_next, 6) ->
- {deprecated, "use snmpm:async_get_next2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_set, 3) ->
- {deprecated, "use snmpm:async_set2/3 instead.", "OTP 25"};
-obsolete(snmpm, async_set, 4) ->
- {deprecated, "use snmpm:async_set2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_set, 5) ->
- {deprecated, "use snmpm:async_set2/4 instead.", "OTP 25"};
-obsolete(snmpm, async_set, 6) ->
- {deprecated, "use snmpm:async_set2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_get, 3) ->
- {deprecated, "use snmpm:sync_get2/3 instead.", "OTP 25"};
-obsolete(snmpm, sync_get, 4) ->
- {deprecated, "use snmpm:sync_get2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_get, 5) ->
- {deprecated, "use snmpm:sync_get2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_get, 6) ->
- {deprecated, "use snmpm:sync_get2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_bulk, 5) ->
- {deprecated, "use snmpm:sync_get_bulk2/5 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_bulk, 6) ->
- {deprecated, "use snmpm:sync_get_bulk2/6 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_bulk, 7) ->
- {deprecated, "use snmpm:sync_get_bulk2/6 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_bulk, 8) ->
- {deprecated, "use snmpm:sync_get_bulk2/6 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_next, 3) ->
- {deprecated, "use snmpm:sync_get_next2/3 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_next, 4) ->
- {deprecated, "use snmpm:sync_get_next2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_next, 5) ->
- {deprecated, "use snmpm:sync_get_next2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_get_next, 6) ->
- {deprecated, "use snmpm:sync_get_next2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_set, 3) ->
- {deprecated, "use snmpm:sync_set2/3 instead.", "OTP 25"};
-obsolete(snmpm, sync_set, 4) ->
- {deprecated, "use snmpm:sync_set2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_set, 5) ->
- {deprecated, "use snmpm:sync_set2/4 instead.", "OTP 25"};
-obsolete(snmpm, sync_set, 6) ->
- {deprecated, "use snmpm:sync_set2/4 instead.", "OTP 25"};
obsolete(sys, get_debug, 3) ->
{deprecated, "incorrectly documented and only for internal use. Can often be replaced with sys:get_log/1"};
obsolete(wxCalendarCtrl, enableYearChange, 1) ->
@@ -243,18 +171,34 @@ obsolete(erlang, get_stacktrace, 0) ->
{removed, "use the new try/catch syntax for retrieving the stack backtrace"};
obsolete(erlang, hash, 2) ->
{removed, "use erlang:phash2/2 instead"};
+obsolete(http_uri, parse, 1) ->
+ {removed, "use uri_string functions instead"};
+obsolete(http_uri, parse, 2) ->
+ {removed, "use uri_string functions instead"};
+obsolete(http_uri, scheme_defaults, 0) ->
+ {removed, "use uri_string functions instead"};
obsolete(httpd_conf, check_enum, 2) ->
{removed, "use lists:member/2 instead"};
obsolete(httpd_conf, clean, 1) ->
- {removed, "use sting:strip/1 instead or possibly the re module"};
+ {removed, "use string:strip/1 instead or possibly the re module"};
obsolete(httpd_conf, custom_clean, 3) ->
- {removed, "use sting:strip/1 instead or possibly the re module"};
+ {removed, "use string:strip/1 instead or possibly the re module"};
obsolete(httpd_conf, is_directory, 1) ->
{removed, "use filelib:is_dir/1 instead"};
obsolete(httpd_conf, is_file, 1) ->
{removed, "use filelib:is_file/1 instead"};
obsolete(httpd_conf, make_integer, 1) ->
{removed, "use erlang:list_to_integer/1 instead"};
+obsolete(net, relay, 1) ->
+ {removed, "use fun Relay(Pid) -> receive X -> Pid ! X end, Relay(Pid) instead"};
+obsolete(public_key, ssh_decode, 2) ->
+ {removed, "use ssh_file:decode/2 instead"};
+obsolete(public_key, ssh_encode, 2) ->
+ {removed, "use ssh_file:encode/2 instead"};
+obsolete(public_key, ssh_hostkey_fingerprint, 1) ->
+ {removed, "use ssh:hostkey_fingerprint/1 instead"};
+obsolete(public_key, ssh_hostkey_fingerprint, 2) ->
+ {removed, "use ssh:hostkey_fingerprint/2 instead"};
obsolete(rpc, safe_multi_server_call, 2) ->
{removed, "use rpc:multi_server_call/2 instead"};
obsolete(rpc, safe_multi_server_call, 3) ->
@@ -285,10 +229,16 @@ obsolete(filename, find_src, _) ->
{removed, "use filelib:find_source/1,3 instead"};
obsolete(ssl, ssl_accept, _) ->
{removed, "use ssl_handshake/1,2,3 instead"};
+obsolete(ct_slave, _, _) ->
+ {deprecated, "use ?CT_PEER(), or the 'peer' module instead", "OTP 27"};
+obsolete(erts_alloc_config, _, _) ->
+ {deprecated, "this module will be removed in OTP 26.0. See the documentation for details", "OTP 26"};
obsolete(gen_fsm, _, _) ->
{deprecated, "use the 'gen_statem' module instead"};
obsolete(random, _, _) ->
{deprecated, "use the 'rand' module instead"};
+obsolete(slave, _, _) ->
+ {deprecated, "use the 'peer' module instead", "OTP 27"};
obsolete(os_mon_mib, _, _) ->
{removed, "this module was removed in OTP 22.0"};
obsolete(pg2, _, _) ->
@@ -314,5 +264,19 @@ obsolete_type(erl_scan, line, 0) ->
{removed, "use erl_anno:line() instead"};
obsolete_type(erl_scan, location, 0) ->
{removed, "use erl_anno:location() instead"};
+obsolete_type(http_uri, default_scheme_port_number, 0) ->
+ {removed, "use uri_string instead"};
+obsolete_type(http_uri, fragment, 0) ->
+ {removed, "use uri_string instead"};
+obsolete_type(http_uri, host, 0) ->
+ {removed, "use uri_string instead"};
+obsolete_type(http_uri, path, 0) ->
+ {removed, "use uri_string instead"};
+obsolete_type(http_uri, query, 0) ->
+ {removed, "use uri_string instead"};
+obsolete_type(http_uri, scheme, 0) ->
+ {removed, "use uri_string instead"};
+obsolete_type(http_uri, user_info, 0) ->
+ {removed, "use uri_string instead"};
obsolete_type(_,_,_) -> no.
diff --git a/lib/stdlib/src/peer.erl b/lib/stdlib/src/peer.erl
new file mode 100644
index 0000000000..1c04b03b10
--- /dev/null
+++ b/lib/stdlib/src/peer.erl
@@ -0,0 +1,1050 @@
+%%
+%% Copyright WhatsApp Inc. and its affiliates. All rights reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+
+%% @doc
+%% Controller for additional Erlang node running on the same host,
+%% or in a different container/host (e.g. Docker).
+%%
+%% == Terms ==
+%% Origin node - Erlang VM instance that spawns additional nodes.
+%% Peer node - a node spawned by the origin.
+%% Control process - a process running on origin node, if it terminates,
+%% peer node terminates too.
+%% Control connection - a connection between origin and peer, can be
+%% ether Erlang Distribution connection, or alternative one.
+%%
+%% I/O is forwarded from peer node to origin via control connection.
+%%
+%% When standard_io is used as alternative connection, peer node
+%% uses standard out to multiplex console output and control sequences.
+%% Characters in range of 192-255 are reserved for control sequences,
+%% see encode_port_data for details. If peer node attempts to print
+%% characters in this range, an controlling process on the origin
+%% node may terminate with an error (because CRC check will fail).
+%%
+%% Alternative connection via TCP does not have that limitation, but
+%% it also does not redirect console I/O from the peer node.
+%% @end
+-module(peer).
+-author("maximfca@gmail.com").
+
+%% API
+-export([
+ start_link/0,
+ start_link/1,
+ start/1,
+ stop/1,
+
+ random_name/0,
+ random_name/1,
+
+ get_state/1,
+
+ call/4,
+ call/5,
+ cast/4,
+ send/3
+ ]).
+
+%% Could be gen_statem too, with peer_state, but most interactions
+%% are anyway available in all states.
+-behaviour(gen_server).
+
+%% gen_server callbacks
+-export([
+ init/1,
+ handle_call/3,
+ handle_cast/2,
+ handle_info/2,
+ terminate/2
+ ]).
+
+%% Internal exports for stdin/stdout, non-distribution RPC, and tests
+-export([
+ start/0 %% this function must be named "start", requirement for user.erl
+ ]).
+
+%% Origin node will listen to the specified port (port 0 is auto-select),
+%% or specified IP/Port, and expect peer node to connect to this port.
+-type connection() ::
+ Port :: 0..65535 |
+ {inet:ip_address(), 0..65535} |
+ standard_io.
+
+%% Specification for boot waiting
+-type wait_boot() ::
+ timeout() | %% wait for node to boot (default, 15 sec),
+ {pid(), Tag :: term()} | %% do not wait, send {Tag, {started, node(), pid()}} to Pid when node boots
+ false. %% don't wait, don't notify
+
+-type exec() ::
+ file:name() | %% path to "erl" (default is init:get_argument(progname))
+ {file:name(), [string()]}. %% SSH support: {"/usr/bin/ssh", ["account@host_b", "/usr/bin/erl"]}
+
+%% Peer node start options
+-type start_options() ::
+ #{
+ name => atom() | string(), %% node name (part before @), if not defined, peer
+ %% starts in non-distributed mode (requires alternative connection)
+ longnames => boolean(), %% long/short names (default is net_kernel:longnames(), and shortnames)
+ host => string(), %% force hostname (when not specified, actual peer node hostname is used)
+ peer_down => stop | continue | crash, %% stop (default): when peer terminates, peer control process
+ %% stops normally regardless of the reason.
+ %% continue: when peer terminates, peer control process stays up
+ %% saving exit reason in the state
+ %% crash: when peer terminates, origin process
+ %% terminates with underlying reason
+ exec => exec(), %% path to executable, or SSH/Docker support
+ connection => connection(), %% alternative connection specification
+ args => [string()], %% additional command line parameters to append
+ env => [{string(), string()}], %% additional environment variables
+ wait_boot => wait_boot(), %% default is synchronous start with 15 sec timeout
+ shutdown => close | %% close supervision channel
+ halt | %% The default... %% stop node using erlang:halt() wait default timeout for nodedown
+ {halt, disconnect_timeout()} | %% stop node using erlang:halt() wait timeout() for nodedown
+ disconnect_timeout() %% send init:stop() request and wait up to specified timeout for nodedown
+ }.
+
+%% Peer node states
+-type peer_state() :: booting | running | {down, Reason :: term()}.
+
+-export_type([
+ start_options/0,
+ peer_state/0,
+ exec/0,
+ disconnect_timeout/0
+ ]).
+
+%% Maximum integer timeout value in a receive...
+-define (MAX_INT_TIMEOUT, 4294967295).
+
+%% Default time we wait for distributed connection to be removed,
+%% when shutdown type is halt, before we disconnect from the node...
+-define (DEFAULT_HALT_DISCONNECT_TIMEOUT, 5000).
+
+%% Minimum time we wait for distributed connection to be removed,
+%% before we disconnect from the node (except in the shutdown
+%% close case)...
+-define (MIN_DISCONNECT_TIMEOUT, 1000).
+
+%% Socket connect timeout, for TCP connection.
+-define (CONNECT_TIMEOUT, 10000).
+
+%% Socket accept timeout, for TCP connection.
+-define (ACCEPT_TIMEOUT, 10000).
+
+%% How long to wait for graceful shutdown.
+-define (SHUTDOWN_TIMEOUT, 10000).
+
+%% Synchronous RPC timeout for alternative connection.
+-define (SYNC_RPC_TIMEOUT, 5000).
+
+%% Default timeout for peer node to boot.
+-define (WAIT_BOOT_TIMEOUT, 15000).
+
+-type disconnect_timeout() :: ?MIN_DISCONNECT_TIMEOUT..?MAX_INT_TIMEOUT | infinity.
+
+%% @doc Creates random node name, using "peer" as prefix.
+-spec random_name() -> string().
+random_name() ->
+ random_name(?MODULE_STRING).
+
+%% @doc Creates sufficiently random node name,
+%% using OS process ID for origin VM, resulting name
+%% looks like prefix-3-7161
+-spec random_name(Prefix :: string() | atom()) -> string().
+random_name(Prefix) ->
+ OsPid = os:getpid(),
+ Uniq = erlang:unique_integer([positive]),
+ lists:concat([Prefix, "-", Uniq, "-", OsPid]).
+
+%% @doc Starts a distributed node with random name, on this host,
+%% and waits for that node to boot. Returns full node name,
+%% registers local process with the same name as peer node.
+-spec start_link() -> {ok, node()} | {error, Reason :: term()}.
+start_link() ->
+ start_link(#{name => random_name()}).
+
+%% @doc Starts peer node, linked to the calling process.
+%% Accepts additional command line arguments and
+%% other important options.
+-spec start_link(start_options()) -> {ok, pid()} | {ok, pid(), node()} | {error, Reason}
+ when Reason :: term().
+start_link(Options) ->
+ start_it(Options, start_link).
+
+%% @doc Starts peer node, not linked to the calling process.
+-spec start(start_options()) -> {ok, pid()} | {ok, pid(), node()} | {error, Reason}
+ when Reason :: term().
+start(Options) ->
+ start_it(Options, start).
+
+%% @doc Stops controlling process, shutting down peer node synchronously
+-spec stop(gen_statem:server_ref()) -> ok.
+stop(Dest) ->
+ gen_server:stop(Dest).
+
+%% @doc returns peer node state.
+-spec get_state(Dest :: gen_statem:server_ref()) -> peer_state().
+get_state(Dest) ->
+ gen_server:call(Dest, get_state).
+
+%% @doc Calls M:F(A) remotely, via alternative connection, with default 5 seconds timeout
+-spec call(Dest :: gen_statem:server_ref(), Module :: module(), Function :: atom(),
+ Args :: [term()]) -> Result :: term().
+call(Dest, M, F, A) ->
+ call(Dest, M, F, A, ?SYNC_RPC_TIMEOUT).
+
+%% @doc Call M:F(A) remotely, timeout is explicitly specified
+-spec call(Dest :: gen_statem:server_ref(), Module :: module(), Function :: atom(),
+ Args :: [term()], Timeout :: timeout()) -> Result :: term().
+call(Dest, M, F, A, Timeout) ->
+ case gen_server:call(Dest, {call, M, F, A}, Timeout) of
+ {ok, Reply} ->
+ Reply;
+ {Class, {Reason, Stack}} ->
+ erlang:raise(Class, Reason, Stack);
+ {error, Reason} ->
+ erlang:error(Reason)
+ end.
+
+%% @doc Cast M:F(A) remotely, don't care about the result
+-spec cast(Dest :: gen_statem:server_ref(), Module :: module(), Function :: atom(), Args :: [term()]) -> ok.
+cast(Dest, M, F, A) ->
+ gen_server:cast(Dest, {cast, M, F, A}).
+
+%% @doc Sends a message to pid or named process on the peer node
+%% using alternative connection. No delivery guarantee.
+-spec send(Dest :: gen_statem:server_ref(), To :: pid() | atom(), Message :: term()) -> ok.
+send(Dest, To, Message) ->
+ gen_server:cast(Dest, {send, To, Message}).
+
+%%--------------------------------------------------------------------
+%%% gen_server callbacks
+
+-record(peer_state, {
+ options :: start_options(),
+ %% full node name, can be 'undefined'
+ node :: atom(),
+ %% debugging information: executable and arguments used to
+ %% start the peer
+ exec :: file:name(),
+ args :: [string()],
+ %% alternative connection socket/port
+ connection :: undefined | port() | gen_tcp:socket(),
+ %% listening socket, while waiting for network alternative connection
+ listen_socket :: undefined | gen_tcp:socket(),
+ %% accumulator for RPC over standard_io
+ stdio = <<>> :: binary(),
+ %% peer state
+ peer_state = booting :: peer_state(),
+ %% pid/ref saved for gen:reply() when node is booted, or false
+ notify = false :: false | {pid(), reference()},
+ %% counter (reference) for calls.
+ %% it is not possible to use erlang reference, or pid,
+ %% because it changes when node becomes distributed dynamically.
+ seq = 0 :: non_neg_integer(),
+ %% outstanding calls
+ outstanding = #{} :: #{non_neg_integer() => {reference(), pid()}}
+ }).
+
+-type state() :: #peer_state{}.
+
+-spec init([Name :: atom(), ... ]) -> {ok, state()}.
+init([Notify, Options]) ->
+ process_flag(trap_exit, true), %% need this to ensure terminate/2 is called
+
+ {ListenSocket, Listen} = maybe_listen(Options),
+ {Exec, Args} = command_line(Listen, Options),
+
+ Env = maps:get(env, Options, []),
+
+ %% close port if running detached
+ Conn =
+ case maps:find(connection, Options) of
+ {ok, standard_io} ->
+ %% Cannot detach a peer that uses stdio. Request exit_status.
+ open_port({spawn_executable, Exec}, [{args, Args}, {env, Env}, hide, binary, exit_status]);
+ _ ->
+ Port = open_port({spawn_executable, Exec}, [{args, Args}, {env, Env}, hide, binary]),
+ %% peer can close the port before we get here which will cause
+ %% port_close to throw. Catch this and ignore.
+ catch erlang:port_close(Port),
+ receive {'EXIT', Port, _} -> undefined end
+ end,
+
+ %% Remove the default 'halt' shutdown option if present; the default is
+ %% defined in terminate()...
+ SaveOptions = case maps:find(shutdown, Options) of
+ {ok, halt} ->
+ maps:remove(shutdown, Options);
+ _ ->
+ Options
+ end,
+
+ State = #peer_state{options = SaveOptions, notify = Notify, args = Args, exec = Exec},
+
+ %% accept TCP connection if requested
+ if ListenSocket =:= undefined ->
+ {ok, State#peer_state{connection = Conn}};
+ true ->
+ _ = prim_inet:async_accept(ListenSocket, ?ACCEPT_TIMEOUT),
+ {ok, State#peer_state{listen_socket = ListenSocket}}
+ end.
+
+%% not connected: no alternative connection available
+handle_call({call, _M, _F, _A}, _From, #peer_state{connection = undefined} = State) ->
+ {reply, {error, noconnection}, State};
+
+handle_call({call, M, F, A}, From,
+ #peer_state{connection = Port, options = #{connection := standard_io},
+ outstanding = Out, seq = Seq} = State) ->
+ origin_to_peer(port, Port, {call, Seq, M, F, A}),
+ {noreply, State#peer_state{outstanding = Out#{Seq => From}, seq = Seq + 1}};
+
+handle_call({call, M, F, A}, From,
+ #peer_state{connection = Socket, outstanding = Out, seq = Seq} = State) ->
+ origin_to_peer(tcp, Socket, {call, Seq, M, F, A}),
+ {noreply, State#peer_state{outstanding = Out#{Seq => From}, seq = Seq + 1}};
+
+handle_call(get_node, _From, #peer_state{node = Node} = State) ->
+ {reply, Node, State};
+
+handle_call(get_state, _From, #peer_state{peer_state = PeerState} = State) ->
+ {reply, PeerState, State};
+
+handle_call(group_leader, _From, State) ->
+ {reply, group_leader(), State}.
+
+handle_cast({cast, _M, _F, _A}, #peer_state{connection = undefined} = State) ->
+ {noreply, State};
+
+handle_cast({cast, M, F, A},
+ #peer_state{connection = Port, options = #{connection := standard_io}} = State) ->
+ origin_to_peer(port, Port, {cast, M, F, A}),
+ {noreply, State};
+
+handle_cast({cast, M, F, A}, #peer_state{connection = Socket} = State) ->
+ origin_to_peer(tcp, Socket, {cast, M, F, A}),
+ {noreply, State};
+
+handle_cast({send, _Dest, _Message}, #peer_state{connection = undefined} = State) ->
+ {noreply, State};
+
+handle_cast({send, Dest, Message},
+ #peer_state{connection = Port, options = #{connection := standard_io}} = State) ->
+ origin_to_peer(port, Port, {message, Dest, Message}),
+ {noreply, State};
+
+handle_cast({send, Dest, Message}, #peer_state{connection = Socket} = State) ->
+ origin_to_peer(tcp, Socket, {message, Dest, Message}),
+ {noreply, State}.
+
+%%--------------------------------------------------------------------
+%% alternative connections handling
+
+%% alternative communications - request or response from peer
+handle_info({tcp, Socket, SocketData}, #peer_state{connection = Socket} = State) ->
+ ok = inet:setopts(Socket, [{active, once}]),
+ {noreply, handle_alternative_data(tcp, binary_to_term(SocketData), State)};
+
+%% standard_io
+handle_info({Port, {data, PortData}}, #peer_state{connection = Port, stdio = PrevBin} = State) ->
+ {Str, NewBin} = decode_port_data(PortData, <<>>, PrevBin),
+ Str =/= <<>> andalso io:put_chars(Str),
+ {noreply, handle_port_binary(NewBin, State)};
+
+%% booting: accepted TCP connection from the peer, but it is not yet
+%% complete handshake
+handle_info({inet_async, LSock, _Ref, {ok, CliSocket}},
+ #peer_state{listen_socket = LSock} = State) ->
+ true = inet_db:register_socket(CliSocket, inet_tcp),
+ ok = inet:setopts(CliSocket, [{active, once}]),
+ catch gen_tcp:close(LSock),
+ {noreply, State#peer_state{connection = CliSocket, listen_socket = undefined}};
+
+handle_info({inet_async, LSock, _Ref, {error, Reason}},
+ #peer_state{listen_socket = LSock} = State) ->
+ %% failed to accept a TCP connection
+ catch gen_tcp:close(LSock),
+ %% stop unconditionally, it is essentially a part of gen_server:init callback
+ {stop, {inet_async, Reason}, State#peer_state{connection = undefined, listen_socket = undefined}};
+
+%% booting: peer notifies via Erlang distribution
+handle_info({started, Node}, State)->
+ true = erlang:monitor_node(Node, true),
+ {noreply, boot_complete(Node, started, State)};
+
+%% nodedown: no-alternative dist-connected peer node is down
+handle_info({nodedown, Node}, #peer_state{connection = undefined} = State) ->
+ maybe_stop({nodedown, Node}, State);
+
+%% external program exited, returned Status code
+handle_info({Port, {exit_status, Status}}, #peer_state{connection = Port} = State) ->
+ catch erlang:port_close(Port),
+ maybe_stop({exit_status, Status}, State);
+
+%% port terminated: cannot proceed, stop the server
+handle_info({'EXIT', Port, Reason}, #peer_state{connection = Port} = State) ->
+ catch erlang:port_close(Port),
+ maybe_stop(Reason, State);
+
+handle_info({tcp_closed, Sock}, #peer_state{connection = Sock} = State) ->
+ %% TCP connection closed, no i/o port - assume node is stopped
+ catch gen_tcp:close(Sock),
+ maybe_stop(normal, State#peer_state{connection = undefined}).
+
+%%--------------------------------------------------------------------
+%% cleanup/termination
+
+-spec terminate(Reason :: term(), state()) -> ok.
+terminate(_Reason, #peer_state{connection = Port, options = Options, node = Node}) ->
+ case {maps:get(shutdown, Options, {halt, ?DEFAULT_HALT_DISCONNECT_TIMEOUT}),
+ maps:find(connection, Options)} of
+ {close, {ok, standard_io}} ->
+ Port /= undefined andalso (catch erlang:port_close(Port));
+ {close, {ok, _TCP}} ->
+ Port /= undefined andalso (catch gen_tcp:close(Port));
+ {close, error} ->
+ _ = erlang:disconnect_node(Node);
+ {{halt, Timeout}, {ok, standard_io}} ->
+ Port /= undefined andalso (catch erlang:port_close(Port)),
+ wait_disconnected(Node, {timeout, Timeout});
+ {{halt, Timeout}, {ok, _TCP}} ->
+ Port /= undefined andalso (catch gen_tcp:close(Port)),
+ wait_disconnected(Node, {timeout, Timeout});
+ {{halt, Timeout}, error} ->
+ try
+ _ = erpc:call(Node, erlang, halt, [], Timeout),
+ ok
+ catch
+ error:{erpc,noconnection} -> ok;
+ _:_ -> force_disconnect_node(Node)
+ end;
+ {Shutdown, error} ->
+ Timeout = shutdown(dist, undefined, Node, Shutdown),
+ wait_disconnected(Node, {timeout, Timeout});
+ {Shutdown, {ok, standard_io}} ->
+ Timeout = shutdown(port, Port, Node, Shutdown),
+ Deadline = deadline(Timeout),
+ receive {'EXIT', Port, _Reason2} -> ok after Timeout -> ok end,
+ catch erlang:port_close(Port),
+ wait_disconnected(Node, Deadline);
+ {Shutdown, {ok, _TCP}} ->
+ Timeout = shutdown(tcp, Port, Node, Shutdown),
+ Deadline = deadline(Timeout),
+ receive {tcp_closed, Port} -> ok after Timeout -> ok end,
+ catch catch gen_tcp:close(Port),
+ wait_disconnected(Node, Deadline)
+ end,
+ ok.
+
+%%--------------------------------------------------------------------
+%% Internal implementation
+
+deadline(infinity) ->
+ {timeout, infinity};
+deadline(Timeout) when is_integer(Timeout) ->
+ {deadline, erlang:monotonic_time(millisecond) + Timeout}.
+
+wait_disconnected(Node, WaitUntil) ->
+ %% Should only be called just before we are exiting the caller, so
+ %% we do not bother disabling nodes monitoring if we enable it and
+ %% do not flush any nodeup/nodedown messages that we got due to the
+ %% nodes monitoring...
+ case lists:member(Node, nodes(connected)) of
+ false ->
+ ok;
+ true ->
+ _ = net_kernel:monitor_nodes(true, [{node_type, all}]),
+ %% Need to check connected nodes list again, since it
+ %% might have disconnected before we enabled nodes
+ %% monitoring...
+ case lists:member(Node, nodes(connected)) of
+ false ->
+ ok;
+ true ->
+ Tmo = case WaitUntil of
+ {timeout, T} ->
+ T;
+ {deadline, T} ->
+ TL = T - erlang:monotonic_time(millisecond),
+ if TL < 0 -> 0;
+ true -> TL
+ end
+ end,
+ receive {nodedown, Node, _} -> ok
+ after Tmo -> force_disconnect_node(Node)
+ end
+ end
+ end.
+
+force_disconnect_node(Node) ->
+ _ = erlang:disconnect_node(Node),
+ logger:warning("peer:stop() timed out waiting for disconnect from "
+ "node ~p. The connection was forcefully taken down.",
+ [Node]).
+
+%% This hack is a temporary workaround for test coverage reports
+shutdown(_Type, _Port, Node, Timeout) when is_integer(Timeout); Timeout =:= infinity ->
+ erpc:cast(Node, init, stop, []),
+ Timeout;
+shutdown(dist, undefined, Node, {Timeout, CoverNode}) when is_integer(Timeout); Timeout =:= infinity ->
+ rpc:call(CoverNode, cover, flush, [Node]),
+ erpc:cast(Node, init, stop, []),
+ Timeout;
+shutdown(Type, Port, Node, {Timeout, CoverNode}) when is_integer(Timeout); Timeout =:= infinity ->
+ rpc:call(CoverNode, cover, flush, [Node]),
+ Port /= undefined andalso origin_to_peer(Type, Port, {cast, init, stop, []}),
+ Timeout.
+
+%% Verify options correctness (Dialyzer also does the job, but slightly less convenient)
+verify_args(Options) ->
+ %% verify that "Args" is valid - common problem is when Args aren't strings
+ Args = maps:get(args, Options, []),
+ is_list(Args) orelse error({invalid_arg, Args}),
+ [error({invalid_arg, Arg}) || Arg <- Args, not io_lib:char_list(Arg)],
+ %% alternative connection must be requested for non-distributed node,
+ %% or a distributed node when origin is not alive
+ is_map_key(connection, Options) orelse
+ (is_map_key(name, Options) andalso erlang:is_alive()) orelse error(not_alive),
+ %% exec must be a string, or a tuple of string(), [string()]
+ case maps:find(exec, Options) of
+ {ok, {Exec, Strs}} ->
+ io_lib:char_list(Exec) orelse error({exec, Exec}),
+ [error({exec, Str}) || Str <- Strs, not io_lib:char_list(Str)],
+ ok;
+ {ok, Exec} when is_list(Exec) ->
+ io_lib:char_list(Exec) orelse error({exec, Exec}),
+ ok;
+ error ->
+ ok;
+ {ok, Err} ->
+ error({exec, Err})
+ end,
+ case maps:find(shutdown, Options) of
+ {ok, close} ->
+ ok;
+ {ok, halt} ->
+ ok;
+ {ok, {halt, Tmo}} when (is_integer(Tmo)
+ andalso ?MIN_DISCONNECT_TIMEOUT =< Tmo
+ andalso Tmo =< ?MAX_INT_TIMEOUT)
+ orelse Tmo == infinity ->
+ ok;
+ {ok, Tmo} when (is_integer(Tmo)
+ andalso ?MIN_DISCONNECT_TIMEOUT =< Tmo
+ andalso Tmo =< ?MAX_INT_TIMEOUT)
+ orelse Tmo == infinity ->
+ ok;
+ {ok, {Tmo, Node}} when ((is_integer(Tmo)
+ andalso ?MIN_DISCONNECT_TIMEOUT =< Tmo
+ andalso Tmo =< ?MAX_INT_TIMEOUT)
+ orelse Tmo == infinity)
+ andalso is_atom(Node) ->
+ ok;
+ error ->
+ ok;
+ {ok, Err2} ->
+ error({shutdown, Err2})
+ end.
+
+
+make_notify_ref(infinity) ->
+ {self(), make_ref()};
+make_notify_ref(WaitBoot) when is_integer(WaitBoot) ->
+ {self(), make_ref()};
+make_notify_ref({ReplyTo, Tag}) when is_pid(ReplyTo) ->
+ {ReplyTo, Tag};
+make_notify_ref(false) ->
+ false.
+
+start_it(Options, StartFun) ->
+ verify_args(Options),
+ WaitBoot = maps:get(wait_boot, Options, ?WAIT_BOOT_TIMEOUT),
+ Notify = make_notify_ref(WaitBoot),
+ case gen_server:StartFun(?MODULE, [Notify, Options], []) of
+ {ok, Pid} when WaitBoot =:= infinity; is_integer(WaitBoot) ->
+ {_, Ref} = Notify,
+ Mref = erlang:monitor(process, Pid),
+ receive
+ {Ref, {started, NodeName, Pid}} ->
+ erlang:demonitor(Mref, [flush]),
+ {ok, Pid, NodeName};
+ {Ref, {boot_failed, Reason, Pid}} ->
+ erlang:demonitor(Mref, [flush]),
+ erlang:exit({boot_failed, Reason});
+ {'DOWN', Mref, _, _, Reason} ->
+ erlang:exit(Reason)
+ after
+ WaitBoot ->
+ _ = gen_server:stop(Pid),
+ erlang:demonitor(Mref, [flush]),
+ erlang:exit(timeout)
+ end;
+ {ok, Pid} when is_map_key(host, Options) ->
+ {ok, Pid, node_name(Options)};
+ {ok, Pid} ->
+ {ok, Pid};
+ Error ->
+ Error
+ end.
+
+node_name(#{name := Name, host := Host}) ->
+ list_to_atom(lists:concat([Name, "@", Host]));
+node_name(_Options) ->
+ undefined.
+
+%% Lost control connection to the peer while the node was
+%% booting, this generally means a crash
+maybe_stop(Reason, #peer_state{peer_state = booting} = State) ->
+ _ = boot_complete(Reason, boot_failed, State),
+ maybe_stop(Reason, State#peer_state{peer_state = {down, Reason}});
+%%
+maybe_stop(Reason, #peer_state{options = #{peer_down := crash}} = State) ->
+ {stop, Reason, State#peer_state{peer_state = {down, Reason}, connection = undefined}};
+%% if state was already down, keep the original reason
+maybe_stop(_Reason, #peer_state{options = #{peer_down := continue}, peer_state = {down, _}} = State) ->
+ {noreply, State};
+%% continue working setting peer state to down
+maybe_stop(Reason, #peer_state{options = #{peer_down := continue}} = State) ->
+ {noreply, State#peer_state{peer_state = {down, Reason}}};
+%% default: ignore Reason and shut down normally
+maybe_stop(Reason, State) ->
+ {stop, normal, State#peer_state{peer_state = {down, Reason}}}.
+
+%% i/o protocol from origin:
+%% * {io_reply, ...}
+%% * {message, To, Content}
+%% * {call, From, M, F, A}
+%%
+%% i/o port protocol, from peer:
+%% * {io_request, From, ReplyAs, Request}
+%% * {message, To, Content}
+%% * {reply, From, ok | throw | error | exit | crash, Result | {Reason, Stack}}
+
+%% Handles bytes coming from alternative connection, forwarding as needed.
+handle_alternative_data(Kind, {io_request, From, FromRef, IoReq}, #peer_state{connection = Conn} = State) ->
+ %% TODO: make i/o completely async
+ Reply = {io_reply, From, FromRef, forward_request(IoReq)},
+ origin_to_peer(Kind, Conn, Reply),
+ State;
+handle_alternative_data(_Kind, {message, To, Content}, State) ->
+ To ! Content,
+ State;
+handle_alternative_data(_Kind, {reply, Seq, Class, Result}, #peer_state{outstanding = Out} = State) ->
+ {From, NewOut} = maps:take(Seq, Out),
+ gen:reply(From, {Class, Result}),
+ State#peer_state{outstanding = NewOut};
+handle_alternative_data(_Kind, {started, NodeName}, State)->
+ boot_complete(NodeName, started, State).
+
+forward_request(Req) ->
+ GL = group_leader(),
+ MRef = erlang:monitor(process, GL),
+ GL ! {io_request,self(), MRef, Req},
+ receive
+ {io_reply, MRef, Reply} ->
+ erlang:demonitor(MRef, [flush]),
+ Reply;
+ {'DOWN', MRef, _, _, _} ->
+ {error, terminated}
+ end.
+
+%% generic primitive to send data from origin to peer via alternative connection
+origin_to_peer(tcp, Sock, Term) ->
+ ok = gen_tcp:send(Sock, term_to_binary(Term));
+origin_to_peer(port, Port, Term) ->
+ true = erlang:port_command(Port, encode_port_data(term_to_binary(Term))).
+
+%% generic primitive to send data from peer to origin
+peer_to_origin(tcp, Sock, Term) ->
+ ok = gen_tcp:send(Sock, term_to_binary(Term));
+peer_to_origin(port, Port, Term) ->
+ %% converts Erlang term to terminal codes
+ %% Every binary byte is converted into two 4-bit sequences.
+ Bytes = term_to_binary(Term),
+ true = erlang:port_command(Port, encode_port_data(Bytes)).
+
+%% convert/escape Erlang term into terminal codes.
+%% Protocol consists of Erlang terms serialised into
+%% External Term Format (ETF) via term_to_binary. Then
+%% every byte of the resulting binary is split into two
+%% nibbles (4-bit sequences), which are encoded into two
+%% characters.
+%% Control characters must have first two and last two bits
+%% set, so the byte looks this way: 11xxxx11.
+%% Example encoding, hexadecimal 16#0F will be encoded as
+%% 11000011 11111111 (decimal 195 255).
+encode_port_data(Bytes) ->
+ Size = byte_size(Bytes),
+ Crc = erlang:crc32(Bytes),
+ Total = <<Size:32, Bytes/binary, Crc:32>>,
+ <<<<3:2, Upper:4, 3:2, 3:2, Lower:4, 3:2>> || <<Upper:4, Lower:4>> <= Total>>.
+
+%% convert terminal codes to Erlang term, printing everything that
+%% was detected as text
+decode_port_data(<<>>, Str, Bin) ->
+ {Str, Bin};
+decode_port_data(<<3:2, Quad:4, 3:2, Rest/binary>>, Str, Bin) ->
+ decode_port_data(Rest, Str, <<Bin/bitstring, Quad:4>>);
+decode_port_data(<<Char:8, Rest/binary>>, Str, Bin) ->
+ decode_port_data(Rest, <<Str/binary, Char>>, Bin).
+
+%% recursively process buffers, potentially changing the state
+handle_port_binary(<<Size:32, Payload:Size/binary, Crc:32, Rest/binary>>, State) ->
+ Crc = erlang:crc32(Payload),
+ Term = binary_to_term(Payload),
+ NewState = handle_alternative_data(port, Term, State),
+ handle_port_binary(Rest, NewState);
+handle_port_binary(NewBin, State) ->
+ State#peer_state{stdio = NewBin}.
+
+boot_complete(Node, _Result, #peer_state{notify = false} = State) ->
+ State#peer_state{peer_state = running, node = Node};
+boot_complete(Node, Result, #peer_state{notify = {ReplyTo, Tag}} = State) ->
+ ReplyTo ! {Tag, {Result, Node, self()}},
+ State#peer_state{peer_state = running, node = Node}.
+
+%% check if TCP connection is enabled, and starts listener
+maybe_listen(#{connection := Port}) when is_integer(Port) ->
+ {ok, LSock} = gen_tcp:listen(Port, [binary, {reuseaddr, true}, {packet, 4}]),
+ {ok, WaitPort} = inet:port(LSock),
+ %% try guessing a local IP address
+ {ok, Ifs} = inet:getifaddrs(),
+ %% next incantation gets all IP addresses of all local interfaces that are up
+ LocalUp = lists:append(
+ [proplists:get_all_values(addr, Opts)
+ || {_, Opts} <- Ifs, lists:member(up, proplists:get_value(flags, Opts, []))]),
+ %% filter invalid addresses
+ Local = prefer_localhost([Valid || Valid <- LocalUp, is_list(inet:ntoa(Valid))], [], []),
+ {LSock, {Local, WaitPort}};
+maybe_listen(#{connection := {Ip, Port}}) when is_integer(Port) ->
+ {ok, LSock} = gen_tcp:listen(Port, [binary, {reuseaddr, true}, {packet, 4}, {ip, Ip}]),
+ WaitPort = if Port =:= 0 -> {ok, Dyn} = inet:port(LSock), Dyn; true -> Port end,
+ {LSock, {[Ip], WaitPort}};
+maybe_listen(_Options) ->
+ {undefined, undefined}.
+
+%% prefer localhost, IPv6 localhost, then everything else
+prefer_localhost([], Preferred, Other) ->
+ Preferred ++ Other;
+prefer_localhost([{127, _, _, _} = Local | Tail], Preferred, Other) ->
+ prefer_localhost(Tail, [Local | Preferred], Other);
+prefer_localhost([{0, 0, 0, 0, 0, 0, 0, 1} = Local | Tail], Preferred, Other) ->
+ prefer_localhost(Tail, [Local | Preferred], Other);
+prefer_localhost([Local | Tail], Preferred, Other) ->
+ prefer_localhost(Tail, Preferred, [Local | Other]).
+
+name_arg(error, error, _) ->
+ []; %% no name, no host - starting node that is not distributed
+name_arg(error, {ok, Host}, LongOrShort) ->
+ %% interesting fallback: host is set, name is not. Do what predecessor did,
+ %% take the current node name and use it...
+ [Name, _] = string:lexemes(atom_to_list(node()), "@"),
+ name_arg(Name ++ "@" ++ Host, error, LongOrShort);
+name_arg({ok, Name}, Host, LongOrShort) ->
+ name_arg(Name, Host, LongOrShort); %% unpack node name
+name_arg(Name, Host, LongOrShort) when is_atom(Name) ->
+ name_arg(atom_to_list(Name), Host, LongOrShort); %% convert atom to list for command line
+name_arg(Name, Host, {ok, ignored}) ->
+ name_arg(Name, Host, {ok, false}); %% fallback to shortnames when origin is not distributed
+name_arg(Name, Host, error) ->
+ name_arg(Name, Host, {ok, net_kernel:longnames()}); %% no longnames present it start options
+name_arg(Name, {ok, Host}, LongOrShort) ->
+ name_arg(Name ++ "@" ++ Host, error, LongOrShort); %% merge host part
+%% only these are actual name creation clauses
+name_arg(Name, error, {ok, true}) ->
+ ["-name", Name];
+name_arg(Name, error, {ok, false}) ->
+ ["-sname", Name].
+
+command_line(Listen, Options) ->
+ %% Node name/sname
+ NameArg = name_arg(maps:find(name, Options), maps:find(host, Options), maps:find(longnames, Options)),
+ %% additional command line args
+ CmdOpts = maps:get(args, Options, []),
+ %% start command
+ StartCmd =
+ case Listen of
+ undefined when map_get(connection, Options) =:= standard_io ->
+ ["-user", atom_to_list(?MODULE)];
+ undefined ->
+ Self = base64:encode_to_string(term_to_binary(self())),
+ ["-detached", "-noinput", "-user", atom_to_list(?MODULE), "-origin", Self];
+ {Ips, Port} ->
+ IpStr = lists:concat(lists:join(",", [inet:ntoa(Ip) || Ip <- Ips])),
+ ["-detached", "-noinput", "-user", atom_to_list(?MODULE), "-origin", IpStr, integer_to_list(Port)]
+ end,
+ %% build command line
+ {Exec, PreArgs} = exec(Options),
+ {Exec, PreArgs ++ NameArg ++ StartCmd ++ CmdOpts}.
+
+exec(#{exec := Prog}) when is_list(Prog) ->
+ {Prog, []};
+exec(#{exec := {Prog, Args}}) when is_list(Prog), is_list(Args) ->
+ {Prog, Args};
+exec(Options) when not is_map_key(exec, Options) ->
+ case init:get_argument(progname) of
+ {ok, [[Prog]]} ->
+ case os:find_executable(Prog) of
+ Exec when is_list(Exec) ->
+ {Exec, []};
+ false ->
+ maybe_otp_test_suite(Prog)
+ end;
+ _ ->
+ default_erts()
+ end.
+
+maybe_otp_test_suite(Prog) ->
+ case string:split(Prog, "cerl ") of
+ [CerlPath, Args] ->
+ %% This is a hack to handle the 'cerl' script used
+ %% by the Erlang/OTP test suites. When 'cerl'
+ %% starts the runtime system, it typically sets
+ %% 'progname' to the path of the 'cerl' script,
+ %% followed by an argument. For example:
+ %%
+ %% /<full_path_to>/cerl -debug
+ %% /<full_path_to>/cerl -asan
+ %% /<full_path_to>/cerl -gcov
+ %%
+ %% We should find a better way to handle this, for
+ %% example by passing the emulator type and flavor
+ %% using the '-emu_type' and '-emu_flavor'
+ %% options. However, this is not without
+ %% complications as those options do not really
+ %% work for an installed system. Also, it is
+ %% probably a good idea to stop using 'slave'
+ %% before attempting to do this.
+ {filename:join(CerlPath, "cerl"), parse_args(Args)};
+ _ ->
+ default_erts()
+ end.
+
+
+%% Split command line string into a list of arguments.
+-spec parse_args(string()) -> [string()].
+parse_args([]) ->
+ [];
+parse_args([Deep | _] = AlreadyParsed) when is_list(Deep) ->
+ AlreadyParsed;
+parse_args(CmdLine) ->
+ %% following regex splits command line, preserving quoted arguments, into argv[] list
+ Re = <<"((?:\"[^\"\\\\]*(?:\\\\[\\S\\s][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[\\S\\s][^'\\\\]*)*'|\\/[^\\/\\\\]*(?:\\\\[\\S\\s][^\\/\\\\]*)*\\/[gimy]*(?=\\s|$)|(?:\\\\\\s|\\S))+)(?=\\s|$)">>,
+ {match, Args} = re:run(CmdLine, Re, [{capture, all_but_first, list}, global]),
+ %% unquote arguments. It is possible to change regex capture groups to avoid extra processing.
+ [unquote(Arg) || [Arg] <- Args].
+
+unquote([Q | Arg]) when Q =:= $\"; Q =:= $\' ->
+ case lists:last(Arg) of
+ Q -> lists:droplast(Arg);
+ _ -> [Q | Arg]
+ end;
+ unquote(Arg) ->
+ Arg.
+
+%% if progname is not known, use `erlexec` from the same ERTS version we're currently running
+%% BINDIR environment variable is already set
+%% EMU variable it also set
+default_erts() ->
+ Root = code:root_dir(),
+ Erts = filename:join(Root, lists:concat(["erts-", erlang:system_info(version)])),
+ BinDir = filename:join(Erts, "bin"),
+ {filename:join(BinDir, "erlexec"), []}.
+
+%%--------------------------------------------------------------------
+%% peer node implementation
+
+notify_when_started(Kind, Port) ->
+ init:notify_when_started(self()) =:= started andalso
+ notify_started(Kind, Port),
+ ok.
+
+notify_started(dist, Process) ->
+ Process ! {started, node()},
+ ok;
+notify_started(Kind, Port) ->
+ peer_to_origin(Kind, Port, {started, node()}).
+
+%% I/O redirection: peer side
+-spec start() -> pid().
+start() ->
+ case init:get_argument(origin) of
+ {ok, [[IpStr, PortString]]} ->
+ %% enter this clause when -origin IpList Port is specified in the command line.
+ Port = list_to_integer(PortString),
+ Ips = [begin {ok, Addr} = inet:parse_address(Ip), Addr end || Ip <- string:lexemes(IpStr, ",")],
+ spawn(fun () -> tcp_init(Ips, Port) end);
+ {ok, [[Base64EncProc]]} ->
+ %% No alternative connection, but have "-origin Base64EncProc"
+ OriginProcess = binary_to_term(base64:decode(Base64EncProc)),
+ %% setup 'user' process, I/O redirection: ask controlling process
+ %% who is the group leader.
+ GroupLeader = gen_server:call(OriginProcess, group_leader),
+ RelayPid = spawn(fun () -> relay(GroupLeader) end),
+ register(user, RelayPid),
+ spawn(
+ fun () ->
+ MRef = monitor(process, OriginProcess),
+ notify_when_started(dist, OriginProcess),
+ origin_link(MRef, OriginProcess)
+ end),
+ %% return RelayPid for user_sup to link to
+ RelayPid;
+ error ->
+ %% no -origin specified, meaning that standard I/O is used for alternative
+ spawn(fun io_server/0)
+ end.
+
+relay(GroupLeader) ->
+ receive
+ IO ->
+ GroupLeader ! IO,
+ relay(GroupLeader)
+ end.
+
+origin_link(MRef, Origin) ->
+ receive
+ {'DOWN', MRef, process, Origin, _Reason} ->
+ erlang:halt();
+ {init, started} ->
+ notify_started(dist, Origin),
+ origin_link(MRef, Origin)
+ end.
+
+io_server() ->
+ process_flag(trap_exit, true),
+ Port = erlang:open_port({fd, 0, 1}, [eof, binary]),
+ register(user, self()),
+ group_leader(self(), self()),
+ notify_when_started(port, Port),
+ io_server_loop(port, Port, #{}, #{}, <<>>).
+
+tcp_init(IpList, Port) ->
+ try
+ Sock = loop_connect(IpList, Port),
+ register(user, self()),
+ erlang:group_leader(self(), self()),
+ notify_when_started(tcp, Sock),
+ io_server_loop(tcp, Sock, #{}, #{}, undefined)
+ catch
+ Class:Reason:Stack ->
+ io:format(standard_io, "TCP connection failed: ~s:~p~n~120p~n", [Class, Reason, Stack]),
+ erlang:halt(1)
+ end.
+
+loop_connect([], _Port) ->
+ error(noconnection);
+loop_connect([Ip | More], Port) ->
+ case gen_tcp:connect(Ip, Port, [binary, {packet, 4}], ?CONNECT_TIMEOUT) of
+ {ok, Sock} ->
+ Sock;
+ _Error ->
+ loop_connect(More, Port)
+ end.
+
+%% Message protocol between peers
+io_server_loop(Kind, Port, Refs, Out, PortBuf) ->
+ receive
+ {io_request, From, ReplyAs, Request} when is_pid(From) ->
+ %% i/o request from this node, forward it to origin
+ peer_to_origin(Kind, Port, {io_request, From, ReplyAs, Request}),
+ io_server_loop(Kind, Port, Refs, Out, PortBuf);
+ {Port, {data, Bytes}} when Kind =:= port ->
+ {_Str, NewBin} = decode_port_data(Bytes, <<>>, PortBuf),
+ {NewRefs, NewOut, NewBuf} = handle_port_alternative(NewBin, Refs, Out),
+ io_server_loop(Kind, Port, NewRefs, NewOut, NewBuf);
+ {Port, eof} when Kind =:= port ->
+ %% stdin closed, if there is no active alternative, stop the node
+ erlang:halt(1);
+ {'EXIT', Port, badsig} when Kind =:= port ->
+ %% ignore badsig (what is it?)
+ io_server_loop(Kind, Port, Refs, Out, PortBuf);
+ {'EXIT', Port, _Reason} when Kind =:= port ->
+ %% stdin closed, if there is no active alternative, stop the node
+ erlang:halt(1);
+ {tcp, Port, Data} when Kind =:= tcp ->
+ ok = inet:setopts(Port, [{active, once}]), %% flow control
+ {NewRefs, NewOut} = handle_peer_alternative(binary_to_term(Data), Refs, Out),
+ io_server_loop(Kind, Port, NewRefs, NewOut, PortBuf);
+ {tcp_closed, Port} when Kind =:= tcp ->
+ %% TCP connection closed, time to shut down
+ erlang:halt(1);
+ {reply, Seq, Class, Reply} when is_integer(Seq), is_map_key(Seq, Out) ->
+ %% stdin/stdout RPC
+ {CallerRef, Out2} = maps:take(Seq, Out),
+ Refs2 = maps:remove(CallerRef, Refs),
+ erlang:demonitor(CallerRef, [flush]),
+ peer_to_origin(Kind, Port, {reply, Seq, Class, Reply}),
+ io_server_loop(Kind, Port, Refs2, Out2, PortBuf);
+ %% stdin/stdout message forwarding
+ {message, To, Content} ->
+ peer_to_origin(Kind, Port, {message, To, Content}),
+ io_server_loop(Kind, Port, Refs, Out, PortBuf);
+ {'DOWN', CallerRef, _, _, Reason} ->
+ %% this is really not expected to happen, because "do_call"
+ %% catches all exceptions
+ {Seq, Refs3} = maps:take(CallerRef, Refs),
+ {CallerRef, Out3} = maps:take(Seq, Out),
+ peer_to_origin(Kind, Port, {reply, Seq, crash, Reason}),
+ io_server_loop(Kind, Port, Refs3, Out3, PortBuf);
+ {init, started} ->
+ notify_started(Kind, Port),
+ io_server_loop(Kind, Port, Refs, Out, PortBuf);
+ _Other ->
+ %% below, what is it?
+ io_server_loop(Kind, Port, Refs, Out, PortBuf)
+ end.
+
+handle_peer_alternative({io_reply, From, FromRef, Reply}, Refs, Out) ->
+ From ! {io_reply, FromRef, Reply},
+ {Refs, Out};
+handle_peer_alternative({call, Seq, M, F, A}, Refs, Out) ->
+ CallerRef = do_call(Seq, M, F, A),
+ {Refs#{CallerRef => Seq}, Out#{Seq => CallerRef}};
+handle_peer_alternative({cast, M, F, A}, Refs, Out) ->
+ %% spawn a separate process to avoid blocking further RPC
+ spawn(fun () -> erlang:apply(M, F, A) end),
+ {Refs, Out};
+handle_peer_alternative({message, Dest, Message}, Refs, Out) ->
+ Dest ! Message,
+ {Refs, Out}.
+
+%% single port input message may contain multiple messages
+handle_port_alternative(<<Size:32, Payload:Size/binary, Crc:32, Rest/binary>>, Refs, Out) ->
+ Crc = erlang:crc32(Payload), %% assert
+ {NewRefs, NewOut} = handle_peer_alternative(binary_to_term(Payload), Refs, Out),
+ handle_port_alternative(Rest, NewRefs, NewOut);
+handle_port_alternative(Rest, Refs, Out) ->
+ {Refs, Out, Rest}.
+
+do_call(Seq, M, F, A) ->
+ Proxy = self(),
+ {_, CallerRef} =
+ spawn_monitor(
+ fun () ->
+ %% catch all errors, otherwise emulator will log
+ %% ERROR REPORT when it is not expected
+ try
+ Proxy ! {reply, Seq, ok, erlang:apply(M, F, A)}
+ catch
+ Class:Reason:Stack ->
+ Proxy ! {reply, Seq, Class, {Reason, Stack}}
+ end
+ end),
+ CallerRef.
diff --git a/lib/stdlib/src/pool.erl b/lib/stdlib/src/pool.erl
index 39f9cb2f4c..e0fb9b6dfb 100644
--- a/lib/stdlib/src/pool.erl
+++ b/lib/stdlib/src/pool.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -103,6 +103,8 @@ pspawn(M, F, A) ->
pspawn_link(M, F, A) ->
spawn_link(get_node(), M, F, A).
+-compile([{nowarn_deprecated_function,[{slave,start,3}]}]).
+
start_nodes([], _, _) -> [];
start_nodes([Host|Tail], Name, Args) ->
case slave:start(Host, Name, Args) of
diff --git a/lib/stdlib/src/proc_lib.erl b/lib/stdlib/src/proc_lib.erl
index 66438ef224..a95d75b9f6 100644
--- a/lib/stdlib/src/proc_lib.erl
+++ b/lib/stdlib/src/proc_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -46,13 +46,33 @@
%%-----------------------------------------------------------------------------
+%% This shall be spawn_option() -- monitor options and must be kept in sync
+%% (with erlang:spawn_opt_options())
+%%
-type start_spawn_option() :: 'link'
| {'priority', erlang:priority_level()}
- | {'max_heap_size', erlang:max_heap_size()}
+ | {'fullsweep_after', non_neg_integer()}
| {'min_heap_size', non_neg_integer()}
| {'min_bin_vheap_size', non_neg_integer()}
- | {'fullsweep_after', non_neg_integer()}
+ | {'max_heap_size', erlang:max_heap_size()}
| {'message_queue_data', erlang:message_queue_data() }.
+%% and this macro is used to verify that there are no monitor options
+%% which also needs to be kept in sync all kinds of monitor options
+%% in erlang:spawn_opt_options().
+%%
+-define(VERIFY_NO_MONITOR_OPT(M, F, A, T, Opts),
+ Monitor = monitor,
+ case lists:member(Monitor, Opts) of
+ true ->
+ erlang:error(badarg, [M,F,A,T,Opts]);
+ false ->
+ case lists:keyfind(Monitor, 1, Opts) of
+ false ->
+ ok;
+ {Monitor, _} ->
+ erlang:error(badarg, [M,F,A,T,Opts])
+ end
+ end).
-type spawn_option() :: erlang:spawn_opt_option().
@@ -62,12 +82,6 @@
%%-----------------------------------------------------------------------------
--define(VERIFY_NO_MONITOR_OPT(M, F, A, T, Opts),
- case lists:member(monitor, Opts) of
- true -> erlang:error(badarg, [M,F,A,T,Opts]);
- false -> ok
- end).
-
%%-----------------------------------------------------------------------------
-spec spawn(Fun) -> pid() when
@@ -1062,33 +1076,32 @@ stop(Process) ->
Reason :: term(),
Timeout :: timeout().
stop(Process, Reason, Timeout) ->
- {Pid, Mref} = erlang:spawn_monitor(do_stop(Process, Reason)),
+ Mref = erlang:monitor(process, Process),
+ T0 = erlang:monotonic_time(millisecond),
+ RemainingTimeout = try
+ sys:terminate(Process, Reason, Timeout)
+ of
+ ok when Timeout =:= infinity ->
+ infinity;
+ ok ->
+ Timeout - (((erlang:monotonic_time(microsecond) + 999) div 1000) - T0)
+ catch
+ exit:{noproc, {sys, terminate, _}} ->
+ demonitor(Mref, [flush]),
+ exit(noproc);
+ exit:{timeout, {sys, terminate, _}} ->
+ demonitor(Mref, [flush]),
+ exit(timeout);
+ exit:Reason1 ->
+ demonitor(Mref, [flush]),
+ exit(Reason1)
+ end,
receive
{'DOWN', Mref, _, _, Reason} ->
ok;
- {'DOWN', Mref, _, _, {noproc,{sys,terminate,_}}} ->
- exit(noproc);
- {'DOWN', Mref, _, _, CrashReason} ->
- exit(CrashReason)
- after Timeout ->
- exit(Pid, kill),
- receive
- {'DOWN', Mref, _, _, _} ->
- exit(timeout)
- end
- end.
-
--spec do_stop(Process, Reason) -> Fun when
- Process :: pid() | RegName | {RegName,node()},
- RegName :: atom(),
- Reason :: term(),
- Fun :: fun(() -> no_return()).
-do_stop(Process, Reason) ->
- fun() ->
- Mref = erlang:monitor(process, Process),
- ok = sys:terminate(Process, Reason, infinity),
- receive
- {'DOWN', Mref, _, _, ExitReason} ->
- exit(ExitReason)
- end
+ {'DOWN', Mref, _, _, Reason2} ->
+ exit(Reason2)
+ after RemainingTimeout ->
+ demonitor(Mref, [flush]),
+ exit(timeout)
end.
diff --git a/lib/stdlib/src/qlc.erl b/lib/stdlib/src/qlc.erl
index 0b1d6c467e..cc4a988552 100644
--- a/lib/stdlib/src/qlc.erl
+++ b/lib/stdlib/src/qlc.erl
@@ -652,21 +652,20 @@ string_to_handle(Str, Options, Bindings) when is_list(Str) ->
{ok, Tokens, _} ->
ScanRes =
case erl_eval:extended_parse_exprs(Tokens) of
- {ok, [Expr0], SBs} ->
- {ok, Expr0, SBs};
- {ok, _ExprList, _SBs} ->
+ {ok, [Expr0]} ->
+ {ok, Expr0};
+ {ok, _ExprList} ->
erlang:error(badarg,
[Str, Options, Bindings]);
E ->
E
end,
case ScanRes of
- {ok, Expr, XBs} ->
- Bs1 = merge_binding_structs(Bindings, XBs),
- case qlc_pt:transform_expression(Expr, Bs1) of
+ {ok, Expr} ->
+ case qlc_pt:transform_expression(Expr, Bindings) of
{ok, {call, _, _QlcQ, Handle}} ->
{value, QLC_lc, _} =
- erl_eval:exprs(Handle, Bs1),
+ erl_eval:exprs(Handle, Bindings),
O = #qlc_opt{unique = Unique,
cache = Cache,
max_lookup = MaxLookup,
@@ -792,10 +791,6 @@ all_selections([{I,Cs} | ICs]) ->
%%% Local functions
%%%
-merge_binding_structs(Bs1, Bs2) ->
- lists:foldl(fun({N, V}, Bs) -> erl_eval:add_binding(N, V, Bs)
- end, Bs1, erl_eval:bindings(Bs2)).
-
aux_name1(Name, N, AllNames) ->
SN = name_suffix(Name, N),
case gb_sets:is_member(SN, AllNames) of
@@ -1208,9 +1203,7 @@ abstract1({table, TableDesc}, _NElements, _Depth, _A) ->
true ->
{ok, Tokens, _} =
erl_scan:string(lists:flatten(TableDesc++"."), 1, [text]),
- {ok, Es, Bs} =
- erl_eval:extended_parse_exprs(Tokens),
- [Expr] = erl_eval:subst_values_for_vars(Es, Bs),
+ {ok, [Expr]} = erl_eval:extended_parse_exprs(Tokens),
special(Expr);
false -> % abstract expression
TableDesc
diff --git a/lib/stdlib/src/queue.erl b/lib/stdlib/src/queue.erl
index 67ea0f8be4..a71121ad2d 100644
--- a/lib/stdlib/src/queue.erl
+++ b/lib/stdlib/src/queue.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -703,11 +703,11 @@ r2f([]) ->
{[],[]};
r2f([_]=R) ->
{[],R};
-r2f([X,Y]) ->
- {[X],[Y]};
+r2f([Y,X]) ->
+ {[Y],[X]};
r2f(List) ->
- {FF,RR} = lists:split(length(List) div 2 + 1, List),
- {FF,lists:reverse(RR, [])}.
+ {RR,FF} = lists:split(length(List) div 2, List),
+ {RR,lists:reverse(FF, [])}.
%% Move half of elements from F to R, if there are enough
f2r([]) ->
@@ -717,5 +717,5 @@ f2r([_]=F) ->
f2r([X,Y]) ->
{[Y],[X]};
f2r(List) ->
- {FF,RR} = lists:split(length(List) div 2 + 1, List),
+ {FF,RR} = lists:split(length(List) div 2, List),
{lists:reverse(RR, []),FF}.
diff --git a/lib/stdlib/src/rand.erl b/lib/stdlib/src/rand.erl
index d5906d3730..b2c3d4a557 100644
--- a/lib/stdlib/src/rand.erl
+++ b/lib/stdlib/src/rand.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2015-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2015-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -88,7 +88,7 @@
%% This depends on the algorithm handler function
-type alg_state() ::
exsplus_state() | exro928_state() | exrop_state() | exs1024_state() |
- exs64_state() | term().
+ exs64_state() | dummy_state() | term().
%% This is the algorithm handling definition within this module,
%% and the type to use for plugins.
@@ -132,7 +132,8 @@
%% Algorithm state
-type state() :: {alg_handler(), alg_state()}.
-type builtin_alg() ::
- exsss | exro928ss | exrop | exs1024s | exsp | exs64 | exsplus | exs1024.
+ exsss | exro928ss | exrop | exs1024s | exsp | exs64 | exsplus |
+ exs1024 | dummy.
-type alg() :: builtin_alg() | atom().
-type export_state() :: {alg(), alg_state()}.
-type seed() :: [integer()] | integer() | {integer(), integer(), integer()}.
@@ -141,7 +142,7 @@
state/0, export_state/0, seed/0]).
-export_type(
[exsplus_state/0, exro928_state/0, exrop_state/0, exs1024_state/0,
- exs64_state/0]).
+ exs64_state/0, dummy_state/0]).
%% =====================================================================
%% Range macro and helper
@@ -710,7 +711,12 @@ mk_alg(exro928ss) ->
uniform=>fun exro928ss_uniform/1,
uniform_n=>fun exro928ss_uniform/2,
jump=>fun exro928_jump/1},
- fun exro928_seed/1}.
+ fun exro928_seed/1};
+mk_alg(dummy=Name) ->
+ {#{type=>Name, bits=>58, next=>fun dummy_next/1,
+ uniform=>fun dummy_uniform/1,
+ uniform_n=>fun dummy_uniform/2},
+ fun dummy_seed/1}.
%% =====================================================================
%% exs64 PRNG: Xorshift64*
@@ -1374,6 +1380,39 @@ exrop_jump([S__0|S__1] = _S, S0, S1, J, Js) ->
end.
%% =====================================================================
+%% dummy "PRNG": Benchmark dummy overhead reference
+%%
+%% As fast as possible - return a constant; to measure overhead.
+%%
+%% =====================================================================
+
+-opaque dummy_state() :: 0..?MASK(58).
+
+dummy_uniform(_Range, State) -> {1, State}.
+dummy_next(R) -> {?BIT(57), R}.
+dummy_uniform(State) -> {0.5, State}.
+
+%% Serious looking seed, to avoid at least seed test failure
+%%
+dummy_seed(L) when is_list(L) ->
+ case L of
+ [X] when is_integer(X) ->
+ ?MASK(58, X);
+ [X|_] when is_integer(X) ->
+ erlang:error(too_many_seed_integer);
+ [_|_] ->
+ erlang:error(non_integer_seed)
+ end;
+dummy_seed(X) when is_integer(X) ->
+ {Z1, _} = splitmix64_next(X),
+ ?MASK(58, Z1);
+dummy_seed({A1, A2, A3}) ->
+ {_, X1} = splitmix64_next(A1),
+ {_, X2} = splitmix64_next(A2 bxor X1),
+ {Z3, _} = splitmix64_next(A3 bxor X2),
+ ?MASK(58, Z3).
+
+%% =====================================================================
%% Mask and fill state list, ensure not all zeros
%% =====================================================================
diff --git a/lib/stdlib/src/sets.erl b/lib/stdlib/src/sets.erl
index 2783ec11eb..bdc0ed40f3 100644
--- a/lib/stdlib/src/sets.erl
+++ b/lib/stdlib/src/sets.erl
@@ -426,8 +426,10 @@ is_subset_1(Set, Iter) ->
Acc1 :: Acc,
AccIn :: Acc,
AccOut :: Acc.
-fold(F, Acc, #{}=D) -> fold_1(F, Acc, maps:iterator(D));
-fold(F, Acc, #set{}=D) -> fold_set(F, Acc, D).
+fold(F, Acc, #{}=D) when is_function(F, 2)->
+ fold_1(F, Acc, maps:iterator(D));
+fold(F, Acc, #set{}=D) when is_function(F, 2)->
+ fold_set(F, Acc, D).
fold_1(Fun, Acc, Iter) ->
case maps:next(Iter) of
@@ -443,8 +445,10 @@ fold_1(Fun, Acc, Iter) ->
Pred :: fun((Element) -> boolean()),
Set1 :: set(Element),
Set2 :: set(Element).
-filter(F, #{}=D) -> maps:from_keys(filter_1(F, maps:iterator(D)), ?VALUE);
-filter(F, #set{}=D) -> filter_set(F, D).
+filter(F, #{}=D) when is_function(F, 1)->
+ maps:from_keys(filter_1(F, maps:iterator(D)), ?VALUE);
+filter(F, #set{}=D) when is_function(F, 1)->
+ filter_set(F, D).
filter_1(Fun, Iter) ->
case maps:next(Iter) of
@@ -482,7 +486,7 @@ get_bucket(T, Slot) -> get_bucket_s(T#set.segs, Slot).
%% implemented map and hash using fold but these should be faster.
%% We hope!
-fold_set(F, Acc, D) when is_function(F, 2) ->
+fold_set(F, Acc, D) ->
Segs = D#set.segs,
fold_segs(F, Acc, Segs, tuple_size(Segs)).
@@ -499,7 +503,7 @@ fold_bucket(F, Acc, [E|Bkt]) ->
fold_bucket(F, F(E, Acc), Bkt);
fold_bucket(_, Acc, []) -> Acc.
-filter_set(F, D) when is_function(F, 1) ->
+filter_set(F, D) ->
Segs0 = tuple_to_list(D#set.segs),
{Segs1,Fc} = filter_seg_list(F, Segs0, [], 0),
maybe_contract(D#set{segs = list_to_tuple(Segs1)}, Fc).
diff --git a/lib/stdlib/src/shell.erl b/lib/stdlib/src/shell.erl
index 246e5ca567..7de78758b0 100644
--- a/lib/stdlib/src/shell.erl
+++ b/lib/stdlib/src/shell.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -228,10 +228,10 @@ server_loop(N0, Eval_0, Bs00, RT, Ds00, History0, Results0) ->
N = N0 + 1,
{Eval_1,Bs0,Ds0,Prompt} = prompt(N, Eval_0, Bs00, RT, Ds00),
{Res,Eval0} = get_command(Prompt, Eval_1, Bs0, RT, Ds0),
+
case Res of
- {ok,Es0,XBs} ->
- Es1 = erl_eval:subst_values_for_vars(Es0, XBs),
- case expand_hist(Es1, N) of
+ {ok,Es0} ->
+ case expand_hist(Es0, N) of
{ok,Es} ->
{V,Eval,Bs,Ds} = shell_cmd(Es, Eval0, Bs0, RT, Ds0, cmd),
{History,Results} = check_and_get_history_and_results(),
@@ -273,11 +273,13 @@ server_loop(N0, Eval_0, Bs00, RT, Ds00, History0, Results0) ->
end.
get_command(Prompt, Eval, Bs, RT, Ds) ->
+ ResWordFun = fun erl_scan:reserved_word/1,
Parse =
fun() ->
exit(
case
- io:scan_erl_exprs(group_leader(), Prompt, {1,1}, [text])
+ io:scan_erl_exprs(group_leader(), Prompt, {1,1},
+ [text,{reserved_word_fun,ResWordFun}])
of
{ok,Toks,_EndPos} ->
erl_eval:extended_parse_exprs(Toks);
@@ -315,9 +317,9 @@ get_command1(Pid, Eval, Bs, RT, Ds) ->
prompt(N, Eval0, Bs0, RT, Ds0) ->
case get_prompt_func() of
{M,F} ->
- L = [{history,N}],
A = erl_anno:new(1),
- C = {call,A,{remote,A,{atom,A,M},{atom,A,F}},[{value,A,L}]},
+ L = {cons,A,{tuple,A,[{atom,A,history},{integer,A,N}]},{nil,A}},
+ C = {call,A,{remote,A,{atom,A,M},{atom,A,F}},[L]},
{V,Eval,Bs,Ds} = shell_cmd([C], Eval0, Bs0, RT, Ds0, pmt),
{Eval,Bs,Ds,case V of
{pmt,Val} ->
@@ -414,12 +416,12 @@ expand_expr({call,A,{atom,_,e},[N]}, C) ->
{Ces,_V,_CommandN} when is_list(Ces) ->
{block,A,Ces}
end;
-expand_expr({call,_A,{atom,_,v},[N]}, C) ->
+expand_expr({call,CA,{atom,VA,v},[N]}, C) ->
case get_cmd(N, C) of
{_,undefined,_} ->
no_command(N);
- {Ces,V,CommandN} when is_list(Ces) ->
- {value,erl_anno:new(CommandN),V}
+ {Ces,_V,CommandN} when is_list(Ces) ->
+ {call,CA,{atom,VA,v},[{integer,VA,CommandN}]}
end;
expand_expr({call,A,F,Args}, C) ->
{call,A,expand_expr(F, C),expand_exprs(Args, C)};
@@ -539,6 +541,9 @@ shell_rep(Ev, Bs0, RT, Ds0) ->
fwrite_severity(benign, <<"~s: ~ts">>,
[pos(Location), M:format_error(Error)]),
{{'EXIT',Error},Ev,Bs0,Ds0};
+ {shell_req,Ev,{get_cmd,N}} ->
+ Ev ! {shell_rep,self(),getc(N)},
+ shell_rep(Ev, Bs0, RT, Ds0);
{shell_req,Ev,get_cmd} ->
Ev ! {shell_rep,self(),get()},
shell_rep(Ev, Bs0, RT, Ds0);
@@ -956,6 +961,10 @@ init_dict([]) -> true.
%% handled in this module (i.e. those that are not eventually handled by
%% non_builtin_local_func/3 (user_default/shell_default).
+local_func(v, [{integer,_,V}], Bs, Shell, _RT, _Lf, _Ef) ->
+ %% This command is validated and expanded prior.
+ {_Ces,Value,_N} = shell_req(Shell, {get_cmd, V}),
+ {value,Value,Bs};
local_func(h, [], Bs, Shell, RT, _Lf, _Ef) ->
Cs = shell_req(Shell, get_cmd),
Cs1 = lists:filter(fun({{command, _},_}) -> true;
diff --git a/lib/stdlib/src/slave.erl b/lib/stdlib/src/slave.erl
index a5169c38f7..342c55e3eb 100644
--- a/lib/stdlib/src/slave.erl
+++ b/lib/stdlib/src/slave.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -19,6 +19,8 @@
%%
-module(slave).
+-deprecated([{'_','_',"use the 'peer' module instead"}]).
+
%% If the macro DEBUG is defined during compilation,
%% debug printouts are done through erlang:display/1.
%% Activate this feature by starting the compiler
diff --git a/lib/stdlib/src/stdlib.app.src b/lib/stdlib/src/stdlib.app.src
index abef604bdd..fbf0e73149 100644
--- a/lib/stdlib/src/stdlib.app.src
+++ b/lib/stdlib/src/stdlib.app.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -46,6 +46,7 @@
erl_error,
erl_eval,
erl_expand_records,
+ erl_features,
erl_internal,
erl_lint,
erl_parse,
@@ -71,7 +72,6 @@
io,
io_lib,
io_lib_format,
- io_lib_format_ryu_table,
io_lib_fread,
io_lib_pretty,
lists,
@@ -82,6 +82,7 @@
orddict,
ordsets,
otp_internal,
+ peer,
pool,
proc_lib,
proplists,
@@ -111,6 +112,6 @@
dets]},
{applications, [kernel]},
{env, []},
- {runtime_dependencies, ["sasl-3.0","kernel-7.0","erts-12.0","crypto-3.3",
+ {runtime_dependencies, ["sasl-3.0","kernel-@OTP-17720@","erts-12.0","crypto-4.5",
"compiler-5.0"]}
]}.
diff --git a/lib/stdlib/src/supervisor.erl b/lib/stdlib/src/supervisor.erl
index 281e7a92f1..6638110ec1 100644
--- a/lib/stdlib/src/supervisor.erl
+++ b/lib/stdlib/src/supervisor.erl
@@ -255,7 +255,7 @@ which_children(Supervisor) ->
Count :: {specs, ChildSpecCount :: non_neg_integer()}
| {active, ActiveProcessCount :: non_neg_integer()}
| {supervisors, ChildSupervisorCount :: non_neg_integer()}
- |{workers, ChildWorkerCount :: non_neg_integer()}.
+ | {workers, ChildWorkerCount :: non_neg_integer()}.
count_children(Supervisor) ->
call(Supervisor, count_children).
@@ -1516,7 +1516,7 @@ add_restart(State) ->
P = State#state.period,
R = State#state.restarts,
Now = erlang:monotonic_time(1),
- R1 = add_restart([Now|R], Now, P),
+ R1 = add_restart(R, Now, P),
State1 = State#state{restarts = R1},
case length(R1) of
CurI when CurI =< I ->
@@ -1525,18 +1525,13 @@ add_restart(State) ->
{terminate, State1}
end.
-add_restart([R|Restarts], Now, Period) ->
- case inPeriod(R, Now, Period) of
- true ->
- [R|add_restart(Restarts, Now, Period)];
- _ ->
- []
- end;
-add_restart([], _, _) ->
- [].
-
-inPeriod(Then, Now, Period) ->
- Now =< Then + Period.
+add_restart(Restarts0, Now, Period) ->
+ Treshold = Now - Period,
+ Restarts1 = lists:takewhile(
+ fun (R) -> R >= Treshold end,
+ Restarts0
+ ),
+ [Now | Restarts1].
%%% ------------------------------------------------------
%%% Error and progress reporting.
diff --git a/lib/stdlib/src/sys.erl b/lib/stdlib/src/sys.erl
index eeeceda769..f8460dbfe4 100644
--- a/lib/stdlib/src/sys.erl
+++ b/lib/stdlib/src/sys.erl
@@ -40,7 +40,7 @@
%% Types
%%-----------------------------------------------------------------
--export_type([dbg_opt/0, dbg_fun/0, debug_option/0]).
+-export_type([dbg_opt/0, dbg_fun/0, debug_option/0, system_event/0]).
-type name() :: pid() | atom()
| {'global', term()}
diff --git a/lib/stdlib/src/timer.erl b/lib/stdlib/src/timer.erl
index df10790ea0..80a997094f 100644
--- a/lib/stdlib/src/timer.erl
+++ b/lib/stdlib/src/timer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,129 +26,198 @@
cancel/1, sleep/1, tc/1, tc/2, tc/3, now_diff/2,
seconds/1, minutes/1, hours/1, hms/3]).
--export([start_link/0, start/0,
- handle_call/3, handle_info/2,
+-export([start_link/0, start/0,
+ handle_call/3, handle_info/2,
init/1,
code_change/3, handle_cast/2, terminate/2]).
-%% internal exports for test purposes only
--export([get_status/0]).
-
-%% types which can be used by other modules
+%% Types which can be used by other modules
-export_type([tref/0]).
-%% Max
--define(MAX_TIMEOUT, 16#0800000).
--define(TIMER_TAB, timer_tab).
--define(INTERVAL_TAB, timer_interval_tab).
+%% Max value for a receive's after clause.
+-define(MAX_RECEIVE_AFTER, 16#ffffffff).
+
+%% Validations
+-define(valid_time(T), is_integer(T), T >= 0).
+-define(valid_mfa(M, F, A), is_atom(M), is_atom(F), is_list(A)).
%%
%% Time is in milliseconds.
%%
--opaque tref() :: {integer(), reference()}.
+-opaque tref() :: {type(), reference()}.
+-type type() :: 'once' | 'interval' | 'instant' | 'send_local'.
-type time() :: non_neg_integer().
%%
%% Interface functions
%%
-spec apply_after(Time, Module, Function, Arguments) ->
- {'ok', TRef} | {'error', Reason} when
- Time :: time(),
- Module :: module(),
- Function :: atom(),
- Arguments :: [term()],
- TRef :: tref(),
- Reason :: term().
-
-apply_after(Time, M, F, A) ->
- req(apply_after, {Time, {M, F, A}}).
-
--spec send_after(Time, Pid, Message) -> {'ok', TRef} | {'error', Reason} when
- Time :: time(),
- Pid :: pid() | (RegName :: atom()),
- Message :: term(),
- TRef :: tref(),
- Reason :: term().
-send_after(Time, Pid, Message) ->
- req(apply_after, {Time, {?MODULE, send, [Pid, Message]}}).
-
--spec send_after(Time, Message) -> {'ok', TRef} | {'error', Reason} when
- Time :: time(),
- Message :: term(),
- TRef :: tref(),
- Reason :: term().
+ {'ok', TRef} | {'error', Reason}
+ when Time :: time(),
+ Module :: module(),
+ Function :: atom(),
+ Arguments :: [term()],
+ TRef :: tref(),
+ Reason :: term().
+apply_after(0, M, F, A)
+ when ?valid_mfa(M, F, A) ->
+ do_apply({M, F, A}),
+ {ok, {instant, make_ref()}};
+apply_after(Time, M, F, A)
+ when ?valid_time(Time),
+ ?valid_mfa(M, F, A) ->
+ req(apply_once, {system_time(), Time, {M, F, A}});
+apply_after(_Time, _M, _F, _A) ->
+ {error, badarg}.
+
+-spec send_after(Time, Destination, Message) -> {'ok', TRef} | {'error', Reason}
+ when Time :: time(),
+ Destination :: pid() | (RegName :: atom()) | {RegName :: atom(), Node :: node()},
+ Message :: term(),
+ TRef :: tref(),
+ Reason :: term().
+send_after(0, PidOrRegName, Message)
+ when is_pid(PidOrRegName);
+ is_atom(PidOrRegName) ->
+ PidOrRegName ! Message,
+ {ok, {instant, make_ref()}};
+send_after(0, {RegName, Node} = Dest, Message)
+ when is_atom(RegName),
+ is_atom(Node) ->
+ Dest ! Message,
+ {ok, {instant, make_ref()}};
+send_after(Time, Pid, Message)
+ when ?valid_time(Time),
+ is_pid(Pid),
+ node(Pid) =:= node() ->
+ TRef = erlang:send_after(Time, Pid, Message),
+ {ok, {send_local, TRef}};
+send_after(Time, Pid, Message)
+ when is_pid(Pid) ->
+ apply_after(Time, ?MODULE, send, [Pid, Message]);
+send_after(Time, RegName, Message)
+ when is_atom(RegName) ->
+ apply_after(Time, ?MODULE, send, [RegName, Message]);
+send_after(Time, {RegName, Node} = Dest, Message)
+ when is_atom(RegName),
+ is_atom(Node) ->
+ apply_after(Time, ?MODULE, send, [Dest, Message]);
+send_after(_Time, _PidOrRegName, _Message) ->
+ {error, badarg}.
+
+-spec send_after(Time, Message) -> {'ok', TRef} | {'error', Reason}
+ when Time :: time(),
+ Message :: term(),
+ TRef :: tref(),
+ Reason :: term().
send_after(Time, Message) ->
send_after(Time, self(), Message).
--spec exit_after(Time, Pid, Reason1) -> {'ok', TRef} | {'error', Reason2} when
- Time :: time(),
- Pid :: pid() | (RegName :: atom()),
- TRef :: tref(),
- Reason1 :: term(),
- Reason2 :: term().
+-spec exit_after(Time, Target, Reason1) -> {'ok', TRef} | {'error', Reason2}
+ when Time :: time(),
+ Target :: pid() | (RegName :: atom()),
+ TRef :: tref(),
+ Reason1 :: term(),
+ Reason2 :: term().
exit_after(Time, Pid, Reason) ->
- req(apply_after, {Time, {erlang, exit, [Pid, Reason]}}).
+ apply_after(Time, erlang, exit, [Pid, Reason]).
--spec exit_after(Time, Reason1) -> {'ok', TRef} | {'error', Reason2} when
- Time :: time(),
- TRef :: tref(),
- Reason1 :: term(),
- Reason2 :: term().
+-spec exit_after(Time, Reason1) -> {'ok', TRef} | {'error', Reason2}
+ when Time :: time(),
+ TRef :: tref(),
+ Reason1 :: term(),
+ Reason2 :: term().
exit_after(Time, Reason) ->
exit_after(Time, self(), Reason).
--spec kill_after(Time, Pid) -> {'ok', TRef} | {'error', Reason2} when
- Time :: time(),
- Pid :: pid() | (RegName :: atom()),
- TRef :: tref(),
- Reason2 :: term().
+-spec kill_after(Time, Target) -> {'ok', TRef} | {'error', Reason2}
+ when Time :: time(),
+ Target :: pid() | (RegName :: atom()),
+ TRef :: tref(),
+ Reason2 :: term().
kill_after(Time, Pid) ->
exit_after(Time, Pid, kill).
--spec kill_after(Time) -> {'ok', TRef} | {'error', Reason2} when
- Time :: time(),
- TRef :: tref(),
- Reason2 :: term().
+-spec kill_after(Time) -> {'ok', TRef} | {'error', Reason2}
+ when Time :: time(),
+ TRef :: tref(),
+ Reason2 :: term().
kill_after(Time) ->
exit_after(Time, self(), kill).
-spec apply_interval(Time, Module, Function, Arguments) ->
- {'ok', TRef} | {'error', Reason} when
- Time :: time(),
- Module :: module(),
- Function :: atom(),
- Arguments :: [term()],
- TRef :: tref(),
- Reason :: term().
-apply_interval(Time, M, F, A) ->
- req(apply_interval, {Time, self(), {M, F, A}}).
-
--spec send_interval(Time, Pid, Message) ->
- {'ok', TRef} | {'error', Reason} when
- Time :: time(),
- Pid :: pid() | (RegName :: atom()),
- Message :: term(),
- TRef :: tref(),
- Reason :: term().
-send_interval(Time, Pid, Message) ->
- req(apply_interval, {Time, Pid, {?MODULE, send, [Pid, Message]}}).
-
--spec send_interval(Time, Message) -> {'ok', TRef} | {'error', Reason} when
- Time :: time(),
- Message :: term(),
- TRef :: tref(),
- Reason :: term().
+ {'ok', TRef} | {'error', Reason}
+ when Time :: time(),
+ Module :: module(),
+ Function :: atom(),
+ Arguments :: [term()],
+ TRef :: tref(),
+ Reason :: term().
+apply_interval(Time, M, F, A)
+ when ?valid_time(Time),
+ ?valid_mfa(M, F, A) ->
+ req(apply_interval, {system_time(), Time, self(), {M, F, A}});
+apply_interval(_Time, _M, _F, _A) ->
+ {error, badarg}.
+
+-spec send_interval(Time, Destination, Message) -> {'ok', TRef} | {'error', Reason}
+ when Time :: time(),
+ Destination :: pid() | (RegName :: atom()) | {RegName :: atom(), Node :: node()},
+ Message :: term(),
+ TRef :: tref(),
+ Reason :: term().
+send_interval(Time, Pid, Message)
+ when ?valid_time(Time),
+ is_pid(Pid) ->
+ req(apply_interval, {system_time(), Time, Pid, {?MODULE, send, [Pid, Message]}});
+send_interval(Time, RegName, Message)
+ when ?valid_time(Time),
+ is_atom(RegName) ->
+ req(apply_interval, {system_time(), Time, RegName, {?MODULE, send, [RegName, Message]}});
+send_interval(Time, Dest = {RegName, Node}, Message)
+ when ?valid_time(Time),
+ is_atom(RegName),
+ is_atom(Node) ->
+ req(apply_interval, {system_time(), Time, Dest, {?MODULE, send, [Dest, Message]}});
+send_interval(_Time, _Pid, _Message) ->
+ {error, badarg}.
+
+-spec send_interval(Time, Message) -> {'ok', TRef} | {'error', Reason}
+ when Time :: time(),
+ Message :: term(),
+ TRef :: tref(),
+ Reason :: term().
send_interval(Time, Message) ->
send_interval(Time, self(), Message).
--spec cancel(TRef) -> {'ok', 'cancel'} | {'error', Reason} when
- TRef :: tref(),
- Reason :: term().
-cancel(BRef) ->
- req(cancel, BRef).
-
--spec sleep(Time) -> 'ok' when
- Time :: timeout().
+-spec cancel(TRef) -> {'ok', 'cancel'} | {'error', Reason}
+ when TRef :: tref(),
+ Reason :: term().
+cancel({instant, Ref})
+ when is_reference(Ref) ->
+ {ok, cancel};
+cancel({send_local, Ref})
+ when is_reference(Ref) ->
+ _ = erlang:cancel_timer(Ref),
+ {ok, cancel};
+cancel({once, Ref} = TRef)
+ when is_reference(Ref) ->
+ req(cancel, TRef);
+cancel({interval, Ref} = TRef)
+ when is_reference(Ref) ->
+ req(cancel, TRef);
+cancel(_TRef) ->
+ {error, badarg}.
+
+-spec sleep(Time) -> 'ok'
+ when Time :: timeout().
+sleep(T)
+ when is_integer(T),
+ T > ?MAX_RECEIVE_AFTER ->
+ receive
+ after ?MAX_RECEIVE_AFTER ->
+ sleep(T - ?MAX_RECEIVE_AFTER)
+ end;
sleep(T) ->
receive
after T -> ok
@@ -157,10 +226,10 @@ sleep(T) ->
%%
%% Measure the execution time (in microseconds) for Fun().
%%
--spec tc(Fun) -> {Time, Value} when
- Fun :: function(),
- Time :: integer(),
- Value :: term().
+-spec tc(Fun) -> {Time, Value}
+ when Fun :: function(),
+ Time :: integer(),
+ Value :: term().
tc(F) ->
T1 = erlang:monotonic_time(),
Val = F(),
@@ -171,11 +240,11 @@ tc(F) ->
%%
%% Measure the execution time (in microseconds) for Fun(Args).
%%
--spec tc(Fun, Arguments) -> {Time, Value} when
- Fun :: function(),
- Arguments :: [term()],
- Time :: integer(),
- Value :: term().
+-spec tc(Fun, Arguments) -> {Time, Value}
+ when Fun :: function(),
+ Arguments :: [term()],
+ Time :: integer(),
+ Value :: term().
tc(F, A) ->
T1 = erlang:monotonic_time(),
Val = apply(F, A),
@@ -186,12 +255,12 @@ tc(F, A) ->
%%
%% Measure the execution time (in microseconds) for an MFA.
%%
--spec tc(Module, Function, Arguments) -> {Time, Value} when
- Module :: module(),
- Function :: atom(),
- Arguments :: [term()],
- Time :: integer(),
- Value :: term().
+-spec tc(Module, Function, Arguments) -> {Time, Value}
+ when Module :: module(),
+ Function :: atom(),
+ Arguments :: [term()],
+ Time :: integer(),
+ Value :: term().
tc(M, F, A) ->
T1 = erlang:monotonic_time(),
Val = apply(M, F, A),
@@ -203,250 +272,245 @@ tc(M, F, A) ->
%% Calculate the time difference (in microseconds) of two
%% erlang:now() timestamps, T2-T1.
%%
--spec now_diff(T2, T1) -> Tdiff when
- T1 :: erlang:timestamp(),
- T2 :: erlang:timestamp(),
- Tdiff :: integer().
+-spec now_diff(T2, T1) -> Tdiff
+ when T1 :: erlang:timestamp(),
+ T2 :: erlang:timestamp(),
+ Tdiff :: integer().
now_diff({A2, B2, C2}, {A1, B1, C1}) ->
((A2-A1)*1000000 + B2-B1)*1000000 + C2-C1.
%%
-%% Convert seconds, minutes etc. to milliseconds.
+%% Convert seconds, minutes etc. to milliseconds.
%%
--spec seconds(Seconds) -> MilliSeconds when
- Seconds :: non_neg_integer(),
- MilliSeconds :: non_neg_integer().
+-spec seconds(Seconds) -> MilliSeconds
+ when Seconds :: non_neg_integer(),
+ MilliSeconds :: non_neg_integer().
seconds(Seconds) ->
1000*Seconds.
--spec minutes(Minutes) -> MilliSeconds when
- Minutes :: non_neg_integer(),
- MilliSeconds :: non_neg_integer().
+
+-spec minutes(Minutes) -> MilliSeconds
+ when Minutes :: non_neg_integer(),
+ MilliSeconds :: non_neg_integer().
minutes(Minutes) ->
1000*60*Minutes.
--spec hours(Hours) -> MilliSeconds when
- Hours :: non_neg_integer(),
- MilliSeconds :: non_neg_integer().
+
+-spec hours(Hours) -> MilliSeconds
+ when Hours :: non_neg_integer(),
+ MilliSeconds :: non_neg_integer().
hours(Hours) ->
1000*60*60*Hours.
--spec hms(Hours, Minutes, Seconds) -> MilliSeconds when
- Hours :: non_neg_integer(),
- Minutes :: non_neg_integer(),
- Seconds :: non_neg_integer(),
- MilliSeconds :: non_neg_integer().
+
+-spec hms(Hours, Minutes, Seconds) -> MilliSeconds
+ when Hours :: non_neg_integer(),
+ Minutes :: non_neg_integer(),
+ Seconds :: non_neg_integer(),
+ MilliSeconds :: non_neg_integer().
hms(H, M, S) ->
hours(H) + minutes(M) + seconds(S).
-%%
+%%
%% Start/init functions
%%
-%% Start is only included because of backward compatibility!
-spec start() -> 'ok'.
start() ->
- ensure_started().
+ {ok, _Pid} = do_start(),
+ ok.
+
+do_start() ->
+ case
+ supervisor:start_child(
+ kernel_sup,
+ #{
+ id => timer_server,
+ start => {?MODULE, start_link, []},
+ restart => permanent,
+ shutdown => 1000,
+ type => worker,
+ modules => [?MODULE]
+ }
+ )
+ of
+ {ok, Pid} ->
+ {ok, Pid};
+ {ok, Pid, _} ->
+ {ok, Pid};
+ {error, {already_started, Pid}} ->
+ {ok, Pid};
+ Error ->
+ Error
+ end.
-spec start_link() -> {'ok', pid()} | {'error', term()}.
start_link() ->
- gen_server:start_link({local, timer_server}, ?MODULE, [], []).
+ gen_server:start_link({local, timer_server}, ?MODULE, [], []).
--spec init([]) -> {'ok', [], 'infinity'}.
+-spec init([]) -> {'ok', ets:tid()}.
init([]) ->
process_flag(trap_exit, true),
- ?TIMER_TAB = ets:new(?TIMER_TAB, [named_table,ordered_set,protected]),
- ?INTERVAL_TAB = ets:new(?INTERVAL_TAB, [named_table,protected]),
- {ok, [], infinity}.
-
--spec ensure_started() -> 'ok'.
-ensure_started() ->
- case whereis(timer_server) of
- undefined ->
- C = {timer_server, {?MODULE, start_link, []}, permanent, 1000,
- worker, [?MODULE]},
- _ = supervisor:start_child(kernel_safe_sup, C),
- ok;
- _ -> ok
- end.
+ Tab = ets:new(?MODULE, []),
+ {ok, Tab}.
%% server calls
+%% Try sending a call. If it fails with reason noproc,
+%% try starting the timer server and try once again.
req(Req, Arg) ->
- SysTime = system_time(),
- ensure_started(),
- gen_server:call(timer_server, {Req, Arg, SysTime}, infinity).
+ try
+ maybe_req(Req, Arg)
+ catch
+ exit:{noproc, _} ->
+ {ok, _Pid} = do_start(),
+ maybe_req(Req, Arg)
+ end.
-%%
-%% handle_call(Request, From, Timers) ->
-%% {reply, Response, Timers, Timeout}
-%%
-%% Time and Timeout is in milliseconds. Started is in microseconds.
-%%
--type timers() :: term(). % XXX: refine?
-
--spec handle_call(term(), term(), timers()) ->
- {'reply', term(), timers(), timeout()} | {'noreply', timers(), timeout()}.
-handle_call({apply_after, {Time, Op}, Started}, _From, _Ts)
- when is_integer(Time), Time >= 0 ->
- BRef = {Started + 1000*Time, make_ref()},
- Timer = {BRef, timeout, Op},
- ets:insert(?TIMER_TAB, Timer),
- Timeout = timer_timeout(system_time()),
- {reply, {ok, BRef}, [], Timeout};
-handle_call({apply_interval, {Time, To, MFA}, Started}, _From, _Ts)
- when is_integer(Time), Time >= 0 ->
- %% To must be a pid or a registered name
- case get_pid(To) of
- Pid when is_pid(Pid) ->
- catch link(Pid),
- SysTime = system_time(),
- Ref = make_ref(),
- BRef1 = {interval, Ref},
- Interval = Time*1000,
- BRef2 = {Started + Interval, Ref},
- Timer = {BRef2, {repeat, Interval, Pid}, MFA},
- ets:insert(?INTERVAL_TAB, {BRef1,BRef2,Pid}),
- ets:insert(?TIMER_TAB, Timer),
- Timeout = timer_timeout(SysTime),
- {reply, {ok, BRef1}, [], Timeout};
- _ ->
- {reply, {error, badarg}, [], next_timeout()}
- end;
-handle_call({cancel, BRef = {_Time, Ref}, _}, _From, Ts)
- when is_reference(Ref) ->
- delete_ref(BRef),
- {reply, {ok, cancel}, Ts, next_timeout()};
-handle_call({cancel, _BRef, _}, _From, Ts) ->
- {reply, {error, badarg}, Ts, next_timeout()};
-handle_call({apply_after, _, _}, _From, Ts) ->
- {reply, {error, badarg}, Ts, next_timeout()};
-handle_call({apply_interval, _, _}, _From, Ts) ->
- {reply, {error, badarg}, Ts, next_timeout()};
-handle_call(_Else, _From, Ts) -> % Catch anything else
- {noreply, Ts, next_timeout()}.
-
--spec handle_info(term(), timers()) -> {'noreply', timers(), timeout()}.
-handle_info(timeout, Ts) -> % Handle timeouts
- Timeout = timer_timeout(system_time()),
- {noreply, Ts, Timeout};
-handle_info({'EXIT', Pid, _Reason}, Ts) -> % Oops, someone died
- pid_delete(Pid),
- {noreply, Ts, next_timeout()};
-handle_info(_OtherMsg, Ts) -> % Other Msg's
- {noreply, Ts, next_timeout()}.
-
--spec handle_cast(term(), timers()) -> {'noreply', timers(), timeout()}.
-handle_cast(_Req, Ts) -> % Not predicted but handled
- {noreply, Ts, next_timeout()}.
-
--spec terminate(term(), _State) -> 'ok'.
-terminate(_Reason, _State) ->
+maybe_req(Req, Arg) ->
+ gen_server:call(timer_server, {Req, Arg}, infinity).
+
+%% Call handling.
+-spec handle_call(term(), term(), Tab) ->
+ {'reply', term(), Tab} | {'noreply', Tab} when
+ Tab :: ets:tid().
+%% Start a one-shot timer.
+handle_call({apply_once, {Started, Time, MFA}}, _From, Tab) ->
+ Timeout = Started + Time,
+ Reply = try
+ erlang:start_timer(
+ Timeout,
+ self(),
+ {apply_once, MFA},
+ [{abs, true}]
+ )
+ of
+ SRef ->
+ ets:insert(Tab, {SRef, SRef}),
+ {ok, {once, SRef}}
+ catch
+ error:badarg ->
+ {error, badarg}
+ end,
+ {reply, Reply, Tab};
+%% Start an interval timer.
+handle_call({apply_interval, {Started, Time, Pid, MFA}}, _From, Tab) ->
+ NextTimeout = Started + Time,
+ TRef = monitor(process, Pid),
+ Reply = try
+ erlang:start_timer(
+ NextTimeout,
+ self(),
+ {apply_interval, NextTimeout, Time, TRef, MFA},
+ [{abs, true}]
+ )
+ of
+ SRef ->
+ ets:insert(Tab, {TRef, SRef}),
+ {ok, {interval, TRef}}
+ catch
+ error:badarg ->
+ demonitor(TRef, [flush]),
+ {error, badarg}
+ end,
+ {reply, Reply, Tab};
+%% Cancel a one-shot timer.
+handle_call({cancel, {once, TRef}}, _From, Tab) ->
+ _ = remove_timer(TRef, Tab),
+ {reply, {ok, cancel}, Tab};
+%% Cancel an interval timer.
+handle_call({cancel, {interval, TRef}}, _From, Tab) ->
+ _ = case remove_timer(TRef, Tab) of
+ true ->
+ demonitor(TRef, [flush]);
+ false ->
+ ok
+ end,
+ {reply, {ok, cancel}, Tab};
+%% Unexpected.
+handle_call(_Req, _From, Tab) ->
+ {noreply, Tab}.
+
+%% Info handling.
+-spec handle_info(term(), Tab) -> {'noreply', Tab}
+ when Tab :: ets:tid().
+%% One-shot timer timeout.
+handle_info({timeout, TRef, {apply_once, MFA}}, Tab) ->
+ case ets:take(Tab, TRef) of
+ [{TRef, _SRef}] ->
+ do_apply(MFA);
+ [] ->
+ ok
+ end,
+ {noreply, Tab};
+%% Interval timer timeout.
+handle_info({timeout, _, {apply_interval, CurTimeout, Time, TRef, MFA}}, Tab) ->
+ case ets:member(Tab, TRef) of
+ true ->
+ NextTimeout = CurTimeout + Time,
+ SRef = erlang:start_timer(
+ NextTimeout,
+ self(),
+ {apply_interval, NextTimeout, Time, TRef, MFA},
+ [{abs, true}]
+ ),
+ ets:update_element(Tab, TRef, {2, SRef}),
+ do_apply(MFA);
+ false ->
+ ok
+ end,
+ {noreply, Tab};
+%% A process related to an interval timer died.
+handle_info({'DOWN', TRef, process, _Pid, _Reason}, Tab) ->
+ _ = remove_timer(TRef, Tab),
+ {noreply, Tab};
+%% Unexpected.
+handle_info(_Req, Tab) ->
+ {noreply, Tab}.
+
+%% Cast handling.
+-spec handle_cast(term(), Tab) -> {'noreply', Tab}
+ when Tab :: ets:tid().
+%% Unexpected.
+handle_cast(_Req, Tab) ->
+ {noreply, Tab}.
+
+-spec terminate(term(), _Tab) -> 'ok'.
+terminate(_Reason, _Tab) ->
ok.
-spec code_change(term(), State, term()) -> {'ok', State}.
-code_change(_OldVsn, State, _Extra) ->
+code_change(_OldVsn, Tab, _Extra) ->
%% According to the man for gen server no timer can be set here.
- {ok, State}.
-
-%%
-%% timer_timeout(SysTime)
-%%
-%% Apply and remove already timed-out timers. A timer is a tuple
-%% {Time, BRef, Op, MFA}, where Time is in microseconds.
-%% Returns {Timeout, Timers}, where Timeout is in milliseconds.
-%%
-timer_timeout(SysTime) ->
- case ets:first(?TIMER_TAB) of
- '$end_of_table' ->
- infinity;
- {Time, _Ref} when Time > SysTime ->
- Timeout = (Time - SysTime + 999) div 1000,
- %% Returned timeout must fit in a small int
- erlang:min(Timeout, ?MAX_TIMEOUT);
- Key ->
- case ets:lookup(?TIMER_TAB, Key) of
- [{Key, timeout, MFA}] ->
- ets:delete(?TIMER_TAB,Key),
- do_apply(MFA),
- timer_timeout(SysTime);
- [{{Time, Ref}, Repeat = {repeat, Interv, To}, MFA}] ->
- ets:delete(?TIMER_TAB,Key),
- NewTime = Time + Interv,
- %% Update the interval entry (last in table)
- ets:insert(?INTERVAL_TAB,{{interval,Ref},{NewTime,Ref},To}),
- do_apply(MFA),
- ets:insert(?TIMER_TAB, {{NewTime, Ref}, Repeat, MFA}),
- timer_timeout(SysTime)
- end
- end.
-
-%%
-%% delete_ref
-%%
-
-delete_ref(BRef = {interval, _}) ->
- case ets:lookup(?INTERVAL_TAB, BRef) of
- [{_, BRef2, _Pid}] ->
- ets:delete(?INTERVAL_TAB, BRef),
- ets:delete(?TIMER_TAB, BRef2);
- _ -> % TimerReference does not exist, do nothing
- ok
- end;
-delete_ref(BRef) ->
- ets:delete(?TIMER_TAB, BRef).
-
-%%
-%% pid_delete
-%%
-
--spec pid_delete(pid()) -> 'ok'.
-pid_delete(Pid) ->
- IntervalTimerList =
- ets:select(?INTERVAL_TAB,
- [{{'_', '_','$1'},
- [{'==','$1',Pid}],
- ['$_']}]),
- lists:foreach(fun({IntKey, TimerKey, _ }) ->
- ets:delete(?INTERVAL_TAB, IntKey),
- ets:delete(?TIMER_TAB, TimerKey)
- end, IntervalTimerList).
-
-%% Calculate time to the next timeout. Returned timeout must fit in a
-%% small int.
-
--spec next_timeout() -> timeout().
-next_timeout() ->
- case ets:first(?TIMER_TAB) of
- '$end_of_table' ->
- infinity;
- {Time, _} ->
- erlang:min(positive((Time - system_time() + 999) div 1000), ?MAX_TIMEOUT)
+ {ok, Tab}.
+
+%% Remove a timer.
+remove_timer(TRef, Tab) ->
+ case ets:take(Tab, TRef) of
+ [{TRef, SRef}] ->
+ ok = erlang:cancel_timer(SRef, [{async, true}, {info, false}]),
+ true;
+ [] -> % TimerReference does not exist, do nothing
+ false
end.
%% Help functions
-do_apply({M,F,A}) ->
- case {M, F, A} of
- {?MODULE, send, A} ->
- %% If send op. send directly, (faster than spawn)
- catch send(A);
- {erlang, exit, [Name, Reason]} ->
- catch exit(get_pid(Name), Reason);
- _ ->
- %% else spawn process with the operation
- catch spawn(M,F,A)
- end.
-
-positive(X) ->
- erlang:max(X, 0).
+%% If send op. send directly (faster than spawn)
+do_apply({?MODULE, send, A}) ->
+ catch send(A);
+%% If exit op. resolve registered name
+do_apply({erlang, exit, [Name, Reason]}) ->
+ catch exit(get_pid(Name), Reason);
+do_apply({M,F,A}) ->
+ catch spawn(M, F, A).
-%%
-%% system_time() -> time in microseconds
-%%
+%% Get current time in milliseconds,
+%% ceil'ed to the next millisecond.
system_time() ->
- erlang:monotonic_time(1000000).
+ (erlang:monotonic_time(microsecond) + 999) div 1000.
send([Pid, Msg]) ->
Pid ! Msg.
+%% Resolve a registered name.
get_pid(Name) when is_pid(Name) ->
Name;
get_pid(undefined) ->
@@ -455,22 +519,3 @@ get_pid(Name) when is_atom(Name) ->
get_pid(whereis(Name));
get_pid(_) ->
undefined.
-
-%%
-%% get_status() ->
-%% {{TimerTabName,TotalNumTimers},{IntervalTabName,NumIntervalTimers}}
-%%
-%% This function is for test purposes only; it is used by the test suite.
-%% There is a small possibility that there is a mismatch of one entry
-%% between the 2 tables if this call is made when the timer server is
-%% in the middle of a transaction
-
--spec get_status() ->
- {{?TIMER_TAB,non_neg_integer()},{?INTERVAL_TAB,non_neg_integer()}}.
-
-get_status() ->
- Info1 = ets:info(?TIMER_TAB),
- {size,TotalNumTimers} = lists:keyfind(size, 1, Info1),
- Info2 = ets:info(?INTERVAL_TAB),
- {size,NumIntervalTimers} = lists:keyfind(size, 1, Info2),
- {{?TIMER_TAB,TotalNumTimers},{?INTERVAL_TAB,NumIntervalTimers}}.
diff --git a/lib/stdlib/src/unicode.erl b/lib/stdlib/src/unicode.erl
index 7ae5dec878..20c92a1a4a 100644
--- a/lib/stdlib/src/unicode.erl
+++ b/lib/stdlib/src/unicode.erl
@@ -390,6 +390,8 @@ characters_to_binary_int(ML, InEncoding) ->
fake_stacktrace(Reason, characters_to_binary, [ML, InEncoding])
end.
+-spec fake_stacktrace(term(), atom(), [term()]) -> no_return().
+
fake_stacktrace(Reason, Name, Args) ->
try
error(new_stacktrace, Args)
diff --git a/lib/stdlib/src/uri_string.erl b/lib/stdlib/src/uri_string.erl
index 3060f2bfaa..dbbb835036 100644
--- a/lib/stdlib/src/uri_string.erl
+++ b/lib/stdlib/src/uri_string.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -237,7 +237,10 @@
recompose/1,
resolve/2,
resolve/3,
- transcode/2]).
+ transcode/2,
+ quote/1,
+ quote/2,
+ unquote/1]).
-export_type([error/0,
uri_map/0,
uri_string/0]).
@@ -518,6 +521,29 @@ percent_decode(URI) when is_list(URI) orelse
is_binary(URI) ->
raw_decode(URI).
+-spec quote(Data) -> QuotedData when
+ Data :: unicode:chardata(),
+ QuotedData :: unicode:chardata().
+quote(D) ->
+ encode(D, fun is_unreserved/1).
+
+-spec quote(Data, Safe) -> QuotedData when
+ Data :: unicode:chardata(),
+ Safe :: string(),
+ QuotedData :: unicode:chardata().
+quote(D, Safe) ->
+ UnreservedOrSafe =
+ fun(C) ->
+ is_unreserved(C) orelse lists:member(C, Safe)
+ end,
+ encode(D, UnreservedOrSafe).
+
+-spec unquote(QuotedData) -> Data when
+ QuotedData :: unicode:chardata(),
+ Data :: unicode:chardata().
+unquote(D) ->
+ raw_decode(D).
+
%%-------------------------------------------------------------------------
%% Functions for working with the query part of a URI as a list
%% of key/value pairs.
@@ -2216,8 +2242,9 @@ base10_decode_unicode(<<H,_/binary>>, _, _) ->
normalize_map(URIMap) ->
normalize_path_segment(
normalize_scheme_based(
- normalize_percent_encoding(
- normalize_case(URIMap)))).
+ normalize_undefined_port(
+ normalize_percent_encoding(
+ normalize_case(URIMap))))).
%% 6.2.2.1. Case Normalization
@@ -2357,28 +2384,30 @@ normalize_scheme_based(Map, _, _, _) ->
normalize_http(Map, Port, Path) ->
- M1 = normalize_port(Map, Port, 80),
+ M1 = normalize_default_port(Map, Port, 80),
normalize_http_path(M1, Path).
normalize_https(Map, Port, Path) ->
- M1 = normalize_port(Map, Port, 443),
+ M1 = normalize_default_port(Map, Port, 443),
normalize_http_path(M1, Path).
normalize_ftp(Map, Port) ->
- normalize_port(Map, Port, 21).
+ normalize_default_port(Map, Port, 21).
normalize_ssh_sftp(Map, Port) ->
- normalize_port(Map, Port, 22).
+ normalize_default_port(Map, Port, 22).
normalize_tftp(Map, Port) ->
- normalize_port(Map, Port, 69).
+ normalize_default_port(Map, Port, 69).
-normalize_port(Map, Port, Default) ->
+%% RFC 3986, 3.2.3. Port
+%% RFC 3986, 6.2.3. Scheme-Based Normalization
+normalize_default_port(Map, Port, Default) ->
case Port of
Default ->
maps:remove(port, Map);
@@ -2387,6 +2416,12 @@ normalize_port(Map, Port, Default) ->
end.
+normalize_undefined_port(#{port := undefined} = Map) ->
+ maps:remove(port, Map);
+normalize_undefined_port(#{} = Map) ->
+ Map.
+
+
normalize_http_path(Map, Path) ->
case Path of
"" ->
diff --git a/lib/stdlib/src/zip.erl b/lib/stdlib/src/zip.erl
index 4c606761ba..68a678f735 100644
--- a/lib/stdlib/src/zip.erl
+++ b/lib/stdlib/src/zip.erl
@@ -51,7 +51,7 @@
-define(WRITE_BLOCK_SIZE, 8*1024).
%% for debugging, to turn off catch
--define(CATCH, catch).
+-define(CATCH(Expr), (catch (Expr))).
%% Debug.
-define(SHOW_GP_BIT_11(B, F), ok).
@@ -227,7 +227,7 @@ openzip_open(F) ->
openzip_open(F, []).
openzip_open(F, Options) ->
- case ?CATCH do_openzip_open(F, Options) of
+ case ?CATCH(do_openzip_open(F, Options)) of
{ok, OpenZip} ->
{ok, OpenZip};
Error ->
@@ -252,7 +252,7 @@ do_openzip_open(F, Options) ->
%% retrieve all files from an open archive
openzip_get(OpenZip) ->
- case ?CATCH do_openzip_get(OpenZip) of
+ case ?CATCH(do_openzip_get(OpenZip)) of
{ok, Result} -> {ok, Result};
Error -> {error, Error}
end.
@@ -269,7 +269,7 @@ do_openzip_get(_) ->
%% retrieve a file from an open archive
openzip_get(FileName, OpenZip) ->
- case ?CATCH do_openzip_get(FileName, OpenZip) of
+ case ?CATCH(do_openzip_get(FileName, OpenZip)) of
{ok, Result} -> {ok, Result};
Error -> {error, Error}
end.
@@ -372,7 +372,7 @@ unzip(F) -> unzip(F, []).
| {error, {Name :: file:name(), Reason :: term()}}).
unzip(F, Options) ->
- case ?CATCH do_unzip(F, Options) of
+ case ?CATCH(do_unzip(F, Options)) of
{ok, R} -> {ok, R};
Error -> {error, Error}
end.
@@ -452,7 +452,7 @@ zip(F, Files) -> zip(F, Files, []).
| {error, Reason :: term()}).
zip(F, Files, Options) ->
- case ?CATCH do_zip(F, Files, Options) of
+ case ?CATCH(do_zip(F, Files, Options)) of
{ok, R} -> {ok, R};
Error -> {error, Error}
end.
@@ -496,7 +496,7 @@ list_dir(F) -> list_dir(F, []).
Option :: cooked).
list_dir(F, Options) ->
- case ?CATCH do_list_dir(F, Options) of
+ case ?CATCH(do_list_dir(F, Options)) of
{ok, R} -> {ok, R};
Error -> {error, Error}
end.
@@ -521,7 +521,7 @@ t(F) when is_record(F, openzip) -> openzip_t(F);
t(F) -> t(F, fun raw_short_print_info_etc/5).
t(F, RawPrint) ->
- case ?CATCH do_t(F, RawPrint) of
+ case ?CATCH(do_t(F, RawPrint)) of
ok -> ok;
Error -> {error, Error}
end.
@@ -1543,7 +1543,7 @@ get_z_data(?DEFLATED, In0, FileName, CompSize, Input, Output, OpO, Z) ->
Out0 = Output({open, FileName, [write | OpO]}, []),
CRC0 = 0,
{In1, Out1, UncompSize, CRC} = get_z_data_loop(CompSize, 0, In0, Out0, Input, Output, CRC0, Z),
- ?CATCH zlib:inflateEnd(Z),
+ _ = ?CATCH(zlib:inflateEnd(Z)),
Out2 = Output({close, FileName}, Out1),
{Out2, In1, CRC, UncompSize};
get_z_data(?STORED, In0, FileName, CompSize, Input, Output, OpO, _Z) ->
diff --git a/lib/stdlib/test/Makefile b/lib/stdlib/test/Makefile
index bda16c263d..18d3a083a3 100644
--- a/lib/stdlib/test/Makefile
+++ b/lib/stdlib/test/Makefile
@@ -51,6 +51,7 @@ MODULES= \
log_mf_h_SUITE \
math_SUITE \
ms_transform_SUITE \
+ peer_SUITE \
pool_SUITE \
proc_lib_SUITE \
proplists_SUITE \
@@ -100,8 +101,13 @@ MODULES= \
zzz_SUITE
ERTS_MODULES= erts_test_utils
+SASL_MODULES= otp_vsns
-ERL_FILES= $(MODULES:%=%.erl) $(ERTS_MODULES:%=$(ERL_TOP)/erts/emulator/test/%.erl)
+ERL_FILES= $(MODULES:%=%.erl) \
+ $(ERTS_MODULES:%=$(ERL_TOP)/erts/emulator/test/%.erl) \
+ $(SASL_MODULES:%=$(ERL_TOP)/lib/sasl/test/%.erl)
+
+EXTRA_FILES= $(ERL_TOP)/otp_versions.table
# ----------------------------------------------------
# Release directory specification
@@ -112,7 +118,6 @@ RELSYSDIR = $(RELEASE_PATH)/stdlib_test
# FLAGS
# ----------------------------------------------------
-ERL_MAKE_FLAGS +=
ERL_COMPILE_FLAGS += -I$(ERL_TOP)/lib/kernel/include \
-I$(ERL_TOP)/lib/stdlib/include
@@ -126,10 +131,11 @@ COVERFILE=stdlib.cover
# ----------------------------------------------------
make_emakefile:
- $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES) $(ERTS_MODULES) \
+ $(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) \
+ $(MODULES) $(ERTS_MODULES) $(SASL_MODULES) \
> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
@@ -149,8 +155,9 @@ release_spec: opt
release_tests_spec: make_emakefile
$(INSTALL_DIR) "$(RELSYSDIR)"
$(INSTALL_DATA) stdlib.spec stdlib_bench.spec error_info.spec $(EMAKEFILE) \
- $(ERL_FILES) $(COVERFILE) "$(RELSYSDIR)"
+ $(ERL_FILES) $(COVERFILE) $(EXTRA_FILES) "$(RELSYSDIR)"
chmod -R u+w "$(RELSYSDIR)"
@tar cf - *_SUITE_data property_test | (cd "$(RELSYSDIR)"; tar xf -)
+ $(INSTALL_DATA) $(ERL_TOP)/make/otp_version_tickets "$(RELSYSDIR)/stdlib_SUITE_data"
release_docs_spec:
diff --git a/lib/stdlib/test/beam_lib_SUITE.erl b/lib/stdlib/test/beam_lib_SUITE.erl
index 097d88c7ec..a2e4aa6650 100644
--- a/lib/stdlib/test/beam_lib_SUITE.erl
+++ b/lib/stdlib/test/beam_lib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -58,7 +58,16 @@ init_per_suite(Config) ->
Config.
end_per_suite(_Config) ->
- ok.
+ %% Cleanup after strip and strip_add_chunks
+ case code:is_sticky(sofs) of
+ false ->
+ false = code:purge(sofs),
+ {module, sofs} = code:load_file(sofs),
+ code:stick_mod(sofs),
+ ok;
+ true ->
+ ok
+ end.
init_per_group(_GroupName, Config) ->
Config.
@@ -85,7 +94,6 @@ normal(Conf) when is_list(Conf) ->
P0 = pps(),
do_normal(Source, PrivDir, BeamFile, []),
- do_normal(Source, PrivDir, BeamFile, [no_utf8_atoms]),
{ok,_} = compile:file(Source, [{outdir,PrivDir}, no_debug_info]),
{ok, {simple, [{debug_info, {debug_info_v1, erl_abstract_code, {none, _}}}]}} =
@@ -384,22 +392,29 @@ strip(Conf) when is_list(Conf) ->
{ok, [{simple,_},{simple2,_},{make_fun,_},{constant,_}]} =
beam_lib:strip_files([BeamFileD1, BeamFile2D1, BeamFile3D1, BeamFile4D1]),
+ %% strip a complex module
+ OrigSofsPath = code:where_is_file("sofs.beam"),
+ BeamFileSofs = filename:join(PrivDir,"sofs.beam"),
+ file:copy(OrigSofsPath, BeamFileSofs),
+ {ok, {sofs,_}} = beam_lib:strip(BeamFileSofs),
+ code:unstick_mod(sofs),
+ false = code:purge(sofs),
+
%% check that each module can be loaded.
{module, simple} = code:load_abs(filename:rootname(BeamFileD1)),
{module, simple2} = code:load_abs(filename:rootname(BeamFile2D1)),
{module, make_fun} = code:load_abs(filename:rootname(BeamFile3D1)),
{module, constant} = code:load_abs(filename:rootname(BeamFile4D1)),
+ {module, sofs} = code:load_abs(filename:rootname(BeamFileSofs)),
%% check that line number information is still present after stripping
{module, lines} = code:load_abs(filename:rootname(BeamFile5D1)),
- {'EXIT',{badarith,[{lines,t,1,Info}|_]}} =
- (catch lines:t(atom)),
+ Info = get_line_number_info(),
true = code:delete(lines),
false = code:purge(lines),
{ok, {lines,BeamFile5D1}} = beam_lib:strip(BeamFile5D1),
{module, lines} = code:load_abs(filename:rootname(BeamFile5D1)),
- {'EXIT',{badarith,[{lines,t,1,Info}|_]}} =
- (catch lines:t(atom)),
+ Info = get_line_number_info(),
true = (P0 == pps()),
NoOfTables = erlang:system_info(ets_count),
@@ -408,7 +423,12 @@ strip(Conf) when is_list(Conf) ->
Source2D1, BeamFile2D1,
Source3D1, BeamFile3D1,
Source4D1, BeamFile4D1,
- Source5D1, BeamFile5D1]),
+ Source5D1, BeamFile5D1,
+ BeamFileSofs]),
+
+ false = code:purge(sofs),
+ {module, sofs} = code:load_file(sofs),
+ code:stick_mod(sofs),
ok.
strip_add_chunks(Conf) when is_list(Conf) ->
@@ -433,7 +453,8 @@ strip_add_chunks(Conf) when is_list(Conf) ->
compare_chunks(B1, NB1, NBId1),
%% Keep all the extra chunks
- ExtraChunks = ["Abst" , "Dbgi" , "Attr" , "CInf" , "LocT" , "Atom" ],
+ ExtraChunks = ["Abst", "Dbgi", "Attr", "CInf", "LocT", "Atom",
+ "Type", "Meta"],
{ok, {simple, AB1}} = beam_lib:strip(B1, ExtraChunks),
ABId1 = chunk_ids(AB1),
true = length(BId1) == length(ABId1),
@@ -450,20 +471,29 @@ strip_add_chunks(Conf) when is_list(Conf) ->
{ok, [{simple,_},{simple2,_},{make_fun,_},{constant,_}]} =
beam_lib:strip_files([BeamFileD1, BeamFile2D1, BeamFile3D1, BeamFile4D1], ExtraChunks),
+ %% strip a complex module
+ OrigSofsPath = code:where_is_file("sofs.beam"),
+ BeamFileSofs = filename:join(PrivDir,"sofs.beam"),
+ file:copy(OrigSofsPath, BeamFileSofs),
+ {ok, {sofs,_}} = beam_lib:strip(BeamFileSofs, ExtraChunks),
+ code:unstick_mod(sofs),
+ false = code:purge(sofs),
+
%% check that each module can be loaded.
{module, simple} = code:load_abs(filename:rootname(BeamFileD1)),
{module, simple2} = code:load_abs(filename:rootname(BeamFile2D1)),
{module, make_fun} = code:load_abs(filename:rootname(BeamFile3D1)),
{module, constant} = code:load_abs(filename:rootname(BeamFile4D1)),
+ {module, sofs} = code:load_abs(filename:rootname(BeamFileSofs)),
%% check that line number information is still present after stripping
{module, lines} = code:load_abs(filename:rootname(BeamFile5D1)),
- {'EXIT',{badarith,[{lines,t,1,Info}|_]}} = (catch lines:t(atom)),
+ Info = get_line_number_info(),
false = code:purge(lines),
true = code:delete(lines),
{ok, {lines,BeamFile5D1}} = beam_lib:strip(BeamFile5D1),
{module, lines} = code:load_abs(filename:rootname(BeamFile5D1)),
- {'EXIT',{badarith,[{lines,t,1,Info}|_]}} = (catch lines:t(atom)),
+ Info = get_line_number_info(),
true = (P0 == pps()),
NoOfTables = erlang:system_info(ets_count),
@@ -472,7 +502,13 @@ strip_add_chunks(Conf) when is_list(Conf) ->
Source2D1, BeamFile2D1,
Source3D1, BeamFile3D1,
Source4D1, BeamFile4D1,
- Source5D1, BeamFile5D1]),
+ Source5D1, BeamFile5D1,
+ BeamFileSofs]),
+
+ false = code:purge(sofs),
+ {module, sofs} = code:load_file(sofs),
+ code:stick_mod(sofs),
+
ok.
otp_6711(Conf) when is_list(Conf) ->
@@ -964,3 +1000,13 @@ run_if_crypto_works(Test) ->
{skip,"The crypto application is missing or broken"}
end.
+get_line_number_info() ->
+ %% The stacktrace for operators such a '+' can vary depending on
+ %% whether the JIT is used or not.
+ case catch lines:t(atom) of
+ {'EXIT',{badarith,[{erlang,'+',[atom,1],_},
+ {lines,t,1,Info}|_]}} ->
+ Info;
+ {'EXIT',{badarith,[{lines,t,1,Info}|_]}} ->
+ Info
+ end.
diff --git a/lib/stdlib/test/c_SUITE.erl b/lib/stdlib/test/c_SUITE.erl
index a52bda8910..315ae64173 100644
--- a/lib/stdlib/test/c_SUITE.erl
+++ b/lib/stdlib/test/c_SUITE.erl
@@ -180,7 +180,7 @@ ls(Config) when is_list(Config) ->
ok = c:ls(File),
ok = c:ls([[[[File]]]]),
ok = c:ls("no_such_file"),
- ok = c:ls(list_to_atom(code:which(c))),
+ ok = c:ls(code:where_is_file("c.beam")),
ok.
%% Check that c:memory/[0,1] returns consistent results.
diff --git a/lib/stdlib/test/calendar_SUITE.erl b/lib/stdlib/test/calendar_SUITE.erl
index bea5a217db..7bda4ca782 100644
--- a/lib/stdlib/test/calendar_SUITE.erl
+++ b/lib/stdlib/test/calendar_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -112,21 +112,23 @@ leap_years(Config) when is_list(Config) ->
last_day_of_the_month(Config) when is_list(Config) ->
check_last_day_of_the_month({?START_YEAR, 1}, {?END_YEAR, 1}).
-%% Tests local_time_to_universal_time_dst for MET.
+%% Tests local_time_to_universal_time_dst for CET/CEST/MET/MEST.
local_time_to_universal_time_dst(Config) when is_list(Config) ->
case os:type() of
{unix,_} ->
case os:cmd("date '+%Z'") of
- "SAST"++_ ->
- {comment, "Spoky time zone with zero-set DST, skipped"};
+ "ME"++_ -> %% covers MET/MEST
+ local_time_to_universal_time_dst_x(Config);
+ "CE"++_ -> %% covers CET/CEST
+ local_time_to_universal_time_dst_x(Config);
_ ->
- local_time_to_universal_time_dst_x(Config)
+ {skip, "This test runs only for MET/MEST/CET/CEST"}
end;
_ ->
local_time_to_universal_time_dst_x(Config)
end.
local_time_to_universal_time_dst_x(Config) when is_list(Config) ->
- %% Assumes MET (UTC+1 / UTC+2(dst)
+ %% Assumes CET (UTC+1 / UTC+2(dst) or MET (same as CET)
LtW = {{2003,01,15},{14,00,00}}, % Winter
UtW = {{2003,01,15},{13,00,00}}, %
UtWd = {{2003,01,15},{12,00,00}}, % dst
@@ -192,15 +194,19 @@ rfc3339(Config) when is_list(Config) ->
Mys = [{unit, microsecond}],
Ns = [{unit, nanosecond}],
S = [{unit, second}],
+ Na = [{unit, native}],
D = [{time_designator, $\s}],
Z = [{offset, "Z"}],
"1985-04-12T23:20:50.520Z" = test_parse("1985-04-12T23:20:50.52Z", Ms),
- "1985-04-12T23:20:50.520Z" = test_parse("1985-04-12t23:20:50.52z", Ms),
+ "1985-04-12T23:20:50.520Z" = test_parse("1985-04-12t23:20:50.52z", Na),
"1985-04-12T21:20:50.520Z" =
test_parse("1985-04-12T23:20:50.52+02:00", Ms),
+ "1985-04-12T21:20:50.520Z" =
+ test_parse("1985-04-12T23:20:50.52+02:00", Na),
"1985-04-12T23:20:50Z" = test_parse("1985-04-12T23:20:50.52Z", S),
"1985-04-12T23:20:50.520Z" = test_parse("1985-04-12T23:20:50.52Z", Ms),
+ "1985-04-12T23:20:50.520Z" = test_parse("1985-04-12T23:20:50.52Z", Na),
"1985-04-12T23:20:50.520000Z" =
test_parse("1985-04-12t23:20:50.52z", Mys),
"1985-04-12 21:20:50.520000000Z" =
@@ -216,13 +222,15 @@ rfc3339(Config) when is_list(Config) ->
"9999-12-31T23:59:59Z" = do_format_z(253402300799, []),
"9999-12-31T23:59:59.999Z" = do_format_z(253402300799*1000+999, Ms),
+ NaPerSec = erlang:convert_time_unit(1, second, native),
+ "9999-12-31T23:59:59.999Z" = do_format_z(253402300799*NaPerSec+(NaPerSec-1), Na),
"9999-12-31T23:59:59.999999Z" =
- do_format_z(253402300799*1000000+999999, Mys),
+ do_format_z(253402300799*1_000_000+999_999, Mys),
"9999-12-31T23:59:59.999999999Z" =
- do_format_z(253402300799*1000000000+999999999, Ns),
+ do_format_z(253402300799*1_000_000_000+999_999_999, Ns),
{'EXIT', _} = (catch do_format_z(253402300799+1, [])),
{'EXIT', _} = (catch do_parse("9999-12-31T23:59:60Z", [])),
- {'EXIT', _} = (catch do_format_z(253402300799*1000000000+999999999+1, Ns)),
+ {'EXIT', _} = (catch do_format_z(253402300799*1_000_000_000+999_999_999+1, Ns)),
{'EXIT', _} = (catch do_parse("2010-04-11T22:35:41", [])), % OTP-16514
253402300799 = do_parse("9999-12-31T23:59:59Z", []),
@@ -236,6 +244,7 @@ rfc3339(Config) when is_list(Config) ->
"1970-01-02T00:00:00Z" = test_parse("1970-01-01T23:59:60.5Z"),
"1970-01-02T00:00:00Z" = test_parse("1970-01-01T23:59:60.55Z"),
"1970-01-02T00:00:00.550Z" = test_parse("1970-01-01T23:59:60.55Z", Ms),
+ "1970-01-02T00:00:00.550Z" = test_parse("1970-01-01T23:59:60.55Z", Na),
"1970-01-02T00:00:00.550000Z" =
test_parse("1970-01-01T23:59:60.55Z", Mys),
"1970-01-02T00:00:00.550000000Z" =
@@ -263,33 +272,42 @@ rfc3339(Config) when is_list(Config) ->
Str = "2000-01-01T10:02:00+00:02",
Str = do_format(TO, [{offset, 120}]),
"2000-01-01T10:02:00.000+00:02" =
- do_format(TO * 1000, [{offset, 120 * 1000}]++Ms),
+ do_format(TO * 1000, [{offset, 120_000}]++Ms),
"2000-01-01T10:02:00.000000+00:02" =
- do_format(TO * 1000 * 1000, [{offset, 120 * 1000 * 1000}]++Mys),
+ do_format(TO * 1_000_000, [{offset, 120_000_000}]++Mys),
"2000-01-01T10:02:00.000000000+00:02" =
- do_format(TO * 1000 * 1000 * 1000,
- [{offset, 120 * 1000 * 1000 * 1000}]++Ns),
+ do_format(TO * 1_000_000_000,
+ [{offset, 120_000_000_000}]++Ns),
+ "2000-01-01T10:02:00.000+00:02" =
+ do_format(TO * NaPerSec, [{offset, 120 * NaPerSec}]++Na),
+
NStr = "2000-01-01T09:58:00-00:02",
NStr = do_format(TO, [{offset, -120}]),
"2000-01-01T09:58:00.000-00:02" =
- do_format(TO * 1000, [{offset, -120 * 1000}]++Ms),
+ do_format(TO * 1000, [{offset, -120_000}]++Ms),
+ "2000-01-01T09:58:00.000-00:02" =
+ do_format(TO * NaPerSec, [{offset, -120 * NaPerSec}]++Na),
"2000-01-01T09:58:00.000000-00:02" =
- do_format(TO * 1000 * 1000, [{offset, -120 * 1000 * 1000}]++Mys),
+ do_format(TO * 1_000_000, [{offset, -120_000_000}]++Mys),
"2000-01-01T09:58:00.000000000-00:02" =
- do_format(TO * 1000 * 1000 * 1000,
- [{offset, -120 * 1000 * 1000 * 1000}]++Ns),
+ do_format(TO * 1_000_000_000,
+ [{offset, -120_000_000_000}]++Ns),
+ "2000-01-01T09:58:00.000-00:02" =
+ do_format(TO * 1000, [{offset, -120_000}]++Ms),
+ "2000-01-01T09:58:00.000-00:02" =
+ do_format(TO * NaPerSec, [{offset, -120 * NaPerSec}]++Na),
- 543210000 = do_parse("1970-01-01T00:00:00.54321Z", Ns),
- 54321000 = do_parse("1970-01-01T00:00:00.054321Z", Ns),
- 543210 = do_parse("1970-01-01T00:00:00.54321Z", Mys),
+ 543_210_000 = do_parse("1970-01-01T00:00:00.54321Z", Ns),
+ 543_210_00 = do_parse("1970-01-01T00:00:00.054321Z", Ns),
+ 543_210 = do_parse("1970-01-01T00:00:00.54321Z", Mys),
543 = do_parse("1970-01-01T00:00:00.54321Z", Ms),
0 = do_parse("1970-01-01T00:00:00.000001Z", Ms),
1 = do_parse("1970-01-01T00:00:00.000001Z", Mys),
1000 = do_parse("1970-01-01T00:00:00.000001Z", Ns),
0 = do_parse("1970-01-01Q00:00:00.00049Z", Ms),
1 = do_parse("1970-01-01Q00:00:00.0005Z", Ms),
- 6543210 = do_parse("1970-01-01T00:00:06.54321Z", Mys),
+ 6543_210 = do_parse("1970-01-01T00:00:06.54321Z", Mys),
298815132000000 = do_parse("1979-06-21T12:12:12Z", Mys),
-1613826000000000 = do_parse("1918-11-11T11:00:00Z", Mys),
-1613833200000000 = do_parse("1918-11-11T11:00:00+02:00", Mys),
@@ -300,11 +318,11 @@ rfc3339(Config) when is_list(Config) ->
"1970-01-01T00:00:00.001Z" = do_format_z(1, Ms),
"1970-01-01T00:00:00.000001Z" = do_format_z(1, Mys),
"1970-01-01T00:00:00.000000001Z" = do_format_z(1, Ns),
- "1970-01-01T00:00:01.000000Z" = do_format_z(1000000, Mys),
- "1970-01-01T00:00:00.543210Z" = do_format_z(543210, Mys),
+ "1970-01-01T00:00:01.000000Z" = do_format_z(1_000_000, Mys),
+ "1970-01-01T00:00:00.543210Z" = do_format_z(543_210, Mys),
"1970-01-01T00:00:00.543Z" = do_format_z(543, Ms),
- "1970-01-01T00:00:00.543210000Z" = do_format_z(543210000, Ns),
- "1970-01-01T00:00:06.543210Z" = do_format_z(6543210, Mys),
+ "1970-01-01T00:00:00.543210000Z" = do_format_z(543_210_000, Ns),
+ "1970-01-01T00:00:06.543210Z" = do_format_z(6_543_210, Mys),
"1979-06-21T12:12:12.000000Z" = do_format_z(298815132000000, Mys),
"1918-11-11T13:00:00.000000Z" = do_format_z(-1613818800000000, Mys),
ok.
diff --git a/lib/stdlib/test/dets_SUITE.erl b/lib/stdlib/test/dets_SUITE.erl
index 51aa21f919..c50a2d5baf 100644
--- a/lib/stdlib/test/dets_SUITE.erl
+++ b/lib/stdlib/test/dets_SUITE.erl
@@ -115,9 +115,9 @@ end_per_group(_GroupName, Config) ->
%% OTP-3621
newly_started(Config) when is_list(Config) ->
true = is_alive(),
- {ok, Node} = test_server:start_node(slave1, slave, []),
+ {ok, Peer, Node} = ?CT_PEER(),
[] = rpc:call(Node, dets, all, []),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
basic(Config) when is_list(Config) ->
@@ -153,7 +153,7 @@ open(Config) when is_list(Config) ->
%% Running this test twice means that the Dets server is restarted
%% twice. dets_sup specifies a maximum of 4 restarts in an hour.
%% If this becomes a problem, one should consider running this
- %% test on a slave node.
+ %% test on a peer node.
{Sets, Bags, Dups} = args(Config),
@@ -373,12 +373,7 @@ dirty_mark(Config) when is_list(Config) ->
exit(other_process_dead)
end
end,
- {ok, Node} = test_server:start_node(dets_dirty_mark,
- slave,
- [{linked, false},
- {args, "-pa " ++
- filename:dirname
- (code:which(?MODULE))}]),
+ {ok, Peer, Node} = ?CT_PEER(),
ok = ensure_node(20, Node),
%% io:format("~p~n",[rpc:call(Node, code, get_path, [])]),
%% io:format("~p~n",[rpc:call(Node, file, get_cwd, [])]),
@@ -387,7 +382,7 @@ dirty_mark(Config) when is_list(Config) ->
[?MODULE, dets_dirty_loop, []]),
{ok, Tab} = Call(Pid, [open, Tab, [{file, FName}]]),
[{opel,germany}] = Call(Pid, [read,Tab,opel]),
- test_server:stop_node(Node),
+ peer:stop(Peer),
{ok, Tab} = dets:open_file(Tab,[{file, FName},
{repair,false}]),
ok = dets:close(Tab),
@@ -421,12 +416,7 @@ dirty_mark2(Config) when is_list(Config) ->
exit(other_process_dead)
end
end,
- {ok, Node} = test_server:start_node(dets_dirty_mark2,
- slave,
- [{linked, false},
- {args, "-pa " ++
- filename:dirname
- (code:which(?MODULE))}]),
+ {ok, Peer, Node} = ?CT_PEER(),
ok = ensure_node(20, Node),
Pid = rpc:call(Node,erlang, spawn,
[?MODULE, dets_dirty_loop, []]),
@@ -435,7 +425,7 @@ dirty_mark2(Config) when is_list(Config) ->
timer:sleep(2100),
%% Read something, just to give auto save time to finish.
[{opel,germany}] = Call(Pid, [read,Tab,opel]),
- test_server:stop_node(Node),
+ peer:stop(Peer),
{ok, Tab} = dets:open_file(Tab, [{file, FName}, {repair,false}]),
ok = dets:close(Tab),
file:delete(FName),
diff --git a/lib/stdlib/test/dummy_h.erl b/lib/stdlib/test/dummy_h.erl
index 7a9eb11f98..4fffcd86d8 100644
--- a/lib/stdlib/test/dummy_h.erl
+++ b/lib/stdlib/test/dummy_h.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@
%% Test event handler for gen_event_SUITE.erl
-export([init/1, handle_event/2, handle_call/2, handle_info/2,
- terminate/2]).
+ terminate/2, format_status/1]).
init(make_error) ->
{error, my_error};
@@ -63,6 +63,9 @@ handle_call(hibernate, _State) ->
handle_call(hibernate_later, _State) ->
timer:send_after(1000,sleep),
{ok,later,[]};
+handle_call({delayed_answer, T}, State) ->
+ receive after T -> ok end,
+ {ok, delayed, State};
handle_call(_Query, State) ->
{ok, ok, State}.
@@ -97,3 +100,5 @@ terminate(_Reason, {undef_in_terminate, {Mod, Fun}}) ->
terminate(_Reason, _State) ->
ok.
+format_status(#{ state := _State } = S) ->
+ S#{ state := "dummy1_h handler state" }.
diff --git a/lib/stdlib/test/epp_SUITE.erl b/lib/stdlib/test/epp_SUITE.erl
index d9462fc17b..3a62b79135 100644
--- a/lib/stdlib/test/epp_SUITE.erl
+++ b/lib/stdlib/test/epp_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -816,7 +816,8 @@ otp_8130(Config) when is_list(Config) ->
"t() -> ?a.\n"),
{ok,Epp} = epp:open(File, []),
PreDefMacs = macs(Epp),
- ['BASE_MODULE','BASE_MODULE_STRING','BEAM','FILE',
+ ['BASE_MODULE','BASE_MODULE_STRING','BEAM',
+ 'FEATURE_AVAILABLE', 'FEATURE_ENABLED','FILE',
'FUNCTION_ARITY','FUNCTION_NAME',
'LINE','MACHINE','MODULE','MODULE_STRING',
'OTP_RELEASE'] = PreDefMacs,
@@ -941,7 +942,7 @@ ifdef(Config) ->
"-else.\n"
"t() -> a.\n"
"-endif.\n">>,
- {errors,[{{3,1},epp,{bad,else}}],[]}},
+ {errors,[{{3,1},epp,{bad,'else'}}],[]}},
{ifdef_c8,
<<"-ifdef(a).\n"
@@ -1530,20 +1531,20 @@ otp_10820(Config) when is_list(Config) ->
Dir = proplists:get_value(priv_dir, Config),
File = filename:join(Dir, L++".erl"),
C1 = <<"%% coding: utf-8\n -module(any).">>,
- ok = do_otp_10820(File, C1, "+pc latin1"),
- ok = do_otp_10820(File, C1, "+pc unicode"),
+ ok = do_otp_10820(File, C1, ["+pc", "latin1"]),
+ ok = do_otp_10820(File, C1, ["+pc", "unicode"]),
C2 = <<"\n-module(any).">>,
- ok = do_otp_10820(File, C2, "+pc latin1"),
- ok = do_otp_10820(File, C2, "+pc unicode").
+ ok = do_otp_10820(File, C2, ["+pc", "latin1"]),
+ ok = do_otp_10820(File, C2, ["+pc", "unicode"]).
do_otp_10820(File, C, PC) ->
- {ok,Node} = start_node(erl_pp_helper, "+fnu " ++ PC),
+ {ok,Peer,Node} = ?CT_PEER(["+fnu"] ++ PC),
ok = rpc:call(Node, file, write_file, [File, C]),
{ok, Forms} = rpc:call(Node, epp, parse_file, [File, [],[]]),
[{attribute,1,file,{File,1}},
{attribute,2,module,any},
{eof,2}] = unopaque_forms(Forms),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
%% OTP_14285: Unicode atoms.
@@ -1609,8 +1610,9 @@ encoding(Config) when is_list(Config) ->
epp_parse_file(ErlFile, [{default_encoding,latin1}]),
{ok,[{attribute,1,file,_},
{attribute,1,module,encoding},
- {eof,3}],[{encoding,none}]} =
+ {eof,3}],Extra0} =
epp_parse_file(ErlFile, [{default_encoding,latin1},extra]),
+ none = proplists:get_value(encoding, Extra0),
%% Try a latin-1 file with encoding given in a comment.
C2 = <<"-module(encoding).
@@ -1632,16 +1634,20 @@ encoding(Config) when is_list(Config) ->
epp_parse_file(ErlFile, [{default_encoding,utf8}]),
{ok,[{attribute,1,file,_},
{attribute,1,module,encoding},
- {eof,4}],[{encoding,latin1}]} =
+ {eof,4}],Extra1} =
epp_parse_file(ErlFile, [extra]),
+ latin1 = proplists:get_value(encoding, Extra1),
+
{ok,[{attribute,1,file,_},
{attribute,1,module,encoding},
- {eof,4}],[{encoding,latin1}]} =
+ {eof,4}],Extra2} =
epp_parse_file(ErlFile, [{default_encoding,latin1},extra]),
+ latin1 = proplists:get_value(encoding, Extra2),
{ok,[{attribute,1,file,_},
{attribute,1,module,encoding},
- {eof,4}],[{encoding,latin1}]} =
+ {eof,4}],Extra3} =
epp_parse_file(ErlFile, [{default_encoding,utf8},extra]),
+ latin1 = proplists:get_value(encoding, Extra3),
ok.
extends(Config) ->
@@ -1802,7 +1808,7 @@ otp_16824(Config) when is_list(Config) ->
{otp_16824_8,
<<"\n-else\n"
"-endif.">>,
- {errors,[{{3,1},epp,{bad,else}}],[]}},
+ {errors,[{{3,1},epp,{bad,'else'}}],[]}},
{otp_16824_9,
<<"\n-ifndef.\n"
@@ -2010,6 +2016,9 @@ eval_tests(Config, Fun, Tests) ->
F = fun({N,P,Opts,E}, BadL) ->
%% io:format("Testing ~p~n", [P]),
Return = Fun(Config, P, Opts),
+ %% The result should be the same when enabling maybe ... end
+ %% (making 'else' a keyword instead of an atom).
+ Return = Fun(Config, P, [{enable_feature,maybe_expr}|Opts]),
case message_compare(E, Return) of
true ->
case E of
@@ -2107,7 +2116,11 @@ run_test(Config, Test0, Opts0) ->
Opts = [return, {i,PrivDir},{outdir,PrivDir}] ++ Opts0,
{ok, epp_test, []} = compile:file(File, Opts),
AbsFile = filename:rootname(File, ".erl"),
+ %% FIXME For now, use firbidden feature at rumtime
+ erl_features:enable_feature(maybe_expr),
{module, epp_test} = code:load_abs(AbsFile, epp_test),
+ %% FIXME For now, use firbidden feature at rumtime
+ erl_features:disable_feature(maybe_expr),
Reply = epp_test:t(),
code:purge(epp_test),
Reply.
@@ -2117,8 +2130,3 @@ fail() ->
message_compare(T, T) ->
T =:= T.
-
-%% +fnu means a peer node has to be started; slave will not do
-start_node(Name, Xargs) ->
- PA = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, peer, [{args, "-pa " ++ PA ++ " " ++ Xargs}]).
diff --git a/lib/stdlib/test/erl_eval_SUITE.erl b/lib/stdlib/test/erl_eval_SUITE.erl
index 0bf59cf60e..00a56d8a2b 100644
--- a/lib/stdlib/test/erl_eval_SUITE.erl
+++ b/lib/stdlib/test/erl_eval_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1998-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1998-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
%% %CopyrightEnd%
-module(erl_eval_SUITE).
+-feature(enable, maybe_expr).
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_testcase/2, end_per_testcase/2,
init_per_group/2,end_per_group/2]).
@@ -43,6 +44,7 @@
otp_13228/1,
otp_14826/1,
funs/1,
+ custom_stacktrace/1,
try_catch/1,
eval_expr_5/1,
zero_width/1,
@@ -52,7 +54,8 @@
otp_16439/1,
otp_14708/1,
otp_16545/1,
- otp_16865/1]).
+ otp_16865/1,
+ eep49/1]).
%%
%% Define to run outside of test server
@@ -91,8 +94,9 @@ all() ->
simple_cases, unary_plus, apply_atom, otp_5269,
otp_6539, otp_6543, otp_6787, otp_6977, otp_7550,
otp_8133, otp_10622, otp_13228, otp_14826,
- funs, try_catch, eval_expr_5, zero_width,
- eep37, eep43, otp_15035, otp_16439, otp_14708, otp_16545, otp_16865].
+ funs, custom_stacktrace, try_catch, eval_expr_5, zero_width,
+ eep37, eep43, otp_15035, otp_16439, otp_14708, otp_16545, otp_16865,
+ eep49].
groups() ->
[].
@@ -1000,23 +1004,23 @@ otp_14826(_Config) ->
backtrace_check("fun(P) when is_pid(P) -> true end(a).",
function_clause,
[{erl_eval,'-inside-an-interpreted-fun-',[a],[]},
- {erl_eval,eval_fun,6},
+ {erl_eval,eval_fun,8},
?MODULE]),
backtrace_check("B.",
{unbound_var, 'B'},
[{erl_eval,expr,2}, ?MODULE]),
backtrace_check("B.",
{unbound, 'B'},
- [{erl_eval,expr,5}, ?MODULE],
+ [{erl_eval,expr,6}, ?MODULE],
none, none),
backtrace_check("1/0.",
badarith,
[{erlang,'/',[1,0],[]},
- {erl_eval,do_apply,6}]),
+ {erl_eval,do_apply,7}]),
backtrace_catch("catch 1/0.",
badarith,
[{erlang,'/',[1,0],[]},
- {erl_eval,do_apply,6}]),
+ {erl_eval,do_apply,7}]),
check(fun() -> catch exit(foo) end,
"catch exit(foo).",
{'EXIT', foo}),
@@ -1026,33 +1030,33 @@ otp_14826(_Config) ->
backtrace_check("try 1/0 after foo end.",
badarith,
[{erlang,'/',[1,0],[]},
- {erl_eval,do_apply,6}]),
+ {erl_eval,do_apply,7}]),
backtrace_catch("catch (try 1/0 after foo end).",
badarith,
[{erlang,'/',[1,0],[]},
- {erl_eval,do_apply,6}]),
+ {erl_eval,do_apply,7}]),
backtrace_catch("try catch 1/0 after foo end.",
badarith,
[{erlang,'/',[1,0],[]},
- {erl_eval,do_apply,6}]),
+ {erl_eval,do_apply,7}]),
backtrace_check("try a of b -> bar after foo end.",
{try_clause,a},
- [{erl_eval,try_clauses,8}]),
+ [{erl_eval,try_clauses,10}]),
check(fun() -> X = try foo:bar() catch A:B:C -> {A,B} end, X end,
"try foo:bar() catch A:B:C -> {A,B} end.",
{error, undef}),
backtrace_check("C = 4, try foo:bar() catch A:B:C -> {A,B,C} end.",
stacktrace_bound,
- [{erl_eval,check_stacktrace_vars,2},
- {erl_eval,try_clauses,8}],
+ [{erl_eval,check_stacktrace_vars,5},
+ {erl_eval,try_clauses,10}],
none, none),
backtrace_catch("catch (try a of b -> bar after foo end).",
{try_clause,a},
- [{erl_eval,try_clauses,8}]),
+ [{erl_eval,try_clauses,10}]),
backtrace_check("try 1/0 catch exit:a -> foo end.",
badarith,
[{erlang,'/',[1,0],[]},
- {erl_eval,do_apply,6}]),
+ {erl_eval,do_apply,7}]),
Es = [{'try',1,[{call,1,{remote,1,{atom,1,foo},{atom,1,bar}},[]}],
[],
[{clause,1,[{tuple,1,[{var,1,'A'},{var,1,'B'},{atom,1,'C'}]}],
@@ -1062,8 +1066,8 @@ otp_14826(_Config) ->
ct:fail(stacktrace_variable)
catch
error:{illegal_stacktrace_variable,{atom,1,'C'}}:S ->
- [{erl_eval,check_stacktrace_vars,2,_},
- {erl_eval,try_clauses,8,_}|_] = S
+ [{erl_eval,check_stacktrace_vars,5,_},
+ {erl_eval,try_clauses,10,_}|_] = S
end,
backtrace_check("{1,1} = {A = 1, A = 2}.",
{badmatch, 1},
@@ -1073,53 +1077,53 @@ otp_14826(_Config) ->
[{erl_eval,guard0,4}], none, none),
backtrace_check("case a of foo() -> ok end.",
{illegal_pattern,{call,1,{atom,1,foo},[]}},
- [{erl_eval,match,4}], none, none),
+ [{erl_eval,match,6}], none, none),
backtrace_check("case a of b -> ok end.",
{case_clause,a},
- [{erl_eval,case_clauses,6}, ?MODULE]),
+ [{erl_eval,case_clauses,8}, ?MODULE]),
backtrace_check("if a =:= b -> ok end.",
if_clause,
- [{erl_eval,if_clauses,5}, ?MODULE]),
+ [{erl_eval,if_clauses,7}, ?MODULE]),
backtrace_check("fun A(b) -> ok end(a).",
function_clause,
[{erl_eval,'-inside-an-interpreted-fun-',[a],[]},
- {erl_eval,eval_named_fun,8},
+ {erl_eval,eval_named_fun,10},
?MODULE]),
backtrace_check("[A || A <- a].",
{bad_generator, a},
- [{erl_eval,eval_generate,7}, {erl_eval, eval_lc, 6}]),
+ [{erl_eval,eval_generate,8}, {erl_eval, eval_lc, 7}]),
backtrace_check("<< <<A>> || <<A>> <= a>>.",
{bad_generator, a},
- [{erl_eval,eval_b_generate,7}, {erl_eval, eval_bc, 6}]),
+ [{erl_eval,eval_b_generate,8}, {erl_eval, eval_bc, 7}]),
backtrace_check("[A || A <- [1], begin a end].",
{bad_filter, a},
- [{erl_eval,eval_filter,6}, {erl_eval, eval_generate, 7}]),
+ [{erl_eval,eval_filter,7}, {erl_eval, eval_generate, 8}]),
fun() ->
{'EXIT', {{badarity, {_Fun, []}}, BT}} =
(catch parse_and_run("fun(A) -> A end().")),
- check_backtrace([{erl_eval,do_apply,5}, ?MODULE], BT)
+ check_backtrace([{erl_eval,do_apply,6}, ?MODULE], BT)
end(),
fun() ->
{'EXIT', {{badarity, {_Fun, []}}, BT}} =
(catch parse_and_run("fun F(A) -> A end().")),
- check_backtrace([{erl_eval,do_apply,5}, ?MODULE], BT)
+ check_backtrace([{erl_eval,do_apply,6}, ?MODULE], BT)
end(),
backtrace_check("foo().",
undef,
- [{erl_eval,foo,0},{erl_eval,local_func,6}],
+ [{erl_eval,foo,0},{erl_eval,local_func,8}],
none, none),
backtrace_check("a orelse false.",
{badarg, a},
- [{erl_eval,expr,5}, ?MODULE]),
+ [{erl_eval,expr,6}, ?MODULE]),
backtrace_check("a andalso false.",
{badarg, a},
- [{erl_eval,expr,5}, ?MODULE]),
+ [{erl_eval,expr,6}, ?MODULE]),
backtrace_check("t = u.",
{badmatch, u},
- [{erl_eval,expr,5}, ?MODULE]),
+ [{erl_eval,expr,6}, ?MODULE]),
backtrace_check("{math,sqrt}(2).",
{badfun, {math,sqrt}},
- [{erl_eval,expr,5}, ?MODULE]),
+ [{erl_eval,expr,6}, ?MODULE]),
backtrace_check("erl_eval_SUITE:simple().",
simple,
[{?MODULE,simple1,0},{?MODULE,simple,0},erl_eval]),
@@ -1128,31 +1132,39 @@ otp_14826(_Config) ->
"19,20,21,22,23,24,25,26,27,28,29,30) -> a end.",
{argument_limit,
{'fun',1,[{clause,1,Args,[],[{atom,1,a}]}]}},
- [{erl_eval,expr,5}, ?MODULE]),
+ [{erl_eval,expr,6}, ?MODULE]),
backtrace_check("fun F(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,"
"19,20,21,22,23,24,25,26,27,28,29,30) -> a end.",
{argument_limit,
{named_fun,1,'F',[{clause,1,Args,[],[{atom,1,a}]}]}},
- [{erl_eval,expr,5}, ?MODULE]),
+ [{erl_eval,expr,6}, ?MODULE]),
backtrace_check("#r{}.",
{undef_record,r},
- [{erl_eval,expr,5}, ?MODULE],
+ [{erl_eval,expr,6}, ?MODULE],
none, none),
%% eval_bits
backtrace_check("<<100:8/bitstring>>.",
badarg,
- [{eval_bits,eval_exp_field1,6},
+ [{eval_bits,eval_exp_field,6},
eval_bits,eval_bits,erl_eval]),
backtrace_check("<<100:8/foo>>.",
{undefined_bittype,foo},
- [{eval_bits,make_bit_type,3},eval_bits,
+ [{eval_bits,make_bit_type,4},eval_bits,
eval_bits,eval_bits],
none, none),
backtrace_check("B = <<\"foo\">>, <<B/binary-unit:7>>.",
badarg,
- [{eval_bits,eval_exp_field1,6},
+ [{eval_bits,eval_exp_field,6},
eval_bits,eval_bits,erl_eval],
none, none),
+
+ %% eval_bits with error info
+ {error_info, #{cause := _, override_segment_position := 1}} =
+ error_info_catch("<<100:8/bitstring>>.", badarg),
+
+ {error_info, #{cause := _, override_segment_position := 2}} =
+ error_info_catch("<<0:8, 100:8/bitstring>>.", badarg),
+
ok.
simple() ->
@@ -1172,13 +1184,143 @@ simple1() ->
WillNeverHappen -> WillNeverHappen
end.
+custom_stacktrace(Config) when is_list(Config) ->
+ EFH = {value, fun custom_stacktrace_eval_handler/3},
+
+ backtrace_check("1 + atom.", badarith,
+ [{erlang,'+',[1,atom]}, mystack(1)], none, EFH),
+ backtrace_check("\n1 + atom.", badarith,
+ [{erlang,'+',[1,atom]}, mystack(2)], none, EFH),
+
+ backtrace_check("lists:flatten(atom).", function_clause,
+ [{lists,flatten,[atom]}, mystack(1)], none, EFH),
+
+ backtrace_check("invalid andalso true.", {badarg, invalid},
+ [mystack(1)], none, EFH),
+ backtrace_check("invalid orelse true.", {badarg, invalid},
+ [mystack(1)], none, EFH),
+
+ backtrace_check("invalid = valid.", {badmatch, valid},
+ [erl_eval, mystack(1)], none, EFH),
+
+ backtrace_check("1:2.", {badexpr, ':'},
+ [erl_eval, mystack(1)], none, EFH),
+
+ backtrace_check("Unknown.", {unbound, 'Unknown'},
+ [erl_eval, mystack(1)], none, EFH),
+
+ backtrace_check("#unknown{}.", {undef_record,unknown},
+ [erl_eval, mystack(1)], none, EFH),
+ backtrace_check("#unknown{foo=bar}.", {undef_record,unknown},
+ [erl_eval, mystack(1)], none, EFH),
+ backtrace_check("#unknown.index.", {undef_record,unknown},
+ [erl_eval, mystack(1)], none, EFH),
+
+ backtrace_check("fun foo/2.", undef,
+ [{erl_eval, foo, 2}, erl_eval, mystack(1)], none, EFH),
+ backtrace_check("foo(1, 2).", undef,
+ [{erl_eval, foo, 2}, erl_eval, mystack(1)], none, EFH),
+
+ fun() ->
+ {'EXIT', {{badarity, {_Fun, []}}, BT}} =
+ (catch parse_and_run("fun(A) -> A end().", none, EFH)),
+ check_backtrace([erl_eval, mystack(1)], BT)
+ end(),
+
+ fun() ->
+ {'EXIT', {{badarity, {_Fun, []}}, BT}} =
+ (catch parse_and_run("fun F(A) -> A end().", none, EFH)),
+ check_backtrace([erl_eval, mystack(1)], BT)
+ end(),
+
+ backtrace_check("[X || X <- 1].", {bad_generator, 1},
+ [erl_eval, mystack(1)], none, EFH),
+ backtrace_check("[X || <<X>> <= 1].", {bad_generator, 1},
+ [erl_eval, mystack(1)], none, EFH),
+ backtrace_check("<<X || X <- 1>>.", {bad_generator, 1},
+ [erl_eval, mystack(1)], none, EFH),
+ backtrace_check("<<X || <<X>> <= 1>>.", {bad_generator, 1},
+ [erl_eval, mystack(1)], none, EFH),
+
+ backtrace_check("if false -> true end.", if_clause,
+ [erl_eval, mystack(1)], none, EFH),
+ backtrace_check("case 0 of 1 -> true end.", {case_clause, 0},
+ [erl_eval, mystack(1)], none, EFH),
+ backtrace_check("try 0 of 1 -> true after ok end.", {try_clause, 0},
+ [mystack(1)], none, EFH),
+
+ backtrace_check("fun(0) -> 1 end(1).", function_clause,
+ [{erl_eval,'-inside-an-interpreted-fun-', [1]}, erl_eval, mystack(1)],
+ none, EFH),
+ backtrace_check("fun F(0) -> 1 end(1).", function_clause,
+ [{erl_eval,'-inside-an-interpreted-fun-', [1]}, erl_eval, mystack(1)],
+ none, EFH),
+
+ fun() ->
+ {'EXIT', {{illegal_pattern,_}, BT}} =
+ (catch parse_and_run("make_ref() = 1.", none, EFH)),
+ check_backtrace([erl_eval, mystack(1)], BT)
+ end(),
+
+ %% eval_bits
+ backtrace_check("<<100:8/bitstring>>.",
+ badarg,
+ [{eval_bits,eval_exp_field,6}, mystack(1)],
+ none, EFH),
+ backtrace_check("<<100:8/foo>>.",
+ {undefined_bittype,foo},
+ [{eval_bits,make_bit_type,4}, mystack(1)],
+ none, EFH),
+ backtrace_check("B = <<\"foo\">>, <<B/binary-unit:7>>.",
+ badarg,
+ [{eval_bits,eval_exp_field,6}, mystack(1)],
+ none, EFH),
+
+ ok.
+
+mystack(Line) ->
+ {my_module, my_function, 0, [{file, "evaluator"}, {line, Line}]}.
+
+custom_stacktrace_eval_handler(Ann, FunOrModFun, Args) ->
+ try
+ case FunOrModFun of
+ {Mod, Fun} -> apply(Mod, Fun, Args);
+ Fun -> apply(Fun, Args)
+ end
+ catch
+ Kind:Reason:Stacktrace ->
+ %% Take everything up to the evaluation function
+ Pruned =
+ lists:takewhile(fun
+ ({erl_eval_SUITE,backtrace_check,5,_}) -> false;
+ (_) -> true
+ end, Stacktrace),
+ %% Now we prune any shared code path from erl_eval
+ {current_stacktrace, Current} =
+ erlang:process_info(self(), current_stacktrace),
+ Reversed = drop_common(lists:reverse(Current), lists:reverse(Pruned)),
+ Location = [{file, "evaluator"}, {line, erl_anno:line(Ann)}],
+ %% Add our file+line information at the bottom
+ Custom = lists:reverse([{my_module, my_function, 0, Location} | Reversed]),
+ erlang:raise(Kind, Reason, Custom)
+ end.
+
+drop_common([H | T1], [H | T2]) -> drop_common(T1, T2);
+drop_common([H | T1], T2) -> drop_common(T1, T2);
+drop_common([], [{?MODULE, custom_stacktrace_eval_handler, _, _} | T2]) -> T2;
+drop_common([], T2) -> T2.
+
%% Simple cases, just to cover some code.
funs(Config) when is_list(Config) ->
do_funs(none, none),
do_funs(lfh(), none),
+ do_funs(none, efh()),
do_funs(lfh(), efh()),
+ do_funs(none, ann_efh()),
+ do_funs(lfh(), ann_efh()),
error_check("nix:foo().", {access_not_allowed,nix}, lfh(), efh()),
+ error_check("nix:foo().", {access_not_allowed,nix}, lfh(), ann_efh()),
error_check("bar().", undef, none, none),
check(fun() -> F1 = fun(F,N) -> ?MODULE:count_down(F, N) end,
@@ -1217,6 +1359,15 @@ funs(Config) when is_list(Config) ->
error_check("apply(timer, sleep, [1]).", got_it, none, EFH),
error_check("begin F = fun(T) -> timer:sleep(T) end,F(1) end.",
got_it, none, EFH),
+
+ AnnEF = fun(1, {timer,sleep}, As) when length(As) == 1 -> exit({got_it,sleep});
+ (1, {M,F}, As) -> apply(M, F, As)
+ end,
+ AnnEFH = {value, AnnEF},
+ error_check("apply(timer, sleep, [1]).", got_it, none, AnnEFH),
+ error_check("begin F = fun(T) -> timer:sleep(T) end,F(1) end.",
+ got_it, none, AnnEFH),
+
error_check("fun c/1.", undef),
error_check("fun a:b/0().", undef),
@@ -1398,6 +1549,9 @@ local_func_value(F, As) when is_atom(F) ->
efh() ->
{value, fun(F, As) -> external_func(F, As) end}.
+ann_efh() ->
+ {value, fun(_Ann, F, As) -> external_func(F, As) end}.
+
external_func({M,_}, _As) when M == nix ->
exit({{access_not_allowed,M},[mfa]});
external_func(F, As) when is_function(F) ->
@@ -1756,6 +1910,67 @@ otp_16865(Config) when is_list(Config) ->
{badmatch, b}),
ok.
+eep49(Config) when is_list(Config) ->
+ check(fun() ->
+ maybe empty end
+ end,
+ "maybe empty end.",
+ empty),
+ check(fun() ->
+ maybe ok ?= ok end
+ end,
+ "maybe ok ?= ok end.",
+ ok),
+ check(fun() ->
+ maybe {ok,A} ?= {ok,good}, A end
+ end,
+ "maybe {ok,A} ?= {ok,good}, A end.",
+ good),
+ check(fun() ->
+ maybe {ok,A} ?= {ok,good}, {ok,B} ?= {ok,also_good}, {A,B} end
+ end,
+ "maybe {ok,A} ?= {ok,good}, {ok,B} ?= {ok,also_good}, {A,B} end.",
+ {good,also_good}),
+ check(fun() ->
+ maybe {ok,A} ?= {ok,good}, {ok,B} ?= {error,wrong}, {A,B} end
+ end,
+ "maybe {ok,A} ?= {ok,good}, {ok,B} ?= {error,wrong}, {A,B} end.",
+ {error,wrong}),
+
+ %% Test maybe ... else ... end.
+ check(fun() ->
+ maybe empty else _ -> error end
+ end,
+ "maybe empty else _ -> error end.",
+ empty),
+ check(fun() ->
+ maybe ok ?= ok else _ -> error end
+ end,
+ "maybe ok ?= ok else _ -> error end.",
+ ok),
+ check(fun() ->
+ maybe ok ?= other else _ -> error end
+ end,
+ "maybe ok ?= other else _ -> error end.",
+ error),
+ check(fun() ->
+ maybe {ok,A} ?= {ok,good}, {ok,B} ?= {ok,also_good}, {A,B}
+ else {error,_} -> error end
+ end,
+ "maybe {ok,A} ?= {ok,good}, {ok,B} ?= {ok,also_good}, {A,B} "
+ "else {error,_} -> error end.",
+ {good,also_good}),
+ check(fun() ->
+ maybe {ok,A} ?= {ok,good}, {ok,B} ?= {error,other}, {A,B}
+ else {error,_} -> error end
+ end,
+ "maybe {ok,A} ?= {ok,good}, {ok,B} ?= {error,other}, {A,B} "
+ "else {error,_} -> error end.",
+ error),
+ error_check("maybe ok ?= simply_wrong else {error,_} -> error end.",
+ {else_clause,simply_wrong}),
+ ok.
+
%% Check the string in different contexts: as is; in fun; from compiled code.
check(F, String, Result) ->
check1(F, String, Result),
@@ -1869,6 +2084,14 @@ backtrace_catch(String, Result, Backtrace) ->
ct:fail({eval, Other, Result})
end.
+error_info_catch(String, Result) ->
+ case catch parse_and_run(String) of
+ {'EXIT', {Result, [{_, _, _, Info}|_]}} ->
+ lists:keyfind(error_info, 1, Info);
+ Other ->
+ ct:fail({eval, Other, Result})
+ end.
+
check_backtrace([B1|Backtrace], [B2|BT]) ->
case {B1, B2} of
{M, {M,_,_,_}} ->
@@ -1887,15 +2110,26 @@ eval_string(String) ->
Result.
parse_expr(String) ->
- {ok,Tokens,_} = erl_scan:string(String),
+ Tokens = erl_scan_string(String),
{ok, [Expr]} = erl_parse:parse_exprs(Tokens),
Expr.
parse_exprs(String) ->
- {ok,Tokens,_} = erl_scan:string(String),
+ Tokens = erl_scan_string(String),
{ok, Exprs} = erl_parse:parse_exprs(Tokens),
Exprs.
+erl_scan_string(String) ->
+ %% FIXME: When the experimental features EEP has been implemented, we should
+ %% dig out all keywords defined in all features.
+ ResWordFun =
+ fun('maybe') -> true;
+ ('else') -> true;
+ (Other) -> erl_scan:reserved_word(Other)
+ end,
+ {ok,Tokens,_} = erl_scan:string(String, 1, [{reserved_word_fun,ResWordFun}]),
+ Tokens.
+
parse_and_run(String) ->
erl_eval:expr(parse_expr(String), []).
diff --git a/lib/stdlib/test/erl_expand_records_SUITE.erl b/lib/stdlib/test/erl_expand_records_SUITE.erl
index ed5b6325fc..c48a1ac90e 100644
--- a/lib/stdlib/test/erl_expand_records_SUITE.erl
+++ b/lib/stdlib/test/erl_expand_records_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -39,7 +39,8 @@
-export([attributes/1, expr/1, guard/1,
init/1, pattern/1, strict/1, update/1,
otp_5915/1, otp_7931/1, otp_5990/1,
- otp_7078/1, otp_7101/1, maps/1]).
+ otp_7078/1, otp_7101/1, maps/1,
+ side_effects/1]).
init_per_testcase(_Case, Config) ->
Config.
@@ -53,7 +54,8 @@ suite() ->
all() ->
[attributes, expr, guard, init,
- pattern, strict, update, maps, {group, tickets}].
+ pattern, strict, update, maps,
+ side_effects, {group, tickets}].
groups() ->
[{tickets, [],
@@ -317,7 +319,7 @@ strict(Config) when is_list(Config) ->
ok = try
{1, 2} = {A#r2.a, A#r2.b},
not_ok
- catch error:{badrecord,r2} -> ok
+ catch error:{badrecord,{r1,1,2}} -> ok
end,
try
case foo of
@@ -761,6 +763,30 @@ otp_7101_update3(R) ->
otp_7101_update4(R) ->
R#otp_7101{a=1,b=2}.
+
+-record(side_effects, {a,b,c}).
+
+%% Make sure that the record expression is only evaluated once.
+side_effects(_Config) ->
+ init_counter(),
+
+ {'EXIT',{{badrecord,0},_}} = catch (id(bump_counter()))#side_effects{a=1},
+ 1 = read_counter(),
+
+ {'EXIT',{{badrecord,1},_}} = catch (id(bump_counter()))#side_effects.b,
+ 2 = read_counter(),
+
+ ok.
+
+init_counter() ->
+ put(counter, 0).
+
+bump_counter() ->
+ put(counter, get(counter) + 1).
+
+read_counter() ->
+ get(counter).
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
run(Config, Tests) ->
diff --git a/lib/stdlib/test/erl_internal_SUITE.erl b/lib/stdlib/test/erl_internal_SUITE.erl
index 7d9df1f989..5c2d6b0091 100644
--- a/lib/stdlib/test/erl_internal_SUITE.erl
+++ b/lib/stdlib/test/erl_internal_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -80,7 +80,7 @@ callbacks(application) ->
callbacks(gen_server) ->
[{init,1}, {handle_call,3}, {handle_cast,2},
{handle_info,2}, {terminate,2}, {code_change,3},
- {format_status,2}, {handle_continue, 2}];
+ {format_status,1}, {format_status,2}, {handle_continue, 2}];
callbacks(gen_fsm) ->
[{init,1}, {handle_event,3}, {handle_sync_event,4},
{handle_info,3}, {terminate,3}, {code_change,4},
@@ -88,11 +88,11 @@ callbacks(gen_fsm) ->
callbacks(gen_event) ->
[{init,1}, {handle_event,2}, {handle_call,2},
{handle_info,2}, {terminate,2}, {code_change,3},
- {format_status,2}];
+ {format_status,1}, {format_status,2}];
callbacks(gen_statem) ->
[{init, 1}, {callback_mode, 0}, {state_name, 3},
{handle_event, 4}, {terminate, 3}, {code_change, 4},
- {format_status, 2}];
+ {format_status, 1}, {format_status, 2}];
callbacks(supervisor_bridge) ->
[{init,1}, {terminate,2}];
callbacks(supervisor) ->
@@ -101,14 +101,14 @@ callbacks(supervisor) ->
optional_callbacks(application) ->
[];
optional_callbacks(gen_server) ->
- [{handle_info, 2}, {handle_continue, 2}, {terminate, 2}, {code_change, 3}, {format_status, 2}];
+ [{handle_info, 2}, {handle_continue, 2}, {terminate, 2}, {code_change, 3}, {format_status, 1}, {format_status, 2}];
optional_callbacks(gen_fsm) ->
[{handle_info, 3}, {terminate, 3}, {code_change, 4}, {format_status, 2}];
optional_callbacks(gen_event) ->
- [{handle_info, 2}, {terminate, 2}, {code_change, 3}, {format_status, 2}];
+ [{handle_info, 2}, {terminate, 2}, {code_change, 3}, {format_status, 1}, {format_status, 2}];
optional_callbacks(gen_statem) ->
[{state_name, 3}, {handle_event, 4},
- {terminate, 3}, {code_change, 4}, {format_status, 2}];
+ {terminate, 3}, {code_change, 4}, {format_status, 1}, {format_status, 2}];
optional_callbacks(supervisor_bridge) ->
[];
optional_callbacks(supervisor) ->
diff --git a/lib/stdlib/test/erl_lint_SUITE.erl b/lib/stdlib/test/erl_lint_SUITE.erl
index c54efc20c6..955e5fbb40 100644
--- a/lib/stdlib/test/erl_lint_SUITE.erl
+++ b/lib/stdlib/test/erl_lint_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -71,10 +71,14 @@
external_funs/1,otp_15456/1,otp_15563/1,
unused_type/1,binary_types/1,removed/1, otp_16516/1,
inline_nifs/1,
+ undefined_nifs/1,
+ no_load_nif/1,
warn_missing_spec/1,
otp_16824/1,
underscore_match/1,
- unused_record/1]).
+ unused_record/1,
+ unused_type2/1,
+ eep49/1]).
suite() ->
[{ct_hooks,[ts_install_cth]},
@@ -97,8 +101,11 @@ all() ->
record_errors, otp_11879_cont, non_latin1_module, otp_14323,
stacktrace_syntax, otp_14285, otp_14378, external_funs,
otp_15456, otp_15563, unused_type, binary_types, removed, otp_16516,
+ undefined_nifs,
+ no_load_nif,
inline_nifs, warn_missing_spec, otp_16824,
- underscore_match, unused_record].
+ underscore_match, unused_record, unused_type2,
+ eep49].
groups() ->
[{unused_vars_warn, [],
@@ -958,14 +965,13 @@ binary_types(Config) when is_list(Config) ->
Ts = [{binary1,
<<"-type nonempty_binary() :: term().">>,
[nowarn_unused_type],
- {warnings,[{{1,22},erl_lint,
- {new_builtin_type,{nonempty_binary,0}}}]}},
-
+ {errors,[{{1,22},erl_lint,
+ {builtin_type,{nonempty_binary,0}}}],[]}},
{binary2,
<<"-type nonempty_bitstring() :: term().">>,
[nowarn_unused_type],
- {warnings,[{{1,22},erl_lint,
- {new_builtin_type,{nonempty_bitstring,0}}}]}}],
+ {errors,[{{1,22},erl_lint,
+ {builtin_type,{nonempty_bitstring,0}}}],[]}}],
[] = run(Config, Ts),
ok.
@@ -3725,7 +3731,10 @@ predef(Config) when is_list(Config) ->
%% dict(), digraph() and so on were removed in Erlang/OTP 18.0.
E2 = get_compilation_result(Config, "predef2", []),
Tag = undefined_type,
- {[{{7,13},erl_lint,{Tag,{array,0}}},
+ {[{{5,2},erl_lint,{Tag,{array,0}}},
+ {{5,2},erl_lint,{Tag,{digraph,0}}},
+ {{5,2},erl_lint,{Tag,{gb_set,0}}},
+ {{7,13},erl_lint,{Tag,{array,0}}},
{{12,12},erl_lint,{Tag,{dict,0}}},
{{17,15},erl_lint,{Tag,{digraph,0}}},
{{27,14},erl_lint,{Tag,{gb_set,0}}},
@@ -4479,6 +4488,34 @@ inline_nifs(Config) ->
{warnings,[{{2,22},erl_lint,nif_inline}]}}],
[] = run(Config, Ts).
+undefined_nifs(Config) when is_list(Config) ->
+ Ts = [{undefined_nifs,
+ <<"-export([t/0]).
+ -nifs([hej/1]).
+ t() ->
+ erlang:load_nif(\"lib\", []).
+ ">>,
+ [],
+ {errors,[{{2,15},erl_lint,{undefined_nif,{hej,1}}}],[]}}
+ ],
+ [] = run(Config, Ts),
+
+ ok.
+
+no_load_nif(Config) when is_list(Config) ->
+ Ts = [{no_load_nif,
+ <<"-export([t/0]).
+ -nifs([t/0]).
+ t() ->
+ a.
+ ">>,
+ [],
+ {warnings,[{{2,15},erl_lint,no_load_nif}]}}
+ ],
+ [] = run(Config, Ts),
+
+ ok.
+
warn_missing_spec(Config) ->
Test = <<"-export([external_with_spec/0, external_no_spec/0]).
@@ -4631,6 +4668,141 @@ unused_record(Config) when is_list(Config) ->
ok.
+unused_type2(Config) when is_list(Config) ->
+ Ts = [{unused_type2_1,
+ <<"-type t() :: [t()].
+ t() ->
+ a.
+ ">>,
+ {[]},
+ {warnings,[{{1,22},erl_lint,{unused_type,{t,0}}},
+ {{2,15},erl_lint,{unused_function,{t,0}}}]}},
+ {unused_type2_2,
+ <<"-type t1() :: t2().
+ -type t2() :: t1().
+ t() ->
+ a.
+ ">>,
+ {[]},
+ {warnings,[{{1,22},erl_lint,{unused_type,{t1,0}}},
+ {{2,16},erl_lint,{unused_type,{t2,0}}},
+ {{3,16},erl_lint,{unused_function,{t,0}}}]}},
+ {unused_type2_3,
+ <<"-callback cb() -> t().
+ -type t() :: atom().
+ t() ->
+ a.
+ ">>,
+ {[]},
+ {warnings,[{{3,16},erl_lint,{unused_function,{t,0}}}]}},
+ {unused_type2_4,
+ <<"-spec t() -> t().
+ -type t() :: atom().
+ t() ->
+ a.
+ ">>,
+ {[]},
+ {warnings,[{{3,16},erl_lint,{unused_function,{t,0}}}]}},
+ {unused_type2_5,
+ <<"-export_type([t/0]).
+ -type t() :: atom().
+ t() ->
+ a.
+ ">>,
+ {[]},
+ {warnings,[{{3,16},erl_lint,{unused_function,{t,0}}}]}},
+ {unused_type2_6,
+ <<"-record(r, {f :: t()}).
+ -type t() :: atom().
+ t() ->
+ a.
+ ">>,
+ {[]},
+ {warnings,[{{1,22},erl_lint,{unused_record,r}},
+ {{3,16},erl_lint,{unused_function,{t,0}}}]}}
+ ],
+ [] = run(Config, Ts),
+
+ ok.
+
+%% Test maybe ... else ... end.
+eep49(Config) when is_list(Config) ->
+ EnableMaybe = {enable_feature,maybe_expr},
+ Ts = [{exp1,
+ <<"t(X) ->
+ maybe
+ A = X()
+ end,
+ A.
+ ">>,
+ [EnableMaybe],
+ {errors,[{{5,19},erl_lint,{unsafe_var,'A',{'maybe',{2,19}}}}],
+ []}},
+
+ {exp2,
+ <<"t(X) ->
+ maybe
+ A = X()
+ else
+ _ -> {ok,A}
+ end,
+ A.
+ ">>,
+ [EnableMaybe],
+ {errors,[{{5,32},erl_lint,{unsafe_var,'A',{'maybe',{2,19}}}},
+ {{7,19},erl_lint,{unsafe_var,'A',{'maybe',{2,19}}}}],
+ []}},
+
+ {exp3,
+ <<"t(X) ->
+ maybe
+ X()
+ else
+ A ->
+ B = 42,
+ {error,A}
+ end,
+ {A,B}.
+ ">>,
+ [EnableMaybe],
+ {errors,[{{9,20},erl_lint,{unsafe_var,'A',{'else',{4,19}}}},
+ {{9,22},erl_lint,{unsafe_var,'B',{'else',{4,19}}}}],
+ []}},
+
+ {exp4,
+ <<"t(X) ->
+ maybe
+ X()
+ else
+ ok ->
+ A = 42;
+ error ->
+ error
+ end,
+ A.
+ ">>,
+ [EnableMaybe],
+ {errors,[{{10,19},erl_lint,{unsafe_var,'A',{'else',{4,19}}}}],
+ []}},
+
+ %% Using '?=' not at the top-level of a 'maybe' ... 'else' is forbidden.
+ {illegal_maybe_match1,
+ <<"t(X) ->
+ maybe (ok ?= X()) end.
+ ">>,
+ [EnableMaybe],
+ {errors,[{{2,29},erl_parse,["syntax error before: ","'?='"]}],[]}},
+ {illegal_maybe_match2,
+ <<"t(X) ->
+ ok ?= X().
+ ">>,
+ [EnableMaybe],
+ {errors,[{{2,22},erl_parse,["syntax error before: ","'?='"]}],[]}}
+ ],
+
+ [] = run(Config, Ts),
+ ok.
+
format_error(E) ->
lists:flatten(erl_lint:format_error(E)).
diff --git a/lib/stdlib/test/erl_pp_SUITE.erl b/lib/stdlib/test/erl_pp_SUITE.erl
index ce0abd213e..c8c1a206ca 100644
--- a/lib/stdlib/test/erl_pp_SUITE.erl
+++ b/lib/stdlib/test/erl_pp_SUITE.erl
@@ -48,13 +48,15 @@
neg_indent/1,
maps_syntax/1,
format_options/1,
- quoted_atom_types/1,
+ form_vars/1,
+ quoted_atom_types/1,
otp_6321/1, otp_6911/1, otp_6914/1, otp_8150/1, otp_8238/1,
otp_8473/1, otp_8522/1, otp_8567/1, otp_8664/1, otp_9147/1,
otp_10302/1, otp_10820/1, otp_11100/1, otp_11861/1, pr_1014/1,
otp_13662/1, otp_14285/1, otp_15592/1, otp_15751/1, otp_15755/1,
- otp_16435/1]).
+ otp_16435/1, gh_5093/1,
+ eep49/1]).
%% Internal export.
-export([ehook/6]).
@@ -78,14 +80,15 @@ groups() ->
[func, call, recs, try_catch, if_then, receive_after,
bits, head_tail, cond1, block, case1, ops,
messages, maps_syntax, quoted_atom_types,
- format_options
+ format_options, form_vars
]},
{attributes, [], [misc_attrs, import_export, dialyzer_attrs]},
{tickets, [],
[otp_6321, otp_6911, otp_6914, otp_8150, otp_8238,
otp_8473, otp_8522, otp_8567, otp_8664, otp_9147,
otp_10302, otp_10820, otp_11100, otp_11861, pr_1014, otp_13662,
- otp_14285, otp_15592, otp_15751, otp_15755, otp_16435]}].
+ otp_14285, otp_15592, otp_15751, otp_15755, otp_16435,
+ gh_5093, eep49]}].
init_per_suite(Config) ->
Config.
@@ -577,6 +580,37 @@ format_options(Config) when is_list(Config) ->
)
).
+form_vars(Config) when is_list(Config) ->
+ %% Check that erl_pp:legalize_vars/1 does its job. If
+ %% legalize_vars/1 fails to convert variable names starting with a
+ %% lower case letter, the compiler will detect that `X` is an atom
+ %% and report that the `+` operation will fail. If legalize_vars/1
+ %% fails to generate unique variable names and just converts the
+ %% name to uppercase, the variable named `REC0` will be used in an
+ %% unsafe way.
+ String = <<"-module(erl_pp_test).
+ -export([f/1]).
+ -record(r, {a, b}).
+ f(#r{b = B} = C) ->
+ receive
+ B ->
+ X = C#r.a,
+ REC0 = X + X,
+ REC0
+ end.">>,
+ FileName = filename('erl_pp_test.erl', Config),
+ ok = file:write_file(FileName, String),
+ Opts = [binary,deterministic,nowarn_unused_record],
+ {ok, [], Forms} = compile:file(FileName, ['E'|Opts]),
+ Forms1 = lists:map(fun(F={function,_,_,_,_}) ->
+ erl_pp:legalize_vars(F);
+ (F) ->
+ F
+ end, Forms),
+ ok = file:write_file(FileName, [erl_pp:form(F) || F <- Forms1]),
+ {ok, _, _, []} = compile:file(FileName, [return|Opts]),
+ ok.
+
misc_attrs(Config) when is_list(Config) ->
ok = pp_forms(<<"-module(m). ">>),
ok = pp_forms(<<"-module(m, [Aafjlksfjdlsjflsdfjlsdjflkdsfjlk,"
@@ -1085,14 +1119,14 @@ unicode_hook({foo,E}, I, P, H) ->
%% OTP-10820. Unicode filenames.
otp_10820(Config) when is_list(Config) ->
C1 = <<"%% coding: utf-8\n -module(any).">>,
- ok = do_otp_10820(Config, C1, "+pc latin1"),
- ok = do_otp_10820(Config, C1, "+pc unicode"),
+ ok = do_otp_10820(Config, C1, ["+pc", "latin1"]),
+ ok = do_otp_10820(Config, C1, ["+pc", "unicode"]),
C2 = <<"%% coding: latin-1\n -module(any).">>,
- ok = do_otp_10820(Config, C2, "+pc latin1"),
- ok = do_otp_10820(Config, C2, "+pc unicode").
+ ok = do_otp_10820(Config, C2, ["+pc", "latin1"]),
+ ok = do_otp_10820(Config, C2, ["+pc", "unicode"]).
do_otp_10820(Config, C, PC) ->
- {ok,Node} = start_node(erl_pp_helper, "+fnu " ++ PC),
+ {ok,Peer,Node} = ?CT_PEER(["+fnu"] ++ PC),
L = [915,953,959,973,957,953,954,959,957,964],
FileName = filename(L++".erl", Config),
ok = rpc:call(Node, file, write_file, [FileName, C]),
@@ -1100,7 +1134,7 @@ do_otp_10820(Config, C, PC) ->
[FileName, [return,'P',{outdir,?privdir}]]),
PFileName = filename(L++".P", Config),
{ok, Bin} = rpc:call(Node, file, read_file, [PFileName]),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
true = file_attr_is_string(binary_to_list(Bin)),
ok.
@@ -1335,6 +1369,30 @@ otp_16435(_Config) ->
ok.
+gh_5093(_Config) ->
+ assert_same("f() ->\n -1.\n"),
+ assert_same("f() ->\n +1.\n"),
+ assert_same("f() ->\n +1.1.\n"),
+ assert_same("f() ->\n +(+1).\n"),
+ assert_same("f(X) ->\n -X.\n"),
+ assert_same("f(X) ->\n +X.\n"),
+ assert_same("f(X, Y) ->\n X + Y.\n"),
+ assert_same("f(X, Y) ->\n X + +Y.\n"),
+ assert_same("f(X, Y) ->\n X - Y.\n"),
+ ok.
+
+eep49(_Config) ->
+ assert_same("f() ->\n"
+ " maybe ok ?= ok end.\n"),
+ assert_same("f() ->\n"
+ " maybe\n"
+ " ok ?= ok\n"
+ " else\n"
+ " {error, _} ->\n"
+ " error\n"
+ " end.\n"),
+ ok.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
compile(Config, Tests) ->
@@ -1430,7 +1488,15 @@ parse_forms(Chars) ->
parse_forms2([], _Cont, _Line, Forms) ->
lists:reverse(Forms);
parse_forms2(String, Cont0, Line, Forms) ->
- case erl_scan:tokens(Cont0, String, Line) of
+ %% FIXME: When the experimental features EEP has been implemented, we should
+ %% dig out all keywords defined in all features.
+ ResWordFun =
+ fun('maybe') -> true;
+ ('else') -> true;
+ (Other) -> erl_scan:reserved_word(Other)
+ end,
+ Options = [{reserved_word_fun,ResWordFun}],
+ case erl_scan:tokens(Cont0, String, Line, Options) of
{done, {ok, Tokens, EndLine}, Chars} ->
{ok, Form} = erl_parse:parse_form(Tokens),
parse_forms2(Chars, [], EndLine, [Form | Forms]);
@@ -1514,7 +1580,9 @@ filename(Name, Config) ->
fail() ->
ct:fail(failed).
-%% +fnu means a peer node has to be started; slave will not do
-start_node(Name, Xargs) ->
- PA = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, peer, [{args, "-pa " ++ PA ++ " " ++ Xargs}]).
+assert_same(Expected) when is_list(Expected) ->
+ Actual = binary_to_list(iolist_to_binary(parse_and_pp_forms(Expected, []))),
+ case Expected == Actual of
+ true -> ok;
+ false -> error({Expected, Actual})
+ end.
diff --git a/lib/stdlib/test/error_logger_h_SUITE.erl b/lib/stdlib/test/error_logger_h_SUITE.erl
index bf9b6d9ad6..d1f375459b 100644
--- a/lib/stdlib/test/error_logger_h_SUITE.erl
+++ b/lib/stdlib/test/error_logger_h_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2015-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2015-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -57,8 +57,7 @@ logfile(Config) ->
do_one_logfile(Log, Ev, unlimited),
- Pa = "-pa " ++ filename:dirname(code:which(?MODULE)),
- {ok,Node} = start_node(logfile, Pa),
+ {ok,Peer,Node} = ?CT_PEER(),
error_logger:logfile({open,Log}),
ok = rpc:call(Node, erlang, apply, [fun gen_events/1,[Ev]]),
AtNode = iolist_to_binary(["** at node ",atom_to_list(Node)," **"]),
@@ -79,7 +78,7 @@ logfile(Config) ->
end
end, processes()),
- test_server:stop_node(Node),
+ peer:stop(Peer),
cleanup(Log),
ok.
@@ -119,8 +118,7 @@ tty(Config) ->
do_one_tty(Log, Ev, unlimited),
- Pa = "-pa " ++ filename:dirname(code:which(?MODULE)),
- {ok,Node} = start_node(tty, Pa),
+ {ok,Peer,Node} = ?CT_PEER(),
tty_log_open(Log),
ok = rpc:call(Node, erlang, apply, [fun gen_events/1,[Ev]]),
tty_log_close(),
@@ -128,7 +126,7 @@ tty(Config) ->
timer:sleep(1000), % some time get all log events in the log
analyse_events(Log, Ev, [AtNode], unlimited),
- test_server:stop_node(Node),
+ peer:stop(Peer),
cleanup(Log),
ok.
@@ -339,14 +337,6 @@ match_head(Tag, Head) ->
"\\d\\d:\\d\\d:\\d\\d ===$">>,
{match,_} = re:run(Head, Re).
-start_node(Name, Args) ->
- case test_server:start_node(Name, slave, [{args,Args}]) of
- {ok,Node} ->
- {ok,Node};
- Error ->
- ct:fail(Error)
- end.
-
cleanup(File) ->
%% The point of this test case is not to test file operations.
%% Therefore ignore any failures.
diff --git a/lib/stdlib/test/ets_SUITE.erl b/lib/stdlib/test/ets_SUITE.erl
index 588096301d..249a27bd02 100644
--- a/lib/stdlib/test/ets_SUITE.erl
+++ b/lib/stdlib/test/ets_SUITE.erl
@@ -131,7 +131,7 @@ end_per_testcase(_Func, _Config) ->
suite() ->
[{ct_hooks,[ts_install_cth]},
- {timetrap,{minutes,5}}].
+ {timetrap,{minutes,30}}].
all() ->
[{group, new}, {group, insert}, {group, lookup},
@@ -173,14 +173,15 @@ all() ->
take,
whereis_table,
delete_unfix_race,
- %test_throughput_benchmark,
- %{group, benchmark},
+ test_throughput_benchmark,
+ {group, benchmark},
test_table_size_concurrency,
test_table_memory_concurrency,
test_delete_table_while_size_snapshot,
test_decentralized_counters_setting,
ms_excessive_nesting,
- error_info].
+ error_info
+ ].
groups() ->
@@ -265,10 +266,15 @@ end_per_group(benchmark, Config) ->
T = proplists:get_value(ets_benchmark_result_summary_tab, Config),
EtsProcess = proplists:get_value(ets_benchmark_result_summary_tab_process, Config),
Report =
- fun(NOfBenchmarksCtr, TotThroughoutCtr, Name) ->
+ fun(NOfBenchmarksCtr, TotThroughputCtr, Name) ->
Average =
- ets:lookup_element(T, TotThroughoutCtr, 2) /
- ets:lookup_element(T, NOfBenchmarksCtr, 2),
+ case {ets:lookup_element(T, TotThroughputCtr, 2),
+ ets:lookup_element(T, NOfBenchmarksCtr, 2)} of
+ {0.0, 0.0} ->
+ 0;
+ {TotThrp, NBench} ->
+ TotThrp / NBench
+ end,
io:format("~p ~p~n", [Name, Average]),
ct_event:notify(
#event{name = benchmark_data,
@@ -583,12 +589,14 @@ t_repair_continuation(Config) when is_list(Config) ->
repeat_for_opts(fun t_repair_continuation_do/1).
-t_repair_continuation_do(Opts) ->
+t_repair_continuation_do(OptsIn) ->
EtsMem = etsmem(),
MS = [{'_',[],[true]}],
MS2 = [{{{'$1','_'},'_'},[],['$1']}],
- (fun() ->
- T = ets_new(x,[ordered_set|Opts]),
+ run_if_valid_opts(
+ [ordered_set|OptsIn],
+ fun(Opts) ->
+ T = ets_new(x, Opts),
F = fun(0,_)->ok;(N,F) -> ets:insert(T,{N,N}), F(N-1,F) end,
F(1000,F),
{_,C} = ets:select(T,MS,5),
@@ -598,9 +606,11 @@ t_repair_continuation_do(Opts) ->
{[true,true,true,true,true],_} = ets:select(C3),
{[true,true,true,true,true],_} = ets:select(C),
true = ets:delete(T)
- end)(),
- (fun() ->
- T = ets_new(x,[ordered_set|Opts]),
+ end),
+ run_if_valid_opts(
+ [ordered_set|OptsIn],
+ fun(Opts) ->
+ T = ets_new(x, Opts),
F = fun(0,_)->ok;(N,F) -> ets:insert(T,{N,N}), F(N-1,F) end,
F(1000,F),
{_,C} = ets:select(T,MS,1001),
@@ -609,10 +619,12 @@ t_repair_continuation_do(Opts) ->
'$end_of_table' = ets:select(C3),
'$end_of_table' = ets:select(C),
true = ets:delete(T)
- end)(),
+ end),
- (fun() ->
- T = ets_new(x,[ordered_set|Opts]),
+ run_if_valid_opts(
+ [ordered_set|OptsIn],
+ fun(Opts) ->
+ T = ets_new(x, Opts),
F = fun(0,_)->ok;(N,F) ->
ets:insert(T,{integer_to_list(N),N}),
F(N-1,F)
@@ -625,9 +637,11 @@ t_repair_continuation_do(Opts) ->
{[true,true,true,true,true],_} = ets:select(C3),
{[true,true,true,true,true],_} = ets:select(C),
true = ets:delete(T)
- end)(),
- (fun() ->
- T = ets_new(x,[ordered_set|Opts]),
+ end),
+ run_if_valid_opts(
+ [ordered_set|OptsIn],
+ fun(Opts) ->
+ T = ets_new(x, Opts),
F = fun(0,_)->ok;(N,F) ->
ets:insert(T,{{integer_to_list(N),N},N}),
F(N-1,F)
@@ -640,10 +654,10 @@ t_repair_continuation_do(Opts) ->
{[_,_,_,_,_],_} = ets:select(C3),
{[_,_,_,_,_],_} = ets:select(C),
true = ets:delete(T)
- end)(),
+ end),
(fun() ->
- T = ets_new(x,[set|Opts]),
+ T = ets_new(x,[set|OptsIn]),
F = fun(0,_)->ok;(N,F) ->
ets:insert(T,{N,N}),
F(N-1,F)
@@ -658,7 +672,7 @@ t_repair_continuation_do(Opts) ->
true = ets:delete(T)
end)(),
(fun() ->
- T = ets_new(x,[set|Opts]),
+ T = ets_new(x,[set|OptsIn]),
F = fun(0,_)->ok;(N,F) ->
ets:insert(T,{integer_to_list(N),N}),
F(N-1,F)
@@ -673,7 +687,7 @@ t_repair_continuation_do(Opts) ->
true = ets:delete(T)
end)(),
(fun() ->
- T = ets_new(x,[bag|Opts]),
+ T = ets_new(x,[bag|OptsIn]),
F = fun(0,_)->ok;(N,F) ->
ets:insert(T,{integer_to_list(N),N}),
F(N-1,F)
@@ -688,7 +702,7 @@ t_repair_continuation_do(Opts) ->
true = ets:delete(T)
end)(),
(fun() ->
- T = ets_new(x,[duplicate_bag|Opts]),
+ T = ets_new(x,[duplicate_bag|OptsIn]),
F = fun(0,_)->ok;(N,F) ->
ets:insert(T,{integer_to_list(N),N}),
F(N-1,F)
@@ -889,14 +903,19 @@ whitebox_1(Opts) ->
ets:delete(T),
ok.
-whitebox_2(Opts) ->
- T=ets_new(x,[ordered_set, {keypos,2} | Opts]),
- T2=ets_new(x,[set, {keypos,2}| Opts]),
- 0 = ets:select_delete(T,[{{hej},[],[true]}]),
- 0 = ets:select_delete(T,[{{hej,hopp},[],[true]}]),
+whitebox_2(OptsIn) ->
+ run_if_valid_opts(
+ [ordered_set, {keypos,2} | OptsIn],
+ fun (Opts) ->
+ T = ets_new(x, Opts),
+ 0 = ets:select_delete(T,[{{hej},[],[true]}]),
+ 0 = ets:select_delete(T,[{{hej,hopp},[],[true]}]),
+ ets:delete(T)
+ end),
+
+ T2 = ets_new(x,[set, {keypos,2}| OptsIn]),
0 = ets:select_delete(T2,[{{hej},[],[true]}]),
0 = ets:select_delete(T2,[{{hej,hopp},[],[true]}]),
- ets:delete(T),
ets:delete(T2),
ok.
@@ -953,7 +972,7 @@ t_delete_all_objects(Config) when is_list(Config) ->
get_kept_objects(T) ->
case ets:info(T,stats) of
- {_,_,_,_,_,_,KO} ->
+ {_,_,_,_,_,_,KO,_} ->
KO;
_ ->
0
@@ -1063,12 +1082,16 @@ t_delete_object_do(Opts) ->
3999 = ets:info(T,size),
0 = get_kept_objects(T),
ets:delete(T),
- T1 = ets_new(x,[ordered_set | Opts]),
- filltabint(T1,4000),
- del_one_by_one_set(T1,1,4001),
- filltabint(T1,4000),
- del_one_by_one_set(T1,4000,0),
- ets:delete(T1),
+ run_if_valid_opts(
+ [ordered_set | Opts],
+ fun (Opts1) ->
+ T1 = ets_new(x, Opts1),
+ filltabint(T1,4000),
+ del_one_by_one_set(T1,1,4001),
+ filltabint(T1,4000),
+ del_one_by_one_set(T1,4000,0),
+ ets:delete(T1)
+ end),
T2 = ets_new(x,[bag | Opts]),
filltabint2(T2,4000),
del_one_by_one_bag(T2,1,4001),
@@ -1906,7 +1929,7 @@ t_select_replace_next_bug(Config) when is_list(Config) ->
%% OTP-17379
-t_select_pam_stack_overflow_bug(Config) ->
+t_select_pam_stack_overflow_bug(_Config) ->
T = ets:new(k, []),
ets:insert(T,[{x,17}]),
[{x,18}] = ets:select(T,[{{x,17}, [], [{{{element,1,'$_'},{const,18}}}]}]),
@@ -2247,11 +2270,16 @@ update_element_opts(Opts) ->
update_element_opts(Tuple,KeyPos,UpdPos,Opts) ->
Set = ets_new(set,[{keypos,KeyPos} | Opts]),
- OrdSet = ets_new(ordered_set,[ordered_set,{keypos,KeyPos} | Opts]),
update_element(Set,Tuple,KeyPos,UpdPos),
- update_element(OrdSet,Tuple,KeyPos,UpdPos),
true = ets:delete(Set),
- true = ets:delete(OrdSet),
+
+ run_if_valid_opts(
+ [ordered_set,{keypos,KeyPos} | Opts],
+ fun (OptsOrdSet) ->
+ OrdSet = ets_new(ordered_set, OptsOrdSet),
+ update_element(OrdSet,Tuple,KeyPos,UpdPos),
+ true = ets:delete(OrdSet)
+ end),
ok.
update_element(T,Tuple,KeyPos,UpdPos) ->
@@ -2336,13 +2364,18 @@ update_tuple([], Tpl) ->
update_element_neg(Opts) ->
Set = ets_new(set,Opts),
- OrdSet = ets_new(ordered_set,[ordered_set | Opts]),
update_element_neg_do(Set),
- update_element_neg_do(OrdSet),
ets:delete(Set),
{'EXIT',{badarg,_}} = (catch ets:update_element(Set,key,{2,1})),
- ets:delete(OrdSet),
- {'EXIT',{badarg,_}} = (catch ets:update_element(OrdSet,key,{2,1})),
+
+ run_if_valid_opts(
+ [ordered_set | Opts],
+ fun(OptsOrdSet) ->
+ OrdSet = ets_new(ordered_set, OptsOrdSet),
+ update_element_neg_do(OrdSet),
+ ets:delete(OrdSet),
+ {'EXIT',{badarg,_}} = (catch ets:update_element(OrdSet,key,{2,1}))
+ end),
Bag = ets_new(bag,[bag | Opts]),
DBag = ets_new(duplicate_bag,[duplicate_bag | Opts]),
@@ -2393,19 +2426,25 @@ update_counter(Config) when is_list(Config) ->
update_counter_do(Opts) ->
Set = ets_new(set,Opts),
- OrdSet = ets_new(ordered_set,[ordered_set | Opts]),
update_counter_for(Set),
- update_counter_for(OrdSet),
ets:delete_all_objects(Set),
- ets:delete_all_objects(OrdSet),
ets:safe_fixtable(Set, true),
- ets:safe_fixtable(OrdSet, true),
update_counter_for(Set),
- update_counter_for(OrdSet),
ets:safe_fixtable(Set, false),
- ets:safe_fixtable(OrdSet, false),
ets:delete(Set),
- ets:delete(OrdSet),
+
+ run_if_valid_opts(
+ [ordered_set | Opts],
+ fun (OptsOrdSet) ->
+ OrdSet = ets_new(ordered_set, OptsOrdSet),
+ update_counter_for(OrdSet),
+ ets:delete_all_objects(OrdSet),
+ ets:safe_fixtable(OrdSet, true),
+ update_counter_for(OrdSet),
+ ets:safe_fixtable(OrdSet, false),
+ ets:delete(OrdSet)
+ end),
+
update_counter_neg(Opts).
update_counter_for(T) ->
@@ -2553,13 +2592,18 @@ uc_adder(Init, {_Pos, Add, Thres, Warp}) ->
update_counter_neg(Opts) ->
Set = ets_new(set,Opts),
- OrdSet = ets_new(ordered_set,[ordered_set | Opts]),
update_counter_neg_for(Set),
- update_counter_neg_for(OrdSet),
ets:delete(Set),
{'EXIT',{badarg,_}} = (catch ets:update_counter(Set,key,1)),
- ets:delete(OrdSet),
- {'EXIT',{badarg,_}} = (catch ets:update_counter(OrdSet,key,1)),
+
+ run_if_valid_opts(
+ [ordered_set | Opts],
+ fun (OptsOrdSet) ->
+ OrdSet = ets_new(ordered_set, OptsOrdSet),
+ update_counter_neg_for(OrdSet),
+ ets:delete(OrdSet),
+ {'EXIT',{badarg,_}} = (catch ets:update_counter(OrdSet,key,1))
+ end),
Bag = ets_new(bag,[bag | Opts]),
DBag = ets_new(duplicate_bag,[duplicate_bag | Opts]),
@@ -2684,39 +2728,43 @@ update_counter_with_default_do(Opts) ->
2 = ets:info(T1, size),
%% Same with ordered set.
- T2 = ets_new(b, [ordered_set | Opts]),
- 3 = ets:update_counter(T2, foo, 2, {maroilles,1}),
- 1 = ets:info(T2, size),
- 5 = ets:update_counter(T2, foo, 2, {mimolette,1}),
- 1 = ets:info(T2, size),
- [9] = ets:update_counter(T2, foo, [{2,4}], {morbier,1}),
- 1 = ets:info(T2, size),
- 3 = ets:update_counter(T2, {foo,bar}, 2, {{laguiole},1}),
- 2 = ets:info(T2, size),
- 5 = ets:update_counter(T2, {foo,bar}, 2, {{saint,nectaire},1}),
- 2 = ets:info(T2, size),
- [9] = ets:update_counter(T2, {foo,bar}, [{2,4}], {{rocamadour},1}),
- 2 = ets:info(T2, size),
- %% Arithmetically-equal keys.
- 3 = ets:update_counter(T2, 1.0, 2, {1,1}),
- 3 = ets:info(T2, size),
- 5 = ets:update_counter(T2, 1, 2, {1,1}),
- 3 = ets:info(T2, size),
- 7 = ets:update_counter(T2, 1, 2, {1.0,1}),
- 3 = ets:info(T2, size),
- %% Same with reversed type difference.
- 3 = ets:update_counter(T2, 2, 2, {2.0,1}),
- 4 = ets:info(T2, size),
- 5 = ets:update_counter(T2, 2.0, 2, {2.0,1}),
- 4 = ets:info(T2, size),
- 7 = ets:update_counter(T2, 2.0, 2, {2,1}),
- 4 = ets:info(T2, size),
- %% default counter is not an integer.
- {'EXIT',{badarg,_}} = (catch ets:update_counter(T1, qux, 3, {saint,félicien})),
- 4 = ets:info(T2, size),
- %% No third element in default value.
- {'EXIT',{badarg,_}} = (catch ets:update_counter(T1, qux, [{3,1}], {roquefort,1})),
- 4 = ets:info(T2, size),
+ run_if_valid_opts(
+ [ordered_set | Opts],
+ fun (Opts2) ->
+ T2 = ets_new(b, Opts2),
+ 3 = ets:update_counter(T2, foo, 2, {maroilles,1}),
+ 1 = ets:info(T2, size),
+ 5 = ets:update_counter(T2, foo, 2, {mimolette,1}),
+ 1 = ets:info(T2, size),
+ [9] = ets:update_counter(T2, foo, [{2,4}], {morbier,1}),
+ 1 = ets:info(T2, size),
+ 3 = ets:update_counter(T2, {foo,bar}, 2, {{laguiole},1}),
+ 2 = ets:info(T2, size),
+ 5 = ets:update_counter(T2, {foo,bar}, 2, {{saint,nectaire},1}),
+ 2 = ets:info(T2, size),
+ [9] = ets:update_counter(T2, {foo,bar}, [{2,4}], {{rocamadour},1}),
+ 2 = ets:info(T2, size),
+ %% Arithmetically-equal keys.
+ 3 = ets:update_counter(T2, 1.0, 2, {1,1}),
+ 3 = ets:info(T2, size),
+ 5 = ets:update_counter(T2, 1, 2, {1,1}),
+ 3 = ets:info(T2, size),
+ 7 = ets:update_counter(T2, 1, 2, {1.0,1}),
+ 3 = ets:info(T2, size),
+ %% Same with reversed type difference.
+ 3 = ets:update_counter(T2, 2, 2, {2.0,1}),
+ 4 = ets:info(T2, size),
+ 5 = ets:update_counter(T2, 2.0, 2, {2.0,1}),
+ 4 = ets:info(T2, size),
+ 7 = ets:update_counter(T2, 2.0, 2, {2,1}),
+ 4 = ets:info(T2, size),
+ %% default counter is not an integer.
+ {'EXIT',{badarg,_}} = (catch ets:update_counter(T2, qux, 3, {saint,félicien})),
+ 4 = ets:info(T2, size),
+ %% No third element in default value.
+ {'EXIT',{badarg,_}} = (catch ets:update_counter(T2, qux, [{3,1}], {roquefort,1})),
+ 4 = ets:info(T2, size)
+ end),
ok.
%% ERL-1125
@@ -2740,8 +2788,14 @@ update_counter_table_growth(_Config) ->
update_counter_table_growth_do(Opts) ->
Set = ets_new(b, [set | Opts]),
[ets:update_counter(Set, N, {2, 1}, {N, 1}) || N <- lists:seq(1,10000)],
- OrderedSet = ets_new(b, [ordered_set | Opts]),
- [ets:update_counter(OrderedSet, N, {2, 1}, {N, 1}) || N <- lists:seq(1,10000)],
+
+ run_if_valid_opts(
+ [ordered_set | Opts],
+ fun(OptsOrdSet) ->
+ OrdSet = ets_new(b, OptsOrdSet),
+ [ets:update_counter(OrdSet, N, {2, 1}, {N, 1})
+ || N <- lists:seq(1,10000)]
+ end),
ok.
%% Check that a first-next sequence always works on a fixed table.
@@ -2994,8 +3048,9 @@ write_concurrency(Config) when is_list(Config) ->
YesTreeMem = ets:info(Yes7,memory),
YesYesTreeMem = ets:info(Yes14,memory),
NoTreeMem = ets:info(No4,memory),
- io:format("YesMem=~p NoHashMem=~p NoTreeMem=~p YesTreeMem=~p\n",[YesMem,NoHashMem,
- NoTreeMem,YesTreeMem]),
+
+ io:format("YesMem=~p NoHashMem=~p NoTreeMem=~p YesTreeMem=~p YesYesTreeMem=~p\n",
+ [YesMem,NoHashMem,NoTreeMem,YesTreeMem,YesYesTreeMem]),
YesMem = ets:info(Yes2,memory),
YesMem = ets:info(Yes3,memory),
@@ -3020,14 +3075,24 @@ write_concurrency(Config) when is_list(Config) ->
true = YesMem > YesTreeMem,
- case erlang:system_info(schedulers) > 1 of
- true ->
+ case erlang:system_info(schedulers) of
+ 1 ->
+ YesMem = NoHashMem,
+ YesTreeMem = NoTreeMem,
+ YesYesTreeMem = YesTreeMem;
+ NoSchedulers ->
true = YesMem > NoHashMem,
true = YesMem > NoTreeMem,
- true = YesTreeMem < NoTreeMem,
- true = YesYesTreeMem > YesTreeMem;
- _ ->
- one_scheduler_only
+
+ %% The memory of ordered_set with write concurrency is
+ %% smaller than without write concurrency on systems with
+ %% few schedulers.
+ if NoSchedulers > 6 ->
+ true = YesTreeMem >= NoTreeMem;
+ true ->
+ true = YesTreeMem < NoTreeMem
+ end,
+ true = YesYesTreeMem > YesTreeMem
end,
{'EXIT',{badarg,_}} = (catch ets_new(foo,[public,{write_concurrency,foo}])),
@@ -3511,7 +3576,8 @@ interface_equality(Config) when is_list(Config) ->
interface_equality_do(Opts) ->
EtsMem = etsmem(),
Set = ets_new(set,[set | Opts]),
- OrderedSet = ets_new(ordered_set,[ordered_set | Opts]),
+ OrderedSet = ets_new(ordered_set,
+ replace_dbg_hash_fixed_nr_of_locks([ordered_set | Opts])),
F = fun(X,T,FF) -> case X of
0 -> true;
_ ->
@@ -3570,7 +3636,7 @@ maybe_sort(Any) ->
%% Test match, match_object and match_delete in ordered set's.
ordered_match(Config) when is_list(Config)->
- repeat_for_opts(fun ordered_match_do/1).
+ repeat_for_opts_extra_opt(fun ordered_match_do/1, ordered_set).
ordered_match_do(Opts) ->
EtsMem = etsmem(),
@@ -3616,7 +3682,7 @@ ordered_match_do(Opts) ->
%% Test basic functionality in ordered_set's.
ordered(Config) when is_list(Config) ->
- repeat_for_opts(fun ordered_do/1).
+ repeat_for_opts_extra_opt(fun ordered_do/1, ordered_set).
ordered_do(Opts) ->
EtsMem = etsmem(),
@@ -4053,8 +4119,16 @@ delete_large_tab(Config) when is_list(Config) ->
delete_large_tab_do(Config, Opts,Data) ->
delete_large_tab_1(Config, foo_hash, Opts, Data, false),
- delete_large_tab_1(Config, foo_tree, [ordered_set | Opts], Data, false),
- delete_large_tab_1(Config, foo_tree, [stim_cat_ord_set | Opts], Data, false),
+ run_if_valid_opts(
+ [ordered_set | Opts],
+ fun(OptsOrdSet) ->
+ delete_large_tab_1(Config, foo_tree, OptsOrdSet, Data, false)
+ end),
+ run_if_valid_opts(
+ [stim_cat_ord_set | Opts],
+ fun(OptsCat) ->
+ delete_large_tab_1(Config, foo_tree, OptsCat, Data, false)
+ end),
delete_large_tab_1(Config, foo_hash_fix, Opts, Data, true).
@@ -4143,8 +4217,16 @@ delete_large_named_table(Config) when is_list(Config) ->
delete_large_named_table_do(Opts,Data) ->
delete_large_named_table_1(foo_hash, [named_table | Opts], Data, false),
- delete_large_named_table_1(foo_tree, [ordered_set,named_table | Opts], Data, false),
- delete_large_named_table_1(foo_tree, [stim_cat_ord_set,named_table | Opts], Data, false),
+ run_if_valid_opts(
+ [ordered_set,named_table | Opts],
+ fun(OptsOrdSet) ->
+ delete_large_named_table_1(foo_tree, OptsOrdSet, Data, false)
+ end),
+ run_if_valid_opts(
+ [stim_cat_ord_set,named_table | Opts],
+ fun(OptsStimCat) ->
+ delete_large_named_table_1(foo_tree, OptsStimCat, Data, false)
+ end),
delete_large_named_table_1(foo_hash, [named_table | Opts], Data, true).
delete_large_named_table_1(Name, Flags, Data, Fix) ->
@@ -4319,12 +4401,28 @@ exit_many_many_tables_owner(Config) when is_list(Config) ->
repeat_for_opts(fun(Opts) -> exit_many_many_tables_owner_do(Opts,FEData,Config) end).
exit_many_many_tables_owner_do(Opts,FEData,Config) ->
- verify_rescheduling_exit(Config, FEData, [named_table | Opts], true, 200, 5),
- verify_rescheduling_exit(Config, FEData, Opts, false, 200, 5),
+
+ E = ets_new(tmp,Opts),
+ FEData(fun(Data) -> ets:insert(E, Data) end),
+ Mem = ets:info(E,memory) * erlang:system_info(wordsize),
+ ets:delete(E),
+
+ ct:log("Memory per table: ~p bytes",[Mem]),
+
+ Tables =
+ case erlang:system_info(wordsize) of
+ 8 ->
+ 200;
+ 4 ->
+ lists:min([200,2_000_000_000 div (Mem * 5)])
+ end,
+
+ verify_rescheduling_exit(Config, FEData, [named_table | Opts], true, Tables, 5),
+ verify_rescheduling_exit(Config, FEData, Opts, false, Tables, 5),
wait_for_test_procs(),
EtsMem = etsmem(),
- verify_rescheduling_exit(Config, FEData, Opts, true, 200, 5),
- verify_rescheduling_exit(Config, FEData, [named_table | Opts], false, 200, 5),
+ verify_rescheduling_exit(Config, FEData, Opts, true, Tables, 5),
+ verify_rescheduling_exit(Config, FEData, [named_table | Opts], false, Tables, 5),
verify_etsmem(EtsMem).
@@ -4889,6 +4987,44 @@ info(Config) when is_list(Config) ->
{'EXIT',{badarg,_}} = (catch ets:info(make_ref())),
{'EXIT',{badarg,_}} = (catch ets:info(make_ref(), type)),
+ case erlang:system_info(schedulers) of
+ 1 -> %% Fine grained locking is not activated when there is only one scheduler
+ lists:foreach(
+ fun(Type) ->
+ T1 = ets:new(t1, [public, Type, {write_concurrency, auto}]),
+ false = ets:info(T1, write_concurrency),
+ T2 = ets:new(t2, [public, Type, {write_concurrency, true}]),
+ false = ets:info(T2, write_concurrency)
+ end,
+ [set, bag, duplicate_bag, ordered_set]),
+ T2 = ets:new(t2, [public, {write_concurrency, {debug_hash_fixed_number_of_locks, 2049}}]),
+ false = ets:info(T2, write_concurrency);
+ _ ->
+ %% Test that one can set the synchronization granularity level for
+ %% tables of type set
+ T1 = ets:new(t1, [public, {write_concurrency, {debug_hash_fixed_number_of_locks, 1024}}]),
+ {debug_hash_fixed_number_of_locks, 1024} = ets:info(T1, write_concurrency),
+ T2 = ets:new(t2, [public, {write_concurrency, {debug_hash_fixed_number_of_locks, 2048}}]),
+ {debug_hash_fixed_number_of_locks, 2048} = ets:info(T2, write_concurrency),
+ T3 = ets:new(t3, [public, {write_concurrency, {debug_hash_fixed_number_of_locks, 1024}}, {write_concurrency, true}]),
+ true = ets:info(T3, write_concurrency),
+ T4 = ets:new(t4, [private, {write_concurrency, {debug_hash_fixed_number_of_locks, 1024}}]),
+ false = ets:info(T4, write_concurrency),
+ %% Test the auto option
+ lists:foreach(
+ fun(Type) ->
+ T5 = ets:new(t5, [public, Type, {write_concurrency, auto}]),
+ auto = ets:info(T5, write_concurrency)
+ end,
+ [set, bag, duplicate_bag, ordered_set]),
+ T6 = ets:new(t6, [private, {write_concurrency, true}]),
+ false = ets:info(T6, write_concurrency),
+ T7 = ets:new(t7, [private, {write_concurrency, auto}]),
+ false = ets:info(T7, write_concurrency),
+ %% Test that the number of locks is rounded down to the nearest power of two
+ T8 = ets:new(t8, [public, {write_concurrency, {debug_hash_fixed_number_of_locks, 2049}}]),
+ {debug_hash_fixed_number_of_locks, 2048} = ets:info(T8, write_concurrency)
+ end,
ok.
info_do(Opts) ->
@@ -4954,7 +5090,6 @@ info_do(Opts) ->
{value, {id, Tab}} = lists:keysearch(id, 1, Res),
{value, {decentralized_counters, _DecentralizedCtrs}} =
lists:keysearch(decentralized_counters, 1, Res),
-
%% Test 'binary'
[] = ?ets_info(Tab, binary, SlavePid),
BinSz = 100,
@@ -4979,7 +5114,6 @@ info_do(Opts) ->
unlink(SlavePid),
exit(SlavePid,kill),
-
true = ets:delete(Tab),
verify_etsmem(EtsMem).
@@ -5117,18 +5251,26 @@ test_table_size_concurrency(Config) when is_list(Config) ->
case erlang:system_info(schedulers) of
1 -> {skip,"Only valid on smp > 1 systems"};
_ ->
- BaseOptions = [public, {write_concurrency, true}],
- test_table_counter_concurrency(size, [set | BaseOptions]),
- test_table_counter_concurrency(size, [ordered_set | BaseOptions])
+ lists:foreach(
+ fun(WriteConcurrencyOpt) ->
+ BaseOptions = [public, {write_concurrency, WriteConcurrencyOpt}],
+ test_table_counter_concurrency(size, [set | BaseOptions]),
+ test_table_counter_concurrency(size, [ordered_set | BaseOptions])
+ end,
+ [true, auto])
end.
test_table_memory_concurrency(Config) when is_list(Config) ->
case erlang:system_info(schedulers) of
1 -> {skip,"Only valid on smp > 1 systems"};
_ ->
- BaseOptions = [public, {write_concurrency, true}],
- test_table_counter_concurrency(memory, [set | BaseOptions]),
- test_table_counter_concurrency(memory, [ordered_set | BaseOptions])
+ lists:foreach(
+ fun(WriteConcurrencyOpt) ->
+ BaseOptions = [public, {write_concurrency, WriteConcurrencyOpt}],
+ test_table_counter_concurrency(memory, [set | BaseOptions]),
+ test_table_counter_concurrency(memory, [ordered_set | BaseOptions])
+ end,
+ [true, auto])
end.
%% Tests that calling the ets:delete operation on a table T with
@@ -5138,13 +5280,13 @@ test_delete_table_while_size_snapshot(Config) when is_list(Config) ->
%% Run test case in a slave node as other test suites in stdlib
%% depend on that pids are ordered in creation order which is no
%% longer the case when many processes have been started before
- Node = start_slave(),
+ {ok, Peer, Node} = ?CT_PEER(),
[ok = rpc:call(Node,
?MODULE,
test_delete_table_while_size_snapshot_helper,
[TableType])
|| TableType <- [set, ordered_set]],
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
test_delete_table_while_size_snapshot_helper(TableType) ->
@@ -5181,13 +5323,6 @@ size_process(Table, Parent) ->
E -> Parent ! {got_unexpected_exception, E}
end.
-start_slave() ->
- MicroSecs = erlang:monotonic_time(),
- Name = "ets_" ++ integer_to_list(MicroSecs),
- Pa = filename:dirname(code:which(?MODULE)),
- {ok, Node} = test_server:start_node(list_to_atom(Name), slave, [{args, "-pa " ++ Pa}]),
- Node.
-
repeat_par(FunToRepeat, NrOfTimes) ->
repeat_par_help(FunToRepeat, NrOfTimes, NrOfTimes).
@@ -5218,25 +5353,42 @@ test_decentralized_counters_setting(Config) when is_list(Config) ->
do_test_decentralized_counters_setting(TableType) ->
wait_for_memory_deallocations(),
FlxCtrMemUsage = erts_debug:get_internal_state(flxctr_memory_usage),
+ FixOptsList =
+ fun(Opts) ->
+ case TableType of
+ ordered_set ->
+ replace_dbg_hash_fixed_nr_of_locks(Opts);
+ set ->
+ Opts
+ end
+ end,
lists:foreach(
fun(OptList) ->
- T1 = ets:new(t1, [public, TableType] ++ OptList ++ [TableType]),
+ T1 = ets:new(t1, FixOptsList([public, TableType] ++ OptList ++ [TableType])),
check_decentralized_counters(T1, false, FlxCtrMemUsage),
ets:delete(T1)
end,
- [[{write_concurrency, false}],
- [{write_concurrency, true}, {decentralized_counters, false}]]),
+ [[{write_concurrency, false}]] ++
+ case TableType of
+ set ->
+ [[{write_concurrency, true}, {decentralized_counters, false}],
+ [{write_concurrency, {debug_hash_fixed_number_of_locks, 1024}}, {write_concurrency, true}]];
+ ordered_set -> []
+ end),
lists:foreach(
fun(OptList) ->
- T1 = ets:new(t1, [public,
- TableType,
- {write_concurrency, true}] ++ OptList ++ [TableType]),
+ T1 = ets:new(t1,
+ FixOptsList([public,
+ TableType,
+ {write_concurrency, true}] ++ OptList ++ [TableType])),
check_decentralized_counters(T1, true, FlxCtrMemUsage),
ets:delete(T1),
wait_for_memory_deallocations(),
FlxCtrMemUsage = erts_debug:get_internal_state(flxctr_memory_usage)
end,
- [[{decentralized_counters, true}]]),
+ [[{decentralized_counters, true}],
+ [{write_concurrency, {debug_hash_fixed_number_of_locks, 1024}}],
+ [{write_concurrency, auto}]]),
ok.
do_test_decentralized_counters_default_setting() ->
@@ -6028,7 +6180,8 @@ xfilltabstr(Tab,N) ->
fill_sets_int(N) ->
fill_sets_int(N,[]).
fill_sets_int(N,Opts) ->
- Tab1 = ets_new(xxx, [ordered_set|Opts]),
+ Tab1 = ets_new(xxx,
+ replace_dbg_hash_fixed_nr_of_locks([ordered_set|Opts])),
filltabint(Tab1,N),
Tab2 = ets_new(xxx, [set|Opts]),
filltabint(Tab2,N),
@@ -6039,7 +6192,8 @@ fill_sets_int(N,Opts) ->
[Tab1,Tab2,Tab3,Tab4].
fill_sets_intup(N,Opts) ->
- Tab1 = ets_new(xxx, [ordered_set|Opts]),
+ Tab1 = ets_new(xxx,
+ replace_dbg_hash_fixed_nr_of_locks([ordered_set|Opts])),
filltabintup(Tab1,N),
Tab2 = ets_new(xxx, [set|Opts]),
filltabintup(Tab2,N),
@@ -6910,7 +7064,7 @@ verify_table_load(T) ->
ordered_set -> ok;
_ ->
Stats = ets:info(T,stats),
- {Buckets,AvgLen,StdDev,ExpSD,_MinLen,_MaxLen,_} = Stats,
+ {Buckets,AvgLen,StdDev,ExpSD,_MinLen,_MaxLen,_,_} = Stats,
ok = if
AvgLen > 1.2 ->
io:format("Table overloaded: Stats=~p\n~p\n",
@@ -7406,9 +7560,15 @@ whereis_table(Config) when is_list(Config) ->
Tid = ets:whereis(whereis_test),
ets:insert(whereis_test, [{hello}, {there}]),
-
- [[{hello}],[{there}]] = ets:match(whereis_test, '$1'),
- [[{hello}],[{there}]] = ets:match(Tid, '$1'),
+ CheckMatch =
+ fun(MatchRes) ->
+ case MatchRes of
+ [[{there}],[{hello}]] -> ok;
+ [[{hello}],[{there}]] -> ok
+ end
+ end,
+ CheckMatch(ets:match(whereis_test, '$1')),
+ CheckMatch(ets:match(Tid, '$1')),
true = ets:delete_all_objects(Tid),
@@ -7674,7 +7834,9 @@ prefill_insert_map_loop(T, RS0, N, ObjFun, InsertMap, NrOfSchedulers) ->
[set, public],
[set, public, {write_concurrency, true}],
[set, public, {read_concurrency, true}],
- [set, public, {write_concurrency, true}, {read_concurrency, true}]
+ [set, public, {write_concurrency, true}, {read_concurrency, true}],
+ [set, public, {write_concurrency, auto}, {read_concurrency, true}],
+ [set, public, {write_concurrency, {debug_hash_fixed_number_of_locks, 16384}}]
],
etsmem_fun = fun() -> ok end,
verify_etsmem_fun = fun(_) -> true end,
@@ -8039,10 +8201,15 @@ long_throughput_benchmark(Config) when is_list(Config) ->
]
],
table_types =
- [
- [ordered_set, public, {write_concurrency, true}, {read_concurrency, true}],
- [set, public, {write_concurrency, true}, {read_concurrency, true}]
- ],
+ ([
+ [ordered_set, public, {write_concurrency, true}, {read_concurrency, true}],
+ [set, public, {write_concurrency, true}, {read_concurrency, true}]
+ ] ++
+ case catch list_to_integer(erlang:system_info(otp_release)) of
+ Recent when is_integer(Recent), Recent >= 25 ->
+ [[set, public, {write_concurrency, auto}, {read_concurrency, true}]];
+ _Old -> []
+ end),
etsmem_fun = fun etsmem/0,
verify_etsmem_fun = fun verify_etsmem/1,
notify_res_fun =
@@ -9210,8 +9377,30 @@ make_unaligned_sub_binary(Bin0) when is_binary(Bin0) ->
make_unaligned_sub_binary(List) ->
make_unaligned_sub_binary(list_to_binary(List)).
+replace_dbg_hash_fixed_nr_of_locks(Opts) ->
+ [case X of
+ {write_concurrency, {debug_hash_fixed_number_of_locks, _}} ->
+ {write_concurrency, true};
+ _ -> X
+ end || X <- Opts].
+
%% Repeat test function with different combination of table options
-%%
+%%
+repeat_for_opts_extra_opt(F, Extra) ->
+ repeat_for_opts(
+ fun(Opts) ->
+ WithExtra =
+ case erlang:is_list(Extra) of
+ true -> Extra ++ Opts;
+ false ->[Extra | Opts]
+ end,
+ case is_invalid_opts_combo(WithExtra) of
+ true -> ok;
+ false -> F(WithExtra)
+ end
+ end,
+ [write_concurrency, read_concurrency, compressed]).
+
repeat_for_opts(F) ->
repeat_for_opts(F, [write_concurrency, read_concurrency, compressed]).
@@ -9270,17 +9459,43 @@ repeat_for_opts_atom2list(ord_set_types) -> [ordered_set,stim_cat_ord_set,cat_or
repeat_for_opts_atom2list(all_types) -> [set,ordered_set,stim_cat_ord_set,cat_ord_set,bag,duplicate_bag];
repeat_for_opts_atom2list(all_non_stim_types) -> [set,ordered_set,cat_ord_set,bag,duplicate_bag];
repeat_for_opts_atom2list(all_non_stim_set_types) -> [set,ordered_set,cat_ord_set];
-repeat_for_opts_atom2list(write_concurrency) -> [{write_concurrency,false},{write_concurrency,true}];
+repeat_for_opts_atom2list(write_concurrency) -> [{write_concurrency,false},
+ {write_concurrency,true},
+ {write_concurrency, {debug_hash_fixed_number_of_locks, 2048}},
+ {write_concurrency,auto}];
repeat_for_opts_atom2list(read_concurrency) -> [{read_concurrency,false},{read_concurrency,true}];
repeat_for_opts_atom2list(compressed) -> [void,compressed].
+is_invalid_opts_combo(Opts) ->
+ FixedNumLocksOption =
+ lists:any(
+ fun({write_concurrency, {debug_hash_fixed_number_of_locks, _}}) ->
+ true;
+ (_) ->
+ false
+ end,
+ Opts),
+ OrderedSet = lists:member(ordered_set, Opts) orelse
+ lists:member(stim_cat_ord_set, Opts) orelse
+ lists:member(cat_ord_set, Opts),
+ OrderedSet andalso FixedNumLocksOption.
+
+run_if_valid_opts(Opts, F) ->
+ case is_invalid_opts_combo(Opts) of
+ true -> ignore;
+ false -> F(Opts)
+ end.
+
is_redundant_opts_combo(Opts) ->
- (lists:member(stim_cat_ord_set, Opts) orelse
- lists:member(cat_ord_set, Opts))
- andalso
- (lists:member({write_concurrency, false}, Opts) orelse
- lists:member(private, Opts) orelse
- lists:member(protected, Opts)).
+ IsRed1 =
+ ((lists:member(stim_cat_ord_set, Opts) orelse
+ lists:member(cat_ord_set, Opts))
+ andalso
+ (lists:member({write_concurrency, false}, Opts) orelse
+ lists:member(private, Opts) orelse
+ lists:member(protected, Opts))),
+ IsRed2 = is_invalid_opts_combo(Opts),
+ IsRed1 orelse IsRed2.
%% Add fake table option with info about key range.
%% Will be consumed by ets_new and used for stim_cat_ord_set.
diff --git a/lib/stdlib/test/ets_SUITE_data/visualize_throughput.html b/lib/stdlib/test/ets_SUITE_data/visualize_throughput.html
index 922a3790ea..43076c70ca 100644
--- a/lib/stdlib/test/ets_SUITE_data/visualize_throughput.html
+++ b/lib/stdlib/test/ets_SUITE_data/visualize_throughput.html
@@ -4,7 +4,7 @@
<!-- %% -->
<!-- %% %CopyrightBegin% -->
<!-- %% -->
-<!-- %% Copyright Ericsson AB and Kjell Winblad 1996-2020. All Rights Reserved. -->
+<!-- %% Copyright Ericsson AB and Kjell Winblad 1996-2021. All Rights Reserved. -->
<!-- %% -->
<!-- %% Licensed under the Apache License, Version 2.0 (the "License"); -->
<!-- %% you may not use this file except in compliance with the License. -->
@@ -240,10 +240,12 @@
function plotScenario(name, plotType) {
var data = scenarioDataMap[name];
var yAxisTitle = undefined;
+ var graphId = "graph" + nrOfGraphs;
+ var fullscreenButtonid = "fullscreenButton" + nrOfGraphs;
nrOfGraphs = nrOfGraphs + 1;
- $("<div class='added' id='graph" + nrOfGraphs + "'>")
+ $("<div class='added' id='" + graphId + "'>")
.insertBefore(insertPlaceholder);
- $("<button type='button' class='added' id='fullscreenButton" + nrOfGraphs + "'>Fill screen</button>")
+ $("<button type='button' class='added' id='" + fullscreenButtonid + "'>Fill screen</button>")
.insertBefore(insertPlaceholder);
$("<span class='added'><br><hr><br></span>")
.insertBefore(insertPlaceholder);
@@ -265,17 +267,17 @@
title: yAxisTitle
}
};
- $("#fullscreenButton" + nrOfGraphs).click(
+ $("#" + fullscreenButtonid).click(
function () {
- $('#graph' + nrOfGraphs).replaceWith(
- $("<div class='added' id='graph" + nrOfGraphs + "'>"));
+ $('#' + graphId).replaceWith(
+ $("<div class='added' id='" + graphId + "'>"));
layout = $.extend({}, layout, {
width: $(window).width() - 40,
height: $(window).height() - 40
});
- Plotly.newPlot('graph' + nrOfGraphs, data, layout);
+ Plotly.newPlot(graphId, data, layout);
});
- Plotly.newPlot('graph' + nrOfGraphs, data, layout);
+ Plotly.newPlot(graphId, data, layout);
}
$.each(scenarioList,
function (index, name) {
diff --git a/lib/stdlib/test/filelib_SUITE.erl b/lib/stdlib/test/filelib_SUITE.erl
index 15603aee9a..eac0dea4d8 100644
--- a/lib/stdlib/test/filelib_SUITE.erl
+++ b/lib/stdlib/test/filelib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,9 +25,13 @@
init_per_testcase/2,end_per_testcase/2,
wildcard_one/1,wildcard_two/1,wildcard_errors/1,
fold_files/1,otp_5960/1,ensure_dir_eexist/1,ensure_dir_symlink/1,
+ ensure_path_single_dir/1, ensure_path_nested_dirs/1,
+ ensure_path_binary_args/1, ensure_path_symlink/1,
+ ensure_path_relative_path/1, ensure_path_relative_path_dot_dot/1,
+ ensure_path_invalid_path/1,
wildcard_symlink/1, is_file_symlink/1, file_props_symlink/1,
- find_source/1, find_source_subdir/1, safe_relative_path/1,
- safe_relative_path_links/1]).
+ find_source/1, find_source_subdir/1, find_source_otp/1,
+ safe_relative_path/1, safe_relative_path_links/1]).
-import(lists, [foreach/2]).
@@ -49,9 +53,13 @@ suite() ->
all() ->
[wildcard_one, wildcard_two, wildcard_errors,
fold_files, otp_5960, ensure_dir_eexist, ensure_dir_symlink,
+ ensure_path_single_dir, ensure_path_nested_dirs, ensure_path_binary_args,
+ ensure_path_symlink, ensure_path_relative_path,
+ ensure_path_relative_path_dot_dot,
+ ensure_path_invalid_path,
wildcard_symlink, is_file_symlink, file_props_symlink,
- find_source, find_source_subdir, safe_relative_path,
- safe_relative_path_links].
+ find_source, find_source_subdir, find_source_otp,
+ safe_relative_path, safe_relative_path_links].
groups() ->
[].
@@ -458,6 +466,74 @@ ensure_dir_symlink(Config) when is_list(Config) ->
ok = filelib:ensure_dir(SymlinkedName)
end.
+ensure_path_single_dir(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ Dir = filename:join(PrivDir, "ensure_path_single_dir"),
+ ok = filelib:ensure_path(Dir),
+ true = filelib:is_dir(Dir).
+
+ensure_path_nested_dirs(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ BaseDir = filename:join(PrivDir, "ensure_path_nested_dirs"),
+ Path = filename:join(BaseDir, "foo/bar/baz"),
+ ok = filelib:ensure_path(Path),
+ true = filelib:is_dir(Path).
+
+ensure_path_binary_args(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ BaseDir = filename:join(PrivDir, "ensure_path_binary_args"),
+ Path = filename:join(BaseDir, "foo/bar/baz"),
+ ok = filelib:ensure_path(list_to_binary(Path)),
+ true = filelib:is_dir(Path).
+
+ensure_path_invalid_path(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ BaseDir = filename:join(PrivDir, "ensure_path_invalid_path"),
+ ok = filelib:ensure_path(BaseDir),
+ FileName = filename:join(BaseDir, "foo"),
+ ok = file:write_file(FileName, <<"eh?\n">>),
+ Path = filename:join(FileName, "foo/bar/baz"),
+ {error,enotdir} = filelib:ensure_path(Path),
+ false = filelib:is_dir(Path).
+
+ensure_path_relative_path(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ BaseDir = filename:join(PrivDir, "ensure_path_relative_path"),
+ ok = filelib:ensure_path(BaseDir),
+ ok = file:set_cwd(BaseDir),
+ Path = filename:join(BaseDir, "foo/bar/baz"),
+ ok = filelib:ensure_path("foo/bar/baz"),
+ true = filelib:is_dir(Path).
+
+ensure_path_relative_path_dot_dot(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ BaseDir = filename:join(PrivDir, "ensure_path_relative_path"),
+ SubDir = filename:join(BaseDir, "dot_dot"),
+ ok = filelib:ensure_path(SubDir),
+ ok = file:set_cwd(SubDir),
+ Path = filename:join(BaseDir, "foo/bar/baz"),
+ ok = filelib:ensure_path("../foo/bar/baz"),
+ true = filelib:is_dir(Path).
+
+ensure_path_symlink(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ Dir = filename:join(PrivDir, "ensure_path_symlink"),
+ Name = filename:join(Dir, "same_name_as_file_and_dir"),
+ ok = filelib:ensure_path(Dir),
+ ok = file:write_file(Name, <<"some string\n">>),
+ %% With a symlink to the directory.
+ Symlink = filename:join(PrivDir, "ensure_path_symlink_link"),
+ case file:make_symlink(Dir, Symlink) of
+ {error,enotsup} ->
+ {skip,"Symlinks not supported on this platform"};
+ {error,eperm} ->
+ {win32,_} = os:type(),
+ {skip,"Windows user not privileged to create symlinks"};
+ ok ->
+ SymlinkedName = filename:join(Symlink, "same_name_as_file_and_dir"),
+ ok = filelib:ensure_dir(SymlinkedName)
+ end.
+
wildcard_symlink(Config) when is_list(Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
Dir = filename:join(PrivDir, ?MODULE_STRING++"_wildcard_symlink"),
@@ -652,6 +728,32 @@ find_source_subdir(Config) when is_list(Config) ->
ok.
+%% Test that all available beam files in Erlang/OTP can be
+%% tracked to their source files.
+find_source_otp(Config) when is_list(Config) ->
+ %% We do this in a peer as testcases before this may have
+ %% edited the code path and thus more modules show up as
+ %% available than should.
+ {ok, Peer, Node} = ?CT_PEER(#{ env => [{"ERL_LIBS", false}] }),
+ erpc:call(
+ Node,
+ fun() ->
+ lists:map(
+ fun F({Module, preloaded, Loaded}) ->
+ F({Module, code:where_is_file(Module ++ ".beam"), Loaded});
+ F({Module, cover_compiled, Loaded}) ->
+ ok;
+ F({Module, Filename, _Loaded}) ->
+ case filelib:find_source(Filename) of
+ {ok, _} -> ok;
+ {error,_} = E ->
+ ct:fail({failed_to_find, Module, Filename, E})
+ end
+ end, code:all_available())
+ end),
+ peer:stop(Peer),
+ ok.
+
safe_relative_path(Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
Root = filename:join(PrivDir, "filelib_SUITE_safe_relative_path"),
diff --git a/lib/stdlib/test/gen_event_SUITE.erl b/lib/stdlib/test/gen_event_SUITE.erl
index 0787dee5e1..65c5a83c9e 100644
--- a/lib/stdlib/test/gen_event_SUITE.erl
+++ b/lib/stdlib/test/gen_event_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -32,7 +32,9 @@
start_opt/1,
undef_init/1, undef_handle_call/1, undef_handle_event/1,
undef_handle_info/1, undef_code_change/1, undef_terminate/1,
- undef_in_terminate/1, format_log_1/1, format_log_2/1]).
+ undef_in_terminate/1, format_log_1/1, format_log_2/1,
+ send_request_receive_reqid_collection/1, send_request_wait_reqid_collection/1,
+ send_request_check_reqid_collection/1]).
suite() -> [{ct_hooks,[ts_install_cth]}].
@@ -41,7 +43,9 @@ all() ->
call_format_status, call_format_status_anon, error_format_status,
get_state, replace_state,
start_opt, {group, undef_callbacks}, undef_in_terminate,
- format_log_1, format_log_2].
+ format_log_1, format_log_2,
+ send_request_receive_reqid_collection, send_request_wait_reqid_collection,
+ send_request_check_reqid_collection].
groups() ->
[{test_all, [],
@@ -974,7 +978,7 @@ call(Config) when is_list(Config) ->
ok.
flush() ->
- receive _ -> flush() after 0 -> ok end.
+ receive M -> [M|flush()] after 0 -> [] end.
info(Config) when is_list(Config) ->
{ok,_} = gen_event:start({local, my_dummy_handler}),
@@ -1100,22 +1104,25 @@ info(Config) when is_list(Config) ->
ok = gen_event:stop(my_dummy_handler),
ok.
-%% Test that sys:get_status/1,2 calls format_status/2.
+%% Test that sys:get_status/1,2 calls format_status/1,2.
call_format_status(Config) when is_list(Config) ->
+ call_format_status(dummy1_h),
+ call_format_status(dummy_h);
+call_format_status(Module) when is_atom(Module) ->
{ok, Pid} = gen_event:start({local, my_dummy_handler}),
%% State here intentionally differs from what we expect from format_status
State = self(),
FmtState = "dummy1_h handler state",
- ok = gen_event:add_handler(my_dummy_handler, dummy1_h, [State]),
+ ok = gen_event:add_handler(my_dummy_handler, Module, [State]),
Status1 = sys:get_status(Pid),
Status2 = sys:get_status(Pid, 5000),
ok = gen_event:stop(Pid),
{status, Pid, _, [_, _, Pid, [], Data1]} = Status1,
HandlerInfo1 = proplists:get_value(items, Data1),
- {"Installed handlers", [{_,dummy1_h,_,FmtState,_}]} = HandlerInfo1,
+ {"Installed handlers", [{_,Module,_,FmtState,_}]} = HandlerInfo1,
{status, Pid, _, [_, _, Pid, [], Data2]} = Status2,
HandlerInfo2 = proplists:get_value(items, Data2),
- {"Installed handlers", [{_,dummy1_h,_,FmtState,_}]} = HandlerInfo2,
+ {"Installed handlers", [{_,Module,_,FmtState,_}]} = HandlerInfo2,
ok.
%% Test that sys:get_status/1,2 calls format_status/2 for anonymous
@@ -1136,28 +1143,38 @@ call_format_status_anon(Config) when is_list(Config) ->
error_format_status(Config) when is_list(Config) ->
error_logger_forwarder:register(),
OldFl = process_flag(trap_exit, true),
+ try
+ error_format_status(dummy1_h),
+ error_format_status(dummy_h)
+ after
+ process_flag(trap_exit, OldFl),
+ error_logger_forwarder:unregister()
+ end;
+error_format_status(Module) when is_atom(Module) ->
State = self(),
{ok, Pid} = gen_event:start({local, my_dummy_handler}),
- ok = gen_event:add_sup_handler(my_dummy_handler, dummy1_h, [State]),
+ ok = gen_event:add_sup_handler(my_dummy_handler, Module, [State]),
ok = gen_event:notify(my_dummy_handler, do_crash),
receive
- {gen_event_EXIT,dummy1_h,{'EXIT',_}} -> ok
+ {gen_event_EXIT,Module,{'EXIT',_}} -> ok
after 5000 ->
- ct:fail(exit_gen_event)
+ ct:fail({exit_gen_event,flush()})
end,
FmtState = "dummy1_h handler state",
receive
{error,_GroupLeader, {Pid,
"** gen_event handler"++_,
- [dummy1_h,my_dummy_handler,do_crash,
+ [Module,my_dummy_handler,do_crash,
FmtState, _]}} ->
ok;
Other ->
- io:format("Unexpected: ~p", [Other]),
+ ct:pal("Unexpected: ~p", [Other]),
ct:fail(failed)
+ after 5000 ->
+ ct:fail({exit_gen_event,flush()})
end,
+ unlink(Pid),
ok = gen_event:stop(Pid),
- process_flag(trap_exit, OldFl),
ok.
%% Test that sys:get_state/1,2 return the gen_event state.
@@ -1321,23 +1338,30 @@ format_log_1(_Config) ->
Warning = #{label=>{gen_event,no_handle_info},
module=>?MODULE,
- message=>Term},
+ message=> Term},
{WF1,WA1} = gen_event:format_log(Warning),
WFExpected1 = "** Undefined handle_info in ~p\n"
"** Unhandled message: ~tp\n",
ct:log("WF1: ~ts~nWA1: ~tp", [WF1,WA1]),
WFExpected1 = WF1,
[?MODULE,Term] = WA1,
+ WarningLimited = [1,2,3,4,5,6,7,8,9,'...'],
Depth = 10,
ok = application:set_env(kernel, error_logger_format_depth, Depth),
- Limited = [1,2,3,4,5,6,7,8,9,'...'],
+ Limited = [1,2,3,4,5,6,7,8,'...'],
+ LastMsg = ["Last msg" | Term],
+ State = ["State" | Term],
+ Reason = ["Reason" | Term],
+ LastMsgLimited = ["Last msg" | Limited],
+ StateLimited = ["State" | Limited],
+ ReasonLimited = ["Reason" | Limited],
{F2,A2} = gen_event:format_log(#{label=>{gen_event,terminate},
handler=>Handler,
name=>Name,
- last_message=>Term,
- state=>Term,
- reason=>Term}),
+ last_message=>LastMsg,
+ state=>State,
+ reason=>Reason}),
FExpected2 = "** gen_event handler ~tP crashed.\n"
"** Was installed in ~tP\n"
"** Last event was: ~tP\n"
@@ -1345,14 +1369,15 @@ format_log_1(_Config) ->
"** Reason == ~tP\n",
ct:log("F2: ~ts~nA2: ~tp", [F2,A2]),
FExpected2 = F2,
- [Handler,Depth,Name,Depth,Limited,Depth,Limited,Depth,Limited,Depth] = A2,
+ [Handler,Depth,Name,Depth,LastMsgLimited,Depth,StateLimited,Depth,ReasonLimited,Depth] = A2,
{WF2,WA2} = gen_event:format_log(Warning),
WFExpected2 = "** Undefined handle_info in ~p\n"
"** Unhandled message: ~tP\n",
ct:log("WF2: ~ts~nWA2: ~tp", [WF2,WA2]),
WFExpected2 = WF2,
- [?MODULE,Limited,Depth] = WA2,
+ ct:log("WF2: ~tp~nWA2: ~tp", [[?MODULE,WarningLimited,Depth], WA2]),
+ [?MODULE,WarningLimited,Depth] = WA2,
case FD of
undefined ->
@@ -1501,3 +1526,324 @@ format_log_2(_Config) ->
flatten_format_log(Report, Format) ->
lists:flatten(gen_event:format_log(Report, Format)).
+
+
+send_request_receive_reqid_collection(Config) when is_list(Config) ->
+ {ok, Pid1} = gen_event:start(),
+ ok = gen_event:add_handler(Pid1, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid1),
+ {ok, Pid2} = gen_event:start(),
+ ok = gen_event:add_handler(Pid2, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid2),
+ {ok, Pid3} = gen_event:start(),
+ ok = gen_event:add_handler(Pid3, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid3),
+ send_request_receive_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_receive_reqid_collection_timeout(Pid1, Pid2, Pid3),
+ send_request_receive_reqid_collection_error(Pid1, Pid2, Pid3),
+ ok = gen_event:stop(Pid1),
+ try gen_event:stop(Pid2) catch exit:noproc -> ok end,
+ ok = gen_event:stop(Pid3).
+
+send_request_receive_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqId1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,400}),
+ ReqIdC1 = gen_event:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = gen_event:reqids_size(ReqIdC1),
+
+ ReqIdC2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}, req2, ReqIdC1),
+ 2 = gen_event:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_event:reqids_size(ReqIdC3),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_event:receive_response(ReqIdC3, infinity, true),
+ 2 = gen_event:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_event:receive_response(ReqIdC4, 5678, true),
+ 1 = gen_event:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_event:receive_response(ReqIdC5, 5000, true),
+ 0 = gen_event:reqids_size(ReqIdC6),
+
+ no_request = gen_event:receive_response(ReqIdC6, 5000, true),
+
+ {reply, {ok, hejhopp}} = gen_event:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_receive_reqid_collection_timeout(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqId1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,1000}),
+ ReqIdC1 = gen_event:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqId3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,500}),
+ ReqIdC3 = gen_event:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_event:receive_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = gen_event:reqids_size(ReqIdC4),
+
+ timeout = gen_event:receive_response(ReqIdC4, {abs, Deadline}, true),
+
+ Abandoned = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Abandoned = lists:sort(gen_event:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were abandoned...
+ timeout = gen_event:receive_response(ReqIdC4, {abs, Deadline+1000}, true),
+
+ {reply, {ok, hejhopp}} = gen_event:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_receive_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqId1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,400}),
+ ReqIdC1 = gen_event:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_event:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ exit(Pid2, kill),
+ ReqIdC2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}, req2, ReqIdC1),
+ ReqIdC3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,200}, req3, ReqIdC2),
+ ReqIdC4 = gen_event:send_request(Pid1, bad_h, hejsan, req4, ReqIdC3),
+ 4 = gen_event:reqids_size(ReqIdC4),
+
+ {{error, {noproc, _}}, req2, ReqIdC5} = gen_event:receive_response(ReqIdC4, 2000, true),
+ 3 = gen_event:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_event:receive_response(ReqIdC5, infinity, false),
+ {{reply, delayed}, req1, ReqIdC5} = gen_event:receive_response(ReqIdC5, infinity, false),
+ {{error, bad_module}, req4, ReqIdC5} = gen_event:wait_response(ReqIdC5, infinity, false),
+
+ {reply, {ok, hejhopp}} = gen_event:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection(Config) when is_list(Config) ->
+ {ok, Pid1} = gen_event:start(),
+ ok = gen_event:add_handler(Pid1, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid1),
+ {ok, Pid2} = gen_event:start(),
+ ok = gen_event:add_handler(Pid2, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid2),
+ {ok, Pid3} = gen_event:start(),
+ ok = gen_event:add_handler(Pid3, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid3),
+ send_request_wait_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_wait_reqid_collection_timeout(Pid1, Pid2, Pid3),
+ send_request_wait_reqid_collection_error(Pid1, Pid2, Pid3),
+ ok = gen_event:stop(Pid1),
+ try gen_event:stop(Pid2) catch exit:noproc -> ok end,
+ ok = gen_event:stop(Pid3).
+
+send_request_wait_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqId1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,400}),
+ ReqIdC1 = gen_event:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = gen_event:reqids_size(ReqIdC1),
+
+ ReqIdC2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}, req2, ReqIdC1),
+ 2 = gen_event:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_event:reqids_size(ReqIdC3),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_event:wait_response(ReqIdC3, infinity, true),
+ 2 = gen_event:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_event:wait_response(ReqIdC4, 5678, true),
+ 1 = gen_event:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_event:wait_response(ReqIdC5, 5000, true),
+ 0 = gen_event:reqids_size(ReqIdC6),
+
+ no_request = gen_event:wait_response(ReqIdC6, 5000, true),
+
+ {reply, {ok, hejhopp}} = gen_event:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection_timeout(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqId1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,1000}),
+ ReqIdC1 = gen_event:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqId3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,500}),
+ ReqIdC3 = gen_event:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_event:wait_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = gen_event:reqids_size(ReqIdC4),
+
+ timeout = gen_event:wait_response(ReqIdC4, {abs, Deadline}, true),
+
+ Unhandled = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Unhandled = lists:sort(gen_event:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were not abandoned...
+ {{reply, delayed}, req3, ReqIdC4} = gen_event:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+ {{reply, delayed}, req1, ReqIdC4} = gen_event:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+
+ {reply, {ok, hejhopp}} = gen_event:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqId1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,400}),
+ ReqIdC1 = gen_event:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_event:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ exit(Pid2, kill),
+ ReqIdC2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}, req2, ReqIdC1),
+ ReqIdC3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,200}, req3, ReqIdC2),
+ ReqIdC4 = gen_event:send_request(Pid1, bad_h, hejsan, req4, ReqIdC3),
+ 4 = gen_event:reqids_size(ReqIdC4),
+
+ {{error, {noproc, _}}, req2, ReqIdC5} = gen_event:wait_response(ReqIdC4, 2000, true),
+ 3 = gen_event:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_event:wait_response(ReqIdC5, infinity, false),
+ {{reply, delayed}, req1, ReqIdC5} = gen_event:wait_response(ReqIdC5, infinity, false),
+ {{error, bad_module}, req4, ReqIdC5} = gen_event:wait_response(ReqIdC5, infinity, false),
+
+ {reply, {ok, hejhopp}} = gen_event:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_check_reqid_collection(Config) when is_list(Config) ->
+ {ok, Pid1} = gen_event:start(),
+ ok = gen_event:add_handler(Pid1, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid1),
+ {ok, Pid2} = gen_event:start(),
+ ok = gen_event:add_handler(Pid2, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid2),
+ {ok, Pid3} = gen_event:start(),
+ ok = gen_event:add_handler(Pid3, dummy_h, [self()]),
+ [dummy_h] = gen_event:which_handlers(Pid3),
+ send_request_check_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_check_reqid_collection_error(Pid1, Pid2, Pid3),
+ ok = gen_event:stop(Pid1),
+ try gen_event:stop(Pid2) catch exit:noproc -> ok end,
+ ok = gen_event:stop(Pid3).
+
+send_request_check_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ receive after 100 -> ok end,
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqIdC1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,400}, req1, ReqIdC0),
+ 1 = gen_event:reqids_size(ReqIdC1),
+
+ ReqId2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}),
+ ReqIdC2 = gen_event:reqids_add(ReqId2, req2, ReqIdC1),
+ 2 = gen_event:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_event:reqids_size(ReqIdC3),
+
+ Msg0 = next_msg(),
+ no_reply = gen_event:check_response(Msg0, ReqIdC3, true),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_event:check_response(next_msg(), ReqIdC3, true),
+ 2 = gen_event:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_event:check_response(next_msg(), ReqIdC4, true),
+ 1 = gen_event:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_event:check_response(next_msg(), ReqIdC5, true),
+ 0 = gen_event:reqids_size(ReqIdC6),
+
+ no_request = gen_event:check_response(Msg0, ReqIdC6, true),
+
+ {reply, {ok, hejhopp}} = gen_event:check_response(Msg0, ReqId0),
+
+ ok.
+
+send_request_check_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_event:send_request(Pid1, dummy_h, hejsan),
+
+ receive after 100 -> ok end,
+
+ ReqIdC0 = gen_event:reqids_new(),
+
+ ReqId1 = gen_event:send_request(Pid1, dummy_h, {delayed_answer,400}),
+ ReqIdC1 = gen_event:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_event:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ exit(Pid2, kill),
+ ReqIdC2 = gen_event:send_request(Pid2, dummy_h, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqIdC3 = gen_event:send_request(Pid3, dummy_h, {delayed_answer,200}, req3, ReqIdC2),
+
+ ReqIdC4 = gen_event:send_request(Pid1, bad_h, hejsan, req4, ReqIdC3),
+ 4 = gen_event:reqids_size(ReqIdC4),
+
+ Msg0 = next_msg(),
+
+ no_reply = gen_event:check_response(Msg0, ReqIdC3, true),
+
+ {{error, {noproc, _}}, req2, ReqIdC5} = gen_event:check_response(next_msg(), ReqIdC4, true),
+ 3 = gen_event:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_event:check_response(next_msg(), ReqIdC5, false),
+ {{reply, delayed}, req1, ReqIdC5} = gen_event:check_response(next_msg(), ReqIdC5, false),
+ {{error, bad_module}, req4, ReqIdC5} = gen_event:check_response(next_msg(), ReqIdC5, false),
+
+ no_reply = gen_event:check_response(Msg0, ReqIdC3, false),
+
+ {reply, {ok, hejhopp}} = gen_event:check_response(Msg0, ReqId0),
+
+ ok.
+
+next_msg() ->
+ receive M -> M end.
diff --git a/lib/stdlib/test/gen_fsm_SUITE.erl b/lib/stdlib/test/gen_fsm_SUITE.erl
index d416bf2f8f..9d912ab257 100644
--- a/lib/stdlib/test/gen_fsm_SUITE.erl
+++ b/lib/stdlib/test/gen_fsm_SUITE.erl
@@ -366,20 +366,20 @@ stop7(_Config) ->
%% Anonymous on remote node
stop8(_Config) ->
- {ok,Node} = test_server:start_node(gen_fsm_SUITE_stop8,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
Dir = filename:dirname(code:which(?MODULE)),
rpc:call(Node,code,add_path,[Dir]),
{ok, Pid} = rpc:call(Node,gen_fsm,start,[?MODULE,[],[]]),
ok = gen_fsm:stop(Pid),
false = rpc:call(Node,erlang,is_process_alive,[Pid]),
{'EXIT',noproc} = (catch gen_fsm:stop(Pid)),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
{'EXIT',{{nodedown,Node},_}} = (catch gen_fsm:stop(Pid)),
ok.
%% Registered name on remote node
stop9(_Config) ->
- {ok,Node} = test_server:start_node(gen_fsm_SUITE_stop9,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
Dir = filename:dirname(code:which(?MODULE)),
rpc:call(Node,code,add_path,[Dir]),
{ok, Pid} = rpc:call(Node,gen_fsm,start,[{local,to_stop},?MODULE,[],[]]),
@@ -387,13 +387,13 @@ stop9(_Config) ->
undefined = rpc:call(Node,erlang,whereis,[to_stop]),
false = rpc:call(Node,erlang,is_process_alive,[Pid]),
{'EXIT',noproc} = (catch gen_fsm:stop({to_stop,Node})),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
{'EXIT',{{nodedown,Node},_}} = (catch gen_fsm:stop({to_stop,Node})),
ok.
%% Globally registered name on remote node
stop10(_Config) ->
- {ok,Node} = test_server:start_node(gen_fsm_SUITE_stop10,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
Dir = filename:dirname(code:which(?MODULE)),
rpc:call(Node,code,add_path,[Dir]),
{ok, Pid} = rpc:call(Node,gen_fsm,start,[{global,to_stop},?MODULE,[],[]]),
@@ -401,7 +401,7 @@ stop10(_Config) ->
ok = gen_fsm:stop({global,to_stop}),
false = rpc:call(Node,erlang,is_process_alive,[Pid]),
{'EXIT',noproc} = (catch gen_fsm:stop({global,to_stop})),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
{'EXIT',noproc} = (catch gen_fsm:stop({global,to_stop})),
ok.
diff --git a/lib/stdlib/test/gen_server_SUITE.erl b/lib/stdlib/test/gen_server_SUITE.erl
index 0118b7bc66..5fa604d4fd 100644
--- a/lib/stdlib/test/gen_server_SUITE.erl
+++ b/lib/stdlib/test/gen_server_SUITE.erl
@@ -26,14 +26,19 @@
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2]).
--export([start/1, crash/1, call/1, send_request/1, cast/1, cast_fast/1,
+-export([start/1, crash/1, call/1, send_request/1,
+ send_request_receive_reqid_collection/1,
+ send_request_wait_reqid_collection/1,
+ send_request_check_reqid_collection/1,
+ cast/1, cast_fast/1,
continue/1, info/1, abcast/1, multicall/1, multicall_down/1,
- call_remote1/1, call_remote2/1, call_remote3/1,
+ call_remote1/1, call_remote2/1, call_remote3/1, calling_self/1,
call_remote_n1/1, call_remote_n2/1, call_remote_n3/1, spec_init/1,
spec_init_local_registered_parent/1,
spec_init_global_registered_parent/1,
otp_5854/1, hibernate/1, auto_hibernate/1, otp_7669/1, call_format_status/1,
- error_format_status/1, terminate_crash_format/1,
+ error_format_status/1, terminate_crash_format/1, crash_in_format_status/1,
+ throw_in_format_status/1, format_all_status/1,
get_state/1, replace_state/1, call_with_huge_message_queue/1,
undef_handle_call/1, undef_handle_cast/1, undef_handle_info/1,
undef_init/1, undef_code_change/1, undef_terminate1/1,
@@ -64,14 +69,16 @@ suite() ->
{timetrap,{minutes,1}}].
all() ->
- [start, {group,stop}, crash, call, send_request, cast, cast_fast, info, abcast,
- continue, multicall, multicall_down, call_remote1, call_remote2,
+ [start, {group,stop}, crash, call, send_request,
+ send_request_receive_reqid_collection, send_request_wait_reqid_collection,
+ send_request_check_reqid_collection, cast, cast_fast, info, abcast,
+ continue, multicall, multicall_down, call_remote1, call_remote2, calling_self,
call_remote3, call_remote_n1, call_remote_n2,
call_remote_n3, spec_init,
spec_init_local_registered_parent,
spec_init_global_registered_parent, otp_5854, hibernate, auto_hibernate,
otp_7669,
- call_format_status, error_format_status, terminate_crash_format,
+ {group, format_status},
get_state, replace_state,
call_with_huge_message_queue, {group, undef_callbacks},
undef_in_terminate, undef_in_handle_info,
@@ -80,12 +87,18 @@ all() ->
groups() ->
[{stop, [],
[stop1, stop2, stop3, stop4, stop5, stop6, stop7, stop8, stop9, stop10]},
+ {format_status, [],
+ [call_format_status, error_format_status, terminate_crash_format,
+ crash_in_format_status, throw_in_format_status, format_all_status]},
{undef_callbacks, [],
[undef_handle_call, undef_handle_cast, undef_handle_info, undef_handle_continue,
undef_init, undef_code_change, undef_terminate1, undef_terminate2]}].
init_per_suite(Config) ->
+ DataDir = ?config(data_dir, Config),
+ Server = filename:join(DataDir, "format_status_server.erl"),
+ {ok, format_status_server} = compile:file(Server),
Config.
end_per_suite(_Config) ->
@@ -110,18 +123,19 @@ init_per_testcase(Case, Config) when Case == call_remote1;
Case == call_remote_n2;
Case == call_remote_n3;
Case == send_request ->
- {ok,N} = start_node(hubba),
- [{node,N} | Config];
+ {ok,Peer,Node} = ?CT_PEER(),
+ ok = global:sync(),
+ [{node,Node}, {peer, Peer} | Config];
init_per_testcase(_Case, Config) ->
Config.
end_per_testcase(_Case, Config) ->
- case proplists:get_value(node, Config) of
+ case proplists:get_value(peer, Config) of
undefined ->
ok;
- N ->
- test_server:stop_node(N)
+ Peer ->
+ peer:stop(Peer)
end,
ok.
@@ -365,20 +379,20 @@ stop7(_Config) ->
%% Anonymous on remote node
stop8(_Config) ->
- {ok,Node} = test_server:start_node(gen_server_SUITE_stop8,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
Dir = filename:dirname(code:which(?MODULE)),
rpc:call(Node,code,add_path,[Dir]),
{ok, Pid} = rpc:call(Node,gen_server,start,[?MODULE,[],[]]),
ok = gen_server:stop(Pid),
false = rpc:call(Node,erlang,is_process_alive,[Pid]),
{'EXIT',noproc} = (catch gen_server:stop(Pid)),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
{'EXIT',{{nodedown,Node},_}} = (catch gen_server:stop(Pid)),
ok.
%% Registered name on remote node
stop9(_Config) ->
- {ok,Node} = test_server:start_node(gen_server_SUITE_stop9,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
Dir = filename:dirname(code:which(?MODULE)),
rpc:call(Node,code,add_path,[Dir]),
{ok, Pid} = rpc:call(Node,gen_server,start,[{local,to_stop},?MODULE,[],[]]),
@@ -386,13 +400,13 @@ stop9(_Config) ->
undefined = rpc:call(Node,erlang,whereis,[to_stop]),
false = rpc:call(Node,erlang,is_process_alive,[Pid]),
{'EXIT',noproc} = (catch gen_server:stop({to_stop,Node})),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
{'EXIT',{{nodedown,Node},_}} = (catch gen_server:stop({to_stop,Node})),
ok.
%% Globally registered name on remote node
stop10(_Config) ->
- {ok,Node} = test_server:start_node(gen_server_SUITE_stop10,slave,[]),
+ {ok,Peer,Node} = ?CT_PEER(),
Dir = filename:dirname(code:which(?MODULE)),
rpc:call(Node,code,add_path,[Dir]),
{ok, Pid} = rpc:call(Node,gen_server,start,[{global,to_stop},?MODULE,[],[]]),
@@ -400,7 +414,7 @@ stop10(_Config) ->
ok = gen_server:stop({global,to_stop}),
false = rpc:call(Node,erlang,is_process_alive,[Pid]),
{'EXIT',noproc} = (catch gen_server:stop({global,to_stop})),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
{'EXIT',noproc} = (catch gen_server:stop({global,to_stop})),
ok.
@@ -590,6 +604,323 @@ send_request(Config) when is_list(Config) ->
process_flag(trap_exit, OldFl),
ok.
+send_request_receive_reqid_collection(Config) when is_list(Config) ->
+ {ok, Pid1} = gen_server:start_link({local, my_test_name1},
+ gen_server_SUITE, [], []),
+ {ok, Pid2} = gen_server:start_link({local, my_test_name2},
+ gen_server_SUITE, [], []),
+ {ok, Pid3} = gen_server:start_link({local, my_test_name3},
+ gen_server_SUITE, [], []),
+ send_request_receive_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_receive_reqid_collection_timeout(Pid1, Pid2, Pid3),
+ send_request_receive_reqid_collection_error(Pid1, Pid2, Pid3),
+ unlink(Pid1),
+ exit(Pid1, kill),
+ unlink(Pid2),
+ exit(Pid2, kill),
+ unlink(Pid3),
+ exit(Pid3, kill),
+ false = is_process_alive(Pid1),
+ false = is_process_alive(Pid2),
+ false = is_process_alive(Pid3),
+ ok.
+
+send_request_receive_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqId1 = gen_server:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_server:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = gen_server:reqids_size(ReqIdC1),
+
+ ReqIdC2 = gen_server:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+ 2 = gen_server:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_server:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_server:reqids_size(ReqIdC3),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_server:receive_response(ReqIdC3, infinity, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_server:receive_response(ReqIdC4, 5678, true),
+ 1 = gen_server:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_server:receive_response(ReqIdC5, 5000, true),
+ 0 = gen_server:reqids_size(ReqIdC6),
+
+ no_request = gen_server:receive_response(ReqIdC6, 5000, true),
+
+ {reply, ok} = gen_server:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_receive_reqid_collection_timeout(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqId1 = gen_server:send_request(Pid1, {delayed_answer,1000}),
+ ReqIdC1 = gen_server:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = gen_server:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqId3 = gen_server:send_request(Pid3, {delayed_answer,500}),
+ ReqIdC3 = gen_server:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_server:receive_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ timeout = gen_server:receive_response(ReqIdC4, {abs, Deadline}, true),
+
+ Abandoned = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Abandoned = lists:sort(gen_server:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were abandoned...
+ timeout = gen_server:receive_response(ReqIdC4, {abs, Deadline+1000}, true),
+
+ {reply, ok} = gen_server:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_receive_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqId1 = gen_server:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_server:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_server:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ ReqIdC2 = gen_server:send_request(Pid2, stop_shutdown, req2, ReqIdC1),
+ ReqIdC3 = gen_server:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_server:reqids_size(ReqIdC3),
+
+ {{error, {shutdown, _}}, req2, ReqIdC4} = gen_server:receive_response(ReqIdC3, 2000, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC4} = gen_server:receive_response(ReqIdC4, infinity, false),
+
+ {{reply, delayed}, req1, ReqIdC4} = gen_server:receive_response(ReqIdC4, infinity, false),
+
+ {reply, ok} = gen_server:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection(Config) when is_list(Config) ->
+ {ok, Pid1} = gen_server:start_link({local, my_test_name1},
+ gen_server_SUITE, [], []),
+ {ok, Pid2} = gen_server:start_link({local, my_test_name2},
+ gen_server_SUITE, [], []),
+ {ok, Pid3} = gen_server:start_link({local, my_test_name3},
+ gen_server_SUITE, [], []),
+ send_request_wait_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_wait_reqid_collection_timeout(Pid1, Pid2, Pid3),
+ send_request_wait_reqid_collection_error(Pid1, Pid2, Pid3),
+ unlink(Pid1),
+ exit(Pid1, kill),
+ unlink(Pid2),
+ exit(Pid2, kill),
+ unlink(Pid3),
+ exit(Pid3, kill),
+ false = is_process_alive(Pid1),
+ false = is_process_alive(Pid2),
+ false = is_process_alive(Pid3),
+ ok.
+
+send_request_wait_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqId1 = gen_server:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_server:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = gen_server:reqids_size(ReqIdC1),
+
+ ReqIdC2 = gen_server:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+ 2 = gen_server:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_server:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_server:reqids_size(ReqIdC3),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_server:wait_response(ReqIdC3, infinity, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_server:wait_response(ReqIdC4, 5678, true),
+ 1 = gen_server:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_server:wait_response(ReqIdC5, 5000, true),
+ 0 = gen_server:reqids_size(ReqIdC6),
+
+ no_request = gen_server:wait_response(ReqIdC6, 5000, true),
+
+ {reply, ok} = gen_server:wait_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection_timeout(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqId1 = gen_server:send_request(Pid1, {delayed_answer,1000}),
+ ReqIdC1 = gen_server:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = gen_server:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqId3 = gen_server:send_request(Pid3, {delayed_answer,500}),
+ ReqIdC3 = gen_server:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_server:wait_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ timeout = gen_server:wait_response(ReqIdC4, {abs, Deadline}, true),
+
+ Unhandled = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Unhandled = lists:sort(gen_server:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were not abandoned...
+ {{reply, delayed}, req3, ReqIdC4} = gen_server:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+ {{reply, delayed}, req1, ReqIdC4} = gen_server:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+
+ {reply, ok} = gen_server:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqId1 = gen_server:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_server:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_server:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ ReqIdC2 = gen_server:send_request(Pid2, stop_shutdown, req2, ReqIdC1),
+ ReqIdC3 = gen_server:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_server:reqids_size(ReqIdC3),
+
+ {{error, {shutdown, _}}, req2, ReqIdC4} = gen_server:wait_response(ReqIdC3, 2000, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC4} = gen_server:wait_response(ReqIdC4, infinity, false),
+
+ {{reply, delayed}, req1, ReqIdC4} = gen_server:wait_response(ReqIdC4, infinity, false),
+
+ {reply, ok} = gen_server:wait_response(ReqId0, infinity),
+
+ ok.
+
+send_request_check_reqid_collection(Config) when is_list(Config) ->
+ {ok, Pid1} = gen_server:start_link({local, my_test_name1},
+ gen_server_SUITE, [], []),
+ {ok, Pid2} = gen_server:start_link({local, my_test_name2},
+ gen_server_SUITE, [], []),
+ {ok, Pid3} = gen_server:start_link({local, my_test_name3},
+ gen_server_SUITE, [], []),
+ send_request_check_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_check_reqid_collection_error(Pid1, Pid2, Pid3),
+ unlink(Pid1),
+ exit(Pid1, kill),
+ unlink(Pid2),
+ exit(Pid2, kill),
+ unlink(Pid3),
+ exit(Pid3, kill),
+ false = is_process_alive(Pid1),
+ false = is_process_alive(Pid2),
+ false = is_process_alive(Pid3),
+ ok.
+
+send_request_check_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ receive after 100 -> ok end,
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqIdC1 = gen_server:send_request(Pid1, {delayed_answer,400}, req1, ReqIdC0),
+ 1 = gen_server:reqids_size(ReqIdC1),
+
+ ReqId2 = gen_server:send_request(Pid2, {delayed_answer,1}),
+ ReqIdC2 = gen_server:reqids_add(ReqId2, req2, ReqIdC1),
+ 2 = gen_server:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_server:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_server:reqids_size(ReqIdC3),
+
+ Msg0 = next_msg(),
+ no_reply = gen_server:check_response(Msg0, ReqIdC3, true),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_server:check_response(next_msg(), ReqIdC3, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_server:check_response(next_msg(), ReqIdC4, true),
+ 1 = gen_server:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_server:check_response(next_msg(), ReqIdC5, true),
+ 0 = gen_server:reqids_size(ReqIdC6),
+
+ no_request = gen_server:check_response(Msg0, ReqIdC6, true),
+
+ {reply, ok} = gen_server:check_response(Msg0, ReqId0),
+
+ ok.
+
+send_request_check_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_server:send_request(Pid1, started_p),
+
+ receive after 100 -> ok end,
+
+ ReqIdC0 = gen_server:reqids_new(),
+
+ ReqId1 = gen_server:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_server:reqids_add(ReqId1, req1, ReqIdC0),
+
+ unlink(Pid2),
+ ReqIdC2 = gen_server:send_request(Pid2, stop_shutdown, req2, ReqIdC1),
+
+ ReqIdC3 = gen_server:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_server:reqids_size(ReqIdC3),
+
+ Msg0 = next_msg(),
+
+ no_reply = gen_server:check_response(Msg0, ReqIdC3, true),
+
+ {{error, {shutdown, _}}, req2, ReqIdC4} = gen_server:check_response(next_msg(), ReqIdC3, true),
+ 2 = gen_server:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC4} = gen_server:check_response(next_msg(), ReqIdC4, false),
+
+ {{reply, delayed}, req1, ReqIdC4} = gen_server:check_response(next_msg(), ReqIdC4, false),
+
+ {reply, ok} = gen_server:check_response(Msg0, ReqId0),
+
+ ok.
+
+next_msg() ->
+ receive M -> M end.
%% --------------------------------------
%% Test handle_continue.
@@ -636,15 +967,6 @@ read_replies() ->
%% Test call to nonexisting processes on remote nodes
%% --------------------------------------
-start_node(Name) ->
- Pa = filename:dirname(code:which(?MODULE)),
- N = test_server:start_node(Name, slave, [{args, " -pa " ++ Pa}]),
- %% After starting a slave, it takes a little while until global knows
- %% about it, even if nodes() includes it, so we make sure that global
- %% knows about it before registering something on all nodes.
- ok = global:sync(),
- N.
-
call_remote1(Config) when is_list(Config) ->
N = hubba,
Node = proplists:get_value(node,Config),
@@ -691,7 +1013,7 @@ call_remote_n1(Config) when is_list(Config) ->
Node = proplists:get_value(node,Config),
{ok, _Pid} = rpc:call(Node, gen_server, start,
[{global, N}, ?MODULE, [], []]),
- _ = test_server:stop_node(Node),
+ peer:stop(proplists:get_value(peer,Config)),
{'EXIT', {noproc, _}} =
(catch gen_server:call({global, N}, started_p, infinity)),
@@ -703,7 +1025,7 @@ call_remote_n2(Config) when is_list(Config) ->
{ok, Pid} = rpc:call(Node, gen_server, start,
[{global, N}, ?MODULE, [], []]),
- _ = test_server:stop_node(Node),
+ peer:stop(proplists:get_value(peer,Config)),
{'EXIT', {{nodedown, Node}, _}} = (catch gen_server:call(Pid,
started_p, infinity)),
@@ -714,13 +1036,22 @@ call_remote_n3(Config) when is_list(Config) ->
{ok, _Pid} = rpc:call(Node, gen_server, start,
[{local, piller}, ?MODULE, [], []]),
- _ = test_server:stop_node(Node),
+ peer:stop(proplists:get_value(peer,Config)),
{'EXIT', {{nodedown, Node}, _}} = (catch gen_server:call({piller, Node},
started_p, infinity)),
ok.
%% --------------------------------------
+%% Other bad calls
+%% --------------------------------------
+
+calling_self(Config) when is_list(Config) ->
+ {'EXIT', {calling_self, _}} = (catch gen_server:call(self(), oops)),
+ {'EXIT', {calling_self, _}} = (catch gen_server:call(self(), oops, infinity)),
+ ok.
+
+%% --------------------------------------
%% Test gen_server:cast and handle_cast.
%% Test all different return values from
%% handle_cast.
@@ -760,7 +1091,11 @@ cast(Config) when is_list(Config) ->
%% Test that cast really return immediately.
cast_fast(Config) when is_list(Config) ->
- {ok,Node} = start_node(hubba),
+ {ok,Peer,Node} = ?CT_PEER(),
+ %% After starting a slave, it takes a little while until global knows
+ %% about it, even if nodes() includes it, so we make sure that global
+ %% knows about it before registering something on all nodes.
+ ok = global:sync(),
{_,"@"++Host} = lists:splitwith(fun ($@) -> false; (_) -> true end,
atom_to_list(Node)),
FalseNode = list_to_atom("hopp@"++Host),
@@ -770,7 +1105,7 @@ cast_fast(Config) when is_list(Config) ->
{Time,ok} = timer:tc(fun() ->
gen_server:cast({hopp,FalseNode}, hopp)
end),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
if Time > 1000000 -> % Default listen timeout is about 7.0 s
ct:fail(hanging_cast);
true ->
@@ -1330,48 +1665,65 @@ do_otp_7669_stop() ->
?MODULE, stop, []),
undefined = global:whereis_name(?MODULE).
-%% Verify that sys:get_status correctly calls our format_status/2 fun.
+%% Verify that sys:get_status correctly calls our format_status/1,2 fun.
call_format_status(Config) when is_list(Config) ->
+ OldFl = process_flag(trap_exit, true),
+ call_format_status(?MODULE, format_status_called),
+ call_format_status(format_status_server,{data,[{"State",format_status_called}]}),
+ process_flag(trap_exit, OldFl).
+call_format_status(Module, Match) when is_atom(Module) ->
+
Parent = self(),
{ok, Pid} = gen_server:start_link({local, call_format_status},
- ?MODULE, [], []),
+ Module, [], []),
Status1 = sys:get_status(call_format_status),
{status, Pid, Mod, [_Pdict1, running, Parent, _, Data1]} = Status1,
- [format_status_called | _] = lists:reverse(Data1),
+ [Match | _] = lists:reverse(Data1),
Status2 = sys:get_status(call_format_status, 5000),
{status, Pid, Mod, [_Pdict2, running, Parent, _, Data2]} = Status2,
- [format_status_called | _] = lists:reverse(Data2),
+ [Match | _] = lists:reverse(Data2),
+ gen_server:call(Pid, stop),
+ receive {'EXIT',_,_} -> ok end,
%% check that format_status can handle a name being a pid (atom is
%% already checked by the previous test)
- {ok, Pid3} = gen_server:start_link(gen_server_SUITE, [], []),
+ {ok, Pid3} = gen_server:start_link(Module, [], []),
Status3 = sys:get_status(Pid3),
{status, Pid3, Mod, [_PDict3, running, Parent, _, Data3]} = Status3,
- [format_status_called | _] = lists:reverse(Data3),
+ [Match | _] = lists:reverse(Data3),
+ gen_server:call(Pid3, stop),
+ receive {'EXIT',_,_} -> ok end,
%% check that format_status can handle a name being a term other than a
%% pid or atom
GlobalName1 = {global, "CallFormatStatus"},
- {ok, Pid4} = gen_server:start_link(GlobalName1,
- gen_server_SUITE, [], []),
+ {ok, Pid4} = gen_server:start_link(GlobalName1, Module, [], []),
Status4 = sys:get_status(Pid4),
{status, Pid4, Mod, [_PDict4, running, Parent, _, Data4]} = Status4,
- [format_status_called | _] = lists:reverse(Data4),
+ [Match | _] = lists:reverse(Data4),
+ gen_server:call(Pid4, stop),
+ receive {'EXIT',_,_} -> ok end,
GlobalName2 = {global, {name, "term"}},
- {ok, Pid5} = gen_server:start_link(GlobalName2,
- gen_server_SUITE, [], []),
+ {ok, Pid5} = gen_server:start_link(GlobalName2, Module, [], []),
Status5 = sys:get_status(GlobalName2),
{status, Pid5, Mod, [_PDict5, running, Parent, _, Data5]} = Status5,
- [format_status_called | _] = lists:reverse(Data5),
+ [Match | _] = lists:reverse(Data5),
+ gen_server:call(Pid5, stop),
+ receive {'EXIT',_,_} -> ok end,
ok.
-%% Verify that error termination correctly calls our format_status/2 fun.
+%% Verify that error termination correctly calls our format_status/1,2 fun.
error_format_status(Config) when is_list(Config) ->
error_logger_forwarder:register(),
OldFl = process_flag(trap_exit, true),
+ error_format_status(?MODULE),
+ error_format_status(format_status_server),
+ process_flag(trap_exit, OldFl);
+error_format_status(Module) when is_atom(Module) ->
+
State = "called format_status",
- {ok, Pid} = gen_server:start_link(?MODULE, {state, State}, []),
+ {ok, Pid} = gen_server:start_link(Module, {state, State}, []),
{'EXIT',{crashed,_}} = (catch gen_server:call(Pid, crash)),
receive
{'EXIT', Pid, crashed} ->
@@ -1387,19 +1739,24 @@ error_format_status(Config) when is_list(Config) ->
ClientPid, [_|_] = _ClientStack]}} ->
ok;
Other ->
- io:format("Unexpected: ~p", [Other]),
+ ct:pal("Unexpected: ~p", [Other]),
ct:fail(failed)
end,
- process_flag(trap_exit, OldFl),
+ receive
+ {error_report,_,_} -> ok
+ end,
ok.
-%% Verify that error when terminating correctly calls our format_status/2 fun
-%%
+%% Verify that error when terminating correctly calls our format_status/1,2 fun
terminate_crash_format(Config) when is_list(Config) ->
error_logger_forwarder:register(),
OldFl = process_flag(trap_exit, true),
+ terminate_crash_format(?MODULE),
+ terminate_crash_format(format_status_server),
+ process_flag(trap_exit, OldFl);
+terminate_crash_format(Module) when is_atom(Module) ->
State = crash_terminate,
- {ok, Pid} = gen_server:start_link(?MODULE, {state, State}, []),
+ {ok, Pid} = gen_server:start_link(Module, {state, State}, []),
gen_server:call(Pid, stop),
receive {'EXIT', Pid, {crash, terminate}} -> ok end,
ClientPid = self(),
@@ -1418,9 +1775,167 @@ terminate_crash_format(Config) when is_list(Config) ->
io:format("Timeout: expected error logger msg", []),
ct:fail(failed)
end,
- process_flag(trap_exit, OldFl),
+ receive
+ {error_report,_,_} -> ok
+ end,
+ ok.
+
+crash_in_format_status(Config) when is_list(Config) ->
+ error_logger_forwarder:register(),
+ OldFl = process_flag(trap_exit, true),
+ crash_in_format_status(?MODULE, "gen_server_SUITE:format_status/2 crashed"),
+ crash_in_format_status(format_status_server, "format_status_server:format_status/1 crashed"),
+ process_flag(trap_exit, OldFl).
+crash_in_format_status(Module, Match) when is_atom(Module) ->
+ State = fun(_) -> exit({crash,format_status}) end,
+ {ok, Pid} = gen_server:start_link(Module, {state, State}, []),
+
+ {status,Pid, _, [_,_,_,_,Info]} = sys:get_status(Pid),
+ {data,[{"State",Match}]} = lists:last(Info),
+
+ gen_server:call(Pid, stop),
+ receive {'EXIT', Pid, stopped} -> ok end,
+ ClientPid = self(),
+ receive
+ {error,_GroupLeader,
+ {Pid,
+ "** Generic server"++_,
+ [Pid, stop, Match, stopped,
+ ClientPid, [_|_] = _ClientStack]}} ->
+ ok;
+ Other ->
+ ct:pal("Unexpected: ~p", [Other]),
+ ct:fail(failed)
+ after 5000 ->
+ io:format("Timeout: expected error logger msg", []),
+ ct:fail(failed)
+ end,
+ receive
+ {error_report,_,_} -> ok
+ end,
+ ok.
+
+throw_in_format_status(Config) when is_list(Config) ->
+ error_logger_forwarder:register(),
+ OldFl = process_flag(trap_exit, true),
+ throw_in_format_status(?MODULE,{throw,format_status}),
+ throw_in_format_status(format_status_server,"format_status_server:format_status/1 crashed"),
+ process_flag(trap_exit, OldFl).
+throw_in_format_status(Module, Match) when is_atom(Module) ->
+ State = fun(_) -> throw({throw,format_status}) end,
+ {ok, Pid} = gen_server:start_link(Module, {state, State}, []),
+
+ {status,Pid, _, [_,_,_,_,Info]} = sys:get_status(Pid),
+ case lists:last(Info) of
+ {data,[{"State",Match}]} ->
+ ok;
+ Match ->
+ ok
+ end,
+
+ gen_server:call(Pid, stop),
+ receive {'EXIT', Pid, stopped} -> ok end,
+ ClientPid = self(),
+ receive
+ {error,_GroupLeader,
+ {Pid, "** Generic server"++_,
+ [Pid, stop, Match, stopped,
+ ClientPid, [_|_] = _ClientStack]}} ->
+ ok;
+ Other ->
+ ct:pal("Unexpected: ~p", [Other]),
+ ct:fail(failed)
+ after 5000 ->
+ io:format("Timeout: expected error logger msg", []),
+ ct:fail(failed)
+ end,
+ receive
+ {error_report,_,_} -> ok
+ end,
ok.
+%% Test that the state, reason, message format status calls works as they should
+%% The test makes sure that both sys:get_status and the crash report works as they
+%% should and can be used to strip data from both the reason, message, state and the
+%% sys logger logs.
+
+%%%% The sys logger log messages that should be matched
+-define(LOG_MESSAGES,
+ {log,{in,{_,_,started_p}}},
+ {log,{out,ok,_,State}},
+ {log,{in,{_,_,{delayed_answer,10}}}},
+ {log,{noreply,{_,_,State}}},
+ {log,{in,timeout}},
+ {log,{noreply,State}}).
+
+format_all_status(Config) when is_list(Config) ->
+ error_logger_forwarder:register(),
+ OldFl = process_flag(trap_exit, true),
+
+ State = fun(M) ->
+ maps:map(
+ fun(log, Values) ->
+ [{log, Value} || Value <- Values];
+ (Key, Value) ->
+ {Key, Value}
+ end, M)
+ end,
+ {ok, Pid} = gen_server:start_link(format_status_server, {state, State}, []),
+ sys:log(Pid, true),
+ ok = gen_server:call(Pid, started_p),
+ delayed = gen_server:call(Pid, {delayed_answer, 10}),
+
+ {status,Pid, _, [_,_,_,_,Info]} = sys:get_status(Pid),
+ [{header, _Hdr},
+ {data, [_Status,_Parent,{"Logged events",LoggedEvents}]},
+ {data, [{"State",{state,State}}]}] = Info,
+
+ [?LOG_MESSAGES] = LoggedEvents,
+
+ ok = gen_server:call(Pid, stop),
+ receive {'EXIT', Pid, stopped} -> ok end,
+ ClientPid = self(),
+ receive
+ {error,_GroupLeader,
+ {Pid, "** Generic server"++_,
+ [Pid, {message, stop}, {state,State}, {reason, stopped},
+ ?LOG_MESSAGES, {log,{in,{_,_,stop}}},
+ ClientPid, [_|_] = _ClientStack]}} ->
+ ok;
+ Other ->
+ ct:pal("Unexpected: ~p", [Other]),
+ ct:fail(failed)
+ after 5000 ->
+ io:format("Timeout: expected error logger msg", []),
+ ct:fail(failed)
+ end,
+ receive
+ {error_report,_,_} -> ok
+ end,
+
+ {ok, Pid2} = gen_server:start_link(format_status_server, {state, State}, []),
+ catch gen_server:call(Pid2, crash),
+ receive {'EXIT', Pid2, crashed} -> ok end,
+ receive
+ {error,_GroupLeader2,
+ {Pid2, "** Generic server"++_,
+ [Pid2, {message, crash}, {state,State},
+ {{reason, crashed},[_|_] = _ServerStack},
+ ClientPid, [_|_] = _ClientStack2]}} ->
+ ok;
+ Other2 ->
+ ct:pal("Unexpected: ~p", [Other2]),
+ ct:fail(failed)
+ after 5000 ->
+ io:format("Timeout: expected error logger msg", []),
+ ct:fail(failed)
+ end,
+ receive
+ {error_report,_,_} -> ok
+ end,
+
+ process_flag(trap_exit, OldFl).
+
%% Verify that sys:get_state correctly returns gen_server state
get_state(Config) when is_list(Config) ->
State = self(),
@@ -1985,8 +2500,8 @@ init({state,State}) ->
handle_call(started_p, _From, State) ->
io:format("FROZ"),
{reply,ok,State};
-handle_call({delayed_answer, T}, From, _State) ->
- {noreply,{reply_to,From},T};
+handle_call({delayed_answer, T}, From, State) ->
+ {noreply,{reply_to,From,State},T};
handle_call({call_within, T}, _From, _) ->
{reply,ok,call_within,T};
handle_call(next_call, _From, call_within) ->
@@ -2042,9 +2557,9 @@ handle_cast({From, stop}, State) ->
io:format("BAZ"),
{stop, {From,stopped}, State}.
-handle_info(timeout, {reply_to, From}) ->
+handle_info(timeout, {reply_to, From, State}) ->
gen_server:reply(From, delayed),
- {noreply, []};
+ {noreply, State};
handle_info(timeout, hibernate_me) -> % Arrive here from
% handle_info(hibernate_later,...)
{noreply, [], hibernate};
@@ -2124,6 +2639,8 @@ terminate(_, {undef_in_terminate, {Mod, Fun}}) ->
terminate(_Reason, _State) ->
ok.
+format_status(_, [_PDict, Fun] = S) when is_function(Fun) ->
+ Fun(S);
format_status(terminate, [_PDict, State]) ->
{formatted, State};
format_status(normal, [_PDict, _State]) ->
diff --git a/lib/stdlib/test/gen_server_SUITE_data/format_status_server.erl b/lib/stdlib/test/gen_server_SUITE_data/format_status_server.erl
new file mode 100644
index 0000000000..96f1f74132
--- /dev/null
+++ b/lib/stdlib/test/gen_server_SUITE_data/format_status_server.erl
@@ -0,0 +1,55 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2017-2021. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(format_status_server).
+
+-behaviour(gen_server).
+
+%% API
+-export([start/1]).
+
+%% gen_server callbacks
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, format_status/1]).
+
+start(Arg) ->
+ gen_server:start(?MODULE, ok, Arg).
+init(Args) ->
+ gen_server_SUITE:init(Args).
+handle_call(Call, From, State) ->
+ gen_server_SUITE:handle_call(Call, From, State).
+handle_cast(Cast, State) ->
+ gen_server_SUITE:handle_cast(Cast, State).
+handle_info(Info, State) ->
+ gen_server_SUITE:handle_info(Info, State).
+terminate(Reason, State) ->
+ gen_server_SUITE:terminate(Reason, State).
+
+format_status(#{ state := Fun } = S) when is_function(Fun) ->
+ Fun(S);
+format_status(#{ state := {_,_,Fun} } = S) when is_function(Fun) ->
+ Fun(S);
+format_status(#{ message := Msg } = S) when not is_map_key(state, S) ->
+ S#{message := {message,Msg}};
+format_status(#{ reason := _, state := State } = Map) ->
+ ct:pal("format_status(~p)",[Map]),
+ Map#{ state => {formatted, State}};
+format_status(Map) ->
+ ct:pal("format_status(~p)",[Map]),
+ Map#{ state => format_status_called }.
diff --git a/lib/stdlib/test/gen_statem_SUITE.erl b/lib/stdlib/test/gen_statem_SUITE.erl
index b9084cc825..a34cb55e52 100644
--- a/lib/stdlib/test/gen_statem_SUITE.erl
+++ b/lib/stdlib/test/gen_statem_SUITE.erl
@@ -43,7 +43,9 @@ all() ->
{group, sys},
hibernate, auto_hibernate, enter_loop, {group, undef_callbacks},
undef_in_terminate, {group, format_log},
- reply_by_alias_with_payload].
+ reply_by_alias_with_payload,
+ send_request_receive_reqid_collection, send_request_wait_reqid_collection,
+ send_request_check_reqid_collection].
groups() ->
[{start, [], tcs(start)},
@@ -53,6 +55,7 @@ groups() ->
{abnormal, [], tcs(abnormal)},
{abnormal_handle_event, [], tcs(abnormal)},
{sys, [], tcs(sys)},
+ {format_status, [], tcs(format_status)},
{sys_handle_event, [], tcs(sys)},
{undef_callbacks, [], tcs(undef_callbacks)},
{format_log, [], tcs(format_log)}].
@@ -66,9 +69,10 @@ tcs(abnormal) ->
[abnormal1, abnormal1clean, abnormal1dirty,
abnormal2, abnormal3, abnormal4];
tcs(sys) ->
- [sys1, call_format_status,
- error_format_status, terminate_crash_format,
- get_state, replace_state];
+ [sys1, {group, format_status}, get_state, replace_state];
+tcs(format_status) ->
+ [call_format_status, error_format_status, terminate_crash_format,
+ format_all_status];
tcs(undef_callbacks) ->
[undef_code_change, undef_terminate1, undef_terminate2,
pop_too_many];
@@ -90,6 +94,9 @@ init_per_group(GroupName, Config)
init_per_group(undef_callbacks, Config) ->
compile_oc_statem(Config),
Config;
+init_per_group(sys, Config) ->
+ compile_format_status_statem(Config),
+ Config;
init_per_group(_GroupName, Config) ->
Config.
@@ -119,6 +126,12 @@ compile_oc_statem(Config) ->
{ok, oc_statem} = compile:file(StatemPath),
ok.
+compile_format_status_statem(Config) ->
+ DataDir = ?config(data_dir, Config),
+ StatemPath = filename:join(DataDir, "format_status_statem.erl"),
+ {ok, format_status_statem} = compile:file(StatemPath),
+ ok.
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-define(EXPECT_FAILURE(Code, Reason),
try begin Code end of
@@ -452,76 +465,64 @@ stop7(Config) ->
%% Anonymous on remote node
stop8(Config) ->
- Node = gen_statem_stop8,
- {ok,NodeName} = ct_slave:start(Node),
- Statem =
- try
- Dir = filename:dirname(code:which(?MODULE)),
- rpc:block_call(NodeName, code, add_path, [Dir]),
- {ok,Pid} =
- rpc:block_call(
- NodeName, gen_statem,start,
- [?MODULE,start_arg(Config, []),[]]),
- ok = gen_statem:stop(Pid),
- false = rpc:block_call(NodeName, erlang, is_process_alive, [Pid]),
- noproc =
- ?EXPECT_FAILURE(gen_statem:stop(Pid), Reason1),
- Pid
- after
- {ok,NodeName} = ct_slave:stop(Node)
- end,
+ {ok,Peer,NodeName} = ?CT_PEER(),
+ Dir = filename:dirname(code:which(?MODULE)),
+ rpc:block_call(NodeName, code, add_path, [Dir]),
+ {ok,Pid} =
+ rpc:block_call(
+ NodeName, gen_statem,start,
+ [?MODULE,start_arg(Config, []),[]]),
+ ok = gen_statem:stop(Pid),
+ false = rpc:block_call(NodeName, erlang, is_process_alive, [Pid]),
+ noproc =
+ ?EXPECT_FAILURE(gen_statem:stop(Pid), Reason1),
+
+ peer:stop(Peer),
{{nodedown,NodeName},{sys,terminate,_}} =
- ?EXPECT_FAILURE(gen_statem:stop(Statem), Reason2),
+ ?EXPECT_FAILURE(gen_statem:stop(Pid), Reason2),
ok.
%% Registered name on remote node
stop9(Config) ->
Name = to_stop,
LocalSTM = {local,Name},
- Node = gen_statem__stop9,
- {ok,NodeName} = ct_slave:start(Node),
- Statem =
- try
- STM = {Name,NodeName},
- Dir = filename:dirname(code:which(?MODULE)),
- rpc:block_call(NodeName, code, add_path, [Dir]),
- {ok,Pid} =
- rpc:block_call(
- NodeName, gen_statem, start,
- [LocalSTM,?MODULE,start_arg(Config, []),[]]),
- ok = gen_statem:stop(STM),
- undefined = rpc:block_call(NodeName,erlang,whereis,[Name]),
- false = rpc:block_call(NodeName,erlang,is_process_alive,[Pid]),
- noproc =
- ?EXPECT_FAILURE(gen_statem:stop(STM), Reason1),
- STM
- after
- {ok,NodeName} = ct_slave:stop(Node)
- end,
+ {ok,Peer,NodeName} = ?CT_PEER(),
+
+ STM = {Name,NodeName},
+ Dir = filename:dirname(code:which(?MODULE)),
+ rpc:block_call(NodeName, code, add_path, [Dir]),
+ {ok,Pid} =
+ rpc:block_call(
+ NodeName, gen_statem, start,
+ [LocalSTM,?MODULE,start_arg(Config, []),[]]),
+ ok = gen_statem:stop(STM),
+ undefined = rpc:block_call(NodeName,erlang,whereis,[Name]),
+ false = rpc:block_call(NodeName,erlang,is_process_alive,[Pid]),
+ noproc =
+ ?EXPECT_FAILURE(gen_statem:stop(STM), Reason1),
+ peer:stop(Peer),
+
{{nodedown,NodeName},{sys,terminate,_}} =
- ?EXPECT_FAILURE(gen_statem:stop(Statem), Reason2),
+ ?EXPECT_FAILURE(gen_statem:stop(STM), Reason2),
ok.
%% Globally registered name on remote node
stop10(Config) ->
- Node = gen_statem_stop10,
STM = {global,to_stop},
- {ok,NodeName} = ct_slave:start(Node),
- try
- Dir = filename:dirname(code:which(?MODULE)),
- rpc:block_call(NodeName,code,add_path,[Dir]),
- {ok,Pid} =
- rpc:block_call(
- NodeName, gen_statem, start,
- [STM,?MODULE,start_arg(Config, []),[]]),
- global:sync(),
- ok = gen_statem:stop(STM),
- false = rpc:block_call(NodeName, erlang, is_process_alive, [Pid]),
- noproc =
- ?EXPECT_FAILURE(gen_statem:stop(STM), Reason1)
- after
- {ok,NodeName} = ct_slave:stop(Node)
- end,
+ {ok,Peer,NodeName} = ?CT_PEER(),
+ Dir = filename:dirname(code:which(?MODULE)),
+ rpc:block_call(NodeName,code,add_path,[Dir]),
+ {ok,Pid} =
+ rpc:block_call(
+ NodeName, gen_statem, start,
+ [STM,?MODULE,start_arg(Config, []),[]]),
+ global:sync(),
+ ok = gen_statem:stop(STM),
+ false = rpc:block_call(NodeName, erlang, is_process_alive, [Pid]),
+ noproc =
+ ?EXPECT_FAILURE(gen_statem:stop(STM), Reason1),
+ peer:stop(Peer),
+
noproc =
?EXPECT_FAILURE(gen_statem:stop(STM), Reason2),
ok.
@@ -1240,20 +1241,24 @@ code_change(_Config) ->
stop_it(Pid).
call_format_status(Config) ->
- {ok,Pid} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ call_format_status(Config,?MODULE,format_status_called),
+ call_format_status(Config, format_status_statem,
+ {data,[{"State",{format_status_called,format_data}}]}).
+call_format_status(Config, Module, Match) ->
+ {ok,Pid} = gen_statem:start(Module, start_arg(Config, []), []),
Status = sys:get_status(Pid),
{status,Pid,_Mod,[_PDict,running,_,_, Data]} = Status,
- [format_status_called|_] = lists:reverse(Data),
+ [Match|_] = lists:reverse(Data),
stop_it(Pid),
%% check that format_status can handle a name being an atom (pid is
%% already checked by the previous test)
{ok, Pid2} =
gen_statem:start(
- {local, gstm}, ?MODULE, start_arg(Config, []), []),
+ {local, gstm}, Module, start_arg(Config, []), []),
Status2 = sys:get_status(gstm),
{status,Pid2,Mod,[_PDict2,running,_,_,Data2]} = Status2,
- [format_status_called|_] = lists:reverse(Data2),
+ [Match|_] = lists:reverse(Data2),
stop_it(Pid2),
%% check that format_status can handle a name being a term other than a
@@ -1261,47 +1266,54 @@ call_format_status(Config) ->
GlobalName1 = {global,"CallFormatStatus"},
{ok,Pid3} =
gen_statem:start(
- GlobalName1, ?MODULE, start_arg(Config, []), []),
+ GlobalName1, Module, start_arg(Config, []), []),
Status3 = sys:get_status(GlobalName1),
{status,Pid3,Mod,[_PDict3,running,_,_,Data3]} = Status3,
- [format_status_called|_] = lists:reverse(Data3),
+ [Match|_] = lists:reverse(Data3),
stop_it(Pid3),
GlobalName2 = {global,{name, "term"}},
{ok,Pid4} =
gen_statem:start(
- GlobalName2, ?MODULE, start_arg(Config, []), []),
+ GlobalName2, Module, start_arg(Config, []), []),
Status4 = sys:get_status(GlobalName2),
{status,Pid4,Mod,[_PDict4,running,_,_, Data4]} = Status4,
- [format_status_called|_] = lists:reverse(Data4),
+ [Match|_] = lists:reverse(Data4),
stop_it(Pid4),
%% check that format_status can handle a name being a term other than a
%% pid or atom
dummy_via:reset(),
ViaName1 = {via,dummy_via,"CallFormatStatus"},
- {ok,Pid5} = gen_statem:start(ViaName1, ?MODULE, start_arg(Config, []), []),
+ {ok,Pid5} = gen_statem:start(ViaName1, Module, start_arg(Config, []), []),
Status5 = sys:get_status(ViaName1),
{status,Pid5,Mod, [_PDict5,running,_,_, Data5]} = Status5,
- [format_status_called|_] = lists:reverse(Data5),
+ [Match|_] = lists:reverse(Data5),
stop_it(Pid5),
ViaName2 = {via,dummy_via,{name,"term"}},
{ok, Pid6} =
gen_statem:start(
- ViaName2, ?MODULE, start_arg(Config, []), []),
+ ViaName2, Module, start_arg(Config, []), []),
Status6 = sys:get_status(ViaName2),
{status,Pid6,Mod,[_PDict6,running,_,_,Data6]} = Status6,
- [format_status_called|_] = lists:reverse(Data6),
+ [Match|_] = lists:reverse(Data6),
stop_it(Pid6).
-
-
error_format_status(Config) ->
error_logger_forwarder:register(),
OldFl = process_flag(trap_exit, true),
+ try
+ error_format_status(Config,?MODULE,{formatted,idle,"called format_status"}),
+ error_format_status(Config,format_status_statem,
+ {{formatted,idle},{formatted,"called format_status"}})
+ after
+ process_flag(trap_exit, OldFl),
+ error_logger_forwarder:unregister()
+ end.
+error_format_status(Config,Module,Match) ->
Data = "called format_status",
{ok,Pid} =
gen_statem:start(
- ?MODULE, start_arg(Config, {data,Data}), []),
+ Module, start_arg(Config, {data,Data}), []),
%% bad return value in the gen_statem loop
{{{bad_return_from_state_function,badreturn},_},_} =
?EXPECT_FAILURE(gen_statem:call(Pid, badreturn), Reason),
@@ -1310,18 +1322,15 @@ error_format_status(Config) ->
{Pid,
"** State machine"++_,
[Pid,{{call,_},badreturn},
- {formatted,idle,Data},
+ Match,
error,{bad_return_from_state_function,badreturn}|_]}} ->
ok;
Other when is_tuple(Other), element(1, Other) =:= error ->
- error_logger_forwarder:unregister(),
ct:fail({unexpected,Other})
after 1000 ->
- error_logger_forwarder:unregister(),
- ct:fail(timeout)
+ ct:fail({timeout,(fun F() -> receive M -> [M|F()] after 0 -> [] end end)()})
end,
- process_flag(trap_exit, OldFl),
- error_logger_forwarder:unregister(),
+
receive
%% Comes with SASL
{error_report,_,{Pid,crash_report,_}} ->
@@ -1332,12 +1341,24 @@ error_format_status(Config) ->
ok = verify_empty_msgq().
terminate_crash_format(Config) ->
+ dbg:tracer(),
error_logger_forwarder:register(),
OldFl = process_flag(trap_exit, true),
+ try
+ terminate_crash_format(Config,?MODULE,{formatted,idle,crash_terminate}),
+ terminate_crash_format(Config,format_status_statem,
+ {{formatted,idle},{formatted,crash_terminate}})
+ after
+ dbg:stop_clear(),
+ process_flag(trap_exit, OldFl),
+ error_logger_forwarder:unregister()
+ end.
+
+terminate_crash_format(Config, Module, Match) ->
Data = crash_terminate,
{ok,Pid} =
gen_statem:start(
- ?MODULE, start_arg(Config, {data,Data}), []),
+ Module, start_arg(Config, {data,Data}), []),
stop_it(Pid),
Self = self(),
receive
@@ -1346,18 +1367,14 @@ terminate_crash_format(Config) ->
"** State machine"++_,
[Pid,
{{call,{Self,_}},stop},
- {formatted,idle,Data},
- exit,{crash,terminate}|_]}} ->
+ Match,exit,{crash,terminate}|_]}} ->
ok;
Other when is_tuple(Other), element(1, Other) =:= error ->
- error_logger_forwarder:unregister(),
ct:fail({unexpected,Other})
after 1000 ->
- error_logger_forwarder:unregister(),
- ct:fail(timeout)
+ ct:fail({timeout,flush()})
end,
- process_flag(trap_exit, OldFl),
- error_logger_forwarder:unregister(),
+
receive
%% Comes with SASL
{error_report,_,{Pid,crash_report,_}} ->
@@ -1367,6 +1384,67 @@ terminate_crash_format(Config) ->
end,
ok = verify_empty_msgq().
+%% We test that all of the different status items can be
+%% formatted by the format_status/1 callback.
+format_all_status(Config) ->
+ error_logger_forwarder:register(),
+ OldFl = process_flag(trap_exit, true),
+
+ Data = fun(M) ->
+ maps:map(
+ fun(Key, Values) when Key =:= log;
+ Key =:= queue;
+ Key =:= postponed;
+ Key =:= timeouts ->
+ [{Key, Value} || Value <- Values];
+ (Key, Value) ->
+ {Key, Value}
+ end, M)
+ end,
+ {ok,Pid} =
+ gen_statem:start(
+ format_status_statem, start_arg(Config, {data,Data}), []),
+ sys:log(Pid, true),
+ ok = gen_statem:cast(Pid, postpone_event),
+ ok = gen_statem:cast(Pid, {timeout, 100000}),
+
+ {status,Pid, _, [_,_,_,_,Info]} = sys:get_status(Pid),
+ [{header, _Hdr},
+ {data, [_Status,_Parent,_Modules,
+ {"Time-outs",{1,[{timeouts,_}]}},
+ {"Logged Events",[{log,_}|_]},
+ {"Postponed",[{postponed,_}]}]},
+ {data, [{"State",{{state,idle},{data,Data}}}]}] = Info,
+
+ %% bad return value in the gen_statem loop
+ {{{bad_return_from_state_function,badreturn},_},_} =
+ ?EXPECT_FAILURE(gen_statem:call(Pid, badreturn), Reason),
+ Self = self(),
+ receive
+ {error,_GroupLeader,
+ {Pid,
+ "** State machine"++_,
+ [Pid,
+ {queue,{{call,{Self,_}},badreturn}},
+ {{state,idle},{data,Data}},error,
+ {reason,{bad_return_from_state_function,badreturn}},
+ __Modules,_StateFunctions,
+ [{postponed,{cast,postpone_event}}],
+ [_|_] = _Stacktrace,
+ {1,[{timeouts,{timeout,idle}}]},
+ [{log,_}|_] |_]}} ->
+ ok;
+ Other when is_tuple(Other), element(1, Other) =:= error ->
+ ct:fail({unexpected,Other})
+ after 1000 ->
+ ct:fail({timeout,flush()})
+ end,
+ receive
+ {error_report,_,_} -> ok
+ end,
+ error_logger_forwarder:unregister(),
+ process_flag(trap_exit, OldFl),
+ ok.
get_state(Config) ->
State = self(),
@@ -2229,6 +2307,311 @@ reply_by_alias_with_payload(Config) when is_list(Config) ->
ok
end.
+send_request_receive_reqid_collection(Config) when is_list(Config) ->
+ {ok,Pid1} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ {ok,Pid2} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ {ok,Pid3} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ send_request_receive_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_receive_reqid_collection_timeout(Pid1, Pid2, Pid3),
+ send_request_receive_reqid_collection_error(Pid1, Pid2, Pid3),
+ stopped = gen_statem:call(Pid1, {stop,shutdown}),
+ stopped = gen_statem:call(Pid3, {stop,shutdown}),
+ check_stopped(Pid1),
+ check_stopped(Pid2),
+ check_stopped(Pid3),
+ ok.
+
+send_request_receive_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqId1 = gen_statem:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_statem:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = gen_statem:reqids_size(ReqIdC1),
+
+ ReqIdC2 = gen_statem:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+ 2 = gen_statem:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_statem:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_statem:reqids_size(ReqIdC3),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_statem:receive_response(ReqIdC3, infinity, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_statem:receive_response(ReqIdC4, 5678, true),
+ 1 = gen_statem:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_statem:receive_response(ReqIdC5, 5000, true),
+ 0 = gen_statem:reqids_size(ReqIdC6),
+
+ no_request = gen_statem:receive_response(ReqIdC6, 5000, true),
+
+ {reply, yes} = gen_statem:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_receive_reqid_collection_timeout(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqId1 = gen_statem:send_request(Pid1, {delayed_answer,1000}),
+ ReqIdC1 = gen_statem:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = gen_statem:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqId3 = gen_statem:send_request(Pid3, {delayed_answer,500}),
+ ReqIdC3 = gen_statem:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_statem:receive_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ timeout = gen_statem:receive_response(ReqIdC4, {abs, Deadline}, true),
+
+ Abandoned = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Abandoned = lists:sort(gen_statem:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were abandoned...
+ timeout = gen_statem:receive_response(ReqIdC4, {abs, Deadline+1000}, true),
+
+ {reply, yes} = gen_statem:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_receive_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqId1 = gen_statem:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_statem:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_statem:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ exit(Pid2, kill),
+ ReqIdC2 = gen_statem:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+ ReqIdC3 = gen_statem:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_statem:reqids_size(ReqIdC3),
+
+ {{error, {noproc, _}}, req2, ReqIdC4} = gen_statem:receive_response(ReqIdC3, 2000, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC4} = gen_statem:receive_response(ReqIdC4, infinity, false),
+
+ {{reply, delayed}, req1, ReqIdC4} = gen_statem:receive_response(ReqIdC4, infinity, false),
+
+ {reply, yes} = gen_statem:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection(Config) when is_list(Config) ->
+ {ok,Pid1} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ {ok,Pid2} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ {ok,Pid3} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ send_request_wait_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_wait_reqid_collection_timeout(Pid1, Pid2, Pid3),
+ send_request_wait_reqid_collection_error(Pid1, Pid2, Pid3),
+ stopped = gen_statem:call(Pid1, {stop,shutdown}),
+ stopped = gen_statem:call(Pid3, {stop,shutdown}),
+ check_stopped(Pid1),
+ check_stopped(Pid2),
+ check_stopped(Pid3),
+ ok.
+
+send_request_wait_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqId1 = gen_statem:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_statem:reqids_add(ReqId1, req1, ReqIdC0),
+ 1 = gen_statem:reqids_size(ReqIdC1),
+
+ ReqIdC2 = gen_statem:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+ 2 = gen_statem:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_statem:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_statem:reqids_size(ReqIdC3),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_statem:wait_response(ReqIdC3, infinity, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_statem:wait_response(ReqIdC4, 5678, true),
+ 1 = gen_statem:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_statem:wait_response(ReqIdC5, 5000, true),
+ 0 = gen_statem:reqids_size(ReqIdC6),
+
+ no_request = gen_statem:wait_response(ReqIdC6, 5000, true),
+
+ {reply, yes} = gen_statem:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_wait_reqid_collection_timeout(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqId1 = gen_statem:send_request(Pid1, {delayed_answer,1000}),
+ ReqIdC1 = gen_statem:reqids_add(ReqId1, req1, ReqIdC0),
+
+ ReqIdC2 = gen_statem:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqId3 = gen_statem:send_request(Pid3, {delayed_answer,500}),
+ ReqIdC3 = gen_statem:reqids_add(ReqId3, req3, ReqIdC2),
+
+ Deadline = erlang:monotonic_time(millisecond) + 100,
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_statem:wait_response(ReqIdC3, {abs, Deadline}, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ timeout = gen_statem:wait_response(ReqIdC4, {abs, Deadline}, true),
+
+ Unhandled = lists:sort([{ReqId1, req1}, {ReqId3, req3}]),
+ Unhandled = lists:sort(gen_statem:reqids_to_list(ReqIdC4)),
+
+ %% Make sure requests were not abandoned...
+ {{reply, delayed}, req3, ReqIdC4} = gen_statem:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+ {{reply, delayed}, req1, ReqIdC4} = gen_statem:wait_response(ReqIdC4, {abs, Deadline+1500}, false),
+
+ {reply, yes} = gen_statem:receive_response(ReqId0),
+
+ ok.
+
+send_request_wait_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqId1 = gen_statem:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_statem:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_statem:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ exit(Pid2, kill),
+ ReqIdC2 = gen_statem:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+ ReqIdC3 = gen_statem:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_statem:reqids_size(ReqIdC3),
+
+ {{error, {noproc, _}}, req2, ReqIdC4} = gen_statem:wait_response(ReqIdC3, 2000, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC4} = gen_statem:wait_response(ReqIdC4, infinity, false),
+
+ {{reply, delayed}, req1, ReqIdC4} = gen_statem:wait_response(ReqIdC4, infinity, false),
+
+ {reply, yes} = gen_statem:receive_response(ReqId0, infinity),
+
+ ok.
+
+send_request_check_reqid_collection(Config) when is_list(Config) ->
+ {ok,Pid1} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ {ok,Pid2} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ {ok,Pid3} = gen_statem:start(?MODULE, start_arg(Config, []), []),
+ send_request_check_reqid_collection(Pid1, Pid2, Pid3),
+ send_request_check_reqid_collection_error(Pid1, Pid2, Pid3),
+ stopped = gen_statem:call(Pid1, {stop,shutdown}),
+ stopped = gen_statem:call(Pid3, {stop,shutdown}),
+ check_stopped(Pid1),
+ check_stopped(Pid2),
+ check_stopped(Pid3),
+ ok.
+
+send_request_check_reqid_collection(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ receive after 100 -> ok end,
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqIdC1 = gen_statem:send_request(Pid1, {delayed_answer,400}, req1, ReqIdC0),
+ 1 = gen_statem:reqids_size(ReqIdC1),
+
+ ReqId2 = gen_statem:send_request(Pid2, {delayed_answer,1}),
+ ReqIdC2 = gen_statem:reqids_add(ReqId2, req2, ReqIdC1),
+ 2 = gen_statem:reqids_size(ReqIdC2),
+
+ ReqIdC3 = gen_statem:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_statem:reqids_size(ReqIdC3),
+
+ Msg0 = next_msg(),
+ no_reply = gen_statem:check_response(Msg0, ReqIdC3, true),
+
+ {{reply, delayed}, req2, ReqIdC4} = gen_statem:check_response(next_msg(), ReqIdC3, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC5} = gen_statem:check_response(next_msg(), ReqIdC4, true),
+ 1 = gen_statem:reqids_size(ReqIdC5),
+
+ {{reply, delayed}, req1, ReqIdC6} = gen_statem:check_response(next_msg(), ReqIdC5, true),
+ 0 = gen_statem:reqids_size(ReqIdC6),
+
+ no_request = gen_statem:check_response(Msg0, ReqIdC6, true),
+
+ {reply, yes} = gen_statem:check_response(Msg0, ReqId0),
+
+ ok.
+
+send_request_check_reqid_collection_error(Pid1, Pid2, Pid3) ->
+
+ ReqId0 = gen_statem:send_request(Pid1, 'alive?'),
+
+ receive after 100 -> ok end,
+
+ ReqIdC0 = gen_statem:reqids_new(),
+
+ ReqId1 = gen_statem:send_request(Pid1, {delayed_answer,400}),
+ ReqIdC1 = gen_statem:reqids_add(ReqId1, req1, ReqIdC0),
+ try
+ nope = gen_statem:reqids_add(ReqId1, req2, ReqIdC1)
+ catch
+ error:badarg -> ok
+ end,
+
+ unlink(Pid2),
+ exit(Pid2, kill),
+ ReqIdC2 = gen_statem:send_request(Pid2, {delayed_answer,1}, req2, ReqIdC1),
+
+ ReqIdC3 = gen_statem:send_request(Pid3, {delayed_answer,200}, req3, ReqIdC2),
+ 3 = gen_statem:reqids_size(ReqIdC3),
+
+ Msg0 = next_msg(),
+
+ no_reply = gen_statem:check_response(Msg0, ReqIdC3, true),
+
+ {{error, {noproc, _}}, req2, ReqIdC4} = gen_statem:check_response(next_msg(), ReqIdC3, true),
+ 2 = gen_statem:reqids_size(ReqIdC4),
+
+ {{reply, delayed}, req3, ReqIdC4} = gen_statem:check_response(next_msg(), ReqIdC4, false),
+
+ {{reply, delayed}, req1, ReqIdC4} = gen_statem:check_response(next_msg(), ReqIdC4, false),
+
+ {reply, yes} = gen_statem:check_response(Msg0, ReqId0),
+
+ ok.
+
+next_msg() ->
+ receive M -> M end.
+
%%
%% Functionality check
%%
@@ -2473,6 +2856,11 @@ idle({call,From}, {timeout,Time}, _Data) ->
AbsTime = erlang:monotonic_time(millisecond) + Time,
{next_state,timeout,{From,Time},
{timeout,AbsTime,idle,[{abs,true}]}};
+idle(cast, {timeout,Time}, _Data) ->
+ AbsTime = erlang:monotonic_time(millisecond) + Time,
+ {keep_state_and_data,{timeout,AbsTime,idle,[{abs,true}]}};
+idle(cast, postpone_event, _Data) ->
+ {keep_state_and_data,postpone};
idle(cast, next_event, _Data) ->
{next_state,next_events,[a,b,c],
[{next_event,internal,a},
diff --git a/lib/stdlib/test/gen_statem_SUITE_data/format_status_statem.erl b/lib/stdlib/test/gen_statem_SUITE_data/format_status_statem.erl
new file mode 100644
index 0000000000..7c0ee1f4d0
--- /dev/null
+++ b/lib/stdlib/test/gen_statem_SUITE_data/format_status_statem.erl
@@ -0,0 +1,40 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2017-2021. All Rights Reserved.
+%%
+%% Licensed under the Apache License, Version 2.0 (the "License");
+%% you may not use this file except in compliance with the License.
+%% You may obtain a copy of the License at
+%%
+%% http://www.apache.org/licenses/LICENSE-2.0
+%%
+%% Unless required by applicable law or agreed to in writing, software
+%% distributed under the License is distributed on an "AS IS" BASIS,
+%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+%% See the License for the specific language governing permissions and
+%% limitations under the License.
+%%
+%% %CopyrightEnd%
+%%
+-module(format_status_statem).
+
+%% gen_statem callbacks
+-export(['$handle_undefined_function'/2, terminate/3, format_status/1]).
+
+'$handle_undefined_function'(format_status, [_,_]) ->
+ erlang:error(undef);
+'$handle_undefined_function'(Func, Args) ->
+ apply(gen_statem_SUITE, Func, Args).
+
+terminate(Reason, State, Data) ->
+ gen_statem_SUITE:terminate(Reason, State, Data).
+
+format_status(#{ data := Fun } = S) when is_function(Fun) ->
+ Fun(S);
+format_status(#{ reason := _, state := State, data := Data } = Map) ->
+ ct:pal("format_status(~p)",[Map]),
+ Map#{ state := {formatted, State}, data := {formatted, Data}};
+format_status(Map) ->
+ ct:pal("format_status(~p)",[Map]),
+ Map#{ data := format_data, state := format_status_called }.
diff --git a/lib/stdlib/test/id_transform_SUITE.erl b/lib/stdlib/test/id_transform_SUITE.erl
index 0addf09461..a8d52c1680 100644
--- a/lib/stdlib/test/id_transform_SUITE.erl
+++ b/lib/stdlib/test/id_transform_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -59,7 +59,7 @@ end_per_group(_GroupName, Config) ->
id_transform(Config) when is_list(Config) ->
File = filename:join([code:lib_dir(stdlib),"examples",
"erl_id_trans.erl"]),
- {ok,erl_id_trans,Bin} = compile:file(File,[binary]),
+ {ok,erl_id_trans,Bin} = compile:file(File, [binary,report]),
{module,erl_id_trans} = code:load_binary(erl_id_trans, File, Bin),
case test_server:is_valgrind() of
false ->
diff --git a/lib/stdlib/test/io_SUITE.erl b/lib/stdlib/test/io_SUITE.erl
index 046bd71ed6..cabde512d3 100644
--- a/lib/stdlib/test/io_SUITE.erl
+++ b/lib/stdlib/test/io_SUITE.erl
@@ -28,7 +28,7 @@
io_fread_newlines/1, otp_8989/1, io_lib_fread_literal/1,
printable_range/1, bad_printable_range/1,
io_lib_print_binary_depth_one/1, otp_10302/1, otp_10755/1,
- otp_10836/1, io_lib_width_too_small/1,
+ otp_10836/1, io_lib_width_too_small/1, calling_self/1,
io_with_huge_message_queue/1, format_string/1, format_neg_zero/1,
maps/1, coverage/1, otp_14178_unicode_atoms/1, otp_14175/1,
otp_14285/1, limit_term/1, otp_14983/1, otp_15103/1, otp_15076/1,
@@ -63,7 +63,7 @@ all() ->
io_fread_newlines, otp_8989, io_lib_fread_literal,
printable_range, bad_printable_range, format_neg_zero,
io_lib_print_binary_depth_one, otp_10302, otp_10755, otp_10836,
- io_lib_width_too_small, io_with_huge_message_queue,
+ io_lib_width_too_small, io_with_huge_message_queue, calling_self,
format_string, maps, coverage, otp_14178_unicode_atoms, otp_14175,
otp_14285, limit_term, otp_14983, otp_15103, otp_15076, otp_15159,
otp_15639, otp_15705, otp_15847, otp_15875, github_4801, chars_limit,
@@ -210,6 +210,10 @@ float_w(Config) when is_list(Config) ->
ok.
+calling_self(Config) when is_list(Config) ->
+ {'EXIT', {calling_self, _}} = (catch io:format(self(), "~p", [oops])),
+ ok.
+
%% OTP-5403. ~s formats I/O lists and a single binary.
otp_5403(Config) when is_list(Config) ->
"atom" = fmt("~s", [atom]),
@@ -1966,22 +1970,16 @@ io_lib_fread_literal(Suite) when is_list(Suite) ->
%% Check that the printable range set by the user actually works.
printable_range(Suite) when is_list(Suite) ->
- Pa = filename:dirname(code:which(?MODULE)),
- {ok, UNode} = test_server:start_node(printable_range_unicode, slave,
- [{args, " +pc unicode -pa " ++ Pa}]),
- {ok, LNode} = test_server:start_node(printable_range_latin1, slave,
- [{args, " +pc latin1 -pa " ++ Pa}]),
- {ok, DNode} = test_server:start_node(printable_range_default, slave,
- [{args, " -pa " ++ Pa}]),
- unicode = rpc:call(UNode,io,printable_range,[]),
- latin1 = rpc:call(LNode,io,printable_range,[]),
+ {ok, UPeer0, UNode0} = ?CT_PEER(["+pc", "unicode"]),
+ {ok, LPeer0, LNode0} = ?CT_PEER(["+pc", "latin1"]),
+ {ok, DPeer, DNode} = ?CT_PEER(),
+ unicode = rpc:call(UNode0,io,printable_range,[]),
+ latin1 = rpc:call(LNode0,io,printable_range,[]),
latin1 = rpc:call(DNode,io,printable_range,[]),
- test_server:stop_node(UNode),
- test_server:stop_node(LNode),
- {ok, UNode} = test_server:start_node(printable_range_unicode, slave,
- [{args, " +pcunicode -pa " ++ Pa}]),
- {ok, LNode} = test_server:start_node(printable_range_latin1, slave,
- [{args, " +pclatin1 -pa " ++ Pa}]),
+ peer:stop(UPeer0),
+ peer:stop(LPeer0),
+ {ok, UPeer, UNode} = ?CT_PEER(["+pcunicode"]),
+ {ok, LPeer, LNode} = ?CT_PEER(["+pclatin1"]),
unicode = rpc:call(UNode,io,printable_range,[]),
latin1 = rpc:call(LNode,io,printable_range,[]),
PrettyOptions = [{column,1},
@@ -2029,9 +2027,9 @@ printable_range(Suite) when is_list(Suite) ->
$\e = format_max(LNode, ["~ts", [PrintableControls]]),
$\e = format_max(DNode, ["~ts", [PrintableControls]]),
- test_server:stop_node(UNode),
- test_server:stop_node(LNode),
- test_server:stop_node(DNode),
+ peer:stop(UPeer),
+ peer:stop(LPeer),
+ peer:stop(DPeer),
ok.
print_max(Node, Args) ->
@@ -2079,11 +2077,8 @@ io_lib_print_binary_depth_one(Suite) when is_list(Suite) ->
%% OTP-10302. Unicode.
otp_10302(Suite) when is_list(Suite) ->
- Pa = filename:dirname(code:which(?MODULE)),
- {ok, UNode} = test_server:start_node(printable_range_unicode, slave,
- [{args, " +pc unicode -pa " ++ Pa}]),
- {ok, LNode} = test_server:start_node(printable_range_latin1, slave,
- [{args, " +pc latin1 -pa " ++ Pa}]),
+ {ok, UPeer, UNode} = ?CT_PEER(["+pc", "unicode"]),
+ {ok, LPeer, LNode} = ?CT_PEER(["+pc", "latin1"]),
"\"\x{400}\"" = rpc:call(UNode,?MODULE,pretty,["\x{400}", -1]),
"<<\"\x{400}\"/utf8>>" = rpc:call(UNode,?MODULE,pretty,
[<<"\x{400}"/utf8>>, -1]),
@@ -2094,8 +2089,8 @@ otp_10302(Suite) when is_list(Suite) ->
"<<208,128>>" = rpc:call(LNode,?MODULE,pretty,[<<"\x{400}"/utf8>>, -1]),
"<<208,...>>" = rpc:call(LNode,?MODULE,pretty,[<<"\x{400}foo"/utf8>>, 2]),
- test_server:stop_node(UNode),
- test_server:stop_node(LNode),
+ peer:stop(UPeer),
+ peer:stop(LPeer),
"<<\"äppl\"/utf8>>" = pretty(<<"äppl"/utf8>>, 2),
"<<\"äppl\"/utf8...>>" = pretty(<<"äpple"/utf8>>, 2),
@@ -2740,9 +2735,7 @@ trunc_string() ->
"str str" = trf("str ~s", ["str"], 7),
"str str" = trf("str ~8s", ["str"], 6),
"str ..." = trf("str ~8s", ["str1"], 6),
- Pa = filename:dirname(code:which(?MODULE)),
- {ok, UNode} = test_server:start_node(printable_range_unicode, slave,
- [{args, " +pc unicode -pa " ++ Pa}]),
+ {ok, UPeer, UNode} = ?CT_PEER(["+pc", "unicode"]),
U = "кириллиÌчеÑкий атом",
UFun = fun(Format, Args, CharsLimit) ->
rpc:call(UNode,
@@ -2760,7 +2753,7 @@ trunc_string() ->
"<<\"кириллиÌ\"/utf8...>>" = UFun("~tp", [BU], 20),
"<<\"кириллиÌ\"/utf8...>>" = UFun("~tp", [BU], 21),
"<<\"кириллиÌчеÑк\"/utf8...>>" = UFun("~tp", [BU], 22),
- test_server:stop_node(UNode).
+ peer:stop(UPeer).
trunc_depth(D, Fun) ->
"..." = Fun("", D, 0),
@@ -3034,6 +3027,8 @@ error_info(Config) ->
{put_chars,[a], [{1,"not valid character data"}]},
{put_chars,[UnknownDev(),"test"], [{general,"unknown error: 'Спутник-1'"}]},
{put_chars,["test"], [{gl,UnknownDev()},{general,"unknown error: 'Спутник-1'"}]},
+ {put_chars,[self(),"test"],[{1,"the device is not allowed to be the current process"}]},
+ {put_chars,["test"],[{gl,self()},{general,"the device is not allowed to be the current process"}]},
{write,[DeadDev,"test"],[{1,"terminated"}]},
{write,["test"],[{gl,DeadDev},{general,"terminated"}]},
diff --git a/lib/stdlib/test/io_proto_SUITE.erl b/lib/stdlib/test/io_proto_SUITE.erl
index df6958cfa9..52ed5c608f 100644
--- a/lib/stdlib/test/io_proto_SUITE.erl
+++ b/lib/stdlib/test/io_proto_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2019. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1179,7 +1179,7 @@ get_and_put(CPid, [{getline_pred,Pred,Msg}|T]=T0, N)
"(command number ~p)\n",
[?MODULE,Msg,N]),
{error, no_match};
- maybe ->
+ 'maybe' ->
List = get(getline_skipped),
put(getline_skipped, List ++ [Data]),
get_and_put(CPid, T0, N)
@@ -1190,7 +1190,7 @@ get_and_put(CPid, [{getline, Match}|T],N) ->
F = fun(Data) ->
case lists:prefix(Match, Data) of
true -> yes;
- false -> maybe
+ false -> 'maybe'
end
end,
get_and_put(CPid, [{getline_pred,F,Match}|T], N);
@@ -1198,7 +1198,7 @@ get_and_put(CPid, [{getline_re, Match}|T],N) ->
F = fun(Data) ->
case re:run(Data, Match, [{capture,none}]) of
match -> yes;
- _ -> maybe
+ _ -> 'maybe'
end
end,
get_and_put(CPid, [{getline_pred,F,Match}|T], N);
@@ -1498,7 +1498,7 @@ get_default_shell() ->
case re:run(Data, "<\\d+[.]\\d+[.]\\d+>",
[{capture,none}]) of
match -> no;
- _ -> maybe
+ _ -> 'maybe'
end
end
end,
diff --git a/lib/stdlib/test/lists_SUITE.erl b/lib/stdlib/test/lists_SUITE.erl
index bbd0d81b1c..b369b6918e 100644
--- a/lib/stdlib/test/lists_SUITE.erl
+++ b/lib/stdlib/test/lists_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -32,7 +32,7 @@
%% Test cases must be exported.
-export([member/1, reverse/1,
keymember/1, keysearch_keyfind/1,
- keystore/1, keytake/1, keyreplace/1,
+ keystore/1, keytake/1, keyreplace/1,
append_1/1, append_2/1,
seq_loop/1, seq_2/1, seq_3/1, seq_2_e/1, seq_3_e/1,
@@ -53,12 +53,13 @@
ufunmerge/1, rufunmerge/1,
ufunsort_1/1, ufunsort_stable/1, ufunsort_rand/1,
ufunsort_error/1,
+ uniq_1/1, uniq_2/1,
zip_unzip/1, zip_unzip3/1, zipwith/1, zipwith3/1,
filter_partition/1,
join/1,
otp_5939/1, otp_6023/1, otp_6606/1, otp_7230/1,
suffix/1, subtract/1, droplast/1, search/1, hof/1,
- error_info/1]).
+ enumerate/1, error_info/1]).
%% Sort randomized lists until stopped.
%%
@@ -81,10 +82,11 @@ suite() ->
all() ->
[{group, append},
{group, key},
- {group,sort},
+ {group, sort},
{group, usort},
{group, keysort},
{group, ukeysort},
+ {group, uniq},
{group, funsort},
{group, ufunsort},
{group, sublist},
@@ -120,9 +122,10 @@ groups() ->
[flatten_1, flatten_2, flatten_1_e, flatten_2_e]},
{tickets, [parallel], [otp_5939, otp_6023, otp_6606, otp_7230]},
{zip, [parallel], [zip_unzip, zip_unzip3, zipwith, zipwith3]},
+ {uniq, [parallel], [uniq_1, uniq_2]},
{misc, [parallel], [reverse, member, dropwhile, takewhile,
filter_partition, suffix, subtract, join,
- hof, droplast, search, error_info]}
+ hof, droplast, search, enumerate, error_info]}
].
init_per_suite(Config) ->
@@ -2743,6 +2746,22 @@ hof(Config) when is_list(Config) ->
ok.
+%% Test lists:enumerate/1 and lists:enumerate/2
+enumerate(Config) when is_list(Config) ->
+ [] = lists:enumerate([]),
+ [] = lists:enumerate(10, []),
+ [{1,a},{2,b},{3,c}] = lists:enumerate([a,b,c]),
+ [{10,a},{11,b},{12,c}] = lists:enumerate(10, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(0),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(0, 10),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1.0, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, []),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(<<1>>, [a,b,c]),
+ {'EXIT', {function_clause, _}} = catch lists:enumerate(1, <<1,2,3>>),
+
+ ok.
+
error_info(_Config) ->
L = [{keyfind, [whatever, bad_position, bad_list], [{2,".*"},{3,".*"}]},
{keymember, [key, 0, bad_list], [{2,".*"}, {3,".*"}]},
@@ -2767,3 +2786,22 @@ do_error_info(L0) ->
NYI = [{F,lists:duplicate(A, '*'),nyi} || {F,A} <- Bifs -- Tests],
L = lists:sort(NYI ++ L1),
error_info_lib:test_error_info(lists, L, [snifs_only]).
+
+uniq_1(_Config) ->
+ [] = lists:uniq([]),
+ [foo] = lists:uniq([foo]),
+ ["foo", "bar", "zoo"] = lists:uniq(["foo", "foo", "bar", "foo", "zoo",
+ "foo", "bar", "zoo"]),
+ [a, 1, b, 2] = lists:uniq([a, a, a, 1, b, 2, a, 2, 1]),
+ [<<"home">>, "home"] = lists:uniq([<<"home">>, "home"]),
+ [3.14159, 2.71828, 3.17] = lists:uniq([3.14159, 3.14159, 2.71828, 3.17]),
+ [42, 42.0] = lists:uniq([42, 42.0, 42, 42.0]),
+ ok.
+
+uniq_2(_Config) ->
+ [] = lists:uniq(fun(X) -> X end, []),
+ [{42, 1}, {42.0, 99}, {a, 99}] =
+ lists:uniq(fun(X) -> element(1, X) end,
+ [{42, 1}, {42.0, 99}, {a, 99}, {a, 1}, {42, 100}]),
+ [1] = lists:uniq(fun(_) -> whatever end, lists:seq(1, 10)),
+ ok.
diff --git a/lib/stdlib/test/maps_SUITE.erl b/lib/stdlib/test/maps_SUITE.erl
index 28895c4efe..8d479f8211 100644
--- a/lib/stdlib/test/maps_SUITE.erl
+++ b/lib/stdlib/test/maps_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -42,7 +42,8 @@
t_from_list_check_trapping/1,
t_from_keys_check_trapping/1,
t_keys_trapping/1,
- t_values_trapping/1]).
+ t_values_trapping/1,
+ t_groups_from_list/1]).
-define(badmap(V,F,Args), {'EXIT', {{badmap,V}, [{maps,F,Args,_}|_]}}).
-define(badkey(K,F,Args), {'EXIT', {{badkey,K}, [{maps,F,Args,_}|_]}}).
@@ -68,7 +69,8 @@ all() ->
t_from_list_check_trapping,
t_from_keys_check_trapping,
t_keys_trapping,
- t_values_trapping].
+ t_values_trapping,
+ t_groups_from_list].
t_from_list_kill_process(Config) when is_list(Config) ->
Killer = self(),
@@ -770,6 +772,16 @@ t_size_1(Config) when is_list(Config) ->
{'EXIT', {{badmap,<<>>}, _}} = (catch maps:size(id(<<>>))),
ok.
+t_groups_from_list(_Config) ->
+ #{} = maps:groups_from_list(fun erlang:length/1, []),
+ #{3 := ["tna","tac"], 5 := ["ognid"], 7 := ["olaffub"]} =
+ maps:groups_from_list(
+ fun erlang:length/1,
+ fun lists:reverse/1,
+ ["ant", "buffalo", "cat", "dingo"]
+ ),
+ #{0 := [2], 1 := [1, 3]} = maps:groups_from_list(fun(X) -> X rem 2 end, [1, 2, 3]).
+
error_info(_Config) ->
BadIterator = [-1|#{}],
GoodIterator = maps:iterator(#{}),
@@ -806,6 +818,13 @@ error_info(_Config) ->
{get, [key, {no,map}]},
{get, [key, {no,map}, default]},
+ {groups_from_list, [not_a_fun, []]},
+ {groups_from_list, [fun hd/1, not_a_list]},
+
+ {groups_from_list, [not_a_fun, fun(_) -> ok end, []]},
+ {groups_from_list, [fun(_) -> ok end, not_a_fun, []]},
+ {groups_from_list, [fun(_) -> ok end, fun(_) -> ok end, not_a_list]},
+
{intersect, [#{a => b}, y]},
{intersect, [x, #{a => b}]},
{intersect, [x, y],[{1,".*"},{2,".*"}]},
diff --git a/lib/stdlib/test/ms_transform_SUITE.erl b/lib/stdlib/test/ms_transform_SUITE.erl
index a28de19372..c34c7e9e69 100644
--- a/lib/stdlib/test/ms_transform_SUITE.erl
+++ b/lib/stdlib/test/ms_transform_SUITE.erl
@@ -30,12 +30,19 @@
-export([from_shell/1]).
-export([records/1]).
-export([record_index/1]).
--export([multipass/1]).
+-export([map_pattern/1]).
+-export([map_expr_in_head/1]).
+-export([map_pattern_from_shell/1]).
+-export([map_expr_in_head_from_shell/1]).
+-export([map_exprs/1]).
+-export([map_exprs_from_shell/1]).
-export([top_match/1]).
+-export([multipass/1]).
-export([old_guards/1]).
-export([autoimported/1]).
-export([semicolon/1]).
-export([bitsyntax/1]).
+-export([binary_bifs/1]).
-export([record_defaults/1]).
-export([andalso_orelse/1]).
-export([float_1_function/1]).
@@ -59,10 +66,13 @@ suite() ->
all() ->
[from_shell, basic_ets, basic_dbg, records,
- record_index, multipass, bitsyntax, record_defaults,
+ record_index, multipass, bitsyntax, binary_bifs, record_defaults,
andalso_orelse, float_1_function, action_function,
warnings, no_warnings, top_match, old_guards, autoimported,
- semicolon, eep37, otp_14454, otp_16824, unused_record].
+ semicolon, eep37, otp_14454, otp_16824, unused_record,
+ map_pattern, map_expr_in_head,
+ map_pattern_from_shell, map_expr_in_head_from_shell,
+ map_exprs, map_exprs_from_shell].
groups() ->
[].
@@ -257,6 +267,32 @@ bitsyntax(Config) when is_list(Config) ->
" end)">>),
ok.
+
+%% Test that binary BIFs byte_size/1, binary_part/2, binary_part/3 are accepted
+binary_bifs(Config) when is_list(Config) ->
+ setup(Config),
+ TestSet = [{<<"hello">>, <<"world">>}, {<<"souldn't">>, <<"match">>}],
+ RunMS = fun(MS) -> ets:match_spec_run(TestSet, ets:match_spec_compile(MS)) end,
+ % check byte_size/1
+ MS1 = compile_and_run(<<"ets:fun2ms(fun({A, B}) when byte_size(A) == 5 -> {A, byte_size(B)} end)">>),
+ [{{'$1','$2'},
+ [{'==',{byte_size,'$1'},5}],
+ [{{'$1',{byte_size,'$2'}}}]}] = MS1,
+ [{<<"hello">>, 5}] = RunMS(MS1),
+ % check binary_part/2
+ MS2 = compile_and_run(<<"ets:fun2ms(fun({A, B}) when binary_part(A, {1, 2}) == <<\"el\">> -> binary_part(B, {2, 3}) end)">>),
+ [{{'$1','$2'},
+ [{'==',{binary_part,'$1',{{1,2}}},<<"el">>}],
+ [{binary_part,'$2',{{2,3}}}]}] = MS2,
+ [<<"rld">>] = RunMS(MS2),
+ % check binary_part/3
+ MS3 = compile_and_run(<<"ets:fun2ms(fun({A, B}) when binary_part(A, 1, 2) == <<\"el\">> -> binary_part(B, 2, 3) end)">>),
+ [{{'$1','$2'},
+ [{'==',{binary_part,'$1',1,2},<<"el">>}],
+ [{binary_part,'$2',2,3}]}] = MS3,
+ [<<"rld">>] = RunMS(MS3),
+ ok.
+
%% Test that record defaults works.
record_defaults(Config) when is_list(Config) ->
setup(Config),
@@ -289,7 +325,7 @@ basic_ets(Config) when is_list(Config) ->
compile_and_run(<<"ets:fun2ms(fun({\"foo\" ++ _, X}) -> X end)">>),
ok.
-%% Tests basic ets:fun2ms.
+%% Tests basic dbg:fun2ms.
basic_dbg(Config) when is_list(Config) ->
setup(Config),
[{[a,b],[],[{message,banan},{return_trace}]}] =
@@ -382,6 +418,59 @@ record_index(Config) when is_list(Config) ->
<<"ets:fun2ms(fun({#a.a,A}) when A > #a.a -> #a.a end)">>),
ok.
+map_pattern(Config) when is_list(Config) ->
+ setup(Config),
+ MS = [{{key, #{foo => '$1'}},[],['$1']}],
+ MS = compile_and_run(<<"ets:fun2ms(fun({key, #{foo := V}}) -> V end)">>),
+ ok.
+
+map_expr_in_head(Config) when is_list(Config) ->
+ setup(Config),
+ MS = [{{key, #{foo => '$1'}},[],['$1']}],
+ %% Accidentally it is possible to use => instead of := in the fun head,
+ %% in compiled code.
+ %% Although this is not an intended behaviour it is kept to
+ %% maintain backwards compatibility.
+ MS = compile_and_run(<<"ets:fun2ms(fun({key, #{foo => V}}) -> V end)">>),
+ ok.
+
+map_pattern_from_shell(Config) when is_list(Config) ->
+ MS = [{{key, #{foo => '$1'}},[],['$1']}],
+ MS = do_eval("ets:fun2ms(fun({key, #{foo := V}}) -> V end)"),
+ ok.
+
+map_expr_in_head_from_shell(Config) when is_list(Config) ->
+ setup(Config),
+ MS = [{{key, #{foo => '$1'}},[],['$1']}],
+ %% Accidentally it is possible to use => instead of := in the fun head,
+ %% in compiled code. This behaviour is kept for backwards compatibility.
+
+ %% As a side-effect, it is also possible to do the same with
+ %% `transform_from_shell/3', if the AST of the shell fun is
+ %% created bypassing the linter. (The linter would prevent
+ %% constructing such invalid syntax, so normally this is not
+ %% possible in the Erlang shell)
+ MS = do_eval("ets:fun2ms(fun({key, #{foo => V}}) -> V end)"),
+ ok.
+
+map_exprs(Config) when is_list(Config) ->
+ setup(Config),
+ MSGuard = [{{key,'$1','$2'}, [{'=:=','$1',#{foo => '$2'}}], ['$1']}],
+ MSGuard = compile_and_run(
+ <<"ets:fun2ms(fun({key, V1, V2}) when V1 =:= #{foo => V2} -> V1 end)">>),
+ MSBody = [{{key,'$1'}, [], [#{foo => '$1'}]}],
+ MSBody = compile_and_run(
+ <<"ets:fun2ms(fun({key, V}) -> #{foo => V} end)">>),
+ ok.
+
+map_exprs_from_shell(Config) when is_list(Config) ->
+ setup(Config),
+ MSGuard = [{{key,'$1','$2'}, [{'=:=','$1',#{foo => '$2'}}], ['$1']}],
+ MSGuard = do_eval("ets:fun2ms(fun({key, V1, V2}) when V1 =:= #{foo => V2} -> V1 end)"),
+ MSBody = [{{key,'$1'}, [], [#{foo => '$1'}]}],
+ MSBody = do_eval("ets:fun2ms(fun({key, V}) -> #{foo => V} end)"),
+ ok.
+
%% Tests matching on top level in head to give alias for object().
top_match(Config) when is_list(Config) ->
setup(Config),
@@ -897,5 +986,5 @@ do_eval(String) ->
[],
String++".\n",1),
{ok,Tree} = erl_parse:parse_exprs(T),
- {value,Res,[]} = erl_eval:exprs(Tree,[]),
+ {value,Res,[]} = erl_eval:exprs(Tree,[],none,none),
Res.
diff --git a/lib/stdlib/test/peer_SUITE.erl b/lib/stdlib/test/peer_SUITE.erl
new file mode 100644
index 0000000000..f041a4fa18
--- /dev/null
+++ b/lib/stdlib/test/peer_SUITE.erl
@@ -0,0 +1,537 @@
+%%% @doc
+%%% Smoke tests for peer node controller
+%%% @end
+-module(peer_SUITE).
+-author("maximfca@gmail.com").
+
+%% Common Test headers
+-include_lib("stdlib/include/assert.hrl").
+-include_lib("common_test/include/ct.hrl").
+
+%% Test server callbacks
+-export([
+ suite/0,
+ all/0,
+ groups/0,
+ init_per_group/2,
+ end_per_group/2
+]).
+
+%% Test cases
+-export([
+ dist/0, dist/1,
+ peer_down_crash/0, peer_down_crash/1,
+ peer_down_continue/0, peer_down_continue/1,
+ peer_down_boot/0, peer_down_boot/1,
+ dist_io_redirect/0, dist_io_redirect/1,
+ dist_localhost/0, dist_localhost/1,
+ errors/0, errors/1,
+ basic/0, basic/1,
+ peer_states/0, peer_states/1,
+ cast/0, cast/1,
+ detached/0, detached/1,
+ dyn_peer/0, dyn_peer/1,
+ stop_peer/0, stop_peer/1,
+ shutdown_halt/0, shutdown_halt/1,
+ shutdown_halt_timeout/0, shutdown_halt_timeout/1,
+ shutdown_stop/0, shutdown_stop/1,
+ shutdown_stop_timeout/0, shutdown_stop_timeout/1,
+ shutdown_close/0, shutdown_close/1,
+ init_debug/0, init_debug/1,
+ io_redirect/0, io_redirect/1,
+ multi_node/0, multi_node/1,
+ dist_up_down/0, dist_up_down/1,
+ duplicate_name/0, duplicate_name/1,
+ old_release/0, old_release/1,
+ ssh/0, ssh/1,
+ docker/0, docker/1
+]).
+
+suite() ->
+ [{timetrap, {minutes, 1}}].
+
+shutdown_alternatives() ->
+ [shutdown_halt, shutdown_halt_timeout, shutdown_stop, shutdown_stop_timeout, shutdown_close].
+
+alternative() ->
+ [basic, peer_states, cast, detached, dyn_peer, stop_peer,
+ io_redirect, multi_node, duplicate_name] ++ shutdown_alternatives().
+
+groups() ->
+ [
+ {dist, [parallel], [errors, dist, peer_down_crash, peer_down_continue, peer_down_boot,
+ dist_up_down, dist_localhost] ++ shutdown_alternatives()},
+ {dist_seq, [], [dist_io_redirect]}, %% Cannot be run in parallel in dist group
+ {tcp, [parallel], alternative()},
+ {standard_io, [parallel], [init_debug | alternative()]},
+ {compatibility, [parallel], [old_release]},
+ {remote, [parallel], [ssh]}
+ ].
+
+all() ->
+ [{group, dist}, {group, dist_seq}, {group, tcp}, {group, standard_io},
+ {group, compatibility}, {group, remote}].
+
+init_per_group(remote, Config) ->
+ %% check that SSH can connect to localhost, skip the test if not
+ try os:cmd("ssh localhost echo ok") of
+ "ok\n" -> Config;
+ _ -> {skip, "'ssh localhost echo ok' did not return ok"}
+ catch
+ Class:Reason ->
+ SkipReason = io_lib:format("'ssh localhost echo ok' failed with ~s:~p", [Class, Reason]),
+ {skip, SkipReason}
+ end;
+init_per_group(dist, Config) ->
+ case erlang:is_alive() of
+ true -> Config;
+ false -> {skip, "origin is not distributed"}
+ end;
+init_per_group(tcp, Config) ->
+ [{connection, 0} | Config];
+init_per_group(standard_io, Config) ->
+ [{connection, standard_io} | Config];
+init_per_group(_Group, Config) ->
+ Config.
+
+end_per_group(_TestCase, Config) ->
+ proplists:delete(connection, Config).
+
+%% -------------------------------------------------------------------
+%% Distribution-enabled cases
+
+errors() ->
+ [{doc, "Verify that invalid command line is rejected immediately"}].
+
+errors(Config) when is_list(Config) ->
+ ?assertException(error, {invalid_arg, atom}, peer:start(#{args => atom})),
+ ?assertException(error, {invalid_arg, $s}, peer:start(#{args => "string"})),
+ ?assertException(error, {invalid_arg, ["2"]}, peer:start(#{args => ["1", ["2"]]})),
+ ?assertException(error, {exec, atom}, peer:start(#{exec => atom, name => name})),
+ ?assertException(error, {exec, atom}, peer:start(#{exec => {atom, []}, name => name})),
+ ?assertException(error, {exec, atom}, peer:start(#{exec => {"erl", [atom]}, name => name})),
+ ?assertException(error, not_alive, peer:start(#{})). %% peer node won't start - it's not alive
+
+dist() ->
+ [{doc, "Classic behaviour: detached peer with no alternative, connects via dist"}].
+
+%% Classic 'slave': start new node locally, with random name, ask peer control process to exit normally
+dist(Config) when is_list(Config) ->
+ {ok, Peer, Node} = peer:start_link(),
+ %% distribution is expected to be connected
+ ?assertEqual(Node, erpc:call(Node, erlang, node, [])),
+ %% but not alternative...
+ ?assertException(error, noconnection, peer:call(Peer, erlang, node, [])),
+ ?assertEqual(true, net_kernel:disconnect(Node)),
+ %% ^^^ this makes the node go down, but we also need to ensure that net_kernel
+ %% finished processing
+ ct:sleep(500),
+ _ = sys:get_state(net_kernel),
+ ?assertException(exit, {noproc, _}, peer:get_state(Peer)).
+
+peer_down_crash() ->
+ [{doc, "Tests peer_down handling when crash mode is requested"}].
+
+peer_down_crash(Config) when is_list(Config) ->
+ %% two-way link: "crash" mode
+ {ok, Peer, Node} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME),
+ args => ["-connect_all", "false"], peer_down => crash}),
+ %% verify node started locally
+ ?assertEqual(Node, erpc:call(Node, erlang, node, [])),
+ %% verify there is no alternative connection
+ ?assertException(error, noconnection, peer:call(Peer, erlang, node, [])),
+ %% unlink and monitor
+ unlink(Peer),
+ MRef = monitor(process, Peer),
+ ?assertEqual(true, net_kernel:disconnect(Node)),
+ %% ^^^ this makes the node go down
+ %% since two-way link is requested, it triggers peer to stop
+ receive
+ {'DOWN', MRef, process, Peer, {nodedown, Node}} ->
+ ok
+ after 2000 ->
+ link(Peer),
+ {fail, disconnect_timeout}
+ end.
+
+peer_down_continue() ->
+ [{doc, "Tests peer_down handling for continue setting"}].
+
+peer_down_continue(Config) when is_list(Config) ->
+ {ok, Peer, Node} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME),
+ args => ["-connect_all", "false"], peer_down => continue}),
+ ?assertEqual(ok, erpc:cast(Node, erlang, halt, [])),
+ ct:sleep(500),
+ sys:replace_state(net_kernel, fun(S) -> sys:get_state(Peer), S end),
+ ?assertMatch({down, _}, peer:get_state(Peer)),
+ peer:stop(Peer).
+
+peer_down_boot() ->
+ [{doc, "Tests that peer node failing boot fails start_link correctly"}].
+
+peer_down_boot(Config) when is_list(Config) ->
+ ?assertException(exit, {boot_failed, {exit_status, 1}},
+ peer:start_link(#{connection => standard_io, name => peer:random_name(), args => ["-no_epmd"]})).
+
+dist_io_redirect() ->
+ [{doc, "Tests i/o redirection working for dist"}].
+
+dist_io_redirect(Config) when is_list(Config) ->
+ %% Common Test changes group leader process to capture output.
+ %% 'peer' relays output via control process group leader.
+ ct:capture_start(),
+ {ok, Peer, Node} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME),
+ args => ["-connect_all", "false", "-eval", "io:format(\"out\")."]}),
+ %% RPC is smart enough to set the group leader, so force 'user' output
+ %% to check that peer node redirects 'user' to the current process group
+ %% leader.
+ ?assertEqual(ok, erpc:call(Node, io, format, [user, "STRONGFLOUR.", []])),
+ %% verify that 'send' is ignored when no alternative connection is done
+ ?assertEqual(ok, peer:send(Peer, init, {stop, stop})),
+ %% check that RPC sets the group leader, even via 'apply'
+ ?assertEqual(ok, erpc:call(Node, erlang, apply, [io, format, ["second."]])),
+ %% 'eval' at the end may be quite slow, so have to wait here
+ ct:sleep(500),
+ peer:stop(Peer),
+ ct:capture_stop(),
+ Texts = ct:capture_get(),
+ %% order is not guaranteed, so sort explicitly
+ ?assertEqual(lists:sort(["STRONGFLOUR.", "second.", "out"]), lists:sort(Texts)).
+
+dist_up_down() ->
+ [{doc, "Test that Erlang distribution can go up and down (with TCP alternative)"}].
+
+dist_up_down(Config) when is_list(Config) ->
+ %% skip establishing full mesh, for it makes 'global' hang
+ %% TODO: fix 'global.erl' locker process so it does not hang
+ {ok, Peer, Node} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME),
+ connection => {{127, 0, 0, 1}, 0}, args => ["-connect_all", "false"]}),
+ ?assertEqual(true, net_kernel:connect_node(Node)),
+ ?assertEqual(true, net_kernel:disconnect(Node)),
+ ?assertEqual(true, net_kernel:connect_node(Node)),
+ peer:stop(Peer).
+
+dist_localhost() ->
+ [{doc, "Test that localhost and gethostname operate together"}].
+
+dist_localhost(Config) when is_list(Config) ->
+ {ok, Peer, Node} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME), host => "localhost"}),
+ ?assertMatch([_, "localhost"], string:lexemes(atom_to_list(Node), "@")),
+ %% start second peer, ensure they see each other
+ {ok, Host} = inet:gethostname(),
+ {ok, Peer2, Node2} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME), host => Host}),
+ true = erpc:call(Node, net_kernel, connect_node, [Node2]),
+ peer:stop(Peer),
+ peer:stop(Peer2).
+
+%% -------------------------------------------------------------------
+%% alternative connection cases
+
+%% Runs in the peer node context, forward a message from peer node to origin
+%% node via alternative connection.
+-spec forward(Dest :: pid() | atom(), Message :: term()) -> term().
+forward(Dest, Message) ->
+ group_leader() ! {message, Dest, Message}.
+
+basic() ->
+ [{doc, "Tests peer node start, and do some RPC via stdin/stdout"}].
+
+basic(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer, _Node} = peer:start_link(#{connection => Conn}),
+ %% test the alternative connection
+ ?assertEqual('nonode@nohost', peer:call(Peer, erlang, node, [])),
+ ?assertException(throw, ball, peer:call(Peer, erlang, throw, [ball])),
+ %% setup code path to this module (needed to "fancy RPC")
+ Path = filename:dirname(code:which(?MODULE)),
+ ?assertEqual(true, peer:call(Peer, code, add_path, [Path])),
+ %% fancy RPC via message exchange (uses forwarding from the peer)
+ Control = self(),
+ RFun = fun() -> receive do -> forward(Control, done) end end,
+ RemotePid = peer:call(Peer, erlang, spawn, [RFun]),
+ peer:send(Peer, RemotePid, do),
+ %% wait back from that process
+ receive done -> ok end,
+ %% shutdown the node
+ ?assertEqual(ok, peer:stop(Peer)),
+ ?assertNot(is_process_alive(Peer)).
+
+peer_states() ->
+ [{doc, "Tests peer node states"}].
+
+peer_states(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer} = peer:start_link(#{connection => Conn, wait_boot => {self(), ?FUNCTION_NAME},
+ peer_down => continue}),
+ ?assertEqual(booting, peer:get_state(Peer)),
+ %% running
+ receive {?FUNCTION_NAME, {started, _Node, Peer}} -> ok end,
+ ?assertEqual(running, peer:get_state(Peer)),
+ peer:cast(Peer, erlang, halt, []),
+ ct:sleep(1000), %% source of flakiness, should switch to some better notification mechanism
+ %% down
+ ?assertMatch({down, _}, peer:get_state(Peer)),
+ peer:stop(Peer).
+
+cast() ->
+ [{doc, "Tests casts via alternative connections"}].
+
+cast(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer, _Node} = peer:start_link(#{connection => Conn}),
+ %% cast RPC
+ ?assertEqual(undefined, peer:call(Peer, application, get_env, [kernel, foo])),
+ peer:cast(Peer, application, set_env, [kernel, foo, bar]),
+ %% this is only to ensure application_controller completed processing
+ peer:call(Peer, sys, get_state, [application_controller]),
+ ?assertEqual({ok, bar}, peer:call(Peer, application, get_env, [kernel, foo])),
+ peer:stop(Peer).
+
+detached() ->
+ [{doc, "Tests detached node (RPC via alternative connection)"}].
+
+detached(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer, _Node} = peer:start_link(#{connection => Conn}),
+ ?assertEqual('nonode@nohost', peer:call(Peer, erlang, node, [])),
+ %% check exceptions
+ ?assertException(throw, ball, peer:call(Peer, erlang, throw, [ball])),
+ %% check tcp forwarding
+ Path = filename:dirname(code:which(?MODULE)),
+ ?assertEqual(true, peer:call(Peer, code, add_path, [Path])),
+ %% fancy RPC via message exchange (uses forwarding from the peer)
+ Control = self(),
+ RFun = fun() -> receive do -> forward(Control, done) end end,
+ RemotePid = peer:call(Peer, erlang, spawn, [RFun]),
+ %% test that sending message over alternative TCP connection works
+ peer:send(Peer, RemotePid, do),
+ %% wait back from that process
+ receive done -> ok end,
+ %% logging via TCP
+ ct:capture_start(),
+ peer:call(Peer, io, format, ["one."]),
+ peer:call(Peer, erlang, apply, [io, format, ["two."]]),
+ peer:stop(Peer),
+ ct:capture_stop(),
+ Texts = ct:capture_get(),
+ %% just stop
+ ?assertEqual(["one.", "two."], Texts).
+
+dyn_peer() ->
+ [{doc, "Origin is not distributed, and peer becomes distributed dynamically"}].
+
+dyn_peer(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer, 'nonode@nohost'} = peer:start_link(#{connection => Conn}), %% start not distributed
+ Node = list_to_atom(lists:concat([peer:random_name(?FUNCTION_NAME), "@forced.host"])),
+ {ok, _} = peer:call(Peer, net_kernel, start, [[Node, longnames]]),
+ ?assertEqual(Node, peer:call(Peer, erlang, node, [])),
+ peer:stop(Peer).
+
+stop_peer() ->
+ [{doc, "Test that peer shuts down even when node sleeps, but control connection closed"}].
+
+stop_peer(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer, _Node} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME),
+ connection => Conn, args => ["-eval", "timer:sleep(60000)."]}),
+ %% shutdown node
+ peer:stop(Peer).
+
+shutdown_halt() ->
+ [{doc, "Test that peer shutdown halt wait until node connection is down"}].
+shutdown_halt(Config) when is_list(Config) ->
+ false = shutdown_test(Config, ?FUNCTION_NAME, halt, 500, false, 1000),
+ ok.
+
+shutdown_halt_timeout() ->
+ [{doc, "Test that peer shutdown halt forcefully takes down connection on timeout"}].
+shutdown_halt_timeout(Config) when is_list(Config) ->
+ false = shutdown_test(Config, ?FUNCTION_NAME, {halt, 1000}, 5000, true, 1500),
+ ok.
+
+shutdown_stop() ->
+ [{doc, "Test that peer shutdown stop wait until node connection is down"}].
+shutdown_stop(Config) when is_list(Config) ->
+ false = shutdown_test(Config, ?FUNCTION_NAME, infinity, 500, false, 2000),
+ ok.
+
+shutdown_stop_timeout() ->
+ [{doc, "Test that peer shutdown stop forcefully takes down connection on timeout"}].
+shutdown_stop_timeout(Config) when is_list(Config) ->
+ false = shutdown_test(Config, ?FUNCTION_NAME, 1000, 5000, true, 2500),
+ ok.
+
+shutdown_close() ->
+ [{doc, "Test that peer shutdown close does not wait for dist connection"}].
+shutdown_close(Config) when is_list(Config) ->
+ _ = shutdown_test(Config, ?FUNCTION_NAME, close, 5000, true, 200),
+ ok.
+
+shutdown_test(Config, TC, Shutdown, BlockTime, StopWhileBlocked, MaxWaitTime) ->
+ Options0 = #{name => ?CT_PEER_NAME(TC),
+ shutdown => Shutdown,
+ args => ["-hidden", "-pa", filename:dirname(code:which(?MODULE)),
+ "-setcookie", atom_to_list(erlang:get_cookie())]},
+ Options = case proplists:get_value(connection, Config) of
+ undefined -> Options0;
+ Conn -> maps:put(connection, Conn, Options0)
+ end,
+ {ok, Peer, Node} = peer:start_link(Options),
+ EnsureBlockedWait = 500,
+ BlockStart = erlang:monotonic_time(millisecond),
+ erpc:cast(Node,
+ fun () ->
+ erts_debug:set_internal_state(available_internal_state, true),
+ erts_debug:set_internal_state(block, BlockTime+EnsureBlockedWait)
+ end),
+ receive after EnsureBlockedWait -> ok end, %% Ensure blocked...
+ Start = erlang:monotonic_time(millisecond),
+ peer:stop(Peer),
+ End = erlang:monotonic_time(millisecond),
+ WaitTime = End - Start,
+ BlockTimeLeft = BlockTime + EnsureBlockedWait - (Start - BlockStart),
+ Connected = lists:member(Node, nodes(connected)),
+ ct:pal("Connected = ~p~nWaitTime = ~p~nBlockTimeLeft = ~p~n",
+ [Connected, WaitTime, BlockTimeLeft]),
+ true = WaitTime =< MaxWaitTime,
+ case StopWhileBlocked of
+ true -> ok;
+ false -> true = WaitTime >= BlockTimeLeft, ok
+ end,
+ Connected.
+
+init_debug() ->
+ [{doc, "Test that debug messages in init work"}].
+
+init_debug(Config) when is_list(Config) ->
+ ct:capture_start(),
+ {ok, Peer, _Node} = peer:start_link(#{name => peer:random_name(?FUNCTION_NAME), shutdown => 1000,
+ connection => standard_io, args => ["-init_debug"]}),
+ ct:sleep(200), %% without this sleep, peer is not fast enough to print
+ peer:stop(Peer),
+ ct:capture_stop(),
+ Texts = lists:append([string:trim(Str, trailing, "\r\n") || Str <- ct:capture_get()]),
+ %% every boot script starts with this
+ Expected = "{progress,preloaded}",
+ Actual = lists:sublist(Texts, 1, length(Expected)),
+ ?assertEqual(Expected, Actual).
+
+io_redirect() ->
+ [{doc, "Tests i/o redirection working for std"}].
+
+io_redirect(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer, _Node} = peer:start_link(#{connection => Conn}),
+ ct:capture_start(),
+ peer:call(Peer, io, format, [user, "test.", []]),
+ peer:call(Peer, erlang, apply, [io, format, ["second."]]),
+ %% ensure no dist connection is set up
+ ?assertNot(lists:member(Peer, nodes()), {dist_connected, Peer, nodes()}),
+ ct:capture_stop(),
+ Texts = ct:capture_get(),
+ peer:stop(Peer),
+ ?assertEqual(["test.", "second."], Texts).
+
+multi_node() ->
+ [{doc, "Tests several nodes starting concurrently"}].
+
+multi_node(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ Peers = [
+ peer:start_link(#{name => peer:random_name(?FUNCTION_NAME),
+ wait_boot => {self(), tag}, connection => Conn})
+ || _ <- lists:seq(1, 4)],
+ Nodes = [receive {tag, {started, Node, Peer}} -> Node end || {ok, Peer} <- Peers],
+ ?assertEqual(4, length(Nodes)),
+ [?assertEqual(ok, peer:stop(Peer)) || {ok, Peer} <- Peers].
+
+duplicate_name() ->
+ [{doc, "Tests that a node with the same name fails to start"}].
+
+duplicate_name(Config) when is_list(Config) ->
+ Conn = proplists:get_value(connection, Config),
+ {ok, Peer, _Node} = peer:start_link(#{connection => Conn, name => ?FUNCTION_NAME, register => false}),
+ ?assertException(exit, _, peer:start_link(#{connection => standard_io, name => ?FUNCTION_NAME})),
+ peer:stop(Peer).
+
+%% -------------------------------------------------------------------
+%% Compatibility: old releases
+old_release() ->
+ [{doc, "Verity running with previous OTP release"}].
+
+old_release(Config) when is_list(Config) ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ %% don't expect OTP 10 to be available
+ ?assertEqual(not_available, ?CT_PEER([], "10", PrivDir)),
+ PrevRel = integer_to_list(list_to_integer(erlang:system_info(otp_release)) - 2),
+ case ?CT_PEER([], PrevRel, PrivDir) of
+ not_available ->
+ {skip, "OTP " ++ PrevRel ++ " not found"};
+ {ok, Peer, Node} ->
+ ?assertEqual(PrevRel, rpc:call(Node, erlang, system_info, [otp_release])),
+ peer:stop(Peer)
+ end.
+
+%% -------------------------------------------------------------------
+%% SSH/Docker cases
+
+ssh() ->
+ [{doc, "Tests ssh (localhost) node support"}].
+
+ssh(Config) when is_list(Config) ->
+ %% figure out path to 'erl' locally ('erl' may not be in path via SSH)
+ case {os:find_executable("erl"), os:find_executable("ssh")} of
+ {false, _} ->
+ {skip, "erl not found"};
+ {ErlPath, SshPath} ->
+ Name = peer:random_name(?FUNCTION_NAME),
+ {ok, Peer, _Node} = peer:start_link(#{exec => {SshPath, ["localhost", ErlPath]},
+ connection => standard_io, name => Name, host => "localhost"}),
+ %% TODO: how to check it really goes over SSH?
+ %% ssh-ed node is not distributed
+ ?assertEqual(list_to_atom(Name ++ "@localhost"), peer:call(Peer, erlang, node, [])),
+ peer:stop(Peer)
+ end.
+
+docker() ->
+ [{doc, "Tests starting peer node in Docker container"}, {timetrap, {seconds, 60}}].
+
+build_release(Dir) ->
+ application:load(sasl), %% otherwise application:get_key will fail
+ %% build release (tarball)
+ RelFile = filename:join(Dir, "lambda.rel"),
+ Release = {release, {"lambda", "1.0.0"}, {erts, erlang:system_info(version)},
+ [{App, begin {ok, Vsn} = application:get_key(App, vsn), Vsn end} || App <- [kernel, stdlib, sasl]]},
+ ok = file:write_file(RelFile, list_to_binary(lists:flatten(io_lib:format("~tp.", [Release])))),
+ RelFileNoExt = filename:join(Dir, "lambda"),
+ {ok, systools_make, []} = systools:make_script(RelFileNoExt, [silent, {outdir, Dir}]),
+ ok = systools:make_tar(RelFileNoExt, [{erts, code:root_dir()}]).
+
+build_image(Dir) ->
+ %% build docker image
+ BuildScript = filename:join(Dir, "Dockerfile"),
+ Dockerfile =
+ "FROM ubuntu:20.04 as runner\n"
+ "WORKDIR /opt/lambda\n"
+ "COPY lambda.tar.gz /tmp\n"
+ "RUN tar -zxvf /tmp/lambda.tar.gz -C /opt/lambda\n"
+ "ENTRYPOINT [\"/opt/lambda/erts-" ++ erlang:system_info(version) ++ "/bin/dyn_erl\", \"-boot\", \"/opt/lambda/releases/1.0.0/start\"]\n",
+ ok = file:write_file(BuildScript, Dockerfile),
+ Output = os:cmd("docker build -t lambda " ++ Dir),
+ ct:pal("Build result: ~s~n", [Output]).
+
+docker(Config) when is_list(Config) ->
+ case os:find_executable("docker") of
+ false ->
+ {skip, "Docker not found"};
+ Docker ->
+ PrivDir = proplists:get_value(priv_dir, Config),
+ build_release(PrivDir),
+ build_image(PrivDir),
+
+ {ok, Peer, Node} = peer:start_link(#{name => ?CT_PEER_NAME(),
+ exec => {Docker, ["run", "-i", "lambda"]}, connection => standard_io}),
+ ?assertEqual(Node, peer:call(Peer, erlang, node, [])),
+ peer:stop(Peer)
+ end.
diff --git a/lib/stdlib/test/pool_SUITE.erl b/lib/stdlib/test/pool_SUITE.erl
index 618d71f6c4..a097f1a17e 100644
--- a/lib/stdlib/test/pool_SUITE.erl
+++ b/lib/stdlib/test/pool_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -23,6 +23,8 @@
init_per_group/2,end_per_group/2]).
-export([basic/1, link_race/1, echo/1]).
+-include_lib("common_test/include/ct.hrl").
+
suite() -> [{ct_hooks,[{ts_install_cth,[{nodenames, 1}]}]}].
all() ->
@@ -45,7 +47,7 @@ end_per_group(_GroupName, Config) ->
basic(Config) ->
- {ok, Node, PoolNode} = init_pool(pool_SUITE_basic, basic, Config),
+ {ok, Peer, Node, PoolNode} = init_pool(?FUNCTION_NAME, basic, Config),
Node = rpc:call(Node, pool, get_node, []),
PoolNode = rpc:call(Node, pool, get_node, []),
@@ -53,19 +55,19 @@ basic(Config) ->
do_echo(Node),
do_echo(Node),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
link_race(Config) ->
- {ok, Node, PoolNode} = init_pool(pool_SUITE_basic, basic, Config),
+ {ok, Peer, Node, PoolNode} = init_pool(?FUNCTION_NAME, basic, Config),
Node = rpc:call(Node, pool, get_node, []),
PoolNode = rpc:call(Node, pool, get_node, []),
rpc:call(Node, pool, pspawn_link, [erlang, is_atom, [?MODULE]]),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
do_echo(Node) ->
@@ -79,10 +81,9 @@ echo(Parent) ->
end.
-init_pool(Proxy, Name, Config) ->
+init_pool(Case, Name, Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
- [Slave] = proplists:get_value(nodenames, Config),
- {ok, Node} = test_server:start_node(Proxy, slave, []),
+ {ok, Peer, Node} = ?CT_PEER(#{name => Case}),
{ok, Hostname} = inet:gethostname(),
file:write_file(filename:join(PrivDir,".hosts.erlang"),"'"++Hostname++"'.\n"),
ok = rpc:call(Node, file, set_cwd, [PrivDir]),
@@ -92,4 +93,4 @@ init_pool(Proxy, Name, Config) ->
Nodes = rpc:call(Node, pool, get_nodes, []),
[rpc:call(N, code, add_patha, [filename:dirname(code:which(?MODULE))]) || N <- Nodes],
- {ok, Node, PoolNode}.
+ {ok, Peer, Node, PoolNode}.
diff --git a/lib/stdlib/test/proc_lib_SUITE.erl b/lib/stdlib/test/proc_lib_SUITE.erl
index b2ad0ba28f..5db6d88a15 100644
--- a/lib/stdlib/test/proc_lib_SUITE.erl
+++ b/lib/stdlib/test/proc_lib_SUITE.erl
@@ -668,40 +668,53 @@ stop(_Config) ->
Pid3 = proc_lib:spawn(HangProc),
{'EXIT',timeout} = (catch proc_lib:stop(Pid3,normal,1000)),
+ %% Ensure that a termination message is always sent to the
+ %% target process and that it eventually terminates.
+ Pid4 = proc_lib:spawn(HangProc),
+ Ref4 = monitor(process, Pid4),
+ {'EXIT', timeout} = (catch proc_lib:stop(Pid4, normal, 0)),
+ ok = receive
+ {'DOWN', Ref4, process, _, _} ->
+ ok;
+ M -> M
+ after 6000 ->
+ timeout
+ end,
+
%% Success case with other reason than 'normal'
- Pid4 = proc_lib:spawn(SysMsgProc),
- ok = proc_lib:stop(Pid4,other_reason,infinity),
- false = erlang:is_process_alive(Pid4),
+ Pid5 = proc_lib:spawn(SysMsgProc),
+ ok = proc_lib:stop(Pid5,other_reason,infinity),
+ false = erlang:is_process_alive(Pid5),
%% System message is handled, but process dies with other reason
%% than the given (in system_terminate/4 below)
- Pid5 = proc_lib:spawn(SysMsgProc),
- {'EXIT',{{badmatch,2},_Stacktrace}} = (catch proc_lib:stop(Pid5,crash,infinity)),
- false = erlang:is_process_alive(Pid5),
+ Pid6 = proc_lib:spawn(SysMsgProc),
+ {'EXIT',{{badmatch,2},_Stacktrace}} = (catch proc_lib:stop(Pid6,crash,infinity)),
+ false = erlang:is_process_alive(Pid6),
%% Local registered name
- Pid6 = proc_lib:spawn(SysMsgProc),
- register(to_stop,Pid6),
+ Pid7 = proc_lib:spawn(SysMsgProc),
+ register(to_stop,Pid7),
ok = proc_lib:stop(to_stop),
undefined = whereis(to_stop),
- false = erlang:is_process_alive(Pid6),
+ false = erlang:is_process_alive(Pid7),
%% Remote registered name
- {ok,Node} = test_server:start_node(proc_lib_SUITE_stop,slave,[]),
+ {ok, Peer, Node} = ?CT_PEER(),
Dir = filename:dirname(code:which(?MODULE)),
rpc:call(Node,code,add_path,[Dir]),
- Pid7 = spawn(Node,SysMsgProc),
- true = rpc:call(Node,erlang,register,[to_stop,Pid7]),
- Pid7 = rpc:call(Node,erlang,whereis,[to_stop]),
+ Pid8 = spawn(Node,SysMsgProc),
+ true = rpc:call(Node,erlang,register,[to_stop,Pid8]),
+ Pid8 = rpc:call(Node,erlang,whereis,[to_stop]),
ok = proc_lib:stop({to_stop,Node}),
undefined = rpc:call(Node,erlang,whereis,[to_stop]),
- false = rpc:call(Node,erlang,is_process_alive,[Pid7]),
+ false = rpc:call(Node,erlang,is_process_alive,[Pid8]),
%% Local and remote registered name, but non-existing
{'EXIT',noproc} = (catch proc_lib:stop(to_stop)),
{'EXIT',noproc} = (catch proc_lib:stop({to_stop,Node})),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
%% Remote registered name, but non-existing node
{'EXIT',{{nodedown,Node},_}} = (catch proc_lib:stop({to_stop,Node})),
diff --git a/lib/stdlib/test/qlc_SUITE.erl b/lib/stdlib/test/qlc_SUITE.erl
index cb4e710c44..74c8aabf8e 100644
--- a/lib/stdlib/test/qlc_SUITE.erl
+++ b/lib/stdlib/test/qlc_SUITE.erl
@@ -1163,9 +1163,9 @@ append(Config) when is_list(Config) ->
evaluator(Config) when is_list(Config) ->
true = is_alive(),
evaluator_2(Config, []),
- {ok, Node} = start_node(qlc_SUITE_evaluator),
+ {ok, Peer, Node} = ?CT_PEER(),
ok = rpc:call(Node, ?MODULE, evaluator_2, [Config, [compiler]]),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
evaluator_2(Config, Apps) ->
@@ -1191,10 +1191,6 @@ evaluator_2(Config, Apps) ->
_ = file:delete(FileName),
ok.
-start_node(Name) ->
- PA = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, slave, [{args, "-pa " ++ PA}]).
-
%% string_to_handle/1,2.
string_to_handle(Config) when is_list(Config) ->
{'EXIT',{badarg,_}} = (catch qlc:string_to_handle(14)),
@@ -2636,9 +2632,9 @@ info(Config) when is_list(Config) ->
L = [{#{k => #{v => Fun}}, Fun}],
H = qlc:q([Q || Q <- L, Q =:= {#{k => #{v => Fun}}, Fun}]),
L = qlc:e(H),
- {call,_,_,[{lc,_,{var,_,'Q'},
- [{generate,_,_,_},
- {op,_,_,_,_}]}]} =
+ {call,_,{remote,_,{atom,_,ets},{atom,_,match_spec_run}},
+ [_,
+ {call,_,{remote,_,{atom,_,ets},{atom,_,match_spec_compile}},[_]}]} =
qlc:info(H, [{format,abstract_code}])">>
],
@@ -7470,10 +7466,10 @@ etsc(F, Opts, Objs) ->
V.
join_info(H) ->
- {{qlc, S, Options}, Bs} = strip_qlc_call2(H),
+ {qlc, S, Options} = strip_qlc_call(H),
%% "Hide" the call to qlc_pt from the test in run_test().
LoadedPT = code:is_loaded(qlc_pt),
- QH = qlc:string_to_handle(S, Options, Bs),
+ QH = qlc:string_to_handle(S, Options, []),
_ = [unload_pt() || false <- [LoadedPT]], % doesn't take long...
case {join_info_count(H), join_info_count(QH)} of
{N, N} ->
@@ -7483,26 +7479,22 @@ join_info(H) ->
end.
strip_qlc_call(H) ->
- {Expr, _Bs} = strip_qlc_call2(H),
- Expr.
-
-strip_qlc_call2(H) ->
S = qlc:info(H, {flat, false}),
{ok, Tokens, _EndLine} = erl_scan:string(S++".", 1, [text]),
- {ok, [Expr], Bs} = erl_eval:extended_parse_exprs(Tokens),
- {case Expr of
- {call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[LC]} ->
- {qlc, lists:flatten([erl_pp:expr(LC), "."]), []};
- {call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[LC, Opts]} ->
- {qlc, lists:flatten([erl_pp:expr(LC), "."]),
- erl_parse:normalise(Opts)};
- {call,_,{remote,_,{atom,_,ets},{atom,_,match_spec_run}},_} ->
- {match_spec, Expr};
- {call,_,{remote,_,{atom,_,M},{atom,_,table}},_} ->
- {table, M, Expr};
- _ ->
- []
- end, Bs}.
+ {ok, [Expr]} = erl_eval:extended_parse_exprs(Tokens),
+ case Expr of
+ {call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[LC]} ->
+ {qlc, lists:flatten([erl_pp:expr(LC), "."]), []};
+ {call,_,{remote,_,{atom,_,qlc},{atom,_,q}},[LC, Opts]} ->
+ {qlc, lists:flatten([erl_pp:expr(LC), "."]),
+ erl_parse:normalise(Opts)};
+ {call,_,{remote,_,{atom,_,ets},{atom,_,match_spec_run}},_} ->
+ {match_spec, Expr};
+ {call,_,{remote,_,{atom,_,M},{atom,_,table}},_} ->
+ {table, M, Expr};
+ _ ->
+ []
+ end.
-record(ji, {nmerge = 0, nlookup = 0, nnested_loop = 0, nkeysort = 0}).
@@ -7510,7 +7502,7 @@ strip_qlc_call2(H) ->
join_info_count(H) ->
S = qlc:info(H, {flat, false}),
{ok, Tokens, _EndLine} = erl_scan:string(S++".", 1, [text]),
- {ok, [Expr], _Bs} = erl_eval:extended_parse_exprs(Tokens),
+ {ok, [Expr]} = erl_eval:extended_parse_exprs(Tokens),
#ji{nmerge = Nmerge, nlookup = Nlookup,
nkeysort = NKeysort, nnested_loop = Nnested_loop} =
ji(Expr, #ji{}),
@@ -7554,7 +7546,7 @@ lookup_keys({generate,_,Q}, L) ->
lookup_keys(Q, L);
lookup_keys({table,Chars}, L) when is_list(Chars) ->
{ok, Tokens, _} = erl_scan:string(lists:flatten(Chars++"."), 1, [text]),
- {ok, [Expr], _Bs} = erl_eval:extended_parse_exprs(Tokens),
+ {ok, [Expr]} = erl_eval:extended_parse_exprs(Tokens),
case Expr of
{call,_,_,[_fun,AKs]} ->
case erl_parse:normalise(AKs) of
diff --git a/lib/stdlib/test/rand_SUITE.erl b/lib/stdlib/test/rand_SUITE.erl
index 207cff00e5..ff0ad72d99 100644
--- a/lib/stdlib/test/rand_SUITE.erl
+++ b/lib/stdlib/test/rand_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -350,21 +350,35 @@ gen(_, _, _, Acc) -> lists:reverse(Acc).
basic_stats_uniform_1(Config) when is_list(Config) ->
ct:timetrap({minutes,15}), %% valgrind needs a lot of time
- [basic_uniform_1(?LOOP, rand:seed_s(Alg), 0.0, array:new([{default, 0}]))
- || Alg <- [default|algs()]],
+ Result =
+ lists:filter(
+ fun (R) -> R =/= [] end,
+ [basic_uniform_1(Alg, ?LOOP, 100)
+ || Alg <- [default|algs()]]),
+ Result =:= [] orelse
+ ct:fail(Result),
ok.
basic_stats_uniform_2(Config) when is_list(Config) ->
ct:timetrap({minutes,15}), %% valgrind needs a lot of time
- [basic_uniform_2(?LOOP, rand:seed_s(Alg), 0, array:new([{default, 0}]))
- || Alg <- [default|algs()]],
+ Result =
+ lists:filter(
+ fun (R) -> R =/= [] end,
+ [basic_uniform_2(Alg, ?LOOP, 100)
+ || Alg <- [default|algs()]]),
+ Result =:= [] orelse
+ ct:fail(Result),
ok.
basic_stats_bytes(Config) when is_list(Config) ->
ct:timetrap({minutes,15}), %% valgrind needs a lot of time
- [basic_bytes(
- ?LOOP div 100, rand:seed_s(Alg), 0, array:new(256, [{default, 0}]))
- || Alg <- [default|algs()]],
+ Result =
+ lists:filter(
+ fun (R) -> R =/= [] end,
+ [basic_bytes(Alg, ?LOOP div 100, 113)
+ || Alg <- [default|algs()]]),
+ Result =:= [] orelse
+ ct:fail(Result),
ok.
basic_stats_standard_normal(Config) when is_list(Config) ->
@@ -372,9 +386,14 @@ basic_stats_standard_normal(Config) when is_list(Config) ->
io:format("Testing standard normal~n",[]),
IntendedMean = 0,
IntendedVariance = 1,
- [basic_normal_1(?LOOP, IntendedMean, IntendedVariance,
- rand:seed_s(Alg), 0, 0)
- || Alg <- [default|algs()]],
+ Result =
+ lists:filter(
+ fun (R) -> R =/= [] end,
+ [basic_normal_1(?LOOP, IntendedMean, IntendedVariance,
+ rand:seed_s(Alg), 0, 0)
+ || Alg <- [default|algs()]]),
+ Result =:= [] orelse
+ ct:fail(Result),
ok.
basic_stats_normal(Config) when is_list(Config) ->
@@ -385,20 +404,32 @@ basic_stats_normal(Config) when is_list(Config) ->
[{Mean, Variance} || Mean <- IntendedMeans,
Variance <- IntendedVariances],
- ct:timetrap({minutes, 6 * length(IntendedMeanVariancePairs)}), %% valgrind needs a lot of time
- lists:foreach(
- fun ({IntendedMean, IntendedVariance}) ->
- ct:pal(
- "Testing normal(~.2f, ~.2f)~n",
- [float(IntendedMean), float(IntendedVariance)]),
- [basic_normal_1(?LOOP, IntendedMean, IntendedVariance,
- rand:seed_s(Alg), 0, 0)
- || Alg <- [default|algs()]]
- end,
- IntendedMeanVariancePairs).
-
-
-basic_uniform_1(N, S0, Sum, A0) when N > 0 ->
+ %% valgrind needs a lot of time
+ ct:timetrap({minutes, 6 * length(IntendedMeanVariancePairs)}),
+ Result =
+ lists:filter(
+ fun (R) -> R =/= [] end,
+ [begin
+ ct:pal(
+ "Testing normal(~.2f, ~.2f)~n",
+ [float(IntendedMean), float(IntendedVariance)]),
+ lists:filter(
+ fun (R) -> R =/= [] end,
+ [basic_normal_1(?LOOP, IntendedMean, IntendedVariance,
+ rand:seed_s(Alg), 0, 0)
+ || Alg <- [default|algs()]])
+ end || {IntendedMean, IntendedVariance}
+ <- IntendedMeanVariancePairs]),
+ Result =:= [] orelse
+ ct:fail(Result),
+ ok.
+
+basic_uniform_1(Alg, Loop, Buckets) ->
+ basic_uniform_1(
+ 0, Loop, Buckets, rand:seed_s(Alg), 0.0,
+ array:new(Buckets, [{default, 0}])).
+%%
+basic_uniform_1(N, Loop, Buckets, S0, Sum, A0) when N < Loop ->
{X,S} =
case N band 1 of
0 ->
@@ -406,45 +437,41 @@ basic_uniform_1(N, S0, Sum, A0) when N > 0 ->
1 ->
rand:uniform_real_s(S0)
end,
- I = trunc(X*100),
+ I = trunc(X*Buckets),
A = array:set(I, 1+array:get(I,A0), A0),
- basic_uniform_1(N-1, S, Sum+X, A);
-basic_uniform_1(0, {#{type:=Alg}, _}, Sum, A) ->
- Loop = ?LOOP,
+ basic_uniform_1(N+1, Loop, Buckets, S, Sum+X, A);
+basic_uniform_1(_N, Loop, Buckets, {#{type:=Alg}, _}, Sum, A) ->
AverExp = 1.0 / 2,
- Buckets = 100,
Counters = array:to_list(A),
- Min = lists:min(Counters),
- Max = lists:max(Counters),
- basic_verify(Alg, Loop, Sum, AverExp, Buckets, Min, Max).
+ basic_verify(Alg, Loop, Sum, AverExp, Buckets, Counters).
-basic_uniform_2(N, S0, Sum, A0) when N > 0 ->
- {X,S} = rand:uniform_s(100, S0),
+basic_uniform_2(Alg, Loop, Buckets) ->
+ basic_uniform_2(
+ 0, Loop, Buckets, rand:seed_s(Alg), 0,
+ array:new(Buckets, [ {default, 0}])).
+%%
+basic_uniform_2(N, Loop, Buckets, S0, Sum, A0) when N < Loop ->
+ {X,S} = rand:uniform_s(Buckets, S0),
A = array:set(X-1, 1+array:get(X-1,A0), A0),
- basic_uniform_2(N-1, S, Sum+X, A);
-basic_uniform_2(0, {#{type:=Alg}, _}, Sum, A) ->
- Loop = ?LOOP,
- AverExp = ((100 - 1) / 2) + 1,
- Buckets = 100,
+ basic_uniform_2(N+1, Loop, Buckets, S, Sum+X, A);
+basic_uniform_2(_N, Loop, Buckets, {#{type:=Alg}, _}, Sum, A) ->
+ AverExp = ((Buckets - 1) / 2) + 1,
Counters = tl(array:to_list(A)),
- Min = lists:min(Counters),
- Max = lists:max(Counters),
- basic_verify(Alg, Loop, Sum, AverExp, Buckets, Min, Max).
-
-basic_bytes(N, S0, Sum0, A0) when N > 0 ->
- ByteSize = 100,
- {Bin,S} = rand:bytes_s(ByteSize, S0),
+ basic_verify(Alg, Loop, Sum, AverExp, Buckets, Counters).
+
+basic_bytes(Alg, Loop, BytesSize) ->
+ basic_bytes(
+ 0, Loop, BytesSize, rand:seed_s(Alg), 0,
+ array:new(256, [{default, 0}])).
+basic_bytes(N, Loop, BytesSize, S0, Sum0, A0) when N < Loop ->
+ {Bin,S} = rand:bytes_s(BytesSize, S0),
{Sum,A} = basic_bytes_incr(Bin, Sum0, A0),
- basic_bytes(N-1, S, Sum, A);
-basic_bytes(0, {#{type:=Alg}, _}, Sum, A) ->
- ByteSize = 100,
- Loop = (?LOOP * ByteSize) div 100,
+ basic_bytes(N+1, Loop, BytesSize, S, Sum, A);
+basic_bytes(_N, Loop, BytesSize, {#{type:=Alg}, _}, Sum, A) ->
Buckets = 256,
AverExp = (Buckets - 1) / 2,
Counters = array:to_list(A),
- Min = lists:min(Counters),
- Max = lists:max(Counters),
- basic_verify(Alg, Loop, Sum, AverExp, Buckets, Min, Max).
+ basic_verify(Alg, Loop * BytesSize, Sum, AverExp, Buckets, Counters).
basic_bytes_incr(Bin, Sum, A) ->
basic_bytes_incr(Bin, Sum, A, 0).
@@ -458,7 +485,7 @@ basic_bytes_incr(Bin, Sum, A, N) ->
{Sum,A}
end.
-basic_verify(Alg, Loop, Sum, AverExp, Buckets, Min, Max) ->
+basic_verify(Alg, Loop, Sum, AverExp, Buckets, Counters) ->
AverDiff = AverExp * 0.01,
Aver = Sum / Loop,
io:format(
@@ -467,19 +494,39 @@ basic_verify(Alg, Loop, Sum, AverExp, Buckets, Min, Max) ->
%%
CountExp = Loop / Buckets,
CountDiff = CountExp * 0.1,
+ {MinBucket, Min} = lists_where(fun erlang:min/2, Counters),
+ {MaxBucket, Max} = lists_where(fun erlang:max/2, Counters),
io:format(
"~.12w: Expected Count: ~p, Allowed Diff: ~p, Min: ~p, Max: ~p~n",
[Alg, CountExp, CountDiff, Min, Max]),
%%
%% Verify that the basic statistics are ok
- %% be gentle we don't want to see to many failing tests
- abs(Aver - AverExp) < AverDiff orelse
- ct:fail({average, Alg, Aver, AverExp, AverDiff}),
- abs(Min - CountExp) < CountDiff orelse
- ct:fail({min, Alg, Min, CountExp, CountDiff}),
- abs(Max - CountExp) < CountDiff orelse
- ct:fail({max, Alg, Max, CountExp, CountDiff}),
- ok.
+ %% be gentle - we don't want to see to many failing tests
+ if
+ abs(Aver - AverExp) < AverDiff -> [];
+ true -> [{average, Alg, Aver, AverExp, AverDiff}]
+ end ++
+ if
+ abs(Min - CountExp) < CountDiff -> [];
+ true -> [{min, Alg, {MinBucket,Min}, CountExp, CountDiff}]
+ end ++
+ if
+ abs(Max - CountExp) < CountDiff -> [];
+ true -> [{max, Alg, {MaxBucket,Max}, CountExp, CountDiff}]
+ end.
+
+lists_where(Fun, [X | L]) ->
+ lists_where(Fun, L, 2, 1, X).
+%%
+lists_where(_Fun, [], _N, Where, What) ->
+ {Where, What};
+lists_where(Fun, [X | L], N, Where, What) ->
+ case Fun(X, What) of
+ What ->
+ lists_where(Fun, L, N+1, Where, What);
+ X ->
+ lists_where(Fun, L, N+1, N, X)
+ end.
basic_normal_1(N, IntendedMean, IntendedVariance, S0, StandardSum, StandardSq) when N > 0 ->
@@ -491,7 +538,7 @@ basic_normal_1(N, IntendedMean, IntendedVariance, S0, StandardSum, StandardSq) w
StandardX = (X - IntendedMean) / math:sqrt(IntendedVariance),
basic_normal_1(N-1, IntendedMean, IntendedVariance, S,
StandardX+StandardSum, StandardX*StandardX+StandardSq);
-basic_normal_1(0, _IntendedMean, _IntendedVariance, {#{type:=Alg}, _}, StandardSum, StandardSumSq) ->
+basic_normal_1(0, IntendedMean, IntendedVariance, {#{type:=Alg}, _}, StandardSum, StandardSumSq) ->
StandardMean = StandardSum / ?LOOP,
StandardVariance = (StandardSumSq - (StandardSum*StandardSum/?LOOP))/(?LOOP - 1),
StandardStdDev = math:sqrt(StandardVariance),
@@ -500,9 +547,16 @@ basic_normal_1(0, _IntendedMean, _IntendedVariance, {#{type:=Alg}, _}, StandardS
%%
%% Verify that the basic statistics are ok
%% be gentle we don't want to see to many failing tests
- abs(StandardMean) < 0.005 orelse ct:fail({average, Alg, StandardMean}),
- abs(StandardStdDev - 1.0) < 0.005 orelse ct:fail({stddev, Alg, StandardStdDev}),
- ok.
+ if
+ abs(StandardMean) < 0.005 -> [];
+ true ->
+ [{average, Alg, StandardMean, IntendedMean, IntendedVariance}]
+ end ++
+ if
+ abs(StandardStdDev - 1.0) < 0.005 -> [];
+ true ->
+ [{stddev, Alg, StandardStdDev, IntendedMean, IntendedVariance}]
+ end.
normal_s(Mean, Variance, State0) when Mean == 0, Variance == 1 ->
% Make sure we're also testing the standard normal interface
@@ -1024,7 +1078,7 @@ do_measure(_Config) ->
Algs),
%%
ct:pal("~nRNG uniform integer full range performance~n",[]),
- _ =
+ [TMarkUniformFullRange|_] =
measure_1(
fun (State) -> half_range(State) bsl 1 end,
fun (State, Range, Mod) ->
@@ -1036,7 +1090,30 @@ do_measure(_Config) ->
end,
State)
end,
- Algs),
+ Algs ++ [dummy]),
+ _ =
+ measure_1(
+ fun (_) -> 0 end,
+ fun (State, _, _) ->
+ measure_loop(
+ fun (State0) -> State0 end,
+ State)
+ end,
+ benchmark_dummy, TMarkUniformFullRange),
+ _ =
+ measure_1(
+ fun (State) -> half_range(State) bsl 1 end,
+ fun (State, Range, Mod) ->
+ measure_loop(
+ fun (St) ->
+ case Mod:uniform(Range) of
+ X when is_integer(X), 1 =< X, X =< Range ->
+ St
+ end
+ end,
+ State)
+ end,
+ procdict, TMarkUniformFullRange),
%%
ct:pal("~nRNG uniform integer full range + 1 performance~n",[]),
_ =
@@ -1222,6 +1299,10 @@ measure_1(RangeFun, Fun, Alg, TMark) ->
{?MODULE, ignored_state};
crypto_bytes_cached ->
{?MODULE, <<>>};
+ benchmark_dummy ->
+ {?MODULE, ignored_state};
+ procdict ->
+ {rand, rand:seed(default)};
_ ->
{rand, rand:seed_s(Alg)}
end,
diff --git a/lib/stdlib/test/re_SUITE.erl b/lib/stdlib/test/re_SUITE.erl
index 1c9919c8de..09a65d8fdd 100644
--- a/lib/stdlib/test/re_SUITE.erl
+++ b/lib/stdlib/test/re_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -162,7 +162,7 @@ run_options(Config) when is_list(Config) ->
{match,["ABCabcdABC","abcd"]} = re:run("ABCabcdABC",MP,[{capture,all,list}]),
{match,[<<"ABCabcdABC">>,<<"abcd">>]} = re:run("ABCabcdABC",MP,[{capture,all,binary}]),
{match,[{0,10}]} = re:run("ABCabcdABC",MP,[{capture,first}]),
- {match,[{0,10}]} = re:run("ABCabcdABC",MP,[{capture,first,index}]), ?line {match,["ABCabcdABC"]} = re:run("ABCabcdABC",MP,[{capture,first,list}]),
+ {match,[{0,10}]} = re:run("ABCabcdABC",MP,[{capture,first,index}]), {match,["ABCabcdABC"]} = re:run("ABCabcdABC",MP,[{capture,first,list}]),
{match,[<<"ABCabcdABC">>]} = re:run("ABCabcdABC",MP,[{capture,first,binary}]),
{match,[{3,4}]} = re:run("ABCabcdABC",MP,[{capture,all_but_first}]),
diff --git a/lib/stdlib/test/shell_SUITE.erl b/lib/stdlib/test/shell_SUITE.erl
index 25ea6d02f1..b38dee47e7 100644
--- a/lib/stdlib/test/shell_SUITE.erl
+++ b/lib/stdlib/test/shell_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -190,16 +190,15 @@ ok.
%% Check restricted shell when started from the command line.
start_restricted_on_command_line(Config) when is_list(Config) ->
- {ok,Node} = start_node(shell_suite_helper_1,
- "-pa "++proplists:get_value(priv_dir,Config)++
- " -stdlib restricted_shell foo"),
+ {ok, Peer, Node} = ?CT_PEER(["-pa", proplists:get_value(priv_dir,Config),
+ "-stdlib", "restricted_shell", "foo"]),
"Warning! Restricted shell module foo not found: nofile"++_ =
t({Node, <<"begin m() end.">>}),
"exception exit: restricted shell does not allow m()" =
comm_err({Node, <<"begin m() end.">>}),
[ok] =
(catch scan({Node, <<"begin q() end.">>})),
- test_server:stop_node(Node),
+ peer:stop(Peer),
Test = filename:join(proplists:get_value(priv_dir, Config),
"test_restricted2.erl"),
Contents = <<"-module(test_restricted2).
@@ -217,9 +216,8 @@ start_restricted_on_command_line(Config) when is_list(Config) ->
{false,State}.
">>,
ok = compile_file(Config, Test, Contents, []),
- {ok,Node2} = start_node(shell_suite_helper_2,
- "-pa "++proplists:get_value(priv_dir,Config)++
- " -stdlib restricted_shell test_restricted2"),
+ {ok, Peer2, Node2} = ?CT_PEER(["-pa", proplists:get_value(priv_dir,Config),
+ "-stdlib", "restricted_shell", "test_restricted2"]),
"Module" ++ _ = t({Node2,<<"begin m() end.">>, utf8}),
"exception exit: restricted shell does not allow c(foo)" =
comm_err({Node2,<<"begin c(foo) end.">>}),
@@ -235,7 +233,7 @@ start_restricted_on_command_line(Config) when is_list(Config) ->
comm_err({Node2,<<"begin shell:stop_restricted() end.">>}),
[ok] =
scan({Node2, <<"begin q() end.">>}),
- test_server:stop_node(Node2),
+ peer:stop(Peer2),
ok.
%% Tests calling local shell functions with spectacular arguments in
@@ -258,6 +256,8 @@ restricted_local(Config) when is_list(Config) ->
local_allowed(_,_,State) ->
{false,State}.
+ non_local_allowed({erlang,raise},[error, _, _],State) ->
+ {true,State};
non_local_allowed({shell,stop_restricted},[],State) ->
{true,State};
non_local_allowed(_,_,State) ->
@@ -590,11 +590,11 @@ otp_5327(Config) when is_list(Config) ->
default,default}]}),
[<<"abc">>] = scan(<<"<<(<<\"abc\">>):3/binary>>.">>),
[<<"abc">>] = scan(<<"<<(<<\"abc\">>)/binary>>.">>),
- "exception error: bad argument" =
+ "exception error: construction of binary failed" =
comm_err(<<"<<(<<\"abc\">>):4/binary>>.">>),
true = byte_size(hd(scan("<<3.14:64/float>>."))) =:= 8,
true = byte_size(hd(scan("<<3.14:32/float>>."))) =:= 4,
- "exception error: bad argument" =
+ "exception error: construction of binary failed" =
comm_err(<<"<<3.14:128/float>>.">>),
"exception error: bad argument" =
comm_err(<<"<<10:default>>.">>),
@@ -661,15 +661,11 @@ otp_5435(Config) when is_list(Config) ->
true = <<103133.0:64/float>> =:=
evaluate(<<"<<103133.0:64/float>> = <<103133:64/float>>.">>, []),
true = is_alive(),
- {ok, Node} = start_node(shell_SUITE_otp_5435),
+ {ok, Peer, Node} = ?CT_PEER(),
ok = rpc:call(Node, ?MODULE, otp_5435_2, []),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
-start_node(Name) ->
- PA = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, slave, [{args, "-pa " ++ PA}]).
-
otp_5435_2() ->
true = code:del_path(compiler),
%% Make sure record evaluation is not dependent on the compiler
@@ -701,7 +697,7 @@ otp_5195(Config) when is_list(Config) ->
{'EXIT',{undef,_}} = (catch evaluate(Ugly, [])),
V_1 = <<"qlc:e(qlc:q([X || X <- qlc:append([[1,2,3],v(-1)])])).">>,
- "- 1: command not found" = comm_err(V_1),
+ "-1: command not found" = comm_err(V_1),
{'EXIT', {undef,_}} = (catch evaluate(V_1, [])),
"1\n2\n3\n3.\n" =
@@ -2750,9 +2746,8 @@ prompt_err(B) ->
%% OTP-10302. Unicode. Also OTP-14285, Unicode atoms.
otp_10302(Config) when is_list(Config) ->
- {ok,Node} = start_node(shell_suite_helper_2,
- "-pa "++proplists:get_value(priv_dir,Config)++
- " +pc unicode"),
+ {ok, Peer, Node} = ?CT_PEER(["-pa", proplists:get_value(priv_dir,Config),
+ "+pc", "unicode"]),
Test1 =
<<"begin
io:setopts([{encoding,utf8}]),
@@ -2902,7 +2897,7 @@ otp_10302(Config) when is_list(Config) ->
"ok.\n** exception error: undefined function "
"shell_SUITE:'\x{447}\x{435}'/0.\n" =
t({Node,Test17}),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
otp_13719(Config) when is_list(Config) ->
@@ -2919,9 +2914,8 @@ otp_13719(Config) when is_list(Config) ->
ok.
otp_14285(Config) ->
- {ok,Node} = start_node(shell_suite_helper_4,
- "-pa "++proplists:get_value(priv_dir,Config)++
- " +pc unicode"),
+ {ok, Peer, Node} = ?CT_PEER(["-pa", proplists:get_value(priv_dir,Config),
+ "+pc", "unicode"]),
Test1 =
<<"begin
io:setopts([{encoding,utf8}]),
@@ -2931,7 +2925,7 @@ otp_14285(Config) ->
end.">>,
"-record('\x{400}',{'\x{400}' = '\x{400}'}).\nok.\n" =
t({Node,Test1}),
- test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
otp_14296(Config) when is_list(Config) ->
@@ -3233,11 +3227,6 @@ filename(Name, Config) when is_atom(Name) ->
filename(Name, Config) ->
filename:join(proplists:get_value(priv_dir, Config), Name).
-start_node(Name, Xargs) ->
- N = test_server:start_node(Name, slave, [{args, " " ++ Xargs}]),
- global:sync(),
- N.
-
purge_and_delete(Module) ->
(catch code:purge(Module)),
(catch code:delete(Module)).
diff --git a/lib/stdlib/test/shell_docs_SUITE.erl b/lib/stdlib/test/shell_docs_SUITE.erl
index ba0f256df9..028e2c0aba 100644
--- a/lib/stdlib/test/shell_docs_SUITE.erl
+++ b/lib/stdlib/test/shell_docs_SUITE.erl
@@ -70,7 +70,7 @@ end_per_group(_GroupName, Config) ->
%% tested.
%%
%% Currently the modules are:
--define(RENDER_MODULES, [sofs, re, file, erlang]).
+-define(RENDER_MODULES, [sofs, re, file, erlang, user_drv, ?MODULE]).
%% If you need to update the definition because this
%% testcase fails, just run update_render/0,1.
render(Config) ->
@@ -88,7 +88,12 @@ render(Config) ->
{ok, Original} ->
ct:log("Original: ~n~ts",[Original]),
ct:log("Current : ~n~ts",[Current]),
- ct:fail(output_changed)
+ ct:fail(output_changed);
+ {error, enoent} ->
+ %% All modules are not available on all
+ %% platforms. For instance socket is not
+ %% available on windows.
+ ok
end
end, render_module(Module, D))
end, ?RENDER_MODULES).
@@ -108,7 +113,9 @@ update_render(DataDir) ->
maps:map(
fun(FName, Output) ->
ok = file:write_file(filename:join(DataDir, FName), Output)
- end, render_module(Module, D))
+ end, render_module(Module, D));
+ E ->
+ io:format("Error processing: ~p ~p",[Module, E])
end
end, ?RENDER_MODULES).
@@ -275,8 +282,8 @@ render_all(Dir) ->
docsmap(fun(Mod, D) ->
maps:map(
fun(FName, Value) ->
- file:write_file(filename:join(Dir, FName), Value) end,
- render_module(Mod, D))
+ file:write_file(filename:join(Dir, FName), Value)
+ end, render_module(Mod, D))
end).
render_module(Mod, #docs_v1{ docs = Docs } = D) ->
@@ -315,7 +322,11 @@ render_module(Mod, #docs_v1{ docs = Docs } = D) ->
end, Files, Docs).
sanitize(FName) ->
- re:replace(FName,"[/:]","_",[global,{return,list}]).
+ lists:foldl(
+ fun({Re,Replace}, Txt) ->
+ re:replace(Txt,Re,Replace,[global,{return,list}])
+ end, FName, [{"/","slash"},{":","colon"},
+ {"\\*","star"},{"<","lt"},{">","gt"},{"=","eq"}]).
docsmap(Fun) ->
lists:map(
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1
index 71704fff5a..72d7f5f4ef 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1
+++ b/lib/stdlib/test/shell_docs_SUITE_data/erlang.docs_v1
@@ -1 +1 @@
-{docs_v1,[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<66,121,32,99,111,110,118,101,110,116,105,111,110,44,32,109,111,115,116,32,66,117,105,108,116,45,73,110,32,70,117,110,99,116,105,111,110,115,32,40,66,73,70,115,41,32,97,114,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,46,32,83,111,109,101,32,111,102,32,116,104,101,32,66,73,70,115,32,97,114,101,32,118,105,101,119,101,100,32,109,111,114,101,32,111,114,32,108,101,115,115,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,32,97,110,100,32,97,114,101,32>>,{em,[],[<<97,117,116,111,45,105,109,112,111,114,116,101,100>>]},<<46,32,84,104,117,115,44,32,105,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,97,108,108,115,32>>,{code,[],[<<97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,108,97,110,103,58,97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41>>]},<<32,97,114,101,32,105,100,101,110,116,105,99,97,108,46>>]},{p,[],[<<65,117,116,111,45,105,109,112,111,114,116,101,100,32,66,73,70,115,32,97,114,101,32,108,105,115,116,101,100,32,119,105,116,104,111,117,116,32,109,111,100,117,108,101,32,112,114,101,102,105,120,46,32,66,73,70,115,32,108,105,115,116,101,100,32,119,105,116,104,32,109,111,100,117,108,101,32,112,114,101,102,105,120,32,97,114,101,32,110,111,116,32,97,117,116,111,45,105,109,112,111,114,116,101,100,46>>]},{p,[],[<<66,73,70,115,32,99,97,110,32,102,97,105,108,32,102,111,114,32,118,97,114,105,111,117,115,32,114,101,97,115,111,110,115,46,32,65,108,108,32,66,73,70,115,32,102,97,105,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,121,32,97,114,101,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,115,32,111,102,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,46,32,84,104,101,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,101,97,99,104,32,105,110,100,105,118,105,100,117,97,108,32,66,73,70,46>>]},{p,[],[<<83,111,109,101,32,66,73,70,115,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,32,97,110,100,32,97,114,101,32,109,97,114,107,101,100,32,119,105,116,104,32,34,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,34,46>>]}]},#{name => <<101,114,108,97,110,103>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,101,114,108,97,110,103,46,120,109,108],types => #{{time_unit,0} => {attribute,93,type,{time_unit,{type,94,union,[{type,94,pos_integer,[]},{atom,95,second},{atom,96,millisecond},{atom,97,microsecond},{atom,98,nanosecond},{atom,99,native},{atom,100,perf_counter},{user_type,101,deprecated_time_unit,[]}]},[]}},{prepared_code,0} => {attribute,110,opaque,{prepared_code,{type,110,reference,[]},[]}},{nif_resource,0} => {attribute,113,opaque,{nif_resource,{type,113,reference,[]},[]}},{system_monitor_option,0} => {attribute,274,type,{system_monitor_option,{type,275,union,[{atom,275,busy_port},{atom,276,busy_dist_port},{type,277,tuple,[{atom,277,long_gc},{type,277,non_neg_integer,[]}]},{type,278,tuple,[{atom,278,long_schedule},{type,278,non_neg_integer,[]}]},{type,279,tuple,[{atom,279,large_heap},{type,279,non_neg_integer,[]}]}]},[]}},{module_info_key,0} => {attribute,2123,type,{module_info_key,{type,2123,union,[{atom,2123,attributes},{atom,2123,compile},{atom,2123,exports},{atom,2123,functions},{atom,2123,md5},{atom,2124,module},{atom,2124,native},{atom,2124,native_addresses},{atom,2124,nifs}]},[]}},{trace_info_flag,0} => {attribute,327,type,{trace_info_flag,{type,328,union,[{atom,328,send},{atom,329,'receive'},{atom,330,set_on_spawn},{atom,331,call},{atom,332,return_to},{atom,333,procs},{atom,334,set_on_first_spawn},{atom,335,set_on_link},{atom,336,running},{atom,337,garbage_collection},{atom,338,timestamp},{atom,339,monotonic_timestamp},{atom,340,strict_monotonic_timestamp},{atom,341,arity}]},[]}},{ext_iovec,0} => {attribute,88,type,{ext_iovec,{user_type,88,iovec,[]},[]}},{trace_match_spec,0} => {attribute,2702,type,{trace_match_spec,{type,2703,list,[{type,2703,tuple,[{type,2703,union,[{type,2703,list,[{type,2703,term,[]}]},{atom,2703,'_'},{user_type,2703,match_variable,[]}]},{type,2703,list,[{type,2703,term,[]}]},{type,2703,list,[{type,2703,term,[]}]}]}]},[]}},{max_heap_size,0} => {attribute,2981,type,{max_heap_size,{ann_type,2982,[{var,2982,'Size'},{type,2982,union,[{type,2982,non_neg_integer,[]},{type,2984,map,[{type,2984,map_field_assoc,[{atom,2984,size},{type,2984,non_neg_integer,[]}]},{type,2985,map_field_assoc,[{atom,2985,kill},{type,2985,boolean,[]}]},{type,2986,map_field_assoc,[{atom,2986,error_logger},{type,2986,boolean,[]}]}]}]}]},[]}},{fun_info_item,0} => {attribute,247,type,{fun_info_item,{type,248,union,[{atom,248,arity},{atom,249,env},{atom,250,index},{atom,251,name},{atom,252,module},{atom,253,new_index},{atom,254,new_uniq},{atom,255,pid},{atom,256,type},{atom,257,uniq}]},[]}},{stack_item,0} => {attribute,2472,type,{stack_item,{type,2473,tuple,[{ann_type,2473,[{var,2473,'Module'},{type,2473,module,[]}]},{ann_type,2474,[{var,2474,'Function'},{type,2474,atom,[]}]},{ann_type,2475,[{var,2475,'Arity'},{type,2475,union,[{type,2475,arity,[]},{ann_type,2475,[{var,2475,'Args'},{type,2475,list,[{type,2475,term,[]}]}]}]}]},{ann_type,2476,[{var,2476,'Location'},{type,2476,list,[{type,2476,union,[{type,2476,tuple,[{atom,2476,file},{ann_type,2476,[{var,2476,'Filename'},{type,2476,string,[]}]}]},{type,2477,tuple,[{atom,2477,line},{ann_type,2477,[{var,2477,'Line'},{type,2477,pos_integer,[]}]}]}]}]}]}]},[]}},{monitor_option,0} => {attribute,1397,type,{monitor_option,{type,1397,union,[{type,1397,tuple,[{atom,1397,alias},{type,1397,union,[{atom,1397,explicit_unalias},{atom,1397,demonitor},{atom,1397,reply_demonitor}]}]},{type,1398,tuple,[{atom,1398,tag},{type,1398,term,[]}]}]},[]}},{trace_flag,0} => {attribute,291,type,{trace_flag,{type,292,union,[{atom,292,all},{atom,293,send},{atom,294,'receive'},{atom,295,procs},{atom,296,ports},{atom,297,call},{atom,298,arity},{atom,299,return_to},{atom,300,silent},{atom,301,running},{atom,302,exiting},{atom,303,running_procs},{atom,304,running_ports},{atom,305,garbage_collection},{atom,306,timestamp},{atom,307,cpu_timestamp},{atom,308,monotonic_timestamp},{atom,309,strict_monotonic_timestamp},{atom,310,set_on_spawn},{atom,311,set_on_first_spawn},{atom,312,set_on_link},{atom,313,set_on_first_link},{type,314,tuple,[{atom,314,tracer},{type,314,union,[{type,314,pid,[]},{type,314,port,[]}]}]},{type,315,tuple,[{atom,315,tracer},{type,315,module,[]},{type,315,term,[]}]}]},[]}},{sub_level,0} => {attribute,2760,type,{sub_level,{type,2760,union,[{type,2760,list,[{ann_type,2760,[{var,2760,'LevelEntry'},{user_type,2760,level_entry,[]}]}]},{ann_type,2761,[{var,2761,'LogicalCpuId'},{type,2761,tuple,[{atom,2761,logical},{type,2761,non_neg_integer,[]}]}]}]},[]}},{monitor_port_identifier,0} => {attribute,1396,type,{monitor_port_identifier,{type,1396,union,[{type,1396,port,[]},{user_type,1396,registered_name,[]}]},[]}},{iovec,0} => {attribute,119,type,{iovec,{type,119,list,[{type,119,binary,[]}]},[]}},{ext_binary,0} => {attribute,87,type,{ext_binary,{type,87,binary,[]},[]}},{registered_process_identifier,0} => {attribute,1394,type,{registered_process_identifier,{type,1394,union,[{user_type,1394,registered_name,[]},{type,1394,tuple,[{user_type,1394,registered_name,[]},{type,1394,node,[]}]}]},[]}},{process_info_result_item,0} => {attribute,2425,type,{process_info_result_item,{type,2426,union,[{type,2426,tuple,[{atom,2426,backtrace},{ann_type,2426,[{var,2426,'Bin'},{type,2426,binary,[]}]}]},{type,2427,tuple,[{atom,2427,binary},{ann_type,2427,[{var,2427,'BinInfo'},{type,2427,list,[{type,2427,tuple,[{type,2427,non_neg_integer,[]},{type,2428,non_neg_integer,[]},{type,2429,non_neg_integer,[]}]}]}]}]},{type,2430,tuple,[{atom,2430,catchlevel},{ann_type,2430,[{var,2430,'CatchLevel'},{type,2430,non_neg_integer,[]}]}]},{type,2431,tuple,[{atom,2431,current_function},{type,2432,union,[{type,2432,tuple,[{ann_type,2432,[{var,2432,'Module'},{type,2432,module,[]}]},{ann_type,2432,[{var,2432,'Function'},{type,2432,atom,[]}]},{ann_type,2432,[{var,2432,'Arity'},{type,2432,arity,[]}]}]},{atom,2432,undefined}]}]},{type,2433,tuple,[{atom,2433,current_location},{type,2434,tuple,[{ann_type,2434,[{var,2434,'Module'},{type,2434,module,[]}]},{ann_type,2434,[{var,2434,'Function'},{type,2434,atom,[]}]},{ann_type,2434,[{var,2434,'Arity'},{type,2434,arity,[]}]},{ann_type,2435,[{var,2435,'Location'},{type,2435,list,[{type,2435,union,[{type,2435,tuple,[{atom,2435,file},{ann_type,2435,[{var,2435,'Filename'},{type,2435,string,[]}]}]},{type,2436,tuple,[{atom,2436,line},{ann_type,2436,[{var,2436,'Line'},{type,2436,pos_integer,[]}]}]}]}]}]}]}]},{type,2437,tuple,[{atom,2437,current_stacktrace},{ann_type,2437,[{var,2437,'Stack'},{type,2437,list,[{user_type,2437,stack_item,[]}]}]}]},{type,2438,tuple,[{atom,2438,dictionary},{ann_type,2438,[{var,2438,'Dictionary'},{type,2438,list,[{type,2438,tuple,[{ann_type,2438,[{var,2438,'Key'},{type,2438,term,[]}]},{ann_type,2438,[{var,2438,'Value'},{type,2438,term,[]}]}]}]}]}]},{type,2439,tuple,[{atom,2439,error_handler},{ann_type,2439,[{var,2439,'Module'},{type,2439,module,[]}]}]},{type,2440,tuple,[{atom,2440,garbage_collection},{ann_type,2440,[{var,2440,'GCInfo'},{type,2440,list,[{type,2440,tuple,[{type,2440,atom,[]},{type,2440,non_neg_integer,[]}]}]}]}]},{type,2441,tuple,[{atom,2441,garbage_collection_info},{ann_type,2441,[{var,2441,'GCInfo'},{type,2441,list,[{type,2441,tuple,[{type,2441,atom,[]},{type,2441,non_neg_integer,[]}]}]}]}]},{type,2442,tuple,[{atom,2442,group_leader},{ann_type,2442,[{var,2442,'GroupLeader'},{type,2442,pid,[]}]}]},{type,2443,tuple,[{atom,2443,heap_size},{ann_type,2443,[{var,2443,'Size'},{type,2443,non_neg_integer,[]}]}]},{type,2444,tuple,[{atom,2444,initial_call},{type,2444,mfa,[]}]},{type,2445,tuple,[{atom,2445,links},{ann_type,2445,[{var,2445,'PidsAndPorts'},{type,2445,list,[{type,2445,union,[{type,2445,pid,[]},{type,2445,port,[]}]}]}]}]},{type,2446,tuple,[{atom,2446,last_calls},{type,2446,union,[{atom,2446,false},{ann_type,2446,[{var,2446,'Calls'},{type,2446,list,[{type,2446,mfa,[]}]}]}]}]},{type,2447,tuple,[{atom,2447,memory},{ann_type,2447,[{var,2447,'Size'},{type,2447,non_neg_integer,[]}]}]},{type,2448,tuple,[{atom,2448,message_queue_len},{ann_type,2448,[{var,2448,'MessageQueueLen'},{type,2448,non_neg_integer,[]}]}]},{type,2449,tuple,[{atom,2449,messages},{ann_type,2449,[{var,2449,'MessageQueue'},{type,2449,list,[{type,2449,term,[]}]}]}]},{type,2450,tuple,[{atom,2450,min_heap_size},{ann_type,2450,[{var,2450,'MinHeapSize'},{type,2450,non_neg_integer,[]}]}]},{type,2451,tuple,[{atom,2451,min_bin_vheap_size},{ann_type,2451,[{var,2451,'MinBinVHeapSize'},{type,2451,non_neg_integer,[]}]}]},{type,2452,tuple,[{atom,2452,max_heap_size},{ann_type,2452,[{var,2452,'MaxHeapSize'},{user_type,2452,max_heap_size,[]}]}]},{type,2453,tuple,[{atom,2453,monitored_by},{ann_type,2453,[{var,2453,'MonitoredBy'},{type,2453,list,[{type,2453,union,[{type,2453,pid,[]},{type,2453,port,[]},{user_type,2453,nif_resource,[]}]}]}]}]},{type,2454,tuple,[{atom,2454,monitors},{ann_type,2455,[{var,2455,'Monitors'},{type,2455,list,[{type,2455,tuple,[{type,2455,union,[{atom,2455,process},{atom,2455,port}]},{ann_type,2455,[{var,2455,'Pid'},{type,2455,union,[{type,2455,pid,[]},{type,2455,port,[]},{type,2456,tuple,[{ann_type,2456,[{var,2456,'RegName'},{type,2456,atom,[]}]},{ann_type,2456,[{var,2456,'Node'},{type,2456,node,[]}]}]}]}]}]}]}]}]},{type,2457,tuple,[{atom,2457,message_queue_data},{ann_type,2457,[{var,2457,'MQD'},{user_type,2457,message_queue_data,[]}]}]},{type,2458,tuple,[{atom,2458,priority},{ann_type,2458,[{var,2458,'Level'},{user_type,2458,priority_level,[]}]}]},{type,2459,tuple,[{atom,2459,reductions},{ann_type,2459,[{var,2459,'Number'},{type,2459,non_neg_integer,[]}]}]},{type,2460,tuple,[{atom,2460,registered_name},{type,2460,union,[{type,2460,nil,[]},{ann_type,2460,[{var,2460,'Atom'},{type,2460,atom,[]}]}]}]},{type,2461,tuple,[{atom,2461,sequential_trace_token},{type,2461,union,[{type,2461,nil,[]},{ann_type,2461,[{var,2461,'SequentialTraceToken'},{type,2461,term,[]}]}]}]},{type,2462,tuple,[{atom,2462,stack_size},{ann_type,2462,[{var,2462,'Size'},{type,2462,non_neg_integer,[]}]}]},{type,2463,tuple,[{atom,2463,status},{ann_type,2463,[{var,2463,'Status'},{type,2463,union,[{atom,2463,exiting},{atom,2463,garbage_collecting},{atom,2463,waiting},{atom,2463,running},{atom,2463,runnable},{atom,2463,suspended}]}]}]},{type,2464,tuple,[{atom,2464,suspending},{ann_type,2465,[{var,2465,'SuspendeeList'},{type,2465,list,[{type,2465,tuple,[{ann_type,2465,[{var,2465,'Suspendee'},{type,2465,pid,[]}]},{ann_type,2466,[{var,2466,'ActiveSuspendCount'},{type,2466,non_neg_integer,[]}]},{ann_type,2467,[{var,2467,'OutstandingSuspendCount'},{type,2467,non_neg_integer,[]}]}]}]}]}]},{type,2468,tuple,[{atom,2468,total_heap_size},{ann_type,2468,[{var,2468,'Size'},{type,2468,non_neg_integer,[]}]}]},{type,2469,tuple,[{atom,2469,trace},{ann_type,2469,[{var,2469,'InternalTraceFlags'},{type,2469,non_neg_integer,[]}]}]},{type,2470,tuple,[{atom,2470,trap_exit},{ann_type,2470,[{var,2470,'Boolean'},{type,2470,boolean,[]}]}]}]},[]}},{seq_trace_info_returns,0} => {attribute,259,type,{seq_trace_info_returns,{type,260,union,[{type,260,tuple,[{type,260,union,[{atom,260,send},{atom,260,'receive'},{atom,260,print},{atom,260,timestamp},{atom,260,monotonic_timestamp},{atom,260,strict_monotonic_timestamp}]},{type,260,boolean,[]}]},{type,261,tuple,[{atom,261,label},{type,261,term,[]}]},{type,262,tuple,[{atom,262,serial},{type,262,tuple,[{type,262,non_neg_integer,[]},{type,262,non_neg_integer,[]}]}]},{type,263,nil,[]}]},[]}},{process_info_item,0} => {attribute,2390,type,{process_info_item,{type,2391,union,[{atom,2391,backtrace},{atom,2392,binary},{atom,2393,catchlevel},{atom,2394,current_function},{atom,2395,current_location},{atom,2396,current_stacktrace},{atom,2397,dictionary},{atom,2398,error_handler},{atom,2399,garbage_collection},{atom,2400,garbage_collection_info},{atom,2401,group_leader},{atom,2402,heap_size},{atom,2403,initial_call},{atom,2404,links},{atom,2405,last_calls},{atom,2406,memory},{atom,2407,message_queue_len},{atom,2408,messages},{atom,2409,min_heap_size},{atom,2410,min_bin_vheap_size},{atom,2411,monitored_by},{atom,2412,monitors},{atom,2413,message_queue_data},{atom,2414,priority},{atom,2415,reductions},{atom,2416,registered_name},{atom,2417,sequential_trace_token},{atom,2418,stack_size},{atom,2419,status},{atom,2420,suspending},{atom,2421,total_heap_size},{atom,2422,trace},{atom,2423,trap_exit}]},[]}},{trace_info_return,0} => {attribute,343,type,{trace_info_return,{type,344,union,[{atom,344,undefined},{type,345,tuple,[{atom,345,flags},{type,345,list,[{user_type,345,trace_info_flag,[]}]}]},{type,346,tuple,[{atom,346,tracer},{type,346,union,[{type,346,pid,[]},{type,346,port,[]},{type,346,nil,[]}]}]},{type,347,tuple,[{atom,347,tracer},{type,347,module,[]},{type,347,term,[]}]},{user_type,348,trace_info_item_result,[]},{type,349,tuple,[{atom,349,all},{type,349,union,[{type,349,list,[{user_type,349,trace_info_item_result,[]}]},{atom,349,false},{atom,349,undefined}]}]}]},[]}},{trace_info_item_result,0} => {attribute,317,type,{trace_info_item_result,{type,318,union,[{type,318,tuple,[{atom,318,traced},{type,318,union,[{atom,318,global},{atom,318,local},{atom,318,false},{atom,318,undefined}]}]},{type,319,tuple,[{atom,319,match_spec},{type,319,union,[{user_type,319,trace_match_spec,[]},{atom,319,false},{atom,319,undefined}]}]},{type,320,tuple,[{atom,320,meta},{type,320,union,[{type,320,pid,[]},{type,320,port,[]},{atom,320,false},{atom,320,undefined},{type,320,nil,[]}]}]},{type,321,tuple,[{atom,321,meta},{type,321,module,[]},{type,321,term,[]}]},{type,322,tuple,[{atom,322,meta_match_spec},{type,322,union,[{user_type,322,trace_match_spec,[]},{atom,322,false},{atom,322,undefined}]}]},{type,323,tuple,[{atom,323,call_count},{type,323,union,[{type,323,non_neg_integer,[]},{type,323,boolean,[]},{atom,323,undefined}]}]},{type,324,tuple,[{atom,324,call_time},{type,324,union,[{type,324,list,[{type,324,tuple,[{type,324,pid,[]},{type,324,non_neg_integer,[]},{type,325,non_neg_integer,[]},{type,325,non_neg_integer,[]}]}]},{type,325,boolean,[]},{atom,325,undefined}]}]}]},[]}},{trace_pattern_mfa,0} => {attribute,2700,type,{trace_pattern_mfa,{type,2701,union,[{type,2701,tuple,[{type,2701,atom,[]},{type,2701,atom,[]},{type,2701,union,[{type,2701,arity,[]},{atom,2701,'_'}]}]},{atom,2701,on_load}]},[]}},{registered_name,0} => {attribute,1393,type,{registered_name,{type,1393,atom,[]},[]}},{dist_handle,0} => {attribute,116,opaque,{dist_handle,{type,116,atom,[]},[]}},{info_list,0} => {attribute,2762,type,{info_list,{type,2762,nil,[]},[]}},{cpu_topology,0} => {attribute,2752,type,{cpu_topology,{type,2753,union,[{type,2753,list,[{ann_type,2753,[{var,2753,'LevelEntry'},{user_type,2753,level_entry,[]}]}]},{atom,2753,undefined}]},[]}},{memory_type,0} => {attribute,3977,type,{memory_type,{type,3977,union,[{atom,3977,total},{atom,3977,processes},{atom,3977,processes_used},{atom,3977,system},{atom,3978,atom},{atom,3978,atom_used},{atom,3978,binary},{atom,3978,code},{atom,3978,ets}]},[]}},{level_tag,0} => {attribute,2759,type,{level_tag,{type,2759,union,[{atom,2759,core},{atom,2759,node},{atom,2759,processor},{atom,2759,thread}]},[]}},{timestamp,0} => {attribute,89,type,{timestamp,{type,89,tuple,[{ann_type,89,[{var,89,'MegaSecs'},{type,89,non_neg_integer,[]}]},{ann_type,90,[{var,90,'Secs'},{type,90,non_neg_integer,[]}]},{ann_type,91,[{var,91,'MicroSecs'},{type,91,non_neg_integer,[]}]}]},[]}},{deprecated_time_unit,0} => {attribute,104,type,{deprecated_time_unit,{type,105,union,[{atom,105,seconds},{atom,106,milli_seconds},{atom,107,micro_seconds},{atom,108,nano_seconds}]},[]}},{spawn_opt_option,0} => {attribute,2988,type,{spawn_opt_option,{type,2989,union,[{atom,2989,link},{atom,2990,monitor},{type,2991,tuple,[{atom,2991,monitor},{ann_type,2991,[{var,2991,'MonitorOpts'},{type,2991,list,[{user_type,2991,monitor_option,[]}]}]}]},{type,2992,tuple,[{atom,2992,priority},{ann_type,2992,[{var,2992,'Level'},{user_type,2992,priority_level,[]}]}]},{type,2993,tuple,[{atom,2993,fullsweep_after},{ann_type,2993,[{var,2993,'Number'},{type,2993,non_neg_integer,[]}]}]},{type,2994,tuple,[{atom,2994,min_heap_size},{ann_type,2994,[{var,2994,'Size'},{type,2994,non_neg_integer,[]}]}]},{type,2995,tuple,[{atom,2995,min_bin_vheap_size},{ann_type,2995,[{var,2995,'VSize'},{type,2995,non_neg_integer,[]}]}]},{type,2996,tuple,[{atom,2996,max_heap_size},{ann_type,2996,[{var,2996,'Size'},{user_type,2996,max_heap_size,[]}]}]},{type,2997,tuple,[{atom,2997,message_queue_data},{ann_type,2997,[{var,2997,'MQD'},{user_type,2997,message_queue_data,[]}]}]}]},[]}},{dst,0} => {attribute,3452,type,{dst,{type,3452,union,[{type,3452,pid,[]},{type,3453,reference,[]},{type,3454,port,[]},{ann_type,3455,[{var,3455,'RegName'},{type,3455,atom,[]}]},{type,3456,tuple,[{ann_type,3456,[{var,3456,'RegName'},{type,3456,atom,[]}]},{ann_type,3456,[{var,3456,'Node'},{type,3456,node,[]}]}]}]},[]}},{bitstring_list,0} => {attribute,288,type,{bitstring_list,{type,289,maybe_improper_list,[{type,289,union,[{type,289,byte,[]},{type,289,bitstring,[]},{user_type,289,bitstring_list,[]}]},{type,289,union,[{type,289,bitstring,[]},{type,289,nil,[]}]}]},[]}},{match_variable,0} => {attribute,2699,type,{match_variable,{type,2699,atom,[]},[]}},{monitor_process_identifier,0} => {attribute,1395,type,{monitor_process_identifier,{type,1395,union,[{type,1395,pid,[]},{user_type,1395,registered_process_identifier,[]}]},[]}},{scheduler_bind_type,0} => {attribute,2596,type,{scheduler_bind_type,{type,2597,union,[{atom,2597,no_node_processor_spread},{atom,2598,no_node_thread_spread},{atom,2599,no_spread},{atom,2600,processor_spread},{atom,2601,spread},{atom,2602,thread_spread},{atom,2603,thread_no_node_processor_spread},{atom,2604,unbound}]},[]}},{trace_pattern_flag,0} => {attribute,2718,type,{trace_pattern_flag,{type,2719,union,[{atom,2719,global},{atom,2719,local},{atom,2720,meta},{type,2720,tuple,[{atom,2720,meta},{ann_type,2720,[{var,2720,'Pid'},{type,2720,pid,[]}]}]},{type,2721,tuple,[{atom,2721,meta},{ann_type,2721,[{var,2721,'TracerModule'},{type,2721,module,[]}]},{ann_type,2721,[{var,2721,'TracerState'},{type,2721,term,[]}]}]},{atom,2722,call_count},{atom,2723,call_time}]},[]}},{system_profile_option,0} => {attribute,265,type,{system_profile_option,{type,266,union,[{atom,266,exclusive},{atom,267,runnable_ports},{atom,268,runnable_procs},{atom,269,scheduler},{atom,270,timestamp},{atom,271,monotonic_timestamp},{atom,272,strict_monotonic_timestamp}]},[]}},{message_queue_data,0} => {attribute,2353,type,{message_queue_data,{type,2354,union,[{atom,2354,off_heap},{atom,2354,on_heap}]},[]}},{raise_stacktrace,0} => {attribute,282,type,{raise_stacktrace,{type,283,union,[{type,283,list,[{type,283,union,[{type,283,tuple,[{type,283,module,[]},{type,283,atom,[]},{type,283,union,[{type,283,arity,[]},{type,283,list,[{type,283,term,[]}]}]}]},{type,284,tuple,[{type,284,function,[]},{type,284,list,[{type,284,term,[]}]}]}]}]},{type,285,list,[{type,285,union,[{type,285,tuple,[{type,285,module,[]},{type,285,atom,[]},{type,285,union,[{type,285,arity,[]},{type,285,list,[{type,285,term,[]}]}]},{type,285,list,[{type,285,tuple,[{type,285,atom,[]},{type,285,term,[]}]}]}]},{type,286,tuple,[{type,286,function,[]},{type,286,list,[{type,286,term,[]}]},{type,286,list,[{type,286,tuple,[{type,286,atom,[]},{type,286,term,[]}]}]}]}]}]}]},[]}},{priority_level,0} => {attribute,2350,type,{priority_level,{type,2351,union,[{atom,2351,low},{atom,2351,normal},{atom,2351,high},{atom,2351,max}]},[]}},{level_entry,0} => {attribute,2754,type,{level_entry,{type,2755,union,[{type,2755,tuple,[{ann_type,2755,[{var,2755,'LevelTag'},{user_type,2755,level_tag,[]}]},{ann_type,2755,[{var,2755,'SubLevel'},{user_type,2755,sub_level,[]}]}]},{type,2756,tuple,[{ann_type,2756,[{var,2756,'LevelTag'},{user_type,2756,level_tag,[]}]},{ann_type,2757,[{var,2757,'InfoList'},{user_type,2757,info_list,[]}]},{ann_type,2758,[{var,2758,'SubLevel'},{user_type,2758,sub_level,[]}]}]}]},[]}}}},[{{function,abs,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2100}],[<<97,98,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,102,108,111,97,116,32,116,104,97,116,32,105,115,32,116,104,101,32,97,114,105,116,104,109,101,116,105,99,97,108,32,97,98,115,111,108,117,116,101,32,118,97,108,117,101,32,111,102,32>>,{code,[],[<<70,108,111,97,116>>]},<<32,111,114,32>>,{code,[],[<<73,110,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,98,115,40,45,51,46,51,51,41,46,10,51,46,51,51,10,62,32,97,98,115,40,45,51,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,54>>,signature => [{attribute,2100,spec,{{abs,1},[{type,2100,bounded_fun,[{type,2100,'fun',[{type,2100,product,[{var,2100,'Float'}]},{type,2100,float,[]}]},[{type,2101,constraint,[{atom,2101,is_subtype},[{var,2101,'Float'},{type,2101,float,[]}]]}]]},{type,2102,bounded_fun,[{type,2102,'fun',[{type,2102,product,[{var,2102,'Int'}]},{type,2102,non_neg_integer,[]}]},[{type,2103,constraint,[{atom,2103,is_subtype},[{var,2103,'Int'},{type,2103,integer,[]}]]}]]}]}}]}},{{function,adler32,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,353}],[<<97,100,108,101,114,51,50,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,102,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,51>>,signature => [{attribute,353,spec,{{erlang,adler32,1},[{type,353,bounded_fun,[{type,353,'fun',[{type,353,product,[{var,353,'Data'}]},{type,353,non_neg_integer,[]}]},[{type,354,constraint,[{atom,354,is_subtype},[{var,354,'Data'},{type,354,iodata,[]}]]}]]}]}}]}},{{function,adler32,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,359}],[<<97,100,108,101,114,51,50,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,32>>,{code,[],[<<79,108,100,65,100,108,101,114>>]},<<44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,88,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<89>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,50>>,signature => [{attribute,359,spec,{{erlang,adler32,2},[{type,359,bounded_fun,[{type,359,'fun',[{type,359,product,[{var,359,'OldAdler'},{var,359,'Data'}]},{type,359,non_neg_integer,[]}]},[{type,360,constraint,[{atom,360,is_subtype},[{var,360,'OldAdler'},{type,360,non_neg_integer,[]}]]},{type,361,constraint,[{atom,361,is_subtype},[{var,361,'Data'},{type,361,iodata,[]}]]}]]}]}}]}},{{function,adler32_combine,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,366}],[<<97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,115,46,32,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,32,116,111,32,98,101,32,107,110,111,119,110,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,89,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<90>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,57>>,signature => [{attribute,366,spec,{{erlang,adler32_combine,3},[{type,366,bounded_fun,[{type,366,'fun',[{type,366,product,[{var,366,'FirstAdler'},{var,366,'SecondAdler'},{var,366,'SecondSize'}]},{type,366,non_neg_integer,[]}]},[{type,367,constraint,[{atom,367,is_subtype},[{var,367,'FirstAdler'},{type,367,non_neg_integer,[]}]]},{type,368,constraint,[{atom,368,is_subtype},[{var,368,'SecondAdler'},{type,368,non_neg_integer,[]}]]},{type,369,constraint,[{atom,369,is_subtype},[{var,369,'SecondSize'},{type,369,non_neg_integer,[]}]]}]]}]}}]}},{{function,alias,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,759}],[<<97,108,105,97,115,47,49>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,56>>,equiv => {function,alias,0},signature => [{attribute,759,spec,{{alias,1},[{type,759,bounded_fun,[{type,759,'fun',[{type,759,product,[{var,759,'Opts'}]},{var,759,'Alias'}]},[{type,760,constraint,[{atom,760,is_subtype},[{var,760,'Alias'},{type,760,reference,[]}]]},{type,761,constraint,[{atom,761,is_subtype},[{var,761,'Opts'},{type,761,list,[{type,761,union,[{atom,761,explicit_unalias},{atom,761,reply}]}]}]]}]]}]}}],since => <<79,84,80,32,64,79,84,80,45,49,54,55,49,56,64>>}},{{function,alias,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,753}],[<<97,108,105,97,115,47,48>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,32,97,110,32,97,108,105,97,115,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,97,108,105,97,115,46,32,87,104,101,110,32,116,104,101,32,97,108,105,97,115,32,104,97,115,32,98,101,101,110,32,100,101,97,99,116,105,118,97,116,101,100,44,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,117,115,105,110,103,32,116,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,65,110,32,97,108,105,97,115,32,99,97,110,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,97,108,105,97,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,97,108,105,97,115,47,49>>]}]},<<46,32,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,32,102,111,114,32>>,{code,[],[<<97,108,105,97,115,47,49>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,99,97,110,32,111,110,108,121,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,117,114,32,105,102,32,110,111,32,111,112,116,105,111,110,115,32,97,114,101,32,112,97,115,115,101,100,32,111,114,32,105,102,32>>,{code,[],[<<97,108,105,97,115,47,48>>]},<<32,105,115,32,99,97,108,108,101,100,46>>]}]},{dt,[],[{code,[],[<<114,101,112,108,121>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,56>>,signature => [{attribute,753,spec,{{alias,0},[{type,753,bounded_fun,[{type,753,'fun',[{type,753,product,[]},{var,753,'Alias'}]},[{type,754,constraint,[{atom,754,is_subtype},[{var,754,'Alias'},{type,754,reference,[]}]]}]]}]}}],since => <<79,84,80,32,64,79,84,80,45,49,54,55,49,56,64>>}},{{function,append_element,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,374}],[<<97,112,112,101,110,100,95,101,108,101,109,101,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,116,104,97,116,32,104,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,109,111,114,101,32,116,104,97,110,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<44,32,97,110,100,32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,105,110,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<32,102,111,108,108,111,119,101,100,32,98,121,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,115,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,46,32,83,101,109,97,110,116,105,99,97,108,108,121,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<108,105,115,116,95,116,111,95,116,117,112,108,101,40,116,117,112,108,101,95,116,111,95,108,105,115,116,40,84,117,112,108,101,49,41,32,43,43,32,91,84,101,114,109,93,41>>]},<<44,32,98,117,116,32,109,117,99,104,32,102,97,115,116,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,97,112,112,101,110,100,95,101,108,101,109,101,110,116,40,123,111,110,101,44,32,116,119,111,125,44,32,116,104,114,101,101,41,46,10,123,111,110,101,44,116,119,111,44,116,104,114,101,101,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,48>>,signature => [{attribute,374,spec,{{erlang,append_element,2},[{type,374,bounded_fun,[{type,374,'fun',[{type,374,product,[{var,374,'Tuple1'},{var,374,'Term'}]},{var,374,'Tuple2'}]},[{type,375,constraint,[{atom,375,is_subtype},[{var,375,'Tuple1'},{type,375,tuple,any}]]},{type,376,constraint,[{atom,376,is_subtype},[{var,376,'Tuple2'},{type,376,tuple,any}]]},{type,377,constraint,[{atom,377,is_subtype},[{var,377,'Term'},{type,377,term,[]}]]}]]}]}}]}},{{function,apply,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2888}],[<<97,112,112,108,121,47,50>>],#{<<101,110>> => [{p,[],[<<67,97,108,108,115,32,97,32,102,117,110,44,32,112,97,115,115,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,105,110,32>>,{code,[],[<<65,114,103,115>>]},<<32,97,115,32,97,114,103,117,109,101,110,116,115,46>>]},{p,[],[<<73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,32,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,32,97,115,32>>,{code,[],[<<70,117,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,32,65,114,103,78,41>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<69,97,114,108,105,101,114,44,32>>,{code,[],[<<70,117,110>>]},<<32,99,111,117,108,100,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,125>>]},<<44,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<97,112,112,108,121,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>]},<<46,32>>,{em,[],[<<84,104,105,115,32,117,115,101,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,119,105,108,108,32,115,116,111,112,32,119,111,114,107,105,110,103,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,55>>,signature => [{attribute,2888,spec,{{apply,2},[{type,2888,bounded_fun,[{type,2888,'fun',[{type,2888,product,[{var,2888,'Fun'},{var,2888,'Args'}]},{type,2888,term,[]}]},[{type,2889,constraint,[{atom,2889,is_subtype},[{var,2889,'Fun'},{type,2889,function,[]}]]},{type,2890,constraint,[{atom,2890,is_subtype},[{var,2890,'Args'},{type,2890,list,[{type,2890,term,[]}]}]]}]]}]}}]}},{{function,apply,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2895}],[<<97,112,112,108,121,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,110,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,84,104,101,32,97,112,112,108,105,101,100,32,102,117,110,99,116,105,111,110,32,109,117,115,116,32,98,101,32,101,120,112,111,114,116,101,100,32,102,114,111,109,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,112,112,108,121,40,108,105,115,116,115,44,32,114,101,118,101,114,115,101,44,32,91,91,97,44,32,98,44,32,99,93,93,41,46,10,91,99,44,98,44,97,93,10,62,32,97,112,112,108,121,40,101,114,108,97,110,103,44,32,97,116,111,109,95,116,111,95,108,105,115,116,44,32,91,39,69,114,108,97,110,103,39,93,41,46,10,34,69,114,108,97,110,103,34>>]}]},{p,[],[<<73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,32,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,32,97,115,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,44,32,65,114,103,78,41>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{a,[{href,<<107,101,114,110,101,108,58,101,114,114,111,114,95,104,97,110,100,108,101,114,35,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,47,51>>]}]},<<32,105,115,32,99,97,108,108,101,100,32,105,102,32,116,104,101,32,97,112,112,108,105,101,100,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,101,120,112,111,114,116,101,100,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<41,46,32,73,102,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,105,102,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,115,111,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,109,111,100,117,108,101,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,32,101,114,114,111,114,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<117,110,100,101,102>>]},<<32,105,115,32,103,101,110,101,114,97,116,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,53>>,signature => [{attribute,2895,spec,{{apply,3},[{type,2895,bounded_fun,[{type,2895,'fun',[{type,2895,product,[{var,2895,'Module'},{var,2895,'Function'},{var,2895,'Args'}]},{type,2895,term,[]}]},[{type,2896,constraint,[{atom,2896,is_subtype},[{var,2896,'Module'},{type,2896,module,[]}]]},{type,2897,constraint,[{atom,2897,is_subtype},[{var,2897,'Function'},{type,2897,atom,[]}]]},{type,2898,constraint,[{atom,2898,is_subtype},[{var,2898,'Args'},{type,2898,list,[{type,2898,term,[]}]}]]}]]}]}}]}},{{function,atom_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,382}],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121>>]},<<32>>]},{code,[],[<<40,65,116,111,109,44,32,117,116,102,56,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,49,53>>,signature => [{attribute,382,spec,{{atom_to_binary,1},[{type,382,bounded_fun,[{type,382,'fun',[{type,382,product,[{var,382,'Atom'}]},{type,382,binary,[]}]},[{type,383,constraint,[{atom,383,is_subtype},[{var,383,'Atom'},{type,383,atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,atom_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,393}],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<65,116,111,109>>]},<<46,32,73,102,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<32,105,115,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,111,110,101,32,98,121,116,101,32,101,120,105,115,116,115,32,102,111,114,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,32,73,102,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,111,114,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,85,84,70,45,56,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,114,101,113,117,105,114,101,32,109,117,108,116,105,112,108,101,32,98,121,116,101,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,97,116,111,109,115,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32>>,{code,[],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,108,97,116,105,110,49,41>>]},<<32,109,97,121,32,102,97,105,108,32,105,102,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32>>,{code,[],[<<65,116,111,109>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,62,32,50,53,53,46>>]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,39,69,114,108,97,110,103,39,44,32,108,97,116,105,110,49,41,46,10,60,60,34,69,114,108,97,110,103,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,53>>,signature => [{attribute,393,spec,{{atom_to_binary,2},[{type,393,bounded_fun,[{type,393,'fun',[{type,393,product,[{var,393,'Atom'},{var,393,'Encoding'}]},{type,393,binary,[]}]},[{type,394,constraint,[{atom,394,is_subtype},[{var,394,'Atom'},{type,394,atom,[]}]]},{type,395,constraint,[{atom,395,is_subtype},[{var,395,'Encoding'},{type,395,union,[{atom,395,latin1},{atom,395,unicode},{atom,395,utf8}]}]]}]]}]}}]}},{{function,atom_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,400}],[<<97,116,111,109,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,117,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<65,116,111,109>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,69,114,108,97,110,103,39,41,46,10,34,69,114,108,97,110,103,34>>]}]},{pre,[],[{code,[],[<<62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,228,189,160,229,165,189,39,41,46,10,91,50,48,51,50,48,44,50,50,57,48,57,93>>]}]},{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,100,108,105,98,58,117,110,105,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,105,99,111,100,101,40,51,41>>]}]},<<32,102,111,114,32,104,111,119,32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,116,111,32,100,105,102,102,101,114,101,110,116,32,102,111,114,109,97,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,53,48>>,signature => [{attribute,400,spec,{{atom_to_list,1},[{type,400,bounded_fun,[{type,400,'fun',[{type,400,product,[{var,400,'Atom'}]},{type,400,string,[]}]},[{type,401,constraint,[{atom,401,is_subtype},[{var,401,'Atom'},{type,401,atom,[]}]]}]]}]}}]}},{{function,binary_part,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,407}],[<<98,105,110,97,114,121,95,112,97,114,116,47,50>>],#{<<101,110>> => [{p,[],[<<69,120,116,114,97,99,116,115,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,100,101,115,99,114,105,98,101,100,32,98,121,32>>,{code,[],[<<80,111,115,76,101,110>>]},<<46>>]},{p,[],[<<78,101,103,97,116,105,118,101,32,108,101,110,103,116,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,101,120,116,114,97,99,116,32,98,121,116,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,98,105,110,97,114,121,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,44,49,48,62,62,46,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,98,121,116,101,95,115,105,122,101,40,66,105,110,41,44,32,45,53,125,41,46,10,60,60,54,44,55,44,56,44,57,44,49,48,62,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,115,76,101,110>>]},<<32,105,110,32,97,110,121,32,119,97,121,32,114,101,102,101,114,101,110,99,101,115,32,111,117,116,115,105,100,101,32,116,104,101,32,98,105,110,97,114,121,46>>]},{p,[],[{code,[],[<<83,116,97,114,116>>]},<<32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,116,104,97,116,32,105,115,58>>]},{pre,[],[{code,[],[<<49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,62,62,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,48,44,50,125,41,46,10,60,60,49,44,50,62,62>>]}]},{p,[],[<<70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<80,111,115,76,101,110>>]},<<32,115,101,109,97,110,116,105,99,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,100,108,105,98,58,98,105,110,97,114,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<98,105,110,97,114,121,40,51,41>>]}]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,54,56>>,signature => [{attribute,407,spec,{{binary_part,2},[{type,407,bounded_fun,[{type,407,'fun',[{type,407,product,[{var,407,'Subject'},{var,407,'PosLen'}]},{type,407,binary,[]}]},[{type,408,constraint,[{atom,408,is_subtype},[{var,408,'Subject'},{type,408,binary,[]}]]},{type,409,constraint,[{atom,409,is_subtype},[{var,409,'PosLen'},{type,409,tuple,[{ann_type,409,[{var,409,'Start'},{type,409,non_neg_integer,[]}]},{ann_type,409,[{var,409,'Length'},{type,409,integer,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,binary_part,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,415}],[<<98,105,110,97,114,121,95,112,97,114,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,123,83,116,97,114,116,44,32,76,101,110,103,116,104,125,41>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,57,51>>,signature => [{attribute,415,spec,{{binary_part,3},[{type,415,bounded_fun,[{type,415,'fun',[{type,415,product,[{var,415,'Subject'},{var,415,'Start'},{var,415,'Length'}]},{type,415,binary,[]}]},[{type,416,constraint,[{atom,416,is_subtype},[{var,416,'Subject'},{type,416,binary,[]}]]},{type,417,constraint,[{atom,417,is_subtype},[{var,417,'Start'},{type,417,non_neg_integer,[]}]]},{type,418,constraint,[{atom,418,is_subtype},[{var,418,'Length'},{type,418,integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,binary_to_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,423}],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109>>]},<<32>>]},{code,[],[<<40,66,105,110,97,114,121,44,32,117,116,102,56,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,48,51>>,signature => [{attribute,423,spec,{{binary_to_atom,1},[{type,423,bounded_fun,[{type,423,'fun',[{type,423,product,[{var,423,'Binary'}]},{type,423,atom,[]}]},[{type,424,constraint,[{atom,424,is_subtype},[{var,424,'Binary'},{type,424,binary,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_to_atom,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,433}],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46,32,73,102,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,111,114,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,116,104,101,32,98,105,110,97,114,121,32,109,117,115,116,32,99,111,110,116,97,105,110,32,118,97,108,105,100,32,85,84,70,45,56,32,115,101,113,117,101,110,99,101,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41>>]},<<32,105,115,32,99,97,112,97,98,108,101,32,111,102,32,101,110,99,111,100,105,110,103,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,119,111,117,108,100,32,102,97,105,108,32,105,102,32,116,104,101,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,101,100,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,62,32,50,53,53,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,85,110,105,99,111,100,101,32,115,117,112,112,111,114,116,32,105,110,32,97,116,111,109,115,44,32,115,101,101,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,101,120,116,95,100,105,115,116,35,117,116,102,56,95,97,116,111,109,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,116,101,32,111,110,32,85,84,70,45,56,32,101,110,99,111,100,101,100,32,97,116,111,109,115>>]},<<32,105,110,32,115,101,99,116,105,111,110,32,34,69,120,116,101,114,110,97,108,32,84,101,114,109,32,70,111,114,109,97,116,34,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,119,104,101,116,104,101,114,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50>>]},<<32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,32,116,104,97,110,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,34,69,114,108,97,110,103,34,62,62,44,32,108,97,116,105,110,49,41,46,10,39,69,114,108,97,110,103,39>>]}]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,49,48,50,52,47,117,116,102,56,62,62,44,32,117,116,102,56,41,46,10,39,208,128,39>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,49,51>>,signature => [{attribute,433,spec,{{binary_to_atom,2},[{type,433,bounded_fun,[{type,433,'fun',[{type,433,product,[{var,433,'Binary'},{var,433,'Encoding'}]},{type,433,atom,[]}]},[{type,434,constraint,[{atom,434,is_subtype},[{var,434,'Binary'},{type,434,binary,[]}]]},{type,435,constraint,[{atom,435,is_subtype},[{var,435,'Encoding'},{type,435,union,[{atom,435,latin1},{atom,435,unicode},{atom,435,utf8}]}]]}]]}]}}]}},{{function,binary_to_existing_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,440}],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109>>]}]},<<32>>,{code,[],[<<40,66,105,110,97,114,121,44,32,117,116,102,56,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,53,54>>,signature => [{attribute,440,spec,{{binary_to_existing_atom,1},[{type,440,bounded_fun,[{type,440,'fun',[{type,440,product,[{var,440,'Binary'}]},{type,440,atom,[]}]},[{type,441,constraint,[{atom,441,is_subtype},[{var,441,'Binary'},{type,441,binary,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_to_existing_atom,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,450}],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50>>],#{<<101,110>> => [{p,[],[<<65,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]}]},<<44,32,98,117,116,32,116,104,101,32,97,116,111,109,32,109,117,115,116,32,101,120,105,115,116,46>>]},{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,104,97,115,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116>>]},<<32,102,111,114,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,44,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,110,111,116,32,115,97,102,101,32,116,111,32,99,114,101,97,116,101,32,109,97,110,121,32,97,116,111,109,115,32,102,114,111,109,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,99,111,109,101,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,105,108,101,32,102,101,116,99,104,101,100,32,102,114,111,109,32,116,104,101,32,73,110,116,101,114,110,101,116,41,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]}]},<<46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,117,115,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,111,112,116,105,111,110,32,119,104,101,110,32,116,104,101,32,105,110,112,117,116,32,98,105,110,97,114,121,32,99,111,109,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46>>]},{p,[],[<<65,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,97,110,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,119,104,101,110,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,111,114,32,119,104,101,110,32,99,114,101,97,116,101,100,32,112,114,111,103,114,97,109,109,97,116,105,99,97,108,108,121,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,98,121,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]},<<41,46,32,83,101,101,32,116,104,101,32,110,101,120,116,32,110,111,116,101,32,102,111,114,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,110,32,97,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,32,102,111,114,32,97,110,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,98,117,116,32,110,111,116,32,105,110,32,116,104,101,32,99,111,109,112,105,108,101,100,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,97,109,101,32,109,111,100,117,108,101,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,97,116,111,109,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,32,114,101,119,114,105,116,101,32>>,{code,[],[<<97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41>>]},<<32,116,111,32>>,{code,[],[<<34,115,111,109,101,95,97,116,111,109,34>>]},<<46,32,73,102,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,111,109,101,95,97,116,111,109>>]},<<32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,60,60,34,115,111,109,101,95,97,116,111,109,34,62,62,44,32,117,116,102,56,41>>]},<<32,119,105,108,108,32,102,97,105,108,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,54,55>>,signature => [{attribute,450,spec,{{binary_to_existing_atom,2},[{type,450,bounded_fun,[{type,450,'fun',[{type,450,product,[{var,450,'Binary'},{var,450,'Encoding'}]},{type,450,atom,[]}]},[{type,451,constraint,[{atom,451,is_subtype},[{var,451,'Binary'},{type,451,binary,[]}]]},{type,452,constraint,[{atom,452,is_subtype},[{var,452,'Encoding'},{type,452,union,[{atom,452,latin1},{atom,452,unicode},{atom,452,utf8}]}]]}]]}]}}]}},{{function,binary_to_float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,457}],[<<98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,40,60,60,34,50,46,50,48,49,55,55,54,52,101,43,48,34,62,62,41,46,10,50,46,50,48,49,55,55,54,52>>]}]},{p,[],[<<84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,49,51>>,signature => [{attribute,457,spec,{{binary_to_float,1},[{type,457,bounded_fun,[{type,457,'fun',[{type,457,product,[{var,457,'Binary'}]},{type,457,float,[]}]},[{type,458,constraint,[{atom,458,is_subtype},[{var,458,'Binary'},{type,458,binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,463}],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,49,50,51,34,62,62,41,46,10,49,50,51>>]}]},{p,[],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49>>]},<<32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,49>>,signature => [{attribute,463,spec,{{binary_to_integer,1},[{type,463,bounded_fun,[{type,463,'fun',[{type,463,product,[{var,463,'Binary'}]},{type,463,integer,[]}]},[{type,464,constraint,[{atom,464,is_subtype},[{var,464,'Binary'},{type,464,binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_integer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,469}],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,51,70,70,34,62,62,44,32,49,54,41,46,10,49,48,50,51>>]}]},{p,[],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50>>]},<<32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,52,56>>,signature => [{attribute,469,spec,{{binary_to_integer,2},[{type,469,bounded_fun,[{type,469,'fun',[{type,469,product,[{var,469,'Binary'},{var,469,'Base'}]},{type,469,integer,[]}]},[{type,470,constraint,[{atom,470,is_subtype},[{var,470,'Binary'},{type,470,binary,[]}]]},{type,471,constraint,[{atom,471,is_subtype},[{var,471,'Base'},{type,471,range,[{integer,471,2},{integer,471,36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,476}],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,54,54>>,signature => [{attribute,476,spec,{{binary_to_list,1},[{type,476,bounded_fun,[{type,476,'fun',[{type,476,product,[{var,476,'Binary'}]},{type,476,list,[{type,476,byte,[]}]}]},[{type,477,constraint,[{atom,477,is_subtype},[{var,477,'Binary'},{type,477,binary,[]}]]}]]}]}}]}},{{function,binary_to_list,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,482}],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<65,115,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49>>]},<<44,32,98,117,116,32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<83,116,97,114,116>>]},<<32,116,111,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<83,116,111,112>>]},<<32,105,110,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46,32,84,104,101,32,112,111,115,105,116,105,111,110,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,97,114,101,32,110,117,109,98,101,114,101,100,32,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{em,[],[<<84,104,101,32,111,110,101,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,32,102,111,114,32,98,105,110,97,114,105,101,115,32,117,115,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46>>]},<<32,78,101,119,32,99,111,100,101,32,105,115,32,116,111,32,117,115,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,98,105,110,97,114,121,35,98,105,110,95,116,111,95,108,105,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,58,98,105,110,95,116,111,95,108,105,115,116,47,51>>]}]},<<32,105,110,32,83,84,68,76,73,66,32,105,110,115,116,101,97,100,46,32,65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,109,111,100,117,108,101,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,99,111,110,115,105,115,116,101,110,116,108,121,32,117,115,101,32,122,101,114,111,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,53>>,signature => [{attribute,482,spec,{{binary_to_list,3},[{type,482,bounded_fun,[{type,482,'fun',[{type,482,product,[{var,482,'Binary'},{var,482,'Start'},{var,482,'Stop'}]},{type,482,list,[{type,482,byte,[]}]}]},[{type,483,constraint,[{atom,483,is_subtype},[{var,483,'Binary'},{type,483,binary,[]}]]},{type,484,constraint,[{atom,484,is_subtype},[{var,484,'Start'},{type,484,pos_integer,[]}]]},{type,485,constraint,[{atom,485,is_subtype},[{var,485,'Stop'},{type,485,pos_integer,[]}]]}]]}]}}]}},{{function,binary_to_term,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,490}],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,121,32,111,98,106,101,99,116,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,119,104,105,99,104,32,109,117,115,116,32,98,101,32,101,110,99,111,100,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,108,95,101,120,116,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116>>]},<<46>>]},{pre,[],[{code,[],[<<62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<87,104,101,110,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,44,32,99,111,110,115,105,100,101,114,32,117,115,105,110,103,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>]},<<32,116,111,32,112,114,101,118,101,110,116,32,68,101,110,105,97,108,32,111,102,32,83,101,114,118,105,99,101,32,97,116,116,97,99,107,115,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,55>>,signature => [{attribute,490,spec,{{binary_to_term,1},[{type,490,bounded_fun,[{type,490,'fun',[{type,490,product,[{var,490,'Binary'}]},{type,490,term,[]}]},[{type,491,constraint,[{atom,491,is_subtype},[{var,491,'Binary'},{user_type,491,ext_binary,[]}]]}]]}]}}]}},{{function,binary_to_term,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,496}],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>],#{<<101,110>> => [{p,[],[<<65,115,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]},<<44,32,98,117,116,32,116,97,107,101,115,32,116,104,101,115,101,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,97,102,101>>]}]},{dd,[],[{p,[],[<<85,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,119,104,101,110,32,114,101,99,101,105,118,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46>>]},{p,[],[<<87,104,101,110,32,101,110,97,98,108,101,100,44,32,105,116,32,112,114,101,118,101,110,116,115,32,100,101,99,111,100,105,110,103,32,100,97,116,97,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,116,116,97,99,107,32,116,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,46,32,73,110,32,116,104,101,32,101,118,101,110,116,32,111,102,32,114,101,99,101,105,118,105,110,103,32,117,110,115,97,102,101,32,100,97,116,97,44,32,100,101,99,111,100,105,110,103,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,114,114,111,114,46>>]},{p,[],[<<84,104,105,115,32,112,114,101,118,101,110,116,115,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,100,105,114,101,99,116,108,121,44,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,105,110,100,105,114,101,99,116,108,121,32,40,97,115,32,116,104,101,121,32,97,114,101,32,101,109,98,101,100,100,101,100,32,105,110,32,99,101,114,116,97,105,110,32,115,116,114,117,99,116,117,114,101,115,44,32,115,117,99,104,32,97,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,114,101,102,115,44,32,97,110,100,32,102,117,110,115,41,44,32,97,110,100,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,101,120,116,101,114,110,97,108,32,102,117,110,99,116,105,111,110,32,114,101,102,101,114,101,110,99,101,115,46,32,78,111,110,101,32,111,102,32,116,104,111,115,101,32,114,101,115,111,117,114,99,101,115,32,97,114,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,44,32,115,111,32,117,110,99,104,101,99,107,101,100,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,109,32,99,97,110,32,101,120,104,97,117,115,116,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,98,97,100,32,97,114,103,117,109,101,110,116,10,62,32,104,101,108,108,111,46,10,104,101,108,108,111,10,62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,104,101,108,108,111>>]}]}]},{dt,[],[{code,[],[<<117,115,101,100>>]}]},{dd,[],[{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<123,84,101,114,109,44,32,85,115,101,100,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<85,115,101,100>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,99,116,117,97,108,108,121,32,114,101,97,100,32,102,114,111,109,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46>>]},{pre,[],[{code,[],[<<62,32,73,110,112,117,116,32,61,32,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,44,34,119,111,114,108,100,34,62,62,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,44,49,49,57,44,49,49,49,44,49,49,52,44,49,48,56,44,49,48,48,62,62,10,62,32,123,84,101,114,109,44,32,85,115,101,100,125,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,73,110,112,117,116,44,32,91,117,115,101,100,93,41,46,10,123,104,101,108,108,111,44,32,57,125,10,62,32,115,112,108,105,116,95,98,105,110,97,114,121,40,73,110,112,117,116,44,32,85,115,101,100,41,46,10,123,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,44,32,60,60,34,119,111,114,108,100,34,62,62,125>>]}]}]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<115,97,102,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,117,110,115,97,102,101,32,100,97,116,97,32,105,115,32,100,101,99,111,100,101,100,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,51>>,signature => [{attribute,496,spec,{{binary_to_term,2},[{type,496,bounded_fun,[{type,496,'fun',[{type,496,product,[{var,496,'Binary'},{var,496,'Opts'}]},{type,496,union,[{type,496,term,[]},{type,496,tuple,[{type,496,term,[]},{var,496,'Used'}]}]}]},[{type,497,constraint,[{atom,497,is_subtype},[{var,497,'Binary'},{user_type,497,ext_binary,[]}]]},{type,498,constraint,[{atom,498,is_subtype},[{var,498,'Opt'},{type,498,union,[{atom,498,safe},{atom,498,used}]}]]},{type,499,constraint,[{atom,499,is_subtype},[{var,499,'Opts'},{type,499,list,[{var,499,'Opt'}]}]]},{type,500,constraint,[{atom,500,is_subtype},[{var,500,'Used'},{type,500,pos_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,bit_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,506}],[<<98,105,116,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,105,116,115,32,111,102,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,116,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,49,57,10,62,32,98,105,116,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,50,52>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,55>>,signature => [{attribute,506,spec,{{bit_size,1},[{type,506,bounded_fun,[{type,506,'fun',[{type,506,product,[{var,506,'Bitstring'}]},{type,506,non_neg_integer,[]}]},[{type,507,constraint,[{atom,507,is_subtype},[{var,507,'Bitstring'},{type,507,bitstring,[]}]]}]]}]}}]}},{{function,bitstring_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,512}],[<<98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,108,105,115,116,32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,49,45,55,32,98,105,116,115,46,32,69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,62,62,41,46,10,91,49,44,49,55,55,93>>]}]},{pre,[],[{code,[],[<<62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,91,49,44,49,55,55,44,60,60,51,58,51,62,62,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,57,50>>,signature => [{attribute,512,spec,{{bitstring_to_list,1},[{type,512,bounded_fun,[{type,512,'fun',[{type,512,product,[{var,512,'Bitstring'}]},{type,512,list,[{type,512,union,[{type,512,byte,[]},{type,512,bitstring,[]}]}]}]},[{type,513,constraint,[{atom,513,is_subtype},[{var,513,'Bitstring'},{type,513,bitstring,[]}]]}]]}]}}]}},{{function,bump_reductions,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,518}],[<<98,117,109,112,95,114,101,100,117,99,116,105,111,110,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,105,115,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,99,114,101,109,101,110,116,115,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,73,110,32,116,104,101,32,66,101,97,109,32,101,109,117,108,97,116,111,114,44,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,105,115,32,110,111,114,109,97,108,108,121,32,105,110,99,114,101,109,101,110,116,101,100,32,98,121,32,111,110,101,32,102,111,114,32,101,97,99,104,32,102,117,110,99,116,105,111,110,32,97,110,100,32,66,73,70,32,99,97,108,108,46,32,65,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,32,105,115,32,102,111,114,99,101,100,32,119,104,101,110,32,116,104,101,32,99,111,117,110,116,101,114,32,114,101,97,99,104,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,40,52,48,48,48,32,114,101,100,117,99,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,49,57,46,50,32,97,110,100,32,108,97,116,101,114,41,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,99,97,110,32,98,101,32,114,101,109,111,118,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,66,101,97,109,32,109,97,99,104,105,110,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,119,97,114,110,105,110,103,46,32,73,116,32,105,115,32,117,110,108,105,107,101,108,121,32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,111,116,104,101,114,32,69,114,108,97,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,48,57>>,signature => [{attribute,518,spec,{{erlang,bump_reductions,1},[{type,518,bounded_fun,[{type,518,'fun',[{type,518,product,[{var,518,'Reductions'}]},{atom,518,true}]},[{type,519,constraint,[{atom,519,is_subtype},[{var,519,'Reductions'},{type,519,pos_integer,[]}]]}]]}]}}]}},{{function,byte_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,525}],[<<98,121,116,101,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,110,101,101,100,101,100,32,116,111,32,99,111,110,116,97,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<46,32,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,32,114,111,117,110,100,101,100,32>>,{em,[],[<<117,112>>]},<<46,32,69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,98,121,116,101,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,50,55>>,signature => [{attribute,525,spec,{{byte_size,1},[{type,525,bounded_fun,[{type,525,'fun',[{type,525,product,[{var,525,'Bitstring'}]},{type,525,non_neg_integer,[]}]},[{type,526,constraint,[{atom,526,is_subtype},[{var,526,'Bitstring'},{type,526,bitstring,[]}]]}]]}]}}]}},{{function,cancel_timer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,537}],[<<99,97,110,99,101,108,95,116,105,109,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<67,97,110,99,101,108,115,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,52,52>>,signature => [{attribute,537,spec,{{erlang,cancel_timer,1},[{type,537,bounded_fun,[{type,537,'fun',[{type,537,product,[{var,537,'TimerRef'}]},{var,537,'Result'}]},[{type,538,constraint,[{atom,538,is_subtype},[{var,538,'TimerRef'},{type,538,reference,[]}]]},{type,539,constraint,[{atom,539,is_subtype},[{var,539,'Time'},{type,539,non_neg_integer,[]}]]},{type,540,constraint,[{atom,540,is_subtype},[{var,540,'Result'},{type,540,union,[{var,540,'Time'},{atom,540,false}]}]]}]]}]}}]}},{{function,cancel_timer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,546}],[<<99,97,110,99,101,108,95,116,105,109,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<67,97,110,99,101,108,115,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114>>]}]},<<46,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,119,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,65,115,121,110,99,125>>]}]},{dd,[],[{p,[],[<<65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,99,97,110,99,101,108,32,111,112,101,114,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,84,104,97,116,32,105,115,44,32>>,{code,[],[<<99,97,110,99,101,108,95,116,105,109,101,114,40,41>>]},<<32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,105,110,102,111,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<82,101,113,117,101,115,116,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,111,102,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,103,105,118,101,110,46,32,87,104,101,110,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,105,115,32,103,105,118,101,110,46>>]},{ul,[],[{li,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<58,32,105,102,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41>>]},<<46,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<111,107>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{li,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<58,32,105,102,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,99,97,110,99,101,108,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41>>]},<<32,119,104,101,110,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,44,32,111,116,104,101,114,119,105,115,101,32,110,111,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46>>]}]}]}]}]},{p,[],[<<77,111,114,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,109,97,121,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,32,99,97,110,99,101,108,101,100,32,116,105,109,101,114,32,119,111,117,108,100,32,104,97,118,101,32,101,120,112,105,114,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,32,84,104,105,115,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,97,108,114,101,97,100,121,32,104,97,100,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,110,101,118,101,114,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,105,116,32,100,111,101,115,32,110,111,116,32,116,101,108,108,32,121,111,117,32,105,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,32,111,116,104,101,114,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,111,114,32,105,115,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,116,114,117,101,125>>]},<<46,32,73,102,32,117,115,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,102,97,108,115,101,125>>]},<<44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,98,108,111,99,107,115,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,97,100,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,52>>,signature => [{attribute,546,spec,{{erlang,cancel_timer,2},[{type,546,bounded_fun,[{type,546,'fun',[{type,546,product,[{var,546,'TimerRef'},{var,546,'Options'}]},{type,546,union,[{var,546,'Result'},{atom,546,ok}]}]},[{type,547,constraint,[{atom,547,is_subtype},[{var,547,'TimerRef'},{type,547,reference,[]}]]},{type,548,constraint,[{atom,548,is_subtype},[{var,548,'Async'},{type,548,boolean,[]}]]},{type,549,constraint,[{atom,549,is_subtype},[{var,549,'Info'},{type,549,boolean,[]}]]},{type,550,constraint,[{atom,550,is_subtype},[{var,550,'Option'},{type,550,union,[{type,550,tuple,[{atom,550,async},{var,550,'Async'}]},{type,550,tuple,[{atom,550,info},{var,550,'Info'}]}]}]]},{type,551,constraint,[{atom,551,is_subtype},[{var,551,'Options'},{type,551,list,[{var,551,'Option'}]}]]},{type,552,constraint,[{atom,552,is_subtype},[{var,552,'Time'},{type,552,non_neg_integer,[]}]]},{type,553,constraint,[{atom,553,is_subtype},[{var,553,'Result'},{type,553,union,[{var,553,'Time'},{atom,553,false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,ceil,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,560}],[<<99,101,105,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,99,101,105,108,40,53,46,53,41,46,10,54>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,51,54>>,signature => [{attribute,560,spec,{{ceil,1},[{type,560,bounded_fun,[{type,560,'fun',[{type,560,product,[{var,560,'Number'}]},{type,560,integer,[]}]},[{type,561,constraint,[{atom,561,is_subtype},[{var,561,'Number'},{type,561,number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,check_old_code,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,566}],[<<99,104,101,99,107,95,111,108,100,95,99,111,100,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,104,97,115,32,111,108,100,32,99,111,100,101,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,52,57>>,signature => [{attribute,566,spec,{{check_old_code,1},[{type,566,bounded_fun,[{type,566,'fun',[{type,566,product,[{var,566,'Module'}]},{type,566,boolean,[]}]},[{type,567,constraint,[{atom,567,is_subtype},[{var,567,'Module'},{type,567,module,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,check_process_code,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,572}],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,44,32,91,93,41>>]},<<32>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,54,48>>,signature => [{attribute,572,spec,{{check_process_code,2},[{type,572,bounded_fun,[{type,572,'fun',[{type,572,product,[{var,572,'Pid'},{var,572,'Module'}]},{var,572,'CheckResult'}]},[{type,573,constraint,[{atom,573,is_subtype},[{var,573,'Pid'},{type,573,pid,[]}]]},{type,574,constraint,[{atom,574,is_subtype},[{var,574,'Module'},{type,574,module,[]}]]},{type,575,constraint,[{atom,575,is_subtype},[{var,575,'CheckResult'},{type,575,boolean,[]}]]}]]}]}}]}},{{function,check_process_code,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,584}],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,104,101,99,107,115,32,105,102,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,98,111,111,108,101,97,110,40,41,125>>]}]},{dd,[],[{p,[],[<<68,101,116,101,114,109,105,110,101,115,32,105,102,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,108,108,111,119,101,100,32,119,104,101,110,32,112,101,114,102,111,114,109,105,110,103,32,116,104,101,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32>>,{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125>>]},<<32,105,115,32,112,97,115,115,101,100,44,32,97,110,100,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,110,101,101,100,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,97,98,111,114,116,101,100,32,40,115,101,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32>>,{code,[],[<<67,104,101,99,107,82,101,115,117,108,116>>]},<<32,98,101,108,111,119,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,111,32,97,108,108,111,119,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,116,104,97,116,32,105,115,44,32>>,{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,116,114,117,101,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51>>]},<<32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,44,32,82,101,113,117,101,115,116,73,100,44,32,67,104,101,99,107,82,101,115,117,108,116,125>>]},<<46>>]}]}]},{p,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<115,101,108,102,40,41>>]},<<44,32,97,110,100,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,97,110,100,32,105,115,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32>>,{code,[],[<<67,104,101,99,107,82,101,115,117,108,116>>]},<<32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<67,104,101,99,107,82,101,115,117,108,116>>]},<<32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,99,111,110,116,97,105,110,115,32,102,117,110,115,32,116,104,97,116,32,114,101,102,101,114,101,110,99,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<97,98,111,114,116,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,97,98,111,114,116,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,101,101,100,101,100,32,116,111,32,98,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,114,101,113,117,101,115,116,101,100,32,98,121,32,112,97,115,115,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125>>]},<<46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<85,112,32,117,110,116,105,108,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,42,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,99,104,101,99,107,115,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,111,108,100,32,99,111,100,101,46,32,84,104,97,116,32,105,115,44,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40,101,46,103,46,32,114,101,116,117,114,110,32,97,100,100,114,101,115,115,101,115,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,41,44,32,105,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40>>,{code,[],[<<102,117,110>>]},<<115,32,105,110,32,112,114,111,99,101,115,115,32,99,111,110,116,101,120,116,41,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,108,105,116,101,114,97,108,115,32,105,110,32,116,104,101,32,99,111,100,101,46>>]},{p,[],[<<65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,111,110,108,121,32,99,104,101,99,107,115,32,102,111,114,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,99,111,100,101,46,32,73,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,118,105,97,32>>,{code,[],[<<102,117,110>>]},<<115,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,46,32,73,102,32,115,117,99,104,32>>,{code,[],[<<102,117,110>>]},<<115,32,101,120,105,115,116,32,97,110,100,32,97,114,101,32,117,115,101,100,32,97,102,116,101,114,32,97,32,112,117,114,103,101,32,111,102,32,116,104,101,32,111,108,100,32,99,111,100,101,44,32,97,110,32,101,120,99,101,112,116,105,111,110,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,112,111,110,32,117,115,97,103,101,32,40,115,97,109,101,32,97,115,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32>>,{code,[],[<<102,117,110>>]},<<32,105,115,32,114,101,99,101,105,118,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,97,102,116,101,114,32,116,104,101,32,112,117,114,103,101,41,46,32,76,105,116,101,114,97,108,115,32,119,105,108,108,32,98,101,32,116,97,107,101,110,32,99,97,114,101,32,111,102,32,40,99,111,112,105,101,100,41,32,97,116,32,97,32,108,97,116,101,114,32,115,116,97,103,101,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,99,97,110,32,97,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,49,32,98,101,32,101,110,97,98,108,101,100,32,119,104,101,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,105,110,115,116,97,108,108,97,116,105,111,110,95,103,117,105,100,101,58,73,78,83,84,65,76,76,35,65,100,118,97,110,99,101,100,45,99,111,110,102,105,103,117,114,97,116,105,111,110,45,97,110,100,45,98,117,105,108,100,45,111,102,45,69,114,108,97,110,103,79,84,80,95,67,111,110,102,105,103,117,114,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<98,117,105,108,100,105,110,103,32,79,84,80>>]},<<44,32,97,110,100,32,119,105,108,108,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,98,101,32,101,110,97,98,108,101,100,32,105,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,32,115,117,112,112,111,114,116,32,105,115,32,101,110,97,98,108,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,55,49>>,signature => [{attribute,584,spec,{{check_process_code,3},[{type,584,bounded_fun,[{type,584,'fun',[{type,584,product,[{var,584,'Pid'},{var,584,'Module'},{var,584,'OptionList'}]},{type,584,union,[{var,584,'CheckResult'},{atom,584,async}]}]},[{type,585,constraint,[{atom,585,is_subtype},[{var,585,'Pid'},{type,585,pid,[]}]]},{type,586,constraint,[{atom,586,is_subtype},[{var,586,'Module'},{type,586,module,[]}]]},{type,587,constraint,[{atom,587,is_subtype},[{var,587,'RequestId'},{type,587,term,[]}]]},{type,588,constraint,[{atom,588,is_subtype},[{var,588,'Option'},{type,588,union,[{type,588,tuple,[{atom,588,async},{var,588,'RequestId'}]},{type,588,tuple,[{atom,588,allow_gc},{type,588,boolean,[]}]}]}]]},{type,589,constraint,[{atom,589,is_subtype},[{var,589,'OptionList'},{type,589,list,[{var,589,'Option'}]}]]},{type,590,constraint,[{atom,590,is_subtype},[{var,590,'CheckResult'},{type,590,union,[{type,590,boolean,[]},{atom,590,aborted}]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,convert_time_unit,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1556}],[<<99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32>>,{code,[],[<<70,114,111,109,85,110,105,116>>]},<<32,116,111,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<67,111,110,118,101,114,116,101,100,84,105,109,101>>]},<<32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32>>,{code,[],[<<84,111,85,110,105,116>>]},<<46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,117,115,105,110,103,32,116,104,101,32,102,108,111,111,114,32,102,117,110,99,116,105,111,110,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<89,111,117,32,99,97,110,32,108,111,115,101,32,97,99,99,117,114,97,99,121,32,97,110,100,32,112,114,101,99,105,115,105,111,110,32,119,104,101,110,32,99,111,110,118,101,114,116,105,110,103,32,98,101,116,119,101,101,110,32,116,105,109,101,32,117,110,105,116,115,46,32,84,111,32,109,105,110,105,109,105,122,101,32,115,117,99,104,32,108,111,115,115,44,32,99,111,108,108,101,99,116,32,97,108,108,32,100,97,116,97,32,97,116,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,100,111,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,111,110,32,116,104,101,32,101,110,100,32,114,101,115,117,108,116,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,55,52>>,signature => [{attribute,1556,spec,{{erlang,convert_time_unit,3},[{type,1556,bounded_fun,[{type,1556,'fun',[{type,1556,product,[{var,1556,'Time'},{var,1556,'FromUnit'},{var,1556,'ToUnit'}]},{var,1556,'ConvertedTime'}]},[{type,1557,constraint,[{atom,1557,is_subtype},[{var,1557,'Time'},{type,1557,integer,[]}]]},{type,1558,constraint,[{atom,1558,is_subtype},[{var,1558,'ConvertedTime'},{type,1558,integer,[]}]]},{type,1559,constraint,[{atom,1559,is_subtype},[{var,1559,'FromUnit'},{user_type,1559,time_unit,[]}]]},{type,1560,constraint,[{atom,1560,is_subtype},[{var,1560,'ToUnit'},{user_type,1560,time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,crc32,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,602}],[<<99,114,99,51,50,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,114,99,51,50,32,40,73,69,69,69,32,56,48,50,46,51,32,115,116,121,108,101,41,32,99,104,101,99,107,115,117,109,32,102,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,57,50>>,signature => [{attribute,602,spec,{{erlang,crc32,1},[{type,602,bounded_fun,[{type,602,'fun',[{type,602,product,[{var,602,'Data'}]},{type,602,non_neg_integer,[]}]},[{type,603,constraint,[{atom,603,is_subtype},[{var,603,'Data'},{type,603,iodata,[]}]]}]]}]}}]}},{{function,crc32,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,608}],[<<99,114,99,51,50,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,32>>,{code,[],[<<79,108,100,67,114,99>>]},<<44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,88,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<89>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,48,49>>,signature => [{attribute,608,spec,{{erlang,crc32,2},[{type,608,bounded_fun,[{type,608,'fun',[{type,608,product,[{var,608,'OldCrc'},{var,608,'Data'}]},{type,608,non_neg_integer,[]}]},[{type,609,constraint,[{atom,609,is_subtype},[{var,609,'OldCrc'},{type,609,non_neg_integer,[]}]]},{type,610,constraint,[{atom,610,is_subtype},[{var,610,'Data'},{type,610,iodata,[]}]]}]]}]}}]}},{{function,crc32_combine,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,615}],[<<99,114,99,51,50,95,99,111,109,98,105,110,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,115,46,32,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,32,116,111,32,98,101,32,107,110,111,119,110,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,89,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<90>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,49,56>>,signature => [{attribute,615,spec,{{erlang,crc32_combine,3},[{type,615,bounded_fun,[{type,615,'fun',[{type,615,product,[{var,615,'FirstCrc'},{var,615,'SecondCrc'},{var,615,'SecondSize'}]},{type,615,non_neg_integer,[]}]},[{type,616,constraint,[{atom,616,is_subtype},[{var,616,'FirstCrc'},{type,616,non_neg_integer,[]}]]},{type,617,constraint,[{atom,617,is_subtype},[{var,617,'SecondCrc'},{type,617,non_neg_integer,[]}]]},{type,618,constraint,[{atom,618,is_subtype},[{var,618,'SecondSize'},{type,618,non_neg_integer,[]}]]}]]}]}}]}},{{function,date,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,623}],[<<100,97,116,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,115,32>>,{code,[],[<<123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125>>]},<<46>>]},{p,[],[<<84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,100,97,116,101,40,41,46,10,123,49,57,57,53,44,50,44,49,57,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,51,55>>,signature => [{attribute,623,spec,{{date,0},[{type,623,bounded_fun,[{type,623,'fun',[{type,623,product,[]},{var,623,'Date'}]},[{type,624,constraint,[{atom,624,is_subtype},[{var,624,'Date'},{remote_type,624,[{atom,624,calendar},{atom,624,date},[]]}]]}]]}]}}]}},{{function,decode_packet,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,629}],[<<100,101,99,111,100,101,95,112,97,99,107,101,116,47,51>>],#{<<101,110>> => [{p,[],[<<68,101,99,111,100,101,115,32,116,104,101,32,98,105,110,97,114,121,32>>,{code,[],[<<66,105,110>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,112,114,111,116,111,99,111,108,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<84,121,112,101>>]},<<46,32,83,105,109,105,108,97,114,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,100,111,110,101,32,98,121,32,115,111,99,107,101,116,115,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<123,112,97,99,107,101,116,44,84,121,112,101,125,46>>]}]},{p,[],[<<73,102,32,97,110,32,101,110,116,105,114,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32>>,{code,[],[<<66,105,110>>]},<<44,32,105,116,32,105,115,32,114,101,116,117,114,110,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,97,115,32>>,{code,[],[<<123,111,107,44,80,97,99,107,101,116,44,82,101,115,116,125>>]},<<46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,105,110>>]},<<32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,99,107,101,116,44,32>>,{code,[],[<<123,109,111,114,101,44,76,101,110,103,116,104,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32>>,{code,[],[<<76,101,110,103,116,104>>]},<<32,105,115,32,101,105,116,104,101,114,32,116,104,101,32,101,120,112,101,99,116,101,100,32>>,{em,[],[<<116,111,116,97,108,32,115,105,122,101>>]},<<32,111,102,32,116,104,101,32,112,97,99,107,101,116,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,101,120,112,101,99,116,101,100,32,112,97,99,107,101,116,32,115,105,122,101,32,105,115,32,117,110,107,110,111,119,110,46,32>>,{code,[],[<<100,101,99,111,100,101,95,112,97,99,107,101,116>>]},<<32,99,97,110,32,116,104,101,110,32,98,101,32,99,97,108,108,101,100,32,97,103,97,105,110,32,119,105,116,104,32,109,111,114,101,32,100,97,116,97,32,97,100,100,101,100,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,97,99,107,101,116,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,112,114,111,116,111,99,111,108,32,102,111,114,109,97,116,44,32>>,{code,[],[<<123,101,114,114,111,114,44,82,101,97,115,111,110,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<84,121,112,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<114,97,119,32,124,32,48>>]}]},{dd,[],[{p,[],[<<78,111,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,105,115,32,100,111,110,101,46,32,84,104,101,32,101,110,116,105,114,101,32,98,105,110,97,114,121,32,105,115,32,114,101,116,117,114,110,101,100,32,117,110,108,101,115,115,32,105,116,32,105,115,32,101,109,112,116,121,46>>]}]},{dt,[],[{code,[],[<<49,32,124,32,50,32,124,32,52>>]}]},{dd,[],[{p,[],[<<80,97,99,107,101,116,115,32,99,111,110,115,105,115,116,32,111,102,32,97,32,104,101,97,100,101,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,110,32,116,104,101,32,112,97,99,107,101,116,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,97,116,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46,32,84,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,104,101,97,100,101,114,32,99,97,110,32,98,101,32,111,110,101,44,32,116,119,111,44,32,111,114,32,102,111,117,114,32,98,121,116,101,115,59,32,116,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,98,121,116,101,115,32,105,115,32,98,105,103,45,101,110,100,105,97,110,46,32,84,104,101,32,104,101,97,100,101,114,32,105,115,32,115,116,114,105,112,112,101,100,32,111,102,102,32,119,104,101,110,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{code,[],[<<108,105,110,101>>]}]},{dd,[],[{p,[],[<<65,32,112,97,99,107,101,116,32,105,115,32,97,32,108,105,110,101,45,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,44,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,32,108,97,116,105,110,45,49,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,32,105,115,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,112,97,99,107,101,116,32,117,110,108,101,115,115,32,116,104,101,32,108,105,110,101,32,119,97,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,111,112,116,105,111,110,32>>,{code,[],[<<108,105,110,101,95,108,101,110,103,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<97,115,110,49,32,124,32,99,100,114,32,124,32,115,117,110,114,109,32,124,32,102,99,103,105,32,124,32,116,112,107,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,104,101,97,100,101,114,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,115,116,114,105,112,112,101,100,32,111,102,102,46>>]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,115,110,49>>]},<<32,45,32,65,83,78,46,49,32,66,69,82>>]},{dd,[],[]},{dt,[],[{code,[],[<<115,117,110,114,109>>]},<<32,45,32,83,117,110,39,115,32,82,80,67,32,101,110,99,111,100,105,110,103>>]},{dd,[],[]},{dt,[],[{code,[],[<<99,100,114>>]},<<32,45,32,67,79,82,66,65,32,40,71,73,79,80,32,49,46,49,41>>]},{dd,[],[]},{dt,[],[{code,[],[<<102,99,103,105>>]},<<32,45,32,70,97,115,116,32,67,71,73>>]},{dd,[],[]},{dt,[],[{code,[],[<<116,112,107,116>>]},<<32,45,32,84,80,75,84,32,102,111,114,109,97,116,32,91,82,70,67,49,48,48,54,93>>]},{dd,[],[]}]}]},{dt,[],[{code,[],[<<104,116,116,112,32,124,32,104,116,116,112,104,32,124,32,104,116,116,112,95,98,105,110,32,124,32,104,116,116,112,104,95,98,105,110>>]}]},{dd,[],[{p,[],[<<84,104,101,32,72,121,112,101,114,116,101,120,116,32,84,114,97,110,115,102,101,114,32,80,114,111,116,111,99,111,108,46,32,84,104,101,32,112,97,99,107,101,116,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,119,105,116,104,32,116,104,101,32,102,111,114,109,97,116,32,97,99,99,111,114,100,105,110,103,32,116,111,32>>,{code,[],[<<72,116,116,112,80,97,99,107,101,116>>]},<<32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46,32,65,32,112,97,99,107,101,116,32,105,115,32,101,105,116,104,101,114,32,97,32,114,101,113,117,101,115,116,44,32,97,32,114,101,115,112,111,110,115,101,44,32,97,32,104,101,97,100,101,114,44,32,111,114,32,97,110,32,101,110,100,32,111,102,32,104,101,97,100,101,114,32,109,97,114,107,46,32,73,110,118,97,108,105,100,32,108,105,110,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32>>,{code,[],[<<72,116,116,112,69,114,114,111,114>>]},<<46>>]},{p,[],[<<82,101,99,111,103,110,105,122,101,100,32,114,101,113,117,101,115,116,32,109,101,116,104,111,100,115,32,97,110,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,97,116,111,109,115,46,32,79,116,104,101,114,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,115,116,114,105,110,103,115,46,32,83,116,114,105,110,103,115,32,111,102,32,117,110,114,101,99,111,103,110,105,122,101,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,102,111,114,109,97,116,116,101,100,32,119,105,116,104,32,111,110,108,121,32,99,97,112,105,116,97,108,32,108,101,116,116,101,114,115,32,102,105,114,115,116,32,97,110,100,32,97,102,116,101,114,32,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<34,83,101,99,45,87,101,98,115,111,99,107,101,116,45,75,101,121,34>>]},<<46,32,72,101,97,100,101,114,32,102,105,101,108,100,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,32,114,101,116,117,114,110,101,100,32,105,110,32>>,{code,[],[<<85,110,109,111,100,105,102,105,101,100,70,105,101,108,100>>]},<<32,97,115,32,115,116,114,105,110,103,115,44,32,119,105,116,104,111,117,116,32,97,110,121,32,99,111,110,118,101,114,115,105,111,110,32,111,114,32,102,111,114,109,97,116,116,105,110,103,46>>]},{p,[],[<<84,104,101,32,112,114,111,116,111,99,111,108,32,116,121,112,101,32>>,{code,[],[<<104,116,116,112>>]},<<32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,108,105,110,101,32,119,104,101,110,32,97,110,32>>,{code,[],[<<72,116,116,112,82,101,113,117,101,115,116>>]},<<32,111,114,32,97,110,32>>,{code,[],[<<72,116,116,112,82,101,115,112,111,110,115,101>>]},<<32,105,115,32,101,120,112,101,99,116,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,97,114,101,32,116,111,32,117,115,101,32>>,{code,[],[<<104,116,116,112,104>>]},<<32,116,111,32,103,101,116,32>>,{code,[],[<<72,116,116,112,72,101,97,100,101,114>>]},<<115,32,117,110,116,105,108,32>>,{code,[],[<<104,116,116,112,95,101,111,104>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,105,99,104,32,109,97,114,107,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,104,101,97,100,101,114,115,32,97,110,100,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,109,101,115,115,97,103,101,32,98,111,100,121,46>>]},{p,[],[<<84,104,101,32,118,97,114,105,97,110,116,115,32>>,{code,[],[<<104,116,116,112,95,98,105,110>>]},<<32,97,110,100,32>>,{code,[],[<<104,116,116,112,104,95,98,105,110>>]},<<32,114,101,116,117,114,110,32,115,116,114,105,110,103,115,32,40>>,{code,[],[<<72,116,116,112,83,116,114,105,110,103>>]},<<41,32,97,115,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,108,105,115,116,115,46>>]}]}]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,97,99,107,101,116,95,115,105,122,101,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,115,105,122,101,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,98,111,100,121,46,32,73,102,32,116,104,101,32,112,97,99,107,101,116,32,104,101,97,100,101,114,32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,108,101,110,103,116,104,44,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,105,110,118,97,108,105,100,46,32,68,101,102,97,117,108,116,115,32,116,111,32,48,44,32,119,104,105,99,104,32,109,101,97,110,115,32,110,111,32,115,105,122,101,32,108,105,109,105,116,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,101,95,108,101,110,103,116,104,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32>>,{code,[],[<<108,105,110,101>>]},<<44,32,108,105,110,101,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,101,32,105,110,100,105,99,97,116,101,100,32,108,101,110,103,116,104,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46>>]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<108,105,110,101,95,108,101,110,103,116,104>>]},<<32,97,108,115,111,32,97,112,112,108,105,101,115,32,116,111,32>>,{code,[],[<<104,116,116,112,42>>]},<<32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,115,32,97,110,32,97,108,105,97,115,32,102,111,114,32,111,112,116,105,111,110,32>>,{code,[],[<<112,97,99,107,101,116,95,115,105,122,101>>]},<<32,105,102,32>>,{code,[],[<<112,97,99,107,101,116,95,115,105,122,101>>]},<<32,105,116,115,101,108,102,32,105,115,32,110,111,116,32,115,101,116,46,32,84,104,105,115,32,117,115,101,32,105,115,32,111,110,108,121,32,105,110,116,101,110,100,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,101,95,100,101,108,105,109,105,116,101,114,44,32,48,32,61,60,32,98,121,116,101,40,41,32,61,60,32,50,53,53,125>>]}]},{dd,[],[{p,[],[<<70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32>>,{code,[],[<<108,105,110,101>>]},<<44,32,115,101,116,115,32,116,104,101,32,100,101,108,105,109,105,116,105,110,103,32,98,121,116,101,46,32,68,101,102,97,117,108,116,32,105,115,32,116,104,101,32,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32>>,{code,[],[<<36,92,110>>]},<<46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,51,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,111,107,44,60,60,34,97,98,99,34,62,62,44,60,60,34,100,34,62,62,125,10,62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,53,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,109,111,114,101,44,54,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,53,50>>,signature => [{attribute,629,spec,{{erlang,decode_packet,3},[{type,629,bounded_fun,[{type,629,'fun',[{type,629,product,[{var,629,'Type'},{var,629,'Bin'},{var,629,'Options'}]},{type,630,union,[{type,630,tuple,[{atom,630,ok},{var,630,'Packet'},{var,630,'Rest'}]},{type,631,tuple,[{atom,631,more},{var,631,'Length'}]},{type,632,tuple,[{atom,632,error},{var,632,'Reason'}]}]}]},[{type,633,constraint,[{atom,633,is_subtype},[{var,633,'Type'},{type,633,union,[{atom,633,raw},{integer,633,0},{integer,633,1},{integer,633,2},{integer,633,4},{atom,633,asn1},{atom,633,cdr},{atom,633,sunrm},{atom,633,fcgi},{atom,634,tpkt},{atom,634,line},{atom,634,http},{atom,634,http_bin},{atom,634,httph},{atom,634,httph_bin}]}]]},{type,635,constraint,[{atom,635,is_subtype},[{var,635,'Bin'},{type,635,binary,[]}]]},{type,636,constraint,[{atom,636,is_subtype},[{var,636,'Options'},{type,636,list,[{var,636,'Opt'}]}]]},{type,637,constraint,[{atom,637,is_subtype},[{var,637,'Opt'},{type,637,union,[{type,637,tuple,[{atom,637,packet_size},{type,637,non_neg_integer,[]}]},{type,638,tuple,[{atom,638,line_length},{type,638,non_neg_integer,[]}]}]}]]},{type,639,constraint,[{atom,639,is_subtype},[{var,639,'Packet'},{type,639,union,[{type,639,binary,[]},{var,639,'HttpPacket'}]}]]},{type,640,constraint,[{atom,640,is_subtype},[{var,640,'Rest'},{type,640,binary,[]}]]},{type,641,constraint,[{atom,641,is_subtype},[{var,641,'Length'},{type,641,union,[{type,641,non_neg_integer,[]},{atom,641,undefined}]}]]},{type,642,constraint,[{atom,642,is_subtype},[{var,642,'Reason'},{type,642,term,[]}]]},{type,643,constraint,[{atom,643,is_subtype},[{var,643,'HttpPacket'},{type,643,union,[{var,643,'HttpRequest'},{var,644,'HttpResponse'},{var,645,'HttpHeader'},{atom,646,http_eoh},{var,647,'HttpError'}]}]]},{type,648,constraint,[{atom,648,is_subtype},[{var,648,'HttpRequest'},{type,648,tuple,[{atom,648,http_request},{var,648,'HttpMethod'},{var,648,'HttpUri'},{var,648,'HttpVersion'}]}]]},{type,649,constraint,[{atom,649,is_subtype},[{var,649,'HttpResponse'},{type,649,tuple,[{atom,649,http_response},{var,649,'HttpVersion'},{type,649,integer,[]},{var,649,'HttpString'}]}]]},{type,650,constraint,[{atom,650,is_subtype},[{var,650,'HttpHeader'},{type,650,tuple,[{atom,650,http_header},{type,651,integer,[]},{var,652,'HttpField'},{ann_type,653,[{var,653,'UnmodifiedField'},{var,653,'HttpString'}]},{ann_type,654,[{var,654,'Value'},{var,654,'HttpString'}]}]}]]},{type,655,constraint,[{atom,655,is_subtype},[{var,655,'HttpError'},{type,655,tuple,[{atom,655,http_error},{var,655,'HttpString'}]}]]},{type,656,constraint,[{atom,656,is_subtype},[{var,656,'HttpMethod'},{type,656,union,[{atom,656,'OPTIONS'},{atom,656,'GET'},{atom,656,'HEAD'},{atom,656,'POST'},{atom,656,'PUT'},{atom,656,'DELETE'},{atom,657,'TRACE'},{var,657,'HttpString'}]}]]},{type,658,constraint,[{atom,658,is_subtype},[{var,658,'HttpUri'},{type,658,union,[{atom,658,'*'},{type,659,tuple,[{atom,659,absoluteURI},{type,660,union,[{atom,660,http},{atom,660,https}]},{ann_type,661,[{var,661,'Host'},{var,661,'HttpString'}]},{ann_type,662,[{var,662,'Port'},{type,662,union,[{remote_type,662,[{atom,662,inet},{atom,662,port_number},[]]},{atom,662,undefined}]}]},{ann_type,663,[{var,663,'Path'},{var,663,'HttpString'}]}]},{type,664,tuple,[{atom,664,scheme},{ann_type,664,[{var,664,'Scheme'},{var,664,'HttpString'}]},{var,664,'HttpString'}]},{type,665,tuple,[{atom,665,abs_path},{var,665,'HttpString'}]},{var,666,'HttpString'}]}]]},{type,667,constraint,[{atom,667,is_subtype},[{var,667,'HttpVersion'},{type,667,tuple,[{ann_type,667,[{var,667,'Major'},{type,667,non_neg_integer,[]}]},{ann_type,667,[{var,667,'Minor'},{type,667,non_neg_integer,[]}]}]}]]},{type,668,constraint,[{atom,668,is_subtype},[{var,668,'HttpField'},{type,668,union,[{atom,668,'Cache-Control'},{atom,669,'Connection'},{atom,670,'Date'},{atom,671,'Pragma'},{atom,672,'Transfer-Encoding'},{atom,673,'Upgrade'},{atom,674,'Via'},{atom,675,'Accept'},{atom,676,'Accept-Charset'},{atom,677,'Accept-Encoding'},{atom,678,'Accept-Language'},{atom,679,'Authorization'},{atom,680,'From'},{atom,681,'Host'},{atom,682,'If-Modified-Since'},{atom,683,'If-Match'},{atom,684,'If-None-Match'},{atom,685,'If-Range'},{atom,686,'If-Unmodified-Since'},{atom,687,'Max-Forwards'},{atom,688,'Proxy-Authorization'},{atom,689,'Range'},{atom,690,'Referer'},{atom,691,'User-Agent'},{atom,692,'Age'},{atom,693,'Location'},{atom,694,'Proxy-Authenticate'},{atom,695,'Public'},{atom,696,'Retry-After'},{atom,697,'Server'},{atom,698,'Vary'},{atom,699,'Warning'},{atom,700,'Www-Authenticate'},{atom,701,'Allow'},{atom,702,'Content-Base'},{atom,703,'Content-Encoding'},{atom,704,'Content-Language'},{atom,705,'Content-Length'},{atom,706,'Content-Location'},{atom,707,'Content-Md5'},{atom,708,'Content-Range'},{atom,709,'Content-Type'},{atom,710,'Etag'},{atom,711,'Expires'},{atom,712,'Last-Modified'},{atom,713,'Accept-Ranges'},{atom,714,'Set-Cookie'},{atom,715,'Set-Cookie2'},{atom,716,'X-Forwarded-For'},{atom,717,'Cookie'},{atom,718,'Keep-Alive'},{atom,719,'Proxy-Connection'},{var,720,'HttpString'}]}]]},{type,721,constraint,[{atom,721,is_subtype},[{var,721,'HttpString'},{type,721,union,[{type,721,string,[]},{type,721,binary,[]}]}]]}]]}]}}]}},{{function,delete_element,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,726}],[<<100,101,108,101,116,101,95,101,108,101,109,101,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32,97,116,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,100,101,108,101,116,101,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,41,46,10,123,111,110,101,44,116,104,114,101,101,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,54,52>>,signature => [{attribute,726,spec,{{erlang,delete_element,2},[{type,726,bounded_fun,[{type,726,'fun',[{type,726,product,[{var,726,'Index'},{var,726,'Tuple1'}]},{var,726,'Tuple2'}]},[{type,727,constraint,[{atom,727,is_subtype},[{var,727,'Index'},{type,727,pos_integer,[]}]]},{type,728,constraint,[{atom,728,is_subtype},[{var,728,'Tuple1'},{type,728,tuple,any}]]},{type,729,constraint,[{atom,729,is_subtype},[{var,729,'Tuple2'},{type,729,tuple,any}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,delete_module,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,734}],[<<100,101,108,101,116,101,95,109,111,100,117,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<77,97,107,101,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,98,101,99,111,109,101,32,111,108,100,32,99,111,100,101,32,97,110,100,32,100,101,108,101,116,101,115,32,97,108,108,32,114,101,102,101,114,101,110,99,101,115,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,102,114,111,109,32,116,104,101,32,101,120,112,111,114,116,32,116,97,98,108,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,114,101,32,97,108,114,101,97,100,121,32,105,115,32,97,110,32,111,108,100,32,118,101,114,115,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,55,55>>,signature => [{attribute,734,spec,{{delete_module,1},[{type,734,bounded_fun,[{type,734,'fun',[{type,734,product,[{var,734,'Module'}]},{type,734,union,[{atom,734,true},{atom,734,undefined}]}]},[{type,735,constraint,[{atom,735,is_subtype},[{var,735,'Module'},{type,735,module,[]}]]}]]}]}}]}},{{function,demonitor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,740}],[<<100,101,109,111,110,105,116,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,111,98,116,97,105,110,101,100,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,50>>]}]},<<44,32,116,104,105,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,32,73,102,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,114,101,97,100,121,32,116,117,114,110,101,100,32,111,102,102,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46>>]},{p,[],[<<79,110,99,101,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>]},<<32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,110,111,32>>,{code,[],[<<123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,44,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,44,32,119,105,108,108,32,98,101,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,32,72,111,119,101,118,101,114,44,32,97,32>>,{code,[],[<<123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,46,32,73,116,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,115,117,97,108,108,121,32,97,100,118,105,115,97,98,108,101,32,116,111,32,114,101,109,111,118,101,32,115,117,99,104,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,102,114,111,109,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>]},<<32,105,102,32,116,104,105,115,32,99,108,101,97,110,117,112,32,105,115,32,119,97,110,116,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,32,40,69,82,84,83,32,53,46,53,41,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,47,49>>]},<<32,98,101,104,97,118,101,100,32,99,111,109,112,108,101,116,101,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,114,101,97,99,104,101,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,84,104,105,115,32,104,97,100,32,111,110,101,32,117,110,100,101,115,105,114,97,98,108,101,32,101,102,102,101,99,116,46,32,89,111,117,32,99,111,117,108,100,32,110,101,118,101,114,32,107,110,111,119,32,119,104,101,110,32,121,111,117,32,119,101,114,101,32,103,117,97,114,97,110,116,101,101,100,32>>,{em,[],[<<110,111,116>>]},<<32,116,111,32,114,101,99,101,105,118,101,32,97,32>>,{code,[],[<<68,79,87,78>>]},<<32,109,101,115,115,97,103,101,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46>>]},{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,118,105,101,119,101,100,32,97,115,32,116,119,111,32,99,111,109,98,105,110,101,100,32,111,112,101,114,97,116,105,111,110,115,58,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,32,115,101,110,100,32,97,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,97,110,100,32,105,103,110,111,114,101,32,97,110,121,32,102,117,116,117,114,101,32,114,101,115,117,108,116,115,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32,73,116,32,105,115,32,97,110,32,101,114,114,111,114,32,105,102,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,109,111,110,105,116,111,114,105,110,103,32,115,116,97,114,116,101,100,32,98,121,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,32,97,108,108,32,115,117,99,104,32,99,97,115,101,115,32,97,114,101,32,99,104,101,97,112,32,116,111,32,99,104,101,99,107,46,32,73,102,32,99,104,101,99,107,105,110,103,32,105,115,32,99,104,101,97,112,44,32,116,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,32,105,102,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,105,115,32,97,32,114,101,109,111,116,101,32,114,101,102,101,114,101,110,99,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,57,53>>,signature => [{attribute,740,spec,{{demonitor,1},[{type,740,bounded_fun,[{type,740,'fun',[{type,740,product,[{var,740,'MonitorRef'}]},{atom,740,true}]},[{type,741,constraint,[{atom,741,is_subtype},[{var,741,'MonitorRef'},{type,741,reference,[]}]]}]]}]}}]}},{{function,demonitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,746}],[<<100,101,109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,117,110,108,101,115,115,32>>,{code,[],[<<105,110,102,111>>]},<<32,105,115,32,112,97,114,116,32,111,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<46>>]},{p,[],[{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,93,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>]}]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,108,117,115,104>>]}]},{dd,[],[{p,[],[<<82,101,109,111,118,101,115,32,40,111,110,101,41,32>>,{code,[],[<<123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,44,32,105,102,32,116,104,101,114,101,32,105,115,32,111,110,101,44,32,102,114,111,109,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46>>]},{p,[],[<<67,97,108,108,105,110,103,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,44,10,114,101,99,101,105,118,101,10,32,32,32,32,123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,101,110,100>>]}]}]},{dt,[],[{code,[],[<<105,110,102,111>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,102,111,117,110,100,32,97,110,100,32,114,101,109,111,118,101,100,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,110,111,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,97,110,100,32,119,105,108,108,32,110,111,116,32,98,101,32,100,101,108,105,118,101,114,101,100,46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32,99,111,117,108,100,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,112,114,111,98,97,98,108,121,32,98,101,99,97,117,115,101,32,115,111,109,101,111,110,101,32,97,108,114,101,97,100,121,32,104,97,115,32,112,108,97,99,101,100,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]}]}]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<105,110,102,111>>]},<<32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<102,108,117,115,104>>]},<<44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,97,32,102,108,117,115,104,32,119,97,115,32,110,101,101,100,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<84,104,101,32,115,97,109,101,32,102,97,105,108,117,114,101,32,97,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,47,49>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,51,55>>,signature => [{attribute,746,spec,{{demonitor,2},[{type,746,bounded_fun,[{type,746,'fun',[{type,746,product,[{var,746,'MonitorRef'},{var,746,'OptionList'}]},{type,746,boolean,[]}]},[{type,747,constraint,[{atom,747,is_subtype},[{var,747,'MonitorRef'},{type,747,reference,[]}]]},{type,748,constraint,[{atom,748,is_subtype},[{var,748,'OptionList'},{type,748,list,[{var,748,'Option'}]}]]},{type,749,constraint,[{atom,749,is_subtype},[{var,749,'Option'},{type,749,union,[{atom,749,flush},{atom,749,info}]}]]}]]}]}}]}},{{function,disconnect_node,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3429}],[<<100,105,115,99,111,110,110,101,99,116,95,110,111,100,101,47,49>>],#{<<101,110>> => [{p,[],[<<70,111,114,99,101,115,32,116,104,101,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,111,102,32,97,32,110,111,100,101,46,32,84,104,105,115,32,97,112,112,101,97,114,115,32,116,111,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<32,97,115,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,104,97,115,32,99,114,97,115,104,101,100,46,32,84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,110,101,116,119,111,114,107,32,97,117,116,104,101,110,116,105,99,97,116,105,111,110,32,112,114,111,116,111,99,111,108,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,73,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<105,103,110,111,114,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,109,97,121,32,114,101,116,117,114,110,32,98,101,102,111,114,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,95,110,111,100,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,109,101,115,115,97,103,101,115>>]},<<32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,48,53>>,signature => [{attribute,3429,spec,{{disconnect_node,1},[{type,3429,bounded_fun,[{type,3429,'fun',[{type,3429,product,[{var,3429,'Node'}]},{type,3429,union,[{type,3429,boolean,[]},{atom,3429,ignored}]}]},[{type,3430,constraint,[{atom,3430,is_subtype},[{var,3430,'Node'},{type,3430,node,[]}]]}]]}]}}]}},{{function,display,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,773}],[<<100,105,115,112,108,97,121,47,49>>],#{<<101,110>> => [{p,[],[<<80,114,105,110,116,115,32,97,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,111,110,32,116,104,101,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,50,52>>,signature => [{attribute,773,spec,{{erlang,display,1},[{type,773,bounded_fun,[{type,773,'fun',[{type,773,product,[{var,773,'Term'}]},{atom,773,true}]},[{type,774,constraint,[{atom,774,is_subtype},[{var,774,'Term'},{type,774,term,[]}]]}]]}]}}]}},{{function,dist_ctrl_get_data,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3713}],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49>>],#{<<101,110>> => [{p,[],[<<71,101,116,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,115,115,101,100,32,116,111,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,46,32,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,73,102,32,110,111,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<110,111,110,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,101,32,99,97,110,32,114,101,113,117,101,115,116,32,116,111,32,98,101,32,105,110,102,111,114,109,101,100,32,98,121,32,97,32,109,101,115,115,97,103,101,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,40,68,72,97,110,100,108,101,41>>]}]},<<46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,119,104,101,110,32,116,104,101,114,101,32,97,114,101,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,99,111,110,102,105,103,117,114,101,100,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>]}]},<<32,102,117,110,99,116,105,111,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,51,54>>,signature => [{attribute,3713,spec,{{erlang,dist_ctrl_get_data,1},[{type,3713,bounded_fun,[{type,3713,'fun',[{type,3713,product,[{var,3713,'DHandle'}]},{type,3713,union,[{type,3713,tuple,[{var,3713,'Size'},{var,3713,'Data'}]},{var,3713,'Data'},{atom,3713,none}]}]},[{type,3714,constraint,[{atom,3714,is_subtype},[{var,3714,'Size'},{type,3714,non_neg_integer,[]}]]},{type,3715,constraint,[{atom,3715,is_subtype},[{var,3715,'DHandle'},{user_type,3715,dist_handle,[]}]]},{type,3716,constraint,[{atom,3716,is_subtype},[{var,3716,'Data'},{user_type,3716,iovec,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_get_opt,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3735}],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,111,112,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>]}]},<<32,102,117,110,99,116,105,111,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,55,55>>,signature => [{attribute,3735,spec,{{erlang,dist_ctrl_get_opt,2},[{type,3735,bounded_fun,[{type,3735,'fun',[{type,3735,product,[{var,3735,'DHandle'},{atom,3735,get_size}]},{var,3735,'Value'}]},[{type,3736,constraint,[{atom,3736,is_subtype},[{var,3736,'DHandle'},{user_type,3736,dist_handle,[]}]]},{type,3737,constraint,[{atom,3737,is_subtype},[{var,3737,'Value'},{type,3737,boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,dist_ctrl_get_data_notification,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3721}],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,113,117,101,115,116,32,110,111,116,105,102,105,99,97,116,105,111,110,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,102,101,116,99,104,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]}]},<<32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,87,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<100,105,115,116,95,100,97,116,97>>]},<<46,32,79,110,99,101,32,97,32>>,{code,[],[<<100,105,115,116,95,100,97,116,97>>]},<<32,109,101,115,115,97,103,101,115,32,104,97,115,32,98,101,101,110,32,115,101,110,116,44,32,110,111,32,109,111,114,101,32>>,{code,[],[<<100,105,115,116,95,100,97,116,97>>]},<<32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,115,101,110,116,32,117,110,116,105,108,32,116,104,101,32>>,{code,[],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49>>]},<<32,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,32,97,103,97,105,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,53,48,54>>,signature => [{attribute,3721,spec,{{erlang,dist_ctrl_get_data_notification,1},[{type,3721,bounded_fun,[{type,3721,'fun',[{type,3721,product,[{var,3721,'DHandle'}]},{atom,3721,ok}]},[{type,3722,constraint,[{atom,3722,is_subtype},[{var,3722,'DHandle'},{user_type,3722,dist_handle,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_input_handler,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3699}],[<<100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,103,105,115,116,101,114,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,79,110,99,101,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,44,32>>,{code,[],[<<73,110,112,117,116,72,97,110,100,108,101,114>>]},<<32,105,115,32,116,104,101,32,111,110,108,121,32,112,114,111,99,101,115,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,40,68,72,97,110,100,108,101,44,32,68,97,116,97,41>>]}]},<<32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,100,101,110,116,105,102,105,110,103,32,116,104,105,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,53,52,50>>,signature => [{attribute,3699,spec,{{erlang,dist_ctrl_input_handler,2},[{type,3699,bounded_fun,[{type,3699,'fun',[{type,3699,product,[{var,3699,'DHandle'},{var,3699,'InputHandler'}]},{atom,3699,ok}]},[{type,3700,constraint,[{atom,3700,is_subtype},[{var,3700,'DHandle'},{user_type,3700,dist_handle,[]}]]},{type,3701,constraint,[{atom,3701,is_subtype},[{var,3701,'InputHandler'},{type,3701,pid,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_put_data,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3706}],[<<100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50>>],#{<<101,110>> => [{p,[],[<<68,101,108,105,118,101,114,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,97,32,114,101,109,111,116,101,32,110,111,100,101,32,116,111,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,117,110,108,101,115,115,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,40,68,72,97,110,100,108,101,44,32,73,110,112,117,116,72,97,110,100,108,101,114,41>>]}]},<<46,32,73,102,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,44,32,111,110,108,121,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,53,55,53>>,signature => [{attribute,3706,spec,{{erlang,dist_ctrl_put_data,2},[{type,3706,bounded_fun,[{type,3706,'fun',[{type,3706,product,[{var,3706,'DHandle'},{var,3706,'Data'}]},{atom,3706,ok}]},[{type,3707,constraint,[{atom,3707,is_subtype},[{var,3707,'DHandle'},{user_type,3707,dist_handle,[]}]]},{type,3708,constraint,[{atom,3708,is_subtype},[{var,3708,'Data'},{type,3708,iodata,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_set_opt,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3727}],[<<100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,84,104,105,115,32,111,112,116,105,111,110,32,99,111,110,116,114,111,108,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,99,97,108,108,115,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,117,115,101,100,32,119,104,101,110,32,115,101,116,116,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,87,104,101,110,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,105,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[<<97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]},<<32,119,105,108,108,32,106,117,115,116,32,114,101,116,117,114,110,32>>,{code,[],[<<68,97,116,97>>]},<<32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,32,99,104,97,110,110,101,108,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,46>>]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[<<97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]},<<32,119,105,108,108,32,114,101,116,117,114,110,32>>,{code,[],[<<68,97,116,97>>]},<<32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,32,99,104,97,110,110,101,108,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32>>,{code,[],[<<83,105,122,101>>]},<<32,111,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,116,117,112,108,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,83,105,122,101,44,32,68,97,116,97,125>>]},<<46>>]}]},{p,[],[<<65,108,108,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,32,116,111,32,100,101,102,97,117,108,116,32,119,104,101,110,32,97,32,99,104,97,110,110,101,108,32,105,115,32,99,108,111,115,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,48,56>>,signature => [{attribute,3727,spec,{{erlang,dist_ctrl_set_opt,3},[{type,3727,bounded_fun,[{type,3727,'fun',[{type,3727,product,[{var,3727,'DHandle'},{atom,3727,get_size},{var,3727,'Value'}]},{var,3727,'OldValue'}]},[{type,3728,constraint,[{atom,3728,is_subtype},[{var,3728,'DHandle'},{user_type,3728,dist_handle,[]}]]},{type,3729,constraint,[{atom,3729,is_subtype},[{var,3729,'Value'},{type,3729,boolean,[]}]]},{type,3730,constraint,[{atom,3730,is_subtype},[{var,3730,'OldValue'},{type,3730,boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,element,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2116}],[<<101,108,101,109,101,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{code,[],[<<78>>]},<<116,104,32,101,108,101,109,101,110,116,32,40,110,117,109,98,101,114,105,110,103,32,102,114,111,109,32,49,41,32,111,102,32>>,{code,[],[<<84,117,112,108,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,108,101,109,101,110,116,40,50,44,32,123,97,44,32,98,44,32,99,125,41,46,10,98>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,53,55>>,signature => [{attribute,2116,spec,{{element,2},[{type,2116,bounded_fun,[{type,2116,'fun',[{type,2116,product,[{var,2116,'N'},{var,2116,'Tuple'}]},{type,2116,term,[]}]},[{type,2117,constraint,[{atom,2117,is_subtype},[{var,2117,'N'},{type,2117,pos_integer,[]}]]},{type,2118,constraint,[{atom,2118,is_subtype},[{var,2118,'Tuple'},{type,2118,tuple,any}]]}]]}]}}]}},{{function,erase,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,832}],[<<101,114,97,115,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,123,49,44,32,50,44,32,51,125,41,44,10,112,117,116,40,107,101,121,50,44,32,91,97,44,32,98,44,32,99,93,41,44,10,101,114,97,115,101,40,41,46,10,91,123,107,101,121,49,44,123,49,44,50,44,51,125,125,44,123,107,101,121,50,44,91,97,44,98,44,99,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,55,49>>,signature => [{attribute,832,spec,{{erase,0},[{type,832,bounded_fun,[{type,832,'fun',[{type,832,product,[]},{type,832,list,[{type,832,tuple,[{var,832,'Key'},{var,832,'Val'}]}]}]},[{type,833,constraint,[{atom,833,is_subtype},[{var,833,'Key'},{type,833,term,[]}]]},{type,834,constraint,[{atom,834,is_subtype},[{var,834,'Val'},{type,834,term,[]}]]}]]}]}}]}},{{function,erase,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,839}],[<<101,114,97,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<46,32,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,79,40>>,{code,[],[<<49>>]},<<41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40>>,{code,[],[<<78>>]},<<41,44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,123,109,101,114,114,121,44,32,108,97,109,98,115,44,32,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,88,32,61,32,101,114,97,115,101,40,107,101,121,49,41,44,10,123,88,44,32,101,114,97,115,101,40,107,101,121,49,41,125,46,10,123,123,109,101,114,114,121,44,108,97,109,98,115,44,97,114,101,44,112,108,97,121,105,110,103,125,44,117,110,100,101,102,105,110,101,100,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,56,53>>,signature => [{attribute,839,spec,{{erase,1},[{type,839,bounded_fun,[{type,839,'fun',[{type,839,product,[{var,839,'Key'}]},{type,839,union,[{var,839,'Val'},{atom,839,undefined}]}]},[{type,840,constraint,[{atom,840,is_subtype},[{var,840,'Key'},{type,840,term,[]}]]},{type,841,constraint,[{atom,841,is_subtype},[{var,841,'Val'},{type,841,term,[]}]]}]]}]}}]}},{{function,error,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,847}],[<<101,114,114,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,97,110,121,32,116,101,114,109,46,32,84,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,105,115,32>>,{code,[],[<<123,82,101,97,115,111,110,44,32,87,104,101,114,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<87,104,101,114,101>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,99,97,108,108,101,100,32,40,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,102,105,114,115,116,41,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,116,104,114,111,119,110,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,32,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,99,97,116,99,104,32,101,114,114,111,114,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,123,102,111,111,98,97,114,44,91,123,115,104,101,108,108,44,97,112,112,108,121,95,102,117,110,44,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,57,48,54,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,100,111,95,97,112,112,108,121,44,54,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,55,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,101,120,112,114,44,53,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,52,51,48,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,56,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,52,50,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,108,111,111,112,44,51,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,50,55,125,93,125,93,125,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,55,48,54>>,signature => [{attribute,847,spec,{{error,1},[{type,847,bounded_fun,[{type,847,'fun',[{type,847,product,[{var,847,'Reason'}]},{type,847,no_return,[]}]},[{type,848,constraint,[{atom,848,is_subtype},[{var,848,'Reason'},{type,848,term,[]}]]}]]}]}}]}},{{function,error,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,854}],[<<101,114,114,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,97,110,121,32,116,101,114,109,46,32,84,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,105,115,32>>,{code,[],[<<123,82,101,97,115,111,110,44,32,87,104,101,114,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<87,104,101,114,101>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,99,97,108,108,101,100,32,40,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,102,105,114,115,116,41,46,32>>,{code,[],[<<65,114,103,115>>]},<<32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,59,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,116,101,114,109,32>>,{code,[],[<<87,104,101,114,101>>]},<<46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,32,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,32,69,120,97,109,112,108,101,58>>]},{p,[],[{code,[],[<<116,101,115,116,46,101,114,108>>]},<<58>>]},{pre,[],[{code,[],[<<45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,101,120,97,109,112,108,101,95,102,117,110,47,50,93,41,46,10,10,101,120,97,109,112,108,101,95,102,117,110,40,65,49,44,32,65,50,41,32,45,62,10,32,32,32,32,101,114,108,97,110,103,58,101,114,114,111,114,40,109,121,95,101,114,114,111,114,44,32,91,65,49,44,32,65,50,93,41,46>>]}]},{p,[],[<<69,114,108,97,110,103,32,115,104,101,108,108,58>>]},{pre,[],[{code,[],[<<54,62,32,99,40,116,101,115,116,41,46,10,123,111,107,44,116,101,115,116,125,10,55,62,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,109,121,95,101,114,114,111,114,10,32,32,32,32,32,105,110,32,102,117,110,99,116,105,111,110,32,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,47,50,10,32,32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,97,115,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,10,32>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,55,51,53>>,signature => [{attribute,854,spec,{{error,2},[{type,854,bounded_fun,[{type,854,'fun',[{type,854,product,[{var,854,'Reason'},{var,854,'Args'}]},{type,854,no_return,[]}]},[{type,855,constraint,[{atom,855,is_subtype},[{var,855,'Reason'},{type,855,term,[]}]]},{type,856,constraint,[{atom,856,is_subtype},[{var,856,'Args'},{type,856,list,[{type,856,term,[]}]}]]}]]}]}}]}},{{function,error,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,862}],[<<101,114,114,111,114,47,51>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,97,110,121,32,116,101,114,109,46,32>>,{code,[],[<<65,114,103,115>>]},<<32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,59,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,46,32,73,102,32,116,104,101,32>>,{code,[],[<<123,101,114,114,111,114,95,105,110,102,111,44,32,69,114,114,111,114,73,110,102,111,77,97,112,125>>]},<<32,111,112,116,105,111,110,32,105,115,32,103,105,118,101,110,44,32,105,116,32,119,105,108,108,32,98,101,32,105,110,106,101,99,116,101,100,32,105,110,116,111,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46>>]},{p,[],[<<65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,32,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,55,55,53>>,signature => [{attribute,862,spec,{{error,3},[{type,862,bounded_fun,[{type,862,'fun',[{type,862,product,[{var,862,'Reason'},{var,862,'Args'},{var,862,'Options'}]},{type,862,no_return,[]}]},[{type,863,constraint,[{atom,863,is_subtype},[{var,863,'Reason'},{type,863,term,[]}]]},{type,864,constraint,[{atom,864,is_subtype},[{var,864,'Args'},{type,864,list,[{type,864,term,[]}]}]]},{type,865,constraint,[{atom,865,is_subtype},[{var,865,'Options'},{type,865,list,[{var,865,'Option'}]}]]},{type,866,constraint,[{atom,866,is_subtype},[{var,866,'Option'},{type,866,tuple,[{atom,866,error_info},{var,866,'ErrorInfoMap'}]}]]},{type,867,constraint,[{atom,867,is_subtype},[{var,867,'ErrorInfoMap'},{type,867,map,[{type,867,map_field_assoc,[{atom,867,cause},{type,867,term,[]}]},{type,868,map_field_assoc,[{atom,868,module},{type,868,module,[]}]},{type,869,map_field_assoc,[{atom,869,function},{type,869,atom,[]}]}]}]]}]]}]}}],since => <<50,52,46,48>>}},{{function,exit,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,875}],[<<101,120,105,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,120,105,116>>]},<<32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,97,110,121,32,116,101,114,109,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,116,111,112,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,100,105,102,102,101,114,32,102,114,111,109,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,114,114,111,114,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,114,114,111,114,47,50>>]}]},<<32,98,121,32,99,97,117,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,97,32,100,105,102,102,101,114,101,110,116,32,99,108,97,115,115,32,97,110,100,32,98,121,32,104,97,118,105,110,103,32,97,32,114,101,97,115,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,108,105,115,116,32,111,102,32,102,117,110,99,116,105,111,110,115,32,102,114,111,109,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,46>>]},{p,[],[<<83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,120,105,116,58,32,102,111,111,98,97,114,10,62,32,99,97,116,99,104,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,102,111,111,98,97,114,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,99,97,108,108,115,32>>,{code,[],[<<101,120,105,116,40,107,105,108,108,41>>]},<<32,97,110,100,32,100,111,101,115,32,110,111,116,32,99,97,116,99,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,44,32,105,116,32,119,105,108,108,32,116,101,114,109,105,110,97,116,101,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,97,110,100,32,97,108,115,111,32,101,109,105,116,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,40,110,111,116,32>>,{code,[],[<<107,105,108,108,101,100>>]},<<41,32,116,111,32,97,108,108,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,83,117,99,104,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,99,97,110,32,98,101,32,116,114,97,112,112,101,100,32,98,121,32,116,104,101,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,98,101,104,97,118,101,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,121,32,97,114,101,32,115,101,110,116,32,98,101,99,97,117,115,101,32,116,104,101,32,115,105,103,110,97,108,32,119,105,108,108,32,98,101,32,117,110,116,114,97,112,112,97,98,108,101,32,105,102,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,115,117,99,104,32,97,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,55,57,55>>,signature => [{attribute,875,spec,{{exit,1},[{type,875,bounded_fun,[{type,875,'fun',[{type,875,product,[{var,875,'Reason'}]},{type,875,no_return,[]}]},[{type,876,constraint,[{atom,876,is_subtype},[{var,876,'Reason'},{type,876,term,[]}]]}]]}]}}]}},{{function,exit,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,881}],[<<101,120,105,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,97,110,121,32,116,101,114,109,44,32,101,120,99,101,112,116,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,111,114,32>>,{code,[],[<<107,105,108,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<80>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32,110,111,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32>>,{code,[],[<<80>>]},<<32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,114,111,109>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32>>,{code,[],[<<80>>]},<<46>>]}]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,116,104,101,32,116,101,114,109,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,110,100,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80>>]},<<32,119,104,105,99,104,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,110,118,111,107,101,100,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,40,80,105,100,44,32,110,111,114,109,97,108,41>>]},<<32,40,116,104,101,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,97,32,115,105,103,110,97,108,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,114,101,97,115,111,110,32,116,111,32,105,116,115,101,108,102,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,119,97,114,110,105,110,103,41,58>>]},{ul,[],[{li,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,114,111,109>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32>>,{code,[],[<<80>>]},<<39,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]},{li,[],[<<84,104,101,32,115,105,103,110,97,108,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,105,102,32>>,{code,[],[<<80>>]},<<32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46>>]}]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<107,105,108,108>>]},<<44,32,116,104,97,116,32,105,115,44,32,105,102,32>>,{code,[],[<<101,120,105,116,40,80,105,100,44,32,107,105,108,108,41>>]},<<32,105,115,32,99,97,108,108,101,100,44,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,119,104,105,99,104,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108,101,100>>]},<<46,32,84,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32>>,{code,[],[<<107,105,108,108>>]},<<32,116,111,32>>,{code,[],[<<107,105,108,108,101,100>>]},<<32,116,111,32,104,105,110,116,32,116,111,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,107,105,108,108,101,100,32,112,114,111,99,101,115,115,32,103,111,116,32,107,105,108,108,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,120,105,116,40,80,105,100,44,32,107,105,108,108,41>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]}]},<<32,97,114,101,32,110,97,109,101,100,32,115,105,109,105,108,97,114,108,121,32,98,117,116,32,112,114,111,118,105,100,101,32,118,101,114,121,32,100,105,102,102,101,114,101,110,116,32,102,117,110,99,116,105,111,110,97,108,105,116,105,101,115,46,32,84,104,101,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,49>>]},<<32,102,117,110,99,116,105,111,110,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,116,111,112,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,119,104,105,108,101,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]},<<32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,101,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,101,32,97,108,115,111,32,116,104,97,116,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,49>>]},<<32,114,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,99,97,117,103,104,116,32,119,104,105,108,101,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]},<<32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,97,110,121,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,101,32,111,110,108,121,32,115,99,101,110,97,114,105,111,32,116,104,97,116,32,104,97,115,32,110,111,116,32,98,101,101,110,32,99,111,118,101,114,101,100,32,98,121,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,97,98,111,118,101,32,105,115,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80>>]},<<32,115,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,116,111,32,105,116,115,101,108,102,44,32,116,104,97,116,32,105,115,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,40,115,101,108,102,40,41,44,32,110,111,114,109,97,108,41>>]},<<46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,110,32,116,104,105,115,32,115,99,101,110,97,114,105,111,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58>>]},{ul,[],[{li,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,114,111,109>>]},<<32,105,115,32>>,{code,[],[<<80>>]},<<39,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32>>,{code,[],[<<80>>]},<<39,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]},{li,[],[{code,[],[<<80>>]},<<32,101,120,105,116,115,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,105,102,32>>,{code,[],[<<80>>]},<<32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46>>]}]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,97,114,103,117,97,98,108,121,32,115,116,114,97,110,103,101,32,98,117,116,32,116,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,114,101,97,115,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,56,51,57>>,signature => [{attribute,881,spec,{{exit,2},[{type,881,bounded_fun,[{type,881,'fun',[{type,881,product,[{var,881,'Pid'},{var,881,'Reason'}]},{atom,881,true}]},[{type,882,constraint,[{atom,882,is_subtype},[{var,882,'Pid'},{type,882,union,[{type,882,pid,[]},{type,882,port,[]}]}]]},{type,883,constraint,[{atom,883,is_subtype},[{var,883,'Reason'},{type,883,term,[]}]]}]]}]}}]}},{{function,external_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,895}],[<<101,120,116,101,114,110,97,108,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58>>]},{pre,[],[{code,[],[<<62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101>>]}]},{p,[],[<<84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,97,32,99,97,108,108,32,116,111,58>>]},{pre,[],[{code,[],[<<101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,91,93,41>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,57,50,53>>,signature => [{attribute,895,spec,{{erlang,external_size,1},[{type,895,bounded_fun,[{type,895,'fun',[{type,895,product,[{var,895,'Term'}]},{type,895,non_neg_integer,[]}]},[{type,896,constraint,[{atom,896,is_subtype},[{var,896,'Term'},{type,896,term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,external_size,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,901}],[<<101,120,116,101,114,110,97,108,95,115,105,122,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58>>]},{pre,[],[{code,[],[<<62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101>>]}]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125>>]},<<32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,102,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,46,32,70,111,114,32,97,32,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,57,52,52>>,signature => [{attribute,901,spec,{{erlang,external_size,2},[{type,901,bounded_fun,[{type,901,'fun',[{type,901,product,[{var,901,'Term'},{var,901,'Options'}]},{type,901,non_neg_integer,[]}]},[{type,902,constraint,[{atom,902,is_subtype},[{var,902,'Term'},{type,902,term,[]}]]},{type,903,constraint,[{atom,903,is_subtype},[{var,903,'Options'},{type,903,list,[{type,903,tuple,[{atom,903,minor_version},{ann_type,903,[{var,903,'Version'},{type,903,non_neg_integer,[]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,925}],[<<102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,102,108,111,97,116,32,98,121,32,99,111,110,118,101,114,116,105,110,103,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,97,32,102,108,111,97,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,97,116,40,53,53,41,46,10,53,53,46,48>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,117,115,101,100,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,105,110,32,97,32,103,117,97,114,100,44,32,105,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,59,32,102,111,114,32,99,108,97,114,105,116,121,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,115,95,102,108,111,97,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,102,108,111,97,116,47,49>>]}]},<<32,105,110,115,116,101,97,100,46>>]},{p,[],[<<87,104,101,110,32>>,{code,[],[<<102,108,111,97,116,47,49>>]},<<32,105,115,32,117,115,101,100,32,105,110,32,97,110,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,97,32,103,117,97,114,100,44,32,115,117,99,104,32,97,115,32,39>>,{code,[],[<<102,108,111,97,116,40,65,41,32,61,61,32,52,46,48>>]},<<39,44,32,105,116,32,99,111,110,118,101,114,116,115,32,97,32,110,117,109,98,101,114,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,57,54,52>>,signature => [{attribute,925,spec,{{float,1},[{type,925,bounded_fun,[{type,925,'fun',[{type,925,product,[{var,925,'Number'}]},{type,925,float,[]}]},[{type,926,constraint,[{atom,926,is_subtype},[{var,926,'Number'},{type,926,number,[]}]]}]]}]}}]}},{{function,float_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,931}],[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,44,91,123,115,99,105,101,110,116,105,102,105,99,44,50,48,125,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,57,56,54>>,signature => [{attribute,931,spec,{{float_to_binary,1},[{type,931,bounded_fun,[{type,931,'fun',[{type,931,product,[{var,931,'Float'}]},{type,931,binary,[]}]},[{type,932,constraint,[{atom,932,is_subtype},[{var,932,'Float'},{type,932,float,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,937}],[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,108,111,97,116>>]},<<32,117,115,105,110,103,32,102,105,120,101,100,32,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46,32>>,{code,[],[<<79,112,116,105,111,110,115>>]},<<32,98,101,104,97,118,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,108,111,97,116,95,116,111,95,108,105,115,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,50>>]}]},<<46,32,69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,60,60,34,55,46,49,50,48,48,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,60,60,34,55,46,49,50,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,60,60,34,55,46,49,50,48,101,43,48,48,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,57,57,53>>,signature => [{attribute,937,spec,{{float_to_binary,2},[{type,937,bounded_fun,[{type,937,'fun',[{type,937,product,[{var,937,'Float'},{var,937,'Options'}]},{type,937,binary,[]}]},[{type,938,constraint,[{atom,938,is_subtype},[{var,938,'Float'},{type,938,float,[]}]]},{type,939,constraint,[{atom,939,is_subtype},[{var,939,'Options'},{type,939,list,[{var,939,'Option'}]}]]},{type,940,constraint,[{atom,940,is_subtype},[{var,940,'Option'},{type,940,union,[{type,940,tuple,[{atom,940,decimals},{ann_type,940,[{var,940,'Decimals'},{type,940,range,[{integer,940,0},{integer,940,253}]}]}]},{type,941,tuple,[{atom,941,scientific},{ann_type,941,[{var,941,'Decimals'},{type,941,range,[{integer,941,0},{integer,941,249}]}]}]},{atom,942,compact}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,947}],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,44,91,123,115,99,105,101,110,116,105,102,105,99,44,50,48,125,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,49,53>>,signature => [{attribute,947,spec,{{float_to_list,1},[{type,947,bounded_fun,[{type,947,'fun',[{type,947,product,[{var,947,'Float'}]},{type,947,string,[]}]},[{type,948,constraint,[{atom,948,is_subtype},[{var,948,'Float'},{type,948,float,[]}]]}]]}]}}]}},{{function,float_to_list,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,953}],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,108,111,97,116>>]},<<32,117,115,105,110,103,32,102,105,120,101,100,32,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46>>]},{p,[],[<<65,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<100,101,99,105,109,97,108,115>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,99,111,110,116,97,105,110,115,32,97,116,32,109,111,115,116,32>>,{code,[],[<<68,101,99,105,109,97,108,115>>]},<<32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,112,97,115,116,32,116,104,101,32,100,101,99,105,109,97,108,32,112,111,105,110,116,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,100,111,101,115,32,110,111,116,32,102,105,116,32,105,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,115,116,97,116,105,99,32,98,117,102,102,101,114,32,111,102,32,50,53,54,32,98,121,116,101,115,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,104,114,111,119,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46>>]}]},{li,[],[{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,97,99,116>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,116,114,97,105,108,105,110,103,32,122,101,114,111,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,108,105,115,116,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,109,101,97,110,105,110,103,102,117,108,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<100,101,99,105,109,97,108,115>>]},<<46>>]}]},{li,[],[{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<115,99,105,101,110,116,105,102,105,99>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,108,111,97,116,32,105,115,32,102,111,114,109,97,116,116,101,100,32,117,115,105,110,103,32,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,119,105,116,104,32>>,{code,[],[<<68,101,99,105,109,97,108,115>>]},<<32,100,105,103,105,116,115,32,111,102,32,112,114,101,99,105,115,105,111,110,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,115>>]},<<32,105,115,32>>,{code,[],[<<91,93>>]},<<44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,108,111,97,116,95,116,111,95,108,105,115,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,49>>]}]},<<46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,34,55,46,49,50,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,34,55,46,49,50,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,34,55,46,49,50,48,101,43,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41,10,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34>>]}]},{p,[],[<<73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41>>]},<<32,101,118,97,108,117,97,116,101,115,32,116,111,32>>,{code,[],[<<34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34>>]},<<46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,120,112,108,97,105,110,101,100,32,105,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,50,52>>,signature => [{attribute,953,spec,{{float_to_list,2},[{type,953,bounded_fun,[{type,953,'fun',[{type,953,product,[{var,953,'Float'},{var,953,'Options'}]},{type,953,string,[]}]},[{type,954,constraint,[{atom,954,is_subtype},[{var,954,'Float'},{type,954,float,[]}]]},{type,955,constraint,[{atom,955,is_subtype},[{var,955,'Options'},{type,955,list,[{var,955,'Option'}]}]]},{type,956,constraint,[{atom,956,is_subtype},[{var,956,'Option'},{type,956,union,[{type,956,tuple,[{atom,956,decimals},{ann_type,956,[{var,956,'Decimals'},{type,956,range,[{integer,956,0},{integer,956,253}]}]}]},{type,957,tuple,[{atom,957,scientific},{ann_type,957,[{var,957,'Decimals'},{type,957,range,[{integer,957,0},{integer,957,249}]}]}]},{atom,958,compact}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,floor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,964}],[<<102,108,111,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,103,114,101,97,116,101,114,32,116,104,97,110,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,111,114,40,45,49,48,46,53,41,46,10,45,49,49>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,55,48>>,signature => [{attribute,964,spec,{{floor,1},[{type,964,bounded_fun,[{type,964,'fun',[{type,964,product,[{var,964,'Number'}]},{type,964,integer,[]}]},[{type,965,constraint,[{atom,965,is_subtype},[{var,965,'Number'},{type,965,number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,fun_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3434}],[<<102,117,110,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,117,110,32>>,{code,[],[<<70,117,110>>]},<<46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,117,112,108,101,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,98,117,116,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,32,98,101,32,117,115,101,102,117,108,32,105,110,32,108,105,98,114,97,114,121,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,110,101,101,100,32,116,111,32,118,101,114,105,102,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,97,32,102,117,110,46>>]}]},{p,[],[<<84,119,111,32,116,121,112,101,115,32,111,102,32,102,117,110,115,32,104,97,118,101,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,115,101,109,97,110,116,105,99,115,58>>]},{ul,[],[{li,[],[{p,[],[<<65,32,102,117,110,32,99,114,101,97,116,101,100,32,98,121,32>>,{code,[],[<<102,117,110,32,77,58,70,47,65>>]},<<32,105,115,32,99,97,108,108,101,100,32,97,110,32>>,{em,[],[<<101,120,116,101,114,110,97,108>>]},<<32,102,117,110,46,32,67,97,108,108,105,110,103,32,105,116,32,119,105,108,108,32,97,108,119,97,121,115,32,99,97,108,108,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<70>>]},<<32,119,105,116,104,32,97,114,105,116,121,32>>,{code,[],[<<65>>]},<<32,105,110,32,116,104,101,32,108,97,116,101,115,116,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32>>,{code,[],[<<77>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,100,117,108,101,32>>,{code,[],[<<77>>]},<<32,100,111,101,115,32,110,111,116,32,101,118,101,110,32,110,101,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,32>>,{code,[],[<<102,117,110,32,77,58,70,47,65>>]},<<32,105,115,32,99,114,101,97,116,101,100,46>>]}]},{li,[],[{p,[],[<<65,108,108,32,111,116,104,101,114,32,102,117,110,115,32,97,114,101,32,99,97,108,108,101,100,32>>,{em,[],[<<108,111,99,97,108>>]},<<46,32,87,104,101,110,32,97,32,108,111,99,97,108,32,102,117,110,32,105,115,32,99,97,108,108,101,100,44,32,116,104,101,32,115,97,109,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,102,117,110,32,105,115,32,99,97,108,108,101,100,32,40,101,118,101,110,32,105,102,32,97,32,110,101,119,101,114,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,104,97,115,32,98,101,101,110,32,108,111,97,100,101,100,41,46>>]}]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,97,108,119,97,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,102,111,114,32,98,111,116,104,32,108,111,99,97,108,32,97,110,100,32,101,120,116,101,114,110,97,108,32,102,117,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,116,121,112,101,44,32,84,121,112,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,111,114,32>>,{code,[],[<<101,120,116,101,114,110,97,108>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<32,40,97,110,32,97,116,111,109,41,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,102,117,110,32,105,115,32,100,101,102,105,110,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46>>]}]},{dt,[],[{code,[],[<<123,110,97,109,101,44,32,78,97,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<78,97,109,101>>]},<<32,40,97,110,32,97,116,111,109,41,32,105,115,32,97,32,102,117,110,99,116,105,111,110,32,110,97,109,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,102,117,110,46,32,40,84,104,105,115,32,110,97,109,101,32,119,97,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,97,110,100,32,105,115,32,111,110,108,121,32,111,102,32,105,110,102,111,114,109,97,116,105,111,110,97,108,32,117,115,101,46,32,65,115,32,105,116,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,99,97,108,108,101,100,32,100,105,114,101,99,116,108,121,46,41,32,73,102,32,110,111,32,99,111,100,101,32,105,115,32,99,117,114,114,101,110,116,108,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,101,32,102,117,110,44,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,110,32,97,116,111,109,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46>>]}]},{dt,[],[{code,[],[<<123,97,114,105,116,121,44,32,65,114,105,116,121,125>>]}]},{dd,[],[{p,[],[{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,102,117,110,32,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,119,105,116,104,46>>]}]},{dt,[],[{code,[],[<<123,101,110,118,44,32,69,110,118,125>>]}]},{dd,[],[{p,[],[{code,[],[<<69,110,118>>]},<<32,40,97,32,108,105,115,116,41,32,105,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,114,32,102,114,101,101,32,118,97,114,105,97,98,108,101,115,32,102,111,114,32,116,104,101,32,102,117,110,46,32,70,111,114,32,101,120,116,101,114,110,97,108,32,102,117,110,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,105,115,32,97,108,119,97,121,115,32,101,109,112,116,121,46>>]}]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,110,108,121,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,105,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,108,111,99,97,108,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,105,100,44,32,80,105,100,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,111,114,105,103,105,110,97,108,108,121,32,99,114,101,97,116,101,100,32,116,104,101,32,102,117,110,46>>]},{p,[],[<<73,116,32,109,105,103,104,116,32,112,111,105,110,116,32,116,111,32,116,104,101,32>>,{code,[],[<<105,110,105,116>>]},<<32,112,114,111,99,101,115,115,32,105,102,32,116,104,101,32>>,{code,[],[<<70,117,110>>]},<<32,119,97,115,32,115,116,97,116,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,119,104,101,110,32,109,111,100,117,108,101,32,119,97,115,32,108,111,97,100,101,100,32,40,116,104,105,115,32,111,112,116,105,109,105,115,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,102,111,114,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,100,111,32,110,111,116,32,99,97,112,116,117,114,101,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,41,46>>]}]},{dt,[],[{code,[],[<<123,105,110,100,101,120,44,32,73,110,100,101,120,125>>]}]},{dd,[],[{p,[],[{code,[],[<<73,110,100,101,120>>]},<<32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,32,102,117,110,32,116,97,98,108,101,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,95,105,110,100,101,120,44,32,73,110,100,101,120,125>>]}]},{dd,[],[{p,[],[{code,[],[<<73,110,100,101,120>>]},<<32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,32,102,117,110,32,116,97,98,108,101,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,95,117,110,105,113,44,32,85,110,105,113,125>>]}]},{dd,[],[{p,[],[{code,[],[<<85,110,105,113>>]},<<32,40,97,32,98,105,110,97,114,121,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,73,116,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46>>]}]},{dt,[],[{code,[],[<<123,117,110,105,113,44,32,85,110,105,113,125>>]}]},{dd,[],[{p,[],[{code,[],[<<85,110,105,113>>]},<<32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46,32,66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,119,97,115,32,98,97,115,101,100,32,111,110,32,111,110,108,121,32,116,104,101,32,98,111,100,121,32,111,102,32,116,104,101,32,102,117,110,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,56,52>>,signature => [{attribute,3434,spec,{{erlang,fun_info,1},[{type,3434,bounded_fun,[{type,3434,'fun',[{type,3434,product,[{var,3434,'Fun'}]},{type,3434,list,[{type,3434,tuple,[{var,3434,'Item'},{var,3434,'Info'}]}]}]},[{type,3435,constraint,[{atom,3435,is_subtype},[{var,3435,'Fun'},{type,3435,function,[]}]]},{type,3436,constraint,[{atom,3436,is_subtype},[{var,3436,'Item'},{type,3436,union,[{atom,3436,arity},{atom,3436,env},{atom,3436,index},{atom,3436,name},{atom,3437,module},{atom,3437,new_index},{atom,3437,new_uniq},{atom,3437,pid},{atom,3437,type},{atom,3437,uniq}]}]]},{type,3438,constraint,[{atom,3438,is_subtype},[{var,3438,'Info'},{type,3438,term,[]}]]}]]}]}}]}},{{function,fun_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,970}],[<<102,117,110,95,105,110,102,111,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<102,117,110,95,105,110,102,111,95,105,116,101,109>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32>>,{code,[],[<<70,117,110>>]},<<32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<44,32,105,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,73,116,101,109,44,73,110,102,111,125>>]},<<46>>]},{p,[],[<<70,111,114,32,97,110,121,32,102,117,110,44,32>>,{code,[],[<<73,116,101,109>>]},<<32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<109,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<110,97,109,101>>]},<<44,32>>,{code,[],[<<97,114,105,116,121>>]},<<44,32>>,{code,[],[<<101,110,118>>]},<<44,32,111,114,32>>,{code,[],[<<116,121,112,101>>]},<<46>>]},{p,[],[<<70,111,114,32,97,32,108,111,99,97,108,32,102,117,110,44,32>>,{code,[],[<<73,116,101,109>>]},<<32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<105,110,100,101,120>>]},<<44,32>>,{code,[],[<<110,101,119,95,105,110,100,101,120>>]},<<44,32>>,{code,[],[<<110,101,119,95,117,110,105,113>>]},<<44,32>>,{code,[],[<<117,110,105,113>>]},<<44,32,97,110,100,32>>,{code,[],[<<112,105,100>>]},<<46,32,70,111,114,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,97,110,121,32,111,102,32,116,104,101,115,101,32,105,116,101,109,115,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,117,110,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,49,56,57>>,signature => [{attribute,970,spec,{{erlang,fun_info,2},[{type,970,bounded_fun,[{type,970,'fun',[{type,970,product,[{var,970,'Fun'},{var,970,'Item'}]},{type,970,tuple,[{var,970,'Item'},{var,970,'Info'}]}]},[{type,971,constraint,[{atom,971,is_subtype},[{var,971,'Fun'},{type,971,function,[]}]]},{type,972,constraint,[{atom,972,is_subtype},[{var,972,'Item'},{user_type,972,fun_info_item,[]}]]},{type,973,constraint,[{atom,973,is_subtype},[{var,973,'Info'},{type,973,term,[]}]]}]]}]}}]}},{{function,fun_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,987}],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,116,104,97,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32>>,{code,[],[<<70,117,110>>]},<<46>>]},{p,[],[{code,[],[<<83,116,114,105,110,103>>]},<<32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,44,32,105,102,32>>,{code,[],[<<70,117,110>>]},<<32,119,97,115,32,99,114,101,97,116,101,100,32,98,121,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<102,117,110,32,101,120,112,114,101,115,115,105,111,110>>]},<<32,111,102,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121>>]},<<58>>]},{p,[],[{code,[],[<<34,102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121,34>>]}]},{p,[],[<<84,104,101,32,102,111,114,109,32,111,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,119,104,101,110,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,111,116,104,101,114,32,116,121,112,101,115,32,111,102,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<102,117,110,32,101,120,112,114,101,115,115,105,111,110,115>>]},<<32,100,105,102,102,101,114,115,32,100,101,112,101,110,100,105,110,103,32,111,110,32,105,102,32,116,104,101,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,111,114,32,105,102,32,116,104,101,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,40,117,110,99,111,109,112,105,108,101,100,32,101,115,99,114,105,112,116,115,44,32,116,104,101,32,69,114,108,97,110,103,32,115,104,101,108,108,44,32,97,110,100,32,111,116,104,101,114,32,99,111,100,101,32,101,120,101,99,117,116,101,100,32,98,121,32,116,104,101,32,101,114,108,95,101,118,97,108,32,109,111,100,117,108,101,41,58>>]},{dl,[],[{dt,[],[<<99,111,109,112,105,108,101,100,32,99,111,100,101>>]},{dd,[],[{p,[],[{code,[],[<<34,35,70,117,110,60,77,46,73,46,85,62,34>>]},<<44,32,119,104,101,114,101,32,77,44,32,73,32,97,110,100,32,85,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,32,118,97,108,117,101,115,32,110,97,109,101,100,32>>,{code,[],[<<109,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<105,110,100,101,120>>]},<<32,97,110,100,32>>,{code,[],[<<117,110,105,113>>]},<<32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,117,110,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,40,70,117,110,41>>]}]},<<46>>]}]},{dt,[],[<<117,110,99,111,109,112,105,108,101,100,32,99,111,100,101>>]},{dd,[],[<<65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<71,101,110,101,114,97,108,108,121,44,32,111,110,101,32,99,97,110,32,110,111,116,32,117,115,101,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<32,116,111,32,99,104,101,99,107,32,105,102,32,116,119,111,32,102,117,110,115,32,97,114,101,32,101,113,117,97,108,32,97,115,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<32,100,111,101,115,32,110,111,116,32,116,97,107,101,32,116,104,101,32,102,117,110,39,115,32,101,110,118,105,114,111,110,109,101,110,116,32,105,110,116,111,32,97,99,99,111,117,110,116,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,117,110,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49>>]}]},<<32,102,111,114,32,104,111,119,32,116,111,32,103,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,97,32,102,117,110,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,111,117,116,112,117,116,32,111,102,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,69,114,108,97,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,97,110,100,32,109,97,121,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,115,46>>]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,97,100,100,47,49,44,32,97,100,100,50,47,48,44,32,102,117,110,95,116,117,112,108,101,47,48,93,41,46,10,97,100,100,40,65,41,32,45,62,32,102,117,110,40,66,41,32,45,62,32,65,32,43,32,66,32,101,110,100,46,10,97,100,100,50,40,41,32,45,62,32,102,117,110,32,97,100,100,47,49,46,10,102,117,110,95,116,117,112,108,101,40,41,32,45,62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,10,32,32,32,32,32,32,32,32>>]}]},{pre,[],[{code,[],[<<62,32,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,32,116,101,115,116,58,97,100,100,50,40,41,125,46,10,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,35,70,117,110,60,116,101,115,116,46,49,46,49,48,55,55,51,56,57,56,51,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32>>,{code,[],[<<102,117,110,32,116,101,115,116,58,97,100,100,47,49>>]},<<32,105,115,32,117,112,103,114,97,100,97,98,108,101,32,98,117,116,32>>,{code,[],[<<116,101,115,116,58,97,100,100,50,40,41>>]},<<32,105,115,32,110,111,116,32,117,112,103,114,97,100,97,98,108,101,46>>]},{pre,[],[{code,[],[<<62,32,123,116,101,115,116,58,97,100,100,40,49,41,44,32,116,101,115,116,58,97,100,100,40,52,50,41,125,46,10,123,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32>>,{code,[],[<<116,101,115,116,58,97,100,100,40,49,41>>]},<<32,97,110,100,32>>,{code,[],[<<116,101,115,116,58,97,100,100,40,52,50,41>>]},<<32,104,97,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,97,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,105,115,32,110,111,116,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,46>>]},{pre,[],[{code,[],[<<62,116,101,115,116,58,102,117,110,95,116,117,112,108,101,40,41,46,10,123,35,70,117,110,60,116,101,115,116,46,50,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,51,46,49,48,55,55,51,56,57,56,51,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32,84,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,100,105,102,102,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,102,117,110,115,32,99,111,109,101,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,102,117,110,32,101,120,112,101,114,115,115,105,111,110,115,46>>]},{pre,[],[{code,[],[<<62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,32,62,32,10,123,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,44,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32,65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,105,115,32,102,111,114,109,32,105,110,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,50,48,57>>,signature => [{attribute,987,spec,{{erlang,fun_to_list,1},[{type,987,bounded_fun,[{type,987,'fun',[{type,987,product,[{var,987,'Fun'}]},{ann_type,987,[{var,987,'String'},{type,987,string,[]}]}]},[{type,988,constraint,[{atom,988,is_subtype},[{var,988,'Fun'},{type,988,function,[]}]]}]]}]}}]}},{{function,function_exported,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,993}],[<<102,117,110,99,116,105,111,110,95,101,120,112,111,114,116,101,100,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,108,111,97,100,101,100,32,97,110,100,32,99,111,110,116,97,105,110,115,32,97,110,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,66,73,70,32,40,97,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,67,41,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,110,97,109,101,44,32,111,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,117,115,101,100,32,116,111,32,114,101,116,117,114,110,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,102,111,114,32,66,73,70,115,32,98,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,49,56,46,48,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,50,57,56>>,signature => [{attribute,993,spec,{{erlang,function_exported,3},[{type,993,bounded_fun,[{type,993,'fun',[{type,993,product,[{var,993,'Module'},{var,993,'Function'},{var,993,'Arity'}]},{type,993,boolean,[]}]},[{type,994,constraint,[{atom,994,is_subtype},[{var,994,'Module'},{type,994,module,[]}]]},{type,995,constraint,[{atom,995,is_subtype},[{var,995,'Function'},{type,995,atom,[]}]]},{type,996,constraint,[{atom,996,is_subtype},[{var,996,'Arity'},{type,996,arity,[]}]]}]]}]}}]}},{{function,garbage_collect,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1001}],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>],#{<<101,110>> => [{p,[],[<<70,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,101,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,117,110,108,101,115,115,32,105,116,32,104,97,115,32,98,101,101,110,32,110,111,116,105,99,101,100,32,40,111,114,32,116,104,101,114,101,32,97,114,101,32,103,111,111,100,32,114,101,97,115,111,110,115,32,116,111,32,115,117,115,112,101,99,116,41,32,116,104,97,116,32,116,104,101,32,115,112,111,110,116,97,110,101,111,117,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,105,108,108,32,111,99,99,117,114,32,116,111,111,32,108,97,116,101,32,111,114,32,110,111,116,32,97,116,32,97,108,108,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,109,112,114,111,112,101,114,32,117,115,101,32,99,97,110,32,115,101,114,105,111,117,115,108,121,32,100,101,103,114,97,100,101,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,49,52>>,signature => [{attribute,1001,spec,{{garbage_collect,0},[{type,1001,'fun',[{type,1001,product,[]},{atom,1001,true}]}]}}]}},{{function,garbage_collect,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1006}],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,51,48>>,signature => [{attribute,1006,spec,{{garbage_collect,1},[{type,1006,bounded_fun,[{type,1006,'fun',[{type,1006,product,[{var,1006,'Pid'}]},{var,1006,'GCResult'}]},[{type,1007,constraint,[{atom,1007,is_subtype},[{var,1007,'Pid'},{type,1007,pid,[]}]]},{type,1008,constraint,[{atom,1008,is_subtype},[{var,1008,'GCResult'},{type,1008,boolean,[]}]]}]]}]}}]}},{{function,garbage_collect,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1022}],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125>>]}]},{dd,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50>>]},<<32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,44,32,82,101,113,117,101,115,116,73,100,44,32,71,67,82,101,115,117,108,116,125>>]},<<46>>]},{dt,[],[{code,[],[<<123,116,121,112,101,44,32,39,109,97,106,111,114,39,32,124,32,39,109,105,110,111,114,39,125>>]}]},{dd,[],[<<84,114,105,103,103,101,114,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,114,101,113,117,101,115,116,101,100,32,116,121,112,101,46,32,68,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<39,109,97,106,111,114,39>>]},<<44,32,119,104,105,99,104,32,119,111,117,108,100,32,116,114,105,103,103,101,114,32,97,32,102,117,108,108,115,119,101,101,112,32,71,67,46,32,84,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<39,109,105,110,111,114,39>>]},<<32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,104,105,110,116,32,97,110,100,32,109,97,121,32,108,101,97,100,32,116,111,32,101,105,116,104,101,114,32,109,105,110,111,114,32,111,114,32,109,97,106,111,114,32,71,67,32,114,117,110,46>>]}]},{p,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<115,101,108,102,40,41>>]},<<44,32,97,110,100,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>]}]},<<46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,97,110,100,32,119,105,108,108,32,98,101,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32>>,{code,[],[<<71,67,82,101,115,117,108,116>>]},<<32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<71,67,82,101,115,117,108,116>>]},<<32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,114,101,113,117,101,115,116,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,104,97,115,32,98,101,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46>>]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[<<78,111,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,116,101,114,109,105,110,97,116,101,100,32,98,101,102,111,114,101,32,116,104,101,32,114,101,113,117,101,115,116,32,99,111,117,108,100,32,98,101,32,115,97,116,105,115,102,105,101,100,46>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,99,97,118,101,97,116,115,32,97,112,112,108,121,32,97,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,52,48>>,signature => [{attribute,1022,spec,{{garbage_collect,2},[{type,1022,bounded_fun,[{type,1022,'fun',[{type,1022,product,[{var,1022,'Pid'},{var,1022,'OptionList'}]},{type,1022,union,[{var,1022,'GCResult'},{atom,1022,async}]}]},[{type,1023,constraint,[{atom,1023,is_subtype},[{var,1023,'Pid'},{type,1023,pid,[]}]]},{type,1024,constraint,[{atom,1024,is_subtype},[{var,1024,'RequestId'},{type,1024,term,[]}]]},{type,1025,constraint,[{atom,1025,is_subtype},[{var,1025,'Option'},{type,1025,union,[{type,1025,tuple,[{atom,1025,async},{var,1025,'RequestId'}]},{type,1025,tuple,[{atom,1025,type},{type,1025,union,[{atom,1025,major},{atom,1025,minor}]}]}]}]]},{type,1026,constraint,[{atom,1026,is_subtype},[{var,1026,'OptionList'},{type,1026,list,[{var,1026,'Option'}]}]]},{type,1027,constraint,[{atom,1027,is_subtype},[{var,1027,'GCResult'},{type,1027,boolean,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,get,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1076}],[<<103,101,116,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,75,101,121,44,32,86,97,108,125>>]},<<32,116,117,112,108,101,115,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,107,101,121,51,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,41,46,10,91,123,107,101,121,49,44,109,101,114,114,121,125,44,123,107,101,121,50,44,108,97,109,98,115,125,44,123,107,101,121,51,44,123,97,114,101,44,112,108,97,121,105,110,103,125,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,48,53>>,signature => [{attribute,1076,spec,{{get,0},[{type,1076,bounded_fun,[{type,1076,'fun',[{type,1076,product,[]},{type,1076,list,[{type,1076,tuple,[{var,1076,'Key'},{var,1076,'Val'}]}]}]},[{type,1077,constraint,[{atom,1077,is_subtype},[{var,1077,'Key'},{type,1077,term,[]}]]},{type,1078,constraint,[{atom,1078,is_subtype},[{var,1078,'Val'},{type,1078,term,[]}]]}]]}]}}]}},{{function,get,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1083}],[<<103,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32>>,{code,[],[<<75,101,121>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,79,40>>,{code,[],[<<49>>]},<<41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40>>,{code,[],[<<78>>]},<<41,44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,41,46,10,123,97,114,101,44,112,108,97,121,105,110,103,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,50,50>>,signature => [{attribute,1083,spec,{{get,1},[{type,1083,bounded_fun,[{type,1083,'fun',[{type,1083,product,[{var,1083,'Key'}]},{type,1083,union,[{var,1083,'Val'},{atom,1083,undefined}]}]},[{type,1084,constraint,[{atom,1084,is_subtype},[{var,1084,'Key'},{type,1084,term,[]}]]},{type,1085,constraint,[{atom,1085,is_subtype},[{var,1085,'Val'},{type,1085,term,[]}]]}]]}]}}]}},{{function,get_cookie,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3794}],[<<103,101,116,95,99,111,111,107,105,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,102,32,116,104,101,32,110,111,100,101,32,105,115,32,97,108,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<110,111,99,111,111,107,105,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,52,50>>,signature => [{attribute,3794,spec,{{erlang,get_cookie,0},[{type,3794,bounded_fun,[{type,3794,'fun',[{type,3794,product,[]},{type,3794,union,[{var,3794,'Cookie'},{atom,3794,nocookie}]}]},[{type,3795,constraint,[{atom,3795,is_subtype},[{var,3795,'Cookie'},{type,3795,atom,[]}]]}]]}]}}]}},{{function,get_keys,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1090}],[<<103,101,116,95,107,101,121,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,107,101,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,100,111,103,44,32,123,97,110,105,109,97,108,44,49,125,41,44,10,112,117,116,40,99,111,119,44,32,123,97,110,105,109,97,108,44,50,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,97,110,105,109,97,108,44,51,125,41,44,10,103,101,116,95,107,101,121,115,40,41,46,10,91,100,111,103,44,99,111,119,44,108,97,109,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,53,49>>,signature => [{attribute,1090,spec,{{get_keys,0},[{type,1090,bounded_fun,[{type,1090,'fun',[{type,1090,product,[]},{type,1090,list,[{var,1090,'Key'}]}]},[{type,1091,constraint,[{atom,1091,is_subtype},[{var,1091,'Key'},{type,1091,term,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,get_keys,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1096}],[<<103,101,116,95,107,101,121,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,107,101,121,115,32,116,104,97,116,32,97,114,101,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,109,97,114,121,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,104,97,100,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,97,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,108,105,116,116,108,101,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,100,111,103,44,32,123,49,44,32,51,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,49,44,32,50,125,41,44,10,103,101,116,95,107,101,121,115,40,123,49,44,32,50,125,41,46,10,91,109,97,114,121,44,104,97,100,44,97,44,108,105,116,116,108,101,44,108,97,109,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,54,56>>,signature => [{attribute,1096,spec,{{get_keys,1},[{type,1096,bounded_fun,[{type,1096,'fun',[{type,1096,product,[{var,1096,'Val'}]},{type,1096,list,[{var,1096,'Key'}]}]},[{type,1097,constraint,[{atom,1097,is_subtype},[{var,1097,'Val'},{type,1097,term,[]}]]},{type,1098,constraint,[{atom,1098,is_subtype},[{var,1098,'Key'},{type,1098,term,[]}]]}]]}]}}]}},{{function,group_leader,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1110}],[<<103,114,111,117,112,95,108,101,97,100,101,114,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,46>>]},{p,[],[<<69,118,101,114,121,32,112,114,111,99,101,115,115,32,105,115,32,97,32,109,101,109,98,101,114,32,111,102,32,115,111,109,101,32,112,114,111,99,101,115,115,32,103,114,111,117,112,32,97,110,100,32,97,108,108,32,103,114,111,117,112,115,32,104,97,118,101,32,97,32>>,{em,[],[<<103,114,111,117,112,32,108,101,97,100,101,114>>]},<<46,32,65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,103,114,111,117,112,32,105,115,32,99,104,97,110,110,101,108,101,100,32,116,111,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,46,32,87,104,101,110,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,112,97,119,110,101,100,44,32,105,116,32,103,101,116,115,32,116,104,101,32,115,97,109,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,115,32,116,104,101,32,115,112,97,119,110,105,110,103,32,112,114,111,99,101,115,115,46,32,73,110,105,116,105,97,108,108,121,44,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,44,32>>,{code,[],[<<105,110,105,116>>]},<<32,105,115,32,98,111,116,104,32,105,116,115,32,111,119,110,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,110,100,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,97,108,108,32,112,114,111,99,101,115,115,101,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,56,56>>,signature => [{attribute,1110,spec,{{group_leader,0},[{type,1110,'fun',[{type,1110,product,[]},{type,1110,pid,[]}]}]}}]}},{{function,group_leader,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1115}],[<<103,114,111,117,112,95,108,101,97,100,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<32,116,111,32>>,{code,[],[<<71,114,111,117,112,76,101,97,100,101,114>>]},<<46,32,84,121,112,105,99,97,108,108,121,44,32,116,104,105,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,102,114,111,109,32,97,32,99,101,114,116,97,105,110,32,115,104,101,108,108,32,105,115,32,116,111,32,104,97,118,101,32,97,110,111,116,104,101,114,32,103,114,111,117,112,32,108,101,97,100,101,114,32,116,104,97,110,32>>,{code,[],[<<105,110,105,116>>]},<<46>>]},{p,[],[<<84,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,115,104,111,117,108,100,32,98,101,32,114,97,114,101,108,121,32,99,104,97,110,103,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,105,116,104,32,97,32,115,117,112,101,114,118,105,115,105,111,110,32,116,114,101,101,44,32,98,101,99,97,117,115,101,32,79,84,80,32,97,115,115,117,109,101,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,116,104,101,105,114,32,112,114,111,99,101,115,115,101,115,32,105,115,32,116,104,101,105,114,32,97,112,112,108,105,99,97,116,105,111,110,32,109,97,115,116,101,114,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,114,111,117,112,95,108,101,97,100,101,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,114,111,117,112,95,108,101,97,100,101,114,47,48>>]}]},<<32,97,110,100,32>>,{a,[{href,<<115,121,115,116,101,109,47,100,101,115,105,103,110,95,112,114,105,110,99,105,112,108,101,115,58,97,112,112,108,105,99,97,116,105,111,110,115,35,115,116,111,112,112,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,84,80,32,100,101,115,105,103,110,32,112,114,105,110,99,105,112,108,101,115>>]},<<32,114,101,108,97,116,101,100,32,116,111,32,115,116,97,114,116,105,110,103,32,97,110,100,32,115,116,111,112,112,105,110,103,32,97,112,112,108,105,99,97,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,48,51>>,signature => [{attribute,1115,spec,{{group_leader,2},[{type,1115,bounded_fun,[{type,1115,'fun',[{type,1115,product,[{var,1115,'GroupLeader'},{var,1115,'Pid'}]},{atom,1115,true}]},[{type,1116,constraint,[{atom,1116,is_subtype},[{var,1116,'GroupLeader'},{type,1116,pid,[]}]]},{type,1117,constraint,[{atom,1117,is_subtype},[{var,1117,'Pid'},{type,1117,pid,[]}]]}]]}]}}]}},{{function,halt,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1135}],[<<104,97,108,116,47,48>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,104,97,108,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<104,97,108,116,40,48,44,32,91,93,41>>]}]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,104,97,108,116,40,41,46,10,111,115,95,112,114,111,109,112,116,37>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,50,52>>,signature => [{attribute,1135,spec,{{halt,0},[{type,1135,'fun',[{type,1135,product,[]},{type,1135,no_return,[]}]}]}}]}},{{function,halt,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1141}],[<<104,97,108,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,104,97,108,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<104,97,108,116,40,83,116,97,116,117,115,44,32,91,93,41>>]}]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,104,97,108,116,40,49,55,41,46,10,111,115,95,112,114,111,109,112,116,37,32,101,99,104,111,32,36,63,10,49,55,10,111,115,95,112,114,111,109,112,116,37>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,51,55>>,signature => [{attribute,1141,spec,{{halt,1},[{type,1141,bounded_fun,[{type,1141,'fun',[{type,1141,product,[{var,1141,'Status'}]},{type,1141,no_return,[]}]},[{type,1142,constraint,[{atom,1142,is_subtype},[{var,1142,'Status'},{type,1142,union,[{type,1142,non_neg_integer,[]},{atom,1142,abort},{type,1142,string,[]}]}]]}]]}]}}]}},{{function,halt,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1153}],[<<104,97,108,116,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<83,116,97,116,117,115>>]},<<32,109,117,115,116,32,98,101,32,97,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,44,32,97,32,115,116,114,105,110,103,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<97,98,111,114,116>>]},<<46,32,72,97,108,116,115,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,72,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,68,101,112,101,110,100,105,110,103,32,111,110,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,99,99,117,114,115,58>>]},{dl,[],[{dt,[],[<<105,110,116,101,103,101,114,40,41>>]},{dd,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,101,120,105,116,115,32,119,105,116,104,32,105,110,116,101,103,101,114,32,118,97,108,117,101,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<32,97,115,32,115,116,97,116,117,115,32,99,111,100,101,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,101,110,118,105,114,111,110,109,101,110,116,32,40,79,83,41,46>>,{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,32,109,97,110,121,32,112,108,97,116,102,111,114,109,115,44,32,116,104,101,32,79,83,32,115,117,112,112,111,114,116,115,32,111,110,108,121,32,115,116,97,116,117,115,32,99,111,100,101,115,32,48,45,50,53,53,46,32,65,32,116,111,111,32,108,97,114,103,101,32,115,116,97,116,117,115,32,99,111,100,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,98,121,32,99,108,101,97,114,105,110,103,32,116,104,101,32,104,105,103,104,32,98,105,116,115,46>>]}]}]},{dt,[],[<<115,116,114,105,110,103,40,41>>]},{dd,[],[<<65,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,32,105,115,32,112,114,111,100,117,99,101,100,32,119,105,116,104,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<32,97,115,32,115,108,111,103,97,110,46,32,84,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,101,120,105,116,115,32,119,105,116,104,32,115,116,97,116,117,115,32,99,111,100,101,32>>,{code,[],[<<49>>]},<<46,32,84,104,101,32,115,116,114,105,110,103,32,119,105,108,108,32,98,101,32,116,114,117,110,99,97,116,101,100,32,105,102,32,108,111,110,103,101,114,32,116,104,97,110,32,50,48,48,32,99,104,97,114,97,99,116,101,114,115,46>>,{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,101,102,111,114,101,32,69,82,84,83,32,57,46,49,32,40,79,84,80,45,50,48,46,49,41,32,111,110,108,121,32,99,111,100,101,32,112,111,105,110,116,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,45,50,53,53,32,119,97,115,32,97,99,99,101,112,116,101,100,32,105,110,32,116,104,101,32,115,116,114,105,110,103,46,32,78,111,119,32,97,110,121,32,117,110,105,99,111,100,101,32,115,116,114,105,110,103,32,105,115,32,118,97,108,105,100,46>>]}]}]},{dt,[],[{code,[],[<<97,98,111,114,116>>]}]},{dd,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,98,111,114,116,115,32,112,114,111,100,117,99,105,110,103,32,97,32,99,111,114,101,32,100,117,109,112,44,32,105,102,32,116,104,97,116,32,105,115,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,79,83,46>>]}]},{p,[],[<<70,111,114,32,105,110,116,101,103,101,114,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<44,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,99,108,111,115,101,115,32,97,108,108,32,112,111,114,116,115,32,97,110,100,32,97,108,108,111,119,115,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,116,111,32,102,105,110,105,115,104,32,116,104,101,105,114,32,111,112,101,114,97,116,105,111,110,115,32,98,101,102,111,114,101,32,101,120,105,116,105,110,103,46,32,84,111,32,101,120,105,116,32,119,105,116,104,111,117,116,32,115,117,99,104,32,102,108,117,115,104,105,110,103,44,32,117,115,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<32,97,115,32>>,{code,[],[<<123,102,108,117,115,104,44,102,97,108,115,101,125>>]},<<46>>]},{p,[],[<<70,111,114,32,115,116,97,116,117,115,101,115,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<32,97,110,100,32>>,{code,[],[<<97,98,111,114,116>>]},<<44,32,111,112,116,105,111,110,32>>,{code,[],[<<102,108,117,115,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,32,97,110,100,32,102,108,117,115,104,105,110,103,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,100,111,110,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,53,49>>,signature => [{attribute,1153,spec,{{halt,2},[{type,1153,bounded_fun,[{type,1153,'fun',[{type,1153,product,[{var,1153,'Status'},{var,1153,'Options'}]},{type,1153,no_return,[]}]},[{type,1154,constraint,[{atom,1154,is_subtype},[{var,1154,'Status'},{type,1154,union,[{type,1154,non_neg_integer,[]},{atom,1154,abort},{type,1154,string,[]}]}]]},{type,1155,constraint,[{atom,1155,is_subtype},[{var,1155,'Options'},{type,1155,list,[{var,1155,'Option'}]}]]},{type,1156,constraint,[{atom,1156,is_subtype},[{var,1156,'Option'},{type,1156,tuple,[{atom,1156,flush},{type,1156,boolean,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,hd,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2133}],[<<104,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,100,32,111,102,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,104,100,40,91,49,44,50,44,51,44,52,44,53,93,41,46,10,49>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,105,115,116>>]},<<32,105,115,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,57,51>>,signature => [{attribute,2133,spec,{{hd,1},[{type,2133,bounded_fun,[{type,2133,'fun',[{type,2133,product,[{var,2133,'List'}]},{type,2133,term,[]}]},[{type,2134,constraint,[{atom,2134,is_subtype},[{var,2134,'List'},{type,2134,nonempty_list,[{type,2134,term,[]}]}]]}]]}]}}]}},{{function,hibernate,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1167}],[<<104,105,98,101,114,110,97,116,101,47,51>>],#{<<101,110>> => [{p,[],[<<80,117,116,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,110,116,111,32,97,32,119,97,105,116,32,115,116,97,116,101,32,119,104,101,114,101,32,105,116,115,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,114,101,100,117,99,101,100,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,101,120,112,101,99,116,32,116,111,32,114,101,99,101,105,118,101,32,97,110,121,32,109,101,115,115,97,103,101,115,32,115,111,111,110,46>>]},{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,105,116,44,32,97,110,100,32,99,111,110,116,114,111,108,32,114,101,115,117,109,101,115,32,105,110,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,119,105,116,104,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<65,114,103,115>>]},<<32,119,105,116,104,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,101,109,112,116,105,101,100,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,32,119,104,101,110,32,116,104,97,116,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46,32,84,104,117,115,32>>,{code,[],[<<101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51>>]},<<32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,110,121,32,109,101,115,115,97,103,101,32,105,110,32,105,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,44,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,32,105,109,109,101,100,105,97,116,101,108,121,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46>>]},{p,[],[<<73,110,32,109,111,114,101,32,116,101,99,104,110,105,99,97,108,32,116,101,114,109,115,44,32>>,{code,[],[<<101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51>>]},<<32,100,105,115,99,97,114,100,115,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,97,110,100,32,116,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,112,114,111,99,101,115,115,46,32,65,102,116,101,114,32,116,104,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,105,110,32,111,110,101,32,99,111,110,116,105,110,117,111,117,115,32,104,101,97,112,46,32,84,104,101,32,104,101,97,112,32,105,115,32,116,104,101,110,32,115,104,114,117,110,107,101,110,32,116,111,32,116,104,101,32,101,120,97,99,116,32,115,97,109,101,32,115,105,122,101,32,97,115,32,116,104,101,32,108,105,118,101,32,100,97,116,97,32,116,104,97,116,32,105,116,32,104,111,108,100,115,32,40,101,118,101,110,32,105,102,32,116,104,97,116,32,115,105,122,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,41,46>>]},{p,[],[<<73,102,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,108,105,118,101,32,100,97,116,97,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,32,116,104,101,32,102,105,114,115,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,99,99,117,114,114,105,110,103,32,97,102,116,101,114,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,32,101,110,115,117,114,101,115,32,116,104,97,116,32,116,104,101,32,104,101,97,112,32,115,105,122,101,32,105,115,32,99,104,97,110,103,101,100,32,116,111,32,97,32,115,105,122,101,32,110,111,116,32,115,109,97,108,108,101,114,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,101,109,112,116,121,105,110,103,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,109,101,97,110,115,32,116,104,97,116,32,97,110,121,32,115,117,114,114,111,117,110,100,105,110,103,32>>,{code,[],[<<99,97,116,99,104>>]},<<32,105,115,32,114,101,109,111,118,101,100,32,97,110,100,32,109,117,115,116,32,98,101,32,114,101,45,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,104,105,98,101,114,110,97,116,105,111,110,46,32,79,110,101,32,101,102,102,101,99,116,32,111,102,32,116,104,105,115,32,105,115,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,115,116,97,114,116,101,100,32,117,115,105,110,103,32>>,{code,[],[<<112,114,111,99,95,108,105,98>>]},<<32,40,97,108,115,111,32,105,110,100,105,114,101,99,116,108,121,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<103,101,110,95,115,101,114,118,101,114>>]},<<32,112,114,111,99,101,115,115,101,115,41,44,32,97,114,101,32,116,111,32,117,115,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,112,114,111,99,95,108,105,98,35,104,105,98,101,114,110,97,116,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,95,108,105,98,58,104,105,98,101,114,110,97,116,101,47,51>>]}]},<<32,105,110,115,116,101,97,100,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,32,99,111,110,116,105,110,117,101,115,32,116,111,32,119,111,114,107,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,107,101,115,32,117,112,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,54,48,56>>,signature => [{attribute,1167,spec,{{erlang,hibernate,3},[{type,1167,bounded_fun,[{type,1167,'fun',[{type,1167,product,[{var,1167,'Module'},{var,1167,'Function'},{var,1167,'Args'}]},{type,1167,no_return,[]}]},[{type,1168,constraint,[{atom,1168,is_subtype},[{var,1168,'Module'},{type,1168,module,[]}]]},{type,1169,constraint,[{atom,1169,is_subtype},[{var,1169,'Function'},{type,1169,atom,[]}]]},{type,1170,constraint,[{atom,1170,is_subtype},[{var,1170,'Args'},{type,1170,list,[{type,1170,term,[]}]}]]}]]}]}}]}},{{function,insert_element,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1175}],[<<105,110,115,101,114,116,95,101,108,101,109,101,110,116,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,110,115,101,114,116,101,100,32,97,116,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,105,110,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<46,32,65,108,108,32,101,108,101,109,101,110,116,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,97,110,100,32,117,112,119,97,114,100,115,32,97,114,101,32,112,117,115,104,101,100,32,111,110,101,32,115,116,101,112,32,104,105,103,104,101,114,32,105,110,32,116,104,101,32,110,101,119,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,50>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,105,110,115,101,114,116,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,44,32,110,101,119,41,46,10,123,111,110,101,44,110,101,119,44,116,119,111,44,116,104,114,101,101,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,54,52,57>>,signature => [{attribute,1175,spec,{{erlang,insert_element,3},[{type,1175,bounded_fun,[{type,1175,'fun',[{type,1175,product,[{var,1175,'Index'},{var,1175,'Tuple1'},{var,1175,'Term'}]},{var,1175,'Tuple2'}]},[{type,1176,constraint,[{atom,1176,is_subtype},[{var,1176,'Index'},{type,1176,pos_integer,[]}]]},{type,1177,constraint,[{atom,1177,is_subtype},[{var,1177,'Tuple1'},{type,1177,tuple,any}]]},{type,1178,constraint,[{atom,1178,is_subtype},[{var,1178,'Tuple2'},{type,1178,tuple,any}]]},{type,1179,constraint,[{atom,1179,is_subtype},[{var,1179,'Term'},{type,1179,term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1184}],[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,55,55,41,46,10,60,60,34,55,55,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,54,54,55>>,signature => [{attribute,1184,spec,{{integer_to_binary,1},[{type,1184,bounded_fun,[{type,1184,'fun',[{type,1184,product,[{var,1184,'Integer'}]},{type,1184,binary,[]}]},[{type,1185,constraint,[{atom,1185,is_subtype},[{var,1185,'Integer'},{type,1185,integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3805}],[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,49,48,50,51,44,32,49,54,41,46,10,60,60,34,51,70,70,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,54,55,57>>,signature => [{attribute,3805,spec,{{integer_to_binary,2},[{type,3805,bounded_fun,[{type,3805,'fun',[{type,3805,product,[{var,3805,'Integer'},{var,3805,'Base'}]},{type,3805,binary,[]}]},[{type,3806,constraint,[{atom,3806,is_subtype},[{var,3806,'Integer'},{type,3806,integer,[]}]]},{type,3807,constraint,[{atom,3807,is_subtype},[{var,3807,'Base'},{type,3807,range,[{integer,3807,2},{integer,3807,36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1190}],[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,55,55,41,46,10,34,55,55,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,54,57,50>>,signature => [{attribute,1190,spec,{{integer_to_list,1},[{type,1190,bounded_fun,[{type,1190,'fun',[{type,1190,product,[{var,1190,'Integer'}]},{type,1190,string,[]}]},[{type,1191,constraint,[{atom,1191,is_subtype},[{var,1191,'Integer'},{type,1191,integer,[]}]]}]]}]}}]}},{{function,integer_to_list,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3799}],[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,49,48,50,51,44,32,49,54,41,46,10,34,51,70,70,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,48,52>>,signature => [{attribute,3799,spec,{{integer_to_list,2},[{type,3799,bounded_fun,[{type,3799,'fun',[{type,3799,product,[{var,3799,'Integer'},{var,3799,'Base'}]},{type,3799,string,[]}]},[{type,3800,constraint,[{atom,3800,is_subtype},[{var,3800,'Integer'},{type,3800,integer,[]}]]},{type,3801,constraint,[{atom,3801,is_subtype},[{var,3801,'Base'},{type,3801,range,[{integer,3801,2},{integer,3801,36}]}]]}]]}]}}]}},{{function,iolist_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1196}],[<<105,111,108,105,115,116,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,44,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,116,104,97,116,32,119,111,117,108,100,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{code,[],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,116,101,109,41>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,111,108,105,115,116,95,115,105,122,101,40,91,49,44,50,124,60,60,51,44,52,62,62,93,41,46,10,52>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,49,55>>,signature => [{attribute,1196,spec,{{iolist_size,1},[{type,1196,bounded_fun,[{type,1196,'fun',[{type,1196,product,[{var,1196,'Item'}]},{type,1196,non_neg_integer,[]}]},[{type,1197,constraint,[{atom,1197,is_subtype},[{var,1197,'Item'},{type,1197,union,[{type,1197,iolist,[]},{type,1197,binary,[]}]}]]}]]}]}}]}},{{function,iolist_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1202}],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32>>,{code,[],[<<73,111,76,105,115,116,79,114,66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,51,48>>,signature => [{attribute,1202,spec,{{iolist_to_binary,1},[{type,1202,bounded_fun,[{type,1202,'fun',[{type,1202,product,[{var,1202,'IoListOrBinary'}]},{type,1202,binary,[]}]},[{type,1203,constraint,[{atom,1203,is_subtype},[{var,1203,'IoListOrBinary'},{type,1203,union,[{type,1203,iolist,[]},{type,1203,binary,[]}]}]]}]]}]}}]}},{{function,iolist_to_iovec,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1208}],[<<105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,111,118,101,99,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32>>,{code,[],[<<73,111,76,105,115,116,79,114,66,105,110,97,114,121>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,52,56>>,signature => [{attribute,1208,spec,{{erlang,iolist_to_iovec,1},[{type,1208,bounded_fun,[{type,1208,'fun',[{type,1208,product,[{var,1208,'IoListOrBinary'}]},{user_type,1208,iovec,[]}]},[{type,1209,constraint,[{atom,1209,is_subtype},[{var,1209,'IoListOrBinary'},{type,1209,union,[{type,1209,iolist,[]},{type,1209,binary,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,49>>}},{{function,is_alive,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1214}],[<<105,115,95,97,108,105,118,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,40,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,97,32,100,105,115,116,114,105,98,117,116,101,100,32,115,121,115,116,101,109,41,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,65,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,105,102,32,105,116,32,105,115,32,115,116,97,114,116,101,100,32,119,105,116,104,58>>]},{ol,[],[{li,[],[{a,[{href,<<101,114,116,115,58,101,114,108,35,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<34,101,114,108,32,45,110,97,109,101,32,76,79,78,71,78,65,77,69,34>>]}]},<<32,111,114,44>>]},{li,[],[{a,[{href,<<101,114,116,115,58,101,114,108,35,115,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<34,101,114,108,32,45,115,110,97,109,101,32,83,72,79,82,84,78,65,77,69,34>>]}]},<<46>>]}]},{p,[],[<<65,32,110,111,100,101,32,99,97,110,32,97,108,115,111,32,98,101,32,97,108,105,118,101,32,105,102,32,105,116,32,104,97,115,32,103,111,116,32,97,32,110,97,109,101,32,102,114,111,109,32,97,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,110,101,116,95,107,101,114,110,101,108,35,115,116,97,114,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,101,116,95,107,101,114,110,101,108,58,115,116,97,114,116,47,49>>]}]},<<32,97,110,100,32,104,97,115,32,110,111,116,32,98,101,101,110,32,115,116,111,112,112,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,110,101,116,95,107,101,114,110,101,108,35,115,116,111,112,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,48>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,53,55>>,signature => [{attribute,1214,spec,{{is_alive,0},[{type,1214,'fun',[{type,1214,product,[]},{type,1214,boolean,[]}]}]}}]}},{{function,is_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2141}],[<<105,115,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32,97,116,111,109,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,55,54>>,signature => [{attribute,2141,spec,{{is_atom,1},[{type,2141,bounded_fun,[{type,2141,'fun',[{type,2141,product,[{var,2141,'Term'}]},{type,2141,boolean,[]}]},[{type,2142,constraint,[{atom,2142,is_subtype},[{var,2142,'Term'},{type,2142,term,[]}]]}]]}]}}]}},{{function,is_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2147}],[<<105,115,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,32,98,105,110,97,114,121,32,97,108,119,97,121,115,32,99,111,110,116,97,105,110,115,32,97,32,99,111,109,112,108,101,116,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,56,54>>,signature => [{attribute,2147,spec,{{is_binary,1},[{type,2147,bounded_fun,[{type,2147,'fun',[{type,2147,product,[{var,2147,'Term'}]},{type,2147,boolean,[]}]},[{type,2148,constraint,[{atom,2148,is_subtype},[{var,2148,'Term'},{type,2148,term,[]}]]}]]}]}}]}},{{function,is_bitstring,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2153}],[<<105,115,95,98,105,116,115,116,114,105,110,103,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,40,105,110,99,108,117,100,105,110,103,32,97,32,98,105,110,97,114,121,41,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,57,55>>,signature => [{attribute,2153,spec,{{is_bitstring,1},[{type,2153,bounded_fun,[{type,2153,'fun',[{type,2153,product,[{var,2153,'Term'}]},{type,2153,boolean,[]}]},[{type,2154,constraint,[{atom,2154,is_subtype},[{var,2154,'Term'},{type,2154,term,[]}]]}]]}]}}]}},{{function,is_boolean,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2159}],[<<105,115,95,98,111,111,108,101,97,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<116,114,117,101>>]},<<32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,40,116,104,97,116,32,105,115,44,32,97,32,98,111,111,108,101,97,110,41,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,48,55>>,signature => [{attribute,2159,spec,{{is_boolean,1},[{type,2159,bounded_fun,[{type,2159,'fun',[{type,2159,product,[{var,2159,'Term'}]},{type,2159,boolean,[]}]},[{type,2160,constraint,[{atom,2160,is_subtype},[{var,2160,'Term'},{type,2160,term,[]}]]}]]}]}}]}},{{function,is_builtin,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1219}],[<<105,115,95,98,117,105,108,116,105,110,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,117,115,101,102,117,108,32,102,111,114,32,98,117,105,108,100,101,114,115,32,111,102,32,99,114,111,115,115,45,114,101,102,101,114,101,110,99,101,32,116,111,111,108,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<32,105,115,32,97,32,66,73,70,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,67,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,49,56>>,signature => [{attribute,1219,spec,{{erlang,is_builtin,3},[{type,1219,bounded_fun,[{type,1219,'fun',[{type,1219,product,[{var,1219,'Module'},{var,1219,'Function'},{var,1219,'Arity'}]},{type,1219,boolean,[]}]},[{type,1220,constraint,[{atom,1220,is_subtype},[{var,1220,'Module'},{type,1220,module,[]}]]},{type,1221,constraint,[{atom,1221,is_subtype},[{var,1221,'Function'},{type,1221,atom,[]}]]},{type,1222,constraint,[{atom,1222,is_subtype},[{var,1222,'Arity'},{type,1222,arity,[]}]]}]]}]}}]}},{{function,is_float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2165}],[<<105,115,95,102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,50,57>>,signature => [{attribute,2165,spec,{{is_float,1},[{type,2165,bounded_fun,[{type,2165,'fun',[{type,2165,product,[{var,2165,'Term'}]},{type,2165,boolean,[]}]},[{type,2166,constraint,[{atom,2166,is_subtype},[{var,2166,'Term'},{type,2166,term,[]}]]}]]}]}}]}},{{function,is_function,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2171}],[<<105,115,95,102,117,110,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,102,117,110,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,51,57>>,signature => [{attribute,2171,spec,{{is_function,1},[{type,2171,bounded_fun,[{type,2171,'fun',[{type,2171,product,[{var,2171,'Term'}]},{type,2171,boolean,[]}]},[{type,2172,constraint,[{atom,2172,is_subtype},[{var,2172,'Term'},{type,2172,term,[]}]]}]]}]}}]}},{{function,is_function,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2177}],[<<105,115,95,102,117,110,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,102,117,110,32,116,104,97,116,32,99,97,110,32,98,101,32,97,112,112,108,105,101,100,32,119,105,116,104,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,52,57>>,signature => [{attribute,2177,spec,{{is_function,2},[{type,2177,bounded_fun,[{type,2177,'fun',[{type,2177,product,[{var,2177,'Term'},{var,2177,'Arity'}]},{type,2177,boolean,[]}]},[{type,2178,constraint,[{atom,2178,is_subtype},[{var,2178,'Term'},{type,2178,term,[]}]]},{type,2179,constraint,[{atom,2179,is_subtype},[{var,2179,'Arity'},{type,2179,arity,[]}]]}]]}]}}]}},{{function,is_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2184}],[<<105,115,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,54,49>>,signature => [{attribute,2184,spec,{{is_integer,1},[{type,2184,bounded_fun,[{type,2184,'fun',[{type,2184,product,[{var,2184,'Term'}]},{type,2184,boolean,[]}]},[{type,2185,constraint,[{atom,2185,is_subtype},[{var,2185,'Term'},{type,2185,term,[]}]]}]]}]}}]}},{{function,is_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2190}],[<<105,115,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,108,105,115,116,32,119,105,116,104,32,122,101,114,111,32,111,114,32,109,111,114,101,32,101,108,101,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,55,49>>,signature => [{attribute,2190,spec,{{is_list,1},[{type,2190,bounded_fun,[{type,2190,'fun',[{type,2190,product,[{var,2190,'Term'}]},{type,2190,boolean,[]}]},[{type,2191,constraint,[{atom,2191,is_subtype},[{var,2191,'Term'},{type,2191,term,[]}]]}]]}]}}]}},{{function,is_map,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2208}],[<<105,115,95,109,97,112,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,109,97,112,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,56,49>>,signature => [{attribute,2208,spec,{{is_map,1},[{type,2208,bounded_fun,[{type,2208,'fun',[{type,2208,product,[{var,2208,'Term'}]},{type,2208,boolean,[]}]},[{type,2209,constraint,[{atom,2209,is_subtype},[{var,2209,'Term'},{type,2209,term,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,is_map_key,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1227}],[<<105,115,95,109,97,112,95,107,101,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,109,97,112,32>>,{code,[],[<<77,97,112>>]},<<32,99,111,110,116,97,105,110,115,32>>,{code,[],[<<75,101,121>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,116,104,101,32>>,{code,[],[<<75,101,121>>]},<<46>>]},{p,[],[<<84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<123,98,97,100,109,97,112,44,77,97,112,125>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32>>,{code,[],[<<77,97,112>>]},<<32,105,115,32,110,111,116,32,97,32,109,97,112,46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<62,32,77,97,112,32,61,32,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,46,10,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,10,62,32,105,115,95,109,97,112,95,107,101,121,40,34,52,50,34,44,77,97,112,41,46,10,116,114,117,101,10,62,32,105,115,95,109,97,112,95,107,101,121,40,118,97,108,117,101,44,77,97,112,41,46,10,102,97,108,115,101>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,57,49>>,signature => [{attribute,1227,spec,{{is_map_key,2},[{type,1227,bounded_fun,[{type,1227,'fun',[{type,1227,product,[{var,1227,'Key'},{var,1227,'Map'}]},{type,1227,boolean,[]}]},[{type,1228,constraint,[{atom,1228,is_subtype},[{var,1228,'Key'},{type,1228,term,[]}]]},{type,1229,constraint,[{atom,1229,is_subtype},[{var,1229,'Map'},{type,1229,map,any}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,is_number,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2196}],[<<105,115,95,110,117,109,98,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,49,50>>,signature => [{attribute,2196,spec,{{is_number,1},[{type,2196,bounded_fun,[{type,2196,'fun',[{type,2196,product,[{var,2196,'Term'}]},{type,2196,boolean,[]}]},[{type,2197,constraint,[{atom,2197,is_subtype},[{var,2197,'Term'},{type,2197,term,[]}]]}]]}]}}]}},{{function,is_pid,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2202}],[<<105,115,95,112,105,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,50,50>>,signature => [{attribute,2202,spec,{{is_pid,1},[{type,2202,bounded_fun,[{type,2202,'fun',[{type,2202,product,[{var,2202,'Term'}]},{type,2202,boolean,[]}]},[{type,2203,constraint,[{atom,2203,is_subtype},[{var,2203,'Term'},{type,2203,term,[]}]]}]]}]}}]}},{{function,is_port,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2214}],[<<105,115,95,112,111,114,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,51,50>>,signature => [{attribute,2214,spec,{{is_port,1},[{type,2214,bounded_fun,[{type,2214,'fun',[{type,2214,product,[{var,2214,'Term'}]},{type,2214,boolean,[]}]},[{type,2215,constraint,[{atom,2215,is_subtype},[{var,2215,'Term'},{type,2215,term,[]}]]}]]}]}}]}},{{function,is_process_alive,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1234}],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49>>],#{<<101,110>> => [{p,[],[{code,[],[<<80,105,100>>]},<<32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,32,97,110,100,32,105,115,32,97,108,105,118,101,44,32,116,104,97,116,32,105,115,44,32,105,115,32,110,111,116,32,101,120,105,116,105,110,103,32,97,110,100,32,104,97,115,32,110,111,116,32,101,120,105,116,101,100,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<73,102,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,49>>]},<<32,99,97,108,108,115,32>>,{code,[],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41>>]},<<32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,115,105,103,110,97,108,115,44,32,115,101,110,116,32,102,114,111,109,32>>,{code,[],[<<80,49>>]},<<32,116,111,32>>,{code,[],[<<80,50>>]},<<32,40>>,{code,[],[<<80,50>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,105,100,101,110,116,105,102,105,101,114,32>>,{code,[],[<<80,50,80,105,100>>]},<<41,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,44,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32>>,{code,[],[<<80,50>>]},<<32,98,101,102,111,114,101,32,116,104,101,32,97,108,105,118,101,110,101,115,115,32,111,102,32>>,{code,[],[<<80,50>>]},<<32,105,115,32,99,104,101,99,107,101,100,46,32,84,104,105,115,32,103,117,97,114,97,110,116,101,101,32,109,101,97,110,115,32,116,104,97,116,32,111,110,101,32,99,97,110,32,117,115,101,32>>,{code,[],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49>>]},<<32,116,111,32,108,101,116,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,49>>]},<<32,119,97,105,116,32,117,110,116,105,108,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,50>>]},<<44,32,119,104,105,99,104,32,104,97,115,32,103,111,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,102,114,111,109,32,80,49,44,32,105,115,32,107,105,108,108,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<101,120,105,116,40,80,50,80,105,100,44,32,107,105,108,108,41,44,10,37,32,80,50,32,109,105,103,104,116,32,110,111,116,32,98,101,32,107,105,108,108,101,100,10,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41,44,10,37,32,80,50,32,105,115,32,110,111,116,32,97,108,105,118,101,32,40,116,104,101,32,99,97,108,108,32,97,98,111,118,101,32,97,108,119,97,121,115,32,114,101,116,117,114,110,32,102,97,108,115,101,41>>]}]},{p,[],[<<83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,99,111,109,109,117,110,105,99,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,111,109,109,117,110,105,99,97,116,105,111,110,32,105,110,32,69,114,108,97,110,103>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]},<<32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,105,103,110,97,108,115,32,97,110,100,32,101,120,105,116,32,115,105,110,103,110,97,108,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,52,50>>,signature => [{attribute,1234,spec,{{is_process_alive,1},[{type,1234,bounded_fun,[{type,1234,'fun',[{type,1234,product,[{var,1234,'Pid'}]},{type,1234,boolean,[]}]},[{type,1235,constraint,[{atom,1235,is_subtype},[{var,1235,'Pid'},{type,1235,pid,[]}]]}]]}]}}]}},{{function,is_record,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2220}],[<<105,115,95,114,101,99,111,114,100,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,32,97,110,100,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,114,109,97,108,108,121,32,116,104,101,32,99,111,109,112,105,108,101,114,32,116,114,101,97,116,115,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<105,115,95,114,101,99,111,114,100,47,50>>]},<<32,101,115,112,101,99,105,97,108,108,121,46,32,73,116,32,101,109,105,116,115,32,99,111,100,101,32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,44,32,116,104,97,116,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,115,105,122,101,32,105,115,32,99,111,114,114,101,99,116,46,32,72,111,119,101,118,101,114,44,32,105,102,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,105,115,32,110,111,116,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,44,32,116,104,101,32,66,73,70,32>>,{code,[],[<<105,115,95,114,101,99,111,114,100,47,50>>]},<<32,105,115,32,99,97,108,108,101,100,32,105,110,115,116,101,97,100,32,97,110,100,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,116,117,112,108,101,32,105,115,32,110,111,116,32,118,101,114,105,102,105,101,100,46>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,44,32,105,102,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,55,52>>,signature => [{attribute,2220,spec,{{is_record,2},[{type,2220,bounded_fun,[{type,2220,'fun',[{type,2220,product,[{var,2220,'Term'},{var,2220,'RecordTag'}]},{type,2220,boolean,[]}]},[{type,2221,constraint,[{atom,2221,is_subtype},[{var,2221,'Term'},{type,2221,term,[]}]]},{type,2222,constraint,[{atom,2222,is_subtype},[{var,2222,'RecordTag'},{type,2222,atom,[]}]]}]]}]}}]}},{{function,is_record,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2227}],[<<105,115,95,114,101,99,111,114,100,47,51>>],#{<<101,110>> => [{p,[],[{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,44,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<44,32,97,110,100,32,105,116,115,32,115,105,122,101,32,105,115,32>>,{code,[],[<<83,105,122,101>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,32,105,102,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,32,97,110,100,32>>,{code,[],[<<83,105,122,101>>]},<<32,105,115,32,97,32,108,105,116,101,114,97,108,32,105,110,116,101,103,101,114,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,100,111,99,117,109,101,110,116,101,100,32,102,111,114,32,99,111,109,112,108,101,116,101,110,101,115,115,46,32,85,115,117,97,108,108,121,32>>,{code,[],[<<105,115,95,114,101,99,111,114,100,47,50>>]},<<32,105,115,32,116,111,32,98,101,32,117,115,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,57,53>>,signature => [{attribute,2227,spec,{{is_record,3},[{type,2227,bounded_fun,[{type,2227,'fun',[{type,2227,product,[{var,2227,'Term'},{var,2227,'RecordTag'},{var,2227,'Size'}]},{type,2227,boolean,[]}]},[{type,2228,constraint,[{atom,2228,is_subtype},[{var,2228,'Term'},{type,2228,term,[]}]]},{type,2229,constraint,[{atom,2229,is_subtype},[{var,2229,'RecordTag'},{type,2229,atom,[]}]]},{type,2230,constraint,[{atom,2230,is_subtype},[{var,2230,'Size'},{type,2230,non_neg_integer,[]}]]}]]}]}}]}},{{function,is_reference,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2235}],[<<105,115,95,114,101,102,101,114,101,110,99,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,49,52>>,signature => [{attribute,2235,spec,{{is_reference,1},[{type,2235,bounded_fun,[{type,2235,'fun',[{type,2235,product,[{var,2235,'Term'}]},{type,2235,boolean,[]}]},[{type,2236,constraint,[{atom,2236,is_subtype},[{var,2236,'Term'},{type,2236,term,[]}]]}]]}]}}]}},{{function,is_tuple,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2241}],[<<105,115,95,116,117,112,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,50,52>>,signature => [{attribute,2241,spec,{{is_tuple,1},[{type,2241,bounded_fun,[{type,2241,'fun',[{type,2241,product,[{var,2241,'Term'}]},{type,2241,boolean,[]}]},[{type,2242,constraint,[{atom,2242,is_subtype},[{var,2242,'Term'},{type,2242,term,[]}]]}]]}]}}]}},{{function,length,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1241}],[<<108,101,110,103,116,104,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,101,110,103,116,104,40,91,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,93,41,46,10,57>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,51,52>>,signature => [{attribute,1241,spec,{{length,1},[{type,1241,bounded_fun,[{type,1241,'fun',[{type,1241,product,[{var,1241,'List'}]},{type,1241,non_neg_integer,[]}]},[{type,1242,constraint,[{atom,1242,is_subtype},[{var,1242,'List'},{type,1242,list,[{type,1242,term,[]}]}]]}]]}]}}]}},{{function,link,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1247}],[<<108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,40,111,114,32,112,111,114,116,41,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<46,32,73,102,32,116,104,101,32,108,105,110,107,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,32,111,114,32,97,32,112,114,111,99,101,115,115,32,97,116,116,101,109,112,116,115,32,116,111,32,99,114,101,97,116,101,32,97,32,108,105,110,107,32,116,111,32,105,116,115,101,108,102,44,32,110,111,116,104,105,110,103,32,105,115,32,100,111,110,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,108,105,110,107,32,105,115,32,115,101,116,32,117,112,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,110,100,32,99,104,101,99,107,105,110,103,32,105,116,32,105,115,32,99,104,101,97,112,44,32,97,32>>,{code,[],[<<110,111,112,114,111,99>>]},<<32,101,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46,32,67,117,114,114,101,110,116,108,121,44,32,99,104,101,99,107,105,110,103,32,105,115,32,99,104,101,97,112,32,105,102,32,116,104,101,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,105,115,32,108,111,99,97,108,32,97,110,100,32,116,104,101,32,99,97,108,108,101,114,32,100,111,101,115,32,110,111,116,32,116,114,97,112,32,101,120,105,116,115,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50,32>>]}]},<<41,46>>]},{p,[],[<<65,112,97,114,116,32,102,114,111,109,32,97,110,121,32,101,120,105,116,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,32,105,116,115,101,108,102,44,32,116,119,111,32,115,112,101,99,105,97,108,32,101,120,105,116,32,115,105,103,110,97,108,115,32,109,97,121,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<110,111,112,114,111,99>>]},<<32,105,115,32,115,101,110,116,32,105,109,109,101,100,105,97,116,101,108,121,32,105,102,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,108,105,110,107,105,110,103,32,40,105,102,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,32,111,114,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,105,115,32,114,101,109,111,116,101,41,46>>]}]},{li,[],[{p,[],[{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,105,102,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,105,115,32,114,101,109,111,116,101,32,97,110,100,32,97,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,99,111,117,108,100,32,110,111,116,32,98,101,32,101,115,116,97,98,108,105,115,104,101,100,32,111,114,32,119,97,115,32,115,101,118,101,114,101,100,46>>]}]}]},{p,[],[<<83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,108,105,110,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<80,114,111,99,101,115,115,101,115,32,226,158,156,32,76,105,110,107,115>>]},<<32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,52,54>>,signature => [{attribute,1247,spec,{{link,1},[{type,1247,bounded_fun,[{type,1247,'fun',[{type,1247,product,[{var,1247,'PidOrPort'}]},{atom,1247,true}]},[{type,1248,constraint,[{atom,1248,is_subtype},[{var,1248,'PidOrPort'},{type,1248,union,[{type,1248,pid,[]},{type,1248,port,[]}]}]]}]]}]}}]}},{{function,list_to_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1253}],[<<108,105,115,116,95,116,111,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,109,97,121,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,97,108,108,111,119,101,100,32,111,110,108,121,32,73,83,79,45,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,116,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,100,105,100,32,110,111,116,32,97,108,108,111,119,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,98,111,118,101,32,50,53,53,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,85,110,105,99,111,100,101,32,115,117,112,112,111,114,116,32,105,110,32,97,116,111,109,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,101,120,116,95,100,105,115,116,35,117,116,102,56,95,97,116,111,109,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,116,101,32,111,110,32,85,84,70,45,56,32,101,110,99,111,100,101,100,32,97,116,111,109,115>>]},<<32,105,110,32,115,101,99,116,105,111,110,32,34,69,120,116,101,114,110,97,108,32,84,101,114,109,32,70,111,114,109,97,116,34,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,105,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>]}]},<<32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,32,116,104,97,110,32>>,{code,[],[<<108,105,115,116,95,116,111,95,97,116,111,109,47,49>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,97,116,111,109,40,34,69,114,108,97,110,103,34,41,46,10,39,69,114,108,97,110,103,39>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,56,52>>,signature => [{attribute,1253,spec,{{list_to_atom,1},[{type,1253,bounded_fun,[{type,1253,'fun',[{type,1253,product,[{var,1253,'String'}]},{type,1253,atom,[]}]},[{type,1254,constraint,[{atom,1254,is_subtype},[{var,1254,'String'},{type,1254,string,[]}]]}]]}]}}]}},{{function,list_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1259}],[<<108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32>>,{code,[],[<<73,111,76,105,115,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,50,48>>,signature => [{attribute,1259,spec,{{list_to_binary,1},[{type,1259,bounded_fun,[{type,1259,'fun',[{type,1259,product,[{var,1259,'IoList'}]},{type,1259,binary,[]}]},[{type,1260,constraint,[{atom,1260,is_subtype},[{var,1260,'IoList'},{type,1260,iolist,[]}]]}]]}]}}]}},{{function,list_to_bitstring,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1265}],[<<108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<98,105,116,115,116,114,105,110,103,95,108,105,115,116>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,116,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,116,115,116,114,105,110,103,115,32,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103,76,105,115,116>>]},<<46,32,40,84,104,101,32,108,97,115,116,32,116,97,105,108,32,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103,76,105,115,116>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,32,98,105,116,115,116,114,105,110,103,46,41,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,44,55,58,52,62,62,46,10,60,60,54,44,55,58,52,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,44,55,58,52,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,51,56>>,signature => [{attribute,1265,spec,{{list_to_bitstring,1},[{type,1265,bounded_fun,[{type,1265,'fun',[{type,1265,product,[{var,1265,'BitstringList'}]},{type,1265,bitstring,[]}]},[{type,1266,constraint,[{atom,1266,is_subtype},[{var,1266,'BitstringList'},{user_type,1266,bitstring_list,[]}]]}]]}]}}]}},{{function,list_to_existing_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1271}],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,32,115,117,99,104,32,97,116,111,109,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,114,101,32,100,111,101,115,32,110,111,116,32,97,108,114,101,97,100,121,32,101,120,105,115,116,32,97,110,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,32,114,101,119,114,105,116,101,32>>,{code,[],[<<97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41>>]},<<32,116,111,32>>,{code,[],[<<34,115,111,109,101,95,97,116,111,109,34>>]},<<46,32,73,102,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,111,109,101,95,97,116,111,109>>]},<<32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,32>>,{code,[],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,34,115,111,109,101,95,97,116,111,109,34,41>>]},<<32,119,105,108,108,32,102,97,105,108,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,53,57>>,signature => [{attribute,1271,spec,{{list_to_existing_atom,1},[{type,1271,bounded_fun,[{type,1271,'fun',[{type,1271,product,[{var,1271,'String'}]},{type,1271,atom,[]}]},[{type,1272,constraint,[{atom,1272,is_subtype},[{var,1272,'String'},{type,1272,string,[]}]]}]]}]}}]}},{{function,list_to_float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1277}],[<<108,105,115,116,95,116,111,95,102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,102,108,111,97,116,40,34,50,46,50,48,49,55,55,54,52,101,43,48,34,41,46,10,50,46,50,48,49,55,55,54,52>>]}]},{p,[],[<<84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,56,48>>,signature => [{attribute,1277,spec,{{list_to_float,1},[{type,1277,bounded_fun,[{type,1277,'fun',[{type,1277,product,[{var,1277,'String'}]},{type,1277,float,[]}]},[{type,1278,constraint,[{atom,1278,is_subtype},[{var,1278,'String'},{type,1278,string,[]}]]}]]}]}}]}},{{function,list_to_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1283}],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,49,50,51,34,41,46,10,49,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,49,50,51,34,41,46,10,45,49,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52,34,41,46,10,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52>>]}]},{p,[],[{code,[],[<<83,116,114,105,110,103>>]},<<32,109,117,115,116,32,99,111,110,116,97,105,110,32,97,116,32,108,101,97,115,116,32,111,110,101,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32,99,97,110,32,104,97,118,101,32,97,110,32,111,112,116,105,111,110,97,108,32,112,114,101,102,105,120,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32,97,32,115,105,110,103,108,101,32,34>>,{code,[],[<<43>>]},<<34,32,111,114,32,34>>,{code,[],[<<45>>]},<<34,32,99,104,97,114,97,99,116,101,114,32,40,116,104,97,116,32,105,115,44,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32>>,{code,[],[<<34,94,91,43,45,93,63,91,48,45,57,93,43,36,34>>]},<<41,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,57,56>>,signature => [{attribute,1283,spec,{{list_to_integer,1},[{type,1283,bounded_fun,[{type,1283,'fun',[{type,1283,product,[{var,1283,'String'}]},{type,1283,integer,[]}]},[{type,1284,constraint,[{atom,1284,is_subtype},[{var,1284,'String'},{type,1284,string,[]}]]}]]}]}}]}},{{function,list_to_integer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1289}],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,102,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,70,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,51,70,70,34,44,32,49,54,41,46,10,45,49,48,50,51>>]}]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32>>,{code,[],[<<66,97,115,101>>]},<<32,105,115,32,49,54,44,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32>>,{code,[],[<<34,94,91,43,45,93,63,40,91,48,45,57,93,124,91,65,45,70,93,124,91,97,45,102,93,41,43,36,34>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,50,51>>,signature => [{attribute,1289,spec,{{list_to_integer,2},[{type,1289,bounded_fun,[{type,1289,'fun',[{type,1289,product,[{var,1289,'String'},{var,1289,'Base'}]},{type,1289,integer,[]}]},[{type,1290,constraint,[{atom,1290,is_subtype},[{var,1290,'String'},{type,1290,string,[]}]]},{type,1291,constraint,[{atom,1291,is_subtype},[{var,1291,'Base'},{type,1291,range,[{integer,1291,2},{integer,1291,36}]}]]}]]}]}}]}},{{function,list_to_pid,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1296}],[<<108,105,115,116,95,116,111,95,112,105,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,112,105,100,40,34,60,48,46,52,46,49,62,34,41,46,10,60,48,46,52,46,49,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,53,51>>,signature => [{attribute,1296,spec,{{list_to_pid,1},[{type,1296,bounded_fun,[{type,1296,'fun',[{type,1296,product,[{var,1296,'String'}]},{type,1296,pid,[]}]},[{type,1297,constraint,[{atom,1297,is_subtype},[{var,1297,'String'},{type,1297,string,[]}]]}]]}]}}]}},{{function,list_to_port,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1302}],[<<108,105,115,116,95,116,111,95,112,111,114,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,112,111,114,116,40,34,35,80,111,114,116,60,48,46,52,62,34,41,46,10,35,80,111,114,116,60,48,46,52,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,55,49>>,signature => [{attribute,1302,spec,{{list_to_port,1},[{type,1302,bounded_fun,[{type,1302,'fun',[{type,1302,product,[{var,1302,'String'}]},{type,1302,port,[]}]},[{type,1303,constraint,[{atom,1303,is_subtype},[{var,1303,'String'},{type,1303,string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_ref,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1308}],[<<108,105,115,116,95,116,111,95,114,101,102,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,114,101,102,101,114,101,110,99,101,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,114,101,102,40,34,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62,34,41,46,10,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,114,101,102,101,114,101,110,99,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,56,57>>,signature => [{attribute,1308,spec,{{list_to_ref,1},[{type,1308,bounded_fun,[{type,1308,'fun',[{type,1308,product,[{var,1308,'String'}]},{type,1308,reference,[]}]},[{type,1309,constraint,[{atom,1309,is_subtype},[{var,1309,'String'},{type,1309,string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_tuple,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1314}],[<<108,105,115,116,95,116,111,95,116,117,112,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,116,117,112,108,101,40,91,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,93,41,46,10,123,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,125>>]}]},{p,[],[{code,[],[<<76,105,115,116>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,48,55>>,signature => [{attribute,1314,spec,{{list_to_tuple,1},[{type,1314,bounded_fun,[{type,1314,'fun',[{type,1314,product,[{var,1314,'List'}]},{type,1314,tuple,any}]},[{type,1315,constraint,[{atom,1315,is_subtype},[{var,1315,'List'},{type,1315,list,[{type,1315,term,[]}]}]]}]]}]}}]}},{{function,load_module,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2246}],[<<108,111,97,100,95,109,111,100,117,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<44,32,116,104,105,115,32,66,73,70,32,108,111,97,100,115,32,116,104,97,116,32,111,98,106,101,99,116,32,99,111,100,101,46,32,73,102,32,116,104,101,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,44,32,97,108,108,32,101,120,112,111,114,116,32,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,114,101,112,108,97,99,101,100,32,115,111,32,116,104,101,121,32,112,111,105,110,116,32,116,111,32,116,104,101,32,110,101,119,108,121,32,108,111,97,100,101,100,32,99,111,100,101,46,32,84,104,101,32,112,114,101,118,105,111,117,115,108,121,32,108,111,97,100,101,100,32,99,111,100,101,32,105,115,32,107,101,112,116,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,97,115,32,111,108,100,32,99,111,100,101,44,32,97,115,32,116,104,101,114,101,32,99,97,110,32,115,116,105,108,108,32,98,101,32,112,114,111,99,101,115,115,101,115,32,101,120,101,99,117,116,105,110,103,32,116,104,97,116,32,99,111,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,101,105,116,104,101,114,32>>,{code,[],[<<123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125>>]},<<44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,102,105,108,101>>]}]},{dd,[],[<<84,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,105,110,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,102,111,114,109,97,116,32>>,{em,[],[<<111,114>>]},<<32,116,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,99,111,110,116,97,105,110,115,32,99,111,100,101,32,102,111,114,32,97,110,111,116,104,101,114,32,109,111,100,117,108,101,32,116,104,97,110,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,116,95,112,117,114,103,101,100>>]}]},{dd,[],[{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,108,111,97,100,101,100,32,98,101,99,97,117,115,101,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,50,48>>,signature => [{attribute,2246,spec,{{load_module,2},[{type,2246,bounded_fun,[{type,2246,'fun',[{type,2246,product,[{var,2246,'Module'},{var,2246,'Binary'}]},{type,2246,union,[{type,2246,tuple,[{atom,2246,module},{var,2246,'Module'}]},{type,2246,tuple,[{atom,2246,error},{var,2246,'Reason'}]}]}]},[{type,2247,constraint,[{atom,2247,is_subtype},[{var,2247,'Module'},{type,2247,module,[]}]]},{type,2248,constraint,[{atom,2248,is_subtype},[{var,2248,'Binary'},{type,2248,binary,[]}]]},{type,2249,constraint,[{atom,2249,is_subtype},[{var,2249,'Reason'},{type,2249,union,[{atom,2249,badfile},{atom,2249,not_purged},{atom,2249,on_load}]}]]}]]}]}}]}},{{function,load_nif,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2267}],[<<108,111,97,100,95,110,105,102,47,50>>],#{<<101,110>> => [{p,[],[<<76,111,97,100,115,32,97,110,100,32,108,105,110,107,115,32,97,32,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,101,100,32,102,117,110,99,116,105,111,110,115,32,40,78,73,70,115,41,32,102,111,114,32,97,32,109,111,100,117,108,101,46,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,97,32,102,105,108,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,104,97,114,101,97,98,108,101,32,111,98,106,101,99,116,47,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,102,105,108,101,32,109,105,110,117,115,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,102,105,108,101,32,101,120,116,101,110,115,105,111,110,32,40>>,{code,[],[<<46,115,111>>]},<<32,102,111,114,32,85,110,105,120,32,97,110,100,32>>,{code,[],[<<46,100,108,108>>]},<<32,102,111,114,32,87,105,110,100,111,119,115,41,46,32,78,111,116,105,99,101,32,116,104,97,116,32,111,110,32,109,111,115,116,32,79,83,115,32,116,104,101,32,108,105,98,114,97,114,121,32,104,97,115,32,116,111,32,104,97,118,101,32,97,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,32,111,110,32,100,105,115,99,32,119,104,101,110,32,97,110,32,117,112,103,114,97,100,101,32,111,102,32,116,104,101,32,110,105,102,32,105,115,32,100,111,110,101,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,116,104,101,32,115,97,109,101,44,32,98,117,116,32,116,104,101,32,99,111,110,116,101,110,116,115,32,100,105,102,102,101,114,44,32,116,104,101,32,111,108,100,32,108,105,98,114,97,114,121,32,109,97,121,32,98,101,32,108,111,97,100,101,100,32,105,110,115,116,101,97,100,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,32,78,73,70,32,108,105,98,114,97,114,121,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,108,95,110,105,102>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,108,95,110,105,102,40,51,41>>]}]},<<46>>]},{p,[],[{code,[],[<<76,111,97,100,73,110,102,111>>]},<<32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46,32,73,116,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,108,105,98,114,97,114,121,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,46,32,65,32,103,111,111,100,32,112,114,97,99,116,105,99,101,32,105,115,32,116,111,32,105,110,99,108,117,100,101,32,97,32,109,111,100,117,108,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,116,111,32,115,117,112,112,111,114,116,32,102,117,116,117,114,101,32,99,111,100,101,32,117,112,103,114,97,100,101,32,115,99,101,110,97,114,105,111,115,46>>]},{p,[],[<<84,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<108,111,97,100,95,110,105,102,47,50>>]},<<32,109,117,115,116,32,98,101,32,109,97,100,101,32>>,{em,[],[<<100,105,114,101,99,116,108,121>>]},<<32,102,114,111,109,32,116,104,101,32,69,114,108,97,110,103,32,99,111,100,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,98,101,108,111,110,103,115,32,116,111,46,32,73,116,32,114,101,116,117,114,110,115,32,101,105,116,104,101,114,32>>,{code,[],[<<111,107>>]},<<44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,123,82,101,97,115,111,110,44,84,101,120,116,125,125>>]},<<32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,32,119,104,105,108,101,32>>,{code,[],[<<84,101,120,116>>]},<<32,105,115,32,97,32,104,117,109,97,110,32,114,101,97,100,97,98,108,101,32,115,116,114,105,110,103,32,116,104,97,116,32,99,97,110,32,103,105,118,101,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,97,105,108,117,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,111,97,100,95,102,97,105,108,101,100>>]}]},{dd,[],[<<84,104,101,32,79,83,32,102,97,105,108,101,100,32,116,111,32,108,111,97,100,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,46>>]},{dt,[],[{code,[],[<<98,97,100,95,108,105,98>>]}]},{dd,[],[<<84,104,101,32,108,105,98,114,97,114,121,32,100,105,100,32,110,111,116,32,102,117,108,102,105,108,108,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,97,115,32,97,32,78,73,70,32,108,105,98,114,97,114,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,109,111,100,117,108,101,46>>]},{dt,[],[{code,[],[<<108,111,97,100,32,124,32,117,112,103,114,97,100,101>>]}]},{dd,[],[<<84,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,98,114,97,114,121,32,99,97,108,108,98,97,99,107,32,119,97,115,32,117,110,115,117,99,99,101,115,115,102,117,108,46>>]},{dt,[],[{code,[],[<<114,101,108,111,97,100>>]}]},{dd,[],[<<65,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,97,108,114,101,97,100,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,105,110,115,116,97,110,99,101,46,32,84,104,101,32,112,114,101,118,105,111,117,115,108,121,32,100,101,112,114,101,99,97,116,101,100,32>>,{code,[],[<<114,101,108,111,97,100>>]},<<32,102,101,97,116,117,114,101,32,119,97,115,32,114,101,109,111,118,101,100,32,105,110,32,79,84,80,32,50,48,46>>]},{dt,[],[{code,[],[<<111,108,100,95,99,111,100,101>>]}]},{dd,[],[<<84,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<108,111,97,100,95,110,105,102,47,50>>]},<<32,119,97,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,111,108,100,32,99,111,100,101,32,111,102,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,117,112,103,114,97,100,101,100,59,32,116,104,105,115,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,53,51>>,signature => [{attribute,2267,spec,{{erlang,load_nif,2},[{type,2267,bounded_fun,[{type,2267,'fun',[{type,2267,product,[{var,2267,'Path'},{var,2267,'LoadInfo'}]},{type,2267,union,[{atom,2267,ok},{var,2267,'Error'}]}]},[{type,2268,constraint,[{atom,2268,is_subtype},[{var,2268,'Path'},{type,2268,string,[]}]]},{type,2269,constraint,[{atom,2269,is_subtype},[{var,2269,'LoadInfo'},{type,2269,term,[]}]]},{type,2270,constraint,[{atom,2270,is_subtype},[{var,2270,'Error'},{type,2270,tuple,[{atom,2270,error},{type,2270,tuple,[{var,2270,'Reason'},{ann_type,2270,[{var,2270,'Text'},{type,2270,string,[]}]}]}]}]]},{type,2271,constraint,[{atom,2271,is_subtype},[{var,2271,'Reason'},{type,2271,union,[{atom,2271,load_failed},{atom,2271,bad_lib},{atom,2271,load},{atom,2271,reload},{atom,2271,upgrade},{atom,2271,old_code}]}]]}]]}]}}]}},{{function,loaded,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1320}],[<<108,111,97,100,101,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,40,99,117,114,114,101,110,116,32,97,110,100,32,111,108,100,32,99,111,100,101,41,44,32,105,110,99,108,117,100,105,110,103,32,112,114,101,108,111,97,100,101,100,32,109,111,100,117,108,101,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,48,50>>,signature => [{attribute,1320,spec,{{erlang,loaded,0},[{type,1320,bounded_fun,[{type,1320,'fun',[{type,1320,product,[]},{type,1320,list,[{var,1320,'Module'}]}]},[{type,1321,constraint,[{atom,1321,is_subtype},[{var,1321,'Module'},{type,1321,module,[]}]]}]]}]}}]}},{{function,localtime,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1326}],[<<108,111,99,97,108,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,44,32>>,{code,[],[<<123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,49,51>>,signature => [{attribute,1326,spec,{{erlang,localtime,0},[{type,1326,bounded_fun,[{type,1326,'fun',[{type,1326,product,[]},{var,1326,'DateTime'}]},[{type,1327,constraint,[{atom,1327,is_subtype},[{var,1327,'DateTime'},{remote_type,1327,[{atom,1327,calendar},{atom,1327,datetime},[]]}]]}]]}]}}]}},{{function,localtime_to_universaltime,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3481}],[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,44,32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,32,97,110,100,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,51,48>>,signature => [{attribute,3481,spec,{{erlang,localtime_to_universaltime,1},[{type,3481,bounded_fun,[{type,3481,'fun',[{type,3481,product,[{var,3481,'Localtime'}]},{var,3481,'Universaltime'}]},[{type,3482,constraint,[{atom,3482,is_subtype},[{var,3482,'Localtime'},{remote_type,3482,[{atom,3482,calendar},{atom,3482,datetime},[]]}]]},{type,3483,constraint,[{atom,3483,is_subtype},[{var,3483,'Universaltime'},{remote_type,3483,[{atom,3483,calendar},{atom,3483,datetime},[]]}]]}]]}]}}]}},{{function,localtime_to_universaltime,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2275}],[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,97,115,32>>,{code,[],[<<101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,49>>]},<<44,32,98,117,116,32,116,104,101,32,99,97,108,108,101,114,32,100,101,99,105,100,101,115,32,105,102,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,105,115,32,97,99,116,105,118,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<73,115,68,115,116,32,61,61,32,116,114,117,101>>]},<<44,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,105,115,32,100,117,114,105,110,103,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,44,32,105,102,32>>,{code,[],[<<73,115,68,115,116,32,61,61,32,102,97,108,115,101>>]},<<32,105,116,32,105,115,32,110,111,116,46,32,73,102,32>>,{code,[],[<<73,115,68,115,116,32,61,61,32,117,110,100,101,102,105,110,101,100>>]},<<44,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,99,97,110,32,103,117,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,41>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,116,114,117,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,50,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,102,97,108,115,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,117,110,100,101,102,105,110,101,100,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,52,55>>,signature => [{attribute,2275,spec,{{erlang,localtime_to_universaltime,2},[{type,2275,bounded_fun,[{type,2275,'fun',[{type,2275,product,[{var,2275,'Localtime'},{var,2275,'IsDst'}]},{var,2275,'Universaltime'}]},[{type,2276,constraint,[{atom,2276,is_subtype},[{var,2276,'Localtime'},{remote_type,2276,[{atom,2276,calendar},{atom,2276,datetime},[]]}]]},{type,2277,constraint,[{atom,2277,is_subtype},[{var,2277,'Universaltime'},{remote_type,2277,[{atom,2277,calendar},{atom,2277,datetime},[]]}]]},{type,2278,constraint,[{atom,2278,is_subtype},[{var,2278,'IsDst'},{type,2278,union,[{atom,2278,true},{atom,2278,false},{atom,2278,undefined}]}]]}]]}]}}]}},{{function,make_ref,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1332}],[<<109,97,107,101,95,114,101,102,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100,35,117,110,105,113,117,101,95,114,101,102,101,114,101,110,99,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<117,110,105,113,117,101,32,114,101,102,101,114,101,110,99,101>>]},<<46,32,84,104,101,32,114,101,102,101,114,101,110,99,101,32,105,115,32,117,110,105,113,117,101,32,97,109,111,110,103,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<75,110,111,119,110,32,105,115,115,117,101,58,32,87,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,44,32,114,101,102,101,114,101,110,99,101,115,32,99,114,101,97,116,101,100,32,111,110,32,97,32,110,101,119,101,114,32,110,111,100,101,32,99,97,110,32,98,101,32,109,105,115,116,97,107,101,110,32,102,111,114,32,97,32,114,101,102,101,114,101,110,99,101,32,99,114,101,97,116,101,100,32,111,110,32,97,110,32,111,108,100,101,114,32,110,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,55,51>>,signature => [{attribute,1332,spec,{{make_ref,0},[{type,1332,'fun',[{type,1332,product,[]},{type,1332,reference,[]}]}]}}]}},{{function,make_tuple,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2294}],[<<109,97,107,101,95,116,117,112,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,110,101,119,32,116,117,112,108,101,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32>>,{code,[],[<<65,114,105,116,121>>]},<<44,32,119,104,101,114,101,32,97,108,108,32,101,108,101,109,101,110,116,115,32,97,114,101,32>>,{code,[],[<<73,110,105,116,105,97,108,86,97,108,117,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,52,44,32,91,93,41,46,10,123,91,93,44,91,93,44,91,93,44,91,93,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,57,48>>,signature => [{attribute,2294,spec,{{erlang,make_tuple,2},[{type,2294,bounded_fun,[{type,2294,'fun',[{type,2294,product,[{var,2294,'Arity'},{var,2294,'InitialValue'}]},{type,2294,tuple,any}]},[{type,2295,constraint,[{atom,2295,is_subtype},[{var,2295,'Arity'},{type,2295,arity,[]}]]},{type,2296,constraint,[{atom,2296,is_subtype},[{var,2296,'InitialValue'},{type,2296,term,[]}]]}]]}]}}]}},{{function,make_tuple,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2301}],[<<109,97,107,101,95,116,117,112,108,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,116,117,112,108,101,32,111,102,32,115,105,122,101,32>>,{code,[],[<<65,114,105,116,121>>]},<<44,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,104,97,115,32,118,97,108,117,101,32>>,{code,[],[<<68,101,102,97,117,108,116,86,97,108,117,101>>]},<<44,32,97,110,100,32,116,104,101,110,32,102,105,108,108,115,32,105,110,32,118,97,108,117,101,115,32,102,114,111,109,32>>,{code,[],[<<73,110,105,116,76,105,115,116>>]},<<46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<73,110,105,116,76,105,115,116>>]},<<32,109,117,115,116,32,98,101,32,97,32,116,119,111,45,116,117,112,108,101,44,32,119,104,101,114,101,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,116,117,112,108,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,121,32,116,101,114,109,46,32,73,102,32,97,32,112,111,115,105,116,105,111,110,32,111,99,99,117,114,115,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,116,104,101,32,116,101,114,109,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,108,97,115,116,32,111,99,99,117,114,114,101,110,99,101,32,105,115,32,117,115,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,53,44,32,91,93,44,32,91,123,50,44,105,103,110,111,114,101,100,125,44,123,53,44,122,122,125,44,123,50,44,97,97,125,93,41,46,10,123,91,93,44,97,97,44,91,93,44,91,93,44,122,122,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,48,50>>,signature => [{attribute,2301,spec,{{erlang,make_tuple,3},[{type,2301,bounded_fun,[{type,2301,'fun',[{type,2301,product,[{var,2301,'Arity'},{var,2301,'DefaultValue'},{var,2301,'InitList'}]},{type,2301,tuple,any}]},[{type,2302,constraint,[{atom,2302,is_subtype},[{var,2302,'Arity'},{type,2302,arity,[]}]]},{type,2303,constraint,[{atom,2303,is_subtype},[{var,2303,'DefaultValue'},{type,2303,term,[]}]]},{type,2304,constraint,[{atom,2304,is_subtype},[{var,2304,'InitList'},{type,2304,list,[{type,2304,tuple,[{ann_type,2304,[{var,2304,'Position'},{type,2304,pos_integer,[]}]},{type,2304,term,[]}]}]}]]}]]}]}}]}},{{function,map_get,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1343}],[<<109,97,112,95,103,101,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<32,105,102,32>>,{code,[],[<<77,97,112>>]},<<32,99,111,110,116,97,105,110,115,32>>,{code,[],[<<75,101,121>>]},<<46>>]},{p,[],[<<84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<123,98,97,100,109,97,112,44,77,97,112,125>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32>>,{code,[],[<<77,97,112>>]},<<32,105,115,32,110,111,116,32,97,32,109,97,112,44,32,111,114,32,119,105,116,104,32,97,32>>,{code,[],[<<123,98,97,100,107,101,121,44,75,101,121,125>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<62,32,75,101,121,32,61,32,49,51,51,55,44,10,32,32,77,97,112,32,61,32,35,123,52,50,32,61,62,32,118,97,108,117,101,95,116,119,111,44,49,51,51,55,32,61,62,32,34,118,97,108,117,101,32,111,110,101,34,44,34,97,34,32,61,62,32,49,125,44,10,32,32,109,97,112,95,103,101,116,40,75,101,121,44,77,97,112,41,46,10,34,118,97,108,117,101,32,111,110,101,34>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,50,48>>,signature => [{attribute,1343,spec,{{map_get,2},[{type,1343,bounded_fun,[{type,1343,'fun',[{type,1343,product,[{var,1343,'Key'},{var,1343,'Map'}]},{var,1343,'Value'}]},[{type,1344,constraint,[{atom,1344,is_subtype},[{var,1344,'Map'},{type,1344,map,any}]]},{type,1345,constraint,[{atom,1345,is_subtype},[{var,1345,'Key'},{type,1345,any,[]}]]},{type,1346,constraint,[{atom,1346,is_subtype},[{var,1346,'Value'},{type,1346,any,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,map_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1337}],[<<109,97,112,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,107,101,121,45,118,97,108,117,101,32,112,97,105,114,115,32,105,110,32>>,{code,[],[<<77,97,112>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,109,97,112,95,115,105,122,101,40,35,123,97,61,62,49,44,32,98,61,62,50,44,32,99,61,62,51,125,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,52,48>>,signature => [{attribute,1337,spec,{{map_size,1},[{type,1337,bounded_fun,[{type,1337,'fun',[{type,1337,product,[{var,1337,'Map'}]},{type,1337,non_neg_integer,[]}]},[{type,1338,constraint,[{atom,1338,is_subtype},[{var,1338,'Map'},{type,1338,map,any}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,match_spec_test,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1351}],[<<109,97,116,99,104,95,115,112,101,99,95,116,101,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,101,115,116,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,117,115,101,100,32,105,110,32,99,97,108,108,115,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,116,115,35,115,101,108,101,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,116,115,58,115,101,108,101,99,116,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,101,115,116,115,32,98,111,116,104,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,34,115,121,110,116,97,99,116,105,99,34,32,99,111,114,114,101,99,116,110,101,115,115,32,97,110,100,32,114,117,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,103,97,105,110,115,116,32,116,104,101,32,111,98,106,101,99,116,46,32,73,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,99,111,110,116,97,105,110,115,32,101,114,114,111,114,115,44,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,69,114,114,111,114,115,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,101,114,101,32>>,{code,[],[<<69,114,114,111,114,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,110,97,116,117,114,97,108,32,108,97,110,103,117,97,103,101,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,119,104,97,116,32,119,97,115,32,119,114,111,110,103,32,119,105,116,104,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<116,97,98,108,101>>]},<<44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,116,117,112,108,101,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,104,101,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,82,101,115,117,108,116,44,91,93,44,87,97,114,110,105,110,103,115,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,119,104,97,116,32,119,111,117,108,100,32,104,97,118,101,32,98,101,101,110,32,116,104,101,32,114,101,115,117,108,116,32,105,110,32,97,32,114,101,97,108,32>>,{code,[],[<<101,116,115,58,115,101,108,101,99,116,47,50>>]},<<32,99,97,108,108,44,32,111,114,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,111,98,106,101,99,116,32,116,117,112,108,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<116,114,97,99,101>>]},<<44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,82,101,115,117,108,116,44,32,70,108,97,103,115,44,32,87,97,114,110,105,110,103,115,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{code,[],[<<116,114,117,101>>]},<<32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,116,111,32,98,101,32,101,109,105,116,116,101,100>>]},{li,[],[{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,101,109,105,116,116,101,100>>]},{li,[],[<<84,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,32,116,111,32,98,101,32,97,112,112,101,110,100,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101>>]}]},{p,[],[{code,[],[<<70,108,97,103,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,116,111,32,98,101,32,101,110,97,98,108,101,100,44,32,99,117,114,114,101,110,116,108,121,32,116,104,105,115,32,105,115,32,111,110,108,121,32>>,{code,[],[<<114,101,116,117,114,110,95,116,114,97,99,101>>]},<<46>>]},{p,[],[<<84,104,105,115,32,105,115,32,97,32,117,115,101,102,117,108,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,116,101,115,116,32,116,111,111,108,44,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,119,114,105,116,105,110,103,32,99,111,109,112,108,105,99,97,116,101,100,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,116,115,35,116,101,115,116,95,109,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,116,115,58,116,101,115,116,95,109,115,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,53,51>>,signature => [{attribute,1351,spec,{{erlang,match_spec_test,3},[{type,1351,bounded_fun,[{type,1351,'fun',[{type,1351,product,[{var,1351,'MatchAgainst'},{var,1351,'MatchSpec'},{var,1351,'Type'}]},{var,1351,'TestResult'}]},[{type,1352,constraint,[{atom,1352,is_subtype},[{var,1352,'MatchAgainst'},{type,1352,union,[{type,1352,list,[{type,1352,term,[]}]},{type,1352,tuple,any}]}]]},{type,1353,constraint,[{atom,1353,is_subtype},[{var,1353,'MatchSpec'},{type,1353,term,[]}]]},{type,1354,constraint,[{atom,1354,is_subtype},[{var,1354,'Type'},{type,1354,union,[{atom,1354,table},{atom,1354,trace}]}]]},{type,1355,constraint,[{atom,1355,is_subtype},[{var,1355,'TestResult'},{type,1355,union,[{type,1355,tuple,[{atom,1355,ok},{type,1355,term,[]},{type,1355,list,[{atom,1355,return_trace}]},{type,1355,list,[{type,1355,tuple,[{type,1355,union,[{atom,1355,error},{atom,1355,warning}]},{type,1355,string,[]}]}]}]},{type,1355,tuple,[{atom,1355,error},{type,1355,list,[{type,1355,tuple,[{type,1355,union,[{atom,1355,error},{atom,1355,warning}]},{type,1355,string,[]}]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,max,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3962}],[<<109,97,120,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,111,102,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,97,110,100,32>>,{code,[],[<<84,101,114,109,50>>]},<<46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,44,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110>>]},<<32,99,111,110,116,97,105,110,115,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,109,97,120,40,49,44,32,50,41,46,10,50>>]}]},{pre,[],[{code,[],[<<62,32,109,97,120,40,49,46,48,44,32,49,41,46,10,49,46,48>>]}]},{pre,[],[{code,[],[<<62,32,109,97,120,40,49,44,32,49,46,48,41,46,10,49>>]}]},{pre,[],[{code,[],[<<62,32,109,97,120,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,98,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,57,49>>,signature => [{attribute,3962,spec,{{max,2},[{type,3962,bounded_fun,[{type,3962,'fun',[{type,3962,product,[{var,3962,'Term1'},{var,3962,'Term2'}]},{var,3962,'Maximum'}]},[{type,3963,constraint,[{atom,3963,is_subtype},[{var,3963,'Term1'},{type,3963,term,[]}]]},{type,3964,constraint,[{atom,3964,is_subtype},[{var,3964,'Term2'},{type,3964,term,[]}]]},{type,3965,constraint,[{atom,3965,is_subtype},[{var,3965,'Maximum'},{type,3965,term,[]}]]}]]}]}}]}},{{function,md5,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1360}],[<<109,100,53,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,117,116,101,115,32,97,110,32,77,68,53,32,109,101,115,115,97,103,101,32,100,105,103,101,115,116,32,102,114,111,109,32>>,{code,[],[<<68,97,116,97>>]},<<44,32,119,104,101,114,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,100,105,103,101,115,116,32,105,115,32,49,50,56,32,98,105,116,115,32,40,49,54,32,98,121,116,101,115,41,46,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,111,114,32,97,32,108,105,115,116,32,111,102,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,77,68,53,44,32,115,101,101,32>>,{a,[{href,<<104,116,116,112,115,58,47,47,119,119,119,46,105,101,116,102,46,111,114,103,47,114,102,99,47,114,102,99,49,51,50,49,46,116,120,116>>}],[<<82,70,67,32,49,51,50,49,32,45,32,84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,99,111,110,115,105,100,101,114,101,100,32,115,97,102,101,32,102,111,114,32,99,111,100,101,45,115,105,103,110,105,110,103,32,111,114,32,115,111,102,116,119,97,114,101,45,105,110,116,101,103,114,105,116,121,32,112,117,114,112,111,115,101,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,50,48>>,signature => [{attribute,1360,spec,{{erlang,md5,1},[{type,1360,bounded_fun,[{type,1360,'fun',[{type,1360,product,[{var,1360,'Data'}]},{var,1360,'Digest'}]},[{type,1361,constraint,[{atom,1361,is_subtype},[{var,1361,'Data'},{type,1361,iodata,[]}]]},{type,1362,constraint,[{atom,1362,is_subtype},[{var,1362,'Digest'},{type,1362,binary,[]}]]}]]}]}}]}},{{function,md5_final,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1367}],[<<109,100,53,95,102,105,110,97,108,47,49>>],#{<<101,110>> => [{p,[],[<<70,105,110,105,115,104,101,115,32,116,104,101,32,117,112,100,97,116,101,32,111,102,32,97,110,32,77,68,53,32>>,{code,[],[<<67,111,110,116,101,120,116>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,117,116,101,100,32>>,{code,[],[<<77,68,53>>]},<<32,109,101,115,115,97,103,101,32,100,105,103,101,115,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,51,56>>,signature => [{attribute,1367,spec,{{erlang,md5_final,1},[{type,1367,bounded_fun,[{type,1367,'fun',[{type,1367,product,[{var,1367,'Context'}]},{var,1367,'Digest'}]},[{type,1368,constraint,[{atom,1368,is_subtype},[{var,1368,'Context'},{type,1368,binary,[]}]]},{type,1369,constraint,[{atom,1369,is_subtype},[{var,1369,'Digest'},{type,1369,binary,[]}]]}]]}]}}]}},{{function,md5_init,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1374}],[<<109,100,53,95,105,110,105,116,47,48>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,110,32,77,68,53,32,99,111,110,116,101,120,116,44,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,100,53,95,117,112,100,97,116,101,47,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,52,56>>,signature => [{attribute,1374,spec,{{erlang,md5_init,0},[{type,1374,bounded_fun,[{type,1374,'fun',[{type,1374,product,[]},{var,1374,'Context'}]},[{type,1375,constraint,[{atom,1375,is_subtype},[{var,1375,'Context'},{type,1375,binary,[]}]]}]]}]}}]}},{{function,md5_update,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1380}],[<<109,100,53,95,117,112,100,97,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<85,112,100,97,116,101,32,97,110,32,77,68,53,32>>,{code,[],[<<67,111,110,116,101,120,116>>]},<<32,119,105,116,104,32>>,{code,[],[<<68,97,116,97>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32,97,32>>,{code,[],[<<78,101,119,67,111,110,116,101,120,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,53,55>>,signature => [{attribute,1380,spec,{{erlang,md5_update,2},[{type,1380,bounded_fun,[{type,1380,'fun',[{type,1380,product,[{var,1380,'Context'},{var,1380,'Data'}]},{var,1380,'NewContext'}]},[{type,1381,constraint,[{atom,1381,is_subtype},[{var,1381,'Context'},{type,1381,binary,[]}]]},{type,1382,constraint,[{atom,1382,is_subtype},[{var,1382,'Data'},{type,1382,iodata,[]}]]},{type,1383,constraint,[{atom,1383,is_subtype},[{var,1383,'NewContext'},{type,1383,binary,[]}]]}]]}]}}]}},{{function,memory,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3994}],[<<109,101,109,111,114,121,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,101,109,111,114,121,95,116,121,112,101>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,84,121,112,101,44,32,83,105,122,101,125>>]},<<46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,109,101,109,111,114,121,32,116,121,112,101,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32>>,{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,105,110,32,98,121,116,101,115,46>>]},{p,[],[<<77,101,109,111,114,121,32,116,121,112,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,111,116,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,102,111,114,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<46>>]}]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46>>]}]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,101,115,95,117,115,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,32,116,104,97,116,32,105,115,32,110,111,116,32,100,105,114,101,99,116,108,121,32,114,101,108,97,116,101,100,32,116,111,32,97,110,121,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,32,77,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,105,115,32,109,101,109,111,114,121,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,111,111,108,115,58,105,110,115,116,114,117,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,115,116,114,117,109,101,110,116,40,51,41>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,97,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,98,114,101,97,107,100,111,119,110,32,111,102,32,119,104,97,116,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,105,115,32,116,121,112,101,46>>]}]},{dt,[],[{code,[],[<<97,116,111,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<97,116,111,109,95,117,115,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<97,116,111,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,98,105,110,97,114,105,101,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<99,111,100,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,114,108,97,110,103,32,99,111,100,101,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<101,116,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,84,83,32,116,97,98,108,101,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<108,111,119>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,111,110,32,54,52,45,98,105,116,32,104,97,108,102,119,111,114,100,32,101,109,117,108,97,116,111,114,46,32,84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,105,110,32,108,111,119,32,109,101,109,111,114,121,32,97,114,101,97,115,32,116,104,97,116,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,32,116,111,32,60,32,52,32,71,66,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,115,121,115,116,101,109,32,99,97,110,32,104,97,118,101,32,109,111,114,101,32,109,101,109,111,114,121,46>>]},{p,[],[<<67,97,110,32,98,101,32,114,101,109,111,118,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,32,111,102,32,116,104,101,32,104,97,108,102,119,111,114,100,32,101,109,117,108,97,116,111,114,46>>]}]},{dt,[],[{code,[],[<<109,97,120,105,109,117,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,115,105,110,99,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46,32,84,104,105,115,32,116,117,112,108,101,32,105,115,32,111,110,108,121,32,112,114,101,115,101,110,116,32,119,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,114,117,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,111,111,108,115,58,105,110,115,116,114,117,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,115,116,114,117,109,101,110,116,40,51,41>>]}]},<<32,97,110,100,47,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<101,114,108,40,49,41>>]}]},<<46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,118,97,108,117,101,32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,46,32,83,111,109,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,105,115,32,118,97,108,117,101,32,105,115,32,110,111,116,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,118,97,108,117,101,32,105,115,32,109,111,114,101,32,97,99,99,117,114,97,116,101,44,32,98,117,116,32,109,101,109,111,114,121,32,100,105,114,101,99,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32>>,{code,[],[<<109,97,108,108,111,99>>]},<<32,40,97,110,100,32,102,114,105,101,110,100,115,41,32,105,115,32,115,116,105,108,108,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,118,97,108,117,101,46,32,68,105,114,101,99,116,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,97,108,108,111,99>>]},<<32,97,114,101,32,111,110,108,121,32,100,111,110,101,32,102,114,111,109,32,79,83,45,115,112,101,99,105,102,105,99,32,114,117,110,116,105,109,101,32,108,105,98,114,97,114,105,101,115,32,97,110,100,32,112,101,114,104,97,112,115,32,102,114,111,109,32,117,115,101,114,45,105,109,112,108,101,109,101,110,116,101,100,32,69,114,108,97,110,103,32,100,114,105,118,101,114,115,32,116,104,97,116,32,100,111,32,110,111,116,32,117,115,101,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,100,114,105,118,101,114,32,105,110,116,101,114,102,97,99,101,46>>]},{p,[],[<<65,115,32,116,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<44,32,116,104,101,32,101,114,114,111,114,32,105,110,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,112,114,111,112,97,103,97,116,101,115,32,116,111,32,116,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,46>>]},{p,[],[<<84,104,101,32,100,105,102,102,101,114,101,110,116,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,32,116,104,97,116,32,97,114,101,32,115,117,109,109,101,100,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,44,32,119,104,105,99,104,32,105,110,116,114,111,100,117,99,101,115,32,97,110,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},{p,[],[<<84,104,101,32,100,105,102,102,101,114,101,110,116,32,118,97,108,117,101,115,32,104,97,118,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,108,97,116,105,111,110,32,116,111,32,101,97,99,104,32,111,116,104,101,114,46,32,86,97,108,117,101,115,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,97,110,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,32,105,115,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<116,111,116,97,108,32,32,32,32,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,115,121,115,116,101,109,10,112,114,111,99,101,115,115,101,115,32,32,61,32,112,114,111,99,101,115,115,101,115,95,117,115,101,100,32,43,32,80,114,111,99,101,115,115,101,115,78,111,116,85,115,101,100,10,115,121,115,116,101,109,32,32,32,32,32,61,32,97,116,111,109,32,43,32,98,105,110,97,114,121,32,43,32,99,111,100,101,32,43,32,101,116,115,32,43,32,79,116,104,101,114,83,121,115,116,101,109,10,97,116,111,109,32,32,32,32,32,32,32,61,32,97,116,111,109,95,117,115,101,100,32,43,32,65,116,111,109,78,111,116,85,115,101,100,10,82,101,97,108,84,111,116,97,108,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,82,101,97,108,83,121,115,116,101,109,10,82,101,97,108,83,121,115,116,101,109,32,61,32,115,121,115,116,101,109,32,43,32,77,105,115,115,101,100,83,121,115,116,101,109>>]}]},{p,[],[<<77,111,114,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,104,97,114,101,100,32,108,105,98,114,97,114,105,101,115,44,32,116,104,101,32,99,111,100,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,116,115,101,108,102,44,32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,115,116,97,99,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,97,108,108,32,112,97,103,101,115,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,101,109,117,108,97,116,111,114,46>>]},{p,[],[<<65,108,115,111,44,32,98,101,99,97,117,115,101,32,111,102,32,102,114,97,103,109,101,110,116,97,116,105,111,110,32,97,110,100,32,112,114,101,114,101,115,101,114,118,97,116,105,111,110,32,111,102,32,109,101,109,111,114,121,32,97,114,101,97,115,44,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,115,101,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,32,99,97,110,32,98,101,32,109,117,99,104,32,108,97,114,103,101,114,32,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32>>,{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48>>]},<<32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,105,102,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,54,56>>,signature => [{attribute,3994,spec,{{erlang,memory,0},[{type,3994,bounded_fun,[{type,3994,'fun',[{type,3994,product,[]},{type,3994,list,[{type,3994,tuple,[{var,3994,'Type'},{var,3994,'Size'}]}]}]},[{type,3995,constraint,[{atom,3995,is_subtype},[{var,3995,'Type'},{user_type,3995,memory_type,[]}]]},{type,3996,constraint,[{atom,3996,is_subtype},[{var,3996,'Size'},{type,3996,non_neg_integer,[]}]]}]]}]}}]}},{{function,memory,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,4013}],[<<109,101,109,111,114,121,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,101,109,111,114,121,95,116,121,112,101>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,109,101,109,111,114,121,32,111,102,32,116,121,112,101,32>>,{code,[],[<<84,121,112,101>>]},<<46,32,84,104,101,32,97,114,103,117,109,101,110,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<109,101,109,111,114,121,95,116,121,112,101,40,41>>]},<<32,97,116,111,109,115,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,97,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,109,101,109,111,114,121,95,116,121,112,101,40,41,44,32,83,105,122,101,32,58,58,32,105,110,116,101,103,101,114,32,62,61,32,48,125>>]},<<32,116,117,112,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32>>,{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,49>>]},<<32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,116,121,112,101,115,32,108,105,115,116,101,100,32,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,101,109,111,114,121,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48>>]}]},<<46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<109,97,120,105,109,117,109>>]},<<32,105,115,32,112,97,115,115,101,100,32,97,115,32>>,{code,[],[<<84,121,112,101>>]},<<32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,110,111,116,32,114,117,110,32,105,110,32,105,110,115,116,114,117,109,101,110,116,101,100,32,109,111,100,101,46>>]},{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[<<73,102,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,101,109,111,114,121,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,49,50>>,signature => [{attribute,4013,spec,{{erlang,memory,1},[{type,4013,'fun',[{type,4013,product,[{ann_type,4013,[{var,4013,'Type'},{user_type,4013,memory_type,[]}]}]},{type,4013,non_neg_integer,[]}]},{type,4014,'fun',[{type,4014,product,[{ann_type,4014,[{var,4014,'TypeList'},{type,4014,list,[{user_type,4014,memory_type,[]}]}]}]},{type,4014,list,[{type,4014,tuple,[{user_type,4014,memory_type,[]},{type,4014,non_neg_integer,[]}]}]}]}]}}]}},{{function,min,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3955}],[<<109,105,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,97,110,100,32>>,{code,[],[<<84,101,114,109,50>>]},<<46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,44,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110>>]},<<32,99,111,110,116,97,105,110,115,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,109,105,110,40,49,44,32,50,41,46,10,49>>]}]},{pre,[],[{code,[],[<<62,32,109,105,110,40,49,46,48,44,32,49,41,46,10,49,46,48>>]}]},{pre,[],[{code,[],[<<62,32,109,105,110,40,49,44,32,49,46,48,41,46,10,49>>]}]},{pre,[],[{code,[],[<<62,32,109,105,110,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,97,98,99,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,53,50>>,signature => [{attribute,3955,spec,{{min,2},[{type,3955,bounded_fun,[{type,3955,'fun',[{type,3955,product,[{var,3955,'Term1'},{var,3955,'Term2'}]},{var,3955,'Minimum'}]},[{type,3956,constraint,[{atom,3956,is_subtype},[{var,3956,'Term1'},{type,3956,term,[]}]]},{type,3957,constraint,[{atom,3957,is_subtype},[{var,3957,'Term2'},{type,3957,term,[]}]]},{type,3958,constraint,[{atom,3958,is_subtype},[{var,3958,'Minimum'},{type,3958,term,[]}]]}]]}]}}]}},{{function,module_loaded,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1388}],[<<109,111,100,117,108,101,95,108,111,97,100,101,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,108,111,97,100,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,116,116,101,109,112,116,32,116,111,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,56,49>>,signature => [{attribute,1388,spec,{{module_loaded,1},[{type,1388,bounded_fun,[{type,1388,'fun',[{type,1388,product,[{var,1388,'Module'}]},{type,1388,boolean,[]}]},[{type,1389,constraint,[{atom,1389,is_subtype},[{var,1389,'Module'},{type,1389,module,[]}]]}]]}]}}]}},{{function,monitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1401}],[<<109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,111,110,105,116,111,114,95,112,111,114,116,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]}]},{p,[],[{a,[{id,<<109,111,110,105,116,111,114,95,109,101,115,115,97,103,101>>}],[]},<<83,101,110,100,115,32,97,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,111,102,32,116,121,112,101,32>>,{code,[],[<<84,121,112,101>>]},<<32,116,111,32,116,104,101,32,101,110,116,105,116,121,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<46,32,73,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,111,114,32,105,116,32,99,104,97,110,103,101,115,32,109,111,110,105,116,111,114,101,100,32,115,116,97,116,101,44,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,105,115,32,110,111,116,105,102,105,101,100,32,98,121,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,97,116,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<123,84,97,103,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,105,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,115,105,103,110,97,108,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,97,107,101,115,32,116,105,109,101,32,98,101,102,111,114,101,32,116,104,101,32,115,105,103,110,97,108,32,114,101,97,99,104,101,115,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,46>>]}]},{p,[],[{code,[],[<<84,121,112,101>>]},<<32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,58,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<44,32>>,{code,[],[<<112,111,114,116>>]},<<32,111,114,32>>,{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]},<<46>>]},{p,[],[<<65,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116>>]},<<32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,111,110,108,121,32,111,110,99,101,44,32,97,102,116,101,114,32,116,104,97,116,32,105,116,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,98,111,116,104,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,77,111,110,105,116,111,114,115,32,97,114,101,32,102,105,114,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,116,101,114,109,105,110,97,116,101,115,44,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,32,99,114,101,97,116,105,111,110,44,32,111,114,32,105,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,44,32,119,101,32,100,111,32,110,111,116,32,107,110,111,119,32,105,102,32,105,116,32,115,116,105,108,108,32,101,120,105,115,116,115,46,32,84,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,115,111,32,116,117,114,110,101,100,32,111,102,102,32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<100,101,109,111,110,105,116,111,114,47,49>>]},<<32,105,115,32,99,97,108,108,101,100,46>>]},{p,[],[<<65,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116>>]},<<32,109,111,110,105,116,111,114,32,98,121,32,110,97,109,101,32,114,101,115,111,108,118,101,115,32,116,104,101,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,116,111,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<32,111,110,108,121,32,111,110,99,101,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,32,109,111,110,105,116,111,114,32,105,110,115,116,97,110,116,105,97,116,105,111,110,44,32,108,97,116,101,114,32,99,104,97,110,103,101,115,32,116,111,32,116,104,101,32,110,97,109,101,32,114,101,103,105,115,116,114,97,116,105,111,110,32,119,105,108,108,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,101,120,105,115,116,105,110,103,32,109,111,110,105,116,111,114,46>>]},{p,[],[<<87,104,101,110,32,97,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116>>]},<<32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,104,97,116,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125>>]}]},{p,[],[<<73,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,97,110,100,32>>,{code,[],[<<84,121,112,101>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,44,32,97,110,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<79,98,106,101,99,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,44,32,119,104,105,99,104,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32,101,118,101,110,116,46,32,87,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,44,32>>,{code,[],[<<79,98,106,101,99,116>>]},<<32,119,105,108,108,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<32,116,104,97,116,32,119,97,115,32,98,101,105,110,103,32,109,111,110,105,116,111,114,101,100,46,32,87,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,98,121,32,110,97,109,101,44,32>>,{code,[],[<<79,98,106,101,99,116>>]},<<32,119,105,108,108,32,104,97,118,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,119,104,105,99,104,32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,119,105,116,104,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,99,97,108,108,32,97,110,100,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,110,111,100,101,32,110,97,109,101,32,40,102,111,114,32,112,111,114,116,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,44,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,97,108,119,97,121,115,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,41,46>>]}]},{dt,[],[{code,[],[<<73,110,102,111>>]}]},{dd,[],[{p,[],[<<69,105,116,104,101,114,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,44,32>>,{code,[],[<<110,111,112,114,111,99>>]},<<32,40,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,100,105,100,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,109,111,110,105,116,111,114,32,99,114,101,97,116,105,111,110,41,44,32,111,114,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,40,110,111,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,115,41,46>>]}]}]},{dl,[],[{dt,[],[<<77,111,110,105,116,111,114,105,110,103,32,97,32>>,{a,[{id,<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115>>}],[]},{code,[],[<<112,114,111,99,101,115,115>>]}]},{dd,[],[{p,[],[<<67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,40,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,41,44,32,97,110,32,97,116,111,109,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,111,114,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,44,32,108,111,99,97,116,101,100,32,101,108,115,101,119,104,101,114,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,101,102,111,114,101,32,69,82,84,83,32,49,48,46,48,32,40,79,84,80,32,50,49,46,48,41,44,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,32,99,111,117,108,100,32,102,97,105,108,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,100,32,111,110,32,97,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,40,115,117,99,104,32,97,115,32,101,114,108,95,105,110,116,101,114,102,97,99,101,32,111,114,32,106,105,110,116,101,114,102,97,99,101,41,44,32,119,104,101,114,101,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,46>>]},{p,[],[<<78,111,119,44,32,115,117,99,104,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,119,105,108,108,32,105,110,115,116,101,97,100,32,115,117,99,99,101,101,100,32,97,110,100,32,97,32,109,111,110,105,116,111,114,32,105,115,32,99,114,101,97,116,101,100,46,32,66,117,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,111,110,108,121,32,115,117,112,101,114,118,105,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,32>>,{code,[],[<<123,39,68,79,87,78,39,44,32,95,44,32,112,114,111,99,101,115,115,44,32,95,44,32,110,111,99,111,110,110,101,99,116,105,111,110,125>>]},<<32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,115,115,97,103,101,32,116,104,97,116,32,109,97,121,32,98,101,32,114,101,99,101,105,118,101,100,44,32,97,115,32,116,104,101,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,104,97,118,101,32,110,111,32,119,97,121,32,111,102,32,114,101,112,111,114,116,105,110,103,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,46>>]}]}]},{dt,[],[<<77,111,110,105,116,111,114,105,110,103,32,97,32>>,{a,[{id,<<109,111,110,105,116,111,114,95,112,111,114,116>>}],[]},{code,[],[<<112,111,114,116>>]}]},{dd,[],[{p,[],[<<67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<32,40,111,110,108,121,32,108,111,99,97,108,41,44,32,97,110,32,97,116,111,109,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,111,114,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,111,114,116,44,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,78,111,116,101,44,32,116,104,97,116,32,97,116,116,101,109,112,116,32,116,111,32,109,111,110,105,116,111,114,32,97,32,114,101,109,111,116,101,32,112,111,114,116,32,119,105,108,108,32,114,101,115,117,108,116,32,105,110,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46>>]}]},{dt,[],[<<77,111,110,105,116,111,114,105,110,103,32,97,32>>,{a,[{id,<<109,111,110,105,116,111,114,95,116,105,109,101,95,111,102,102,115,101,116>>}],[]},{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]}]},{dd,[],[{p,[],[<<77,111,110,105,116,111,114,115,32,99,104,97,110,103,101,115,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,105,109,101,32,111,102,102,115,101,116>>]}]},<<32,98,101,116,119,101,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<46,32,79,110,101,32,118,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,101,120,105,115,116,115,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<116,105,109,101,95,111,102,102,115,101,116,32,84,121,112,101>>]},<<44,32,110,97,109,101,108,121,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<99,108,111,99,107,95,115,101,114,118,105,99,101>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<99,108,111,99,107,95,115,101,114,118,105,99,101>>]},<<32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,32,112,114,111,99,101,115,115,46,32,73,110,32,116,104,105,115,32,99,97,115,101,32,105,116,32,115,101,114,118,101,115,32,97,115,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,116,101,114,110,97,108,32,99,108,111,99,107,32,115,101,114,118,105,99,101,32,97,116,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,119,104,101,110,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,105,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,105,115,32,99,104,97,110,103,101,100,44,32,111,114,32,105,102,32,116,104,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,32,102,105,110,97,108,32,100,117,114,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,116,105,109,101,95,111,102,102,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,110,97,108,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116>>]},<<32,119,104,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46,32,87,104,101,110,32,97,32,99,104,97,110,103,101,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,32,102,105,110,97,108,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,109,97,100,101,44,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,111,110,99,101,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,119,97,115,32,99,104,97,110,103,101,100,32,111,114,32,110,111,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,111,101,115,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,44,32,115,111,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,102,116,101,114,32,105,116,32,104,97,115,32,98,101,101,110,32,116,114,105,103,103,101,114,101,100,46,32,84,104,97,116,32,105,115,44,32,114,101,112,101,97,116,101,100,32,99,104,97,110,103,101,115,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,116,114,105,103,103,101,114,32,116,104,101,32,109,111,110,105,116,111,114,32,114,101,112,101,97,116,101,100,108,121,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,97,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,46,32,65,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<123,39,67,72,65,78,71,69,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,73,116,101,109,44,32,78,101,119,84,105,109,101,79,102,102,115,101,116,125>>]}]},{p,[],[<<119,104,101,114,101,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<44,32>>,{code,[],[<<84,121,112,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,44,32,97,110,100,32>>,{code,[],[<<78,101,119,84,105,109,101,79,102,102,115,101,116>>]},<<32,105,115,32,116,104,101,32,110,101,119,32,116,105,109,101,32,111,102,102,115,101,116,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,32,104,97,115,32,98,101,101,110,32,114,101,99,101,105,118,101,100,32,121,111,117,32,97,114,101,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,114,101,116,114,105,101,118,101,32,116,104,101,32,111,108,100,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]}]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,121,111,117,32,99,97,110,32,111,98,115,101,114,118,101,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]},<<32,98,101,102,111,114,101,32,121,111,117,32,103,101,116,32,116,104,101,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,46>>]}]}]},{p,[],[<<77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,102,111,114,32,116,104,101,32,115,97,109,101,32>>,{code,[],[<<73,116,101,109>>]},<<32,97,110,100,47,111,114,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,32,105,110,115,116,97,110,99,101,115,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,104,97,116,32,105,115,44,32,111,116,104,101,114,32>>,{code,[],[<<84,121,112,101>>]},<<115,32,97,110,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,111,114,32,119,104,101,110,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,105,115,32,101,120,116,101,110,100,101,100,44,32,111,116,104,101,114,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<84,97,103>>]},<<44,32>>,{code,[],[<<79,98,106,101,99,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,105,110,116,114,111,100,117,99,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,57,54>>,signature => [{attribute,1401,spec,{{monitor,2},[{type,1402,bounded_fun,[{type,1402,'fun',[{type,1402,product,[{atom,1402,process},{user_type,1402,monitor_process_identifier,[]}]},{var,1402,'MonitorRef'}]},[{type,1403,constraint,[{atom,1403,is_subtype},[{var,1403,'MonitorRef'},{type,1403,reference,[]}]]}]]},{type,1404,bounded_fun,[{type,1404,'fun',[{type,1404,product,[{atom,1404,port},{user_type,1404,monitor_port_identifier,[]}]},{var,1404,'MonitorRef'}]},[{type,1405,constraint,[{atom,1405,is_subtype},[{var,1405,'MonitorRef'},{type,1405,reference,[]}]]}]]},{type,1406,bounded_fun,[{type,1406,'fun',[{type,1406,product,[{atom,1406,time_offset},{atom,1406,clock_service}]},{var,1406,'MonitorRef'}]},[{type,1407,constraint,[{atom,1407,is_subtype},[{var,1407,'MonitorRef'},{type,1407,reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48,44,79,84,80,32,49,57,46,48>>}},{{function,monitor,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1413}],[<<109,111,110,105,116,111,114,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,111,110,105,116,111,114,95,112,111,114,116,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]}]},{p,[],[<<80,114,111,118,105,100,101,115,32,97,110,32,111,112,116,105,111,110,32,108,105,115,116,32,102,111,114,32,109,111,100,105,102,105,99,97,116,105,111,110,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,112,114,111,118,105,100,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,50>>]}]},<<46,32,84,104,101,32>>,{code,[],[<<84,121,112,101>>]},<<32,97,110,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,97,114,103,117,109,101,110,116,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,109,101,97,110,105,110,103,32,97,115,32,119,104,101,110,32,112,97,115,115,101,100,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<46,32,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,108,105,97,115,44,32,85,110,97,108,105,97,115,79,112,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,119,105,108,108,32,97,108,115,111,32,98,101,99,111,109,101,32,97,110,32,97,108,105,97,115,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,97,108,105,97,115,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,108,105,97,115,47,48>>]}]},<<46,32,84,104,101,32>>,{code,[],[<<85,110,97,108,105,97,115,79,112,116>>]},<<32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32,97,108,105,97,115,32,115,104,111,117,108,100,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,46>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,97,108,105,97,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,97,108,105,97,115,47,49>>]}]},<<32,119,105,108,108,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,46>>]}]},{dt,[],[{code,[],[<<100,101,109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,118,105,97,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,47,49>>]}]},<<32,111,114,32,119,104,101,110,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,97,115,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,100,101,108,105,118,101,114,101,100,32,100,117,101,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46>>]}]},{dt,[],[{code,[],[<<114,101,112,108,121,95,100,101,109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,32,40,115,101,101,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114>>]},<<32,111,112,116,105,111,110,32,97,98,111,118,101,41,32,111,114,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,87,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,97,108,115,111,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,110,32,99,108,105,101,110,116,47,115,101,114,118,101,114,32,115,99,101,110,97,114,105,111,115,32,119,104,101,110,32,97,32,99,108,105,101,110,116,32,109,111,110,105,116,111,114,115,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,119,105,108,108,32,103,101,116,32,116,104,101,32,114,101,112,108,121,32,118,105,97,32,116,104,101,32,97,108,105,97,115,46,32,79,110,99,101,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,32,114,101,99,101,105,118,101,100,32,98,111,116,104,32,116,104,101,32,97,108,105,97,115,32,97,110,100,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,32,97,32,114,101,112,108,121,32,111,114,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46,32,78,111,116,101,32,116,104,97,116,32,105,102,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,109,111,118,101,100,32,117,115,105,110,103,32,116,104,101,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<32,66,73,70,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,115,116,105,108,108,32,98,101,32,108,101,102,116,32,97,99,116,105,118,101,46>>]}]}]}]},{dt,[],[{code,[],[<<123,116,97,103,44,32,85,115,101,114,68,101,102,105,110,101,100,84,97,103,125>>]}]},{dd,[],[{p,[],[<<82,101,112,108,97,99,101,32,116,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<84,97,103>>]},<<32,119,105,116,104,32>>,{code,[],[<<85,115,101,114,68,101,102,105,110,101,100,84,97,103>>]},<<32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<109,111,110,105,116,111,114,32,109,101,115,115,97,103,101>>]},<<32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,44,32,116,104,101,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,116,97,103,32,105,110,32,116,104,101,32,100,111,119,110,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,114,101,112,108,97,99,101,100,32,98,121,32>>,{code,[],[<<85,115,101,114,68,101,102,105,110,101,100,84,97,103>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,48,55,50>>,signature => [{attribute,1413,spec,{{monitor,3},[{type,1414,bounded_fun,[{type,1414,'fun',[{type,1414,product,[{atom,1414,process},{user_type,1414,monitor_process_identifier,[]},{type,1414,list,[{user_type,1414,monitor_option,[]}]}]},{var,1414,'MonitorRef'}]},[{type,1415,constraint,[{atom,1415,is_subtype},[{var,1415,'MonitorRef'},{type,1415,reference,[]}]]}]]},{type,1416,bounded_fun,[{type,1416,'fun',[{type,1416,product,[{atom,1416,port},{user_type,1416,monitor_port_identifier,[]},{type,1416,list,[{user_type,1416,monitor_option,[]}]}]},{var,1416,'MonitorRef'}]},[{type,1417,constraint,[{atom,1417,is_subtype},[{var,1417,'MonitorRef'},{type,1417,reference,[]}]]}]]},{type,1418,bounded_fun,[{type,1418,'fun',[{type,1418,product,[{atom,1418,time_offset},{atom,1418,clock_service},{type,1418,list,[{user_type,1418,monitor_option,[]}]}]},{var,1418,'MonitorRef'}]},[{type,1419,constraint,[{atom,1419,is_subtype},[{var,1419,'MonitorRef'},{type,1419,reference,[]}]]}]]}]}}],since => <<79,84,80,32,64,79,84,80,45,49,54,55,49,56,64>>}},{{function,monitor_node,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1425}],[<<109,111,110,105,116,111,114,95,110,111,100,101,47,50>>],#{<<101,110>> => [{p,[],[<<77,111,110,105,116,111,114,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,108,97,103>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,110,46,32,73,102,32>>,{code,[],[<<70,108,97,103>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46>>]},{p,[],[<<77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41>>]},<<32,102,111,114,32,116,104,101,32,115,97,109,101,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,32,105,110,115,116,97,110,99,101,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,102,97,105,108,115,32,111,114,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,110,111,100,101,100,111,119,110,44,32,78,111,100,101,125>>]},<<32,105,115,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,109,97,100,101,32,116,119,111,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41>>]},<<32,97,110,100,32>>,{code,[],[<<78,111,100,101>>]},<<32,116,101,114,109,105,110,97,116,101,115,44,32,116,119,111,32>>,{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32>>,{code,[],[<<78,111,100,101>>]},<<44,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,99,114,101,97,116,101,32,111,110,101,46,32,73,102,32,116,104,105,115,32,102,97,105,108,115,44,32,97,32>>,{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,100,101,108,105,118,101,114,101,100,46>>]},{p,[],[<<78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,109,111,110,105,116,111,114,101,100,32,97,115,32,97,110,121,32,111,116,104,101,114,32,110,111,100,101,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<110,111,116,97,108,105,118,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,49,53,52>>,signature => [{attribute,1425,spec,{{monitor_node,2},[{type,1425,bounded_fun,[{type,1425,'fun',[{type,1425,product,[{var,1425,'Node'},{var,1425,'Flag'}]},{atom,1425,true}]},[{type,1426,constraint,[{atom,1426,is_subtype},[{var,1426,'Node'},{type,1426,node,[]}]]},{type,1427,constraint,[{atom,1427,is_subtype},[{var,1427,'Flag'},{type,1427,boolean,[]}]]}]]}]}}]}},{{function,monitor_node,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1432}],[<<109,111,110,105,116,111,114,95,110,111,100,101,47,51>>],#{<<101,110>> => [{p,[],[<<66,101,104,97,118,101,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,95,110,111,100,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,95,110,111,100,101,47,50>>]}]},<<32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,108,111,119,115,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,44,32,110,97,109,101,108,121,32>>,{code,[],[<<97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116>>]},<<46,32,84,104,105,115,32,111,112,116,105,111,110,32,97,108,108,111,119,115,32,116,104,101,32,66,73,70,32,116,111,32,119,97,105,116,32,116,104,101,32,110,111,114,109,97,108,32,110,101,116,119,111,114,107,32,99,111,110,110,101,99,116,105,111,110,32,116,105,109,101,45,111,117,116,32,102,111,114,32,116,104,101,32>>,{em,[],[<<109,111,110,105,116,111,114,101,100,32,110,111,100,101>>]},<<32,116,111,32,99,111,110,110,101,99,116,32,105,116,115,101,108,102,44,32,101,118,101,110,32,105,102,32,105,116,32,99,97,110,110,111,116,32,98,101,32,97,99,116,105,118,101,108,121,32,99,111,110,110,101,99,116,101,100,32,102,114,111,109,32,116,104,105,115,32,110,111,100,101,32,40,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,98,108,111,99,107,101,100,41,46,32,84,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,99,97,110,32,111,110,108,121,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,32,117,115,105,110,103,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,32>>,{code,[],[<<100,105,115,116,95,97,117,116,111,95,99,111,110,110,101,99,116,32,111,110,99,101>>]},<<46,32,73,102,32,116,104,97,116,32,111,112,116,105,111,110,32,105,115,32,110,111,116,32,117,115,101,100,44,32,111,112,116,105,111,110,32>>,{code,[],[<<97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116>>]},<<32,104,97,115,32,110,111,32,101,102,102,101,99,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116>>]},<<32,105,115,32,117,115,101,100,32,105,110,116,101,114,110,97,108,108,121,32,97,110,100,32,105,115,32,115,101,108,100,111,109,32,110,101,101,100,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,104,101,114,101,32,116,104,101,32,110,101,116,119,111,114,107,32,116,111,112,111,108,111,103,121,32,97,110,100,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,115,32,105,110,32,101,102,102,101,99,116,32,97,114,101,32,107,110,111,119,110,32,105,110,32,97,100,118,97,110,99,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,32,111,114,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,32,109,97,108,102,111,114,109,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,49,55,56>>,signature => [{attribute,1432,spec,{{erlang,monitor_node,3},[{type,1432,bounded_fun,[{type,1432,'fun',[{type,1432,product,[{var,1432,'Node'},{var,1432,'Flag'},{var,1432,'Options'}]},{atom,1432,true}]},[{type,1433,constraint,[{atom,1433,is_subtype},[{var,1433,'Node'},{type,1433,node,[]}]]},{type,1434,constraint,[{atom,1434,is_subtype},[{var,1434,'Flag'},{type,1434,boolean,[]}]]},{type,1435,constraint,[{atom,1435,is_subtype},[{var,1435,'Options'},{type,1435,list,[{var,1435,'Option'}]}]]},{type,1436,constraint,[{atom,1436,is_subtype},[{var,1436,'Option'},{atom,1436,allow_passive_connect}]]}]]}]}}]}},{{function,monotonic_time,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1534}],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46,32,84,104,105,115,32,105,115,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,115,105,110,99,101,32,115,111,109,101,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,105,115,32,97,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,111,110,111,116,111,110,105,99,97,108,108,121,95,73,110,99,114,101,97,115,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103>>]},<<32,116,105,109,101,44,32,98,117,116,32>>,{em,[],[<<110,111,116>>]},<<32,97,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,116,114,105,99,116,108,121,95,77,111,110,111,116,111,110,105,99,97,108,108,121,95,73,110,99,114,101,97,115,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103>>]},<<32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,115,101,99,117,116,105,118,101,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>]},<<32,99,97,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,46>>]},{p,[],[<<68,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,119,105,108,108,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,115,32,105,110,32,116,105,109,101,32,97,115,32,98,97,115,101,32,102,111,114,32,116,104,101,105,114,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,99,108,111,99,107,115,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,115,32>>,{em,[],[<<112,111,105,110,116,108,101,115,115>>]},<<32,99,111,109,112,97,114,105,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,115,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,46,32,68,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,99,97,110,32,97,108,115,111,32,112,108,97,99,101,32,116,104,105,115,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,100,105,102,102,101,114,101,110,116,32,114,101,108,97,116,105,118,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,46,32,73,116,32,99,97,110,32,98,101,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,110,101,103,97,116,105,118,101,32,118,97,108,117,101,41,44,32,116,104,101,32,112,97,115,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,118,97,108,117,101,41,44,32,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,122,101,114,111,41,46,32,84,104,101,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,97,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,116,97,114,116,95,116,105,109,101,41>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,48,52>>,signature => [{attribute,1534,spec,{{erlang,monotonic_time,0},[{type,1534,'fun',[{type,1534,product,[]},{type,1534,integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,monotonic_time,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1539}],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32>>,{code,[],[<<85,110,105,116>>]},<<32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{p,[],[<<83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]}]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<32>>,{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41>>]}]},{code,[],[<<44,32,110,97,116,105,118,101,44,32,85,110,105,116,41>>]},<<44,32,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32>>,{code,[],[<<85,110,105,116>>]},<<115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,51,56>>,signature => [{attribute,1539,spec,{{erlang,monotonic_time,1},[{type,1539,bounded_fun,[{type,1539,'fun',[{type,1539,product,[{var,1539,'Unit'}]},{type,1539,integer,[]}]},[{type,1540,constraint,[{atom,1540,is_subtype},[{var,1540,'Unit'},{user_type,1540,time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,nif_error,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1442}],[<<110,105,102,95,101,114,114,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,47,49>>]}]},<<44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,32,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,53,54>>,signature => [{attribute,1442,spec,{{erlang,nif_error,1},[{type,1442,bounded_fun,[{type,1442,'fun',[{type,1442,product,[{var,1442,'Reason'}]},{type,1442,no_return,[]}]},[{type,1443,constraint,[{atom,1443,is_subtype},[{var,1443,'Reason'},{type,1443,term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,nif_error,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1449}],[<<110,105,102,95,101,114,114,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,47,50>>]}]},<<44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,32,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,54,57>>,signature => [{attribute,1449,spec,{{erlang,nif_error,2},[{type,1449,bounded_fun,[{type,1449,'fun',[{type,1449,product,[{var,1449,'Reason'},{var,1449,'Args'}]},{type,1449,no_return,[]}]},[{type,1450,constraint,[{atom,1450,is_subtype},[{var,1450,'Reason'},{type,1450,term,[]}]]},{type,1451,constraint,[{atom,1451,is_subtype},[{var,1451,'Args'},{type,1451,list,[{type,1451,term,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,node,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1457}],[<<110,111,100,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<110,111,110,111,100,101,64,110,111,104,111,115,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,56,50>>,signature => [{attribute,1457,spec,{{node,0},[{type,1457,bounded_fun,[{type,1457,'fun',[{type,1457,product,[]},{var,1457,'Node'}]},[{type,1458,constraint,[{atom,1458,is_subtype},[{var,1458,'Node'},{type,1458,node,[]}]]}]]}]}}]}},{{function,node,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1464}],[<<110,111,100,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32>>,{code,[],[<<65,114,103>>]},<<32,111,114,105,103,105,110,97,116,101,115,46,32>>,{code,[],[<<65,114,103>>]},<<32,99,97,110,32,98,101,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,32,112,111,114,116,46,32,73,102,32>>,{code,[],[<<65,114,103>>]},<<32,111,114,105,103,105,110,97,116,101,115,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,110,100,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<110,111,110,111,100,101,64,110,111,104,111,115,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,57,50>>,signature => [{attribute,1464,spec,{{node,1},[{type,1464,bounded_fun,[{type,1464,'fun',[{type,1464,product,[{var,1464,'Arg'}]},{var,1464,'Node'}]},[{type,1465,constraint,[{atom,1465,is_subtype},[{var,1465,'Arg'},{type,1465,union,[{type,1465,pid,[]},{type,1465,port,[]},{type,1465,reference,[]}]}]]},{type,1466,constraint,[{atom,1466,is_subtype},[{var,1466,'Node'},{type,1466,node,[]}]]}]]}]}}]}},{{function,nodes,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3424}],[<<110,111,100,101,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,32,99,111,110,110,101,99,116,105,111,110,115,32,40,116,104,97,116,32,105,115,44,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,105,115,116,114,105,98,117,116,101,100,35,104,105,100,100,101,110,45,110,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<104,105,100,100,101,110,32,110,111,100,101,115>>]},<<32,97,114,101,32,110,111,116,32,108,105,115,116,101,100,41,46,32,83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,110,111,100,101,115,95,118,105,115,105,98,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<110,111,100,101,115,40,118,105,115,105,98,108,101,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,51,48,53>>,signature => [{attribute,3424,spec,{{nodes,0},[{type,3424,bounded_fun,[{type,3424,'fun',[{type,3424,product,[]},{var,3424,'Nodes'}]},[{type,3425,constraint,[{atom,3425,is_subtype},[{var,3425,'Nodes'},{type,3425,list,[{type,3425,node,[]}]}]]}]]}]}}]}},{{function,nodes,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2308}],[<<110,111,100,101,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,114,101,115,117,108,116,44,32,119,104,101,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,44,32,105,115,32,116,104,101,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,115,97,116,105,115,102,121,105,110,103,32,116,104,101,32,100,105,115,106,117,110,99,116,105,111,110,40,115,41,32,111,102,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,46>>]},{p,[],[{code,[],[<<78,111,100,101,84,121,112,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{a,[{id,<<110,111,100,101,115,95,118,105,115,105,98,108,101>>}],[]},{code,[],[<<118,105,115,105,98,108,101>>]}]},{dd,[],[{p,[],[<<78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,32,99,111,110,110,101,99,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<104,105,100,100,101,110>>]}]},{dd,[],[{p,[],[<<78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<99,111,110,110,101,99,116,101,100>>]}]},{dd,[],[{p,[],[<<65,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,46>>]}]},{dt,[],[{code,[],[<<116,104,105,115>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,110,111,100,101,46>>]}]},{dt,[],[{code,[],[<<107,110,111,119,110>>]}]},{dd,[],[{p,[],[<<78,111,100,101,115,32,116,104,97,116,32,97,114,101,32,107,110,111,119,110,32,116,111,32,116,104,105,115,32,110,111,100,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,32,97,110,100,32,110,111,100,101,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,84,104,101,32,115,101,116,32,111,102,32,107,110,111,119,110,32,110,111,100,101,115,32,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,99,97,110,32,98,101,32,100,101,108,97,121,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,41>>]}]},<<46>>]}]}]},{p,[],[<<83,111,109,101,32,101,113,117,97,108,105,116,105,101,115,58,32>>,{code,[],[<<91,110,111,100,101,40,41,93,32,61,32,110,111,100,101,115,40,116,104,105,115,41>>]},<<44,32>>,{code,[],[<<110,111,100,101,115,40,99,111,110,110,101,99,116,101,100,41,32,61,32,110,111,100,101,115,40,91,118,105,115,105,98,108,101,44,32,104,105,100,100,101,110,93,41>>]},<<44,32,97,110,100,32>>,{code,[],[<<110,111,100,101,115,40,41,32,61,32,110,111,100,101,115,40,118,105,115,105,98,108,101,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,51,49,55>>,signature => [{attribute,2308,spec,{{nodes,1},[{type,2308,bounded_fun,[{type,2308,'fun',[{type,2308,product,[{var,2308,'Arg'}]},{var,2308,'Nodes'}]},[{type,2309,constraint,[{atom,2309,is_subtype},[{var,2309,'Arg'},{type,2309,union,[{var,2309,'NodeType'},{type,2309,list,[{var,2309,'NodeType'}]}]}]]},{type,2310,constraint,[{atom,2310,is_subtype},[{var,2310,'NodeType'},{type,2310,union,[{atom,2310,visible},{atom,2310,hidden},{atom,2310,connected},{atom,2310,this},{atom,2310,known}]}]]},{type,2311,constraint,[{atom,2311,is_subtype},[{var,2311,'Nodes'},{type,2311,list,[{type,2311,node,[]}]}]]}]]}]}}]}},{{function,now,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1471}],[<<110,111,119,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<116,105,109,101,115,116,97,109,112>>}],[]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[{em,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,68,111,32,110,111,116,32,117,115,101,32,105,116,46>>]}]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,32,83,112,101,99,105,102,105,99,97,108,108,121,44,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,68,111,115,95,97,110,100,95,68,111,110,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<68,111,115,32,97,110,100,32,68,111,110,116,39,115>>]},<<32,100,101,115,99,114,105,98,101,115,32,119,104,97,116,32,116,111,32,117,115,101,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,47,48>>]},<<46>>]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,101,108,97,112,115,101,100,32,116,105,109,101,32,115,105,110,99,101,32,48,48,58,48,48,32,71,77,84,44,32,74,97,110,117,97,114,121,32,49,44,32,49,57,55,48,32,40,122,101,114,111,32,104,111,117,114,41,44,32,105,102,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,115,111,109,101,32,111,116,104,101,114,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,105,115,32,99,104,111,115,101,110,46,32,73,116,32,105,115,32,97,108,115,111,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,32,116,104,105,115,32,66,73,70,32,114,101,116,117,114,110,32,99,111,110,116,105,110,117,111,117,115,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46,32,72,101,110,99,101,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,47,48>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,110,101,114,97,116,101,32,117,110,105,113,117,101,32,116,105,109,101,32,115,116,97,109,112,115,46,32,73,102,32,105,116,32,105,115,32,99,97,108,108,101,100,32,105,110,32,97,32,116,105,103,104,116,32,108,111,111,112,32,111,110,32,97,32,102,97,115,116,32,109,97,99,104,105,110,101,44,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,99,111,109,101,32,115,107,101,119,101,100,46>>]},{p,[],[<<67,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,116,111,32,99,104,101,99,107,32,116,104,101,32,108,111,99,97,108,32,116,105,109,101,32,111,102,32,100,97,121,32,105,102,32,116,104,101,32,116,105,109,101,45,122,111,110,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,102,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,105,115,32,112,114,111,112,101,114,108,121,32,99,111,110,102,105,103,117,114,101,100,46>>]}]},#{deprecated => <<101,114,108,97,110,103,58,110,111,119,47,48,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,115,101,101,32,116,104,101,32,34,84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110,32,105,110,32,69,114,108,97,110,103,34,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110>>,edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,51,54,48>>,signature => [{attribute,1471,spec,{{now,0},[{type,1471,bounded_fun,[{type,1471,'fun',[{type,1471,product,[]},{var,1471,'Timestamp'}]},[{type,1472,constraint,[{atom,1472,is_subtype},[{var,1472,'Timestamp'},{user_type,1472,timestamp,[]}]]}]]}]}}]}},{{function,open_port,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2315}],[<<111,112,101,110,95,112,111,114,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,111,112,101,110,105,110,103,32,97,32,110,101,119,32,69,114,108,97,110,103,32,112,111,114,116,46,32,65,32,112,111,114,116,32,99,97,110,32,98,101,32,115,101,101,110,32,97,115,32,97,110,32,101,120,116,101,114,110,97,108,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,101,100,32,105,110,32>>,{code,[],[<<99,100>>]},<<44,32>>,{code,[],[<<101,110,118>>]},<<44,32>>,{code,[],[<<97,114,103,115>>]},<<44,32,97,110,100,32>>,{code,[],[<<97,114,103,48>>]},<<32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,105,102,32,116,104,101,32,115,121,115,116,101,109,32,105,115,32,114,117,110,110,105,110,103,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,46,32,84,111,32,97,118,111,105,100,32,116,114,97,110,115,108,97,116,105,111,110,32,111,114,32,116,111,32,102,111,114,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,32,85,84,70,45,56,44,32,115,117,112,112,108,121,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,110,100,47,111,114,32,97,114,103,117,109,101,110,116,115,32,97,115,32,97,32,98,105,110,97,114,121,32,105,110,32,116,104,101,32,99,111,114,114,101,99,116,32,101,110,99,111,100,105,110,103,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32,116,104,101,32,109,111,100,117,108,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,102,105,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,105,108,101,40,51,41>>]}]},<<44,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,105,108,101,58,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>]}]},<<32,105,110,32,75,101,114,110,101,108,44,32,97,110,100,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,100,108,105,98,58,117,110,105,99,111,100,101,95,117,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<85,115,105,110,103,32,85,110,105,99,111,100,101,32,105,110,32,69,114,108,97,110,103>>]}]},<<32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,110,97,109,101,32,40,105,102,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,41,32,99,97,110,32,111,110,108,121,32,98,101,32,62,32,50,53,53,32,105,102,32,116,104,101,32,69,114,108,97,110,103,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,105,115,32,115,116,97,114,116,101,100,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,109,111,100,101,46,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,105,115,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46>>]}]},{p,[],[{code,[],[<<80,111,114,116,78,97,109,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,115,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,116,111,32,98,101,32,114,117,110,46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,114,117,110,115,32,111,117,116,115,105,100,101,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,32,117,110,108,101,115,115,32,97,110,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32,102,111,117,110,100,44,32,116,104,97,116,32,100,114,105,118,101,114,32,105,115,32,115,116,97,114,116,101,100,46,32,65,32,100,114,105,118,101,114,32,114,117,110,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,97,116,32,105,116,32,105,115,32,108,105,110,107,101,100,32,119,105,116,104,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<70,111,114,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,44,32>>,{code,[],[<<80,65,84,72>>]},<<32,105,115,32,115,101,97,114,99,104,101,100,32,40,111,114,32,97,110,32,101,113,117,105,118,97,108,101,110,116,32,109,101,116,104,111,100,32,105,115,32,117,115,101,100,32,116,111,32,102,105,110,100,32,112,114,111,103,114,97,109,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,79,83,41,46,32,84,104,105,115,32,105,115,32,100,111,110,101,32,98,121,32,105,110,118,111,107,105,110,103,32,116,104,101,32,115,104,101,108,108,32,111,110,32,99,101,114,116,97,105,110,32,112,108,97,116,102,111,114,109,115,46,32,84,104,101,32,102,105,114,115,116,32,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,40,111,114,32,100,114,105,118,101,114,41,46,32,84,104,105,115,32,40,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,41,32,109,97,107,101,115,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,115,117,105,116,97,98,108,101,32,102,111,114,32,114,117,110,110,105,110,103,32,112,114,111,103,114,97,109,115,32,119,105,116,104,32,115,112,97,99,101,115,32,105,110,32,102,105,108,101,110,97,109,101,115,32,111,114,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,46,32,73,102,32,115,112,97,99,101,115,32,105,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,110,97,109,101,115,32,97,114,101,32,100,101,115,105,114,101,100,44,32,117,115,101,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125>>]},<<32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,67,111,109,109,97,110,100,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<44,32,98,117,116,32,100,101,109,97,110,100,115,32,116,104,101,32,102,105,114,115,116,32,40,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,41,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,116,111,32,98,101,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,97,100,101,100,32,100,114,105,118,101,114,46,32,73,102,32,110,111,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,97,116,32,110,97,109,101,32,105,115,32,108,111,97,100,101,100,44,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<123,115,112,97,119,110,44,32,70,105,108,101,78,97,109,101,125>>]},<<44,32,98,117,116,32,111,110,108,121,32,114,117,110,115,32,101,120,116,101,114,110,97,108,32,101,120,101,99,117,116,97,98,108,101,115,46,32>>,{code,[],[<<70,105,108,101,78,97,109,101>>]},<<32,105,110,32,105,116,115,32,119,104,111,108,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,44,32,105,110,99,108,117,100,105,110,103,32,97,110,121,32,115,112,97,99,101,115,46,32,73,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,116,111,32,98,101,32,112,97,115,115,101,100,44,32,116,104,101,32>>,{code,[],[<<80,111,114,116,83,101,116,116,105,110,103,115>>]},<<32>>,{code,[],[<<97,114,103,115>>]},<<32,97,110,100,32>>,{code,[],[<<97,114,103,48>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,115,104,101,108,108,32,105,115,32,117,115,117,97,108,108,121,32,110,111,116,32,105,110,118,111,107,101,100,32,116,111,32,115,116,97,114,116,32,116,104,101,32,112,114,111,103,114,97,109,44,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,32,100,105,114,101,99,116,108,121,46,32>>,{code,[],[<<80,65,84,72>>]},<<32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,105,115,32,110,111,116,32,115,101,97,114,99,104,101,100,46,32,84,111,32,102,105,110,100,32,97,32,112,114,111,103,114,97,109,32,105,110,32>>,{code,[],[<<80,65,84,72>>]},<<32,116,111,32,101,120,101,99,117,116,101,44,32,117,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,102,105,110,100,95,101,120,101,99,117,116,97,98,108,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,102,105,110,100,95,101,120,101,99,117,116,97,98,108,101,47,49>>]}]},<<46>>]},{p,[],[<<79,110,108,121,32,105,102,32,97,32,115,104,101,108,108,32,115,99,114,105,112,116,32,111,114,32>>,{code,[],[<<46,98,97,116>>]},<<32,102,105,108,101,32,105,115,32,101,120,101,99,117,116,101,100,44,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,109,109,97,110,100,32,105,110,116,101,114,112,114,101,116,101,114,32,105,115,32,105,110,118,111,107,101,100,32,105,109,112,108,105,99,105,116,108,121,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,115,116,105,108,108,32,110,111,32,99,111,109,109,97,110,100,45,97,114,103,117,109,101,110,116,32,101,120,112,97,110,115,105,111,110,32,111,114,32,105,109,112,108,105,99,105,116,32>>,{code,[],[<<80,65,84,72>>]},<<32,115,101,97,114,99,104,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,105,108,101,78,97,109,101>>]},<<32,99,97,110,110,111,116,32,98,101,32,114,117,110,44,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,105,115,32,114,97,105,115,101,100,44,32,119,105,116,104,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,32,97,115,32,116,104,101,32,114,101,97,115,111,110,46,32,84,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,79,83,115,46,32,84,121,112,105,99,97,108,108,121,32,116,104,101,32,101,114,114,111,114,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,114,117,110,32,97,32,112,114,111,103,114,97,109,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32>>,{code,[],[<<101,97,99,99,101,115>>]},<<32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,105,108,101,32,105,115,32,110,111,116,32,101,120,101,99,117,116,97,98,108,101,46>>]}]},{dt,[],[{code,[],[<<123,102,100,44,32,73,110,44,32,79,117,116,125>>]}]},{dd,[],[{p,[],[<<65,108,108,111,119,115,32,97,110,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,116,111,32,97,99,99,101,115,115,32,97,110,121,32,99,117,114,114,101,110,116,108,121,32,111,112,101,110,101,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,117,115,101,100,32,98,121,32,69,114,108,97,110,103,46,32,84,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32>>,{code,[],[<<73,110>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,44,32,97,110,100,32,116,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32>>,{code,[],[<<79,117,116>>]},<<32,102,111,114,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46,32,73,116,32,105,115,32,111,110,108,121,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,115,101,114,118,101,114,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,79,83,32,40>>,{code,[],[<<115,104,101,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<117,115,101,114>>]},<<41,46,32,72,101,110,99,101,44,32,105,116,115,32,117,115,101,32,105,115,32,108,105,109,105,116,101,100,46>>]}]}]},{p,[],[{code,[],[<<80,111,114,116,83,101,116,116,105,110,103,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,101,116,116,105,110,103,115,32,102,111,114,32,116,104,101,32,112,111,114,116,46,32,84,104,101,32,118,97,108,105,100,32,115,101,116,116,105,110,103,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,97,99,107,101,116,44,32,78,125>>]}]},{dd,[],[{p,[],[<<77,101,115,115,97,103,101,115,32,97,114,101,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,101,105,114,32,108,101,110,103,116,104,44,32,115,101,110,116,32,105,110,32>>,{code,[],[<<78>>]},<<32,98,121,116,101,115,44,32,119,105,116,104,32,116,104,101,32,109,111,115,116,32,115,105,103,110,105,102,105,99,97,110,116,32,98,121,116,101,32,102,105,114,115,116,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<78>>]},<<32,97,114,101,32,49,44,32,50,44,32,97,110,100,32,52,46>>]}]},{dt,[],[{code,[],[<<115,116,114,101,97,109>>]}]},{dd,[],[{p,[],[<<79,117,116,112,117,116,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,119,105,116,104,111,117,116,32,112,97,99,107,101,116,32,108,101,110,103,116,104,115,46,32,65,32,117,115,101,114,45,100,101,102,105,110,101,100,32,112,114,111,116,111,99,111,108,32,109,117,115,116,32,98,101,32,117,115,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,111,98,106,101,99,116,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,101,44,32,76,125>>]}]},{dd,[],[{p,[],[<<77,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,111,110,32,97,32,112,101,114,32,108,105,110,101,32,98,97,115,105,115,46,32,69,97,99,104,32,108,105,110,101,32,40,100,101,108,105,109,105,116,101,100,32,98,121,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,32,105,115,32,100,101,108,105,118,101,114,101,100,32,105,110,32,97,32,115,105,110,103,108,101,32,109,101,115,115,97,103,101,46,32,84,104,101,32,109,101,115,115,97,103,101,32,100,97,116,97,32,102,111,114,109,97,116,32,105,115,32>>,{code,[],[<<123,70,108,97,103,44,32,76,105,110,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,108,97,103>>]},<<32,105,115,32>>,{code,[],[<<101,111,108>>]},<<32,111,114,32>>,{code,[],[<<110,111,101,111,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<76,105,110,101>>]},<<32,105,115,32,116,104,101,32,100,97,116,97,32,100,101,108,105,118,101,114,101,100,32,40,119,105,116,104,111,117,116,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,46>>]},{p,[],[{code,[],[<<76>>]},<<32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,108,105,110,101,32,108,101,110,103,116,104,32,105,110,32,98,121,116,101,115,46,32,76,105,110,101,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,105,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,105,110,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,109,101,115,115,97,103,101,44,32,119,105,116,104,32>>,{code,[],[<<70,108,97,103>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<110,111,101,111,108>>]},<<32,102,111,114,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,109,101,115,115,97,103,101,46,32,73,102,32,101,110,100,32,111,102,32,102,105,108,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,97,110,121,119,104,101,114,101,32,101,108,115,101,32,116,104,97,110,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,105,110,103,32,97,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,116,104,101,32,108,97,115,116,32,108,105,110,101,32,105,115,32,97,108,115,111,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32>>,{code,[],[<<70,108,97,103>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<110,111,101,111,108>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,108,105,110,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32>>,{code,[],[<<70,108,97,103>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<101,111,108>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<123,112,97,99,107,101,116,44,32,78,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,108,105,110,101,44,32,76,125>>]},<<32,115,101,116,116,105,110,103,115,32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46>>]}]},{dt,[],[{code,[],[<<123,99,100,44,32,68,105,114,125>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46,32,84,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,115,116,97,114,116,115,32,117,115,105,110,103,32>>,{code,[],[<<68,105,114>>]},<<32,97,115,32,105,116,115,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,46,32>>,{code,[],[<<68,105,114>>]},<<32,109,117,115,116,32,98,101,32,97,32,115,116,114,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,101,110,118,44,32,69,110,118,125>>]}]},{dd,[],[{p,[],[<<84,121,112,101,115,58>>,{br,[],[]},<<194,160,194,160>>,{code,[],[<<78,97,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,111,115,35,101,110,118,95,118,97,114,95,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<111,115,58,101,110,118,95,118,97,114,95,110,97,109,101,40,41>>]}]},{br,[],[]},<<194,160,194,160>>,{code,[],[<<86,97,108,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,111,115,35,101,110,118,95,118,97,114,95,118,97,108,117,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<111,115,58,101,110,118,95,118,97,114,95,118,97,108,117,101,40,41>>]}]},{code,[],[<<32,124,32,102,97,108,115,101>>]},{br,[],[]},<<194,160,194,160>>,{code,[],[<<69,110,118,32,61,32,91,123,78,97,109,101,44,32,86,97,108,125,93>>]}]},{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<44,32,97,110,100,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46,32,84,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,116,104,101,32,115,116,97,114,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,101,120,116,101,110,100,101,100,32,117,115,105,110,103,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32>>,{code,[],[<<69,110,118>>]},<<46>>]},{p,[],[{code,[],[<<69,110,118>>]},<<32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32>>,{code,[],[<<123,78,97,109,101,44,32,86,97,108,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,97,110,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,44,32,97,110,100,32>>,{code,[],[<<86,97,108>>]},<<32,105,115,32,116,104,101,32,118,97,108,117,101,32,105,116,32,105,115,32,116,111,32,104,97,118,101,32,105,110,32,116,104,101,32,115,112,97,119,110,101,100,32,112,111,114,116,32,112,114,111,99,101,115,115,46,32,66,111,116,104,32>>,{code,[],[<<78,97,109,101>>]},<<32,97,110,100,32>>,{code,[],[<<86,97,108>>]},<<32,109,117,115,116,32,98,101,32,115,116,114,105,110,103,115,46,32,84,104,101,32,111,110,101,32,101,120,99,101,112,116,105,111,110,32,105,115,32>>,{code,[],[<<86,97,108>>]},<<32,98,101,105,110,103,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,40,105,110,32,97,110,97,108,111,103,121,32,119,105,116,104,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,103,101,116,101,110,118,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,103,101,116,101,110,118,47,49>>]}]},<<44,32,119,104,105,99,104,32,114,101,109,111,118,101,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,110,99,111,100,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,115,44,32,115,101,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,121,112,101,115,32,102,111,114,32>>,{code,[],[<<78,97,109,101>>]},<<32,97,110,100,32>>,{code,[],[<<86,97,108>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,97,114,103,115,44,32,91,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,32,93,125>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<32,97,110,100,32,115,112,101,99,105,102,105,101,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,46,32,69,97,99,104,32,97,114,103,117,109,101,110,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32,115,116,114,105,110,103,32,97,110,100,32,40,111,110,32,85,110,105,120,41,32,101,118,101,110,116,117,97,108,108,121,32,101,110,100,115,32,117,112,32,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,101,97,99,104,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,46,32,79,110,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,97,32,115,105,109,105,108,97,114,32,98,101,104,97,118,105,111,114,32,105,115,32,109,105,109,105,99,107,101,100,46>>]},{p,[],[<<84,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,110,111,116,32,101,120,112,97,110,100,101,100,32,98,121,32,116,104,101,32,115,104,101,108,108,32,98,101,102,111,114,101,32,116,104,101,121,32,97,114,101,32,115,117,112,112,108,105,101,100,32,116,111,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,46,32,77,111,115,116,32,110,111,116,97,98,108,121,32,116,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,102,105,108,101,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,46,32,84,111,32,101,120,112,97,110,100,32,119,105,108,100,99,97,114,100,115,32,102,111,114,32,116,104,101,32,97,114,103,117,109,101,110,116,115,44,32,117,115,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,102,105,108,101,108,105,98,35,119,105,108,100,99,97,114,100,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,105,108,101,108,105,98,58,119,105,108,100,99,97,114,100,47,49>>]}]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,101,118,101,110,32,105,102,32,116,104,101,32,112,114,111,103,114,97,109,32,105,115,32,97,32,85,110,105,120,32,115,104,101,108,108,32,115,99,114,105,112,116,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,115,104,101,108,108,32,117,108,116,105,109,97,116,101,108,121,32,105,115,32,105,110,118,111,107,101,100,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,44,32,97,110,100,32,116,104,101,32,115,99,114,105,112,116,32,105,115,32,112,114,111,118,105,100,101,100,32,119,105,116,104,32,116,104,101,32,117,110,116,111,117,99,104,101,100,32,97,114,103,117,109,101,110,116,115,46,32,79,110,32,87,105,110,100,111,119,115,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,105,115,32,97,108,119,97,121,115,32,117,112,32,116,111,32,116,104,101,32,112,114,111,103,114,97,109,32,105,116,115,101,108,102,44,32,116,104,101,114,101,102,111,114,101,32,116,104,105,115,32,105,115,32,110,111,116,32,97,110,32,105,115,115,117,101,46>>]},{p,[],[<<84,104,101,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,40,97,108,115,111,32,107,110,111,119,110,32,97,115,32>>,{code,[],[<<97,114,103,118,91,48,93>>]},<<41,32,105,115,32,110,111,116,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,105,115,32,108,105,115,116,46,32,84,104,101,32,112,114,111,112,101,114,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,117,115,101,100,32,97,115,32>>,{code,[],[<<97,114,103,118,91,48,93>>]},<<44,32,119,104,101,114,101,32,97,112,112,108,105,99,97,98,108,101,46>>]},{p,[],[<<73,102,32,121,111,117,32,101,120,112,108,105,99,105,116,108,121,32,119,97,110,116,32,116,111,32,115,101,116,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,44,32,111,112,116,105,111,110,32>>,{code,[],[<<97,114,103,48>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,97,114,103,48,44,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,125>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<32,97,110,100,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,32,97,114,103,117,109,101,110,116,32,119,104,101,110,32,114,117,110,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,46,32,84,104,105,115,32,99,97,110,32,105,110,32,115,111,109,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,44,32,111,110,32,115,111,109,101,32,79,83,115,44,32,98,101,32,100,101,115,105,114,97,98,108,101,46,32,72,111,119,32,116,104,101,32,112,114,111,103,114,97,109,32,114,101,115,112,111,110,100,115,32,116,111,32,116,104,105,115,32,105,115,32,104,105,103,104,108,121,32,115,121,115,116,101,109,45,100,101,112,101,110,100,101,110,116,32,97,110,100,32,110,111,32,115,112,101,99,105,102,105,99,32,101,102,102,101,99,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,46>>]}]},{dt,[],[{code,[],[<<101,120,105,116,95,115,116,97,116,117,115>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,44,32,97,110,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,101,120,105,116,115,44,32,97,32,109,101,115,115,97,103,101,32,111,102,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,80,111,114,116,44,123,101,120,105,116,95,115,116,97,116,117,115,44,83,116,97,116,117,115,125,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,44,32,119,104,101,114,101,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<32,105,115,32,116,104,101,32,101,120,105,116,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,112,114,111,103,114,97,109,32,97,98,111,114,116,115,32,111,110,32,85,110,105,120,44,32,116,104,101,32,115,97,109,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,115,104,101,108,108,115,32,100,111,32,40,116,104,97,116,32,105,115,44,32,49,50,56,43,115,105,103,110,97,108,41,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<101,111,102>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,108,115,111,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32>>,{code,[],[<<101,111,102>>]},<<32,97,110,100,32>>,{code,[],[<<101,120,105,116,95,115,116,97,116,117,115>>]},<<32,97,112,112,101,97,114,32,105,110,32,97,110,32,117,110,115,112,101,99,105,102,105,101,100,32,111,114,100,101,114,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,99,108,111,115,101,115,32,105,116,115,32>>,{code,[],[<<115,116,100,111,117,116>>]},<<32,119,105,116,104,111,117,116,32,101,120,105,116,105,110,103,44,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,105,116,95,115,116,97,116,117,115>>]},<<32,100,111,101,115,32,110,111,116,32,119,111,114,107,46>>]}]},{dt,[],[{code,[],[<<117,115,101,95,115,116,100,105,111>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46,32,73,116,32,97,108,108,111,119,115,32,116,104,101,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,111,117,116,112,117,116,32,40,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,48,32,97,110,100,32,49,41,32,111,102,32,116,104,101,32,115,112,97,119,110,101,100,32,40,85,110,105,120,41,32,112,114,111,99,101,115,115,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,69,114,108,97,110,103,46>>]}]},{dt,[],[{code,[],[<<110,111,117,115,101,95,115,116,100,105,111>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,112,111,115,105,116,101,32,111,102,32>>,{code,[],[<<117,115,101,95,115,116,100,105,111>>]},<<46,32,73,116,32,117,115,101,115,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,51,32,97,110,100,32,52,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,69,114,108,97,110,103,46>>]}]},{dt,[],[{code,[],[<<115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116>>]}]},{dd,[],[{p,[],[<<65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,46,32,84,104,101,32,101,120,101,99,117,116,101,100,32,112,114,111,103,114,97,109,32,103,101,116,115,32,105,116,115,32,115,116,97,110,100,97,114,100,32,101,114,114,111,114,32,102,105,108,101,32,114,101,100,105,114,101,99,116,101,100,32,116,111,32,105,116,115,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,102,105,108,101,46,32>>,{code,[],[<<115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116>>]},<<32,97,110,100,32>>,{code,[],[<<110,111,117,115,101,95,115,116,100,105,111>>]},<<32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46>>]}]},{dt,[],[{code,[],[<<111,118,101,114,108,97,112,112,101,100,95,105,111>>]}]},{dd,[],[{p,[],[<<65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,32,111,110,32,87,105,110,100,111,119,115,32,111,110,108,121,46,32,84,104,101,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,104,97,110,100,108,101,115,32,111,102,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,97,114,101,44,32,105,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,117,112,112,108,105,101,100,44,32,111,112,101,110,101,100,32,119,105,116,104,32,102,108,97,103,32>>,{code,[],[<<70,73,76,69,95,70,76,65,71,95,79,86,69,82,76,65,80,80,69,68>>]},<<44,32,115,111,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,99,97,110,32,40,97,110,100,32,109,117,115,116,41,32,100,111,32,111,118,101,114,108,97,112,112,101,100,32,73,47,79,32,111,110,32,105,116,115,32,115,116,97,110,100,97,114,100,32,104,97,110,100,108,101,115,46,32,84,104,105,115,32,105,115,32,110,111,116,32,110,111,114,109,97,108,108,121,32,116,104,101,32,99,97,115,101,32,102,111,114,32,115,105,109,112,108,101,32,112,111,114,116,32,112,114,111,103,114,97,109,115,44,32,98,117,116,32,97,110,32,111,112,116,105,111,110,32,111,102,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,101,120,112,101,114,105,101,110,99,101,100,32,87,105,110,100,111,119,115,32,112,114,111,103,114,97,109,109,101,114,46,32>>,{em,[],[<<79,110,32,97,108,108,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,105,108,101,110,116,108,121,32,100,105,115,99,97,114,100,101,100,46>>]}]}]},{dt,[],[{code,[],[<<105,110>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,105,110,112,117,116,46>>]}]},{dt,[],[{code,[],[<<111,117,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,111,117,116,112,117,116,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,115,32,97,115,32,111,112,112,111,115,101,100,32,116,111,32,108,105,115,116,115,32,111,102,32,98,121,116,101,115,46>>]}]},{dt,[],[{code,[],[<<101,111,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,99,108,111,115,101,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,32,97,110,100,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,46,32,73,110,115,116,101,97,100,44,32,105,116,32,114,101,109,97,105,110,115,32,111,112,101,110,32,97,110,100,32,97,32>>,{code,[],[<<123,80,111,114,116,44,32,101,111,102,125>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,104,111,108,100,105,110,103,32,116,104,101,32,112,111,114,116,46>>]}]},{dt,[],[{code,[],[<<104,105,100,101>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32,114,117,110,110,105,110,103,32,111,110,32,87,105,110,100,111,119,115,44,32,115,117,112,112,114,101,115,115,101,115,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,99,111,110,115,111,108,101,32,119,105,110,100,111,119,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,46,32,40,84,104,105,115,32,111,112,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,46,41>>]}]},{dt,[],[{code,[],[<<123,112,97,114,97,108,108,101,108,105,115,109,44,32,66,111,111,108,101,97,110,125>>]}]},{dd,[],[{a,[{id,<<111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>}],[]},{p,[],[<<83,101,116,115,32,115,99,104,101,100,117,108,101,114,32,104,105,110,116,32,102,111,114,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,46,32,73,102,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,115,99,104,101,100,117,108,101,115,32,112,111,114,116,32,116,97,115,107,115,59,32,119,104,101,110,32,100,111,105,110,103,32,115,111,44,32,105,116,32,105,109,112,114,111,118,101,115,32,112,97,114,97,108,108,101,108,105,115,109,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,116,114,105,101,115,32,116,111,32,112,101,114,102,111,114,109,32,112,111,114,116,32,116,97,115,107,115,32,105,109,109,101,100,105,97,116,101,108,121,44,32,105,109,112,114,111,118,105,110,103,32,108,97,116,101,110,99,121,32,97,116,32,116,104,101,32,101,120,112,101,110,115,101,32,111,102,32,112,97,114,97,108,108,101,108,105,115,109,46,32,84,104,101,32,100,101,102,97,117,108,116,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,112,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,112,112>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,98,117,115,121,95,108,105,109,105,116,115,95,112,111,114,116,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,105,110,116,101,114,110,97,108,32,111,117,116,112,117,116,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<72,105,103,104>>]},<<32,98,121,116,101,115,44,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<76,111,119>>]},<<32,98,121,116,101,115,32,105,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<76,111,119>>]},<<32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,102,32,105,116,32,105,115,32,115,101,116,32,108,97,114,103,101,114,32,116,104,101,110,32>>,{code,[],[<<72,105,103,104>>]},<<46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<76,111,119>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,115,32>>,{code,[],[<<91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93>>]},<<46,32,73,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<32,105,115,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32>>,{code,[],[<<76,111,119,32,61,32,52,48,57,54>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104,32,61,32,56,49,57,50>>]},<<46>>]},{p,[],[{em,[],[<<78,111,116,101>>]},<<32,116,104,97,116,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,40,112,111,114,116,32,112,114,111,103,114,97,109,41,32,98,121,32,111,112,101,110,105,110,103,32,116,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,97,110,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32>>,{code,[],[<<102,100>>]},<<32,100,114,105,118,101,114,46,32,84,104,105,115,32,111,112,116,105,111,110,32,119,105,108,108,32,99,97,117,115,101,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,111,112,101,110,105,110,103,32,111,116,104,101,114,32,100,114,105,118,101,114,115,46>>]}]},{dt,[],[{code,[],[<<123,98,117,115,121,95,108,105,109,105,116,115,95,109,115,103,113,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<72,105,103,104>>]},<<32,98,121,116,101,115,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<76,111,119>>]},<<32,98,121,116,101,115,32,105,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<76,111,119>>]},<<32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,102,32,105,116,32,105,115,32,115,101,116,32,108,97,114,103,101,114,32,116,104,101,110,32>>,{code,[],[<<72,105,103,104>>]},<<46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<76,111,119>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,115,32>>,{code,[],[<<91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93>>]},<<46,32,73,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<32,105,115,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46>>]},{p,[],[{em,[],[<<78,111,116,101>>]},<<32,116,104,97,116,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,115,116,97,116,105,99,97,108,108,121,32,104,97,115,32,100,105,115,97,98,108,101,100,32,116,104,101,32,117,115,101,32,111,102,32,116,104,105,115,32,102,101,97,116,117,114,101,44,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,110,108,101,115,115,32,116,104,105,115,32,111,112,116,105,111,110,32,97,108,115,111,32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<100,105,115,97,98,108,101>>]},<<32,111,114,32,110,111,116,32,112,97,115,115,101,100,32,97,116,32,97,108,108,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32>>,{code,[],[<<76,111,119,32,61,32,52,48,57,54>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104,32,61,32,56,49,57,50>>]},<<32,117,110,108,101,115,115,32,116,104,101,32,100,114,105,118,101,114,32,105,116,115,101,108,102,32,100,111,101,115,32,109,111,100,105,102,105,99,97,116,105,111,110,115,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,46>>]},{p,[],[{em,[],[<<78,111,116,101>>]},<<32,116,104,97,116,32,116,104,101,32,100,114,105,118,101,114,32,109,105,103,104,116,32,102,97,105,108,32,105,102,32,105,116,32,97,108,115,111,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,105,116,115,101,108,102,32,97,110,100,32,121,111,117,32,104,97,118,101,32,100,105,115,97,98,108,101,100,32,116,104,105,115,32,102,101,97,116,117,114,101,46>>]},{p,[],[<<84,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,40,117,115,101,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,41,32,97,110,100,32,116,104,101,32>>,{code,[],[<<102,100>>]},<<32,100,114,105,118,101,114,32,100,111,32,110,111,116,32,100,105,115,97,98,108,101,32,116,104,105,115,32,102,101,97,116,117,114,101,32,97,110,100,32,100,111,32,110,111,116,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,116,104,101,109,115,101,108,118,101,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,114,105,118,101,114,35,101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115,40,41>>]}]},<<46>>]}]}]},{p,[],[<<68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<115,116,114,101,97,109>>]},<<32,102,111,114,32,97,108,108,32,112,111,114,116,32,116,121,112,101,115,32,97,110,100,32>>,{code,[],[<<117,115,101,95,115,116,100,105,111>>]},<<32,102,111,114,32,115,112,97,119,110,101,100,32,112,111,114,116,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32,105,102,32,116,104,101,32,112,111,114,116,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,44,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<44,32>>,{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]},<<44,32,111,114,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,32,116,104,97,116,32,109,111,115,116,32,99,108,111,115,101,108,121,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,101,114,114,111,114,44,32,111,114,32>>,{code,[],[<<101,105,110,118,97,108>>]},<<32,105,102,32,110,111,32,80,79,83,73,88,32,99,111,100,101,32,105,115,32,97,112,112,114,111,112,114,105,97,116,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<66,97,100,32,105,110,112,117,116,32,97,114,103,117,109,101,110,116,115,32,116,111,32>>,{code,[],[<<111,112,101,110,95,112,111,114,116>>]},<<46>>]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[<<65,108,108,32,97,118,97,105,108,97,98,108,101,32,112,111,114,116,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,97,114,101,32,105,110,32,117,115,101,46>>]},{dt,[],[{code,[],[<<101,110,111,109,101,109>>]}]},{dd,[],[<<78,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,111,114,116,46>>]},{dt,[],[{code,[],[<<101,97,103,97,105,110>>]}]},{dd,[],[<<78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,79,83,32,112,114,111,99,101,115,115,101,115,46>>]},{dt,[],[{code,[],[<<101,110,97,109,101,116,111,111,108,111,110,103>>]}]},{dd,[],[<<84,111,111,32,108,111,110,103,32,101,120,116,101,114,110,97,108,32,99,111,109,109,97,110,100,46>>]},{dt,[],[{code,[],[<<101,109,102,105,108,101>>]}]},{dd,[],[<<78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,40,102,111,114,32,116,104,101,32,79,83,32,112,114,111,99,101,115,115,32,116,104,97,116,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,114,117,110,115,32,105,110,41,46>>]},{dt,[],[{code,[],[<<101,110,102,105,108,101>>]}]},{dd,[],[<<70,117,108,108,32,102,105,108,101,32,116,97,98,108,101,32,40,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,79,83,41,46>>]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{code,[],[<<67,111,109,109,97,110,100>>]},<<32,115,112,101,99,105,102,105,101,100,32,105,110,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125>>]},<<32,100,111,101,115,32,110,111,116,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,46>>]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{code,[],[<<70,105,108,101,78,97,109,101>>]},<<32,115,112,101,99,105,102,105,101,100,32,105,110,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<32,100,111,101,115,32,110,111,116,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101,46>>]}]},{p,[],[<<68,117,114,105,110,103,32,117,115,101,32,111,102,32,97,32,112,111,114,116,32,111,112,101,110,101,100,32,117,115,105,110,103,32>>,{code,[],[<<123,115,112,97,119,110,44,32,78,97,109,101,125>>]},<<44,32>>,{code,[],[<<123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,78,97,109,101,125>>]},<<44,32,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,78,97,109,101,125>>]},<<44,32,101,114,114,111,114,115,32,97,114,105,115,105,110,103,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,105,116,32,97,114,101,32,114,101,112,111,114,116,101,100,32,116,111,32,116,104,101,32,111,119,110,105,110,103,32,112,114,111,99,101,115,115,32,117,115,105,110,103,32,115,105,103,110,97,108,115,32,111,102,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,80,111,114,116,44,32,80,111,115,105,120,67,111,100,101,125>>]},<<46,32,70,111,114,32,116,104,101,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,111,102,32>>,{code,[],[<<80,111,115,105,120,67,111,100,101>>]},<<44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,102,105,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,105,108,101,40,51,41>>]}]},<<46>>]},{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,32,116,104,97,116,32,99,97,110,32,98,101,32,111,112,101,110,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,109,97,120,95,112,111,114,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,81>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,51,56,57>>,signature => [{attribute,2315,spec,{{open_port,2},[{type,2315,bounded_fun,[{type,2315,'fun',[{type,2315,product,[{var,2315,'PortName'},{var,2315,'PortSettings'}]},{type,2315,port,[]}]},[{type,2316,constraint,[{atom,2316,is_subtype},[{var,2316,'PortName'},{type,2316,union,[{type,2316,tuple,[{atom,2316,spawn},{ann_type,2316,[{var,2316,'Command'},{type,2316,union,[{type,2316,string,[]},{type,2316,binary,[]}]}]}]},{type,2317,tuple,[{atom,2317,spawn_driver},{ann_type,2317,[{var,2317,'Command'},{type,2317,union,[{type,2317,string,[]},{type,2317,binary,[]}]}]}]},{type,2318,tuple,[{atom,2318,spawn_executable},{ann_type,2318,[{var,2318,'FileName'},{remote_type,2318,[{atom,2318,file},{atom,2318,name_all},[]]}]}]},{type,2319,tuple,[{atom,2319,fd},{ann_type,2319,[{var,2319,'In'},{type,2319,non_neg_integer,[]}]},{ann_type,2319,[{var,2319,'Out'},{type,2319,non_neg_integer,[]}]}]}]}]]},{type,2320,constraint,[{atom,2320,is_subtype},[{var,2320,'PortSettings'},{type,2320,list,[{var,2320,'Opt'}]}]]},{type,2321,constraint,[{atom,2321,is_subtype},[{var,2321,'Opt'},{type,2321,union,[{type,2321,tuple,[{atom,2321,packet},{ann_type,2321,[{var,2321,'N'},{type,2321,union,[{integer,2321,1},{integer,2321,2},{integer,2321,4}]}]}]},{atom,2322,stream},{type,2323,tuple,[{atom,2323,line},{ann_type,2323,[{var,2323,'L'},{type,2323,non_neg_integer,[]}]}]},{type,2324,tuple,[{atom,2324,cd},{ann_type,2324,[{var,2324,'Dir'},{type,2324,union,[{type,2324,string,[]},{type,2324,binary,[]}]}]}]},{type,2325,tuple,[{atom,2325,env},{ann_type,2325,[{var,2325,'Env'},{type,2325,list,[{type,2325,tuple,[{ann_type,2325,[{var,2325,'Name'},{remote_type,2325,[{atom,2325,os},{atom,2325,env_var_name},[]]}]},{ann_type,2325,[{var,2325,'Val'},{type,2325,union,[{remote_type,2325,[{atom,2325,os},{atom,2325,env_var_value},[]]},{atom,2325,false}]}]}]}]}]}]},{type,2326,tuple,[{atom,2326,args},{type,2326,list,[{type,2326,union,[{type,2326,string,[]},{type,2326,binary,[]}]}]}]},{type,2327,tuple,[{atom,2327,arg0},{type,2327,union,[{type,2327,string,[]},{type,2327,binary,[]}]}]},{atom,2328,exit_status},{atom,2329,use_stdio},{atom,2330,nouse_stdio},{atom,2331,stderr_to_stdout},{atom,2332,in},{atom,2333,out},{atom,2334,binary},{atom,2335,eof},{type,2336,tuple,[{atom,2336,parallelism},{ann_type,2336,[{var,2336,'Boolean'},{type,2336,boolean,[]}]}]},{atom,2337,hide},{type,2338,tuple,[{atom,2338,busy_limits_port},{type,2338,union,[{type,2338,tuple,[{type,2338,non_neg_integer,[]},{type,2338,non_neg_integer,[]}]},{atom,2338,disabled}]}]},{type,2339,tuple,[{atom,2339,busy_limits_msgq},{type,2339,union,[{type,2339,tuple,[{type,2339,non_neg_integer,[]},{type,2339,non_neg_integer,[]}]},{atom,2339,disabled}]}]}]}]]}]]}]}}]}},{{function,phash,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1477}],[<<112,104,97,115,104,47,50>>],#{<<101,110>> => [{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,104,97,115,104,50,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,112,104,97,115,104,50,47,50>>]}]},<<32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,102,111,114,32,110,101,119,32,99,111,100,101,46,32,78,111,116,101,32,116,104,97,116,32>>,{code,[],[<<101,114,108,97,110,103,58,112,104,97,115,104,40,88,44,78,41>>]},<<32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,112,104,97,115,104,50,40,88,44,78,41>>]}]}]},{p,[],[<<80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,32,40,116,104,101,32,66,73,70,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,52,46,57,46,49,46,49,41,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<84,101,114,109>>]},<<32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<49,46,46,82,97,110,103,101>>]},<<46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<82,97,110,103,101>>]},<<32,105,115,32,50,94,51,50,46>>]}]},#{deprecated => <<101,114,108,97,110,103,58,112,104,97,115,104,47,50,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,101,32,101,114,108,97,110,103,58,112,104,97,115,104,50,47,50,32,105,110,115,116,101,97,100>>,edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,55,57,53>>,signature => [{attribute,1477,spec,{{erlang,phash,2},[{type,1477,bounded_fun,[{type,1477,'fun',[{type,1477,product,[{var,1477,'Term'},{var,1477,'Range'}]},{var,1477,'Hash'}]},[{type,1478,constraint,[{atom,1478,is_subtype},[{var,1478,'Term'},{type,1478,term,[]}]]},{type,1479,constraint,[{atom,1479,is_subtype},[{var,1479,'Range'},{type,1479,pos_integer,[]}]]},{type,1480,constraint,[{atom,1480,is_subtype},[{var,1480,'Hash'},{type,1480,pos_integer,[]}]]}]]}]}}]}},{{function,phash2,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1492}],[<<112,104,97,115,104,50,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,49,55>>,equiv => {function,phash2,1},signature => [{attribute,1492,spec,{{erlang,phash2,2},[{type,1492,bounded_fun,[{type,1492,'fun',[{type,1492,product,[{var,1492,'Term'},{var,1492,'Range'}]},{var,1492,'Hash'}]},[{type,1493,constraint,[{atom,1493,is_subtype},[{var,1493,'Term'},{type,1493,term,[]}]]},{type,1494,constraint,[{atom,1494,is_subtype},[{var,1494,'Range'},{type,1494,pos_integer,[]}]]},{type,1495,constraint,[{atom,1495,is_subtype},[{var,1495,'Hash'},{type,1495,non_neg_integer,[]}]]}]]}]}}]}},{{function,phash2,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1485}],[<<112,104,97,115,104,50,47,49>>],#{<<101,110>> => [{p,[],[<<80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,32,40,116,104,101,32,66,73,70,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,53,46,50,41,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<84,101,114,109>>]},<<32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<48,46,46,82,97,110,103,101,45,49>>]},<<46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<82,97,110,103,101>>]},<<32,105,115,32,50,94,51,50,46,32,87,104,101,110,32,119,105,116,104,111,117,116,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<82,97,110,103,101>>]},<<44,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,94,50,55,45,49,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,97,108,119,97,121,115,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,104,97,115,104,105,110,103,32,116,101,114,109,115,46,32,73,116,32,100,105,115,116,114,105,98,117,116,101,115,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,32,98,101,116,116,101,114,32,116,104,97,110,32>>,{code,[],[<<112,104,97,115,104,47,50>>]},<<44,32,97,110,100,32,105,116,32,105,115,32,102,97,115,116,101,114,32,102,111,114,32,98,105,103,110,117,109,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<48,46,46,82,97,110,103,101,45,49>>]},<<32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,114,97,110,103,101,32,111,102,32>>,{code,[],[<<112,104,97,115,104,47,50>>]},<<44,32,119,104,105,99,104,32,105,115,32>>,{code,[],[<<49,46,46,82,97,110,103,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,49,55>>,signature => [{attribute,1485,spec,{{erlang,phash2,1},[{type,1485,bounded_fun,[{type,1485,'fun',[{type,1485,product,[{var,1485,'Term'}]},{var,1485,'Hash'}]},[{type,1486,constraint,[{atom,1486,is_subtype},[{var,1486,'Term'},{type,1486,term,[]}]]},{type,1487,constraint,[{atom,1487,is_subtype},[{var,1487,'Hash'},{type,1487,non_neg_integer,[]}]]}]]}]}}]}},{{function,pid_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1500}],[<<112,105,100,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,112,105,100,95,116,111,95,108,105,115,116,40,115,101,108,102,40,41,41,46,10,34,60,48,46,56,53,46,48,62,34>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,114,101,97,116,105,111,110>>]},<<32,102,111,114,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,32,111,102,32,97,32,110,111,100,101,32,119,105,116,104,32,97,32,115,112,101,99,105,102,105,99,32,110,97,109,101,32,99,97,110,32,103,101,116,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,52,50>>,signature => [{attribute,1500,spec,{{pid_to_list,1},[{type,1500,bounded_fun,[{type,1500,'fun',[{type,1500,product,[{var,1500,'Pid'}]},{type,1500,string,[]}]},[{type,1501,constraint,[{atom,1501,is_subtype},[{var,1501,'Pid'},{type,1501,pid,[]}]]}]]}]}}]}},{{function,port_call,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3594}],[<<112,111,114,116,95,99,97,108,108,47,51>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,97,110,100,32>>,{code,[],[<<68,97,116,97>>]},<<32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,32,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,32,116,104,105,115,32,102,101,97,116,117,114,101,46>>]},{p,[],[{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,114,101,102,101,114,114,105,110,103,32,116,111,32,97,32,100,114,105,118,101,114,46>>]},{p,[],[{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,100,114,105,118,101,114,46>>]},{p,[],[{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,46,32,84,104,105,115,32,100,97,116,97,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,98,105,110,97,114,121,32,116,101,114,109,32,102,111,114,109,97,116,32,97,110,100,32,115,101,110,116,32,116,111,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,101,114,109,32,102,114,111,109,32,116,104,101,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,100,111,101,115,32,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<41,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,99,97,108,108,32>>,{code,[],[<<112,111,114,116,95,99,97,108,108>>]},<<32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>]}]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,54,49>>,signature => [{attribute,3594,spec,{{erlang,port_call,3},[{type,3594,bounded_fun,[{type,3594,'fun',[{type,3594,product,[{var,3594,'Port'},{var,3594,'Operation'},{var,3594,'Data'}]},{type,3594,term,[]}]},[{type,3595,constraint,[{atom,3595,is_subtype},[{var,3595,'Port'},{type,3595,union,[{type,3595,port,[]},{type,3595,atom,[]}]}]]},{type,3596,constraint,[{atom,3596,is_subtype},[{var,3596,'Operation'},{type,3596,integer,[]}]]},{type,3597,constraint,[{atom,3597,is_subtype},[{var,3597,'Data'},{type,3597,term,[]}]]}]]}]}}]}},{{function,port_close,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3555}],[<<112,111,114,116,95,99,108,111,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,108,111,115,101,115,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,40,115,101,101,32,98,101,108,111,119,41,44,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,114,101,112,108,121,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,32,99,108,111,115,101,100,125>>]},<<46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,119,105,116,104,32>>,{code,[],[<<112,111,114,116,95,99,108,111,115,101,47,49>>]},<<44,32,110,111,116,32,111,110,108,121,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,99,108,111,115,101,47,49>>]},<<32,114,101,116,117,114,110,115,46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32>>,{code,[],[<<80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125>>]},<<32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,32,114,101,112,108,105,101,115,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,32,99,108,111,115,101,100,125>>]},<<32,119,104,101,110,32,97,108,108,32,98,117,102,102,101,114,115,32,104,97,118,101,32,98,101,101,110,32,102,108,117,115,104,101,100,32,97,110,100,32,116,104,101,32,112,111,114,116,32,114,101,97,108,108,121,32,99,108,111,115,101,115,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32>>,{em,[],[<<112,111,114,116,32,111,119,110,101,114>>]},<<32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,117,115,105,110,103,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125>>]},<<32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,32,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125>>]},<<32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,32>>,{code,[],[<<112,111,114,116,95,99,108,111,115,101,47,49>>]},<<32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,57,49,51>>,signature => [{attribute,3555,spec,{{port_close,1},[{type,3555,bounded_fun,[{type,3555,'fun',[{type,3555,product,[{var,3555,'Port'}]},{atom,3555,true}]},[{type,3556,constraint,[{atom,3556,is_subtype},[{var,3556,'Port'},{type,3556,union,[{type,3556,port,[]},{type,3556,atom,[]}]}]]}]]}]}}]}},{{function,port_command,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3513}],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32,83,97,109,101,32,97,115,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,97,110,100,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,32,40,115,101,101,32,98,101,108,111,119,41,46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,32,119,105,116,104,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>]},<<44,32,110,111,116,32,111,110,108,121,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,116,104,101,32,100,97,116,97,32,109,101,115,115,97,103,101,32,100,105,115,97,112,112,101,97,114,115,32,119,105,116,104,111,117,116,32,97,32,115,111,117,110,100,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,111,112,101,110,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32>>,{em,[],[<<112,111,114,116,32,111,119,110,101,114>>]},<<32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<46,32,84,104,101,32,112,111,114,116,32,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<32,97,108,115,111,32,105,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,116,111,32,97,32,112,111,114,116,32,117,115,105,110,103,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,32,97,110,121,32,109,111,114,101,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>]},<<32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]}]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,57,53,51>>,signature => [{attribute,3513,spec,{{port_command,2},[{type,3513,bounded_fun,[{type,3513,'fun',[{type,3513,product,[{var,3513,'Port'},{var,3513,'Data'}]},{atom,3513,true}]},[{type,3514,constraint,[{atom,3514,is_subtype},[{var,3514,'Port'},{type,3514,union,[{type,3514,port,[]},{type,3514,atom,[]}]}]]},{type,3515,constraint,[{atom,3515,is_subtype},[{var,3515,'Data'},{type,3515,iodata,[]}]]}]]}]}}]}},{{function,port_command,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3526}],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,44,32,91,93,41>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,41>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,32,97,110,121,109,111,114,101,46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,111,114,99,101>>]}]},{dd,[],[<<84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,102,111,114,99,101,100,32,116,104,114,111,117,103,104,46,32,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,100,114,105,118,101,114,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,100,114,105,118,101,114,95,101,110,116,114,121,35,100,114,105,118,101,114,95,102,108,97,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<69,82,76,95,68,82,86,95,70,76,65,71,95,83,79,70,84,95,66,85,83,89>>]}]},<<46>>]},{dt,[],[{code,[],[<<110,111,115,117,115,112,101,110,100>>]}]},{dd,[],[<<84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<102,111,114,99,101>>]},<<32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,98,117,116,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,102,111,114,99,105,110,103,32,116,104,114,111,117,103,104,32,97,32,98,117,115,121,32,112,111,114,116,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,48,48,53>>,signature => [{attribute,3526,spec,{{port_command,3},[{type,3526,bounded_fun,[{type,3526,'fun',[{type,3526,product,[{var,3526,'Port'},{var,3526,'Data'},{var,3526,'OptionList'}]},{type,3526,boolean,[]}]},[{type,3527,constraint,[{atom,3527,is_subtype},[{var,3527,'Port'},{type,3527,union,[{type,3527,port,[]},{type,3527,atom,[]}]}]]},{type,3528,constraint,[{atom,3528,is_subtype},[{var,3528,'Data'},{type,3528,iodata,[]}]]},{type,3529,constraint,[{atom,3529,is_subtype},[{var,3529,'Option'},{type,3529,union,[{atom,3529,force},{atom,3529,nosuspend}]}]]},{type,3530,constraint,[{atom,3530,is_subtype},[{var,3530,'OptionList'},{type,3530,list,[{var,3530,'Option'}]}]]}]]}]}}]}},{{function,port_connect,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3542}],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,111,114,116,41,32,116,111,32>>,{code,[],[<<80,105,100>>]},<<46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{p,[],[<<84,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,44,32,115,101,101,32,98,101,108,111,119,46>>]}]},{li,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,114,101,112,108,121,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,99,111,110,110,101,99,116,101,100,125>>]},<<46>>]}]},{li,[],[{p,[],[{code,[],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,49>>]},<<32,105,115,32,115,121,110,99,104,114,111,110,111,117,115,44,32,115,101,101,32,98,101,108,111,119,46>>]}]},{li,[],[{p,[],[<<84,104,101,32,110,101,119,32,112,111,114,116,32,111,119,110,101,114,32,103,101,116,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46>>]}]}]},{p,[],[<<84,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,115,116,97,121,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,97,110,100,32,109,117,115,116,32,99,97,108,108,32>>,{code,[],[<<117,110,108,105,110,107,40,80,111,114,116,41>>]},<<32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,100,101,115,105,114,101,100,46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,116,111,32,98,101,32,97,110,121,32,112,114,111,99,101,115,115,32,119,105,116,104,32>>,{code,[],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,50>>]},<<46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32>>,{code,[],[<<80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,32,114,101,112,108,105,101,115,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,32,99,111,110,110,101,99,116,101,100,125>>]},<<32,116,111,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,105,115,32,115,116,105,108,108,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,119,104,105,108,101,32,116,104,101,32,110,101,119,32,105,115,32,110,111,116,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32>>,{em,[],[<<112,111,114,116,32,111,119,110,101,114>>]},<<32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<46,32,84,104,101,32,112,111,114,116,32,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<32,97,108,115,111,32,105,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,117,115,105,110,103,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,32,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,32>>,{code,[],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,50>>]},<<32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,48,54,57>>,signature => [{attribute,3542,spec,{{port_connect,2},[{type,3542,bounded_fun,[{type,3542,'fun',[{type,3542,product,[{var,3542,'Port'},{var,3542,'Pid'}]},{atom,3542,true}]},[{type,3543,constraint,[{atom,3543,is_subtype},[{var,3543,'Port'},{type,3543,union,[{type,3543,port,[]},{type,3543,atom,[]}]}]]},{type,3544,constraint,[{atom,3544,is_subtype},[{var,3544,'Pid'},{type,3544,pid,[]}]]}]]}]}}]}},{{function,port_control,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3567}],[<<112,111,114,116,95,99,111,110,116,114,111,108,47,51>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,97,110,100,32>>,{code,[],[<<68,97,116,97>>]},<<32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,32,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,32,116,104,105,115,32,99,111,110,116,114,111,108,32,102,101,97,116,117,114,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,53,53,44,32,111,114,32,97,32,98,105,110,97,114,121,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,111,112,101,110,32,112,111,114,116,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,99,97,110,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<41,46>>,{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,99,97,108,108,32>>,{code,[],[<<112,111,114,116,95,99,111,110,116,114,111,108,47,51>>]},<<32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>]}]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,49,51,56>>,signature => [{attribute,3567,spec,{{port_control,3},[{type,3567,bounded_fun,[{type,3567,'fun',[{type,3567,product,[{var,3567,'Port'},{var,3567,'Operation'},{var,3567,'Data'}]},{type,3567,union,[{type,3567,iodata,[]},{type,3567,binary,[]}]}]},[{type,3568,constraint,[{atom,3568,is_subtype},[{var,3568,'Port'},{type,3568,union,[{type,3568,port,[]},{type,3568,atom,[]}]}]]},{type,3569,constraint,[{atom,3569,is_subtype},[{var,3569,'Operation'},{type,3569,integer,[]}]]},{type,3570,constraint,[{atom,3570,is_subtype},[{var,3570,'Data'},{type,3570,iodata,[]}]]}]]}]}}]}},{{function,port_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3608}],[<<112,111,114,116,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,117,112,108,101,115,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,111,112,101,110,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,97,108,108,32,116,104,101,32,116,117,112,108,101,115,32,97,114,101,32,110,111,116,32,109,97,110,100,97,116,111,114,121,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,49>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<84,104,101,32,114,101,115,117,108,116,32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32>>,{code,[],[<<73,116,101,109>>]},<<115,58>>]},{ul,[],[{li,[],[{code,[],[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,40,105,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,41>>]},{li,[],[{code,[],[<<105,100>>]}]},{li,[],[{code,[],[<<99,111,110,110,101,99,116,101,100>>]}]},{li,[],[{code,[],[<<108,105,110,107,115>>]}]},{li,[],[{code,[],[<<110,97,109,101>>]}]},{li,[],[{code,[],[<<105,110,112,117,116>>]}]},{li,[],[{code,[],[<<111,117,116,112,117,116>>]}]}]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32>>,{code,[],[<<73,116,101,109>>]},<<115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,111,114,116,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,49,56,50>>,signature => [{attribute,3608,spec,{{erlang,port_info,1},[{type,3608,bounded_fun,[{type,3608,'fun',[{type,3608,product,[{var,3608,'Port'}]},{var,3608,'Result'}]},[{type,3609,constraint,[{atom,3609,is_subtype},[{var,3609,'Port'},{type,3609,union,[{type,3609,port,[]},{type,3609,atom,[]}]}]]},{type,3610,constraint,[{atom,3610,is_subtype},[{var,3610,'ResultItem'},{type,3610,union,[{type,3610,tuple,[{atom,3610,registered_name},{ann_type,3610,[{var,3610,'RegisteredName'},{type,3610,atom,[]}]}]},{type,3611,tuple,[{atom,3611,id},{ann_type,3611,[{var,3611,'Index'},{type,3611,non_neg_integer,[]}]}]},{type,3612,tuple,[{atom,3612,connected},{ann_type,3612,[{var,3612,'Pid'},{type,3612,pid,[]}]}]},{type,3613,tuple,[{atom,3613,links},{ann_type,3613,[{var,3613,'Pids'},{type,3613,list,[{type,3613,pid,[]}]}]}]},{type,3614,tuple,[{atom,3614,name},{ann_type,3614,[{var,3614,'String'},{type,3614,string,[]}]}]},{type,3615,tuple,[{atom,3615,input},{ann_type,3615,[{var,3615,'Bytes'},{type,3615,non_neg_integer,[]}]}]},{type,3616,tuple,[{atom,3616,output},{ann_type,3616,[{var,3616,'Bytes'},{type,3616,non_neg_integer,[]}]}]},{type,3617,tuple,[{atom,3617,os_pid},{ann_type,3617,[{var,3617,'OsPid'},{type,3617,union,[{type,3617,non_neg_integer,[]},{atom,3617,undefined}]}]}]}]}]]},{type,3618,constraint,[{atom,3618,is_subtype},[{var,3618,'Result'},{type,3618,union,[{type,3618,list,[{var,3618,'ResultItem'}]},{atom,3618,undefined}]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,50,49,51>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3629,bounded_fun,[{type,3629,'fun',[{type,3629,product,[{var,3629,'Port'},{atom,3629,connected}]},{type,3629,union,[{type,3629,tuple,[{atom,3629,connected},{var,3629,'Pid'}]},{atom,3629,undefined}]}]},[{type,3630,constraint,[{atom,3630,is_subtype},[{var,3630,'Port'},{type,3630,union,[{type,3630,port,[]},{type,3630,atom,[]}]}]]},{type,3631,constraint,[{atom,3631,is_subtype},[{var,3631,'Pid'},{type,3631,pid,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<73,110,100,101,120>>]},<<32,105,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,105,110,100,101,120,32,111,102,32,116,104,101,32,112,111,114,116,46,32,84,104,105,115,32,105,110,100,101,120,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,112,111,114,116,115,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,50,50,57>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3632,bounded_fun,[{type,3632,'fun',[{type,3632,product,[{var,3632,'Port'},{atom,3632,id}]},{type,3632,union,[{type,3632,tuple,[{atom,3632,id},{var,3632,'Index'}]},{atom,3632,undefined}]}]},[{type,3633,constraint,[{atom,3633,is_subtype},[{var,3633,'Port'},{type,3633,union,[{type,3633,port,[]},{type,3633,atom,[]}]}]]},{type,3634,constraint,[{atom,3634,is_subtype},[{var,3634,'Index'},{type,3634,non_neg_integer,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,50,52,53>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3635,bounded_fun,[{type,3635,'fun',[{type,3635,product,[{var,3635,'Port'},{atom,3635,input}]},{type,3635,union,[{type,3635,tuple,[{atom,3635,input},{var,3635,'Bytes'}]},{atom,3635,undefined}]}]},[{type,3636,constraint,[{atom,3636,is_subtype},[{var,3636,'Port'},{type,3636,union,[{type,3636,port,[]},{type,3636,atom,[]}]}]]},{type,3637,constraint,[{atom,3637,is_subtype},[{var,3637,'Bytes'},{type,3637,non_neg_integer,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<80,105,100,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,105,115,32,108,105,110,107,101,100,32,116,111,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,50,54,49>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3638,bounded_fun,[{type,3638,'fun',[{type,3638,product,[{var,3638,'Port'},{atom,3638,links}]},{type,3638,union,[{type,3638,tuple,[{atom,3638,links},{var,3638,'Pids'}]},{atom,3638,undefined}]}]},[{type,3639,constraint,[{atom,3639,is_subtype},[{var,3639,'Port'},{type,3639,union,[{type,3639,port,[]},{type,3639,atom,[]}]}]]},{type,3640,constraint,[{atom,3640,is_subtype},[{var,3640,'Pids'},{type,3640,list,[{type,3640,pid,[]}]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<76,111,99,107,105,110,103>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{code,[],[<<112,111,114,116,95,108,101,118,101,108>>]},<<32,40,112,111,114,116,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41>>]},{li,[],[{code,[],[<<100,114,105,118,101,114,95,108,101,118,101,108>>]},<<32,40,100,114,105,118,101,114,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,114,101,115,117,108,116,115,32,97,114,101,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,50,55,55>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3641,bounded_fun,[{type,3641,'fun',[{type,3641,product,[{var,3641,'Port'},{atom,3641,locking}]},{type,3641,union,[{type,3641,tuple,[{atom,3641,locking},{var,3641,'Locking'}]},{atom,3641,undefined}]}]},[{type,3642,constraint,[{atom,3642,is_subtype},[{var,3642,'Port'},{type,3642,union,[{type,3642,port,[]},{type,3642,atom,[]}]}]]},{type,3643,constraint,[{atom,3643,is_subtype},[{var,3643,'Locking'},{type,3643,union,[{atom,3643,false},{atom,3643,port_level},{atom,3643,driver_level}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{a,[{id,<<112,111,114,116,95,105,110,102,111,95,109,101,109,111,114,121>>}],[]},{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,105,115,32,112,111,114,116,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,112,111,114,116,32,105,116,115,101,108,102,32,99,97,110,32,104,97,118,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32>>,{code,[],[<<66,121,116,101,115>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,50,57,56>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3644,bounded_fun,[{type,3644,'fun',[{type,3644,product,[{var,3644,'Port'},{atom,3644,memory}]},{type,3644,union,[{type,3644,tuple,[{atom,3644,memory},{var,3644,'Bytes'}]},{atom,3644,undefined}]}]},[{type,3645,constraint,[{atom,3645,is_subtype},[{var,3645,'Port'},{type,3645,union,[{type,3645,port,[]},{type,3645,atom,[]}]}]]},{type,3646,constraint,[{atom,3646,is_subtype},[{var,3646,'Bytes'},{type,3646,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<77,111,110,105,116,111,114,115>>]},<<32,114,101,112,114,101,115,101,110,116,32,112,114,111,99,101,115,115,101,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,49,55>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3647,bounded_fun,[{type,3647,'fun',[{type,3647,product,[{var,3647,'Port'},{atom,3647,monitors}]},{type,3647,union,[{type,3647,tuple,[{atom,3647,monitors},{var,3647,'Monitors'}]},{atom,3647,undefined}]}]},[{type,3648,constraint,[{atom,3648,is_subtype},[{var,3648,'Port'},{type,3648,union,[{type,3648,port,[]},{type,3648,atom,[]}]}]]},{type,3649,constraint,[{atom,3649,is_subtype},[{var,3649,'Monitors'},{type,3649,list,[{type,3649,tuple,[{atom,3649,process},{type,3649,pid,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,108,105,115,116,32,111,102,32,112,105,100,115,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,103,105,118,101,110,32,112,111,114,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,51,51>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3650,bounded_fun,[{type,3650,'fun',[{type,3650,product,[{var,3650,'Port'},{atom,3650,monitored_by}]},{type,3650,union,[{type,3650,tuple,[{atom,3650,monitored_by},{var,3650,'MonitoredBy'}]},{atom,3650,undefined}]}]},[{type,3651,constraint,[{atom,3651,is_subtype},[{var,3651,'Port'},{type,3651,union,[{type,3651,port,[]},{type,3651,atom,[]}]}]]},{type,3652,constraint,[{atom,3652,is_subtype},[{var,3652,'MonitoredBy'},{type,3652,list,[{type,3652,pid,[]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,99,111,109,109,97,110,100,32,110,97,109,101,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,95,112,111,114,116,47,50>>]}]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,52,57>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3653,bounded_fun,[{type,3653,'fun',[{type,3653,product,[{var,3653,'Port'},{atom,3653,name}]},{type,3653,union,[{type,3653,tuple,[{atom,3653,name},{var,3653,'Name'}]},{atom,3653,undefined}]}]},[{type,3654,constraint,[{atom,3654,is_subtype},[{var,3654,'Port'},{type,3654,union,[{type,3654,port,[]},{type,3654,atom,[]}]}]]},{type,3655,constraint,[{atom,3655,is_subtype},[{var,3655,'Name'},{type,3655,string,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<79,115,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,111,102,32,97,110,32,79,83,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,95,112,111,114,116,40,123,115,112,97,119,110,32,124,32,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,44,32,79,112,116,105,111,110,115,41>>]}]},<<46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,97,119,110,105,110,103,32,97,110,32,79,83,32,112,114,111,99,101,115,115,44,32,116,104,101,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,54,53>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3656,bounded_fun,[{type,3656,'fun',[{type,3656,product,[{var,3656,'Port'},{atom,3656,os_pid}]},{type,3656,union,[{type,3656,tuple,[{atom,3656,os_pid},{var,3656,'OsPid'}]},{atom,3656,undefined}]}]},[{type,3657,constraint,[{atom,3657,is_subtype},[{var,3657,'Port'},{type,3657,union,[{type,3657,port,[]},{type,3657,atom,[]}]}]]},{type,3658,constraint,[{atom,3658,is_subtype},[{var,3658,'OsPid'},{type,3658,union,[{type,3658,non_neg_integer,[]},{atom,3658,undefined}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,112,111,114,116,32,102,114,111,109,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,111,114,116,95,99,111,109,109,97,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,111,114,116,95,99,111,109,109,97,110,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,51>>]}]},<<44,32,111,114,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,56,52>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3659,bounded_fun,[{type,3659,'fun',[{type,3659,product,[{var,3659,'Port'},{atom,3659,output}]},{type,3659,union,[{type,3659,tuple,[{atom,3659,output},{var,3659,'Bytes'}]},{atom,3659,undefined}]}]},[{type,3660,constraint,[{atom,3660,is_subtype},[{var,3660,'Port'},{type,3660,union,[{type,3660,port,[]},{type,3660,atom,[]}]}]]},{type,3661,constraint,[{atom,3661,is_subtype},[{var,3661,'Bytes'},{type,3661,non_neg_integer,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,111,111,108,101,97,110>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,104,105,110,116,32,117,115,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,111,112,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,97,114,97,108,108,101,108,105,115,109>>]}]},<<32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,95,112,111,114,116,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,48,51>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3662,bounded_fun,[{type,3662,'fun',[{type,3662,product,[{var,3662,'Port'},{atom,3662,parallelism}]},{type,3662,union,[{type,3662,tuple,[{atom,3662,parallelism},{var,3662,'Boolean'}]},{atom,3662,undefined}]}]},[{type,3663,constraint,[{atom,3663,is_subtype},[{var,3663,'Port'},{type,3663,union,[{type,3663,port,[]},{type,3663,atom,[]}]}]]},{type,3664,constraint,[{atom,3664,is_subtype},[{var,3664,'Boolean'},{type,3664,boolean,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,113,117,101,117,101,100,32,98,121,32,116,104,101,32,112,111,114,116,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,100,114,105,118,101,114,32,113,117,101,117,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,49,52>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3665,bounded_fun,[{type,3665,'fun',[{type,3665,product,[{var,3665,'Port'},{atom,3665,queue_size}]},{type,3665,union,[{type,3665,tuple,[{atom,3665,queue_size},{var,3665,'Bytes'}]},{atom,3665,undefined}]}]},[{type,3666,constraint,[{atom,3666,is_subtype},[{var,3666,'Port'},{type,3666,union,[{type,3666,port,[]},{type,3666,atom,[]}]}]]},{type,3667,constraint,[{atom,3667,is_subtype},[{var,3667,'Bytes'},{type,3667,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3629}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,116,104,101,32,112,111,114,116,46,32,73,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,51,49>>,signature => [{attribute,3629,spec,{{erlang,port_info,2},[{type,3668,bounded_fun,[{type,3668,'fun',[{type,3668,product,[{var,3668,'Port'},{atom,3668,registered_name}]},{type,3668,union,[{type,3668,tuple,[{atom,3668,registered_name},{var,3668,'RegisteredName'}]},{type,3668,nil,[]},{atom,3668,undefined}]}]},[{type,3669,constraint,[{atom,3669,is_subtype},[{var,3669,'Port'},{type,3669,union,[{type,3669,port,[]},{type,3669,atom,[]}]}]]},{type,3670,constraint,[{atom,3670,is_subtype},[{var,3670,'RegisteredName'},{type,3670,atom,[]}]]}]]}]}}]}},{{function,port_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1506}],[<<112,111,114,116,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32>>,{code,[],[<<80,111,114,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,52,56>>,signature => [{attribute,1506,spec,{{port_to_list,1},[{type,1506,bounded_fun,[{type,1506,'fun',[{type,1506,product,[{var,1506,'Port'}]},{type,1506,string,[]}]},[{type,1507,constraint,[{atom,1507,is_subtype},[{var,1507,'Port'},{type,1507,port,[]}]]}]]}]}}]}},{{function,ports,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1512}],[<<112,111,114,116,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,111,114,116,115,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,111,114,116,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,111,112,101,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,53,55>>,signature => [{attribute,1512,spec,{{erlang,ports,0},[{type,1512,'fun',[{type,1512,product,[]},{type,1512,list,[{type,1512,port,[]}]}]}]}}]}},{{function,pre_loaded,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1658}],[<<112,114,101,95,108,111,97,100,101,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,112,114,101,108,111,97,100,101,100,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,65,115,32,97,108,108,32,108,111,97,100,105,110,103,32,111,102,32,99,111,100,101,32,105,115,32,100,111,110,101,32,116,104,114,111,117,103,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,44,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,109,117,115,116,32,104,97,118,101,32,98,101,101,110,32,108,111,97,100,101,100,32,112,114,101,118,105,111,117,115,108,121,46,32,72,101,110,99,101,44,32,97,116,32,108,101,97,115,116,32,116,104,101,32,109,111,100,117,108,101,32>>,{code,[],[<<105,110,105,116>>]},<<32,109,117,115,116,32,98,101,32,112,114,101,108,111,97,100,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,54,55>>,signature => [{attribute,1658,spec,{{pre_loaded,0},[{type,1658,'fun',[{type,1658,product,[]},{type,1658,list,[{type,1658,module,[]}]}]}]}}]}},{{function,process_display,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1663}],[<<112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,47,50>>],#{<<101,110>> => [{p,[],[<<87,114,105,116,101,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<32,111,110,32,115,116,97,110,100,97,114,100,32,101,114,114,111,114,46,32,84,104,101,32,111,110,108,121,32,97,108,108,111,119,101,100,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<98,97,99,107,116,114,97,99,101>>]},<<44,32,119,104,105,99,104,32,115,104,111,119,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,44,32,105,110,99,108,117,100,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,97,108,108,32,99,104,97,105,110,44,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,112,114,105,110,116,101,100,32,102,105,114,115,116,46,32,84,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,111,117,116,112,117,116,32,105,115,32,110,111,116,32,102,117,114,116,104,101,114,32,100,101,102,105,110,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,55,56>>,signature => [{attribute,1663,spec,{{erlang,process_display,2},[{type,1663,bounded_fun,[{type,1663,'fun',[{type,1663,product,[{var,1663,'Pid'},{var,1663,'Type'}]},{atom,1663,true}]},[{type,1664,constraint,[{atom,1664,is_subtype},[{var,1664,'Pid'},{type,1664,pid,[]}]]},{type,1665,constraint,[{atom,1665,is_subtype},[{var,1665,'Type'},{atom,1665,backtrace}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<87,104,101,110,32>>,{code,[],[<<116,114,97,112,95,101,120,105,116>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,114,114,105,118,105,110,103,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,114,101,32,99,111,110,118,101,114,116,101,100,32,116,111,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125>>]},<<32,109,101,115,115,97,103,101,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,99,101,105,118,101,100,32,97,115,32,111,114,100,105,110,97,114,121,32,109,101,115,115,97,103,101,115,46,32,73,102,32>>,{code,[],[<<116,114,97,112,95,101,120,105,116>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,105,102,32,105,116,32,114,101,99,101,105,118,101,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,111,116,104,101,114,32,116,104,97,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,110,100,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,116,111,32,105,116,115,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,65,112,112,108,105,99,97,116,105,111,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,116,111,32,116,114,97,112,32,101,120,105,116,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,120,105,116,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,57,50>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2356,bounded_fun,[{type,2356,'fun',[{type,2356,product,[{atom,2356,trap_exit},{var,2356,'Boolean'}]},{var,2356,'OldBoolean'}]},[{type,2357,constraint,[{atom,2357,is_subtype},[{var,2357,'Boolean'},{type,2357,boolean,[]}]]},{type,2358,constraint,[{atom,2358,is_subtype},[{var,2358,'OldBoolean'},{type,2358,boolean,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<85,115,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,116,111,32,114,101,100,101,102,105,110,101,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,110,100,32,117,110,100,101,102,105,110,101,100,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,101,115,46,32,73,110,101,120,112,101,114,105,101,110,99,101,100,32,117,115,101,114,115,32,97,114,101,32,110,111,116,32,116,111,32,117,115,101,32,116,104,105,115,32,102,108,97,103,44,32,97,115,32,99,111,100,101,32,97,117,116,111,45,108,111,97,100,105,110,103,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,99,111,114,114,101,99,116,32,111,112,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,109,111,100,117,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,53,48,57>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2359,bounded_fun,[{type,2359,'fun',[{type,2359,product,[{atom,2359,error_handler},{var,2359,'Module'}]},{var,2359,'OldModule'}]},[{type,2360,constraint,[{atom,2360,is_subtype},[{var,2360,'Module'},{type,2360,atom,[]}]]},{type,2361,constraint,[{atom,2361,is_subtype},[{var,2361,'OldModule'},{type,2361,atom,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,53,50,51>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2362,bounded_fun,[{type,2362,'fun',[{type,2362,product,[{atom,2362,min_heap_size},{var,2362,'MinHeapSize'}]},{var,2362,'OldMinHeapSize'}]},[{type,2363,constraint,[{atom,2363,is_subtype},[{var,2363,'MinHeapSize'},{type,2363,non_neg_integer,[]}]]},{type,2364,constraint,[{atom,2364,is_subtype},[{var,2364,'OldMinHeapSize'},{type,2364,non_neg_integer,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,53,51,52>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2365,bounded_fun,[{type,2365,'fun',[{type,2365,product,[{atom,2365,min_bin_vheap_size},{var,2365,'MinBinVHeapSize'}]},{var,2365,'OldMinBinVHeapSize'}]},[{type,2366,constraint,[{atom,2366,is_subtype},[{var,2366,'MinBinVHeapSize'},{type,2366,non_neg_integer,[]}]]},{type,2367,constraint,[{atom,2367,is_subtype},[{var,2367,'OldMinBinVHeapSize'},{type,2367,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]}]},{p,[],[<<84,104,105,115,32,102,108,97,103,32,115,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<77,97,120,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<107,105,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,114,111,114,95,108,111,103,103,101,114>>]},<<32,97,114,101,32,117,115,101,100,46>>]},{dl,[],[{dt,[],[{code,[],[<<115,105,122,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,115,101,116,32,116,111,32,122,101,114,111,44,32,116,104,101,32,104,101,97,112,32,115,105,122,101,32,108,105,109,105,116,32,105,115,32,100,105,115,97,98,108,101,100,46,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,115,32,98,101,32,116,104,114,111,119,110,32,105,102,32,116,104,101,32,118,97,108,117,101,32,105,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,105,110,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]}]},<<46,32,84,104,101,32,115,105,122,101,32,99,104,101,99,107,32,105,115,32,111,110,108,121,32,100,111,110,101,32,119,104,101,110,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46>>]},{p,[],[{code,[],[<<115,105,122,101>>]},<<32,105,115,32,116,104,101,32,101,110,116,105,114,101,32,104,101,97,112,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,97,108,108,32,103,101,110,101,114,97,116,105,111,110,97,108,32,104,101,97,112,115,44,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,44,32,97,110,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112>>]},<<44,32,97,110,100,32,97,110,121,32,101,120,116,114,97,32,109,101,109,111,114,121,32,116,104,97,116,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,111,114,32,110,101,101,100,115,32,100,117,114,105,110,103,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[{code,[],[<<115,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,41>>]}]},<<44,32,111,114,32,98,121,32,97,100,100,105,110,103,32>>,{code,[],[<<104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<32,97,110,100,32>>,{code,[],[<<109,98,117,102,95,115,105,122,101>>]},<<32,102,114,111,109,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<107,105,108,108>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,101,110,100,115,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,102,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,32,84,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,116,104,97,116,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32>>,{code,[],[<<107,105,108,108>>]},<<32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,100,44,32,105,110,115,116,101,97,100,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,97,115,32,115,111,111,110,32,97,115,32,112,111,115,115,105,98,108,101,46,32,87,104,101,110,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,110,111,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,44,32,105,110,115,116,101,97,100,32,105,116,32,99,111,110,116,105,110,117,101,115,32,101,120,101,99,117,116,105,110,103,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<107,105,108,108>>]},<<32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,119,105,108,108,32,98,101,32,117,115,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,111,112,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<43,104,109,97,120,107>>]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<101,114,114,111,114,95,108,111,103,103,101,114>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,108,111,103,115,32,97,110,32,101,114,114,111,114,32,101,118,101,110,116,32,118,105,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,108,111,103,103,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,103,103,101,114>>]}]},<<44,32,99,111,110,116,97,105,110,105,110,103,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,32,79,110,101,32,108,111,103,32,101,118,101,110,116,32,105,115,32,115,101,110,116,32,101,97,99,104,32,116,105,109,101,32,116,104,101,32,108,105,109,105,116,32,105,115,32,114,101,97,99,104,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<101,114,114,111,114,95,108,111,103,103,101,114>>]},<<32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,117,115,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,116,104,101,32,111,112,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<43,104,109,97,120,101,108>>]},<<32,105,110,116,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46>>]}]}]},{p,[],[<<84,104,101,32,104,101,97,112,32,115,105,122,101,32,111,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,113,117,105,116,101,32,104,97,114,100,32,116,111,32,112,114,101,100,105,99,116,44,32,101,115,112,101,99,105,97,108,108,121,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,99,111,110,116,101,109,112,108,97,116,105,110,103,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,102,105,114,115,116,32,114,117,110,32,105,116,32,105,110,32,112,114,111,100,117,99,116,105,111,110,32,119,105,116,104,32>>,{code,[],[<<107,105,108,108>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,97,110,100,32,105,110,115,112,101,99,116,32,116,104,101,32,108,111,103,32,101,118,101,110,116,115,32,116,111,32,115,101,101,32,119,104,97,116,32,116,104,101,32,110,111,114,109,97,108,32,112,101,97,107,32,115,105,122,101,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,105,115,32,97,110,100,32,116,104,101,110,32,116,117,110,101,32,116,104,101,32,118,97,108,117,101,32,97,99,99,111,114,100,105,110,103,108,121,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,53,52,53>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2368,bounded_fun,[{type,2368,'fun',[{type,2368,product,[{atom,2368,max_heap_size},{var,2368,'MaxHeapSize'}]},{var,2368,'OldMaxHeapSize'}]},[{type,2369,constraint,[{atom,2369,is_subtype},[{var,2369,'MaxHeapSize'},{user_type,2369,max_heap_size,[]}]]},{type,2370,constraint,[{atom,2370,is_subtype},[{var,2370,'OldMaxHeapSize'},{user_type,2370,max_heap_size,[]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]}]},{p,[],[<<84,104,105,115,32,102,108,97,103,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,114,101,32,115,116,111,114,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<111,102,102,95,104,101,97,112>>]}]},{dd,[],[{p,[],[{em,[],[<<65,108,108>>]},<<32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,32,115,116,111,114,101,100,32,111,117,116,115,105,100,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46,32,84,104,105,115,32,105,109,112,108,105,101,115,32,116,104,97,116,32>>,{em,[],[<<110,111>>]},<<32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,32,112,97,114,116,32,111,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<111,110,95,104,101,97,112>>]}]},{dd,[],[{p,[],[<<65,108,108,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,98,101,32,112,108,97,99,101,100,32,111,110,32,104,101,97,112,46,32,84,104,101,121,32,99,97,110,32,104,111,119,101,118,101,114,32,116,101,109,112,111,114,97,114,105,108,121,32,98,101,32,115,116,111,114,101,100,32,111,102,102,32,104,101,97,112,46,32,84,104,105,115,32,105,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,97,108,119,97,121,115,32,104,97,118,101,32,98,101,101,110,32,115,116,111,114,101,100,32,117,112,32,117,110,116,105,108,32,69,82,84,83,32,56,46,48,46>>]}]}]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,113,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,113,100>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,112,111,116,101,110,116,105,97,108,108,121,32,99,97,110,32,103,101,116,32,109,97,110,121,32,109,101,115,115,97,103,101,115,32,105,110,32,105,116,115,32,113,117,101,117,101,44,32,121,111,117,32,97,114,101,32,97,100,118,105,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,102,108,97,103,32,116,111,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<46,32,84,104,105,115,32,98,101,99,97,117,115,101,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,105,116,104,32,109,97,110,121,32,109,101,115,115,97,103,101,115,32,112,108,97,99,101,100,32,111,110,32,116,104,101,32,104,101,97,112,32,99,97,110,32,98,101,99,111,109,101,32,101,120,116,114,101,109,101,108,121,32,101,120,112,101,110,115,105,118,101,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,110,32,99,111,110,115,117,109,101,32,108,97,114,103,101,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,46,32,80,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,32,105,115,32,104,111,119,101,118,101,114,32,103,101,110,101,114,97,108,108,121,32,98,101,116,116,101,114,32,119,104,101,110,32,110,111,116,32,117,115,105,110,103,32,102,108,97,103,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<46>>]},{p,[],[<<87,104,101,110,32,99,104,97,110,103,105,110,103,32,116,104,105,115,32,102,108,97,103,32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,109,111,118,101,100,46,32,84,104,105,115,32,119,111,114,107,32,104,97,115,32,98,101,101,110,32,105,110,105,116,105,97,116,101,100,32,98,117,116,32,110,111,116,32,99,111,109,112,108,101,116,101,100,32,119,104,101,110,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,114,101,116,117,114,110,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,54,49,57>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2371,bounded_fun,[{type,2371,'fun',[{type,2371,product,[{atom,2371,message_queue_data},{var,2371,'MQD'}]},{var,2371,'OldMQD'}]},[{type,2372,constraint,[{atom,2372,is_subtype},[{var,2372,'MQD'},{user_type,2372,message_queue_data,[]}]]},{type,2373,constraint,[{atom,2373,is_subtype},[{var,2373,'OldMQD'},{user_type,2373,message_queue_data,[]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,46,32>>,{code,[],[<<76,101,118,101,108>>]},<<32,105,115,32,97,110,32,97,116,111,109,46,32,70,111,117,114,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,115,32,101,120,105,115,116,58,32>>,{code,[],[<<108,111,119>>]},<<44,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<44,32>>,{code,[],[<<104,105,103,104>>]},<<44,32,97,110,100,32>>,{code,[],[<<109,97,120>>]},<<46,32,68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<80,114,105,111,114,105,116,121,32,108,101,118,101,108,32>>,{code,[],[<<109,97,120>>]},<<32,105,115,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,110,116,101,114,110,97,108,32,117,115,101,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,44,32,97,110,100,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,111,116,104,101,114,115,46>>]}]},{p,[],[<<73,110,116,101,114,110,97,108,108,121,32,105,110,32,101,97,99,104,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,44,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,115,99,104,101,100,117,108,101,100,32,105,110,32,97,32,114,111,117,110,100,32,114,111,98,105,110,32,102,97,115,104,105,111,110,46>>]},{p,[],[<<69,120,101,99,117,116,105,111,110,32,111,102,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,110,100,32>>,{code,[],[<<108,111,119>>]},<<32,97,114,101,32,105,110,116,101,114,108,101,97,118,101,100,46,32,80,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,108,101,115,115,32,102,114,101,113,117,101,110,116,108,121,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{p,[],[<<87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<32,111,114,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,116,104,105,115,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,109,101,97,110,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<32,111,114,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,99,97,110,32,114,117,110,32,119,104,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,114,117,110,110,105,110,103,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<46,32,87,104,101,110,32,117,115,105,110,103,32,109,117,108,116,105,112,108,101,32,115,99,104,101,100,117,108,101,114,115,44,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,32,99,97,110,32,98,101,32,114,117,110,110,105,110,103,32,105,110,32,112,97,114,97,108,108,101,108,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<46,32,84,104,97,116,32,105,115,44,32,97,32>>,{code,[],[<<108,111,119>>]},<<32,97,110,100,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,110,32,101,120,101,99,117,116,101,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46>>]},{p,[],[<<87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<109,97,120>>]},<<32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<44,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<44,32,111,114,32>>,{code,[],[<<104,105,103,104>>]},<<32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,65,115,32,119,105,116,104,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<44,32,112,114,111,99,101,115,115,101,115,32,111,110,32,108,111,119,101,114,32,112,114,105,111,114,105,116,105,101,115,32,99,97,110,32,101,120,101,99,117,116,101,32,105,110,32,112,97,114,97,108,108,101,108,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<109,97,120>>]},<<46>>]},{p,[],[<<83,99,104,101,100,117,108,105,110,103,32,105,115,32,112,114,101,45,101,109,112,116,105,118,101,46,32,82,101,103,97,114,100,108,101,115,115,32,111,102,32,112,114,105,111,114,105,116,121,44,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,114,101,45,101,109,112,116,101,100,32,119,104,101,110,32,105,116,32,104,97,115,32,99,111,110,115,117,109,101,100,32,109,111,114,101,32,116,104,97,110,32,97,32,99,101,114,116,97,105,110,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,32,119,97,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,115,99,104,101,100,117,108,105,110,103,32,116,111,32,114,101,109,97,105,110,32,101,120,97,99,116,108,121,32,97,115,32,105,116,32,105,115,32,116,111,100,97,121,46,32,83,99,104,101,100,117,108,105,110,103,32,105,115,32,108,105,107,101,108,121,32,116,111,32,98,101,32,99,104,97,110,103,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,32,116,111,32,117,115,101,32,97,118,97,105,108,97,98,108,101,32,112,114,111,99,101,115,115,111,114,32,99,111,114,101,115,32,98,101,116,116,101,114,46>>]}]},{p,[],[<<84,104,101,114,101,32,105,115,32>>,{em,[],[<<110,111>>]},<<32,97,117,116,111,109,97,116,105,99,32,109,101,99,104,97,110,105,115,109,32,102,111,114,32,97,118,111,105,100,105,110,103,32,112,114,105,111,114,105,116,121,32,105,110,118,101,114,115,105,111,110,44,32,115,117,99,104,32,97,115,32,112,114,105,111,114,105,116,121,32,105,110,104,101,114,105,116,97,110,99,101,32,111,114,32,112,114,105,111,114,105,116,121,32,99,101,105,108,105,110,103,115,46,32,87,104,101,110,32,117,115,105,110,103,32,112,114,105,111,114,105,116,105,101,115,44,32,116,97,107,101,32,116,104,105,115,32,105,110,116,111,32,97,99,99,111,117,110,116,32,97,110,100,32,104,97,110,100,108,101,32,115,117,99,104,32,115,99,101,110,97,114,105,111,115,32,98,121,32,121,111,117,114,115,101,108,102,46>>]},{p,[],[<<77,97,107,105,110,103,32,99,97,108,108,115,32,102,114,111,109,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,105,110,116,111,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,115,32,110,111,32,99,111,110,116,114,111,108,32,111,118,101,114,32,99,97,110,32,99,97,117,115,101,32,116,104,101,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,111,32,119,97,105,116,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,119,105,116,104,32,108,111,119,101,114,32,112,114,105,111,114,105,116,121,46,32,84,104,97,116,32,105,115,44,32,101,102,102,101,99,116,105,118,101,108,121,32,100,101,99,114,101,97,115,105,110,103,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,46,32,69,118,101,110,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,32,119,105,116,104,32,111,110,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,118,101,32,110,111,32,99,111,110,116,114,111,108,32,111,118,101,114,44,32,105,116,32,99,97,110,32,98,101,32,116,104,101,32,99,97,115,101,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,105,116,46,32,84,104,105,115,32,99,97,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,111,99,99,117,114,32,105,102,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,114,105,103,103,101,114,115,32,99,111,100,101,32,108,111,97,100,105,110,103,44,32,97,115,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,114,117,110,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{p,[],[<<79,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,32,116,104,97,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,110,101,101,100,101,100,46,32,87,104,101,110,32,111,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,32,97,114,101,32,117,115,101,100,44,32,117,115,101,32,116,104,101,109,32,119,105,116,104,32,99,97,114,101,44,32>>,{em,[],[<<101,115,112,101,99,105,97,108,108,121>>]},<<32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<46,32,65,32,112,114,111,99,101,115,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<32,105,115,32,111,110,108,121,32,116,111,32,112,101,114,102,111,114,109,32,119,111,114,107,32,102,111,114,32,115,104,111,114,116,32,112,101,114,105,111,100,115,46,32,66,117,115,121,32,108,111,111,112,105,110,103,32,102,111,114,32,108,111,110,103,32,112,101,114,105,111,100,115,32,105,110,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,117,115,101,115,32,109,111,115,116,32,108,105,107,101,108,121,32,112,114,111,98,108,101,109,115,44,32,97,115,32,105,109,112,111,114,116,97,110,116,32,79,84,80,32,115,101,114,118,101,114,115,32,114,117,110,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,54,54,49>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2374,bounded_fun,[{type,2374,'fun',[{type,2374,product,[{atom,2374,priority},{var,2374,'Level'}]},{var,2374,'OldLevel'}]},[{type,2375,constraint,[{atom,2375,is_subtype},[{var,2375,'Level'},{user_type,2375,priority_level,[]}]]},{type,2376,constraint,[{atom,2376,is_subtype},[{var,2376,'OldLevel'},{user_type,2376,priority_level,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<78>>]},<<32,109,117,115,116,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,105,110,32,116,104,101,32,105,110,116,101,114,118,97,108,32,48,46,46,49,48,48,48,48,46,32,73,102,32>>,{code,[],[<<78>>]},<<32,62,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,109,97,100,101,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<78>>]},<<32,109,111,115,116,32,114,101,99,101,110,116,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,66,73,70,32,99,97,108,108,115,44,32,115,101,110,100,115,44,32,97,110,100,32,114,101,99,101,105,118,101,115,32,109,97,100,101,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,97,114,101,32,115,97,118,101,100,32,105,110,32,97,32,108,105,115,116,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,32>>,{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,108,97,115,116,95,99,97,108,108,115,41>>]},<<46,32,65,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,105,115,32,111,110,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,109,111,100,117,108,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,109,101,110,116,105,111,110,101,100,46,32,79,110,108,121,32,97,32,102,105,120,101,100,32,97,109,111,117,110,116,32,111,102,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,115,97,118,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{ul,[],[{li,[],[{p,[],[<<65,32,116,117,112,108,101,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<32,102,111,114,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115>>]}]},{li,[],[{p,[],[<<84,104,101,32,97,116,111,109,115,32>>,{code,[],[<<115,101,110,100>>]},<<44,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<44,32,97,110,100,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,102,111,114,32,115,101,110,100,115,32,97,110,100,32,114,101,99,101,105,118,101,115,32,40>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,97,110,100,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,119,104,101,110,32,97,32,114,101,99,101,105,118,101,32,116,105,109,101,115,32,111,117,116,41>>]}]}]},{p,[],[<<73,102,32>>,{code,[],[<<78>>]},<<32,61,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,100,105,115,97,98,108,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,32,87,104,101,110,101,118,101,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,115,101,116,44,32,105,116,115,32,99,111,110,116,101,110,116,115,32,97,114,101,32,114,101,115,101,116,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,55,51,52>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2377,bounded_fun,[{type,2377,'fun',[{type,2377,product,[{atom,2377,save_calls},{var,2377,'N'}]},{var,2377,'OldN'}]},[{type,2378,constraint,[{atom,2378,is_subtype},[{var,2378,'N'},{type,2378,range,[{integer,2378,0},{integer,2378,10000}]}]]},{type,2379,constraint,[{atom,2379,is_subtype},[{var,2379,'OldN'},{type,2379,range,[{integer,2379,0},{integer,2379,10000}]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2356}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,111,114,32,99,108,101,97,114,115,32,102,108,97,103,32>>,{code,[],[<<115,101,110,115,105,116,105,118,101>>]},<<32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,109,97,114,107,101,100,32,97,115,32,115,101,110,115,105,116,105,118,101,32,98,121,32,99,97,108,108,105,110,103,32>>,{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,115,101,110,115,105,116,105,118,101,44,32,116,114,117,101,41>>]},<<44,32,102,101,97,116,117,114,101,115,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,101,120,97,109,105,110,105,110,103,32,116,104,101,32,100,97,116,97,32,111,114,32,105,110,110,101,114,32,119,111,114,107,105,110,103,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,97,114,101,32,115,105,108,101,110,116,108,121,32,100,105,115,97,98,108,101,100,46>>]},{p,[],[<<70,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,100,105,115,97,98,108,101,100,32,105,110,99,108,117,100,101,32,40,98,117,116,32,97,114,101,32,110,111,116,32,108,105,109,105,116,101,100,32,116,111,41,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{p,[],[<<84,114,97,99,105,110,103,46,32,84,114,97,99,101,32,102,108,97,103,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,98,117,116,32,110,111,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,111,102,32,97,110,121,32,107,105,110,100,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46,32,40,73,102,32,102,108,97,103,32>>,{code,[],[<<115,101,110,115,105,116,105,118,101>>]},<<32,105,115,32,116,117,114,110,101,100,32,111,102,102,44,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,97,103,97,105,110,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,110,121,32,116,114,97,99,101,32,102,108,97,103,115,32,97,114,101,32,115,101,116,46,41>>]}]},{li,[],[{p,[],[<<83,101,113,117,101,110,116,105,97,108,32,116,114,97,99,105,110,103,46,32,84,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,110,111,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46>>]}]}]},{p,[],[{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,49,44,50>>]},<<32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,32,116,111,32,114,101,97,100,32,111,117,116,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,40,98,111,116,104,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,101,109,112,116,121,32,108,105,115,116,115,41,46>>]},{p,[],[<<83,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,99,97,110,110,111,116,32,98,101,32,100,105,115,112,108,97,121,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,110,32,99,114,97,115,104,32,100,117,109,112,115,44,32,116,104,101,32,115,116,97,99,107,44,32,109,101,115,115,97,103,101,115,44,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,114,101,32,111,109,105,116,116,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<123,115,97,118,101,95,99,97,108,108,115,44,78,125>>]},<<32,104,97,115,32,98,101,101,110,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,110,111,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,115,97,118,101,100,32,116,111,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,46,32,40,84,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,110,111,116,32,99,108,101,97,114,101,100,46,32,65,108,115,111,44,32,115,101,110,100,44,32,114,101,99,101,105,118,101,44,32,97,110,100,32,116,105,109,101,45,111,117,116,32,101,118,101,110,116,115,32,97,114,101,32,115,116,105,108,108,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,46,41>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,55,54,53>>,signature => [{attribute,2356,spec,{{process_flag,2},[{type,2380,bounded_fun,[{type,2380,'fun',[{type,2380,product,[{atom,2380,sensitive},{var,2380,'Boolean'}]},{var,2380,'OldBoolean'}]},[{type,2381,constraint,[{atom,2381,is_subtype},[{var,2381,'Boolean'},{type,2381,boolean,[]}]]},{type,2382,constraint,[{atom,2382,is_subtype},[{var,2382,'OldBoolean'},{type,2382,boolean,[]}]]}]]}]}}]}},{{function,process_flag,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1685}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,99,101,114,116,97,105,110,32,102,108,97,103,115,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<44,32,105,110,32,116,104,101,32,115,97,109,101,32,109,97,110,110,101,114,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<70,108,97,103>>]},<<32,97,114,101,32,111,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,111,115,101,32,97,108,108,111,119,101,100,32,105,110,32>>,{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]},<<44,32,110,97,109,101,108,121,32>>,{code,[],[<<115,97,118,101,95,99,97,108,108,115>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,55,57,57>>,signature => [{attribute,1685,spec,{{process_flag,3},[{type,1685,bounded_fun,[{type,1685,'fun',[{type,1685,product,[{var,1685,'Pid'},{var,1685,'Flag'},{var,1685,'Value'}]},{var,1685,'OldValue'}]},[{type,1686,constraint,[{atom,1686,is_subtype},[{var,1686,'Pid'},{type,1686,pid,[]}]]},{type,1687,constraint,[{atom,1687,is_subtype},[{var,1687,'Flag'},{atom,1687,save_calls}]]},{type,1688,constraint,[{atom,1688,is_subtype},[{var,1688,'Value'},{type,1688,non_neg_integer,[]}]]},{type,1689,constraint,[{atom,1689,is_subtype},[{var,1689,'OldValue'},{type,1689,non_neg_integer,[]}]]}]]}]}}]}},{{function,process_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1702}],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<112,114,111,99,101,115,115,95,105,110,102,111,95,114,101,115,117,108,116,95,105,116,101,109>>}],[]},{li,[{name,<<115,116,97,99,107,95,105,116,101,109>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,119,105,116,104,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]},{p,[],[<<84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,97,108,108,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,97,114,101,32,110,111,116,32,109,97,110,100,97,116,111,114,121,46,32,84,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,119,105,116,104,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,116,101,109,115,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,58>>]},{ul,[],[{li,[],[{code,[],[<<99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110>>]}]},{li,[],[{code,[],[<<105,110,105,116,105,97,108,95,99,97,108,108>>]}]},{li,[],[{code,[],[<<115,116,97,116,117,115>>]}]},{li,[],[{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110>>]}]},{li,[],[{code,[],[<<108,105,110,107,115>>]}]},{li,[],[{code,[],[<<100,105,99,116,105,111,110,97,114,121>>]}]},{li,[],[{code,[],[<<116,114,97,112,95,101,120,105,116>>]}]},{li,[],[{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]}]},{li,[],[{code,[],[<<112,114,105,111,114,105,116,121>>]}]},{li,[],[{code,[],[<<103,114,111,117,112,95,108,101,97,100,101,114>>]}]},{li,[],[{code,[],[<<116,111,116,97,108,95,104,101,97,112,95,115,105,122,101>>]}]},{li,[],[{code,[],[<<104,101,97,112,95,115,105,122,101>>]}]},{li,[],[{code,[],[<<115,116,97,99,107,95,115,105,122,101>>]}]},{li,[],[{code,[],[<<114,101,100,117,99,116,105,111,110,115>>]}]},{li,[],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]}]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,97,108,115,111,32,97,110,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,119,105,116,104,32,105,116,101,109,32>>,{code,[],[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,105,115,32,105,110,99,108,117,100,101,100,46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,112,101,99,105,102,105,99,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,50>>]}]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32>>,{em,[],[<<100,101,98,117,103,103,105,110,103,32,111,110,108,121>>]},<<46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,32,112,117,114,112,111,115,101,115,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,50>>]}]},<<46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,49,52>>,signature => [{attribute,1702,spec,{{process_info,1},[{type,1702,bounded_fun,[{type,1702,'fun',[{type,1702,product,[{var,1702,'Pid'}]},{var,1702,'Info'}]},[{type,1703,constraint,[{atom,1703,is_subtype},[{var,1703,'Pid'},{type,1703,pid,[]}]]},{type,1704,constraint,[{atom,1704,is_subtype},[{var,1704,'Info'},{type,1704,union,[{type,1704,list,[{var,1704,'InfoTuple'}]},{atom,1704,undefined}]}]]},{type,1705,constraint,[{atom,1705,is_subtype},[{var,1705,'InfoTuple'},{user_type,1705,process_info_result_item,[]}]]}]]}]}}]}},{{function,process_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2479}],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<112,114,111,99,101,115,115,95,105,110,102,111,95,105,116,101,109>>}],[]},{li,[{name,<<112,114,111,99,101,115,115,95,105,110,102,111,95,114,101,115,117,108,116,95,105,116,101,109>>}],[]},{li,[{name,<<115,116,97,99,107,95,105,116,101,109>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<32,111,114,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,108,105,118,101,32,97,110,100,32,97,32,115,105,110,103,108,101,32>>,{code,[],[<<73,116,101,109>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<44,32,117,110,108,101,115,115,32>>,{code,[],[<<73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,115,116,114,97,110,103,101,32,98,101,104,97,118,105,111,114,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,104,105,115,116,111,114,105,99,97,108,32,114,101,97,115,111,110,115,44,32,97,110,100,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101,76,105,115,116>>]},<<46,32,84,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,105,110,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101,76,105,115,116>>]},<<32,97,114,101,32,105,110,99,108,117,100,101,100,32,119,105,116,104,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,105,110,32,116,104,101,32,115,97,109,101,32,111,114,100,101,114,32,97,115,32,116,104,101,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,119,101,114,101,32,105,110,99,108,117,100,101,100,32,105,110,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<46,32,86,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,105,110,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32>>,{code,[],[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,105,115,32,112,97,114,116,32,111,102,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,110,97,109,101,32,114,101,103,105,115,116,101,114,101,100,44,32,97,32>>,{code,[],[<<123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,91,93,125>>]},<<44,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32>>,{em,[],[<<119,105,108,108>>]},<<32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101,76,105,115,116>>]},<<46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,97,32,115,105,110,103,108,101,32>>,{code,[],[<<73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,97,110,100,32,119,104,101,110,32>>,{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,49>>]},<<32,105,115,32,117,115,101,100,46>>]}]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,119,105,116,104,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<73,116,101,109>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,98,97,99,107,116,114,97,99,101,44,32,66,105,110,125>>]}]},{dd,[],[{p,[],[<<66,105,110,97,114,121,32>>,{code,[],[<<66,105,110>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,115,32,116,104,101,32,111,117,116,112,117,116,32,102,114,111,109,32>>,{code,[],[<<101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,40,80,105,100,44,32,98,97,99,107,116,114,97,99,101,41>>]},<<46,32,85,115,101,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49>>]},<<32,116,111,32,111,98,116,97,105,110,32,116,104,101,32,115,116,114,105,110,103,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,46>>]}]},{dt,[],[{code,[],[<<123,98,105,110,97,114,121,44,32,66,105,110,73,110,102,111,125>>]}]},{dd,[],[{p,[],[{code,[],[<<66,105,110,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,98,105,110,97,114,105,101,115,32,111,110,32,116,104,101,32,104,101,97,112,32,111,102,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,110,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32>>,{code,[],[<<66,105,110,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,46,32,84,104,101,32,116,117,112,108,101,115,32,99,111,110,116,97,105,110,59,32>>,{code,[],[<<66,105,110,97,114,121,73,100>>]},<<44,32>>,{code,[],[<<66,105,110,97,114,121,83,105,122,101>>]},<<44,32>>,{code,[],[<<66,105,110,97,114,121,82,101,102,99,67,111,117,110,116>>]},<<46>>]},{p,[],[<<84,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,115,32,111,110,32,116,104,101,32,104,101,97,112,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,99,97,116,99,104,108,101,118,101,108,44,32,67,97,116,99,104,76,101,118,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<67,97,116,99,104,76,101,118,101,108>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,99,117,114,114,101,110,116,108,121,32,97,99,116,105,118,101,32,99,97,116,99,104,101,115,32,105,110,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,32,124,32,117,110,100,101,102,105,110,101,100,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,118,97,108,117,101,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,110,97,116,105,118,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,114,101,110,116,95,108,111,99,97,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,44,32,76,111,99,97,116,105,111,110,125,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,108,111,99,97,116,105,111,110,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,44,32,83,116,97,99,107,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,32,40>>,{em,[],[<<115,116,97,99,107,116,114,97,99,101>>]},<<41,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,116,97,99,107,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,115,32,105,110,32,116,104,101,32>>,{code,[],[<<99,97,116,99,104>>]},<<32,112,97,114,116,32,111,102,32,97,32>>,{code,[],[<<116,114,121>>]},<<46,32,83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115,35,115,116,97,99,107,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<84,104,101,32,99,97,108,108,45,115,116,97,99,107,32,98,97,99,107,32,116,114,97,99,101,32,40,115,116,97,99,107,116,114,97,99,101,41>>]},<<46,32,84,104,101,32,100,101,112,116,104,32,111,102,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32>>,{code,[],[<<98,97,99,107,116,114,97,99,101,95,100,101,112,116,104>>]},<<32,115,121,115,116,101,109,32,102,108,97,103,32,115,101,116,116,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,100,105,99,116,105,111,110,97,114,121,44,32,68,105,99,116,105,111,110,97,114,121,125>>]}]},{dd,[],[{p,[],[{code,[],[<<68,105,99,116,105,111,110,97,114,121>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,95,104,97,110,100,108,101,114,44,32,77,111,100,117,108,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,109,111,100,117,108,101,32,117,115,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,40,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,102,111,114,32,101,120,97,109,112,108,101,41,46>>]}]},{dt,[],[{code,[],[<<123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,44,32,71,67,73,110,102,111,125>>]}]},{dd,[],[{p,[],[{code,[],[<<71,67,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32>>,{code,[],[<<71,67,73,110,102,111>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{a,[{id,<<112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111>>}],[]},{code,[],[<<123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,44,32,71,67,73,110,102,111,125>>]}]},{dd,[],[{p,[],[{code,[],[<<71,67,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,100,101,116,97,105,108,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32>>,{code,[],[<<71,67,73,110,102,111>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,101,97,99,104,32,105,116,101,109,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]}]},<<32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,103,114,111,117,112,95,108,101,97,100,101,114,44,32,71,114,111,117,112,76,101,97,100,101,114,125>>]}]},{dd,[],[{p,[],[{code,[],[<<71,114,111,117,112,76,101,97,100,101,114>>]},<<32,105,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,32,73,47,79,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,121,111,117,110,103,101,115,116,32,104,101,97,112,32,103,101,110,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,103,101,110,101,114,97,116,105,111,110,32,105,110,99,108,117,100,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,44,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,99,104,97,110,103,101,115,46>>]}]},{dt,[],[{code,[],[<<123,105,110,105,116,105,97,108,95,99,97,108,108,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,105,110,105,116,105,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,119,105,116,104,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,115,112,97,119,110,101,100,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,107,115,44,32,80,105,100,115,65,110,100,80,111,114,116,115,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,105,100,115,65,110,100,80,111,114,116,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,97,110,100,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,114,32,112,111,114,116,115,32,116,111,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,108,105,110,107,46>>]}]},{dt,[],[{code,[],[<<123,108,97,115,116,95,99,97,108,108,115,44,32,102,97,108,115,101,124,67,97,108,108,115,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,110,111,116,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,51>>]}]},<<41,46,32,73,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,97,99,116,105,118,101,44,32,97,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,44,32,105,110,32,119,104,105,99,104,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,99,97,108,108,101,100,46>>]}]},{dt,[],[{code,[],[<<123,109,101,109,111,114,121,44,32,83,105,122,101,125>>]}]},{dd,[],[{a,[{id,<<112,114,111,99,101,115,115,95,105,110,102,111,95,109,101,109,111,114,121>>}],[]},{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,99,97,108,108,32,115,116,97,99,107,44,32,104,101,97,112,44,32,97,110,100,32,105,110,116,101,114,110,97,108,32,115,116,114,117,99,116,117,114,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110,44,32,77,101,115,115,97,103,101,81,117,101,117,101,76,101,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,101,115,115,97,103,101,81,117,101,117,101,76,101,110>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,109,101,115,115,97,103,101,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<77,101,115,115,97,103,101,81,117,101,117,101>>]},<<32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,116,101,109,32>>,{code,[],[<<109,101,115,115,97,103,101,115>>]},<<32,40,115,101,101,32,98,101,108,111,119,41,46>>]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,115,44,32,77,101,115,115,97,103,101,81,117,101,117,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,101,115,115,97,103,101,81,117,101,117,101>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,104,97,118,101,32,110,111,116,32,121,101,116,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,105,110,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,105,110,66,105,110,86,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,101,100,95,98,121,44,32,77,111,110,105,116,111,114,101,100,66,121,125>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,105,100,101,110,116,105,102,105,101,114,115,32,102,111,114,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,44,32,112,111,114,116,115,32,97,110,100,32,78,73,70,32,114,101,115,111,117,114,99,101,115,44,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,115,44,32,77,111,110,105,116,111,114,115,125>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,115,32,40,115,116,97,114,116,101,100,32,98,121,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<41,32,116,104,97,116,32,97,114,101,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,70,111,114,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,111,114,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,98,121,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,101,32,108,105,115,116,32,99,111,110,115,105,115,116,115,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,114,111,99,101,115,115,44,32,80,105,100,125>>]}]},{dd,[],[<<80,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,105,100,46>>]},{dt,[],[{code,[],[<<123,112,114,111,99,101,115,115,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125>>]}]},{dd,[],[<<76,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,46>>]},{dt,[],[{code,[],[<<123,112,111,114,116,44,32,80,111,114,116,73,100,125>>]}]},{dd,[],[<<76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,111,114,116,32,105,100,46>>]},{dt,[],[{code,[],[<<123,112,111,114,116,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125>>]}]},{dd,[],[<<76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,46,32,80,108,101,97,115,101,32,110,111,116,101,44,32,116,104,97,116,32,114,101,109,111,116,101,32,112,111,114,116,32,109,111,110,105,116,111,114,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,115,111,32>>,{code,[],[<<78,111,100,101>>]},<<32,119,105,108,108,32,97,108,119,97,121,115,32,98,101,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,46>>]}]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,116,101,32,111,102,32,112,114,111,99,101,115,115,32,102,108,97,103,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<46,32>>,{code,[],[<<77,81,68>>]},<<32,105,115,32,101,105,116,104,101,114,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<32,111,114,32>>,{code,[],[<<111,110,95,104,101,97,112>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<76,101,118,101,108>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,100,117,99,116,105,111,110,115,44,32,78,117,109,98,101,114,125>>]}]},{dd,[],[{p,[],[{code,[],[<<78,117,109,98,101,114>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,101,120,101,99,117,116,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,65,116,111,109,125>>]}]},{dd,[],[{p,[],[{code,[],[<<65,116,111,109>>]},<<32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,32,110,97,109,101,46,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,116,104,105,115,32,116,117,112,108,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46>>]}]},{dt,[],[{code,[],[<<123,115,101,113,117,101,110,116,105,97,108,95,116,114,97,99,101,95,116,111,107,101,110,44,32,91,93,32,124,32,83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110>>]},<<32,105,115,32,116,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,115,116,97,99,107,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,116,97,99,107,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,115,116,97,116,117,115,44,32,83,116,97,116,117,115,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,116,97,116,117,115>>]},<<32,105,115,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,97,110,100,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{code,[],[<<101,120,105,116,105,110,103>>]}]},{li,[],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,110,103>>]}]},{li,[],[{code,[],[<<119,97,105,116,105,110,103>>]},<<32,40,102,111,114,32,97,32,109,101,115,115,97,103,101,41>>]},{li,[],[{code,[],[<<114,117,110,110,105,110,103>>]}]},{li,[],[{code,[],[<<114,117,110,110,97,98,108,101>>]},<<32,40,114,101,97,100,121,32,116,111,32,114,117,110,44,32,98,117,116,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,115,32,114,117,110,110,105,110,103,41>>]},{li,[],[{code,[],[<<115,117,115,112,101,110,100,101,100>>]},<<32,40,115,117,115,112,101,110,100,101,100,32,111,110,32,97,32,34,98,117,115,121,34,32,112,111,114,116,32,111,114,32,98,121,32,116,104,101,32,66,73,70,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,44,50>>]},<<41>>]}]}]},{dt,[],[{code,[],[<<123,115,117,115,112,101,110,100,105,110,103,44,32,83,117,115,112,101,110,100,101,101,76,105,115,116,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101,76,105,115,116>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,83,117,115,112,101,110,100,101,101,44,32,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,44,32,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,125>>]},<<32,116,117,112,108,101,115,46,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,101,101,110,44,32,111,114,32,105,115,32,116,111,32,98,101,44,32,115,117,115,112,101,110,100,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,116,104,114,111,117,103,104,32,116,104,101,32,66,73,70,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>]}]},<<46>>]},{p,[],[{code,[],[<<65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46,32>>,{code,[],[<<79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,110,111,116,32,121,101,116,32,99,111,109,112,108,101,116,101,100,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,115,32,115,101,110,116,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,116,104,97,116,32,105,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48>>]},<<44,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48>>]},<<44,32,111,112,116,105,111,110,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,101,101,32,104,97,115,32,110,111,116,32,121,101,116,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,97,114,101,32,110,111,116,32,116,104,101,32,116,111,116,97,108,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<44,32,111,110,108,121,32,116,104,101,32,112,97,114,116,115,32,99,111,110,116,114,105,98,117,116,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]},{dt,[],[{a,[{id,<<112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<123,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,97,108,108,32,104,101,97,112,32,102,114,97,103,109,101,110,116,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,32,97,110,100,32,97,110,121,32,117,110,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112,46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,99,101,44,32,73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115,125>>]}]},{dd,[],[{p,[],[{code,[],[<<73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,105,110,116,101,114,110,97,108,32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,112,95,101,120,105,116,44,32,66,111,111,108,101,97,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<66,111,111,108,101,97,110>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,115,117,112,112,111,114,116,32,97,108,108,32,116,104,101,115,101,32>>,{code,[],[<<73,116,101,109>>]},<<115,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<73,116,101,109>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,105,116,101,109,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,54,53>>,signature => [{attribute,2479,spec,{{process_info,2},[{type,2479,bounded_fun,[{type,2479,'fun',[{type,2479,product,[{var,2479,'Pid'},{var,2479,'Item'}]},{type,2480,union,[{var,2480,'InfoTuple'},{type,2480,nil,[]},{atom,2480,undefined}]}]},[{type,2481,constraint,[{atom,2481,is_subtype},[{var,2481,'Pid'},{type,2481,pid,[]}]]},{type,2482,constraint,[{atom,2482,is_subtype},[{var,2482,'Item'},{user_type,2482,process_info_item,[]}]]},{type,2483,constraint,[{atom,2483,is_subtype},[{var,2483,'InfoTuple'},{user_type,2483,process_info_result_item,[]}]]}]]},{type,2484,bounded_fun,[{type,2484,'fun',[{type,2484,product,[{var,2484,'Pid'},{var,2484,'ItemList'}]},{type,2484,union,[{var,2484,'InfoTupleList'},{type,2484,nil,[]},{atom,2484,undefined}]}]},[{type,2485,constraint,[{atom,2485,is_subtype},[{var,2485,'Pid'},{type,2485,pid,[]}]]},{type,2486,constraint,[{atom,2486,is_subtype},[{var,2486,'ItemList'},{type,2486,list,[{var,2486,'Item'}]}]]},{type,2487,constraint,[{atom,2487,is_subtype},[{var,2487,'Item'},{user_type,2487,process_info_item,[]}]]},{type,2488,constraint,[{atom,2488,is_subtype},[{var,2488,'InfoTupleList'},{type,2488,list,[{var,2488,'InfoTuple'}]}]]},{type,2489,constraint,[{atom,2489,is_subtype},[{var,2489,'InfoTuple'},{user_type,2489,process_info_result_item,[]}]]}]]}]}}]}},{{function,processes,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1710}],[<<112,114,111,99,101,115,115,101,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,97,108,105,118,101,46,32,84,104,97,116,32,105,115,44,32>>,{code,[],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,102,111,114,32,97,110,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,44,32,98,117,116,32,105,116,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115,47,48>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,114,111,99,101,115,115,101,115,40,41,46,10,91,60,48,46,48,46,48,62,44,60,48,46,50,46,48,62,44,60,48,46,52,46,48,62,44,60,48,46,53,46,48,62,44,60,48,46,55,46,48,62,44,60,48,46,56,46,48,62,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,50,48,51>>,signature => [{attribute,1710,spec,{{processes,0},[{type,1710,'fun',[{type,1710,product,[]},{type,1710,list,[{type,1710,pid,[]}]}]}]}}]}},{{function,purge_module,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1715}],[<<112,117,114,103,101,95,109,111,100,117,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,109,111,118,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46,32,66,101,102,111,114,101,32,116,104,105,115,32,66,73,70,32,105,115,32,117,115,101,100,44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50>>]}]},<<32,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,116,111,32,99,104,101,99,107,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,40,69,114,108,97,110,103,47,79,84,80,32,49,57,41,44,32,97,110,121,32,108,105,110,103,101,114,105,110,103,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,115,116,105,108,108,32,101,120,101,99,117,116,101,32,116,104,101,32,111,108,100,32,99,111,100,101,32,105,115,32,107,105,108,108,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,73,110,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,105,110,99,111,114,114,101,99,116,32,117,115,101,32,99,111,117,108,100,32,99,97,117,115,101,32,109,117,99,104,32,109,111,114,101,32,102,97,116,97,108,32,102,97,105,108,117,114,101,115,44,32,108,105,107,101,32,101,109,117,108,97,116,111,114,32,99,114,97,115,104,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,50,50,48>>,signature => [{attribute,1715,spec,{{purge_module,1},[{type,1715,bounded_fun,[{type,1715,'fun',[{type,1715,product,[{var,1715,'Module'}]},{atom,1715,true}]},[{type,1716,constraint,[{atom,1716,is_subtype},[{var,1716,'Module'},{type,1716,atom,[]}]]}]]}]}}]}},{{function,put,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1729}],[<<112,117,116,47,50>>],#{<<101,110>> => [{p,[],[<<65,100,100,115,32,97,32,110,101,119,32>>,{code,[],[<<75,101,121>>]},<<32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<44,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46,32,73,102,32>>,{code,[],[<<75,101,121>>]},<<32,101,120,105,115,116,115,44,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,105,115,32,100,101,108,101,116,101,100,32,97,110,100,32,114,101,112,108,97,99,101,100,32,98,121,32>>,{code,[],[<<86,97,108>>]},<<44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,46,32,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,79,40>>,{code,[],[<<49>>]},<<41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40>>,{code,[],[<<78>>]},<<41,44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,88,32,61,32,112,117,116,40,110,97,109,101,44,32,119,97,108,114,117,115,41,44,32,89,32,61,32,112,117,116,40,110,97,109,101,44,32,99,97,114,112,101,110,116,101,114,41,44,10,90,32,61,32,103,101,116,40,110,97,109,101,41,44,10,123,88,44,32,89,44,32,90,125,46,10,123,117,110,100,101,102,105,110,101,100,44,119,97,108,114,117,115,44,99,97,114,112,101,110,116,101,114,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,118,97,108,117,101,115,32,115,116,111,114,101,100,32,119,104,101,110,32>>,{code,[],[<<112,117,116>>]},<<32,105,115,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,116,104,101,32,115,99,111,112,101,32,111,102,32,97,32>>,{code,[],[<<99,97,116,99,104>>]},<<32,97,114,101,32,110,111,116,32,114,101,116,114,97,99,116,101,100,32,105,102,32,97,32>>,{code,[],[<<116,104,114,111,119>>]},<<32,105,115,32,101,118,97,108,117,97,116,101,100,44,32,111,114,32,105,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,50,52,53>>,signature => [{attribute,1729,spec,{{put,2},[{type,1729,bounded_fun,[{type,1729,'fun',[{type,1729,product,[{var,1729,'Key'},{var,1729,'Val'}]},{type,1729,term,[]}]},[{type,1730,constraint,[{atom,1730,is_subtype},[{var,1730,'Key'},{type,1730,term,[]}]]},{type,1731,constraint,[{atom,1731,is_subtype},[{var,1731,'Val'},{type,1731,term,[]}]]}]]}]}}]}},{{function,raise,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1736}],[<<114,97,105,115,101,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<114,97,105,115,101,95,115,116,97,99,107,116,114,97,99,101>>}],[]}]},{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,99,108,97,115,115,44,32,114,101,97,115,111,110,44,32,97,110,100,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,116,114,97,99,101,32,40>>,{em,[],[<<115,116,97,99,107,116,114,97,99,101>>]},<<41,46>>]},{p,[],[{code,[],[<<67,108,97,115,115>>]},<<32,105,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<44,32>>,{code,[],[<<101,120,105,116>>]},<<44,32,111,114,32>>,{code,[],[<<116,104,114,111,119>>]},<<46,32,83,111,44,32,105,102,32,105,116,32,119,101,114,101,32,110,111,116,32,102,111,114,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,44,32>>,{code,[],[<<101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,67,108,97,115,115,40,82,101,97,115,111,110,41>>]},<<32,40,103,105,118,101,110,32,116,104,97,116,32>>,{code,[],[<<67,108,97,115,115>>]},<<32,105,115,32,97,32,118,97,108,105,100,32,99,108,97,115,115,41,46>>]},{p,[],[{code,[],[<<82,101,97,115,111,110>>]},<<32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46>>]},{p,[],[{code,[],[<<83,116,97,99,107,116,114,97,99,101>>]},<<32,105,115,32,97,32,108,105,115,116,32,97,115,32,112,114,111,118,105,100,101,100,32,105,110,32,97,32,116,114,121,45,99,97,116,99,104,32,99,108,97,117,115,101,46>>]},{pre,[],[{code,[],[<<116,114,121,10,32,32,32,32,46,46,46,10,99,97,116,99,104,32,67,108,97,115,115,58,82,101,97,115,111,110,58,83,116,97,99,107,116,114,97,99,101,32,45,62,10,32,32,32,32,46,46,46,10,101,110,100>>]}]},{p,[],[<<84,104,97,116,32,105,115,44,32,97,32,108,105,115,116,32,111,102,32,102,111,117,114,45,116,117,112,108,101,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,32,124,32,65,114,103,115,44,32,76,111,99,97,116,105,111,110,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,97,110,100,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,97,114,101,32,97,116,111,109,115,44,32,97,110,100,32,116,104,101,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,97,114,105,116,121,32,111,114,32,97,110,32,97,114,103,117,109,101,110,116,32,108,105,115,116,46,32,84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,99,97,110,32,97,108,115,111,32,99,111,110,116,97,105,110,32>>,{code,[],[<<123,70,117,110,44,32,65,114,103,115,44,32,76,111,99,97,116,105,111,110,125>>]},<<32,116,117,112,108,101,115,44,32,119,104,101,114,101,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,32,97,110,100,32>>,{code,[],[<<65,114,103,115>>]},<<32,105,115,32,97,110,32,97,114,103,117,109,101,110,116,32,108,105,115,116,46>>]},{p,[],[<<69,108,101,109,101,110,116,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,97,116,32,116,104,101,32,101,110,100,32,105,115,32,111,112,116,105,111,110,97,108,46,32,79,109,105,116,116,105,110,103,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,46>>]},{p,[],[<<84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,115,116,97,99,107,116,114,97,99,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,59,32,105,116,32,105,115,32,116,114,117,110,99,97,116,101,100,32,116,111,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,120,105,109,117,109,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,46>>]},{p,[],[<<65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,111,32,116,101,114,109,105,110,97,116,101,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,32,117,110,108,101,115,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,105,110,118,97,108,105,100,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{em,[],[<<114,101,116,117,114,110,115,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110>>]},<<32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,114,101,116,117,114,110,44,32,121,111,117,32,99,97,110,32,99,97,108,108,32>>,{code,[],[<<101,114,114,111,114,40,101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41,41>>]},<<32,97,110,100,32,104,111,112,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,101,120,99,101,112,116,105,111,110,115,32,108,97,116,101,114,46>>]},{p,[],[<<83,101,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,110,117,97,108,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,101,115,32,97,110,100,32,104,111,119,32,116,111,32,99,97,116,99,104,32,101,120,99,101,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,50,55,49>>,signature => [{attribute,1736,spec,{{erlang,raise,3},[{type,1736,bounded_fun,[{type,1736,'fun',[{type,1736,product,[{var,1736,'Class'},{var,1736,'Reason'},{var,1736,'Stacktrace'}]},{atom,1736,badarg}]},[{type,1737,constraint,[{atom,1737,is_subtype},[{var,1737,'Class'},{type,1737,union,[{atom,1737,error},{atom,1737,exit},{atom,1737,throw}]}]]},{type,1738,constraint,[{atom,1738,is_subtype},[{var,1738,'Reason'},{type,1738,term,[]}]]},{type,1739,constraint,[{atom,1739,is_subtype},[{var,1739,'Stacktrace'},{user_type,1739,raise_stacktrace,[]}]]}]]}]}}]}},{{function,read_timer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1744}],[<<114,101,97,100,95,116,105,109,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,97,100,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,50,49>>,signature => [{attribute,1744,spec,{{erlang,read_timer,1},[{type,1744,bounded_fun,[{type,1744,'fun',[{type,1744,product,[{var,1744,'TimerRef'}]},{var,1744,'Result'}]},[{type,1745,constraint,[{atom,1745,is_subtype},[{var,1745,'TimerRef'},{type,1745,reference,[]}]]},{type,1746,constraint,[{atom,1746,is_subtype},[{var,1746,'Time'},{type,1746,non_neg_integer,[]}]]},{type,1747,constraint,[{atom,1747,is_subtype},[{var,1747,'Result'},{type,1747,union,[{var,1747,'Time'},{atom,1747,false}]}]]}]]}]}}]}},{{function,read_timer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1753}],[<<114,101,97,100,95,116,105,109,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,101,105,116,104,101,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114>>]}]},<<46,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,119,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110,115>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,65,115,121,110,99,125>>]}]},{dd,[],[{p,[],[<<65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,115,116,97,116,101,32,105,110,102,111,114,109,97,116,105,111,110,46,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114>>]},<<46,32,87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114>>]},<<32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,115,116,97,116,101,32,105,110,102,111,114,109,97,116,105,111,110,32,116,111,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<46,32,65,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,114,101,97,100,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114>>]},<<32,119,104,101,110,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46>>]}]}]},{p,[],[<<77,111,114,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,32,84,104,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,111,114,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,110,101,118,101,114,32,104,97,115,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,115,32,101,120,112,105,114,101,100,44,32,105,116,32,100,111,101,115,32,110,111,116,32,116,101,108,108,32,121,111,117,32,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,97,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,32,111,116,104,101,114,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,116,114,117,101,125>>]},<<46,32,73,102,32,117,115,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,102,97,108,115,101,125>>]},<<44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,51,49>>,signature => [{attribute,1753,spec,{{erlang,read_timer,2},[{type,1753,bounded_fun,[{type,1753,'fun',[{type,1753,product,[{var,1753,'TimerRef'},{var,1753,'Options'}]},{type,1753,union,[{var,1753,'Result'},{atom,1753,ok}]}]},[{type,1754,constraint,[{atom,1754,is_subtype},[{var,1754,'TimerRef'},{type,1754,reference,[]}]]},{type,1755,constraint,[{atom,1755,is_subtype},[{var,1755,'Async'},{type,1755,boolean,[]}]]},{type,1756,constraint,[{atom,1756,is_subtype},[{var,1756,'Option'},{type,1756,tuple,[{atom,1756,async},{var,1756,'Async'}]}]]},{type,1757,constraint,[{atom,1757,is_subtype},[{var,1757,'Options'},{type,1757,list,[{var,1757,'Option'}]}]]},{type,1758,constraint,[{atom,1758,is_subtype},[{var,1758,'Time'},{type,1758,non_neg_integer,[]}]]},{type,1759,constraint,[{atom,1759,is_subtype},[{var,1759,'Result'},{type,1759,union,[{var,1759,'Time'},{atom,1759,false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,ref_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1765}],[<<114,101,102,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<82,101,102>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,56,55>>,signature => [{attribute,1765,spec,{{ref_to_list,1},[{type,1765,bounded_fun,[{type,1765,'fun',[{type,1765,product,[{var,1765,'Ref'}]},{type,1765,string,[]}]},[{type,1766,constraint,[{atom,1766,is_subtype},[{var,1766,'Ref'},{type,1766,reference,[]}]]}]]}]}}]}},{{function,register,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1771}],[<<114,101,103,105,115,116,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<65,115,115,111,99,105,97,116,101,115,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,119,105,116,104,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,46,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<44,32,119,104,105,99,104,32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,44,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,112,105,100,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,105,110,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32,40>>,{code,[],[<<82,101,103,78,97,109,101,32,33,32,77,101,115,115,97,103,101>>]},<<41,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,114,101,103,105,115,116,101,114,40,100,98,44,32,80,105,100,41,46,10,116,114,117,101>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,105,115,32,97,108,114,101,97,100,121,32,105,110,32,117,115,101,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,115,32,97,108,114,101,97,100,121,32,114,101,103,105,115,116,101,114,101,100,32,40,97,108,114,101,97,100,121,32,104,97,115,32,97,32,110,97,109,101,41,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,52,48,48>>,signature => [{attribute,1771,spec,{{register,2},[{type,1771,bounded_fun,[{type,1771,'fun',[{type,1771,product,[{var,1771,'RegName'},{var,1771,'PidOrPort'}]},{atom,1771,true}]},[{type,1772,constraint,[{atom,1772,is_subtype},[{var,1772,'RegName'},{type,1772,atom,[]}]]},{type,1773,constraint,[{atom,1773,is_subtype},[{var,1773,'PidOrPort'},{type,1773,union,[{type,1773,port,[]},{type,1773,pid,[]}]}]]}]]}]}}]}},{{function,registered,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1778}],[<<114,101,103,105,115,116,101,114,101,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,97,109,101,115,32,116,104,97,116,32,104,97,118,101,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,103,105,115,116,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,103,105,115,116,101,114,47,50>>]}]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,114,101,103,105,115,116,101,114,101,100,40,41,46,10,91,99,111,100,101,95,115,101,114,118,101,114,44,32,102,105,108,101,95,115,101,114,118,101,114,44,32,105,110,105,116,44,32,117,115,101,114,44,32,109,121,95,100,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,52,50,57>>,signature => [{attribute,1778,spec,{{registered,0},[{type,1778,bounded_fun,[{type,1778,'fun',[{type,1778,product,[]},{type,1778,list,[{var,1778,'RegName'}]}]},[{type,1779,constraint,[{atom,1779,is_subtype},[{var,1779,'RegName'},{type,1779,atom,[]}]]}]]}]}}]}},{{function,resume_process,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1784}],[<<114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49>>],#{<<101,110>> => [{p,[],[<<68,101,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,116,104,114,111,117,103,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>]}]},<<32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]},<<46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,114,101,97,99,104,101,115,32,122,101,114,111,44,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,114,101,115,117,109,101,100,44,32,116,104,97,116,32,105,115,44,32,105,116,115,32,115,116,97,116,101,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32,115,117,115,112,101,110,100,101,100,32,105,110,116,111,32,116,104,101,32,115,116,97,116,101,32,105,116,32,104,97,100,32,98,101,102,111,114,101,32,105,116,32,119,97,115,32,115,117,115,112,101,110,100,101,100,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49>>]},<<32,104,97,100,32,110,111,116,32,112,114,101,118,105,111,117,115,108,121,32,105,110,99,114,101,97,115,101,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,52,52,50>>,signature => [{attribute,1784,spec,{{erlang,resume_process,1},[{type,1784,bounded_fun,[{type,1784,'fun',[{type,1784,product,[{var,1784,'Suspendee'}]},{atom,1784,true}]},[{type,1785,constraint,[{atom,1785,is_subtype},[{var,1785,'Suspendee'},{type,1785,pid,[]}]]}]]}]}}]}},{{function,round,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1791}],[<<114,111,117,110,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,98,121,32,114,111,117,110,100,105,110,103,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,111,117,110,100,40,52,50,46,49,41,46,10,52,50>>]}]},{pre,[],[{code,[],[<<114,111,117,110,100,40,53,46,53,41,46,10,54>>]}]},{pre,[],[{code,[],[<<114,111,117,110,100,40,45,53,46,53,41,46,10,45,54>>]}]},{pre,[],[{code,[],[<<114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]}]},{p,[],[<<73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41>>]},<<32,101,118,97,108,117,97,116,101,115,32,116,111,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]},<<46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48>>]},<<32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,32,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,32,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,52,56,51>>,signature => [{attribute,1791,spec,{{round,1},[{type,1791,bounded_fun,[{type,1791,'fun',[{type,1791,product,[{var,1791,'Number'}]},{type,1791,integer,[]}]},[{type,1792,constraint,[{atom,1792,is_subtype},[{var,1792,'Number'},{type,1792,number,[]}]]}]]}]}}]}},{{function,self,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1798}],[<<115,101,108,102,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,101,108,102,40,41,46,10,60,48,46,50,54,46,48,62>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,53,49,52>>,signature => [{attribute,1798,spec,{{self,0},[{type,1798,'fun',[{type,1798,product,[]},{type,1798,pid,[]}]}]}}]}},{{function,send,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2493}],[<<115,101,110,100,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<83,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<77,115,103>>]},<<46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,117,115,105,110,103,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,115,101,110,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,101,110,100,32,111,112,101,114,97,116,111,114>>]},<<58,32>>,{code,[],[<<68,101,115,116,32,33,32,77,115,103>>]},<<46>>]},{p,[],[{code,[],[<<68,101,115,116>>]},<<32,99,97,110,32,98,101,32,97,32,114,101,109,111,116,101,32,111,114,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,32,40,108,111,99,97,108,41,32,112,111,114,116,44,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,111,114,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,82,101,103,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,97,116,32,97,110,111,116,104,101,114,32,110,111,100,101,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,114,117,110,45,116,105,109,101,32,101,114,114,111,114,32,105,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,110,32,97,116,111,109,32,110,97,109,101,44,32,98,117,116,32,116,104,105,115,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,111,110,108,121,32,99,97,115,101,32,119,104,101,110,32>>,{code,[],[<<115,101,110,100>>]},<<32,102,97,105,108,115,32,102,111,114,32,97,110,32,117,110,114,101,97,99,104,97,98,108,101,32,100,101,115,116,105,110,97,116,105,111,110,32>>,{code,[],[<<68,101,115,116>>]},<<32,40,111,102,32,99,111,114,114,101,99,116,32,116,121,112,101,41,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,53,50,55>>,signature => [{attribute,2493,spec,{{erlang,send,2},[{type,2493,bounded_fun,[{type,2493,'fun',[{type,2493,product,[{var,2493,'Dest'},{var,2493,'Msg'}]},{var,2493,'Msg'}]},[{type,2494,constraint,[{atom,2494,is_subtype},[{var,2494,'Dest'},{user_type,2494,dst,[]}]]},{type,2495,constraint,[{atom,2495,is_subtype},[{var,2495,'Msg'},{type,2495,term,[]}]]}]]}]}}]}},{{function,send,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2499}],[<<115,101,110,100,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<69,105,116,104,101,114,32,115,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<44,32,111,114,32,100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101,32,98,117,116,32,114,101,116,117,114,110,115,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,40,115,101,101,32,98,101,108,111,119,41,46,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,47,50>>]}]},<<46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,101,120,112,108,97,110,97,116,105,111,110,32,97,110,100,32,119,97,114,110,105,110,103,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51>>]}]},<<46>>]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<110,111,115,117,115,112,101,110,100>>]}]},{dd,[],[<<73,102,32,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,32,116,111,32,100,111,32,116,104,101,32,115,101,110,100,44,32>>,{code,[],[<<110,111,115,117,115,112,101,110,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]},{dt,[],[{code,[],[<<110,111,99,111,110,110,101,99,116>>]}]},{dd,[],[<<73,102,32,116,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,110,111,100,101,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,97,117,116,111,45,99,111,110,110,101,99,116,101,100,32,116,111,32,100,111,32,116,104,101,32,115,101,110,100,44,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<65,115,32,119,105,116,104,32>>,{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51>>]},<<58,32,117,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,53,52,55>>,signature => [{attribute,2499,spec,{{erlang,send,3},[{type,2499,bounded_fun,[{type,2499,'fun',[{type,2499,product,[{var,2499,'Dest'},{var,2499,'Msg'},{var,2499,'Options'}]},{var,2499,'Res'}]},[{type,2500,constraint,[{atom,2500,is_subtype},[{var,2500,'Dest'},{user_type,2500,dst,[]}]]},{type,2501,constraint,[{atom,2501,is_subtype},[{var,2501,'Msg'},{type,2501,term,[]}]]},{type,2502,constraint,[{atom,2502,is_subtype},[{var,2502,'Options'},{type,2502,list,[{type,2502,union,[{atom,2502,nosuspend},{atom,2502,noconnect}]}]}]]},{type,2503,constraint,[{atom,2503,is_subtype},[{var,2503,'Res'},{type,2503,union,[{atom,2503,ok},{atom,2503,nosuspend},{atom,2503,noconnect}]}]]}]]}]}}]}},{{function,send_after,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1803}],[<<115,101,110,100,95,97,102,116,101,114,47,51>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,53,55,57>>,signature => [{attribute,1803,spec,{{erlang,send_after,3},[{type,1803,bounded_fun,[{type,1803,'fun',[{type,1803,product,[{var,1803,'Time'},{var,1803,'Dest'},{var,1803,'Msg'}]},{var,1803,'TimerRef'}]},[{type,1804,constraint,[{atom,1804,is_subtype},[{var,1804,'Time'},{type,1804,non_neg_integer,[]}]]},{type,1805,constraint,[{atom,1805,is_subtype},[{var,1805,'Dest'},{type,1805,union,[{type,1805,pid,[]},{type,1805,atom,[]}]}]]},{type,1806,constraint,[{atom,1806,is_subtype},[{var,1806,'Msg'},{type,1806,term,[]}]]},{type,1807,constraint,[{atom,1807,is_subtype},[{var,1807,'TimerRef'},{type,1807,reference,[]}]]}]]}]}}]}},{{function,send_after,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1813}],[<<115,101,110,100,95,97,102,116,101,114,47,52>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,101,115,116>>]},<<46,32,65,112,97,114,116,32,102,114,111,109,32,116,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,111,114,107,115,32,101,120,97,99,116,108,121,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,53,57,48>>,signature => [{attribute,1813,spec,{{erlang,send_after,4},[{type,1813,bounded_fun,[{type,1813,'fun',[{type,1813,product,[{var,1813,'Time'},{var,1813,'Dest'},{var,1813,'Msg'},{var,1813,'Options'}]},{var,1813,'TimerRef'}]},[{type,1814,constraint,[{atom,1814,is_subtype},[{var,1814,'Time'},{type,1814,integer,[]}]]},{type,1815,constraint,[{atom,1815,is_subtype},[{var,1815,'Dest'},{type,1815,union,[{type,1815,pid,[]},{type,1815,atom,[]}]}]]},{type,1816,constraint,[{atom,1816,is_subtype},[{var,1816,'Msg'},{type,1816,term,[]}]]},{type,1817,constraint,[{atom,1817,is_subtype},[{var,1817,'Options'},{type,1817,list,[{var,1817,'Option'}]}]]},{type,1818,constraint,[{atom,1818,is_subtype},[{var,1818,'Abs'},{type,1818,boolean,[]}]]},{type,1819,constraint,[{atom,1819,is_subtype},[{var,1819,'Option'},{type,1819,tuple,[{atom,1819,abs},{var,1819,'Abs'}]}]]},{type,1820,constraint,[{atom,1820,is_subtype},[{var,1820,'TimerRef'},{type,1820,reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,send_nosuspend,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3458}],[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,93,41>>]}]},<<44,32,98,117,116,32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,115,101,110,116,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,110,111,116,32,115,101,110,116,32,98,101,99,97,117,115,101,32,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,104,97,100,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,97,110,32,117,110,114,101,108,105,97,98,108,101,32,114,101,109,111,116,101,32,110,111,100,101,32,119,105,116,104,111,117,116,32,101,118,101,114,32,98,108,111,99,107,105,110,103,32,116,104,101,32,115,101,110,100,105,110,103,32,40,69,114,108,97,110,103,41,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,40,117,115,117,97,108,108,121,32,110,111,116,32,97,32,114,101,97,108,32,69,114,108,97,110,103,32,110,111,100,101,44,32,98,117,116,32,97,32,110,111,100,101,32,119,114,105,116,116,101,110,32,105,110,32,67,32,111,114,32,74,97,118,97,41,32,105,115,32,111,118,101,114,108,111,97,100,101,100,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32>>,{em,[],[<<100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<84,104,101,32,115,97,109,101,32,111,99,99,117,114,115,32,105,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,108,111,99,97,108,32,112,111,114,116,32,116,104,97,116,32,105,115,32,98,117,115,121,46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,32,100,101,115,116,105,110,97,116,105,111,110,115,32,40,97,108,108,111,119,101,100,32,102,111,114,32,116,104,101,32,111,114,100,105,110,97,114,121,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32>>,{code,[],[<<39,33,39>>]},<<41,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,115,101,110,100,115,32,116,104,101,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,32,119,104,101,114,101,32,97,32,112,114,111,99,101,115,115,32,99,111,109,109,117,110,105,99,97,116,101,115,32,119,105,116,104,32,69,114,108,97,110,103,32,110,111,100,101,115,32,116,104,97,116,32,99,97,110,32,100,105,115,97,112,112,101,97,114,32,119,105,116,104,111,117,116,32,97,110,121,32,116,114,97,99,101,44,32,99,97,117,115,105,110,103,32,116,104,101,32,84,67,80,32,98,117,102,102,101,114,115,32,97,110,100,32,116,104,101,32,100,114,105,118,101,114,115,32,113,117,101,117,101,32,116,111,32,98,101,32,111,118,101,114,45,102,117,108,108,32,98,101,102,111,114,101,32,116,104,101,32,110,111,100,101,32,105,115,32,115,104,117,116,32,100,111,119,110,32,40,98,101,99,97,117,115,101,32,111,102,32,116,105,99,107,32,116,105,109,101,45,111,117,116,115,41,32,98,121,32>>,{code,[],[<<110,101,116,95,107,101,114,110,101,108>>]},<<46,32,84,104,101,32,110,111,114,109,97,108,32,114,101,97,99,116,105,111,110,32,116,111,32,116,97,107,101,32,119,104,101,110,32,116,104,105,115,32,111,99,99,117,114,115,32,105,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,112,114,101,109,97,116,117,114,101,32,115,104,117,116,100,111,119,110,32,111,102,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,105,103,110,111,114,105,110,103,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,111,117,108,100,32,114,101,115,117,108,116,32,105,110,32,97,110,32>>,{em,[],[<<117,110,114,101,108,105,97,98,108,101>>]},<<32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,44,32,119,104,105,99,104,32,105,115,32,99,111,110,116,114,97,100,105,99,116,111,114,121,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,32,109,111,100,101,108,46,32,84,104,101,32,109,101,115,115,97,103,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,115,101,110,116,32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<73,110,32,109,97,110,121,32,115,121,115,116,101,109,115,44,32,116,114,97,110,115,105,101,110,116,32,115,116,97,116,101,115,32,111,102,32,111,118,101,114,108,111,97,100,101,100,32,113,117,101,117,101,115,32,97,114,101,32,110,111,114,109,97,108,46,32,65,108,116,104,111,117,103,104,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,100,111,101,115,32,110,111,116,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,110,111,110,45,114,101,115,112,111,110,115,105,118,101,44,32,105,116,32,99,111,117,108,100,32,98,101,32,97,32,116,101,109,112,111,114,97,114,121,32,111,118,101,114,108,111,97,100,46,32,65,108,115,111,44,32,97,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32>>,{code,[],[<<116,114,117,101>>]},<<32,100,111,101,115,32,111,110,108,121,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,109,101,115,115,97,103,101,32,99,97,110,32,98,101,32,115,101,110,116,32,111,110,32,116,104,101,32,40,84,67,80,41,32,99,104,97,110,110,101,108,32,119,105,116,104,111,117,116,32,98,108,111,99,107,105,110,103,59,32,116,104,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,97,114,114,105,118,101,32,97,116,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,46,32,70,111,114,32,97,32,100,105,115,99,111,110,110,101,99,116,101,100,32,110,111,110,45,114,101,115,112,111,110,115,105,118,101,32,110,111,100,101,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,40,109,105,109,105,99,115,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,111,112,101,114,97,116,111,114,32>>,{code,[],[<<33>>]},<<41,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,98,101,104,97,118,105,111,114,32,97,110,100,32,116,104,101,32,97,99,116,105,111,110,115,32,116,111,32,116,97,107,101,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,97,114,101,32,97,112,112,108,105,99,97,116,105,111,110,45,32,97,110,100,32,104,97,114,100,119,97,114,101,45,115,112,101,99,105,102,105,99,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,54,48,51>>,signature => [{attribute,3458,spec,{{erlang,send_nosuspend,2},[{type,3458,bounded_fun,[{type,3458,'fun',[{type,3458,product,[{var,3458,'Dest'},{var,3458,'Msg'}]},{type,3458,boolean,[]}]},[{type,3459,constraint,[{atom,3459,is_subtype},[{var,3459,'Dest'},{user_type,3459,dst,[]}]]},{type,3460,constraint,[{atom,3460,is_subtype},[{var,3460,'Msg'},{type,3460,term,[]}]]}]]}]}}]}},{{function,send_nosuspend,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3468}],[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,32,124,32,79,112,116,105,111,110,115,93,41>>]}]},<<44,32,98,117,116,32,119,105,116,104,32,97,32,66,111,111,108,101,97,110,32,114,101,116,117,114,110,32,118,97,108,117,101,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>]}]},<<44,32,98,117,116,32,116,97,107,101,115,32,97,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,44,32,97,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46,32,84,104,101,32,111,110,108,121,32,111,112,116,105,111,110,32,105,115,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<44,32,119,104,105,99,104,32,109,97,107,101,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,117,114,114,101,110,116,108,121,32,114,101,97,99,104,97,98,108,101,32,98,121,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,32,105,115,32,116,111,32,116,114,121,32,116,111,32,99,111,110,110,101,99,116,32,116,111,32,116,104,101,32,110,111,100,101,44,32,119,104,105,99,104,32,99,97,110,32,115,116,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,97,32,115,104,111,114,116,32,112,101,114,105,111,100,46,32,84,104,101,32,117,115,101,32,111,102,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,103,101,116,32,116,104,101,32,115,108,105,103,104,116,101,115,116,32,100,101,108,97,121,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,111,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,101,115,112,101,99,105,97,108,108,121,32,117,115,101,102,117,108,32,119,104,101,110,32,99,111,109,109,117,110,105,99,97,116,105,110,103,32,119,105,116,104,32,110,111,100,101,115,32,116,104,97,116,32,101,120,112,101,99,116,32,116,111,32,97,108,119,97,121,115,32,98,101,32,116,104,101,32,99,111,110,110,101,99,116,105,110,103,32,112,97,114,116,32,40,116,104,97,116,32,105,115,44,32,110,111,100,101,115,32,119,114,105,116,116,101,110,32,105,110,32,67,32,111,114,32,74,97,118,97,41,46>>]},{p,[],[<<87,104,101,110,101,118,101,114,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,40,101,105,116,104,101,114,32,119,104,101,110,32,97,32,115,117,115,112,101,110,100,32,119,111,117,108,100,32,111,99,99,117,114,32,111,114,32,119,104,101,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,116,104,101,32,110,111,100,101,32,119,97,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,110,110,101,99,116,101,100,41,44,32,116,104,101,32,109,101,115,115,97,103,101,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32>>,{em,[],[<<110,111,116>>]},<<32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,101,110,116,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,54,53,51>>,signature => [{attribute,3468,spec,{{erlang,send_nosuspend,3},[{type,3468,bounded_fun,[{type,3468,'fun',[{type,3468,product,[{var,3468,'Dest'},{var,3468,'Msg'},{var,3468,'Options'}]},{type,3468,boolean,[]}]},[{type,3469,constraint,[{atom,3469,is_subtype},[{var,3469,'Dest'},{user_type,3469,dst,[]}]]},{type,3470,constraint,[{atom,3470,is_subtype},[{var,3470,'Msg'},{type,3470,term,[]}]]},{type,3471,constraint,[{atom,3471,is_subtype},[{var,3471,'Options'},{type,3471,list,[{atom,3471,noconnect}]}]]}]]}]}}]}},{{function,set_cookie,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3783}],[<<115,101,116,95,99,111,111,107,105,101,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,116,111,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<67,111,111,107,105,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,97,108,115,111,32,115,101,116,115,32,116,104,101,32,99,111,111,107,105,101,32,111,102,32,97,108,108,32,111,116,104,101,114,32,117,110,107,110,111,119,110,32,110,111,100,101,115,32,116,111,32>>,{code,[],[<<67,111,111,107,105,101>>]},<<32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,105,115,116,114,105,98,117,116,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<68,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,41,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<102,117,110,99,116,105,111,110,95,99,108,97,117,115,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,54,56,54>>,signature => [{attribute,3783,spec,{{erlang,set_cookie,2},[{type,3783,bounded_fun,[{type,3783,'fun',[{type,3783,product,[{var,3783,'Node'},{var,3783,'Cookie'}]},{atom,3783,true}]},[{type,3784,constraint,[{atom,3784,is_subtype},[{var,3784,'Node'},{type,3784,node,[]}]]},{type,3785,constraint,[{atom,3785,is_subtype},[{var,3785,'Cookie'},{type,3785,atom,[]}]]}]]}]}}]}},{{function,setelement,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2520}],[<<115,101,116,101,108,101,109,101,110,116,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,116,104,97,116,32,105,115,32,97,32,99,111,112,121,32,111,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<32,119,105,116,104,32,116,104,101,32,101,108,101,109,101,110,116,32,115,112,101,99,105,102,105,101,100,32,98,121,32,105,110,116,101,103,101,114,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,40,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,101,108,101,109,101,110,116,32,119,105,116,104,32,105,110,100,101,120,32,49,41,32,114,101,112,108,97,99,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<86,97,108,117,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,101,116,101,108,101,109,101,110,116,40,50,44,32,123,49,48,44,32,103,114,101,101,110,44,32,98,111,116,116,108,101,115,125,44,32,114,101,100,41,46,10,123,49,48,44,114,101,100,44,98,111,116,116,108,101,115,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,48,51>>,signature => [{attribute,2520,spec,{{setelement,3},[{type,2520,bounded_fun,[{type,2520,'fun',[{type,2520,product,[{var,2520,'Index'},{var,2520,'Tuple1'},{var,2520,'Value'}]},{var,2520,'Tuple2'}]},[{type,2521,constraint,[{atom,2521,is_subtype},[{var,2521,'Index'},{type,2521,pos_integer,[]}]]},{type,2522,constraint,[{atom,2522,is_subtype},[{var,2522,'Tuple1'},{type,2522,tuple,any}]]},{type,2523,constraint,[{atom,2523,is_subtype},[{var,2523,'Tuple2'},{type,2523,tuple,any}]]},{type,2524,constraint,[{atom,2524,is_subtype},[{var,2524,'Value'},{type,2524,term,[]}]]}]]}]}}]}},{{function,size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1874}],[<<115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,97,32,116,117,112,108,101,32,111,114,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,110,32,97,32,98,105,110,97,114,121,32,111,114,32,98,105,116,115,116,114,105,110,103,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51,10,62,32,115,105,122,101,40,60,60,49,49,44,32,50,50,44,32,51,51,62,62,41,46,10,51>>]}]},{p,[],[<<70,111,114,32,98,105,116,115,116,114,105,110,103,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32,98,121,116,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,116,104,101,32,98,105,116,115,116,114,105,110,103,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,32,114,111,117,110,100,101,100,32>>,{em,[],[<<100,111,119,110>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,117,112,108,101,95,115,105,122,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,117,112,108,101,95,115,105,122,101,47,49>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,121,116,101,95,115,105,122,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,121,116,101,95,115,105,122,101,47,49>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,116,95,115,105,122,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,116,95,115,105,122,101,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,50,48>>,signature => [{attribute,1874,spec,{{size,1},[{type,1874,bounded_fun,[{type,1874,'fun',[{type,1874,product,[{var,1874,'Item'}]},{type,1874,non_neg_integer,[]}]},[{type,1875,constraint,[{atom,1875,is_subtype},[{var,1875,'Item'},{type,1875,union,[{type,1875,tuple,any},{type,1875,binary,[]}]}]]}]]}]}}]}},{{function,spawn,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2904}],[<<115,112,97,119,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,52,51>>,signature => [{attribute,2904,spec,{{spawn,1},[{type,2904,bounded_fun,[{type,2904,'fun',[{type,2904,product,[{var,2904,'Fun'}]},{type,2904,pid,[]}]},[{type,2905,constraint,[{atom,2905,is_subtype},[{var,2905,'Fun'},{type,2905,function,[]}]]}]]}]}}]}},{{function,spawn,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2913}],[<<115,112,97,119,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,53,52>>,signature => [{attribute,2913,spec,{{spawn,2},[{type,2913,bounded_fun,[{type,2913,'fun',[{type,2913,product,[{var,2913,'Node'},{var,2913,'Fun'}]},{type,2913,pid,[]}]},[{type,2914,constraint,[{atom,2914,is_subtype},[{var,2914,'Node'},{type,2914,node,[]}]]},{type,2915,constraint,[{atom,2915,is_subtype},[{var,2915,'Fun'},{type,2915,function,[]}]]}]]}]}}]}},{{function,spawn,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1880}],[<<115,112,97,119,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46>>]},{p,[],[{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>]},<<32,105,115,32,101,118,97,108,117,97,116,101,100,32,98,121,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,105,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,40,119,104,101,114,101,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32>>,{code,[],[<<65,114,103,115>>]},<<41,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<41,46,32,73,102,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,97,110,100,32,105,116,115,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<117,110,100,101,102>>]},<<32,111,99,99,117,114,115,46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,112,97,119,110,40,115,112,101,101,100,44,32,114,101,103,117,108,97,116,111,114,44,32,91,104,105,103,104,95,115,112,101,101,100,44,32,116,104,105,110,95,99,117,116,93,41,46,10,60,48,46,49,51,46,49,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,54,56>>,signature => [{attribute,1880,spec,{{spawn,3},[{type,1880,bounded_fun,[{type,1880,'fun',[{type,1880,product,[{var,1880,'Module'},{var,1880,'Function'},{var,1880,'Args'}]},{type,1880,pid,[]}]},[{type,1881,constraint,[{atom,1881,is_subtype},[{var,1881,'Module'},{type,1881,module,[]}]]},{type,1882,constraint,[{atom,1882,is_subtype},[{var,1882,'Function'},{type,1882,atom,[]}]]},{type,1883,constraint,[{atom,1883,is_subtype},[{var,1883,'Args'},{type,1883,list,[{type,1883,term,[]}]}]]}]]}]}}]}},{{function,spawn,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3042}],[<<115,112,97,119,110,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,57,51>>,signature => [{attribute,3042,spec,{{spawn,4},[{type,3042,bounded_fun,[{type,3042,'fun',[{type,3042,product,[{var,3042,'Node'},{var,3042,'Module'},{var,3042,'Function'},{var,3042,'Args'}]},{type,3042,pid,[]}]},[{type,3043,constraint,[{atom,3043,is_subtype},[{var,3043,'Node'},{type,3043,node,[]}]]},{type,3044,constraint,[{atom,3044,is_subtype},[{var,3044,'Module'},{type,3044,module,[]}]]},{type,3045,constraint,[{atom,3045,is_subtype},[{var,3045,'Function'},{type,3045,atom,[]}]]},{type,3046,constraint,[{atom,3046,is_subtype},[{var,3046,'Args'},{type,3046,list,[{type,3046,term,[]}]}]]}]]}]}}]}},{{function,spawn_link,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2925}],[<<115,112,97,119,110,95,108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,48,56>>,signature => [{attribute,2925,spec,{{spawn_link,1},[{type,2925,bounded_fun,[{type,2925,'fun',[{type,2925,product,[{var,2925,'Fun'}]},{type,2925,pid,[]}]},[{type,2926,constraint,[{atom,2926,is_subtype},[{var,2926,'Fun'},{type,2926,function,[]}]]}]]}]}}]}},{{function,spawn_link,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2934}],[<<115,112,97,119,110,95,108,105,110,107,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,50,50>>,signature => [{attribute,2934,spec,{{spawn_link,2},[{type,2934,bounded_fun,[{type,2934,'fun',[{type,2934,product,[{var,2934,'Node'},{var,2934,'Fun'}]},{type,2934,pid,[]}]},[{type,2935,constraint,[{atom,2935,is_subtype},[{var,2935,'Node'},{type,2935,node,[]}]]},{type,2936,constraint,[{atom,2936,is_subtype},[{var,2936,'Fun'},{type,2936,function,[]}]]}]]}]}}]}},{{function,spawn_link,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1888}],[<<115,112,97,119,110,95,108,105,110,107,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,51,57>>,signature => [{attribute,1888,spec,{{spawn_link,3},[{type,1888,bounded_fun,[{type,1888,'fun',[{type,1888,product,[{var,1888,'Module'},{var,1888,'Function'},{var,1888,'Args'}]},{type,1888,pid,[]}]},[{type,1889,constraint,[{atom,1889,is_subtype},[{var,1889,'Module'},{type,1889,module,[]}]]},{type,1890,constraint,[{atom,1890,is_subtype},[{var,1890,'Function'},{type,1890,atom,[]}]]},{type,1891,constraint,[{atom,1891,is_subtype},[{var,1891,'Args'},{type,1891,list,[{type,1891,term,[]}]}]]}]]}]}}]}},{{function,spawn_link,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3064}],[<<115,112,97,119,110,95,108,105,110,107,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,53,51>>,signature => [{attribute,3064,spec,{{spawn_link,4},[{type,3064,bounded_fun,[{type,3064,'fun',[{type,3064,product,[{var,3064,'Node'},{var,3064,'Module'},{var,3064,'Function'},{var,3064,'Args'}]},{type,3064,pid,[]}]},[{type,3065,constraint,[{atom,3065,is_subtype},[{var,3065,'Node'},{type,3065,node,[]}]]},{type,3066,constraint,[{atom,3066,is_subtype},[{var,3066,'Module'},{type,3066,module,[]}]]},{type,3067,constraint,[{atom,3067,is_subtype},[{var,3067,'Function'},{type,3067,atom,[]}]]},{type,3068,constraint,[{atom,3068,is_subtype},[{var,3068,'Args'},{type,3068,list,[{type,3068,term,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2948}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,32,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,55,49>>,signature => [{attribute,2948,spec,{{spawn_monitor,1},[{type,2948,bounded_fun,[{type,2948,'fun',[{type,2948,product,[{var,2948,'Fun'}]},{type,2948,tuple,[{type,2948,pid,[]},{type,2948,reference,[]}]}]},[{type,2949,constraint,[{atom,2949,is_subtype},[{var,2949,'Fun'},{type,2949,function,[]}]]}]]}]}}]}},{{function,spawn_monitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2955}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,32,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32>>,{code,[],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,41>>]},<<44,32,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,101,120,99,101,112,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,56,53>>,signature => [{attribute,2955,spec,{{spawn_monitor,2},[{type,2955,bounded_fun,[{type,2955,'fun',[{type,2955,product,[{var,2955,'Node'},{var,2955,'Fun'}]},{type,2955,tuple,[{type,2955,pid,[]},{type,2955,reference,[]}]}]},[{type,2956,constraint,[{atom,2956,is_subtype},[{var,2956,'Node'},{type,2956,node,[]}]]},{type,2957,constraint,[{atom,2957,is_subtype},[{var,2957,'Fun'},{type,2957,function,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_monitor,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2969}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,51>>],#{<<101,110>> => [{p,[],[<<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,48,50>>,signature => [{attribute,2969,spec,{{spawn_monitor,3},[{type,2969,bounded_fun,[{type,2969,'fun',[{type,2969,product,[{var,2969,'Module'},{var,2969,'Function'},{var,2969,'Args'}]},{type,2969,tuple,[{type,2969,pid,[]},{type,2969,reference,[]}]}]},[{type,2970,constraint,[{atom,2970,is_subtype},[{var,2970,'Module'},{type,2970,module,[]}]]},{type,2971,constraint,[{atom,2971,is_subtype},[{var,2971,'Function'},{type,2971,atom,[]}]]},{type,2972,constraint,[{atom,2972,is_subtype},[{var,2972,'Args'},{type,2972,list,[{type,2972,term,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3086}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,52>>],#{<<101,110>> => [{p,[],[<<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32>>,{code,[],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,41>>]},<<44,32,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,101,120,99,101,112,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,49,54>>,signature => [{attribute,3086,spec,{{spawn_monitor,4},[{type,3086,bounded_fun,[{type,3086,'fun',[{type,3086,product,[{var,3086,'Node'},{var,3086,'Module'},{var,3086,'Function'},{var,3086,'Args'}]},{type,3086,tuple,[{type,3086,pid,[]},{type,3086,reference,[]}]}]},[{type,3087,constraint,[{atom,3087,is_subtype},[{var,3087,'Node'},{type,3087,node,[]}]]},{type,3088,constraint,[{atom,3088,is_subtype},[{var,3088,'Module'},{type,3088,module,[]}]]},{type,3089,constraint,[{atom,3089,is_subtype},[{var,3089,'Function'},{type,3089,atom,[]}]]},{type,3090,constraint,[{atom,3090,is_subtype},[{var,3090,'Args'},{type,3090,list,[{type,3090,term,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_opt,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2999}],[<<115,112,97,119,110,95,111,112,116,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,32,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,51,51>>,signature => [{attribute,2999,spec,{{spawn_opt,2},[{type,2999,bounded_fun,[{type,2999,'fun',[{type,2999,product,[{var,2999,'Fun'},{var,2999,'Options'}]},{type,2999,union,[{type,2999,pid,[]},{type,2999,tuple,[{type,2999,pid,[]},{type,2999,reference,[]}]}]}]},[{type,3000,constraint,[{atom,3000,is_subtype},[{var,3000,'Fun'},{type,3000,function,[]}]]},{type,3001,constraint,[{atom,3001,is_subtype},[{var,3001,'Options'},{type,3001,list,[{user_type,3001,spawn_opt_option,[]}]}]]}]]}]}}]}},{{function,spawn_opt,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3014}],[<<115,112,97,119,110,95,111,112,116,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]},{p,[],[<<86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,53,49>>,signature => [{attribute,3014,spec,{{spawn_opt,3},[{type,3014,bounded_fun,[{type,3014,'fun',[{type,3014,product,[{var,3014,'Node'},{var,3014,'Fun'},{var,3014,'Options'}]},{type,3014,union,[{type,3014,pid,[]},{type,3014,tuple,[{type,3014,pid,[]},{type,3014,reference,[]}]}]}]},[{type,3015,constraint,[{atom,3015,is_subtype},[{var,3015,'Node'},{type,3015,node,[]}]]},{type,3016,constraint,[{atom,3016,is_subtype},[{var,3016,'Fun'},{type,3016,function,[]}]]},{type,3017,constraint,[{atom,3017,is_subtype},[{var,3017,'Options'},{type,3017,list,[{type,3017,union,[{atom,3017,monitor},{type,3018,tuple,[{atom,3018,monitor},{type,3018,list,[{user_type,3018,monitor_option,[]}]}]},{atom,3019,link},{var,3020,'OtherOption'}]}]}]]},{type,3021,constraint,[{atom,3021,is_subtype},[{var,3021,'OtherOption'},{type,3021,term,[]}]]}]]}]}}]}},{{function,spawn_opt,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3131}],[<<115,112,97,119,110,95,111,112,116,47,52>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<87,111,114,107,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,32,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,105,110,107>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,97,32,108,105,110,107,32,116,111,32,116,104,101,32,112,97,114,101,110,116,32,112,114,111,99,101,115,115,32,40,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,108,105,110,107,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,108,105,110,107,47,51>>]}]},<<32,100,111,101,115,41,46>>]}]},{dt,[],[{code,[],[<<109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,40,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41>>]}]},<<32,100,111,101,115,41,46,32,65,32>>,{code,[],[<<123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125>>]},<<32,116,117,112,108,101,32,119,105,108,108,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125>>]}]},{dd,[],[{p,[],[<<77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,119,105,116,104,32,111,112,116,105,111,110,115,32,40,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41>>]}]},<<32,100,111,101,115,41,46,32,65,32>>,{code,[],[<<123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125>>]},<<32,116,117,112,108,101,32,119,105,108,108,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,101,120,101,99,117,116,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]},<<32,105,110,32,116,104,101,32,115,116,97,114,116,32,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,112,114,105,111,114,105,116,121,32,105,115,32,115,101,116,32,98,101,102,111,114,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,78,117,109,98,101,114,125>>]}]},{dd,[],[{p,[],[<<85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,117,115,101,115,32,97,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,99,104,101,109,101,44,32,117,115,105,110,103,32,97,110,32,34,111,108,100,32,104,101,97,112,34,32,102,111,114,32,100,97,116,97,32,116,104,97,116,32,104,97,115,32,115,117,114,118,105,118,101,100,32,97,116,32,108,101,97,115,116,32,111,110,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,116,104,101,114,101,32,105,115,32,110,111,32,109,111,114,101,32,114,111,111,109,32,111,110,32,116,104,101,32,111,108,100,32,104,101,97,112,44,32,97,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46>>]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,103,101,110,101,114,97,116,105,111,110,97,108,32,99,111,108,108,101,99,116,105,111,110,115,32,98,101,102,111,114,101,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,44,32,101,118,101,110,32,105,102,32,116,104,101,114,101,32,105,115,32,114,111,111,109,32,111,110,32,116,104,101,32,111,108,100,32,104,101,97,112,46,32,83,101,116,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,116,111,32,122,101,114,111,32,100,105,115,97,98,108,101,115,32,116,104,101,32,103,101,110,101,114,97,108,32,99,111,108,108,101,99,116,105,111,110,32,97,108,103,111,114,105,116,104,109,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,99,111,112,105,101,100,32,97,116,32,101,118,101,114,121,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[<<65,32,102,101,119,32,99,97,115,101,115,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,116,111,32,99,104,97,110,103,101,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,110,111,32,108,111,110,103,101,114,32,117,115,101,100,32,97,114,101,32,116,111,32,98,101,32,116,104,114,111,119,110,32,97,119,97,121,32,97,115,32,115,111,111,110,32,97,115,32,112,111,115,115,105,98,108,101,46,32,40,83,101,116,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,122,101,114,111,46,41>>]}]},{li,[],[{p,[],[<<65,32,112,114,111,99,101,115,115,32,116,104,97,116,32,109,111,115,116,108,121,32,104,97,118,101,32,115,104,111,114,116,45,108,105,118,101,100,32,100,97,116,97,32,105,115,32,102,117,108,108,115,119,101,101,112,101,100,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,111,108,100,32,104,101,97,112,32,99,111,110,116,97,105,110,115,32,109,111,115,116,108,121,32,103,97,114,98,97,103,101,46,32,84,111,32,101,110,115,117,114,101,32,97,32,102,117,108,108,115,119,101,101,112,32,111,99,99,97,115,105,111,110,97,108,108,121,44,32,115,101,116,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,97,32,115,117,105,116,97,98,108,101,32,118,97,108,117,101,44,32,115,117,99,104,32,97,115,32,49,48,32,111,114,32,50,48,46>>]}]},{li,[],[<<73,110,32,101,109,98,101,100,100,101,100,32,115,121,115,116,101,109,115,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,97,109,111,117,110,116,32,111,102,32,82,65,77,32,97,110,100,32,110,111,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,44,32,121,111,117,32,109,105,103,104,116,32,119,97,110,116,32,116,111,32,112,114,101,115,101,114,118,101,32,109,101,109,111,114,121,32,98,121,32,115,101,116,116,105,110,103,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,122,101,114,111,46,32,40,84,104,101,32,118,97,108,117,101,32,99,97,110,32,98,101,32,115,101,116,32,103,108,111,98,97,108,108,121,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50>>]}]},<<46,41>>]}]}]},{dt,[],[{code,[],[<<123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46>>]},{p,[],[<<71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,32,97,110,100,32,115,108,111,119,32,100,111,119,110,32,116,104,101,32,115,121,115,116,101,109,32,98,101,99,97,117,115,101,32,111,102,32,119,111,114,115,101,32,100,97,116,97,32,108,111,99,97,108,105,116,121,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,32>>,{code,[],[<<83,105,122,101>>]},<<32,118,97,108,117,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,86,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46>>]},{p,[],[<<71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,32>>,{code,[],[<<86,83,105,122,101>>]},<<32,118,97,108,117,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,46,32,84,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,46,32>>,{code,[],[<<77,81,68>>]},<<32,105,115,32,116,111,32,98,101,32,101,105,116,104,101,114,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<32,111,114,32>>,{code,[],[<<111,110,95,104,101,97,112>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,113,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,113,100>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,55,52>>,signature => [{attribute,3131,spec,{{spawn_opt,4},[{type,3131,bounded_fun,[{type,3131,'fun',[{type,3131,product,[{var,3131,'Module'},{var,3131,'Function'},{var,3131,'Args'},{var,3131,'Options'}]},{type,3132,union,[{var,3132,'Pid'},{type,3132,tuple,[{var,3132,'Pid'},{var,3132,'MonitorRef'}]}]}]},[{type,3133,constraint,[{atom,3133,is_subtype},[{var,3133,'Module'},{type,3133,module,[]}]]},{type,3134,constraint,[{atom,3134,is_subtype},[{var,3134,'Function'},{type,3134,atom,[]}]]},{type,3135,constraint,[{atom,3135,is_subtype},[{var,3135,'Args'},{type,3135,list,[{type,3135,term,[]}]}]]},{type,3136,constraint,[{atom,3136,is_subtype},[{var,3136,'Options'},{type,3136,list,[{user_type,3136,spawn_opt_option,[]}]}]]},{type,3137,constraint,[{atom,3137,is_subtype},[{var,3137,'Pid'},{type,3137,pid,[]}]]},{type,3138,constraint,[{atom,3138,is_subtype},[{var,3138,'MonitorRef'},{type,3138,reference,[]}]]}]]}]}}]}},{{function,spawn_opt,5},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3143}],[<<115,112,97,119,110,95,111,112,116,47,53>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]},{p,[],[<<86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,50,50>>,signature => [{attribute,3143,spec,{{spawn_opt,5},[{type,3143,bounded_fun,[{type,3143,'fun',[{type,3143,product,[{var,3143,'Node'},{var,3143,'Module'},{var,3143,'Function'},{var,3143,'Args'},{var,3143,'Options'}]},{type,3144,union,[{type,3144,pid,[]},{type,3144,tuple,[{type,3144,pid,[]},{type,3144,reference,[]}]}]}]},[{type,3145,constraint,[{atom,3145,is_subtype},[{var,3145,'Node'},{type,3145,node,[]}]]},{type,3146,constraint,[{atom,3146,is_subtype},[{var,3146,'Module'},{type,3146,module,[]}]]},{type,3147,constraint,[{atom,3147,is_subtype},[{var,3147,'Function'},{type,3147,atom,[]}]]},{type,3148,constraint,[{atom,3148,is_subtype},[{var,3148,'Args'},{type,3148,list,[{type,3148,term,[]}]}]]},{type,3149,constraint,[{atom,3149,is_subtype},[{var,3149,'Options'},{type,3149,list,[{type,3149,union,[{atom,3149,monitor},{type,3150,tuple,[{atom,3150,monitor},{type,3150,list,[{user_type,3150,monitor_option,[]}]}]},{atom,3151,link},{var,3152,'OtherOption'}]}]}]]},{type,3153,constraint,[{atom,3153,is_subtype},[{var,3153,'OtherOption'},{type,3153,term,[]}]]}]]}]}}]}},{{function,spawn_request,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3246}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,52,54>>,signature => [{attribute,3246,spec,{{spawn_request,1},[{type,3246,bounded_fun,[{type,3246,'fun',[{type,3246,product,[{var,3246,'Fun'}]},{var,3246,'ReqId'}]},[{type,3247,constraint,[{atom,3247,is_subtype},[{var,3247,'Fun'},{type,3247,function,[]}]]},{type,3248,constraint,[{atom,3248,is_subtype},[{var,3248,'ReqId'},{type,3248,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3264}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,79,112,116,105,111,110,115,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,53,56>>,signature => [{attribute,3264,spec,{{spawn_request,2},[{type,3264,bounded_fun,[{type,3264,'fun',[{type,3264,product,[{var,3264,'Fun'},{var,3264,'Options'}]},{var,3264,'ReqId'}]},[{type,3265,constraint,[{atom,3265,is_subtype},[{var,3265,'Fun'},{type,3265,function,[]}]]},{type,3266,constraint,[{atom,3266,is_subtype},[{var,3266,'Option'},{type,3266,union,[{type,3266,tuple,[{atom,3266,reply_tag},{var,3266,'ReplyTag'}]},{type,3267,tuple,[{atom,3267,reply},{var,3267,'Reply'}]},{user_type,3268,spawn_opt_option,[]}]}]]},{type,3269,constraint,[{atom,3269,is_subtype},[{var,3269,'ReplyTag'},{type,3269,term,[]}]]},{type,3270,constraint,[{atom,3270,is_subtype},[{var,3270,'Reply'},{type,3270,union,[{atom,3270,yes},{atom,3270,no},{atom,3270,error_only},{atom,3270,success_only}]}]]},{type,3271,constraint,[{atom,3271,is_subtype},[{var,3271,'Options'},{type,3271,list,[{var,3271,'Option'}]}]]},{type,3272,constraint,[{atom,3272,is_subtype},[{var,3272,'ReqId'},{type,3272,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3264}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,70,117,110,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,55,48>>,signature => [{attribute,3264,spec,{{spawn_request,2},[{type,3273,bounded_fun,[{type,3273,'fun',[{type,3273,product,[{var,3273,'Node'},{var,3273,'Fun'}]},{var,3273,'ReqId'}]},[{type,3274,constraint,[{atom,3274,is_subtype},[{var,3274,'Node'},{type,3274,node,[]}]]},{type,3275,constraint,[{atom,3275,is_subtype},[{var,3275,'Fun'},{type,3275,function,[]}]]},{type,3276,constraint,[{atom,3276,is_subtype},[{var,3276,'ReqId'},{type,3276,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3299}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,101,114,108,97,110,103,44,97,112,112,108,121,44,91,70,117,110,44,91,93,93,44,79,112,116,105,111,110,115,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,117,115,105,110,103,32,116,104,101,32,102,117,110,32>>,{code,[],[<<70,117,110>>]},<<32,111,102,32,97,114,105,116,121,32,122,101,114,111,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<78,111,100,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<70,117,110>>]},<<32,105,115,32,110,111,116,32,97,32,102,117,110,32,111,102,32,97,114,105,116,121,32,122,101,114,111,46>>]}]},{li,[],[{p,[],[{code,[],[<<79,112,116,105,111,110,115>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,56,50>>,signature => [{attribute,3299,spec,{{spawn_request,3},[{type,3299,bounded_fun,[{type,3299,'fun',[{type,3299,product,[{var,3299,'Node'},{var,3299,'Fun'},{var,3299,'Options'}]},{var,3299,'ReqId'}]},[{type,3300,constraint,[{atom,3300,is_subtype},[{var,3300,'Node'},{type,3300,node,[]}]]},{type,3301,constraint,[{atom,3301,is_subtype},[{var,3301,'Fun'},{type,3301,function,[]}]]},{type,3302,constraint,[{atom,3302,is_subtype},[{var,3302,'Options'},{type,3302,list,[{var,3302,'Option'}]}]]},{type,3303,constraint,[{atom,3303,is_subtype},[{var,3303,'Option'},{type,3303,union,[{atom,3303,monitor},{type,3304,tuple,[{atom,3304,monitor},{type,3304,list,[{user_type,3304,monitor_option,[]}]}]},{atom,3305,link},{type,3306,tuple,[{atom,3306,reply_tag},{var,3306,'ReplyTag'}]},{type,3307,tuple,[{atom,3307,reply},{var,3307,'Reply'}]},{var,3308,'OtherOption'}]}]]},{type,3309,constraint,[{atom,3309,is_subtype},[{var,3309,'ReplyTag'},{type,3309,term,[]}]]},{type,3310,constraint,[{atom,3310,is_subtype},[{var,3310,'Reply'},{type,3310,union,[{atom,3310,yes},{atom,3310,no},{atom,3310,error_only},{atom,3310,success_only}]}]]},{type,3311,constraint,[{atom,3311,is_subtype},[{var,3311,'OtherOption'},{type,3311,term,[]}]]},{type,3312,constraint,[{atom,3312,is_subtype},[{var,3312,'ReqId'},{type,3312,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3299}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,48,50>>,signature => [{attribute,3299,spec,{{spawn_request,3},[{type,3313,bounded_fun,[{type,3313,'fun',[{type,3313,product,[{var,3313,'Module'},{var,3313,'Function'},{var,3313,'Args'}]},{var,3314,'ReqId'}]},[{type,3315,constraint,[{atom,3315,is_subtype},[{var,3315,'Module'},{type,3315,module,[]}]]},{type,3316,constraint,[{atom,3316,is_subtype},[{var,3316,'Function'},{type,3316,atom,[]}]]},{type,3317,constraint,[{atom,3317,is_subtype},[{var,3317,'Args'},{type,3317,list,[{type,3317,term,[]}]}]]},{type,3318,constraint,[{atom,3318,is_subtype},[{var,3318,'ReqId'},{type,3318,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3339}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,52>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,49,52>>,signature => [{attribute,3339,spec,{{spawn_request,4},[{type,3339,bounded_fun,[{type,3339,'fun',[{type,3339,product,[{var,3339,'Node'},{var,3339,'Module'},{var,3339,'Function'},{var,3339,'Args'}]},{var,3340,'ReqId'}]},[{type,3341,constraint,[{atom,3341,is_subtype},[{var,3341,'Node'},{type,3341,node,[]}]]},{type,3342,constraint,[{atom,3342,is_subtype},[{var,3342,'Module'},{type,3342,module,[]}]]},{type,3343,constraint,[{atom,3343,is_subtype},[{var,3343,'Function'},{type,3343,atom,[]}]]},{type,3344,constraint,[{atom,3344,is_subtype},[{var,3344,'Args'},{type,3344,list,[{type,3344,term,[]}]}]]},{type,3345,constraint,[{atom,3345,is_subtype},[{var,3345,'ReqId'},{type,3345,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3339}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,52>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,79,112,116,105,111,110,115,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,50,54>>,signature => [{attribute,3339,spec,{{spawn_request,4},[{type,3346,bounded_fun,[{type,3346,'fun',[{type,3346,product,[{var,3346,'Module'},{var,3346,'Function'},{var,3346,'Args'},{var,3346,'Options'}]},{var,3347,'ReqId'}]},[{type,3348,constraint,[{atom,3348,is_subtype},[{var,3348,'Module'},{type,3348,module,[]}]]},{type,3349,constraint,[{atom,3349,is_subtype},[{var,3349,'Function'},{type,3349,atom,[]}]]},{type,3350,constraint,[{atom,3350,is_subtype},[{var,3350,'Args'},{type,3350,list,[{type,3350,term,[]}]}]]},{type,3351,constraint,[{atom,3351,is_subtype},[{var,3351,'Option'},{type,3351,union,[{type,3351,tuple,[{atom,3351,reply_tag},{var,3351,'ReplyTag'}]},{type,3352,tuple,[{atom,3352,reply},{var,3352,'Reply'}]},{user_type,3353,spawn_opt_option,[]}]}]]},{type,3354,constraint,[{atom,3354,is_subtype},[{var,3354,'ReplyTag'},{type,3354,term,[]}]]},{type,3355,constraint,[{atom,3355,is_subtype},[{var,3355,'Reply'},{type,3355,union,[{atom,3355,yes},{atom,3355,no},{atom,3355,error_only},{atom,3355,success_only}]}]]},{type,3356,constraint,[{atom,3356,is_subtype},[{var,3356,'Options'},{type,3356,list,[{var,3356,'Option'}]}]]},{type,3357,constraint,[{atom,3357,is_subtype},[{var,3357,'ReqId'},{type,3357,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,5},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3380}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>],#{<<101,110>> => [{p,[],[<<65,115,121,110,99,104,114,111,110,111,117,115,108,121,32,115,101,110,100,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,82,101,116,117,114,110,115,32,97,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32>>,{code,[],[<<82,101,113,73,100>>]},<<46>>]},{a,[{id,<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>}],[]},{p,[],[<<73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,111,107,44,32,80,105,100,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,117,99,104,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,32>>,{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]},<<32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32>>,{code,[],[<<82,101,112,108,121,84,97,103>>]},<<32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,112,97,119,110,95,114,101,112,108,121>>]},<<32,117,110,108,101,115,115,32,109,111,100,105,102,105,101,100,32,98,121,32,116,104,101,32>>,{code,[],[<<123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125>>]},<<32,111,112,116,105,111,110,46,32,84,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46>>]},{a,[{id,<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>}],[]},{p,[],[<<84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,32,101,105,116,104,101,114,32,105,102,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,102,97,105,108,101,100,32,111,114,32,105,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,105,110,116,101,114,114,117,112,116,101,100,32,98,121,32,97,32,99,111,110,110,101,99,116,105,111,110,32,102,97,105,108,117,114,101,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,46,32,83,117,99,104,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,110,32>>,{i,[],[<<101,114,114,111,114,32,109,101,115,115,97,103,101>>]},<<32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,112,97,119,110,32,101,114,114,111,114,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<115,32,97,114,101,32,100,101,102,105,110,101,100,44,32,98,117,116,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,111,112,116>>]}]},{dd,[],[{p,[],[<<65,110,32,105,110,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<32,119,97,115,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,32,78,111,116,101,32,116,104,97,116,32,100,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,115,32,109,97,121,32,115,117,112,112,111,114,116,32,100,105,102,102,101,114,101,110,116,32,111,112,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,115,32,105,115,115,117,101,100,32,98,121,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<70,97,105,108,117,114,101,32,116,111,32,115,101,116,32,117,112,32,97,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,111,114,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,32,119,97,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,110,32,116,104,101,32,99,97,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,119,97,115,32,108,111,115,116,44,32,97,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<67,111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,100,117,101,32,116,111,32,116,104,97,116,32,115,111,109,101,32,115,121,115,116,101,109,32,108,105,109,105,116,32,119,97,115,32,114,101,97,99,104,101,100,46,32,84,121,112,105,99,97,108,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,97,98,108,101,32,119,97,115,32,102,117,108,108,46>>]}]}]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41>>]}]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,101,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<32,105,115,32,97,108,115,111,32,117,115,101,100,32,97,115,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,97,115,32,105,102,32,105,116,32,119,97,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41>>]},<<46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,109,111,110,105,116,111,114,32,99,97,110,32,110,111,116,32,98,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<100,101,109,111,110,105,116,111,114,101,100>>]},<<32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,65,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,102,111,114,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,109,111,110,105,116,111,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,46>>]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125>>]}]},{dd,[],[{p,[],[<<73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41>>]}]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,101,101,32,116,104,101,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,111,112,116,105,111,110,32,97,98,111,118,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,116,104,101,32,99,97,115,101,32,116,104,97,116,32,97,110,32,97,108,105,97,115,32,105,115,32,99,114,101,97,116,101,100,32,117,115,105,110,103,32,116,104,101,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,44,32,116,104,101,32,97,108,105,97,115,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,97,99,116,105,118,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<108,105,110,107>>]}]},{dd,[],[{p,[],[<<73,110,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,110,107,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,110,107,40,80,105,100,41>>]}]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<84,104,101,32,108,105,110,107,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,108,105,110,107,32,99,97,110,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,65,110,32,101,120,105,116,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32,101,120,105,116,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,32,73,102,32,105,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,44,32,105,116,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,97,110,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,112,108,121,44,32,82,101,112,108,121,125>>]}]},{dd,[],[{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<82,101,112,108,121>>]},<<32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<121,101,115>>]}]},{dd,[],[{p,[],[<<65,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,32,110,111,116,46,32,73,102,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<32,114,101,116,117,114,110,115,32,119,105,116,104,111,117,116,32,114,97,105,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,116,104,101,32>>,{code,[],[<<114,101,112,108,121>>]},<<32,111,112,116,105,111,110,32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<121,101,115>>]},<<44,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,101,105,116,104,101,114,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,111,114,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<101,114,114,111,114,32,109,101,115,115,97,103,101>>]}]},<<46,32,84,104,101,32>>,{code,[],[<<114,101,112,108,121>>]},<<32,111,112,116,105,111,110,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,115,101,116,32,116,111,32>>,{code,[],[<<121,101,115>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,111>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,99,111,109,112,108,101,116,101,115,46,32,84,104,105,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,32,110,111,116,46>>]}]},{dt,[],[{code,[],[<<101,114,114,111,114,95,111,110,108,121>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,98,117,116,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<101,114,114,111,114,32,109,101,115,115,97,103,101>>]}]},<<32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,46>>]}]},{dt,[],[{code,[],[<<115,117,99,99,101,115,115,95,111,110,108,121>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,98,117,116,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,46>>]}]}]}]},{dt,[],[{code,[],[<<123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,114,101,112,108,121,32,116,97,103,32,116,111,32>>,{code,[],[<<82,101,112,108,121,84,97,103>>]},<<32,105,110,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,46,32,84,104,97,116,32,105,115,44,32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<101,114,114,111,114>>]}]},<<32,109,101,115,115,97,103,101,32,116,104,97,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,112,108,121,32,116,97,103,32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,112,97,119,110,95,114,101,112,108,121>>]},<<46>>]}]},{dt,[],[{code,[],[<<79,116,104,101,114,79,112,116,105,111,110>>]}]},{dd,[],[{p,[],[<<79,116,104,101,114,32,118,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,111,116,104,101,114,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]}]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<78,111,100,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<65,114,103,115>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>]}]},{li,[],[{p,[],[{code,[],[<<79,112,116,105,111,110,115>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>]}]}]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,110,100,105,118,105,100,117,97,108,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,97,114,101,32,99,104,101,99,107,101,100,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,46,32,83,111,109,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,99,97,110,32,111,110,108,121,32,98,101,32,99,104,101,99,107,101,100,32,111,110,32,114,101,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,46,32,84,104,101,114,101,102,111,114,101,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,99,97,117,115,101,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,44,32,98,117,116,32,119,105,108,108,32,99,97,117,115,101,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,116,111,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<98,97,100,111,112,116>>]},<<46>>]},{p,[],[<<65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,98,101,32,97,98,97,110,100,111,110,101,100,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,51,56>>,signature => [{attribute,3380,spec,{{spawn_request,5},[{type,3380,bounded_fun,[{type,3380,'fun',[{type,3380,product,[{var,3380,'Node'},{var,3380,'Module'},{var,3380,'Function'},{var,3380,'Args'},{var,3380,'Options'}]},{var,3381,'ReqId'}]},[{type,3382,constraint,[{atom,3382,is_subtype},[{var,3382,'Node'},{type,3382,node,[]}]]},{type,3383,constraint,[{atom,3383,is_subtype},[{var,3383,'Module'},{type,3383,module,[]}]]},{type,3384,constraint,[{atom,3384,is_subtype},[{var,3384,'Function'},{type,3384,atom,[]}]]},{type,3385,constraint,[{atom,3385,is_subtype},[{var,3385,'Args'},{type,3385,list,[{type,3385,term,[]}]}]]},{type,3386,constraint,[{atom,3386,is_subtype},[{var,3386,'Options'},{type,3386,list,[{var,3386,'Option'}]}]]},{type,3387,constraint,[{atom,3387,is_subtype},[{var,3387,'Option'},{type,3387,union,[{atom,3387,monitor},{type,3388,tuple,[{atom,3388,monitor},{type,3388,list,[{user_type,3388,monitor_option,[]}]}]},{atom,3389,link},{type,3390,tuple,[{atom,3390,reply_tag},{var,3390,'ReplyTag'}]},{type,3391,tuple,[{atom,3391,reply},{var,3391,'Reply'}]},{var,3392,'OtherOption'}]}]]},{type,3393,constraint,[{atom,3393,is_subtype},[{var,3393,'ReplyTag'},{type,3393,term,[]}]]},{type,3394,constraint,[{atom,3394,is_subtype},[{var,3394,'Reply'},{type,3394,union,[{atom,3394,yes},{atom,3394,no},{atom,3394,error_only},{atom,3394,success_only}]}]]},{type,3395,constraint,[{atom,3395,is_subtype},[{var,3395,'OtherOption'},{type,3395,term,[]}]]},{type,3396,constraint,[{atom,3396,is_subtype},[{var,3396,'ReqId'},{type,3396,reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request_abandon,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3413}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<65,98,97,110,100,111,110,32,97,32,112,114,101,118,105,111,117,115,108,121,32,105,115,115,117,101,100,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]}]},<<32,105,110,32,97,32,99,97,108,108,32,102,114,111,109,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,109,97,100,101,32,116,104,101,32,114,101,113,117,101,115,116,32,99,97,110,32,97,98,97,110,100,111,110,32,116,104,101,32,114,101,113,117,101,115,116,46>>]},{p,[],[<<65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,111,110,108,121,32,98,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,32,99,111,109,112,108,101,116,101,100,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,110,111,116,32,98,101,32,101,102,102,101,99,116,101,100,32,98,121,32,102,117,116,117,114,101,32,100,105,114,101,99,116,32,101,102,102,101,99,116,115,32,111,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,116,115,101,108,102,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,119,105,108,108,32,110,111,116,32,114,101,99,101,105,118,101,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,46,32,84,104,101,32,114,101,113,117,101,115,116,32,105,115,32,104,111,119,101,118,101,114,32,110,111,116,32,119,105,116,104,100,114,97,119,110,44,32,115,111,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,101,32,114,101,113,117,101,115,116,46,32,73,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,97,102,116,101,114,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,44,32,110,111,32,109,111,110,105,116,111,114,115,32,110,111,114,32,108,105,110,107,115,32,119,105,108,108,32,98,101,32,115,101,116,32,117,112,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>]},<<32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,110,99,108,117,100,101,100,32,116,104,101,32>>,{code,[],[<<108,105,110,107>>]},<<32,111,112,116,105,111,110,44,32,116,104,101,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,105,115,32,114,101,113,117,101,115,116,32,119,105,108,108,32,98,101,32,115,101,110,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,105,116,115,32,112,97,114,101,110,116,32,119,105,116,104,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<97,98,97,110,100,111,110,101,100>>]},<<32,119,104,101,110,32,105,116,32,105,115,32,100,101,116,101,99,116,101,100,32,116,104,97,116,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,97,98,97,110,100,111,110,101,100,32,109,97,121,32,99,111,109,109,117,110,105,99,97,116,101,32,119,105,116,104,32,105,116,115,32,112,97,114,101,110,116,32,97,115,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,73,116,32,105,115,32>>,{em,[],[<<111,110,108,121>>]},<<32,116,104,101,32,100,105,114,101,99,116,32,101,102,102,101,99,116,115,32,111,110,32,116,104,101,32,112,97,114,101,110,116,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,115,112,97,119,110,32,114,101,113,117,101,115,116,44,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,97,110,99,101,108,101,100,32,98,121,32,97,98,97,110,100,111,110,105,110,103,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46>>]}]},{p,[],[<<82,101,116,117,114,110,32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,46,32,84,104,101,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32,100,105,100,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,110,32,111,117,116,115,116,97,110,100,105,110,103,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,115,117,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,105,116,104,101,114,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<82,101,113,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,112,114,101,118,105,111,117,108,115,121,32,109,97,100,101,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,99,111,109,112,108,101,116,101,100,32,97,110,100,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,104,97,115,32,97,108,114,101,97,100,121,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,108,101,115,115,32,116,104,101,32,115,112,97,119,110,32,114,101,112,108,121,32,119,97,115,32,100,105,115,97,98,108,101,100,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,46>>]}]},{li,[],[{p,[],[{code,[],[<<82,101,113,73,100>>]},<<32,100,111,101,115,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,109,97,100,101,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]}]}]}]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,105,115,32,110,111,116,32,97,32,114,101,102,101,114,101,110,99,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,57,53>>,signature => [{attribute,3413,spec,{{spawn_request_abandon,1},[{type,3413,'fun',[{type,3413,product,[{ann_type,3413,[{var,3413,'ReqId'},{type,3413,reference,[]}]}]},{type,3413,boolean,[]}]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,split_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1896}],[<<115,112,108,105,116,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,108,105,116,116,105,110,103,32>>,{code,[],[<<66,105,110>>]},<<32,105,110,116,111,32,116,119,111,32,112,97,114,116,115,32,97,116,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<80,111,115>>]},<<46,32,84,104,105,115,32,105,115,32,110,111,116,32,97,32,100,101,115,116,114,117,99,116,105,118,101,32,111,112,101,114,97,116,105,111,110,46,32,65,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,98,105,110,97,114,105,101,115,32,97,108,116,111,103,101,116,104,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,32,61,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,34,48,49,50,51,52,53,54,55,56,57,34,41,46,10,60,60,34,48,49,50,51,52,53,54,55,56,57,34,62,62,10,62,32,98,121,116,101,95,115,105,122,101,40,66,41,46,10,49,48,10,62,32,123,66,49,44,32,66,50,125,32,61,32,115,112,108,105,116,95,98,105,110,97,114,121,40,66,44,51,41,46,10,123,60,60,34,48,49,50,34,62,62,44,60,60,34,51,52,53,54,55,56,57,34,62,62,125,10,62,32,98,121,116,101,95,115,105,122,101,40,66,49,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,66,50,41,46,10,55>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,53,54,49>>,signature => [{attribute,1896,spec,{{split_binary,2},[{type,1896,bounded_fun,[{type,1896,'fun',[{type,1896,product,[{var,1896,'Bin'},{var,1896,'Pos'}]},{type,1896,tuple,[{type,1896,binary,[]},{type,1896,binary,[]}]}]},[{type,1897,constraint,[{atom,1897,is_subtype},[{var,1897,'Bin'},{type,1897,binary,[]}]]},{type,1898,constraint,[{atom,1898,is_subtype},[{var,1898,'Pos'},{type,1898,non_neg_integer,[]}]]}]]}]}}]}},{{function,start_timer,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1903}],[<<115,116,97,114,116,95,116,105,109,101,114,47,51>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,53,56,53>>,signature => [{attribute,1903,spec,{{erlang,start_timer,3},[{type,1903,bounded_fun,[{type,1903,'fun',[{type,1903,product,[{var,1903,'Time'},{var,1903,'Dest'},{var,1903,'Msg'}]},{var,1903,'TimerRef'}]},[{type,1904,constraint,[{atom,1904,is_subtype},[{var,1904,'Time'},{type,1904,non_neg_integer,[]}]]},{type,1905,constraint,[{atom,1905,is_subtype},[{var,1905,'Dest'},{type,1905,union,[{type,1905,pid,[]},{type,1905,atom,[]}]}]]},{type,1906,constraint,[{atom,1906,is_subtype},[{var,1906,'Msg'},{type,1906,term,[]}]]},{type,1907,constraint,[{atom,1907,is_subtype},[{var,1907,'TimerRef'},{type,1907,reference,[]}]]}]]}]}}]}},{{function,start_timer,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1913}],[<<115,116,97,114,116,95,116,105,109,101,114,47,52>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,84,105,109,101,114,82,101,102,44,32,77,115,103,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,101,115,116>>]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,98,115,44,32,102,97,108,115,101,125>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,32,73,116,32,109,101,97,110,115,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32>>,{em,[],[<<114,101,108,97,116,105,118,101>>]},<<32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,97,98,115,44,32,116,114,117,101,125>>]}]},{dd,[],[{p,[],[<<65,98,115,111,108,117,116,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,46,32,84,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,110,32,97,98,115,111,108,117,116,101,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46>>]}]}]},{p,[],[<<77,111,114,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{p,[],[<<84,104,101,32,97,98,115,111,108,117,116,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,115,101,116,32,116,111,32,101,120,112,105,114,101,32,111,110,44,32,109,117,115,116,32,98,101,32,105,110,32,116,104,101,32,105,110,116,101,114,118,97,108,32>>,{code,[],[<<91,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111>>]},{code,[],[<<40,115,116,97,114,116,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,44,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111>>]},{code,[],[<<40,101,110,100,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,32,93>>]},<<46,32,73,102,32,97,32,114,101,108,97,116,105,118,101,32,116,105,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,110,101,103,97,116,105,118,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<44,32,105,116,32,109,117,115,116,32,98,101,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,111,102,32,97,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,101,105,116,104,101,114,32,116,101,114,109,105,110,97,116,101,100,32,111,114,32,110,111,116,46,32,73,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,110,32>>,{code,[],[<<97,116,111,109,40,41>>]},<<44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,46,32,84,104,101,32,112,114,111,99,101,115,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32,110,97,109,101,32,105,115,32,108,111,111,107,101,100,32,117,112,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,105,109,101,114,32,101,120,112,105,114,97,116,105,111,110,46,32,78,111,32,101,114,114,111,114,32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,110,97,109,101,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,105,115,32,110,111,116,32,97,108,105,118,101,44,32,111,114,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,53,46,52,46,49,49,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,105,109,101,114,115,32,97,114,101,32,110,111,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,32,119,104,101,110,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,110,32>>,{code,[],[<<97,116,111,109,40,41>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,97,100,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,100,111,32,110,111,116,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,104,101,114,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,53,57,54>>,signature => [{attribute,1913,spec,{{erlang,start_timer,4},[{type,1913,bounded_fun,[{type,1913,'fun',[{type,1913,product,[{var,1913,'Time'},{var,1913,'Dest'},{var,1913,'Msg'},{var,1913,'Options'}]},{var,1913,'TimerRef'}]},[{type,1914,constraint,[{atom,1914,is_subtype},[{var,1914,'Time'},{type,1914,integer,[]}]]},{type,1915,constraint,[{atom,1915,is_subtype},[{var,1915,'Dest'},{type,1915,union,[{type,1915,pid,[]},{type,1915,atom,[]}]}]]},{type,1916,constraint,[{atom,1916,is_subtype},[{var,1916,'Msg'},{type,1916,term,[]}]]},{type,1917,constraint,[{atom,1917,is_subtype},[{var,1917,'Options'},{type,1917,list,[{var,1917,'Option'}]}]]},{type,1918,constraint,[{atom,1918,is_subtype},[{var,1918,'Abs'},{type,1918,boolean,[]}]]},{type,1919,constraint,[{atom,1919,is_subtype},[{var,1919,'Option'},{type,1919,tuple,[{atom,1919,abs},{var,1919,'Abs'}]}]]},{type,1920,constraint,[{atom,1920,is_subtype},[{var,1920,'TimerRef'},{type,1920,reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},<<32,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,97,115,107,115,32,116,104,97,116,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,54,53,54>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2528,bounded_fun,[{type,2528,'fun',[{type,2528,product,[{atom,2528,active_tasks}]},{type,2528,list,[{var,2528,'ActiveTasks'}]}]},[{type,2529,constraint,[{atom,2529,is_subtype},[{var,2529,'ActiveTasks'},{type,2529,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,99,116,105,118,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,111,110,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,116,104,97,116,32,97,114,101,32,114,101,97,100,121,32,116,111,32,114,117,110,44,32,111,114,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,114,117,110,110,105,110,103,46,32,86,97,108,117,101,115,32,102,111,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,110,100,32,116,104,101,105,114,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,97,110,32,101,108,101,109,101,110,116,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,32,97,110,100,32,116,104,101,110,32,97,115,32,108,97,115,116,32,101,108,101,109,101,110,116,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,32,101,102,102,105,99,105,101,110,116,108,121,32,103,97,116,104,101,114,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32>>,{em,[],[<<110,111,116>>]},<<32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,54,55,49>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2530,bounded_fun,[{type,2530,'fun',[{type,2530,product,[{atom,2530,active_tasks_all}]},{type,2530,list,[{var,2530,'ActiveTasks'}]}]},[{type,2531,constraint,[{atom,2531,is_subtype},[{var,2531,'ActiveTasks'},{type,2531,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,101,115,32,115,105,110,99,101,32,116,104,101,32,115,121,115,116,101,109,32,115,116,97,114,116,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,49,51>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2532,bounded_fun,[{type,2532,'fun',[{type,2532,product,[{atom,2532,context_switches}]},{type,2532,tuple,[{var,2532,'ContextSwitches'},{integer,2532,0}]}]},[{type,2533,constraint,[{atom,2533,is_subtype},[{var,2533,'ContextSwitches'},{type,2533,non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,120,97,99,116,32,114,101,100,117,99,116,105,111,110,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41>>]},<<32,105,115,32,97,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,111,112,101,114,97,116,105,111,110,32,116,104,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,101,100,117,99,116,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,50,50>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2534,bounded_fun,[{type,2534,'fun',[{type,2534,product,[{atom,2534,exact_reductions}]},{type,2534,tuple,[{var,2534,'Total_Exact_Reductions'},{var,2535,'Exact_Reductions_Since_Last_Call'}]}]},[{type,2536,constraint,[{atom,2536,is_subtype},[{var,2536,'Total_Exact_Reductions'},{type,2536,non_neg_integer,[]}]]},{type,2537,constraint,[{atom,2537,is_subtype},[{var,2537,'Exact_Reductions_Since_Last_Call'},{type,2537,non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,116,97,116,105,115,116,105,99,115,40,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,41,46,10,123,56,53,44,50,51,57,54,49,44,48,125>>]}]},{p,[],[<<84,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,102,111,114,32,115,111,109,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,51,55>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2538,bounded_fun,[{type,2538,'fun',[{type,2538,product,[{atom,2538,garbage_collection}]},{type,2538,tuple,[{var,2538,'Number_of_GCs'},{var,2538,'Words_Reclaimed'},{integer,2538,0}]}]},[{type,2539,constraint,[{atom,2539,is_subtype},[{var,2539,'Number_of_GCs'},{type,2539,non_neg_integer,[]}]]},{type,2540,constraint,[{atom,2540,is_subtype},[{var,2540,'Words_Reclaimed'},{type,2540,non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<73,110,112,117,116>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,99,101,105,118,101,100,32,116,104,114,111,117,103,104,32,112,111,114,116,115,44,32,97,110,100,32>>,{code,[],[<<79,117,116,112,117,116>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,111,117,116,112,117,116,32,116,111,32,112,111,114,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,52,57>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2541,bounded_fun,[{type,2541,'fun',[{type,2541,product,[{atom,2541,io}]},{type,2541,tuple,[{type,2541,tuple,[{atom,2541,input},{var,2541,'Input'}]},{type,2541,tuple,[{atom,2541,output},{var,2541,'Output'}]}]}]},[{type,2542,constraint,[{atom,2542,is_subtype},[{var,2542,'Input'},{type,2542,non_neg_integer,[]}]]},{type,2543,constraint,[{atom,2543,is_subtype},[{var,2543,'Output'},{type,2543,non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,101,97,115,117,114,101,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,112,101,110,100,115,32,100,111,105,110,103,32,118,97,114,105,111,117,115,32,116,97,115,107,115,46,32,73,116,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,97,115,32,108,105,103,104,116,119,101,105,103,104,116,32,97,115,32,112,111,115,115,105,98,108,101,44,32,98,117,116,32,115,111,109,101,32,111,118,101,114,104,101,97,100,32,101,120,105,115,116,115,32,119,104,101,110,32,116,104,105,115,32,105,115,32,101,110,97,98,108,101,100,46,32,77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,97,32,112,114,111,102,105,108,105,110,103,32,116,111,111,108,32,116,111,32,104,101,108,112,32,102,105,110,100,105,110,103,32,112,101,114,102,111,114,109,97,110,99,101,32,98,111,116,116,108,101,110,101,99,107,115,46,32,84,111,32>>,{code,[],[<<115,116,97,114,116>>]},<<47>>,{code,[],[<<115,116,111,112>>]},<<47>>,{code,[],[<<114,101,115,101,116>>]},<<32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,44,32,117,115,101,32,115,121,115,116,101,109,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>]}]},<<46>>]},{p,[],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41>>]},<<32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,109,97,112,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115,111,109,101,32,111,102,32,116,104,101,32,79,83,32,116,104,114,101,97,100,115,32,119,105,116,104,105,110,32,69,82,84,83,46,32,69,97,99,104,32,109,97,112,32,99,111,110,116,97,105,110,115,32>>,{code,[],[<<116,121,112,101>>]},<<32,97,110,100,32>>,{code,[],[<<105,100>>]},<<32,102,105,101,108,100,115,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,119,104,97,116,32,116,104,114,101,97,100,32,105,116,32,105,115,44,32,97,110,100,32,97,108,115,111,32,97,32,99,111,117,110,116,101,114,115,32,102,105,101,108,100,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,100,97,116,97,32,97,98,111,117,116,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,104,97,115,32,98,101,101,110,32,115,112,101,110,116,32,105,110,32,116,104,101,32,118,97,114,105,111,117,115,32,115,116,97,116,101,115,46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,91,35,123,99,111,117,110,116,101,114,115,32,61,62,32,35,123,97,117,120,32,61,62,32,49,56,57,57,49,56,50,57,49,52,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,104,101,99,107,95,105,111,32,61,62,32,50,54,48,53,56,54,51,54,48,50,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,109,117,108,97,116,111,114,32,61,62,32,52,53,55,51,49,56,56,48,52,54,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,99,32,61,62,32,49,53,49,50,50,48,54,57,49,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,116,104,101,114,32,61,62,32,53,52,50,49,51,51,56,52,53,54,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,111,114,116,32,61,62,32,50,50,49,54,51,49,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,108,101,101,112,32,61,62,32,53,49,53,48,50,57,52,49,48,48,125,44,10,32,32,32,105,100,32,61,62,32,49,44,10,32,32,32,116,121,112,101,32,61,62,32,115,99,104,101,100,117,108,101,114,125,124,46,46,46,93>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,117,110,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>]}]},<<46,32,83,111,44,32,116,111,32,99,111,110,118,101,114,116,32,105,116,32,116,111,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,121,111,117,32,99,97,110,32,100,111,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<108,105,115,116,115,58,109,97,112,40,10,32,32,102,117,110,40,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,67,110,116,32,125,32,61,32,77,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,77,115,67,110,116,32,61,32,109,97,112,115,58,109,97,112,40,102,117,110,40,95,75,44,32,80,101,114,102,67,111,117,110,116,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,80,101,114,102,67,111,117,110,116,44,32,112,101,114,102,95,99,111,117,110,116,101,114,44,32,49,48,48,48,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,32,67,110,116,41,44,10,32,32,32,32,32,32,32,32,32,77,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,77,115,67,110,116,32,125,10,32,32,101,110,100,44,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,41,46>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,118,97,108,117,101,115,32,97,114,101,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,116,104,101,32,101,120,97,99,116,32,116,105,109,101,32,115,112,101,110,116,32,105,110,32,101,97,99,104,32,115,116,97,116,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,118,97,114,105,111,117,115,32,111,112,116,105,109,105,115,97,116,105,111,110,32,100,111,110,101,32,116,111,32,107,101,101,112,32,116,104,101,32,111,118,101,114,104,101,97,100,32,97,115,32,115,109,97,108,108,32,97,115,32,112,111,115,115,105,98,108,101,46>>]},{p,[],[{code,[],[<<77,83,65,99,99,95,84,104,114,101,97,100,95,84,121,112,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[<<84,104,101,32,109,97,105,110,32,101,120,101,99,117,116,105,111,110,32,116,104,114,101,97,100,115,32,116,104,97,116,32,100,111,32,109,111,115,116,32,111,102,32,116,104,101,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,83>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[<<84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,99,112,117,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,83,68,99,112,117>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[<<84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,73,47,79,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,83,68,105,111>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<97,115,121,110,99>>]}]},{dd,[],[<<65,115,121,110,99,32,116,104,114,101,97,100,115,32,97,114,101,32,117,115,101,100,32,98,121,32,118,97,114,105,111,117,115,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,115,32,40,109,97,105,110,108,121,32,116,104,101,32,102,105,108,101,32,100,114,105,118,101,114,115,41,32,100,111,32,111,102,102,108,111,97,100,32,110,111,110,45,67,80,85,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,97,115,121,110,99,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,65>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<97,117,120>>]}]},{dd,[],[<<84,97,107,101,115,32,99,97,114,101,32,111,102,32,97,110,121,32,119,111,114,107,32,116,104,97,116,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,99,97,108,108,121,32,97,115,115,105,103,110,101,100,32,116,111,32,97,32,115,99,104,101,100,117,108,101,114,46>>]},{dt,[],[{code,[],[<<112,111,108,108>>]}]},{dd,[],[<<68,111,101,115,32,116,104,101,32,73,79,32,112,111,108,108,105,110,103,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,73,79,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,73,79,116>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32>>,{code,[],[<<77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101>>]},<<115,32,97,114,101,32,97,118,97,105,108,97,98,108,101,46,32,65,108,108,32,115,116,97,116,101,115,32,97,114,101,32,101,120,99,108,117,115,105,118,101,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,32,116,104,114,101,97,100,32,99,97,110,110,111,116,32,98,101,32,105,110,32,116,119,111,32,115,116,97,116,101,115,32,97,116,32,111,110,99,101,46,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,116,104,101,32,110,117,109,98,101,114,115,32,111,102,32,97,108,108,32,99,111,117,110,116,101,114,115,32,105,110,32,97,32,116,104,114,101,97,100,44,32,121,111,117,32,103,101,116,32,116,104,101,32,116,111,116,97,108,32,114,117,110,116,105,109,101,32,102,111,114,32,116,104,97,116,32,116,104,114,101,97,100,46>>]},{dl,[],[{dt,[],[{code,[],[<<97,117,120>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,104,97,110,100,108,105,110,103,32,97,117,120,105,108,105,97,114,121,32,106,111,98,115,46>>]},{dt,[],[{code,[],[<<99,104,101,99,107,95,105,111>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,99,104,101,99,107,105,110,103,32,102,111,114,32,110,101,119,32,73,47,79,32,101,118,101,110,116,115,46>>]},{dt,[],[{code,[],[<<101,109,117,108,97,116,111,114>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46>>]},{dt,[],[{code,[],[<<103,99>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,101,120,116,114,97,32,115,116,97,116,101,115,32,97,114,101,32,101,110,97,98,108,101,100,32,116,104,105,115,32,105,115,32,116,104,101,32,116,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,110,111,110,45,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,46>>]},{dt,[],[{code,[],[<<111,116,104,101,114>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,117,110,97,99,99,111,117,110,116,101,100,32,116,104,105,110,103,115,46>>]},{dt,[],[{code,[],[<<112,111,114,116>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,112,111,114,116,115,46>>]},{dt,[],[{code,[],[<<115,108,101,101,112>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,115,108,101,101,112,105,110,103,46>>]}]},{p,[],[<<77,111,114,101,32,102,105,110,101,45,103,114,97,105,110,101,100,32>>,{code,[],[<<77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101>>]},<<115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,116,104,114,111,117,103,104,32,99,111,110,102,105,103,117,114,101,32,40,115,117,99,104,32,97,115,32>>,{code,[],[<<46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,109,105,99,114,111,115,116,97,116,101,45,97,99,99,111,117,110,116,105,110,103,61,101,120,116,114,97>>]},<<41,46,32,69,110,97,98,108,105,110,103,32,116,104,101,115,101,32,115,116,97,116,101,115,32,99,97,117,115,101,115,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,32,119,104,101,110,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,32,97,110,100,32,105,110,99,114,101,97,115,101,115,32,116,104,101,32,111,118,101,114,104,101,97,100,32,119,104,101,110,32,105,116,32,105,115,32,116,117,114,110,101,100,32,111,110,46>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108,111,99>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,109,101,109,111,114,121,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,115,112,114,101,97,100,32,111,117,116,32,111,118,101,114,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,46>>]},{dt,[],[{code,[],[<<98,105,102>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,105,110,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<98,117,115,121,95,119,97,105,116>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,98,117,115,121,32,119,97,105,116,105,110,103,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,97,32,115,99,104,101,100,117,108,101,114,32,110,111,32,108,111,110,103,101,114,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,105,115,32,97,99,116,105,118,101,32,119,104,101,110,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41>>]}]},<<46,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,32,98,117,116,32,116,104,105,115,32,97,110,100,32,115,108,101,101,112,44,32,97,110,100,32,116,104,101,110,32,100,105,118,105,100,101,32,116,104,97,116,32,98,121,32,97,108,108,32,116,105,109,101,32,105,110,32,116,104,101,32,116,104,114,101,97,100,44,32,121,111,117,32,115,104,111,117,108,100,32,103,101,116,32,115,111,109,101,116,104,105,110,103,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32,116,104,101,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,102,114,97,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<111,116,104,101,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<101,116,115>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,84,83,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<103,99,95,102,117,108,108>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<103,99>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<110,105,102>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,105,110,32,78,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<115,101,110,100>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,40,112,114,111,99,101,115,115,101,115,32,111,110,108,121,41,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<116,105,109,101,114,115>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,116,105,109,101,114,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<111,116,104,101,114>>]},<<32,115,116,97,116,101,46>>]}]},{p,[],[<<84,104,101,32,117,116,105,108,105,116,121,32,109,111,100,117,108,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,117,110,116,105,109,101,95,116,111,111,108,115,58,109,115,97,99,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,115,97,99,99,40,51,41>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,111,114,101,32,101,97,115,105,108,121,32,97,110,97,108,121,115,101,32,116,104,101,115,101,32,115,116,97,116,105,115,116,105,99,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,115,121,115,116,101,109,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>]}]},<<32,105,115,32,116,117,114,110,101,100,32,111,102,102,46>>]},{p,[],[<<84,104,101,32,108,105,115,116,32,111,102,32,116,104,114,101,97,100,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,99,97,108,108,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,116,104,114,101,97,100,115,32,97,110,100,32,115,116,97,116,101,115,32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,119,105,116,104,111,117,116,32,97,110,121,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,54,48>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2544,bounded_fun,[{type,2544,'fun',[{type,2544,product,[{atom,2544,microstate_accounting}]},{type,2544,union,[{type,2544,list,[{var,2544,'MSAcc_Thread'}]},{atom,2544,undefined}]}]},[{type,2545,constraint,[{atom,2545,is_subtype},[{var,2545,'MSAcc_Thread'},{type,2545,map,[{type,2545,map_field_exact,[{atom,2545,type},{var,2545,'MSAcc_Thread_Type'}]},{type,2546,map_field_exact,[{atom,2546,id},{var,2546,'MSAcc_Thread_Id'}]},{type,2547,map_field_exact,[{atom,2547,counters},{var,2547,'MSAcc_Counters'}]}]}]]},{type,2548,constraint,[{atom,2548,is_subtype},[{var,2548,'MSAcc_Thread_Type'},{type,2548,union,[{atom,2548,async},{atom,2548,aux},{atom,2548,dirty_io_scheduler},{atom,2549,dirty_cpu_scheduler},{atom,2549,poll},{atom,2549,scheduler}]}]]},{type,2550,constraint,[{atom,2550,is_subtype},[{var,2550,'MSAcc_Thread_Id'},{type,2550,non_neg_integer,[]}]]},{type,2551,constraint,[{atom,2551,is_subtype},[{var,2551,'MSAcc_Counters'},{type,2551,map,[{type,2551,map_field_assoc,[{var,2551,'MSAcc_Thread_State'},{type,2551,non_neg_integer,[]}]}]}]]},{type,2552,constraint,[{atom,2552,is_subtype},[{var,2552,'MSAcc_Thread_State'},{type,2552,union,[{atom,2552,alloc},{atom,2552,aux},{atom,2552,bif},{atom,2552,busy_wait},{atom,2552,check_io},{atom,2553,emulator},{atom,2553,ets},{atom,2553,gc},{atom,2553,gc_fullsweep},{atom,2553,nif},{atom,2554,other},{atom,2554,port},{atom,2554,send},{atom,2554,sleep},{atom,2554,timers}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,101,100,117,99,116,105,111,110,115,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,46,10,123,50,48,52,54,44,49,49,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,53,32,40,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,41,44,32,116,104,105,115,32,118,97,108,117,101,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,114,101,100,117,99,116,105,111,110,115,32,112,101,114,102,111,114,109,101,100,32,105,110,32,99,117,114,114,101,110,116,32,116,105,109,101,32,115,108,105,99,101,115,32,111,102,32,99,117,114,114,101,110,116,108,121,32,115,99,104,101,100,117,108,101,100,32,112,114,111,99,101,115,115,101,115,46,32,73,102,32,97,110,32,101,120,97,99,116,32,118,97,108,117,101,32,105,115,32,119,97,110,116,101,100,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,57,48,51>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2555,bounded_fun,[{type,2555,'fun',[{type,2555,product,[{atom,2555,reductions}]},{type,2555,tuple,[{var,2555,'Total_Reductions'},{var,2556,'Reductions_Since_Last_Call'}]}]},[{type,2557,constraint,[{atom,2557,is_subtype},[{var,2557,'Total_Reductions'},{type,2557,non_neg_integer,[]}]]},{type,2558,constraint,[{atom,2558,is_subtype},[{var,2558,'Reductions_Since_Last_Call'},{type,2558,non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,108,101,110,103,116,104,32,111,102,32,97,108,108,32,110,111,114,109,97,108,32,97,110,100,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,97,116,32,105,115,44,32,113,117,101,117,101,100,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,105,115,32,109,117,99,104,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,99,111,109,112,97,114,101,100,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,97,32,108,97,114,103,101,32,97,109,111,117,110,116,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,117,115,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,57,50,50>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2559,'fun',[{type,2559,product,[{atom,2559,run_queue}]},{type,2559,non_neg_integer,[]}]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<32,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,114,117,110,32,113,117,101,117,101,115,32,119,105,116,104,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,57,51,56>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2560,bounded_fun,[{type,2560,'fun',[{type,2560,product,[{atom,2560,run_queue_lengths}]},{type,2560,list,[{var,2560,'RunQueueLength'}]}]},[{type,2561,constraint,[{atom,2561,is_subtype},[{var,2561,'RunQueueLength'},{type,2561,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,114,101,97,100,121,32,116,111,32,114,117,110,32,102,111,114,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,46,32,86,97,108,117,101,115,32,102,111,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,32,111,102,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,118,97,108,117,101,115,32,102,111,114,32,116,104,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,102,111,108,108,111,119,32,40,105,110,32,116,104,97,116,32,111,114,100,101,114,41,32,97,116,32,116,104,101,32,101,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,32,101,102,102,105,99,105,101,110,116,108,121,32,103,97,116,104,101,114,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32>>,{em,[],[<<110,111,116>>]},<<32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,57,53,51>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2562,bounded_fun,[{type,2562,'fun',[{type,2562,product,[{atom,2562,run_queue_lengths_all}]},{type,2562,list,[{var,2562,'RunQueueLength'}]}]},[{type,2563,constraint,[{atom,2563,is_subtype},[{var,2563,'RunQueueLength'},{type,2563,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,117,110,116,105,109,101,44,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46>>]},{p,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,102,111,114,32,97,108,108,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,110,100,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,119,97,108,108,32,99,108,111,99,107,32,116,105,109,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,118,97,108,117,101,32,109,105,103,104,116,32,119,114,97,112,32,100,117,101,32,116,111,32,108,105,109,105,116,97,116,105,111,110,115,32,105,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,116,104,97,116,32,105,115,32,117,115,101,100,46>>]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,116,105,109,101,41,46,10,123,49,54,57,48,44,49,54,50,48,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,57,57,54>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2564,bounded_fun,[{type,2564,'fun',[{type,2564,product,[{atom,2564,runtime}]},{type,2564,tuple,[{var,2564,'Total_Run_Time'},{var,2564,'Time_Since_Last_Call'}]}]},[{type,2565,constraint,[{atom,2565,is_subtype},[{var,2565,'Total_Run_Time'},{type,2565,non_neg_integer,[]}]]},{type,2566,constraint,[{atom,2566,is_subtype},[{var,2566,'Time_Since_Last_Call'},{type,2566,non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,119,105,116,104,32>>,{code,[],[<<123,83,99,104,101,100,117,108,101,114,73,100,44,32,65,99,116,105,118,101,84,105,109,101,44,32,84,111,116,97,108,84,105,109,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<83,99,104,101,100,117,108,101,114,73,100>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,73,68,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,44,32>>,{code,[],[<<65,99,116,105,118,101,84,105,109,101>>]},<<32,105,115,32,116,104,101,32,100,117,114,97,116,105,111,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,98,101,101,110,32,98,117,115,121,44,32,97,110,100,32>>,{code,[],[<<84,111,116,97,108,84,105,109,101>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,116,105,109,101,32,100,117,114,97,116,105,111,110,32,115,105,110,99,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]}]},<<32,97,99,116,105,118,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,46,32,78,111,116,101,32,116,104,97,116,32,97,99,116,105,118,97,116,105,111,110,32,116,105,109,101,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,32,119,104,105,108,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,32,115,111,109,101,32,116,105,109,101,32,97,102,116,101,114,32,116,104,101,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,110,97,98,108,101,100,46,32,84,104,101,32,116,105,109,101,32,117,110,105,116,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,99,97,110,32,98,101,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,98,101,116,119,101,101,110,32,114,101,108,101,97,115,101,115,44,32,79,83,115,44,32,97,110,100,32,115,121,115,116,101,109,32,114,101,115,116,97,114,116,115,46,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,97,108,99,117,108,97,116,101,32,114,101,108,97,116,105,118,101,32,118,97,108,117,101,115,32,102,111,114,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,46,32>>,{code,[],[<<65,99,116,105,118,101,84,105,109,101>>]},<<32,99,97,110,32,110,101,118,101,114,32,101,120,99,101,101,100,32>>,{code,[],[<<84,111,116,97,108,84,105,109,101>>]},<<46>>]},{p,[],[<<84,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,98,117,115,121,32,115,99,104,101,100,117,108,101,114,32,105,115,32,119,104,101,110,32,105,116,32,105,115,32,110,111,116,32,105,100,108,101,32,97,110,100,32,105,115,32,110,111,116,32,115,99,104,101,100,117,108,105,110,103,32,40,115,101,108,101,99,116,105,110,103,41,32,97,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,44,32,116,104,97,116,32,105,115,58>>]},{ul,[],[{li,[],[<<69,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,32,99,111,100,101>>]},{li,[],[<<69,120,101,99,117,116,105,110,103,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,111,114,32,78,73,70,32,99,111,100,101>>]},{li,[],[<<69,120,101,99,117,116,105,110,103,32,66,73,70,115,44,32,111,114,32,97,110,121,32,111,116,104,101,114,32,114,117,110,116,105,109,101,32,104,97,110,100,108,105,110,103>>]},{li,[],[<<71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103>>]},{li,[],[<<72,97,110,100,108,105,110,103,32,97,110,121,32,111,116,104,101,114,32,109,101,109,111,114,121,32,109,97,110,97,103,101,109,101,110,116>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,32,115,99,104,101,100,117,108,101,114,32,99,97,110,32,97,108,115,111,32,98,101,32,98,117,115,121,32,101,118,101,110,32,105,102,32,116,104,101,32,79,83,32,104,97,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,115,121,115,116,101,109,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]}]},<<32,105,115,32,116,117,114,110,101,100,32,111,102,102,46>>]},{p,[],[<<84,104,101,32,108,105,115,116,32,111,102,32,115,99,104,101,100,117,108,101,114,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,99,97,108,108,115,46>>]},{p,[],[<<65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,97,108,115,111,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,97,108,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,116,104,97,116,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,104,97,110,100,108,101,32,67,80,85,32,98,111,117,110,100,32,119,111,114,107,46,32,73,102,32,121,111,117,32,97,108,115,111,32,119,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41>>]}]},<<32,105,110,115,116,101,97,100,46>>]},{p,[],[<<78,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<49,32,61,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46,32,68,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,104,97,110,100,108,101,32,115,112,101,99,105,102,105,99,32,116,121,112,101,115,32,111,102,32,106,111,98,115,46,32,69,118,101,114,121,32,106,111,98,32,105,115,32,97,115,115,105,103,110,101,100,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,32,116,121,112,101,46,32,74,111,98,115,32,99,97,110,32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,116,104,101,32,115,97,109,101,32,116,121,112,101,44,32,98,117,116,32,110,101,118,101,114,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,46,32,84,104,105,115,32,102,97,99,116,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,117,110,100,101,114,32,99,111,110,115,105,100,101,114,97,116,105,111,110,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,46>>]}]},{p,[],[<<85,115,105,110,103,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,116,111,32,99,97,108,99,117,108,97,116,101,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41,46,10,102,97,108,115,101,10,62,32,84,115,48,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,111,107>>]}]},{p,[],[<<83,111,109,101,32,116,105,109,101,32,108,97,116,101,114,32,116,104,101,32,117,115,101,114,32,116,97,107,101,115,32,97,110,111,116,104,101,114,32,115,110,97,112,115,104,111,116,32,97,110,100,32,99,97,108,99,117,108,97,116,101,115,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,112,101,114,32,115,99,104,101,100,117,108,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,84,115,49,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,111,107,10,62,32,108,105,115,116,115,58,109,97,112,40,102,117,110,40,123,123,73,44,32,65,48,44,32,84,48,125,44,32,123,73,44,32,65,49,44,32,84,49,125,125,41,32,45,62,10,9,123,73,44,32,40,65,49,32,45,32,65,48,41,47,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,46,10,91,123,49,44,48,46,57,55,52,51,52,55,52,55,51,48,49,55,55,53,52,56,125,44,10,32,123,50,44,48,46,57,55,52,52,56,52,51,55,56,50,55,53,49,52,52,52,125,44,10,32,123,51,44,48,46,57,57,57,53,57,48,50,51,54,49,54,54,57,48,52,53,125,44,10,32,123,52,44,48,46,57,55,51,56,48,49,50,53,57,54,53,55,50,49,54,49,125,44,10,32,123,53,44,48,46,57,55,49,55,57,53,54,54,54,55,48,49,56,49,48,51,125,44,10,32,123,54,44,48,46,57,55,51,57,50,51,53,56,52,54,52,50,48,55,52,49,125,44,10,32,123,55,44,48,46,57,55,51,50,51,55,48,51,51,48,55,55,56,55,54,125,44,10,32,123,56,44,48,46,57,55,52,49,50,57,55,50,57,51,50,52,56,54,53,54,125,93>>]}]},{p,[],[<<85,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,110,97,112,115,104,111,116,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,97,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,58>>]},{pre,[],[{code,[],[<<62,32,123,65,44,32,84,125,32,61,32,108,105,115,116,115,58,102,111,108,100,108,40,102,117,110,40,123,123,95,44,32,65,48,44,32,84,48,125,44,32,123,95,44,32,65,49,44,32,84,49,125,125,44,32,123,65,105,44,84,105,125,41,32,45,62,10,9,123,65,105,32,43,32,40,65,49,32,45,32,65,48,41,44,32,84,105,32,43,32,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,123,48,44,32,48,125,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,44,10,9,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,65,47,84,46,10,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53>>]}]},{p,[],[<<84,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,101,113,117,97,108,32>>,{code,[],[<<49,46,48>>]},<<32,119,104,101,110,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,101,101,110,32,97,99,116,105,118,101,32,97,108,108,32,116,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,32,116,119,111,32,109,101,97,115,117,114,101,109,101,110,116,115,46>>]},{p,[],[<<65,110,111,116,104,101,114,32,40,112,114,111,98,97,98,108,121,32,109,111,114,101,41,32,117,115,101,102,117,108,32,118,97,108,117,101,32,105,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,101,105,103,104,116,101,100,32,97,103,97,105,110,115,116,32,109,97,120,105,109,117,109,32,97,109,111,117,110,116,32,111,102,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,58>>]},{pre,[],[{code,[],[<<62,32,87,101,105,103,104,116,101,100,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,40,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,32,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,41,46,10,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53>>]}]},{p,[],[<<84,104,105,115,32,119,101,105,103,104,116,101,100,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,114,101,97,99,104,32>>,{code,[],[<<49,46,48>>]},<<32,119,104,101,110,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,101,32,116,104,101,32,115,97,109,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,97,115,32,109,97,120,105,109,117,109,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,46,32,73,102,32,109,111,114,101,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,32,116,104,97,110,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,118,97,108,117,101,32,109,97,121,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32>>,{code,[],[<<49,46,48>>]},<<46>>]},{p,[],[<<65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,97,115,32,100,101,102,97,117,108,116,32,104,97,118,101,32,109,111,114,101,32,115,99,104,101,100,117,108,101,114,115,32,116,104,97,110,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,105,115,32,100,117,101,32,116,111,32,116,104,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,100,105,115,97,98,108,101,100,46,32,84,111,32,101,110,97,98,108,101,32,105,116,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,48,49,52>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2567,bounded_fun,[{type,2567,'fun',[{type,2567,product,[{atom,2567,scheduler_wall_time}]},{type,2567,union,[{type,2567,list,[{type,2567,tuple,[{var,2567,'SchedulerId'},{var,2567,'ActiveTime'},{var,2567,'TotalTime'}]}]},{atom,2567,undefined}]}]},[{type,2568,constraint,[{atom,2568,is_subtype},[{var,2568,'SchedulerId'},{type,2568,pos_integer,[]}]]},{type,2569,constraint,[{atom,2569,is_subtype},[{var,2569,'ActiveTime'},{type,2569,non_neg_integer,[]}]]},{type,2570,constraint,[{atom,2570,is_subtype},[{var,2570,'TotalTime'},{type,2570,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41>>]}]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,115,111,32,105,110,99,108,117,100,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,108,108,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,46>>]},{p,[],[<<68,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},{code,[],[<<32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},{code,[],[<<32,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,119,111,114,107,32,101,120,101,99,117,116,105,110,103,32,111,110,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,109,97,105,110,108,121,32,119,97,105,116,32,102,111,114,32,73,47,79,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,32,121,111,117,32,103,101,116,32,104,105,103,104,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,111,110,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,44,32,67,80,85,32,117,116,105,108,105,122,97,116,105,111,110,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,104,105,103,104,32,100,117,101,32,116,111,32,116,104,105,115,32,119,111,114,107,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,51,56>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2571,bounded_fun,[{type,2571,'fun',[{type,2571,product,[{atom,2571,scheduler_wall_time_all}]},{type,2571,union,[{type,2571,list,[{type,2571,tuple,[{var,2571,'SchedulerId'},{var,2571,'ActiveTime'},{var,2571,'TotalTime'}]}]},{atom,2571,undefined}]}]},[{type,2572,constraint,[{atom,2572,is_subtype},[{var,2572,'SchedulerId'},{type,2572,pos_integer,[]}]]},{type,2573,constraint,[{atom,2573,is_subtype},[{var,2573,'ActiveTime'},{type,2573,non_neg_integer,[]}]]},{type,2574,constraint,[{atom,2574,is_subtype},[{var,2574,'TotalTime'},{type,2574,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,54,54>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2575,bounded_fun,[{type,2575,'fun',[{type,2575,product,[{atom,2575,total_active_tasks}]},{var,2575,'ActiveTasks'}]},[{type,2576,constraint,[{atom,2576,is_subtype},[{var,2576,'ActiveTasks'},{type,2576,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,55,55>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2577,bounded_fun,[{type,2577,'fun',[{type,2577,product,[{atom,2577,total_active_tasks_all}]},{var,2577,'ActiveTasks'}]},[{type,2578,constraint,[{atom,2578,is_subtype},[{var,2578,'ActiveTasks'},{type,2578,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,56,56>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2579,bounded_fun,[{type,2579,'fun',[{type,2579,product,[{atom,2579,total_run_queue_lengths}]},{var,2579,'TotalRunQueueLengths'}]},[{type,2580,constraint,[{atom,2580,is_subtype},[{var,2580,'TotalRunQueueLengths'},{type,2580,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,57,57>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2581,bounded_fun,[{type,2581,'fun',[{type,2581,product,[{atom,2581,total_run_queue_lengths_all}]},{var,2581,'TotalRunQueueLengths'}]},[{type,2582,constraint,[{atom,2582,is_subtype},[{var,2582,'TotalRunQueueLengths'},{type,2582,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2528}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,119,97,108,108,32,99,108,111,99,107,46,32>>,{code,[],[<<119,97,108,108,95,99,108,111,99,107>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,115,97,109,101,32,109,97,110,110,101,114,32,97,115,32>>,{code,[],[<<114,117,110,116,105,109,101>>]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,114,101,97,108,32,116,105,109,101,32,105,115,32,109,101,97,115,117,114,101,100,32,97,115,32,111,112,112,111,115,101,100,32,116,111,32,114,117,110,116,105,109,101,32,111,114,32,67,80,85,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,50,49,48>>,signature => [{attribute,2528,spec,{{statistics,1},[{type,2583,bounded_fun,[{type,2583,'fun',[{type,2583,product,[{atom,2583,wall_clock}]},{type,2583,tuple,[{var,2583,'Total_Wallclock_Time'},{var,2584,'Wallclock_Time_Since_Last_Call'}]}]},[{type,2585,constraint,[{atom,2585,is_subtype},[{var,2585,'Total_Wallclock_Time'},{type,2585,non_neg_integer,[]}]]},{type,2586,constraint,[{atom,2586,is_subtype},[{var,2586,'Wallclock_Time_Since_Last_Call'},{type,2586,non_neg_integer,[]}]]}]]}]}}]}},{{function,suspend_process,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1942}],[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>],#{<<101,110>> => [{p,[],[<<83,117,115,112,101,110,100,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,44,32,91,93,41>>]}]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,50,50,49>>,signature => [{attribute,1942,spec,{{erlang,suspend_process,1},[{type,1942,bounded_fun,[{type,1942,'fun',[{type,1942,product,[{var,1942,'Suspendee'}]},{atom,1942,true}]},[{type,1943,constraint,[{atom,1943,is_subtype},[{var,1943,'Suspendee'},{type,1943,pid,[]}]]}]]}]}}]}},{{function,suspend_process,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1926}],[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>],#{<<101,110>> => [{p,[],[<<73,110,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,97,110,100,32,112,117,116,115,32,105,116,32,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,32,105,102,32,105,116,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,105,110,32,116,104,97,116,32,115,116,97,116,101,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,99,104,101,100,117,108,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,117,110,116,105,108,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,115,117,109,101,100,46>>]},{p,[],[<<65,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,98,121,32,109,117,108,116,105,112,108,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,98,121,32,97,32,115,105,110,103,108,101,32,112,114,111,99,101,115,115,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,108,101,97,118,101,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,32,117,110,116,105,108,32,105,116,115,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,114,101,97,99,104,101,115,32,122,101,114,111,46,32,84,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,102,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]}]},<<32,105,115,32,99,97,108,108,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]},<<46,32,65,108,108,32,105,110,99,114,101,97,115,101,100,32,115,117,115,112,101,110,100,32,99,111,117,110,116,115,32,111,110,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,97,99,113,117,105,114,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,97,114,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,46>>]},{p,[],[<<79,112,116,105,111,110,115,32,40>>,{code,[],[<<79,112,116>>]},<<115,41,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]}]},{dd,[],[{p,[],[<<65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,101,118,101,110,116,117,97,108,108,121,32,115,117,115,112,101,110,100,115,32,117,110,108,101,115,115,32,105,116,32,105,115,32,114,101,115,117,109,101,100,32,98,101,102,111,114,101,32,105,116,32,99,111,117,108,100,32,115,117,115,112,101,110,100,46,32,84,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<32,114,101,116,117,114,110,115,32,105,109,109,101,100,105,97,116,101,108,121,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,115,117,115,112,101,110,100,101,100,32,121,101,116,32,111,114,32,110,111,116,46,32,84,104,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,119,104,101,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,115,117,115,112,101,110,100,115,32,99,97,110,110,111,116,32,98,101,32,100,101,100,117,99,101,100,32,102,114,111,109,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32>>,{em,[],[<<101,118,101,110,116,117,97,108,108,121>>]},<<32,115,117,115,112,101,110,100,115,32,40,117,110,108,101,115,115,32,105,116,32,105,115,32,114,101,115,117,109,101,100,41,46,32,73,102,32,110,111,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,111,112,116,105,111,110,115,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,115,117,115,112,101,110,100,101,100,46>>]}]},{dt,[],[{code,[],[<<123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125>>]}]},{dd,[],[{p,[],[<<65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,84,104,101,32,114,101,112,108,121,32,105,115,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,82,101,112,108,121,84,97,103,44,32,83,116,97,116,101,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<83,116,97,116,101>>]},<<32,105,115,32,101,105,116,104,101,114,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,105,116,101,100>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,101,120,105,116,101,100,46>>]}]},{dt,[],[{code,[],[<<115,117,115,112,101,110,100,101,100>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,119,32,115,117,115,112,101,110,100,101,100,46>>]}]},{dt,[],[{code,[],[<<110,111,116,95,115,117,115,112,101,110,100,101,100>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,104,97,112,112,101,110,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,115,117,101,100,32,116,104,105,115,32,114,101,113,117,101,115,116,44,32,104,97,118,101,32,99,97,108,108,101,100,32>>,{code,[],[<<114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]},<<32,98,101,102,111,114,101,32,103,101,116,116,105,110,103,32,116,104,101,32,114,101,112,108,121,46>>]}]}]},{p,[],[<<65,112,112,97,114,116,32,102,114,111,109,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,44,32,116,104,101,32>>,{code,[],[<<123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125>>]},<<32,111,112,116,105,111,110,32,98,101,104,97,118,101,115,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,111,112,116,105,111,110,32,119,105,116,104,111,117,116,32,114,101,112,108,121,32,116,97,103,46>>]}]},{dt,[],[{code,[],[<<117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32,73,102,32>>,{code,[],[<<117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103>>]},<<32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<44,32,97,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,111,114,32,105,102,32,97,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,104,97,115,32,98,101,101,110,32,115,101,110,116,32,97,110,100,32,105,115,32,105,110,32,116,114,97,110,115,105,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<44,32,111,114,32,105,102,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,97,110,100,32,97,32,115,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,105,115,32,105,110,32,116,114,97,110,115,105,116,44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,114,101,109,97,105,110,115,32,117,110,99,104,97,110,103,101,100,46>>]}]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,105,110,99,114,101,97,115,101,100,44,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<89,111,117,32,99,97,110,32,101,97,115,105,108,121,32,99,114,101,97,116,101,32,100,101,97,100,108,111,99,107,115,32,105,102,32,112,114,111,99,101,115,115,101,115,32,115,117,115,112,101,110,100,115,32,101,97,99,104,32,111,116,104,101,114,32,40,100,105,114,101,99,116,108,121,32,111,114,32,105,110,32,99,105,114,99,108,101,115,41,46,32,73,110,32,69,82,84,83,32,118,101,114,115,105,111,110,115,32,112,114,105,111,114,32,116,111,32,69,82,84,83,32,118,101,114,115,105,111,110,32,49,48,46,48,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,112,114,101,118,101,110,116,101,100,32,115,117,99,104,32,100,101,97,100,108,111,99,107,115,44,32,98,117,116,32,116,104,105,115,32,112,114,101,118,101,110,116,105,111,110,32,104,97,115,32,110,111,119,32,98,101,101,110,32,114,101,109,111,118,101,100,32,100,117,101,32,116,111,32,112,101,114,102,111,114,109,97,110,99,101,32,114,101,97,115,111,110,115,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,114,101,115,105,100,101,115,32,111,110,32,97,110,111,116,104,101,114,32,110,111,100,101,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,76,105,115,116>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116>>]},<<115,46>>]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,109,111,114,101,32,116,105,109,101,115,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,116,104,97,110,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,105,110,116,101,114,110,97,108,32,100,97,116,97,32,115,116,114,117,99,116,117,114,101,115,46,32,84,104,101,32,115,121,115,116,101,109,32,108,105,109,105,116,32,105,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,50,44,48,48,48,44,48,48,48,44,48,48,48,32,115,117,115,112,101,110,100,115,32,97,110,100,32,119,105,108,108,32,110,101,118,101,114,32,98,101,32,108,111,119,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,50,51,54>>,signature => [{attribute,1926,spec,{{erlang,suspend_process,2},[{type,1926,bounded_fun,[{type,1926,'fun',[{type,1926,product,[{var,1926,'Suspendee'},{var,1926,'OptList'}]},{type,1926,boolean,[]}]},[{type,1927,constraint,[{atom,1927,is_subtype},[{var,1927,'Suspendee'},{type,1927,pid,[]}]]},{type,1928,constraint,[{atom,1928,is_subtype},[{var,1928,'OptList'},{type,1928,list,[{var,1928,'Opt'}]}]]},{type,1929,constraint,[{atom,1929,is_subtype},[{var,1929,'Opt'},{type,1929,union,[{atom,1929,unless_suspending},{atom,1929,asynchronous},{type,1929,tuple,[{atom,1929,asynchronous},{type,1929,term,[]}]}]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,105,110,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<39,69,88,73,84,39>>]},<<32,116,117,112,108,101,115,46,32,84,104,101,32,102,108,97,103,32,97,108,115,111,32,108,105,109,105,116,115,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111>>]},<<32,105,116,101,109,32>>,{code,[],[<<99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,46>>]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,51,56,50>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2606,bounded_fun,[{type,2606,'fun',[{type,2606,product,[{atom,2606,backtrace_depth},{var,2606,'Depth'}]},{var,2606,'OldDepth'}]},[{type,2607,constraint,[{atom,2607,is_subtype},[{var,2607,'Depth'},{type,2607,non_neg_integer,[]}]]},{type,2608,constraint,[{atom,2608,is_subtype},[{var,2608,'OldDepth'},{type,2608,non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<99,112,117,95,116,111,112,111,108,111,103,121>>}],[]},{li,[{name,<<105,110,102,111,95,108,105,115,116>>}],[]},{li,[{name,<<108,101,118,101,108,95,101,110,116,114,121>>}],[]},{li,[{name,<<108,101,118,101,108,95,116,97,103>>}],[]},{li,[{name,<<115,117,98,95,108,101,118,101,108>>}],[]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[{em,[],[<<84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46>>]},<<32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,67,80,85,32,116,111,112,111,108,111,103,121,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46>>]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<46,32,84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,118,101,114,114,105,100,101,115,32,97,110,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,46,32,66,121,32,112,97,115,115,105,110,103,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,97,115,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<44,32,116,104,101,32,115,121,115,116,101,109,32,114,101,118,101,114,116,115,32,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,101,113,117,97,108,115,32,116,104,101,32,118,97,108,117,101,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41>>]},<<32,98,101,102,111,114,101,32,116,104,101,32,99,104,97,110,103,101,32,119,97,115,32,109,97,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,73,102,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,108,114,101,97,100,121,32,98,111,117,110,100,32,119,104,101,110,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,99,104,97,110,103,101,100,44,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,115,101,110,116,32,97,32,114,101,113,117,101,115,116,32,116,111,32,114,101,98,105,110,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,110,101,119,32,67,80,85,32,116,111,112,111,108,111,103,121,46>>]},{p,[],[<<84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,121,112,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,97,110,100,32,109,111,114,101,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41>>]}]},<<32,97,115,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,51,57,52>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2609,bounded_fun,[{type,2609,'fun',[{type,2609,product,[{atom,2609,cpu_topology},{var,2609,'CpuTopology'}]},{var,2609,'OldCpuTopology'}]},[{type,2610,constraint,[{atom,2610,is_subtype},[{var,2610,'CpuTopology'},{user_type,2610,cpu_topology,[]}]]},{type,2611,constraint,[{atom,2611,is_subtype},[{var,2611,'OldCpuTopology'},{user_type,2611,cpu_topology,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,32>>,{code,[],[<<49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,104,97,110,103,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,111,110,108,105,110,101,44,32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>]},<<32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,52,52,50>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2612,bounded_fun,[{type,2612,'fun',[{type,2612,product,[{atom,2612,dirty_cpu_schedulers_online},{var,2612,'DirtyCPUSchedulersOnline'}]},{var,2613,'OldDirtyCPUSchedulersOnline'}]},[{type,2614,constraint,[{atom,2614,is_subtype},[{var,2614,'DirtyCPUSchedulersOnline'},{type,2614,pos_integer,[]}]]},{type,2615,constraint,[{atom,2615,is_subtype},[{var,2615,'OldDirtyCPUSchedulersOnline'},{type,2615,pos_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<46,32>>,{code,[],[<<65,108,108,111,99>>]},<<32,105,115,32,116,104,101,32,97,108,108,111,99,97,116,111,114,32,116,111,32,97,102,102,101,99,116,44,32,102,111,114,32,101,120,97,109,112,108,101,32>>,{code,[],[<<98,105,110,97,114,121,95,97,108,108,111,99>>]},<<46,32>>,{code,[],[<<70>>]},<<32,105,115,32,116,104,101,32,102,108,97,103,32,116,111,32,99,104,97,110,103,101,32,97,110,100,32>>,{code,[],[<<86>>]},<<32,105,115,32,116,104,101,32,110,101,119,32,118,97,108,117,101,46>>]},{p,[],[<<79,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,97,108,108,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99>>]},<<32,102,108,97,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,32,116,105,109,101,46,32,84,104,105,115,32,115,117,98,115,101,116,32,105,115,32,99,117,114,114,101,110,116,108,121,32,111,110,108,121,32,116,104,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99,35,77,95,115,98,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<115,98,99,116>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,116,104,101,32,102,108,97,103,32,119,97,115,32,115,101,116,32,111,114,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,105,102,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,52,55,49>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2616,bounded_fun,[{type,2616,'fun',[{type,2616,product,[{atom,2616,erts_alloc},{type,2616,tuple,[{var,2616,'Alloc'},{var,2616,'F'},{var,2616,'V'}]}]},{type,2616,union,[{atom,2616,ok},{atom,2616,notsup}]}]},[{type,2617,constraint,[{atom,2617,is_subtype},[{var,2617,'Alloc'},{type,2617,atom,[]}]]},{type,2618,constraint,[{atom,2618,is_subtype},[{var,2618,'F'},{type,2618,atom,[]}]]},{type,2619,constraint,[{atom,2619,is_subtype},[{var,2619,'V'},{type,2619,integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,50,46,51>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<46,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,105,115,32,97,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,32,105,110,100,105,99,97,116,105,110,103,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,100,111,110,101,32,119,105,116,104,111,117,116,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,32,99,111,108,108,101,99,116,105,111,110,46,32,84,104,101,32,118,97,108,117,101,32,97,112,112,108,105,101,115,32,116,111,32,110,101,119,32,112,114,111,99,101,115,115,101,115,44,32,119,104,105,108,101,32,112,114,111,99,101,115,115,101,115,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<73,110,32,108,111,119,45,109,101,109,111,114,121,32,115,121,115,116,101,109,115,32,40,101,115,112,101,99,105,97,108,108,121,32,119,105,116,104,111,117,116,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,41,44,32,115,101,116,116,105,110,103,32,116,104,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<48>>]},<<32,99,97,110,32,104,101,108,112,32,116,111,32,99,111,110,115,101,114,118,101,32,109,101,109,111,114,121,46>>]},{p,[],[<<84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,116,104,114,111,117,103,104,32,40,79,83,41,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,32>>,{code,[],[<<69,82,76,95,70,85,76,76,83,87,69,69,80,95,65,70,84,69,82>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,52,56,56>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2620,bounded_fun,[{type,2620,'fun',[{type,2620,product,[{atom,2620,fullsweep_after},{var,2620,'Number'}]},{var,2620,'OldNumber'}]},[{type,2621,constraint,[{atom,2621,is_subtype},[{var,2621,'Number'},{type,2621,non_neg_integer,[]}]]},{type,2622,constraint,[{atom,2622,is_subtype},[{var,2622,'OldNumber'},{type,2622,non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<84,117,114,110,115,32,111,110,47,111,102,102,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,109,101,97,115,117,114,101,109,101,110,116,115,46,32,87,104,101,110,32,112,97,115,115,105,110,103,32,114,101,115,101,116,44,32,97,108,108,32,99,111,117,110,116,101,114,115,32,97,114,101,32,114,101,115,101,116,32,116,111,32,48,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,48,55>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2623,bounded_fun,[{type,2623,'fun',[{type,2623,product,[{atom,2623,microstate_accounting},{var,2623,'Action'}]},{var,2623,'OldState'}]},[{type,2624,constraint,[{atom,2624,is_subtype},[{var,2624,'Action'},{type,2624,union,[{atom,2624,true},{atom,2624,false},{atom,2624,reset}]}]]},{type,2625,constraint,[{atom,2625,is_subtype},[{var,2625,'OldState'},{type,2625,union,[{atom,2625,true},{atom,2625,false}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32>>,{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]},<<32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32>>,{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]},<<32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32>>,{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,50,49>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2626,bounded_fun,[{type,2626,'fun',[{type,2626,product,[{atom,2626,min_heap_size},{var,2626,'MinHeapSize'}]},{var,2626,'OldMinHeapSize'}]},[{type,2627,constraint,[{atom,2627,is_subtype},[{var,2627,'MinHeapSize'},{type,2627,non_neg_integer,[]}]]},{type,2628,constraint,[{atom,2628,is_subtype},[{var,2628,'OldMinHeapSize'},{type,2628,non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32>>,{code,[],[<<109,105,110,95,98,105,110,95,118,104,104,101,97,112,95,115,105,122,101>>]},<<32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32>>,{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]},<<32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32>>,{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,50,44,51,44,52>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,51,54>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2629,bounded_fun,[{type,2629,'fun',[{type,2629,product,[{atom,2629,min_bin_vheap_size},{var,2629,'MinBinVHeapSize'}]},{var,2630,'OldMinBinVHeapSize'}]},[{type,2631,constraint,[{atom,2631,is_subtype},[{var,2631,'MinBinVHeapSize'},{type,2631,non_neg_integer,[]}]]},{type,2632,constraint,[{atom,2632,is_subtype},[{var,2632,'OldMinBinVHeapSize'},{type,2632,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,101,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,50,44,51,44,52>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,53,51>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2633,bounded_fun,[{type,2633,'fun',[{type,2633,product,[{atom,2633,max_heap_size},{var,2633,'MaxHeapSize'}]},{var,2633,'OldMaxHeapSize'}]},[{type,2634,constraint,[{atom,2634,is_subtype},[{var,2634,'MaxHeapSize'},{user_type,2634,max_heap_size,[]}]]},{type,2635,constraint,[{atom,2635,is_subtype},[{var,2635,'OldMaxHeapSize'},{user_type,2635,max_heap_size,[]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,77,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,99,97,110,32,98,101,32,98,108,111,99,107,101,100,32,105,110,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,69,105,116,104,101,114,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,44,32,111,114,32,97,108,108,32>>,{em,[],[<<110,111,114,109,97,108>>]},<<32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,46,32,87,104,101,110,32,111,110,108,121,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,108,111,99,107,101,100,44,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,102,114,101,101,32,116,111,32,99,111,110,116,105,110,117,101,32,116,111,32,115,99,104,101,100,117,108,101,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107>>]},<<44,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,101,32,97,110,100,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,46,32,73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107>>]},<<32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,32,98,108,111,99,107,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107,95,110,111,114,109,97,108>>]},<<44,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,111,110,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,44,32,98,117,116,32,109,117,108,116,105,112,108,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,99,97,110,32,101,120,101,99,117,116,101,46,32,73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107,95,110,111,114,109,97,108>>]},<<32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,32,98,108,111,99,107,115,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46>>]},{p,[],[<<79,110,101,32,112,114,111,99,101,115,115,32,99,97,110,32,98,108,111,99,107,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,44,32,105,116,32,109,117,115,116,32,117,110,98,108,111,99,107,32,101,120,97,99,116,108,121,32,97,115,32,109,97,110,121,32,116,105,109,101,115,32,97,115,32,105,116,32,104,97,115,32,98,108,111,99,107,101,100,32,98,101,102,111,114,101,32,105,116,32,104,97,115,32,114,101,108,101,97,115,101,100,32,105,116,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,98,108,111,99,107,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,111,114,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,101,120,105,116,115,44,32,105,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,108,101,97,115,101,115,32,105,116,115,32,98,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<44,32>>,{code,[],[<<98,108,111,99,107,101,100>>]},<<44,32>>,{code,[],[<<98,108,111,99,107,101,100,95,110,111,114,109,97,108>>]},<<44,32,111,114,32>>,{code,[],[<<101,110,97,98,108,101,100>>]},<<46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,115,116,97,116,101,32,106,117,115,116,32,97,102,116,101,114,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]},<<32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,110,111,114,109,97,108,108,121,32,110,111,116,32,110,101,101,100,101,100,46,32,73,102,32,121,111,117,32,102,101,101,108,32,116,104,97,116,32,121,111,117,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,101,115,101,32,102,101,97,116,117,114,101,115,44,32,99,111,110,115,105,100,101,114,32,105,116,32,97,32,102,101,119,32,109,111,114,101,32,116,105,109,101,115,32,97,103,97,105,110,46,32,66,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,97,115,32,97,32,108,97,115,116,32,114,101,115,111,114,116,44,32,97,115,32,105,116,32,105,115,32,109,111,115,116,32,108,105,107,101,108,121,32,97,32>>,{em,[],[<<118,101,114,121,32,105,110,101,102,102,105,99,105,101,110,116>>]},<<32,119,97,121,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,114,111,98,108,101,109,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,55,49>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2636,bounded_fun,[{type,2636,'fun',[{type,2636,product,[{atom,2636,multi_scheduling},{var,2636,'BlockState'}]},{var,2636,'OldBlockState'}]},[{type,2637,constraint,[{atom,2637,is_subtype},[{var,2637,'BlockState'},{type,2637,union,[{atom,2637,block},{atom,2637,unblock},{atom,2637,block_normal},{atom,2637,unblock_normal}]}]]},{type,2638,constraint,[{atom,2638,is_subtype},[{var,2638,'OldBlockState'},{type,2638,union,[{atom,2638,blocked},{atom,2638,disabled},{atom,2638,enabled}]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>}],[]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[{em,[],[<<84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46>>]},<<32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,87,104,101,110,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46>>]}]},{p,[],[<<67,111,110,116,114,111,108,115,32,105,102,32,97,110,100,32,104,111,119,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]},{p,[],[<<87,104,101,110,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,44,32,72,111,119,41>>]},<<32,105,115,32,99,97,108,108,101,100,44,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,44,32,99,97,117,115,105,110,103,32,116,104,101,109,32,116,111,32,116,114,121,32,116,111,32,98,105,110,100,32,111,114,32,117,110,98,105,110,100,32,97,115,32,114,101,113,117,101,115,116,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,102,97,105,108,115,32,116,111,32,98,105,110,100,44,32,116,104,105,115,32,105,115,32,111,102,116,101,110,32,115,105,108,101,110,116,108,121,32,105,103,110,111,114,101,100,44,32,97,115,32,105,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,32,116,111,32,118,101,114,105,102,121,32,118,97,108,105,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,46,32,73,102,32,97,110,32,101,114,114,111,114,32,105,115,32,114,101,112,111,114,116,101,100,44,32,97,110,32,101,114,114,111,114,32,101,118,101,110,116,32,105,115,32,108,111,103,103,101,100,46,32,84,111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,111,117,110,100,32,97,115,32,114,101,113,117,101,115,116,101,100,44,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<46>>]}]},{p,[],[<<83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,111,110,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,44,32,98,117,116,32,109,111,114,101,32,115,121,115,116,101,109,115,32,119,105,108,108,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,115,46>>]},{p,[],[<<73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,111,32,98,101,32,97,98,108,101,32,116,111,32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,109,117,115,116,32,98,101,32,107,110,111,119,110,46,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,102,97,105,108,115,32,116,111,32,100,101,116,101,99,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,44,32,105,116,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,111,101,115,32,98,121,32,100,101,102,97,117,108,116,32>>,{em,[],[<<110,111,116>>]},<<32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,116,104,101,32,111,110,108,121,32,79,83,32,112,114,111,99,101,115,115,32,98,105,110,100,105,110,103,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,105,109,112,114,111,118,101,115,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,116,104,101,114,32,79,83,32,112,114,111,99,101,115,115,101,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,110,111,116,104,101,114,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,108,115,111,32,98,105,110,100,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,105,110,115,116,101,97,100,46,32,83,111,109,101,116,105,109,101,115,32,116,104,105,115,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,99,97,110,32,98,101,32,115,101,118,101,114,101,46,32,73,102,32,115,111,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,110,111,116,32,98,105,110,100,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,46>>]}]},{p,[],[<<83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,105,110,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,65,114,103,117,109,101,110,116,32>>,{code,[],[<<72,111,119>>]},<<32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,97,110,100,32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<117,110,98,111,117,110,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,117>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,110,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<116,104,114,101,97,100,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,116,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,112,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,95,110,111,100,101,95,116,104,114,101,97,100,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,110,110,116,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,110,110,112,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<116,104,114,101,97,100,95,110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,116,110,110,112,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<100,101,102,97,117,108,116,95,98,105,110,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,100,98>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,101,113,117,97,108,115,32>>,{code,[],[<<72,111,119>>]},<<32,98,101,102,111,114,101,32,102,108,97,103,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>]},<<32,119,97,115,32,99,104,97,110,103,101,100,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[<<73,102,32,98,105,110,100,105,110,103,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<72,111,119>>]},<<32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,100,111,99,117,109,101,110,116,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,46>>]}]},{p,[],[<<84,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<44,32,97,115,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,54,50,55>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2639,bounded_fun,[{type,2639,'fun',[{type,2639,product,[{atom,2639,scheduler_bind_type},{var,2639,'How'}]},{var,2639,'OldBindType'}]},[{type,2640,constraint,[{atom,2640,is_subtype},[{var,2640,'How'},{type,2640,union,[{user_type,2640,scheduler_bind_type,[]},{atom,2640,default_bind}]}]]},{type,2641,constraint,[{atom,2641,is_subtype},[{var,2641,'OldBindType'},{user_type,2641,scheduler_bind_type,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,55,53,52>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2642,bounded_fun,[{type,2642,'fun',[{type,2642,product,[{atom,2642,scheduler_wall_time},{var,2642,'Boolean'}]},{var,2642,'OldBoolean'}]},[{type,2643,constraint,[{atom,2643,is_subtype},[{var,2643,'Boolean'},{type,2643,boolean,[]}]]},{type,2644,constraint,[{atom,2644,is_subtype},[{var,2644,'OldBoolean'},{type,2644,boolean,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,32>>,{code,[],[<<49,32,60,61,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<73,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,32,115,117,112,112,111,114,116,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115>>]},<<44,32,99,104,97,110,103,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,97,108,115,111,32,99,104,97,110,103,101,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,111,110,108,105,110,101,44,32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>]},<<32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,55,54,55>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2645,bounded_fun,[{type,2645,'fun',[{type,2645,product,[{atom,2645,schedulers_online},{var,2645,'SchedulersOnline'}]},{var,2646,'OldSchedulersOnline'}]},[{type,2647,constraint,[{atom,2647,is_subtype},[{var,2647,'SchedulersOnline'},{type,2647,pos_integer,[]}]]},{type,2648,constraint,[{atom,2648,is_subtype},[{var,2648,'OldSchedulersOnline'},{type,2648,pos_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,119,105,108,108,32,114,101,99,101,105,118,101,32,116,104,101,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,46,32,73,102,32,115,101,116,32,116,111,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<44,32,97,108,108,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,84,104,101,32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,105,110,32,116,104,101,32,102,111,114,109,97,116,58>>]},{pre,[],[{code,[],[<<123,108,111,103,44,76,101,118,101,108,44,70,111,114,109,97,116,44,65,114,103,76,105,115,116,44,77,101,116,97,100,97,116,97,125,32,119,104,101,114,101,10,10,76,101,118,101,108,32,61,32,97,116,111,109,40,41,44,10,70,111,114,109,97,116,32,61,32,115,116,114,105,110,103,40,41,44,10,65,114,103,76,105,115,116,32,61,32,108,105,115,116,40,116,101,114,109,40,41,41,44,10,77,101,116,97,100,97,116,97,32,61,32,35,123,32,112,105,100,32,61,62,32,112,105,100,40,41,44,10,32,32,32,103,114,111,117,112,95,108,101,97,100,101,114,32,61,62,32,112,105,100,40,41,44,10,32,32,32,116,105,109,101,32,58,61,32,108,111,103,103,101,114,58,116,105,109,101,115,116,97,109,112,40,41,44,10,32,32,32,101,114,114,111,114,95,108,111,103,103,101,114,32,58,61,32,35,123,32,101,109,117,108,97,116,111,114,32,58,61,32,116,114,117,101,44,32,116,97,103,32,58,61,32,97,116,111,109,40,41,32,125,10,32,32,32,32,32,32,32,32>>]}]},{p,[],[<<73,102,32,116,104,101,32>>,{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]},<<32,112,114,111,99,101,115,115,32,100,105,101,115,44,32,116,104,105,115,32,102,108,97,103,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32>>,{code,[],[<<108,111,103,103,101,114>>]},<<46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,97,109,101,100,32>>,{code,[],[<<108,111,103,103,101,114>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,116,104,101,32,75,69,82,78,69,76,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,108,111,103,103,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,103,103,101,114>>]}]},<<46,32,66,101,32,99,97,114,101,102,117,108,32,105,102,32,121,111,117,32,99,104,97,110,103,101,32,105,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,97,115,32,108,111,103,32,109,101,115,115,97,103,101,115,32,109,97,121,32,98,101,32,108,111,115,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,105,110,116,101,114,99,101,112,116,32,101,109,117,108,97,116,111,114,32,108,111,103,32,109,101,115,115,97,103,101,115,44,32,100,111,32,105,116,32,98,121,32,97,100,100,105,110,103,32,97,32,115,112,101,99,105,97,108,105,122,101,100,32,104,97,110,100,108,101,114,32,116,111,32,116,104,101,32,75,69,82,78,69,76,32,108,111,103,103,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,55,57,54>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2649,bounded_fun,[{type,2649,'fun',[{type,2649,product,[{atom,2649,system_logger},{var,2649,'Logger'}]},{var,2649,'PrevLogger'}]},[{type,2650,constraint,[{atom,2650,is_subtype},[{var,2650,'Logger'},{type,2650,union,[{atom,2650,logger},{atom,2650,undefined},{type,2650,pid,[]}]}]]},{type,2651,constraint,[{atom,2651,is_subtype},[{var,2651,'PrevLogger'},{type,2651,union,[{atom,2651,logger},{atom,2651,undefined},{type,2651,pid,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,51>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,32,116,111,32>>,{code,[],[<<84,67,87>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,97,110,32,117,110,115,105,103,110,101,100,32,105,110,116,101,103,101,114,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,109,97,116,99,104,95,115,112,101,99,35,115,101,116,95,116,99,119>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<115,101,116,95,116,99,119>>]}]},<<32,105,110,32,115,101,99,116,105,111,110,32,34,77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,34,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,50,56>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2652,bounded_fun,[{type,2652,'fun',[{type,2652,product,[{atom,2652,trace_control_word},{var,2652,'TCW'}]},{var,2652,'OldTCW'}]},[{type,2653,constraint,[{atom,2653,is_subtype},[{var,2653,'TCW'},{type,2653,non_neg_integer,[]}]]},{type,2654,constraint,[{atom,2654,is_subtype},[{var,2654,'OldTCW'},{type,2654,non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2606}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<70,105,110,97,108,105,122,101,115,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,105,109,101,32,111,102,102,115,101,116>>]},<<32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46,32,73,102,32,97,110,111,116,104,101,114,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,32,105,115,32,117,115,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,115,116,97,116,101,32,105,115,32,108,101,102,116,32,117,110,99,104,97,110,103,101,100,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,115,116,97,116,101,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,97,116,32,105,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<112,114,101,108,105,109,105,110,97,114,121>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,105,110,97,108,105,122,97,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,32,97,110,100,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,110,111,119,32,102,105,110,97,108,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<102,105,110,97,108>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,116,104,101,32,102,105,110,97,108,32,115,116,97,116,101,46,32,84,104,105,115,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,97,110,111,116,104,101,114,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,116,105,109,101,95,111,102,102,115,101,116,44,32,102,105,110,97,108,105,122,101,41>>]},<<32,99,97,108,108,32,111,114,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,78,111,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<118,111,108,97,116,105,108,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,110,111,116,32,98,101,32,102,105,110,97,108,105,122,101,100,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,52,50>>,signature => [{attribute,2606,spec,{{erlang,system_flag,2},[{type,2655,bounded_fun,[{type,2655,'fun',[{type,2655,product,[{atom,2655,time_offset},{atom,2655,finalize}]},{var,2655,'OldState'}]},[{type,2656,constraint,[{atom,2656,is_subtype},[{var,2656,'OldState'},{type,2656,union,[{atom,2656,preliminary},{atom,2656,final},{atom,2656,volatile}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,46,32,84,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,98,114,111,107,101,110,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,105,110,32,111,114,100,101,114,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114,32,116,111,32,110,97,118,105,103,97,116,101,46>>]},{dl,[],[{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<77,101,109,111,114,121,32,65,108,108,111,99,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,97,116,111,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,97,116,111,114,95,115,105,122,101,115>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<67,80,85,32,84,111,112,111,108,111,103,121>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<80,114,111,99,101,115,115,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<104,101,97,112,95,115,105,122,101,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<104,101,97,112,95,116,121,112,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,115>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,105,109,105,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,121,115,116,101,109,32,76,105,109,105,116,115>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,116,111,109,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,116,111,109,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,116,115,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,116,115,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,111,114,116,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,111,114,116,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,108,105,109,105,116>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,121,115,116,101,109,32,84,105,109,101>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,110,100,95,116,105,109,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,114,116,95,116,105,109,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,119,97,114,112,95,109,111,100,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,99,104,101,100,117,108,101,114,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,105,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,109,112,95,115,117,112,112,111,114,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,104,114,101,97,100,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<68,105,115,116,114,105,98,117,116,105,111,110,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,114,101,97,116,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,115,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,115,116,95,99,116,114,108>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,115,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,121,115,116,101,109,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,104,101,99,107,95,105,111>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,109,112,97,116,95,114,101,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,101,98,117,103,95,99,111,109,112,105,108,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,114,105,118,101,114,95,118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,109,117,95,102,108,97,118,111,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,109,117,95,116,121,112,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,102,111>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<107,101,114,110,101,108,95,112,111,108,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,97,100,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,99,104,105,110,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<110,105,102,95,118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,116,112,95,114,101,108,101,97,115,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,121,115,116,101,109,95,118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<119,111,114,100,115,105,122,101>>]}]}]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,55,50>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2866,'fun',[{type,2866,product,[{atom,2866,version}]},{type,2866,string,[]}]}]}}]}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,111,114,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>}],[]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>}],[]},{code,[],[<<97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,97,114,101,97,115,46>>]},{p,[],[<<69,97,99,104,32,116,117,112,108,101,32,99,111,110,116,97,105,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,116,121,112,101,32,111,102,32,109,101,109,111,114,121,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,97,110,100,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,87,104,101,110,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,108,108,111,99,97,116,101,100,32,97,110,100,32,117,115,101,100,32,109,101,109,111,114,121,32,105,115,32,112,114,101,115,101,110,116,44,32,97,108,115,111,32,97,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,112,114,101,115,101,110,116,44,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,117,115,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,46>>]},{p,[],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,41>>]},<<32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,97,110,100,32,116,104,101,32,99,111,110,116,101,110,116,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,115,32,116,104,101,114,101,102,111,114,101,32,99,104,97,110,103,101,115,32,119,104,101,110,32,110,101,101,100,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,111,109,101,32,118,97,108,117,101,115,32,97,114,101,32,112,97,114,116,32,111,102,32,111,116,104,101,114,32,118,97,108,117,101,115,44,32,97,110,100,32,115,111,109,101,32,109,101,109,111,114,121,32,97,114,101,97,115,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,101,109,111,114,121,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,44,49>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114>>}],[]},{code,[],[<<97,108,108,111,99,97,116,111,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,65,108,108,111,99,97,116,111,114,44,32,86,101,114,115,105,111,110,44,32,70,101,97,116,117,114,101,115,44,32,83,101,116,116,105,110,103,115>>]},<<44,32,119,104,101,114,101,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<65,108,108,111,99,97,116,111,114>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32>>,{code,[],[<<109,97,108,108,111,99,40,41>>]},<<32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46,32,73,102,32>>,{code,[],[<<65,108,108,111,99,97,116,111,114>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<44,32,116,104,101,32>>,{code,[],[<<109,97,108,108,111,99,40,41>>]},<<32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,32,99,97,110,110,111,116,32,98,101,32,105,100,101,110,116,105,102,105,101,100,46,32>>,{code,[],[<<103,108,105,98,99>>]},<<32,99,97,110,32,98,101,32,105,100,101,110,116,105,102,105,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<86,101,114,115,105,111,110>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,40,98,117,116,32,110,111,116,32,97,32,115,116,114,105,110,103,41,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<109,97,108,108,111,99,40,41>>]},<<32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<70,101,97,116,117,114,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,97,116,111,109,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,32,117,115,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<83,101,116,116,105,110,103,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,117,98,115,121,115,116,101,109,115,44,32,116,104,101,105,114,32,99,111,110,102,105,103,117,114,97,98,108,101,32,112,97,114,97,109,101,116,101,114,115,44,32,97,110,100,32,117,115,101,100,32,118,97,108,117,101,115,46,32,83,101,116,116,105,110,103,115,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,32,99,111,109,98,105,110,97,116,105,111,110,115,32,111,102,32,112,108,97,116,102,111,114,109,115,44,32,97,108,108,111,99,97,116,111,114,115,44,32,97,110,100,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,46,32,77,101,109,111,114,121,32,115,105,122,101,115,32,97,114,101,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,46>>]}]}]},{p,[],[<<83,101,101,32,97,108,115,111,32,34,83,121,115,116,101,109,32,70,108,97,103,115,32,69,102,102,101,99,116,105,110,103,32,101,114,116,115,95,97,108,108,111,99,34,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99,35,102,108,97,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101>>}],[]},{code,[],[<<123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,49,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,105,110,115,116,97,110,99,101,44,32,73,110,115,116,97,110,99,101,78,111,44,32,73,110,115,116,97,110,99,101,73,110,102,111,125>>]},<<32,116,117,112,108,101,115,44,32,119,104,101,114,101,32>>,{code,[],[<<73,110,115,116,97,110,99,101,73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,115,112,101,99,105,102,105,99,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,97,108,108,111,99,97,116,111,114,46,32,73,102,32>>,{code,[],[<<65,108,108,111,99>>]},<<32,105,115,32,110,111,116,32,97,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32>>,{code,[],[<<65,108,108,111,99>>]},<<32,105,115,32,100,105,115,97,98,108,101,100,44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,116,32,119,97,115,32,105,110,105,116,105,97,108,108,121,32,105,110,116,101,110,100,101,100,32,97,115,32,97,32,116,111,111,108,32,119,104,101,110,32,100,101,118,101,108,111,112,105,110,103,32,110,101,119,32,97,108,108,111,99,97,116,111,114,115,44,32,98,117,116,32,97,115,32,105,116,32,99,97,110,32,98,101,32,111,102,32,105,110,116,101,114,101,115,116,32,102,111,114,32,111,116,104,101,114,115,32,105,116,32,104,97,115,32,98,101,101,110,32,98,114,105,101,102,108,121,32,100,111,99,117,109,101,110,116,101,100,46>>]},{p,[],[<<84,104,101,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,108,105,115,116,101,100,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<46,32,73,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,117,112,101,114,32,99,97,114,114,105,101,114,115,32,99,97,110,32,98,101,32,111,98,116,97,105,110,101,100,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,119,105,116,104,32>>,{code,[],[<<123,97,108,108,111,99,97,116,111,114,44,32,101,114,116,115,95,109,109,97,112,125>>]},<<32,111,114,32,102,114,111,109,32,69,82,84,83,32,53,46,49,48,46,52,59,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32,119,105,116,104,32>>,{code,[],[<<123,97,108,108,111,99,97,116,111,114,44,32,109,115,101,103,95,97,108,108,111,99,125>>]},<<32,97,108,115,111,32,105,110,99,108,117,100,101,115,32,97,110,32>>,{code,[],[<<123,101,114,116,115,95,109,109,97,112,44,32,95,125>>]},<<32,116,117,112,108,101,32,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46>>]},{p,[],[<<65,102,116,101,114,32,114,101,97,100,105,110,103,32,116,104,101,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]},<<32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,109,111,114,101,32,111,114,32,108,101,115,115,32,115,112,101,97,107,115,32,102,111,114,32,105,116,115,101,108,102,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,119,111,114,116,104,32,101,120,112,108,97,105,110,105,110,103,32,115,111,109,101,32,116,104,105,110,103,115,46,32,67,97,108,108,32,99,111,117,110,116,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,44,32,116,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,103,105,103,97,32,99,97,108,108,115,44,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,99,97,108,108,115,46,32>>,{code,[],[<<109,98,99,115>>]},<<32,97,110,100,32>>,{code,[],[<<115,98,99,115>>]},<<32,100,101,110,111,116,101,32,109,117,108,116,105,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,97,110,100,32,115,105,110,103,108,101,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,83,105,122,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,105,110,32,98,121,116,101,115,46,32,87,104,101,110,32,97,32,115,105,122,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,101,100,44,32,105,116,32,105,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,115,111,109,101,116,104,105,110,103,46,32,83,105,122,101,115,32,97,110,100,32,97,109,111,117,110,116,115,32,97,114,101,32,111,102,116,101,110,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,114,101,101,32,118,97,108,117,101,115,58>>]},{ul,[],[{li,[],[<<84,104,101,32,102,105,114,115,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46>>]},{li,[],[<<84,104,101,32,115,101,99,111,110,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41>>]},<<46>>]},{li,[],[<<84,104,101,32,116,104,105,114,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46>>]}]},{p,[],[<<73,102,32,111,110,108,121,32,111,110,101,32,118,97,108,117,101,32,105,115,32,112,114,101,115,101,110,116,44,32,105,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46,32>>,{code,[],[<<102,105,120,95,97,108,108,111,99>>]},<<32,109,101,109,111,114,121,32,98,108,111,99,107,32,116,121,112,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,46,32,84,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,112,111,111,108,32,115,105,122,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,116,104,101,32,117,115,101,100,32,109,101,109,111,114,121,32,115,105,122,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>}],[]},{code,[],[<<97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,97,108,108,111,99,97,116,111,114,115,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,32>>,{code,[],[<<97,108,108,111,99,95,117,116,105,108>>]},<<32,102,114,97,109,101,119,111,114,107,32,97,115,32,97,116,111,109,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99,35,97,108,108,111,99,95,117,116,105,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<84,104,101,32,97,108,108,111,99,95,117,116,105,108,32,102,114,97,109,101,119,111,114,107>>]},<<32,105,110,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115>>}],[]},{code,[],[<<123,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,44,32,65,108,108,111,99,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,115,105,122,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41>>]}]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,48,48,53>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2767,'fun',[{type,2767,product,[{atom,2767,allocated_areas}]},{type,2767,list,[{type,2767,tuple,any}]}]},{type,2768,bounded_fun,[{type,2768,'fun',[{type,2768,product,[{atom,2768,allocator}]},{type,2769,tuple,[{var,2769,'Allocator'},{var,2769,'Version'},{var,2769,'Features'},{var,2769,'Settings'}]}]},[{type,2770,constraint,[{atom,2770,is_subtype},[{var,2770,'Allocator'},{type,2770,union,[{atom,2770,undefined},{atom,2770,glibc}]}]]},{type,2771,constraint,[{atom,2771,is_subtype},[{var,2771,'Version'},{type,2771,list,[{type,2771,non_neg_integer,[]}]}]]},{type,2772,constraint,[{atom,2772,is_subtype},[{var,2772,'Features'},{type,2772,list,[{type,2772,atom,[]}]}]]},{type,2773,constraint,[{atom,2773,is_subtype},[{var,2773,'Settings'},{type,2773,list,[{type,2773,tuple,[{ann_type,2773,[{var,2773,'Subsystem'},{type,2773,atom,[]}]},{type,2774,list,[{type,2774,tuple,[{ann_type,2774,[{var,2774,'Parameter'},{type,2774,atom,[]}]},{ann_type,2775,[{var,2775,'Value'},{type,2775,term,[]}]}]}]}]}]}]]}]]},{type,2776,bounded_fun,[{type,2776,'fun',[{type,2776,product,[{type,2776,tuple,[{atom,2776,allocator},{var,2776,'Alloc'}]}]},{type,2776,list,[{var,2776,'_'}]}]},[{type,2777,constraint,[{atom,2777,is_subtype},[{var,2777,'Alloc'},{type,2777,atom,[]}]]}]]},{type,2778,bounded_fun,[{type,2778,'fun',[{type,2778,product,[{atom,2778,alloc_util_allocators}]},{type,2778,list,[{var,2778,'Alloc'}]}]},[{type,2779,constraint,[{atom,2779,is_subtype},[{var,2779,'Alloc'},{type,2779,atom,[]}]]}]]},{type,2780,bounded_fun,[{type,2780,'fun',[{type,2780,product,[{type,2780,tuple,[{atom,2780,allocator_sizes},{var,2780,'Alloc'}]}]},{type,2780,list,[{var,2780,'_'}]}]},[{type,2781,constraint,[{atom,2781,is_subtype},[{var,2781,'Alloc'},{type,2781,atom,[]}]]}]]}]}}]}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<99,112,117,95,116,111,112,111,108,111,103,121>>}],[]},{li,[{name,<<99,112,117,95,116,111,112,111,108,111,103,121>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,108,108,32>>,{code,[],[<<76,101,118,101,108,69,110,116,114,121>>]},<<115,32,111,102,32,97,32,108,105,115,116,32,109,117,115,116,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32>>,{code,[],[<<76,101,118,101,108,84,97,103>>]},<<44,32,101,120,99,101,112,116,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,119,104,101,114,101,32,98,111,116,104,32>>,{code,[],[<<110,111,100,101>>]},<<32,97,110,100,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},{code,[],[<<76,101,118,101,108,84,97,103>>]},<<115,32,99,97,110,32,99,111,101,120,105,115,116,46>>]},{li,[{name,<<105,110,102,111,95,108,105,115,116>>}],[]},{li,[{name,<<105,110,102,111,95,108,105,115,116>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<84,104,101,32>>,{code,[],[<<105,110,102,111,95,108,105,115,116,40,41>>]},<<32,99,97,110,32,98,101,32,101,120,116,101,110,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{li,[{name,<<108,101,118,101,108,95,101,110,116,114,121>>}],[]},{li,[{name,<<108,101,118,101,108,95,101,110,116,114,121>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[{code,[],[<<123,76,101,118,101,108,84,97,103,44,32,83,117,98,76,101,118,101,108,125,32,61,61,32,123,76,101,118,101,108,84,97,103,44,32,91,93,44,32,83,117,98,76,101,118,101,108,125>>]}]},{li,[{name,<<108,101,118,101,108,95,116,97,103>>}],[]},{li,[{name,<<108,101,118,101,108,95,116,97,103>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<77,111,114,101,32>>,{code,[],[<<76,101,118,101,108,84,97,103>>]},<<115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{li,[{name,<<115,117,98,95,108,101,118,101,108>>}],[]}]},{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>}],[]},{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,117,115,101,100,32,105,115,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121>>]},<<44,32,105,102,32,115,117,99,104,32,101,120,105,115,116,115,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121>>]},<<44,32,105,102,32,115,117,99,104,32,101,120,105,115,116,115,46,32,73,102,32,110,111,32,67,80,85,32,116,111,112,111,108,111,103,121,32,101,120,105,115,116,115,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<110,111,100,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,78,111,110,45,85,110,105,102,111,114,109,32,77,101,109,111,114,121,32,65,99,99,101,115,115,32,40,78,85,77,65,41,32,110,111,100,101,115,46,32>>,{code,[],[<<116,104,114,101,97,100>>]},<<32,114,101,102,101,114,115,32,116,111,32,104,97,114,100,119,97,114,101,32,116,104,114,101,97,100,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,73,110,116,101,108,32,104,121,112,101,114,45,116,104,114,101,97,100,115,41,46>>]},{p,[],[<<65,32,108,101,118,101,108,32,105,110,32,116,101,114,109,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,99,97,110,32,98,101,32,111,109,105,116,116,101,100,32,105,102,32,111,110,108,121,32,111,110,101,32,101,110,116,114,121,32,101,120,105,115,116,115,32,97,110,100,32>>,{code,[],[<<73,110,102,111,76,105,115,116>>]},<<32,105,115,32,101,109,112,116,121,46>>]},{p,[],[{code,[],[<<116,104,114,101,97,100>>]},<<32,99,97,110,32,111,110,108,121,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<99,111,114,101>>]},<<46,32>>,{code,[],[<<99,111,114,101>>]},<<32,99,97,110,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},<<32,111,114,32>>,{code,[],[<<110,111,100,101>>]},<<46,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},<<32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<110,111,100,101>>]},<<46,32>>,{code,[],[<<110,111,100,101>>]},<<32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},<<46,32,84,104,97,116,32,105,115,44,32,78,85,77,65,32,110,111,100,101,115,32,99,97,110,32,98,101,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,111,114,32,112,114,111,99,101,115,115,111,114,32,101,120,116,101,114,110,97,108,46,32,65,32,67,80,85,32,116,111,112,111,108,111,103,121,32,99,97,110,32,99,111,110,115,105,115,116,32,111,102,32,97,32,109,105,120,32,111,102,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,97,110,100,32,101,120,116,101,114,110,97,108,32,78,85,77,65,32,110,111,100,101,115,44,32,97,115,32,108,111,110,103,32,97,115,32,101,97,99,104,32,108,111,103,105,99,97,108,32,67,80,85,32,98,101,108,111,110,103,115,32,116,111,32>>,{em,[],[<<111,110,101>>]},<<32,78,85,77,65,32,110,111,100,101,46,32,67,97,99,104,101,32,104,105,101,114,97,114,99,104,121,32,105,115,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,116,121,112,101,44,32,98,117,116,32,119,105,108,108,32,98,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,79,116,104,101,114,32,116,104,105,110,103,115,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,105,116,32,105,110,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,83,111,44,32,101,120,112,101,99,116,32,116,104,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,116,121,112,101,32,116,111,32,99,104,97,110,103,101,46>>]}]},{dt,[],[{code,[],[<<123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,102,105,110,101,100,125>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<32,97,110,100,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,116,101,99,116,101,100,125>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121,121>>]},<<46,32,84,104,101,32,101,109,117,108,97,116,111,114,32,100,101,116,101,99,116,115,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,110,32,115,111,109,101,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,46,32,79,110,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,32,119,105,116,104,32,109,111,114,101,32,116,104,97,110,32,51,50,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,110,111,116,32,100,101,116,101,99,116,101,100,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,117,115,101,100,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>}],[]},{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,116,104,101,32,99,111,110,102,105,103,117,114,101,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>}],[]},{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,116,104,101,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>}],[]},{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97>>}],[]},{code,[],[<<99,112,117,95,113,117,111,116,97>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,67,80,85,32,113,117,111,116,97,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,108,105,109,105,116,101,100,32,98,121,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,115,97,121,105,110,103,32,104,111,119,32,109,97,110,121,32,112,114,111,99,101,115,115,111,114,115,39,32,119,111,114,116,104,32,111,102,32,114,117,110,116,105,109,101,32,119,101,32,103,101,116,32,40,98,101,116,119,101,101,110,32,49,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,41,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,97,32,113,117,111,116,97,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>}],[]},{code,[],[<<117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,114,101,114,101,97,100,115,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,117,112,100,97,116,101,115,32,105,116,115,32,105,110,116,101,114,110,97,108,108,121,32,115,116,111,114,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121>>]},<<32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,110,102,105,103,117,114,101,100>>]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<111,110,108,105,110,101>>]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<97,118,97,105,108,97,98,108,101>>]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,112,117,32,113,117,111,116,97>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,104,97,115,32,99,104,97,110,103,101,100,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,32,119,97,115,32,114,101,97,100,44,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<99,104,97,110,103,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,99,104,97,110,103,101,100>>]},<<46,32,73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,104,97,115,32,99,104,97,110,103,101,100,44,32,121,111,117,32,112,114,111,98,97,98,108,121,32,119,97,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<97,100,106,117,115,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101>>]},<<46,32,89,111,117,32,116,121,112,105,99,97,108,108,121,32,119,97,110,116,32,116,111,32,104,97,118,101,32,97,115,32,109,97,110,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,53,52>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2789,bounded_fun,[{type,2789,'fun',[{type,2789,product,[{atom,2789,cpu_topology}]},{var,2789,'CpuTopology'}]},[{type,2790,constraint,[{atom,2790,is_subtype},[{var,2790,'CpuTopology'},{user_type,2790,cpu_topology,[]}]]}]]},{type,2791,bounded_fun,[{type,2791,'fun',[{type,2791,product,[{type,2791,tuple,[{atom,2791,cpu_topology},{type,2791,union,[{atom,2791,defined},{atom,2791,detected},{atom,2791,used}]}]}]},{var,2791,'CpuTopology'}]},[{type,2792,constraint,[{atom,2792,is_subtype},[{var,2792,'CpuTopology'},{user_type,2792,cpu_topology,[]}]]}]]},{type,2819,'fun',[{type,2819,product,[{type,2819,union,[{atom,2819,logical_processors},{atom,2820,logical_processors_available},{atom,2821,logical_processors_online}]}]},{type,2821,union,[{atom,2821,unknown},{type,2821,pos_integer,[]}]}]},{type,2865,'fun',[{type,2865,product,[{atom,2865,update_cpu_info}]},{type,2865,union,[{atom,2865,changed},{atom,2865,unchanged}]}]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]}]},{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,101,102,97,117,108,116,32,112,114,111,99,101,115,115,32,104,101,97,112,32,115,101,116,116,105,110,103,115,58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>}],[]},{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,32,117,115,101,100,32,98,121,32,100,101,102,97,117,108,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]},<<32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>}],[]},{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,101,102,97,117,108,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,32,65,32,112,114,111,99,101,115,115,32,115,112,97,119,110,101,100,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,98,121,32,97,32>>,{code,[],[<<115,112,97,119,110>>]},<<32,111,114,32>>,{code,[],[<<115,112,97,119,110,95,108,105,110,107>>]},<<32,117,115,101,115,32,116,104,101,115,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50>>]}]},<<46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,50,44,51,44,52>>]}]},<<32,99,97,110,32,115,112,97,119,110,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,117,115,101,32,116,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115>>}],[]},{code,[],[<<104,101,97,112,95,115,105,122,101,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,118,97,108,105,100,32,104,101,97,112,32,115,105,122,101,115,32,105,110,32,119,111,114,100,115,46,32,65,108,108,32,69,114,108,97,110,103,32,104,101,97,112,115,32,97,114,101,32,115,105,122,101,100,32,102,114,111,109,32,115,105,122,101,115,32,105,110,32,116,104,105,115,32,108,105,115,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101>>}],[]},{code,[],[<<104,101,97,112,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,112,32,116,121,112,101,32,117,115,101,100,32,98,121,32,116,104,101,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,46,32,79,110,101,32,104,101,97,112,32,116,121,112,101,32,101,120,105,115,116,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<112,114,105,118,97,116,101>>]}]},{dd,[],[<<69,97,99,104,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,104,101,97,112,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,116,115,32,117,115,101,32,97,110,100,32,110,111,32,114,101,102,101,114,101,110,99,101,115,32,98,101,116,119,101,101,110,32,104,101,97,112,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,97,108,108,111,119,101,100,46,32,77,101,115,115,97,103,101,115,32,112,97,115,115,101,100,32,98,101,116,119,101,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,99,111,112,105,101,100,32,98,101,116,119,101,101,110,32,104,101,97,112,115,46>>]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,97,120,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,115,101,116,116,105,110,103,32,99,97,110,32,98,101,32,115,101,116,32,117,115,105,110,103,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120,107>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120,101,108>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,116,105,109,101,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,119,104,105,99,104,32,105,115,32,101,105,116,104,101,114,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<32,111,114,32>>,{code,[],[<<111,110,95,104,101,97,112>>]},<<46,32,84,104,105,115,32,100,101,102,97,117,108,116,32,105,115,32,115,101,116,32,98,121,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,113,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,113,100>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,115,101,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,105,110,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,105,110,66,105,110,86,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115>>}],[]},{code,[],[<<112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,112,114,111,99,101,115,115,32,97,110,100,32,112,111,114,116,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,51,49,57>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2812,'fun',[{type,2812,product,[{atom,2812,fullsweep_after}]},{type,2812,tuple,[{atom,2812,fullsweep_after},{type,2812,non_neg_integer,[]}]}]},{type,2813,'fun',[{type,2813,product,[{atom,2813,garbage_collection}]},{type,2813,list,[{type,2813,tuple,[{type,2813,atom,[]},{type,2813,integer,[]}]}]}]},{type,2814,'fun',[{type,2814,product,[{atom,2814,heap_sizes}]},{type,2814,list,[{type,2814,non_neg_integer,[]}]}]},{type,2815,'fun',[{type,2815,product,[{atom,2815,heap_type}]},{atom,2815,private}]},{type,2823,'fun',[{type,2823,product,[{atom,2823,max_heap_size}]},{type,2823,tuple,[{atom,2823,max_heap_size},{ann_type,2823,[{var,2823,'MaxHeapSize'},{user_type,2823,max_heap_size,[]}]}]}]},{type,2824,'fun',[{type,2824,product,[{atom,2824,message_queue_data}]},{user_type,2824,message_queue_data,[]}]},{type,2825,'fun',[{type,2825,product,[{atom,2825,min_heap_size}]},{type,2825,tuple,[{atom,2825,min_heap_size},{ann_type,2825,[{var,2825,'MinHeapSize'},{type,2825,pos_integer,[]}]}]}]},{type,2826,'fun',[{type,2826,product,[{atom,2826,min_bin_vheap_size}]},{type,2826,tuple,[{atom,2826,min_bin_vheap_size},{ann_type,2827,[{var,2827,'MinBinVHeapSize'},{type,2827,pos_integer,[]}]}]}]},{type,2841,'fun',[{type,2841,product,[{atom,2841,procs}]},{type,2841,binary,[]}]}]}}],since => <<79,84,80,32,49,57,46,48,44,79,84,80,32,82,49,51,66,48,52>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,105,109,105,116,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,108,105,109,105,116,115,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116>>}],[]},{code,[],[<<97,116,111,109,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116>>}],[]},{code,[],[<<97,116,111,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,97,108,108,111,119,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,105,110,99,114,101,97,115,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,116>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116>>}],[]},{code,[],[<<101,116,115,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,69,84,83,32,116,97,98,108,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116>>}],[]},{code,[],[<<101,116,115,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,105,109,105,116,32,102,111,114,32,110,117,109,98,101,114,32,111,102,32,69,84,83,32,116,97,98,108,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,116,115,35,109,97,120,95,101,116,115,95,116,97,98,108,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,97,108,108,121,32,111,98,115,111,108,101,116,101>>]},<<32,97,110,100,32,110,117,109,98,101,114,32,111,102,32,116,97,98,108,101,115,32,97,114,101,32,111,110,108,121,32,108,105,109,105,116,101,100,32,98,121,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116>>}],[]},{code,[],[<<112,111,114,116,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<108,101,110,103,116,104,40,101,114,108,97,110,103,58,112,111,114,116,115,40,41,41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116>>}],[]},{code,[],[<<112,111,114,116,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,81>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,81>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116>>}],[]},{code,[],[<<112,114,111,99,101,115,115,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<108,101,110,103,116,104,40,112,114,111,99,101,115,115,101,115,40,41,41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116>>}],[]},{code,[],[<<112,114,111,99,101,115,115,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,80>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,80>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,52,51,56>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2782,'fun',[{type,2782,product,[{atom,2782,atom_count}]},{type,2782,pos_integer,[]}]},{type,2783,'fun',[{type,2783,product,[{atom,2783,atom_limit}]},{type,2783,pos_integer,[]}]},{type,2810,'fun',[{type,2810,product,[{atom,2810,ets_count}]},{type,2810,pos_integer,[]}]},{type,2811,'fun',[{type,2811,product,[{atom,2811,ets_limit}]},{type,2811,pos_integer,[]}]},{type,2837,'fun',[{type,2837,product,[{atom,2837,port_count}]},{type,2837,non_neg_integer,[]}]},{type,2838,'fun',[{type,2838,product,[{atom,2838,port_limit}]},{type,2838,pos_integer,[]}]},{type,2839,'fun',[{type,2839,product,[{atom,2839,process_count}]},{type,2839,pos_integer,[]}]},{type,2840,'fun',[{type,2840,product,[{atom,2840,process_limit}]},{type,2840,pos_integer,[]}]}]}}],since => <<79,84,80,32,50,48,46,48,44,79,84,80,32,50,49,46,49,44,79,84,80,32,82,49,54,66,44,79,84,80,32,82,49,54,66,48,51>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,116,105,109,101,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>}],[]},{code,[],[<<101,110,100,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,105,110,116,101,114,110,97,108,108,121,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,116,97,114,116,32,116,105,109,101>>]},<<32,97,110,100,32,116,104,101,32,101,110,100,32,116,105,109,101,32,105,115,32,97,116,32,108,101,97,115,116,32,97,32,113,117,97,114,116,101,114,32,111,102,32,97,32,109,105,108,108,101,110,110,105,117,109,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>}],[]},{code,[],[<<111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,110,111,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32>>,{code,[],[<<86,97,108,117,101>>]},<<115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,115,101,100,46,32,84,104,105,115,32,116,117,112,108,101,32,97,108,119,97,121,115,32,101,120,105,115,116,115,32,105,102,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]},{dt,[],[{code,[],[<<123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,116,117,112,108,101,32,111,110,108,121,32,101,120,105,115,116,115,32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32>>,{code,[],[<<67,108,111,99,107,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125>>]}]},{dd,[],[{p,[],[<<72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,82,101,115,111,108,117,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,115,111,108,117,116,105,111,110>>]},<<32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,102,114,111,109,32,116,104,101,32,79,83,44,32>>,{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,32,108,111,119,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,65,99,99,117,114,97,99,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<97,99,99,117,114,97,99,121>>]},<<32,111,114,32,119,104,101,116,104,101,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,80,114,101,99,105,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,101,99,105,115,105,111,110>>]},<<32,97,108,105,103,110,115,32,119,105,116,104,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,46,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,120,116,101,110,100,101,100,44,32,69,120,116,101,110,100,101,100,125>>]}]},{dd,[],[{p,[],[{code,[],[<<69,120,116,101,110,100,101,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<121,101,115>>]},<<32,105,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,32,104,97,115,32,98,101,101,110,32,101,120,116,101,110,100,101,100,59,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<69,120,116,101,110,100,101,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<110,111>>]},<<46,32,84,104,101,32,114,97,110,103,101,32,109,117,115,116,32,98,101,32,101,120,116,101,110,100,101,100,32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,114,101,116,117,114,110,115,32,118,97,108,117,101,115,32,116,104,97,116,32,119,114,97,112,32,102,97,115,116,46,32,84,104,105,115,32,116,121,112,105,99,97,108,108,121,32,105,115,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,32,51,50,45,98,105,116,32,118,97,108,117,101,46>>]}]},{dt,[],[{code,[],[<<123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<121,101,115>>]},<<32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,32,99,97,108,108,115,32,109,117,115,116,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32>>,{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<110,111>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,116,105,109,101,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101>>]},<<32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46>>]}]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>}],[]},{code,[],[<<111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32>>,{code,[],[<<86,97,108,117,101>>]},<<115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,105,111,110,32,117,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125>>]}]},{dd,[],[{p,[],[<<69,120,105,115,116,115,32,111,110,108,121,32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32>>,{code,[],[<<67,108,111,99,107,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125>>]}]},{dd,[],[{p,[],[<<72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,82,101,115,111,108,117,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,115,111,108,117,116,105,111,110>>]},<<32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,102,114,111,109,32,116,104,101,32,79,83,44,32>>,{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,32,108,111,119,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,65,99,99,117,114,97,99,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<97,99,99,117,114,97,99,121>>]},<<32,111,114,32,119,104,101,116,104,101,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,80,114,101,99,105,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,101,99,105,115,105,111,110>>]},<<32,100,111,32,97,108,105,103,110,32,119,105,116,104,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,46,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<121,101,115>>]},<<32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,32,99,97,108,108,115,32,110,101,101,100,115,32,116,111,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32>>,{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<110,111>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,116,105,109,101,44,32,79,115,83,121,115,116,101,109,84,105,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101>>]},<<32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46>>]}]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>}],[]},{code,[],[<<115,116,97,114,116,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<32,97,116,32,116,104,101,32,116,105,109,101,32,119,104,101,110,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,115,116,97,114,116,101,100,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,101,110,100,95,116,105,109,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>}],[]},{code,[],[<<116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,111,111,108,101,97,110,32,118,97,108,117,101,32,105,110,100,105,99,97,116,105,110,103,32,119,104,101,116,104,101,114,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,67,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,99,111,114,114,101,99,116,105,111,110>>]},<<32,105,115,32,101,110,97,98,108,101,100,32,111,114,32,110,111,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116>>}],[]},{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,58>>]},{dl,[],[{dt,[],[{code,[],[<<112,114,101,108,105,109,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,112,114,101,108,105,109,105,110,97,114,121,44,32,97,110,100,32,119,105,108,108,32,98,101,32,99,104,97,110,103,101,100,32,97,110,100,32,102,105,110,97,108,105,122,101,100,32,108,97,116,101,114,46,32,84,104,101,32,112,114,101,108,105,109,105,110,97,114,121,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,112,114,101,108,105,109,105,110,97,114,121,32,112,104,97,115,101,32,111,102,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<102,105,110,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,102,105,110,97,108,46,32,84,104,105,115,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,78,111,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,104,97,118,101,32,98,101,101,110,32,102,105,110,97,108,105,122,101,100,32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]},{dt,[],[{code,[],[<<118,111,108,97,116,105,108,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,118,111,108,97,116,105,108,101,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,99,104,97,110,103,101,32,97,116,32,97,110,121,32,116,105,109,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101>>}],[]},{code,[],[<<116,105,109,101,95,119,97,114,112,95,109,111,100,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,118,97,108,117,101,32,105,100,101,110,116,105,102,121,105,110,103,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,116,104,97,116,32,105,115,32,117,115,101,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<110,111,95,116,105,109,101,95,119,97,114,112>>]}]},{dd,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,78,111,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]},{dt,[],[{code,[],[<<115,105,110,103,108,101,95,116,105,109,101,95,119,97,114,112>>]}]},{dd,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]},{dt,[],[{code,[],[<<109,117,108,116,105,95,116,105,109,101,95,119,97,114,112>>]}]},{dd,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>}],[]},{code,[],[<<116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,119,104,101,116,104,101,114,32,97,32,112,114,101,32,69,82,84,83,32,55,46,48,32,98,97,99,107,119,97,114,100,115,32,99,111,109,112,97,116,105,98,108,101,32,99,111,109,112,101,110,115,97,116,105,111,110,32,102,111,114,32,115,117,100,100,101,110,32,99,104,97,110,103,101,115,32,111,102,32,115,121,115,116,101,109,32,116,105,109,101,32,105,115,32>>,{code,[],[<<101,110,97,98,108,101,100>>]},<<32,111,114,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<46,32,83,117,99,104,32,99,111,109,112,101,110,115,97,116,105,111,110,32,105,115,32>>,{code,[],[<<101,110,97,98,108,101,100>>]},<<32,119,104,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,111,102,102,115,101,116>>]},<<32,105,115,32>>,{code,[],[<<102,105,110,97,108>>]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,99,111,114,114,101,99,116,105,111,110>>]},<<32,105,115,32,101,110,97,98,108,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,53,49,56>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2809,'fun',[{type,2809,product,[{atom,2809,end_time}]},{type,2809,non_neg_integer,[]}]},{type,2834,'fun',[{type,2834,product,[{atom,2834,os_monotonic_time_source}]},{type,2834,list,[{type,2834,tuple,[{type,2834,atom,[]},{type,2834,term,[]}]}]}]},{type,2835,'fun',[{type,2835,product,[{atom,2835,os_system_time_source}]},{type,2835,list,[{type,2835,tuple,[{type,2835,atom,[]},{type,2835,term,[]}]}]}]},{type,2854,'fun',[{type,2854,product,[{atom,2854,start_time}]},{type,2854,integer,[]}]},{type,2860,'fun',[{type,2860,product,[{atom,2860,time_correction}]},{type,2860,union,[{atom,2860,true},{atom,2860,false}]}]},{type,2861,'fun',[{type,2861,product,[{atom,2861,time_offset}]},{type,2861,union,[{atom,2861,preliminary},{atom,2861,final},{atom,2861,volatile}]}]},{type,2862,'fun',[{type,2862,product,[{atom,2862,time_warp_mode}]},{type,2862,union,[{atom,2862,no_time_warp},{atom,2862,single_time_warp},{atom,2862,multi_time_warp}]}]},{type,2863,'fun',[{type,2863,product,[{atom,2863,tolerant_timeofday}]},{type,2863,union,[{atom,2863,enabled},{atom,2863,disabled}]}]}]}}],since => <<79,84,80,32,49,55,46,49,44,79,84,80,32,49,56,46,48>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,99,104,101,100,117,108,101,114,115,44,32,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>}],[]},{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,68,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,32,67,80,85,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,44,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,44,32,97,110,100,32,66,73,70,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,32,115,99,104,101,100,117,108,101,114,115,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,99,112,117>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,80,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,80,99,112,117>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>}],[]},{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,115,97,116,105,115,102,105,101,115,32>>,{code,[],[<<49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]},<<46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,99,112,117>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>}],[]},{code,[],[<<100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,68,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,32,73,47,79,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,32,97,110,100,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,44,32,119,104,105,99,104,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,32,115,99,104,101,100,117,108,101,114,115,46>>]},{p,[],[<<84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,105,111>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>}],[]},{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<100,105,115,97,98,108,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,116,97,114,116,101,100,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<98,108,111,99,107,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,32,97,108,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,115,32,69,114,108,97,110,103,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<98,108,111,99,107,101,100,95,110,111,114,109,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,110,111,116,32,98,108,111,99,107,101,100,44,32,97,110,100,32,99,97,110,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,32,110,97,116,105,118,101,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<101,110,97,98,108,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,97,110,100,32,110,111,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,97,108,108,32,97,118,97,105,108,97,98,108,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,46>>]}]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>}],[]},{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<115,32,119,104,101,110,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32>>,{code,[],[<<80,105,100>>]},<<115,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,32,65,32>>,{code,[],[<<80,105,100>>]},<<32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>}],[]},{code,[],[<<110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<115,32,119,104,101,110,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,32,40,116,104,97,116,32,105,115,44,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,41,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32>>,{code,[],[<<80,105,100>>]},<<115,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,32,65,32>>,{code,[],[<<80,105,100>>]},<<32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,104,111,119,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,32,111,114,32,110,111,116,32,98,111,117,110,100,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,108,116,104,111,117,103,104,32,97,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,44,32,116,104,101,121,32,99,97,110,32,115,105,108,101,110,116,108,121,32,104,97,118,101,32,102,97,105,108,101,100,32,116,111,32,98,105,110,100,46,32,84,111,32,105,110,115,112,101,99,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,44,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,46>>]},{p,[],[<<65,32,116,117,112,108,101,32,111,102,32,97,32,115,105,122,101,32,101,113,117,97,108,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,116,117,112,108,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,105,110,116,101,103,101,114,115,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,98,111,117,110,100>>]},<<46,32,76,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,105,110,116,101,103,101,114,115,46,32,84,104,101,32>>,{code,[],[<<78>>]},<<116,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,116,117,112,108,101,32,101,113,117,97,108,115,32,116,104,101,32,99,117,114,114,101,110,116,32,98,105,110,100,105,110,103,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,105,116,104,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<78>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,44,32>>,{code,[],[<<101,108,101,109,101,110,116,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41,44,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,41>>]},<<32,114,101,116,117,114,110,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,111,110,108,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,95,105,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,73,68,32,40>>,{code,[],[<<83,99,104,101,100,117,108,101,114,73,100>>]},<<41,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{code,[],[<<83,99,104,101,100,117,108,101,114,73,100>>]},<<32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,119,104,101,114,101,32>>,{code,[],[<<49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,69,114,108,97,110,103,32,112,111,114,116,115,44,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,32,97,110,100,32,69,114,108,97,110,103,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,108,97,116,101,114,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,108,97,116,105,111,110,115,104,105,112,32>>,{code,[],[<<49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116>>}],[]},{code,[],[<<115,109,112,95,115,117,112,112,111,114,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115>>}],[]},{code,[],[<<116,104,114,101,97,100,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>}],[]},{code,[],[<<116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,97,115,121,110,99,32,116,104,114,101,97,100,32,112,111,111,108,32,117,115,101,100,32,102,111,114,32,97,115,121,110,99,104,114,111,110,111,117,115,32,100,114,105,118,101,114,32,99,97,108,108,115,32,40>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,114,105,118,101,114,35,100,114,105,118,101,114,95,97,115,121,110,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<32>>,{code,[],[<<101,114,108,95,100,114,105,118,101,114,58,100,114,105,118,101,114,95,97,115,121,110,99,40,41>>]}]},<<41,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,55,52,54>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2796,'fun',[{type,2796,product,[{atom,2796,dirty_cpu_schedulers}]},{type,2796,non_neg_integer,[]}]},{type,2797,'fun',[{type,2797,product,[{atom,2797,dirty_cpu_schedulers_online}]},{type,2797,non_neg_integer,[]}]},{type,2798,'fun',[{type,2798,product,[{atom,2798,dirty_io_schedulers}]},{type,2798,non_neg_integer,[]}]},{type,2829,'fun',[{type,2829,product,[{atom,2829,multi_scheduling}]},{type,2829,union,[{atom,2829,disabled},{atom,2829,blocked},{atom,2829,blocked_normal},{atom,2829,enabled}]}]},{type,2830,'fun',[{type,2830,product,[{atom,2830,multi_scheduling_blockers}]},{type,2830,list,[{ann_type,2830,[{var,2830,'Pid'},{type,2830,pid,[]}]}]}]},{type,2832,'fun',[{type,2832,product,[{atom,2832,normal_multi_scheduling_blockers}]},{type,2832,list,[{ann_type,2832,[{var,2832,'Pid'},{type,2832,pid,[]}]}]}]},{type,2842,'fun',[{type,2842,product,[{atom,2842,scheduler_bind_type}]},{type,2842,union,[{atom,2842,spread},{atom,2843,processor_spread},{atom,2844,thread_spread},{atom,2845,thread_no_node_processor_spread},{atom,2846,no_node_processor_spread},{atom,2847,no_node_thread_spread},{atom,2848,no_spread},{atom,2849,unbound}]}]},{type,2850,'fun',[{type,2850,product,[{atom,2850,scheduler_bindings}]},{type,2850,tuple,any}]},{type,2851,'fun',[{type,2851,product,[{atom,2851,scheduler_id}]},{ann_type,2851,[{var,2851,'SchedulerId'},{type,2851,pos_integer,[]}]}]},{type,2852,'fun',[{type,2852,product,[{type,2852,union,[{atom,2852,schedulers},{atom,2852,schedulers_online}]}]},{type,2852,pos_integer,[]}]},{type,2853,'fun',[{type,2853,product,[{atom,2853,smp_support}]},{type,2853,boolean,[]}]},{type,2858,'fun',[{type,2858,product,[{atom,2858,threads}]},{type,2858,boolean,[]}]},{type,2859,'fun',[{type,2859,product,[{atom,2859,thread_pool_size}]},{type,2859,non_neg_integer,[]}]}]}}],since => <<79,84,80,32,49,55,46,48,44,79,84,80,32,49,57,46,48>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110>>}],[]},{code,[],[<<99,114,101,97,116,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,99,114,101,97,116,105,111,110,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,46,32,84,104,101,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,111,100,101,32,105,115,32,115,116,111,114,101,100,32,105,110,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,105,115,32,109,97,107,101,115,32,105,116,32,40,116,111,32,115,111,109,101,32,101,120,116,101,110,116,41,32,112,111,115,115,105,98,108,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,105,100,101,110,116,105,102,105,101,114,115,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,32,111,102,32,97,32,110,111,100,101,46,32,84,104,101,32,118,97,108,105,100,32,99,114,101,97,116,105,111,110,115,32,97,114,101,32,105,110,116,101,103,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,49,46,46,51,44,32,98,117,116,32,116,104,105,115,32,119,105,108,108,32,112,114,111,98,97,98,108,121,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<48>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>}],[]},{code,[],[<<100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,105,110,32,115,101,99,111,110,100,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,97,110,32,101,110,116,114,121,32,105,110,32,97,32,110,111,100,101,32,116,97,98,108,101,32,105,115,32,100,101,108,97,121,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,32,111,110,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,122,100,110,116,103,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,122,100,110,116,103,99>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116>>}],[]},{code,[],[<<100,105,115,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>}],[]},{code,[],[<<100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,98,117,102,102,101,114,32,98,117,115,121,32,108,105,109,105,116,32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,122,100,98,98,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,122,100,98,98,108>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108>>}],[]},{code,[],[<<100,105,115,116,95,99,116,114,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32>>,{code,[],[<<123,78,111,100,101,44,32,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,125>>]},<<44,32,111,110,101,32,101,110,116,114,121,32,102,111,114,32,101,97,99,104,32,99,111,110,110,101,99,116,101,100,32,114,101,109,111,116,101,32,110,111,100,101,46,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,97,110,100,32>>,{code,[],[<<67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121>>]},<<32,105,115,32,116,104,101,32,112,111,114,116,32,111,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,116,104,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,46,32,77,111,114,101,32,115,112,101,99,105,102,105,99,97,108,108,121,44,32>>,{code,[],[<<67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121>>]},<<32,102,111,114,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,84,67,80,47,73,80,32,40,116,104,101,32,110,111,114,109,97,108,32,99,97,115,101,41,32,105,115,32,116,104,101,32,115,111,99,107,101,116,32,117,115,101,100,32,105,110,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,99,32,110,111,100,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,48,52,54>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2793,'fun',[{type,2793,product,[{atom,2793,creation}]},{type,2793,integer,[]}]},{type,2795,'fun',[{type,2795,product,[{atom,2795,delayed_node_table_gc}]},{type,2795,union,[{atom,2795,infinity},{type,2795,non_neg_integer,[]}]}]},{type,2799,'fun',[{type,2799,product,[{atom,2799,dist}]},{type,2799,binary,[]}]},{type,2800,'fun',[{type,2800,product,[{atom,2800,dist_buf_busy_limit}]},{type,2800,non_neg_integer,[]}]},{type,2801,'fun',[{type,2801,product,[{atom,2801,dist_ctrl}]},{type,2801,tuple,[{ann_type,2801,[{var,2801,'Node'},{type,2801,node,[]}]},{ann_type,2802,[{var,2802,'ControllingEntity'},{type,2802,union,[{type,2802,port,[]},{type,2802,pid,[]}]}]}]}]}]}}],since => <<79,84,80,32,49,56,46,48,44,79,84,80,32,82,49,52,66,48,49>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2766}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,105,115,99,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,98,117,105,108,100,95,116,121,112,101>>}],[]},{code,[],[<<98,117,105,108,100,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<68,101,112,114,101,99,97,116,101,100,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,109,117,95,116,121,112,101>>]},<<32,105,110,115,116,101,97,100>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>}],[]},{code,[],[<<99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,119,111,45,116,117,112,108,101,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,67,32,99,111,109,112,105,108,101,114,32,117,115,101,100,32,119,104,101,110,32,99,111,109,112,105,108,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,117,110,107,110,111,119,110,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,101,114,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,117,110,107,110,111,119,110,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111>>}],[]},{code,[],[<<99,104,101,99,107,95,105,111>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,109,117,108,97,116,111,114,115,32,105,110,116,101,114,110,97,108,32,73,47,79,32,99,104,101,99,107,105,110,103,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,118,97,114,121,32,98,101,116,119,101,101,110,32,112,108,97,116,102,111,114,109,115,32,97,110,100,32,111,118,101,114,32,116,105,109,101,46,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108>>}],[]},{code,[],[<<99,111,109,112,97,116,95,114,101,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,101,116,32,116,111,32,98,101,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,46,32,84,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,99,111,109,112,97,116,95,114,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,82>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100>>}],[]},{code,[],[<<100,101,98,117,103,95,99,111,109,112,105,108,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,98,117,103,45,99,111,109,112,105,108,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<100,114,105,118,101,114,95,118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,118,101,114,115,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,104,97,115,32,116,104,101,32,102,111,114,109,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,114,105,118,101,114,35,118,101,114,115,105,111,110,95,109,97,110,97,103,101,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101>>}],[]},{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,102,114,97,109,101,119,111,114,107,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,46,32,73,116,32,99,97,110,32,98,101,32>>,{code,[],[<<100,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<115,121,115,116,101,109,116,97,112>>]},<<44,32,111,114,32>>,{code,[],[<<110,111,110,101>>]},<<46,32,70,111,114,32,97,32,99,111,109,109,101,114,99,105,97,108,32,111,114,32,115,116,97,110,100,97,114,100,32,98,117,105,108,100,44,32,105,116,32,105,115,32,97,108,119,97,121,115,32>>,{code,[],[<<110,111,110,101>>]},<<46,32,84,104,101,32,111,116,104,101,114,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,105,110,100,105,99,97,116,101,32,97,32,99,117,115,116,111,109,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,100,121,110,97,109,105,99,45,116,114,97,99,101,61,100,116,114,97,99,101>>]},<<41,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,117,110,116,105,109,101,95,116,111,111,108,115,58,100,121,110,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,121,110,116,114,97,99,101,40,51,41>>]}]},<<32,109,97,110,117,97,108,32,112,97,103,101,32,97,110,100,32,116,104,101,32>>,{code,[],[<<82,69,65,68,77,69,46,100,116,114,97,99,101>>]},<<47>>,{code,[],[<<82,69,65,68,77,69,46,115,121,115,116,101,109,116,97,112>>]},<<32,102,105,108,101,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,115,111,117,114,99,101,32,99,111,100,101,32,116,111,112,32,100,105,114,101,99,116,111,114,121,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>}],[]},{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32>>,{code,[],[<<98,111,111,108,101,97,110,40,41>>]},<<32,105,110,100,105,99,97,116,105,110,103,32,105,102,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,112,114,111,98,101,115,32,40>>,{code,[],[<<100,116,114,97,99,101>>]},<<32,111,114,32>>,{code,[],[<<115,121,115,116,101,109,116,97,112>>]},<<41,32,97,114,101,32,98,117,105,108,116,32,105,110,116,111,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,98,101,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,119,97,115,32,98,117,105,108,116,32,102,111,114,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,32,40,116,104,97,116,32,105,115,44,32>>,{code,[],[<<115,121,115,116,101,109,95,105,110,102,111,40,100,121,110,97,109,105,99,95,116,114,97,99,101,41>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<100,116,114,97,99,101>>]},<<32,111,114,32>>,{code,[],[<<115,121,115,116,101,109,116,97,112>>]},<<41,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114>>}],[]},{code,[],[<<101,109,117,95,102,108,97,118,111,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,102,108,97,118,111,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,119,105,108,108,32,98,101,32,101,105,116,104,101,114,32>>,{code,[],[<<101,109,117>>]},<<32,111,114,32>>,{code,[],[<<106,105,116>>]},<<46,32,80,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101>>}],[]},{code,[],[<<101,109,117,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,98,117,105,108,100,32,116,121,112,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,112,116>>]},<<32,102,111,114,32,111,112,116,105,109,105,122,101,100,46,32,79,116,104,101,114,32,112,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32>>,{code,[],[<<100,101,98,117,103>>]},<<44,32>>,{code,[],[<<103,99,111,118>>]},<<44,32>>,{code,[],[<<118,97,108,103,114,105,110,100>>]},<<44,32>>,{code,[],[<<103,112,114,111,102>>]},<<44,32,97,110,100,32>>,{code,[],[<<108,99,110,116>>]},<<46,32,80,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111>>}],[]},{code,[],[<<105,110,102,111>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,115,121,115,116,101,109,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108>>}],[]},{code,[],[<<107,101,114,110,101,108,95,112,111,108,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,117,115,101,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,107,101,114,110,101,108,45,112,111,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100>>}],[]},{code,[],[<<108,111,97,100,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,108,111,97,100,101,100,32,109,111,100,117,108,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101>>}],[]},{code,[],[<<109,97,99,104,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,110,97,109,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>}],[]},{code,[],[<<109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,45,108,101,118,101,108,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,102,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,84>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,84>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<110,105,102,95,118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,78,73,70,32,105,110,116,101,114,102,97,99,101,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,105,115,32,111,110,32,116,104,101,32,102,111,114,109,32,34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101>>}],[]},{code,[],[<<111,116,112,95,114,101,108,101,97,115,101>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,69,82,84,83,32,97,112,112,108,105,99,97,116,105,111,110,32,105,115,32,112,97,114,116,32,111,102,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,49,55,44,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,109,97,106,111,114,32,79,84,80,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,46,32,78,111,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,41>>]},<<32,97,114,103,117,109,101,110,116,32,103,105,118,101,115,32,116,104,101,32,101,120,97,99,116,32,79,84,80,32,118,101,114,115,105,111,110,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,120,97,99,116,32,79,84,80,32,118,101,114,115,105,111,110,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,32,105,115,32,100,105,102,102,105,99,117,108,116,32,116,111,32,100,101,116,101,114,109,105,110,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,101,114,115,105,111,110,115,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,115,121,115,116,101,109,95,112,114,105,110,99,105,112,108,101,115,58,118,101,114,115,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<83,121,115,116,101,109,32,112,114,105,110,99,105,112,108,101,115>>]},<<32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>}],[]},{code,[],[<<112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,102,97,117,108,116,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,115,99,104,101,100,117,108,105,110,103,32,104,105,110,116,32,117,115,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,112,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,112,112>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>}],[]},{code,[],[<<115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,111,114,32,97,110,100,32,79,83,32,97,114,99,104,105,116,101,99,116,117,114,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,98,117,105,108,116,32,102,111,114,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114>>}],[]},{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32>>,{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]},<<32,97,115,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,121,115,116,101,109,95,108,111,103,103,101,114,44,32,95,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<115,121,115,116,101,109,95,118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,97,110,100,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>}],[]},{code,[],[<<116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<103,101,116,95,116,99,119>>]},<<32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,109,97,116,99,104,95,115,112,101,99,35,103,101,116,95,116,99,119>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101>>}],[]},{code,[],[<<119,111,114,100,115,105,122,101>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,105,122,101,32,111,102,32,69,114,108,97,110,103,32,116,101,114,109,32,119,111,114,100,115,32,105,110,32,98,121,116,101,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,97,110,100,32,56,32,105,115,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,112,117,114,101,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,46,32,79,110,32,97,32,104,97,108,102,119,111,114,100,32,54,52,45,98,105,116,32,101,109,117,108,97,116,111,114,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,44,32,97,115,32,116,104,101,32,69,114,108,97,110,103,32,116,101,114,109,115,32,97,114,101,32,115,116,111,114,101,100,32,117,115,105,110,103,32,97,32,118,105,114,116,117,97,108,32,119,111,114,100,32,115,105,122,101,32,111,102,32,104,97,108,102,32,116,104,101,32,115,121,115,116,101,109,32,119,111,114,100,32,115,105,122,101,46>>]}]},{dt,[],[{code,[],[<<123,119,111,114,100,115,105,122,101,44,32,101,120,116,101,114,110,97,108,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,114,117,101,32,119,111,114,100,32,115,105,122,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,115,105,122,101,32,111,102,32,97,32,112,111,105,110,116,101,114,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,79,110,32,97,32,112,117,114,101,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,32,98,111,116,104,32,97,32,104,97,108,102,32,119,111,114,100,32,97,110,100,32,111,110,32,97,32,112,117,114,101,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,56,32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,49,49,55>>,signature => [{attribute,2766,spec,{{erlang,system_info,1},[{type,2786,'fun',[{type,2786,product,[{atom,2786,c_compiler_used}]},{type,2786,tuple,[{type,2786,atom,[]},{type,2786,term,[]}]}]},{type,2787,'fun',[{type,2787,product,[{atom,2787,check_io}]},{type,2787,list,[{var,2787,'_'}]}]},{type,2788,'fun',[{type,2788,product,[{atom,2788,compat_rel}]},{type,2788,integer,[]}]},{type,2794,'fun',[{type,2794,product,[{atom,2794,debug_compiled}]},{type,2794,boolean,[]}]},{type,2803,'fun',[{type,2803,product,[{atom,2803,driver_version}]},{type,2803,string,[]}]},{type,2804,'fun',[{type,2804,product,[{atom,2804,dynamic_trace}]},{type,2804,union,[{atom,2804,none},{atom,2804,dtrace},{atom,2804,systemtap}]}]},{type,2805,'fun',[{type,2805,product,[{atom,2805,dynamic_trace_probes}]},{type,2805,boolean,[]}]},{type,2807,'fun',[{type,2807,product,[{atom,2807,emu_flavor}]},{type,2807,union,[{atom,2807,emu},{atom,2807,jit}]}]},{type,2808,'fun',[{type,2808,product,[{atom,2808,emu_type}]},{type,2808,union,[{atom,2808,opt},{atom,2808,debug},{atom,2808,gcov},{atom,2808,valgrind},{atom,2808,gprof},{atom,2808,lcnt},{atom,2808,frmptr}]}]},{type,2816,'fun',[{type,2816,product,[{atom,2816,info}]},{type,2816,binary,[]}]},{type,2817,'fun',[{type,2817,product,[{atom,2817,kernel_poll}]},{type,2817,boolean,[]}]},{type,2818,'fun',[{type,2818,product,[{atom,2818,loaded}]},{type,2818,binary,[]}]},{type,2822,'fun',[{type,2822,product,[{atom,2822,machine}]},{type,2822,string,[]}]},{type,2828,'fun',[{type,2828,product,[{atom,2828,modified_timing_level}]},{type,2828,union,[{type,2828,integer,[]},{atom,2828,undefined}]}]},{type,2831,'fun',[{type,2831,product,[{atom,2831,nif_version}]},{type,2831,string,[]}]},{type,2833,'fun',[{type,2833,product,[{atom,2833,otp_release}]},{type,2833,string,[]}]},{type,2836,'fun',[{type,2836,product,[{atom,2836,port_parallelism}]},{type,2836,boolean,[]}]},{type,2855,'fun',[{type,2855,product,[{atom,2855,system_architecture}]},{type,2855,string,[]}]},{type,2856,'fun',[{type,2856,product,[{atom,2856,system_logger}]},{type,2856,union,[{atom,2856,logger},{atom,2856,undefined},{type,2856,pid,[]}]}]},{type,2857,'fun',[{type,2857,product,[{atom,2857,system_version}]},{type,2857,string,[]}]},{type,2864,'fun',[{type,2864,product,[{atom,2864,trace_control_word}]},{type,2864,non_neg_integer,[]}]},{type,2866,'fun',[{type,2866,product,[{atom,2866,version}]},{type,2866,string,[]}]},{type,2867,'fun',[{type,2867,product,[{type,2867,union,[{atom,2867,wordsize},{type,2867,tuple,[{atom,2867,wordsize},{atom,2867,internal}]},{type,2867,tuple,[{atom,2867,wordsize},{atom,2867,external}]}]}]},{type,2867,union,[{integer,2867,4},{integer,2867,8}]}]}]}}],since => <<79,84,80,32,49,55,46,52,44,79,84,80,32,50,49,46,51,44,79,84,80,32,50,52,46,48,44,79,84,80,32,82,49,53,66,48,49,44,79,84,80,32,82,49,54,66>>}},{{function,system_monitor,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1957}],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>]}]},<<32,97,115,32>>,{code,[],[<<123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,110,111,32,115,101,116,116,105,110,103,115,32,101,120,105,115,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,52,50,52>>,signature => [{attribute,1957,spec,{{erlang,system_monitor,0},[{type,1957,bounded_fun,[{type,1957,'fun',[{type,1957,product,[]},{var,1957,'MonSettings'}]},[{type,1958,constraint,[{atom,1958,is_subtype},[{var,1958,'MonSettings'},{type,1958,union,[{atom,1958,undefined},{type,1958,tuple,[{var,1958,'MonitorPid'},{var,1958,'Options'}]}]}]]},{type,1959,constraint,[{atom,1959,is_subtype},[{var,1959,'MonitorPid'},{type,1959,pid,[]}]]},{type,1960,constraint,[{atom,1960,is_subtype},[{var,1960,'Options'},{type,1960,list,[{user_type,1960,system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1965}],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<87,104,101,110,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<44,32,97,108,108,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,32,109,111,110,105,116,111,114,105,110,103,32,115,101,116,116,105,110,103,115,32,97,114,101,32,99,108,101,97,114,101,100,46>>]},{p,[],[<<67,97,108,108,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,105,116,104,32>>,{code,[],[<<123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125>>]},<<32,97,115,32,97,114,103,117,109,101,110,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,41>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,52,51,56>>,signature => [{attribute,1965,spec,{{erlang,system_monitor,1},[{type,1965,bounded_fun,[{type,1965,'fun',[{type,1965,product,[{var,1965,'Arg'}]},{var,1965,'MonSettings'}]},[{type,1966,constraint,[{atom,1966,is_subtype},[{var,1966,'Arg'},{type,1966,union,[{atom,1966,undefined},{type,1966,tuple,[{var,1966,'MonitorPid'},{var,1966,'Options'}]}]}]]},{type,1967,constraint,[{atom,1967,is_subtype},[{var,1967,'MonSettings'},{type,1967,union,[{atom,1967,undefined},{type,1967,tuple,[{var,1967,'MonitorPid'},{var,1967,'Options'}]}]}]]},{type,1968,constraint,[{atom,1968,is_subtype},[{var,1968,'MonitorPid'},{type,1968,pid,[]}]]},{type,1969,constraint,[{atom,1969,is_subtype},[{var,1969,'Options'},{type,1969,list,[{user_type,1969,system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1974}],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,46,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,114,101,99,101,105,118,105,110,103,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,108,111,110,103,95,103,99,44,32,84,105,109,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,116,97,107,101,115,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<84,105,109,101>>]},<<32,119,97,108,108,32,99,108,111,99,107,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,71,99,80,105,100,44,32,108,111,110,103,95,103,99,44,32,73,110,102,111,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<71,99,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,119,97,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[<<79,110,101,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,71,99,84,105,109,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<71,99,84,105,109,101>>]},<<32,105,115,32,116,104,101,32,116,105,109,101,32,102,111,114,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,32,84,104,101,32,111,116,104,101,114,32,116,117,112,108,101,115,32,97,114,101,32,116,97,103,103,101,100,32,119,105,116,104,32>>,{code,[],[<<104,101,97,112,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<115,116,97,99,107,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<109,98,117,102,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<111,108,100,95,104,101,97,112,95,115,105,122,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<46,32,84,104,101,115,101,32,116,117,112,108,101,115,32,97,114,101,32,101,120,112,108,97,105,110,101,100,32,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]}]},<<32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<41,46,32,78,101,119,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,44,32,97,110,100,32,116,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32>>,{code,[],[<<73,110,102,111>>]},<<32,108,105,115,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,108,111,110,103,95,115,99,104,101,100,117,108,101,44,32,84,105,109,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,114,117,110,115,32,117,110,105,110,116,101,114,114,117,112,116,101,100,32,102,111,114,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<84,105,109,101>>]},<<32,119,97,108,108,32,99,108,111,99,107,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,80,105,100,79,114,80,111,114,116,44,32,108,111,110,103,95,115,99,104,101,100,117,108,101,44,32,73,110,102,111,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,116,104,97,116,32,119,97,115,32,114,117,110,110,105,110,103,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,101,118,101,110,116,46>>]},{p,[],[<<73,102,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<44,32,116,104,101,32,116,117,112,108,101,115,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,77,105,108,108,105,115,125>>]},<<44,32>>,{code,[],[<<123,105,110,44,32,76,111,99,97,116,105,111,110,125>>]},<<44,32,97,110,100,32>>,{code,[],[<<123,111,117,116,44,32,76,111,99,97,116,105,111,110,125>>]},<<32,97,114,101,32,112,114,101,115,101,110,116,44,32,119,104,101,114,101,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,101,105,116,104,101,114,32,97,110,32,77,70,65,32,40>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<41,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,104,101,114,101,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,115,99,104,101,100,117,108,101,100,32,105,110,47,111,117,116,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<73,102,32,97,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<44,32,116,104,101,32,116,117,112,108,101,115,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,77,105,108,108,105,115,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,112,111,114,116,95,111,112,44,79,112,125>>]},<<32,97,114,101,32,112,114,101,115,101,110,116,46,32>>,{code,[],[<<79,112>>]},<<32,105,115,32,111,110,101,32,111,102,32>>,{code,[],[<<112,114,111,99,95,115,105,103>>]},<<44,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<44,32>>,{code,[],[<<105,110,112,117,116>>]},<<44,32>>,{code,[],[<<111,117,116,112,117,116>>]},<<44,32>>,{code,[],[<<101,118,101,110,116>>]},<<44,32,111,114,32>>,{code,[],[<<100,105,115,116,95,99,109,100>>]},<<44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,119,104,105,99,104,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,32,119,97,115,32,101,120,101,99,117,116,105,110,103,46>>]},{p,[],[{code,[],[<<112,114,111,99,95,115,105,103>>]},<<32,105,115,32,97,110,32,105,110,116,101,114,110,97,108,32,111,112,101,114,97,116,105,111,110,32,97,110,100,32,105,115,32,110,101,118,101,114,32,116,111,32,97,112,112,101,97,114,44,32,119,104,105,108,101,32,116,104,101,32,111,116,104,101,114,115,32,114,101,112,114,101,115,101,110,116,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,115,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<44,32>>,{code,[],[<<114,101,97,100,121,95,105,110,112,117,116>>]},<<44,32>>,{code,[],[<<114,101,97,100,121,95,111,117,116,112,117,116>>]},<<44,32>>,{code,[],[<<101,118,101,110,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<111,117,116,112,117,116,118>>]},<<32,40,119,104,101,110,32,116,104,101,32,112,111,114,116,32,105,115,32,117,115,101,100,32,98,121,32,100,105,115,116,114,105,98,117,116,105,111,110,41,46,32,86,97,108,117,101,32>>,{code,[],[<<77,105,108,108,105,115>>]},<<32,105,110,32,116,117,112,108,101,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,117,110,105,110,116,101,114,114,117,112,116,101,100,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,44,32,119,104,105,99,104,32,97,108,119,97,121,115,32,105,115,32,101,113,117,97,108,32,116,111,32,111,114,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,115,117,112,112,108,105,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,116,114,97,99,101,46,32,78,101,119,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,116,111,32,116,104,101,32>>,{code,[],[<<73,110,102,111>>]},<<32,108,105,115,116,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32,108,105,115,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]},{p,[],[<<84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,116,101,99,116,32,112,114,111,98,108,101,109,115,32,119,105,116,104,32,78,73,70,115,32,111,114,32,100,114,105,118,101,114,115,32,116,104,97,116,32,116,97,107,101,32,116,111,111,32,108,111,110,103,32,116,111,32,101,120,101,99,117,116,101,46,32,49,32,109,115,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,103,111,111,100,32,109,97,120,105,109,117,109,32,116,105,109,101,32,102,111,114,32,97,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,32,111,114,32,97,32,78,73,70,46,32,72,111,119,101,118,101,114,44,32,97,32,116,105,109,101,45,115,104,97,114,105,110,103,32,115,121,115,116,101,109,32,105,115,32,117,115,117,97,108,108,121,32,116,111,32,99,111,110,115,105,100,101,114,32,101,118,101,114,121,116,104,105,110,103,32,60,32,49,48,48,32,109,115,32,97,115,32,34,112,111,115,115,105,98,108,101,34,32,97,110,100,32,102,97,105,114,108,121,32,34,110,111,114,109,97,108,34,46,32,72,111,119,101,118,101,114,44,32,108,111,110,103,101,114,32,115,99,104,101,100,117,108,101,32,116,105,109,101,115,32,99,97,110,32,105,110,100,105,99,97,116,101,32,115,119,97,112,112,105,110,103,32,111,114,32,97,32,109,105,115,98,101,104,97,118,105,110,103,32,78,73,70,47,100,114,105,118,101,114,46,32,77,105,115,98,101,104,97,118,105,110,103,32,78,73,70,115,32,97,110,100,32,100,114,105,118,101,114,115,32,99,97,110,32,99,97,117,115,101,32,98,97,100,32,114,101,115,111,117,114,99,101,32,117,116,105,108,105,122,97,116,105,111,110,32,97,110,100,32,98,97,100,32,111,118,101,114,97,108,108,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,46>>]}]},{dt,[],[{code,[],[<<123,108,97,114,103,101,95,104,101,97,112,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,114,101,115,117,108,116,115,32,105,110,32,116,104,101,32,97,108,108,111,99,97,116,101,100,32,115,105,122,101,32,111,102,32,97,32,104,101,97,112,32,98,101,105,110,103,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<83,105,122,101>>]},<<32,119,111,114,100,115,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,71,99,80,105,100,44,32,108,97,114,103,101,95,104,101,97,112,44,32,73,110,102,111,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<71,99,80,105,100>>]},<<32,97,110,100,32>>,{code,[],[<<73,110,102,111>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,102,111,114,32>>,{code,[],[<<108,111,110,103,95,103,99>>]},<<32,101,97,114,108,105,101,114,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,116,117,112,108,101,32,116,97,103,103,101,100,32,119,105,116,104,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,115,105,122,101,115,32,111,102,32,97,108,108,32,109,101,109,111,114,121,32,98,108,111,99,107,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,97,108,108,32,104,101,97,112,32,103,101,110,101,114,97,116,105,111,110,115,32,97,102,116,101,114,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,101,113,117,97,108,32,116,111,32,111,114,32,104,105,103,104,101,114,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<46>>]},{p,[],[<<87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,105,115,32,107,105,108,108,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32,105,116,32,105,115,32,107,105,108,108,101,100,32,98,101,102,111,114,101,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,99,111,109,112,108,101,116,101,32,97,110,100,32,116,104,117,115,32,110,111,32,108,97,114,103,101,32,104,101,97,112,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46>>]}]},{dt,[],[{code,[],[<<98,117,115,121,95,112,111,114,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,103,101,116,115,32,115,117,115,112,101,110,100,101,100,32,98,101,99,97,117,115,101,32,105,116,32,115,101,110,100,115,32,116,111,32,97,32,98,117,115,121,32,112,111,114,116,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,83,117,115,80,105,100,44,32,98,117,115,121,95,112,111,114,116,44,32,80,111,114,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<83,117,115,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,103,111,116,32,115,117,115,112,101,110,100,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,111,32>>,{code,[],[<<80,111,114,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<98,117,115,121,95,100,105,115,116,95,112,111,114,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,103,101,116,115,32,115,117,115,112,101,110,100,101,100,32,98,101,99,97,117,115,101,32,105,116,32,115,101,110,100,115,32,116,111,32,97,32,112,114,111,99,101,115,115,32,111,110,32,97,32,114,101,109,111,116,101,32,110,111,100,101,32,119,104,111,115,101,32,105,110,116,101,114,45,110,111,100,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,97,115,32,104,97,110,100,108,101,100,32,98,121,32,97,32,98,117,115,121,32,112,111,114,116,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,83,117,115,80,105,100,44,32,98,117,115,121,95,100,105,115,116,95,112,111,114,116,44,32,80,111,114,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<83,117,115,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,103,111,116,32,115,117,115,112,101,110,100,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,32,105,110,116,101,114,45,110,111,100,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,112,111,114,116,32>>,{code,[],[<<80,111,114,116>>]},<<46>>]}]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>]}]},<<46>>]},{p,[],[<<84,104,101,32,97,114,103,117,109,101,110,116,115,32,116,111,32>>,{code,[],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>]},<<32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,97,108,108,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,111,110,32,116,104,101,32,110,111,100,101,32,115,104,111,117,108,100,32,98,101,32,100,111,110,101,44,32,110,111,116,32,104,111,119,32,105,116,32,115,104,111,117,108,100,32,98,101,32,99,104,97,110,103,101,100,46,32,84,104,105,115,32,109,101,97,110,115,32,111,110,108,121,32,111,110,101,32,112,114,111,99,101,115,115,32,97,116,32,97,32,116,105,109,101,32,40>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<41,32,99,97,110,32,98,101,32,116,104,101,32,114,101,99,101,105,118,101,114,32,111,102,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,32,65,108,115,111,44,32,116,104,101,32,119,97,121,32,116,111,32,99,108,101,97,114,32,97,32,115,112,101,99,105,102,105,99,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,32,105,115,32,116,111,32,110,111,116,32,105,110,99,108,117,100,101,32,105,116,32,105,110,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<79,112,116,105,111,110,115>>]},<<46,32,65,108,108,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,98,101,32,99,108,101,97,114,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,116,101,114,109,105,110,97,116,101,115,46>>]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,110,111,32,115,112,101,99,105,97,108,32,111,112,116,105,111,110,32,118,97,108,117,101,115,32,40,108,105,107,101,32,122,101,114,111,41,32,116,111,32,99,108,101,97,114,32,97,110,32,111,112,116,105,111,110,46,32,83,111,109,101,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,104,97,118,101,32,97,32,117,110,115,112,101,99,105,102,105,101,100,32,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,76,111,119,101,114,32,118,97,108,117,101,115,32,119,105,108,108,32,98,101,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,105,115,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,109,111,110,105,116,111,114,32,97,108,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,119,105,116,104,32>>,{code,[],[<<123,108,111,110,103,95,103,99,44,32,48,125>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,97,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,103,101,116,115,32,115,111,32,108,97,114,103,101,32,116,104,97,116,32,105,116,32,105,116,115,101,108,102,32,115,116,97,114,116,115,32,116,111,32,99,97,117,115,101,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32,101,110,108,97,114,103,101,32,116,104,101,32,112,114,111,99,101,115,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,110,100,32,112,114,111,98,97,98,108,121,32,109,97,107,101,32,116,104,101,32,112,114,111,98,108,101,109,32,119,111,114,115,101,46>>]},{p,[],[<<75,101,101,112,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,110,101,97,116,32,97,110,100,32,100,111,32,110,111,116,32,115,101,116,32,116,104,101,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,108,105,109,105,116,115,32,116,111,111,32,116,105,103,104,116,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,52,53,54>>,signature => [{attribute,1974,spec,{{erlang,system_monitor,2},[{type,1974,bounded_fun,[{type,1974,'fun',[{type,1974,product,[{var,1974,'MonitorPid'},{var,1974,'Options'}]},{var,1974,'MonSettings'}]},[{type,1975,constraint,[{atom,1975,is_subtype},[{var,1975,'MonitorPid'},{type,1975,pid,[]}]]},{type,1976,constraint,[{atom,1976,is_subtype},[{var,1976,'Options'},{type,1976,list,[{user_type,1976,system_monitor_option,[]}]}]]},{type,1977,constraint,[{atom,1977,is_subtype},[{var,1977,'MonSettings'},{type,1977,union,[{atom,1977,undefined},{type,1977,tuple,[{var,1977,'OldMonitorPid'},{var,1977,'OldOptions'}]}]}]]},{type,1978,constraint,[{atom,1978,is_subtype},[{var,1978,'OldMonitorPid'},{type,1978,pid,[]}]]},{type,1979,constraint,[{atom,1979,is_subtype},[{var,1979,'OldOptions'},{type,1979,list,[{user_type,1979,system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_profile,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1984}],[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,112,114,111,102,105,108,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>]}]},<<32,97,115,32>>,{code,[],[<<123,80,114,111,102,105,108,101,114,80,105,100,44,32,79,112,116,105,111,110,115,125>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,54,48,48>>,signature => [{attribute,1984,spec,{{erlang,system_profile,0},[{type,1984,bounded_fun,[{type,1984,'fun',[{type,1984,product,[]},{var,1984,'ProfilerSettings'}]},[{type,1985,constraint,[{atom,1985,is_subtype},[{var,1985,'ProfilerSettings'},{type,1985,union,[{atom,1985,undefined},{type,1985,tuple,[{var,1985,'ProfilerPid'},{var,1985,'Options'}]}]}]]},{type,1986,constraint,[{atom,1986,is_subtype},[{var,1986,'ProfilerPid'},{type,1986,union,[{type,1986,pid,[]},{type,1986,port,[]}]}]]},{type,1987,constraint,[{atom,1987,is_subtype},[{var,1987,'Options'},{type,1987,list,[{user_type,1987,system_profile_option,[]}]}]]}]]}]}}]}},{{function,system_profile,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1992}],[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<83,101,116,115,32,115,121,115,116,101,109,32,112,114,111,102,105,108,101,114,32,111,112,116,105,111,110,115,46,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,114,32,112,111,114,116,32,114,101,99,101,105,118,105,110,103,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,114,101,99,101,105,118,101,114,32,105,115,32,101,120,99,108,117,100,101,100,32,102,114,111,109,32,97,108,108,32,112,114,111,102,105,108,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,102,105,108,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,99,108,117,115,105,118,101>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32,105,115,32,100,111,110,101,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,110,111,116,32,114,117,110,110,97,98,108,101,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,32,114,117,110,116,105,109,101,32,116,111,32,116,104,101,32,112,111,114,116,46,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,105,102,105,101,100,32,97,115,32>>,{code,[],[<<105,110,97,99,116,105,118,101>>]},<<44,32,97,110,100,32,108,97,116,101,114,32>>,{code,[],[<<97,99,116,105,118,101>>]},<<32,119,104,101,110,32,116,104,101,32,112,111,114,116,32,99,97,108,108,98,97,99,107,32,114,101,116,117,114,110,115,46>>]}]},{dt,[],[{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,97,98,108,101,95,112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,32,97,32,109,101,115,115,97,103,101,44,32>>,{code,[],[<<123,112,114,111,102,105,108,101,44,32,80,105,100,44,32,83,116,97,116,101,44,32,77,102,97,44,32,84,115,125>>]},<<44,32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<46,32,82,117,110,110,105,110,103,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32,114,117,110,32,113,117,101,117,101,32,97,102,116,101,114,32,104,97,118,105,110,103,32,98,101,101,110,32,112,114,101,45,101,109,112,116,101,100,32,100,111,32,110,111,116,32,116,114,105,103,103,101,114,32,116,104,105,115,32,109,101,115,115,97,103,101,46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,97,98,108,101,95,112,111,114,116,115>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,111,114,116,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,32,97,32,109,101,115,115,97,103,101,44,32>>,{code,[],[<<123,112,114,111,102,105,108,101,44,32,80,111,114,116,44,32,83,116,97,116,101,44,32,48,44,32,84,115,125>>]},<<44,32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,105,115,32,112,117,116,32,116,111,32,115,108,101,101,112,32,111,114,32,97,119,111,107,101,110,44,32,97,32,109,101,115,115,97,103,101,44,32>>,{code,[],[<<123,112,114,111,102,105,108,101,44,32,115,99,104,101,100,117,108,101,114,44,32,73,100,44,32,83,116,97,116,101,44,32,78,111,83,99,104,101,100,115,44,32,84,115,125>>]},<<44,32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,99,111,110,115,105,115,116,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,105,110,116,101,103,101,114,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{code,[],[<<123,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41,44,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,105,110,99,108,117,100,101,32,97,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,40,41>>]},<<46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,32,105,102,32,110,111,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<32,104,97,115,32,98,101,101,110,32,101,110,97,98,108,101,100,32,116,104,114,111,117,103,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<44,32,116,104,105,115,32,97,108,115,111,32,101,102,102,101,99,116,115,32,116,104,101,32,116,105,109,101,32,115,116,97,109,112,32,112,114,111,100,117,99,101,100,32,105,110,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,102,108,97,103,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,101,110,97,98,108,101,100,46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101>>]},<<32,98,101,104,97,118,105,111,114,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,54,49,53>>,signature => [{attribute,1992,spec,{{erlang,system_profile,2},[{type,1992,bounded_fun,[{type,1992,'fun',[{type,1992,product,[{var,1992,'ProfilerPid'},{var,1992,'Options'}]},{var,1992,'ProfilerSettings'}]},[{type,1993,constraint,[{atom,1993,is_subtype},[{var,1993,'ProfilerPid'},{type,1993,union,[{type,1993,pid,[]},{type,1993,port,[]},{atom,1993,undefined}]}]]},{type,1994,constraint,[{atom,1994,is_subtype},[{var,1994,'Options'},{type,1994,list,[{user_type,1994,system_profile_option,[]}]}]]},{type,1995,constraint,[{atom,1995,is_subtype},[{var,1995,'ProfilerSettings'},{type,1995,union,[{atom,1995,undefined},{type,1995,tuple,[{type,1995,union,[{type,1995,pid,[]},{type,1995,port,[]}]},{type,1995,list,[{user_type,1995,system_profile_option,[]}]}]}]}]]}]]}]}}]}},{{function,system_time,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1545}],[<<115,121,115,116,101,109,95,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46>>]},{p,[],[<<67,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,116,105,109,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,54,56,57>>,signature => [{attribute,1545,spec,{{erlang,system_time,0},[{type,1545,'fun',[{type,1545,product,[]},{type,1545,integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_time,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1550}],[<<115,121,115,116,101,109,95,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32>>,{code,[],[<<85,110,105,116>>]},<<32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{p,[],[<<67,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,85,110,105,116,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]}]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41>>]}]},{code,[],[<<44,32,110,97,116,105,118,101,44,32,85,110,105,116,41>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,116,105,109,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,55,49,49>>,signature => [{attribute,1550,spec,{{erlang,system_time,1},[{type,1550,bounded_fun,[{type,1550,'fun',[{type,1550,product,[{var,1550,'Unit'}]},{type,1550,integer,[]}]},[{type,1551,constraint,[{atom,1551,is_subtype},[{var,1551,'Unit'},{user_type,1551,time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,term_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2667}],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,108,95,101,120,116,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]}]},{p,[],[<<84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,112,117,114,112,111,115,101,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,119,114,105,116,105,110,103,32,97,32,116,101,114,109,32,116,111,32,97,32,102,105,108,101,32,105,110,32,97,110,32,101,102,102,105,99,105,101,110,116,32,119,97,121,44,32,111,114,32,115,101,110,100,105,110,103,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,111,32,115,111,109,101,32,116,121,112,101,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,115,32,99,104,97,110,110,101,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,100,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,46>>]},{pre,[],[{code,[],[<<62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,97,109,101,32,116,101,114,109,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,55,51,51>>,signature => [{attribute,2667,spec,{{term_to_binary,1},[{type,2667,bounded_fun,[{type,2667,'fun',[{type,2667,product,[{var,2667,'Term'}]},{user_type,2667,ext_binary,[]}]},[{type,2668,constraint,[{atom,2668,is_subtype},[{var,2668,'Term'},{type,2668,term,[]}]]}]]}]}}]}},{{function,term_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,105,115,32,112,114,111,118,105,100,101,100,44,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,105,115,32,99,111,109,112,114,101,115,115,101,100,46,32,84,104,101,32,99,111,109,112,114,101,115,115,101,100,32,102,111,114,109,97,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]},<<32,97,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,55,66,46>>]},{p,[],[<<65,32,99,111,109,112,114,101,115,115,105,111,110,32,108,101,118,101,108,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,103,105,118,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,99,111,109,112,114,101,115,115,101,100,44,32,76,101,118,101,108,125>>]},<<46,32>>,{code,[],[<<76,101,118,101,108>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,119,105,116,104,32,114,97,110,103,101,32,48,46,46,57,44,32,119,104,101,114,101,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<48>>]},<<32,45,32,78,111,32,99,111,109,112,114,101,115,115,105,111,110,32,105,115,32,100,111,110,101,32,40,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,103,105,118,105,110,103,32,110,111,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,111,112,116,105,111,110,41,46>>]}]},{li,[],[{p,[],[{code,[],[<<49>>]},<<32,45,32,84,97,107,101,115,32,108,101,97,115,116,32,116,105,109,101,32,98,117,116,32,109,97,121,32,110,111,116,32,99,111,109,112,114,101,115,115,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,115,46>>]}]},{li,[],[{p,[],[{code,[],[<<54>>]},<<32,45,32,68,101,102,97,117,108,116,32,108,101,118,101,108,32,119,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,105,115,32,112,114,111,118,105,100,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<57>>]},<<32,45,32,84,97,107,101,115,32,109,111,115,116,32,116,105,109,101,32,97,110,100,32,116,114,105,101,115,32,116,111,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,46,32,78,111,116,105,99,101,32,34,116,114,105,101,115,34,32,105,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,101,110,116,101,110,99,101,59,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,105,110,112,117,116,32,116,101,114,109,44,32,108,101,118,101,108,32,57,32,99,111,109,112,114,101,115,115,105,111,110,32,101,105,116,104,101,114,32,100,111,101,115,32,111,114,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,32,116,104,97,110,32,108,101,118,101,108,32,49,32,99,111,109,112,114,101,115,115,105,111,110,46>>]}]}]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,99,111,110,116,114,111,108,32,115,111,109,101,32,101,110,99,111,100,105,110,103,32,100,101,116,97,105,108,115,46,32,84,104,105,115,32,111,112,116,105,111,110,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<86,101,114,115,105,111,110>>]},<<32,97,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<48>>]}]},{dd,[],[{p,[],[<<70,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,97,32,116,101,120,116,117,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,117,115,101,102,117,108,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,114,101,108,101,97,115,101,115,32,98,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,32,99,97,110,32,100,101,99,111,100,101,32,114,101,115,117,108,116,105,110,103,32,98,105,110,97,114,121,46>>]},{p,[],[<<84,104,105,115,32,118,101,114,115,105,111,110,32,101,110,99,111,100,101,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,117,115,105,110,103,32,108,97,116,105,110,49,32,101,110,99,111,100,105,110,103,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,117,116,102,56,46>>]}]},{dt,[],[{code,[],[<<49>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,105,115,32,97,115,32,111,102,32,69,114,108,97,110,103,47,79,84,80,32,49,55,46,48,32,116,104,101,32,100,101,102,97,117,108,116,46,32,73,116,32,102,111,114,99,101,115,32,97,110,121,32,102,108,111,97,116,115,32,105,110,32,116,104,101,32,116,101,114,109,32,116,111,32,98,101,32,101,110,99,111,100,101,100,32,105,110,32,97,32,109,111,114,101,32,115,112,97,99,101,45,101,102,102,105,99,105,101,110,116,32,97,110,100,32,101,120,97,99,116,32,119,97,121,32,40,110,97,109,101,108,121,32,105,110,32,116,104,101,32,54,52,45,98,105,116,32,73,69,69,69,32,102,111,114,109,97,116,44,32,114,97,116,104,101,114,32,116,104,97,110,32,99,111,110,118,101,114,116,101,100,32,116,111,32,97,32,116,101,120,116,117,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,41,46,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,44,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]},<<32,99,97,110,32,100,101,99,111,100,101,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>]},{p,[],[<<84,104,105,115,32,118,101,114,115,105,111,110,32,101,110,99,111,100,101,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,117,115,105,110,103,32,108,97,116,105,110,49,32,101,110,99,111,100,105,110,103,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,117,116,102,56,46>>]}]},{dt,[],[{code,[],[<<50>>]}]},{dd,[],[{p,[],[<<68,114,111,112,115,32,117,115,97,103,101,32,111,102,32,116,104,101,32,108,97,116,105,110,49,32,97,116,111,109,32,101,110,99,111,100,105,110,103,32,97,110,100,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,117,115,101,32,117,116,102,56,32,101,110,99,111,100,105,110,103,32,102,111,114,32,97,108,108,32,97,116,111,109,115,46,32,84,104,105,115,32,119,105,108,108,32,98,101,32,99,104,97,110,103,101,100,32,116,111,32,116,104,101,32,100,101,102,97,117,108,116,32,105,110,32,97,32,102,117,116,117,114,101,32,109,97,106,111,114,32,114,101,108,101,97,115,101,32,111,102,32,69,114,108,97,110,103,47,79,84,80,46,32,69,114,108,97,110,103,47,79,84,80,32,115,121,115,116,101,109,115,32,97,115,32,111,102,32,82,49,54,66,32,99,97,110,32,100,101,99,111,100,101,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>]}]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,55,54,49>>,signature => [{attribute,2672,spec,{{term_to_binary,2},[{type,2672,bounded_fun,[{type,2672,'fun',[{type,2672,product,[{var,2672,'Term'},{var,2672,'Options'}]},{user_type,2672,ext_binary,[]}]},[{type,2673,constraint,[{atom,2673,is_subtype},[{var,2673,'Term'},{type,2673,term,[]}]]},{type,2674,constraint,[{atom,2674,is_subtype},[{var,2674,'Options'},{type,2674,list,[{type,2674,union,[{atom,2674,compressed},{type,2675,tuple,[{atom,2675,compressed},{ann_type,2675,[{var,2675,'Level'},{type,2675,range,[{integer,2675,0},{integer,2675,9}]}]}]},{type,2676,tuple,[{atom,2676,minor_version},{ann_type,2676,[{var,2676,'Version'},{type,2676,range,[{integer,2676,0},{integer,2676,2}]}]}]}]}]}]]}]]}]}}]}},{{function,term_to_iovec,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2680}],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,116,95,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<101,120,116,95,105,111,118,101,99,40,41>>]}]},<<46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,32,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,32>>,{code,[],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,41,41>>]},<<32,119,105,108,108,32,112,114,111,100,117,99,101,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41>>]},<<46>>]},{p,[],[{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41>>]},<<32,112,114,111,118,105,100,101,46,32>>,{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,56,50,54>>,signature => [{attribute,2680,spec,{{term_to_iovec,1},[{type,2680,bounded_fun,[{type,2680,'fun',[{type,2680,product,[{var,2680,'Term'}]},{user_type,2680,ext_iovec,[]}]},[{type,2681,constraint,[{atom,2681,is_subtype},[{var,2681,'Term'},{type,2681,term,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,term_to_iovec,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2685}],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,116,95,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<101,120,116,95,105,111,118,101,99,40,41>>]}]},<<46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,32,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,32>>,{code,[],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,44,32,79,112,116,115,41,41>>]},<<32,119,105,108,108,32,112,114,111,100,117,99,101,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,115,41>>]},<<46>>]},{p,[],[<<67,117,114,114,101,110,116,108,121,32,114,101,99,111,103,110,105,115,101,100,32,111,112,116,105,111,110,115,32,97,114,101,32,97,108,108,32,111,112,116,105,111,110,115,32,114,101,99,111,103,110,105,115,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<46>>]},{p,[],[{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41>>]},<<32,112,114,111,118,105,100,101,46,32>>,{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,56,53,49>>,signature => [{attribute,2685,spec,{{term_to_iovec,2},[{type,2685,bounded_fun,[{type,2685,'fun',[{type,2685,product,[{var,2685,'Term'},{var,2685,'Options'}]},{user_type,2685,ext_iovec,[]}]},[{type,2686,constraint,[{atom,2686,is_subtype},[{var,2686,'Term'},{type,2686,term,[]}]]},{type,2687,constraint,[{atom,2687,is_subtype},[{var,2687,'Options'},{type,2687,list,[{type,2687,union,[{atom,2687,compressed},{type,2688,tuple,[{atom,2688,compressed},{ann_type,2688,[{var,2688,'Level'},{type,2688,range,[{integer,2688,0},{integer,2688,9}]}]}]},{type,2689,tuple,[{atom,2689,minor_version},{ann_type,2689,[{var,2689,'Version'},{type,2689,range,[{integer,2689,0},{integer,2689,2}]}]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,throw,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2001}],[<<116,104,114,111,119,47,49>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<116,104,114,111,119>>]},<<46,32,73,110,116,101,110,100,101,100,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,100,111,32,110,111,110,45,108,111,99,97,108,32,114,101,116,117,114,110,115,32,102,114,111,109,32,102,117,110,99,116,105,111,110,115,46>>]},{p,[],[<<73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,99,97,116,99,104>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110>>]},<<44,32,116,104,101,32,99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110,32,114,101,116,117,114,110,115,32,118,97,108,117,101,32>>,{code,[],[<<65,110,121>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,99,97,116,99,104,32,116,104,114,111,119,40,123,104,101,108,108,111,44,32,116,104,101,114,101,125,41,46,10,32,32,32,32,32,32,32,32,123,104,101,108,108,111,44,116,104,101,114,101,125>>]}]},{p,[],[<<73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32>>,{code,[],[<<116,114,121>>]},<<45,98,108,111,99,107,32,111,102,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,116,114,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,114,121,32,101,120,112,114,101,115,115,105,111,110>>]},<<44,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<65,110,121>>]},<<32,99,97,110,32,98,101,32,99,97,117,103,104,116,32,119,105,116,104,105,110,32,116,104,101,32,99,97,116,99,104,32,98,108,111,99,107,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<116,114,121,10,32,32,32,32,116,104,114,111,119,40,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,34,83,111,109,101,116,104,105,110,103,32,104,97,112,112,101,110,101,100,34,125,41,10,99,97,116,99,104,10,32,32,32,32,116,104,114,111,119,58,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,68,101,115,99,125,32,45,62,10,32,32,32,32,32,32,32,32,105,111,58,102,111,114,109,97,116,40,115,116,97,110,100,97,114,100,95,101,114,114,111,114,44,32,34,69,114,114,111,114,58,32,126,115,126,110,34,44,32,91,68,101,115,99,93,41,10,101,110,100>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<110,111,99,97,116,99,104>>]},<<32,105,102,32,110,111,116,32,99,97,117,103,104,116,32,98,121,32,97,110,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,46>>]},{p,[],[<<83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,56,55,57>>,signature => [{attribute,2001,spec,{{throw,1},[{type,2001,bounded_fun,[{type,2001,'fun',[{type,2001,product,[{var,2001,'Any'}]},{type,2001,no_return,[]}]},[{type,2002,constraint,[{atom,2002,is_subtype},[{var,2002,'Any'},{type,2002,term,[]}]]}]]}]}}]}},{{function,time,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2007}],[<<116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,97,115,32>>,{code,[],[<<123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125>>]},<<46>>]},{p,[],[<<84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,105,109,101,40,41,46,10,123,57,44,52,50,44,52,52,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,57,48,55>>,signature => [{attribute,2007,spec,{{time,0},[{type,2007,bounded_fun,[{type,2007,'fun',[{type,2007,product,[]},{var,2007,'Time'}]},[{type,2008,constraint,[{atom,2008,is_subtype},[{var,2008,'Time'},{remote_type,2008,[{atom,2008,calendar},{atom,2008,time},[]]}]]}]]}]}}]}},{{function,time_offset,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1605}],[<<116,105,109,101,95,111,102,102,115,101,116,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46,32,67,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,97,100,100,101,100,32,116,111,32,97,110,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,103,105,118,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,46>>]},{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,111,112,101,114,97,116,105,111,110,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,117,115,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,99,104,97,110,103,101,32,105,110,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,32,98,101,32,111,98,115,101,114,118,101,100,32,97,116,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,112,111,105,110,116,115,32,105,110,32,116,105,109,101,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,59,32,115,111,44,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,57,50,50>>,signature => [{attribute,1605,spec,{{erlang,time_offset,0},[{type,1605,'fun',[{type,1605,product,[]},{type,1605,integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,time_offset,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1610}],[<<116,105,109,101,95,111,102,102,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32>>,{code,[],[<<85,110,105,116>>]},<<32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{p,[],[<<83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]}]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]}]},{code,[],[<<44,32,110,97,116,105,118,101,44,32,85,110,105,116,41>>]},<<32,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32>>,{code,[],[<<85,110,105,116>>]},<<115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,57,53,52>>,signature => [{attribute,1610,spec,{{erlang,time_offset,1},[{type,1610,bounded_fun,[{type,1610,'fun',[{type,1610,product,[{var,1610,'Unit'}]},{type,1610,integer,[]}]},[{type,1611,constraint,[{atom,1611,is_subtype},[{var,1611,'Unit'},{user_type,1611,time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,timestamp,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1616}],[<<116,105,109,101,115,116,97,109,112,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<116,105,109,101,115,116,97,109,112>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,111,110,32,116,104,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125>>]},<<46,32,84,104,105,115,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,116,105,109,101,115,116,97,109,112,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,116,105,109,101,115,116,97,109,112,47,48>>]}]},<<32,97,110,100,32,116,104,101,32,100,101,112,114,101,99,97,116,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,110,111,119,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,110,111,119,47,48>>]}]},<<32,117,115,101,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41>>]},<<32,105,115,32,112,117,114,101,108,121,32,116,111,32,115,105,109,112,108,105,102,121,32,117,115,101,32,102,111,114,32,101,120,105,115,116,105,110,103,32,99,111,100,101,32,116,104,97,116,32,97,115,115,117,109,101,115,32,116,104,105,115,32,116,105,109,101,32,115,116,97,109,112,32,102,111,114,109,97,116,46,32,67,117,114,114,101,110,116,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,32,99,97,110,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,108,121,32,98,101,32,114,101,116,114,105,101,118,101,100,32,105,110,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32,121,111,117,114,32,99,104,111,105,99,101,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,116,105,109,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,47,49>>]}]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41>>]},<<32,66,73,70,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<116,105,109,101,115,116,97,109,112,40,41,32,45,62,10,32,32,32,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,109,105,99,114,111,115,101,99,111,110,100,41,44,10,32,32,32,32,77,101,103,97,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,95,48,48,48,95,48,48,48,44,10,32,32,32,32,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,32,45,32,77,101,103,97,83,101,99,115,42,49,48,48,48,95,48,48,48,44,10,32,32,32,32,77,105,99,114,111,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,114,101,109,32,49,48,48,48,95,48,48,48,44,10,32,32,32,32,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,46>>]}]},{p,[],[<<73,116,44,32,104,111,119,101,118,101,114,44,32,117,115,101,115,32,97,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,98,117,105,108,100,32,103,97,114,98,97,103,101,32,111,110,32,116,104,101,32,104,101,97,112,32,97,110,100,32,119,105,116,104,32,115,108,105,103,104,116,108,121,32,98,101,116,116,101,114,32,112,101,114,102,111,114,109,97,110,99,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,116,105,109,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,57,55,51>>,signature => [{attribute,1616,spec,{{erlang,timestamp,0},[{type,1616,bounded_fun,[{type,1616,'fun',[{type,1616,product,[]},{var,1616,'Timestamp'}]},[{type,1617,constraint,[{atom,1617,is_subtype},[{var,1617,'Timestamp'},{user_type,1617,timestamp,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,tl,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2694}],[<<116,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,97,105,108,32,111,102,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,108,105,115,116,32,109,105,110,117,115,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93>>]}]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,93,41,46,10,91,93>>]}]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93>>]}]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,105,109,112,114,111,112,101,114,95,101,110,100>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,105,115,116>>]},<<32,105,115,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,48,49,50>>,signature => [{attribute,2694,spec,{{tl,1},[{type,2694,bounded_fun,[{type,2694,'fun',[{type,2694,product,[{var,2694,'List'}]},{type,2694,term,[]}]},[{type,2695,constraint,[{atom,2695,is_subtype},[{var,2695,'List'},{type,2695,nonempty_maybe_improper_list,[]}]]}]]}]}}]}},{{function,trace,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2013}],[<<116,114,97,99,101,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<116,114,97,99,101,95,102,108,97,103>>}],[]}]},{p,[],[<<84,117,114,110,115,32,111,110,32,40,105,102,32>>,{code,[],[<<72,111,119,32,61,61,32,116,114,117,101>>]},<<41,32,111,114,32,111,102,102,32,40,105,102,32>>,{code,[],[<<72,111,119,32,61,61,32,102,97,108,115,101>>]},<<41,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,105,110,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,114,111,99,101,115,115,101,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<46>>]},{p,[],[{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32,101,105,116,104,101,114,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,102,111,114,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,44,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,97,110,100,32,97,108,108,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,97,108,108,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<112,111,114,116,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,32,97,110,100,32,97,108,108,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<101,120,105,115,116,105,110,103>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,46>>]},{dt,[],[{code,[],[<<101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,46>>]},{dt,[],[{code,[],[<<101,120,105,115,116,105,110,103,95,112,111,114,116,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,46>>]},{dt,[],[{code,[],[<<110,101,119>>]}]},{dd,[],[<<65,108,108,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<110,101,119,95,112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[<<65,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<110,101,119,95,112,111,114,116,115>>]}]},{dd,[],[<<65,108,108,32,112,111,114,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]}]},{p,[],[{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,108,97,103,115,32,40,116,104,101,32,34,109,101,115,115,97,103,101,32,116,97,103,115,34,32,114,101,102,101,114,115,32,116,111,32,116,104,101,32,108,105,115,116,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,114,97,99,101,32,109,101,115,115,97,103,101,115>>]}]},<<41,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,97,108,108,32,116,114,97,99,101,32,102,108,97,103,115,32,101,120,99,101,112,116,32>>,{code,[],[<<116,114,97,99,101,114>>]},<<32,97,110,100,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<44,32,119,104,105,99,104,32,97,114,101,32,105,110,32,116,104,101,105,114,32,110,97,116,117,114,101,32,100,105,102,102,101,114,101,110,116,32,116,104,97,110,32,116,104,101,32,111,116,104,101,114,115,46>>]}]},{dt,[],[{code,[],[<<115,101,110,100>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,101,110,100,105,110,103,32,111,102,32,109,101,115,115,97,103,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,110,100>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<39,114,101,99,101,105,118,101,39>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,114,101,99,101,105,118,105,110,103,32,111,102,32,109,101,115,115,97,103,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,99,101,105,118,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<39,114,101,99,101,105,118,101,39>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,99,101,114,116,97,105,110,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,83,112,101,99,105,102,121,32,119,104,105,99,104,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,116,111,32,116,114,97,99,101,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,97,108,108>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,102,114,111,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,102,114,111,109>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<115,105,108,101,110,116>>]}]},{dd,[],[{p,[],[<<85,115,101,100,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,46,32,84,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<114,101,116,117,114,110,95,102,114,111,109>>]},<<44,32,97,110,100,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,105,110,104,105,98,105,116,101,100,32,105,102,32,116,104,105,115,32,102,108,97,103,32,105,115,32,115,101,116,44,32,98,117,116,32,116,104,101,121,32,97,114,101,32,101,120,101,99,117,116,101,100,32,97,115,32,110,111,114,109,97,108,32,105,102,32,116,104,101,114,101,32,97,114,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46>>]},{p,[],[<<83,105,108,101,110,116,32,109,111,100,101,32,105,115,32,105,110,104,105,98,105,116,101,100,32,98,121,32,101,120,101,99,117,116,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,40,95,44,32,102,97,108,115,101,44,32,91,115,105,108,101,110,116,124,95,93,41>>]},<<44,32,111,114,32,98,121,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,101,120,101,99,117,116,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,115,105,108,101,110,116,44,32,102,97,108,115,101,125>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<115,105,108,101,110,116>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,97,99,105,108,105,116,97,116,101,115,32,115,101,116,116,105,110,103,32,117,112,32,97,32,116,114,97,99,101,32,111,110,32,109,97,110,121,32,111,114,32,101,118,101,110,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,116,114,97,99,101,32,99,97,110,32,116,104,101,110,32,98,101,32,97,99,116,105,118,97,116,101,100,32,97,110,100,32,100,101,97,99,116,105,118,97,116,101,100,32,117,115,105,110,103,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,115,105,108,101,110,116,44,66,111,111,108,125>>]},<<44,32,103,105,118,105,110,103,32,97,32,104,105,103,104,32,100,101,103,114,101,101,32,111,102,32,99,111,110,116,114,111,108,32,111,102,32,119,104,105,99,104,32,102,117,110,99,116,105,111,110,115,32,119,105,116,104,32,119,104,105,99,104,32,97,114,103,117,109,101,110,116,115,32,116,104,97,116,32,116,114,105,103,103,101,114,32,116,104,101,32,116,114,97,99,101,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,97,108,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,102,114,111,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,102,114,111,109>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,116,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,116,111>>]}]},<<46,32,79,114,32,114,97,116,104,101,114,44,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,46>>]}]},{dt,[],[{code,[],[<<114,101,116,117,114,110,95,116,111>>]}]},{dd,[],[{p,[],[<<85,115,101,100,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,46,32,84,114,97,99,101,115,32,116,104,101,32,114,101,116,117,114,110,32,102,114,111,109,32,97,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,32,98,97,99,107,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46,32,79,110,108,121,32,119,111,114,107,115,32,102,111,114,32,102,117,110,99,116,105,111,110,115,32,116,114,97,99,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]},{p,[],[<<84,104,101,32,115,101,109,97,110,116,105,99,115,32,105,115,32,116,104,97,116,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,119,104,101,110,32,97,32,99,97,108,108,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,44,32,116,104,97,116,32,105,115,44,32,119,104,101,110,32,97,32,99,104,97,105,110,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,32,101,110,100,115,46,32,79,110,108,121,32,111,110,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,112,101,114,32,99,104,97,105,110,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,44,32,115,111,32,116,104,101,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,110,101,115,115,32,102,111,114,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,107,101,112,116,32,119,104,105,108,101,32,116,114,97,99,105,110,103,32,119,105,116,104,32,116,104,105,115,32,102,108,97,103,46,32,85,115,105,110,103,32>>,{code,[],[<<99,97,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,116,114,97,99,101,32,116,111,103,101,116,104,101,114,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,107,110,111,119,32,101,120,97,99,116,108,121,32,105,110,32,119,104,105,99,104,32,102,117,110,99,116,105,111,110,32,97,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,97,116,32,97,110,121,32,116,105,109,101,46>>]},{p,[],[<<84,111,32,103,101,116,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,99,111,110,116,97,105,110,105,110,103,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,102,114,111,109,32,102,117,110,99,116,105,111,110,115,44,32,117,115,101,32,116,104,101,32>>,{code,[],[<<123,114,101,116,117,114,110,95,116,114,97,99,101,125>>]},<<32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,99,116,105,111,110,32,105,110,115,116,101,97,100,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,116,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,116,111>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,112,114,111,99,101,115,115,45,114,101,108,97,116,101,100,32,101,118,101,110,116,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,112,97,119,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,112,97,119,110,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,101,120,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,120,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,108,105,110,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,105,110,107>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,108,105,110,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,108,105,110,107>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,108,105,110,107,101,100>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<112,111,114,116,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,112,111,114,116,45,114,101,108,97,116,101,100,32,101,118,101,110,116,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,112,101,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,112,101,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,108,111,115,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,108,111,115,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,108,105,110,107,101,100>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,105,110,103>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<101,120,105,116,105,110,103>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,101,120,105,116,105,110,103,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,95,101,120,105,116,105,110,103>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,105,110,103,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116,95,101,120,105,116,105,110,103>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,101,100,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116,95,101,120,105,116,101,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,105,110,103,95,112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,112,114,111,99,101,115,115,101,115,32,106,117,115,116,32,108,105,107,101,32>>,{code,[],[<<114,117,110,110,105,110,103>>]},<<46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,111,112,116,105,111,110,32,97,108,115,111,32,105,110,99,108,117,100,101,115,32,115,99,104,101,100,117,108,101,32,101,118,101,110,116,115,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,119,105,116,104,105,110,32,116,104,101,32,99,111,110,116,101,120,116,32,111,102,32,97,32,112,111,114,116,32,119,105,116,104,111,117,116,32,98,101,105,110,103,32,115,99,104,101,100,117,108,101,100,32,111,117,116,32,105,116,115,101,108,102,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,105,110,103,95,112,111,114,116,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,112,111,114,116,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,111,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,111,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,111,102,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,101,110,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,101,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<73,110,99,108,117,100,101,115,32,97,32,116,105,109,101,32,115,116,97,109,112,32,105,110,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,40,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<65,32,103,108,111,98,97,108,32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,110,111,100,101,32,116,104,97,116,32,109,97,107,101,115,32,97,108,108,32,116,114,97,99,101,32,116,105,109,101,32,115,116,97,109,112,115,32,117,115,105,110,103,32,102,108,97,103,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<32,116,111,32,98,101,32,105,110,32,67,80,85,32,116,105,109,101,44,32,110,111,116,32,119,97,108,108,32,99,108,111,99,107,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,110,111,116,32,98,101,32,117,115,101,100,32,105,102,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<32,111,114,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,101,110,97,98,108,101,100,46,32,79,110,108,121,32,97,108,108,111,119,101,100,32,119,105,116,104,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99,61,61,97,108,108>>]},<<46,32,73,102,32,116,104,101,32,104,111,115,116,32,109,97,99,104,105,110,101,32,79,83,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,104,105,103,104,45,114,101,115,111,108,117,116,105,111,110,32,67,80,85,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,44,32>>,{code,[],[<<116,114,97,99,101,47,51>>]},<<32,101,120,105,116,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,115,116,32,79,83,32,100,111,32,110,111,116,32,115,121,110,99,104,114,111,110,105,122,101,32,116,104,105,115,32,118,97,108,117,101,32,97,99,114,111,115,115,32,99,111,114,101,115,44,32,115,111,32,98,101,32,112,114,101,112,97,114,101,100,32,116,104,97,116,32,116,105,109,101,32,99,97,110,32,115,101,101,109,32,116,111,32,103,111,32,98,97,99,107,119,97,114,100,115,32,119,104,101,110,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<73,110,99,108,117,100,101,115,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,116,105,109,101,32,115,116,97,109,112,32,105,110,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41>>]}]},<<46,32,84,104,105,115,32,102,108,97,103,32,111,118,101,114,114,105,100,101,115,32,102,108,97,103,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<73,110,99,108,117,100,101,115,32,97,110,32,116,105,109,101,32,115,116,97,109,112,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,105,110,116,101,103,101,114,32,105,110,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{code,[],[<<123>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41>>]}]},{code,[],[<<44>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]}]},{code,[],[<<125>>]},<<46,32,84,104,105,115,32,102,108,97,103,32,111,118,101,114,114,105,100,101,115,32,102,108,97,103,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<46>>]}]},{dt,[],[{code,[],[<<97,114,105,116,121>>]}]},{dd,[],[{p,[],[<<85,115,101,100,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,46,32>>,{code,[],[<<123,77,44,32,70,44,32,65,114,105,116,121,125>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<123,77,44,32,70,44,32,65,114,103,115,125>>]},<<32,105,110,32,99,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,97,110,121,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,105,110,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,116,104,101,32,102,105,114,115,116,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,101,120,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,97,110,121,32,112,114,111,99,101,115,115,32,108,105,110,107,101,100,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,105,110,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,116,104,101,32,102,105,114,115,116,32,112,114,111,99,101,115,115,32,108,105,110,107,101,100,32,116,111,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,101,120,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,119,104,101,114,101,32,116,111,32,115,101,110,100,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32>>,{code,[],[<<84,114,97,99,101,114>>]},<<32,109,117,115,116,32,98,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,108,111,99,97,108,32,112,111,114,116,46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,97,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,105,110,115,116,101,97,100,32,111,102,32,115,101,110,100,105,110,103,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,84,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,99,97,110,32,116,104,101,110,32,105,103,110,111,114,101,32,111,114,32,99,104,97,110,103,101,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,111,32,119,114,105,116,101,32,97,32,116,114,97,99,101,114,32,109,111,100,117,108,101,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,108,95,116,114,97,99,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,116,114,97,99,101,114,40,51,41>>]}]},<<46>>]}]}]},{p,[],[<<73,102,32,110,111,32>>,{code,[],[<<116,114,97,99,101,114>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,115,32,97,108,108,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46>>]},{p,[],[<<84,104,101,32,101,102,102,101,99,116,32,111,102,32,99,111,109,98,105,110,105,110,103,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]},<<32,119,105,116,104,32>>,{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]},<<32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]},<<32,97,108,111,110,101,46,32,76,105,107,101,119,105,115,101,32,102,111,114,32>>,{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]},<<32,97,110,100,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]},<<46>>]},{p,[],[<<84,104,101,32,116,114,97,99,105,110,103,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,115,32,116,104,101,32>>,{em,[],[<<116,114,97,99,101,32,109,101,115,115,97,103,101,115>>]},<<32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,108,105,115,116,46,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,32,119,104,105,99,104,32,116,104,101,32,116,114,97,99,101,100,32,101,118,101,110,116,32,104,97,115,32,111,99,99,117,114,114,101,100,46,32,84,104,101,32,116,104,105,114,100,32,116,117,112,108,101,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,109,101,115,115,97,103,101,32,116,97,103,46>>]},{p,[],[<<73,102,32,102,108,97,103,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<44,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32,111,114,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,105,114,115,116,32,116,117,112,108,101,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<116,114,97,99,101,95,116,115>>]},<<32,105,110,115,116,101,97,100,44,32,97,110,100,32,116,104,101,32,116,105,109,101,32,115,116,97,109,112,32,105,115,32,97,100,100,101,100,32,97,115,32,97,110,32,101,120,116,114,97,32,101,108,101,109,101,110,116,32,108,97,115,116,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,116,117,112,108,101,46,32,73,102,32,109,117,108,116,105,112,108,101,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,115,32,97,114,101,32,112,97,115,115,101,100,44,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<32,104,97,115,32,112,114,101,99,101,100,101,110,99,101,32,111,118,101,114,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,104,97,115,32,112,114,101,99,101,100,101,110,99,101,32,111,118,101,114,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<46,32,65,108,108,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,115,32,97,114,101,32,114,101,109,101,109,98,101,114,101,100,44,32,115,111,32,105,102,32,116,119,111,32,97,114,101,32,112,97,115,115,101,100,32,97,110,100,32,116,104,101,32,111,110,101,32,119,105,116,104,32,104,105,103,104,101,115,116,32,112,114,101,99,101,100,101,110,99,101,32,108,97,116,101,114,32,105,115,32,100,105,115,97,98,108,101,100,44,32,116,104,101,32,111,116,104,101,114,32,111,110,101,32,98,101,99,111,109,101,115,32,97,99,116,105,118,101,46>>]},{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,40,97,112,112,108,105,99,97,98,108,101,32,111,110,108,121,32,102,111,114,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<115,101,110,100>>]},<<32,97,110,100,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,105,110,103,41,32,99,111,110,116,97,105,110,115,32,97,32>>,{code,[],[<<123,109,101,115,115,97,103,101,125>>]},<<32,97,99,116,105,111,110,32,102,117,110,99,116,105,111,110,32,119,105,116,104,32,97,32,110,111,110,45,98,111,111,108,101,97,110,32,118,97,108,117,101,44,32,116,104,97,116,32,118,97,108,117,101,32,105,115,32,97,100,100,101,100,32,97,115,32,97,110,32,101,120,116,114,97,32,101,108,101,109,101,110,116,32,116,111,32,116,104,101,32,109,101,115,115,97,103,101,32,116,117,112,108,101,32,101,105,116,104,101,114,32,105,110,32,116,104,101,32,108,97,115,116,32,112,111,115,105,116,105,111,110,32,111,114,32,98,101,102,111,114,101,32,116,104,101,32,116,105,109,101,115,116,97,109,112,32,40,105,102,32,105,116,32,105,115,32,112,114,101,115,101,110,116,41,46>>]},{p,[],[<<84,114,97,99,101,32,109,101,115,115,97,103,101,115,58>>]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115>>}],[]},{dl,[],[{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,115,101,110,100,44,32,77,115,103,44,32,84,111,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,115,101,110,100,115,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<32,116,111,32,112,114,111,99,101,115,115,32>>,{code,[],[<<84,111>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115,44,32,77,115,103,44,32,84,111,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,115,101,110,100,115,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<32,116,111,32,116,104,101,32,110,111,110,45,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,32>>,{code,[],[<<84,111>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,99,101,105,118,101>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,39,114,101,99,101,105,118,101,39,44,32,77,115,103,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,114,101,99,101,105,118,101,115,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<46,32,73,102,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,116,105,109,101,45,111,117,116,44,32,97,32,114,101,99,101,105,118,101,32,115,116,97,116,101,109,101,110,116,32,99,97,110,32,104,97,118,101,32,116,105,109,101,100,32,111,117,116,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,100,32,97,32,109,101,115,115,97,103,101,32,119,105,116,104,32,116,104,101,32,112,97,121,108,111,97,100,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,97,108,108>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,99,97,108,108,44,32,123,77,44,32,70,44,32,65,114,103,115,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,99,97,108,108,115,32,97,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32,99,97,108,108,115,32,97,114,101,32,110,101,118,101,114,32,115,117,112,112,108,105,101,100,44,32,111,110,108,121,32,116,104,101,32,99,97,108,108,32,97,110,100,32,105,116,115,32,97,114,103,117,109,101,110,116,115,46>>]},{p,[],[<<84,114,97,99,101,32,102,108,97,103,32>>,{code,[],[<<97,114,105,116,121>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,105,115,32,109,101,115,115,97,103,101,44,32,115,111,32,116,104,97,116,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<65,114,103,115>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,116,111>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,114,101,116,117,114,110,95,116,111,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,114,101,116,117,114,110,115,32>>,{em,[],[<<116,111>>]},<<32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,46,32,84,104,105,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,98,111,116,104,32,116,104,101,32,102,108,97,103,115,32>>,{code,[],[<<99,97,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,97,114,101,32,115,101,116,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,115,101,116,32,116,111,32,98,101,32,116,114,97,99,101,100,32,111,110,32>>,{em,[],[<<108,111,99,97,108>>]},<<32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,104,101,32,109,101,115,115,97,103,101,32,105,115,32,111,110,108,121,32,115,101,110,116,32,119,104,101,110,32,114,101,116,117,114,110,105,110,103,32,102,114,111,109,32,97,32,99,104,97,105,110,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,119,104,101,114,101,32,97,116,32,108,101,97,115,116,32,111,110,101,32,99,97,108,108,32,103,101,110,101,114,97,116,101,100,32,97,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,40,116,104,97,116,32,105,115,44,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,109,97,116,99,104,101,100,44,32,97,110,100,32>>,{code,[],[<<123,109,101,115,115,97,103,101,44,32,102,97,108,115,101,125>>]},<<32,119,97,115,32,110,111,116,32,97,110,32,97,99,116,105,111,110,41,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,102,114,111,109>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,114,101,116,117,114,110,95,102,114,111,109,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,44,32,82,101,116,117,114,110,86,97,108,117,101,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,114,101,116,117,114,110,115,32>>,{em,[],[<<102,114,111,109>>]},<<32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,46,32,84,104,105,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,102,108,97,103,32>>,{code,[],[<<99,97,108,108>>]},<<32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,104,97,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,119,105,116,104,32,97,32>>,{code,[],[<<114,101,116,117,114,110,95,116,114,97,99,101>>]},<<32,111,114,32>>,{code,[],[<<101,120,99,101,112,116,105,111,110,95,116,114,97,99,101>>]},<<32,97,99,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,101,120,99,101,112,116,105,111,110,95,102,114,111,109>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,101,120,99,101,112,116,105,111,110,95,102,114,111,109,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,44,32,123,67,108,97,115,115,44,32,86,97,108,117,101,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,105,116,115,32>>,{em,[],[<<102,114,111,109>>]},<<32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,32,98,101,99,97,117,115,101,32,111,102,32,97,110,32,101,120,99,101,112,116,105,111,110,46,32,84,104,105,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,102,108,97,103,32>>,{code,[],[<<99,97,108,108>>]},<<32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,104,97,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,119,105,116,104,32,97,110,32>>,{code,[],[<<101,120,99,101,112,116,105,111,110,95,116,114,97,99,101>>]},<<32,97,99,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,115,112,97,119,110,44,32,80,105,100,50,44,32,123,77,44,32,70,44,32,65,114,103,115,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,115,112,97,119,110,115,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,46>>]},{p,[],[{code,[],[<<65,114,103,115>>]},<<32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,97,114,103,117,109,101,110,116,32,108,105,115,116,44,32,98,117,116,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,32,105,102,32,116,104,101,32,115,112,97,119,110,32,105,115,32,101,114,114,111,110,101,111,117,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,115,112,97,119,110,101,100,44,32,80,105,100,50,44,32,123,77,44,32,70,44,32,65,114,103,115,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,115,112,97,119,110,101,100,32,98,121,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,46>>]},{p,[],[{code,[],[<<65,114,103,115>>]},<<32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,97,114,103,117,109,101,110,116,32,108,105,115,116,44,32,98,117,116,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,32,105,102,32,116,104,101,32,115,112,97,119,110,32,105,115,32,101,114,114,111,110,101,111,117,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,101,120,105,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,101,120,105,116,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,105,116,115,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,103,105,115,116,101,114>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,114,101,103,105,115,116,101,114,44,32,82,101,103,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,114,101,103,105,115,116,101,114,101,100,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,114,101,103,105,115,116,101,114>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,117,110,114,101,103,105,115,116,101,114,44,32,82,101,103,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,117,110,114,101,103,105,115,116,101,114,101,100,46,32,84,104,105,115,32,105,115,32,100,111,110,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,119,104,101,110,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,101,120,105,116,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,108,105,110,107>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,108,105,110,107,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,108,105,110,107,115,32,116,111,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,108,105,110,107>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,117,110,108,105,110,107,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,114,101,109,111,118,101,115,32,116,104,101,32,108,105,110,107,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,108,105,110,107,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,103,101,116,116,105,110,103,95,108,105,110,107,101,100,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,108,105,110,107,101,100,32,116,111,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,117,110,108,105,110,107,101,100,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,101,120,105,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,101,120,105,116,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,105,116,115,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,112,101,110>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,111,112,101,110,44,32,80,105,100,44,32,68,114,105,118,101,114,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,111,112,101,110,115,32,97,32,110,101,119,32,112,111,114,116,32>>,{code,[],[<<80,111,114,116>>]},<<32,119,105,116,104,32,116,104,101,32,114,117,110,110,105,110,103,32>>,{code,[],[<<68,114,105,118,101,114>>]},<<46>>]},{p,[],[{code,[],[<<68,114,105,118,101,114>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,100,114,105,118,101,114,32,97,115,32,97,110,32,97,116,111,109,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,108,111,115,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,99,108,111,115,101,100,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,99,108,111,115,101,115,32,119,105,116,104,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,114,111,99>>}],[]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,101,120,105,116,105,110,103,95,112,114,111,99>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,105,110,32,124,32,105,110,95,101,120,105,116,105,110,103,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,114,117,110,46,32,84,104,101,32,112,114,111,99,101,115,115,32,114,117,110,115,32,105,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,77,44,32,70,44,32,65,114,105,116,121,125>>]},<<46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,114,111,99>>}],[]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,105,110,103,95,112,114,111,99>>}],[]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,101,100,95,112,114,111,99>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,111,117,116,32,124,32,111,117,116,95,101,120,105,116,105,110,103,32,124,32,111,117,116,95,101,120,105,116,101,100,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,46,32,84,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,114,117,110,110,105,110,103,32,105,110,32,102,117,110,99,116,105,111,110,32,123,77,44,32,70,44,32,65,114,105,116,121,125,46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,111,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,105,110,44,32,67,111,109,109,97,110,100,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,114,117,110,46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,105,115,32,116,104,101,32,102,105,114,115,116,32,116,104,105,110,103,32,116,104,101,32,112,111,114,116,32,119,105,108,108,32,101,120,101,99,117,116,101,44,32,105,116,32,99,97,110,32,104,111,119,101,118,101,114,32,114,117,110,32,115,101,118,101,114,97,108,32,99,111,109,109,97,110,100,115,32,98,101,102,111,114,101,32,98,101,105,110,103,32,115,99,104,101,100,117,108,101,100,32,111,117,116,46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]},{p,[],[<<84,104,101,32,112,111,115,115,105,98,108,101,32,99,111,109,109,97,110,100,115,32,97,114,101,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<99,108,111,115,101>>]},<<44,32>>,{code,[],[<<99,111,109,109,97,110,100>>]},<<44,32>>,{code,[],[<<99,111,110,110,101,99,116>>]},<<44,32>>,{code,[],[<<99,111,110,116,114,111,108>>]},<<44,32>>,{code,[],[<<102,108,117,115,104>>]},<<44,32>>,{code,[],[<<105,110,102,111>>]},<<44,32>>,{code,[],[<<108,105,110,107>>]},<<44,32>>,{code,[],[<<111,112,101,110>>]},<<44,32,97,110,100,32>>,{code,[],[<<117,110,108,105,110,107>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,111,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,111,117,116,44,32,67,111,109,109,97,110,100,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,46,32,84,104,101,32,108,97,115,116,32,99,111,109,109,97,110,100,32,114,117,110,32,119,97,115,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32,99,111,109,109,97,110,100,115,32,97,115,32>>,{code,[],[<<105,110>>]}]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,105,110,111,114,95,115,116,97,114,116,44,32,73,110,102,111,125>>]}]},{dd,[],[{a,[{id,<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>}],[]},{p,[],[<<83,101,110,116,32,119,104,101,110,32,97,32,121,111,117,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,98,111,117,116,32,116,111,32,98,101,32,115,116,97,114,116,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,44,32,119,104,101,114,101,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,107,101,121,44,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,105,115,32,116,104,101,32,118,97,108,117,101,46,32,68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,97,110,121,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,107,101,121,115,32,97,114,101,32,100,101,102,105,110,101,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,117,115,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,98,108,111,99,107,32,117,115,101,100,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,104,101,97,112,32,97,110,100,32,116,104,101,32,115,116,97,99,107,46>>]},{dt,[],[{code,[],[<<111,108,100,95,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,117,115,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32,111,108,100,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,98,108,111,99,107,32,117,115,101,100,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,111,108,100,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<115,116,97,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,116,97,99,107,46>>]},{dt,[],[{code,[],[<<114,101,99,101,110,116,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,116,104,97,116,32,115,117,114,118,105,118,101,100,32,116,104,101,32,112,114,101,118,105,111,117,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{dt,[],[{code,[],[<<109,98,117,102,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,99,111,109,98,105,110,101,100,32,115,105,122,101,32,111,102,32,109,101,115,115,97,103,101,32,98,117,102,102,101,114,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,99,101,115,115,46>>]},{dt,[],[{code,[],[<<98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,117,110,105,113,117,101,32,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<98,105,110,95,118,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,98,105,110,97,114,105,101,115,32,97,108,108,111,119,101,100,32,105,110,32,116,104,101,32,118,105,114,116,117,97,108,32,104,101,97,112,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,98,101,102,111,114,101,32,100,111,105,110,103,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{dt,[],[{code,[],[<<98,105,110,95,111,108,100,95,118,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,117,110,105,113,117,101,32,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,32,111,108,100,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<98,105,110,95,111,108,100,95,118,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,98,105,110,97,114,105,101,115,32,97,108,108,111,119,101,100,32,105,110,32,116,104,101,32,118,105,114,116,117,97,108,32,111,108,100,32,104,101,97,112,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,98,101,102,111,114,101,32,100,111,105,110,103,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]}]},{p,[],[<<65,108,108,32,115,105,122,101,115,32,97,114,101,32,105,110,32,119,111,114,100,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<32,105,115,32,114,101,97,99,104,101,100,32,100,117,114,105,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,115,116,97,114,116>>]},<<44,32,98,117,116,32,116,104,101,32,115,105,122,101,115,32,114,101,102,108,101,99,116,32,116,104,101,32,115,105,122,101,115,32,116,104,97,116,32,116,114,105,103,103,101,114,101,100,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,116,111,32,98,101,32,114,101,97,99,104,101,100,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,101,110,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,105,110,111,114,95,101,110,100,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,121,111,117,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,102,105,110,105,115,104,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]},<<44,32,98,117,116,32,116,104,101,32,115,105,122,101,115,32,114,101,102,108,101,99,116,32,116,104,101,32,110,101,119,32,115,105,122,101,115,32,97,102,116,101,114,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,106,111,114,95,115,116,97,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,97,106,111,114,95,115,116,97,114,116,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,98,111,117,116,32,116,111,32,98,101,32,115,116,97,114,116,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,106,111,114,95,101,110,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,97,106,111,114,95,101,110,100,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,102,105,110,105,115,104,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]},<<44,32,98,117,116,32,116,104,101,32,115,105,122,101,115,32,114,101,102,108,101,99,116,32,116,104,101,32,110,101,119,32,115,105,122,101,115,32,97,102,116,101,114,32,97,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]}]}]},{p,[],[<<73,102,32,116,104,101,32,116,114,97,99,105,110,103,32,112,114,111,99,101,115,115,47,112,111,114,116,32,100,105,101,115,32,111,114,32,116,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<114,101,109,111,118,101>>]},<<44,32,116,104,101,32,102,108,97,103,115,32,97,114,101,32,115,105,108,101,110,116,108,121,32,114,101,109,111,118,101,100,46>>]},{p,[],[<<69,97,99,104,32,112,114,111,99,101,115,115,32,99,97,110,32,111,110,108,121,32,98,101,32,116,114,97,99,101,100,32,98,121,32,111,110,101,32,116,114,97,99,101,114,46,32,84,104,101,114,101,102,111,114,101,44,32,97,116,116,101,109,112,116,115,32,116,111,32,116,114,97,99,101,32,97,110,32,97,108,114,101,97,100,121,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,102,97,105,108,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,117,109,98,101,114,32,105,110,100,105,99,97,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,109,97,116,99,104,101,100,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<49>>]},<<46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32>>,{code,[],[<<97,108,108>>]},<<32,111,114,32>>,{code,[],[<<101,120,105,115,116,105,110,103>>]},<<44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,114,117,110,110,105,110,103,46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32>>,{code,[],[<<110,101,119>>]},<<44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,97,108,108,32,112,108,97,116,102,111,114,109,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,48,51,54>>,signature => [{attribute,2013,spec,{{erlang,trace,3},[{type,2013,bounded_fun,[{type,2013,'fun',[{type,2013,product,[{var,2013,'PidPortSpec'},{var,2013,'How'},{var,2013,'FlagList'}]},{type,2013,integer,[]}]},[{type,2014,constraint,[{atom,2014,is_subtype},[{var,2014,'PidPortSpec'},{type,2014,union,[{type,2014,pid,[]},{type,2014,port,[]},{atom,2015,all},{atom,2015,processes},{atom,2015,ports},{atom,2016,existing},{atom,2016,existing_processes},{atom,2016,existing_ports},{atom,2017,new},{atom,2017,new_processes},{atom,2017,new_ports}]}]]},{type,2018,constraint,[{atom,2018,is_subtype},[{var,2018,'How'},{type,2018,boolean,[]}]]},{type,2019,constraint,[{atom,2019,is_subtype},[{var,2019,'FlagList'},{type,2019,list,[{user_type,2019,trace_flag,[]}]}]]}]]}]}}]}},{{function,trace_delivered,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2028}],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,100,101,108,105,118,101,114,121,32,111,102,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,40,103,101,110,101,114,97,116,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,107,101,114,110,101,108,58,115,101,113,95,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,113,95,116,114,97,99,101,40,51,41>>]}]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>]}]},<<41,32,105,115,32,100,105,115,108,111,99,97,116,101,100,32,111,110,32,116,104,101,32,116,105,109,101,45,108,105,110,101,32,99,111,109,112,97,114,101,100,32,116,111,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,104,97,115,32,112,97,115,115,101,100,32,115,111,109,101,32,115,112,101,99,105,102,105,99,32,112,111,105,110,116,32,105,110,32,105,116,115,32,101,120,101,99,117,116,105,111,110,44,32,97,110,100,32,121,111,117,32,119,97,110,116,32,116,111,32,107,110,111,119,32,119,104,101,110,32,97,116,32,108,101,97,115,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,101,118,101,110,116,115,32,117,112,32,116,111,32,116,104,105,115,32,112,111,105,110,116,32,104,97,118,101,32,114,101,97,99,104,101,100,32,116,104,101,32,116,114,97,99,101,114,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<46>>]},{p,[],[<<87,104,101,110,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,114,32,117,112,32,116,111,32,116,104,101,32,112,111,105,110,116,32,116,104,97,116,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,114,101,97,99,104,101,100,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<44,32,116,104,101,110,32,97,32>>,{code,[],[<<123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,84,114,97,99,101,101,44,32,82,101,102,125>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<32,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,109,101,115,115,97,103,101,32>>,{code,[],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100>>]},<<32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,105,109,112,108,121,32,116,104,97,116,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,110,115,116,101,97,100,32,105,116,32,105,109,112,108,105,101,115,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32>>,{em,[],[<<97,114,101,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100>>]},<<32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,116,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,32,105,102,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,105,115,32,110,111,116,44,32,97,110,100,32,104,97,115,32,110,111,116,32,98,101,101,110,32,116,114,97,99,101,100,32,98,121,32,115,111,109,101,111,110,101,44,32,98,117,116,32,105,102,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32>>,{em,[],[<<110,111>>]},<<32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,32>>,{code,[],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100>>]},<<32,109,101,115,115,97,103,101,32,97,114,114,105,118,101,115,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,99,117,114,114,101,110,116,108,121,32,111,114,32,112,114,101,118,105,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<32,114,101,115,105,100,101,115,32,111,110,46,32,84,104,101,32,115,112,101,99,105,97,108,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,97,116,111,109,32>>,{code,[],[<<97,108,108>>]},<<32,100,101,110,111,116,101,115,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,99,117,114,114,101,110,116,108,121,32,97,114,101,32,116,114,97,99,101,100,32,105,110,32,116,104,101,32,110,111,100,101,46>>]},{p,[],[<<87,104,101,110,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,101,114,108,95,116,114,97,99,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<84,114,97,99,101,114,32,77,111,100,117,108,101>>]},<<44,32,97,110,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,105,110,32,116,104,101,32,116,114,97,99,101,32,99,97,108,108,98,97,99,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,104,97,118,101,32,114,101,97,99,104,101,100,32,105,116,115,32,114,101,99,105,112,105,101,110,116,32,98,101,102,111,114,101,32,116,104,101,32>>,{code,[],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46>>]},{p,[],[<<69,120,97,109,112,108,101,58,32,80,114,111,99,101,115,115,32>>,{code,[],[<<65>>]},<<32,105,115,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<44,32,112,111,114,116,32>>,{code,[],[<<66>>]},<<32,105,115,32,116,114,97,99,101,114,44,32,97,110,100,32,112,114,111,99,101,115,115,32>>,{code,[],[<<67>>]},<<32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,111,102,32>>,{code,[],[<<66>>]},<<46,32>>,{code,[],[<<67>>]},<<32,119,97,110,116,115,32,116,111,32,99,108,111,115,101,32>>,{code,[],[<<66>>]},<<32,119,104,101,110,32>>,{code,[],[<<65>>]},<<32,101,120,105,116,115,46,32,84,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,116,114,97,99,101,32,105,115,32,110,111,116,32,116,114,117,110,99,97,116,101,100,44,32>>,{code,[],[<<67>>]},<<32,99,97,110,32,99,97,108,108,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,65,41>>]},<<32,119,104,101,110,32>>,{code,[],[<<65>>]},<<32,101,120,105,116,115,44,32,97,110,100,32,119,97,105,116,32,102,111,114,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,65,44,32,82,101,102,125>>]},<<32,98,101,102,111,114,101,32,99,108,111,115,105,110,103,32>>,{code,[],[<<66>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,40,100,101,97,100,32,111,114,32,97,108,105,118,101,41,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<32,114,101,115,105,100,101,115,32,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,54,57,55>>,signature => [{attribute,2028,spec,{{erlang,trace_delivered,1},[{type,2028,bounded_fun,[{type,2028,'fun',[{type,2028,product,[{var,2028,'Tracee'}]},{var,2028,'Ref'}]},[{type,2029,constraint,[{atom,2029,is_subtype},[{var,2029,'Tracee'},{type,2029,union,[{type,2029,pid,[]},{atom,2029,all}]}]]},{type,2030,constraint,[{atom,2030,is_subtype},[{var,2030,'Ref'},{type,2030,reference,[]}]]}]]}]}}]}},{{function,trace_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2035}],[<<116,114,97,99,101,95,105,110,102,111,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,105,110,102,111,95,102,108,97,103>>}],[]},{li,[{name,<<116,114,97,99,101,95,105,110,102,111,95,105,116,101,109,95,114,101,115,117,108,116>>}],[]},{li,[{name,<<116,114,97,99,101,95,105,110,102,111,95,114,101,116,117,114,110>>}],[]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,114,97,99,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,112,111,114,116,44,32,112,114,111,99,101,115,115,44,32,102,117,110,99,116,105,111,110,44,32,111,114,32,101,118,101,110,116,46>>]},{p,[],[{em,[],[<<84,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,112,111,114,116,32,111,114,32,112,114,111,99,101,115,115>>]},<<44,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32,116,111,32,98,101,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<110,101,119>>]},<<44,32>>,{code,[],[<<110,101,119,95,112,114,111,99,101,115,115,101,115>>]},<<44,32,111,114,32>>,{code,[],[<<110,101,119,95,112,111,114,116,115>>]},<<46,32,84,104,101,32,97,116,111,109,32>>,{code,[],[<<110,101,119>>]},<<32,111,114,32>>,{code,[],[<<110,101,119,95,112,114,111,99,101,115,115,101,115>>]},<<32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,116,114,97,99,101,32,115,116,97,116,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,32,116,111,32,98,101,32,99,114,101,97,116,101,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,97,116,111,109,32>>,{code,[],[<<110,101,119,95,112,111,114,116,115>>]},<<32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,116,114,97,99,101,32,115,116,97,116,101,32,102,111,114,32,112,111,114,116,115,32,116,111,32,98,101,32,99,114,101,97,116,101,100,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,102,111,114,32,112,111,114,116,115,32,97,110,100,32,112,114,111,99,101,115,115,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,108,97,103,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,116,111,109,115,32,105,110,100,105,99,97,116,105,110,103,32,119,104,97,116,32,107,105,110,100,32,111,102,32,116,114,97,99,101,115,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,108,105,115,116,32,105,115,32,101,109,112,116,121,32,105,102,32,110,111,32,116,114,97,99,101,115,32,97,114,101,32,101,110,97,98,108,101,100,44,32,97,110,100,32,111,110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,115,32,97,116,111,109,115,32,105,102,32,116,114,97,99,101,115,32,97,114,101,32,101,110,97,98,108,101,100,58,32>>,{code,[],[<<115,101,110,100>>]},<<44,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<44,32>>,{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]},<<44,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<44,32>>,{code,[],[<<112,114,111,99,115>>]},<<44,32>>,{code,[],[<<112,111,114,116,115>>]},<<44,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]},<<44,32>>,{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]},<<44,32>>,{code,[],[<<114,117,110,110,105,110,103>>]},<<44,32>>,{code,[],[<<114,117,110,110,105,110,103,95,112,114,111,99,115>>]},<<44,32>>,{code,[],[<<114,117,110,110,105,110,103,95,112,111,114,116,115>>]},<<44,32>>,{code,[],[<<115,105,108,101,110,116>>]},<<44,32>>,{code,[],[<<101,120,105,116,105,110,103>>]},<<44,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32>>,{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<44,32,97,110,100,32>>,{code,[],[<<97,114,105,116,121>>]},<<46,32,84,104,101,32,111,114,100,101,114,32,105,115,32,97,114,98,105,116,114,97,114,121,46>>]}]},{dt,[],[{code,[],[<<116,114,97,99,101,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,102,111,114,32,112,114,111,99,101,115,115,44,32,112,111,114,116,44,32,111,114,32,97,32,116,117,112,108,101,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,97,110,100,32,116,114,97,99,101,114,32,115,116,97,116,101,32,116,114,97,99,105,110,103,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,105,115,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,114,97,99,101,100,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]}]},{p,[],[{em,[],[<<84,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,102,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32,116,111,32,98,101,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<46,32,78,111,32,119,105,108,100,99,97,114,100,115,32,97,114,101,32,97,108,108,111,119,101,100,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,111,114,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,116,114,97,99,101,100,46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<44,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,114,101,102,101,114,115,32,116,111,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32,99,111,100,101,32,116,104,97,116,32,119,105,108,108,32,98,101,32,108,111,97,100,101,100,46>>]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,102,111,114,32,102,117,110,99,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,97,99,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,114,97,99,101,100,32,111,110,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,114,97,99,101,100,32,111,110,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,40,116,104,97,116,32,105,115,44,32,108,111,99,97,108,32,97,110,100,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,41,44,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,108,111,99,97,108,32,111,114,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,110,111,116,32,116,114,97,99,101,100,46>>]}]},{dt,[],[{code,[],[<<109,97,116,99,104,95,115,112,101,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,108,111,99,97,108,108,121,32,111,114,32,103,108,111,98,97,108,108,121,32,116,114,97,99,101,100,32,98,117,116,32,104,97,115,32,110,111,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,100,101,102,105,110,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,101,116,97>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,101,116,97,45,116,114,97,99,101,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,44,32,112,111,114,116,44,32,111,114,32,116,114,97,99,101,32,109,111,100,117,108,101,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,109,101,116,97,45,116,114,97,99,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,109,101,116,97,45,116,114,97,99,101,100,32,98,117,116,32,104,97,115,32,111,110,99,101,32,100,101,116,101,99,116,101,100,32,116,104,97,116,32,116,104,101,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,32,105,115,32,105,110,118,97,108,105,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,101,116,97,95,109,97,116,99,104,95,115,112,101,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,101,116,97,45,116,114,97,99,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,109,101,116,97,45,116,114,97,99,101,100,32,98,117,116,32,104,97,115,32,110,111,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,100,101,102,105,110,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,97,108,108,32,99,111,117,110,116,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,111,114,32>>,{code,[],[<<116,114,117,101>>]},<<32,102,111,114,32,116,104,101,32,112,115,101,117,100,111,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,105,102,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,105,115,32,97,99,116,105,118,101,46,32,79,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,97,108,108,32,116,105,109,101,32,118,97,108,117,101,115,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,111,114,32>>,{code,[],[<<116,114,117,101>>]},<<32,102,111,114,32,116,104,101,32,112,115,101,117,100,111,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,105,102,32,99,97,108,108,32,116,105,109,101,32,116,114,97,99,105,110,103,32,105,115,32,97,99,116,105,118,101,46,32,79,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,99,97,108,108,32,116,105,109,101,32,118,97,108,117,101,115,32,114,101,116,117,114,110,101,100,44,32>>,{code,[],[<<91,123,80,105,100,44,32,67,111,117,110,116,44,32,83,44,32,85,115,125,93>>]},<<44,32,105,115,32,97,32,108,105,115,116,32,111,102,32,101,97,99,104,32,112,114,111,99,101,115,115,32,116,104,97,116,32,101,120,101,99,117,116,101,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,97,110,100,32,105,116,115,32,115,112,101,99,105,102,105,99,32,99,111,117,110,116,101,114,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32>>,{code,[],[<<123,73,116,101,109,44,32,86,97,108,117,101,125>>]},<<32,116,117,112,108,101,115,32,102,111,114,32,97,108,108,32,111,116,104,101,114,32,105,116,101,109,115,44,32,111,114,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,110,111,32,116,114,97,99,105,110,103,32,105,115,32,97,99,116,105,118,101,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]}]},{p,[],[{em,[],[<<84,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,110,32,101,118,101,110,116>>]},<<44,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32,116,111,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<115,101,110,100>>]},<<32,111,114,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<46>>]},{p,[],[<<79,110,101,32,118,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,102,111,114,32,101,118,101,110,116,115,32,101,120,105,115,116,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<109,97,116,99,104,95,115,112,101,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,116,104,105,115,32,101,118,101,110,116,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,44,32,111,114,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,110,111,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,101,116,46>>]}]}]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<123,73,116,101,109,44,32,86,97,108,117,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,105,115,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46,32,73,102,32,97,32,112,105,100,32,102,111,114,32,97,32,100,101,97,100,32,112,114,111,99,101,115,115,32,119,97,115,32,115,112,101,99,105,102,105,101,100,44,32,111,114,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,110,111,110,45,101,120,105,115,116,105,110,103,32,102,117,110,99,116,105,111,110,44,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,105,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,55,53,50>>,signature => [{attribute,2035,spec,{{erlang,trace_info,2},[{type,2035,bounded_fun,[{type,2035,'fun',[{type,2035,product,[{var,2035,'PidPortFuncEvent'},{var,2035,'Item'}]},{var,2035,'Res'}]},[{type,2036,constraint,[{atom,2036,is_subtype},[{var,2036,'PidPortFuncEvent'},{type,2036,union,[{type,2036,pid,[]},{type,2036,port,[]},{atom,2036,new},{atom,2036,new_processes},{atom,2036,new_ports},{type,2037,tuple,[{var,2037,'Module'},{var,2037,'Function'},{var,2037,'Arity'}]},{atom,2037,on_load},{atom,2037,send},{atom,2037,'receive'}]}]]},{type,2038,constraint,[{atom,2038,is_subtype},[{var,2038,'Module'},{type,2038,module,[]}]]},{type,2039,constraint,[{atom,2039,is_subtype},[{var,2039,'Function'},{type,2039,atom,[]}]]},{type,2040,constraint,[{atom,2040,is_subtype},[{var,2040,'Arity'},{type,2040,arity,[]}]]},{type,2041,constraint,[{atom,2041,is_subtype},[{var,2041,'Item'},{type,2041,union,[{atom,2041,flags},{atom,2041,tracer},{atom,2041,traced},{atom,2041,match_spec},{atom,2042,meta},{atom,2042,meta_match_spec},{atom,2042,call_count},{atom,2042,call_time},{atom,2042,all}]}]]},{type,2043,constraint,[{atom,2043,is_subtype},[{var,2043,'Res'},{user_type,2043,trace_info_return,[]}]]}]]}]}}]}},{{function,trace_pattern,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2705}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]},{li,[{name,<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,109,102,97>>}],[]}]},{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,69,118,101,110,116,44,32,77,97,116,99,104,83,112,101,99,44,32,91,93,41>>]}]},<<44,32,114,101,116,97,105,110,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,56,56,56>>,signature => [{attribute,2705,spec,{{erlang,trace_pattern,2},[{type,2705,bounded_fun,[{type,2705,'fun',[{type,2705,product,[{var,2705,'MFA'},{var,2705,'MatchSpec'}]},{type,2705,non_neg_integer,[]}]},[{type,2706,constraint,[{atom,2706,is_subtype},[{var,2706,'MFA'},{type,2706,union,[{user_type,2706,trace_pattern_mfa,[]},{atom,2706,send},{atom,2706,'receive'}]}]]},{type,2707,constraint,[{atom,2707,is_subtype},[{var,2707,'MatchSpec'},{type,2707,union,[{ann_type,2707,[{var,2707,'MatchSpecList'},{user_type,2707,trace_match_spec,[]}]},{type,2708,boolean,[]},{atom,2709,restart},{atom,2710,pause}]}]]}]]}]}}]}},{{function,trace_pattern,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2725}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]}]},{p,[],[<<83,101,116,115,32,116,114,97,99,101,32,112,97,116,116,101,114,110,32,102,111,114,32>>,{em,[],[<<109,101,115,115,97,103,101,32,115,101,110,100,105,110,103>>]},<<46,32,77,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<32,116,111,32,115,101,116,32,116,104,101,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,46,32,66,121,32,100,101,102,97,117,108,116,32,97,108,108,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,102,114,111,109,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,116,114,97,99,101,100,46,32,84,111,32,108,105,109,105,116,32,116,114,97,99,101,100,32,115,101,110,100,32,101,118,101,110,116,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,109,101,115,115,97,103,101,32,99,111,110,116,101,110,116,44,32,116,104,101,32,115,101,110,100,101,114,32,97,110,100,47,111,114,32,116,104,101,32,114,101,99,101,105,118,101,114,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99>>]},<<32,99,97,110,32,116,97,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<77,97,116,99,104,83,112,101,99,76,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,100,111,110,101,32,111,110,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<91,82,101,99,101,105,118,101,114,44,32,77,115,103,93>>]},<<46,32>>,{code,[],[<<82,101,99,101,105,118,101,114>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,116,121,32,111,102,32,116,104,101,32,114,101,99,101,105,118,101,114,32,97,110,100,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,116,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,46,32,84,104,101,32,112,105,100,32,111,102,32,116,104,101,32,115,101,110,100,105,110,103,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,97,99,99,101,115,115,101,100,32,119,105,116,104,32,116,104,101,32,103,117,97,114,100,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<115,101,108,102,47,48>>]},<<46,32,65,110,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,109,97,116,99,104,95,115,112,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<69,110,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,115,101,110,116,32,109,101,115,115,97,103,101,115,32,40,102,114,111,109,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,41,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46,32>>,{em,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,115,101,110,116,32,109,101,115,115,97,103,101,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]}]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,109,117,115,116,32,98,101,32>>,{code,[],[<<91,93>>]},<<32,102,111,114,32,115,101,110,100,32,116,114,97,99,105,110,103,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,108,119,97,121,115,32>>,{code,[],[<<49>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,80,105,100,44,32,39,95,39,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,109,97,116,99,104,105,110,103,32>>,{code,[],[<<123,114,101,112,108,121,44,32,95,125>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,39,95,39,44,32,123,114,101,112,108,121,44,39,95,39,125,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,116,111,32,116,104,101,32,115,101,110,100,101,114,32,105,116,115,101,108,102,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,39,36,49,39,44,32,39,95,39,93,44,91,123,39,61,58,61,39,44,39,36,49,39,44,123,115,101,108,102,125,125,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,116,111,32,111,116,104,101,114,32,110,111,100,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,39,36,49,39,44,32,39,95,39,93,44,91,123,39,61,47,61,39,44,123,110,111,100,101,44,39,36,49,39,125,44,123,110,111,100,101,125,125,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,32,99,97,110,32,117,115,101,32,97,108,108,32,103,117,97,114,100,32,97,110,100,32,98,111,100,121,32,102,117,110,99,116,105,111,110,115,32,101,120,99,101,112,116,32>>,{code,[],[<<99,97,108,108,101,114>>]},<<46>>]}]},{p,[],[<<70,97,105,108,115,32,98,121,32,114,97,105,115,105,110,103,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,97,110,32,97,114,103,117,109,101,110,116,32,105,115,32,105,110,118,97,108,105,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,32,104,97,115,32,101,120,99,101,115,115,105,118,101,32,110,101,115,116,105,110,103,32,119,104,105,99,104,32,99,97,117,115,101,115,32,115,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,101,120,104,97,117,115,116,105,111,110,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,115,99,104,101,100,95,116,104,114,101,97,100,95,115,116,97,99,107,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<83,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,57,48,54>>,signature => [{attribute,2725,spec,{{erlang,trace_pattern,3},[{type,2725,bounded_fun,[{type,2725,'fun',[{type,2725,product,[{atom,2725,send},{var,2725,'MatchSpec'},{type,2725,nil,[]}]},{type,2725,non_neg_integer,[]}]},[{type,2726,constraint,[{atom,2726,is_subtype},[{var,2726,'MatchSpec'},{type,2726,union,[{ann_type,2726,[{var,2726,'MatchSpecList'},{user_type,2726,trace_match_spec,[]}]},{type,2727,boolean,[]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,trace_pattern,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2725}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]}]},{p,[],[<<83,101,116,115,32,116,114,97,99,101,32,112,97,116,116,101,114,110,32,102,111,114,32>>,{em,[],[<<109,101,115,115,97,103,101,32,114,101,99,101,105,118,105,110,103>>]},<<46,32,77,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<32,116,111,32,115,101,116,32,116,104,101,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,46,32,66,121,32,100,101,102,97,117,108,116,32,97,108,108,32,109,101,115,115,97,103,101,115,32,114,101,99,101,105,118,101,100,32,98,121,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,116,114,97,99,101,100,46,32,84,111,32,108,105,109,105,116,32,116,114,97,99,101,100,32,114,101,99,101,105,118,101,32,101,118,101,110,116,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,109,101,115,115,97,103,101,32,99,111,110,116,101,110,116,44,32,116,104,101,32,115,101,110,100,101,114,32,97,110,100,47,111,114,32,116,104,101,32,114,101,99,101,105,118,101,114,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99>>]},<<32,99,97,110,32,116,97,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<77,97,116,99,104,83,112,101,99,76,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,100,111,110,101,32,111,110,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<91,78,111,100,101,44,32,83,101,110,100,101,114,44,32,77,115,103,93>>]},<<46,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,111,102,32,116,104,101,32,115,101,110,100,101,114,46,32>>,{code,[],[<<83,101,110,100,101,114>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,116,121,32,111,102,32,116,104,101,32,115,101,110,100,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,115,101,110,100,101,114,32,105,115,32,110,111,116,32,107,110,111,119,110,32,40,119,104,105,99,104,32,99,97,110,32,98,101,32,116,104,101,32,99,97,115,101,32,102,111,114,32,114,101,109,111,116,101,32,115,101,110,100,101,114,115,41,46,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,116,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,46,32,84,104,101,32,112,105,100,32,111,102,32,116,104,101,32,114,101,99,101,105,118,105,110,103,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,97,99,99,101,115,115,101,100,32,119,105,116,104,32,116,104,101,32,103,117,97,114,100,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<115,101,108,102,47,48>>]},<<46,32,65,110,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,109,97,116,99,104,95,115,112,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<69,110,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,32,40,116,111,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,41,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46,32>>,{em,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]}]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,109,117,115,116,32,98,101,32>>,{code,[],[<<91,93>>]},<<32,102,111,114,32,114,101,99,101,105,118,101,32,116,114,97,99,105,110,103,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,108,119,97,121,115,32>>,{code,[],[<<49>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,102,114,111,109,32,97,32,115,112,101,99,105,102,105,99,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,39,114,101,99,101,105,118,101,39,44,32,91,123,91,39,95,39,44,80,105,100,44,32,39,95,39,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,109,97,116,99,104,105,110,103,32>>,{code,[],[<<123,114,101,112,108,121,44,32,95,125>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,39,114,101,99,101,105,118,101,39,44,32,91,123,91,39,95,39,44,39,95,39,44,32,123,114,101,112,108,121,44,39,95,39,125,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,102,114,111,109,32,111,116,104,101,114,32,110,111,100,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,39,114,101,99,101,105,118,101,39,44,32,91,123,91,39,36,49,39,44,32,39,95,39,44,32,39,95,39,93,44,91,123,39,61,47,61,39,44,39,36,49,39,44,123,110,111,100,101,125,125,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,32,99,97,110,32,117,115,101,32,97,108,108,32,103,117,97,114,100,32,97,110,100,32,98,111,100,121,32,102,117,110,99,116,105,111,110,115,32,101,120,99,101,112,116,32>>,{code,[],[<<99,97,108,108,101,114>>]},<<44,32>>,{code,[],[<<105,115,95,115,101,113,95,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<103,101,116,95,115,101,113,95,116,111,107,101,110>>]},<<44,32>>,{code,[],[<<115,101,116,95,115,101,113,95,116,111,107,101,110>>]},<<44,32>>,{code,[],[<<101,110,97,98,108,101,95,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<100,105,115,97,98,108,101,95,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<116,114,97,99,101>>]},<<44,32>>,{code,[],[<<115,105,108,101,110,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<112,114,111,99,101,115,115,95,100,117,109,112>>]},<<46>>]}]},{p,[],[<<70,97,105,108,115,32,98,121,32,114,97,105,115,105,110,103,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,97,110,32,97,114,103,117,109,101,110,116,32,105,115,32,105,110,118,97,108,105,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,32,104,97,115,32,101,120,99,101,115,115,105,118,101,32,110,101,115,116,105,110,103,32,119,104,105,99,104,32,99,97,117,115,101,115,32,115,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,101,120,104,97,117,115,116,105,111,110,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,115,99,104,101,100,95,116,104,114,101,97,100,95,115,116,97,99,107,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<83,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,57,57,51>>,signature => [{attribute,2725,spec,{{erlang,trace_pattern,3},[{type,2728,bounded_fun,[{type,2728,'fun',[{type,2728,product,[{atom,2728,'receive'},{var,2728,'MatchSpec'},{type,2728,nil,[]}]},{type,2728,non_neg_integer,[]}]},[{type,2729,constraint,[{atom,2729,is_subtype},[{var,2729,'MatchSpec'},{type,2729,union,[{ann_type,2729,[{var,2729,'MatchSpecList'},{user_type,2729,trace_match_spec,[]}]},{type,2730,boolean,[]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,trace_pattern,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2725}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]},{li,[{name,<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,102,108,97,103>>}],[]},{li,[{name,<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,109,102,97>>}],[]}]},{p,[],[<<69,110,97,98,108,101,115,32,111,114,32,100,105,115,97,98,108,101,115,32>>,{em,[],[<<99,97,108,108,32,116,114,97,99,105,110,103>>]},<<32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,102,117,110,99,116,105,111,110,115,46,32,77,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<32,116,111,32,115,101,116,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<67,111,110,99,101,112,116,117,97,108,108,121,44,32,99,97,108,108,32,116,114,97,99,105,110,103,32,119,111,114,107,115,32,97,115,32,102,111,108,108,111,119,115,46,32,73,110,115,105,100,101,32,116,104,101,32,69,114,108,97,110,103,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,44,32,97,32,115,101,116,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,97,32,115,101,116,32,111,102,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,116,111,32,98,101,32,116,114,97,99,101,100,46,32,73,102,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,99,97,108,108,115,32,97,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,44,32,116,104,101,32,116,114,97,99,101,32,97,99,116,105,111,110,32,105,115,32,116,97,107,101,110,46,32,79,116,104,101,114,119,105,115,101,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46>>]},{p,[],[<<84,111,32,97,100,100,32,111,114,32,114,101,109,111,118,101,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,32,116,111,32,116,104,101,32,115,101,116,32,111,102,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<46>>]},{p,[],[<<84,111,32,97,100,100,32,111,114,32,114,101,109,111,118,101,32,102,117,110,99,116,105,111,110,115,32,116,111,32,116,104,101,32,115,101,116,32,111,102,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,115,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<46>>]},{p,[],[<<84,104,101,32,66,73,70,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<32,99,97,110,32,97,108,115,111,32,97,100,100,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,32,116,111,32,97,32,102,117,110,99,116,105,111,110,46,32,65,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,99,111,109,112,114,105,115,101,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,116,104,101,32,102,117,110,99,116,105,111,110,32,97,114,103,117,109,101,110,116,115,32,109,117,115,116,32,109,97,116,99,104,44,32,97,32,103,117,97,114,100,32,101,120,112,114,101,115,115,105,111,110,32,116,104,97,116,32,109,117,115,116,32,101,118,97,108,117,97,116,101,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,97,110,100,32,97,110,32,97,99,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,97,99,116,105,111,110,32,105,115,32,116,111,32,115,101,110,100,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,111,114,32,116,104,101,32,103,117,97,114,100,32,102,97,105,108,115,44,32,116,104,101,32,97,99,116,105,111,110,32,105,115,32,110,111,116,32,101,120,101,99,117,116,101,100,46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,70,65>>]},<<32,105,115,32,116,111,32,98,101,32,97,32,116,117,112,108,101,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,46,32,73,116,32,99,97,110,32,98,101,32,116,104,101,32,109,111,100,117,108,101,44,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,97,114,105,116,121,32,102,111,114,32,97,32,102,117,110,99,116,105,111,110,32,40,111,114,32,97,32,66,73,70,32,105,110,32,97,110,121,32,109,111,100,117,108,101,41,46,32,84,104,101,32,97,116,111,109,32>>,{code,[],[<<39,95,39>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,97,115,32,97,32,119,105,108,100,99,97,114,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,119,97,121,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,39,95,39,125>>]}]},{dd,[],[{p,[],[<<65,108,108,32,102,117,110,99,116,105,111,110,115,32,111,102,32,97,110,121,32,97,114,105,116,121,32,110,97,109,101,100,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,110,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,77,111,100,117,108,101,44,39,95,39,44,39,95,39,125>>]}]},{dd,[],[{p,[],[<<65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,39,95,39,44,39,95,39,44,39,95,39,125>>]}]},{dd,[],[{p,[],[<<65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,97,108,108,32,108,111,97,100,101,100,32,109,111,100,117,108,101,115,46>>]}]}]},{p,[],[<<79,116,104,101,114,32,99,111,109,98,105,110,97,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,39,95,39,44,65,114,105,116,121,125>>]},<<44,32,97,114,101,32,110,111,116,32,97,108,108,111,119,101,100,46,32,76,111,99,97,108,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,32,119,105,108,100,99,97,114,100,115,32,111,110,108,121,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,105,115,32,105,110,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<46>>]},{p,[],[<<73,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<77,70,65>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<44,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,110,100,32,102,108,97,103,32,108,105,115,116,32,97,114,101,32,117,115,101,100,32,111,110,32,97,108,108,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,110,101,119,108,121,32,108,111,97,100,101,100,46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99>>]},<<32,99,97,110,32,116,97,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<69,110,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]},{dt,[],[{code,[],[<<77,97,116,99,104,83,112,101,99,76,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,32,65,110,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,70,111,114,32,97,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,116,115,58,109,97,116,99,104,95,115,112,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{code,[],[<<114,101,115,116,97,114,116>>]}]},{dd,[],[{p,[],[<<70,111,114,32,116,104,101,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<99,97,108,108,95,116,105,109,101>>]},<<58,32,114,101,115,116,97,114,116,115,32,116,104,101,32,101,120,105,115,116,105,110,103,32,99,111,117,110,116,101,114,115,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32,111,116,104,101,114,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<112,97,117,115,101>>]}]},{dd,[],[{p,[],[<<70,111,114,32,116,104,101,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<99,97,108,108,95,116,105,109,101>>]},<<58,32,112,97,117,115,101,115,32,116,104,101,32,101,120,105,115,116,105,110,103,32,99,111,117,110,116,101,114,115,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32,111,116,104,101,114,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,46>>]}]}]},{p,[],[<<80,97,114,97,109,101,116,101,114,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,118,97,108,105,100,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<103,108,111,98,97,108>>]}]},{dd,[],[{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,99,97,108,108,32,116,114,97,99,105,110,103,32,102,111,114,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,40,116,104,97,116,32,105,115,44,32,99,97,108,108,115,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,109,111,100,117,108,101,32,101,120,112,108,105,99,105,116,108,121,41,46,32,79,110,108,121,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,32,97,110,100,32,111,110,108,121,32,103,108,111,98,97,108,32,99,97,108,108,115,32,103,101,110,101,114,97,116,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32>>,{em,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<108,111,99,97,108>>]}]},{dd,[],[{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,99,97,108,108,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,119,104,101,110,101,118,101,114,32,97,110,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,104,111,119,32,116,104,101,121,32,97,114,101,32,99,97,108,108,101,100,46,32,73,102,32,102,108,97,103,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,105,115,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,97,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,97,108,115,111,32,115,101,110,116,32,119,104,101,110,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46>>]}]},{dt,[],[{code,[],[<<109,101,116,97,32,124,32,123,109,101,116,97,44,32,80,105,100,125,32,124,32,123,109,101,116,97,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125>>]}]},{dd,[],[{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,109,101,116,97,45,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,116,111,32,116,104,101,32,116,114,97,99,101,114,32,119,104,101,110,101,118,101,114,32,97,110,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,73,102,32,110,111,32,116,114,97,99,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<115,101,108,102,40,41>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,97,32,100,101,102,97,117,108,116,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<77,101,116,97,45,116,114,97,99,105,110,103,32,116,114,97,99,101,115,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,100,111,101,115,32,110,111,116,32,99,97,114,101,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,116,114,97,99,101,32,102,108,97,103,115,32,115,101,116,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]},<<44,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,97,114,101,32,105,110,115,116,101,97,100,32,102,105,120,101,100,32,116,111,32>>,{code,[],[<<91,99,97,108,108,44,32,116,105,109,101,115,116,97,109,112,93>>]},<<46>>]},{p,[],[<<84,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,114,101,116,117,114,110,95,116,114,97,99,101,125>>]},<<32,119,111,114,107,115,32,119,105,116,104,32,109,101,116,97,45,116,114,97,99,101,32,97,110,100,32,115,101,110,100,115,32,105,116,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,116,111,32,116,104,101,32,115,97,109,101,32,116,114,97,99,101,114,46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,116,114,117,101>>]},<<41,32,111,114,32,115,116,111,112,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,102,97,108,115,101>>]},<<41,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,70,111,114,32,101,118,101,114,121,32,102,117,110,99,116,105,111,110,44,32,97,32,99,111,117,110,116,101,114,32,105,115,32,105,110,99,114,101,109,101,110,116,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,44,32,105,110,32,97,110,121,32,112,114,111,99,101,115,115,46,32,78,111,32,112,114,111,99,101,115,115,32,116,114,97,99,101,32,102,108,97,103,115,32,110,101,101,100,32,116,111,32,98,101,32,97,99,116,105,118,97,116,101,100,46>>]},{p,[],[<<73,102,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,105,115,32,115,116,97,114,116,101,100,32,119,104,105,108,101,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,44,32,116,104,101,32,99,111,117,110,116,32,105,115,32,114,101,115,116,97,114,116,101,100,32,102,114,111,109,32,122,101,114,111,46,32,84,111,32,112,97,117,115,101,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,44,32,117,115,101,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,112,97,117,115,101>>]},<<46,32,80,97,117,115,101,100,32,97,110,100,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,32,99,97,110,32,98,101,32,114,101,115,116,97,114,116,101,100,32,102,114,111,109,32,122,101,114,111,32,119,105,116,104,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,114,101,115,116,97,114,116>>]},<<46>>]},{p,[],[<<84,111,32,114,101,97,100,32,116,104,101,32,99,111,117,110,116,101,114,32,118,97,108,117,101,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,116,114,117,101>>]},<<41,32,111,114,32,115,116,111,112,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,102,97,108,115,101>>]},<<41,32,99,97,108,108,32,116,105,109,101,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,70,111,114,32,101,118,101,114,121,32,102,117,110,99,116,105,111,110,44,32,97,32,99,111,117,110,116,101,114,32,105,115,32,105,110,99,114,101,109,101,110,116,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,46,32,84,105,109,101,32,115,112,101,110,116,32,105,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,97,99,99,117,109,117,108,97,116,101,100,32,105,110,32,116,119,111,32,111,116,104,101,114,32,99,111,117,110,116,101,114,115,44,32,115,101,99,111,110,100,115,32,97,110,100,32,109,105,99,114,111,115,101,99,111,110,100,115,46,32,84,104,101,32,99,111,117,110,116,101,114,115,32,97,114,101,32,115,116,111,114,101,100,32,102,111,114,32,101,97,99,104,32,99,97,108,108,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,102,32,99,97,108,108,32,116,105,109,101,32,116,114,97,99,105,110,103,32,105,115,32,115,116,97,114,116,101,100,32,119,104,105,108,101,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,44,32,116,104,101,32,99,111,117,110,116,32,97,110,100,32,116,105,109,101,32,114,101,115,116,97,114,116,32,102,114,111,109,32,122,101,114,111,46,32,84,111,32,112,97,117,115,101,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,44,32,117,115,101,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,112,97,117,115,101>>]},<<46,32,80,97,117,115,101,100,32,97,110,100,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,32,99,97,110,32,98,101,32,114,101,115,116,97,114,116,101,100,32,102,114,111,109,32,122,101,114,111,32,119,105,116,104,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,114,101,115,116,97,114,116>>]},<<46>>]},{p,[],[<<84,111,32,114,101,97,100,32,116,104,101,32,99,111,117,110,116,101,114,32,118,97,108,117,101,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]}]},{p,[],[<<84,104,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,97,110,100,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,44,32,97,110,100,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,40,105,102,32,110,111,32,111,112,116,105,111,110,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,41,46,32,84,104,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<109,101,116,97>>]},<<32,112,101,114,102,111,114,109,32,97,32,107,105,110,100,32,111,102,32,108,111,99,97,108,32,116,114,97,99,105,110,103,44,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<46,32,65,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,103,108,111,98,97,108,108,121,32,111,114,32,108,111,99,97,108,108,121,32,116,114,97,99,101,100,46,32,73,102,32,103,108,111,98,97,108,32,116,114,97,99,105,110,103,32,105,115,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,97,32,115,101,116,32,111,102,32,102,117,110,99,116,105,111,110,115,44,32,116,104,101,110,32,108,111,99,97,108,44,32,109,101,116,97,44,32,99,97,108,108,32,116,105,109,101,44,32,97,110,100,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,102,111,114,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,101,116,32,111,102,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,115,32,105,115,32,100,105,115,97,98,108,101,100,44,32,97,110,100,32,99,111,110,118,101,114,115,101,108,121,46>>]},{p,[],[<<87,104,101,110,32,100,105,115,97,98,108,105,110,103,32,116,114,97,99,101,44,32,116,104,101,32,111,112,116,105,111,110,32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,116,121,112,101,32,111,102,32,116,114,97,99,101,32,115,101,116,32,111,110,32,116,104,101,32,102,117,110,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,108,111,99,97,108,32,116,114,97,99,105,110,103,32,109,117,115,116,32,98,101,32,100,105,115,97,98,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,97,110,100,32,103,108,111,98,97,108,32,116,114,97,99,105,110,103,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,40,111,114,32,110,111,32,111,112,116,105,111,110,41,44,32,97,110,100,32,115,111,32,111,110,46>>]},{p,[],[<<80,97,114,116,32,111,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,108,105,115,116,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,100,105,114,101,99,116,108,121,46,32,73,102,32,97,32,102,117,110,99,116,105,111,110,32,104,97,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,105,116,32,99,97,110,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,97,32,110,101,119,32,111,110,101,46,32,84,111,32,99,104,97,110,103,101,32,97,110,32,101,120,105,115,116,105,110,103,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,117,115,101,32,116,104,101,32,66,73,70,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,105,110,102,111,47,50>>]}]},<<32,116,111,32,114,101,116,114,105,101,118,101,32,116,104,101,32,101,120,105,115,116,105,110,103,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,105,110,103,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<77,70,65>>]},<<46,32,84,104,105,115,32,105,115,32,122,101,114,111,32,105,102,32,110,111,110,101,32,109,97,116,99,104,101,100,46>>]},{p,[],[<<70,97,105,108,115,32,98,121,32,114,97,105,115,105,110,103,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,97,110,32,97,114,103,117,109,101,110,116,32,105,115,32,105,110,118,97,108,105,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,32,104,97,115,32,101,120,99,101,115,115,105,118,101,32,110,101,115,116,105,110,103,32,119,104,105,99,104,32,99,97,117,115,101,115,32,115,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,101,120,104,97,117,115,116,105,111,110,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,115,99,104,101,100,95,116,104,114,101,97,100,95,115,116,97,99,107,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<83,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,48,56,49>>,signature => [{attribute,2725,spec,{{erlang,trace_pattern,3},[{type,2731,bounded_fun,[{type,2731,'fun',[{type,2731,product,[{var,2731,'MFA'},{var,2731,'MatchSpec'},{var,2731,'FlagList'}]},{type,2731,non_neg_integer,[]}]},[{type,2732,constraint,[{atom,2732,is_subtype},[{var,2732,'MFA'},{user_type,2732,trace_pattern_mfa,[]}]]},{type,2733,constraint,[{atom,2733,is_subtype},[{var,2733,'MatchSpec'},{type,2733,union,[{ann_type,2733,[{var,2733,'MatchSpecList'},{user_type,2733,trace_match_spec,[]}]},{type,2734,boolean,[]},{atom,2735,restart},{atom,2736,pause}]}]]},{type,2737,constraint,[{atom,2737,is_subtype},[{var,2737,'FlagList'},{type,2737,list,[{user_type,2737,trace_pattern_flag,[]}]}]]}]]}]}}]}},{{function,trunc,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2049}],[<<116,114,117,110,99,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,117,110,99,97,116,101,115,32,116,104,101,32,100,101,99,105,109,97,108,115,32,111,102,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,53,46,55,41,46,10,53>>]}]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,45,53,46,55,41,46,10,45,53>>]}]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,53,41,46,10,53>>]}]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]}]},{p,[],[<<73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41>>]},<<32,101,118,97,108,117,97,116,101,115,32,116,111,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]},<<46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48>>]},<<32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,32,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,32,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,50,56,56>>,signature => [{attribute,2049,spec,{{trunc,1},[{type,2049,bounded_fun,[{type,2049,'fun',[{type,2049,product,[{var,2049,'Number'}]},{type,2049,integer,[]}]},[{type,2050,constraint,[{atom,2050,is_subtype},[{var,2050,'Number'},{type,2050,number,[]}]]}]]}]}}]}},{{function,tuple_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2056}],[<<116,117,112,108,101,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32>>,{code,[],[<<84,117,112,108,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,117,112,108,101,95,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,51,49,57>>,signature => [{attribute,2056,spec,{{tuple_size,1},[{type,2056,bounded_fun,[{type,2056,'fun',[{type,2056,product,[{var,2056,'Tuple'}]},{type,2056,non_neg_integer,[]}]},[{type,2057,constraint,[{atom,2057,is_subtype},[{var,2057,'Tuple'},{type,2057,tuple,any}]]}]]}]}}]}},{{function,tuple_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2747}],[<<116,117,112,108,101,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<84,117,112,108,101>>]},<<46,32>>,{code,[],[<<84,117,112,108,101>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,117,112,108,101,95,116,111,95,108,105,115,116,40,123,115,104,97,114,101,44,32,123,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,125,125,41,46,10,91,115,104,97,114,101,44,123,39,69,114,105,99,115,115,111,110,95,66,39,44,49,54,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,51,51,50>>,signature => [{attribute,2747,spec,{{tuple_to_list,1},[{type,2747,bounded_fun,[{type,2747,'fun',[{type,2747,product,[{var,2747,'Tuple'}]},{type,2747,list,[{type,2747,term,[]}]}]},[{type,2748,constraint,[{atom,2748,is_subtype},[{var,2748,'Tuple'},{type,2748,tuple,any}]]}]]}]}}]}},{{function,unalias,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,766}],[<<117,110,97,108,105,97,115,47,49>>],#{<<101,110>> => [{p,[],[<<68,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32>>,{code,[],[<<65,108,105,97,115>>]},<<32,112,114,101,118,105,111,117,115,108,121,32,99,114,101,97,116,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,65,110,32,97,108,105,97,115,32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,98,101,32,99,114,101,97,116,101,100,32,118,105,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,97,108,105,97,115,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,108,105,97,115,47,48>>]}]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,51>>]}]},<<46,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<32,119,105,108,108,32,97,108,119,97,121,115,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,111,112,116,105,111,110,115,32,117,115,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,32,116,104,101,32,97,108,105,97,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,114,117,101,32,105,102,32>>,{code,[],[<<65,108,105,97,115>>]},<<32,119,97,115,32,97,32,99,117,114,114,101,110,116,108,121,32,97,99,116,105,118,101,32,97,108,105,97,115,32,102,111,114,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,101,115,59,32,111,116,104,101,114,119,105,115,101,44,32,102,97,108,115,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,51,52,53>>,signature => [{attribute,766,spec,{{unalias,1},[{type,766,bounded_fun,[{type,766,'fun',[{type,766,product,[{var,766,'Alias'}]},{type,766,boolean,[]}]},[{type,767,constraint,[{atom,767,is_subtype},[{var,767,'Alias'},{type,767,reference,[]}]]}]]}]}}],since => <<79,84,80,32,64,79,84,80,45,49,54,55,49,56,64>>}},{{function,unique_integer,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1529}],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,48>>],#{<<101,110>> => [{p,[],[<<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101>>]},<<46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,51,54,53>>,signature => [{attribute,1529,spec,{{erlang,unique_integer,0},[{type,1529,'fun',[{type,1529,product,[]},{type,1529,integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,unique_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1522}],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101>>]},<<46,32,84,104,101,32,105,110,116,101,103,101,114,32,105,115,32,117,110,105,113,117,101,32,105,110,32,116,104,101,32,115,101,110,115,101,32,116,104,97,116,32,116,104,105,115,32,66,73,70,44,32,117,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,109,111,100,105,102,105,101,114,115,44,32,100,111,101,115,32,110,111,116,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,105,110,116,101,103,101,114,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,69,97,99,104,32,105,110,116,101,103,101,114,32,118,97,108,117,101,32,99,97,110,32,111,102,32,99,111,117,114,115,101,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,32,111,116,104,101,114,32,109,101,97,110,115,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,119,104,101,110,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,112,97,115,115,101,100,32,97,115,32>>,{code,[],[<<77,111,100,105,102,105,101,114,76,105,115,116>>]},<<44,32,98,111,116,104,32,110,101,103,97,116,105,118,101,32,97,110,100,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,116,111,32,117,115,101,32,116,104,101,32,114,97,110,103,101,32,111,102,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,100,111,32,110,111,116,32,110,101,101,100,32,104,101,97,112,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,66,121,32,100,101,102,97,117,108,116,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,97,114,101,32,97,108,115,111,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,117,110,105,113,117,101,44,32,116,104,97,116,32,105,115,44,32,97,110,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,32,99,97,110,32,98,101,32,115,109,97,108,108,101,114,32,111,114,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,46>>]},{p,[],[{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,58>>]},{dl,[],[{dt,[],[<<112,111,115,105,116,105,118,101>>]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,111,110,108,121,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,32>>,{code,[],[<<112,111,115,105,116,105,118,101>>]},<<32,109,111,100,105,102,105,101,114,32,121,111,117,32,119,105,108,108,32,103,101,116,32,104,101,97,112,32,97,108,108,111,99,97,116,101,100,32,105,110,116,101,103,101,114,115,32,40,98,105,103,110,117,109,115,41,32,113,117,105,99,107,101,114,46>>]}]},{dt,[],[<<109,111,110,111,116,111,110,105,99>>]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,116,114,105,99,116,108,121,95,77,111,110,111,116,111,110,105,99,97,108,108,121,95,73,110,99,114,101,97,115,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103>>]},<<32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,99,114,101,97,116,105,111,110,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,105,115,32,97,108,119,97,121,115,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46>>]},{p,[],[<<84,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,101,118,101,110,116,115,32,111,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,97,116,32,105,115,44,32,105,102,32,98,111,116,104,32>>,{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]},<<32,97,110,100,32>>,{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]},<<32,97,114,101,32,101,120,101,99,117,116,101,100,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,32,40,111,114,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,41,32,111,110,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,97,110,100,32>>,{code,[],[<<88,32,60,32,89>>]},<<44,32,119,101,32,107,110,111,119,32,116,104,97,116,32>>,{code,[],[<<88>>]},<<32,119,97,115,32,99,114,101,97,116,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<89>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<83,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,32,97,114,101,32,105,110,104,101,114,101,110,116,108,121,32,113,117,105,116,101,32,101,120,112,101,110,115,105,118,101,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,100,32,115,99,97,108,101,115,32,112,111,111,114,108,121,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,118,97,108,117,101,115,32,110,101,101,100,32,116,111,32,98,101,32,115,121,110,99,104,114,111,110,105,122,101,100,32,98,101,116,119,101,101,110,32,67,80,85,32,99,111,114,101,115,46,32,84,104,97,116,32,105,115,44,32,100,111,32,110,111,116,32,112,97,115,115,32,116,104,101,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99>>]},<<32,109,111,100,105,102,105,101,114,32,117,110,108,101,115,115,32,121,111,117,32,114,101,97,108,108,121,32,110,101,101,100,32,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46>>]}]}]}]},{p,[],[<<65,108,108,32,118,97,108,105,100,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,46,32,82,101,112,101,97,116,101,100,32,40,118,97,108,105,100,41,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,32,105,110,32,116,104,101,32>>,{code,[],[<<77,111,100,105,102,105,101,114,76,105,115,116>>]},<<32,97,114,101,32,105,103,110,111,114,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,115,101,116,32,111,102,32,105,110,116,101,103,101,114,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>]},<<32,117,115,105,110,103,32,100,105,102,102,101,114,101,110,116,32,115,101,116,115,32,111,102,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,32>>,{em,[],[<<119,105,108,108,32,111,118,101,114,108,97,112>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,98,121,32,99,97,108,108,105,110,103,32>>,{code,[],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]},<<44,32,97,110,100,32>>,{code,[],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,112,111,115,105,116,105,118,101,44,32,109,111,110,111,116,111,110,105,99,93,41>>]},<<32,114,101,112,101,97,116,101,100,108,121,44,32,121,111,117,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,115,101,101,32,115,111,109,101,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,97,114,101,32,114,101,116,117,114,110,101,100,32,98,121,32,98,111,116,104,32,99,97,108,108,115,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<105,102,32>>,{code,[],[<<77,111,100,105,102,105,101,114,76,105,115,116>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<105,102,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<32,105,115,32,110,111,116,32,97,32,118,97,108,105,100,32,109,111,100,105,102,105,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,51,55,56>>,signature => [{attribute,1522,spec,{{erlang,unique_integer,1},[{type,1522,bounded_fun,[{type,1522,'fun',[{type,1522,product,[{var,1522,'ModifierList'}]},{type,1522,integer,[]}]},[{type,1523,constraint,[{atom,1523,is_subtype},[{var,1523,'ModifierList'},{type,1523,list,[{var,1523,'Modifier'}]}]]},{type,1524,constraint,[{atom,1524,is_subtype},[{var,1524,'Modifier'},{type,1524,union,[{atom,1524,positive},{atom,1524,monotonic}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,universaltime,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2062}],[<<117,110,105,118,101,114,115,97,108,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,97,99,99,111,114,100,105,110,103,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,105,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125>>]},<<32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41>>]},<<46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,52,54,48>>,signature => [{attribute,2062,spec,{{erlang,universaltime,0},[{type,2062,bounded_fun,[{type,2062,'fun',[{type,2062,product,[]},{var,2062,'DateTime'}]},[{type,2063,constraint,[{atom,2063,is_subtype},[{var,2063,'DateTime'},{remote_type,2063,[{atom,2063,calendar},{atom,2063,datetime},[]]}]]}]]}]}}]}},{{function,universaltime_to_localtime,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2874}],[<<117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,105,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125>>]},<<32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,44,32,97,110,100,32>>,{code,[],[<<85,110,105,118,101,114,115,97,108,116,105,109,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,55,125,44,123,49,53,44,49,56,44,52,51,125,125>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<85,110,105,118,101,114,115,97,108,116,105,109,101>>]},<<32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,52,55,57>>,signature => [{attribute,2874,spec,{{erlang,universaltime_to_localtime,1},[{type,2874,bounded_fun,[{type,2874,'fun',[{type,2874,product,[{var,2874,'Universaltime'}]},{var,2874,'Localtime'}]},[{type,2875,constraint,[{atom,2875,is_subtype},[{var,2875,'Localtime'},{remote_type,2875,[{atom,2875,calendar},{atom,2875,datetime},[]]}]]},{type,2876,constraint,[{atom,2876,is_subtype},[{var,2876,'Universaltime'},{remote_type,2876,[{atom,2876,calendar},{atom,2876,datetime},[]]}]]}]]}]}}]}},{{function,unlink,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2074}],[<<117,110,108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,109,111,118,101,115,32,116,104,101,32,108,105,110,107,44,32,105,102,32,116,104,101,114,101,32,105,115,32,111,110,101,44,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32>>,{code,[],[<<73,100>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,97,110,100,32,100,111,101,115,32,110,111,116,32,102,97,105,108,44,32,101,118,101,110,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,108,105,110,107,32,116,111,32>>,{code,[],[<<73,100>>]},<<44,32,111,114,32,105,102,32>>,{code,[],[<<73,100>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]},{p,[],[<<79,110,99,101,32>>,{code,[],[<<117,110,108,105,110,107,40,73,100,41>>]},<<32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,101,114,32,97,110,100,32,116,104,101,32,101,110,116,105,116,121,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32>>,{code,[],[<<73,100>>]},<<32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,116,104,101,32,99,97,108,108,101,114,32,105,110,32,116,104,101,32,102,117,116,117,114,101,32,40,117,110,108,101,115,115,32,116,104,101,32,108,105,110,107,32,105,115,32,115,101,116,117,112,32,97,103,97,105,110,41,46,32,73,102,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,44,32,97,110,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,73,100,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,32,102,114,111,109,32,116,104,101,32,108,105,110,107,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,39,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,73,100,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,32,99,97,110,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,108,105,110,107,44,32,98,117,116,32,99,97,110,32,97,108,115,111,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{code,[],[<<73,100>>]},<<32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,120,105,116,47,50>>]},<<46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32>>,{em,[],[<<99,97,110>>]},<<32,98,101,32,97,112,112,114,111,112,114,105,97,116,101,32,116,111,32,99,108,101,97,110,32,117,112,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,104,101,110,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,32,97,102,116,101,114,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,108,105,110,107,40,73,100,41>>]},<<44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<117,110,108,105,110,107,40,73,100,41,44,10,114,101,99,101,105,118,101,10,32,32,32,32,123,39,69,88,73,84,39,44,32,73,100,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,101,110,100>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,32,40,69,82,84,83,32,53,46,53,41,32>>,{code,[],[<<117,110,108,105,110,107,47,49>>]},<<32,98,101,104,97,118,101,100,32,99,111,109,112,108,101,116,101,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,108,105,110,107,32,119,97,115,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,32,34,117,110,108,105,110,107,32,115,105,103,110,97,108,34,32,114,101,97,99,104,101,100,32,116,104,101,32,108,105,110,107,101,100,32,101,110,116,105,116,121,46,32,84,104,105,115,32,104,97,100,32,97,110,32,117,110,100,101,115,105,114,97,98,108,101,32,101,102,102,101,99,116,44,32,97,115,32,121,111,117,32,99,111,117,108,100,32,110,101,118,101,114,32,107,110,111,119,32,119,104,101,110,32,121,111,117,32,119,101,114,101,32,103,117,97,114,97,110,116,101,101,100,32>>,{em,[],[<<110,111,116>>]},<<32,116,111,32,98,101,32,101,102,102,101,99,116,101,100,32,98,121,32,116,104,101,32,108,105,110,107,46>>]},{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,118,105,101,119,101,100,32,97,115,32,116,119,111,32,99,111,109,98,105,110,101,100,32,111,112,101,114,97,116,105,111,110,115,58,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,32,115,101,110,100,32,97,110,32,34,117,110,108,105,110,107,32,115,105,103,110,97,108,34,32,116,111,32,116,104,101,32,108,105,110,107,101,100,32,101,110,116,105,116,121,32,97,110,100,32,105,103,110,111,114,101,32,97,110,121,32,102,117,116,117,114,101,32,114,101,115,117,108,116,115,32,111,102,32,116,104,101,32,108,105,110,107,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,52,57,56>>,signature => [{attribute,2074,spec,{{unlink,1},[{type,2074,bounded_fun,[{type,2074,'fun',[{type,2074,product,[{var,2074,'Id'}]},{atom,2074,true}]},[{type,2075,constraint,[{atom,2075,is_subtype},[{var,2075,'Id'},{type,2075,union,[{type,2075,pid,[]},{type,2075,port,[]}]}]]}]]}]}}]}},{{function,unregister,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2080}],[<<117,110,114,101,103,105,115,116,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,109,111,118,101,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,117,110,114,101,103,105,115,116,101,114,40,100,98,41,46,10,116,114,117,101>>]}]},{p,[],[<<85,115,101,114,115,32,97,114,101,32,97,100,118,105,115,101,100,32,110,111,116,32,116,111,32,117,110,114,101,103,105,115,116,101,114,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,105,115,32,110,111,116,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,53,52,52>>,signature => [{attribute,2080,spec,{{unregister,1},[{type,2080,bounded_fun,[{type,2080,'fun',[{type,2080,product,[{var,2080,'RegName'}]},{atom,2080,true}]},[{type,2081,constraint,[{atom,2081,is_subtype},[{var,2081,'RegName'},{type,2081,atom,[]}]]}]]}]}}]}},{{function,whereis,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2086}],[<<119,104,101,114,101,105,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,105,116,104,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,119,104,101,114,101,105,115,40,100,98,41,46,10,60,48,46,52,51,46,48,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,53,54,48>>,signature => [{attribute,2086,spec,{{whereis,1},[{type,2086,bounded_fun,[{type,2086,'fun',[{type,2086,product,[{var,2086,'RegName'}]},{type,2086,union,[{type,2086,pid,[]},{type,2086,port,[]},{atom,2086,undefined}]}]},[{type,2087,constraint,[{atom,2087,is_subtype},[{var,2087,'RegName'},{type,2087,atom,[]}]]}]]}]}}]}},{{function,yield,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3418}],[<<121,105,101,108,100,47,48>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,103,105,118,101,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,111,114,32,104,105,103,104,101,114,32,112,114,105,111,114,105,116,121,32,40,105,102,32,97,110,121,41,32,97,32,99,104,97,110,99,101,32,116,111,32,101,120,101,99,117,116,101,32,98,101,102,111,114,101,32,114,101,116,117,114,110,105,110,103,46,32,84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,32,114,117,110,115,32,98,101,116,119,101,101,110,32,116,104,101,32,105,110,118,111,99,97,116,105,111,110,32,97,110,100,32,114,101,116,117,114,110,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,121,105,101,108,100,47,48>>]},<<46>>]},{p,[],[<<83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,114,101,99,101,105,118,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<114,101,99,101,105,118,101,45,97,102,116,101,114>>]},<<32,101,120,112,114,101,115,115,105,111,110,115>>]},<<32,102,111,114,32,104,111,119,32,116,111,32,109,97,107,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,115,108,101,101,112,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,110,117,109,98,101,114,32,111,102,32,109,105,108,108,105,115,101,99,111,110,100,115,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,32,97,110,121,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,105,115,32,66,73,70,46,32,85,115,105,110,103,32,116,104,105,115,32,66,73,70,32,119,105,116,104,111,117,116,32,97,32,116,104,111,114,111,117,103,104,32,103,114,97,115,112,32,111,102,32,104,111,119,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,111,114,107,115,32,99,97,110,32,99,97,117,115,101,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,46,32,84,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,112,117,116,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,108,97,115,116,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,99,104,101,100,117,108,101,114,39,115,32,113,117,101,117,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,32,111,102,32,116,104,101,32,115,97,109,101,32,112,114,105,111,114,105,116,121,32,97,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,53,55,52>>,signature => [{attribute,3418,spec,{{erlang,yield,0},[{type,3418,'fun',[{type,3418,product,[]},{atom,3418,true}]}]}}]}},{{type,ext_binary,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,87}],[<<45,116,121,112,101,32,101,120,116,95,98,105,110,97,114,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]}]},#{signature => [{attribute,87,type,{ext_binary,{type,87,binary,[]},[]}}]}},{{type,ext_iovec,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,88}],[<<45,116,121,112,101,32,101,120,116,95,105,111,118,101,99,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,116,101,114,109,32,111,102,32,116,121,112,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<105,111,118,101,99,40,41>>]}]},<<44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]}]},#{signature => [{attribute,88,type,{ext_iovec,{user_type,88,iovec,[]},[]}}]}},{{type,iovec,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,119}],[<<45,116,121,112,101,32,105,111,118,101,99,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,108,105,115,116,32,111,102,32,98,105,110,97,114,105,101,115,46,32,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,102,117,108,32,116,111,32,117,115,101,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,110,105,102,35,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99>>]}]},<<46>>]}]},#{signature => [{attribute,119,type,{iovec,{type,119,list,[{type,119,binary,[]}]},[]}}]}},{{type,message_queue_data,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2353}],[<<45,116,121,112,101,32,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]},#{signature => [{attribute,2353,type,{message_queue_data,{type,2354,union,[{atom,2354,off_heap},{atom,2354,on_heap}]},[]}}]}},{{type,monitor_option,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1397}],[<<45,116,121,112,101,32,109,111,110,105,116,111,114,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,51>>]}]},<<46>>]}]},#{signature => [{attribute,1397,type,{monitor_option,{type,1397,union,[{type,1397,tuple,[{atom,1397,alias},{type,1397,union,[{atom,1397,explicit_unalias},{atom,1397,demonitor},{atom,1397,reply_demonitor}]}]},{type,1398,tuple,[{atom,1398,tag},{type,1398,term,[]}]}]},[]}}]}},{{type,timestamp,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,89}],[<<45,116,121,112,101,32,116,105,109,101,115,116,97,109,112,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,115,116,97,109,112,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,47,48>>]}]},<<46>>]}]},#{signature => [{attribute,89,type,{timestamp,{type,89,tuple,[{ann_type,89,[{var,89,'MegaSecs'},{type,89,non_neg_integer,[]}]},{ann_type,90,[{var,90,'Secs'},{type,90,non_neg_integer,[]}]},{ann_type,91,[{var,91,'MicroSecs'},{type,91,non_neg_integer,[]}]}]},[]}}]}},{{type,time_unit,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,93}],[<<45,116,121,112,101,32,116,105,109,101,95,117,110,105,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{a,[{id,<<116,121,112,101,95,116,105,109,101,95,117,110,105,116>>}],[]},{p,[],[<<83,117,112,112,111,114,116,101,100,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<80,97,114,116,115,80,101,114,83,101,99,111,110,100,32,58,58,32,105,110,116,101,103,101,114,40,41,32,62,61,32,49>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,117,110,105,116,32,101,120,112,114,101,115,115,101,100,32,105,110,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,101,113,117,97,108,115,32>>,{code,[],[<<49,47,80,97,114,116,115,80,101,114,83,101,99,111,110,100>>]},<<32,115,101,99,111,110,100,46>>]}]},{dt,[],[{code,[],[<<115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,108,108,105,115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49,48,48,48>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,99,114,111,115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49,48,48,48,95,48,48,48>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,97,110,111,115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49,48,48,48,95,48,48,48,95,48,48,48>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,97,116,105,118,101>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,110,97,116,105,118,101,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,44,32,97,110,100,32,114,101,109,97,105,110,115,32,116,104,101,32,115,97,109,101,32,117,110,116,105,108,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,101,114,109,105,110,97,116,101,115,46,32,73,102,32,97,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,115,116,111,112,112,101,100,32,97,110,100,32,116,104,101,110,32,115,116,97,114,116,101,100,32,97,103,97,105,110,32,40,101,118,101,110,32,111,110,32,116,104,101,32,115,97,109,101,32,109,97,99,104,105,110,101,41,44,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,32,110,101,119,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,97,110,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,32,111,108,100,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46>>]},{p,[],[<<79,110,101,32,99,97,110,32,103,101,116,32,97,110,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,49,44,32,115,101,99,111,110,100,44,32,110,97,116,105,118,101,41>>]}]},<<46,32,84,104,101,32,114,101,115,117,108,116,32,101,113,117,97,108,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,32,100,111,101,115,32,110,111,116,32,97,100,100,32,117,112,32,116,111,32,97,32,119,104,111,108,101,32,110,117,109,98,101,114,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,100,111,119,110,119,97,114,100,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,103,105,118,101,115,32,121,111,117,32,109,111,114,101,32,111,114,32,108,101,115,115,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,113,117,97,108,105,116,121,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,46,32,73,116,32,115,101,116,115,32,97,32,108,105,109,105,116,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,82,101,115,111,108,117,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,115,111,108,117,116,105,111,110>>]},<<32,97,110,100,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,80,114,101,99,105,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,101,99,105,115,105,111,110>>]},<<32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,44,32,98,117,116,32,105,116,32,103,105,118,101,115,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,65,99,99,117,114,97,99,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<97,99,99,117,114,97,99,121>>]},<<32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,46,32,84,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,46>>]}]}]},{dt,[],[{code,[],[<<112,101,114,102,95,99,111,117,110,116,101,114>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,99,111,117,110,116,101,114,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<112,101,114,102,95,99,111,117,110,116,101,114>>]},<<32,116,105,109,101,32,117,110,105,116,32,98,101,104,97,118,101,115,32,109,117,99,104,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,114,117,110,116,105,109,101,32,114,101,115,116,97,114,116,115,46,32,84,111,32,103,101,116,32,118,97,108,117,101,115,32,111,102,32,116,104,105,115,32,116,121,112,101,44,32,99,97,108,108,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>]}]},<<46>>]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,40,41>>]}]}]},{dd,[],[{p,[],[<<68,101,112,114,101,99,97,116,101,100,32,115,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]}]}]},{p,[],[<<84,104,101,32>>,{code,[],[<<116,105,109,101,95,117,110,105,116,47,48>>]},<<32,116,121,112,101,32,99,97,110,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,111,32,99,111,110,118,101,114,116,32,116,105,109,101,32,118,97,108,117,101,115,32,98,101,116,119,101,101,110,32,116,105,109,101,32,117,110,105,116,115,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>]}]},<<46>>]}]},#{signature => [{attribute,93,type,{time_unit,{type,94,union,[{type,94,pos_integer,[]},{atom,95,second},{atom,96,millisecond},{atom,97,microsecond},{atom,98,nanosecond},{atom,99,native},{atom,100,perf_counter},{user_type,101,deprecated_time_unit,[]}]},[]}}]}},{{type,deprecated_time_unit,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,104}],[<<45,116,121,112,101,32,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{a,[{id,<<116,121,112,101,95,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116>>}],[]},{p,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,117,110,105,116,40,41>>]}]},<<32,116,121,112,101,32,97,108,115,111,32,99,111,110,115,105,115,116,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32>>,{em,[],[<<100,101,112,114,101,99,97,116,101,100>>]},<<32,115,121,109,98,111,108,105,99,32,116,105,109,101,32,117,110,105,116,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,99,111,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,108,108,105,95,115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,108,108,105,115,101,99,111,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,99,114,111,95,115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,99,114,111,115,101,99,111,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<110,97,110,111,95,115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<110,97,110,111,115,101,99,111,110,100>>]}]},<<46>>]}]}]}]},#{signature => [{attribute,104,type,{deprecated_time_unit,{type,105,union,[{atom,105,seconds},{atom,106,milli_seconds},{atom,107,micro_seconds},{atom,108,nano_seconds}]},[]}}]}},{{type,dist_handle,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,116}],[<<45,116,121,112,101,32,100,105,115,116,95,104,97,110,100,108,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,105,110,103,32,97,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46>>]}]},#{signature => [{attribute,116,opaque,{dist_handle,{type,116,atom,[]},[]}}]}},{{type,nif_resource,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,113}],[<<45,116,121,112,101,32,110,105,102,95,114,101,115,111,117,114,99,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,105,110,103,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,110,105,102,35,114,101,115,111,117,114,99,101,95,111,98,106,101,99,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<78,73,70,32,114,101,115,111,117,114,99,101,32,111,98,106,101,99,116,32>>]},<<46>>]}]},#{signature => [{attribute,113,opaque,{nif_resource,{type,113,reference,[]},[]}}]}},{{type,spawn_opt_option,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2988}],[<<45,116,121,112,101,32,115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<79,112,116,105,111,110,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,40,41>>]}]},<<46>>]}]},#{signature => [{attribute,2988,type,{spawn_opt_option,{type,2989,union,[{atom,2989,link},{atom,2990,monitor},{type,2991,tuple,[{atom,2991,monitor},{ann_type,2991,[{var,2991,'MonitorOpts'},{type,2991,list,[{user_type,2991,monitor_option,[]}]}]}]},{type,2992,tuple,[{atom,2992,priority},{ann_type,2992,[{var,2992,'Level'},{user_type,2992,priority_level,[]}]}]},{type,2993,tuple,[{atom,2993,fullsweep_after},{ann_type,2993,[{var,2993,'Number'},{type,2993,non_neg_integer,[]}]}]},{type,2994,tuple,[{atom,2994,min_heap_size},{ann_type,2994,[{var,2994,'Size'},{type,2994,non_neg_integer,[]}]}]},{type,2995,tuple,[{atom,2995,min_bin_vheap_size},{ann_type,2995,[{var,2995,'VSize'},{type,2995,non_neg_integer,[]}]}]},{type,2996,tuple,[{atom,2996,max_heap_size},{ann_type,2996,[{var,2996,'Size'},{user_type,2996,max_heap_size,[]}]}]},{type,2997,tuple,[{atom,2997,message_queue_data},{ann_type,2997,[{var,2997,'MQD'},{user_type,2997,message_queue_data,[]}]}]}]},[]}}]}},{{type,priority_level,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2350}],[<<45,116,121,112,101,32,112,114,105,111,114,105,116,121,95,108,101,118,101,108,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<80,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]}]}]},#{signature => [{attribute,2350,type,{priority_level,{type,2351,union,[{atom,2351,low},{atom,2351,normal},{atom,2351,high},{atom,2351,max}]},[]}}]}},{{type,max_heap_size,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2981}],[<<45,116,121,112,101,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<80,114,111,99,101,115,115,32,109,97,120,32,104,101,97,112,32,115,105,122,101,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]}]}]},#{signature => [{attribute,2981,type,{max_heap_size,{ann_type,2982,[{var,2982,'Size'},{type,2982,union,[{type,2982,non_neg_integer,[]},{type,2984,map,[{type,2984,map_field_assoc,[{atom,2984,size},{type,2984,non_neg_integer,[]}]},{type,2985,map_field_assoc,[{atom,2985,kill},{type,2985,boolean,[]}]},{type,2986,map_field_assoc,[{atom,2986,error_logger},{type,2986,boolean,[]}]}]}]}]},[]}}]}},{{type,message_queue_data,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2353}],[<<45,116,121,112,101,32,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<80,114,111,99,101,115,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,100,97,116,97,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]}]}]},#{signature => [{attribute,2353,type,{message_queue_data,{type,2354,union,[{atom,2354,off_heap},{atom,2354,on_heap}]},[]}}]}}]}. \ No newline at end of file
+{docs_v1,[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<66,121,32,99,111,110,118,101,110,116,105,111,110,44,32,109,111,115,116,32,66,117,105,108,116,45,73,110,32,70,117,110,99,116,105,111,110,115,32,40,66,73,70,115,41,32,97,110,100,32,97,108,108,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,32,97,114,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,46,32,83,111,109,101,32,111,102,32,116,104,101,32,66,73,70,115,32,97,110,100,32,97,108,108,32,111,102,32,116,104,101,32,112,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,32,97,114,101,32,118,105,101,119,101,100,32,109,111,114,101,32,111,114,32,108,101,115,115,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,32,97,110,100,32,97,114,101,32>>,{em,[],[<<97,117,116,111,45,105,109,112,111,114,116,101,100>>]},<<46,32,84,104,117,115,44,32,105,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,97,108,108,115,32>>,{code,[],[<<97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,108,97,110,103,58,97,116,111,109,95,116,111,95,108,105,115,116,40,101,114,108,97,110,103,41>>]},<<32,97,114,101,32,105,100,101,110,116,105,99,97,108,46>>]},{p,[],[<<65,117,116,111,45,105,109,112,111,114,116,101,100,32,66,73,70,115,32,97,114,101,32,108,105,115,116,101,100,32,119,105,116,104,111,117,116,32,109,111,100,117,108,101,32,112,114,101,102,105,120,46,32,66,73,70,115,32,108,105,115,116,101,100,32,119,105,116,104,32,109,111,100,117,108,101,32,112,114,101,102,105,120,32,97,114,101,32,110,111,116,32,97,117,116,111,45,105,109,112,111,114,116,101,100,46>>]},{p,[],[<<80,114,101,100,101,102,105,110,101,100,32,116,121,112,101,115,32,97,114,101,32,108,105,115,116,101,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,80,114,101,100,101,102,105,110,101,100,32,100,97,116,97,116,121,112,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<80,114,101,100,101,102,105,110,101,100,32,100,97,116,97,116,121,112,101,115>>]},<<32,115,101,99,116,105,111,110,32,111,102,32,116,104,105,115,32,114,101,102,101,114,101,110,99,101,32,109,97,110,117,97,108,32,97,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,116,121,112,101,115,112,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<84,121,112,101,115,32,97,110,100,32,70,117,110,99,116,105,111,110,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115>>]},<<32,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,46>>]},{p,[],[<<66,73,70,115,32,99,97,110,32,102,97,105,108,32,102,111,114,32,118,97,114,105,111,117,115,32,114,101,97,115,111,110,115,46,32,65,108,108,32,66,73,70,115,32,102,97,105,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,121,32,97,114,101,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,115,32,111,102,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,46,32,84,104,101,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,101,97,99,104,32,105,110,100,105,118,105,100,117,97,108,32,66,73,70,46>>]},{p,[],[<<83,111,109,101,32,66,73,70,115,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,32,97,110,100,32,97,114,101,32,109,97,114,107,101,100,32,119,105,116,104,32,34,65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,34,46>>]}]},#{name => <<101,114,108,97,110,103>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,101,114,108,97,110,103,46,120,109,108],types => #{{nil,0} => {attribute,{103,2},type,{nil,{type,{103,16},nil,[]},[]}},{trace_flag,0} => {attribute,{356,2},type,{trace_flag,{type,{357,7},union,[{atom,{357,7},all},{atom,{358,7},send},{atom,{359,7},'receive'},{atom,{360,7},procs},{atom,{361,7},ports},{atom,{362,7},call},{atom,{363,7},arity},{atom,{364,7},return_to},{atom,{365,7},silent},{atom,{366,7},running},{atom,{367,7},exiting},{atom,{368,7},running_procs},{atom,{369,7},running_ports},{atom,{370,7},garbage_collection},{atom,{371,7},timestamp},{atom,{372,7},cpu_timestamp},{atom,{373,7},monotonic_timestamp},{atom,{374,7},strict_monotonic_timestamp},{atom,{375,7},set_on_spawn},{atom,{376,7},set_on_first_spawn},{atom,{377,7},set_on_link},{atom,{378,7},set_on_first_link},{type,{379,7},tuple,[{atom,{379,8},tracer},{type,{379,16},union,[{type,{379,16},pid,[]},{type,{379,24},port,[]}]}]},{type,{380,7},tuple,[{atom,{380,8},tracer},{type,{380,16},module,[]},{type,{380,26},term,[]}]}]},[]}},{nonempty_maybe_improper_list,0} => {attribute,{113,2},type,{nonempty_maybe_improper_list,{type,{113,41},nonempty_maybe_improper_list,[{type,{113,70},any,[]},{type,{113,77},any,[]}]},[]}},{maybe_improper_list,0} => {attribute,{98,2},type,{maybe_improper_list,{type,{98,32},maybe_improper_list,[{type,{98,52},any,[]},{type,{98,59},any,[]}]},[]}},{iodata,0} => {attribute,{93,2},type,{iodata,{type,{93,19},union,[{type,{93,19},iolist,[]},{type,{93,30},binary,[]}]},[]}},{trace_info_item_result,0} => {attribute,{382,2},type,{trace_info_item_result,{type,{383,8},union,[{type,{383,8},tuple,[{atom,{383,9},traced},{type,{383,17},union,[{atom,{383,17},global},{atom,{383,26},local},{atom,{383,34},false},{atom,{383,42},undefined}]}]},{type,{384,8},tuple,[{atom,{384,9},match_spec},{type,{384,21},union,[{user_type,{384,21},trace_match_spec,[]},{atom,{384,42},false},{atom,{384,50},undefined}]}]},{type,{385,8},tuple,[{atom,{385,9},meta},{type,{385,15},union,[{type,{385,15},pid,[]},{type,{385,23},port,[]},{atom,{385,32},false},{atom,{385,40},undefined},{type,{385,52},nil,[]}]}]},{type,{386,8},tuple,[{atom,{386,9},meta},{type,{386,15},module,[]},{type,{386,25},term,[]}]},{type,{387,8},tuple,[{atom,{387,9},meta_match_spec},{type,{387,26},union,[{user_type,{387,26},trace_match_spec,[]},{atom,{387,47},false},{atom,{387,55},undefined}]}]},{type,{388,8},tuple,[{atom,{388,9},call_count},{type,{388,21},union,[{type,{388,21},non_neg_integer,[]},{type,{388,41},boolean,[]},{atom,{388,53},undefined}]}]},{type,{389,8},tuple,[{atom,{389,9},call_time},{type,{389,20},union,[{type,{389,20},list,[{type,{389,21},tuple,[{type,{389,22},pid,[]},{type,{389,29},non_neg_integer,[]},{type,{390,8},non_neg_integer,[]},{type,{390,27},non_neg_integer,[]}]}]},{type,{390,49},boolean,[]},{atom,{390,61},undefined}]}]}]},[]}},{map,0} => {attribute,{97,2},type,{map,{type,{97,16},map,[{type,{97,25},map_field_assoc,[{type,{97,19},any,[]},{type,{97,28},any,[]}]}]},[]}},{atom,0} => {attribute,{82,2},type,{atom,{type,{82,17},atom,[]},[]}},{stacktrace,0} => {attribute,{151,2},type,{stacktrace,{type,{151,23},list,[{type,{151,24},union,[{type,{151,24},tuple,[{type,{151,25},module,[]},{type,{151,35},atom,[]},{type,{151,43},union,[{type,{151,43},arity,[]},{type,{151,53},list,[{type,{151,54},term,[]}]}]},{type,{152,25},list,[{user_type,{152,26},stacktrace_extrainfo,[]}]}]},{type,{153,24},tuple,[{type,{153,25},function,[]},{type,{153,37},union,[{type,{153,37},arity,[]},{type,{153,47},list,[{type,{153,48},term,[]}]}]},{type,{153,57},list,[{user_type,{153,58},stacktrace_extrainfo,[]}]}]}]}]},[]}},{nif_resource,0} => {attribute,{181,2},opaque,{nif_resource,{type,{181,27},reference,[]},[]}},{term,0} => {attribute,{122,2},type,{term,{type,{122,17},any,[]},[]}},{port,0} => {attribute,{118,2},type,{port,{type,{118,17},port,[]},[]}},{maybe_improper_list,2} => {attribute,{99,2},type,{maybe_improper_list,{type,{99,60},maybe_improper_list,[{var,{99,80},'ContentType'},{var,{99,93},'TerminationType'}]},[{var,{99,27},'ContentType'},{var,{99,40},'TerminationType'}]}},{number,0} => {attribute,{116,2},type,{number,{type,{116,19},union,[{type,{116,19},integer,[]},{type,{116,31},float,[]}]},[]}},{any,0} => {attribute,{80,2},type,{any,{type,{80,16},any,[]},[]}},{nonempty_list,1} => {attribute,{112,2},type,{nonempty_list,{type,{112,37},nonempty_list,[{var,{112,38},'ContentType'}]},[{var,{112,21},'ContentType'}]}},{scheduler_bind_type,0} => {attribute,{2662,2},type,{scheduler_bind_type,{type,{2663,7},union,[{atom,{2663,7},no_node_processor_spread},{atom,{2664,7},no_node_thread_spread},{atom,{2665,7},no_spread},{atom,{2666,7},processor_spread},{atom,{2667,7},spread},{atom,{2668,7},thread_spread},{atom,{2669,7},thread_no_node_processor_spread},{atom,{2670,7},unbound}]},[]}},{raise_stacktrace,0} => {attribute,{349,2},type,{raise_stacktrace,{type,{350,7},list,[{type,{350,8},union,[{type,{350,8},tuple,[{type,{350,9},module,[]},{type,{350,19},atom,[]},{type,{350,27},union,[{type,{350,27},arity,[]},{type,{350,37},list,[{type,{350,38},term,[]}]}]}]},{type,{351,8},tuple,[{type,{351,9},function,[]},{type,{351,21},union,[{type,{351,21},arity,[]},{type,{351,31},list,[{type,{351,32},term,[]}]}]}]}]}]},[]}},{timestamp,0} => {attribute,{157,2},type,{timestamp,{type,{157,22},tuple,[{ann_type,{157,23},[{var,{157,23},'MegaSecs'},{type,{157,35},non_neg_integer,[]}]},{ann_type,{158,23},[{var,{158,23},'Secs'},{type,{158,31},non_neg_integer,[]}]},{ann_type,{159,23},[{var,{159,23},'MicroSecs'},{type,{159,36},non_neg_integer,[]}]}]},[]}},{spawn_opt_option,0} => {attribute,{3056,2},type,{spawn_opt_option,{type,{3057,2},union,[{atom,{3057,2},link},{atom,{3058,9},monitor},{type,{3059,9},tuple,[{atom,{3059,10},monitor},{ann_type,{3059,19},[{var,{3059,19},'MonitorOpts'},{type,{3059,34},list,[{user_type,{3059,35},monitor_option,[]}]}]}]},{type,{3060,9},tuple,[{atom,{3060,10},priority},{ann_type,{3060,20},[{var,{3060,20},'Level'},{user_type,{3060,29},priority_level,[]}]}]},{type,{3061,9},tuple,[{atom,{3061,10},fullsweep_after},{ann_type,{3061,27},[{var,{3061,27},'Number'},{type,{3061,37},non_neg_integer,[]}]}]},{type,{3062,9},tuple,[{atom,{3062,10},min_heap_size},{ann_type,{3062,25},[{var,{3062,25},'Size'},{type,{3062,33},non_neg_integer,[]}]}]},{type,{3063,9},tuple,[{atom,{3063,10},min_bin_vheap_size},{ann_type,{3063,30},[{var,{3063,30},'VSize'},{type,{3063,39},non_neg_integer,[]}]}]},{type,{3064,9},tuple,[{atom,{3064,10},max_heap_size},{ann_type,{3064,25},[{var,{3064,25},'Size'},{user_type,{3064,33},max_heap_size,[]}]}]},{type,{3065,9},tuple,[{atom,{3065,10},message_queue_data},{ann_type,{3065,30},[{var,{3065,30},'MQD'},{user_type,{3065,37},message_queue_data,[]}]}]}]},[]}},{ext_binary,0} => {attribute,{155,2},type,{ext_binary,{type,{155,23},binary,[]},[]}},{trace_info_flag,0} => {attribute,{392,2},type,{trace_info_flag,{type,{393,7},union,[{atom,{393,7},send},{atom,{394,7},'receive'},{atom,{395,7},set_on_spawn},{atom,{396,7},call},{atom,{397,7},return_to},{atom,{398,7},procs},{atom,{399,7},set_on_first_spawn},{atom,{400,7},set_on_link},{atom,{401,7},running},{atom,{402,7},garbage_collection},{atom,{403,7},timestamp},{atom,{404,7},monotonic_timestamp},{atom,{405,7},strict_monotonic_timestamp},{atom,{406,7},arity}]},[]}},{info_list,0} => {attribute,{2830,2},type,{info_list,{type,{2830,22},nil,[]},[]}},{module,0} => {attribute,{101,2},type,{module,{type,{101,19},atom,[]},[]}},{boolean,0} => {attribute,{86,2},type,{boolean,{type,{86,20},union,[{atom,{86,20},true},{atom,{86,27},false}]},[]}},{non_neg_integer,0} => {attribute,{106,2},type,{non_neg_integer,{type,{106,28},non_neg_integer,[]},[]}},{byte,0} => {attribute,{87,2},type,{byte,{type,{87,17},range,[{integer,{87,17},0},{integer,{87,20},255}]},[]}},{nonempty_maybe_improper_list,2} => {attribute,{114,2},type,{nonempty_maybe_improper_list,{type,{114,69},nonempty_maybe_improper_list,[{var,{114,98},'ContentType'},{var,{114,111},'TerminationType'}]},[{var,{114,36},'ContentType'},{var,{114,49},'TerminationType'}]}},{process_info_result_item,0} => {attribute,{2491,2},type,{process_info_result_item,{type,{2492,7},union,[{type,{2492,7},tuple,[{atom,{2492,8},backtrace},{ann_type,{2492,19},[{var,{2492,19},'Bin'},{type,{2492,26},binary,[]}]}]},{type,{2493,7},tuple,[{atom,{2493,8},binary},{ann_type,{2493,16},[{var,{2493,16},'BinInfo'},{type,{2493,27},list,[{type,{2493,28},tuple,[{type,{2493,29},non_neg_integer,[]},{type,{2494,29},non_neg_integer,[]},{type,{2495,29},non_neg_integer,[]}]}]}]}]},{type,{2496,7},tuple,[{atom,{2496,8},catchlevel},{ann_type,{2496,20},[{var,{2496,20},'CatchLevel'},{type,{2496,34},non_neg_integer,[]}]}]},{type,{2497,7},tuple,[{atom,{2497,8},current_function},{type,{2498,8},union,[{type,{2498,8},tuple,[{ann_type,{2498,9},[{var,{2498,9},'Module'},{type,{2498,19},module,[]}]},{ann_type,{2498,29},[{var,{2498,29},'Function'},{type,{2498,41},atom,[]}]},{ann_type,{2498,49},[{var,{2498,49},'Arity'},{type,{2498,58},arity,[]}]}]},{atom,{2498,69},undefined}]}]},{type,{2499,7},tuple,[{atom,{2499,8},current_location},{type,{2500,8},tuple,[{ann_type,{2500,9},[{var,{2500,9},'Module'},{type,{2500,19},module,[]}]},{ann_type,{2500,29},[{var,{2500,29},'Function'},{type,{2500,41},atom,[]}]},{ann_type,{2500,49},[{var,{2500,49},'Arity'},{type,{2500,58},arity,[]}]},{ann_type,{2501,9},[{var,{2501,9},'Location'},{type,{2501,21},list,[{type,{2501,22},union,[{type,{2501,22},tuple,[{atom,{2501,23},file},{ann_type,{2501,29},[{var,{2501,29},'Filename'},{type,{2501,41},string,[]}]}]},{type,{2502,22},tuple,[{atom,{2502,23},line},{ann_type,{2502,29},[{var,{2502,29},'Line'},{type,{2502,37},pos_integer,[]}]}]}]}]}]}]}]},{type,{2503,7},tuple,[{atom,{2503,8},current_stacktrace},{ann_type,{2503,28},[{var,{2503,28},'Stack'},{type,{2503,37},list,[{user_type,{2503,38},stack_item,[]}]}]}]},{type,{2504,7},tuple,[{atom,{2504,8},dictionary},{ann_type,{2504,20},[{var,{2504,20},'Dictionary'},{type,{2504,34},list,[{type,{2504,35},tuple,[{ann_type,{2504,36},[{var,{2504,36},'Key'},{type,{2504,43},term,[]}]},{ann_type,{2504,51},[{var,{2504,51},'Value'},{type,{2504,60},term,[]}]}]}]}]}]},{type,{2505,7},tuple,[{atom,{2505,8},error_handler},{ann_type,{2505,23},[{var,{2505,23},'Module'},{type,{2505,33},module,[]}]}]},{type,{2506,7},tuple,[{atom,{2506,8},garbage_collection},{ann_type,{2506,28},[{var,{2506,28},'GCInfo'},{type,{2506,38},list,[{type,{2506,39},tuple,[{type,{2506,40},atom,[]},{type,{2506,47},non_neg_integer,[]}]}]}]}]},{type,{2507,7},tuple,[{atom,{2507,8},garbage_collection_info},{ann_type,{2507,33},[{var,{2507,33},'GCInfo'},{type,{2507,43},list,[{type,{2507,44},tuple,[{type,{2507,45},atom,[]},{type,{2507,52},non_neg_integer,[]}]}]}]}]},{type,{2508,7},tuple,[{atom,{2508,8},group_leader},{ann_type,{2508,22},[{var,{2508,22},'GroupLeader'},{type,{2508,37},pid,[]}]}]},{type,{2509,7},tuple,[{atom,{2509,8},heap_size},{ann_type,{2509,19},[{var,{2509,19},'Size'},{type,{2509,27},non_neg_integer,[]}]}]},{type,{2510,7},tuple,[{atom,{2510,8},initial_call},{type,{2510,22},mfa,[]}]},{type,{2511,7},tuple,[{atom,{2511,8},links},{ann_type,{2511,15},[{var,{2511,15},'PidsAndPorts'},{type,{2511,31},list,[{type,{2511,32},union,[{type,{2511,32},pid,[]},{type,{2511,40},port,[]}]}]}]}]},{type,{2512,7},tuple,[{atom,{2512,8},last_calls},{type,{2512,20},union,[{atom,{2512,20},false},{ann_type,{2512,29},[{var,{2512,29},'Calls'},{type,{2512,38},list,[{type,{2512,39},mfa,[]}]}]}]}]},{type,{2513,7},tuple,[{atom,{2513,8},memory},{ann_type,{2513,16},[{var,{2513,16},'Size'},{type,{2513,24},non_neg_integer,[]}]}]},{type,{2514,7},tuple,[{atom,{2514,8},message_queue_len},{ann_type,{2514,27},[{var,{2514,27},'MessageQueueLen'},{type,{2514,46},non_neg_integer,[]}]}]},{type,{2515,7},tuple,[{atom,{2515,8},messages},{ann_type,{2515,18},[{var,{2515,18},'MessageQueue'},{type,{2515,34},list,[{type,{2515,35},term,[]}]}]}]},{type,{2516,7},tuple,[{atom,{2516,8},min_heap_size},{ann_type,{2516,23},[{var,{2516,23},'MinHeapSize'},{type,{2516,38},non_neg_integer,[]}]}]},{type,{2517,7},tuple,[{atom,{2517,8},min_bin_vheap_size},{ann_type,{2517,28},[{var,{2517,28},'MinBinVHeapSize'},{type,{2517,47},non_neg_integer,[]}]}]},{type,{2518,7},tuple,[{atom,{2518,8},max_heap_size},{ann_type,{2518,23},[{var,{2518,23},'MaxHeapSize'},{user_type,{2518,38},max_heap_size,[]}]}]},{type,{2519,7},tuple,[{atom,{2519,8},monitored_by},{ann_type,{2519,22},[{var,{2519,22},'MonitoredBy'},{type,{2519,37},list,[{type,{2519,38},union,[{type,{2519,38},pid,[]},{type,{2519,46},port,[]},{user_type,{2519,55},nif_resource,[]}]}]}]}]},{type,{2520,7},tuple,[{atom,{2520,8},monitors},{ann_type,{2521,8},[{var,{2521,8},'Monitors'},{type,{2521,20},list,[{type,{2521,21},tuple,[{type,{2521,22},union,[{atom,{2521,22},process},{atom,{2521,32},port}]},{ann_type,{2521,38},[{var,{2521,38},'Pid'},{type,{2521,45},union,[{type,{2521,45},pid,[]},{type,{2521,53},port,[]},{type,{2522,38},tuple,[{ann_type,{2522,39},[{var,{2522,39},'RegName'},{type,{2522,50},atom,[]}]},{ann_type,{2522,58},[{var,{2522,58},'Node'},{type,{2522,66},node,[]}]}]}]}]}]}]}]}]},{type,{2523,7},tuple,[{atom,{2523,8},message_queue_data},{ann_type,{2523,28},[{var,{2523,28},'MQD'},{user_type,{2523,35},message_queue_data,[]}]}]},{type,{2524,7},tuple,[{atom,{2524,8},priority},{ann_type,{2524,18},[{var,{2524,18},'Level'},{user_type,{2524,27},priority_level,[]}]}]},{type,{2525,7},tuple,[{atom,{2525,8},reductions},{ann_type,{2525,20},[{var,{2525,20},'Number'},{type,{2525,30},non_neg_integer,[]}]}]},{type,{2526,7},tuple,[{atom,{2526,8},registered_name},{type,{2526,25},union,[{type,{2526,25},nil,[]},{ann_type,{2526,31},[{var,{2526,31},'Atom'},{type,{2526,39},atom,[]}]}]}]},{type,{2527,7},tuple,[{atom,{2527,8},sequential_trace_token},{type,{2527,32},union,[{type,{2527,32},nil,[]},{ann_type,{2527,38},[{var,{2527,38},'SequentialTraceToken'},{type,{2527,62},term,[]}]}]}]},{type,{2528,7},tuple,[{atom,{2528,8},stack_size},{ann_type,{2528,20},[{var,{2528,20},'Size'},{type,{2528,28},non_neg_integer,[]}]}]},{type,{2529,7},tuple,[{atom,{2529,8},status},{ann_type,{2529,16},[{var,{2529,16},'Status'},{type,{2529,26},union,[{atom,{2529,26},exiting},{atom,{2529,36},garbage_collecting},{atom,{2529,57},waiting},{atom,{2529,67},running},{atom,{2529,77},runnable},{atom,{2529,88},suspended}]}]}]},{type,{2530,7},tuple,[{atom,{2530,8},suspending},{ann_type,{2531,8},[{var,{2531,8},'SuspendeeList'},{type,{2531,25},list,[{type,{2531,26},tuple,[{ann_type,{2531,27},[{var,{2531,27},'Suspendee'},{type,{2531,40},pid,[]}]},{ann_type,{2532,27},[{var,{2532,27},'ActiveSuspendCount'},{type,{2532,49},non_neg_integer,[]}]},{ann_type,{2533,27},[{var,{2533,27},'OutstandingSuspendCount'},{type,{2533,53},non_neg_integer,[]}]}]}]}]}]},{type,{2534,7},tuple,[{atom,{2534,8},total_heap_size},{ann_type,{2534,25},[{var,{2534,25},'Size'},{type,{2534,33},non_neg_integer,[]}]}]},{type,{2535,7},tuple,[{atom,{2535,8},trace},{ann_type,{2535,15},[{var,{2535,15},'InternalTraceFlags'},{type,{2535,37},non_neg_integer,[]}]}]},{type,{2536,7},tuple,[{atom,{2536,8},trap_exit},{ann_type,{2536,19},[{var,{2536,19},'Boolean'},{type,{2536,30},boolean,[]}]}]}]},[]}},{nonempty_bitstring,0} => {attribute,{109,2},type,{nonempty_bitstring,{type,{109,31},binary,[{integer,{109,35},1},{integer,{109,42},1}]},[]}},{nonempty_improper_list,2} => {attribute,{110,2},type,{nonempty_improper_list,{type,{110,63},nonempty_improper_list,[{var,{110,86},'ContentType'},{var,{110,99},'TerminationType'}]},[{var,{110,30},'ContentType'},{var,{110,43},'TerminationType'}]}},{float,0} => {attribute,{89,2},type,{float,{type,{89,18},float,[]},[]}},{trace_pattern_mfa,0} => {attribute,{2768,2},type,{trace_pattern_mfa,{type,{2769,7},union,[{type,{2769,7},tuple,[{type,{2769,8},atom,[]},{type,{2769,15},atom,[]},{type,{2769,22},union,[{type,{2769,22},arity,[]},{atom,{2769,32},'_'}]}]},{atom,{2769,39},on_load}]},[]}},{level_tag,0} => {attribute,{2827,2},type,{level_tag,{type,{2827,22},union,[{atom,{2827,22},core},{atom,{2827,29},node},{atom,{2827,36},processor},{atom,{2827,48},thread}]},[]}},{fun_info_item,0} => {attribute,{315,2},type,{fun_info_item,{type,{316,7},union,[{atom,{316,7},arity},{atom,{317,7},env},{atom,{318,7},index},{atom,{319,7},name},{atom,{320,7},module},{atom,{321,7},new_index},{atom,{322,7},new_uniq},{atom,{323,7},pid},{atom,{324,7},type},{atom,{325,7},uniq}]},[]}},{memory_type,0} => {attribute,{4006,2},type,{memory_type,{type,{4006,24},union,[{atom,{4006,24},total},{atom,{4006,34},processes},{atom,{4006,48},processes_used},{atom,{4006,67},system},{atom,{4007,24},atom},{atom,{4007,33},atom_used},{atom,{4007,47},binary},{atom,{4007,58},code},{atom,{4007,67},ets}]},[]}},{stack_item,0} => {attribute,{2538,2},type,{stack_item,{type,{2539,9},tuple,[{ann_type,{2539,10},[{var,{2539,10},'Module'},{type,{2539,20},module,[]}]},{ann_type,{2540,10},[{var,{2540,10},'Function'},{type,{2540,22},atom,[]}]},{ann_type,{2541,10},[{var,{2541,10},'Arity'},{type,{2541,19},union,[{type,{2541,19},arity,[]},{ann_type,{2541,30},[{var,{2541,30},'Args'},{type,{2541,38},list,[{type,{2541,39},term,[]}]}]}]}]},{ann_type,{2542,10},[{var,{2542,10},'Location'},{type,{2542,22},list,[{type,{2542,23},union,[{type,{2542,23},tuple,[{atom,{2542,24},file},{ann_type,{2542,30},[{var,{2542,30},'Filename'},{type,{2542,42},string,[]}]}]},{type,{2543,23},tuple,[{atom,{2543,24},line},{ann_type,{2543,30},[{var,{2543,30},'Line'},{type,{2543,38},pos_integer,[]}]}]}]}]}]}]},[]}},{sub_level,0} => {attribute,{2828,2},type,{sub_level,{type,{2828,22},union,[{type,{2828,22},list,[{ann_type,{2828,23},[{var,{2828,23},'LevelEntry'},{user_type,{2828,37},level_entry,[]}]}]},{ann_type,{2829,23},[{var,{2829,23},'LogicalCpuId'},{type,{2829,39},tuple,[{atom,{2829,40},logical},{type,{2829,49},non_neg_integer,[]}]}]}]},[]}},{monitor_process_identifier,0} => {attribute,{1458,2},type,{monitor_process_identifier,{type,{1458,39},union,[{type,{1458,39},pid,[]},{user_type,{1458,47},registered_process_identifier,[]}]},[]}},{nonempty_list,0} => {attribute,{111,2},type,{nonempty_list,{type,{111,26},nonempty_list,[{type,{111,40},any,[]}]},[]}},{deprecated_time_unit,0} => {attribute,{172,2},type,{deprecated_time_unit,{type,{173,7},union,[{atom,{173,7},seconds},{atom,{174,9},milli_seconds},{atom,{175,9},micro_seconds},{atom,{176,9},nano_seconds}]},[]}},{neg_integer,0} => {attribute,{102,2},type,{neg_integer,{type,{102,24},neg_integer,[]},[]}},{bool,0} => {attribute,{85,2},type,{bool,{type,{85,17},boolean,[]},[]}},{system_monitor_option,0} => {attribute,{342,2},type,{system_monitor_option,{type,{343,7},union,[{atom,{343,7},busy_port},{atom,{344,7},busy_dist_port},{type,{345,7},tuple,[{atom,{345,8},long_gc},{type,{345,19},non_neg_integer,[]}]},{type,{346,7},tuple,[{atom,{346,8},long_schedule},{type,{346,25},non_neg_integer,[]}]},{type,{347,7},tuple,[{atom,{347,8},large_heap},{type,{347,22},non_neg_integer,[]}]}]},[]}},{no_return,0} => {attribute,{104,2},type,{no_return,{type,{104,22},none,[]},[]}},{process_info_item,0} => {attribute,{2456,2},type,{process_info_item,{type,{2457,7},union,[{atom,{2457,7},backtrace},{atom,{2458,7},binary},{atom,{2459,7},catchlevel},{atom,{2460,7},current_function},{atom,{2461,7},current_location},{atom,{2462,7},current_stacktrace},{atom,{2463,7},dictionary},{atom,{2464,7},error_handler},{atom,{2465,7},garbage_collection},{atom,{2466,7},garbage_collection_info},{atom,{2467,7},group_leader},{atom,{2468,7},heap_size},{atom,{2469,7},initial_call},{atom,{2470,7},links},{atom,{2471,7},last_calls},{atom,{2472,7},memory},{atom,{2473,7},message_queue_len},{atom,{2474,7},messages},{atom,{2475,7},min_heap_size},{atom,{2476,7},min_bin_vheap_size},{atom,{2477,7},monitored_by},{atom,{2478,7},monitors},{atom,{2479,7},message_queue_data},{atom,{2480,7},priority},{atom,{2481,7},reductions},{atom,{2482,7},registered_name},{atom,{2483,7},sequential_trace_token},{atom,{2484,7},stack_size},{atom,{2485,7},status},{atom,{2486,7},suspending},{atom,{2487,7},total_heap_size},{atom,{2488,7},trace},{atom,{2489,7},trap_exit}]},[]}},{char,0} => {attribute,{88,2},type,{char,{type,{88,17},range,[{integer,{88,17},0},{integer,{88,20},1114111}]},[]}},{pid,0} => {attribute,{117,2},type,{pid,{type,{117,16},pid,[]},[]}},{level_entry,0} => {attribute,{2822,2},type,{level_entry,{type,{2823,9},union,[{type,{2823,9},tuple,[{ann_type,{2823,10},[{var,{2823,10},'LevelTag'},{user_type,{2823,22},level_tag,[]}]},{ann_type,{2823,35},[{var,{2823,35},'SubLevel'},{user_type,{2823,47},sub_level,[]}]}]},{type,{2824,9},tuple,[{ann_type,{2824,10},[{var,{2824,10},'LevelTag'},{user_type,{2824,22},level_tag,[]}]},{ann_type,{2825,10},[{var,{2825,10},'InfoList'},{user_type,{2825,22},info_list,[]}]},{ann_type,{2826,10},[{var,{2826,10},'SubLevel'},{user_type,{2826,22},sub_level,[]}]}]}]},[]}},{cpu_topology,0} => {attribute,{2820,2},type,{cpu_topology,{type,{2821,9},union,[{type,{2821,9},list,[{ann_type,{2821,10},[{var,{2821,10},'LevelEntry'},{user_type,{2821,24},level_entry,[]}]}]},{atom,{2821,41},undefined}]},[]}},{nonempty_string,0} => {attribute,{115,2},type,{nonempty_string,{type,{115,28},nonempty_list,[{type,{115,42},char,[]}]},[]}},{integer,0} => {attribute,{92,2},type,{integer,{type,{92,20},integer,[]},[]}},{monitor_port_identifier,0} => {attribute,{1459,2},type,{monitor_port_identifier,{type,{1459,36},union,[{type,{1459,36},port,[]},{user_type,{1459,45},registered_name,[]}]},[]}},{dst,0} => {attribute,{3472,2},type,{dst,{type,{3472,16},union,[{type,{3472,16},pid,[]},{type,{3473,16},reference,[]},{type,{3474,16},port,[]},{ann_type,{3475,17},[{var,{3475,17},'RegName'},{type,{3475,28},atom,[]}]},{type,{3476,16},tuple,[{ann_type,{3476,17},[{var,{3476,17},'RegName'},{type,{3476,28},atom,[]}]},{ann_type,{3476,36},[{var,{3476,36},'Node'},{type,{3476,44},node,[]}]}]}]},[]}},{trace_info_return,0} => {attribute,{408,2},type,{trace_info_return,{type,{409,7},union,[{atom,{409,7},undefined},{type,{410,7},tuple,[{atom,{410,8},flags},{type,{410,15},list,[{user_type,{410,16},trace_info_flag,[]}]}]},{type,{411,7},tuple,[{atom,{411,8},tracer},{type,{411,16},union,[{type,{411,16},pid,[]},{type,{411,24},port,[]},{type,{411,33},nil,[]}]}]},{type,{412,7},tuple,[{atom,{412,8},tracer},{type,{412,16},module,[]},{type,{412,26},term,[]}]},{user_type,{413,7},trace_info_item_result,[]},{type,{414,7},tuple,[{atom,{414,8},all},{type,{414,13},union,[{type,{414,13},list,[{user_type,{414,15},trace_info_item_result,[]}]},{atom,{414,44},false},{atom,{414,52},undefined}]}]}]},[]}},{string,0} => {attribute,{121,2},type,{string,{type,{121,19},list,[{type,{121,20},char,[]}]},[]}},{list,0} => {attribute,{95,2},type,{list,{type,{95,17},list,[]},[]}},{node,0} => {attribute,{105,2},type,{node,{type,{105,17},atom,[]},[]}},{tuple,0} => {attribute,{124,2},type,{tuple,{type,{124,18},tuple,any},[]}},{mfa,0} => {attribute,{100,2},type,{mfa,{type,{100,16},tuple,[{type,{100,17},module,[]},{type,{100,26},atom,[]},{type,{100,33},arity,[]}]},[]}},{none,0} => {attribute,{107,2},type,{none,{type,{107,17},none,[]},[]}},{bitstring_list,0} => {attribute,{353,2},type,{bitstring_list,{type,{354,7},maybe_improper_list,[{type,{354,27},union,[{type,{354,27},byte,[]},{type,{354,36},bitstring,[]},{user_type,{354,50},bitstring_list,[]}]},{type,{354,68},union,[{type,{354,68},bitstring,[]},{type,{354,82},nil,[]}]}]},[]}},{registered_name,0} => {attribute,{1456,2},type,{registered_name,{type,{1456,28},atom,[]},[]}},{ext_iovec,0} => {attribute,{156,2},type,{ext_iovec,{user_type,{156,22},iovec,[]},[]}},{pos_integer,0} => {attribute,{119,2},type,{pos_integer,{type,{119,24},pos_integer,[]},[]}},{priority_level,0} => {attribute,{2413,2},type,{priority_level,{type,{2414,7},union,[{atom,{2414,7},low},{atom,{2414,13},normal},{atom,{2414,22},high},{atom,{2414,29},max}]},[]}},{binary,0} => {attribute,{83,2},type,{binary,{type,{83,19},binary,[{integer,83,0},{integer,{83,25},8}]},[]}},{monitor_option,0} => {attribute,{1460,2},type,{monitor_option,{type,{1460,27},union,[{type,{1460,27},tuple,[{atom,{1460,28},alias},{type,{1460,37},union,[{atom,{1460,37},explicit_unalias},{atom,{1460,58},demonitor},{atom,{1460,72},reply_demonitor}]}]},{type,{1461,27},tuple,[{atom,{1461,28},tag},{type,{1461,35},term,[]}]}]},[]}},{timeout,0} => {attribute,{123,2},type,{timeout,{type,{123,20},union,[{atom,{123,20},infinity},{type,{123,33},non_neg_integer,[]}]},[]}},{system_profile_option,0} => {attribute,{333,2},type,{system_profile_option,{type,{334,7},union,[{atom,{334,7},exclusive},{atom,{335,7},runnable_ports},{atom,{336,7},runnable_procs},{atom,{337,7},scheduler},{atom,{338,7},timestamp},{atom,{339,7},monotonic_timestamp},{atom,{340,7},strict_monotonic_timestamp}]},[]}},{reference,0} => {attribute,{120,2},type,{reference,{type,{120,22},reference,[]},[]}},{bitstring,0} => {attribute,{84,2},type,{bitstring,{type,{84,22},binary,[{integer,84,0},{integer,{84,28},1}]},[]}},{iolist,0} => {attribute,{94,2},type,{iolist,{type,{94,19},maybe_improper_list,[{type,{94,39},union,[{type,{94,39},byte,[]},{type,{94,48},binary,[]},{type,{94,59},iolist,[]}]},{type,{94,69},union,[{type,{94,69},binary,[]},{type,{94,80},nil,[]}]}]},[]}},{trace_pattern_flag,0} => {attribute,{2786,2},type,{trace_pattern_flag,{type,{2787,7},union,[{atom,{2787,7},global},{atom,{2787,16},local},{atom,{2788,7},meta},{type,{2788,14},tuple,[{atom,{2788,15},meta},{ann_type,{2788,21},[{var,{2788,21},'Pid'},{type,{2788,28},pid,[]}]}]},{type,{2789,7},tuple,[{atom,{2789,8},meta},{ann_type,{2789,14},[{var,{2789,14},'TracerModule'},{type,{2789,30},module,[]}]},{ann_type,{2789,40},[{var,{2789,40},'TracerState'},{type,{2789,55},term,[]}]}]},{atom,{2790,7},call_count},{atom,{2791,7},call_time}]},[]}},{nonempty_binary,0} => {attribute,{108,2},type,{nonempty_binary,{type,{108,28},binary,[{integer,{108,32},8},{integer,{108,39},8}]},[]}},{prepared_code,0} => {attribute,{178,2},opaque,{prepared_code,{type,{178,28},reference,[]},[]}},{dist_handle,0} => {attribute,{184,2},opaque,{dist_handle,{type,{184,26},atom,[]},[]}},{function,0} => {attribute,{90,2},type,{function,{type,{90,21},'fun',[]},[]}},{trace_match_spec,0} => {attribute,{2770,2},type,{trace_match_spec,{type,{2771,7},list,[{type,{2771,8},tuple,[{type,{2771,9},union,[{type,{2771,9},list,[{type,{2771,10},term,[]}]},{atom,{2771,20},'_'},{user_type,{2771,26},match_variable,[]}]},{type,{2771,44},list,[{type,{2771,45},term,[]}]},{type,{2771,53},list,[{type,{2771,54},term,[]}]}]}]},[]}},{list,1} => {attribute,{96,2},type,{list,{type,{96,28},list,[{var,{96,33},'ContentType'}]},[{var,{96,12},'ContentType'}]}},{stacktrace_extrainfo,0} => {attribute,{146,2},type,{stacktrace_extrainfo,{type,{147,9},union,[{type,{147,9},tuple,[{atom,{147,10},line},{type,{147,16},pos_integer,[]}]},{type,{148,9},tuple,[{atom,{148,10},file},{remote_type,{148,16},[{atom,{148,16},unicode},{atom,{148,24},chardata},[]]}]},{type,{149,9},tuple,[{atom,{149,10},error_info},{type,{149,22},map,[{type,{149,32},map_field_assoc,[{atom,{149,25},module},{type,{149,35},module,[]}]},{type,{149,54},map_field_assoc,[{atom,{149,45},function},{type,{149,57},atom,[]}]},{type,{149,71},map_field_assoc,[{atom,{149,65},cause},{type,{149,74},term,[]}]}]}]},{type,{150,9},tuple,[{type,{150,10},atom,[]},{type,{150,18},term,[]}]}]},[]}},{iovec,0} => {attribute,{187,2},type,{iovec,{type,{187,18},list,[{type,{187,19},binary,[]}]},[]}},{module_info_key,0} => {attribute,{2186,2},type,{module_info_key,{type,{2186,28},union,[{atom,{2186,28},attributes},{atom,{2186,41},compile},{atom,{2186,51},exports},{atom,{2186,61},functions},{atom,{2186,73},md5},{atom,{2187,28},module},{atom,{2187,37},native},{atom,{2187,46},native_addresses},{atom,{2187,65},nifs}]},[]}},{time_unit,0} => {attribute,{161,2},type,{time_unit,{type,{162,2},union,[{type,{162,2},pos_integer,[]},{atom,{163,9},second},{atom,{164,9},millisecond},{atom,{165,9},microsecond},{atom,{166,9},nanosecond},{atom,{167,9},native},{atom,{168,9},perf_counter},{user_type,{169,9},deprecated_time_unit,[]}]},[]}},{message_queue_data,0} => {attribute,{2416,2},type,{message_queue_data,{type,{2417,2},union,[{atom,{2417,2},off_heap},{atom,{2417,13},on_heap}]},[]}},{arity,0} => {attribute,{81,2},type,{arity,{type,{81,18},arity,[]},[]}},{identifier,0} => {attribute,{91,2},type,{identifier,{type,{91,23},union,[{type,{91,23},pid,[]},{type,{91,31},port,[]},{type,{91,40},reference,[]}]},[]}},{max_heap_size,0} => {attribute,{3049,2},type,{max_heap_size,{ann_type,{3050,9},[{var,{3050,9},'Size'},{type,{3050,17},union,[{type,{3050,17},non_neg_integer,[]},{type,{3052,9},map,[{type,{3052,17},map_field_assoc,[{atom,{3052,12},size},{type,{3052,20},non_neg_integer,[]}]},{type,{3053,17},map_field_assoc,[{atom,{3053,12},kill},{type,{3053,20},boolean,[]}]},{type,{3054,25},map_field_assoc,[{atom,{3054,12},error_logger},{type,{3054,28},boolean,[]}]}]}]}]},[]}},{seq_trace_info_returns,0} => {attribute,{327,2},type,{seq_trace_info_returns,{type,{328,7},union,[{type,{328,7},tuple,[{type,{328,9},union,[{atom,{328,9},send},{atom,{328,18},'receive'},{atom,{328,30},print},{atom,{328,40},timestamp},{atom,{328,54},monotonic_timestamp},{atom,{328,78},strict_monotonic_timestamp}]},{type,{328,108},boolean,[]}]},{type,{329,7},tuple,[{atom,{329,9},label},{type,{329,18},term,[]}]},{type,{330,7},tuple,[{atom,{330,9},serial},{type,{330,19},tuple,[{type,{330,21},non_neg_integer,[]},{type,{330,40},non_neg_integer,[]}]}]},{type,{331,7},nil,[]}]},[]}},{match_variable,0} => {attribute,{2767,2},type,{match_variable,{type,{2767,27},atom,[]},[]}},{registered_process_identifier,0} => {attribute,{1457,2},type,{registered_process_identifier,{type,{1457,42},union,[{user_type,{1457,42},registered_name,[]},{type,{1457,62},tuple,[{user_type,{1457,63},registered_name,[]},{type,{1457,82},node,[]}]}]},[]}}}},[{{function,'!',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,33,39,47,50>>],hidden,#{}},{{function,'*',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,42,39,47,50>>],hidden,#{}},{{function,'+',1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,43,39,47,49>>],hidden,#{}},{{function,'+',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,43,39,47,50>>],hidden,#{}},{{function,'++',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,43,43,39,47,50>>],hidden,#{}},{{function,'-',1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,45,39,47,49>>],hidden,#{}},{{function,'-',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,45,39,47,50>>],hidden,#{}},{{function,'--',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,45,45,39,47,50>>],hidden,#{}},{{function,'/',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,47,39,47,50>>],hidden,#{}},{{function,'/=',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,47,61,39,47,50>>],hidden,#{}},{{function,'<',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,60,39,47,50>>],hidden,#{}},{{function,'=/=',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,61,47,61,39,47,50>>],hidden,#{}},{{function,'=:=',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,61,58,61,39,47,50>>],hidden,#{}},{{function,'=<',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,61,60,39,47,50>>],hidden,#{}},{{function,'==',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,61,61,39,47,50>>],hidden,#{}},{{function,'>',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,62,39,47,50>>],hidden,#{}},{{function,'>=',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,62,61,39,47,50>>],hidden,#{}},{{function,alloc_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<97,108,108,111,99,95,105,110,102,111,47,49>>],hidden,#{}},{{function,alloc_sizes,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<97,108,108,111,99,95,115,105,122,101,115,47,49>>],hidden,#{}},{{function,'and',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,97,110,100,39,47,50>>],hidden,#{}},{{function,append,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<97,112,112,101,110,100,47,50>>],hidden,#{}},{{function,'band',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,98,97,110,100,39,47,50>>],hidden,#{}},{{function,'bnot',1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,98,110,111,116,39,47,49>>],hidden,#{}},{{function,'bor',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,98,111,114,39,47,50>>],hidden,#{}},{{function,'bsl',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,98,115,108,39,47,50>>],hidden,#{}},{{function,'bsr',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,98,115,114,39,47,50>>],hidden,#{}},{{function,'bxor',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,98,120,111,114,39,47,50>>],hidden,#{}},{{function,call_on_load_function,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<99,97,108,108,95,111,110,95,108,111,97,100,95,102,117,110,99,116,105,111,110,47,49>>],hidden,#{}},{{function,delay_trap,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,101,108,97,121,95,116,114,97,112,47,50>>],hidden,#{}},{{function,display_nl,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,105,115,112,108,97,121,95,110,108,47,48>>],hidden,#{}},{{function,display_string,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,105,115,112,108,97,121,95,115,116,114,105,110,103,47,49>>],hidden,#{}},{{function,dist_get_stat,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,105,115,116,95,103,101,116,95,115,116,97,116,47,49>>],hidden,#{}},{{function,'div',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,100,105,118,39,47,50>>],hidden,#{}},{{function,dmonitor_node,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,109,111,110,105,116,111,114,95,110,111,100,101,47,51>>],hidden,#{}},{{function,dt_append_vm_tag_data,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,116,95,97,112,112,101,110,100,95,118,109,95,116,97,103,95,100,97,116,97,47,49>>],hidden,#{}},{{function,dt_get_tag,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,116,95,103,101,116,95,116,97,103,47,48>>],hidden,#{}},{{function,dt_get_tag_data,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,116,95,103,101,116,95,116,97,103,95,100,97,116,97,47,48>>],hidden,#{}},{{function,dt_prepend_vm_tag_data,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,116,95,112,114,101,112,101,110,100,95,118,109,95,116,97,103,95,100,97,116,97,47,49>>],hidden,#{}},{{function,dt_put_tag,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,116,95,112,117,116,95,116,97,103,47,49>>],hidden,#{}},{{function,dt_restore_tag,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,116,95,114,101,115,116,111,114,101,95,116,97,103,47,49>>],hidden,#{}},{{function,dt_spread_tag,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<100,116,95,115,112,114,101,97,100,95,116,97,103,47,49>>],hidden,#{}},{{function,exit_signal,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<101,120,105,116,95,115,105,103,110,97,108,47,50>>],hidden,#{}},{{function,finish_after_on_load,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<102,105,110,105,115,104,95,97,102,116,101,114,95,111,110,95,108,111,97,100,47,50>>],hidden,#{}},{{function,finish_loading,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<102,105,110,105,115,104,95,108,111,97,100,105,110,103,47,49>>],hidden,#{}},{{function,format_cpu_topology,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<102,111,114,109,97,116,95,99,112,117,95,116,111,112,111,108,111,103,121,47,49>>],hidden,#{}},{{function,fun_info_mfa,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<102,117,110,95,105,110,102,111,95,109,102,97,47,49>>],hidden,#{}},{{function,garbage_collect_message_area,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,95,109,101,115,115,97,103,101,95,97,114,101,97,47,48>>],hidden,#{}},{{function,gather_gc_info_result,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<103,97,116,104,101,114,95,103,99,95,105,110,102,111,95,114,101,115,117,108,116,47,49>>],hidden,#{}},{{function,get_module_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,47,49>>],hidden,#{}},{{function,get_module_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<103,101,116,95,109,111,100,117,108,101,95,105,110,102,111,47,50>>],hidden,#{}},{{function,has_prepared_code_on_load,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<104,97,115,95,112,114,101,112,97,114,101,100,95,99,111,100,101,95,111,110,95,108,111,97,100,47,49>>],hidden,#{}},{{function,make_fun,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<109,97,107,101,95,102,117,110,47,51>>],hidden,#{}},{{function,'not',1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,110,111,116,39,47,49>>],hidden,#{}},{{function,'or',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,111,114,39,47,50>>],hidden,#{}},{{function,port_call,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<112,111,114,116,95,99,97,108,108,47,50>>],hidden,#{}},{{function,port_get_data,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<112,111,114,116,95,103,101,116,95,100,97,116,97,47,49>>],hidden,#{}},{{function,port_set_data,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<112,111,114,116,95,115,101,116,95,100,97,116,97,47,50>>],hidden,#{}},{{function,posixtime_to_universaltime,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<112,111,115,105,120,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,49>>],hidden,#{}},{{function,prepare_loading,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<112,114,101,112,97,114,101,95,108,111,97,100,105,110,103,47,50>>],hidden,#{}},{{function,'rem',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,114,101,109,39,47,50>>],hidden,#{}},{{function,seq_trace,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,101,113,95,116,114,97,99,101,47,50>>],hidden,#{}},{{function,seq_trace_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,101,113,95,116,114,97,99,101,95,105,110,102,111,47,49>>],hidden,#{}},{{function,seq_trace_print,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,101,113,95,116,114,97,99,101,95,112,114,105,110,116,47,49>>],hidden,#{}},{{function,seq_trace_print,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,101,113,95,116,114,97,99,101,95,112,114,105,110,116,47,50>>],hidden,#{}},{{function,set_cpu_topology,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,101,116,95,99,112,117,95,116,111,112,111,108,111,103,121,47,49>>],hidden,#{}},{{function,setnode,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,101,116,110,111,100,101,47,50>>],hidden,#{}},{{function,setnode,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,101,116,110,111,100,101,47,51>>],hidden,#{}},{{function,subtract,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<115,117,98,116,114,97,99,116,47,50>>],hidden,#{}},{{function,universaltime_to_posixtime,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,112,111,115,105,120,116,105,109,101,47,49>>],hidden,#{}},{{function,'xor',2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,0}],[<<39,120,111,114,39,47,50>>],hidden,#{}},{{function,abs,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2163}],[<<97,98,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,102,108,111,97,116,32,116,104,97,116,32,105,115,32,116,104,101,32,97,114,105,116,104,109,101,116,105,99,97,108,32,97,98,115,111,108,117,116,101,32,118,97,108,117,101,32,111,102,32>>,{code,[],[<<70,108,111,97,116>>]},<<32,111,114,32>>,{code,[],[<<73,110,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,98,115,40,45,51,46,51,51,41,46,10,51,46,51,51,10,62,32,97,98,115,40,45,51,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,54,56>>,signature => [{attribute,{2163,2},spec,{{abs,1},[{type,{2163,10},bounded_fun,[{type,{2163,10},'fun',[{type,{2163,10},product,[{var,{2163,11},'Float'}]},{type,{2163,21},float,[]}]},[{type,{2164,7},constraint,[{atom,{2164,7},is_subtype},[{var,{2164,7},'Float'},{type,{2164,16},float,[]}]]}]]},{type,{2165,10},bounded_fun,[{type,{2165,10},'fun',[{type,{2165,10},product,[{var,{2165,11},'Int'}]},{type,{2165,19},non_neg_integer,[]}]},[{type,{2166,7},constraint,[{atom,{2166,7},is_subtype},[{var,{2166,7},'Int'},{type,{2166,14},integer,[]}]]}]]}]}}]}},{{function,adler32,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,418}],[<<97,100,108,101,114,51,50,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,102,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,53>>,signature => [{attribute,{418,2},spec,{{erlang,adler32,1},[{type,{418,21},bounded_fun,[{type,{418,21},'fun',[{type,{418,21},product,[{var,{418,22},'Data'}]},{type,{418,31},non_neg_integer,[]}]},[{type,{419,7},constraint,[{atom,{419,7},is_subtype},[{var,{419,7},'Data'},{type,{419,15},iodata,[]}]]}]]}]}}]}},{{function,adler32,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,424}],[<<97,100,108,101,114,51,50,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,32>>,{code,[],[<<79,108,100,65,100,108,101,114>>]},<<44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,88,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<89>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,52>>,signature => [{attribute,{424,2},spec,{{erlang,adler32,2},[{type,{424,21},bounded_fun,[{type,{424,21},'fun',[{type,{424,21},product,[{var,{424,22},'OldAdler'},{var,{424,32},'Data'}]},{type,{424,41},non_neg_integer,[]}]},[{type,{425,7},constraint,[{atom,{425,7},is_subtype},[{var,{425,7},'OldAdler'},{type,{425,19},non_neg_integer,[]}]]},{type,{426,7},constraint,[{atom,{426,7},is_subtype},[{var,{426,7},'Data'},{type,{426,15},iodata,[]}]]}]]}]}}]}},{{function,adler32_combine,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,431}],[<<97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,97,100,108,101,114,51,50,32,99,104,101,99,107,115,117,109,115,46,32,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,32,116,111,32,98,101,32,107,110,111,119,110,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,89,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<90>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,97,100,108,101,114,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,49,49>>,signature => [{attribute,{431,2},spec,{{erlang,adler32_combine,3},[{type,{431,29},bounded_fun,[{type,{431,29},'fun',[{type,{431,29},product,[{var,{431,30},'FirstAdler'},{var,{431,42},'SecondAdler'},{var,{431,55},'SecondSize'}]},{type,{431,70},non_neg_integer,[]}]},[{type,{432,7},constraint,[{atom,{432,7},is_subtype},[{var,{432,7},'FirstAdler'},{type,{432,21},non_neg_integer,[]}]]},{type,{433,7},constraint,[{atom,{433,7},is_subtype},[{var,{433,7},'SecondAdler'},{type,{433,22},non_neg_integer,[]}]]},{type,{434,7},constraint,[{atom,{434,7},is_subtype},[{var,{434,7},'SecondSize'},{type,{434,21},non_neg_integer,[]}]]}]]}]}}]}},{{function,alias,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,824}],[<<97,108,105,97,115,47,49>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,48>>,equiv => {function,alias,0},signature => [{attribute,{824,2},spec,{{alias,1},[{type,{824,12},bounded_fun,[{type,{824,12},'fun',[{type,{824,12},product,[{var,{824,13},'Opts'}]},{var,{824,22},'Alias'}]},[{type,{825,7},constraint,[{atom,{825,7},is_subtype},[{var,{825,7},'Alias'},{type,{825,16},reference,[]}]]},{type,{826,7},constraint,[{atom,{826,7},is_subtype},[{var,{826,7},'Opts'},{type,{826,15},list,[{type,{826,16},union,[{atom,{826,16},explicit_unalias},{atom,{826,37},reply}]}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,alias,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,818}],[<<97,108,105,97,115,47,48>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,32,97,110,32,97,108,105,97,115,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,97,108,105,97,115,46,32,87,104,101,110,32,116,104,101,32,97,108,105,97,115,32,104,97,115,32,98,101,101,110,32,100,101,97,99,116,105,118,97,116,101,100,44,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,117,115,105,110,103,32,116,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,65,110,32,97,108,105,97,115,32,99,97,110,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,97,108,105,97,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,97,108,105,97,115,47,49>>]}]},<<46,32,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,32,102,111,114,32>>,{code,[],[<<97,108,105,97,115,47,49>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,99,97,110,32,111,110,108,121,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,117,114,32,105,102,32,110,111,32,111,112,116,105,111,110,115,32,97,114,101,32,112,97,115,115,101,100,32,111,114,32,105,102,32>>,{code,[],[<<97,108,105,97,115,47,48>>]},<<32,105,115,32,99,97,108,108,101,100,46>>]}]},{dt,[],[{code,[],[<<114,101,112,108,121>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,33,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,101,110,100,44,10,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,44,32,82,101,113,117,101,115,116,41,32,45,62,10,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,61,32,97,108,105,97,115,40,91,114,101,112,108,121,93,41,44,10,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,44,10,32,32,32,32,37,37,32,65,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,105,102,32,119,101,32,114,101,99,101,105,118,101,32,97,32,114,101,112,108,121,10,32,32,32,32,37,37,32,115,105,110,99,101,32,119,101,32,117,115,101,100,32,116,104,101,32,39,114,101,112,108,121,39,32,111,112,116,105,111,110,46,46,46,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,32,82,101,115,117,108,116,10,32,32,32,32,97,102,116,101,114,32,53,48,48,48,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,117,110,97,108,105,97,115,40,65,108,105,97,115,82,101,113,73,100,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,70,108,117,115,104,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,110,32,99,97,115,101,32,116,104,101,32,114,101,112,108,121,32,97,114,114,105,118,101,100,10,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,106,117,115,116,32,98,101,102,111,114,101,32,116,104,101,32,97,108,105,97,115,32,119,97,115,32,100,101,97,99,116,105,118,97,116,101,100,46,46,46,10,32,32,32,32,32,32,32,32,32,32,32,32,114,101,99,101,105,118,101,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,32,82,101,115,117,108,116,10,32,32,32,32,32,32,32,32,32,32,32,32,97,102,116,101,114,32,48,32,45,62,32,101,120,105,116,40,116,105,109,101,111,117,116,41,10,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,10,32,32,32,32,101,110,100,46,10,9>>]}]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,98,111,116,104,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,116,104,101,32,99,108,105,101,110,116,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,32,97,116,32,108,101,97,115,116,32,79,84,80,32,50,52,32,115,121,115,116,101,109,115,32,105,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{i,[],[<<80,114,111,99,101,115,115,32,65,108,105,97,115,101,115>>]}]},<<32,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32>>,{i,[],[<<69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,48>>,signature => [{attribute,{818,2},spec,{{alias,0},[{type,{818,12},bounded_fun,[{type,{818,12},'fun',[{type,{818,12},product,[]},{var,{818,18},'Alias'}]},[{type,{819,7},constraint,[{atom,{819,7},is_subtype},[{var,{819,7},'Alias'},{type,{819,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,append_element,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,439}],[<<97,112,112,101,110,100,95,101,108,101,109,101,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,116,104,97,116,32,104,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,109,111,114,101,32,116,104,97,110,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<44,32,97,110,100,32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,105,110,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<32,102,111,108,108,111,119,101,100,32,98,121,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,115,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,46,32,83,101,109,97,110,116,105,99,97,108,108,121,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<108,105,115,116,95,116,111,95,116,117,112,108,101,40,116,117,112,108,101,95,116,111,95,108,105,115,116,40,84,117,112,108,101,49,41,32,43,43,32,91,84,101,114,109,93,41>>]},<<44,32,98,117,116,32,109,117,99,104,32,102,97,115,116,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,97,112,112,101,110,100,95,101,108,101,109,101,110,116,40,123,111,110,101,44,32,116,119,111,125,44,32,116,104,114,101,101,41,46,10,123,111,110,101,44,116,119,111,44,116,104,114,101,101,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,57>>,signature => [{attribute,{439,2},spec,{{erlang,append_element,2},[{type,{439,28},bounded_fun,[{type,{439,28},'fun',[{type,{439,28},product,[{var,{439,29},'Tuple1'},{var,{439,37},'Term'}]},{var,{439,46},'Tuple2'}]},[{type,{440,7},constraint,[{atom,{440,7},is_subtype},[{var,{440,7},'Tuple1'},{type,{440,17},tuple,any}]]},{type,{441,7},constraint,[{atom,{441,7},is_subtype},[{var,{441,7},'Tuple2'},{type,{441,17},tuple,any}]]},{type,{442,7},constraint,[{atom,{442,7},is_subtype},[{var,{442,7},'Term'},{type,{442,15},term,[]}]]}]]}]}}]}},{{function,apply,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2956}],[<<97,112,112,108,121,47,50>>],#{<<101,110>> => [{p,[],[<<67,97,108,108,115,32,97,32,102,117,110,44,32,112,97,115,115,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,105,110,32>>,{code,[],[<<65,114,103,115>>]},<<32,97,115,32,97,114,103,117,109,101,110,116,115,46>>]},{p,[],[<<73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,32,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,32,97,115,32>>,{code,[],[<<70,117,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,32,65,114,103,78,41>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<69,97,114,108,105,101,114,44,32>>,{code,[],[<<70,117,110>>]},<<32,99,111,117,108,100,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,125>>]},<<44,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<97,112,112,108,121,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>]},<<46,32>>,{em,[],[<<84,104,105,115,32,117,115,101,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,110,100,32,119,105,108,108,32,115,116,111,112,32,119,111,114,107,105,110,103,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,54>>,signature => [{attribute,{2956,2},spec,{{apply,2},[{type,{2956,12},bounded_fun,[{type,{2956,12},'fun',[{type,{2956,12},product,[{var,{2956,13},'Fun'},{var,{2956,18},'Args'}]},{type,{2956,27},term,[]}]},[{type,{2957,7},constraint,[{atom,{2957,7},is_subtype},[{var,{2957,7},'Fun'},{type,{2957,14},function,[]}]]},{type,{2958,7},constraint,[{atom,{2958,7},is_subtype},[{var,{2958,7},'Args'},{type,{2958,15},list,[{type,{2958,16},term,[]}]}]]}]]}]}}]}},{{function,apply,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2963}],[<<97,112,112,108,121,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,110,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,84,104,101,32,97,112,112,108,105,101,100,32,102,117,110,99,116,105,111,110,32,109,117,115,116,32,98,101,32,101,120,112,111,114,116,101,100,32,102,114,111,109,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,112,112,108,121,40,108,105,115,116,115,44,32,114,101,118,101,114,115,101,44,32,91,91,97,44,32,98,44,32,99,93,93,41,46,10,91,99,44,98,44,97,93,10,62,32,97,112,112,108,121,40,101,114,108,97,110,103,44,32,97,116,111,109,95,116,111,95,108,105,115,116,44,32,91,39,69,114,108,97,110,103,39,93,41,46,10,34,69,114,108,97,110,103,34>>]}]},{p,[],[<<73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,107,110,111,119,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,116,104,101,32,99,97,108,108,32,105,115,32,98,101,116,116,101,114,32,119,114,105,116,116,101,110,32,97,115,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,40,65,114,103,49,44,32,65,114,103,50,44,32,46,46,46,44,32,65,114,103,78,41>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{a,[{href,<<107,101,114,110,101,108,58,101,114,114,111,114,95,104,97,110,100,108,101,114,35,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,47,51>>]}]},<<32,105,115,32,99,97,108,108,101,100,32,105,102,32,116,104,101,32,97,112,112,108,105,101,100,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,101,120,112,111,114,116,101,100,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<41,46,32,73,102,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,105,102,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,115,111,32,116,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,109,111,100,117,108,101,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,32,101,114,114,111,114,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<117,110,100,101,102>>]},<<32,105,115,32,103,101,110,101,114,97,116,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,51,52>>,signature => [{attribute,{2963,2},spec,{{apply,3},[{type,{2963,12},bounded_fun,[{type,{2963,12},'fun',[{type,{2963,12},product,[{var,{2963,13},'Module'},{var,{2963,21},'Function'},{var,{2963,31},'Args'}]},{type,{2963,40},term,[]}]},[{type,{2964,7},constraint,[{atom,{2964,7},is_subtype},[{var,{2964,7},'Module'},{type,{2964,17},module,[]}]]},{type,{2965,7},constraint,[{atom,{2965,7},is_subtype},[{var,{2965,7},'Function'},{type,{2965,19},atom,[]}]]},{type,{2966,7},constraint,[{atom,{2966,7},is_subtype},[{var,{2966,7},'Args'},{type,{2966,15},list,[{type,{2966,16},term,[]}]}]]}]]}]}}]}},{{function,atom_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,447}],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121>>]},<<32>>]},{code,[],[<<40,65,116,111,109,44,32,117,116,102,56,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,54,52>>,signature => [{attribute,{447,2},spec,{{atom_to_binary,1},[{type,{447,21},bounded_fun,[{type,{447,21},'fun',[{type,{447,21},product,[{var,{447,22},'Atom'}]},{type,{447,31},binary,[]}]},[{type,{448,7},constraint,[{atom,{448,7},is_subtype},[{var,{448,7},'Atom'},{type,{448,15},atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,atom_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,458}],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<65,116,111,109>>]},<<46,32,73,102,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<32,105,115,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,111,110,101,32,98,121,116,101,32,101,120,105,115,116,115,32,102,111,114,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,32,73,102,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,111,114,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,85,84,70,45,56,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,114,101,113,117,105,114,101,32,109,117,108,116,105,112,108,101,32,98,121,116,101,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32,97,116,111,109,115,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32>>,{code,[],[<<97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,65,116,111,109,44,32,108,97,116,105,110,49,41>>]},<<32,109,97,121,32,102,97,105,108,32,105,102,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32>>,{code,[],[<<65,116,111,109>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,62,32,50,53,53,46>>]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,116,111,109,95,116,111,95,98,105,110,97,114,121,40,39,69,114,108,97,110,103,39,44,32,108,97,116,105,110,49,41,46,10,60,60,34,69,114,108,97,110,103,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,52>>,signature => [{attribute,{458,2},spec,{{atom_to_binary,2},[{type,{458,21},bounded_fun,[{type,{458,21},'fun',[{type,{458,21},product,[{var,{458,22},'Atom'},{var,{458,28},'Encoding'}]},{type,{458,41},binary,[]}]},[{type,{459,7},constraint,[{atom,{459,7},is_subtype},[{var,{459,7},'Atom'},{type,{459,15},atom,[]}]]},{type,{460,7},constraint,[{atom,{460,7},is_subtype},[{var,{460,7},'Encoding'},{type,{460,19},union,[{atom,{460,19},latin1},{atom,{460,28},unicode},{atom,{460,38},utf8}]}]]}]]}]}}]}},{{function,atom_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,465}],[<<97,116,111,109,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,117,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<65,116,111,109>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,69,114,108,97,110,103,39,41,46,10,34,69,114,108,97,110,103,34>>]}]},{pre,[],[{code,[],[<<62,32,97,116,111,109,95,116,111,95,108,105,115,116,40,39,228,189,160,229,165,189,39,41,46,10,91,50,48,51,50,48,44,50,50,57,48,57,93>>]}]},{p,[],[<<83,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,105,99,111,100,101,40,51,41>>]}]},<<32,102,111,114,32,104,111,119,32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,116,111,32,100,105,102,102,101,114,101,110,116,32,102,111,114,109,97,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,57,57>>,signature => [{attribute,{465,2},spec,{{atom_to_list,1},[{type,{465,19},bounded_fun,[{type,{465,19},'fun',[{type,{465,19},product,[{var,{465,20},'Atom'}]},{type,{465,29},string,[]}]},[{type,{466,7},constraint,[{atom,{466,7},is_subtype},[{var,{466,7},'Atom'},{type,{466,15},atom,[]}]]}]]}]}}]}},{{function,binary_part,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,472}],[<<98,105,110,97,114,121,95,112,97,114,116,47,50>>],#{<<101,110>> => [{p,[],[<<69,120,116,114,97,99,116,115,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,100,101,115,99,114,105,98,101,100,32,98,121,32>>,{code,[],[<<80,111,115,76,101,110>>]},<<46>>]},{p,[],[<<78,101,103,97,116,105,118,101,32,108,101,110,103,116,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,101,120,116,114,97,99,116,32,98,121,116,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,98,105,110,97,114,121,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,44,49,48,62,62,46,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,98,121,116,101,95,115,105,122,101,40,66,105,110,41,44,32,45,53,125,41,46,10,60,60,54,44,55,44,56,44,57,44,49,48,62,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,115,76,101,110>>]},<<32,105,110,32,97,110,121,32,119,97,121,32,114,101,102,101,114,101,110,99,101,115,32,111,117,116,115,105,100,101,32,116,104,101,32,98,105,110,97,114,121,46>>]},{p,[],[{code,[],[<<83,116,97,114,116>>]},<<32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,116,104,97,116,32,105,115,58>>]},{pre,[],[{code,[],[<<49,62,32,66,105,110,32,61,32,60,60,49,44,50,44,51,62,62,10,50,62,32,98,105,110,97,114,121,95,112,97,114,116,40,66,105,110,44,123,48,44,50,125,41,46,10,60,60,49,44,50,62,62>>]}]},{p,[],[<<70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<80,111,115,76,101,110>>]},<<32,115,101,109,97,110,116,105,99,115,44,32,115,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,98,105,110,97,114,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<98,105,110,97,114,121,40,51,41>>]}]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,55>>,signature => [{attribute,{472,2},spec,{{binary_part,2},[{type,{472,18},bounded_fun,[{type,{472,18},'fun',[{type,{472,18},product,[{var,{472,19},'Subject'},{var,{472,28},'PosLen'}]},{type,{472,39},binary,[]}]},[{type,{473,7},constraint,[{atom,{473,7},is_subtype},[{var,{473,7},'Subject'},{type,{473,18},binary,[]}]]},{type,{474,7},constraint,[{atom,{474,7},is_subtype},[{var,{474,7},'PosLen'},{type,{474,17},tuple,[{ann_type,{474,18},[{var,{474,18},'Start'},{type,{474,27},non_neg_integer,[]}]},{ann_type,{474,46},[{var,{474,46},'Length'},{type,{474,56},integer,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,binary_part,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,480}],[<<98,105,110,97,114,121,95,112,97,114,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<98,105,110,97,114,121,95,112,97,114,116,40,83,117,98,106,101,99,116,44,32,123,83,116,97,114,116,44,32,76,101,110,103,116,104,125,41>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,52,50>>,signature => [{attribute,{480,2},spec,{{binary_part,3},[{type,{480,18},bounded_fun,[{type,{480,18},'fun',[{type,{480,18},product,[{var,{480,19},'Subject'},{var,{480,28},'Start'},{var,{480,35},'Length'}]},{type,{480,46},binary,[]}]},[{type,{481,7},constraint,[{atom,{481,7},is_subtype},[{var,{481,7},'Subject'},{type,{481,18},binary,[]}]]},{type,{482,7},constraint,[{atom,{482,7},is_subtype},[{var,{482,7},'Start'},{type,{482,16},non_neg_integer,[]}]]},{type,{483,7},constraint,[{atom,{483,7},is_subtype},[{var,{483,7},'Length'},{type,{483,17},integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,binary_to_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,488}],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109>>]},<<32>>]},{code,[],[<<40,66,105,110,97,114,121,44,32,117,116,102,56,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,50>>,signature => [{attribute,{488,2},spec,{{binary_to_atom,1},[{type,{488,21},bounded_fun,[{type,{488,21},'fun',[{type,{488,21},product,[{var,{488,22},'Binary'}]},{type,{488,33},atom,[]}]},[{type,{489,7},constraint,[{atom,{489,7},is_subtype},[{var,{489,7},'Binary'},{type,{489,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_to_atom,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,498}],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46,32,73,102,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,111,114,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,116,104,101,32,98,105,110,97,114,121,32,109,117,115,116,32,99,111,110,116,97,105,110,32,118,97,108,105,100,32,85,84,70,45,56,32,115,101,113,117,101,110,99,101,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,66,105,110,97,114,121,44,32,117,116,102,56,41>>]},<<32,105,115,32,99,97,112,97,98,108,101,32,111,102,32,100,101,99,111,100,105,110,103,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,119,111,117,108,100,32,102,97,105,108,32,105,102,32,116,104,101,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,101,100,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,62,32,50,53,53,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,119,104,101,116,104,101,114,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50>>]},<<32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,32,116,104,97,110,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,34,69,114,108,97,110,103,34,62,62,44,32,108,97,116,105,110,49,41,46,10,39,69,114,108,97,110,103,39>>]}]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,97,116,111,109,40,60,60,49,48,50,52,47,117,116,102,56,62,62,44,32,117,116,102,56,41,46,10,39,208,128,39>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,54,50>>,signature => [{attribute,{498,2},spec,{{binary_to_atom,2},[{type,{498,21},bounded_fun,[{type,{498,21},'fun',[{type,{498,21},product,[{var,{498,22},'Binary'},{var,{498,30},'Encoding'}]},{type,{498,43},atom,[]}]},[{type,{499,7},constraint,[{atom,{499,7},is_subtype},[{var,{499,7},'Binary'},{type,{499,17},binary,[]}]]},{type,{500,7},constraint,[{atom,{500,7},is_subtype},[{var,{500,7},'Encoding'},{type,{500,19},union,[{atom,{500,19},latin1},{atom,{500,28},unicode},{atom,{500,38},utf8}]}]]}]]}]}}]}},{{function,binary_to_existing_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,505}],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109>>]}]},<<32>>,{code,[],[<<40,66,105,110,97,114,121,44,32,117,116,102,56,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,48,49>>,signature => [{attribute,{505,2},spec,{{binary_to_existing_atom,1},[{type,{505,30},bounded_fun,[{type,{505,30},'fun',[{type,{505,30},product,[{var,{505,31},'Binary'}]},{type,{505,42},atom,[]}]},[{type,{506,7},constraint,[{atom,{506,7},is_subtype},[{var,{506,7},'Binary'},{type,{506,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,binary_to_existing_atom,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,515}],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,50>>],#{<<101,110>> => [{p,[],[<<65,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]}]},<<44,32,98,117,116,32,116,104,101,32,97,116,111,109,32,109,117,115,116,32,101,120,105,115,116,46>>]},{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,104,97,115,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116>>]},<<32,102,111,114,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,44,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,110,111,116,32,115,97,102,101,32,116,111,32,99,114,101,97,116,101,32,109,97,110,121,32,97,116,111,109,115,32,102,114,111,109,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,99,111,109,101,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,105,108,101,32,102,101,116,99,104,101,100,32,102,114,111,109,32,116,104,101,32,73,110,116,101,114,110,101,116,41,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]}]},<<46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,117,115,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,111,112,116,105,111,110,32,119,104,101,110,32,116,104,101,32,105,110,112,117,116,32,98,105,110,97,114,121,32,99,111,109,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46>>]},{p,[],[<<65,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,97,110,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,119,104,101,110,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,111,114,32,119,104,101,110,32,99,114,101,97,116,101,100,32,112,114,111,103,114,97,109,109,97,116,105,99,97,108,108,121,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,98,121,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,97,116,111,109,47,50>>]},<<41,46,32,83,101,101,32,116,104,101,32,110,101,120,116,32,110,111,116,101,32,102,111,114,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,110,32,97,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,32,102,111,114,32,97,110,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,98,117,116,32,110,111,116,32,105,110,32,116,104,101,32,99,111,109,112,105,108,101,100,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,97,109,101,32,109,111,100,117,108,101,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,97,116,111,109,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,32,114,101,119,114,105,116,101,32>>,{code,[],[<<97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41>>]},<<32,116,111,32>>,{code,[],[<<34,115,111,109,101,95,97,116,111,109,34>>]},<<46,32,73,102,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,111,109,101,95,97,116,111,109>>]},<<32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,60,60,34,115,111,109,101,95,97,116,111,109,34,62,62,44,32,117,116,102,56,41>>]},<<32,119,105,108,108,32,102,97,105,108,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,50>>,signature => [{attribute,{515,2},spec,{{binary_to_existing_atom,2},[{type,{515,30},bounded_fun,[{type,{515,30},'fun',[{type,{515,30},product,[{var,{515,31},'Binary'},{var,{515,39},'Encoding'}]},{type,{515,52},atom,[]}]},[{type,{516,7},constraint,[{atom,{516,7},is_subtype},[{var,{516,7},'Binary'},{type,{516,17},binary,[]}]]},{type,{517,7},constraint,[{atom,{517,7},is_subtype},[{var,{517,7},'Encoding'},{type,{517,19},union,[{atom,{517,19},latin1},{atom,{517,28},unicode},{atom,{517,38},utf8}]}]]}]]}]}}]}},{{function,binary_to_float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,522}],[<<98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,102,108,111,97,116,40,60,60,34,50,46,50,48,49,55,55,54,52,101,43,48,34,62,62,41,46,10,50,46,50,48,49,55,55,54,52>>]}]},{p,[],[<<84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,53,54>>,signature => [{attribute,{522,2},spec,{{binary_to_float,1},[{type,{522,22},bounded_fun,[{type,{522,22},'fun',[{type,{522,22},product,[{var,{522,23},'Binary'}]},{type,{522,34},float,[]}]},[{type,{523,7},constraint,[{atom,{523,7},is_subtype},[{var,{523,7},'Binary'},{type,{523,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,528}],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,49,50,51,34,62,62,41,46,10,49,50,51>>]}]},{p,[],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,49>>]},<<32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,55,52>>,signature => [{attribute,{528,2},spec,{{binary_to_integer,1},[{type,{528,24},bounded_fun,[{type,{528,24},'fun',[{type,{528,24},product,[{var,{528,25},'Binary'}]},{type,{528,36},integer,[]}]},[{type,{529,7},constraint,[{atom,{529,7},is_subtype},[{var,{529,7},'Binary'},{type,{529,17},binary,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_integer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,534}],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<32,105,115,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,40,60,60,34,51,70,70,34,62,62,44,32,49,54,41,46,10,49,48,50,51>>]}]},{p,[],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,105,110,116,101,103,101,114,47,50>>]},<<32,97,99,99,101,112,116,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,102,111,114,109,97,116,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,57,49>>,signature => [{attribute,{534,2},spec,{{binary_to_integer,2},[{type,{534,24},bounded_fun,[{type,{534,24},'fun',[{type,{534,24},product,[{var,{534,25},'Binary'},{var,{534,32},'Base'}]},{type,{534,41},integer,[]}]},[{type,{535,7},constraint,[{atom,{535,7},is_subtype},[{var,{535,7},'Binary'},{type,{535,17},binary,[]}]]},{type,{536,7},constraint,[{atom,{536,7},is_subtype},[{var,{536,7},'Base'},{type,{536,15},range,[{integer,{536,15},2},{integer,{536,18},36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,binary_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,541}],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,48,57>>,signature => [{attribute,{541,2},spec,{{binary_to_list,1},[{type,{541,21},bounded_fun,[{type,{541,21},'fun',[{type,{541,21},product,[{var,{541,22},'Binary'}]},{type,{541,33},list,[{type,{541,34},byte,[]}]}]},[{type,{542,7},constraint,[{atom,{542,7},is_subtype},[{var,{542,7},'Binary'},{type,{542,17},binary,[]}]]}]]}]}}]}},{{function,binary_to_list,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,547}],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<65,115,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49>>]},<<44,32,98,117,116,32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<83,116,97,114,116>>]},<<32,116,111,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<83,116,111,112>>]},<<32,105,110,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46,32,84,104,101,32,112,111,115,105,116,105,111,110,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,97,114,101,32,110,117,109,98,101,114,101,100,32,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{em,[],[<<84,104,101,32,111,110,101,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,32,102,111,114,32,98,105,110,97,114,105,101,115,32,117,115,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46>>]},<<32,78,101,119,32,99,111,100,101,32,105,115,32,116,111,32,117,115,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,98,105,110,97,114,121,35,98,105,110,95,116,111,95,108,105,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,58,98,105,110,95,116,111,95,108,105,115,116,47,51>>]}]},<<32,105,110,32,83,84,68,76,73,66,32,105,110,115,116,101,97,100,46,32,65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,109,111,100,117,108,101,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,99,111,110,115,105,115,116,101,110,116,108,121,32,117,115,101,32,122,101,114,111,45,98,97,115,101,100,32,105,110,100,101,120,105,110,103,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,49,56>>,signature => [{attribute,{547,2},spec,{{binary_to_list,3},[{type,{547,21},bounded_fun,[{type,{547,21},'fun',[{type,{547,21},product,[{var,{547,22},'Binary'},{var,{547,30},'Start'},{var,{547,37},'Stop'}]},{type,{547,46},list,[{type,{547,47},byte,[]}]}]},[{type,{548,7},constraint,[{atom,{548,7},is_subtype},[{var,{548,7},'Binary'},{type,{548,17},binary,[]}]]},{type,{549,7},constraint,[{atom,{549,7},is_subtype},[{var,{549,7},'Start'},{type,{549,16},pos_integer,[]}]]},{type,{550,7},constraint,[{atom,{550,7},is_subtype},[{var,{550,7},'Stop'},{type,{550,15},pos_integer,[]}]]}]]}]}}]}},{{function,binary_to_term,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,555}],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,121,32,111,98,106,101,99,116,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<44,32,119,104,105,99,104,32,109,117,115,116,32,98,101,32,101,110,99,111,100,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,101,120,116,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116>>]},<<46>>]},{pre,[],[{code,[],[<<62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<87,104,101,110,32,100,101,99,111,100,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,44,32,116,104,101,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,32,109,97,121,32,115,117,98,109,105,116,32,100,97,116,97,32,105,110,32,97,32,119,97,121,32,116,111,32,99,114,101,97,116,101,32,114,101,115,111,117,114,99,101,115,44,32,115,117,99,104,32,97,115,32,97,116,111,109,115,32,97,110,100,32,114,101,109,111,116,101,32,114,101,102,101,114,101,110,99,101,115,44,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,32,97,110,100,32,108,101,97,100,32,116,111,32,68,101,110,105,97,108,32,111,102,32,83,101,114,118,105,99,101,32,97,116,116,97,99,107,46,32,73,110,32,115,117,99,104,32,99,97,115,101,115,44,32,99,111,110,115,105,100,101,114,32,117,115,105,110,103,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>]},<<32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<115,97,102,101>>]},<<32,111,112,116,105,111,110,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,52,48>>,signature => [{attribute,{555,2},spec,{{binary_to_term,1},[{type,{555,21},bounded_fun,[{type,{555,21},'fun',[{type,{555,21},product,[{var,{555,22},'Binary'}]},{type,{555,33},term,[]}]},[{type,{556,7},constraint,[{atom,{556,7},is_subtype},[{var,{556,7},'Binary'},{user_type,{556,17},ext_binary,[]}]]}]]}]}}]}},{{function,binary_to_term,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,561}],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,50>>],#{<<101,110>> => [{p,[],[<<65,115,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]},<<44,32,98,117,116,32,116,97,107,101,115,32,116,104,101,115,101,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,97,102,101>>]}]},{dd,[],[{p,[],[<<85,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,119,104,101,110,32,114,101,99,101,105,118,105,110,103,32,98,105,110,97,114,105,101,115,32,102,114,111,109,32,97,110,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,46>>]},{p,[],[<<87,104,101,110,32,101,110,97,98,108,101,100,44,32,105,116,32,112,114,101,118,101,110,116,115,32,100,101,99,111,100,105,110,103,32,100,97,116,97,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,116,116,97,99,107,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,46,32,73,110,32,116,104,101,32,101,118,101,110,116,32,111,102,32,114,101,99,101,105,118,105,110,103,32,117,110,115,97,102,101,32,100,97,116,97,44,32,100,101,99,111,100,105,110,103,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,114,114,111,114,46>>]},{p,[],[<<84,104,105,115,32,112,114,101,118,101,110,116,115,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,100,105,114,101,99,116,108,121,44,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,97,116,111,109,115,32,105,110,100,105,114,101,99,116,108,121,32,40,97,115,32,116,104,101,121,32,97,114,101,32,101,109,98,101,100,100,101,100,32,105,110,32,99,101,114,116,97,105,110,32,115,116,114,117,99,116,117,114,101,115,44,32,115,117,99,104,32,97,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,114,101,102,115,44,32,97,110,100,32,102,117,110,115,41,44,32,97,110,100,32,99,114,101,97,116,105,111,110,32,111,102,32,110,101,119,32,101,120,116,101,114,110,97,108,32,102,117,110,99,116,105,111,110,32,114,101,102,101,114,101,110,99,101,115,46,32,78,111,110,101,32,111,102,32,116,104,111,115,101,32,114,101,115,111,117,114,99,101,115,32,97,114,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,44,32,115,111,32,117,110,99,104,101,99,107,101,100,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,109,32,99,97,110,32,101,120,104,97,117,115,116,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46>>]},{pre,[],[{code,[],[<<62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,98,97,100,32,97,114,103,117,109,101,110,116,10,62,32,104,101,108,108,111,46,10,104,101,108,108,111,10,62,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,62,62,44,32,91,115,97,102,101,93,41,46,10,104,101,108,108,111>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,101,32>>,{code,[],[<<115,97,102,101>>]},<<32,111,112,116,105,111,110,32,101,110,115,117,114,101,115,32,116,104,101,32,100,97,116,97,32,105,115,32,115,97,102,101,108,121,32,112,114,111,99,101,115,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,98,117,116,32,105,116,32,100,111,101,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,32,116,104,101,32,100,97,116,97,32,105,115,32,115,97,102,101,32,116,111,32,121,111,117,114,32,97,112,112,108,105,99,97,116,105,111,110,46,32,89,111,117,32,109,117,115,116,32,97,108,119,97,121,115,32,118,97,108,105,100,97,116,101,32,100,97,116,97,32,102,114,111,109,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,46,32,73,102,32,116,104,101,32,98,105,110,97,114,121,32,105,115,32,115,116,111,114,101,100,32,111,114,32,116,114,97,110,115,105,116,115,32,116,104,114,111,117,103,104,32,117,110,116,114,117,115,116,101,100,32,115,111,117,114,99,101,115,44,32,121,111,117,32,115,104,111,117,108,100,32,97,108,115,111,32,99,111,110,115,105,100,101,114,32,99,114,121,112,116,111,103,114,97,112,104,105,99,97,108,108,121,32,115,105,103,110,105,110,103,32,105,116,46>>]}]}]},{dt,[],[{code,[],[<<117,115,101,100>>]}]},{dd,[],[{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<123,84,101,114,109,44,32,85,115,101,100,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<85,115,101,100>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,99,116,117,97,108,108,121,32,114,101,97,100,32,102,114,111,109,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<46>>]},{pre,[],[{code,[],[<<62,32,73,110,112,117,116,32,61,32,60,60,49,51,49,44,49,48,48,44,48,44,53,44,34,104,101,108,108,111,34,44,34,119,111,114,108,100,34,62,62,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,44,49,49,57,44,49,49,49,44,49,49,52,44,49,48,56,44,49,48,48,62,62,10,62,32,123,84,101,114,109,44,32,85,115,101,100,125,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,73,110,112,117,116,44,32,91,117,115,101,100,93,41,46,10,123,104,101,108,108,111,44,32,57,125,10,62,32,115,112,108,105,116,95,98,105,110,97,114,121,40,73,110,112,117,116,44,32,85,115,101,100,41,46,10,123,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,44,32,60,60,34,119,111,114,108,100,34,62,62,125>>]}]}]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<115,97,102,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,117,110,115,97,102,101,32,100,97,116,97,32,105,115,32,100,101,99,111,100,101,100,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,54,57>>,signature => [{attribute,{561,2},spec,{{binary_to_term,2},[{type,{561,21},bounded_fun,[{type,{561,21},'fun',[{type,{561,21},product,[{var,{561,22},'Binary'},{var,{561,30},'Opts'}]},{type,{561,39},union,[{type,{561,39},term,[]},{type,{561,48},tuple,[{type,{561,49},term,[]},{var,{561,57},'Used'}]}]}]},[{type,{562,7},constraint,[{atom,{562,7},is_subtype},[{var,{562,7},'Binary'},{user_type,{562,17},ext_binary,[]}]]},{type,{563,7},constraint,[{atom,{563,7},is_subtype},[{var,{563,7},'Opt'},{type,{563,14},union,[{atom,{563,14},safe},{atom,{563,21},used}]}]]},{type,{564,7},constraint,[{atom,{564,7},is_subtype},[{var,{564,7},'Opts'},{type,{564,15},list,[{var,{564,16},'Opt'}]}]]},{type,{565,7},constraint,[{atom,{565,7},is_subtype},[{var,{565,7},'Used'},{type,{565,15},pos_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,bit_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,571}],[<<98,105,116,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,105,116,115,32,111,102,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,98,105,116,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,49,57,10,62,32,98,105,116,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,50,52>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,51,50>>,signature => [{attribute,{571,2},spec,{{bit_size,1},[{type,{571,15},bounded_fun,[{type,{571,15},'fun',[{type,{571,15},product,[{var,{571,16},'Bitstring'}]},{type,{571,30},non_neg_integer,[]}]},[{type,{572,7},constraint,[{atom,{572,7},is_subtype},[{var,{572,7},'Bitstring'},{type,{572,20},bitstring,[]}]]}]]}]}}]}},{{function,bitstring_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,577}],[<<98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,121,116,101,115,32,111,102,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,116,104,101,32,98,105,110,97,114,121,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,108,105,115,116,32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,49,45,55,32,98,105,116,115,46,32,69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,62,62,41,46,10,91,49,44,49,55,55,93>>]}]},{pre,[],[{code,[],[<<62,32,98,105,116,115,116,114,105,110,103,95,116,111,95,108,105,115,116,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,91,49,44,49,55,55,44,60,60,51,58,51,62,62,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,52,55>>,signature => [{attribute,{577,2},spec,{{bitstring_to_list,1},[{type,{577,24},bounded_fun,[{type,{577,24},'fun',[{type,{577,24},product,[{var,{577,25},'Bitstring'}]},{type,{577,39},list,[{type,{577,40},union,[{type,{577,40},byte,[]},{type,{577,49},bitstring,[]}]}]}]},[{type,{578,7},constraint,[{atom,{578,7},is_subtype},[{var,{578,7},'Bitstring'},{type,{578,20},bitstring,[]}]]}]]}]}}]}},{{function,bump_reductions,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,583}],[<<98,117,109,112,95,114,101,100,117,99,116,105,111,110,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,105,115,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,99,114,101,109,101,110,116,115,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,73,110,32,116,104,101,32,66,101,97,109,32,101,109,117,108,97,116,111,114,44,32,116,104,101,32,114,101,100,117,99,116,105,111,110,32,99,111,117,110,116,101,114,32,105,115,32,110,111,114,109,97,108,108,121,32,105,110,99,114,101,109,101,110,116,101,100,32,98,121,32,111,110,101,32,102,111,114,32,101,97,99,104,32,102,117,110,99,116,105,111,110,32,97,110,100,32,66,73,70,32,99,97,108,108,46,32,65,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,32,105,115,32,102,111,114,99,101,100,32,119,104,101,110,32,116,104,101,32,99,111,117,110,116,101,114,32,114,101,97,99,104,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,40,52,48,48,48,32,114,101,100,117,99,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,49,57,46,50,32,97,110,100,32,108,97,116,101,114,41,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,99,97,110,32,98,101,32,114,101,109,111,118,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,66,101,97,109,32,109,97,99,104,105,110,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,119,97,114,110,105,110,103,46,32,73,116,32,105,115,32,117,110,108,105,107,101,108,121,32,116,111,32,98,101,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,111,116,104,101,114,32,69,114,108,97,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,54,52>>,signature => [{attribute,{583,2},spec,{{erlang,bump_reductions,1},[{type,{583,29},bounded_fun,[{type,{583,29},'fun',[{type,{583,29},product,[{var,{583,30},'Reductions'}]},{atom,{583,45},true}]},[{type,{584,7},constraint,[{atom,{584,7},is_subtype},[{var,{584,7},'Reductions'},{type,{584,21},pos_integer,[]}]]}]]}]}}]}},{{function,byte_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,590}],[<<98,121,116,101,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,110,101,101,100,101,100,32,116,111,32,99,111,110,116,97,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<46,32,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103>>]},<<32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,32,114,111,117,110,100,101,100,32>>,{em,[],[<<117,112>>]},<<46,32,69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,98,121,116,101,95,115,105,122,101,40,60,60,52,51,51,58,49,54,44,51,58,51,62,62,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,60,60,49,44,50,44,51,62,62,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,56,50>>,signature => [{attribute,{590,2},spec,{{byte_size,1},[{type,{590,16},bounded_fun,[{type,{590,16},'fun',[{type,{590,16},product,[{var,{590,17},'Bitstring'}]},{type,{590,31},non_neg_integer,[]}]},[{type,{591,7},constraint,[{atom,{591,7},is_subtype},[{var,{591,7},'Bitstring'},{type,{591,20},bitstring,[]}]]}]]}]}}]}},{{function,cancel_timer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,602}],[<<99,97,110,99,101,108,95,116,105,109,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<67,97,110,99,101,108,115,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,57,57>>,signature => [{attribute,{602,2},spec,{{erlang,cancel_timer,1},[{type,{602,26},bounded_fun,[{type,{602,26},'fun',[{type,{602,26},product,[{var,{602,27},'TimerRef'}]},{var,{602,40},'Result'}]},[{type,{603,7},constraint,[{atom,{603,7},is_subtype},[{var,{603,7},'TimerRef'},{type,{603,19},reference,[]}]]},{type,{604,7},constraint,[{atom,{604,7},is_subtype},[{var,{604,7},'Time'},{type,{604,15},non_neg_integer,[]}]]},{type,{605,7},constraint,[{atom,{605,7},is_subtype},[{var,{605,7},'Result'},{type,{605,17},union,[{var,{605,17},'Time'},{atom,{605,24},false}]}]]}]]}]}}]}},{{function,cancel_timer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,611}],[<<99,97,110,99,101,108,95,116,105,109,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<67,97,110,99,101,108,115,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114>>]}]},<<46,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,119,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,65,115,121,110,99,125>>]}]},{dd,[],[{p,[],[<<65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,99,97,110,99,101,108,32,111,112,101,114,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,84,104,97,116,32,105,115,44,32>>,{code,[],[<<99,97,110,99,101,108,95,116,105,109,101,114,40,41>>]},<<32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,99,97,110,99,101,108,108,97,116,105,111,110,32,116,111,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,105,110,102,111,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<82,101,113,117,101,115,116,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,111,102,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,103,105,118,101,110,46,32,87,104,101,110,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,105,115,32,103,105,118,101,110,46>>]},{ul,[],[{li,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<58,32,105,102,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41>>]},<<46,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<111,107>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{li,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<58,32,105,102,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,99,97,110,99,101,108,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,40,41>>]},<<32,119,104,101,110,32,116,104,101,32,99,97,110,99,101,108,108,97,116,105,111,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,44,32,111,116,104,101,114,119,105,115,101,32,110,111,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46>>]}]}]}]}]},{p,[],[<<77,111,114,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,109,97,121,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,32,99,97,110,99,101,108,101,100,32,116,105,109,101,114,32,119,111,117,108,100,32,104,97,118,101,32,101,120,112,105,114,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,32,84,104,105,115,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,97,108,114,101,97,100,121,32,104,97,100,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,110,101,118,101,114,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,105,116,32,100,111,101,115,32,110,111,116,32,116,101,108,108,32,121,111,117,32,105,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,32,111,116,104,101,114,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,111,114,32,105,115,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,116,114,117,101,125>>]},<<46,32,73,102,32,117,115,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,102,97,108,115,101,125>>]},<<44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,98,108,111,99,107,115,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,97,100,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,48,57>>,signature => [{attribute,{611,2},spec,{{erlang,cancel_timer,2},[{type,{611,26},bounded_fun,[{type,{611,26},'fun',[{type,{611,26},product,[{var,{611,27},'TimerRef'},{var,{611,37},'Options'}]},{type,{611,49},union,[{var,{611,49},'Result'},{atom,{611,58},ok}]}]},[{type,{612,7},constraint,[{atom,{612,7},is_subtype},[{var,{612,7},'TimerRef'},{type,{612,19},reference,[]}]]},{type,{613,7},constraint,[{atom,{613,7},is_subtype},[{var,{613,7},'Async'},{type,{613,16},boolean,[]}]]},{type,{614,7},constraint,[{atom,{614,7},is_subtype},[{var,{614,7},'Info'},{type,{614,15},boolean,[]}]]},{type,{615,7},constraint,[{atom,{615,7},is_subtype},[{var,{615,7},'Option'},{type,{615,17},union,[{type,{615,17},tuple,[{atom,{615,18},async},{var,{615,25},'Async'}]},{type,{615,34},tuple,[{atom,{615,35},info},{var,{615,41},'Info'}]}]}]]},{type,{616,7},constraint,[{atom,{616,7},is_subtype},[{var,{616,7},'Options'},{type,{616,18},list,[{var,{616,19},'Option'}]}]]},{type,{617,7},constraint,[{atom,{617,7},is_subtype},[{var,{617,7},'Time'},{type,{617,15},non_neg_integer,[]}]]},{type,{618,7},constraint,[{atom,{618,7},is_subtype},[{var,{618,7},'Result'},{type,{618,17},union,[{var,{618,17},'Time'},{atom,{618,24},false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,ceil,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,625}],[<<99,101,105,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,99,101,105,108,40,53,46,53,41,46,10,54>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,57,49>>,signature => [{attribute,{625,2},spec,{{ceil,1},[{type,{625,11},bounded_fun,[{type,{625,11},'fun',[{type,{625,11},product,[{var,{625,12},'Number'}]},{type,{625,23},integer,[]}]},[{type,{626,7},constraint,[{atom,{626,7},is_subtype},[{var,{626,7},'Number'},{type,{626,17},number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,check_old_code,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,631}],[<<99,104,101,99,107,95,111,108,100,95,99,111,100,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,104,97,115,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,99,111,100,101,95,108,111,97,100,105,110,103,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<111,108,100,32,99,111,100,101>>]},<<44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,48,52>>,signature => [{attribute,{631,2},spec,{{check_old_code,1},[{type,{631,21},bounded_fun,[{type,{631,21},'fun',[{type,{631,21},product,[{var,{631,22},'Module'}]},{type,{631,33},boolean,[]}]},[{type,{632,7},constraint,[{atom,{632,7},is_subtype},[{var,{632,7},'Module'},{type,{632,17},module,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,check_process_code,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,637}],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,40,80,105,100,44,32,77,111,100,117,108,101,44,32,91,93,41>>]},<<32>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,49,53>>,signature => [{attribute,{637,2},spec,{{check_process_code,2},[{type,{637,25},bounded_fun,[{type,{637,25},'fun',[{type,{637,25},product,[{var,{637,26},'Pid'},{var,{637,31},'Module'}]},{var,{637,42},'CheckResult'}]},[{type,{638,7},constraint,[{atom,{638,7},is_subtype},[{var,{638,7},'Pid'},{type,{638,14},pid,[]}]]},{type,{639,7},constraint,[{atom,{639,7},is_subtype},[{var,{639,7},'Module'},{type,{639,17},module,[]}]]},{type,{640,7},constraint,[{atom,{640,7},is_subtype},[{var,{640,7},'CheckResult'},{type,{640,22},boolean,[]}]]}]]}]}}]}},{{function,check_process_code,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,649}],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,104,101,99,107,115,32,105,102,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,98,111,111,108,101,97,110,40,41,125>>]}]},{dd,[],[{p,[],[<<68,101,116,101,114,109,105,110,101,115,32,105,102,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,108,108,111,119,101,100,32,119,104,101,110,32,112,101,114,102,111,114,109,105,110,103,32,116,104,101,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32>>,{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125>>]},<<32,105,115,32,112,97,115,115,101,100,44,32,97,110,100,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,110,101,101,100,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,97,98,111,114,116,101,100,32,40,115,101,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32>>,{code,[],[<<67,104,101,99,107,82,101,115,117,108,116>>]},<<32,98,101,108,111,119,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,111,32,97,108,108,111,119,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,116,104,97,116,32,105,115,44,32>>,{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,116,114,117,101,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,51>>]},<<32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,44,32,82,101,113,117,101,115,116,73,100,44,32,67,104,101,99,107,82,101,115,117,108,116,125>>]},<<46>>]}]}]},{p,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<115,101,108,102,40,41>>]},<<44,32,97,110,100,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,97,110,100,32,105,115,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32>>,{code,[],[<<67,104,101,99,107,82,101,115,117,108,116>>]},<<32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<67,104,101,99,107,82,101,115,117,108,116>>]},<<32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,99,111,110,116,97,105,110,115,32,102,117,110,115,32,116,104,97,116,32,114,101,102,101,114,101,110,99,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<97,98,111,114,116,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,97,98,111,114,116,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,101,101,100,101,100,32,116,111,32,98,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,114,101,113,117,101,115,116,101,100,32,98,121,32,112,97,115,115,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,108,108,111,119,95,103,99,44,32,102,97,108,115,101,125>>]},<<46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<85,112,32,117,110,116,105,108,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,42,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,99,104,101,99,107,115,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,111,108,100,32,99,111,100,101,46,32,84,104,97,116,32,105,115,44,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40,101,46,103,46,32,114,101,116,117,114,110,32,97,100,100,114,101,115,115,101,115,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,41,44,32,105,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,40>>,{code,[],[<<102,117,110>>]},<<115,32,105,110,32,112,114,111,99,101,115,115,32,99,111,110,116,101,120,116,41,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,108,105,116,101,114,97,108,115,32,105,110,32,116,104,101,32,99,111,100,101,46>>]},{p,[],[<<65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,99,104,101,99,107,32,112,114,111,99,101,115,115,32,99,111,100,101,32,111,112,101,114,97,116,105,111,110,32,111,110,108,121,32,99,104,101,99,107,115,32,102,111,114,32,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,99,111,100,101,46,32,73,110,100,105,114,101,99,116,32,114,101,102,101,114,101,110,99,101,115,32,118,105,97,32>>,{code,[],[<<102,117,110>>]},<<115,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,46,32,73,102,32,115,117,99,104,32>>,{code,[],[<<102,117,110>>]},<<115,32,101,120,105,115,116,32,97,110,100,32,97,114,101,32,117,115,101,100,32,97,102,116,101,114,32,97,32,112,117,114,103,101,32,111,102,32,116,104,101,32,111,108,100,32,99,111,100,101,44,32,97,110,32,101,120,99,101,112,116,105,111,110,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,112,111,110,32,117,115,97,103,101,32,40,115,97,109,101,32,97,115,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32>>,{code,[],[<<102,117,110>>]},<<32,105,115,32,114,101,99,101,105,118,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,97,102,116,101,114,32,116,104,101,32,112,117,114,103,101,41,46,32,76,105,116,101,114,97,108,115,32,119,105,108,108,32,98,101,32,116,97,107,101,110,32,99,97,114,101,32,111,102,32,40,99,111,112,105,101,100,41,32,97,116,32,97,32,108,97,116,101,114,32,115,116,97,103,101,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,99,97,110,32,97,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,56,46,49,32,98,101,32,101,110,97,98,108,101,100,32,119,104,101,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,105,110,115,116,97,108,108,97,116,105,111,110,95,103,117,105,100,101,58,73,78,83,84,65,76,76,35,65,100,118,97,110,99,101,100,45,99,111,110,102,105,103,117,114,97,116,105,111,110,45,97,110,100,45,98,117,105,108,100,45,111,102,45,69,114,108,97,110,103,79,84,80,95,67,111,110,102,105,103,117,114,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<98,117,105,108,100,105,110,103,32,79,84,80>>]},<<44,32,97,110,100,32,119,105,108,108,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,98,101,32,101,110,97,98,108,101,100,32,105,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,32,115,117,112,112,111,114,116,32,105,115,32,101,110,97,98,108,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,50,54>>,signature => [{attribute,{649,2},spec,{{check_process_code,3},[{type,{649,25},bounded_fun,[{type,{649,25},'fun',[{type,{649,25},product,[{var,{649,26},'Pid'},{var,{649,31},'Module'},{var,{649,39},'OptionList'}]},{type,{649,54},union,[{var,{649,54},'CheckResult'},{atom,{649,68},async}]}]},[{type,{650,7},constraint,[{atom,{650,7},is_subtype},[{var,{650,7},'Pid'},{type,{650,14},pid,[]}]]},{type,{651,7},constraint,[{atom,{651,7},is_subtype},[{var,{651,7},'Module'},{type,{651,17},module,[]}]]},{type,{652,7},constraint,[{atom,{652,7},is_subtype},[{var,{652,7},'RequestId'},{type,{652,20},term,[]}]]},{type,{653,7},constraint,[{atom,{653,7},is_subtype},[{var,{653,7},'Option'},{type,{653,17},union,[{type,{653,17},tuple,[{atom,{653,18},async},{var,{653,25},'RequestId'}]},{type,{653,38},tuple,[{atom,{653,39},allow_gc},{type,{653,49},boolean,[]}]}]}]]},{type,{654,7},constraint,[{atom,{654,7},is_subtype},[{var,{654,7},'OptionList'},{type,{654,21},list,[{var,{654,22},'Option'}]}]]},{type,{655,7},constraint,[{atom,{655,7},is_subtype},[{var,{655,7},'CheckResult'},{type,{655,22},union,[{type,{655,22},boolean,[]},{atom,{655,34},aborted}]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,convert_time_unit,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1619}],[<<99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32>>,{code,[],[<<70,114,111,109,85,110,105,116>>]},<<32,116,111,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<67,111,110,118,101,114,116,101,100,84,105,109,101>>]},<<32,118,97,108,117,101,32,111,102,32,116,105,109,101,32,117,110,105,116,32>>,{code,[],[<<84,111,85,110,105,116>>]},<<46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,117,115,105,110,103,32,116,104,101,32,102,108,111,111,114,32,102,117,110,99,116,105,111,110,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<89,111,117,32,99,97,110,32,108,111,115,101,32,97,99,99,117,114,97,99,121,32,97,110,100,32,112,114,101,99,105,115,105,111,110,32,119,104,101,110,32,99,111,110,118,101,114,116,105,110,103,32,98,101,116,119,101,101,110,32,116,105,109,101,32,117,110,105,116,115,46,32,84,111,32,109,105,110,105,109,105,122,101,32,115,117,99,104,32,108,111,115,115,44,32,99,111,108,108,101,99,116,32,97,108,108,32,100,97,116,97,32,97,116,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,100,111,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,111,110,32,116,104,101,32,101,110,100,32,114,101,115,117,108,116,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,50,57>>,signature => [{attribute,{1619,2},spec,{{erlang,convert_time_unit,3},[{type,{1619,31},bounded_fun,[{type,{1619,31},'fun',[{type,{1619,31},product,[{var,{1619,32},'Time'},{var,{1619,38},'FromUnit'},{var,{1619,48},'ToUnit'}]},{var,{1619,59},'ConvertedTime'}]},[{type,{1620,7},constraint,[{atom,{1620,7},is_subtype},[{var,{1620,7},'Time'},{type,{1620,15},integer,[]}]]},{type,{1621,7},constraint,[{atom,{1621,7},is_subtype},[{var,{1621,7},'ConvertedTime'},{type,{1621,24},integer,[]}]]},{type,{1622,7},constraint,[{atom,{1622,7},is_subtype},[{var,{1622,7},'FromUnit'},{user_type,{1622,19},time_unit,[]}]]},{type,{1623,7},constraint,[{atom,{1623,7},is_subtype},[{var,{1623,7},'ToUnit'},{user_type,{1623,17},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,crc32,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,667}],[<<99,114,99,51,50,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,117,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,114,99,51,50,32,40,73,69,69,69,32,56,48,50,46,51,32,115,116,121,108,101,41,32,99,104,101,99,107,115,117,109,32,102,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,52,55>>,signature => [{attribute,{667,2},spec,{{erlang,crc32,1},[{type,{667,19},bounded_fun,[{type,{667,19},'fun',[{type,{667,19},product,[{var,{667,20},'Data'}]},{type,{667,29},non_neg_integer,[]}]},[{type,{668,7},constraint,[{atom,{668,7},is_subtype},[{var,{668,7},'Data'},{type,{668,15},iodata,[]}]]}]]}]}}]}},{{function,crc32,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,673}],[<<99,114,99,51,50,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,110,116,105,110,117,101,115,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,32,98,121,32,99,111,109,98,105,110,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,101,99,107,115,117,109,44,32>>,{code,[],[<<79,108,100,67,114,99>>]},<<44,32,119,105,116,104,32,116,104,101,32,99,104,101,99,107,115,117,109,32,111,102,32>>,{code,[],[<<68,97,116,97>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,88,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<89>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,91,68,97,116,97,49,44,68,97,116,97,50,93,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,53,54>>,signature => [{attribute,{673,2},spec,{{erlang,crc32,2},[{type,{673,19},bounded_fun,[{type,{673,19},'fun',[{type,{673,19},product,[{var,{673,20},'OldCrc'},{var,{673,28},'Data'}]},{type,{673,37},non_neg_integer,[]}]},[{type,{674,7},constraint,[{atom,{674,7},is_subtype},[{var,{674,7},'OldCrc'},{type,{674,17},non_neg_integer,[]}]]},{type,{675,7},constraint,[{atom,{675,7},is_subtype},[{var,{675,7},'Data'},{type,{675,15},iodata,[]}]]}]]}]}}]}},{{function,crc32_combine,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,680}],[<<99,114,99,51,50,95,99,111,109,98,105,110,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32,116,119,111,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,117,116,101,100,32,99,114,99,51,50,32,99,104,101,99,107,115,117,109,115,46,32,84,104,105,115,32,99,111,109,112,117,116,97,116,105,111,110,32,114,101,113,117,105,114,101,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32,115,101,99,111,110,100,32,99,104,101,99,107,115,117,109,32,116,111,32,98,101,32,107,110,111,119,110,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,100,101,58>>]},{pre,[],[{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,89,44,68,97,116,97,50,41,46>>]}]},{p,[],[<<97,115,115,105,103,110,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<90>>]},<<32,97,115,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,49,41,44,10,89,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,40,68,97,116,97,50,41,44,10,90,32,61,32,101,114,108,97,110,103,58,99,114,99,51,50,95,99,111,109,98,105,110,101,40,88,44,89,44,105,111,108,105,115,116,95,115,105,122,101,40,68,97,116,97,50,41,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,55,51>>,signature => [{attribute,{680,2},spec,{{erlang,crc32_combine,3},[{type,{680,27},bounded_fun,[{type,{680,27},'fun',[{type,{680,27},product,[{var,{680,28},'FirstCrc'},{var,{680,38},'SecondCrc'},{var,{680,49},'SecondSize'}]},{type,{680,64},non_neg_integer,[]}]},[{type,{681,7},constraint,[{atom,{681,7},is_subtype},[{var,{681,7},'FirstCrc'},{type,{681,19},non_neg_integer,[]}]]},{type,{682,7},constraint,[{atom,{682,7},is_subtype},[{var,{682,7},'SecondCrc'},{type,{682,20},non_neg_integer,[]}]]},{type,{683,7},constraint,[{atom,{683,7},is_subtype},[{var,{683,7},'SecondSize'},{type,{683,21},non_neg_integer,[]}]]}]]}]}}]}},{{function,date,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,688}],[<<100,97,116,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,115,32>>,{code,[],[<<123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125>>]},<<46>>]},{p,[],[<<84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,100,97,116,101,40,41,46,10,123,49,57,57,53,44,50,44,49,57,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,52,57,50>>,signature => [{attribute,{688,2},spec,{{date,0},[{type,{688,11},bounded_fun,[{type,{688,11},'fun',[{type,{688,11},product,[]},{var,{688,17},'Date'}]},[{type,{689,7},constraint,[{atom,{689,7},is_subtype},[{var,{689,7},'Date'},{remote_type,{689,15},[{atom,{689,15},calendar},{atom,{689,24},date},[]]}]]}]]}]}}]}},{{function,decode_packet,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,694}],[<<100,101,99,111,100,101,95,112,97,99,107,101,116,47,51>>],#{<<101,110>> => [{p,[],[<<68,101,99,111,100,101,115,32,116,104,101,32,98,105,110,97,114,121,32>>,{code,[],[<<66,105,110>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,112,114,111,116,111,99,111,108,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<84,121,112,101>>]},<<46,32,83,105,109,105,108,97,114,32,116,111,32,116,104,101,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,100,111,110,101,32,98,121,32,115,111,99,107,101,116,115,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<123,112,97,99,107,101,116,44,84,121,112,101,125,46>>]}]},{p,[],[<<73,102,32,97,110,32,101,110,116,105,114,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32>>,{code,[],[<<66,105,110>>]},<<44,32,105,116,32,105,115,32,114,101,116,117,114,110,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,97,115,32>>,{code,[],[<<123,111,107,44,80,97,99,107,101,116,44,82,101,115,116,125>>]},<<46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,105,110>>]},<<32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,99,107,101,116,44,32>>,{code,[],[<<123,109,111,114,101,44,76,101,110,103,116,104,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32>>,{code,[],[<<76,101,110,103,116,104>>]},<<32,105,115,32,101,105,116,104,101,114,32,116,104,101,32,101,120,112,101,99,116,101,100,32>>,{em,[],[<<116,111,116,97,108,32,115,105,122,101>>]},<<32,111,102,32,116,104,101,32,112,97,99,107,101,116,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,101,120,112,101,99,116,101,100,32,112,97,99,107,101,116,32,115,105,122,101,32,105,115,32,117,110,107,110,111,119,110,46,32>>,{code,[],[<<100,101,99,111,100,101,95,112,97,99,107,101,116>>]},<<32,99,97,110,32,116,104,101,110,32,98,101,32,99,97,108,108,101,100,32,97,103,97,105,110,32,119,105,116,104,32,109,111,114,101,32,100,97,116,97,32,97,100,100,101,100,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,97,99,107,101,116,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,112,114,111,116,111,99,111,108,32,102,111,114,109,97,116,44,32>>,{code,[],[<<123,101,114,114,111,114,44,82,101,97,115,111,110,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<84,121,112,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<114,97,119,32,124,32,48>>]}]},{dd,[],[{p,[],[<<78,111,32,112,97,99,107,101,116,32,104,97,110,100,108,105,110,103,32,105,115,32,100,111,110,101,46,32,84,104,101,32,101,110,116,105,114,101,32,98,105,110,97,114,121,32,105,115,32,114,101,116,117,114,110,101,100,32,117,110,108,101,115,115,32,105,116,32,105,115,32,101,109,112,116,121,46>>]}]},{dt,[],[{code,[],[<<49,32,124,32,50,32,124,32,52>>]}]},{dd,[],[{p,[],[<<80,97,99,107,101,116,115,32,99,111,110,115,105,115,116,32,111,102,32,97,32,104,101,97,100,101,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,110,32,116,104,101,32,112,97,99,107,101,116,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,97,116,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46,32,84,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,104,101,97,100,101,114,32,99,97,110,32,98,101,32,111,110,101,44,32,116,119,111,44,32,111,114,32,102,111,117,114,32,98,121,116,101,115,59,32,116,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,98,121,116,101,115,32,105,115,32,98,105,103,45,101,110,100,105,97,110,46,32,84,104,101,32,104,101,97,100,101,114,32,105,115,32,115,116,114,105,112,112,101,100,32,111,102,102,32,119,104,101,110,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{code,[],[<<108,105,110,101>>]}]},{dd,[],[{p,[],[<<65,32,112,97,99,107,101,116,32,105,115,32,97,32,108,105,110,101,45,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,44,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,32,108,97,116,105,110,45,49,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,100,101,108,105,109,105,116,101,114,32,98,121,116,101,32,105,115,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,112,97,99,107,101,116,32,117,110,108,101,115,115,32,116,104,101,32,108,105,110,101,32,119,97,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,111,112,116,105,111,110,32>>,{code,[],[<<108,105,110,101,95,108,101,110,103,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<97,115,110,49,32,124,32,99,100,114,32,124,32,115,117,110,114,109,32,124,32,102,99,103,105,32,124,32,116,112,107,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,104,101,97,100,101,114,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,115,116,114,105,112,112,101,100,32,111,102,102,46>>]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,115,110,49>>]},<<32,45,32,65,83,78,46,49,32,66,69,82>>]},{dd,[],[]},{dt,[],[{code,[],[<<115,117,110,114,109>>]},<<32,45,32,83,117,110,39,115,32,82,80,67,32,101,110,99,111,100,105,110,103>>]},{dd,[],[]},{dt,[],[{code,[],[<<99,100,114>>]},<<32,45,32,67,79,82,66,65,32,40,71,73,79,80,32,49,46,49,41>>]},{dd,[],[]},{dt,[],[{code,[],[<<102,99,103,105>>]},<<32,45,32,70,97,115,116,32,67,71,73>>]},{dd,[],[]},{dt,[],[{code,[],[<<116,112,107,116>>]},<<32,45,32,84,80,75,84,32,102,111,114,109,97,116,32,91,82,70,67,49,48,48,54,93>>]},{dd,[],[]}]}]},{dt,[],[{code,[],[<<104,116,116,112,32,124,32,104,116,116,112,104,32,124,32,104,116,116,112,95,98,105,110,32,124,32,104,116,116,112,104,95,98,105,110>>]}]},{dd,[],[{p,[],[<<84,104,101,32,72,121,112,101,114,116,101,120,116,32,84,114,97,110,115,102,101,114,32,80,114,111,116,111,99,111,108,46,32,84,104,101,32,112,97,99,107,101,116,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,119,105,116,104,32,116,104,101,32,102,111,114,109,97,116,32,97,99,99,111,114,100,105,110,103,32,116,111,32>>,{code,[],[<<72,116,116,112,80,97,99,107,101,116>>]},<<32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46,32,65,32,112,97,99,107,101,116,32,105,115,32,101,105,116,104,101,114,32,97,32,114,101,113,117,101,115,116,44,32,97,32,114,101,115,112,111,110,115,101,44,32,97,32,104,101,97,100,101,114,44,32,111,114,32,97,110,32,101,110,100,32,111,102,32,104,101,97,100,101,114,32,109,97,114,107,46,32,73,110,118,97,108,105,100,32,108,105,110,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32>>,{code,[],[<<72,116,116,112,69,114,114,111,114>>]},<<46>>]},{p,[],[<<82,101,99,111,103,110,105,122,101,100,32,114,101,113,117,101,115,116,32,109,101,116,104,111,100,115,32,97,110,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,97,116,111,109,115,46,32,79,116,104,101,114,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,115,116,114,105,110,103,115,46,32,83,116,114,105,110,103,115,32,111,102,32,117,110,114,101,99,111,103,110,105,122,101,100,32,104,101,97,100,101,114,32,102,105,101,108,100,115,32,97,114,101,32,102,111,114,109,97,116,116,101,100,32,119,105,116,104,32,111,110,108,121,32,99,97,112,105,116,97,108,32,108,101,116,116,101,114,115,32,102,105,114,115,116,32,97,110,100,32,97,102,116,101,114,32,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<34,83,101,99,45,87,101,98,115,111,99,107,101,116,45,75,101,121,34>>]},<<46,32,72,101,97,100,101,114,32,102,105,101,108,100,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,32,114,101,116,117,114,110,101,100,32,105,110,32>>,{code,[],[<<85,110,109,111,100,105,102,105,101,100,70,105,101,108,100>>]},<<32,97,115,32,115,116,114,105,110,103,115,44,32,119,105,116,104,111,117,116,32,97,110,121,32,99,111,110,118,101,114,115,105,111,110,32,111,114,32,102,111,114,109,97,116,116,105,110,103,46>>]},{p,[],[<<84,104,101,32,112,114,111,116,111,99,111,108,32,116,121,112,101,32>>,{code,[],[<<104,116,116,112>>]},<<32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,108,105,110,101,32,119,104,101,110,32,97,110,32>>,{code,[],[<<72,116,116,112,82,101,113,117,101,115,116>>]},<<32,111,114,32,97,110,32>>,{code,[],[<<72,116,116,112,82,101,115,112,111,110,115,101>>]},<<32,105,115,32,101,120,112,101,99,116,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,97,114,101,32,116,111,32,117,115,101,32>>,{code,[],[<<104,116,116,112,104>>]},<<32,116,111,32,103,101,116,32>>,{code,[],[<<72,116,116,112,72,101,97,100,101,114>>]},<<115,32,117,110,116,105,108,32>>,{code,[],[<<104,116,116,112,95,101,111,104>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,105,99,104,32,109,97,114,107,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,104,101,97,100,101,114,115,32,97,110,100,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,109,101,115,115,97,103,101,32,98,111,100,121,46>>]},{p,[],[<<84,104,101,32,118,97,114,105,97,110,116,115,32>>,{code,[],[<<104,116,116,112,95,98,105,110>>]},<<32,97,110,100,32>>,{code,[],[<<104,116,116,112,104,95,98,105,110>>]},<<32,114,101,116,117,114,110,32,115,116,114,105,110,103,115,32,40>>,{code,[],[<<72,116,116,112,83,116,114,105,110,103>>]},<<41,32,97,115,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,108,105,115,116,115,46>>]}]}]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,97,99,107,101,116,95,115,105,122,101,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,115,105,122,101,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,98,111,100,121,46,32,73,102,32,116,104,101,32,112,97,99,107,101,116,32,104,101,97,100,101,114,32,105,110,100,105,99,97,116,101,115,32,116,104,97,116,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,101,32,109,97,120,105,109,117,109,32,97,108,108,111,119,101,100,32,108,101,110,103,116,104,44,32,116,104,101,32,112,97,99,107,101,116,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,105,110,118,97,108,105,100,46,32,68,101,102,97,117,108,116,115,32,116,111,32,48,44,32,119,104,105,99,104,32,109,101,97,110,115,32,110,111,32,115,105,122,101,32,108,105,109,105,116,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,101,95,108,101,110,103,116,104,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32>>,{code,[],[<<108,105,110,101>>]},<<44,32,108,105,110,101,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,101,32,105,110,100,105,99,97,116,101,100,32,108,101,110,103,116,104,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46>>]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<108,105,110,101,95,108,101,110,103,116,104>>]},<<32,97,108,115,111,32,97,112,112,108,105,101,115,32,116,111,32>>,{code,[],[<<104,116,116,112,42>>]},<<32,112,97,99,107,101,116,32,116,121,112,101,115,32,97,115,32,97,110,32,97,108,105,97,115,32,102,111,114,32,111,112,116,105,111,110,32>>,{code,[],[<<112,97,99,107,101,116,95,115,105,122,101>>]},<<32,105,102,32>>,{code,[],[<<112,97,99,107,101,116,95,115,105,122,101>>]},<<32,105,116,115,101,108,102,32,105,115,32,110,111,116,32,115,101,116,46,32,84,104,105,115,32,117,115,101,32,105,115,32,111,110,108,121,32,105,110,116,101,110,100,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,101,95,100,101,108,105,109,105,116,101,114,44,32,48,32,61,60,32,98,121,116,101,40,41,32,61,60,32,50,53,53,125>>]}]},{dd,[],[{p,[],[<<70,111,114,32,112,97,99,107,101,116,32,116,121,112,101,32>>,{code,[],[<<108,105,110,101>>]},<<44,32,115,101,116,115,32,116,104,101,32,100,101,108,105,109,105,116,105,110,103,32,98,121,116,101,46,32,68,101,102,97,117,108,116,32,105,115,32,116,104,101,32,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32>>,{code,[],[<<36,92,110>>]},<<46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,51,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,111,107,44,60,60,34,97,98,99,34,62,62,44,60,60,34,100,34,62,62,125,10,62,32,101,114,108,97,110,103,58,100,101,99,111,100,101,95,112,97,99,107,101,116,40,49,44,60,60,53,44,34,97,98,99,100,34,62,62,44,91,93,41,46,10,123,109,111,114,101,44,54,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,53,48,55>>,signature => [{attribute,{694,2},spec,{{erlang,decode_packet,3},[{type,{694,27},bounded_fun,[{type,{694,27},'fun',[{type,{694,27},product,[{var,{694,28},'Type'},{var,{694,34},'Bin'},{var,{694,39},'Options'}]},{type,{695,35},union,[{type,{695,35},tuple,[{atom,{695,36},ok},{var,{695,40},'Packet'},{var,{695,48},'Rest'}]},{type,{696,35},tuple,[{atom,{696,36},more},{var,{696,42},'Length'}]},{type,{697,35},tuple,[{atom,{697,36},error},{var,{697,43},'Reason'}]}]}]},[{type,{698,7},constraint,[{atom,{698,7},is_subtype},[{var,{698,7},'Type'},{type,{698,15},union,[{atom,{698,15},raw},{integer,{698,23},0},{integer,{698,27},1},{integer,{698,31},2},{integer,{698,35},4},{atom,{698,39},asn1},{atom,{698,48},cdr},{atom,{698,56},sunrm},{atom,{698,66},fcgi},{atom,{699,15},tpkt},{atom,{699,24},line},{atom,{699,33},http},{atom,{699,42},http_bin},{atom,{699,55},httph},{atom,{699,65},httph_bin}]}]]},{type,{700,7},constraint,[{atom,{700,7},is_subtype},[{var,{700,7},'Bin'},{type,{700,14},binary,[]}]]},{type,{701,7},constraint,[{atom,{701,7},is_subtype},[{var,{701,7},'Options'},{type,{701,18},list,[{var,{701,19},'Opt'}]}]]},{type,{702,7},constraint,[{atom,{702,7},is_subtype},[{var,{702,7},'Opt'},{type,{702,14},union,[{type,{702,14},tuple,[{atom,{702,15},packet_size},{type,{702,28},non_neg_integer,[]}]},{type,{703,14},tuple,[{atom,{703,15},line_length},{type,{703,28},non_neg_integer,[]}]}]}]]},{type,{704,7},constraint,[{atom,{704,7},is_subtype},[{var,{704,7},'Packet'},{type,{704,17},union,[{type,{704,17},binary,[]},{var,{704,28},'HttpPacket'}]}]]},{type,{705,7},constraint,[{atom,{705,7},is_subtype},[{var,{705,7},'Rest'},{type,{705,15},binary,[]}]]},{type,{706,7},constraint,[{atom,{706,7},is_subtype},[{var,{706,7},'Length'},{type,{706,17},union,[{type,{706,17},non_neg_integer,[]},{atom,{706,37},undefined}]}]]},{type,{707,7},constraint,[{atom,{707,7},is_subtype},[{var,{707,7},'Reason'},{type,{707,17},term,[]}]]},{type,{708,7},constraint,[{atom,{708,7},is_subtype},[{var,{708,7},'HttpPacket'},{type,{708,21},union,[{var,{708,21},'HttpRequest'},{var,{709,21},'HttpResponse'},{var,{710,21},'HttpHeader'},{atom,{711,21},http_eoh},{var,{712,21},'HttpError'}]}]]},{type,{713,7},constraint,[{atom,{713,7},is_subtype},[{var,{713,7},'HttpRequest'},{type,{713,22},tuple,[{atom,{713,23},http_request},{var,{713,39},'HttpMethod'},{var,{713,51},'HttpUri'},{var,{713,60},'HttpVersion'}]}]]},{type,{714,7},constraint,[{atom,{714,7},is_subtype},[{var,{714,7},'HttpResponse'},{type,{714,23},tuple,[{atom,{714,24},http_response},{var,{714,41},'HttpVersion'},{type,{714,54},integer,[]},{var,{714,65},'HttpString'}]}]]},{type,{715,7},constraint,[{atom,{715,7},is_subtype},[{var,{715,7},'HttpHeader'},{type,{715,21},tuple,[{atom,{715,22},http_header},{type,{716,22},integer,[]},{var,{717,22},'HttpField'},{ann_type,{718,22},[{var,{718,22},'UnmodifiedField'},{var,{718,41},'HttpString'}]},{ann_type,{719,22},[{var,{719,22},'Value'},{var,{719,31},'HttpString'}]}]}]]},{type,{720,7},constraint,[{atom,{720,7},is_subtype},[{var,{720,7},'HttpError'},{type,{720,20},tuple,[{atom,{720,21},http_error},{var,{720,35},'HttpString'}]}]]},{type,{721,7},constraint,[{atom,{721,7},is_subtype},[{var,{721,7},'HttpMethod'},{type,{721,21},union,[{atom,{721,21},'OPTIONS'},{atom,{721,33},'GET'},{atom,{721,41},'HEAD'},{atom,{721,50},'POST'},{atom,{721,59},'PUT'},{atom,{721,67},'DELETE'},{atom,{722,21},'TRACE'},{var,{722,31},'HttpString'}]}]]},{type,{723,7},constraint,[{atom,{723,7},is_subtype},[{var,{723,7},'HttpUri'},{type,{723,18},union,[{atom,{723,18},'*'},{type,{724,18},tuple,[{atom,{724,20},absoluteURI},{type,{725,20},union,[{atom,{725,20},http},{atom,{725,29},https}]},{ann_type,{726,20},[{var,{726,20},'Host'},{var,{726,28},'HttpString'}]},{ann_type,{727,20},[{var,{727,20},'Port'},{type,{727,28},union,[{remote_type,{727,28},[{atom,{727,28},inet},{atom,{727,33},port_number},[]]},{atom,{727,49},undefined}]}]},{ann_type,{728,20},[{var,{728,20},'Path'},{var,{728,28},'HttpString'}]}]},{type,{729,18},tuple,[{atom,{729,19},scheme},{ann_type,{729,29},[{var,{729,29},'Scheme'},{var,{729,39},'HttpString'}]},{var,{729,51},'HttpString'}]},{type,{730,18},tuple,[{atom,{730,19},abs_path},{var,{730,31},'HttpString'}]},{var,{731,18},'HttpString'}]}]]},{type,{732,7},constraint,[{atom,{732,7},is_subtype},[{var,{732,7},'HttpVersion'},{type,{732,22},tuple,[{ann_type,{732,23},[{var,{732,23},'Major'},{type,{732,32},non_neg_integer,[]}]},{ann_type,{732,51},[{var,{732,51},'Minor'},{type,{732,60},non_neg_integer,[]}]}]}]]},{type,{733,7},constraint,[{atom,{733,7},is_subtype},[{var,{733,7},'HttpField'},{type,{733,20},union,[{atom,{733,20},'Cache-Control'},{atom,{734,20},'Connection'},{atom,{735,20},'Date'},{atom,{736,20},'Pragma'},{atom,{737,20},'Transfer-Encoding'},{atom,{738,20},'Upgrade'},{atom,{739,20},'Via'},{atom,{740,20},'Accept'},{atom,{741,20},'Accept-Charset'},{atom,{742,20},'Accept-Encoding'},{atom,{743,20},'Accept-Language'},{atom,{744,20},'Authorization'},{atom,{745,20},'From'},{atom,{746,20},'Host'},{atom,{747,20},'If-Modified-Since'},{atom,{748,20},'If-Match'},{atom,{749,20},'If-None-Match'},{atom,{750,20},'If-Range'},{atom,{751,20},'If-Unmodified-Since'},{atom,{752,20},'Max-Forwards'},{atom,{753,20},'Proxy-Authorization'},{atom,{754,20},'Range'},{atom,{755,20},'Referer'},{atom,{756,20},'User-Agent'},{atom,{757,20},'Age'},{atom,{758,20},'Location'},{atom,{759,20},'Proxy-Authenticate'},{atom,{760,20},'Public'},{atom,{761,20},'Retry-After'},{atom,{762,20},'Server'},{atom,{763,20},'Vary'},{atom,{764,20},'Warning'},{atom,{765,19},'Www-Authenticate'},{atom,{766,20},'Allow'},{atom,{767,20},'Content-Base'},{atom,{768,20},'Content-Encoding'},{atom,{769,20},'Content-Language'},{atom,{770,20},'Content-Length'},{atom,{771,20},'Content-Location'},{atom,{772,20},'Content-Md5'},{atom,{773,20},'Content-Range'},{atom,{774,20},'Content-Type'},{atom,{775,20},'Etag'},{atom,{776,20},'Expires'},{atom,{777,20},'Last-Modified'},{atom,{778,20},'Accept-Ranges'},{atom,{779,20},'Set-Cookie'},{atom,{780,20},'Set-Cookie2'},{atom,{781,20},'X-Forwarded-For'},{atom,{782,20},'Cookie'},{atom,{783,20},'Keep-Alive'},{atom,{784,20},'Proxy-Connection'},{var,{785,20},'HttpString'}]}]]},{type,{786,7},constraint,[{atom,{786,7},is_subtype},[{var,{786,7},'HttpString'},{type,{786,21},union,[{type,{786,21},string,[]},{type,{786,32},binary,[]}]}]]}]]}]}}]}},{{function,delete_element,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,791}],[<<100,101,108,101,116,101,95,101,108,101,109,101,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32,97,116,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,100,101,108,101,116,101,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,41,46,10,123,111,110,101,44,116,104,114,101,101,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,49,57>>,signature => [{attribute,{791,2},spec,{{erlang,delete_element,2},[{type,{791,28},bounded_fun,[{type,{791,28},'fun',[{type,{791,28},product,[{var,{791,29},'Index'},{var,{791,36},'Tuple1'}]},{var,{791,47},'Tuple2'}]},[{type,{792,7},constraint,[{atom,{792,7},is_subtype},[{var,{792,7},'Index'},{type,{792,17},pos_integer,[]}]]},{type,{793,7},constraint,[{atom,{793,7},is_subtype},[{var,{793,7},'Tuple1'},{type,{793,17},tuple,any}]]},{type,{794,7},constraint,[{atom,{794,7},is_subtype},[{var,{794,7},'Tuple2'},{type,{794,17},tuple,any}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,delete_module,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,799}],[<<100,101,108,101,116,101,95,109,111,100,117,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<77,97,107,101,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,98,101,99,111,109,101,32,111,108,100,32,99,111,100,101,32,97,110,100,32,100,101,108,101,116,101,115,32,97,108,108,32,114,101,102,101,114,101,110,99,101,115,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,102,114,111,109,32,116,104,101,32,101,120,112,111,114,116,32,116,97,98,108,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,109,111,100,117,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,114,101,32,97,108,114,101,97,100,121,32,105,115,32,97,110,32,111,108,100,32,118,101,114,115,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,51,50>>,signature => [{attribute,{799,2},spec,{{delete_module,1},[{type,{799,20},bounded_fun,[{type,{799,20},'fun',[{type,{799,20},product,[{var,{799,21},'Module'}]},{type,{799,32},union,[{atom,{799,32},true},{atom,{799,39},undefined}]}]},[{type,{800,7},constraint,[{atom,{800,7},is_subtype},[{var,{800,7},'Module'},{type,{800,17},module,[]}]]}]]}]}}]}},{{function,demonitor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,805}],[<<100,101,109,111,110,105,116,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,111,98,116,97,105,110,101,100,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,50>>]}]},<<44,32,116,104,105,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46,32,73,102,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,114,101,97,100,121,32,116,117,114,110,101,100,32,111,102,102,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46>>]},{p,[],[<<79,110,99,101,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>]},<<32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,110,111,32>>,{code,[],[<<123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,44,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,44,32,119,105,108,108,32,98,101,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46,32,72,111,119,101,118,101,114,44,32,97,32>>,{code,[],[<<123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,46,32,73,116,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,115,117,97,108,108,121,32,97,100,118,105,115,97,98,108,101,32,116,111,32,114,101,109,111,118,101,32,115,117,99,104,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,102,114,111,109,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>]},<<32,105,102,32,116,104,105,115,32,99,108,101,97,110,117,112,32,105,115,32,119,97,110,116,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,32,40,69,82,84,83,32,53,46,53,41,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,47,49>>]},<<32,98,101,104,97,118,101,100,32,99,111,109,112,108,101,116,101,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,114,101,97,99,104,101,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,84,104,105,115,32,104,97,100,32,111,110,101,32,117,110,100,101,115,105,114,97,98,108,101,32,101,102,102,101,99,116,46,32,89,111,117,32,99,111,117,108,100,32,110,101,118,101,114,32,107,110,111,119,32,119,104,101,110,32,121,111,117,32,119,101,114,101,32,103,117,97,114,97,110,116,101,101,100,32>>,{em,[],[<<110,111,116>>]},<<32,116,111,32,114,101,99,101,105,118,101,32,97,32>>,{code,[],[<<68,79,87,78>>]},<<32,109,101,115,115,97,103,101,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46>>]},{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,118,105,101,119,101,100,32,97,115,32,116,119,111,32,99,111,109,98,105,110,101,100,32,111,112,101,114,97,116,105,111,110,115,58,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,32,115,101,110,100,32,97,32,34,100,101,109,111,110,105,116,111,114,32,115,105,103,110,97,108,34,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,97,110,100,32,105,103,110,111,114,101,32,97,110,121,32,102,117,116,117,114,101,32,114,101,115,117,108,116,115,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32,73,116,32,105,115,32,97,110,32,101,114,114,111,114,32,105,102,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,109,111,110,105,116,111,114,105,110,103,32,115,116,97,114,116,101,100,32,98,121,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,32,97,108,108,32,115,117,99,104,32,99,97,115,101,115,32,97,114,101,32,99,104,101,97,112,32,116,111,32,99,104,101,99,107,46,32,73,102,32,99,104,101,99,107,105,110,103,32,105,115,32,99,104,101,97,112,44,32,116,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,32,105,102,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,105,115,32,97,32,114,101,109,111,116,101,32,114,101,102,101,114,101,110,99,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,53,48>>,signature => [{attribute,{805,2},spec,{{demonitor,1},[{type,{805,16},bounded_fun,[{type,{805,16},'fun',[{type,{805,16},product,[{var,{805,17},'MonitorRef'}]},{atom,{805,32},true}]},[{type,{806,7},constraint,[{atom,{806,7},is_subtype},[{var,{806,7},'MonitorRef'},{type,{806,21},reference,[]}]]}]]}]}}]}},{{function,demonitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,811}],[<<100,101,109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,117,110,108,101,115,115,32>>,{code,[],[<<105,110,102,111>>]},<<32,105,115,32,112,97,114,116,32,111,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<46>>]},{p,[],[{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,93,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41>>]}]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,108,117,115,104>>]}]},{dd,[],[{p,[],[<<82,101,109,111,118,101,115,32,40,111,110,101,41,32>>,{code,[],[<<123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125>>]},<<32,109,101,115,115,97,103,101,44,32,105,102,32,116,104,101,114,101,32,105,115,32,111,110,101,44,32,102,114,111,109,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,109,111,110,105,116,111,114,105,110,103,32,104,97,115,32,98,101,101,110,32,115,116,111,112,112,101,100,46>>]},{p,[],[<<67,97,108,108,105,110,103,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,44,32,91,102,108,117,115,104,93,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<100,101,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,82,101,102,41,44,10,114,101,99,101,105,118,101,10,32,32,32,32,123,95,44,32,77,111,110,105,116,111,114,82,101,102,44,32,95,44,32,95,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,101,110,100>>]}]}]},{dt,[],[{code,[],[<<105,110,102,111>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,102,111,117,110,100,32,97,110,100,32,114,101,109,111,118,101,100,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,110,111,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,97,110,100,32,119,105,108,108,32,110,111,116,32,98,101,32,100,101,108,105,118,101,114,101,100,46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32,99,111,117,108,100,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,112,114,111,98,97,98,108,121,32,98,101,99,97,117,115,101,32,115,111,109,101,111,110,101,32,97,108,114,101,97,100,121,32,104,97,115,32,112,108,97,99,101,100,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,105,115,32,109,111,110,105,116,111,114,32,105,110,32,116,104,101,32,99,97,108,108,101,114,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]}]}]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<105,110,102,111>>]},<<32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<102,108,117,115,104>>]},<<44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,97,32,102,108,117,115,104,32,119,97,115,32,110,101,101,100,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<84,104,101,32,115,97,109,101,32,102,97,105,108,117,114,101,32,97,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,47,49>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,54,57,50>>,signature => [{attribute,{811,2},spec,{{demonitor,2},[{type,{811,16},bounded_fun,[{type,{811,16},'fun',[{type,{811,16},product,[{var,{811,17},'MonitorRef'},{var,{811,29},'OptionList'}]},{type,{811,44},boolean,[]}]},[{type,{812,7},constraint,[{atom,{812,7},is_subtype},[{var,{812,7},'MonitorRef'},{type,{812,21},reference,[]}]]},{type,{813,7},constraint,[{atom,{813,7},is_subtype},[{var,{813,7},'OptionList'},{type,{813,21},list,[{var,{813,22},'Option'}]}]]},{type,{814,7},constraint,[{atom,{814,7},is_subtype},[{var,{814,7},'Option'},{type,{814,17},union,[{atom,{814,17},flush},{atom,{814,25},info}]}]]}]]}]}}]}},{{function,disconnect_node,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3449}],[<<100,105,115,99,111,110,110,101,99,116,95,110,111,100,101,47,49>>],#{<<101,110>> => [{p,[],[<<70,111,114,99,101,115,32,116,104,101,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,111,102,32,97,32,110,111,100,101,46,32,84,104,105,115,32,97,112,112,101,97,114,115,32,116,111,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<32,97,115,32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,104,97,115,32,99,114,97,115,104,101,100,46,32,84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,110,101,116,119,111,114,107,32,97,117,116,104,101,110,116,105,99,97,116,105,111,110,32,112,114,111,116,111,99,111,108,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,100,105,115,99,111,110,110,101,99,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,73,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<105,103,110,111,114,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,109,97,121,32,114,101,116,117,114,110,32,98,101,102,111,114,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,95,110,111,100,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,109,101,115,115,97,103,101,115>>]},<<32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,55,54,48>>,signature => [{attribute,{3449,2},spec,{{disconnect_node,1},[{type,{3449,22},bounded_fun,[{type,{3449,22},'fun',[{type,{3449,22},product,[{var,{3449,23},'Node'}]},{type,{3449,32},union,[{type,{3449,32},boolean,[]},{atom,{3449,44},ignored}]}]},[{type,{3450,7},constraint,[{atom,{3450,7},is_subtype},[{var,{3450,7},'Node'},{type,{3450,15},node,[]}]]}]]}]}}]}},{{function,display,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,838}],[<<100,105,115,112,108,97,121,47,49>>],#{<<101,110>> => [{p,[],[<<80,114,105,110,116,115,32,97,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,111,110,32,116,104,101,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,55,55,57>>,signature => [{attribute,{838,2},spec,{{erlang,display,1},[{type,{838,21},bounded_fun,[{type,{838,21},'fun',[{type,{838,21},product,[{var,{838,22},'Term'}]},{atom,{838,31},true}]},[{type,{839,7},constraint,[{atom,{839,7},is_subtype},[{var,{839,7},'Term'},{type,{839,15},term,[]}]]}]]}]}}]}},{{function,dist_ctrl_get_data,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3733}],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49>>],#{<<101,110>> => [{p,[],[<<71,101,116,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,115,115,101,100,32,116,111,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,46,32,84,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,73,102,32,110,111,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<110,111,110,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,101,32,99,97,110,32,114,101,113,117,101,115,116,32,116,111,32,98,101,32,105,110,102,111,114,109,101,100,32,98,121,32,97,32,109,101,115,115,97,103,101,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,40,68,72,97,110,100,108,101,41>>]}]},<<46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,119,104,101,110,32,116,104,101,114,101,32,97,114,101,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,99,111,110,102,105,103,117,114,101,100,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>]}]},<<32,102,117,110,99,116,105,111,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,55,57,49>>,signature => [{attribute,{3733,2},spec,{{erlang,dist_ctrl_get_data,1},[{type,{3733,32},bounded_fun,[{type,{3733,32},'fun',[{type,{3733,32},product,[{var,{3733,33},'DHandle'}]},{type,{3733,45},union,[{type,{3733,45},tuple,[{var,{3733,46},'Size'},{var,{3733,52},'Data'}]},{var,{3733,60},'Data'},{atom,{3733,67},none}]}]},[{type,{3734,7},constraint,[{atom,{3734,7},is_subtype},[{var,{3734,7},'Size'},{type,{3734,15},non_neg_integer,[]}]]},{type,{3735,7},constraint,[{atom,{3735,7},is_subtype},[{var,{3735,7},'DHandle'},{user_type,{3735,18},dist_handle,[]}]]},{type,{3736,7},constraint,[{atom,{3736,7},is_subtype},[{var,{3736,7},'Data'},{user_type,{3736,15},iovec,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_get_opt,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3755}],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,111,112,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>]}]},<<32,102,117,110,99,116,105,111,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,56,51,50>>,signature => [{attribute,{3755,2},spec,{{erlang,dist_ctrl_get_opt,2},[{type,{3755,31},bounded_fun,[{type,{3755,31},'fun',[{type,{3755,31},product,[{var,{3755,32},'DHandle'},{atom,{3755,41},get_size}]},{var,{3755,56},'Value'}]},[{type,{3756,7},constraint,[{atom,{3756,7},is_subtype},[{var,{3756,7},'DHandle'},{user_type,{3756,18},dist_handle,[]}]]},{type,{3757,7},constraint,[{atom,{3757,7},is_subtype},[{var,{3757,7},'Value'},{type,{3757,16},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,dist_ctrl_get_data_notification,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3741}],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,113,117,101,115,116,32,110,111,116,105,102,105,99,97,116,105,111,110,32,119,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,102,101,116,99,104,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]}]},<<32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,87,104,101,110,32,109,111,114,101,32,100,97,116,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<100,105,115,116,95,100,97,116,97>>]},<<46,32,79,110,99,101,32,97,32>>,{code,[],[<<100,105,115,116,95,100,97,116,97>>]},<<32,109,101,115,115,97,103,101,115,32,104,97,115,32,98,101,101,110,32,115,101,110,116,44,32,110,111,32,109,111,114,101,32>>,{code,[],[<<100,105,115,116,95,100,97,116,97>>]},<<32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,115,101,110,116,32,117,110,116,105,108,32,116,104,101,32>>,{code,[],[<<100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,95,110,111,116,105,102,105,99,97,116,105,111,110,47,49>>]},<<32,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,32,97,103,97,105,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,56,54,49>>,signature => [{attribute,{3741,2},spec,{{erlang,dist_ctrl_get_data_notification,1},[{type,{3741,45},bounded_fun,[{type,{3741,45},'fun',[{type,{3741,45},product,[{var,{3741,46},'DHandle'}]},{atom,{3741,58},ok}]},[{type,{3742,7},constraint,[{atom,{3742,7},is_subtype},[{var,{3742,7},'DHandle'},{user_type,{3742,18},dist_handle,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_input_handler,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3719}],[<<100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,103,105,115,116,101,114,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,79,110,99,101,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,104,97,115,32,98,101,101,110,32,99,97,108,108,101,100,44,32>>,{code,[],[<<73,110,112,117,116,72,97,110,100,108,101,114>>]},<<32,105,115,32,116,104,101,32,111,110,108,121,32,112,114,111,99,101,115,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,40,68,72,97,110,100,108,101,44,32,68,97,116,97,41>>]}]},<<32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,100,101,110,116,105,102,121,105,110,103,32,116,104,105,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,56,57,55>>,signature => [{attribute,{3719,2},spec,{{erlang,dist_ctrl_input_handler,2},[{type,{3719,37},bounded_fun,[{type,{3719,37},'fun',[{type,{3719,37},product,[{var,{3719,38},'DHandle'},{var,{3719,47},'InputHandler'}]},{atom,{3719,64},ok}]},[{type,{3720,7},constraint,[{atom,{3720,7},is_subtype},[{var,{3720,7},'DHandle'},{user_type,{3720,18},dist_handle,[]}]]},{type,{3721,7},constraint,[{atom,{3721,7},is_subtype},[{var,{3721,7},'InputHandler'},{type,{3721,23},pid,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_put_data,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3726}],[<<100,105,115,116,95,99,116,114,108,95,112,117,116,95,100,97,116,97,47,50>>],#{<<101,110>> => [{p,[],[<<68,101,108,105,118,101,114,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,100,97,116,97,32,102,114,111,109,32,97,32,114,101,109,111,116,101,32,110,111,100,101,32,116,111,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,117,110,108,101,115,115,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,105,110,112,117,116,95,104,97,110,100,108,101,114,40,68,72,97,110,100,108,101,44,32,73,110,112,117,116,72,97,110,100,108,101,114,41>>]}]},<<46,32,73,102,32,97,110,32,97,108,116,101,114,110,97,116,101,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,104,97,115,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,44,32,111,110,108,121,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,105,110,112,117,116,32,104,97,110,100,108,101,114,32,112,114,111,99,101,115,115,32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,57,51,48>>,signature => [{attribute,{3726,2},spec,{{erlang,dist_ctrl_put_data,2},[{type,{3726,32},bounded_fun,[{type,{3726,32},'fun',[{type,{3726,32},product,[{var,{3726,33},'DHandle'},{var,{3726,42},'Data'}]},{atom,{3726,51},ok}]},[{type,{3727,7},constraint,[{atom,{3727,7},is_subtype},[{var,{3727,7},'DHandle'},{user_type,{3727,18},dist_handle,[]}]]},{type,{3728,7},constraint,[{atom,{3728,7},is_subtype},[{var,{3728,7},'Data'},{type,{3728,15},iodata,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,dist_ctrl_set_opt,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3747}],[<<100,105,115,116,95,99,116,114,108,95,115,101,116,95,111,112,116,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,111,110,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<46,32,84,104,105,115,32,111,112,116,105,111,110,32,99,111,110,116,114,111,108,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,99,97,108,108,115,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,117,115,101,100,32,119,104,101,110,32,115,101,116,116,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,87,104,101,110,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,32,105,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[<<97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]},<<32,119,105,108,108,32,106,117,115,116,32,114,101,116,117,114,110,32>>,{code,[],[<<68,97,116,97>>]},<<32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,32,99,104,97,110,110,101,108,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<103,101,116,95,115,105,122,101>>]},<<32,111,112,116,105,111,110,46>>]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[<<97,110,100,32,116,104,101,114,101,32,97,114,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,44,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,100,105,115,116,95,99,116,114,108,95,103,101,116,95,100,97,116,97,40,68,72,97,110,100,108,101,41>>]},<<32,119,105,108,108,32,114,101,116,117,114,110,32>>,{code,[],[<<68,97,116,97>>]},<<32,116,111,32,112,97,115,115,32,111,118,101,114,32,116,104,101,32,99,104,97,110,110,101,108,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32>>,{code,[],[<<83,105,122,101>>]},<<32,111,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,116,117,112,108,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,83,105,122,101,44,32,68,97,116,97,125>>]},<<46>>]}]},{p,[],[<<65,108,108,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,32,116,111,32,100,101,102,97,117,108,116,32,119,104,101,110,32,97,32,99,104,97,110,110,101,108,32,105,115,32,99,108,111,115,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,103,105,115,116,101,114,101,100,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,32,102,111,114,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,99,97,108,108,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,119,104,101,110,32,105,109,112,108,101,109,101,110,116,105,110,103,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,97,114,114,105,101,114,32,117,115,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,115,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,111,110,116,114,111,108,108,101,114,115,46,32>>,{code,[],[<<68,72,97,110,100,108,101>>]},<<32,105,115,32,114,101,116,114,105,101,118,101,100,32,118,105,97,32,116,104,101,32,99,97,108,108,98,97,99,107,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,104,115,95,100,97,116,97,95,102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<102,95,104,97,110,100,115,104,97,107,101,95,99,111,109,112,108,101,116,101>>]}]},<<46,32,77,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,97,108,116,95,100,105,115,116,35,100,105,115,116,114,105,98,117,116,105,111,110,95,109,111,100,117,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,226,158,156,32,72,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,110,32,65,108,116,101,114,110,97,116,105,118,101,32,67,97,114,114,105,101,114,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,226,158,156,32,68,105,115,116,114,105,98,117,116,105,111,110,32,77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,57,54,51>>,signature => [{attribute,{3747,2},spec,{{erlang,dist_ctrl_set_opt,3},[{type,{3747,31},bounded_fun,[{type,{3747,31},'fun',[{type,{3747,31},product,[{var,{3747,32},'DHandle'},{atom,{3747,41},get_size},{var,{3747,53},'Value'}]},{var,{3747,63},'OldValue'}]},[{type,{3748,7},constraint,[{atom,{3748,7},is_subtype},[{var,{3748,7},'DHandle'},{user_type,{3748,18},dist_handle,[]}]]},{type,{3749,7},constraint,[{atom,{3749,7},is_subtype},[{var,{3749,7},'Value'},{type,{3749,16},boolean,[]}]]},{type,{3750,7},constraint,[{atom,{3750,7},is_subtype},[{var,{3750,7},'OldValue'},{type,{3750,19},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,50,50,46,48>>}},{{function,element,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2179}],[<<101,108,101,109,101,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{code,[],[<<78>>]},<<116,104,32,101,108,101,109,101,110,116,32,40,110,117,109,98,101,114,105,110,103,32,102,114,111,109,32,49,41,32,111,102,32>>,{code,[],[<<84,117,112,108,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,108,101,109,101,110,116,40,50,44,32,123,97,44,32,98,44,32,99,125,41,46,10,98>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,49,50>>,signature => [{attribute,{2179,2},spec,{{element,2},[{type,{2179,14},bounded_fun,[{type,{2179,14},'fun',[{type,{2179,14},product,[{var,{2179,15},'N'},{var,{2179,18},'Tuple'}]},{type,{2179,28},term,[]}]},[{type,{2180,5},constraint,[{atom,{2180,5},is_subtype},[{var,{2180,5},'N'},{type,{2180,10},pos_integer,[]}]]},{type,{2181,5},constraint,[{atom,{2181,5},is_subtype},[{var,{2181,5},'Tuple'},{type,{2181,14},tuple,any}]]}]]}]}}]}},{{function,erase,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,897}],[<<101,114,97,115,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,123,49,44,32,50,44,32,51,125,41,44,10,112,117,116,40,107,101,121,50,44,32,91,97,44,32,98,44,32,99,93,41,44,10,101,114,97,115,101,40,41,46,10,91,123,107,101,121,49,44,123,49,44,50,44,51,125,125,44,123,107,101,121,50,44,91,97,44,98,44,99,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,50,54>>,signature => [{attribute,{897,2},spec,{{erase,0},[{type,{897,12},bounded_fun,[{type,{897,12},'fun',[{type,{897,12},product,[]},{type,{897,18},list,[{type,{897,19},tuple,[{var,{897,20},'Key'},{var,{897,25},'Val'}]}]}]},[{type,{898,7},constraint,[{atom,{898,7},is_subtype},[{var,{898,7},'Key'},{type,{898,14},term,[]}]]},{type,{899,7},constraint,[{atom,{899,7},is_subtype},[{var,{899,7},'Val'},{type,{899,14},term,[]}]]}]]}]}}]}},{{function,erase,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,904}],[<<101,114,97,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<32,97,110,100,32,100,101,108,101,116,101,115,32,105,116,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<46,32,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,79,40>>,{code,[],[<<49>>]},<<41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40>>,{code,[],[<<78>>]},<<41,44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,123,109,101,114,114,121,44,32,108,97,109,98,115,44,32,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,88,32,61,32,101,114,97,115,101,40,107,101,121,49,41,44,10,123,88,44,32,101,114,97,115,101,40,107,101,121,49,41,125,46,10,123,123,109,101,114,114,121,44,108,97,109,98,115,44,97,114,101,44,112,108,97,121,105,110,103,125,44,117,110,100,101,102,105,110,101,100,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,52,48>>,signature => [{attribute,{904,2},spec,{{erase,1},[{type,{904,12},bounded_fun,[{type,{904,12},'fun',[{type,{904,12},product,[{var,{904,13},'Key'}]},{type,{904,21},union,[{var,{904,21},'Val'},{atom,{904,27},undefined}]}]},[{type,{905,7},constraint,[{atom,{905,7},is_subtype},[{var,{905,7},'Key'},{type,{905,14},term,[]}]]},{type,{906,7},constraint,[{atom,{906,7},is_subtype},[{var,{906,7},'Val'},{type,{906,14},term,[]}]]}]]}]}}]}},{{function,error,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,912}],[<<101,114,114,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,116,104,114,111,119,110,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46>>]},{p,[],[<<84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,32,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,99,97,116,99,104,32,101,114,114,111,114,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,123,102,111,111,98,97,114,44,91,123,115,104,101,108,108,44,97,112,112,108,121,95,102,117,110,44,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,57,48,54,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,100,111,95,97,112,112,108,121,44,54,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,55,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,108,95,101,118,97,108,44,101,120,112,114,44,53,44,91,123,102,105,108,101,44,34,101,114,108,95,101,118,97,108,46,101,114,108,34,125,44,123,108,105,110,101,44,52,51,48,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,56,55,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,101,120,112,114,115,44,55,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,52,50,125,93,125,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,115,104,101,108,108,44,101,118,97,108,95,108,111,111,112,44,51,44,91,123,102,105,108,101,44,34,115,104,101,108,108,46,101,114,108,34,125,44,123,108,105,110,101,44,54,50,55,125,93,125,93,125,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,54,49>>,signature => [{attribute,{912,2},spec,{{error,1},[{type,{912,12},bounded_fun,[{type,{912,12},'fun',[{type,{912,12},product,[{var,{912,13},'Reason'}]},{type,{912,24},no_return,[]}]},[{type,{913,7},constraint,[{atom,{913,7},is_subtype},[{var,{913,7},'Reason'},{type,{913,17},term,[]}]]}]]}]}}]}},{{function,error,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,919}],[<<101,114,114,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46,32>>,{code,[],[<<65,114,103,115>>]},<<32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<110,111,110,101>>]},<<46,32,73,102,32,105,116,32,105,115,32,97,32,108,105,115,116,44,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,46,32,73,102,32,105,116,32,105,115,32>>,{code,[],[<<110,111,110,101>>]},<<44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46>>]},{p,[],[<<84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,32,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46,32,69,120,97,109,112,108,101,58>>]},{p,[],[{code,[],[<<116,101,115,116,46,101,114,108>>]},<<58>>]},{pre,[],[{code,[],[<<45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,101,120,97,109,112,108,101,95,102,117,110,47,50,93,41,46,10,10,101,120,97,109,112,108,101,95,102,117,110,40,65,49,44,32,65,50,41,32,45,62,10,32,32,32,32,101,114,108,97,110,103,58,101,114,114,111,114,40,109,121,95,101,114,114,111,114,44,32,91,65,49,44,32,65,50,93,41,46>>]}]},{p,[],[<<69,114,108,97,110,103,32,115,104,101,108,108,58>>]},{pre,[],[{code,[],[<<54,62,32,99,40,116,101,115,116,41,46,10,123,111,107,44,116,101,115,116,125,10,55,62,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,114,114,111,114,58,32,109,121,95,101,114,114,111,114,10,32,32,32,32,32,105,110,32,102,117,110,99,116,105,111,110,32,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,47,50,10,32,32,32,32,32,32,32,32,32,99,97,108,108,101,100,32,97,115,32,116,101,115,116,58,101,120,97,109,112,108,101,95,102,117,110,40,97,114,103,49,44,34,116,104,105,115,32,105,115,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,34,41,10,32>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,48,56,55>>,signature => [{attribute,{919,2},spec,{{error,2},[{type,{919,12},bounded_fun,[{type,{919,12},'fun',[{type,{919,12},product,[{var,{919,13},'Reason'},{var,{919,21},'Args'}]},{type,{919,30},no_return,[]}]},[{type,{920,7},constraint,[{atom,{920,7},is_subtype},[{var,{920,7},'Reason'},{type,{920,17},term,[]}]]},{type,{921,7},constraint,[{atom,{921,7},is_subtype},[{var,{921,7},'Args'},{type,{921,15},union,[{type,{921,15},list,[{type,{921,16},term,[]}]},{atom,{921,26},none}]}]]}]]}]}}]}},{{function,error,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,927}],[<<101,114,114,111,114,47,51>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,119,105,116,104,32,116,104,101,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46,32>>,{code,[],[<<65,114,103,115>>]},<<32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,116,104,101,32,108,105,115,116,32,111,102,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<110,111,110,101>>]},<<46,32,73,102,32,105,116,32,105,115,32,97,32,108,105,115,116,44,32,105,116,32,105,115,32,117,115,101,100,32,116,111,32,112,114,111,118,105,100,101,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,105,110,32,116,104,101,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,46,32,73,102,32,105,116,32,105,115,32>>,{code,[],[<<110,111,110,101>>]},<<44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46>>]},{p,[],[<<73,102,32,116,104,101,32>>,{code,[],[<<101,114,114,111,114,95,105,110,102,111>>]},<<32,111,112,116,105,111,110,32,105,115,32,103,105,118,101,110,44,32,116,104,101,32>>,{code,[],[<<69,114,114,111,114,73,110,102,111,77,97,112>>]},<<32,119,105,108,108,32,98,101,32,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,103,105,118,101,110,32,105,110,32,116,104,101,32>>,{code,[],[<<69,114,114,111,114,73,110,102,111,77,97,112>>]},<<32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,101,114,114,111,114,32,102,111,114,109,97,116,116,101,114,115,32,115,117,99,104,32,97,115,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,114,108,95,101,114,114,111,114,35,102,111,114,109,97,116,95,101,120,99,101,112,116,105,111,110,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,95,101,114,114,111,114>>]}]},<<32,116,111,32,112,114,111,118,105,100,101,32,109,111,114,101,32,99,111,110,116,101,120,116,32,97,114,111,117,110,100,32,97,110,32,101,114,114,111,114,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<109,111,100,117,108,101>>]},<<32,111,102,32,116,104,101,32>>,{code,[],[<<69,114,114,111,114,73,110,102,111,77,97,112>>]},<<32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,47,51>>]}]},<<32,105,115,32,109,97,100,101,46,32,84,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<102,117,110,99,116,105,111,110>>]},<<32,105,115,32>>,{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114>>]},<<46,32,83,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,114,108,95,101,114,114,111,114,35,102,111,114,109,97,116,95,101,114,114,111,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,50>>]}]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,104,105,115,32,77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,50,32,105,115,32,116,111,32,98,101,32,117,115,101,100>>]},{p,[],[<<84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<32,105,115,32,116,111,32,115,105,103,110,97,108,32,116,104,97,116,32,97,110,32,117,110,101,120,112,101,99,116,101,100,32,101,114,114,111,114,32,104,97,115,32,104,97,112,112,101,110,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,119,105,116,104,32,97,32,112,97,114,97,109,101,116,101,114,32,116,104,97,116,32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,116,121,112,101,41,46,32,83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,49,50,52>>,signature => [{attribute,{927,2},spec,{{error,3},[{type,{927,12},bounded_fun,[{type,{927,12},'fun',[{type,{927,12},product,[{var,{927,13},'Reason'},{var,{927,21},'Args'},{var,{927,27},'Options'}]},{type,{927,39},no_return,[]}]},[{type,{928,7},constraint,[{atom,{928,7},is_subtype},[{var,{928,7},'Reason'},{type,{928,17},term,[]}]]},{type,{929,7},constraint,[{atom,{929,7},is_subtype},[{var,{929,7},'Args'},{type,{929,15},union,[{type,{929,15},list,[{type,{929,16},term,[]}]},{atom,{929,26},none}]}]]},{type,{930,7},constraint,[{atom,{930,7},is_subtype},[{var,{930,7},'Options'},{type,{930,18},list,[{var,{930,19},'Option'}]}]]},{type,{931,7},constraint,[{atom,{931,7},is_subtype},[{var,{931,7},'Option'},{type,{931,17},tuple,[{atom,{931,18},error_info},{var,{931,32},'ErrorInfoMap'}]}]]},{type,{932,7},constraint,[{atom,{932,7},is_subtype},[{var,{932,7},'ErrorInfoMap'},{type,{932,23},map,[{type,{932,33},map_field_assoc,[{atom,{932,25},cause},{type,{932,36},term,[]}]},{type,{933,34},map_field_assoc,[{atom,{933,25},module},{type,{933,37},module,[]}]},{type,{934,36},map_field_assoc,[{atom,{934,25},function},{type,{934,39},atom,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,exit,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,940}],[<<101,120,105,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<101,120,105,116>>]},<<32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46,32,65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46>>]},{p,[],[<<84,104,101,32,105,110,116,101,110,116,32,111,102,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,32>>,{code,[],[<<101,120,105,116>>]},<<32,105,115,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,115,104,111,117,108,100,32,98,101,32,115,116,111,112,112,101,100,32,40,102,111,114,32,101,120,97,109,112,108,101,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,116,101,108,108,105,110,103,32,97,32,112,114,111,99,101,115,115,32,116,111,32,115,116,111,112,32,105,115,32,114,101,99,101,105,118,101,100,41,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,100,105,102,102,101,114,32,102,114,111,109,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,47,49,44,50,44,51>>]}]},<<32,98,121,32,99,97,117,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,97,32,100,105,102,102,101,114,101,110,116,32,99,108,97,115,115,32,97,110,100,32,98,121,32,104,97,118,105,110,103,32,97,32,114,101,97,115,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,108,105,115,116,32,111,102,32,102,117,110,99,116,105,111,110,115,32,102,114,111,109,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,46>>]},{p,[],[<<83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,42,42,32,101,120,99,101,112,116,105,111,110,32,101,120,105,116,58,32,102,111,111,98,97,114,10,62,32,99,97,116,99,104,32,101,120,105,116,40,102,111,111,98,97,114,41,46,10,123,39,69,88,73,84,39,44,102,111,111,98,97,114,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,99,97,108,108,115,32>>,{code,[],[<<101,120,105,116,40,107,105,108,108,41>>]},<<32,97,110,100,32,100,111,101,115,32,110,111,116,32,99,97,116,99,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,44,32,105,116,32,119,105,108,108,32,116,101,114,109,105,110,97,116,101,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,97,110,100,32,97,108,115,111,32,101,109,105,116,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,40,110,111,116,32>>,{code,[],[<<107,105,108,108,101,100>>]},<<41,32,116,111,32,97,108,108,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,83,117,99,104,32,101,120,105,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,99,97,110,32,98,101,32,116,114,97,112,112,101,100,32,98,121,32,116,104,101,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,115,105,103,110,97,108,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,98,101,104,97,118,101,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,121,32,97,114,101,32,115,101,110,116,32,98,101,99,97,117,115,101,32,116,104,101,32,115,105,103,110,97,108,32,119,105,108,108,32,98,101,32,117,110,116,114,97,112,112,97,98,108,101,32,105,102,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,115,117,99,104,32,97,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,49,53,51>>,signature => [{attribute,{940,2},spec,{{exit,1},[{type,{940,11},bounded_fun,[{type,{940,11},'fun',[{type,{940,11},product,[{var,{940,12},'Reason'}]},{type,{940,23},no_return,[]}]},[{type,{941,7},constraint,[{atom,{941,7},is_subtype},[{var,{941,7},'Reason'},{type,{941,17},term,[]}]]}]]}]}}]}},{{function,exit,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,946}],[<<101,120,105,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,97,110,121,32,116,101,114,109,44,32,101,120,99,101,112,116,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,111,114,32>>,{code,[],[<<107,105,108,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<80>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32,110,111,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32>>,{code,[],[<<80>>]},<<32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,114,111,109>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32>>,{code,[],[<<80>>]},<<46>>]}]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,98,101,104,97,118,105,111,114,32,97,112,112,108,105,101,115,32,105,102,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,116,104,101,32,116,101,114,109,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,110,100,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80>>]},<<32,119,104,105,99,104,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,110,118,111,107,101,100,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,40,80,105,100,44,32,110,111,114,109,97,108,41>>]},<<32,40,116,104,101,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,97,32,115,105,103,110,97,108,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,114,101,97,115,111,110,32,116,111,32,105,116,115,101,108,102,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,119,97,114,110,105,110,103,41,58>>]},{ul,[],[{li,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,114,111,109>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,115,101,110,116,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32>>,{code,[],[<<80>>]},<<39,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]},{li,[],[<<84,104,101,32,115,105,103,110,97,108,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,105,102,32>>,{code,[],[<<80>>]},<<32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46>>]}]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<107,105,108,108>>]},<<44,32,116,104,97,116,32,105,115,44,32,105,102,32>>,{code,[],[<<101,120,105,116,40,80,105,100,44,32,107,105,108,108,41>>]},<<32,105,115,32,99,97,108,108,101,100,44,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,119,104,105,99,104,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,101,120,105,116,115,32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108,101,100>>]},<<46,32,84,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32>>,{code,[],[<<107,105,108,108>>]},<<32,116,111,32>>,{code,[],[<<107,105,108,108,101,100>>]},<<32,116,111,32,104,105,110,116,32,116,111,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,107,105,108,108,101,100,32,112,114,111,99,101,115,115,32,103,111,116,32,107,105,108,108,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,120,105,116,40,80,105,100,44,32,107,105,108,108,41>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]}]},<<32,97,114,101,32,110,97,109,101,100,32,115,105,109,105,108,97,114,108,121,32,98,117,116,32,112,114,111,118,105,100,101,32,118,101,114,121,32,100,105,102,102,101,114,101,110,116,32,102,117,110,99,116,105,111,110,97,108,105,116,105,101,115,46,32,84,104,101,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,49>>]},<<32,102,117,110,99,116,105,111,110,32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,116,111,112,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,119,104,105,108,101,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]},<<32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,105,110,116,101,110,116,32,105,115,32,116,111,32,115,101,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,78,111,116,101,32,97,108,115,111,32,116,104,97,116,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,49>>]},<<32,114,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,99,97,117,103,104,116,32,119,104,105,108,101,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]},<<32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,97,110,121,32,101,120,99,101,112,116,105,111,110,32,116,111,32,98,101,32,114,97,105,115,101,100,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,101,32,111,110,108,121,32,115,99,101,110,97,114,105,111,32,116,104,97,116,32,104,97,115,32,110,111,116,32,98,101,101,110,32,99,111,118,101,114,101,100,32,98,121,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,97,98,111,118,101,32,105,115,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80>>]},<<32,115,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,116,111,32,105,116,115,101,108,102,44,32,116,104,97,116,32,105,115,32>>,{code,[],[<<101,114,108,97,110,103,58,101,120,105,116,40,115,101,108,102,40,41,44,32,110,111,114,109,97,108,41>>]},<<46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,110,32,116,104,105,115,32,115,99,101,110,97,114,105,111,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58>>]},{ul,[],[{li,[],[<<73,102,32>>,{code,[],[<<80>>]},<<32,105,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,116,114,97,110,115,102,111,114,109,101,100,32,105,110,116,111,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,110,111,114,109,97,108,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,114,111,109>>]},<<32,105,115,32>>,{code,[],[<<80>>]},<<39,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,110,100,32,100,101,108,105,118,101,114,101,100,32,116,111,32>>,{code,[],[<<80>>]},<<39,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]},{li,[],[{code,[],[<<80>>]},<<32,101,120,105,116,115,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,105,102,32>>,{code,[],[<<80>>]},<<32,105,115,32,110,111,116,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,46>>]}]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,101,110,100,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,116,111,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,97,114,103,117,97,98,108,121,32,115,116,114,97,110,103,101,32,98,117,116,32,116,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,114,101,97,115,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,49,57,53>>,signature => [{attribute,{946,2},spec,{{exit,2},[{type,{946,11},bounded_fun,[{type,{946,11},'fun',[{type,{946,11},product,[{var,{946,12},'Pid'},{var,{946,17},'Reason'}]},{atom,{946,28},true}]},[{type,{947,7},constraint,[{atom,{947,7},is_subtype},[{var,{947,7},'Pid'},{type,{947,14},union,[{type,{947,14},pid,[]},{type,{947,22},port,[]}]}]]},{type,{948,7},constraint,[{atom,{948,7},is_subtype},[{var,{948,7},'Reason'},{type,{948,17},term,[]}]]}]]}]}}]}},{{function,external_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,960}],[<<101,120,116,101,114,110,97,108,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58>>]},{pre,[],[{code,[],[<<62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101>>]}]},{p,[],[<<84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,97,32,99,97,108,108,32,116,111,58>>]},{pre,[],[{code,[],[<<101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,91,93,41>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,50,56,49>>,signature => [{attribute,{960,2},spec,{{erlang,external_size,1},[{type,{960,27},bounded_fun,[{type,{960,27},'fun',[{type,{960,27},product,[{var,{960,28},'Term'}]},{type,{960,37},non_neg_integer,[]}]},[{type,{961,7},constraint,[{atom,{961,7},is_subtype},[{var,{961,7},'Term'},{type,{961,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,external_size,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,966}],[<<101,120,116,101,114,110,97,108,95,115,105,122,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,97,108,99,117,108,97,116,101,115,44,32,119,105,116,104,111,117,116,32,100,111,105,110,103,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,109,97,120,105,109,117,109,32,98,121,116,101,32,115,105,122,101,32,102,111,114,32,97,32,116,101,114,109,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,111,110,100,105,116,105,111,110,32,97,112,112,108,105,101,115,32,97,108,119,97,121,115,58>>]},{pre,[],[{code,[],[<<62,32,83,105,122,101,49,32,61,32,98,121,116,101,95,115,105,122,101,40,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,41,44,10,62,32,83,105,122,101,50,32,61,32,101,114,108,97,110,103,58,101,120,116,101,114,110,97,108,95,115,105,122,101,40,84,101,114,109,44,32,79,112,116,105,111,110,115,41,44,10,62,32,116,114,117,101,32,61,32,83,105,122,101,49,32,61,60,32,83,105,122,101,50,46,10,116,114,117,101>>]}]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125>>]},<<32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,102,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,46,32,70,111,114,32,97,32,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,48,48>>,signature => [{attribute,{966,2},spec,{{erlang,external_size,2},[{type,{966,27},bounded_fun,[{type,{966,27},'fun',[{type,{966,27},product,[{var,{966,28},'Term'},{var,{966,34},'Options'}]},{type,{966,46},non_neg_integer,[]}]},[{type,{967,7},constraint,[{atom,{967,7},is_subtype},[{var,{967,7},'Term'},{type,{967,15},term,[]}]]},{type,{968,7},constraint,[{atom,{968,7},is_subtype},[{var,{968,7},'Options'},{type,{968,18},list,[{type,{968,19},tuple,[{atom,{968,20},minor_version},{ann_type,{968,35},[{var,{968,35},'Version'},{type,{968,46},non_neg_integer,[]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66,48,52>>}},{{function,float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,990}],[<<102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,102,108,111,97,116,32,98,121,32,99,111,110,118,101,114,116,105,110,103,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,97,32,102,108,111,97,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,97,116,40,53,53,41,46,10,53,53,46,48>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,117,115,101,100,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,105,110,32,97,32,103,117,97,114,100,44,32,105,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,59,32,102,111,114,32,99,108,97,114,105,116,121,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,115,95,102,108,111,97,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,102,108,111,97,116,47,49>>]}]},<<32,105,110,115,116,101,97,100,46>>]},{p,[],[<<87,104,101,110,32>>,{code,[],[<<102,108,111,97,116,47,49>>]},<<32,105,115,32,117,115,101,100,32,105,110,32,97,110,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,97,32,103,117,97,114,100,44,32,115,117,99,104,32,97,115,32,39>>,{code,[],[<<102,108,111,97,116,40,65,41,32,61,61,32,52,46,48>>]},<<39,44,32,105,116,32,99,111,110,118,101,114,116,115,32,97,32,110,117,109,98,101,114,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,50,48>>,signature => [{attribute,{990,2},spec,{{float,1},[{type,{990,12},bounded_fun,[{type,{990,12},'fun',[{type,{990,12},product,[{var,{990,13},'Number'}]},{type,{990,24},float,[]}]},[{type,{991,7},constraint,[{atom,{991,7},is_subtype},[{var,{991,7},'Number'},{type,{991,17},number,[]}]]}]]}]}}]}},{{function,float_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,996}],[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,70,108,111,97,116,44,91,123,115,99,105,101,110,116,105,102,105,99,44,50,48,125,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,52,50>>,signature => [{attribute,{996,2},spec,{{float_to_binary,1},[{type,{996,22},bounded_fun,[{type,{996,22},'fun',[{type,{996,22},product,[{var,{996,23},'Float'}]},{type,{996,33},binary,[]}]},[{type,{997,7},constraint,[{atom,{997,7},is_subtype},[{var,{997,7},'Float'},{type,{997,16},float,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1002}],[<<102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,108,111,97,116>>]},<<32,117,115,105,110,103,32,102,105,120,101,100,32,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46,32>>,{code,[],[<<79,112,116,105,111,110,115>>]},<<32,98,101,104,97,118,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,108,111,97,116,95,116,111,95,108,105,115,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,50>>]}]},<<46,32,69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,60,60,34,55,46,49,50,48,48,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,60,60,34,55,46,49,50,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,60,60,34,55,46,49,50,48,101,43,48,48,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,55,46,49,50,44,32,91,115,104,111,114,116,93,41,46,10,60,60,34,55,46,49,50,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,48,46,49,43,48,46,50,44,32,91,115,104,111,114,116,93,41,46,10,60,60,34,48,46,51,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,34,62,62,10,62,32,102,108,111,97,116,95,116,111,95,98,105,110,97,114,121,40,48,46,49,43,48,46,50,41,10,60,60,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,53,49>>,signature => [{attribute,{1002,2},spec,{{float_to_binary,2},[{type,{1002,22},bounded_fun,[{type,{1002,22},'fun',[{type,{1002,22},product,[{var,{1002,23},'Float'},{var,{1002,30},'Options'}]},{type,{1002,42},binary,[]}]},[{type,{1003,7},constraint,[{atom,{1003,7},is_subtype},[{var,{1003,7},'Float'},{type,{1003,16},float,[]}]]},{type,{1004,7},constraint,[{atom,{1004,7},is_subtype},[{var,{1004,7},'Options'},{type,{1004,18},list,[{var,{1004,19},'Option'}]}]]},{type,{1005,7},constraint,[{atom,{1005,7},is_subtype},[{var,{1005,7},'Option'},{type,{1005,18},union,[{type,{1005,18},tuple,[{atom,{1005,19},decimals},{ann_type,{1005,29},[{var,{1005,29},'Decimals'},{type,{1005,41},range,[{integer,{1005,41},0},{integer,{1005,44},253}]}]}]},{type,{1006,18},tuple,[{atom,{1006,19},scientific},{ann_type,{1006,31},[{var,{1006,31},'Decimals'},{type,{1006,43},range,[{integer,{1006,43},0},{integer,{1006,46},249}]}]}]},{atom,{1007,18},compact},{atom,{1008,18},short}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,float_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1013}],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,108,111,97,116,44,91,123,115,99,105,101,110,116,105,102,105,99,44,50,48,125,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,55,56>>,signature => [{attribute,{1013,2},spec,{{float_to_list,1},[{type,{1013,20},bounded_fun,[{type,{1013,20},'fun',[{type,{1013,20},product,[{var,{1013,21},'Float'}]},{type,{1013,31},string,[]}]},[{type,{1014,7},constraint,[{atom,{1014,7},is_subtype},[{var,{1014,7},'Float'},{type,{1014,16},float,[]}]]}]]}]}}]}},{{function,float_to_list,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1019}],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,108,111,97,116>>]},<<32,117,115,105,110,103,32,102,105,120,101,100,32,100,101,99,105,109,97,108,32,112,111,105,110,116,32,102,111,114,109,97,116,116,105,110,103,46>>]},{p,[],[<<65,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<100,101,99,105,109,97,108,115>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,99,111,110,116,97,105,110,115,32,97,116,32,109,111,115,116,32>>,{code,[],[<<68,101,99,105,109,97,108,115>>]},<<32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,112,97,115,116,32,116,104,101,32,100,101,99,105,109,97,108,32,112,111,105,110,116,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,100,111,101,115,32,110,111,116,32,102,105,116,32,105,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,115,116,97,116,105,99,32,98,117,102,102,101,114,32,111,102,32,50,53,54,32,98,121,116,101,115,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,104,114,111,119,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46>>]}]},{li,[],[{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,97,99,116>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,116,114,97,105,108,105,110,103,32,122,101,114,111,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,108,105,115,116,32,97,114,101,32,116,114,117,110,99,97,116,101,100,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,109,101,97,110,105,110,103,102,117,108,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<100,101,99,105,109,97,108,115>>]},<<46>>]}]},{li,[],[{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<115,99,105,101,110,116,105,102,105,99>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,108,111,97,116,32,105,115,32,102,111,114,109,97,116,116,101,100,32,117,115,105,110,103,32,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,119,105,116,104,32>>,{code,[],[<<68,101,99,105,109,97,108,115>>]},<<32,100,105,103,105,116,115,32,111,102,32,112,114,101,99,105,115,105,111,110,46>>]}]},{li,[],[{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<115,104,111,114,116>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,108,111,97,116,32,105,115,32,102,111,114,109,97,116,116,101,100,32,119,105,116,104,32,116,104,101,32,115,109,97,108,108,101,115,116,32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,116,104,97,116,32,115,116,105,108,108,32,103,117,97,114,97,110,116,101,101,115,32,116,104,97,116,32>>,{code,[],[<<70,32,61,58,61,32,108,105,115,116,95,116,111,95,102,108,111,97,116,40,102,108,111,97,116,95,116,111,95,108,105,115,116,40,70,44,32,91,115,104,111,114,116,93,41,41>>]},<<46,32,87,104,101,110,32,116,104,101,32,102,108,111,97,116,32,105,115,32,105,110,115,105,100,101,32,116,104,101,32,114,97,110,103,101,32,40,45,50,226,129,181,194,179,44,32,50,226,129,181,194,179,41,44,32,116,104,101,32,110,111,116,97,116,105,111,110,32,116,104,97,116,32,121,105,101,108,100,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,117,115,101,100,32,40,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,111,114,32,110,111,114,109,97,108,32,100,101,99,105,109,97,108,32,110,111,116,97,116,105,111,110,41,46,32,70,108,111,97,116,115,32,111,117,116,115,105,100,101,32,116,104,101,32,114,97,110,103,101,32,40,45,50,226,129,181,194,179,44,32,50,226,129,181,194,179,41,32,97,114,101,32,97,108,119,97,121,115,32,102,111,114,109,97,116,116,101,100,32,117,115,105,110,103,32,115,99,105,101,110,116,105,102,105,99,32,110,111,116,97,116,105,111,110,32,116,111,32,97,118,111,105,100,32,99,111,110,102,117,115,105,110,103,32,114,101,115,117,108,116,115,32,119,104,101,110,32,100,111,105,110,103,32,97,114,105,116,104,109,101,116,105,99,32,111,112,101,114,97,116,105,111,110,115,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,115>>]},<<32,105,115,32>>,{code,[],[<<91,93>>]},<<44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,108,111,97,116,95,116,111,95,108,105,115,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,47,49>>]}]},<<46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,93,41,46,10,34,55,46,49,50,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,100,101,99,105,109,97,108,115,44,32,52,125,44,32,99,111,109,112,97,99,116,93,41,46,10,34,55,46,49,50,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,123,115,99,105,101,110,116,105,102,105,99,44,32,51,125,93,41,46,10,34,55,46,49,50,48,101,43,48,48,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,55,46,49,50,44,32,91,115,104,111,114,116,93,41,46,10,34,55,46,49,50,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,44,32,91,115,104,111,114,116,93,41,46,10,34,48,46,51,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,34,10,62,32,102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41,10,34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34>>]}]},{p,[],[<<73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<102,108,111,97,116,95,116,111,95,108,105,115,116,40,48,46,49,43,48,46,50,41>>]},<<32,101,118,97,108,117,97,116,101,115,32,116,111,32>>,{code,[],[<<34,51,46,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,52,52,52,48,57,101,45,48,49,34>>]},<<46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,120,112,108,97,105,110,101,100,32,105,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,51,56,55>>,signature => [{attribute,{1019,2},spec,{{float_to_list,2},[{type,{1019,20},bounded_fun,[{type,{1019,20},'fun',[{type,{1019,20},product,[{var,{1019,21},'Float'},{var,{1019,28},'Options'}]},{type,{1019,40},string,[]}]},[{type,{1020,7},constraint,[{atom,{1020,7},is_subtype},[{var,{1020,7},'Float'},{type,{1020,16},float,[]}]]},{type,{1021,7},constraint,[{atom,{1021,7},is_subtype},[{var,{1021,7},'Options'},{type,{1021,18},list,[{var,{1021,19},'Option'}]}]]},{type,{1022,7},constraint,[{atom,{1022,7},is_subtype},[{var,{1022,7},'Option'},{type,{1022,18},union,[{type,{1022,18},tuple,[{atom,{1022,19},decimals},{ann_type,{1022,29},[{var,{1022,29},'Decimals'},{type,{1022,41},range,[{integer,{1022,41},0},{integer,{1022,44},253}]}]}]},{type,{1023,18},tuple,[{atom,{1023,19},scientific},{ann_type,{1023,31},[{var,{1023,31},'Decimals'},{type,{1023,43},range,[{integer,{1023,43},0},{integer,{1023,46},249}]}]}]},{atom,{1024,18},compact},{atom,{1025,18},short}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,floor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1031}],[<<102,108,111,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,105,110,116,101,103,101,114,32,110,111,116,32,103,114,101,97,116,101,114,32,116,104,97,110,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,102,108,111,111,114,40,45,49,48,46,53,41,46,10,45,49,49>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,52,55>>,signature => [{attribute,{1031,2},spec,{{floor,1},[{type,{1031,12},bounded_fun,[{type,{1031,12},'fun',[{type,{1031,12},product,[{var,{1031,13},'Number'}]},{type,{1031,24},integer,[]}]},[{type,{1032,7},constraint,[{atom,{1032,7},is_subtype},[{var,{1032,7},'Number'},{type,{1032,17},number,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,fun_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3454}],[<<102,117,110,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,117,110,32>>,{code,[],[<<70,117,110>>]},<<46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,117,112,108,101,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,109,97,105,110,108,121,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,98,117,116,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,32,98,101,32,117,115,101,102,117,108,32,105,110,32,108,105,98,114,97,114,121,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,110,101,101,100,32,116,111,32,118,101,114,105,102,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,97,114,105,116,121,32,111,102,32,97,32,102,117,110,46>>]}]},{p,[],[<<84,119,111,32,116,121,112,101,115,32,111,102,32,102,117,110,115,32,104,97,118,101,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,115,101,109,97,110,116,105,99,115,58>>]},{ul,[],[{li,[],[{p,[],[<<65,32,102,117,110,32,99,114,101,97,116,101,100,32,98,121,32>>,{code,[],[<<102,117,110,32,77,58,70,47,65>>]},<<32,105,115,32,99,97,108,108,101,100,32,97,110,32>>,{em,[],[<<101,120,116,101,114,110,97,108>>]},<<32,102,117,110,46,32,67,97,108,108,105,110,103,32,105,116,32,119,105,108,108,32,97,108,119,97,121,115,32,99,97,108,108,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<70>>]},<<32,119,105,116,104,32,97,114,105,116,121,32>>,{code,[],[<<65>>]},<<32,105,110,32,116,104,101,32,108,97,116,101,115,116,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32>>,{code,[],[<<77>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,100,117,108,101,32>>,{code,[],[<<77>>]},<<32,100,111,101,115,32,110,111,116,32,101,118,101,110,32,110,101,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,32>>,{code,[],[<<102,117,110,32,77,58,70,47,65>>]},<<32,105,115,32,99,114,101,97,116,101,100,46>>]}]},{li,[],[{p,[],[<<65,108,108,32,111,116,104,101,114,32,102,117,110,115,32,97,114,101,32,99,97,108,108,101,100,32>>,{em,[],[<<108,111,99,97,108>>]},<<46,32,87,104,101,110,32,97,32,108,111,99,97,108,32,102,117,110,32,105,115,32,99,97,108,108,101,100,44,32,116,104,101,32,115,97,109,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,102,117,110,32,105,115,32,99,97,108,108,101,100,32,40,101,118,101,110,32,105,102,32,97,32,110,101,119,101,114,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,104,97,115,32,98,101,101,110,32,108,111,97,100,101,100,41,46>>]}]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,97,108,119,97,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,102,111,114,32,98,111,116,104,32,108,111,99,97,108,32,97,110,100,32,101,120,116,101,114,110,97,108,32,102,117,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,116,121,112,101,44,32,84,121,112,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,111,114,32>>,{code,[],[<<101,120,116,101,114,110,97,108>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<32,40,97,110,32,97,116,111,109,41,32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,110,97,109,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,102,117,110,32,105,115,32,100,101,102,105,110,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46>>]}]},{dt,[],[{code,[],[<<123,110,97,109,101,44,32,78,97,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<78,97,109,101>>]},<<32,40,97,110,32,97,116,111,109,41,32,105,115,32,97,32,102,117,110,99,116,105,111,110,32,110,97,109,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,44,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,102,117,110,46,32,40,84,104,105,115,32,110,97,109,101,32,119,97,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,97,110,100,32,105,115,32,111,110,108,121,32,111,102,32,105,110,102,111,114,109,97,116,105,111,110,97,108,32,117,115,101,46,32,65,115,32,105,116,32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,99,97,108,108,101,100,32,100,105,114,101,99,116,108,121,46,41,32,73,102,32,110,111,32,99,111,100,101,32,105,115,32,99,117,114,114,101,110,116,108,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,101,32,102,117,110,44,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,110,32,97,116,111,109,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,116,104,101,32,102,117,110,32,114,101,102,101,114,115,32,116,111,46>>]}]},{dt,[],[{code,[],[<<123,97,114,105,116,121,44,32,65,114,105,116,121,125>>]}]},{dd,[],[{p,[],[{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,102,117,110,32,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,119,105,116,104,46>>]}]},{dt,[],[{code,[],[<<123,101,110,118,44,32,69,110,118,125>>]}]},{dd,[],[{p,[],[{code,[],[<<69,110,118>>]},<<32,40,97,32,108,105,115,116,41,32,105,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,114,32,102,114,101,101,32,118,97,114,105,97,98,108,101,115,32,102,111,114,32,116,104,101,32,102,117,110,46,32,70,111,114,32,101,120,116,101,114,110,97,108,32,102,117,110,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,105,115,32,97,108,119,97,121,115,32,101,109,112,116,121,46>>]}]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,110,108,121,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,32,105,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,108,111,99,97,108,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,105,100,44,32,80,105,100,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,111,114,105,103,105,110,97,108,108,121,32,99,114,101,97,116,101,100,32,116,104,101,32,102,117,110,46>>]},{p,[],[<<73,116,32,109,105,103,104,116,32,112,111,105,110,116,32,116,111,32,116,104,101,32>>,{code,[],[<<105,110,105,116>>]},<<32,112,114,111,99,101,115,115,32,105,102,32,116,104,101,32>>,{code,[],[<<70,117,110>>]},<<32,119,97,115,32,115,116,97,116,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,119,104,101,110,32,109,111,100,117,108,101,32,119,97,115,32,108,111,97,100,101,100,32,40,116,104,105,115,32,111,112,116,105,109,105,115,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,102,111,114,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,100,111,32,110,111,116,32,99,97,112,116,117,114,101,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,41,46>>]}]},{dt,[],[{code,[],[<<123,105,110,100,101,120,44,32,73,110,100,101,120,125>>]}]},{dd,[],[{p,[],[{code,[],[<<73,110,100,101,120>>]},<<32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,32,102,117,110,32,116,97,98,108,101,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,95,105,110,100,101,120,44,32,73,110,100,101,120,125>>]}]},{dd,[],[{p,[],[{code,[],[<<73,110,100,101,120>>]},<<32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,110,32,105,110,100,101,120,32,105,110,116,111,32,116,104,101,32,109,111,100,117,108,101,32,102,117,110,32,116,97,98,108,101,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,95,117,110,105,113,44,32,85,110,105,113,125>>]}]},{dd,[],[{p,[],[{code,[],[<<85,110,105,113>>]},<<32,40,97,32,98,105,110,97,114,121,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,73,116,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46>>]}]},{dt,[],[{code,[],[<<123,117,110,105,113,44,32,85,110,105,113,125>>]}]},{dd,[],[{p,[],[{code,[],[<<85,110,105,113>>]},<<32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,115,32,97,32,117,110,105,113,117,101,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,46,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,105,115,32,99,97,108,99,117,108,97,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,109,111,100,117,108,101,46,32,66,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,53,44,32,116,104,105,115,32,105,110,116,101,103,101,114,32,119,97,115,32,98,97,115,101,100,32,111,110,32,111,110,108,121,32,116,104,101,32,98,111,100,121,32,111,102,32,116,104,101,32,102,117,110,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,52,54,49>>,signature => [{attribute,{3454,2},spec,{{erlang,fun_info,1},[{type,{3454,22},bounded_fun,[{type,{3454,22},'fun',[{type,{3454,22},product,[{var,{3454,23},'Fun'}]},{type,{3454,31},list,[{type,{3454,32},tuple,[{var,{3454,33},'Item'},{var,{3454,39},'Info'}]}]}]},[{type,{3455,7},constraint,[{atom,{3455,7},is_subtype},[{var,{3455,7},'Fun'},{type,{3455,14},function,[]}]]},{type,{3456,7},constraint,[{atom,{3456,7},is_subtype},[{var,{3456,7},'Item'},{type,{3456,15},union,[{atom,{3456,15},arity},{atom,{3456,23},env},{atom,{3456,29},index},{atom,{3456,37},name},{atom,{3457,15},module},{atom,{3457,24},new_index},{atom,{3457,36},new_uniq},{atom,{3457,47},pid},{atom,{3457,53},type},{atom,{3457,60},uniq}]}]]},{type,{3458,7},constraint,[{atom,{3458,7},is_subtype},[{var,{3458,7},'Info'},{type,{3458,15},term,[]}]]}]]}]}}]}},{{function,fun_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1037}],[<<102,117,110,95,105,110,102,111,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<102,117,110,95,105,110,102,111,95,105,116,101,109>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32>>,{code,[],[<<70,117,110>>]},<<32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<44,32,105,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,73,116,101,109,44,73,110,102,111,125>>]},<<46>>]},{p,[],[<<70,111,114,32,97,110,121,32,102,117,110,44,32>>,{code,[],[<<73,116,101,109>>]},<<32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<109,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<110,97,109,101>>]},<<44,32>>,{code,[],[<<97,114,105,116,121>>]},<<44,32>>,{code,[],[<<101,110,118>>]},<<44,32,111,114,32>>,{code,[],[<<116,121,112,101>>]},<<46>>]},{p,[],[<<70,111,114,32,97,32,108,111,99,97,108,32,102,117,110,44,32>>,{code,[],[<<73,116,101,109>>]},<<32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<105,110,100,101,120>>]},<<44,32>>,{code,[],[<<110,101,119,95,105,110,100,101,120>>]},<<44,32>>,{code,[],[<<110,101,119,95,117,110,105,113>>]},<<44,32>>,{code,[],[<<117,110,105,113>>]},<<44,32,97,110,100,32>>,{code,[],[<<112,105,100>>]},<<46,32,70,111,114,32,97,110,32,101,120,116,101,114,110,97,108,32,102,117,110,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,97,110,121,32,111,102,32,116,104,101,115,101,32,105,116,101,109,115,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,117,110,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,54,54>>,signature => [{attribute,{1037,2},spec,{{erlang,fun_info,2},[{type,{1037,22},bounded_fun,[{type,{1037,22},'fun',[{type,{1037,22},product,[{var,{1037,23},'Fun'},{var,{1037,28},'Item'}]},{type,{1037,37},tuple,[{var,{1037,38},'Item'},{var,{1037,44},'Info'}]}]},[{type,{1038,7},constraint,[{atom,{1038,7},is_subtype},[{var,{1038,7},'Fun'},{type,{1038,14},function,[]}]]},{type,{1039,7},constraint,[{atom,{1039,7},is_subtype},[{var,{1039,7},'Item'},{user_type,{1039,15},fun_info_item,[]}]]},{type,{1040,7},constraint,[{atom,{1040,7},is_subtype},[{var,{1040,7},'Info'},{type,{1040,15},term,[]}]]}]]}]}}]}},{{function,fun_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1054}],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,116,104,97,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,99,114,101,97,116,101,100,32>>,{code,[],[<<70,117,110>>]},<<46>>]},{p,[],[{code,[],[<<83,116,114,105,110,103>>]},<<32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,44,32,105,102,32>>,{code,[],[<<70,117,110>>]},<<32,119,97,115,32,99,114,101,97,116,101,100,32,98,121,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<102,117,110,32,101,120,112,114,101,115,115,105,111,110>>]},<<32,111,102,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121>>]},<<58>>]},{p,[],[{code,[],[<<34,102,117,110,32,77,111,100,117,108,101,78,97,109,101,58,70,117,110,99,78,97,109,101,47,65,114,105,116,121,34>>]}]},{p,[],[<<84,104,101,32,102,111,114,109,32,111,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,119,104,101,110,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,111,116,104,101,114,32,116,121,112,101,115,32,111,102,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,102,117,110,45,101,120,112,114,101,115,115,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<102,117,110,32,101,120,112,114,101,115,115,105,111,110,115>>]},<<32,100,105,102,102,101,114,115,32,100,101,112,101,110,100,105,110,103,32,111,110,32,105,102,32,116,104,101,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,99,111,109,112,105,108,101,100,32,99,111,100,101,32,111,114,32,105,102,32,116,104,101,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,101,120,101,99,117,116,101,100,32,119,104,105,108,101,32,101,120,101,99,117,116,105,110,103,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,40,117,110,99,111,109,112,105,108,101,100,32,101,115,99,114,105,112,116,115,44,32,116,104,101,32,69,114,108,97,110,103,32,115,104,101,108,108,44,32,97,110,100,32,111,116,104,101,114,32,99,111,100,101,32,101,120,101,99,117,116,101,100,32,98,121,32,116,104,101,32,101,114,108,95,101,118,97,108,32,109,111,100,117,108,101,41,58>>]},{dl,[],[{dt,[],[<<99,111,109,112,105,108,101,100,32,99,111,100,101>>]},{dd,[],[{p,[],[{code,[],[<<34,35,70,117,110,60,77,46,73,46,85,62,34>>]},<<44,32,119,104,101,114,101,32,77,44,32,73,32,97,110,100,32,85,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104,101,32,118,97,108,117,101,115,32,110,97,109,101,100,32>>,{code,[],[<<109,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<105,110,100,101,120>>]},<<32,97,110,100,32>>,{code,[],[<<117,110,105,113>>]},<<32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,117,110,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,40,70,117,110,41>>]}]},<<46>>]}]},{dt,[],[<<117,110,99,111,109,112,105,108,101,100,32,99,111,100,101>>]},{dd,[],[<<65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<71,101,110,101,114,97,108,108,121,44,32,111,110,101,32,99,97,110,32,110,111,116,32,117,115,101,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<32,116,111,32,99,104,101,99,107,32,105,102,32,116,119,111,32,102,117,110,115,32,97,114,101,32,101,113,117,97,108,32,97,115,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<32,100,111,101,115,32,110,111,116,32,116,97,107,101,32,116,104,101,32,102,117,110,39,115,32,101,110,118,105,114,111,110,109,101,110,116,32,105,110,116,111,32,97,99,99,111,117,110,116,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,102,117,110,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,102,117,110,95,105,110,102,111,47,49>>]}]},<<32,102,111,114,32,104,111,119,32,116,111,32,103,101,116,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,97,32,102,117,110,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,111,117,116,112,117,116,32,111,102,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,69,114,108,97,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,97,110,100,32,109,97,121,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,115,46>>]}]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<45,109,111,100,117,108,101,40,116,101,115,116,41,46,10,45,101,120,112,111,114,116,40,91,97,100,100,47,49,44,32,97,100,100,50,47,48,44,32,102,117,110,95,116,117,112,108,101,47,48,93,41,46,10,97,100,100,40,65,41,32,45,62,32,102,117,110,40,66,41,32,45,62,32,65,32,43,32,66,32,101,110,100,46,10,97,100,100,50,40,41,32,45,62,32,102,117,110,32,97,100,100,47,49,46,10,102,117,110,95,116,117,112,108,101,40,41,32,45,62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,10,32,32,32,32,32,32,32,32>>]}]},{pre,[],[{code,[],[<<62,32,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,32,116,101,115,116,58,97,100,100,50,40,41,125,46,10,123,102,117,110,32,116,101,115,116,58,97,100,100,47,49,44,35,70,117,110,60,116,101,115,116,46,49,46,49,48,55,55,51,56,57,56,51,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32>>,{code,[],[<<102,117,110,32,116,101,115,116,58,97,100,100,47,49>>]},<<32,105,115,32,117,112,103,114,97,100,97,98,108,101,32,98,117,116,32>>,{code,[],[<<116,101,115,116,58,97,100,100,50,40,41>>]},<<32,105,115,32,110,111,116,32,117,112,103,114,97,100,97,98,108,101,46>>]},{pre,[],[{code,[],[<<62,32,123,116,101,115,116,58,97,100,100,40,49,41,44,32,116,101,115,116,58,97,100,100,40,52,50,41,125,46,10,123,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,48,46,49,48,55,55,51,56,57,56,51,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32>>,{code,[],[<<116,101,115,116,58,97,100,100,40,49,41>>]},<<32,97,110,100,32>>,{code,[],[<<116,101,115,116,58,97,100,100,40,52,50,41>>]},<<32,104,97,115,32,116,104,101,32,115,97,109,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,97,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,105,115,32,110,111,116,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,46>>]},{pre,[],[{code,[],[<<62,116,101,115,116,58,102,117,110,95,116,117,112,108,101,40,41,46,10,123,35,70,117,110,60,116,101,115,116,46,50,46,49,48,55,55,51,56,57,56,51,62,44,35,70,117,110,60,116,101,115,116,46,51,46,49,48,55,55,51,56,57,56,51,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32,84,104,101,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,100,105,102,102,101,114,32,98,101,99,97,117,115,101,32,116,104,101,32,102,117,110,115,32,99,111,109,101,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,46>>]},{pre,[],[{code,[],[<<62,32,123,102,117,110,40,41,32,45,62,32,49,32,101,110,100,44,32,102,117,110,40,41,32,45,62,32,49,32,101,110,100,125,46,32,62,32,10,123,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,44,35,70,117,110,60,101,114,108,95,101,118,97,108,46,52,53,46,57,55,50,56,51,48,57,53,62,125>>]}]},{p,[],[<<69,120,112,108,97,110,97,116,105,111,110,58,32,65,108,108,32,102,117,110,115,32,99,114,101,97,116,101,100,32,102,114,111,109,32,102,117,110,32,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,105,115,32,102,111,114,109,32,105,110,32,117,110,99,111,109,112,105,108,101,100,32,99,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,97,114,105,116,121,32,97,114,101,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,98,121,32>>,{code,[],[<<102,117,110,95,116,111,95,108,105,115,116,47,49>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,53,56,54>>,signature => [{attribute,{1054,2},spec,{{erlang,fun_to_list,1},[{type,{1054,25},bounded_fun,[{type,{1054,25},'fun',[{type,{1054,25},product,[{var,{1054,26},'Fun'}]},{ann_type,{1054,34},[{var,{1054,34},'String'},{type,{1054,44},string,[]}]}]},[{type,{1055,7},constraint,[{atom,{1055,7},is_subtype},[{var,{1055,7},'Fun'},{type,{1055,14},function,[]}]]}]]}]}}]}},{{function,function_exported,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1060}],[<<102,117,110,99,116,105,111,110,95,101,120,112,111,114,116,101,100,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,99,111,100,101,95,108,111,97,100,105,110,103,35,99,111,100,101,45,114,101,112,108,97,99,101,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,117,114,114,101,110,116>>]},<<32,97,110,100,32,99,111,110,116,97,105,110,115,32,97,110,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,66,73,70,32,40,97,32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,67,41,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,110,97,109,101,44,32,111,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,54,55,53>>,signature => [{attribute,{1060,2},spec,{{erlang,function_exported,3},[{type,{1060,31},bounded_fun,[{type,{1060,31},'fun',[{type,{1060,31},product,[{var,{1060,32},'Module'},{var,{1060,40},'Function'},{var,{1060,50},'Arity'}]},{type,{1060,60},boolean,[]}]},[{type,{1061,7},constraint,[{atom,{1061,7},is_subtype},[{var,{1061,7},'Module'},{type,{1061,17},module,[]}]]},{type,{1062,7},constraint,[{atom,{1062,7},is_subtype},[{var,{1062,7},'Function'},{type,{1062,19},atom,[]}]]},{type,{1063,7},constraint,[{atom,{1063,7},is_subtype},[{var,{1063,7},'Arity'},{type,{1063,16},arity,[]}]]}]]}]}}]}},{{function,garbage_collect,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1068}],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>],#{<<101,110>> => [{p,[],[<<70,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,101,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,117,110,108,101,115,115,32,105,116,32,104,97,115,32,98,101,101,110,32,110,111,116,105,99,101,100,32,40,111,114,32,116,104,101,114,101,32,97,114,101,32,103,111,111,100,32,114,101,97,115,111,110,115,32,116,111,32,115,117,115,112,101,99,116,41,32,116,104,97,116,32,116,104,101,32,115,112,111,110,116,97,110,101,111,117,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,105,108,108,32,111,99,99,117,114,32,116,111,111,32,108,97,116,101,32,111,114,32,110,111,116,32,97,116,32,97,108,108,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,109,112,114,111,112,101,114,32,117,115,101,32,99,97,110,32,115,101,114,105,111,117,115,108,121,32,100,101,103,114,97,100,101,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,54,56,55>>,signature => [{attribute,{1068,2},spec,{{garbage_collect,0},[{type,{1068,22},'fun',[{type,{1068,22},product,[]},{atom,{1068,28},true}]}]}}]}},{{function,garbage_collect,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1073}],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,40,80,105,100,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,48,51>>,signature => [{attribute,{1073,2},spec,{{garbage_collect,1},[{type,{1073,22},bounded_fun,[{type,{1073,22},'fun',[{type,{1073,22},product,[{var,{1073,23},'Pid'}]},{var,{1073,31},'GCResult'}]},[{type,{1074,7},constraint,[{atom,{1074,7},is_subtype},[{var,{1074,7},'Pid'},{type,{1074,14},pid,[]}]]},{type,{1075,7},constraint,[{atom,{1075,7},is_subtype},[{var,{1075,7},'GCResult'},{type,{1075,19},boolean,[]}]]}]]}]}}]}},{{function,garbage_collect,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1089}],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,82,101,113,117,101,115,116,73,100,125>>]}]},{dd,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,50>>]},<<32,114,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,101,110,116,46,32,87,104,101,110,32,116,104,101,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,112,97,115,115,101,100,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,44,32,82,101,113,117,101,115,116,73,100,44,32,71,67,82,101,115,117,108,116,125>>]},<<46>>]},{dt,[],[{code,[],[<<123,116,121,112,101,44,32,39,109,97,106,111,114,39,32,124,32,39,109,105,110,111,114,39,125>>]}]},{dd,[],[<<84,114,105,103,103,101,114,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,114,101,113,117,101,115,116,101,100,32,116,121,112,101,46,32,68,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<39,109,97,106,111,114,39>>]},<<44,32,119,104,105,99,104,32,119,111,117,108,100,32,116,114,105,103,103,101,114,32,97,32,102,117,108,108,115,119,101,101,112,32,71,67,46,32,84,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<39,109,105,110,111,114,39>>]},<<32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,104,105,110,116,32,97,110,100,32,109,97,121,32,108,101,97,100,32,116,111,32,101,105,116,104,101,114,32,109,105,110,111,114,32,111,114,32,109,97,106,111,114,32,71,67,32,114,117,110,46>>]}]},{p,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<115,101,108,102,40,41>>]},<<44,32,97,110,100,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,116,32,111,110,99,101,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>]}]},<<46,32,79,116,104,101,114,119,105,115,101,32,97,32,114,101,113,117,101,115,116,32,102,111,114,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,97,110,100,32,119,105,108,108,32,98,101,32,104,97,110,100,108,101,100,32,119,104,101,110,32,97,112,112,114,111,112,114,105,97,116,101,46,32,73,102,32,110,111,32>>,{code,[],[<<97,115,121,110,99>>]},<<32,111,112,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,98,108,111,99,107,115,32,117,110,116,105,108,32>>,{code,[],[<<71,67,82,101,115,117,108,116>>]},<<32,105,115,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<71,67,82,101,115,117,108,116>>]},<<32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,114,101,113,117,101,115,116,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,104,97,115,32,98,101,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46>>]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[<<78,111,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,44,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,116,101,114,109,105,110,97,116,101,100,32,98,101,102,111,114,101,32,116,104,101,32,114,101,113,117,101,115,116,32,99,111,117,108,100,32,98,101,32,115,97,116,105,115,102,105,101,100,46>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,99,97,118,101,97,116,115,32,97,112,112,108,121,32,97,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,47,48>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,49,51>>,signature => [{attribute,{1089,2},spec,{{garbage_collect,2},[{type,{1089,22},bounded_fun,[{type,{1089,22},'fun',[{type,{1089,22},product,[{var,{1089,23},'Pid'},{var,{1089,28},'OptionList'}]},{type,{1089,43},union,[{var,{1089,43},'GCResult'},{atom,{1089,54},async}]}]},[{type,{1090,7},constraint,[{atom,{1090,7},is_subtype},[{var,{1090,7},'Pid'},{type,{1090,14},pid,[]}]]},{type,{1091,7},constraint,[{atom,{1091,7},is_subtype},[{var,{1091,7},'RequestId'},{type,{1091,20},term,[]}]]},{type,{1092,7},constraint,[{atom,{1092,7},is_subtype},[{var,{1092,7},'Option'},{type,{1092,17},union,[{type,{1092,17},tuple,[{atom,{1092,18},async},{var,{1092,25},'RequestId'}]},{type,{1092,38},tuple,[{atom,{1092,39},type},{type,{1092,45},union,[{atom,{1092,45},major},{atom,{1092,55},minor}]}]}]}]]},{type,{1093,7},constraint,[{atom,{1093,7},is_subtype},[{var,{1093,7},'OptionList'},{type,{1093,21},list,[{var,{1093,22},'Option'}]}]]},{type,{1094,7},constraint,[{atom,{1094,7},is_subtype},[{var,{1094,7},'GCResult'},{type,{1094,19},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,get,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1139}],[<<103,101,116,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,75,101,121,44,32,86,97,108,125>>]},<<32,116,117,112,108,101,115,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,107,101,121,51,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,41,46,10,91,123,107,101,121,49,44,109,101,114,114,121,125,44,123,107,101,121,50,44,108,97,109,98,115,125,44,123,107,101,121,51,44,123,97,114,101,44,112,108,97,121,105,110,103,125,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,55,56>>,signature => [{attribute,{1139,2},spec,{{get,0},[{type,{1139,10},bounded_fun,[{type,{1139,10},'fun',[{type,{1139,10},product,[]},{type,{1139,16},list,[{type,{1139,17},tuple,[{var,{1139,18},'Key'},{var,{1139,23},'Val'}]}]}]},[{type,{1140,7},constraint,[{atom,{1140,7},is_subtype},[{var,{1140,7},'Key'},{type,{1140,14},term,[]}]]},{type,{1141,7},constraint,[{atom,{1141,7},is_subtype},[{var,{1141,7},'Val'},{type,{1141,14},term,[]}]]}]]}]}}]}},{{function,get,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1146}],[<<103,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32>>,{code,[],[<<75,101,121>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,79,40>>,{code,[],[<<49>>]},<<41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40>>,{code,[],[<<78>>]},<<41,44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,107,101,121,49,44,32,109,101,114,114,121,41,44,10,112,117,116,40,107,101,121,50,44,32,108,97,109,98,115,41,44,10,112,117,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,44,32,123,97,114,101,44,32,112,108,97,121,105,110,103,125,41,44,10,103,101,116,40,123,97,110,121,44,32,91,118,97,108,105,100,44,32,116,101,114,109,93,125,41,46,10,123,97,114,101,44,112,108,97,121,105,110,103,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,55,57,53>>,signature => [{attribute,{1146,2},spec,{{get,1},[{type,{1146,10},bounded_fun,[{type,{1146,10},'fun',[{type,{1146,10},product,[{var,{1146,11},'Key'}]},{type,{1146,19},union,[{var,{1146,19},'Val'},{atom,{1146,25},undefined}]}]},[{type,{1147,7},constraint,[{atom,{1147,7},is_subtype},[{var,{1147,7},'Key'},{type,{1147,14},term,[]}]]},{type,{1148,7},constraint,[{atom,{1148,7},is_subtype},[{var,{1148,7},'Val'},{type,{1148,14},term,[]}]]}]]}]}}]}},{{function,get_cookie,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3814}],[<<103,101,116,95,99,111,111,107,105,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,102,32,116,104,101,32,110,111,100,101,32,105,115,32,97,108,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<110,111,99,111,111,107,105,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,49,53>>,signature => [{attribute,{3814,2},spec,{{erlang,get_cookie,0},[{type,{3814,24},bounded_fun,[{type,{3814,24},'fun',[{type,{3814,24},product,[]},{type,{3814,30},union,[{var,{3814,30},'Cookie'},{atom,{3814,39},nocookie}]}]},[{type,{3815,7},constraint,[{atom,{3815,7},is_subtype},[{var,{3815,7},'Cookie'},{type,{3815,17},atom,[]}]]}]]}]}}]}},{{function,get_cookie,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3819}],[<<103,101,116,95,99,111,111,107,105,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,102,111,114,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,97,108,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<110,111,99,111,111,107,105,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,50,52>>,signature => [{attribute,{3819,2},spec,{{erlang,get_cookie,1},[{type,{3819,24},bounded_fun,[{type,{3819,24},'fun',[{type,{3819,24},product,[{var,{3819,25},'Node'}]},{type,{3819,34},union,[{var,{3819,34},'Cookie'},{atom,{3819,43},nocookie}]}]},[{type,{3820,7},constraint,[{atom,{3820,7},is_subtype},[{var,{3820,7},'Node'},{type,{3820,15},node,[]}]]},{type,{3821,7},constraint,[{atom,{3821,7},is_subtype},[{var,{3821,7},'Cookie'},{type,{3821,17},atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,49>>}},{{function,get_keys,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1153}],[<<103,101,116,95,107,101,121,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,107,101,121,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,100,111,103,44,32,123,97,110,105,109,97,108,44,49,125,41,44,10,112,117,116,40,99,111,119,44,32,123,97,110,105,109,97,108,44,50,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,97,110,105,109,97,108,44,51,125,41,44,10,103,101,116,95,107,101,121,115,40,41,46,10,91,100,111,103,44,99,111,119,44,108,97,109,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,51,52>>,signature => [{attribute,{1153,2},spec,{{get_keys,0},[{type,{1153,15},bounded_fun,[{type,{1153,15},'fun',[{type,{1153,15},product,[]},{type,{1153,21},list,[{var,{1153,22},'Key'}]}]},[{type,{1154,7},constraint,[{atom,{1154,7},is_subtype},[{var,{1154,7},'Key'},{type,{1154,14},term,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,get_keys,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1159}],[<<103,101,116,95,107,101,121,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,107,101,121,115,32,116,104,97,116,32,97,114,101,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,84,104,101,32,105,116,101,109,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,105,110,32,97,110,121,32,111,114,100,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,117,116,40,109,97,114,121,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,104,97,100,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,97,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,108,105,116,116,108,101,44,32,123,49,44,32,50,125,41,44,10,112,117,116,40,100,111,103,44,32,123,49,44,32,51,125,41,44,10,112,117,116,40,108,97,109,98,44,32,123,49,44,32,50,125,41,44,10,103,101,116,95,107,101,121,115,40,123,49,44,32,50,125,41,46,10,91,109,97,114,121,44,104,97,100,44,97,44,108,105,116,116,108,101,44,108,97,109,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,53,49>>,signature => [{attribute,{1159,2},spec,{{get_keys,1},[{type,{1159,15},bounded_fun,[{type,{1159,15},'fun',[{type,{1159,15},product,[{var,{1159,16},'Val'}]},{type,{1159,24},list,[{var,{1159,25},'Key'}]}]},[{type,{1160,7},constraint,[{atom,{1160,7},is_subtype},[{var,{1160,7},'Val'},{type,{1160,14},term,[]}]]},{type,{1161,7},constraint,[{atom,{1161,7},is_subtype},[{var,{1161,7},'Key'},{type,{1161,14},term,[]}]]}]]}]}}]}},{{function,group_leader,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1173}],[<<103,114,111,117,112,95,108,101,97,100,101,114,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,46>>]},{p,[],[<<69,118,101,114,121,32,112,114,111,99,101,115,115,32,105,115,32,97,32,109,101,109,98,101,114,32,111,102,32,115,111,109,101,32,112,114,111,99,101,115,115,32,103,114,111,117,112,32,97,110,100,32,97,108,108,32,103,114,111,117,112,115,32,104,97,118,101,32,97,32>>,{em,[],[<<103,114,111,117,112,32,108,101,97,100,101,114>>]},<<46,32,65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,103,114,111,117,112,32,105,115,32,99,104,97,110,110,101,108,101,100,32,116,111,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,46,32,87,104,101,110,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,112,97,119,110,101,100,44,32,105,116,32,103,101,116,115,32,116,104,101,32,115,97,109,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,115,32,116,104,101,32,115,112,97,119,110,105,110,103,32,112,114,111,99,101,115,115,46,32,73,110,105,116,105,97,108,108,121,44,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,44,32>>,{code,[],[<<105,110,105,116>>]},<<32,105,115,32,98,111,116,104,32,105,116,115,32,111,119,110,32,103,114,111,117,112,32,108,101,97,100,101,114,32,97,110,100,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,97,108,108,32,112,114,111,99,101,115,115,101,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,55,49>>,signature => [{attribute,{1173,2},spec,{{group_leader,0},[{type,{1173,19},'fun',[{type,{1173,19},product,[]},{type,{1173,25},pid,[]}]}]}}]}},{{function,group_leader,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1178}],[<<103,114,111,117,112,95,108,101,97,100,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<32,116,111,32>>,{code,[],[<<71,114,111,117,112,76,101,97,100,101,114>>]},<<46,32,84,121,112,105,99,97,108,108,121,44,32,116,104,105,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,97,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,102,114,111,109,32,97,32,99,101,114,116,97,105,110,32,115,104,101,108,108,32,105,115,32,116,111,32,104,97,118,101,32,97,110,111,116,104,101,114,32,103,114,111,117,112,32,108,101,97,100,101,114,32,116,104,97,110,32>>,{code,[],[<<105,110,105,116>>]},<<46>>]},{p,[],[<<84,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,115,104,111,117,108,100,32,98,101,32,114,97,114,101,108,121,32,99,104,97,110,103,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,105,116,104,32,97,32,115,117,112,101,114,118,105,115,105,111,110,32,116,114,101,101,44,32,98,101,99,97,117,115,101,32,79,84,80,32,97,115,115,117,109,101,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,111,102,32,116,104,101,105,114,32,112,114,111,99,101,115,115,101,115,32,105,115,32,116,104,101,105,114,32,97,112,112,108,105,99,97,116,105,111,110,32,109,97,115,116,101,114,46>>]},{p,[],[<<83,101,116,116,105,110,103,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,108,108,111,119,115,32,116,104,101,32,115,105,103,110,97,108,32,111,114,100,101,114,105,110,103,32,103,117,97,114,97,110,116,101,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<80,114,111,99,101,115,115,101,115,32,67,104,97,112,116,101,114>>]},<<32,105,110,32,116,104,101,32>>,{i,[],[<<69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,114,111,117,112,95,108,101,97,100,101,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,114,111,117,112,95,108,101,97,100,101,114,47,48>>]}]},<<32,97,110,100,32>>,{a,[{href,<<115,121,115,116,101,109,47,100,101,115,105,103,110,95,112,114,105,110,99,105,112,108,101,115,58,97,112,112,108,105,99,97,116,105,111,110,115,35,115,116,111,112,112,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,84,80,32,100,101,115,105,103,110,32,112,114,105,110,99,105,112,108,101,115>>]},<<32,114,101,108,97,116,101,100,32,116,111,32,115,116,97,114,116,105,110,103,32,97,110,100,32,115,116,111,112,112,105,110,103,32,97,112,112,108,105,99,97,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,56,56,54>>,signature => [{attribute,{1178,2},spec,{{group_leader,2},[{type,{1178,19},bounded_fun,[{type,{1178,19},'fun',[{type,{1178,19},product,[{var,{1178,20},'GroupLeader'},{var,{1178,33},'Pid'}]},{atom,{1178,41},true}]},[{type,{1179,7},constraint,[{atom,{1179,7},is_subtype},[{var,{1179,7},'GroupLeader'},{type,{1179,22},pid,[]}]]},{type,{1180,7},constraint,[{atom,{1180,7},is_subtype},[{var,{1180,7},'Pid'},{type,{1180,14},pid,[]}]]}]]}]}}]}},{{function,halt,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1198}],[<<104,97,108,116,47,48>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,104,97,108,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<104,97,108,116,40,48,44,32,91,93,41>>]}]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,104,97,108,116,40,41,46,10,111,115,95,112,114,111,109,112,116,37>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,49,49>>,signature => [{attribute,{1198,2},spec,{{halt,0},[{type,{1198,11},'fun',[{type,{1198,11},product,[]},{type,{1198,17},no_return,[]}]}]}}]}},{{function,halt,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1204}],[<<104,97,108,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,104,97,108,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<104,97,108,116,40,83,116,97,116,117,115,44,32,91,93,41>>]}]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,104,97,108,116,40,49,55,41,46,10,111,115,95,112,114,111,109,112,116,37,32,101,99,104,111,32,36,63,10,49,55,10,111,115,95,112,114,111,109,112,116,37>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,50,52>>,signature => [{attribute,{1204,2},spec,{{halt,1},[{type,{1204,11},bounded_fun,[{type,{1204,11},'fun',[{type,{1204,11},product,[{var,{1204,12},'Status'}]},{type,{1204,23},no_return,[]}]},[{type,{1205,7},constraint,[{atom,{1205,7},is_subtype},[{var,{1205,7},'Status'},{type,{1205,17},union,[{type,{1205,17},non_neg_integer,[]},{atom,{1205,37},abort},{type,{1205,47},string,[]}]}]]}]]}]}}]}},{{function,halt,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1216}],[<<104,97,108,116,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<83,116,97,116,117,115>>]},<<32,109,117,115,116,32,98,101,32,97,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,44,32,97,32,115,116,114,105,110,103,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<97,98,111,114,116>>]},<<46,32,72,97,108,116,115,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,72,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,68,101,112,101,110,100,105,110,103,32,111,110,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,99,99,117,114,115,58>>]},{dl,[],[{dt,[],[<<105,110,116,101,103,101,114,40,41>>]},{dd,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,101,120,105,116,115,32,119,105,116,104,32,105,110,116,101,103,101,114,32,118,97,108,117,101,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<32,97,115,32,115,116,97,116,117,115,32,99,111,100,101,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,101,110,118,105,114,111,110,109,101,110,116,32,40,79,83,41,46>>,{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,110,32,109,97,110,121,32,112,108,97,116,102,111,114,109,115,44,32,116,104,101,32,79,83,32,115,117,112,112,111,114,116,115,32,111,110,108,121,32,115,116,97,116,117,115,32,99,111,100,101,115,32,48,45,50,53,53,46,32,65,32,116,111,111,32,108,97,114,103,101,32,115,116,97,116,117,115,32,99,111,100,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,98,121,32,99,108,101,97,114,105,110,103,32,116,104,101,32,104,105,103,104,32,98,105,116,115,46>>]}]}]},{dt,[],[<<115,116,114,105,110,103,40,41>>]},{dd,[],[<<65,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,32,105,115,32,112,114,111,100,117,99,101,100,32,119,105,116,104,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<32,97,115,32,115,108,111,103,97,110,46,32,84,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,101,120,105,116,115,32,119,105,116,104,32,115,116,97,116,117,115,32,99,111,100,101,32>>,{code,[],[<<49>>]},<<46,32,84,104,101,32,115,116,114,105,110,103,32,119,105,108,108,32,98,101,32,116,114,117,110,99,97,116,101,100,32,105,102,32,108,111,110,103,101,114,32,116,104,97,110,32,50,48,48,32,99,104,97,114,97,99,116,101,114,115,46>>,{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,101,102,111,114,101,32,69,82,84,83,32,57,46,49,32,40,79,84,80,45,50,48,46,49,41,32,111,110,108,121,32,99,111,100,101,32,112,111,105,110,116,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,45,50,53,53,32,119,97,115,32,97,99,99,101,112,116,101,100,32,105,110,32,116,104,101,32,115,116,114,105,110,103,46,32,78,111,119,32,97,110,121,32,117,110,105,99,111,100,101,32,115,116,114,105,110,103,32,105,115,32,118,97,108,105,100,46>>]}]}]},{dt,[],[{code,[],[<<97,98,111,114,116>>]}]},{dd,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,98,111,114,116,115,32,112,114,111,100,117,99,105,110,103,32,97,32,99,111,114,101,32,100,117,109,112,44,32,105,102,32,116,104,97,116,32,105,115,32,101,110,97,98,108,101,100,32,105,110,32,116,104,101,32,79,83,46>>]}]},{p,[],[<<70,111,114,32,105,110,116,101,103,101,114,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<44,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,99,108,111,115,101,115,32,97,108,108,32,112,111,114,116,115,32,97,110,100,32,97,108,108,111,119,115,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,116,111,32,102,105,110,105,115,104,32,116,104,101,105,114,32,111,112,101,114,97,116,105,111,110,115,32,98,101,102,111,114,101,32,101,120,105,116,105,110,103,46,32,84,111,32,101,120,105,116,32,119,105,116,104,111,117,116,32,115,117,99,104,32,102,108,117,115,104,105,110,103,44,32,117,115,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<32,97,115,32>>,{code,[],[<<123,102,108,117,115,104,44,102,97,108,115,101,125>>]},<<46>>]},{p,[],[<<70,111,114,32,115,116,97,116,117,115,101,115,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<32,97,110,100,32>>,{code,[],[<<97,98,111,114,116>>]},<<44,32,111,112,116,105,111,110,32>>,{code,[],[<<102,108,117,115,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,32,97,110,100,32,102,108,117,115,104,105,110,103,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,100,111,110,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,51,56>>,signature => [{attribute,{1216,2},spec,{{halt,2},[{type,{1216,11},bounded_fun,[{type,{1216,11},'fun',[{type,{1216,11},product,[{var,{1216,12},'Status'},{var,{1216,20},'Options'}]},{type,{1216,32},no_return,[]}]},[{type,{1217,7},constraint,[{atom,{1217,7},is_subtype},[{var,{1217,7},'Status'},{type,{1217,17},union,[{type,{1217,17},non_neg_integer,[]},{atom,{1217,37},abort},{type,{1217,47},string,[]}]}]]},{type,{1218,7},constraint,[{atom,{1218,7},is_subtype},[{var,{1218,7},'Options'},{type,{1218,18},list,[{var,{1218,19},'Option'}]}]]},{type,{1219,7},constraint,[{atom,{1219,7},is_subtype},[{var,{1219,7},'Option'},{type,{1219,17},tuple,[{atom,{1219,18},flush},{type,{1219,25},boolean,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,hd,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2196}],[<<104,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,100,32,111,102,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,104,100,40,91,49,44,50,44,51,44,52,44,53,93,41,46,10,49>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,105,115,116>>]},<<32,105,115,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,56,48>>,signature => [{attribute,{2196,2},spec,{{hd,1},[{type,{2196,9},bounded_fun,[{type,{2196,9},'fun',[{type,{2196,9},product,[{var,{2196,10},'List'}]},{type,{2196,19},term,[]}]},[{type,{2197,7},constraint,[{atom,{2197,7},is_subtype},[{var,{2197,7},'List'},{type,{2197,15},nonempty_list,[{type,{2197,16},term,[]}]}]]}]]}]}}]}},{{function,hibernate,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1230}],[<<104,105,98,101,114,110,97,116,101,47,51>>],#{<<101,110>> => [{p,[],[<<80,117,116,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,110,116,111,32,97,32,119,97,105,116,32,115,116,97,116,101,32,119,104,101,114,101,32,105,116,115,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,114,101,100,117,99,101,100,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,101,120,112,101,99,116,32,116,111,32,114,101,99,101,105,118,101,32,97,110,121,32,109,101,115,115,97,103,101,115,32,115,111,111,110,46>>]},{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,105,116,44,32,97,110,100,32,99,111,110,116,114,111,108,32,114,101,115,117,109,101,115,32,105,110,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,119,105,116,104,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<65,114,103,115>>]},<<32,119,105,116,104,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,101,109,112,116,105,101,100,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,32,119,104,101,110,32,116,104,97,116,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46,32,84,104,117,115,32>>,{code,[],[<<101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51>>]},<<32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46,32,84,104,101,32,114,101,115,117,109,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<32,109,117,115,116,32,98,101,32,101,120,112,111,114,116,101,100,32,40>>,{code,[],[<<65,114,105,116,121>>]},<<32,61,58,61,32>>,{code,[],[<<108,101,110,103,116,104,40,65,114,103,115,41>>]},<<41,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,110,121,32,109,101,115,115,97,103,101,32,105,110,32,105,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,44,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,32,105,109,109,101,100,105,97,116,101,108,121,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46>>]},{p,[],[<<73,110,32,109,111,114,101,32,116,101,99,104,110,105,99,97,108,32,116,101,114,109,115,44,32>>,{code,[],[<<101,114,108,97,110,103,58,104,105,98,101,114,110,97,116,101,47,51>>]},<<32,100,105,115,99,97,114,100,115,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,97,110,100,32,116,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,115,32,116,104,101,32,112,114,111,99,101,115,115,46,32,65,102,116,101,114,32,116,104,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,105,110,32,111,110,101,32,99,111,110,116,105,110,117,111,117,115,32,104,101,97,112,46,32,84,104,101,32,104,101,97,112,32,105,115,32,116,104,101,110,32,115,104,114,117,110,107,101,110,32,116,111,32,116,104,101,32,101,120,97,99,116,32,115,97,109,101,32,115,105,122,101,32,97,115,32,116,104,101,32,108,105,118,101,32,100,97,116,97,32,116,104,97,116,32,105,116,32,104,111,108,100,115,32,40,101,118,101,110,32,105,102,32,116,104,97,116,32,115,105,122,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,41,46>>]},{p,[],[<<73,102,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,108,105,118,101,32,100,97,116,97,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,32,116,104,101,32,102,105,114,115,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,99,99,117,114,114,105,110,103,32,97,102,116,101,114,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,119,97,107,101,110,101,100,32,101,110,115,117,114,101,115,32,116,104,97,116,32,116,104,101,32,104,101,97,112,32,115,105,122,101,32,105,115,32,99,104,97,110,103,101,100,32,116,111,32,97,32,115,105,122,101,32,110,111,116,32,115,109,97,108,108,101,114,32,116,104,97,110,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,101,109,112,116,121,105,110,103,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,32,109,101,97,110,115,32,116,104,97,116,32,97,110,121,32,115,117,114,114,111,117,110,100,105,110,103,32>>,{code,[],[<<99,97,116,99,104>>]},<<32,105,115,32,114,101,109,111,118,101,100,32,97,110,100,32,109,117,115,116,32,98,101,32,114,101,45,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,104,105,98,101,114,110,97,116,105,111,110,46,32,79,110,101,32,101,102,102,101,99,116,32,111,102,32,116,104,105,115,32,105,115,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,115,116,97,114,116,101,100,32,117,115,105,110,103,32>>,{code,[],[<<112,114,111,99,95,108,105,98>>]},<<32,40,97,108,115,111,32,105,110,100,105,114,101,99,116,108,121,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<103,101,110,95,115,101,114,118,101,114>>]},<<32,112,114,111,99,101,115,115,101,115,41,44,32,97,114,101,32,116,111,32,117,115,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,112,114,111,99,95,108,105,98,35,104,105,98,101,114,110,97,116,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,95,108,105,98,58,104,105,98,101,114,110,97,116,101,47,51>>]}]},<<32,105,110,115,116,101,97,100,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,32,99,111,110,116,105,110,117,101,115,32,116,111,32,119,111,114,107,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,107,101,115,32,117,112,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,50,57,57,53>>,signature => [{attribute,{1230,2},spec,{{erlang,hibernate,3},[{type,{1230,23},bounded_fun,[{type,{1230,23},'fun',[{type,{1230,23},product,[{var,{1230,24},'Module'},{var,{1230,32},'Function'},{var,{1230,42},'Args'}]},{type,{1230,51},no_return,[]}]},[{type,{1231,7},constraint,[{atom,{1231,7},is_subtype},[{var,{1231,7},'Module'},{type,{1231,17},module,[]}]]},{type,{1232,7},constraint,[{atom,{1232,7},is_subtype},[{var,{1232,7},'Function'},{type,{1232,19},atom,[]}]]},{type,{1233,7},constraint,[{atom,{1233,7},is_subtype},[{var,{1233,7},'Args'},{type,{1233,15},list,[{type,{1233,16},term,[]}]}]]}]]}]}}]}},{{function,insert_element,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1238}],[<<105,110,115,101,114,116,95,101,108,101,109,101,110,116,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,101,119,32,116,117,112,108,101,32,119,105,116,104,32,101,108,101,109,101,110,116,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,110,115,101,114,116,101,100,32,97,116,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,105,110,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<46,32,65,108,108,32,101,108,101,109,101,110,116,115,32,102,114,111,109,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,97,110,100,32,117,112,119,97,114,100,115,32,97,114,101,32,112,117,115,104,101,100,32,111,110,101,32,115,116,101,112,32,104,105,103,104,101,114,32,105,110,32,116,104,101,32,110,101,119,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,50>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,105,110,115,101,114,116,95,101,108,101,109,101,110,116,40,50,44,32,123,111,110,101,44,32,116,119,111,44,32,116,104,114,101,101,125,44,32,110,101,119,41,46,10,123,111,110,101,44,110,101,119,44,116,119,111,44,116,104,114,101,101,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,51,57>>,signature => [{attribute,{1238,2},spec,{{erlang,insert_element,3},[{type,{1238,28},bounded_fun,[{type,{1238,28},'fun',[{type,{1238,28},product,[{var,{1238,29},'Index'},{var,{1238,36},'Tuple1'},{var,{1238,44},'Term'}]},{var,{1238,53},'Tuple2'}]},[{type,{1239,7},constraint,[{atom,{1239,7},is_subtype},[{var,{1239,7},'Index'},{type,{1239,17},pos_integer,[]}]]},{type,{1240,7},constraint,[{atom,{1240,7},is_subtype},[{var,{1240,7},'Tuple1'},{type,{1240,17},tuple,any}]]},{type,{1241,7},constraint,[{atom,{1241,7},is_subtype},[{var,{1241,7},'Tuple2'},{type,{1241,17},tuple,any}]]},{type,{1242,7},constraint,[{atom,{1242,7},is_subtype},[{var,{1242,7},'Term'},{type,{1242,17},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1247}],[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,55,55,41,46,10,60,60,34,55,55,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,53,55>>,signature => [{attribute,{1247,2},spec,{{integer_to_binary,1},[{type,{1247,24},bounded_fun,[{type,{1247,24},'fun',[{type,{1247,24},product,[{var,{1247,25},'Integer'}]},{type,{1247,37},binary,[]}]},[{type,{1248,7},constraint,[{atom,{1248,7},is_subtype},[{var,{1248,7},'Integer'},{type,{1248,18},integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3834}],[<<105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,98,105,110,97,114,121,40,49,48,50,51,44,32,49,54,41,46,10,60,60,34,51,70,70,34,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,54,57>>,signature => [{attribute,{3834,2},spec,{{integer_to_binary,2},[{type,{3834,24},bounded_fun,[{type,{3834,24},'fun',[{type,{3834,24},product,[{var,{3834,25},'Integer'},{var,{3834,34},'Base'}]},{type,{3834,43},binary,[]}]},[{type,{3835,7},constraint,[{atom,{3835,7},is_subtype},[{var,{3835,7},'Integer'},{type,{3835,18},integer,[]}]]},{type,{3836,7},constraint,[{atom,{3836,7},is_subtype},[{var,{3836,7},'Base'},{type,{3836,15},range,[{integer,{3836,15},2},{integer,{3836,18},36}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,integer_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1253}],[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,55,55,41,46,10,34,55,55,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,56,50>>,signature => [{attribute,{1253,2},spec,{{integer_to_list,1},[{type,{1253,22},bounded_fun,[{type,{1253,22},'fun',[{type,{1253,22},product,[{var,{1253,23},'Integer'}]},{type,{1253,35},string,[]}]},[{type,{1254,7},constraint,[{atom,{1254,7},is_subtype},[{var,{1254,7},'Integer'},{type,{1254,18},integer,[]}]]}]]}]}}]}},{{function,integer_to_list,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3828}],[<<105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<73,110,116,101,103,101,114>>]},<<32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,110,116,101,103,101,114,95,116,111,95,108,105,115,116,40,49,48,50,51,44,32,49,54,41,46,10,34,51,70,70,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,48,57,52>>,signature => [{attribute,{3828,2},spec,{{integer_to_list,2},[{type,{3828,22},bounded_fun,[{type,{3828,22},'fun',[{type,{3828,22},product,[{var,{3828,23},'Integer'},{var,{3828,32},'Base'}]},{type,{3828,41},string,[]}]},[{type,{3829,7},constraint,[{atom,{3829,7},is_subtype},[{var,{3829,7},'Integer'},{type,{3829,18},integer,[]}]]},{type,{3830,7},constraint,[{atom,{3830,7},is_subtype},[{var,{3830,7},'Base'},{type,{3830,15},range,[{integer,{3830,15},2},{integer,{3830,18},36}]}]]}]]}]}}]}},{{function,iolist_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1259}],[<<105,111,108,105,115,116,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,44,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,116,104,97,116,32,119,111,117,108,100,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{code,[],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,73,116,101,109,41>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,105,111,108,105,115,116,95,115,105,122,101,40,91,49,44,50,124,60,60,51,44,52,62,62,93,41,46,10,52>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,48,55>>,signature => [{attribute,{1259,2},spec,{{iolist_size,1},[{type,{1259,18},bounded_fun,[{type,{1259,18},'fun',[{type,{1259,18},product,[{var,{1259,19},'Item'}]},{type,{1259,28},non_neg_integer,[]}]},[{type,{1260,7},constraint,[{atom,{1260,7},is_subtype},[{var,{1260,7},'Item'},{type,{1260,15},union,[{type,{1260,15},iolist,[]},{type,{1260,26},binary,[]}]}]]}]]}]}}]}},{{function,iolist_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1265}],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32>>,{code,[],[<<73,111,76,105,115,116,79,114,66,105,110,97,114,121>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,50,48>>,signature => [{attribute,{1265,2},spec,{{iolist_to_binary,1},[{type,{1265,23},bounded_fun,[{type,{1265,23},'fun',[{type,{1265,23},product,[{var,{1265,24},'IoListOrBinary'}]},{type,{1265,43},binary,[]}]},[{type,{1266,7},constraint,[{atom,{1266,7},is_subtype},[{var,{1266,7},'IoListOrBinary'},{type,{1266,25},union,[{type,{1266,25},iolist,[]},{type,{1266,36},binary,[]}]}]]}]]}]}}]}},{{function,iolist_to_iovec,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1271}],[<<105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<105,111,118,101,99>>]},<<32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32>>,{code,[],[<<73,111,76,105,115,116,79,114,66,105,110,97,114,121>>]},<<46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,117,115,101,102,117,108,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,102,108,97,116,116,101,110,32,97,110,32,105,111,108,105,115,116,32,98,117,116,32,121,111,117,32,100,111,32,110,111,116,32,110,101,101,100,32,97,32,115,105,110,103,108,101,32,98,105,110,97,114,121,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,112,97,115,115,105,110,103,32,116,104,101,32,100,97,116,97,32,116,111,32,110,105,102,32,102,117,110,99,116,105,111,110,115,32,115,117,99,104,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,110,105,102,35,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99>>]}]},<<32,111,114,32,100,111,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,46,32,84,104,101,32,97,100,118,97,110,116,97,103,101,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,111,118,101,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<32,105,115,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,111,32,99,111,112,121,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,98,105,110,97,114,121,104,97,110,100,108,105,110,103,35,114,101,102,99,95,98,105,110,97,114,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,37,37,32,73,102,32,121,111,117,32,112,97,115,115,32,115,109,97,108,108,32,98,105,110,97,114,105,101,115,32,97,110,100,32,105,110,116,101,103,101,114,115,32,105,116,32,119,111,114,107,115,32,97,115,32,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,10,62,32,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,91,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62,93,10,37,37,32,73,102,32,121,111,117,32,112,97,115,115,32,108,97,114,103,101,114,32,98,105,110,97,114,105,101,115,44,32,116,104,101,121,32,97,114,101,32,115,112,108,105,116,32,97,110,100,32,114,101,116,117,114,110,101,100,32,105,110,32,97,32,102,111,114,109,10,37,37,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,97,108,108,105,110,103,32,116,104,101,32,67,32,102,117,110,99,116,105,111,110,32,119,114,105,116,101,118,46,10,62,32,101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,105,111,118,101,99,40,91,60,60,49,62,62,44,60,60,50,58,56,48,57,54,62,62,44,60,60,51,58,56,48,57,54,62,62,93,41,46,10,91,60,60,49,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,10,32,32,32,48,44,46,46,46,62,62,44,10,32,60,60,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,10,32,32,32,46,46,46,62,62,44,10,32,60,60,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,46,46,46,62,62,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,51,56>>,signature => [{attribute,{1271,2},spec,{{erlang,iolist_to_iovec,1},[{type,{1271,29},bounded_fun,[{type,{1271,29},'fun',[{type,{1271,29},product,[{var,{1271,30},'IoListOrBinary'}]},{user_type,{1271,49},iovec,[]}]},[{type,{1272,7},constraint,[{atom,{1272,7},is_subtype},[{var,{1272,7},'IoListOrBinary'},{type,{1272,25},union,[{type,{1272,25},iolist,[]},{type,{1272,36},binary,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,49>>}},{{function,is_alive,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1277}],[<<105,115,95,97,108,105,118,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,40,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,97,32,100,105,115,116,114,105,98,117,116,101,100,32,115,121,115,116,101,109,41,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,65,32,110,111,100,101,32,105,115,32,97,108,105,118,101,32,105,102,32,105,116,32,105,115,32,115,116,97,114,116,101,100,32,119,105,116,104,58>>]},{ol,[],[{li,[],[{a,[{href,<<101,114,116,115,58,101,114,108,35,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<34,101,114,108,32,45,110,97,109,101,32,76,79,78,71,78,65,77,69,34>>]}]},<<32,111,114,44>>]},{li,[],[{a,[{href,<<101,114,116,115,58,101,114,108,35,115,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<34,101,114,108,32,45,115,110,97,109,101,32,83,72,79,82,84,78,65,77,69,34>>]}]},<<46>>]}]},{p,[],[<<65,32,110,111,100,101,32,99,97,110,32,97,108,115,111,32,98,101,32,97,108,105,118,101,32,105,102,32,105,116,32,104,97,115,32,103,111,116,32,97,32,110,97,109,101,32,102,114,111,109,32,97,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,110,101,116,95,107,101,114,110,101,108,35,115,116,97,114,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,101,116,95,107,101,114,110,101,108,58,115,116,97,114,116,47,49>>]}]},<<32,97,110,100,32,104,97,115,32,110,111,116,32,98,101,101,110,32,115,116,111,112,112,101,100,32,98,121,32,97,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,110,101,116,95,107,101,114,110,101,108,35,115,116,111,112,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,101,116,95,107,101,114,110,101,108,58,115,116,111,112,47,48>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,55,53>>,signature => [{attribute,{1277,2},spec,{{is_alive,0},[{type,{1277,15},'fun',[{type,{1277,15},product,[]},{type,{1277,21},boolean,[]}]}]}}]}},{{function,is_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2204}],[<<105,115,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32,97,116,111,109,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,49,57,52>>,signature => [{attribute,{2204,2},spec,{{is_atom,1},[{type,{2204,14},bounded_fun,[{type,{2204,14},'fun',[{type,{2204,14},product,[{var,{2204,15},'Term'}]},{type,{2204,24},boolean,[]}]},[{type,{2205,7},constraint,[{atom,{2205,7},is_subtype},[{var,{2205,7},'Term'},{type,{2205,15},term,[]}]]}]]}]}}]}},{{function,is_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2210}],[<<105,115,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,32,98,105,110,97,114,121,32,97,108,119,97,121,115,32,99,111,110,116,97,105,110,115,32,97,32,99,111,109,112,108,101,116,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,48,52>>,signature => [{attribute,{2210,2},spec,{{is_binary,1},[{type,{2210,16},bounded_fun,[{type,{2210,16},'fun',[{type,{2210,16},product,[{var,{2210,17},'Term'}]},{type,{2210,26},boolean,[]}]},[{type,{2211,7},constraint,[{atom,{2211,7},is_subtype},[{var,{2211,7},'Term'},{type,{2211,15},term,[]}]]}]]}]}}]}},{{function,is_bitstring,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2216}],[<<105,115,95,98,105,116,115,116,114,105,110,103,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,98,105,116,115,116,114,105,110,103,32,40,105,110,99,108,117,100,105,110,103,32,97,32,98,105,110,97,114,121,41,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,49,53>>,signature => [{attribute,{2216,2},spec,{{is_bitstring,1},[{type,{2216,19},bounded_fun,[{type,{2216,19},'fun',[{type,{2216,19},product,[{var,{2216,20},'Term'}]},{type,{2216,29},boolean,[]}]},[{type,{2217,7},constraint,[{atom,{2217,7},is_subtype},[{var,{2217,7},'Term'},{type,{2217,15},term,[]}]]}]]}]}}]}},{{function,is_boolean,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2222}],[<<105,115,95,98,111,111,108,101,97,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<116,114,117,101>>]},<<32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,40,116,104,97,116,32,105,115,44,32,97,32,98,111,111,108,101,97,110,41,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,50,53>>,signature => [{attribute,{2222,2},spec,{{is_boolean,1},[{type,{2222,17},bounded_fun,[{type,{2222,17},'fun',[{type,{2222,17},product,[{var,{2222,18},'Term'}]},{type,{2222,27},boolean,[]}]},[{type,{2223,7},constraint,[{atom,{2223,7},is_subtype},[{var,{2223,7},'Term'},{type,{2223,15},term,[]}]]}]]}]}}]}},{{function,is_builtin,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1282}],[<<105,115,95,98,117,105,108,116,105,110,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,117,115,101,102,117,108,32,102,111,114,32,98,117,105,108,100,101,114,115,32,111,102,32,99,114,111,115,115,45,114,101,102,101,114,101,110,99,101,32,116,111,111,108,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<32,105,115,32,97,32,66,73,70,32,105,109,112,108,101,109,101,110,116,101,100,32,105,110,32,67,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,51,54>>,signature => [{attribute,{1282,2},spec,{{erlang,is_builtin,3},[{type,{1282,24},bounded_fun,[{type,{1282,24},'fun',[{type,{1282,24},product,[{var,{1282,25},'Module'},{var,{1282,33},'Function'},{var,{1282,43},'Arity'}]},{type,{1282,53},boolean,[]}]},[{type,{1283,7},constraint,[{atom,{1283,7},is_subtype},[{var,{1283,7},'Module'},{type,{1283,17},module,[]}]]},{type,{1284,7},constraint,[{atom,{1284,7},is_subtype},[{var,{1284,7},'Function'},{type,{1284,19},atom,[]}]]},{type,{1285,7},constraint,[{atom,{1285,7},is_subtype},[{var,{1285,7},'Arity'},{type,{1285,16},arity,[]}]]}]]}]}}]}},{{function,is_float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2228}],[<<105,115,95,102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,52,55>>,signature => [{attribute,{2228,2},spec,{{is_float,1},[{type,{2228,15},bounded_fun,[{type,{2228,15},'fun',[{type,{2228,15},product,[{var,{2228,16},'Term'}]},{type,{2228,25},boolean,[]}]},[{type,{2229,7},constraint,[{atom,{2229,7},is_subtype},[{var,{2229,7},'Term'},{type,{2229,15},term,[]}]]}]]}]}}]}},{{function,is_function,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2234}],[<<105,115,95,102,117,110,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,102,117,110,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,53,55>>,signature => [{attribute,{2234,2},spec,{{is_function,1},[{type,{2234,18},bounded_fun,[{type,{2234,18},'fun',[{type,{2234,18},product,[{var,{2234,19},'Term'}]},{type,{2234,28},boolean,[]}]},[{type,{2235,7},constraint,[{atom,{2235,7},is_subtype},[{var,{2235,7},'Term'},{type,{2235,15},term,[]}]]}]]}]}}]}},{{function,is_function,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2240}],[<<105,115,95,102,117,110,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,102,117,110,32,116,104,97,116,32,99,97,110,32,98,101,32,97,112,112,108,105,101,100,32,119,105,116,104,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,110,117,109,98,101,114,32,111,102,32,97,114,103,117,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,54,55>>,signature => [{attribute,{2240,2},spec,{{is_function,2},[{type,{2240,18},bounded_fun,[{type,{2240,18},'fun',[{type,{2240,18},product,[{var,{2240,19},'Term'},{var,{2240,25},'Arity'}]},{type,{2240,35},boolean,[]}]},[{type,{2241,7},constraint,[{atom,{2241,7},is_subtype},[{var,{2241,7},'Term'},{type,{2241,15},term,[]}]]},{type,{2242,7},constraint,[{atom,{2242,7},is_subtype},[{var,{2242,7},'Arity'},{type,{2242,16},arity,[]}]]}]]}]}}]}},{{function,is_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2247}],[<<105,115,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,55,57>>,signature => [{attribute,{2247,2},spec,{{is_integer,1},[{type,{2247,17},bounded_fun,[{type,{2247,17},'fun',[{type,{2247,17},product,[{var,{2247,18},'Term'}]},{type,{2247,27},boolean,[]}]},[{type,{2248,7},constraint,[{atom,{2248,7},is_subtype},[{var,{2248,7},'Term'},{type,{2248,15},term,[]}]]}]]}]}}]}},{{function,is_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2253}],[<<105,115,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,108,105,115,116,32,119,105,116,104,32,122,101,114,111,32,111,114,32,109,111,114,101,32,101,108,101,109,101,110,116,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,56,57>>,signature => [{attribute,{2253,2},spec,{{is_list,1},[{type,{2253,14},bounded_fun,[{type,{2253,14},'fun',[{type,{2253,14},product,[{var,{2253,15},'Term'}]},{type,{2253,24},boolean,[]}]},[{type,{2254,7},constraint,[{atom,{2254,7},is_subtype},[{var,{2254,7},'Term'},{type,{2254,15},term,[]}]]}]]}]}}]}},{{function,is_map,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2271}],[<<105,115,95,109,97,112,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,109,97,112,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,50,57,57>>,signature => [{attribute,{2271,2},spec,{{is_map,1},[{type,{2271,13},bounded_fun,[{type,{2271,13},'fun',[{type,{2271,13},product,[{var,{2271,14},'Term'}]},{type,{2271,23},boolean,[]}]},[{type,{2272,7},constraint,[{atom,{2272,7},is_subtype},[{var,{2272,7},'Term'},{type,{2272,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,is_map_key,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1290}],[<<105,115,95,109,97,112,95,107,101,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,109,97,112,32>>,{code,[],[<<77,97,112>>]},<<32,99,111,110,116,97,105,110,115,32>>,{code,[],[<<75,101,121>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,116,104,101,32>>,{code,[],[<<75,101,121>>]},<<46>>]},{p,[],[<<84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<123,98,97,100,109,97,112,44,77,97,112,125>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32>>,{code,[],[<<77,97,112>>]},<<32,105,115,32,110,111,116,32,97,32,109,97,112,46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<62,32,77,97,112,32,61,32,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,46,10,35,123,34,52,50,34,32,61,62,32,118,97,108,117,101,125,10,62,32,105,115,95,109,97,112,95,107,101,121,40,34,52,50,34,44,77,97,112,41,46,10,116,114,117,101,10,62,32,105,115,95,109,97,112,95,107,101,121,40,118,97,108,117,101,44,77,97,112,41,46,10,102,97,108,115,101>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,48,57>>,signature => [{attribute,{1290,2},spec,{{is_map_key,2},[{type,{1290,17},bounded_fun,[{type,{1290,17},'fun',[{type,{1290,17},product,[{var,{1290,18},'Key'},{var,{1290,23},'Map'}]},{type,{1290,31},boolean,[]}]},[{type,{1291,5},constraint,[{atom,{1291,5},is_subtype},[{var,{1291,5},'Key'},{type,{1291,12},term,[]}]]},{type,{1292,5},constraint,[{atom,{1292,5},is_subtype},[{var,{1292,5},'Map'},{type,{1292,12},map,any}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,is_number,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2259}],[<<105,115,95,110,117,109,98,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,111,114,32,97,32,102,108,111,97,116,105,110,103,32,112,111,105,110,116,32,110,117,109,98,101,114,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,51,48>>,signature => [{attribute,{2259,2},spec,{{is_number,1},[{type,{2259,16},bounded_fun,[{type,{2259,16},'fun',[{type,{2259,16},product,[{var,{2259,17},'Term'}]},{type,{2259,26},boolean,[]}]},[{type,{2260,7},constraint,[{atom,{2260,7},is_subtype},[{var,{2260,7},'Term'},{type,{2260,15},term,[]}]]}]]}]}}]}},{{function,is_pid,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2265}],[<<105,115,95,112,105,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,52,48>>,signature => [{attribute,{2265,2},spec,{{is_pid,1},[{type,{2265,13},bounded_fun,[{type,{2265,13},'fun',[{type,{2265,13},product,[{var,{2265,14},'Term'}]},{type,{2265,23},boolean,[]}]},[{type,{2266,7},constraint,[{atom,{2266,7},is_subtype},[{var,{2266,7},'Term'},{type,{2266,15},term,[]}]]}]]}]}}]}},{{function,is_port,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2277}],[<<105,115,95,112,111,114,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,53,48>>,signature => [{attribute,{2277,2},spec,{{is_port,1},[{type,{2277,14},bounded_fun,[{type,{2277,14},'fun',[{type,{2277,14},product,[{var,{2277,15},'Term'}]},{type,{2277,24},boolean,[]}]},[{type,{2278,7},constraint,[{atom,{2278,7},is_subtype},[{var,{2278,7},'Term'},{type,{2278,15},term,[]}]]}]]}]}}]}},{{function,is_process_alive,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1297}],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49>>],#{<<101,110>> => [{p,[],[{code,[],[<<80,105,100>>]},<<32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,32,97,110,100,32,105,115,32,97,108,105,118,101,44,32,116,104,97,116,32,105,115,44,32,105,115,32,110,111,116,32,101,120,105,116,105,110,103,32,97,110,100,32,104,97,115,32,110,111,116,32,101,120,105,116,101,100,46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<73,102,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,49>>]},<<32,99,97,108,108,115,32>>,{code,[],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41>>]},<<32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,115,105,103,110,97,108,115,44,32,115,101,110,116,32,102,114,111,109,32>>,{code,[],[<<80,49>>]},<<32,116,111,32>>,{code,[],[<<80,50>>]},<<32,40>>,{code,[],[<<80,50>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,105,100,101,110,116,105,102,105,101,114,32>>,{code,[],[<<80,50,80,105,100>>]},<<41,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,44,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32>>,{code,[],[<<80,50>>]},<<32,98,101,102,111,114,101,32,116,104,101,32,97,108,105,118,101,110,101,115,115,32,111,102,32>>,{code,[],[<<80,50>>]},<<32,105,115,32,99,104,101,99,107,101,100,46,32,84,104,105,115,32,103,117,97,114,97,110,116,101,101,32,109,101,97,110,115,32,116,104,97,116,32,111,110,101,32,99,97,110,32,117,115,101,32>>,{code,[],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49>>]},<<32,116,111,32,108,101,116,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,49>>]},<<32,119,97,105,116,32,117,110,116,105,108,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,50>>]},<<44,32,119,104,105,99,104,32,104,97,115,32,103,111,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,102,114,111,109,32,80,49,44,32,105,115,32,107,105,108,108,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<101,120,105,116,40,80,50,80,105,100,44,32,107,105,108,108,41,44,10,37,32,80,50,32,109,105,103,104,116,32,110,111,116,32,98,101,32,107,105,108,108,101,100,10,105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,40,80,50,80,105,100,41,44,10,37,32,80,50,32,105,115,32,110,111,116,32,97,108,105,118,101,32,40,116,104,101,32,99,97,108,108,32,97,98,111,118,101,32,97,108,119,97,121,115,32,114,101,116,117,114,110,32,102,97,108,115,101,41>>]}]},{p,[],[<<83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,98,111,117,116,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,103,110,97,108,115>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,101,120,105,116,47,50>>]},<<32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,105,103,110,97,108,115,32,97,110,100,32,101,120,105,116,32,115,105,103,110,97,108,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,54,48>>,signature => [{attribute,{1297,2},spec,{{is_process_alive,1},[{type,{1297,23},bounded_fun,[{type,{1297,23},'fun',[{type,{1297,23},product,[{var,{1297,24},'Pid'}]},{type,{1297,32},boolean,[]}]},[{type,{1298,7},constraint,[{atom,{1298,7},is_subtype},[{var,{1298,7},'Pid'},{type,{1298,14},pid,[]}]]}]]}]}}]}},{{function,is_record,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2283}],[<<105,115,95,114,101,99,111,114,100,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,32,97,110,100,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,114,109,97,108,108,121,32,116,104,101,32,99,111,109,112,105,108,101,114,32,116,114,101,97,116,115,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<105,115,95,114,101,99,111,114,100,47,50>>]},<<32,101,115,112,101,99,105,97,108,108,121,46,32,73,116,32,101,109,105,116,115,32,99,111,100,101,32,116,111,32,118,101,114,105,102,121,32,116,104,97,116,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,44,32,116,104,97,116,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,115,105,122,101,32,105,115,32,99,111,114,114,101,99,116,46,32,72,111,119,101,118,101,114,44,32,105,102,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,105,115,32,110,111,116,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,44,32,116,104,101,32,66,73,70,32>>,{code,[],[<<105,115,95,114,101,99,111,114,100,47,50>>]},<<32,105,115,32,99,97,108,108,101,100,32,105,110,115,116,101,97,100,32,97,110,100,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,116,117,112,108,101,32,105,115,32,110,111,116,32,118,101,114,105,102,105,101,100,46>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,44,32,105,102,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,51,57,50>>,signature => [{attribute,{2283,2},spec,{{is_record,2},[{type,{2283,16},bounded_fun,[{type,{2283,16},'fun',[{type,{2283,16},product,[{var,{2283,17},'Term'},{var,{2283,22},'RecordTag'}]},{type,{2283,36},boolean,[]}]},[{type,{2284,7},constraint,[{atom,{2284,7},is_subtype},[{var,{2284,7},'Term'},{type,{2284,15},term,[]}]]},{type,{2285,7},constraint,[{atom,{2285,7},is_subtype},[{var,{2285,7},'RecordTag'},{type,{2285,20},atom,[]}]]}]]}]}}]}},{{function,is_record,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2290}],[<<105,115,95,114,101,99,111,114,100,47,51>>],#{<<101,110>> => [{p,[],[{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,44,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<44,32,97,110,100,32,105,116,115,32,115,105,122,101,32,105,115,32>>,{code,[],[<<83,105,122,101>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,32,105,102,32>>,{code,[],[<<82,101,99,111,114,100,84,97,103>>]},<<32,105,115,32,97,32,108,105,116,101,114,97,108,32,97,116,111,109,32,97,110,100,32>>,{code,[],[<<83,105,122,101>>]},<<32,105,115,32,97,32,108,105,116,101,114,97,108,32,105,110,116,101,103,101,114,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,100,111,99,117,109,101,110,116,101,100,32,102,111,114,32,99,111,109,112,108,101,116,101,110,101,115,115,46,32,85,115,117,97,108,108,121,32>>,{code,[],[<<105,115,95,114,101,99,111,114,100,47,50>>]},<<32,105,115,32,116,111,32,98,101,32,117,115,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,49,51>>,signature => [{attribute,{2290,2},spec,{{is_record,3},[{type,{2290,16},bounded_fun,[{type,{2290,16},'fun',[{type,{2290,16},product,[{var,{2290,17},'Term'},{var,{2290,22},'RecordTag'},{var,{2290,32},'Size'}]},{type,{2290,41},boolean,[]}]},[{type,{2291,7},constraint,[{atom,{2291,7},is_subtype},[{var,{2291,7},'Term'},{type,{2291,15},term,[]}]]},{type,{2292,7},constraint,[{atom,{2292,7},is_subtype},[{var,{2292,7},'RecordTag'},{type,{2292,20},atom,[]}]]},{type,{2293,7},constraint,[{atom,{2293,7},is_subtype},[{var,{2293,7},'Size'},{type,{2293,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,is_reference,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2298}],[<<105,115,95,114,101,102,101,114,101,110,99,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,51,50>>,signature => [{attribute,{2298,2},spec,{{is_reference,1},[{type,{2298,19},bounded_fun,[{type,{2298,19},'fun',[{type,{2298,19},product,[{var,{2298,20},'Term'}]},{type,{2298,29},boolean,[]}]},[{type,{2299,7},constraint,[{atom,{2299,7},is_subtype},[{var,{2299,7},'Term'},{type,{2299,15},term,[]}]]}]]}]}}]}},{{function,is_tuple,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2304}],[<<105,115,95,116,117,112,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32,116,117,112,108,101,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,52,50>>,signature => [{attribute,{2304,2},spec,{{is_tuple,1},[{type,{2304,15},bounded_fun,[{type,{2304,15},'fun',[{type,{2304,15},product,[{var,{2304,16},'Term'}]},{type,{2304,25},boolean,[]}]},[{type,{2305,7},constraint,[{atom,{2305,7},is_subtype},[{var,{2305,7},'Term'},{type,{2305,15},term,[]}]]}]]}]}}]}},{{function,length,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1304}],[<<108,101,110,103,116,104,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,101,110,103,116,104,40,91,49,44,50,44,51,44,52,44,53,44,54,44,55,44,56,44,57,93,41,46,10,57>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,53,50>>,signature => [{attribute,{1304,2},spec,{{length,1},[{type,{1304,13},bounded_fun,[{type,{1304,13},'fun',[{type,{1304,13},product,[{var,{1304,14},'List'}]},{type,{1304,23},non_neg_integer,[]}]},[{type,{1305,7},constraint,[{atom,{1305,7},is_subtype},[{var,{1305,7},'List'},{type,{1305,15},list,[{type,{1305,16},term,[]}]}]]}]]}]}}]}},{{function,link,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1310}],[<<108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,117,112,32,97,110,100,32,97,99,116,105,118,97,116,101,115,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<46,32,87,101,32,119,105,108,108,32,102,114,111,109,32,104,101,114,101,32,111,110,32,99,97,108,108,32,116,104,101,32,105,100,101,110,116,105,102,105,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,108,105,110,107,101,101,46,32,73,102,32,116,104,101,32,108,105,110,107,101,101,32,105,115,32,97,32,112,111,114,116,44,32,105,116,32,109,117,115,116,32,114,101,115,105,100,101,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,46>>]},{p,[],[<<73,102,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,116,105,99,105,112,97,110,116,115,32,111,102,32,97,32,108,105,110,107,32,116,101,114,109,105,110,97,116,101,115,44,32,105,116,32,119,105,108,108,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,101,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108>>]},<<32,116,111,32,116,104,101,32,111,116,104,101,114,32,112,97,114,116,105,99,105,112,97,110,116,46,32,84,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,108,108,32,99,111,110,116,97,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,108,105,110,107,95,101,120,105,116,95,115,105,103,110,97,108,95,114,101,97,115,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,120,105,116,32,114,101,97,115,111,110>>]},<<32,111,102,32,116,104,101,32,116,101,114,109,105,110,97,116,101,100,32,112,97,114,116,105,99,105,112,97,110,116,46,32,79,116,104,101,114,32,99,97,115,101,115,32,119,104,101,110,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,114,101,32,116,114,105,103,103,101,114,101,100,32,100,117,101,32,116,111,32,97,32,108,105,110,107,32,97,114,101,32,119,104,101,110,32,110,111,32,108,105,110,107,101,101,32,101,120,105,115,116,32,40>>,{code,[],[<<110,111,112,114,111,99>>]},<<32,101,120,105,116,32,114,101,97,115,111,110,41,32,97,110,100,32,119,104,101,110,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,32,111,110,32,100,105,102,102,101,114,101,110,116,32,110,111,100,101,115,32,105,115,32,108,111,115,116,32,111,114,32,99,97,110,110,111,116,32,98,101,32,101,115,116,97,98,108,105,115,104,101,100,32,40>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,101,120,105,116,32,114,101,97,115,111,110,41,46>>]},{p,[],[<<65,110,32,101,120,105,115,116,105,110,103,32,108,105,110,107,32,99,97,110,32,98,101,32,114,101,109,111,118,101,100,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,108,105,110,107,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,108,105,110,107,47,49>>]}]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,108,105,110,107,115,32,97,110,100,32,101,120,105,116,32,115,105,103,110,97,108,115,32,100,117,101,32,116,111,32,108,105,110,107,115,44,32,115,101,101,32,116,104,101,32>>,{i,[],[<<80,114,111,99,101,115,115,101,115>>]},<<32,99,104,97,112,116,101,114,32,105,110,32,116,104,101,32>>,{i,[],[<<69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108>>]},<<58>>]},{ul,[],[{li,[],[{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,108,105,110,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<76,105,110,107,115>>]}]},{li,[],[{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<83,101,110,100,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115>>]}]},{li,[],[{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,114,101,99,101,105,118,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,99,101,105,118,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115>>]}]}]},{p,[],[<<70,111,114,32,104,105,115,116,111,114,105,99,97,108,32,114,101,97,115,111,110,115,44,32>>,{code,[],[<<108,105,110,107,47,49>>]},<<32,104,97,115,32,97,32,115,116,114,97,110,103,101,32,115,101,109,105,45,115,121,110,99,104,114,111,110,111,117,115,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,116,104,101,32,108,105,110,107,101,101,32,101,120,105,115,116,115,32,111,114,32,110,111,116,44,32,97,110,100,32,116,104,101,32,99,97,108,108,101,114,32,100,111,101,115,32,110,111,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,114,97,112,32,101,120,105,116,115>>]},<<46,32,73,102,32,116,104,101,32,97,98,111,118,101,32,105,115,32,116,114,117,101,32,97,110,100,32,116,104,101,32,108,105,110,107,101,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32>>,{code,[],[<<108,105,110,107,47,49>>]},<<32,119,105,108,108,32,114,97,105,115,101,32,97,32>>,{code,[],[<<110,111,112,114,111,99>>]},<<32,101,114,114,111,114,32>>,{em,[],[<<101,120,99,101,112,116,105,111,110>>]},<<46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,98,101,104,97,118,105,111,114,32,119,111,117,108,100,32,105,110,115,116,101,97,100,32,104,97,118,101,32,98,101,101,110,32,116,104,97,116,32>>,{code,[],[<<108,105,110,107,47,49>>]},<<32,114,101,116,117,114,110,101,100,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,97,110,100,32,116,104,101,32,99,97,108,108,101,114,32,108,97,116,101,114,32,119,97,115,32,115,101,110,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32>>,{code,[],[<<110,111,112,114,111,99>>]},<<32,101,120,105,116,32,114,101,97,115,111,110,44,32,98,117,116,32,116,104,105,115,32,105,115,32,117,110,102,111,114,116,117,110,97,116,101,108,121,32,110,111,116,32,116,104,101,32,99,97,115,101,46,32,84,104,101,32>>,{code,[],[<<110,111,112,114,111,99>>]},<<32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115,35,101,120,99,101,112,116,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,120,99,101,112,116,105,111,110>>]},<<32,105,115,32,110,111,116,32,116,111,32,98,101,32,99,111,110,102,117,115,101,100,32,119,105,116,104,32,97,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,120,105,116,32,115,105,103,110,97,108>>]},<<32,119,105,116,104,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,112,114,111,99>>]},<<46,32,67,117,114,114,101,110,116,108,121,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,116,104,101,32,108,105,110,107,101,101,32,101,120,105,115,116,115,32,119,104,101,110,32,105,116,32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,114,101,115,105,100,101,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<84,104,101,32,108,105,110,107,32,115,101,116,117,112,32,97,110,100,32,97,99,116,105,118,97,116,105,111,110,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,102,32,116,104,101,32,108,105,110,107,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,44,32,111,114,32,105,102,32,116,104,101,32,99,97,108,108,101,114,32,97,116,116,101,109,112,116,115,32,116,111,32,99,114,101,97,116,101,32,97,32,108,105,110,107,32,116,111,32,105,116,115,101,108,102,44,32,110,111,116,104,105,110,103,32,105,115,32,100,111,110,101,46,32,65,32,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,35,108,105,110,107,95,112,114,111,116,111,99,111,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<108,105,110,107,32,112,114,111,116,111,99,111,108>>]},<<32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{i,[],[<<68,105,115,116,114,105,98,117,116,105,111,110,32,80,114,111,116,111,99,111,108>>]},<<32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32>>,{i,[],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58>>]},{ul,[],[{li,[],[{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,105,100,101,110,116,105,102,121,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,111,114,116,46>>]},{li,[],[{code,[],[<<110,111,112,114,111,99>>]},<<32,108,105,110,107,101,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,110,100,32,105,116,32,105,115,32,34,99,104,101,97,112,34,32,116,111,32,99,104,101,99,107,32,105,102,32,105,116,32,101,120,105,115,116,115,32,97,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,52,54,52>>,signature => [{attribute,{1310,2},spec,{{link,1},[{type,{1310,11},bounded_fun,[{type,{1310,11},'fun',[{type,{1310,11},product,[{var,{1310,12},'PidOrPort'}]},{atom,{1310,26},true}]},[{type,{1311,7},constraint,[{atom,{1311,7},is_subtype},[{var,{1311,7},'PidOrPort'},{type,{1311,20},union,[{type,{1311,20},pid,[]},{type,{1311,28},port,[]}]}]]}]]}]}}]}},{{function,list_to_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1316}],[<<108,105,115,116,95,116,111,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,50,48,44,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,109,97,121,32,99,111,110,116,97,105,110,32,97,110,121,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,46,32,69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,97,108,108,111,119,101,100,32,111,110,108,121,32,73,83,79,45,108,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,116,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,100,105,100,32,110,111,116,32,97,108,108,111,119,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,98,111,118,101,32,50,53,53,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,97,110,32,97,116,111,109,32,110,97,109,101,32,105,115,32,108,105,109,105,116,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,99,111,110,102,105,103,117,114,97,98,108,101,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,101,120,105,115,116,32,97,110,100,32,97,116,111,109,115,32,97,114,101,32,110,111,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,110,115,105,100,101,114,32,105,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>]}]},<<32,105,115,32,97,32,98,101,116,116,101,114,32,111,112,116,105,111,110,32,116,104,97,110,32>>,{code,[],[<<108,105,115,116,95,116,111,95,97,116,111,109,47,49>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,108,105,109,105,116,115,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,102,102,105,99,105,101,110,99,121,32,103,117,105,100,101,32,40,115,101,99,116,105,111,110,32,65,100,118,97,110,99,101,100,41>>]},<<46>>]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,97,116,111,109,40,34,69,114,108,97,110,103,34,41,46,10,39,69,114,108,97,110,103,39>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,52,56>>,signature => [{attribute,{1316,2},spec,{{list_to_atom,1},[{type,{1316,19},bounded_fun,[{type,{1316,19},'fun',[{type,{1316,19},product,[{var,{1316,20},'String'}]},{type,{1316,31},atom,[]}]},[{type,{1317,7},constraint,[{atom,{1317,7},is_subtype},[{var,{1317,7},'String'},{type,{1317,17},string,[]}]]}]]}]}}]}},{{function,list_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1322}],[<<108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,32,105,110,32>>,{code,[],[<<73,111,76,105,115,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,62,62,46,10,60,60,54,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,56,49>>,signature => [{attribute,{1322,2},spec,{{list_to_binary,1},[{type,{1322,21},bounded_fun,[{type,{1322,21},'fun',[{type,{1322,21},product,[{var,{1322,22},'IoList'}]},{type,{1322,33},binary,[]}]},[{type,{1323,7},constraint,[{atom,{1323,7},is_subtype},[{var,{1323,7},'IoList'},{type,{1323,17},iolist,[]}]]}]]}]}}]}},{{function,list_to_bitstring,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1328}],[<<108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<98,105,116,115,116,114,105,110,103,95,108,105,115,116>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,116,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,116,115,116,114,105,110,103,115,32,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103,76,105,115,116>>]},<<46,32,40,84,104,101,32,108,97,115,116,32,116,97,105,108,32,105,110,32>>,{code,[],[<<66,105,116,115,116,114,105,110,103,76,105,115,116>>]},<<32,105,115,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,32,98,105,116,115,116,114,105,110,103,46,41,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,105,110,49,32,61,32,60,60,49,44,50,44,51,62,62,46,10,60,60,49,44,50,44,51,62,62,10,62,32,66,105,110,50,32,61,32,60,60,52,44,53,62,62,46,10,60,60,52,44,53,62,62,10,62,32,66,105,110,51,32,61,32,60,60,54,44,55,58,52,62,62,46,10,60,60,54,44,55,58,52,62,62,10,62,32,108,105,115,116,95,116,111,95,98,105,116,115,116,114,105,110,103,40,91,66,105,110,49,44,49,44,91,50,44,51,44,66,105,110,50,93,44,52,124,66,105,110,51,93,41,46,10,60,60,49,44,50,44,51,44,49,44,50,44,51,44,52,44,53,44,52,44,54,44,55,58,52,62,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,53,57,57>>,signature => [{attribute,{1328,2},spec,{{list_to_bitstring,1},[{type,{1328,24},bounded_fun,[{type,{1328,24},'fun',[{type,{1328,24},product,[{var,{1328,25},'BitstringList'}]},{type,{1328,43},bitstring,[]}]},[{type,{1329,7},constraint,[{atom,{1329,7},is_subtype},[{var,{1329,7},'BitstringList'},{user_type,{1329,24},bitstring_list,[]}]]}]]}]}}]}},{{function,list_to_existing_atom,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1334}],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,32,115,117,99,104,32,97,116,111,109,46,32,65,110,32,97,116,111,109,32,101,120,105,115,116,115,32,105,102,32,105,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,116,104,101,32,114,117,110,45,116,105,109,101,32,115,121,115,116,101,109,32,98,121,32,101,105,116,104,101,114,32,108,111,97,100,105,110,103,32,99,111,100,101,32,111,114,32,99,114,101,97,116,105,110,103,32,97,32,116,101,114,109,32,105,110,32,119,104,105,99,104,32,116,104,101,32,97,116,111,109,32,105,115,32,112,97,114,116,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,114,101,32,100,111,101,115,32,110,111,116,32,97,108,114,101,97,100,121,32,101,120,105,115,116,32,97,110,32,97,116,111,109,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,99,111,109,112,105,108,101,114,32,109,97,121,32,111,112,116,105,109,105,122,101,32,97,119,97,121,32,97,116,111,109,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,32,114,101,119,114,105,116,101,32>>,{code,[],[<<97,116,111,109,95,116,111,95,108,105,115,116,40,115,111,109,101,95,97,116,111,109,41>>]},<<32,116,111,32>>,{code,[],[<<34,115,111,109,101,95,97,116,111,109,34>>]},<<46,32,73,102,32,116,104,97,116,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,110,116,105,111,110,32,111,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,111,109,101,95,97,116,111,109>>]},<<32,105,110,32,116,104,101,32,99,111,110,116,97,105,110,105,110,103,32,109,111,100,117,108,101,44,32,116,104,101,32,97,116,111,109,32,119,105,108,108,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,100,117,108,101,32,105,115,32,108,111,97,100,101,100,44,32,97,110,100,32,97,32,115,117,98,115,101,113,117,101,110,116,32,99,97,108,108,32,116,111,32>>,{code,[],[<<108,105,115,116,95,116,111,95,101,120,105,115,116,105,110,103,95,97,116,111,109,40,34,115,111,109,101,95,97,116,111,109,34,41>>]},<<32,119,105,108,108,32,102,97,105,108,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,50,48>>,signature => [{attribute,{1334,2},spec,{{list_to_existing_atom,1},[{type,{1334,28},bounded_fun,[{type,{1334,28},'fun',[{type,{1334,28},product,[{var,{1334,29},'String'}]},{type,{1334,40},atom,[]}]},[{type,{1335,7},constraint,[{atom,{1335,7},is_subtype},[{var,{1335,7},'String'},{type,{1335,17},string,[]}]]}]]}]}}]}},{{function,list_to_float,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1340}],[<<108,105,115,116,95,116,111,95,102,108,111,97,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,102,108,111,97,116,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,102,108,111,97,116,40,34,50,46,50,48,49,55,55,54,52,101,43,48,34,41,46,10,50,46,50,48,49,55,55,54,52>>]}]},{p,[],[<<84,104,101,32,102,108,111,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,102,111,114,109,97,116,32,102,111,114,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,102,108,111,97,116,32,108,105,116,101,114,97,108,115>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,97,116,32,117,110,100,101,114,115,99,111,114,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,102,108,111,97,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,52,51>>,signature => [{attribute,{1340,2},spec,{{list_to_float,1},[{type,{1340,20},bounded_fun,[{type,{1340,20},'fun',[{type,{1340,20},product,[{var,{1340,21},'String'}]},{type,{1340,32},float,[]}]},[{type,{1341,7},constraint,[{atom,{1341,7},is_subtype},[{var,{1341,7},'String'},{type,{1341,17},string,[]}]]}]]}]}}]}},{{function,list_to_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1346}],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,49,50,51,34,41,46,10,49,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,49,50,51,34,41,46,10,45,49,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52,34,41,46,10,49,50,51,50,51,52,57,56,50,51,48,52,57,56,50,51,48,57,52,56,50,48,57,51,56,51,51,50,51,52,50,51,52>>]}]},{p,[],[{code,[],[<<83,116,114,105,110,103>>]},<<32,109,117,115,116,32,99,111,110,116,97,105,110,32,97,116,32,108,101,97,115,116,32,111,110,101,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32,99,97,110,32,104,97,118,101,32,97,110,32,111,112,116,105,111,110,97,108,32,112,114,101,102,105,120,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32,97,32,115,105,110,103,108,101,32,34>>,{code,[],[<<43>>]},<<34,32,111,114,32,34>>,{code,[],[<<45>>]},<<34,32,99,104,97,114,97,99,116,101,114,32,40,116,104,97,116,32,105,115,44,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32>>,{code,[],[<<34,94,91,43,45,93,63,91,48,45,57,93,43,36,34>>]},<<41,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,54,49>>,signature => [{attribute,{1346,2},spec,{{list_to_integer,1},[{type,{1346,22},bounded_fun,[{type,{1346,22},'fun',[{type,{1346,22},product,[{var,{1346,23},'String'}]},{type,{1346,34},integer,[]}]},[{type,{1347,7},constraint,[{atom,{1347,7},is_subtype},[{var,{1347,7},'String'},{type,{1347,17},string,[]}]]}]]}]}}]}},{{function,list_to_integer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1352}],[<<108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,110,32,98,97,115,101,32>>,{code,[],[<<66,97,115,101>>]},<<32,105,115,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,43,51,70,70,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,102,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,51,102,70,34,44,32,49,54,41,46,10,49,48,50,51>>]}]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,105,110,116,101,103,101,114,40,34,45,51,70,70,34,44,32,49,54,41,46,10,45,49,48,50,51>>]}]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32>>,{code,[],[<<66,97,115,101>>]},<<32,105,115,32,49,54,44,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32>>,{code,[],[<<34,94,91,43,45,93,63,40,91,48,45,57,93,124,91,65,45,70,93,124,91,97,45,102,93,41,43,36,34>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,54,56,54>>,signature => [{attribute,{1352,2},spec,{{list_to_integer,2},[{type,{1352,22},bounded_fun,[{type,{1352,22},'fun',[{type,{1352,22},product,[{var,{1352,23},'String'},{var,{1352,31},'Base'}]},{type,{1352,40},integer,[]}]},[{type,{1353,7},constraint,[{atom,{1353,7},is_subtype},[{var,{1353,7},'String'},{type,{1353,17},string,[]}]]},{type,{1354,7},constraint,[{atom,{1354,7},is_subtype},[{var,{1354,7},'Base'},{type,{1354,15},range,[{integer,{1354,15},2},{integer,{1354,18},36}]}]]}]]}]}}]}},{{function,list_to_pid,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1359}],[<<108,105,115,116,95,116,111,95,112,105,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,112,105,100,40,34,60,48,46,52,46,49,62,34,41,46,10,60,48,46,52,46,49,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,55,49,54>>,signature => [{attribute,{1359,2},spec,{{list_to_pid,1},[{type,{1359,18},bounded_fun,[{type,{1359,18},'fun',[{type,{1359,18},product,[{var,{1359,19},'String'}]},{type,{1359,30},pid,[]}]},[{type,{1360,7},constraint,[{atom,{1360,7},is_subtype},[{var,{1360,7},'String'},{type,{1360,17},string,[]}]]}]]}]}}]}},{{function,list_to_port,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1365}],[<<108,105,115,116,95,116,111,95,112,111,114,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,112,111,114,116,40,34,35,80,111,114,116,60,48,46,52,62,34,41,46,10,35,80,111,114,116,60,48,46,52,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,55,51,52>>,signature => [{attribute,{1365,2},spec,{{list_to_port,1},[{type,{1365,19},bounded_fun,[{type,{1365,19},'fun',[{type,{1365,19},product,[{var,{1365,20},'String'}]},{type,{1365,31},port,[]}]},[{type,{1366,7},constraint,[{atom,{1366,7},is_subtype},[{var,{1366,7},'String'},{type,{1366,17},string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_ref,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1371}],[<<108,105,115,116,95,116,111,95,114,101,102,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,114,101,102,101,114,101,110,99,101,32,119,104,111,115,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,97,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,114,101,102,40,34,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62,34,41,46,10,35,82,101,102,60,48,46,52,49,57,50,53,51,55,54,55,56,46,52,48,55,51,49,57,51,52,55,53,46,55,49,49,56,49,62>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<83,116,114,105,110,103>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,98,97,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,97,32,114,101,102,101,114,101,110,99,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,55,53,50>>,signature => [{attribute,{1371,2},spec,{{list_to_ref,1},[{type,{1371,18},bounded_fun,[{type,{1371,18},'fun',[{type,{1371,18},product,[{var,{1371,19},'String'}]},{type,{1371,30},reference,[]}]},[{type,{1372,7},constraint,[{atom,{1372,7},is_subtype},[{var,{1372,7},'String'},{type,{1372,17},string,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,list_to_tuple,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1377}],[<<108,105,115,116,95,116,111,95,116,117,112,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101>>]},{pre,[],[{code,[],[<<62,32,108,105,115,116,95,116,111,95,116,117,112,108,101,40,91,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,93,41,46,10,123,115,104,97,114,101,44,32,91,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,93,125>>]}]},{p,[],[{code,[],[<<76,105,115,116>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,55,55,48>>,signature => [{attribute,{1377,2},spec,{{list_to_tuple,1},[{type,{1377,20},bounded_fun,[{type,{1377,20},'fun',[{type,{1377,20},product,[{var,{1377,21},'List'}]},{type,{1377,30},tuple,any}]},[{type,{1378,7},constraint,[{atom,{1378,7},is_subtype},[{var,{1378,7},'List'},{type,{1378,15},list,[{type,{1378,16},term,[]}]}]]}]]}]}}]}},{{function,load_module,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2309}],[<<108,111,97,100,95,109,111,100,117,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<44,32,116,104,105,115,32,66,73,70,32,108,111,97,100,115,32,116,104,97,116,32,111,98,106,101,99,116,32,99,111,100,101,46,32,73,102,32,116,104,101,32,99,111,100,101,32,102,111,114,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,44,32,97,108,108,32,101,120,112,111,114,116,32,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,114,101,112,108,97,99,101,100,32,115,111,32,116,104,101,121,32,112,111,105,110,116,32,116,111,32,116,104,101,32,110,101,119,108,121,32,108,111,97,100,101,100,32,99,111,100,101,46,32,84,104,101,32,112,114,101,118,105,111,117,115,108,121,32,108,111,97,100,101,100,32,99,111,100,101,32,105,115,32,107,101,112,116,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,97,115,32,111,108,100,32,99,111,100,101,44,32,97,115,32,116,104,101,114,101,32,99,97,110,32,115,116,105,108,108,32,98,101,32,112,114,111,99,101,115,115,101,115,32,101,120,101,99,117,116,105,110,103,32,116,104,97,116,32,99,111,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,101,105,116,104,101,114,32>>,{code,[],[<<123,109,111,100,117,108,101,44,32,77,111,100,117,108,101,125>>]},<<44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,102,105,108,101>>]}]},{dd,[],[<<84,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,105,110,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,104,97,115,32,97,110,32,105,110,99,111,114,114,101,99,116,32,102,111,114,109,97,116,32>>,{em,[],[<<111,114>>]},<<32,116,104,101,32,111,98,106,101,99,116,32,99,111,100,101,32,99,111,110,116,97,105,110,115,32,99,111,100,101,32,102,111,114,32,97,110,111,116,104,101,114,32,109,111,100,117,108,101,32,116,104,97,110,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,116,95,112,117,114,103,101,100>>]}]},{dd,[],[{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,108,111,97,100,101,100,32,98,101,99,97,117,115,101,32,111,108,100,32,99,111,100,101,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46>>]},{dt,[],[{code,[],[<<111,110,95,108,111,97,100>>]}]},{dd,[],[<<84,104,101,32,99,111,100,101,32,105,110,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,111,110,116,97,105,110,115,32,97,110,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,100,101,99,108,97,114,97,116,105,111,110,32,116,104,97,116,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,99,97,110,32,98,101,99,111,109,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,111,100,101,46,32,65,110,121,32,112,114,101,118,105,111,117,115,32,99,117,114,114,101,110,116,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,119,105,108,108,32,114,101,109,97,105,110,32,117,110,116,105,108,32,116,104,101,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,99,97,108,108,32,104,97,115,32,102,105,110,105,115,104,101,100,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,55,56,51>>,signature => [{attribute,{2309,2},spec,{{load_module,2},[{type,{2309,18},bounded_fun,[{type,{2309,18},'fun',[{type,{2309,18},product,[{var,{2309,19},'Module'},{var,{2309,27},'Binary'}]},{type,{2309,38},union,[{type,{2309,38},tuple,[{atom,{2309,39},module},{var,{2309,47},'Module'}]},{type,{2309,57},tuple,[{atom,{2309,58},error},{var,{2309,65},'Reason'}]}]}]},[{type,{2310,7},constraint,[{atom,{2310,7},is_subtype},[{var,{2310,7},'Module'},{type,{2310,17},module,[]}]]},{type,{2311,7},constraint,[{atom,{2311,7},is_subtype},[{var,{2311,7},'Binary'},{type,{2311,17},binary,[]}]]},{type,{2312,7},constraint,[{atom,{2312,7},is_subtype},[{var,{2312,7},'Reason'},{type,{2312,17},union,[{atom,{2312,17},badfile},{atom,{2312,27},not_purged},{atom,{2312,40},on_load}]}]]}]]}]}}]}},{{function,load_nif,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2330}],[<<108,111,97,100,95,110,105,102,47,50>>],#{<<101,110>> => [{p,[],[<<76,111,97,100,115,32,97,110,100,32,108,105,110,107,115,32,97,32,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,101,100,32,102,117,110,99,116,105,111,110,115,32,40,78,73,70,115,41,32,102,111,114,32,97,32,109,111,100,117,108,101,46,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,97,32,102,105,108,101,32,112,97,116,104,32,116,111,32,116,104,101,32,115,104,97,114,101,97,98,108,101,32,111,98,106,101,99,116,47,100,121,110,97,109,105,99,32,108,105,98,114,97,114,121,32,102,105,108,101,32,109,105,110,117,115,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,102,105,108,101,32,101,120,116,101,110,115,105,111,110,32,40>>,{code,[],[<<46,115,111>>]},<<32,102,111,114,32,85,110,105,120,32,97,110,100,32>>,{code,[],[<<46,100,108,108>>]},<<32,102,111,114,32,87,105,110,100,111,119,115,41,46,32,78,111,116,105,99,101,32,116,104,97,116,32,111,110,32,109,111,115,116,32,79,83,115,32,116,104,101,32,108,105,98,114,97,114,121,32,104,97,115,32,116,111,32,104,97,118,101,32,97,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,32,111,110,32,100,105,115,99,32,119,104,101,110,32,97,110,32,117,112,103,114,97,100,101,32,111,102,32,116,104,101,32,110,105,102,32,105,115,32,100,111,110,101,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,116,104,101,32,115,97,109,101,44,32,98,117,116,32,116,104,101,32,99,111,110,116,101,110,116,115,32,100,105,102,102,101,114,44,32,116,104,101,32,111,108,100,32,108,105,98,114,97,114,121,32,109,97,121,32,98,101,32,108,111,97,100,101,100,32,105,110,115,116,101,97,100,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,105,109,112,108,101,109,101,110,116,32,97,32,78,73,70,32,108,105,98,114,97,114,121,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,110,105,102>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,108,95,110,105,102,40,51,41>>]}]},<<46>>]},{p,[],[{code,[],[<<76,111,97,100,73,110,102,111>>]},<<32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46,32,73,116,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,108,105,98,114,97,114,121,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,105,110,105,116,105,97,108,105,122,97,116,105,111,110,46,32,65,32,103,111,111,100,32,112,114,97,99,116,105,99,101,32,105,115,32,116,111,32,105,110,99,108,117,100,101,32,97,32,109,111,100,117,108,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,116,111,32,115,117,112,112,111,114,116,32,102,117,116,117,114,101,32,99,111,100,101,32,117,112,103,114,97,100,101,32,115,99,101,110,97,114,105,111,115,46>>]},{p,[],[<<84,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<108,111,97,100,95,110,105,102,47,50>>]},<<32,109,117,115,116,32,98,101,32,109,97,100,101,32>>,{em,[],[<<100,105,114,101,99,116,108,121>>]},<<32,102,114,111,109,32,116,104,101,32,69,114,108,97,110,103,32,99,111,100,101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32,116,104,97,116,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,98,101,108,111,110,103,115,32,116,111,46,32,73,116,32,114,101,116,117,114,110,115,32,101,105,116,104,101,114,32>>,{code,[],[<<111,107>>]},<<44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,123,82,101,97,115,111,110,44,84,101,120,116,125,125>>]},<<32,105,102,32,108,111,97,100,105,110,103,32,102,97,105,108,115,46,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,32,119,104,105,108,101,32>>,{code,[],[<<84,101,120,116>>]},<<32,105,115,32,97,32,104,117,109,97,110,32,114,101,97,100,97,98,108,101,32,115,116,114,105,110,103,32,116,104,97,116,32,99,97,110,32,103,105,118,101,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,97,105,108,117,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,111,97,100,95,102,97,105,108,101,100>>]}]},{dd,[],[<<84,104,101,32,79,83,32,102,97,105,108,101,100,32,116,111,32,108,111,97,100,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,46>>]},{dt,[],[{code,[],[<<98,97,100,95,108,105,98>>]}]},{dd,[],[<<84,104,101,32,108,105,98,114,97,114,121,32,100,105,100,32,110,111,116,32,102,117,108,102,105,108,108,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,97,115,32,97,32,78,73,70,32,108,105,98,114,97,114,121,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,109,111,100,117,108,101,46>>]},{dt,[],[{code,[],[<<108,111,97,100,32,124,32,117,112,103,114,97,100,101>>]}]},{dd,[],[<<84,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,98,114,97,114,121,32,99,97,108,108,98,97,99,107,32,119,97,115,32,117,110,115,117,99,99,101,115,115,102,117,108,46>>]},{dt,[],[{code,[],[<<114,101,108,111,97,100>>]}]},{dd,[],[<<65,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,97,108,114,101,97,100,121,32,108,111,97,100,101,100,32,102,111,114,32,116,104,105,115,32,109,111,100,117,108,101,32,105,110,115,116,97,110,99,101,46,32,84,104,101,32,112,114,101,118,105,111,117,115,108,121,32,100,101,112,114,101,99,97,116,101,100,32>>,{code,[],[<<114,101,108,111,97,100>>]},<<32,102,101,97,116,117,114,101,32,119,97,115,32,114,101,109,111,118,101,100,32,105,110,32,79,84,80,32,50,48,46>>]},{dt,[],[{code,[],[<<111,108,100,95,99,111,100,101>>]}]},{dd,[],[<<84,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<108,111,97,100,95,110,105,102,47,50>>]},<<32,119,97,115,32,109,97,100,101,32,102,114,111,109,32,116,104,101,32,111,108,100,32,99,111,100,101,32,111,102,32,97,32,109,111,100,117,108,101,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,117,112,103,114,97,100,101,100,59,32,116,104,105,115,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,50,51>>,signature => [{attribute,{2330,2},spec,{{erlang,load_nif,2},[{type,{2330,22},bounded_fun,[{type,{2330,22},'fun',[{type,{2330,22},product,[{var,{2330,23},'Path'},{var,{2330,29},'LoadInfo'}]},{type,{2330,43},union,[{atom,{2330,43},ok},{var,{2330,48},'Error'}]}]},[{type,{2331,7},constraint,[{atom,{2331,7},is_subtype},[{var,{2331,7},'Path'},{type,{2331,15},string,[]}]]},{type,{2332,7},constraint,[{atom,{2332,7},is_subtype},[{var,{2332,7},'LoadInfo'},{type,{2332,19},term,[]}]]},{type,{2333,7},constraint,[{atom,{2333,7},is_subtype},[{var,{2333,7},'Error'},{type,{2333,16},tuple,[{atom,{2333,17},error},{type,{2333,24},tuple,[{var,{2333,25},'Reason'},{ann_type,{2333,33},[{var,{2333,33},'Text'},{type,{2333,41},string,[]}]}]}]}]]},{type,{2334,7},constraint,[{atom,{2334,7},is_subtype},[{var,{2334,7},'Reason'},{type,{2334,17},union,[{atom,{2334,17},load_failed},{atom,{2334,31},bad_lib},{atom,{2334,41},load},{atom,{2334,48},reload},{atom,{2334,57},upgrade},{atom,{2334,67},old_code}]}]]}]]}]}}]}},{{function,loaded,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1383}],[<<108,111,97,100,101,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,108,111,97,100,101,100,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,40,99,117,114,114,101,110,116,32,97,110,100,32,111,108,100,32,99,111,100,101,41,44,32,105,110,99,108,117,100,105,110,103,32,112,114,101,108,111,97,100,101,100,32,109,111,100,117,108,101,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,55,50>>,signature => [{attribute,{1383,2},spec,{{erlang,loaded,0},[{type,{1383,20},bounded_fun,[{type,{1383,20},'fun',[{type,{1383,20},product,[]},{type,{1383,26},list,[{var,{1383,27},'Module'}]}]},[{type,{1384,7},constraint,[{atom,{1384,7},is_subtype},[{var,{1384,7},'Module'},{type,{1384,17},module,[]}]]}]]}]}}]}},{{function,localtime,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1389}],[<<108,111,99,97,108,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,44,32>>,{code,[],[<<123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,56,56,51>>,signature => [{attribute,{1389,2},spec,{{erlang,localtime,0},[{type,{1389,23},bounded_fun,[{type,{1389,23},'fun',[{type,{1389,23},product,[]},{var,{1389,29},'DateTime'}]},[{type,{1390,7},constraint,[{atom,{1390,7},is_subtype},[{var,{1390,7},'DateTime'},{remote_type,{1390,19},[{atom,{1390,19},calendar},{atom,{1390,28},datetime},[]]}]]}]]}]}}]}},{{function,localtime_to_universaltime,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3501}],[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,44,32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,32,97,110,100,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,57,48,48>>,signature => [{attribute,{3501,2},spec,{{erlang,localtime_to_universaltime,1},[{type,{3501,40},bounded_fun,[{type,{3501,40},'fun',[{type,{3501,40},product,[{var,{3501,41},'Localtime'}]},{var,{3501,55},'Universaltime'}]},[{type,{3502,7},constraint,[{atom,{3502,7},is_subtype},[{var,{3502,7},'Localtime'},{remote_type,{3502,20},[{atom,{3502,20},calendar},{atom,{3502,29},datetime},[]]}]]},{type,{3503,7},constraint,[{atom,{3503,7},is_subtype},[{var,{3503,7},'Universaltime'},{remote_type,{3503,24},[{atom,{3503,24},calendar},{atom,{3503,33},datetime},[]]}]]}]]}]}}]}},{{function,localtime_to_universaltime,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2338}],[<<108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,97,115,32>>,{code,[],[<<101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,47,49>>]},<<44,32,98,117,116,32,116,104,101,32,99,97,108,108,101,114,32,100,101,99,105,100,101,115,32,105,102,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,105,115,32,97,99,116,105,118,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<73,115,68,115,116,32,61,61,32,116,114,117,101>>]},<<44,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,105,115,32,100,117,114,105,110,103,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,44,32,105,102,32>>,{code,[],[<<73,115,68,115,116,32,61,61,32,102,97,108,115,101>>]},<<32,105,116,32,105,115,32,110,111,116,46,32,73,102,32>>,{code,[],[<<73,115,68,115,116,32,61,61,32,117,110,100,101,102,105,110,101,100>>]},<<44,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,99,97,110,32,103,117,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,76,111,99,97,108,116,105,109,101,41>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,116,114,117,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,50,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,102,97,108,115,101,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125,10,62,32,101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,95,116,111,95,117,110,105,118,101,114,115,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,52,53,44,49,55,125,125,44,32,117,110,100,101,102,105,110,101,100,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,51,44,52,53,44,49,55,125,125>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,111,99,97,108,116,105,109,101>>]},<<32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,57,49,55>>,signature => [{attribute,{2338,2},spec,{{erlang,localtime_to_universaltime,2},[{type,{2338,40},bounded_fun,[{type,{2338,40},'fun',[{type,{2338,40},product,[{var,{2338,41},'Localtime'},{var,{2338,52},'IsDst'}]},{var,{2338,62},'Universaltime'}]},[{type,{2339,7},constraint,[{atom,{2339,7},is_subtype},[{var,{2339,7},'Localtime'},{remote_type,{2339,20},[{atom,{2339,20},calendar},{atom,{2339,29},datetime},[]]}]]},{type,{2340,7},constraint,[{atom,{2340,7},is_subtype},[{var,{2340,7},'Universaltime'},{remote_type,{2340,24},[{atom,{2340,24},calendar},{atom,{2340,33},datetime},[]]}]]},{type,{2341,7},constraint,[{atom,{2341,7},is_subtype},[{var,{2341,7},'IsDst'},{type,{2341,16},union,[{atom,{2341,16},true},{atom,{2341,23},false},{atom,{2341,31},undefined}]}]]}]]}]}}]}},{{function,make_ref,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1395}],[<<109,97,107,101,95,114,101,102,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100,35,117,110,105,113,117,101,95,114,101,102,101,114,101,110,99,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<117,110,105,113,117,101,32,114,101,102,101,114,101,110,99,101>>]},<<46,32,84,104,101,32,114,101,102,101,114,101,110,99,101,32,105,115,32,117,110,105,113,117,101,32,97,109,111,110,103,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<66,101,102,111,114,101,32,79,84,80,45,50,51,32,119,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,44,32,114,101,102,101,114,101,110,99,101,115,32,99,114,101,97,116,101,100,32,111,110,32,97,32,110,101,119,101,114,32,110,111,100,101,32,99,97,110,32,98,101,32,109,105,115,116,97,107,101,110,32,102,111,114,32,97,32,114,101,102,101,114,101,110,99,101,32,99,114,101,97,116,101,100,32,111,110,32,97,110,32,111,108,100,101,114,32,110,111,100,101,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,110,97,109,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,57,52,51>>,signature => [{attribute,{1395,2},spec,{{make_ref,0},[{type,{1395,15},'fun',[{type,{1395,15},product,[]},{type,{1395,21},reference,[]}]}]}}]}},{{function,make_tuple,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2357}],[<<109,97,107,101,95,116,117,112,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,110,101,119,32,116,117,112,108,101,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32>>,{code,[],[<<65,114,105,116,121>>]},<<44,32,119,104,101,114,101,32,97,108,108,32,101,108,101,109,101,110,116,115,32,97,114,101,32>>,{code,[],[<<73,110,105,116,105,97,108,86,97,108,117,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,52,44,32,91,93,41,46,10,123,91,93,44,91,93,44,91,93,44,91,93,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,57,54,48>>,signature => [{attribute,{2357,2},spec,{{erlang,make_tuple,2},[{type,{2357,24},bounded_fun,[{type,{2357,24},'fun',[{type,{2357,24},product,[{var,{2357,25},'Arity'},{var,{2357,32},'InitialValue'}]},{type,{2357,49},tuple,any}]},[{type,{2358,7},constraint,[{atom,{2358,7},is_subtype},[{var,{2358,7},'Arity'},{type,{2358,16},arity,[]}]]},{type,{2359,7},constraint,[{atom,{2359,7},is_subtype},[{var,{2359,7},'InitialValue'},{type,{2359,23},term,[]}]]}]]}]}}]}},{{function,make_tuple,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2364}],[<<109,97,107,101,95,116,117,112,108,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,116,117,112,108,101,32,111,102,32,115,105,122,101,32>>,{code,[],[<<65,114,105,116,121>>]},<<44,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,104,97,115,32,118,97,108,117,101,32>>,{code,[],[<<68,101,102,97,117,108,116,86,97,108,117,101>>]},<<44,32,97,110,100,32,116,104,101,110,32,102,105,108,108,115,32,105,110,32,118,97,108,117,101,115,32,102,114,111,109,32>>,{code,[],[<<73,110,105,116,76,105,115,116>>]},<<46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<73,110,105,116,76,105,115,116>>]},<<32,109,117,115,116,32,98,101,32,97,32,116,119,111,45,116,117,112,108,101,44,32,119,104,101,114,101,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,116,117,112,108,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,121,32,116,101,114,109,46,32,73,102,32,97,32,112,111,115,105,116,105,111,110,32,111,99,99,117,114,115,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,116,104,101,32,116,101,114,109,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,108,97,115,116,32,111,99,99,117,114,114,101,110,99,101,32,105,115,32,117,115,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,109,97,107,101,95,116,117,112,108,101,40,53,44,32,91,93,44,32,91,123,50,44,105,103,110,111,114,101,100,125,44,123,53,44,122,122,125,44,123,50,44,97,97,125,93,41,46,10,123,91,93,44,97,97,44,91,93,44,91,93,44,122,122,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,57,55,50>>,signature => [{attribute,{2364,2},spec,{{erlang,make_tuple,3},[{type,{2364,24},bounded_fun,[{type,{2364,24},'fun',[{type,{2364,24},product,[{var,{2364,25},'Arity'},{var,{2364,32},'DefaultValue'},{var,{2364,46},'InitList'}]},{type,{2364,59},tuple,any}]},[{type,{2365,7},constraint,[{atom,{2365,7},is_subtype},[{var,{2365,7},'Arity'},{type,{2365,16},arity,[]}]]},{type,{2366,7},constraint,[{atom,{2366,7},is_subtype},[{var,{2366,7},'DefaultValue'},{type,{2366,23},term,[]}]]},{type,{2367,7},constraint,[{atom,{2367,7},is_subtype},[{var,{2367,7},'InitList'},{type,{2367,19},list,[{type,{2367,20},tuple,[{ann_type,{2367,21},[{var,{2367,21},'Position'},{type,{2367,33},pos_integer,[]}]},{type,{2367,48},term,[]}]}]}]]}]]}]}}]}},{{function,map_get,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1406}],[<<109,97,112,95,103,101,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<32,105,102,32>>,{code,[],[<<77,97,112>>]},<<32,99,111,110,116,97,105,110,115,32>>,{code,[],[<<75,101,121>>]},<<46>>]},{p,[],[<<84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<123,98,97,100,109,97,112,44,77,97,112,125>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32>>,{code,[],[<<77,97,112>>]},<<32,105,115,32,110,111,116,32,97,32,109,97,112,44,32,111,114,32,119,105,116,104,32,97,32>>,{code,[],[<<123,98,97,100,107,101,121,44,75,101,121,125>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32,110,111,32,118,97,108,117,101,32,105,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<62,32,75,101,121,32,61,32,49,51,51,55,44,10,32,32,77,97,112,32,61,32,35,123,52,50,32,61,62,32,118,97,108,117,101,95,116,119,111,44,49,51,51,55,32,61,62,32,34,118,97,108,117,101,32,111,110,101,34,44,34,97,34,32,61,62,32,49,125,44,10,32,32,109,97,112,95,103,101,116,40,75,101,121,44,77,97,112,41,46,10,34,118,97,108,117,101,32,111,110,101,34>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,51,57,57,48>>,signature => [{attribute,{1406,2},spec,{{map_get,2},[{type,{1406,14},bounded_fun,[{type,{1406,14},'fun',[{type,{1406,14},product,[{var,{1406,15},'Key'},{var,{1406,20},'Map'}]},{var,{1406,28},'Value'}]},[{type,{1407,7},constraint,[{atom,{1407,7},is_subtype},[{var,{1407,7},'Map'},{type,{1407,14},map,any}]]},{type,{1408,7},constraint,[{atom,{1408,7},is_subtype},[{var,{1408,7},'Key'},{type,{1408,14},any,[]}]]},{type,{1409,7},constraint,[{atom,{1409,7},is_subtype},[{var,{1409,7},'Value'},{type,{1409,16},any,[]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,48>>}},{{function,map_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1400}],[<<109,97,112,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,107,101,121,45,118,97,108,117,101,32,112,97,105,114,115,32,105,110,32>>,{code,[],[<<77,97,112>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,109,97,112,95,115,105,122,101,40,35,123,97,61,62,49,44,32,98,61,62,50,44,32,99,61,62,51,125,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,48,49,48>>,signature => [{attribute,{1400,2},spec,{{map_size,1},[{type,{1400,15},bounded_fun,[{type,{1400,15},'fun',[{type,{1400,15},product,[{var,{1400,16},'Map'}]},{type,{1400,24},non_neg_integer,[]}]},[{type,{1401,7},constraint,[{atom,{1401,7},is_subtype},[{var,{1401,7},'Map'},{type,{1401,14},map,any}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,match_spec_test,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1414}],[<<109,97,116,99,104,95,115,112,101,99,95,116,101,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,101,115,116,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,117,115,101,100,32,105,110,32,99,97,108,108,115,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,116,115,35,115,101,108,101,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,116,115,58,115,101,108,101,99,116,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,101,115,116,115,32,98,111,116,104,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,34,115,121,110,116,97,99,116,105,99,34,32,99,111,114,114,101,99,116,110,101,115,115,32,97,110,100,32,114,117,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,103,97,105,110,115,116,32,116,104,101,32,111,98,106,101,99,116,46,32,73,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,99,111,110,116,97,105,110,115,32,101,114,114,111,114,115,44,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,69,114,114,111,114,115,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,119,104,101,114,101,32>>,{code,[],[<<69,114,114,111,114,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,110,97,116,117,114,97,108,32,108,97,110,103,117,97,103,101,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,119,104,97,116,32,119,97,115,32,119,114,111,110,103,32,119,105,116,104,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<116,97,98,108,101>>]},<<44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,116,117,112,108,101,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,104,101,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,82,101,115,117,108,116,44,91,93,44,87,97,114,110,105,110,103,115,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,119,104,97,116,32,119,111,117,108,100,32,104,97,118,101,32,98,101,101,110,32,116,104,101,32,114,101,115,117,108,116,32,105,110,32,97,32,114,101,97,108,32>>,{code,[],[<<101,116,115,58,115,101,108,101,99,116,47,50>>]},<<32,99,97,108,108,44,32,111,114,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,111,98,106,101,99,116,32,116,117,112,108,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<116,114,97,99,101>>]},<<44,32,116,104,101,32,111,98,106,101,99,116,32,116,111,32,109,97,116,99,104,32,97,103,97,105,110,115,116,32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,82,101,115,117,108,116,44,32,70,108,97,103,115,44,32,87,97,114,110,105,110,103,115,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{code,[],[<<116,114,117,101>>]},<<32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,116,111,32,98,101,32,101,109,105,116,116,101,100>>]},{li,[],[{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,101,109,105,116,116,101,100>>]},{li,[],[<<84,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,32,116,111,32,98,101,32,97,112,112,101,110,100,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101>>]}]},{p,[],[{code,[],[<<70,108,97,103,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,116,111,32,98,101,32,101,110,97,98,108,101,100,44,32,99,117,114,114,101,110,116,108,121,32,116,104,105,115,32,105,115,32,111,110,108,121,32>>,{code,[],[<<114,101,116,117,114,110,95,116,114,97,99,101>>]},<<46>>]},{p,[],[<<84,104,105,115,32,105,115,32,97,32,117,115,101,102,117,108,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,116,101,115,116,32,116,111,111,108,44,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,119,114,105,116,105,110,103,32,99,111,109,112,108,105,99,97,116,101,100,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,116,115,35,116,101,115,116,95,109,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,116,115,58,116,101,115,116,95,109,115,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,48,50,51>>,signature => [{attribute,{1414,2},spec,{{erlang,match_spec_test,3},[{type,{1414,29},bounded_fun,[{type,{1414,29},'fun',[{type,{1414,29},product,[{var,{1414,30},'MatchAgainst'},{var,{1414,44},'MatchSpec'},{var,{1414,55},'Type'}]},{var,{1414,64},'TestResult'}]},[{type,{1415,7},constraint,[{atom,{1415,7},is_subtype},[{var,{1415,7},'MatchAgainst'},{type,{1415,23},union,[{type,{1415,23},list,[{type,{1415,24},term,[]}]},{type,{1415,34},tuple,any}]}]]},{type,{1416,7},constraint,[{atom,{1416,7},is_subtype},[{var,{1416,7},'MatchSpec'},{type,{1416,20},term,[]}]]},{type,{1417,7},constraint,[{atom,{1417,7},is_subtype},[{var,{1417,7},'Type'},{type,{1417,15},union,[{atom,{1417,15},table},{atom,{1417,23},trace}]}]]},{type,{1418,7},constraint,[{atom,{1418,7},is_subtype},[{var,{1418,7},'TestResult'},{type,{1418,21},union,[{type,{1418,21},tuple,[{atom,{1418,22},ok},{type,{1418,26},term,[]},{type,{1418,34},list,[{atom,{1418,35},return_trace}]},{type,{1418,50},list,[{type,{1418,52},tuple,[{type,{1418,53},union,[{atom,{1418,53},error},{atom,{1418,61},warning}]},{type,{1418,70},string,[]}]}]}]},{type,{1418,85},tuple,[{atom,{1418,86},error},{type,{1418,93},list,[{type,{1418,95},tuple,[{type,{1418,96},union,[{atom,{1418,96},error},{atom,{1418,104},warning}]},{type,{1418,113},string,[]}]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,max,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3991}],[<<109,97,120,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,97,114,103,101,115,116,32,111,102,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,97,110,100,32>>,{code,[],[<<84,101,114,109,50>>]},<<46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,44,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110>>]},<<32,99,111,110,116,97,105,110,115,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,109,97,120,40,49,44,32,50,41,46,10,50>>]}]},{pre,[],[{code,[],[<<62,32,109,97,120,40,49,46,48,44,32,49,41,46,10,49,46,48>>]}]},{pre,[],[{code,[],[<<62,32,109,97,120,40,49,44,32,49,46,48,41,46,10,49>>]}]},{pre,[],[{code,[],[<<62,32,109,97,120,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,98,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,48,54,49>>,signature => [{attribute,{3991,2},spec,{{max,2},[{type,{3991,10},bounded_fun,[{type,{3991,10},'fun',[{type,{3991,10},product,[{var,{3991,11},'Term1'},{var,{3991,18},'Term2'}]},{var,{3991,28},'Maximum'}]},[{type,{3992,7},constraint,[{atom,{3992,7},is_subtype},[{var,{3992,7},'Term1'},{type,{3992,16},term,[]}]]},{type,{3993,7},constraint,[{atom,{3993,7},is_subtype},[{var,{3993,7},'Term2'},{type,{3993,16},term,[]}]]},{type,{3994,7},constraint,[{atom,{3994,7},is_subtype},[{var,{3994,7},'Maximum'},{type,{3994,18},term,[]}]]}]]}]}}]}},{{function,md5,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1423}],[<<109,100,53,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,117,116,101,115,32,97,110,32,77,68,53,32,109,101,115,115,97,103,101,32,100,105,103,101,115,116,32,102,114,111,109,32>>,{code,[],[<<68,97,116,97>>]},<<44,32,119,104,101,114,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,100,105,103,101,115,116,32,105,115,32,49,50,56,32,98,105,116,115,32,40,49,54,32,98,121,116,101,115,41,46,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,111,114,32,97,32,108,105,115,116,32,111,102,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,77,68,53,44,32,115,101,101,32>>,{a,[{href,<<104,116,116,112,115,58,47,47,119,119,119,46,105,101,116,102,46,111,114,103,47,114,102,99,47,114,102,99,49,51,50,49,46,116,120,116>>}],[<<82,70,67,32,49,51,50,49,32,45,32,84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,101,32,77,68,53,32,77,101,115,115,97,103,101,45,68,105,103,101,115,116,32,65,108,103,111,114,105,116,104,109,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,99,111,110,115,105,100,101,114,101,100,32,115,97,102,101,32,102,111,114,32,99,111,100,101,45,115,105,103,110,105,110,103,32,111,114,32,115,111,102,116,119,97,114,101,45,105,110,116,101,103,114,105,116,121,32,112,117,114,112,111,115,101,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,48,57,48>>,signature => [{attribute,{1423,2},spec,{{erlang,md5,1},[{type,{1423,17},bounded_fun,[{type,{1423,17},'fun',[{type,{1423,17},product,[{var,{1423,18},'Data'}]},{var,{1423,27},'Digest'}]},[{type,{1424,7},constraint,[{atom,{1424,7},is_subtype},[{var,{1424,7},'Data'},{type,{1424,15},iodata,[]}]]},{type,{1425,7},constraint,[{atom,{1425,7},is_subtype},[{var,{1425,7},'Digest'},{type,{1425,17},binary,[]}]]}]]}]}}]}},{{function,md5_final,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1430}],[<<109,100,53,95,102,105,110,97,108,47,49>>],#{<<101,110>> => [{p,[],[<<70,105,110,105,115,104,101,115,32,116,104,101,32,117,112,100,97,116,101,32,111,102,32,97,110,32,77,68,53,32>>,{code,[],[<<67,111,110,116,101,120,116>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,117,116,101,100,32>>,{code,[],[<<77,68,53>>]},<<32,109,101,115,115,97,103,101,32,100,105,103,101,115,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,49,48,56>>,signature => [{attribute,{1430,2},spec,{{erlang,md5_final,1},[{type,{1430,23},bounded_fun,[{type,{1430,23},'fun',[{type,{1430,23},product,[{var,{1430,24},'Context'}]},{var,{1430,36},'Digest'}]},[{type,{1431,7},constraint,[{atom,{1431,7},is_subtype},[{var,{1431,7},'Context'},{type,{1431,18},binary,[]}]]},{type,{1432,7},constraint,[{atom,{1432,7},is_subtype},[{var,{1432,7},'Digest'},{type,{1432,17},binary,[]}]]}]]}]}}]}},{{function,md5_init,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1437}],[<<109,100,53,95,105,110,105,116,47,48>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,110,32,77,68,53,32,99,111,110,116,101,120,116,44,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,100,53,95,117,112,100,97,116,101,47,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,49,49,56>>,signature => [{attribute,{1437,2},spec,{{erlang,md5_init,0},[{type,{1437,22},bounded_fun,[{type,{1437,22},'fun',[{type,{1437,22},product,[]},{var,{1437,28},'Context'}]},[{type,{1438,7},constraint,[{atom,{1438,7},is_subtype},[{var,{1438,7},'Context'},{type,{1438,18},binary,[]}]]}]]}]}}]}},{{function,md5_update,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1443}],[<<109,100,53,95,117,112,100,97,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<85,112,100,97,116,101,32,97,110,32,77,68,53,32>>,{code,[],[<<67,111,110,116,101,120,116>>]},<<32,119,105,116,104,32>>,{code,[],[<<68,97,116,97>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32,97,32>>,{code,[],[<<78,101,119,67,111,110,116,101,120,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,49,50,55>>,signature => [{attribute,{1443,2},spec,{{erlang,md5_update,2},[{type,{1443,24},bounded_fun,[{type,{1443,24},'fun',[{type,{1443,24},product,[{var,{1443,25},'Context'},{var,{1443,34},'Data'}]},{var,{1443,43},'NewContext'}]},[{type,{1444,7},constraint,[{atom,{1444,7},is_subtype},[{var,{1444,7},'Context'},{type,{1444,18},binary,[]}]]},{type,{1445,7},constraint,[{atom,{1445,7},is_subtype},[{var,{1445,7},'Data'},{type,{1445,15},iodata,[]}]]},{type,{1446,7},constraint,[{atom,{1446,7},is_subtype},[{var,{1446,7},'NewContext'},{type,{1446,21},binary,[]}]]}]]}]}}]}},{{function,memory,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,4023}],[<<109,101,109,111,114,121,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,101,109,111,114,121,95,116,121,112,101>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,46,32,69,97,99,104,32,108,105,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,84,121,112,101,44,32,83,105,122,101,125>>]},<<46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,109,101,109,111,114,121,32,116,121,112,101,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32>>,{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,105,110,32,98,121,116,101,115,46>>]},{p,[],[<<77,101,109,111,114,121,32,116,121,112,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,111,116,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,102,111,114,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<46>>]}]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46>>]}]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,101,115,95,117,115,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,32,116,104,97,116,32,105,115,32,110,111,116,32,100,105,114,101,99,116,108,121,32,114,101,108,97,116,101,100,32,116,111,32,97,110,121,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,32,77,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,105,115,32,109,101,109,111,114,121,46,32>>,{a,[{href,<<116,111,111,108,115,58,105,110,115,116,114,117,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,115,116,114,117,109,101,110,116,40,51,41>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,97,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,98,114,101,97,107,100,111,119,110,32,111,102,32,119,104,97,116,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,105,115,32,116,121,112,101,46>>]}]},{dt,[],[{code,[],[<<97,116,111,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<97,116,111,109,95,117,115,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,102,111,114,32,97,116,111,109,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<97,116,111,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,98,105,110,97,114,105,101,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<99,111,100,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,114,108,97,110,103,32,99,111,100,101,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<101,116,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,99,117,114,114,101,110,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,69,84,83,32,116,97,98,108,101,115,46,32,84,104,105,115,32,109,101,109,111,114,121,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,109,101,109,111,114,121,46>>]}]},{dt,[],[{code,[],[<<109,97,120,105,109,117,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,115,105,110,99,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46,32,84,104,105,115,32,116,117,112,108,101,32,105,115,32,111,110,108,121,32,112,114,101,115,101,110,116,32,119,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,114,117,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<116,111,111,108,115,58,105,110,115,116,114,117,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,115,116,114,117,109,101,110,116,40,51,41>>]}]},<<32,97,110,100,47,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<101,114,108,40,49,41>>]}]},<<46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,118,97,108,117,101,32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,46,32,83,111,109,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,105,115,32,118,97,108,117,101,32,105,115,32,110,111,116,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,114,117,110,32,119,105,116,104,32,105,110,115,116,114,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,118,97,108,117,101,32,105,115,32,109,111,114,101,32,97,99,99,117,114,97,116,101,44,32,98,117,116,32,109,101,109,111,114,121,32,100,105,114,101,99,116,108,121,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32>>,{code,[],[<<109,97,108,108,111,99>>]},<<32,40,97,110,100,32,102,114,105,101,110,100,115,41,32,105,115,32,115,116,105,108,108,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,118,97,108,117,101,46,32,68,105,114,101,99,116,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,97,108,108,111,99>>]},<<32,97,114,101,32,111,110,108,121,32,100,111,110,101,32,102,114,111,109,32,79,83,45,115,112,101,99,105,102,105,99,32,114,117,110,116,105,109,101,32,108,105,98,114,97,114,105,101,115,32,97,110,100,32,112,101,114,104,97,112,115,32,102,114,111,109,32,117,115,101,114,45,105,109,112,108,101,109,101,110,116,101,100,32,69,114,108,97,110,103,32,100,114,105,118,101,114,115,32,116,104,97,116,32,100,111,32,110,111,116,32,117,115,101,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,100,114,105,118,101,114,32,105,110,116,101,114,102,97,99,101,46>>]},{p,[],[<<65,115,32,116,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115>>]},<<32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<44,32,116,104,101,32,101,114,114,111,114,32,105,110,32>>,{code,[],[<<115,121,115,116,101,109>>]},<<32,112,114,111,112,97,103,97,116,101,115,32,116,111,32,116,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,46>>]},{p,[],[<<84,104,101,32,100,105,102,102,101,114,101,110,116,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,32,116,104,97,116,32,97,114,101,32,115,117,109,109,101,100,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,44,32,119,104,105,99,104,32,105,110,116,114,111,100,117,99,101,115,32,97,110,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},{p,[],[<<84,104,101,32,100,105,102,102,101,114,101,110,116,32,118,97,108,117,101,115,32,104,97,118,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,108,97,116,105,111,110,32,116,111,32,101,97,99,104,32,111,116,104,101,114,46,32,86,97,108,117,101,115,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,97,110,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,32,105,115,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<116,111,116,97,108,32,32,32,32,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,115,121,115,116,101,109,10,112,114,111,99,101,115,115,101,115,32,32,61,32,112,114,111,99,101,115,115,101,115,95,117,115,101,100,32,43,32,80,114,111,99,101,115,115,101,115,78,111,116,85,115,101,100,10,115,121,115,116,101,109,32,32,32,32,32,61,32,97,116,111,109,32,43,32,98,105,110,97,114,121,32,43,32,99,111,100,101,32,43,32,101,116,115,32,43,32,79,116,104,101,114,83,121,115,116,101,109,10,97,116,111,109,32,32,32,32,32,32,32,61,32,97,116,111,109,95,117,115,101,100,32,43,32,65,116,111,109,78,111,116,85,115,101,100,10,82,101,97,108,84,111,116,97,108,32,32,61,32,112,114,111,99,101,115,115,101,115,32,43,32,82,101,97,108,83,121,115,116,101,109,10,82,101,97,108,83,121,115,116,101,109,32,61,32,115,121,115,116,101,109,32,43,32,77,105,115,115,101,100,83,121,115,116,101,109>>]}]},{p,[],[<<77,111,114,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,104,97,114,101,100,32,108,105,98,114,97,114,105,101,115,44,32,116,104,101,32,99,111,100,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,116,115,101,108,102,44,32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,115,116,97,99,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32>>,{code,[],[<<116,111,116,97,108>>]},<<32,118,97,108,117,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,97,108,108,32,112,97,103,101,115,32,109,97,112,112,101,100,32,116,111,32,116,104,101,32,101,109,117,108,97,116,111,114,46>>]},{p,[],[<<65,108,115,111,44,32,98,101,99,97,117,115,101,32,111,102,32,102,114,97,103,109,101,110,116,97,116,105,111,110,32,97,110,100,32,112,114,101,114,101,115,101,114,118,97,116,105,111,110,32,111,102,32,109,101,109,111,114,121,32,97,114,101,97,115,44,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,115,101,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,32,99,97,110,32,98,101,32,109,117,99,104,32,108,97,114,103,101,114,32,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,116,104,101,32,100,121,110,97,109,105,99,97,108,108,121,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,98,108,111,99,107,115,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32>>,{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48>>]},<<32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,105,102,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,49,51,56>>,signature => [{attribute,{4023,2},spec,{{erlang,memory,0},[{type,{4023,20},bounded_fun,[{type,{4023,20},'fun',[{type,{4023,20},product,[]},{type,{4023,26},list,[{type,{4023,27},tuple,[{var,{4023,28},'Type'},{var,{4023,34},'Size'}]}]}]},[{type,{4024,7},constraint,[{atom,{4024,7},is_subtype},[{var,{4024,7},'Type'},{user_type,{4024,15},memory_type,[]}]]},{type,{4025,7},constraint,[{atom,{4025,7},is_subtype},[{var,{4025,7},'Size'},{type,{4025,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,memory,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,4042}],[<<109,101,109,111,114,121,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,101,109,111,114,121,95,116,121,112,101>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,101,109,111,114,121,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,109,101,109,111,114,121,32,111,102,32,116,121,112,101,32>>,{code,[],[<<84,121,112,101>>]},<<46,32,84,104,101,32,97,114,103,117,109,101,110,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<109,101,109,111,114,121,95,116,121,112,101,40,41>>]},<<32,97,116,111,109,115,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,97,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,109,101,109,111,114,121,95,116,121,112,101,40,41,44,32,83,105,122,101,32,58,58,32,105,110,116,101,103,101,114,32,62,61,32,48,125>>]},<<32,116,117,112,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,52,44,32>>,{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,49>>]},<<32,114,101,113,117,105,114,101,115,32,116,104,97,116,32,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,101,110,97,98,108,101,100,32,40,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,41,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,116,121,112,101,115,32,108,105,115,116,101,100,32,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,101,109,111,114,121,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48>>]}]},<<46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<109,97,120,105,109,117,109>>]},<<32,105,115,32,112,97,115,115,101,100,32,97,115,32>>,{code,[],[<<84,121,112,101>>]},<<32,97,110,100,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,110,111,116,32,114,117,110,32,105,110,32,105,110,115,116,114,117,109,101,110,116,101,100,32,109,111,100,101,46>>]},{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[<<73,102,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<32,97,108,108,111,99,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,101,109,111,114,121,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,50,55,51>>,signature => [{attribute,{4042,2},spec,{{erlang,memory,1},[{type,{4042,20},'fun',[{type,{4042,20},product,[{ann_type,{4042,21},[{var,{4042,21},'Type'},{user_type,{4042,29},memory_type,[]}]}]},{type,{4042,47},non_neg_integer,[]}]},{type,{4043,20},'fun',[{type,{4043,20},product,[{ann_type,{4043,21},[{var,{4043,21},'TypeList'},{type,{4043,33},list,[{user_type,{4043,34},memory_type,[]}]}]}]},{type,{4043,53},list,[{type,{4043,54},tuple,[{user_type,{4043,55},memory_type,[]},{type,{4043,70},non_neg_integer,[]}]}]}]}]}}]}},{{function,min,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3984}],[<<109,105,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,97,110,100,32>>,{code,[],[<<84,101,114,109,50>>]},<<46,32,73,102,32,116,104,101,32,116,101,114,109,115,32,99,111,109,112,97,114,101,32,101,113,117,97,108,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,44,32>>,{code,[],[<<84,101,114,109,49>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,116,101,114,109,45,99,111,109,112,97,114,105,115,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,120,112,114,101,115,115,105,111,110,115,32,115,101,99,116,105,111,110>>]},<<32,99,111,110,116,97,105,110,115,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,116,104,101,32>>,{code,[],[<<61,61>>]},<<32,111,112,101,114,97,116,111,114,32,97,110,100,32,104,111,119,32,116,101,114,109,115,32,97,114,101,32,111,114,100,101,114,101,100,46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<62,32,109,105,110,40,49,44,32,50,41,46,10,49>>]}]},{pre,[],[{code,[],[<<62,32,109,105,110,40,49,46,48,44,32,49,41,46,10,49,46,48>>]}]},{pre,[],[{code,[],[<<62,32,109,105,110,40,49,44,32,49,46,48,41,46,10,49>>]}]},{pre,[],[{code,[],[<<62,32,109,105,110,40,34,97,98,99,34,44,32,34,98,34,41,46,10,34,97,98,99,34>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,51,49,51>>,signature => [{attribute,{3984,2},spec,{{min,2},[{type,{3984,10},bounded_fun,[{type,{3984,10},'fun',[{type,{3984,10},product,[{var,{3984,11},'Term1'},{var,{3984,18},'Term2'}]},{var,{3984,28},'Minimum'}]},[{type,{3985,7},constraint,[{atom,{3985,7},is_subtype},[{var,{3985,7},'Term1'},{type,{3985,16},term,[]}]]},{type,{3986,7},constraint,[{atom,{3986,7},is_subtype},[{var,{3986,7},'Term2'},{type,{3986,16},term,[]}]]},{type,{3987,7},constraint,[{atom,{3987,7},is_subtype},[{var,{3987,7},'Minimum'},{type,{3987,18},term,[]}]]}]]}]}}]}},{{function,module_loaded,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1451}],[<<109,111,100,117,108,101,95,108,111,97,100,101,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,108,111,97,100,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,116,116,101,109,112,116,32,116,111,32,108,111,97,100,32,116,104,101,32,109,111,100,117,108,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,51,52,50>>,signature => [{attribute,{1451,2},spec,{{module_loaded,1},[{type,{1451,20},bounded_fun,[{type,{1451,20},'fun',[{type,{1451,20},product,[{var,{1451,21},'Module'}]},{type,{1451,32},boolean,[]}]},[{type,{1452,7},constraint,[{atom,{1452,7},is_subtype},[{var,{1452,7},'Module'},{type,{1452,17},module,[]}]]}]]}]}}]}},{{function,monitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1464}],[<<109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,111,110,105,116,111,114,95,112,111,114,116,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]}]},{p,[],[{a,[{id,<<109,111,110,105,116,111,114,95,109,101,115,115,97,103,101>>}],[]},<<83,101,110,100,115,32,97,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,111,102,32,116,121,112,101,32>>,{code,[],[<<84,121,112,101>>]},<<32,116,111,32,116,104,101,32,101,110,116,105,116,121,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<46,32,73,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,111,114,32,105,116,32,99,104,97,110,103,101,115,32,109,111,110,105,116,111,114,101,100,32,115,116,97,116,101,44,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,105,115,32,110,111,116,105,102,105,101,100,32,98,121,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,97,116,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<123,84,97,103,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,114,101,113,117,101,115,116,32,105,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,115,105,103,110,97,108,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,97,107,101,115,32,116,105,109,101,32,98,101,102,111,114,101,32,116,104,101,32,115,105,103,110,97,108,32,114,101,97,99,104,101,115,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,46>>]}]},{p,[],[{code,[],[<<84,121,112,101>>]},<<32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,58,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<44,32>>,{code,[],[<<112,111,114,116>>]},<<32,111,114,32>>,{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]},<<46>>]},{p,[],[<<65,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116>>]},<<32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,111,110,108,121,32,111,110,99,101,44,32,97,102,116,101,114,32,116,104,97,116,32,105,116,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,98,111,116,104,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,46,32,77,111,110,105,116,111,114,115,32,97,114,101,32,102,105,114,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,116,101,114,109,105,110,97,116,101,115,44,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,32,99,114,101,97,116,105,111,110,44,32,111,114,32,105,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,105,116,32,105,115,32,108,111,115,116,44,32,119,101,32,100,111,32,110,111,116,32,107,110,111,119,32,105,102,32,105,116,32,115,116,105,108,108,32,101,120,105,115,116,115,46,32,84,104,101,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,97,108,115,111,32,116,117,114,110,101,100,32,111,102,102,32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<100,101,109,111,110,105,116,111,114,47,49>>]},<<32,105,115,32,99,97,108,108,101,100,46>>]},{p,[],[<<65,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116>>]},<<32,109,111,110,105,116,111,114,32,98,121,32,110,97,109,101,32,114,101,115,111,108,118,101,115,32,116,104,101,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,116,111,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<32,111,110,108,121,32,111,110,99,101,32,97,116,32,116,104,101,32,109,111,109,101,110,116,32,111,102,32,109,111,110,105,116,111,114,32,105,110,115,116,97,110,116,105,97,116,105,111,110,44,32,108,97,116,101,114,32,99,104,97,110,103,101,115,32,116,111,32,116,104,101,32,110,97,109,101,32,114,101,103,105,115,116,114,97,116,105,111,110,32,119,105,108,108,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,101,120,105,115,116,105,110,103,32,109,111,110,105,116,111,114,46>>]},{p,[],[<<87,104,101,110,32,97,32>>,{code,[],[<<112,114,111,99,101,115,115>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116>>]},<<32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,104,97,116,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<123,39,68,79,87,78,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,79,98,106,101,99,116,44,32,73,110,102,111,125>>]}]},{p,[],[<<73,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<32,97,110,100,32>>,{code,[],[<<84,121,112,101>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,44,32,97,110,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<79,98,106,101,99,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,101,100,32,101,110,116,105,116,121,44,32,119,104,105,99,104,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32,101,118,101,110,116,46,32,87,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,108,111,99,97,108,32,112,111,114,116,44,32>>,{code,[],[<<79,98,106,101,99,116>>]},<<32,119,105,108,108,32,98,101,32,101,113,117,97,108,32,116,111,32,116,104,101,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<32,116,104,97,116,32,119,97,115,32,98,101,105,110,103,32,109,111,110,105,116,111,114,101,100,46,32,87,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,98,121,32,110,97,109,101,44,32>>,{code,[],[<<79,98,106,101,99,116>>]},<<32,119,105,108,108,32,104,97,118,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,119,104,105,99,104,32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,119,105,116,104,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,99,97,108,108,32,97,110,100,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,110,111,100,101,32,110,97,109,101,32,40,102,111,114,32,112,111,114,116,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,44,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,97,108,119,97,121,115,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,41,46>>]}]},{dt,[],[{code,[],[<<73,110,102,111>>]}]},{dd,[],[{p,[],[<<69,105,116,104,101,114,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,44,32>>,{code,[],[<<110,111,112,114,111,99>>]},<<32,40,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,100,105,100,32,110,111,116,32,101,120,105,115,116,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,109,111,110,105,116,111,114,32,99,114,101,97,116,105,111,110,41,44,32,111,114,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,40,110,111,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,115,41,46>>]}]}]},{dl,[],[{dt,[],[<<77,111,110,105,116,111,114,105,110,103,32,97,32>>,{a,[{id,<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115>>}],[]},{code,[],[<<112,114,111,99,101,115,115>>]}]},{dd,[],[{p,[],[<<67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,40,108,111,99,97,108,32,111,114,32,114,101,109,111,116,101,41,44,32,97,110,32,97,116,111,109,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,111,114,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,44,32,108,111,99,97,116,101,100,32,101,108,115,101,119,104,101,114,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,101,102,111,114,101,32,69,82,84,83,32,49,48,46,48,32,40,79,84,80,32,50,49,46,48,41,44,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,32,99,111,117,108,100,32,102,97,105,108,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,32,114,101,115,105,100,101,100,32,111,110,32,97,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,40,115,117,99,104,32,97,115,32,101,114,108,95,105,110,116,101,114,102,97,99,101,32,111,114,32,106,105,110,116,101,114,102,97,99,101,41,44,32,119,104,101,114,101,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,46>>]},{p,[],[<<78,111,119,44,32,115,117,99,104,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,119,105,108,108,32,105,110,115,116,101,97,100,32,115,117,99,99,101,101,100,32,97,110,100,32,97,32,109,111,110,105,116,111,114,32,105,115,32,99,114,101,97,116,101,100,46,32,66,117,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,111,110,108,121,32,115,117,112,101,114,118,105,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,32>>,{code,[],[<<123,39,68,79,87,78,39,44,32,95,44,32,112,114,111,99,101,115,115,44,32,95,44,32,110,111,99,111,110,110,101,99,116,105,111,110,125>>]},<<32,105,115,32,116,104,101,32,111,110,108,121,32,109,101,115,115,97,103,101,32,116,104,97,116,32,109,97,121,32,98,101,32,114,101,99,101,105,118,101,100,44,32,97,115,32,116,104,101,32,112,114,105,109,105,116,105,118,101,32,110,111,100,101,32,104,97,118,101,32,110,111,32,119,97,121,32,111,102,32,114,101,112,111,114,116,105,110,103,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,109,111,110,105,116,111,114,101,100,32,112,114,111,99,101,115,115,46>>]}]}]},{dt,[],[<<77,111,110,105,116,111,114,105,110,103,32,97,32>>,{a,[{id,<<109,111,110,105,116,111,114,95,112,111,114,116>>}],[]},{code,[],[<<112,111,114,116>>]}]},{dd,[],[{p,[],[<<67,114,101,97,116,101,115,32,109,111,110,105,116,111,114,32,98,101,116,119,101,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,97,110,100,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,97,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<32,40,111,110,108,121,32,108,111,99,97,108,41,44,32,97,110,32,97,116,111,109,32>>,{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,111,114,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,82,101,103,105,115,116,101,114,101,100,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,111,114,116,44,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,78,111,116,101,44,32,116,104,97,116,32,97,116,116,101,109,112,116,32,116,111,32,109,111,110,105,116,111,114,32,97,32,114,101,109,111,116,101,32,112,111,114,116,32,119,105,108,108,32,114,101,115,117,108,116,32,105,110,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46>>]}]},{dt,[],[<<77,111,110,105,116,111,114,105,110,103,32,97,32>>,{a,[{id,<<109,111,110,105,116,111,114,95,116,105,109,101,95,111,102,102,115,101,116>>}],[]},{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]}]},{dd,[],[{p,[],[<<77,111,110,105,116,111,114,115,32,99,104,97,110,103,101,115,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,105,109,101,32,111,102,102,115,101,116>>]}]},<<32,98,101,116,119,101,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<46,32,79,110,101,32,118,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,101,120,105,115,116,115,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<116,105,109,101,95,111,102,102,115,101,116,32,84,121,112,101>>]},<<44,32,110,97,109,101,108,121,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<99,108,111,99,107,95,115,101,114,118,105,99,101>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<99,108,111,99,107,95,115,101,114,118,105,99,101>>]},<<32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,32,112,114,111,99,101,115,115,46,32,73,110,32,116,104,105,115,32,99,97,115,101,32,105,116,32,115,101,114,118,101,115,32,97,115,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,116,101,114,110,97,108,32,99,108,111,99,107,32,115,101,114,118,105,99,101,32,97,116,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,119,104,101,110,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,105,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,105,115,32,99,104,97,110,103,101,100,44,32,111,114,32,105,102,32,116,104,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,32,102,105,110,97,108,32,100,117,114,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,116,105,109,101,95,111,102,102,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,110,97,108,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116>>]},<<32,119,104,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46,32,87,104,101,110,32,97,32,99,104,97,110,103,101,32,102,114,111,109,32,112,114,101,108,105,109,105,110,97,114,121,32,116,111,32,102,105,110,97,108,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,109,97,100,101,44,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,111,110,99,101,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,118,97,108,117,101,32,119,97,115,32,99,104,97,110,103,101,100,32,111,114,32,110,111,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,111,101,115,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,44,32,115,111,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,102,116,101,114,32,105,116,32,104,97,115,32,98,101,101,110,32,116,114,105,103,103,101,114,101,100,46,32,84,104,97,116,32,105,115,44,32,114,101,112,101,97,116,101,100,32,99,104,97,110,103,101,115,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,116,114,105,103,103,101,114,32,116,104,101,32,109,111,110,105,116,111,114,32,114,101,112,101,97,116,101,100,108,121,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,32,97,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,46,32,65,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<123,39,67,72,65,78,71,69,39,44,32,77,111,110,105,116,111,114,82,101,102,44,32,84,121,112,101,44,32,73,116,101,109,44,32,78,101,119,84,105,109,101,79,102,102,115,101,116,125>>]}]},{p,[],[<<119,104,101,114,101,32>>,{code,[],[<<77,111,110,105,116,111,114,82,101,102>>]},<<44,32>>,{code,[],[<<84,121,112,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,44,32,97,110,100,32>>,{code,[],[<<78,101,119,84,105,109,101,79,102,102,115,101,116>>]},<<32,105,115,32,116,104,101,32,110,101,119,32,116,105,109,101,32,111,102,102,115,101,116,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,32,104,97,115,32,98,101,101,110,32,114,101,99,101,105,118,101,100,32,121,111,117,32,97,114,101,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,114,101,116,114,105,101,118,101,32,116,104,101,32,111,108,100,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]}]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,121,111,117,32,99,97,110,32,111,98,115,101,114,118,101,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]},<<32,98,101,102,111,114,101,32,121,111,117,32,103,101,116,32,116,104,101,32>>,{code,[],[<<39,67,72,65,78,71,69,39>>]},<<32,109,101,115,115,97,103,101,46>>]}]}]},{p,[],[<<77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,102,111,114,32,116,104,101,32,115,97,109,101,32>>,{code,[],[<<73,116,101,109>>]},<<32,97,110,100,47,111,114,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,32,105,110,115,116,97,110,99,101,115,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,104,97,116,32,105,115,44,32,111,116,104,101,114,32>>,{code,[],[<<84,121,112,101>>]},<<115,32,97,110,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,111,114,32,119,104,101,110,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<32,105,115,32,101,120,116,101,110,100,101,100,44,32,111,116,104,101,114,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<84,97,103>>]},<<44,32>>,{code,[],[<<79,98,106,101,99,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,110,32,116,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,105,110,116,114,111,100,117,99,101,100,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,51,53,55>>,signature => [{attribute,{1464,2},spec,{{monitor,2},[{type,{1465,7},bounded_fun,[{type,{1465,7},'fun',[{type,{1465,7},product,[{atom,{1465,8},process},{user_type,{1465,17},monitor_process_identifier,[]}]},{var,{1465,50},'MonitorRef'}]},[{type,{1466,9},constraint,[{atom,{1466,9},is_subtype},[{var,{1466,9},'MonitorRef'},{type,{1466,23},reference,[]}]]}]]},{type,{1467,7},bounded_fun,[{type,{1467,7},'fun',[{type,{1467,7},product,[{atom,{1467,8},port},{user_type,{1467,14},monitor_port_identifier,[]}]},{var,{1467,44},'MonitorRef'}]},[{type,{1468,9},constraint,[{atom,{1468,9},is_subtype},[{var,{1468,9},'MonitorRef'},{type,{1468,23},reference,[]}]]}]]},{type,{1469,7},bounded_fun,[{type,{1469,7},'fun',[{type,{1469,7},product,[{atom,{1469,8},time_offset},{atom,{1469,21},clock_service}]},{var,{1469,39},'MonitorRef'}]},[{type,{1470,9},constraint,[{atom,{1470,9},is_subtype},[{var,{1470,9},'MonitorRef'},{type,{1470,23},reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48,44,79,84,80,32,49,57,46,48>>}},{{function,monitor,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1476}],[<<109,111,110,105,116,111,114,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,111,110,105,116,111,114,95,112,111,114,116,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<109,111,110,105,116,111,114,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>}],[]},{li,[{name,<<114,101,103,105,115,116,101,114,101,100,95,112,114,111,99,101,115,115,95,105,100,101,110,116,105,102,105,101,114>>}],[]}]},{p,[],[<<80,114,111,118,105,100,101,115,32,97,110,32,111,112,116,105,111,110,32,108,105,115,116,32,102,111,114,32,109,111,100,105,102,105,99,97,116,105,111,110,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,112,114,111,118,105,100,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,50>>]}]},<<46,32,84,104,101,32>>,{code,[],[<<84,121,112,101>>]},<<32,97,110,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,97,114,103,117,109,101,110,116,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,109,101,97,110,105,110,103,32,97,115,32,119,104,101,110,32,112,97,115,115,101,100,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<46,32,67,117,114,114,101,110,116,108,121,32,97,118,97,105,108,97,98,108,101,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,108,105,97,115,44,32,85,110,97,108,105,97,115,79,112,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,119,105,108,108,32,97,108,115,111,32,98,101,99,111,109,101,32,97,110,32,97,108,105,97,115,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,97,108,105,97,115,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,108,105,97,115,47,48>>]}]},<<46,32,84,104,101,32>>,{code,[],[<<85,110,97,108,105,97,115,79,112,116>>]},<<32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101,32,97,108,105,97,115,32,115,104,111,117,108,100,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,46>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,112,108,105,99,105,116,95,117,110,97,108,105,97,115>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,97,108,105,97,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,97,108,105,97,115,47,49>>]}]},<<32,119,105,108,108,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,46>>]}]},{dt,[],[{code,[],[<<100,101,109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,101,105,116,104,101,114,32,118,105,97,32,97,110,32,101,120,112,108,105,99,105,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,101,109,111,110,105,116,111,114,47,49>>]}]},<<32,111,114,32,119,104,101,110,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,97,115,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,100,101,108,105,118,101,114,101,100,32,100,117,101,32,116,111,32,116,104,101,32,109,111,110,105,116,111,114,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46>>]}]},{dt,[],[{code,[],[<<114,101,112,108,121,95,100,101,109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,97,108,105,97,115,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,114,101,109,111,118,101,100,32,40,115,101,101,32>>,{code,[],[<<100,101,109,111,110,105,116,111,114>>]},<<32,111,112,116,105,111,110,32,97,98,111,118,101,41,32,111,114,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,99,101,105,118,101,100,46,32,87,104,101,110,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,118,105,97,32,116,104,101,32,97,108,105,97,115,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,97,108,115,111,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,110,32,99,108,105,101,110,116,47,115,101,114,118,101,114,32,115,99,101,110,97,114,105,111,115,32,119,104,101,110,32,97,32,99,108,105,101,110,116,32,109,111,110,105,116,111,114,115,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,119,105,108,108,32,103,101,116,32,116,104,101,32,114,101,112,108,121,32,118,105,97,32,116,104,101,32,97,108,105,97,115,46,32,79,110,99,101,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,32,114,101,99,101,105,118,101,100,32,98,111,116,104,32,116,104,101,32,97,108,105,97,115,32,97,110,100,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,109,111,118,101,100,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,114,101,115,112,111,110,115,101,32,105,115,32,97,32,114,101,112,108,121,32,111,114,32,97,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,46,32,84,104,101,32,97,108,105,97,115,32,99,97,110,32,97,108,115,111,32,115,116,105,108,108,32,98,101,32,100,101,97,99,116,105,118,97,116,101,100,32,118,105,97,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<46,32,78,111,116,101,32,116,104,97,116,32,105,102,32,116,104,101,32,97,108,105,97,115,32,105,115,32,114,101,109,111,118,101,100,32,117,115,105,110,103,32,116,104,101,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<32,66,73,70,44,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,115,116,105,108,108,32,98,101,32,108,101,102,116,32,97,99,116,105,118,101,46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,65,108,105,97,115,82,101,113,73,100,32,33,32,123,114,101,112,108,121,44,32,65,108,105,97,115,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,101,110,100,44,10,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,44,32,82,101,113,117,101,115,116,41,32,45,62,10,32,32,32,32,65,108,105,97,115,77,111,110,82,101,113,73,100,32,61,32,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,91,123,97,108,105,97,115,44,32,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,125,93,41,44,10,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,44,10,32,32,32,32,37,37,32,65,108,105,97,115,32,97,115,32,119,101,108,108,32,97,115,32,109,111,110,105,116,111,114,32,119,105,108,108,32,98,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,97,99,116,105,118,97,116,101,100,32,105,102,32,119,101,10,32,32,32,32,37,37,32,114,101,99,101,105,118,101,32,97,32,114,101,112,108,121,32,111,114,32,97,32,39,68,79,87,78,39,32,109,101,115,115,97,103,101,32,115,105,110,99,101,32,119,101,32,117,115,101,100,32,39,114,101,112,108,121,95,100,101,109,111,110,105,116,111,114,39,10,32,32,32,32,37,37,32,97,115,32,117,110,97,108,105,97,115,32,111,112,116,105,111,110,46,46,46,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,59,10,32,32,32,32,32,32,32,32,123,39,68,79,87,78,39,44,32,65,108,105,97,115,77,111,110,82,101,113,73,100,44,32,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,101,114,114,111,114,40,69,120,105,116,82,101,97,115,111,110,41,10,32,32,32,32,101,110,100,46,10,9,32,32,32,32>>]}]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,98,111,116,104,32,116,104,101,32,115,101,114,118,101,114,32,97,110,100,32,116,104,101,32,99,108,105,101,110,116,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,32,97,116,32,108,101,97,115,116,32,79,84,80,32,50,52,32,115,121,115,116,101,109,115,32,105,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{i,[],[<<80,114,111,99,101,115,115,32,65,108,105,97,115,101,115>>]}]},<<32,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32>>,{i,[],[<<69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,116,97,103,44,32,85,115,101,114,68,101,102,105,110,101,100,84,97,103,125>>]}]},{dd,[],[{p,[],[<<82,101,112,108,97,99,101,32,116,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<84,97,103>>]},<<32,119,105,116,104,32>>,{code,[],[<<85,115,101,114,68,101,102,105,110,101,100,84,97,103>>]},<<32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<109,111,110,105,116,111,114,32,109,101,115,115,97,103,101>>]},<<32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,116,114,105,103,103,101,114,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,109,111,110,105,116,111,114,105,110,103,32,97,32,112,114,111,99,101,115,115,44,32,116,104,101,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,116,97,103,32,105,110,32,116,104,101,32,100,111,119,110,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,114,101,112,108,97,99,101,100,32,98,121,32>>,{code,[],[<<85,115,101,114,68,101,102,105,110,101,100,84,97,103>>]},<<46>>]},{p,[],[<<65,110,32,101,120,97,109,112,108,101,32,111,102,32,104,111,119,32,116,104,101,32>>,{code,[],[<<123,116,97,103,44,32,85,115,101,114,68,101,102,105,110,101,100,84,97,103,125>>]},<<32,111,112,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32,101,110,97,98,108,101,32,116,104,101,32,110,101,119,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,112,114,111,99,101,115,115,101,115,35,114,101,99,101,105,118,105,110,103,45,109,101,115,115,97,103,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,101,108,101,99,116,105,118,101,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110>>]},<<44,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,79,84,80,32,50,52,44,32,119,104,101,110,32,109,97,107,105,110,103,32,109,117,108,116,105,112,108,101,32,114,101,113,117,101,115,116,115,32,116,111,32,100,105,102,102,101,114,101,110,116,32,115,101,114,118,101,114,115,58>>]},{pre,[],[{code,[],[<<115,101,114,118,101,114,40,41,32,45,62,10,32,32,32,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,123,114,101,113,117,101,115,116,44,32,70,114,111,109,44,32,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,82,101,115,117,108,116,32,61,32,112,101,114,102,111,114,109,95,114,101,113,117,101,115,116,40,82,101,113,117,101,115,116,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,70,114,111,109,32,33,32,123,114,101,112,108,121,44,32,115,101,108,102,40,41,44,32,82,101,113,73,100,44,32,82,101,115,117,108,116,125,10,32,32,32,32,101,110,100,44,10,32,32,32,32,115,101,114,118,101,114,40,41,46,10,10,99,108,105,101,110,116,40,83,101,114,118,101,114,80,105,100,115,44,32,82,101,113,117,101,115,116,41,32,119,104,101,110,32,105,115,95,108,105,115,116,40,83,101,114,118,101,114,80,105,100,115,41,32,45,62,10,32,32,32,32,82,101,113,73,100,32,61,32,109,97,107,101,95,114,101,102,40,41,44,10,32,32,32,32,108,105,115,116,115,58,102,111,114,101,97,99,104,40,102,117,110,32,40,83,101,114,118,101,114,80,105,100,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,95,32,61,32,109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,91,123,116,97,103,44,32,123,39,68,79,87,78,39,44,32,82,101,113,73,100,125,125,93,41,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,32,33,32,123,114,101,113,117,101,115,116,44,32,115,101,108,102,40,41,44,32,82,101,113,73,100,44,32,82,101,113,117,101,115,116,125,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,83,101,114,118,101,114,80,105,100,115,41,44,10,32,32,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,108,101,110,103,116,104,40,83,101,114,118,101,114,80,105,100,115,41,44,32,91,93,41,46,10,10,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,95,82,101,113,73,100,44,32,48,44,32,65,99,99,41,32,45,62,10,32,32,32,32,65,99,99,59,10,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,78,44,32,65,99,99,41,32,45,62,10,32,32,32,32,37,37,32,84,104,101,32,99,111,109,112,105,108,101,114,32,119,105,108,108,32,100,101,116,101,99,116,32,116,104,97,116,32,119,101,32,109,97,116,99,104,32,111,110,32,116,104,101,32,39,82,101,113,73,100,39,10,32,32,32,32,37,37,32,114,101,102,101,114,101,110,99,101,32,105,110,32,97,108,108,32,99,108,97,117,115,101,115,44,32,97,110,100,32,119,105,108,108,32,101,110,97,98,108,101,32,116,104,101,32,115,101,108,101,99,116,105,118,101,10,32,32,32,32,37,37,32,114,101,99,101,105,118,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,119,104,105,99,104,32,109,97,107,101,115,32,116,104,101,32,114,101,99,101,105,118,101,32,97,98,108,101,32,116,111,10,32,32,32,32,37,37,32,115,107,105,112,32,112,97,115,116,32,97,108,108,32,109,101,115,115,97,103,101,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,116,10,32,32,32,32,37,37,32,116,104,101,32,116,105,109,101,32,119,104,101,110,32,116,104,101,32,39,82,101,113,73,100,39,32,114,101,102,101,114,101,110,99,101,32,119,97,115,32,99,114,101,97,116,101,100,46,46,46,10,32,32,32,32,82,101,115,32,61,32,114,101,99,101,105,118,101,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,114,101,112,108,121,44,32,83,101,114,118,101,114,80,105,100,44,32,82,101,113,73,100,44,32,82,101,115,117,108,116,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,72,101,114,101,32,119,101,32,116,121,112,105,99,97,108,108,121,32,119,111,117,108,100,32,104,97,118,101,32,100,101,97,99,116,105,118,97,116,101,100,32,116,104,101,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,109,111,110,105,116,111,114,32,98,121,32,97,32,99,97,108,108,32,116,111,32,100,101,109,111,110,105,116,111,114,40,77,111,110,44,32,91,102,108,117,115,104,93,41,32,98,117,116,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,37,37,32,119,101,32,105,103,110,111,114,101,32,116,104,105,115,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,102,111,114,32,115,105,109,112,108,105,99,105,116,121,46,46,46,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,111,107,44,32,83,101,114,118,101,114,80,105,100,44,32,82,101,115,117,108,116,125,59,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,123,39,68,79,87,78,39,44,32,82,101,113,73,100,125,44,32,95,77,111,110,44,32,112,114,111,99,101,115,115,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,123,101,114,114,111,114,44,32,83,101,114,118,101,114,80,105,100,44,32,69,120,105,116,82,101,97,115,111,110,125,10,32,32,32,32,32,32,32,32,32,32,101,110,100,44,10,32,32,32,32,114,101,99,101,105,118,101,95,114,101,112,108,105,101,115,40,82,101,113,73,100,44,32,78,45,49,44,32,91,82,101,115,32,124,32,65,99,99,93,41,46,10,9,32,32,32,32>>]}]},{p,[],[<<73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,101,120,97,109,112,108,101,32,116,111,32,119,111,114,107,32,97,115,32,105,110,116,101,110,100,101,100,44,32,116,104,101,32,99,108,105,101,110,116,32,109,117,115,116,32,98,101,32,101,120,101,99,117,116,105,110,103,32,111,110,32,97,116,32,108,101,97,115,116,32,97,110,32,79,84,80,32,50,52,32,115,121,115,116,101,109,44,32,98,117,116,32,116,104,101,32,115,101,114,118,101,114,115,32,109,97,121,32,101,120,101,99,117,116,101,32,111,110,32,111,108,100,101,114,32,115,121,115,116,101,109,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,53,51,51>>,signature => [{attribute,{1476,2},spec,{{monitor,3},[{type,{1477,7},bounded_fun,[{type,{1477,7},'fun',[{type,{1477,7},product,[{atom,{1477,8},process},{user_type,{1477,17},monitor_process_identifier,[]},{type,{1477,47},list,[{user_type,{1477,48},monitor_option,[]}]}]},{var,{1477,70},'MonitorRef'}]},[{type,{1478,9},constraint,[{atom,{1478,9},is_subtype},[{var,{1478,9},'MonitorRef'},{type,{1478,23},reference,[]}]]}]]},{type,{1479,7},bounded_fun,[{type,{1479,7},'fun',[{type,{1479,7},product,[{atom,{1479,8},port},{user_type,{1479,14},monitor_port_identifier,[]},{type,{1479,41},list,[{user_type,{1479,42},monitor_option,[]}]}]},{var,{1479,64},'MonitorRef'}]},[{type,{1480,9},constraint,[{atom,{1480,9},is_subtype},[{var,{1480,9},'MonitorRef'},{type,{1480,23},reference,[]}]]}]]},{type,{1481,7},bounded_fun,[{type,{1481,7},'fun',[{type,{1481,7},product,[{atom,{1481,8},time_offset},{atom,{1481,21},clock_service},{type,{1481,36},list,[{user_type,{1481,37},monitor_option,[]}]}]},{var,{1481,59},'MonitorRef'}]},[{type,{1482,9},constraint,[{atom,{1482,9},is_subtype},[{var,{1482,9},'MonitorRef'},{type,{1482,23},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,monitor_node,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1488}],[<<109,111,110,105,116,111,114,95,110,111,100,101,47,50>>],#{<<101,110>> => [{p,[],[<<77,111,110,105,116,111,114,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,108,97,103>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,110,46,32,73,102,32>>,{code,[],[<<70,108,97,103>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,109,111,110,105,116,111,114,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,46>>]},{p,[],[<<77,97,107,105,110,103,32,115,101,118,101,114,97,108,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41>>]},<<32,102,111,114,32,116,104,101,32,115,97,109,101,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,59,32,105,116,32,114,101,115,117,108,116,115,32,105,110,32,97,115,32,109,97,110,121,32,105,110,100,101,112,101,110,100,101,110,116,32,109,111,110,105,116,111,114,105,110,103,32,105,110,115,116,97,110,99,101,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,102,97,105,108,115,32,111,114,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,110,111,100,101,100,111,119,110,44,32,78,111,100,101,125>>]},<<32,105,115,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,109,97,100,101,32,116,119,111,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<109,111,110,105,116,111,114,95,110,111,100,101,40,78,111,100,101,44,32,116,114,117,101,41>>]},<<32,97,110,100,32>>,{code,[],[<<78,111,100,101>>]},<<32,116,101,114,109,105,110,97,116,101,115,44,32,116,119,111,32>>,{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32>>,{code,[],[<<78,111,100,101>>]},<<44,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,99,114,101,97,116,101,32,111,110,101,46,32,73,102,32,116,104,105,115,32,102,97,105,108,115,44,32,97,32>>,{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,100,101,108,105,118,101,114,101,100,46>>]},{p,[],[<<84,104,101,32,100,101,108,105,118,101,114,121,32,111,102,32,116,104,101,32>>,{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,115,105,103,110,97,108,32,105,115,32,110,111,116,32,111,114,100,101,114,101,100,32,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,32,111,116,104,101,114,32,108,105,110,107,32,111,114,32,109,111,110,105,116,111,114,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,110,111,100,101,32,116,104,97,116,32,103,111,101,115,32,100,111,119,110,46,32,73,102,32,121,111,117,32,110,101,101,100,32,97,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,108,108,32,115,105,103,110,97,108,115,32,102,114,111,109,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,104,97,115,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,101,32>>,{code,[],[<<110,111,100,101,100,111,119,110>>]},<<32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,44,32,121,111,117,32,115,104,111,117,108,100,32,117,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,110,101,116,95,107,101,114,110,101,108,35,109,111,110,105,116,111,114,95,110,111,100,101,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,101,116,95,107,101,114,110,101,108,58,109,111,110,105,116,111,114,95,110,111,100,101,115,47,49>>]}]},<<46>>]},{p,[],[<<78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,109,111,110,105,116,111,114,101,100,32,97,115,32,97,110,121,32,111,116,104,101,114,32,110,111,100,101,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<110,111,116,97,108,105,118,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,54,57,57>>,signature => [{attribute,{1488,2},spec,{{monitor_node,2},[{type,{1488,19},bounded_fun,[{type,{1488,19},'fun',[{type,{1488,19},product,[{var,{1488,20},'Node'},{var,{1488,26},'Flag'}]},{atom,{1488,35},true}]},[{type,{1489,7},constraint,[{atom,{1489,7},is_subtype},[{var,{1489,7},'Node'},{type,{1489,15},node,[]}]]},{type,{1490,7},constraint,[{atom,{1490,7},is_subtype},[{var,{1490,7},'Flag'},{type,{1490,15},boolean,[]}]]}]]}]}}]}},{{function,monitor_node,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1495}],[<<109,111,110,105,116,111,114,95,110,111,100,101,47,51>>],#{<<101,110>> => [{p,[],[<<66,101,104,97,118,101,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,95,110,111,100,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,95,110,111,100,101,47,50>>]}]},<<32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,108,111,119,115,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,44,32,110,97,109,101,108,121,32>>,{code,[],[<<97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116>>]},<<46,32,84,104,105,115,32,111,112,116,105,111,110,32,97,108,108,111,119,115,32,116,104,101,32,66,73,70,32,116,111,32,119,97,105,116,32,116,104,101,32,110,111,114,109,97,108,32,110,101,116,119,111,114,107,32,99,111,110,110,101,99,116,105,111,110,32,116,105,109,101,45,111,117,116,32,102,111,114,32,116,104,101,32>>,{em,[],[<<109,111,110,105,116,111,114,101,100,32,110,111,100,101>>]},<<32,116,111,32,99,111,110,110,101,99,116,32,105,116,115,101,108,102,44,32,101,118,101,110,32,105,102,32,105,116,32,99,97,110,110,111,116,32,98,101,32,97,99,116,105,118,101,108,121,32,99,111,110,110,101,99,116,101,100,32,102,114,111,109,32,116,104,105,115,32,110,111,100,101,32,40,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,98,108,111,99,107,101,100,41,46,32,84,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,99,97,110,32,111,110,108,121,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,32,117,115,105,110,103,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,32>>,{code,[],[<<100,105,115,116,95,97,117,116,111,95,99,111,110,110,101,99,116,32,111,110,99,101>>]},<<46,32,73,102,32,116,104,97,116,32,111,112,116,105,111,110,32,105,115,32,110,111,116,32,117,115,101,100,44,32,111,112,116,105,111,110,32>>,{code,[],[<<97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116>>]},<<32,104,97,115,32,110,111,32,101,102,102,101,99,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<97,108,108,111,119,95,112,97,115,115,105,118,101,95,99,111,110,110,101,99,116>>]},<<32,105,115,32,117,115,101,100,32,105,110,116,101,114,110,97,108,108,121,32,97,110,100,32,105,115,32,115,101,108,100,111,109,32,110,101,101,100,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,115,32,119,104,101,114,101,32,116,104,101,32,110,101,116,119,111,114,107,32,116,111,112,111,108,111,103,121,32,97,110,100,32,116,104,101,32,75,101,114,110,101,108,32,111,112,116,105,111,110,115,32,105,110,32,101,102,102,101,99,116,32,97,114,101,32,107,110,111,119,110,32,105,110,32,97,100,118,97,110,99,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,32,111,114,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,32,109,97,108,102,111,114,109,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,55,50,57>>,signature => [{attribute,{1495,2},spec,{{erlang,monitor_node,3},[{type,{1495,26},bounded_fun,[{type,{1495,26},'fun',[{type,{1495,26},product,[{var,{1495,27},'Node'},{var,{1495,33},'Flag'},{var,{1495,39},'Options'}]},{atom,{1495,51},true}]},[{type,{1496,7},constraint,[{atom,{1496,7},is_subtype},[{var,{1496,7},'Node'},{type,{1496,15},node,[]}]]},{type,{1497,7},constraint,[{atom,{1497,7},is_subtype},[{var,{1497,7},'Flag'},{type,{1497,15},boolean,[]}]]},{type,{1498,7},constraint,[{atom,{1498,7},is_subtype},[{var,{1498,7},'Options'},{type,{1498,18},list,[{var,{1498,19},'Option'}]}]]},{type,{1499,7},constraint,[{atom,{1499,7},is_subtype},[{var,{1499,7},'Option'},{atom,{1499,17},allow_passive_connect}]]}]]}]}}]}},{{function,monotonic_time,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1597}],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46,32,84,104,105,115,32,105,115,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,115,105,110,99,101,32,115,111,109,101,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,105,115,32,97,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,111,110,111,116,111,110,105,99,97,108,108,121,95,73,110,99,114,101,97,115,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103>>]},<<32,116,105,109,101,44,32,98,117,116,32>>,{em,[],[<<110,111,116>>]},<<32,97,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,116,114,105,99,116,108,121,95,77,111,110,111,116,111,110,105,99,97,108,108,121,95,73,110,99,114,101,97,115,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103>>]},<<32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,115,101,99,117,116,105,118,101,32,99,97,108,108,115,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>]},<<32,99,97,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,46>>]},{p,[],[<<68,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,119,105,108,108,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,115,32,105,110,32,116,105,109,101,32,97,115,32,98,97,115,101,32,102,111,114,32,116,104,101,105,114,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,99,108,111,99,107,115,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,115,32>>,{em,[],[<<112,111,105,110,116,108,101,115,115>>]},<<32,99,111,109,112,97,114,105,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,115,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,46,32,68,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,115,32,99,97,110,32,97,108,115,111,32,112,108,97,99,101,32,116,104,105,115,32,117,110,115,112,101,99,105,102,105,101,100,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,100,105,102,102,101,114,101,110,116,32,114,101,108,97,116,105,118,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,46,32,73,116,32,99,97,110,32,98,101,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,110,101,103,97,116,105,118,101,32,118,97,108,117,101,41,44,32,116,104,101,32,112,97,115,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,118,97,108,117,101,41,44,32,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,40,116,105,109,101,32,97,116,32,115,116,97,114,116,32,105,115,32,122,101,114,111,41,46,32,84,104,101,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,97,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,116,97,114,116,95,116,105,109,101,41>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,55,53,53>>,signature => [{attribute,{1597,2},spec,{{erlang,monotonic_time,0},[{type,{1597,28},'fun',[{type,{1597,28},product,[]},{type,{1597,34},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,monotonic_time,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1602}],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32>>,{code,[],[<<85,110,105,116>>]},<<32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{p,[],[<<83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]}]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<32>>,{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41>>]}]},{code,[],[<<44,32,110,97,116,105,118,101,44,32,85,110,105,116,41>>]},<<44,32,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32>>,{code,[],[<<85,110,105,116>>]},<<115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,55,56,57>>,signature => [{attribute,{1602,2},spec,{{erlang,monotonic_time,1},[{type,{1602,28},bounded_fun,[{type,{1602,28},'fun',[{type,{1602,28},product,[{var,{1602,29},'Unit'}]},{type,{1602,38},integer,[]}]},[{type,{1603,7},constraint,[{atom,{1603,7},is_subtype},[{var,{1603,7},'Unit'},{user_type,{1603,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,nif_error,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1505}],[<<110,105,102,95,101,114,114,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,47,49>>]}]},<<44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,32,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,48,55>>,signature => [{attribute,{1505,2},spec,{{erlang,nif_error,1},[{type,{1505,23},bounded_fun,[{type,{1505,23},'fun',[{type,{1505,23},product,[{var,{1505,24},'Reason'}]},{type,{1505,35},no_return,[]}]},[{type,{1506,7},constraint,[{atom,{1506,7},is_subtype},[{var,{1506,7},'Reason'},{type,{1506,17},term,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,nif_error,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1512}],[<<110,105,102,95,101,114,114,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<87,111,114,107,115,32,101,120,97,99,116,108,121,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,114,114,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,114,111,114,47,50>>]}]},<<44,32,98,117,116,32,68,105,97,108,121,122,101,114,32,116,104,105,110,107,115,32,116,104,97,116,32,116,104,105,115,32,66,73,70,32,119,105,108,108,32,114,101,116,117,114,110,32,97,110,32,97,114,98,105,116,114,97,114,121,32,116,101,114,109,46,32,87,104,101,110,32,117,115,101,100,32,105,110,32,97,32,115,116,117,98,32,102,117,110,99,116,105,111,110,32,102,111,114,32,97,32,78,73,70,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,116,104,101,32,78,73,70,32,108,105,98,114,97,114,121,32,105,115,32,110,111,116,32,108,111,97,100,101,100,44,32,68,105,97,108,121,122,101,114,32,100,111,101,115,32,110,111,116,32,103,101,110,101,114,97,116,101,32,102,97,108,115,101,32,119,97,114,110,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,50,48>>,signature => [{attribute,{1512,2},spec,{{erlang,nif_error,2},[{type,{1512,23},bounded_fun,[{type,{1512,23},'fun',[{type,{1512,23},product,[{var,{1512,24},'Reason'},{var,{1512,32},'Args'}]},{type,{1512,41},no_return,[]}]},[{type,{1513,7},constraint,[{atom,{1513,7},is_subtype},[{var,{1513,7},'Reason'},{type,{1513,17},term,[]}]]},{type,{1514,7},constraint,[{atom,{1514,7},is_subtype},[{var,{1514,7},'Args'},{type,{1514,15},list,[{type,{1514,16},term,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,node,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1520}],[<<110,111,100,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<110,111,110,111,100,101,64,110,111,104,111,115,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,51,51>>,signature => [{attribute,{1520,2},spec,{{node,0},[{type,{1520,11},bounded_fun,[{type,{1520,11},'fun',[{type,{1520,11},product,[]},{var,{1520,17},'Node'}]},[{type,{1521,7},constraint,[{atom,{1521,7},is_subtype},[{var,{1521,7},'Node'},{type,{1521,15},node,[]}]]}]]}]}}]}},{{function,node,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1527}],[<<110,111,100,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,111,100,101,32,119,104,101,114,101,32>>,{code,[],[<<65,114,103>>]},<<32,111,114,105,103,105,110,97,116,101,115,46,32>>,{code,[],[<<65,114,103>>]},<<32,99,97,110,32,98,101,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,32,112,111,114,116,46,32,73,102,32>>,{code,[],[<<65,114,103>>]},<<32,111,114,105,103,105,110,97,116,101,115,32,102,114,111,109,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,110,100,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<110,111,110,111,100,101,64,110,111,104,111,115,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,52,51>>,signature => [{attribute,{1527,2},spec,{{node,1},[{type,{1527,11},bounded_fun,[{type,{1527,11},'fun',[{type,{1527,11},product,[{var,{1527,12},'Arg'}]},{var,{1527,20},'Node'}]},[{type,{1528,7},constraint,[{atom,{1528,7},is_subtype},[{var,{1528,7},'Arg'},{type,{1528,14},union,[{type,{1528,14},pid,[]},{type,{1528,22},port,[]},{type,{1528,31},reference,[]}]}]]},{type,{1529,7},constraint,[{atom,{1529,7},is_subtype},[{var,{1529,7},'Node'},{type,{1529,15},node,[]}]]}]]}]}}]}},{{function,nodes,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3444}],[<<110,111,100,101,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,32,99,111,110,110,101,99,116,105,111,110,115,32,40,116,104,97,116,32,105,115,44,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,105,115,116,114,105,98,117,116,101,100,35,104,105,100,100,101,110,45,110,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<104,105,100,100,101,110,32,110,111,100,101,115>>]},<<32,97,114,101,32,110,111,116,32,108,105,115,116,101,100,41,46,32,83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,110,111,100,101,115,95,118,105,115,105,98,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<110,111,100,101,115,40,118,105,115,105,98,108,101,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,53,54>>,signature => [{attribute,{3444,2},spec,{{nodes,0},[{type,{3444,12},bounded_fun,[{type,{3444,12},'fun',[{type,{3444,12},product,[]},{var,{3444,18},'Nodes'}]},[{type,{3445,7},constraint,[{atom,{3445,7},is_subtype},[{var,{3445,7},'Nodes'},{type,{3445,16},list,[{type,{3445,17},node,[]}]}]]}]]}]}}]}},{{function,nodes,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2371}],[<<110,111,100,101,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,114,101,115,117,108,116,44,32,119,104,101,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,44,32,105,115,32,116,104,101,32,108,105,115,116,32,111,102,32,110,111,100,101,115,32,115,97,116,105,115,102,121,105,110,103,32,116,104,101,32,100,105,115,106,117,110,99,116,105,111,110,40,115,41,32,111,102,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,46>>]},{p,[],[{code,[],[<<78,111,100,101,84,121,112,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{a,[{id,<<110,111,100,101,115,95,118,105,115,105,98,108,101>>}],[]},{code,[],[<<118,105,115,105,98,108,101>>]}]},{dd,[],[{p,[],[<<78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,110,111,114,109,97,108,32,99,111,110,110,101,99,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<104,105,100,100,101,110>>]}]},{dd,[],[{p,[],[<<78,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,32,116,104,114,111,117,103,104,32,104,105,100,100,101,110,32,99,111,110,110,101,99,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<99,111,110,110,101,99,116,101,100>>]}]},{dd,[],[{p,[],[<<65,108,108,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,105,115,32,110,111,100,101,46>>]}]},{dt,[],[{code,[],[<<116,104,105,115>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,110,111,100,101,46>>]}]},{dt,[],[{code,[],[<<107,110,111,119,110>>]}]},{dd,[],[{p,[],[<<78,111,100,101,115,32,116,104,97,116,32,97,114,101,32,107,110,111,119,110,32,116,111,32,116,104,105,115,32,110,111,100,101,46,32,84,104,97,116,32,105,115,44,32,99,111,110,110,101,99,116,101,100,32,110,111,100,101,115,32,97,110,100,32,110,111,100,101,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,32,108,111,99,97,116,101,100,32,111,110,32,116,104,105,115,32,110,111,100,101,46,32,84,104,101,32,115,101,116,32,111,102,32,107,110,111,119,110,32,110,111,100,101,115,32,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,99,97,110,32,98,101,32,100,101,108,97,121,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99,41>>]}]},<<46>>]}]}]},{p,[],[<<83,111,109,101,32,101,113,117,97,108,105,116,105,101,115,58,32>>,{code,[],[<<91,110,111,100,101,40,41,93,32,61,32,110,111,100,101,115,40,116,104,105,115,41>>]},<<44,32>>,{code,[],[<<110,111,100,101,115,40,99,111,110,110,101,99,116,101,100,41,32,61,32,110,111,100,101,115,40,91,118,105,115,105,98,108,101,44,32,104,105,100,100,101,110,93,41>>]},<<44,32,97,110,100,32>>,{code,[],[<<110,111,100,101,115,40,41,32,61,32,110,111,100,101,115,40,118,105,115,105,98,108,101,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,56,54,56>>,signature => [{attribute,{2371,2},spec,{{nodes,1},[{type,{2371,12},bounded_fun,[{type,{2371,12},'fun',[{type,{2371,12},product,[{var,{2371,13},'Arg'}]},{var,{2371,21},'Nodes'}]},[{type,{2372,7},constraint,[{atom,{2372,7},is_subtype},[{var,{2372,7},'Arg'},{type,{2372,14},union,[{var,{2372,14},'NodeType'},{type,{2372,25},list,[{var,{2372,26},'NodeType'}]}]}]]},{type,{2373,7},constraint,[{atom,{2373,7},is_subtype},[{var,{2373,7},'NodeType'},{type,{2373,19},union,[{atom,{2373,19},visible},{atom,{2373,29},hidden},{atom,{2373,38},connected},{atom,{2373,50},this},{atom,{2373,57},known}]}]]},{type,{2374,7},constraint,[{atom,{2374,7},is_subtype},[{var,{2374,7},'Nodes'},{type,{2374,16},list,[{type,{2374,17},node,[]}]}]]}]]}]}}]}},{{function,now,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1534}],[<<110,111,119,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<116,105,109,101,115,116,97,109,112>>}],[]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[{em,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,68,111,32,110,111,116,32,117,115,101,32,105,116,46>>]}]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46,32,83,112,101,99,105,102,105,99,97,108,108,121,44,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,68,111,115,95,97,110,100,95,68,111,110,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<68,111,115,32,97,110,100,32,68,111,110,116,39,115>>]},<<32,100,101,115,99,114,105,98,101,115,32,119,104,97,116,32,116,111,32,117,115,101,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,47,48>>]},<<46>>]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,101,108,97,112,115,101,100,32,116,105,109,101,32,115,105,110,99,101,32,48,48,58,48,48,32,71,77,84,44,32,74,97,110,117,97,114,121,32,49,44,32,49,57,55,48,32,40,122,101,114,111,32,104,111,117,114,41,44,32,105,102,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,115,111,109,101,32,111,116,104,101,114,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,105,115,32,99,104,111,115,101,110,46,32,73,116,32,105,115,32,97,108,115,111,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,115,32,116,111,32,116,104,105,115,32,66,73,70,32,114,101,116,117,114,110,32,99,111,110,116,105,110,117,111,117,115,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46,32,72,101,110,99,101,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,47,48>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,110,101,114,97,116,101,32,117,110,105,113,117,101,32,116,105,109,101,32,115,116,97,109,112,115,46,32,73,102,32,105,116,32,105,115,32,99,97,108,108,101,100,32,105,110,32,97,32,116,105,103,104,116,32,108,111,111,112,32,111,110,32,97,32,102,97,115,116,32,109,97,99,104,105,110,101,44,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,110,111,100,101,32,99,97,110,32,98,101,99,111,109,101,32,115,107,101,119,101,100,46>>]},{p,[],[<<67,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,116,111,32,99,104,101,99,107,32,116,104,101,32,108,111,99,97,108,32,116,105,109,101,32,111,102,32,100,97,121,32,105,102,32,116,104,101,32,116,105,109,101,45,122,111,110,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,102,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,32,105,115,32,112,114,111,112,101,114,108,121,32,99,111,110,102,105,103,117,114,101,100,46>>]}]},#{deprecated => <<101,114,108,97,110,103,58,110,111,119,47,48,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,115,101,101,32,116,104,101,32,34,84,105,109,101,32,97,110,100,32,84,105,109,101,32,67,111,114,114,101,99,116,105,111,110,32,105,110,32,69,114,108,97,110,103,34,32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32,69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110>>,edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,57,49,49>>,signature => [{attribute,{1534,2},spec,{{now,0},[{type,{1534,10},bounded_fun,[{type,{1534,10},'fun',[{type,{1534,10},product,[]},{var,{1534,16},'Timestamp'}]},[{type,{1535,7},constraint,[{atom,{1535,7},is_subtype},[{var,{1535,7},'Timestamp'},{user_type,{1535,20},timestamp,[]}]]}]]}]}}]}},{{function,open_port,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2378}],[<<111,112,101,110,95,112,111,114,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,111,112,101,110,105,110,103,32,97,32,110,101,119,32,69,114,108,97,110,103,32,112,111,114,116,46,32,65,32,112,111,114,116,32,99,97,110,32,98,101,32,115,101,101,110,32,97,115,32,97,110,32,101,120,116,101,114,110,97,108,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32>>,{code,[],[<<99,100>>]},<<44,32>>,{code,[],[<<101,110,118>>]},<<44,32>>,{code,[],[<<97,114,103,115>>]},<<44,32,97,110,100,32>>,{code,[],[<<97,114,103,48>>]},<<32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,105,102,32,116,104,101,32,115,121,115,116,101,109,32,105,115,32,114,117,110,110,105,110,103,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,46,32,84,111,32,97,118,111,105,100,32,116,114,97,110,115,108,97,116,105,111,110,32,111,114,32,116,111,32,102,111,114,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,32,85,84,70,45,56,44,32,115,117,112,112,108,121,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,97,110,100,47,111,114,32,97,114,103,117,109,101,110,116,115,32,97,115,32,97,32,98,105,110,97,114,121,32,105,110,32,116,104,101,32,99,111,114,114,101,99,116,32,101,110,99,111,100,105,110,103,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32,116,104,101,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,105,108,101,40,51,41>>]}]},<<44,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,105,108,101,58,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>]}]},<<32,105,110,32,75,101,114,110,101,108,44,32,97,110,100,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,95,117,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<85,115,105,110,103,32,85,110,105,99,111,100,101,32,105,110,32,69,114,108,97,110,103>>]}]},<<32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,110,97,109,101,32,40,105,102,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,108,105,115,116,41,32,99,97,110,32,111,110,108,121,32,98,101,32,62,32,50,53,53,32,105,102,32,116,104,101,32,69,114,108,97,110,103,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,105,115,32,115,116,97,114,116,101,100,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,116,114,97,110,115,108,97,116,105,111,110,32,109,111,100,101,46,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,105,115,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46>>]}]},{p,[],[{code,[],[<<80,111,114,116,78,97,109,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,115,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,116,111,32,98,101,32,114,117,110,46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,114,117,110,115,32,111,117,116,115,105,100,101,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,32,117,110,108,101,115,115,32,97,110,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32,102,111,117,110,100,44,32,116,104,97,116,32,100,114,105,118,101,114,32,105,115,32,115,116,97,114,116,101,100,46,32,65,32,100,114,105,118,101,114,32,114,117,110,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,119,111,114,107,32,115,112,97,99,101,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,104,97,116,32,105,116,32,105,115,32,108,105,110,107,101,100,32,119,105,116,104,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<70,111,114,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,44,32>>,{code,[],[<<80,65,84,72>>]},<<32,105,115,32,115,101,97,114,99,104,101,100,32,40,111,114,32,97,110,32,101,113,117,105,118,97,108,101,110,116,32,109,101,116,104,111,100,32,105,115,32,117,115,101,100,32,116,111,32,102,105,110,100,32,112,114,111,103,114,97,109,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,79,83,41,46,32,84,104,105,115,32,105,115,32,100,111,110,101,32,98,121,32,105,110,118,111,107,105,110,103,32,116,104,101,32,115,104,101,108,108,32,111,110,32,99,101,114,116,97,105,110,32,112,108,97,116,102,111,114,109,115,46,32,84,104,101,32,102,105,114,115,116,32,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,32,40,111,114,32,100,114,105,118,101,114,41,46,32,84,104,105,115,32,40,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,41,32,109,97,107,101,115,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,115,117,105,116,97,98,108,101,32,102,111,114,32,114,117,110,110,105,110,103,32,112,114,111,103,114,97,109,115,32,119,105,116,104,32,115,112,97,99,101,115,32,105,110,32,102,105,108,101,110,97,109,101,115,32,111,114,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,46,32,73,102,32,115,112,97,99,101,115,32,105,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,110,97,109,101,115,32,97,114,101,32,100,101,115,105,114,101,100,44,32,117,115,101,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125>>]},<<32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,67,111,109,109,97,110,100,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<44,32,98,117,116,32,100,101,109,97,110,100,115,32,116,104,101,32,102,105,114,115,116,32,40,115,112,97,99,101,45,115,101,112,97,114,97,116,101,100,41,32,116,111,107,101,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,32,116,111,32,98,101,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,97,100,101,100,32,100,114,105,118,101,114,46,32,73,102,32,110,111,32,100,114,105,118,101,114,32,119,105,116,104,32,116,104,97,116,32,110,97,109,101,32,105,115,32,108,111,97,100,101,100,44,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<123,115,112,97,119,110,44,32,70,105,108,101,78,97,109,101,125>>]},<<44,32,98,117,116,32,111,110,108,121,32,114,117,110,115,32,101,120,116,101,114,110,97,108,32,101,120,101,99,117,116,97,98,108,101,115,46,32>>,{code,[],[<<70,105,108,101,78,97,109,101>>]},<<32,105,110,32,105,116,115,32,119,104,111,108,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,44,32,105,110,99,108,117,100,105,110,103,32,97,110,121,32,115,112,97,99,101,115,46,32,73,102,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,116,111,32,98,101,32,112,97,115,115,101,100,44,32,116,104,101,32>>,{code,[],[<<80,111,114,116,83,101,116,116,105,110,103,115>>]},<<32>>,{code,[],[<<97,114,103,115>>]},<<32,97,110,100,32>>,{code,[],[<<97,114,103,48>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,115,104,101,108,108,32,105,115,32,117,115,117,97,108,108,121,32,110,111,116,32,105,110,118,111,107,101,100,32,116,111,32,115,116,97,114,116,32,116,104,101,32,112,114,111,103,114,97,109,44,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,32,100,105,114,101,99,116,108,121,46,32>>,{code,[],[<<80,65,84,72>>]},<<32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,105,115,32,110,111,116,32,115,101,97,114,99,104,101,100,46,32,84,111,32,102,105,110,100,32,97,32,112,114,111,103,114,97,109,32,105,110,32>>,{code,[],[<<80,65,84,72>>]},<<32,116,111,32,101,120,101,99,117,116,101,44,32,117,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,102,105,110,100,95,101,120,101,99,117,116,97,98,108,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,102,105,110,100,95,101,120,101,99,117,116,97,98,108,101,47,49>>]}]},<<46>>]},{p,[],[<<79,110,108,121,32,105,102,32,97,32,115,104,101,108,108,32,115,99,114,105,112,116,32,111,114,32>>,{code,[],[<<46,98,97,116>>]},<<32,102,105,108,101,32,105,115,32,101,120,101,99,117,116,101,100,44,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,109,109,97,110,100,32,105,110,116,101,114,112,114,101,116,101,114,32,105,115,32,105,110,118,111,107,101,100,32,105,109,112,108,105,99,105,116,108,121,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,115,116,105,108,108,32,110,111,32,99,111,109,109,97,110,100,45,97,114,103,117,109,101,110,116,32,101,120,112,97,110,115,105,111,110,32,111,114,32,105,109,112,108,105,99,105,116,32>>,{code,[],[<<80,65,84,72>>]},<<32,115,101,97,114,99,104,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,105,108,101,78,97,109,101>>]},<<32,99,97,110,110,111,116,32,98,101,32,114,117,110,44,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,105,115,32,114,97,105,115,101,100,44,32,119,105,116,104,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,32,97,115,32,116,104,101,32,114,101,97,115,111,110,46,32,84,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,79,83,115,46,32,84,121,112,105,99,97,108,108,121,32,116,104,101,32,101,114,114,111,114,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,97,110,32,97,116,116,101,109,112,116,32,105,115,32,109,97,100,101,32,116,111,32,114,117,110,32,97,32,112,114,111,103,114,97,109,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,117,110,100,32,97,110,100,32>>,{code,[],[<<101,97,99,99,101,115>>]},<<32,105,115,32,114,97,105,115,101,100,32,119,104,101,110,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,105,108,101,32,105,115,32,110,111,116,32,101,120,101,99,117,116,97,98,108,101,46>>]}]},{dt,[],[{code,[],[<<123,102,100,44,32,73,110,44,32,79,117,116,125>>]}]},{dd,[],[{p,[],[<<65,108,108,111,119,115,32,97,110,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,116,111,32,97,99,99,101,115,115,32,97,110,121,32,99,117,114,114,101,110,116,108,121,32,111,112,101,110,101,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,117,115,101,100,32,98,121,32,69,114,108,97,110,103,46,32,84,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32>>,{code,[],[<<73,110>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,44,32,97,110,100,32,116,104,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32>>,{code,[],[<<79,117,116>>]},<<32,102,111,114,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,46,32,73,116,32,105,115,32,111,110,108,121,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,115,101,114,118,101,114,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,79,83,32,40>>,{code,[],[<<115,104,101,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<117,115,101,114>>]},<<41,46,32,72,101,110,99,101,44,32,105,116,115,32,117,115,101,32,105,115,32,108,105,109,105,116,101,100,46>>]}]}]},{p,[],[{code,[],[<<80,111,114,116,83,101,116,116,105,110,103,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,101,116,116,105,110,103,115,32,102,111,114,32,116,104,101,32,112,111,114,116,46,32,84,104,101,32,118,97,108,105,100,32,115,101,116,116,105,110,103,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,97,99,107,101,116,44,32,78,125>>]}]},{dd,[],[{p,[],[<<77,101,115,115,97,103,101,115,32,97,114,101,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,101,105,114,32,108,101,110,103,116,104,44,32,115,101,110,116,32,105,110,32>>,{code,[],[<<78>>]},<<32,98,121,116,101,115,44,32,119,105,116,104,32,116,104,101,32,109,111,115,116,32,115,105,103,110,105,102,105,99,97,110,116,32,98,121,116,101,32,102,105,114,115,116,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<78>>]},<<32,97,114,101,32,49,44,32,50,44,32,97,110,100,32,52,46>>]}]},{dt,[],[{code,[],[<<115,116,114,101,97,109>>]}]},{dd,[],[{p,[],[<<79,117,116,112,117,116,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,119,105,116,104,111,117,116,32,112,97,99,107,101,116,32,108,101,110,103,116,104,115,46,32,65,32,117,115,101,114,45,100,101,102,105,110,101,100,32,112,114,111,116,111,99,111,108,32,109,117,115,116,32,98,101,32,117,115,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,111,98,106,101,99,116,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,101,44,32,76,125>>]}]},{dd,[],[{p,[],[<<77,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,111,110,32,97,32,112,101,114,32,108,105,110,101,32,98,97,115,105,115,46,32,69,97,99,104,32,108,105,110,101,32,40,100,101,108,105,109,105,116,101,100,32,98,121,32,116,104,101,32,79,83,45,100,101,112,101,110,100,101,110,116,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,32,105,115,32,100,101,108,105,118,101,114,101,100,32,105,110,32,97,32,115,105,110,103,108,101,32,109,101,115,115,97,103,101,46,32,84,104,101,32,109,101,115,115,97,103,101,32,100,97,116,97,32,102,111,114,109,97,116,32,105,115,32>>,{code,[],[<<123,70,108,97,103,44,32,76,105,110,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<70,108,97,103>>]},<<32,105,115,32>>,{code,[],[<<101,111,108>>]},<<32,111,114,32>>,{code,[],[<<110,111,101,111,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<76,105,110,101>>]},<<32,105,115,32,116,104,101,32,100,97,116,97,32,100,101,108,105,118,101,114,101,100,32,40,119,105,116,104,111,117,116,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,41,46>>]},{p,[],[{code,[],[<<76>>]},<<32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,108,105,110,101,32,108,101,110,103,116,104,32,105,110,32,98,121,116,101,115,46,32,76,105,110,101,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,105,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,105,110,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,109,101,115,115,97,103,101,44,32,119,105,116,104,32>>,{code,[],[<<70,108,97,103>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<110,111,101,111,108>>]},<<32,102,111,114,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,109,101,115,115,97,103,101,46,32,73,102,32,101,110,100,32,111,102,32,102,105,108,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,97,110,121,119,104,101,114,101,32,101,108,115,101,32,116,104,97,110,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,105,110,103,32,97,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,116,104,101,32,108,97,115,116,32,108,105,110,101,32,105,115,32,97,108,115,111,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32>>,{code,[],[<<70,108,97,103>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<110,111,101,111,108>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,108,105,110,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,119,105,116,104,32>>,{code,[],[<<70,108,97,103>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<101,111,108>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<123,112,97,99,107,101,116,44,32,78,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,108,105,110,101,44,32,76,125>>]},<<32,115,101,116,116,105,110,103,115,32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46>>]}]},{dt,[],[{code,[],[<<123,99,100,44,32,68,105,114,125>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46,32,84,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,32,115,116,97,114,116,115,32,117,115,105,110,103,32>>,{code,[],[<<68,105,114>>]},<<32,97,115,32,105,116,115,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,46,32>>,{code,[],[<<68,105,114>>]},<<32,109,117,115,116,32,98,101,32,97,32,115,116,114,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,101,110,118,44,32,69,110,118,125>>]}]},{dd,[],[{p,[],[<<84,121,112,101,115,58>>,{br,[],[]},<<194,160,194,160>>,{code,[],[<<78,97,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,111,115,35,101,110,118,95,118,97,114,95,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<111,115,58,101,110,118,95,118,97,114,95,110,97,109,101,40,41>>]}]},{br,[],[]},<<194,160,194,160>>,{code,[],[<<86,97,108,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,111,115,35,101,110,118,95,118,97,114,95,118,97,108,117,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<111,115,58,101,110,118,95,118,97,114,95,118,97,108,117,101,40,41>>]}]},{code,[],[<<32,124,32,102,97,108,115,101>>]},{br,[],[]},<<194,160,194,160>>,{code,[],[<<69,110,118,32,61,32,91,123,78,97,109,101,44,32,86,97,108,125,93>>]}]},{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<44,32,97,110,100,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46,32,84,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,111,102,32,116,104,101,32,115,116,97,114,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,101,120,116,101,110,100,101,100,32,117,115,105,110,103,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32>>,{code,[],[<<69,110,118>>]},<<46>>]},{p,[],[{code,[],[<<69,110,118>>]},<<32,105,115,32,116,111,32,98,101,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32>>,{code,[],[<<123,78,97,109,101,44,32,86,97,108,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,97,110,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,44,32,97,110,100,32>>,{code,[],[<<86,97,108>>]},<<32,105,115,32,116,104,101,32,118,97,108,117,101,32,105,116,32,105,115,32,116,111,32,104,97,118,101,32,105,110,32,116,104,101,32,115,112,97,119,110,101,100,32,112,111,114,116,32,112,114,111,99,101,115,115,46,32,66,111,116,104,32>>,{code,[],[<<78,97,109,101>>]},<<32,97,110,100,32>>,{code,[],[<<86,97,108>>]},<<32,109,117,115,116,32,98,101,32,115,116,114,105,110,103,115,46,32,84,104,101,32,111,110,101,32,101,120,99,101,112,116,105,111,110,32,105,115,32>>,{code,[],[<<86,97,108>>]},<<32,98,101,105,110,103,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,40,105,110,32,97,110,97,108,111,103,121,32,119,105,116,104,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,103,101,116,101,110,118,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,103,101,116,101,110,118,47,49>>]}]},<<44,32,119,104,105,99,104,32,114,101,109,111,118,101,115,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,110,99,111,100,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,115,44,32,115,101,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,121,112,101,115,32,102,111,114,32>>,{code,[],[<<78,97,109,101>>]},<<32,97,110,100,32>>,{code,[],[<<86,97,108>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,97,114,103,115,44,32,91,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,32,93,125>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<32,97,110,100,32,115,112,101,99,105,102,105,101,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,46,32,69,97,99,104,32,97,114,103,117,109,101,110,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32,115,116,114,105,110,103,32,97,110,100,32,40,111,110,32,85,110,105,120,41,32,101,118,101,110,116,117,97,108,108,121,32,101,110,100,115,32,117,112,32,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,101,97,99,104,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,46,32,79,110,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,97,32,115,105,109,105,108,97,114,32,98,101,104,97,118,105,111,114,32,105,115,32,109,105,109,105,99,107,101,100,46>>]},{p,[],[<<84,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,110,111,116,32,101,120,112,97,110,100,101,100,32,98,121,32,116,104,101,32,115,104,101,108,108,32,98,101,102,111,114,101,32,116,104,101,121,32,97,114,101,32,115,117,112,112,108,105,101,100,32,116,111,32,116,104,101,32,101,120,101,99,117,116,97,98,108,101,46,32,77,111,115,116,32,110,111,116,97,98,108,121,32,116,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,102,105,108,101,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,46,32,84,111,32,101,120,112,97,110,100,32,119,105,108,100,99,97,114,100,115,32,102,111,114,32,116,104,101,32,97,114,103,117,109,101,110,116,115,44,32,117,115,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,102,105,108,101,108,105,98,35,119,105,108,100,99,97,114,100,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,105,108,101,108,105,98,58,119,105,108,100,99,97,114,100,47,49>>]}]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,101,118,101,110,32,105,102,32,116,104,101,32,112,114,111,103,114,97,109,32,105,115,32,97,32,85,110,105,120,32,115,104,101,108,108,32,115,99,114,105,112,116,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,116,104,101,32,115,104,101,108,108,32,117,108,116,105,109,97,116,101,108,121,32,105,115,32,105,110,118,111,107,101,100,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,44,32,97,110,100,32,116,104,101,32,115,99,114,105,112,116,32,105,115,32,112,114,111,118,105,100,101,100,32,119,105,116,104,32,116,104,101,32,117,110,116,111,117,99,104,101,100,32,97,114,103,117,109,101,110,116,115,46,32,79,110,32,87,105,110,100,111,119,115,44,32,119,105,108,100,99,97,114,100,32,101,120,112,97,110,115,105,111,110,32,105,115,32,97,108,119,97,121,115,32,117,112,32,116,111,32,116,104,101,32,112,114,111,103,114,97,109,32,105,116,115,101,108,102,44,32,116,104,101,114,101,102,111,114,101,32,116,104,105,115,32,105,115,32,110,111,116,32,97,110,32,105,115,115,117,101,46>>]},{p,[],[<<84,104,101,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,40,97,108,115,111,32,107,110,111,119,110,32,97,115,32>>,{code,[],[<<97,114,103,118,91,48,93>>]},<<41,32,105,115,32,110,111,116,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,105,115,32,108,105,115,116,46,32,84,104,101,32,112,114,111,112,101,114,32,101,120,101,99,117,116,97,98,108,101,32,110,97,109,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,117,115,101,100,32,97,115,32>>,{code,[],[<<97,114,103,118,91,48,93>>]},<<44,32,119,104,101,114,101,32,97,112,112,108,105,99,97,98,108,101,46>>]},{p,[],[<<73,102,32,121,111,117,32,101,120,112,108,105,99,105,116,108,121,32,119,97,110,116,32,116,111,32,115,101,116,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,32,105,110,32,116,104,101,32,97,114,103,117,109,101,110,116,32,118,101,99,116,111,114,44,32,111,112,116,105,111,110,32>>,{code,[],[<<97,114,103,48>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,97,114,103,48,44,32,115,116,114,105,110,103,40,41,32,124,32,98,105,110,97,114,121,40,41,125>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<32,97,110,100,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,115,32,116,104,101,32,112,114,111,103,114,97,109,32,110,97,109,101,32,97,114,103,117,109,101,110,116,32,119,104,101,110,32,114,117,110,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,46,32,84,104,105,115,32,99,97,110,32,105,110,32,115,111,109,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,44,32,111,110,32,115,111,109,101,32,79,83,115,44,32,98,101,32,100,101,115,105,114,97,98,108,101,46,32,72,111,119,32,116,104,101,32,112,114,111,103,114,97,109,32,114,101,115,112,111,110,100,115,32,116,111,32,116,104,105,115,32,105,115,32,104,105,103,104,108,121,32,115,121,115,116,101,109,45,100,101,112,101,110,100,101,110,116,32,97,110,100,32,110,111,32,115,112,101,99,105,102,105,99,32,101,102,102,101,99,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,46>>]}]},{dt,[],[{code,[],[<<101,120,105,116,95,115,116,97,116,117,115>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,110,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,44,32,97,110,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,101,120,105,116,115,44,32,97,32,109,101,115,115,97,103,101,32,111,102,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,80,111,114,116,44,123,101,120,105,116,95,115,116,97,116,117,115,44,83,116,97,116,117,115,125,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,44,32,119,104,101,114,101,32>>,{code,[],[<<83,116,97,116,117,115>>]},<<32,105,115,32,116,104,101,32,101,120,105,116,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,112,114,111,103,114,97,109,32,97,98,111,114,116,115,32,111,110,32,85,110,105,120,44,32,116,104,101,32,115,97,109,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,115,104,101,108,108,115,32,100,111,32,40,116,104,97,116,32,105,115,44,32,49,50,56,43,115,105,103,110,97,108,41,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<101,111,102>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,108,115,111,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32>>,{code,[],[<<101,111,102>>]},<<32,97,110,100,32>>,{code,[],[<<101,120,105,116,95,115,116,97,116,117,115>>]},<<32,97,112,112,101,97,114,32,105,110,32,97,110,32,117,110,115,112,101,99,105,102,105,101,100,32,111,114,100,101,114,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,99,108,111,115,101,115,32,105,116,115,32>>,{code,[],[<<115,116,100,111,117,116>>]},<<32,119,105,116,104,111,117,116,32,101,120,105,116,105,110,103,44,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,105,116,95,115,116,97,116,117,115>>]},<<32,100,111,101,115,32,110,111,116,32,119,111,114,107,46>>]}]},{dt,[],[{code,[],[<<117,115,101,95,115,116,100,105,111>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32>>,{code,[],[<<123,115,112,97,119,110,44,32,67,111,109,109,97,110,100,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<46,32,73,116,32,97,108,108,111,119,115,32,116,104,101,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,111,117,116,112,117,116,32,40,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,48,32,97,110,100,32,49,41,32,111,102,32,116,104,101,32,115,112,97,119,110,101,100,32,40,85,110,105,120,41,32,112,114,111,99,101,115,115,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,69,114,108,97,110,103,46>>]}]},{dt,[],[{code,[],[<<110,111,117,115,101,95,115,116,100,105,111>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,112,111,115,105,116,101,32,111,102,32>>,{code,[],[<<117,115,101,95,115,116,100,105,111>>]},<<46,32,73,116,32,117,115,101,115,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,51,32,97,110,100,32,52,32,102,111,114,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,69,114,108,97,110,103,46>>]}]},{dt,[],[{code,[],[<<115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116>>]}]},{dd,[],[{p,[],[<<65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,46,32,84,104,101,32,101,120,101,99,117,116,101,100,32,112,114,111,103,114,97,109,32,103,101,116,115,32,105,116,115,32,115,116,97,110,100,97,114,100,32,101,114,114,111,114,32,102,105,108,101,32,114,101,100,105,114,101,99,116,101,100,32,116,111,32,105,116,115,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,102,105,108,101,46,32>>,{code,[],[<<115,116,100,101,114,114,95,116,111,95,115,116,100,111,117,116>>]},<<32,97,110,100,32>>,{code,[],[<<110,111,117,115,101,95,115,116,100,105,111>>]},<<32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,46>>]}]},{dt,[],[{code,[],[<<111,118,101,114,108,97,112,112,101,100,95,105,111>>]}]},{dd,[],[{p,[],[<<65,102,102,101,99,116,115,32,112,111,114,116,115,32,116,111,32,101,120,116,101,114,110,97,108,32,112,114,111,103,114,97,109,115,32,111,110,32,87,105,110,100,111,119,115,32,111,110,108,121,46,32,84,104,101,32,115,116,97,110,100,97,114,100,32,105,110,112,117,116,32,97,110,100,32,115,116,97,110,100,97,114,100,32,111,117,116,112,117,116,32,104,97,110,100,108,101,115,32,111,102,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,97,114,101,44,32,105,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,117,112,112,108,105,101,100,44,32,111,112,101,110,101,100,32,119,105,116,104,32,102,108,97,103,32>>,{code,[],[<<70,73,76,69,95,70,76,65,71,95,79,86,69,82,76,65,80,80,69,68>>]},<<44,32,115,111,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,32,99,97,110,32,40,97,110,100,32,109,117,115,116,41,32,100,111,32,111,118,101,114,108,97,112,112,101,100,32,73,47,79,32,111,110,32,105,116,115,32,115,116,97,110,100,97,114,100,32,104,97,110,100,108,101,115,46,32,84,104,105,115,32,105,115,32,110,111,116,32,110,111,114,109,97,108,108,121,32,116,104,101,32,99,97,115,101,32,102,111,114,32,115,105,109,112,108,101,32,112,111,114,116,32,112,114,111,103,114,97,109,115,44,32,98,117,116,32,97,110,32,111,112,116,105,111,110,32,111,102,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,101,120,112,101,114,105,101,110,99,101,100,32,87,105,110,100,111,119,115,32,112,114,111,103,114,97,109,109,101,114,46,32>>,{em,[],[<<79,110,32,97,108,108,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,105,108,101,110,116,108,121,32,100,105,115,99,97,114,100,101,100,46>>]}]}]},{dt,[],[{code,[],[<<105,110>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,105,110,112,117,116,46>>]}]},{dt,[],[{code,[],[<<111,117,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,102,111,114,32,111,117,116,112,117,116,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<65,108,108,32,73,47,79,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,115,32,97,115,32,111,112,112,111,115,101,100,32,116,111,32,108,105,115,116,115,32,111,102,32,98,121,116,101,115,46>>]}]},{dt,[],[{code,[],[<<101,111,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,99,108,111,115,101,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,32,97,110,100,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,46,32,73,110,115,116,101,97,100,44,32,105,116,32,114,101,109,97,105,110,115,32,111,112,101,110,32,97,110,100,32,97,32>>,{code,[],[<<123,80,111,114,116,44,32,101,111,102,125>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,104,111,108,100,105,110,103,32,116,104,101,32,112,111,114,116,46>>]}]},{dt,[],[{code,[],[<<104,105,100,101>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32,114,117,110,110,105,110,103,32,111,110,32,87,105,110,100,111,119,115,44,32,115,117,112,112,114,101,115,115,101,115,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,99,111,110,115,111,108,101,32,119,105,110,100,111,119,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,116,104,101,32,112,111,114,116,32,112,114,111,103,114,97,109,46,32,40,84,104,105,115,32,111,112,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,111,116,104,101,114,32,112,108,97,116,102,111,114,109,115,46,41>>]}]},{dt,[],[{code,[],[<<123,112,97,114,97,108,108,101,108,105,115,109,44,32,66,111,111,108,101,97,110,125>>]}]},{dd,[],[{a,[{id,<<111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>}],[]},{p,[],[<<83,101,116,115,32,115,99,104,101,100,117,108,101,114,32,104,105,110,116,32,102,111,114,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,46,32,73,102,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,115,99,104,101,100,117,108,101,115,32,112,111,114,116,32,116,97,115,107,115,59,32,119,104,101,110,32,100,111,105,110,103,32,115,111,44,32,105,116,32,105,109,112,114,111,118,101,115,32,112,97,114,97,108,108,101,108,105,115,109,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,116,114,105,101,115,32,116,111,32,112,101,114,102,111,114,109,32,112,111,114,116,32,116,97,115,107,115,32,105,109,109,101,100,105,97,116,101,108,121,44,32,105,109,112,114,111,118,105,110,103,32,108,97,116,101,110,99,121,32,97,116,32,116,104,101,32,101,120,112,101,110,115,101,32,111,102,32,112,97,114,97,108,108,101,108,105,115,109,46,32,84,104,101,32,100,101,102,97,117,108,116,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,112,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,112,112>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,98,117,115,121,95,108,105,109,105,116,115,95,112,111,114,116,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,105,110,116,101,114,110,97,108,32,111,117,116,112,117,116,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<72,105,103,104>>]},<<32,98,121,116,101,115,44,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<76,111,119>>]},<<32,98,121,116,101,115,32,105,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<76,111,119>>]},<<32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,102,32,105,116,32,105,115,32,115,101,116,32,108,97,114,103,101,114,32,116,104,101,110,32>>,{code,[],[<<72,105,103,104>>]},<<46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<76,111,119>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,115,32>>,{code,[],[<<91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93>>]},<<46,32,73,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<32,105,115,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32>>,{code,[],[<<76,111,119,32,61,32,52,48,57,54>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104,32,61,32,56,49,57,50>>]},<<46>>]},{p,[],[{em,[],[<<78,111,116,101>>]},<<32,116,104,97,116,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,118,97,108,105,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,40,112,111,114,116,32,112,114,111,103,114,97,109,41,32,98,121,32,111,112,101,110,105,110,103,32,116,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,97,110,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32>>,{code,[],[<<102,100>>]},<<32,100,114,105,118,101,114,46,32,84,104,105,115,32,111,112,116,105,111,110,32,119,105,108,108,32,99,97,117,115,101,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,119,104,101,110,32,111,112,101,110,105,110,103,32,111,116,104,101,114,32,100,114,105,118,101,114,115,46>>]}]},{dt,[],[{code,[],[<<123,98,117,115,121,95,108,105,109,105,116,115,95,109,115,103,113,44,32,123,76,111,119,44,32,72,105,103,104,125,32,124,32,100,105,115,97,98,108,101,100,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,108,105,109,105,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,111,110,116,114,111,108,108,105,110,103,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,32,111,102,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,112,111,114,116,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,115,105,122,101,32,98,101,99,111,109,101,115,32,108,97,114,103,101,114,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<72,105,103,104>>]},<<32,98,121,116,101,115,32,105,116,32,101,110,116,101,114,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,105,116,32,98,101,99,111,109,101,115,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<76,111,119>>]},<<32,98,121,116,101,115,32,105,116,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,87,104,101,110,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,105,115,32,105,110,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,44,32,112,114,111,99,101,115,115,101,115,32,115,101,110,100,105,110,103,32,99,111,109,109,97,110,100,115,32,116,111,32,105,116,32,119,105,108,108,32,98,101,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,108,101,97,118,101,115,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46,32,67,111,109,109,97,110,100,115,32,97,114,101,32,105,110,32,116,104,105,115,32,99,111,110,116,101,120,116,32,101,105,116,104,101,114,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,111,114,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,91,50,44,51,93>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<76,111,119>>]},<<32,108,105,109,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,102,32,105,116,32,105,115,32,115,101,116,32,108,97,114,103,101,114,32,116,104,101,110,32>>,{code,[],[<<72,105,103,104>>]},<<46,32,86,97,108,105,100,32,114,97,110,103,101,32,111,102,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<76,111,119>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104>>]},<<32,105,115,32>>,{code,[],[<<91,49,44,32,40,49,32,98,115,108,32,40,56,42,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,119,111,114,100,115,105,122,101,41,41,41,45,50,93>>]},<<46,32,73,102,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<32,105,115,32,112,97,115,115,101,100,44,32,116,104,101,32,112,111,114,116,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,110,101,118,101,114,32,101,110,116,101,114,32,116,104,101,32,98,117,115,121,32,115,116,97,116,101,46>>]},{p,[],[{em,[],[<<78,111,116,101>>]},<<32,116,104,97,116,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,115,116,97,116,105,99,97,108,108,121,32,104,97,115,32,100,105,115,97,98,108,101,100,32,116,104,101,32,117,115,101,32,111,102,32,116,104,105,115,32,102,101,97,116,117,114,101,44,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,119,105,108,108,32,98,101,32,114,97,105,115,101,100,32,117,110,108,101,115,115,32,116,104,105,115,32,111,112,116,105,111,110,32,97,108,115,111,32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<100,105,115,97,98,108,101>>]},<<32,111,114,32,110,111,116,32,112,97,115,115,101,100,32,97,116,32,97,108,108,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,115,32,97,114,101,32>>,{code,[],[<<76,111,119,32,61,32,52,48,57,54>>]},<<32,97,110,100,32>>,{code,[],[<<72,105,103,104,32,61,32,56,49,57,50>>]},<<32,117,110,108,101,115,115,32,116,104,101,32,100,114,105,118,101,114,32,105,116,115,101,108,102,32,100,111,101,115,32,109,111,100,105,102,105,99,97,116,105,111,110,115,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,46>>]},{p,[],[{em,[],[<<78,111,116,101>>]},<<32,116,104,97,116,32,116,104,101,32,100,114,105,118,101,114,32,109,105,103,104,116,32,102,97,105,108,32,105,102,32,105,116,32,97,108,115,111,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,105,116,115,101,108,102,32,97,110,100,32,121,111,117,32,104,97,118,101,32,100,105,115,97,98,108,101,100,32,116,104,105,115,32,102,101,97,116,117,114,101,46>>]},{p,[],[<<84,104,101,32,115,112,97,119,110,32,100,114,105,118,101,114,32,40,117,115,101,100,32,119,104,101,110,32,115,112,97,119,110,105,110,103,32,97,110,32,101,120,101,99,117,116,97,98,108,101,41,32,97,110,100,32,116,104,101,32>>,{code,[],[<<102,100>>]},<<32,100,114,105,118,101,114,32,100,111,32,110,111,116,32,100,105,115,97,98,108,101,32,116,104,105,115,32,102,101,97,116,117,114,101,32,97,110,100,32,100,111,32,110,111,116,32,97,100,106,117,115,116,32,116,104,101,115,101,32,108,105,109,105,116,115,32,98,121,32,116,104,101,109,115,101,108,118,101,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,114,105,118,101,114,35,101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,108,95,100,114,118,95,98,117,115,121,95,109,115,103,113,95,108,105,109,105,116,115,40,41>>]}]},<<46>>]}]}]},{p,[],[<<68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<115,116,114,101,97,109>>]},<<32,102,111,114,32,97,108,108,32,112,111,114,116,32,116,121,112,101,115,32,97,110,100,32>>,{code,[],[<<117,115,101,95,115,116,100,105,111>>]},<<32,102,111,114,32,115,112,97,119,110,101,100,32,112,111,114,116,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32,105,102,32,116,104,101,32,112,111,114,116,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,44,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<44,32>>,{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]},<<44,32,111,114,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,32,116,104,97,116,32,109,111,115,116,32,99,108,111,115,101,108,121,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,101,114,114,111,114,44,32,111,114,32>>,{code,[],[<<101,105,110,118,97,108>>]},<<32,105,102,32,110,111,32,80,79,83,73,88,32,99,111,100,101,32,105,115,32,97,112,112,114,111,112,114,105,97,116,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<66,97,100,32,105,110,112,117,116,32,97,114,103,117,109,101,110,116,115,32,116,111,32>>,{code,[],[<<111,112,101,110,95,112,111,114,116>>]},<<46>>]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[<<65,108,108,32,97,118,97,105,108,97,98,108,101,32,112,111,114,116,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,97,114,101,32,105,110,32,117,115,101,46>>]},{dt,[],[{code,[],[<<101,110,111,109,101,109>>]}]},{dd,[],[<<78,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,116,111,32,99,114,101,97,116,101,32,116,104,101,32,112,111,114,116,46>>]},{dt,[],[{code,[],[<<101,97,103,97,105,110>>]}]},{dd,[],[<<78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,79,83,32,112,114,111,99,101,115,115,101,115,46>>]},{dt,[],[{code,[],[<<101,110,97,109,101,116,111,111,108,111,110,103>>]}]},{dd,[],[<<84,111,111,32,108,111,110,103,32,101,120,116,101,114,110,97,108,32,99,111,109,109,97,110,100,46>>]},{dt,[],[{code,[],[<<101,109,102,105,108,101>>]}]},{dd,[],[<<78,111,32,109,111,114,101,32,97,118,97,105,108,97,98,108,101,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,40,102,111,114,32,116,104,101,32,79,83,32,112,114,111,99,101,115,115,32,116,104,97,116,32,116,104,101,32,69,114,108,97,110,103,32,101,109,117,108,97,116,111,114,32,114,117,110,115,32,105,110,41,46>>]},{dt,[],[{code,[],[<<101,110,102,105,108,101>>]}]},{dd,[],[<<70,117,108,108,32,102,105,108,101,32,116,97,98,108,101,32,40,102,111,114,32,116,104,101,32,101,110,116,105,114,101,32,79,83,41,46>>]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{code,[],[<<67,111,109,109,97,110,100>>]},<<32,115,112,101,99,105,102,105,101,100,32,105,110,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125>>]},<<32,100,111,101,115,32,110,111,116,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,101,99,117,116,97,98,108,101,32,102,105,108,101,46>>]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{code,[],[<<70,105,108,101,78,97,109,101>>]},<<32,115,112,101,99,105,102,105,101,100,32,105,110,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,70,105,108,101,78,97,109,101,125>>]},<<32,100,111,101,115,32,110,111,116,32,112,111,105,110,116,32,111,117,116,32,97,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101,46>>]}]},{p,[],[<<68,117,114,105,110,103,32,117,115,101,32,111,102,32,97,32,112,111,114,116,32,111,112,101,110,101,100,32,117,115,105,110,103,32>>,{code,[],[<<123,115,112,97,119,110,44,32,78,97,109,101,125>>]},<<44,32>>,{code,[],[<<123,115,112,97,119,110,95,100,114,105,118,101,114,44,32,78,97,109,101,125>>]},<<44,32,111,114,32>>,{code,[],[<<123,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,78,97,109,101,125>>]},<<44,32,101,114,114,111,114,115,32,97,114,105,115,105,110,103,32,119,104,101,110,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,105,116,32,97,114,101,32,114,101,112,111,114,116,101,100,32,116,111,32,116,104,101,32,111,119,110,105,110,103,32,112,114,111,99,101,115,115,32,117,115,105,110,103,32,115,105,103,110,97,108,115,32,111,102,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,80,111,114,116,44,32,80,111,115,105,120,67,111,100,101,125>>]},<<46,32,70,111,114,32,116,104,101,32,112,111,115,115,105,98,108,101,32,118,97,108,117,101,115,32,111,102,32>>,{code,[],[<<80,111,115,105,120,67,111,100,101>>]},<<44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,105,108,101,40,51,41>>]}]},<<46>>]},{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,32,116,104,97,116,32,99,97,110,32,98,101,32,111,112,101,110,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,109,97,120,95,112,111,114,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,81>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,52,57,52,48>>,signature => [{attribute,{2378,2},spec,{{open_port,2},[{type,{2378,16},bounded_fun,[{type,{2378,16},'fun',[{type,{2378,16},product,[{var,{2378,17},'PortName'},{var,{2378,27},'PortSettings'}]},{type,{2378,44},port,[]}]},[{type,{2379,7},constraint,[{atom,{2379,7},is_subtype},[{var,{2379,7},'PortName'},{type,{2379,19},union,[{type,{2379,19},tuple,[{atom,{2379,20},spawn},{ann_type,{2379,27},[{var,{2379,27},'Command'},{type,{2379,38},union,[{type,{2379,38},string,[]},{type,{2379,49},binary,[]}]}]}]},{type,{2380,19},tuple,[{atom,{2380,20},spawn_driver},{ann_type,{2380,34},[{var,{2380,34},'Command'},{type,{2380,45},union,[{type,{2380,45},string,[]},{type,{2380,56},binary,[]}]}]}]},{type,{2381,19},tuple,[{atom,{2381,20},spawn_executable},{ann_type,{2381,38},[{var,{2381,38},'FileName'},{remote_type,{2381,50},[{atom,{2381,50},file},{atom,{2381,55},name_all},[]]}]}]},{type,{2382,19},tuple,[{atom,{2382,20},fd},{ann_type,{2382,24},[{var,{2382,24},'In'},{type,{2382,30},non_neg_integer,[]}]},{ann_type,{2382,49},[{var,{2382,49},'Out'},{type,{2382,56},non_neg_integer,[]}]}]}]}]]},{type,{2383,7},constraint,[{atom,{2383,7},is_subtype},[{var,{2383,7},'PortSettings'},{type,{2383,23},list,[{var,{2383,24},'Opt'}]}]]},{type,{2384,7},constraint,[{atom,{2384,7},is_subtype},[{var,{2384,7},'Opt'},{type,{2384,14},union,[{type,{2384,14},tuple,[{atom,{2384,15},packet},{ann_type,{2384,23},[{var,{2384,23},'N'},{type,{2384,28},union,[{integer,{2384,28},1},{integer,{2384,32},2},{integer,{2384,36},4}]}]}]},{atom,{2385,14},stream},{type,{2386,14},tuple,[{atom,{2386,15},line},{ann_type,{2386,21},[{var,{2386,21},'L'},{type,{2386,26},non_neg_integer,[]}]}]},{type,{2387,14},tuple,[{atom,{2387,15},cd},{ann_type,{2387,19},[{var,{2387,19},'Dir'},{type,{2387,26},union,[{type,{2387,26},string,[]},{type,{2387,37},binary,[]}]}]}]},{type,{2388,14},tuple,[{atom,{2388,15},env},{ann_type,{2388,20},[{var,{2388,20},'Env'},{type,{2388,27},list,[{type,{2388,28},tuple,[{ann_type,{2388,29},[{var,{2388,29},'Name'},{remote_type,{2388,37},[{atom,{2388,37},os},{atom,{2388,40},env_var_name},[]]}]},{ann_type,{2388,56},[{var,{2388,56},'Val'},{type,{2388,63},union,[{remote_type,{2388,63},[{atom,{2388,63},os},{atom,{2388,66},env_var_value},[]]},{atom,{2388,84},false}]}]}]}]}]}]},{type,{2389,14},tuple,[{atom,{2389,15},args},{type,{2389,21},list,[{type,{2389,22},union,[{type,{2389,22},string,[]},{type,{2389,33},binary,[]}]}]}]},{type,{2390,14},tuple,[{atom,{2390,15},arg0},{type,{2390,21},union,[{type,{2390,21},string,[]},{type,{2390,32},binary,[]}]}]},{atom,{2391,14},exit_status},{atom,{2392,14},use_stdio},{atom,{2393,14},nouse_stdio},{atom,{2394,14},stderr_to_stdout},{atom,{2395,14},in},{atom,{2396,14},out},{atom,{2397,14},binary},{atom,{2398,14},eof},{type,{2399,7},tuple,[{atom,{2399,8},parallelism},{ann_type,{2399,21},[{var,{2399,21},'Boolean'},{type,{2399,32},boolean,[]}]}]},{atom,{2400,7},hide},{type,{2401,14},tuple,[{atom,{2401,15},busy_limits_port},{type,{2401,33},union,[{type,{2401,33},tuple,[{type,{2401,34},non_neg_integer,[]},{type,{2401,53},non_neg_integer,[]}]},{atom,{2401,74},disabled}]}]},{type,{2402,14},tuple,[{atom,{2402,15},busy_limits_msgq},{type,{2402,33},union,[{type,{2402,33},tuple,[{type,{2402,34},non_neg_integer,[]},{type,{2402,53},non_neg_integer,[]}]},{atom,{2402,74},disabled}]}]}]}]]}]]}]}}]}},{{function,phash,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1540}],[<<112,104,97,115,104,47,50>>],#{<<101,110>> => [{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,112,114,101,99,97,116,101,100,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,104,97,115,104,50,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,112,104,97,115,104,50,47,50>>]}]},<<32,115,104,111,117,108,100,32,98,101,32,117,115,101,100,32,102,111,114,32,110,101,119,32,99,111,100,101,46,32,78,111,116,101,32,116,104,97,116,32>>,{code,[],[<<101,114,108,97,110,103,58,112,104,97,115,104,40,88,44,78,41>>]},<<32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,121,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,112,104,97,115,104,50,40,88,44,78,41>>]}]}]},{p,[],[<<80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,32,40,116,104,101,32,66,73,70,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,52,46,57,46,49,46,49,41,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<84,101,114,109>>]},<<32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<49,46,46,82,97,110,103,101>>]},<<46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<82,97,110,103,101>>]},<<32,105,115,32,50,94,51,50,46>>]}]},#{deprecated => <<101,114,108,97,110,103,58,112,104,97,115,104,47,50,32,105,115,32,100,101,112,114,101,99,97,116,101,100,59,32,117,115,101,32,101,114,108,97,110,103,58,112,104,97,115,104,50,47,50,32,105,110,115,116,101,97,100>>,edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,52,54>>,signature => [{attribute,{1540,2},spec,{{erlang,phash,2},[{type,{1540,19},bounded_fun,[{type,{1540,19},'fun',[{type,{1540,19},product,[{var,{1540,20},'Term'},{var,{1540,26},'Range'}]},{var,{1540,36},'Hash'}]},[{type,{1541,7},constraint,[{atom,{1541,7},is_subtype},[{var,{1541,7},'Term'},{type,{1541,15},term,[]}]]},{type,{1542,7},constraint,[{atom,{1542,7},is_subtype},[{var,{1542,7},'Range'},{type,{1542,16},pos_integer,[]}]]},{type,{1543,7},constraint,[{atom,{1543,7},is_subtype},[{var,{1543,7},'Hash'},{type,{1543,15},pos_integer,[]}]]}]]}]}}]}},{{function,phash2,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1555}],[<<112,104,97,115,104,50,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,54,56>>,equiv => {function,phash2,1},signature => [{attribute,{1555,2},spec,{{erlang,phash2,2},[{type,{1555,20},bounded_fun,[{type,{1555,20},'fun',[{type,{1555,20},product,[{var,{1555,21},'Term'},{var,{1555,27},'Range'}]},{var,{1555,37},'Hash'}]},[{type,{1556,7},constraint,[{atom,{1556,7},is_subtype},[{var,{1556,7},'Term'},{type,{1556,15},term,[]}]]},{type,{1557,7},constraint,[{atom,{1557,7},is_subtype},[{var,{1557,7},'Range'},{type,{1557,16},pos_integer,[]}]]},{type,{1558,7},constraint,[{atom,{1558,7},is_subtype},[{var,{1558,7},'Hash'},{type,{1558,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,phash2,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1548}],[<<112,104,97,115,104,50,47,49>>],#{<<101,110>> => [{p,[],[<<80,111,114,116,97,98,108,101,32,104,97,115,104,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,104,97,115,104,32,102,111,114,32,116,104,101,32,115,97,109,101,32,69,114,108,97,110,103,32,116,101,114,109,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,109,97,99,104,105,110,101,32,97,114,99,104,105,116,101,99,116,117,114,101,32,97,110,100,32,69,82,84,83,32,118,101,114,115,105,111,110,32,40,116,104,101,32,66,73,70,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,53,46,50,41,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,104,97,115,104,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<84,101,114,109>>]},<<32,119,105,116,104,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<48,46,46,82,97,110,103,101,45,49>>]},<<46,32,84,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<82,97,110,103,101>>]},<<32,105,115,32,50,94,51,50,46,32,87,104,101,110,32,119,105,116,104,111,117,116,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<82,97,110,103,101>>]},<<44,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,94,50,55,45,49,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,97,108,119,97,121,115,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,104,97,115,104,105,110,103,32,116,101,114,109,115,46,32,73,116,32,100,105,115,116,114,105,98,117,116,101,115,32,115,109,97,108,108,32,105,110,116,101,103,101,114,115,32,98,101,116,116,101,114,32,116,104,97,110,32>>,{code,[],[<<112,104,97,115,104,47,50>>]},<<44,32,97,110,100,32,105,116,32,105,115,32,102,97,115,116,101,114,32,102,111,114,32,98,105,103,110,117,109,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<48,46,46,82,97,110,103,101,45,49>>]},<<32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,114,97,110,103,101,32,111,102,32>>,{code,[],[<<112,104,97,115,104,47,50>>]},<<44,32,119,104,105,99,104,32,105,115,32>>,{code,[],[<<49,46,46,82,97,110,103,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,54,56>>,signature => [{attribute,{1548,2},spec,{{erlang,phash2,1},[{type,{1548,20},bounded_fun,[{type,{1548,20},'fun',[{type,{1548,20},product,[{var,{1548,21},'Term'}]},{var,{1548,30},'Hash'}]},[{type,{1549,7},constraint,[{atom,{1549,7},is_subtype},[{var,{1549,7},'Term'},{type,{1549,15},term,[]}]]},{type,{1550,7},constraint,[{atom,{1550,7},is_subtype},[{var,{1550,7},'Hash'},{type,{1550,15},non_neg_integer,[]}]]}]]}]}}]}},{{function,pid_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1563}],[<<112,105,100,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,112,105,100,95,116,111,95,108,105,115,116,40,115,101,108,102,40,41,41,46,10,34,60,48,46,56,53,46,48,62,34>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,114,101,97,116,105,111,110>>]},<<32,102,111,114,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,32,111,102,32,97,32,110,111,100,101,32,119,105,116,104,32,97,32,115,112,101,99,105,102,105,99,32,110,97,109,101,32,99,97,110,32,103,101,116,32,116,104,101,32,115,97,109,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,51,57,51>>,signature => [{attribute,{1563,2},spec,{{pid_to_list,1},[{type,{1563,18},bounded_fun,[{type,{1563,18},'fun',[{type,{1563,18},product,[{var,{1563,19},'Pid'}]},{type,{1563,27},string,[]}]},[{type,{1564,7},constraint,[{atom,{1564,7},is_subtype},[{var,{1564,7},'Pid'},{type,{1564,14},pid,[]}]]}]]}]}}]}},{{function,port_call,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3614}],[<<112,111,114,116,95,99,97,108,108,47,51>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,97,110,100,32>>,{code,[],[<<68,97,116,97>>]},<<32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,32,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,32,116,104,105,115,32,102,101,97,116,117,114,101,46>>]},{p,[],[{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,114,101,102,101,114,114,105,110,103,32,116,111,32,97,32,100,114,105,118,101,114,46>>]},{p,[],[{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,119,104,105,99,104,32,105,115,32,112,97,115,115,101,100,32,111,110,32,116,111,32,116,104,101,32,100,114,105,118,101,114,46>>]},{p,[],[{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,46,32,84,104,105,115,32,100,97,116,97,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,98,105,110,97,114,121,32,116,101,114,109,32,102,111,114,109,97,116,32,97,110,100,32,115,101,110,116,32,116,111,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,101,114,109,32,102,114,111,109,32,116,104,101,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,100,111,101,115,32,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<41,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,99,97,108,108,32>>,{code,[],[<<112,111,114,116,95,99,97,108,108>>]},<<32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>]}]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,49,50>>,signature => [{attribute,{3614,2},spec,{{erlang,port_call,3},[{type,{3614,23},bounded_fun,[{type,{3614,23},'fun',[{type,{3614,23},product,[{var,{3614,24},'Port'},{var,{3614,30},'Operation'},{var,{3614,41},'Data'}]},{type,{3614,50},term,[]}]},[{type,{3615,7},constraint,[{atom,{3615,7},is_subtype},[{var,{3615,7},'Port'},{type,{3615,15},union,[{type,{3615,15},port,[]},{type,{3615,24},atom,[]}]}]]},{type,{3616,7},constraint,[{atom,{3616,7},is_subtype},[{var,{3616,7},'Operation'},{type,{3616,20},integer,[]}]]},{type,{3617,7},constraint,[{atom,{3617,7},is_subtype},[{var,{3617,7},'Data'},{type,{3617,15},term,[]}]]}]]}]}}]}},{{function,port_close,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3575}],[<<112,111,114,116,95,99,108,111,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,108,111,115,101,115,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,40,115,101,101,32,98,101,108,111,119,41,44,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,114,101,112,108,121,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,32,99,108,111,115,101,100,125>>]},<<46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,119,105,116,104,32>>,{code,[],[<<112,111,114,116,95,99,108,111,115,101,47,49>>]},<<44,32,110,111,116,32,111,110,108,121,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,99,108,111,115,101,47,49>>]},<<32,114,101,116,117,114,110,115,46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32>>,{code,[],[<<80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,99,108,111,115,101,125>>]},<<32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,32,114,101,112,108,105,101,115,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,32,99,108,111,115,101,100,125>>]},<<32,119,104,101,110,32,97,108,108,32,98,117,102,102,101,114,115,32,104,97,118,101,32,98,101,101,110,32,102,108,117,115,104,101,100,32,97,110,100,32,116,104,101,32,112,111,114,116,32,114,101,97,108,108,121,32,99,108,111,115,101,115,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32>>,{em,[],[<<112,111,114,116,32,111,119,110,101,114>>]},<<32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,99,108,111,115,101,32,97,32,112,111,114,116,32,117,115,105,110,103,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125>>]},<<32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,32,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,99,108,111,115,101,125>>]},<<32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,32>>,{code,[],[<<112,111,114,116,95,99,108,111,115,101,47,49>>]},<<32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,52,54,52>>,signature => [{attribute,{3575,2},spec,{{port_close,1},[{type,{3575,17},bounded_fun,[{type,{3575,17},'fun',[{type,{3575,17},product,[{var,{3575,18},'Port'}]},{atom,{3575,27},true}]},[{type,{3576,7},constraint,[{atom,{3576,7},is_subtype},[{var,{3576,7},'Port'},{type,{3576,15},union,[{type,{3576,15},port,[]},{type,{3576,24},atom,[]}]}]]}]]}]}}]}},{{function,port_command,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3533}],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32,83,97,109,101,32,97,115,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,97,110,100,32,98,101,105,110,103,32,115,121,110,99,104,114,111,110,111,117,115,32,40,115,101,101,32,98,101,108,111,119,41,46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,32,119,105,116,104,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>]},<<44,32,110,111,116,32,111,110,108,121,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,114,111,99,101,115,115,41,46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,116,104,101,32,100,97,116,97,32,109,101,115,115,97,103,101,32,100,105,115,97,112,112,101,97,114,115,32,119,105,116,104,111,117,116,32,97,32,115,111,117,110,100,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,111,112,101,110,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32>>,{em,[],[<<112,111,114,116,32,111,119,110,101,114>>]},<<32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<46,32,84,104,101,32,112,111,114,116,32,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<32,97,108,115,111,32,105,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,110,100,32,116,111,32,97,32,112,111,114,116,32,117,115,105,110,103,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,32,97,110,121,32,109,111,114,101,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125,125>>]},<<32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>]},<<32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]}]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,53,48,52>>,signature => [{attribute,{3533,2},spec,{{port_command,2},[{type,{3533,19},bounded_fun,[{type,{3533,19},'fun',[{type,{3533,19},product,[{var,{3533,20},'Port'},{var,{3533,26},'Data'}]},{atom,{3533,35},true}]},[{type,{3534,7},constraint,[{atom,{3534,7},is_subtype},[{var,{3534,7},'Port'},{type,{3534,15},union,[{type,{3534,15},port,[]},{type,{3534,24},atom,[]}]}]]},{type,{3535,7},constraint,[{atom,{3535,7},is_subtype},[{var,{3535,7},'Data'},{type,{3535,15},iodata,[]}]]}]]}]}}]}},{{function,port_command,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3546}],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,100,97,116,97,32,116,111,32,97,32,112,111,114,116,46,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,44,32,91,93,41>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,40,80,111,114,116,44,32,68,97,116,97,41>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,116,105,108,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,98,117,115,121,32,97,110,121,109,111,114,101,46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,111,114,99,101>>]}]},{dd,[],[<<84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,102,111,114,99,101,100,32,116,104,114,111,117,103,104,46,32,84,104,101,32,99,97,108,108,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,100,114,105,118,101,114,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,100,114,105,118,101,114,95,101,110,116,114,121,35,100,114,105,118,101,114,95,102,108,97,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<69,82,76,95,68,82,86,95,70,76,65,71,95,83,79,70,84,95,66,85,83,89>>]}]},<<46>>]},{dt,[],[{code,[],[<<110,111,115,117,115,112,101,110,100>>]}]},{dd,[],[<<84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,98,117,115,121,44,32,105,110,115,116,101,97,100,32,116,104,101,32,112,111,114,116,32,99,111,109,109,97,110,100,32,105,115,32,97,98,111,114,116,101,100,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<77,111,114,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<68,97,116,97>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,73,47,79,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,105,111,110,76,105,115,116>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<102,111,114,99,101>>]},<<32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,98,117,116,32,116,104,101,32,100,114,105,118,101,114,32,111,102,32,116,104,101,32,112,111,114,116,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,102,111,114,99,105,110,103,32,116,104,114,111,117,103,104,32,97,32,98,117,115,121,32,112,111,114,116,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,115,101,110,100,32,100,97,116,97,32,116,111,32,97,110,32,117,110,107,110,111,119,110,32,112,111,114,116,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,100,97,116,97,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,53,53,54>>,signature => [{attribute,{3546,2},spec,{{port_command,3},[{type,{3546,19},bounded_fun,[{type,{3546,19},'fun',[{type,{3546,19},product,[{var,{3546,20},'Port'},{var,{3546,26},'Data'},{var,{3546,32},'OptionList'}]},{type,{3546,47},boolean,[]}]},[{type,{3547,7},constraint,[{atom,{3547,7},is_subtype},[{var,{3547,7},'Port'},{type,{3547,15},union,[{type,{3547,15},port,[]},{type,{3547,24},atom,[]}]}]]},{type,{3548,7},constraint,[{atom,{3548,7},is_subtype},[{var,{3548,7},'Data'},{type,{3548,15},iodata,[]}]]},{type,{3549,7},constraint,[{atom,{3549,7},is_subtype},[{var,{3549,7},'Option'},{type,{3549,17},union,[{atom,{3549,17},force},{atom,{3549,25},nosuspend}]}]]},{type,{3550,7},constraint,[{atom,{3550,7},is_subtype},[{var,{3550,7},'OptionList'},{type,{3550,21},list,[{var,{3550,22},'Option'}]}]]}]]}]}}]}},{{function,port_connect,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3562}],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,40,116,104,101,32,99,111,110,110,101,99,116,101,100,32,112,111,114,116,41,32,116,111,32>>,{code,[],[<<80,105,100>>]},<<46,32,82,111,117,103,104,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{p,[],[<<84,104,101,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,44,32,115,101,101,32,98,101,108,111,119,46>>]}]},{li,[],[{p,[],[<<84,104,101,32,112,111,114,116,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,114,101,112,108,121,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,99,111,110,110,101,99,116,101,100,125>>]},<<46>>]}]},{li,[],[{p,[],[{code,[],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,49>>]},<<32,105,115,32,115,121,110,99,104,114,111,110,111,117,115,44,32,115,101,101,32,98,101,108,111,119,46>>]}]},{li,[],[{p,[],[<<84,104,101,32,110,101,119,32,112,111,114,116,32,111,119,110,101,114,32,103,101,116,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46>>]}]}]},{p,[],[<<84,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,115,116,97,121,115,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,32,97,110,100,32,109,117,115,116,32,99,97,108,108,32>>,{code,[],[<<117,110,108,105,110,107,40,80,111,114,116,41>>]},<<32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,100,101,115,105,114,101,100,46,32,65,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,116,111,32,98,101,32,97,110,121,32,112,114,111,99,101,115,115,32,119,105,116,104,32>>,{code,[],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,50>>]},<<46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,114,105,115,111,110,58,32>>,{code,[],[<<80,111,114,116,32,33,32,123,115,101,108,102,40,41,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,111,110,108,121,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,111,114,116,32,111,114,32,97,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,32,99,108,111,115,101,100,32,112,111,114,116,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32,112,111,114,116,32,114,101,112,108,105,101,115,32,119,105,116,104,32>>,{code,[],[<<123,80,111,114,116,44,32,99,111,110,110,101,99,116,101,100,125>>]},<<32,116,111,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,111,108,100,32,112,111,114,116,32,111,119,110,101,114,32,105,115,32,115,116,105,108,108,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,119,104,105,108,101,32,116,104,101,32,110,101,119,32,105,115,32,110,111,116,46,32,73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,97,110,32,111,112,101,110,32,112,111,114,116,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,116,104,101,32>>,{em,[],[<<112,111,114,116,32,111,119,110,101,114>>]},<<32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<46,32,84,104,101,32,112,111,114,116,32,111,119,110,101,114,32,102,97,105,108,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,115,105,103>>]},<<32,97,108,115,111,32,105,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,121,32,112,114,111,99,101,115,115,32,99,97,110,32,115,101,116,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,117,115,105,110,103,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,97,115,32,105,102,32,105,116,32,105,116,115,101,108,102,32,119,97,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,44,32,98,117,116,32,116,104,101,32,114,101,112,108,121,32,97,108,119,97,121,115,32,103,111,101,115,32,116,111,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,54,44,32>>,{code,[],[<<80,111,114,116,32,33,32,123,80,111,114,116,79,119,110,101,114,44,32,123,99,111,110,110,101,99,116,44,32,80,105,100,125,125>>]},<<32,105,115,32,116,114,117,108,121,32,97,115,121,110,99,104,114,111,110,111,117,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,97,108,119,97,121,115,32,98,101,101,110,32,100,111,99,117,109,101,110,116,101,100,32,97,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,108,101,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,121,110,99,104,114,111,110,111,117,115,46,32>>,{code,[],[<<112,111,114,116,95,99,111,110,110,101,99,116,47,50>>]},<<32,105,115,32,104,111,119,101,118,101,114,32,115,116,105,108,108,32,102,117,108,108,121,32,115,121,110,99,104,114,111,110,111,117,115,32,98,101,99,97,117,115,101,32,111,102,32,105,116,115,32,101,114,114,111,114,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,44,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,99,108,111,115,101,100,32,112,111,114,116,44,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,116,104,105,115,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,111,99,99,117,114,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,54,50,48>>,signature => [{attribute,{3562,2},spec,{{port_connect,2},[{type,{3562,19},bounded_fun,[{type,{3562,19},'fun',[{type,{3562,19},product,[{var,{3562,20},'Port'},{var,{3562,26},'Pid'}]},{atom,{3562,34},true}]},[{type,{3563,7},constraint,[{atom,{3563,7},is_subtype},[{var,{3563,7},'Port'},{type,{3563,15},union,[{type,{3563,15},port,[]},{type,{3563,24},atom,[]}]}]]},{type,{3564,7},constraint,[{atom,{3564,7},is_subtype},[{var,{3564,7},'Pid'},{type,{3564,14},pid,[]}]]}]]}]}}]}},{{function,port_control,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3587}],[<<112,111,114,116,95,99,111,110,116,114,111,108,47,51>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,112,111,114,116,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,97,110,100,32>>,{code,[],[<<68,97,116,97>>]},<<32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,44,32,116,104,97,116,32,105,115,44,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,78,111,116,32,97,108,108,32,112,111,114,116,32,100,114,105,118,101,114,115,32,115,117,112,112,111,114,116,32,116,104,105,115,32,99,111,110,116,114,111,108,32,102,101,97,116,117,114,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,48,46,46,50,53,53,44,32,111,114,32,97,32,98,105,110,97,114,121,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46,32,84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,100,97,116,97,32,97,108,115,111,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,111,112,101,110,32,112,111,114,116,32,111,114,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,97,110,32,111,112,101,110,32,112,111,114,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,99,97,110,110,111,116,32,102,105,116,32,105,110,32,97,32,51,50,45,98,105,116,32,105,110,116,101,103,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,110,99,104,114,111,110,111,117,115,32,99,111,110,116,114,111,108,32,111,112,101,114,97,116,105,111,110,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,115,111,32,100,101,99,105,100,101,115,32,102,111,114,32,97,110,121,32,114,101,97,115,111,110,32,40,112,114,111,98,97,98,108,121,32,115,111,109,101,116,104,105,110,103,32,119,114,111,110,103,32,119,105,116,104,32>>,{code,[],[<<79,112,101,114,97,116,105,111,110>>]},<<32,111,114,32>>,{code,[],[<<68,97,116,97>>]},<<41,46>>,{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<68,111,32,110,111,116,32,99,97,108,108,32>>,{code,[],[<<112,111,114,116,95,99,111,110,116,114,111,108,47,51>>]},<<32,119,105,116,104,32,97,110,32,117,110,107,110,111,119,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,101,120,112,101,99,116,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,46,32,65,110,121,32,117,110,100,101,102,105,110,101,100,32,98,101,104,97,118,105,111,114,32,105,115,32,112,111,115,115,105,98,108,101,32,40,105,110,99,108,117,100,105,110,103,32,110,111,100,101,32,99,114,97,115,104,41,32,100,101,112,101,110,100,105,110,103,32,111,110,32,104,111,119,32,116,104,101,32,112,111,114,116,32,100,114,105,118,101,114,32,105,110,116,101,114,112,114,101,116,115,32,116,104,101,32,115,117,112,112,108,105,101,100,32,97,114,103,117,109,101,110,116,115,46>>]}]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,54,56,57>>,signature => [{attribute,{3587,2},spec,{{port_control,3},[{type,{3587,19},bounded_fun,[{type,{3587,19},'fun',[{type,{3587,19},product,[{var,{3587,20},'Port'},{var,{3587,26},'Operation'},{var,{3587,37},'Data'}]},{type,{3587,46},union,[{type,{3587,46},iodata,[]},{type,{3587,57},binary,[]}]}]},[{type,{3588,7},constraint,[{atom,{3588,7},is_subtype},[{var,{3588,7},'Port'},{type,{3588,15},union,[{type,{3588,15},port,[]},{type,{3588,24},atom,[]}]}]]},{type,{3589,7},constraint,[{atom,{3589,7},is_subtype},[{var,{3589,7},'Operation'},{type,{3589,20},integer,[]}]]},{type,{3590,7},constraint,[{atom,{3590,7},is_subtype},[{var,{3590,7},'Data'},{type,{3590,15},iodata,[]}]]}]]}]}}]}},{{function,port_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3628}],[<<112,111,114,116,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,117,112,108,101,115,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32>>,{code,[],[<<80,111,114,116>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,111,112,101,110,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,110,100,32,97,108,108,32,116,104,101,32,116,117,112,108,101,115,32,97,114,101,32,110,111,116,32,109,97,110,100,97,116,111,114,121,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,49>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<84,104,101,32,114,101,115,117,108,116,32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32>>,{code,[],[<<73,116,101,109>>]},<<115,58>>]},{ul,[],[{li,[],[{code,[],[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,40,105,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,41>>]},{li,[],[{code,[],[<<105,100>>]}]},{li,[],[{code,[],[<<99,111,110,110,101,99,116,101,100>>]}]},{li,[],[{code,[],[<<108,105,110,107,115>>]}]},{li,[],[{code,[],[<<110,97,109,101>>]}]},{li,[],[{code,[],[<<105,110,112,117,116>>]}]},{li,[],[{code,[],[<<111,117,116,112,117,116>>]}]}]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32>>,{code,[],[<<73,116,101,109>>]},<<115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,111,114,116,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,55,51,51>>,signature => [{attribute,{3628,2},spec,{{erlang,port_info,1},[{type,{3628,23},bounded_fun,[{type,{3628,23},'fun',[{type,{3628,23},product,[{var,{3628,24},'Port'}]},{var,{3628,33},'Result'}]},[{type,{3629,7},constraint,[{atom,{3629,7},is_subtype},[{var,{3629,7},'Port'},{type,{3629,15},union,[{type,{3629,15},port,[]},{type,{3629,24},atom,[]}]}]]},{type,{3630,7},constraint,[{atom,{3630,7},is_subtype},[{var,{3630,7},'ResultItem'},{type,{3630,21},union,[{type,{3630,21},tuple,[{atom,{3630,22},registered_name},{ann_type,{3630,39},[{var,{3630,39},'RegisteredName'},{type,{3630,57},atom,[]}]}]},{type,{3631,7},tuple,[{atom,{3631,8},id},{ann_type,{3631,12},[{var,{3631,12},'Index'},{type,{3631,21},non_neg_integer,[]}]}]},{type,{3632,7},tuple,[{atom,{3632,8},connected},{ann_type,{3632,19},[{var,{3632,19},'Pid'},{type,{3632,26},pid,[]}]}]},{type,{3633,7},tuple,[{atom,{3633,8},links},{ann_type,{3633,15},[{var,{3633,15},'Pids'},{type,{3633,23},list,[{type,{3633,24},pid,[]}]}]}]},{type,{3634,7},tuple,[{atom,{3634,8},name},{ann_type,{3634,14},[{var,{3634,14},'String'},{type,{3634,24},string,[]}]}]},{type,{3635,7},tuple,[{atom,{3635,8},input},{ann_type,{3635,15},[{var,{3635,15},'Bytes'},{type,{3635,24},non_neg_integer,[]}]}]},{type,{3636,7},tuple,[{atom,{3636,8},output},{ann_type,{3636,16},[{var,{3636,16},'Bytes'},{type,{3636,25},non_neg_integer,[]}]}]},{type,{3637,7},tuple,[{atom,{3637,8},os_pid},{ann_type,{3637,16},[{var,{3637,16},'OsPid'},{type,{3637,25},union,[{type,{3637,25},non_neg_integer,[]},{atom,{3637,45},undefined}]}]}]}]}]]},{type,{3638,7},constraint,[{atom,{3638,7},is_subtype},[{var,{3638,7},'Result'},{type,{3638,17},union,[{type,{3638,17},list,[{var,{3638,18},'ResultItem'}]},{atom,{3638,32},undefined}]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,111,110,110,101,99,116,101,100,32,116,111,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,55,54,52>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3649,23},bounded_fun,[{type,{3649,23},'fun',[{type,{3649,23},product,[{var,{3649,24},'Port'},{atom,{3649,30},connected}]},{type,{3649,44},union,[{type,{3649,44},tuple,[{atom,{3649,45},connected},{var,{3649,56},'Pid'}]},{atom,{3649,63},undefined}]}]},[{type,{3650,7},constraint,[{atom,{3650,7},is_subtype},[{var,{3650,7},'Port'},{type,{3650,15},union,[{type,{3650,15},port,[]},{type,{3650,24},atom,[]}]}]]},{type,{3651,7},constraint,[{atom,{3651,7},is_subtype},[{var,{3651,7},'Pid'},{type,{3651,14},pid,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<73,110,100,101,120>>]},<<32,105,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,105,110,100,101,120,32,111,102,32,116,104,101,32,112,111,114,116,46,32,84,104,105,115,32,105,110,100,101,120,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,112,111,114,116,115,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,55,56,48>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3652,9},bounded_fun,[{type,{3652,9},'fun',[{type,{3652,9},product,[{var,{3652,10},'Port'},{atom,{3652,16},id}]},{type,{3652,23},union,[{type,{3652,23},tuple,[{atom,{3652,24},id},{var,{3652,28},'Index'}]},{atom,{3652,37},undefined}]}]},[{type,{3653,7},constraint,[{atom,{3653,7},is_subtype},[{var,{3653,7},'Port'},{type,{3653,15},union,[{type,{3653,15},port,[]},{type,{3653,24},atom,[]}]}]]},{type,{3654,7},constraint,[{atom,{3654,7},is_subtype},[{var,{3654,7},'Index'},{type,{3654,16},non_neg_integer,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,112,111,114,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,55,57,54>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3655,9},bounded_fun,[{type,{3655,9},'fun',[{type,{3655,9},product,[{var,{3655,10},'Port'},{atom,{3655,16},input}]},{type,{3655,26},union,[{type,{3655,26},tuple,[{atom,{3655,27},input},{var,{3655,34},'Bytes'}]},{atom,{3655,43},undefined}]}]},[{type,{3656,7},constraint,[{atom,{3656,7},is_subtype},[{var,{3656,7},'Port'},{type,{3656,15},union,[{type,{3656,15},port,[]},{type,{3656,24},atom,[]}]}]]},{type,{3657,7},constraint,[{atom,{3657,7},is_subtype},[{var,{3657,7},'Bytes'},{type,{3657,16},non_neg_integer,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<80,105,100,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,116,104,101,32,112,111,114,116,32,105,115,32,108,105,110,107,101,100,32,116,111,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,49,50>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3658,9},bounded_fun,[{type,{3658,9},'fun',[{type,{3658,9},product,[{var,{3658,10},'Port'},{atom,{3658,16},links}]},{type,{3658,26},union,[{type,{3658,26},tuple,[{atom,{3658,27},links},{var,{3658,34},'Pids'}]},{atom,{3658,42},undefined}]}]},[{type,{3659,7},constraint,[{atom,{3659,7},is_subtype},[{var,{3659,7},'Port'},{type,{3659,15},union,[{type,{3659,15},port,[]},{type,{3659,24},atom,[]}]}]]},{type,{3660,7},constraint,[{atom,{3660,7},is_subtype},[{var,{3660,7},'Pids'},{type,{3660,15},list,[{type,{3660,16},pid,[]}]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<76,111,99,107,105,110,103>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{code,[],[<<112,111,114,116,95,108,101,118,101,108>>]},<<32,40,112,111,114,116,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41>>]},{li,[],[{code,[],[<<100,114,105,118,101,114,95,108,101,118,101,108>>]},<<32,40,100,114,105,118,101,114,45,115,112,101,99,105,102,105,99,32,108,111,99,107,105,110,103,41>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,114,101,115,117,108,116,115,32,97,114,101,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,50,56>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3661,9},bounded_fun,[{type,{3661,9},'fun',[{type,{3661,9},product,[{var,{3661,10},'Port'},{atom,{3661,16},locking}]},{type,{3661,28},union,[{type,{3661,28},tuple,[{atom,{3661,29},locking},{var,{3661,38},'Locking'}]},{atom,{3661,49},undefined}]}]},[{type,{3662,7},constraint,[{atom,{3662,7},is_subtype},[{var,{3662,7},'Port'},{type,{3662,15},union,[{type,{3662,15},port,[]},{type,{3662,24},atom,[]}]}]]},{type,{3663,7},constraint,[{atom,{3663,7},is_subtype},[{var,{3663,7},'Locking'},{type,{3663,18},union,[{atom,{3663,18},false},{atom,{3663,28},port_level},{atom,{3663,43},driver_level}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{a,[{id,<<112,111,114,116,95,105,110,102,111,95,109,101,109,111,114,121>>}],[]},{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,116,104,105,115,32,112,111,114,116,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,112,111,114,116,32,105,116,115,101,108,102,32,99,97,110,32,104,97,118,101,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,99,108,117,100,101,100,32,105,110,32>>,{code,[],[<<66,121,116,101,115>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,52,57>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3664,9},bounded_fun,[{type,{3664,9},'fun',[{type,{3664,9},product,[{var,{3664,10},'Port'},{atom,{3664,16},memory}]},{type,{3664,27},union,[{type,{3664,27},tuple,[{atom,{3664,28},memory},{var,{3664,36},'Bytes'}]},{atom,{3664,45},undefined}]}]},[{type,{3665,7},constraint,[{atom,{3665,7},is_subtype},[{var,{3665,7},'Port'},{type,{3665,15},union,[{type,{3665,15},port,[]},{type,{3665,24},atom,[]}]}]]},{type,{3666,7},constraint,[{atom,{3666,7},is_subtype},[{var,{3666,7},'Bytes'},{type,{3666,16},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<77,111,110,105,116,111,114,115>>]},<<32,114,101,112,114,101,115,101,110,116,32,112,114,111,99,101,115,115,101,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,54,56>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3667,9},bounded_fun,[{type,{3667,9},'fun',[{type,{3667,9},product,[{var,{3667,10},'Port'},{atom,{3667,16},monitors}]},{type,{3667,29},union,[{type,{3667,29},tuple,[{atom,{3667,30},monitors},{var,{3667,40},'Monitors'}]},{atom,{3667,52},undefined}]}]},[{type,{3668,7},constraint,[{atom,{3668,7},is_subtype},[{var,{3668,7},'Port'},{type,{3668,15},union,[{type,{3668,15},port,[]},{type,{3668,24},atom,[]}]}]]},{type,{3669,7},constraint,[{atom,{3669,7},is_subtype},[{var,{3669,7},'Monitors'},{type,{3669,19},list,[{type,{3669,20},tuple,[{atom,{3669,21},process},{type,{3669,30},pid,[]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,108,105,115,116,32,111,102,32,112,105,100,115,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,103,105,118,101,110,32,112,111,114,116,32,97,116,32,116,104,101,32,109,111,109,101,110,116,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,56,56,52>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3670,9},bounded_fun,[{type,{3670,9},'fun',[{type,{3670,9},product,[{var,{3670,10},'Port'},{atom,{3670,16},monitored_by}]},{type,{3670,33},union,[{type,{3670,33},tuple,[{atom,{3670,34},monitored_by},{var,{3670,48},'MonitoredBy'}]},{atom,{3670,63},undefined}]}]},[{type,{3671,7},constraint,[{atom,{3671,7},is_subtype},[{var,{3671,7},'Port'},{type,{3671,15},union,[{type,{3671,15},port,[]},{type,{3671,24},atom,[]}]}]]},{type,{3672,7},constraint,[{atom,{3672,7},is_subtype},[{var,{3672,7},'MonitoredBy'},{type,{3672,22},list,[{type,{3672,23},pid,[]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<78,97,109,101>>]},<<32,105,115,32,116,104,101,32,99,111,109,109,97,110,100,32,110,97,109,101,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,95,112,111,114,116,47,50>>]}]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,48,48>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3673,9},bounded_fun,[{type,{3673,9},'fun',[{type,{3673,9},product,[{var,{3673,10},'Port'},{atom,{3673,16},name}]},{type,{3673,25},union,[{type,{3673,25},tuple,[{atom,{3673,26},name},{var,{3673,32},'Name'}]},{atom,{3673,40},undefined}]}]},[{type,{3674,7},constraint,[{atom,{3674,7},is_subtype},[{var,{3674,7},'Port'},{type,{3674,15},union,[{type,{3674,15},port,[]},{type,{3674,24},atom,[]}]}]]},{type,{3675,7},constraint,[{atom,{3675,7},is_subtype},[{var,{3675,7},'Name'},{type,{3675,15},string,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<79,115,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,111,114,32,101,113,117,105,118,97,108,101,110,116,41,32,111,102,32,97,110,32,79,83,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,95,112,111,114,116,40,123,115,112,97,119,110,32,124,32,115,112,97,119,110,95,101,120,101,99,117,116,97,98,108,101,44,32,67,111,109,109,97,110,100,125,44,32,79,112,116,105,111,110,115,41>>]}]},<<46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,110,111,116,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,97,119,110,105,110,103,32,97,110,32,79,83,32,112,114,111,99,101,115,115,44,32,116,104,101,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,49,54>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3676,9},bounded_fun,[{type,{3676,9},'fun',[{type,{3676,9},product,[{var,{3676,10},'Port'},{atom,{3676,16},os_pid}]},{type,{3676,27},union,[{type,{3676,27},tuple,[{atom,{3676,28},os_pid},{var,{3676,36},'OsPid'}]},{atom,{3676,45},undefined}]}]},[{type,{3677,7},constraint,[{atom,{3677,7},is_subtype},[{var,{3677,7},'Port'},{type,{3677,15},union,[{type,{3677,15},port,[]},{type,{3677,24},atom,[]}]}]]},{type,{3678,7},constraint,[{atom,{3678,7},is_subtype},[{var,{3678,7},'OsPid'},{type,{3678,16},union,[{type,{3678,16},non_neg_integer,[]},{atom,{3678,36},undefined}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,112,111,114,116,32,102,114,111,109,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,111,114,116,95,99,111,109,109,97,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,50>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,111,114,116,95,99,111,109,109,97,110,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,114,116,95,99,111,109,109,97,110,100,47,51>>]}]},<<44,32,111,114,32>>,{code,[],[<<80,111,114,116,32,33,32,123,79,119,110,101,114,44,32,123,99,111,109,109,97,110,100,44,32,68,97,116,97,125>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,51,53>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3679,9},bounded_fun,[{type,{3679,9},'fun',[{type,{3679,9},product,[{var,{3679,10},'Port'},{atom,{3679,16},output}]},{type,{3679,27},union,[{type,{3679,27},tuple,[{atom,{3679,28},output},{var,{3679,36},'Bytes'}]},{atom,{3679,45},undefined}]}]},[{type,{3680,7},constraint,[{atom,{3680,7},is_subtype},[{var,{3680,7},'Port'},{type,{3680,15},union,[{type,{3680,15},port,[]},{type,{3680,24},atom,[]}]}]]},{type,{3681,7},constraint,[{atom,{3681,7},is_subtype},[{var,{3681,7},'Bytes'},{type,{3681,16},non_neg_integer,[]}]]}]]}]}}]}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,111,111,108,101,97,110>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,104,105,110,116,32,117,115,101,100,32,98,121,32,116,104,105,115,32,112,111,114,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,111,112,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,97,114,97,108,108,101,108,105,115,109>>]}]},<<32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,111,112,101,110,95,112,111,114,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,95,112,111,114,116,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,53,52>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3682,9},bounded_fun,[{type,{3682,9},'fun',[{type,{3682,9},product,[{var,{3682,10},'Port'},{atom,{3682,16},parallelism}]},{type,{3682,32},union,[{type,{3682,32},tuple,[{atom,{3682,33},parallelism},{var,{3682,46},'Boolean'}]},{atom,{3682,57},undefined}]}]},[{type,{3683,7},constraint,[{atom,{3683,7},is_subtype},[{var,{3683,7},'Port'},{type,{3683,15},union,[{type,{3683,15},port,[]},{type,{3683,24},atom,[]}]}]]},{type,{3684,7},constraint,[{atom,{3684,7},is_subtype},[{var,{3684,7},'Boolean'},{type,{3684,18},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,113,117,101,117,101,100,32,98,121,32,116,104,101,32,112,111,114,116,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,100,114,105,118,101,114,32,113,117,101,117,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,54,53>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3685,9},bounded_fun,[{type,{3685,9},'fun',[{type,{3685,9},product,[{var,{3685,10},'Port'},{atom,{3685,16},queue_size}]},{type,{3685,31},union,[{type,{3685,31},tuple,[{atom,{3685,32},queue_size},{var,{3685,44},'Bytes'}]},{atom,{3685,53},undefined}]}]},[{type,{3686,7},constraint,[{atom,{3686,7},is_subtype},[{var,{3686,7},'Port'},{type,{3686,15},union,[{type,{3686,15},port,[]},{type,{3686,24},atom,[]}]}]]},{type,{3687,7},constraint,[{atom,{3687,7},is_subtype},[{var,{3687,7},'Bytes'},{type,{3687,16},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,port_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3649}],[<<112,111,114,116,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<82,101,103,105,115,116,101,114,101,100,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,111,102,32,116,104,101,32,112,111,114,116,46,32,73,102,32,116,104,101,32,112,111,114,116,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,111,112,101,110,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32,116,104,101,32,112,111,114,116,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,108,105,110,107,101,100,32,116,111,32,116,104,101,32,112,111,114,116,44,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,116,104,101,32,112,111,114,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<112,111,114,116,95,105,110,102,111,47,50>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,97,110,32,97,116,111,109,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,56,50>>,signature => [{attribute,{3649,2},spec,{{erlang,port_info,2},[{type,{3688,9},bounded_fun,[{type,{3688,9},'fun',[{type,{3688,9},product,[{var,{3688,10},'Port'},{atom,{3688,16},registered_name}]},{type,{3688,36},union,[{type,{3688,36},tuple,[{atom,{3688,37},registered_name},{var,{3688,54},'RegisteredName'}]},{type,{3688,72},nil,[]},{atom,{3688,77},undefined}]}]},[{type,{3689,7},constraint,[{atom,{3689,7},is_subtype},[{var,{3689,7},'Port'},{type,{3689,15},union,[{type,{3689,15},port,[]},{type,{3689,24},atom,[]}]}]]},{type,{3690,7},constraint,[{atom,{3690,7},is_subtype},[{var,{3690,7},'RegisteredName'},{type,{3690,25},atom,[]}]]}]]}]}}]}},{{function,port_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1569}],[<<112,111,114,116,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32>>,{code,[],[<<80,111,114,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,53,57,57,57>>,signature => [{attribute,{1569,2},spec,{{port_to_list,1},[{type,{1569,19},bounded_fun,[{type,{1569,19},'fun',[{type,{1569,19},product,[{var,{1569,20},'Port'}]},{type,{1569,29},string,[]}]},[{type,{1570,7},constraint,[{atom,{1570,7},is_subtype},[{var,{1570,7},'Port'},{type,{1570,15},port,[]}]]}]]}]}}]}},{{function,ports,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1575}],[<<112,111,114,116,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,111,114,116,115,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,111,114,116,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,111,112,101,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,48,56>>,signature => [{attribute,{1575,2},spec,{{erlang,ports,0},[{type,{1575,19},'fun',[{type,{1575,19},product,[]},{type,{1575,25},list,[{type,{1575,26},port,[]}]}]}]}}]}},{{function,pre_loaded,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1721}],[<<112,114,101,95,108,111,97,100,101,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,112,114,101,108,111,97,100,101,100,32,105,110,32,116,104,101,32,114,117,110,45,116,105,109,101,32,115,121,115,116,101,109,46,32,80,114,101,45,108,111,97,100,101,100,32,109,111,100,117,108,101,115,32,97,114,101,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,110,101,101,100,101,100,32,116,111,32,98,111,111,116,115,116,114,97,112,32,116,104,101,32,115,121,115,116,101,109,32,116,111,32,108,111,97,100,32,116,104,101,32,102,105,114,115,116,32,69,114,108,97,110,103,32,109,111,100,117,108,101,115,32,102,114,111,109,32,101,105,116,104,101,114,32,100,105,115,107,32,111,114,32,98,121,32,117,115,105,110,103,32>>,{a,[{href,<<107,101,114,110,101,108,58,101,114,108,95,98,111,111,116,95,115,101,114,118,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,98,111,111,116,95,115,101,114,118,101,114>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,49,56>>,signature => [{attribute,{1721,2},spec,{{pre_loaded,0},[{type,{1721,17},'fun',[{type,{1721,17},product,[]},{type,{1721,23},list,[{type,{1721,24},module,[]}]}]}]}}]}},{{function,process_display,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1726}],[<<112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,47,50>>],#{<<101,110>> => [{p,[],[<<87,114,105,116,101,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<32,111,110,32,115,116,97,110,100,97,114,100,32,101,114,114,111,114,46,32,84,104,101,32,111,110,108,121,32,97,108,108,111,119,101,100,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<98,97,99,107,116,114,97,99,101>>]},<<44,32,119,104,105,99,104,32,115,104,111,119,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,99,97,108,108,32,115,116,97,99,107,44,32,105,110,99,108,117,100,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,97,108,108,32,99,104,97,105,110,44,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,112,114,105,110,116,101,100,32,102,105,114,115,116,46,32,84,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,111,117,116,112,117,116,32,105,115,32,110,111,116,32,102,117,114,116,104,101,114,32,100,101,102,105,110,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,51,48>>,signature => [{attribute,{1726,2},spec,{{erlang,process_display,2},[{type,{1726,29},bounded_fun,[{type,{1726,29},'fun',[{type,{1726,29},product,[{var,{1726,30},'Pid'},{var,{1726,35},'Type'}]},{atom,{1726,44},true}]},[{type,{1727,7},constraint,[{atom,{1727,7},is_subtype},[{var,{1727,7},'Pid'},{type,{1727,14},pid,[]}]]},{type,{1728,7},constraint,[{atom,{1728,7},is_subtype},[{var,{1728,7},'Type'},{atom,{1728,15},backtrace}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<87,104,101,110,32>>,{code,[],[<<116,114,97,112,95,101,120,105,116>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,101,120,105,116,32,115,105,103,110,97,108,115,32,97,114,114,105,118,105,110,103,32,116,111,32,97,32,112,114,111,99,101,115,115,32,97,114,101,32,99,111,110,118,101,114,116,101,100,32,116,111,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,70,114,111,109,44,32,82,101,97,115,111,110,125>>]},<<32,109,101,115,115,97,103,101,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,99,101,105,118,101,100,32,97,115,32,111,114,100,105,110,97,114,121,32,109,101,115,115,97,103,101,115,46,32,73,102,32>>,{code,[],[<<116,114,97,112,95,101,120,105,116>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,105,102,32,105,116,32,114,101,99,101,105,118,101,115,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,111,116,104,101,114,32,116,104,97,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,110,100,32,116,104,101,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,116,111,32,105,116,115,32,108,105,110,107,101,100,32,112,114,111,99,101,115,115,101,115,46,32,65,112,112,108,105,99,97,116,105,111,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,116,111,32,116,114,97,112,32,101,120,105,116,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,120,105,116,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,52,52>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2419,19},bounded_fun,[{type,{2419,19},'fun',[{type,{2419,19},product,[{atom,{2419,20},trap_exit},{var,{2419,31},'Boolean'}]},{var,{2419,43},'OldBoolean'}]},[{type,{2420,7},constraint,[{atom,{2420,7},is_subtype},[{var,{2420,7},'Boolean'},{type,{2420,18},boolean,[]}]]},{type,{2421,7},constraint,[{atom,{2421,7},is_subtype},[{var,{2421,7},'OldBoolean'},{type,{2421,21},boolean,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<85,115,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,116,111,32,114,101,100,101,102,105,110,101,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,110,100,32,117,110,100,101,102,105,110,101,100,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,101,115,46,32,73,110,101,120,112,101,114,105,101,110,99,101,100,32,117,115,101,114,115,32,97,114,101,32,110,111,116,32,116,111,32,117,115,101,32,116,104,105,115,32,102,108,97,103,44,32,97,115,32,99,111,100,101,32,97,117,116,111,45,108,111,97,100,105,110,103,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,99,111,114,114,101,99,116,32,111,112,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,109,111,100,117,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,54,50>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2422,19},bounded_fun,[{type,{2422,19},'fun',[{type,{2422,19},product,[{atom,{2422,20},error_handler},{var,{2422,35},'Module'}]},{var,{2422,46},'OldModule'}]},[{type,{2423,7},constraint,[{atom,{2423,7},is_subtype},[{var,{2423,7},'Module'},{type,{2423,17},atom,[]}]]},{type,{2424,7},constraint,[{atom,{2424,7},is_subtype},[{var,{2424,7},'OldModule'},{type,{2424,20},atom,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,103,101,110,101,114,97,116,105,111,110,97,108,32,99,111,108,108,101,99,116,105,111,110,115,32,98,101,102,111,114,101,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,55,54>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2425,19},bounded_fun,[{type,{2425,19},'fun',[{type,{2425,19},product,[{atom,{2425,20},fullsweep_after},{var,{2425,37},'FullsweepAfter'}]},{var,{2425,56},'OldFullsweepAfter'}]},[{type,{2426,7},constraint,[{atom,{2426,7},is_subtype},[{var,{2426,7},'FullsweepAfter'},{type,{2426,25},non_neg_integer,[]}]]},{type,{2427,7},constraint,[{atom,{2427,7},is_subtype},[{var,{2427,7},'OldFullsweepAfter'},{type,{2427,28},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,56,55>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2428,19},bounded_fun,[{type,{2428,19},'fun',[{type,{2428,19},product,[{atom,{2428,20},min_heap_size},{var,{2428,35},'MinHeapSize'}]},{var,{2428,51},'OldMinHeapSize'}]},[{type,{2429,7},constraint,[{atom,{2429,7},is_subtype},[{var,{2429,7},'MinHeapSize'},{type,{2429,22},non_neg_integer,[]}]]},{type,{2430,7},constraint,[{atom,{2430,7},is_subtype},[{var,{2430,7},'OldMinHeapSize'},{type,{2430,25},non_neg_integer,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,48,57,56>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2431,19},bounded_fun,[{type,{2431,19},'fun',[{type,{2431,19},product,[{atom,{2431,20},min_bin_vheap_size},{var,{2431,40},'MinBinVHeapSize'}]},{var,{2431,60},'OldMinBinVHeapSize'}]},[{type,{2432,7},constraint,[{atom,{2432,7},is_subtype},[{var,{2432,7},'MinBinVHeapSize'},{type,{2432,26},non_neg_integer,[]}]]},{type,{2433,7},constraint,[{atom,{2433,7},is_subtype},[{var,{2433,7},'OldMinBinVHeapSize'},{type,{2433,29},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]}]},{p,[],[<<84,104,105,115,32,102,108,97,103,32,115,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,73,102,32>>,{code,[],[<<77,97,120,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<107,105,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,114,111,114,95,108,111,103,103,101,114>>]},<<32,97,114,101,32,117,115,101,100,46>>]},{dl,[],[{dt,[],[{code,[],[<<115,105,122,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,73,102,32,115,101,116,32,116,111,32,122,101,114,111,44,32,116,104,101,32,104,101,97,112,32,115,105,122,101,32,108,105,109,105,116,32,105,115,32,100,105,115,97,98,108,101,100,46,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,115,32,98,101,32,116,104,114,111,119,110,32,105,102,32,116,104,101,32,118,97,108,117,101,32,105,115,32,115,109,97,108,108,101,114,32,116,104,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,105,110,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]}]},<<46,32,84,104,101,32,115,105,122,101,32,99,104,101,99,107,32,105,115,32,111,110,108,121,32,100,111,110,101,32,119,104,101,110,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46>>]},{p,[],[{code,[],[<<115,105,122,101>>]},<<32,105,115,32,116,104,101,32,101,110,116,105,114,101,32,104,101,97,112,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,116,114,105,103,103,101,114,101,100,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,97,108,108,32,103,101,110,101,114,97,116,105,111,110,97,108,32,104,101,97,112,115,44,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,44,32,97,110,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112>>]},<<44,32,97,110,100,32,97,110,121,32,101,120,116,114,97,32,109,101,109,111,114,121,32,116,104,97,116,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,111,114,32,110,101,101,100,115,32,100,117,114,105,110,103,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[{code,[],[<<115,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,41>>]}]},<<44,32,111,114,32,98,121,32,97,100,100,105,110,103,32>>,{code,[],[<<104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<32,97,110,100,32>>,{code,[],[<<109,98,117,102,95,115,105,122,101>>]},<<32,102,114,111,109,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<107,105,108,108>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,101,110,100,115,32,97,110,32,117,110,116,114,97,112,112,97,98,108,101,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<107,105,108,108>>]},<<32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,102,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,32,84,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,116,104,97,116,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32>>,{code,[],[<<107,105,108,108>>]},<<32,105,115,32,110,111,116,32,99,111,109,112,108,101,116,101,100,44,32,105,110,115,116,101,97,100,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,97,115,32,115,111,111,110,32,97,115,32,112,111,115,115,105,98,108,101,46,32,87,104,101,110,32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,110,111,32,101,120,105,116,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,44,32,105,110,115,116,101,97,100,32,105,116,32,99,111,110,116,105,110,117,101,115,32,101,120,101,99,117,116,105,110,103,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<107,105,108,108>>]},<<32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,119,105,108,108,32,98,101,32,117,115,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,111,112,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<43,104,109,97,120,107>>]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<101,114,114,111,114,95,108,111,103,103,101,114>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32,115,101,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,108,111,103,115,32,97,110,32,101,114,114,111,114,32,101,118,101,110,116,32,118,105,97,32>>,{a,[{href,<<107,101,114,110,101,108,58,108,111,103,103,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,103,103,101,114>>]}]},<<44,32,99,111,110,116,97,105,110,105,110,103,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,119,104,101,110,32,116,104,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,105,115,32,114,101,97,99,104,101,100,46,32,79,110,101,32,108,111,103,32,101,118,101,110,116,32,105,115,32,115,101,110,116,32,101,97,99,104,32,116,105,109,101,32,116,104,101,32,108,105,109,105,116,32,105,115,32,114,101,97,99,104,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<101,114,114,111,114,95,108,111,103,103,101,114>>]},<<32,105,115,32,110,111,116,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,109,97,112,44,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32,117,115,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,101,105,116,104,101,114,32,116,104,101,32,111,112,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<43,104,109,97,120,101,108>>]},<<32,105,110,116,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46>>]}]}]},{p,[],[<<84,104,101,32,104,101,97,112,32,115,105,122,101,32,111,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,113,117,105,116,101,32,104,97,114,100,32,116,111,32,112,114,101,100,105,99,116,44,32,101,115,112,101,99,105,97,108,108,121,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,116,104,97,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,99,111,110,116,101,109,112,108,97,116,105,110,103,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,102,105,114,115,116,32,114,117,110,32,105,116,32,105,110,32,112,114,111,100,117,99,116,105,111,110,32,119,105,116,104,32>>,{code,[],[<<107,105,108,108>>]},<<32,115,101,116,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,97,110,100,32,105,110,115,112,101,99,116,32,116,104,101,32,108,111,103,32,101,118,101,110,116,115,32,116,111,32,115,101,101,32,119,104,97,116,32,116,104,101,32,110,111,114,109,97,108,32,112,101,97,107,32,115,105,122,101,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,105,115,32,97,110,100,32,116,104,101,110,32,116,117,110,101,32,116,104,101,32,118,97,108,117,101,32,97,99,99,111,114,100,105,110,103,108,121,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,49,48,57>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2434,19},bounded_fun,[{type,{2434,19},'fun',[{type,{2434,19},product,[{atom,{2434,20},max_heap_size},{var,{2434,35},'MaxHeapSize'}]},{var,{2434,51},'OldMaxHeapSize'}]},[{type,{2435,7},constraint,[{atom,{2435,7},is_subtype},[{var,{2435,7},'MaxHeapSize'},{user_type,{2435,22},max_heap_size,[]}]]},{type,{2436,7},constraint,[{atom,{2436,7},is_subtype},[{var,{2436,7},'OldMaxHeapSize'},{user_type,{2436,25},max_heap_size,[]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]}]},{p,[],[<<68,101,116,101,114,109,105,110,101,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,114,101,32,115,116,111,114,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<111,102,102,95,104,101,97,112>>]}]},{dd,[],[{p,[],[{em,[],[<<65,108,108>>]},<<32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,32,115,116,111,114,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46,32,84,104,105,115,32,105,109,112,108,105,101,115,32,116,104,97,116,32>>,{em,[],[<<110,111>>]},<<32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,98,101,32,112,97,114,116,32,111,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<111,110,95,104,101,97,112>>]}]},{dd,[],[{p,[],[<<65,108,108,32,109,101,115,115,97,103,101,115,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,98,101,32,112,108,97,99,101,100,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46,32,84,104,101,121,32,99,97,110,44,32,104,111,119,101,118,101,114,44,32,98,101,32,116,101,109,112,111,114,97,114,105,108,121,32,115,116,111,114,101,100,32,111,102,102,32,116,104,101,32,104,101,97,112,46,32,84,104,105,115,32,105,115,32,104,111,119,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,97,108,119,97,121,115,32,98,101,101,110,32,115,116,111,114,101,100,32,117,112,32,117,110,116,105,108,32,69,82,84,83,32,56,46,48,46>>]}]}]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,113,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,113,100>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,109,97,121,32,112,111,116,101,110,116,105,97,108,108,121,32,97,99,99,117,109,117,108,97,116,101,32,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,109,101,115,115,97,103,101,115,32,105,110,32,105,116,115,32,113,117,101,117,101,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,115,101,116,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<46,32,84,104,105,115,32,105,115,32,100,117,101,32,116,111,32,116,104,101,32,102,97,99,116,32,116,104,97,116,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,97,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,109,101,115,115,97,103,101,115,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,101,97,112,32,99,97,110,32,98,101,99,111,109,101,32,101,120,116,114,101,109,101,108,121,32,101,120,112,101,110,115,105,118,101,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,110,32,99,111,110,115,117,109,101,32,108,97,114,103,101,32,97,109,111,117,110,116,115,32,111,102,32,109,101,109,111,114,121,46,32,84,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,32,105,115,44,32,104,111,119,101,118,101,114,44,32,103,101,110,101,114,97,108,108,121,32,98,101,116,116,101,114,32,119,104,101,110,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<111,110,95,104,101,97,112>>]},<<46>>]},{p,[],[<<67,104,97,110,103,105,110,103,32,116,104,101,32,102,108,97,103,32,118,97,108,117,101,32,99,97,117,115,101,115,32,97,110,121,32,101,120,105,115,116,105,110,103,32,109,101,115,115,97,103,101,115,32,116,111,32,98,101,32,109,111,118,101,100,46,32,84,104,101,32,109,111,118,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,105,110,105,116,105,97,116,101,100,44,32,98,117,116,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,99,111,109,112,108,101,116,101,100,44,32,98,121,32,116,104,101,32,116,105,109,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,49,56,51>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2437,19},bounded_fun,[{type,{2437,19},'fun',[{type,{2437,19},product,[{atom,{2437,20},message_queue_data},{var,{2437,40},'MQD'}]},{var,{2437,48},'OldMQD'}]},[{type,{2438,7},constraint,[{atom,{2438,7},is_subtype},[{var,{2438,7},'MQD'},{user_type,{2438,14},message_queue_data,[]}]]},{type,{2439,7},constraint,[{atom,{2439,7},is_subtype},[{var,{2439,7},'OldMQD'},{user_type,{2439,17},message_queue_data,[]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,46,32>>,{code,[],[<<76,101,118,101,108>>]},<<32,105,115,32,97,110,32,97,116,111,109,46,32,70,111,117,114,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,115,32,101,120,105,115,116,58,32>>,{code,[],[<<108,111,119>>]},<<44,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<44,32>>,{code,[],[<<104,105,103,104>>]},<<44,32,97,110,100,32>>,{code,[],[<<109,97,120>>]},<<46,32,68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<80,114,105,111,114,105,116,121,32,108,101,118,101,108,32>>,{code,[],[<<109,97,120>>]},<<32,105,115,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,110,116,101,114,110,97,108,32,117,115,101,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,44,32,97,110,100,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,111,116,104,101,114,115,46>>]}]},{p,[],[<<73,110,116,101,114,110,97,108,108,121,32,105,110,32,101,97,99,104,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,44,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,115,99,104,101,100,117,108,101,100,32,105,110,32,97,32,114,111,117,110,100,32,114,111,98,105,110,32,102,97,115,104,105,111,110,46>>]},{p,[],[<<69,120,101,99,117,116,105,111,110,32,111,102,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,110,100,32>>,{code,[],[<<108,111,119>>]},<<32,97,114,101,32,105,110,116,101,114,108,101,97,118,101,100,46,32,80,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,108,101,115,115,32,102,114,101,113,117,101,110,116,108,121,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{p,[],[<<87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<32,111,114,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,116,104,105,115,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,109,101,97,110,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<32,111,114,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,99,97,110,32,114,117,110,32,119,104,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,114,117,110,110,105,110,103,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<46,32,87,104,101,110,32,117,115,105,110,103,32,109,117,108,116,105,112,108,101,32,115,99,104,101,100,117,108,101,114,115,44,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,32,99,97,110,32,98,101,32,114,117,110,110,105,110,103,32,105,110,32,112,97,114,97,108,108,101,108,32,116,104,97,110,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<46,32,84,104,97,116,32,105,115,44,32,97,32>>,{code,[],[<<108,111,119>>]},<<32,97,110,100,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,110,32,101,120,101,99,117,116,101,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46>>]},{p,[],[<<87,104,101,110,32,114,117,110,110,97,98,108,101,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<109,97,120>>]},<<32,101,120,105,115,116,44,32,110,111,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<108,111,119>>]},<<44,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<44,32,111,114,32>>,{code,[],[<<104,105,103,104>>]},<<32,97,114,101,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46,32,65,115,32,119,105,116,104,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<44,32,112,114,111,99,101,115,115,101,115,32,111,110,32,108,111,119,101,114,32,112,114,105,111,114,105,116,105,101,115,32,99,97,110,32,101,120,101,99,117,116,101,32,105,110,32,112,97,114,97,108,108,101,108,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<109,97,120>>]},<<46>>]},{p,[],[<<83,99,104,101,100,117,108,105,110,103,32,105,115,32,112,114,101,45,101,109,112,116,105,118,101,46,32,82,101,103,97,114,100,108,101,115,115,32,111,102,32,112,114,105,111,114,105,116,121,44,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,114,101,45,101,109,112,116,101,100,32,119,104,101,110,32,105,116,32,104,97,115,32,99,111,110,115,117,109,101,100,32,109,111,114,101,32,116,104,97,110,32,97,32,99,101,114,116,97,105,110,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,32,119,97,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,115,99,104,101,100,117,108,105,110,103,32,116,111,32,114,101,109,97,105,110,32,101,120,97,99,116,108,121,32,97,115,32,105,116,32,105,115,32,116,111,100,97,121,46,32,83,99,104,101,100,117,108,105,110,103,32,105,115,32,108,105,107,101,108,121,32,116,111,32,98,101,32,99,104,97,110,103,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,32,116,111,32,117,115,101,32,97,118,97,105,108,97,98,108,101,32,112,114,111,99,101,115,115,111,114,32,99,111,114,101,115,32,98,101,116,116,101,114,46>>]}]},{p,[],[<<84,104,101,114,101,32,105,115,32>>,{em,[],[<<110,111>>]},<<32,97,117,116,111,109,97,116,105,99,32,109,101,99,104,97,110,105,115,109,32,102,111,114,32,97,118,111,105,100,105,110,103,32,112,114,105,111,114,105,116,121,32,105,110,118,101,114,115,105,111,110,44,32,115,117,99,104,32,97,115,32,112,114,105,111,114,105,116,121,32,105,110,104,101,114,105,116,97,110,99,101,32,111,114,32,112,114,105,111,114,105,116,121,32,99,101,105,108,105,110,103,115,46,32,87,104,101,110,32,117,115,105,110,103,32,112,114,105,111,114,105,116,105,101,115,44,32,116,97,107,101,32,116,104,105,115,32,105,110,116,111,32,97,99,99,111,117,110,116,32,97,110,100,32,104,97,110,100,108,101,32,115,117,99,104,32,115,99,101,110,97,114,105,111,115,32,98,121,32,121,111,117,114,115,101,108,102,46>>]},{p,[],[<<77,97,107,105,110,103,32,99,97,108,108,115,32,102,114,111,109,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,105,110,116,111,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,115,32,110,111,32,99,111,110,116,114,111,108,32,111,118,101,114,32,99,97,110,32,99,97,117,115,101,32,116,104,101,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,111,32,119,97,105,116,32,102,111,114,32,97,32,112,114,111,99,101,115,115,32,119,105,116,104,32,108,111,119,101,114,32,112,114,105,111,114,105,116,121,46,32,84,104,97,116,32,105,115,44,32,101,102,102,101,99,116,105,118,101,108,121,32,100,101,99,114,101,97,115,105,110,103,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,46,32,69,118,101,110,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,32,119,105,116,104,32,111,110,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,100,101,32,116,104,97,116,32,121,111,117,32,104,97,118,101,32,110,111,32,99,111,110,116,114,111,108,32,111,118,101,114,44,32,105,116,32,99,97,110,32,98,101,32,116,104,101,32,99,97,115,101,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,105,116,46,32,84,104,105,115,32,99,97,110,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,111,99,99,117,114,32,105,102,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,116,114,105,103,103,101,114,115,32,99,111,100,101,32,108,111,97,100,105,110,103,44,32,97,115,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,114,117,110,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{p,[],[<<79,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,32,116,104,97,110,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<32,97,114,101,32,110,111,114,109,97,108,108,121,32,110,111,116,32,110,101,101,100,101,100,46,32,87,104,101,110,32,111,116,104,101,114,32,112,114,105,111,114,105,116,105,101,115,32,97,114,101,32,117,115,101,100,44,32,117,115,101,32,116,104,101,109,32,119,105,116,104,32,99,97,114,101,44,32>>,{em,[],[<<101,115,112,101,99,105,97,108,108,121>>]},<<32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<46,32,65,32,112,114,111,99,101,115,115,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<104,105,103,104>>]},<<32,105,115,32,111,110,108,121,32,116,111,32,112,101,114,102,111,114,109,32,119,111,114,107,32,102,111,114,32,115,104,111,114,116,32,112,101,114,105,111,100,115,46,32,66,117,115,121,32,108,111,111,112,105,110,103,32,102,111,114,32,108,111,110,103,32,112,101,114,105,111,100,115,32,105,110,32,97,32>>,{code,[],[<<104,105,103,104>>]},<<32,112,114,105,111,114,105,116,121,32,112,114,111,99,101,115,115,32,99,97,117,115,101,115,32,109,111,115,116,32,108,105,107,101,108,121,32,112,114,111,98,108,101,109,115,44,32,97,115,32,105,109,112,111,114,116,97,110,116,32,79,84,80,32,115,101,114,118,101,114,115,32,114,117,110,32,111,110,32,112,114,105,111,114,105,116,121,32>>,{code,[],[<<110,111,114,109,97,108>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,50,50,53>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2440,19},bounded_fun,[{type,{2440,19},'fun',[{type,{2440,19},product,[{atom,{2440,20},priority},{var,{2440,30},'Level'}]},{var,{2440,40},'OldLevel'}]},[{type,{2441,7},constraint,[{atom,{2441,7},is_subtype},[{var,{2441,7},'Level'},{user_type,{2441,16},priority_level,[]}]]},{type,{2442,7},constraint,[{atom,{2442,7},is_subtype},[{var,{2442,7},'OldLevel'},{user_type,{2442,19},priority_level,[]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[{code,[],[<<78>>]},<<32,109,117,115,116,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,105,110,32,116,104,101,32,105,110,116,101,114,118,97,108,32,48,46,46,49,48,48,48,48,46,32,73,102,32>>,{code,[],[<<78>>]},<<32,62,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,109,97,100,101,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<78>>]},<<32,109,111,115,116,32,114,101,99,101,110,116,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,66,73,70,32,99,97,108,108,115,44,32,115,101,110,100,115,44,32,97,110,100,32,114,101,99,101,105,118,101,115,32,109,97,100,101,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,97,114,101,32,115,97,118,101,100,32,105,110,32,97,32,108,105,115,116,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,32>>,{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,40,80,105,100,44,32,108,97,115,116,95,99,97,108,108,115,41>>]},<<46,32,65,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,105,115,32,111,110,101,32,105,110,32,119,104,105,99,104,32,116,104,101,32,109,111,100,117,108,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,109,101,110,116,105,111,110,101,100,46,32,79,110,108,121,32,97,32,102,105,120,101,100,32,97,109,111,117,110,116,32,111,102,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,115,97,118,101,100,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{ul,[],[{li,[],[{p,[],[<<65,32,116,117,112,108,101,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<32,102,111,114,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115>>]}]},{li,[],[{p,[],[<<84,104,101,32,97,116,111,109,115,32>>,{code,[],[<<115,101,110,100>>]},<<44,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<44,32,97,110,100,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,102,111,114,32,115,101,110,100,115,32,97,110,100,32,114,101,99,101,105,118,101,115,32,40>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,119,104,101,110,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,99,101,105,118,101,100,32,97,110,100,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,119,104,101,110,32,97,32,114,101,99,101,105,118,101,32,116,105,109,101,115,32,111,117,116,41>>]}]}]},{p,[],[<<73,102,32>>,{code,[],[<<78>>]},<<32,61,32,48,44,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,100,105,115,97,98,108,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,32,87,104,101,110,101,118,101,114,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,115,101,116,44,32,105,116,115,32,99,111,110,116,101,110,116,115,32,97,114,101,32,114,101,115,101,116,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,50,57,56>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2443,19},bounded_fun,[{type,{2443,19},'fun',[{type,{2443,19},product,[{atom,{2443,20},save_calls},{var,{2443,32},'N'}]},{var,{2443,38},'OldN'}]},[{type,{2444,7},constraint,[{atom,{2444,7},is_subtype},[{var,{2444,7},'N'},{type,{2444,12},range,[{integer,{2444,12},0},{integer,{2444,15},10000}]}]]},{type,{2445,7},constraint,[{atom,{2445,7},is_subtype},[{var,{2445,7},'OldN'},{type,{2445,15},range,[{integer,{2445,15},0},{integer,{2445,18},10000}]}]]}]]}]}}]}},{{function,process_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2419}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,111,114,32,99,108,101,97,114,115,32,102,108,97,103,32>>,{code,[],[<<115,101,110,115,105,116,105,118,101>>]},<<32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,109,97,114,107,101,100,32,97,115,32,115,101,110,115,105,116,105,118,101,32,98,121,32,99,97,108,108,105,110,103,32>>,{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,115,101,110,115,105,116,105,118,101,44,32,116,114,117,101,41>>]},<<44,32,102,101,97,116,117,114,101,115,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,101,120,97,109,105,110,105,110,103,32,116,104,101,32,100,97,116,97,32,111,114,32,105,110,110,101,114,32,119,111,114,107,105,110,103,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,97,114,101,32,115,105,108,101,110,116,108,121,32,100,105,115,97,98,108,101,100,46>>]},{p,[],[<<70,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,100,105,115,97,98,108,101,100,32,105,110,99,108,117,100,101,32,40,98,117,116,32,97,114,101,32,110,111,116,32,108,105,109,105,116,101,100,32,116,111,41,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{p,[],[<<84,114,97,99,105,110,103,46,32,84,114,97,99,101,32,102,108,97,103,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,98,117,116,32,110,111,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,111,102,32,97,110,121,32,107,105,110,100,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46,32,40,73,102,32,102,108,97,103,32>>,{code,[],[<<115,101,110,115,105,116,105,118,101>>]},<<32,105,115,32,116,117,114,110,101,100,32,111,102,102,44,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,97,103,97,105,110,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,110,121,32,116,114,97,99,101,32,102,108,97,103,115,32,97,114,101,32,115,101,116,46,41>>]}]},{li,[],[{p,[],[<<83,101,113,117,101,110,116,105,97,108,32,116,114,97,99,105,110,103,46,32,84,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,105,115,32,112,114,111,112,97,103,97,116,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,110,111,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,103,101,110,101,114,97,116,101,100,46>>]}]}]},{p,[],[{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,49,44,50>>]},<<32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,32,116,111,32,114,101,97,100,32,111,117,116,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,40,98,111,116,104,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,101,109,112,116,121,32,108,105,115,116,115,41,46>>]},{p,[],[<<83,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,99,97,110,110,111,116,32,98,101,32,100,105,115,112,108,97,121,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,110,32,99,114,97,115,104,32,100,117,109,112,115,44,32,116,104,101,32,115,116,97,99,107,44,32,109,101,115,115,97,103,101,115,44,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,32,97,114,101,32,111,109,105,116,116,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<123,115,97,118,101,95,99,97,108,108,115,44,78,125>>]},<<32,104,97,115,32,98,101,101,110,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,110,111,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,115,97,118,101,100,32,116,111,32,116,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,46,32,40,84,104,101,32,99,97,108,108,32,115,97,118,105,110,103,32,108,105,115,116,32,105,115,32,110,111,116,32,99,108,101,97,114,101,100,46,32,65,108,115,111,44,32,115,101,110,100,44,32,114,101,99,101,105,118,101,44,32,97,110,100,32,116,105,109,101,45,111,117,116,32,101,118,101,110,116,115,32,97,114,101,32,115,116,105,108,108,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,46,41>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,50,57>>,signature => [{attribute,{2419,2},spec,{{process_flag,2},[{type,{2446,19},bounded_fun,[{type,{2446,19},'fun',[{type,{2446,19},product,[{atom,{2446,20},sensitive},{var,{2446,31},'Boolean'}]},{var,{2446,43},'OldBoolean'}]},[{type,{2447,7},constraint,[{atom,{2447,7},is_subtype},[{var,{2447,7},'Boolean'},{type,{2447,18},boolean,[]}]]},{type,{2448,7},constraint,[{atom,{2448,7},is_subtype},[{var,{2448,7},'OldBoolean'},{type,{2448,21},boolean,[]}]]}]]}]}}]}},{{function,process_flag,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1748}],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,99,101,114,116,97,105,110,32,102,108,97,103,115,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<44,32,105,110,32,116,104,101,32,115,97,109,101,32,109,97,110,110,101,114,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46,32,82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<70,108,97,103>>]},<<32,97,114,101,32,111,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,111,115,101,32,97,108,108,111,119,101,100,32,105,110,32>>,{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]},<<44,32,110,97,109,101,108,121,32>>,{code,[],[<<115,97,118,101,95,99,97,108,108,115>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,54,51>>,signature => [{attribute,{1748,2},spec,{{process_flag,3},[{type,{1748,19},bounded_fun,[{type,{1748,19},'fun',[{type,{1748,19},product,[{var,{1748,20},'Pid'},{var,{1748,25},'Flag'},{var,{1748,31},'Value'}]},{var,{1748,41},'OldValue'}]},[{type,{1749,7},constraint,[{atom,{1749,7},is_subtype},[{var,{1749,7},'Pid'},{type,{1749,14},pid,[]}]]},{type,{1750,7},constraint,[{atom,{1750,7},is_subtype},[{var,{1750,7},'Flag'},{atom,{1750,15},save_calls}]]},{type,{1751,7},constraint,[{atom,{1751,7},is_subtype},[{var,{1751,7},'Value'},{type,{1751,16},non_neg_integer,[]}]]},{type,{1752,7},constraint,[{atom,{1752,7},is_subtype},[{var,{1752,7},'OldValue'},{type,{1752,19},non_neg_integer,[]}]]}]]}]}}]}},{{function,process_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1765}],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<112,114,111,99,101,115,115,95,105,110,102,111,95,114,101,115,117,108,116,95,105,116,101,109>>}],[]},{li,[{name,<<115,116,97,99,107,95,105,116,101,109>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,119,105,116,104,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]},{p,[],[<<84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,97,108,108,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,97,114,101,32,110,111,116,32,109,97,110,100,97,116,111,114,121,46,32,84,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,119,105,116,104,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,116,101,109,115,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,58>>]},{ul,[],[{li,[],[{code,[],[<<99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110>>]}]},{li,[],[{code,[],[<<105,110,105,116,105,97,108,95,99,97,108,108>>]}]},{li,[],[{code,[],[<<115,116,97,116,117,115>>]}]},{li,[],[{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110>>]}]},{li,[],[{code,[],[<<108,105,110,107,115>>]}]},{li,[],[{code,[],[<<100,105,99,116,105,111,110,97,114,121>>]}]},{li,[],[{code,[],[<<116,114,97,112,95,101,120,105,116>>]}]},{li,[],[{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]}]},{li,[],[{code,[],[<<112,114,105,111,114,105,116,121>>]}]},{li,[],[{code,[],[<<103,114,111,117,112,95,108,101,97,100,101,114>>]}]},{li,[],[{code,[],[<<116,111,116,97,108,95,104,101,97,112,95,115,105,122,101>>]}]},{li,[],[{code,[],[<<104,101,97,112,95,115,105,122,101>>]}]},{li,[],[{code,[],[<<115,116,97,99,107,95,115,105,122,101>>]}]},{li,[],[{code,[],[<<114,101,100,117,99,116,105,111,110,115>>]}]},{li,[],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]}]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,104,97,115,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,97,108,115,111,32,97,110,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,119,105,116,104,32,105,116,101,109,32>>,{code,[],[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,105,115,32,105,110,99,108,117,100,101,100,46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,112,101,99,105,102,105,99,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,50>>]}]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32>>,{em,[],[<<100,101,98,117,103,103,105,110,103,32,111,110,108,121>>]},<<46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,32,112,117,114,112,111,115,101,115,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,50>>]}]},<<46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,51,55,56>>,signature => [{attribute,{1765,2},spec,{{process_info,1},[{type,{1765,19},bounded_fun,[{type,{1765,19},'fun',[{type,{1765,19},product,[{var,{1765,20},'Pid'}]},{var,{1765,28},'Info'}]},[{type,{1766,7},constraint,[{atom,{1766,7},is_subtype},[{var,{1766,7},'Pid'},{type,{1766,14},pid,[]}]]},{type,{1767,7},constraint,[{atom,{1767,7},is_subtype},[{var,{1767,7},'Info'},{type,{1767,15},union,[{type,{1767,15},list,[{var,{1767,16},'InfoTuple'}]},{atom,{1767,29},undefined}]}]]},{type,{1768,7},constraint,[{atom,{1768,7},is_subtype},[{var,{1768,7},'InfoTuple'},{user_type,{1768,20},process_info_result_item,[]}]]}]]}]}}]}},{{function,process_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2545}],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<112,114,111,99,101,115,115,95,105,110,102,111,95,105,116,101,109>>}],[]},{li,[{name,<<112,114,111,99,101,115,115,95,105,110,102,111,95,114,101,115,117,108,116,95,105,116,101,109>>}],[]},{li,[{name,<<115,116,97,99,107,95,105,116,101,109>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<32,111,114,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]},{p,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,97,108,105,118,101,32,97,110,100,32,97,32,115,105,110,103,108,101,32>>,{code,[],[<<73,116,101,109>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<44,32,117,110,108,101,115,115,32>>,{code,[],[<<73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,115,116,114,97,110,103,101,32,98,101,104,97,118,105,111,114,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,104,105,115,116,111,114,105,99,97,108,32,114,101,97,115,111,110,115,44,32,97,110,100,32,105,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101,76,105,115,116>>]},<<46,32,84,104,101,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,105,110,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101,76,105,115,116>>]},<<32,97,114,101,32,105,110,99,108,117,100,101,100,32,119,105,116,104,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,105,110,32,116,104,101,32,115,97,109,101,32,111,114,100,101,114,32,97,115,32,116,104,101,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,119,101,114,101,32,105,110,99,108,117,100,101,100,32,105,110,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<46,32,86,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,105,110,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<46>>]},{p,[],[<<71,101,116,116,105,110,103,32,112,114,111,99,101,115,115,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,108,108,111,119,115,32,116,104,101,32,115,105,103,110,97,108,32,111,114,100,101,114,105,110,103,32,103,117,97,114,97,110,116,101,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<80,114,111,99,101,115,115,101,115,32,67,104,97,112,116,101,114>>]},<<32,105,110,32,116,104,101,32>>,{i,[],[<<69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32>>,{code,[],[<<114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,105,115,32,112,97,114,116,32,111,102,32>>,{code,[],[<<73,116,101,109,76,105,115,116>>]},<<32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,110,97,109,101,32,114,101,103,105,115,116,101,114,101,100,44,32,97,32>>,{code,[],[<<123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,91,93,125>>]},<<44,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32>>,{em,[],[<<119,105,108,108>>]},<<32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101,76,105,115,116>>]},<<46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,97,32,115,105,110,103,108,101,32>>,{code,[],[<<73,116,101,109,32,61,58,61,32,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,97,110,100,32,119,104,101,110,32>>,{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111,47,49>>]},<<32,105,115,32,117,115,101,100,46>>]}]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<115,32,119,105,116,104,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<73,116,101,109>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,98,97,99,107,116,114,97,99,101,44,32,66,105,110,125>>]}]},{dd,[],[{p,[],[<<66,105,110,97,114,121,32>>,{code,[],[<<66,105,110>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,115,32,116,104,101,32,111,117,116,112,117,116,32,102,114,111,109,32>>,{code,[],[<<101,114,108,97,110,103,58,112,114,111,99,101,115,115,95,100,105,115,112,108,97,121,40,80,105,100,44,32,98,97,99,107,116,114,97,99,101,41>>]},<<46,32,85,115,101,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,108,105,115,116,47,49>>]},<<32,116,111,32,111,98,116,97,105,110,32,116,104,101,32,115,116,114,105,110,103,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,46>>]}]},{dt,[],[{code,[],[<<123,98,105,110,97,114,121,44,32,66,105,110,73,110,102,111,125>>]}]},{dd,[],[{p,[],[{code,[],[<<66,105,110,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,98,105,110,97,114,105,101,115,32,111,110,32,116,104,101,32,104,101,97,112,32,111,102,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,110,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32>>,{code,[],[<<66,105,110,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,46,32,84,104,101,32,116,117,112,108,101,115,32,99,111,110,116,97,105,110,59,32>>,{code,[],[<<66,105,110,97,114,121,73,100>>]},<<44,32>>,{code,[],[<<66,105,110,97,114,121,83,105,122,101>>]},<<44,32>>,{code,[],[<<66,105,110,97,114,121,82,101,102,99,67,111,117,110,116>>]},<<46>>]},{p,[],[<<68,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]}]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,109,97,121,32,98,101,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,101,97,112,46>>]}]},{dt,[],[{code,[],[<<123,99,97,116,99,104,108,101,118,101,108,44,32,67,97,116,99,104,76,101,118,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<67,97,116,99,104,76,101,118,101,108>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,99,117,114,114,101,110,116,108,121,32,97,99,116,105,118,101,32,99,97,116,99,104,101,115,32,105,110,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,114,101,110,116,95,102,117,110,99,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,32,124,32,117,110,100,101,102,105,110,101,100,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,118,97,108,117,101,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,110,97,116,105,118,101,32,99,111,109,112,105,108,101,100,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,114,101,110,116,95,108,111,99,97,116,105,111,110,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,44,32,76,111,99,97,116,105,111,110,125,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,108,111,99,97,116,105,111,110,32,105,110,32,116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,44,32,83,116,97,99,107,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,32,40>>,{em,[],[<<115,116,97,99,107,116,114,97,99,101>>]},<<41,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,116,97,99,107,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,115,32,105,110,32,116,104,101,32>>,{code,[],[<<99,97,116,99,104>>]},<<32,112,97,114,116,32,111,102,32,97,32>>,{code,[],[<<116,114,121>>]},<<46,32,83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115,35,115,116,97,99,107,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<84,104,101,32,99,97,108,108,45,115,116,97,99,107,32,98,97,99,107,32,116,114,97,99,101,32,40,115,116,97,99,107,116,114,97,99,101,41>>]},<<46,32,84,104,101,32,100,101,112,116,104,32,111,102,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,116,114,117,110,99,97,116,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32>>,{code,[],[<<98,97,99,107,116,114,97,99,101,95,100,101,112,116,104>>]},<<32,115,121,115,116,101,109,32,102,108,97,103,32,115,101,116,116,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,100,105,99,116,105,111,110,97,114,121,44,32,68,105,99,116,105,111,110,97,114,121,125>>]}]},{dd,[],[{p,[],[{code,[],[<<68,105,99,116,105,111,110,97,114,121>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,95,104,97,110,100,108,101,114,44,32,77,111,100,117,108,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,109,111,100,117,108,101,32,117,115,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,40,102,111,114,32,117,110,100,101,102,105,110,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,102,111,114,32,101,120,97,109,112,108,101,41,46>>]}]},{dt,[],[{code,[],[<<123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,44,32,71,67,73,110,102,111,125>>]}]},{dd,[],[{p,[],[{code,[],[<<71,67,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32>>,{code,[],[<<71,67,73,110,102,111>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{a,[{id,<<112,114,111,99,101,115,115,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111>>}],[]},{code,[],[<<123,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,95,105,110,102,111,44,32,71,67,73,110,102,111,125>>]}]},{dd,[],[{p,[],[{code,[],[<<71,67,73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,100,101,116,97,105,108,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32>>,{code,[],[<<71,67,73,110,102,111>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,70,111,114,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,101,97,99,104,32,105,116,101,109,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]}]},<<32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,103,114,111,117,112,95,108,101,97,100,101,114,44,32,71,114,111,117,112,76,101,97,100,101,114,125>>]}]},{dd,[],[{p,[],[{code,[],[<<71,114,111,117,112,76,101,97,100,101,114>>]},<<32,105,115,32,116,104,101,32,103,114,111,117,112,32,108,101,97,100,101,114,32,102,111,114,32,116,104,101,32,73,47,79,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,119,111,114,100,115,32,111,102,32,116,104,101,32,121,111,117,110,103,101,115,116,32,104,101,97,112,32,103,101,110,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,103,101,110,101,114,97,116,105,111,110,32,105,110,99,108,117,100,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,44,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,99,104,97,110,103,101,115,46>>]}]},{dt,[],[{code,[],[<<123,105,110,105,116,105,97,108,95,99,97,108,108,44,32,123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<44,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,105,110,105,116,105,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,119,105,116,104,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,115,112,97,119,110,101,100,46>>]}]},{dt,[],[{code,[],[<<123,108,105,110,107,115,44,32,80,105,100,115,65,110,100,80,111,114,116,115,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,105,100,115,65,110,100,80,111,114,116,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,97,110,100,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,119,105,116,104,32,112,114,111,99,101,115,115,101,115,32,111,114,32,112,111,114,116,115,32,116,111,32,119,104,105,99,104,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,108,105,110,107,46>>]}]},{dt,[],[{code,[],[<<123,108,97,115,116,95,99,97,108,108,115,44,32,102,97,108,115,101,124,67,97,108,108,115,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,110,111,116,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,51>>]}]},<<41,46,32,73,102,32,99,97,108,108,32,115,97,118,105,110,103,32,105,115,32,97,99,116,105,118,101,44,32,97,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,44,32,105,110,32,119,104,105,99,104,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,99,97,108,108,101,100,46>>]}]},{dt,[],[{code,[],[<<123,109,101,109,111,114,121,44,32,83,105,122,101,125>>]}]},{dd,[],[{a,[{id,<<112,114,111,99,101,115,115,95,105,110,102,111,95,109,101,109,111,114,121>>}],[]},{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,99,97,108,108,32,115,116,97,99,107,44,32,104,101,97,112,44,32,97,110,100,32,105,110,116,101,114,110,97,108,32,115,116,114,117,99,116,117,114,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,108,101,110,44,32,77,101,115,115,97,103,101,81,117,101,117,101,76,101,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,101,115,115,97,103,101,81,117,101,117,101,76,101,110>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,109,101,115,115,97,103,101,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<77,101,115,115,97,103,101,81,117,101,117,101>>]},<<32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,116,101,109,32>>,{code,[],[<<109,101,115,115,97,103,101,115>>]},<<32,40,115,101,101,32,98,101,108,111,119,41,46>>]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,115,44,32,77,101,115,115,97,103,101,81,117,101,117,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,101,115,115,97,103,101,81,117,101,117,101>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,109,101,115,115,97,103,101,115,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,44,32,119,104,105,99,104,32,104,97,118,101,32,110,111,116,32,121,101,116,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,105,110,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,105,110,66,105,110,86,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,101,100,95,98,121,44,32,77,111,110,105,116,111,114,101,100,66,121,125>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,105,100,101,110,116,105,102,105,101,114,115,32,102,111,114,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,44,32,112,111,114,116,115,32,97,110,100,32,78,73,70,32,114,101,115,111,117,114,99,101,115,44,32,116,104,97,116,32,97,114,101,32,109,111,110,105,116,111,114,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,115,44,32,77,111,110,105,116,111,114,115,125>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,115,32,40,115,116,97,114,116,101,100,32,98,121,32>>,{code,[],[<<109,111,110,105,116,111,114,47,50>>]},<<41,32,116,104,97,116,32,97,114,101,32,97,99,116,105,118,101,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,70,111,114,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,111,114,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,32,98,121,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,101,32,108,105,115,116,32,99,111,110,115,105,115,116,115,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,112,114,111,99,101,115,115,44,32,80,105,100,125>>]}]},{dd,[],[<<80,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,105,100,46>>]},{dt,[],[{code,[],[<<123,112,114,111,99,101,115,115,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125>>]}]},{dd,[],[<<76,111,99,97,108,32,111,114,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,46>>]},{dt,[],[{code,[],[<<123,112,111,114,116,44,32,80,111,114,116,73,100,125>>]}]},{dd,[],[<<76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,112,111,114,116,32,105,100,46>>]},{dt,[],[{code,[],[<<123,112,111,114,116,44,32,123,82,101,103,78,97,109,101,44,32,78,111,100,101,125,125>>]}]},{dd,[],[<<76,111,99,97,108,32,112,111,114,116,32,105,115,32,109,111,110,105,116,111,114,101,100,32,98,121,32,110,97,109,101,46,32,80,108,101,97,115,101,32,110,111,116,101,44,32,116,104,97,116,32,114,101,109,111,116,101,32,112,111,114,116,32,109,111,110,105,116,111,114,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,115,111,32>>,{code,[],[<<78,111,100,101>>]},<<32,119,105,108,108,32,97,108,119,97,121,115,32,98,101,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,110,97,109,101,46>>]}]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125>>]}]},{dd,[],[{p,[],[{code,[],[<<77,81,68>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<32,111,114,32>>,{code,[],[<<111,110,95,104,101,97,112>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<76,101,118,101,108>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,100,117,99,116,105,111,110,115,44,32,78,117,109,98,101,114,125>>]}]},{dd,[],[{p,[],[{code,[],[<<78,117,109,98,101,114>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,114,101,100,117,99,116,105,111,110,115,32,101,120,101,99,117,116,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,114,101,103,105,115,116,101,114,101,100,95,110,97,109,101,44,32,65,116,111,109,125>>]}]},{dd,[],[{p,[],[{code,[],[<<65,116,111,109>>]},<<32,105,115,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,32,110,97,109,101,46,32,73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,110,111,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,116,104,105,115,32,116,117,112,108,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46>>]}]},{dt,[],[{code,[],[<<123,115,101,113,117,101,110,116,105,97,108,95,116,114,97,99,101,95,116,111,107,101,110,44,32,91,93,32,124,32,83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,101,113,117,101,110,116,105,97,108,84,114,97,99,101,84,111,107,101,110>>]},<<32,105,115,32,116,104,101,32,115,101,113,117,101,110,116,105,97,108,32,116,114,97,99,101,32,116,111,107,101,110,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,115,116,97,99,107,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,115,116,97,99,107,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46>>]}]},{dt,[],[{code,[],[<<123,115,116,97,116,117,115,44,32,83,116,97,116,117,115,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,116,97,116,117,115>>]},<<32,105,115,32,116,104,101,32,115,116,97,116,117,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,97,110,100,32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{ul,[],[{li,[],[{code,[],[<<101,120,105,116,105,110,103>>]}]},{li,[],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,110,103>>]}]},{li,[],[{code,[],[<<119,97,105,116,105,110,103>>]},<<32,40,102,111,114,32,97,32,109,101,115,115,97,103,101,41>>]},{li,[],[{code,[],[<<114,117,110,110,105,110,103>>]}]},{li,[],[{code,[],[<<114,117,110,110,97,98,108,101>>]},<<32,40,114,101,97,100,121,32,116,111,32,114,117,110,44,32,98,117,116,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,105,115,32,114,117,110,110,105,110,103,41>>]},{li,[],[{code,[],[<<115,117,115,112,101,110,100,101,100>>]},<<32,40,115,117,115,112,101,110,100,101,100,32,111,110,32,97,32,34,98,117,115,121,34,32,112,111,114,116,32,111,114,32,98,121,32,116,104,101,32,66,73,70,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49,44,50>>]},<<41>>]}]}]},{dt,[],[{code,[],[<<123,115,117,115,112,101,110,100,105,110,103,44,32,83,117,115,112,101,110,100,101,101,76,105,115,116,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101,76,105,115,116>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,83,117,115,112,101,110,100,101,101,44,32,65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,44,32,79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,125>>]},<<32,116,117,112,108,101,115,46,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,101,101,110,44,32,111,114,32,105,115,32,116,111,32,98,101,44,32,115,117,115,112,101,110,100,101,100,32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<32,116,104,114,111,117,103,104,32,116,104,101,32,66,73,70,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>]}]},<<46>>]},{p,[],[{code,[],[<<65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46,32>>,{code,[],[<<79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,110,111,116,32,121,101,116,32,99,111,109,112,108,101,116,101,100,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,115,32,115,101,110,116,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<44,32,116,104,97,116,32,105,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48>>]},<<44,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,99,117,114,114,101,110,116,108,121,32,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116,32,61,47,61,32,48>>]},<<44,32,111,112,116,105,111,110,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<32,104,97,115,32,98,101,101,110,32,117,115,101,100,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,101,101,32,104,97,115,32,110,111,116,32,121,101,116,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<65,99,116,105,118,101,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<79,117,116,115,116,97,110,100,105,110,103,83,117,115,112,101,110,100,67,111,117,110,116>>]},<<32,97,114,101,32,110,111,116,32,116,104,101,32,116,111,116,97,108,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<44,32,111,110,108,121,32,116,104,101,32,112,97,114,116,115,32,99,111,110,116,114,105,98,117,116,101,100,32,98,121,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]},{dt,[],[{a,[{id,<<112,114,111,99,101,115,115,95,105,110,102,111,95,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<123,116,111,116,97,108,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<83,105,122,101>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,44,32,111,102,32,97,108,108,32,104,101,97,112,32,102,114,97,103,109,101,110,116,115,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,110,99,108,117,100,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,115,116,97,99,107,32,97,110,100,32,97,110,121,32,117,110,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112,46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,99,101,44,32,73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115,125>>]}]},{dd,[],[{p,[],[{code,[],[<<73,110,116,101,114,110,97,108,84,114,97,99,101,70,108,97,103,115>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,105,110,116,101,114,110,97,108,32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32>>,{code,[],[<<73,110,102,111,84,117,112,108,101>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,112,95,101,120,105,116,44,32,66,111,111,108,101,97,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<66,111,111,108,101,97,110>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,32,115,117,112,112,111,114,116,32,97,108,108,32,116,104,101,115,101,32>>,{code,[],[<<73,116,101,109>>]},<<115,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<73,116,101,109>>]},<<32,105,115,32,97,110,32,105,110,118,97,108,105,100,32,105,116,101,109,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,52,50,57>>,signature => [{attribute,{2545,2},spec,{{process_info,2},[{type,{2545,19},bounded_fun,[{type,{2545,19},'fun',[{type,{2545,19},product,[{var,{2545,20},'Pid'},{var,{2545,25},'Item'}]},{type,{2546,27},union,[{var,{2546,27},'InfoTuple'},{type,{2546,39},nil,[]},{atom,{2546,44},undefined}]}]},[{type,{2547,7},constraint,[{atom,{2547,7},is_subtype},[{var,{2547,7},'Pid'},{type,{2547,14},pid,[]}]]},{type,{2548,7},constraint,[{atom,{2548,7},is_subtype},[{var,{2548,7},'Item'},{user_type,{2548,15},process_info_item,[]}]]},{type,{2549,7},constraint,[{atom,{2549,7},is_subtype},[{var,{2549,7},'InfoTuple'},{user_type,{2549,20},process_info_result_item,[]}]]}]]},{type,{2550,19},bounded_fun,[{type,{2550,19},'fun',[{type,{2550,19},product,[{var,{2550,20},'Pid'},{var,{2550,25},'ItemList'}]},{type,{2550,38},union,[{var,{2550,38},'InfoTupleList'},{type,{2550,54},nil,[]},{atom,{2550,59},undefined}]}]},[{type,{2551,7},constraint,[{atom,{2551,7},is_subtype},[{var,{2551,7},'Pid'},{type,{2551,14},pid,[]}]]},{type,{2552,7},constraint,[{atom,{2552,7},is_subtype},[{var,{2552,7},'ItemList'},{type,{2552,19},list,[{var,{2552,20},'Item'}]}]]},{type,{2553,7},constraint,[{atom,{2553,7},is_subtype},[{var,{2553,7},'Item'},{user_type,{2553,15},process_info_item,[]}]]},{type,{2554,7},constraint,[{atom,{2554,7},is_subtype},[{var,{2554,7},'InfoTupleList'},{type,{2554,24},list,[{var,{2554,25},'InfoTuple'}]}]]},{type,{2555,7},constraint,[{atom,{2555,7},is_subtype},[{var,{2555,7},'InfoTuple'},{user_type,{2555,20},process_info_result_item,[]}]]}]]}]}}]}},{{function,processes,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1773}],[<<112,114,111,99,101,115,115,101,115,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,110,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,32,101,120,105,115,116,115,44,32,98,117,116,32,105,115,32,110,111,116,32,97,108,105,118,101,46,32,84,104,97,116,32,105,115,44,32>>,{code,[],[<<105,115,95,112,114,111,99,101,115,115,95,97,108,105,118,101,47,49>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,102,111,114,32,97,110,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,44,32,98,117,116,32,105,116,115,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<112,114,111,99,101,115,115,101,115,47,48>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,112,114,111,99,101,115,115,101,115,40,41,46,10,91,60,48,46,48,46,48,62,44,60,48,46,50,46,48,62,44,60,48,46,52,46,48,62,44,60,48,46,53,46,48,62,44,60,48,46,55,46,48,62,44,60,48,46,56,46,48,62,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,55,50>>,signature => [{attribute,{1773,2},spec,{{processes,0},[{type,{1773,16},'fun',[{type,{1773,16},product,[]},{type,{1773,22},list,[{type,{1773,23},pid,[]}]}]}]}}]}},{{function,purge_module,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1778}],[<<112,117,114,103,101,95,109,111,100,117,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,109,111,118,101,115,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46,32,66,101,102,111,114,101,32,116,104,105,115,32,66,73,70,32,105,115,32,117,115,101,100,44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,104,101,99,107,95,112,114,111,99,101,115,115,95,99,111,100,101,47,50>>]}]},<<32,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,116,111,32,99,104,101,99,107,32,116,104,97,116,32,110,111,32,112,114,111,99,101,115,115,101,115,32,101,120,101,99,117,116,101,32,111,108,100,32,99,111,100,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,116,104,101,32,99,111,100,101,32,115,101,114,118,101,114,32,40,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,100,101,40,51,41>>]}]},<<41,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,101,108,115,101,119,104,101,114,101,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,40,69,114,108,97,110,103,47,79,84,80,32,49,57,41,44,32,97,110,121,32,108,105,110,103,101,114,105,110,103,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,115,116,105,108,108,32,101,120,101,99,117,116,101,32,116,104,101,32,111,108,100,32,99,111,100,101,32,105,115,32,107,105,108,108,101,100,32,98,121,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,73,110,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,105,110,99,111,114,114,101,99,116,32,117,115,101,32,99,111,117,108,100,32,99,97,117,115,101,32,109,117,99,104,32,109,111,114,101,32,102,97,116,97,108,32,102,97,105,108,117,114,101,115,44,32,108,105,107,101,32,101,109,117,108,97,116,111,114,32,99,114,97,115,104,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,111,108,100,32,99,111,100,101,32,102,111,114,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,55,56,57>>,signature => [{attribute,{1778,2},spec,{{purge_module,1},[{type,{1778,19},bounded_fun,[{type,{1778,19},'fun',[{type,{1778,19},product,[{var,{1778,20},'Module'}]},{atom,{1778,31},true}]},[{type,{1779,7},constraint,[{atom,{1779,7},is_subtype},[{var,{1779,7},'Module'},{type,{1779,17},atom,[]}]]}]]}]}}]}},{{function,put,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1792}],[<<112,117,116,47,50>>],#{<<101,110>> => [{p,[],[<<65,100,100,115,32,97,32,110,101,119,32>>,{code,[],[<<75,101,121>>]},<<32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,44,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<86,97,108>>]},<<44,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46,32,73,102,32>>,{code,[],[<<75,101,121>>]},<<32,101,120,105,115,116,115,44,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,105,115,32,100,101,108,101,116,101,100,32,97,110,100,32,114,101,112,108,97,99,101,100,32,98,121,32>>,{code,[],[<<86,97,108>>]},<<44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,46,32,84,104,101,32,97,118,101,114,97,103,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,79,40>>,{code,[],[<<49>>]},<<41,32,97,110,100,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,116,105,109,101,32,99,111,109,112,108,101,120,105,116,121,32,105,115,32,79,40>>,{code,[],[<<78>>]},<<41,44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,105,116,101,109,115,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,100,105,99,116,105,111,110,97,114,121,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,88,32,61,32,112,117,116,40,110,97,109,101,44,32,119,97,108,114,117,115,41,44,32,89,32,61,32,112,117,116,40,110,97,109,101,44,32,99,97,114,112,101,110,116,101,114,41,44,10,90,32,61,32,103,101,116,40,110,97,109,101,41,44,10,123,88,44,32,89,44,32,90,125,46,10,123,117,110,100,101,102,105,110,101,100,44,119,97,108,114,117,115,44,99,97,114,112,101,110,116,101,114,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,118,97,108,117,101,115,32,115,116,111,114,101,100,32,119,104,101,110,32>>,{code,[],[<<112,117,116>>]},<<32,105,115,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,116,104,101,32,115,99,111,112,101,32,111,102,32,97,32>>,{code,[],[<<99,97,116,99,104>>]},<<32,97,114,101,32,110,111,116,32,114,101,116,114,97,99,116,101,100,32,105,102,32,97,32>>,{code,[],[<<116,104,114,111,119>>]},<<32,105,115,32,101,118,97,108,117,97,116,101,100,44,32,111,114,32,105,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,49,52>>,signature => [{attribute,{1792,2},spec,{{put,2},[{type,{1792,10},bounded_fun,[{type,{1792,10},'fun',[{type,{1792,10},product,[{var,{1792,11},'Key'},{var,{1792,16},'Val'}]},{type,{1792,24},term,[]}]},[{type,{1793,7},constraint,[{atom,{1793,7},is_subtype},[{var,{1793,7},'Key'},{type,{1793,14},term,[]}]]},{type,{1794,7},constraint,[{atom,{1794,7},is_subtype},[{var,{1794,7},'Val'},{type,{1794,14},term,[]}]]}]]}]}}]}},{{function,raise,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1799}],[<<114,97,105,115,101,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<114,97,105,115,101,95,115,116,97,99,107,116,114,97,99,101>>}],[]}]},{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,99,108,97,115,115,44,32,114,101,97,115,111,110,44,32,97,110,100,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,116,114,97,99,101,32,40>>,{em,[],[<<115,116,97,99,107,116,114,97,99,101>>]},<<41,46>>]},{p,[],[{code,[],[<<67,108,97,115,115>>]},<<32,105,115,32>>,{code,[],[<<101,114,114,111,114>>]},<<44,32>>,{code,[],[<<101,120,105,116>>]},<<44,32,111,114,32>>,{code,[],[<<116,104,114,111,119>>]},<<46,32,83,111,44,32,105,102,32,105,116,32,119,101,114,101,32,110,111,116,32,102,111,114,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,44,32>>,{code,[],[<<101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,67,108,97,115,115,40,82,101,97,115,111,110,41>>]},<<32,40,103,105,118,101,110,32,116,104,97,116,32>>,{code,[],[<<67,108,97,115,115>>]},<<32,105,115,32,97,32,118,97,108,105,100,32,99,108,97,115,115,41,46>>]},{p,[],[{code,[],[<<82,101,97,115,111,110>>]},<<32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,46>>]},{p,[],[{code,[],[<<83,116,97,99,107,116,114,97,99,101>>]},<<32,105,115,32,97,32,108,105,115,116,32,97,115,32,112,114,111,118,105,100,101,100,32,105,110,32,97,32,116,114,121,45,99,97,116,99,104,32,99,108,97,117,115,101,46>>]},{pre,[],[{code,[],[<<116,114,121,10,32,32,32,32,46,46,46,10,99,97,116,99,104,32,67,108,97,115,115,58,82,101,97,115,111,110,58,83,116,97,99,107,116,114,97,99,101,32,45,62,10,32,32,32,32,46,46,46,10,101,110,100>>]}]},{p,[],[<<84,104,97,116,32,105,115,44,32,97,32,108,105,115,116,32,111,102,32,102,111,117,114,45,116,117,112,108,101,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,32,124,32,65,114,103,115,44,32,69,120,116,114,97,73,110,102,111,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<32,97,110,100,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,97,114,101,32,97,116,111,109,115,44,32,97,110,100,32,116,104,101,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,97,114,105,116,121,32,111,114,32,97,110,32,97,114,103,117,109,101,110,116,32,108,105,115,116,46,32,84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,99,97,110,32,97,108,115,111,32,99,111,110,116,97,105,110,32>>,{code,[],[<<123,70,117,110,44,32,65,114,103,115,44,32,69,120,116,114,97,73,110,102,111,125>>]},<<32,116,117,112,108,101,115,44,32,119,104,101,114,101,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,102,117,110,32,97,110,100,32>>,{code,[],[<<65,114,103,115>>]},<<32,105,115,32,97,110,32,97,114,103,117,109,101,110,116,32,108,105,115,116,46>>]},{p,[],[<<69,108,101,109,101,110,116,32>>,{code,[],[<<69,120,116,114,97,73,110,102,111>>]},<<32,97,116,32,116,104,101,32,101,110,100,32,105,115,32,111,112,116,105,111,110,97,108,46,32,79,109,105,116,116,105,110,103,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,46>>]},{p,[],[<<84,104,101,32,115,116,97,99,107,116,114,97,99,101,32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,115,116,97,99,107,116,114,97,99,101,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,59,32,105,116,32,105,115,32,116,114,117,110,99,97,116,101,100,32,116,111,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,120,105,109,117,109,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,46>>]},{p,[],[<<65,115,32,101,118,97,108,117,97,116,105,110,103,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,111,32,116,101,114,109,105,110,97,116,101,44,32,105,116,32,104,97,115,32,110,111,32,114,101,116,117,114,110,32,118,97,108,117,101,32,117,110,108,101,115,115,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,105,110,118,97,108,105,100,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{em,[],[<<114,101,116,117,114,110,115,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110>>]},<<32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,114,101,116,117,114,110,44,32,121,111,117,32,99,97,110,32,99,97,108,108,32>>,{code,[],[<<101,114,114,111,114,40,101,114,108,97,110,103,58,114,97,105,115,101,40,67,108,97,115,115,44,32,82,101,97,115,111,110,44,32,83,116,97,99,107,116,114,97,99,101,41,41>>]},<<32,97,110,100,32,104,111,112,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,101,120,99,101,112,116,105,111,110,115,32,108,97,116,101,114,46>>]},{p,[],[<<83,101,101,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,110,117,97,108,32,97,98,111,117,116,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,101,120,99,101,112,116,105,111,110,32,99,108,97,115,115,101,115,32,97,110,100,32,104,111,119,32,116,111,32,99,97,116,99,104,32,101,120,99,101,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,52,48>>,signature => [{attribute,{1799,2},spec,{{erlang,raise,3},[{type,{1799,19},bounded_fun,[{type,{1799,19},'fun',[{type,{1799,19},product,[{var,{1799,20},'Class'},{var,{1799,27},'Reason'},{var,{1799,35},'Stacktrace'}]},{atom,{1799,50},badarg}]},[{type,{1800,7},constraint,[{atom,{1800,7},is_subtype},[{var,{1800,7},'Class'},{type,{1800,16},union,[{atom,{1800,16},error},{atom,{1800,26},exit},{atom,{1800,35},throw}]}]]},{type,{1801,7},constraint,[{atom,{1801,7},is_subtype},[{var,{1801,7},'Reason'},{type,{1801,17},term,[]}]]},{type,{1802,7},constraint,[{atom,{1802,7},is_subtype},[{var,{1802,7},'Stacktrace'},{type,{1802,21},union,[{user_type,{1802,21},raise_stacktrace,[]},{user_type,{1802,42},stacktrace,[]}]}]]}]]}]}}]}},{{function,read_timer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1807}],[<<114,101,97,100,95,116,105,109,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,97,100,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,40,84,105,109,101,114,82,101,102,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,56,57,48>>,signature => [{attribute,{1807,2},spec,{{erlang,read_timer,1},[{type,{1807,24},bounded_fun,[{type,{1807,24},'fun',[{type,{1807,24},product,[{var,{1807,25},'TimerRef'}]},{var,{1807,38},'Result'}]},[{type,{1808,7},constraint,[{atom,{1808,7},is_subtype},[{var,{1808,7},'TimerRef'},{type,{1808,19},reference,[]}]]},{type,{1809,7},constraint,[{atom,{1809,7},is_subtype},[{var,{1809,7},'Time'},{type,{1809,15},non_neg_integer,[]}]]},{type,{1810,7},constraint,[{atom,{1810,7},is_subtype},[{var,{1810,7},'Result'},{type,{1810,17},union,[{var,{1810,17},'Time'},{atom,{1810,24},false}]}]]}]]}]}}]}},{{function,read_timer,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1816}],[<<114,101,97,100,95,116,105,109,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,97,32,116,105,109,101,114,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,32,98,121,32,101,105,116,104,101,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114>>]}]},<<46,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,105,100,101,110,116,105,102,105,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,119,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,66,73,70,32,116,104,97,116,32,99,114,101,97,116,101,100,32,116,104,101,32,116,105,109,101,114,46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110,115>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,115,121,110,99,44,32,65,115,121,110,99,125>>]}]},{dd,[],[{p,[],[<<65,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,115,116,97,116,101,32,105,110,102,111,114,109,97,116,105,111,110,46,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,32,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114>>]},<<46,32,87,104,101,110,32>>,{code,[],[<<65,115,121,110,99>>]},<<32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<44,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114>>]},<<32,115,101,110,100,115,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,114,101,113,117,101,115,116,32,102,111,114,32,116,104,101,32,115,116,97,116,101,32,105,110,102,111,114,109,97,116,105,111,110,32,116,111,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,44,32,97,110,100,32,116,104,101,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<46,32,65,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,114,101,97,100,95,116,105,109,101,114,44,32,84,105,109,101,114,82,101,102,44,32,82,101,115,117,108,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114>>]},<<32,119,104,101,110,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,46>>]}]}]},{p,[],[<<77,111,114,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,44,32,105,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32,108,101,102,116,32,117,110,116,105,108,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<82,101,115,117,108,116>>]},<<32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<44,32,97,32,116,105,109,101,114,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,99,111,117,108,100,32,110,111,116,32,98,101,32,102,111,117,110,100,46,32,84,104,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,114,32,104,97,100,32,101,120,112,105,114,101,100,44,32,111,114,32,98,101,101,110,32,99,97,110,99,101,108,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32>>,{code,[],[<<84,105,109,101,114,82,101,102>>]},<<32,110,101,118,101,114,32,104,97,115,32,99,111,114,114,101,115,112,111,110,100,101,100,32,116,111,32,97,32,116,105,109,101,114,46,32,69,118,101,110,32,105,102,32,116,104,101,32,116,105,109,101,114,32,104,97,115,32,101,120,112,105,114,101,100,44,32,105,116,32,100,111,101,115,32,110,111,116,32,116,101,108,108,32,121,111,117,32,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,32,104,97,115,32,97,114,114,105,118,101,100,32,97,116,32,105,116,115,32,100,101,115,116,105,110,97,116,105,111,110,32,121,101,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,104,97,116,32,109,97,110,97,103,101,115,32,116,104,101,32,116,105,109,101,114,32,99,97,110,32,98,101,32,99,111,45,108,111,99,97,116,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32,115,99,104,101,100,117,108,101,114,32,116,104,97,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32,73,102,32,115,111,44,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,116,105,109,101,114,32,115,101,114,118,105,99,101,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,116,105,109,101,32,116,104,97,110,32,105,102,32,105,116,32,105,115,32,108,111,99,97,116,101,100,32,108,111,99,97,108,108,121,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,105,110,32,97,32,99,114,105,116,105,99,97,108,32,112,97,116,104,44,32,97,110,100,32,99,97,110,32,100,111,32,111,116,104,101,114,32,116,104,105,110,103,115,32,119,104,105,108,101,32,119,97,105,116,105,110,103,32,102,111,114,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,44,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,116,114,117,101,125>>]},<<46,32,73,102,32,117,115,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,97,115,121,110,99,44,32,102,97,108,115,101,125>>]},<<44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,112,101,114,102,111,114,109,101,100,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,48,48>>,signature => [{attribute,{1816,2},spec,{{erlang,read_timer,2},[{type,{1816,24},bounded_fun,[{type,{1816,24},'fun',[{type,{1816,24},product,[{var,{1816,25},'TimerRef'},{var,{1816,35},'Options'}]},{type,{1816,47},union,[{var,{1816,47},'Result'},{atom,{1816,56},ok}]}]},[{type,{1817,7},constraint,[{atom,{1817,7},is_subtype},[{var,{1817,7},'TimerRef'},{type,{1817,19},reference,[]}]]},{type,{1818,7},constraint,[{atom,{1818,7},is_subtype},[{var,{1818,7},'Async'},{type,{1818,16},boolean,[]}]]},{type,{1819,7},constraint,[{atom,{1819,7},is_subtype},[{var,{1819,7},'Option'},{type,{1819,17},tuple,[{atom,{1819,18},async},{var,{1819,25},'Async'}]}]]},{type,{1820,7},constraint,[{atom,{1820,7},is_subtype},[{var,{1820,7},'Options'},{type,{1820,18},list,[{var,{1820,19},'Option'}]}]]},{type,{1821,7},constraint,[{atom,{1821,7},is_subtype},[{var,{1821,7},'Time'},{type,{1821,15},non_neg_integer,[]}]]},{type,{1822,7},constraint,[{atom,{1822,7},is_subtype},[{var,{1822,7},'Result'},{type,{1822,17},union,[{var,{1822,17},'Time'},{atom,{1822,24},false}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,ref_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1828}],[<<114,101,102,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,116,101,120,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32>>,{code,[],[<<82,101,102>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,97,110,100,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,97,112,112,108,105,99,97,116,105,111,110,32,112,114,111,103,114,97,109,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,53,54>>,signature => [{attribute,{1828,2},spec,{{ref_to_list,1},[{type,{1828,18},bounded_fun,[{type,{1828,18},'fun',[{type,{1828,18},product,[{var,{1828,19},'Ref'}]},{type,{1828,27},string,[]}]},[{type,{1829,7},constraint,[{atom,{1829,7},is_subtype},[{var,{1829,7},'Ref'},{type,{1829,14},reference,[]}]]}]]}]}}]}},{{function,register,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1834}],[<<114,101,103,105,115,116,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,103,105,115,116,101,114,115,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,119,105,116,104,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,105,110,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<110,97,109,101,32,114,101,103,105,115,116,114,121>>]}]},<<46,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<44,32,119,104,105,99,104,32,109,117,115,116,32,98,101,32,97,110,32,97,116,111,109,44,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,112,105,100,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,105,110,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32,40>>,{code,[],[<<82,101,103,78,97,109,101,32,33,32,77,101,115,115,97,103,101>>]},<<41,32,97,110,100,32,109,111,115,116,32,111,116,104,101,114,32,66,73,70,115,32,116,104,97,116,32,116,97,107,101,32,97,32,112,105,100,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,115,32,97,115,32,97,110,32,97,114,103,117,109,101,110,116,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,114,101,103,105,115,116,101,114,40,100,98,44,32,80,105,100,41,46,10,116,114,117,101>>]}]},{p,[],[<<84,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,118,105,115,105,98,108,101,45,114,101,115,111,117,114,99,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<68,105,114,101,99,116,108,121,32,86,105,115,105,98,108,101,32,69,114,108,97,110,103,32,82,101,115,111,117,114,99,101>>]},<<32,97,110,100,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,117,110,114,101,103,105,115,116,101,114,101,100,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,120,105,115,116,105,110,103,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,105,115,32,97,108,114,101,97,100,121,32,105,110,32,117,115,101,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,115,32,97,108,114,101,97,100,121,32,114,101,103,105,115,116,101,114,101,100,32,40,97,108,114,101,97,100,121,32,104,97,115,32,97,32,110,97,109,101,41,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,54,57,54,57>>,signature => [{attribute,{1834,2},spec,{{register,2},[{type,{1834,15},bounded_fun,[{type,{1834,15},'fun',[{type,{1834,15},product,[{var,{1834,16},'RegName'},{var,{1834,25},'PidOrPort'}]},{atom,{1834,39},true}]},[{type,{1835,7},constraint,[{atom,{1835,7},is_subtype},[{var,{1835,7},'RegName'},{type,{1835,18},atom,[]}]]},{type,{1836,7},constraint,[{atom,{1836,7},is_subtype},[{var,{1836,7},'PidOrPort'},{type,{1836,20},union,[{type,{1836,20},port,[]},{type,{1836,29},pid,[]}]}]]}]]}]}}]}},{{function,registered,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1841}],[<<114,101,103,105,115,116,101,114,101,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,110,97,109,101,115,32,116,104,97,116,32,104,97,118,101,32,98,101,101,110,32,114,101,103,105,115,116,101,114,101,100,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,103,105,115,116,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,103,105,115,116,101,114,47,50>>]}]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,114,101,103,105,115,116,101,114,101,100,40,41,46,10,91,99,111,100,101,95,115,101,114,118,101,114,44,32,102,105,108,101,95,115,101,114,118,101,114,44,32,105,110,105,116,44,32,117,115,101,114,44,32,109,121,95,100,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,48,48,53>>,signature => [{attribute,{1841,2},spec,{{registered,0},[{type,{1841,17},bounded_fun,[{type,{1841,17},'fun',[{type,{1841,17},product,[]},{type,{1841,23},list,[{var,{1841,24},'RegName'}]}]},[{type,{1842,7},constraint,[{atom,{1842,7},is_subtype},[{var,{1842,7},'RegName'},{type,{1842,18},atom,[]}]]}]]}]}}]}},{{function,resume_process,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1847}],[<<114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49>>],#{<<101,110>> => [{p,[],[<<68,101,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,116,104,114,111,117,103,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>]}]},<<32,98,121,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]},<<46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,114,101,97,99,104,101,115,32,122,101,114,111,44,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,114,101,115,117,109,101,100,44,32,116,104,97,116,32,105,115,44,32,105,116,115,32,115,116,97,116,101,32,105,115,32,99,104,97,110,103,101,100,32,102,114,111,109,32,115,117,115,112,101,110,100,101,100,32,105,110,116,111,32,116,104,101,32,115,116,97,116,101,32,105,116,32,104,97,100,32,98,101,102,111,114,101,32,105,116,32,119,97,115,32,115,117,115,112,101,110,100,101,100,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49>>]},<<32,104,97,100,32,110,111,116,32,112,114,101,118,105,111,117,115,108,121,32,105,110,99,114,101,97,115,101,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,48,49,56>>,signature => [{attribute,{1847,2},spec,{{erlang,resume_process,1},[{type,{1847,28},bounded_fun,[{type,{1847,28},'fun',[{type,{1847,28},product,[{var,{1847,29},'Suspendee'}]},{atom,{1847,43},true}]},[{type,{1848,7},constraint,[{atom,{1848,7},is_subtype},[{var,{1848,7},'Suspendee'},{type,{1848,20},pid,[]}]]}]]}]}}]}},{{function,round,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1854}],[<<114,111,117,110,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,98,121,32,114,111,117,110,100,105,110,103,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,111,117,110,100,40,52,50,46,49,41,46,10,52,50>>]}]},{pre,[],[{code,[],[<<114,111,117,110,100,40,53,46,53,41,46,10,54>>]}]},{pre,[],[{code,[],[<<114,111,117,110,100,40,45,53,46,53,41,46,10,45,54>>]}]},{pre,[],[{code,[],[<<114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]}]},{p,[],[<<73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<114,111,117,110,100,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41>>]},<<32,101,118,97,108,117,97,116,101,115,32,116,111,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]},<<46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48>>]},<<32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,32,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,32,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,48,53,57>>,signature => [{attribute,{1854,2},spec,{{round,1},[{type,{1854,12},bounded_fun,[{type,{1854,12},'fun',[{type,{1854,12},product,[{var,{1854,13},'Number'}]},{type,{1854,24},integer,[]}]},[{type,{1855,7},constraint,[{atom,{1855,7},is_subtype},[{var,{1855,7},'Number'},{type,{1855,17},number,[]}]]}]]}]}}]}},{{function,self,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1861}],[<<115,101,108,102,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,101,108,102,40,41,46,10,60,48,46,50,54,46,48,62>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,48,57,48>>,signature => [{attribute,{1861,2},spec,{{self,0},[{type,{1861,11},'fun',[{type,{1861,11},product,[]},{type,{1861,17},pid,[]}]}]}}]}},{{function,send,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2559}],[<<115,101,110,100,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<83,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<77,115,103>>]},<<46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,117,115,105,110,103,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,115,101,110,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,101,110,100,32,111,112,101,114,97,116,111,114>>]},<<58,32>>,{code,[],[<<68,101,115,116,32,33,32,77,115,103>>]},<<46>>]},{p,[],[{code,[],[<<68,101,115,116>>]},<<32,99,97,110,32,98,101,32,97,32,114,101,109,111,116,101,32,111,114,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,97,110,32,97,108,105,97,115,44,32,97,32,40,108,111,99,97,108,41,32,112,111,114,116,44,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,44,32,111,114,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,82,101,103,78,97,109,101,44,32,78,111,100,101,125>>]},<<32,102,111,114,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,97,116,32,97,110,111,116,104,101,114,32,110,111,100,101,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,102,97,105,108,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,114,117,110,45,116,105,109,101,32,101,114,114,111,114,32,105,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,110,32,97,116,111,109,32,110,97,109,101,44,32,98,117,116,32,116,104,105,115,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,32,84,104,105,115,32,105,115,32,116,104,101,32,111,110,108,121,32,99,97,115,101,32,119,104,101,110,32>>,{code,[],[<<115,101,110,100>>]},<<32,102,97,105,108,115,32,102,111,114,32,97,110,32,117,110,114,101,97,99,104,97,98,108,101,32,100,101,115,116,105,110,97,116,105,111,110,32>>,{code,[],[<<68,101,115,116>>]},<<32,40,111,102,32,99,111,114,114,101,99,116,32,116,121,112,101,41,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,48,51>>,signature => [{attribute,{2559,2},spec,{{erlang,send,2},[{type,{2559,18},bounded_fun,[{type,{2559,18},'fun',[{type,{2559,18},product,[{var,{2559,19},'Dest'},{var,{2559,25},'Msg'}]},{var,{2559,33},'Msg'}]},[{type,{2560,7},constraint,[{atom,{2560,7},is_subtype},[{var,{2560,7},'Dest'},{user_type,{2560,15},dst,[]}]]},{type,{2561,7},constraint,[{atom,{2561,7},is_subtype},[{var,{2561,7},'Msg'},{type,{2561,14},term,[]}]]}]]}]}}]}},{{function,send,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2565}],[<<115,101,110,100,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<69,105,116,104,101,114,32,115,101,110,100,115,32,97,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<44,32,111,114,32,100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101,32,98,117,116,32,114,101,116,117,114,110,115,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,40,115,101,101,32,98,101,108,111,119,41,46,32,79,116,104,101,114,119,105,115,101,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,47,50>>]}]},<<46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,101,100,32,101,120,112,108,97,110,97,116,105,111,110,32,97,110,100,32,119,97,114,110,105,110,103,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51>>]}]},<<46>>]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<110,111,115,117,115,112,101,110,100>>]}]},{dd,[],[<<73,102,32,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,32,116,111,32,100,111,32,116,104,101,32,115,101,110,100,44,32>>,{code,[],[<<110,111,115,117,115,112,101,110,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]},{dt,[],[{code,[],[<<110,111,99,111,110,110,101,99,116>>]}]},{dd,[],[<<73,102,32,116,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,110,111,100,101,32,119,111,117,108,100,32,104,97,118,101,32,116,111,32,98,101,32,97,117,116,111,45,99,111,110,110,101,99,116,101,100,32,116,111,32,100,111,32,116,104,101,32,115,101,110,100,44,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<65,115,32,119,105,116,104,32>>,{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50,44,51>>]},<<58,32,117,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,50,51>>,signature => [{attribute,{2565,2},spec,{{erlang,send,3},[{type,{2565,18},bounded_fun,[{type,{2565,18},'fun',[{type,{2565,18},product,[{var,{2565,19},'Dest'},{var,{2565,25},'Msg'},{var,{2565,30},'Options'}]},{var,{2565,42},'Res'}]},[{type,{2566,7},constraint,[{atom,{2566,7},is_subtype},[{var,{2566,7},'Dest'},{user_type,{2566,15},dst,[]}]]},{type,{2567,7},constraint,[{atom,{2567,7},is_subtype},[{var,{2567,7},'Msg'},{type,{2567,14},term,[]}]]},{type,{2568,7},constraint,[{atom,{2568,7},is_subtype},[{var,{2568,7},'Options'},{type,{2568,18},list,[{type,{2568,19},union,[{atom,{2568,19},nosuspend},{atom,{2568,31},noconnect}]}]}]]},{type,{2569,7},constraint,[{atom,{2569,7},is_subtype},[{var,{2569,7},'Res'},{type,{2569,14},union,[{atom,{2569,14},ok},{atom,{2569,19},nosuspend},{atom,{2569,31},noconnect}]}]]}]]}]}}]}},{{function,send_after,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1866}],[<<115,101,110,100,95,97,102,116,101,114,47,51>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,53,53>>,signature => [{attribute,{1866,2},spec,{{erlang,send_after,3},[{type,{1866,24},bounded_fun,[{type,{1866,24},'fun',[{type,{1866,24},product,[{var,{1866,25},'Time'},{var,{1866,31},'Dest'},{var,{1866,37},'Msg'}]},{var,{1866,45},'TimerRef'}]},[{type,{1867,7},constraint,[{atom,{1867,7},is_subtype},[{var,{1867,7},'Time'},{type,{1867,15},non_neg_integer,[]}]]},{type,{1868,7},constraint,[{atom,{1868,7},is_subtype},[{var,{1868,7},'Dest'},{type,{1868,15},union,[{type,{1868,15},pid,[]},{type,{1868,23},atom,[]}]}]]},{type,{1869,7},constraint,[{atom,{1869,7},is_subtype},[{var,{1869,7},'Msg'},{type,{1869,14},term,[]}]]},{type,{1870,7},constraint,[{atom,{1870,7},is_subtype},[{var,{1870,7},'TimerRef'},{type,{1870,19},reference,[]}]]}]]}]}}]}},{{function,send_after,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1876}],[<<115,101,110,100,95,97,102,116,101,114,47,52>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,101,115,116>>]},<<46,32,65,112,97,114,116,32,102,114,111,109,32,116,104,101,32,102,111,114,109,97,116,32,111,102,32,116,104,101,32,116,105,109,101,45,111,117,116,32,109,101,115,115,97,103,101,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,111,114,107,115,32,101,120,97,99,116,108,121,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,47,52>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,54,54>>,signature => [{attribute,{1876,2},spec,{{erlang,send_after,4},[{type,{1876,24},bounded_fun,[{type,{1876,24},'fun',[{type,{1876,24},product,[{var,{1876,25},'Time'},{var,{1876,31},'Dest'},{var,{1876,37},'Msg'},{var,{1876,42},'Options'}]},{var,{1876,54},'TimerRef'}]},[{type,{1877,7},constraint,[{atom,{1877,7},is_subtype},[{var,{1877,7},'Time'},{type,{1877,15},integer,[]}]]},{type,{1878,7},constraint,[{atom,{1878,7},is_subtype},[{var,{1878,7},'Dest'},{type,{1878,15},union,[{type,{1878,15},pid,[]},{type,{1878,23},atom,[]}]}]]},{type,{1879,7},constraint,[{atom,{1879,7},is_subtype},[{var,{1879,7},'Msg'},{type,{1879,14},term,[]}]]},{type,{1880,7},constraint,[{atom,{1880,7},is_subtype},[{var,{1880,7},'Options'},{type,{1880,18},list,[{var,{1880,19},'Option'}]}]]},{type,{1881,7},constraint,[{atom,{1881,7},is_subtype},[{var,{1881,7},'Abs'},{type,{1881,14},boolean,[]}]]},{type,{1882,7},constraint,[{atom,{1882,7},is_subtype},[{var,{1882,7},'Option'},{type,{1882,17},tuple,[{atom,{1882,18},abs},{var,{1882,23},'Abs'}]}]]},{type,{1883,7},constraint,[{atom,{1883,7},is_subtype},[{var,{1883,7},'TimerRef'},{type,{1883,19},reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,send_nosuspend,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3478}],[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,93,41>>]}]},<<44,32,98,117,116,32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,115,101,110,116,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,109,101,115,115,97,103,101,32,119,97,115,32,110,111,116,32,115,101,110,116,32,98,101,99,97,117,115,101,32,116,104,101,32,115,101,110,100,101,114,32,119,111,117,108,100,32,104,97,118,101,32,104,97,100,32,116,111,32,98,101,32,115,117,115,112,101,110,100,101,100,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,115,101,110,100,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,97,110,32,117,110,114,101,108,105,97,98,108,101,32,114,101,109,111,116,101,32,110,111,100,101,32,119,105,116,104,111,117,116,32,101,118,101,114,32,98,108,111,99,107,105,110,103,32,116,104,101,32,115,101,110,100,105,110,103,32,40,69,114,108,97,110,103,41,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,40,117,115,117,97,108,108,121,32,110,111,116,32,97,32,114,101,97,108,32,69,114,108,97,110,103,32,110,111,100,101,44,32,98,117,116,32,97,32,110,111,100,101,32,119,114,105,116,116,101,110,32,105,110,32,67,32,111,114,32,74,97,118,97,41,32,105,115,32,111,118,101,114,108,111,97,100,101,100,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32>>,{em,[],[<<100,111,101,115,32,110,111,116,32,115,101,110,100,32,116,104,101,32,109,101,115,115,97,103,101>>]},<<32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<84,104,101,32,115,97,109,101,32,111,99,99,117,114,115,32,105,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,108,111,99,97,108,32,112,111,114,116,32,116,104,97,116,32,105,115,32,98,117,115,121,46,32,70,111,114,32,97,108,108,32,111,116,104,101,114,32,100,101,115,116,105,110,97,116,105,111,110,115,32,40,97,108,108,111,119,101,100,32,102,111,114,32,116,104,101,32,111,114,100,105,110,97,114,121,32,115,101,110,100,32,111,112,101,114,97,116,111,114,32>>,{code,[],[<<39,33,39>>]},<<41,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,115,101,110,100,115,32,116,104,101,32,109,101,115,115,97,103,101,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,32,119,104,101,114,101,32,97,32,112,114,111,99,101,115,115,32,99,111,109,109,117,110,105,99,97,116,101,115,32,119,105,116,104,32,69,114,108,97,110,103,32,110,111,100,101,115,32,116,104,97,116,32,99,97,110,32,100,105,115,97,112,112,101,97,114,32,119,105,116,104,111,117,116,32,97,110,121,32,116,114,97,99,101,44,32,99,97,117,115,105,110,103,32,116,104,101,32,84,67,80,32,98,117,102,102,101,114,115,32,97,110,100,32,116,104,101,32,100,114,105,118,101,114,115,32,113,117,101,117,101,32,116,111,32,98,101,32,111,118,101,114,45,102,117,108,108,32,98,101,102,111,114,101,32,116,104,101,32,110,111,100,101,32,105,115,32,115,104,117,116,32,100,111,119,110,32,40,98,101,99,97,117,115,101,32,111,102,32,116,105,99,107,32,116,105,109,101,45,111,117,116,115,41,32,98,121,32>>,{code,[],[<<110,101,116,95,107,101,114,110,101,108>>]},<<46,32,84,104,101,32,110,111,114,109,97,108,32,114,101,97,99,116,105,111,110,32,116,111,32,116,97,107,101,32,119,104,101,110,32,116,104,105,115,32,111,99,99,117,114,115,32,105,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,112,114,101,109,97,116,117,114,101,32,115,104,117,116,100,111,119,110,32,111,102,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,105,103,110,111,114,105,110,103,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,111,117,108,100,32,114,101,115,117,108,116,32,105,110,32,97,110,32>>,{em,[],[<<117,110,114,101,108,105,97,98,108,101>>]},<<32,109,101,115,115,97,103,101,32,112,97,115,115,105,110,103,44,32,119,104,105,99,104,32,105,115,32,99,111,110,116,114,97,100,105,99,116,111,114,121,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,105,110,103,32,109,111,100,101,108,46,32,84,104,101,32,109,101,115,115,97,103,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,115,101,110,116,32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{p,[],[<<73,110,32,109,97,110,121,32,115,121,115,116,101,109,115,44,32,116,114,97,110,115,105,101,110,116,32,115,116,97,116,101,115,32,111,102,32,111,118,101,114,108,111,97,100,101,100,32,113,117,101,117,101,115,32,97,114,101,32,110,111,114,109,97,108,46,32,65,108,116,104,111,117,103,104,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,100,111,101,115,32,110,111,116,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,110,111,110,45,114,101,115,112,111,110,115,105,118,101,44,32,105,116,32,99,111,117,108,100,32,98,101,32,97,32,116,101,109,112,111,114,97,114,121,32,111,118,101,114,108,111,97,100,46,32,65,108,115,111,44,32,97,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32>>,{code,[],[<<116,114,117,101>>]},<<32,100,111,101,115,32,111,110,108,121,32,109,101,97,110,32,116,104,97,116,32,116,104,101,32,109,101,115,115,97,103,101,32,99,97,110,32,98,101,32,115,101,110,116,32,111,110,32,116,104,101,32,40,84,67,80,41,32,99,104,97,110,110,101,108,32,119,105,116,104,111,117,116,32,98,108,111,99,107,105,110,103,59,32,116,104,101,32,109,101,115,115,97,103,101,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,97,114,114,105,118,101,32,97,116,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,46,32,70,111,114,32,97,32,100,105,115,99,111,110,110,101,99,116,101,100,32,110,111,110,45,114,101,115,112,111,110,115,105,118,101,32,110,111,100,101,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,40,109,105,109,105,99,115,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,111,112,101,114,97,116,111,114,32>>,{code,[],[<<33>>]},<<41,46,32,84,104,101,32,101,120,112,101,99,116,101,100,32,98,101,104,97,118,105,111,114,32,97,110,100,32,116,104,101,32,97,99,116,105,111,110,115,32,116,111,32,116,97,107,101,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,97,114,101,32,97,112,112,108,105,99,97,116,105,111,110,45,32,97,110,100,32,104,97,114,100,119,97,114,101,45,115,112,101,99,105,102,105,99,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,49,55,57>>,signature => [{attribute,{3478,2},spec,{{erlang,send_nosuspend,2},[{type,{3478,28},bounded_fun,[{type,{3478,28},'fun',[{type,{3478,28},product,[{var,{3478,29},'Dest'},{var,{3478,35},'Msg'}]},{type,{3478,43},boolean,[]}]},[{type,{3479,7},constraint,[{atom,{3479,7},is_subtype},[{var,{3479,7},'Dest'},{user_type,{3479,15},dst,[]}]]},{type,{3480,7},constraint,[{atom,{3480,7},is_subtype},[{var,{3480,7},'Msg'},{type,{3480,14},term,[]}]]}]]}]}}]}},{{function,send_nosuspend,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3488}],[<<115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,115,116>>}],[]}]},{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,40,68,101,115,116,44,32,77,115,103,44,32,91,110,111,115,117,115,112,101,110,100,32,124,32,79,112,116,105,111,110,115,93,41>>]}]},<<44,32,98,117,116,32,119,105,116,104,32,97,32,66,111,111,108,101,97,110,32,114,101,116,117,114,110,32,118,97,108,117,101,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,98,101,104,97,118,101,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,110,111,115,117,115,112,101,110,100,47,50>>]}]},<<44,32,98,117,116,32,116,97,107,101,115,32,97,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,44,32,97,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46,32,84,104,101,32,111,110,108,121,32,111,112,116,105,111,110,32,105,115,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<44,32,119,104,105,99,104,32,109,97,107,101,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,114,101,109,111,116,101,32,110,111,100,101,32,105,115,32,110,111,116,32,99,117,114,114,101,110,116,108,121,32,114,101,97,99,104,97,98,108,101,32,98,121,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,32,105,115,32,116,111,32,116,114,121,32,116,111,32,99,111,110,110,101,99,116,32,116,111,32,116,104,101,32,110,111,100,101,44,32,119,104,105,99,104,32,99,97,110,32,115,116,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,32,100,117,114,105,110,103,32,97,32,115,104,111,114,116,32,112,101,114,105,111,100,46,32,84,104,101,32,117,115,101,32,111,102,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,98,101,32,115,117,114,101,32,110,111,116,32,116,111,32,103,101,116,32,116,104,101,32,115,108,105,103,104,116,101,115,116,32,100,101,108,97,121,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,111,32,97,32,114,101,109,111,116,101,32,112,114,111,99,101,115,115,46,32,84,104,105,115,32,105,115,32,101,115,112,101,99,105,97,108,108,121,32,117,115,101,102,117,108,32,119,104,101,110,32,99,111,109,109,117,110,105,99,97,116,105,110,103,32,119,105,116,104,32,110,111,100,101,115,32,116,104,97,116,32,101,120,112,101,99,116,32,116,111,32,97,108,119,97,121,115,32,98,101,32,116,104,101,32,99,111,110,110,101,99,116,105,110,103,32,112,97,114,116,32,40,116,104,97,116,32,105,115,44,32,110,111,100,101,115,32,119,114,105,116,116,101,110,32,105,110,32,67,32,111,114,32,74,97,118,97,41,46>>]},{p,[],[<<87,104,101,110,101,118,101,114,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,40,101,105,116,104,101,114,32,119,104,101,110,32,97,32,115,117,115,112,101,110,100,32,119,111,117,108,100,32,111,99,99,117,114,32,111,114,32,119,104,101,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116>>]},<<32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,97,110,100,32,116,104,101,32,110,111,100,101,32,119,97,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,110,110,101,99,116,101,100,41,44,32,116,104,101,32,109,101,115,115,97,103,101,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32>>,{em,[],[<<110,111,116>>]},<<32,116,111,32,104,97,118,101,32,98,101,101,110,32,115,101,110,116,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<85,115,101,32,119,105,116,104,32,101,120,116,114,101,109,101,32,99,97,114,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,50,57>>,signature => [{attribute,{3488,2},spec,{{erlang,send_nosuspend,3},[{type,{3488,28},bounded_fun,[{type,{3488,28},'fun',[{type,{3488,28},product,[{var,{3488,29},'Dest'},{var,{3488,35},'Msg'},{var,{3488,40},'Options'}]},{type,{3488,52},boolean,[]}]},[{type,{3489,7},constraint,[{atom,{3489,7},is_subtype},[{var,{3489,7},'Dest'},{user_type,{3489,15},dst,[]}]]},{type,{3490,7},constraint,[{atom,{3490,7},is_subtype},[{var,{3490,7},'Msg'},{type,{3490,14},term,[]}]]},{type,{3491,7},constraint,[{atom,{3491,7},is_subtype},[{var,{3491,7},'Options'},{type,{3491,18},list,[{atom,{3491,19},noconnect}]}]]}]]}]}}]}},{{function,set_cookie,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3797}],[<<115,101,116,95,99,111,111,107,105,101,47,49>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,116,111,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<67,111,111,107,105,101>>]},<<44,32,119,104,105,99,104,32,105,115,32,97,108,115,111,32,116,104,101,32,99,111,111,107,105,101,32,102,111,114,32,97,108,108,32,110,111,100,101,115,32,116,104,97,116,32,104,97,118,101,32,110,111,32,101,120,112,108,105,99,105,116,32,99,111,111,107,105,101,32,115,101,116,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,116,95,99,111,111,107,105,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,101,116,95,99,111,111,107,105,101,47,50>>]}]},<<32>>,{code,[],[<<67,111,111,107,105,101>>]},<<32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,105,115,116,114,105,98,117,116,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<68,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,41,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<102,117,110,99,116,105,111,110,95,99,108,97,117,115,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,54,50>>,signature => [{attribute,{3797,2},spec,{{erlang,set_cookie,1},[{type,{3797,24},bounded_fun,[{type,{3797,24},'fun',[{type,{3797,24},product,[{var,{3797,25},'Cookie'}]},{atom,{3797,36},true}]},[{type,{3798,7},constraint,[{atom,{3798,7},is_subtype},[{var,{3798,7},'Cookie'},{type,{3798,17},atom,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,49>>}},{{function,set_cookie,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3804}],[<<115,101,116,95,99,111,111,107,105,101,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,109,97,103,105,99,32,99,111,111,107,105,101,32,102,111,114,32>>,{code,[],[<<78,111,100,101>>]},<<32,116,111,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<67,111,111,107,105,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,115,101,116,115,32,116,104,101,32,99,111,111,107,105,101,32,111,102,32,97,108,108,32,111,116,104,101,114,32,110,111,100,101,115,32,40,116,104,97,116,32,104,97,118,101,32,110,111,32,101,120,112,108,105,99,105,116,32,99,111,111,107,105,101,32,115,101,116,32,119,105,116,104,32,116,104,105,115,32,102,117,110,99,116,105,111,110,41,32,116,111,32>>,{code,[],[<<67,111,111,107,105,101>>]},<<32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,105,115,116,114,105,98,117,116,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<68,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,41,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<102,117,110,99,116,105,111,110,95,99,108,97,117,115,101>>]},<<32,105,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,55,57>>,signature => [{attribute,{3804,2},spec,{{erlang,set_cookie,2},[{type,{3804,24},bounded_fun,[{type,{3804,24},'fun',[{type,{3804,24},product,[{var,{3804,25},'Node'},{var,{3804,31},'Cookie'}]},{atom,{3804,42},true}]},[{type,{3805,7},constraint,[{atom,{3805,7},is_subtype},[{var,{3805,7},'Node'},{type,{3805,15},node,[]}]]},{type,{3806,7},constraint,[{atom,{3806,7},is_subtype},[{var,{3806,7},'Cookie'},{type,{3806,17},atom,[]}]]}]]}]}}]}},{{function,setelement,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2586}],[<<115,101,116,101,108,101,109,101,110,116,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,116,104,97,116,32,105,115,32,97,32,99,111,112,121,32,111,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<84,117,112,108,101,49>>]},<<32,119,105,116,104,32,116,104,101,32,101,108,101,109,101,110,116,32,115,112,101,99,105,102,105,101,100,32,98,121,32,105,110,116,101,103,101,114,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<73,110,100,101,120>>]},<<32,40,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,101,108,101,109,101,110,116,32,119,105,116,104,32,105,110,100,101,120,32,49,41,32,114,101,112,108,97,99,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<86,97,108,117,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,101,116,101,108,101,109,101,110,116,40,50,44,32,123,49,48,44,32,103,114,101,101,110,44,32,98,111,116,116,108,101,115,125,44,32,114,101,100,41,46,10,123,49,48,44,114,101,100,44,98,111,116,116,108,101,115,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,50,57,54>>,signature => [{attribute,{2586,2},spec,{{setelement,3},[{type,{2586,17},bounded_fun,[{type,{2586,17},'fun',[{type,{2586,17},product,[{var,{2586,18},'Index'},{var,{2586,25},'Tuple1'},{var,{2586,33},'Value'}]},{var,{2586,43},'Tuple2'}]},[{type,{2587,7},constraint,[{atom,{2587,7},is_subtype},[{var,{2587,7},'Index'},{type,{2587,16},pos_integer,[]}]]},{type,{2588,7},constraint,[{atom,{2588,7},is_subtype},[{var,{2588,7},'Tuple1'},{type,{2588,17},tuple,any}]]},{type,{2589,7},constraint,[{atom,{2589,7},is_subtype},[{var,{2589,7},'Tuple2'},{type,{2589,17},tuple,any}]]},{type,{2590,7},constraint,[{atom,{2590,7},is_subtype},[{var,{2590,7},'Value'},{type,{2590,16},term,[]}]]}]]}]}}]}},{{function,size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1937}],[<<115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32,97,32,116,117,112,108,101,32,111,114,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,110,32,97,32,98,105,110,97,114,121,32,111,114,32,98,105,116,115,116,114,105,110,103,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51,10,62,32,115,105,122,101,40,60,60,49,49,44,32,50,50,44,32,51,51,62,62,41,46,10,51>>]}]},{p,[],[<<70,111,114,32,98,105,116,115,116,114,105,110,103,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32,98,121,116,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,105,116,115,32,105,110,32,116,104,101,32,98,105,116,115,116,114,105,110,103,32,105,115,32,110,111,116,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,44,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,105,115,32,114,111,117,110,100,101,100,32>>,{em,[],[<<100,111,119,110>>]},<<46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,117,112,108,101,95,115,105,122,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,117,112,108,101,95,115,105,122,101,47,49>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,121,116,101,95,115,105,122,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,121,116,101,95,115,105,122,101,47,49>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,116,95,115,105,122,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,116,95,115,105,122,101,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,51,49,51>>,signature => [{attribute,{1937,2},spec,{{size,1},[{type,{1937,11},bounded_fun,[{type,{1937,11},'fun',[{type,{1937,11},product,[{var,{1937,12},'Item'}]},{type,{1937,21},non_neg_integer,[]}]},[{type,{1938,7},constraint,[{atom,{1938,7},is_subtype},[{var,{1938,7},'Item'},{type,{1938,15},union,[{type,{1938,15},tuple,any},{type,{1938,25},binary,[]}]}]]}]]}]}}]}},{{function,spawn,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2972}],[<<115,112,97,119,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,51,51,54>>,signature => [{attribute,{2972,2},spec,{{spawn,1},[{type,{2972,12},bounded_fun,[{type,{2972,12},'fun',[{type,{2972,12},product,[{var,{2972,13},'Fun'}]},{type,{2972,21},pid,[]}]},[{type,{2973,7},constraint,[{atom,{2973,7},is_subtype},[{var,{2973,7},'Fun'},{type,{2973,14},function,[]}]]}]]}]}}]}},{{function,spawn,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2981}],[<<115,112,97,119,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,51,52,55>>,signature => [{attribute,{2981,2},spec,{{spawn,2},[{type,{2981,12},bounded_fun,[{type,{2981,12},'fun',[{type,{2981,12},product,[{var,{2981,13},'Node'},{var,{2981,19},'Fun'}]},{type,{2981,27},pid,[]}]},[{type,{2982,7},constraint,[{atom,{2982,7},is_subtype},[{var,{2982,7},'Node'},{type,{2982,15},node,[]}]]},{type,{2983,7},constraint,[{atom,{2983,7},is_subtype},[{var,{2983,7},'Fun'},{type,{2983,14},function,[]}]]}]]}]}}]}},{{function,spawn,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1943}],[<<115,112,97,119,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46>>]},{p,[],[{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114,58,117,110,100,101,102,105,110,101,100,95,102,117,110,99,116,105,111,110,40,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,103,115,41>>]},<<32,105,115,32,101,118,97,108,117,97,116,101,100,32,98,121,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,105,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,40,119,104,101,114,101,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32>>,{code,[],[<<65,114,103,115>>]},<<41,46,32,84,104,101,32,101,114,114,111,114,32,104,97,110,100,108,101,114,32,99,97,110,32,98,101,32,114,101,100,101,102,105,110,101,100,32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<41,46,32,73,102,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,111,114,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,100,101,102,105,110,101,100,32,116,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<101,114,114,111,114,95,104,97,110,100,108,101,114>>]},<<32,97,110,100,32,105,116,115,32,114,101,112,108,97,99,101,109,101,110,116,32,105,115,32,117,110,100,101,102,105,110,101,100,44,32,97,32,102,97,105,108,117,114,101,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<117,110,100,101,102>>]},<<32,111,99,99,117,114,115,46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,112,97,119,110,40,115,112,101,101,100,44,32,114,101,103,117,108,97,116,111,114,44,32,91,104,105,103,104,95,115,112,101,101,100,44,32,116,104,105,110,95,99,117,116,93,41,46,10,60,48,46,49,51,46,49,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,51,54,49>>,signature => [{attribute,{1943,2},spec,{{spawn,3},[{type,{1943,12},bounded_fun,[{type,{1943,12},'fun',[{type,{1943,12},product,[{var,{1943,13},'Module'},{var,{1943,21},'Function'},{var,{1943,31},'Args'}]},{type,{1943,40},pid,[]}]},[{type,{1944,7},constraint,[{atom,{1944,7},is_subtype},[{var,{1944,7},'Module'},{type,{1944,17},module,[]}]]},{type,{1945,7},constraint,[{atom,{1945,7},is_subtype},[{var,{1945,7},'Function'},{type,{1945,19},atom,[]}]]},{type,{1946,7},constraint,[{atom,{1946,7},is_subtype},[{var,{1946,7},'Args'},{type,{1946,15},list,[{type,{1946,16},term,[]}]}]]}]]}]}}]}},{{function,spawn,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3110}],[<<115,112,97,119,110,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,51,56,54>>,signature => [{attribute,{3110,2},spec,{{spawn,4},[{type,{3110,12},bounded_fun,[{type,{3110,12},'fun',[{type,{3110,12},product,[{var,{3110,13},'Node'},{var,{3110,19},'Module'},{var,{3110,27},'Function'},{var,{3110,37},'Args'}]},{type,{3110,46},pid,[]}]},[{type,{3111,7},constraint,[{atom,{3111,7},is_subtype},[{var,{3111,7},'Node'},{type,{3111,15},node,[]}]]},{type,{3112,7},constraint,[{atom,{3112,7},is_subtype},[{var,{3112,7},'Module'},{type,{3112,17},module,[]}]]},{type,{3113,7},constraint,[{atom,{3113,7},is_subtype},[{var,{3113,7},'Function'},{type,{3113,19},atom,[]}]]},{type,{3114,7},constraint,[{atom,{3114,7},is_subtype},[{var,{3114,7},'Args'},{type,{3114,15},list,[{type,{3114,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_link,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2993}],[<<115,112,97,119,110,95,108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,48,49>>,signature => [{attribute,{2993,2},spec,{{spawn_link,1},[{type,{2993,17},bounded_fun,[{type,{2993,17},'fun',[{type,{2993,17},product,[{var,{2993,18},'Fun'}]},{type,{2993,26},pid,[]}]},[{type,{2994,7},constraint,[{atom,{2994,7},is_subtype},[{var,{2994,7},'Fun'},{type,{2994,14},function,[]}]]}]]}]}}]}},{{function,spawn_link,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3002}],[<<115,112,97,119,110,95,108,105,110,107,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,49,53>>,signature => [{attribute,{3002,2},spec,{{spawn_link,2},[{type,{3002,17},bounded_fun,[{type,{3002,17},'fun',[{type,{3002,17},product,[{var,{3002,18},'Node'},{var,{3002,24},'Fun'}]},{type,{3002,32},pid,[]}]},[{type,{3003,7},constraint,[{atom,{3003,7},is_subtype},[{var,{3003,7},'Node'},{type,{3003,15},node,[]}]]},{type,{3004,7},constraint,[{atom,{3004,7},is_subtype},[{var,{3004,7},'Fun'},{type,{3004,14},function,[]}]]}]]}]}}]}},{{function,spawn_link,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1951}],[<<115,112,97,119,110,95,108,105,110,107,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,51,50>>,signature => [{attribute,{1951,2},spec,{{spawn_link,3},[{type,{1951,17},bounded_fun,[{type,{1951,17},'fun',[{type,{1951,17},product,[{var,{1951,18},'Module'},{var,{1951,26},'Function'},{var,{1951,36},'Args'}]},{type,{1951,45},pid,[]}]},[{type,{1952,7},constraint,[{atom,{1952,7},is_subtype},[{var,{1952,7},'Module'},{type,{1952,17},module,[]}]]},{type,{1953,7},constraint,[{atom,{1953,7},is_subtype},[{var,{1953,7},'Function'},{type,{1953,19},atom,[]}]]},{type,{1954,7},constraint,[{atom,{1954,7},is_subtype},[{var,{1954,7},'Args'},{type,{1954,15},list,[{type,{1954,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_link,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3132}],[<<115,112,97,119,110,95,108,105,110,107,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,108,105,110,107,32,105,115,32,99,114,101,97,116,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,97,116,111,109,105,99,97,108,108,121,46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,52,54>>,signature => [{attribute,{3132,2},spec,{{spawn_link,4},[{type,{3132,17},bounded_fun,[{type,{3132,17},'fun',[{type,{3132,17},product,[{var,{3132,18},'Node'},{var,{3132,24},'Module'},{var,{3132,32},'Function'},{var,{3132,42},'Args'}]},{type,{3132,51},pid,[]}]},[{type,{3133,7},constraint,[{atom,{3133,7},is_subtype},[{var,{3133,7},'Node'},{type,{3133,15},node,[]}]]},{type,{3134,7},constraint,[{atom,{3134,7},is_subtype},[{var,{3134,7},'Module'},{type,{3134,17},module,[]}]]},{type,{3135,7},constraint,[{atom,{3135,7},is_subtype},[{var,{3135,7},'Function'},{type,{3135,19},atom,[]}]]},{type,{3136,7},constraint,[{atom,{3136,7},is_subtype},[{var,{3136,7},'Args'},{type,{3136,15},list,[{type,{3136,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3016}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,32,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,54,52>>,signature => [{attribute,{3016,2},spec,{{spawn_monitor,1},[{type,{3016,20},bounded_fun,[{type,{3016,20},'fun',[{type,{3016,20},product,[{var,{3016,21},'Fun'}]},{type,{3016,29},tuple,[{type,{3016,30},pid,[]},{type,{3016,37},reference,[]}]}]},[{type,{3017,7},constraint,[{atom,{3017,7},is_subtype},[{var,{3017,7},'Fun'},{type,{3017,14},function,[]}]]}]]}]}}]}},{{function,spawn_monitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3023}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,44,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<44,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,97,32,109,111,110,105,116,111,114,32,99,114,101,97,116,101,100,32,116,111,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32>>,{code,[],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,41>>]},<<44,32,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,101,120,99,101,112,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,55,56>>,signature => [{attribute,{3023,2},spec,{{spawn_monitor,2},[{type,{3023,20},bounded_fun,[{type,{3023,20},'fun',[{type,{3023,20},product,[{var,{3023,21},'Node'},{var,{3023,27},'Fun'}]},{type,{3023,35},tuple,[{type,{3023,36},pid,[]},{type,{3023,43},reference,[]}]}]},[{type,{3024,7},constraint,[{atom,{3024,7},is_subtype},[{var,{3024,7},'Node'},{type,{3024,15},node,[]}]]},{type,{3025,7},constraint,[{atom,{3025,7},is_subtype},[{var,{3025,7},'Fun'},{type,{3025,14},function,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_monitor,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3037}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,51>>],#{<<101,110>> => [{p,[],[<<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46,32,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,52,57,53>>,signature => [{attribute,{3037,2},spec,{{spawn_monitor,3},[{type,{3037,20},bounded_fun,[{type,{3037,20},'fun',[{type,{3037,20},product,[{var,{3037,21},'Module'},{var,{3037,29},'Function'},{var,{3037,39},'Args'}]},{type,{3037,48},tuple,[{type,{3037,49},pid,[]},{type,{3037,56},reference,[]}]}]},[{type,{3038,7},constraint,[{atom,{3038,7},is_subtype},[{var,{3038,7},'Module'},{type,{3038,17},module,[]}]]},{type,{3039,7},constraint,[{atom,{3039,7},is_subtype},[{var,{3039,7},'Function'},{type,{3039,19},atom,[]}]]},{type,{3040,7},constraint,[{atom,{3040,7},is_subtype},[{var,{3040,7},'Args'},{type,{3040,15},list,[{type,{3040,16},term,[]}]}]]}]]}]}}]}},{{function,spawn_monitor,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3154}],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,47,52>>],#{<<101,110>> => [{p,[],[<<65,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32,116,104,101,32,110,111,100,101,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,84,104,101,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,32,97,116,32,116,104,101,32,115,97,109,101,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,97,110,100,32,97,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,100,105,115,116,114,105,98,117,116,101,100,32>>,{code,[],[<<115,112,97,119,110,95,109,111,110,105,116,111,114,40,41>>]},<<44,32,116,104,101,32,99,97,108,108,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,101,120,99,101,112,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,53,48,57>>,signature => [{attribute,{3154,2},spec,{{spawn_monitor,4},[{type,{3154,20},bounded_fun,[{type,{3154,20},'fun',[{type,{3154,20},product,[{var,{3154,21},'Node'},{var,{3154,27},'Module'},{var,{3154,35},'Function'},{var,{3154,45},'Args'}]},{type,{3154,54},tuple,[{type,{3154,55},pid,[]},{type,{3154,62},reference,[]}]}]},[{type,{3155,7},constraint,[{atom,{3155,7},is_subtype},[{var,{3155,7},'Node'},{type,{3155,15},node,[]}]]},{type,{3156,7},constraint,[{atom,{3156,7},is_subtype},[{var,{3156,7},'Module'},{type,{3156,17},module,[]}]]},{type,{3157,7},constraint,[{atom,{3157,7},is_subtype},[{var,{3157,7},'Function'},{type,{3157,19},atom,[]}]]},{type,{3158,7},constraint,[{atom,{3158,7},is_subtype},[{var,{3158,7},'Args'},{type,{3158,15},list,[{type,{3158,16},term,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_opt,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3067}],[<<115,112,97,119,110,95,111,112,116,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,32,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,53,50,54>>,signature => [{attribute,{3067,2},spec,{{spawn_opt,2},[{type,{3067,16},bounded_fun,[{type,{3067,16},'fun',[{type,{3067,16},product,[{var,{3067,17},'Fun'},{var,{3067,22},'Options'}]},{type,{3067,34},union,[{type,{3067,34},pid,[]},{type,{3067,42},tuple,[{type,{3067,43},pid,[]},{type,{3067,50},reference,[]}]}]}]},[{type,{3068,7},constraint,[{atom,{3068,7},is_subtype},[{var,{3068,7},'Fun'},{type,{3068,14},function,[]}]]},{type,{3069,7},constraint,[{atom,{3069,7},is_subtype},[{var,{3069,7},'Options'},{type,{3069,18},list,[{user_type,{3069,19},spawn_opt_option,[]}]}]]}]]}]}}]}},{{function,spawn_opt,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3082}],[<<115,112,97,119,110,95,111,112,116,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<70,117,110>>]},<<32,116,111,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]},{p,[],[<<86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,53,52,52>>,signature => [{attribute,{3082,2},spec,{{spawn_opt,3},[{type,{3082,16},bounded_fun,[{type,{3082,16},'fun',[{type,{3082,16},product,[{var,{3082,17},'Node'},{var,{3082,23},'Fun'},{var,{3082,28},'Options'}]},{type,{3082,40},union,[{type,{3082,40},pid,[]},{type,{3082,48},tuple,[{type,{3082,49},pid,[]},{type,{3082,56},reference,[]}]}]}]},[{type,{3083,7},constraint,[{atom,{3083,7},is_subtype},[{var,{3083,7},'Node'},{type,{3083,15},node,[]}]]},{type,{3084,7},constraint,[{atom,{3084,7},is_subtype},[{var,{3084,7},'Fun'},{type,{3084,14},function,[]}]]},{type,{3085,7},constraint,[{atom,{3085,7},is_subtype},[{var,{3085,7},'Options'},{type,{3085,18},list,[{type,{3085,19},union,[{atom,{3085,19},monitor},{type,{3086,19},tuple,[{atom,{3086,20},monitor},{type,{3086,29},list,[{user_type,{3086,30},monitor_option,[]}]}]},{atom,{3087,19},link},{var,{3088,19},'OtherOption'}]}]}]]},{type,{3089,7},constraint,[{atom,{3089,7},is_subtype},[{var,{3089,7},'OtherOption'},{type,{3089,22},term,[]}]]}]]}]}}]}},{{function,spawn_opt,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3199}],[<<115,112,97,119,110,95,111,112,116,47,52>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{li,[{name,<<112,114,105,111,114,105,116,121,95,108,101,118,101,108>>}],[]},{li,[{name,<<115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<87,111,114,107,115,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,47,51>>]}]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,120,116,114,97,32,111,112,116,105,111,110,32,108,105,115,116,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,32,105,115,32,109,111,110,105,116,111,114,101,100,44,32,97,110,100,32,98,111,116,104,32,116,104,101,32,112,105,100,32,97,110,100,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,116,104,101,32,109,111,110,105,116,111,114,32,97,114,101,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,105,110,107>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,97,32,108,105,110,107,32,116,111,32,116,104,101,32,112,97,114,101,110,116,32,112,114,111,99,101,115,115,32,40,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,108,105,110,107,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,108,105,110,107,47,51>>]}]},<<32,100,111,101,115,41,46>>]}]},{dt,[],[{code,[],[<<109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,40,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41>>]}]},<<32,100,111,101,115,41,46,32,65,32>>,{code,[],[<<123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125>>]},<<32,116,117,112,108,101,32,119,105,108,108,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125>>]}]},{dd,[],[{p,[],[<<77,111,110,105,116,111,114,115,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,119,105,116,104,32,111,112,116,105,111,110,115,32,40,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41>>]}]},<<32,100,111,101,115,41,46,32,65,32>>,{code,[],[<<123,80,105,100,44,32,77,111,110,105,116,111,114,82,101,102,125>>]},<<32,116,117,112,108,101,32,119,105,108,108,32,98,101,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,32,111,102,32,106,117,115,116,32,97,32>>,{code,[],[<<80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,112,114,105,111,114,105,116,121,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,46,32,69,113,117,105,118,97,108,101,110,116,32,116,111,32,101,120,101,99,117,116,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]},<<32,105,110,32,116,104,101,32,115,116,97,114,116,32,102,117,110,99,116,105,111,110,32,111,102,32,116,104,101,32,110,101,119,32,112,114,111,99,101,115,115,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,112,114,105,111,114,105,116,121,32,105,115,32,115,101,116,32,98,101,102,111,114,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,115,32,115,101,108,101,99,116,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,105,111,114,105,116,105,101,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,78,117,109,98,101,114,125>>]}]},{dd,[],[{p,[],[<<85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,117,115,101,115,32,97,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,99,104,101,109,101,44,32,117,115,105,110,103,32,97,110,32,34,111,108,100,32,104,101,97,112,34,32,102,111,114,32,100,97,116,97,32,116,104,97,116,32,104,97,115,32,115,117,114,118,105,118,101,100,32,97,116,32,108,101,97,115,116,32,111,110,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,116,104,101,114,101,32,105,115,32,110,111,32,109,111,114,101,32,114,111,111,109,32,111,110,32,116,104,101,32,111,108,100,32,104,101,97,112,44,32,97,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46>>]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,103,101,110,101,114,97,116,105,111,110,97,108,32,99,111,108,108,101,99,116,105,111,110,115,32,98,101,102,111,114,101,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,44,32,101,118,101,110,32,105,102,32,116,104,101,114,101,32,105,115,32,114,111,111,109,32,111,110,32,116,104,101,32,111,108,100,32,104,101,97,112,46,32,83,101,116,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,116,111,32,122,101,114,111,32,100,105,115,97,98,108,101,115,32,116,104,101,32,103,101,110,101,114,97,108,32,99,111,108,108,101,99,116,105,111,110,32,97,108,103,111,114,105,116,104,109,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,108,105,118,101,32,100,97,116,97,32,105,115,32,99,111,112,105,101,100,32,97,116,32,101,118,101,114,121,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[<<65,32,102,101,119,32,99,97,115,101,115,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,116,111,32,99,104,97,110,103,101,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,110,111,32,108,111,110,103,101,114,32,117,115,101,100,32,97,114,101,32,116,111,32,98,101,32,116,104,114,111,119,110,32,97,119,97,121,32,97,115,32,115,111,111,110,32,97,115,32,112,111,115,115,105,98,108,101,46,32,40,83,101,116,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,122,101,114,111,46,41>>]}]},{li,[],[{p,[],[<<65,32,112,114,111,99,101,115,115,32,116,104,97,116,32,109,111,115,116,108,121,32,104,97,118,101,32,115,104,111,114,116,45,108,105,118,101,100,32,100,97,116,97,32,105,115,32,102,117,108,108,115,119,101,101,112,101,100,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,111,108,100,32,104,101,97,112,32,99,111,110,116,97,105,110,115,32,109,111,115,116,108,121,32,103,97,114,98,97,103,101,46,32,84,111,32,101,110,115,117,114,101,32,97,32,102,117,108,108,115,119,101,101,112,32,111,99,99,97,115,105,111,110,97,108,108,121,44,32,115,101,116,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,97,32,115,117,105,116,97,98,108,101,32,118,97,108,117,101,44,32,115,117,99,104,32,97,115,32,49,48,32,111,114,32,50,48,46>>]}]},{li,[],[<<73,110,32,101,109,98,101,100,100,101,100,32,115,121,115,116,101,109,115,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,97,109,111,117,110,116,32,111,102,32,82,65,77,32,97,110,100,32,110,111,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,44,32,121,111,117,32,109,105,103,104,116,32,119,97,110,116,32,116,111,32,112,114,101,115,101,114,118,101,32,109,101,109,111,114,121,32,98,121,32,115,101,116,116,105,110,103,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,116,111,32,122,101,114,111,46,32,40,84,104,101,32,118,97,108,117,101,32,99,97,110,32,98,101,32,115,101,116,32,103,108,111,98,97,108,108,121,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50>>]}]},<<46,41>>]}]}]},{dt,[],[{code,[],[<<123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46>>]},{p,[],[<<71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,32,97,110,100,32,115,108,111,119,32,100,111,119,110,32,116,104,101,32,115,121,115,116,101,109,32,98,101,99,97,117,115,101,32,111,102,32,119,111,114,115,101,32,100,97,116,97,32,108,111,99,97,108,105,116,121,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,32>>,{code,[],[<<83,105,122,101>>]},<<32,118,97,108,117,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,86,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<85,115,101,102,117,108,32,111,110,108,121,32,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,116,117,110,105,110,103,46,32,68,111,32,110,111,116,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,112,114,111,98,108,101,109,32,119,105,116,104,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,115,32,111,114,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,44,32,97,110,100,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,111,112,116,105,111,110,32,105,109,112,114,111,118,101,115,32,109,97,116,116,101,114,115,46>>]},{p,[],[<<71,105,118,101,115,32,97,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,44,32,105,110,32,119,111,114,100,115,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,118,97,108,117,101,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32,115,121,115,116,101,109,32,100,101,102,97,117,108,116,32,99,97,110,32,115,112,101,101,100,32,117,112,32,115,111,109,101,32,112,114,111,99,101,115,115,101,115,32,98,101,99,97,117,115,101,32,108,101,115,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,100,111,110,101,46,32,72,111,119,101,118,101,114,44,32,115,101,116,116,105,110,103,32,97,32,116,111,111,32,104,105,103,104,32,118,97,108,117,101,32,99,97,110,32,119,97,115,116,101,32,109,101,109,111,114,121,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,101,32,116,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,102,111,114,32,102,105,110,101,45,116,117,110,105,110,103,32,97,110,32,97,112,112,108,105,99,97,116,105,111,110,32,97,110,100,32,116,111,32,109,101,97,115,117,114,101,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,119,105,116,104,32,118,97,114,105,111,117,115,32>>,{code,[],[<<86,83,105,122,101>>]},<<32,118,97,108,117,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,46,32,84,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,83,105,122,101,41>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,46,32>>,{code,[],[<<77,81,68>>]},<<32,99,97,110,32,98,101,32,101,105,116,104,101,114,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<32,111,114,32>>,{code,[],[<<111,110,95,104,101,97,112>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,113,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,113,100>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,53,54,55>>,signature => [{attribute,{3199,2},spec,{{spawn_opt,4},[{type,{3199,16},bounded_fun,[{type,{3199,16},'fun',[{type,{3199,16},product,[{var,{3199,17},'Module'},{var,{3199,25},'Function'},{var,{3199,35},'Args'},{var,{3199,41},'Options'}]},{type,{3200,11},union,[{var,{3200,11},'Pid'},{type,{3200,17},tuple,[{var,{3200,18},'Pid'},{var,{3200,23},'MonitorRef'}]}]}]},[{type,{3201,7},constraint,[{atom,{3201,7},is_subtype},[{var,{3201,7},'Module'},{type,{3201,17},module,[]}]]},{type,{3202,7},constraint,[{atom,{3202,7},is_subtype},[{var,{3202,7},'Function'},{type,{3202,19},atom,[]}]]},{type,{3203,7},constraint,[{atom,{3203,7},is_subtype},[{var,{3203,7},'Args'},{type,{3203,15},list,[{type,{3203,16},term,[]}]}]]},{type,{3204,7},constraint,[{atom,{3204,7},is_subtype},[{var,{3204,7},'Options'},{type,{3204,18},list,[{user_type,{3204,19},spawn_opt_option,[]}]}]]},{type,{3205,7},constraint,[{atom,{3205,7},is_subtype},[{var,{3205,7},'Pid'},{type,{3205,14},pid,[]}]]},{type,{3206,7},constraint,[{atom,{3206,7},is_subtype},[{var,{3206,7},'MonitorRef'},{type,{3206,21},reference,[]}]]}]]}]}}]}},{{function,spawn_opt,5},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3211}],[<<115,112,97,119,110,95,111,112,116,47,53>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<32,111,110,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,73,102,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,97,32,117,115,101,108,101,115,115,32,112,105,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,116,104,101,114,119,105,115,101,32,119,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]},{p,[],[<<86,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,49,53>>,signature => [{attribute,{3211,2},spec,{{spawn_opt,5},[{type,{3211,16},bounded_fun,[{type,{3211,16},'fun',[{type,{3211,16},product,[{var,{3211,17},'Node'},{var,{3211,23},'Module'},{var,{3211,31},'Function'},{var,{3211,41},'Args'},{var,{3211,47},'Options'}]},{type,{3212,24},union,[{type,{3212,24},pid,[]},{type,{3212,32},tuple,[{type,{3212,33},pid,[]},{type,{3212,40},reference,[]}]}]}]},[{type,{3213,7},constraint,[{atom,{3213,7},is_subtype},[{var,{3213,7},'Node'},{type,{3213,15},node,[]}]]},{type,{3214,7},constraint,[{atom,{3214,7},is_subtype},[{var,{3214,7},'Module'},{type,{3214,17},module,[]}]]},{type,{3215,7},constraint,[{atom,{3215,7},is_subtype},[{var,{3215,7},'Function'},{type,{3215,19},atom,[]}]]},{type,{3216,7},constraint,[{atom,{3216,7},is_subtype},[{var,{3216,7},'Args'},{type,{3216,15},list,[{type,{3216,16},term,[]}]}]]},{type,{3217,7},constraint,[{atom,{3217,7},is_subtype},[{var,{3217,7},'Options'},{type,{3217,18},list,[{type,{3217,19},union,[{atom,{3217,19},monitor},{type,{3218,19},tuple,[{atom,{3218,20},monitor},{type,{3218,29},list,[{user_type,{3218,30},monitor_option,[]}]}]},{atom,{3219,19},link},{var,{3220,19},'OtherOption'}]}]}]]},{type,{3221,7},constraint,[{atom,{3221,7},is_subtype},[{var,{3221,7},'OtherOption'},{type,{3221,22},term,[]}]]}]]}]}}]}},{{function,spawn_request,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3266}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,51,57>>,signature => [{attribute,{3266,2},spec,{{spawn_request,1},[{type,{3266,20},bounded_fun,[{type,{3266,20},'fun',[{type,{3266,20},product,[{var,{3266,21},'Fun'}]},{var,{3266,29},'ReqId'}]},[{type,{3267,7},constraint,[{atom,{3267,7},is_subtype},[{var,{3267,7},'Fun'},{type,{3267,14},function,[]}]]},{type,{3268,7},constraint,[{atom,{3268,7},is_subtype},[{var,{3268,7},'ReqId'},{type,{3268,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3284}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,70,117,110,44,79,112,116,105,111,110,115,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,53,49>>,signature => [{attribute,{3284,2},spec,{{spawn_request,2},[{type,{3284,20},bounded_fun,[{type,{3284,20},'fun',[{type,{3284,20},product,[{var,{3284,21},'Fun'},{var,{3284,26},'Options'}]},{var,{3284,38},'ReqId'}]},[{type,{3285,7},constraint,[{atom,{3285,7},is_subtype},[{var,{3285,7},'Fun'},{type,{3285,14},function,[]}]]},{type,{3286,7},constraint,[{atom,{3286,7},is_subtype},[{var,{3286,7},'Option'},{type,{3286,17},union,[{type,{3286,17},tuple,[{atom,{3286,18},reply_tag},{var,{3286,29},'ReplyTag'}]},{type,{3287,17},tuple,[{atom,{3287,18},reply},{var,{3287,25},'Reply'}]},{user_type,{3288,17},spawn_opt_option,[]}]}]]},{type,{3289,7},constraint,[{atom,{3289,7},is_subtype},[{var,{3289,7},'ReplyTag'},{type,{3289,19},term,[]}]]},{type,{3290,7},constraint,[{atom,{3290,7},is_subtype},[{var,{3290,7},'Reply'},{type,{3290,16},union,[{atom,{3290,16},yes},{atom,{3290,22},no},{atom,{3290,27},error_only},{atom,{3290,40},success_only}]}]]},{type,{3291,7},constraint,[{atom,{3291,7},is_subtype},[{var,{3291,7},'Options'},{type,{3291,18},list,[{var,{3291,19},'Option'}]}]]},{type,{3292,7},constraint,[{atom,{3292,7},is_subtype},[{var,{3292,7},'ReqId'},{type,{3292,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3284}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,70,117,110,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,54,51>>,signature => [{attribute,{3284,2},spec,{{spawn_request,2},[{type,{3293,20},bounded_fun,[{type,{3293,20},'fun',[{type,{3293,20},product,[{var,{3293,21},'Node'},{var,{3293,27},'Fun'}]},{var,{3293,35},'ReqId'}]},[{type,{3294,7},constraint,[{atom,{3294,7},is_subtype},[{var,{3294,7},'Node'},{type,{3294,15},node,[]}]]},{type,{3295,7},constraint,[{atom,{3295,7},is_subtype},[{var,{3295,7},'Fun'},{type,{3295,14},function,[]}]]},{type,{3296,7},constraint,[{atom,{3296,7},is_subtype},[{var,{3296,7},'ReqId'},{type,{3296,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3319}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,101,114,108,97,110,103,44,97,112,112,108,121,44,91,70,117,110,44,91,93,93,44,79,112,116,105,111,110,115,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,117,115,105,110,103,32,116,104,101,32,102,117,110,32>>,{code,[],[<<70,117,110>>]},<<32,111,102,32,97,114,105,116,121,32,122,101,114,111,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<78,111,100,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<70,117,110>>]},<<32,105,115,32,110,111,116,32,97,32,102,117,110,32,111,102,32,97,114,105,116,121,32,122,101,114,111,46>>]}]},{li,[],[{p,[],[{code,[],[<<79,112,116,105,111,110,115>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,55,53>>,signature => [{attribute,{3319,2},spec,{{spawn_request,3},[{type,{3319,20},bounded_fun,[{type,{3319,20},'fun',[{type,{3319,20},product,[{var,{3319,21},'Node'},{var,{3319,27},'Fun'},{var,{3319,32},'Options'}]},{var,{3319,44},'ReqId'}]},[{type,{3320,7},constraint,[{atom,{3320,7},is_subtype},[{var,{3320,7},'Node'},{type,{3320,15},node,[]}]]},{type,{3321,7},constraint,[{atom,{3321,7},is_subtype},[{var,{3321,7},'Fun'},{type,{3321,14},function,[]}]]},{type,{3322,7},constraint,[{atom,{3322,7},is_subtype},[{var,{3322,7},'Options'},{type,{3322,18},list,[{var,{3322,19},'Option'}]}]]},{type,{3323,7},constraint,[{atom,{3323,7},is_subtype},[{var,{3323,7},'Option'},{type,{3323,17},union,[{atom,{3323,17},monitor},{type,{3324,17},tuple,[{atom,{3324,18},monitor},{type,{3324,27},list,[{user_type,{3324,28},monitor_option,[]}]}]},{atom,{3325,17},link},{type,{3326,17},tuple,[{atom,{3326,18},reply_tag},{var,{3326,29},'ReplyTag'}]},{type,{3327,17},tuple,[{atom,{3327,18},reply},{var,{3327,25},'Reply'}]},{var,{3328,17},'OtherOption'}]}]]},{type,{3329,7},constraint,[{atom,{3329,7},is_subtype},[{var,{3329,7},'ReplyTag'},{type,{3329,19},term,[]}]]},{type,{3330,7},constraint,[{atom,{3330,7},is_subtype},[{var,{3330,7},'Reply'},{type,{3330,16},union,[{atom,{3330,16},yes},{atom,{3330,22},no},{atom,{3330,27},error_only},{atom,{3330,40},success_only}]}]]},{type,{3331,7},constraint,[{atom,{3331,7},is_subtype},[{var,{3331,7},'OtherOption'},{type,{3331,22},term,[]}]]},{type,{3332,7},constraint,[{atom,{3332,7},is_subtype},[{var,{3332,7},'ReqId'},{type,{3332,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3319}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,55,57,53>>,signature => [{attribute,{3319,2},spec,{{spawn_request,3},[{type,{3333,20},bounded_fun,[{type,{3333,20},'fun',[{type,{3333,20},product,[{var,{3333,21},'Module'},{var,{3333,29},'Function'},{var,{3333,39},'Args'}]},{var,{3334,28},'ReqId'}]},[{type,{3335,7},constraint,[{atom,{3335,7},is_subtype},[{var,{3335,7},'Module'},{type,{3335,17},module,[]}]]},{type,{3336,7},constraint,[{atom,{3336,7},is_subtype},[{var,{3336,7},'Function'},{type,{3336,19},atom,[]}]]},{type,{3337,7},constraint,[{atom,{3337,7},is_subtype},[{var,{3337,7},'Args'},{type,{3337,15},list,[{type,{3337,16},term,[]}]}]]},{type,{3338,7},constraint,[{atom,{3338,7},is_subtype},[{var,{3338,7},'ReqId'},{type,{3338,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3359}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,52>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,78,111,100,101,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,91,93,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,105,116,104,32,110,111,32,111,112,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,56,48,55>>,signature => [{attribute,{3359,2},spec,{{spawn_request,4},[{type,{3359,20},bounded_fun,[{type,{3359,20},'fun',[{type,{3359,20},product,[{var,{3359,21},'Node'},{var,{3359,27},'Module'},{var,{3359,35},'Function'},{var,{3359,45},'Args'}]},{var,{3360,28},'ReqId'}]},[{type,{3361,7},constraint,[{atom,{3361,7},is_subtype},[{var,{3361,7},'Node'},{type,{3361,15},node,[]}]]},{type,{3362,7},constraint,[{atom,{3362,7},is_subtype},[{var,{3362,7},'Module'},{type,{3362,17},module,[]}]]},{type,{3363,7},constraint,[{atom,{3363,7},is_subtype},[{var,{3363,7},'Function'},{type,{3363,19},atom,[]}]]},{type,{3364,7},constraint,[{atom,{3364,7},is_subtype},[{var,{3364,7},'Args'},{type,{3364,15},list,[{type,{3364,16},term,[]}]}]]},{type,{3365,7},constraint,[{atom,{3365,7},is_subtype},[{var,{3365,7},'ReqId'},{type,{3365,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3359}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,52>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,110,111,100,101,40,41,44,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,65,114,103,115,44,79,112,116,105,111,110,115,41>>]}]},<<46,32,84,104,97,116,32,105,115,44,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,56,49,57>>,signature => [{attribute,{3359,2},spec,{{spawn_request,4},[{type,{3366,20},bounded_fun,[{type,{3366,20},'fun',[{type,{3366,20},product,[{var,{3366,21},'Module'},{var,{3366,29},'Function'},{var,{3366,39},'Args'},{var,{3366,45},'Options'}]},{var,{3367,28},'ReqId'}]},[{type,{3368,7},constraint,[{atom,{3368,7},is_subtype},[{var,{3368,7},'Module'},{type,{3368,17},module,[]}]]},{type,{3369,7},constraint,[{atom,{3369,7},is_subtype},[{var,{3369,7},'Function'},{type,{3369,19},atom,[]}]]},{type,{3370,7},constraint,[{atom,{3370,7},is_subtype},[{var,{3370,7},'Args'},{type,{3370,15},list,[{type,{3370,16},term,[]}]}]]},{type,{3371,7},constraint,[{atom,{3371,7},is_subtype},[{var,{3371,7},'Option'},{type,{3371,17},union,[{type,{3371,17},tuple,[{atom,{3371,18},reply_tag},{var,{3371,29},'ReplyTag'}]},{type,{3372,17},tuple,[{atom,{3372,18},reply},{var,{3372,25},'Reply'}]},{user_type,{3373,17},spawn_opt_option,[]}]}]]},{type,{3374,7},constraint,[{atom,{3374,7},is_subtype},[{var,{3374,7},'ReplyTag'},{type,{3374,19},term,[]}]]},{type,{3375,7},constraint,[{atom,{3375,7},is_subtype},[{var,{3375,7},'Reply'},{type,{3375,16},union,[{atom,{3375,16},yes},{atom,{3375,22},no},{atom,{3375,27},error_only},{atom,{3375,40},success_only}]}]]},{type,{3376,7},constraint,[{atom,{3376,7},is_subtype},[{var,{3376,7},'Options'},{type,{3376,18},list,[{var,{3376,19},'Option'}]}]]},{type,{3377,7},constraint,[{atom,{3377,7},is_subtype},[{var,{3377,7},'ReqId'},{type,{3377,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request,5},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3400}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>],#{<<101,110>> => [{p,[],[<<65,115,121,110,99,104,114,111,110,111,117,115,108,121,32,115,101,110,100,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,82,101,116,117,114,110,115,32,97,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32>>,{code,[],[<<82,101,113,73,100>>]},<<46>>]},{a,[{id,<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>}],[]},{p,[],[<<73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,111,107,44,32,80,105,100,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,117,99,104,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,32>>,{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]},<<32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32>>,{code,[],[<<82,101,112,108,121,84,97,103>>]},<<32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,112,97,119,110,95,114,101,112,108,121>>]},<<32,117,110,108,101,115,115,32,109,111,100,105,102,105,101,100,32,98,121,32,116,104,101,32>>,{code,[],[<<123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125>>]},<<32,111,112,116,105,111,110,46,32,84,104,101,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,115,116,97,114,116,101,100,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,111,102,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110>>]},<<32,116,111,32>>,{code,[],[<<65,114,103,115>>]},<<46>>]},{a,[{id,<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>}],[]},{p,[],[<<84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,32,101,105,116,104,101,114,32,105,102,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,102,97,105,108,101,100,32,111,114,32,105,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,97,115,32,105,110,116,101,114,114,117,112,116,101,100,32,98,121,32,97,32,99,111,110,110,101,99,116,105,111,110,32,102,97,105,108,117,114,101,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,98,121,32,100,101,102,97,117,108,116,32,98,101,32,115,101,110,116,32,97,32,109,101,115,115,97,103,101,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,82,101,112,108,121,84,97,103,44,32,82,101,113,73,100,44,32,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<32,105,115,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,46,32,83,117,99,104,32,97,32,109,101,115,115,97,103,101,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,97,110,32>>,{i,[],[<<101,114,114,111,114,32,109,101,115,115,97,103,101>>]},<<32,98,101,108,111,119,32,105,110,32,116,104,101,32,116,101,120,116,46,32,67,117,114,114,101,110,116,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,112,97,119,110,32,101,114,114,111,114,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<115,32,97,114,101,32,100,101,102,105,110,101,100,44,32,98,117,116,32,111,116,104,101,114,32,114,101,97,115,111,110,115,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,111,112,116>>]}]},{dd,[],[{p,[],[<<65,110,32,105,110,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<32,119,97,115,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46,32,78,111,116,101,32,116,104,97,116,32,100,105,102,102,101,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,115,32,109,97,121,32,115,117,112,112,111,114,116,32,100,105,102,102,101,114,101,110,116,32,111,112,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,115,32,105,115,115,117,101,100,32,98,121,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<70,97,105,108,117,114,101,32,116,111,32,115,101,116,32,117,112,32,97,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<32,111,114,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,32,119,97,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,110,32,116,104,101,32,99,97,115,101,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,119,97,115,32,108,111,115,116,44,32,97,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<67,111,117,108,100,32,110,111,116,32,99,114,101,97,116,101,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,100,117,101,32,116,111,32,116,104,97,116,32,115,111,109,101,32,115,121,115,116,101,109,32,108,105,109,105,116,32,119,97,115,32,114,101,97,99,104,101,100,46,32,84,121,112,105,99,97,108,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,97,98,108,101,32,119,97,115,32,102,117,108,108,46>>]}]}]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<109,111,110,105,116,111,114>>]}]},{dd,[],[{p,[],[<<73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41>>]}]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,101,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<32,105,115,32,97,108,115,111,32,117,115,101,100,32,97,115,32,109,111,110,105,116,111,114,32,114,101,102,101,114,101,110,99,101,32,97,115,32,105,102,32,105,116,32,119,97,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,41>>]},<<46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,109,111,110,105,116,111,114,32,99,97,110,32,110,111,116,32,98,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,100,101,109,111,110,105,116,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<100,101,109,111,110,105,116,111,114,101,100>>]},<<32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,65,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,102,111,114,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,109,111,110,105,116,111,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32>>,{code,[],[<<39,68,79,87,78,39>>]},<<32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,46>>]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<123,109,111,110,105,116,111,114,44,32,77,111,110,105,116,111,114,79,112,116,115,125>>]}]},{dd,[],[{p,[],[<<73,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,109,111,110,105,116,111,114,32,116,111,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,40,112,114,111,99,101,115,115,44,32,80,105,100,44,32,77,111,110,105,116,111,114,79,112,116,115,41>>]}]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,83,101,101,32,116,104,101,32>>,{code,[],[<<109,111,110,105,116,111,114>>]},<<32,111,112,116,105,111,110,32,97,98,111,118,101,32,102,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,116,104,101,32,109,111,110,105,116,111,114,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,116,104,101,32,99,97,115,101,32,116,104,97,116,32,97,110,32,97,108,105,97,115,32,105,115,32,99,114,101,97,116,101,100,32,117,115,105,110,103,32,116,104,101,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,44,32,116,104,101,32,97,108,105,97,115,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,101,32,117,110,116,105,108,32,116,104,101,32,109,111,110,105,116,111,114,32,105,115,32,97,99,116,105,118,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<108,105,110,107>>]}]},{dd,[],[{p,[],[<<73,110,32,97,98,115,101,110,99,101,32,111,102,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,117,114,101,115,44,32,97,116,111,109,105,99,97,108,108,121,32,115,101,116,115,32,117,112,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,97,115,32,105,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,104,97,100,32,99,97,108,108,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,110,107,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,110,107,40,80,105,100,41>>]}]},<<32,119,104,101,114,101,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<84,104,101,32,108,105,110,107,32,119,105,108,108,32,110,111,116,32,98,101,32,97,99,116,105,118,97,116,101,100,32,102,111,114,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,84,104,101,32,108,105,110,107,32,99,97,110,32,110,111,116,32,98,101,32,114,101,109,111,118,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46,32,65,110,32,101,120,105,116,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,110,111,116,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,98,101,102,111,114,101,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,110,111,32,101,120,105,116,32,115,105,103,110,97,108,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,110,101,99,116,105,111,110,32,98,101,116,119,101,101,110,32,116,104,101,32,110,111,100,101,115,32,105,110,118,111,108,118,101,100,32,105,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,105,115,32,108,111,115,116,32,100,117,114,105,110,103,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<46,32,65,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,104,97,118,101,32,98,101,101,110,32,99,114,101,97,116,101,100,46,32,73,102,32,105,116,32,104,97,115,32,98,101,101,110,32,99,114,101,97,116,101,100,44,32,105,116,32,119,105,108,108,32,98,101,32,100,101,108,105,118,101,114,101,100,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,119,105,116,104,32,97,110,32,101,120,105,116,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<110,111,99,111,110,110,101,99,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,112,108,121,44,32,82,101,112,108,121,125>>]}]},{dd,[],[{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<82,101,112,108,121>>]},<<32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<121,101,115>>]}]},{dd,[],[{p,[],[<<65,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,32,110,111,116,46,32,73,102,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]},<<32,114,101,116,117,114,110,115,32,119,105,116,104,111,117,116,32,114,97,105,115,105,110,103,32,97,110,32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,116,104,101,32>>,{code,[],[<<114,101,112,108,121>>]},<<32,111,112,116,105,111,110,32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<121,101,115>>]},<<44,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100,32,101,105,116,104,101,114,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,111,114,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<101,114,114,111,114,32,109,101,115,115,97,103,101>>]}]},<<46,32,84,104,101,32>>,{code,[],[<<114,101,112,108,121>>]},<<32,111,112,116,105,111,110,32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,115,101,116,32,116,111,32>>,{code,[],[<<121,101,115>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,111>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,99,111,109,112,108,101,116,101,115,46,32,84,104,105,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,32,111,114,32,110,111,116,46>>]}]},{dt,[],[{code,[],[<<101,114,114,111,114,95,111,110,108,121>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,44,32,98,117,116,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<101,114,114,111,114,32,109,101,115,115,97,103,101>>]}]},<<32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,46>>]}]},{dt,[],[{code,[],[<<115,117,99,99,101,115,115,95,111,110,108,121>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32,98,117,116,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115,32,109,101,115,115,97,103,101>>]}]},<<32,119,105,108,108,32,98,101,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,105,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,115,117,99,99,101,101,100,115,46>>]}]}]}]},{dt,[],[{code,[],[<<123,114,101,112,108,121,95,116,97,103,44,32,82,101,112,108,121,84,97,103,125>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,116,104,101,32,114,101,112,108,121,32,116,97,103,32,116,111,32>>,{code,[],[<<82,101,112,108,121,84,97,103>>]},<<32,105,110,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,46,32,84,104,97,116,32,105,115,44,32,105,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,115,117,99,99,101,115,115,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<115,117,99,99,101,115,115>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,101,114,114,111,114,95,109,101,115,115,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{i,[],[<<101,114,114,111,114>>]}]},<<32,109,101,115,115,97,103,101,32,116,104,97,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,112,108,121,32,116,97,103,32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<115,112,97,119,110,95,114,101,112,108,121>>]},<<46>>]}]},{dt,[],[{code,[],[<<79,116,104,101,114,79,112,116,105,111,110>>]}]},{dd,[],[{p,[],[<<79,116,104,101,114,32,118,97,108,105,100,32,111,112,116,105,111,110,115,32,100,101,112,101,110,100,115,32,111,110,32,119,104,97,116,32,111,112,116,105,111,110,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,110,111,100,101,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<78,111,100,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,111,116,104,101,114,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,102,111,114,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,111,102,32,99,117,114,114,101,110,116,32,79,84,80,32,118,101,114,115,105,111,110,32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<46>>]}]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<78,111,100,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<77,111,100,117,108,101>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,110,111,116,32,97,110,32,97,116,111,109,46>>]}]},{li,[],[{p,[],[{code,[],[<<65,114,103,115>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>]}]},{li,[],[{p,[],[{code,[],[<<79,112,116,105,111,110,115>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,116,101,114,109,115,46>>]}]}]},{p,[],[<<78,111,116,101,32,116,104,97,116,32,110,111,116,32,97,108,108,32,105,110,100,105,118,105,100,117,97,108,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,97,114,101,32,99,104,101,99,107,101,100,32,119,104,101,110,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,46,32,83,111,109,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,99,97,110,32,111,110,108,121,32,98,101,32,99,104,101,99,107,101,100,32,111,110,32,114,101,99,101,112,116,105,111,110,32,111,102,32,116,104,101,32,114,101,113,117,101,115,116,46,32,84,104,101,114,101,102,111,114,101,32,97,110,32,105,110,118,97,108,105,100,32,111,112,116,105,111,110,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,99,97,117,115,101,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,44,32,98,117,116,32,119,105,108,108,32,99,97,117,115,101,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,116,111,32,102,97,105,108,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,32>>,{code,[],[<<98,97,100,111,112,116>>]},<<46>>]},{p,[],[<<65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,98,101,32,97,98,97,110,100,111,110,101,100,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,55,56,51,49>>,signature => [{attribute,{3400,2},spec,{{spawn_request,5},[{type,{3400,20},bounded_fun,[{type,{3400,20},'fun',[{type,{3400,20},product,[{var,{3400,21},'Node'},{var,{3400,27},'Module'},{var,{3400,35},'Function'},{var,{3400,45},'Args'},{var,{3400,51},'Options'}]},{var,{3401,28},'ReqId'}]},[{type,{3402,7},constraint,[{atom,{3402,7},is_subtype},[{var,{3402,7},'Node'},{type,{3402,15},node,[]}]]},{type,{3403,7},constraint,[{atom,{3403,7},is_subtype},[{var,{3403,7},'Module'},{type,{3403,17},module,[]}]]},{type,{3404,7},constraint,[{atom,{3404,7},is_subtype},[{var,{3404,7},'Function'},{type,{3404,19},atom,[]}]]},{type,{3405,7},constraint,[{atom,{3405,7},is_subtype},[{var,{3405,7},'Args'},{type,{3405,15},list,[{type,{3405,16},term,[]}]}]]},{type,{3406,7},constraint,[{atom,{3406,7},is_subtype},[{var,{3406,7},'Options'},{type,{3406,18},list,[{var,{3406,19},'Option'}]}]]},{type,{3407,7},constraint,[{atom,{3407,7},is_subtype},[{var,{3407,7},'Option'},{type,{3407,17},union,[{atom,{3407,17},monitor},{type,{3408,17},tuple,[{atom,{3408,18},monitor},{type,{3408,27},list,[{user_type,{3408,28},monitor_option,[]}]}]},{atom,{3409,17},link},{type,{3410,17},tuple,[{atom,{3410,18},reply_tag},{var,{3410,29},'ReplyTag'}]},{type,{3411,17},tuple,[{atom,{3411,18},reply},{var,{3411,25},'Reply'}]},{var,{3412,17},'OtherOption'}]}]]},{type,{3413,7},constraint,[{atom,{3413,7},is_subtype},[{var,{3413,7},'ReplyTag'},{type,{3413,19},term,[]}]]},{type,{3414,7},constraint,[{atom,{3414,7},is_subtype},[{var,{3414,7},'Reply'},{type,{3414,16},union,[{atom,{3414,16},yes},{atom,{3414,22},no},{atom,{3414,27},error_only},{atom,{3414,40},success_only}]}]]},{type,{3415,7},constraint,[{atom,{3415,7},is_subtype},[{var,{3415,7},'OtherOption'},{type,{3415,22},term,[]}]]},{type,{3416,7},constraint,[{atom,{3416,7},is_subtype},[{var,{3416,7},'ReqId'},{type,{3416,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,spawn_request_abandon,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3433}],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<65,98,97,110,100,111,110,32,97,32,112,114,101,118,105,111,117,115,108,121,32,105,115,115,117,101,100,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,114,101,113,117,101,115,116,47,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,40,41>>]}]},<<32,105,110,32,97,32,99,97,108,108,32,102,114,111,109,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,109,97,100,101,32,116,104,101,32,114,101,113,117,101,115,116,32,99,97,110,32,97,98,97,110,100,111,110,32,116,104,101,32,114,101,113,117,101,115,116,46>>]},{p,[],[<<65,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,99,97,110,32,111,110,108,121,32,98,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,32,117,110,116,105,108,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,32,99,111,109,112,108,101,116,101,100,46,32,87,104,101,110,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,119,105,108,108,32,110,111,116,32,98,101,32,101,102,102,101,99,116,101,100,32,98,121,32,102,117,116,117,114,101,32,100,105,114,101,99,116,32,101,102,102,101,99,116,115,32,111,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,116,115,101,108,102,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,119,105,108,108,32,110,111,116,32,114,101,99,101,105,118,101,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,109,101,115,115,97,103,101,46,32,84,104,101,32,114,101,113,117,101,115,116,32,105,115,32,104,111,119,101,118,101,114,32,110,111,116,32,119,105,116,104,100,114,97,119,110,44,32,115,111,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,98,101,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,101,32,114,101,113,117,101,115,116,46,32,73,102,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32,105,115,32,99,114,101,97,116,101,100,32,97,102,116,101,114,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,44,32,110,111,32,109,111,110,105,116,111,114,115,32,110,111,114,32,108,105,110,107,115,32,119,105,108,108,32,98,101,32,115,101,116,32,117,112,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<115,112,97,119,110,95,114,101,113,117,101,115,116,95,97,98,97,110,100,111,110,47,49>>]},<<32,100,117,101,32,116,111,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46,32,73,102,32,116,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,110,99,108,117,100,101,100,32,116,104,101,32>>,{code,[],[<<108,105,110,107>>]},<<32,111,112,116,105,111,110,44,32,116,104,101,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,116,104,105,115,32,114,101,113,117,101,115,116,32,119,105,108,108,32,98,101,32,115,101,110,116,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,102,114,111,109,32,105,116,115,32,112,97,114,101,110,116,32,119,105,116,104,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32>>,{code,[],[<<97,98,97,110,100,111,110,101,100>>]},<<32,119,104,101,110,32,105,116,32,105,115,32,100,101,116,101,99,116,101,100,32,116,104,97,116,32,116,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,115,117,99,99,101,101,100,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,100,117,101,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,97,98,97,110,100,111,110,101,100,32,109,97,121,32,99,111,109,109,117,110,105,99,97,116,101,32,119,105,116,104,32,105,116,115,32,112,97,114,101,110,116,32,97,115,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,46,32,73,116,32,105,115,32>>,{em,[],[<<111,110,108,121>>]},<<32,116,104,101,32,100,105,114,101,99,116,32,101,102,102,101,99,116,115,32,111,110,32,116,104,101,32,112,97,114,101,110,116,32,111,102,32,116,104,101,32,97,99,116,117,97,108,32,115,112,97,119,110,32,114,101,113,117,101,115,116,44,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,97,110,99,101,108,101,100,32,98,121,32,97,98,97,110,100,111,110,105,110,103,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,46>>]}]},{p,[],[<<82,101,116,117,114,110,32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,97,98,97,110,100,111,110,101,100,46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,119,97,115,32,97,98,97,110,100,111,110,101,100,46,32,84,104,101,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,114,101,113,117,101,115,116,32,105,100,101,110,116,105,102,105,101,114,32,100,105,100,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,110,32,111,117,116,115,116,97,110,100,105,110,103,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,105,115,115,117,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,101,105,116,104,101,114,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<82,101,113,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,112,114,101,118,105,111,117,108,115,121,32,109,97,100,101,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,84,104,101,32,115,112,97,119,110,32,111,112,101,114,97,116,105,111,110,32,104,97,115,32,99,111,109,112,108,101,116,101,100,32,97,110,100,32,97,32,115,112,97,119,110,32,114,101,112,108,121,32,104,97,115,32,97,108,114,101,97,100,121,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,117,110,108,101,115,115,32,116,104,101,32,115,112,97,119,110,32,114,101,112,108,121,32,119,97,115,32,100,105,115,97,98,108,101,100,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,46>>]}]},{li,[],[{p,[],[{code,[],[<<82,101,113,73,100>>]},<<32,100,111,101,115,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,97,32,115,112,97,119,110,32,114,101,113,117,101,115,116,32,116,104,97,116,32,104,97,115,32,98,101,101,110,32,109,97,100,101,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46>>]}]}]}]}]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,102,97,105,108,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,105,102,32>>,{code,[],[<<82,101,113,73,100>>]},<<32,105,115,32,110,111,116,32,97,32,114,101,102,101,114,101,110,99,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,48,56,56>>,signature => [{attribute,{3433,2},spec,{{spawn_request_abandon,1},[{type,{3433,28},'fun',[{type,{3433,28},product,[{ann_type,{3433,29},[{var,{3433,29},'ReqId'},{type,{3433,38},reference,[]}]}]},{type,{3433,54},boolean,[]}]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,split_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1959}],[<<115,112,108,105,116,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,117,112,108,101,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,98,105,110,97,114,105,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,115,112,108,105,116,116,105,110,103,32>>,{code,[],[<<66,105,110>>]},<<32,105,110,116,111,32,116,119,111,32,112,97,114,116,115,32,97,116,32,112,111,115,105,116,105,111,110,32>>,{code,[],[<<80,111,115>>]},<<46,32,84,104,105,115,32,105,115,32,110,111,116,32,97,32,100,101,115,116,114,117,99,116,105,118,101,32,111,112,101,114,97,116,105,111,110,46,32,65,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,44,32,116,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,98,105,110,97,114,105,101,115,32,97,108,116,111,103,101,116,104,101,114,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,66,32,61,32,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,34,48,49,50,51,52,53,54,55,56,57,34,41,46,10,60,60,34,48,49,50,51,52,53,54,55,56,57,34,62,62,10,62,32,98,121,116,101,95,115,105,122,101,40,66,41,46,10,49,48,10,62,32,123,66,49,44,32,66,50,125,32,61,32,115,112,108,105,116,95,98,105,110,97,114,121,40,66,44,51,41,46,10,123,60,60,34,48,49,50,34,62,62,44,60,60,34,51,52,53,54,55,56,57,34,62,62,125,10,62,32,98,121,116,101,95,115,105,122,101,40,66,49,41,46,10,51,10,62,32,98,121,116,101,95,115,105,122,101,40,66,50,41,46,10,55>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,53,52>>,signature => [{attribute,{1959,2},spec,{{split_binary,2},[{type,{1959,19},bounded_fun,[{type,{1959,19},'fun',[{type,{1959,19},product,[{var,{1959,20},'Bin'},{var,{1959,25},'Pos'}]},{type,{1959,33},tuple,[{type,{1959,34},binary,[]},{type,{1959,44},binary,[]}]}]},[{type,{1960,7},constraint,[{atom,{1960,7},is_subtype},[{var,{1960,7},'Bin'},{type,{1960,14},binary,[]}]]},{type,{1961,7},constraint,[{atom,{1961,7},is_subtype},[{var,{1961,7},'Pos'},{type,{1961,14},non_neg_integer,[]}]]}]]}]}}]}},{{function,start_timer,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1966}],[<<115,116,97,114,116,95,116,105,109,101,114,47,51>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,114,116,95,116,105,109,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,116,97,114,116,95,116,105,109,101,114,40,84,105,109,101,44,32,68,101,115,116,44,32,77,115,103,44,32,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,55,56>>,signature => [{attribute,{1966,2},spec,{{erlang,start_timer,3},[{type,{1966,25},bounded_fun,[{type,{1966,25},'fun',[{type,{1966,25},product,[{var,{1966,26},'Time'},{var,{1966,32},'Dest'},{var,{1966,38},'Msg'}]},{var,{1966,46},'TimerRef'}]},[{type,{1967,7},constraint,[{atom,{1967,7},is_subtype},[{var,{1967,7},'Time'},{type,{1967,15},non_neg_integer,[]}]]},{type,{1968,7},constraint,[{atom,{1968,7},is_subtype},[{var,{1968,7},'Dest'},{type,{1968,15},union,[{type,{1968,15},pid,[]},{type,{1968,23},atom,[]}]}]]},{type,{1969,7},constraint,[{atom,{1969,7},is_subtype},[{var,{1969,7},'Msg'},{type,{1969,14},term,[]}]]},{type,{1970,7},constraint,[{atom,{1970,7},is_subtype},[{var,{1970,7},'TimerRef'},{type,{1970,19},reference,[]}]]}]]}]}}]}},{{function,start_timer,4},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1976}],[<<115,116,97,114,116,95,116,105,109,101,114,47,52>>],#{<<101,110>> => [{p,[],[<<83,116,97,114,116,115,32,97,32,116,105,109,101,114,46,32,87,104,101,110,32,116,104,101,32,116,105,109,101,114,32,101,120,112,105,114,101,115,44,32,116,104,101,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,84,105,109,101,114,82,101,102,44,32,77,115,103,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<68,101,115,116>>]},<<46>>]},{p,[],[{code,[],[<<79,112,116,105,111,110>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,97,98,115,44,32,102,97,108,115,101,125>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46,32,73,116,32,109,101,97,110,115,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,32>>,{em,[],[<<114,101,108,97,116,105,118,101>>]},<<32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,97,98,115,44,32,116,114,117,101,125>>]}]},{dd,[],[{p,[],[<<65,98,115,111,108,117,116,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,46,32,84,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,110,32,97,98,115,111,108,117,116,101,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46>>]}]}]},{p,[],[<<77,111,114,101,32>>,{code,[],[<<79,112,116,105,111,110>>]},<<115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{p,[],[<<84,104,101,32,97,98,115,111,108,117,116,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,115,101,116,32,116,111,32,101,120,112,105,114,101,32,111,110,44,32,109,117,115,116,32,98,101,32,105,110,32,116,104,101,32,105,110,116,101,114,118,97,108,32>>,{code,[],[<<91,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111>>]},{code,[],[<<40,115,116,97,114,116,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,44,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111>>]},{code,[],[<<40,101,110,100,95,116,105,109,101,41,44,32,110,97,116,105,118,101,44,32,109,105,108,108,105,115,101,99,111,110,100,41,32,93>>]},<<46,32,73,102,32,97,32,114,101,108,97,116,105,118,101,32,116,105,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,110,101,103,97,116,105,118,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<44,32,105,116,32,109,117,115,116,32,98,101,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,111,102,32,97,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,101,105,116,104,101,114,32,116,101,114,109,105,110,97,116,101,100,32,111,114,32,110,111,116,46,32,73,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,110,32>>,{code,[],[<<97,116,111,109,40,41>>]},<<44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,108,111,99,97,108,108,121,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,46,32,84,104,101,32,112,114,111,99,101,115,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32,110,97,109,101,32,105,115,32,108,111,111,107,101,100,32,117,112,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,105,109,101,114,32,101,120,112,105,114,97,116,105,111,110,46,32,78,111,32,101,114,114,111,114,32,105,115,32,114,101,116,117,114,110,101,100,32,105,102,32,116,104,101,32,110,97,109,101,32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<44,32,116,104,101,32,116,105,109,101,114,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,102,101,114,114,101,100,32,116,111,32,98,121,32,116,104,101,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,105,115,32,110,111,116,32,97,108,105,118,101,44,32,111,114,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,82,84,83,32,53,46,52,46,49,49,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,105,109,101,114,115,32,97,114,101,32,110,111,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,110,99,101,108,101,100,32,119,104,101,110,32>>,{code,[],[<<68,101,115,116>>]},<<32,105,115,32,97,110,32>>,{code,[],[<<97,116,111,109,40,41>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,101,110,100,95,97,102,116,101,114,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,101,110,100,95,97,102,116,101,114,47,52>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,97,110,99,101,108,95,116,105,109,101,114,47,50>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,97,100,95,116,105,109,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,97,100,95,116,105,109,101,114,47,50>>]}]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,100,111,32,110,111,116,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,113,117,105,114,101,109,101,110,116,115,32,115,112,101,99,105,102,105,101,100,32,104,101,114,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,49,56,57>>,signature => [{attribute,{1976,2},spec,{{erlang,start_timer,4},[{type,{1976,25},bounded_fun,[{type,{1976,25},'fun',[{type,{1976,25},product,[{var,{1976,26},'Time'},{var,{1976,32},'Dest'},{var,{1976,38},'Msg'},{var,{1976,43},'Options'}]},{var,{1976,55},'TimerRef'}]},[{type,{1977,7},constraint,[{atom,{1977,7},is_subtype},[{var,{1977,7},'Time'},{type,{1977,15},integer,[]}]]},{type,{1978,7},constraint,[{atom,{1978,7},is_subtype},[{var,{1978,7},'Dest'},{type,{1978,15},union,[{type,{1978,15},pid,[]},{type,{1978,23},atom,[]}]}]]},{type,{1979,7},constraint,[{atom,{1979,7},is_subtype},[{var,{1979,7},'Msg'},{type,{1979,14},term,[]}]]},{type,{1980,7},constraint,[{atom,{1980,7},is_subtype},[{var,{1980,7},'Options'},{type,{1980,18},list,[{var,{1980,19},'Option'}]}]]},{type,{1981,7},constraint,[{atom,{1981,7},is_subtype},[{var,{1981,7},'Abs'},{type,{1981,14},boolean,[]}]]},{type,{1982,7},constraint,[{atom,{1982,7},is_subtype},[{var,{1982,7},'Option'},{type,{1982,17},tuple,[{atom,{1982,18},abs},{var,{1982,23},'Abs'}]}]]},{type,{1983,7},constraint,[{atom,{1983,7},is_subtype},[{var,{1983,7},'TimerRef'},{type,{1983,19},reference,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},<<32,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,116,97,115,107,115,32,116,104,97,116,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,32,97,114,101,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,50,52,57>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2594,17},bounded_fun,[{type,{2594,17},'fun',[{type,{2594,17},product,[{atom,{2594,18},active_tasks}]},{type,{2594,35},list,[{var,{2594,36},'ActiveTasks'}]}]},[{type,{2595,7},constraint,[{atom,{2595,7},is_subtype},[{var,{2595,7},'ActiveTasks'},{type,{2595,22},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,99,116,105,118,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,111,110,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,116,104,97,116,32,97,114,101,32,114,101,97,100,121,32,116,111,32,114,117,110,44,32,111,114,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,114,117,110,110,105,110,103,46,32,86,97,108,117,101,115,32,102,111,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,110,100,32,116,104,101,105,114,32,97,115,115,111,99,105,97,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,97,110,32,101,108,101,109,101,110,116,32,119,105,116,104,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,32,97,110,100,32,116,104,101,110,32,97,115,32,108,97,115,116,32,101,108,101,109,101,110,116,32,116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,105,116,115,32,97,115,115,111,99,105,97,116,101,100,32,100,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,102,111,108,108,111,119,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,32,101,102,102,105,99,105,101,110,116,108,121,32,103,97,116,104,101,114,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32>>,{em,[],[<<110,111,116>>]},<<32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,50,54,52>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2596,3},bounded_fun,[{type,{2596,3},'fun',[{type,{2596,3},product,[{atom,{2596,4},active_tasks_all}]},{type,{2596,25},list,[{var,{2596,26},'ActiveTasks'}]}]},[{type,{2597,7},constraint,[{atom,{2597,7},is_subtype},[{var,{2597,7},'ActiveTasks'},{type,{2597,22},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,111,110,116,101,120,116,32,115,119,105,116,99,104,101,115,32,115,105,110,99,101,32,116,104,101,32,115,121,115,116,101,109,32,115,116,97,114,116,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,51,48,54>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2598,3},bounded_fun,[{type,{2598,3},'fun',[{type,{2598,3},product,[{atom,{2598,4},context_switches}]},{type,{2598,25},tuple,[{var,{2598,26},'ContextSwitches'},{integer,{2598,42},0}]}]},[{type,{2599,7},constraint,[{atom,{2599,7},is_subtype},[{var,{2599,7},'ContextSwitches'},{type,{2599,26},non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,120,97,99,116,32,114,101,100,117,99,116,105,111,110,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41>>]},<<32,105,115,32,97,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,111,112,101,114,97,116,105,111,110,32,116,104,97,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,101,100,117,99,116,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,51,49,53>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2600,17},bounded_fun,[{type,{2600,17},'fun',[{type,{2600,17},product,[{atom,{2600,18},exact_reductions}]},{type,{2600,39},tuple,[{var,{2600,40},'Total_Exact_Reductions'},{var,{2601,40},'Exact_Reductions_Since_Last_Call'}]}]},[{type,{2602,7},constraint,[{atom,{2602,7},is_subtype},[{var,{2602,7},'Total_Exact_Reductions'},{type,{2602,33},non_neg_integer,[]}]]},{type,{2603,7},constraint,[{atom,{2603,7},is_subtype},[{var,{2603,7},'Exact_Reductions_Since_Last_Call'},{type,{2603,43},non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,116,97,116,105,115,116,105,99,115,40,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110,41,46,10,123,56,53,44,50,51,57,54,49,44,48,125>>]}]},{p,[],[<<84,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,102,111,114,32,115,111,109,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,51,51,48>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2604,17},bounded_fun,[{type,{2604,17},'fun',[{type,{2604,17},product,[{atom,{2604,18},garbage_collection}]},{type,{2604,41},tuple,[{var,{2604,42},'Number_of_GCs'},{var,{2604,57},'Words_Reclaimed'},{integer,{2604,74},0}]}]},[{type,{2605,7},constraint,[{atom,{2605,7},is_subtype},[{var,{2605,7},'Number_of_GCs'},{type,{2605,24},non_neg_integer,[]}]]},{type,{2606,7},constraint,[{atom,{2606,7},is_subtype},[{var,{2606,7},'Words_Reclaimed'},{type,{2606,26},non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<73,110,112,117,116>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,99,101,105,118,101,100,32,116,104,114,111,117,103,104,32,112,111,114,116,115,44,32,97,110,100,32>>,{code,[],[<<79,117,116,112,117,116>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,111,117,116,112,117,116,32,116,111,32,112,111,114,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,51,52,50>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2607,17},bounded_fun,[{type,{2607,17},'fun',[{type,{2607,17},product,[{atom,{2607,18},io}]},{type,{2607,25},tuple,[{type,{2607,26},tuple,[{atom,{2607,27},input},{var,{2607,34},'Input'}]},{type,{2607,42},tuple,[{atom,{2607,43},output},{var,{2607,51},'Output'}]}]}]},[{type,{2608,7},constraint,[{atom,{2608,7},is_subtype},[{var,{2608,7},'Input'},{type,{2608,16},non_neg_integer,[]}]]},{type,{2609,7},constraint,[{atom,{2609,7},is_subtype},[{var,{2609,7},'Output'},{type,{2609,17},non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,101,97,115,117,114,101,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,112,101,110,100,115,32,100,111,105,110,103,32,118,97,114,105,111,117,115,32,116,97,115,107,115,46,32,73,116,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,97,115,32,108,105,103,104,116,119,101,105,103,104,116,32,97,115,32,112,111,115,115,105,98,108,101,44,32,98,117,116,32,115,111,109,101,32,111,118,101,114,104,101,97,100,32,101,120,105,115,116,115,32,119,104,101,110,32,116,104,105,115,32,105,115,32,101,110,97,98,108,101,100,46,32,77,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,97,32,112,114,111,102,105,108,105,110,103,32,116,111,111,108,32,116,111,32,104,101,108,112,32,102,105,110,100,105,110,103,32,112,101,114,102,111,114,109,97,110,99,101,32,98,111,116,116,108,101,110,101,99,107,115,46,32,84,111,32>>,{code,[],[<<115,116,97,114,116>>]},<<47>>,{code,[],[<<115,116,111,112>>]},<<47>>,{code,[],[<<114,101,115,101,116>>]},<<32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,44,32,117,115,101,32,115,121,115,116,101,109,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>]}]},<<46>>]},{p,[],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41>>]},<<32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,109,97,112,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115,111,109,101,32,111,102,32,116,104,101,32,79,83,32,116,104,114,101,97,100,115,32,119,105,116,104,105,110,32,69,82,84,83,46,32,69,97,99,104,32,109,97,112,32,99,111,110,116,97,105,110,115,32>>,{code,[],[<<116,121,112,101>>]},<<32,97,110,100,32>>,{code,[],[<<105,100>>]},<<32,102,105,101,108,100,115,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,119,104,97,116,32,116,104,114,101,97,100,32,105,116,32,105,115,44,32,97,110,100,32,97,108,115,111,32,97,32,99,111,117,110,116,101,114,115,32,102,105,101,108,100,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,100,97,116,97,32,97,98,111,117,116,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32,104,97,115,32,98,101,101,110,32,115,112,101,110,116,32,105,110,32,116,104,101,32,118,97,114,105,111,117,115,32,115,116,97,116,101,115,46>>]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,46,10,91,35,123,99,111,117,110,116,101,114,115,32,61,62,32,35,123,97,117,120,32,61,62,32,49,56,57,57,49,56,50,57,49,52,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,99,104,101,99,107,95,105,111,32,61,62,32,50,54,48,53,56,54,51,54,48,50,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,109,117,108,97,116,111,114,32,61,62,32,52,53,55,51,49,56,56,48,52,54,51,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,103,99,32,61,62,32,49,53,49,50,50,48,54,57,49,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,116,104,101,114,32,61,62,32,53,52,50,49,51,51,56,52,53,54,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,111,114,116,32,61,62,32,50,50,49,54,51,49,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,108,101,101,112,32,61,62,32,53,49,53,48,50,57,52,49,48,48,125,44,10,32,32,32,105,100,32,61,62,32,49,44,10,32,32,32,116,121,112,101,32,61,62,32,115,99,104,101,100,117,108,101,114,125,124,46,46,46,93>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,117,110,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>]}]},<<46,32,83,111,44,32,116,111,32,99,111,110,118,101,114,116,32,105,116,32,116,111,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,121,111,117,32,99,97,110,32,100,111,32,115,111,109,101,116,104,105,110,103,32,108,105,107,101,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<108,105,115,116,115,58,109,97,112,40,10,32,32,102,117,110,40,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,67,110,116,32,125,32,61,32,77,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,77,115,67,110,116,32,61,32,109,97,112,115,58,109,97,112,40,102,117,110,40,95,75,44,32,80,101,114,102,67,111,117,110,116,41,32,45,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,80,101,114,102,67,111,117,110,116,44,32,112,101,114,102,95,99,111,117,110,116,101,114,44,32,49,48,48,48,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,110,100,44,32,67,110,116,41,44,10,32,32,32,32,32,32,32,32,32,77,35,123,32,99,111,117,110,116,101,114,115,32,58,61,32,77,115,67,110,116,32,125,10,32,32,101,110,100,44,32,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41,41,46>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,118,97,108,117,101,115,32,97,114,101,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,116,104,101,32,101,120,97,99,116,32,116,105,109,101,32,115,112,101,110,116,32,105,110,32,101,97,99,104,32,115,116,97,116,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,118,97,114,105,111,117,115,32,111,112,116,105,109,105,115,97,116,105,111,110,32,100,111,110,101,32,116,111,32,107,101,101,112,32,116,104,101,32,111,118,101,114,104,101,97,100,32,97,115,32,115,109,97,108,108,32,97,115,32,112,111,115,115,105,98,108,101,46>>]},{p,[],[{code,[],[<<77,83,65,99,99,95,84,104,114,101,97,100,95,84,121,112,101>>]},<<115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[<<84,104,101,32,109,97,105,110,32,101,120,101,99,117,116,105,111,110,32,116,104,114,101,97,100,115,32,116,104,97,116,32,100,111,32,109,111,115,116,32,111,102,32,116,104,101,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,83>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[<<84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,99,112,117,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,83,68,99,112,117>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[<<84,104,101,32,116,104,114,101,97,100,115,32,102,111,114,32,108,111,110,103,32,114,117,110,110,105,110,103,32,73,47,79,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,83,68,105,111>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<97,115,121,110,99>>]}]},{dd,[],[<<65,115,121,110,99,32,116,104,114,101,97,100,115,32,97,114,101,32,117,115,101,100,32,98,121,32,118,97,114,105,111,117,115,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,115,32,40,109,97,105,110,108,121,32,116,104,101,32,102,105,108,101,32,100,114,105,118,101,114,115,41,32,100,111,32,111,102,102,108,111,97,100,32,110,111,110,45,67,80,85,32,105,110,116,101,110,115,105,118,101,32,119,111,114,107,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,97,115,121,110,99,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,65>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]},{dt,[],[{code,[],[<<97,117,120>>]}]},{dd,[],[<<84,97,107,101,115,32,99,97,114,101,32,111,102,32,97,110,121,32,119,111,114,107,32,116,104,97,116,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,99,97,108,108,121,32,97,115,115,105,103,110,101,100,32,116,111,32,97,32,115,99,104,101,100,117,108,101,114,46>>]},{dt,[],[{code,[],[<<112,111,108,108>>]}]},{dd,[],[<<68,111,101,115,32,116,104,101,32,73,79,32,112,111,108,108,105,110,103,32,102,111,114,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,73,79,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<101,114,108,32,43,73,79,116>>]},<<32,102,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32>>,{code,[],[<<77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101>>]},<<115,32,97,114,101,32,97,118,97,105,108,97,98,108,101,46,32,65,108,108,32,115,116,97,116,101,115,32,97,114,101,32,101,120,99,108,117,115,105,118,101,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,32,116,104,114,101,97,100,32,99,97,110,110,111,116,32,98,101,32,105,110,32,116,119,111,32,115,116,97,116,101,115,32,97,116,32,111,110,99,101,46,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,116,104,101,32,110,117,109,98,101,114,115,32,111,102,32,97,108,108,32,99,111,117,110,116,101,114,115,32,105,110,32,97,32,116,104,114,101,97,100,44,32,121,111,117,32,103,101,116,32,116,104,101,32,116,111,116,97,108,32,114,117,110,116,105,109,101,32,102,111,114,32,116,104,97,116,32,116,104,114,101,97,100,46>>]},{dl,[],[{dt,[],[{code,[],[<<97,117,120>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,104,97,110,100,108,105,110,103,32,97,117,120,105,108,105,97,114,121,32,106,111,98,115,46>>]},{dt,[],[{code,[],[<<99,104,101,99,107,95,105,111>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,99,104,101,99,107,105,110,103,32,102,111,114,32,110,101,119,32,73,47,79,32,101,118,101,110,116,115,46>>]},{dt,[],[{code,[],[<<101,109,117,108,97,116,111,114>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,46>>]},{dt,[],[{code,[],[<<103,99>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,104,101,110,32,101,120,116,114,97,32,115,116,97,116,101,115,32,97,114,101,32,101,110,97,98,108,101,100,32,116,104,105,115,32,105,115,32,116,104,101,32,116,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,110,111,110,45,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,46>>]},{dt,[],[{code,[],[<<111,116,104,101,114>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,117,110,97,99,99,111,117,110,116,101,100,32,116,104,105,110,103,115,46>>]},{dt,[],[{code,[],[<<112,111,114,116>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,112,111,114,116,115,46>>]},{dt,[],[{code,[],[<<115,108,101,101,112>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,115,108,101,101,112,105,110,103,46>>]}]},{p,[],[<<77,111,114,101,32,102,105,110,101,45,103,114,97,105,110,101,100,32>>,{code,[],[<<77,83,65,99,99,95,84,104,114,101,97,100,95,83,116,97,116,101>>]},<<115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,116,104,114,111,117,103,104,32,99,111,110,102,105,103,117,114,101,32,40,115,117,99,104,32,97,115,32>>,{code,[],[<<46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,109,105,99,114,111,115,116,97,116,101,45,97,99,99,111,117,110,116,105,110,103,61,101,120,116,114,97>>]},<<41,46,32,69,110,97,98,108,105,110,103,32,116,104,101,115,101,32,115,116,97,116,101,115,32,99,97,117,115,101,115,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,32,119,104,101,110,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,105,115,32,116,117,114,110,101,100,32,111,102,102,32,97,110,100,32,105,110,99,114,101,97,115,101,115,32,116,104,101,32,111,118,101,114,104,101,97,100,32,119,104,101,110,32,105,116,32,105,115,32,116,117,114,110,101,100,32,111,110,46>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108,111,99>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,109,101,109,111,114,121,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,115,112,114,101,97,100,32,111,117,116,32,111,118,101,114,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,46>>]},{dt,[],[{code,[],[<<98,105,102>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,105,110,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<98,117,115,121,95,119,97,105,116>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,98,117,115,121,32,119,97,105,116,105,110,103,46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,115,116,97,116,101,32,119,104,101,114,101,32,97,32,115,99,104,101,100,117,108,101,114,32,110,111,32,108,111,110,103,101,114,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,105,115,32,97,99,116,105,118,101,32,119,104,101,110,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41>>]}]},<<46,32,83,111,44,32,105,102,32,121,111,117,32,97,100,100,32,97,108,108,32,111,116,104,101,114,32,115,116,97,116,101,115,32,98,117,116,32,116,104,105,115,32,97,110,100,32,115,108,101,101,112,44,32,97,110,100,32,116,104,101,110,32,100,105,118,105,100,101,32,116,104,97,116,32,98,121,32,97,108,108,32,116,105,109,101,32,105,110,32,116,104,101,32,116,104,114,101,97,100,44,32,121,111,117,32,115,104,111,117,108,100,32,103,101,116,32,115,111,109,101,116,104,105,110,103,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32,116,104,101,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,102,114,97,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<111,116,104,101,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<101,116,115>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,101,120,101,99,117,116,105,110,103,32,69,84,83,32,66,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<103,99,95,102,117,108,108>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,100,111,105,110,103,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<103,99>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<110,105,102>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,105,110,32,78,73,70,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<115,101,110,100>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,115,101,110,100,105,110,103,32,109,101,115,115,97,103,101,115,32,40,112,114,111,99,101,115,115,101,115,32,111,110,108,121,41,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<101,109,117,108,97,116,111,114>>]},<<32,115,116,97,116,101,46>>]},{dt,[],[{code,[],[<<116,105,109,101,114,115>>]}]},{dd,[],[<<84,105,109,101,32,115,112,101,110,116,32,109,97,110,97,103,105,110,103,32,116,105,109,101,114,115,46,32,87,105,116,104,111,117,116,32,101,120,116,114,97,32,115,116,97,116,101,115,32,116,104,105,115,32,116,105,109,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<111,116,104,101,114>>]},<<32,115,116,97,116,101,46>>]}]},{p,[],[<<84,104,101,32,117,116,105,108,105,116,121,32,109,111,100,117,108,101,32>>,{a,[{href,<<114,117,110,116,105,109,101,95,116,111,111,108,115,58,109,115,97,99,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,115,97,99,99,40,51,41>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,111,114,101,32,101,97,115,105,108,121,32,97,110,97,108,121,115,101,32,116,104,101,115,101,32,115,116,97,116,105,115,116,105,99,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,115,121,115,116,101,109,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>]}]},<<32,105,115,32,116,117,114,110,101,100,32,111,102,102,46>>]},{p,[],[<<84,104,101,32,108,105,115,116,32,111,102,32,116,104,114,101,97,100,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,99,97,108,108,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,116,104,114,101,97,100,115,32,97,110,100,32,115,116,97,116,101,115,32,97,114,101,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,119,105,116,104,111,117,116,32,97,110,121,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,51,53,51>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2610,17},bounded_fun,[{type,{2610,17},'fun',[{type,{2610,17},product,[{atom,{2610,18},microstate_accounting}]},{type,{2610,44},union,[{type,{2610,44},list,[{var,{2610,45},'MSAcc_Thread'}]},{atom,{2610,61},undefined}]}]},[{type,{2611,7},constraint,[{atom,{2611,7},is_subtype},[{var,{2611,7},'MSAcc_Thread'},{type,{2611,23},map,[{type,{2611,31},map_field_exact,[{atom,{2611,26},type},{var,{2611,34},'MSAcc_Thread_Type'}]},{type,{2612,28},map_field_exact,[{atom,{2612,25},id},{var,{2612,31},'MSAcc_Thread_Id'}]},{type,{2613,34},map_field_exact,[{atom,{2613,25},counters},{var,{2613,37},'MSAcc_Counters'}]}]}]]},{type,{2614,7},constraint,[{atom,{2614,7},is_subtype},[{var,{2614,7},'MSAcc_Thread_Type'},{type,{2614,28},union,[{atom,{2614,28},async},{atom,{2614,36},aux},{atom,{2614,42},dirty_io_scheduler},{atom,{2615,28},dirty_cpu_scheduler},{atom,{2615,50},poll},{atom,{2615,57},scheduler}]}]]},{type,{2616,7},constraint,[{atom,{2616,7},is_subtype},[{var,{2616,7},'MSAcc_Thread_Id'},{type,{2616,26},non_neg_integer,[]}]]},{type,{2617,7},constraint,[{atom,{2617,7},is_subtype},[{var,{2617,7},'MSAcc_Counters'},{type,{2617,25},map,[{type,{2617,47},map_field_assoc,[{var,{2617,28},'MSAcc_Thread_State'},{type,{2617,50},non_neg_integer,[]}]}]}]]},{type,{2618,7},constraint,[{atom,{2618,7},is_subtype},[{var,{2618,7},'MSAcc_Thread_State'},{type,{2618,29},union,[{atom,{2618,29},alloc},{atom,{2618,37},aux},{atom,{2618,43},bif},{atom,{2618,49},busy_wait},{atom,{2618,61},check_io},{atom,{2619,29},emulator},{atom,{2619,40},ets},{atom,{2619,46},gc},{atom,{2619,51},gc_fullsweep},{atom,{2619,66},nif},{atom,{2620,29},other},{atom,{2620,37},port},{atom,{2620,44},send},{atom,{2620,51},sleep},{atom,{2620,59},timers}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,101,100,117,99,116,105,111,110,115,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,116,97,116,105,115,116,105,99,115,40,114,101,100,117,99,116,105,111,110,115,41,46,10,123,50,48,52,54,44,49,49,125>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,53,32,40,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,41,44,32,116,104,105,115,32,118,97,108,117,101,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,114,101,100,117,99,116,105,111,110,115,32,112,101,114,102,111,114,109,101,100,32,105,110,32,99,117,114,114,101,110,116,32,116,105,109,101,32,115,108,105,99,101,115,32,111,102,32,99,117,114,114,101,110,116,108,121,32,115,99,104,101,100,117,108,101,100,32,112,114,111,99,101,115,115,101,115,46,32,73,102,32,97,110,32,101,120,97,99,116,32,118,97,108,117,101,32,105,115,32,119,97,110,116,101,100,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,101,120,97,99,116,95,114,101,100,117,99,116,105,111,110,115,41>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,52,57,54>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2621,17},bounded_fun,[{type,{2621,17},'fun',[{type,{2621,17},product,[{atom,{2621,18},reductions}]},{type,{2621,33},tuple,[{var,{2621,34},'Total_Reductions'},{var,{2622,34},'Reductions_Since_Last_Call'}]}]},[{type,{2623,7},constraint,[{atom,{2623,7},is_subtype},[{var,{2623,7},'Total_Reductions'},{type,{2623,27},non_neg_integer,[]}]]},{type,{2624,7},constraint,[{atom,{2624,7},is_subtype},[{var,{2624,7},'Reductions_Since_Last_Call'},{type,{2624,37},non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,111,116,97,108,32,108,101,110,103,116,104,32,111,102,32,97,108,108,32,110,111,114,109,97,108,32,97,110,100,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,97,116,32,105,115,44,32,113,117,101,117,101,100,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,116,104,105,115,32,111,112,101,114,97,116,105,111,110,32,105,115,32,109,117,99,104,32,109,111,114,101,32,101,120,112,101,110,115,105,118,101,32,99,111,109,112,97,114,101,100,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32,101,115,112,101,99,105,97,108,108,121,32,119,104,101,110,32,97,32,108,97,114,103,101,32,97,109,111,117,110,116,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,117,115,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,49,53>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2625,17},'fun',[{type,{2625,17},product,[{atom,{2625,18},run_queue}]},{type,{2625,32},non_neg_integer,[]}]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<32,119,105,116,104,32,116,104,101,32,101,120,99,101,112,116,105,111,110,32,116,104,97,116,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,114,117,110,32,113,117,101,117,101,115,32,119,105,116,104,32,119,111,114,107,32,116,104,97,116,32,105,115,32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,67,80,85,32,98,111,117,110,100,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,51,49>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2626,17},bounded_fun,[{type,{2626,17},'fun',[{type,{2626,17},product,[{atom,{2626,18},run_queue_lengths}]},{type,{2626,40},list,[{var,{2626,41},'RunQueueLength'}]}]},[{type,{2627,7},constraint,[{atom,{2627,7},is_subtype},[{var,{2627,7},'RunQueueLength'},{type,{2627,25},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,119,104,101,114,101,32,101,97,99,104,32,101,108,101,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,114,101,97,100,121,32,116,111,32,114,117,110,32,102,111,114,32,101,97,99,104,32,114,117,110,32,113,117,101,117,101,46,32,86,97,108,117,101,115,32,102,111,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,97,114,101,32,108,111,99,97,116,101,100,32,102,105,114,115,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,32,111,102,32,115,99,104,101,100,117,108,101,114,32,110,117,109,98,101,114,32,49,32,97,110,100,32,115,111,32,111,110,46,32,73,102,32,115,117,112,112,111,114,116,32,102,111,114,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,44,32,118,97,108,117,101,115,32,102,111,114,32,116,104,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,116,104,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,32,102,111,108,108,111,119,32,40,105,110,32,116,104,97,116,32,111,114,100,101,114,41,32,97,116,32,116,104,101,32,101,110,100,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,103,97,116,104,101,114,101,100,32,97,116,111,109,105,99,97,108,108,121,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,110,111,116,32,110,101,99,101,115,115,97,114,105,108,121,32,97,32,99,111,110,115,105,115,116,101,110,116,32,115,110,97,112,115,104,111,116,32,111,102,32,116,104,101,32,115,116,97,116,101,44,32,98,117,116,32,105,110,115,116,101,97,100,32,113,117,105,116,101,32,101,102,102,105,99,105,101,110,116,108,121,32,103,97,116,104,101,114,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<69,97,99,104,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,111,110,101,32,114,117,110,32,113,117,101,117,101,32,116,104,97,116,32,105,116,32,109,97,110,97,103,101,115,46,32,73,102,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,108,108,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,44,32,97,110,100,32,97,108,108,32,100,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,115,104,97,114,101,32,111,110,101,32,114,117,110,32,113,117,101,117,101,46,32,84,104,97,116,32,105,115,44,32,119,101,32,104,97,118,101,32,109,117,108,116,105,112,108,101,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,44,32,111,110,101,32,100,105,114,116,121,32,67,80,85,32,114,117,110,32,113,117,101,117,101,32,97,110,100,32,111,110,101,32,100,105,114,116,121,32,73,79,32,114,117,110,32,113,117,101,117,101,46,32,87,111,114,107,32,99,97,110,32>>,{em,[],[<<110,111,116>>]},<<32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,116,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,114,117,110,32,113,117,101,117,101,115,46,32,79,110,108,121,32,119,111,114,107,32,105,110,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,32,99,97,110,32,109,105,103,114,97,116,101,32,116,111,32,111,116,104,101,114,32,110,111,114,109,97,108,32,114,117,110,32,113,117,101,117,101,115,46,32,84,104,105,115,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,105,110,116,111,32,97,99,99,111,117,110,116,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,116,111,116,97,108,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,52,54>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2628,17},bounded_fun,[{type,{2628,17},'fun',[{type,{2628,17},product,[{atom,{2628,18},run_queue_lengths_all}]},{type,{2628,44},list,[{var,{2628,45},'RunQueueLength'}]}]},[{type,{2629,7},constraint,[{atom,{2629,7},is_subtype},[{var,{2629,7},'RunQueueLength'},{type,{2629,25},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,114,117,110,116,105,109,101,44,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46>>]},{p,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,102,111,114,32,97,108,108,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,97,110,100,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,119,97,108,108,32,99,108,111,99,107,32,116,105,109,101,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,118,97,108,117,101,32,109,105,103,104,116,32,119,114,97,112,32,100,117,101,32,116,111,32,108,105,109,105,116,97,116,105,111,110,115,32,105,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,112,114,111,118,105,100,101,100,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,116,104,97,116,32,105,115,32,117,115,101,100,46>>]}]},{p,[],[<<69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,115,116,97,116,105,115,116,105,99,115,40,114,117,110,116,105,109,101,41,46,10,123,49,54,57,48,44,49,54,50,48,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,53,56,57>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2630,17},bounded_fun,[{type,{2630,17},'fun',[{type,{2630,17},product,[{atom,{2630,18},runtime}]},{type,{2630,30},tuple,[{var,{2630,31},'Total_Run_Time'},{var,{2630,47},'Time_Since_Last_Call'}]}]},[{type,{2631,7},constraint,[{atom,{2631,7},is_subtype},[{var,{2631,7},'Total_Run_Time'},{type,{2631,25},non_neg_integer,[]}]]},{type,{2632,7},constraint,[{atom,{2632,7},is_subtype},[{var,{2632,7},'Time_Since_Last_Call'},{type,{2632,31},non_neg_integer,[]}]]}]]}]}}]}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,100,101,115,99,114,105,98,105,110,103,32,104,111,119,32,109,117,99,104,32,116,105,109,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<110,111,114,109,97,108>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,114,116,121,32,67,80,85>>]},<<32,115,99,104,101,100,117,108,101,114,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,104,97,118,101,32,98,101,101,110,32,98,117,115,121,46,32,84,104,105,115,32,118,97,108,117,101,32,105,115,32,110,111,114,109,97,108,108,121,32,97,32,98,101,116,116,101,114,32,105,110,100,105,99,97,116,111,114,32,111,102,32,104,111,119,32,109,117,99,104,32,108,111,97,100,32,97,110,32,69,114,108,97,110,103,32,110,111,100,101,32,105,115,32,117,110,100,101,114,32,105,110,115,116,101,97,100,32,111,102,32,108,111,111,107,105,110,103,32,97,116,32,116,104,101,32,67,80,85,32,117,116,105,108,105,122,97,116,105,111,110,32,112,114,111,118,105,100,101,100,32,98,121,32,116,111,111,108,115,32,115,117,99,104,32,97,115,32>>,{code,[],[<<116,111,112>>]},<<32,111,114,32>>,{code,[],[<<115,121,115,115,116,97,116>>]},<<46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,97,108,115,111,32,105,110,99,108,117,100,101,115,32,116,105,109,101,32,119,104,101,114,101,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,105,115,32,119,97,105,116,105,110,103,32,102,111,114,32,115,111,109,101,32,111,116,104,101,114,32,114,101,97,115,111,117,114,99,101,32,40,115,117,99,104,32,97,115,32,97,110,32,105,110,116,101,114,110,97,108,32,109,117,116,101,120,41,32,116,111,32,98,101,32,97,118,97,105,108,97,98,108,101,32,98,117,116,32,100,111,101,115,32,110,111,116,32,117,115,101,32,116,104,101,32,67,80,85,46,32,73,110,32,111,114,100,101,114,32,116,111,32,98,101,116,116,101,114,32,117,110,100,101,114,115,116,97,110,100,32,119,104,97,116,32,97,32,115,99,104,101,100,117,108,101,114,32,105,115,32,98,117,115,121,32,100,111,105,110,103,32,121,111,117,32,99,97,110,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103>>]},<<46>>]},{p,[],[<<84,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,98,117,115,121,32,115,99,104,101,100,117,108,101,114,32,105,115,32,119,104,101,110,32,105,116,32,105,115,32,110,111,116,32,105,100,108,101,32,97,110,100,32,110,111,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,119,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<98,117,115,121,32,119,97,105,116,105,110,103>>]},<<32,102,111,114,32,110,101,119,32,119,111,114,107,44,32,116,104,97,116,32,105,115,58>>]},{ul,[],[{li,[],[<<69,120,101,99,117,116,105,110,103,32,112,114,111,99,101,115,115,32,99,111,100,101>>]},{li,[],[<<69,120,101,99,117,116,105,110,103,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,111,114,32,78,73,70,32,99,111,100,101>>]},{li,[],[<<69,120,101,99,117,116,105,110,103,32,66,73,70,115,44,32,111,114,32,97,110,121,32,111,116,104,101,114,32,114,117,110,116,105,109,101,32,104,97,110,100,108,105,110,103>>]},{li,[],[<<71,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103>>]},{li,[],[<<72,97,110,100,108,105,110,103,32,97,110,121,32,111,116,104,101,114,32,109,101,109,111,114,121,32,109,97,110,97,103,101,109,101,110,116>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,32,115,99,104,101,100,117,108,101,114,32,99,97,110,32,97,108,115,111,32,98,101,32,98,117,115,121,32,101,118,101,110,32,105,102,32,116,104,101,32,79,83,32,104,97,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,117,115,101,32,116,104,101,32,109,111,100,117,108,101,32>>,{a,[{href,<<114,117,110,116,105,109,101,95,116,111,111,108,115,58,115,99,104,101,100,117,108,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114>>]}]},<<32,105,110,115,116,101,97,100,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,100,105,114,101,99,116,108,121,32,97,115,32,105,116,32,112,114,111,118,105,100,101,115,32,97,110,32,101,97,115,105,101,114,32,119,97,121,32,116,111,32,103,101,116,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,116,104,97,116,32,121,111,117,32,117,115,117,97,108,108,121,32,119,97,110,116,46>>]}]},{p,[],[<<73,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,110,97,98,108,101,100>>]},<<32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,119,105,116,104,32>>,{code,[],[<<123,83,99,104,101,100,117,108,101,114,73,100,44,32,65,99,116,105,118,101,84,105,109,101,44,32,84,111,116,97,108,84,105,109,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<83,99,104,101,100,117,108,101,114,73,100>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,73,68,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,44,32>>,{code,[],[<<65,99,116,105,118,101,84,105,109,101>>]},<<32,105,115,32,116,104,101,32,100,117,114,97,116,105,111,110,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,104,97,115,32,98,101,101,110,32,98,117,115,121,44,32,97,110,100,32>>,{code,[],[<<84,111,116,97,108,84,105,109,101>>]},<<32,105,115,32,116,104,101,32,116,111,116,97,108,32,116,105,109,101,32,100,117,114,97,116,105,111,110,32,115,105,110,99,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]}]},<<32,97,99,116,105,118,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,46,32,84,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,116,117,114,110,101,100,32,105,115,32,117,110,100,101,102,105,110,101,100,32,97,110,100,32,99,97,110,32,98,101,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,98,101,116,119,101,101,110,32,114,101,108,101,97,115,101,115,44,32,79,83,115,44,32,97,110,100,32,115,121,115,116,101,109,32,114,101,115,116,97,114,116,115,46,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,99,97,108,99,117,108,97,116,101,32,114,101,108,97,116,105,118,101,32,118,97,108,117,101,115,32,102,111,114,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,46,32,84,104,101,32>>,{code,[],[<<65,99,116,105,118,101,84,105,109,101>>]},<<32,99,97,110,32,110,101,118,101,114,32,101,120,99,101,101,100,32>>,{code,[],[<<84,111,116,97,108,84,105,109,101>>]},<<46,32,84,104,101,32,108,105,115,116,32,111,102,32,115,99,104,101,100,117,108,101,114,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,115,111,114,116,101,100,32,97,110,100,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,100,105,102,102,101,114,101,110,116,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,99,97,108,108,115,46>>]},{p,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,115,97,98,108,101,100>>]},<<32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<84,104,101,32,97,99,116,105,118,97,116,105,111,110,32,116,105,109,101,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,32,97,116,32,115,121,115,116,101,109,32,115,116,97,114,116,32,119,104,105,108,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,97,116,101,100,32,115,111,109,101,32,116,105,109,101,32,97,102,116,101,114,32,116,104,101,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,102,117,110,99,116,105,111,110,97,108,105,116,121,32,105,115,32,101,110,97,98,108,101,100,46>>]},{p,[],[<<79,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,99,104,101,100,117,108,101,114,115,32,116,104,97,116,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,104,97,110,100,108,101,32,67,80,85,32,98,111,117,110,100,32,119,111,114,107,32,105,115,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,102,114,111,109,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,73,102,32,121,111,117,32,97,108,115,111,32,119,97,110,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115>>]},<<44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,95,97,108,108,41>>]}]},<<32,105,110,115,116,101,97,100,46>>]},{p,[],[<<78,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<49,32,61,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46,32,68,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,104,97,110,100,108,101,32,115,112,101,99,105,102,105,99,32,116,121,112,101,115,32,111,102,32,106,111,98,115,46,32,69,118,101,114,121,32,106,111,98,32,105,115,32,97,115,115,105,103,110,101,100,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,115,99,104,101,100,117,108,101,114,32,116,121,112,101,46,32,74,111,98,115,32,99,97,110,32,109,105,103,114,97,116,101,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,116,104,101,32,115,97,109,101,32,116,121,112,101,44,32,98,117,116,32,110,101,118,101,114,32,98,101,116,119,101,101,110,32,115,99,104,101,100,117,108,101,114,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,116,121,112,101,115,46,32,84,104,105,115,32,102,97,99,116,32,104,97,115,32,116,111,32,98,101,32,116,97,107,101,110,32,117,110,100,101,114,32,99,111,110,115,105,100,101,114,97,116,105,111,110,32,119,104,101,110,32,101,118,97,108,117,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,114,101,116,117,114,110,101,100,46>>]}]},{p,[],[<<89,111,117,32,99,97,110,32,117,115,101,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,116,111,32,99,97,108,99,117,108,97,116,101,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,46,32,70,105,114,115,116,32,121,111,117,32,116,97,107,101,32,97,32,115,97,109,112,108,101,32,111,102,32,116,104,101,32,118,97,108,117,101,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41>>]},<<46>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41,46,10,102,97,108,115,101,10,62,32,84,115,48,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,111,107>>]}]},{p,[],[<<83,111,109,101,32,116,105,109,101,32,108,97,116,101,114,32,116,104,101,32,117,115,101,114,32,116,97,107,101,115,32,97,110,111,116,104,101,114,32,115,110,97,112,115,104,111,116,32,97,110,100,32,99,97,108,99,117,108,97,116,101,115,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,112,101,114,32,115,99,104,101,100,117,108,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,84,115,49,32,61,32,108,105,115,116,115,58,115,111,114,116,40,101,114,108,97,110,103,58,115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41,41,44,32,111,107,46,10,111,107,10,62,32,108,105,115,116,115,58,109,97,112,40,102,117,110,40,123,123,73,44,32,65,48,44,32,84,48,125,44,32,123,73,44,32,65,49,44,32,84,49,125,125,41,32,45,62,10,9,123,73,44,32,40,65,49,32,45,32,65,48,41,47,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,46,10,91,123,49,44,48,46,57,55,52,51,52,55,52,55,51,48,49,55,55,53,52,56,125,44,10,32,123,50,44,48,46,57,55,52,52,56,52,51,55,56,50,55,53,49,52,52,52,125,44,10,32,123,51,44,48,46,57,57,57,53,57,48,50,51,54,49,54,54,57,48,52,53,125,44,10,32,123,52,44,48,46,57,55,51,56,48,49,50,53,57,54,53,55,50,49,54,49,125,44,10,32,123,53,44,48,46,57,55,49,55,57,53,54,54,54,55,48,49,56,49,48,51,125,44,10,32,123,54,44,48,46,57,55,51,57,50,51,53,56,52,54,52,50,48,55,52,49,125,44,10,32,123,55,44,48,46,57,55,51,50,51,55,48,51,51,48,55,55,56,55,54,125,44,10,32,123,56,44,48,46,57,55,52,49,50,57,55,50,57,51,50,52,56,54,53,54,125,93>>]}]},{p,[],[<<85,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,110,97,112,115,104,111,116,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,97,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,58>>]},{pre,[],[{code,[],[<<62,32,123,65,44,32,84,125,32,61,32,108,105,115,116,115,58,102,111,108,100,108,40,102,117,110,40,123,123,95,44,32,65,48,44,32,84,48,125,44,32,123,95,44,32,65,49,44,32,84,49,125,125,44,32,123,65,105,44,84,105,125,41,32,45,62,10,9,123,65,105,32,43,32,40,65,49,32,45,32,65,48,41,44,32,84,105,32,43,32,40,84,49,32,45,32,84,48,41,125,32,101,110,100,44,32,123,48,44,32,48,125,44,32,108,105,115,116,115,58,122,105,112,40,84,115,48,44,84,115,49,41,41,44,10,9,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,65,47,84,46,10,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53>>]}]},{p,[],[<<84,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,101,113,117,97,108,32>>,{code,[],[<<49,46,48>>]},<<32,119,104,101,110,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,101,101,110,32,97,99,116,105,118,101,32,97,108,108,32,116,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,32,116,119,111,32,109,101,97,115,117,114,101,109,101,110,116,115,46>>]},{p,[],[<<65,110,111,116,104,101,114,32,40,112,114,111,98,97,98,108,121,32,109,111,114,101,41,32,117,115,101,102,117,108,32,118,97,108,117,101,32,105,115,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,111,116,97,108,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,101,105,103,104,116,101,100,32,97,103,97,105,110,115,116,32,109,97,120,105,109,117,109,32,97,109,111,117,110,116,32,111,102,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,58>>]},{pre,[],[{code,[],[<<62,32,87,101,105,103,104,116,101,100,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,32,61,32,40,84,111,116,97,108,83,99,104,101,100,117,108,101,114,85,116,105,108,105,122,97,116,105,111,110,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,42,32,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,41,41,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,47,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101,41,46,10,48,46,57,55,54,57,49,51,54,56,48,51,55,54,52,56,50,53>>]}]},{p,[],[<<84,104,105,115,32,119,101,105,103,104,116,101,100,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,119,105,108,108,32,114,101,97,99,104,32>>,{code,[],[<<49,46,48>>]},<<32,119,104,101,110,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,99,116,105,118,101,32,116,104,101,32,115,97,109,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,97,115,32,109,97,120,105,109,117,109,32,97,118,97,105,108,97,98,108,101,32,67,80,85,32,116,105,109,101,46,32,73,102,32,109,111,114,101,32,115,99,104,101,100,117,108,101,114,115,32,101,120,105,115,116,32,116,104,97,110,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,118,97,108,117,101,32,109,97,121,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32>>,{code,[],[<<49,46,48>>]},<<46>>]},{p,[],[<<65,115,32,111,102,32,69,82,84,83,32,118,101,114,115,105,111,110,32,57,46,48,44,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,32,97,115,32,100,101,102,97,117,108,116,32,104,97,118,101,32,109,111,114,101,32,115,99,104,101,100,117,108,101,114,115,32,116,104,97,110,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,105,115,32,100,117,101,32,116,111,32,116,104,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>]},<<32,105,115,32,98,121,32,100,101,102,97,117,108,116,32,100,105,115,97,98,108,101,100,46,32,84,111,32,101,110,97,98,108,101,32,105,116,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,44,32,116,114,117,101,41>>]}]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,54,48,55>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2633,17},bounded_fun,[{type,{2633,17},'fun',[{type,{2633,17},product,[{atom,{2633,18},scheduler_wall_time}]},{type,{2633,42},union,[{type,{2633,42},list,[{type,{2633,43},tuple,[{var,{2633,44},'SchedulerId'},{var,{2633,57},'ActiveTime'},{var,{2633,69},'TotalTime'}]}]},{atom,{2633,83},undefined}]}]},[{type,{2634,7},constraint,[{atom,{2634,7},is_subtype},[{var,{2634,7},'SchedulerId'},{type,{2634,22},pos_integer,[]}]]},{type,{2635,7},constraint,[{atom,{2635,7},is_subtype},[{var,{2635,7},'ActiveTime'},{type,{2635,22},non_neg_integer,[]}]]},{type,{2636,7},constraint,[{atom,{2636,7},is_subtype},[{var,{2636,7},'TotalTime'},{type,{2636,22},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41>>]}]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,97,108,115,111,32,105,110,99,108,117,100,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,108,108,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,46>>]},{p,[],[<<68,105,114,116,121,32,73,79,32,115,99,104,101,100,117,108,101,114,115,32,119,105,108,108,32,104,97,118,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},{code,[],[<<32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},{code,[],[<<32,60,32,83,99,104,101,100,117,108,101,114,73,100,32,61,60,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41,32,43,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41,32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,119,111,114,107,32,101,120,101,99,117,116,105,110,103,32,111,110,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,101,120,112,101,99,116,101,100,32,116,111,32,109,97,105,110,108,121,32,119,97,105,116,32,102,111,114,32,73,47,79,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,32,121,111,117,32,103,101,116,32,104,105,103,104,32,115,99,104,101,100,117,108,101,114,32,117,116,105,108,105,122,97,116,105,111,110,32,111,110,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,44,32,67,80,85,32,117,116,105,108,105,122,97,116,105,111,110,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,101,120,112,101,99,116,101,100,32,116,111,32,98,101,32,104,105,103,104,32,100,117,101,32,116,111,32,116,104,105,115,32,119,111,114,107,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,55,53,50>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2637,17},bounded_fun,[{type,{2637,17},'fun',[{type,{2637,17},product,[{atom,{2637,18},scheduler_wall_time_all}]},{type,{2637,46},union,[{type,{2637,46},list,[{type,{2637,47},tuple,[{var,{2637,48},'SchedulerId'},{var,{2637,61},'ActiveTime'},{var,{2637,73},'TotalTime'}]}]},{atom,{2637,87},undefined}]}]},[{type,{2638,7},constraint,[{atom,{2638,7},is_subtype},[{var,{2638,7},'SchedulerId'},{type,{2638,22},pos_integer,[]}]]},{type,{2639,7},constraint,[{atom,{2639,7},is_subtype},[{var,{2639,7},'ActiveTime'},{type,{2639,22},non_neg_integer,[]}]]},{type,{2640,7},constraint,[{atom,{2640,7},is_subtype},[{var,{2640,7},'TotalTime'},{type,{2640,22},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,55,56,48>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2641,3},bounded_fun,[{type,{2641,3},'fun',[{type,{2641,3},product,[{atom,{2641,4},total_active_tasks}]},{var,{2641,27},'ActiveTasks'}]},[{type,{2642,7},constraint,[{atom,{2642,7},is_subtype},[{var,{2642,7},'ActiveTasks'},{type,{2642,22},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,97,99,116,105,118,101,95,116,97,115,107,115,95,97,108,108,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,55,57,49>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2643,3},bounded_fun,[{type,{2643,3},'fun',[{type,{2643,3},product,[{atom,{2643,4},total_active_tasks_all}]},{var,{2643,31},'ActiveTasks'}]},[{type,{2644,7},constraint,[{atom,{2644,7},is_subtype},[{var,{2644,7},'ActiveTasks'},{type,{2644,22},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,48,50>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2645,17},bounded_fun,[{type,{2645,17},'fun',[{type,{2645,17},product,[{atom,{2645,18},total_run_queue_lengths}]},{var,{2645,46},'TotalRunQueueLengths'}]},[{type,{2646,7},constraint,[{atom,{2646,7},is_subtype},[{var,{2646,7},'TotalRunQueueLengths'},{type,{2646,31},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,51>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<108,105,115,116,115,58,115,117,109,40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,114,117,110,95,113,117,101,117,101,95,108,101,110,103,116,104,115,95,97,108,108,41>>]}]},{code,[],[<<41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,49,51>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2647,17},bounded_fun,[{type,{2647,17},'fun',[{type,{2647,17},product,[{atom,{2647,18},total_run_queue_lengths_all}]},{var,{2647,50},'TotalRunQueueLengths'}]},[{type,{2648,7},constraint,[{atom,{2648,7},is_subtype},[{var,{2648,7},'TotalRunQueueLengths'},{type,{2648,31},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,statistics,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2594}],[<<115,116,97,116,105,115,116,105,99,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,119,97,108,108,32,99,108,111,99,107,46,32>>,{code,[],[<<119,97,108,108,95,99,108,111,99,107>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,32,116,104,101,32,115,97,109,101,32,109,97,110,110,101,114,32,97,115,32>>,{code,[],[<<114,117,110,116,105,109,101>>]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,114,101,97,108,32,116,105,109,101,32,105,115,32,109,101,97,115,117,114,101,100,32,97,115,32,111,112,112,111,115,101,100,32,116,111,32,114,117,110,116,105,109,101,32,111,114,32,67,80,85,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,50,52>>,signature => [{attribute,{2594,2},spec,{{statistics,1},[{type,{2649,17},bounded_fun,[{type,{2649,17},'fun',[{type,{2649,17},product,[{atom,{2649,18},wall_clock}]},{type,{2649,33},tuple,[{var,{2649,34},'Total_Wallclock_Time'},{var,{2650,34},'Wallclock_Time_Since_Last_Call'}]}]},[{type,{2651,7},constraint,[{atom,{2651,7},is_subtype},[{var,{2651,7},'Total_Wallclock_Time'},{type,{2651,31},non_neg_integer,[]}]]},{type,{2652,7},constraint,[{atom,{2652,7},is_subtype},[{var,{2652,7},'Wallclock_Time_Since_Last_Call'},{type,{2652,41},non_neg_integer,[]}]]}]]}]}}]}},{{function,suspend_process,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2005}],[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,49>>],#{<<101,110>> => [{p,[],[<<83,117,115,112,101,110,100,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,44,32,91,93,41>>]}]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,51,53>>,signature => [{attribute,{2005,2},spec,{{erlang,suspend_process,1},[{type,{2005,29},bounded_fun,[{type,{2005,29},'fun',[{type,{2005,29},product,[{var,{2005,30},'Suspendee'}]},{atom,{2005,44},true}]},[{type,{2006,7},constraint,[{atom,{2006,7},is_subtype},[{var,{2006,7},'Suspendee'},{type,{2006,20},pid,[]}]]}]]}]}}]}},{{function,suspend_process,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1989}],[<<115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>],#{<<101,110>> => [{p,[],[<<73,110,99,114,101,97,115,101,115,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,97,110,100,32,112,117,116,115,32,105,116,32,105,110,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,32,105,102,32,105,116,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,105,110,32,116,104,97,116,32,115,116,97,116,101,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,115,99,104,101,100,117,108,101,100,32,102,111,114,32,101,120,101,99,117,116,105,111,110,32,117,110,116,105,108,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,115,32,98,101,101,110,32,114,101,115,117,109,101,100,46>>]},{p,[],[<<65,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,98,121,32,109,117,108,116,105,112,108,101,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,99,97,110,32,98,101,32,115,117,115,112,101,110,100,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,98,121,32,97,32,115,105,110,103,108,101,32,112,114,111,99,101,115,115,46,32,65,32,115,117,115,112,101,110,100,101,100,32,112,114,111,99,101,115,115,32,100,111,101,115,32,110,111,116,32,108,101,97,118,101,32,116,104,101,32,115,117,115,112,101,110,100,101,100,32,115,116,97,116,101,32,117,110,116,105,108,32,105,116,115,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,114,101,97,99,104,101,115,32,122,101,114,111,46,32,84,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,102,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,115,117,109,101,95,112,114,111,99,101,115,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]}]},<<32,105,115,32,99,97,108,108,101,100,32,98,121,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,99,97,108,108,101,100,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]},<<46,32,65,108,108,32,105,110,99,114,101,97,115,101,100,32,115,117,115,112,101,110,100,32,99,111,117,110,116,115,32,111,110,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,97,99,113,117,105,114,101,100,32,98,121,32,97,32,112,114,111,99,101,115,115,32,97,114,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,46>>]},{p,[],[<<79,112,116,105,111,110,115,32,40>>,{code,[],[<<79,112,116>>]},<<115,41,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]}]},{dd,[],[{p,[],[<<65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,101,118,101,110,116,117,97,108,108,121,32,115,117,115,112,101,110,100,115,32,117,110,108,101,115,115,32,105,116,32,105,115,32,114,101,115,117,109,101,100,32,98,101,102,111,114,101,32,105,116,32,99,111,117,108,100,32,115,117,115,112,101,110,100,46,32,84,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<32,114,101,116,117,114,110,115,32,105,109,109,101,100,105,97,116,101,108,121,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,116,104,101,114,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,115,117,115,112,101,110,100,101,100,32,121,101,116,32,111,114,32,110,111,116,46,32,84,104,101,32,112,111,105,110,116,32,105,110,32,116,105,109,101,32,119,104,101,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,115,117,115,112,101,110,100,115,32,99,97,110,110,111,116,32,98,101,32,100,101,100,117,99,101,100,32,102,114,111,109,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32>>,{em,[],[<<101,118,101,110,116,117,97,108,108,121>>]},<<32,115,117,115,112,101,110,100,115,32,40,117,110,108,101,115,115,32,105,116,32,105,115,32,114,101,115,117,109,101,100,41,46,32,73,102,32,110,111,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,111,112,116,105,111,110,115,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<32,105,115,32,98,108,111,99,107,101,100,32,117,110,116,105,108,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,115,117,115,112,101,110,100,101,100,46>>]}]},{dt,[],[{code,[],[<<123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125>>]}]},{dd,[],[{p,[],[<<65,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32,87,104,101,110,32,116,104,101,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,104,97,115,32,98,101,101,110,32,112,114,111,99,101,115,115,101,100,44,32,97,32,114,101,112,108,121,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46,32,84,104,101,32,114,101,112,108,121,32,105,115,32,111,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,82,101,112,108,121,84,97,103,44,32,83,116,97,116,101,125>>]},<<32,119,104,101,114,101,32>>,{code,[],[<<83,116,97,116,101>>]},<<32,105,115,32,101,105,116,104,101,114,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,105,116,101,100>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,101,120,105,116,101,100,46>>]}]},{dt,[],[{code,[],[<<115,117,115,112,101,110,100,101,100>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,119,32,115,117,115,112,101,110,100,101,100,46>>]}]},{dt,[],[{code,[],[<<110,111,116,95,115,117,115,112,101,110,100,101,100>>]}]},{dd,[],[{p,[],[{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,115,117,115,112,101,110,100,101,100,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,104,97,112,112,101,110,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,105,115,115,117,101,100,32,116,104,105,115,32,114,101,113,117,101,115,116,44,32,104,97,118,101,32,99,97,108,108,101,100,32>>,{code,[],[<<114,101,115,117,109,101,95,112,114,111,99,101,115,115,40,83,117,115,112,101,110,100,101,101,41>>]},<<32,98,101,102,111,114,101,32,103,101,116,116,105,110,103,32,116,104,101,32,114,101,112,108,121,46>>]}]}]},{p,[],[<<65,112,97,114,116,32,102,114,111,109,32,116,104,101,32,114,101,112,108,121,32,109,101,115,115,97,103,101,44,32,116,104,101,32>>,{code,[],[<<123,97,115,121,110,99,104,114,111,110,111,117,115,44,32,82,101,112,108,121,84,97,103,125>>]},<<32,111,112,116,105,111,110,32,98,101,104,97,118,101,115,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,111,112,116,105,111,110,32,119,105,116,104,111,117,116,32,114,101,112,108,121,32,116,97,103,46>>]}]},{dt,[],[{code,[],[<<117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,115,117,115,112,101,110,100,101,100,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<46,32,73,102,32>>,{code,[],[<<117,110,108,101,115,115,95,115,117,115,112,101,110,100,105,110,103>>]},<<32,105,115,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<44,32,97,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,105,115,32,115,101,110,116,32,117,110,108,101,115,115,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,111,114,32,105,102,32,97,32,115,117,115,112,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,104,97,115,32,98,101,101,110,32,115,101,110,116,32,97,110,100,32,105,115,32,105,110,32,116,114,97,110,115,105,116,46,32,73,102,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,108,114,101,97,100,121,32,105,115,32,115,117,115,112,101,110,100,105,110,103,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<44,32,111,114,32,105,102,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<97,115,121,110,99,104,114,111,110,111,117,115>>]},<<32,97,110,100,32,97,32,115,101,110,100,32,114,101,113,117,101,115,116,32,97,108,114,101,97,100,121,32,105,115,32,105,110,32,116,114,97,110,115,105,116,44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,97,110,100,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,114,101,109,97,105,110,115,32,117,110,99,104,97,110,103,101,100,46>>]}]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,115,112,101,110,100,32,99,111,117,110,116,32,111,110,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,105,110,99,114,101,97,115,101,100,44,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,66,73,70,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<89,111,117,32,99,97,110,32,101,97,115,105,108,121,32,99,114,101,97,116,101,32,100,101,97,100,108,111,99,107,115,32,105,102,32,112,114,111,99,101,115,115,101,115,32,115,117,115,112,101,110,100,115,32,101,97,99,104,32,111,116,104,101,114,32,40,100,105,114,101,99,116,108,121,32,111,114,32,105,110,32,99,105,114,99,108,101,115,41,46,32,73,110,32,69,82,84,83,32,118,101,114,115,105,111,110,115,32,112,114,105,111,114,32,116,111,32,69,82,84,83,32,118,101,114,115,105,111,110,32,49,48,46,48,44,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,112,114,101,118,101,110,116,101,100,32,115,117,99,104,32,100,101,97,100,108,111,99,107,115,44,32,98,117,116,32,116,104,105,115,32,112,114,101,118,101,110,116,105,111,110,32,104,97,115,32,110,111,119,32,98,101,101,110,32,114,101,109,111,118,101,100,32,100,117,101,32,116,111,32,112,101,114,102,111,114,109,97,110,99,101,32,114,101,97,115,111,110,115,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,32,97,115,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,115,117,115,112,101,110,100,95,112,114,111,99,101,115,115,47,50>>]},<<46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,105,115,32,110,111,116,32,97,108,105,118,101,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,114,101,115,105,100,101,115,32,111,110,32,97,110,111,116,104,101,114,32,110,111,100,101,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<79,112,116,76,105,115,116>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,32,111,102,32,118,97,108,105,100,32>>,{code,[],[<<79,112,116>>]},<<115,46>>]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[<<73,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<83,117,115,112,101,110,100,101,101>>]},<<32,104,97,115,32,98,101,101,110,32,115,117,115,112,101,110,100,101,100,32,109,111,114,101,32,116,105,109,101,115,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,116,104,97,110,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,105,110,116,101,114,110,97,108,32,100,97,116,97,32,115,116,114,117,99,116,117,114,101,115,46,32,84,104,101,32,115,121,115,116,101,109,32,108,105,109,105,116,32,105,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,50,44,48,48,48,44,48,48,48,44,48,48,48,32,115,117,115,112,101,110,100,115,32,97,110,100,32,119,105,108,108,32,110,101,118,101,114,32,98,101,32,108,111,119,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,56,53,48>>,signature => [{attribute,{1989,2},spec,{{erlang,suspend_process,2},[{type,{1989,29},bounded_fun,[{type,{1989,29},'fun',[{type,{1989,29},product,[{var,{1989,30},'Suspendee'},{var,{1989,41},'OptList'}]},{type,{1989,53},boolean,[]}]},[{type,{1990,7},constraint,[{atom,{1990,7},is_subtype},[{var,{1990,7},'Suspendee'},{type,{1990,20},pid,[]}]]},{type,{1991,7},constraint,[{atom,{1991,7},is_subtype},[{var,{1991,7},'OptList'},{type,{1991,18},list,[{var,{1991,19},'Opt'}]}]]},{type,{1992,7},constraint,[{atom,{1992,7},is_subtype},[{var,{1992,7},'Opt'},{type,{1992,14},union,[{atom,{1992,14},unless_suspending},{atom,{1992,34},asynchronous},{type,{1992,49},tuple,[{atom,{1992,50},asynchronous},{type,{1992,64},term,[]}]}]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,99,97,108,108,32,115,116,97,99,107,32,98,97,99,107,45,116,114,97,99,101,115,32,105,110,32,116,104,101,32,101,120,105,116,32,114,101,97,115,111,110,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<39,69,88,73,84,39>>]},<<32,116,117,112,108,101,115,46,32,84,104,101,32,102,108,97,103,32,97,108,115,111,32,108,105,109,105,116,115,32,116,104,101,32,115,116,97,99,107,116,114,97,99,101,32,100,101,112,116,104,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<112,114,111,99,101,115,115,95,105,110,102,111>>]},<<32,105,116,101,109,32>>,{code,[],[<<99,117,114,114,101,110,116,95,115,116,97,99,107,116,114,97,99,101,46>>]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,56,57,57,54>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2672,25},bounded_fun,[{type,{2672,25},'fun',[{type,{2672,25},product,[{atom,{2672,26},backtrace_depth},{var,{2672,43},'Depth'}]},{var,{2672,53},'OldDepth'}]},[{type,{2673,7},constraint,[{atom,{2673,7},is_subtype},[{var,{2673,7},'Depth'},{type,{2673,16},non_neg_integer,[]}]]},{type,{2674,7},constraint,[{atom,{2674,7},is_subtype},[{var,{2674,7},'OldDepth'},{type,{2674,19},non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<99,112,117,95,116,111,112,111,108,111,103,121>>}],[]},{li,[{name,<<105,110,102,111,95,108,105,115,116>>}],[]},{li,[{name,<<108,101,118,101,108,95,101,110,116,114,121>>}],[]},{li,[{name,<<108,101,118,101,108,95,116,97,103>>}],[]},{li,[{name,<<115,117,98,95,108,101,118,101,108>>}],[]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[{em,[],[<<84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46>>]},<<32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,67,80,85,32,116,111,112,111,108,111,103,121,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46>>]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<46,32,84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,118,101,114,114,105,100,101,115,32,97,110,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,46,32,66,121,32,112,97,115,115,105,110,103,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,97,115,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<44,32,116,104,101,32,115,121,115,116,101,109,32,114,101,118,101,114,116,115,32,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,101,113,117,97,108,115,32,116,104,101,32,118,97,108,117,101,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41>>]},<<32,98,101,102,111,114,101,32,116,104,101,32,99,104,97,110,103,101,32,119,97,115,32,109,97,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,73,102,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,97,108,114,101,97,100,121,32,98,111,117,110,100,32,119,104,101,110,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,99,104,97,110,103,101,100,44,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,115,101,110,116,32,97,32,114,101,113,117,101,115,116,32,116,111,32,114,101,98,105,110,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,110,101,119,32,67,80,85,32,116,111,112,111,108,111,103,121,46>>]},{p,[],[<<84,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,116,121,112,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,97,110,100,32,109,111,114,101,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,99,112,117,95,116,111,112,111,108,111,103,121,41>>]}]},<<32,97,115,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,48,48,56>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2675,25},bounded_fun,[{type,{2675,25},'fun',[{type,{2675,25},product,[{atom,{2675,26},cpu_topology},{var,{2675,40},'CpuTopology'}]},{var,{2675,56},'OldCpuTopology'}]},[{type,{2676,7},constraint,[{atom,{2676,7},is_subtype},[{var,{2676,7},'CpuTopology'},{user_type,{2676,22},cpu_topology,[]}]]},{type,{2677,7},constraint,[{atom,{2677,7},is_subtype},[{var,{2677,7},'OldCpuTopology'},{user_type,{2677,25},cpu_topology,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,32>>,{code,[],[<<49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,99,104,97,110,103,101,32,105,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,104,97,110,103,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,111,110,108,105,110,101,44,32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>]},<<32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,48,53,54>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2678,25},bounded_fun,[{type,{2678,25},'fun',[{type,{2678,25},product,[{atom,{2678,26},dirty_cpu_schedulers_online},{var,{2678,55},'DirtyCPUSchedulersOnline'}]},{var,{2679,33},'OldDirtyCPUSchedulersOnline'}]},[{type,{2680,7},constraint,[{atom,{2680,7},is_subtype},[{var,{2680,7},'DirtyCPUSchedulersOnline'},{type,{2680,35},pos_integer,[]}]]},{type,{2681,7},constraint,[{atom,{2681,7},is_subtype},[{var,{2681,7},'OldDirtyCPUSchedulersOnline'},{type,{2681,38},pos_integer,[]}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<46,32>>,{code,[],[<<65,108,108,111,99>>]},<<32,105,115,32,116,104,101,32,97,108,108,111,99,97,116,111,114,32,116,111,32,97,102,102,101,99,116,44,32,102,111,114,32,101,120,97,109,112,108,101,32>>,{code,[],[<<98,105,110,97,114,121,95,97,108,108,111,99>>]},<<46,32>>,{code,[],[<<70>>]},<<32,105,115,32,116,104,101,32,102,108,97,103,32,116,111,32,99,104,97,110,103,101,32,97,110,100,32>>,{code,[],[<<86>>]},<<32,105,115,32,116,104,101,32,110,101,119,32,118,97,108,117,101,46>>]},{p,[],[<<79,110,108,121,32,97,32,115,117,98,115,101,116,32,111,102,32,97,108,108,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99>>]},<<32,102,108,97,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,32,116,105,109,101,46,32,84,104,105,115,32,115,117,98,115,101,116,32,105,115,32,99,117,114,114,101,110,116,108,121,32,111,110,108,121,32,116,104,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99,35,77,95,115,98,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<115,98,99,116>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,116,104,101,32,102,108,97,103,32,119,97,115,32,115,101,116,32,111,114,32>>,{code,[],[<<110,111,116,115,117,112>>]},<<32,105,102,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,48,56,53>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2682,25},bounded_fun,[{type,{2682,25},'fun',[{type,{2682,25},product,[{atom,{2682,26},erts_alloc},{type,{2682,38},tuple,[{var,{2682,39},'Alloc'},{var,{2682,46},'F'},{var,{2682,49},'V'}]}]},{type,{2682,56},union,[{atom,{2682,56},ok},{atom,{2682,61},notsup}]}]},[{type,{2683,7},constraint,[{atom,{2683,7},is_subtype},[{var,{2683,7},'Alloc'},{type,{2683,16},atom,[]}]]},{type,{2684,7},constraint,[{atom,{2684,7},is_subtype},[{var,{2684,7},'F'},{type,{2684,12},atom,[]}]]},{type,{2685,7},constraint,[{atom,{2685,7},is_subtype},[{var,{2685,7},'V'},{type,{2685,12},integer,[]}]]}]]}]}}],since => <<79,84,80,32,50,48,46,50,46,51>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,115,121,115,116,101,109,32,102,108,97,103,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<46,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,105,115,32,97,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,32,105,110,100,105,99,97,116,105,110,103,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,103,101,110,101,114,97,116,105,111,110,97,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,99,97,110,32,98,101,32,100,111,110,101,32,119,105,116,104,111,117,116,32,102,111,114,99,105,110,103,32,97,32,102,117,108,108,115,119,101,101,112,32,99,111,108,108,101,99,116,105,111,110,46,32,84,104,101,32,118,97,108,117,101,32,97,112,112,108,105,101,115,32,116,111,32,110,101,119,32,112,114,111,99,101,115,115,101,115,44,32,119,104,105,108,101,32,112,114,111,99,101,115,115,101,115,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<73,110,32,108,111,119,45,109,101,109,111,114,121,32,115,121,115,116,101,109,115,32,40,101,115,112,101,99,105,97,108,108,121,32,119,105,116,104,111,117,116,32,118,105,114,116,117,97,108,32,109,101,109,111,114,121,41,44,32,115,101,116,116,105,110,103,32,116,104,101,32,118,97,108,117,101,32,116,111,32>>,{code,[],[<<48>>]},<<32,99,97,110,32,104,101,108,112,32,116,111,32,99,111,110,115,101,114,118,101,32,109,101,109,111,114,121,46>>]},{p,[],[<<84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,116,104,114,111,117,103,104,32,40,79,83,41,32,101,110,118,105,114,111,110,109,101,110,116,32,118,97,114,105,97,98,108,101,32>>,{code,[],[<<69,82,76,95,70,85,76,76,83,87,69,69,80,95,65,70,84,69,82>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,48,50>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2686,25},bounded_fun,[{type,{2686,25},'fun',[{type,{2686,25},product,[{atom,{2686,26},fullsweep_after},{var,{2686,43},'Number'}]},{var,{2686,54},'OldNumber'}]},[{type,{2687,7},constraint,[{atom,{2687,7},is_subtype},[{var,{2687,7},'Number'},{type,{2687,17},non_neg_integer,[]}]]},{type,{2688,7},constraint,[{atom,{2688,7},is_subtype},[{var,{2688,7},'OldNumber'},{type,{2688,20},non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<84,117,114,110,115,32,111,110,47,111,102,102,32,109,105,99,114,111,115,116,97,116,101,32,97,99,99,111,117,110,116,105,110,103,32,109,101,97,115,117,114,101,109,101,110,116,115,46,32,87,104,101,110,32,112,97,115,115,105,110,103,32,114,101,115,101,116,44,32,97,108,108,32,99,111,117,110,116,101,114,115,32,97,114,101,32,114,101,115,101,116,32,116,111,32,48,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,109,105,99,114,111,115,116,97,116,101,95,97,99,99,111,117,110,116,105,110,103,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,50,49>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2689,25},bounded_fun,[{type,{2689,25},'fun',[{type,{2689,25},product,[{atom,{2689,26},microstate_accounting},{var,{2689,49},'Action'}]},{var,{2689,60},'OldState'}]},[{type,{2690,7},constraint,[{atom,{2690,7},is_subtype},[{var,{2690,7},'Action'},{type,{2690,17},union,[{atom,{2690,17},true},{atom,{2690,24},false},{atom,{2690,32},reset}]}]]},{type,{2691,7},constraint,[{atom,{2691,7},is_subtype},[{var,{2691,7},'OldState'},{type,{2691,19},union,[{atom,{2691,19},true},{atom,{2691,26},false}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32>>,{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]},<<32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32>>,{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]},<<32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32>>,{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,52>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,51,53>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2692,25},bounded_fun,[{type,{2692,25},'fun',[{type,{2692,25},product,[{atom,{2692,26},min_heap_size},{var,{2692,41},'MinHeapSize'}]},{var,{2692,57},'OldMinHeapSize'}]},[{type,{2693,7},constraint,[{atom,{2693,7},is_subtype},[{var,{2693,7},'MinHeapSize'},{type,{2693,22},non_neg_integer,[]}]]},{type,{2694,7},constraint,[{atom,{2694,7},is_subtype},[{var,{2694,7},'OldMinHeapSize'},{type,{2694,25},non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32>>,{code,[],[<<109,105,110,95,98,105,110,95,118,104,104,101,97,112,95,115,105,122,101>>]},<<32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,97,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32>>,{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]},<<32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32>>,{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,98,121,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,50,44,51,44,52>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,53,48>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2695,25},bounded_fun,[{type,{2695,25},'fun',[{type,{2695,25},product,[{atom,{2695,26},min_bin_vheap_size},{var,{2695,46},'MinBinVHeapSize'}]},{var,{2696,33},'OldMinBinVHeapSize'}]},[{type,{2697,7},constraint,[{atom,{2697,7},is_subtype},[{var,{2697,7},'MinBinVHeapSize'},{type,{2697,26},non_neg_integer,[]}]]},{type,{2698,7},constraint,[{atom,{2698,7},is_subtype},[{var,{2698,7},'OldMinBinVHeapSize'},{type,{2698,29},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,51,66,48,52>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,112,114,111,99,101,115,115,101,115,46,32,84,104,101,32,115,105,122,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,119,111,114,100,115,46,32,84,104,101,32,110,101,119,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,101,102,102,101,99,116,115,32,111,110,108,121,32,112,114,111,99,101,115,115,101,115,32,115,112,97,119,110,101,100,32,101,102,116,101,114,32,116,104,101,32,99,104,97,110,103,101,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,112,114,111,99,101,115,115,101,115,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,50,44,51,44,52>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,47,50>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,54,55>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2699,25},bounded_fun,[{type,{2699,25},'fun',[{type,{2699,25},product,[{atom,{2699,26},max_heap_size},{var,{2699,41},'MaxHeapSize'}]},{var,{2699,57},'OldMaxHeapSize'}]},[{type,{2700,7},constraint,[{atom,{2700,7},is_subtype},[{var,{2700,7},'MaxHeapSize'},{user_type,{2700,22},max_heap_size,[]}]]},{type,{2701,7},constraint,[{atom,{2701,7},is_subtype},[{var,{2701,7},'OldMaxHeapSize'},{user_type,{2701,25},max_heap_size,[]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,77,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,99,97,110,32,98,101,32,98,108,111,99,107,101,100,32,105,110,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,69,105,116,104,101,114,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,44,32,111,114,32,97,108,108,32>>,{em,[],[<<110,111,114,109,97,108>>]},<<32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,46,32,87,104,101,110,32,111,110,108,121,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,108,111,99,107,101,100,44,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,102,114,101,101,32,116,111,32,99,111,110,116,105,110,117,101,32,116,111,32,115,99,104,101,100,117,108,101,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107>>]},<<44,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,101,32,97,110,100,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,46,32,73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107>>]},<<32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,32,98,108,111,99,107,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,98,108,111,99,107,95,110,111,114,109,97,108>>]},<<44,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,111,110,101,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,119,105,108,108,32,101,120,101,99,117,116,101,44,32,98,117,116,32,109,117,108,116,105,112,108,101,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,99,97,110,32,101,120,101,99,117,116,101,46,32,73,102,32>>,{code,[],[<<66,108,111,99,107,83,116,97,116,101,32,61,58,61,32,117,110,98,108,111,99,107,95,110,111,114,109,97,108>>]},<<32,97,110,100,32,110,111,32,111,110,101,32,101,108,115,101,32,98,108,111,99,107,115,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,44,32,97,110,100,32,116,104,105,115,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,111,110,108,121,32,111,110,99,101,44,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,117,110,98,108,111,99,107,101,100,46>>]},{p,[],[<<79,110,101,32,112,114,111,99,101,115,115,32,99,97,110,32,98,108,111,99,107,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,44,32,105,116,32,109,117,115,116,32,117,110,98,108,111,99,107,32,101,120,97,99,116,108,121,32,97,115,32,109,97,110,121,32,116,105,109,101,115,32,97,115,32,105,116,32,104,97,115,32,98,108,111,99,107,101,100,32,98,101,102,111,114,101,32,105,116,32,104,97,115,32,114,101,108,101,97,115,101,100,32,105,116,115,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,98,108,111,99,107,46,32,73,102,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,111,114,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,101,120,105,116,115,44,32,105,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,108,101,97,115,101,115,32,105,116,115,32,98,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<44,32>>,{code,[],[<<98,108,111,99,107,101,100>>]},<<44,32>>,{code,[],[<<98,108,111,99,107,101,100,95,110,111,114,109,97,108>>]},<<44,32,111,114,32>>,{code,[],[<<101,110,97,98,108,101,100>>]},<<46,32,84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,100,101,115,99,114,105,98,101,115,32,116,104,101,32,115,116,97,116,101,32,106,117,115,116,32,97,102,116,101,114,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]},<<32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<66,108,111,99,107,105,110,103,32,111,102,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,110,111,114,109,97,108,108,121,32,110,111,116,32,110,101,101,100,101,100,46,32,73,102,32,121,111,117,32,102,101,101,108,32,116,104,97,116,32,121,111,117,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,101,115,101,32,102,101,97,116,117,114,101,115,44,32,99,111,110,115,105,100,101,114,32,105,116,32,97,32,102,101,119,32,109,111,114,101,32,116,105,109,101,115,32,97,103,97,105,110,46,32,66,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,97,115,32,97,32,108,97,115,116,32,114,101,115,111,114,116,44,32,97,115,32,105,116,32,105,115,32,109,111,115,116,32,108,105,107,101,108,121,32,97,32>>,{em,[],[<<118,101,114,121,32,105,110,101,102,102,105,99,105,101,110,116>>]},<<32,119,97,121,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,114,111,98,108,101,109,46>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,49,56,53>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2702,25},bounded_fun,[{type,{2702,25},'fun',[{type,{2702,25},product,[{atom,{2702,26},multi_scheduling},{var,{2702,44},'BlockState'}]},{var,{2702,59},'OldBlockState'}]},[{type,{2703,7},constraint,[{atom,{2703,7},is_subtype},[{var,{2703,7},'BlockState'},{type,{2703,21},union,[{atom,{2703,21},block},{atom,{2703,29},unblock},{atom,{2703,39},block_normal},{atom,{2703,54},unblock_normal}]}]]},{type,{2704,7},constraint,[{atom,{2704,7},is_subtype},[{var,{2704,7},'OldBlockState'},{type,{2704,24},union,[{atom,{2704,24},blocked},{atom,{2704,34},disabled},{atom,{2704,45},enabled}]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>}],[]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[{em,[],[<<84,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46>>]},<<32,73,110,115,116,101,97,100,32,111,102,32,117,115,105,110,103,32,116,104,105,115,32,97,114,103,117,109,101,110,116,44,32,117,115,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,87,104,101,110,32,116,104,105,115,32,97,114,103,117,109,101,110,116,32,105,115,32,114,101,109,111,118,101,100,44,32,97,32,102,105,110,97,108,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,116,111,32,117,115,101,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,46>>]}]},{p,[],[<<67,111,110,116,114,111,108,115,32,105,102,32,97,110,100,32,104,111,119,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]},{p,[],[<<87,104,101,110,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,44,32,72,111,119,41>>]},<<32,105,115,32,99,97,108,108,101,100,44,32,97,110,32,97,115,121,110,99,104,114,111,110,111,117,115,32,115,105,103,110,97,108,32,105,115,32,115,101,110,116,32,116,111,32,97,108,108,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,44,32,99,97,117,115,105,110,103,32,116,104,101,109,32,116,111,32,116,114,121,32,116,111,32,98,105,110,100,32,111,114,32,117,110,98,105,110,100,32,97,115,32,114,101,113,117,101,115,116,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,102,97,105,108,115,32,116,111,32,98,105,110,100,44,32,116,104,105,115,32,105,115,32,111,102,116,101,110,32,115,105,108,101,110,116,108,121,32,105,103,110,111,114,101,100,44,32,97,115,32,105,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,32,116,111,32,118,101,114,105,102,121,32,118,97,108,105,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,46,32,73,102,32,97,110,32,101,114,114,111,114,32,105,115,32,114,101,112,111,114,116,101,100,44,32,97,110,32,101,114,114,111,114,32,101,118,101,110,116,32,105,115,32,108,111,103,103,101,100,46,32,84,111,32,118,101,114,105,102,121,32,116,104,97,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,104,97,118,101,32,98,111,117,110,100,32,97,115,32,114,101,113,117,101,115,116,101,100,44,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<46>>]}]},{p,[],[<<83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,111,110,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,44,32,98,117,116,32,109,111,114,101,32,115,121,115,116,101,109,115,32,119,105,108,108,32,98,101,32,115,117,112,112,111,114,116,101,100,32,105,110,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,115,46>>]},{p,[],[<<73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,111,32,98,101,32,97,98,108,101,32,116,111,32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,109,117,115,116,32,98,101,32,107,110,111,119,110,46,32,73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,102,97,105,108,115,32,116,111,32,100,101,116,101,99,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,97,117,116,111,109,97,116,105,99,97,108,108,121,44,32,105,116,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,104,111,119,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,111,101,115,32,98,121,32,100,101,102,97,117,108,116,32>>,{em,[],[<<110,111,116>>]},<<32,98,105,110,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,116,104,101,32,111,110,108,121,32,79,83,32,112,114,111,99,101,115,115,32,98,105,110,100,105,110,103,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,105,115,32,105,109,112,114,111,118,101,115,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,116,104,101,114,32,79,83,32,112,114,111,99,101,115,115,101,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,110,111,116,104,101,114,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,108,115,111,32,98,105,110,100,32,116,104,114,101,97,100,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,105,110,115,116,101,97,100,46,32,83,111,109,101,116,105,109,101,115,32,116,104,105,115,32,112,101,114,102,111,114,109,97,110,99,101,32,112,101,110,97,108,116,121,32,99,97,110,32,98,101,32,115,101,118,101,114,101,46,32,73,102,32,115,111,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,110,111,116,32,98,105,110,100,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,46>>]}]},{p,[],[<<83,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,98,111,117,110,100,32,105,110,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,46,32,65,114,103,117,109,101,110,116,32>>,{code,[],[<<72,111,119>>]},<<32,100,101,116,101,114,109,105,110,101,115,32,104,111,119,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,32,97,110,100,32,99,97,110,32,98,101,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<117,110,98,111,117,110,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,117>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,110,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<116,104,114,101,97,100,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,116,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,112,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,95,110,111,100,101,95,116,104,114,101,97,100,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,110,110,116,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,110,110,112,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<116,104,114,101,97,100,95,110,111,95,110,111,100,101,95,112,114,111,99,101,115,115,111,114,95,115,112,114,101,97,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,116,110,110,112,115>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{dt,[],[{code,[],[<<100,101,102,97,117,108,116,95,98,105,110,100>>]}]},{dd,[],[<<83,97,109,101,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116,32,100,98>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,101,113,117,97,108,115,32>>,{code,[],[<<72,111,119>>]},<<32,98,101,102,111,114,101,32,102,108,97,103,32>>,{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>]},<<32,119,97,115,32,99,104,97,110,103,101,100,46>>]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<110,111,116,115,117,112>>]}]},{dd,[],[<<73,102,32,98,105,110,100,105,110,103,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<72,111,119>>]},<<32,105,115,32,110,111,116,32,111,110,101,32,111,102,32,116,104,101,32,100,111,99,117,109,101,110,116,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,46>>]}]},{p,[],[<<84,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,32,116,121,112,101,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<44,32,97,115,32,119,101,108,108,32,97,115,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,50,52,49>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2705,25},bounded_fun,[{type,{2705,25},'fun',[{type,{2705,25},product,[{atom,{2705,26},scheduler_bind_type},{var,{2705,47},'How'}]},{var,{2705,55},'OldBindType'}]},[{type,{2706,7},constraint,[{atom,{2706,7},is_subtype},[{var,{2706,7},'How'},{type,{2706,14},union,[{user_type,{2706,14},scheduler_bind_type,[]},{atom,{2706,38},default_bind}]}]]},{type,{2707,7},constraint,[{atom,{2707,7},is_subtype},[{var,{2707,7},'OldBindType'},{user_type,{2707,22},scheduler_bind_type,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,115,99,104,101,100,117,108,101,114,32,119,97,108,108,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,97,116,105,115,116,105,99,115,95,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,116,105,115,116,105,99,115,40,115,99,104,101,100,117,108,101,114,95,119,97,108,108,95,116,105,109,101,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,51,54,56>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2708,25},bounded_fun,[{type,{2708,25},'fun',[{type,{2708,25},product,[{atom,{2708,26},scheduler_wall_time},{var,{2708,47},'Boolean'}]},{var,{2708,60},'OldBoolean'}]},[{type,{2709,7},constraint,[{atom,{2709,7},is_subtype},[{var,{2709,7},'Boolean'},{type,{2709,18},boolean,[]}]]},{type,{2710,7},constraint,[{atom,{2710,7},is_subtype},[{var,{2710,7},'OldBoolean'},{type,{2710,21},boolean,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66,48,49>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,82,97,110,103,101,32,105,115,32>>,{code,[],[<<49,32,60,61,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{p,[],[<<73,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,98,117,105,108,116,32,119,105,116,104,32,115,117,112,112,111,114,116,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115>>]},<<44,32,99,104,97,110,103,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,97,108,115,111,32,99,104,97,110,103,101,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,49,50,32,115,99,104,101,100,117,108,101,114,115,32,97,110,100,32,54,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,111,110,108,105,110,101,44,32,97,110,100,32>>,{code,[],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>]},<<32,105,115,32,117,115,101,100,32,116,111,32,115,101,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,116,111,32,54,44,32,116,104,101,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,99,114,101,97,115,101,100,32,98,121,32,104,97,108,102,32,97,115,32,119,101,108,108,44,32,100,111,119,110,32,116,111,32,51,46,32,83,105,109,105,108,97,114,108,121,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,105,110,99,114,101,97,115,101,115,32,112,114,111,112,111,114,116,105,111,110,97,108,108,121,32,116,111,32,105,110,99,114,101,97,115,101,115,32,105,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,51,56,49>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2711,25},bounded_fun,[{type,{2711,25},'fun',[{type,{2711,25},product,[{atom,{2711,26},schedulers_online},{var,{2711,45},'SchedulersOnline'}]},{var,{2712,33},'OldSchedulersOnline'}]},[{type,{2713,7},constraint,[{atom,{2713,7},is_subtype},[{var,{2713,7},'SchedulersOnline'},{type,{2713,27},pos_integer,[]}]]},{type,{2714,7},constraint,[{atom,{2714,7},is_subtype},[{var,{2714,7},'OldSchedulersOnline'},{type,{2714,30},pos_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,119,105,108,108,32,114,101,99,101,105,118,101,32,116,104,101,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,46,32,73,102,32,115,101,116,32,116,111,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<44,32,97,108,108,32,108,111,103,103,105,110,103,32,109,101,115,115,97,103,101,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,69,82,84,83,32,119,105,108,108,32,98,101,32,100,114,111,112,112,101,100,46,32,84,104,101,32,109,101,115,115,97,103,101,115,32,119,105,108,108,32,98,101,32,105,110,32,116,104,101,32,102,111,114,109,97,116,58>>]},{pre,[],[{code,[],[<<123,108,111,103,44,76,101,118,101,108,44,70,111,114,109,97,116,44,65,114,103,76,105,115,116,44,77,101,116,97,100,97,116,97,125,32,119,104,101,114,101,10,10,76,101,118,101,108,32,61,32,97,116,111,109,40,41,44,10,70,111,114,109,97,116,32,61,32,115,116,114,105,110,103,40,41,44,10,65,114,103,76,105,115,116,32,61,32,108,105,115,116,40,116,101,114,109,40,41,41,44,10,77,101,116,97,100,97,116,97,32,61,32,35,123,32,112,105,100,32,61,62,32,112,105,100,40,41,44,10,32,32,32,103,114,111,117,112,95,108,101,97,100,101,114,32,61,62,32,112,105,100,40,41,44,10,32,32,32,116,105,109,101,32,58,61,32,108,111,103,103,101,114,58,116,105,109,101,115,116,97,109,112,40,41,44,10,32,32,32,101,114,114,111,114,95,108,111,103,103,101,114,32,58,61,32,35,123,32,101,109,117,108,97,116,111,114,32,58,61,32,116,114,117,101,44,32,116,97,103,32,58,61,32,97,116,111,109,40,41,32,125,10,32,32,32,32,32,32,32,32>>]}]},{p,[],[<<73,102,32,116,104,101,32>>,{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]},<<32,112,114,111,99,101,115,115,32,100,105,101,115,44,32,116,104,105,115,32,102,108,97,103,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32>>,{code,[],[<<108,111,103,103,101,114>>]},<<46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,110,97,109,101,100,32>>,{code,[],[<<108,111,103,103,101,114>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,100,101,115,105,103,110,101,100,32,116,111,32,98,101,32,117,115,101,100,32,98,121,32,116,104,101,32,75,69,82,78,69,76,32>>,{a,[{href,<<107,101,114,110,101,108,58,108,111,103,103,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,103,103,101,114>>]}]},<<46,32,66,101,32,99,97,114,101,102,117,108,32,105,102,32,121,111,117,32,99,104,97,110,103,101,32,105,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,97,115,32,108,111,103,32,109,101,115,115,97,103,101,115,32,109,97,121,32,98,101,32,108,111,115,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,105,110,116,101,114,99,101,112,116,32,101,109,117,108,97,116,111,114,32,108,111,103,32,109,101,115,115,97,103,101,115,44,32,100,111,32,105,116,32,98,121,32,97,100,100,105,110,103,32,97,32,115,112,101,99,105,97,108,105,122,101,100,32,104,97,110,100,108,101,114,32,116,111,32,116,104,101,32,75,69,82,78,69,76,32,108,111,103,103,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,52,49,48>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2715,25},bounded_fun,[{type,{2715,25},'fun',[{type,{2715,25},product,[{atom,{2715,26},system_logger},{var,{2715,41},'Logger'}]},{var,{2715,52},'PrevLogger'}]},[{type,{2716,7},constraint,[{atom,{2716,7},is_subtype},[{var,{2716,7},'Logger'},{type,{2716,17},union,[{atom,{2716,17},logger},{atom,{2716,26},undefined},{type,{2716,38},pid,[]}]}]]},{type,{2717,7},constraint,[{atom,{2717,7},is_subtype},[{var,{2717,7},'PrevLogger'},{type,{2717,21},union,[{atom,{2717,21},logger},{atom,{2717,30},undefined},{type,{2717,42},pid,[]}]}]]}]]}]}}],since => <<79,84,80,32,50,49,46,51>>}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,32,116,111,32>>,{code,[],[<<84,67,87>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,97,110,32,117,110,115,105,103,110,101,100,32,105,110,116,101,103,101,114,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,109,97,116,99,104,95,115,112,101,99,35,115,101,116,95,116,99,119>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<115,101,116,95,116,99,119>>]}]},<<32,105,110,32,115,101,99,116,105,111,110,32,34,77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103,34,32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,108,97,103,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,52,52,50>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2718,25},bounded_fun,[{type,{2718,25},'fun',[{type,{2718,25},product,[{atom,{2718,26},trace_control_word},{var,{2718,46},'TCW'}]},{var,{2718,54},'OldTCW'}]},[{type,{2719,7},constraint,[{atom,{2719,7},is_subtype},[{var,{2719,7},'TCW'},{type,{2719,14},non_neg_integer,[]}]]},{type,{2720,7},constraint,[{atom,{2720,7},is_subtype},[{var,{2720,7},'OldTCW'},{type,{2720,17},non_neg_integer,[]}]]}]]}]}}]}},{{function,system_flag,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2672}],[<<115,121,115,116,101,109,95,102,108,97,103,47,50>>],#{<<101,110>> => [{p,[],[<<70,105,110,97,108,105,122,101,115,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<116,105,109,101,32,111,102,102,115,101,116>>]},<<32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46,32,73,102,32,97,110,111,116,104,101,114,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101,32,105,115,32,117,115,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,115,116,97,116,101,32,105,115,32,108,101,102,116,32,117,110,99,104,97,110,103,101,100,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,111,108,100,32,115,116,97,116,101,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,97,116,32,105,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<112,114,101,108,105,109,105,110,97,114,121>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,105,110,97,108,105,122,97,116,105,111,110,32,119,97,115,32,112,101,114,102,111,114,109,101,100,32,97,110,100,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,110,111,119,32,102,105,110,97,108,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<102,105,110,97,108>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,116,104,101,32,102,105,110,97,108,32,115,116,97,116,101,46,32,84,104,105,115,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32,97,110,111,116,104,101,114,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,116,105,109,101,95,111,102,102,115,101,116,44,32,102,105,110,97,108,105,122,101,41>>]},<<32,99,97,108,108,32,111,114,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,78,111,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]},{li,[],[{p,[],[<<73,102,32>>,{code,[],[<<118,111,108,97,116,105,108,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,110,111,116,32,98,101,32,102,105,110,97,108,105,122,101,100,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,52,53,54>>,signature => [{attribute,{2672,2},spec,{{erlang,system_flag,2},[{type,{2721,4},bounded_fun,[{type,{2721,4},'fun',[{type,{2721,4},product,[{atom,{2721,5},time_offset},{atom,{2721,18},finalize}]},{var,{2721,31},'OldState'}]},[{type,{2722,7},constraint,[{atom,{2722,7},is_subtype},[{var,{2722,7},'OldState'},{type,{2722,19},union,[{atom,{2722,19},preliminary},{atom,{2722,33},final},{atom,{2722,41},volatile}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,46,32,84,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,98,114,111,107,101,110,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,105,110,32,111,114,100,101,114,32,116,111,32,109,97,107,101,32,105,116,32,101,97,115,105,101,114,32,116,111,32,110,97,118,105,103,97,116,101,46>>]},{dl,[],[{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<77,101,109,111,114,121,32,65,108,108,111,99,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,97,116,111,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,108,108,111,99,97,116,111,114,95,115,105,122,101,115>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<67,80,85,32,84,111,112,111,108,111,103,121>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<80,114,111,99,101,115,115,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<104,101,97,112,95,115,105,122,101,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<104,101,97,112,95,116,121,112,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,115>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,105,109,105,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,121,115,116,101,109,32,76,105,109,105,116,115>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,116,111,109,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<97,116,111,109,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,116,115,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,116,115,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,111,114,116,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,111,114,116,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,99,111,117,110,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,108,105,109,105,116>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,121,115,116,101,109,32,84,105,109,101>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,110,100,95,116,105,109,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,116,97,114,116,95,116,105,109,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,119,97,114,112,95,109,111,100,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,99,104,101,100,117,108,101,114,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,95,105,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,99,104,101,100,117,108,101,114,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,109,112,95,115,117,112,112,111,114,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,104,114,101,97,100,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<68,105,115,116,114,105,98,117,116,105,111,110,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,114,101,97,116,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,115,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,115,116,95,99,116,114,108>>]}]}]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,105,115,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<83,121,115,116,101,109,32,73,110,102,111,114,109,97,116,105,111,110>>]}]}]},{dd,[],[{p,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,104,101,99,107,95,105,111>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,111,109,112,97,116,95,114,101,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,101,98,117,103,95,99,111,109,112,105,108,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,114,105,118,101,114,95,118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,109,117,95,102,108,97,118,111,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,109,117,95,116,121,112,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,102,111>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<107,101,114,110,101,108,95,112,111,108,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,111,97,100,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,99,104,105,110,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<110,105,102,95,118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,116,112,95,114,101,108,101,97,115,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,121,115,116,101,109,95,118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<118,101,114,115,105,111,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<119,111,114,100,115,105,122,101>>]}]}]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,52,56,54>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2934,10},'fun',[{type,{2934,10},product,[{atom,{2934,11},version}]},{type,{2934,23},string,[]}]}]}}]}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,111,114,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>}],[]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>}],[]},{code,[],[<<97,108,108,111,99,97,116,101,100,95,97,114,101,97,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32,119,105,116,104,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,97,114,101,97,115,46>>]},{p,[],[<<69,97,99,104,32,116,117,112,108,101,32,99,111,110,116,97,105,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,116,121,112,101,32,111,102,32,109,101,109,111,114,121,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,97,110,100,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,97,108,108,111,99,97,116,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,87,104,101,110,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,108,108,111,99,97,116,101,100,32,97,110,100,32,117,115,101,100,32,109,101,109,111,114,121,32,105,115,32,112,114,101,115,101,110,116,44,32,97,108,115,111,32,97,32,116,104,105,114,100,32,101,108,101,109,101,110,116,32,105,115,32,112,114,101,115,101,110,116,44,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,117,115,101,100,32,109,101,109,111,114,121,32,105,110,32,98,121,116,101,115,46>>]},{p,[],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,97,108,108,111,99,97,116,101,100,95,97,114,101,97,115,41>>]},<<32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,44,32,97,110,100,32,116,104,101,32,99,111,110,116,101,110,116,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,46,32,84,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,115,32,116,104,101,114,101,102,111,114,101,32,99,104,97,110,103,101,115,32,119,104,101,110,32,110,101,101,100,101,100,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,115,101,32,118,97,108,117,101,115,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,111,109,101,32,118,97,108,117,101,115,32,97,114,101,32,112,97,114,116,32,111,102,32,111,116,104,101,114,32,118,97,108,117,101,115,44,32,97,110,100,32,115,111,109,101,32,109,101,109,111,114,121,32,97,114,101,97,115,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,115,117,108,116,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,116,111,116,97,108,32,97,109,111,117,110,116,32,111,102,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,101,109,111,114,121,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,101,109,111,114,121,47,48,44,49>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114>>}],[]},{code,[],[<<97,108,108,111,99,97,116,111,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,65,108,108,111,99,97,116,111,114,44,32,86,101,114,115,105,111,110,44,32,70,101,97,116,117,114,101,115,44,32,83,101,116,116,105,110,103,115>>]},<<44,32,119,104,101,114,101,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<65,108,108,111,99,97,116,111,114>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32>>,{code,[],[<<109,97,108,108,111,99,40,41>>]},<<32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46,32,73,102,32>>,{code,[],[<<65,108,108,111,99,97,116,111,114>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<44,32,116,104,101,32>>,{code,[],[<<109,97,108,108,111,99,40,41>>]},<<32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,32,99,97,110,110,111,116,32,98,101,32,105,100,101,110,116,105,102,105,101,100,46,32>>,{code,[],[<<103,108,105,98,99>>]},<<32,99,97,110,32,98,101,32,105,100,101,110,116,105,102,105,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<86,101,114,115,105,111,110>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,40,98,117,116,32,110,111,116,32,97,32,115,116,114,105,110,103,41,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<109,97,108,108,111,99,40,41>>]},<<32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,117,115,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<70,101,97,116,117,114,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,97,116,111,109,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,116,104,101,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,32,117,115,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<83,101,116,116,105,110,103,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,115,117,98,115,121,115,116,101,109,115,44,32,116,104,101,105,114,32,99,111,110,102,105,103,117,114,97,98,108,101,32,112,97,114,97,109,101,116,101,114,115,44,32,97,110,100,32,117,115,101,100,32,118,97,108,117,101,115,46,32,83,101,116,116,105,110,103,115,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,100,105,102,102,101,114,101,110,116,32,99,111,109,98,105,110,97,116,105,111,110,115,32,111,102,32,112,108,97,116,102,111,114,109,115,44,32,97,108,108,111,99,97,116,111,114,115,44,32,97,110,100,32,97,108,108,111,99,97,116,105,111,110,32,102,101,97,116,117,114,101,115,46,32,77,101,109,111,114,121,32,115,105,122,101,115,32,97,114,101,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,46>>]}]}]},{p,[],[<<83,101,101,32,97,108,115,111,32,34,83,121,115,116,101,109,32,70,108,97,103,115,32,69,102,102,101,99,116,105,110,103,32,101,114,116,115,95,97,108,108,111,99,34,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99,35,102,108,97,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101>>}],[]},{code,[],[<<123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,65,115,32,102,114,111,109,32,69,82,84,83,32,53,46,54,46,49,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<123,105,110,115,116,97,110,99,101,44,32,73,110,115,116,97,110,99,101,78,111,44,32,73,110,115,116,97,110,99,101,73,110,102,111,125>>]},<<32,116,117,112,108,101,115,44,32,119,104,101,114,101,32>>,{code,[],[<<73,110,115,116,97,110,99,101,73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,115,112,101,99,105,102,105,99,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,97,108,108,111,99,97,116,111,114,46,32,73,102,32>>,{code,[],[<<65,108,108,111,99>>]},<<32,105,115,32,110,111,116,32,97,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,73,102,32>>,{code,[],[<<65,108,108,111,99>>]},<<32,105,115,32,100,105,115,97,98,108,101,100,44,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,105,115,32,104,105,103,104,108,121,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,100,101,112,101,110,100,101,110,116,32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46,32,73,116,32,119,97,115,32,105,110,105,116,105,97,108,108,121,32,105,110,116,101,110,100,101,100,32,97,115,32,97,32,116,111,111,108,32,119,104,101,110,32,100,101,118,101,108,111,112,105,110,103,32,110,101,119,32,97,108,108,111,99,97,116,111,114,115,44,32,98,117,116,32,97,115,32,105,116,32,99,97,110,32,98,101,32,111,102,32,105,110,116,101,114,101,115,116,32,102,111,114,32,111,116,104,101,114,115,32,105,116,32,104,97,115,32,98,101,101,110,32,98,114,105,101,102,108,121,32,100,111,99,117,109,101,110,116,101,100,46>>]},{p,[],[<<84,104,101,32,114,101,99,111,103,110,105,122,101,100,32,97,108,108,111,99,97,116,111,114,115,32,97,114,101,32,108,105,115,116,101,100,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]}]},<<46,32,73,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,117,112,101,114,32,99,97,114,114,105,101,114,115,32,99,97,110,32,98,101,32,111,98,116,97,105,110,101,100,32,102,114,111,109,32,69,82,84,83,32,56,46,48,32,119,105,116,104,32>>,{code,[],[<<123,97,108,108,111,99,97,116,111,114,44,32,101,114,116,115,95,109,109,97,112,125>>]},<<32,111,114,32,102,114,111,109,32,69,82,84,83,32,53,46,49,48,46,52,59,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,119,104,101,110,32,99,97,108,108,105,110,103,32,119,105,116,104,32>>,{code,[],[<<123,97,108,108,111,99,97,116,111,114,44,32,109,115,101,103,95,97,108,108,111,99,125>>]},<<32,97,108,115,111,32,105,110,99,108,117,100,101,115,32,97,110,32>>,{code,[],[<<123,101,114,116,115,95,109,109,97,112,44,32,95,125>>]},<<32,116,117,112,108,101,32,97,115,32,111,110,101,32,101,108,101,109,101,110,116,32,105,110,32,116,104,101,32,108,105,115,116,46>>]},{p,[],[<<65,102,116,101,114,32,114,101,97,100,105,110,103,32,116,104,101,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]},<<32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,109,111,114,101,32,111,114,32,108,101,115,115,32,115,112,101,97,107,115,32,102,111,114,32,105,116,115,101,108,102,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,119,111,114,116,104,32,101,120,112,108,97,105,110,105,110,103,32,115,111,109,101,32,116,104,105,110,103,115,46,32,67,97,108,108,32,99,111,117,110,116,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,44,32,116,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,103,105,103,97,32,99,97,108,108,115,44,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,99,97,108,108,115,46,32>>,{code,[],[<<109,98,99,115>>]},<<32,97,110,100,32>>,{code,[],[<<115,98,99,115>>]},<<32,100,101,110,111,116,101,32,109,117,108,116,105,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,97,110,100,32,115,105,110,103,108,101,45,98,108,111,99,107,32,99,97,114,114,105,101,114,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,83,105,122,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,105,110,32,98,121,116,101,115,46,32,87,104,101,110,32,97,32,115,105,122,101,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,101,100,44,32,105,116,32,105,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,115,111,109,101,116,104,105,110,103,46,32,83,105,122,101,115,32,97,110,100,32,97,109,111,117,110,116,115,32,97,114,101,32,111,102,116,101,110,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,114,101,101,32,118,97,108,117,101,115,58>>]},{ul,[],[{li,[],[<<84,104,101,32,102,105,114,115,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46>>]},{li,[],[<<84,104,101,32,115,101,99,111,110,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41>>]},<<46>>]},{li,[],[<<84,104,101,32,116,104,105,114,100,32,105,115,32,116,104,101,32,109,97,120,105,109,117,109,32,118,97,108,117,101,32,115,105,110,99,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,119,97,115,32,115,116,97,114,116,101,100,46>>]}]},{p,[],[<<73,102,32,111,110,108,121,32,111,110,101,32,118,97,108,117,101,32,105,115,32,112,114,101,115,101,110,116,44,32,105,116,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,118,97,108,117,101,46,32>>,{code,[],[<<102,105,120,95,97,108,108,111,99>>]},<<32,109,101,109,111,114,121,32,98,108,111,99,107,32,116,121,112,101,115,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,98,121,32,116,119,111,32,118,97,108,117,101,115,46,32,84,104,101,32,102,105,114,115,116,32,118,97,108,117,101,32,105,115,32,116,104,101,32,109,101,109,111,114,121,32,112,111,111,108,32,115,105,122,101,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,118,97,108,117,101,32,105,115,32,116,104,101,32,117,115,101,100,32,109,101,109,111,114,121,32,115,105,122,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>}],[]},{code,[],[<<97,108,108,111,99,95,117,116,105,108,95,97,108,108,111,99,97,116,111,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,97,108,108,111,99,97,116,111,114,115,32,117,115,105,110,103,32,116,104,101,32,69,82,84,83,32,105,110,116,101,114,110,97,108,32>>,{code,[],[<<97,108,108,111,99,95,117,116,105,108>>]},<<32,102,114,97,109,101,119,111,114,107,32,97,115,32,97,116,111,109,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,101,114,116,115,95,97,108,108,111,99,35,97,108,108,111,99,95,117,116,105,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<84,104,101,32,97,108,108,111,99,95,117,116,105,108,32,102,114,97,109,101,119,111,114,107>>]},<<32,105,110,32>>,{code,[],[<<101,114,116,115,95,97,108,108,111,99,40,51,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115>>}],[]},{code,[],[<<123,97,108,108,111,99,97,116,111,114,95,115,105,122,101,115,44,32,65,108,108,111,99,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,115,105,122,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,108,108,111,99,97,116,111,114,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,97,108,108,111,99,97,116,111,114,95,116,117,112,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,123,97,108,108,111,99,97,116,111,114,44,32,65,108,108,111,99,125,41>>]}]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,54,49,57>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2835,10},'fun',[{type,{2835,10},product,[{atom,{2835,11},allocated_areas}]},{type,{2835,31},list,[{type,{2835,33},tuple,any}]}]},{type,{2836,10},bounded_fun,[{type,{2836,10},'fun',[{type,{2836,10},product,[{atom,{2836,11},allocator}]},{type,{2837,18},tuple,[{var,{2837,19},'Allocator'},{var,{2837,30},'Version'},{var,{2837,39},'Features'},{var,{2837,49},'Settings'}]}]},[{type,{2838,7},constraint,[{atom,{2838,7},is_subtype},[{var,{2838,7},'Allocator'},{type,{2838,20},union,[{atom,{2838,20},undefined},{atom,{2838,32},glibc}]}]]},{type,{2839,7},constraint,[{atom,{2839,7},is_subtype},[{var,{2839,7},'Version'},{type,{2839,18},list,[{type,{2839,19},non_neg_integer,[]}]}]]},{type,{2840,7},constraint,[{atom,{2840,7},is_subtype},[{var,{2840,7},'Features'},{type,{2840,19},list,[{type,{2840,20},atom,[]}]}]]},{type,{2841,7},constraint,[{atom,{2841,7},is_subtype},[{var,{2841,7},'Settings'},{type,{2841,19},list,[{type,{2841,20},tuple,[{ann_type,{2841,21},[{var,{2841,21},'Subsystem'},{type,{2841,34},atom,[]}]},{type,{2842,21},list,[{type,{2842,22},tuple,[{ann_type,{2842,23},[{var,{2842,23},'Parameter'},{type,{2842,36},atom,[]}]},{ann_type,{2843,23},[{var,{2843,23},'Value'},{type,{2843,32},term,[]}]}]}]}]}]}]]}]]},{type,{2844,10},bounded_fun,[{type,{2844,10},'fun',[{type,{2844,10},product,[{type,{2844,11},tuple,[{atom,{2844,12},allocator},{var,{2844,23},'Alloc'}]}]},{type,{2844,34},list,[{var,{2844,35},'_'}]}]},[{type,{2845,7},constraint,[{atom,{2845,7},is_subtype},[{var,{2845,7},'Alloc'},{type,{2845,16},atom,[]}]]}]]},{type,{2846,10},bounded_fun,[{type,{2846,10},'fun',[{type,{2846,10},product,[{atom,{2846,11},alloc_util_allocators}]},{type,{2846,37},list,[{var,{2846,38},'Alloc'}]}]},[{type,{2847,7},constraint,[{atom,{2847,7},is_subtype},[{var,{2847,7},'Alloc'},{type,{2847,16},atom,[]}]]}]]},{type,{2848,10},bounded_fun,[{type,{2848,10},'fun',[{type,{2848,10},product,[{type,{2848,11},tuple,[{atom,{2848,12},allocator_sizes},{var,{2848,29},'Alloc'}]}]},{type,{2848,40},list,[{var,{2848,41},'_'}]}]},[{type,{2849,7},constraint,[{atom,{2849,7},is_subtype},[{var,{2849,7},'Alloc'},{type,{2849,16},atom,[]}]]}]]}]}}]}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<99,112,117,95,116,111,112,111,108,111,103,121>>}],[]},{li,[{name,<<99,112,117,95,116,111,112,111,108,111,103,121>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,108,108,32>>,{code,[],[<<76,101,118,101,108,69,110,116,114,121>>]},<<115,32,111,102,32,97,32,108,105,115,116,32,109,117,115,116,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32>>,{code,[],[<<76,101,118,101,108,84,97,103>>]},<<44,32,101,120,99,101,112,116,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,119,104,101,114,101,32,98,111,116,104,32>>,{code,[],[<<110,111,100,101>>]},<<32,97,110,100,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},{code,[],[<<76,101,118,101,108,84,97,103>>]},<<115,32,99,97,110,32,99,111,101,120,105,115,116,46>>]},{li,[{name,<<105,110,102,111,95,108,105,115,116>>}],[]},{li,[{name,<<105,110,102,111,95,108,105,115,116>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<84,104,101,32>>,{code,[],[<<105,110,102,111,95,108,105,115,116,40,41>>]},<<32,99,97,110,32,98,101,32,101,120,116,101,110,100,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{li,[{name,<<108,101,118,101,108,95,101,110,116,114,121>>}],[]},{li,[{name,<<108,101,118,101,108,95,101,110,116,114,121>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[{code,[],[<<123,76,101,118,101,108,84,97,103,44,32,83,117,98,76,101,118,101,108,125,32,61,61,32,123,76,101,118,101,108,84,97,103,44,32,91,93,44,32,83,117,98,76,101,118,101,108,125>>]}]},{li,[{name,<<108,101,118,101,108,95,116,97,103>>}],[]},{li,[{name,<<108,101,118,101,108,95,116,97,103>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<77,111,114,101,32>>,{code,[],[<<76,101,118,101,108,84,97,103>>]},<<115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]},{li,[{name,<<115,117,98,95,108,101,118,101,108>>}],[]}]},{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>}],[]},{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,98,105,110,100,105,110,103,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,117,115,101,100,32,105,115,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,115,101,114,45,100,101,102,105,110,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121>>]},<<44,32,105,102,32,115,117,99,104,32,101,120,105,115,116,115,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121>>]},<<44,32,105,102,32,115,117,99,104,32,101,120,105,115,116,115,46,32,73,102,32,110,111,32,67,80,85,32,116,111,112,111,108,111,103,121,32,101,120,105,115,116,115,44,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[{code,[],[<<110,111,100,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,78,111,110,45,85,110,105,102,111,114,109,32,77,101,109,111,114,121,32,65,99,99,101,115,115,32,40,78,85,77,65,41,32,110,111,100,101,115,46,32>>,{code,[],[<<116,104,114,101,97,100>>]},<<32,114,101,102,101,114,115,32,116,111,32,104,97,114,100,119,97,114,101,32,116,104,114,101,97,100,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,73,110,116,101,108,32,104,121,112,101,114,45,116,104,114,101,97,100,115,41,46>>]},{p,[],[<<65,32,108,101,118,101,108,32,105,110,32,116,101,114,109,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,99,97,110,32,98,101,32,111,109,105,116,116,101,100,32,105,102,32,111,110,108,121,32,111,110,101,32,101,110,116,114,121,32,101,120,105,115,116,115,32,97,110,100,32>>,{code,[],[<<73,110,102,111,76,105,115,116>>]},<<32,105,115,32,101,109,112,116,121,46>>]},{p,[],[{code,[],[<<116,104,114,101,97,100>>]},<<32,99,97,110,32,111,110,108,121,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<99,111,114,101>>]},<<46,32>>,{code,[],[<<99,111,114,101>>]},<<32,99,97,110,32,98,101,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},<<32,111,114,32>>,{code,[],[<<110,111,100,101>>]},<<46,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},<<32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<110,111,100,101>>]},<<46,32>>,{code,[],[<<110,111,100,101>>]},<<32,99,97,110,32,98,101,32,111,110,32,116,104,101,32,116,111,112,32,108,101,118,101,108,32,111,114,32,97,32,115,117,98,108,101,118,101,108,32,116,111,32>>,{code,[],[<<112,114,111,99,101,115,115,111,114>>]},<<46,32,84,104,97,116,32,105,115,44,32,78,85,77,65,32,110,111,100,101,115,32,99,97,110,32,98,101,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,111,114,32,112,114,111,99,101,115,115,111,114,32,101,120,116,101,114,110,97,108,46,32,65,32,67,80,85,32,116,111,112,111,108,111,103,121,32,99,97,110,32,99,111,110,115,105,115,116,32,111,102,32,97,32,109,105,120,32,111,102,32,112,114,111,99,101,115,115,111,114,32,105,110,116,101,114,110,97,108,32,97,110,100,32,101,120,116,101,114,110,97,108,32,78,85,77,65,32,110,111,100,101,115,44,32,97,115,32,108,111,110,103,32,97,115,32,101,97,99,104,32,108,111,103,105,99,97,108,32,67,80,85,32,98,101,108,111,110,103,115,32,116,111,32>>,{em,[],[<<111,110,101>>]},<<32,78,85,77,65,32,110,111,100,101,46,32,67,97,99,104,101,32,104,105,101,114,97,114,99,104,121,32,105,115,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,116,121,112,101,44,32,98,117,116,32,119,105,108,108,32,98,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,79,116,104,101,114,32,116,104,105,110,103,115,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,105,116,32,105,110,116,111,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,83,111,44,32,101,120,112,101,99,116,32,116,104,101,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,116,121,112,101,32,116,111,32,99,104,97,110,103,101,46>>]}]},{dt,[],[{code,[],[<<123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,102,105,110,101,100,125>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,102,105,110,101,100>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,117,115,101,114,45,100,101,102,105,110,101,100,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,99,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<32,97,110,100,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,100,101,116,101,99,116,101,100,125>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,100,101,116,101,99,116,101,100,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121,121>>]},<<46,32,84,104,101,32,101,109,117,108,97,116,111,114,32,100,101,116,101,99,116,115,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,111,110,32,115,111,109,101,32,110,101,119,101,114,32,76,105,110,117,120,44,32,83,111,108,97,114,105,115,44,32,70,114,101,101,66,83,68,44,32,97,110,100,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,115,46,32,79,110,32,87,105,110,100,111,119,115,32,115,121,115,116,101,109,32,119,105,116,104,32,109,111,114,101,32,116,104,97,110,32,51,50,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,44,32,116,104,101,32,67,80,85,32,116,111,112,111,108,111,103,121,32,105,115,32,110,111,116,32,100,101,116,101,99,116,101,100,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,99,112,117,95,116,111,112,111,108,111,103,121,44,32,117,115,101,100,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<67,112,117,84,111,112,111,108,111,103,121>>]},<<32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,112,117,95,116,111,112,111,108,111,103,121>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>}],[]},{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,116,104,101,32,99,111,110,102,105,103,117,114,101,100,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>}],[]},{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,116,104,101,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,97,118,97,105,108,97,98,108,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>}],[]},{code,[],[<<108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,32,111,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,101,105,116,104,101,114,32,97,110,32,105,110,116,101,103,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,111,110,108,105,110,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,99,111,110,102,105,103,117,114,101,100>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97>>}],[]},{code,[],[<<99,112,117,95,113,117,111,116,97>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,116,101,99,116,101,100,32,67,80,85,32,113,117,111,116,97,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,108,105,109,105,116,101,100,32,98,121,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,115,97,121,105,110,103,32,104,111,119,32,109,97,110,121,32,112,114,111,99,101,115,115,111,114,115,39,32,119,111,114,116,104,32,111,102,32,114,117,110,116,105,109,101,32,119,101,32,103,101,116,32,40,98,101,116,119,101,101,110,32,49,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,41,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,107,110,111,119,110>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,99,97,110,110,111,116,32,100,101,116,101,99,116,32,97,32,113,117,111,116,97,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>}],[]},{code,[],[<<117,112,100,97,116,101,95,99,112,117,95,105,110,102,111>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,114,101,114,101,97,100,115,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,97,118,97,105,108,97,98,108,101,32,97,110,100,32,117,112,100,97,116,101,115,32,105,116,115,32,105,110,116,101,114,110,97,108,108,121,32,115,116,111,114,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,116,111,112,111,108,111,103,121,95,100,101,116,101,99,116,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,101,116,101,99,116,101,100,32,67,80,85,32,116,111,112,111,108,111,103,121>>]},<<32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,110,102,105,103,117,114,101,100>>]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<111,110,108,105,110,101>>]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<97,118,97,105,108,97,98,108,101>>]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,99,112,117,95,113,117,111,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,112,117,32,113,117,111,116,97>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,104,97,115,32,99,104,97,110,103,101,100,32,115,105,110,99,101,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,105,116,32,119,97,115,32,114,101,97,100,44,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<99,104,97,110,103,101,100>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,99,104,97,110,103,101,100>>]},<<46,32,73,102,32,116,104,101,32,67,80,85,32,105,110,102,111,114,109,97,116,105,111,110,32,104,97,115,32,99,104,97,110,103,101,100,44,32,121,111,117,32,112,114,111,98,97,98,108,121,32,119,97,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<97,100,106,117,115,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101>>]},<<46,32,89,111,117,32,116,121,112,105,99,97,108,108,121,32,119,97,110,116,32,116,111,32,104,97,118,101,32,97,115,32,109,97,110,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,108,111,103,105,99,97,108,95,112,114,111,99,101,115,115,111,114,115,95,97,118,97,105,108,97,98,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,32,97,118,97,105,108,97,98,108,101>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,55,54,56>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2857,10},bounded_fun,[{type,{2857,10},'fun',[{type,{2857,10},product,[{atom,{2857,11},cpu_topology}]},{var,{2857,29},'CpuTopology'}]},[{type,{2858,7},constraint,[{atom,{2858,7},is_subtype},[{var,{2858,7},'CpuTopology'},{user_type,{2858,22},cpu_topology,[]}]]}]]},{type,{2859,10},bounded_fun,[{type,{2859,10},'fun',[{type,{2859,10},product,[{type,{2859,11},tuple,[{atom,{2859,12},cpu_topology},{type,{2859,26},union,[{atom,{2859,26},defined},{atom,{2859,36},detected},{atom,{2859,47},used}]}]}]},{var,{2859,57},'CpuTopology'}]},[{type,{2860,7},constraint,[{atom,{2860,7},is_subtype},[{var,{2860,7},'CpuTopology'},{user_type,{2860,22},cpu_topology,[]}]]}]]},{type,{2887,10},'fun',[{type,{2887,10},product,[{type,{2887,11},union,[{atom,{2887,11},logical_processors},{atom,{2888,11},logical_processors_available},{atom,{2889,11},logical_processors_online}]}]},{type,{2889,41},union,[{atom,{2889,41},unknown},{type,{2889,51},pos_integer,[]}]}]},{type,{2933,10},'fun',[{type,{2933,10},product,[{atom,{2933,11},update_cpu_info}]},{type,{2933,31},union,[{atom,{2933,31},changed},{atom,{2933,41},unchanged}]}]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{li,[{name,<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]}]},{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,100,101,102,97,117,108,116,32,112,114,111,99,101,115,115,32,104,101,97,112,32,115,101,116,116,105,110,103,115,58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>}],[]},{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,102,117,108,108,115,119,101,101,112,95,97,102,116,101,114,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32>>,{code,[],[<<102,117,108,108,115,119,101,101,112,95,97,102,116,101,114>>]},<<32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,32,117,115,101,100,32,98,121,32,100,101,102,97,117,108,116,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]},<<32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>}],[]},{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,101,102,97,117,108,116,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,32,65,32,112,114,111,99,101,115,115,32,115,112,97,119,110,101,100,32,111,110,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,98,121,32,97,32>>,{code,[],[<<115,112,97,119,110>>]},<<32,111,114,32>>,{code,[],[<<115,112,97,119,110,95,108,105,110,107>>]},<<32,117,115,101,115,32,116,104,101,115,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,47,50>>]}]},<<46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,47,50,44,51,44,52>>]}]},<<32,99,97,110,32,115,112,97,119,110,32,97,32,112,114,111,99,101,115,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,117,115,101,32,116,104,101,32,100,101,102,97,117,108,116,32,115,101,116,116,105,110,103,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,115,105,122,101,115>>}],[]},{code,[],[<<104,101,97,112,95,115,105,122,101,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,118,97,108,105,100,32,104,101,97,112,32,115,105,122,101,115,32,105,110,32,119,111,114,100,115,46,32,65,108,108,32,69,114,108,97,110,103,32,104,101,97,112,115,32,97,114,101,32,115,105,122,101,100,32,102,114,111,109,32,115,105,122,101,115,32,105,110,32,116,104,105,115,32,108,105,115,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,104,101,97,112,95,116,121,112,101>>}],[]},{code,[],[<<104,101,97,112,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,104,101,97,112,32,116,121,112,101,32,117,115,101,100,32,98,121,32,116,104,101,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,46,32,79,110,101,32,104,101,97,112,32,116,121,112,101,32,101,120,105,115,116,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<112,114,105,118,97,116,101>>]}]},{dd,[],[<<69,97,99,104,32,112,114,111,99,101,115,115,32,104,97,115,32,97,32,104,101,97,112,32,114,101,115,101,114,118,101,100,32,102,111,114,32,105,116,115,32,117,115,101,32,97,110,100,32,110,111,32,114,101,102,101,114,101,110,99,101,115,32,98,101,116,119,101,101,110,32,104,101,97,112,115,32,111,102,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,97,108,108,111,119,101,100,46,32,77,101,115,115,97,103,101,115,32,112,97,115,115,101,100,32,98,101,116,119,101,101,110,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,99,111,112,105,101,100,32,98,101,116,119,101,101,110,32,104,101,97,112,115,46>>]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,97,120,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,97,120,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,115,101,116,116,105,110,103,115,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46,32,84,104,105,115,32,115,101,116,116,105,110,103,32,99,97,110,32,98,101,32,115,101,116,32,117,115,105,110,103,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120,107>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,97,120,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,97,120,101,108>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,114,117,110,116,105,109,101,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,97,98,111,117,116,32,116,104,101,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>}],[]},{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>]},<<32,112,114,111,99,101,115,115,32,102,108,97,103,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,101,105,116,104,101,114,32>>,{code,[],[<<111,102,102,95,104,101,97,112>>]},<<32,111,114,32>>,{code,[],[<<111,110,95,104,101,97,112>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,105,115,32,115,101,116,32,98,121,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,104,109,113,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,104,109,113,100>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<109,105,110,95,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,109,105,110,95,104,101,97,112,95,115,105,122,101,44,32,77,105,110,72,101,97,112,83,105,122,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,105,110,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,109,105,110,95,98,105,110,95,118,104,101,97,112,95,115,105,122,101,44,32,77,105,110,66,105,110,86,72,101,97,112,83,105,122,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<77,105,110,66,105,110,86,72,101,97,112,83,105,122,101>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,45,119,105,100,101,32,109,105,110,105,109,117,109,32,98,105,110,97,114,121,32,118,105,114,116,117,97,108,32,104,101,97,112,32,115,105,122,101,32,102,111,114,32,115,112,97,119,110,101,100,32,112,114,111,99,101,115,115,101,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,115>>}],[]},{code,[],[<<112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,112,114,111,99,101,115,115,32,97,110,100,32,112,111,114,116,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,57,57,51,51>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2880,10},'fun',[{type,{2880,10},product,[{atom,{2880,11},fullsweep_after}]},{type,{2880,31},tuple,[{atom,{2880,32},fullsweep_after},{type,{2880,49},non_neg_integer,[]}]}]},{type,{2881,10},'fun',[{type,{2881,10},product,[{atom,{2881,11},garbage_collection}]},{type,{2881,34},list,[{type,{2881,35},tuple,[{type,{2881,36},atom,[]},{type,{2881,44},integer,[]}]}]}]},{type,{2882,10},'fun',[{type,{2882,10},product,[{atom,{2882,11},heap_sizes}]},{type,{2882,26},list,[{type,{2882,27},non_neg_integer,[]}]}]},{type,{2883,10},'fun',[{type,{2883,10},product,[{atom,{2883,11},heap_type}]},{atom,{2883,25},private}]},{type,{2891,10},'fun',[{type,{2891,10},product,[{atom,{2891,11},max_heap_size}]},{type,{2891,29},tuple,[{atom,{2891,30},max_heap_size},{ann_type,{2891,45},[{var,{2891,45},'MaxHeapSize'},{user_type,{2891,60},max_heap_size,[]}]}]}]},{type,{2892,10},'fun',[{type,{2892,10},product,[{atom,{2892,11},message_queue_data}]},{user_type,{2892,34},message_queue_data,[]}]},{type,{2893,10},'fun',[{type,{2893,10},product,[{atom,{2893,11},min_heap_size}]},{type,{2893,29},tuple,[{atom,{2893,30},min_heap_size},{ann_type,{2893,45},[{var,{2893,45},'MinHeapSize'},{type,{2893,60},pos_integer,[]}]}]}]},{type,{2894,10},'fun',[{type,{2894,10},product,[{atom,{2894,11},min_bin_vheap_size}]},{type,{2894,34},tuple,[{atom,{2894,35},min_bin_vheap_size},{ann_type,{2895,35},[{var,{2895,35},'MinBinVHeapSize'},{type,{2895,54},pos_integer,[]}]}]}]},{type,{2909,10},'fun',[{type,{2909,10},product,[{atom,{2909,11},procs}]},{type,{2909,21},binary,[]}]}]}}],since => <<79,84,80,32,49,57,46,48,44,79,84,80,32,82,49,51,66,48,52>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,105,109,105,116,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,108,105,109,105,116,115,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,99,111,117,110,116>>}],[]},{code,[],[<<97,116,111,109,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,97,116,111,109,95,108,105,109,105,116>>}],[]},{code,[],[<<97,116,111,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,97,116,111,109,115,32,97,108,108,111,119,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,105,110,99,114,101,97,115,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,116>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,99,111,117,110,116>>}],[]},{code,[],[<<101,116,115,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,69,84,83,32,116,97,98,108,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,116,115,95,108,105,109,105,116>>}],[]},{code,[],[<<101,116,115,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,108,105,109,105,116,32,102,111,114,32,110,117,109,98,101,114,32,111,102,32,69,84,83,32,116,97,98,108,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,116,115,35,109,97,120,95,101,116,115,95,116,97,98,108,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,97,108,108,121,32,111,98,115,111,108,101,116,101>>]},<<32,97,110,100,32,110,117,109,98,101,114,32,111,102,32,116,97,98,108,101,115,32,97,114,101,32,111,110,108,121,32,108,105,109,105,116,101,100,32,98,121,32,97,118,97,105,108,97,98,108,101,32,109,101,109,111,114,121,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,99,111,117,110,116>>}],[]},{code,[],[<<112,111,114,116,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,111,114,116,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<108,101,110,103,116,104,40,101,114,108,97,110,103,58,112,111,114,116,115,40,41,41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,108,105,109,105,116>>}],[]},{code,[],[<<112,111,114,116,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,81>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,81>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,99,111,117,110,116>>}],[]},{code,[],[<<112,114,111,99,101,115,115,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<108,101,110,103,116,104,40,112,114,111,99,101,115,115,101,115,40,41,41>>]},<<44,32,98,117,116,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,114,111,99,101,115,115,95,108,105,109,105,116>>}],[]},{code,[],[<<112,114,111,99,101,115,115,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,115,105,109,117,108,116,97,110,101,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,80>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,80>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,48,53,49>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2850,10},'fun',[{type,{2850,10},product,[{atom,{2850,11},atom_count}]},{type,{2850,26},pos_integer,[]}]},{type,{2851,10},'fun',[{type,{2851,10},product,[{atom,{2851,11},atom_limit}]},{type,{2851,26},pos_integer,[]}]},{type,{2878,10},'fun',[{type,{2878,10},product,[{atom,{2878,11},ets_count}]},{type,{2878,25},pos_integer,[]}]},{type,{2879,10},'fun',[{type,{2879,10},product,[{atom,{2879,11},ets_limit}]},{type,{2879,25},pos_integer,[]}]},{type,{2905,10},'fun',[{type,{2905,10},product,[{atom,{2905,11},port_count}]},{type,{2905,26},non_neg_integer,[]}]},{type,{2906,10},'fun',[{type,{2906,10},product,[{atom,{2906,11},port_limit}]},{type,{2906,26},pos_integer,[]}]},{type,{2907,10},'fun',[{type,{2907,10},product,[{atom,{2907,11},process_count}]},{type,{2907,29},pos_integer,[]}]},{type,{2908,10},'fun',[{type,{2908,10},product,[{atom,{2908,11},process_limit}]},{type,{2908,29},pos_integer,[]}]}]}}],since => <<79,84,80,32,50,48,46,48,44,79,84,80,32,50,49,46,49,44,79,84,80,32,82,49,54,66,44,79,84,80,32,82,49,54,66,48,51>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,116,105,109,101,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>}],[]},{code,[],[<<101,110,100,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,105,110,116,101,114,110,97,108,108,121,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,101,32,116,105,109,101,32,98,101,116,119,101,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,116,97,114,116,32,116,105,109,101>>]},<<32,97,110,100,32,116,104,101,32,101,110,100,32,116,105,109,101,32,105,115,32,97,116,32,108,101,97,115,116,32,97,32,113,117,97,114,116,101,114,32,111,102,32,97,32,109,105,108,108,101,110,110,105,117,109,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>}],[]},{code,[],[<<111,115,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,110,111,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,46,32,84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32>>,{code,[],[<<86,97,108,117,101>>]},<<115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,115,101,100,46,32,84,104,105,115,32,116,117,112,108,101,32,97,108,119,97,121,115,32,101,120,105,115,116,115,32,105,102,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,115,32,97,118,97,105,108,97,98,108,101,32,116,111,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]},{dt,[],[{code,[],[<<123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,116,117,112,108,101,32,111,110,108,121,32,101,120,105,115,116,115,32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32>>,{code,[],[<<67,108,111,99,107,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125>>]}]},{dd,[],[{p,[],[<<72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,82,101,115,111,108,117,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,115,111,108,117,116,105,111,110>>]},<<32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,102,114,111,109,32,116,104,101,32,79,83,44,32>>,{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,32,108,111,119,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,65,99,99,117,114,97,99,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<97,99,99,117,114,97,99,121>>]},<<32,111,114,32,119,104,101,116,104,101,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,80,114,101,99,105,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,101,99,105,115,105,111,110>>]},<<32,97,108,105,103,110,115,32,119,105,116,104,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,46,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,120,116,101,110,100,101,100,44,32,69,120,116,101,110,100,101,100,125>>]}]},{dd,[],[{p,[],[{code,[],[<<69,120,116,101,110,100,101,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<121,101,115>>]},<<32,105,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,32,104,97,115,32,98,101,101,110,32,101,120,116,101,110,100,101,100,59,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<69,120,116,101,110,100,101,100>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<110,111>>]},<<46,32,84,104,101,32,114,97,110,103,101,32,109,117,115,116,32,98,101,32,101,120,116,101,110,100,101,100,32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,114,101,116,117,114,110,115,32,118,97,108,117,101,115,32,116,104,97,116,32,119,114,97,112,32,102,97,115,116,46,32,84,104,105,115,32,116,121,112,105,99,97,108,108,121,32,105,115,32,116,104,101,32,99,97,115,101,32,119,104,101,110,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,32,51,50,45,98,105,116,32,118,97,108,117,101,46>>]}]},{dt,[],[{code,[],[<<123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<121,101,115>>]},<<32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,32,99,97,108,108,115,32,109,117,115,116,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32>>,{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<110,111>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,116,105,109,101,44,32,79,115,77,111,110,111,116,111,110,105,99,84,105,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<79,115,77,111,110,111,116,111,110,105,99,84,105,109,101>>]},<<32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46>>]}]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>}],[]},{code,[],[<<111,115,95,115,121,115,116,101,109,95,116,105,109,101,95,115,111,117,114,99,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,115,111,117,114,99,101,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,116,104,97,116,32,105,115,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<84,104,101,32,108,105,115,116,32,99,111,110,116,97,105,110,115,32,116,119,111,45,116,117,112,108,101,115,32,119,105,116,104,32>>,{code,[],[<<75,101,121>>]},<<115,32,97,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,97,110,100,32>>,{code,[],[<<86,97,108,117,101>>]},<<115,32,97,115,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,115,101,32,116,117,112,108,101,115,32,105,115,32,117,110,100,101,102,105,110,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,112,97,114,116,32,111,102,32,116,104,101,32,108,105,115,116,44,32,98,117,116,32,109,111,114,101,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,102,117,110,99,116,105,111,110,44,32,70,117,110,99,116,105,111,110,125>>]}]},{dd,[],[{p,[],[{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,115,101,100,46>>]}]},{dt,[],[{code,[],[<<123,99,108,111,99,107,95,105,100,44,32,67,108,111,99,107,73,100,125>>]}]},{dd,[],[{p,[],[<<69,120,105,115,116,115,32,111,110,108,121,32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,100,105,102,102,101,114,101,110,116,32,99,108,111,99,107,115,46,32>>,{code,[],[<<67,108,111,99,107,73,100>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,99,108,111,99,107,32,105,100,101,110,116,105,102,105,101,114,32,117,115,101,100,32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,114,101,115,111,108,117,116,105,111,110,44,32,79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110,125>>]}]},{dd,[],[{p,[],[<<72,105,103,104,101,115,116,32,112,111,115,115,105,98,108,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,82,101,115,111,108,117,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,115,111,108,117,116,105,111,110>>]},<<32,111,102,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,32,115,111,117,114,99,101,32,97,115,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,110,111,32,114,101,115,111,108,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,99,97,110,32,98,101,32,114,101,116,114,105,101,118,101,100,32,102,114,111,109,32,116,104,101,32,79,83,44,32>>,{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<115,32,114,101,116,117,114,110,32,118,97,108,117,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,97,99,116,117,97,108,32,114,101,115,111,108,117,116,105,111,110,32,99,97,110,32,98,101,32,108,111,119,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,100,111,101,115,32,110,111,116,32,115,97,121,32,97,110,121,116,104,105,110,103,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,65,99,99,117,114,97,99,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<97,99,99,117,114,97,99,121>>]},<<32,111,114,32,119,104,101,116,104,101,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,80,114,101,99,105,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,101,99,105,115,105,111,110>>]},<<32,100,111,32,97,108,105,103,110,32,119,105,116,104,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,46,32,89,111,117,32,100,111,44,32,104,111,119,101,118,101,114,44,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,112,114,101,99,105,115,105,111,110,32,105,115,32,110,111,116,32,98,101,116,116,101,114,32,116,104,97,110,32>>,{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101,82,101,115,111,108,117,116,105,111,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,112,97,114,97,108,108,101,108,44,32,80,97,114,97,108,108,101,108,125>>]}]},{dd,[],[{p,[],[{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<121,101,115>>]},<<32,105,102,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,115,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,32,102,114,111,109,32,109,117,108,116,105,112,108,101,32,116,104,114,101,97,100,115,46,32,73,102,32,105,116,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,105,110,32,112,97,114,97,108,108,101,108,44,32,98,101,99,97,117,115,101,32,99,97,108,108,115,32,110,101,101,100,115,32,116,111,32,98,101,32,115,101,114,105,97,108,105,122,101,100,44,32>>,{code,[],[<<80,97,114,97,108,108,101,108>>]},<<32,101,113,117,97,108,115,32>>,{code,[],[<<110,111>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,116,105,109,101,44,32,79,115,83,121,115,116,101,109,84,105,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<79,115,83,121,115,116,101,109,84,105,109,101>>]},<<32,101,113,117,97,108,115,32,99,117,114,114,101,110,116,32,79,83,32,115,121,115,116,101,109,32,116,105,109,101,32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46>>]}]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,116,97,114,116,95,116,105,109,101>>}],[]},{code,[],[<<115,116,97,114,116,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<32,97,116,32,116,104,101,32,116,105,109,101,32,119,104,101,110,32,99,117,114,114,101,110,116,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,115,116,97,114,116,101,100,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,110,100,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,101,110,100,95,116,105,109,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>}],[]},{code,[],[<<116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,111,111,108,101,97,110,32,118,97,108,117,101,32,105,110,100,105,99,97,116,105,110,103,32,119,104,101,116,104,101,114,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,67,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,99,111,114,114,101,99,116,105,111,110>>]},<<32,105,115,32,101,110,97,98,108,101,100,32,111,114,32,110,111,116,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116>>}],[]},{code,[],[<<116,105,109,101,95,111,102,102,115,101,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,116,97,116,101,32,111,102,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,58>>]},{dl,[],[{dt,[],[{code,[],[<<112,114,101,108,105,109,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,112,114,101,108,105,109,105,110,97,114,121,44,32,97,110,100,32,119,105,108,108,32,98,101,32,99,104,97,110,103,101,100,32,97,110,100,32,102,105,110,97,108,105,122,101,100,32,108,97,116,101,114,46,32,84,104,101,32,112,114,101,108,105,109,105,110,97,114,121,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,117,115,101,100,32,100,117,114,105,110,103,32,116,104,101,32,112,114,101,108,105,109,105,110,97,114,121,32,112,104,97,115,101,32,111,102,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<102,105,110,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,102,105,110,97,108,46,32,84,104,105,115,32,101,105,116,104,101,114,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,78,111,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,44,32,111,114,32,98,101,99,97,117,115,101,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,104,97,118,101,32,98,101,101,110,32,102,105,110,97,108,105,122,101,100,32,119,104,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]},{dt,[],[{code,[],[<<118,111,108,97,116,105,108,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,118,111,108,97,116,105,108,101,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,99,104,97,110,103,101,32,97,116,32,97,110,121,32,116,105,109,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,119,97,114,112,95,109,111,100,101>>}],[]},{code,[],[<<116,105,109,101,95,119,97,114,112,95,109,111,100,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,118,97,108,117,101,32,105,100,101,110,116,105,102,121,105,110,103,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,116,104,97,116,32,105,115,32,117,115,101,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<110,111,95,116,105,109,101,95,119,97,114,112>>]}]},{dd,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,78,111,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]},{dt,[],[{code,[],[<<115,105,110,103,108,101,95,116,105,109,101,95,119,97,114,112>>]}]},{dd,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,105,110,103,108,101,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,105,110,103,108,101,32,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]},{dt,[],[{code,[],[<<109,117,108,116,105,95,116,105,109,101,95,119,97,114,112>>]}]},{dd,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,105,115,32,117,115,101,100,46>>]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>}],[]},{code,[],[<<116,111,108,101,114,97,110,116,95,116,105,109,101,111,102,100,97,121>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,119,104,101,116,104,101,114,32,97,32,112,114,101,32,69,82,84,83,32,55,46,48,32,98,97,99,107,119,97,114,100,115,32,99,111,109,112,97,116,105,98,108,101,32,99,111,109,112,101,110,115,97,116,105,111,110,32,102,111,114,32,115,117,100,100,101,110,32,99,104,97,110,103,101,115,32,111,102,32,115,121,115,116,101,109,32,116,105,109,101,32,105,115,32>>,{code,[],[<<101,110,97,98,108,101,100>>]},<<32,111,114,32>>,{code,[],[<<100,105,115,97,98,108,101,100>>]},<<46,32,83,117,99,104,32,99,111,109,112,101,110,115,97,116,105,111,110,32,105,115,32>>,{code,[],[<<101,110,97,98,108,101,100>>]},<<32,119,104,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,111,102,102,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,111,102,102,115,101,116>>]},<<32,105,115,32>>,{code,[],[<<102,105,110,97,108>>]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,99,111,114,114,101,99,116,105,111,110>>]},<<32,105,115,32,101,110,97,98,108,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,49,51,49>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2877,10},'fun',[{type,{2877,10},product,[{atom,{2877,11},end_time}]},{type,{2877,24},non_neg_integer,[]}]},{type,{2902,10},'fun',[{type,{2902,10},product,[{atom,{2902,11},os_monotonic_time_source}]},{type,{2902,40},list,[{type,{2902,41},tuple,[{type,{2902,42},atom,[]},{type,{2902,49},term,[]}]}]}]},{type,{2903,10},'fun',[{type,{2903,10},product,[{atom,{2903,11},os_system_time_source}]},{type,{2903,37},list,[{type,{2903,38},tuple,[{type,{2903,39},atom,[]},{type,{2903,46},term,[]}]}]}]},{type,{2922,10},'fun',[{type,{2922,10},product,[{atom,{2922,11},start_time}]},{type,{2922,26},integer,[]}]},{type,{2928,10},'fun',[{type,{2928,10},product,[{atom,{2928,11},time_correction}]},{type,{2928,31},union,[{atom,{2928,31},true},{atom,{2928,38},false}]}]},{type,{2929,10},'fun',[{type,{2929,10},product,[{atom,{2929,11},time_offset}]},{type,{2929,27},union,[{atom,{2929,27},preliminary},{atom,{2929,41},final},{atom,{2929,49},volatile}]}]},{type,{2930,10},'fun',[{type,{2930,10},product,[{atom,{2930,11},time_warp_mode}]},{type,{2930,30},union,[{atom,{2930,30},no_time_warp},{atom,{2930,45},single_time_warp},{atom,{2930,64},multi_time_warp}]}]},{type,{2931,10},'fun',[{type,{2931,10},product,[{atom,{2931,11},tolerant_timeofday}]},{type,{2931,34},union,[{atom,{2931,34},enabled},{atom,{2931,44},disabled}]}]}]}}],since => <<79,84,80,32,49,55,46,49,44,79,84,80,32,49,56,46,48>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,115,99,104,101,100,117,108,101,114,115,44,32,115,99,104,101,100,117,108,105,110,103,32,97,110,100,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>}],[]},{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,68,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,32,67,80,85,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,44,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,44,32,97,110,100,32,66,73,70,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,32,115,99,104,101,100,117,108,101,114,115,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,46,32,84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,99,112,117>>]}]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,80,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,80,99,112,117>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>}],[]},{code,[],[<<100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,115,97,116,105,115,102,105,101,115,32>>,{code,[],[<<49,32,60,61,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,32,60,61,32,78>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]},<<32,97,110,100,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]},<<46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,67,80,85,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,99,112,117>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,99,112,117>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>}],[]},{code,[],[<<100,105,114,116,121,95,105,111,95,115,99,104,101,100,117,108,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,68,105,114,116,121,32,73,47,79,32,115,99,104,101,100,117,108,101,114,115,32,101,120,101,99,117,116,101,32,73,47,79,45,98,111,117,110,100,32,110,97,116,105,118,101,32,102,117,110,99,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32,78,73,70,115,32,97,110,100,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,44,32,119,104,105,99,104,32,99,97,110,110,111,116,32,98,101,32,109,97,110,97,103,101,100,32,99,108,101,97,110,108,121,32,98,121,32,116,104,101,32,110,111,114,109,97,108,32,101,109,117,108,97,116,111,114,32,115,99,104,101,100,117,108,101,114,115,46>>]},{p,[],[<<84,104,105,115,32,118,97,108,117,101,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,83,68,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,83,68,105,111>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,100,105,114,116,121,95,99,112,117,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,68,105,114,116,121,67,80,85,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>}],[]},{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<100,105,115,97,98,108,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,116,97,114,116,101,100,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<98,108,111,99,107,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,32,97,108,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,111,110,108,121,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,115,32,69,114,108,97,110,103,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<98,108,111,99,107,101,100,95,110,111,114,109,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,98,117,116,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,101,120,99,101,112,116,32,111,110,101,32,97,114,101,32,98,108,111,99,107,101,100,46,32,78,111,116,105,99,101,32,116,104,97,116,32,100,105,114,116,121,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,110,111,116,32,98,108,111,99,107,101,100,44,32,97,110,100,32,99,97,110,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,32,110,97,116,105,118,101,32,99,111,100,101,46>>]}]},{dt,[],[{code,[],[<<101,110,97,98,108,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,44,32,97,110,100,32,110,111,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,97,114,101,32,98,108,111,99,107,101,100,46,32,84,104,97,116,32,105,115,44,32,97,108,108,32,97,118,97,105,108,97,98,108,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,115,99,104,101,100,117,108,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,46>>]}]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>}],[]},{code,[],[<<109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<115,32,119,104,101,110,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32>>,{code,[],[<<80,105,100>>]},<<115,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,32,65,32>>,{code,[],[<<80,105,100>>]},<<32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>}],[]},{code,[],[<<110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32>>,{code,[],[<<80,105,100>>]},<<115,32,119,104,101,110,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,32,105,115,32,98,108,111,99,107,101,100,32,40,116,104,97,116,32,105,115,44,32,97,108,108,32,110,111,114,109,97,108,32,115,99,104,101,100,117,108,101,114,115,32,98,117,116,32,111,110,101,32,105,115,32,98,108,111,99,107,101,100,41,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32>>,{code,[],[<<80,105,100>>]},<<115,32,105,110,32,116,104,101,32,108,105,115,116,32,114,101,112,114,101,115,101,110,116,32,97,108,108,32,116,104,101,32,112,114,111,99,101,115,115,101,115,32,99,117,114,114,101,110,116,108,121,32,98,108,111,99,107,105,110,103,32,110,111,114,109,97,108,32,109,117,108,116,105,45,115,99,104,101,100,117,108,105,110,103,46,32,65,32>>,{code,[],[<<80,105,100>>]},<<32,111,99,99,117,114,115,32,111,110,108,121,32,111,110,99,101,32,105,110,32,116,104,101,32,108,105,115,116,44,32,101,118,101,110,32,105,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,112,114,111,99,101,115,115,32,104,97,115,32,98,108,111,99,107,101,100,32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,104,111,119,32,116,104,101,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,32,111,114,32,110,111,116,32,98,111,117,110,100,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,108,116,104,111,117,103,104,32,97,32,117,115,101,114,32,104,97,115,32,114,101,113,117,101,115,116,101,100,32,115,99,104,101,100,117,108,101,114,115,32,116,111,32,98,101,32,98,111,117,110,100,44,32,116,104,101,121,32,99,97,110,32,115,105,108,101,110,116,108,121,32,104,97,118,101,32,102,97,105,108,101,100,32,116,111,32,98,105,110,100,46,32,84,111,32,105,110,115,112,101,99,116,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,44,32,99,97,108,108,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,117,115,101,100,32,115,99,104,101,100,117,108,101,114,32,98,105,110,100,105,110,103,115,46>>]},{p,[],[<<65,32,116,117,112,108,101,32,111,102,32,97,32,115,105,122,101,32,101,113,117,97,108,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,116,117,112,108,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,105,110,116,101,103,101,114,115,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,98,111,117,110,100>>]},<<46,32,76,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,105,100,101,110,116,105,102,105,101,114,115,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,105,110,116,101,103,101,114,115,46,32,84,104,101,32>>,{code,[],[<<78>>]},<<116,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,116,117,112,108,101,32,101,113,117,97,108,115,32,116,104,101,32,99,117,114,114,101,110,116,32,98,105,110,100,105,110,103,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,105,116,104,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,32,101,113,117,97,108,32,116,111,32>>,{code,[],[<<78>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,115,32,97,114,101,32,98,111,117,110,100,44,32>>,{code,[],[<<101,108,101,109,101,110,116,40,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41,44,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,98,105,110,100,105,110,103,115,41,41>>]},<<32,114,101,116,117,114,110,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,111,110,108,121,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,98,111,117,110,100,32,116,111,32,108,111,103,105,99,97,108,32,112,114,111,99,101,115,115,111,114,115,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,98,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,98,116>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,95,105,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,73,68,32,40>>,{code,[],[<<83,99,104,101,100,117,108,101,114,73,100>>]},<<41,32,111,102,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{code,[],[<<83,99,104,101,100,117,108,101,114,73,100>>]},<<32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,119,104,101,114,101,32>>,{code,[],[<<49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,117,115,101,100,32,98,121,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,83,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,111,110,108,105,110,101,32,115,99,104,101,100,117,108,101,115,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,69,114,108,97,110,103,32,112,111,114,116,115,44,32,97,110,100,32,101,120,101,99,117,116,101,32,69,114,108,97,110,103,32,99,111,100,101,32,97,110,100,32,69,114,108,97,110,103,32,108,105,110,107,101,100,45,105,110,32,100,114,105,118,101,114,32,99,111,100,101,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,32,116,104,114,101,97,100,115,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,101,109,117,108,97,116,111,114,32,98,111,111,116,32,116,105,109,101,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,108,97,116,101,114,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,95,105,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,95,105,100,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,44,32,66,108,111,99,107,83,116,97,116,101,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,41>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,110,111,114,109,97,108,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,109,117,108,116,105,95,115,99,104,101,100,117,108,105,110,103,95,98,108,111,99,107,101,114,115,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>}],[]},{code,[],[<<115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,46,32,84,104,101,32,115,99,104,101,100,117,108,101,114,32,105,100,101,110,116,105,102,105,101,114,115,32,111,102,32,115,99,104,101,100,117,108,101,114,115,32,111,110,108,105,110,101,32,115,97,116,105,115,102,121,32,116,104,101,32,114,101,108,97,116,105,111,110,115,104,105,112,32>>,{code,[],[<<49,32,60,61,32,83,99,104,101,100,117,108,101,114,73,100,32,60,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,41>>]},<<46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,115,99,104,101,100,117,108,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,115,99,104,101,100,117,108,101,114,115,41>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,95,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,99,104,101,100,117,108,101,114,115,95,111,110,108,105,110,101,44,32,83,99,104,101,100,117,108,101,114,115,79,110,108,105,110,101,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,109,112,95,115,117,112,112,111,114,116>>}],[]},{code,[],[<<115,109,112,95,115,117,112,112,111,114,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,115>>}],[]},{code,[],[<<116,104,114,101,97,100,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>}],[]},{code,[],[<<116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,104,114,101,97,100,95,112,111,111,108,95,115,105,122,101>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,115,121,110,99,32,116,104,114,101,97,100,115,32,105,110,32,116,104,101,32,97,115,121,110,99,32,116,104,114,101,97,100,32,112,111,111,108,32,117,115,101,100,32,102,111,114,32,97,115,121,110,99,104,114,111,110,111,117,115,32,100,114,105,118,101,114,32,99,97,108,108,115,32,40>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,114,105,118,101,114,35,100,114,105,118,101,114,95,97,115,121,110,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<32>>,{code,[],[<<101,114,108,95,100,114,105,118,101,114,58,100,114,105,118,101,114,95,97,115,121,110,99,40,41>>]}]},<<41,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,51,53,57>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2864,10},'fun',[{type,{2864,10},product,[{atom,{2864,11},dirty_cpu_schedulers}]},{type,{2864,36},non_neg_integer,[]}]},{type,{2865,10},'fun',[{type,{2865,10},product,[{atom,{2865,11},dirty_cpu_schedulers_online}]},{type,{2865,43},non_neg_integer,[]}]},{type,{2866,10},'fun',[{type,{2866,10},product,[{atom,{2866,11},dirty_io_schedulers}]},{type,{2866,35},non_neg_integer,[]}]},{type,{2897,10},'fun',[{type,{2897,10},product,[{atom,{2897,11},multi_scheduling}]},{type,{2897,32},union,[{atom,{2897,32},disabled},{atom,{2897,43},blocked},{atom,{2897,53},blocked_normal},{atom,{2897,70},enabled}]}]},{type,{2898,10},'fun',[{type,{2898,10},product,[{atom,{2898,11},multi_scheduling_blockers}]},{type,{2898,41},list,[{ann_type,{2898,42},[{var,{2898,42},'Pid'},{type,{2898,49},pid,[]}]}]}]},{type,{2900,10},'fun',[{type,{2900,10},product,[{atom,{2900,11},normal_multi_scheduling_blockers}]},{type,{2900,48},list,[{ann_type,{2900,49},[{var,{2900,49},'Pid'},{type,{2900,56},pid,[]}]}]}]},{type,{2910,10},'fun',[{type,{2910,10},product,[{atom,{2910,11},scheduler_bind_type}]},{type,{2910,35},union,[{atom,{2910,35},spread},{atom,{2911,35},processor_spread},{atom,{2912,35},thread_spread},{atom,{2913,35},thread_no_node_processor_spread},{atom,{2914,35},no_node_processor_spread},{atom,{2915,35},no_node_thread_spread},{atom,{2916,35},no_spread},{atom,{2917,35},unbound}]}]},{type,{2918,10},'fun',[{type,{2918,10},product,[{atom,{2918,11},scheduler_bindings}]},{type,{2918,35},tuple,any}]},{type,{2919,10},'fun',[{type,{2919,10},product,[{atom,{2919,11},scheduler_id}]},{ann_type,{2919,28},[{var,{2919,28},'SchedulerId'},{type,{2919,43},pos_integer,[]}]}]},{type,{2920,10},'fun',[{type,{2920,10},product,[{type,{2920,11},union,[{atom,{2920,11},schedulers},{atom,{2920,24},schedulers_online}]}]},{type,{2920,46},pos_integer,[]}]},{type,{2921,10},'fun',[{type,{2921,10},product,[{atom,{2921,11},smp_support}]},{type,{2921,27},boolean,[]}]},{type,{2926,10},'fun',[{type,{2926,10},product,[{atom,{2926,11},threads}]},{type,{2926,23},boolean,[]}]},{type,{2927,10},'fun',[{type,{2927,10},product,[{atom,{2927,11},thread_pool_size}]},{type,{2927,32},non_neg_integer,[]}]}]}}],since => <<79,84,80,32,49,55,46,48,44,79,84,80,32,49,57,46,48>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,69,114,108,97,110,103,32,68,105,115,116,114,105,98,117,116,105,111,110,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,114,101,97,116,105,111,110>>}],[]},{code,[],[<<99,114,101,97,116,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,114,101,97,116,105,111,110,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,99,114,101,97,116,105,111,110,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,97,32,110,111,100,101,32,105,115,32,114,101,115,116,97,114,116,101,100,46,32,84,104,101,32,99,114,101,97,116,105,111,110,32,111,102,32,97,32,110,111,100,101,32,105,115,32,115,116,111,114,101,100,32,105,110,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,115,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,115,44,32,97,110,100,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,105,115,32,109,97,107,101,115,32,105,116,32,40,116,111,32,115,111,109,101,32,101,120,116,101,110,116,41,32,112,111,115,115,105,98,108,101,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,105,100,101,110,116,105,102,105,101,114,115,32,102,114,111,109,32,100,105,102,102,101,114,101,110,116,32,105,110,99,97,114,110,97,116,105,111,110,115,32,111,102,32,97,32,110,111,100,101,46,32,84,104,101,32,118,97,108,105,100,32,99,114,101,97,116,105,111,110,115,32,97,114,101,32,105,110,116,101,103,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,49,46,46,51,44,32,98,117,116,32,116,104,105,115,32,119,105,108,108,32,112,114,111,98,97,98,108,121,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,73,102,32,116,104,101,32,110,111,100,101,32,105,115,32,110,111,116,32,97,108,105,118,101,44,32>>,{code,[],[<<48>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>}],[]},{code,[],[<<100,101,108,97,121,101,100,95,110,111,100,101,95,116,97,98,108,101,95,103,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,116,105,109,101,32,105,110,32,115,101,99,111,110,100,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,97,110,32,101,110,116,114,121,32,105,110,32,97,32,110,111,100,101,32,116,97,98,108,101,32,105,115,32,100,101,108,97,121,101,100,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,32,111,110,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,122,100,110,116,103,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,122,100,110,116,103,99>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116>>}],[]},{code,[],[<<100,105,115,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,100,105,115,116,114,105,98,117,116,105,111,110,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>}],[]},{code,[],[<<100,105,115,116,95,98,117,102,95,98,117,115,121,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,100,105,115,116,114,105,98,117,116,105,111,110,32,98,117,102,102,101,114,32,98,117,115,121,32,108,105,109,105,116,32,105,110,32,98,121,116,101,115,46,32,84,104,105,115,32,108,105,109,105,116,32,99,97,110,32,98,101,32,115,101,116,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,112,97,115,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,122,100,98,98,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,122,100,98,98,108>>]}]},<<32,116,111,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,105,115,116,95,99,116,114,108>>}],[]},{code,[],[<<100,105,115,116,95,99,116,114,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,116,117,112,108,101,115,32>>,{code,[],[<<123,78,111,100,101,44,32,67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121,125>>]},<<44,32,111,110,101,32,101,110,116,114,121,32,102,111,114,32,101,97,99,104,32,99,111,110,110,101,99,116,101,100,32,114,101,109,111,116,101,32,110,111,100,101,46,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,97,110,100,32>>,{code,[],[<<67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121>>]},<<32,105,115,32,116,104,101,32,112,111,114,116,32,111,114,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,114,101,115,112,111,110,115,105,98,108,101,32,102,111,114,32,116,104,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,116,111,32,116,104,97,116,32,110,111,100,101,46,32,77,111,114,101,32,115,112,101,99,105,102,105,99,97,108,108,121,44,32>>,{code,[],[<<67,111,110,116,114,111,108,108,105,110,103,69,110,116,105,116,121>>]},<<32,102,111,114,32,110,111,100,101,115,32,99,111,110,110,101,99,116,101,100,32,116,104,114,111,117,103,104,32,84,67,80,47,73,80,32,40,116,104,101,32,110,111,114,109,97,108,32,99,97,115,101,41,32,105,115,32,116,104,101,32,115,111,99,107,101,116,32,117,115,101,100,32,105,110,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,99,32,110,111,100,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,54,53,57>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2861,10},'fun',[{type,{2861,10},product,[{atom,{2861,11},creation}]},{type,{2861,24},integer,[]}]},{type,{2863,10},'fun',[{type,{2863,10},product,[{atom,{2863,11},delayed_node_table_gc}]},{type,{2863,37},union,[{atom,{2863,37},infinity},{type,{2863,48},non_neg_integer,[]}]}]},{type,{2867,10},'fun',[{type,{2867,10},product,[{atom,{2867,11},dist}]},{type,{2867,20},binary,[]}]},{type,{2868,10},'fun',[{type,{2868,10},product,[{atom,{2868,11},dist_buf_busy_limit}]},{type,{2868,35},non_neg_integer,[]}]},{type,{2869,10},'fun',[{type,{2869,10},product,[{atom,{2869,11},dist_ctrl}]},{type,{2869,25},tuple,[{ann_type,{2869,26},[{var,{2869,26},'Node'},{type,{2869,34},node,[]}]},{ann_type,{2870,26},[{var,{2870,26},'ControllingEntity'},{type,{2870,47},union,[{type,{2870,47},port,[]},{type,{2870,56},pid,[]}]}]}]}]}]}}],since => <<79,84,80,32,49,56,46,48,44,79,84,80,32,82,49,52,66,48,49>>}},{{function,system_info,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2834}],[<<115,121,115,116,101,109,95,105,110,102,111,47,49>>],#{<<101,110>> => [{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,105,115,99,95,116,97,103,115>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,118,97,114,105,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,40,101,109,117,108,97,116,111,114,41,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,116,101,109>>]},<<58>>]},{dl,[],[{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,98,117,105,108,100,95,116,121,112,101>>}],[]},{code,[],[<<98,117,105,108,100,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<68,101,112,114,101,99,97,116,101,100,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,109,117,95,116,121,112,101>>]},<<32,105,110,115,116,101,97,100>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>}],[]},{code,[],[<<99,95,99,111,109,112,105,108,101,114,95,117,115,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,119,111,45,116,117,112,108,101,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,67,32,99,111,109,112,105,108,101,114,32,117,115,101,100,32,119,104,101,110,32,99,111,109,112,105,108,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,117,110,107,110,111,119,110,46,32,84,104,101,32,115,101,99,111,110,100,32,101,108,101,109,101,110,116,32,105,115,32,97,32,116,101,114,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,99,111,109,112,105,108,101,114,44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,117,110,107,110,111,119,110,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,104,101,99,107,95,105,111>>}],[]},{code,[],[<<99,104,101,99,107,95,105,111>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,109,117,108,97,116,111,114,115,32,105,110,116,101,114,110,97,108,32,73,47,79,32,99,104,101,99,107,105,110,103,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,32,99,97,110,32,118,97,114,121,32,98,101,116,119,101,101,110,32,112,108,97,116,102,111,114,109,115,32,97,110,100,32,111,118,101,114,32,116,105,109,101,46,32,73,116,32,105,115,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,32,108,105,115,116,32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,99,111,109,112,97,116,95,114,101,108>>}],[]},{code,[],[<<99,111,109,112,97,116,95,114,101,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,32,111,102,32,116,104,101,32,108,111,99,97,108,32,110,111,100,101,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,84,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,115,101,116,32,116,111,32,98,101,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,46,32,84,104,101,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,109,111,100,101,32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,97,116,32,115,116,97,114,116,117,112,32,98,121,32,117,115,105,110,103,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,99,111,109,112,97,116,95,114,101,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,82>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,101,98,117,103,95,99,111,109,112,105,108,101,100>>}],[]},{code,[],[<<100,101,98,117,103,95,99,111,109,112,105,108,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,104,97,115,32,98,101,101,110,32,100,101,98,117,103,45,99,111,109,112,105,108,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,114,105,118,101,114,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<100,114,105,118,101,114,95,118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,100,114,105,118,101,114,32,118,101,114,115,105,111,110,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,104,97,115,32,116,104,101,32,102,111,114,109,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,114,105,118,101,114,35,118,101,114,115,105,111,110,95,109,97,110,97,103,101,109,101,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101>>}],[]},{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,102,114,97,109,101,119,111,114,107,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,46,32,73,116,32,99,97,110,32,98,101,32>>,{code,[],[<<100,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<115,121,115,116,101,109,116,97,112>>]},<<44,32,111,114,32>>,{code,[],[<<110,111,110,101>>]},<<46,32,70,111,114,32,97,32,99,111,109,109,101,114,99,105,97,108,32,111,114,32,115,116,97,110,100,97,114,100,32,98,117,105,108,100,44,32,105,116,32,105,115,32,97,108,119,97,121,115,32>>,{code,[],[<<110,111,110,101>>]},<<46,32,84,104,101,32,111,116,104,101,114,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,105,110,100,105,99,97,116,101,32,97,32,99,117,115,116,111,109,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<46,47,99,111,110,102,105,103,117,114,101,32,45,45,119,105,116,104,45,100,121,110,97,109,105,99,45,116,114,97,99,101,61,100,116,114,97,99,101>>]},<<41,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,44,32,115,101,101,32>>,{a,[{href,<<114,117,110,116,105,109,101,95,116,111,111,108,115,58,100,121,110,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,121,110,116,114,97,99,101,40,51,41>>]}]},<<32,109,97,110,117,97,108,32,112,97,103,101,32,97,110,100,32,116,104,101,32>>,{code,[],[<<82,69,65,68,77,69,46,100,116,114,97,99,101>>]},<<47>>,{code,[],[<<82,69,65,68,77,69,46,115,121,115,116,101,109,116,97,112>>]},<<32,102,105,108,101,115,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,115,111,117,114,99,101,32,99,111,100,101,32,116,111,112,32,100,105,114,101,99,116,111,114,121,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>}],[]},{code,[],[<<100,121,110,97,109,105,99,95,116,114,97,99,101,95,112,114,111,98,101,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32>>,{code,[],[<<98,111,111,108,101,97,110,40,41>>]},<<32,105,110,100,105,99,97,116,105,110,103,32,105,102,32,100,121,110,97,109,105,99,32,116,114,97,99,101,32,112,114,111,98,101,115,32,40>>,{code,[],[<<100,116,114,97,99,101>>]},<<32,111,114,32>>,{code,[],[<<115,121,115,116,101,109,116,97,112>>]},<<41,32,97,114,101,32,98,117,105,108,116,32,105,110,116,111,32,116,104,101,32,101,109,117,108,97,116,111,114,46,32,84,104,105,115,32,99,97,110,32,111,110,108,121,32,98,101,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,32,119,97,115,32,98,117,105,108,116,32,102,111,114,32,100,121,110,97,109,105,99,32,116,114,97,99,105,110,103,32,40,116,104,97,116,32,105,115,44,32>>,{code,[],[<<115,121,115,116,101,109,95,105,110,102,111,40,100,121,110,97,109,105,99,95,116,114,97,99,101,41>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<100,116,114,97,99,101>>]},<<32,111,114,32>>,{code,[],[<<115,121,115,116,101,109,116,97,112>>]},<<41,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,102,108,97,118,111,114>>}],[]},{code,[],[<<101,109,117,95,102,108,97,118,111,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,102,108,97,118,111,114,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,119,105,108,108,32,98,101,32,101,105,116,104,101,114,32>>,{code,[],[<<101,109,117>>]},<<32,111,114,32>>,{code,[],[<<106,105,116>>]},<<46,32,80,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,101,109,117,95,116,121,112,101>>}],[]},{code,[],[<<101,109,117,95,116,121,112,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,98,117,105,108,100,32,116,121,112,101,32,111,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,112,116>>]},<<32,102,111,114,32,111,112,116,105,109,105,122,101,100,46,32,79,116,104,101,114,32,112,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,97,114,101,32>>,{code,[],[<<100,101,98,117,103>>]},<<44,32>>,{code,[],[<<103,99,111,118>>]},<<44,32>>,{code,[],[<<118,97,108,103,114,105,110,100>>]},<<44,32>>,{code,[],[<<103,112,114,111,102>>]},<<44,32,97,110,100,32>>,{code,[],[<<108,99,110,116>>]},<<46,32,80,111,115,115,105,98,108,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,111,114,32,114,101,109,111,118,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,105,110,102,111>>}],[]},{code,[],[<<105,110,102,111>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,109,105,115,99,101,108,108,97,110,101,111,117,115,32,115,121,115,116,101,109,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,107,101,114,110,101,108,95,112,111,108,108>>}],[]},{code,[],[<<107,101,114,110,101,108,95,112,111,108,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,101,109,117,108,97,116,111,114,32,117,115,101,115,32,115,111,109,101,32,107,105,110,100,32,111,102,32,107,101,114,110,101,108,45,112,111,108,108,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,108,111,97,100,101,100>>}],[]},{code,[],[<<108,111,97,100,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,99,111,110,116,97,105,110,105,110,103,32,97,32,115,116,114,105,110,103,32,111,102,32,108,111,97,100,101,100,32,109,111,100,117,108,101,32,105,110,102,111,114,109,97,116,105,111,110,32,102,111,114,109,97,116,116,101,100,32,97,115,32,105,110,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,99,114,97,115,104,95,100,117,109,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<72,111,119,32,116,111,32,105,110,116,101,114,112,114,101,116,32,116,104,101,32,69,114,108,97,110,103,32,99,114,97,115,104,32,100,117,109,112,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,97,99,104,105,110,101>>}],[]},{code,[],[<<109,97,99,104,105,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,110,97,109,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>}],[]},{code,[],[<<109,111,100,105,102,105,101,100,95,116,105,109,105,110,103,95,108,101,118,101,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,45,108,101,118,101,108,32,40,97,110,32,105,110,116,101,103,101,114,41,32,105,102,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,32,105,115,32,101,110,97,98,108,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,109,111,100,105,102,105,101,100,32,116,105,109,105,110,103,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,102,108,97,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,84>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,84>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]}]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,110,105,102,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<110,105,102,95,118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,78,73,70,32,105,110,116,101,114,102,97,99,101,32,117,115,101,100,32,98,121,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46,32,73,116,32,105,115,32,111,110,32,116,104,101,32,102,111,114,109,32,34,60,109,97,106,111,114,32,118,101,114,62,46,60,109,105,110,111,114,32,118,101,114,62,34,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101>>}],[]},{code,[],[<<111,116,112,95,114,101,108,101,97,115,101>>]}]},{dd,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,111,116,112,95,114,101,108,101,97,115,101>>}],[]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,116,104,97,116,32,116,104,101,32,99,117,114,114,101,110,116,108,121,32,101,120,101,99,117,116,105,110,103,32,69,82,84,83,32,97,112,112,108,105,99,97,116,105,111,110,32,105,115,32,112,97,114,116,32,111,102,46>>]},{p,[],[<<65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,49,55,44,32,116,104,101,32,79,84,80,32,114,101,108,101,97,115,101,32,110,117,109,98,101,114,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,109,97,106,111,114,32,79,84,80,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,46,32,78,111,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,105,110,102,111,40,41>>]},<<32,97,114,103,117,109,101,110,116,32,103,105,118,101,115,32,116,104,101,32,101,120,97,99,116,32,79,84,80,32,118,101,114,115,105,111,110,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,120,97,99,116,32,79,84,80,32,118,101,114,115,105,111,110,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,32,105,115,32,100,105,102,102,105,99,117,108,116,32,116,111,32,100,101,116,101,114,109,105,110,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,118,101,114,115,105,111,110,115,32,105,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,115,121,115,116,101,109,95,112,114,105,110,99,105,112,108,101,115,58,118,101,114,115,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<83,121,115,116,101,109,32,112,114,105,110,99,105,112,108,101,115>>]},<<32,105,110,32,83,121,115,116,101,109,32,68,111,99,117,109,101,110,116,97,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>}],[]},{code,[],[<<112,111,114,116,95,112,97,114,97,108,108,101,108,105,115,109>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,101,102,97,117,108,116,32,112,111,114,116,32,112,97,114,97,108,108,101,108,105,115,109,32,115,99,104,101,100,117,108,105,110,103,32,104,105,110,116,32,117,115,101,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,99,111,109,109,97,110,100,45,108,105,110,101,32,97,114,103,117,109,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,43,115,112,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<43,115,112,112>>]}]},<<32,105,110,32>>,{code,[],[<<101,114,108,40,49,41>>]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>}],[]},{code,[],[<<115,121,115,116,101,109,95,97,114,99,104,105,116,101,99,116,117,114,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,112,114,111,99,101,115,115,111,114,32,97,110,100,32,79,83,32,97,114,99,104,105,116,101,99,116,117,114,101,32,116,104,101,32,101,109,117,108,97,116,111,114,32,105,115,32,98,117,105,108,116,32,102,111,114,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,108,111,103,103,101,114>>}],[]},{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32>>,{code,[],[<<115,121,115,116,101,109,95,108,111,103,103,101,114>>]},<<32,97,115,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,102,108,97,103,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,102,108,97,103,40,115,121,115,116,101,109,95,108,111,103,103,101,114,44,32,95,41>>]}]},<<46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,115,121,115,116,101,109,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<115,121,115,116,101,109,95,118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,97,110,100,32,115,111,109,101,32,105,109,112,111,114,116,97,110,116,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,99,104,101,100,117,108,101,114,115,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>}],[]},{code,[],[<<116,114,97,99,101,95,99,111,110,116,114,111,108,95,119,111,114,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,110,111,100,101,32,116,114,97,99,101,32,99,111,110,116,114,111,108,32,119,111,114,100,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<103,101,116,95,116,99,119>>]},<<32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,109,97,116,99,104,95,115,112,101,99,35,103,101,116,95,116,99,119>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,118,101,114,115,105,111,110>>}],[]},{code,[],[<<118,101,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,46>>]}]},{dt,[],[{a,[{id,<<115,121,115,116,101,109,95,105,110,102,111,95,119,111,114,100,115,105,122,101>>}],[]},{code,[],[<<119,111,114,100,115,105,122,101>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,119,111,114,100,115,105,122,101,44,32,105,110,116,101,114,110,97,108,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,105,122,101,32,111,102,32,69,114,108,97,110,103,32,116,101,114,109,32,119,111,114,100,115,32,105,110,32,98,121,116,101,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,97,110,100,32,56,32,105,115,32,114,101,116,117,114,110,101,100,32,111,110,32,97,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,46>>]}]},{dt,[],[{code,[],[<<123,119,111,114,100,115,105,122,101,44,32,101,120,116,101,114,110,97,108,125>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,114,117,101,32,119,111,114,100,32,115,105,122,101,32,111,102,32,116,104,101,32,101,109,117,108,97,116,111,114,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,115,105,122,101,32,111,102,32,97,32,112,111,105,110,116,101,114,46,32,84,104,101,32,118,97,108,117,101,32,105,115,32,103,105,118,101,110,32,105,110,32,98,121,116,101,115,32,97,115,32,97,110,32,105,110,116,101,103,101,114,46,32,79,110,32,97,32,112,117,114,101,32,51,50,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,52,32,105,115,32,114,101,116,117,114,110,101,100,46,32,79,110,32,97,32,54,52,45,98,105,116,32,97,114,99,104,105,116,101,99,116,117,114,101,44,32,56,32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,48,55,51,48>>,signature => [{attribute,{2834,2},spec,{{erlang,system_info,1},[{type,{2854,10},'fun',[{type,{2854,10},product,[{atom,{2854,11},c_compiler_used}]},{type,{2854,31},tuple,[{type,{2854,32},atom,[]},{type,{2854,40},term,[]}]}]},{type,{2855,10},'fun',[{type,{2855,10},product,[{atom,{2855,11},check_io}]},{type,{2855,24},list,[{var,{2855,25},'_'}]}]},{type,{2856,10},'fun',[{type,{2856,10},product,[{atom,{2856,11},compat_rel}]},{type,{2856,26},integer,[]}]},{type,{2862,10},'fun',[{type,{2862,10},product,[{atom,{2862,11},debug_compiled}]},{type,{2862,30},boolean,[]}]},{type,{2871,10},'fun',[{type,{2871,10},product,[{atom,{2871,11},driver_version}]},{type,{2871,30},string,[]}]},{type,{2872,10},'fun',[{type,{2872,10},product,[{atom,{2872,11},dynamic_trace}]},{type,{2872,29},union,[{atom,{2872,29},none},{atom,{2872,36},dtrace},{atom,{2872,45},systemtap}]}]},{type,{2873,10},'fun',[{type,{2873,10},product,[{atom,{2873,11},dynamic_trace_probes}]},{type,{2873,36},boolean,[]}]},{type,{2875,10},'fun',[{type,{2875,10},product,[{atom,{2875,11},emu_flavor}]},{type,{2875,26},union,[{atom,{2875,26},emu},{atom,{2875,32},jit}]}]},{type,{2876,10},'fun',[{type,{2876,10},product,[{atom,{2876,11},emu_type}]},{type,{2876,24},union,[{atom,{2876,24},opt},{atom,{2876,30},debug},{atom,{2876,38},gcov},{atom,{2876,45},valgrind},{atom,{2876,56},gprof},{atom,{2876,64},lcnt},{atom,{2876,71},frmptr}]}]},{type,{2884,10},'fun',[{type,{2884,10},product,[{atom,{2884,11},info}]},{type,{2884,20},binary,[]}]},{type,{2885,10},'fun',[{type,{2885,10},product,[{atom,{2885,11},kernel_poll}]},{type,{2885,27},boolean,[]}]},{type,{2886,10},'fun',[{type,{2886,10},product,[{atom,{2886,11},loaded}]},{type,{2886,22},binary,[]}]},{type,{2890,10},'fun',[{type,{2890,10},product,[{atom,{2890,11},machine}]},{type,{2890,23},string,[]}]},{type,{2896,10},'fun',[{type,{2896,10},product,[{atom,{2896,11},modified_timing_level}]},{type,{2896,37},union,[{type,{2896,37},integer,[]},{atom,{2896,49},undefined}]}]},{type,{2899,10},'fun',[{type,{2899,10},product,[{atom,{2899,11},nif_version}]},{type,{2899,27},string,[]}]},{type,{2901,10},'fun',[{type,{2901,10},product,[{atom,{2901,11},otp_release}]},{type,{2901,27},string,[]}]},{type,{2904,10},'fun',[{type,{2904,10},product,[{atom,{2904,11},port_parallelism}]},{type,{2904,32},boolean,[]}]},{type,{2923,10},'fun',[{type,{2923,10},product,[{atom,{2923,11},system_architecture}]},{type,{2923,35},string,[]}]},{type,{2924,10},'fun',[{type,{2924,10},product,[{atom,{2924,11},system_logger}]},{type,{2924,29},union,[{atom,{2924,29},logger},{atom,{2924,38},undefined},{type,{2924,50},pid,[]}]}]},{type,{2925,10},'fun',[{type,{2925,10},product,[{atom,{2925,11},system_version}]},{type,{2925,30},string,[]}]},{type,{2932,10},'fun',[{type,{2932,10},product,[{atom,{2932,11},trace_control_word}]},{type,{2932,34},non_neg_integer,[]}]},{type,{2934,10},'fun',[{type,{2934,10},product,[{atom,{2934,11},version}]},{type,{2934,23},string,[]}]},{type,{2935,10},'fun',[{type,{2935,10},product,[{type,{2935,11},union,[{atom,{2935,11},wordsize},{type,{2935,22},tuple,[{atom,{2935,23},wordsize},{atom,{2935,33},internal}]},{type,{2935,45},tuple,[{atom,{2935,46},wordsize},{atom,{2935,56},external}]}]}]},{type,{2935,70},union,[{integer,{2935,70},4},{integer,{2935,74},8}]}]}]}}],since => <<79,84,80,32,49,55,46,52,44,79,84,80,32,50,49,46,51,44,79,84,80,32,50,52,46,48,44,79,84,80,32,82,49,53,66,48,49,44,79,84,80,32,82,49,54,66>>}},{{function,system_monitor,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2020}],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>]}]},<<32,97,115,32>>,{code,[],[<<123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,110,111,32,115,101,116,116,105,110,103,115,32,101,120,105,115,116,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,48,51,52>>,signature => [{attribute,{2020,2},spec,{{erlang,system_monitor,0},[{type,{2020,28},bounded_fun,[{type,{2020,28},'fun',[{type,{2020,28},product,[]},{var,{2020,34},'MonSettings'}]},[{type,{2021,7},constraint,[{atom,{2021,7},is_subtype},[{var,{2021,7},'MonSettings'},{type,{2021,22},union,[{atom,{2021,22},undefined},{type,{2021,34},tuple,[{var,{2021,36},'MonitorPid'},{var,{2021,48},'Options'}]}]}]]},{type,{2022,7},constraint,[{atom,{2022,7},is_subtype},[{var,{2022,7},'MonitorPid'},{type,{2022,21},pid,[]}]]},{type,{2023,7},constraint,[{atom,{2023,7},is_subtype},[{var,{2023,7},'Options'},{type,{2023,18},list,[{user_type,{2023,20},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2028}],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<87,104,101,110,32,99,97,108,108,101,100,32,119,105,116,104,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<44,32,97,108,108,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,32,109,111,110,105,116,111,114,105,110,103,32,115,101,116,116,105,110,103,115,32,97,114,101,32,99,108,101,97,114,101,100,46>>]},{p,[],[<<67,97,108,108,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,105,116,104,32>>,{code,[],[<<123,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,125>>]},<<32,97,115,32,97,114,103,117,109,101,110,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,40,77,111,110,105,116,111,114,80,105,100,44,32,79,112,116,105,111,110,115,41>>]}]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,48,52,56>>,signature => [{attribute,{2028,2},spec,{{erlang,system_monitor,1},[{type,{2028,28},bounded_fun,[{type,{2028,28},'fun',[{type,{2028,28},product,[{var,{2028,29},'Arg'}]},{var,{2028,37},'MonSettings'}]},[{type,{2029,7},constraint,[{atom,{2029,7},is_subtype},[{var,{2029,7},'Arg'},{type,{2029,14},union,[{atom,{2029,14},undefined},{type,{2029,26},tuple,[{var,{2029,28},'MonitorPid'},{var,{2029,40},'Options'}]}]}]]},{type,{2030,7},constraint,[{atom,{2030,7},is_subtype},[{var,{2030,7},'MonSettings'},{type,{2030,22},union,[{atom,{2030,22},undefined},{type,{2030,34},tuple,[{var,{2030,36},'MonitorPid'},{var,{2030,48},'Options'}]}]}]]},{type,{2031,7},constraint,[{atom,{2031,7},is_subtype},[{var,{2031,7},'MonitorPid'},{type,{2031,21},pid,[]}]]},{type,{2032,7},constraint,[{atom,{2032,7},is_subtype},[{var,{2032,7},'Options'},{type,{2032,18},list,[{user_type,{2032,20},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_monitor,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2037}],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<83,101,116,115,32,116,104,101,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,46,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,114,101,99,101,105,118,105,110,103,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,109,111,110,105,116,111,114,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,108,111,110,103,95,103,99,44,32,84,105,109,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,116,97,107,101,115,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<84,105,109,101>>]},<<32,119,97,108,108,32,99,108,111,99,107,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,71,99,80,105,100,44,32,108,111,110,103,95,103,99,44,32,73,110,102,111,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<71,99,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,119,97,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[<<79,110,101,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,115,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,71,99,84,105,109,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<71,99,84,105,109,101>>]},<<32,105,115,32,116,104,101,32,116,105,109,101,32,102,111,114,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,109,105,108,108,105,115,101,99,111,110,100,115,46,32,84,104,101,32,111,116,104,101,114,32,116,117,112,108,101,115,32,97,114,101,32,116,97,103,103,101,100,32,119,105,116,104,32>>,{code,[],[<<104,101,97,112,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<115,116,97,99,107,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<109,98,117,102,95,115,105,122,101>>]},<<44,32>>,{code,[],[<<111,108,100,95,104,101,97,112,95,115,105,122,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]},<<46,32,84,104,101,115,101,32,116,117,112,108,101,115,32,97,114,101,32,101,120,112,108,97,105,110,101,100,32,105,110,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]}]},<<32,40,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<41,46,32,78,101,119,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,44,32,97,110,100,32,116,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32>>,{code,[],[<<73,110,102,111>>]},<<32,108,105,115,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]}]},{dt,[],[{code,[],[<<123,108,111,110,103,95,115,99,104,101,100,117,108,101,44,32,84,105,109,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,114,117,110,115,32,117,110,105,110,116,101,114,114,117,112,116,101,100,32,102,111,114,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<84,105,109,101>>]},<<32,119,97,108,108,32,99,108,111,99,107,32,109,105,108,108,105,115,101,99,111,110,100,115,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,80,105,100,79,114,80,111,114,116,44,32,108,111,110,103,95,115,99,104,101,100,117,108,101,44,32,73,110,102,111,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<80,105,100,79,114,80,111,114,116>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,116,104,97,116,32,119,97,115,32,114,117,110,110,105,110,103,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,101,118,101,110,116,46>>]},{p,[],[<<73,102,32,97,32>>,{code,[],[<<112,105,100,40,41>>]},<<44,32,116,104,101,32,116,117,112,108,101,115,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,77,105,108,108,105,115,125>>]},<<44,32>>,{code,[],[<<123,105,110,44,32,76,111,99,97,116,105,111,110,125>>]},<<44,32,97,110,100,32>>,{code,[],[<<123,111,117,116,44,32,76,111,99,97,116,105,111,110,125>>]},<<32,97,114,101,32,112,114,101,115,101,110,116,44,32,119,104,101,114,101,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,101,105,116,104,101,114,32,97,110,32,77,70,65,32,40>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<41,32,100,101,115,99,114,105,98,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,104,101,114,101,32,116,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,115,99,104,101,100,117,108,101,100,32,105,110,47,111,117,116,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]},{p,[],[<<73,102,32,97,32>>,{code,[],[<<112,111,114,116,40,41>>]},<<44,32,116,104,101,32,116,117,112,108,101,115,32>>,{code,[],[<<123,116,105,109,101,111,117,116,44,32,77,105,108,108,105,115,125>>]},<<32,97,110,100,32>>,{code,[],[<<123,112,111,114,116,95,111,112,44,79,112,125>>]},<<32,97,114,101,32,112,114,101,115,101,110,116,46,32>>,{code,[],[<<79,112>>]},<<32,105,115,32,111,110,101,32,111,102,32>>,{code,[],[<<112,114,111,99,95,115,105,103>>]},<<44,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<44,32>>,{code,[],[<<105,110,112,117,116>>]},<<44,32>>,{code,[],[<<111,117,116,112,117,116>>]},<<44,32>>,{code,[],[<<101,118,101,110,116>>]},<<44,32,111,114,32>>,{code,[],[<<100,105,115,116,95,99,109,100>>]},<<44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,119,104,105,99,104,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,32,119,97,115,32,101,120,101,99,117,116,105,110,103,46>>]},{p,[],[{code,[],[<<112,114,111,99,95,115,105,103>>]},<<32,105,115,32,97,110,32,105,110,116,101,114,110,97,108,32,111,112,101,114,97,116,105,111,110,32,97,110,100,32,105,115,32,110,101,118,101,114,32,116,111,32,97,112,112,101,97,114,44,32,119,104,105,108,101,32,116,104,101,32,111,116,104,101,114,115,32,114,101,112,114,101,115,101,110,116,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,115,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<44,32>>,{code,[],[<<114,101,97,100,121,95,105,110,112,117,116>>]},<<44,32>>,{code,[],[<<114,101,97,100,121,95,111,117,116,112,117,116>>]},<<44,32>>,{code,[],[<<101,118,101,110,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<111,117,116,112,117,116,118>>]},<<32,40,119,104,101,110,32,116,104,101,32,112,111,114,116,32,105,115,32,117,115,101,100,32,98,121,32,100,105,115,116,114,105,98,117,116,105,111,110,41,46,32,86,97,108,117,101,32>>,{code,[],[<<77,105,108,108,105,115>>]},<<32,105,110,32,116,117,112,108,101,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,105,110,102,111,114,109,115,32,97,98,111,117,116,32,116,104,101,32,117,110,105,110,116,101,114,114,117,112,116,101,100,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,44,32,119,104,105,99,104,32,97,108,119,97,121,115,32,105,115,32,101,113,117,97,108,32,116,111,32,111,114,32,104,105,103,104,101,114,32,116,104,97,110,32,116,104,101,32>>,{code,[],[<<84,105,109,101>>]},<<32,118,97,108,117,101,32,115,117,112,112,108,105,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,116,114,97,99,101,46,32,78,101,119,32,116,117,112,108,101,115,32,99,97,110,32,98,101,32,97,100,100,101,100,32,116,111,32,116,104,101,32>>,{code,[],[<<73,110,102,111>>]},<<32,108,105,115,116,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,32,105,110,32,116,104,101,32,108,105,115,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,97,116,32,97,110,121,32,116,105,109,101,32,119,105,116,104,111,117,116,32,112,114,105,111,114,32,110,111,116,105,99,101,46>>]},{p,[],[<<84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,116,101,99,116,32,112,114,111,98,108,101,109,115,32,119,105,116,104,32,78,73,70,115,32,111,114,32,100,114,105,118,101,114,115,32,116,104,97,116,32,116,97,107,101,32,116,111,111,32,108,111,110,103,32,116,111,32,101,120,101,99,117,116,101,46,32,49,32,109,115,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97,32,103,111,111,100,32,109,97,120,105,109,117,109,32,116,105,109,101,32,102,111,114,32,97,32,100,114,105,118,101,114,32,99,97,108,108,98,97,99,107,32,111,114,32,97,32,78,73,70,46,32,72,111,119,101,118,101,114,44,32,97,32,116,105,109,101,45,115,104,97,114,105,110,103,32,115,121,115,116,101,109,32,105,115,32,117,115,117,97,108,108,121,32,116,111,32,99,111,110,115,105,100,101,114,32,101,118,101,114,121,116,104,105,110,103,32,60,32,49,48,48,32,109,115,32,97,115,32,34,112,111,115,115,105,98,108,101,34,32,97,110,100,32,102,97,105,114,108,121,32,34,110,111,114,109,97,108,34,46,32,72,111,119,101,118,101,114,44,32,108,111,110,103,101,114,32,115,99,104,101,100,117,108,101,32,116,105,109,101,115,32,99,97,110,32,105,110,100,105,99,97,116,101,32,115,119,97,112,112,105,110,103,32,111,114,32,97,32,109,105,115,98,101,104,97,118,105,110,103,32,78,73,70,47,100,114,105,118,101,114,46,32,77,105,115,98,101,104,97,118,105,110,103,32,78,73,70,115,32,97,110,100,32,100,114,105,118,101,114,115,32,99,97,110,32,99,97,117,115,101,32,98,97,100,32,114,101,115,111,117,114,99,101,32,117,116,105,108,105,122,97,116,105,111,110,32,97,110,100,32,98,97,100,32,111,118,101,114,97,108,108,32,115,121,115,116,101,109,32,112,101,114,102,111,114,109,97,110,99,101,46>>]}]},{dt,[],[{code,[],[<<123,108,97,114,103,101,95,104,101,97,112,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,114,101,115,117,108,116,115,32,105,110,32,116,104,101,32,97,108,108,111,99,97,116,101,100,32,115,105,122,101,32,111,102,32,97,32,104,101,97,112,32,98,101,105,110,103,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<83,105,122,101>>]},<<32,119,111,114,100,115,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,71,99,80,105,100,44,32,108,97,114,103,101,95,104,101,97,112,44,32,73,110,102,111,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<71,99,80,105,100>>]},<<32,97,110,100,32>>,{code,[],[<<73,110,102,111>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,102,111,114,32>>,{code,[],[<<108,111,110,103,95,103,99>>]},<<32,101,97,114,108,105,101,114,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,116,117,112,108,101,32,116,97,103,103,101,100,32,119,105,116,104,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,46>>]},{p,[],[<<84,104,101,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,115,105,122,101,115,32,111,102,32,97,108,108,32,109,101,109,111,114,121,32,98,108,111,99,107,115,32,97,108,108,111,99,97,116,101,100,32,102,111,114,32,97,108,108,32,104,101,97,112,32,103,101,110,101,114,97,116,105,111,110,115,32,97,102,116,101,114,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,101,113,117,97,108,32,116,111,32,111,114,32,104,105,103,104,101,114,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<46>>]},{p,[],[<<87,104,101,110,32,97,32,112,114,111,99,101,115,115,32,105,115,32,107,105,108,108,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32,105,116,32,105,115,32,107,105,108,108,101,100,32,98,101,102,111,114,101,32,116,104,101,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,99,111,109,112,108,101,116,101,32,97,110,100,32,116,104,117,115,32,110,111,32,108,97,114,103,101,32,104,101,97,112,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46>>]}]},{dt,[],[{code,[],[<<98,117,115,121,95,112,111,114,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,103,101,116,115,32,115,117,115,112,101,110,100,101,100,32,98,101,99,97,117,115,101,32,105,116,32,115,101,110,100,115,32,116,111,32,97,32,98,117,115,121,32,112,111,114,116,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,83,117,115,80,105,100,44,32,98,117,115,121,95,112,111,114,116,44,32,80,111,114,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<83,117,115,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,103,111,116,32,115,117,115,112,101,110,100,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,111,32>>,{code,[],[<<80,111,114,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<98,117,115,121,95,100,105,115,116,95,112,111,114,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,32,103,101,116,115,32,115,117,115,112,101,110,100,101,100,32,98,101,99,97,117,115,101,32,105,116,32,115,101,110,100,115,32,116,111,32,97,32,112,114,111,99,101,115,115,32,111,110,32,97,32,114,101,109,111,116,101,32,110,111,100,101,32,119,104,111,115,101,32,105,110,116,101,114,45,110,111,100,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,119,97,115,32,104,97,110,100,108,101,100,32,98,121,32,97,32,98,117,115,121,32,112,111,114,116,44,32,97,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,109,111,110,105,116,111,114,44,32,83,117,115,80,105,100,44,32,98,117,115,121,95,100,105,115,116,95,112,111,114,116,44,32,80,111,114,116,125>>]},<<32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<46,32>>,{code,[],[<<83,117,115,80,105,100>>]},<<32,105,115,32,116,104,101,32,112,105,100,32,116,104,97,116,32,103,111,116,32,115,117,115,112,101,110,100,101,100,32,119,104,101,110,32,115,101,110,100,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,32,105,110,116,101,114,45,110,111,100,101,32,99,111,109,109,117,110,105,99,97,116,105,111,110,32,112,111,114,116,32>>,{code,[],[<<80,111,114,116>>]},<<46>>]}]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,115,101,116,116,105,110,103,115,32,106,117,115,116,32,108,105,107,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,48>>]}]},<<46>>]},{p,[],[<<84,104,101,32,97,114,103,117,109,101,110,116,115,32,116,111,32>>,{code,[],[<<115,121,115,116,101,109,95,109,111,110,105,116,111,114,47,50>>]},<<32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,97,108,108,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,111,110,32,116,104,101,32,110,111,100,101,32,115,104,111,117,108,100,32,98,101,32,100,111,110,101,44,32,110,111,116,32,104,111,119,32,105,116,32,115,104,111,117,108,100,32,98,101,32,99,104,97,110,103,101,100,46,32,84,104,105,115,32,109,101,97,110,115,32,111,110,108,121,32,111,110,101,32,112,114,111,99,101,115,115,32,97,116,32,97,32,116,105,109,101,32,40>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<41,32,99,97,110,32,98,101,32,116,104,101,32,114,101,99,101,105,118,101,114,32,111,102,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,46,32,65,108,115,111,44,32,116,104,101,32,119,97,121,32,116,111,32,99,108,101,97,114,32,97,32,115,112,101,99,105,102,105,99,32,109,111,110,105,116,111,114,32,111,112,116,105,111,110,32,105,115,32,116,111,32,110,111,116,32,105,110,99,108,117,100,101,32,105,116,32,105,110,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<79,112,116,105,111,110,115>>]},<<46,32,65,108,108,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,105,110,103,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,98,101,32,99,108,101,97,114,101,100,32,105,102,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,116,101,114,109,105,110,97,116,101,115,46>>]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,110,111,32,115,112,101,99,105,97,108,32,111,112,116,105,111,110,32,118,97,108,117,101,115,32,40,108,105,107,101,32,122,101,114,111,41,32,116,111,32,99,108,101,97,114,32,97,110,32,111,112,116,105,111,110,46,32,83,111,109,101,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,104,97,118,101,32,97,32,117,110,115,112,101,99,105,102,105,101,100,32,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,76,111,119,101,114,32,118,97,108,117,101,115,32,119,105,108,108,32,98,101,32,97,100,106,117,115,116,101,100,32,116,111,32,116,104,101,32,109,105,110,105,109,117,109,32,118,97,108,117,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,105,115,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,109,111,110,105,116,111,114,32,97,108,108,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,119,105,116,104,32>>,{code,[],[<<123,108,111,110,103,95,103,99,44,32,48,125>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,102,32,97,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,103,101,116,115,32,115,111,32,108,97,114,103,101,32,116,104,97,116,32,105,116,32,105,116,115,101,108,102,32,115,116,97,114,116,115,32,116,111,32,99,97,117,115,101,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,110,103,44,32,116,104,101,32,109,101,115,115,97,103,101,115,32,101,110,108,97,114,103,101,32,116,104,101,32,112,114,111,99,101,115,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,110,100,32,112,114,111,98,97,98,108,121,32,109,97,107,101,32,116,104,101,32,112,114,111,98,108,101,109,32,119,111,114,115,101,46>>]},{p,[],[<<75,101,101,112,32,116,104,101,32,109,111,110,105,116,111,114,105,110,103,32,112,114,111,99,101,115,115,32,110,101,97,116,32,97,110,100,32,100,111,32,110,111,116,32,115,101,116,32,116,104,101,32,115,121,115,116,101,109,32,109,111,110,105,116,111,114,32,108,105,109,105,116,115,32,116,111,111,32,116,105,103,104,116,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<73,102,32>>,{code,[],[<<77,111,110,105,116,111,114,80,105,100>>]},<<32,105,115,32,110,111,116,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,48,54,54>>,signature => [{attribute,{2037,2},spec,{{erlang,system_monitor,2},[{type,{2037,28},bounded_fun,[{type,{2037,28},'fun',[{type,{2037,28},product,[{var,{2037,29},'MonitorPid'},{var,{2037,41},'Options'}]},{var,{2037,53},'MonSettings'}]},[{type,{2038,7},constraint,[{atom,{2038,7},is_subtype},[{var,{2038,7},'MonitorPid'},{type,{2038,21},pid,[]}]]},{type,{2039,7},constraint,[{atom,{2039,7},is_subtype},[{var,{2039,7},'Options'},{type,{2039,18},list,[{user_type,{2039,20},system_monitor_option,[]}]}]]},{type,{2040,7},constraint,[{atom,{2040,7},is_subtype},[{var,{2040,7},'MonSettings'},{type,{2040,22},union,[{atom,{2040,22},undefined},{type,{2040,34},tuple,[{var,{2040,36},'OldMonitorPid'},{var,{2040,51},'OldOptions'}]}]}]]},{type,{2041,7},constraint,[{atom,{2041,7},is_subtype},[{var,{2041,7},'OldMonitorPid'},{type,{2041,24},pid,[]}]]},{type,{2042,7},constraint,[{atom,{2042,7},is_subtype},[{var,{2042,7},'OldOptions'},{type,{2042,21},list,[{user_type,{2042,23},system_monitor_option,[]}]}]]}]]}]}}]}},{{function,system_profile,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2047}],[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,112,114,111,102,105,108,105,110,103,32,115,101,116,116,105,110,103,115,32,115,101,116,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>]}]},<<32,97,115,32>>,{code,[],[<<123,80,114,111,102,105,108,101,114,80,105,100,44,32,79,112,116,105,111,110,115,125>>]},<<44,32,111,114,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,115,101,116,116,105,110,103,115,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,111,110,101,32,116,104,97,116,32,119,97,115,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,50,49,48>>,signature => [{attribute,{2047,2},spec,{{erlang,system_profile,0},[{type,{2047,28},bounded_fun,[{type,{2047,28},'fun',[{type,{2047,28},product,[]},{var,{2047,34},'ProfilerSettings'}]},[{type,{2048,7},constraint,[{atom,{2048,7},is_subtype},[{var,{2048,7},'ProfilerSettings'},{type,{2048,27},union,[{atom,{2048,27},undefined},{type,{2048,39},tuple,[{var,{2048,41},'ProfilerPid'},{var,{2048,54},'Options'}]}]}]]},{type,{2049,7},constraint,[{atom,{2049,7},is_subtype},[{var,{2049,7},'ProfilerPid'},{type,{2049,22},union,[{type,{2049,22},pid,[]},{type,{2049,30},port,[]}]}]]},{type,{2050,7},constraint,[{atom,{2050,7},is_subtype},[{var,{2050,7},'Options'},{type,{2050,18},list,[{user_type,{2050,20},system_profile_option,[]}]}]]}]]}]}}]}},{{function,system_profile,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2055}],[<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,121,115,116,101,109,95,112,114,111,102,105,108,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<83,101,116,115,32,115,121,115,116,101,109,32,112,114,111,102,105,108,101,114,32,111,112,116,105,111,110,115,46,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<32,105,115,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,111,114,32,112,111,114,116,32,114,101,99,101,105,118,105,110,103,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,114,101,99,101,105,118,101,114,32,105,115,32,101,120,99,108,117,100,101,100,32,102,114,111,109,32,97,108,108,32,112,114,111,102,105,108,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,114,111,102,105,108,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,120,99,108,117,115,105,118,101>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,115,121,110,99,104,114,111,110,111,117,115,32,99,97,108,108,32,116,111,32,97,32,112,111,114,116,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32,105,115,32,100,111,110,101,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,110,111,116,32,114,117,110,110,97,98,108,101,32,100,117,114,105,110,103,32,116,104,101,32,99,97,108,108,32,114,117,110,116,105,109,101,32,116,111,32,116,104,101,32,112,111,114,116,46,32,84,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,105,102,105,101,100,32,97,115,32>>,{code,[],[<<105,110,97,99,116,105,118,101>>]},<<44,32,97,110,100,32,108,97,116,101,114,32>>,{code,[],[<<97,99,116,105,118,101>>]},<<32,119,104,101,110,32,116,104,101,32,112,111,114,116,32,99,97,108,108,98,97,99,107,32,114,101,116,117,114,110,115,46>>]}]},{dt,[],[{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,97,98,108,101,95,112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,114,111,99,101,115,115,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,32,97,32,109,101,115,115,97,103,101,44,32>>,{code,[],[<<123,112,114,111,102,105,108,101,44,32,80,105,100,44,32,83,116,97,116,101,44,32,77,102,97,44,32,84,115,125>>]},<<44,32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<46,32,82,117,110,110,105,110,103,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32,114,117,110,32,113,117,101,117,101,32,97,102,116,101,114,32,104,97,118,105,110,103,32,98,101,101,110,32,112,114,101,45,101,109,112,116,101,100,32,100,111,32,110,111,116,32,116,114,105,103,103,101,114,32,116,104,105,115,32,109,101,115,115,97,103,101,46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,97,98,108,101,95,112,111,114,116,115>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,112,111,114,116,32,105,115,32,112,117,116,32,105,110,116,111,32,111,114,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,114,117,110,32,113,117,101,117,101,44,32,97,32,109,101,115,115,97,103,101,44,32>>,{code,[],[<<123,112,114,111,102,105,108,101,44,32,80,111,114,116,44,32,83,116,97,116,101,44,32,48,44,32,84,115,125>>]},<<44,32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,99,104,101,100,117,108,101,114>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,115,99,104,101,100,117,108,101,114,32,105,115,32,112,117,116,32,116,111,32,115,108,101,101,112,32,111,114,32,97,119,111,107,101,110,44,32,97,32,109,101,115,115,97,103,101,44,32>>,{code,[],[<<123,112,114,111,102,105,108,101,44,32,115,99,104,101,100,117,108,101,114,44,32,73,100,44,32,83,116,97,116,101,44,32,78,111,83,99,104,101,100,115,44,32,84,115,125>>]},<<44,32,105,115,32,115,101,110,116,32,116,111,32>>,{code,[],[<<80,114,111,102,105,108,101,114,80,105,100>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,99,111,110,115,105,115,116,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,105,110,116,101,103,101,114,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{code,[],[<<123,101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41,44,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,115,116,97,109,112,115,32,105,110,32,112,114,111,102,105,108,101,32,109,101,115,115,97,103,101,115,32,105,110,99,108,117,100,101,32,97,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,40,41>>]},<<46,32,84,104,105,115,32,105,115,32,97,108,115,111,32,116,104,101,32,100,101,102,97,117,108,116,32,105,102,32,110,111,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<32,104,97,115,32,98,101,101,110,32,101,110,97,98,108,101,100,32,116,104,114,111,117,103,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<44,32,116,104,105,115,32,97,108,115,111,32,101,102,102,101,99,116,115,32,116,104,101,32,116,105,109,101,32,115,116,97,109,112,32,112,114,111,100,117,99,101,100,32,105,110,32,112,114,111,102,105,108,105,110,103,32,109,101,115,115,97,103,101,115,32,119,104,101,110,32,102,108,97,103,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,101,110,97,98,108,101,100,46>>]}]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101>>]},<<32,98,101,104,97,118,105,111,114,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,50,50,53>>,signature => [{attribute,{2055,2},spec,{{erlang,system_profile,2},[{type,{2055,28},bounded_fun,[{type,{2055,28},'fun',[{type,{2055,28},product,[{var,{2055,29},'ProfilerPid'},{var,{2055,42},'Options'}]},{var,{2055,54},'ProfilerSettings'}]},[{type,{2056,7},constraint,[{atom,{2056,7},is_subtype},[{var,{2056,7},'ProfilerPid'},{type,{2056,22},union,[{type,{2056,22},pid,[]},{type,{2056,30},port,[]},{atom,{2056,39},undefined}]}]]},{type,{2057,7},constraint,[{atom,{2057,7},is_subtype},[{var,{2057,7},'Options'},{type,{2057,18},list,[{user_type,{2057,20},system_profile_option,[]}]}]]},{type,{2058,7},constraint,[{atom,{2058,7},is_subtype},[{var,{2058,7},'ProfilerSettings'},{type,{2058,27},union,[{atom,{2058,27},undefined},{type,{2058,39},tuple,[{type,{2058,41},union,[{type,{2058,41},pid,[]},{type,{2058,49},port,[]}]},{type,{2058,57},list,[{user_type,{2058,59},system_profile_option,[]}]}]}]}]]}]]}]}}]}},{{function,system_time,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1608}],[<<115,121,115,116,101,109,95,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46>>]},{p,[],[<<67,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,43,32>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,116,105,109,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,50,57,57>>,signature => [{attribute,{1608,2},spec,{{erlang,system_time,0},[{type,{1608,25},'fun',[{type,{1608,25},product,[]},{type,{1608,31},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,system_time,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1613}],[<<115,121,115,116,101,109,95,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32>>,{code,[],[<<85,110,105,116>>]},<<32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{p,[],[<<67,97,108,108,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,85,110,105,116,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]}]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,116,105,109,101,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,41>>]}]},{code,[],[<<44,32,110,97,116,105,118,101,44,32,85,110,105,116,41>>]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,116,105,109,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,51,50,49>>,signature => [{attribute,{1613,2},spec,{{erlang,system_time,1},[{type,{1613,25},bounded_fun,[{type,{1613,25},'fun',[{type,{1613,25},product,[{var,{1613,26},'Unit'}]},{type,{1613,35},integer,[]}]},[{type,{1614,7},constraint,[{atom,{1614,7},is_subtype},[{var,{1614,7},'Unit'},{user_type,{1614,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,term_to_binary,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2733}],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,101,120,116,95,100,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]}]},{p,[],[<<84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,118,97,114,105,111,117,115,32,112,117,114,112,111,115,101,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,119,114,105,116,105,110,103,32,97,32,116,101,114,109,32,116,111,32,97,32,102,105,108,101,32,105,110,32,97,110,32,101,102,102,105,99,105,101,110,116,32,119,97,121,44,32,111,114,32,115,101,110,100,105,110,103,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,111,32,115,111,109,101,32,116,121,112,101,32,111,102,32,99,111,109,109,117,110,105,99,97,116,105,111,110,115,32,99,104,97,110,110,101,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,100,105,115,116,114,105,98,117,116,101,100,32,69,114,108,97,110,103,46>>]},{pre,[],[{code,[],[<<62,32,66,105,110,32,61,32,116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,104,101,108,108,111,41,46,10,60,60,49,51,49,44,49,48,48,44,48,44,53,44,49,48,52,44,49,48,49,44,49,48,56,44,49,48,56,44,49,49,49,62,62,10,62,32,104,101,108,108,111,32,61,32,98,105,110,97,114,121,95,116,111,95,116,101,114,109,40,66,105,110,41,46,10,104,101,108,108,111>>]}]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]}]},<<46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,97,109,101,32,116,101,114,109,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,51,52,51>>,signature => [{attribute,{2733,2},spec,{{term_to_binary,1},[{type,{2733,21},bounded_fun,[{type,{2733,21},'fun',[{type,{2733,21},product,[{var,{2733,22},'Term'}]},{user_type,{2733,31},ext_binary,[]}]},[{type,{2734,7},constraint,[{atom,{2734,7},is_subtype},[{var,{2734,7},'Term'},{type,{2734,15},term,[]}]]}]]}]}}]}},{{function,term_to_binary,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2738}],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,101,110,99,111,100,105,110,103,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,105,115,32,112,114,111,118,105,100,101,100,44,32,116,104,101,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,105,115,32,99,111,109,112,114,101,115,115,101,100,46,32,84,104,101,32,99,111,109,112,114,101,115,115,101,100,32,102,111,114,109,97,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]},<<32,97,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,55,66,46>>]},{p,[],[<<65,32,99,111,109,112,114,101,115,115,105,111,110,32,108,101,118,101,108,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,103,105,118,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<123,99,111,109,112,114,101,115,115,101,100,44,32,76,101,118,101,108,125>>]},<<46,32>>,{code,[],[<<76,101,118,101,108>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,119,105,116,104,32,114,97,110,103,101,32,48,46,46,57,44,32,119,104,101,114,101,58>>]},{ul,[],[{li,[],[{p,[],[{code,[],[<<48>>]},<<32,45,32,78,111,32,99,111,109,112,114,101,115,115,105,111,110,32,105,115,32,100,111,110,101,32,40,105,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,103,105,118,105,110,103,32,110,111,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,111,112,116,105,111,110,41,46>>]}]},{li,[],[{p,[],[{code,[],[<<49>>]},<<32,45,32,84,97,107,101,115,32,108,101,97,115,116,32,116,105,109,101,32,98,117,116,32,109,97,121,32,110,111,116,32,99,111,109,112,114,101,115,115,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,115,46>>]}]},{li,[],[{p,[],[{code,[],[<<54>>]},<<32,45,32,68,101,102,97,117,108,116,32,108,101,118,101,108,32,119,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,105,115,32,112,114,111,118,105,100,101,100,46>>]}]},{li,[],[{p,[],[{code,[],[<<57>>]},<<32,45,32,84,97,107,101,115,32,109,111,115,116,32,116,105,109,101,32,97,110,100,32,116,114,105,101,115,32,116,111,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,46,32,78,111,116,105,99,101,32,34,116,114,105,101,115,34,32,105,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,101,110,116,101,110,99,101,59,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,105,110,112,117,116,32,116,101,114,109,44,32,108,101,118,101,108,32,57,32,99,111,109,112,114,101,115,115,105,111,110,32,101,105,116,104,101,114,32,100,111,101,115,32,111,114,32,100,111,101,115,32,110,111,116,32,112,114,111,100,117,99,101,32,97,32,115,109,97,108,108,101,114,32,114,101,115,117,108,116,32,116,104,97,110,32,108,101,118,101,108,32,49,32,99,111,109,112,114,101,115,115,105,111,110,46>>]}]}]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<123,109,105,110,111,114,95,118,101,114,115,105,111,110,44,32,86,101,114,115,105,111,110,125>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,99,111,110,116,114,111,108,32,115,111,109,101,32,101,110,99,111,100,105,110,103,32,100,101,116,97,105,108,115,46,32,84,104,105,115,32,111,112,116,105,111,110,32,119,97,115,32,105,110,116,114,111,100,117,99,101,100,32,105,110,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,46,32,84,104,101,32,118,97,108,105,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<86,101,114,115,105,111,110>>]},<<32,97,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<48>>]}]},{dd,[],[{p,[],[<<70,108,111,97,116,115,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,97,32,116,101,120,116,117,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,117,115,101,102,117,108,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,114,101,108,101,97,115,101,115,32,98,101,102,111,114,101,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,32,99,97,110,32,100,101,99,111,100,101,32,114,101,115,117,108,116,105,110,103,32,98,105,110,97,114,121,46>>]},{p,[],[<<84,104,105,115,32,118,101,114,115,105,111,110,32,101,110,99,111,100,101,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,117,115,105,110,103,32,108,97,116,105,110,49,32,101,110,99,111,100,105,110,103,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,117,116,102,56,46>>]}]},{dt,[],[{code,[],[<<49>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,105,115,32,97,115,32,111,102,32,69,114,108,97,110,103,47,79,84,80,32,49,55,46,48,32,116,104,101,32>>,{em,[],[<<100,101,102,97,117,108,116>>]},<<46,32,73,116,32,102,111,114,99,101,115,32,97,110,121,32,102,108,111,97,116,115,32,105,110,32,116,104,101,32,116,101,114,109,32,116,111,32,98,101,32,101,110,99,111,100,101,100,32,105,110,32,97,32,109,111,114,101,32,115,112,97,99,101,45,101,102,102,105,99,105,101,110,116,32,97,110,100,32,101,120,97,99,116,32,119,97,121,32,40,110,97,109,101,108,121,32,105,110,32,116,104,101,32,54,52,45,98,105,116,32,73,69,69,69,32,102,111,114,109,97,116,44,32,114,97,116,104,101,114,32,116,104,97,110,32,99,111,110,118,101,114,116,101,100,32,116,111,32,97,32,116,101,120,116,117,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,41,46,32,65,115,32,102,114,111,109,32,69,114,108,97,110,103,47,79,84,80,32,82,49,49,66,45,52,44,32>>,{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]},<<32,99,97,110,32,100,101,99,111,100,101,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>]},{p,[],[<<84,104,105,115,32,118,101,114,115,105,111,110,32,101,110,99,111,100,101,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,97,116,105,110,49,32,115,116,114,105,110,103,32,117,115,105,110,103,32,108,97,116,105,110,49,32,101,110,99,111,100,105,110,103,32,119,104,105,108,101,32,111,110,108,121,32,97,116,111,109,115,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,108,97,116,105,110,49,32,97,114,101,32,101,110,99,111,100,101,100,32,117,115,105,110,103,32,117,116,102,56,46>>]}]},{dt,[],[{code,[],[<<50>>]}]},{dd,[],[{p,[],[<<68,114,111,112,115,32,117,115,97,103,101,32,111,102,32,116,104,101,32,108,97,116,105,110,49,32,97,116,111,109,32,101,110,99,111,100,105,110,103,32,97,110,100,32,117,110,99,111,110,100,105,116,105,111,110,97,108,108,121,32,117,115,101,32,117,116,102,56,32,101,110,99,111,100,105,110,103,32,102,111,114,32,97,108,108,32,97,116,111,109,115,46,32,69,114,108,97,110,103,47,79,84,80,32,115,121,115,116,101,109,115,32,97,115,32,111,102,32,82,49,54,66,32,99,97,110,32,100,101,99,111,100,101,32,116,104,105,115,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,110,32,69,114,108,97,110,103,47,79,84,80,32,50,54,44,32,116,104,101,32,100,101,102,97,117,108,116,32>>,{code,[],[<<109,105,110,111,114,95,118,101,114,115,105,111,110>>]},<<32,105,115,32,112,108,97,110,110,101,100,32,116,111,32,99,104,97,110,103,101,32,102,114,111,109,32,49,32,116,111,32,50,46,32,83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,103,101,110,101,114,97,108,95,105,110,102,111,58,117,112,99,111,109,105,110,103,95,105,110,99,111,109,112,97,116,105,98,105,108,105,116,105,101,115,35,97,116,111,109,115,95,98,101,95,117,116,102,56>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<85,112,99,111,109,105,110,103,32,80,111,116,101,110,116,105,97,108,32,73,110,99,111,109,112,97,116,105,98,105,108,105,116,105,101,115,32>>]},<<46>>]}]}]}]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<100,101,116,101,114,109,105,110,105,115,116,105,99>>]},<<32,40,105,110,116,114,111,100,117,99,101,100,32,105,110,32,79,84,80,32,50,52,46,49,41,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,119,105,116,104,105,110,32,116,104,101,32,115,97,109,101,32,109,97,106,111,114,32,114,101,108,101,97,115,101,32,111,102,32,69,114,108,97,110,103,47,79,84,80,44,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,105,115,32,114,101,116,117,114,110,101,100,32,102,111,114,32,116,104,101,32,115,97,109,101,32,116,101,114,109,46,32,84,104,101,114,101,32,105,115,32,115,116,105,108,108,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,116,104,101,32,101,110,99,111,100,101,100,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,114,101,109,97,105,110,115,32,116,104,101,32,115,97,109,101,32,98,101,116,119,101,101,110,32,109,97,106,111,114,32,114,101,108,101,97,115,101,115,32,111,102,32,69,114,108,97,110,103,47,79,84,80,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<98,105,110,97,114,121,95,116,111,95,116,101,114,109,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,51,55,49>>,signature => [{attribute,{2738,2},spec,{{term_to_binary,2},[{type,{2738,21},bounded_fun,[{type,{2738,21},'fun',[{type,{2738,21},product,[{var,{2738,22},'Term'},{var,{2738,28},'Options'}]},{user_type,{2738,40},ext_binary,[]}]},[{type,{2739,7},constraint,[{atom,{2739,7},is_subtype},[{var,{2739,7},'Term'},{type,{2739,15},term,[]}]]},{type,{2740,7},constraint,[{atom,{2740,7},is_subtype},[{var,{2740,7},'Options'},{type,{2740,18},list,[{type,{2740,19},union,[{atom,{2740,19},compressed},{type,{2741,10},tuple,[{atom,{2741,11},compressed},{ann_type,{2741,23},[{var,{2741,23},'Level'},{type,{2741,32},range,[{integer,{2741,32},0},{integer,{2741,35},9}]}]}]},{atom,{2742,10},deterministic},{type,{2743,10},tuple,[{atom,{2743,11},minor_version},{ann_type,{2743,26},[{var,{2743,26},'Version'},{type,{2743,37},range,[{integer,{2743,37},0},{integer,{2743,40},2}]}]}]}]}]}]]}]]}]}}]}},{{function,term_to_iovec,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2747}],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,116,95,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<101,120,116,95,105,111,118,101,99,40,41>>]}]},<<46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,32,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,32>>,{code,[],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,41,41>>]},<<32,119,105,108,108,32,112,114,111,100,117,99,101,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,99,97,108,108,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,41>>]},<<46>>]},{p,[],[{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41>>]},<<32,112,114,111,118,105,100,101,46,32>>,{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,52,52,56>>,signature => [{attribute,{2747,2},spec,{{term_to_iovec,1},[{type,{2747,20},bounded_fun,[{type,{2747,20},'fun',[{type,{2747,20},product,[{var,{2747,21},'Term'}]},{user_type,{2747,30},ext_iovec,[]}]},[{type,{2748,7},constraint,[{atom,{2748,7},is_subtype},[{var,{2748,7},'Term'},{type,{2748,15},term,[]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,term_to_iovec,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2752}],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,116,95,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<101,120,116,95,105,111,118,101,99,40,41>>]}]},<<46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,112,114,111,100,117,99,101,32,116,104,101,32,115,97,109,101,32,101,110,99,111,100,105,110,103,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<44,32,98,117,116,32,119,105,116,104,32,97,110,111,116,104,101,114,32,114,101,116,117,114,110,32,116,121,112,101,46,32,84,104,101,32,99,97,108,108,32>>,{code,[],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,40,116,101,114,109,95,116,111,95,105,111,118,101,99,40,84,101,114,109,44,32,79,112,116,115,41,41>>]},<<32,119,105,108,108,32,112,114,111,100,117,99,101,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,84,101,114,109,44,32,79,112,116,115,41>>]},<<46>>]},{p,[],[<<67,117,114,114,101,110,116,108,121,32,114,101,99,111,103,110,105,115,101,100,32,111,112,116,105,111,110,115,32,97,114,101,32,97,108,108,32,111,112,116,105,111,110,115,32,114,101,99,111,103,110,105,115,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<46>>]},{p,[],[{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,105,115,32,97,32,112,117,114,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,97,108,105,116,121,32>>,{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,40,41>>]},<<32,112,114,111,118,105,100,101,46,32>>,{code,[],[<<116,101,114,109,95,116,111,95,105,111,118,101,99,40,41>>]},<<32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,114,101,102,101,114,32,100,105,114,101,99,116,108,121,32,116,111,32,111,102,102,32,104,101,97,112,32,98,105,110,97,114,105,101,115,32,105,110,115,116,101,97,100,32,111,102,32,99,111,112,121,105,110,103,32,116,104,101,32,98,105,110,97,114,121,32,100,97,116,97,32,105,110,116,111,32,116,104,101,32,114,101,115,117,108,116,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,101,114,109,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,52,55,51>>,signature => [{attribute,{2752,2},spec,{{term_to_iovec,2},[{type,{2752,20},bounded_fun,[{type,{2752,20},'fun',[{type,{2752,20},product,[{var,{2752,21},'Term'},{var,{2752,27},'Options'}]},{user_type,{2752,39},ext_iovec,[]}]},[{type,{2753,7},constraint,[{atom,{2753,7},is_subtype},[{var,{2753,7},'Term'},{type,{2753,15},term,[]}]]},{type,{2754,7},constraint,[{atom,{2754,7},is_subtype},[{var,{2754,7},'Options'},{type,{2754,18},list,[{type,{2754,19},union,[{atom,{2754,19},compressed},{type,{2755,10},tuple,[{atom,{2755,11},compressed},{ann_type,{2755,23},[{var,{2755,23},'Level'},{type,{2755,32},range,[{integer,{2755,32},0},{integer,{2755,35},9}]}]}]},{atom,{2756,10},deterministic},{type,{2757,10},tuple,[{atom,{2757,11},minor_version},{ann_type,{2757,26},[{var,{2757,26},'Version'},{type,{2757,37},range,[{integer,{2757,37},0},{integer,{2757,40},2}]}]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,throw,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2064}],[<<116,104,114,111,119,47,49>>],#{<<101,110>> => [{p,[],[<<82,97,105,115,101,115,32,97,110,32,101,120,99,101,112,116,105,111,110,32,111,102,32,99,108,97,115,115,32>>,{code,[],[<<116,104,114,111,119>>]},<<46,32,73,110,116,101,110,100,101,100,32,116,111,32,98,101,32,117,115,101,100,32,116,111,32,100,111,32,110,111,110,45,108,111,99,97,108,32,114,101,116,117,114,110,115,32,102,114,111,109,32,102,117,110,99,116,105,111,110,115,46>>]},{p,[],[<<73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,99,97,116,99,104>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110>>]},<<44,32,116,104,101,32,99,97,116,99,104,32,101,120,112,114,101,115,115,105,111,110,32,114,101,116,117,114,110,115,32,118,97,108,117,101,32>>,{code,[],[<<65,110,121>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,99,97,116,99,104,32,116,104,114,111,119,40,123,104,101,108,108,111,44,32,116,104,101,114,101,125,41,46,10,32,32,32,32,32,32,32,32,123,104,101,108,108,111,44,116,104,101,114,101,125>>]}]},{p,[],[<<73,102,32,101,118,97,108,117,97,116,101,100,32,119,105,116,104,105,110,32,97,32>>,{code,[],[<<116,114,121>>]},<<45,98,108,111,99,107,32,111,102,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,116,114,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,114,121,32,101,120,112,114,101,115,115,105,111,110>>]},<<44,32,116,104,101,32,118,97,108,117,101,32>>,{code,[],[<<65,110,121>>]},<<32,99,97,110,32,98,101,32,99,97,117,103,104,116,32,119,105,116,104,105,110,32,116,104,101,32,99,97,116,99,104,32,98,108,111,99,107,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<116,114,121,10,32,32,32,32,116,104,114,111,119,40,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,34,83,111,109,101,116,104,105,110,103,32,104,97,112,112,101,110,101,100,34,125,41,10,99,97,116,99,104,10,32,32,32,32,116,104,114,111,119,58,123,109,121,95,101,120,99,101,112,116,105,111,110,44,32,68,101,115,99,125,32,45,62,10,32,32,32,32,32,32,32,32,105,111,58,102,111,114,109,97,116,40,115,116,97,110,100,97,114,100,95,101,114,114,111,114,44,32,34,69,114,114,111,114,58,32,126,115,126,110,34,44,32,91,68,101,115,99,93,41,10,101,110,100>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<110,111,99,97,116,99,104>>]},<<32,105,102,32,110,111,116,32,99,97,117,103,104,116,32,98,121,32,97,110,32,101,120,99,101,112,116,105,111,110,32,104,97,110,100,108,101,114,46>>]},{p,[],[<<83,101,101,32,116,104,101,32,103,117,105,100,101,32,97,98,111,117,116,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<101,114,114,111,114,115,32,97,110,100,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,53,48,49>>,signature => [{attribute,{2064,2},spec,{{throw,1},[{type,{2064,12},bounded_fun,[{type,{2064,12},'fun',[{type,{2064,12},product,[{var,{2064,13},'Any'}]},{type,{2064,21},no_return,[]}]},[{type,{2065,7},constraint,[{atom,{2065,7},is_subtype},[{var,{2065,7},'Any'},{type,{2065,14},term,[]}]]}]]}]}}]}},{{function,time,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2070}],[<<116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,97,115,32>>,{code,[],[<<123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125>>]},<<46>>]},{p,[],[<<84,104,101,32,116,105,109,101,32,122,111,110,101,32,97,110,100,32,68,97,121,108,105,103,104,116,32,83,97,118,105,110,103,32,84,105,109,101,32,99,111,114,114,101,99,116,105,111,110,32,100,101,112,101,110,100,32,111,110,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,105,109,101,40,41,46,10,123,57,44,52,50,44,52,52,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,53,50,57>>,signature => [{attribute,{2070,2},spec,{{time,0},[{type,{2070,11},bounded_fun,[{type,{2070,11},'fun',[{type,{2070,11},product,[]},{var,{2070,17},'Time'}]},[{type,{2071,7},constraint,[{atom,{2071,7},is_subtype},[{var,{2071,7},'Time'},{remote_type,{2071,15},[{atom,{2071,15},calendar},{atom,{2071,24},time},[]]}]]}]]}]}}]}},{{function,time_offset,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1668}],[<<116,105,109,101,95,111,102,102,115,101,116,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,105,110,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,105,109,101,32,117,110,105,116>>]},<<46,32,67,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,97,100,100,101,100,32,116,111,32,97,110,32,69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101,32,103,105,118,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,46>>]},{p,[],[<<84,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,99,104,97,110,103,101,32,100,117,114,105,110,103,32,111,112,101,114,97,116,105,111,110,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<32,117,115,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,99,104,97,110,103,101,32,105,110,32,116,105,109,101,32,111,102,102,115,101,116,32,99,97,110,32,98,101,32,111,98,115,101,114,118,101,100,32,97,116,32,115,108,105,103,104,116,108,121,32,100,105,102,102,101,114,101,110,116,32,112,111,105,110,116,115,32,105,110,32,116,105,109,101,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,105,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,77,117,108,116,105,95,84,105,109,101,95,87,97,114,112,95,77,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,117,108,116,105,45,116,105,109,101,32,119,97,114,112,32,109,111,100,101>>]},<<44,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,99,104,97,110,103,101,100,32,119,104,101,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,100,101,116,101,99,116,115,32,116,104,97,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,79,83,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,104,97,115,32,99,104,97,110,103,101,100,46,32,84,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,119,105,108,108,44,32,104,111,119,101,118,101,114,44,32,110,111,116,32,100,101,116,101,99,116,32,116,104,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,46,32,65,32,116,97,115,107,32,99,104,101,99,107,105,110,103,32,116,104,101,32,116,105,109,101,32,111,102,102,115,101,116,32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,101,120,101,99,117,116,101,32,97,116,32,108,101,97,115,116,32,111,110,99,101,32,97,32,109,105,110,117,116,101,59,32,115,111,44,32,117,110,100,101,114,32,110,111,114,109,97,108,32,111,112,101,114,97,116,105,111,110,32,116,104,105,115,32,105,115,32,116,111,32,98,101,32,100,101,116,101,99,116,101,100,32,119,105,116,104,105,110,32,97,32,109,105,110,117,116,101,44,32,98,117,116,32,100,117,114,105,110,103,32,104,101,97,118,121,32,108,111,97,100,32,105,116,32,99,97,110,32,116,97,107,101,32,108,111,110,103,101,114,32,116,105,109,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,53,52,52>>,signature => [{attribute,{1668,2},spec,{{erlang,time_offset,0},[{type,{1668,25},'fun',[{type,{1668,25},product,[]},{type,{1668,31},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,time_offset,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1673}],[<<116,105,109,101,95,111,102,102,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,32,111,102,102,115,101,116,32,98,101,116,119,101,101,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,99,111,110,118,101,114,116,101,100,32,105,110,116,111,32,116,104,101,32>>,{code,[],[<<85,110,105,116>>]},<<32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{p,[],[<<83,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116>>]}]},{code,[],[<<40>>]},{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,95,111,102,102,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,95,111,102,102,115,101,116,40,41>>]}]},{code,[],[<<44,32,110,97,116,105,118,101,44,32,85,110,105,116,41>>]},<<32,104,111,119,101,118,101,114,32,111,112,116,105,109,105,122,101,100,32,102,111,114,32,99,111,109,109,111,110,108,121,32,117,115,101,100,32>>,{code,[],[<<85,110,105,116>>]},<<115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,53,55,54>>,signature => [{attribute,{1673,2},spec,{{erlang,time_offset,1},[{type,{1673,25},bounded_fun,[{type,{1673,25},'fun',[{type,{1673,25},product,[{var,{1673,26},'Unit'}]},{type,{1673,35},integer,[]}]},[{type,{1674,7},constraint,[{atom,{1674,7},is_subtype},[{var,{1674,7},'Unit'},{user_type,{1674,15},time_unit,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,timestamp,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1679}],[<<116,105,109,101,115,116,97,109,112,47,48>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<116,105,109,101,115,116,97,109,112>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,99,117,114,114,101,110,116,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,83,121,115,116,101,109,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101>>]},<<32,111,110,32,116,104,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125>>]},<<46,32,84,104,105,115,32,102,111,114,109,97,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,116,105,109,101,115,116,97,109,112,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,116,105,109,101,115,116,97,109,112,47,48>>]}]},<<32,97,110,100,32,116,104,101,32,100,101,112,114,101,99,97,116,101,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,110,111,119,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,110,111,119,47,48>>]}]},<<32,117,115,101,46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41>>]},<<32,105,115,32,112,117,114,101,108,121,32,116,111,32,115,105,109,112,108,105,102,121,32,117,115,101,32,102,111,114,32,101,120,105,115,116,105,110,103,32,99,111,100,101,32,116,104,97,116,32,97,115,115,117,109,101,115,32,116,104,105,115,32,116,105,109,101,32,115,116,97,109,112,32,102,111,114,109,97,116,46,32,67,117,114,114,101,110,116,32,69,114,108,97,110,103,32,115,121,115,116,101,109,32,116,105,109,101,32,99,97,110,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,108,121,32,98,101,32,114,101,116,114,105,101,118,101,100,32,105,110,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,111,102,32,121,111,117,114,32,99,104,111,105,99,101,32,117,115,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,116,105,109,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,47,49>>]}]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,40,41>>]},<<32,66,73,70,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<116,105,109,101,115,116,97,109,112,40,41,32,45,62,10,32,32,32,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,61,32,101,114,108,97,110,103,58,115,121,115,116,101,109,95,116,105,109,101,40,109,105,99,114,111,115,101,99,111,110,100,41,44,10,32,32,32,32,77,101,103,97,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,95,48,48,48,95,48,48,48,44,10,32,32,32,32,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,100,105,118,32,49,48,48,48,95,48,48,48,32,45,32,77,101,103,97,83,101,99,115,42,49,48,48,48,95,48,48,48,44,10,32,32,32,32,77,105,99,114,111,83,101,99,115,32,61,32,69,114,108,97,110,103,83,121,115,116,101,109,84,105,109,101,32,114,101,109,32,49,48,48,48,95,48,48,48,44,10,32,32,32,32,123,77,101,103,97,83,101,99,115,44,32,83,101,99,115,44,32,77,105,99,114,111,83,101,99,115,125,46>>]}]},{p,[],[<<73,116,44,32,104,111,119,101,118,101,114,44,32,117,115,101,115,32,97,32,110,97,116,105,118,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,98,117,105,108,100,32,103,97,114,98,97,103,101,32,111,110,32,116,104,101,32,104,101,97,112,32,97,110,100,32,119,105,116,104,32,115,108,105,103,104,116,108,121,32,98,101,116,116,101,114,32,112,101,114,102,111,114,109,97,110,99,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,116,105,109,101,32,105,115,32>>,{em,[],[<<110,111,116>>]},<<32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,116,105,109,101,32,105,110,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,115,101,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,87,97,114,112,95,77,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,105,109,101,32,119,97,114,112,32,109,111,100,101,115>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,53,57,53>>,signature => [{attribute,{1679,2},spec,{{erlang,timestamp,0},[{type,{1679,23},bounded_fun,[{type,{1679,23},'fun',[{type,{1679,23},product,[]},{var,{1679,29},'Timestamp'}]},[{type,{1680,7},constraint,[{atom,{1680,7},is_subtype},[{var,{1680,7},'Timestamp'},{user_type,{1680,20},timestamp,[]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,tl,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2762}],[<<116,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,116,97,105,108,32,111,102,32>>,{code,[],[<<76,105,115,116>>]},<<44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,108,105,115,116,32,109,105,110,117,115,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,93>>]}]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,93,41,46,10,91,93>>]}]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,44,32,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,91,103,117,105,108,105,101,115,44,32,98,101,97,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93>>]}]},{pre,[],[{code,[],[<<62,32,116,108,40,91,103,101,101,115,116,105,101,115,32,124,32,105,109,112,114,111,112,101,114,95,101,110,100,93,41,46,10,105,109,112,114,111,112,101,114,95,101,110,100>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<76,105,115,116>>]},<<32,105,115,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32>>,{code,[],[<<91,93>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,54,51,52>>,signature => [{attribute,{2762,2},spec,{{tl,1},[{type,{2762,9},bounded_fun,[{type,{2762,9},'fun',[{type,{2762,9},product,[{var,{2762,10},'List'}]},{type,{2762,19},term,[]}]},[{type,{2763,7},constraint,[{atom,{2763,7},is_subtype},[{var,{2763,7},'List'},{type,{2763,15},nonempty_maybe_improper_list,[]}]]}]]}]}}]}},{{function,trace,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2076}],[<<116,114,97,99,101,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<116,114,97,99,101,95,102,108,97,103>>}],[]}]},{p,[],[<<84,117,114,110,115,32,111,110,32,40,105,102,32>>,{code,[],[<<72,111,119,32,61,61,32,116,114,117,101>>]},<<41,32,111,114,32,111,102,102,32,40,105,102,32>>,{code,[],[<<72,111,119,32,61,61,32,102,97,108,115,101>>]},<<41,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,105,110,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,114,111,99,101,115,115,101,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<46>>]},{p,[],[{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32,101,105,116,104,101,114,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,32,102,111,114,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,44,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,97,110,100,32,97,108,108,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,97,108,108,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<112,111,114,116,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,32,97,110,100,32,97,108,108,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<101,120,105,115,116,105,110,103>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,46>>]},{dt,[],[{code,[],[<<101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,101,115,46>>]},{dt,[],[{code,[],[<<101,120,105,115,116,105,110,103,95,112,111,114,116,115>>]}]},{dd,[],[<<65,108,108,32,99,117,114,114,101,110,116,108,121,32,101,120,105,115,116,105,110,103,32,112,111,114,116,115,46>>]},{dt,[],[{code,[],[<<110,101,119>>]}]},{dd,[],[<<65,108,108,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,112,111,114,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<110,101,119,95,112,114,111,99,101,115,115,101,115>>]}]},{dd,[],[<<65,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]},{dt,[],[{code,[],[<<110,101,119,95,112,111,114,116,115>>]}]},{dd,[],[<<65,108,108,32,112,111,114,116,115,32,116,104,97,116,32,119,105,108,108,32,98,101,32,99,114,101,97,116,101,100,32,105,110,32,116,104,101,32,102,117,116,117,114,101,46>>]}]},{p,[],[{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,108,97,103,115,32,40,116,104,101,32,34,109,101,115,115,97,103,101,32,116,97,103,115,34,32,114,101,102,101,114,115,32,116,111,32,116,104,101,32,108,105,115,116,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,114,97,99,101,32,109,101,115,115,97,103,101,115>>]}]},<<41,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[{p,[],[<<83,101,116,115,32,97,108,108,32,116,114,97,99,101,32,102,108,97,103,115,32,101,120,99,101,112,116,32>>,{code,[],[<<116,114,97,99,101,114>>]},<<32,97,110,100,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<44,32,119,104,105,99,104,32,97,114,101,32,105,110,32,116,104,101,105,114,32,110,97,116,117,114,101,32,100,105,102,102,101,114,101,110,116,32,116,104,97,110,32,116,104,101,32,111,116,104,101,114,115,46>>]}]},{dt,[],[{code,[],[<<115,101,110,100>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,101,110,100,105,110,103,32,111,102,32,109,101,115,115,97,103,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,110,100>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<39,114,101,99,101,105,118,101,39>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,114,101,99,101,105,118,105,110,103,32,111,102,32,109,101,115,115,97,103,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,99,101,105,118,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<39,114,101,99,101,105,118,101,39>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,99,101,114,116,97,105,110,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,83,112,101,99,105,102,121,32,119,104,105,99,104,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,116,111,32,116,114,97,99,101,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,97,108,108>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,102,114,111,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,102,114,111,109>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<115,105,108,101,110,116>>]}]},{dd,[],[{p,[],[<<85,115,101,100,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,46,32,84,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<114,101,116,117,114,110,95,102,114,111,109>>]},<<44,32,97,110,100,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,105,110,104,105,98,105,116,101,100,32,105,102,32,116,104,105,115,32,102,108,97,103,32,105,115,32,115,101,116,44,32,98,117,116,32,116,104,101,121,32,97,114,101,32,101,120,101,99,117,116,101,100,32,97,115,32,110,111,114,109,97,108,32,105,102,32,116,104,101,114,101,32,97,114,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46>>]},{p,[],[<<83,105,108,101,110,116,32,109,111,100,101,32,105,115,32,105,110,104,105,98,105,116,101,100,32,98,121,32,101,120,101,99,117,116,105,110,103,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,40,95,44,32,102,97,108,115,101,44,32,91,115,105,108,101,110,116,124,95,93,41>>]},<<44,32,111,114,32,98,121,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,101,120,101,99,117,116,105,110,103,32,116,104,101,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,115,105,108,101,110,116,44,32,102,97,108,115,101,125>>]},<<46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<115,105,108,101,110,116>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,97,99,105,108,105,116,97,116,101,115,32,115,101,116,116,105,110,103,32,117,112,32,97,32,116,114,97,99,101,32,111,110,32,109,97,110,121,32,111,114,32,101,118,101,110,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,84,104,101,32,116,114,97,99,101,32,99,97,110,32,116,104,101,110,32,98,101,32,97,99,116,105,118,97,116,101,100,32,97,110,100,32,100,101,97,99,116,105,118,97,116,101,100,32,117,115,105,110,103,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,115,105,108,101,110,116,44,66,111,111,108,125>>]},<<44,32,103,105,118,105,110,103,32,97,32,104,105,103,104,32,100,101,103,114,101,101,32,111,102,32,99,111,110,116,114,111,108,32,111,102,32,119,104,105,99,104,32,102,117,110,99,116,105,111,110,115,32,119,105,116,104,32,119,104,105,99,104,32,97,114,103,117,109,101,110,116,115,32,116,104,97,116,32,116,114,105,103,103,101,114,32,116,104,101,32,116,114,97,99,101,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,97,108,108>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,102,114,111,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,102,114,111,109>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,116,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,116,111>>]}]},<<46,32,79,114,32,114,97,116,104,101,114,44,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,46>>]}]},{dt,[],[{code,[],[<<114,101,116,117,114,110,95,116,111>>]}]},{dd,[],[{p,[],[<<85,115,101,100,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,46,32,84,114,97,99,101,115,32,116,104,101,32,114,101,116,117,114,110,32,102,114,111,109,32,97,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,32,98,97,99,107,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46,32,79,110,108,121,32,119,111,114,107,115,32,102,111,114,32,102,117,110,99,116,105,111,110,115,32,116,114,97,99,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,116,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]},{p,[],[<<84,104,101,32,115,101,109,97,110,116,105,99,115,32,105,115,32,116,104,97,116,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,119,104,101,110,32,97,32,99,97,108,108,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,44,32,116,104,97,116,32,105,115,44,32,119,104,101,110,32,97,32,99,104,97,105,110,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,32,101,110,100,115,46,32,79,110,108,121,32,111,110,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,112,101,114,32,99,104,97,105,110,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,44,32,115,111,32,116,104,101,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,110,101,115,115,32,102,111,114,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,107,101,112,116,32,119,104,105,108,101,32,116,114,97,99,105,110,103,32,119,105,116,104,32,116,104,105,115,32,102,108,97,103,46,32,85,115,105,110,103,32>>,{code,[],[<<99,97,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,116,114,97,99,101,32,116,111,103,101,116,104,101,114,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,107,110,111,119,32,101,120,97,99,116,108,121,32,105,110,32,119,104,105,99,104,32,102,117,110,99,116,105,111,110,32,97,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,97,116,32,97,110,121,32,116,105,109,101,46>>]},{p,[],[<<84,111,32,103,101,116,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,99,111,110,116,97,105,110,105,110,103,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,102,114,111,109,32,102,117,110,99,116,105,111,110,115,44,32,117,115,101,32,116,104,101,32>>,{code,[],[<<123,114,101,116,117,114,110,95,116,114,97,99,101,125>>]},<<32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,99,116,105,111,110,32,105,110,115,116,101,97,100,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,116,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,116,117,114,110,95,116,111>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,112,114,111,99,101,115,115,45,114,101,108,97,116,101,100,32,101,118,101,110,116,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,112,97,119,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,112,97,119,110,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,101,120,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,120,105,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,108,105,110,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,105,110,107>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,108,105,110,107>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,108,105,110,107>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,108,105,110,107,101,100>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<112,111,114,116,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,112,111,114,116,45,114,101,108,97,116,101,100,32,101,118,101,110,116,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,112,101,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,112,101,110>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,108,111,115,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<99,108,111,115,101,100>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,114,101,103,105,115,116,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,114,101,103,105,115,116,101,114>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,108,105,110,107,101,100>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,105,110,103>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<101,120,105,116,105,110,103>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,101,120,105,116,105,110,103,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,101,120,105,116,105,110,103,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110,95,101,120,105,116,105,110,103>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,105,110,103,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116,95,101,120,105,116,105,110,103>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,101,100,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116,95,101,120,105,116,101,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,105,110,103,95,112,114,111,99,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,112,114,111,99,101,115,115,101,115,32,106,117,115,116,32,108,105,107,101,32>>,{code,[],[<<114,117,110,110,105,110,103>>]},<<46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,111,112,116,105,111,110,32,97,108,115,111,32,105,110,99,108,117,100,101,115,32,115,99,104,101,100,117,108,101,32,101,118,101,110,116,115,32,119,104,101,110,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,101,99,117,116,101,115,32,119,105,116,104,105,110,32,116,104,101,32,99,111,110,116,101,120,116,32,111,102,32,97,32,112,111,114,116,32,119,105,116,104,111,117,116,32,98,101,105,110,103,32,115,99,104,101,100,117,108,101,100,32,111,117,116,32,105,116,115,101,108,102,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,114,111,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<114,117,110,110,105,110,103,95,112,111,114,116,115>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,115,99,104,101,100,117,108,105,110,103,32,111,102,32,112,111,114,116,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,111,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,110>>]}]},<<32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,111,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,117,116>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]}]},{dd,[],[{p,[],[<<84,114,97,99,101,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,115,32,111,102,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<77,101,115,115,97,103,101,32,116,97,103,115,58,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]}]},<<44,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,101,110,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<103,99,95,109,105,110,111,114,95,101,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<73,110,99,108,117,100,101,115,32,97,32,116,105,109,101,32,115,116,97,109,112,32,105,110,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,32,97,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,110,111,119,40,41>>]},<<46>>]}]},{dt,[],[{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<65,32,103,108,111,98,97,108,32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,116,104,101,32,69,114,108,97,110,103,32,110,111,100,101,32,116,104,97,116,32,109,97,107,101,115,32,97,108,108,32,116,114,97,99,101,32,116,105,109,101,32,115,116,97,109,112,115,32,117,115,105,110,103,32,102,108,97,103,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<32,116,111,32,98,101,32,105,110,32,67,80,85,32,116,105,109,101,44,32,110,111,116,32,119,97,108,108,32,99,108,111,99,107,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,110,111,116,32,98,101,32,117,115,101,100,32,105,102,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<32,111,114,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,101,110,97,98,108,101,100,46,32,79,110,108,121,32,97,108,108,111,119,101,100,32,119,105,116,104,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99,61,61,97,108,108>>]},<<46,32,73,102,32,116,104,101,32,104,111,115,116,32,109,97,99,104,105,110,101,32,79,83,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,104,105,103,104,45,114,101,115,111,108,117,116,105,111,110,32,67,80,85,32,116,105,109,101,32,109,101,97,115,117,114,101,109,101,110,116,115,44,32>>,{code,[],[<<116,114,97,99,101,47,51>>]},<<32,101,120,105,116,115,32,119,105,116,104,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,115,116,32,79,83,32,100,111,32,110,111,116,32,115,121,110,99,104,114,111,110,105,122,101,32,116,104,105,115,32,118,97,108,117,101,32,97,99,114,111,115,115,32,99,111,114,101,115,44,32,115,111,32,98,101,32,112,114,101,112,97,114,101,100,32,116,104,97,116,32,116,105,109,101,32,99,97,110,32,115,101,101,109,32,116,111,32,103,111,32,98,97,99,107,119,97,114,100,115,32,119,104,101,110,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<73,110,99,108,117,100,101,115,32,97,110,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,116,105,109,101,32,115,116,97,109,112,32,105,110,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41>>]}]},<<46,32,84,104,105,115,32,102,108,97,103,32,111,118,101,114,114,105,100,101,115,32,102,108,97,103,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]}]},{dd,[],[{p,[],[<<73,110,99,108,117,100,101,115,32,97,110,32,116,105,109,101,32,115,116,97,109,112,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,69,114,108,97,110,103,95,77,111,110,111,116,111,110,105,99,95,84,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,108,97,110,103,32,109,111,110,111,116,111,110,105,99,32,116,105,109,101>>]},<<32,97,110,100,32,97,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,105,110,116,101,103,101,114,32,105,110,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32,84,104,101,32,116,105,109,101,32,115,116,97,109,112,32,40,84,115,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,102,111,114,109,97,116,32,97,110,100,32,118,97,108,117,101,32,97,115,32,112,114,111,100,117,99,101,100,32,98,121,32>>,{code,[],[<<123>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,111,116,111,110,105,99,95,116,105,109,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,109,111,110,111,116,111,110,105,99,95,116,105,109,101,40,110,97,110,111,115,101,99,111,110,100,41>>]}]},{code,[],[<<44>>]},<<32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]}]},{code,[],[<<125>>]},<<46,32,84,104,105,115,32,102,108,97,103,32,111,118,101,114,114,105,100,101,115,32,102,108,97,103,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<46>>]}]},{dt,[],[{code,[],[<<97,114,105,116,121>>]}]},{dd,[],[{p,[],[<<85,115,101,100,32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,46,32>>,{code,[],[<<123,77,44,32,70,44,32,65,114,105,116,121,125>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<123,77,44,32,70,44,32,65,114,103,115,125>>]},<<32,105,110,32,99,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,97,110,121,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,105,110,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,116,104,101,32,102,105,114,115,116,32,112,114,111,99,101,115,115,32,99,114,101,97,116,101,100,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,101,120,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,97,110,121,32,112,114,111,99,101,115,115,32,108,105,110,107,101,100,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,105,110,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]},<<46>>]}]},{dt,[],[{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,116,104,101,32,102,105,114,115,116,32,112,114,111,99,101,115,115,32,108,105,110,107,101,100,32,116,111,32,98,121,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,104,101,114,105,116,32,105,116,115,32,116,114,97,99,101,32,102,108,97,103,115,44,32,101,120,99,108,117,100,105,110,103,32,102,108,97,103,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,119,104,101,114,101,32,116,111,32,115,101,110,100,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32>>,{code,[],[<<84,114,97,99,101,114>>]},<<32,109,117,115,116,32,98,101,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,108,111,99,97,108,32,112,114,111,99,101,115,115,32,111,114,32,116,104,101,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,97,32,108,111,99,97,108,32,112,111,114,116,46>>]}]},{dt,[],[{code,[],[<<123,116,114,97,99,101,114,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,97,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,105,115,32,116,111,32,98,101,32,99,97,108,108,101,100,32,105,110,115,116,101,97,100,32,111,102,32,115,101,110,100,105,110,103,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,84,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,99,97,110,32,116,104,101,110,32,105,103,110,111,114,101,32,111,114,32,99,104,97,110,103,101,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,110,32,104,111,119,32,116,111,32,119,114,105,116,101,32,97,32,116,114,97,99,101,114,32,109,111,100,117,108,101,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,116,114,97,99,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,116,114,97,99,101,114,40,51,41>>]}]},<<46>>]}]}]},{p,[],[<<73,102,32,110,111,32>>,{code,[],[<<116,114,97,99,101,114>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,115,32,97,108,108,32,116,104,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46>>]},{p,[],[<<84,104,101,32,101,102,102,101,99,116,32,111,102,32,99,111,109,98,105,110,105,110,103,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]},<<32,119,105,116,104,32>>,{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]},<<32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,108,105,110,107>>]},<<32,97,108,111,110,101,46,32,76,105,107,101,119,105,115,101,32,102,111,114,32>>,{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]},<<32,97,110,100,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]},<<46>>]},{p,[],[<<84,104,101,32,116,114,97,99,105,110,103,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,115,32,116,104,101,32>>,{em,[],[<<116,114,97,99,101,32,109,101,115,115,97,103,101,115>>]},<<32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,108,105,115,116,46,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,102,32,116,104,101,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,105,110,32,119,104,105,99,104,32,116,104,101,32,116,114,97,99,101,100,32,101,118,101,110,116,32,104,97,115,32,111,99,99,117,114,114,101,100,46,32,84,104,101,32,116,104,105,114,100,32,116,117,112,108,101,32,101,108,101,109,101,110,116,32,105,115,32,116,104,101,32,109,101,115,115,97,103,101,32,116,97,103,46>>]},{p,[],[<<73,102,32,102,108,97,103,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<44,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32,111,114,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,105,114,115,116,32,116,117,112,108,101,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<116,114,97,99,101,95,116,115>>]},<<32,105,110,115,116,101,97,100,44,32,97,110,100,32,116,104,101,32,116,105,109,101,32,115,116,97,109,112,32,105,115,32,97,100,100,101,100,32,97,115,32,97,110,32,101,120,116,114,97,32,101,108,101,109,101,110,116,32,108,97,115,116,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,116,117,112,108,101,46,32,73,102,32,109,117,108,116,105,112,108,101,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,115,32,97,114,101,32,112,97,115,115,101,100,44,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<32,104,97,115,32,112,114,101,99,101,100,101,110,99,101,32,111,118,101,114,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,104,97,115,32,112,114,101,99,101,100,101,110,99,101,32,111,118,101,114,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<46,32,65,108,108,32,116,105,109,101,32,115,116,97,109,112,32,102,108,97,103,115,32,97,114,101,32,114,101,109,101,109,98,101,114,101,100,44,32,115,111,32,105,102,32,116,119,111,32,97,114,101,32,112,97,115,115,101,100,32,97,110,100,32,116,104,101,32,111,110,101,32,119,105,116,104,32,104,105,103,104,101,115,116,32,112,114,101,99,101,100,101,110,99,101,32,108,97,116,101,114,32,105,115,32,100,105,115,97,98,108,101,100,44,32,116,104,101,32,111,116,104,101,114,32,111,110,101,32,98,101,99,111,109,101,115,32,97,99,116,105,118,101,46>>]},{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,40,97,112,112,108,105,99,97,98,108,101,32,111,110,108,121,32,102,111,114,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<115,101,110,100>>]},<<32,97,110,100,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,105,110,103,41,32,99,111,110,116,97,105,110,115,32,97,32>>,{code,[],[<<123,109,101,115,115,97,103,101,125>>]},<<32,97,99,116,105,111,110,32,102,117,110,99,116,105,111,110,32,119,105,116,104,32,97,32,110,111,110,45,98,111,111,108,101,97,110,32,118,97,108,117,101,44,32,116,104,97,116,32,118,97,108,117,101,32,105,115,32,97,100,100,101,100,32,97,115,32,97,110,32,101,120,116,114,97,32,101,108,101,109,101,110,116,32,116,111,32,116,104,101,32,109,101,115,115,97,103,101,32,116,117,112,108,101,32,101,105,116,104,101,114,32,105,110,32,116,104,101,32,108,97,115,116,32,112,111,115,105,116,105,111,110,32,111,114,32,98,101,102,111,114,101,32,116,104,101,32,116,105,109,101,115,116,97,109,112,32,40,105,102,32,105,116,32,105,115,32,112,114,101,115,101,110,116,41,46>>]},{p,[],[<<84,114,97,99,101,32,109,101,115,115,97,103,101,115,58>>]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115>>}],[]},{dl,[],[{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,115,101,110,100,44,32,77,115,103,44,32,84,111,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,115,101,110,100,115,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<32,116,111,32,112,114,111,99,101,115,115,32>>,{code,[],[<<84,111>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,115,101,110,100,95,116,111,95,110,111,110,95,101,120,105,115,116,105,110,103,95,112,114,111,99,101,115,115,44,32,77,115,103,44,32,84,111,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,115,101,110,100,115,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<32,116,111,32,116,104,101,32,110,111,110,45,101,120,105,115,116,105,110,103,32,112,114,111,99,101,115,115,32>>,{code,[],[<<84,111>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,99,101,105,118,101>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,39,114,101,99,101,105,118,101,39,44,32,77,115,103,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,114,101,99,101,105,118,101,115,32,109,101,115,115,97,103,101,32>>,{code,[],[<<77,115,103>>]},<<46,32,73,102,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,116,105,109,101,45,111,117,116,44,32,97,32,114,101,99,101,105,118,101,32,115,116,97,116,101,109,101,110,116,32,99,97,110,32,104,97,118,101,32,116,105,109,101,100,32,111,117,116,44,32,111,114,32,116,104,101,32,112,114,111,99,101,115,115,32,114,101,99,101,105,118,101,100,32,97,32,109,101,115,115,97,103,101,32,119,105,116,104,32,116,104,101,32,112,97,121,108,111,97,100,32>>,{code,[],[<<116,105,109,101,111,117,116>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,97,108,108>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,99,97,108,108,44,32,123,77,44,32,70,44,32,65,114,103,115,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,99,97,108,108,115,32,97,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,111,102,32,99,97,108,108,115,32,97,114,101,32,110,101,118,101,114,32,115,117,112,112,108,105,101,100,44,32,111,110,108,121,32,116,104,101,32,99,97,108,108,32,97,110,100,32,105,116,115,32,97,114,103,117,109,101,110,116,115,46>>]},{p,[],[<<84,114,97,99,101,32,102,108,97,103,32>>,{code,[],[<<97,114,105,116,121>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,105,115,32,109,101,115,115,97,103,101,44,32,115,111,32,116,104,97,116,32>>,{code,[],[<<65,114,105,116,121>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,115,116,101,97,100,32,111,102,32>>,{code,[],[<<65,114,103,115>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,116,111>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,114,101,116,117,114,110,95,116,111,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,114,101,116,117,114,110,115,32>>,{em,[],[<<116,111>>]},<<32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,46,32,84,104,105,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,98,111,116,104,32,116,104,101,32,102,108,97,103,115,32>>,{code,[],[<<99,97,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,97,114,101,32,115,101,116,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,115,101,116,32,116,111,32,98,101,32,116,114,97,99,101,100,32,111,110,32>>,{em,[],[<<108,111,99,97,108>>]},<<32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,104,101,32,109,101,115,115,97,103,101,32,105,115,32,111,110,108,121,32,115,101,110,116,32,119,104,101,110,32,114,101,116,117,114,110,105,110,103,32,102,114,111,109,32,97,32,99,104,97,105,110,32,111,102,32,116,97,105,108,32,114,101,99,117,114,115,105,118,101,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32,119,104,101,114,101,32,97,116,32,108,101,97,115,116,32,111,110,101,32,99,97,108,108,32,103,101,110,101,114,97,116,101,100,32,97,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,40,116,104,97,116,32,105,115,44,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,109,97,116,99,104,101,100,44,32,97,110,100,32>>,{code,[],[<<123,109,101,115,115,97,103,101,44,32,102,97,108,115,101,125>>]},<<32,119,97,115,32,110,111,116,32,97,110,32,97,99,116,105,111,110,41,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,116,117,114,110,95,102,114,111,109>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,114,101,116,117,114,110,95,102,114,111,109,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,44,32,82,101,116,117,114,110,86,97,108,117,101,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,114,101,116,117,114,110,115,32>>,{em,[],[<<102,114,111,109>>]},<<32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,46,32,84,104,105,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,102,108,97,103,32>>,{code,[],[<<99,97,108,108>>]},<<32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,104,97,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,119,105,116,104,32,97,32>>,{code,[],[<<114,101,116,117,114,110,95,116,114,97,99,101>>]},<<32,111,114,32>>,{code,[],[<<101,120,99,101,112,116,105,111,110,95,116,114,97,99,101>>]},<<32,97,99,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,101,120,99,101,112,116,105,111,110,95,102,114,111,109>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,101,120,99,101,112,116,105,111,110,95,102,114,111,109,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,44,32,123,67,108,97,115,115,44,32,86,97,108,117,101,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,105,116,115,32>>,{em,[],[<<102,114,111,109>>]},<<32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,32,98,101,99,97,117,115,101,32,111,102,32,97,110,32,101,120,99,101,112,116,105,111,110,46,32,84,104,105,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,105,102,32,102,108,97,103,32>>,{code,[],[<<99,97,108,108>>]},<<32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,104,97,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,119,105,116,104,32,97,110,32>>,{code,[],[<<101,120,99,101,112,116,105,111,110,95,116,114,97,99,101>>]},<<32,97,99,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,115,112,97,119,110,44,32,80,105,100,50,44,32,123,77,44,32,70,44,32,65,114,103,115,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,115,112,97,119,110,115,32,97,32,110,101,119,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,46>>]},{p,[],[{code,[],[<<65,114,103,115>>]},<<32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,97,114,103,117,109,101,110,116,32,108,105,115,116,44,32,98,117,116,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,32,105,102,32,116,104,101,32,115,112,97,119,110,32,105,115,32,101,114,114,111,110,101,111,117,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,115,112,97,119,110,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,115,112,97,119,110,101,100,44,32,80,105,100,50,44,32,123,77,44,32,70,44,32,65,114,103,115,125,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,115,112,97,119,110,101,100,32,98,121,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<32,119,105,116,104,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,32,99,97,108,108,32,97,115,32,101,110,116,114,121,32,112,111,105,110,116,46>>]},{p,[],[{code,[],[<<65,114,103,115>>]},<<32,105,115,32,115,117,112,112,111,115,101,100,32,116,111,32,98,101,32,116,104,101,32,97,114,103,117,109,101,110,116,32,108,105,115,116,44,32,98,117,116,32,99,97,110,32,98,101,32,97,110,121,32,116,101,114,109,32,105,102,32,116,104,101,32,115,112,97,119,110,32,105,115,32,101,114,114,111,110,101,111,117,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,101,120,105,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,101,120,105,116,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,101,120,105,116,115,32,119,105,116,104,32,114,101,97,115,111,110,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,114,101,103,105,115,116,101,114>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,114,101,103,105,115,116,101,114,44,32,82,101,103,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,114,101,103,105,115,116,101,114,101,100,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,114,101,103,105,115,116,101,114>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,117,110,114,101,103,105,115,116,101,114,44,32,82,101,103,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,116,104,101,32,110,97,109,101,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,117,110,114,101,103,105,115,116,101,114,101,100,46,32,84,104,105,115,32,105,115,32,100,111,110,101,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,119,104,101,110,32,97,32,114,101,103,105,115,116,101,114,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,101,120,105,116,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,108,105,110,107>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,108,105,110,107,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,108,105,110,107,115,32,116,111,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,117,110,108,105,110,107>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,117,110,108,105,110,107,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,114,101,109,111,118,101,115,32,116,104,101,32,108,105,110,107,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,108,105,110,107,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,103,101,116,116,105,110,103,95,108,105,110,107,101,100,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,108,105,110,107,101,100,32,116,111,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,80,111,114,116,44,32,103,101,116,116,105,110,103,95,117,110,108,105,110,107,101,100,44,32,80,105,100,50,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100,80,111,114,116>>]},<<32,103,101,116,115,32,117,110,108,105,110,107,101,100,32,102,114,111,109,32,97,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100,50>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,112,101,110>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,111,112,101,110,44,32,80,105,100,44,32,68,114,105,118,101,114,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,111,112,101,110,115,32,97,32,110,101,119,32,112,111,114,116,32>>,{code,[],[<<80,111,114,116>>]},<<32,119,105,116,104,32,116,104,101,32,114,117,110,110,105,110,103,32>>,{code,[],[<<68,114,105,118,101,114>>]},<<46>>]},{p,[],[{code,[],[<<68,114,105,118,101,114>>]},<<32,105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,100,114,105,118,101,114,32,97,115,32,97,110,32,97,116,111,109,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,99,108,111,115,101,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,99,108,111,115,101,100,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,99,108,111,115,101,115,32,119,105,116,104,32>>,{code,[],[<<82,101,97,115,111,110>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,114,111,99>>}],[]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,101,120,105,116,105,110,103,95,112,114,111,99>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,105,110,32,124,32,105,110,95,101,120,105,116,105,110,103,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,114,117,110,46,32,84,104,101,32,112,114,111,99,101,115,115,32,114,117,110,115,32,105,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,77,44,32,70,44,32,65,114,105,116,121,125>>]},<<46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,114,111,99>>}],[]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,105,110,103,95,112,114,111,99>>}],[]},{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,101,120,105,116,101,100,95,112,114,111,99>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,111,117,116,32,124,32,111,117,116,95,101,120,105,116,105,110,103,32,124,32,111,117,116,95,101,120,105,116,101,100,44,32,123,77,44,32,70,44,32,65,114,105,116,121,125,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,46,32,84,104,101,32,112,114,111,99,101,115,115,32,119,97,115,32,114,117,110,110,105,110,103,32,105,110,32,102,117,110,99,116,105,111,110,32,123,77,44,32,70,44,32,65,114,105,116,121,125,46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,105,110,95,112,111,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,105,110,44,32,67,111,109,109,97,110,100,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,116,111,32,114,117,110,46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,105,115,32,116,104,101,32,102,105,114,115,116,32,116,104,105,110,103,32,116,104,101,32,112,111,114,116,32,119,105,108,108,32,101,120,101,99,117,116,101,44,32,105,116,32,99,97,110,32,104,111,119,101,118,101,114,32,114,117,110,32,115,101,118,101,114,97,108,32,99,111,109,109,97,110,100,115,32,98,101,102,111,114,101,32,98,101,105,110,103,32,115,99,104,101,100,117,108,101,100,32,111,117,116,46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]},{p,[],[<<84,104,101,32,112,111,115,115,105,98,108,101,32,99,111,109,109,97,110,100,115,32,97,114,101,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<99,108,111,115,101>>]},<<44,32>>,{code,[],[<<99,111,109,109,97,110,100>>]},<<44,32>>,{code,[],[<<99,111,110,110,101,99,116>>]},<<44,32>>,{code,[],[<<99,111,110,116,114,111,108>>]},<<44,32>>,{code,[],[<<102,108,117,115,104>>]},<<44,32>>,{code,[],[<<105,110,102,111>>]},<<44,32>>,{code,[],[<<108,105,110,107>>]},<<44,32>>,{code,[],[<<111,112,101,110>>]},<<44,32,97,110,100,32>>,{code,[],[<<117,110,108,105,110,107>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,111,117,116,95,112,111,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,111,114,116,44,32,111,117,116,44,32,67,111,109,109,97,110,100,32,124,32,48,125>>]}]},{dd,[],[{p,[],[<<87,104,101,110,32>>,{code,[],[<<80,111,114,116>>]},<<32,105,115,32,115,99,104,101,100,117,108,101,100,32,111,117,116,46,32,84,104,101,32,108,97,115,116,32,99,111,109,109,97,110,100,32,114,117,110,32,119,97,115,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<46,32,79,110,32,115,111,109,101,32,114,97,114,101,32,111,99,99,97,115,105,111,110,115,44,32,116,104,101,32,99,117,114,114,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,100,101,116,101,114,109,105,110,101,100,44,32,116,104,101,110,32,116,104,101,32,108,97,115,116,32,101,108,101,109,101,110,116,32,105,115,32>>,{code,[],[<<48>>]},<<46,32>>,{code,[],[<<67,111,109,109,97,110,100>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32,99,111,109,109,97,110,100,115,32,97,115,32>>,{code,[],[<<105,110>>]}]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,115,116,97,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,105,110,111,114,95,115,116,97,114,116,44,32,73,110,102,111,125>>]}]},{dd,[],[{a,[{id,<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>}],[]},{p,[],[<<83,101,110,116,32,119,104,101,110,32,97,32,121,111,117,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,98,111,117,116,32,116,111,32,98,101,32,115,116,97,114,116,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,119,111,45,101,108,101,109,101,110,116,32,116,117,112,108,101,115,44,32,119,104,101,114,101,32,116,104,101,32,102,105,114,115,116,32,101,108,101,109,101,110,116,32,105,115,32,97,32,107,101,121,44,32,97,110,100,32,116,104,101,32,115,101,99,111,110,100,32,105,115,32,116,104,101,32,118,97,108,117,101,46,32,68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,97,110,121,32,111,114,100,101,114,32,111,102,32,116,104,101,32,116,117,112,108,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,107,101,121,115,32,97,114,101,32,100,101,102,105,110,101,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,117,115,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,98,108,111,99,107,32,117,115,101,100,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,104,101,97,112,32,97,110,100,32,116,104,101,32,115,116,97,99,107,46>>]},{dt,[],[{code,[],[<<111,108,100,95,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,117,115,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32,111,108,100,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<111,108,100,95,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,101,109,111,114,121,32,98,108,111,99,107,32,117,115,101,100,32,102,111,114,32,115,116,111,114,105,110,103,32,116,104,101,32,111,108,100,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<115,116,97,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,116,97,99,107,46>>]},{dt,[],[{code,[],[<<114,101,99,101,110,116,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,100,97,116,97,32,116,104,97,116,32,115,117,114,118,105,118,101,100,32,116,104,101,32,112,114,101,118,105,111,117,115,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{dt,[],[{code,[],[<<109,98,117,102,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,99,111,109,98,105,110,101,100,32,115,105,122,101,32,111,102,32,109,101,115,115,97,103,101,32,98,117,102,102,101,114,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,112,114,111,99,101,115,115,46>>]},{dt,[],[{code,[],[<<98,105,110,95,118,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,117,110,105,113,117,101,32,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<98,105,110,95,118,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,98,105,110,97,114,105,101,115,32,97,108,108,111,119,101,100,32,105,110,32,116,104,101,32,118,105,114,116,117,97,108,32,104,101,97,112,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,98,101,102,111,114,101,32,100,111,105,110,103,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{dt,[],[{code,[],[<<98,105,110,95,111,108,100,95,118,104,101,97,112,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,117,110,105,113,117,101,32,111,102,102,45,104,101,97,112,32,98,105,110,97,114,105,101,115,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,116,104,101,32,112,114,111,99,101,115,115,32,111,108,100,32,104,101,97,112,46>>]},{dt,[],[{code,[],[<<98,105,110,95,111,108,100,95,118,104,101,97,112,95,98,108,111,99,107,95,115,105,122,101>>]}]},{dd,[],[<<84,104,101,32,116,111,116,97,108,32,115,105,122,101,32,111,102,32,98,105,110,97,114,105,101,115,32,97,108,108,111,119,101,100,32,105,110,32,116,104,101,32,118,105,114,116,117,97,108,32,111,108,100,32,104,101,97,112,32,105,110,32,116,104,101,32,112,114,111,99,101,115,115,32,98,101,102,111,114,101,32,100,111,105,110,103,32,97,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{dt,[],[{code,[],[<<119,111,114,100,115,105,122,101>>]}]},{dd,[],[<<70,111,114,32,116,104,101,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]},<<32,101,118,101,110,116,32,105,116,32,105,115,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,110,101,101,100,32,116,104,97,116,32,116,114,105,103,103,101,114,101,100,32,116,104,101,32,71,67,46,32,70,111,114,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,101,110,100>>]},<<32,101,118,101,110,116,32,105,116,32,105,115,32,116,104,101,32,115,105,122,101,32,111,102,32,114,101,99,108,97,105,109,101,100,32,109,101,109,111,114,121,32,61,32,115,116,97,114,116,32>>,{code,[],[<<104,101,97,112,95,115,105,122,101>>]},<<32,45,32,101,110,100,32>>,{code,[],[<<104,101,97,112,95,115,105,122,101>>]},<<46>>]}]},{p,[],[<<65,108,108,32,115,105,122,101,115,32,97,114,101,32,105,110,32,119,111,114,100,115,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]}]},<<32,105,115,32,114,101,97,99,104,101,100,32,100,117,114,105,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,115,116,97,114,116>>]},<<44,32,98,117,116,32,116,104,101,32,115,105,122,101,115,32,114,101,102,108,101,99,116,32,116,104,101,32,115,105,122,101,115,32,116,104,97,116,32,116,114,105,103,103,101,114,101,100,32>>,{code,[],[<<109,97,120,95,104,101,97,112,95,115,105,122,101>>]},<<32,116,111,32,98,101,32,114,101,97,99,104,101,100,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,105,110,111,114,95,101,110,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,105,110,111,114,95,101,110,100,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,121,111,117,110,103,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,102,105,110,105,115,104,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]},<<44,32,98,117,116,32,116,104,101,32,115,105,122,101,115,32,114,101,102,108,101,99,116,32,116,104,101,32,110,101,119,32,115,105,122,101,115,32,97,102,116,101,114,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,106,111,114,95,115,116,97,114,116>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,97,106,111,114,95,115,116,97,114,116,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,97,98,111,117,116,32,116,111,32,98,101,32,115,116,97,114,116,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]},<<46>>]}]},{dt,[],[{a,[{id,<<116,114,97,99,101,95,51,95,116,114,97,99,101,95,109,101,115,115,97,103,101,115,95,103,99,95,109,97,106,111,114,95,101,110,100>>}],[]},{code,[],[<<123,116,114,97,99,101,44,32,80,105,100,44,32,103,99,95,109,97,106,111,114,95,101,110,100,44,32,73,110,102,111,125>>]}]},{dd,[],[{p,[],[<<83,101,110,116,32,119,104,101,110,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,32,105,115,32,102,105,110,105,115,104,101,100,46,32>>,{code,[],[<<73,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,115,97,109,101,32,107,105,110,100,32,111,102,32,108,105,115,116,32,97,115,32,105,110,32,109,101,115,115,97,103,101,32>>,{code,[],[<<103,99,95,109,105,110,111,114,95,115,116,97,114,116>>]},<<44,32,98,117,116,32,116,104,101,32,115,105,122,101,115,32,114,101,102,108,101,99,116,32,116,104,101,32,110,101,119,32,115,105,122,101,115,32,97,102,116,101,114,32,97,32,102,117,108,108,115,119,101,101,112,32,103,97,114,98,97,103,101,32,99,111,108,108,101,99,116,105,111,110,46>>]}]}]},{p,[],[<<73,102,32,116,104,101,32,116,114,97,99,105,110,103,32,112,114,111,99,101,115,115,47,112,111,114,116,32,100,105,101,115,32,111,114,32,116,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,114,101,116,117,114,110,115,32>>,{code,[],[<<114,101,109,111,118,101>>]},<<44,32,116,104,101,32,102,108,97,103,115,32,97,114,101,32,115,105,108,101,110,116,108,121,32,114,101,109,111,118,101,100,46>>]},{p,[],[<<69,97,99,104,32,112,114,111,99,101,115,115,32,99,97,110,32,111,110,108,121,32,98,101,32,116,114,97,99,101,100,32,98,121,32,111,110,101,32,116,114,97,99,101,114,46,32,84,104,101,114,101,102,111,114,101,44,32,97,116,116,101,109,112,116,115,32,116,111,32,116,114,97,99,101,32,97,110,32,97,108,114,101,97,100,121,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,102,97,105,108,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,97,32,110,117,109,98,101,114,32,105,110,100,105,99,97,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,109,97,116,99,104,101,100,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<49>>]},<<46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32>>,{code,[],[<<97,108,108>>]},<<32,111,114,32>>,{code,[],[<<101,120,105,115,116,105,110,103>>]},<<44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,114,111,99,101,115,115,101,115,32,114,117,110,110,105,110,103,46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,83,112,101,99>>]},<<32,105,115,32>>,{code,[],[<<110,101,119>>]},<<44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<48>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,97,114,103,117,109,101,110,116,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<99,112,117,95,116,105,109,101,115,116,97,109,112>>]},<<32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,97,108,108,32,112,108,97,116,102,111,114,109,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,49,54,53,56>>,signature => [{attribute,{2076,2},spec,{{erlang,trace,3},[{type,{2076,19},bounded_fun,[{type,{2076,19},'fun',[{type,{2076,19},product,[{var,{2076,20},'PidPortSpec'},{var,{2076,33},'How'},{var,{2076,38},'FlagList'}]},{type,{2076,51},integer,[]}]},[{type,{2077,7},constraint,[{atom,{2077,7},is_subtype},[{var,{2077,7},'PidPortSpec'},{type,{2077,22},union,[{type,{2077,22},pid,[]},{type,{2077,30},port,[]},{atom,{2078,22},all},{atom,{2078,28},processes},{atom,{2078,40},ports},{atom,{2079,22},existing},{atom,{2079,33},existing_processes},{atom,{2079,54},existing_ports},{atom,{2080,22},new},{atom,{2080,28},new_processes},{atom,{2080,44},new_ports}]}]]},{type,{2081,7},constraint,[{atom,{2081,7},is_subtype},[{var,{2081,7},'How'},{type,{2081,14},boolean,[]}]]},{type,{2082,7},constraint,[{atom,{2082,7},is_subtype},[{var,{2082,7},'FlagList'},{type,{2082,19},list,[{user_type,{2082,20},trace_flag,[]}]}]]}]]}]}}]}},{{function,trace_delivered,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2091}],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,100,101,108,105,118,101,114,121,32,111,102,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,40,103,101,110,101,114,97,116,101,100,32,98,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<44,32>>,{a,[{href,<<107,101,114,110,101,108,58,115,101,113,95,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,113,95,116,114,97,99,101,40,51,41>>]}]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,115,121,115,116,101,109,95,112,114,111,102,105,108,101,47,50>>]}]},<<41,32,105,115,32,100,105,115,108,111,99,97,116,101,100,32,111,110,32,116,104,101,32,116,105,109,101,45,108,105,110,101,32,99,111,109,112,97,114,101,100,32,116,111,32,111,116,104,101,114,32,101,118,101,110,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,46,32,73,102,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,104,97,115,32,112,97,115,115,101,100,32,115,111,109,101,32,115,112,101,99,105,102,105,99,32,112,111,105,110,116,32,105,110,32,105,116,115,32,101,120,101,99,117,116,105,111,110,44,32,97,110,100,32,121,111,117,32,119,97,110,116,32,116,111,32,107,110,111,119,32,119,104,101,110,32,97,116,32,108,101,97,115,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,101,118,101,110,116,115,32,117,112,32,116,111,32,116,104,105,115,32,112,111,105,110,116,32,104,97,118,101,32,114,101,97,99,104,101,100,32,116,104,101,32,116,114,97,99,101,114,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<46>>]},{p,[],[<<87,104,101,110,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,100,101,108,105,118,101,114,101,100,32,116,111,32,116,104,101,32,116,114,97,99,101,114,32,117,112,32,116,111,32,116,104,101,32,112,111,105,110,116,32,116,104,97,116,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,114,101,97,99,104,101,100,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,99,97,108,108,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<44,32,116,104,101,110,32,97,32>>,{code,[],[<<123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,84,114,97,99,101,101,44,32,82,101,102,125>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<32,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,109,101,115,115,97,103,101,32>>,{code,[],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100>>]},<<32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,105,109,112,108,121,32,116,104,97,116,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,110,115,116,101,97,100,32,105,116,32,105,109,112,108,105,101,115,32,116,104,97,116,32,97,108,108,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,116,104,97,116,32>>,{em,[],[<<97,114,101,32,116,111,32,98,101,32,100,101,108,105,118,101,114,101,100>>]},<<32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,46,32,73,116,32,105,115,32,110,111,116,32,97,110,32,101,114,114,111,114,32,105,102,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,105,115,32,110,111,116,44,32,97,110,100,32,104,97,115,32,110,111,116,32,98,101,101,110,32,116,114,97,99,101,100,32,98,121,32,115,111,109,101,111,110,101,44,32,98,117,116,32,105,102,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32>>,{em,[],[<<110,111>>]},<<32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,104,97,118,101,32,98,101,101,110,32,100,101,108,105,118,101,114,101,100,32,119,104,101,110,32,116,104,101,32>>,{code,[],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100>>]},<<32,109,101,115,115,97,103,101,32,97,114,114,105,118,101,115,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,109,117,115,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,99,117,114,114,101,110,116,108,121,32,111,114,32,112,114,101,118,105,111,117,115,108,121,32,101,120,105,115,116,105,110,103,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<32,114,101,115,105,100,101,115,32,111,110,46,32,84,104,101,32,115,112,101,99,105,97,108,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,97,116,111,109,32>>,{code,[],[<<97,108,108>>]},<<32,100,101,110,111,116,101,115,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,116,104,97,116,32,99,117,114,114,101,110,116,108,121,32,97,114,101,32,116,114,97,99,101,100,32,105,110,32,116,104,101,32,110,111,100,101,46>>]},{p,[],[<<87,104,101,110,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,116,114,97,99,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<84,114,97,99,101,114,32,77,111,100,117,108,101>>]},<<44,32,97,110,121,32,109,101,115,115,97,103,101,32,115,101,110,116,32,105,110,32,116,104,101,32,116,114,97,99,101,32,99,97,108,108,98,97,99,107,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,104,97,118,101,32,114,101,97,99,104,101,100,32,105,116,115,32,114,101,99,105,112,105,101,110,116,32,98,101,102,111,114,101,32,116,104,101,32>>,{code,[],[<<116,114,97,99,101,95,100,101,108,105,118,101,114,101,100>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,115,101,110,116,46>>]},{p,[],[<<69,120,97,109,112,108,101,58,32,80,114,111,99,101,115,115,32>>,{code,[],[<<65>>]},<<32,105,115,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<44,32,112,111,114,116,32>>,{code,[],[<<66>>]},<<32,105,115,32,116,114,97,99,101,114,44,32,97,110,100,32,112,114,111,99,101,115,115,32>>,{code,[],[<<67>>]},<<32,105,115,32,116,104,101,32,112,111,114,116,32,111,119,110,101,114,32,111,102,32>>,{code,[],[<<66>>]},<<46,32>>,{code,[],[<<67>>]},<<32,119,97,110,116,115,32,116,111,32,99,108,111,115,101,32>>,{code,[],[<<66>>]},<<32,119,104,101,110,32>>,{code,[],[<<65>>]},<<32,101,120,105,116,115,46,32,84,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,116,114,97,99,101,32,105,115,32,110,111,116,32,116,114,117,110,99,97,116,101,100,44,32>>,{code,[],[<<67>>]},<<32,99,97,110,32,99,97,108,108,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,65,41>>]},<<32,119,104,101,110,32>>,{code,[],[<<65>>]},<<32,101,120,105,116,115,44,32,97,110,100,32,119,97,105,116,32,102,111,114,32,109,101,115,115,97,103,101,32>>,{code,[],[<<123,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,44,32,65,44,32,82,101,102,125>>]},<<32,98,101,102,111,114,101,32,99,108,111,115,105,110,103,32>>,{code,[],[<<66>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<84,114,97,99,101,101>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,112,114,111,99,101,115,115,32,40,100,101,97,100,32,111,114,32,97,108,105,118,101,41,32,111,110,32,116,104,101,32,115,97,109,101,32,110,111,100,101,32,97,115,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,100,101,108,105,118,101,114,101,100,40,84,114,97,99,101,101,41>>]},<<32,114,101,115,105,100,101,115,32,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,51,49,56>>,signature => [{attribute,{2091,2},spec,{{erlang,trace_delivered,1},[{type,{2091,29},bounded_fun,[{type,{2091,29},'fun',[{type,{2091,29},product,[{var,{2091,30},'Tracee'}]},{var,{2091,41},'Ref'}]},[{type,{2092,7},constraint,[{atom,{2092,7},is_subtype},[{var,{2092,7},'Tracee'},{type,{2092,17},union,[{type,{2092,17},pid,[]},{atom,{2092,25},all}]}]]},{type,{2093,7},constraint,[{atom,{2093,7},is_subtype},[{var,{2093,7},'Ref'},{type,{2093,14},reference,[]}]]}]]}]}}]}},{{function,trace_info,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2098}],[<<116,114,97,99,101,95,105,110,102,111,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,105,110,102,111,95,102,108,97,103>>}],[]},{li,[{name,<<116,114,97,99,101,95,105,110,102,111,95,105,116,101,109,95,114,101,115,117,108,116>>}],[]},{li,[{name,<<116,114,97,99,101,95,105,110,102,111,95,114,101,116,117,114,110>>}],[]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]}]},{p,[],[<<82,101,116,117,114,110,115,32,116,114,97,99,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,112,111,114,116,44,32,112,114,111,99,101,115,115,44,32,102,117,110,99,116,105,111,110,44,32,111,114,32,101,118,101,110,116,46>>]},{p,[],[{em,[],[<<84,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,112,111,114,116,32,111,114,32,112,114,111,99,101,115,115>>]},<<44,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32,116,111,32,98,101,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,40,112,105,100,41,44,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<110,101,119>>]},<<44,32>>,{code,[],[<<110,101,119,95,112,114,111,99,101,115,115,101,115>>]},<<44,32,111,114,32>>,{code,[],[<<110,101,119,95,112,111,114,116,115>>]},<<46,32,84,104,101,32,97,116,111,109,32>>,{code,[],[<<110,101,119>>]},<<32,111,114,32>>,{code,[],[<<110,101,119,95,112,114,111,99,101,115,115,101,115>>]},<<32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,116,114,97,99,101,32,115,116,97,116,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,32,116,111,32,98,101,32,99,114,101,97,116,101,100,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,97,116,111,109,32>>,{code,[],[<<110,101,119,95,112,111,114,116,115>>]},<<32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,116,114,97,99,101,32,115,116,97,116,101,32,102,111,114,32,112,111,114,116,115,32,116,111,32,98,101,32,99,114,101,97,116,101,100,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,102,111,114,32,112,111,114,116,115,32,97,110,100,32,112,114,111,99,101,115,115,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,108,97,103,115>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32,97,116,111,109,115,32,105,110,100,105,99,97,116,105,110,103,32,119,104,97,116,32,107,105,110,100,32,111,102,32,116,114,97,99,101,115,32,105,115,32,101,110,97,98,108,101,100,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,46,32,84,104,101,32,108,105,115,116,32,105,115,32,101,109,112,116,121,32,105,102,32,110,111,32,116,114,97,99,101,115,32,97,114,101,32,101,110,97,98,108,101,100,44,32,97,110,100,32,111,110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,97,116,111,109,115,32,105,102,32,116,114,97,99,101,115,32,97,114,101,32,101,110,97,98,108,101,100,58,32>>,{code,[],[<<115,101,110,100>>]},<<44,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<44,32>>,{code,[],[<<115,101,116,95,111,110,95,115,112,97,119,110>>]},<<44,32>>,{code,[],[<<99,97,108,108>>]},<<44,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<44,32>>,{code,[],[<<112,114,111,99,115>>]},<<44,32>>,{code,[],[<<112,111,114,116,115>>]},<<44,32>>,{code,[],[<<115,101,116,95,111,110,95,102,105,114,115,116,95,115,112,97,119,110>>]},<<44,32>>,{code,[],[<<115,101,116,95,111,110,95,108,105,110,107>>]},<<44,32>>,{code,[],[<<114,117,110,110,105,110,103>>]},<<44,32>>,{code,[],[<<114,117,110,110,105,110,103,95,112,114,111,99,115>>]},<<44,32>>,{code,[],[<<114,117,110,110,105,110,103,95,112,111,114,116,115>>]},<<44,32>>,{code,[],[<<115,105,108,101,110,116>>]},<<44,32>>,{code,[],[<<101,120,105,116,105,110,103>>]},<<44,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32>>,{code,[],[<<115,116,114,105,99,116,95,109,111,110,111,116,111,110,105,99,95,116,105,109,101,115,116,97,109,112>>]},<<44,32>>,{code,[],[<<103,97,114,98,97,103,101,95,99,111,108,108,101,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<116,105,109,101,115,116,97,109,112>>]},<<44,32,97,110,100,32>>,{code,[],[<<97,114,105,116,121>>]},<<46,32,84,104,101,32,111,114,100,101,114,32,105,115,32,97,114,98,105,116,114,97,114,121,46>>]}]},{dt,[],[{code,[],[<<116,114,97,99,101,114>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,105,100,101,110,116,105,102,105,101,114,32,102,111,114,32,112,114,111,99,101,115,115,44,32,112,111,114,116,44,32,111,114,32,97,32,116,117,112,108,101,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,116,114,97,99,101,114,32,109,111,100,117,108,101,32,97,110,100,32,116,114,97,99,101,114,32,115,116,97,116,101,32,116,114,97,99,105,110,103,32,116,104,105,115,32,112,114,111,99,101,115,115,46,32,73,102,32,116,104,105,115,32,112,114,111,99,101,115,115,32,105,115,32,110,111,116,32,116,114,97,99,101,100,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]}]},{p,[],[{em,[],[<<84,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,102,117,110,99,116,105,111,110>>]},<<44,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32,116,111,32,98,101,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<46,32,78,111,32,119,105,108,100,99,97,114,100,115,32,97,114,101,32,97,108,108,111,119,101,100,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,111,114,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,116,114,97,99,101,100,46,32,73,102,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<44,32,116,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,114,101,116,117,114,110,101,100,32,114,101,102,101,114,115,32,116,111,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32,99,111,100,101,32,116,104,97,116,32,119,105,108,108,32,98,101,32,108,111,97,100,101,100,46>>]},{p,[],[<<86,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<115,32,102,111,114,32,102,117,110,99,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<116,114,97,99,101,100>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,114,97,99,101,100,32,111,110,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,44,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,105,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,114,97,99,101,100,32,111,110,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,40,116,104,97,116,32,105,115,44,32,108,111,99,97,108,32,97,110,100,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,41,44,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,108,111,99,97,108,32,111,114,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,97,114,101,32,110,111,116,32,116,114,97,99,101,100,46>>]}]},{dt,[],[{code,[],[<<109,97,116,99,104,95,115,112,101,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,108,111,99,97,108,108,121,32,111,114,32,103,108,111,98,97,108,108,121,32,116,114,97,99,101,100,32,98,117,116,32,104,97,115,32,110,111,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,100,101,102,105,110,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,101,116,97>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,101,116,97,45,116,114,97,99,101,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,44,32,112,111,114,116,44,32,111,114,32,116,114,97,99,101,32,109,111,100,117,108,101,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,110,111,116,32,109,101,116,97,45,116,114,97,99,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,109,101,116,97,45,116,114,97,99,101,100,32,98,117,116,32,104,97,115,32,111,110,99,101,32,100,101,116,101,99,116,101,100,32,116,104,97,116,32,116,104,101,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,32,105,115,32,105,110,118,97,108,105,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,101,116,97,95,109,97,116,99,104,95,115,112,101,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,101,116,97,45,116,114,97,99,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,46,32,73,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,109,101,116,97,45,116,114,97,99,101,100,32,98,117,116,32,104,97,115,32,110,111,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,100,101,102,105,110,101,100,44,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<91,93>>]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,97,108,108,32,99,111,117,110,116,32,118,97,108,117,101,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,111,114,32>>,{code,[],[<<116,114,117,101>>]},<<32,102,111,114,32,116,104,101,32,112,115,101,117,100,111,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,105,102,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,105,115,32,97,99,116,105,118,101,46,32,79,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,97,108,108,32,116,105,109,101,32,118,97,108,117,101,115,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,111,114,32>>,{code,[],[<<116,114,117,101>>]},<<32,102,111,114,32,116,104,101,32,112,115,101,117,100,111,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,105,102,32,99,97,108,108,32,116,105,109,101,32,116,114,97,99,105,110,103,32,105,115,32,97,99,116,105,118,101,46,32,79,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,99,97,108,108,32,116,105,109,101,32,118,97,108,117,101,115,32,114,101,116,117,114,110,101,100,44,32>>,{code,[],[<<91,123,80,105,100,44,32,67,111,117,110,116,44,32,83,44,32,85,115,125,93>>]},<<44,32,105,115,32,97,32,108,105,115,116,32,111,102,32,101,97,99,104,32,112,114,111,99,101,115,115,32,116,104,97,116,32,101,120,101,99,117,116,101,100,32,116,104,101,32,102,117,110,99,116,105,111,110,32,97,110,100,32,105,116,115,32,115,112,101,99,105,102,105,99,32,99,111,117,110,116,101,114,115,46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32>>,{code,[],[<<123,73,116,101,109,44,32,86,97,108,117,101,125>>]},<<32,116,117,112,108,101,115,32,102,111,114,32,97,108,108,32,111,116,104,101,114,32,105,116,101,109,115,44,32,111,114,32,114,101,116,117,114,110,115,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32,110,111,32,116,114,97,99,105,110,103,32,105,115,32,97,99,116,105,118,101,32,102,111,114,32,116,104,105,115,32,102,117,110,99,116,105,111,110,46>>]}]}]},{p,[],[{em,[],[<<84,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,110,32,101,118,101,110,116>>]},<<44,32>>,{code,[],[<<80,105,100,80,111,114,116,70,117,110,99,69,118,101,110,116>>]},<<32,105,115,32,116,111,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<115,101,110,100>>]},<<32,111,114,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<46>>]},{p,[],[<<79,110,101,32,118,97,108,105,100,32>>,{code,[],[<<73,116,101,109>>]},<<32,102,111,114,32,101,118,101,110,116,115,32,101,120,105,115,116,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<109,97,116,99,104,95,115,112,101,99>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32,116,104,105,115,32,101,118,101,110,116,44,32,105,102,32,105,116,32,104,97,115,32,111,110,101,44,32,111,114,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,110,111,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,104,97,115,32,98,101,101,110,32,115,101,116,46>>]}]}]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<123,73,116,101,109,44,32,86,97,108,117,101,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,105,115,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,105,110,102,111,114,109,97,116,105,111,110,32,97,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,46,32,73,102,32,97,32,112,105,100,32,102,111,114,32,97,32,100,101,97,100,32,112,114,111,99,101,115,115,32,119,97,115,32,115,112,101,99,105,102,105,101,100,44,32,111,114,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,110,111,110,45,101,120,105,115,116,105,110,103,32,102,117,110,99,116,105,111,110,44,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,105,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,51,55,51>>,signature => [{attribute,{2098,2},spec,{{erlang,trace_info,2},[{type,{2098,24},bounded_fun,[{type,{2098,24},'fun',[{type,{2098,24},product,[{var,{2098,25},'PidPortFuncEvent'},{var,{2098,43},'Item'}]},{var,{2098,52},'Res'}]},[{type,{2099,7},constraint,[{atom,{2099,7},is_subtype},[{var,{2099,7},'PidPortFuncEvent'},{type,{2099,27},union,[{type,{2099,27},pid,[]},{type,{2099,35},port,[]},{atom,{2099,44},new},{atom,{2099,50},new_processes},{atom,{2099,66},new_ports},{type,{2100,24},tuple,[{var,{2100,25},'Module'},{var,{2100,33},'Function'},{var,{2100,43},'Arity'}]},{atom,{2100,52},on_load},{atom,{2100,62},send},{atom,{2100,69},'receive'}]}]]},{type,{2101,7},constraint,[{atom,{2101,7},is_subtype},[{var,{2101,7},'Module'},{type,{2101,17},module,[]}]]},{type,{2102,7},constraint,[{atom,{2102,7},is_subtype},[{var,{2102,7},'Function'},{type,{2102,19},atom,[]}]]},{type,{2103,7},constraint,[{atom,{2103,7},is_subtype},[{var,{2103,7},'Arity'},{type,{2103,16},arity,[]}]]},{type,{2104,7},constraint,[{atom,{2104,7},is_subtype},[{var,{2104,7},'Item'},{type,{2104,15},union,[{atom,{2104,15},flags},{atom,{2104,23},tracer},{atom,{2104,32},traced},{atom,{2104,41},match_spec},{atom,{2105,15},meta},{atom,{2105,22},meta_match_spec},{atom,{2105,40},call_count},{atom,{2105,53},call_time},{atom,{2105,65},all}]}]]},{type,{2106,7},constraint,[{atom,{2106,7},is_subtype},[{var,{2106,7},'Res'},{user_type,{2106,14},trace_info_return,[]}]]}]]}]}}]}},{{function,trace_pattern,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2773}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,50>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]},{li,[{name,<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,109,102,97>>}],[]}]},{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,69,118,101,110,116,44,32,77,97,116,99,104,83,112,101,99,44,32,91,93,41>>]}]},<<44,32,114,101,116,97,105,110,101,100,32,102,111,114,32,98,97,99,107,119,97,114,100,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,53,48,57>>,signature => [{attribute,{2773,2},spec,{{erlang,trace_pattern,2},[{type,{2773,27},bounded_fun,[{type,{2773,27},'fun',[{type,{2773,27},product,[{var,{2773,28},'MFA'},{var,{2773,33},'MatchSpec'}]},{type,{2773,47},non_neg_integer,[]}]},[{type,{2774,7},constraint,[{atom,{2774,7},is_subtype},[{var,{2774,7},'MFA'},{type,{2774,14},union,[{user_type,{2774,14},trace_pattern_mfa,[]},{atom,{2774,36},send},{atom,{2774,43},'receive'}]}]]},{type,{2775,7},constraint,[{atom,{2775,7},is_subtype},[{var,{2775,7},'MatchSpec'},{type,{2775,21},union,[{ann_type,{2775,21},[{var,{2775,21},'MatchSpecList'},{user_type,{2775,38},trace_match_spec,[]}]},{type,{2776,20},boolean,[]},{atom,{2777,20},restart},{atom,{2778,20},pause}]}]]}]]}]}}]}},{{function,trace_pattern,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2793}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]}]},{p,[],[<<83,101,116,115,32,116,114,97,99,101,32,112,97,116,116,101,114,110,32,102,111,114,32>>,{em,[],[<<109,101,115,115,97,103,101,32,115,101,110,100,105,110,103>>]},<<46,32,77,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<32,116,111,32,115,101,116,32,116,104,101,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,46,32,66,121,32,100,101,102,97,117,108,116,32,97,108,108,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,102,114,111,109,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,116,114,97,99,101,100,46,32,84,111,32,108,105,109,105,116,32,116,114,97,99,101,100,32,115,101,110,100,32,101,118,101,110,116,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,109,101,115,115,97,103,101,32,99,111,110,116,101,110,116,44,32,116,104,101,32,115,101,110,100,101,114,32,97,110,100,47,111,114,32,116,104,101,32,114,101,99,101,105,118,101,114,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99>>]},<<32,99,97,110,32,116,97,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<77,97,116,99,104,83,112,101,99,76,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,100,111,110,101,32,111,110,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<91,82,101,99,101,105,118,101,114,44,32,77,115,103,93>>]},<<46,32>>,{code,[],[<<82,101,99,101,105,118,101,114>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,116,121,32,111,102,32,116,104,101,32,114,101,99,101,105,118,101,114,32,97,110,100,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,116,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,46,32,84,104,101,32,112,105,100,32,111,102,32,116,104,101,32,115,101,110,100,105,110,103,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,97,99,99,101,115,115,101,100,32,119,105,116,104,32,116,104,101,32,103,117,97,114,100,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<115,101,108,102,47,48>>]},<<46,32,65,110,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,109,97,116,99,104,95,115,112,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<69,110,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,115,101,110,116,32,109,101,115,115,97,103,101,115,32,40,102,114,111,109,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,41,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46,32>>,{em,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,115,101,110,116,32,109,101,115,115,97,103,101,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]}]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,109,117,115,116,32,98,101,32>>,{code,[],[<<91,93>>]},<<32,102,111,114,32,115,101,110,100,32,116,114,97,99,105,110,103,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,108,119,97,121,115,32>>,{code,[],[<<49>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,116,111,32,97,32,115,112,101,99,105,102,105,99,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,80,105,100,44,32,39,95,39,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,109,97,116,99,104,105,110,103,32>>,{code,[],[<<123,114,101,112,108,121,44,32,95,125>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,39,95,39,44,32,123,114,101,112,108,121,44,39,95,39,125,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,116,111,32,116,104,101,32,115,101,110,100,101,114,32,105,116,115,101,108,102,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,39,36,49,39,44,32,39,95,39,93,44,91,123,39,61,58,61,39,44,39,36,49,39,44,123,115,101,108,102,125,125,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,115,101,110,116,32,116,111,32,111,116,104,101,114,32,110,111,100,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,115,101,110,100,44,32,91,123,91,39,36,49,39,44,32,39,95,39,93,44,91,123,39,61,47,61,39,44,123,110,111,100,101,44,39,36,49,39,125,44,123,110,111,100,101,125,125,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32>>,{code,[],[<<115,101,110,100>>]},<<32,116,114,97,99,101,32,99,97,110,32,117,115,101,32,97,108,108,32,103,117,97,114,100,32,97,110,100,32,98,111,100,121,32,102,117,110,99,116,105,111,110,115,32,101,120,99,101,112,116,32>>,{code,[],[<<99,97,108,108,101,114>>]},<<46>>]}]},{p,[],[<<70,97,105,108,115,32,98,121,32,114,97,105,115,105,110,103,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,97,110,32,97,114,103,117,109,101,110,116,32,105,115,32,105,110,118,97,108,105,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,32,104,97,115,32,101,120,99,101,115,115,105,118,101,32,110,101,115,116,105,110,103,32,119,104,105,99,104,32,99,97,117,115,101,115,32,115,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,101,120,104,97,117,115,116,105,111,110,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,115,99,104,101,100,95,116,104,114,101,97,100,95,115,116,97,99,107,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<83,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,53,50,55>>,signature => [{attribute,{2793,2},spec,{{erlang,trace_pattern,3},[{type,{2793,27},bounded_fun,[{type,{2793,27},'fun',[{type,{2793,27},product,[{atom,{2793,28},send},{var,{2793,34},'MatchSpec'},{type,{2793,45},nil,[]}]},{type,{2793,52},non_neg_integer,[]}]},[{type,{2794,7},constraint,[{atom,{2794,7},is_subtype},[{var,{2794,7},'MatchSpec'},{type,{2794,21},union,[{ann_type,{2794,21},[{var,{2794,21},'MatchSpecList'},{user_type,{2794,38},trace_match_spec,[]}]},{type,{2795,20},boolean,[]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,trace_pattern,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2793}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]}]},{p,[],[<<83,101,116,115,32,116,114,97,99,101,32,112,97,116,116,101,114,110,32,102,111,114,32>>,{em,[],[<<109,101,115,115,97,103,101,32,114,101,99,101,105,118,105,110,103>>]},<<46,32,77,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<32,116,111,32,115,101,116,32,116,104,101,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,46,32,66,121,32,100,101,102,97,117,108,116,32,97,108,108,32,109,101,115,115,97,103,101,115,32,114,101,99,101,105,118,101,100,32,98,121,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,32,97,114,101,32,116,114,97,99,101,100,46,32,84,111,32,108,105,109,105,116,32,116,114,97,99,101,100,32,114,101,99,101,105,118,101,32,101,118,101,110,116,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,109,101,115,115,97,103,101,32,99,111,110,116,101,110,116,44,32,116,104,101,32,115,101,110,100,101,114,32,97,110,100,47,111,114,32,116,104,101,32,114,101,99,101,105,118,101,114,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99>>]},<<32,99,97,110,32,116,97,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<77,97,116,99,104,83,112,101,99,76,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,100,111,110,101,32,111,110,32,116,104,101,32,108,105,115,116,32>>,{code,[],[<<91,78,111,100,101,44,32,83,101,110,100,101,114,44,32,77,115,103,93>>]},<<46,32>>,{code,[],[<<78,111,100,101>>]},<<32,105,115,32,116,104,101,32,110,111,100,101,32,110,97,109,101,32,111,102,32,116,104,101,32,115,101,110,100,101,114,46,32>>,{code,[],[<<83,101,110,100,101,114>>]},<<32,105,115,32,116,104,101,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,116,121,32,111,102,32,116,104,101,32,115,101,110,100,101,114,44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,115,101,110,100,101,114,32,105,115,32,110,111,116,32,107,110,111,119,110,32,40,119,104,105,99,104,32,99,97,110,32,98,101,32,116,104,101,32,99,97,115,101,32,102,111,114,32,114,101,109,111,116,101,32,115,101,110,100,101,114,115,41,46,32>>,{code,[],[<<77,115,103>>]},<<32,105,115,32,116,104,101,32,109,101,115,115,97,103,101,32,116,101,114,109,46,32,84,104,101,32,112,105,100,32,111,102,32,116,104,101,32,114,101,99,101,105,118,105,110,103,32,112,114,111,99,101,115,115,32,99,97,110,32,98,101,32,97,99,99,101,115,115,101,100,32,119,105,116,104,32,116,104,101,32,103,117,97,114,100,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<115,101,108,102,47,48>>]},<<46,32,65,110,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,109,97,116,99,104,95,115,112,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<69,110,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,32,40,116,111,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,41,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46,32>>,{em,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,114,101,99,101,105,118,101,100,32,109,101,115,115,97,103,101,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]}]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,109,117,115,116,32,98,101,32>>,{code,[],[<<91,93>>]},<<32,102,111,114,32,114,101,99,101,105,118,101,32,116,114,97,99,105,110,103,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,108,119,97,121,115,32>>,{code,[],[<<49>>]},<<46>>]},{p,[],[<<69,120,97,109,112,108,101,115,58>>]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,102,114,111,109,32,97,32,115,112,101,99,105,102,105,99,32,112,114,111,99,101,115,115,32>>,{code,[],[<<80,105,100>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,39,114,101,99,101,105,118,101,39,44,32,91,123,91,39,95,39,44,80,105,100,44,32,39,95,39,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,109,97,116,99,104,105,110,103,32>>,{code,[],[<<123,114,101,112,108,121,44,32,95,125>>]},<<58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,39,114,101,99,101,105,118,101,39,44,32,91,123,91,39,95,39,44,39,95,39,44,32,123,114,101,112,108,121,44,39,95,39,125,93,44,91,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{p,[],[<<79,110,108,121,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,32,102,114,111,109,32,111,116,104,101,114,32,110,111,100,101,115,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,40,39,114,101,99,101,105,118,101,39,44,32,91,123,91,39,36,49,39,44,32,39,95,39,44,32,39,95,39,93,44,91,123,39,61,47,61,39,44,39,36,49,39,44,123,110,111,100,101,125,125,93,44,91,93,125,93,44,32,91,93,41,46,10,49>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,111,114,32>>,{code,[],[<<39,114,101,99,101,105,118,101,39>>]},<<32,116,114,97,99,101,32,99,97,110,32,117,115,101,32,97,108,108,32,103,117,97,114,100,32,97,110,100,32,98,111,100,121,32,102,117,110,99,116,105,111,110,115,32,101,120,99,101,112,116,32>>,{code,[],[<<99,97,108,108,101,114>>]},<<44,32>>,{code,[],[<<105,115,95,115,101,113,95,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<103,101,116,95,115,101,113,95,116,111,107,101,110>>]},<<44,32>>,{code,[],[<<115,101,116,95,115,101,113,95,116,111,107,101,110>>]},<<44,32>>,{code,[],[<<101,110,97,98,108,101,95,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<100,105,115,97,98,108,101,95,116,114,97,99,101>>]},<<44,32>>,{code,[],[<<116,114,97,99,101>>]},<<44,32>>,{code,[],[<<115,105,108,101,110,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<112,114,111,99,101,115,115,95,100,117,109,112>>]},<<46>>]}]},{p,[],[<<70,97,105,108,115,32,98,121,32,114,97,105,115,105,110,103,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,97,110,32,97,114,103,117,109,101,110,116,32,105,115,32,105,110,118,97,108,105,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,32,104,97,115,32,101,120,99,101,115,115,105,118,101,32,110,101,115,116,105,110,103,32,119,104,105,99,104,32,99,97,117,115,101,115,32,115,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,101,120,104,97,117,115,116,105,111,110,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,115,99,104,101,100,95,116,104,114,101,97,100,95,115,116,97,99,107,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<83,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,54,49,52>>,signature => [{attribute,{2793,2},spec,{{erlang,trace_pattern,3},[{type,{2796,6},bounded_fun,[{type,{2796,6},'fun',[{type,{2796,6},product,[{atom,{2796,7},'receive'},{var,{2796,18},'MatchSpec'},{type,{2796,29},nil,[]}]},{type,{2796,36},non_neg_integer,[]}]},[{type,{2797,7},constraint,[{atom,{2797,7},is_subtype},[{var,{2797,7},'MatchSpec'},{type,{2797,21},union,[{ann_type,{2797,21},[{var,{2797,21},'MatchSpecList'},{user_type,{2797,38},trace_match_spec,[]}]},{type,{2798,20},boolean,[]}]}]]}]]}]}}],since => <<79,84,80,32,49,57,46,48>>}},{{function,trace_pattern,3},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2793}],[<<116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>}],[]},{li,[{name,<<109,97,116,99,104,95,118,97,114,105,97,98,108,101>>},{class,<<100,101,115,99,114,105,112,116,105,111,110>>}],[<<65,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,39,36,49,39,32,124,32,39,36,50,39,32,124,32,39,36,51,39,32,124,32,46,46,46>>]},{li,[{name,<<116,114,97,99,101,95,109,97,116,99,104,95,115,112,101,99>>}],[]},{li,[{name,<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,102,108,97,103>>}],[]},{li,[{name,<<116,114,97,99,101,95,112,97,116,116,101,114,110,95,109,102,97>>}],[]}]},{p,[],[<<69,110,97,98,108,101,115,32,111,114,32,100,105,115,97,98,108,101,115,32>>,{em,[],[<<99,97,108,108,32,116,114,97,99,105,110,103>>]},<<32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,102,117,110,99,116,105,111,110,115,46,32,77,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<32,116,111,32,115,101,116,32,116,104,101,32>>,{code,[],[<<99,97,108,108>>]},<<32,116,114,97,99,101,32,102,108,97,103,32,102,111,114,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<67,111,110,99,101,112,116,117,97,108,108,121,44,32,99,97,108,108,32,116,114,97,99,105,110,103,32,119,111,114,107,115,32,97,115,32,102,111,108,108,111,119,115,46,32,73,110,115,105,100,101,32,116,104,101,32,69,114,108,97,110,103,32,118,105,114,116,117,97,108,32,109,97,99,104,105,110,101,44,32,97,32,115,101,116,32,111,102,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,97,32,115,101,116,32,111,102,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,116,111,32,98,101,32,116,114,97,99,101,100,46,32,73,102,32,97,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,32,99,97,108,108,115,32,97,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,44,32,116,104,101,32,116,114,97,99,101,32,97,99,116,105,111,110,32,105,115,32,116,97,107,101,110,46,32,79,116,104,101,114,119,105,115,101,44,32,110,111,116,104,105,110,103,32,104,97,112,112,101,110,115,46>>]},{p,[],[<<84,111,32,97,100,100,32,111,114,32,114,101,109,111,118,101,32,111,110,101,32,111,114,32,109,111,114,101,32,112,114,111,99,101,115,115,101,115,32,116,111,32,116,104,101,32,115,101,116,32,111,102,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,101,115,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]}]},<<46>>]},{p,[],[<<84,111,32,97,100,100,32,111,114,32,114,101,109,111,118,101,32,102,117,110,99,116,105,111,110,115,32,116,111,32,116,104,101,32,115,101,116,32,111,102,32,116,114,97,99,101,100,32,102,117,110,99,116,105,111,110,115,44,32,117,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<46>>]},{p,[],[<<84,104,101,32,66,73,70,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,112,97,116,116,101,114,110,47,51>>]},<<32,99,97,110,32,97,108,115,111,32,97,100,100,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,32,116,111,32,97,32,102,117,110,99,116,105,111,110,46,32,65,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,99,111,109,112,114,105,115,101,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,116,104,101,32,102,117,110,99,116,105,111,110,32,97,114,103,117,109,101,110,116,115,32,109,117,115,116,32,109,97,116,99,104,44,32,97,32,103,117,97,114,100,32,101,120,112,114,101,115,115,105,111,110,32,116,104,97,116,32,109,117,115,116,32,101,118,97,108,117,97,116,101,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<44,32,97,110,100,32,97,110,32,97,99,116,105,111,110,32,116,111,32,98,101,32,112,101,114,102,111,114,109,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,97,99,116,105,111,110,32,105,115,32,116,111,32,115,101,110,100,32,97,32,116,114,97,99,101,32,109,101,115,115,97,103,101,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,111,114,32,116,104,101,32,103,117,97,114,100,32,102,97,105,108,115,44,32,116,104,101,32,97,99,116,105,111,110,32,105,115,32,110,111,116,32,101,120,101,99,117,116,101,100,46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,70,65>>]},<<32,105,115,32,116,111,32,98,101,32,97,32,116,117,112,108,101,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,32,70,117,110,99,116,105,111,110,44,32,65,114,105,116,121,125>>]},<<44,32,111,114,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,46,32,73,116,32,99,97,110,32,98,101,32,116,104,101,32,109,111,100,117,108,101,44,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,97,114,105,116,121,32,102,111,114,32,97,32,102,117,110,99,116,105,111,110,32,40,111,114,32,97,32,66,73,70,32,105,110,32,97,110,121,32,109,111,100,117,108,101,41,46,32,84,104,101,32,97,116,111,109,32>>,{code,[],[<<39,95,39>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,97,115,32,97,32,119,105,108,100,99,97,114,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,119,97,121,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,77,111,100,117,108,101,44,70,117,110,99,116,105,111,110,44,39,95,39,125>>]}]},{dd,[],[{p,[],[<<65,108,108,32,102,117,110,99,116,105,111,110,115,32,111,102,32,97,110,121,32,97,114,105,116,121,32,110,97,109,101,100,32>>,{code,[],[<<70,117,110,99,116,105,111,110>>]},<<32,105,110,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,77,111,100,117,108,101,44,39,95,39,44,39,95,39,125>>]}]},{dd,[],[{p,[],[<<65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,109,111,100,117,108,101,32>>,{code,[],[<<77,111,100,117,108,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,39,95,39,44,39,95,39,44,39,95,39,125>>]}]},{dd,[],[{p,[],[<<65,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,97,108,108,32,108,111,97,100,101,100,32,109,111,100,117,108,101,115,46>>]}]}]},{p,[],[<<79,116,104,101,114,32,99,111,109,98,105,110,97,116,105,111,110,115,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<123,77,111,100,117,108,101,44,39,95,39,44,65,114,105,116,121,125>>]},<<44,32,97,114,101,32,110,111,116,32,97,108,108,111,119,101,100,46,32,76,111,99,97,108,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,32,119,105,108,100,99,97,114,100,115,32,111,110,108,121,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,105,115,32,105,110,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<46>>]},{p,[],[<<73,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<77,70,65>>]},<<32,105,115,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<111,110,95,108,111,97,100>>]},<<44,32,116,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,110,100,32,102,108,97,103,32,108,105,115,116,32,97,114,101,32,117,115,101,100,32,111,110,32,97,108,108,32,109,111,100,117,108,101,115,32,116,104,97,116,32,97,114,101,32,110,101,119,108,121,32,108,111,97,100,101,100,46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99>>]},<<32,99,97,110,32,116,97,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<102,97,108,115,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]},{dt,[],[{code,[],[<<116,114,117,101>>]}]},{dd,[],[{p,[],[<<69,110,97,98,108,101,115,32,116,114,97,99,105,110,103,32,102,111,114,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,46,32,65,110,121,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,105,115,32,114,101,109,111,118,101,100,46>>]}]},{dt,[],[{code,[],[<<77,97,116,99,104,83,112,101,99,76,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,108,105,115,116,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,46,32,65,110,32,101,109,112,116,121,32,108,105,115,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,70,111,114,32,97,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,115,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<101,114,116,115,58,109,97,116,99,104,95,115,112,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<77,97,116,99,104,32,83,112,101,99,105,102,105,99,97,116,105,111,110,115,32,105,110,32,69,114,108,97,110,103>>]},<<32,105,110,32,116,104,101,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]}]},{dt,[],[{code,[],[<<114,101,115,116,97,114,116>>]}]},{dd,[],[{p,[],[<<70,111,114,32,116,104,101,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<99,97,108,108,95,116,105,109,101>>]},<<58,32,114,101,115,116,97,114,116,115,32,116,104,101,32,101,120,105,115,116,105,110,103,32,99,111,117,110,116,101,114,115,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32,111,116,104,101,114,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,46>>]}]},{dt,[],[{code,[],[<<112,97,117,115,101>>]}]},{dd,[],[{p,[],[<<70,111,114,32,116,104,101,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<99,97,108,108,95,116,105,109,101>>]},<<58,32,112,97,117,115,101,115,32,116,104,101,32,101,120,105,115,116,105,110,103,32,99,111,117,110,116,101,114,115,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32,111,116,104,101,114,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,111,112,116,105,111,110,115,46>>]}]}]},{p,[],[<<80,97,114,97,109,101,116,101,114,32>>,{code,[],[<<70,108,97,103,76,105,115,116>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,111,112,116,105,111,110,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,118,97,108,105,100,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<103,108,111,98,97,108>>]}]},{dd,[],[{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,99,97,108,108,32,116,114,97,99,105,110,103,32,102,111,114,32,103,108,111,98,97,108,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,32,40,116,104,97,116,32,105,115,44,32,99,97,108,108,115,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,109,111,100,117,108,101,32,101,120,112,108,105,99,105,116,108,121,41,46,32,79,110,108,121,32,101,120,112,111,114,116,101,100,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,32,97,110,100,32,111,110,108,121,32,103,108,111,98,97,108,32,99,97,108,108,115,32,103,101,110,101,114,97,116,101,32,116,114,97,99,101,32,109,101,115,115,97,103,101,115,46,32>>,{em,[],[<<84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116>>]},<<46>>]}]},{dt,[],[{code,[],[<<108,111,99,97,108>>]}]},{dd,[],[{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,99,97,108,108,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,119,104,101,110,101,118,101,114,32,97,110,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,44,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,104,111,119,32,116,104,101,121,32,97,114,101,32,99,97,108,108,101,100,46,32,73,102,32,102,108,97,103,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,105,115,32,115,101,116,32,102,111,114,32,116,104,101,32,112,114,111,99,101,115,115,44,32,97,32>>,{code,[],[<<114,101,116,117,114,110,95,116,111>>]},<<32,109,101,115,115,97,103,101,32,105,115,32,97,108,115,111,32,115,101,110,116,32,119,104,101,110,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,111,32,105,116,115,32,99,97,108,108,101,114,46>>]}]},{dt,[],[{code,[],[<<109,101,116,97,32,124,32,123,109,101,116,97,44,32,80,105,100,125,32,124,32,123,109,101,116,97,44,32,84,114,97,99,101,114,77,111,100,117,108,101,44,32,84,114,97,99,101,114,83,116,97,116,101,125>>]}]},{dd,[],[{p,[],[<<84,117,114,110,115,32,111,110,32,111,114,32,111,102,102,32,109,101,116,97,45,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,84,114,97,99,101,32,109,101,115,115,97,103,101,115,32,97,114,101,32,115,101,110,116,32,116,111,32,116,104,101,32,116,114,97,99,101,114,32,119,104,101,110,101,118,101,114,32,97,110,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,73,102,32,110,111,32,116,114,97,99,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<115,101,108,102,40,41>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,97,32,100,101,102,97,117,108,116,32,116,114,97,99,101,114,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<77,101,116,97,45,116,114,97,99,105,110,103,32,116,114,97,99,101,115,32,97,108,108,32,112,114,111,99,101,115,115,101,115,32,97,110,100,32,100,111,101,115,32,110,111,116,32,99,97,114,101,32,97,98,111,117,116,32,116,104,101,32,112,114,111,99,101,115,115,32,116,114,97,99,101,32,102,108,97,103,115,32,115,101,116,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,47,51>>]},<<44,32,116,104,101,32,116,114,97,99,101,32,102,108,97,103,115,32,97,114,101,32,105,110,115,116,101,97,100,32,102,105,120,101,100,32,116,111,32>>,{code,[],[<<91,99,97,108,108,44,32,116,105,109,101,115,116,97,109,112,93>>]},<<46>>]},{p,[],[<<84,104,101,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<123,114,101,116,117,114,110,95,116,114,97,99,101,125>>]},<<32,119,111,114,107,115,32,119,105,116,104,32,109,101,116,97,45,116,114,97,99,101,32,97,110,100,32,115,101,110,100,115,32,105,116,115,32,116,114,97,99,101,32,109,101,115,115,97,103,101,32,116,111,32,116,104,101,32,115,97,109,101,32,116,114,97,99,101,114,46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,116,114,117,101>>]},<<41,32,111,114,32,115,116,111,112,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,102,97,108,115,101>>]},<<41,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,70,111,114,32,101,118,101,114,121,32,102,117,110,99,116,105,111,110,44,32,97,32,99,111,117,110,116,101,114,32,105,115,32,105,110,99,114,101,109,101,110,116,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,44,32,105,110,32,97,110,121,32,112,114,111,99,101,115,115,46,32,78,111,32,112,114,111,99,101,115,115,32,116,114,97,99,101,32,102,108,97,103,115,32,110,101,101,100,32,116,111,32,98,101,32,97,99,116,105,118,97,116,101,100,46>>]},{p,[],[<<73,102,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,105,115,32,115,116,97,114,116,101,100,32,119,104,105,108,101,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,44,32,116,104,101,32,99,111,117,110,116,32,105,115,32,114,101,115,116,97,114,116,101,100,32,102,114,111,109,32,122,101,114,111,46,32,84,111,32,112,97,117,115,101,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,44,32,117,115,101,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,112,97,117,115,101>>]},<<46,32,80,97,117,115,101,100,32,97,110,100,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,32,99,97,110,32,98,101,32,114,101,115,116,97,114,116,101,100,32,102,114,111,109,32,122,101,114,111,32,119,105,116,104,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,114,101,115,116,97,114,116>>]},<<46>>]},{p,[],[<<84,111,32,114,101,97,100,32,116,104,101,32,99,111,117,110,116,101,114,32,118,97,108,117,101,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<99,97,108,108,95,116,105,109,101>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,116,114,117,101>>]},<<41,32,111,114,32,115,116,111,112,115,32,40>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,102,97,108,115,101>>]},<<41,32,99,97,108,108,32,116,105,109,101,32,116,114,97,99,105,110,103,32,102,111,114,32,97,108,108,32,116,121,112,101,115,32,111,102,32,102,117,110,99,116,105,111,110,32,99,97,108,108,115,46,32,70,111,114,32,101,118,101,114,121,32,102,117,110,99,116,105,111,110,44,32,97,32,99,111,117,110,116,101,114,32,105,115,32,105,110,99,114,101,109,101,110,116,101,100,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,46,32,84,105,109,101,32,115,112,101,110,116,32,105,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,97,99,99,117,109,117,108,97,116,101,100,32,105,110,32,116,119,111,32,111,116,104,101,114,32,99,111,117,110,116,101,114,115,44,32,115,101,99,111,110,100,115,32,97,110,100,32,109,105,99,114,111,115,101,99,111,110,100,115,46,32,84,104,101,32,99,111,117,110,116,101,114,115,32,97,114,101,32,115,116,111,114,101,100,32,102,111,114,32,101,97,99,104,32,99,97,108,108,32,116,114,97,99,101,100,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<73,102,32,99,97,108,108,32,116,105,109,101,32,116,114,97,99,105,110,103,32,105,115,32,115,116,97,114,116,101,100,32,119,104,105,108,101,32,97,108,114,101,97,100,121,32,114,117,110,110,105,110,103,44,32,116,104,101,32,99,111,117,110,116,32,97,110,100,32,116,105,109,101,32,114,101,115,116,97,114,116,32,102,114,111,109,32,122,101,114,111,46,32,84,111,32,112,97,117,115,101,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,44,32,117,115,101,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,112,97,117,115,101>>]},<<46,32,80,97,117,115,101,100,32,97,110,100,32,114,117,110,110,105,110,103,32,99,111,117,110,116,101,114,115,32,99,97,110,32,98,101,32,114,101,115,116,97,114,116,101,100,32,102,114,111,109,32,122,101,114,111,32,119,105,116,104,32>>,{code,[],[<<77,97,116,99,104,83,112,101,99,32,61,61,32,114,101,115,116,97,114,116>>]},<<46>>]},{p,[],[<<84,111,32,114,101,97,100,32,116,104,101,32,99,111,117,110,116,101,114,32,118,97,108,117,101,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]}]},{p,[],[<<84,104,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,97,110,100,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,97,114,101,32,109,117,116,117,97,108,108,121,32,101,120,99,108,117,115,105,118,101,44,32,97,110,100,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,40,105,102,32,110,111,32,111,112,116,105,111,110,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,41,46,32,84,104,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,108,108,95,99,111,117,110,116>>]},<<32,97,110,100,32>>,{code,[],[<<109,101,116,97>>]},<<32,112,101,114,102,111,114,109,32,97,32,107,105,110,100,32,111,102,32,108,111,99,97,108,32,116,114,97,99,105,110,103,44,32,97,110,100,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<46,32,65,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,103,108,111,98,97,108,108,121,32,111,114,32,108,111,99,97,108,108,121,32,116,114,97,99,101,100,46,32,73,102,32,103,108,111,98,97,108,32,116,114,97,99,105,110,103,32,105,115,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,97,32,115,101,116,32,111,102,32,102,117,110,99,116,105,111,110,115,44,32,116,104,101,110,32,108,111,99,97,108,44,32,109,101,116,97,44,32,99,97,108,108,32,116,105,109,101,44,32,97,110,100,32,99,97,108,108,32,99,111,117,110,116,32,116,114,97,99,105,110,103,32,102,111,114,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,101,116,32,111,102,32,108,111,99,97,108,32,102,117,110,99,116,105,111,110,115,32,105,115,32,100,105,115,97,98,108,101,100,44,32,97,110,100,32,99,111,110,118,101,114,115,101,108,121,46>>]},{p,[],[<<87,104,101,110,32,100,105,115,97,98,108,105,110,103,32,116,114,97,99,101,44,32,116,104,101,32,111,112,116,105,111,110,32,109,117,115,116,32,109,97,116,99,104,32,116,104,101,32,116,121,112,101,32,111,102,32,116,114,97,99,101,32,115,101,116,32,111,110,32,116,104,101,32,102,117,110,99,116,105,111,110,46,32,84,104,97,116,32,105,115,44,32,108,111,99,97,108,32,116,114,97,99,105,110,103,32,109,117,115,116,32,98,101,32,100,105,115,97,98,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<108,111,99,97,108>>]},<<32,97,110,100,32,103,108,111,98,97,108,32,116,114,97,99,105,110,103,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,40,111,114,32,110,111,32,111,112,116,105,111,110,41,44,32,97,110,100,32,115,111,32,111,110,46>>]},{p,[],[<<80,97,114,116,32,111,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,108,105,115,116,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,100,105,114,101,99,116,108,121,46,32,73,102,32,97,32,102,117,110,99,116,105,111,110,32,104,97,115,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,105,116,32,99,97,110,32,98,101,32,114,101,112,108,97,99,101,100,32,119,105,116,104,32,97,32,110,101,119,32,111,110,101,46,32,84,111,32,99,104,97,110,103,101,32,97,110,32,101,120,105,115,116,105,110,103,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,117,115,101,32,116,104,101,32,66,73,70,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,114,97,99,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,114,97,99,101,95,105,110,102,111,47,50>>]}]},<<32,116,111,32,114,101,116,114,105,101,118,101,32,116,104,101,32,101,120,105,115,116,105,110,103,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,102,117,110,99,116,105,111,110,115,32,109,97,116,99,104,105,110,103,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<77,70,65>>]},<<46,32,84,104,105,115,32,105,115,32,122,101,114,111,32,105,102,32,110,111,110,101,32,109,97,116,99,104,101,100,46>>]},{p,[],[<<70,97,105,108,115,32,98,121,32,114,97,105,115,105,110,103,32,97,110,32,101,114,114,111,114,32,101,120,99,101,112,116,105,111,110,32,119,105,116,104,32,97,110,32,101,114,114,111,114,32,114,101,97,115,111,110,32,111,102,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[<<73,102,32,97,110,32,97,114,103,117,109,101,110,116,32,105,115,32,105,110,118,97,108,105,100,46>>]}]},{dt,[],[{code,[],[<<115,121,115,116,101,109,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<73,102,32,97,32,109,97,116,99,104,32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,112,97,115,115,101,100,32,97,115,32,97,114,103,117,109,101,110,116,32,104,97,115,32,101,120,99,101,115,115,105,118,101,32,110,101,115,116,105,110,103,32,119,104,105,99,104,32,99,97,117,115,101,115,32,115,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,101,120,104,97,117,115,116,105,111,110,32,102,111,114,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,116,104,97,116,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,105,115,32,101,120,101,99,117,116,105,110,103,32,111,110,46,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,35,115,99,104,101,100,95,116,104,114,101,97,100,95,115,116,97,99,107,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[<<83,99,104,101,100,117,108,101,114,32,115,116,97,99,107,32,115,105,122,101>>]},<<32,99,97,110,32,98,101,32,99,111,110,102,105,103,117,114,101,100,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,55,48,50>>,signature => [{attribute,{2793,2},spec,{{erlang,trace_pattern,3},[{type,{2799,6},bounded_fun,[{type,{2799,6},'fun',[{type,{2799,6},product,[{var,{2799,7},'MFA'},{var,{2799,12},'MatchSpec'},{var,{2799,23},'FlagList'}]},{type,{2799,36},non_neg_integer,[]}]},[{type,{2800,7},constraint,[{atom,{2800,7},is_subtype},[{var,{2800,7},'MFA'},{user_type,{2800,14},trace_pattern_mfa,[]}]]},{type,{2801,7},constraint,[{atom,{2801,7},is_subtype},[{var,{2801,7},'MatchSpec'},{type,{2801,21},union,[{ann_type,{2801,21},[{var,{2801,21},'MatchSpecList'},{user_type,{2801,38},trace_match_spec,[]}]},{type,{2802,20},boolean,[]},{atom,{2803,20},restart},{atom,{2804,20},pause}]}]]},{type,{2805,7},constraint,[{atom,{2805,7},is_subtype},[{var,{2805,7},'FlagList'},{type,{2805,19},list,[{user_type,{2805,21},trace_pattern_flag,[]}]}]]}]]}]}}]}},{{function,trunc,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2112}],[<<116,114,117,110,99,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,117,110,99,97,116,101,115,32,116,104,101,32,100,101,99,105,109,97,108,115,32,111,102,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,53,46,55,41,46,10,53>>]}]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,45,53,46,55,41,46,10,45,53>>]}]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,53,41,46,10,53>>]}]},{pre,[],[{code,[],[<<62,32,116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41,46,10,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]}]},{p,[],[<<73,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<116,114,117,110,99,40,51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48,41>>]},<<32,101,118,97,108,117,97,116,101,115,32,116,111,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56>>]},<<46,32,84,104,101,32,114,101,97,115,111,110,32,102,111,114,32,116,104,105,115,32,105,115,32,116,104,97,116,32,116,104,101,32,110,117,109,98,101,114,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,57,46,48>>]},<<32,99,97,110,110,111,116,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,73,110,115,116,101,97,100,44,32,116,104,101,32,102,108,111,97,116,32,108,105,116,101,114,97,108,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32>>,{code,[],[<<51,54,48,50,56,55,57,55,48,49,56,57,54,51,57,54,56,46,48>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,99,108,111,115,101,115,116,32,110,117,109,98,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,101,120,97,99,116,108,121,32,97,115,32,97,32,102,108,111,97,116,32,118,97,108,117,101,46,32,83,101,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,102,108,111,97,116,95,114,101,112,114,101,115,101,110,116,97,116,105,111,110,95,112,114,111,98,108,101,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,70,108,111,97,116,105,110,103,32,80,111,105,110,116,32,78,117,109,98,101,114,115>>]},<<32,102,111,114,32,97,100,100,105,116,105,111,110,97,108,32,105,110,102,111,114,109,97,116,105,111,110,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,57,48,57>>,signature => [{attribute,{2112,2},spec,{{trunc,1},[{type,{2112,12},bounded_fun,[{type,{2112,12},'fun',[{type,{2112,12},product,[{var,{2112,13},'Number'}]},{type,{2112,24},integer,[]}]},[{type,{2113,7},constraint,[{atom,{2113,7},is_subtype},[{var,{2113,7},'Number'},{type,{2113,17},number,[]}]]}]]}]}}]}},{{function,tuple_size,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2119}],[<<116,117,112,108,101,95,115,105,122,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,110,32,105,110,116,101,103,101,114,32,116,104,97,116,32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,105,110,32>>,{code,[],[<<84,117,112,108,101>>]},<<44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,117,112,108,101,95,115,105,122,101,40,123,109,111,114,110,105,44,32,109,117,108,108,101,44,32,98,119,97,110,103,101,125,41,46,10,51>>]}]},{p,[],[<<65,108,108,111,119,101,100,32,105,110,32,103,117,97,114,100,32,116,101,115,116,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,57,52,48>>,signature => [{attribute,{2119,2},spec,{{tuple_size,1},[{type,{2119,17},bounded_fun,[{type,{2119,17},'fun',[{type,{2119,17},product,[{var,{2119,18},'Tuple'}]},{type,{2119,28},non_neg_integer,[]}]},[{type,{2120,7},constraint,[{atom,{2120,7},is_subtype},[{var,{2120,7},'Tuple'},{type,{2120,16},tuple,any}]]}]]}]}}]}},{{function,tuple_to_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2815}],[<<116,117,112,108,101,95,116,111,95,108,105,115,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,108,105,115,116,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32>>,{code,[],[<<84,117,112,108,101>>]},<<46,32>>,{code,[],[<<84,117,112,108,101>>]},<<32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,116,117,112,108,101,95,116,111,95,108,105,115,116,40,123,115,104,97,114,101,44,32,123,39,69,114,105,99,115,115,111,110,95,66,39,44,32,49,54,51,125,125,41,46,10,91,115,104,97,114,101,44,123,39,69,114,105,99,115,115,111,110,95,66,39,44,49,54,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,57,53,51>>,signature => [{attribute,{2815,2},spec,{{tuple_to_list,1},[{type,{2815,20},bounded_fun,[{type,{2815,20},'fun',[{type,{2815,20},product,[{var,{2815,21},'Tuple'}]},{type,{2815,31},list,[{type,{2815,32},term,[]}]}]},[{type,{2816,7},constraint,[{atom,{2816,7},is_subtype},[{var,{2816,7},'Tuple'},{type,{2816,16},tuple,any}]]}]]}]}}]}},{{function,unalias,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,831}],[<<117,110,97,108,105,97,115,47,49>>],#{<<101,110>> => [{p,[],[<<68,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32>>,{code,[],[<<65,108,105,97,115>>]},<<32,112,114,101,118,105,111,117,115,108,121,32,99,114,101,97,116,101,100,32,98,121,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,46,32,65,110,32,97,108,105,97,115,32,99,97,110,32,102,111,114,32,101,120,97,109,112,108,101,32,98,101,32,99,114,101,97,116,101,100,32,118,105,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,97,108,105,97,115,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,108,105,97,115,47,48>>]}]},<<44,32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,51>>]}]},<<46,32>>,{code,[],[<<117,110,97,108,105,97,115,47,49>>]},<<32,119,105,108,108,32,97,108,119,97,121,115,32,100,101,97,99,116,105,118,97,116,101,32,116,104,101,32,97,108,105,97,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,111,112,116,105,111,110,115,32,117,115,101,100,32,119,104,101,110,32,99,114,101,97,116,105,110,103,32,116,104,101,32,97,108,105,97,115,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,116,114,117,101,32,105,102,32>>,{code,[],[<<65,108,105,97,115>>]},<<32,119,97,115,32,97,32,99,117,114,114,101,110,116,108,121,32,97,99,116,105,118,101,32,97,108,105,97,115,32,102,111,114,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,101,115,59,32,111,116,104,101,114,119,105,115,101,44,32,102,97,108,115,101,46>>]},{p,[],[<<70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,112,114,111,99,101,115,115,32,97,108,105,97,115,101,115,32,115,101,101,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,112,114,111,99,101,115,115,45,97,108,105,97,115,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{i,[],[<<80,114,111,99,101,115,115,32,65,108,105,97,115,101,115>>]}]},<<32,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32>>,{i,[],[<<69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,57,54,54>>,signature => [{attribute,{831,2},spec,{{unalias,1},[{type,{831,14},bounded_fun,[{type,{831,14},'fun',[{type,{831,14},product,[{var,{831,15},'Alias'}]},{type,{831,25},boolean,[]}]},[{type,{832,7},constraint,[{atom,{832,7},is_subtype},[{var,{832,7},'Alias'},{type,{832,16},reference,[]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,unique_integer,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1592}],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,48>>],#{<<101,110>> => [{p,[],[<<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101>>]},<<46,32,84,104,101,32,115,97,109,101,32,97,115,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,93,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,50,57,57,50>>,signature => [{attribute,{1592,2},spec,{{erlang,unique_integer,0},[{type,{1592,28},'fun',[{type,{1592,28},product,[]},{type,{1592,34},integer,[]}]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,unique_integer,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1585}],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<71,101,110,101,114,97,116,101,115,32,97,110,100,32,114,101,116,117,114,110,115,32,97,110,32>>,{a,[{href,<<115,121,115,116,101,109,47,101,102,102,105,99,105,101,110,99,121,95,103,117,105,100,101,58,97,100,118,97,110,99,101,100,35,117,110,105,113,117,101,95,105,110,116,101,103,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<105,110,116,101,103,101,114,32,117,110,105,113,117,101,32,111,110,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101>>]},<<46,32,84,104,101,32,105,110,116,101,103,101,114,32,105,115,32,117,110,105,113,117,101,32,105,110,32,116,104,101,32,115,101,110,115,101,32,116,104,97,116,32,116,104,105,115,32,66,73,70,44,32,117,115,105,110,103,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,109,111,100,105,102,105,101,114,115,44,32,100,111,101,115,32,110,111,116,32,114,101,116,117,114,110,32,116,104,101,32,115,97,109,101,32,105,110,116,101,103,101,114,32,109,111,114,101,32,116,104,97,110,32,111,110,99,101,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,69,97,99,104,32,105,110,116,101,103,101,114,32,118,97,108,117,101,32,99,97,110,32,111,102,32,99,111,117,114,115,101,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,32,111,116,104,101,114,32,109,101,97,110,115,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,119,104,101,110,32>>,{code,[],[<<91,93>>]},<<32,105,115,32,112,97,115,115,101,100,32,97,115,32>>,{code,[],[<<77,111,100,105,102,105,101,114,76,105,115,116>>]},<<44,32,98,111,116,104,32,110,101,103,97,116,105,118,101,32,97,110,100,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,32,99,97,110,32,98,101,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,116,111,32,117,115,101,32,116,104,101,32,114,97,110,103,101,32,111,102,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,100,111,32,110,111,116,32,110,101,101,100,32,104,101,97,112,32,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,46,32,66,121,32,100,101,102,97,117,108,116,32,116,104,101,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,97,114,101,32,97,108,115,111,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,117,110,105,113,117,101,44,32,116,104,97,116,32,105,115,44,32,97,110,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,32,99,97,110,32,98,101,32,115,109,97,108,108,101,114,32,111,114,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,46>>]},{p,[],[{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,58>>]},{dl,[],[{dt,[],[<<112,111,115,105,116,105,118,101>>]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,111,110,108,121,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,115,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,98,121,32,112,97,115,115,105,110,103,32,116,104,101,32>>,{code,[],[<<112,111,115,105,116,105,118,101>>]},<<32,109,111,100,105,102,105,101,114,32,121,111,117,32,119,105,108,108,32,103,101,116,32,104,101,97,112,32,97,108,108,111,99,97,116,101,100,32,105,110,116,101,103,101,114,115,32,40,98,105,103,110,117,109,115,41,32,113,117,105,99,107,101,114,46>>]}]},{dt,[],[<<109,111,110,111,116,111,110,105,99>>]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,83,116,114,105,99,116,108,121,95,77,111,110,111,116,111,110,105,99,97,108,108,121,95,73,110,99,114,101,97,115,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103>>]},<<32,105,110,116,101,103,101,114,115,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,99,114,101,97,116,105,111,110,32,116,105,109,101,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,105,110,116,101,103,101,114,32,114,101,116,117,114,110,101,100,32,105,115,32,97,108,119,97,121,115,32,108,97,114,103,101,114,32,116,104,97,110,32,112,114,101,118,105,111,117,115,108,121,32,114,101,116,117,114,110,101,100,32,105,110,116,101,103,101,114,115,32,111,110,32,116,104,101,32,99,117,114,114,101,110,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46>>]},{p,[],[<<84,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,111,114,100,101,114,32,98,101,116,119,101,101,110,32,101,118,101,110,116,115,32,111,110,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46,32,84,104,97,116,32,105,115,44,32,105,102,32,98,111,116,104,32>>,{code,[],[<<88,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]},<<32,97,110,100,32>>,{code,[],[<<89,32,61,32,101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]},<<32,97,114,101,32,101,120,101,99,117,116,101,100,32,98,121,32,100,105,102,102,101,114,101,110,116,32,112,114,111,99,101,115,115,101,115,32,40,111,114,32,116,104,101,32,115,97,109,101,32,112,114,111,99,101,115,115,41,32,111,110,32,116,104,101,32,115,97,109,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,97,110,100,32>>,{code,[],[<<88,32,60,32,89>>]},<<44,32,119,101,32,107,110,111,119,32,116,104,97,116,32>>,{code,[],[<<88>>]},<<32,119,97,115,32,99,114,101,97,116,101,100,32,98,101,102,111,114,101,32>>,{code,[],[<<89>>]},<<46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<83,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,32,97,114,101,32,105,110,104,101,114,101,110,116,108,121,32,113,117,105,116,101,32,101,120,112,101,110,115,105,118,101,32,116,111,32,103,101,110,101,114,97,116,101,32,97,110,100,32,115,99,97,108,101,115,32,112,111,111,114,108,121,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,118,97,108,117,101,115,32,110,101,101,100,32,116,111,32,98,101,32,115,121,110,99,104,114,111,110,105,122,101,100,32,98,101,116,119,101,101,110,32,67,80,85,32,99,111,114,101,115,46,32,84,104,97,116,32,105,115,44,32,100,111,32,110,111,116,32,112,97,115,115,32,116,104,101,32>>,{code,[],[<<109,111,110,111,116,111,110,105,99>>]},<<32,109,111,100,105,102,105,101,114,32,117,110,108,101,115,115,32,121,111,117,32,114,101,97,108,108,121,32,110,101,101,100,32,115,116,114,105,99,116,108,121,32,109,111,110,111,116,111,110,105,99,97,108,108,121,32,105,110,99,114,101,97,115,105,110,103,32,118,97,108,117,101,115,46>>]}]}]}]},{p,[],[<<65,108,108,32,118,97,108,105,100,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,46,32,82,101,112,101,97,116,101,100,32,40,118,97,108,105,100,41,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,32,105,110,32,116,104,101,32>>,{code,[],[<<77,111,100,105,102,105,101,114,76,105,115,116>>]},<<32,97,114,101,32,105,103,110,111,114,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,115,101,116,32,111,102,32,105,110,116,101,103,101,114,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<101,114,108,97,110,103,58,117,110,105,113,117,101,95,105,110,116,101,103,101,114,47,49>>]},<<32,117,115,105,110,103,32,100,105,102,102,101,114,101,110,116,32,115,101,116,115,32,111,102,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<115,32>>,{em,[],[<<119,105,108,108,32,111,118,101,114,108,97,112>>]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,98,121,32,99,97,108,108,105,110,103,32>>,{code,[],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,109,111,110,111,116,111,110,105,99,93,41>>]},<<44,32,97,110,100,32>>,{code,[],[<<117,110,105,113,117,101,95,105,110,116,101,103,101,114,40,91,112,111,115,105,116,105,118,101,44,32,109,111,110,111,116,111,110,105,99,93,41>>]},<<32,114,101,112,101,97,116,101,100,108,121,44,32,121,111,117,32,119,105,108,108,32,101,118,101,110,116,117,97,108,108,121,32,115,101,101,32,115,111,109,101,32,105,110,116,101,103,101,114,115,32,116,104,97,116,32,97,114,101,32,114,101,116,117,114,110,101,100,32,98,121,32,98,111,116,104,32,99,97,108,108,115,46>>]}]},{p,[],[<<70,97,105,108,117,114,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<105,102,32>>,{code,[],[<<77,111,100,105,102,105,101,114,76,105,115,116>>]},<<32,105,115,32,110,111,116,32,97,32,112,114,111,112,101,114,32,108,105,115,116,46>>]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[<<105,102,32>>,{code,[],[<<77,111,100,105,102,105,101,114>>]},<<32,105,115,32,110,111,116,32,97,32,118,97,108,105,100,32,109,111,100,105,102,105,101,114,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,48,48,53>>,signature => [{attribute,{1585,2},spec,{{erlang,unique_integer,1},[{type,{1585,28},bounded_fun,[{type,{1585,28},'fun',[{type,{1585,28},product,[{var,{1585,29},'ModifierList'}]},{type,{1585,46},integer,[]}]},[{type,{1586,7},constraint,[{atom,{1586,7},is_subtype},[{var,{1586,7},'ModifierList'},{type,{1586,23},list,[{var,{1586,24},'Modifier'}]}]]},{type,{1587,7},constraint,[{atom,{1587,7},is_subtype},[{var,{1587,7},'Modifier'},{type,{1587,19},union,[{atom,{1587,19},positive},{atom,{1587,30},monotonic}]}]]}]]}]}}],since => <<79,84,80,32,49,56,46,48>>}},{{function,universaltime,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2125}],[<<117,110,105,118,101,114,115,97,108,116,105,109,101,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,99,117,114,114,101,110,116,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,97,99,99,111,114,100,105,110,103,32,116,111,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,105,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125>>]},<<32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32>>,{code,[],[<<101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<101,114,108,97,110,103,58,108,111,99,97,108,116,105,109,101,40,41>>]},<<46,32,84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,111,115,45,115,121,115,116,101,109,45,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<79,83,32,83,121,115,116,101,109,32,84,105,109,101>>]},<<46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,40,41,46,10,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,48,56,55>>,signature => [{attribute,{2125,2},spec,{{erlang,universaltime,0},[{type,{2125,27},bounded_fun,[{type,{2125,27},'fun',[{type,{2125,27},product,[]},{var,{2125,33},'DateTime'}]},[{type,{2126,7},constraint,[{atom,{2126,7},is_subtype},[{var,{2126,7},'DateTime'},{remote_type,{2126,19},[{atom,{2126,19},calendar},{atom,{2126,28},datetime},[]]}]]}]]}]}}]}},{{function,universaltime_to_localtime,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2942}],[<<117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,111,110,118,101,114,116,115,32,85,110,105,118,101,114,115,97,108,32,84,105,109,101,32,67,111,111,114,100,105,110,97,116,101,100,32,40,85,84,67,41,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,116,111,32,108,111,99,97,108,32,100,97,116,101,32,97,110,100,32,116,105,109,101,32,105,110,32,116,104,101,32,102,111,114,109,32>>,{code,[],[<<123,123,89,101,97,114,44,32,77,111,110,116,104,44,32,68,97,121,125,44,32,123,72,111,117,114,44,32,77,105,110,117,116,101,44,32,83,101,99,111,110,100,125,125>>]},<<32,105,102,32,115,117,112,112,111,114,116,101,100,32,98,121,32,116,104,101,32,117,110,100,101,114,108,121,105,110,103,32,79,83,46,32,79,116,104,101,114,119,105,115,101,32,110,111,32,99,111,110,118,101,114,115,105,111,110,32,105,115,32,100,111,110,101,44,32,97,110,100,32>>,{code,[],[<<85,110,105,118,101,114,115,97,108,116,105,109,101>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,101,114,108,97,110,103,58,117,110,105,118,101,114,115,97,108,116,105,109,101,95,116,111,95,108,111,99,97,108,116,105,109,101,40,123,123,49,57,57,54,44,49,49,44,54,125,44,123,49,52,44,49,56,44,52,51,125,125,41,46,10,123,123,49,57,57,54,44,49,49,44,55,125,44,123,49,53,44,49,56,44,52,51,125,125>>]}]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<85,110,105,118,101,114,115,97,108,116,105,109,101>>]},<<32,100,101,110,111,116,101,115,32,97,110,32,105,110,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,49,48,54>>,signature => [{attribute,{2942,2},spec,{{erlang,universaltime_to_localtime,1},[{type,{2942,40},bounded_fun,[{type,{2942,40},'fun',[{type,{2942,40},product,[{var,{2942,41},'Universaltime'}]},{var,{2942,60},'Localtime'}]},[{type,{2943,7},constraint,[{atom,{2943,7},is_subtype},[{var,{2943,7},'Localtime'},{remote_type,{2943,20},[{atom,{2943,20},calendar},{atom,{2943,29},datetime},[]]}]]},{type,{2944,7},constraint,[{atom,{2944,7},is_subtype},[{var,{2944,7},'Universaltime'},{remote_type,{2944,24},[{atom,{2944,24},calendar},{atom,{2944,33},datetime},[]]}]]}]]}]}}]}},{{function,unlink,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2137}],[<<117,110,108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,109,111,118,101,115,32,97,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,105,110,103,32,112,114,111,99,101,115,115,32,97,110,100,32,97,110,111,116,104,101,114,32,112,114,111,99,101,115,115,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,100,32,98,121,32>>,{code,[],[<<73,100>>]},<<46,32,87,101,32,119,105,108,108,32,102,114,111,109,32,104,101,114,101,32,111,110,32,99,97,108,108,32,116,104,101,32,105,100,101,110,116,105,102,105,101,100,32,112,114,111,99,101,115,115,32,111,114,32,112,111,114,116,32,117,110,108,105,110,107,101,101,46>>]},{p,[],[<<65,32,108,105,110,107,32,99,97,110,32,98,101,32,115,101,116,32,117,112,32,117,115,105,110,103,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,110,107,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,110,107,47,49>>]}]},<<32,66,73,70,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,111,110,32,108,105,110,107,115,32,97,110,100,32,101,120,105,116,32,115,105,103,110,97,108,115,32,100,117,101,32,116,111,32,108,105,110,107,115,44,32,115,101,101,32,116,104,101,32>>,{i,[],[<<80,114,111,99,101,115,115,101,115>>]},<<32,99,104,97,112,116,101,114,32,105,110,32,116,104,101,32>>,{i,[],[<<69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108>>]},<<58>>]},{ul,[],[{li,[],[{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,108,105,110,107,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<76,105,110,107,115>>]}]},{li,[],[{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,115,101,110,100,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<83,101,110,100,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115>>]}]},{li,[],[{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,114,101,99,101,105,118,105,110,103,95,101,120,105,116,95,115,105,103,110,97,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<82,101,99,101,105,118,105,110,103,32,69,120,105,116,32,83,105,103,110,97,108,115>>]}]}]},{p,[],[<<79,110,99,101,32>>,{code,[],[<<117,110,108,105,110,107,40,73,100,41>>]},<<32,104,97,115,32,114,101,116,117,114,110,101,100,44,32,105,116,32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,104,97,116,32,116,104,101,32,108,105,110,107,32,98,101,116,119,101,101,110,32,116,104,101,32,99,97,108,108,101,114,32,97,110,100,32,116,104,101,32,117,110,108,105,110,107,101,101,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,111,110,32,116,104,101,32,99,97,108,108,101,114,32,105,110,32,116,104,101,32,102,117,116,117,114,101,32,40,117,110,108,101,115,115,32,116,104,101,32,108,105,110,107,32,105,115,32,115,101,116,117,112,32,97,103,97,105,110,41,46,32,78,111,116,101,32,116,104,97,116,32,105,102,32,116,104,101,32,99,97,108,108,101,114,32,105,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,116,114,97,112,95,101,120,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,114,97,112,112,105,110,103,32,101,120,105,116,115>>]},<<44,32,97,110,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,73,100,44,32,69,120,105,116,82,101,97,115,111,110,125>>]},<<32,109,101,115,115,97,103,101,32,100,117,101,32,116,111,32,116,104,101,32,108,105,110,107,32,109,97,121,32,104,97,118,101,32,98,101,101,110,32,112,108,97,99,101,100,32,105,110,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,111,102,32,116,104,101,32,99,97,108,108,101,114,32,98,101,102,111,114,101,32,116,104,101,32>>,{code,[],[<<117,110,108,105,110,107,40,73,100,41>>]},<<32,99,97,108,108,32,99,111,109,112,108,101,116,101,100,46,32,65,108,115,111,32,110,111,116,101,32,116,104,97,116,32,116,104,101,32>>,{code,[],[<<123,39,69,88,73,84,39,44,32,73,100,44,32,69,120,105,116,82,101,97,115,111,110,125>>]},<<32,109,101,115,115,97,103,101,32,109,97,121,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,108,105,110,107,44,32,98,117,116,32,109,97,121,32,97,108,115,111,32,98,101,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,117,110,108,105,107,101,101,32,115,101,110,100,105,110,103,32,116,104,101,32,99,97,108,108,101,114,32,97,110,32,101,120,105,116,32,115,105,103,110,97,108,32,98,121,32,99,97,108,108,105,110,103,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,101,120,105,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,120,105,116,47,50>>]}]},<<32,66,73,70,46,32,84,104,101,114,101,102,111,114,101,44,32,105,116,32,109,97,121,32,111,114,32,109,97,121,32,110,111,116,32,98,101,32,97,112,112,114,111,112,114,105,97,116,101,32,116,111,32,99,108,101,97,110,32,117,112,32,116,104,101,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,97,102,116,101,114,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<117,110,108,105,110,107,40,73,100,41>>]},<<32,97,115,32,102,111,108,108,111,119,115,44,32,119,104,101,110,32,116,114,97,112,112,105,110,103,32,101,120,105,116,115,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<117,110,108,105,110,107,40,73,100,41,44,10,114,101,99,101,105,118,101,10,32,32,32,32,123,39,69,88,73,84,39,44,32,73,100,44,32,95,125,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,97,102,116,101,114,32,48,32,45,62,10,32,32,32,32,32,32,32,32,116,114,117,101,10,101,110,100>>]}]},{p,[],[<<84,104,101,32,108,105,110,107,32,114,101,109,111,118,97,108,32,105,115,32,112,101,114,102,111,114,109,101,100,32,97,115,121,110,99,104,114,111,110,111,117,115,108,121,46,32,73,102,32,115,117,99,104,32,97,32,108,105,110,107,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,44,32,110,111,116,104,105,110,103,32,105,115,32,100,111,110,101,46,32,65,32,100,101,116,97,105,108,101,100,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,100,105,115,116,95,112,114,111,116,111,99,111,108,35,108,105,110,107,95,112,114,111,116,111,99,111,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<108,105,110,107,32,112,114,111,116,111,99,111,108>>]},<<32,99,97,110,32,98,101,32,102,111,117,110,100,32,105,110,32,116,104,101,32>>,{i,[],[<<68,105,115,116,114,105,98,117,116,105,111,110,32,80,114,111,116,111,99,111,108>>]},<<32,99,104,97,112,116,101,114,32,111,102,32,116,104,101,32>>,{i,[],[<<69,82,84,83,32,85,115,101,114,39,115,32,71,117,105,100,101>>]},<<46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<73,100>>]},<<32,100,111,101,115,32,110,111,116,32,105,100,101,110,116,105,102,121,32,97,32,112,114,111,99,101,115,115,32,111,114,32,97,32,110,111,100,101,32,108,111,99,97,108,32,112,111,114,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,49,50,53>>,signature => [{attribute,{2137,2},spec,{{unlink,1},[{type,{2137,13},bounded_fun,[{type,{2137,13},'fun',[{type,{2137,13},product,[{var,{2137,14},'Id'}]},{atom,{2137,21},true}]},[{type,{2138,7},constraint,[{atom,{2138,7},is_subtype},[{var,{2138,7},'Id'},{type,{2138,13},union,[{type,{2138,13},pid,[]},{type,{2138,21},port,[]}]}]]}]]}]}}]}},{{function,unregister,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2143}],[<<117,110,114,101,103,105,115,116,101,114,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,109,111,118,101,115,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,103,105,115,116,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,103,105,115,116,101,114,101,100,32,110,97,109,101>>]}]},<<32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,97,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,97,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,102,114,111,109,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<110,97,109,101,32,114,101,103,105,115,116,114,121>>]}]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,117,110,114,101,103,105,115,116,101,114,40,100,98,41,46,10,116,114,117,101>>]}]},{p,[],[<<75,101,101,112,32,105,110,32,109,105,110,100,32,116,104,97,116,32,121,111,117,32,99,97,110,32,115,116,105,108,108,32,114,101,99,101,105,118,101,32,115,105,103,110,97,108,115,32,97,115,115,111,99,105,97,116,101,100,32,119,105,116,104,32,116,104,101,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,32,97,102,116,101,114,32,105,116,32,104,97,115,32,98,101,101,110,32,117,110,114,101,103,105,115,116,101,114,101,100,32,97,115,32,116,104,101,32,115,101,110,100,101,114,32,109,97,121,32,104,97,118,101,32,108,111,111,107,101,100,32,117,112,32,116,104,101,32,110,97,109,101,32,98,101,102,111,114,101,32,115,101,110,100,105,110,103,32,116,111,32,105,116,46>>]},{p,[],[<<85,115,101,114,115,32,97,114,101,32,97,100,118,105,115,101,100,32,110,111,116,32,116,111,32,117,110,114,101,103,105,115,116,101,114,32,115,121,115,116,101,109,32,112,114,111,99,101,115,115,101,115,46>>]},{p,[],[<<70,97,105,108,117,114,101,58,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,102,32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,105,115,32,110,111,116,32,97,32,114,101,103,105,115,116,101,114,101,100,32,110,97,109,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,49,57,55>>,signature => [{attribute,{2143,2},spec,{{unregister,1},[{type,{2143,17},bounded_fun,[{type,{2143,17},'fun',[{type,{2143,17},product,[{var,{2143,18},'RegName'}]},{atom,{2143,30},true}]},[{type,{2144,7},constraint,[{atom,{2144,7},is_subtype},[{var,{2144,7},'RegName'},{type,{2144,18},atom,[]}]]}]]}]}}]}},{{function,whereis,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2149}],[<<119,104,101,114,101,105,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114,32,111,114,32,112,111,114,116,32,105,100,101,110,116,105,102,105,101,114,32,119,105,116,104,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,114,101,103,105,115,116,101,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,103,105,115,116,101,114,101,100,32,110,97,109,101>>]}]},<<32>>,{code,[],[<<82,101,103,78,97,109,101>>]},<<32,102,114,111,109,32,116,104,101,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115,35,114,117,110,116,105,109,101,45,115,101,114,118,105,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<110,97,109,101,32,114,101,103,105,115,116,114,121>>]}]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<117,110,100,101,102,105,110,101,100>>]},<<32,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,110,111,116,32,114,101,103,105,115,116,101,114,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<62,32,119,104,101,114,101,105,115,40,100,98,41,46,10,60,48,46,52,51,46,48,62>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,50,49,56>>,signature => [{attribute,{2149,2},spec,{{whereis,1},[{type,{2149,14},bounded_fun,[{type,{2149,14},'fun',[{type,{2149,14},product,[{var,{2149,15},'RegName'}]},{type,{2149,27},union,[{type,{2149,27},pid,[]},{type,{2149,35},port,[]},{atom,{2149,44},undefined}]}]},[{type,{2150,7},constraint,[{atom,{2150,7},is_subtype},[{var,{2150,7},'RegName'},{type,{2150,18},atom,[]}]]}]]}]}}]}},{{function,yield,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3438}],[<<121,105,101,108,100,47,48>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,103,105,118,101,32,111,116,104,101,114,32,112,114,111,99,101,115,115,101,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,111,114,32,104,105,103,104,101,114,32,112,114,105,111,114,105,116,121,32,40,105,102,32,97,110,121,41,32,97,32,99,104,97,110,99,101,32,116,111,32,101,120,101,99,117,116,101,32,98,101,102,111,114,101,32,114,101,116,117,114,110,105,110,103,46,32,84,104,101,114,101,32,105,115,32,110,111,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,110,121,32,111,116,104,101,114,32,112,114,111,99,101,115,115,32,114,117,110,115,32,98,101,116,119,101,101,110,32,116,104,101,32,105,110,118,111,99,97,116,105,111,110,32,97,110,100,32,114,101,116,117,114,110,32,111,102,32>>,{code,[],[<<101,114,108,97,110,103,58,121,105,101,108,100,47,48>>]},<<46>>]},{p,[],[<<83,101,101,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,102,111,114,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,114,101,99,101,105,118,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[{code,[],[<<114,101,99,101,105,118,101,45,97,102,116,101,114>>]},<<32,101,120,112,114,101,115,115,105,111,110,115>>]},<<32,102,111,114,32,104,111,119,32,116,111,32,109,97,107,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,115,108,101,101,112,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,110,117,109,98,101,114,32,111,102,32,109,105,108,108,105,115,101,99,111,110,100,115,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,101,114,101,32,105,115,32,115,101,108,100,111,109,32,111,114,32,110,101,118,101,114,32,97,110,121,32,110,101,101,100,32,116,111,32,117,115,101,32,116,104,105,115,32,66,73,70,46,32,85,115,105,110,103,32,116,104,105,115,32,66,73,70,32,119,105,116,104,111,117,116,32,97,32,116,104,111,114,111,117,103,104,32,103,114,97,115,112,32,111,102,32,104,111,119,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,119,111,114,107,115,32,99,97,110,32,99,97,117,115,101,32,112,101,114,102,111,114,109,97,110,99,101,32,100,101,103,114,97,100,97,116,105,111,110,46,32,84,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,112,117,116,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,32,108,97,115,116,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,99,104,101,100,117,108,101,114,39,115,32,113,117,101,117,101,32,102,111,114,32,112,114,111,99,101,115,115,101,115,32,111,102,32,116,104,101,32,115,97,109,101,32,112,114,105,111,114,105,116,121,32,97,115,32,116,104,101,32,99,117,114,114,101,110,116,32,112,114,111,99,101,115,115,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,101,114,116,115,47,100,111,99,47,115,114,99,47,101,114,108,97,110,103,46,120,109,108,35,76,49,51,50,51,53>>,signature => [{attribute,{3438,2},spec,{{erlang,yield,0},[{type,{3438,19},'fun',[{type,{3438,19},product,[]},{atom,{3438,25},true}]}]}}]}},{{type,any,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,80}],[<<45,116,121,112,101,32,97,110,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,108,108,32,112,111,115,115,105,98,108,101,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,83,121,110,111,110,121,109,32,102,111,114,32>>,{code,[],[<<116,101,114,109,40,41>>]},<<46>>]}]},#{signature => [{attribute,{80,2},type,{any,{type,{80,16},any,[]},[]}}]}},{{type,arity,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,81}],[<<45,116,121,112,101,32,97,114,105,116,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,97,114,105,116,121,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,111,114,32,116,121,112,101,46>>]}]},#{signature => [{attribute,{81,2},type,{arity,{type,{81,18},arity,[]},[]}}]}},{{type,atom,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,82}],[<<45,116,121,112,101,32,97,116,111,109,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,97,116,111,109>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<97,116,111,109>>]},<<46>>]}]},#{signature => [{attribute,{82,2},type,{atom,{type,{82,17},atom,[]},[]}}]}},{{type,binary,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,83}],[<<45,116,121,112,101,32,98,105,110,97,114,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,98,105,116,45,115,116,114,105,110,103,115,45,97,110,100,45,98,105,110,97,114,105,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<98,105,110,97,114,121>>]},<<44,32,116,104,97,116,32,105,115,44,32,97,32,98,105,116,115,116,114,105,110,103,32,119,105,116,104,32,97,32,115,105,122,101,32,100,105,118,105,115,105,98,108,101,32,98,121,32,56,46>>]}]},#{signature => [{attribute,{83,2},type,{binary,{type,{83,19},binary,[{integer,83,0},{integer,{83,25},8}]},[]}}]}},{{type,bitstring,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,84}],[<<45,116,121,112,101,32,98,105,116,115,116,114,105,110,103,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,98,105,116,45,115,116,114,105,110,103,115,45,97,110,100,45,98,105,110,97,114,105,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<98,105,116,115,116,114,105,110,103>>]},<<46>>]}]},#{signature => [{attribute,{84,2},type,{bitstring,{type,{84,22},binary,[{integer,84,0},{integer,{84,28},1}]},[]}}]}},{{type,boolean,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,86}],[<<45,116,121,112,101,32,98,111,111,108,101,97,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,98,111,111,108,101,97,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<98,111,111,108,101,97,110>>]},<<32,118,97,108,117,101,46>>]}]},#{signature => [{attribute,{86,2},type,{boolean,{type,{86,20},union,[{atom,{86,20},true},{atom,{86,27},false}]},[]}}]}},{{type,byte,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,87}],[<<45,116,121,112,101,32,98,121,116,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,98,121,116,101,32,111,102,32,100,97,116,97,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{signature => [{attribute,{87,2},type,{byte,{type,{87,17},range,[{integer,{87,17},0},{integer,{87,20},255}]},[]}}]}},{{type,char,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,88}],[<<45,116,121,112,101,32,99,104,97,114,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,32,111,114,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,105,99,111,100,101>>]},<<32,99,111,100,101,112,111,105,110,116,32,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,105,110,116,101,103,101,114,46>>]}]},#{signature => [{attribute,{88,2},type,{char,{type,{88,17},range,[{integer,{88,17},0},{integer,{88,20},1114111}]},[]}}]}},{{type,float,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,89}],[<<45,116,121,112,101,32,102,108,111,97,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,110,117,109,98,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<102,108,111,97,116>>]},<<46>>]}]},#{signature => [{attribute,{89,2},type,{float,{type,{89,18},float,[]},[]}}]}},{{type,function,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,90}],[<<45,116,121,112,101,32,102,117,110,99,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,102,117,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<102,117,110>>]},<<46>>]}]},#{signature => [{attribute,{90,2},type,{function,{type,{90,21},'fun',[]},[]}}]}},{{type,identifier,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,91}],[<<45,116,121,112,101,32,105,100,101,110,116,105,102,105,101,114,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,117,110,105,113,117,101,32,105,100,101,110,116,105,102,105,101,114,32,102,111,114,32,115,111,109,101,32,101,110,116,105,116,121,44,32,102,111,114,32,101,120,97,109,112,108,101,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,114,111,99,101,115,115,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,111,99,101,115,115>>]},<<44,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,112,111,114,116,115,35,112,111,114,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,111,114,116>>]},<<32,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<109,111,110,105,116,111,114>>]},<<46>>]}]},#{signature => [{attribute,{91,2},type,{identifier,{type,{91,23},union,[{type,{91,23},pid,[]},{type,{91,31},port,[]},{type,{91,40},reference,[]}]},[]}}]}},{{type,integer,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,92}],[<<45,116,121,112,101,32,105,110,116,101,103,101,114,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,110,117,109,98,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<105,110,116,101,103,101,114>>]},<<46>>]}]},#{signature => [{attribute,{92,2},type,{integer,{type,{92,20},integer,[]},[]}}]}},{{type,iodata,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,93}],[<<45,116,121,112,101,32,105,111,100,97,116,97,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,98,121,116,101,115,32,97,110,100,47,111,114,32,105,111,100,97,116,97,46,32,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,114,101,112,114,101,115,101,110,116,32,100,97,116,97,32,116,104,97,116,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,111,117,116,112,117,116,32,117,115,105,110,103,32,97,110,121,32,73,47,79,32,109,111,100,117,108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,58,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<102,105,108,101,58,119,114,105,116,101,47,50>>]},<<32,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,103,101,110,95,116,99,112,35,115,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<103,101,110,95,116,99,112,58,115,101,110,100,47,50>>]},<<46>>]},{p,[],[<<84,111,32,99,111,110,118,101,114,116,32,97,110,32,105,111,100,97,116,97,40,41,32,116,101,114,109,32,116,111,32,98,105,110,97,114,121,40,41,32,121,111,117,32,99,97,110,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,50>>]},<<46,32,84,111,32,116,114,97,110,115,99,111,100,101,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,114,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<115,116,114,105,110,103,40,41>>]},<<32,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,35,99,104,97,114,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<117,110,105,99,111,100,101,58,99,104,97,114,100,97,116,97,40,41>>]},<<32,116,111,32,105,111,100,97,116,97,40,41,32,121,111,117,32,99,97,110,32,117,115,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,35,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,49>>]},<<46>>]}]},#{signature => [{attribute,{93,2},type,{iodata,{type,{93,19},union,[{type,{93,19},iolist,[]},{type,{93,30},binary,[]}]},[]}}]}},{{type,iolist,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,94}],[<<45,116,121,112,101,32,105,111,108,105,115,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,98,121,116,101,115,32,97,110,100,47,111,114,32,105,111,100,97,116,97,46,32,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,114,101,112,114,101,115,101,110,116,32,100,97,116,97,32,116,104,97,116,32,105,115,32,109,101,97,110,116,32,116,111,32,98,101,32,111,117,116,112,117,116,32,117,115,105,110,103,32,97,110,121,32,73,47,79,32,109,111,100,117,108,101,46,32,70,111,114,32,101,120,97,109,112,108,101,58,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<102,105,108,101,58,119,114,105,116,101,47,50>>]},<<32,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,103,101,110,95,116,99,112,35,115,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<103,101,110,95,116,99,112,58,115,101,110,100,47,50>>]},<<46>>]},{p,[],[<<73,110,32,109,111,115,116,32,117,115,101,32,99,97,115,101,115,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<105,111,100,97,116,97,40,41>>]},<<32,105,110,115,116,101,97,100,32,111,102,32,116,104,105,115,32,116,121,112,101,46>>]}]},#{signature => [{attribute,{94,2},type,{iolist,{type,{94,19},maybe_improper_list,[{type,{94,39},union,[{type,{94,39},byte,[]},{type,{94,48},binary,[]},{type,{94,59},iolist,[]}]},{type,{94,69},union,[{type,{94,69},binary,[]},{type,{94,80},nil,[]}]}]},[]}}]}},{{type,list,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,95}],[<<45,116,121,112,101,32,108,105,115,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<108,105,115,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,101,114,109,115,32,111,102,32,97,110,121,32,116,121,112,101,46>>]}]},#{signature => [{attribute,{95,2},type,{list,{type,{95,17},list,[]},[]}}]}},{{type,list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,96}],[<<45,116,121,112,101,32,108,105,115,116,40,65,114,103,49,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<108,105,115,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,101,114,109,115,32,111,102,32,116,104,101,32,116,121,112,101,32>>,{code,[],[<<67,111,110,116,101,110,116,84,121,112,101>>]},<<46>>]}]},#{signature => [{attribute,{96,2},type,{list,{type,{96,28},list,[{var,{96,33},'ContentType'}]},[{var,{96,12},'ContentType'}]}}]}},{{type,map,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,97}],[<<45,116,121,112,101,32,109,97,112,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,109,97,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<109,97,112>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,107,101,121,32,97,110,100,32,118,97,108,117,101,32,97,115,115,111,99,105,97,116,105,111,110,115,46>>]}]},#{signature => [{attribute,{97,2},type,{map,{type,{97,16},map,[{type,{97,25},map_field_assoc,[{type,{97,19},any,[]},{type,{97,28},any,[]}]}]},[]}}]}},{{type,maybe_improper_list,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,98}],[<<45,116,121,112,101,32,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<108,105,115,116>>]},<<32,116,104,97,116,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,101,110,100,32,119,105,116,104,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,110,105,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<91,93>>]},<<44,32,97,110,100,32,119,104,101,114,101,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,32,99,97,110,32,98,101,32,111,102,32,97,110,121,32,116,121,112,101,46>>]}]},#{signature => [{attribute,{98,2},type,{maybe_improper_list,{type,{98,32},maybe_improper_list,[{type,{98,52},any,[]},{type,{98,59},any,[]}]},[]}}]}},{{type,maybe_improper_list,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,99}],[<<45,116,121,112,101,32,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,65,114,103,49,44,65,114,103,50,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<108,105,115,116>>]},<<44,32,116,104,97,116,32,105,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,101,110,100,32,119,105,116,104,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,110,105,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<91,93>>]},<<44,32,97,110,100,32,119,104,101,114,101,32,116,104,101,32,108,105,115,116,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,102,32,116,104,101,32,116,121,112,101,32>>,{code,[],[<<67,111,110,116,101,110,116,84,121,112,101>>]},<<46>>]}]},#{signature => [{attribute,{99,2},type,{maybe_improper_list,{type,{99,60},maybe_improper_list,[{var,{99,80},'ContentType'},{var,{99,93},'TerminationType'}]},[{var,{99,27},'ContentType'},{var,{99,40},'TerminationType'}]}}]}},{{type,mfa,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,100}],[<<45,116,121,112,101,32,109,102,97,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,116,104,114,101,101,45,116,117,112,108,101,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32>>,{code,[],[<<77,111,100,117,108,101,58,70,117,110,99,116,105,111,110,47,65,114,105,116,121>>]},<<32,102,117,110,99,116,105,111,110,32,115,105,103,110,97,116,117,114,101,46>>]}]},#{signature => [{attribute,{100,2},type,{mfa,{type,{100,16},tuple,[{type,{100,17},module,[]},{type,{100,26},atom,[]},{type,{100,33},arity,[]}]},[]}}]}},{{type,module,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,101}],[<<45,116,121,112,101,32,109,111,100,117,108,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32,109,111,100,117,108,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,97,116,111,109,46>>]}]},#{signature => [{attribute,{101,2},type,{module,{type,{101,19},atom,[]},[]}}]}},{{type,neg_integer,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,102}],[<<45,116,121,112,101,32,110,101,103,95,105,110,116,101,103,101,114,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,46>>]}]},#{signature => [{attribute,{102,2},type,{neg_integer,{type,{102,24},neg_integer,[]},[]}}]}},{{type,nil,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,103}],[<<45,116,121,112,101,32,110,105,108,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,101,109,112,116,121,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<108,105,115,116,40,41>>]},<<46>>]}]},#{signature => [{attribute,{103,2},type,{nil,{type,{103,16},nil,[]},[]}}]}},{{type,no_return,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,104}],[<<45,116,121,112,101,32,110,111,95,114,101,116,117,114,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,116,121,112,101,32,117,115,101,100,32,116,111,32,115,104,111,119,32,116,104,97,116,32,97,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32>>,{em,[],[<<110,101,118,101,114>>]},<<32,114,101,116,117,114,110,32,97,32,118,97,108,117,101,44,32,116,104,97,116,32,105,115,32,105,116,32,119,105,108,108,32>>,{em,[],[<<97,108,119,97,121,115>>]},<<32,116,104,114,111,119,32,97,110,32,101,120,99,101,112,116,105,111,110,46>>]}]},#{signature => [{attribute,{104,2},type,{no_return,{type,{104,22},none,[]},[]}}]}},{{type,node,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,105}],[<<45,116,121,112,101,32,110,111,100,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,105,115,116,114,105,98,117,116,101,100,35,110,111,100,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,111,100,101>>]},<<32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,110,32,97,116,111,109,46>>]}]},#{signature => [{attribute,{105,2},type,{node,{type,{105,17},atom,[]},[]}}]}},{{type,non_neg_integer,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,106}],[<<45,116,121,112,101,32,110,111,110,95,110,101,103,95,105,110,116,101,103,101,114,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,110,111,110,45,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,44,32,116,104,97,116,32,105,115,32,97,110,121,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,111,114,32,48,46>>]}]},#{signature => [{attribute,{106,2},type,{non_neg_integer,{type,{106,28},non_neg_integer,[]},[]}}]}},{{type,none,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,107}],[<<45,116,121,112,101,32,110,111,110,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<84,104,105,115,32,116,121,112,101,32,105,115,32,117,115,101,100,32,116,111,32,115,104,111,119,32,116,104,97,116,32,97,32,102,117,110,99,116,105,111,110,32,119,105,108,108,32>>,{em,[],[<<110,101,118,101,114>>]},<<32,114,101,116,117,114,110,32,97,32,118,97,108,117,101,59,32,116,104,97,116,32,105,115,32,105,116,32,119,105,108,108,32>>,{em,[],[<<97,108,119,97,121,115>>]},<<32,116,104,114,111,119,32,97,110,32,101,120,99,101,112,116,105,111,110,46,32,73,110,32,97,32,115,112,101,99,44,32,117,115,101,32>>,{code,[],[<<110,111,95,114,101,116,117,114,110,40,41>>]},<<32,102,111,114,32,116,104,101,32,115,97,107,101,32,111,102,32,99,108,97,114,105,116,121,46>>]}]},#{signature => [{attribute,{107,2},type,{none,{type,{107,17},none,[]},[]}}]}},{{type,nonempty_binary,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,108}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,98,105,110,97,114,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,110,97,114,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<98,105,110,97,114,121,40,41>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,100,97,116,97,46>>]}]},#{signature => [{attribute,{108,2},type,{nonempty_binary,{type,{108,28},binary,[{integer,{108,32},8},{integer,{108,39},8}]},[]}}]}},{{type,nonempty_bitstring,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,109}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,98,105,116,115,116,114,105,110,103,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,98,105,116,115,116,114,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<98,105,116,115,116,114,105,110,103,40,41>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,100,97,116,97,46>>]}]},#{signature => [{attribute,{109,2},type,{nonempty_bitstring,{type,{109,31},binary,[{integer,{109,35},1},{integer,{109,42},1}]},[]}}]}},{{type,nonempty_improper_list,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,110}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,65,114,103,49,44,65,114,103,50,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,47,50>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>]}]},#{signature => [{attribute,{110,2},type,{nonempty_improper_list,{type,{110,63},nonempty_improper_list,[{var,{110,86},'ContentType'},{var,{110,99},'TerminationType'}]},[{var,{110,30},'ContentType'},{var,{110,43},'TerminationType'}]}}]}},{{type,nonempty_list,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,111}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,108,105,115,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<108,105,115,116,40,41>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>]}]},#{signature => [{attribute,{111,2},type,{nonempty_list,{type,{111,26},nonempty_list,[{type,{111,40},any,[]}]},[]}}]}},{{type,nonempty_list,1},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,112}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,108,105,115,116,40,65,114,103,49,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,41>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>]}]},#{signature => [{attribute,{112,2},type,{nonempty_list,{type,{112,37},nonempty_list,[{var,{112,38},'ContentType'}]},[{var,{112,21},'ContentType'}]}}]}},{{type,nonempty_maybe_improper_list,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,113}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,41>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>]}]},#{signature => [{attribute,{113,2},type,{nonempty_maybe_improper_list,{type,{113,41},nonempty_maybe_improper_list,[{type,{113,70},any,[]},{type,{113,77},any,[]}]},[]}}]}},{{type,nonempty_maybe_improper_list,2},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,114}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,65,114,103,49,44,65,114,103,50,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<109,97,121,98,101,95,105,109,112,114,111,112,101,114,95,108,105,115,116,40,67,111,110,116,101,110,116,84,121,112,101,44,32,84,101,114,109,105,110,97,116,105,111,110,84,121,112,101,41>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,105,116,101,109,115,46>>]}]},#{signature => [{attribute,{114,2},type,{nonempty_maybe_improper_list,{type,{114,69},nonempty_maybe_improper_list,[{var,{114,98},'ContentType'},{var,{114,111},'TerminationType'}]},[{var,{114,36},'ContentType'},{var,{114,49},'TerminationType'}]}}]}},{{type,nonempty_string,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,115}],[<<45,116,121,112,101,32,110,111,110,101,109,112,116,121,95,115,116,114,105,110,103,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,116,114,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<115,116,114,105,110,103,40,41>>]},<<32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,99,104,97,114,97,99,116,101,114,115,46>>]}]},#{signature => [{attribute,{115,2},type,{nonempty_string,{type,{115,28},nonempty_list,[{type,{115,42},char,[]}]},[]}}]}},{{type,number,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,116}],[<<45,116,121,112,101,32,110,117,109,98,101,114,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,110,117,109,98,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<110,117,109,98,101,114>>]},<<46>>]}]},#{signature => [{attribute,{116,2},type,{number,{type,{116,19},union,[{type,{116,19},integer,[]},{type,{116,31},float,[]}]},[]}}]}},{{type,pid,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,117}],[<<45,116,121,112,101,32,112,105,100,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,112,105,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,111,99,101,115,115,32,105,100,101,110,116,105,102,105,101,114>>]},<<46>>]}]},#{signature => [{attribute,{117,2},type,{pid,{type,{117,16},pid,[]},[]}}]}},{{type,port,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,118}],[<<45,116,121,112,101,32,112,111,114,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,112,111,114,116,45,105,100,101,110,116,105,102,105,101,114>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,111,114,116,32,105,100,101,110,116,105,102,105,101,114>>]},<<46>>]}]},#{signature => [{attribute,{118,2},type,{port,{type,{118,17},port,[]},[]}}]}},{{type,pos_integer,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,119}],[<<45,116,121,112,101,32,112,111,115,95,105,110,116,101,103,101,114,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,105,110,116,101,103,101,114,32,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,46>>]}]},#{signature => [{attribute,{119,2},type,{pos_integer,{type,{119,24},pos_integer,[]},[]}}]}},{{type,reference,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,120}],[<<45,116,121,112,101,32,114,101,102,101,114,101,110,99,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,114,101,102,101,114,101,110,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,102,101,114,101,110,99,101>>]},<<46>>]}]},#{signature => [{attribute,{120,2},type,{reference,{type,{120,22},reference,[]},[]}}]}},{{type,string,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,121}],[<<45,116,121,112,101,32,115,116,114,105,110,103,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,108,105,115,116,32,111,102,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,111,114,32,117,110,105,99,111,100,101,32,99,111,100,101,112,111,105,110,116,115,46>>]}]},#{signature => [{attribute,{121,2},type,{string,{type,{121,19},list,[{type,{121,20},char,[]}]},[]}}]}},{{type,term,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,122}],[<<45,116,121,112,101,32,116,101,114,109,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,108,108,32,112,111,115,115,105,98,108,101,32,69,114,108,97,110,103,32,116,101,114,109,115,46,32,83,121,110,111,110,121,109,32,102,111,114,32>>,{code,[],[<<97,110,121,40,41>>]},<<46>>]}]},#{signature => [{attribute,{122,2},type,{term,{type,{122,17},any,[]},[]}}]}},{{type,timeout,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,123}],[<<45,116,121,112,101,32,116,105,109,101,111,117,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,116,105,109,101,111,117,116,32,118,97,108,117,101,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32,97,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,120,112,114,101,115,115,105,111,110,115,35,114,101,99,101,105,118,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,99,101,105,118,101,32,101,120,112,114,101,115,115,105,111,110>>]},<<46>>]}]},#{signature => [{attribute,{123,2},type,{timeout,{type,{123,20},union,[{atom,{123,20},infinity},{type,{123,33},non_neg_integer,[]}]},[]}}]}},{{type,tuple,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,124}],[<<45,116,121,112,101,32,116,117,112,108,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,100,97,116,97,95,116,121,112,101,115,35,116,117,112,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<116,117,112,108,101>>]},<<46>>]}]},#{signature => [{attribute,{124,2},type,{tuple,{type,{124,18},tuple,any},[]}}]}},{{type,ext_binary,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,155}],[<<45,116,121,112,101,32,101,120,116,95,98,105,110,97,114,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]}]},#{signature => [{attribute,{155,2},type,{ext_binary,{type,{155,23},binary,[]},[]}}]}},{{type,ext_iovec,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,156}],[<<45,116,121,112,101,32,101,120,116,95,105,111,118,101,99,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,116,101,114,109,32,111,102,32,116,121,112,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<105,111,118,101,99,40,41>>]}]},<<44,32,115,116,114,117,99,116,117,114,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,101,120,116,101,114,110,97,108,32,116,101,114,109,32,102,111,114,109,97,116,46>>]}]},#{signature => [{attribute,{156,2},type,{ext_iovec,{user_type,{156,22},iovec,[]},[]}}]}},{{type,iovec,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,187}],[<<45,116,121,112,101,32,105,111,118,101,99,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32,108,105,115,116,32,111,102,32,98,105,110,97,114,105,101,115,46,32,84,104,105,115,32,100,97,116,97,116,121,112,101,32,105,115,32,117,115,101,102,117,108,32,116,111,32,117,115,101,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,110,105,102,35,101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[{code,[],[<<101,110,105,102,95,105,110,115,112,101,99,116,95,105,111,118,101,99>>]}]},<<46>>]}]},#{signature => [{attribute,{187,2},type,{iovec,{type,{187,18},list,[{type,{187,19},binary,[]}]},[]}}]}},{{type,message_queue_data,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2416}],[<<45,116,121,112,101,32,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]},<<46>>]}]},#{signature => [{attribute,{2416,2},type,{message_queue_data,{type,{2417,2},union,[{atom,{2417,2},off_heap},{atom,{2417,13},on_heap}]},[]}}]}},{{type,monitor_option,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,1460}],[<<45,116,121,112,101,32,109,111,110,105,116,111,114,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,109,111,110,105,116,111,114,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<109,111,110,105,116,111,114,47,51>>]}]},<<46>>]}]},#{signature => [{attribute,{1460,2},type,{monitor_option,{type,{1460,27},union,[{type,{1460,27},tuple,[{atom,{1460,28},alias},{type,{1460,37},union,[{atom,{1460,37},explicit_unalias},{atom,{1460,58},demonitor},{atom,{1460,72},reply_demonitor}]}]},{type,{1461,27},tuple,[{atom,{1461,28},tag},{type,{1461,35},term,[]}]}]},[]}}]}},{{type,timestamp,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,157}],[<<45,116,121,112,101,32,116,105,109,101,115,116,97,109,112,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,105,109,101,115,116,97,109,112,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,116,105,109,101,115,116,97,109,112,47,48>>]}]},<<46>>]}]},#{signature => [{attribute,{157,2},type,{timestamp,{type,{157,22},tuple,[{ann_type,{157,23},[{var,{157,23},'MegaSecs'},{type,{157,35},non_neg_integer,[]}]},{ann_type,{158,23},[{var,{158,23},'Secs'},{type,{158,31},non_neg_integer,[]}]},{ann_type,{159,23},[{var,{159,23},'MicroSecs'},{type,{159,36},non_neg_integer,[]}]}]},[]}}]}},{{type,time_unit,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,161}],[<<45,116,121,112,101,32,116,105,109,101,95,117,110,105,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{a,[{id,<<116,121,112,101,95,116,105,109,101,95,117,110,105,116>>}],[]},{p,[],[<<83,117,112,112,111,114,116,101,100,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<80,97,114,116,115,80,101,114,83,101,99,111,110,100,32,58,58,32,105,110,116,101,103,101,114,40,41,32,62,61,32,49>>]}]},{dd,[],[{p,[],[<<84,105,109,101,32,117,110,105,116,32,101,120,112,114,101,115,115,101,100,32,105,110,32,112,97,114,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,101,113,117,97,108,115,32>>,{code,[],[<<49,47,80,97,114,116,115,80,101,114,83,101,99,111,110,100>>]},<<32,115,101,99,111,110,100,46>>]}]},{dt,[],[{code,[],[<<115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,108,108,105,115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49,48,48,48>>]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,99,114,111,115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49,48,48,48,95,48,48,48>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,97,110,111,115,101,99,111,110,100>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,116,105,109,101,32,117,110,105,116,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,116,104,101,32,105,110,116,101,103,101,114,32>>,{code,[],[<<49,48,48,48,95,48,48,48,95,48,48,48>>]},<<46>>]}]},{dt,[],[{code,[],[<<110,97,116,105,118,101>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,110,97,116,105,118,101,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,105,115,32,100,101,116,101,114,109,105,110,101,100,32,97,116,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,115,116,97,114,116,44,32,97,110,100,32,114,101,109,97,105,110,115,32,116,104,101,32,115,97,109,101,32,117,110,116,105,108,32,116,104,101,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,116,101,114,109,105,110,97,116,101,115,46,32,73,102,32,97,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,115,32,115,116,111,112,112,101,100,32,97,110,100,32,116,104,101,110,32,115,116,97,114,116,101,100,32,97,103,97,105,110,32,40,101,118,101,110,32,111,110,32,116,104,101,32,115,97,109,101,32,109,97,99,104,105,110,101,41,44,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,32,110,101,119,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,32,99,97,110,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,111,102,32,116,104,101,32,111,108,100,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,32,105,110,115,116,97,110,99,101,46>>]},{p,[],[<<79,110,101,32,99,97,110,32,103,101,116,32,97,110,32,97,112,112,114,111,120,105,109,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,98,121,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,40,49,44,32,115,101,99,111,110,100,44,32,110,97,116,105,118,101,41>>]}]},<<46,32,84,104,101,32,114,101,115,117,108,116,32,101,113,117,97,108,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,119,104,111,108,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,115,32,112,101,114,32,115,101,99,111,110,100,32,100,111,101,115,32,110,111,116,32,97,100,100,32,117,112,32,116,111,32,97,32,119,104,111,108,101,32,110,117,109,98,101,114,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,114,111,117,110,100,101,100,32,100,111,119,110,119,97,114,100,115,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,103,105,118,101,115,32,121,111,117,32,109,111,114,101,32,111,114,32,108,101,115,115,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,113,117,97,108,105,116,121,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,46,32,73,116,32,115,101,116,115,32,97,32,108,105,109,105,116,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,82,101,115,111,108,117,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<114,101,115,111,108,117,116,105,111,110>>]},<<32,97,110,100,32,102,111,114,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,80,114,101,99,105,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<112,114,101,99,105,115,105,111,110>>]},<<32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,44,32,98,117,116,32,105,116,32,103,105,118,101,115,32,110,111,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32>>,{a,[{href,<<101,114,116,115,58,116,105,109,101,95,99,111,114,114,101,99,116,105,111,110,35,84,105,109,101,95,65,99,99,117,114,97,99,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<97,99,99,117,114,97,99,121>>]},<<32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,46,32,84,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,32,97,110,100,32,116,104,101,32,114,101,115,111,108,117,116,105,111,110,32,111,102,32,116,105,109,101,32,118,97,108,117,101,115,32,99,97,110,32,100,105,102,102,101,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,46>>]}]}]},{dt,[],[{code,[],[<<112,101,114,102,95,99,111,117,110,116,101,114>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32,112,101,114,102,111,114,109,97,110,99,101,32,99,111,117,110,116,101,114,32,116,105,109,101,32,117,110,105,116,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<112,101,114,102,95,99,111,117,110,116,101,114>>]},<<32,116,105,109,101,32,117,110,105,116,32,98,101,104,97,118,101,115,32,109,117,99,104,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32>>,{code,[],[<<110,97,116,105,118,101>>]},<<32,116,105,109,101,32,117,110,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,32,100,105,102,102,101,114,32,98,101,116,119,101,101,110,32,114,117,110,116,105,109,101,32,114,101,115,116,97,114,116,115,46,32,84,111,32,103,101,116,32,118,97,108,117,101,115,32,111,102,32,116,104,105,115,32,116,121,112,101,44,32,99,97,108,108,32>>,{a,[{href,<<107,101,114,110,101,108,58,111,115,35,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,115,58,112,101,114,102,95,99,111,117,110,116,101,114,47,48>>]}]},<<46>>]}]},{dt,[],[{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,40,41>>]}]}]},{dd,[],[{p,[],[<<68,101,112,114,101,99,97,116,101,100,32,115,121,109,98,111,108,105,99,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,115,32,107,101,112,116,32,102,111,114,32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105,108,105,116,121,46>>]}]}]},{p,[],[<<84,104,101,32>>,{code,[],[<<116,105,109,101,95,117,110,105,116,47,48>>]},<<32,116,121,112,101,32,99,97,110,32,98,101,32,101,120,116,101,110,100,101,100,46,32,84,111,32,99,111,110,118,101,114,116,32,116,105,109,101,32,118,97,108,117,101,115,32,98,101,116,119,101,101,110,32,116,105,109,101,32,117,110,105,116,115,44,32,117,115,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,99,111,110,118,101,114,116,95,116,105,109,101,95,117,110,105,116,47,51>>]}]},<<46>>]}]},#{signature => [{attribute,{161,2},type,{time_unit,{type,{162,2},union,[{type,{162,2},pos_integer,[]},{atom,{163,9},second},{atom,{164,9},millisecond},{atom,{165,9},microsecond},{atom,{166,9},nanosecond},{atom,{167,9},native},{atom,{168,9},perf_counter},{user_type,{169,9},deprecated_time_unit,[]}]},[]}}]}},{{type,deprecated_time_unit,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,172}],[<<45,116,121,112,101,32,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{a,[{id,<<116,121,112,101,95,100,101,112,114,101,99,97,116,101,100,95,116,105,109,101,95,117,110,105,116>>}],[]},{p,[],[<<84,104,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<116,105,109,101,95,117,110,105,116,40,41>>]}]},<<32,116,121,112,101,32,97,108,115,111,32,99,111,110,115,105,115,116,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32>>,{em,[],[<<100,101,112,114,101,99,97,116,101,100>>]},<<32,115,121,109,98,111,108,105,99,32,116,105,109,101,32,117,110,105,116,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,99,111,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,108,108,105,95,115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,108,108,105,115,101,99,111,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<109,105,99,114,111,95,115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<109,105,99,114,111,115,101,99,111,110,100>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<110,97,110,111,95,115,101,99,111,110,100,115>>]}]},{dd,[],[{p,[],[<<83,97,109,101,32,97,115,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,116,121,112,101,95,116,105,109,101,95,117,110,105,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<110,97,110,111,115,101,99,111,110,100>>]}]},<<46>>]}]}]}]},#{signature => [{attribute,{172,2},type,{deprecated_time_unit,{type,{173,7},union,[{atom,{173,7},seconds},{atom,{174,9},milli_seconds},{atom,{175,9},micro_seconds},{atom,{176,9},nano_seconds}]},[]}}]}},{{type,dist_handle,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,184}],[<<45,116,121,112,101,32,100,105,115,116,95,104,97,110,100,108,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,121,105,110,103,32,97,32,100,105,115,116,114,105,98,117,116,105,111,110,32,99,104,97,110,110,101,108,46>>]}]},#{signature => [{attribute,{184,2},opaque,{dist_handle,{type,{184,26},atom,[]},[]}}]}},{{type,nif_resource,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,181}],[<<45,116,121,112,101,32,110,105,102,95,114,101,115,111,117,114,99,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,111,112,97,113,117,101,32,104,97,110,100,108,101,32,105,100,101,110,116,105,102,121,105,110,103,32,97,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,95,110,105,102,35,114,101,115,111,117,114,99,101,95,111,98,106,101,99,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,114,101,102>>}],[<<78,73,70,32,114,101,115,111,117,114,99,101,32,111,98,106,101,99,116,32>>]},<<46>>]}]},#{signature => [{attribute,{181,2},opaque,{nif_resource,{type,{181,27},reference,[]},[]}}]}},{{type,spawn_opt_option,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3056}],[<<45,116,121,112,101,32,115,112,97,119,110,95,111,112,116,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<79,112,116,105,111,110,115,32,102,111,114,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,115,112,97,119,110,95,111,112,116,47,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,112,97,119,110,95,111,112,116,40,41>>]}]},<<46>>]}]},#{signature => [{attribute,{3056,2},type,{spawn_opt_option,{type,{3057,2},union,[{atom,{3057,2},link},{atom,{3058,9},monitor},{type,{3059,9},tuple,[{atom,{3059,10},monitor},{ann_type,{3059,19},[{var,{3059,19},'MonitorOpts'},{type,{3059,34},list,[{user_type,{3059,35},monitor_option,[]}]}]}]},{type,{3060,9},tuple,[{atom,{3060,10},priority},{ann_type,{3060,20},[{var,{3060,20},'Level'},{user_type,{3060,29},priority_level,[]}]}]},{type,{3061,9},tuple,[{atom,{3061,10},fullsweep_after},{ann_type,{3061,27},[{var,{3061,27},'Number'},{type,{3061,37},non_neg_integer,[]}]}]},{type,{3062,9},tuple,[{atom,{3062,10},min_heap_size},{ann_type,{3062,25},[{var,{3062,25},'Size'},{type,{3062,33},non_neg_integer,[]}]}]},{type,{3063,9},tuple,[{atom,{3063,10},min_bin_vheap_size},{ann_type,{3063,30},[{var,{3063,30},'VSize'},{type,{3063,39},non_neg_integer,[]}]}]},{type,{3064,9},tuple,[{atom,{3064,10},max_heap_size},{ann_type,{3064,25},[{var,{3064,25},'Size'},{user_type,{3064,33},max_heap_size,[]}]}]},{type,{3065,9},tuple,[{atom,{3065,10},message_queue_data},{ann_type,{3065,30},[{var,{3065,30},'MQD'},{user_type,{3065,37},message_queue_data,[]}]}]}]},[]}}]}},{{type,priority_level,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2413}],[<<45,116,121,112,101,32,112,114,105,111,114,105,116,121,95,108,101,118,101,108,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<80,114,111,99,101,115,115,32,112,114,105,111,114,105,116,121,32,108,101,118,101,108,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,112,114,105,111,114,105,116,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,112,114,105,111,114,105,116,121,44,32,76,101,118,101,108,41>>]}]}]}]},#{signature => [{attribute,{2413,2},type,{priority_level,{type,{2414,7},union,[{atom,{2414,7},low},{atom,{2414,13},normal},{atom,{2414,22},high},{atom,{2414,29},max}]},[]}}]}},{{type,max_heap_size,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,3049}],[<<45,116,121,112,101,32,109,97,120,95,104,101,97,112,95,115,105,122,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<80,114,111,99,101,115,115,32,109,97,120,32,104,101,97,112,32,115,105,122,101,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,97,120,95,104,101,97,112,95,115,105,122,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,97,120,95,104,101,97,112,95,115,105,122,101,44,32,77,97,120,72,101,97,112,83,105,122,101,41>>]}]}]}]},#{signature => [{attribute,{3049,2},type,{max_heap_size,{ann_type,{3050,9},[{var,{3050,9},'Size'},{type,{3050,17},union,[{type,{3050,17},non_neg_integer,[]},{type,{3052,9},map,[{type,{3052,17},map_field_assoc,[{atom,{3052,12},size},{type,{3052,20},non_neg_integer,[]}]},{type,{3053,17},map_field_assoc,[{atom,{3053,12},kill},{type,{3053,20},boolean,[]}]},{type,{3054,25},map_field_assoc,[{atom,{3054,12},error_logger},{type,{3054,28},boolean,[]}]}]}]}]},[]}}]}},{{type,message_queue_data,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,2416}],[<<45,116,121,112,101,32,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<80,114,111,99,101,115,115,32,109,101,115,115,97,103,101,32,113,117,101,117,101,32,100,97,116,97,32,99,111,110,102,105,103,117,114,97,116,105,111,110,46,32,70,111,114,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,44,32,115,101,101,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,112,114,111,99,101,115,115,95,102,108,97,103,95,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<112,114,111,99,101,115,115,95,102,108,97,103,40,109,101,115,115,97,103,101,95,113,117,101,117,101,95,100,97,116,97,44,32,77,81,68,41>>]}]}]}]},#{signature => [{attribute,{2416,2},type,{message_queue_data,{type,{2417,2},union,[{atom,{2417,2},off_heap},{atom,{2417,13},on_heap}]},[]}}]}},{{type,stacktrace_extrainfo,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,146}],[<<45,116,121,112,101,32,115,116,97,99,107,116,114,97,99,101,95,101,120,116,114,97,105,110,102,111,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32,115,116,97,99,107,116,114,97,99,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,98,121,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115,35,115,116,97,99,107,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,114,111,114,115,32,97,110,100,32,69,114,114,111,114,32,72,97,110,100,108,105,110,103>>]},<<32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,46>>]}]},#{signature => [{attribute,{146,2},type,{stacktrace_extrainfo,{type,{147,9},union,[{type,{147,9},tuple,[{atom,{147,10},line},{type,{147,16},pos_integer,[]}]},{type,{148,9},tuple,[{atom,{148,10},file},{remote_type,{148,16},[{atom,{148,16},unicode},{atom,{148,24},chardata},[]]}]},{type,{149,9},tuple,[{atom,{149,10},error_info},{type,{149,22},map,[{type,{149,32},map_field_assoc,[{atom,{149,25},module},{type,{149,35},module,[]}]},{type,{149,54},map_field_assoc,[{atom,{149,45},function},{type,{149,57},atom,[]}]},{type,{149,71},map_field_assoc,[{atom,{149,65},cause},{type,{149,74},term,[]}]}]}]},{type,{150,9},tuple,[{type,{150,10},atom,[]},{type,{150,18},term,[]}]}]},[]}}]}},{{type,stacktrace,0},[{file,[101,114,108,97,110,103,46,101,114,108]},{location,151}],[<<45,116,121,112,101,32,115,116,97,99,107,116,114,97,99,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,69,114,108,97,110,103,32,115,116,97,99,107,116,114,97,99,101,32,97,115,32,100,101,115,99,114,105,98,101,100,32,98,121,32>>,{a,[{href,<<115,121,115,116,101,109,47,114,101,102,101,114,101,110,99,101,95,109,97,110,117,97,108,58,101,114,114,111,114,115,35,115,116,97,99,107,116,114,97,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<69,114,114,111,114,115,32,97,110,100,32,69,114,114,111,114,32,72,97,110,100,108,105,110,103>>]},<<32,115,101,99,116,105,111,110,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,82,101,102,101,114,101,110,99,101,32,77,97,110,117,97,108,46>>]}]},#{signature => [{attribute,{151,2},type,{stacktrace,{type,{151,23},list,[{type,{151,24},union,[{type,{151,24},tuple,[{type,{151,25},module,[]},{type,{151,35},atom,[]},{type,{151,43},union,[{type,{151,43},arity,[]},{type,{151,53},list,[{type,{151,54},term,[]}]}]},{type,{152,25},list,[{user_type,{152,26},stacktrace_extrainfo,[]}]}]},{type,{153,24},tuple,[{type,{153,25},function,[]},{type,{153,37},union,[{type,{153,37},arity,[]},{type,{153,47},list,[{type,{153,48},term,[]}]}]},{type,{153,57},list,[{user_type,{153,58},stacktrace_extrainfo,[]}]}]}]}]},[]}}]}}]}. \ No newline at end of file
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/file.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/file.docs_v1
index 9c88ce7723..227f99dfaa 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/file.docs_v1
+++ b/lib/stdlib/test/shell_docs_SUITE_data/file.docs_v1
@@ -1 +1 @@
-{docs_v1,[{file,[102,105,108,101,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<84,104,105,115,32,109,111,100,117,108,101,32,112,114,111,118,105,100,101,115,32,97,110,32,105,110,116,101,114,102,97,99,101,32,116,111,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<70,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,97,114,101,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,97,112,112,101,97,114,32,97,116,111,109,105,99,32,119,104,101,110,32,103,111,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,32,115,97,109,101,32,102,105,108,101,32,115,101,114,118,101,114,46,32,65,32,78,73,70,32,111,114,32,111,116,104,101,114,32,79,83,32,112,114,111,99,101,115,115,32,109,97,121,32,111,98,115,101,114,118,101,32,105,110,116,101,114,109,101,100,105,97,116,101,32,115,116,101,112,115,32,111,110,32,99,101,114,116,97,105,110,32,111,112,101,114,97,116,105,111,110,115,32,111,110,32,115,111,109,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,115,44,32,101,103,46,32,114,101,110,97,109,105,110,103,32,97,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101,32,111,110,32,87,105,110,100,111,119,115,44,32,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]},<<32>>]},<<111,110,32,97,110,121,32,79,83,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,119,114,105,116,105,110,103,46>>]}]},{p,[],[<<82,101,103,97,114,100,105,110,103,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,99,97,110,32,111,112,101,114,97,116,101,32,105,110,32,116,119,111,32,109,111,100,101,115,46,32,84,104,101,32,99,117,114,114,101,110,116,32,109,111,100,101,32,99,97,110,32,98,101,32,113,117,101,114,105,101,100,32,117,115,105,110,103,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>]}]},<<46,32,73,116,32,114,101,116,117,114,110,115,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,111,114,32>>,{code,[],[<<117,116,102,56>>]},<<46>>]},{p,[],[<<73,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,109,111,100,101,44,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,100,111,101,115,32,110,111,116,32,99,104,97,110,103,101,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,102,105,108,101,110,97,109,101,115,46,32,73,110,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,44,32,102,105,108,101,110,97,109,101,115,32,99,97,110,32,99,111,110,116,97,105,110,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,50,53,53,32,97,110,100,32,116,104,101,32,86,77,32,99,111,110,118,101,114,116,115,32,102,105,108,101,110,97,109,101,115,32,98,97,99,107,32,97,110,100,32,102,111,114,116,104,32,116,111,32,116,104,101,32,110,97,116,105,118,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,40,117,115,117,97,108,108,121,32,85,84,70,45,56,44,32,98,117,116,32,85,84,70,45,49,54,32,111,110,32,87,105,110,100,111,119,115,41,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,109,111,100,101,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,46,32,87,105,110,100,111,119,115,44,32,77,97,99,79,83,32,88,32,97,110,100,32,65,110,100,114,111,105,100,32,101,110,102,111,114,99,101,32,99,111,110,115,105,115,116,101,110,116,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,116,104,101,32,86,77,32,117,115,101,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,46>>]},{p,[],[<<79,110,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,115,32,119,105,116,104,32,116,114,97,110,115,112,97,114,101,110,116,32,110,97,109,105,110,103,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,108,108,32,85,110,105,120,32,115,121,115,116,101,109,115,32,101,120,99,101,112,116,32,77,97,99,79,83,32,88,41,44,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,105,102,32,116,104,101,32,116,101,114,109,105,110,97,108,32,115,117,112,112,111,114,116,115,32,85,84,70,45,56,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,99,97,110,32,98,101,32,111,118,101,114,114,105,100,100,101,110,32,117,115,105,110,103,32>>,{code,[],[<<43,102,110,108>>]},<<32,40,116,111,32,102,111,114,99,101,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,109,111,100,101,41,32,111,114,32>>,{code,[],[<<43,102,110,117>>]},<<32,40,116,111,32,102,111,114,99,101,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,41,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,101,114,116,115,58,101,114,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<101,114,108>>]}]},<<46>>]},{p,[],[<<79,110,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,115,32,119,105,116,104,32,116,114,97,110,115,112,97,114,101,110,116,32,110,97,109,105,110,103,44,32,102,105,108,101,115,32,99,97,110,32,98,101,32,105,110,99,111,110,115,105,115,116,101,110,116,108,121,32,110,97,109,101,100,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,115,111,109,101,32,102,105,108,101,115,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,85,84,70,45,56,32,119,104,105,108,101,32,111,116,104,101,114,115,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,73,83,79,32,76,97,116,105,110,45,49,46,32,84,104,101,32,99,111,110,99,101,112,116,32,111,102,32>>,{em,[],[<<114,97,119,32,102,105,108,101,110,97,109,101,115>>]},<<32,105,115,32,105,110,116,114,111,100,117,99,101,100,32,116,111,32,104,97,110,100,108,101,32,102,105,108,101,32,115,121,115,116,101,109,115,32,119,105,116,104,32,105,110,99,111,110,115,105,115,116,101,110,116,32,110,97,109,105,110,103,32,119,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,46>>]},{p,[],[<<65,32>>,{em,[],[<<114,97,119,32,102,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,32,102,105,108,101,110,97,109,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,105,110,97,114,121,46,32,84,104,101,32,69,114,108,97,110,103,32,86,77,32,100,111,101,115,32,110,111,116,32,116,114,97,110,115,108,97,116,101,32,97,32,102,105,108,101,110,97,109,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,105,110,97,114,121,32,111,110,32,115,121,115,116,101,109,115,32,119,105,116,104,32,116,114,97,110,115,112,97,114,101,110,116,32,110,97,109,105,110,103,46>>]},{p,[],[<<87,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,44,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,108,105,115,116,95,100,105,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,100,105,114,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,107,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,108,105,110,107,47,49>>]}]},<<32,110,101,118,101,114,32,114,101,116,117,114,110,32,114,97,119,32,102,105,108,101,110,97,109,101,115,46,32,84,111,32,114,101,116,117,114,110,32,97,108,108,32,102,105,108,101,110,97,109,101,115,32,105,110,99,108,117,100,105,110,103,32,114,97,119,32,102,105,108,101,110,97,109,101,115,44,32,117,115,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,108,105,115,116,95,100,105,114,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,105,115,116,95,100,105,114,95,97,108,108,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,107,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,97,100,95,108,105,110,107,95,97,108,108,47,49>>]}]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,95,117,115,97,103,101,35,110,111,116,101,115,45,97,98,111,117,116,45,114,97,119,45,102,105,108,101,110,97,109,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<78,111,116,101,115,32,65,98,111,117,116,32,82,97,119,32,70,105,108,101,110,97,109,101,115>>]},<<32,105,110,32,116,104,101,32,83,84,68,76,73,66,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<70,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,117,115,101,100,32,116,111,32,97,99,99,101,112,116,32,102,105,108,101,110,97,109,101,115,32,99,111,110,116,97,105,110,105,110,103,32,110,117,108,108,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,116,101,103,101,114,32,118,97,108,117,101,32,122,101,114,111,41,46,32,84,104,105,115,32,99,97,117,115,101,100,32,116,104,101,32,110,97,109,101,32,116,111,32,98,101,32,116,114,117,110,99,97,116,101,100,32,97,110,100,32,105,110,32,115,111,109,101,32,99,97,115,101,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,112,114,105,109,105,116,105,118,101,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,98,101,32,109,105,120,101,100,32,117,112,46,32,70,105,108,101,110,97,109,101,115,32,99,111,110,116,97,105,110,105,110,103,32,110,117,108,108,32,99,104,97,114,97,99,116,101,114,115,32,105,110,115,105,100,101,32,116,104,101,32,102,105,108,101,110,97,109,101,32,97,114,101,32,110,111,119,32>>,{em,[],[<<114,101,106,101,99,116,101,100>>]},<<32,97,110,100,32,119,105,108,108,32,99,97,117,115,101,32,112,114,105,109,105,116,105,118,101,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,102,97,105,108,46>>]}]},{h2,[],[<<80,79,83,73,88,32,69,114,114,111,114,32,67,111,100,101,115>>]},{ul,[],[{li,[],[{code,[],[<<101,97,99,99,101,115>>]},<<32,45,32,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100>>]},{li,[],[{code,[],[<<101,97,103,97,105,110>>]},<<32,45,32,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101>>]},{li,[],[{code,[],[<<101,98,97,100,102>>]},<<32,45,32,66,97,100,32,102,105,108,101,32,110,117,109,98,101,114>>]},{li,[],[{code,[],[<<101,98,117,115,121>>]},<<32,45,32,70,105,108,101,32,98,117,115,121>>]},{li,[],[{code,[],[<<101,100,113,117,111,116>>]},<<32,45,32,68,105,115,107,32,113,117,111,116,97,32,101,120,99,101,101,100,101,100>>]},{li,[],[{code,[],[<<101,101,120,105,115,116>>]},<<32,45,32,70,105,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115>>]},{li,[],[{code,[],[<<101,102,97,117,108,116>>]},<<32,45,32,66,97,100,32,97,100,100,114,101,115,115,32,105,110,32,115,121,115,116,101,109,32,99,97,108,108,32,97,114,103,117,109,101,110,116>>]},{li,[],[{code,[],[<<101,102,98,105,103>>]},<<32,45,32,70,105,108,101,32,116,111,111,32,108,97,114,103,101>>]},{li,[],[{code,[],[<<101,105,110,116,114>>]},<<32,45,32,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108>>]},{li,[],[{code,[],[<<101,105,110,118,97,108>>]},<<32,45,32,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116>>]},{li,[],[{code,[],[<<101,105,111>>]},<<32,45,32,73,47,79,32,101,114,114,111,114>>]},{li,[],[{code,[],[<<101,105,115,100,105,114>>]},<<32,45,32,73,108,108,101,103,97,108,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,100,105,114,101,99,116,111,114,121>>]},{li,[],[{code,[],[<<101,108,111,111,112>>]},<<32,45,32,84,111,111,32,109,97,110,121,32,108,101,118,101,108,115,32,111,102,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115>>]},{li,[],[{code,[],[<<101,109,102,105,108,101>>]},<<32,45,32,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115>>]},{li,[],[{code,[],[<<101,109,108,105,110,107>>]},<<32,45,32,84,111,111,32,109,97,110,121,32,108,105,110,107,115>>]},{li,[],[{code,[],[<<101,110,97,109,101,116,111,111,108,111,110,103>>]},<<32,45,32,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103>>]},{li,[],[{code,[],[<<101,110,102,105,108,101>>]},<<32,45,32,70,105,108,101,32,116,97,98,108,101,32,111,118,101,114,102,108,111,119>>]},{li,[],[{code,[],[<<101,110,111,100,101,118>>]},<<32,45,32,78,111,32,115,117,99,104,32,100,101,118,105,99,101>>]},{li,[],[{code,[],[<<101,110,111,101,110,116>>]},<<32,45,32,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121>>]},{li,[],[{code,[],[<<101,110,111,109,101,109>>]},<<32,45,32,78,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121>>]},{li,[],[{code,[],[<<101,110,111,115,112,99>>]},<<32,45,32,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101>>]},{li,[],[{code,[],[<<101,110,111,116,98,108,107>>]},<<32,45,32,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100>>]},{li,[],[{code,[],[<<101,110,111,116,100,105,114>>]},<<32,45,32,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121>>]},{li,[],[{code,[],[<<101,110,111,116,115,117,112>>]},<<32,45,32,79,112,101,114,97,116,105,111,110,32,110,111,116,32,115,117,112,112,111,114,116,101,100>>]},{li,[],[{code,[],[<<101,110,120,105,111>>]},<<32,45,32,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115>>]},{li,[],[{code,[],[<<101,112,101,114,109>>]},<<32,45,32,78,111,116,32,111,119,110,101,114>>]},{li,[],[{code,[],[<<101,112,105,112,101>>]},<<32,45,32,66,114,111,107,101,110,32,112,105,112,101>>]},{li,[],[{code,[],[<<101,114,111,102,115>>]},<<32,45,32,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109>>]},{li,[],[{code,[],[<<101,115,112,105,112,101>>]},<<32,45,32,73,110,118,97,108,105,100,32,115,101,101,107>>]},{li,[],[{code,[],[<<101,115,114,99,104>>]},<<32,45,32,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115>>]},{li,[],[{code,[],[<<101,115,116,97,108,101>>]},<<32,45,32,83,116,97,108,101,32,114,101,109,111,116,101,32,102,105,108,101,32,104,97,110,100,108,101>>]},{li,[],[{code,[],[<<101,120,100,101,118>>]},<<32,45,32,67,114,111,115,115,45,100,111,109,97,105,110,32,108,105,110,107>>]}]},{h2,[],[<<80,101,114,102,111,114,109,97,110,99,101>>]},{p,[],[<<70,111,114,32,105,110,99,114,101,97,115,101,100,32,112,101,114,102,111,114,109,97,110,99,101,44,32,114,97,119,32,102,105,108,101,115,32,97,114,101,32,114,101,99,111,109,109,101,110,100,101,100,46>>]},{p,[],[<<65,32,110,111,114,109,97,108,32,102,105,108,101,32,105,115,32,114,101,97,108,108,121,32,97,32,112,114,111,99,101,115,115,32,115,111,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,97,115,32,97,110,32,73,47,79,32,100,101,118,105,99,101,32,40,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111>>]}]},<<41,46,32,84,104,101,114,101,102,111,114,101,44,32,119,104,101,110,32,100,97,116,97,32,105,115,32,119,114,105,116,116,101,110,32,116,111,32,97,32,110,111,114,109,97,108,32,102,105,108,101,44,32,116,104,101,32,115,101,110,100,105,110,103,32,111,102,32,116,104,101,32,100,97,116,97,32,116,111,32,116,104,101,32,102,105,108,101,32,112,114,111,99,101,115,115,44,32,99,111,112,105,101,115,32,97,108,108,32,100,97,116,97,32,116,104,97,116,32,97,114,101,32,110,111,116,32,98,105,110,97,114,105,101,115,46,32,79,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,105,110,32,98,105,110,97,114,121,32,109,111,100,101,32,97,110,100,32,119,114,105,116,105,110,103,32,98,105,110,97,114,105,101,115,32,105,115,32,116,104,101,114,101,102,111,114,101,32,114,101,99,111,109,109,101,110,100,101,100,46,32,73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,111,110,32,97,110,111,116,104,101,114,32,110,111,100,101,44,32,111,114,32,105,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,114,117,110,115,32,97,115,32,115,108,97,118,101,32,116,111,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,97,110,111,116,104,101,114,32,110,111,100,101,44,32,97,108,115,111,32,98,105,110,97,114,105,101,115,32,97,114,101,32,99,111,112,105,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<82,97,119,32,102,105,108,101,115,32,117,115,101,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,111,102,32,116,104,101,32,104,111,115,116,32,109,97,99,104,105,110,101,32,111,102,32,116,104,101,32,110,111,100,101,46,32,70,111,114,32,110,111,114,109,97,108,32,102,105,108,101,115,32,40,110,111,110,45,114,97,119,41,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,117,115,101,100,32,116,111,32,102,105,110,100,32,116,104,101,32,102,105,108,101,115,44,32,97,110,100,32,105,102,32,116,104,101,32,110,111,100,101,32,105,115,32,114,117,110,110,105,110,103,32,105,116,115,32,102,105,108,101,32,115,101,114,118,101,114,32,97,115,32,115,108,97,118,101,32,116,111,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,97,110,111,116,104,101,114,32,110,111,100,101,44,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,32,114,117,110,115,32,111,110,32,115,111,109,101,32,111,116,104,101,114,32,104,111,115,116,32,109,97,99,104,105,110,101,44,32,116,104,101,121,32,99,97,110,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,102,105,108,101,32,115,121,115,116,101,109,115,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,105,115,32,115,101,108,100,111,109,32,97,32,112,114,111,98,108,101,109,46>>]}]},{p,[],[{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<32,99,97,110,32,98,101,32,103,105,118,101,110,32,116,104,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,97,100,95,97,104,101,97,100>>]},<<32,116,111,32,116,117,114,110,32,111,110,32,99,97,99,104,105,110,103,44,32,119,104,105,99,104,32,119,105,108,108,32,114,101,100,117,99,101,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,115,32,97,110,100,32,103,114,101,97,116,108,121,32,105,109,112,114,111,118,101,32,112,101,114,102,111,114,109,97,110,99,101,32,102,111,114,32,115,109,97,108,108,32,114,101,97,100,115,32,97,110,100,32,119,114,105,116,101,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,111,118,101,114,104,101,97,100,32,119,111,110,39,116,32,100,105,115,97,112,112,101,97,114,32,99,111,109,112,108,101,116,101,108,121,32,97,110,100,32,105,116,39,115,32,98,101,115,116,32,116,111,32,107,101,101,112,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,97,32,109,105,110,105,109,117,109,46,32,65,115,32,97,32,99,111,110,116,114,105,118,101,100,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,117,110,99,116,105,111,110,32,119,114,105,116,101,115,32,52,77,66,32,105,110,32,50,46,53,32,115,101,99,111,110,100,115,32,119,104,101,110,32,116,101,115,116,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,40,78,97,109,101,41,32,45,62,10,32,32,32,32,123,111,107,44,32,70,100,125,32,61,32,102,105,108,101,58,111,112,101,110,40,78,97,109,101,44,32,91,114,97,119,44,32,119,114,105,116,101,44,32,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,98,105,110,97,114,121,93,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,70,100,44,32,52,32,98,115,108,32,50,48,41,44,10,32,32,32,32,102,105,108,101,58,99,108,111,115,101,40,70,100,41,46,10,10,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,95,70,100,44,32,48,41,32,45,62,10,32,32,32,32,111,107,59,10,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,70,100,44,32,77,41,32,45,62,10,32,32,32,32,111,107,32,61,32,102,105,108,101,58,119,114,105,116,101,40,70,100,44,32,60,60,48,62,62,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,70,100,44,32,77,32,45,32,49,41,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,102,117,110,99,116,105,111,110,97,108,108,121,32,101,113,117,105,118,97,108,101,110,116,32,99,111,100,101,32,119,114,105,116,101,115,32,49,50,56,32,98,121,116,101,115,32,112,101,114,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<32,97,110,100,32,115,111,32,100,111,101,115,32,116,104,101,32,115,97,109,101,32,119,111,114,107,32,105,110,32,48,46,48,56,32,115,101,99,111,110,100,115,44,32,119,104,105,99,104,32,105,115,32,114,111,117,103,104,108,121,32,51,48,32,116,105,109,101,115,32,102,97,115,116,101,114,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<99,114,101,97,116,101,95,102,105,108,101,40,78,97,109,101,41,32,45,62,10,32,32,32,32,123,111,107,44,32,70,100,125,32,61,32,102,105,108,101,58,111,112,101,110,40,78,97,109,101,44,32,91,114,97,119,44,32,119,114,105,116,101,44,32,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,98,105,110,97,114,121,93,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,52,32,98,115,108,32,50,48,41,44,10,32,32,32,32,102,105,108,101,58,99,108,111,115,101,40,70,100,41,44,10,32,32,32,32,111,107,46,10,10,99,114,101,97,116,101,95,102,105,108,101,95,49,40,95,70,100,44,32,48,41,32,45,62,10,32,32,32,32,111,107,59,10,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,41,32,119,104,101,110,32,77,32,62,61,32,49,50,56,32,45,62,10,32,32,32,32,111,107,32,61,32,102,105,108,101,58,119,114,105,116,101,40,70,100,44,32,60,60,48,58,40,49,50,56,41,47,117,110,105,116,58,56,62,62,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,32,45,32,49,50,56,41,59,10,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,41,32,45,62,10,32,32,32,32,111,107,32,61,32,102,105,108,101,58,119,114,105,116,101,40,70,100,44,32,60,60,48,58,40,77,41,47,117,110,105,116,58,56,62,62,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,32,45,32,49,41,46>>]}]},{p,[],[<<87,104,101,110,32,119,114,105,116,105,110,103,32,100,97,116,97,32,105,116,39,115,32,103,101,110,101,114,97,108,108,121,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,111,32,119,114,105,116,101,32,97,32,108,105,115,116,32,111,102,32,98,105,110,97,114,105,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,46,32,73,116,32,105,115,32,110,111,116,32,110,101,101,100,101,100,32,116,111,32,102,108,97,116,116,101,110,32,97,32,100,101,101,112,32,108,105,115,116,32,98,101,102,111,114,101,32,119,114,105,116,105,110,103,46,32,79,110,32,85,110,105,120,32,104,111,115,116,115,44,32,115,99,97,116,116,101,114,32,111,117,116,112,117,116,44,32,119,104,105,99,104,32,119,114,105,116,101,115,32,97,32,115,101,116,32,111,102,32,98,117,102,102,101,114,115,32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,105,115,32,117,115,101,100,32,119,104,101,110,32,112,111,115,115,105,98,108,101,46,32,73,110,32,116,104,105,115,32,119,97,121,32>>,{code,[],[<<119,114,105,116,101,40,70,68,44,32,91,66,105,110,49,44,32,66,105,110,50,32,124,32,66,105,110,51,93,41>>]},<<32,119,114,105,116,101,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,98,105,110,97,114,105,101,115,32,119,105,116,104,111,117,116,32,99,111,112,121,105,110,103,32,116,104,101,32,100,97,116,97,32,97,116,32,97,108,108,44,32,101,120,99,101,112,116,32,102,111,114,32,112,101,114,104,97,112,115,32,100,101,101,112,32,100,111,119,110,32,105,110,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,107,101,114,110,101,108,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,119,104,101,110,32,97,99,99,101,115,115,105,110,103,32,97,110,32,111,112,101,110,32,102,105,108,101,32,119,105,116,104,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111>>]}]},<<44,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,110,100,108,105,110,103,32,116,104,101,32,102,105,108,101,32,101,120,105,116,115,46,32,84,104,101,32,100,101,97,100,32,102,105,108,101,32,112,114,111,99,101,115,115,32,99,97,110,32,104,97,110,103,32,105,102,32,97,32,112,114,111,99,101,115,115,32,116,114,105,101,115,32,116,111,32,97,99,99,101,115,115,32,105,116,32,108,97,116,101,114,46,32,84,104,105,115,32,119,105,108,108,32,98,101,32,102,105,120,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]},{h2,[],[<<83,101,101,32,65,108,115,111>>]},{p,[],[{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,102,105,108,101,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,105,108,101,110,97,109,101,40,51,41>>]}]}]}]},#{name => <<102,105,108,101>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,102,105,108,101,46,120,109,108],types => #{{date_time,0} => {attribute,123,type,{date_time,{remote_type,123,[{atom,123,calendar},{atom,123,datetime},[]]},[]}},{deep_list,0} => {attribute,101,type,{deep_list,{type,101,list,[{type,101,union,[{type,101,char,[]},{type,101,atom,[]},{user_type,101,deep_list,[]}]}]},[]}},{delete_option,0} => {attribute,126,type,{delete_option,{atom,126,raw},[]}},{fd,0} => {attribute,87,type,{fd,{type,87,record,[{atom,87,file_descriptor}]},[]}},{file_info,0} => {attribute,86,type,{file_info,{type,86,record,[{atom,86,file_info}]},[]}},{file_info_option,0} => {attribute,129,type,{file_info_option,{type,129,union,[{type,129,tuple,[{atom,129,time},{atom,129,local}]},{type,129,tuple,[{atom,129,time},{atom,129,universal}]},{type,130,tuple,[{atom,130,time},{atom,130,posix}]},{atom,130,raw}]},[]}},{filename,0} => {attribute,84,type,{filename,{type,84,string,[]},[]}},{filename_all,0} => {attribute,85,type,{filename_all,{type,85,union,[{type,85,string,[]},{type,85,binary,[]}]},[]}},{io_device,0} => {attribute,88,type,{io_device,{type,88,union,[{type,88,pid,[]},{user_type,88,fd,[]}]},[]}},{location,0} => {attribute,89,type,{location,{type,89,union,[{type,89,integer,[]},{type,89,tuple,[{atom,89,bof},{ann_type,89,[{var,89,'Offset'},{type,89,integer,[]}]}]},{type,90,tuple,[{atom,90,cur},{ann_type,90,[{var,90,'Offset'},{type,90,integer,[]}]}]},{type,91,tuple,[{atom,91,eof},{ann_type,91,[{var,91,'Offset'},{type,91,integer,[]}]}]},{atom,91,bof},{atom,91,cur},{atom,91,eof}]},[]}},{mode,0} => {attribute,92,type,{mode,{type,92,union,[{atom,92,read},{atom,92,write},{atom,92,append},{atom,93,exclusive},{atom,93,raw},{atom,93,binary},{type,94,tuple,[{atom,94,delayed_write},{ann_type,95,[{var,95,'Size'},{type,95,non_neg_integer,[]}]},{ann_type,96,[{var,96,'Delay'},{type,96,non_neg_integer,[]}]}]},{atom,97,delayed_write},{type,97,tuple,[{atom,97,read_ahead},{ann_type,97,[{var,97,'Size'},{type,97,pos_integer,[]}]}]},{atom,98,read_ahead},{atom,98,compressed},{type,99,tuple,[{atom,99,encoding},{remote_type,99,[{atom,99,unicode},{atom,99,encoding},[]]}]},{atom,100,sync}]},[]}},{name,0} => {attribute,102,type,{name,{type,102,union,[{type,102,string,[]},{type,102,atom,[]},{user_type,102,deep_list,[]}]},[]}},{name_all,0} => {attribute,103,type,{name_all,{type,103,union,[{type,103,string,[]},{type,103,atom,[]},{user_type,103,deep_list,[]},{ann_type,103,[{var,103,'RawFilename'},{type,103,binary,[]}]}]},[]}},{posix,0} => {attribute,104,type,{posix,{type,105,union,[{atom,105,eacces},{atom,105,eagain},{atom,106,ebadf},{atom,106,ebadmsg},{atom,106,ebusy},{atom,107,edeadlk},{atom,107,edeadlock},{atom,107,edquot},{atom,108,eexist},{atom,109,efault},{atom,109,efbig},{atom,109,eftype},{atom,110,eintr},{atom,110,einval},{atom,110,eio},{atom,110,eisdir},{atom,111,eloop},{atom,112,emfile},{atom,112,emlink},{atom,112,emultihop},{atom,113,enametoolong},{atom,113,enfile},{atom,114,enobufs},{atom,114,enodev},{atom,114,enolck},{atom,114,enolink},{atom,114,enoent},{atom,115,enomem},{atom,115,enospc},{atom,115,enosr},{atom,115,enostr},{atom,115,enosys},{atom,116,enotblk},{atom,116,enotdir},{atom,116,enotsup},{atom,116,enxio},{atom,117,eopnotsupp},{atom,117,eoverflow},{atom,118,eperm},{atom,118,epipe},{atom,119,erange},{atom,119,erofs},{atom,120,espipe},{atom,120,esrch},{atom,120,estale},{atom,121,etxtbsy},{atom,122,exdev}]},[]}},{posix_file_advise,0} => {attribute,124,type,{posix_file_advise,{type,124,union,[{atom,124,normal},{atom,124,sequential},{atom,124,random},{atom,125,no_reuse},{atom,125,will_need},{atom,125,dont_need}]},[]}},{sendfile_option,0} => {attribute,127,type,{sendfile_option,{type,127,union,[{type,127,tuple,[{atom,127,chunk_size},{type,127,non_neg_integer,[]}]},{type,128,tuple,[{atom,128,use_threads},{type,128,boolean,[]}]}]},[]}}}},[{{function,advise,4},[{file,[102,105,108,101,46,101,114,108]},{location,565}],[<<97,100,118,105,115,101,47,52>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<112,111,115,105,120,95,102,105,108,101,95,97,100,118,105,115,101>>}],[]}]},{p,[],[{code,[],[<<97,100,118,105,115,101,47,52>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,110,110,111,117,110,99,101,32,97,110,32,105,110,116,101,110,116,105,111,110,32,116,111,32,97,99,99,101,115,115,32,102,105,108,101,32,100,97,116,97,32,105,110,32,97,32,115,112,101,99,105,102,105,99,32,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,102,117,116,117,114,101,44,32,116,104,117,115,32,97,108,108,111,119,105,110,103,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,116,111,32,112,101,114,102,111,114,109,32,97,112,112,114,111,112,114,105,97,116,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,46>>]},{p,[],[<<79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,109,105,103,104,116,32,104,97,118,101,32,110,111,32,101,102,102,101,99,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,56>>,signature => [{attribute,565,spec,{{advise,4},[{type,565,bounded_fun,[{type,565,'fun',[{type,565,product,[{var,565,'IoDevice'},{var,565,'Offset'},{var,565,'Length'},{var,565,'Advise'}]},{type,565,union,[{atom,565,ok},{type,565,tuple,[{atom,565,error},{var,565,'Reason'}]}]}]},[{type,566,constraint,[{atom,566,is_subtype},[{var,566,'IoDevice'},{user_type,566,io_device,[]}]]},{type,567,constraint,[{atom,567,is_subtype},[{var,567,'Offset'},{type,567,integer,[]}]]},{type,568,constraint,[{atom,568,is_subtype},[{var,568,'Length'},{type,568,integer,[]}]]},{type,569,constraint,[{atom,569,is_subtype},[{var,569,'Advise'},{user_type,569,posix_file_advise,[]}]]},{type,570,constraint,[{atom,570,is_subtype},[{var,570,'Reason'},{type,570,union,[{user_type,570,posix,[]},{atom,570,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,allocate,3},[{file,[102,105,108,101,46,101,114,108]},{location,579}],[<<97,108,108,111,99,97,116,101,47,51>>],#{<<101,110>> => [{p,[],[{code,[],[<<97,108,108,111,99,97,116,101,47,51>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,112,114,101,97,108,108,111,99,97,116,101,32,115,112,97,99,101,32,102,111,114,32,97,32,102,105,108,101,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,111,110,108,121,32,115,117,99,99,101,101,100,115,32,105,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,112,114,111,118,105,100,101,32,116,104,105,115,32,102,101,97,116,117,114,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,57>>,signature => [{attribute,579,spec,{{allocate,3},[{type,579,bounded_fun,[{type,579,'fun',[{type,579,product,[{var,579,'File'},{var,579,'Offset'},{var,579,'Length'}]},{type,580,union,[{atom,580,ok},{type,580,tuple,[{atom,580,error},{user_type,580,posix,[]}]}]}]},[{type,581,constraint,[{atom,581,is_subtype},[{var,581,'File'},{user_type,581,io_device,[]}]]},{type,582,constraint,[{atom,582,is_subtype},[{var,582,'Offset'},{type,582,non_neg_integer,[]}]]},{type,583,constraint,[{atom,583,is_subtype},[{var,583,'Length'},{type,583,non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,change_group,2},[{file,[102,105,108,101,46,101,114,108]},{location,1249}],[<<99,104,97,110,103,101,95,103,114,111,117,112,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,103,114,111,117,112,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,56>>,signature => [{attribute,1249,spec,{{change_group,2},[{type,1249,bounded_fun,[{type,1249,'fun',[{type,1249,product,[{var,1249,'Filename'},{var,1249,'Gid'}]},{type,1249,union,[{atom,1249,ok},{type,1249,tuple,[{atom,1249,error},{var,1249,'Reason'}]}]}]},[{type,1250,constraint,[{atom,1250,is_subtype},[{var,1250,'Filename'},{user_type,1250,name_all,[]}]]},{type,1251,constraint,[{atom,1251,is_subtype},[{var,1251,'Gid'},{type,1251,integer,[]}]]},{type,1252,constraint,[{atom,1252,is_subtype},[{var,1252,'Reason'},{type,1252,union,[{user_type,1252,posix,[]},{atom,1252,badarg}]}]]}]]}]}}]}},{{function,change_mode,2},[{file,[102,105,108,101,46,101,114,108]},{location,1221}],[<<99,104,97,110,103,101,95,109,111,100,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,112,101,114,109,105,115,115,105,111,110,115,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,49,54>>,signature => [{attribute,1221,spec,{{change_mode,2},[{type,1221,bounded_fun,[{type,1221,'fun',[{type,1221,product,[{var,1221,'Filename'},{var,1221,'Mode'}]},{type,1221,union,[{atom,1221,ok},{type,1221,tuple,[{atom,1221,error},{var,1221,'Reason'}]}]}]},[{type,1222,constraint,[{atom,1222,is_subtype},[{var,1222,'Filename'},{user_type,1222,name_all,[]}]]},{type,1223,constraint,[{atom,1223,is_subtype},[{var,1223,'Mode'},{type,1223,integer,[]}]]},{type,1224,constraint,[{atom,1224,is_subtype},[{var,1224,'Reason'},{type,1224,union,[{user_type,1224,posix,[]},{atom,1224,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,change_owner,2},[{file,[102,105,108,101,46,101,114,108]},{location,1230}],[<<99,104,97,110,103,101,95,111,119,110,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,111,119,110,101,114,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,50,52>>,signature => [{attribute,1230,spec,{{change_owner,2},[{type,1230,bounded_fun,[{type,1230,'fun',[{type,1230,product,[{var,1230,'Filename'},{var,1230,'Uid'}]},{type,1230,union,[{atom,1230,ok},{type,1230,tuple,[{atom,1230,error},{var,1230,'Reason'}]}]}]},[{type,1231,constraint,[{atom,1231,is_subtype},[{var,1231,'Filename'},{user_type,1231,name_all,[]}]]},{type,1232,constraint,[{atom,1232,is_subtype},[{var,1232,'Uid'},{type,1232,integer,[]}]]},{type,1233,constraint,[{atom,1233,is_subtype},[{var,1233,'Reason'},{type,1233,union,[{user_type,1233,posix,[]},{atom,1233,badarg}]}]]}]]}]}}]}},{{function,change_owner,3},[{file,[102,105,108,101,46,101,114,108]},{location,1239}],[<<99,104,97,110,103,101,95,111,119,110,101,114,47,51>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,111,119,110,101,114,32,97,110,100,32,103,114,111,117,112,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,51,50>>,signature => [{attribute,1239,spec,{{change_owner,3},[{type,1239,bounded_fun,[{type,1239,'fun',[{type,1239,product,[{var,1239,'Filename'},{var,1239,'Uid'},{var,1239,'Gid'}]},{type,1239,union,[{atom,1239,ok},{type,1239,tuple,[{atom,1239,error},{var,1239,'Reason'}]}]}]},[{type,1240,constraint,[{atom,1240,is_subtype},[{var,1240,'Filename'},{user_type,1240,name_all,[]}]]},{type,1241,constraint,[{atom,1241,is_subtype},[{var,1241,'Uid'},{type,1241,integer,[]}]]},{type,1242,constraint,[{atom,1242,is_subtype},[{var,1242,'Gid'},{type,1242,integer,[]}]]},{type,1243,constraint,[{atom,1243,is_subtype},[{var,1243,'Reason'},{type,1243,union,[{user_type,1243,posix,[]},{atom,1243,badarg}]}]]}]]}]}}]}},{{function,change_time,2},[{file,[102,105,108,101,46,101,114,108]},{location,1258}],[<<99,104,97,110,103,101,95,116,105,109,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,97,99,99,101,115,115,32,116,105,109,101,115,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,52,48>>,signature => [{attribute,1258,spec,{{change_time,2},[{type,1258,bounded_fun,[{type,1258,'fun',[{type,1258,product,[{var,1258,'Filename'},{var,1258,'Mtime'}]},{type,1258,union,[{atom,1258,ok},{type,1258,tuple,[{atom,1258,error},{var,1258,'Reason'}]}]}]},[{type,1259,constraint,[{atom,1259,is_subtype},[{var,1259,'Filename'},{user_type,1259,name_all,[]}]]},{type,1260,constraint,[{atom,1260,is_subtype},[{var,1260,'Mtime'},{user_type,1260,date_time,[]}]]},{type,1261,constraint,[{atom,1261,is_subtype},[{var,1261,'Reason'},{type,1261,union,[{user_type,1261,posix,[]},{atom,1261,badarg}]}]]}]]}]}}]}},{{function,change_time,3},[{file,[102,105,108,101,46,101,114,108]},{location,1268}],[<<99,104,97,110,103,101,95,116,105,109,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,108,97,115,116,32,97,99,99,101,115,115,32,116,105,109,101,115,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,52,56>>,signature => [{attribute,1268,spec,{{change_time,3},[{type,1268,bounded_fun,[{type,1268,'fun',[{type,1268,product,[{var,1268,'Filename'},{var,1268,'Atime'},{var,1268,'Mtime'}]},{type,1268,union,[{atom,1268,ok},{type,1268,tuple,[{atom,1268,error},{var,1268,'Reason'}]}]}]},[{type,1269,constraint,[{atom,1269,is_subtype},[{var,1269,'Filename'},{user_type,1269,name_all,[]}]]},{type,1270,constraint,[{atom,1270,is_subtype},[{var,1270,'Atime'},{user_type,1270,date_time,[]}]]},{type,1271,constraint,[{atom,1271,is_subtype},[{var,1271,'Mtime'},{user_type,1271,date_time,[]}]]},{type,1272,constraint,[{atom,1272,is_subtype},[{var,1272,'Reason'},{type,1272,union,[{user_type,1272,posix,[]},{atom,1272,badarg}]}]]}]]}]}}]}},{{function,close,1},[{file,[102,105,108,101,46,101,114,108]},{location,546}],[<<99,108,111,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,108,111,115,101,115,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,73,116,32,109,111,115,116,108,121,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<44,32,101,120,99,101,112,116,32,102,111,114,32,115,111,109,101,32,115,101,118,101,114,101,32,101,114,114,111,114,115,32,115,117,99,104,32,97,115,32,111,117,116,32,111,102,32,109,101,109,111,114,121,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]},<<32,119,97,115,32,117,115,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,44,32>>,{code,[],[<<99,108,111,115,101,47,49>>]},<<32,99,97,110,32,114,101,116,117,114,110,32,97,110,32,111,108,100,32,119,114,105,116,101,32,101,114,114,111,114,32,97,110,100,32,110,111,116,32,101,118,101,110,32,116,114,121,32,116,111,32,99,108,111,115,101,32,116,104,101,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,53,54>>,signature => [{attribute,546,spec,{{close,1},[{type,546,bounded_fun,[{type,546,'fun',[{type,546,product,[{var,546,'IoDevice'}]},{type,546,union,[{atom,546,ok},{type,546,tuple,[{atom,546,error},{var,546,'Reason'}]}]}]},[{type,547,constraint,[{atom,547,is_subtype},[{var,547,'IoDevice'},{user_type,547,io_device,[]}]]},{type,548,constraint,[{atom,548,is_subtype},[{var,548,'Reason'},{type,548,union,[{user_type,548,posix,[]},{atom,548,badarg},{atom,548,terminated}]}]]}]]}]}}]}},{{function,consult,1},[{file,[102,105,108,101,46,101,114,108]},{location,1025}],[<<99,111,110,115,117,108,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,69,114,108,97,110,103,32,116,101,114,109,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,44,32,102,114,111,109,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,84,101,114,109,115,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,116,101,114,109,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,84,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,44,32,117,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<46>>]}]}]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<102,46,116,120,116,58,32,32,123,112,101,114,115,111,110,44,32,34,107,97,108,108,101,34,44,32,50,53,125,46,10,32,32,32,32,32,32,32,32,123,112,101,114,115,111,110,44,32,34,112,101,108,108,101,34,44,32,51,48,125,46>>]}]},{pre,[],[{code,[],[<<49,62,32,102,105,108,101,58,99,111,110,115,117,108,116,40,34,102,46,116,120,116,34,41,46,10,123,111,107,44,91,123,112,101,114,115,111,110,44,34,107,97,108,108,101,34,44,50,53,125,44,123,112,101,114,115,111,110,44,34,112,101,108,108,101,34,44,51,48,125,93,125>>]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,54,57>>,signature => [{attribute,1025,spec,{{consult,1},[{type,1025,bounded_fun,[{type,1025,'fun',[{type,1025,product,[{var,1025,'Filename'}]},{type,1025,union,[{type,1025,tuple,[{atom,1025,ok},{var,1025,'Terms'}]},{type,1025,tuple,[{atom,1025,error},{var,1025,'Reason'}]}]}]},[{type,1026,constraint,[{atom,1026,is_subtype},[{var,1026,'Filename'},{user_type,1026,name_all,[]}]]},{type,1027,constraint,[{atom,1027,is_subtype},[{var,1027,'Terms'},{type,1027,list,[{type,1027,term,[]}]}]]},{type,1028,constraint,[{atom,1028,is_subtype},[{var,1028,'Reason'},{type,1028,union,[{user_type,1028,posix,[]},{atom,1028,badarg},{atom,1028,terminated},{atom,1028,system_limit},{type,1029,tuple,[{ann_type,1029,[{var,1029,'Line'},{type,1029,integer,[]}]},{ann_type,1029,[{var,1029,'Mod'},{type,1029,module,[]}]},{ann_type,1029,[{var,1029,'Term'},{type,1029,term,[]}]}]}]}]]}]]}]}}]}},{{function,copy,3},[{file,[102,105,108,101,46,101,114,108]},{location,788}],[<<99,111,112,121,47,51>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,48,55>>,equiv => {function,copy,2},signature => [{attribute,788,spec,{{copy,3},[{type,788,bounded_fun,[{type,788,'fun',[{type,788,product,[{var,788,'Source'},{var,788,'Destination'},{var,788,'ByteCount'}]},{type,789,union,[{type,789,tuple,[{atom,789,ok},{var,789,'BytesCopied'}]},{type,789,tuple,[{atom,789,error},{var,789,'Reason'}]}]}]},[{type,790,constraint,[{atom,790,is_subtype},[{var,790,'Source'},{type,790,union,[{user_type,790,io_device,[]},{var,790,'Filename'},{type,790,tuple,[{var,790,'Filename'},{var,790,'Modes'}]}]}]]},{type,791,constraint,[{atom,791,is_subtype},[{var,791,'Destination'},{type,791,union,[{user_type,791,io_device,[]},{var,791,'Filename'},{type,791,tuple,[{var,791,'Filename'},{var,791,'Modes'}]}]}]]},{type,792,constraint,[{atom,792,is_subtype},[{var,792,'Filename'},{user_type,792,name_all,[]}]]},{type,793,constraint,[{atom,793,is_subtype},[{var,793,'Modes'},{type,793,list,[{user_type,793,mode,[]}]}]]},{type,794,constraint,[{atom,794,is_subtype},[{var,794,'ByteCount'},{type,794,union,[{type,794,non_neg_integer,[]},{atom,794,infinity}]}]]},{type,795,constraint,[{atom,795,is_subtype},[{var,795,'BytesCopied'},{type,795,non_neg_integer,[]}]]},{type,796,constraint,[{atom,796,is_subtype},[{var,796,'Reason'},{type,796,union,[{user_type,796,posix,[]},{atom,796,badarg},{atom,796,terminated}]}]]}]]}]}}]}},{{function,copy,2},[{file,[102,105,108,101,46,101,114,108]},{location,777}],[<<99,111,112,121,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,112,105,101,115,32>>,{code,[],[<<66,121,116,101,67,111,117,110,116>>]},<<32,98,121,116,101,115,32,102,114,111,109,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,116,111,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<46,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,114,101,102,101,114,32,116,111,32,101,105,116,104,101,114,32,102,105,108,101,110,97,109,101,115,32,111,114,32,73,79,32,100,101,118,105,99,101,115,32,102,114,111,109,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<111,112,101,110,47,50>>]},<<46,32>>,{code,[],[<<66,121,116,101,67,111,117,110,116>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<105,110,102,105,110,105,116,121>>]},<<44,32,100,101,110,111,116,105,110,103,32,97,110,32,105,110,102,105,110,105,116,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,111,100,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,111,115,115,105,98,108,101,32,109,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<44,32,97,110,100,32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<91,93>>]},<<46>>]},{p,[],[<<73,102,32,98,111,116,104,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,114,101,102,101,114,32,116,111,32,102,105,108,101,110,97,109,101,115,44,32,116,104,101,32,102,105,108,101,115,32,97,114,101,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<91,114,101,97,100,44,32,98,105,110,97,114,121,93>>]},<<32,97,110,100,32>>,{code,[],[<<91,119,114,105,116,101,44,32,98,105,110,97,114,121,93>>]},<<32,112,114,101,112,101,110,100,101,100,32,116,111,32,116,104,101,105,114,32,109,111,100,101,32,108,105,115,116,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,116,111,32,111,112,116,105,109,105,122,101,32,116,104,101,32,99,111,112,121,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,102,105,108,101,110,97,109,101,44,32,105,116,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<114,101,97,100>>]},<<32,109,111,100,101,32,112,114,101,112,101,110,100,101,100,32,116,111,32,116,104,101,32,109,111,100,101,32,108,105,115,116,32,98,101,102,111,114,101,32,116,104,101,32,99,111,112,121,44,32,97,110,100,32,99,108,111,115,101,100,32,119,104,101,110,32,100,111,110,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,102,105,108,101,110,97,109,101,44,32,105,116,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,109,111,100,101,32,112,114,101,112,101,110,100,101,100,32,116,111,32,116,104,101,32,109,111,100,101,32,108,105,115,116,32,98,101,102,111,114,101,32,116,104,101,32,99,111,112,121,44,32,97,110,100,32,99,108,111,115,101,100,32,119,104,101,110,32,100,111,110,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,121,116,101,115,67,111,112,105,101,100,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<66,121,116,101,115,67,111,112,105,101,100>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,116,104,97,116,32,119,97,115,32,99,111,112,105,101,100,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<66,121,116,101,67,111,117,110,116>>]},<<32,105,102,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,32,111,110,32,116,104,101,32,115,111,117,114,99,101,46,32,73,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58,32,97,115,32,102,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<32,105,102,32,97,32,102,105,108,101,32,104,97,100,32,116,111,32,98,101,32,111,112,101,110,101,100,44,32,97,110,100,32,97,115,32,102,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,48,55>>,signature => [{attribute,777,spec,{{copy,2},[{type,777,bounded_fun,[{type,777,'fun',[{type,777,product,[{var,777,'Source'},{var,777,'Destination'}]},{type,777,union,[{type,777,tuple,[{atom,777,ok},{var,777,'BytesCopied'}]},{type,777,tuple,[{atom,777,error},{var,777,'Reason'}]}]}]},[{type,778,constraint,[{atom,778,is_subtype},[{var,778,'Source'},{type,778,union,[{user_type,778,io_device,[]},{var,778,'Filename'},{type,778,tuple,[{var,778,'Filename'},{var,778,'Modes'}]}]}]]},{type,779,constraint,[{atom,779,is_subtype},[{var,779,'Destination'},{type,779,union,[{user_type,779,io_device,[]},{var,779,'Filename'},{type,779,tuple,[{var,779,'Filename'},{var,779,'Modes'}]}]}]]},{type,780,constraint,[{atom,780,is_subtype},[{var,780,'Filename'},{user_type,780,name_all,[]}]]},{type,781,constraint,[{atom,781,is_subtype},[{var,781,'Modes'},{type,781,list,[{user_type,781,mode,[]}]}]]},{type,782,constraint,[{atom,782,is_subtype},[{var,782,'BytesCopied'},{type,782,non_neg_integer,[]}]]},{type,783,constraint,[{atom,783,is_subtype},[{var,783,'Reason'},{type,783,union,[{user_type,783,posix,[]},{atom,783,badarg},{atom,783,terminated}]}]]}]]}]}}]}},{{function,datasync,1},[{file,[102,105,108,101,46,101,114,108]},{location,731}],[<<100,97,116,97,115,121,110,99,47,49>>],#{<<101,110>> => [{p,[],[<<69,110,115,117,114,101,115,32,116,104,97,116,32,97,110,121,32,98,117,102,102,101,114,115,32,107,101,112,116,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,40,110,111,116,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,114,101,32,119,114,105,116,116,101,110,32,116,111,32,100,105,115,107,46,32,73,110,32,109,97,110,121,32,119,97,121,115,32,105,116,32,114,101,115,101,109,98,108,101,115,32>>,{code,[],[<<102,115,121,110,99>>]},<<32,98,117,116,32,105,116,32,100,111,101,115,32,110,111,116,32,117,112,100,97,116,101,32,115,111,109,101,32,111,102,32,116,104,101,32,109,101,116,97,100,97,116,97,32,111,102,32,116,104,101,32,102,105,108,101,44,32,115,117,99,104,32,97,115,32,116,104,101,32,97,99,99,101,115,115,32,116,105,109,101,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46>>]},{p,[],[<<65,112,112,108,105,99,97,116,105,111,110,115,32,116,104,97,116,32,97,99,99,101,115,115,32,100,97,116,97,98,97,115,101,115,32,111,114,32,108,111,103,32,102,105,108,101,115,32,111,102,116,101,110,32,119,114,105,116,101,32,97,32,116,105,110,121,32,100,97,116,97,32,102,114,97,103,109,101,110,116,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,111,110,101,32,108,105,110,101,32,105,110,32,97,32,108,111,103,32,102,105,108,101,41,32,97,110,100,32,116,104,101,110,32,99,97,108,108,32>>,{code,[],[<<102,115,121,110,99,40,41>>]},<<32,105,109,109,101,100,105,97,116,101,108,121,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,119,114,105,116,116,101,110,32,100,97,116,97,32,105,115,32,112,104,121,115,105,99,97,108,108,121,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,97,114,100,32,100,105,115,107,46,32,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32>>,{code,[],[<<102,115,121,110,99,40,41>>]},<<32,97,108,119,97,121,115,32,105,110,105,116,105,97,116,101,115,32,116,119,111,32,119,114,105,116,101,32,111,112,101,114,97,116,105,111,110,115,58,32,111,110,101,32,102,111,114,32,116,104,101,32,110,101,119,108,121,32,119,114,105,116,116,101,110,32,100,97,116,97,32,97,110,100,32,97,110,111,116,104,101,114,32,111,110,101,32,116,111,32,117,112,100,97,116,101,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,115,116,111,114,101,100,32,105,110,32,116,104,101,32>>,{code,[],[<<105,110,111,100,101>>]},<<46,32,73,102,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,105,115,32,110,111,116,32,97,32,112,97,114,116,32,111,102,32,116,104,101,32,116,114,97,110,115,97,99,116,105,111,110,32,99,111,110,99,101,112,116,44,32>>,{code,[],[<<102,100,97,116,97,115,121,110,99,40,41>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,118,111,105,100,32,117,110,110,101,99,101,115,115,97,114,121,32>>,{code,[],[<<105,110,111,100,101>>]},<<32,100,105,115,107,32,119,114,105,116,101,32,111,112,101,114,97,116,105,111,110,115,46>>]},{p,[],[<<65,118,97,105,108,97,98,108,101,32,111,110,108,121,32,105,110,32,115,111,109,101,32,80,79,83,73,88,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,99,97,108,108,32,114,101,115,117,108,116,115,32,105,110,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<102,115,121,110,99,40,41>>]},<<44,32,111,114,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,105,110,32,115,121,115,116,101,109,115,32,110,111,116,32,112,114,111,118,105,100,105,110,103,32,116,104,101,32>>,{code,[],[<<102,100,97,116,97,115,121,110,99,40,41>>]},<<32,115,121,115,99,97,108,108,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,52,53>>,signature => [{attribute,731,spec,{{datasync,1},[{type,731,bounded_fun,[{type,731,'fun',[{type,731,product,[{var,731,'IoDevice'}]},{type,731,union,[{atom,731,ok},{type,731,tuple,[{atom,731,error},{var,731,'Reason'}]}]}]},[{type,732,constraint,[{atom,732,is_subtype},[{var,732,'IoDevice'},{user_type,732,io_device,[]}]]},{type,733,constraint,[{atom,733,is_subtype},[{var,733,'Reason'},{type,733,union,[{user_type,733,posix,[]},{atom,733,badarg},{atom,733,terminated}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,del_dir,1},[{file,[102,105,108,101,46,101,114,108]},{location,256}],[<<100,101,108,95,100,105,114,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,100,101,108,101,116,101,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<68,105,114>>]},<<46,32,84,104,101,32,100,105,114,101,99,116,111,114,121,32,109,117,115,116,32,98,101,32,101,109,112,116,121,32,98,101,102,111,114,101,32,105,116,32,99,97,110,32,98,101,32,100,101,108,101,116,101,100,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,105,115,32,110,111,116,32,101,109,112,116,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[<<65,116,116,101,109,112,116,32,116,111,32,100,101,108,101,116,101,32,116,104,101,32,99,117,114,114,101,110,116,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,97,99,99,101,115>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,54,56>>,signature => [{attribute,256,spec,{{del_dir,1},[{type,256,bounded_fun,[{type,256,'fun',[{type,256,product,[{var,256,'Dir'}]},{type,256,union,[{atom,256,ok},{type,256,tuple,[{atom,256,error},{var,256,'Reason'}]}]}]},[{type,257,constraint,[{atom,257,is_subtype},[{var,257,'Dir'},{user_type,257,name_all,[]}]]},{type,258,constraint,[{atom,258,is_subtype},[{var,258,'Reason'},{type,258,union,[{user_type,258,posix,[]},{atom,258,badarg}]}]]}]]}]}}]}},{{function,del_dir_r,1},[{file,[102,105,108,101,46,101,114,108]},{location,263}],[<<100,101,108,95,100,105,114,95,114,47,49>>],#{<<101,110>> => [{p,[],[<<68,101,108,101,116,101,115,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<70,105,108,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,105,108,101>>]},<<32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,44,32,105,116,115,32,99,111,110,116,101,110,116,115,32,105,115,32,102,105,114,115,116,32,114,101,99,117,114,115,105,118,101,108,121,32,100,101,108,101,116,101,100,46,32,82,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<111,107>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,101,114,97,116,105,111,110,32,99,111,109,112,108,101,116,101,100,32,119,105,116,104,111,117,116,32,101,114,114,111,114,115,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,112,111,115,105,120,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,97,99,99,101,115,115,105,110,103,32,111,114,32,100,101,108,101,116,105,110,103,32>>,{code,[],[<<70,105,108,101>>]},<<46,32,73,102,32,115,111,109,101,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32,117,110,100,101,114,32>>,{code,[],[<<70,105,108,101>>]},<<32,99,111,117,108,100,32,110,111,116,32,98,101,32,100,101,108,101,116,101,100,44,32>>,{code,[],[<<70,105,108,101>>]},<<32,99,97,110,110,111,116,32,98,101,32,100,101,108,101,116,101,100,32,97,115,32,105,116,32,105,115,32,110,111,110,45,101,109,112,116,121,44,32,97,110,100,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,101,120,105,115,116,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,48,52>>,signature => [{attribute,263,spec,{{del_dir_r,1},[{type,263,bounded_fun,[{type,263,'fun',[{type,263,product,[{var,263,'File'}]},{type,263,union,[{atom,263,ok},{type,263,tuple,[{atom,263,error},{var,263,'Reason'}]}]}]},[{type,264,constraint,[{atom,264,is_subtype},[{var,264,'File'},{user_type,264,name_all,[]}]]},{type,265,constraint,[{atom,265,is_subtype},[{var,265,'Reason'},{type,265,union,[{user_type,265,posix,[]},{atom,265,badarg}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,delete,2},[{file,[102,105,108,101,46,101,114,108]},{location,221}],[<<100,101,108,101,116,101,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,50,54>>,equiv => {function,delete,1},signature => [{attribute,221,spec,{{delete,2},[{type,221,bounded_fun,[{type,221,'fun',[{type,221,product,[{var,221,'Filename'},{var,221,'Opts'}]},{type,221,union,[{atom,221,ok},{type,221,tuple,[{atom,221,error},{var,221,'Reason'}]}]}]},[{type,222,constraint,[{atom,222,is_subtype},[{var,222,'Filename'},{user_type,222,name_all,[]}]]},{type,223,constraint,[{atom,223,is_subtype},[{var,223,'Opts'},{type,223,list,[{user_type,223,delete_option,[]}]}]]},{type,224,constraint,[{atom,224,is_subtype},[{var,224,'Reason'},{type,224,union,[{user_type,224,posix,[]},{atom,224,badarg}]}]]}]]}]}}]}},{{function,delete,1},[{file,[102,105,108,101,46,101,114,108]},{location,214}],[<<100,101,108,101,116,101,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,101,108,101,116,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<84,114,105,101,115,32,116,111,32,100,101,108,101,116,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,105,110,32,112,97,114,116,105,99,117,108,97,114,32,100,117,114,105,110,103,32,116,104,101,32,101,97,114,108,121,32,98,111,111,116,32,115,116,97,103,101,32,119,104,101,110,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,121,101,116,32,114,101,103,105,115,116,101,114,101,100,44,32,116,111,32,115,116,105,108,108,32,98,101,32,97,98,108,101,32,116,111,32,100,101,108,101,116,101,32,108,111,99,97,108,32,102,105,108,101,115,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,116,104,101,32,102,105,108,101,32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,115,46>>]}]},{dt,[],[{code,[],[<<101,112,101,114,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,32,97,110,100,32,116,104,101,32,117,115,101,114,32,105,115,32,110,111,116,32,115,117,112,101,114,117,115,101,114,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,104,97,115,32,97,110,32,105,109,112,114,111,112,101,114,32,116,121,112,101,44,32,115,117,99,104,32,97,115,32,116,117,112,108,101,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,44,32,97,32,98,97,100,32,116,121,112,101,32,102,111,114,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,119,105,108,108,32,112,114,111,98,97,98,108,121,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,50,54>>,signature => [{attribute,214,spec,{{delete,1},[{type,214,bounded_fun,[{type,214,'fun',[{type,214,product,[{var,214,'Filename'}]},{type,214,union,[{atom,214,ok},{type,214,tuple,[{atom,214,error},{var,214,'Reason'}]}]}]},[{type,215,constraint,[{atom,215,is_subtype},[{var,215,'Filename'},{user_type,215,name_all,[]}]]},{type,216,constraint,[{atom,216,is_subtype},[{var,216,'Reason'},{type,216,union,[{user_type,216,posix,[]},{atom,216,badarg}]}]]}]]}]}}]}},{{function,eval,1},[{file,[102,105,108,101,46,101,114,108]},{location,1065}],[<<101,118,97,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,32,102,114,111,109,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,84,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,32,105,115,32,110,111,116,32,114,101,116,117,114,110,101,100,59,32,97,110,121,32,101,120,112,114,101,115,115,105,111,110,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,102,105,108,101,32,109,117,115,116,32,98,101,32,116,104,101,114,101,32,102,111,114,32,105,116,115,32,115,105,100,101,32,101,102,102,101,99,116,46,32,82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<111,107>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,119,97,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,84,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,44,32,117,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,54,57>>,signature => [{attribute,1065,spec,{{eval,1},[{type,1065,bounded_fun,[{type,1065,'fun',[{type,1065,product,[{var,1065,'Filename'}]},{type,1065,union,[{atom,1065,ok},{type,1065,tuple,[{atom,1065,error},{var,1065,'Reason'}]}]}]},[{type,1066,constraint,[{atom,1066,is_subtype},[{var,1066,'Filename'},{user_type,1066,name_all,[]}]]},{type,1067,constraint,[{atom,1067,is_subtype},[{var,1067,'Reason'},{type,1067,union,[{user_type,1067,posix,[]},{atom,1067,badarg},{atom,1067,terminated},{atom,1067,system_limit},{type,1068,tuple,[{ann_type,1068,[{var,1068,'Line'},{type,1068,integer,[]}]},{ann_type,1068,[{var,1068,'Mod'},{type,1068,module,[]}]},{ann_type,1068,[{var,1068,'Term'},{type,1068,term,[]}]}]}]}]]}]]}]}}]}},{{function,eval,2},[{file,[102,105,108,101,46,101,114,108]},{location,1073}],[<<101,118,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<101,118,97,108,47,49>>]},<<44,32,98,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,32>>,{code,[],[<<66,105,110,100,105,110,103,115>>]},<<32,97,114,101,32,117,115,101,100,32,105,110,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,101,114,108,95,101,118,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,101,118,97,108,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,48,51>>,signature => [{attribute,1073,spec,{{eval,2},[{type,1073,bounded_fun,[{type,1073,'fun',[{type,1073,product,[{var,1073,'Filename'},{var,1073,'Bindings'}]},{type,1073,union,[{atom,1073,ok},{type,1073,tuple,[{atom,1073,error},{var,1073,'Reason'}]}]}]},[{type,1074,constraint,[{atom,1074,is_subtype},[{var,1074,'Filename'},{user_type,1074,name_all,[]}]]},{type,1075,constraint,[{atom,1075,is_subtype},[{var,1075,'Bindings'},{remote_type,1075,[{atom,1075,erl_eval},{atom,1075,binding_struct},[]]}]]},{type,1076,constraint,[{atom,1076,is_subtype},[{var,1076,'Reason'},{type,1076,union,[{user_type,1076,posix,[]},{atom,1076,badarg},{atom,1076,terminated},{atom,1076,system_limit},{type,1077,tuple,[{ann_type,1077,[{var,1077,'Line'},{type,1077,integer,[]}]},{ann_type,1077,[{var,1077,'Mod'},{type,1077,module,[]}]},{ann_type,1077,[{var,1077,'Term'},{type,1077,term,[]}]}]}]}]]}]]}]}}]}},{{function,format_error,1},[{file,[102,105,108,101,46,101,114,108]},{location,146}],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<71,105,118,101,110,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,114,101,116,117,114,110,101,100,32,98,121,32,97,110,121,32,102,117,110,99,116,105,111,110,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,114,101,116,117,114,110,115,32,97,32,100,101,115,99,114,105,112,116,105,118,101,32,115,116,114,105,110,103,32,111,102,32,116,104,101,32,101,114,114,111,114,32,105,110,32,69,110,103,108,105,115,104,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,49,51>>,signature => [{attribute,146,spec,{{format_error,1},[{type,146,bounded_fun,[{type,146,'fun',[{type,146,product,[{var,146,'Reason'}]},{var,146,'Chars'}]},[{type,147,constraint,[{atom,147,is_subtype},[{var,147,'Reason'},{type,147,union,[{user_type,147,posix,[]},{atom,147,badarg},{atom,147,terminated},{atom,147,system_limit},{type,148,tuple,[{ann_type,148,[{var,148,'Line'},{type,148,integer,[]}]},{ann_type,148,[{var,148,'Mod'},{type,148,module,[]}]},{ann_type,148,[{var,148,'Term'},{type,148,term,[]}]}]}]}]]},{type,149,constraint,[{atom,149,is_subtype},[{var,149,'Chars'},{type,149,string,[]}]]}]]}]}}]}},{{function,get_cwd,0},[{file,[102,105,108,101,46,101,114,108]},{location,191}],[<<103,101,116,95,99,119,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,68,105,114,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,32,111,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,110,32,114,97,114,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,110,32,102,97,105,108,32,111,110,32,85,110,105,120,46,32,73,116,32,99,97,110,32,111,99,99,117,114,32,105,102,32,114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,100,105,114,101,99,116,111,114,121,46>>]}]},{p,[],[<<65,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,100,105,114,101,99,116,111,114,121,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,50,49>>,signature => [{attribute,191,spec,{{get_cwd,0},[{type,191,bounded_fun,[{type,191,'fun',[{type,191,product,[]},{type,191,union,[{type,191,tuple,[{atom,191,ok},{var,191,'Dir'}]},{type,191,tuple,[{atom,191,error},{var,191,'Reason'}]}]}]},[{type,192,constraint,[{atom,192,is_subtype},[{var,192,'Dir'},{user_type,192,filename,[]}]]},{type,193,constraint,[{atom,193,is_subtype},[{var,193,'Reason'},{user_type,193,posix,[]}]]}]]}]}}]}},{{function,get_cwd,1},[{file,[102,105,108,101,46,101,114,108]},{location,198}],[<<103,101,116,95,99,119,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,68,105,114,125>>]},<<32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,100,114,105,118,101,46>>]},{p,[],[{code,[],[<<68,114,105,118,101>>]},<<32,105,115,32,116,111,32,98,101,32,111,102,32,116,104,101,32,102,111,114,109,32,34>>,{code,[],[<<76,101,116,116,101,114>>]},{code,[],[<<58>>]},<<34,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,34,99,58,34,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,116,115,117,112,125>>]},<<32,111,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,104,97,118,101,32,110,111,32,99,111,110,99,101,112,116,32,111,102,32,99,117,114,114,101,110,116,32,100,114,105,118,101,32,40,85,110,105,120,44,32,102,111,114,32,101,120,97,109,112,108,101,41,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,104,97,115,32,110,111,32,99,111,110,99,101,112,116,32,111,102,32,100,114,105,118,101,115,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,114,105,118,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,111,114,109,97,116,32,111,102,32>>,{code,[],[<<68,114,105,118,101>>]},<<32,105,115,32,105,110,118,97,108,105,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,52,51>>,signature => [{attribute,198,spec,{{get_cwd,1},[{type,198,bounded_fun,[{type,198,'fun',[{type,198,product,[{var,198,'Drive'}]},{type,198,union,[{type,198,tuple,[{atom,198,ok},{var,198,'Dir'}]},{type,198,tuple,[{atom,198,error},{var,198,'Reason'}]}]}]},[{type,199,constraint,[{atom,199,is_subtype},[{var,199,'Drive'},{type,199,string,[]}]]},{type,200,constraint,[{atom,200,is_subtype},[{var,200,'Dir'},{user_type,200,filename,[]}]]},{type,201,constraint,[{atom,201,is_subtype},[{var,201,'Reason'},{type,201,union,[{user_type,201,posix,[]},{atom,201,badarg}]}]]}]]}]}}]}},{{function,list_dir,1},[{file,[102,105,108,101,46,101,114,108]},{location,401}],[<<108,105,115,116,95,100,105,114,47,49>>],#{<<101,110>> => [{p,[],[<<76,105,115,116,115,32,97,108,108,32,102,105,108,101,115,32,105,110,32,97,32,100,105,114,101,99,116,111,114,121,44,32>>,{em,[],[<<101,120,99,101,112,116>>]},<<32,102,105,108,101,115,32,119,105,116,104,32,114,97,119,32,102,105,108,101,110,97,109,101,115,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,115,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,110,97,109,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,116,104,101,32,102,105,108,101,115,32,105,110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,46,32,84,104,101,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,115,111,114,116,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32>>,{code,[],[<<68,105,114>>]},<<32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<123,110,111,95,116,114,97,110,115,108,97,116,105,111,110,44,32,70,105,108,101,110,97,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,32>>,{code,[],[<<98,105,110,97,114,121,40,41>>]},<<32,119,105,116,104,32,99,104,97,114,97,99,116,101,114,115,32,99,111,100,101,100,32,105,110,32,73,83,79,32,76,97,116,105,110,45,49,32,97,110,100,32,116,104,101,32,86,77,32,119,97,115,32,115,116,97,114,116,101,100,32,119,105,116,104,32,112,97,114,97,109,101,116,101,114,32>>,{code,[],[<<43,102,110,117,101>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,55,52>>,signature => [{attribute,401,spec,{{list_dir,1},[{type,401,bounded_fun,[{type,401,'fun',[{type,401,product,[{var,401,'Dir'}]},{type,401,union,[{type,401,tuple,[{atom,401,ok},{var,401,'Filenames'}]},{type,401,tuple,[{atom,401,error},{var,401,'Reason'}]}]}]},[{type,402,constraint,[{atom,402,is_subtype},[{var,402,'Dir'},{user_type,402,name_all,[]}]]},{type,403,constraint,[{atom,403,is_subtype},[{var,403,'Filenames'},{type,403,list,[{user_type,403,filename,[]}]}]]},{type,404,constraint,[{atom,404,is_subtype},[{var,404,'Reason'},{type,404,union,[{user_type,404,posix,[]},{atom,405,badarg},{type,406,tuple,[{atom,406,no_translation},{ann_type,406,[{var,406,'Filename'},{remote_type,406,[{atom,406,unicode},{atom,406,latin1_binary},[]]}]}]}]}]]}]]}]}}]}},{{function,list_dir_all,1},[{file,[102,105,108,101,46,101,114,108]},{location,411}],[<<108,105,115,116,95,100,105,114,95,97,108,108,47,49>>],#{<<101,110>> => [{p,[],[{a,[{id,<<108,105,115,116,95,100,105,114,95,97,108,108>>}],[]},<<76,105,115,116,115,32,97,108,108,32,116,104,101,32,102,105,108,101,115,32,105,110,32,97,32,100,105,114,101,99,116,111,114,121,44,32,105,110,99,108,117,100,105,110,103,32,102,105,108,101,115,32,119,105,116,104,32,114,97,119,32,102,105,108,101,110,97,109,101,115,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,115,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,110,97,109,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,116,104,101,32,102,105,108,101,115,32,105,110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,46,32,84,104,101,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,115,111,114,116,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32>>,{code,[],[<<68,105,114>>]},<<32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,48,53>>,signature => [{attribute,411,spec,{{list_dir_all,1},[{type,411,bounded_fun,[{type,411,'fun',[{type,411,product,[{var,411,'Dir'}]},{type,411,union,[{type,411,tuple,[{atom,411,ok},{var,411,'Filenames'}]},{type,411,tuple,[{atom,411,error},{var,411,'Reason'}]}]}]},[{type,412,constraint,[{atom,412,is_subtype},[{var,412,'Dir'},{user_type,412,name_all,[]}]]},{type,413,constraint,[{atom,413,is_subtype},[{var,413,'Filenames'},{type,413,list,[{user_type,413,filename_all,[]}]}]]},{type,414,constraint,[{atom,414,is_subtype},[{var,414,'Reason'},{type,414,union,[{user_type,414,posix,[]},{atom,414,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,make_dir,1},[{file,[102,105,108,101,46,101,114,108]},{location,249}],[<<109,97,107,101,95,100,105,114,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,99,114,101,97,116,101,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<68,105,114>>]},<<46,32,77,105,115,115,105,110,103,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,99,114,101,97,116,101,100,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,100,32>>,{code,[],[<<68,105,114>>]},<<32,101,120,105,115,116,115,32,97,108,114,101,97,100,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,99,101,32,105,115,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,51,48>>,signature => [{attribute,249,spec,{{make_dir,1},[{type,249,bounded_fun,[{type,249,'fun',[{type,249,product,[{var,249,'Dir'}]},{type,249,union,[{atom,249,ok},{type,249,tuple,[{atom,249,error},{var,249,'Reason'}]}]}]},[{type,250,constraint,[{atom,250,is_subtype},[{var,250,'Dir'},{user_type,250,name_all,[]}]]},{type,251,constraint,[{atom,251,is_subtype},[{var,251,'Reason'},{type,251,union,[{user_type,251,posix,[]},{atom,251,badarg}]}]]}]]}]}}]}},{{function,make_link,2},[{file,[102,105,108,101,46,101,114,108]},{location,427}],[<<109,97,107,101,95,108,105,110,107,47,50>>],#{<<101,110>> => [{p,[],[<<77,97,107,101,115,32,97,32,104,97,114,100,32,108,105,110,107,32,102,114,111,109,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,116,111,32>>,{code,[],[<<78,101,119>>]},<<32,111,110,32,112,108,97,116,102,111,114,109,115,32,115,117,112,112,111,114,116,105,110,103,32,108,105,110,107,115,32,40,85,110,105,120,32,97,110,100,32,87,105,110,100,111,119,115,41,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,116,104,101,32,108,105,110,107,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,114,101,97,116,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32,108,105,110,107,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,101,110,111,116,115,117,112,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,111,114,32>>,{code,[],[<<78,101,119>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[{code,[],[<<78,101,119>>]},<<32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<72,97,114,100,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,54,52>>,signature => [{attribute,427,spec,{{make_link,2},[{type,427,bounded_fun,[{type,427,'fun',[{type,427,product,[{var,427,'Existing'},{var,427,'New'}]},{type,427,union,[{atom,427,ok},{type,427,tuple,[{atom,427,error},{var,427,'Reason'}]}]}]},[{type,428,constraint,[{atom,428,is_subtype},[{var,428,'Existing'},{user_type,428,name_all,[]}]]},{type,429,constraint,[{atom,429,is_subtype},[{var,429,'New'},{user_type,429,name_all,[]}]]},{type,430,constraint,[{atom,430,is_subtype},[{var,430,'Reason'},{type,430,union,[{user_type,430,posix,[]},{atom,430,badarg}]}]]}]]}]}}]}},{{function,make_symlink,2},[{file,[102,105,108,101,46,101,114,108]},{location,435}],[<<109,97,107,101,95,115,121,109,108,105,110,107,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32>>,{code,[],[<<78,101,119>>]},<<32,116,111,32,116,104,101,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,111,110,32,112,108,97,116,102,111,114,109,115,32,115,117,112,112,111,114,116,105,110,103,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,32,40,109,111,115,116,32,85,110,105,120,32,115,121,115,116,101,109,115,32,97,110,100,32,87,105,110,100,111,119,115,44,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,86,105,115,116,97,41,46,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,116,104,101,32,108,105,110,107,32,105,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,114,101,97,116,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,116,115,117,112,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,111,114,32>>,{code,[],[<<78,101,119>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[{code,[],[<<78,101,119>>]},<<32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]},{dt,[],[{code,[],[<<101,112,101,114,109>>]}]},{dd,[],[{p,[],[<<85,115,101,114,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,112,114,105,118,105,108,101,103,101,115,32,116,111,32,99,114,101,97,116,101,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,32,40>>,{code,[],[<<83,101,67,114,101,97,116,101,83,121,109,98,111,108,105,99,76,105,110,107,80,114,105,118,105,108,101,103,101>>]},<<32,111,110,32,87,105,110,100,111,119,115,41,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,57,51>>,signature => [{attribute,435,spec,{{make_symlink,2},[{type,435,bounded_fun,[{type,435,'fun',[{type,435,product,[{var,435,'Existing'},{var,435,'New'}]},{type,435,union,[{atom,435,ok},{type,435,tuple,[{atom,435,error},{var,435,'Reason'}]}]}]},[{type,436,constraint,[{atom,436,is_subtype},[{var,436,'Existing'},{user_type,436,name_all,[]}]]},{type,437,constraint,[{atom,437,is_subtype},[{var,437,'New'},{user_type,437,name_all,[]}]]},{type,438,constraint,[{atom,438,is_subtype},[{var,438,'Reason'},{type,438,union,[{user_type,438,posix,[]},{atom,438,badarg}]}]]}]]}]}}]}},{{function,native_name_encoding,0},[{file,[102,105,108,101,46,101,114,108]},{location,135}],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>],#{<<101,110>> => [{p,[],[{a,[{id,<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103>>}],[]},<<82,101,116,117,114,110,115,32,116,104,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,109,111,100,101,46,32,73,102,32,105,116,32,105,115,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,116,104,101,32,115,121,115,116,101,109,32,116,114,97,110,115,108,97,116,101,115,32,110,111,32,102,105,108,101,110,97,109,101,115,46,32,73,102,32,105,116,32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<44,32,102,105,108,101,110,97,109,101,115,32,97,114,101,32,99,111,110,118,101,114,116,101,100,32,98,97,99,107,32,97,110,100,32,102,111,114,116,104,32,116,111,32,116,104,101,32,110,97,116,105,118,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,40,117,115,117,97,108,108,121,32,85,84,70,45,56,44,32,98,117,116,32,85,84,70,45,49,54,32,111,110,32,87,105,110,100,111,119,115,41,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,55,50,57>>,signature => [{attribute,135,spec,{{native_name_encoding,0},[{type,135,'fun',[{type,135,product,[]},{type,135,union,[{atom,135,latin1},{atom,135,utf8}]}]}]}}],since => <<79,84,80,32,82,49,52,66,48,49>>}},{{function,open,2},[{file,[102,105,108,101,46,101,114,108]},{location,510}],[<<111,112,101,110,47,50>>],#{<<101,110>> => [{p,[],[<<79,112,101,110,115,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101>>]},<<32,105,110,32,116,104,101,32,109,111,100,101,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32>>,{code,[],[<<77,111,100,101,115>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,99,111,110,116,97,105,110,32,111,110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<114,101,97,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,44,32,119,104,105,99,104,32,109,117,115,116,32,101,120,105,115,116,44,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,114,101,97,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<119,114,105,116,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46,32,73,116,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,73,102,32,116,104,101,32,102,105,108,101,32,101,120,105,115,116,115,32,97,110,100,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,105,115,32,110,111,116,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{code,[],[<<114,101,97,100>>]},<<44,32,116,104,101,32,102,105,108,101,32,105,115,32,116,114,117,110,99,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<97,112,112,101,110,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46,32,73,116,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,69,118,101,114,121,32,119,114,105,116,101,32,111,112,101,114,97,116,105,111,110,32,116,111,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<97,112,112,101,110,100>>]},<<32,116,97,107,101,115,32,112,108,97,99,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<101,120,99,108,117,115,105,118,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46,32,73,116,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,73,102,32,116,104,101,32,102,105,108,101,32,101,120,105,115,116,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,101,120,105,115,116,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,100,111,101,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,32,101,120,99,108,117,115,105,118,101,110,101,115,115,32,111,110,32,102,105,108,101,32,115,121,115,116,101,109,115,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32>>,{code,[],[<<79,95,69,88,67,76>>]},<<32,112,114,111,112,101,114,108,121,44,32,115,117,99,104,32,97,115,32,78,70,83,46,32,68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,115,117,112,112,111,114,116,115,32,105,116,32,40,105,110,32,103,101,110,101,114,97,108,44,32,108,111,99,97,108,32,102,105,108,101,32,115,121,115,116,101,109,115,32,97,114,101,32,115,97,102,101,41,46>>]}]}]},{dt,[],[{code,[],[<<114,97,119>>]}]},{dd,[],[{p,[],[{a,[{id,<<114,97,119>>}],[]},<<65,108,108,111,119,115,32,102,97,115,116,101,114,32,97,99,99,101,115,115,32,116,111,32,97,32,102,105,108,101,44,32,97,115,32,110,111,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,101,101,100,101,100,32,116,111,32,104,97,110,100,108,101,32,116,104,101,32,102,105,108,101,46,32,72,111,119,101,118,101,114,44,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32,116,104,105,115,32,119,97,121,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,108,105,109,105,116,97,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32>>,{code,[],[<<105,111>>]},<<32,109,111,100,117,108,101,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,44,32,97,115,32,116,104,101,121,32,99,97,110,32,111,110,108,121,32,116,97,108,107,32,116,111,32,97,110,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,32,73,110,115,116,101,97,100,44,32,117,115,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<46>>]}]},{li,[],[{p,[],[<<69,115,112,101,99,105,97,108,108,121,32,105,102,32>>,{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]},<<32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,111,110,32,97,32>>,{code,[],[<<114,97,119>>]},<<32,102,105,108,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,109,98,105,110,101,32,116,104,105,115,32,111,112,116,105,111,110,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,97,115,32,108,105,110,101,45,111,114,105,101,110,116,101,100,32,73,47,79,32,105,115,32,105,110,101,102,102,105,99,105,101,110,116,32,119,105,116,104,111,117,116,32,98,117,102,102,101,114,105,110,103,46>>]}]},{li,[],[{p,[],[<<79,110,108,121,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,116,104,97,116,32,111,112,101,110,101,100,32,116,104,101,32,102,105,108,101,32,99,97,110,32,117,115,101,32,105,116,46>>]}]},{li,[],[{p,[],[<<65,32,114,101,109,111,116,101,32,69,114,108,97,110,103,32,102,105,108,101,32,115,101,114,118,101,114,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,46,32,84,104,101,32,99,111,109,112,117,116,101,114,32,111,110,32,119,104,105,99,104,32,116,104,101,32,69,114,108,97,110,103,32,110,111,100,101,32,105,115,32,114,117,110,110,105,110,103,32,109,117,115,116,32,104,97,118,101,32,97,99,99,101,115,115,32,116,111,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,40,100,105,114,101,99,116,108,121,32,111,114,32,116,104,114,111,117,103,104,32,78,70,83,41,46>>]}]}]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,111,112,101,114,97,116,105,111,110,115,32,111,110,32,116,104,101,32,102,105,108,101,32,114,101,116,117,114,110,32,98,105,110,97,114,105,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,108,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<123,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,83,105,122,101,44,32,68,101,108,97,121,125>>]}]},{dd,[],[{p,[],[<<68,97,116,97,32,105,110,32,115,117,98,115,101,113,117,101,110,116,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,32,105,115,32,98,117,102,102,101,114,101,100,32,117,110,116,105,108,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,32,97,114,101,32,98,117,102,102,101,114,101,100,44,32,111,114,32,117,110,116,105,108,32,116,104,101,32,111,108,100,101,115,116,32,98,117,102,102,101,114,101,100,32,100,97,116,97,32,105,115,32>>,{code,[],[<<68,101,108,97,121>>]},<<32,109,105,108,108,105,115,101,99,111,110,100,115,32,111,108,100,46,32,84,104,101,110,32,97,108,108,32,98,117,102,102,101,114,101,100,32,100,97,116,97,32,105,115,32,119,114,105,116,116,101,110,32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,46,32,84,104,101,32,98,117,102,102,101,114,101,100,32,100,97,116,97,32,105,115,32,97,108,115,111,32,102,108,117,115,104,101,100,32,98,101,102,111,114,101,32,115,111,109,101,32,111,116,104,101,114,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,32,116,104,97,110,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,105,115,32,101,120,101,99,117,116,101,100,46>>]},{p,[],[<<84,104,101,32,112,117,114,112,111,115,101,32,111,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,116,111,32,105,110,99,114,101,97,115,101,32,112,101,114,102,111,114,109,97,110,99,101,32,98,121,32,114,101,100,117,99,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,115,46,32,84,104,117,115,44,32,116,104,101,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,32,109,117,115,116,32,98,101,32,102,111,114,32,115,105,122,101,115,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<44,32,97,110,100,32,110,111,116,32,105,110,116,101,114,115,112,101,114,115,101,100,32,98,121,32,116,111,111,32,109,97,110,121,32,111,116,104,101,114,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,115,46>>]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,117,115,101,100,44,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,32,99,97,110,32,112,114,101,109,97,116,117,114,101,108,121,32,98,101,32,114,101,112,111,114,116,101,100,32,97,115,32,115,117,99,99,101,115,115,102,117,108,44,32,97,110,100,32,105,102,32,97,32,119,114,105,116,101,32,101,114,114,111,114,32,111,99,99,117,114,115,44,32,116,104,101,32,101,114,114,111,114,32,105,115,32,114,101,112,111,114,116,101,100,32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,110,101,120,116,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,110,111,116,32,101,120,101,99,117,116,101,100,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32>>,{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]},<<32,105,115,32,117,115,101,100,44,32,97,102,116,101,114,32,97,32,110,117,109,98,101,114,32,111,102,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,44,32>>,{code,[],[<<99,108,111,115,101,47,49>>]},<<32,99,97,110,32,114,101,116,117,114,110,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,115,112,99,125>>]},<<44,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111,116,32,101,110,111,117,103,104,32,115,112,97,99,101,32,111,110,32,116,104,101,32,100,105,115,99,32,102,111,114,32,112,114,101,118,105,111,117,115,108,121,32,119,114,105,116,116,101,110,32,100,97,116,97,46,32>>,{code,[],[<<99,108,111,115,101,47,49>>]},<<32,109,117,115,116,32,112,114,111,98,97,98,108,121,32,98,101,32,99,97,108,108,101,100,32,97,103,97,105,110,44,32,97,115,32,116,104,101,32,102,105,108,101,32,105,115,32,115,116,105,108,108,32,111,112,101,110,46>>]}]},{dt,[],[{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<123,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,83,105,122,101,44,32,68,101,108,97,121,125>>]},<<32,119,105,116,104,32,114,101,97,115,111,110,97,98,108,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<83,105,122,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,108,97,121>>]},<<32,40,114,111,117,103,104,108,121,32,115,111,109,101,32,54,52,32,75,66,44,32,50,32,115,101,99,111,110,100,115,41,46>>]}]},{dt,[],[{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<65,99,116,105,118,97,116,101,115,32,114,101,97,100,32,100,97,116,97,32,98,117,102,102,101,114,105,110,103,46,32,73,102,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,99,97,108,108,115,32,97,114,101,32,102,111,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,44,32,114,101,97,100,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,97,114,101,32,115,116,105,108,108,32,112,101,114,102,111,114,109,101,100,32,102,111,114,32,98,108,111,99,107,115,32,111,102,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,46,32,84,104,101,32,101,120,116,114,97,32,100,97,116,97,32,105,115,32,98,117,102,102,101,114,101,100,32,97,110,100,32,114,101,116,117,114,110,101,100,32,105,110,32,115,117,98,115,101,113,117,101,110,116,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,99,97,108,108,115,44,32,103,105,118,105,110,103,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,103,97,105,110,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,115,32,105,115,32,114,101,100,117,99,101,100,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<114,101,97,100,95,97,104,101,97,100>>]},<<32,98,117,102,102,101,114,32,105,115,32,97,108,115,111,32,104,105,103,104,108,121,32,117,115,101,100,32,98,121,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]},<<32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,44,32,116,104,101,114,101,102,111,114,101,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,40,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,114,101,97,115,111,110,115,41,32,119,104,101,110,32,97,99,99,101,115,115,105,110,103,32,114,97,119,32,102,105,108,101,115,32,117,115,105,110,103,32,116,104,97,116,32,102,117,110,99,116,105,111,110,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,99,97,108,108,115,32,97,114,101,32,102,111,114,32,115,105,122,101,115,32,110,111,116,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,108,101,115,115,32,116,104,97,110,44,32,111,114,32,101,118,101,110,32,103,114,101,97,116,101,114,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,44,32,110,111,32,112,101,114,102,111,114,109,97,110,99,101,32,103,97,105,110,32,99,97,110,32,98,101,32,101,120,112,101,99,116,101,100,46>>]}]},{dt,[],[{code,[],[<<114,101,97,100,95,97,104,101,97,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,119,105,116,104,32,97,32,114,101,97,115,111,110,97,98,108,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<83,105,122,101>>]},<<32,40,114,111,117,103,104,108,121,32,115,111,109,101,32,54,52,32,75,66,41,46>>]}]},{dt,[],[{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,103,122,105,112,32,99,111,109,112,114,101,115,115,101,100,32,102,105,108,101,115,46,32,79,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,109,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{code,[],[<<114,101,97,100>>]},<<32,111,114,32>>,{code,[],[<<119,114,105,116,101>>]},<<44,32,98,117,116,32,110,111,116,32,98,111,116,104,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,102,105,108,101,32,115,105,122,101,32,111,98,116,97,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>]}]},<<32,100,111,101,115,32,112,114,111,98,97,98,108,121,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,97,100,32,102,114,111,109,32,97,32,99,111,109,112,114,101,115,115,101,100,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,110,99,111,100,105,110,103,44,32,69,110,99,111,100,105,110,103,125>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,116,104,101,32,102,105,108,101,32,112,101,114,102,111,114,109,32,97,117,116,111,109,97,116,105,99,32,116,114,97,110,115,108,97,116,105,111,110,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,111,32,97,110,100,32,102,114,111,109,32,97,32,115,112,101,99,105,102,105,99,32,40,85,110,105,99,111,100,101,41,32,101,110,99,111,100,105,110,103,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,100,97,116,97,32,115,117,112,112,108,105,101,100,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<32,111,114,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,115,116,105,108,108,32,105,115,32,98,121,116,101,45,111,114,105,101,110,116,101,100,59,32,116,104,105,115,32,111,112,116,105,111,110,32,100,101,110,111,116,101,115,32,111,110,108,121,32,104,111,119,32,100,97,116,97,32,105,115,32,115,116,111,114,101,100,32,105,110,32,116,104,101,32,100,105,115,107,32,102,105,108,101,46>>]},{p,[],[<<68,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,100,105,102,102,101,114,101,110,116,32,109,101,116,104,111,100,115,32,111,102,32,114,101,97,100,105,110,103,32,97,110,100,32,119,114,105,116,105,110,103,32,100,97,116,97,32,105,115,32,112,114,101,102,101,114,114,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,105,109,112,108,105,101,115,32,117,115,105,110,103,32,116,104,105,115,32,109,111,100,117,108,101,32,40>>,{code,[],[<<102,105,108,101>>]},<<41,32,102,111,114,32,114,101,97,100,105,110,103,32,97,110,100,32,119,114,105,116,105,110,103,32,100,97,116,97,32,97,115,32,116,104,101,32,105,110,116,101,114,102,97,99,101,115,32,112,114,111,118,105,100,101,100,32,104,101,114,101,32,119,111,114,107,32,119,105,116,104,32,98,121,116,101,45,111,114,105,101,110,116,101,100,32,100,97,116,97,46,32,85,115,105,110,103,32,111,116,104,101,114,32,40,85,110,105,99,111,100,101,41,32,101,110,99,111,100,105,110,103,115,32,109,97,107,101,115,32,116,104,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,102,117,110,99,116,105,111,110,115,32>>,{code,[],[<<103,101,116,95,99,104,97,114,115>>]},<<44,32>>,{code,[],[<<103,101,116,95,108,105,110,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<112,117,116,95,99,104,97,114,115>>]},<<32,109,111,114,101,32,115,117,105,116,97,98,108,101,44,32,97,115,32,116,104,101,121,32,99,97,110,32,119,111,114,107,32,119,105,116,104,32,116,104,101,32,102,117,108,108,32,85,110,105,99,111,100,101,32,114,97,110,103,101,46>>]},{p,[],[<<73,102,32,100,97,116,97,32,105,115,32,115,101,110,116,32,116,111,32,97,110,32>>,{code,[],[<<105,111,95,100,101,118,105,99,101,40,41>>]},<<32,105,110,32,97,32,102,111,114,109,97,116,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,116,111,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,101,110,99,111,100,105,110,103,44,32,111,114,32,105,102,32,100,97,116,97,32,105,115,32,114,101,97,100,32,98,121,32,97,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,114,101,116,117,114,110,115,32,100,97,116,97,32,105,110,32,97,32,102,111,114,109,97,116,32,116,104,97,116,32,99,97,110,110,111,116,32,99,111,112,101,32,119,105,116,104,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,114,97,110,103,101,32,111,102,32,116,104,101,32,100,97,116,97,44,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,97,110,100,32,116,104,101,32,102,105,108,101,32,105,115,32,99,108,111,115,101,100,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<108,97,116,105,110,49>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,101,110,99,111,100,105,110,103,46,32,66,121,116,101,115,32,115,117,112,112,108,105,101,100,32,116,111,32,116,104,101,32,102,105,108,101,44,32,116,104,97,116,32,105,115,44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<32,97,114,101,32,119,114,105,116,116,101,110,32,34,97,115,32,105,115,34,32,111,110,32,116,104,101,32,102,105,108,101,46,32,76,105,107,101,119,105,115,101,44,32,98,121,116,101,115,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,44,32,116,104,97,116,32,105,115,44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,97,114,101,32,114,101,116,117,114,110,101,100,32,34,97,115,32,105,115,34,46,32,73,102,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,105,115,32,117,115,101,100,32,102,111,114,32,119,114,105,116,105,110,103,44,32,116,104,101,32,102,105,108,101,32,99,97,110,32,111,110,108,121,32,99,111,112,101,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,117,112,32,116,111,32,99,111,100,101,32,112,111,105,110,116,32,50,53,53,32,40,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,41,46>>]}]},{dt,[],[{code,[],[<<117,110,105,99,111,100,101,32,111,114,32,117,116,102,56>>]}]},{dd,[],[{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,97,114,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,97,110,100,32,102,114,111,109,32,85,84,70,45,56,32,101,110,99,111,100,105,110,103,32,98,101,102,111,114,101,32,116,104,101,121,32,97,114,101,32,119,114,105,116,116,101,110,32,116,111,32,111,114,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46,32,65,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32,116,104,105,115,32,119,97,121,32,99,97,110,32,98,101,32,114,101,97,100,97,98,108,101,32,117,115,105,110,103,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<44,32,97,115,32,108,111,110,103,32,97,115,32,110,111,32,100,97,116,97,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,102,105,108,101,32,108,105,101,115,32,98,101,121,111,110,100,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,32,40,48,46,46,50,53,53,41,44,32,98,117,116,32,102,97,105,108,117,114,101,32,111,99,99,117,114,115,32,105,102,32,116,104,101,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,85,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,98,101,121,111,110,100,32,116,104,97,116,32,114,97,110,103,101,46,32,84,104,101,32,102,105,108,101,32,105,115,32,98,101,115,116,32,114,101,97,100,32,119,105,116,104,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,97,119,97,114,101,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<46>>]},{p,[],[<<66,121,116,101,115,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,102,105,108,101,32,98,121,32,97,110,121,32,109,101,97,110,115,32,97,114,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,85,84,70,45,56,32,101,110,99,111,100,105,110,103,32,98,101,102,111,114,101,32,98,101,105,110,103,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,100,105,115,107,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<117,116,102,49,54,32,111,114,32,123,117,116,102,49,54,44,98,105,103,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,98,105,103,32,101,110,100,105,97,110,32,85,84,70,45,49,54,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]},{dt,[],[{code,[],[<<123,117,116,102,49,54,44,108,105,116,116,108,101,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,108,105,116,116,108,101,32,101,110,100,105,97,110,32,85,84,70,45,49,54,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]},{dt,[],[{code,[],[<<117,116,102,51,50,32,111,114,32,123,117,116,102,51,50,44,98,105,103,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,98,105,103,32,101,110,100,105,97,110,32,85,84,70,45,51,50,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]},{dt,[],[{code,[],[<<123,117,116,102,51,50,44,108,105,116,116,108,101,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,108,105,116,116,108,101,32,101,110,100,105,97,110,32,85,84,70,45,51,50,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]}]},{p,[],[<<84,104,101,32,69,110,99,111,100,105,110,103,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,102,111,114,32,97,32,102,105,108,101,32,34,111,110,32,116,104,101,32,102,108,121,34,32,98,121,32,117,115,105,110,103,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111,35,115,101,116,111,112,116,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,111,58,115,101,116,111,112,116,115,47,50>>]}]},<<46,32,83,111,32,97,32,102,105,108,101,32,99,97,110,32,98,101,32,97,110,97,108,121,122,101,100,32,105,110,32,108,97,116,105,110,49,32,101,110,99,111,100,105,110,103,32,102,111,114,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,66,79,77,44,32,112,111,115,105,116,105,111,110,101,100,32,98,101,121,111,110,100,32,116,104,101,32,66,79,77,32,97,110,100,32,116,104,101,110,32,98,101,32,115,101,116,32,102,111,114,32,116,104,101,32,114,105,103,104,116,32,101,110,99,111,100,105,110,103,32,98,101,102,111,114,101,32,102,117,114,116,104,101,114,32,114,101,97,100,105,110,103,46,32,70,111,114,32,102,117,110,99,116,105,111,110,115,32,105,100,101,110,116,105,102,121,105,110,103,32,66,79,77,115,44,32,115,101,101,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,117,110,105,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,105,99,111,100,101,40,51,41>>]}]},<<46>>]},{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,102,105,108,101,115,46>>]}]},{dt,[],[{code,[],[<<114,97,109>>]}]},{dd,[],[{p,[],[{code,[],[<<70,105,108,101>>]},<<32,109,117,115,116,32,98,101,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<46,32,82,101,116,117,114,110,115,32,97,110,32>>,{code,[],[<<102,100,40,41>>]},<<44,32,119,104,105,99,104,32,108,101,116,115,32,109,111,100,117,108,101,32>>,{code,[],[<<102,105,108,101>>]},<<32,111,112,101,114,97,116,101,32,111,110,32,116,104,101,32,100,97,116,97,32,105,110,45,109,101,109,111,114,121,32,97,115,32,105,102,32,105,116,32,105,115,32,97,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<115,121,110,99>>]}]},{dd,[],[{p,[],[<<79,110,32,112,108,97,116,102,111,114,109,115,32,115,117,112,112,111,114,116,105,110,103,32,105,116,44,32,101,110,97,98,108,101,115,32,116,104,101,32,80,79,83,73,88,32>>,{code,[],[<<79,95,83,89,78,67>>]},<<32,115,121,110,99,104,114,111,110,111,117,115,32,73,47,79,32,102,108,97,103,32,111,114,32,105,116,115,32,112,108,97,116,102,111,114,109,45,100,101,112,101,110,100,101,110,116,32,101,113,117,105,118,97,108,101,110,116,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<70,73,76,69,95,70,76,65,71,95,87,82,73,84,69,95,84,72,82,79,85,71,72>>]},<<32,111,110,32,87,105,110,100,111,119,115,41,32,115,111,32,116,104,97,116,32,119,114,105,116,101,115,32,116,111,32,116,104,101,32,102,105,108,101,32,98,108,111,99,107,32,117,110,116,105,108,32,116,104,101,32,100,97,116,97,32,105,115,32,112,104,121,115,105,99,97,108,108,121,32,119,114,105,116,116,101,110,32,116,111,32,100,105,115,107,46,32,72,111,119,101,118,101,114,44,32,98,101,32,97,119,97,114,101,32,116,104,97,116,32,116,104,101,32,101,120,97,99,116,32,115,101,109,97,110,116,105,99,115,32,111,102,32,116,104,105,115,32,102,108,97,103,32,100,105,102,102,101,114,32,102,114,111,109,32,112,108,97,116,102,111,114,109,32,116,111,32,112,108,97,116,102,111,114,109,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,110,111,110,101,32,111,102,32,76,105,110,117,120,32,111,114,32,87,105,110,100,111,119,115,32,103,117,97,114,97,110,116,101,101,115,32,116,104,97,116,32,97,108,108,32,102,105,108,101,32,109,101,116,97,100,97,116,97,32,97,114,101,32,97,108,115,111,32,119,114,105,116,116,101,110,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,32,114,101,116,117,114,110,115,46,32,70,111,114,32,112,114,101,99,105,115,101,32,115,101,109,97,110,116,105,99,115,44,32,99,104,101,99,107,32,116,104,101,32,100,101,116,97,105,108,115,32,111,102,32,121,111,117,114,32,112,108,97,116,102,111,114,109,32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,119,105,116,104,32,110,111,32,115,117,112,112,111,114,116,32,102,111,114,32,80,79,83,73,88,32>>,{code,[],[<<79,95,83,89,78,67>>]},<<32,111,114,32,101,113,117,105,118,97,108,101,110,116,44,32,117,115,101,32,111,102,32,116,104,101,32>>,{code,[],[<<115,121,110,99>>]},<<32,102,108,97,103,32,99,97,117,115,101,115,32>>,{code,[],[<<111,112,101,110>>]},<<32,116,111,32,114,101,116,117,114,110,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,116,115,117,112,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<100,105,114,101,99,116,111,114,121>>]}]},{dd,[],[{p,[],[<<65,108,108,111,119,115,32>>,{code,[],[<<111,112,101,110>>]},<<32,116,111,32,119,111,114,107,32,111,110,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]}]},{p,[],[<<82,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,73,111,68,101,118,105,99,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,109,111,100,101,46,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,46>>]}]}]},{p,[],[{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,105,115,32,114,101,97,108,108,121,32,116,104,101,32,112,105,100,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,110,100,108,101,115,32,116,104,101,32,102,105,108,101,46,32,84,104,105,115,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,111,114,105,103,105,110,97,108,108,121,32,111,112,101,110,101,100,32,116,104,101,32,102,105,108,101,32,40,116,104,101,32,111,119,110,101,114,32,112,114,111,99,101,115,115,41,46,32,73,102,32,116,104,101,32,111,119,110,101,114,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,44,32,116,104,101,32,102,105,108,101,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,105,116,115,101,108,102,32,116,101,114,109,105,110,97,116,101,115,32,116,111,111,46,32,65,110,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,116,104,105,115,32,99,97,108,108,32,99,97,110,32,98,101,32,117,115,101,100,32,97,115,32,97,110,32,97,114,103,117,109,101,110,116,32,116,111,32,116,104,101,32,73,47,79,32,102,117,110,99,116,105,111,110,115,32,40,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<41,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,110,32,112,114,101,118,105,111,117,115,32,118,101,114,115,105,111,110,115,32,111,102,32>>,{code,[],[<<102,105,108,101>>]},<<44,32,109,111,100,101,115,32,119,101,114,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,111,110,101,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<114,101,97,100>>]},<<44,32>>,{code,[],[<<119,114,105,116,101>>]},<<44,32,111,114,32>>,{code,[],[<<114,101,97,100,95,119,114,105,116,101>>]},<<32,105,110,115,116,101,97,100,32,111,102,32,97,32,108,105,115,116,46,32,84,104,105,115,32,105,115,32,115,116,105,108,108,32,97,108,108,111,119,101,100,32,102,111,114,32,114,101,97,115,111,110,115,32,111,102,32,98,97,99,107,119,97,114,100,115,32,99,111,109,112,97,116,105,98,105,108,105,116,121,44,32,98,117,116,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,110,101,119,32,99,111,100,101,46,32,65,108,115,111,32,110,111,116,101,32,116,104,97,116,32>>,{code,[],[<<114,101,97,100,95,119,114,105,116,101>>]},<<32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,97,32,109,111,100,101,32,108,105,115,116,46>>]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,114,101,97,100,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,115,101,97,114,99,104,105,110,103,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,97,109,101,100,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,44,32,111,114,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,116,115,101,108,102,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,32,105,102,32>>,{code,[],[<<100,105,114,101,99,116,111,114,121>>]},<<32,109,111,100,101,32,119,97,115,32,115,112,101,99,105,102,105,101,100,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<84,104,101,114,101,32,105,115,32,110,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,32,40,105,102,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,97,99,99,101,115,115,32,119,97,115,32,115,112,101,99,105,102,105,101,100,41,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,55,52,49>>,signature => [{attribute,510,spec,{{open,2},[{type,510,bounded_fun,[{type,510,'fun',[{type,510,product,[{var,510,'File'},{var,510,'Modes'}]},{type,510,union,[{type,510,tuple,[{atom,510,ok},{var,510,'IoDevice'}]},{type,510,tuple,[{atom,510,error},{var,510,'Reason'}]}]}]},[{type,511,constraint,[{atom,511,is_subtype},[{var,511,'File'},{type,511,union,[{var,511,'Filename'},{type,511,iodata,[]}]}]]},{type,512,constraint,[{atom,512,is_subtype},[{var,512,'Filename'},{user_type,512,name_all,[]}]]},{type,513,constraint,[{atom,513,is_subtype},[{var,513,'Modes'},{type,513,list,[{type,513,union,[{user_type,513,mode,[]},{atom,513,ram},{atom,513,directory}]}]}]]},{type,514,constraint,[{atom,514,is_subtype},[{var,514,'IoDevice'},{user_type,514,io_device,[]}]]},{type,515,constraint,[{atom,515,is_subtype},[{var,515,'Reason'},{type,515,union,[{user_type,515,posix,[]},{atom,515,badarg},{atom,515,system_limit}]}]]}]]}]}}]}},{{function,path_consult,2},[{file,[102,105,108,101,46,101,114,108]},{location,1041}],[<<112,97,116,104,95,99,111,110,115,117,108,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,114,101,97,100,115,32,69,114,108,97,110,103,32,116,101,114,109,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,84,101,114,109,115,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,114,101,97,100,46,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,116,101,114,109,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,48,50,57>>,signature => [{attribute,1041,spec,{{path_consult,2},[{type,1041,bounded_fun,[{type,1041,'fun',[{type,1041,product,[{var,1041,'Path'},{var,1041,'Filename'}]},{type,1041,union,[{type,1041,tuple,[{atom,1041,ok},{var,1041,'Terms'},{var,1041,'FullName'}]},{type,1041,tuple,[{atom,1041,error},{var,1041,'Reason'}]}]}]},[{type,1042,constraint,[{atom,1042,is_subtype},[{var,1042,'Path'},{type,1042,list,[{var,1042,'Dir'}]}]]},{type,1043,constraint,[{atom,1043,is_subtype},[{var,1043,'Dir'},{user_type,1043,name_all,[]}]]},{type,1044,constraint,[{atom,1044,is_subtype},[{var,1044,'Filename'},{user_type,1044,name_all,[]}]]},{type,1045,constraint,[{atom,1045,is_subtype},[{var,1045,'Terms'},{type,1045,list,[{type,1045,term,[]}]}]]},{type,1046,constraint,[{atom,1046,is_subtype},[{var,1046,'FullName'},{user_type,1046,filename_all,[]}]]},{type,1047,constraint,[{atom,1047,is_subtype},[{var,1047,'Reason'},{type,1047,union,[{user_type,1047,posix,[]},{atom,1047,badarg},{atom,1047,terminated},{atom,1047,system_limit},{type,1048,tuple,[{ann_type,1048,[{var,1048,'Line'},{type,1048,integer,[]}]},{ann_type,1048,[{var,1048,'Mod'},{type,1048,module,[]}]},{ann_type,1048,[{var,1048,'Term'},{type,1048,term,[]}]}]}]}]]}]]}]}}]}},{{function,path_eval,2},[{file,[102,105,108,101,46,101,114,108]},{location,1089}],[<<112,97,116,104,95,101,118,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,114,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46,32,84,104,101,32,114,101,115,117,108,116,32,111,102,32,101,118,97,108,117,97,116,105,111,110,32,105,115,32,110,111,116,32,114,101,116,117,114,110,101,100,59,32,97,110,121,32,101,120,112,114,101,115,115,105,111,110,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,102,105,108,101,32,109,117,115,116,32,98,101,32,116,104,101,114,101,32,102,111,114,32,105,116,115,32,115,105,100,101,32,101,102,102,101,99,116,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,48,55,49>>,signature => [{attribute,1089,spec,{{path_eval,2},[{type,1089,bounded_fun,[{type,1089,'fun',[{type,1089,product,[{var,1089,'Path'},{var,1089,'Filename'}]},{type,1089,union,[{type,1089,tuple,[{atom,1089,ok},{var,1089,'FullName'}]},{type,1089,tuple,[{atom,1089,error},{var,1089,'Reason'}]}]}]},[{type,1090,constraint,[{atom,1090,is_subtype},[{var,1090,'Path'},{type,1090,list,[{ann_type,1090,[{var,1090,'Dir'},{user_type,1090,name_all,[]}]}]}]]},{type,1091,constraint,[{atom,1091,is_subtype},[{var,1091,'Filename'},{user_type,1091,name_all,[]}]]},{type,1092,constraint,[{atom,1092,is_subtype},[{var,1092,'FullName'},{user_type,1092,filename_all,[]}]]},{type,1093,constraint,[{atom,1093,is_subtype},[{var,1093,'Reason'},{type,1093,union,[{user_type,1093,posix,[]},{atom,1093,badarg},{atom,1093,terminated},{atom,1093,system_limit},{type,1094,tuple,[{ann_type,1094,[{var,1094,'Line'},{type,1094,integer,[]}]},{ann_type,1094,[{var,1094,'Mod'},{type,1094,module,[]}]},{ann_type,1094,[{var,1094,'Term'},{type,1094,term,[]}]}]}]}]]}]]}]}}]}},{{function,path_open,3},[{file,[102,105,108,101,46,101,114,108]},{location,1194}],[<<112,97,116,104,95,111,112,101,110,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,111,112,101,110,115,32,116,104,101,32,102,105,108,101,32,105,110,32,116,104,101,32,109,111,100,101,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32>>,{code,[],[<<77,111,100,101,115>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,73,111,68,101,118,105,99,101,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,109,111,100,101,46,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,102,105,108,101,32,97,110,100,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,49,49,55>>,signature => [{attribute,1194,spec,{{path_open,3},[{type,1194,bounded_fun,[{type,1194,'fun',[{type,1194,product,[{var,1194,'Path'},{var,1194,'Filename'},{var,1194,'Modes'}]},{type,1195,union,[{type,1195,tuple,[{atom,1195,ok},{var,1195,'IoDevice'},{var,1195,'FullName'}]},{type,1195,tuple,[{atom,1195,error},{var,1195,'Reason'}]}]}]},[{type,1196,constraint,[{atom,1196,is_subtype},[{var,1196,'Path'},{type,1196,list,[{ann_type,1196,[{var,1196,'Dir'},{user_type,1196,name_all,[]}]}]}]]},{type,1197,constraint,[{atom,1197,is_subtype},[{var,1197,'Filename'},{user_type,1197,name_all,[]}]]},{type,1198,constraint,[{atom,1198,is_subtype},[{var,1198,'Modes'},{type,1198,list,[{type,1198,union,[{user_type,1198,mode,[]},{atom,1198,directory}]}]}]]},{type,1199,constraint,[{atom,1199,is_subtype},[{var,1199,'IoDevice'},{user_type,1199,io_device,[]}]]},{type,1200,constraint,[{atom,1200,is_subtype},[{var,1200,'FullName'},{user_type,1200,filename_all,[]}]]},{type,1201,constraint,[{atom,1201,is_subtype},[{var,1201,'Reason'},{type,1201,union,[{user_type,1201,posix,[]},{atom,1201,badarg},{atom,1201,system_limit}]}]]}]]}]}}]}},{{function,path_script,2},[{file,[102,105,108,101,46,101,114,108]},{location,1149}],[<<112,97,116,104,95,115,99,114,105,112,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,114,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,86,97,108,117,101,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,32,97,110,100,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,120,112,114,101,115,115,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,49,52,54>>,signature => [{attribute,1149,spec,{{path_script,2},[{type,1149,bounded_fun,[{type,1149,'fun',[{type,1149,product,[{var,1149,'Path'},{var,1149,'Filename'}]},{type,1150,union,[{type,1150,tuple,[{atom,1150,ok},{var,1150,'Value'},{var,1150,'FullName'}]},{type,1150,tuple,[{atom,1150,error},{var,1150,'Reason'}]}]}]},[{type,1151,constraint,[{atom,1151,is_subtype},[{var,1151,'Path'},{type,1151,list,[{ann_type,1151,[{var,1151,'Dir'},{user_type,1151,name_all,[]}]}]}]]},{type,1152,constraint,[{atom,1152,is_subtype},[{var,1152,'Filename'},{user_type,1152,name_all,[]}]]},{type,1153,constraint,[{atom,1153,is_subtype},[{var,1153,'Value'},{type,1153,term,[]}]]},{type,1154,constraint,[{atom,1154,is_subtype},[{var,1154,'FullName'},{user_type,1154,filename_all,[]}]]},{type,1155,constraint,[{atom,1155,is_subtype},[{var,1155,'Reason'},{type,1155,union,[{user_type,1155,posix,[]},{atom,1155,badarg},{atom,1155,terminated},{atom,1155,system_limit},{type,1156,tuple,[{ann_type,1156,[{var,1156,'Line'},{type,1156,integer,[]}]},{ann_type,1156,[{var,1156,'Mod'},{type,1156,module,[]}]},{ann_type,1156,[{var,1156,'Term'},{type,1156,term,[]}]}]}]}]]}]]}]}}]}},{{function,path_script,3},[{file,[102,105,108,101,46,101,114,108]},{location,1161}],[<<112,97,116,104,95,115,99,114,105,112,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<112,97,116,104,95,115,99,114,105,112,116,47,50>>]},<<32,98,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,32>>,{code,[],[<<66,105,110,100,105,110,103,115>>]},<<32,97,114,101,32,117,115,101,100,32,105,110,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,101,114,108,95,101,118,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,101,118,97,108,40,51,41>>]}]},<<32,97,98,111,117,116,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,49,57,48>>,signature => [{attribute,1161,spec,{{path_script,3},[{type,1161,bounded_fun,[{type,1161,'fun',[{type,1161,product,[{var,1161,'Path'},{var,1161,'Filename'},{var,1161,'Bindings'}]},{type,1162,union,[{type,1162,tuple,[{atom,1162,ok},{var,1162,'Value'},{var,1162,'FullName'}]},{type,1162,tuple,[{atom,1162,error},{var,1162,'Reason'}]}]}]},[{type,1163,constraint,[{atom,1163,is_subtype},[{var,1163,'Path'},{type,1163,list,[{ann_type,1163,[{var,1163,'Dir'},{user_type,1163,name_all,[]}]}]}]]},{type,1164,constraint,[{atom,1164,is_subtype},[{var,1164,'Filename'},{user_type,1164,name_all,[]}]]},{type,1165,constraint,[{atom,1165,is_subtype},[{var,1165,'Bindings'},{remote_type,1165,[{atom,1165,erl_eval},{atom,1165,binding_struct},[]]}]]},{type,1166,constraint,[{atom,1166,is_subtype},[{var,1166,'Value'},{type,1166,term,[]}]]},{type,1167,constraint,[{atom,1167,is_subtype},[{var,1167,'FullName'},{user_type,1167,filename_all,[]}]]},{type,1168,constraint,[{atom,1168,is_subtype},[{var,1168,'Reason'},{type,1168,union,[{user_type,1168,posix,[]},{atom,1168,badarg},{atom,1168,terminated},{atom,1168,system_limit},{type,1169,tuple,[{ann_type,1169,[{var,1169,'Line'},{type,1169,integer,[]}]},{ann_type,1169,[{var,1169,'Mod'},{type,1169,module,[]}]},{ann_type,1169,[{var,1169,'Term'},{type,1169,term,[]}]}]}]}]]}]]}]}}]}},{{function,pid2name,1},[{file,[102,105,108,101,46,101,114,108]},{location,170}],[<<112,105,100,50,110,97,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,97,110,32,73,47,79,32,100,101,118,105,99,101,44,32,116,104,97,116,32,105,115,44,32,97,32,112,105,100,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<111,112,101,110,47,50>>]},<<44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,102,105,108,101,110,97,109,101,44,32,111,114,32,114,97,116,104,101,114,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,116,104,105,115,32,110,111,100,101,32,105,115,32,110,111,116,32,97,32,115,108,97,118,101,44,32,116,104,101,32,102,105,108,101,32,119,97,115,32,111,112,101,110,101,100,32,98,121,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,116,104,105,115,32,110,111,100,101,32,40,116,104,105,115,32,105,109,112,108,105,101,115,32,116,104,97,116,32>>,{code,[],[<<80,105,100>>]},<<32,109,117,115,116,32,98,101,32,97,32,108,111,99,97,108,32,112,105,100,41,32,97,110,100,32,116,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,99,108,111,115,101,100,46,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,110,32,102,108,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,46>>]}]},{dt,[],[{code,[],[<<117,110,100,101,102,105,110,101,100>>]}]},{dd,[],[{p,[],[<<73,110,32,97,108,108,32,111,116,104,101,114,32,99,97,115,101,115,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,50,48,48>>,signature => [{attribute,170,spec,{{pid2name,1},[{type,170,bounded_fun,[{type,170,'fun',[{type,170,product,[{var,170,'Pid'}]},{type,170,union,[{type,170,tuple,[{atom,170,ok},{var,170,'Filename'}]},{atom,170,undefined}]}]},[{type,171,constraint,[{atom,171,is_subtype},[{var,171,'Filename'},{user_type,171,filename_all,[]}]]},{type,172,constraint,[{atom,172,is_subtype},[{var,172,'Pid'},{type,172,pid,[]}]]}]]}]}}]}},{{function,position,2},[{file,[102,105,108,101,46,101,114,108]},{location,753}],[<<112,111,115,105,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,116,111,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,78,101,119,80,111,115,105,116,105,111,110,125>>]},<<32,40,97,115,32,97,98,115,111,108,117,116,101,32,111,102,102,115,101,116,41,32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<79,102,102,115,101,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<123,98,111,102,44,32,79,102,102,115,101,116,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,98,111,102,44,32,79,102,102,115,101,116,125>>]}]},{dd,[],[{p,[],[<<65,98,115,111,108,117,116,101,32,111,102,102,115,101,116,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,44,32,79,102,102,115,101,116,125>>]}]},{dd,[],[{p,[],[<<79,102,102,115,101,116,32,102,114,111,109,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,101,111,102,44,32,79,102,102,115,101,116,125>>]}]},{dd,[],[{p,[],[<<79,102,102,115,101,116,32,102,114,111,109,32,116,104,101,32,101,110,100,32,111,102,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<98,111,102,32,124,32,99,117,114,32,124,32,101,111,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,97,98,111,118,101,32,119,105,116,104,32>>,{code,[],[<<79,102,102,115,101,116>>]},<<32,48,46>>]}]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,111,102,102,115,101,116,115,32,97,114,101,32,99,111,117,110,116,101,100,32,105,110,32,98,121,116,101,115,44,32,110,111,116,32,105,110,32,99,104,97,114,97,99,116,101,114,115,46,32,73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,117,115,105,110,103,32,115,111,109,101,32,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,111,110,101,32,98,121,116,101,32,100,111,101,115,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,32,80,111,115,105,116,105,111,110,105,110,103,32,105,110,32,115,117,99,104,32,97,32,102,105,108,101,32,99,97,110,32,111,110,108,121,32,98,101,32,100,111,110,101,32,116,111,32,107,110,111,119,110,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,105,101,115,46,32,84,104,97,116,32,105,115,44,32,116,111,32,97,32,112,111,115,105,116,105,111,110,32,101,97,114,108,105,101,114,32,114,101,116,114,105,101,118,101,100,32,98,121,32,103,101,116,116,105,110,103,32,97,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,44,32,116,111,32,116,104,101,32,98,101,103,105,110,110,105,110,103,47,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,32,111,114,32,116,111,32,115,111,109,101,32,111,116,104,101,114,32,112,111,115,105,116,105,111,110,32>>,{em,[],[<<107,110,111,119,110>>]},<<32,116,111,32,98,101,32,111,110,32,97,32,99,111,114,114,101,99,116,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,32,98,121,32,115,111,109,101,32,111,116,104,101,114,32,109,101,97,110,115,32,40,116,121,112,105,99,97,108,108,121,32,98,101,121,111,110,100,32,97,32,98,121,116,101,32,111,114,100,101,114,32,109,97,114,107,32,105,110,32,116,104,101,32,102,105,108,101,44,32,119,104,105,99,104,32,104,97,115,32,97,32,107,110,111,119,110,32,98,121,116,101,45,115,105,122,101,41,46>>]},{p,[],[<<65,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,32,105,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[<<69,105,116,104,101,114,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,105,108,108,101,103,97,108,44,32,111,114,32,105,116,32,105,115,32,101,118,97,108,117,97,116,101,100,32,116,111,32,97,32,110,101,103,97,116,105,118,101,32,111,102,102,115,101,116,32,105,110,32,116,104,101,32,102,105,108,101,46,32,78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,112,111,115,105,116,105,111,110,32,105,115,32,97,32,110,101,103,97,116,105,118,101,32,118,97,108,117,101,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,110,32,101,114,114,111,114,44,32,97,110,100,32,97,102,116,101,114,32,116,104,101,32,99,97,108,108,32,116,104,101,32,102,105,108,101,32,112,111,115,105,116,105,111,110,32,105,115,32,117,110,100,101,102,105,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,50,50,53>>,signature => [{attribute,753,spec,{{position,2},[{type,753,bounded_fun,[{type,753,'fun',[{type,753,product,[{var,753,'IoDevice'},{var,753,'Location'}]},{type,753,union,[{type,753,tuple,[{atom,753,ok},{var,753,'NewPosition'}]},{type,753,tuple,[{atom,753,error},{var,753,'Reason'}]}]}]},[{type,754,constraint,[{atom,754,is_subtype},[{var,754,'IoDevice'},{user_type,754,io_device,[]}]]},{type,755,constraint,[{atom,755,is_subtype},[{var,755,'Location'},{user_type,755,location,[]}]]},{type,756,constraint,[{atom,756,is_subtype},[{var,756,'NewPosition'},{type,756,integer,[]}]]},{type,757,constraint,[{atom,757,is_subtype},[{var,757,'Reason'},{type,757,union,[{user_type,757,posix,[]},{atom,757,badarg},{atom,757,terminated}]}]]}]]}]}}]}},{{function,pread,2},[{file,[102,105,108,101,46,101,114,108]},{location,632}],[<<112,114,101,97,100,47,50>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32>>,{code,[],[<<112,114,101,97,100,47,51>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,91,68,97,116,97,44,32,46,46,46,93,125>>]},<<32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<44,32,119,104,101,114,101,32,101,97,99,104,32>>,{code,[],[<<68,97,116,97>>]},<<44,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<112,114,101,97,100>>]},<<44,32,105,115,32,101,105,116,104,101,114,32,97,32,108,105,115,116,32,111,114,32,97,32,98,105,110,97,114,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109,111,100,101,32,111,102,32,116,104,101,32,102,105,108,101,44,32,111,114,32>>,{code,[],[<<101,111,102>>]},<<32,105,102,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,112,111,115,105,116,105,111,110,32,105,115,32,98,101,121,111,110,100,32,101,110,100,32,111,102,32,102,105,108,101,46>>]},{p,[],[<<65,115,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,121,116,101,45,111,102,102,115,101,116,44,32,116,97,107,101,32,115,112,101,99,105,97,108,32,99,97,117,116,105,111,110,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,102,105,108,101,115,32,119,104,101,114,101,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,97,115,32,110,111,116,32,101,118,101,114,121,32,98,121,116,101,32,112,111,115,105,116,105,111,110,32,105,115,32,97,32,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,32,111,110,32,115,117,99,104,32,97,32,102,105,108,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,50,55,55>>,signature => [{attribute,632,spec,{{pread,2},[{type,632,bounded_fun,[{type,632,'fun',[{type,632,product,[{var,632,'IoDevice'},{var,632,'LocNums'}]},{type,632,union,[{type,632,tuple,[{atom,632,ok},{var,632,'DataL'}]},{atom,632,eof},{type,632,tuple,[{atom,632,error},{var,632,'Reason'}]}]}]},[{type,633,constraint,[{atom,633,is_subtype},[{var,633,'IoDevice'},{user_type,633,io_device,[]}]]},{type,634,constraint,[{atom,634,is_subtype},[{var,634,'LocNums'},{type,634,list,[{type,634,tuple,[{ann_type,634,[{var,634,'Location'},{user_type,634,location,[]}]},{ann_type,634,[{var,634,'Number'},{type,634,non_neg_integer,[]}]}]}]}]]},{type,635,constraint,[{atom,635,is_subtype},[{var,635,'DataL'},{type,635,list,[{var,635,'Data'}]}]]},{type,636,constraint,[{atom,636,is_subtype},[{var,636,'Data'},{type,636,union,[{type,636,string,[]},{type,636,binary,[]},{atom,636,eof}]}]]},{type,637,constraint,[{atom,637,is_subtype},[{var,637,'Reason'},{type,637,union,[{user_type,637,posix,[]},{atom,637,badarg},{atom,637,terminated}]}]]}]]}]}}]}},{{function,pread,3},[{file,[102,105,108,101,46,101,114,108]},{location,660}],[<<112,114,101,97,100,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32>>,{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46>>]},{p,[],[{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,111,110,108,121,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,97,110,100,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,115,46>>]},{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,111,102,32,116,104,101,32,102,105,108,101,32,97,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,97,110,100,32,117,110,99,104,97,110,103,101,100,32,102,111,114,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,46>>]},{p,[],[<<65,115,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,121,116,101,45,111,102,102,115,101,116,44,32,116,97,107,101,32,115,112,101,99,105,97,108,32,99,97,117,116,105,111,110,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,102,105,108,101,115,32,119,104,101,114,101,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,97,115,32,110,111,116,32,101,118,101,114,121,32,98,121,116,101,32,112,111,115,105,116,105,111,110,32,105,115,32,97,32,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,32,111,110,32,115,117,99,104,32,97,32,102,105,108,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,50,57,53>>,signature => [{attribute,660,spec,{{pread,3},[{type,660,bounded_fun,[{type,660,'fun',[{type,660,product,[{var,660,'IoDevice'},{var,660,'Location'},{var,660,'Number'}]},{type,661,union,[{type,661,tuple,[{atom,661,ok},{var,661,'Data'}]},{atom,661,eof},{type,661,tuple,[{atom,661,error},{var,661,'Reason'}]}]}]},[{type,662,constraint,[{atom,662,is_subtype},[{var,662,'IoDevice'},{user_type,662,io_device,[]}]]},{type,663,constraint,[{atom,663,is_subtype},[{var,663,'Location'},{user_type,663,location,[]}]]},{type,664,constraint,[{atom,664,is_subtype},[{var,664,'Number'},{type,664,non_neg_integer,[]}]]},{type,665,constraint,[{atom,665,is_subtype},[{var,665,'Data'},{type,665,union,[{type,665,string,[]},{type,665,binary,[]}]}]]},{type,666,constraint,[{atom,666,is_subtype},[{var,666,'Reason'},{type,666,union,[{user_type,666,posix,[]},{atom,666,badarg},{atom,666,terminated}]}]]}]]}]}}]}},{{function,pwrite,2},[{file,[102,105,108,101,46,101,114,108]},{location,693}],[<<112,119,114,105,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32>>,{code,[],[<<112,119,114,105,116,101,47,51>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,123,78,44,32,82,101,97,115,111,110,125,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,117,99,99,101,115,115,102,117,108,32,119,114,105,116,101,115,32,100,111,110,101,32,98,101,102,111,114,101,32,116,104,101,32,102,97,105,108,117,114,101,46>>]},{p,[],[<<87,104,101,110,32,112,111,115,105,116,105,111,110,105,110,103,32,105,110,32,97,32,102,105,108,101,32,119,105,116,104,32,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,99,97,117,116,105,111,110,32,109,117,115,116,32,98,101,32,116,97,107,101,110,32,116,111,32,115,101,116,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,110,32,97,32,99,111,114,114,101,99,116,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,112,111,115,105,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,49,50>>,signature => [{attribute,693,spec,{{pwrite,2},[{type,693,bounded_fun,[{type,693,'fun',[{type,693,product,[{var,693,'IoDevice'},{var,693,'LocBytes'}]},{type,693,union,[{atom,693,ok},{type,693,tuple,[{atom,693,error},{type,693,tuple,[{var,693,'N'},{var,693,'Reason'}]}]}]}]},[{type,694,constraint,[{atom,694,is_subtype},[{var,694,'IoDevice'},{user_type,694,io_device,[]}]]},{type,695,constraint,[{atom,695,is_subtype},[{var,695,'LocBytes'},{type,695,list,[{type,695,tuple,[{ann_type,695,[{var,695,'Location'},{user_type,695,location,[]}]},{ann_type,695,[{var,695,'Bytes'},{type,695,iodata,[]}]}]}]}]]},{type,696,constraint,[{atom,696,is_subtype},[{var,696,'N'},{type,696,non_neg_integer,[]}]]},{type,697,constraint,[{atom,697,is_subtype},[{var,697,'Reason'},{type,697,union,[{user_type,697,posix,[]},{atom,697,badarg},{atom,697,terminated}]}]]}]]}]}}]}},{{function,pwrite,3},[{file,[102,105,108,101,46,101,114,108]},{location,718}],[<<112,119,114,105,116,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32>>,{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]},<<32,97,110,100,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46>>]},{p,[],[{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,111,110,108,121,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,97,110,100,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,115,46>>]},{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,111,102,32,116,104,101,32,102,105,108,101,32,97,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,97,110,100,32,117,110,99,104,97,110,103,101,100,32,102,111,114,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,46>>]},{p,[],[<<87,104,101,110,32,112,111,115,105,116,105,111,110,105,110,103,32,105,110,32,97,32,102,105,108,101,32,119,105,116,104,32,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,99,97,117,116,105,111,110,32,109,117,115,116,32,98,101,32,116,97,107,101,110,32,116,111,32,115,101,116,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,110,32,97,32,99,111,114,114,101,99,116,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,112,111,115,105,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,50,55>>,signature => [{attribute,718,spec,{{pwrite,3},[{type,718,bounded_fun,[{type,718,'fun',[{type,718,product,[{var,718,'IoDevice'},{var,718,'Location'},{var,718,'Bytes'}]},{type,718,union,[{atom,718,ok},{type,718,tuple,[{atom,718,error},{var,718,'Reason'}]}]}]},[{type,719,constraint,[{atom,719,is_subtype},[{var,719,'IoDevice'},{user_type,719,io_device,[]}]]},{type,720,constraint,[{atom,720,is_subtype},[{var,720,'Location'},{user_type,720,location,[]}]]},{type,721,constraint,[{atom,721,is_subtype},[{var,721,'Bytes'},{type,721,iodata,[]}]]},{type,722,constraint,[{atom,722,is_subtype},[{var,722,'Reason'},{type,722,union,[{user_type,722,posix,[]},{atom,722,badarg},{atom,722,terminated}]}]]}]]}]}}]}},{{function,read,2},[{file,[102,105,108,101,46,101,114,108]},{location,590}],[<<114,101,97,100,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,98,121,116,101,115,47,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,84,104,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,112,114,101,97,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,101,97,100,47,51>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]}]},<<32,97,114,101,32,116,104,101,32,111,110,108,121,32,119,97,121,115,32,116,111,32,114,101,97,100,32,102,114,111,109,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,40,97,108,116,104,111,117,103,104,32,116,104,101,121,32,119,111,114,107,32,102,111,114,32,110,111,114,109,97,108,108,121,32,111,112,101,110,101,100,32,102,105,108,101,115,44,32,116,111,111,41,46>>]},{p,[],[<<70,111,114,32,102,105,108,101,115,32,119,104,101,114,101,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,111,110,101,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,121,116,101,32,111,110,32,116,104,101,32,102,105,108,101,46,32,84,104,101,32,112,97,114,97,109,101,116,101,114,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,97,108,119,97,121,115,32,100,101,110,111,116,101,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{em,[],[<<99,104,97,114,97,99,116,101,114,115>>]},<<32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,44,32,119,104,105,108,101,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,102,105,108,101,32,99,97,110,32,98,101,32,109,111,118,101,100,32,109,117,99,104,32,109,111,114,101,32,116,104,97,110,32,116,104,105,115,32,110,117,109,98,101,114,32,119,104,101,110,32,114,101,97,100,105,110,103,32,97,32,85,110,105,99,111,100,101,32,102,105,108,101,46>>]},{p,[],[<<65,108,115,111,44,32,105,102,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,116,104,101,32>>,{code,[],[<<114,101,97,100,47,51>>]},<<32,99,97,108,108,32,102,97,105,108,115,32,105,102,32,116,104,101,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,99,104,97,114,97,99,116,101,114,115,32,108,97,114,103,101,114,32,116,104,97,110,32,50,53,53,44,32,119,104,105,99,104,32,105,115,32,119,104,121,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,105,115,32,116,111,32,98,101,32,112,114,101,102,101,114,114,101,100,32,119,104,101,110,32,114,101,97,100,105,110,103,32,115,117,99,104,32,97,32,102,105,108,101,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,68,97,116,97,125>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,119,97,115,32,111,112,101,110,101,100,32,105,110,32,98,105,110,97,114,121,32,109,111,100,101,44,32,116,104,101,32,114,101,97,100,32,98,121,116,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32,105,110,32,97,32,108,105,115,116,46,32,84,104,101,32,108,105,115,116,32,111,114,32,98,105,110,97,114,121,32,105,115,32,115,104,111,114,116,101,114,32,116,104,97,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,113,117,101,115,116,101,100,32,105,102,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,114,101,97,99,104,101,100,46>>]}]},{dt,[],[{code,[],[<<101,111,102>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,101,100,32,105,102,32>>,{code,[],[<<78,117,109,98,101,114,62,48>>]},<<32,97,110,100,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,114,101,97,99,104,101,100,32,98,101,102,111,114,101,32,97,110,121,116,104,105,110,103,32,97,116,32,97,108,108,32,99,111,117,108,100,32,98,101,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,98,97,100,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,102,111,114,32,114,101,97,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,110,111,95,116,114,97,110,115,108,97,116,105,111,110,44,32,117,110,105,99,111,100,101,44,32,108,97,116,105,110,49,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,97,110,100,32,116,104,101,32,100,97,116,97,32,105,110,32,116,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,116,104,101,32,98,121,116,101,45,111,114,105,101,110,116,101,100,32,100,97,116,97,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,52,52>>,signature => [{attribute,590,spec,{{read,2},[{type,590,bounded_fun,[{type,590,'fun',[{type,590,product,[{var,590,'IoDevice'},{var,590,'Number'}]},{type,590,union,[{type,590,tuple,[{atom,590,ok},{var,590,'Data'}]},{atom,590,eof},{type,590,tuple,[{atom,590,error},{var,590,'Reason'}]}]}]},[{type,591,constraint,[{atom,591,is_subtype},[{var,591,'IoDevice'},{type,591,union,[{user_type,591,io_device,[]},{type,591,atom,[]}]}]]},{type,592,constraint,[{atom,592,is_subtype},[{var,592,'Number'},{type,592,non_neg_integer,[]}]]},{type,593,constraint,[{atom,593,is_subtype},[{var,593,'Data'},{type,593,union,[{type,593,string,[]},{type,593,binary,[]}]}]]},{type,594,constraint,[{atom,594,is_subtype},[{var,594,'Reason'},{type,594,union,[{user_type,594,posix,[]},{atom,595,badarg},{atom,596,terminated},{type,597,tuple,[{atom,597,no_translation},{atom,597,unicode},{atom,597,latin1}]}]}]]}]]}]}}]}},{{function,read_file,1},[{file,[102,105,108,101,46,101,114,108]},{location,419}],[<<114,101,97,100,95,102,105,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,105,110,97,114,121,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,105,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,114,101,97,100,105,110,103,32,116,104,101,32,102,105,108,101,44,32,111,114,32,102,111,114,32,115,101,97,114,99,104,105,110,103,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,97,109,101,100,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,110,111,109,101,109>>]}]},{dd,[],[{p,[],[<<84,104,101,114,101,32,105,115,32,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,102,111,114,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,57,56>>,signature => [{attribute,419,spec,{{read_file,1},[{type,419,bounded_fun,[{type,419,'fun',[{type,419,product,[{var,419,'Filename'}]},{type,419,union,[{type,419,tuple,[{atom,419,ok},{var,419,'Binary'}]},{type,419,tuple,[{atom,419,error},{var,419,'Reason'}]}]}]},[{type,420,constraint,[{atom,420,is_subtype},[{var,420,'Filename'},{user_type,420,name_all,[]}]]},{type,421,constraint,[{atom,421,is_subtype},[{var,421,'Binary'},{type,421,binary,[]}]]},{type,422,constraint,[{atom,422,is_subtype},[{var,422,'Reason'},{type,422,union,[{user_type,422,posix,[]},{atom,422,badarg},{atom,422,terminated},{atom,422,system_limit}]}]]}]]}]}}]}},{{function,read_file_info,2},[{file,[102,105,108,101,46,101,114,108]},{location,294}],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,52,51,52>>,equiv => {function,read_file_info,1},signature => [{attribute,294,spec,{{read_file_info,2},[{type,294,bounded_fun,[{type,294,'fun',[{type,294,product,[{var,294,'File'},{var,294,'Opts'}]},{type,294,union,[{type,294,tuple,[{atom,294,ok},{var,294,'FileInfo'}]},{type,294,tuple,[{atom,294,error},{var,294,'Reason'}]}]}]},[{type,295,constraint,[{atom,295,is_subtype},[{var,295,'File'},{type,295,union,[{user_type,295,name_all,[]},{user_type,295,io_device,[]}]}]]},{type,296,constraint,[{atom,296,is_subtype},[{var,296,'Opts'},{type,296,list,[{user_type,296,file_info_option,[]}]}]]},{type,297,constraint,[{atom,297,is_subtype},[{var,297,'FileInfo'},{user_type,297,file_info,[]}]]},{type,298,constraint,[{atom,298,is_subtype},[{var,298,'Reason'},{type,298,union,[{user_type,298,posix,[]},{atom,298,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,read_file_info,1},[{file,[102,105,108,101,46,101,114,108]},{location,282}],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,114,105,101,118,101,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,102,105,108,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,73,110,102,111,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,73,110,102,111>>]},<<32,105,115,32,97,32,114,101,99,111,114,100,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<44,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,75,101,114,110,101,108,32,105,110,99,108,117,100,101,32,102,105,108,101,32>>,{code,[],[<<102,105,108,101,46,104,114,108>>]},<<46,32,73,110,99,108,117,100,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,100,105,114,101,99,116,105,118,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,32,102,114,111,109,32,119,104,105,99,104,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<32,45,105,110,99,108,117,100,101,95,108,105,98,40,34,107,101,114,110,101,108,47,105,110,99,108,117,100,101,47,102,105,108,101,46,104,114,108,34,41,46>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,116,121,112,101,32,114,101,116,117,114,110,101,100,32,105,110,32>>,{code,[],[<<97,116,105,109,101>>]},<<44,32>>,{code,[],[<<109,116,105,109,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<99,116,105,109,101>>]},<<32,105,115,32,100,101,112,101,110,100,101,110,116,32,111,110,32,116,104,101,32,116,105,109,101,32,116,121,112,101,32,115,101,116,32,105,110,32>>,{code,[],[<<79,112,116,115,32,58,58,32,123,116,105,109,101,44,32,84,121,112,101,125>>]},<<32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,111,99,97,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,108,111,99,97,108,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<117,110,105,118,101,114,115,97,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,117,110,105,118,101,114,115,97,108,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<112,111,115,105,120>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,115,101,99,111,110,100,115,32,115,105,110,99,101,32,111,114,32,98,101,102,111,114,101,32,85,110,105,120,32,116,105,109,101,32,101,112,111,99,104,44,32,119,104,105,99,104,32,105,115,32,49,57,55,48,45,48,49,45,48,49,32,48,48,58,48,48,32,85,84,67,46>>]}]}]},{p,[],[<<68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<123,116,105,109,101,44,32,108,111,99,97,108,125>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,97,110,100,32,111,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,108,111,99,97,108,32,102,105,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,32,119,105,108,108,32,98,114,101,97,107,32,116,104,105,115,32,109,111,100,117,108,101,39,115,32,97,116,111,109,105,99,105,116,121,32,103,117,97,114,97,110,116,101,101,115,32,97,115,32,105,116,32,99,97,110,32,114,97,99,101,32,119,105,116,104,32,97,32,99,111,110,99,117,114,114,101,110,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,49,44,50>>]},<<32>>]},<<46>>]},{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,103,105,118,101,110,32,97,110,32,73,47,79,32,100,101,118,105,99,101,32,105,110,115,116,101,97,100,32,111,102,32,97,32,102,105,108,101,32,110,97,109,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,116,111,32,111,98,116,97,105,110,32,97,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,102,105,114,115,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,105,108,101,32,116,105,109,101,115,32,97,114,101,32,115,116,111,114,101,100,32,105,110,32,80,79,83,73,88,32,116,105,109,101,32,111,110,32,109,111,115,116,32,79,83,44,32,105,116,32,105,115,32,102,97,115,116,101,114,32,116,111,32,113,117,101,114,121,32,102,105,108,101,32,105,110,102,111,114,109,97,116,105,111,110,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<112,111,115,105,120>>]},<<46>>]}]},{p,[],[<<84,104,101,32,114,101,99,111,114,100,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,101,108,100,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,105,122,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<83,105,122,101,32,111,102,32,102,105,108,101,32,105,110,32,98,121,116,101,115,46>>]}]},{dt,[],[{code,[],[<<116,121,112,101,32,61,32,100,101,118,105,99,101,32,124,32,100,105,114,101,99,116,111,114,121,32,124,32,111,116,104,101,114,32,124,32,114,101,103,117,108,97,114,32,124,32,115,121,109,108,105,110,107>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<97,99,99,101,115,115,32,61,32,114,101,97,100,32,124,32,119,114,105,116,101,32,124,32,114,101,97,100,95,119,114,105,116,101,32,124,32,110,111,110,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,99,99,101,115,115,32,116,111,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<97,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<109,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,119,114,105,116,116,101,110,46>>]}]},{dt,[],[{code,[],[<<99,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,116,105,109,101,32,102,105,101,108,100,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,46,32,79,110,32,85,110,105,120,44,32,105,116,32,105,115,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,111,114,32,116,104,101,32>>,{code,[],[<<105,110,111,100,101>>]},<<32,119,97,115,32,99,104,97,110,103,101,100,46,32,73,110,32,87,105,110,100,111,119,115,44,32,105,116,32,105,115,32,116,104,101,32,99,114,101,97,116,101,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<109,111,100,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,112,101,114,109,105,115,115,105,111,110,115,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,116,32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<56,35,48,48,52,48,48>>]}]},{dd,[],[{p,[],[<<114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,50,48,48>>]}]},{dd,[],[{p,[],[<<119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,49,48,48>>]}]},{dd,[],[{p,[],[<<101,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,52,48>>]}]},{dd,[],[{p,[],[<<114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,50,48>>]}]},{dd,[],[{p,[],[<<119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,49,48>>]}]},{dd,[],[{p,[],[<<101,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,52>>]}]},{dd,[],[{p,[],[<<114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,50>>]}]},{dd,[],[{p,[],[<<119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,49>>]}]},{dd,[],[{p,[],[<<101,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<49,54,35,56,48,48>>]}]},{dd,[],[{p,[],[<<115,101,116,32,117,115,101,114,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]},{dt,[],[{code,[],[<<49,54,35,52,48,48>>]}]},{dd,[],[{p,[],[<<115,101,116,32,103,114,111,117,112,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]}]},{p,[],[<<79,110,32,85,110,105,120,32,112,108,97,116,102,111,114,109,115,44,32,111,116,104,101,114,32,98,105,116,115,32,116,104,97,110,32,116,104,111,115,101,32,108,105,115,116,101,100,32,97,98,111,118,101,32,109,97,121,32,98,101,32,115,101,116,46>>]}]},{dt,[],[{code,[],[<<108,105,110,107,115,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<78,117,109,98,101,114,32,111,102,32,108,105,110,107,115,32,116,111,32,116,104,101,32,102,105,108,101,32,40,116,104,105,115,32,105,115,32,97,108,119,97,121,115,32,49,32,102,111,114,32,102,105,108,101,32,115,121,115,116,101,109,115,32,116,104,97,116,32,104,97,118,101,32,110,111,32,99,111,110,99,101,112,116,32,111,102,32,108,105,110,107,115,41,46>>]}]},{dt,[],[{code,[],[<<109,97,106,111,114,95,100,101,118,105,99,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<73,100,101,110,116,105,102,105,101,115,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,119,104,101,114,101,32,116,104,101,32,102,105,108,101,32,105,115,32,108,111,99,97,116,101,100,46,32,73,110,32,87,105,110,100,111,119,115,44,32,116,104,101,32,110,117,109,98,101,114,32,105,110,100,105,99,97,116,101,115,32,97,32,100,114,105,118,101,32,97,115,32,102,111,108,108,111,119,115,58,32,48,32,109,101,97,110,115,32,65,58,44,32,49,32,109,101,97,110,115,32,66,58,44,32,97,110,100,32,115,111,32,111,110,46>>]}]},{dt,[],[{code,[],[<<109,105,110,111,114,95,100,101,118,105,99,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,99,104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,32,111,110,32,85,110,105,120,46,32,73,110,32,97,108,108,32,111,116,104,101,114,32,99,97,115,101,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]},{dt,[],[{code,[],[<<105,110,111,100,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,116,104,101,32>>,{code,[],[<<105,110,111,100,101>>]},<<32,110,117,109,98,101,114,46,32,79,110,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]},{dt,[],[{code,[],[<<117,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<73,110,100,105,99,97,116,101,115,32,116,104,101,32,111,119,110,101,114,32,111,102,32,116,104,101,32,102,105,108,101,46,32,79,110,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]},{dt,[],[{code,[],[<<103,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,32,111,119,110,101,114,32,111,102,32,116,104,101,32,102,105,108,101,32,98,101,108,111,110,103,115,32,116,111,46,32,79,110,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,52,51,52>>,signature => [{attribute,282,spec,{{read_file_info,1},[{type,282,bounded_fun,[{type,282,'fun',[{type,282,product,[{var,282,'File'}]},{type,282,union,[{type,282,tuple,[{atom,282,ok},{var,282,'FileInfo'}]},{type,282,tuple,[{atom,282,error},{var,282,'Reason'}]}]}]},[{type,283,constraint,[{atom,283,is_subtype},[{var,283,'File'},{type,283,union,[{user_type,283,name_all,[]},{user_type,283,io_device,[]}]}]]},{type,284,constraint,[{atom,284,is_subtype},[{var,284,'FileInfo'},{user_type,284,file_info,[]}]]},{type,285,constraint,[{atom,285,is_subtype},[{var,285,'Reason'},{type,285,union,[{user_type,285,posix,[]},{atom,285,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,read_line,1},[{file,[102,105,108,101,46,101,114,108]},{location,612}],[<<114,101,97,100,95,108,105,110,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,97,32,108,105,110,101,32,111,102,32,98,121,116,101,115,47,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,76,105,110,101,115,32,97,114,101,32,100,101,102,105,110,101,100,32,116,111,32,98,101,32,100,101,108,105,109,105,116,101,100,32,98,121,32,116,104,101,32,108,105,110,101,102,101,101,100,32,40,76,70,44,32>>,{code,[],[<<92,110>>]},<<41,32,99,104,97,114,97,99,116,101,114,44,32,98,117,116,32,97,110,121,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,67,82,44,32>>,{code,[],[<<92,114>>]},<<41,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,101,119,108,105,110,101,32,105,115,32,97,108,115,111,32,116,114,101,97,116,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,76,70,32,99,104,97,114,97,99,116,101,114,32,40,116,104,101,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,105,115,32,115,105,108,101,110,116,108,121,32,105,103,110,111,114,101,100,41,46,32,84,104,101,32,108,105,110,101,32,105,115,32,114,101,116,117,114,110,101,100,32>>,{em,[],[<<105,110,99,108,117,100,105,110,103>>]},<<32,116,104,101,32,76,70,44,32,98,117,116,32,101,120,99,108,117,100,105,110,103,32,97,110,121,32,67,82,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,76,70,46,32,84,104,105,115,32,98,101,104,97,118,105,111,117,114,32,105,115,32,99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,32,116,104,101,32,98,101,104,97,118,105,111,117,114,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111,35,103,101,116,95,108,105,110,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,111,58,103,101,116,95,108,105,110,101,47,50>>]}]},<<46,32,73,102,32,101,110,100,32,111,102,32,102,105,108,101,32,105,115,32,114,101,97,99,104,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,76,70,32,101,110,100,105,110,103,32,116,104,101,32,108,97,115,116,32,108,105,110,101,44,32,97,32,108,105,110,101,32,119,105,116,104,32,110,111,32,116,114,97,105,108,105,110,103,32,76,70,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,111,110,32,102,105,108,101,115,32,111,112,101,110,101,100,32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,46,32,72,111,119,101,118,101,114,44,32,105,116,32,105,115,32,105,110,101,102,102,105,99,105,101,110,116,32,116,111,32,117,115,101,32,105,116,32,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,102,105,108,101,115,32,105,102,32,116,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,115,112,101,99,105,102,105,101,100,46,32,84,104,117,115,44,32,99,111,109,98,105,110,105,110,103,32>>,{code,[],[<<114,97,119>>]},<<32,97,110,100,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,105,115,32,104,105,103,104,108,121,32,114,101,99,111,109,109,101,110,100,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,97,32,116,101,120,116,32,102,105,108,101,32,102,111,114,32,114,97,119,32,108,105,110,101,45,111,114,105,101,110,116,101,100,32,114,101,97,100,105,110,103,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,116,104,101,32>>,{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]},<<32,99,97,108,108,32,102,97,105,108,115,32,105,102,32,116,104,101,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,99,104,97,114,97,99,116,101,114,115,32,108,97,114,103,101,114,32,116,104,97,110,32,50,53,53,44,32,119,104,121,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,105,115,32,116,111,32,98,101,32,112,114,101,102,101,114,114,101,100,32,119,104,101,110,32,114,101,97,100,105,110,103,32,115,117,99,104,32,97,32,102,105,108,101,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,68,97,116,97,125>>]}]},{dd,[],[{p,[],[<<79,110,101,32,108,105,110,101,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,105,115,32,114,101,116,117,114,110,101,100,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,116,114,97,105,108,105,110,103,32,76,70,44,32,98,117,116,32,119,105,116,104,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,32,114,101,112,108,97,99,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,76,70,32,40,115,101,101,32,97,98,111,118,101,41,46>>]},{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,105,110,32,98,105,110,97,114,121,32,109,111,100,101,44,32,116,104,101,32,114,101,97,100,32,98,121,116,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32,105,110,32,97,32,108,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,111,102>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,101,100,32,105,102,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,114,101,97,99,104,101,100,32,98,101,102,111,114,101,32,97,110,121,116,104,105,110,103,32,97,116,32,97,108,108,32,99,111,117,108,100,32,98,101,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,98,97,100,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,102,111,114,32,114,101,97,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,110,111,95,116,114,97,110,115,108,97,116,105,111,110,44,32,117,110,105,99,111,100,101,44,32,108,97,116,105,110,49,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,97,110,100,32,116,104,101,32,100,97,116,97,32,111,110,32,116,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,116,104,101,32,98,121,116,101,45,111,114,105,101,110,116,101,100,32,100,97,116,97,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,53,57,51>>,signature => [{attribute,612,spec,{{read_line,1},[{type,612,bounded_fun,[{type,612,'fun',[{type,612,product,[{var,612,'IoDevice'}]},{type,612,union,[{type,612,tuple,[{atom,612,ok},{var,612,'Data'}]},{atom,612,eof},{type,612,tuple,[{atom,612,error},{var,612,'Reason'}]}]}]},[{type,613,constraint,[{atom,613,is_subtype},[{var,613,'IoDevice'},{type,613,union,[{user_type,613,io_device,[]},{type,613,atom,[]}]}]]},{type,614,constraint,[{atom,614,is_subtype},[{var,614,'Data'},{type,614,union,[{type,614,string,[]},{type,614,binary,[]}]}]]},{type,615,constraint,[{atom,615,is_subtype},[{var,615,'Reason'},{type,615,union,[{user_type,615,posix,[]},{atom,616,badarg},{atom,617,terminated},{type,618,tuple,[{atom,618,no_translation},{atom,618,unicode},{atom,618,latin1}]}]}]]}]]}]}}]}},{{function,read_link,1},[{file,[102,105,108,101,46,101,114,108]},{location,356}],[<<114,101,97,100,95,108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[{a,[{id,<<114,101,97,100,95,108,105,110,107,95,97,108,108>>}],[]},<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,125>>]},<<32,105,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,114,97,119,32,102,105,108,101,110,97,109,101,44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,111,116,104,101,114,119,105,115,101,46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,100,111,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<123,101,114,114,111,114,44,101,110,111,116,115,117,112,125>>]},<<46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<78,97,109,101>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32,111,114,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,32,116,104,97,116,32,105,116,32,114,101,102,101,114,115,32,116,111,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,101,120,112,101,99,116,101,100,32,101,110,99,111,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,54,53,48>>,signature => [{attribute,356,spec,{{read_link,1},[{type,356,bounded_fun,[{type,356,'fun',[{type,356,product,[{var,356,'Name'}]},{type,356,union,[{type,356,tuple,[{atom,356,ok},{var,356,'Filename'}]},{type,356,tuple,[{atom,356,error},{var,356,'Reason'}]}]}]},[{type,357,constraint,[{atom,357,is_subtype},[{var,357,'Name'},{user_type,357,name_all,[]}]]},{type,358,constraint,[{atom,358,is_subtype},[{var,358,'Filename'},{user_type,358,filename,[]}]]},{type,359,constraint,[{atom,359,is_subtype},[{var,359,'Reason'},{type,359,union,[{user_type,359,posix,[]},{atom,359,badarg}]}]]}]]}]}}]}},{{function,read_link_all,1},[{file,[102,105,108,101,46,101,114,108]},{location,364}],[<<114,101,97,100,95,108,105,110,107,95,97,108,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,125>>]},<<32,105,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,111,116,104,101,114,119,105,115,101,46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,100,111,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<123,101,114,114,111,114,44,101,110,111,116,115,117,112,125>>]},<<46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,97,32,108,105,115,116,32,111,114,32,97,32,98,105,110,97,114,121,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<78,97,109,101>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,54,56,48>>,signature => [{attribute,364,spec,{{read_link_all,1},[{type,364,bounded_fun,[{type,364,'fun',[{type,364,product,[{var,364,'Name'}]},{type,364,union,[{type,364,tuple,[{atom,364,ok},{var,364,'Filename'}]},{type,364,tuple,[{atom,364,error},{var,364,'Reason'}]}]}]},[{type,365,constraint,[{atom,365,is_subtype},[{var,365,'Name'},{user_type,365,name_all,[]}]]},{type,366,constraint,[{atom,366,is_subtype},[{var,366,'Filename'},{user_type,366,filename_all,[]}]]},{type,367,constraint,[{atom,367,is_subtype},[{var,367,'Reason'},{type,367,union,[{user_type,367,posix,[]},{atom,367,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,read_link_info,2},[{file,[102,105,108,101,46,101,114,108]},{location,334}],[<<114,101,97,100,95,108,105,110,107,95,105,110,102,111,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,55,48,56>>,equiv => {function,read_link_info,1},signature => [{attribute,334,spec,{{read_link_info,2},[{type,334,bounded_fun,[{type,334,'fun',[{type,334,product,[{var,334,'Name'},{var,334,'Opts'}]},{type,334,union,[{type,334,tuple,[{atom,334,ok},{var,334,'FileInfo'}]},{type,334,tuple,[{atom,334,error},{var,334,'Reason'}]}]}]},[{type,335,constraint,[{atom,335,is_subtype},[{var,335,'Name'},{user_type,335,name_all,[]}]]},{type,336,constraint,[{atom,336,is_subtype},[{var,336,'Opts'},{type,336,list,[{user_type,336,file_info_option,[]}]}]]},{type,337,constraint,[{atom,337,is_subtype},[{var,337,'FileInfo'},{user_type,337,file_info,[]}]]},{type,338,constraint,[{atom,338,is_subtype},[{var,338,'Reason'},{type,338,union,[{user_type,338,posix,[]},{atom,338,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,read_link_info,1},[{file,[102,105,108,101,46,101,114,108]},{location,326}],[<<114,101,97,100,95,108,105,110,107,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49,44,50>>]}]},<<32,101,120,99,101,112,116,32,116,104,97,116,32,105,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,44,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,105,110,107,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,32,116,104,101,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<32,114,101,99,111,114,100,32,97,110,100,32,116,104,101,32>>,{code,[],[<<116,121,112,101>>]},<<32,102,105,101,108,100,32,111,102,32,116,104,101,32,114,101,99,111,114,100,32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<115,121,109,108,105,110,107>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,97,110,100,32,111,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,108,111,99,97,108,32,102,105,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,32,119,105,108,108,32,98,114,101,97,107,32,116,104,105,115,32,109,111,100,117,108,101,39,115,32,97,116,111,109,105,99,105,116,121,32,103,117,97,114,97,110,116,101,101,115,32,97,115,32,105,116,32,99,97,110,32,114,97,99,101,32,119,105,116,104,32,97,32,99,111,110,99,117,114,114,101,110,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,49,44,50>>]}]}]},{p,[],[<<73,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,110,111,116,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32>>,{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>]},<<46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,100,111,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,108,119,97,121,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,55,48,56>>,signature => [{attribute,326,spec,{{read_link_info,1},[{type,326,bounded_fun,[{type,326,'fun',[{type,326,product,[{var,326,'Name'}]},{type,326,union,[{type,326,tuple,[{atom,326,ok},{var,326,'FileInfo'}]},{type,326,tuple,[{atom,326,error},{var,326,'Reason'}]}]}]},[{type,327,constraint,[{atom,327,is_subtype},[{var,327,'Name'},{user_type,327,name_all,[]}]]},{type,328,constraint,[{atom,328,is_subtype},[{var,328,'FileInfo'},{user_type,328,file_info,[]}]]},{type,329,constraint,[{atom,329,is_subtype},[{var,329,'Reason'},{type,329,union,[{user_type,329,posix,[]},{atom,329,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,rename,2},[{file,[102,105,108,101,46,101,114,108]},{location,241}],[<<114,101,110,97,109,101,47,50>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,114,101,110,97,109,101,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,116,111,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<46,32,73,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,111,118,101,32,102,105,108,101,115,32,40,97,110,100,32,100,105,114,101,99,116,111,114,105,101,115,41,32,98,101,116,119,101,101,110,32,100,105,114,101,99,116,111,114,105,101,115,44,32,98,117,116,32,105,116,32,105,115,32,110,111,116,32,115,117,102,102,105,99,105,101,110,116,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,111,110,108,121,46,32,84,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,102,105,108,101,110,97,109,101,32,109,117,115,116,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32>>,{code,[],[<<98,97,114>>]},<<32,105,115,32,97,32,110,111,114,109,97,108,32,102,105,108,101,32,97,110,100,32>>,{code,[],[<<102,111,111>>]},<<32,97,110,100,32>>,{code,[],[<<98,97,122>>]},<<32,97,114,101,32,100,105,114,101,99,116,111,114,105,101,115,44,32>>,{code,[],[<<114,101,110,97,109,101,40,34,102,111,111,47,98,97,114,34,44,32,34,98,97,122,34,41>>]},<<32,114,101,116,117,114,110,115,32,97,110,32,101,114,114,111,114,44,32,98,117,116,32>>,{code,[],[<<114,101,110,97,109,101,40,34,102,111,111,47,98,97,114,34,44,32,34,98,97,122,47,98,97,114,34,41>>]},<<32,115,117,99,99,101,101,100,115,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,105,116,32,105,115,32,115,117,99,99,101,115,115,102,117,108,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<82,101,110,97,109,105,110,103,32,111,102,32,111,112,101,110,32,102,105,108,101,115,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,111,110,32,109,111,115,116,32,112,108,97,116,102,111,114,109,115,32,40,115,101,101,32>>,{code,[],[<<101,97,99,99,101,115>>]},<<32,98,101,108,111,119,41,46>>]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,111,114,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,105,102,32,101,105,116,104,101,114,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,111,114,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,111,112,101,110,46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,109,112,116,121,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,97,108,115,111,32,103,105,118,101,110,32,119,104,101,110,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,97,114,101,32,110,111,116,32,111,102,32,116,104,101,32,115,97,109,101,32,116,121,112,101,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,105,115,32,97,32,114,111,111,116,32,100,105,114,101,99,116,111,114,121,44,32,111,114,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,97,32,115,117,98,100,105,114,101,99,116,111,114,121,32,111,102,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,44,32,98,117,116,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,105,115,32,110,111,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,44,32,98,117,116,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,110,111,116,46>>]}]},{dt,[],[{code,[],[<<101,120,100,101,118>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,97,114,101,32,111,110,32,100,105,102,102,101,114,101,110,116,32,102,105,108,101,32,115,121,115,116,101,109,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,55,51,48>>,signature => [{attribute,241,spec,{{rename,2},[{type,241,bounded_fun,[{type,241,'fun',[{type,241,product,[{var,241,'Source'},{var,241,'Destination'}]},{type,241,union,[{atom,241,ok},{type,241,tuple,[{atom,241,error},{var,241,'Reason'}]}]}]},[{type,242,constraint,[{atom,242,is_subtype},[{var,242,'Source'},{user_type,242,name_all,[]}]]},{type,243,constraint,[{atom,243,is_subtype},[{var,243,'Destination'},{user_type,243,name_all,[]}]]},{type,244,constraint,[{atom,244,is_subtype},[{var,244,'Reason'},{type,244,union,[{user_type,244,posix,[]},{atom,244,badarg}]}]]}]]}]}}]}},{{function,script,1},[{file,[102,105,108,101,46,101,114,108]},{location,1123}],[<<115,99,114,105,112,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,86,97,108,117,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,105,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,120,112,114,101,115,115,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,55,57,51>>,signature => [{attribute,1123,spec,{{script,1},[{type,1123,bounded_fun,[{type,1123,'fun',[{type,1123,product,[{var,1123,'Filename'}]},{type,1123,union,[{type,1123,tuple,[{atom,1123,ok},{var,1123,'Value'}]},{type,1123,tuple,[{atom,1123,error},{var,1123,'Reason'}]}]}]},[{type,1124,constraint,[{atom,1124,is_subtype},[{var,1124,'Filename'},{user_type,1124,name_all,[]}]]},{type,1125,constraint,[{atom,1125,is_subtype},[{var,1125,'Value'},{type,1125,term,[]}]]},{type,1126,constraint,[{atom,1126,is_subtype},[{var,1126,'Reason'},{type,1126,union,[{user_type,1126,posix,[]},{atom,1126,badarg},{atom,1126,terminated},{atom,1126,system_limit},{type,1127,tuple,[{ann_type,1127,[{var,1127,'Line'},{type,1127,integer,[]}]},{ann_type,1127,[{var,1127,'Mod'},{type,1127,module,[]}]},{ann_type,1127,[{var,1127,'Term'},{type,1127,term,[]}]}]}]}]]}]]}]}}]}},{{function,script,2},[{file,[102,105,108,101,46,101,114,108]},{location,1132}],[<<115,99,114,105,112,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<115,99,114,105,112,116,47,49>>]},<<32,98,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,32>>,{code,[],[<<66,105,110,100,105,110,103,115>>]},<<32,97,114,101,32,117,115,101,100,32,105,110,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,115,116,100,108,105,98,58,101,114,108,95,101,118,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,101,118,97,108,40,51,41>>]}]},<<32,97,98,111,117,116,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,50,56>>,signature => [{attribute,1132,spec,{{script,2},[{type,1132,bounded_fun,[{type,1132,'fun',[{type,1132,product,[{var,1132,'Filename'},{var,1132,'Bindings'}]},{type,1132,union,[{type,1132,tuple,[{atom,1132,ok},{var,1132,'Value'}]},{type,1132,tuple,[{atom,1132,error},{var,1132,'Reason'}]}]}]},[{type,1133,constraint,[{atom,1133,is_subtype},[{var,1133,'Filename'},{user_type,1133,name_all,[]}]]},{type,1134,constraint,[{atom,1134,is_subtype},[{var,1134,'Bindings'},{remote_type,1134,[{atom,1134,erl_eval},{atom,1134,binding_struct},[]]}]]},{type,1135,constraint,[{atom,1135,is_subtype},[{var,1135,'Value'},{type,1135,term,[]}]]},{type,1136,constraint,[{atom,1136,is_subtype},[{var,1136,'Reason'},{type,1136,union,[{user_type,1136,posix,[]},{atom,1136,badarg},{atom,1136,terminated},{atom,1136,system_limit},{type,1137,tuple,[{ann_type,1137,[{var,1137,'Line'},{type,1137,integer,[]}]},{ann_type,1137,[{var,1137,'Mod'},{type,1137,module,[]}]},{ann_type,1137,[{var,1137,'Term'},{type,1137,term,[]}]}]}]}]]}]]}]}}]}},{{function,sendfile,2},[{file,[102,105,108,101,46,101,114,108]},{location,1316}],[<<115,101,110,100,102,105,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,116,111,32>>,{code,[],[<<83,111,99,107,101,116>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,121,116,101,115,83,101,110,116,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,51,56>>,signature => [{attribute,1316,spec,{{sendfile,2},[{type,1316,bounded_fun,[{type,1316,'fun',[{type,1316,product,[{var,1316,'Filename'},{var,1316,'Socket'}]},{type,1317,union,[{type,1317,tuple,[{atom,1317,ok},{type,1317,non_neg_integer,[]}]},{type,1317,tuple,[{atom,1317,error},{type,1317,union,[{remote_type,1317,[{atom,1317,inet},{atom,1317,posix},[]]},{atom,1318,closed},{atom,1318,badarg},{atom,1318,not_owner}]}]}]}]},[{type,1319,constraint,[{atom,1319,is_subtype},[{var,1319,'Filename'},{user_type,1319,name_all,[]}]]},{type,1320,constraint,[{atom,1320,is_subtype},[{var,1320,'Socket'},{remote_type,1320,[{atom,1320,inet},{atom,1320,socket},[]]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,sendfile,5},[{file,[102,105,108,101,46,101,114,108]},{location,1289}],[<<115,101,110,100,102,105,108,101,47,53>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,101,110,100,102,105,108,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<83,101,110,100,115,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<82,97,119,70,105,108,101>>]},<<32,98,101,103,105,110,110,105,110,103,32,97,116,32>>,{code,[],[<<79,102,102,115,101,116>>]},<<32,116,111,32>>,{code,[],[<<83,111,99,107,101,116>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,121,116,101,115,83,101,110,116,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32,73,102,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<48>>]},<<32,97,108,108,32,100,97,116,97,32,97,102,116,101,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32>>,{code,[],[<<79,102,102,115,101,116>>]},<<32,105,115,32,115,101,110,116,46>>]},{p,[],[<<84,104,101,32,102,105,108,101,32,117,115,101,100,32,109,117,115,116,32,98,101,32,111,112,101,110,101,100,32,117,115,105,110,103,32,116,104,101,32>>,{code,[],[<<114,97,119>>]},<<32,102,108,97,103,44,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<115,101,110,100,102,105,108,101>>]},<<32,109,117,115,116,32,98,101,32,116,104,101,32,99,111,110,116,114,111,108,108,105,110,103,32,112,114,111,99,101,115,115,32,111,102,32,116,104,101,32,115,111,99,107,101,116,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,103,101,110,95,116,99,112,35,99,111,110,116,114,111,108,108,105,110,103,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,101,110,95,116,99,112,58,99,111,110,116,114,111,108,108,105,110,103,95,112,114,111,99,101,115,115,47,50>>]}]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,79,83,32,117,115,101,100,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,110,111,110,45,98,108,111,99,107,105,110,103,32>>,{code,[],[<<115,101,110,100,102,105,108,101>>]},<<44,32,97,110,32,69,114,108,97,110,103,32,102,97,108,108,98,97,99,107,32,117,115,105,110,103,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,103,101,110,95,116,99,112,35,115,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,101,110,95,116,99,112,58,115,101,110,100,47,50>>]}]},<<32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<99,104,117,110,107,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,99,104,117,110,107,32,115,105,122,101,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,102,97,108,108,98,97,99,107,32,116,111,32,115,101,110,100,32,100,97,116,97,46,32,73,102,32,117,115,105,110,103,32,116,104,101,32,102,97,108,108,98,97,99,107,44,32,115,101,116,32,116,104,105,115,32,116,111,32,97,32,118,97,108,117,101,32,116,104,97,116,32,99,111,109,102,111,114,116,97,98,108,121,32,102,105,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,115,32,109,101,109,111,114,121,46,32,68,101,102,97,117,108,116,32,105,115,32,50,48,32,77,66,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,52,55>>,signature => [{attribute,1289,spec,{{sendfile,5},[{type,1289,bounded_fun,[{type,1289,'fun',[{type,1289,product,[{var,1289,'RawFile'},{var,1289,'Socket'},{var,1289,'Offset'},{var,1289,'Bytes'},{var,1289,'Opts'}]},{type,1290,union,[{type,1290,tuple,[{atom,1290,ok},{type,1290,non_neg_integer,[]}]},{type,1290,tuple,[{atom,1290,error},{type,1290,union,[{remote_type,1290,[{atom,1290,inet},{atom,1290,posix},[]]},{atom,1291,closed},{atom,1291,badarg},{atom,1291,not_owner}]}]}]}]},[{type,1292,constraint,[{atom,1292,is_subtype},[{var,1292,'RawFile'},{user_type,1292,fd,[]}]]},{type,1293,constraint,[{atom,1293,is_subtype},[{var,1293,'Socket'},{remote_type,1293,[{atom,1293,inet},{atom,1293,socket},[]]}]]},{type,1294,constraint,[{atom,1294,is_subtype},[{var,1294,'Offset'},{type,1294,non_neg_integer,[]}]]},{type,1295,constraint,[{atom,1295,is_subtype},[{var,1295,'Bytes'},{type,1295,non_neg_integer,[]}]]},{type,1296,constraint,[{atom,1296,is_subtype},[{var,1296,'Opts'},{type,1296,list,[{user_type,1296,sendfile_option,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,set_cwd,1},[{file,[102,105,108,101,46,101,114,108]},{location,206}],[<<115,101,116,95,99,119,100,47,49>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,99,117,114,114,101,110,116,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,32,111,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,116,111,32>>,{code,[],[<<68,105,114>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,109,111,100,117,108,101,32>>,{code,[],[<<102,105,108,101>>]},<<32,117,115,117,97,108,108,121,32,116,114,101,97,116,32,98,105,110,97,114,105,101,115,32,97,115,32,114,97,119,32,102,105,108,101,110,97,109,101,115,44,32,116,104,97,116,32,105,115,44,32,116,104,101,121,32,97,114,101,32,112,97,115,115,101,100,32,34,97,115,32,105,115,34,32,101,118,101,110,32,119,104,101,110,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,100,111,101,115,32,110,111,116,32,97,103,114,101,101,32,119,105,116,104,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,40,41>>]}]},<<46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,101,120,112,101,99,116,115,32,98,105,110,97,114,105,101,115,32,116,111,32,98,101,32,101,110,99,111,100,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,118,97,108,117,101,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,40,41>>]},<<46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,32,97,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,115,46>>]}]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[{code,[],[<<68,105,114>>]},<<32,104,97,115,32,97,110,32,105,109,112,114,111,112,101,114,32,116,121,112,101,44,32,115,117,99,104,32,97,115,32,116,117,112,108,101,46>>]}]},{dt,[],[{code,[],[<<110,111,95,116,114,97,110,115,108,97,116,105,111,110>>]}]},{dd,[],[{p,[],[{code,[],[<<68,105,114>>]},<<32,105,115,32,97,32>>,{code,[],[<<98,105,110,97,114,121,40,41>>]},<<32,119,105,116,104,32,99,104,97,114,97,99,116,101,114,115,32,99,111,100,101,100,32,105,110,32,73,83,79,45,108,97,116,105,110,45,49,32,97,110,100,32,116,104,101,32,86,77,32,105,115,32,111,112,101,114,97,116,105,110,103,32,119,105,116,104,32,117,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,44,32,97,32,98,97,100,32,116,121,112,101,32,102,111,114,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<68,105,114>>]},<<32,119,105,108,108,32,112,114,111,98,97,98,108,121,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,55,52>>,signature => [{attribute,206,spec,{{set_cwd,1},[{type,206,bounded_fun,[{type,206,'fun',[{type,206,product,[{var,206,'Dir'}]},{type,206,union,[{atom,206,ok},{type,206,tuple,[{atom,206,error},{var,206,'Reason'}]}]}]},[{type,207,constraint,[{atom,207,is_subtype},[{var,207,'Dir'},{type,207,union,[{user_type,207,name,[]},{var,207,'EncodedBinary'}]}]]},{type,208,constraint,[{atom,208,is_subtype},[{var,208,'EncodedBinary'},{type,208,binary,[]}]]},{type,209,constraint,[{atom,209,is_subtype},[{var,209,'Reason'},{type,209,union,[{user_type,209,posix,[]},{atom,209,badarg},{atom,209,no_translation}]}]]}]]}]}}]}},{{function,sync,1},[{file,[102,105,108,101,46,101,114,108]},{location,742}],[<<115,121,110,99,47,49>>],#{<<101,110>> => [{p,[],[<<69,110,115,117,114,101,115,32,116,104,97,116,32,97,110,121,32,98,117,102,102,101,114,115,32,107,101,112,116,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,40,110,111,116,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,114,101,32,119,114,105,116,116,101,110,32,116,111,32,100,105,115,107,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,109,105,103,104,116,32,104,97,118,101,32,110,111,32,101,102,102,101,99,116,46>>]},{p,[],[<<65,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,32,105,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,116,32,101,110,111,117,103,104,32,115,112,97,99,101,32,108,101,102,116,32,116,111,32,119,114,105,116,101,32,116,104,101,32,102,105,108,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,50,49>>,signature => [{attribute,742,spec,{{sync,1},[{type,742,bounded_fun,[{type,742,'fun',[{type,742,product,[{var,742,'IoDevice'}]},{type,742,union,[{atom,742,ok},{type,742,tuple,[{atom,742,error},{var,742,'Reason'}]}]}]},[{type,743,constraint,[{atom,743,is_subtype},[{var,743,'IoDevice'},{user_type,743,io_device,[]}]]},{type,744,constraint,[{atom,744,is_subtype},[{var,744,'Reason'},{type,744,union,[{user_type,744,posix,[]},{atom,744,badarg},{atom,744,terminated}]}]]}]]}]}}]}},{{function,truncate,1},[{file,[102,105,108,101,46,101,114,108]},{location,766}],[<<116,114,117,110,99,97,116,101,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,117,110,99,97,116,101,115,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,51,55>>,signature => [{attribute,766,spec,{{truncate,1},[{type,766,bounded_fun,[{type,766,'fun',[{type,766,product,[{var,766,'IoDevice'}]},{type,766,union,[{atom,766,ok},{type,766,tuple,[{atom,766,error},{var,766,'Reason'}]}]}]},[{type,767,constraint,[{atom,767,is_subtype},[{var,767,'IoDevice'},{user_type,767,io_device,[]}]]},{type,768,constraint,[{atom,768,is_subtype},[{var,768,'Reason'},{type,768,union,[{user_type,768,posix,[]},{atom,768,badarg},{atom,768,terminated}]}]]}]]}]}}]}},{{function,write,2},[{file,[102,105,108,101,46,101,114,108]},{location,676}],[<<119,114,105,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<87,114,105,116,101,115,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,116,111,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,32,116,111,32,119,114,105,116,101,32,116,111,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,40,97,108,116,104,111,117,103,104,32,105,116,32,119,111,114,107,115,32,102,111,114,32,110,111,114,109,97,108,108,121,32,111,112,101,110,101,100,32,102,105,108,101,115,32,116,111,111,41,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,97,110,100,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,111,116,104,101,114,119,105,115,101,46>>]},{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,101,97,99,104,32,98,121,116,101,32,119,114,105,116,116,101,110,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,109,97,110,121,32,98,121,116,101,115,32,98,101,105,110,103,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,102,105,108,101,44,32,97,115,32,116,104,101,32,98,121,116,101,32,114,97,110,103,101,32,48,46,46,50,53,53,32,99,97,110,32,114,101,112,114,101,115,101,110,116,32,97,110,121,116,104,105,110,103,32,98,101,116,119,101,101,110,32,111,110,101,32,97,110,100,32,102,111,117,114,32,98,121,116,101,115,32,100,101,112,101,110,100,105,110,103,32,111,110,32,118,97,108,117,101,32,97,110,100,32,85,84,70,32,101,110,99,111,100,105,110,103,32,116,121,112,101,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,98,97,100,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,99,101,32,105,115,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,52,54>>,signature => [{attribute,676,spec,{{write,2},[{type,676,bounded_fun,[{type,676,'fun',[{type,676,product,[{var,676,'IoDevice'},{var,676,'Bytes'}]},{type,676,union,[{atom,676,ok},{type,676,tuple,[{atom,676,error},{var,676,'Reason'}]}]}]},[{type,677,constraint,[{atom,677,is_subtype},[{var,677,'IoDevice'},{type,677,union,[{user_type,677,io_device,[]},{type,677,atom,[]}]}]]},{type,678,constraint,[{atom,678,is_subtype},[{var,678,'Bytes'},{type,678,iodata,[]}]]},{type,679,constraint,[{atom,679,is_subtype},[{var,679,'Reason'},{type,679,union,[{user_type,679,posix,[]},{atom,679,badarg},{atom,679,terminated}]}]]}]]}]}}]}},{{function,write_file,2},[{file,[102,105,108,101,46,101,114,108]},{location,443}],[<<119,114,105,116,101,95,102,105,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<87,114,105,116,101,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<32,116,101,114,109,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,116,111,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,84,104,101,32,102,105,108,101,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,73,102,32,105,116,32,101,120,105,115,116,115,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,111,110,116,101,110,116,115,32,97,114,101,32,111,118,101,114,119,114,105,116,116,101,110,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,99,101,32,105,115,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,119,114,105,116,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,115,101,97,114,99,104,105,110,103,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,97,109,101,100,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,55,50>>,signature => [{attribute,443,spec,{{write_file,2},[{type,443,bounded_fun,[{type,443,'fun',[{type,443,product,[{var,443,'Filename'},{var,443,'Bytes'}]},{type,443,union,[{atom,443,ok},{type,443,tuple,[{atom,443,error},{var,443,'Reason'}]}]}]},[{type,444,constraint,[{atom,444,is_subtype},[{var,444,'Filename'},{user_type,444,name_all,[]}]]},{type,445,constraint,[{atom,445,is_subtype},[{var,445,'Bytes'},{type,445,iodata,[]}]]},{type,446,constraint,[{atom,446,is_subtype},[{var,446,'Reason'},{type,446,union,[{user_type,446,posix,[]},{atom,446,badarg},{atom,446,terminated},{atom,446,system_limit}]}]]}]]}]}}]}},{{function,write_file,3},[{file,[102,105,108,101,46,101,114,108]},{location,455}],[<<119,114,105,116,101,95,102,105,108,101,47,51>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<119,114,105,116,101,95,102,105,108,101,47,50>>]},<<44,32,98,117,116,32,116,97,107,101,115,32,97,32,116,104,105,114,100,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<77,111,100,101,115>>]},<<44,32,97,32,108,105,115,116,32,111,102,32,112,111,115,115,105,98,108,101,32,109,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46,32,84,104,101,32,109,111,100,101,32,102,108,97,103,115,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,97,110,100,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,97,114,101,32,105,109,112,108,105,99,105,116,44,32,115,111,32,116,104,101,121,32,97,114,101,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,48,57>>,signature => [{attribute,455,spec,{{write_file,3},[{type,455,bounded_fun,[{type,455,'fun',[{type,455,product,[{var,455,'Filename'},{var,455,'Bytes'},{var,455,'Modes'}]},{type,455,union,[{atom,455,ok},{type,455,tuple,[{atom,455,error},{var,455,'Reason'}]}]}]},[{type,456,constraint,[{atom,456,is_subtype},[{var,456,'Filename'},{user_type,456,name_all,[]}]]},{type,457,constraint,[{atom,457,is_subtype},[{var,457,'Bytes'},{type,457,iodata,[]}]]},{type,458,constraint,[{atom,458,is_subtype},[{var,458,'Modes'},{type,458,list,[{user_type,458,mode,[]}]}]]},{type,459,constraint,[{atom,459,is_subtype},[{var,459,'Reason'},{type,459,union,[{user_type,459,posix,[]},{atom,459,badarg},{atom,459,terminated},{atom,459,system_limit}]}]]}]]}]}}]}},{{function,write_file_info,3},[{file,[102,105,108,101,46,101,114,108]},{location,380}],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,51>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,50,48>>,equiv => {function,write_file_info,2},signature => [{attribute,380,spec,{{write_file_info,3},[{type,380,bounded_fun,[{type,380,'fun',[{type,380,product,[{var,380,'Filename'},{var,380,'FileInfo'},{var,380,'Opts'}]},{type,380,union,[{atom,380,ok},{type,380,tuple,[{atom,380,error},{var,380,'Reason'}]}]}]},[{type,381,constraint,[{atom,381,is_subtype},[{var,381,'Filename'},{user_type,381,name_all,[]}]]},{type,382,constraint,[{atom,382,is_subtype},[{var,382,'Opts'},{type,382,list,[{user_type,382,file_info_option,[]}]}]]},{type,383,constraint,[{atom,383,is_subtype},[{var,383,'FileInfo'},{user_type,383,file_info,[]}]]},{type,384,constraint,[{atom,384,is_subtype},[{var,384,'Reason'},{type,384,union,[{user_type,384,posix,[]},{atom,384,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,write_file_info,2},[{file,[102,105,108,101,46,101,114,108]},{location,372}],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,102,105,108,101,32,105,110,102,111,114,109,97,116,105,111,110,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,73,110,102,111>>]},<<32,105,115,32,97,32,114,101,99,111,114,100,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<44,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,75,101,114,110,101,108,32,105,110,99,108,117,100,101,32,102,105,108,101,32>>,{code,[],[<<102,105,108,101,46,104,114,108>>]},<<46,32,73,110,99,108,117,100,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,100,105,114,101,99,116,105,118,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,32,102,114,111,109,32,119,104,105,99,104,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<32,45,105,110,99,108,117,100,101,95,108,105,98,40,34,107,101,114,110,101,108,47,105,110,99,108,117,100,101,47,102,105,108,101,46,104,114,108,34,41,46>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,116,121,112,101,32,115,101,116,32,105,110,32>>,{code,[],[<<97,116,105,109,101>>]},<<44,32>>,{code,[],[<<109,116,105,109,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<99,116,105,109,101>>]},<<32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,116,105,109,101,32,116,121,112,101,32,115,101,116,32,105,110,32>>,{code,[],[<<79,112,116,115,32,58,58,32,123,116,105,109,101,44,32,84,121,112,101,125>>]},<<32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,111,99,97,108>>]}]},{dd,[],[{p,[],[<<73,110,116,101,114,112,114,101,116,115,32,116,104,101,32,116,105,109,101,32,115,101,116,32,97,115,32,108,111,99,97,108,46>>]}]},{dt,[],[{code,[],[<<117,110,105,118,101,114,115,97,108>>]}]},{dd,[],[{p,[],[<<73,110,116,101,114,112,114,101,116,115,32,105,116,32,97,115,32,117,110,105,118,101,114,115,97,108,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<112,111,115,105,120>>]}]},{dd,[],[{p,[],[<<77,117,115,116,32,98,101,32,115,101,99,111,110,100,115,32,115,105,110,99,101,32,111,114,32,98,101,102,111,114,101,32,85,110,105,120,32,116,105,109,101,32,101,112,111,99,104,44,32,119,104,105,99,104,32,105,115,32,49,57,55,48,45,48,49,45,48,49,32,48,48,58,48,48,32,85,84,67,46>>]}]}]},{p,[],[<<68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<123,116,105,109,101,44,32,108,111,99,97,108,125>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,97,110,100,32,111,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,108,111,99,97,108,32,102,105,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,101,108,100,115,32,97,114,101,32,117,115,101,100,32,102,114,111,109,32,116,104,101,32,114,101,99,111,114,100,44,32,105,102,32,116,104,101,121,32,97,114,101,32,115,112,101,99,105,102,105,101,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<109,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,119,114,105,116,116,101,110,46>>]}]},{dt,[],[{code,[],[<<99,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<79,110,32,85,110,105,120,44,32,97,110,121,32,118,97,108,117,101,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,105,103,110,111,114,101,100,32,40,116,104,101,32,34,99,116,105,109,101,34,32,102,111,114,32,116,104,101,32,102,105,108,101,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,41,46,32,79,110,32,87,105,110,100,111,119,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,116,104,101,32,110,101,119,32,99,114,101,97,116,105,111,110,32,116,105,109,101,32,116,111,32,115,101,116,32,102,111,114,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<109,111,100,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,112,101,114,109,105,115,115,105,111,110,115,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,116,32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<56,35,48,48,52,48,48>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,50,48,48>>]}]},{dd,[],[{p,[],[<<87,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,49,48,48>>]}]},{dd,[],[{p,[],[<<69,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,52,48>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,50,48>>]}]},{dd,[],[{p,[],[<<87,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,49,48>>]}]},{dd,[],[{p,[],[<<69,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,52>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,50>>]}]},{dd,[],[{p,[],[<<87,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,49>>]}]},{dd,[],[{p,[],[<<69,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<49,54,35,56,48,48>>]}]},{dd,[],[{p,[],[<<83,101,116,32,117,115,101,114,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]},{dt,[],[{code,[],[<<49,54,35,52,48,48>>]}]},{dd,[],[{p,[],[<<83,101,116,32,103,114,111,117,112,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]}]},{p,[],[<<79,110,32,85,110,105,120,32,112,108,97,116,102,111,114,109,115,44,32,111,116,104,101,114,32,98,105,116,115,32,116,104,97,110,32,116,104,111,115,101,32,108,105,115,116,101,100,32,97,98,111,118,101,32,109,97,121,32,98,101,32,115,101,116,46>>]}]},{dt,[],[{code,[],[<<117,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<73,110,100,105,99,97,116,101,115,32,116,104,101,32,102,105,108,101,32,111,119,110,101,114,46,32,73,103,110,111,114,101,100,32,102,111,114,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,46>>]}]},{dt,[],[{code,[],[<<103,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,32,102,105,108,101,32,111,119,110,101,114,32,98,101,108,111,110,103,115,32,116,111,46,32,73,103,110,111,114,101,100,32,102,111,114,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,50,48>>,signature => [{attribute,372,spec,{{write_file_info,2},[{type,372,bounded_fun,[{type,372,'fun',[{type,372,product,[{var,372,'Filename'},{var,372,'FileInfo'}]},{type,372,union,[{atom,372,ok},{type,372,tuple,[{atom,372,error},{var,372,'Reason'}]}]}]},[{type,373,constraint,[{atom,373,is_subtype},[{var,373,'Filename'},{user_type,373,name_all,[]}]]},{type,374,constraint,[{atom,374,is_subtype},[{var,374,'FileInfo'},{user_type,374,file_info,[]}]]},{type,375,constraint,[{atom,375,is_subtype},[{var,375,'Reason'},{type,375,union,[{user_type,375,posix,[]},{atom,375,badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{type,deep_list,0},[{file,[102,105,108,101,46,101,114,108]},{location,101}],[<<45,116,121,112,101,32,100,101,101,112,95,108,105,115,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,101,type,{deep_list,{type,101,list,[{type,101,union,[{type,101,char,[]},{type,101,atom,[]},{user_type,101,deep_list,[]}]}]},[]}}]}},{{type,fd,0},[{file,[102,105,108,101,46,101,114,108]},{location,87}],[<<102,100,40,41>>],#{<<101,110>> => [{p,[],[<<65,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,97,119>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,97,119>>]}]},<<32,109,111,100,101,46>>]}]},#{signature => [{attribute,87,type,{fd,{type,87,record,[{atom,87,file_descriptor}]},[]}}]}},{{type,filename,0},[{file,[102,105,108,101,46,101,114,108]},{location,84}],[<<45,116,121,112,101,32,102,105,108,101,110,97,109,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32,97,108,115,111,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<110,97,109,101,95,97,108,108,40,41>>]}]},<<32,116,121,112,101,46>>]}]},#{signature => [{attribute,84,type,{filename,{type,84,string,[]},[]}}]}},{{type,filename_all,0},[{file,[102,105,108,101,46,101,114,108]},{location,85}],[<<45,116,121,112,101,32,102,105,108,101,110,97,109,101,95,97,108,108,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32,97,108,115,111,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<110,97,109,101,95,97,108,108,40,41>>]}]},<<32,116,121,112,101,46>>]}]},#{signature => [{attribute,85,type,{filename_all,{type,85,union,[{type,85,string,[]},{type,85,binary,[]}]},[]}}]}},{{type,io_device,0},[{file,[102,105,108,101,46,101,114,108]},{location,88}],[<<45,116,121,112,101,32,105,111,95,100,101,118,105,99,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<59,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,105,115,32,97,32,112,114,111,99,101,115,115,32,104,97,110,100,108,105,110,103,32,73,47,79,45,112,114,111,116,111,99,111,108,115,46>>]}]},#{signature => [{attribute,88,type,{io_device,{type,88,union,[{type,88,pid,[]},{user_type,88,fd,[]}]},[]}}]}},{{type,name,0},[{file,[102,105,108,101,46,101,114,108]},{location,102}],[<<45,116,121,112,101,32,110,97,109,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<73,102,32,86,77,32,105,115,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,44,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<32,97,110,100,32>>,{code,[],[<<99,104,97,114,40,41>>]},<<32,97,114,101,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,62,32,50,53,53,46,32,83,101,101,32,97,108,115,111,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<110,97,109,101,95,97,108,108,40,41>>]}]},<<32,116,121,112,101,46>>]}]},#{signature => [{attribute,102,type,{name,{type,102,union,[{type,102,string,[]},{type,102,atom,[]},{user_type,102,deep_list,[]}]},[]}}]}},{{type,name_all,0},[{file,[102,105,108,101,46,101,114,108]},{location,103}],[<<45,116,121,112,101,32,110,97,109,101,95,97,108,108,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<73,102,32,86,77,32,105,115,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,62,32,50,53,53,46,32>>,{code,[],[<<82,97,119,70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,32,102,105,108,101,110,97,109,101,32,110,111,116,32,115,117,98,106,101,99,116,32,116,111,32,85,110,105,99,111,100,101,32,116,114,97,110,115,108,97,116,105,111,110,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,99,104,97,114,97,99,116,101,114,115,32,110,111,116,32,99,111,110,102,111,114,109,105,110,103,32,116,111,32,116,104,101,32,85,110,105,99,111,100,101,32,101,110,99,111,100,105,110,103,32,101,120,112,101,99,116,101,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,40,116,104,97,116,32,105,115,44,32,110,111,110,45,85,84,70,45,56,32,99,104,97,114,97,99,116,101,114,115,32,97,108,116,104,111,117,103,104,32,116,104,101,32,86,77,32,105,115,32,115,116,97,114,116,101,100,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,41,46,32,78,117,108,108,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,116,101,103,101,114,32,118,97,108,117,101,32,122,101,114,111,41,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,97,108,108,111,119,101,100,32,105,110,32,102,105,108,101,110,97,109,101,115,32,40,110,111,116,32,101,118,101,110,32,97,116,32,116,104,101,32,101,110,100,41,46>>]}]},#{signature => [{attribute,103,type,{name_all,{type,103,union,[{type,103,string,[]},{type,103,atom,[]},{user_type,103,deep_list,[]},{ann_type,103,[{var,103,'RawFilename'},{type,103,binary,[]}]}]},[]}}]}},{{type,posix,0},[{file,[102,105,108,101,46,101,114,108]},{location,104}],[<<45,116,121,112,101,32,112,111,115,105,120,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,97,116,111,109,32,116,104,97,116,32,105,115,32,110,97,109,101,100,32,102,114,111,109,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,115,32,117,115,101,100,32,105,110,32,85,110,105,120,44,32,97,110,100,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,32,108,105,98,114,97,114,105,101,115,32,111,102,32,109,111,115,116,32,67,32,99,111,109,112,105,108,101,114,115,46>>]}]},#{signature => [{attribute,104,type,{posix,{type,105,union,[{atom,105,eacces},{atom,105,eagain},{atom,106,ebadf},{atom,106,ebadmsg},{atom,106,ebusy},{atom,107,edeadlk},{atom,107,edeadlock},{atom,107,edquot},{atom,108,eexist},{atom,109,efault},{atom,109,efbig},{atom,109,eftype},{atom,110,eintr},{atom,110,einval},{atom,110,eio},{atom,110,eisdir},{atom,111,eloop},{atom,112,emfile},{atom,112,emlink},{atom,112,emultihop},{atom,113,enametoolong},{atom,113,enfile},{atom,114,enobufs},{atom,114,enodev},{atom,114,enolck},{atom,114,enolink},{atom,114,enoent},{atom,115,enomem},{atom,115,enospc},{atom,115,enosr},{atom,115,enostr},{atom,115,enosys},{atom,116,enotblk},{atom,116,enotdir},{atom,116,enotsup},{atom,116,enxio},{atom,117,eopnotsupp},{atom,117,eoverflow},{atom,118,eperm},{atom,118,epipe},{atom,119,erange},{atom,119,erofs},{atom,120,espipe},{atom,120,esrch},{atom,120,estale},{atom,121,etxtbsy},{atom,122,exdev}]},[]}}]}},{{type,date_time,0},[{file,[102,105,108,101,46,101,114,108]},{location,123}],[<<45,116,121,112,101,32,100,97,116,101,95,116,105,109,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<77,117,115,116,32,100,101,110,111,116,101,32,97,32,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{signature => [{attribute,123,type,{date_time,{remote_type,123,[{atom,123,calendar},{atom,123,datetime},[]]},[]}}]}},{{type,file_info,0},[{file,[102,105,108,101,46,101,114,108]},{location,86}],[<<45,116,121,112,101,32,102,105,108,101,95,105,110,102,111,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,86,type,{file_info,{type,86,record,[{atom,86,file_info}]},[]}}]}},{{type,location,0},[{file,[102,105,108,101,46,101,114,108]},{location,89}],[<<45,116,121,112,101,32,108,111,99,97,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,89,type,{location,{type,89,union,[{type,89,integer,[]},{type,89,tuple,[{atom,89,bof},{ann_type,89,[{var,89,'Offset'},{type,89,integer,[]}]}]},{type,90,tuple,[{atom,90,cur},{ann_type,90,[{var,90,'Offset'},{type,90,integer,[]}]}]},{type,91,tuple,[{atom,91,eof},{ann_type,91,[{var,91,'Offset'},{type,91,integer,[]}]}]},{atom,91,bof},{atom,91,cur},{atom,91,eof}]},[]}}]}},{{type,mode,0},[{file,[102,105,108,101,46,101,114,108]},{location,92}],[<<45,116,121,112,101,32,109,111,100,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,92,type,{mode,{type,92,union,[{atom,92,read},{atom,92,write},{atom,92,append},{atom,93,exclusive},{atom,93,raw},{atom,93,binary},{type,94,tuple,[{atom,94,delayed_write},{ann_type,95,[{var,95,'Size'},{type,95,non_neg_integer,[]}]},{ann_type,96,[{var,96,'Delay'},{type,96,non_neg_integer,[]}]}]},{atom,97,delayed_write},{type,97,tuple,[{atom,97,read_ahead},{ann_type,97,[{var,97,'Size'},{type,97,pos_integer,[]}]}]},{atom,98,read_ahead},{atom,98,compressed},{type,99,tuple,[{atom,99,encoding},{remote_type,99,[{atom,99,unicode},{atom,99,encoding},[]]}]},{atom,100,sync}]},[]}}]}},{{type,file_info_option,0},[{file,[102,105,108,101,46,101,114,108]},{location,129}],[<<45,116,121,112,101,32,102,105,108,101,95,105,110,102,111,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,129,type,{file_info_option,{type,129,union,[{type,129,tuple,[{atom,129,time},{atom,129,local}]},{type,129,tuple,[{atom,129,time},{atom,129,universal}]},{type,130,tuple,[{atom,130,time},{atom,130,posix}]},{atom,130,raw}]},[]}}]}}]}. \ No newline at end of file
+{docs_v1,[{file,[102,105,108,101,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<84,104,105,115,32,109,111,100,117,108,101,32,112,114,111,118,105,100,101,115,32,97,110,32,105,110,116,101,114,102,97,99,101,32,116,111,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<70,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,97,114,101,32,111,110,108,121,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,97,112,112,101,97,114,32,97,116,111,109,105,99,32,119,104,101,110,32,103,111,105,110,103,32,116,104,114,111,117,103,104,32,116,104,101,32,115,97,109,101,32,102,105,108,101,32,115,101,114,118,101,114,46,32,65,32,78,73,70,32,111,114,32,111,116,104,101,114,32,79,83,32,112,114,111,99,101,115,115,32,109,97,121,32,111,98,115,101,114,118,101,32,105,110,116,101,114,109,101,100,105,97,116,101,32,115,116,101,112,115,32,111,110,32,99,101,114,116,97,105,110,32,111,112,101,114,97,116,105,111,110,115,32,111,110,32,115,111,109,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,115,44,32,101,103,46,32,114,101,110,97,109,105,110,103,32,97,110,32,101,120,105,115,116,105,110,103,32,102,105,108,101,32,111,110,32,87,105,110,100,111,119,115,44,32,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]},<<32>>]},<<111,110,32,97,110,121,32,79,83,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,119,114,105,116,105,110,103,46>>]}]},{p,[],[<<82,101,103,97,114,100,105,110,103,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,44,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,99,97,110,32,111,112,101,114,97,116,101,32,105,110,32,116,119,111,32,109,111,100,101,115,46,32,84,104,101,32,99,117,114,114,101,110,116,32,109,111,100,101,32,99,97,110,32,98,101,32,113,117,101,114,105,101,100,32,117,115,105,110,103,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>]}]},<<46,32,73,116,32,114,101,116,117,114,110,115,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,111,114,32>>,{code,[],[<<117,116,102,56>>]},<<46>>]},{p,[],[<<73,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,109,111,100,101,44,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,100,111,101,115,32,110,111,116,32,99,104,97,110,103,101,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,102,105,108,101,110,97,109,101,115,46,32,73,110,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,44,32,102,105,108,101,110,97,109,101,115,32,99,97,110,32,99,111,110,116,97,105,110,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,50,53,53,32,97,110,100,32,116,104,101,32,86,77,32,99,111,110,118,101,114,116,115,32,102,105,108,101,110,97,109,101,115,32,98,97,99,107,32,97,110,100,32,102,111,114,116,104,32,116,111,32,116,104,101,32,110,97,116,105,118,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,40,117,115,117,97,108,108,121,32,85,84,70,45,56,44,32,98,117,116,32,85,84,70,45,49,54,32,111,110,32,87,105,110,100,111,119,115,41,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,109,111,100,101,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,46,32,87,105,110,100,111,119,115,44,32,77,97,99,79,83,32,88,32,97,110,100,32,65,110,100,114,111,105,100,32,101,110,102,111,114,99,101,32,99,111,110,115,105,115,116,101,110,116,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,116,104,101,32,86,77,32,117,115,101,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,46>>]},{p,[],[<<79,110,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,115,32,119,105,116,104,32,116,114,97,110,115,112,97,114,101,110,116,32,110,97,109,105,110,103,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,97,108,108,32,85,110,105,120,32,115,121,115,116,101,109,115,32,101,120,99,101,112,116,32,77,97,99,79,83,32,88,41,44,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<32,105,102,32,116,104,101,32,116,101,114,109,105,110,97,108,32,115,117,112,112,111,114,116,115,32,85,84,70,45,56,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<46,32,84,104,101,32,100,101,102,97,117,108,116,32,99,97,110,32,98,101,32,111,118,101,114,114,105,100,100,101,110,32,117,115,105,110,103,32>>,{code,[],[<<43,102,110,108>>]},<<32,40,116,111,32,102,111,114,99,101,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,109,111,100,101,41,32,111,114,32>>,{code,[],[<<43,102,110,117>>]},<<32,40,116,111,32,102,111,114,99,101,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,41,32,119,104,101,110,32,115,116,97,114,116,105,110,103,32>>,{a,[{href,<<101,114,116,115,58,101,114,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,99,111,109>>}],[{code,[],[<<101,114,108>>]}]},<<46>>]},{p,[],[<<79,110,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,115,32,119,105,116,104,32,116,114,97,110,115,112,97,114,101,110,116,32,110,97,109,105,110,103,44,32,102,105,108,101,115,32,99,97,110,32,98,101,32,105,110,99,111,110,115,105,115,116,101,110,116,108,121,32,110,97,109,101,100,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,115,111,109,101,32,102,105,108,101,115,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,85,84,70,45,56,32,119,104,105,108,101,32,111,116,104,101,114,115,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,73,83,79,32,76,97,116,105,110,45,49,46,32,84,104,101,32,99,111,110,99,101,112,116,32,111,102,32>>,{em,[],[<<114,97,119,32,102,105,108,101,110,97,109,101,115>>]},<<32,105,115,32,105,110,116,114,111,100,117,99,101,100,32,116,111,32,104,97,110,100,108,101,32,102,105,108,101,32,115,121,115,116,101,109,115,32,119,105,116,104,32,105,110,99,111,110,115,105,115,116,101,110,116,32,110,97,109,105,110,103,32,119,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,46>>]},{p,[],[<<65,32>>,{em,[],[<<114,97,119,32,102,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,32,102,105,108,101,110,97,109,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,105,110,97,114,121,46,32,84,104,101,32,69,114,108,97,110,103,32,86,77,32,100,111,101,115,32,110,111,116,32,116,114,97,110,115,108,97,116,101,32,97,32,102,105,108,101,110,97,109,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,105,110,97,114,121,32,111,110,32,115,121,115,116,101,109,115,32,119,105,116,104,32,116,114,97,110,115,112,97,114,101,110,116,32,110,97,109,105,110,103,46>>]},{p,[],[<<87,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32>>,{code,[],[<<117,116,102,56>>]},<<32,109,111,100,101,44,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,108,105,115,116,95,100,105,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<108,105,115,116,95,100,105,114,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,107,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,108,105,110,107,47,49>>]}]},<<32,110,101,118,101,114,32,114,101,116,117,114,110,32,114,97,119,32,102,105,108,101,110,97,109,101,115,46,32,84,111,32,114,101,116,117,114,110,32,97,108,108,32,102,105,108,101,110,97,109,101,115,32,105,110,99,108,117,100,105,110,103,32,114,97,119,32,102,105,108,101,110,97,109,101,115,44,32,117,115,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,108,105,115,116,95,100,105,114,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<108,105,115,116,95,100,105,114,95,97,108,108,47,49>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,107,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,101,97,100,95,108,105,110,107,95,97,108,108,47,49>>]}]},<<46>>]},{p,[],[<<83,101,101,32,97,108,115,111,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,95,117,115,97,103,101,35,110,111,116,101,115,45,97,98,111,117,116,45,114,97,119,45,102,105,108,101,110,97,109,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,103,117,105,100,101>>}],[<<78,111,116,101,115,32,65,98,111,117,116,32,82,97,119,32,70,105,108,101,110,97,109,101,115>>]},<<32,105,110,32,116,104,101,32,83,84,68,76,73,66,32,85,115,101,114,39,115,32,71,117,105,100,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<70,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,117,115,101,100,32,116,111,32,97,99,99,101,112,116,32,102,105,108,101,110,97,109,101,115,32,99,111,110,116,97,105,110,105,110,103,32,110,117,108,108,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,116,101,103,101,114,32,118,97,108,117,101,32,122,101,114,111,41,46,32,84,104,105,115,32,99,97,117,115,101,100,32,116,104,101,32,110,97,109,101,32,116,111,32,98,101,32,116,114,117,110,99,97,116,101,100,32,97,110,100,32,105,110,32,115,111,109,101,32,99,97,115,101,115,32,97,114,103,117,109,101,110,116,115,32,116,111,32,112,114,105,109,105,116,105,118,101,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,98,101,32,109,105,120,101,100,32,117,112,46,32,70,105,108,101,110,97,109,101,115,32,99,111,110,116,97,105,110,105,110,103,32,110,117,108,108,32,99,104,97,114,97,99,116,101,114,115,32,105,110,115,105,100,101,32,116,104,101,32,102,105,108,101,110,97,109,101,32,97,114,101,32,110,111,119,32>>,{em,[],[<<114,101,106,101,99,116,101,100>>]},<<32,97,110,100,32,119,105,108,108,32,99,97,117,115,101,32,112,114,105,109,105,116,105,118,101,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,102,97,105,108,46>>]}]},{h2,[],[<<80,79,83,73,88,32,69,114,114,111,114,32,67,111,100,101,115>>]},{ul,[],[{li,[],[{code,[],[<<101,97,99,99,101,115>>]},<<32,45,32,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100>>]},{li,[],[{code,[],[<<101,97,103,97,105,110>>]},<<32,45,32,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101>>]},{li,[],[{code,[],[<<101,98,97,100,102>>]},<<32,45,32,66,97,100,32,102,105,108,101,32,110,117,109,98,101,114>>]},{li,[],[{code,[],[<<101,98,117,115,121>>]},<<32,45,32,70,105,108,101,32,98,117,115,121>>]},{li,[],[{code,[],[<<101,100,113,117,111,116>>]},<<32,45,32,68,105,115,107,32,113,117,111,116,97,32,101,120,99,101,101,100,101,100>>]},{li,[],[{code,[],[<<101,101,120,105,115,116>>]},<<32,45,32,70,105,108,101,32,97,108,114,101,97,100,121,32,101,120,105,115,116,115>>]},{li,[],[{code,[],[<<101,102,97,117,108,116>>]},<<32,45,32,66,97,100,32,97,100,100,114,101,115,115,32,105,110,32,115,121,115,116,101,109,32,99,97,108,108,32,97,114,103,117,109,101,110,116>>]},{li,[],[{code,[],[<<101,102,98,105,103>>]},<<32,45,32,70,105,108,101,32,116,111,111,32,108,97,114,103,101>>]},{li,[],[{code,[],[<<101,105,110,116,114>>]},<<32,45,32,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108>>]},{li,[],[{code,[],[<<101,105,110,118,97,108>>]},<<32,45,32,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116>>]},{li,[],[{code,[],[<<101,105,111>>]},<<32,45,32,73,47,79,32,101,114,114,111,114>>]},{li,[],[{code,[],[<<101,105,115,100,105,114>>]},<<32,45,32,73,108,108,101,103,97,108,32,111,112,101,114,97,116,105,111,110,32,111,110,32,97,32,100,105,114,101,99,116,111,114,121>>]},{li,[],[{code,[],[<<101,108,111,111,112>>]},<<32,45,32,84,111,111,32,109,97,110,121,32,108,101,118,101,108,115,32,111,102,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115>>]},{li,[],[{code,[],[<<101,109,102,105,108,101>>]},<<32,45,32,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115>>]},{li,[],[{code,[],[<<101,109,108,105,110,107>>]},<<32,45,32,84,111,111,32,109,97,110,121,32,108,105,110,107,115>>]},{li,[],[{code,[],[<<101,110,97,109,101,116,111,111,108,111,110,103>>]},<<32,45,32,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103>>]},{li,[],[{code,[],[<<101,110,102,105,108,101>>]},<<32,45,32,70,105,108,101,32,116,97,98,108,101,32,111,118,101,114,102,108,111,119>>]},{li,[],[{code,[],[<<101,110,111,100,101,118>>]},<<32,45,32,78,111,32,115,117,99,104,32,100,101,118,105,99,101>>]},{li,[],[{code,[],[<<101,110,111,101,110,116>>]},<<32,45,32,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121>>]},{li,[],[{code,[],[<<101,110,111,109,101,109>>]},<<32,45,32,78,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121>>]},{li,[],[{code,[],[<<101,110,111,115,112,99>>]},<<32,45,32,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101>>]},{li,[],[{code,[],[<<101,110,111,116,98,108,107>>]},<<32,45,32,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100>>]},{li,[],[{code,[],[<<101,110,111,116,100,105,114>>]},<<32,45,32,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121>>]},{li,[],[{code,[],[<<101,110,111,116,115,117,112>>]},<<32,45,32,79,112,101,114,97,116,105,111,110,32,110,111,116,32,115,117,112,112,111,114,116,101,100>>]},{li,[],[{code,[],[<<101,110,120,105,111>>]},<<32,45,32,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115>>]},{li,[],[{code,[],[<<101,112,101,114,109>>]},<<32,45,32,78,111,116,32,111,119,110,101,114>>]},{li,[],[{code,[],[<<101,112,105,112,101>>]},<<32,45,32,66,114,111,107,101,110,32,112,105,112,101>>]},{li,[],[{code,[],[<<101,114,111,102,115>>]},<<32,45,32,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109>>]},{li,[],[{code,[],[<<101,115,112,105,112,101>>]},<<32,45,32,73,110,118,97,108,105,100,32,115,101,101,107>>]},{li,[],[{code,[],[<<101,115,114,99,104>>]},<<32,45,32,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115>>]},{li,[],[{code,[],[<<101,115,116,97,108,101>>]},<<32,45,32,83,116,97,108,101,32,114,101,109,111,116,101,32,102,105,108,101,32,104,97,110,100,108,101>>]},{li,[],[{code,[],[<<101,120,100,101,118>>]},<<32,45,32,67,114,111,115,115,45,100,111,109,97,105,110,32,108,105,110,107>>]}]},{h2,[],[<<80,101,114,102,111,114,109,97,110,99,101>>]},{p,[],[<<70,111,114,32,105,110,99,114,101,97,115,101,100,32,112,101,114,102,111,114,109,97,110,99,101,44,32,114,97,119,32,102,105,108,101,115,32,97,114,101,32,114,101,99,111,109,109,101,110,100,101,100,46>>]},{p,[],[<<65,32,110,111,114,109,97,108,32,102,105,108,101,32,105,115,32,114,101,97,108,108,121,32,97,32,112,114,111,99,101,115,115,32,115,111,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,97,115,32,97,110,32,73,47,79,32,100,101,118,105,99,101,32,40,115,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111>>]}]},<<41,46,32,84,104,101,114,101,102,111,114,101,44,32,119,104,101,110,32,100,97,116,97,32,105,115,32,119,114,105,116,116,101,110,32,116,111,32,97,32,110,111,114,109,97,108,32,102,105,108,101,44,32,116,104,101,32,115,101,110,100,105,110,103,32,111,102,32,116,104,101,32,100,97,116,97,32,116,111,32,116,104,101,32,102,105,108,101,32,112,114,111,99,101,115,115,44,32,99,111,112,105,101,115,32,97,108,108,32,100,97,116,97,32,116,104,97,116,32,97,114,101,32,110,111,116,32,98,105,110,97,114,105,101,115,46,32,79,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,105,110,32,98,105,110,97,114,121,32,109,111,100,101,32,97,110,100,32,119,114,105,116,105,110,103,32,98,105,110,97,114,105,101,115,32,105,115,32,116,104,101,114,101,102,111,114,101,32,114,101,99,111,109,109,101,110,100,101,100,46,32,73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,111,110,32,97,110,111,116,104,101,114,32,110,111,100,101,44,32,111,114,32,105,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,114,117,110,115,32,97,115,32,115,108,97,118,101,32,116,111,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,97,110,111,116,104,101,114,32,110,111,100,101,44,32,97,108,115,111,32,98,105,110,97,114,105,101,115,32,97,114,101,32,99,111,112,105,101,100,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<82,97,119,32,102,105,108,101,115,32,117,115,101,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,111,102,32,116,104,101,32,104,111,115,116,32,109,97,99,104,105,110,101,32,111,102,32,116,104,101,32,110,111,100,101,46,32,70,111,114,32,110,111,114,109,97,108,32,102,105,108,101,115,32,40,110,111,110,45,114,97,119,41,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,117,115,101,100,32,116,111,32,102,105,110,100,32,116,104,101,32,102,105,108,101,115,44,32,97,110,100,32,105,102,32,116,104,101,32,110,111,100,101,32,105,115,32,114,117,110,110,105,110,103,32,105,116,115,32,102,105,108,101,32,115,101,114,118,101,114,32,97,115,32,115,108,97,118,101,32,116,111,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,97,110,111,116,104,101,114,32,110,111,100,101,44,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,110,111,100,101,32,114,117,110,115,32,111,110,32,115,111,109,101,32,111,116,104,101,114,32,104,111,115,116,32,109,97,99,104,105,110,101,44,32,116,104,101,121,32,99,97,110,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,102,105,108,101,32,115,121,115,116,101,109,115,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,105,115,32,115,101,108,100,111,109,32,97,32,112,114,111,98,108,101,109,46>>]}]},{p,[],[{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<32,99,97,110,32,98,101,32,103,105,118,101,110,32,116,104,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,97,100,95,97,104,101,97,100>>]},<<32,116,111,32,116,117,114,110,32,111,110,32,99,97,99,104,105,110,103,44,32,119,104,105,99,104,32,119,105,108,108,32,114,101,100,117,99,101,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,115,32,97,110,100,32,103,114,101,97,116,108,121,32,105,109,112,114,111,118,101,32,112,101,114,102,111,114,109,97,110,99,101,32,102,111,114,32,115,109,97,108,108,32,114,101,97,100,115,32,97,110,100,32,119,114,105,116,101,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,111,118,101,114,104,101,97,100,32,119,111,110,39,116,32,100,105,115,97,112,112,101,97,114,32,99,111,109,112,108,101,116,101,108,121,32,97,110,100,32,105,116,39,115,32,98,101,115,116,32,116,111,32,107,101,101,112,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,97,32,109,105,110,105,109,117,109,46,32,65,115,32,97,32,99,111,110,116,114,105,118,101,100,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,117,110,99,116,105,111,110,32,119,114,105,116,101,115,32,52,77,66,32,105,110,32,50,46,53,32,115,101,99,111,110,100,115,32,119,104,101,110,32,116,101,115,116,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,40,78,97,109,101,41,32,45,62,10,32,32,32,32,123,111,107,44,32,70,100,125,32,61,32,102,105,108,101,58,111,112,101,110,40,78,97,109,101,44,32,91,114,97,119,44,32,119,114,105,116,101,44,32,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,98,105,110,97,114,121,93,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,70,100,44,32,52,32,98,115,108,32,50,48,41,44,10,32,32,32,32,102,105,108,101,58,99,108,111,115,101,40,70,100,41,46,10,10,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,95,70,100,44,32,48,41,32,45,62,10,32,32,32,32,111,107,59,10,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,70,100,44,32,77,41,32,45,62,10,32,32,32,32,111,107,32,61,32,102,105,108,101,58,119,114,105,116,101,40,70,100,44,32,60,60,48,62,62,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,115,108,111,119,95,49,40,70,100,44,32,77,32,45,32,49,41,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,102,117,110,99,116,105,111,110,97,108,108,121,32,101,113,117,105,118,97,108,101,110,116,32,99,111,100,101,32,119,114,105,116,101,115,32,49,50,56,32,98,121,116,101,115,32,112,101,114,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<32,97,110,100,32,115,111,32,100,111,101,115,32,116,104,101,32,115,97,109,101,32,119,111,114,107,32,105,110,32,48,46,48,56,32,115,101,99,111,110,100,115,44,32,119,104,105,99,104,32,105,115,32,114,111,117,103,104,108,121,32,51,48,32,116,105,109,101,115,32,102,97,115,116,101,114,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<99,114,101,97,116,101,95,102,105,108,101,40,78,97,109,101,41,32,45,62,10,32,32,32,32,123,111,107,44,32,70,100,125,32,61,32,102,105,108,101,58,111,112,101,110,40,78,97,109,101,44,32,91,114,97,119,44,32,119,114,105,116,101,44,32,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,98,105,110,97,114,121,93,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,52,32,98,115,108,32,50,48,41,44,10,32,32,32,32,102,105,108,101,58,99,108,111,115,101,40,70,100,41,44,10,32,32,32,32,111,107,46,10,10,99,114,101,97,116,101,95,102,105,108,101,95,49,40,95,70,100,44,32,48,41,32,45,62,10,32,32,32,32,111,107,59,10,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,41,32,119,104,101,110,32,77,32,62,61,32,49,50,56,32,45,62,10,32,32,32,32,111,107,32,61,32,102,105,108,101,58,119,114,105,116,101,40,70,100,44,32,60,60,48,58,40,49,50,56,41,47,117,110,105,116,58,56,62,62,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,32,45,32,49,50,56,41,59,10,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,41,32,45,62,10,32,32,32,32,111,107,32,61,32,102,105,108,101,58,119,114,105,116,101,40,70,100,44,32,60,60,48,58,40,77,41,47,117,110,105,116,58,56,62,62,41,44,10,32,32,32,32,99,114,101,97,116,101,95,102,105,108,101,95,49,40,70,100,44,32,77,32,45,32,49,41,46>>]}]},{p,[],[<<87,104,101,110,32,119,114,105,116,105,110,103,32,100,97,116,97,32,105,116,39,115,32,103,101,110,101,114,97,108,108,121,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,111,32,119,114,105,116,101,32,97,32,108,105,115,116,32,111,102,32,98,105,110,97,114,105,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,97,32,108,105,115,116,32,111,102,32,105,110,116,101,103,101,114,115,46,32,73,116,32,105,115,32,110,111,116,32,110,101,101,100,101,100,32,116,111,32,102,108,97,116,116,101,110,32,97,32,100,101,101,112,32,108,105,115,116,32,98,101,102,111,114,101,32,119,114,105,116,105,110,103,46,32,79,110,32,85,110,105,120,32,104,111,115,116,115,44,32,115,99,97,116,116,101,114,32,111,117,116,112,117,116,44,32,119,104,105,99,104,32,119,114,105,116,101,115,32,97,32,115,101,116,32,111,102,32,98,117,102,102,101,114,115,32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,105,115,32,117,115,101,100,32,119,104,101,110,32,112,111,115,115,105,98,108,101,46,32,73,110,32,116,104,105,115,32,119,97,121,32>>,{code,[],[<<119,114,105,116,101,40,70,68,44,32,91,66,105,110,49,44,32,66,105,110,50,32,124,32,66,105,110,51,93,41>>]},<<32,119,114,105,116,101,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,98,105,110,97,114,105,101,115,32,119,105,116,104,111,117,116,32,99,111,112,121,105,110,103,32,116,104,101,32,100,97,116,97,32,97,116,32,97,108,108,44,32,101,120,99,101,112,116,32,102,111,114,32,112,101,114,104,97,112,115,32,100,101,101,112,32,100,111,119,110,32,105,110,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,107,101,114,110,101,108,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,119,104,101,110,32,97,99,99,101,115,115,105,110,103,32,97,110,32,111,112,101,110,32,102,105,108,101,32,119,105,116,104,32,109,111,100,117,108,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111>>]}]},<<44,32,116,104,101,32,112,114,111,99,101,115,115,32,104,97,110,100,108,105,110,103,32,116,104,101,32,102,105,108,101,32,101,120,105,116,115,46,32,84,104,101,32,100,101,97,100,32,102,105,108,101,32,112,114,111,99,101,115,115,32,99,97,110,32,104,97,110,103,32,105,102,32,97,32,112,114,111,99,101,115,115,32,116,114,105,101,115,32,116,111,32,97,99,99,101,115,115,32,105,116,32,108,97,116,101,114,46,32,84,104,105,115,32,119,105,108,108,32,98,101,32,102,105,120,101,100,32,105,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,46>>]}]},{h2,[],[<<83,101,101,32,65,108,115,111>>]},{p,[],[{a,[{href,<<115,116,100,108,105,98,58,102,105,108,101,110,97,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<102,105,108,101,110,97,109,101,40,51,41>>]}]}]}]},#{name => <<102,105,108,101>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,102,105,108,101,46,120,109,108],types => #{{date_time,0} => {attribute,{123,2},type,{date_time,{remote_type,{123,22},[{atom,{123,22},calendar},{atom,{123,31},datetime},[]]},[]}},{deep_list,0} => {attribute,{101,2},type,{deep_list,{type,{101,22},list,[{type,{101,23},union,[{type,{101,23},char,[]},{type,{101,32},atom,[]},{user_type,{101,41},deep_list,[]}]}]},[]}},{delete_option,0} => {attribute,{126,2},type,{delete_option,{atom,{126,26},raw},[]}},{fd,0} => {attribute,{87,2},type,{fd,{type,{87,22},record,[{atom,{87,23},file_descriptor}]},[]}},{file_info,0} => {attribute,{86,2},type,{file_info,{type,{86,22},record,[{atom,{86,23},file_info}]},[]}},{file_info_option,0} => {attribute,{129,2},type,{file_info_option,{type,{129,29},union,[{type,{129,29},tuple,[{atom,{129,30},time},{atom,{129,38},local}]},{type,{129,49},tuple,[{atom,{129,50},time},{atom,{129,58},universal}]},{type,{130,8},tuple,[{atom,{130,9},time},{atom,{130,17},posix}]},{atom,{130,28},raw}]},[]}},{filename,0} => {attribute,{84,2},type,{filename,{type,{84,22},string,[]},[]}},{filename_all,0} => {attribute,{85,2},type,{filename_all,{type,{85,25},union,[{type,{85,25},string,[]},{type,{85,36},binary,[]}]},[]}},{io_device,0} => {attribute,{88,2},type,{io_device,{type,{88,22},union,[{type,{88,22},pid,[]},{user_type,{88,30},fd,[]}]},[]}},{location,0} => {attribute,{89,2},type,{location,{type,{89,22},union,[{type,{89,22},integer,[]},{type,{89,34},tuple,[{atom,{89,35},bof},{ann_type,{89,42},[{var,{89,42},'Offset'},{type,{89,52},integer,[]}]}]},{type,{90,22},tuple,[{atom,{90,23},cur},{ann_type,{90,30},[{var,{90,30},'Offset'},{type,{90,40},integer,[]}]}]},{type,{91,8},tuple,[{atom,{91,9},eof},{ann_type,{91,16},[{var,{91,16},'Offset'},{type,{91,26},integer,[]}]}]},{atom,{91,39},bof},{atom,{91,47},cur},{atom,{91,55},eof}]},[]}},{mode,0} => {attribute,{92,2},type,{mode,{type,{92,22},union,[{atom,{92,22},read},{atom,{92,31},write},{atom,{92,41},append},{atom,{93,22},exclusive},{atom,{93,36},raw},{atom,{93,44},binary},{type,{94,8},tuple,[{atom,{94,9},delayed_write},{ann_type,{95,23},[{var,{95,23},'Size'},{type,{95,31},non_neg_integer,[]}]},{ann_type,{96,23},[{var,{96,23},'Delay'},{type,{96,32},non_neg_integer,[]}]}]},{atom,{97,8},delayed_write},{type,{97,26},tuple,[{atom,{97,27},read_ahead},{ann_type,{97,41},[{var,{97,41},'Size'},{type,{97,49},pos_integer,[]}]}]},{atom,{98,8},read_ahead},{atom,{98,23},compressed},{type,{99,8},tuple,[{atom,{99,9},encoding},{remote_type,{99,21},[{atom,{99,21},unicode},{atom,{99,29},encoding},[]]}]},{atom,{100,8},sync}]},[]}},{name,0} => {attribute,{102,2},type,{name,{type,{102,22},union,[{type,{102,22},string,[]},{type,{102,33},atom,[]},{user_type,{102,42},deep_list,[]}]},[]}},{name_all,0} => {attribute,{103,2},type,{name_all,{type,{103,22},union,[{type,{103,22},string,[]},{type,{103,33},atom,[]},{user_type,{103,42},deep_list,[]},{ann_type,{103,57},[{var,{103,57},'RawFilename'},{type,{103,72},binary,[]}]}]},[]}},{posix,0} => {attribute,{104,2},type,{posix,{type,{105,9},union,[{atom,{105,9},eacces},{atom,{105,20},eagain},{atom,{106,9},ebadf},{atom,{106,19},ebadmsg},{atom,{106,31},ebusy},{atom,{107,9},edeadlk},{atom,{107,21},edeadlock},{atom,{107,35},edquot},{atom,{108,9},eexist},{atom,{109,9},efault},{atom,{109,20},efbig},{atom,{109,30},eftype},{atom,{110,9},eintr},{atom,{110,19},einval},{atom,{110,30},eio},{atom,{110,38},eisdir},{atom,{111,9},eloop},{atom,{112,9},emfile},{atom,{112,20},emlink},{atom,{112,31},emultihop},{atom,{113,9},enametoolong},{atom,{113,26},enfile},{atom,{114,9},enobufs},{atom,{114,21},enodev},{atom,{114,32},enolck},{atom,{114,43},enolink},{atom,{114,55},enoent},{atom,{115,9},enomem},{atom,{115,20},enospc},{atom,{115,31},enosr},{atom,{115,41},enostr},{atom,{115,52},enosys},{atom,{116,9},enotblk},{atom,{116,21},enotdir},{atom,{116,33},enotsup},{atom,{116,45},enxio},{atom,{117,9},eopnotsupp},{atom,{117,24},eoverflow},{atom,{118,9},eperm},{atom,{118,19},epipe},{atom,{119,9},erange},{atom,{119,20},erofs},{atom,{120,9},espipe},{atom,{120,21},esrch},{atom,{120,32},estale},{atom,{121,9},etxtbsy},{atom,{122,9},exdev}]},[]}},{posix_file_advise,0} => {attribute,{124,2},type,{posix_file_advise,{type,{124,30},union,[{atom,{124,30},normal},{atom,{124,41},sequential},{atom,{124,56},random},{atom,{125,30},no_reuse},{atom,{125,43},will_need},{atom,{125,57},dont_need}]},[]}},{sendfile_option,0} => {attribute,{127,2},type,{sendfile_option,{type,{127,28},union,[{type,{127,28},tuple,[{atom,{127,29},chunk_size},{type,{127,41},non_neg_integer,[]}]},{type,{128,7},tuple,[{atom,{128,8},use_threads},{type,{128,21},boolean,[]}]}]},[]}}}},[{{function,altname,1},[{file,[102,105,108,101,46,101,114,108]},{location,0}],[<<97,108,116,110,97,109,101,47,49>>],hidden,#{}},{{function,copy_opened,3},[{file,[102,105,108,101,46,101,114,108]},{location,0}],[<<99,111,112,121,95,111,112,101,110,101,100,47,51>>],hidden,#{}},{{function,ipread_s32bu_p32bu,3},[{file,[102,105,108,101,46,101,114,108]},{location,0}],[<<105,112,114,101,97,100,95,115,51,50,98,117,95,112,51,50,98,117,47,51>>],hidden,#{}},{{function,ipread_s32bu_p32bu_int,3},[{file,[102,105,108,101,46,101,114,108]},{location,0}],[<<105,112,114,101,97,100,95,115,51,50,98,117,95,112,51,50,98,117,95,105,110,116,47,51>>],hidden,#{}},{{function,path_eval,3},[{file,[102,105,108,101,46,101,114,108]},{location,0}],[<<112,97,116,104,95,101,118,97,108,47,51>>],hidden,#{}},{{function,raw_read_file_info,1},[{file,[102,105,108,101,46,101,114,108]},{location,0}],[<<114,97,119,95,114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>],hidden,#{}},{{function,raw_write_file_info,2},[{file,[102,105,108,101,46,101,114,108]},{location,0}],[<<114,97,119,95,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>],hidden,#{}},{{function,advise,4},[{file,[102,105,108,101,46,101,114,108]},{location,565}],[<<97,100,118,105,115,101,47,52>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<112,111,115,105,120,95,102,105,108,101,95,97,100,118,105,115,101>>}],[]}]},{p,[],[{code,[],[<<97,100,118,105,115,101,47,52>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,110,110,111,117,110,99,101,32,97,110,32,105,110,116,101,110,116,105,111,110,32,116,111,32,97,99,99,101,115,115,32,102,105,108,101,32,100,97,116,97,32,105,110,32,97,32,115,112,101,99,105,102,105,99,32,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,102,117,116,117,114,101,44,32,116,104,117,115,32,97,108,108,111,119,105,110,103,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,116,111,32,112,101,114,102,111,114,109,32,97,112,112,114,111,112,114,105,97,116,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,46>>]},{p,[],[<<79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,109,105,103,104,116,32,104,97,118,101,32,110,111,32,101,102,102,101,99,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,56>>,signature => [{attribute,{565,2},spec,{{advise,4},[{type,{565,13},bounded_fun,[{type,{565,13},'fun',[{type,{565,13},product,[{var,{565,14},'IoDevice'},{var,{565,24},'Offset'},{var,{565,32},'Length'},{var,{565,40},'Advise'}]},{type,{565,51},union,[{atom,{565,51},ok},{type,{565,56},tuple,[{atom,{565,57},error},{var,{565,64},'Reason'}]}]}]},[{type,{566,7},constraint,[{atom,{566,7},is_subtype},[{var,{566,7},'IoDevice'},{user_type,{566,19},io_device,[]}]]},{type,{567,7},constraint,[{atom,{567,7},is_subtype},[{var,{567,7},'Offset'},{type,{567,17},integer,[]}]]},{type,{568,7},constraint,[{atom,{568,7},is_subtype},[{var,{568,7},'Length'},{type,{568,17},integer,[]}]]},{type,{569,7},constraint,[{atom,{569,7},is_subtype},[{var,{569,7},'Advise'},{user_type,{569,17},posix_file_advise,[]}]]},{type,{570,7},constraint,[{atom,{570,7},is_subtype},[{var,{570,7},'Reason'},{type,{570,17},union,[{user_type,{570,17},posix,[]},{atom,{570,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,allocate,3},[{file,[102,105,108,101,46,101,114,108]},{location,579}],[<<97,108,108,111,99,97,116,101,47,51>>],#{<<101,110>> => [{p,[],[{code,[],[<<97,108,108,111,99,97,116,101,47,51>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,112,114,101,97,108,108,111,99,97,116,101,32,115,112,97,99,101,32,102,111,114,32,97,32,102,105,108,101,46>>]},{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,111,110,108,121,32,115,117,99,99,101,101,100,115,32,105,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,112,114,111,118,105,100,101,32,116,104,105,115,32,102,101,97,116,117,114,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,57>>,signature => [{attribute,{579,2},spec,{{allocate,3},[{type,{579,15},bounded_fun,[{type,{579,15},'fun',[{type,{579,15},product,[{var,{579,16},'File'},{var,{579,22},'Offset'},{var,{579,30},'Length'}]},{type,{580,2},union,[{atom,{580,2},ok},{type,{580,9},tuple,[{atom,{580,10},error},{user_type,{580,19},posix,[]}]}]}]},[{type,{581,7},constraint,[{atom,{581,7},is_subtype},[{var,{581,7},'File'},{user_type,{581,15},io_device,[]}]]},{type,{582,7},constraint,[{atom,{582,7},is_subtype},[{var,{582,7},'Offset'},{type,{582,17},non_neg_integer,[]}]]},{type,{583,7},constraint,[{atom,{583,7},is_subtype},[{var,{583,7},'Length'},{type,{583,17},non_neg_integer,[]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,change_group,2},[{file,[102,105,108,101,46,101,114,108]},{location,1249}],[<<99,104,97,110,103,101,95,103,114,111,117,112,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,103,114,111,117,112,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,56>>,signature => [{attribute,{1249,2},spec,{{change_group,2},[{type,{1249,19},bounded_fun,[{type,{1249,19},'fun',[{type,{1249,19},product,[{var,{1249,20},'Filename'},{var,{1249,30},'Gid'}]},{type,{1249,38},union,[{atom,{1249,38},ok},{type,{1249,43},tuple,[{atom,{1249,44},error},{var,{1249,51},'Reason'}]}]}]},[{type,{1250,7},constraint,[{atom,{1250,7},is_subtype},[{var,{1250,7},'Filename'},{user_type,{1250,19},name_all,[]}]]},{type,{1251,7},constraint,[{atom,{1251,7},is_subtype},[{var,{1251,7},'Gid'},{type,{1251,14},integer,[]}]]},{type,{1252,7},constraint,[{atom,{1252,7},is_subtype},[{var,{1252,7},'Reason'},{type,{1252,17},union,[{user_type,{1252,17},posix,[]},{atom,{1252,27},badarg}]}]]}]]}]}}]}},{{function,change_mode,2},[{file,[102,105,108,101,46,101,114,108]},{location,1221}],[<<99,104,97,110,103,101,95,109,111,100,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,112,101,114,109,105,115,115,105,111,110,115,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,49,54>>,signature => [{attribute,{1221,2},spec,{{change_mode,2},[{type,{1221,18},bounded_fun,[{type,{1221,18},'fun',[{type,{1221,18},product,[{var,{1221,19},'Filename'},{var,{1221,29},'Mode'}]},{type,{1221,38},union,[{atom,{1221,38},ok},{type,{1221,43},tuple,[{atom,{1221,44},error},{var,{1221,51},'Reason'}]}]}]},[{type,{1222,7},constraint,[{atom,{1222,7},is_subtype},[{var,{1222,7},'Filename'},{user_type,{1222,19},name_all,[]}]]},{type,{1223,7},constraint,[{atom,{1223,7},is_subtype},[{var,{1223,7},'Mode'},{type,{1223,15},integer,[]}]]},{type,{1224,7},constraint,[{atom,{1224,7},is_subtype},[{var,{1224,7},'Reason'},{type,{1224,17},union,[{user_type,{1224,17},posix,[]},{atom,{1224,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,change_owner,2},[{file,[102,105,108,101,46,101,114,108]},{location,1230}],[<<99,104,97,110,103,101,95,111,119,110,101,114,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,111,119,110,101,114,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,50,52>>,signature => [{attribute,{1230,2},spec,{{change_owner,2},[{type,{1230,19},bounded_fun,[{type,{1230,19},'fun',[{type,{1230,19},product,[{var,{1230,20},'Filename'},{var,{1230,30},'Uid'}]},{type,{1230,38},union,[{atom,{1230,38},ok},{type,{1230,43},tuple,[{atom,{1230,44},error},{var,{1230,51},'Reason'}]}]}]},[{type,{1231,7},constraint,[{atom,{1231,7},is_subtype},[{var,{1231,7},'Filename'},{user_type,{1231,19},name_all,[]}]]},{type,{1232,7},constraint,[{atom,{1232,7},is_subtype},[{var,{1232,7},'Uid'},{type,{1232,14},integer,[]}]]},{type,{1233,7},constraint,[{atom,{1233,7},is_subtype},[{var,{1233,7},'Reason'},{type,{1233,17},union,[{user_type,{1233,17},posix,[]},{atom,{1233,27},badarg}]}]]}]]}]}}]}},{{function,change_owner,3},[{file,[102,105,108,101,46,101,114,108]},{location,1239}],[<<99,104,97,110,103,101,95,111,119,110,101,114,47,51>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,111,119,110,101,114,32,97,110,100,32,103,114,111,117,112,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,51,50>>,signature => [{attribute,{1239,2},spec,{{change_owner,3},[{type,{1239,19},bounded_fun,[{type,{1239,19},'fun',[{type,{1239,19},product,[{var,{1239,20},'Filename'},{var,{1239,30},'Uid'},{var,{1239,35},'Gid'}]},{type,{1239,43},union,[{atom,{1239,43},ok},{type,{1239,48},tuple,[{atom,{1239,49},error},{var,{1239,56},'Reason'}]}]}]},[{type,{1240,7},constraint,[{atom,{1240,7},is_subtype},[{var,{1240,7},'Filename'},{user_type,{1240,19},name_all,[]}]]},{type,{1241,7},constraint,[{atom,{1241,7},is_subtype},[{var,{1241,7},'Uid'},{type,{1241,14},integer,[]}]]},{type,{1242,7},constraint,[{atom,{1242,7},is_subtype},[{var,{1242,7},'Gid'},{type,{1242,14},integer,[]}]]},{type,{1243,7},constraint,[{atom,{1243,7},is_subtype},[{var,{1243,7},'Reason'},{type,{1243,17},union,[{user_type,{1243,17},posix,[]},{atom,{1243,27},badarg}]}]]}]]}]}}]}},{{function,change_time,2},[{file,[102,105,108,101,46,101,114,108]},{location,1258}],[<<99,104,97,110,103,101,95,116,105,109,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,97,99,99,101,115,115,32,116,105,109,101,115,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,52,48>>,signature => [{attribute,{1258,2},spec,{{change_time,2},[{type,{1258,18},bounded_fun,[{type,{1258,18},'fun',[{type,{1258,18},product,[{var,{1258,19},'Filename'},{var,{1258,29},'Mtime'}]},{type,{1258,39},union,[{atom,{1258,39},ok},{type,{1258,44},tuple,[{atom,{1258,45},error},{var,{1258,52},'Reason'}]}]}]},[{type,{1259,7},constraint,[{atom,{1259,7},is_subtype},[{var,{1259,7},'Filename'},{user_type,{1259,19},name_all,[]}]]},{type,{1260,7},constraint,[{atom,{1260,7},is_subtype},[{var,{1260,7},'Mtime'},{user_type,{1260,16},date_time,[]}]]},{type,{1261,7},constraint,[{atom,{1261,7},is_subtype},[{var,{1261,7},'Reason'},{type,{1261,17},union,[{user_type,{1261,17},posix,[]},{atom,{1261,27},badarg}]}]]}]]}]}}]}},{{function,change_time,3},[{file,[102,105,108,101,46,101,114,108]},{location,1268}],[<<99,104,97,110,103,101,95,116,105,109,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,97,110,100,32,108,97,115,116,32,97,99,99,101,115,115,32,116,105,109,101,115,32,111,102,32,97,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,52,56>>,signature => [{attribute,{1268,2},spec,{{change_time,3},[{type,{1268,18},bounded_fun,[{type,{1268,18},'fun',[{type,{1268,18},product,[{var,{1268,19},'Filename'},{var,{1268,29},'Atime'},{var,{1268,36},'Mtime'}]},{type,{1268,46},union,[{atom,{1268,46},ok},{type,{1268,51},tuple,[{atom,{1268,52},error},{var,{1268,59},'Reason'}]}]}]},[{type,{1269,7},constraint,[{atom,{1269,7},is_subtype},[{var,{1269,7},'Filename'},{user_type,{1269,19},name_all,[]}]]},{type,{1270,7},constraint,[{atom,{1270,7},is_subtype},[{var,{1270,7},'Atime'},{user_type,{1270,16},date_time,[]}]]},{type,{1271,7},constraint,[{atom,{1271,7},is_subtype},[{var,{1271,7},'Mtime'},{user_type,{1271,16},date_time,[]}]]},{type,{1272,7},constraint,[{atom,{1272,7},is_subtype},[{var,{1272,7},'Reason'},{type,{1272,17},union,[{user_type,{1272,17},posix,[]},{atom,{1272,27},badarg}]}]]}]]}]}}]}},{{function,close,1},[{file,[102,105,108,101,46,101,114,108]},{location,546}],[<<99,108,111,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<67,108,111,115,101,115,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,73,116,32,109,111,115,116,108,121,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<44,32,101,120,99,101,112,116,32,102,111,114,32,115,111,109,101,32,115,101,118,101,114,101,32,101,114,114,111,114,115,32,115,117,99,104,32,97,115,32,111,117,116,32,111,102,32,109,101,109,111,114,121,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]},<<32,119,97,115,32,117,115,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,44,32>>,{code,[],[<<99,108,111,115,101,47,49>>]},<<32,99,97,110,32,114,101,116,117,114,110,32,97,110,32,111,108,100,32,119,114,105,116,101,32,101,114,114,111,114,32,97,110,100,32,110,111,116,32,101,118,101,110,32,116,114,121,32,116,111,32,99,108,111,115,101,32,116,104,101,32,102,105,108,101,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,53,54>>,signature => [{attribute,{546,2},spec,{{close,1},[{type,{546,12},bounded_fun,[{type,{546,12},'fun',[{type,{546,12},product,[{var,{546,13},'IoDevice'}]},{type,{546,26},union,[{atom,{546,26},ok},{type,{546,31},tuple,[{atom,{546,32},error},{var,{546,39},'Reason'}]}]}]},[{type,{547,7},constraint,[{atom,{547,7},is_subtype},[{var,{547,7},'IoDevice'},{user_type,{547,19},io_device,[]}]]},{type,{548,7},constraint,[{atom,{548,7},is_subtype},[{var,{548,7},'Reason'},{type,{548,17},union,[{user_type,{548,17},posix,[]},{atom,{548,27},badarg},{atom,{548,36},terminated}]}]]}]]}]}}]}},{{function,consult,1},[{file,[102,105,108,101,46,101,114,108]},{location,1025}],[<<99,111,110,115,117,108,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,69,114,108,97,110,103,32,116,101,114,109,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,44,32,102,114,111,109,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,84,101,114,109,115,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,116,101,114,109,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,84,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,44,32,117,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<46>>]}]}]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<102,46,116,120,116,58,32,32,123,112,101,114,115,111,110,44,32,34,107,97,108,108,101,34,44,32,50,53,125,46,10,32,32,32,32,32,32,32,32,123,112,101,114,115,111,110,44,32,34,112,101,108,108,101,34,44,32,51,48,125,46>>]}]},{pre,[],[{code,[],[<<49,62,32,102,105,108,101,58,99,111,110,115,117,108,116,40,34,102,46,116,120,116,34,41,46,10,123,111,107,44,91,123,112,101,114,115,111,110,44,34,107,97,108,108,101,34,44,50,53,125,44,123,112,101,114,115,111,110,44,34,112,101,108,108,101,34,44,51,48,125,93,125>>]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,54,57>>,signature => [{attribute,{1025,2},spec,{{consult,1},[{type,{1025,14},bounded_fun,[{type,{1025,14},'fun',[{type,{1025,14},product,[{var,{1025,15},'Filename'}]},{type,{1025,28},union,[{type,{1025,28},tuple,[{atom,{1025,29},ok},{var,{1025,33},'Terms'}]},{type,{1025,42},tuple,[{atom,{1025,43},error},{var,{1025,50},'Reason'}]}]}]},[{type,{1026,7},constraint,[{atom,{1026,7},is_subtype},[{var,{1026,7},'Filename'},{user_type,{1026,19},name_all,[]}]]},{type,{1027,7},constraint,[{atom,{1027,7},is_subtype},[{var,{1027,7},'Terms'},{type,{1027,16},list,[{type,{1027,17},term,[]}]}]]},{type,{1028,7},constraint,[{atom,{1028,7},is_subtype},[{var,{1028,7},'Reason'},{type,{1028,17},union,[{user_type,{1028,17},posix,[]},{atom,{1028,27},badarg},{atom,{1028,36},terminated},{atom,{1028,49},system_limit},{type,{1029,17},tuple,[{ann_type,{1029,18},[{var,{1029,18},'Line'},{type,{1029,26},integer,[]}]},{ann_type,{1029,37},[{var,{1029,37},'Mod'},{type,{1029,44},module,[]}]},{ann_type,{1029,54},[{var,{1029,54},'Term'},{type,{1029,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,copy,3},[{file,[102,105,108,101,46,101,114,108]},{location,788}],[<<99,111,112,121,47,51>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,48,55>>,equiv => {function,copy,2},signature => [{attribute,{788,2},spec,{{copy,3},[{type,{788,11},bounded_fun,[{type,{788,11},'fun',[{type,{788,11},product,[{var,{788,12},'Source'},{var,{788,20},'Destination'},{var,{788,33},'ByteCount'}]},{type,{789,14},union,[{type,{789,14},tuple,[{atom,{789,15},ok},{var,{789,19},'BytesCopied'}]},{type,{789,34},tuple,[{atom,{789,35},error},{var,{789,42},'Reason'}]}]}]},[{type,{790,7},constraint,[{atom,{790,7},is_subtype},[{var,{790,7},'Source'},{type,{790,17},union,[{user_type,{790,17},io_device,[]},{var,{790,31},'Filename'},{type,{790,42},tuple,[{var,{790,43},'Filename'},{var,{790,53},'Modes'}]}]}]]},{type,{791,7},constraint,[{atom,{791,7},is_subtype},[{var,{791,7},'Destination'},{type,{791,22},union,[{user_type,{791,22},io_device,[]},{var,{791,36},'Filename'},{type,{791,47},tuple,[{var,{791,48},'Filename'},{var,{791,58},'Modes'}]}]}]]},{type,{792,7},constraint,[{atom,{792,7},is_subtype},[{var,{792,7},'Filename'},{user_type,{792,19},name_all,[]}]]},{type,{793,7},constraint,[{atom,{793,7},is_subtype},[{var,{793,7},'Modes'},{type,{793,16},list,[{user_type,{793,17},mode,[]}]}]]},{type,{794,7},constraint,[{atom,{794,7},is_subtype},[{var,{794,7},'ByteCount'},{type,{794,20},union,[{type,{794,20},non_neg_integer,[]},{atom,{794,40},infinity}]}]]},{type,{795,7},constraint,[{atom,{795,7},is_subtype},[{var,{795,7},'BytesCopied'},{type,{795,22},non_neg_integer,[]}]]},{type,{796,7},constraint,[{atom,{796,7},is_subtype},[{var,{796,7},'Reason'},{type,{796,17},union,[{user_type,{796,17},posix,[]},{atom,{796,27},badarg},{atom,{796,36},terminated}]}]]}]]}]}}]}},{{function,copy,2},[{file,[102,105,108,101,46,101,114,108]},{location,777}],[<<99,111,112,121,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,112,105,101,115,32>>,{code,[],[<<66,121,116,101,67,111,117,110,116>>]},<<32,98,121,116,101,115,32,102,114,111,109,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,116,111,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<46,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,114,101,102,101,114,32,116,111,32,101,105,116,104,101,114,32,102,105,108,101,110,97,109,101,115,32,111,114,32,73,79,32,100,101,118,105,99,101,115,32,102,114,111,109,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<111,112,101,110,47,50>>]},<<46,32>>,{code,[],[<<66,121,116,101,67,111,117,110,116>>]},<<32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<105,110,102,105,110,105,116,121>>]},<<44,32,100,101,110,111,116,105,110,103,32,97,110,32,105,110,102,105,110,105,116,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,46>>]},{p,[],[<<65,114,103,117,109,101,110,116,32>>,{code,[],[<<77,111,100,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,112,111,115,115,105,98,108,101,32,109,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<44,32,97,110,100,32,100,101,102,97,117,108,116,115,32,116,111,32>>,{code,[],[<<91,93>>]},<<46>>]},{p,[],[<<73,102,32,98,111,116,104,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,114,101,102,101,114,32,116,111,32,102,105,108,101,110,97,109,101,115,44,32,116,104,101,32,102,105,108,101,115,32,97,114,101,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<91,114,101,97,100,44,32,98,105,110,97,114,121,93>>]},<<32,97,110,100,32>>,{code,[],[<<91,119,114,105,116,101,44,32,98,105,110,97,114,121,93>>]},<<32,112,114,101,112,101,110,100,101,100,32,116,111,32,116,104,101,105,114,32,109,111,100,101,32,108,105,115,116,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,116,111,32,111,112,116,105,109,105,122,101,32,116,104,101,32,99,111,112,121,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,102,105,108,101,110,97,109,101,44,32,105,116,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<114,101,97,100>>]},<<32,109,111,100,101,32,112,114,101,112,101,110,100,101,100,32,116,111,32,116,104,101,32,109,111,100,101,32,108,105,115,116,32,98,101,102,111,114,101,32,116,104,101,32,99,111,112,121,44,32,97,110,100,32,99,108,111,115,101,100,32,119,104,101,110,32,100,111,110,101,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,102,105,108,101,110,97,109,101,44,32,105,116,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,109,111,100,101,32,112,114,101,112,101,110,100,101,100,32,116,111,32,116,104,101,32,109,111,100,101,32,108,105,115,116,32,98,101,102,111,114,101,32,116,104,101,32,99,111,112,121,44,32,97,110,100,32,99,108,111,115,101,100,32,119,104,101,110,32,100,111,110,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,121,116,101,115,67,111,112,105,101,100,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<66,121,116,101,115,67,111,112,105,101,100>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,116,104,97,116,32,119,97,115,32,99,111,112,105,101,100,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<66,121,116,101,67,111,117,110,116>>]},<<32,105,102,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,32,111,110,32,116,104,101,32,115,111,117,114,99,101,46,32,73,102,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,102,97,105,108,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58,32,97,115,32,102,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<32,105,102,32,97,32,102,105,108,101,32,104,97,100,32,116,111,32,98,101,32,111,112,101,110,101,100,44,32,97,110,100,32,97,115,32,102,111,114,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,48,55>>,signature => [{attribute,{777,2},spec,{{copy,2},[{type,{777,11},bounded_fun,[{type,{777,11},'fun',[{type,{777,11},product,[{var,{777,12},'Source'},{var,{777,20},'Destination'}]},{type,{777,36},union,[{type,{777,36},tuple,[{atom,{777,37},ok},{var,{777,41},'BytesCopied'}]},{type,{777,56},tuple,[{atom,{777,57},error},{var,{777,64},'Reason'}]}]}]},[{type,{778,7},constraint,[{atom,{778,7},is_subtype},[{var,{778,7},'Source'},{type,{778,17},union,[{user_type,{778,17},io_device,[]},{var,{778,31},'Filename'},{type,{778,42},tuple,[{var,{778,43},'Filename'},{var,{778,53},'Modes'}]}]}]]},{type,{779,7},constraint,[{atom,{779,7},is_subtype},[{var,{779,7},'Destination'},{type,{779,22},union,[{user_type,{779,22},io_device,[]},{var,{779,36},'Filename'},{type,{779,47},tuple,[{var,{779,48},'Filename'},{var,{779,58},'Modes'}]}]}]]},{type,{780,7},constraint,[{atom,{780,7},is_subtype},[{var,{780,7},'Filename'},{user_type,{780,19},name_all,[]}]]},{type,{781,7},constraint,[{atom,{781,7},is_subtype},[{var,{781,7},'Modes'},{type,{781,16},list,[{user_type,{781,17},mode,[]}]}]]},{type,{782,7},constraint,[{atom,{782,7},is_subtype},[{var,{782,7},'BytesCopied'},{type,{782,22},non_neg_integer,[]}]]},{type,{783,7},constraint,[{atom,{783,7},is_subtype},[{var,{783,7},'Reason'},{type,{783,17},union,[{user_type,{783,17},posix,[]},{atom,{783,27},badarg},{atom,{783,36},terminated}]}]]}]]}]}}]}},{{function,datasync,1},[{file,[102,105,108,101,46,101,114,108]},{location,731}],[<<100,97,116,97,115,121,110,99,47,49>>],#{<<101,110>> => [{p,[],[<<69,110,115,117,114,101,115,32,116,104,97,116,32,97,110,121,32,98,117,102,102,101,114,115,32,107,101,112,116,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,40,110,111,116,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,114,101,32,119,114,105,116,116,101,110,32,116,111,32,100,105,115,107,46,32,73,110,32,109,97,110,121,32,119,97,121,115,32,105,116,32,114,101,115,101,109,98,108,101,115,32>>,{code,[],[<<102,115,121,110,99>>]},<<32,98,117,116,32,105,116,32,100,111,101,115,32,110,111,116,32,117,112,100,97,116,101,32,115,111,109,101,32,111,102,32,116,104,101,32,109,101,116,97,100,97,116,97,32,111,102,32,116,104,101,32,102,105,108,101,44,32,115,117,99,104,32,97,115,32,116,104,101,32,97,99,99,101,115,115,32,116,105,109,101,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46>>]},{p,[],[<<65,112,112,108,105,99,97,116,105,111,110,115,32,116,104,97,116,32,97,99,99,101,115,115,32,100,97,116,97,98,97,115,101,115,32,111,114,32,108,111,103,32,102,105,108,101,115,32,111,102,116,101,110,32,119,114,105,116,101,32,97,32,116,105,110,121,32,100,97,116,97,32,102,114,97,103,109,101,110,116,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,111,110,101,32,108,105,110,101,32,105,110,32,97,32,108,111,103,32,102,105,108,101,41,32,97,110,100,32,116,104,101,110,32,99,97,108,108,32>>,{code,[],[<<102,115,121,110,99,40,41>>]},<<32,105,109,109,101,100,105,97,116,101,108,121,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,116,104,101,32,119,114,105,116,116,101,110,32,100,97,116,97,32,105,115,32,112,104,121,115,105,99,97,108,108,121,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,104,97,114,100,32,100,105,115,107,46,32,85,110,102,111,114,116,117,110,97,116,101,108,121,44,32>>,{code,[],[<<102,115,121,110,99,40,41>>]},<<32,97,108,119,97,121,115,32,105,110,105,116,105,97,116,101,115,32,116,119,111,32,119,114,105,116,101,32,111,112,101,114,97,116,105,111,110,115,58,32,111,110,101,32,102,111,114,32,116,104,101,32,110,101,119,108,121,32,119,114,105,116,116,101,110,32,100,97,116,97,32,97,110,100,32,97,110,111,116,104,101,114,32,111,110,101,32,116,111,32,117,112,100,97,116,101,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,115,116,111,114,101,100,32,105,110,32,116,104,101,32>>,{code,[],[<<105,110,111,100,101>>]},<<46,32,73,102,32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,105,115,32,110,111,116,32,97,32,112,97,114,116,32,111,102,32,116,104,101,32,116,114,97,110,115,97,99,116,105,111,110,32,99,111,110,99,101,112,116,44,32>>,{code,[],[<<102,100,97,116,97,115,121,110,99,40,41>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,97,118,111,105,100,32,117,110,110,101,99,101,115,115,97,114,121,32>>,{code,[],[<<105,110,111,100,101>>]},<<32,100,105,115,107,32,119,114,105,116,101,32,111,112,101,114,97,116,105,111,110,115,46>>]},{p,[],[<<65,118,97,105,108,97,98,108,101,32,111,110,108,121,32,105,110,32,115,111,109,101,32,80,79,83,73,88,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,99,97,108,108,32,114,101,115,117,108,116,115,32,105,110,32,97,32,99,97,108,108,32,116,111,32>>,{code,[],[<<102,115,121,110,99,40,41>>]},<<44,32,111,114,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,105,110,32,115,121,115,116,101,109,115,32,110,111,116,32,112,114,111,118,105,100,105,110,103,32,116,104,101,32>>,{code,[],[<<102,100,97,116,97,115,121,110,99,40,41>>]},<<32,115,121,115,99,97,108,108,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,52,53>>,signature => [{attribute,{731,2},spec,{{datasync,1},[{type,{731,15},bounded_fun,[{type,{731,15},'fun',[{type,{731,15},product,[{var,{731,16},'IoDevice'}]},{type,{731,29},union,[{atom,{731,29},ok},{type,{731,34},tuple,[{atom,{731,35},error},{var,{731,42},'Reason'}]}]}]},[{type,{732,7},constraint,[{atom,{732,7},is_subtype},[{var,{732,7},'IoDevice'},{user_type,{732,19},io_device,[]}]]},{type,{733,7},constraint,[{atom,{733,7},is_subtype},[{var,{733,7},'Reason'},{type,{733,17},union,[{user_type,{733,17},posix,[]},{atom,{733,27},badarg},{atom,{733,36},terminated}]}]]}]]}]}}],since => <<79,84,80,32,82,49,52,66>>}},{{function,del_dir,1},[{file,[102,105,108,101,46,101,114,108]},{location,256}],[<<100,101,108,95,100,105,114,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,100,101,108,101,116,101,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<68,105,114>>]},<<46,32,84,104,101,32,100,105,114,101,99,116,111,114,121,32,109,117,115,116,32,98,101,32,101,109,112,116,121,32,98,101,102,111,114,101,32,105,116,32,99,97,110,32,98,101,32,100,101,108,101,116,101,100,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,105,115,32,110,111,116,32,101,109,112,116,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[<<65,116,116,101,109,112,116,32,116,111,32,100,101,108,101,116,101,32,116,104,101,32,99,117,114,114,101,110,116,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,97,99,99,101,115>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,51,54,56>>,signature => [{attribute,{256,2},spec,{{del_dir,1},[{type,{256,14},bounded_fun,[{type,{256,14},'fun',[{type,{256,14},product,[{var,{256,15},'Dir'}]},{type,{256,23},union,[{atom,{256,23},ok},{type,{256,28},tuple,[{atom,{256,29},error},{var,{256,36},'Reason'}]}]}]},[{type,{257,7},constraint,[{atom,{257,7},is_subtype},[{var,{257,7},'Dir'},{user_type,{257,14},name_all,[]}]]},{type,{258,7},constraint,[{atom,{258,7},is_subtype},[{var,{258,7},'Reason'},{type,{258,17},union,[{user_type,{258,17},posix,[]},{atom,{258,27},badarg}]}]]}]]}]}}]}},{{function,del_dir_r,1},[{file,[102,105,108,101,46,101,114,108]},{location,263}],[<<100,101,108,95,100,105,114,95,114,47,49>>],#{<<101,110>> => [{p,[],[<<68,101,108,101,116,101,115,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<70,105,108,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,105,108,101>>]},<<32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,44,32,105,116,115,32,99,111,110,116,101,110,116,115,32,105,115,32,102,105,114,115,116,32,114,101,99,117,114,115,105,118,101,108,121,32,100,101,108,101,116,101,100,46,32,82,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<111,107>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,101,114,97,116,105,111,110,32,99,111,109,112,108,101,116,101,100,32,119,105,116,104,111,117,116,32,101,114,114,111,114,115,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,112,111,115,105,120,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,97,99,99,101,115,115,105,110,103,32,111,114,32,100,101,108,101,116,105,110,103,32>>,{code,[],[<<70,105,108,101>>]},<<46,32,73,102,32,115,111,109,101,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32,117,110,100,101,114,32>>,{code,[],[<<70,105,108,101>>]},<<32,99,111,117,108,100,32,110,111,116,32,98,101,32,100,101,108,101,116,101,100,44,32>>,{code,[],[<<70,105,108,101>>]},<<32,99,97,110,110,111,116,32,98,101,32,100,101,108,101,116,101,100,32,97,115,32,105,116,32,105,115,32,110,111,110,45,101,109,112,116,121,44,32,97,110,100,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,101,120,105,115,116,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,48,52>>,signature => [{attribute,{263,2},spec,{{del_dir_r,1},[{type,{263,16},bounded_fun,[{type,{263,16},'fun',[{type,{263,16},product,[{var,{263,17},'File'}]},{type,{263,26},union,[{atom,{263,26},ok},{type,{263,31},tuple,[{atom,{263,32},error},{var,{263,39},'Reason'}]}]}]},[{type,{264,7},constraint,[{atom,{264,7},is_subtype},[{var,{264,7},'File'},{user_type,{264,15},name_all,[]}]]},{type,{265,7},constraint,[{atom,{265,7},is_subtype},[{var,{265,7},'Reason'},{type,{265,17},union,[{user_type,{265,17},posix,[]},{atom,{265,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,50,51,46,48>>}},{{function,delete,2},[{file,[102,105,108,101,46,101,114,108]},{location,221}],[<<100,101,108,101,116,101,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,50,54>>,equiv => {function,delete,1},signature => [{attribute,{221,2},spec,{{delete,2},[{type,{221,13},bounded_fun,[{type,{221,13},'fun',[{type,{221,13},product,[{var,{221,14},'Filename'},{var,{221,24},'Opts'}]},{type,{221,33},union,[{atom,{221,33},ok},{type,{221,38},tuple,[{atom,{221,39},error},{var,{221,46},'Reason'}]}]}]},[{type,{222,7},constraint,[{atom,{222,7},is_subtype},[{var,{222,7},'Filename'},{user_type,{222,19},name_all,[]}]]},{type,{223,7},constraint,[{atom,{223,7},is_subtype},[{var,{223,7},'Opts'},{type,{223,15},list,[{user_type,{223,16},delete_option,[]}]}]]},{type,{224,7},constraint,[{atom,{224,7},is_subtype},[{var,{224,7},'Reason'},{type,{224,17},union,[{user_type,{224,17},posix,[]},{atom,{224,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,delete,1},[{file,[102,105,108,101,46,101,114,108]},{location,214}],[<<100,101,108,101,116,101,47,49>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<100,101,108,101,116,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<84,114,105,101,115,32,116,111,32,100,101,108,101,116,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,105,110,32,112,97,114,116,105,99,117,108,97,114,32,100,117,114,105,110,103,32,116,104,101,32,101,97,114,108,121,32,98,111,111,116,32,115,116,97,103,101,32,119,104,101,110,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,121,101,116,32,114,101,103,105,115,116,101,114,101,100,44,32,116,111,32,115,116,105,108,108,32,98,101,32,97,98,108,101,32,116,111,32,100,101,108,101,116,101,32,108,111,99,97,108,32,102,105,108,101,115,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,116,104,101,32,102,105,108,101,32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,115,46>>]}]},{dt,[],[{code,[],[<<101,112,101,114,109>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,32,97,110,100,32,116,104,101,32,117,115,101,114,32,105,115,32,110,111,116,32,115,117,112,101,114,117,115,101,114,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,104,97,115,32,97,110,32,105,109,112,114,111,112,101,114,32,116,121,112,101,44,32,115,117,99,104,32,97,115,32,116,117,112,108,101,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,44,32,97,32,98,97,100,32,116,121,112,101,32,102,111,114,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,119,105,108,108,32,112,114,111,98,97,98,108,121,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,50,54>>,signature => [{attribute,{214,2},spec,{{delete,1},[{type,{214,13},bounded_fun,[{type,{214,13},'fun',[{type,{214,13},product,[{var,{214,14},'Filename'}]},{type,{214,27},union,[{atom,{214,27},ok},{type,{214,32},tuple,[{atom,{214,33},error},{var,{214,40},'Reason'}]}]}]},[{type,{215,7},constraint,[{atom,{215,7},is_subtype},[{var,{215,7},'Filename'},{user_type,{215,19},name_all,[]}]]},{type,{216,7},constraint,[{atom,{216,7},is_subtype},[{var,{216,7},'Reason'},{type,{216,17},union,[{user_type,{216,17},posix,[]},{atom,{216,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,50,52,46,48>>}},{{function,eval,1},[{file,[102,105,108,101,46,101,114,108]},{location,1065}],[<<101,118,97,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,32,102,114,111,109,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,84,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,32,105,115,32,110,111,116,32,114,101,116,117,114,110,101,100,59,32,97,110,121,32,101,120,112,114,101,115,115,105,111,110,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,102,105,108,101,32,109,117,115,116,32,98,101,32,116,104,101,114,101,32,102,111,114,32,105,116,115,32,115,105,100,101,32,101,102,102,101,99,116,46,32,82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<111,107>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,119,97,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,84,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,44,32,117,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,52,54,57>>,signature => [{attribute,{1065,2},spec,{{eval,1},[{type,{1065,11},bounded_fun,[{type,{1065,11},'fun',[{type,{1065,11},product,[{var,{1065,12},'Filename'}]},{type,{1065,25},union,[{atom,{1065,25},ok},{type,{1065,30},tuple,[{atom,{1065,31},error},{var,{1065,38},'Reason'}]}]}]},[{type,{1066,7},constraint,[{atom,{1066,7},is_subtype},[{var,{1066,7},'Filename'},{user_type,{1066,19},name_all,[]}]]},{type,{1067,7},constraint,[{atom,{1067,7},is_subtype},[{var,{1067,7},'Reason'},{type,{1067,17},union,[{user_type,{1067,17},posix,[]},{atom,{1067,27},badarg},{atom,{1067,36},terminated},{atom,{1067,49},system_limit},{type,{1068,17},tuple,[{ann_type,{1068,18},[{var,{1068,18},'Line'},{type,{1068,26},integer,[]}]},{ann_type,{1068,37},[{var,{1068,37},'Mod'},{type,{1068,44},module,[]}]},{ann_type,{1068,54},[{var,{1068,54},'Term'},{type,{1068,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,eval,2},[{file,[102,105,108,101,46,101,114,108]},{location,1073}],[<<101,118,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<101,118,97,108,47,49>>]},<<44,32,98,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,32>>,{code,[],[<<66,105,110,100,105,110,103,115>>]},<<32,97,114,101,32,117,115,101,100,32,105,110,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,46,32,70,111,114,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,44,32,115,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,114,108,95,101,118,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,101,118,97,108,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,48,51>>,signature => [{attribute,{1073,2},spec,{{eval,2},[{type,{1073,11},bounded_fun,[{type,{1073,11},'fun',[{type,{1073,11},product,[{var,{1073,12},'Filename'},{var,{1073,22},'Bindings'}]},{type,{1073,35},union,[{atom,{1073,35},ok},{type,{1073,40},tuple,[{atom,{1073,41},error},{var,{1073,48},'Reason'}]}]}]},[{type,{1074,7},constraint,[{atom,{1074,7},is_subtype},[{var,{1074,7},'Filename'},{user_type,{1074,19},name_all,[]}]]},{type,{1075,7},constraint,[{atom,{1075,7},is_subtype},[{var,{1075,7},'Bindings'},{remote_type,{1075,19},[{atom,{1075,19},erl_eval},{atom,{1075,28},binding_struct},[]]}]]},{type,{1076,7},constraint,[{atom,{1076,7},is_subtype},[{var,{1076,7},'Reason'},{type,{1076,17},union,[{user_type,{1076,17},posix,[]},{atom,{1076,27},badarg},{atom,{1076,36},terminated},{atom,{1076,49},system_limit},{type,{1077,17},tuple,[{ann_type,{1077,18},[{var,{1077,18},'Line'},{type,{1077,26},integer,[]}]},{ann_type,{1077,37},[{var,{1077,37},'Mod'},{type,{1077,44},module,[]}]},{ann_type,{1077,54},[{var,{1077,54},'Term'},{type,{1077,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,format_error,1},[{file,[102,105,108,101,46,101,114,108]},{location,146}],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>],#{<<101,110>> => [{p,[],[<<71,105,118,101,110,32,116,104,101,32,101,114,114,111,114,32,114,101,97,115,111,110,32,114,101,116,117,114,110,101,100,32,98,121,32,97,110,121,32,102,117,110,99,116,105,111,110,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,114,101,116,117,114,110,115,32,97,32,100,101,115,99,114,105,112,116,105,118,101,32,115,116,114,105,110,103,32,111,102,32,116,104,101,32,101,114,114,111,114,32,105,110,32,69,110,103,108,105,115,104,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,49,51>>,signature => [{attribute,{146,2},spec,{{format_error,1},[{type,{146,19},bounded_fun,[{type,{146,19},'fun',[{type,{146,19},product,[{var,{146,20},'Reason'}]},{var,{146,31},'Chars'}]},[{type,{147,7},constraint,[{atom,{147,7},is_subtype},[{var,{147,7},'Reason'},{type,{147,17},union,[{user_type,{147,17},posix,[]},{atom,{147,27},badarg},{atom,{147,36},terminated},{atom,{147,49},system_limit},{type,{148,17},tuple,[{ann_type,{148,18},[{var,{148,18},'Line'},{type,{148,26},integer,[]}]},{ann_type,{148,37},[{var,{148,37},'Mod'},{type,{148,44},module,[]}]},{ann_type,{148,54},[{var,{148,54},'Term'},{type,{148,62},term,[]}]}]}]}]]},{type,{149,7},constraint,[{atom,{149,7},is_subtype},[{var,{149,7},'Chars'},{type,{149,16},string,[]}]]}]]}]}}]}},{{function,get_cwd,0},[{file,[102,105,108,101,46,101,114,108]},{location,191}],[<<103,101,116,95,99,119,100,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,68,105,114,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,32,111,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,110,32,114,97,114,101,32,99,105,114,99,117,109,115,116,97,110,99,101,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,110,32,102,97,105,108,32,111,110,32,85,110,105,120,46,32,73,116,32,99,97,110,32,111,99,99,117,114,32,105,102,32,114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,100,105,114,101,99,116,111,114,121,46>>]}]},{p,[],[<<65,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,115,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,100,105,114,101,99,116,111,114,121,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,50,49>>,signature => [{attribute,{191,2},spec,{{get_cwd,0},[{type,{191,14},bounded_fun,[{type,{191,14},'fun',[{type,{191,14},product,[]},{type,{191,20},union,[{type,{191,20},tuple,[{atom,{191,21},ok},{var,{191,25},'Dir'}]},{type,{191,32},tuple,[{atom,{191,33},error},{var,{191,40},'Reason'}]}]}]},[{type,{192,7},constraint,[{atom,{192,7},is_subtype},[{var,{192,7},'Dir'},{user_type,{192,14},filename,[]}]]},{type,{193,7},constraint,[{atom,{193,7},is_subtype},[{var,{193,7},'Reason'},{user_type,{193,17},posix,[]}]]}]]}]}}]}},{{function,get_cwd,1},[{file,[102,105,108,101,46,101,114,108]},{location,198}],[<<103,101,116,95,99,119,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,68,105,114,125>>]},<<32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,32,111,102,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,100,114,105,118,101,46>>]},{p,[],[{code,[],[<<68,114,105,118,101>>]},<<32,105,115,32,116,111,32,98,101,32,111,102,32,116,104,101,32,102,111,114,109,32,34>>,{code,[],[<<76,101,116,116,101,114>>]},{code,[],[<<58>>]},<<34,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,34,99,58,34,46>>]},{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,116,115,117,112,125>>]},<<32,111,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,104,97,118,101,32,110,111,32,99,111,110,99,101,112,116,32,111,102,32,99,117,114,114,101,110,116,32,100,114,105,118,101,32,40,85,110,105,120,44,32,102,111,114,32,101,120,97,109,112,108,101,41,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<84,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,104,97,115,32,110,111,32,99,111,110,99,101,112,116,32,111,102,32,100,114,105,118,101,115,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,114,105,118,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,111,114,109,97,116,32,111,102,32>>,{code,[],[<<68,114,105,118,101>>]},<<32,105,115,32,105,110,118,97,108,105,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,52,51>>,signature => [{attribute,{198,2},spec,{{get_cwd,1},[{type,{198,14},bounded_fun,[{type,{198,14},'fun',[{type,{198,14},product,[{var,{198,15},'Drive'}]},{type,{198,25},union,[{type,{198,25},tuple,[{atom,{198,26},ok},{var,{198,30},'Dir'}]},{type,{198,37},tuple,[{atom,{198,38},error},{var,{198,45},'Reason'}]}]}]},[{type,{199,7},constraint,[{atom,{199,7},is_subtype},[{var,{199,7},'Drive'},{type,{199,16},string,[]}]]},{type,{200,7},constraint,[{atom,{200,7},is_subtype},[{var,{200,7},'Dir'},{user_type,{200,14},filename,[]}]]},{type,{201,7},constraint,[{atom,{201,7},is_subtype},[{var,{201,7},'Reason'},{type,{201,17},union,[{user_type,{201,17},posix,[]},{atom,{201,27},badarg}]}]]}]]}]}}]}},{{function,list_dir,1},[{file,[102,105,108,101,46,101,114,108]},{location,401}],[<<108,105,115,116,95,100,105,114,47,49>>],#{<<101,110>> => [{p,[],[<<76,105,115,116,115,32,97,108,108,32,102,105,108,101,115,32,105,110,32,97,32,100,105,114,101,99,116,111,114,121,44,32>>,{em,[],[<<101,120,99,101,112,116>>]},<<32,102,105,108,101,115,32,119,105,116,104,32,114,97,119,32,102,105,108,101,110,97,109,101,115,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,115,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,110,97,109,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,116,104,101,32,102,105,108,101,115,32,105,110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,46,32,84,104,101,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,115,111,114,116,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32>>,{code,[],[<<68,105,114>>]},<<32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<123,110,111,95,116,114,97,110,115,108,97,116,105,111,110,44,32,70,105,108,101,110,97,109,101,125>>]}]},{dd,[],[{p,[],[{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,32>>,{code,[],[<<98,105,110,97,114,121,40,41>>]},<<32,119,105,116,104,32,99,104,97,114,97,99,116,101,114,115,32,99,111,100,101,100,32,105,110,32,73,83,79,32,76,97,116,105,110,45,49,32,97,110,100,32,116,104,101,32,86,77,32,119,97,115,32,115,116,97,114,116,101,100,32,119,105,116,104,32,112,97,114,97,109,101,116,101,114,32>>,{code,[],[<<43,102,110,117,101>>]},<<46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,53,55,52>>,signature => [{attribute,{401,2},spec,{{list_dir,1},[{type,{401,15},bounded_fun,[{type,{401,15},'fun',[{type,{401,15},product,[{var,{401,16},'Dir'}]},{type,{401,24},union,[{type,{401,24},tuple,[{atom,{401,25},ok},{var,{401,29},'Filenames'}]},{type,{401,42},tuple,[{atom,{401,43},error},{var,{401,50},'Reason'}]}]}]},[{type,{402,7},constraint,[{atom,{402,7},is_subtype},[{var,{402,7},'Dir'},{user_type,{402,14},name_all,[]}]]},{type,{403,7},constraint,[{atom,{403,7},is_subtype},[{var,{403,7},'Filenames'},{type,{403,20},list,[{user_type,{403,21},filename,[]}]}]]},{type,{404,7},constraint,[{atom,{404,7},is_subtype},[{var,{404,7},'Reason'},{type,{404,17},union,[{user_type,{404,17},posix,[]},{atom,{405,17},badarg},{type,{406,17},tuple,[{atom,{406,18},no_translation},{ann_type,{406,34},[{var,{406,34},'Filename'},{remote_type,{406,46},[{atom,{406,46},unicode},{atom,{406,54},latin1_binary},[]]}]}]}]}]]}]]}]}}]}},{{function,list_dir_all,1},[{file,[102,105,108,101,46,101,114,108]},{location,411}],[<<108,105,115,116,95,100,105,114,95,97,108,108,47,49>>],#{<<101,110>> => [{p,[],[{a,[{id,<<108,105,115,116,95,100,105,114,95,97,108,108>>}],[]},<<76,105,115,116,115,32,97,108,108,32,116,104,101,32,102,105,108,101,115,32,105,110,32,97,32,100,105,114,101,99,116,111,114,121,44,32,105,110,99,108,117,100,105,110,103,32,102,105,108,101,115,32,119,105,116,104,32,114,97,119,32,102,105,108,101,110,97,109,101,115,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,115,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,110,97,109,101,115>>]},<<32,105,115,32,97,32,108,105,115,116,32,111,102,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,116,104,101,32,102,105,108,101,115,32,105,110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,46,32,84,104,101,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,115,111,114,116,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32>>,{code,[],[<<68,105,114>>]},<<32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,48,53>>,signature => [{attribute,{411,2},spec,{{list_dir_all,1},[{type,{411,19},bounded_fun,[{type,{411,19},'fun',[{type,{411,19},product,[{var,{411,20},'Dir'}]},{type,{411,28},union,[{type,{411,28},tuple,[{atom,{411,29},ok},{var,{411,33},'Filenames'}]},{type,{411,46},tuple,[{atom,{411,47},error},{var,{411,54},'Reason'}]}]}]},[{type,{412,7},constraint,[{atom,{412,7},is_subtype},[{var,{412,7},'Dir'},{user_type,{412,14},name_all,[]}]]},{type,{413,7},constraint,[{atom,{413,7},is_subtype},[{var,{413,7},'Filenames'},{type,{413,20},list,[{user_type,{413,21},filename_all,[]}]}]]},{type,{414,7},constraint,[{atom,{414,7},is_subtype},[{var,{414,7},'Reason'},{type,{414,17},union,[{user_type,{414,17},posix,[]},{atom,{414,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,make_dir,1},[{file,[102,105,108,101,46,101,114,108]},{location,249}],[<<109,97,107,101,95,100,105,114,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,99,114,101,97,116,101,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<68,105,114>>]},<<46,32,77,105,115,115,105,110,103,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,99,114,101,97,116,101,100,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[<<65,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,100,32>>,{code,[],[<<68,105,114>>]},<<32,101,120,105,115,116,115,32,97,108,114,101,97,100,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,99,101,32,105,115,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,51,48>>,signature => [{attribute,{249,2},spec,{{make_dir,1},[{type,{249,15},bounded_fun,[{type,{249,15},'fun',[{type,{249,15},product,[{var,{249,16},'Dir'}]},{type,{249,24},union,[{atom,{249,24},ok},{type,{249,29},tuple,[{atom,{249,30},error},{var,{249,37},'Reason'}]}]}]},[{type,{250,7},constraint,[{atom,{250,7},is_subtype},[{var,{250,7},'Dir'},{user_type,{250,14},name_all,[]}]]},{type,{251,7},constraint,[{atom,{251,7},is_subtype},[{var,{251,7},'Reason'},{type,{251,17},union,[{user_type,{251,17},posix,[]},{atom,{251,27},badarg}]}]]}]]}]}}]}},{{function,make_link,2},[{file,[102,105,108,101,46,101,114,108]},{location,427}],[<<109,97,107,101,95,108,105,110,107,47,50>>],#{<<101,110>> => [{p,[],[<<77,97,107,101,115,32,97,32,104,97,114,100,32,108,105,110,107,32,102,114,111,109,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,116,111,32>>,{code,[],[<<78,101,119>>]},<<32,111,110,32,112,108,97,116,102,111,114,109,115,32,115,117,112,112,111,114,116,105,110,103,32,108,105,110,107,115,32,40,85,110,105,120,32,97,110,100,32,87,105,110,100,111,119,115,41,46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,116,104,101,32,108,105,110,107,32,119,97,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,114,101,97,116,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32,108,105,110,107,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,101,110,111,116,115,117,112,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,111,114,32>>,{code,[],[<<78,101,119>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[{code,[],[<<78,101,119>>]},<<32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<72,97,114,100,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,54,52>>,signature => [{attribute,{427,2},spec,{{make_link,2},[{type,{427,16},bounded_fun,[{type,{427,16},'fun',[{type,{427,16},product,[{var,{427,17},'Existing'},{var,{427,27},'New'}]},{type,{427,35},union,[{atom,{427,35},ok},{type,{427,40},tuple,[{atom,{427,41},error},{var,{427,48},'Reason'}]}]}]},[{type,{428,7},constraint,[{atom,{428,7},is_subtype},[{var,{428,7},'Existing'},{user_type,{428,19},name_all,[]}]]},{type,{429,7},constraint,[{atom,{429,7},is_subtype},[{var,{429,7},'New'},{user_type,{429,14},name_all,[]}]]},{type,{430,7},constraint,[{atom,{430,7},is_subtype},[{var,{430,7},'Reason'},{type,{430,17},union,[{user_type,{430,17},posix,[]},{atom,{430,27},badarg}]}]]}]]}]}}]}},{{function,make_symlink,2},[{file,[102,105,108,101,46,101,114,108]},{location,435}],[<<109,97,107,101,95,115,121,109,108,105,110,107,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32>>,{code,[],[<<78,101,119>>]},<<32,116,111,32,116,104,101,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,111,110,32,112,108,97,116,102,111,114,109,115,32,115,117,112,112,111,114,116,105,110,103,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,32,40,109,111,115,116,32,85,110,105,120,32,115,121,115,116,101,109,115,32,97,110,100,32,87,105,110,100,111,119,115,44,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,86,105,115,116,97,41,46,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,116,104,101,32,108,105,110,107,32,105,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,114,101,97,116,101,100,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,116,115,117,112,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<69,120,105,115,116,105,110,103>>]},<<32,111,114,32>>,{code,[],[<<78,101,119>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[{code,[],[<<78,101,119>>]},<<32,97,108,114,101,97,100,121,32,101,120,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]},{dt,[],[{code,[],[<<101,112,101,114,109>>]}]},{dd,[],[{p,[],[<<85,115,101,114,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,112,114,105,118,105,108,101,103,101,115,32,116,111,32,99,114,101,97,116,101,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,32,40>>,{code,[],[<<83,101,67,114,101,97,116,101,83,121,109,98,111,108,105,99,76,105,110,107,80,114,105,118,105,108,101,103,101>>]},<<32,111,110,32,87,105,110,100,111,119,115,41,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,54,57,51>>,signature => [{attribute,{435,2},spec,{{make_symlink,2},[{type,{435,19},bounded_fun,[{type,{435,19},'fun',[{type,{435,19},product,[{var,{435,20},'Existing'},{var,{435,30},'New'}]},{type,{435,38},union,[{atom,{435,38},ok},{type,{435,43},tuple,[{atom,{435,44},error},{var,{435,51},'Reason'}]}]}]},[{type,{436,7},constraint,[{atom,{436,7},is_subtype},[{var,{436,7},'Existing'},{user_type,{436,19},name_all,[]}]]},{type,{437,7},constraint,[{atom,{437,7},is_subtype},[{var,{437,7},'New'},{user_type,{437,14},name_all,[]}]]},{type,{438,7},constraint,[{atom,{438,7},is_subtype},[{var,{438,7},'Reason'},{type,{438,17},union,[{user_type,{438,17},posix,[]},{atom,{438,27},badarg}]}]]}]]}]}}]}},{{function,native_name_encoding,0},[{file,[102,105,108,101,46,101,114,108]},{location,135}],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>],#{<<101,110>> => [{p,[],[{a,[{id,<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103>>}],[]},<<82,101,116,117,114,110,115,32,116,104,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,109,111,100,101,46,32,73,102,32,105,116,32,105,115,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,116,104,101,32,115,121,115,116,101,109,32,116,114,97,110,115,108,97,116,101,115,32,110,111,32,102,105,108,101,110,97,109,101,115,46,32,73,102,32,105,116,32,105,115,32>>,{code,[],[<<117,116,102,56>>]},<<44,32,102,105,108,101,110,97,109,101,115,32,97,114,101,32,99,111,110,118,101,114,116,101,100,32,98,97,99,107,32,97,110,100,32,102,111,114,116,104,32,116,111,32,116,104,101,32,110,97,116,105,118,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,32,40,117,115,117,97,108,108,121,32,85,84,70,45,56,44,32,98,117,116,32,85,84,70,45,49,54,32,111,110,32,87,105,110,100,111,119,115,41,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,55,50,57>>,signature => [{attribute,{135,2},spec,{{native_name_encoding,0},[{type,{135,27},'fun',[{type,{135,27},product,[]},{type,{135,33},union,[{atom,{135,33},latin1},{atom,{135,42},utf8}]}]}]}}],since => <<79,84,80,32,82,49,52,66,48,49>>}},{{function,open,2},[{file,[102,105,108,101,46,101,114,108]},{location,510}],[<<111,112,101,110,47,50>>],#{<<101,110>> => [{p,[],[<<79,112,101,110,115,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101>>]},<<32,105,110,32,116,104,101,32,109,111,100,101,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32>>,{code,[],[<<77,111,100,101,115>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,99,111,110,116,97,105,110,32,111,110,101,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<114,101,97,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,44,32,119,104,105,99,104,32,109,117,115,116,32,101,120,105,115,116,44,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,114,101,97,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<119,114,105,116,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46,32,73,116,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,73,102,32,116,104,101,32,102,105,108,101,32,101,120,105,115,116,115,32,97,110,100,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,105,115,32,110,111,116,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{code,[],[<<114,101,97,100>>]},<<44,32,116,104,101,32,102,105,108,101,32,105,115,32,116,114,117,110,99,97,116,101,100,46>>]}]},{dt,[],[{code,[],[<<97,112,112,101,110,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46,32,73,116,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,69,118,101,114,121,32,119,114,105,116,101,32,111,112,101,114,97,116,105,111,110,32,116,111,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<97,112,112,101,110,100>>]},<<32,116,97,107,101,115,32,112,108,97,99,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<101,120,99,108,117,115,105,118,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46,32,73,116,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,73,102,32,116,104,101,32,102,105,108,101,32,101,120,105,115,116,115,44,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,101,120,105,115,116,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,100,111,101,115,32,110,111,116,32,103,117,97,114,97,110,116,101,101,32,101,120,99,108,117,115,105,118,101,110,101,115,115,32,111,110,32,102,105,108,101,32,115,121,115,116,101,109,115,32,110,111,116,32,115,117,112,112,111,114,116,105,110,103,32>>,{code,[],[<<79,95,69,88,67,76>>]},<<32,112,114,111,112,101,114,108,121,44,32,115,117,99,104,32,97,115,32,78,70,83,46,32,68,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,116,104,105,115,32,111,112,116,105,111,110,32,117,110,108,101,115,115,32,121,111,117,32,107,110,111,119,32,116,104,97,116,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,115,117,112,112,111,114,116,115,32,105,116,32,40,105,110,32,103,101,110,101,114,97,108,44,32,108,111,99,97,108,32,102,105,108,101,32,115,121,115,116,101,109,115,32,97,114,101,32,115,97,102,101,41,46>>]}]}]},{dt,[],[{code,[],[<<114,97,119>>]}]},{dd,[],[{p,[],[{a,[{id,<<114,97,119>>}],[]},<<65,108,108,111,119,115,32,102,97,115,116,101,114,32,97,99,99,101,115,115,32,116,111,32,97,32,102,105,108,101,44,32,97,115,32,110,111,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,105,115,32,110,101,101,100,101,100,32,116,111,32,104,97,110,100,108,101,32,116,104,101,32,102,105,108,101,46,32,72,111,119,101,118,101,114,44,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32,116,104,105,115,32,119,97,121,32,104,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,108,105,109,105,116,97,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32>>,{code,[],[<<105,111>>]},<<32,109,111,100,117,108,101,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,44,32,97,115,32,116,104,101,121,32,99,97,110,32,111,110,108,121,32,116,97,108,107,32,116,111,32,97,110,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,46,32,73,110,115,116,101,97,100,44,32,117,115,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<46>>]}]},{li,[],[{p,[],[<<69,115,112,101,99,105,97,108,108,121,32,105,102,32>>,{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]},<<32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,111,110,32,97,32>>,{code,[],[<<114,97,119>>]},<<32,102,105,108,101,44,32,105,116,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,116,111,32,99,111,109,98,105,110,101,32,116,104,105,115,32,111,112,116,105,111,110,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,97,115,32,108,105,110,101,45,111,114,105,101,110,116,101,100,32,73,47,79,32,105,115,32,105,110,101,102,102,105,99,105,101,110,116,32,119,105,116,104,111,117,116,32,98,117,102,102,101,114,105,110,103,46>>]}]},{li,[],[{p,[],[<<79,110,108,121,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,116,104,97,116,32,111,112,101,110,101,100,32,116,104,101,32,102,105,108,101,32,99,97,110,32,117,115,101,32,105,116,46>>]}]},{li,[],[{p,[],[<<65,32,114,101,109,111,116,101,32,69,114,108,97,110,103,32,102,105,108,101,32,115,101,114,118,101,114,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,46,32,84,104,101,32,99,111,109,112,117,116,101,114,32,111,110,32,119,104,105,99,104,32,116,104,101,32,69,114,108,97,110,103,32,110,111,100,101,32,105,115,32,114,117,110,110,105,110,103,32,109,117,115,116,32,104,97,118,101,32,97,99,99,101,115,115,32,116,111,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,40,100,105,114,101,99,116,108,121,32,111,114,32,116,104,114,111,117,103,104,32,78,70,83,41,46>>]}]}]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,111,112,101,114,97,116,105,111,110,115,32,111,110,32,116,104,101,32,102,105,108,101,32,114,101,116,117,114,110,32,98,105,110,97,114,105,101,115,32,114,97,116,104,101,114,32,116,104,97,110,32,108,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<123,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,83,105,122,101,44,32,68,101,108,97,121,125>>]}]},{dd,[],[{p,[],[<<68,97,116,97,32,105,110,32,115,117,98,115,101,113,117,101,110,116,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,32,105,115,32,98,117,102,102,101,114,101,100,32,117,110,116,105,108,32,97,116,32,108,101,97,115,116,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,32,97,114,101,32,98,117,102,102,101,114,101,100,44,32,111,114,32,117,110,116,105,108,32,116,104,101,32,111,108,100,101,115,116,32,98,117,102,102,101,114,101,100,32,100,97,116,97,32,105,115,32>>,{code,[],[<<68,101,108,97,121>>]},<<32,109,105,108,108,105,115,101,99,111,110,100,115,32,111,108,100,46,32,84,104,101,110,32,97,108,108,32,98,117,102,102,101,114,101,100,32,100,97,116,97,32,105,115,32,119,114,105,116,116,101,110,32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,46,32,84,104,101,32,98,117,102,102,101,114,101,100,32,100,97,116,97,32,105,115,32,97,108,115,111,32,102,108,117,115,104,101,100,32,98,101,102,111,114,101,32,115,111,109,101,32,111,116,104,101,114,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,32,116,104,97,110,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,105,115,32,101,120,101,99,117,116,101,100,46>>]},{p,[],[<<84,104,101,32,112,117,114,112,111,115,101,32,111,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,116,111,32,105,110,99,114,101,97,115,101,32,112,101,114,102,111,114,109,97,110,99,101,32,98,121,32,114,101,100,117,99,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,115,46,32,84,104,117,115,44,32,116,104,101,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,32,109,117,115,116,32,98,101,32,102,111,114,32,115,105,122,101,115,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<44,32,97,110,100,32,110,111,116,32,105,110,116,101,114,115,112,101,114,115,101,100,32,98,121,32,116,111,111,32,109,97,110,121,32,111,116,104,101,114,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,115,46>>]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,117,115,101,100,44,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,32,99,97,110,32,112,114,101,109,97,116,117,114,101,108,121,32,98,101,32,114,101,112,111,114,116,101,100,32,97,115,32,115,117,99,99,101,115,115,102,117,108,44,32,97,110,100,32,105,102,32,97,32,119,114,105,116,101,32,101,114,114,111,114,32,111,99,99,117,114,115,44,32,116,104,101,32,101,114,114,111,114,32,105,115,32,114,101,112,111,114,116,101,100,32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,110,101,120,116,32,102,105,108,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,110,111,116,32,101,120,101,99,117,116,101,100,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32>>,{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]},<<32,105,115,32,117,115,101,100,44,32,97,102,116,101,114,32,97,32,110,117,109,98,101,114,32,111,102,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,99,97,108,108,115,44,32>>,{code,[],[<<99,108,111,115,101,47,49>>]},<<32,99,97,110,32,114,101,116,117,114,110,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,115,112,99,125>>]},<<44,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111,116,32,101,110,111,117,103,104,32,115,112,97,99,101,32,111,110,32,116,104,101,32,100,105,115,99,32,102,111,114,32,112,114,101,118,105,111,117,115,108,121,32,119,114,105,116,116,101,110,32,100,97,116,97,46,32>>,{code,[],[<<99,108,111,115,101,47,49>>]},<<32,109,117,115,116,32,112,114,111,98,97,98,108,121,32,98,101,32,99,97,108,108,101,100,32,97,103,97,105,110,44,32,97,115,32,116,104,101,32,102,105,108,101,32,105,115,32,115,116,105,108,108,32,111,112,101,110,46>>]}]},{dt,[],[{code,[],[<<100,101,108,97,121,101,100,95,119,114,105,116,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<123,100,101,108,97,121,101,100,95,119,114,105,116,101,44,32,83,105,122,101,44,32,68,101,108,97,121,125>>]},<<32,119,105,116,104,32,114,101,97,115,111,110,97,98,108,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<83,105,122,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,108,97,121>>]},<<32,40,114,111,117,103,104,108,121,32,115,111,109,101,32,54,52,32,75,66,44,32,50,32,115,101,99,111,110,100,115,41,46>>]}]},{dt,[],[{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]}]},{dd,[],[{p,[],[<<65,99,116,105,118,97,116,101,115,32,114,101,97,100,32,100,97,116,97,32,98,117,102,102,101,114,105,110,103,46,32,73,102,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,99,97,108,108,115,32,97,114,101,32,102,111,114,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,108,101,115,115,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,44,32,114,101,97,100,32,111,112,101,114,97,116,105,111,110,115,32,116,111,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,97,114,101,32,115,116,105,108,108,32,112,101,114,102,111,114,109,101,100,32,102,111,114,32,98,108,111,99,107,115,32,111,102,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,46,32,84,104,101,32,101,120,116,114,97,32,100,97,116,97,32,105,115,32,98,117,102,102,101,114,101,100,32,97,110,100,32,114,101,116,117,114,110,101,100,32,105,110,32,115,117,98,115,101,113,117,101,110,116,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,99,97,108,108,115,44,32,103,105,118,105,110,103,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,103,97,105,110,32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,99,97,108,108,115,32,105,115,32,114,101,100,117,99,101,100,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<114,101,97,100,95,97,104,101,97,100>>]},<<32,98,117,102,102,101,114,32,105,115,32,97,108,115,111,32,104,105,103,104,108,121,32,117,115,101,100,32,98,121,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]},<<32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,44,32,116,104,101,114,101,102,111,114,101,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,40,102,111,114,32,112,101,114,102,111,114,109,97,110,99,101,32,114,101,97,115,111,110,115,41,32,119,104,101,110,32,97,99,99,101,115,115,105,110,103,32,114,97,119,32,102,105,108,101,115,32,117,115,105,110,103,32,116,104,97,116,32,102,117,110,99,116,105,111,110,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,99,97,108,108,115,32,97,114,101,32,102,111,114,32,115,105,122,101,115,32,110,111,116,32,115,105,103,110,105,102,105,99,97,110,116,108,121,32,108,101,115,115,32,116,104,97,110,44,32,111,114,32,101,118,101,110,32,103,114,101,97,116,101,114,32,116,104,97,110,32>>,{code,[],[<<83,105,122,101>>]},<<32,98,121,116,101,115,44,32,110,111,32,112,101,114,102,111,114,109,97,110,99,101,32,103,97,105,110,32,99,97,110,32,98,101,32,101,120,112,101,99,116,101,100,46>>]}]},{dt,[],[{code,[],[<<114,101,97,100,95,97,104,101,97,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,119,105,116,104,32,97,32,114,101,97,115,111,110,97,98,108,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32>>,{code,[],[<<83,105,122,101>>]},<<32,40,114,111,117,103,104,108,121,32,115,111,109,101,32,54,52,32,75,66,41,46>>]}]},{dt,[],[{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,103,122,105,112,32,99,111,109,112,114,101,115,115,101,100,32,102,105,108,101,115,46,32,79,112,116,105,111,110,32>>,{code,[],[<<99,111,109,112,114,101,115,115,101,100>>]},<<32,109,117,115,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32>>,{code,[],[<<114,101,97,100>>]},<<32,111,114,32>>,{code,[],[<<119,114,105,116,101>>]},<<44,32,98,117,116,32,110,111,116,32,98,111,116,104,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,102,105,108,101,32,115,105,122,101,32,111,98,116,97,105,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>]}]},<<32,100,111,101,115,32,112,114,111,98,97,98,108,121,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,97,100,32,102,114,111,109,32,97,32,99,111,109,112,114,101,115,115,101,100,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,110,99,111,100,105,110,103,44,32,69,110,99,111,100,105,110,103,125>>]}]},{dd,[],[{p,[],[<<77,97,107,101,115,32,116,104,101,32,102,105,108,101,32,112,101,114,102,111,114,109,32,97,117,116,111,109,97,116,105,99,32,116,114,97,110,115,108,97,116,105,111,110,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,111,32,97,110,100,32,102,114,111,109,32,97,32,115,112,101,99,105,102,105,99,32,40,85,110,105,99,111,100,101,41,32,101,110,99,111,100,105,110,103,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,100,97,116,97,32,115,117,112,112,108,105,101,100,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<32,111,114,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,115,116,105,108,108,32,105,115,32,98,121,116,101,45,111,114,105,101,110,116,101,100,59,32,116,104,105,115,32,111,112,116,105,111,110,32,100,101,110,111,116,101,115,32,111,110,108,121,32,104,111,119,32,100,97,116,97,32,105,115,32,115,116,111,114,101,100,32,105,110,32,116,104,101,32,100,105,115,107,32,102,105,108,101,46>>]},{p,[],[<<68,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,101,110,99,111,100,105,110,103,44,32,100,105,102,102,101,114,101,110,116,32,109,101,116,104,111,100,115,32,111,102,32,114,101,97,100,105,110,103,32,97,110,100,32,119,114,105,116,105,110,103,32,100,97,116,97,32,105,115,32,112,114,101,102,101,114,114,101,100,46,32,84,104,101,32,100,101,102,97,117,108,116,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,105,109,112,108,105,101,115,32,117,115,105,110,103,32,116,104,105,115,32,109,111,100,117,108,101,32,40>>,{code,[],[<<102,105,108,101>>]},<<41,32,102,111,114,32,114,101,97,100,105,110,103,32,97,110,100,32,119,114,105,116,105,110,103,32,100,97,116,97,32,97,115,32,116,104,101,32,105,110,116,101,114,102,97,99,101,115,32,112,114,111,118,105,100,101,100,32,104,101,114,101,32,119,111,114,107,32,119,105,116,104,32,98,121,116,101,45,111,114,105,101,110,116,101,100,32,100,97,116,97,46,32,85,115,105,110,103,32,111,116,104,101,114,32,40,85,110,105,99,111,100,101,41,32,101,110,99,111,100,105,110,103,115,32,109,97,107,101,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,102,117,110,99,116,105,111,110,115,32>>,{code,[],[<<103,101,116,95,99,104,97,114,115>>]},<<44,32>>,{code,[],[<<103,101,116,95,108,105,110,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<112,117,116,95,99,104,97,114,115>>]},<<32,109,111,114,101,32,115,117,105,116,97,98,108,101,44,32,97,115,32,116,104,101,121,32,99,97,110,32,119,111,114,107,32,119,105,116,104,32,116,104,101,32,102,117,108,108,32,85,110,105,99,111,100,101,32,114,97,110,103,101,46>>]},{p,[],[<<73,102,32,100,97,116,97,32,105,115,32,115,101,110,116,32,116,111,32,97,110,32>>,{code,[],[<<105,111,95,100,101,118,105,99,101,40,41>>]},<<32,105,110,32,97,32,102,111,114,109,97,116,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,99,111,110,118,101,114,116,101,100,32,116,111,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,101,110,99,111,100,105,110,103,44,32,111,114,32,105,102,32,100,97,116,97,32,105,115,32,114,101,97,100,32,98,121,32,97,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,114,101,116,117,114,110,115,32,100,97,116,97,32,105,110,32,97,32,102,111,114,109,97,116,32,116,104,97,116,32,99,97,110,110,111,116,32,99,111,112,101,32,119,105,116,104,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,114,97,110,103,101,32,111,102,32,116,104,101,32,100,97,116,97,44,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,97,110,100,32,116,104,101,32,102,105,108,101,32,105,115,32,99,108,111,115,101,100,46>>]},{p,[],[<<65,108,108,111,119,101,100,32,118,97,108,117,101,115,32,102,111,114,32>>,{code,[],[<<69,110,99,111,100,105,110,103>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<108,97,116,105,110,49>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,101,110,99,111,100,105,110,103,46,32,66,121,116,101,115,32,115,117,112,112,108,105,101,100,32,116,111,32,116,104,101,32,102,105,108,101,44,32,116,104,97,116,32,105,115,44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,47,50>>]}]},<<32,97,114,101,32,119,114,105,116,116,101,110,32,34,97,115,32,105,115,34,32,111,110,32,116,104,101,32,102,105,108,101,46,32,76,105,107,101,119,105,115,101,44,32,98,121,116,101,115,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,44,32,116,104,97,116,32,105,115,44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,97,114,101,32,114,101,116,117,114,110,101,100,32,34,97,115,32,105,115,34,46,32,73,102,32,109,111,100,117,108,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,105,115,32,117,115,101,100,32,102,111,114,32,119,114,105,116,105,110,103,44,32,116,104,101,32,102,105,108,101,32,99,97,110,32,111,110,108,121,32,99,111,112,101,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,117,112,32,116,111,32,99,111,100,101,32,112,111,105,110,116,32,50,53,53,32,40,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,41,46>>]}]},{dt,[],[{code,[],[<<117,110,105,99,111,100,101,32,111,114,32,117,116,102,56>>]}]},{dd,[],[{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,97,114,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,97,110,100,32,102,114,111,109,32,85,84,70,45,56,32,101,110,99,111,100,105,110,103,32,98,101,102,111,114,101,32,116,104,101,121,32,97,114,101,32,119,114,105,116,116,101,110,32,116,111,32,111,114,32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46,32,65,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32,116,104,105,115,32,119,97,121,32,99,97,110,32,98,101,32,114,101,97,100,97,98,108,101,32,117,115,105,110,103,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<44,32,97,115,32,108,111,110,103,32,97,115,32,110,111,32,100,97,116,97,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,102,105,108,101,32,108,105,101,115,32,98,101,121,111,110,100,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,32,40,48,46,46,50,53,53,41,44,32,98,117,116,32,102,97,105,108,117,114,101,32,111,99,99,117,114,115,32,105,102,32,116,104,101,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,85,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,98,101,121,111,110,100,32,116,104,97,116,32,114,97,110,103,101,46,32,84,104,101,32,102,105,108,101,32,105,115,32,98,101,115,116,32,114,101,97,100,32,119,105,116,104,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,97,119,97,114,101,32,109,111,100,117,108,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<46>>]},{p,[],[<<66,121,116,101,115,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,102,105,108,101,32,98,121,32,97,110,121,32,109,101,97,110,115,32,97,114,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,85,84,70,45,56,32,101,110,99,111,100,105,110,103,32,98,101,102,111,114,101,32,98,101,105,110,103,32,115,116,111,114,101,100,32,111,110,32,116,104,101,32,100,105,115,107,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<117,116,102,49,54,32,111,114,32,123,117,116,102,49,54,44,98,105,103,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,98,105,103,32,101,110,100,105,97,110,32,85,84,70,45,49,54,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]},{dt,[],[{code,[],[<<123,117,116,102,49,54,44,108,105,116,116,108,101,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,108,105,116,116,108,101,32,101,110,100,105,97,110,32,85,84,70,45,49,54,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]},{dt,[],[{code,[],[<<117,116,102,51,50,32,111,114,32,123,117,116,102,51,50,44,98,105,103,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,98,105,103,32,101,110,100,105,97,110,32,85,84,70,45,51,50,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]},{dt,[],[{code,[],[<<123,117,116,102,51,50,44,108,105,116,116,108,101,125>>]}]},{dd,[],[{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,98,117,116,32,116,114,97,110,115,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,116,111,32,97,110,100,32,102,114,111,109,32,108,105,116,116,108,101,32,101,110,100,105,97,110,32,85,84,70,45,51,50,32,105,110,115,116,101,97,100,32,111,102,32,85,84,70,45,56,46>>]}]}]},{p,[],[<<84,104,101,32,69,110,99,111,100,105,110,103,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,102,111,114,32,97,32,102,105,108,101,32,34,111,110,32,116,104,101,32,102,108,121,34,32,98,121,32,117,115,105,110,103,32,102,117,110,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111,35,115,101,116,111,112,116,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,111,58,115,101,116,111,112,116,115,47,50>>]}]},<<46,32,83,111,32,97,32,102,105,108,101,32,99,97,110,32,98,101,32,97,110,97,108,121,122,101,100,32,105,110,32,108,97,116,105,110,49,32,101,110,99,111,100,105,110,103,32,102,111,114,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,66,79,77,44,32,112,111,115,105,116,105,111,110,101,100,32,98,101,121,111,110,100,32,116,104,101,32,66,79,77,32,97,110,100,32,116,104,101,110,32,98,101,32,115,101,116,32,102,111,114,32,116,104,101,32,114,105,103,104,116,32,101,110,99,111,100,105,110,103,32,98,101,102,111,114,101,32,102,117,114,116,104,101,114,32,114,101,97,100,105,110,103,46,32,70,111,114,32,102,117,110,99,116,105,111,110,115,32,105,100,101,110,116,105,102,121,105,110,103,32,66,79,77,115,44,32,115,101,101,32,109,111,100,117,108,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<117,110,105,99,111,100,101,40,51,41>>]}]},<<46>>]},{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,102,105,108,101,115,46>>]}]},{dt,[],[{code,[],[<<114,97,109>>]}]},{dd,[],[{p,[],[{code,[],[<<70,105,108,101>>]},<<32,109,117,115,116,32,98,101,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<46,32,82,101,116,117,114,110,115,32,97,110,32>>,{code,[],[<<102,100,40,41>>]},<<44,32,119,104,105,99,104,32,108,101,116,115,32,109,111,100,117,108,101,32>>,{code,[],[<<102,105,108,101>>]},<<32,111,112,101,114,97,116,101,32,111,110,32,116,104,101,32,100,97,116,97,32,105,110,45,109,101,109,111,114,121,32,97,115,32,105,102,32,105,116,32,105,115,32,97,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<115,121,110,99>>]}]},{dd,[],[{p,[],[<<79,110,32,112,108,97,116,102,111,114,109,115,32,115,117,112,112,111,114,116,105,110,103,32,105,116,44,32,101,110,97,98,108,101,115,32,116,104,101,32,80,79,83,73,88,32>>,{code,[],[<<79,95,83,89,78,67>>]},<<32,115,121,110,99,104,114,111,110,111,117,115,32,73,47,79,32,102,108,97,103,32,111,114,32,105,116,115,32,112,108,97,116,102,111,114,109,45,100,101,112,101,110,100,101,110,116,32,101,113,117,105,118,97,108,101,110,116,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<70,73,76,69,95,70,76,65,71,95,87,82,73,84,69,95,84,72,82,79,85,71,72>>]},<<32,111,110,32,87,105,110,100,111,119,115,41,32,115,111,32,116,104,97,116,32,119,114,105,116,101,115,32,116,111,32,116,104,101,32,102,105,108,101,32,98,108,111,99,107,32,117,110,116,105,108,32,116,104,101,32,100,97,116,97,32,105,115,32,112,104,121,115,105,99,97,108,108,121,32,119,114,105,116,116,101,110,32,116,111,32,100,105,115,107,46,32,72,111,119,101,118,101,114,44,32,98,101,32,97,119,97,114,101,32,116,104,97,116,32,116,104,101,32,101,120,97,99,116,32,115,101,109,97,110,116,105,99,115,32,111,102,32,116,104,105,115,32,102,108,97,103,32,100,105,102,102,101,114,32,102,114,111,109,32,112,108,97,116,102,111,114,109,32,116,111,32,112,108,97,116,102,111,114,109,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,110,111,110,101,32,111,102,32,76,105,110,117,120,32,111,114,32,87,105,110,100,111,119,115,32,103,117,97,114,97,110,116,101,101,115,32,116,104,97,116,32,97,108,108,32,102,105,108,101,32,109,101,116,97,100,97,116,97,32,97,114,101,32,97,108,115,111,32,119,114,105,116,116,101,110,32,98,101,102,111,114,101,32,116,104,101,32,99,97,108,108,32,114,101,116,117,114,110,115,46,32,70,111,114,32,112,114,101,99,105,115,101,32,115,101,109,97,110,116,105,99,115,44,32,99,104,101,99,107,32,116,104,101,32,100,101,116,97,105,108,115,32,111,102,32,121,111,117,114,32,112,108,97,116,102,111,114,109,32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,119,105,116,104,32,110,111,32,115,117,112,112,111,114,116,32,102,111,114,32,80,79,83,73,88,32>>,{code,[],[<<79,95,83,89,78,67>>]},<<32,111,114,32,101,113,117,105,118,97,108,101,110,116,44,32,117,115,101,32,111,102,32,116,104,101,32>>,{code,[],[<<115,121,110,99>>]},<<32,102,108,97,103,32,99,97,117,115,101,115,32>>,{code,[],[<<111,112,101,110>>]},<<32,116,111,32,114,101,116,117,114,110,32>>,{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,116,115,117,112,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<100,105,114,101,99,116,111,114,121>>]}]},{dd,[],[{p,[],[<<65,108,108,111,119,115,32>>,{code,[],[<<111,112,101,110>>]},<<32,116,111,32,119,111,114,107,32,111,110,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]}]},{p,[],[<<82,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,73,111,68,101,118,105,99,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,109,111,100,101,46,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,46>>]}]}]},{p,[],[{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,105,115,32,114,101,97,108,108,121,32,116,104,101,32,112,105,100,32,111,102,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,104,97,110,100,108,101,115,32,116,104,101,32,102,105,108,101,46,32,84,104,105,115,32,112,114,111,99,101,115,115,32,109,111,110,105,116,111,114,115,32,116,104,101,32,112,114,111,99,101,115,115,32,116,104,97,116,32,111,114,105,103,105,110,97,108,108,121,32,111,112,101,110,101,100,32,116,104,101,32,102,105,108,101,32,40,116,104,101,32,111,119,110,101,114,32,112,114,111,99,101,115,115,41,46,32,73,102,32,116,104,101,32,111,119,110,101,114,32,112,114,111,99,101,115,115,32,116,101,114,109,105,110,97,116,101,115,44,32,116,104,101,32,102,105,108,101,32,105,115,32,99,108,111,115,101,100,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,105,116,115,101,108,102,32,116,101,114,109,105,110,97,116,101,115,32,116,111,111,46,32,65,110,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,116,104,105,115,32,99,97,108,108,32,99,97,110,32,98,101,32,117,115,101,100,32,97,115,32,97,110,32,97,114,103,117,109,101,110,116,32,116,111,32,116,104,101,32,73,47,79,32,102,117,110,99,116,105,111,110,115,32,40,115,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<41,46>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<87,104,105,108,101,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,111,112,101,110,32,97,110,121,32,102,105,108,101,44,32,119,101,32,114,101,99,111,109,109,101,110,100,32,97,103,97,105,110,115,116,32,117,115,105,110,103,32,105,116,32,102,111,114,32,78,70,83,45,109,111,117,110,116,101,100,32,102,105,108,101,115,44,32,70,73,70,79,115,44,32,100,101,118,105,99,101,115,44,32,111,114,32,115,105,109,105,108,97,114,32,115,105,110,99,101,32,116,104,101,121,32,99,97,110,32,99,97,117,115,101,32,73,79,32,116,104,114,101,97,100,115,32,116,111,32,104,97,110,103,32,102,111,114,101,118,101,114,46>>]},{p,[],[<<73,102,32,121,111,117,114,32,97,112,112,108,105,99,97,116,105,111,110,32,110,101,101,100,115,32,116,111,32,105,110,116,101,114,97,99,116,32,119,105,116,104,32,116,104,101,115,101,32,107,105,110,100,115,32,111,102,32,102,105,108,101,115,32,119,101,32,114,101,99,111,109,109,101,110,100,32,98,114,101,97,107,105,110,103,32,111,117,116,32,116,104,111,115,101,32,112,97,114,116,115,32,116,111,32,97,32,112,111,114,116,32,112,114,111,103,114,97,109,32,105,110,115,116,101,97,100,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,110,32,112,114,101,118,105,111,117,115,32,118,101,114,115,105,111,110,115,32,111,102,32>>,{code,[],[<<102,105,108,101>>]},<<44,32,109,111,100,101,115,32,119,101,114,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,111,110,101,32,111,102,32,116,104,101,32,97,116,111,109,115,32>>,{code,[],[<<114,101,97,100>>]},<<44,32>>,{code,[],[<<119,114,105,116,101>>]},<<44,32,111,114,32>>,{code,[],[<<114,101,97,100,95,119,114,105,116,101>>]},<<32,105,110,115,116,101,97,100,32,111,102,32,97,32,108,105,115,116,46,32,84,104,105,115,32,105,115,32,115,116,105,108,108,32,97,108,108,111,119,101,100,32,102,111,114,32,114,101,97,115,111,110,115,32,111,102,32,98,97,99,107,119,97,114,100,115,32,99,111,109,112,97,116,105,98,105,108,105,116,121,44,32,98,117,116,32,105,115,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,32,102,111,114,32,110,101,119,32,99,111,100,101,46,32,65,108,115,111,32,110,111,116,101,32,116,104,97,116,32>>,{code,[],[<<114,101,97,100,95,119,114,105,116,101>>]},<<32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,97,32,109,111,100,101,32,108,105,115,116,46>>]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,114,101,97,100,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,115,101,97,114,99,104,105,110,103,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,97,109,101,100,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,44,32,111,114,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,116,115,101,108,102,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,32,105,102,32>>,{code,[],[<<100,105,114,101,99,116,111,114,121>>]},<<32,109,111,100,101,32,119,97,115,32,115,112,101,99,105,102,105,101,100,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<84,104,101,114,101,32,105,115,32,110,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,32,40,105,102,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,97,99,99,101,115,115,32,119,97,115,32,115,112,101,99,105,102,105,101,100,41,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,55,52,49>>,signature => [{attribute,{510,2},spec,{{open,2},[{type,{510,11},bounded_fun,[{type,{510,11},'fun',[{type,{510,11},product,[{var,{510,12},'File'},{var,{510,18},'Modes'}]},{type,{510,28},union,[{type,{510,28},tuple,[{atom,{510,29},ok},{var,{510,33},'IoDevice'}]},{type,{510,45},tuple,[{atom,{510,46},error},{var,{510,53},'Reason'}]}]}]},[{type,{511,7},constraint,[{atom,{511,7},is_subtype},[{var,{511,7},'File'},{type,{511,15},union,[{var,{511,15},'Filename'},{type,{511,26},iodata,[]}]}]]},{type,{512,7},constraint,[{atom,{512,7},is_subtype},[{var,{512,7},'Filename'},{user_type,{512,19},name_all,[]}]]},{type,{513,7},constraint,[{atom,{513,7},is_subtype},[{var,{513,7},'Modes'},{type,{513,16},list,[{type,{513,17},union,[{user_type,{513,17},mode,[]},{atom,{513,26},ram},{atom,{513,32},directory}]}]}]]},{type,{514,7},constraint,[{atom,{514,7},is_subtype},[{var,{514,7},'IoDevice'},{user_type,{514,19},io_device,[]}]]},{type,{515,7},constraint,[{atom,{515,7},is_subtype},[{var,{515,7},'Reason'},{type,{515,17},union,[{user_type,{515,17},posix,[]},{atom,{515,27},badarg},{atom,{515,36},system_limit}]}]]}]]}]}}]}},{{function,path_consult,2},[{file,[102,105,108,101,46,101,114,108]},{location,1041}],[<<112,97,116,104,95,99,111,110,115,117,108,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,114,101,97,100,115,32,69,114,108,97,110,103,32,116,101,114,109,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,84,101,114,109,115,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,115,117,99,99,101,115,115,102,117,108,108,121,32,114,101,97,100,46,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,116,101,114,109,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,48,51,54>>,signature => [{attribute,{1041,2},spec,{{path_consult,2},[{type,{1041,19},bounded_fun,[{type,{1041,19},'fun',[{type,{1041,19},product,[{var,{1041,20},'Path'},{var,{1041,26},'Filename'}]},{type,{1041,39},union,[{type,{1041,39},tuple,[{atom,{1041,40},ok},{var,{1041,44},'Terms'},{var,{1041,51},'FullName'}]},{type,{1041,63},tuple,[{atom,{1041,64},error},{var,{1041,71},'Reason'}]}]}]},[{type,{1042,7},constraint,[{atom,{1042,7},is_subtype},[{var,{1042,7},'Path'},{type,{1042,15},list,[{var,{1042,16},'Dir'}]}]]},{type,{1043,7},constraint,[{atom,{1043,7},is_subtype},[{var,{1043,7},'Dir'},{user_type,{1043,14},name_all,[]}]]},{type,{1044,7},constraint,[{atom,{1044,7},is_subtype},[{var,{1044,7},'Filename'},{user_type,{1044,19},name_all,[]}]]},{type,{1045,7},constraint,[{atom,{1045,7},is_subtype},[{var,{1045,7},'Terms'},{type,{1045,16},list,[{type,{1045,17},term,[]}]}]]},{type,{1046,7},constraint,[{atom,{1046,7},is_subtype},[{var,{1046,7},'FullName'},{user_type,{1046,19},filename_all,[]}]]},{type,{1047,7},constraint,[{atom,{1047,7},is_subtype},[{var,{1047,7},'Reason'},{type,{1047,17},union,[{user_type,{1047,17},posix,[]},{atom,{1047,27},badarg},{atom,{1047,36},terminated},{atom,{1047,49},system_limit},{type,{1048,17},tuple,[{ann_type,{1048,18},[{var,{1048,18},'Line'},{type,{1048,26},integer,[]}]},{ann_type,{1048,37},[{var,{1048,37},'Mod'},{type,{1048,44},module,[]}]},{ann_type,{1048,54},[{var,{1048,54},'Term'},{type,{1048,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,path_eval,2},[{file,[102,105,108,101,46,101,114,108]},{location,1089}],[<<112,97,116,104,95,101,118,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,114,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46,32,84,104,101,32,114,101,115,117,108,116,32,111,102,32,101,118,97,108,117,97,116,105,111,110,32,105,115,32,110,111,116,32,114,101,116,117,114,110,101,100,59,32,97,110,121,32,101,120,112,114,101,115,115,105,111,110,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,102,105,108,101,32,109,117,115,116,32,98,101,32,116,104,101,114,101,32,102,111,114,32,105,116,115,32,115,105,100,101,32,101,102,102,101,99,116,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,48,55,56>>,signature => [{attribute,{1089,2},spec,{{path_eval,2},[{type,{1089,16},bounded_fun,[{type,{1089,16},'fun',[{type,{1089,16},product,[{var,{1089,17},'Path'},{var,{1089,23},'Filename'}]},{type,{1089,36},union,[{type,{1089,36},tuple,[{atom,{1089,37},ok},{var,{1089,41},'FullName'}]},{type,{1089,53},tuple,[{atom,{1089,54},error},{var,{1089,61},'Reason'}]}]}]},[{type,{1090,7},constraint,[{atom,{1090,7},is_subtype},[{var,{1090,7},'Path'},{type,{1090,15},list,[{ann_type,{1090,16},[{var,{1090,16},'Dir'},{user_type,{1090,23},name_all,[]}]}]}]]},{type,{1091,7},constraint,[{atom,{1091,7},is_subtype},[{var,{1091,7},'Filename'},{user_type,{1091,19},name_all,[]}]]},{type,{1092,7},constraint,[{atom,{1092,7},is_subtype},[{var,{1092,7},'FullName'},{user_type,{1092,19},filename_all,[]}]]},{type,{1093,7},constraint,[{atom,{1093,7},is_subtype},[{var,{1093,7},'Reason'},{type,{1093,17},union,[{user_type,{1093,17},posix,[]},{atom,{1093,27},badarg},{atom,{1093,36},terminated},{atom,{1093,49},system_limit},{type,{1094,17},tuple,[{ann_type,{1094,18},[{var,{1094,18},'Line'},{type,{1094,26},integer,[]}]},{ann_type,{1094,37},[{var,{1094,37},'Mod'},{type,{1094,44},module,[]}]},{ann_type,{1094,54},[{var,{1094,54},'Term'},{type,{1094,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,path_open,3},[{file,[102,105,108,101,46,101,114,108]},{location,1194}],[<<112,97,116,104,95,111,112,101,110,47,51>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,111,112,101,110,115,32,116,104,101,32,102,105,108,101,32,105,110,32,116,104,101,32,109,111,100,101,32,100,101,116,101,114,109,105,110,101,100,32,98,121,32>>,{code,[],[<<77,111,100,101,115>>]},<<46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,73,111,68,101,118,105,99,101,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,105,110,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,109,111,100,101,46,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,102,105,108,101,32,97,110,100,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,111,112,101,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,49,50,52>>,signature => [{attribute,{1194,2},spec,{{path_open,3},[{type,{1194,16},bounded_fun,[{type,{1194,16},'fun',[{type,{1194,16},product,[{var,{1194,17},'Path'},{var,{1194,23},'Filename'},{var,{1194,33},'Modes'}]},{type,{1195,14},union,[{type,{1195,14},tuple,[{atom,{1195,15},ok},{var,{1195,19},'IoDevice'},{var,{1195,29},'FullName'}]},{type,{1195,41},tuple,[{atom,{1195,42},error},{var,{1195,49},'Reason'}]}]}]},[{type,{1196,7},constraint,[{atom,{1196,7},is_subtype},[{var,{1196,7},'Path'},{type,{1196,15},list,[{ann_type,{1196,16},[{var,{1196,16},'Dir'},{user_type,{1196,23},name_all,[]}]}]}]]},{type,{1197,7},constraint,[{atom,{1197,7},is_subtype},[{var,{1197,7},'Filename'},{user_type,{1197,19},name_all,[]}]]},{type,{1198,7},constraint,[{atom,{1198,7},is_subtype},[{var,{1198,7},'Modes'},{type,{1198,16},list,[{type,{1198,17},union,[{user_type,{1198,17},mode,[]},{atom,{1198,26},directory}]}]}]]},{type,{1199,7},constraint,[{atom,{1199,7},is_subtype},[{var,{1199,7},'IoDevice'},{user_type,{1199,19},io_device,[]}]]},{type,{1200,7},constraint,[{atom,{1200,7},is_subtype},[{var,{1200,7},'FullName'},{user_type,{1200,19},filename_all,[]}]]},{type,{1201,7},constraint,[{atom,{1201,7},is_subtype},[{var,{1201,7},'Reason'},{type,{1201,17},union,[{user_type,{1201,17},posix,[]},{atom,{1201,27},badarg},{atom,{1201,36},system_limit}]}]]}]]}]}}]}},{{function,path_script,2},[{file,[102,105,108,101,46,101,114,108]},{location,1149}],[<<112,97,116,104,95,115,99,114,105,112,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,97,114,99,104,101,115,32,116,104,101,32,112,97,116,104,32>>,{code,[],[<<80,97,116,104>>]},<<32,40,97,32,108,105,115,116,32,111,102,32,100,105,114,101,99,116,111,114,121,32,110,97,109,101,115,41,32,117,110,116,105,108,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,102,111,117,110,100,46,32,73,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,102,105,108,101,110,97,109,101,44,32>>,{code,[],[<<80,97,116,104>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,110,32,114,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,86,97,108,117,101,44,32,70,117,108,108,78,97,109,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46,32>>,{code,[],[<<70,117,108,108,78,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,32,97,110,100,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,120,112,114,101,115,115,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,101,110,111,101,110,116,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,102,111,117,110,100,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32>>,{code,[],[<<80,97,116,104>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,49,53,51>>,signature => [{attribute,{1149,2},spec,{{path_script,2},[{type,{1149,18},bounded_fun,[{type,{1149,18},'fun',[{type,{1149,18},product,[{var,{1149,19},'Path'},{var,{1149,25},'Filename'}]},{type,{1150,14},union,[{type,{1150,14},tuple,[{atom,{1150,15},ok},{var,{1150,19},'Value'},{var,{1150,26},'FullName'}]},{type,{1150,38},tuple,[{atom,{1150,39},error},{var,{1150,46},'Reason'}]}]}]},[{type,{1151,7},constraint,[{atom,{1151,7},is_subtype},[{var,{1151,7},'Path'},{type,{1151,15},list,[{ann_type,{1151,16},[{var,{1151,16},'Dir'},{user_type,{1151,23},name_all,[]}]}]}]]},{type,{1152,7},constraint,[{atom,{1152,7},is_subtype},[{var,{1152,7},'Filename'},{user_type,{1152,19},name_all,[]}]]},{type,{1153,7},constraint,[{atom,{1153,7},is_subtype},[{var,{1153,7},'Value'},{type,{1153,16},term,[]}]]},{type,{1154,7},constraint,[{atom,{1154,7},is_subtype},[{var,{1154,7},'FullName'},{user_type,{1154,19},filename_all,[]}]]},{type,{1155,7},constraint,[{atom,{1155,7},is_subtype},[{var,{1155,7},'Reason'},{type,{1155,17},union,[{user_type,{1155,17},posix,[]},{atom,{1155,27},badarg},{atom,{1155,36},terminated},{atom,{1155,49},system_limit},{type,{1156,17},tuple,[{ann_type,{1156,18},[{var,{1156,18},'Line'},{type,{1156,26},integer,[]}]},{ann_type,{1156,37},[{var,{1156,37},'Mod'},{type,{1156,44},module,[]}]},{ann_type,{1156,54},[{var,{1156,54},'Term'},{type,{1156,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,path_script,3},[{file,[102,105,108,101,46,101,114,108]},{location,1161}],[<<112,97,116,104,95,115,99,114,105,112,116,47,51>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<112,97,116,104,95,115,99,114,105,112,116,47,50>>]},<<32,98,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,32>>,{code,[],[<<66,105,110,100,105,110,103,115>>]},<<32,97,114,101,32,117,115,101,100,32,105,110,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,46,32,83,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,114,108,95,101,118,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,101,118,97,108,40,51,41>>]}]},<<32,97,98,111,117,116,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,49,57,55>>,signature => [{attribute,{1161,2},spec,{{path_script,3},[{type,{1161,18},bounded_fun,[{type,{1161,18},'fun',[{type,{1161,18},product,[{var,{1161,19},'Path'},{var,{1161,25},'Filename'},{var,{1161,35},'Bindings'}]},{type,{1162,11},union,[{type,{1162,11},tuple,[{atom,{1162,12},ok},{var,{1162,16},'Value'},{var,{1162,23},'FullName'}]},{type,{1162,35},tuple,[{atom,{1162,36},error},{var,{1162,43},'Reason'}]}]}]},[{type,{1163,7},constraint,[{atom,{1163,7},is_subtype},[{var,{1163,7},'Path'},{type,{1163,15},list,[{ann_type,{1163,16},[{var,{1163,16},'Dir'},{user_type,{1163,23},name_all,[]}]}]}]]},{type,{1164,7},constraint,[{atom,{1164,7},is_subtype},[{var,{1164,7},'Filename'},{user_type,{1164,19},name_all,[]}]]},{type,{1165,7},constraint,[{atom,{1165,7},is_subtype},[{var,{1165,7},'Bindings'},{remote_type,{1165,19},[{atom,{1165,19},erl_eval},{atom,{1165,28},binding_struct},[]]}]]},{type,{1166,7},constraint,[{atom,{1166,7},is_subtype},[{var,{1166,7},'Value'},{type,{1166,16},term,[]}]]},{type,{1167,7},constraint,[{atom,{1167,7},is_subtype},[{var,{1167,7},'FullName'},{user_type,{1167,19},filename_all,[]}]]},{type,{1168,7},constraint,[{atom,{1168,7},is_subtype},[{var,{1168,7},'Reason'},{type,{1168,17},union,[{user_type,{1168,17},posix,[]},{atom,{1168,27},badarg},{atom,{1168,36},terminated},{atom,{1168,49},system_limit},{type,{1169,17},tuple,[{ann_type,{1169,18},[{var,{1169,18},'Line'},{type,{1169,26},integer,[]}]},{ann_type,{1169,37},[{var,{1169,37},'Mod'},{type,{1169,44},module,[]}]},{ann_type,{1169,54},[{var,{1169,54},'Term'},{type,{1169,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,pid2name,1},[{file,[102,105,108,101,46,101,114,108]},{location,170}],[<<112,105,100,50,110,97,109,101,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<80,105,100>>]},<<32,105,115,32,97,110,32,73,47,79,32,100,101,118,105,99,101,44,32,116,104,97,116,32,105,115,44,32,97,32,112,105,100,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{code,[],[<<111,112,101,110,47,50>>]},<<44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,102,105,108,101,110,97,109,101,44,32,111,114,32,114,97,116,104,101,114,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,125>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,116,104,105,115,32,110,111,100,101,32,105,115,32,110,111,116,32,97,32,115,108,97,118,101,44,32,116,104,101,32,102,105,108,101,32,119,97,115,32,111,112,101,110,101,100,32,98,121,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,111,102,32,116,104,105,115,32,110,111,100,101,32,40,116,104,105,115,32,105,109,112,108,105,101,115,32,116,104,97,116,32>>,{code,[],[<<80,105,100>>]},<<32,109,117,115,116,32,98,101,32,97,32,108,111,99,97,108,32,112,105,100,41,32,97,110,100,32,116,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,99,108,111,115,101,100,46,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,105,115,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,110,32,102,108,97,116,32,115,116,114,105,110,103,32,102,111,114,109,97,116,46>>]}]},{dt,[],[{code,[],[<<117,110,100,101,102,105,110,101,100>>]}]},{dd,[],[{p,[],[<<73,110,32,97,108,108,32,111,116,104,101,114,32,99,97,115,101,115,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,116,101,110,100,101,100,32,102,111,114,32,100,101,98,117,103,103,105,110,103,32,111,110,108,121,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,50,48,55>>,signature => [{attribute,{170,2},spec,{{pid2name,1},[{type,{170,15},bounded_fun,[{type,{170,15},'fun',[{type,{170,15},product,[{var,{170,16},'Pid'}]},{type,{170,24},union,[{type,{170,24},tuple,[{atom,{170,25},ok},{var,{170,29},'Filename'}]},{atom,{170,41},undefined}]}]},[{type,{171,7},constraint,[{atom,{171,7},is_subtype},[{var,{171,7},'Filename'},{user_type,{171,19},filename_all,[]}]]},{type,{172,7},constraint,[{atom,{172,7},is_subtype},[{var,{172,7},'Pid'},{type,{172,14},pid,[]}]]}]]}]}}]}},{{function,position,2},[{file,[102,105,108,101,46,101,114,108]},{location,753}],[<<112,111,115,105,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,102,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,116,111,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,78,101,119,80,111,115,105,116,105,111,110,125>>]},<<32,40,97,115,32,97,98,115,111,108,117,116,101,32,111,102,102,115,101,116,41,32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<79,102,102,115,101,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<123,98,111,102,44,32,79,102,102,115,101,116,125>>]},<<46>>]}]},{dt,[],[{code,[],[<<123,98,111,102,44,32,79,102,102,115,101,116,125>>]}]},{dd,[],[{p,[],[<<65,98,115,111,108,117,116,101,32,111,102,102,115,101,116,46>>]}]},{dt,[],[{code,[],[<<123,99,117,114,44,32,79,102,102,115,101,116,125>>]}]},{dd,[],[{p,[],[<<79,102,102,115,101,116,32,102,114,111,109,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,101,111,102,44,32,79,102,102,115,101,116,125>>]}]},{dd,[],[{p,[],[<<79,102,102,115,101,116,32,102,114,111,109,32,116,104,101,32,101,110,100,32,111,102,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<98,111,102,32,124,32,99,117,114,32,124,32,101,111,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32,97,98,111,118,101,32,119,105,116,104,32>>,{code,[],[<<79,102,102,115,101,116>>]},<<32,48,46>>]}]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,111,102,102,115,101,116,115,32,97,114,101,32,99,111,117,110,116,101,100,32,105,110,32,98,121,116,101,115,44,32,110,111,116,32,105,110,32,99,104,97,114,97,99,116,101,114,115,46,32,73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,117,115,105,110,103,32,115,111,109,101,32,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,111,110,101,32,98,121,116,101,32,100,111,101,115,32,110,111,116,32,99,111,114,114,101,115,112,111,110,100,32,116,111,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,32,80,111,115,105,116,105,111,110,105,110,103,32,105,110,32,115,117,99,104,32,97,32,102,105,108,101,32,99,97,110,32,111,110,108,121,32,98,101,32,100,111,110,101,32,116,111,32,107,110,111,119,110,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,105,101,115,46,32,84,104,97,116,32,105,115,44,32,116,111,32,97,32,112,111,115,105,116,105,111,110,32,101,97,114,108,105,101,114,32,114,101,116,114,105,101,118,101,100,32,98,121,32,103,101,116,116,105,110,103,32,97,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,44,32,116,111,32,116,104,101,32,98,101,103,105,110,110,105,110,103,47,101,110,100,32,111,102,32,116,104,101,32,102,105,108,101,32,111,114,32,116,111,32,115,111,109,101,32,111,116,104,101,114,32,112,111,115,105,116,105,111,110,32>>,{em,[],[<<107,110,111,119,110>>]},<<32,116,111,32,98,101,32,111,110,32,97,32,99,111,114,114,101,99,116,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,32,98,121,32,115,111,109,101,32,111,116,104,101,114,32,109,101,97,110,115,32,40,116,121,112,105,99,97,108,108,121,32,98,101,121,111,110,100,32,97,32,98,121,116,101,32,111,114,100,101,114,32,109,97,114,107,32,105,110,32,116,104,101,32,102,105,108,101,44,32,119,104,105,99,104,32,104,97,115,32,97,32,107,110,111,119,110,32,98,121,116,101,45,115,105,122,101,41,46>>]},{p,[],[<<65,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,32,105,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[<<69,105,116,104,101,114,32>>,{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,105,108,108,101,103,97,108,44,32,111,114,32,105,116,32,105,115,32,101,118,97,108,117,97,116,101,100,32,116,111,32,97,32,110,101,103,97,116,105,118,101,32,111,102,102,115,101,116,32,105,110,32,116,104,101,32,102,105,108,101,46,32,78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,112,111,115,105,116,105,111,110,32,105,115,32,97,32,110,101,103,97,116,105,118,101,32,118,97,108,117,101,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,110,32,101,114,114,111,114,44,32,97,110,100,32,97,102,116,101,114,32,116,104,101,32,99,97,108,108,32,116,104,101,32,102,105,108,101,32,112,111,115,105,116,105,111,110,32,105,115,32,117,110,100,101,102,105,110,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,50,51,50>>,signature => [{attribute,{753,2},spec,{{position,2},[{type,{753,15},bounded_fun,[{type,{753,15},'fun',[{type,{753,15},product,[{var,{753,16},'IoDevice'},{var,{753,26},'Location'}]},{type,{753,39},union,[{type,{753,39},tuple,[{atom,{753,40},ok},{var,{753,44},'NewPosition'}]},{type,{753,59},tuple,[{atom,{753,60},error},{var,{753,67},'Reason'}]}]}]},[{type,{754,7},constraint,[{atom,{754,7},is_subtype},[{var,{754,7},'IoDevice'},{user_type,{754,19},io_device,[]}]]},{type,{755,7},constraint,[{atom,{755,7},is_subtype},[{var,{755,7},'Location'},{user_type,{755,19},location,[]}]]},{type,{756,7},constraint,[{atom,{756,7},is_subtype},[{var,{756,7},'NewPosition'},{type,{756,22},integer,[]}]]},{type,{757,7},constraint,[{atom,{757,7},is_subtype},[{var,{757,7},'Reason'},{type,{757,17},union,[{user_type,{757,17},posix,[]},{atom,{757,27},badarg},{atom,{757,36},terminated}]}]]}]]}]}}]}},{{function,pread,2},[{file,[102,105,108,101,46,101,114,108]},{location,632}],[<<112,114,101,97,100,47,50>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32>>,{code,[],[<<112,114,101,97,100,47,51>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,91,68,97,116,97,44,32,46,46,46,93,125>>]},<<32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<44,32,119,104,101,114,101,32,101,97,99,104,32>>,{code,[],[<<68,97,116,97>>]},<<44,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32>>,{code,[],[<<112,114,101,97,100>>]},<<44,32,105,115,32,101,105,116,104,101,114,32,97,32,108,105,115,116,32,111,114,32,97,32,98,105,110,97,114,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,109,111,100,101,32,111,102,32,116,104,101,32,102,105,108,101,44,32,111,114,32>>,{code,[],[<<101,111,102>>]},<<32,105,102,32,116,104,101,32,114,101,113,117,101,115,116,101,100,32,112,111,115,105,116,105,111,110,32,105,115,32,98,101,121,111,110,100,32,101,110,100,32,111,102,32,102,105,108,101,46>>]},{p,[],[<<65,115,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,121,116,101,45,111,102,102,115,101,116,44,32,116,97,107,101,32,115,112,101,99,105,97,108,32,99,97,117,116,105,111,110,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,102,105,108,101,115,32,119,104,101,114,101,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,97,115,32,110,111,116,32,101,118,101,114,121,32,98,121,116,101,32,112,111,115,105,116,105,111,110,32,105,115,32,97,32,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,32,111,110,32,115,117,99,104,32,97,32,102,105,108,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,50,56,52>>,signature => [{attribute,{632,2},spec,{{pread,2},[{type,{632,12},bounded_fun,[{type,{632,12},'fun',[{type,{632,12},product,[{var,{632,13},'IoDevice'},{var,{632,23},'LocNums'}]},{type,{632,35},union,[{type,{632,35},tuple,[{atom,{632,36},ok},{var,{632,40},'DataL'}]},{atom,{632,49},eof},{type,{632,55},tuple,[{atom,{632,56},error},{var,{632,63},'Reason'}]}]}]},[{type,{633,7},constraint,[{atom,{633,7},is_subtype},[{var,{633,7},'IoDevice'},{user_type,{633,19},io_device,[]}]]},{type,{634,7},constraint,[{atom,{634,7},is_subtype},[{var,{634,7},'LocNums'},{type,{634,18},list,[{type,{634,19},tuple,[{ann_type,{634,20},[{var,{634,20},'Location'},{user_type,{634,32},location,[]}]},{ann_type,{634,44},[{var,{634,44},'Number'},{type,{634,54},non_neg_integer,[]}]}]}]}]]},{type,{635,7},constraint,[{atom,{635,7},is_subtype},[{var,{635,7},'DataL'},{type,{635,16},list,[{var,{635,17},'Data'}]}]]},{type,{636,7},constraint,[{atom,{636,7},is_subtype},[{var,{636,7},'Data'},{type,{636,15},union,[{type,{636,15},string,[]},{type,{636,26},binary,[]},{atom,{636,37},eof}]}]]},{type,{637,7},constraint,[{atom,{637,7},is_subtype},[{var,{637,7},'Reason'},{type,{637,17},union,[{user_type,{637,17},posix,[]},{atom,{637,27},badarg},{atom,{637,36},terminated}]}]]}]]}]}}]}},{{function,pread,3},[{file,[102,105,108,101,46,101,114,108]},{location,660}],[<<112,114,101,97,100,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32>>,{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]},<<32,97,110,100,32>>,{code,[],[<<114,101,97,100,47,50>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46>>]},{p,[],[{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,111,110,108,121,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,97,110,100,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,115,46>>]},{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,111,102,32,116,104,101,32,102,105,108,101,32,97,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,97,110,100,32,117,110,99,104,97,110,103,101,100,32,102,111,114,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,46>>]},{p,[],[<<65,115,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,98,121,116,101,45,111,102,102,115,101,116,44,32,116,97,107,101,32,115,112,101,99,105,97,108,32,99,97,117,116,105,111,110,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,102,105,108,101,115,32,119,104,101,114,101,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,97,115,32,110,111,116,32,101,118,101,114,121,32,98,121,116,101,32,112,111,115,105,116,105,111,110,32,105,115,32,97,32,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,32,111,110,32,115,117,99,104,32,97,32,102,105,108,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,48,50>>,signature => [{attribute,{660,2},spec,{{pread,3},[{type,{660,12},bounded_fun,[{type,{660,12},'fun',[{type,{660,12},product,[{var,{660,13},'IoDevice'},{var,{660,23},'Location'},{var,{660,33},'Number'}]},{type,{661,14},union,[{type,{661,14},tuple,[{atom,{661,15},ok},{var,{661,19},'Data'}]},{atom,{661,27},eof},{type,{661,33},tuple,[{atom,{661,34},error},{var,{661,41},'Reason'}]}]}]},[{type,{662,7},constraint,[{atom,{662,7},is_subtype},[{var,{662,7},'IoDevice'},{user_type,{662,19},io_device,[]}]]},{type,{663,7},constraint,[{atom,{663,7},is_subtype},[{var,{663,7},'Location'},{user_type,{663,19},location,[]}]]},{type,{664,7},constraint,[{atom,{664,7},is_subtype},[{var,{664,7},'Number'},{type,{664,17},non_neg_integer,[]}]]},{type,{665,7},constraint,[{atom,{665,7},is_subtype},[{var,{665,7},'Data'},{type,{665,15},union,[{type,{665,15},string,[]},{type,{665,26},binary,[]}]}]]},{type,{666,7},constraint,[{atom,{666,7},is_subtype},[{var,{666,7},'Reason'},{type,{666,17},union,[{user_type,{666,17},posix,[]},{atom,{666,27},badarg},{atom,{666,36},terminated}]}]]}]]}]}}]}},{{function,pwrite,2},[{file,[102,105,108,101,46,101,114,108]},{location,693}],[<<112,119,114,105,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<80,101,114,102,111,114,109,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32>>,{code,[],[<<112,119,114,105,116,101,47,51>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,123,78,44,32,82,101,97,115,111,110,125,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<78>>]},<<32,105,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,115,117,99,99,101,115,115,102,117,108,32,119,114,105,116,101,115,32,100,111,110,101,32,98,101,102,111,114,101,32,116,104,101,32,102,97,105,108,117,114,101,46>>]},{p,[],[<<87,104,101,110,32,112,111,115,105,116,105,111,110,105,110,103,32,105,110,32,97,32,102,105,108,101,32,119,105,116,104,32,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,99,97,117,116,105,111,110,32,109,117,115,116,32,98,101,32,116,97,107,101,110,32,116,111,32,115,101,116,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,110,32,97,32,99,111,114,114,101,99,116,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,112,111,115,105,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,49,57>>,signature => [{attribute,{693,2},spec,{{pwrite,2},[{type,{693,13},bounded_fun,[{type,{693,13},'fun',[{type,{693,13},product,[{var,{693,14},'IoDevice'},{var,{693,24},'LocBytes'}]},{type,{693,37},union,[{atom,{693,37},ok},{type,{693,42},tuple,[{atom,{693,43},error},{type,{693,50},tuple,[{var,{693,51},'N'},{var,{693,54},'Reason'}]}]}]}]},[{type,{694,7},constraint,[{atom,{694,7},is_subtype},[{var,{694,7},'IoDevice'},{user_type,{694,19},io_device,[]}]]},{type,{695,7},constraint,[{atom,{695,7},is_subtype},[{var,{695,7},'LocBytes'},{type,{695,19},list,[{type,{695,20},tuple,[{ann_type,{695,21},[{var,{695,21},'Location'},{user_type,{695,33},location,[]}]},{ann_type,{695,45},[{var,{695,45},'Bytes'},{type,{695,54},iodata,[]}]}]}]}]]},{type,{696,7},constraint,[{atom,{696,7},is_subtype},[{var,{696,7},'N'},{type,{696,12},non_neg_integer,[]}]]},{type,{697,7},constraint,[{atom,{697,7},is_subtype},[{var,{697,7},'Reason'},{type,{697,17},union,[{user_type,{697,17},posix,[]},{atom,{697,27},badarg},{atom,{697,36},terminated}]}]]}]]}]}}]}},{{function,pwrite,3},[{file,[102,105,108,101,46,101,114,108]},{location,718}],[<<112,119,114,105,116,101,47,51>>],#{<<101,110>> => [{p,[],[<<67,111,109,98,105,110,101,115,32>>,{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]},<<32,97,110,100,32>>,{code,[],[<<119,114,105,116,101,47,50>>]},<<32,105,110,32,111,110,101,32,111,112,101,114,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,97,108,108,105,110,103,32,116,104,101,109,32,111,110,101,32,97,116,32,97,32,116,105,109,101,46>>]},{p,[],[{code,[],[<<76,111,99,97,116,105,111,110>>]},<<32,105,115,32,111,110,108,121,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,97,110,32,105,110,116,101,103,101,114,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,97,110,100,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,115,46>>]},{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,111,102,32,116,104,101,32,102,105,108,101,32,97,102,116,101,114,32,116,104,101,32,111,112,101,114,97,116,105,111,110,32,105,115,32,117,110,100,101,102,105,110,101,100,32,102,111,114,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,97,110,100,32,117,110,99,104,97,110,103,101,100,32,102,111,114,32>>,{code,[],[<<114,97,109>>]},<<32,109,111,100,101,46>>]},{p,[],[<<87,104,101,110,32,112,111,115,105,116,105,111,110,105,110,103,32,105,110,32,97,32,102,105,108,101,32,119,105,116,104,32,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,99,97,117,116,105,111,110,32,109,117,115,116,32,98,101,32,116,97,107,101,110,32,116,111,32,115,101,116,32,116,104,101,32,112,111,115,105,116,105,111,110,32,111,110,32,97,32,99,111,114,114,101,99,116,32,99,104,97,114,97,99,116,101,114,32,98,111,117,110,100,97,114,121,46,32,70,111,114,32,100,101,116,97,105,108,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,112,111,115,105,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,111,115,105,116,105,111,110,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,51,52>>,signature => [{attribute,{718,2},spec,{{pwrite,3},[{type,{718,13},bounded_fun,[{type,{718,13},'fun',[{type,{718,13},product,[{var,{718,14},'IoDevice'},{var,{718,24},'Location'},{var,{718,34},'Bytes'}]},{type,{718,44},union,[{atom,{718,44},ok},{type,{718,49},tuple,[{atom,{718,50},error},{var,{718,57},'Reason'}]}]}]},[{type,{719,7},constraint,[{atom,{719,7},is_subtype},[{var,{719,7},'IoDevice'},{user_type,{719,19},io_device,[]}]]},{type,{720,7},constraint,[{atom,{720,7},is_subtype},[{var,{720,7},'Location'},{user_type,{720,19},location,[]}]]},{type,{721,7},constraint,[{atom,{721,7},is_subtype},[{var,{721,7},'Bytes'},{type,{721,16},iodata,[]}]]},{type,{722,7},constraint,[{atom,{722,7},is_subtype},[{var,{722,7},'Reason'},{type,{722,17},union,[{user_type,{722,17},posix,[]},{atom,{722,27},badarg},{atom,{722,36},terminated}]}]]}]]}]}}]}},{{function,read,2},[{file,[102,105,108,101,46,101,114,108]},{location,590}],[<<114,101,97,100,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,98,121,116,101,115,47,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,84,104,101,32,102,117,110,99,116,105,111,110,115,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<44,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,112,114,101,97,100,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,101,97,100,47,51>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]}]},<<32,97,114,101,32,116,104,101,32,111,110,108,121,32,119,97,121,115,32,116,111,32,114,101,97,100,32,102,114,111,109,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,40,97,108,116,104,111,117,103,104,32,116,104,101,121,32,119,111,114,107,32,102,111,114,32,110,111,114,109,97,108,108,121,32,111,112,101,110,101,100,32,102,105,108,101,115,44,32,116,111,111,41,46>>]},{p,[],[<<70,111,114,32,102,105,108,101,115,32,119,104,101,114,101,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,111,110,101,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,121,116,101,32,111,110,32,116,104,101,32,102,105,108,101,46,32,84,104,101,32,112,97,114,97,109,101,116,101,114,32>>,{code,[],[<<78,117,109,98,101,114>>]},<<32,97,108,119,97,121,115,32,100,101,110,111,116,101,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32>>,{em,[],[<<99,104,97,114,97,99,116,101,114,115>>]},<<32,114,101,97,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,44,32,119,104,105,108,101,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,102,105,108,101,32,99,97,110,32,98,101,32,109,111,118,101,100,32,109,117,99,104,32,109,111,114,101,32,116,104,97,110,32,116,104,105,115,32,110,117,109,98,101,114,32,119,104,101,110,32,114,101,97,100,105,110,103,32,97,32,85,110,105,99,111,100,101,32,102,105,108,101,46>>]},{p,[],[<<65,108,115,111,44,32,105,102,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,116,104,101,32>>,{code,[],[<<114,101,97,100,47,51>>]},<<32,99,97,108,108,32,102,97,105,108,115,32,105,102,32,116,104,101,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,99,104,97,114,97,99,116,101,114,115,32,108,97,114,103,101,114,32,116,104,97,110,32,50,53,53,44,32,119,104,105,99,104,32,105,115,32,119,104,121,32,109,111,100,117,108,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,105,115,32,116,111,32,98,101,32,112,114,101,102,101,114,114,101,100,32,119,104,101,110,32,114,101,97,100,105,110,103,32,115,117,99,104,32,97,32,102,105,108,101,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,68,97,116,97,125>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,119,97,115,32,111,112,101,110,101,100,32,105,110,32,98,105,110,97,114,121,32,109,111,100,101,44,32,116,104,101,32,114,101,97,100,32,98,121,116,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32,105,110,32,97,32,108,105,115,116,46,32,84,104,101,32,108,105,115,116,32,111,114,32,98,105,110,97,114,121,32,105,115,32,115,104,111,114,116,101,114,32,116,104,97,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,98,121,116,101,115,32,114,101,113,117,101,115,116,101,100,32,105,102,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,114,101,97,99,104,101,100,46>>]}]},{dt,[],[{code,[],[<<101,111,102>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,101,100,32,105,102,32>>,{code,[],[<<78,117,109,98,101,114,62,48>>]},<<32,97,110,100,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,114,101,97,99,104,101,100,32,98,101,102,111,114,101,32,97,110,121,116,104,105,110,103,32,97,116,32,97,108,108,32,99,111,117,108,100,32,98,101,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,98,97,100,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,102,111,114,32,114,101,97,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,110,111,95,116,114,97,110,115,108,97,116,105,111,110,44,32,117,110,105,99,111,100,101,44,32,108,97,116,105,110,49,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,97,110,100,32,116,104,101,32,100,97,116,97,32,105,110,32,116,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,116,104,101,32,98,121,116,101,45,111,114,105,101,110,116,101,100,32,100,97,116,97,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,51,53,49>>,signature => [{attribute,{590,2},spec,{{read,2},[{type,{590,11},bounded_fun,[{type,{590,11},'fun',[{type,{590,11},product,[{var,{590,12},'IoDevice'},{var,{590,22},'Number'}]},{type,{590,33},union,[{type,{590,33},tuple,[{atom,{590,34},ok},{var,{590,38},'Data'}]},{atom,{590,46},eof},{type,{590,52},tuple,[{atom,{590,53},error},{var,{590,60},'Reason'}]}]}]},[{type,{591,7},constraint,[{atom,{591,7},is_subtype},[{var,{591,7},'IoDevice'},{type,{591,19},union,[{user_type,{591,19},io_device,[]},{type,{591,33},atom,[]}]}]]},{type,{592,7},constraint,[{atom,{592,7},is_subtype},[{var,{592,7},'Number'},{type,{592,17},non_neg_integer,[]}]]},{type,{593,7},constraint,[{atom,{593,7},is_subtype},[{var,{593,7},'Data'},{type,{593,15},union,[{type,{593,15},string,[]},{type,{593,26},binary,[]}]}]]},{type,{594,7},constraint,[{atom,{594,7},is_subtype},[{var,{594,7},'Reason'},{type,{594,17},union,[{user_type,{594,17},posix,[]},{atom,{595,17},badarg},{atom,{596,17},terminated},{type,{597,17},tuple,[{atom,{597,18},no_translation},{atom,{597,34},unicode},{atom,{597,43},latin1}]}]}]]}]]}]}}]}},{{function,read_file,1},[{file,[102,105,108,101,46,101,114,108]},{location,419}],[<<114,101,97,100,95,102,105,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,105,110,97,114,121,125>>]},<<44,32,119,104,101,114,101,32>>,{code,[],[<<66,105,110,97,114,121>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,100,97,116,97,32,111,98,106,101,99,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,105,102,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,114,101,97,100,105,110,103,32,116,104,101,32,102,105,108,101,44,32,111,114,32,102,111,114,32,115,101,97,114,99,104,105,110,103,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,97,109,101,100,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,110,111,109,101,109>>]}]},{dd,[],[{p,[],[<<84,104,101,114,101,32,105,115,32,110,111,116,32,101,110,111,117,103,104,32,109,101,109,111,114,121,32,102,111,114,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,52,48,53>>,signature => [{attribute,{419,2},spec,{{read_file,1},[{type,{419,16},bounded_fun,[{type,{419,16},'fun',[{type,{419,16},product,[{var,{419,17},'Filename'}]},{type,{419,30},union,[{type,{419,30},tuple,[{atom,{419,31},ok},{var,{419,35},'Binary'}]},{type,{419,45},tuple,[{atom,{419,46},error},{var,{419,53},'Reason'}]}]}]},[{type,{420,7},constraint,[{atom,{420,7},is_subtype},[{var,{420,7},'Filename'},{user_type,{420,19},name_all,[]}]]},{type,{421,7},constraint,[{atom,{421,7},is_subtype},[{var,{421,7},'Binary'},{type,{421,17},binary,[]}]]},{type,{422,7},constraint,[{atom,{422,7},is_subtype},[{var,{422,7},'Reason'},{type,{422,17},union,[{user_type,{422,17},posix,[]},{atom,{422,27},badarg},{atom,{422,36},terminated},{atom,{422,49},system_limit}]}]]}]]}]}}]}},{{function,read_file_info,2},[{file,[102,105,108,101,46,101,114,108]},{location,294}],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,52,52,49>>,equiv => {function,read_file_info,1},signature => [{attribute,{294,2},spec,{{read_file_info,2},[{type,{294,21},bounded_fun,[{type,{294,21},'fun',[{type,{294,21},product,[{var,{294,22},'File'},{var,{294,28},'Opts'}]},{type,{294,37},union,[{type,{294,37},tuple,[{atom,{294,38},ok},{var,{294,42},'FileInfo'}]},{type,{294,54},tuple,[{atom,{294,55},error},{var,{294,62},'Reason'}]}]}]},[{type,{295,7},constraint,[{atom,{295,7},is_subtype},[{var,{295,7},'File'},{type,{295,15},union,[{user_type,{295,15},name_all,[]},{user_type,{295,28},io_device,[]}]}]]},{type,{296,7},constraint,[{atom,{296,7},is_subtype},[{var,{296,7},'Opts'},{type,{296,15},list,[{user_type,{296,16},file_info_option,[]}]}]]},{type,{297,7},constraint,[{atom,{297,7},is_subtype},[{var,{297,7},'FileInfo'},{user_type,{297,19},file_info,[]}]]},{type,{298,7},constraint,[{atom,{298,7},is_subtype},[{var,{298,7},'Reason'},{type,{298,17},union,[{user_type,{298,17},posix,[]},{atom,{298,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,read_file_info,1},[{file,[102,105,108,101,46,101,114,108]},{location,282}],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,114,105,101,118,101,115,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,97,32,102,105,108,101,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,73,110,102,111,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,73,110,102,111>>]},<<32,105,115,32,97,32,114,101,99,111,114,100,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<44,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,75,101,114,110,101,108,32,105,110,99,108,117,100,101,32,102,105,108,101,32>>,{code,[],[<<102,105,108,101,46,104,114,108>>]},<<46,32,73,110,99,108,117,100,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,100,105,114,101,99,116,105,118,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,32,102,114,111,109,32,119,104,105,99,104,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<32,45,105,110,99,108,117,100,101,95,108,105,98,40,34,107,101,114,110,101,108,47,105,110,99,108,117,100,101,47,102,105,108,101,46,104,114,108,34,41,46>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,116,121,112,101,32,114,101,116,117,114,110,101,100,32,105,110,32>>,{code,[],[<<97,116,105,109,101>>]},<<44,32>>,{code,[],[<<109,116,105,109,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<99,116,105,109,101>>]},<<32,105,115,32,100,101,112,101,110,100,101,110,116,32,111,110,32,116,104,101,32,116,105,109,101,32,116,121,112,101,32,115,101,116,32,105,110,32>>,{code,[],[<<79,112,116,115,32,58,58,32,123,116,105,109,101,44,32,84,121,112,101,125>>]},<<32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,111,99,97,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,108,111,99,97,108,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<117,110,105,118,101,114,115,97,108>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,117,110,105,118,101,114,115,97,108,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<112,111,115,105,120>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,115,101,99,111,110,100,115,32,115,105,110,99,101,32,111,114,32,98,101,102,111,114,101,32,85,110,105,120,32,116,105,109,101,32,101,112,111,99,104,44,32,119,104,105,99,104,32,105,115,32,49,57,55,48,45,48,49,45,48,49,32,48,48,58,48,48,32,85,84,67,46>>]}]}]},{p,[],[<<68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<123,116,105,109,101,44,32,108,111,99,97,108,125>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,97,110,100,32,111,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,108,111,99,97,108,32,102,105,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,32,119,105,108,108,32,98,114,101,97,107,32,116,104,105,115,32,109,111,100,117,108,101,39,115,32,97,116,111,109,105,99,105,116,121,32,103,117,97,114,97,110,116,101,101,115,32,97,115,32,105,116,32,99,97,110,32,114,97,99,101,32,119,105,116,104,32,97,32,99,111,110,99,117,114,114,101,110,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,49,44,50>>]},<<32>>]},<<46>>]},{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,104,97,115,32,110,111,32,101,102,102,101,99,116,32,119,104,101,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,103,105,118,101,110,32,97,110,32,73,47,79,32,100,101,118,105,99,101,32,105,110,115,116,101,97,100,32,111,102,32,97,32,102,105,108,101,32,110,97,109,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<32,119,105,116,104,32,116,104,101,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,116,111,32,111,98,116,97,105,110,32,97,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,102,105,114,115,116,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<65,115,32,102,105,108,101,32,116,105,109,101,115,32,97,114,101,32,115,116,111,114,101,100,32,105,110,32,80,79,83,73,88,32,116,105,109,101,32,111,110,32,109,111,115,116,32,79,83,44,32,105,116,32,105,115,32,102,97,115,116,101,114,32,116,111,32,113,117,101,114,121,32,102,105,108,101,32,105,110,102,111,114,109,97,116,105,111,110,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<112,111,115,105,120>>]},<<46>>]}]},{p,[],[<<84,104,101,32,114,101,99,111,114,100,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,101,108,100,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<115,105,122,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<83,105,122,101,32,111,102,32,102,105,108,101,32,105,110,32,98,121,116,101,115,46>>]}]},{dt,[],[{code,[],[<<116,121,112,101,32,61,32,100,101,118,105,99,101,32,124,32,100,105,114,101,99,116,111,114,121,32,124,32,111,116,104,101,114,32,124,32,114,101,103,117,108,97,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,102,105,108,101,46,32,67,97,110,32,97,108,115,111,32,99,111,110,116,97,105,110,32>>,{code,[],[<<115,121,109,108,105,110,107>>]},<<32,119,104,101,110,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,108,105,110,107,95,105,110,102,111,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[<<114,101,97,100,95,108,105,110,107,95,105,110,102,111,47,49,44,50>>]},<<46>>]}]},{dt,[],[{code,[],[<<97,99,99,101,115,115,32,61,32,114,101,97,100,32,124,32,119,114,105,116,101,32,124,32,114,101,97,100,95,119,114,105,116,101,32,124,32,110,111,110,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,99,117,114,114,101,110,116,32,115,121,115,116,101,109,32,97,99,99,101,115,115,32,116,111,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<97,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<109,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,119,114,105,116,116,101,110,46>>]}]},{dt,[],[{code,[],[<<99,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,116,104,105,115,32,116,105,109,101,32,102,105,101,108,100,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,46,32,79,110,32,85,110,105,120,44,32,105,116,32,105,115,32,116,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,111,114,32,116,104,101,32>>,{code,[],[<<105,110,111,100,101>>]},<<32,119,97,115,32,99,104,97,110,103,101,100,46,32,73,110,32,87,105,110,100,111,119,115,44,32,105,116,32,105,115,32,116,104,101,32,99,114,101,97,116,101,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<109,111,100,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,112,101,114,109,105,115,115,105,111,110,115,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,116,32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<56,35,48,48,52,48,48>>]}]},{dd,[],[{p,[],[<<114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,50,48,48>>]}]},{dd,[],[{p,[],[<<119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,49,48,48>>]}]},{dd,[],[{p,[],[<<101,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,52,48>>]}]},{dd,[],[{p,[],[<<114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,50,48>>]}]},{dd,[],[{p,[],[<<119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,49,48>>]}]},{dd,[],[{p,[],[<<101,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,52>>]}]},{dd,[],[{p,[],[<<114,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,50>>]}]},{dd,[],[{p,[],[<<119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,49>>]}]},{dd,[],[{p,[],[<<101,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<49,54,35,56,48,48>>]}]},{dd,[],[{p,[],[<<115,101,116,32,117,115,101,114,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]},{dt,[],[{code,[],[<<49,54,35,52,48,48>>]}]},{dd,[],[{p,[],[<<115,101,116,32,103,114,111,117,112,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]}]},{p,[],[<<79,110,32,85,110,105,120,32,112,108,97,116,102,111,114,109,115,44,32,111,116,104,101,114,32,98,105,116,115,32,116,104,97,110,32,116,104,111,115,101,32,108,105,115,116,101,100,32,97,98,111,118,101,32,109,97,121,32,98,101,32,115,101,116,46>>]}]},{dt,[],[{code,[],[<<108,105,110,107,115,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<78,117,109,98,101,114,32,111,102,32,108,105,110,107,115,32,116,111,32,116,104,101,32,102,105,108,101,32,40,116,104,105,115,32,105,115,32,97,108,119,97,121,115,32,49,32,102,111,114,32,102,105,108,101,32,115,121,115,116,101,109,115,32,116,104,97,116,32,104,97,118,101,32,110,111,32,99,111,110,99,101,112,116,32,111,102,32,108,105,110,107,115,41,46>>]}]},{dt,[],[{code,[],[<<109,97,106,111,114,95,100,101,118,105,99,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<73,100,101,110,116,105,102,105,101,115,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,119,104,101,114,101,32,116,104,101,32,102,105,108,101,32,105,115,32,108,111,99,97,116,101,100,46,32,73,110,32,87,105,110,100,111,119,115,44,32,116,104,101,32,110,117,109,98,101,114,32,105,110,100,105,99,97,116,101,115,32,97,32,100,114,105,118,101,32,97,115,32,102,111,108,108,111,119,115,58,32,48,32,109,101,97,110,115,32,65,58,44,32,49,32,109,101,97,110,115,32,66,58,44,32,97,110,100,32,115,111,32,111,110,46>>]}]},{dt,[],[{code,[],[<<109,105,110,111,114,95,100,101,118,105,99,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,118,97,108,105,100,32,102,111,114,32,99,104,97,114,97,99,116,101,114,32,100,101,118,105,99,101,115,32,111,110,32,85,110,105,120,46,32,73,110,32,97,108,108,32,111,116,104,101,114,32,99,97,115,101,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]},{dt,[],[{code,[],[<<105,110,111,100,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,116,104,101,32>>,{code,[],[<<105,110,111,100,101>>]},<<32,110,117,109,98,101,114,46,32,79,110,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]},{dt,[],[{code,[],[<<117,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<73,110,100,105,99,97,116,101,115,32,116,104,101,32,111,119,110,101,114,32,111,102,32,116,104,101,32,102,105,108,101,46,32,79,110,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]},{dt,[],[{code,[],[<<103,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,32,111,119,110,101,114,32,111,102,32,116,104,101,32,102,105,108,101,32,98,101,108,111,110,103,115,32,116,111,46,32,79,110,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,122,101,114,111,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,52,52,49>>,signature => [{attribute,{282,2},spec,{{read_file_info,1},[{type,{282,21},bounded_fun,[{type,{282,21},'fun',[{type,{282,21},product,[{var,{282,22},'File'}]},{type,{282,31},union,[{type,{282,31},tuple,[{atom,{282,32},ok},{var,{282,36},'FileInfo'}]},{type,{282,48},tuple,[{atom,{282,49},error},{var,{282,56},'Reason'}]}]}]},[{type,{283,7},constraint,[{atom,{283,7},is_subtype},[{var,{283,7},'File'},{type,{283,15},union,[{user_type,{283,15},name_all,[]},{user_type,{283,28},io_device,[]}]}]]},{type,{284,7},constraint,[{atom,{284,7},is_subtype},[{var,{284,7},'FileInfo'},{user_type,{284,19},file_info,[]}]]},{type,{285,7},constraint,[{atom,{285,7},is_subtype},[{var,{285,7},'Reason'},{type,{285,17},union,[{user_type,{285,17},posix,[]},{atom,{285,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,read_line,1},[{file,[102,105,108,101,46,101,114,108]},{location,612}],[<<114,101,97,100,95,108,105,110,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,97,32,108,105,110,101,32,111,102,32,98,121,116,101,115,47,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,76,105,110,101,115,32,97,114,101,32,100,101,102,105,110,101,100,32,116,111,32,98,101,32,100,101,108,105,109,105,116,101,100,32,98,121,32,116,104,101,32,108,105,110,101,102,101,101,100,32,40,76,70,44,32>>,{code,[],[<<92,110>>]},<<41,32,99,104,97,114,97,99,116,101,114,44,32,98,117,116,32,97,110,121,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,67,82,44,32>>,{code,[],[<<92,114>>]},<<41,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,101,119,108,105,110,101,32,105,115,32,97,108,115,111,32,116,114,101,97,116,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,76,70,32,99,104,97,114,97,99,116,101,114,32,40,116,104,101,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,105,115,32,115,105,108,101,110,116,108,121,32,105,103,110,111,114,101,100,41,46,32,84,104,101,32,108,105,110,101,32,105,115,32,114,101,116,117,114,110,101,100,32>>,{em,[],[<<105,110,99,108,117,100,105,110,103>>]},<<32,116,104,101,32,76,70,44,32,98,117,116,32,101,120,99,108,117,100,105,110,103,32,97,110,121,32,67,82,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,76,70,46,32,84,104,105,115,32,98,101,104,97,118,105,111,117,114,32,105,115,32,99,111,110,115,105,115,116,101,110,116,32,119,105,116,104,32,116,104,101,32,98,101,104,97,118,105,111,117,114,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111,35,103,101,116,95,108,105,110,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,111,58,103,101,116,95,108,105,110,101,47,50>>]}]},<<46,32,73,102,32,101,110,100,32,111,102,32,102,105,108,101,32,105,115,32,114,101,97,99,104,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,76,70,32,101,110,100,105,110,103,32,116,104,101,32,108,97,115,116,32,108,105,110,101,44,32,97,32,108,105,110,101,32,119,105,116,104,32,110,111,32,116,114,97,105,108,105,110,103,32,76,70,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,111,110,32,102,105,108,101,115,32,111,112,101,110,101,100,32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,46,32,72,111,119,101,118,101,114,44,32,105,116,32,105,115,32,105,110,101,102,102,105,99,105,101,110,116,32,116,111,32,117,115,101,32,105,116,32,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,102,105,108,101,115,32,105,102,32,116,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,115,112,101,99,105,102,105,101,100,46,32,84,104,117,115,44,32,99,111,109,98,105,110,105,110,103,32>>,{code,[],[<<114,97,119>>]},<<32,97,110,100,32>>,{code,[],[<<123,114,101,97,100,95,97,104,101,97,100,44,32,83,105,122,101,125>>]},<<32,105,115,32,104,105,103,104,108,121,32,114,101,99,111,109,109,101,110,100,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,97,32,116,101,120,116,32,102,105,108,101,32,102,111,114,32,114,97,119,32,108,105,110,101,45,111,114,105,101,110,116,101,100,32,114,101,97,100,105,110,103,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,105,115,32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,116,104,101,32>>,{code,[],[<<114,101,97,100,95,108,105,110,101,47,49>>]},<<32,99,97,108,108,32,102,97,105,108,115,32,105,102,32,116,104,101,32,100,97,116,97,32,99,111,110,116,97,105,110,115,32,99,104,97,114,97,99,116,101,114,115,32,108,97,114,103,101,114,32,116,104,97,110,32,50,53,53,44,32,119,104,121,32,109,111,100,117,108,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,105,111>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<105,111,40,51,41>>]}]},<<32,105,115,32,116,111,32,98,101,32,112,114,101,102,101,114,114,101,100,32,119,104,101,110,32,114,101,97,100,105,110,103,32,115,117,99,104,32,97,32,102,105,108,101,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,68,97,116,97,125>>]}]},{dd,[],[{p,[],[<<79,110,101,32,108,105,110,101,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,105,115,32,114,101,116,117,114,110,101,100,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,116,114,97,105,108,105,110,103,32,76,70,44,32,98,117,116,32,119,105,116,104,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,32,114,101,112,108,97,99,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,76,70,32,40,115,101,101,32,97,98,111,118,101,41,46>>]},{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,105,110,32,98,105,110,97,114,121,32,109,111,100,101,44,32,116,104,101,32,114,101,97,100,32,98,121,116,101,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,97,32,98,105,110,97,114,121,44,32,111,116,104,101,114,119,105,115,101,32,105,110,32,97,32,108,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,111,102>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,101,100,32,105,102,32,101,110,100,32,111,102,32,102,105,108,101,32,119,97,115,32,114,101,97,99,104,101,100,32,98,101,102,111,114,101,32,97,110,121,116,104,105,110,103,32,97,116,32,97,108,108,32,99,111,117,108,100,32,98,101,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,98,97,100,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,102,111,114,32,114,101,97,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<123,110,111,95,116,114,97,110,115,108,97,116,105,111,110,44,32,117,110,105,99,111,100,101,44,32,108,97,116,105,110,49,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32,97,110,111,116,104,101,114,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<32,97,110,100,32,116,104,101,32,100,97,116,97,32,111,110,32,116,104,101,32,102,105,108,101,32,99,97,110,110,111,116,32,98,101,32,116,114,97,110,115,108,97,116,101,100,32,116,111,32,116,104,101,32,98,121,116,101,45,111,114,105,101,110,116,101,100,32,100,97,116,97,32,116,104,97,116,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,54,48,49>>,signature => [{attribute,{612,2},spec,{{read_line,1},[{type,{612,16},bounded_fun,[{type,{612,16},'fun',[{type,{612,16},product,[{var,{612,17},'IoDevice'}]},{type,{612,30},union,[{type,{612,30},tuple,[{atom,{612,31},ok},{var,{612,35},'Data'}]},{atom,{612,43},eof},{type,{612,49},tuple,[{atom,{612,50},error},{var,{612,57},'Reason'}]}]}]},[{type,{613,7},constraint,[{atom,{613,7},is_subtype},[{var,{613,7},'IoDevice'},{type,{613,19},union,[{user_type,{613,19},io_device,[]},{type,{613,33},atom,[]}]}]]},{type,{614,7},constraint,[{atom,{614,7},is_subtype},[{var,{614,7},'Data'},{type,{614,15},union,[{type,{614,15},string,[]},{type,{614,26},binary,[]}]}]]},{type,{615,7},constraint,[{atom,{615,7},is_subtype},[{var,{615,7},'Reason'},{type,{615,17},union,[{user_type,{615,17},posix,[]},{atom,{616,17},badarg},{atom,{617,17},terminated},{type,{618,17},tuple,[{atom,{618,18},no_translation},{atom,{618,34},unicode},{atom,{618,43},latin1}]}]}]]}]]}]}}]}},{{function,read_link,1},[{file,[102,105,108,101,46,101,114,108]},{location,356}],[<<114,101,97,100,95,108,105,110,107,47,49>>],#{<<101,110>> => [{p,[],[{a,[{id,<<114,101,97,100,95,108,105,110,107,95,97,108,108>>}],[]},<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,125>>]},<<32,105,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,114,97,119,32,102,105,108,101,110,97,109,101,44,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,111,116,104,101,114,119,105,115,101,46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,100,111,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<123,101,114,114,111,114,44,101,110,111,116,115,117,112,125>>]},<<46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<78,97,109,101>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32,111,114,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,102,105,108,101,32,116,104,97,116,32,105,116,32,114,101,102,101,114,115,32,116,111,32,100,111,101,115,32,110,111,116,32,99,111,110,102,111,114,109,32,116,111,32,116,104,101,32,101,120,112,101,99,116,101,100,32,101,110,99,111,100,105,110,103,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,54,53,56>>,signature => [{attribute,{356,2},spec,{{read_link,1},[{type,{356,16},bounded_fun,[{type,{356,16},'fun',[{type,{356,16},product,[{var,{356,17},'Name'}]},{type,{356,26},union,[{type,{356,26},tuple,[{atom,{356,27},ok},{var,{356,31},'Filename'}]},{type,{356,43},tuple,[{atom,{356,44},error},{var,{356,51},'Reason'}]}]}]},[{type,{357,7},constraint,[{atom,{357,7},is_subtype},[{var,{357,7},'Name'},{user_type,{357,15},name_all,[]}]]},{type,{358,7},constraint,[{atom,{358,7},is_subtype},[{var,{358,7},'Filename'},{user_type,{358,19},filename,[]}]]},{type,{359,7},constraint,[{atom,{359,7},is_subtype},[{var,{359,7},'Reason'},{type,{359,17},union,[{user_type,{359,17},posix,[]},{atom,{359,27},badarg}]}]]}]]}]}}]}},{{function,read_link_all,1},[{file,[102,105,108,101,46,101,114,108]},{location,364}],[<<114,101,97,100,95,108,105,110,107,95,97,108,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,70,105,108,101,110,97,109,101,125>>]},<<32,105,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,114,101,102,101,114,115,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,32,111,114,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,111,116,104,101,114,119,105,115,101,46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,100,111,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32>>,{code,[],[<<123,101,114,114,111,114,44,101,110,111,116,115,117,112,125>>]},<<46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,101,105,116,104,101,114,32,97,32,108,105,115,116,32,111,114,32,97,32,98,105,110,97,114,121,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<78,97,109,101>>]},<<32,100,111,101,115,32,110,111,116,32,114,101,102,101,114,32,116,111,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,115,117,112>>]}]},{dd,[],[{p,[],[<<83,121,109,98,111,108,105,99,32,108,105,110,107,115,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,111,110,32,116,104,105,115,32,112,108,97,116,102,111,114,109,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,54,56,56>>,signature => [{attribute,{364,2},spec,{{read_link_all,1},[{type,{364,20},bounded_fun,[{type,{364,20},'fun',[{type,{364,20},product,[{var,{364,21},'Name'}]},{type,{364,30},union,[{type,{364,30},tuple,[{atom,{364,31},ok},{var,{364,35},'Filename'}]},{type,{364,47},tuple,[{atom,{364,48},error},{var,{364,55},'Reason'}]}]}]},[{type,{365,7},constraint,[{atom,{365,7},is_subtype},[{var,{365,7},'Name'},{user_type,{365,15},name_all,[]}]]},{type,{366,7},constraint,[{atom,{366,7},is_subtype},[{var,{366,7},'Filename'},{user_type,{366,19},filename_all,[]}]]},{type,{367,7},constraint,[{atom,{367,7},is_subtype},[{var,{367,7},'Reason'},{type,{367,17},union,[{user_type,{367,17},posix,[]},{atom,{367,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,54,66>>}},{{function,read_link_info,2},[{file,[102,105,108,101,46,101,114,108]},{location,334}],[<<114,101,97,100,95,108,105,110,107,95,105,110,102,111,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,55,49,54>>,equiv => {function,read_link_info,1},signature => [{attribute,{334,2},spec,{{read_link_info,2},[{type,{334,21},bounded_fun,[{type,{334,21},'fun',[{type,{334,21},product,[{var,{334,22},'Name'},{var,{334,28},'Opts'}]},{type,{334,37},union,[{type,{334,37},tuple,[{atom,{334,38},ok},{var,{334,42},'FileInfo'}]},{type,{334,54},tuple,[{atom,{334,55},error},{var,{334,62},'Reason'}]}]}]},[{type,{335,7},constraint,[{atom,{335,7},is_subtype},[{var,{335,7},'Name'},{user_type,{335,15},name_all,[]}]]},{type,{336,7},constraint,[{atom,{336,7},is_subtype},[{var,{336,7},'Opts'},{type,{336,15},list,[{user_type,{336,16},file_info_option,[]}]}]]},{type,{337,7},constraint,[{atom,{337,7},is_subtype},[{var,{337,7},'FileInfo'},{user_type,{337,19},file_info,[]}]]},{type,{338,7},constraint,[{atom,{338,7},is_subtype},[{var,{338,7},'Reason'},{type,{338,17},union,[{user_type,{338,17},posix,[]},{atom,{338,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,read_link_info,1},[{file,[102,105,108,101,46,101,114,108]},{location,326}],[<<114,101,97,100,95,108,105,110,107,95,105,110,102,111,47,49>>],#{<<101,110>> => [{p,[],[<<87,111,114,107,115,32,108,105,107,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49,44,50>>]}]},<<32,101,120,99,101,112,116,32,116,104,97,116,32,105,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,44,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,105,110,107,32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,32,116,104,101,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<32,114,101,99,111,114,100,32,97,110,100,32,116,104,101,32>>,{code,[],[<<116,121,112,101>>]},<<32,102,105,101,108,100,32,111,102,32,116,104,101,32,114,101,99,111,114,100,32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<115,121,109,108,105,110,107>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,97,110,100,32,111,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,108,111,99,97,108,32,102,105,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46,32,78,111,116,101,32,116,104,97,116,32,116,104,105,115,32,119,105,108,108,32,98,114,101,97,107,32,116,104,105,115,32,109,111,100,117,108,101,39,115,32,97,116,111,109,105,99,105,116,121,32,103,117,97,114,97,110,116,101,101,115,32,97,115,32,105,116,32,99,97,110,32,114,97,99,101,32,119,105,116,104,32,97,32,99,111,110,99,117,114,114,101,110,116,32,99,97,108,108,32,116,111,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,49,44,50>>]}]}]},{p,[],[<<73,102,32>>,{code,[],[<<78,97,109,101>>]},<<32,105,115,32,110,111,116,32,97,32,115,121,109,98,111,108,105,99,32,108,105,110,107,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32>>,{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>]},<<46,32,79,110,32,112,108,97,116,102,111,114,109,115,32,116,104,97,116,32,100,111,32,110,111,116,32,115,117,112,112,111,114,116,32,115,121,109,98,111,108,105,99,32,108,105,110,107,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,108,119,97,121,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<114,101,97,100,95,102,105,108,101,95,105,110,102,111,47,49>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,55,49,54>>,signature => [{attribute,{326,2},spec,{{read_link_info,1},[{type,{326,21},bounded_fun,[{type,{326,21},'fun',[{type,{326,21},product,[{var,{326,22},'Name'}]},{type,{326,31},union,[{type,{326,31},tuple,[{atom,{326,32},ok},{var,{326,36},'FileInfo'}]},{type,{326,48},tuple,[{atom,{326,49},error},{var,{326,56},'Reason'}]}]}]},[{type,{327,7},constraint,[{atom,{327,7},is_subtype},[{var,{327,7},'Name'},{user_type,{327,15},name_all,[]}]]},{type,{328,7},constraint,[{atom,{328,7},is_subtype},[{var,{328,7},'FileInfo'},{user_type,{328,19},file_info,[]}]]},{type,{329,7},constraint,[{atom,{329,7},is_subtype},[{var,{329,7},'Reason'},{type,{329,17},union,[{user_type,{329,17},posix,[]},{atom,{329,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,rename,2},[{file,[102,105,108,101,46,101,114,108]},{location,241}],[<<114,101,110,97,109,101,47,50>>],#{<<101,110>> => [{p,[],[<<84,114,105,101,115,32,116,111,32,114,101,110,97,109,101,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,116,111,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<46,32,73,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,111,118,101,32,102,105,108,101,115,32,40,97,110,100,32,100,105,114,101,99,116,111,114,105,101,115,41,32,98,101,116,119,101,101,110,32,100,105,114,101,99,116,111,114,105,101,115,44,32,98,117,116,32,105,116,32,105,115,32,110,111,116,32,115,117,102,102,105,99,105,101,110,116,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,111,110,108,121,46,32,84,104,101,32,100,101,115,116,105,110,97,116,105,111,110,32,102,105,108,101,110,97,109,101,32,109,117,115,116,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32>>,{code,[],[<<98,97,114>>]},<<32,105,115,32,97,32,110,111,114,109,97,108,32,102,105,108,101,32,97,110,100,32>>,{code,[],[<<102,111,111>>]},<<32,97,110,100,32>>,{code,[],[<<98,97,122>>]},<<32,97,114,101,32,100,105,114,101,99,116,111,114,105,101,115,44,32>>,{code,[],[<<114,101,110,97,109,101,40,34,102,111,111,47,98,97,114,34,44,32,34,98,97,122,34,41>>]},<<32,114,101,116,117,114,110,115,32,97,110,32,101,114,114,111,114,44,32,98,117,116,32>>,{code,[],[<<114,101,110,97,109,101,40,34,102,111,111,47,98,97,114,34,44,32,34,98,97,122,47,98,97,114,34,41>>]},<<32,115,117,99,99,101,101,100,115,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,105,116,32,105,115,32,115,117,99,99,101,115,115,102,117,108,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<82,101,110,97,109,105,110,103,32,111,102,32,111,112,101,110,32,102,105,108,101,115,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,111,110,32,109,111,115,116,32,112,108,97,116,102,111,114,109,115,32,40,115,101,101,32>>,{code,[],[<<101,97,99,99,101,115>>]},<<32,98,101,108,111,119,41,46>>]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,114,101,97,100,32,111,114,32,119,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,115,32,102,111,114,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,111,114,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,105,102,32,101,105,116,104,101,114,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,111,114,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,111,112,101,110,46>>]}]},{dt,[],[{code,[],[<<101,101,120,105,115,116>>]}]},{dd,[],[{p,[],[{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,110,111,116,32,97,110,32,101,109,112,116,121,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,97,108,115,111,32,103,105,118,101,110,32,119,104,101,110,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,97,114,101,32,110,111,116,32,111,102,32,116,104,101,32,115,97,109,101,32,116,121,112,101,46>>]}]},{dt,[],[{code,[],[<<101,105,110,118,97,108>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,105,115,32,97,32,114,111,111,116,32,100,105,114,101,99,116,111,114,121,44,32,111,114,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,97,32,115,117,98,100,105,114,101,99,116,111,114,121,32,111,102,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,44,32,98,117,116,32>>,{code,[],[<<83,111,117,114,99,101>>]},<<32,105,115,32,110,111,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,44,32,98,117,116,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,105,115,32,110,111,116,46>>]}]},{dt,[],[{code,[],[<<101,120,100,101,118>>]}]},{dd,[],[{p,[],[{code,[],[<<83,111,117,114,99,101>>]},<<32,97,110,100,32>>,{code,[],[<<68,101,115,116,105,110,97,116,105,111,110>>]},<<32,97,114,101,32,111,110,32,100,105,102,102,101,114,101,110,116,32,102,105,108,101,32,115,121,115,116,101,109,115,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,55,51,56>>,signature => [{attribute,{241,2},spec,{{rename,2},[{type,{241,13},bounded_fun,[{type,{241,13},'fun',[{type,{241,13},product,[{var,{241,14},'Source'},{var,{241,22},'Destination'}]},{type,{241,38},union,[{atom,{241,38},ok},{type,{241,43},tuple,[{atom,{241,44},error},{var,{241,51},'Reason'}]}]}]},[{type,{242,7},constraint,[{atom,{242,7},is_subtype},[{var,{242,7},'Source'},{user_type,{242,17},name_all,[]}]]},{type,{243,7},constraint,[{atom,{243,7},is_subtype},[{var,{243,7},'Destination'},{user_type,{243,22},name_all,[]}]]},{type,{244,7},constraint,[{atom,{244,7},is_subtype},[{var,{244,7},'Reason'},{type,{244,17},union,[{user_type,{244,17},posix,[]},{atom,{244,27},badarg}]}]]}]]}]}}]}},{{function,script,1},[{file,[102,105,108,101,46,101,114,108]},{location,1123}],[<<115,99,114,105,112,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,97,100,115,32,97,110,100,32,101,118,97,108,117,97,116,101,115,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,39,46,39,32,40,111,114,32,39,44,39,44,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,97,108,115,111,32,97,110,32,101,120,112,114,101,115,115,105,111,110,41,44,32,102,114,111,109,32,116,104,101,32,102,105,108,101,46>>]},{p,[],[<<82,101,116,117,114,110,115,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<123,111,107,44,32,86,97,108,117,101,125>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,114,101,97,100,32,97,110,100,32,101,118,97,108,117,97,116,101,100,46,32>>,{code,[],[<<86,97,108,117,101>>]},<<32,105,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,120,112,114,101,115,115,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,97,116,111,109,40,41,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,111,112,101,110,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,114,101,97,100,105,110,103,32,105,116,46,32,70,111,114,32,97,32,108,105,115,116,32,111,102,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,99,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<123,101,114,114,111,114,44,32,123,76,105,110,101,44,32,77,111,100,44,32,84,101,114,109,125,125>>]}]},{dd,[],[{p,[],[<<65,110,32,101,114,114,111,114,32,111,99,99,117,114,114,101,100,32,119,104,101,110,32,105,110,116,101,114,112,114,101,116,105,110,103,32,116,104,101,32,69,114,108,97,110,103,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,116,104,101,32,102,105,108,101,46,32,85,115,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,102,111,114,109,97,116,95,101,114,114,111,114,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,111,114,109,97,116,95,101,114,114,111,114,47,49>>]}]},<<32,116,111,32,99,111,110,118,101,114,116,32,116,104,101,32,116,104,114,101,101,45,101,108,101,109,101,110,116,32,116,117,112,108,101,32,116,111,32,97,110,32,69,110,103,108,105,115,104,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,97,32,99,111,109,109,101,110,116,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,112,112,35,101,110,99,111,100,105,110,103>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,112,112,40,51,41>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,48,49>>,signature => [{attribute,{1123,2},spec,{{script,1},[{type,{1123,13},bounded_fun,[{type,{1123,13},'fun',[{type,{1123,13},product,[{var,{1123,14},'Filename'}]},{type,{1123,27},union,[{type,{1123,27},tuple,[{atom,{1123,28},ok},{var,{1123,32},'Value'}]},{type,{1123,41},tuple,[{atom,{1123,42},error},{var,{1123,49},'Reason'}]}]}]},[{type,{1124,7},constraint,[{atom,{1124,7},is_subtype},[{var,{1124,7},'Filename'},{user_type,{1124,19},name_all,[]}]]},{type,{1125,7},constraint,[{atom,{1125,7},is_subtype},[{var,{1125,7},'Value'},{type,{1125,16},term,[]}]]},{type,{1126,7},constraint,[{atom,{1126,7},is_subtype},[{var,{1126,7},'Reason'},{type,{1126,17},union,[{user_type,{1126,17},posix,[]},{atom,{1126,27},badarg},{atom,{1126,36},terminated},{atom,{1126,49},system_limit},{type,{1127,17},tuple,[{ann_type,{1127,18},[{var,{1127,18},'Line'},{type,{1127,26},integer,[]}]},{ann_type,{1127,37},[{var,{1127,37},'Mod'},{type,{1127,44},module,[]}]},{ann_type,{1127,54},[{var,{1127,54},'Term'},{type,{1127,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,script,2},[{file,[102,105,108,101,46,101,114,108]},{location,1132}],[<<115,99,114,105,112,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<115,99,114,105,112,116,47,49>>]},<<32,98,117,116,32,116,104,101,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,32>>,{code,[],[<<66,105,110,100,105,110,103,115>>]},<<32,97,114,101,32,117,115,101,100,32,105,110,32,116,104,101,32,101,118,97,108,117,97,116,105,111,110,46,32,83,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,101,114,108,95,101,118,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<101,114,108,95,101,118,97,108,40,51,41>>]}]},<<32,97,98,111,117,116,32,118,97,114,105,97,98,108,101,32,98,105,110,100,105,110,103,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,51,54>>,signature => [{attribute,{1132,2},spec,{{script,2},[{type,{1132,13},bounded_fun,[{type,{1132,13},'fun',[{type,{1132,13},product,[{var,{1132,14},'Filename'},{var,{1132,24},'Bindings'}]},{type,{1132,37},union,[{type,{1132,37},tuple,[{atom,{1132,38},ok},{var,{1132,42},'Value'}]},{type,{1132,51},tuple,[{atom,{1132,52},error},{var,{1132,59},'Reason'}]}]}]},[{type,{1133,7},constraint,[{atom,{1133,7},is_subtype},[{var,{1133,7},'Filename'},{user_type,{1133,19},name_all,[]}]]},{type,{1134,7},constraint,[{atom,{1134,7},is_subtype},[{var,{1134,7},'Bindings'},{remote_type,{1134,19},[{atom,{1134,19},erl_eval},{atom,{1134,28},binding_struct},[]]}]]},{type,{1135,7},constraint,[{atom,{1135,7},is_subtype},[{var,{1135,7},'Value'},{type,{1135,16},term,[]}]]},{type,{1136,7},constraint,[{atom,{1136,7},is_subtype},[{var,{1136,7},'Reason'},{type,{1136,17},union,[{user_type,{1136,17},posix,[]},{atom,{1136,27},badarg},{atom,{1136,36},terminated},{atom,{1136,49},system_limit},{type,{1137,17},tuple,[{ann_type,{1137,18},[{var,{1137,18},'Line'},{type,{1137,26},integer,[]}]},{ann_type,{1137,37},[{var,{1137,37},'Mod'},{type,{1137,44},module,[]}]},{ann_type,{1137,54},[{var,{1137,54},'Term'},{type,{1137,62},term,[]}]}]}]}]]}]]}]}}]}},{{function,sendfile,2},[{file,[102,105,108,101,46,101,114,108]},{location,1317}],[<<115,101,110,100,102,105,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<83,101,110,100,115,32,116,104,101,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<32,116,111,32>>,{code,[],[<<83,111,99,107,101,116>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,121,116,101,115,83,101,110,116,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,52,54>>,signature => [{attribute,{1317,2},spec,{{sendfile,2},[{type,{1317,15},bounded_fun,[{type,{1317,15},'fun',[{type,{1317,15},product,[{var,{1317,16},'Filename'},{var,{1317,26},'Socket'}]},{type,{1318,4},union,[{type,{1318,4},tuple,[{atom,{1318,5},ok},{type,{1318,11},non_neg_integer,[]}]},{type,{1318,32},tuple,[{atom,{1318,33},error},{type,{1318,42},union,[{remote_type,{1318,42},[{atom,{1318,42},inet},{atom,{1318,47},posix},[]]},{atom,{1319,5},closed},{atom,{1319,14},badarg},{atom,{1319,23},not_owner}]}]}]}]},[{type,{1320,7},constraint,[{atom,{1320,7},is_subtype},[{var,{1320,7},'Filename'},{user_type,{1320,19},name_all,[]}]]},{type,{1321,7},constraint,[{atom,{1321,7},is_subtype},[{var,{1321,7},'Socket'},{type,{1321,17},union,[{remote_type,{1321,17},[{atom,{1321,17},inet},{atom,{1321,22},socket},[]]},{remote_type,{1321,33},[{atom,{1321,33},socket},{atom,{1321,40},socket},[]]},{type,{1322,22},'fun',[{type,{1322,22},product,[{type,{1322,23},iolist,[]}]},{type,{1322,36},union,[{atom,{1322,36},ok},{type,{1322,41},tuple,[{atom,{1322,42},error},{type,{1322,49},union,[{remote_type,{1322,49},[{atom,{1322,49},inet},{atom,{1322,54},posix},[]]},{atom,{1322,64},closed}]}]}]}]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,sendfile,5},[{file,[102,105,108,101,46,101,114,108]},{location,1289}],[<<115,101,110,100,102,105,108,101,47,53>>],#{<<101,110>> => [{ul,[{class,<<116,121,112,101,115>>}],[{li,[{name,<<115,101,110,100,102,105,108,101,95,111,112,116,105,111,110>>}],[]}]},{p,[],[<<83,101,110,100,115,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<82,97,119,70,105,108,101>>]},<<32,98,101,103,105,110,110,105,110,103,32,97,116,32>>,{code,[],[<<79,102,102,115,101,116>>]},<<32,116,111,32>>,{code,[],[<<83,111,99,107,101,116>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<123,111,107,44,32,66,121,116,101,115,83,101,110,116,125>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32,73,102,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,105,115,32,115,101,116,32,116,111,32>>,{code,[],[<<48>>]},<<32,97,108,108,32,100,97,116,97,32,97,102,116,101,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32>>,{code,[],[<<79,102,102,115,101,116>>]},<<32,105,115,32,115,101,110,116,46>>]},{p,[],[<<84,104,101,32,102,105,108,101,32,117,115,101,100,32,109,117,115,116,32,98,101,32,111,112,101,110,101,100,32,117,115,105,110,103,32,116,104,101,32>>,{code,[],[<<114,97,119>>]},<<32,102,108,97,103,44,32,97,110,100,32,116,104,101,32,112,114,111,99,101,115,115,32,99,97,108,108,105,110,103,32>>,{code,[],[<<115,101,110,100,102,105,108,101>>]},<<32,109,117,115,116,32,98,101,32,116,104,101,32,99,111,110,116,114,111,108,108,105,110,103,32,112,114,111,99,101,115,115,32,111,102,32,116,104,101,32,115,111,99,107,101,116,46,32,83,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,103,101,110,95,116,99,112,35,99,111,110,116,114,111,108,108,105,110,103,95,112,114,111,99,101,115,115,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,101,110,95,116,99,112,58,99,111,110,116,114,111,108,108,105,110,103,95,112,114,111,99,101,115,115,47,50>>]}]},<<32,111,114,32,109,111,100,117,108,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,115,111,99,107,101,116,35,115,101,116,111,112,116,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,111,99,107,101,116>>]},<<39,115>>]},<<32>>,{a,[{href,<<107,101,114,110,101,108,58,115,111,99,107,101,116,35,111,116,112,95,115,111,99,107,101,116,95,111,112,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[<<108,101,118,101,108,32>>,{code,[],[<<111,116,112>>]},<<32,115,111,99,107,101,116,32,111,112,116,105,111,110,32>>]},{code,[],[<<99,111,110,116,114,111,108,108,105,110,103,95,112,114,111,99,101,115,115>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,79,83,32,117,115,101,100,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,110,111,110,45,98,108,111,99,107,105,110,103,32>>,{code,[],[<<115,101,110,100,102,105,108,101>>]},<<44,32,97,110,32,69,114,108,97,110,103,32,102,97,108,108,98,97,99,107,32,117,115,105,110,103,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,101,97,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,97,100,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<107,101,114,110,101,108,58,103,101,110,95,116,99,112,35,115,101,110,100,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<103,101,110,95,116,99,112,58,115,101,110,100,47,50>>]}]},<<32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<99,104,117,110,107,95,115,105,122,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,99,104,117,110,107,32,115,105,122,101,32,117,115,101,100,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,102,97,108,108,98,97,99,107,32,116,111,32,115,101,110,100,32,100,97,116,97,46,32,73,102,32,117,115,105,110,103,32,116,104,101,32,102,97,108,108,98,97,99,107,44,32,115,101,116,32,116,104,105,115,32,116,111,32,97,32,118,97,108,117,101,32,116,104,97,116,32,99,111,109,102,111,114,116,97,98,108,121,32,102,105,116,115,32,105,110,32,116,104,101,32,115,121,115,116,101,109,115,32,109,101,109,111,114,121,46,32,68,101,102,97,117,108,116,32,105,115,32,50,48,32,77,66,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,53,53>>,signature => [{attribute,{1289,2},spec,{{sendfile,5},[{type,{1289,15},bounded_fun,[{type,{1289,15},'fun',[{type,{1289,15},product,[{var,{1289,16},'RawFile'},{var,{1289,25},'Socket'},{var,{1289,33},'Offset'},{var,{1289,41},'Bytes'},{var,{1289,48},'Opts'}]},{type,{1290,4},union,[{type,{1290,4},tuple,[{atom,{1290,5},ok},{type,{1290,11},non_neg_integer,[]}]},{type,{1290,32},tuple,[{atom,{1290,33},error},{type,{1290,42},union,[{remote_type,{1290,42},[{atom,{1290,42},inet},{atom,{1290,47},posix},[]]},{atom,{1291,5},closed},{atom,{1291,14},badarg},{atom,{1291,23},not_owner}]}]}]}]},[{type,{1292,7},constraint,[{atom,{1292,7},is_subtype},[{var,{1292,7},'RawFile'},{user_type,{1292,18},fd,[]}]]},{type,{1293,7},constraint,[{atom,{1293,7},is_subtype},[{var,{1293,7},'Socket'},{type,{1293,17},union,[{remote_type,{1293,17},[{atom,{1293,17},inet},{atom,{1293,22},socket},[]]},{remote_type,{1293,33},[{atom,{1293,33},socket},{atom,{1293,40},socket},[]]},{type,{1294,22},'fun',[{type,{1294,22},product,[{type,{1294,23},iolist,[]}]},{type,{1294,36},union,[{atom,{1294,36},ok},{type,{1294,41},tuple,[{atom,{1294,42},error},{type,{1294,49},union,[{remote_type,{1294,49},[{atom,{1294,49},inet},{atom,{1294,54},posix},[]]},{atom,{1294,64},closed}]}]}]}]}]}]]},{type,{1295,7},constraint,[{atom,{1295,7},is_subtype},[{var,{1295,7},'Offset'},{type,{1295,17},non_neg_integer,[]}]]},{type,{1296,7},constraint,[{atom,{1296,7},is_subtype},[{var,{1296,7},'Bytes'},{type,{1296,16},non_neg_integer,[]}]]},{type,{1297,7},constraint,[{atom,{1297,7},is_subtype},[{var,{1297,7},'Opts'},{type,{1297,15},list,[{user_type,{1297,16},sendfile_option,[]}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,set_cwd,1},[{file,[102,105,108,101,46,101,114,108]},{location,206}],[<<115,101,116,95,99,119,100,47,49>>],#{<<101,110>> => [{p,[],[<<83,101,116,115,32,116,104,101,32,99,117,114,114,101,110,116,32,119,111,114,107,105,110,103,32,100,105,114,101,99,116,111,114,121,32,111,102,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,116,111,32>>,{code,[],[<<68,105,114>>]},<<46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,101,32,109,111,100,117,108,101,32>>,{code,[],[<<102,105,108,101>>]},<<32,117,115,117,97,108,108,121,32,116,114,101,97,116,32,98,105,110,97,114,105,101,115,32,97,115,32,114,97,119,32,102,105,108,101,110,97,109,101,115,44,32,116,104,97,116,32,105,115,44,32,116,104,101,121,32,97,114,101,32,112,97,115,115,101,100,32,34,97,115,32,105,115,34,32,101,118,101,110,32,119,104,101,110,32,116,104,101,32,101,110,99,111,100,105,110,103,32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,100,111,101,115,32,110,111,116,32,97,103,114,101,101,32,119,105,116,104,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,40,41>>]}]},<<46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,101,120,112,101,99,116,115,32,98,105,110,97,114,105,101,115,32,116,111,32,98,101,32,101,110,99,111,100,101,100,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,118,97,108,117,101,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{code,[],[<<110,97,116,105,118,101,95,110,97,109,101,95,101,110,99,111,100,105,110,103,40,41>>]},<<46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,32,97,114,101,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,100,105,114,101,99,116,111,114,121,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32>>,{code,[],[<<68,105,114>>]},<<32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32,111,114,32,111,110,101,32,111,102,32,105,116,115,32,112,97,114,101,110,116,115,46>>]}]},{dt,[],[{code,[],[<<98,97,100,97,114,103>>]}]},{dd,[],[{p,[],[{code,[],[<<68,105,114>>]},<<32,104,97,115,32,97,110,32,105,109,112,114,111,112,101,114,32,116,121,112,101,44,32,115,117,99,104,32,97,115,32,116,117,112,108,101,46>>]}]},{dt,[],[{code,[],[<<110,111,95,116,114,97,110,115,108,97,116,105,111,110>>]}]},{dd,[],[{p,[],[{code,[],[<<68,105,114>>]},<<32,105,115,32,97,32>>,{code,[],[<<98,105,110,97,114,121,40,41>>]},<<32,119,105,116,104,32,99,104,97,114,97,99,116,101,114,115,32,99,111,100,101,100,32,105,110,32,73,83,79,45,108,97,116,105,110,45,49,32,97,110,100,32,116,104,101,32,86,77,32,105,115,32,111,112,101,114,97,116,105,110,103,32,119,105,116,104,32,117,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,101,110,99,111,100,105,110,103,46>>]}]}]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,110,32,97,32,102,117,116,117,114,101,32,114,101,108,101,97,115,101,44,32,97,32,98,97,100,32,116,121,112,101,32,102,111,114,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<68,105,114>>]},<<32,119,105,108,108,32,112,114,111,98,97,98,108,121,32,103,101,110,101,114,97,116,101,32,97,110,32,101,120,99,101,112,116,105,111,110,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,56,56,56>>,signature => [{attribute,{206,2},spec,{{set_cwd,1},[{type,{206,14},bounded_fun,[{type,{206,14},'fun',[{type,{206,14},product,[{var,{206,15},'Dir'}]},{type,{206,23},union,[{atom,{206,23},ok},{type,{206,28},tuple,[{atom,{206,29},error},{var,{206,36},'Reason'}]}]}]},[{type,{207,7},constraint,[{atom,{207,7},is_subtype},[{var,{207,7},'Dir'},{type,{207,14},union,[{user_type,{207,14},name,[]},{var,{207,23},'EncodedBinary'}]}]]},{type,{208,7},constraint,[{atom,{208,7},is_subtype},[{var,{208,7},'EncodedBinary'},{type,{208,24},binary,[]}]]},{type,{209,7},constraint,[{atom,{209,7},is_subtype},[{var,{209,7},'Reason'},{type,{209,17},union,[{user_type,{209,17},posix,[]},{atom,{209,27},badarg},{atom,{209,36},no_translation}]}]]}]]}]}}]}},{{function,sync,1},[{file,[102,105,108,101,46,101,114,108]},{location,742}],[<<115,121,110,99,47,49>>],#{<<101,110>> => [{p,[],[<<69,110,115,117,114,101,115,32,116,104,97,116,32,97,110,121,32,98,117,102,102,101,114,115,32,107,101,112,116,32,98,121,32,116,104,101,32,111,112,101,114,97,116,105,110,103,32,115,121,115,116,101,109,32,40,110,111,116,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,114,117,110,116,105,109,101,32,115,121,115,116,101,109,41,32,97,114,101,32,119,114,105,116,116,101,110,32,116,111,32,100,105,115,107,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,109,105,103,104,116,32,104,97,118,101,32,110,111,32,101,102,102,101,99,116,46>>]},{p,[],[<<65,32,116,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,32,105,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,116,32,101,110,111,117,103,104,32,115,112,97,99,101,32,108,101,102,116,32,116,111,32,119,114,105,116,101,32,116,104,101,32,102,105,108,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,51,53>>,signature => [{attribute,{742,2},spec,{{sync,1},[{type,{742,11},bounded_fun,[{type,{742,11},'fun',[{type,{742,11},product,[{var,{742,12},'IoDevice'}]},{type,{742,25},union,[{atom,{742,25},ok},{type,{742,30},tuple,[{atom,{742,31},error},{var,{742,38},'Reason'}]}]}]},[{type,{743,7},constraint,[{atom,{743,7},is_subtype},[{var,{743,7},'IoDevice'},{user_type,{743,19},io_device,[]}]]},{type,{744,7},constraint,[{atom,{744,7},is_subtype},[{var,{744,7},'Reason'},{type,{744,17},union,[{user_type,{744,17},posix,[]},{atom,{744,27},badarg},{atom,{744,36},terminated}]}]]}]]}]}}]}},{{function,truncate,1},[{file,[102,105,108,101,46,101,114,108]},{location,766}],[<<116,114,117,110,99,97,116,101,47,49>>],#{<<101,110>> => [{p,[],[<<84,114,117,110,99,97,116,101,115,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,53,49>>,signature => [{attribute,{766,2},spec,{{truncate,1},[{type,{766,15},bounded_fun,[{type,{766,15},'fun',[{type,{766,15},product,[{var,{766,16},'IoDevice'}]},{type,{766,29},union,[{atom,{766,29},ok},{type,{766,34},tuple,[{atom,{766,35},error},{var,{766,42},'Reason'}]}]}]},[{type,{767,7},constraint,[{atom,{767,7},is_subtype},[{var,{767,7},'IoDevice'},{user_type,{767,19},io_device,[]}]]},{type,{768,7},constraint,[{atom,{768,7},is_subtype},[{var,{768,7},'Reason'},{type,{768,17},union,[{user_type,{768,17},posix,[]},{atom,{768,27},badarg},{atom,{768,36},terminated}]}]]}]]}]}}]}},{{function,write,2},[{file,[102,105,108,101,46,101,114,108]},{location,676}],[<<119,114,105,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<87,114,105,116,101,115,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,116,111,32,116,104,101,32,102,105,108,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32>>,{code,[],[<<73,111,68,101,118,105,99,101>>]},<<46,32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,32,116,111,32,119,114,105,116,101,32,116,111,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32>>,{code,[],[<<114,97,119>>]},<<32,109,111,100,101,32,40,97,108,116,104,111,117,103,104,32,105,116,32,119,111,114,107,115,32,102,111,114,32,110,111,114,109,97,108,108,121,32,111,112,101,110,101,100,32,102,105,108,101,115,32,116,111,111,41,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,97,110,100,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<32,111,116,104,101,114,119,105,115,101,46>>]},{p,[],[<<73,102,32,116,104,101,32,102,105,108,101,32,105,115,32,111,112,101,110,101,100,32,119,105,116,104,32>>,{code,[],[<<101,110,99,111,100,105,110,103>>]},<<32,115,101,116,32,116,111,32,115,111,109,101,116,104,105,110,103,32,101,108,115,101,32,116,104,97,110,32>>,{code,[],[<<108,97,116,105,110,49>>]},<<44,32,101,97,99,104,32,98,121,116,101,32,119,114,105,116,116,101,110,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,109,97,110,121,32,98,121,116,101,115,32,98,101,105,110,103,32,119,114,105,116,116,101,110,32,116,111,32,116,104,101,32,102,105,108,101,44,32,97,115,32,116,104,101,32,98,121,116,101,32,114,97,110,103,101,32,48,46,46,50,53,53,32,99,97,110,32,114,101,112,114,101,115,101,110,116,32,97,110,121,116,104,105,110,103,32,98,101,116,119,101,101,110,32,111,110,101,32,97,110,100,32,102,111,117,114,32,98,121,116,101,115,32,100,101,112,101,110,100,105,110,103,32,111,110,32,118,97,108,117,101,32,97,110,100,32,85,84,70,32,101,110,99,111,100,105,110,103,32,116,121,112,101,46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,98,97,100,102>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,105,115,32,110,111,116,32,111,112,101,110,101,100,32,102,111,114,32,119,114,105,116,105,110,103,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,99,101,32,105,115,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,54,48>>,signature => [{attribute,{676,2},spec,{{write,2},[{type,{676,12},bounded_fun,[{type,{676,12},'fun',[{type,{676,12},product,[{var,{676,13},'IoDevice'},{var,{676,23},'Bytes'}]},{type,{676,33},union,[{atom,{676,33},ok},{type,{676,38},tuple,[{atom,{676,39},error},{var,{676,46},'Reason'}]}]}]},[{type,{677,7},constraint,[{atom,{677,7},is_subtype},[{var,{677,7},'IoDevice'},{type,{677,19},union,[{user_type,{677,19},io_device,[]},{type,{677,33},atom,[]}]}]]},{type,{678,7},constraint,[{atom,{678,7},is_subtype},[{var,{678,7},'Bytes'},{type,{678,16},iodata,[]}]]},{type,{679,7},constraint,[{atom,{679,7},is_subtype},[{var,{679,7},'Reason'},{type,{679,17},union,[{user_type,{679,17},posix,[]},{atom,{679,27},badarg},{atom,{679,36},terminated}]}]]}]]}]}}]}},{{function,write_file,2},[{file,[102,105,108,101,46,101,114,108]},{location,443}],[<<119,114,105,116,101,95,102,105,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<87,114,105,116,101,115,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<32,116,101,114,109,32>>,{code,[],[<<66,121,116,101,115>>]},<<32,116,111,32,102,105,108,101,32>>,{code,[],[<<70,105,108,101,110,97,109,101>>]},<<46,32,84,104,101,32,102,105,108,101,32,105,115,32,99,114,101,97,116,101,100,32,105,102,32,105,116,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46,32,73,102,32,105,116,32,101,120,105,115,116,115,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,111,110,116,101,110,116,115,32,97,114,101,32,111,118,101,114,119,114,105,116,116,101,110,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46>>]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]},{dt,[],[{code,[],[<<101,110,111,115,112,99>>]}]},{dd,[],[{p,[],[<<78,111,32,115,112,97,99,101,32,105,115,32,108,101,102,116,32,111,110,32,116,104,101,32,100,101,118,105,99,101,46>>]}]},{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,119,114,105,116,105,110,103,32,116,104,101,32,102,105,108,101,32,111,114,32,115,101,97,114,99,104,105,110,103,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<101,105,115,100,105,114>>]}]},{dd,[],[{p,[],[<<84,104,101,32,110,97,109,101,100,32,102,105,108,101,32,105,115,32,97,32,100,105,114,101,99,116,111,114,121,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,49,57,56,54>>,signature => [{attribute,{443,2},spec,{{write_file,2},[{type,{443,17},bounded_fun,[{type,{443,17},'fun',[{type,{443,17},product,[{var,{443,18},'Filename'},{var,{443,28},'Bytes'}]},{type,{443,38},union,[{atom,{443,38},ok},{type,{443,43},tuple,[{atom,{443,44},error},{var,{443,51},'Reason'}]}]}]},[{type,{444,7},constraint,[{atom,{444,7},is_subtype},[{var,{444,7},'Filename'},{user_type,{444,19},name_all,[]}]]},{type,{445,7},constraint,[{atom,{445,7},is_subtype},[{var,{445,7},'Bytes'},{type,{445,16},iodata,[]}]]},{type,{446,7},constraint,[{atom,{446,7},is_subtype},[{var,{446,7},'Reason'},{type,{446,17},union,[{user_type,{446,17},posix,[]},{atom,{446,27},badarg},{atom,{446,36},terminated},{atom,{446,49},system_limit}]}]]}]]}]}}]}},{{function,write_file,3},[{file,[102,105,108,101,46,101,114,108]},{location,455}],[<<119,114,105,116,101,95,102,105,108,101,47,51>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<119,114,105,116,101,95,102,105,108,101,47,50>>]},<<44,32,98,117,116,32,116,97,107,101,115,32,97,32,116,104,105,114,100,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<77,111,100,101,115>>]},<<44,32,97,32,108,105,115,116,32,111,102,32,112,111,115,115,105,98,108,101,32,109,111,100,101,115,44,32,115,101,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<46,32,84,104,101,32,109,111,100,101,32,102,108,97,103,115,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,97,110,100,32>>,{code,[],[<<119,114,105,116,101>>]},<<32,97,114,101,32,105,109,112,108,105,99,105,116,44,32,115,111,32,116,104,101,121,32,97,114,101,32,110,111,116,32,116,111,32,98,101,32,117,115,101,100,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,50,51>>,signature => [{attribute,{455,2},spec,{{write_file,3},[{type,{455,17},bounded_fun,[{type,{455,17},'fun',[{type,{455,17},product,[{var,{455,18},'Filename'},{var,{455,28},'Bytes'},{var,{455,35},'Modes'}]},{type,{455,45},union,[{atom,{455,45},ok},{type,{455,50},tuple,[{atom,{455,51},error},{var,{455,58},'Reason'}]}]}]},[{type,{456,7},constraint,[{atom,{456,7},is_subtype},[{var,{456,7},'Filename'},{user_type,{456,19},name_all,[]}]]},{type,{457,7},constraint,[{atom,{457,7},is_subtype},[{var,{457,7},'Bytes'},{type,{457,16},iodata,[]}]]},{type,{458,7},constraint,[{atom,{458,7},is_subtype},[{var,{458,7},'Modes'},{type,{458,16},list,[{user_type,{458,17},mode,[]}]}]]},{type,{459,7},constraint,[{atom,{459,7},is_subtype},[{var,{459,7},'Reason'},{type,{459,17},union,[{user_type,{459,17},posix,[]},{atom,{459,27},badarg},{atom,{459,36},terminated},{atom,{459,49},system_limit}]}]]}]]}]}}]}},{{function,write_file_info,3},[{file,[102,105,108,101,46,101,114,108]},{location,380}],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,51>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,51,52>>,equiv => {function,write_file_info,2},signature => [{attribute,{380,2},spec,{{write_file_info,3},[{type,{380,22},bounded_fun,[{type,{380,22},'fun',[{type,{380,22},product,[{var,{380,23},'Filename'},{var,{380,33},'FileInfo'},{var,{380,43},'Opts'}]},{type,{380,52},union,[{atom,{380,52},ok},{type,{380,57},tuple,[{atom,{380,58},error},{var,{380,65},'Reason'}]}]}]},[{type,{381,7},constraint,[{atom,{381,7},is_subtype},[{var,{381,7},'Filename'},{user_type,{381,19},name_all,[]}]]},{type,{382,7},constraint,[{atom,{382,7},is_subtype},[{var,{382,7},'Opts'},{type,{382,15},list,[{user_type,{382,16},file_info_option,[]}]}]]},{type,{383,7},constraint,[{atom,{383,7},is_subtype},[{var,{383,7},'FileInfo'},{user_type,{383,19},file_info,[]}]]},{type,{384,7},constraint,[{atom,{384,7},is_subtype},[{var,{384,7},'Reason'},{type,{384,17},union,[{user_type,{384,17},posix,[]},{atom,{384,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{function,write_file_info,2},[{file,[102,105,108,101,46,101,114,108]},{location,372}],[<<119,114,105,116,101,95,102,105,108,101,95,105,110,102,111,47,50>>],#{<<101,110>> => [{p,[],[<<67,104,97,110,103,101,115,32,102,105,108,101,32,105,110,102,111,114,109,97,116,105,111,110,46,32,82,101,116,117,114,110,115,32>>,{code,[],[<<111,107>>]},<<32,105,102,32,115,117,99,99,101,115,115,102,117,108,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<123,101,114,114,111,114,44,32,82,101,97,115,111,110,125>>]},<<46,32>>,{code,[],[<<70,105,108,101,73,110,102,111>>]},<<32,105,115,32,97,32,114,101,99,111,114,100,32>>,{code,[],[<<102,105,108,101,95,105,110,102,111>>]},<<44,32,100,101,102,105,110,101,100,32,105,110,32,116,104,101,32,75,101,114,110,101,108,32,105,110,99,108,117,100,101,32,102,105,108,101,32>>,{code,[],[<<102,105,108,101,46,104,114,108>>]},<<46,32,73,110,99,108,117,100,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,100,105,114,101,99,116,105,118,101,32,105,110,32,116,104,101,32,109,111,100,117,108,101,32,102,114,111,109,32,119,104,105,99,104,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<32,45,105,110,99,108,117,100,101,95,108,105,98,40,34,107,101,114,110,101,108,47,105,110,99,108,117,100,101,47,102,105,108,101,46,104,114,108,34,41,46>>]}]},{p,[],[<<84,104,101,32,116,105,109,101,32,116,121,112,101,32,115,101,116,32,105,110,32>>,{code,[],[<<97,116,105,109,101>>]},<<44,32>>,{code,[],[<<109,116,105,109,101>>]},<<44,32,97,110,100,32>>,{code,[],[<<99,116,105,109,101>>]},<<32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,116,105,109,101,32,116,121,112,101,32,115,101,116,32,105,110,32>>,{code,[],[<<79,112,116,115,32,58,58,32,123,116,105,109,101,44,32,84,121,112,101,125>>]},<<32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<108,111,99,97,108>>]}]},{dd,[],[{p,[],[<<73,110,116,101,114,112,114,101,116,115,32,116,104,101,32,116,105,109,101,32,115,101,116,32,97,115,32,108,111,99,97,108,46>>]}]},{dt,[],[{code,[],[<<117,110,105,118,101,114,115,97,108>>]}]},{dd,[],[{p,[],[<<73,110,116,101,114,112,114,101,116,115,32,105,116,32,97,115,32,117,110,105,118,101,114,115,97,108,32,116,105,109,101,46>>]}]},{dt,[],[{code,[],[<<112,111,115,105,120>>]}]},{dd,[],[{p,[],[<<77,117,115,116,32,98,101,32,115,101,99,111,110,100,115,32,115,105,110,99,101,32,111,114,32,98,101,102,111,114,101,32,85,110,105,120,32,116,105,109,101,32,101,112,111,99,104,44,32,119,104,105,99,104,32,105,115,32,49,57,55,48,45,48,49,45,48,49,32,48,48,58,48,48,32,85,84,67,46>>]}]}]},{p,[],[<<68,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<123,116,105,109,101,44,32,108,111,99,97,108,125>>]},<<46>>]},{p,[],[<<73,102,32,116,104,101,32,111,112,116,105,111,110,32>>,{code,[],[<<114,97,119>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,102,105,108,101,32,115,101,114,118,101,114,32,105,115,32,110,111,116,32,99,97,108,108,101,100,32,97,110,100,32,111,110,108,121,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,108,111,99,97,108,32,102,105,108,101,115,32,105,115,32,114,101,116,117,114,110,101,100,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,101,108,100,115,32,97,114,101,32,117,115,101,100,32,102,114,111,109,32,116,104,101,32,114,101,99,111,114,100,44,32,105,102,32,116,104,101,121,32,97,114,101,32,115,112,101,99,105,102,105,101,100,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,114,101,97,100,46>>]}]},{dt,[],[{code,[],[<<109,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,108,97,115,116,32,116,105,109,101,32,116,104,101,32,102,105,108,101,32,119,97,115,32,119,114,105,116,116,101,110,46>>]}]},{dt,[],[{code,[],[<<99,116,105,109,101,32,61,32>>]},{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,100,97,116,101,95,116,105,109,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<100,97,116,101,95,116,105,109,101,40,41>>]}]},{code,[],[<<32,124,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<79,110,32,85,110,105,120,44,32,97,110,121,32,118,97,108,117,101,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,105,103,110,111,114,101,100,32,40,116,104,101,32,34,99,116,105,109,101,34,32,102,111,114,32,116,104,101,32,102,105,108,101,32,105,115,32,115,101,116,32,116,111,32,116,104,101,32,99,117,114,114,101,110,116,32,116,105,109,101,41,46,32,79,110,32,87,105,110,100,111,119,115,44,32,116,104,105,115,32,102,105,101,108,100,32,105,115,32,116,104,101,32,110,101,119,32,99,114,101,97,116,105,111,110,32,116,105,109,101,32,116,111,32,115,101,116,32,102,111,114,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<109,111,100,101,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,112,101,114,109,105,115,115,105,111,110,115,32,97,115,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,98,105,116,32,118,97,108,117,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<56,35,48,48,52,48,48>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,50,48,48>>]}]},{dd,[],[{p,[],[<<87,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,49,48,48>>]}]},{dd,[],[{p,[],[<<69,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,119,110,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,52,48>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,50,48>>]}]},{dd,[],[{p,[],[<<87,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,49,48>>]}]},{dd,[],[{p,[],[<<69,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,103,114,111,117,112>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,52>>]}]},{dd,[],[{p,[],[<<82,101,97,100,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,50>>]}]},{dd,[],[{p,[],[<<87,114,105,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<56,35,48,48,48,48,49>>]}]},{dd,[],[{p,[],[<<69,120,101,99,117,116,101,32,112,101,114,109,105,115,115,105,111,110,58,32,111,116,104,101,114>>]}]},{dt,[],[{code,[],[<<49,54,35,56,48,48>>]}]},{dd,[],[{p,[],[<<83,101,116,32,117,115,101,114,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]},{dt,[],[{code,[],[<<49,54,35,52,48,48>>]}]},{dd,[],[{p,[],[<<83,101,116,32,103,114,111,117,112,32,105,100,32,111,110,32,101,120,101,99,117,116,105,111,110>>]}]}]},{p,[],[<<79,110,32,85,110,105,120,32,112,108,97,116,102,111,114,109,115,44,32,111,116,104,101,114,32,98,105,116,115,32,116,104,97,110,32,116,104,111,115,101,32,108,105,115,116,101,100,32,97,98,111,118,101,32,109,97,121,32,98,101,32,115,101,116,46>>]}]},{dt,[],[{code,[],[<<117,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<73,110,100,105,99,97,116,101,115,32,116,104,101,32,102,105,108,101,32,111,119,110,101,114,46,32,73,103,110,111,114,101,100,32,102,111,114,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,46>>]}]},{dt,[],[{code,[],[<<103,105,100,32,61,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,32,102,105,108,101,32,111,119,110,101,114,32,98,101,108,111,110,103,115,32,116,111,46,32,73,103,110,111,114,101,100,32,102,111,114,32,110,111,110,45,85,110,105,120,32,102,105,108,101,32,115,121,115,116,101,109,115,46>>]}]}]},{p,[],[<<84,121,112,105,99,97,108,32,101,114,114,111,114,32,114,101,97,115,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<101,97,99,99,101,115>>]}]},{dd,[],[{p,[],[<<77,105,115,115,105,110,103,32,115,101,97,114,99,104,32,112,101,114,109,105,115,115,105,111,110,32,102,111,114,32,111,110,101,32,111,102,32,116,104,101,32,112,97,114,101,110,116,32,100,105,114,101,99,116,111,114,105,101,115,32,111,102,32,116,104,101,32,102,105,108,101,46>>]}]},{dt,[],[{code,[],[<<101,110,111,101,110,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32,101,120,105,115,116,46>>]}]},{dt,[],[{code,[],[<<101,110,111,116,100,105,114>>]}]},{dd,[],[{p,[],[<<65,32,99,111,109,112,111,110,101,110,116,32,111,102,32,116,104,101,32,102,105,108,101,110,97,109,101,32,105,115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114,121,46,32,79,110,32,115,111,109,101,32,112,108,97,116,102,111,114,109,115,44,32>>,{code,[],[<<101,110,111,101,110,116>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,105,110,115,116,101,97,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,107,101,114,110,101,108,47,100,111,99,47,115,114,99,47,102,105,108,101,46,120,109,108,35,76,50,48,51,52>>,signature => [{attribute,{372,2},spec,{{write_file_info,2},[{type,{372,22},bounded_fun,[{type,{372,22},'fun',[{type,{372,22},product,[{var,{372,23},'Filename'},{var,{372,33},'FileInfo'}]},{type,{372,46},union,[{atom,{372,46},ok},{type,{372,51},tuple,[{atom,{372,52},error},{var,{372,59},'Reason'}]}]}]},[{type,{373,7},constraint,[{atom,{373,7},is_subtype},[{var,{373,7},'Filename'},{user_type,{373,19},name_all,[]}]]},{type,{374,7},constraint,[{atom,{374,7},is_subtype},[{var,{374,7},'FileInfo'},{user_type,{374,19},file_info,[]}]]},{type,{375,7},constraint,[{atom,{375,7},is_subtype},[{var,{375,7},'Reason'},{type,{375,17},union,[{user_type,{375,17},posix,[]},{atom,{375,27},badarg}]}]]}]]}]}}],since => <<79,84,80,32,82,49,53,66>>}},{{type,deep_list,0},[{file,[102,105,108,101,46,101,114,108]},{location,101}],[<<45,116,121,112,101,32,100,101,101,112,95,108,105,115,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{101,2},type,{deep_list,{type,{101,22},list,[{type,{101,23},union,[{type,{101,23},char,[]},{type,{101,32},atom,[]},{user_type,{101,41},deep_list,[]}]}]},[]}}]}},{{type,fd,0},[{file,[102,105,108,101,46,101,114,108]},{location,87}],[<<102,100,40,41>>],#{<<101,110>> => [{p,[],[<<65,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,102,105,108,101,32,111,112,101,110,101,100,32,105,110,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,114,97,119>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<114,97,119>>]}]},<<32,109,111,100,101,46>>]}]},#{signature => [{attribute,{87,2},type,{fd,{type,{87,22},record,[{atom,{87,23},file_descriptor}]},[]}}]}},{{type,filename,0},[{file,[102,105,108,101,46,101,114,108]},{location,84}],[<<45,116,121,112,101,32,102,105,108,101,110,97,109,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32,97,108,115,111,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<110,97,109,101,95,97,108,108,40,41>>]}]},<<32,116,121,112,101,46>>]}]},#{signature => [{attribute,{84,2},type,{filename,{type,{84,22},string,[]},[]}}]}},{{type,filename_all,0},[{file,[102,105,108,101,46,101,114,108]},{location,85}],[<<45,116,121,112,101,32,102,105,108,101,110,97,109,101,95,97,108,108,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<83,101,101,32,97,108,115,111,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<110,97,109,101,95,97,108,108,40,41>>]}]},<<32,116,121,112,101,46>>]}]},#{signature => [{attribute,{85,2},type,{filename_all,{type,{85,25},union,[{type,{85,25},string,[]},{type,{85,36},binary,[]}]},[]}}]}},{{type,io_device,0},[{file,[102,105,108,101,46,101,114,108]},{location,88}],[<<45,116,121,112,101,32,105,111,95,100,101,118,105,99,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,115,32,114,101,116,117,114,110,101,100,32,98,121,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,111,112,101,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<111,112,101,110,47,50>>]}]},<<59,32>>,{code,[],[<<112,105,100,40,41>>]},<<32,105,115,32,97,32,112,114,111,99,101,115,115,32,104,97,110,100,108,105,110,103,32,73,47,79,45,112,114,111,116,111,99,111,108,115,46>>]}]},#{signature => [{attribute,{88,2},type,{io_device,{type,{88,22},union,[{type,{88,22},pid,[]},{user_type,{88,30},fd,[]}]},[]}}]}},{{type,name,0},[{file,[102,105,108,101,46,101,114,108]},{location,102}],[<<45,116,121,112,101,32,110,97,109,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<73,102,32,86,77,32,105,115,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,44,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<32,97,110,100,32>>,{code,[],[<<99,104,97,114,40,41>>]},<<32,97,114,101,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,62,32,50,53,53,46,32,83,101,101,32,97,108,115,111,32,116,104,101,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,111,102,32,116,104,101,32>>,{a,[{href,<<107,101,114,110,101,108,58,102,105,108,101,35,110,97,109,101,95,97,108,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,116,121,112,101>>}],[{code,[],[<<110,97,109,101,95,97,108,108,40,41>>]}]},<<32,116,121,112,101,46>>]}]},#{signature => [{attribute,{102,2},type,{name,{type,{102,22},union,[{type,{102,22},string,[]},{type,{102,33},atom,[]},{user_type,{102,42},deep_list,[]}]},[]}}]}},{{type,name_all,0},[{file,[102,105,108,101,46,101,114,108]},{location,103}],[<<45,116,121,112,101,32,110,97,109,101,95,97,108,108,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<73,102,32,86,77,32,105,115,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,108,108,111,119,101,100,32,116,111,32,98,101,32,62,32,50,53,53,46,32>>,{code,[],[<<82,97,119,70,105,108,101,110,97,109,101>>]},<<32,105,115,32,97,32,102,105,108,101,110,97,109,101,32,110,111,116,32,115,117,98,106,101,99,116,32,116,111,32,85,110,105,99,111,100,101,32,116,114,97,110,115,108,97,116,105,111,110,44,32,109,101,97,110,105,110,103,32,116,104,97,116,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,99,104,97,114,97,99,116,101,114,115,32,110,111,116,32,99,111,110,102,111,114,109,105,110,103,32,116,111,32,116,104,101,32,85,110,105,99,111,100,101,32,101,110,99,111,100,105,110,103,32,101,120,112,101,99,116,101,100,32,102,114,111,109,32,116,104,101,32,102,105,108,101,32,115,121,115,116,101,109,32,40,116,104,97,116,32,105,115,44,32,110,111,110,45,85,84,70,45,56,32,99,104,97,114,97,99,116,101,114,115,32,97,108,116,104,111,117,103,104,32,116,104,101,32,86,77,32,105,115,32,115,116,97,114,116,101,100,32,105,110,32,85,110,105,99,111,100,101,32,102,105,108,101,110,97,109,101,32,109,111,100,101,41,46,32,78,117,108,108,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,116,101,103,101,114,32,118,97,108,117,101,32,122,101,114,111,41,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,97,108,108,111,119,101,100,32,105,110,32,102,105,108,101,110,97,109,101,115,32,40,110,111,116,32,101,118,101,110,32,97,116,32,116,104,101,32,101,110,100,41,46>>]}]},#{signature => [{attribute,{103,2},type,{name_all,{type,{103,22},union,[{type,{103,22},string,[]},{type,{103,33},atom,[]},{user_type,{103,42},deep_list,[]},{ann_type,{103,57},[{var,{103,57},'RawFilename'},{type,{103,72},binary,[]}]}]},[]}}]}},{{type,posix,0},[{file,[102,105,108,101,46,101,114,108]},{location,104}],[<<45,116,121,112,101,32,112,111,115,105,120,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32,97,116,111,109,32,116,104,97,116,32,105,115,32,110,97,109,101,100,32,102,114,111,109,32,116,104,101,32,80,79,83,73,88,32,101,114,114,111,114,32,99,111,100,101,115,32,117,115,101,100,32,105,110,32,85,110,105,120,44,32,97,110,100,32,105,110,32,116,104,101,32,114,117,110,116,105,109,101,32,108,105,98,114,97,114,105,101,115,32,111,102,32,109,111,115,116,32,67,32,99,111,109,112,105,108,101,114,115,46>>]}]},#{signature => [{attribute,{104,2},type,{posix,{type,{105,9},union,[{atom,{105,9},eacces},{atom,{105,20},eagain},{atom,{106,9},ebadf},{atom,{106,19},ebadmsg},{atom,{106,31},ebusy},{atom,{107,9},edeadlk},{atom,{107,21},edeadlock},{atom,{107,35},edquot},{atom,{108,9},eexist},{atom,{109,9},efault},{atom,{109,20},efbig},{atom,{109,30},eftype},{atom,{110,9},eintr},{atom,{110,19},einval},{atom,{110,30},eio},{atom,{110,38},eisdir},{atom,{111,9},eloop},{atom,{112,9},emfile},{atom,{112,20},emlink},{atom,{112,31},emultihop},{atom,{113,9},enametoolong},{atom,{113,26},enfile},{atom,{114,9},enobufs},{atom,{114,21},enodev},{atom,{114,32},enolck},{atom,{114,43},enolink},{atom,{114,55},enoent},{atom,{115,9},enomem},{atom,{115,20},enospc},{atom,{115,31},enosr},{atom,{115,41},enostr},{atom,{115,52},enosys},{atom,{116,9},enotblk},{atom,{116,21},enotdir},{atom,{116,33},enotsup},{atom,{116,45},enxio},{atom,{117,9},eopnotsupp},{atom,{117,24},eoverflow},{atom,{118,9},eperm},{atom,{118,19},epipe},{atom,{119,9},erange},{atom,{119,20},erofs},{atom,{120,9},espipe},{atom,{120,21},esrch},{atom,{120,32},estale},{atom,{121,9},etxtbsy},{atom,{122,9},exdev}]},[]}}]}},{{type,date_time,0},[{file,[102,105,108,101,46,101,114,108]},{location,123}],[<<45,116,121,112,101,32,100,97,116,101,95,116,105,109,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<77,117,115,116,32,100,101,110,111,116,101,32,97,32,118,97,108,105,100,32,100,97,116,101,32,97,110,100,32,116,105,109,101,46>>]}]},#{signature => [{attribute,{123,2},type,{date_time,{remote_type,{123,22},[{atom,{123,22},calendar},{atom,{123,31},datetime},[]]},[]}}]}},{{type,file_info,0},[{file,[102,105,108,101,46,101,114,108]},{location,86}],[<<45,116,121,112,101,32,102,105,108,101,95,105,110,102,111,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{86,2},type,{file_info,{type,{86,22},record,[{atom,{86,23},file_info}]},[]}}]}},{{type,location,0},[{file,[102,105,108,101,46,101,114,108]},{location,89}],[<<45,116,121,112,101,32,108,111,99,97,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{89,2},type,{location,{type,{89,22},union,[{type,{89,22},integer,[]},{type,{89,34},tuple,[{atom,{89,35},bof},{ann_type,{89,42},[{var,{89,42},'Offset'},{type,{89,52},integer,[]}]}]},{type,{90,22},tuple,[{atom,{90,23},cur},{ann_type,{90,30},[{var,{90,30},'Offset'},{type,{90,40},integer,[]}]}]},{type,{91,8},tuple,[{atom,{91,9},eof},{ann_type,{91,16},[{var,{91,16},'Offset'},{type,{91,26},integer,[]}]}]},{atom,{91,39},bof},{atom,{91,47},cur},{atom,{91,55},eof}]},[]}}]}},{{type,mode,0},[{file,[102,105,108,101,46,101,114,108]},{location,92}],[<<45,116,121,112,101,32,109,111,100,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{92,2},type,{mode,{type,{92,22},union,[{atom,{92,22},read},{atom,{92,31},write},{atom,{92,41},append},{atom,{93,22},exclusive},{atom,{93,36},raw},{atom,{93,44},binary},{type,{94,8},tuple,[{atom,{94,9},delayed_write},{ann_type,{95,23},[{var,{95,23},'Size'},{type,{95,31},non_neg_integer,[]}]},{ann_type,{96,23},[{var,{96,23},'Delay'},{type,{96,32},non_neg_integer,[]}]}]},{atom,{97,8},delayed_write},{type,{97,26},tuple,[{atom,{97,27},read_ahead},{ann_type,{97,41},[{var,{97,41},'Size'},{type,{97,49},pos_integer,[]}]}]},{atom,{98,8},read_ahead},{atom,{98,23},compressed},{type,{99,8},tuple,[{atom,{99,9},encoding},{remote_type,{99,21},[{atom,{99,21},unicode},{atom,{99,29},encoding},[]]}]},{atom,{100,8},sync}]},[]}}]}},{{type,file_info_option,0},[{file,[102,105,108,101,46,101,114,108]},{location,129}],[<<45,116,121,112,101,32,102,105,108,101,95,105,110,102,111,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{129,2},type,{file_info_option,{type,{129,29},union,[{type,{129,29},tuple,[{atom,{129,30},time},{atom,{129,38},local}]},{type,{129,49},tuple,[{atom,{129,50},time},{atom,{129,58},universal}]},{type,{130,8},tuple,[{atom,{130,9},time},{atom,{130,17},posix}]},{atom,{130,28},raw}]},[]}}]}}]}. \ No newline at end of file
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_altname_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_altname_1_func.txt
new file mode 100644
index 0000000000..7082445a78
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_altname_1_func.txt
@@ -0,0 +1,5 @@
+
+  altname/1
+
+ The documentation for altname/1 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_copy_opened_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_copy_opened_3_func.txt
new file mode 100644
index 0000000000..142c86eff4
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_copy_opened_3_func.txt
@@ -0,0 +1,6 @@
+
+  copy_opened/3
+
+ The documentation for copy_opened/3 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_1_func.txt
index 88be4438f6..5b66b4ba67 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_1_func.txt
@@ -2,6 +2,9 @@
-spec delete(Filename) -> ok | {error, Reason}
 when Filename :: name_all(), Reason :: posix() | badarg.
+Since:
+ OTP 24.0
+
Types:
-type delete_option() :: raw.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_2_func.txt
index 53c3185027..d8cc8befc7 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_delete_2_func.txt
@@ -5,6 +5,9 @@
 Opts :: [delete_option()],
 Reason :: posix() | badarg.
+Since:
+ OTP 24.0
+
Types:
-type delete_option() :: raw.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_3_func.txt
new file mode 100644
index 0000000000..85a88fa38f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_3_func.txt
@@ -0,0 +1,6 @@
+
+  ipread_s32bu_p32bu/3
+
+ The documentation for ipread_s32bu_p32bu/3 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_int_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_int_3_func.txt
new file mode 100644
index 0000000000..de346114dd
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_ipread_s32bu_p32bu_int_3_func.txt
@@ -0,0 +1,6 @@
+
+  ipread_s32bu_p32bu_int/3
+
+ The documentation for ipread_s32bu_p32bu_int/3 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_open_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_open_2_func.txt
index 24ca2b24d6..b89e725d7b 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_open_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_open_2_func.txt
@@ -217,6 +217,15 @@
returned from this call can be used as an argument to the I/O
functions (see io(3)).
+ Warning:
+ While this function can be used to open any file, we recommend
+ against using it for NFS-mounted files, FIFOs, devices, or
+ similar since they can cause IO threads to hang forever.
+
+ If your application needs to interact with these kinds of
+ files we recommend breaking out those parts to a port program
+ instead.
+
Note:
In previous versions of file, modes were specified as one of
the atoms read, write, or read_write instead of a list.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_path_eval_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_path_eval_3_func.txt
new file mode 100644
index 0000000000..828e8cf9f8
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_path_eval_3_func.txt
@@ -0,0 +1,5 @@
+
+  path_eval/3
+
+ The documentation for path_eval/3 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_read_file_info_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_read_file_info_1_func.txt
new file mode 100644
index 0000000000..88576426f9
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_read_file_info_1_func.txt
@@ -0,0 +1,6 @@
+
+  raw_read_file_info/1
+
+ The documentation for raw_read_file_info/1 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_write_file_info_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_write_file_info_2_func.txt
new file mode 100644
index 0000000000..5b9650666c
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_raw_write_file_info_2_func.txt
@@ -0,0 +1,6 @@
+
+  raw_write_file_info/2
+
+ The documentation for raw_write_file_info/2 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_1_func.txt
index d997bdf4f1..c5d25d6581 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_1_func.txt
@@ -50,8 +50,9 @@
size = integer() >= 0:
Size of file in bytes.
- type = device | directory | other | regular | symlink:
- The type of the file.
+ type = device | directory | other | regular:
+ The type of the file. Can also contain symlink when returned
+ from read_link_info/1,2.
access = read | write | read_write | none:
The current system access to the file.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_2_func.txt
index c8ad4f7215..53a644dea1 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_read_file_info_2_func.txt
@@ -51,8 +51,9 @@
size = integer() >= 0:
Size of file in bytes.
- type = device | directory | other | regular | symlink:
- The type of the file.
+ type = device | directory | other | regular:
+ The type of the file. Can also contain symlink when returned
+ from read_link_info/1,2.
access = read | write | read_write | none:
The current system access to the file.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_2_func.txt
index d22adad04f..0ccfaf7e01 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_2_func.txt
@@ -2,7 +2,13 @@
-spec sendfile(Filename, Socket) ->
 {ok, non_neg_integer()} |
 {error, inet:posix() | closed | badarg | not_owner}
-  when Filename :: name_all(), Socket :: inet:socket().
+  when
+  Filename :: name_all(),
+  Socket ::
+  inet:socket() |
+  socket:socket() |
+  fun((iolist()) ->
+  ok | {error, inet:posix() | closed}).
Since:
OTP R15B
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_5_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_5_func.txt
index ae2cc29578..991f012cb5 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_5_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_file_sendfile_5_func.txt
@@ -4,7 +4,11 @@
 {error, inet:posix() | closed | badarg | not_owner}
 when
 RawFile :: fd(),
-  Socket :: inet:socket(),
+  Socket ::
+  inet:socket() |
+  socket:socket() |
+  fun((iolist()) ->
+  ok | {error, inet:posix() | closed}),
 Offset :: non_neg_integer(),
 Bytes :: non_neg_integer(),
 Opts :: [sendfile_option()].
@@ -23,7 +27,8 @@
The file used must be opened using the raw flag, and the process
calling sendfile must be the controlling process of the socket.
- See gen_tcp:controlling_process/2.
+ See gen_tcp:controlling_process/2 or module socket's level 
+ otp socket option controlling_process.
If the OS used does not support non-blocking sendfile, an Erlang
fallback using read/2 and gen_tcp:send/2 is used.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv.txt
new file mode 100644
index 0000000000..2392dee3c3
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv.txt
@@ -0,0 +1,5 @@
+
+ user_drv
+
+ The documentation for user_drv is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_cb.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_cb.txt
new file mode 100644
index 0000000000..d6ddedfc1a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_cb.txt
@@ -0,0 +1,3 @@
+ user_drv
+
+There are no callbacks in this module
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_interfaces_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_interfaces_1_func.txt
new file mode 100644
index 0000000000..f693b67617
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_interfaces_1_func.txt
@@ -0,0 +1,6 @@
+
+  interfaces/1
+
+ The documentation for interfaces/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_2_func.txt
new file mode 100644
index 0000000000..a9c626e643
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_2_func.txt
@@ -0,0 +1,5 @@
+
+  server/2
+
+ The documentation for server/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_3_func.txt
new file mode 100644
index 0000000000..372628b879
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_server_3_func.txt
@@ -0,0 +1,5 @@
+
+  server/3
+
+ The documentation for server/3 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_0_func.txt
new file mode 100644
index 0000000000..7b93442257
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_0_func.txt
@@ -0,0 +1,5 @@
+
+  start/0
+
+ The documentation for start/0 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_1_func.txt
new file mode 100644
index 0000000000..123e70566a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_1_func.txt
@@ -0,0 +1,5 @@
+
+  start/1
+
+ The documentation for start/1 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_2_func.txt
new file mode 100644
index 0000000000..cb801a2351
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_2_func.txt
@@ -0,0 +1,5 @@
+
+  start/2
+
+ The documentation for start/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_3_func.txt
new file mode 100644
index 0000000000..91d7dae25a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_start_3_func.txt
@@ -0,0 +1,5 @@
+
+  start/3
+
+ The documentation for start/3 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_type.txt
new file mode 100644
index 0000000000..5d7d0ce012
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/kernel_user_drv_type.txt
@@ -0,0 +1,3 @@
+ user_drv
+
+There are no types in this module
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1
index 3d2107fdcf..b4a7ae3e4d 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1
+++ b/lib/stdlib/test/shell_docs_SUITE_data/re.docs_v1
@@ -1 +1 @@
-{docs_v1,[{file,[114,101,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<84,104,105,115,32,109,111,100,117,108,101,32,99,111,110,116,97,105,110,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,102,111,114,32,115,116,114,105,110,103,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46>>]},{p,[],[<<84,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,101,103,101,120,112,95,115,121,110,116,97,120>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110>>]},<<32,115,121,110,116,97,120,32,97,110,100,32,115,101,109,97,110,116,105,99,115,32,114,101,115,101,109,98,108,101,32,116,104,97,116,32,111,102,32,80,101,114,108,46>>]},{p,[],[<<84,104,101,32,109,97,116,99,104,105,110,103,32,97,108,103,111,114,105,116,104,109,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,97,114,101,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,44,32,98,117,116,32,110,111,116,32,97,108,108,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,115,32,105,110,116,101,114,102,97,99,101,100,32,97,110,100,32,115,111,109,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,103,111,32,98,101,121,111,110,100,32,119,104,97,116,32,80,67,82,69,32,111,102,102,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,80,67,82,69,32,118,101,114,115,105,111,110,32,56,46,52,48,32,40,114,101,108,101,97,115,101,32,100,97,116,101,32,50,48,49,55,45,48,49,45,49,49,41,32,105,115,32,117,115,101,100,46,32,84,104,101,32,115,101,99,116,105,111,110,115,32,111,102,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,97,114,101,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,105,115,32,109,111,100,117,108,101,32,97,114,101,32,105,110,99,108,117,100,101,100,32,104,101,114,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,108,105,116,101,114,97,108,32,115,121,110,116,97,120,32,102,111,114,32,115,116,114,105,110,103,115,32,117,115,101,115,32,116,104,101,32,34,92,34,32,40,98,97,99,107,115,108,97,115,104,41,32,99,104,97,114,97,99,116,101,114,32,97,115,32,97,110,32,101,115,99,97,112,101,32,99,111,100,101,46,32,89,111,117,32,110,101,101,100,32,116,111,32,101,115,99,97,112,101,32,98,97,99,107,115,108,97,115,104,101,115,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,98,111,116,104,32,105,110,32,121,111,117,114,32,99,111,100,101,32,97,110,100,32,105,110,32,116,104,101,32,115,104,101,108,108,44,32,119,105,116,104,32,97,110,32,101,120,116,114,97,32,98,97,99,107,115,108,97,115,104,44,32,116,104,97,116,32,105,115,44,32,34,92,92,34,46>>]}]},{a,[{id,<<114,101,103,101,120,112,95,115,121,110,116,97,120>>}],[]},{h2,[],[<<80,101,114,108,45,76,105,107,101,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,83,121,110,116,97,120>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,99,111,110,116,97,105,110,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,102,111,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,117,115,101,100,32,98,121,32,116,104,105,115,32,109,111,100,117,108,101,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,119,105,116,104,32,99,104,97,110,103,101,115,32,119,104,101,114,101,32,116,104,105,115,32,109,111,100,117,108,101,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,46>>]},{a,[{id,<<114,101,103,101,120,112,95,115,121,110,116,97,120,95,100,101,116,97,105,108,115>>}],[]},{h2,[],[<<80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115>>]},{p,[],[<<84,104,101,32,115,121,110,116,97,120,32,97,110,100,32,115,101,109,97,110,116,105,99,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,100,101,116,97,105,108,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,46,32,80,101,114,108,39,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,105,116,115,32,111,119,110,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,101,110,101,114,97,108,32,97,114,101,32,99,111,118,101,114,101,100,32,105,110,32,109,97,110,121,32,98,111,111,107,115,44,32,115,111,109,101,32,119,105,116,104,32,99,111,112,105,111,117,115,32,101,120,97,109,112,108,101,115,46,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,34,77,97,115,116,101,114,105,110,103,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,115,34,44,32,112,117,98,108,105,115,104,101,100,32,98,121,32,79,39,82,101,105,108,108,121,44,32,99,111,118,101,114,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,114,101,97,116,32,100,101,116,97,105,108,46,32,84,104,105,115,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,80,67,82,69,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,105,110,116,101,110,100,101,100,32,97,115,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,46>>]},{p,[],[<<84,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,105,115,32,100,105,118,105,100,101,100,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<66,97,99,107,115,108,97,115,104>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,78>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,54>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,55>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,56>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,57>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<86,101,114,116,105,99,97,108,32,66,97,114>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<82,101,112,101,116,105,116,105,111,110>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,54>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,55>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<65,115,115,101,114,116,105,111,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,56>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,57>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,111,109,109,101,110,116,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108>>]}]}]},{a,[{id,<<115,101,99,116,49>>}],[]},{h2,[],[<<83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115>>]},{p,[],[<<83,111,109,101,32,111,112,116,105,111,110,115,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,115,112,101,99,105,97,108,32,105,116,101,109,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,98,117,116,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,32,109,97,107,101,32,116,104,101,115,101,32,111,112,116,105,111,110,115,32,97,99,99,101,115,115,105,98,108,101,32,116,111,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,115,32,119,104,111,32,97,114,101,32,110,111,116,32,97,98,108,101,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,112,114,111,103,114,97,109,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,105,116,101,109,115,32,99,97,110,32,97,112,112,101,97,114,44,32,98,117,116,32,116,104,101,121,32,109,117,115,116,32,97,108,108,32,98,101,32,116,111,103,101,116,104,101,114,32,114,105,103,104,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,32,108,101,116,116,101,114,115,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,32,99,97,115,101,46>>]},{p,[],[{em,[],[<<85,84,70,32,83,117,112,112,111,114,116>>]}]},{p,[],[<<85,110,105,99,111,100,101,32,115,117,112,112,111,114,116,32,105,115,32,98,97,115,105,99,97,108,108,121,32,85,84,70,45,56,32,98,97,115,101,100,46,32,84,111,32,117,115,101,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,44,32,121,111,117,32,101,105,116,104,101,114,32,99,97,108,108,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,111,114,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,115,58>>]},{pre,[],[{code,[],[<<40,42,85,84,70,56,41,10,40,42,85,84,70,41>>]}]},{p,[],[<<66,111,116,104,32,111,112,116,105,111,110,115,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,44,32,116,104,101,32,105,110,112,117,116,32,115,116,114,105,110,103,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,85,84,70,45,56,46,32,78,111,116,105,99,101,32,116,104,97,116,32,119,105,116,104,32,116,104,101,115,101,32,105,110,115,116,114,117,99,116,105,111,110,115,44,32,116,104,101,32,97,117,116,111,109,97,116,105,99,32,99,111,110,118,101,114,115,105,111,110,32,111,102,32,108,105,115,116,115,32,116,111,32,85,84,70,45,56,32,105,115,32,110,111,116,32,112,101,114,102,111,114,109,101,100,32,98,121,32,116,104,101,32>>,{code,[],[<<114,101>>]},<<32,102,117,110,99,116,105,111,110,115,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,32,114,101,99,111,109,109,101,110,100,101,100,46,32,65,100,100,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,119,104,101,110,32,114,117,110,110,105,110,103,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,105,110,115,116,101,97,100,46>>]},{p,[],[<<83,111,109,101,32,97,112,112,108,105,99,97,116,105,111,110,115,32,116,104,97,116,32,97,108,108,111,119,32,116,104,101,105,114,32,117,115,101,114,115,32,116,111,32,115,117,112,112,108,121,32,112,97,116,116,101,114,110,115,32,99,97,110,32,119,105,115,104,32,116,111,32,114,101,115,116,114,105,99,116,32,116,104,101,109,32,116,111,32,110,111,110,45,85,84,70,32,100,97,116,97,32,102,111,114,32,115,101,99,117,114,105,116,121,32,114,101,97,115,111,110,115,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<110,101,118,101,114,95,117,116,102>>]},<<32,105,115,32,115,101,116,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,40,42,85,84,70,41,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,110,111,116,32,97,108,108,111,119,101,100,44,32,97,110,100,32,116,104,101,105,114,32,97,112,112,101,97,114,97,110,99,101,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,46>>]},{p,[],[{em,[],[<<85,110,105,99,111,100,101,32,80,114,111,112,101,114,116,121,32,83,117,112,112,111,114,116>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,97,110,111,116,104,101,114,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32,116,104,97,116,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,42,85,67,80,41>>]}]},{p,[],[<<84,104,105,115,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<58,32,105,116,32,99,97,117,115,101,115,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,92,100,32,97,110,100,32,92,119,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,105,110,115,116,101,97,100,32,111,102,32,114,101,99,111,103,110,105,122,105,110,103,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,115,32,60,32,50,53,54,32,116,104,114,111,117,103,104,32,97,32,108,111,111,107,117,112,32,116,97,98,108,101,46>>]},{p,[],[{em,[],[<<68,105,115,97,98,108,105,110,103,32,83,116,97,114,116,117,112,32,79,112,116,105,109,105,122,97,116,105,111,110,115>>]}]},{p,[],[<<73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32>>,{code,[],[<<40,42,78,79,95,83,84,65,82,84,95,79,80,84,41>>]},<<44,32,105,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]},<<32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46>>]},{p,[],[{em,[],[<<78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115>>]}]},{a,[{id,<<110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115>>}],[]},{p,[],[<<80,67,82,69,32,115,117,112,112,111,114,116,115,32,102,105,118,101,32,99,111,110,118,101,110,116,105,111,110,115,32,102,111,114,32,105,110,100,105,99,97,116,105,110,103,32,108,105,110,101,32,98,114,101,97,107,115,32,105,110,32,115,116,114,105,110,103,115,58,32,97,32,115,105,110,103,108,101,32,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,41,32,99,104,97,114,97,99,116,101,114,44,32,97,32,115,105,110,103,108,101,32,76,70,32,40,108,105,110,101,32,102,101,101,100,41,32,99,104,97,114,97,99,116,101,114,44,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,97,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,44,32,97,110,100,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,46>>]},{p,[],[<<65,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,118,101,32,115,101,113,117,101,110,99,101,115,58>>]},{dl,[],[{dt,[],[<<40,42,67,82,41>>]},{dd,[],[<<67,97,114,114,105,97,103,101,32,114,101,116,117,114,110>>]},{dt,[],[<<40,42,76,70,41>>]},{dd,[],[<<76,105,110,101,32,102,101,101,100>>]},{dt,[],[<<40,42,67,82,76,70,41>>]},{dd,[],[<<62,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,102,111,108,108,111,119,101,100,32,98,121,32,108,105,110,101,32,102,101,101,100>>]},{dt,[],[<<40,42,65,78,89,67,82,76,70,41>>]},{dd,[],[<<65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,97,98,111,118,101>>]},{dt,[],[<<40,42,65,78,89,41>>]},{dd,[],[<<65,108,108,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115>>]}]},{p,[],[<<84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,99,104,97,110,103,101,115,32,116,104,101,32,99,111,110,118,101,110,116,105,111,110,32,116,111,32,67,82,58>>]},{pre,[],[{code,[],[<<40,42,67,82,41,97,46,98>>]}]},{p,[],[<<84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32>>,{code,[],[<<97,92,110,98>>]},<<44,32,97,115,32,76,70,32,105,115,32,110,111,32,108,111,110,103,101,114,32,97,32,110,101,119,108,105,110,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,97,102,102,101,99,116,115,32,119,104,101,114,101,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,116,114,117,101,46,32,73,116,32,97,108,115,111,32,97,102,102,101,99,116,115,32,116,104,101,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,116,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,105,115,32,110,111,116,32,115,101,116,44,32,97,110,100,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,92,78,46,32,72,111,119,101,118,101,114,44,32,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,119,104,97,116,32,116,104,101,32,92,82,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,109,97,116,99,104,101,115,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,105,115,32,105,115,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,59,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,92,82,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115>>]},<<46,32,65,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,92,82,32,115,101,116,116,105,110,103,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,46>>]},{p,[],[{em,[],[<<83,101,116,116,105,110,103,32,77,97,116,99,104,32,97,110,100,32,82,101,99,117,114,115,105,111,110,32,76,105,109,105,116,115>>]}]},{p,[],[<<84,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,99,97,110,32,115,101,116,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,40,41,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,97,110,100,32,111,110,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,46,32,84,104,101,115,101,32,102,97,99,105,108,105,116,105,101,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,32,99,97,116,99,104,32,114,117,110,97,119,97,121,32,109,97,116,99,104,101,115,32,116,104,97,116,32,97,114,101,32,112,114,111,118,111,107,101,100,32,98,121,32,112,97,116,116,101,114,110,115,32,119,105,116,104,32,104,117,103,101,32,109,97,116,99,104,105,110,103,32,116,114,101,101,115,32,40,97,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,41,32,97,110,100,32,116,111,32,97,118,111,105,100,32,114,117,110,110,105,110,103,32,111,117,116,32,111,102,32,115,121,115,116,101,109,32,115,116,97,99,107,32,98,121,32,116,111,111,32,109,117,99,104,32,114,101,99,117,114,115,105,111,110,46,32,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,108,105,109,105,116,115,32,105,115,32,114,101,97,99,104,101,100,44,32>>,{code,[],[<<112,99,114,101,95,101,120,101,99,40,41>>]},<<32,103,105,118,101,115,32,97,110,32,101,114,114,111,114,32,114,101,116,117,114,110,46,32,84,104,101,32,108,105,109,105,116,115,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,105,116,101,109,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{pre,[],[{code,[],[<<40,42,76,73,77,73,84,95,77,65,84,67,72,61,100,41,10,40,42,76,73,77,73,84,95,82,69,67,85,82,83,73,79,78,61,100,41>>]}]},{p,[],[<<72,101,114,101,32,100,32,105,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,109,117,115,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,118,97,108,117,101,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,102,111,114,32,105,116,32,116,111,32,104,97,118,101,32,97,110,121,32,101,102,102,101,99,116,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,32,99,97,110,32,108,111,119,101,114,32,116,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,116,104,101,32,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,110,111,116,32,114,97,105,115,101,32,105,116,46,32,73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,101,116,116,105,110,103,32,111,102,32,111,110,101,32,111,102,32,116,104,101,115,101,32,108,105,109,105,116,115,44,32,116,104,101,32,108,111,119,101,114,32,118,97,108,117,101,32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32,98,111,116,104,32,116,104,101,32,108,105,109,105,116,115,32,105,115,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,108,105,109,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,115,116,97,99,107,32,100,101,112,116,104,32,111,102,32,116,104,101,32,86,77,44,32,97,115,32,80,67,82,69,32,102,111,114,32,69,114,108,97,110,103,32,105,115,32,99,111,109,112,105,108,101,100,32,105,110,32,115,117,99,104,32,97,32,119,97,121,32,116,104,97,116,32,116,104,101,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,100,111,101,115,32,114,101,99,117,114,115,105,111,110,32,111,110,32,116,104,101,32,67,32,115,116,97,99,107,46>>]},{p,[],[<<78,111,116,101,32,116,104,97,116,32>>,{code,[],[<<76,73,77,73,84,95,77,65,84,67,72>>]},<<32,97,110,100,32>>,{code,[],[<<76,73,77,73,84,95,82,69,67,85,82,83,73,79,78>>]},<<32,99,97,110,32,111,110,108,121,32,114,101,100,117,99,101,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,108,105,109,105,116,115,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,44,32,110,111,116,32,105,110,99,114,101,97,115,101,32,116,104,101,109,46>>]},{a,[{id,<<115,101,99,116,50>>}],[]},{h2,[],[<<67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115>>]},{p,[],[<<65,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,46,32,77,111,115,116,32,99,104,97,114,97,99,116,101,114,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,32,97,110,100,32,109,97,116,99,104,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,115,32,97,32,116,114,105,118,105,97,108,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,112,111,114,116,105,111,110,32,111,102,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,99,97,108,32,116,111,32,105,116,115,101,108,102,58>>]},{pre,[],[{code,[],[<<84,104,101,32,113,117,105,99,107,32,98,114,111,119,110,32,102,111,120>>]}]},{p,[],[<<87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,112,101,99,105,102,105,101,100,32,40,111,112,116,105,111,110,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<41,44,32,108,101,116,116,101,114,115,32,97,114,101,32,109,97,116,99,104,101,100,32,105,110,100,101,112,101,110,100,101,110,116,108,121,32,111,102,32,99,97,115,101,46>>]},{p,[],[<<84,104,101,32,112,111,119,101,114,32,111,102,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,97,98,105,108,105,116,121,32,116,111,32,105,110,99,108,117,100,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,114,101,112,101,116,105,116,105,111,110,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,116,104,101,32,117,115,101,32,111,102,32>>,{em,[],[<<109,101,116,97,99,104,97,114,97,99,116,101,114,115>>]},<<44,32,119,104,105,99,104,32,100,111,32,110,111,116,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,98,117,116,32,105,110,115,116,101,97,100,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,32,105,110,32,115,111,109,101,32,115,112,101,99,105,97,108,32,119,97,121,46>>]},{p,[],[<<84,119,111,32,115,101,116,115,32,111,102,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,101,120,105,115,116,58,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,97,110,121,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,101,120,99,101,112,116,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,79,117,116,115,105,100,101,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,116,104,101,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<92>>]},{dd,[],[<<71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,109,97,110,121,32,117,115,101,115>>]},{dt,[],[<<94>>]},{dd,[],[<<65,115,115,101,114,116,32,115,116,97,114,116,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41>>]},{dt,[],[<<36>>]},{dd,[],[<<65,115,115,101,114,116,32,101,110,100,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41>>]},{dt,[],[<<46>>]},{dd,[],[<<77,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,110,101,119,108,105,110,101,32,40,98,121,32,100,101,102,97,117,108,116,41>>]},{dt,[],[<<91>>]},{dd,[],[<<83,116,97,114,116,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110>>]},{dt,[],[<<124>>]},{dd,[],[<<83,116,97,114,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104>>]},{dt,[],[<<40>>]},{dd,[],[<<83,116,97,114,116,32,115,117,98,112,97,116,116,101,114,110>>]},{dt,[],[<<41>>]},{dd,[],[<<69,110,100,32,115,117,98,112,97,116,116,101,114,110>>]},{dt,[],[<<63>>]},{dd,[],[<<69,120,116,101,110,100,115,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,40,44,32,97,108,115,111,32,48,32,111,114,32,49,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,113,117,97,110,116,105,102,105,101,114,32,109,105,110,105,109,105,122,101,114>>]},{dt,[],[<<42>>]},{dd,[],[<<48,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,115>>]},{dt,[],[<<43>>]},{dd,[],[<<49,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,34,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,34>>]},{dt,[],[<<123>>]},{dd,[],[<<83,116,97,114,116,32,109,105,110,47,109,97,120,32,113,117,97,110,116,105,102,105,101,114>>]}]},{p,[],[<<80,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,32,105,115,32,99,97,108,108,101,100,32,97,32,34,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,34,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,111,110,108,121,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,58>>]},{dl,[],[{dt,[],[<<92>>]},{dd,[],[<<71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<94>>]},{dd,[],[<<78,101,103,97,116,101,32,116,104,101,32,99,108,97,115,115,44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<45>>]},{dd,[],[<<73,110,100,105,99,97,116,101,115,32,99,104,97,114,97,99,116,101,114,32,114,97,110,103,101>>]},{dt,[],[<<91>>]},{dd,[],[<<80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,111,110,108,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,80,111,115,105,120,32,115,121,110,116,97,120,41>>]},{dt,[],[<<93>>]},{dd,[],[<<84,101,114,109,105,110,97,116,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,101,32,117,115,101,32,111,102,32,101,97,99,104,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46>>]},{a,[{id,<<115,101,99,116,51>>}],[]},{h2,[],[<<66,97,99,107,115,108,97,115,104>>]},{p,[],[<<84,104,101,32,98,97,99,107,115,108,97,115,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,109,97,110,121,32,117,115,101,115,46,32,70,105,114,115,116,44,32,105,102,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,110,117,109,98,101,114,32,111,114,32,97,32,108,101,116,116,101,114,44,32,105,116,32,116,97,107,101,115,32,97,119,97,121,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,104,97,118,101,46,32,84,104,105,115,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,97,115,32,97,110,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,108,105,101,115,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,42,32,99,104,97,114,97,99,116,101,114,44,32,121,111,117,32,119,114,105,116,101,32,92,42,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,105,115,32,101,115,99,97,112,105,110,103,32,97,99,116,105,111,110,32,97,112,112,108,105,101,115,32,105,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,119,111,117,108,100,32,111,116,104,101,114,119,105,115,101,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,109,101,116,97,99,104,97,114,97,99,116,101,114,44,32,115,111,32,105,116,32,105,115,32,97,108,119,97,121,115,32,115,97,102,101,32,116,111,32,112,114,101,99,101,100,101,32,97,32,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,119,105,116,104,32,98,97,99,107,115,108,97,115,104,32,116,111,32,115,112,101,99,105,102,121,32,116,104,97,116,32,105,116,32,115,116,97,110,100,115,32,102,111,114,32,105,116,115,101,108,102,46,32,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,119,114,105,116,101,32,92,92,46>>]},{p,[],[<<73,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,109,111,100,101,44,32,111,110,108,121,32,65,83,67,73,73,32,110,117,109,98,101,114,115,32,97,110,100,32,108,101,116,116,101,114,115,32,104,97,118,101,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,97,102,116,101,114,32,97,32,98,97,99,107,115,108,97,115,104,46,32,65,108,108,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,32,112,97,114,116,105,99,117,108,97,114,44,32,116,104,111,115,101,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,62,32,49,50,55,41,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,108,105,116,101,114,97,108,115,46>>]},{p,[],[<<73,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<44,32,119,104,105,116,101,115,112,97,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,40,111,116,104,101,114,32,116,104,97,110,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,41,32,97,110,100,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,97,114,101,32,105,103,110,111,114,101,100,46,32,65,110,32,101,115,99,97,112,105,110,103,32,98,97,99,107,115,108,97,115,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,105,110,99,108,117,100,101,32,97,32,119,104,105,116,101,115,112,97,99,101,32,111,114,32,35,32,99,104,97,114,97,99,116,101,114,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<84,111,32,114,101,109,111,118,101,32,116,104,101,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,102,114,111,109,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,112,117,116,32,116,104,101,109,32,98,101,116,119,101,101,110,32,92,81,32,97,110,100,32,92,69,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,104,97,116,32,36,32,97,110,100,32,64,32,97,114,101,32,104,97,110,100,108,101,100,32,97,115,32,108,105,116,101,114,97,108,115,32,105,110,32,92,81,46,46,46,92,69,32,115,101,113,117,101,110,99,101,115,32,105,110,32,80,67,82,69,44,32,119,104,105,108,101,32,36,32,97,110,100,32,64,32,99,97,117,115,101,32,118,97,114,105,97,98,108,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,105,110,32,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<80,97,116,116,101,114,110,32,32,32,32,32,32,32,32,32,32,32,32,80,67,82,69,32,109,97,116,99,104,101,115,32,32,32,80,101,114,108,32,109,97,116,99,104,101,115,10,10,92,81,97,98,99,36,120,121,122,92,69,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,36,120,121,122,10,92,81,97,98,99,92,36,120,121,122,92,69,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,10,92,81,97,98,99,92,69,92,36,92,81,120,121,122,92,69,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122>>]}]},{p,[],[<<84,104,101,32,92,81,46,46,46,92,69,32,115,101,113,117,101,110,99,101,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,65,110,32,105,115,111,108,97,116,101,100,32,92,69,32,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,92,81,32,105,115,32,105,103,110,111,114,101,100,46,32,73,102,32,92,81,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,92,69,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,116,104,101,32,108,105,116,101,114,97,108,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,99,111,110,116,105,110,117,101,115,32,116,111,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,40,116,104,97,116,32,105,115,44,32,92,69,32,105,115,32,97,115,115,117,109,101,100,32,97,116,32,116,104,101,32,101,110,100,41,46,32,73,102,32,116,104,101,32,105,115,111,108,97,116,101,100,32,92,81,32,105,115,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,105,115,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,44,32,97,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,110,111,116,32,116,101,114,109,105,110,97,116,101,100,46>>]},{p,[],[{em,[],[<<78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115>>]}]},{a,[{id,<<110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115>>}],[]},{p,[],[<<65,32,115,101,99,111,110,100,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,112,114,111,118,105,100,101,115,32,97,32,119,97,121,32,111,102,32,101,110,99,111,100,105,110,103,32,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,112,97,116,116,101,114,110,115,32,105,110,32,97,32,118,105,115,105,98,108,101,32,109,97,110,110,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,32,114,101,115,116,114,105,99,116,105,111,110,32,111,110,32,116,104,101,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,97,112,97,114,116,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,32,122,101,114,111,32,116,104,97,116,32,116,101,114,109,105,110,97,116,101,115,32,97,32,112,97,116,116,101,114,110,46,32,87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,112,97,114,101,100,32,98,121,32,116,101,120,116,32,101,100,105,116,105,110,103,44,32,105,116,32,105,115,32,111,102,116,101,110,32,101,97,115,105,101,114,32,116,111,32,117,115,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,110,32,116,104,101,32,98,105,110,97,114,121,32,99,104,97,114,97,99,116,101,114,32,105,116,32,114,101,112,114,101,115,101,110,116,115,58>>]},{dl,[],[{dt,[],[<<92,97>>]},{dd,[],[<<65,108,97,114,109,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,66,69,76,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,55,41>>]},{dt,[],[<<92,99,120>>]},{dd,[],[<<34,67,111,110,116,114,111,108,45,120,34,44,32,119,104,101,114,101,32,120,32,105,115,32,97,110,121,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,101>>]},{dd,[],[<<69,115,99,97,112,101,32,40,104,101,120,32,49,66,41>>]},{dt,[],[<<92,102>>]},{dd,[],[<<70,111,114,109,32,102,101,101,100,32,40,104,101,120,32,48,67,41>>]},{dt,[],[<<92,110>>]},{dd,[],[<<76,105,110,101,32,102,101,101,100,32,40,104,101,120,32,48,65,41>>]},{dt,[],[<<92,114>>]},{dd,[],[<<67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,104,101,120,32,48,68,41>>]},{dt,[],[<<92,116>>]},{dd,[],[<<84,97,98,32,40,104,101,120,32,48,57,41>>]},{dt,[],[<<92,48,100,100>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,48,100,100>>]},{dt,[],[<<92,100,100,100>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,44,32,111,114,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101>>]},{dt,[],[<<92,111,123,100,100,100,46,46,125>>]},{dd,[],[<<99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,46,46>>]},{dt,[],[<<92,120,104,104>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104>>]},{dt,[],[<<92,120,123,104,104,104,46,46,125>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104,104,46,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,92,48,100,100,32,105,115,32,97,108,119,97,121,115,32,97,110,32,111,99,116,97,108,32,99,111,100,101,44,32,97,110,100,32,116,104,97,116,32,92,56,32,97,110,100,32,92,57,32,97,114,101,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,46>>]}]},{p,[],[<<84,104,101,32,112,114,101,99,105,115,101,32,101,102,102,101,99,116,32,111,102,32,92,99,120,32,111,110,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58,32,105,102,32,120,32,105,115,32,97,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,44,32,105,116,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,117,112,112,101,114,32,99,97,115,101,46,32,84,104,101,110,32,98,105,116,32,54,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,52,48,41,32,105,115,32,105,110,118,101,114,116,101,100,46,32,84,104,117,115,32,92,99,65,32,116,111,32,92,99,90,32,98,101,99,111,109,101,32,104,101,120,32,48,49,32,116,111,32,104,101,120,32,49,65,32,40,65,32,105,115,32,52,49,44,32,90,32,105,115,32,53,65,41,44,32,98,117,116,32,92,99,123,32,98,101,99,111,109,101,115,32,104,101,120,32,51,66,32,40,123,32,105,115,32,55,66,41,44,32,97,110,100,32,92,99,59,32,98,101,99,111,109,101,115,32,104,101,120,32,55,66,32,40,59,32,105,115,32,51,66,41,46,32,73,102,32,116,104,101,32,100,97,116,97,32,105,116,101,109,32,40,98,121,116,101,32,111,114,32,49,54,45,98,105,116,32,118,97,108,117,101,41,32,102,111,108,108,111,119,105,110,103,32,92,99,32,104,97,115,32,97,32,118,97,108,117,101,32,62,32,49,50,55,44,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,84,104,105,115,32,108,111,99,107,115,32,111,117,116,32,110,111,110,45,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,108,108,32,109,111,100,101,115,46>>]},{p,[],[<<84,104,101,32,92,99,32,102,97,99,105,108,105,116,121,32,119,97,115,32,100,101,115,105,103,110,101,100,32,102,111,114,32,117,115,101,32,119,105,116,104,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,44,32,98,117,116,32,119,105,116,104,32,116,104,101,32,101,120,116,101,110,115,105,111,110,32,116,111,32,85,110,105,99,111,100,101,32,105,116,32,105,115,32,101,118,101,110,32,108,101,115,115,32,117,115,101,102,117,108,32,116,104,97,110,32,105,116,32,111,110,99,101,32,119,97,115,46>>]},{p,[],[<<65,102,116,101,114,32,92,48,32,117,112,32,116,111,32,116,119,111,32,102,117,114,116,104,101,114,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,102,101,119,101,114,32,116,104,97,110,32,116,119,111,32,100,105,103,105,116,115,44,32,106,117,115,116,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,112,114,101,115,101,110,116,32,97,114,101,32,117,115,101,100,46,32,84,104,117,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,92,48,92,120,92,48,49,53,32,115,112,101,99,105,102,105,101,115,32,116,119,111,32,98,105,110,97,114,121,32,122,101,114,111,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,67,82,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,118,97,108,117,101,32,49,51,41,46,32,77,97,107,101,32,115,117,114,101,32,121,111,117,32,115,117,112,112,108,121,32,116,119,111,32,100,105,103,105,116,115,32,97,102,116,101,114,32,116,104,101,32,105,110,105,116,105,97,108,32,122,101,114,111,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,102,111,108,108,111,119,115,32,105,115,32,105,116,115,101,108,102,32,97,110,32,111,99,116,97,108,32,100,105,103,105,116,46>>]},{p,[],[<<84,104,101,32,101,115,99,97,112,101,32,92,111,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,111,99,116,97,108,32,100,105,103,105,116,115,44,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,46,32,65,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,105,115,32,97,32,114,101,99,101,110,116,32,97,100,100,105,116,105,111,110,32,116,111,32,80,101,114,108,59,32,105,116,32,112,114,111,118,105,100,101,115,32,119,97,121,32,111,102,32,115,112,101,99,105,102,121,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,111,100,101,32,112,111,105,110,116,115,32,97,115,32,111,99,116,97,108,32,110,117,109,98,101,114,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,48,55,55,55,44,32,97,110,100,32,105,116,32,97,108,115,111,32,97,108,108,111,119,115,32,111,99,116,97,108,32,110,117,109,98,101,114,115,32,97,110,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,98,101,32,117,110,97,109,98,105,103,117,111,117,115,108,121,32,115,112,101,99,105,102,105,101,100,46>>]},{p,[],[<<70,111,114,32,103,114,101,97,116,101,114,32,99,108,97,114,105,116,121,32,97,110,100,32,117,110,97,109,98,105,103,117,105,116,121,44,32,105,116,32,105,115,32,98,101,115,116,32,116,111,32,97,118,111,105,100,32,102,111,108,108,111,119,105,110,103,32,92,32,98,121,32,97,32,100,105,103,105,116,32,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,46,32,73,110,115,116,101,97,100,44,32,117,115,101,32,92,111,123,125,32,111,114,32,92,120,123,125,32,116,111,32,115,112,101,99,105,102,121,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,115,44,32,97,110,100,32,92,103,123,125,32,116,111,32,115,112,101,99,105,102,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,114,97,103,114,97,112,104,115,32,100,101,115,99,114,105,98,101,32,116,104,101,32,111,108,100,44,32,97,109,98,105,103,117,111,117,115,32,115,121,110,116,97,120,46>>]},{p,[],[<<84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,111,116,104,101,114,32,116,104,97,110,32,48,32,105,115,32,99,111,109,112,108,105,99,97,116,101,100,44,32,97,110,100,32,80,101,114,108,32,104,97,115,32,99,104,97,110,103,101,100,32,105,110,32,114,101,99,101,110,116,32,114,101,108,101,97,115,101,115,44,32,99,97,117,115,105,110,103,32,80,67,82,69,32,97,108,115,111,32,116,111,32,99,104,97,110,103,101,46,32,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,80,67,82,69,32,114,101,97,100,115,32,116,104,101,32,100,105,103,105,116,32,97,110,100,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,100,105,103,105,116,115,32,97,115,32,97,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,105,115,32,60,32,56,44,32,111,114,32,105,102,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,97,116,32,108,101,97,115,116,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32>>,{em,[],[<<98,97,99,107,32,114,101,102,101,114,101,110,99,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,104,111,119,32,116,104,105,115,32,119,111,114,107,115,32,105,115,32,112,114,111,118,105,100,101,100,32,108,97,116,101,114,44,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46>>]},{p,[],[<<73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,92,32,105,115,32,62,32,55,32,97,110,100,32,116,104,101,114,101,32,104,97,118,101,32,110,111,116,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,80,67,82,69,32,104,97,110,100,108,101,115,32,92,56,32,97,110,100,32,92,57,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,44,32,97,110,100,32,111,116,104,101,114,119,105,115,101,32,114,101,45,114,101,97,100,115,32,117,112,32,116,111,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,44,32,97,110,100,32,117,115,105,110,103,32,116,104,101,109,32,116,111,32,103,101,110,101,114,97,116,101,32,97,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,46,32,65,110,121,32,115,117,98,115,101,113,117,101,110,116,32,100,105,103,105,116,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{dl,[],[{dt,[],[<<92,48,52,48>>]},{dd,[],[<<65,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,110,32,65,83,67,73,73,32,115,112,97,99,101>>]},{dt,[],[<<92,52,48>>]},{dd,[],[<<84,104,101,32,115,97,109,101,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,97,114,101,32,60,32,52,48,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115>>]},{dt,[],[<<92,55>>]},{dd,[],[<<65,108,119,97,121,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101>>]},{dt,[],[<<92,49,49>>]},{dd,[],[<<67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,32,116,97,98>>]},{dt,[],[<<92,48,49,49>>]},{dd,[],[<<65,108,119,97,121,115,32,97,32,116,97,98>>]},{dt,[],[<<92,48,49,49,51>>]},{dd,[],[<<65,32,116,97,98,32,102,111,108,108,111,119,101,100,32,98,121,32,99,104,97,114,97,99,116,101,114,32,34,51,34>>]},{dt,[],[<<92,49,49,51>>]},{dd,[],[<<67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,49,49,51>>]},{dt,[],[<<92,51,55,55>>]},{dd,[],[<<67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,118,97,108,117,101,32,50,53,53,32,40,100,101,99,105,109,97,108,41>>]},{dt,[],[<<92,56,49>>]},{dd,[],[<<69,105,116,104,101,114,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,116,104,101,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,49,34>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,111,99,116,97,108,32,118,97,108,117,101,115,32,62,61,32,49,48,48,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,98,121,32,97,32,108,101,97,100,105,110,103,32,122,101,114,111,44,32,97,115,32,110,111,32,109,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,101,118,101,114,32,114,101,97,100,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,97,102,116,101,114,32,92,120,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,123,44,32,102,114,111,109,32,122,101,114,111,32,116,111,32,116,119,111,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,32,40,108,101,116,116,101,114,115,32,99,97,110,32,98,101,32,105,110,32,117,112,112,101,114,32,111,114,32,108,111,119,101,114,32,99,97,115,101,41,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,32,109,97,121,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,92,120,123,32,97,110,100,32,125,46,32,73,102,32,97,32,99,104,97,114,97,99,116,101,114,32,111,116,104,101,114,32,116,104,97,110,32,97,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,32,97,112,112,101,97,114,115,32,98,101,116,119,101,101,110,32,92,120,123,32,97,110,100,32,125,44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,116,101,114,109,105,110,97,116,105,110,103,32,125,44,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>]},{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,118,97,108,117,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,50,53,54,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,121,32,101,105,116,104,101,114,32,111,102,32,116,104,101,32,116,119,111,32,115,121,110,116,97,120,101,115,32,102,111,114,32,92,120,46,32,84,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,119,97,121,32,116,104,101,121,32,97,114,101,32,104,97,110,100,108,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,120,100,99,32,105,115,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,92,120,123,100,99,125,46>>]},{p,[],[{em,[],[<<67,111,110,115,116,114,97,105,110,116,115,32,111,110,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115>>]}]},{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,110,117,109,98,101,114,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,99,101,114,116,97,105,110,32,118,97,108,117,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<56,45,98,105,116,32,110,111,110,45,85,84,70,32,109,111,100,101>>]},{dd,[],[{p,[],[<<60,32,48,120,49,48,48>>]}]},{dt,[],[<<56,45,98,105,116,32,85,84,70,45,56,32,109,111,100,101>>]},{dd,[],[{p,[],[<<60,32,48,120,49,48,102,102,102,102,32,97,110,100,32,97,32,118,97,108,105,100,32,99,111,100,101,112,111,105,110,116>>]}]}]},{p,[],[<<73,110,118,97,108,105,100,32,85,110,105,99,111,100,101,32,99,111,100,101,112,111,105,110,116,115,32,97,114,101,32,116,104,101,32,114,97,110,103,101,32,48,120,100,56,48,48,32,116,111,32,48,120,100,102,102,102,32,40,116,104,101,32,115,111,45,99,97,108,108,101,100,32,34,115,117,114,114,111,103,97,116,101,34,32,99,111,100,101,112,111,105,110,116,115,41,44,32,97,110,100,32,48,120,102,102,101,102,46>>]},{p,[],[{em,[],[<<69,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115>>]}]},{p,[],[<<65,108,108,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,100,101,102,105,110,101,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,32,99,97,110,32,98,101,32,117,115,101,100,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,65,108,115,111,44,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,92,98,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,56,41,46>>]},{p,[],[<<92,78,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,92,66,44,32,92,82,44,32,97,110,100,32,92,88,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46,32,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,115,46>>]},{p,[],[{em,[],[<<85,110,115,117,112,112,111,114,116,101,100,32,69,115,99,97,112,101,32,83,101,113,117,101,110,99,101,115>>]}]},{p,[],[<<73,110,32,80,101,114,108,44,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,92,108,44,32,92,76,44,32,92,117,44,32,97,110,100,32,92,85,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,105,116,115,32,115,116,114,105,110,103,32,104,97,110,100,108,101,114,32,97,110,100,32,117,115,101,100,32,116,111,32,109,111,100,105,102,121,32,116,104,101,32,99,97,115,101,32,111,102,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46>>]},{p,[],[{em,[],[<<65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]}]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,32,92,103,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,117,110,115,105,103,110,101,100,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,44,32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,97,109,101,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,99,111,100,101,100,32,97,115,32,92,103,123,110,97,109,101,125,46,32,66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,32,108,97,116,101,114,44,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46>>]},{p,[],[{em,[],[<<65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,83,117,98,114,111,117,116,105,110,101,32,67,97,108,108,115>>]}]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,92,103,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,32,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,32,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,34,115,117,98,114,111,117,116,105,110,101,34,46,32,68,101,116,97,105,108,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,32,108,97,116,101,114,46,32,78,111,116,105,99,101,32,116,104,97,116,32,92,103,123,46,46,46,125,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,92,103,60,46,46,46,62,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,97,110,100,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46>>]},{p,[],[{em,[],[<<71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115>>]}]},{a,[{id,<<103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115>>}],[]},{p,[],[<<65,110,111,116,104,101,114,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,103,101,110,101,114,105,99,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,58>>]},{dl,[],[{dt,[],[<<92,100>>]},{dd,[],[<<65,110,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116>>]},{dt,[],[<<92,68>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,100,101,99,105,109,97,108,32,100,105,103,105,116>>]},{dt,[],[<<92,104>>]},{dd,[],[<<65,110,121,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,72>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,115>>]},{dd,[],[<<65,110,121,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,83>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,118>>]},{dd,[],[<<65,110,121,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,86>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,119>>]},{dd,[],[<<65,110,121,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,87>>]},{dd,[],[<<65,110,121,32,34,110,111,110,45,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114>>]}]},{p,[],[<<84,104,101,114,101,32,105,115,32,97,108,115,111,32,116,104,101,32,115,105,110,103,108,101,32,115,101,113,117,101,110,99,101,32,92,78,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,110,111,110,45,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,34,46,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,105,115,32,110,111,116,32,115,101,116,46,32,80,101,114,108,32,97,108,115,111,32,117,115,101,115,32,92,78,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46>>]},{p,[],[<<69,97,99,104,32,112,97,105,114,32,111,102,32,108,111,119,101,114,99,97,115,101,32,97,110,100,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,112,97,114,116,105,116,105,111,110,115,32,116,104,101,32,99,111,109,112,108,101,116,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,116,119,111,32,100,105,115,106,111,105,110,116,32,115,101,116,115,46,32,65,110,121,32,103,105,118,101,110,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,111,110,101,44,32,97,110,100,32,111,110,108,121,32,111,110,101,44,32,111,102,32,101,97,99,104,32,112,97,105,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,97,112,112,101,97,114,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,101,121,32,101,97,99,104,32,109,97,116,99,104,32,111,110,101,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,116,121,112,101,46,32,73,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,108,32,102,97,105,108,44,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111,32,99,104,97,114,97,99,116,101,114,32,116,111,32,109,97,116,99,104,46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,92,115,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,49,49,41,44,32,119,104,105,99,104,32,109,97,100,101,32,105,116,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,116,104,101,32,80,79,83,73,88,32,34,115,112,97,99,101,34,32,99,108,97,115,115,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,97,100,100,101,100,32,86,84,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,115,117,105,116,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,84,104,101,32,100,101,102,97,117,108,116,32,92,115,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,119,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,32,97,110,100,32,115,112,97,99,101,32,40,51,50,41,44,32,119,104,105,99,104,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,32,105,110,32,116,104,101,32,34,67,34,32,108,111,99,97,108,101,46,32,84,104,105,115,32,108,105,115,116,32,109,97,121,32,118,97,114,121,32,105,102,32,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,115,111,109,101,32,108,111,99,97,108,101,115,32,116,104,101,32,34,110,111,110,45,98,114,101,97,107,105,110,103,32,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,32,40,92,120,65,48,41,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,44,32,97,110,100,32,105,110,32,111,116,104,101,114,115,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,46>>]},{p,[],[<<65,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,117,110,100,101,114,115,99,111,114,101,32,111,114,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,97,32,108,101,116,116,101,114,32,111,114,32,97,32,100,105,103,105,116,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,108,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115,32,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,32,80,67,82,69,32,108,111,119,45,118,97,108,117,101,100,32,99,104,97,114,97,99,116,101,114,32,116,97,98,108,101,115,44,32,105,110,32,69,114,108,97,110,103,39,115,32,99,97,115,101,32,40,97,110,100,32,119,105,116,104,111,117,116,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<41,44,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,105,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,111,117,116,115,105,100,101,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,44,32,110,101,118,101,114,32,109,97,116,99,104,32,92,100,44,32,92,115,44,32,111,114,32,92,119,44,32,97,110,100,32,97,108,119,97,121,115,32,109,97,116,99,104,32,92,68,44,32,92,83,44,32,97,110,100,32,92,87,46,32,84,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,114,101,116,97,105,110,32,116,104,101,105,114,32,111,114,105,103,105,110,97,108,32,109,101,97,110,105,110,103,115,32,102,114,111,109,32,98,101,102,111,114,101,32,85,84,70,32,115,117,112,112,111,114,116,32,119,97,115,32,97,118,97,105,108,97,98,108,101,44,32,109,97,105,110,108,121,32,102,111,114,32,101,102,102,105,99,105,101,110,99,121,32,114,101,97,115,111,110,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<92,100>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,92,112,123,78,100,125,32,109,97,116,99,104,101,115,32,40,100,101,99,105,109,97,108,32,100,105,103,105,116,41>>]},{dt,[],[<<92,115>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,92,112,123,90,125,32,111,114,32,92,104,32,111,114,32,92,118>>]},{dt,[],[<<92,119>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,109,97,116,99,104,101,115,32,92,112,123,76,125,32,111,114,32,92,112,123,78,125,32,109,97,116,99,104,101,115,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101>>]}]},{p,[],[<<84,104,101,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,115,32,109,97,116,99,104,32,116,104,101,32,105,110,118,101,114,115,101,32,115,101,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,92,100,32,109,97,116,99,104,101,115,32,111,110,108,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,44,32,119,104,105,108,101,32,92,119,32,109,97,116,99,104,101,115,32,97,110,121,32,85,110,105,99,111,100,101,32,100,105,103,105,116,44,32,97,110,121,32,85,110,105,99,111,100,101,32,108,101,116,116,101,114,44,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,46,32,78,111,116,105,99,101,32,97,108,115,111,32,116,104,97,116,32>>,{code,[],[<<117,99,112>>]},<<32,97,102,102,101,99,116,115,32,92,98,32,97,110,100,32,92,66,44,32,97,115,32,116,104,101,121,32,97,114,101,32,100,101,102,105,110,101,100,32,105,110,32,116,101,114,109,115,32,111,102,32,92,119,32,97,110,100,32,92,87,46,32,77,97,116,99,104,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,105,99,101,97,98,108,121,32,115,108,111,119,101,114,32,119,104,101,110,32>>,{code,[],[<<117,99,112>>]},<<32,105,115,32,115,101,116,46>>]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,115,32,92,104,44,32,92,72,44,32,92,118,44,32,97,110,100,32,92,86,32,97,114,101,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,119,101,114,101,32,97,100,100,101,100,32,116,111,32,80,101,114,108,32,105,110,32,114,101,108,101,97,115,101,32,53,46,49,48,46,32,73,110,32,99,111,110,116,114,97,115,116,32,116,111,32,116,104,101,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,119,104,105,99,104,32,109,97,116,99,104,32,111,110,108,121,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,115,101,32,97,108,119,97,121,115,32,109,97,116,99,104,32,99,101,114,116,97,105,110,32,104,105,103,104,45,118,97,108,117,101,100,32,99,111,100,101,32,112,111,105,110,116,115,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32>>,{code,[],[<<117,99,112>>]},<<32,105,115,32,115,101,116,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,104,111,114,105,122,111,110,116,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58>>]},{dl,[],[{dt,[],[<<85,43,48,48,48,57>>]},{dd,[],[<<72,111,114,105,122,111,110,116,97,108,32,116,97,98,32,40,72,84,41>>]},{dt,[],[<<85,43,48,48,50,48>>]},{dd,[],[<<83,112,97,99,101>>]},{dt,[],[<<85,43,48,48,65,48>>]},{dd,[],[<<78,111,110,45,98,114,101,97,107,32,115,112,97,99,101>>]},{dt,[],[<<85,43,49,54,56,48>>]},{dd,[],[<<79,103,104,97,109,32,115,112,97,99,101,32,109,97,114,107>>]},{dt,[],[<<85,43,49,56,48,69>>]},{dd,[],[<<77,111,110,103,111,108,105,97,110,32,118,111,119,101,108,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<85,43,50,48,48,48>>]},{dd,[],[<<69,110,32,113,117,97,100>>]},{dt,[],[<<85,43,50,48,48,49>>]},{dd,[],[<<69,109,32,113,117,97,100>>]},{dt,[],[<<85,43,50,48,48,50>>]},{dd,[],[<<69,110,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,51>>]},{dd,[],[<<69,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,52>>]},{dd,[],[<<84,104,114,101,101,45,112,101,114,45,101,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,53>>]},{dd,[],[<<70,111,117,114,45,112,101,114,45,101,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,54>>]},{dd,[],[<<83,105,120,45,112,101,114,45,101,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,55>>]},{dd,[],[<<70,105,103,117,114,101,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,56>>]},{dd,[],[<<80,117,110,99,116,117,97,116,105,111,110,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,57>>]},{dd,[],[<<84,104,105,110,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,65>>]},{dd,[],[<<72,97,105,114,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,50,70>>]},{dd,[],[<<78,97,114,114,111,119,32,110,111,45,98,114,101,97,107,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,53,70>>]},{dd,[],[<<77,101,100,105,117,109,32,109,97,116,104,101,109,97,116,105,99,97,108,32,115,112,97,99,101>>]},{dt,[],[<<85,43,51,48,48,48>>]},{dd,[],[<<73,100,101,111,103,114,97,112,104,105,99,32,115,112,97,99,101>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,118,101,114,116,105,99,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58>>]},{dl,[],[{dt,[],[<<85,43,48,48,48,65>>]},{dd,[],[<<76,105,110,101,32,102,101,101,100,32,40,76,70,41>>]},{dt,[],[<<85,43,48,48,48,66>>]},{dd,[],[<<86,101,114,116,105,99,97,108,32,116,97,98,32,40,86,84,41>>]},{dt,[],[<<85,43,48,48,48,67>>]},{dd,[],[<<70,111,114,109,32,102,101,101,100,32,40,70,70,41>>]},{dt,[],[<<85,43,48,48,48,68>>]},{dd,[],[<<67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,67,82,41>>]},{dt,[],[<<85,43,48,48,56,53>>]},{dd,[],[<<78,101,120,116,32,108,105,110,101,32,40,78,69,76,41>>]},{dt,[],[<<85,43,50,48,50,56>>]},{dd,[],[<<76,105,110,101,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<85,43,50,48,50,57>>]},{dd,[],[<<80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114>>]}]},{p,[],[<<73,110,32,56,45,98,105,116,44,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,111,110,108,121,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,32,112,111,105,110,116,115,32,60,32,50,53,54,32,97,114,101,32,114,101,108,101,118,97,110,116,46>>]},{p,[],[{em,[],[<<78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115>>]}]},{a,[{id,<<110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115>>}],[]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,82,32,109,97,116,99,104,101,115,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,46,32,73,110,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,92,82,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{pre,[],[{code,[],[<<40,63,62,92,114,92,110,124,92,110,124,92,120,48,98,124,92,102,124,92,114,124,92,120,56,53,41>>]}]},{p,[],[<<84,104,105,115,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,97,110,32,34,97,116,111,109,105,99,32,103,114,111,117,112,34,44,32,100,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46>>]},{p,[],[<<84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,103,114,111,117,112,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,32,102,111,108,108,111,119,101,100,32,98,121,32,76,70,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,115,32,76,70,32,40,108,105,110,101,32,102,101,101,100,44,32,85,43,48,48,48,65,41,44,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,32,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,85,43,48,48,48,68,41,44,32,111,114,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,46,32,84,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,117,110,105,116,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,115,112,108,105,116,46>>]},{p,[],[<<73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,116,119,111,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,62,32,50,53,53,32,97,114,101,32,97,100,100,101,100,58,32,76,83,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,32,105,115,32,110,111,116,32,110,101,101,100,101,100,32,102,111,114,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46>>]},{p,[],[<<92,82,32,99,97,110,32,98,101,32,114,101,115,116,114,105,99,116,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,40,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,99,111,109,112,108,101,116,101,32,115,101,116,32,111,102,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,41,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<98,115,114,95,97,110,121,99,114,108,102>>]},<<32,101,105,116,104,101,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,46,32,40,66,83,82,32,105,115,32,97,110,32,97,99,114,111,110,121,109,32,102,111,114,32,34,98,97,99,107,115,108,97,115,104,32,82,34,46,41,32,84,104,105,115,32,99,97,110,32,98,101,32,109,97,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,119,104,101,110,32,80,67,82,69,32,105,115,32,98,117,105,108,116,59,32,105,102,32,115,111,44,32,116,104,101,32,111,116,104,101,114,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,114,101,113,117,101,115,116,101,100,32,116,104,114,111,117,103,104,32,111,112,116,105,111,110,32>>,{code,[],[<<98,115,114,95,117,110,105,99,111,100,101>>]},<<46,32,84,104,101,115,101,32,115,101,116,116,105,110,103,115,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,113,117,101,110,99,101,115,58>>]},{dl,[],[{dt,[],[<<40,42,66,83,82,95,65,78,89,67,82,76,70,41>>]},{dd,[],[<<67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,111,110,108,121>>]},{dt,[],[<<40,42,66,83,82,95,85,78,73,67,79,68,69,41>>]},{dd,[],[<<65,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101>>]}]},{p,[],[<<84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,101,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,44,32,98,117,116,32,116,104,101,121,32,99,97,110,32,116,104,101,109,115,101,108,118,101,115,32,98,101,32,111,118,101,114,114,105,100,100,101,110,32,98,121,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,97,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,116,116,105,110,103,115,44,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,97,116,32,116,104,101,121,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,32,99,97,115,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,59,32,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,99,97,110,32,115,116,97,114,116,32,119,105,116,104,58>>]},{pre,[],[{code,[],[<<40,42,65,78,89,41,40,42,66,83,82,95,65,78,89,67,82,76,70,41>>]}]},{p,[],[<<84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,40,42,85,84,70,56,41,44,32,40,42,85,84,70,41,44,32,111,114,32,40,42,85,67,80,41,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,115,46,32,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,92,82,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,44,32,97,110,100,32,115,111,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,32,34,82,34,32,98,121,32,100,101,102,97,117,108,116,46>>]},{p,[],[{em,[],[<<85,110,105,99,111,100,101,32,67,104,97,114,97,99,116,101,114,32,80,114,111,112,101,114,116,105,101,115>>]}]},{p,[],[<<84,104,114,101,101,32,109,111,114,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,115,112,101,99,105,102,105,99,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,97,118,97,105,108,97,98,108,101,46,32,87,104,101,110,32,105,110,32,56,45,98,105,116,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,101,115,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,60,32,50,53,54,44,32,98,117,116,32,116,104,101,121,32,100,111,32,119,111,114,107,32,105,110,32,116,104,105,115,32,109,111,100,101,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,101,120,116,114,97,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,58>>]},{dl,[],[{dt,[],[<<92,112,123>>,{em,[],[<<120,120>>]},<<125>>]},{dd,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,112,114,111,112,101,114,116,121,32>>,{em,[],[<<120,120>>]}]},{dt,[],[<<92,80,123>>,{em,[],[<<120,120>>]},<<125>>]},{dd,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,112,114,111,112,101,114,116,121,32>>,{em,[],[<<120,120>>]}]},{dt,[],[<<92,88>>]},{dd,[],[<<65,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114>>]}]},{p,[],[<<84,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32>>,{em,[],[<<120,120>>]},<<32,97,98,111,118,101,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,85,110,105,99,111,100,101,32,115,99,114,105,112,116,32,110,97,109,101,115,44,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,44,32,34,65,110,121,34,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,40,105,110,99,108,117,100,105,110,103,32,110,101,119,108,105,110,101,41,44,32,97,110,100,32,115,111,109,101,32,115,112,101,99,105,97,108,32,80,67,82,69,32,112,114,111,112,101,114,116,105,101,115,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,46,32,79,116,104,101,114,32,80,101,114,108,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,34,73,110,77,117,115,105,99,97,108,83,121,109,98,111,108,115,34,44,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,78,111,116,105,99,101,32,116,104,97,116,32,92,80,123,65,110,121,125,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,97,108,119,97,121,115,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46>>]},{p,[],[<<83,101,116,115,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,98,101,108,111,110,103,105,110,103,32,116,111,32,99,101,114,116,97,105,110,32,115,99,114,105,112,116,115,46,32,65,32,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,101,116,115,32,99,97,110,32,98,101,32,109,97,116,99,104,101,100,32,117,115,105,110,103,32,97,32,115,99,114,105,112,116,32,110,97,109,101,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<92,112,123,71,114,101,101,107,125,32,92,80,123,72,97,110,125>>]}]},{p,[],[<<84,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,97,110,32,105,100,101,110,116,105,102,105,101,100,32,115,99,114,105,112,116,32,97,114,101,32,108,117,109,112,101,100,32,116,111,103,101,116,104,101,114,32,97,115,32,34,67,111,109,109,111,110,34,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,105,115,116,32,111,102,32,115,99,114,105,112,116,115,58>>]},{ul,[],[{li,[],[<<65,114,97,98,105,99>>]},{li,[],[<<65,114,109,101,110,105,97,110>>]},{li,[],[<<65,118,101,115,116,97,110>>]},{li,[],[<<66,97,108,105,110,101,115,101>>]},{li,[],[<<66,97,109,117,109>>]},{li,[],[<<66,97,115,115,97,95,86,97,104>>]},{li,[],[<<66,97,116,97,107>>]},{li,[],[<<66,101,110,103,97,108,105>>]},{li,[],[<<66,111,112,111,109,111,102,111>>]},{li,[],[<<66,114,97,105,108,108,101>>]},{li,[],[<<66,117,103,105,110,101,115,101>>]},{li,[],[<<66,117,104,105,100>>]},{li,[],[<<67,97,110,97,100,105,97,110,95,65,98,111,114,105,103,105,110,97,108>>]},{li,[],[<<67,97,114,105,97,110>>]},{li,[],[<<67,97,117,99,97,115,105,97,110,95,65,108,98,97,110,105,97,110>>]},{li,[],[<<67,104,97,107,109,97>>]},{li,[],[<<67,104,97,109>>]},{li,[],[<<67,104,101,114,111,107,101,101>>]},{li,[],[<<67,111,109,109,111,110>>]},{li,[],[<<67,111,112,116,105,99>>]},{li,[],[<<67,117,110,101,105,102,111,114,109>>]},{li,[],[<<67,121,112,114,105,111,116>>]},{li,[],[<<67,121,114,105,108,108,105,99>>]},{li,[],[<<68,101,115,101,114,101,116>>]},{li,[],[<<68,101,118,97,110,97,103,97,114,105>>]},{li,[],[<<68,117,112,108,111,121,97,110>>]},{li,[],[<<69,103,121,112,116,105,97,110,95,72,105,101,114,111,103,108,121,112,104,115>>]},{li,[],[<<69,108,98,97,115,97,110>>]},{li,[],[<<69,116,104,105,111,112,105,99>>]},{li,[],[<<71,101,111,114,103,105,97,110>>]},{li,[],[<<71,108,97,103,111,108,105,116,105,99>>]},{li,[],[<<71,111,116,104,105,99>>]},{li,[],[<<71,114,97,110,116,104,97>>]},{li,[],[<<71,114,101,101,107>>]},{li,[],[<<71,117,106,97,114,97,116,105>>]},{li,[],[<<71,117,114,109,117,107,104,105>>]},{li,[],[<<72,97,110>>]},{li,[],[<<72,97,110,103,117,108>>]},{li,[],[<<72,97,110,117,110,111,111>>]},{li,[],[<<72,101,98,114,101,119>>]},{li,[],[<<72,105,114,97,103,97,110,97>>]},{li,[],[<<73,109,112,101,114,105,97,108,95,65,114,97,109,97,105,99>>]},{li,[],[<<73,110,104,101,114,105,116,101,100>>]},{li,[],[<<73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,104,108,97,118,105>>]},{li,[],[<<73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,114,116,104,105,97,110>>]},{li,[],[<<74,97,118,97,110,101,115,101>>]},{li,[],[<<75,97,105,116,104,105>>]},{li,[],[<<75,97,110,110,97,100,97>>]},{li,[],[<<75,97,116,97,107,97,110,97>>]},{li,[],[<<75,97,121,97,104,95,76,105>>]},{li,[],[<<75,104,97,114,111,115,104,116,104,105>>]},{li,[],[<<75,104,109,101,114>>]},{li,[],[<<75,104,111,106,107,105>>]},{li,[],[<<75,104,117,100,97,119,97,100,105>>]},{li,[],[<<76,97,111>>]},{li,[],[<<76,97,116,105,110>>]},{li,[],[<<76,101,112,99,104,97>>]},{li,[],[<<76,105,109,98,117>>]},{li,[],[<<76,105,110,101,97,114,95,65>>]},{li,[],[<<76,105,110,101,97,114,95,66>>]},{li,[],[<<76,105,115,117>>]},{li,[],[<<76,121,99,105,97,110>>]},{li,[],[<<76,121,100,105,97,110>>]},{li,[],[<<77,97,104,97,106,97,110,105>>]},{li,[],[<<77,97,108,97,121,97,108,97,109>>]},{li,[],[<<77,97,110,100,97,105,99>>]},{li,[],[<<77,97,110,105,99,104,97,101,97,110>>]},{li,[],[<<77,101,101,116,101,105,95,77,97,121,101,107>>]},{li,[],[<<77,101,110,100,101,95,75,105,107,97,107,117,105>>]},{li,[],[<<77,101,114,111,105,116,105,99,95,67,117,114,115,105,118,101>>]},{li,[],[<<77,101,114,111,105,116,105,99,95,72,105,101,114,111,103,108,121,112,104,115>>]},{li,[],[<<77,105,97,111>>]},{li,[],[<<77,111,100,105>>]},{li,[],[<<77,111,110,103,111,108,105,97,110>>]},{li,[],[<<77,114,111>>]},{li,[],[<<77,121,97,110,109,97,114>>]},{li,[],[<<78,97,98,97,116,97,101,97,110>>]},{li,[],[<<78,101,119,95,84,97,105,95,76,117,101>>]},{li,[],[<<78,107,111>>]},{li,[],[<<79,103,104,97,109>>]},{li,[],[<<79,108,95,67,104,105,107,105>>]},{li,[],[<<79,108,100,95,73,116,97,108,105,99>>]},{li,[],[<<79,108,100,95,78,111,114,116,104,95,65,114,97,98,105,97,110>>]},{li,[],[<<79,108,100,95,80,101,114,109,105,99>>]},{li,[],[<<79,108,100,95,80,101,114,115,105,97,110>>]},{li,[],[<<79,114,105,121,97>>]},{li,[],[<<79,108,100,95,83,111,117,116,104,95,65,114,97,98,105,97,110>>]},{li,[],[<<79,108,100,95,84,117,114,107,105,99>>]},{li,[],[<<79,115,109,97,110,121,97>>]},{li,[],[<<80,97,104,97,119,104,95,72,109,111,110,103>>]},{li,[],[<<80,97,108,109,121,114,101,110,101>>]},{li,[],[<<80,97,117,95,67,105,110,95,72,97,117>>]},{li,[],[<<80,104,97,103,115,95,80,97>>]},{li,[],[<<80,104,111,101,110,105,99,105,97,110>>]},{li,[],[<<80,115,97,108,116,101,114,95,80,97,104,108,97,118,105>>]},{li,[],[<<82,101,106,97,110,103>>]},{li,[],[<<82,117,110,105,99>>]},{li,[],[<<83,97,109,97,114,105,116,97,110>>]},{li,[],[<<83,97,117,114,97,115,104,116,114,97>>]},{li,[],[<<83,104,97,114,97,100,97>>]},{li,[],[<<83,104,97,118,105,97,110>>]},{li,[],[<<83,105,100,100,104,97,109>>]},{li,[],[<<83,105,110,104,97,108,97>>]},{li,[],[<<83,111,114,97,95,83,111,109,112,101,110,103>>]},{li,[],[<<83,117,110,100,97,110,101,115,101>>]},{li,[],[<<83,121,108,111,116,105,95,78,97,103,114,105>>]},{li,[],[<<83,121,114,105,97,99>>]},{li,[],[<<84,97,103,97,108,111,103>>]},{li,[],[<<84,97,103,98,97,110,119,97>>]},{li,[],[<<84,97,105,95,76,101>>]},{li,[],[<<84,97,105,95,84,104,97,109>>]},{li,[],[<<84,97,105,95,86,105,101,116>>]},{li,[],[<<84,97,107,114,105>>]},{li,[],[<<84,97,109,105,108>>]},{li,[],[<<84,101,108,117,103,117>>]},{li,[],[<<84,104,97,97,110,97>>]},{li,[],[<<84,104,97,105>>]},{li,[],[<<84,105,98,101,116,97,110>>]},{li,[],[<<84,105,102,105,110,97,103,104>>]},{li,[],[<<84,105,114,104,117,116,97>>]},{li,[],[<<85,103,97,114,105,116,105,99>>]},{li,[],[<<86,97,105>>]},{li,[],[<<87,97,114,97,110,103,95,67,105,116,105>>]},{li,[],[<<89,105>>]}]},{p,[],[<<69,97,99,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,101,120,97,99,116,108,121,32,111,110,101,32,85,110,105,99,111,100,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,44,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,32,116,119,111,45,108,101,116,116,101,114,32,97,99,114,111,110,121,109,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,110,101,103,97,116,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,105,110,99,108,117,100,105,110,103,32,97,32,99,105,114,99,117,109,102,108,101,120,32,98,101,116,119,101,101,110,32,116,104,101,32,111,112,101,110,105,110,103,32,98,114,97,99,101,32,97,110,100,32,116,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,112,123,94,76,117,125,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,92,80,123,76,117,125,46>>]},{p,[],[<<73,102,32,111,110,108,121,32,111,110,101,32,108,101,116,116,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,32,92,112,32,111,114,32,92,80,44,32,105,116,32,105,110,99,108,117,100,101,115,32,97,108,108,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,32,116,104,97,116,32,115,116,97,114,116,32,119,105,116,104,32,116,104,97,116,32,108,101,116,116,101,114,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,105,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,110,101,103,97,116,105,111,110,44,32,116,104,101,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,105,110,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,97,114,101,32,111,112,116,105,111,110,97,108,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,119,111,32,101,120,97,109,112,108,101,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,58>>]},{pre,[],[{code,[],[<<92,112,123,76,125,10,92,112,76>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,32,99,111,100,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,58>>]},{dl,[],[{dt,[],[<<67>>]},{dd,[],[<<79,116,104,101,114>>]},{dt,[],[<<67,99>>]},{dd,[],[<<67,111,110,116,114,111,108>>]},{dt,[],[<<67,102>>]},{dd,[],[<<70,111,114,109,97,116>>]},{dt,[],[<<67,110>>]},{dd,[],[<<85,110,97,115,115,105,103,110,101,100>>]},{dt,[],[<<67,111>>]},{dd,[],[<<80,114,105,118,97,116,101,32,117,115,101>>]},{dt,[],[<<67,115>>]},{dd,[],[<<83,117,114,114,111,103,97,116,101>>]},{dt,[],[<<76>>]},{dd,[],[<<76,101,116,116,101,114>>]},{dt,[],[<<76,108>>]},{dd,[],[<<76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114>>]},{dt,[],[<<76,109>>]},{dd,[],[<<77,111,100,105,102,105,101,114,32,108,101,116,116,101,114>>]},{dt,[],[<<76,111>>]},{dd,[],[<<79,116,104,101,114,32,108,101,116,116,101,114>>]},{dt,[],[<<76,116>>]},{dd,[],[<<84,105,116,108,101,32,99,97,115,101,32,108,101,116,116,101,114>>]},{dt,[],[<<76,117>>]},{dd,[],[<<85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114>>]},{dt,[],[<<77>>]},{dd,[],[<<77,97,114,107>>]},{dt,[],[<<77,99>>]},{dd,[],[<<83,112,97,99,105,110,103,32,109,97,114,107>>]},{dt,[],[<<77,101>>]},{dd,[],[<<69,110,99,108,111,115,105,110,103,32,109,97,114,107>>]},{dt,[],[<<77,110>>]},{dd,[],[<<78,111,110,45,115,112,97,99,105,110,103,32,109,97,114,107>>]},{dt,[],[<<78>>]},{dd,[],[<<78,117,109,98,101,114>>]},{dt,[],[<<78,100>>]},{dd,[],[<<68,101,99,105,109,97,108,32,110,117,109,98,101,114>>]},{dt,[],[<<78,108>>]},{dd,[],[<<76,101,116,116,101,114,32,110,117,109,98,101,114>>]},{dt,[],[<<78,111>>]},{dd,[],[<<79,116,104,101,114,32,110,117,109,98,101,114>>]},{dt,[],[<<80>>]},{dd,[],[<<80,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,99>>]},{dd,[],[<<67,111,110,110,101,99,116,111,114,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,100>>]},{dd,[],[<<68,97,115,104,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,101>>]},{dd,[],[<<67,108,111,115,101,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,102>>]},{dd,[],[<<70,105,110,97,108,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,105>>]},{dd,[],[<<73,110,105,116,105,97,108,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,111>>]},{dd,[],[<<79,116,104,101,114,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,115>>]},{dd,[],[<<79,112,101,110,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<83>>]},{dd,[],[<<83,121,109,98,111,108>>]},{dt,[],[<<83,99>>]},{dd,[],[<<67,117,114,114,101,110,99,121,32,115,121,109,98,111,108>>]},{dt,[],[<<83,107>>]},{dd,[],[<<77,111,100,105,102,105,101,114,32,115,121,109,98,111,108>>]},{dt,[],[<<83,109>>]},{dd,[],[<<77,97,116,104,101,109,97,116,105,99,97,108,32,115,121,109,98,111,108>>]},{dt,[],[<<83,111>>]},{dd,[],[<<79,116,104,101,114,32,115,121,109,98,111,108>>]},{dt,[],[<<90>>]},{dd,[],[<<83,101,112,97,114,97,116,111,114>>]},{dt,[],[<<90,108>>]},{dd,[],[<<76,105,110,101,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<90,112>>]},{dd,[],[<<80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<90,115>>]},{dd,[],[<<83,112,97,99,101,32,115,101,112,97,114,97,116,111,114>>]}]},{p,[],[<<84,104,101,32,115,112,101,99,105,97,108,32,112,114,111,112,101,114,116,121,32,76,38,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,73,116,32,109,97,116,99,104,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,76,117,44,32,76,108,44,32,111,114,32,76,116,32,112,114,111,112,101,114,116,121,44,32,116,104,97,116,32,105,115,44,32,97,32,108,101,116,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,99,108,97,115,115,105,102,105,101,100,32,97,115,32,97,32,109,111,100,105,102,105,101,114,32,111,114,32,34,111,116,104,101,114,34,46>>]},{p,[],[<<84,104,101,32,67,115,32,40,83,117,114,114,111,103,97,116,101,41,32,112,114,111,112,101,114,116,121,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,85,43,68,56,48,48,32,116,111,32,85,43,68,70,70,70,46,32,83,117,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,118,97,108,105,100,32,105,110,32,85,110,105,99,111,100,101,32,115,116,114,105,110,103,115,32,97,110,100,32,115,111,32,99,97,110,110,111,116,32,98,101,32,116,101,115,116,101,100,32,98,121,32,80,67,82,69,46,32,80,101,114,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,67,115,32,112,114,111,112,101,114,116,121,46>>]},{p,[],[<<84,104,101,32,108,111,110,103,32,115,121,110,111,110,121,109,115,32,102,111,114,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,101,114,108,32,40,115,117,99,104,32,97,115,32,92,112,123,76,101,116,116,101,114,125,41,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,73,116,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,116,111,32,112,114,101,102,105,120,32,97,110,121,32,111,102,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,32,119,105,116,104,32,34,73,115,34,46>>]},{p,[],[<<78,111,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,32,104,97,115,32,116,104,101,32,67,110,32,40,117,110,97,115,115,105,103,110,101,100,41,32,112,114,111,112,101,114,116,121,46,32,84,104,105,115,32,112,114,111,112,101,114,116,121,32,105,115,32,105,110,115,116,101,97,100,32,97,115,115,117,109,101,100,32,102,111,114,32,97,110,121,32,99,111,100,101,32,112,111,105,110,116,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,46>>]},{p,[],[<<83,112,101,99,105,102,121,105,110,103,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,112,123,76,117,125,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,108,121,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,99,117,114,114,101,110,116,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,46>>]},{p,[],[<<77,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,105,115,32,110,111,116,32,102,97,115,116,44,32,97,115,32,80,67,82,69,32,109,117,115,116,32,100,111,32,97,32,109,117,108,116,105,115,116,97,103,101,32,116,97,98,108,101,32,108,111,111,107,117,112,32,116,111,32,102,105,110,100,32,97,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,121,46,32,84,104,97,116,32,105,115,32,119,104,121,32,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,92,100,32,97,110,100,32,92,119,32,100,111,32,110,111,116,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,105,110,32,80,67,82,69,32,98,121,32,100,101,102,97,117,108,116,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,109,97,107,101,32,116,104,101,109,32,100,111,32,115,111,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,111,114,32,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,40,42,85,67,80,41,46>>]},{p,[],[{em,[],[<<69,120,116,101,110,100,101,100,32,71,114,97,112,104,101,109,101,32,67,108,117,115,116,101,114,115>>]}]},{p,[],[<<84,104,101,32,92,88,32,101,115,99,97,112,101,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,102,111,114,109,32,97,110,32,34,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,34,44,32,97,110,100,32,116,114,101,97,116,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,40,115,101,101,32,98,101,108,111,119,41,46,32,85,112,32,116,111,32,97,110,100,32,105,110,99,108,117,100,105,110,103,32,114,101,108,101,97,115,101,32,56,46,51,49,44,32,80,67,82,69,32,109,97,116,99,104,101,100,32,97,110,32,101,97,114,108,105,101,114,44,32,115,105,109,112,108,101,114,32,100,101,102,105,110,105,116,105,111,110,32,116,104,97,116,32,119,97,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<40,63,62,92,80,77,92,112,77,42,41>>]},<<46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,100,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,44,32,102,111,108,108,111,119,101,100,32,98,121,32,122,101,114,111,32,111,114,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,46,32,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,114,101,32,116,121,112,105,99,97,108,108,121,32,110,111,110,45,115,112,97,99,105,110,103,32,97,99,99,101,110,116,115,32,116,104,97,116,32,97,102,102,101,99,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,99,104,97,114,97,99,116,101,114,46>>]},{p,[],[<<84,104,105,115,32,115,105,109,112,108,101,32,100,101,102,105,110,105,116,105,111,110,32,119,97,115,32,101,120,116,101,110,100,101,100,32,105,110,32,85,110,105,99,111,100,101,32,116,111,32,105,110,99,108,117,100,101,32,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,107,105,110,100,115,32,111,102,32,99,111,109,112,111,115,105,116,101,32,99,104,97,114,97,99,116,101,114,32,98,121,32,103,105,118,105,110,103,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,97,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,44,32,97,110,100,32,99,114,101,97,116,105,110,103,32,114,117,108,101,115,32,116,104,97,116,32,117,115,101,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,98,111,117,110,100,97,114,105,101,115,32,111,102,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,46,32,73,110,32,80,67,82,69,32,114,101,108,101,97,115,101,115,32,108,97,116,101,114,32,116,104,97,110,32,56,46,51,49,44,32,92,88,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,32,116,104,101,115,101,32,99,108,117,115,116,101,114,115,46>>]},{p,[],[<<92,88,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,110,32,105,116,32,100,101,99,105,100,101,115,32,119,104,101,116,104,101,114,32,116,111,32,97,100,100,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,117,108,101,115,32,102,111,114,32,101,110,100,105,110,103,32,97,32,99,108,117,115,116,101,114,58>>]},{ol,[],[{li,[],[{p,[],[<<69,110,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,101,110,100,32,98,101,116,119,101,101,110,32,67,82,32,97,110,100,32,76,70,59,32,111,116,104,101,114,119,105,115,101,32,101,110,100,32,97,102,116,101,114,32,97,110,121,32,99,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,98,114,101,97,107,32,72,97,110,103,117,108,32,40,97,32,75,111,114,101,97,110,32,115,99,114,105,112,116,41,32,115,121,108,108,97,98,108,101,32,115,101,113,117,101,110,99,101,115,46,32,72,97,110,103,117,108,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,111,102,32,102,105,118,101,32,116,121,112,101,115,58,32,76,44,32,86,44,32,84,44,32,76,86,44,32,97,110,100,32,76,86,84,46,32,65,110,32,76,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,76,44,32,86,44,32,76,86,44,32,111,114,32,76,86,84,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,32,111,114,32,86,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,86,32,111,114,32,84,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,84,32,111,114,32,84,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,111,110,108,121,32,98,121,32,97,32,84,32,99,104,97,114,97,99,116,101,114,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,101,110,100,32,98,101,102,111,114,101,32,101,120,116,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,111,114,32,115,112,97,99,105,110,103,32,109,97,114,107,115,46,32,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,108,119,97,121,115,32,104,97,118,101,32,116,104,101,32,34,101,120,116,101,110,100,34,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,101,110,100,32,97,102,116,101,114,32,112,114,101,112,101,110,100,32,99,104,97,114,97,99,116,101,114,115,46>>]}]},{li,[],[{p,[],[<<79,116,104,101,114,119,105,115,101,44,32,101,110,100,32,116,104,101,32,99,108,117,115,116,101,114,46>>]}]}]},{p,[],[{em,[],[<<80,67,82,69,32,65,100,100,105,116,105,111,110,97,108,32,80,114,111,112,101,114,116,105,101,115>>]}]},{p,[],[<<73,110,32,97,100,100,105,116,105,111,110,32,116,111,32,116,104,101,32,115,116,97,110,100,97,114,100,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,102,111,117,114,32,109,111,114,101,32,116,104,97,116,32,109,97,107,101,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,99,111,110,118,101,114,116,32,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,32,92,119,32,97,110,100,32,92,115,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,46,32,80,67,82,69,32,117,115,101,115,32,116,104,101,115,101,32,110,111,110,45,115,116,97,110,100,97,114,100,44,32,110,111,110,45,80,101,114,108,32,112,114,111,112,101,114,116,105,101,115,32,105,110,116,101,114,110,97,108,108,121,32,119,104,101,110,32,116,104,101,32>>,{code,[],[<<117,99,112>>]},<<32,111,112,116,105,111,110,32,105,115,32,112,97,115,115,101,100,46,32,72,111,119,101,118,101,114,44,32,116,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,101,120,112,108,105,99,105,116,108,121,46,32,84,104,101,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<88,97,110>>]},{dd,[],[{p,[],[<<65,110,121,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,32,112,114,111,112,101,114,116,121,46>>]}]},{dt,[],[<<88,112,115>>]},{dd,[],[{p,[],[<<65,110,121,32,80,111,115,105,120,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,32,102,101,101,100,44,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46>>]}]},{dt,[],[<<88,115,112>>]},{dd,[],[{p,[],[<<65,110,121,32,80,101,114,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,44,32,101,120,99,101,112,116,32,116,104,97,116,32,118,101,114,116,105,99,97,108,32,116,97,98,32,105,115,32,101,120,99,108,117,100,101,100,46>>]}]},{dt,[],[<<88,119,100>>]},{dd,[],[{p,[],[<<65,110,121,32,80,101,114,108,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101,46>>]}]}]},{p,[],[<<80,101,114,108,32,97,110,100,32,80,79,83,73,88,32,115,112,97,99,101,32,97,114,101,32,110,111,119,32,116,104,101,32,115,97,109,101,46,32,80,101,114,108,32,97,100,100,101,100,32,86,84,32,116,111,32,105,116,115,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,115,101,116,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,32,97,110,100,32,80,67,82,69,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46>>]},{p,[],[<<88,97,110,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,32,112,114,111,112,101,114,116,121,46,32,88,112,115,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,102,101,101,100,44,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,111,114,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46,32,88,115,112,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,59,32,105,116,32,117,115,101,100,32,116,111,32,101,120,99,108,117,100,101,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,44,32,98,117,116,32,80,101,114,108,32,99,104,97,110,103,101,100,44,32,97,110,100,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,88,119,100,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101,46>>]},{p,[],[<<84,104,101,114,101,32,105,115,32,97,110,111,116,104,101,114,32,110,111,110,45,115,116,97,110,100,97,114,100,32,112,114,111,112,101,114,116,121,44,32,88,117,99,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,32,78,97,109,101,32,105,110,32,67,43,43,32,97,110,100,32,111,116,104,101,114,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,115,46,32,84,104,101,115,101,32,97,114,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,36,44,32,64,44,32,96,32,40,103,114,97,118,101,32,97,99,99,101,110,116,41,44,32,97,110,100,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,62,61,32,85,43,48,48,65,48,44,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,115,117,114,114,111,103,97,116,101,115,32,85,43,68,56,48,48,32,116,111,32,85,43,68,70,70,70,46,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,115,116,32,98,97,115,101,32,40,65,83,67,73,73,41,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,120,99,108,117,100,101,100,46,32,40,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,32,78,97,109,101,115,32,97,114,101,32,111,102,32,116,104,101,32,102,111,114,109,32,92,117,72,72,72,72,32,111,114,32,92,85,72,72,72,72,72,72,72,72,44,32,119,104,101,114,101,32,72,32,105,115,32,97,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,88,117,99,32,112,114,111,112,101,114,116,121,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,98,117,116,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,116,104,101,121,32,114,101,112,114,101,115,101,110,116,46,41>>]},{p,[],[{em,[],[<<82,101,115,101,116,116,105,110,103,32,116,104,101,32,77,97,116,99,104,32,83,116,97,114,116>>]}]},{p,[],[<<84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,75,32,99,97,117,115,101,115,32,97,110,121,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,115,32,110,111,116,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,102,105,110,97,108,32,109,97,116,99,104,101,100,32,115,101,113,117,101,110,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,98,117,116,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,34,98,97,114,34,58>>]},{pre,[],[{code,[],[<<102,111,111,92,75,98,97,114>>]}]},{p,[],[<<84,104,105,115,32,102,101,97,116,117,114,101,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,46,32,72,111,119,101,118,101,114,44,32,105,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,98,101,102,111,114,101,32,116,104,101,32,114,101,97,108,32,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,111,102,32,102,105,120,101,100,32,108,101,110,103,116,104,44,32,97,115,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,100,111,46,32,84,104,101,32,117,115,101,32,111,102,32,92,75,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,102,101,114,101,32,119,105,116,104,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,116,104,101,32,102,105,114,115,116,32,115,117,98,115,116,114,105,110,103,32,105,115,32,115,116,105,108,108,32,115,101,116,32,116,111,32,34,102,111,111,34,58>>]},{pre,[],[{code,[],[<<40,102,111,111,41,92,75,98,97,114>>]}]},{p,[],[<<80,101,114,108,32,100,111,99,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,117,115,101,32,111,102,32,92,75,32,119,105,116,104,105,110,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,34,110,111,116,32,119,101,108,108,32,100,101,102,105,110,101,100,34,46,32,73,110,32,80,67,82,69,44,32,92,75,32,105,115,32,97,99,116,101,100,32,117,112,111,110,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,44,32,98,117,116,32,105,115,32,105,103,110,111,114,101,100,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,78,111,116,101,32,116,104,97,116,32,119,104,101,110,32,97,32,112,97,116,116,101,114,110,32,115,117,99,104,32,97,115,32,40,63,61,97,98,92,75,41,32,109,97,116,99,104,101,115,44,32,116,104,101,32,114,101,112,111,114,116,101,100,32,115,116,97,114,116,32,111,102,32,116,104,101,32,109,97,116,99,104,32,99,97,110,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,109,97,116,99,104,46>>]},{p,[],[{em,[],[<<83,105,109,112,108,101,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<84,104,101,32,102,105,110,97,108,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,112,101,99,105,102,105,101,115,32,97,32,99,111,110,100,105,116,105,111,110,32,116,104,97,116,32,109,117,115,116,32,98,101,32,109,101,116,32,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,112,111,105,110,116,32,105,110,32,97,32,109,97,116,99,104,44,32,119,105,116,104,111,117,116,32,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,117,115,101,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,98,97,99,107,115,108,97,115,104,101,100,32,97,115,115,101,114,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[<<92,98>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46>>]},{dt,[],[<<92,66>>]},{dd,[],[<<77,97,116,99,104,101,115,32,119,104,101,110,32,110,111,116,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46>>]},{dt,[],[<<92,65>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46>>]},{dt,[],[<<92,90>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46>>]},{dt,[],[<<92,122>>]},{dd,[],[<<77,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46>>]},{dt,[],[<<92,71>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46>>]}]},{p,[],[<<73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,92,98,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,73,102,32,97,110,121,32,111,116,104,101,114,32,111,102,32,116,104,101,115,101,32,97,115,115,101,114,116,105,111,110,115,32,97,112,112,101,97,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,32,100,101,102,97,117,108,116,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,92,66,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,32,66,41,46>>]},{p,[],[<<65,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,105,115,32,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,104,101,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,97,114,97,99,116,101,114,32,100,111,32,110,111,116,32,98,111,116,104,32,109,97,116,99,104,32,92,119,32,111,114,32,92,87,32,40,116,104,97,116,32,105,115,44,32,111,110,101,32,109,97,116,99,104,101,115,32,92,119,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,109,97,116,99,104,101,115,32,92,87,41,44,32,111,114,32,116,104,101,32,115,116,97,114,116,32,111,114,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,102,32,116,104,101,32,102,105,114,115,116,32,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,92,119,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,73,110,32,85,84,70,32,109,111,100,101,44,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,92,119,32,97,110,100,32,92,87,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,100,111,110,101,44,32,105,116,32,97,108,115,111,32,97,102,102,101,99,116,115,32,92,98,32,97,110,100,32,92,66,46,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,111,32,110,111,116,32,104,97,118,101,32,97,32,115,101,112,97,114,97,116,101,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,111,114,32,34,101,110,100,32,111,102,32,119,111,114,100,34,32,109,101,116,97,115,101,113,117,101,110,99,101,46,32,72,111,119,101,118,101,114,44,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,92,98,32,110,111,114,109,97,108,108,121,32,100,101,116,101,114,109,105,110,101,115,32,119,104,105,99,104,32,105,116,32,105,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,114,97,103,109,101,110,116,32,92,98,97,32,109,97,116,99,104,101,115,32,34,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,119,111,114,100,46>>]},{p,[],[<<84,104,101,32,92,65,44,32,92,90,44,32,97,110,100,32,92,122,32,97,115,115,101,114,116,105,111,110,115,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,32,105,110,32,116,104,97,116,32,116,104,101,121,32,111,110,108,121,32,101,118,101,114,32,109,97,116,99,104,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,97,110,100,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,97,116,101,118,101,114,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,46,32,84,104,117,115,44,32,116,104,101,121,32,97,114,101,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,46,32,84,104,101,115,101,32,116,104,114,101,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,32,111,112,116,105,111,110,115,32>>,{code,[],[<<110,111,116,98,111,108>>]},<<32,111,114,32>>,{code,[],[<<110,111,116,101,111,108>>]},<<44,32,119,104,105,99,104,32,97,102,102,101,99,116,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,105,115,32,110,111,110,45,122,101,114,111,44,32,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,109,97,116,99,104,105,110,103,32,105,115,32,116,111,32,115,116,97,114,116,32,97,116,32,97,32,112,111,105,110,116,32,111,116,104,101,114,32,116,104,97,110,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,92,65,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,46,32,84,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32,92,90,32,97,110,100,32,92,122,32,105,115,32,116,104,97,116,32,92,90,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,97,110,100,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,44,32,119,104,105,108,101,32,92,122,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,46>>]},{p,[],[<<84,104,101,32,92,71,32,97,115,115,101,114,116,105,111,110,32,105,115,32,116,114,117,101,32,111,110,108,121,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,112,111,105,110,116,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<46,32,73,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,92,65,32,119,104,101,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,105,115,32,110,111,110,45,122,101,114,111,46,32,66,121,32,99,97,108,108,105,110,103,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,97,112,112,114,111,112,114,105,97,116,101,32,97,114,103,117,109,101,110,116,115,44,32,121,111,117,32,99,97,110,32,109,105,109,105,99,32,116,104,101,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,103>>]},<<44,32,97,110,100,32,105,116,32,105,115,32,105,110,32,116,104,105,115,32,107,105,110,100,32,111,102,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,119,104,101,114,101,32,92,71,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46>>]},{p,[],[<<78,111,116,105,99,101,44,32,104,111,119,101,118,101,114,44,32,116,104,97,116,32,116,104,101,32,80,67,82,69,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,92,71,44,32,97,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,44,32,105,115,32,115,117,98,116,108,121,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,44,32,119,104,105,99,104,32,100,101,102,105,110,101,115,32,105,116,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,112,114,101,118,105,111,117,115,32,109,97,116,99,104,46,32,73,110,32,80,101,114,108,44,32,116,104,101,115,101,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,116,104,101,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,32,115,116,114,105,110,103,32,119,97,115,32,101,109,112,116,121,46,32,65,115,32,80,67,82,69,32,100,111,101,115,32,111,110,108,121,32,111,110,101,32,109,97,116,99,104,32,97,116,32,97,32,116,105,109,101,44,32,105,116,32,99,97,110,110,111,116,32,114,101,112,114,111,100,117,99,101,32,116,104,105,115,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<73,102,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,98,101,103,105,110,32,119,105,116,104,32,92,71,44,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,110,99,104,111,114,101,100,32,116,111,32,116,104,101,32,115,116,97,114,116,105,110,103,32,109,97,116,99,104,32,112,111,115,105,116,105,111,110,44,32,97,110,100,32,116,104,101,32,34,97,110,99,104,111,114,101,100,34,32,102,108,97,103,32,105,115,32,115,101,116,32,105,110,32,116,104,101,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{a,[{id,<<115,101,99,116,52>>}],[]},{h2,[],[<<67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114>>]},{p,[],[<<84,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,122,101,114,111,45,119,105,100,116,104,32,97,115,115,101,114,116,105,111,110,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,121,32,116,101,115,116,32,102,111,114,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,111,110,100,105,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,32,119,105,116,104,111,117,116,32,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,105,110,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,116,99,104,105,110,103,32,109,111,100,101,44,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,105,115,32,110,111,110,45,122,101,114,111,44,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,117,110,115,101,116,46,32,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,99,105,114,99,117,109,102,108,101,120,32,104,97,115,32,97,110,32,101,110,116,105,114,101,108,121,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,40,115,101,101,32,98,101,108,111,119,41,46>>]},{p,[],[<<67,105,114,99,117,109,102,108,101,120,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,116,104,105,110,103,32,105,110,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,101,118,101,114,32,116,111,32,109,97,116,99,104,32,116,104,97,116,32,98,114,97,110,99,104,46,32,73,102,32,97,108,108,32,112,111,115,115,105,98,108,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,115,116,97,114,116,32,119,105,116,104,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,105,116,32,105,115,32,115,97,105,100,32,116,111,32,98,101,32,97,110,32,34,97,110,99,104,111,114,101,100,34,32,112,97,116,116,101,114,110,46,32,40,84,104,101,114,101,32,97,114,101,32,97,108,115,111,32,111,116,104,101,114,32,99,111,110,115,116,114,117,99,116,115,32,116,104,97,116,32,99,97,110,32,99,97,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,111,32,98,101,32,97,110,99,104,111,114,101,100,46,41>>]},{p,[],[<<84,104,101,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,121,32,100,101,102,97,117,108,116,41,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,110,101,119,108,105,110,101,46,32,68,111,108,108,97,114,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,105,110,32,97,110,121,32,98,114,97,110,99,104,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,46,32,68,111,108,108,97,114,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46>>]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,100,111,108,108,97,114,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]},<<32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,92,90,32,97,115,115,101,114,116,105,111,110,46>>]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,99,104,97,110,103,101,100,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32,97,32,99,105,114,99,117,109,102,108,101,120,32,109,97,116,99,104,101,115,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,32,97,110,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,102,116,101,114,32,97,32,110,101,119,108,105,110,101,32,116,104,97,116,32,101,110,100,115,32,116,104,101,32,115,116,114,105,110,103,46,32,65,32,100,111,108,108,97,114,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,110,121,32,110,101,119,108,105,110,101,115,32,105,110,32,116,104,101,32,115,116,114,105,110,103,44,32,97,110,100,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,44,32,119,104,101,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46,32,87,104,101,110,32,110,101,119,108,105,110,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,105,115,111,108,97,116,101,100,32,67,82,32,97,110,100,32,76,70,32,99,104,97,114,97,99,116,101,114,115,32,100,111,32,110,111,116,32,105,110,100,105,99,97,116,101,32,110,101,119,108,105,110,101,115,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,47,94,97,98,99,36,47,32,109,97,116,99,104,101,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,100,101,102,92,110,97,98,99,34,32,40,119,104,101,114,101,32,92,110,32,114,101,112,114,101,115,101,110,116,115,32,97,32,110,101,119,108,105,110,101,41,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,98,117,116,32,110,111,116,32,111,116,104,101,114,119,105,115,101,46,32,83,111,44,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,97,110,99,104,111,114,101,100,32,105,110,32,115,105,110,103,108,101,45,108,105,110,101,32,109,111,100,101,32,98,101,99,97,117,115,101,32,97,108,108,32,98,114,97,110,99,104,101,115,32,115,116,97,114,116,32,119,105,116,104,32,94,32,97,114,101,32,110,111,116,32,97,110,99,104,111,114,101,100,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,97,110,100,32,97,32,109,97,116,99,104,32,102,111,114,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,112,111,115,115,105,98,108,101,32,119,104,101,110,32,97,114,103,117,109,101,110,116,32>>,{em,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,105,115,32,110,111,110,45,122,101,114,111,46,32,79,112,116,105,111,110,32>>,{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]},<<32,105,115,32,105,103,110,111,114,101,100,32,105,102,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,92,65,44,32,92,90,44,32,97,110,100,32,92,122,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,116,97,114,116,32,97,110,100,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,110,32,98,111,116,104,32,109,111,100,101,115,46,32,73,102,32,97,108,108,32,98,114,97,110,99,104,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,32,119,105,116,104,32,92,65,44,32,105,116,32,105,115,32,97,108,119,97,121,115,32,97,110,99,104,111,114,101,100,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46>>]},{a,[{id,<<115,101,99,116,53>>}],[]},{h2,[],[<<70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,78>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,101,120,99,101,112,116,32,40,98,121,32,100,101,102,97,117,108,116,41,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46>>]},{p,[],[<<87,104,101,110,32,97,32,108,105,110,101,32,101,110,100,105,110,103,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,100,111,116,32,110,101,118,101,114,32,109,97,116,99,104,101,115,32,116,104,97,116,32,99,104,97,114,97,99,116,101,114,46,32,87,104,101,110,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,117,115,101,100,44,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,32,105,102,32,105,116,32,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,76,70,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,105,115,111,108,97,116,101,100,32,67,82,115,32,97,110,100,32,76,70,115,41,46,32,87,104,101,110,32,97,110,121,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,44,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,44,32,76,70,44,32,111,114,32,97,110,121,32,111,102,32,116,104,101,32,111,116,104,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,100,111,116,32,114,101,103,97,114,100,105,110,103,32,110,101,119,108,105,110,101,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,105,115,32,115,101,116,44,32,97,32,100,111,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,44,32,119,105,116,104,111,117,116,32,101,120,99,101,112,116,105,111,110,46,32,73,102,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,116,97,107,101,115,32,116,119,111,32,100,111,116,115,32,116,111,32,109,97,116,99,104,32,105,116,46>>]},{p,[],[<<84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,100,111,116,32,105,115,32,101,110,116,105,114,101,108,121,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,44,32,116,104,101,32,111,110,108,121,32,114,101,108,97,116,105,111,110,115,104,105,112,32,105,115,32,116,104,97,116,32,98,111,116,104,32,105,110,118,111,108,118,101,32,110,101,119,108,105,110,101,115,46,32,68,111,116,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46>>]},{p,[],[<<84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,78,32,98,101,104,97,118,101,115,32,108,105,107,101,32,97,32,100,111,116,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,32,111,112,116,105,111,110,32>>,{code,[],[<<80,67,82,69,95,68,79,84,65,76,76>>]},<<46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,111,110,101,32,116,104,97,116,32,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46,32,80,101,114,108,32,97,108,115,111,32,117,115,101,115,32,92,78,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46>>]},{a,[{id,<<115,101,99,116,54>>}],[]},{h2,[],[<<77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,67,32,109,97,116,99,104,101,115,32,97,110,121,32,100,97,116,97,32,117,110,105,116,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,97,32,85,84,70,32,109,111,100,101,32,105,115,32,115,101,116,46,32,79,110,101,32,100,97,116,97,32,117,110,105,116,32,105,115,32,111,110,101,32,98,121,116,101,46,32,85,110,108,105,107,101,32,97,32,100,111,116,44,32,92,67,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,102,101,97,116,117,114,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,80,101,114,108,32,116,111,32,109,97,116,99,104,32,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,105,110,32,85,84,70,45,56,32,109,111,100,101,44,32,98,117,116,32,105,116,32,105,115,32,117,110,99,108,101,97,114,32,104,111,119,32,105,116,32,99,97,110,32,117,115,101,102,117,108,108,121,32,98,101,32,117,115,101,100,46,32,65,115,32,92,67,32,98,114,101,97,107,115,32,117,112,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,32,117,110,105,116,115,44,32,109,97,116,99,104,105,110,103,32,111,110,101,32,117,110,105,116,32,119,105,116,104,32,92,67,32,105,110,32,97,32,85,84,70,32,109,111,100,101,32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,32,99,97,110,32,115,116,97,114,116,32,119,105,116,104,32,97,32,109,97,108,102,111,114,109,101,100,32,85,84,70,32,99,104,97,114,97,99,116,101,114,46,32,84,104,105,115,32,104,97,115,32,117,110,100,101,102,105,110,101,100,32,114,101,115,117,108,116,115,44,32,97,115,32,80,67,82,69,32,97,115,115,117,109,101,115,32,116,104,97,116,32,105,116,32,100,101,97,108,115,32,119,105,116,104,32,118,97,108,105,100,32,85,84,70,32,115,116,114,105,110,103,115,46>>]},{p,[],[<<80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,92,67,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,32,105,110,32,97,32,85,84,70,32,109,111,100,101,44,32,97,115,32,116,104,105,115,32,119,111,117,108,100,32,109,97,107,101,32,105,116,32,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,111,111,107,98,101,104,105,110,100,46>>]},{p,[],[<<84,104,101,32,92,67,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,105,115,32,98,101,115,116,32,97,118,111,105,100,101,100,46,32,72,111,119,101,118,101,114,44,32,111,110,101,32,119,97,121,32,111,102,32,117,115,105,110,103,32,105,116,32,116,104,97,116,32,97,118,111,105,100,115,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,108,102,111,114,109,101,100,32,85,84,70,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,116,111,32,117,115,101,32,97,32,108,111,111,107,97,104,101,97,100,32,116,111,32,99,104,101,99,107,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,44,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<40,63,124,32,40,63,61,91,92,120,48,48,45,92,120,55,102,93,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,56,48,45,92,120,123,55,102,102,125,93,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,56,48,48,125,45,92,120,123,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,49,48,48,48,48,125,45,92,120,123,49,102,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,40,92,67,41,41>>]}]},{p,[],[<<65,32,103,114,111,117,112,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,40,63,124,32,114,101,115,101,116,115,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,110,117,109,98,101,114,115,32,105,110,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]},<<41,46,32,84,104,101,32,97,115,115,101,114,116,105,111,110,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,32,99,104,101,99,107,32,116,104,101,32,110,101,120,116,32,85,84,70,45,56,32,99,104,97,114,97,99,116,101,114,32,102,111,114,32,118,97,108,117,101,115,32,119,104,111,115,101,32,101,110,99,111,100,105,110,103,32,117,115,101,115,32,49,44,32,50,44,32,51,44,32,111,114,32,52,32,98,121,116,101,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,97,114,101,32,116,104,101,110,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,110,117,109,98,101,114,32,111,102,32,103,114,111,117,112,115,46>>]},{a,[{id,<<115,101,99,116,55>>}],[]},{h2,[],[<<83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]},{p,[],[<<65,110,32,111,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,46,32,65,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,115,112,101,99,105,97,108,32,98,121,32,100,101,102,97,117,108,116,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<80,67,82,69,95,74,65,86,65,83,67,82,73,80,84,95,67,79,77,80,65,84>>]},<<32,105,115,32,115,101,116,44,32,97,32,108,111,110,101,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,99,97,117,115,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,32,73,102,32,97,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,32,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,99,108,97,115,115,44,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,32,40,97,102,116,101,114,32,97,110,32,105,110,105,116,105,97,108,32,99,105,114,99,117,109,102,108,101,120,44,32,105,102,32,112,114,101,115,101,110,116,41,32,111,114,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,46>>]},{p,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,100,97,116,97,32,117,110,105,116,32,108,111,110,103,46,32,65,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,32,105,110,32,116,104,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,44,32,117,110,108,101,115,115,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110,32,105,115,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,115,117,98,106,101,99,116,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,32,116,104,101,32,115,101,116,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,46,32,73,102,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,32,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,99,108,97,115,115,44,32,101,110,115,117,114,101,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,101,115,99,97,112,101,32,105,116,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32>>,{code,[],[<<91,97,101,105,111,117,93>>]},<<32,109,97,116,99,104,101,115,32,97,110,121,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,44,32,119,104,105,108,101,32>>,{code,[],[<<91,94,97,101,105,111,117,93>>]},<<32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,106,117,115,116,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,105,110,32,116,104,101,32,99,108,97,115,115,32,98,121,32,101,110,117,109,101,114,97,116,105,110,103,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,46,32,65,32,99,108,97,115,115,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,110,111,116,32,97,110,32,97,115,115,101,114,116,105,111,110,59,32,105,116,32,115,116,105,108,108,32,99,111,110,115,117,109,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,105,116,32,102,97,105,108,115,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,101,114,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,46>>]},{p,[],[<<73,110,32,85,84,70,45,56,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,40,48,120,102,102,102,102,41,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,99,108,97,115,115,32,97,115,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,111,114,32,98,121,32,117,115,105,110,103,32,116,104,101,32,92,120,123,32,101,115,99,97,112,105,110,103,32,109,101,99,104,97,110,105,115,109,46>>]},{p,[],[<<87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,97,110,121,32,108,101,116,116,101,114,115,32,105,110,32,97,32,99,108,97,115,115,32,114,101,112,114,101,115,101,110,116,32,98,111,116,104,32,116,104,101,105,114,32,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,118,101,114,115,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,99,97,115,101,108,101,115,115,32>>,{code,[],[<<91,97,101,105,111,117,93>>]},<<32,109,97,116,99,104,101,115,32,34,65,34,32,97,110,100,32,34,97,34,44,32,97,110,100,32,97,32,99,97,115,101,108,101,115,115,32>>,{code,[],[<<91,94,97,101,105,111,117,93>>]},<<32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,65,34,44,32,98,117,116,32,97,32,99,97,115,101,102,117,108,32,118,101,114,115,105,111,110,32,119,111,117,108,100,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,97,108,119,97,121,115,32,117,110,100,101,114,115,116,97,110,100,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,118,97,108,117,101,115,32,97,114,101,32,60,32,50,53,54,44,32,115,111,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,46,32,70,111,114,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,104,105,103,104,101,114,32,118,97,108,117,101,115,44,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,105,115,32,115,117,112,112,111,114,116,101,100,32,111,110,108,121,32,105,102,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,110,32,97,32,85,84,70,32,109,111,100,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,62,61,44,32,101,110,115,117,114,101,32,116,104,97,116,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,32,97,110,100,32,119,105,116,104,32,85,84,70,32,115,117,112,112,111,114,116,46>>]},{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,99,97,110,32,105,110,100,105,99,97,116,101,32,108,105,110,101,32,98,114,101,97,107,115,32,97,114,101,32,110,101,118,101,114,32,116,114,101,97,116,101,100,32,105,110,32,97,110,121,32,115,112,101,99,105,97,108,32,119,97,121,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,44,32,119,104,97,116,101,118,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,115,101,113,117,101,110,99,101,32,105,115,32,105,110,32,117,115,101,44,32,97,110,100,32,119,104,97,116,101,118,101,114,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,115,32>>,{code,[],[<<80,67,82,69,95,68,79,84,65,76,76>>]},<<32,97,110,100,32>>,{code,[],[<<80,67,82,69,95,77,85,76,84,73,76,73,78,69>>]},<<32,105,115,32,117,115,101,100,46,32,65,32,99,108,97,115,115,32,115,117,99,104,32,97,115,32,91,94,97,93,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,109,105,110,117,115,32,40,104,121,112,104,101,110,41,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,112,101,99,105,102,121,32,97,32,114,97,110,103,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,100,45,109,93,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,98,101,116,119,101,101,110,32,100,32,97,110,100,32,109,44,32,105,110,99,108,117,115,105,118,101,46,32,73,102,32,97,32,109,105,110,117,115,32,99,104,97,114,97,99,116,101,114,32,105,115,32,114,101,113,117,105,114,101,100,32,105,110,32,97,32,99,108,97,115,115,44,32,105,116,32,109,117,115,116,32,98,101,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,32,111,114,32,97,112,112,101,97,114,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,105,116,32,99,97,110,110,111,116,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,100,105,99,97,116,105,110,103,32,97,32,114,97,110,103,101,44,32,116,121,112,105,99,97,108,108,121,32,97,115,32,116,104,101,32,102,105,114,115,116,32,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,97,32,114,97,110,103,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,98,45,100,45,122,93,32,109,97,116,99,104,101,115,32,108,101,116,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,98,32,116,111,32,100,44,32,97,32,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,122,46>>]},{p,[],[<<84,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,34,93,34,32,99,97,110,110,111,116,32,98,101,32,116,104,101,32,101,110,100,32,99,104,97,114,97,99,116,101,114,32,111,102,32,97,32,114,97,110,103,101,46,32,65,32,112,97,116,116,101,114,110,32,115,117,99,104,32,97,115,32,91,87,45,93,52,54,93,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,111,102,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,40,34,87,34,32,97,110,100,32,34,45,34,41,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,34,52,54,93,34,44,32,115,111,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,87,52,54,93,34,32,111,114,32,34,45,52,54,93,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,34,93,34,32,105,115,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,114,97,110,103,101,44,32,115,111,32,91,87,45,92,93,52,54,93,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,99,111,110,116,97,105,110,105,110,103,32,97,32,114,97,110,103,101,32,102,111,108,108,111,119,101,100,32,98,121,32,116,119,111,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,34,93,34,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,116,111,32,101,110,100,32,97,32,114,97,110,103,101,46>>]},{p,[],[<<65,110,32,101,114,114,111,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,32,80,79,83,73,88,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,115,101,101,32,98,101,108,111,119,41,32,111,114,32,97,110,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,111,116,104,101,114,32,116,104,97,110,32,111,110,101,32,116,104,97,116,32,100,101,102,105,110,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,101,97,114,115,32,97,116,32,97,32,112,111,105,110,116,32,119,104,101,114,101,32,97,32,114,97,110,103,101,32,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,32,105,115,32,101,120,112,101,99,116,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,122,45,92,120,102,102,93,32,105,115,32,118,97,108,105,100,44,32,98,117,116,32,91,65,45,92,100,93,32,97,110,100,32,91,65,45,91,58,100,105,103,105,116,58,93,93,32,97,114,101,32,110,111,116,46>>]},{p,[],[<<82,97,110,103,101,115,32,111,112,101,114,97,116,101,32,105,110,32,116,104,101,32,99,111,108,108,97,116,105,110,103,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115,46,32,84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,115,112,101,99,105,102,105,101,100,32,110,117,109,101,114,105,99,97,108,108,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,91,92,48,48,48,45,92,48,51,55,93,46,32,82,97,110,103,101,115,32,99,97,110,32,105,110,99,108,117,100,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,118,97,108,105,100,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,109,111,100,101,46>>]},{p,[],[<<73,102,32,97,32,114,97,110,103,101,32,116,104,97,116,32,105,110,99,108,117,100,101,115,32,108,101,116,116,101,114,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,115,32,105,110,32,101,105,116,104,101,114,32,99,97,115,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,87,45,99,93,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,91,93,91,92,92,94,95,96,119,120,121,122,97,98,99,93,44,32,109,97,116,99,104,101,100,32,99,97,115,101,108,101,115,115,108,121,46,32,73,110,32,97,32,110,111,110,45,85,84,70,32,109,111,100,101,44,32,105,102,32,99,104,97,114,97,99,116,101,114,32,116,97,98,108,101,115,32,102,111,114,32,97,32,70,114,101,110,99,104,32,108,111,99,97,108,101,32,97,114,101,32,105,110,32,117,115,101,44,32,91,92,120,99,56,45,92,120,99,98,93,32,109,97,116,99,104,101,115,32,97,99,99,101,110,116,101,100,32,69,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,98,111,116,104,32,99,97,115,101,115,46,32,73,110,32,85,84,70,32,109,111,100,101,115,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,111,110,108,121,32,119,104,101,110,32,105,116,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,46>>]},{p,[],[<<84,104,101,32,99,104,97,114,97,99,116,101,114,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,92,100,44,32,92,68,44,32,92,104,44,32,92,72,44,32,92,112,44,32,92,80,44,32,92,115,44,32,92,83,44,32,92,118,44,32,92,86,44,32,92,119,44,32,97,110,100,32,92,87,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,110,100,32,97,100,100,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,116,104,101,121,32,109,97,116,99,104,32,116,111,32,116,104,101,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,92,100,65,66,67,68,69,70,93,32,109,97,116,99,104,101,115,32,97,110,121,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,32,73,110,32,85,84,70,32,109,111,100,101,115,44,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,97,102,102,101,99,116,115,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,92,100,44,32,92,115,44,32,92,119,32,97,110,100,32,116,104,101,105,114,32,117,112,112,101,114,99,97,115,101,32,112,97,114,116,110,101,114,115,44,32,106,117,115,116,32,97,115,32,105,116,32,100,111,101,115,32,119,104,101,110,32,116,104,101,121,32,97,112,112,101,97,114,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115>>]},<<32,101,97,114,108,105,101,114,46,32,84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,98,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,92,66,44,32,92,78,44,32,92,82,44,32,97,110,100,32,92,88,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,97,110,121,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,78,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46>>]},{p,[],[<<65,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,99,111,110,118,101,110,105,101,110,116,108,121,32,98,101,32,117,115,101,100,32,119,105,116,104,32,116,104,101,32,117,112,112,101,114,99,97,115,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,32,116,111,32,115,112,101,99,105,102,121,32,97,32,109,111,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,108,111,119,101,114,99,97,115,101,32,116,121,112,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,108,97,115,115,32,91,94,92,87,95,93,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,111,114,32,100,105,103,105,116,44,32,98,117,116,32,110,111,116,32,117,110,100,101,114,115,99,111,114,101,44,32,119,104,105,108,101,32,91,92,119,93,32,105,110,99,108,117,100,101,115,32,117,110,100,101,114,115,99,111,114,101,46,32,65,32,112,111,115,105,116,105,118,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,116,111,32,98,101,32,114,101,97,100,32,97,115,32,34,115,111,109,101,116,104,105,110,103,32,79,82,32,115,111,109,101,116,104,105,110,103,32,79,82,32,46,46,46,34,32,97,110,100,32,97,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,32,97,115,32,34,78,79,84,32,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,32,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,32,46,46,46,34,46>>]},{p,[],[<<79,110,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,58>>]},{ul,[],[{li,[],[<<66,97,99,107,115,108,97,115,104>>]},{li,[],[<<72,121,112,104,101,110,32,40,111,110,108,121,32,119,104,101,114,101,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,97,32,114,97,110,103,101,41>>]},{li,[],[<<67,105,114,99,117,109,102,108,101,120,32,40,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,41>>]},{li,[],[<<79,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,40,111,110,108,121,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,116,114,111,100,117,99,105,110,103,32,97,32,80,111,115,105,120,32,99,108,97,115,115,32,110,97,109,101,44,32,111,114,32,102,111,114,32,97,32,115,112,101,99,105,97,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,102,101,97,116,117,114,101,59,32,115,101,101,32,116,104,101,32,110,101,120,116,32,116,119,111,32,115,101,99,116,105,111,110,115,41>>]},{li,[],[<<84,101,114,109,105,110,97,116,105,110,103,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116>>]}]},{p,[],[<<72,111,119,101,118,101,114,44,32,101,115,99,97,112,105,110,103,32,111,116,104,101,114,32,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,100,111,101,115,32,110,111,32,104,97,114,109,46>>]},{a,[{id,<<115,101,99,116,56>>}],[]},{h2,[],[<<80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]},{p,[],[<<80,101,114,108,32,115,117,112,112,111,114,116,115,32,116,104,101,32,80,111,115,105,120,32,110,111,116,97,116,105,111,110,32,102,111,114,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,105,115,32,117,115,101,115,32,110,97,109,101,115,32,101,110,99,108,111,115,101,100,32,98,121,32,91,58,32,97,110,100,32,58,93,32,119,105,116,104,105,110,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,80,67,82,69,32,97,108,115,111,32,115,117,112,112,111,114,116,115,32,116,104,105,115,32,110,111,116,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,48,34,44,32,34,49,34,44,32,97,110,121,32,97,108,112,104,97,98,101,116,105,99,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,34,37,34,58>>]},{pre,[],[{code,[],[<<91,48,49,91,58,97,108,112,104,97,58,93,37,93>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,115,117,112,112,111,114,116,101,100,32,99,108,97,115,115,32,110,97,109,101,115,58>>]},{dl,[],[{dt,[],[<<97,108,110,117,109>>]},{dd,[],[<<76,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115>>]},{dt,[],[<<97,108,112,104,97>>]},{dd,[],[<<76,101,116,116,101,114,115>>]},{dt,[],[<<97,115,99,105,105>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,99,111,100,101,115,32,48,45,49,50,55>>]},{dt,[],[<<98,108,97,110,107>>]},{dd,[],[<<83,112,97,99,101,32,111,114,32,116,97,98,32,111,110,108,121>>]},{dt,[],[<<99,110,116,114,108>>]},{dd,[],[<<67,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,115>>]},{dt,[],[<<100,105,103,105,116>>]},{dd,[],[<<68,101,99,105,109,97,108,32,100,105,103,105,116,115,32,40,115,97,109,101,32,97,115,32,92,100,41>>]},{dt,[],[<<103,114,97,112,104>>]},{dd,[],[<<80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,115,112,97,99,101>>]},{dt,[],[<<108,111,119,101,114>>]},{dd,[],[<<76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115>>]},{dt,[],[<<112,114,105,110,116>>]},{dd,[],[<<80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,115,112,97,99,101>>]},{dt,[],[<<112,117,110,99,116>>]},{dd,[],[<<80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,108,101,116,116,101,114,115,44,32,100,105,103,105,116,115,44,32,97,110,100,32,115,112,97,99,101>>]},{dt,[],[<<115,112,97,99,101>>]},{dd,[],[<<87,104,105,116,101,115,112,97,99,101,32,40,116,104,101,32,115,97,109,101,32,97,115,32,92,115,32,102,114,111,109,32,80,67,82,69,32,56,46,51,52,41>>]},{dt,[],[<<117,112,112,101,114>>]},{dd,[],[<<85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115>>]},{dt,[],[<<119,111,114,100>>]},{dd,[],[<<34,87,111,114,100,34,32,99,104,97,114,97,99,116,101,114,115,32,40,115,97,109,101,32,97,115,32,92,119,41>>]},{dt,[],[<<120,100,105,103,105,116>>]},{dd,[],[<<72,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115>>]}]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,34,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,32,97,110,100,32,115,112,97,99,101,32,40,51,50,41,46,32,73,102,32,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,44,32,116,104,101,32,108,105,115,116,32,111,102,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,98,101,32,100,105,102,102,101,114,101,110,116,59,32,116,104,101,114,101,32,109,97,121,32,98,101,32,102,101,119,101,114,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,109,46,32,34,83,112,97,99,101,34,32,117,115,101,100,32,116,111,32,98,101,32,100,105,102,102,101,114,101,110,116,32,116,111,32,92,115,44,32,119,104,105,99,104,32,100,105,100,32,110,111,116,32,105,110,99,108,117,100,101,32,86,84,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,34,83,112,97,99,101,34,32,97,110,100,32,92,115,32,110,111,119,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,110,97,109,101,32,34,119,111,114,100,34,32,105,115,32,97,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,44,32,97,110,100,32,34,98,108,97,110,107,34,32,105,115,32,97,32,71,78,85,32,101,120,116,101,110,115,105,111,110,32,102,114,111,109,32,80,101,114,108,32,53,46,56,46,32,65,110,111,116,104,101,114,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,32,105,115,32,110,101,103,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,94,32,99,104,97,114,97,99,116,101,114,32,97,102,116,101,114,32,116,104,101,32,99,111,108,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,49,34,44,32,34,50,34,44,32,111,114,32,97,110,121,32,110,111,110,45,100,105,103,105,116,58>>]},{pre,[],[{code,[],[<<91,49,50,91,58,94,100,105,103,105,116,58,93,93>>]}]},{p,[],[<<80,67,82,69,32,40,97,110,100,32,80,101,114,108,41,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,32,116,104,101,32,80,111,115,105,120,32,115,121,110,116,97,120,32,91,46,99,104,46,93,32,97,110,100,32,91,61,99,104,61,93,32,119,104,101,114,101,32,34,99,104,34,32,105,115,32,97,32,34,99,111,108,108,97,116,105,110,103,32,101,108,101,109,101,110,116,34,44,32,98,117,116,32,116,104,101,115,101,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,97,110,100,32,97,110,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,105,102,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,100,111,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,111,102,32,116,104,101,32,80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<80,67,82,69,95,85,67,80>>]},<<32,105,115,32,112,97,115,115,101,100,32,116,111,32>>,{code,[],[<<112,99,114,101,95,99,111,109,112,105,108,101,40,41>>]},<<44,32,115,111,109,101,32,111,102,32,116,104,101,32,99,108,97,115,115,101,115,32,97,114,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,84,104,105,115,32,105,115,32,97,99,104,105,101,118,101,100,32,98,121,32,114,101,112,108,97,99,105,110,103,32,99,101,114,116,97,105,110,32,80,111,115,105,120,32,99,108,97,115,115,101,115,32,98,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<91,58,97,108,110,117,109,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,88,97,110,125>>]}]},{dt,[],[<<91,58,97,108,112,104,97,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,76,125>>]}]},{dt,[],[<<91,58,98,108,97,110,107,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,104>>]}]},{dt,[],[<<91,58,100,105,103,105,116,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,78,100,125>>]}]},{dt,[],[<<91,58,108,111,119,101,114,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,76,108,125>>]}]},{dt,[],[<<91,58,115,112,97,99,101,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,88,112,115,125>>]}]},{dt,[],[<<91,58,117,112,112,101,114,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,76,117,125>>]}]},{dt,[],[<<91,58,119,111,114,100,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,88,119,100,125>>]}]}]},{p,[],[<<78,101,103,97,116,101,100,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,97,115,32,91,58,94,97,108,112,104,97,58,93,44,32,117,115,101,32,92,80,32,105,110,115,116,101,97,100,32,111,102,32,92,112,46,32,84,104,114,101,101,32,111,116,104,101,114,32,80,79,83,73,88,32,99,108,97,115,115,101,115,32,97,114,101,32,104,97,110,100,108,101,100,32,115,112,101,99,105,97,108,108,121,32,105,110,32,85,67,80,32,109,111,100,101,58>>]},{dl,[],[{dt,[],[<<91,58,103,114,97,112,104,58,93>>]},{dd,[],[{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,103,108,121,112,104,115,32,116,104,97,116,32,109,97,114,107,32,116,104,101,32,112,97,103,101,32,119,104,101,110,32,112,114,105,110,116,101,100,46,32,73,110,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,116,101,114,109,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,76,44,32,77,44,32,78,44,32,80,44,32,83,44,32,111,114,32,67,102,32,112,114,111,112,101,114,116,105,101,115,44,32,101,120,99,101,112,116,32,102,111,114,58>>]},{dl,[],[{dt,[],[<<85,43,48,54,49,67>>]},{dd,[],[{p,[],[<<65,114,97,98,105,99,32,76,101,116,116,101,114,32,77,97,114,107>>]}]},{dt,[],[<<85,43,49,56,48,69>>]},{dd,[],[{p,[],[<<77,111,110,103,111,108,105,97,110,32,86,111,119,101,108,32,83,101,112,97,114,97,116,111,114>>]}]},{dt,[],[<<85,43,50,48,54,54,32,45,32,85,43,50,48,54,57>>]},{dd,[],[{p,[],[<<86,97,114,105,111,117,115,32,34,105,115,111,108,97,116,101,34,115>>]}]}]}]},{dt,[],[<<91,58,112,114,105,110,116,58,93>>]},{dd,[],[{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,91,58,103,114,97,112,104,58,93,32,112,108,117,115,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,99,111,110,116,114,111,108,115,44,32,116,104,97,116,32,105,115,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,90,115,32,112,114,111,112,101,114,116,121,46>>]}]},{dt,[],[<<91,58,112,117,110,99,116,58,93>>]},{dd,[],[{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,85,110,105,99,111,100,101,32,80,32,40,112,117,110,99,116,117,97,116,105,111,110,41,32,112,114,111,112,101,114,116,121,44,32,112,108,117,115,32,116,104,111,115,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,108,101,115,115,32,116,104,97,110,32,49,50,56,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,83,32,40,83,121,109,98,111,108,41,32,112,114,111,112,101,114,116,121,46>>]}]}]},{p,[],[<<84,104,101,32,111,116,104,101,114,32,80,79,83,73,88,32,99,108,97,115,115,101,115,32,97,114,101,32,117,110,99,104,97,110,103,101,100,44,32,97,110,100,32,109,97,116,99,104,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,32,112,111,105,110,116,115,32,108,101,115,115,32,116,104,97,110,32,49,50,56,46>>]},{p,[],[{em,[],[<<67,111,109,112,97,116,105,98,105,108,105,116,121,32,70,101,97,116,117,114,101,32,102,111,114,32,87,111,114,100,32,66,111,117,110,100,97,114,105,101,115>>]}]},{p,[],[<<73,110,32,116,104,101,32,80,79,83,73,88,46,50,32,99,111,109,112,108,105,97,110,116,32,108,105,98,114,97,114,121,32,116,104,97,116,32,119,97,115,32,105,110,99,108,117,100,101,100,32,105,110,32,52,46,52,66,83,68,32,85,110,105,120,44,32,116,104,101,32,117,103,108,121,32,115,121,110,116,97,120,32,91,91,58,60,58,93,93,32,97,110,100,32,91,91,58,62,58,93,93,32,105,115,32,117,115,101,100,32,102,111,114,32,109,97,116,99,104,105,110,103,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,97,110,100,32,34,101,110,100,32,111,102,32,119,111,114,100,34,46,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,115,101,32,105,116,101,109,115,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<91,91,58,60,58,93,93>>]},{dd,[],[{p,[],[<<105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,92,98,40,63,61,92,119,41>>]}]},{dt,[],[<<91,91,58,62,58,93,93>>]},{dd,[],[{p,[],[<<105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,92,98,40,63,60,61,92,119,41>>]}]}]},{p,[],[<<79,110,108,121,32,116,104,101,115,101,32,101,120,97,99,116,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,46,32,65,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,32,91,97,91,58,60,58,93,98,93,32,112,114,111,118,111,107,101,115,32,101,114,114,111,114,32,102,111,114,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,80,79,83,73,88,32,99,108,97,115,115,32,110,97,109,101,46,32,84,104,105,115,32,115,117,112,112,111,114,116,32,105,115,32,110,111,116,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,105,115,32,112,114,111,118,105,100,101,100,32,116,111,32,104,101,108,112,32,109,105,103,114,97,116,105,111,110,115,32,102,114,111,109,32,111,116,104,101,114,32,101,110,118,105,114,111,110,109,101,110,116,115,44,32,97,110,100,32,105,115,32,98,101,115,116,32,110,111,116,32,117,115,101,100,32,105,110,32,97,110,121,32,110,101,119,32,112,97,116,116,101,114,110,115,46,32,78,111,116,101,32,116,104,97,116,32,92,98,32,109,97,116,99,104,101,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,97,110,100,32,116,104,101,32,101,110,100,32,111,102,32,97,32,119,111,114,100,32,40,115,101,101,32,34,83,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,34,32,97,98,111,118,101,41,44,32,97,110,100,32,105,110,32,97,32,80,101,114,108,45,115,116,121,108,101,32,112,97,116,116,101,114,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,111,114,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,110,111,114,109,97,108,108,121,32,115,104,111,119,115,32,119,104,105,99,104,32,105,115,32,119,97,110,116,101,100,44,32,119,105,116,104,111,117,116,32,116,104,101,32,110,101,101,100,32,102,111,114,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,97,98,111,118,101,32,105,110,32,111,114,100,101,114,32,116,111,32,103,105,118,101,32,101,120,97,99,116,108,121,32,116,104,101,32,80,79,83,73,88,32,98,101,104,97,118,105,111,117,114,46>>]},{a,[{id,<<115,101,99,116,57>>}],[]},{h2,[],[<<86,101,114,116,105,99,97,108,32,66,97,114>>]},{p,[],[<<86,101,114,116,105,99,97,108,32,98,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,97,108,116,101,114,110,97,116,105,118,101,32,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,34,103,105,108,98,101,114,116,34,32,111,114,32,34,115,117,108,108,105,118,97,110,34,58>>]},{pre,[],[{code,[],[<<103,105,108,98,101,114,116,124,115,117,108,108,105,118,97,110>>]}]},{p,[],[<<65,110,121,32,110,117,109,98,101,114,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,97,112,112,101,97,114,44,32,97,110,100,32,97,110,32,101,109,112,116,121,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,112,101,114,109,105,116,116,101,100,32,40,109,97,116,99,104,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,41,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,114,105,101,115,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,117,114,110,44,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,116,104,97,116,32,115,117,99,99,101,101,100,115,32,105,115,32,117,115,101,100,46,32,73,102,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,100,101,102,105,110,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115>>]},<<41,44,32,34,115,117,99,99,101,101,100,115,34,32,109,101,97,110,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,109,97,105,110,32,112,97,116,116,101,114,110,32,97,110,100,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46>>]},{a,[{id,<<115,101,99,116,49,48>>}],[]},{h2,[],[<<73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103>>]},{p,[],[<<84,104,101,32,115,101,116,116,105,110,103,115,32,111,102,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<44,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<44,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,102,114,111,109,32,119,105,116,104,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,80,101,114,108,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,101,110,99,108,111,115,101,100,32,98,101,116,119,101,101,110,32,34,40,63,34,32,97,110,100,32,34,41,34,46,32,84,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<105>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]}]},{dt,[],[<<109>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]}]},{dt,[],[<<115>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<100,111,116,97,108,108>>]}]},{dt,[],[<<120>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]}]}]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<40,63,105,109,41>>]},<<32,115,101,116,115,32,99,97,115,101,108,101,115,115,44,32,109,117,108,116,105,108,105,110,101,32,109,97,116,99,104,105,110,103,46,32,84,104,101,115,101,32,111,112,116,105,111,110,115,32,99,97,110,32,97,108,115,111,32,98,101,32,117,110,115,101,116,32,98,121,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,108,101,116,116,101,114,32,119,105,116,104,32,97,32,104,121,112,104,101,110,46,32,65,32,99,111,109,98,105,110,101,100,32,115,101,116,116,105,110,103,32,97,110,100,32,117,110,115,101,116,116,105,110,103,32,115,117,99,104,32,97,115,32>>,{code,[],[<<40,63,105,109,45,115,120,41>>]},<<44,32,119,104,105,99,104,32,115,101,116,115,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<32,97,110,100,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<44,32,119,104,105,108,101,32,117,110,115,101,116,116,105,110,103,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<44,32,105,115,32,97,108,115,111,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,97,32,108,101,116,116,101,114,32,97,112,112,101,97,114,115,32,98,111,116,104,32,98,101,102,111,114,101,32,97,110,100,32,97,102,116,101,114,32,116,104,101,32,104,121,112,104,101,110,44,32,116,104,101,32,111,112,116,105,111,110,32,105,115,32,117,110,115,101,116,46>>]},{p,[],[<<84,104,101,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32>>,{code,[],[<<100,117,112,110,97,109,101,115>>]},<<44,32>>,{code,[],[<<117,110,103,114,101,101,100,121>>]},<<44,32,97,110,100,32>>,{code,[],[<<101,120,116,114,97>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32,98,121,32,117,115,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,74,44,32,85,44,32,97,110,100,32,88,32,114,101,115,112,101,99,116,105,118,101,108,121,46>>]},{p,[],[<<87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,111,110,32,99,104,97,110,103,101,115,32,111,99,99,117,114,115,32,97,116,32,116,111,112,45,108,101,118,101,108,32,40,116,104,97,116,32,105,115,44,32,110,111,116,32,105,110,115,105,100,101,32,115,117,98,112,97,116,116,101,114,110,32,112,97,114,101,110,116,104,101,115,101,115,41,44,32,116,104,101,32,99,104,97,110,103,101,32,97,112,112,108,105,101,115,32,116,111,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,116,104,97,116,32,102,111,108,108,111,119,115,46>>]},{p,[],[<<65,110,32,111,112,116,105,111,110,32,99,104,97,110,103,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115>>]},<<41,32,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,97,116,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,102,111,108,108,111,119,115,32,105,116,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,98,99,32,97,110,100,32,97,66,99,32,97,110,100,32,110,111,32,111,116,104,101,114,32,115,116,114,105,110,103,115,32,40,97,115,115,117,109,105,110,103,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<32,105,115,32,110,111,116,32,117,115,101,100,41,58>>]},{pre,[],[{code,[],[<<40,97,40,63,105,41,98,41,99>>]}]},{p,[],[<<66,121,32,116,104,105,115,32,109,101,97,110,115,44,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,109,97,100,101,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,115,101,116,116,105,110,103,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,112,97,114,116,115,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,99,104,97,110,103,101,115,32,109,97,100,101,32,105,110,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,32,100,111,32,99,97,114,114,121,32,111,110,32,105,110,116,111,32,115,117,98,115,101,113,117,101,110,116,32,98,114,97,110,99,104,101,115,32,119,105,116,104,105,110,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,40,63,105,41,98,124,99,41>>]}]},{p,[],[<<109,97,116,99,104,101,115,32,34,97,98,34,44,32,34,97,66,34,44,32,34,99,34,44,32,97,110,100,32,34,67,34,44,32,97,108,116,104,111,117,103,104,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,67,34,32,116,104,101,32,102,105,114,115,116,32,98,114,97,110,99,104,32,105,115,32,97,98,97,110,100,111,110,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,102,102,101,99,116,115,32,111,102,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,115,32,111,99,99,117,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,101,114,101,32,119,111,117,108,100,32,98,101,32,115,111,109,101,32,119,101,105,114,100,32,98,101,104,97,118,105,111,114,32,111,116,104,101,114,119,105,115,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,116,104,101,114,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,119,104,101,110,32,116,104,101,32,99,111,109,112,105,108,105,110,103,32,111,114,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,83,111,109,101,116,105,109,101,115,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,32,115,112,101,99,105,97,108,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,32,40,42,67,82,76,70,41,44,32,116,111,32,111,118,101,114,114,105,100,101,32,119,104,97,116,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,104,97,115,32,115,101,116,32,111,114,32,119,104,97,116,32,104,97,115,32,98,101,101,110,32,100,101,102,97,117,108,116,101,100,46,32,68,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115>>]},<<32,101,97,114,108,105,101,114,46>>]},{p,[],[<<84,104,101,32,40,42,85,84,70,56,41,32,97,110,100,32,40,42,85,67,80,41,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,116,32,85,84,70,32,97,110,100,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,109,111,100,101,115,46,32,84,104,101,121,32,97,114,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,115,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,97,110,100,32>>,{code,[],[<<117,99,112>>]},<<44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,32,105,115,32,97,32,103,101,110,101,114,105,99,32,118,101,114,115,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,110,121,32,111,102,32,116,104,101,32,108,105,98,114,97,114,105,101,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,99,97,110,32,115,101,116,32,111,112,116,105,111,110,32>>,{code,[],[<<110,101,118,101,114,95,117,116,102>>]},<<44,32,119,104,105,99,104,32,108,111,99,107,115,32,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,116,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,115,46>>]}]},{a,[{id,<<115,101,99,116,49,49>>}],[]},{h2,[],[<<83,117,98,112,97,116,116,101,114,110,115>>]},{p,[],[<<83,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,100,101,108,105,109,105,116,101,100,32,98,121,32,112,97,114,101,110,116,104,101,115,101,115,32,40,114,111,117,110,100,32,98,114,97,99,107,101,116,115,41,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,110,101,115,116,101,100,46,32,84,117,114,110,105,110,103,32,112,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,116,119,111,32,116,104,105,110,103,115,58>>]},{dl,[],[{dt,[],[<<49,46>>]},{dd,[],[{p,[],[<<73,116,32,108,111,99,97,108,105,122,101,115,32,97,32,115,101,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,99,97,116,97,114,97,99,116,34,44,32,34,99,97,116,101,114,112,105,108,108,97,114,34,44,32,111,114,32,34,99,97,116,34,58>>]},{pre,[],[{code,[],[<<99,97,116,40,97,114,97,99,116,124,101,114,112,105,108,108,97,114,124,41>>]}]},{p,[],[<<87,105,116,104,111,117,116,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,44,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,99,97,116,97,114,97,99,116,34,44,32,34,101,114,112,105,108,108,97,114,34,44,32,111,114,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,46>>]}]},{dt,[],[<<50,46>>]},{dd,[],[{p,[],[<<73,116,32,115,101,116,115,32,117,112,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,116,104,97,116,32,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,109,97,116,99,104,101,100,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,116,104,114,111,117,103,104,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<46>>]}]}]},{p,[],[<<79,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,40,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,41,32,116,111,32,111,98,116,97,105,110,32,110,117,109,98,101,114,115,32,102,111,114,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,114,101,100,32,107,105,110,103,34,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,114,101,100,32,107,105,110,103,34,44,32,34,114,101,100,34,44,32,97,110,100,32,34,107,105,110,103,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,44,32,50,44,32,97,110,100,32,51,44,32,114,101,115,112,101,99,116,105,118,101,108,121,58>>]},{pre,[],[{code,[],[<<116,104,101,32,40,40,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41>>]}]},{p,[],[<<73,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,104,101,108,112,102,117,108,32,116,104,97,116,32,112,108,97,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,102,117,108,102,105,108,108,32,116,119,111,32,102,117,110,99,116,105,111,110,115,46,32,79,102,116,101,110,32,97,32,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,111,117,116,32,97,32,99,97,112,116,117,114,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,46,32,73,102,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,97,110,100,32,97,32,99,111,108,111,110,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,100,111,32,97,110,121,32,99,97,112,116,117,114,105,110,103,44,32,97,110,100,32,105,115,32,110,111,116,32,99,111,117,110,116,101,100,32,119,104,101,110,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,110,121,32,115,117,98,115,101,113,117,101,110,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,119,104,105,116,101,32,113,117,101,101,110,34,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,119,104,105,116,101,32,113,117,101,101,110,34,32,97,110,100,32,34,113,117,101,101,110,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,32,97,110,100,32,50,58>>]},{pre,[],[{code,[],[<<116,104,101,32,40,40,63,58,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41>>]}]},{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,32,54,53,53,51,53,46>>]},{p,[],[<<65,115,32,97,32,99,111,110,118,101,110,105,101,110,116,32,115,104,111,114,116,104,97,110,100,44,32,105,102,32,97,110,121,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,115,32,97,114,101,32,114,101,113,117,105,114,101,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,34,63,34,32,97,110,100,32,34,58,34,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,116,119,111,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,115,116,114,105,110,103,115,58>>]},{pre,[],[{code,[],[<<40,63,105,58,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41,10,40,63,58,40,63,105,41,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41>>]}]},{p,[],[<<65,115,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,97,114,101,32,116,114,105,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,111,112,116,105,111,110,115,32,97,114,101,32,110,111,116,32,114,101,115,101,116,32,117,110,116,105,108,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,97,99,104,101,100,44,32,97,110,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,105,110,32,111,110,101,32,98,114,97,110,99,104,32,100,111,101,115,32,97,102,102,101,99,116,32,115,117,98,115,101,113,117,101,110,116,32,98,114,97,110,99,104,101,115,44,32,115,111,32,116,104,101,32,97,98,111,118,101,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,98,111,116,104,32,34,83,85,78,68,65,89,34,32,97,110,100,32,34,83,97,116,117,114,100,97,121,34,46>>]},{a,[{id,<<115,101,99,116,49,50>>}],[]},{h2,[],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]},{p,[],[<<80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,97,32,102,101,97,116,117,114,101,32,119,104,101,114,101,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,115,32,102,111,114,32,105,116,115,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,46,32,83,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32>>,{code,[],[<<40,63,124>>]},<<32,97,110,100,32,105,115,32,105,116,115,101,108,102,32,97,32,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,63,124,40,83,97,116,41,117,114,124,40,83,117,110,41,41,100,97,121>>]}]},{p,[],[<<65,115,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,115,105,100,101,32,97,32>>,{code,[],[<<40,63,124>>]},<<32,103,114,111,117,112,44,32,98,111,116,104,32,115,101,116,115,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,111,110,101,46,32,84,104,117,115,44,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,121,111,117,32,99,97,110,32,108,111,111,107,32,97,116,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,110,117,109,98,101,114,32,111,110,101,44,32,119,104,105,99,104,101,118,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,99,111,110,115,116,114,117,99,116,32,105,115,32,117,115,101,102,117,108,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,99,97,112,116,117,114,101,32,97,32,112,97,114,116,44,32,98,117,116,32,110,111,116,32,97,108,108,44,32,111,102,32,111,110,101,32,111,102,32,109,97,110,121,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,110,115,105,100,101,32,97,32>>,{code,[],[<<40,63,124>>]},<<32,103,114,111,117,112,44,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,116,104,101,32,110,117,109,98,101,114,32,105,115,32,114,101,115,101,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,46,32,84,104,101,32,110,117,109,98,101,114,115,32,111,102,32,97,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,102,111,108,108,111,119,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,32,97,102,116,101,114,32,116,104,101,32,104,105,103,104,101,115,116,32,110,117,109,98,101,114,32,117,115,101,100,32,105,110,32,97,110,121,32,98,114,97,110,99,104,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,105,115,32,102,114,111,109,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,59,32,116,104,101,32,110,117,109,98,101,114,115,32,117,110,100,101,114,110,101,97,116,104,32,115,104,111,119,32,105,110,32,119,104,105,99,104,32,98,117,102,102,101,114,32,116,104,101,32,99,97,112,116,117,114,101,100,32,99,111,110,116,101,110,116,32,105,115,32,115,116,111,114,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<35,32,98,101,102,111,114,101,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,98,114,97,110,99,104,45,114,101,115,101,116,45,45,45,45,45,45,45,45,45,45,45,32,97,102,116,101,114,10,47,32,40,32,97,32,41,32,32,40,63,124,32,120,32,40,32,121,32,41,32,122,32,124,32,40,112,32,40,113,41,32,114,41,32,124,32,40,116,41,32,117,32,40,118,41,32,41,32,40,32,122,32,41,32,47,120,10,35,32,49,32,32,32,32,32,32,32,32,32,32,32,32,50,32,32,32,32,32,32,32,32,32,50,32,32,51,32,32,32,32,32,32,32,32,50,32,32,32,32,32,51,32,32,32,32,32,52>>]}]},{p,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,118,97,108,117,101,32,116,104,97,116,32,105,115,32,115,101,116,32,102,111,114,32,116,104,97,116,32,110,117,109,98,101,114,32,98,121,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,111,114,32,34,100,101,102,100,101,102,34,58>>]},{pre,[],[{code,[],[<<47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,92,49,47>>]}]},{p,[],[<<73,110,32,99,111,110,116,114,97,115,116,44,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,114,101,102,101,114,115,32,116,111,32,116,104,101,32,102,105,114,115,116,32,111,110,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,103,105,118,101,110,32,110,117,109,98,101,114,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,111,114,32,34,100,101,102,97,98,99,34,58>>]},{pre,[],[{code,[],[<<47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,40,63,49,41,47>>]}]},{p,[],[<<73,102,32,97,32,99,111,110,100,105,116,105,111,110,32,116,101,115,116,32,102,111,114,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,118,105,110,103,32,109,97,116,99,104,101,100,32,114,101,102,101,114,115,32,116,111,32,97,32,110,111,110,45,117,110,105,113,117,101,32,110,117,109,98,101,114,44,32,116,104,101,32,116,101,115,116,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,118,101,32,109,97,116,99,104,101,100,46>>]},{p,[],[<<65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,117,115,105,110,103,32,116,104,105,115,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,102,101,97,116,117,114,101,32,105,115,32,116,111,32,117,115,101,32,100,117,112,108,105,99,97,116,101,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46>>]},{a,[{id,<<115,101,99,116,49,51>>}],[]},{h2,[],[<<78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115>>]},{p,[],[<<73,100,101,110,116,105,102,121,105,110,103,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,98,121,32,110,117,109,98,101,114,32,105,115,32,115,105,109,112,108,101,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,104,97,114,100,32,116,111,32,107,101,101,112,32,116,114,97,99,107,32,111,102,32,116,104,101,32,110,117,109,98,101,114,115,32,105,110,32,99,111,109,112,108,105,99,97,116,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,46,32,65,108,115,111,44,32,105,102,32,97,110,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,109,111,100,105,102,105,101,100,44,32,116,104,101,32,110,117,109,98,101,114,115,32,99,97,110,32,99,104,97,110,103,101,46,32,84,111,32,104,101,108,112,32,119,105,116,104,32,116,104,105,115,32,100,105,102,102,105,99,117,108,116,121,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,110,97,109,105,110,103,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,32,119,97,115,32,110,111,116,32,97,100,100,101,100,32,116,111,32,80,101,114,108,32,117,110,116,105,108,32,114,101,108,101,97,115,101,32,53,46,49,48,46,32,80,121,116,104,111,110,32,104,97,100,32,116,104,101,32,102,101,97,116,117,114,101,32,101,97,114,108,105,101,114,44,32,97,110,100,32,80,67,82,69,32,105,110,116,114,111,100,117,99,101,100,32,105,116,32,97,116,32,114,101,108,101,97,115,101,32,52,46,48,44,32,117,115,105,110,103,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,67,82,69,32,110,111,119,32,115,117,112,112,111,114,116,115,32,98,111,116,104,32,116,104,101,32,80,101,114,108,32,97,110,100,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,101,114,108,32,97,108,108,111,119,115,32,105,100,101,110,116,105,99,97,108,108,121,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,46>>]},{p,[],[<<73,110,32,80,67,82,69,44,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,110,97,109,101,100,32,105,110,32,111,110,101,32,111,102,32,116,104,114,101,101,32,119,97,121,115,58,32>>,{code,[],[<<40,63,60,110,97,109,101,62,46,46,46,41>>]},<<32,111,114,32>>,{code,[],[<<40,63,39,110,97,109,101,39,46,46,46,41>>]},<<32,97,115,32,105,110,32,80,101,114,108,44,32,111,114,32>>,{code,[],[<<40,63,80,60,110,97,109,101,62,46,46,46,41>>]},<<32,97,115,32,105,110,32,80,121,116,104,111,110,46,32,82,101,102,101,114,101,110,99,101,115,32,116,111,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,102,114,111,109,32,111,116,104,101,114,32,112,97,114,116,115,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,115,117,99,104,32,97,115,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,44,32,114,101,99,117,114,115,105,111,110,44,32,97,110,100,32,99,111,110,100,105,116,105,111,110,115,44,32,99,97,110,32,98,101,32,109,97,100,101,32,98,121,32,110,97,109,101,32,97,110,100,32,98,121,32,110,117,109,98,101,114,46>>]},{p,[],[<<78,97,109,101,115,32,99,111,110,115,105,115,116,32,111,102,32,117,112,32,116,111,32,51,50,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,115,44,32,98,117,116,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,110,111,110,45,100,105,103,105,116,46,32,78,97,109,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,115,116,105,108,108,32,97,108,108,111,99,97,116,101,100,32,110,117,109,98,101,114,115,32,97,115,32,119,101,108,108,32,97,115,32,110,97,109,101,115,44,32,101,120,97,99,116,108,121,32,97,115,32,105,102,32,116,104,101,32,110,97,109,101,115,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,99,97,110,32,117,115,101,32,110,97,109,101,100,32,118,97,108,117,101,115,32,105,102,32,116,104,101,121,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,97,32,110,97,109,101,32,109,117,115,116,32,98,101,32,117,110,105,113,117,101,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,44,32,98,117,116,32,116,104,105,115,32,99,111,110,115,116,114,97,105,110,116,32,99,97,110,32,98,101,32,114,101,108,97,120,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<100,117,112,110,97,109,101,115>>]},<<32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,40,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,32,97,108,119,97,121,115,32,112,101,114,109,105,116,116,101,100,32,102,111,114,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,115,101,116,32,117,112,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41,32,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,112,97,116,116,101,114,110,115,32,119,104,101,114,101,32,111,110,108,121,32,111,110,101,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,109,97,116,99,104,46,32,83,117,112,112,111,115,101,32,116,104,97,116,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,119,101,101,107,100,97,121,44,32,101,105,116,104,101,114,32,97,115,32,97,32,51,45,108,101,116,116,101,114,32,97,98,98,114,101,118,105,97,116,105,111,110,32,111,114,32,97,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,44,32,97,110,100,32,105,110,32,98,111,116,104,32,99,97,115,101,115,32,121,111,117,32,119,97,110,116,32,116,111,32,101,120,116,114,97,99,116,32,116,104,101,32,97,98,98,114,101,118,105,97,116,105,111,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,40,105,103,110,111,114,105,110,103,32,116,104,101,32,108,105,110,101,32,98,114,101,97,107,115,41,32,100,111,101,115,32,116,104,101,32,106,111,98,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<40,63,60,68,78,62,77,111,110,124,70,114,105,124,83,117,110,41,40,63,58,100,97,121,41,63,124,10,40,63,60,68,78,62,84,117,101,41,40,63,58,115,100,97,121,41,63,124,10,40,63,60,68,78,62,87,101,100,41,40,63,58,110,101,115,100,97,121,41,63,124,10,40,63,60,68,78,62,84,104,117,41,40,63,58,114,115,100,97,121,41,63,124,10,40,63,60,68,78,62,83,97,116,41,40,63,58,117,114,100,97,121,41,63>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,102,105,118,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,115,116,114,105,110,103,115,44,32,98,117,116,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,115,101,116,32,97,102,116,101,114,32,97,32,109,97,116,99,104,46,32,40,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,119,97,121,32,111,102,32,115,111,108,118,105,110,103,32,116,104,105,115,32,112,114,111,98,108,101,109,32,105,115,32,116,111,32,117,115,101,32,97,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,115,117,98,112,97,116,116,101,114,110,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41>>]},{p,[],[<<70,111,114,32,99,97,112,116,117,114,105,110,103,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,119,104,105,99,104,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,117,110,105,113,117,101,44,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,111,99,99,117,114,114,101,110,99,101,32,40,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,41,32,105,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32>>,{code,[],[<<118,97,108,117,101,115>>]},<<32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,115,116,97,116,101,109,101,110,116,46,32,84,104,101,32>>,{code,[],[<<97,108,108,95,110,97,109,101,115>>]},<<32,99,97,112,116,117,114,105,110,103,32,118,97,108,117,101,32,109,97,116,99,104,101,115,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<89,111,117,32,99,97,110,110,111,116,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,116,119,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,97,115,32,80,67,82,69,32,117,115,101,115,32,111,110,108,121,32,116,104,101,32,110,117,109,98,101,114,115,32,119,104,101,110,32,109,97,116,99,104,105,110,103,46,32,70,111,114,32,116,104,105,115,32,114,101,97,115,111,110,44,32,97,110,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,105,102,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,115,112,101,99,105,102,121,32,116,104,101,32,115,97,109,101,32,110,97,109,101,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,101,118,101,110,32,119,104,101,110,32>>,{code,[],[<<100,117,112,110,97,109,101,115>>]},<<32,105,115,32,110,111,116,32,115,101,116,46>>]}]},{a,[{id,<<115,101,99,116,49,52>>}],[]},{h2,[],[<<82,101,112,101,116,105,116,105,111,110>>]},{p,[],[<<82,101,112,101,116,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,113,117,97,110,116,105,102,105,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,102,111,108,108,111,119,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,116,101,109,115,58>>]},{ul,[],[{li,[],[<<65,32,108,105,116,101,114,97,108,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114>>]},{li,[],[<<84,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114>>]},{li,[],[<<84,104,101,32,92,67,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101>>]},{li,[],[<<84,104,101,32,92,88,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101>>]},{li,[],[<<84,104,101,32,92,82,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101>>]},{li,[],[<<65,110,32,101,115,99,97,112,101,32,115,117,99,104,32,97,115,32,92,100,32,111,114,32,92,112,76,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114>>]},{li,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115>>]},{li,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41>>]},{li,[],[<<65,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,40,105,110,99,108,117,100,105,110,103,32,97,115,115,101,114,116,105,111,110,115,41>>]},{li,[],[<<65,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,114,101,99,117,114,115,105,118,101,32,111,114,32,111,116,104,101,114,119,105,115,101,41>>]}]},{p,[],[<<84,104,101,32,103,101,110,101,114,97,108,32,114,101,112,101,116,105,116,105,111,110,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,32,109,105,110,105,109,117,109,32,97,110,100,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,101,114,109,105,116,116,101,100,32,109,97,116,99,104,101,115,44,32,98,121,32,103,105,118,105,110,103,32,116,104,101,32,116,119,111,32,110,117,109,98,101,114,115,32,105,110,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,40,98,114,97,99,101,115,41,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,97,32,99,111,109,109,97,46,32,84,104,101,32,110,117,109,98,101,114,115,32,109,117,115,116,32,98,101,32,60,32,54,53,53,51,54,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,109,117,115,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,115,101,99,111,110,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,122,122,34,44,32,34,122,122,122,34,44,32,111,114,32,34,122,122,122,122,34,58>>]},{pre,[],[{code,[],[<<122,123,50,44,52,125>>]}]},{p,[],[<<65,32,99,108,111,115,105,110,103,32,98,114,97,99,101,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,97,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,32,105,115,32,111,109,105,116,116,101,100,44,32,98,117,116,32,116,104,101,32,99,111,109,109,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,114,101,32,105,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,32,97,110,100,32,116,104,101,32,99,111,109,109,97,32,97,114,101,32,98,111,116,104,32,111,109,105,116,116,101,100,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,101,120,97,99,116,32,110,117,109,98,101,114,32,111,102,32,114,101,113,117,105,114,101,100,32,109,97,116,99,104,101,115,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,116,104,114,101,101,32,115,117,99,99,101,115,115,105,118,101,32,118,111,119,101,108,115,44,32,98,117,116,32,99,97,110,32,109,97,116,99,104,32,109,97,110,121,32,109,111,114,101,58>>]},{pre,[],[{code,[],[<<91,97,101,105,111,117,93,123,51,44,125>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,101,120,97,99,116,108,121,32,101,105,103,104,116,32,100,105,103,105,116,115,58>>]},{pre,[],[{code,[],[<<92,100,123,56,125>>]}]},{p,[],[<<65,110,32,111,112,101,110,105,110,103,32,99,117,114,108,121,32,98,114,97,99,107,101,116,32,116,104,97,116,32,97,112,112,101,97,114,115,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,44,32,111,114,32,111,110,101,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,115,121,110,116,97,120,32,111,102,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,123,44,54,125,32,105,115,32,110,111,116,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,111,102,32,102,111,117,114,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,113,117,97,110,116,105,102,105,101,114,115,32,97,112,112,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,114,97,116,104,101,114,32,116,104,97,110,32,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,32,117,110,105,116,115,46,32,84,104,117,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,92,120,123,49,48,48,125,123,50,125,32,109,97,116,99,104,101,115,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,50,45,98,121,116,101,32,115,101,113,117,101,110,99,101,32,105,110,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,46,32,83,105,109,105,108,97,114,108,121,44,32,92,88,123,51,125,32,109,97,116,99,104,101,115,32,116,104,114,101,101,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,32,99,97,110,32,98,101,32,109,97,110,121,32,100,97,116,97,32,117,110,105,116,115,32,108,111,110,103,32,40,97,110,100,32,116,104,101,121,32,99,97,110,32,98,101,32,111,102,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,41,46>>]},{p,[],[<<84,104,101,32,113,117,97,110,116,105,102,105,101,114,32,123,48,125,32,105,115,32,112,101,114,109,105,116,116,101,100,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,116,111,32,98,101,104,97,118,101,32,97,115,32,105,102,32,116,104,101,32,112,114,101,118,105,111,117,115,32,105,116,101,109,32,97,110,100,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,40,98,117,116,32,115,101,101,32,97,108,115,111,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,98,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121>>]},<<41,46,32,73,116,101,109,115,32,111,116,104,101,114,32,116,104,97,110,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,104,97,118,101,32,97,32,123,48,125,32,113,117,97,110,116,105,102,105,101,114,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<70,111,114,32,99,111,110,118,101,110,105,101,110,99,101,44,32,116,104,101,32,116,104,114,101,101,32,109,111,115,116,32,99,111,109,109,111,110,32,113,117,97,110,116,105,102,105,101,114,115,32,104,97,118,101,32,115,105,110,103,108,101,45,99,104,97,114,97,99,116,101,114,32,97,98,98,114,101,118,105,97,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[<<42>>]},{dd,[],[<<69,113,117,105,118,97,108,101,110,116,32,116,111,32,123,48,44,125>>]},{dt,[],[<<43>>]},{dd,[],[<<69,113,117,105,118,97,108,101,110,116,32,116,111,32,123,49,44,125>>]},{dt,[],[<<63>>]},{dd,[],[<<69,113,117,105,118,97,108,101,110,116,32,116,111,32,123,48,44,49,125>>]}]},{p,[],[<<73,110,102,105,110,105,116,101,32,108,111,111,112,115,32,99,97,110,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,32,102,111,108,108,111,119,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,109,97,116,99,104,32,110,111,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,97,32,113,117,97,110,116,105,102,105,101,114,32,116,104,97,116,32,104,97,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,63,41,42>>]}]},{p,[],[<<69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,32,97,110,100,32,80,67,82,69,32,117,115,101,100,32,116,111,32,103,105,118,101,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,102,111,114,32,115,117,99,104,32,112,97,116,116,101,114,110,115,46,32,72,111,119,101,118,101,114,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,44,32,115,117,99,104,32,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,119,32,97,99,99,101,112,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,110,121,32,114,101,112,101,116,105,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,110,111,32,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,108,111,111,112,32,105,115,32,102,111,114,99,105,98,108,121,32,98,114,111,107,101,110,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,34,103,114,101,101,100,121,34,44,32,116,104,97,116,32,105,115,44,32,116,104,101,121,32,109,97,116,99,104,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,32,40,117,112,32,116,111,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,101,114,109,105,116,116,101,100,32,116,105,109,101,115,41,44,32,119,105,116,104,111,117,116,32,99,97,117,115,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,114,101,32,116,104,105,115,32,103,105,118,101,115,32,112,114,111,98,108,101,109,115,32,105,115,32,105,110,32,116,114,121,105,110,103,32,116,111,32,109,97,116,99,104,32,99,111,109,109,101,110,116,115,32,105,110,32,67,32,112,114,111,103,114,97,109,115,46,32,84,104,101,115,101,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,47,42,32,97,110,100,32,42,47,46,32,87,105,116,104,105,110,32,116,104,101,32,99,111,109,109,101,110,116,44,32,105,110,100,105,118,105,100,117,97,108,32,42,32,97,110,100,32,47,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,46,32,65,110,32,97,116,116,101,109,112,116,32,116,111,32,109,97,116,99,104,32,67,32,99,111,109,109,101,110,116,115,32,98,121,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110>>]},{pre,[],[{code,[],[<<47,92,42,46,42,92,42,47>>]}]},{p,[],[<<116,111,32,116,104,101,32,115,116,114,105,110,103>>]},{pre,[],[{code,[],[<<47,42,32,102,105,114,115,116,32,99,111,109,109,101,110,116,32,42,47,32,32,110,111,116,32,99,111,109,109,101,110,116,32,32,47,42,32,115,101,99,111,110,100,32,99,111,109,109,101,110,116,32,42,47>>]}]},{p,[],[<<102,97,105,108,115,44,32,97,115,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,111,119,105,110,103,32,116,111,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,46,42,32,105,116,101,109,46>>]},{p,[],[<<72,111,119,101,118,101,114,44,32,105,102,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,44,32,105,116,32,99,101,97,115,101,115,32,116,111,32,98,101,32,103,114,101,101,100,121,44,32,97,110,100,32,105,110,115,116,101,97,100,32,109,97,116,99,104,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,112,111,115,115,105,98,108,101,44,32,115,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,100,111,101,115,32,116,104,101,32,114,105,103,104,116,32,116,104,105,110,103,32,119,105,116,104,32,116,104,101,32,67,32,99,111,109,109,101,110,116,115,58>>]},{pre,[],[{code,[],[<<47,92,42,46,42,63,92,42,47>>]}]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,118,97,114,105,111,117,115,32,113,117,97,110,116,105,102,105,101,114,115,32,105,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32,99,104,97,110,103,101,100,44,32,111,110,108,121,32,116,104,101,32,112,114,101,102,101,114,114,101,100,32,110,117,109,98,101,114,32,111,102,32,109,97,116,99,104,101,115,46,32,68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,116,104,105,115,32,117,115,101,32,111,102,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,119,105,116,104,32,105,116,115,32,117,115,101,32,97,115,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,110,32,105,116,115,32,111,119,110,32,114,105,103,104,116,46,32,65,115,32,105,116,32,104,97,115,32,116,119,111,32,117,115,101,115,44,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,32,97,112,112,101,97,114,32,100,111,117,98,108,101,100,44,32,97,115,32,105,110>>]},{pre,[],[{code,[],[<<92,100,63,63,92,100>>]}]},{p,[],[<<119,104,105,99,104,32,109,97,116,99,104,101,115,32,111,110,101,32,100,105,103,105,116,32,98,121,32,112,114,101,102,101,114,101,110,99,101,44,32,98,117,116,32,99,97,110,32,109,97,116,99,104,32,116,119,111,32,105,102,32,116,104,97,116,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,103,114,101,101,100,121>>]},<<32,105,115,32,115,101,116,32,40,97,110,32,111,112,116,105,111,110,32,116,104,97,116,32,105,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,80,101,114,108,41,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,105,110,100,105,118,105,100,117,97,108,32,111,110,101,115,32,99,97,110,32,98,101,32,109,97,100,101,32,103,114,101,101,100,121,32,98,121,32,102,111,108,108,111,119,105,110,103,32,116,104,101,109,32,119,105,116,104,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,110,118,101,114,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<87,104,101,110,32,97,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,113,117,97,110,116,105,102,105,101,100,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,114,101,112,101,97,116,32,99,111,117,110,116,32,116,104,97,116,32,105,115,32,62,32,49,32,111,114,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,109,97,120,105,109,117,109,44,32,109,111,114,101,32,109,101,109,111,114,121,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,116,104,101,32,99,111,109,112,105,108,101,100,32,112,97,116,116,101,114,110,44,32,105,110,32,112,114,111,112,111,114,116,105,111,110,32,116,111,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,105,110,105,109,117,109,32,111,114,32,109,97,120,105,109,117,109,46>>]},{p,[],[<<73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,46,42,32,111,114,32,46,123,48,44,125,32,97,110,100,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,40,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,115>>]},<<41,32,105,115,32,115,101,116,44,32,116,104,117,115,32,97,108,108,111,119,105,110,103,32,116,104,101,32,100,111,116,32,116,111,32,109,97,116,99,104,32,110,101,119,108,105,110,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,44,32,98,101,99,97,117,115,101,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,105,115,32,116,114,105,101,100,32,97,103,97,105,110,115,116,32,101,118,101,114,121,32,99,104,97,114,97,99,116,101,114,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,83,111,44,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,114,101,116,114,121,105,110,103,32,116,104,101,32,111,118,101,114,97,108,108,32,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,115,105,116,105,111,110,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,46,32,80,67,82,69,32,110,111,114,109,97,108,108,121,32,116,114,101,97,116,115,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,97,115,32,105,102,32,105,116,32,119,97,115,32,112,114,101,99,101,100,101,100,32,98,121,32,92,65,46>>]},{p,[],[<<73,110,32,99,97,115,101,115,32,119,104,101,114,101,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,115,32,110,111,32,110,101,119,108,105,110,101,115,44,32,105,116,32,105,115,32,119,111,114,116,104,32,115,101,116,116,105,110,103,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,116,111,32,111,98,116,97,105,110,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,44,32,111,114,32,97,108,116,101,114,110,97,116,105,118,101,108,121,32,117,115,105,110,103,32,94,32,116,111,32,105,110,100,105,99,97,116,101,32,97,110,99,104,111,114,105,110,103,32,101,120,112,108,105,99,105,116,108,121,46>>]},{p,[],[<<72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,46,32,87,104,101,110,32,46,42,32,105,115,32,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,115,117,98,106,101,99,116,32,111,102,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,101,108,115,101,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,32,111,110,101,32,115,117,99,99,101,101,100,115,46,32,67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,46,42,41,97,98,99,92,49>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,120,121,122,49,50,51,97,98,99,49,50,51,34,44,32,116,104,101,32,109,97,116,99,104,32,112,111,105,110,116,32,105,115,32,116,104,101,32,102,111,117,114,116,104,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,114,101,102,111,114,101,44,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,46>>]},{p,[],[<<65,110,111,116,104,101,114,32,99,97,115,101,32,119,104,101,114,101,32,105,109,112,108,105,99,105,116,32,97,110,99,104,111,114,105,110,103,32,105,115,32,110,111,116,32,97,112,112,108,105,101,100,32,105,115,32,119,104,101,110,32,116,104,101,32,108,101,97,100,105,110,103,32,46,42,32,105,115,32,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,97,103,97,105,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,32,111,110,101,32,115,117,99,99,101,101,100,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,63,62,46,42,63,97,41,98>>]}]},{p,[],[<<73,116,32,109,97,116,99,104,101,115,32,34,97,98,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,34,97,97,98,34,46,32,84,104,101,32,117,115,101,32,111,102,32,116,104,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,115,32,40,42,80,82,85,78,69,41,32,97,110,100,32,40,42,83,75,73,80,41,32,97,108,115,111,32,100,105,115,97,98,108,101,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,46>>]},{p,[],[<<87,104,101,110,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,112,101,97,116,101,100,44,32,116,104,101,32,118,97,108,117,101,32,99,97,112,116,117,114,101,100,32,105,115,32,116,104,101,32,115,117,98,115,116,114,105,110,103,32,116,104,97,116,32,109,97,116,99,104,101,100,32,116,104,101,32,102,105,110,97,108,32,105,116,101,114,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,102,116,101,114>>]},{pre,[],[{code,[],[<<40,116,119,101,101,100,108,101,91,100,117,109,101,93,123,51,125,92,115,42,41,43>>]}]},{p,[],[<<104,97,115,32,109,97,116,99,104,101,100,32,34,116,119,101,101,100,108,101,100,117,109,32,116,119,101,101,100,108,101,100,101,101,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,32,34,116,119,101,101,100,108,101,100,101,101,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,101,115,116,101,100,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,115,101,116,32,105,110,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,102,116,101,114>>]},{pre,[],[{code,[],[<<47,40,97,124,40,98,41,41,43,47>>]}]},{p,[],[<<109,97,116,99,104,101,115,32,34,97,98,97,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,99,111,110,100,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,32,34,98,34,46>>]},{a,[{id,<<115,101,99,116,49,53>>}],[]},{h2,[],[<<65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115>>]},{p,[],[<<87,105,116,104,32,98,111,116,104,32,109,97,120,105,109,105,122,105,110,103,32,40,34,103,114,101,101,100,121,34,41,32,97,110,100,32,109,105,110,105,109,105,122,105,110,103,32,40,34,117,110,103,114,101,101,100,121,34,32,111,114,32,34,108,97,122,121,34,41,32,114,101,112,101,116,105,116,105,111,110,44,32,102,97,105,108,117,114,101,32,111,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,110,111,114,109,97,108,108,121,32,99,97,117,115,101,115,32,116,104,101,32,114,101,112,101,97,116,101,100,32,105,116,101,109,32,116,111,32,98,101,32,114,101,45,101,118,97,108,117,97,116,101,100,32,116,111,32,115,101,101,32,105,102,32,97,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,32,111,102,32,114,101,112,101,97,116,115,32,97,108,108,111,119,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,46,32,83,111,109,101,116,105,109,101,115,32,105,116,32,105,115,32,117,115,101,102,117,108,32,116,111,32,112,114,101,118,101,110,116,32,116,104,105,115,44,32,101,105,116,104,101,114,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,110,97,116,117,114,101,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,111,114,32,116,111,32,99,97,117,115,101,32,105,116,32,116,111,32,102,97,105,108,32,101,97,114,108,105,101,114,32,116,104,97,110,32,105,116,32,111,116,104,101,114,119,105,115,101,32,109,105,103,104,116,44,32,119,104,101,110,32,116,104,101,32,97,117,116,104,111,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,107,110,111,119,115,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,99,97,114,114,121,105,110,103,32,111,110,46>>]},{p,[],[<<67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,92,100,43,102,111,111,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,117,98,106,101,99,116,32,108,105,110,101,58>>]},{pre,[],[{code,[],[<<49,50,51,52,53,54,98,97,114>>]}]},{p,[],[<<65,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,108,108,32,115,105,120,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,44,32,116,104,101,32,110,111,114,109,97,108,32,97,99,116,105,111,110,32,111,102,32,116,104,101,32,109,97,116,99,104,101,114,32,105,115,32,116,111,32,116,114,121,32,97,103,97,105,110,32,119,105,116,104,32,111,110,108,121,32,102,105,118,101,32,100,105,103,105,116,115,32,109,97,116,99,104,105,110,103,32,105,116,101,109,32,92,100,43,44,32,97,110,100,32,116,104,101,110,32,119,105,116,104,32,102,111,117,114,44,32,97,110,100,32,115,111,32,111,110,44,32,98,101,102,111,114,101,32,117,108,116,105,109,97,116,101,108,121,32,102,97,105,108,105,110,103,46,32,34,65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,34,32,40,97,32,116,101,114,109,32,116,97,107,101,110,32,102,114,111,109,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,98,111,111,107,41,32,112,114,111,118,105,100,101,115,32,116,104,101,32,109,101,97,110,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,97,116,32,111,110,99,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,109,97,116,99,104,101,100,44,32,105,116,32,105,115,32,110,111,116,32,116,111,32,98,101,32,114,101,45,101,118,97,108,117,97,116,101,100,32,105,110,32,116,104,105,115,32,119,97,121,46>>]},{p,[],[<<73,102,32,97,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,105,115,32,117,115,101,100,32,102,111,114,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,103,105,118,101,115,32,117,112,32,105,109,109,101,100,105,97,116,101,108,121,32,111,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,84,104,101,32,110,111,116,97,116,105,111,110,32,105,115,32,97,32,107,105,110,100,32,111,102,32,115,112,101,99,105,97,108,32,112,97,114,101,110,116,104,101,115,105,115,44,32,115,116,97,114,116,105,110,103,32,119,105,116,104,32>>,{code,[],[<<40,63,62>>]},<<32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,63,62,92,100,43,41,102,111,111>>]}]},{p,[],[<<84,104,105,115,32,107,105,110,100,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,34,108,111,99,107,115,32,117,112,34,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,32,99,111,110,116,97,105,110,115,32,111,110,99,101,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,44,32,97,110,100,32,97,32,102,97,105,108,117,114,101,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,118,101,110,116,101,100,32,102,114,111,109,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,112,97,115,116,32,105,116,32,116,111,32,112,114,101,118,105,111,117,115,32,105,116,101,109,115,44,32,104,111,119,101,118,101,114,44,32,119,111,114,107,115,32,97,115,32,110,111,114,109,97,108,46>>]},{p,[],[<<65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,101,115,99,114,105,112,116,105,111,110,32,105,115,32,116,104,97,116,32,97,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,105,115,32,116,121,112,101,32,109,97,116,99,104,101,115,32,116,104,101,32,115,116,114,105,110,103,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,110,32,105,100,101,110,116,105,99,97,108,32,115,116,97,110,100,97,108,111,110,101,32,112,97,116,116,101,114,110,32,119,111,117,108,100,32,109,97,116,99,104,44,32,105,102,32,97,110,99,104,111,114,101,100,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]},{p,[],[<<65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,83,105,109,112,108,101,32,99,97,115,101,115,32,115,117,99,104,32,97,115,32,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,109,97,120,105,109,105,122,105,110,103,32,114,101,112,101,97,116,32,116,104,97,116,32,109,117,115,116,32,115,119,97,108,108,111,119,32,101,118,101,114,121,116,104,105,110,103,32,105,116,32,99,97,110,46,32,83,111,44,32,119,104,105,108,101,32,98,111,116,104,32,92,100,43,32,97,110,100,32,92,100,43,63,32,97,114,101,32,112,114,101,112,97,114,101,100,32,116,111,32,97,100,106,117,115,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,116,104,101,121,32,109,97,116,99,104,32,116,111,32,109,97,107,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,44,32>>,{code,[],[<<40,63,62,92,100,43,41>>]},<<32,99,97,110,32,111,110,108,121,32,109,97,116,99,104,32,97,110,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,46>>]},{p,[],[<<65,116,111,109,105,99,32,103,114,111,117,112,115,32,105,110,32,103,101,110,101,114,97,108,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,99,111,109,112,108,105,99,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,110,100,32,99,97,110,32,98,101,32,110,101,115,116,101,100,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,102,111,114,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,106,117,115,116,32,97,32,115,105,110,103,108,101,32,114,101,112,101,97,116,101,100,32,105,116,101,109,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,97,32,115,105,109,112,108,101,114,32,110,111,116,97,116,105,111,110,44,32,99,97,108,108,101,100,32,97,32,34,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,34,32,99,97,110,32,98,101,32,117,115,101,100,46,32,84,104,105,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,110,32,101,120,116,114,97,32,43,32,99,104,97,114,97,99,116,101,114,32,102,111,108,108,111,119,105,110,103,32,97,32,113,117,97,110,116,105,102,105,101,114,46,32,85,115,105,110,103,32,116,104,105,115,32,110,111,116,97,116,105,111,110,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,97,115>>]},{pre,[],[{code,[],[<<92,100,43,43,102,111,111>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,110,32,101,110,116,105,114,101,32,103,114,111,117,112,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,98,99,124,120,121,122,41,123,50,44,51,125,43>>]}]},{p,[],[<<80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,97,108,119,97,121,115,32,103,114,101,101,100,121,59,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,103,114,101,101,100,121>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,121,32,97,114,101,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,105,109,112,108,101,114,32,102,111,114,109,115,32,111,102,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,116,104,101,32,101,113,117,105,118,97,108,101,110,116,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,98,117,116,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,100,105,102,102,101,114,101,110,99,101,59,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,112,114,111,98,97,98,108,121,32,115,108,105,103,104,116,108,121,32,102,97,115,116,101,114,46>>]},{p,[],[<<84,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,115,121,110,116,97,120,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,116,104,101,32,80,101,114,108,32,53,46,56,32,115,121,110,116,97,120,46,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,32,111,114,105,103,105,110,97,116,101,100,32,116,104,101,32,105,100,101,97,32,40,97,110,100,32,116,104,101,32,110,97,109,101,41,32,105,110,32,116,104,101,32,102,105,114,115,116,32,101,100,105,116,105,111,110,32,111,102,32,104,105,115,32,98,111,111,107,46,32,77,105,107,101,32,77,99,67,108,111,115,107,101,121,32,108,105,107,101,100,32,105,116,44,32,115,111,32,105,109,112,108,101,109,101,110,116,101,100,32,105,116,32,119,104,101,110,32,104,101,32,98,117,105,108,116,32,116,104,101,32,83,117,110,32,74,97,118,97,32,112,97,99,107,97,103,101,44,32,97,110,100,32,80,67,82,69,32,99,111,112,105,101,100,32,105,116,32,102,114,111,109,32,116,104,101,114,101,46,32,73,116,32,117,108,116,105,109,97,116,101,108,121,32,102,111,117,110,100,32,105,116,115,32,119,97,121,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,48,46>>]},{p,[],[<<80,67,82,69,32,104,97,115,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,34,112,111,115,115,101,115,115,105,102,105,101,115,34,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,32,112,97,116,116,101,114,110,32,99,111,110,115,116,114,117,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,115,101,113,117,101,110,99,101,32,65,43,66,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,65,43,43,66,44,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,65,58,115,32,119,104,101,110,32,66,32,109,117,115,116,32,102,111,108,108,111,119,46>>]},{p,[],[<<87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,105,116,115,101,108,102,32,98,101,32,114,101,112,101,97,116,101,100,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,32,116,111,32,97,118,111,105,100,32,115,111,109,101,32,102,97,105,108,105,110,103,32,109,97,116,99,104,101,115,32,116,97,107,105,110,103,32,97,32,108,111,110,103,32,116,105,109,101,46,32,84,104,101,32,112,97,116,116,101,114,110>>]},{pre,[],[{code,[],[<<40,92,68,43,124,60,92,100,43,62,41,42,91,33,63,93>>]}]},{p,[],[<<109,97,116,99,104,101,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,115,117,98,115,116,114,105,110,103,115,32,116,104,97,116,32,101,105,116,104,101,114,32,99,111,110,115,105,115,116,32,111,102,32,110,111,110,45,100,105,103,105,116,115,44,32,111,114,32,100,105,103,105,116,115,32,101,110,99,108,111,115,101,100,32,105,110,32,60,62,44,32,102,111,108,108,111,119,101,100,32,98,121,32,33,32,111,114,32,63,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,44,32,105,116,32,114,117,110,115,32,113,117,105,99,107,108,121,46,32,72,111,119,101,118,101,114,44,32,105,102,32,105,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111>>]},{pre,[],[{code,[],[<<97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97>>]}]},{p,[],[<<105,116,32,116,97,107,101,115,32,97,32,108,111,110,103,32,116,105,109,101,32,98,101,102,111,114,101,32,114,101,112,111,114,116,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,115,116,114,105,110,103,32,99,97,110,32,98,101,32,100,105,118,105,100,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,92,68,43,32,114,101,112,101,97,116,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,42,32,114,101,112,101,97,116,32,105,110,32,109,97,110,121,32,119,97,121,115,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,114,105,101,100,46,32,40,84,104,101,32,101,120,97,109,112,108,101,32,117,115,101,115,32,91,33,63,93,32,114,97,116,104,101,114,32,116,104,97,110,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,97,116,32,116,104,101,32,101,110,100,44,32,97,115,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,104,97,118,101,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,108,108,111,119,115,32,102,111,114,32,102,97,115,116,32,102,97,105,108,117,114,101,32,119,104,101,110,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,114,101,109,101,109,98,101,114,32,116,104,101,32,108,97,115,116,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,97,32,109,97,116,99,104,44,32,97,110,100,32,102,97,105,108,32,101,97,114,108,121,32,105,102,32,105,116,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,46,41,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,117,115,101,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,108,105,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,100,105,103,105,116,115,32,99,97,110,110,111,116,32,98,101,32,98,114,111,107,101,110,44,32,97,110,100,32,102,97,105,108,117,114,101,32,104,97,112,112,101,110,115,32,113,117,105,99,107,108,121,58>>]},{pre,[],[{code,[],[<<40,40,63,62,92,68,43,41,124,60,92,100,43,62,41,42,91,33,63,93>>]}]},{a,[{id,<<115,101,99,116,49,54>>}],[]},{h2,[],[<<66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,62,32,48,32,40,97,110,100,32,112,111,115,115,105,98,108,121,32,102,117,114,116,104,101,114,32,100,105,103,105,116,115,41,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,101,97,114,108,105,101,114,32,40,116,104,97,116,32,105,115,44,32,116,111,32,105,116,115,32,108,101,102,116,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,32,105,115,32,60,32,49,48,44,32,105,116,32,105,115,32,97,108,119,97,121,115,32,116,97,107,101,110,32,97,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,97,110,100,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,116,32,116,104,97,116,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,100,111,32,110,101,101,100,32,110,111,116,32,98,101,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,110,117,109,98,101,114,115,32,60,32,49,48,46,32,65,32,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,110,32,109,97,107,101,32,115,101,110,115,101,32,119,104,101,110,32,97,32,114,101,112,101,116,105,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,32,97,110,100,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,114,105,103,104,116,32,104,97,115,32,112,97,114,116,105,99,105,112,97,116,101,100,32,105,110,32,97,110,32,101,97,114,108,105,101,114,32,105,116,101,114,97,116,105,111,110,46>>]},{p,[],[<<73,116,32,105,115,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,118,101,32,97,32,110,117,109,101,114,105,99,97,108,32,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,119,104,111,115,101,32,110,117,109,98,101,114,32,105,115,32,49,48,32,111,114,32,109,111,114,101,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,44,32,97,115,32,97,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,32,92,53,48,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,104,97,114,97,99,116,101,114,32,100,101,102,105,110,101,100,32,105,110,32,111,99,116,97,108,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,32,98,97,99,107,115,108,97,115,104,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115>>]},<<32,101,97,114,108,105,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,32,115,117,99,104,32,112,114,111,98,108,101,109,32,119,104,101,110,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,117,115,101,100,46,32,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,111,115,115,105,98,108,101,32,117,115,105,110,103,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,40,115,101,101,32,98,101,108,111,119,41,46>>]},{p,[],[<<65,110,111,116,104,101,114,32,119,97,121,32,116,111,32,97,118,111,105,100,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,105,110,104,101,114,101,110,116,32,105,110,32,116,104,101,32,117,115,101,32,111,102,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,32,98,97,99,107,115,108,97,115,104,32,105,115,32,116,111,32,117,115,101,32,116,104,101,32,92,103,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,32,97,114,101,32,105,100,101,110,116,105,99,97,108,58>>]},{pre,[],[{code,[],[<<40,114,105,110,103,41,44,32,92,49,10,40,114,105,110,103,41,44,32,92,103,49,10,40,114,105,110,103,41,44,32,92,103,123,49,125>>]}]},{p,[],[<<65,110,32,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,97,98,115,111,108,117,116,101,32,114,101,102,101,114,101,110,99,101,32,119,105,116,104,111,117,116,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,116,104,97,116,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,111,108,100,101,114,32,115,121,110,116,97,120,46,32,73,116,32,105,115,32,97,108,115,111,32,117,115,101,102,117,108,32,119,104,101,110,32,108,105,116,101,114,97,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,105,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,98,99,40,100,101,102,41,103,104,105,41,92,103,123,45,49,125>>]}]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,32,92,103,123,45,49,125,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,115,116,97,114,116,101,100,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,92,103,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,92,50,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,46,32,83,105,109,105,108,97,114,108,121,44,32,92,103,123,45,50,125,32,119,111,117,108,100,32,98,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,92,49,46,32,84,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,32,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,105,110,32,108,111,110,103,32,112,97,116,116,101,114,110,115,44,32,97,110,100,32,97,108,115,111,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,99,114,101,97,116,101,100,32,98,121,32,106,111,105,110,105,110,103,32,102,114,97,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,114,101,102,101,114,101,110,99,101,115,32,119,105,116,104,105,110,32,116,104,101,109,115,101,108,118,101,115,46>>]},{p,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,119,104,97,116,101,118,101,114,32,109,97,116,99,104,101,100,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,97,116,104,101,114,32,116,104,97,110,32,97,110,121,116,104,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,116,115,101,108,102,32,40,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115>>]},<<32,100,101,115,99,114,105,98,101,115,32,97,32,119,97,121,32,111,102,32,100,111,105,110,103,32,116,104,97,116,41,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58>>]},{pre,[],[{code,[],[<<40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121>>]}]},{p,[],[<<73,102,32,99,97,115,101,102,117,108,32,109,97,116,99,104,105,110,103,32,105,115,32,105,110,32,102,111,114,99,101,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,116,104,101,32,99,97,115,101,32,111,102,32,108,101,116,116,101,114,115,32,105,115,32,114,101,108,101,118,97,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,114,97,104,32,114,97,104,34,32,97,110,100,32,34,82,65,72,32,82,65,72,34,44,32,98,117,116,32,110,111,116,32,34,82,65,72,32,114,97,104,34,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,111,114,105,103,105,110,97,108,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,32,99,97,115,101,108,101,115,115,108,121,58>>]},{pre,[],[{code,[],[<<40,40,63,105,41,114,97,104,41,92,115,43,92,49>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,111,102,32,119,114,105,116,105,110,103,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,101,32,46,78,69,84,32,115,121,110,116,97,120,32>>,{code,[],[<<92,107,123,110,97,109,101,125>>]},<<32,97,110,100,32,116,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32>>,{code,[],[<<92,107,60,110,97,109,101,62>>]},<<32,111,114,32>>,{code,[],[<<92,107,39,110,97,109,101,39>>]},<<32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,115,32,105,115,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,32>>,{code,[],[<<40,63,80,61,110,97,109,101,41>>]},<<46,32,84,104,101,32,117,110,105,102,105,101,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,115,121,110,116,97,120,32,105,110,32,80,101,114,108,32,53,46,49,48,44,32,105,110,32,119,104,105,99,104,32,92,103,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,98,111,116,104,32,110,117,109,101,114,105,99,32,97,110,100,32,110,97,109,101,100,32,114,101,102,101,114,101,110,99,101,115,44,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,84,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,119,97,121,115,58>>]},{pre,[],[{code,[],[<<40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,107,60,112,49,62,10,40,63,39,112,49,39,40,63,105,41,114,97,104,41,92,115,43,92,107,123,112,49,125,10,40,63,80,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,40,63,80,61,112,49,41,10,40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,103,123,112,49,125>>]}]},{p,[],[<<65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32,110,97,109,101,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,111,114,32,97,102,116,101,114,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46>>]},{p,[],[<<84,104,101,114,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,110,111,116,32,98,101,101,110,32,117,115,101,100,32,105,110,32,97,32,112,97,114,116,105,99,117,108,97,114,32,109,97,116,99,104,44,32,97,110,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,105,116,32,97,108,119,97,121,115,32,102,97,105,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,102,97,105,108,115,32,105,102,32,105,116,32,115,116,97,114,116,115,32,116,111,32,109,97,116,99,104,32,34,97,34,32,114,97,116,104,101,114,32,116,104,97,110,32,34,98,99,34,58>>]},{pre,[],[{code,[],[<<40,97,124,40,98,99,41,41,92,50>>]}]},{p,[],[<<65,115,32,116,104,101,114,101,32,99,97,110,32,98,101,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,108,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,32,97,114,101,32,116,97,107,101,110,32,97,115,32,112,97,114,116,32,111,102,32,97,32,112,111,116,101,110,116,105,97,108,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,110,117,109,98,101,114,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,111,110,116,105,110,117,101,115,32,119,105,116,104,32,97,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,44,32,115,111,109,101,32,100,101,108,105,109,105,116,101,114,32,109,117,115,116,32,98,101,32,117,115,101,100,32,116,111,32,116,101,114,109,105,110,97,116,101,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,105,115,32,115,101,116,44,32,116,104,105,115,32,99,97,110,32,98,101,32,119,104,105,116,101,115,112,97,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,110,32,101,109,112,116,121,32,99,111,109,109,101,110,116,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,57>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,111,109,109,101,110,116,115>>]},<<41,32,99,97,110,32,98,101,32,117,115,101,100,46>>]},{p,[],[{em,[],[<<82,101,99,117,114,115,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]}]},{p,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,32,102,97,105,108,115,32,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,102,105,114,115,116,32,117,115,101,100,44,32,115,111,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,40,97,92,49,41,32,110,101,118,101,114,32,109,97,116,99,104,101,115,46,32,72,111,119,101,118,101,114,44,32,115,117,99,104,32,114,101,102,101,114,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,105,110,115,105,100,101,32,114,101,112,101,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,34,97,34,115,32,97,110,100,32,97,108,115,111,32,34,97,98,97,34,44,32,34,97,98,97,98,98,97,97,34,44,32,97,110,100,32,115,111,32,111,110,58>>]},{pre,[],[{code,[],[<<40,97,124,98,92,49,41,43>>]}]},{p,[],[<<65,116,32,101,97,99,104,32,105,116,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,46,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,44,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,98,101,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,105,116,101,114,97,116,105,111,110,32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,100,111,110,101,32,117,115,105,110,103,32,97,108,116,101,114,110,97,116,105,111,110,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,111,114,32,98,121,32,97,32,113,117,97,110,116,105,102,105,101,114,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,111,102,32,122,101,114,111,46>>]},{p,[],[<<66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,117,115,101,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,121,32,114,101,102,101,114,101,110,99,101,32,116,111,32,98,101,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,116,104,101,32,119,104,111,108,101,32,103,114,111,117,112,32,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,99,97,110,110,111,116,32,99,97,117,115,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,116,104,101,32,109,105,100,100,108,101,32,111,102,32,116,104,101,32,103,114,111,117,112,46>>]},{a,[{id,<<115,101,99,116,49,55>>}],[]},{h2,[],[<<65,115,115,101,114,116,105,111,110,115>>]},{p,[],[<<65,110,32,97,115,115,101,114,116,105,111,110,32,105,115,32,97,32,116,101,115,116,32,111,110,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,102,111,108,108,111,119,105,110,103,32,111,114,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,115,117,109,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,32,99,111,100,101,100,32,97,115,32,92,98,44,32,92,66,44,32,92,65,44,32,92,71,44,32,92,90,44,32,92,122,44,32,94,44,32,97,110,100,32,36,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,115,46>>]},{p,[],[<<77,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,99,111,100,101,100,32,97,115,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,101,114,101,32,97,114,101,32,116,119,111,32,107,105,110,100,115,58,32,116,104,111,115,101,32,116,104,97,116,32,108,111,111,107,32,97,104,101,97,100,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,32,108,111,111,107,32,98,101,104,105,110,100,32,105,116,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,32,105,110,32,116,104,101,32,110,111,114,109,97,108,32,119,97,121,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,116,111,32,98,101,32,99,104,97,110,103,101,100,46>>]},{p,[],[<<65,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,73,102,32,115,117,99,104,32,97,110,32,97,115,115,101,114,116,105,111,110,32,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,105,110,32,105,116,44,32,116,104,101,115,101,32,97,114,101,32,99,111,117,110,116,101,100,32,102,111,114,32,116,104,101,32,112,117,114,112,111,115,101,115,32,111,102,32,110,117,109,98,101,114,105,110,103,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,115,117,98,115,116,114,105,110,103,32,99,97,112,116,117,114,105,110,103,32,105,115,32,100,111,110,101,32,111,110,108,121,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,40,80,101,114,108,32,115,111,109,101,116,105,109,101,115,44,32,98,117,116,32,110,111,116,32,97,108,119,97,121,115,44,32,112,101,114,102,111,114,109,115,32,99,97,112,116,117,114,105,110,103,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,41>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,102,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,111,110,101,32,111,114,32,109,111,114,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,115,117,99,99,101,101,100,115,44,32,98,117,116,32,102,97,105,108,117,114,101,32,116,111,32,109,97,116,99,104,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,118,101,114,32,116,104,105,115,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,99,97,112,116,117,114,101,115,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,101,116,32,111,110,108,121,32,105,102,32,110,111,32,104,105,103,104,101,114,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,101,115,32,97,114,101,32,97,108,114,101,97,100,121,32,115,101,116,46,32,84,104,105,115,32,105,115,44,32,117,110,102,111,114,116,117,110,97,116,101,108,121,44,32,97,32,102,117,110,100,97,109,101,110,116,97,108,32,108,105,109,105,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,97,115,32,80,67,82,69,49,32,105,115,32,110,111,119,32,105,110,32,109,97,105,110,116,101,110,97,110,99,101,45,111,110,108,121,32,115,116,97,116,117,115,44,32,105,116,32,105,115,32,117,110,108,105,107,101,108,121,32,101,118,101,114,32,116,111,32,99,104,97,110,103,101,46>>]}]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,114,101,112,101,97,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,116,32,109,97,107,101,115,32,110,111,32,115,101,110,115,101,32,116,111,32,97,115,115,101,114,116,32,116,104,101,32,115,97,109,101,32,116,104,105,110,103,32,109,97,110,121,32,116,105,109,101,115,44,32,116,104,101,32,115,105,100,101,32,101,102,102,101,99,116,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,111,99,99,97,115,105,111,110,97,108,108,121,32,98,101,32,117,115,101,102,117,108,46,32,73,110,32,112,114,97,99,116,105,99,101,44,32,116,104,101,114,101,32,97,114,101,32,111,110,108,121,32,116,104,114,101,101,32,99,97,115,101,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,123,48,125,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,32,110,101,118,101,114,32,111,98,101,121,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46,32,72,111,119,101,118,101,114,44,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,105,110,116,101,114,110,97,108,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,103,114,111,117,112,115,32,116,104,97,116,32,97,114,101,32,99,97,108,108,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,116,104,114,111,117,103,104,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,101,99,104,97,110,105,115,109,46>>]}]},{li,[],[{p,[],[<<73,102,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,123,48,44,110,125,44,32,119,104,101,114,101,32,110,32,62,32,48,44,32,105,116,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,105,102,32,105,116,32,119,97,115,32,123,48,44,49,125,46,32,65,116,32,114,117,110,116,105,109,101,44,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,105,115,32,116,114,105,101,100,32,119,105,116,104,32,97,110,100,32,119,105,116,104,111,117,116,32,116,104,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,111,114,100,101,114,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,46>>]}]},{li,[],[{p,[],[<<73,102,32,116,104,101,32,109,105,110,105,109,117,109,32,114,101,112,101,116,105,116,105,111,110,32,105,115,32,62,32,48,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,32,111,98,101,121,101,100,32,111,110,108,121,32,111,110,99,101,32,119,104,101,110,32,101,110,99,111,117,110,116,101,114,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46>>]}]}]},{p,[],[{em,[],[<<76,111,111,107,97,104,101,97,100,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<76,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,33,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,32,119,111,114,100,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,115,101,109,105,99,111,108,111,110,44,32,98,117,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,115,101,109,105,99,111,108,111,110,32,105,110,32,116,104,101,32,109,97,116,99,104,58>>]},{pre,[],[{code,[],[<<92,119,43,40,63,61,59,41>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,102,111,111,34,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,34,98,97,114,34,58>>]},{pre,[],[{code,[],[<<102,111,111,40,63,33,98,97,114,41>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,112,112,97,114,101,110,116,108,121,32,115,105,109,105,108,97,114,32,112,97,116,116,101,114,110>>]},{pre,[],[{code,[],[<<40,63,33,102,111,111,41,98,97,114>>]}]},{p,[],[<<100,111,101,115,32,110,111,116,32,102,105,110,100,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,115,111,109,101,116,104,105,110,103,32,111,116,104,101,114,32,116,104,97,110,32,34,102,111,111,34,46,32,73,116,32,102,105,110,100,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,119,104,97,116,115,111,101,118,101,114,44,32,97,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,40,63,33,102,111,111,41,32,105,115,32,97,108,119,97,121,115,32,116,114,117,101,32,119,104,101,110,32,116,104,101,32,110,101,120,116,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,34,98,97,114,34,46,32,65,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,105,115,32,110,101,101,100,101,100,32,116,111,32,97,99,104,105,101,118,101,32,116,104,101,32,111,116,104,101,114,32,101,102,102,101,99,116,46>>]},{p,[],[<<73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,102,111,114,99,101,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,97,116,32,115,111,109,101,32,112,111,105,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,109,111,115,116,32,99,111,110,118,101,110,105,101,110,116,32,119,97,121,32,116,111,32,100,111,32,105,116,32,105,115,32,119,105,116,104,32,40,63,33,41,44,32,97,115,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,46,32,83,111,44,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,114,101,113,117,105,114,101,115,32,116,104,101,114,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,117,115,116,32,97,108,119,97,121,115,32,102,97,105,108,46,32,84,104,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,32,40,42,70,65,73,76,41,32,111,114,32,40,42,70,41,32,105,115,32,97,32,115,121,110,111,110,121,109,32,102,111,114,32,40,63,33,41,46>>]},{p,[],[{em,[],[<<76,111,111,107,98,101,104,105,110,100,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<76,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,60,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,60,33,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,110,100,115,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,34,102,111,111,34,58>>]},{pre,[],[{code,[],[<<40,63,60,33,102,111,111,41,98,97,114>>]}]},{p,[],[<<84,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,117,99,104,32,116,104,97,116,32,97,108,108,32,116,104,101,32,115,116,114,105,110,103,115,32,105,116,32,109,97,116,99,104,101,115,32,109,117,115,116,32,104,97,118,101,32,97,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,109,97,110,121,32,116,111,112,45,108,101,118,101,108,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,116,104,101,121,32,100,111,32,110,111,116,32,97,108,108,32,104,97,118,101,32,116,111,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,112,101,114,109,105,116,116,101,100,58>>]},{pre,[],[{code,[],[<<40,63,60,61,98,117,108,108,111,99,107,124,100,111,110,107,101,121,41>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,58>>]},{pre,[],[{code,[],[<<40,63,60,33,100,111,103,115,63,124,99,97,116,115,63,41>>]}]},{p,[],[<<66,114,97,110,99,104,101,115,32,116,104,97,116,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,84,104,105,115,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,80,101,114,108,44,32,119,104,105,99,104,32,114,101,113,117,105,114,101,115,32,97,108,108,32,98,114,97,110,99,104,101,115,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,108,101,110,103,116,104,32,111,102,32,115,116,114,105,110,103,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,99,104,32,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,44,32,97,115,32,105,116,115,32,115,105,110,103,108,101,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,32,99,97,110,32,109,97,116,99,104,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,58>>]},{pre,[],[{code,[],[<<40,63,60,61,97,98,40,99,124,100,101,41,41>>]}]},{p,[],[<<72,111,119,101,118,101,114,44,32,105,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,116,111,32,80,67,82,69,32,105,102,32,114,101,119,114,105,116,116,101,110,32,116,111,32,117,115,101,32,116,119,111,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,101,115,58>>]},{pre,[],[{code,[],[<<40,63,60,61,97,98,99,124,97,98,100,101,41>>]}]},{p,[],[<<83,111,109,101,116,105,109,101,115,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,75,32,40,115,101,101,32,97,98,111,118,101,41,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,116,111,32,103,101,116,32,114,111,117,110,100,32,116,104,101,32,102,105,120,101,100,45,108,101,110,103,116,104,32,114,101,115,116,114,105,99,116,105,111,110,46>>]},{p,[],[<<84,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,44,32,102,111,114,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,111,32,109,111,118,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,98,97,99,107,32,116,101,109,112,111,114,97,114,105,108,121,32,98,121,32,116,104,101,32,102,105,120,101,100,32,108,101,110,103,116,104,32,97,110,100,32,116,104,101,110,32,116,114,121,32,116,111,32,109,97,116,99,104,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,105,110,115,117,102,102,105,99,105,101,110,116,32,99,104,97,114,97,99,116,101,114,115,32,98,101,102,111,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,102,97,105,108,115,46>>]},{p,[],[<<73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,116,104,101,32,92,67,32,101,115,99,97,112,101,32,40,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,100,97,116,97,32,117,110,105,116,32,101,118,101,110,32,105,110,32,97,32,85,84,70,32,109,111,100,101,41,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,44,32,97,115,32,105,116,32,109,97,107,101,115,32,105,116,32,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,111,111,107,98,101,104,105,110,100,46,32,84,104,101,32,92,88,32,97,110,100,32,92,82,32,101,115,99,97,112,101,115,44,32,119,104,105,99,104,32,99,97,110,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,115,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,101,105,116,104,101,114,46>>]},{p,[],[<<34,83,117,98,114,111,117,116,105,110,101,34,32,99,97,108,108,115,32,40,115,101,101,32,98,101,108,111,119,41,44,32,115,117,99,104,32,97,115,32,40,63,50,41,32,111,114,32,40,63,38,88,41,44,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,108,111,111,107,98,101,104,105,110,100,115,44,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,46,32,82,101,99,117,114,115,105,111,110,44,32,104,111,119,101,118,101,114,44,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46>>]},{p,[],[<<80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,116,111,32,115,112,101,99,105,102,121,32,101,102,102,105,99,105,101,110,116,32,109,97,116,99,104,105,110,103,32,111,102,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,105,109,112,108,101,32,112,97,116,116,101,114,110,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,97,32,108,111,110,103,32,115,116,114,105,110,103,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,58>>]},{pre,[],[{code,[],[<<97,98,99,100,36>>]}]},{p,[],[<<65,115,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,101,100,115,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,80,67,82,69,32,108,111,111,107,115,32,102,111,114,32,101,97,99,104,32,34,97,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,97,110,100,32,116,104,101,110,32,115,101,101,115,32,105,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,109,97,116,99,104,101,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115>>]},{pre,[],[{code,[],[<<94,46,42,97,98,99,100,36>>]}]},{p,[],[<<116,104,101,32,105,110,105,116,105,97,108,32,46,42,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,97,116,32,102,105,114,115,116,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,105,115,32,102,97,105,108,115,32,40,97,115,32,116,104,101,114,101,32,105,115,32,110,111,32,102,111,108,108,111,119,105,110,103,32,34,97,34,41,44,32,105,116,32,98,97,99,107,116,114,97,99,107,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,44,32,116,104,101,110,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,97,110,100,32,115,111,32,111,110,46,32,79,110,99,101,32,97,103,97,105,110,32,116,104,101,32,115,101,97,114,99,104,32,102,111,114,32,34,97,34,32,99,111,118,101,114,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,44,32,102,114,111,109,32,114,105,103,104,116,32,116,111,32,108,101,102,116,44,32,115,111,32,119,101,32,97,114,101,32,110,111,32,98,101,116,116,101,114,32,111,102,102,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,97,115>>]},{pre,[],[{code,[],[<<94,46,42,43,40,63,60,61,97,98,99,100,41>>]}]},{p,[],[<<116,104,101,114,101,32,99,97,110,32,98,101,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,102,111,114,32,116,104,101,32,46,42,43,32,105,116,101,109,59,32,105,116,32,99,97,110,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,46,32,84,104,101,32,115,117,98,115,101,113,117,101,110,116,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,97,32,115,105,110,103,108,101,32,116,101,115,116,32,111,110,32,116,104,101,32,108,97,115,116,32,102,111,117,114,32,99,104,97,114,97,99,116,101,114,115,46,32,73,102,32,105,116,32,102,97,105,108,115,44,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,32,105,109,109,101,100,105,97,116,101,108,121,46,32,70,111,114,32,108,111,110,103,32,115,116,114,105,110,103,115,44,32,116,104,105,115,32,97,112,112,114,111,97,99,104,32,109,97,107,101,115,32,97,32,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,105,110,103,32,116,105,109,101,46>>]},{p,[],[{em,[],[<<85,115,105,110,103,32,77,117,108,116,105,112,108,101,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<77,97,110,121,32,97,115,115,101,114,116,105,111,110,115,32,40,111,102,32,97,110,121,32,115,111,114,116,41,32,99,97,110,32,111,99,99,117,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58>>]},{pre,[],[{code,[],[<<40,63,60,61,92,100,123,51,125,41,40,63,60,33,57,57,57,41,102,111,111>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,101,97,99,104,32,111,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,97,112,112,108,105,101,100,32,105,110,100,101,112,101,110,100,101,110,116,108,121,32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,70,105,114,115,116,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,112,114,101,118,105,111,117,115,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,108,108,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,109,97,116,99,104,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,102,105,114,115,116,32,111,102,32,119,104,105,99,104,32,97,114,101,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,32,108,97,115,116,32,116,104,114,101,101,32,111,102,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,49,50,51,97,98,99,102,111,111,34,46,32,65,32,112,97,116,116,101,114,110,32,116,111,32,100,111,32,116,104,97,116,32,105,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{pre,[],[{code,[],[<<40,63,60,61,92,100,123,51,125,46,46,46,41,40,63,60,33,57,57,57,41,102,111,111>>]}]},{p,[],[<<84,104,105,115,32,116,105,109,101,32,116,104,101,32,102,105,114,115,116,32,97,115,115,101,114,116,105,111,110,32,108,111,111,107,115,32,97,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,116,104,114,101,101,32,97,114,101,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,32,115,101,99,111,110,100,32,97,115,115,101,114,116,105,111,110,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46>>]},{p,[],[<<65,115,115,101,114,116,105,111,110,115,32,99,97,110,32,98,101,32,110,101,115,116,101,100,32,105,110,32,97,110,121,32,99,111,109,98,105,110,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,122,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,34,98,97,114,34,44,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,34,102,111,111,34,58>>]},{pre,[],[{code,[],[<<40,63,60,61,40,63,60,33,102,111,111,41,98,97,114,41,98,97,122>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,97,110,100,32,97,110,121,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58>>]},{pre,[],[{code,[],[<<40,63,60,61,92,100,123,51,125,40,63,33,57,57,57,41,46,46,46,41,102,111,111>>]}]},{a,[{id,<<115,101,99,116,49,56>>}],[]},{h2,[],[<<67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115>>]},{p,[],[<<73,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,99,97,117,115,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,111,32,111,98,101,121,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,111,110,100,105,116,105,111,110,97,108,108,121,32,111,114,32,116,111,32,99,104,111,111,115,101,32,98,101,116,119,101,101,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,32,115,117,98,112,97,116,116,101,114,110,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,110,32,97,115,115,101,114,116,105,111,110,44,32,111,114,32,119,104,101,116,104,101,114,32,97,32,115,112,101,99,105,102,105,99,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,108,114,101,97,100,121,32,98,101,101,110,32,109,97,116,99,104,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,116,119,111,32,112,111,115,115,105,98,108,101,32,102,111,114,109,115,32,111,102,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,41,10,40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,124,110,111,45,112,97,116,116,101,114,110,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,115,97,116,105,115,102,105,101,100,44,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,110,111,45,112,97,116,116,101,114,110,32,40,105,102,32,112,114,101,115,101,110,116,41,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,101,120,105,115,116,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,69,97,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,105,116,115,101,108,102,32,99,111,110,116,97,105,110,32,110,101,115,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,97,110,121,32,102,111,114,109,44,32,105,110,99,108,117,100,105,110,103,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,115,59,32,116,104,101,32,114,101,115,116,114,105,99,116,105,111,110,32,116,111,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,108,101,118,101,108,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,119,104,101,114,101,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,99,111,109,112,108,101,120,58>>]},{pre,[],[{code,[],[<<40,63,40,49,41,32,40,65,124,66,124,67,41,32,124,32,40,68,32,124,32,40,63,40,50,41,69,124,70,41,32,124,32,69,41,32,41>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,102,111,117,114,32,107,105,110,100,115,32,111,102,32,99,111,110,100,105,116,105,111,110,58,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,44,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,114,101,99,117,114,115,105,111,110,44,32,97,32,112,115,101,117,100,111,45,99,111,110,100,105,116,105,111,110,32,99,97,108,108,101,100,32,68,69,70,73,78,69,44,32,97,110,100,32,97,115,115,101,114,116,105,111,110,115,46>>]},{p,[],[{em,[],[<<67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,117,109,98,101,114>>]}]},{p,[],[<<73,102,32,116,104,101,32,116,101,120,116,32,98,101,116,119,101,101,110,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,115,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,32,101,120,105,115,116,115,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]},<<32,101,97,114,108,105,101,114,41,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,109,32,104,97,118,101,32,109,97,116,99,104,101,100,46,32,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,110,111,116,97,116,105,111,110,32,105,115,32,116,111,32,112,114,101,99,101,100,101,32,116,104,101,32,100,105,103,105,116,115,32,119,105,116,104,32,97,32,112,108,117,115,32,111,114,32,109,105,110,117,115,32,115,105,103,110,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,110,117,109,98,101,114,32,105,115,32,114,101,108,97,116,105,118,101,32,114,97,116,104,101,114,32,116,104,97,110,32,97,98,115,111,108,117,116,101,46,32,84,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32,40,63,40,45,49,41,44,32,116,104,101,32,110,101,120,116,32,109,111,115,116,32,114,101,99,101,110,116,32,98,121,32,40,63,40,45,50,41,44,32,97,110,100,32,115,111,32,111,110,46,32,73,110,115,105,100,101,32,108,111,111,112,115,44,32,105,116,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,115,101,110,115,101,32,116,111,32,114,101,102,101,114,32,116,111,32,115,117,98,115,101,113,117,101,110,116,32,103,114,111,117,112,115,46,32,84,104,101,32,110,101,120,116,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,98,101,32,111,112,101,110,101,100,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,40,63,40,43,49,41,44,32,97,110,100,32,115,111,32,111,110,46,32,40,84,104,101,32,118,97,108,117,101,32,122,101,114,111,32,105,110,32,97,110,121,32,111,102,32,116,104,101,115,101,32,102,111,114,109,115,32,105,115,32,110,111,116,32,117,115,101,100,59,32,105,116,32,112,114,111,118,111,107,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,41>>]},{p,[],[<<67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,111,110,116,97,105,110,115,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,32,116,111,32,109,97,107,101,32,105,116,32,109,111,114,101,32,114,101,97,100,97,98,108,101,32,40,97,115,115,117,109,101,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<41,32,97,110,100,32,116,111,32,100,105,118,105,100,101,32,105,116,32,105,110,116,111,32,116,104,114,101,101,32,112,97,114,116,115,32,102,111,114,32,101,97,115,101,32,111,102,32,100,105,115,99,117,115,115,105,111,110,58>>]},{pre,[],[{code,[],[<<40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,49,41,32,92,41,32,41>>]}]},{p,[],[<<84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,97,110,100,32,105,102,32,116,104,97,116,32,99,104,97,114,97,99,116,101,114,32,105,115,32,112,114,101,115,101,110,116,44,32,115,101,116,115,32,105,116,32,97,115,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,112,97,114,116,32,109,97,116,99,104,101,115,32,111,110,101,32,111,114,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,101,110,116,104,101,115,101,115,46,32,84,104,101,32,116,104,105,114,100,32,112,97,114,116,32,105,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,102,105,114,115,116,32,115,101,116,32,111,102,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,101,100,32,111,114,32,110,111,116,46,32,73,102,32,116,104,101,121,32,100,105,100,44,32,116,104,97,116,32,105,115,44,32,105,102,32,115,117,98,106,101,99,116,32,115,116,97,114,116,101,100,32,119,105,116,104,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,44,32,97,110,100,32,115,111,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,101,120,101,99,117,116,101,100,32,97,110,100,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,114,101,113,117,105,114,101,100,46,32,79,116,104,101,114,119,105,115,101,44,32,97,115,32,110,111,45,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,110,111,116,104,105,110,103,46,32,84,104,97,116,32,105,115,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<73,102,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,101,109,98,101,100,100,101,100,32,105,110,32,97,32,108,97,114,103,101,114,32,111,110,101,44,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,58>>]},{pre,[],[{code,[],[<<46,46,46,111,116,104,101,114,32,115,116,117,102,102,46,46,46,32,40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,45,49,41,32,92,41,32,41,32,46,46,46>>]}]},{p,[],[<<84,104,105,115,32,109,97,107,101,115,32,116,104,101,32,102,114,97,103,109,101,110,116,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,46>>]},{p,[],[{em,[],[<<67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,97,109,101>>]}]},{p,[],[<<80,101,114,108,32,117,115,101,115,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,60,110,97,109,101,62,41,46,46,46,41,32,111,114,32,40,63,40,39,110,97,109,101,39,41,46,46,46,41,32,116,111,32,116,101,115,116,32,102,111,114,32,97,32,117,115,101,100,32,115,117,98,112,97,116,116,101,114,110,32,98,121,32,110,97,109,101,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,67,82,69,44,32,119,104,105,99,104,32,104,97,100,32,116,104,105,115,32,102,97,99,105,108,105,116,121,32,98,101,102,111,114,101,32,80,101,114,108,44,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,110,97,109,101,41,46,46,46,41,32,105,115,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,100,46>>]},{p,[],[<<82,101,119,114,105,116,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,116,111,32,117,115,101,32,97,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,103,105,118,101,115,58>>]},{pre,[],[{code,[],[<<40,63,60,79,80,69,78,62,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,60,79,80,69,78,62,41,32,92,41,32,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,104,97,115,32,109,97,116,99,104,101,100,46>>]},{p,[],[{em,[],[<<67,104,101,99,107,105,110,103,32,102,111,114,32,80,97,116,116,101,114,110,32,82,101,99,117,114,115,105,111,110>>]}]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,82,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,82,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,32,111,114,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,73,102,32,100,105,103,105,116,115,32,111,114,32,97,32,110,97,109,101,32,112,114,101,99,101,100,101,100,32,98,121,32,97,109,112,101,114,115,97,110,100,32,102,111,108,108,111,119,32,116,104,101,32,108,101,116,116,101,114,32,82,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,63,40,82,51,41,46,46,46,41,32,111,114,32,40,63,40,82,38,110,97,109,101,41,46,46,46,41>>]}]},{p,[],[<<116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,32,105,115,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,119,104,111,115,101,32,110,117,109,98,101,114,32,111,114,32,110,97,109,101,32,105,115,32,103,105,118,101,110,46,32,84,104,105,115,32,99,111,110,100,105,116,105,111,110,32,100,111,101,115,32,110,111,116,32,99,104,101,99,107,32,116,104,101,32,101,110,116,105,114,101,32,114,101,99,117,114,115,105,111,110,32,115,116,97,99,107,46,32,73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,46>>]},{p,[],[<<65,116,32,34,116,111,112,45,108,101,118,101,108,34,44,32,97,108,108,32,116,104,101,115,101,32,114,101,99,117,114,115,105,111,110,32,116,101,115,116,32,99,111,110,100,105,116,105,111,110,115,32,97,114,101,32,102,97,108,115,101,46,32,84,104,101,32,115,121,110,116,97,120,32,102,111,114,32,114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46>>]},{p,[],[{em,[],[<<68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,66,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121>>]}]},{a,[{id,<<100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115>>}],[]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,68,69,70,73,78,69,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,68,69,70,73,78,69,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,108,119,97,121,115,32,102,97,108,115,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,111,110,108,121,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,116,32,105,115,32,97,108,119,97,121,115,32,115,107,105,112,112,101,100,32,105,102,32,99,111,110,116,114,111,108,32,114,101,97,99,104,101,115,32,116,104,105,115,32,112,111,105,110,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,105,100,101,97,32,111,102,32,68,69,70,73,78,69,32,105,115,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,102,105,110,101,32,34,115,117,98,114,111,117,116,105,110,101,115,34,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,46,32,40,84,104,101,32,117,115,101,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,41,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,44,32,115,117,99,104,32,97,115,32,34,49,57,50,46,49,54,56,46,50,51,46,50,52,53,34,44,32,99,97,110,32,98,101,32,119,114,105,116,116,101,110,32,108,105,107,101,32,116,104,105,115,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58>>]},{pre,[],[{code,[],[<<40,63,40,68,69,70,73,78,69,41,32,40,63,60,98,121,116,101,62,32,50,91,48,45,52,93,92,100,32,124,32,50,53,91,48,45,53,93,32,124,32,49,92,100,92,100,32,124,32,91,49,45,57,93,63,92,100,41,32,41,32,92,98,32,40,63,38,98,121,116,101,41,32,40,92,46,40,63,38,98,121,116,101,41,41,123,51,125,32,92,98>>]}]},{p,[],[<<84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,32,68,69,70,73,78,69,32,103,114,111,117,112,32,105,110,115,105,100,101,32,119,104,105,99,104,32,105,115,32,97,32,97,110,111,116,104,101,114,32,103,114,111,117,112,32,110,97,109,101,100,32,34,98,121,116,101,34,32,105,115,32,100,101,102,105,110,101,100,46,32,84,104,105,115,32,109,97,116,99,104,101,115,32,97,110,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109,112,111,110,101,110,116,32,111,102,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,32,40,97,32,110,117,109,98,101,114,32,60,32,50,53,54,41,46,32,87,104,101,110,32,109,97,116,99,104,105,110,103,32,116,97,107,101,115,32,112,108,97,99,101,44,32,116,104,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,107,105,112,112,101,100,44,32,97,115,32,68,69,70,73,78,69,32,97,99,116,115,32,108,105,107,101,32,97,32,102,97,108,115,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,117,115,101,115,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,110,97,109,101,100,32,103,114,111,117,112,32,116,111,32,109,97,116,99,104,32,116,104,101,32,102,111,117,114,32,100,111,116,45,115,101,112,97,114,97,116,101,100,32,99,111,109,112,111,110,101,110,116,115,32,111,102,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,44,32,105,110,115,105,115,116,105,110,103,32,111,110,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,97,116,32,101,97,99,104,32,101,110,100,46>>]},{p,[],[{em,[],[<<65,115,115,101,114,116,105,111,110,32,67,111,110,100,105,116,105,111,110,115>>]}]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,110,111,116,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,97,98,111,118,101,32,102,111,114,109,97,116,115,44,32,105,116,32,109,117,115,116,32,98,101,32,97,110,32,97,115,115,101,114,116,105,111,110,46,32,84,104,105,115,32,99,97,110,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,111,114,32,110,101,103,97,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,111,114,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,99,111,110,116,97,105,110,105,110,103,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,44,32,97,110,100,32,119,105,116,104,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,111,110,32,116,104,101,32,115,101,99,111,110,100,32,108,105,110,101,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<40,63,40,63,61,91,94,97,45,122,93,42,91,97,45,122,93,41,10,92,100,123,50,125,45,91,97,45,122,93,123,51,125,45,92,100,123,50,125,32,32,124,32,32,92,100,123,50,125,45,92,100,123,50,125,45,92,100,123,50,125,32,41>>]}]},{p,[],[<<84,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,108,101,116,116,101,114,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,108,101,116,116,101,114,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,101,115,116,115,32,102,111,114,32,116,104,101,32,112,114,101,115,101,110,99,101,32,111,102,32,97,116,32,108,101,97,115,116,32,111,110,101,32,108,101,116,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,102,32,97,32,108,101,116,116,101,114,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,115,101,99,111,110,100,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,115,116,114,105,110,103,115,32,105,110,32,111,110,101,32,111,102,32,116,104,101,32,116,119,111,32,102,111,114,109,115,32,100,100,45,97,97,97,45,100,100,32,111,114,32,100,100,45,100,100,45,100,100,44,32,119,104,101,114,101,32,97,97,97,32,97,114,101,32,108,101,116,116,101,114,115,32,97,110,100,32,100,100,32,97,114,101,32,100,105,103,105,116,115,46>>]},{a,[{id,<<115,101,99,116,49,57>>}],[]},{h2,[],[<<67,111,109,109,101,110,116,115>>]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,116,119,111,32,119,97,121,115,32,116,111,32,105,110,99,108,117,100,101,32,99,111,109,109,101,110,116,115,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,112,114,111,99,101,115,115,101,100,32,98,121,32,80,67,82,69,46,32,73,110,32,98,111,116,104,32,99,97,115,101,115,44,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,99,111,109,109,101,110,116,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,110,32,116,104,101,32,109,105,100,100,108,101,32,111,102,32,97,110,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,32,111,102,32,114,101,108,97,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,115,117,99,104,32,97,115,32,40,63,58,32,111,114,32,97,32,115,117,98,112,97,116,116,101,114,110,32,110,97,109,101,32,111,114,32,110,117,109,98,101,114,46,32,84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,109,97,107,101,32,117,112,32,97,32,99,111,109,109,101,110,116,32,112,108,97,121,32,110,111,32,112,97,114,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,105,110,103,46>>]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,32,40,63,35,32,109,97,114,107,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,109,109,101,110,116,32,116,104,97,116,32,99,111,110,116,105,110,117,101,115,32,117,112,32,116,111,32,116,104,101,32,110,101,120,116,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,111,112,116,105,111,110,32,80,67,82,69,95,69,88,84,69,78,68,69,68,32,105,115,32,115,101,116,44,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,99,104,97,114,97,99,116,101,114,32,97,108,115,111,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,109,109,101,110,116,44,32,119,104,105,99,104,32,105,110,32,116,104,105,115,32,99,97,115,101,32,99,111,110,116,105,110,117,101,115,32,116,111,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,32,111,114,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,87,104,105,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,110,101,119,108,105,110,101,115,32,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,32,111,112,116,105,111,110,115,32,112,97,115,115,101,100,32,116,111,32,97,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,32,111,114,32,98,121,32,97,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115>>]},<<32,101,97,114,108,105,101,114,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,105,115,32,116,121,112,101,32,111,102,32,99,111,109,109,101,110,116,32,105,115,32,97,32,108,105,116,101,114,97,108,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,59,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,104,97,112,112,101,110,32,116,111,32,114,101,112,114,101,115,101,110,116,32,97,32,110,101,119,108,105,110,101,32,100,111,32,110,111,116,32,99,111,117,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,119,104,101,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,105,110,32,102,111,114,99,101,58>>]},{pre,[],[{code,[],[<<97,98,99,32,35,99,111,109,109,101,110,116,32,92,110,32,115,116,105,108,108,32,99,111,109,109,101,110,116>>]}]},{p,[],[<<79,110,32,101,110,99,111,117,110,116,101,114,105,110,103,32,99,104,97,114,97,99,116,101,114,32,35,44,32>>,{code,[],[<<112,99,114,101,95,99,111,109,112,105,108,101,40,41>>]},<<32,115,107,105,112,115,32,97,108,111,110,103,44,32,108,111,111,107,105,110,103,32,102,111,114,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,115,101,113,117,101,110,99,101,32,92,110,32,105,115,32,115,116,105,108,108,32,108,105,116,101,114,97,108,32,97,116,32,116,104,105,115,32,115,116,97,103,101,44,32,115,111,32,105,116,32,100,111,101,115,32,110,111,116,32,116,101,114,109,105,110,97,116,101,32,116,104,101,32,99,111,109,109,101,110,116,46,32,79,110,108,121,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,99,111,100,101,32,118,97,108,117,101,32,48,120,48,97,32,40,116,104,101,32,100,101,102,97,117,108,116,32,110,101,119,108,105,110,101,41,32,100,111,101,115,32,115,111,46>>]},{a,[{id,<<115,101,99,116,50,48>>}],[]},{h2,[],[<<82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115>>]},{p,[],[<<67,111,110,115,105,100,101,114,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,116,99,104,105,110,103,32,97,32,115,116,114,105,110,103,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,32,117,110,108,105,109,105,116,101,100,32,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,46,32,87,105,116,104,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,114,101,99,117,114,115,105,111,110,44,32,116,104,101,32,98,101,115,116,32,116,104,97,116,32,99,97,110,32,98,101,32,100,111,110,101,32,105,115,32,116,111,32,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,117,112,32,116,111,32,115,111,109,101,32,102,105,120,101,100,32,100,101,112,116,104,32,111,102,32,110,101,115,116,105,110,103,46,32,73,116,32,105,115,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,110,100,108,101,32,97,110,32,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,32,100,101,112,116,104,46>>]},{p,[],[<<70,111,114,32,115,111,109,101,32,116,105,109,101,44,32,80,101,114,108,32,104,97,115,32,112,114,111,118,105,100,101,100,32,97,32,102,97,99,105,108,105,116,121,32,116,104,97,116,32,97,108,108,111,119,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,116,111,32,114,101,99,117,114,115,101,32,40,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,41,46,32,73,116,32,100,111,101,115,32,116,104,105,115,32,98,121,32,105,110,116,101,114,112,111,108,97,116,105,110,103,32,80,101,114,108,32,99,111,100,101,32,105,110,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,116,104,101,32,99,111,100,101,32,99,97,110,32,114,101,102,101,114,32,116,111,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,116,115,101,108,102,46,32,65,32,80,101,114,108,32,112,97,116,116,101,114,110,32,117,115,105,110,103,32,99,111,100,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,99,97,110,32,98,101,32,99,114,101,97,116,101,100,32,108,105,107,101,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<36,114,101,32,61,32,113,114,123,92,40,32,40,63,58,32,40,63,62,91,94,40,41,93,43,41,32,124,32,40,63,112,123,36,114,101,125,41,32,41,42,32,92,41,125,120,59>>]}]},{p,[],[<<73,116,101,109,32,40,63,112,123,46,46,46,125,41,32,105,110,116,101,114,112,111,108,97,116,101,115,32,80,101,114,108,32,99,111,100,101,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,105,110,32,116,104,105,115,32,99,97,115,101,32,114,101,102,101,114,115,32,114,101,99,117,114,115,105,118,101,108,121,32,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,46>>]},{p,[],[<<79,98,118,105,111,117,115,108,121,44,32,80,67,82,69,32,99,97,110,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,111,102,32,80,101,114,108,32,99,111,100,101,46,32,73,110,115,116,101,97,100,44,32,105,116,32,115,117,112,112,111,114,116,115,32,115,112,101,99,105,97,108,32,115,121,110,116,97,120,32,102,111,114,32,114,101,99,117,114,115,105,111,110,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,115,117,98,112,97,116,116,101,114,110,32,114,101,99,117,114,115,105,111,110,46,32,65,102,116,101,114,32,105,116,115,32,105,110,116,114,111,100,117,99,116,105,111,110,32,105,110,32,80,67,82,69,32,97,110,100,32,80,121,116,104,111,110,44,32,116,104,105,115,32,107,105,110,100,32,111,102,32,114,101,99,117,114,115,105,111,110,32,119,97,115,32,108,97,116,101,114,32,105,110,116,114,111,100,117,99,101,100,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,48,46>>]},{p,[],[<<65,32,115,112,101,99,105,97,108,32,105,116,101,109,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,40,63,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,117,109,98,101,114,32,62,32,48,32,97,110,100,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,103,105,118,101,110,32,110,117,109,98,101,114,44,32,105,102,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,46,32,40,73,102,32,110,111,116,44,32,105,116,32,105,115,32,97,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,44,32,119,104,105,99,104,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,41,32,84,104,101,32,115,112,101,99,105,97,108,32,105,116,101,109,32,40,63,82,41,32,111,114,32,40,63,48,41,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<84,104,105,115,32,80,67,82,69,32,112,97,116,116,101,114,110,32,115,111,108,118,101,115,32,116,104,101,32,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,40,97,115,115,117,109,101,32,116,104,97,116,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,105,115,32,115,101,116,32,115,111,32,116,104,97,116,32,119,104,105,116,101,115,112,97,99,101,32,105,115,32,105,103,110,111,114,101,100,41,58>>]},{pre,[],[{code,[],[<<92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,82,41,32,41,42,32,92,41>>]}]},{p,[],[<<70,105,114,115,116,32,105,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,115,117,98,115,116,114,105,110,103,115,44,32,119,104,105,99,104,32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,111,114,32,97,32,114,101,99,117,114,115,105,118,101,32,109,97,116,99,104,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,32,40,116,104,97,116,32,105,115,44,32,97,32,99,111,114,114,101,99,116,108,121,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,115,116,114,105,110,103,41,46,32,70,105,110,97,108,108,121,32,116,104,101,114,101,32,105,115,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<73,102,32,116,104,105,115,32,119,97,115,32,112,97,114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,121,111,117,32,119,111,117,108,100,32,110,111,116,32,119,97,110,116,32,116,111,32,114,101,99,117,114,115,101,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,44,32,115,111,32,105,110,115,116,101,97,100,32,121,111,117,32,99,97,110,32,117,115,101,58>>]},{pre,[],[{code,[],[<<40,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,49,41,32,41,42,32,92,41,32,41>>]}]},{p,[],[<<84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,104,101,114,101,32,119,105,116,104,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,115,111,32,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,114,101,102,101,114,115,32,116,111,32,116,104,101,109,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<73,110,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,107,101,101,112,105,110,103,32,116,114,97,99,107,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,110,117,109,98,101,114,115,32,99,97,110,32,98,101,32,116,114,105,99,107,121,46,32,84,104,105,115,32,105,115,32,109,97,100,101,32,101,97,115,105,101,114,32,98,121,32,116,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,46,32,73,110,115,116,101,97,100,32,111,102,32,40,63,49,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,97,98,111,118,101,44,32,121,111,117,32,99,97,110,32,119,114,105,116,101,32,40,63,45,50,41,32,116,111,32,114,101,102,101,114,32,116,111,32,116,104,101,32,115,101,99,111,110,100,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,99,111,117,110,116,115,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,108,101,102,116,119,97,114,100,115,32,102,114,111,109,32,116,104,101,32,112,111,105,110,116,32,97,116,32,119,104,105,99,104,32,105,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,46>>]},{p,[],[<<73,116,32,105,115,32,97,108,115,111,32,112,111,115,115,105,98,108,101,32,116,111,32,114,101,102,101,114,32,116,111,32,108,97,116,101,114,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,44,32,98,121,32,119,114,105,116,105,110,103,32,114,101,102,101,114,101,110,99,101,115,32,115,117,99,104,32,97,115,32,40,63,43,50,41,46,32,72,111,119,101,118,101,114,44,32,116,104,101,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,99,117,114,115,105,118,101,44,32,97,115,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,105,115,32,110,111,116,32,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,46,32,84,104,101,121,32,97,114,101,32,97,108,119,97,121,115,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46>>]},{p,[],[<<65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,105,115,32,116,111,32,117,115,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,115,116,101,97,100,46,32,84,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32,102,111,114,32,116,104,105,115,32,105,115,32,40,63,38,110,97,109,101,41,46,32,84,104,101,32,101,97,114,108,105,101,114,32,80,67,82,69,32,115,121,110,116,97,120,32,40,63,80,62,110,97,109,101,41,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,87,101,32,99,97,110,32,114,101,119,114,105,116,101,32,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{pre,[],[{code,[],[<<40,63,60,112,110,62,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,38,112,110,41,32,41,42,32,92,41,32,41>>]}]},{p,[],[<<73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,116,104,101,32,101,97,114,108,105,101,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,101,120,97,109,112,108,101,32,112,97,116,116,101,114,110,32,116,104,97,116,32,119,101,32,104,97,118,101,32,115,116,117,100,105,101,100,32,99,111,110,116,97,105,110,115,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,102,111,114,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,115,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,105,115,32,105,109,112,111,114,116,97,110,116,32,119,104,101,110,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,115,116,114,105,110,103,115,32,116,104,97,116,32,100,111,32,110,111,116,32,109,97,116,99,104,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111>>]},{pre,[],[{code,[],[<<40,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,40,41>>]}]},{p,[],[<<105,116,32,103,105,118,101,115,32,34,110,111,32,109,97,116,99,104,34,32,113,117,105,99,107,108,121,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,32,117,115,101,100,44,32,116,104,101,32,109,97,116,99,104,32,114,117,110,115,32,102,111,114,32,97,32,108,111,110,103,32,116,105,109,101,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,115,111,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,116,104,101,32,43,32,97,110,100,32,42,32,114,101,112,101,97,116,115,32,99,97,110,32,99,97,114,118,101,32,117,112,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,101,115,116,101,100,32,98,101,102,111,114,101,32,102,97,105,108,117,114,101,32,99,97,110,32,98,101,32,114,101,112,111,114,116,101,100,46>>]},{p,[],[<<65,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,109,97,116,99,104,44,32,116,104,101,32,118,97,108,117,101,115,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,116,104,111,115,101,32,102,114,111,109,32,116,104,101,32,111,117,116,101,114,109,111,115,116,32,108,101,118,101,108,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,97,98,111,118,101,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116>>]},{pre,[],[{code,[],[<<40,97,98,40,99,100,41,101,102,41>>]}]},{p,[],[<<116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,105,110,110,101,114,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,40,110,117,109,98,101,114,101,100,32,50,41,32,105,115,32,34,101,102,34,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,108,97,115,116,32,118,97,108,117,101,32,116,97,107,101,110,32,111,110,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,46,32,73,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,109,97,116,99,104,101,100,32,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,105,116,115,32,102,105,110,97,108,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,32,105,115,32,117,110,115,101,116,44,32,101,118,101,110,32,105,102,32,105,116,32,119,97,115,32,40,116,101,109,112,111,114,97,114,105,108,121,41,32,115,101,116,32,97,116,32,97,32,100,101,101,112,101,114,32,108,101,118,101,108,32,100,117,114,105,110,103,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,105,116,101,109,32,40,63,82,41,32,119,105,116,104,32,99,111,110,100,105,116,105,111,110,32,40,82,41,44,32,119,104,105,99,104,32,116,101,115,116,115,32,102,111,114,32,114,101,99,117,114,115,105,111,110,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,116,101,120,116,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,32,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,46,32,79,110,108,121,32,100,105,103,105,116,115,32,97,114,101,32,97,108,108,111,119,101,100,32,105,110,32,110,101,115,116,101,100,32,98,114,97,99,107,101,116,115,32,40,116,104,97,116,32,105,115,44,32,119,104,101,110,32,114,101,99,117,114,115,105,110,103,41,44,32,119,104,105,108,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,97,116,32,116,104,101,32,111,117,116,101,114,32,108,101,118,101,108,46>>]},{pre,[],[{code,[],[<<60,32,40,63,58,32,40,63,40,82,41,32,92,100,43,43,32,32,124,32,91,94,60,62,93,42,43,41,32,124,32,40,63,82,41,41,32,42,32,62>>]}]},{p,[],[<<72,101,114,101,32,40,63,40,82,41,32,105,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,44,32,119,105,116,104,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,97,108,116,101,114,110,97,116,105,118,101,115,32,102,111,114,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,97,110,100,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,99,97,115,101,115,46,32,73,116,101,109,32,40,63,82,41,32,105,115,32,116,104,101,32,97,99,116,117,97,108,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,46>>]},{p,[],[{em,[],[<<68,105,102,102,101,114,101,110,99,101,115,32,105,110,32,82,101,99,117,114,115,105,111,110,32,80,114,111,99,101,115,115,105,110,103,32,98,101,116,119,101,101,110,32,80,67,82,69,32,97,110,100,32,80,101,114,108>>]}]},{p,[],[<<82,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,110,32,80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,119,111,32,105,109,112,111,114,116,97,110,116,32,119,97,121,115,46,32,73,110,32,80,67,82,69,32,40,108,105,107,101,32,80,121,116,104,111,110,44,32,98,117,116,32,117,110,108,105,107,101,32,80,101,114,108,41,44,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,105,115,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,84,104,97,116,32,105,115,44,32,111,110,99,101,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,32,110,101,118,101,114,32,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,105,108,108,117,115,116,114,97,116,101,100,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,111,32,109,97,116,99,104,32,97,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,34,97,34,44,32,34,97,98,97,34,44,32,34,97,98,99,98,97,34,44,32,34,97,98,99,100,99,98,97,34,41,58>>]},{pre,[],[{code,[],[<<94,40,46,124,40,46,41,40,63,49,41,92,50,41,36>>]}]},{p,[],[<<84,104,101,32,105,100,101,97,32,105,115,32,116,104,97,116,32,105,116,32,101,105,116,104,101,114,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,116,119,111,32,105,100,101,110,116,105,99,97,108,32,99,104,97,114,97,99,116,101,114,115,32,115,117,114,114,111,117,110,100,105,110,103,32,97,32,115,117,98,112,97,108,105,110,100,114,111,109,101,46,32,73,110,32,80,101,114,108,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,119,111,114,107,115,59,32,105,110,32,80,67,82,69,32,105,116,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,97,98,99,98,97,34,46>>]},{p,[],[<<65,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,97,115,32,105,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,102,97,105,108,115,44,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,97,107,101,110,44,32,97,110,100,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,107,105,99,107,115,32,105,110,46,32,84,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,115,117,98,112,97,116,116,101,114,110,32,49,32,115,117,99,99,101,115,115,102,117,108,108,121,32,109,97,116,99,104,101,115,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,98,34,41,46,32,40,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,97,110,100,32,101,110,100,32,111,102,32,108,105,110,101,32,116,101,115,116,115,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,41>>]},{p,[],[<<66,97,99,107,32,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,99,34,41,32,105,115,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,119,104,97,116,32,115,117,98,112,97,116,116,101,114,110,32,50,32,109,97,116,99,104,101,100,44,32,119,104,105,99,104,32,119,97,115,32,34,97,34,46,32,84,104,105,115,32,102,97,105,108,115,46,32,65,115,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,116,104,101,114,101,32,97,114,101,32,110,111,119,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,112,111,105,110,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,32,40,80,101,114,108,32,99,97,110,32,110,111,119,32,114,101,45,101,110,116,101,114,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,97,110,100,32,116,114,121,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,46,41,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,119,105,116,104,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,111,116,104,101,114,32,111,114,100,101,114,44,32,116,104,105,110,103,115,32,97,114,101,32,100,105,102,102,101,114,101,110,116,58>>]},{pre,[],[{code,[],[<<94,40,40,46,41,40,63,49,41,92,50,124,46,41,36>>]}]},{p,[],[<<84,104,105,115,32,116,105,109,101,44,32,116,104,101,32,114,101,99,117,114,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,114,105,101,100,32,102,105,114,115,116,44,32,97,110,100,32,99,111,110,116,105,110,117,101,115,32,116,111,32,114,101,99,117,114,115,101,32,117,110,116,105,108,32,105,116,32,114,117,110,115,32,111,117,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,97,116,32,119,104,105,99,104,32,112,111,105,110,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,115,46,32,66,117,116,32,116,104,105,115,32,116,105,109,101,32,119,101,32,104,97,118,101,32,97,110,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,116,114,121,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,46,32,84,104,97,116,32,105,115,32,116,104,101,32,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,58,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,97,115,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,97,116,32,97,32,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,108,101,118,101,108,44,32,119,104,105,99,104,32,80,67,82,69,32,99,97,110,110,111,116,32,117,115,101,46>>]},{p,[],[<<84,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,115,44,32,110,111,116,32,111,110,108,121,32,116,104,111,115,101,32,119,105,116,104,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,105,116,32,105,115,32,116,101,109,112,116,105,110,103,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<94,40,40,46,41,40,63,49,41,92,50,124,46,63,41,36>>]}]},{p,[],[<<65,103,97,105,110,44,32,116,104,105,115,32,119,111,114,107,115,32,105,110,32,80,101,114,108,44,32,98,117,116,32,110,111,116,32,105,110,32,80,67,82,69,44,32,97,110,100,32,102,111,114,32,116,104,101,32,115,97,109,101,32,114,101,97,115,111,110,46,32,87,104,101,110,32,97,32,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,104,97,115,32,109,97,116,99,104,101,100,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,101,110,116,101,114,101,100,32,97,103,97,105,110,32,116,111,32,109,97,116,99,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,46,32,84,104,101,32,115,111,108,117,116,105,111,110,32,105,115,32,116,111,32,115,101,112,97,114,97,116,101,32,116,104,101,32,116,119,111,32,99,97,115,101,115,44,32,97,110,100,32,119,114,105,116,101,32,111,117,116,32,116,104,101,32,111,100,100,32,97,110,100,32,101,118,101,110,32,99,97,115,101,115,32,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,58>>]},{pre,[],[{code,[],[<<94,40,63,58,40,40,46,41,40,63,49,41,92,50,124,41,124,40,40,46,41,40,63,51,41,92,52,124,46,41,41>>]}]},{p,[],[<<73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,97,108,105,110,100,114,111,109,105,99,32,112,104,114,97,115,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,105,103,110,111,114,101,32,97,108,108,32,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,100,111,110,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{pre,[],[{code,[],[<<94,92,87,42,43,40,63,58,40,40,46,41,92,87,42,43,40,63,49,41,92,87,42,43,92,50,124,41,124,40,40,46,41,92,87,42,43,40,63,51,41,92,87,42,43,92,52,124,92,87,42,43,46,92,87,42,43,41,41,92,87,42,43,36>>]}]},{p,[],[<<73,102,32,114,117,110,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,112,104,114,97,115,101,115,32,115,117,99,104,32,97,115,32,34,65,32,109,97,110,44,32,97,32,112,108,97,110,44,32,97,32,99,97,110,97,108,58,32,80,97,110,97,109,97,33,34,32,97,110,100,32,105,116,32,119,111,114,107,115,32,119,101,108,108,32,105,110,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,32,111,102,32,116,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,42,43,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,46,32,87,105,116,104,111,117,116,32,116,104,105,115,44,32,80,67,82,69,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,40,49,48,32,116,105,109,101,115,32,111,114,32,109,111,114,101,41,32,116,111,32,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,104,114,97,115,101,115,44,32,97,110,100,32,80,101,114,108,32,116,97,107,101,115,32,115,111,32,108,111,110,103,32,116,104,97,116,32,121,111,117,32,116,104,105,110,107,32,105,116,32,104,97,115,32,103,111,110,101,32,105,110,116,111,32,97,32,108,111,111,112,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,112,97,108,105,110,100,114,111,109,101,45,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,115,32,97,98,111,118,101,32,119,111,114,107,32,111,110,108,121,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,100,111,101,115,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,112,97,108,105,110,100,114,111,109,101,32,116,104,97,116,32,105,115,32,115,104,111,114,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,108,116,104,111,117,103,104,32,34,97,98,99,98,97,34,32,105,115,32,99,111,114,114,101,99,116,108,121,32,109,97,116,99,104,101,100,44,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,98,97,34,44,32,80,67,82,69,32,102,105,110,100,115,32,112,97,108,105,110,100,114,111,109,101,32,34,97,98,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,44,32,97,110,100,32,116,104,101,110,32,102,97,105,108,115,32,97,116,32,116,111,112,32,108,101,118,101,108,44,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,100,111,101,115,32,110,111,116,32,102,111,108,108,111,119,46,32,79,110,99,101,32,97,103,97,105,110,44,32,105,116,32,99,97,110,110,111,116,32,106,117,109,112,32,98,97,99,107,32,105,110,116,111,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,116,111,32,116,114,121,32,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46>>]}]},{p,[],[<<84,104,101,32,115,101,99,111,110,100,32,119,97,121,32,105,110,32,119,104,105,99,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,105,102,102,101,114,32,105,110,32,116,104,101,105,114,32,114,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,115,32,105,110,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,46,32,73,110,32,80,101,114,108,44,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,32,114,101,99,117,114,115,105,118,101,108,121,32,111,114,32,97,115,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,44,32,105,116,32,104,97,115,32,110,111,32,97,99,99,101,115,115,32,116,111,32,97,110,121,32,118,97,108,117,101,115,32,116,104,97,116,32,119,101,114,101,32,99,97,112,116,117,114,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,73,110,32,80,67,82,69,32,116,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<94,40,46,41,40,92,49,124,97,40,63,50,41,41>>]}]},{p,[],[<<73,110,32,80,67,82,69,44,32,105,116,32,109,97,116,99,104,101,115,32,34,98,97,98,34,46,32,84,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,110,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,103,114,111,117,112,44,32,119,104,101,110,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,92,49,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,115,32,34,97,34,44,32,97,110,100,32,116,104,101,110,32,114,101,99,117,114,115,101,115,46,32,73,110,32,116,104,101,32,114,101,99,117,114,115,105,111,110,44,32,92,49,32,100,111,101,115,32,110,111,119,32,109,97,116,99,104,32,34,98,34,32,97,110,100,32,115,111,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,46,32,73,110,32,80,101,114,108,44,32,116,104,101,32,112,97,116,116,101,114,110,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,98,101,99,97,117,115,101,32,105,110,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,92,49,32,99,97,110,110,111,116,32,97,99,99,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,108,121,32,115,101,116,32,118,97,108,117,101,46>>]},{a,[{id,<<115,101,99,116,50,49>>}],[]},{h2,[],[<<83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115>>]},{p,[],[<<73,102,32,116,104,101,32,115,121,110,116,97,120,32,102,111,114,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,40,101,105,116,104,101,114,32,98,121,32,110,117,109,98,101,114,32,111,114,32,98,121,32,110,97,109,101,41,32,105,115,32,117,115,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,44,32,105,116,32,111,112,101,114,97,116,101,115,32,108,105,107,101,32,97,32,115,117,98,114,111,117,116,105,110,101,32,105,110,32,97,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,46,32,84,104,101,32,99,97,108,108,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,101,102,111,114,101,32,111,114,32,97,102,116,101,114,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,117,109,98,101,114,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,44,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<40,46,46,46,40,97,98,115,111,108,117,116,101,41,46,46,46,41,46,46,46,40,63,50,41,46,46,46,10,40,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46,41,46,46,46,40,63,45,49,41,46,46,46,10,40,46,46,46,40,63,43,49,41,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46>>]}]},{p,[],[<<65,110,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,32,112,111,105,110,116,101,100,32,111,117,116,32,116,104,97,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58>>]},{pre,[],[{code,[],[<<40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121>>]}]},{p,[],[<<73,102,32,105,110,115,116,101,97,100,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,105,116,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,116,119,111,32,115,116,114,105,110,103,115,58>>]},{pre,[],[{code,[],[<<40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,40,63,49,41,105,98,105,108,105,116,121>>]}]},{p,[],[<<65,110,111,116,104,101,114,32,101,120,97,109,112,108,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,68,69,70,73,78,69,32,101,97,114,108,105,101,114,46>>]},{p,[],[<<65,108,108,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,114,101,99,117,114,115,105,118,101,32,111,114,32,110,111,116,44,32,97,114,101,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,32,97,116,111,109,105,99,32,103,114,111,117,112,115,46,32,84,104,97,116,32,105,115,44,32,111,110,99,101,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,32,110,101,118,101,114,32,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,65,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,100,117,114,105,110,103,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,114,101,118,101,114,116,32,116,111,32,116,104,101,105,114,32,112,114,101,118,105,111,117,115,32,118,97,108,117,101,115,32,97,102,116,101,114,119,97,114,100,115,46>>]},{p,[],[<<80,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,115,32,115,117,99,104,32,97,115,32,99,97,115,101,45,105,110,100,101,112,101,110,100,101,110,99,101,32,97,114,101,32,102,105,120,101,100,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,100,101,102,105,110,101,100,44,32,115,111,32,105,102,32,105,116,32,105,115,32,117,115,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,115,117,99,104,32,111,112,116,105,111,110,115,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,102,111,114,32,100,105,102,102,101,114,101,110,116,32,99,97,108,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,98,117,116,32,110,111,116,32,34,97,98,99,65,66,67,34,44,32,97,115,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,112,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,99,97,108,108,101,100,32,115,117,98,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,97,98,99,41,40,63,105,58,40,63,45,49,41,41>>]}]},{a,[{id,<<115,101,99,116,50,50>>}],[]},{h2,[],[<<79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,92,103,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,32,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,32,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,112,111,115,115,105,98,108,121,32,114,101,99,117,114,115,105,118,101,108,121,46,32,72,101,114,101,32,102,111,108,108,111,119,115,32,116,119,111,32,111,102,32,116,104,101,32,101,120,97,109,112,108,101,115,32,117,115,101,100,32,97,98,111,118,101,44,32,114,101,119,114,105,116,116,101,110,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,58>>]},{pre,[],[{code,[],[<<40,63,60,112,110,62,32,92,40,32,40,32,40,63,62,91,94,40,41,93,43,41,32,124,32,92,103,60,112,110,62,32,41,42,32,92,41,32,41,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,103,39,49,39,105,98,105,108,105,116,121>>]}]},{p,[],[<<80,67,82,69,32,115,117,112,112,111,114,116,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,79,110,105,103,117,114,117,109,97,58,32,105,102,32,97,32,110,117,109,98,101,114,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,97,32,112,108,117,115,32,111,114,32,109,105,110,117,115,32,115,105,103,110,44,32,105,116,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,98,99,41,40,63,105,58,92,103,60,45,49,62,41>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,92,103,123,46,46,46,125,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,92,103,60,46,46,46,62,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,59,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46>>]},{a,[{id,<<115,101,99,116,50,51>>}],[]},{h2,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108>>]},{p,[],[<<80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,115,111,109,101,32,34,83,112,101,99,105,97,108,32,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,32,86,101,114,98,115,34,44,32,119,104,105,99,104,32,97,114,101,32,115,116,105,108,108,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,115,32,34,101,120,112,101,114,105,109,101,110,116,97,108,32,97,110,100,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,111,114,32,114,101,109,111,118,97,108,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,80,101,114,108,34,46,32,73,116,32,103,111,101,115,32,111,110,32,116,111,32,115,97,121,58,32,34,84,104,101,105,114,32,117,115,97,103,101,32,105,110,32,112,114,111,100,117,99,116,105,111,110,32,99,111,100,101,32,115,104,111,117,108,100,32,98,101,32,110,111,116,101,100,32,116,111,32,97,118,111,105,100,32,112,114,111,98,108,101,109,115,32,100,117,114,105,110,103,32,117,112,103,114,97,100,101,115,46,34,32,84,104,101,32,115,97,109,101,32,114,101,109,97,114,107,115,32,97,112,112,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,102,101,97,116,117,114,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,105,115,32,115,101,99,116,105,111,110,46>>]},{p,[],[<<84,104,101,32,110,101,119,32,118,101,114,98,115,32,109,97,107,101,32,117,115,101,32,111,102,32,119,104,97,116,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,105,110,118,97,108,105,100,32,115,121,110,116,97,120,58,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,97,115,116,101,114,105,115,107,46,32,84,104,101,121,32,97,114,101,32,103,101,110,101,114,97,108,108,121,32,111,102,32,116,104,101,32,102,111,114,109,32,40,42,86,69,82,66,41,32,111,114,32,40,42,86,69,82,66,58,78,65,77,69,41,46,32,83,111,109,101,32,99,97,110,32,116,97,107,101,32,101,105,116,104,101,114,32,102,111,114,109,44,32,112,111,115,115,105,98,108,121,32,98,101,104,97,118,105,110,103,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,119,104,101,116,104,101,114,32,97,32,110,97,109,101,32,105,115,32,112,114,101,115,101,110,116,46,32,65,32,110,97,109,101,32,105,115,32,97,110,121,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,32,109,97,120,105,109,117,109,32,110,97,109,101,32,108,101,110,103,116,104,32,105,115,32,50,53,53,32,105,110,32,116,104,101,32,56,45,98,105,116,32,108,105,98,114,97,114,121,32,97,110,100,32,54,53,53,51,53,32,105,110,32,116,104,101,32,49,54,45,98,105,116,32,97,110,100,32,51,50,45,98,105,116,32,108,105,98,114,97,114,105,101,115,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,101,109,112,116,121,44,32,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,115,32,116,104,101,32,99,111,108,111,110,44,32,116,104,101,32,101,102,102,101,99,116,32,105,115,32,97,115,32,105,102,32,116,104,101,32,99,111,108,111,110,32,119,97,115,32,110,111,116,32,116,104,101,114,101,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,99,97,110,32,111,99,99,117,114,32,105,110,32,97,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,44,32,97,115,115,101,114,116,105,111,110,115,44,32,97,110,100,32,105,110,32,115,117,98,112,97,116,116,101,114,110,115,32,99,97,108,108,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,40,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,114,101,99,117,114,115,105,118,101,108,121,41,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46>>]},{p,[],[{em,[],[<<79,112,116,105,109,105,122,97,116,105,111,110,115,32,84,104,97,116,32,65,102,102,101,99,116,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115>>]}]},{p,[],[<<80,67,82,69,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,116,111,32,115,112,101,101,100,32,117,112,32,109,97,116,99,104,105,110,103,32,98,121,32,114,117,110,110,105,110,103,32,115,111,109,101,32,99,104,101,99,107,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,109,97,116,99,104,32,97,116,116,101,109,112,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,99,97,110,32,107,110,111,119,32,116,104,101,32,109,105,110,105,109,117,109,32,108,101,110,103,116,104,32,111,102,32,109,97,116,99,104,105,110,103,32,115,117,98,106,101,99,116,44,32,111,114,32,116,104,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,32,112,114,101,115,101,110,116,46,32,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,112,97,115,115,101,115,32,116,104,101,32,114,117,110,110,105,110,103,32,111,102,32,97,32,109,97,116,99,104,44,32,97,110,121,32,105,110,99,108,117,100,101,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,112,114,111,99,101,115,115,101,100,46,32,112,114,111,99,101,115,115,101,100,46,32,89,111,117,32,99,97,110,32,115,117,112,112,114,101,115,115,32,116,104,101,32,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]},<<32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,111,114,32,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,40,42,78,79,95,83,84,65,82,84,95,79,80,84,41,46>>]},{p,[],[<<69,120,112,101,114,105,109,101,110,116,115,32,119,105,116,104,32,80,101,114,108,32,115,117,103,103,101,115,116,32,116,104,97,116,32,105,116,32,116,111,111,32,104,97,115,32,115,105,109,105,108,97,114,32,111,112,116,105,109,105,122,97,116,105,111,110,115,44,32,115,111,109,101,116,105,109,101,115,32,108,101,97,100,105,110,103,32,116,111,32,97,110,111,109,97,108,111,117,115,32,114,101,115,117,108,116,115,46>>]},{p,[],[{em,[],[<<86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,73,109,109,101,100,105,97,116,101,108,121>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,97,99,116,32,97,115,32,115,111,111,110,32,97,115,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,101,121,32,109,117,115,116,32,110,111,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,46>>]},{pre,[],[{code,[],[<<40,42,65,67,67,69,80,84,41>>]}]},{p,[],[<<84,104,105,115,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,101,110,100,32,115,117,99,99,101,115,115,102,117,108,108,121,44,32,115,107,105,112,112,105,110,103,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,105,116,32,105,115,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,111,110,108,121,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,101,110,100,101,100,32,115,117,99,99,101,115,115,102,117,108,108,121,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,116,32,116,104,101,32,111,117,116,101,114,32,108,101,118,101,108,46,32,73,102,32,40,42,65,67,67,69,80,84,41,32,105,115,32,116,114,105,103,103,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,115,117,99,99,101,101,100,115,59,32,105,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,102,97,105,108,115,46>>]},{p,[],[<<73,102,32,40,42,65,67,67,69,80,84,41,32,105,115,32,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,44,32,116,104,101,32,100,97,116,97,32,115,111,32,102,97,114,32,105,115,32,99,97,112,116,117,114,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,65,65,68,34,44,32,111,114,32,34,65,67,68,34,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,66,34,32,105,115,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,111,117,116,101,114,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{pre,[],[{code,[],[<<65,40,40,63,58,65,124,66,40,42,65,67,67,69,80,84,41,124,67,41,68,41>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,44,32,102,111,114,99,105,110,103,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,111,99,99,117,114,46,32,73,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,40,63,33,41,32,98,117,116,32,101,97,115,105,101,114,32,116,111,32,114,101,97,100,46>>]},{pre,[],[{code,[],[<<40,42,70,65,73,76,41,32,111,114,32,40,42,70,41>>]}]},{p,[],[<<84,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,116,97,116,101,115,32,116,104,97,116,32,105,116,32,105,115,32,112,114,111,98,97,98,108,121,32,117,115,101,102,117,108,32,111,110,108,121,32,119,104,101,110,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,40,63,123,125,41,32,111,114,32,40,63,63,123,125,41,46,32,84,104,111,115,101,32,97,114,101,32,80,101,114,108,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,80,67,82,69,46>>]},{p,[],[<<65,32,109,97,116,99,104,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,34,97,97,97,97,34,32,97,108,119,97,121,115,32,102,97,105,108,115,44,32,98,117,116,32,116,104,101,32,99,97,108,108,111,117,116,32,105,115,32,116,97,107,101,110,32,98,101,102,111,114,101,32,101,97,99,104,32,98,97,99,107,116,114,97,99,107,32,111,99,99,117,114,115,32,40,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,44,32,49,48,32,116,105,109,101,115,41,46>>]},{p,[],[{em,[],[<<82,101,99,111,114,100,105,110,103,32,87,104,105,99,104,32,80,97,116,104,32,87,97,115,32,84,97,107,101,110>>]}]},{p,[],[<<84,104,101,32,109,97,105,110,32,112,117,114,112,111,115,101,32,111,102,32,116,104,105,115,32,118,101,114,98,32,105,115,32,116,111,32,116,114,97,99,107,32,104,111,119,32,97,32,109,97,116,99,104,32,119,97,115,32,97,114,114,105,118,101,100,32,97,116,44,32,97,108,116,104,111,117,103,104,32,105,116,32,97,108,115,111,32,104,97,115,32,97,32,115,101,99,111,110,100,97,114,121,32,117,115,101,32,105,110,32,119,105,116,104,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,109,97,116,99,104,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,40,115,101,101,32,40,42,83,75,73,80,41,32,98,101,108,111,119,41,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,110,32,69,114,108,97,110,103,44,32,116,104,101,114,101,32,105,115,32,110,111,32,105,110,116,101,114,102,97,99,101,32,116,111,32,114,101,116,114,105,101,118,101,32,97,32,109,97,114,107,32,119,105,116,104,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,50,44,51>>]}]},<<44,32,115,111,32,111,110,108,121,32,116,104,101,32,115,101,99,111,110,100,97,114,121,32,112,117,114,112,111,115,101,32,105,115,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,46>>]},{p,[],[<<84,104,101,32,114,101,115,116,32,111,102,32,116,104,105,115,32,115,101,99,116,105,111,110,32,105,115,32,116,104,101,114,101,102,111,114,101,32,100,101,108,105,98,101,114,97,116,101,108,121,32,110,111,116,32,97,100,97,112,116,101,100,32,102,111,114,32,114,101,97,100,105,110,103,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,116,104,101,32,101,120,97,109,112,108,101,115,32,99,97,110,32,104,101,108,112,32,105,110,32,117,110,100,101,114,115,116,97,110,100,105,110,103,32,78,65,77,69,83,32,97,115,32,116,104,101,121,32,99,97,110,32,98,101,32,117,115,101,100,32,98,121,32,40,42,83,75,73,80,41,46>>]}]},{pre,[],[{code,[],[<<40,42,77,65,82,75,58,78,65,77,69,41,32,111,114,32,40,42,58,78,65,77,69,41>>]}]},{p,[],[<<65,32,110,97,109,101,32,105,115,32,97,108,119,97,121,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,32,116,104,105,115,32,118,101,114,98,46,32,84,104,101,114,101,32,99,97,110,32,98,101,32,97,115,32,109,97,110,121,32,105,110,115,116,97,110,99,101,115,32,111,102,32,40,42,77,65,82,75,41,32,97,115,32,121,111,117,32,108,105,107,101,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,101,105,114,32,110,97,109,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,117,110,105,113,117,101,46>>]},{p,[],[<<87,104,101,110,32,97,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,40,42,77,65,82,75,58,78,65,77,69,41,44,32,40,42,80,82,85,78,69,58,78,65,77,69,41,44,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,32,111,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32,34,69,120,116,114,97,32,100,97,116,97,32,102,111,114,32>>,{code,[],[<<112,99,114,101,95,101,120,101,99,40,41>>]},<<34,32,105,110,32,116,104,101,32>>,{code,[],[<<112,99,114,101,97,112,105>>]},<<32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,32,73,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,111,102,32>>,{code,[],[<<112,99,114,101,116,101,115,116>>]},<<32,111,117,116,112,117,116,44,32,116,104,101,32,47,75,32,109,111,100,105,102,105,101,114,32,114,101,113,117,101,115,116,115,32,116,104,101,32,114,101,116,114,105,101,118,97,108,32,97,110,100,32,111,117,116,112,117,116,116,105,110,103,32,111,102,32,40,42,77,65,82,75,41,32,100,97,116,97,58>>]},{pre,[],[{code,[],[<<32,32,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,89,10,32,48,58,32,88,89,10,77,75,58,32,65,10,88,90,10,32,48,58,32,88,90,10,77,75,58,32,66>>]}]},{p,[],[<<84,104,101,32,40,42,77,65,82,75,41,32,110,97,109,101,32,105,115,32,116,97,103,103,101,100,32,119,105,116,104,32,34,77,75,58,34,32,105,110,32,116,104,105,115,32,111,117,116,112,117,116,44,32,97,110,100,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,105,116,32,105,110,100,105,99,97,116,101,115,32,119,104,105,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,105,115,32,97,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,119,97,121,32,111,102,32,111,98,116,97,105,110,105,110,103,32,116,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,116,104,97,110,32,112,117,116,116,105,110,103,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,105,116,115,32,111,119,110,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<73,102,32,97,32,118,101,114,98,32,119,105,116,104,32,97,32,110,97,109,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,99,111,114,100,101,100,32,97,110,100,32,112,97,115,115,101,100,32,98,97,99,107,32,105,102,32,105,116,32,105,115,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,111,114,32,102,97,105,108,105,110,103,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46>>]},{p,[],[<<65,102,116,101,114,32,97,32,112,97,114,116,105,97,108,32,109,97,116,99,104,32,111,114,32,97,32,102,97,105,108,101,100,32,109,97,116,99,104,44,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,110,97,109,101,32,105,110,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,112,114,111,99,101,115,115,32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<32,32,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,80,10,78,111,32,109,97,116,99,104,44,32,109,97,114,107,32,61,32,66>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,105,110,32,116,104,105,115,32,117,110,97,110,99,104,111,114,101,100,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,114,107,32,105,115,32,114,101,116,97,105,110,101,100,32,102,114,111,109,32,116,104,101,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,116,104,97,116,32,115,116,97,114,116,101,100,32,97,116,32,108,101,116,116,101,114,32,34,88,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,83,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,115,32,115,116,97,114,116,105,110,103,32,97,116,32,34,80,34,32,97,110,100,32,116,104,101,110,32,119,105,116,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,100,111,32,110,111,116,32,103,101,116,32,97,115,32,102,97,114,32,97,115,32,116,104,101,32,40,42,77,65,82,75,41,32,105,116,101,109,44,32,110,101,118,101,114,116,104,101,108,101,115,115,32,100,111,32,110,111,116,32,114,101,115,101,116,32,105,116,46>>]},{p,[],[{em,[],[<<86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,97,102,116,101,114,32,66,97,99,107,116,114,97,99,107,105,110,103>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,100,111,32,110,111,116,104,105,110,103,32,119,104,101,110,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,77,97,116,99,104,105,110,103,32,99,111,110,116,105,110,117,101,115,32,119,105,116,104,32,119,104,97,116,32,102,111,108,108,111,119,115,44,32,98,117,116,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,44,32,99,97,117,115,105,110,103,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,32,116,104,101,32,118,101,114,98,44,32,97,32,102,97,105,108,117,114,101,32,105,115,32,102,111,114,99,101,100,46,32,84,104,97,116,32,105,115,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,112,97,115,115,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,118,101,114,98,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,97,112,112,101,97,114,115,32,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,105,116,115,32,101,102,102,101,99,116,32,105,115,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,97,116,32,103,114,111,117,112,44,32,97,115,32,111,110,99,101,32,116,104,101,32,103,114,111,117,112,32,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,116,104,101,114,101,32,105,115,32,110,101,118,101,114,32,97,110,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,73,110,32,116,104,105,115,32,115,105,116,117,97,116,105,111,110,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,34,106,117,109,112,32,98,97,99,107,34,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,97,115,115,101,114,116,105,111,110,46,32,40,82,101,109,101,109,98,101,114,32,97,108,115,111,44,32,97,115,32,115,116,97,116,101,100,32,97,98,111,118,101,44,32,116,104,97,116,32,116,104,105,115,32,108,111,99,97,108,105,122,97,116,105,111,110,32,97,108,115,111,32,97,112,112,108,105,101,115,32,105,110,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,46,41>>]},{p,[],[<<84,104,101,115,101,32,118,101,114,98,115,32,100,105,102,102,101,114,32,105,110,32,101,120,97,99,116,108,121,32,119,104,97,116,32,107,105,110,100,32,111,102,32,102,97,105,108,117,114,101,32,111,99,99,117,114,115,32,119,104,101,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,114,101,97,99,104,101,115,32,116,104,101,109,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,32,105,115,32,119,104,97,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,118,101,114,98,32,105,115,32,110,111,116,32,105,110,32,97,32,115,117,98,114,111,117,116,105,110,101,32,111,114,32,97,110,32,97,115,115,101,114,116,105,111,110,46,32,83,117,98,115,101,113,117,101,110,116,32,115,101,99,116,105,111,110,115,32,99,111,118,101,114,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,99,97,115,101,115,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,105,99,104,32,109,117,115,116,32,110,111,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,44,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,111,117,116,114,105,103,104,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,114,101,97,99,104,32,105,116,46,32,69,118,101,110,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,110,111,32,102,117,114,116,104,101,114,32,97,116,116,101,109,112,116,115,32,116,111,32,102,105,110,100,32,97,32,109,97,116,99,104,32,98,121,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,116,97,107,101,32,112,108,97,99,101,46>>]},{pre,[],[{code,[],[<<40,42,67,79,77,77,73,84,41>>]}]},{p,[],[<<73,102,32,40,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,111,110,108,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,116,104,97,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,44,32,111,110,99,101,32,105,116,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,50,44,51>>]}]},<<32,105,115,32,99,111,109,109,105,116,116,101,100,32,116,111,32,102,105,110,100,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,44,32,111,114,32,110,111,116,32,97,116,32,97,108,108,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<97,43,40,42,67,79,77,77,73,84,41,98>>]}]},{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,34,120,120,97,97,98,34,32,98,117,116,32,110,111,116,32,34,97,97,99,97,97,98,34,46,32,73,116,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,107,105,110,100,32,111,102,32,100,121,110,97,109,105,99,32,97,110,99,104,111,114,44,32,111,114,32,34,73,39,118,101,32,115,116,97,114,116,101,100,44,32,115,111,32,73,32,109,117,115,116,32,102,105,110,105,115,104,34,46,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,112,97,115,115,101,100,32,40,42,77,65,82,75,41,32,105,110,32,116,104,101,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,119,104,101,110,32,40,42,67,79,77,77,73,84,41,32,102,111,114,99,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46>>]},{p,[],[<<73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,101,120,105,115,116,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,32,100,105,102,102,101,114,101,110,116,32,111,110,101,32,116,104,97,116,32,102,111,108,108,111,119,115,32,40,42,67,79,77,77,73,84,41,32,99,97,110,32,98,101,32,116,114,105,103,103,101,114,101,100,32,102,105,114,115,116,44,32,115,111,32,109,101,114,101,108,121,32,112,97,115,115,105,110,103,32,40,42,67,79,77,77,73,84,41,32,100,117,114,105,110,103,32,97,32,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,97,108,119,97,121,115,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,32,109,97,116,99,104,32,109,117,115,116,32,98,101,32,97,116,32,116,104,105,115,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,40,42,67,79,77,77,73,84,41,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,97,110,32,97,110,99,104,111,114,44,32,117,110,108,101,115,115,32,116,104,101,32,80,67,82,69,32,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,97,114,101,32,116,117,114,110,101,100,32,111,102,102,44,32,97,115,32,115,104,111,119,110,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<49,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,93,41,46,10,123,109,97,116,99,104,44,91,34,97,98,99,34,93,125,10,50,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,44,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,93,41,46,10,110,111,109,97,116,99,104>>]}]},{p,[],[<<70,111,114,32,116,104,105,115,32,112,97,116,116,101,114,110,44,32,80,67,82,69,32,107,110,111,119,115,32,116,104,97,116,32,97,110,121,32,109,97,116,99,104,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,34,97,34,44,32,115,111,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,115,107,105,112,115,32,97,108,111,110,103,32,116,104,101,32,115,117,98,106,101,99,116,32,116,111,32,34,97,34,32,98,101,102,111,114,101,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,102,105,114,115,116,32,115,101,116,32,111,102,32,100,97,116,97,46,32,84,104,101,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,116,104,101,110,32,115,117,99,99,101,101,100,115,46,32,73,110,32,116,104,101,32,115,101,99,111,110,100,32,99,97,108,108,32,116,104,101,32>>,{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]},<<32,100,105,115,97,98,108,101,115,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,115,107,105,112,115,32,97,108,111,110,103,32,116,111,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,110,111,119,32,97,112,112,108,105,101,100,32,115,116,97,114,116,105,110,103,32,97,116,32,34,120,34,44,32,97,110,100,32,115,111,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,119,105,116,104,111,117,116,32,116,114,121,105,110,103,32,97,110,121,32,111,116,104,101,114,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,115,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,114,101,97,99,104,32,105,116,58>>]},{pre,[],[{code,[],[<<40,42,80,82,85,78,69,41,32,111,114,32,40,42,80,82,85,78,69,58,78,65,77,69,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,110,111,114,109,97,108,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,115,116,97,114,116,105,110,103,32,99,104,97,114,97,99,116,101,114,32,116,104,101,110,32,111,99,99,117,114,115,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,111,99,99,117,114,32,97,115,32,117,115,117,97,108,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,40,42,80,82,85,78,69,41,44,32,98,101,102,111,114,101,32,105,116,32,105,115,32,114,101,97,99,104,101,100,44,32,111,114,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,116,111,32,116,104,101,32,114,105,103,104,116,32,111,102,32,40,42,80,82,85,78,69,41,44,32,98,117,116,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,99,114,111,115,115,32,40,42,80,82,85,78,69,41,46,32,73,110,32,115,105,109,112,108,101,32,99,97,115,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,40,42,80,82,85,78,69,41,32,105,115,32,106,117,115,116,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,117,115,101,115,32,111,102,32,40,42,80,82,85,78,69,41,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,101,120,112,114,101,115,115,101,100,32,105,110,32,97,110,121,32,111,116,104,101,114,32,119,97,121,46,32,73,110,32,97,110,32,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,44,32,40,42,80,82,85,78,69,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,40,42,67,79,77,77,73,84,41,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,80,82,85,78,69,41,46,32,73,116,32,105,115,32,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,32,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,101,110,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,111,117,116,32,97,32,110,97,109,101,44,32,105,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,105,115,32,110,111,116,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,44,32,98,117,116,32,116,111,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46>>]},{pre,[],[{code,[],[<<40,42,83,75,73,80,41>>]}]},{p,[],[<<40,42,83,75,73,80,41,32,115,105,103,110,105,102,105,101,115,32,116,104,97,116,32,119,104,97,116,101,118,101,114,32,116,101,120,116,32,119,97,115,32,109,97,116,99,104,101,100,32,108,101,97,100,105,110,103,32,117,112,32,116,111,32,105,116,32,99,97,110,110,111,116,32,98,101,32,112,97,114,116,32,111,102,32,97,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,46,32,67,111,110,115,105,100,101,114,58>>]},{pre,[],[{code,[],[<<97,43,40,42,83,75,73,80,41,98>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,97,97,97,99,46,46,46,34,44,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,102,97,105,108,115,32,40,115,116,97,114,116,105,110,103,32,97,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,116,114,105,110,103,41,44,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,115,107,105,112,115,32,111,110,32,116,111,32,115,116,97,114,116,32,116,104,101,32,110,101,120,116,32,97,116,116,101,109,112,116,32,97,116,32,34,99,34,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,116,104,105,115,32,101,120,97,109,112,108,101,59,32,97,108,116,104,111,117,103,104,32,105,116,32,119,111,117,108,100,32,115,117,112,112,114,101,115,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,100,117,114,105,110,103,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,44,32,116,104,101,32,115,101,99,111,110,100,32,97,116,116,101,109,112,116,32,119,111,117,108,100,32,115,116,97,114,116,32,97,116,32,116,104,101,32,115,101,99,111,110,100,32,99,104,97,114,97,99,116,101,114,32,105,110,115,116,101,97,100,32,111,102,32,115,107,105,112,112,105,110,103,32,111,110,32,116,111,32,34,99,34,46>>]},{p,[],[<<87,104,101,110,32,40,42,83,75,73,80,41,32,104,97,115,32,97,110,32,97,115,115,111,99,105,97,116,101,100,32,110,97,109,101,44,32,105,116,115,32,98,101,104,97,118,105,111,114,32,105,115,32,109,111,100,105,102,105,101,100,58>>]},{pre,[],[{code,[],[<<40,42,83,75,73,80,58,78,65,77,69,41>>]}]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,112,97,116,104,32,116,104,114,111,117,103,104,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,101,97,114,99,104,101,100,32,102,111,114,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,40,42,77,65,82,75,41,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,110,97,109,101,46,32,73,102,32,111,110,101,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,105,115,32,116,111,32,116,104,101,32,115,117,98,106,101,99,116,32,112,111,115,105,116,105,111,110,32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,97,116,32,40,42,77,65,82,75,41,32,105,110,115,116,101,97,100,32,111,102,32,116,111,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46,32,73,102,32,110,111,32,40,42,77,65,82,75,41,32,119,105,116,104,32,97,32,109,97,116,99,104,105,110,103,32,110,97,109,101,32,105,115,32,102,111,117,110,100,44,32,40,42,83,75,73,80,41,32,105,115,32,105,103,110,111,114,101,100,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,98,121,32,40,42,77,65,82,75,58,78,65,77,69,41,46,32,73,116,32,105,103,110,111,114,101,115,32,110,97,109,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,98,121,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,105,110,110,101,114,109,111,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,119,104,101,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,114,101,97,99,104,101,115,32,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,99,101,108,115,32,97,110,121,32,102,117,114,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,119,105,116,104,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,97,108,116,101,114,110,97,116,105,118,101,46>>]},{pre,[],[{code,[],[<<40,42,84,72,69,78,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41>>]}]},{p,[],[<<84,104,101,32,118,101,114,98,32,110,97,109,101,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,111,98,115,101,114,118,97,116,105,111,110,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,97,32,112,97,116,116,101,114,110,45,98,97,115,101,100,32,105,102,45,116,104,101,110,45,101,108,115,101,32,98,108,111,99,107,58>>]},{pre,[],[{code,[],[<<40,32,67,79,78,68,49,32,40,42,84,72,69,78,41,32,70,79,79,32,124,32,67,79,78,68,50,32,40,42,84,72,69,78,41,32,66,65,82,32,124,32,67,79,78,68,51,32,40,42,84,72,69,78,41,32,66,65,90,32,41,32,46,46,46>>]}]},{p,[],[<<73,102,32,116,104,101,32,67,79,78,68,49,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,70,79,79,32,105,115,32,116,114,105,101,100,32,40,97,110,100,32,112,111,115,115,105,98,108,121,32,102,117,114,116,104,101,114,32,105,116,101,109,115,32,97,102,116,101,114,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,103,114,111,117,112,32,105,102,32,70,79,79,32,115,117,99,99,101,101,100,115,41,46,32,79,110,32,102,97,105,108,117,114,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,115,107,105,112,115,32,116,111,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,97,110,100,32,116,114,105,101,115,32,67,79,78,68,50,44,32,119,105,116,104,111,117,116,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,67,79,78,68,49,46,32,73,102,32,116,104,97,116,32,115,117,99,99,101,101,100,115,32,97,110,100,32,66,65,82,32,102,97,105,108,115,44,32,67,79,78,68,51,32,105,115,32,116,114,105,101,100,46,32,73,102,32,66,65,90,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,114,101,32,105,115,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,32,119,104,97,116,101,118,101,114,32,99,97,109,101,32,98,101,102,111,114,101,32,116,104,101,32,101,110,116,105,114,101,32,103,114,111,117,112,46,32,73,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,116,32,105,110,115,105,100,101,32,97,110,32,97,108,116,101,114,110,97,116,105,111,110,44,32,105,116,32,97,99,116,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,84,72,69,78,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,84,72,69,78,41,46,32,73,116,32,105,115,32,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,32,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,42,84,72,69,78,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46>>]}]},{p,[],[<<65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,97,32,124,32,99,104,97,114,97,99,116,101,114,32,105,115,32,106,117,115,116,32,97,32,112,97,114,116,32,111,102,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,59,32,105,116,32,105,115,32,110,111,116,32,97,32,110,101,115,116,101,100,32,97,108,116,101,114,110,97,116,105,111,110,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,46,32,84,104,101,32,101,102,102,101,99,116,32,111,102,32,40,42,84,72,69,78,41,32,101,120,116,101,110,100,115,32,98,101,121,111,110,100,32,115,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,32,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,32,116,104,97,116,32,100,111,32,110,111,116,32,99,111,110,116,97,105,110,32,97,110,121,32,124,32,99,104,97,114,97,99,116,101,114,115,32,97,116,32,116,104,105,115,32,108,101,118,101,108,58>>]},{pre,[],[{code,[],[<<65,32,40,66,40,42,84,72,69,78,41,67,41,32,124,32,68>>]}]},{p,[],[<<73,102,32,65,32,97,110,100,32,66,32,97,114,101,32,109,97,116,99,104,101,100,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,97,32,102,97,105,108,117,114,101,32,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,65,59,32,105,110,115,116,101,97,100,32,105,116,32,109,111,118,101,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,104,97,116,32,105,115,44,32,68,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,105,110,103,32,40,42,84,72,69,78,41,32,105,115,32,103,105,118,101,110,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,32,105,116,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,58>>]},{pre,[],[{code,[],[<<65,32,40,66,40,42,84,72,69,78,41,67,32,124,32,40,42,70,65,73,76,41,41,32,124,32,68>>]}]},{p,[],[<<84,104,101,32,101,102,102,101,99,116,32,111,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,119,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,101,32,105,110,110,101,114,32,115,117,98,112,97,116,116,101,114,110,46,32,65,102,116,101,114,32,97,32,102,97,105,108,117,114,101,32,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,109,111,118,101,115,32,116,111,32,40,42,70,65,73,76,41,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,116,111,32,116,114,121,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,119,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,65,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,104,97,118,105,110,103,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,97,115,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,117,115,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,46,32,73,103,110,111,114,105,110,103,32,119,104,105,116,101,115,112,97,99,101,44,32,99,111,110,115,105,100,101,114,58>>]},{pre,[],[{code,[],[<<94,46,42,63,32,40,63,40,63,61,97,41,32,97,32,124,32,98,40,42,84,72,69,78,41,99,32,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,98,97,34,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,46,32,65,115,32,46,42,63,32,105,115,32,117,110,103,114,101,101,100,121,44,32,105,116,32,105,110,105,116,105,97,108,108,121,32,109,97,116,99,104,101,115,32,122,101,114,111,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,99,111,110,100,105,116,105,111,110,32,40,63,61,97,41,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,34,98,34,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,34,99,34,32,105,115,32,110,111,116,46,32,65,116,32,116,104,105,115,32,112,111,105,110,116,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,32,116,111,32,46,42,63,32,97,115,32,99,97,110,32,112,101,114,104,97,112,115,32,98,101,32,101,120,112,101,99,116,101,100,32,102,114,111,109,32,116,104,101,32,112,114,101,115,101,110,99,101,32,111,102,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,97,108,116,101,114,110,97,116,105,118,101,32,116,104,97,116,32,99,111,109,112,114,105,115,101,115,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,115,111,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,46,32,40,73,102,32,116,104,101,114,101,32,119,97,115,32,97,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,46,42,63,44,32,97,108,108,111,119,105,110,103,32,105,116,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,109,97,116,99,104,32,119,111,117,108,100,32,115,117,99,99,101,101,100,46,41>>]},{p,[],[<<84,104,101,32,118,101,114,98,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,112,114,111,118,105,100,101,32,102,111,117,114,32,100,105,102,102,101,114,101,110,116,32,34,115,116,114,101,110,103,116,104,115,34,32,111,102,32,99,111,110,116,114,111,108,32,119,104,101,110,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,115,58>>]},{ul,[],[{li,[],[{p,[],[<<40,42,84,72,69,78,41,32,105,115,32,116,104,101,32,119,101,97,107,101,115,116,44,32,99,97,114,114,121,105,110,103,32,111,110,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,46>>]}]},{li,[],[{p,[],[<<40,42,80,82,85,78,69,41,32,99,111,109,101,115,32,110,101,120,116,44,32,102,97,105,108,115,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,44,32,98,117,116,32,97,108,108,111,119,115,32,97,110,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,97,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,41,46>>]}]},{li,[],[{p,[],[<<40,42,83,75,73,80,41,32,105,115,32,115,105,109,105,108,97,114,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,97,100,118,97,110,99,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46>>]}]},{li,[],[{p,[],[<<40,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,115,116,114,111,110,103,101,115,116,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>]}]}]},{p,[],[{em,[],[<<77,111,114,101,32,116,104,97,110,32,79,110,101,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98>>]}]},{p,[],[<<73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,111,110,101,32,116,104,97,116,32,105,115,32,98,97,99,107,116,114,97,99,107,101,100,32,111,110,116,111,32,102,105,114,115,116,32,97,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,32,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,58>>]},{pre,[],[{code,[],[<<40,65,40,42,67,79,77,77,73,84,41,66,40,42,84,72,69,78,41,67,124,65,66,68,41>>]}]},{p,[],[<<73,102,32,65,32,109,97,116,99,104,101,115,32,98,117,116,32,66,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,67,79,77,77,73,84,41,32,99,97,117,115,101,115,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46,32,72,111,119,101,118,101,114,44,32,105,102,32,65,32,97,110,100,32,66,32,109,97,116,99,104,44,32,98,117,116,32,67,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,40,65,66,68,41,32,116,111,32,98,101,32,116,114,105,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,99,111,110,115,105,115,116,101,110,116,44,32,98,117,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46,32,73,116,32,109,101,97,110,115,32,116,104,97,116,32,105,102,32,116,119,111,32,111,114,32,109,111,114,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,112,112,101,97,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,44,32,116,104,101,32,108,97,115,116,32,111,102,32,116,104,101,109,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<46,46,46,40,42,67,79,77,77,73,84,41,40,42,80,82,85,78,69,41,46,46,46>>]}]},{p,[],[<<73,102,32,116,104,101,114,101,32,105,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,110,116,111,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,32,105,116,32,116,111,32,98,101,32,116,114,105,103,103,101,114,101,100,44,32,97,110,100,32,105,116,115,32,97,99,116,105,111,110,32,105,115,32,116,97,107,101,110,46,32,84,104,101,114,101,32,99,97,110,32,110,101,118,101,114,32,98,101,32,97,32,98,97,99,107,116,114,97,99,107,32,111,110,116,111,32,40,42,67,79,77,77,73,84,41,46>>]},{p,[],[{em,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,82,101,112,101,97,116,101,100,32,71,114,111,117,112,115>>]}]},{p,[],[<<80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,105,116,115,32,104,97,110,100,108,105,110,103,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,58>>]},{pre,[],[{code,[],[<<47,40,97,40,42,67,79,77,77,73,84,41,98,41,43,97,99,47>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,99,34,44,32,80,101,114,108,32,109,97,116,99,104,101,115,44,32,98,117,116,32,80,67,82,69,32,102,97,105,108,115,32,98,101,99,97,117,115,101,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,114,101,112,101,97,116,32,111,102,32,116,104,101,32,103,114,111,117,112,32,97,99,116,115,46>>]},{p,[],[{em,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<40,42,70,65,73,76,41,32,105,110,32,97,110,32,97,115,115,101,114,116,105,111,110,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,98,97,99,107,116,114,97,99,107,46>>]},{p,[],[<<40,42,65,67,67,69,80,84,41,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,73,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,40,42,65,67,67,69,80,84,41,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,102,97,105,108,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46>>]},{p,[],[<<84,104,101,32,111,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,116,114,101,97,116,101,100,32,115,112,101,99,105,97,108,108,121,32,105,102,32,116,104,101,121,32,97,112,112,101,97,114,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,46,32,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,40,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,111,110,115,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,105,115,32,105,115,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,46>>]},{p,[],[<<78,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,44,32,104,111,119,101,118,101,114,44,32,100,105,102,102,101,114,101,110,116,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,99,104,97,110,103,105,110,103,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,105,110,116,111,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,104,97,110,103,101,115,32,105,116,115,32,114,101,115,117,108,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,111,114,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,44,32,119,105,116,104,111,117,116,32,99,111,110,115,105,100,101,114,105,110,103,32,97,110,121,32,102,117,114,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,105,116,32,116,111,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,40,116,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,41,44,32,98,117,116,32,105,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,115,117,99,104,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,32,40,42,84,72,69,78,41,32,98,101,104,97,118,101,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46>>]},{p,[],[{em,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,83,117,98,114,111,117,116,105,110,101,115>>]}]},{p,[],[<<84,104,101,115,101,32,98,101,104,97,118,105,111,114,115,32,111,99,99,117,114,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,32,114,101,99,117,114,115,105,118,101,108,121,46,32,84,104,101,32,116,114,101,97,116,109,101,110,116,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,110,32,80,101,114,108,32,105,115,32,100,105,102,102,101,114,101,110,116,32,105,110,32,115,111,109,101,32,99,97,115,101,115,46>>]},{ul,[],[{li,[],[{p,[],[<<40,42,70,65,73,76,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,98,97,99,107,116,114,97,99,107,46>>]}]},{li,[],[{p,[],[<<40,42,65,67,67,69,80,84,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,102,116,101,114,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46>>]}]},{li,[],[{p,[],[<<40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,97,110,100,32,40,42,80,82,85,78,69,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>]}]},{li,[],[{p,[],[<<40,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,119,105,116,104,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,99,104,32,103,114,111,117,112,32,119,105,116,104,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>]}]}]}]},#{name => <<114,101>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,114,101,46,120,109,108],types => #{{compile_option,0} => {attribute,27,type,{compile_option,{type,27,union,[{atom,27,unicode},{atom,27,anchored},{atom,27,caseless},{atom,27,dollar_endonly},{atom,28,dotall},{atom,28,extended},{atom,28,firstline},{atom,28,multiline},{atom,29,no_auto_capture},{atom,29,dupnames},{atom,29,ungreedy},{type,30,tuple,[{atom,30,newline},{user_type,30,nl_spec,[]}]},{atom,31,bsr_anycrlf},{atom,31,bsr_unicode},{atom,32,no_start_optimize},{atom,32,ucp},{atom,32,never_utf}]},[]}},{mp,0} => {attribute,23,type,{mp,{type,23,tuple,[{atom,23,re_pattern},{var,23,'_'},{var,23,'_'},{var,23,'_'},{var,23,'_'}]},[]}},{nl_spec,0} => {attribute,25,type,{nl_spec,{type,25,union,[{atom,25,cr},{atom,25,crlf},{atom,25,lf},{atom,25,anycrlf},{atom,25,any}]},[]}}}},[{{function,version,0},[{file,[114,101,46,101,114,108]},{location,40}],[<<118,101,114,115,105,111,110,47,48>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,121,115,116,101,109,32,116,104,97,116,32,119,97,115,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,47,79,84,80,32,99,111,109,112,105,108,97,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,56,49>>,signature => [{attribute,40,spec,{{version,0},[{type,40,'fun',[{type,40,product,[]},{type,40,binary,[]}]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,compile,1},[{file,[114,101,46,101,114,108]},{location,49}],[<<99,111,109,112,105,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<99,111,109,112,105,108,101,40,82,101,103,101,120,112,44,91,93,41>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,56,57>>,signature => [{attribute,49,spec,{{compile,1},[{type,49,bounded_fun,[{type,49,'fun',[{type,49,product,[{var,49,'Regexp'}]},{type,49,union,[{type,49,tuple,[{atom,49,ok},{var,49,'MP'}]},{type,49,tuple,[{atom,49,error},{var,49,'ErrSpec'}]}]}]},[{type,50,constraint,[{atom,50,is_subtype},[{var,50,'Regexp'},{type,50,iodata,[]}]]},{type,51,constraint,[{atom,51,is_subtype},[{var,51,'MP'},{user_type,51,mp,[]}]]},{type,52,constraint,[{atom,52,is_subtype},[{var,52,'ErrSpec'},{type,52,tuple,[{ann_type,52,[{var,52,'ErrString'},{type,52,string,[]}]},{ann_type,52,[{var,52,'Position'},{type,52,non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,compile,2},[{file,[114,101,46,101,114,108]},{location,57}],[<<99,111,109,112,105,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,105,108,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,119,105,116,104,32,116,104,101,32,115,121,110,116,97,120,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,44,32,105,110,116,111,32,97,110,32,105,110,116,101,114,110,97,108,32,102,111,114,109,97,116,32,116,111,32,98,101,32,117,115,101,100,32,108,97,116,101,114,32,97,115,32,97,32,112,97,114,97,109,101,116,101,114,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<46>>]},{p,[],[<<67,111,109,112,105,108,105,110,103,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,115,97,109,101,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,109,97,116,99,104,105,110,103,32,97,103,97,105,110,115,116,32,109,117,108,116,105,112,108,101,32,115,117,98,106,101,99,116,115,32,100,117,114,105,110,103,32,116,104,101,32,108,105,102,101,116,105,109,101,32,111,102,32,116,104,101,32,112,114,111,103,114,97,109,46,32,67,111,109,112,105,108,105,110,103,32,111,110,99,101,32,97,110,100,32,101,120,101,99,117,116,105,110,103,32,109,97,110,121,32,116,105,109,101,115,32,105,115,32,102,97,114,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,111,109,112,105,108,105,110,103,32,101,97,99,104,32,116,105,109,101,32,111,110,101,32,119,97,110,116,115,32,116,111,32,109,97,116,99,104,46>>]},{p,[],[<<87,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<44,32,111,116,104,101,114,119,105,115,101,32,97,115,32,97,110,121,32,118,97,108,105,100,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<46>>]},{a,[{id,<<99,111,109,112,105,108,101,95,111,112,116,105,111,110,115>>}],[]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<117,110,105,99,111,100,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,100,101,32,105,115,32,116,111,32,98,101,32,114,117,110,32,97,103,97,105,110,115,116,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<32,115,117,98,106,101,99,116,46,32,65,108,115,111,32,99,111,110,115,105,100,101,114,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,119,104,101,110,32,117,115,105,110,103,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,46>>]}]},{dt,[],[{code,[],[<<97,110,99,104,111,114,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,102,111,114,99,101,100,32,116,111,32,98,101,32,34,97,110,99,104,111,114,101,100,34,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,115,101,97,114,99,104,101,100,32,40,116,104,101,32,34,115,117,98,106,101,99,116,32,115,116,114,105,110,103,34,41,46,32,84,104,105,115,32,101,102,102,101,99,116,32,99,97,110,32,97,108,115,111,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,110,115,116,114,117,99,116,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,46>>]}]},{dt,[],[{code,[],[<<99,97,115,101,108,101,115,115>>]}]},{dd,[],[{p,[],[<<76,101,116,116,101,114,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,98,111,116,104,32,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,46,32,73,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,105>>]},<<32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,105,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,85,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,105,110,32,116,104,101,32,73,83,79,32,56,56,53,57,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46>>]}]},{dt,[],[{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]}]},{dd,[],[{p,[],[<<65,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,111,112,116,105,111,110,44,32,97,32,100,111,108,108,97,114,32,97,108,115,111,32,109,97,116,99,104,101,115,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,117,116,32,110,111,116,32,98,101,102,111,114,101,32,97,110,121,32,111,116,104,101,114,32,110,101,119,108,105,110,101,115,41,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,105,103,110,111,114,101,100,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,44,32,97,110,100,32,105,116,32,99,97,110,110,111,116,32,98,101,32,115,101,116,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,46>>]}]},{dt,[],[{code,[],[<<100,111,116,97,108,108>>]}]},{dd,[],[{p,[],[<<65,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,116,104,111,115,101,32,105,110,100,105,99,97,116,105,110,103,32,110,101,119,108,105,110,101,46,32,87,105,116,104,111,117,116,32,105,116,44,32,97,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,105,115,32,97,116,32,97,32,110,101,119,108,105,110,101,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,115>>]},<<32,97,110,100,32,105,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,115,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,65,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<91,94,97,93>>]},<<44,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,116,104,105,115,32,111,112,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<101,120,116,101,110,100,101,100>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,101,116,44,32,109,111,115,116,32,119,104,105,116,101,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,97,114,101,32,116,111,116,97,108,108,121,32,105,103,110,111,114,101,100,32,101,120,99,101,112,116,32,119,104,101,110,32,101,115,99,97,112,101,100,32,111,114,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,72,111,119,101,118,101,114,44,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32>>,{code,[],[<<40,63,62>>]},<<32,116,104,97,116,32,105,110,116,114,111,100,117,99,101,32,118,97,114,105,111,117,115,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,110,111,114,32,119,105,116,104,105,110,32,97,32,110,117,109,101,114,105,99,97,108,32,113,117,97,110,116,105,102,105,101,114,32,115,117,99,104,32,97,115,32>>,{code,[],[<<123,49,44,51,125>>]},<<46,32,72,111,119,101,118,101,114,44,32,105,103,110,111,114,97,98,108,101,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,112,101,114,109,105,116,116,101,100,32,98,101,116,119,101,101,110,32,97,110,32,105,116,101,109,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,98,101,116,119,101,101,110,32,97,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,43,32,116,104,97,116,32,105,110,100,105,99,97,116,101,115,32,112,111,115,115,101,115,115,105,118,101,110,101,115,115,46>>]},{p,[],[<<87,104,105,116,101,32,115,112,97,99,101,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,49,49,41,44,32,98,101,99,97,117,115,101,32,80,101,114,108,32,100,105,100,32,110,111,116,32,116,114,101,97,116,32,116,104,105,115,32,99,104,97,114,97,99,116,101,114,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,44,32,97,110,100,32,86,84,32,105,115,32,110,111,119,32,116,114,101,97,116,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46>>]},{p,[],[<<84,104,105,115,32,97,108,115,111,32,99,97,117,115,101,115,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,44,32,105,110,99,108,117,115,105,118,101,44,32,116,111,32,98,101,32,105,103,110,111,114,101,100,46,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,39,115,32>>,{code,[],[<<47,120>>]},<<32,111,112,116,105,111,110,44,32,97,110,100,32,105,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,120,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46>>]},{p,[],[<<87,105,116,104,32,116,104,105,115,32,111,112,116,105,111,110,44,32,99,111,109,109,101,110,116,115,32,105,110,115,105,100,101,32,99,111,109,112,108,105,99,97,116,101,100,32,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,46,32,72,111,119,101,118,101,114,44,32,110,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,115,46,32,87,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,110,101,118,101,114,32,97,112,112,101,97,114,32,119,105,116,104,105,110,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,102,111,114,32,101,120,97,109,112,108,101,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,32>>,{code,[],[<<40,63,40>>]},<<32,116,104,97,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,46>>]}]},{dt,[],[{code,[],[<<102,105,114,115,116,108,105,110,101>>]}]},{dd,[],[{p,[],[<<65,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32,109,97,116,99,104,32,98,101,102,111,114,101,32,111,114,32,97,116,32,116,104,101,32,102,105,114,115,116,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,109,97,116,99,104,101,100,32,116,101,120,116,32,99,97,110,32,99,111,110,116,105,110,117,101,32,111,118,101,114,32,116,104,101,32,110,101,119,108,105,110,101,46>>]}]},{dt,[],[{code,[],[<<109,117,108,116,105,108,105,110,101>>]}]},{dd,[],[{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,115,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32,97,32,115,105,110,103,108,101,32,108,105,110,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,110,101,119,108,105,110,101,115,41,46,32,84,104,101,32,34,115,116,97,114,116,32,111,102,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40>>,{code,[],[<<94>>]},<<41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,119,104,105,108,101,32,116,104,101,32,34,101,110,100,32,111,102,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40>>,{code,[],[<<36>>]},<<41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,111,114,32,98,101,102,111,114,101,32,97,32,116,101,114,109,105,110,97,116,105,110,103,32,110,101,119,108,105,110,101,32,40,117,110,108,101,115,115,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,41,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46>>]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,34,115,116,97,114,116,32,111,102,32,108,105,110,101,34,32,97,110,100,32,34,101,110,100,32,111,102,32,108,105,110,101,34,32,99,111,110,115,116,114,117,99,116,115,32,109,97,116,99,104,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,105,110,103,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,97,115,32,119,101,108,108,32,97,115,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,97,110,100,32,101,110,100,46,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,109>>]},<<32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,109,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,110,101,119,108,105,110,101,115,32,105,110,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,110,111,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32>>,{code,[],[<<94>>]},<<32,111,114,32>>,{code,[],[<<36>>]},<<32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,115,101,116,116,105,110,103,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,104,97,115,32,110,111,32,101,102,102,101,99,116,46>>]}]},{dt,[],[{code,[],[<<110,111,95,97,117,116,111,95,99,97,112,116,117,114,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,104,101,32,117,115,101,32,111,102,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32>>,{code,[],[<<63>>]},<<32,98,101,104,97,118,101,115,32,97,115,32,105,102,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32>>,{code,[],[<<63,58>>]},<<46,32,78,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,97,112,116,117,114,105,110,103,32,40,97,110,100,32,116,104,101,121,32,97,99,113,117,105,114,101,32,110,117,109,98,101,114,115,32,105,110,32,116,104,101,32,117,115,117,97,108,32,119,97,121,41,46,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,46>>]}]},{dt,[],[{code,[],[<<100,117,112,110,97,109,101,115>>]}]},{dd,[],[{p,[],[<<78,97,109,101,115,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,110,101,101,100,32,110,111,116,32,98,101,32,117,110,105,113,117,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,102,111,114,32,99,101,114,116,97,105,110,32,116,121,112,101,115,32,111,102,32,112,97,116,116,101,114,110,32,119,104,101,110,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,101,118,101,114,32,98,101,32,109,97,116,99,104,101,100,46,32,77,111,114,101,32,100,101,116,97,105,108,115,32,111,102,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46>>]}]},{dt,[],[{code,[],[<<117,110,103,114,101,101,100,121>>]}]},{dd,[],[{p,[],[<<73,110,118,101,114,116,115,32,116,104,101,32,34,103,114,101,101,100,105,110,101,115,115,34,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,115,111,32,116,104,97,116,32,116,104,101,121,32,97,114,101,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,98,101,99,111,109,101,32,103,114,101,101,100,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,34,63,34,46,32,73,116,32,105,115,32,110,111,116,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,97,32>>,{code,[],[<<40,63,85,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,119,105,116,104,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]}]},{dd,[],[{p,[],[<<79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46>>]},{dl,[],[{dt,[],[{code,[],[<<99,114>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32>>,{code,[],[<<99,114>>]},<<32,40,65,83,67,73,73,32,49,51,41,46>>]}]},{dt,[],[{code,[],[<<108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<99,114,108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46>>]}]},{dt,[],[{code,[],[<<97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46>>]}]},{dt,[],[{code,[],[<<97,110,121>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46>>]}]}]}]},{dt,[],[{code,[],[<<98,115,114,95,97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46>>]}]},{dt,[],[{code,[],[<<98,115,114,95,117,110,105,99,111,100,101>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46>>]}]},{dt,[],[{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,99,97,110,32,109,97,108,102,117,110,99,116,105,111,110,32,105,102,32,34,83,112,101,99,105,97,108,32,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,65,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,119,111,117,108,100,32,98,101,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,68,69,70,65,66,67,34,32,97,103,97,105,110,115,116,32,34,40,42,67,79,77,77,73,84,41,65,66,67,34,44,32,119,104,101,114,101,32,116,104,101,32,115,116,97,114,116,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,80,67,82,69,32,119,111,117,108,100,32,115,107,105,112,32,116,104,101,32,115,117,98,106,101,99,116,32,117,112,32,116,111,32,34,65,34,32,97,110,100,32,110,101,118,101,114,32,114,101,97,108,105,122,101,32,116,104,97,116,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,105,110,115,116,114,117,99,116,105,111,110,32,105,115,32,116,111,32,104,97,118,101,32,109,97,100,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,97,105,108,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,114,101,108,101,118,97,110,116,32,105,102,32,121,111,117,32,117,115,101,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,44,32,97,115,32,100,105,115,99,117,115,115,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,101,103,101,120,112,95,115,121,110,116,97,120,95,100,101,116,97,105,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115>>]},<<46>>]}]},{dt,[],[{code,[],[<<117,99,112>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,116,111,32,98,101,32,117,115,101,100,32,119,104,101,110,32,114,101,115,111,108,118,105,110,103,32,92,66,44,32,92,98,44,32,92,68,44,32,92,100,44,32,92,83,44,32,92,115,44,32,92,87,32,97,110,100,32,92,119,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,102,108,97,103,44,32,111,110,108,121,32,73,83,79,32,76,97,116,105,110,45,49,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,85,115,105,110,103,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,104,117,114,116,115,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,117,116,32,105,115,32,115,101,109,97,110,116,105,99,97,108,108,121,32,99,111,114,114,101,99,116,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,98,101,121,111,110,100,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,46>>]}]},{dt,[],[{code,[],[<<110,101,118,101,114,95,117,116,102>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,40,42,85,84,70,41,32,97,110,100,47,111,114,32,40,42,85,84,70,56,41,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,32,97,114,101,32,102,111,114,98,105,100,100,101,110,46,32,84,104,105,115,32,102,108,97,103,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<46,32,85,115,101,102,117,108,32,105,102,32,73,83,79,32,76,97,116,105,110,45,49,32,112,97,116,116,101,114,110,115,32,102,114,111,109,32,97,110,32,101,120,116,101,114,110,97,108,32,115,111,117,114,99,101,32,97,114,101,32,116,111,32,98,101,32,99,111,109,112,105,108,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,57,55>>,signature => [{attribute,57,spec,{{compile,2},[{type,57,bounded_fun,[{type,57,'fun',[{type,57,product,[{var,57,'Regexp'},{var,57,'Options'}]},{type,57,union,[{type,57,tuple,[{atom,57,ok},{var,57,'MP'}]},{type,57,tuple,[{atom,57,error},{var,57,'ErrSpec'}]}]}]},[{type,58,constraint,[{atom,58,is_subtype},[{var,58,'Regexp'},{type,58,union,[{type,58,iodata,[]},{remote_type,58,[{atom,58,unicode},{atom,58,charlist},[]]}]}]]},{type,59,constraint,[{atom,59,is_subtype},[{var,59,'Options'},{type,59,list,[{var,59,'Option'}]}]]},{type,60,constraint,[{atom,60,is_subtype},[{var,60,'Option'},{user_type,60,compile_option,[]}]]},{type,61,constraint,[{atom,61,is_subtype},[{var,61,'MP'},{user_type,61,mp,[]}]]},{type,62,constraint,[{atom,62,is_subtype},[{var,62,'ErrSpec'},{type,62,tuple,[{ann_type,62,[{var,62,'ErrString'},{type,62,string,[]}]},{ann_type,62,[{var,62,'Position'},{type,62,non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,inspect,2},[{file,[114,101,46,101,114,108]},{location,143}],[<<105,110,115,112,101,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,97,107,101,115,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32,97,110,32,105,116,101,109,44,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,114,101,108,101,118,97,110,116,32,100,97,116,97,32,102,114,111,109,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,111,110,108,121,32,115,117,112,112,111,114,116,101,100,32,105,116,101,109,32,105,115,32>>,{code,[],[<<110,97,109,101,108,105,115,116>>]},<<44,32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,110,97,109,101,108,105,115,116,44,32,91,98,105,110,97,114,121,40,41,93,125>>]},<<44,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,40,117,110,105,113,117,101,41,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,111,107,44,77,80,68,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,67,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,44,91,100,117,112,110,97,109,101,115,93,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,56,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,52,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,68,44,110,97,109,101,108,105,115,116,41,46,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125>>]}]},{p,[],[<<78,111,116,105,99,101,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,101,120,97,109,112,108,101,32,116,104,97,116,32,116,104,101,32,100,117,112,108,105,99,97,116,101,32,110,97,109,101,32,111,110,108,121,32,111,99,99,117,114,115,32,111,110,99,101,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,108,105,115,116,32,105,115,32,105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,114,101,32,116,104,101,32,110,97,109,101,115,32,97,114,101,32,112,111,115,105,116,105,111,110,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,110,97,109,101,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,111,114,100,101,114,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,102,32>>,{code,[],[<<123,99,97,112,116,117,114,101,44,32,97,108,108,95,110,97,109,101,115,125>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,110,32,111,112,116,105,111,110,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<46,32,89,111,117,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,99,114,101,97,116,101,32,97,32,110,97,109,101,45,116,111,45,118,97,108,117,101,32,109,97,112,112,105,110,103,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,108,105,107,101,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,123,110,97,109,101,108,105,115,116,44,32,78,125,32,61,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,109,97,116,99,104,44,76,125,32,61,32,114,101,58,114,117,110,40,34,65,65,34,44,77,80,44,91,123,99,97,112,116,117,114,101,44,97,108,108,95,110,97,109,101,115,44,98,105,110,97,114,121,125,93,41,46,10,123,109,97,116,99,104,44,91,60,60,34,65,34,62,62,44,60,60,62,62,44,60,60,62,62,93,125,10,52,62,32,78,97,109,101,77,97,112,32,61,32,108,105,115,116,115,58,122,105,112,40,78,44,76,41,46,10,91,123,60,60,34,65,34,62,62,44,60,60,34,65,34,62,62,125,44,123,60,60,34,66,34,62,62,44,60,60,62,62,125,44,123,60,60,34,67,34,62,62,44,60,60,62,62,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,51,48,54>>,signature => [{attribute,143,spec,{{inspect,2},[{type,143,bounded_fun,[{type,143,'fun',[{type,143,product,[{var,143,'MP'},{var,143,'Item'}]},{type,143,tuple,[{atom,143,namelist},{type,143,list,[{type,143,binary,[]}]}]}]},[{type,144,constraint,[{atom,144,is_subtype},[{var,144,'MP'},{user_type,144,mp,[]}]]},{type,145,constraint,[{atom,145,is_subtype},[{var,145,'Item'},{atom,145,namelist}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,replace,3},[{file,[114,101,46,101,114,108]},{location,353}],[<<114,101,112,108,97,99,101,47,51>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,44,32,91,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,51,53,48>>,signature => [{attribute,353,spec,{{replace,3},[{type,353,bounded_fun,[{type,353,'fun',[{type,353,product,[{var,353,'Subject'},{var,353,'RE'},{var,353,'Replacement'}]},{type,353,union,[{type,353,iodata,[]},{remote_type,353,[{atom,353,unicode},{atom,353,charlist},[]]}]}]},[{type,354,constraint,[{atom,354,is_subtype},[{var,354,'Subject'},{type,354,union,[{type,354,iodata,[]},{remote_type,354,[{atom,354,unicode},{atom,354,charlist},[]]}]}]]},{type,355,constraint,[{atom,355,is_subtype},[{var,355,'RE'},{type,355,union,[{user_type,355,mp,[]},{type,355,iodata,[]}]}]]},{type,356,constraint,[{atom,356,is_subtype},[{var,356,'Replacement'},{type,356,union,[{type,356,iodata,[]},{remote_type,356,[{atom,356,unicode},{atom,356,charlist},[]]}]}]]}]]}]}}]}},{{function,replace,4},[{file,[114,101,46,101,114,108]},{location,366}],[<<114,101,112,108,97,99,101,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,112,108,97,99,101,115,32,116,104,101,32,109,97,116,99,104,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32>>,{code,[],[<<82,101,112,108,97,99,101,109,101,110,116>>]},<<46>>]},{p,[],[<<84,104,101,32,112,101,114,109,105,115,115,105,98,108,101,32,111,112,116,105,111,110,115,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,102,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,111,112,116,105,111,110>>,{code,[],[<<32,99,97,112,116,117,114,101>>]},<<32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46,32,73,110,115,116,101,97,100,32,97,32>>,{code,[],[<<123,114,101,116,117,114,110,44,32,82,101,116,117,114,110,84,121,112,101,125>>]},<<32,105,115,32,112,114,101,115,101,110,116,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<44,32,99,111,110,115,116,114,117,99,116,101,100,32,105,110,32,97,32,119,97,121,32,116,111,32,109,105,110,105,109,105,122,101,32,99,111,112,121,105,110,103,46,32,84,104,101,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,117,115,101,100,32,100,105,114,101,99,116,108,121,32,105,110,32,109,97,110,121,32,73,47,79,32,111,112,101,114,97,116,105,111,110,115,46,32,73,102,32,97,32,102,108,97,116,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,32>>,{code,[],[<<123,114,101,116,117,114,110,44,32,108,105,115,116,125>>]},<<46,32,73,102,32,97,32,98,105,110,97,114,121,32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,32>>,{code,[],[<<123,114,101,116,117,114,110,44,32,98,105,110,97,114,121,125>>]},<<46>>]},{p,[],[<<65,115,32,105,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<114,117,110,47,51>>]},<<44,32,97,110,32>>,{code,[],[<<109,112,40,41>>]},<<32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,114,101,113,117,105,114,101,115,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,116,111,32,98,101,32,97,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,97,114,101,32,116,111,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<115,46>>]},{p,[],[<<84,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,115,116,114,105,110,103,32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,32>>,{code,[],[<<38>>]},<<44,32,119,104,105,99,104,32,105,110,115,101,114,116,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,105,110,103,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32>>,{code,[],[<<92>>]},<<78,32,40,119,104,101,114,101,32,78,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,62,32,48,41,44,32>>,{code,[],[<<92,103>>]},<<78,44,32,111,114,32>>,{code,[],[<<92,103,123>>]},<<78>>,{code,[],[<<125>>]},<<44,32,114,101,115,117,108,116,105,110,103,32,105,110,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,110,117,109,98,101,114,32,78,44,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,73,102,32,110,111,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,105,116,104,32,116,104,97,116,32,110,117,109,98,101,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,46>>]},{p,[],[<<84,111,32,105,110,115,101,114,116,32,97,110,32,38,32,111,114,32,97,32,92,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,112,114,101,99,101,100,101,32,105,116,32,119,105,116,104,32,97,32,92,46,32,78,111,116,105,99,101,32,116,104,97,116,32,69,114,108,97,110,103,32,97,108,114,101,97,100,121,32,103,105,118,101,115,32,97,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,111,32,92,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,115,111,32,97,32,115,105,110,103,108,101,32,92,32,109,117,115,116,32,98,101,32,119,114,105,116,116,101,110,32,97,115,32>>,{code,[],[<<34,92,92,34>>]},<<32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,97,32,100,111,117,98,108,101,32,92,32,97,115,32>>,{code,[],[<<34,92,92,92,92,34>>]},<<46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[],[<<114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<34,97,98,91,99,93,100,34>>]}]},{p,[],[<<119,104,105,108,101>>]},{pre,[],[{code,[],[<<114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,92,92,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<34,97,98,91,38,93,100,34>>]}]},{p,[],[<<65,115,32,119,105,116,104,32>>,{code,[],[<<114,117,110,47,51>>]},<<44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,114,97,105,115,101,32,116,104,101,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,46,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,114,114,111,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,51,54,48>>,signature => [{attribute,366,spec,{{replace,4},[{type,366,bounded_fun,[{type,366,'fun',[{type,366,product,[{var,366,'Subject'},{var,366,'RE'},{var,366,'Replacement'},{var,366,'Options'}]},{type,366,union,[{type,366,iodata,[]},{remote_type,366,[{atom,366,unicode},{atom,366,charlist},[]]}]}]},[{type,367,constraint,[{atom,367,is_subtype},[{var,367,'Subject'},{type,367,union,[{type,367,iodata,[]},{remote_type,367,[{atom,367,unicode},{atom,367,charlist},[]]}]}]]},{type,368,constraint,[{atom,368,is_subtype},[{var,368,'RE'},{type,368,union,[{user_type,368,mp,[]},{type,368,iodata,[]},{remote_type,368,[{atom,368,unicode},{atom,368,charlist},[]]}]}]]},{type,369,constraint,[{atom,369,is_subtype},[{var,369,'Replacement'},{type,369,union,[{type,369,iodata,[]},{remote_type,369,[{atom,369,unicode},{atom,369,charlist},[]]}]}]]},{type,370,constraint,[{atom,370,is_subtype},[{var,370,'Options'},{type,370,list,[{var,370,'Option'}]}]]},{type,371,constraint,[{atom,371,is_subtype},[{var,371,'Option'},{type,371,union,[{atom,371,anchored},{atom,371,global},{atom,371,notbol},{atom,371,noteol},{atom,371,notempty},{atom,372,notempty_atstart},{type,373,tuple,[{atom,373,offset},{type,373,non_neg_integer,[]}]},{type,373,tuple,[{atom,373,newline},{var,373,'NLSpec'}]},{atom,373,bsr_anycrlf},{type,374,tuple,[{atom,374,match_limit},{type,374,non_neg_integer,[]}]},{type,375,tuple,[{atom,375,match_limit_recursion},{type,375,non_neg_integer,[]}]},{atom,376,bsr_unicode},{type,376,tuple,[{atom,376,return},{var,376,'ReturnType'}]},{var,376,'CompileOpt'}]}]]},{type,377,constraint,[{atom,377,is_subtype},[{var,377,'ReturnType'},{type,377,union,[{atom,377,iodata},{atom,377,list},{atom,377,binary}]}]]},{type,378,constraint,[{atom,378,is_subtype},[{var,378,'CompileOpt'},{user_type,378,compile_option,[]}]]},{type,379,constraint,[{atom,379,is_subtype},[{var,379,'NLSpec'},{type,379,union,[{atom,379,cr},{atom,379,crlf},{atom,379,lf},{atom,379,anycrlf},{atom,379,any}]}]]}]]}]}}]}},{{function,run,2},[{file,[114,101,46,101,114,108]},{location,67}],[<<114,117,110,47,50>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<114,117,110,40,83,117,98,106,101,99,116,44,82,69,44,91,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,52,49,48>>,signature => [{attribute,67,spec,{{run,2},[{type,67,bounded_fun,[{type,67,'fun',[{type,67,product,[{var,67,'Subject'},{var,67,'RE'}]},{type,67,union,[{type,67,tuple,[{atom,67,match},{var,67,'Captured'}]},{atom,67,nomatch}]}]},[{type,68,constraint,[{atom,68,is_subtype},[{var,68,'Subject'},{type,68,union,[{type,68,iodata,[]},{remote_type,68,[{atom,68,unicode},{atom,68,charlist},[]]}]}]]},{type,69,constraint,[{atom,69,is_subtype},[{var,69,'RE'},{type,69,union,[{user_type,69,mp,[]},{type,69,iodata,[]}]}]]},{type,70,constraint,[{atom,70,is_subtype},[{var,70,'Captured'},{type,70,list,[{var,70,'CaptureData'}]}]]},{type,71,constraint,[{atom,71,is_subtype},[{var,71,'CaptureData'},{type,71,tuple,[{type,71,integer,[]},{type,71,integer,[]}]}]]}]]}]}}]}},{{function,run,3},[{file,[114,101,46,101,114,108]},{location,76}],[<<114,117,110,47,51>>],#{<<101,110>> => [{p,[],[<<69,120,101,99,117,116,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,44,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<109,97,116,99,104,47,123,109,97,116,99,104,44,32,67,97,112,116,117,114,101,100,125>>]},<<32,111,114,32>>,{code,[],[<<110,111,109,97,116,99,104>>]},<<46,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,101,105,116,104,101,114,32,97,115,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,111,109,112,105,108,101,100,32,40,97,115,32,98,121,32>>,{code,[],[<<99,111,109,112,105,108,101,47,50>>]},<<41,32,97,110,100,32,101,120,101,99,117,116,101,100,44,32,111,114,32,97,115,32,97,32,112,114,101,99,111,109,112,105,108,101,100,32>>,{code,[],[<<109,112,40,41>>]},<<32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,115,117,98,106,101,99,116,32,100,105,114,101,99,116,108,121,46>>]},{p,[],[<<87,104,101,110,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,44,32,101,120,99,101,112,116,105,111,110,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,115,32,116,104,114,111,119,110,32,105,102,32,97,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,67,97,108,108,32>>,{code,[],[<<99,111,109,112,105,108,101,47,50>>]},<<32,116,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,44,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,99,97,110,32,111,110,108,121,32,99,111,110,116,97,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{code,[],[<<97,110,99,104,111,114,101,100>>]}]},{li,[],[{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125>>]}]},{li,[],[{code,[],[<<103,108,111,98,97,108>>]}]},{li,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{li,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{li,[],[{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]}]},{li,[],[{code,[],[<<110,111,116,98,111,108>>]}]},{li,[],[{code,[],[<<110,111,116,101,109,112,116,121>>]}]},{li,[],[{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]}]},{li,[],[{code,[],[<<110,111,116,101,111,108>>]}]},{li,[],[{code,[],[<<123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{li,[],[{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]}]}]},{p,[],[<<79,116,104,101,114,119,105,115,101,32,97,108,108,32,111,112,116,105,111,110,115,32,118,97,108,105,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<99,111,109,112,105,108,101,47,50>>]},<<32,97,114,101,32,97,108,115,111,32,97,108,108,111,119,101,100,46,32,79,112,116,105,111,110,115,32,97,108,108,111,119,101,100,32,98,111,116,104,32,102,111,114,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,44,32,110,97,109,101,108,121,32>>,{code,[],[<<97,110,99,104,111,114,101,100>>]},<<32,97,110,100,32>>,{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]},<<44,32,97,102,102,101,99,116,32,98,111,116,104,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,105,102,32,112,114,101,115,101,110,116,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32,110,111,110,45,112,114,101,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,105,115,32,116,111,32,98,101,32,112,114,111,118,105,100,101,100,32,97,115,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<44,32,111,116,104,101,114,119,105,115,101,32,97,110,121,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<32,119,105,108,108,32,100,111,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,32,97,110,100,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,98,111,116,104,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,97,110,100,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,115,40,41>>]},<<46>>]},{p,[],[{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125>>]},<<32,100,101,102,105,110,101,115,32,119,104,97,116,32,116,111,32,114,101,116,117,114,110,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,112,111,110,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,46,32,84,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,116,117,112,108,101,32,99,97,110,32,99,111,110,116,97,105,110,32,98,111,116,104,32,97,32,118,97,108,117,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,119,104,105,99,104,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,44,32,97,110,100,32,97,32,116,121,112,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,32,40,97,115,32,105,110,100,101,120,32,116,117,112,108,101,115,44,32,108,105,115,116,115,44,32,111,114,32,98,105,110,97,114,105,101,115,41,46,32,84,104,101,32,111,112,116,105,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,100,101,116,97,105,108,32,98,101,108,111,119,46>>]},{p,[],[<<73,102,32,116,104,101,32,99,97,112,116,117,114,101,32,111,112,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,97,116,32,110,111,32,115,117,98,115,116,114,105,110,103,32,99,97,112,116,117,114,105,110,103,32,105,115,32,116,111,32,98,101,32,100,111,110,101,32,40>>,{code,[],[<<123,99,97,112,116,117,114,101,44,32,110,111,110,101,125>>]},<<41,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,32>>,{code,[],[<<109,97,116,99,104>>]},<<32,117,112,111,110,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,109,97,116,99,104,44,32,86,97,108,117,101,76,105,115,116,125>>]},<<46,32,68,105,115,97,98,108,105,110,103,32,99,97,112,116,117,114,105,110,103,32,99,97,110,32,98,101,32,100,111,110,101,32,101,105,116,104,101,114,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<110,111,110,101>>]},<<32,111,114,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,97,115,32>>,{code,[],[<<86,97,108,117,101,83,112,101,99>>]},<<46>>]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]},<<32,97,100,100,115,32,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32,116,104,97,116,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,116,117,112,108,101,32,101,105,116,104,101,114,32,105,110,100,105,99,97,116,101,115,32,97,32,109,97,116,99,104,105,110,103,32,101,114,114,111,114,32,40>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,111,114,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]},<<41,44,32,111,114,32,97,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,44,32,119,104,101,114,101,32,116,104,101,32,101,114,114,111,114,32,116,117,112,108,101,32,104,97,115,32,116,104,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,101,114,114,111,114,44,32,123,99,111,109,112,105,108,101,44,32,67,111,109,112,105,108,101,69,114,114,125,125>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]},<<32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,101,114,114,111,114,32,116,117,112,108,101,115,44,32,98,117,116,32,114,101,112,111,114,116,115,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,97,115,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,102,97,105,108,101,100,32,109,97,116,99,104,101,115,32,98,101,99,97,117,115,101,32,111,102,32,101,120,99,101,101,100,101,100,32,109,97,116,99,104,32,108,105,109,105,116,115,32,115,105,109,112,108,121,32,97,115,32>>,{code,[],[<<110,111,109,97,116,99,104>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,32,97,114,101,32,114,101,108,101,118,97,110,116,32,102,111,114,32,101,120,101,99,117,116,105,111,110,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,110,99,104,111,114,101,100>>]}]},{dd,[],[{p,[],[<<76,105,109,105,116,115,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,116,111,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,46,32,73,102,32,97,32,112,97,116,116,101,114,110,32,119,97,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32>>,{code,[],[<<97,110,99,104,111,114,101,100>>]},<<44,32,111,114,32,116,117,114,110,101,100,32,111,117,116,32,116,111,32,98,101,32,97,110,99,104,111,114,101,100,32,98,121,32,118,105,114,116,117,101,32,111,102,32,105,116,115,32,99,111,110,116,101,110,116,115,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,109,97,100,101,32,117,110,97,110,99,104,111,114,101,100,32,97,116,32,109,97,116,99,104,105,110,103,32,116,105,109,101,44,32,104,101,110,99,101,32,116,104,101,114,101,32,105,115,32,110,111,32>>,{code,[],[<<117,110,97,110,99,104,111,114,101,100>>]},<<32,111,112,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<103,108,111,98,97,108>>]}]},{dd,[],[{p,[],[<<73,109,112,108,101,109,101,110,116,115,32,103,108,111,98,97,108,32,40,114,101,112,101,116,105,116,105,118,101,41,32,115,101,97,114,99,104,32,40,102,108,97,103,32>>,{code,[],[<<103>>]},<<32,105,110,32,80,101,114,108,41,46,32,69,97,99,104,32,109,97,116,99,104,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,112,101,99,105,102,105,99,32,109,97,116,99,104,32,97,110,100,32,97,110,121,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,40,111,114,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,111,112,116,105,111,110,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<46,32,84,104,101,32>>,{code,[],[<<67,97,112,116,117,114,101,100>>]},<<32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,104,101,110,99,101,32,97,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,111,102,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<115,32,119,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46>>]},{p,[],[<<84,104,101,32,105,110,116,101,114,97,99,116,105,111,110,32,111,102,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,119,105,116,104,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,115,117,114,112,114,105,115,101,115,32,115,111,109,101,32,117,115,101,114,115,46,32,87,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,104,97,110,100,108,101,115,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,80,101,114,108,58,32,97,32,122,101,114,111,45,108,101,110,103,116,104,32,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,105,110,116,32,105,115,32,97,108,115,111,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]},<<46,32,73,102,32,116,104,97,116,32,115,101,97,114,99,104,32,103,105,118,101,115,32,97,32,114,101,115,117,108,116,32,111,102,32,108,101,110,103,116,104,32,62,32,48,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,105,110,99,108,117,100,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,99,97,116,34,44,34,40,124,97,116,41,34,44,91,103,108,111,98,97,108,93,41,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,105,110,103,115,32,97,114,101,32,112,101,114,102,111,114,109,101,100,58>>]},{dl,[],[{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32>>,{code,[],[<<40,124,97,116,41>>]},<<32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,32,116,104,101,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,32,111,102,32,115,116,114,105,110,103,32>>,{code,[],[<<99,97,116>>]},<<44,32,103,105,118,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,115,101,116,32>>,{code,[],[<<91,123,48,44,48,125,44,123,48,44,48,125,93>>]},<<32,40,116,104,101,32,115,101,99,111,110,100,32>>,{code,[],[<<123,48,44,48,125>>]},<<32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,41,46,32,65,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,32,105,115,32,48,44,32,119,101,32,100,111,32,110,111,116,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,112,111,115,105,116,105,111,110,32,121,101,116,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<48>>]},<<32,119,105,116,104,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,101,97,114,99,104,32,105,115,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]},<<32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,115,105,116,105,111,110,44,32,119,104,105,99,104,32,100,111,101,115,32,110,111,116,32,103,105,118,101,32,97,110,121,32,105,110,116,101,114,101,115,116,105,110,103,32,114,101,115,117,108,116,32,111,102,32,108,111,110,103,101,114,32,108,101,110,103,116,104,44,32,115,111,32,116,104,101,32,115,101,97,114,99,104,32,112,111,115,105,116,105,111,110,32,105,115,32,97,100,118,97,110,99,101,100,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40>>,{code,[],[<<97>>]},<<41,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<49>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,101,97,114,99,104,32,114,101,115,117,108,116,115,32,105,110,32>>,{code,[],[<<91,123,49,44,48,125,44,123,49,44,48,125,93>>]},<<44,32,115,111,32,116,104,105,115,32,115,101,97,114,99,104,32,105,115,32,97,108,115,111,32,114,101,112,101,97,116,101,100,32,119,105,116,104,32,116,104,101,32,101,120,116,114,97,32,111,112,116,105,111,110,115,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<49>>]},<<32,119,105,116,104,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]}]},{dd,[],[{p,[],[<<65,108,116,101,114,110,97,116,105,118,101,32>>,{code,[],[<<97,98>>]},<<32,105,115,32,102,111,117,110,100,32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,91,123,49,44,50,125,44,123,49,44,50,125,93,46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,32,111,102,32,114,101,115,117,108,116,115,32,97,110,100,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,101,97,114,99,104,32,115,116,114,105,110,103,32,105,115,32,97,100,118,97,110,99,101,100,32,116,119,111,32,115,116,101,112,115,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<51>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,101,97,114,99,104,32,111,110,99,101,32,97,103,97,105,110,32,109,97,116,99,104,101,115,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,103,105,118,105,110,103,32>>,{code,[],[<<91,123,51,44,48,125,44,123,51,44,48,125,93>>]},<<46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<49>>]},<<32,119,105,116,104,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,103,105,118,101,115,32,110,111,32,114,101,115,117,108,116,32,111,102,32,108,101,110,103,116,104,32,62,32,48,32,97,110,100,32,119,101,32,97,114,101,32,97,116,32,116,104,101,32,108,97,115,116,32,112,111,115,105,116,105,111,110,44,32,115,111,32,116,104,101,32,103,108,111,98,97,108,32,115,101,97,114,99,104,32,105,115,32,99,111,109,112,108,101,116,101,46>>]}]}]},{p,[],[<<84,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,97,108,108,32,105,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,91,123,48,44,48,125,44,123,48,44,48,125,93,44,91,123,49,44,48,125,44,123,49,44,48,125,93,44,91,123,49,44,50,125,44,123,49,44,50,125,93,44,91,123,51,44,48,125,44,123,51,44,48,125,93,93,125>>]}]}]},{dt,[],[{code,[],[<<110,111,116,101,109,112,116,121>>]}]},{dd,[],[{p,[],[<<65,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,97,32,118,97,108,105,100,32,109,97,116,99,104,32,105,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,101,120,105,115,116,44,32,116,104,101,121,32,97,114,101,32,116,114,105,101,100,46,32,73,102,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{p,[],[<<73,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,32,115,116,114,105,110,103,32,110,111,116,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,34,97,34,32,111,114,32,34,98,34,44,32,105,116,32,119,111,117,108,100,32,110,111,114,109,97,108,108,121,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,58>>]},{pre,[],[{code,[],[<<97,63,98,63>>]}]},{p,[],[<<87,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,116,101,109,112,116,121>>]},<<44,32,116,104,105,115,32,109,97,116,99,104,32,105,115,32,105,110,118,97,108,105,100,44,32,115,111,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,115,101,97,114,99,104,101,115,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,115,116,114,105,110,103,32,102,111,114,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32,34,97,34,32,111,114,32,34,98,34,46>>]}]},{dt,[],[{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]}]},{dd,[],[{p,[],[<<76,105,107,101,32>>,{code,[],[<<110,111,116,101,109,112,116,121>>]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,97,116,99,104,32,116,104,97,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,110,99,104,111,114,101,100,44,32,115,117,99,104,32,97,32,109,97,116,99,104,32,99,97,110,32,111,99,99,117,114,32,111,110,108,121,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,92,75,46>>]},{p,[],[<<80,101,114,108,32,104,97,115,32,110,111,32,100,105,114,101,99,116,32,101,113,117,105,118,97,108,101,110,116,32,111,102,32>>,{code,[],[<<110,111,116,101,109,112,116,121>>]},<<32,111,114,32>>,{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]},<<44,32,98,117,116,32,105,116,32,100,111,101,115,32,109,97,107,101,32,97,32,115,112,101,99,105,97,108,32,99,97,115,101,32,111,102,32,97,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,111,102,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,119,105,116,104,105,110,32,105,116,115,32,115,112,108,105,116,40,41,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,119,104,101,110,32,117,115,105,110,103,32,109,111,100,105,102,105,101,114,32>>,{code,[],[<<47,103>>]},<<46,32,84,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,101,109,117,108,97,116,101,100,32,97,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,32,110,117,108,108,32,115,116,114,105,110,103,32,98,121,32,102,105,114,115,116,32,116,114,121,105,110,103,32,116,104,101,32,109,97,116,99,104,32,97,103,97,105,110,32,97,116,32,116,104,101,32,115,97,109,101,32,111,102,102,115,101,116,32,119,105,116,104,32>>,{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]},<<32,97,110,100,32>>,{code,[],[<<97,110,99,104,111,114,101,100>>]},<<44,32,97,110,100,32,116,104,101,110,44,32,105,102,32,116,104,97,116,32,102,97,105,108,115,44,32,98,121,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,111,102,102,115,101,116,32,40,115,101,101,32,98,101,108,111,119,41,32,97,110,100,32,116,114,121,105,110,103,32,97,110,32,111,114,100,105,110,97,114,121,32,109,97,116,99,104,32,97,103,97,105,110,46>>]}]},{dt,[],[{code,[],[<<110,111,116,98,111,108>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,32,99,105,114,99,117,109,102,108,101,120,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,97,102,102,101,99,116,115,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,65,46>>]}]},{dt,[],[{code,[],[<<110,111,116,101,111,108>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,32,105,116,32,110,111,114,32,40,101,120,99,101,112,116,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,32,97,32,110,101,119,108,105,110,101,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,32,100,111,108,108,97,114,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,32,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,90,32,111,114,32,92,122,46>>]}]},{dt,[],[{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,98,101,116,116,101,114,32,99,111,110,116,114,111,108,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,105,110,32>>,{code,[],[<<114,117,110,47,51>>]},<<46,32,87,104,101,110,32,115,112,101,99,105,102,105,101,100,44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,40,105,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,109,112,105,108,101,100,41,32,97,110,100,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,32,97,114,101,32,101,120,112,108,105,99,105,116,108,121,32,114,101,116,117,114,110,101,100,32,97,115,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,111,115,115,105,98,108,101,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,115,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,99,97,108,108,101,100,46,32,68,101,102,97,117,108,116,115,32,116,111,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,108,105,98,114,97,114,121,32,99,111,109,112,105,108,101,100,32,102,111,114,32,69,114,108,97,110,103,46,32,73,102,32>>,{code,[],[<<123,101,114,114,111,114,44,32,109,97,116,99,104,95,108,105,109,105,116,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,104,97,115,32,114,101,97,99,104,101,100,32,116,104,105,115,32,108,105,109,105,116,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,111,32,98,101,32,114,101,103,97,114,100,101,100,32,97,115,32,97,32>>,{code,[],[<<110,111,109,97,116,99,104>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,119,104,101,110,32,116,104,105,115,32,111,99,99,117,114,115,44,32,98,117,116,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]},<<44,32,121,111,117,32,97,114,101,32,105,110,102,111,114,109,101,100,32,119,104,101,110,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,32,98,101,99,97,117,115,101,32,111,102,32,116,111,111,32,109,97,110,121,32,105,110,116,101,114,110,97,108,32,99,97,108,108,115,46>>]}]},{dt,[],[{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,101,114,114,111,114,32,105,115,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<44,32,98,117,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,111,102,32,80,67,82,69,32,105,115,32,34,114,101,99,117,114,115,105,118,101,108,121,34,32,99,97,108,108,101,100,32,109,111,114,101,32,116,105,109,101,115,32,116,104,97,110,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]},<<32,108,105,109,105,116,44,32,119,104,105,99,104,32,100,101,102,97,117,108,116,115,32,116,111,32,49,48,44,48,48,48,44,48,48,48,32,97,115,32,119,101,108,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,97,110,100,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,100,101,102,97,117,108,116>>]},<<32,118,97,108,117,101,115,32,97,114,101,32,107,101,112,116,32,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,44,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]},<<32,101,114,114,111,114,32,99,97,110,110,111,116,32,111,99,99,117,114,44,32,97,115,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,101,114,114,111,114,32,111,99,99,117,114,115,32,98,101,102,111,114,101,32,116,104,97,116,32,40,101,97,99,104,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,105,115,32,97,108,115,111,32,97,32,99,97,108,108,44,32,98,117,116,32,110,111,116,32,99,111,110,118,101,114,115,101,108,121,41,46,32,66,111,116,104,32,108,105,109,105,116,115,32,99,97,110,32,104,111,119,101,118,101,114,32,98,101,32,99,104,97,110,103,101,100,44,32,101,105,116,104,101,114,32,98,121,32,115,101,116,116,105,110,103,32,108,105,109,105,116,115,32,100,105,114,101,99,116,108,121,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,115,116,114,105,110,103,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,101,103,101,120,112,95,115,121,110,116,97,120,95,100,101,116,97,105,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<80,67,82,69,32,82,101,103,117,108,97,114,32,69,101,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115>>]},<<41,32,111,114,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,111,112,116,105,111,110,115,32,116,111,32>>,{code,[],[<<114,117,110,47,51>>]},<<46>>]}]}]},{p,[],[<<73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32,116,111,32,117,110,100,101,114,115,116,97,110,100,32,116,104,97,116,32,119,104,97,116,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,34,114,101,99,117,114,115,105,111,110,34,32,119,104,101,110,32,108,105,109,105,116,105,110,103,32,109,97,116,99,104,101,115,32,105,115,32,110,111,116,32,114,101,99,117,114,115,105,111,110,32,111,110,32,116,104,101,32,67,32,115,116,97,99,107,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,111,114,32,111,110,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,32,109,97,99,104,105,110,101,32,34,104,101,97,112,34,32,109,101,109,111,114,121,32,116,111,32,115,116,111,114,101,32,118,97,108,117,101,115,32,116,104,97,116,32,109,117,115,116,32,98,101,32,107,101,112,116,32,111,118,101,114,32,114,101,99,117,114,115,105,111,110,32,105,110,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,97,32,109,97,116,99,104,32,105,110,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58>>]},{pre,[],[{code,[],[<<84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,32,102,105,101,108,100,32,112,114,111,118,105,100,101,115,32,97,32,109,101,97,110,115,32,111,102,32,112,114,101,118,101,110,116,105,110,103,32,80,67,82,69,32,102,114,111,109,32,117,115,105,110,103,10,117,112,32,97,32,118,97,115,116,32,97,109,111,117,110,116,32,111,102,32,114,101,115,111,117,114,99,101,115,32,119,104,101,110,32,114,117,110,110,105,110,103,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,103,111,105,110,103,10,116,111,32,109,97,116,99,104,44,32,98,117,116,32,119,104,105,99,104,32,104,97,118,101,32,97,32,118,101,114,121,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,112,111,115,115,105,98,105,108,105,116,105,101,115,32,105,110,32,116,104,101,105,114,10,115,101,97,114,99,104,32,116,114,101,101,115,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,117,115,101,115,32,110,101,115,116,101,100,10,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,46,10,10,73,110,116,101,114,110,97,108,108,121,44,32,112,99,114,101,95,101,120,101,99,40,41,32,117,115,101,115,32,97,32,102,117,110,99,116,105,111,110,32,99,97,108,108,101,100,32,109,97,116,99,104,40,41,44,32,119,104,105,99,104,32,105,116,32,99,97,108,108,115,10,114,101,112,101,97,116,101,100,108,121,32,40,115,111,109,101,116,105,109,101,115,32,114,101,99,117,114,115,105,118,101,108,121,41,46,32,84,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,109,97,116,99,104,95,108,105,109,105,116,32,105,115,10,105,109,112,111,115,101,100,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,100,117,114,105,110,103,32,97,32,109,97,116,99,104,44,10,119,104,105,99,104,32,104,97,115,32,116,104,101,32,101,102,102,101,99,116,32,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,104,97,116,32,99,97,110,10,116,97,107,101,32,112,108,97,99,101,46,32,70,111,114,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,97,110,99,104,111,114,101,100,44,32,116,104,101,32,99,111,117,110,116,32,114,101,115,116,97,114,116,115,10,102,114,111,109,32,122,101,114,111,32,102,111,114,32,101,97,99,104,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]}]},{p,[],[<<84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,114,117,110,97,119,97,121,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,99,97,110,32,102,97,105,108,32,102,97,115,116,101,114,32,105,102,32,116,104,101,32,108,105,109,105,116,32,105,115,32,108,111,119,101,114,101,100,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,49,48,44,48,48,48,44,48,48,48,32,105,115,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,100,111,101,115,32,105,110,32,110,111,32,119,97,121,32,97,102,102,101,99,116,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,105,110,32,116,101,114,109,115,32,111,102,32,34,108,111,110,103,32,114,117,110,110,105,110,103,32,66,73,70,115,34,46,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,97,108,119,97,121,115,32,103,105,118,101,115,32,99,111,110,116,114,111,108,32,98,97,99,107,32,116,111,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,111,102,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,105,110,116,101,114,118,97,108,115,32,116,104,97,116,32,101,110,115,117,114,101,115,32,116,104,101,32,114,101,97,108,45,116,105,109,101,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,46>>]}]}]},{dt,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,97,110,100,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,32,105,110,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,44,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58>>]},{pre,[],[{code,[],[<<84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,32,102,105,101,108,100,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,109,97,116,99,104,95,108,105,109,105,116,44,32,98,117,116,32,105,110,115,116,101,97,100,10,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,97,116,32,109,97,116,99,104,40,41,32,105,115,32,99,97,108,108,101,100,44,32,105,116,10,108,105,109,105,116,115,32,116,104,101,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,111,110,46,32,84,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,105,115,32,97,32,115,109,97,108,108,101,114,32,110,117,109,98,101,114,10,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,97,108,108,115,44,32,98,101,99,97,117,115,101,32,110,111,116,32,97,108,108,32,99,97,108,108,115,32,116,111,32,109,97,116,99,104,40,41,32,97,114,101,10,114,101,99,117,114,115,105,118,101,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32,111,102,32,117,115,101,32,111,110,108,121,32,105,102,32,105,116,32,105,115,32,115,101,116,32,115,109,97,108,108,101,114,32,116,104,97,110,10,109,97,116,99,104,95,108,105,109,105,116,46,10,10,76,105,109,105,116,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,108,105,109,105,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,109,97,99,104,105,110,101,32,115,116,97,99,107,32,116,104,97,116,10,99,97,110,32,98,101,32,117,115,101,100,44,32,111,114,44,32,119,104,101,110,32,80,67,82,69,32,104,97,115,32,98,101,101,110,32,99,111,109,112,105,108,101,100,32,116,111,32,117,115,101,32,109,101,109,111,114,121,32,111,110,32,116,104,101,32,104,101,97,112,10,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,115,116,97,99,107,44,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,104,101,97,112,32,109,101,109,111,114,121,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,46>>]}]},{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,32,97,32,80,67,82,69,32,108,105,98,114,97,114,121,32,119,104,101,114,101,32,104,101,97,112,32,109,101,109,111,114,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,114,101,99,117,114,115,105,111,110,32,111,99,99,117,114,115,46,32,84,104,105,115,32,116,104,101,114,101,102,111,114,101,32,108,105,109,105,116,115,32,116,104,101,32,117,115,101,32,111,102,32,109,97,99,104,105,110,101,32,104,101,97,112,44,32,110,111,116,32,67,32,115,116,97,99,107,46>>]},{p,[],[<<83,112,101,99,105,102,121,105,110,103,32,97,32,108,111,119,101,114,32,118,97,108,117,101,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,109,97,116,99,104,101,115,32,119,105,116,104,32,100,101,101,112,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,105,110,103,44,32,119,104,101,110,32,116,104,101,121,32,115,104,111,117,108,100,32,104,97,118,101,32,109,97,116,99,104,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<49,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,41,46,10,123,109,97,116,99,104,44,91,123,48,44,49,52,125,44,123,48,44,49,51,125,93,125,10,50,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,93,41,46,10,110,111,109,97,116,99,104,10,51,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,44,114,101,112,111,114,116,95,101,114,114,111,114,115,93,41,46,10,123,101,114,114,111,114,44,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,125>>]}]},{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,97,110,100,32,111,112,116,105,111,110,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,97,114,101,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,97,115,101,115,46,32,85,110,100,101,114,115,116,97,110,100,105,110,103,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,110,116,101,114,110,97,108,115,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,98,101,102,111,114,101,32,116,97,109,112,101,114,105,110,103,32,119,105,116,104,32,116,104,101,115,101,32,108,105,109,105,116,115,46>>]}]},{dt,[],[{code,[],[<<123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,111,102,102,115,101,116,32,40,112,111,115,105,116,105,111,110,41,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,111,102,102,115,101,116,32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,115,111,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<123,111,102,102,115,101,116,44,48,125>>]},<<32,40,97,108,108,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,41,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]}]},{dd,[],[{p,[],[<<79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46>>]},{dl,[],[{dt,[],[{code,[],[<<99,114>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,67,82,32,40,65,83,67,73,73,32,49,51,41,46>>]}]},{dt,[],[{code,[],[<<108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<99,114,108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46>>]}]},{dt,[],[{code,[],[<<97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46>>]}]},{dt,[],[{code,[],[<<97,110,121>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46>>]}]}]}]},{dt,[],[{code,[],[<<98,115,114,95,97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46,32,40,79,118,101,114,114,105,100,101,115,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41>>]}]},{dt,[],[{code,[],[<<98,115,114,95,117,110,105,99,111,100,101>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46,32,40,79,118,101,114,114,105,100,101,115,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41>>]}]},{dt,[],[{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125>>]},<<47>>,{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,110,100,32,105,110,32,119,104,97,116,32,102,111,114,109,97,116,46,32,66,121,32,100,101,102,97,117,108,116,44,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,99,97,112,116,117,114,101,115,32,97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,115,116,114,105,110,103,32,97,110,100,32,97,108,108,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,40,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,112,116,117,114,101,100,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,40,122,101,114,111,45,98,97,115,101,100,41,32,105,110,100,101,120,101,115,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,115,112,101,99,105,102,105,101,100,32,97,115,32>>,{code,[],[<<123,79,102,102,115,101,116,44,76,101,110,103,116,104,125>>]},<<32,112,97,105,114,115,32,40,116,104,101,32>>,{code,[],[<<105,110,100,101,120>>]},<<32>>,{code,[],[<<84,121,112,101>>]},<<32,111,102,32,99,97,112,116,117,114,105,110,103,41,46>>]},{p,[],[<<65,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,32,114,101,116,117,114,110,115,44,32,97,115,32,102,105,114,115,116,32,97,110,100,32,111,110,108,121,32,99,97,112,116,117,114,101,100,32,115,116,114,105,110,103,44,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,40,34,97,98,99,100,34,32,105,110,32,116,104,101,32,109,105,100,100,108,101,41,32,97,115,32,97,110,32,105,110,100,101,120,32,112,97,105,114,32>>,{code,[],[<<123,51,44,52,125>>]},<<44,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,122,101,114,111,45,98,97,115,101,100,44,32,106,117,115,116,32,97,115,32,105,110,32,111,102,102,115,101,116,115,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,97,98,99,100,34,44,91,93,41,46>>]}]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,105,115,32,99,97,108,108,32,105,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,51,44,52,125,93,125>>]}]},{p,[],[<<65,110,111,116,104,101,114,32,40,97,110,100,32,113,117,105,116,101,32,99,111,109,109,111,110,41,32,99,97,115,101,32,105,115,32,119,104,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,97,108,108,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,97,98,99,100,46,42,34,44,91,93,41,46>>]}]},{p,[],[<<72,101,114,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,108,121,32,112,111,105,110,116,115,32,111,117,116,32,97,108,108,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,98,101,103,105,110,110,105,110,103,32,97,116,32,105,110,100,101,120,32,48,44,32,97,110,100,32,105,116,32,105,115,32,49,48,32,99,104,97,114,97,99,116,101,114,115,32,108,111,110,103,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,48,44,49,48,125,93,125>>]}]},{p,[],[<<73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,108,105,107,101,32,105,110,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,93,41,46>>]}]},{p,[],[<<97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,101,100,32,115,117,98,106,101,99,116,32,105,115,32,99,97,112,116,117,114,101,100,44,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,93,125>>]}]},{p,[],[<<84,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,103,105,118,101,115,32,116,104,101,32,102,105,114,115,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,110,32,116,104,101,32,108,105,115,116,32,97,110,100,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,111,114,100,101,114,32,116,104,101,121,32,111,99,99,117,114,114,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<84,104,101,32,99,97,112,116,117,114,101,32,116,117,112,108,101,32,105,115,32,98,117,105,108,116,32,117,112,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<86,97,108,117,101,83,112,101,99>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,32,99,97,112,116,117,114,101,100,32,40,115,117,98,41,112,97,116,116,101,114,110,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32>>,{code,[],[<<86,97,108,117,101,83,112,101,99>>]},<<32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,97,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,32,111,102,32,114,101,116,117,114,110,32,118,97,108,117,101,115,44,32,111,114,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,105,110,100,101,120,101,115,32,111,114,32,116,104,101,32,110,97,109,101,115,32,111,102,32,115,112,101,99,105,102,105,99,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,115,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[{p,[],[<<65,108,108,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<97,108,108,95,110,97,109,101,115>>]}]},{dd,[],[{p,[],[<<65,108,108,32>>,{em,[],[<<110,97,109,101,100>>]},<<32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,115,32,105,102,32,97,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,111,102,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32>>,{em,[],[<<105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114>>]},<<32,119,97,115,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,32,108,105,115,116,32,111,102,32,97,108,108,32,110,97,109,101,115,32,99,97,110,32,97,108,115,111,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,105,110,115,112,101,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,110,115,112,101,99,116,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<102,105,114,115,116>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,108,108,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,100,105,115,99,97,114,100,101,100,46>>]}]},{dt,[],[{code,[],[<<97,108,108,95,98,117,116,95,102,105,114,115,116>>]}]},{dd,[],[{p,[],[<<65,108,108,32,98,117,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,98,117,116,32,110,111,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,115,32,97,32,119,104,111,108,101,32,109,97,116,99,104,101,115,32,97,32,108,97,114,103,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,98,117,116,32,116,104,101,32,112,97,114,116,32,121,111,117,32,97,114,101,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,32,105,110,32,97,110,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32>>,{code,[],[<<108,105,115,116>>]},<<32,111,114,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<44,32,110,111,116,32,114,101,116,117,114,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,121,111,117,32,97,114,101,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,32,97,32,103,111,111,100,32,119,97,121,32,116,111,32,111,112,116,105,109,105,122,101,46>>]}]},{dt,[],[{code,[],[<<110,111,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,103,105,118,101,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,32>>,{code,[],[<<109,97,116,99,104>>]},<<32,97,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,115,117,99,99,101,115,115,102,117,108,108,121,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32>>,{code,[],[<<123,109,97,116,99,104,44,32,108,105,115,116,40,41,125>>]},<<32,114,101,116,117,114,110,46,32,83,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,98,101,104,97,118,105,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,118,97,108,117,101,32,108,105,115,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,100,101,120,101,115,32,102,111,114,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,44,32,119,104,101,114,101,32,105,110,100,101,120,32,48,32,105,115,32,102,111,114,32,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,49,32,105,115,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,110,100,32,115,111,32,111,110,46,32,87,104,101,110,32,117,115,105,110,103,32,110,97,109,101,100,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,40,115,101,101,32,98,101,108,111,119,41,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,111,110,101,32,99,97,110,32,117,115,101,32>>,{code,[],[<<97,116,111,109,40,41>>]},<<115,32,111,114,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<115,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58>>]},{pre,[],[{code,[],[<<34,46,42,40,97,98,99,100,41,46,42,34>>]}]},{p,[],[<<109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,115,116,114,105,110,103,32,34,65,66,67,97,98,99,100,65,66,67,34,44,32,99,97,112,116,117,114,105,110,103,32,111,110,108,121,32,116,104,101,32,34,97,98,99,100,34,32,112,97,114,116,32,40,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,115,117,98,112,97,116,116,101,114,110,41,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46>>]}]},{p,[],[<<84,104,101,32,99,97,108,108,32,103,105,118,101,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,115,117,108,116,44,32,97,115,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,34,40,97,98,99,100,41,34,44,32,109,97,116,99,104,105,110,103,32,34,97,98,99,100,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,116,32,40,122,101,114,111,45,98,97,115,101,100,41,32,112,111,115,105,116,105,111,110,32,51,44,32,111,102,32,108,101,110,103,116,104,32,52,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,51,44,52,125,93,125>>]}]},{p,[],[<<67,111,110,115,105,100,101,114,32,116,104,101,32,115,97,109,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,119,105,116,104,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,101,120,112,108,105,99,105,116,108,121,32,110,97,109,101,100,32,39,70,79,79,39,58>>]},{pre,[],[{code,[],[<<34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34>>]}]},{p,[],[<<87,105,116,104,32,116,104,105,115,32,101,120,112,114,101,115,115,105,111,110,44,32,119,101,32,99,111,117,108,100,32,115,116,105,108,108,32,103,105,118,101,32,116,104,101,32,105,110,100,101,120,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46>>]}]},{p,[],[<<103,105,118,105,110,103,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,98,101,102,111,114,101,46,32,66,117,116,44,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,97,109,101,100,44,32,119,101,32,99,97,110,32,97,108,115,111,32,115,112,101,99,105,102,121,32,105,116,115,32,110,97,109,101,32,105,110,32,116,104,101,32,118,97,108,117,101,32,108,105,115,116,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,39,70,79,79,39,93,125,93,41,46>>]}]},{p,[],[<<84,104,105,115,32,119,111,117,108,100,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,115,44,32,110,97,109,101,108,121,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,51,44,52,125,93,125>>]}]},{p,[],[<<84,104,101,32,118,97,108,117,101,115,32,108,105,115,116,32,99,97,110,32,115,112,101,99,105,102,121,32,105,110,100,101,120,101,115,32,111,114,32,110,97,109,101,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,118,97,114,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,116,121,112,101,46,32,73,102,32,116,104,101,32,116,121,112,101,32,105,115,32>>,{code,[],[<<105,110,100,101,120>>]},<<44,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,45,49,44,48,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,102,111,114,32,118,97,108,117,101,115,32,119,105,116,104,32,110,111,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,102,111,114,32,116,104,101,32,111,116,104,101,114,32,116,121,112,101,115,32,40>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,97,110,100,32>>,{code,[],[<<108,105,115,116>>]},<<41,44,32,116,104,101,32,118,97,108,117,101,115,32,97,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46>>]}]},{dt,[],[{code,[],[<<84,121,112,101>>]}]},{dd,[],[{p,[],[<<79,112,116,105,111,110,97,108,108,121,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,73,102,32,111,109,105,116,116,101,100,44,32,116,104,101,32,100,101,102,97,117,108,116,32,111,102,32>>,{code,[],[<<105,110,100,101,120>>]},<<32,105,115,32,117,115,101,100,46>>]},{p,[],[{code,[],[<<84,121,112,101>>]},<<32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<105,110,100,101,120>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,112,97,105,114,115,32,111,102,32,98,121,116,101,32,105,110,100,101,120,101,115,32,105,110,116,111,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,110,100,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,40,97,115,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,97,115,32,102,108,97,116,116,101,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<32,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,35,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,41,46,32,78,111,116,105,99,101,32,116,104,97,116,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,114,101,115,117,108,116,115,32,105,110,32>>,{em,[],[<<98,121,116,101,45,111,114,105,101,110,116,101,100>>]},<<32,105,110,100,101,120,101,115,32,105,110,32,97,32,40,112,111,115,115,105,98,108,121,32,118,105,114,116,117,97,108,41,32>>,{em,[],[<<85,84,70,45,56,32,101,110,99,111,100,101,100>>]},<<32,98,105,110,97,114,121,46,32,65,32,98,121,116,101,32,105,110,100,101,120,32,116,117,112,108,101,32>>,{code,[],[<<123,48,44,50,125>>]},<<32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,114,101,112,114,101,115,101,110,116,32,111,110,101,32,111,114,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,119,104,101,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,105,110,32,101,102,102,101,99,116,46,32,84,104,105,115,32,99,97,110,32,115,101,101,109,32,99,111,117,110,116,101,114,45,105,110,116,117,105,116,105,118,101,44,32,98,117,116,32,104,97,115,32,98,101,101,110,32,100,101,101,109,101,100,32,116,104,101,32,109,111,115,116,32,101,102,102,101,99,116,105,118,101,32,97,110,100,32,117,115,101,102,117,108,32,119,97,121,32,116,111,32,100,111,32,105,116,46,32,84,111,32,114,101,116,117,114,110,32,108,105,115,116,115,32,105,110,115,116,101,97,100,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,115,105,109,112,108,101,114,32,99,111,100,101,32,105,102,32,116,104,97,116,32,105,115,32,100,101,115,105,114,101,100,46,32,84,104,105,115,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<108,105,115,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,69,114,108,97,110,103,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<115,41,46,32,73,116,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,117,115,101,100,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,92,67,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,32,98,121,116,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,118,97,108,105,100,32,85,84,70,45,56,32,40,92,67,32,109,97,116,99,104,101,115,32,98,121,116,101,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,41,46,32,73,110,32,116,104,97,116,32,99,97,115,101,32,116,104,101,32>>,{code,[],[<<108,105,115,116>>]},<<32,99,97,112,116,117,114,105,110,103,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,116,104,101,32,115,97,109,101,32,116,121,112,101,115,32,111,102,32,116,117,112,108,101,115,32,116,104,97,116,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,35,99,104,97,114,97,99,116,101,114,115,95,116,111,95,108,105,115,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,108,105,115,116,47,50>>]}]},<<32,99,97,110,32,114,101,116,117,114,110,44,32,110,97,109,101,108,121,32,116,104,114,101,101,45,116,117,112,108,101,115,32,119,105,116,104,32,116,97,103,32>>,{code,[],[<<105,110,99,111,109,112,108,101,116,101>>]},<<32,111,114,32>>,{code,[],[<<101,114,114,111,114>>]},<<44,32,116,104,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,111,110,118,101,114,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,116,104,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,32,116,97,105,108,32,111,102,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,97,115,32,97,32,98,105,110,97,114,121,46,32,84,104,101,32,98,101,115,116,32,115,116,114,97,116,101,103,121,32,105,115,32,116,111,32,97,118,111,105,100,32,117,115,105,110,103,32,116,104,101,32,92,67,32,115,101,113,117,101,110,99,101,32,119,104,101,110,32,99,97,112,116,117,114,105,110,103,32,108,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,98,105,110,97,114,105,101,115,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,117,115,101,100,44,32,116,104,101,115,101,32,98,105,110,97,114,105,101,115,32,97,114,101,32,105,110,32,85,84,70,45,56,46,32,73,102,32,116,104,101,32,92,67,32,115,101,113,117,101,110,99,101,32,105,115,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,116,104,101,32,98,105,110,97,114,105,101,115,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,46>>]}]}]}]}]},{p,[],[<<73,110,32,103,101,110,101,114,97,108,44,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,119,101,114,101,32,110,111,116,32,97,115,115,105,103,110,101,100,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,109,97,116,99,104,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,45,49,44,48,125>>]},<<32,119,104,101,110,32>>,{code,[],[<<116,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<105,110,100,101,120>>]},<<46,32,85,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,102,111,114,32,111,116,104,101,114,32,114,101,116,117,114,110,32,116,121,112,101,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58>>]},{pre,[],[{code,[],[<<34,46,42,40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41,46,42,34>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,119,104,101,114,101,32,116,104,101,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,112,111,115,105,116,105,111,110,32,100,101,116,101,114,109,105,110,101,115,32,116,104,101,32,111,114,100,101,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,104,101,110,99,101,32>>,{code,[],[<<40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41>>]},<<32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,49,44,32>>,{code,[],[<<40,63,60,70,79,79,62,97,98,100,100,41>>]},<<32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,50,44,32,97,110,100,32>>,{code,[],[<<40,46,46,100,41>>]},<<32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,51,46,32,87,104,101,110,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,116,114,105,110,103,58>>]},{pre,[],[{code,[],[<<34,65,66,67,97,98,99,100,65,66,67,34>>]}]},{p,[],[<<116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,44,32,97,115,32,34,97,98,100,100,34,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,44,32,98,117,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,40,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,32>>,{code,[],[<<97,40,46,46,100,41>>]},<<41,46,32,84,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,110,97,115,115,105,103,110,101,100,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,44,123,45,49,44,48,125,44,123,52,44,51,125,93,125>>]}]},{p,[],[<<83,101,116,116,105,110,103,32,116,104,101,32,99,97,112,116,117,114,101,32>>,{code,[],[<<84,121,112,101>>]},<<32,116,111,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,103,105,118,101,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,60,60,34,65,66,67,97,98,99,100,65,66,67,34,62,62,44,60,60,34,97,98,99,100,34,62,62,44,60,60,62,62,44,60,60,34,98,99,100,34,62,62,93,125>>]}]},{p,[],[<<72,101,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,40>>,{code,[],[<<60,60,62,62>>]},<<41,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,117,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,110,32,116,104,101,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,99,97,115,101,44,32,115,111,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,116,104,101,114,101,102,111,114,101,32,108,111,115,116,44,32,97,115,32>>,{code,[],[<<60,60,62,62>>]},<<32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,99,97,112,116,117,114,101,100,46>>]},{p,[],[<<73,102,32,100,105,102,102,101,114,101,110,116,105,97,116,105,111,110,32,98,101,116,119,101,101,110,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,97,110,100,32,110,111,110,45,101,120,105,115,116,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,32,110,101,99,101,115,115,97,114,121,44,32,117,115,101,32,116,104,101,32>>,{code,[],[<<116,121,112,101>>]},<<32>>,{code,[],[<<105,110,100,101,120>>]},<<32,97,110,100,32,100,111,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,116,104,101,32,102,105,110,97,108,32,116,121,112,101,32,105,110,32,69,114,108,97,110,103,32,99,111,100,101,46>>]},{p,[],[<<87,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,115,32,115,112,101,99,105,105,102,105,101,100,44,32,116,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,102,102,101,99,116,115,32,101,97,99,104,32,109,97,116,99,104,32,115,101,112,97,114,97,116,101,108,121,44,32,115,111,32,116,104,97,116,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,99,97,99,98,34,44,34,99,40,97,124,98,41,34,44,91,103,108,111,98,97,108,44,123,99,97,112,116,117,114,101,44,91,49,93,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,91,34,97,34,93,44,91,34,98,34,93,93,125>>]}]}]}]},{p,[],[<<70,111,114,32,97,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,111,112,116,105,111,110,115,32,111,110,108,121,32,97,102,102,101,99,116,105,110,103,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,115,116,101,112,44,32,115,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,52,49,57>>,signature => [{attribute,76,spec,{{run,3},[{type,76,bounded_fun,[{type,76,'fun',[{type,76,product,[{var,76,'Subject'},{var,76,'RE'},{var,76,'Options'}]},{type,76,union,[{type,76,tuple,[{atom,76,match},{var,76,'Captured'}]},{atom,77,match},{atom,78,nomatch},{type,79,tuple,[{atom,79,error},{var,79,'ErrType'}]}]}]},[{type,80,constraint,[{atom,80,is_subtype},[{var,80,'Subject'},{type,80,union,[{type,80,iodata,[]},{remote_type,80,[{atom,80,unicode},{atom,80,charlist},[]]}]}]]},{type,81,constraint,[{atom,81,is_subtype},[{var,81,'RE'},{type,81,union,[{user_type,81,mp,[]},{type,81,iodata,[]},{remote_type,81,[{atom,81,unicode},{atom,81,charlist},[]]}]}]]},{type,82,constraint,[{atom,82,is_subtype},[{var,82,'Options'},{type,82,list,[{var,82,'Option'}]}]]},{type,83,constraint,[{atom,83,is_subtype},[{var,83,'Option'},{type,83,union,[{atom,83,anchored},{atom,83,global},{atom,83,notbol},{atom,83,noteol},{atom,83,notempty},{atom,84,notempty_atstart},{atom,84,report_errors},{type,85,tuple,[{atom,85,offset},{type,85,non_neg_integer,[]}]},{type,86,tuple,[{atom,86,match_limit},{type,86,non_neg_integer,[]}]},{type,87,tuple,[{atom,87,match_limit_recursion},{type,87,non_neg_integer,[]}]},{type,88,tuple,[{atom,88,newline},{ann_type,88,[{var,88,'NLSpec'},{user_type,88,nl_spec,[]}]}]},{atom,89,bsr_anycrlf},{atom,89,bsr_unicode},{type,89,tuple,[{atom,89,capture},{var,89,'ValueSpec'}]},{type,90,tuple,[{atom,90,capture},{var,90,'ValueSpec'},{var,90,'Type'}]},{var,90,'CompileOpt'}]}]]},{type,91,constraint,[{atom,91,is_subtype},[{var,91,'Type'},{type,91,union,[{atom,91,index},{atom,91,list},{atom,91,binary}]}]]},{type,92,constraint,[{atom,92,is_subtype},[{var,92,'ValueSpec'},{type,92,union,[{atom,92,all},{atom,92,all_but_first},{atom,92,all_names},{atom,92,first},{atom,92,none},{var,92,'ValueList'}]}]]},{type,93,constraint,[{atom,93,is_subtype},[{var,93,'ValueList'},{type,93,list,[{var,93,'ValueID'}]}]]},{type,94,constraint,[{atom,94,is_subtype},[{var,94,'ValueID'},{type,94,union,[{type,94,integer,[]},{type,94,string,[]},{type,94,atom,[]}]}]]},{type,95,constraint,[{atom,95,is_subtype},[{var,95,'CompileOpt'},{user_type,95,compile_option,[]}]]},{type,96,constraint,[{atom,96,is_subtype},[{var,96,'Captured'},{type,96,union,[{type,96,list,[{var,96,'CaptureData'}]},{type,96,list,[{type,96,list,[{var,96,'CaptureData'}]}]}]}]]},{type,97,constraint,[{atom,97,is_subtype},[{var,97,'CaptureData'},{type,97,union,[{type,97,tuple,[{type,97,integer,[]},{type,97,integer,[]}]},{var,98,'ListConversionData'},{type,99,binary,[]}]}]]},{type,100,constraint,[{atom,100,is_subtype},[{var,100,'ListConversionData'},{type,100,union,[{type,100,string,[]},{type,101,tuple,[{atom,101,error},{type,101,string,[]},{type,101,binary,[]}]},{type,102,tuple,[{atom,102,incomplete},{type,102,string,[]},{type,102,binary,[]}]}]}]]},{type,103,constraint,[{atom,103,is_subtype},[{var,103,'ErrType'},{type,103,union,[{atom,103,match_limit},{atom,103,match_limit_recursion},{type,103,tuple,[{atom,103,compile},{var,103,'CompileErr'}]}]}]]},{type,104,constraint,[{atom,104,is_subtype},[{var,104,'CompileErr'},{type,104,tuple,[{ann_type,104,[{var,104,'ErrString'},{type,104,string,[]}]},{ann_type,104,[{var,104,'Position'},{type,104,non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,split,2},[{file,[114,101,46,101,114,108]},{location,153}],[<<115,112,108,105,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,44,32,91,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,57,57,52>>,signature => [{attribute,153,spec,{{split,2},[{type,153,bounded_fun,[{type,153,'fun',[{type,153,product,[{var,153,'Subject'},{var,153,'RE'}]},{var,153,'SplitList'}]},[{type,154,constraint,[{atom,154,is_subtype},[{var,154,'Subject'},{type,154,union,[{type,154,iodata,[]},{remote_type,154,[{atom,154,unicode},{atom,154,charlist},[]]}]}]]},{type,155,constraint,[{atom,155,is_subtype},[{var,155,'RE'},{type,155,union,[{user_type,155,mp,[]},{type,155,iodata,[]}]}]]},{type,156,constraint,[{atom,156,is_subtype},[{var,156,'SplitList'},{type,156,list,[{type,156,union,[{type,156,iodata,[]},{remote_type,156,[{atom,156,unicode},{atom,156,charlist},[]]}]}]}]]}]]}]}}]}},{{function,split,3},[{file,[114,101,46,101,114,108]},{location,166}],[<<115,112,108,105,116,47,51>>],#{<<101,110>> => [{p,[],[<<83,112,108,105,116,115,32,116,104,101,32,105,110,112,117,116,32,105,110,116,111,32,112,97,114,116,115,32,98,121,32,102,105,110,100,105,110,103,32,116,111,107,101,110,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,115,117,112,112,108,105,101,100,46,32,84,104,101,32,115,112,108,105,116,116,105,110,103,32,105,115,32,98,97,115,105,99,97,108,108,121,32,100,111,110,101,32,98,121,32,114,117,110,110,105,110,103,32,97,32,103,108,111,98,97,108,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,97,110,100,32,100,105,118,105,100,105,110,103,32,116,104,101,32,105,110,105,116,105,97,108,32,115,116,114,105,110,103,32,119,104,101,114,101,118,101,114,32,97,32,109,97,116,99,104,32,111,99,99,117,114,115,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,111,117,116,112,117,116,46>>]},{p,[],[<<65,115,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,97,110,32>>,{code,[],[<<109,112,40,41>>]},<<32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,114,101,113,117,105,114,101,115,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,116,111,32,98,101,32,97,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<115,46>>]},{p,[],[<<84,104,101,32,114,101,115,117,108,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,108,105,115,116,32,111,102,32,34,115,116,114,105,110,103,115,34,44,32,116,104,101,32,112,114,101,102,101,114,114,101,100,32,100,97,116,97,32,116,121,112,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,111,112,116,105,111,110,32>>,{code,[],[<<114,101,116,117,114,110>>]},<<32,40,100,101,102,97,117,108,116,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<41,46>>]},{p,[],[<<73,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,97,115,32,119,101,108,108,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,110,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,34,44,34,103,34,93>>]}]},{p,[],[<<119,104,105,108,101>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,108,34,44,34,97,34,44,34,110,34,44,34,103,34,93>>]}]},{p,[],[<<84,104,101,32,116,101,120,116,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,41,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,119,104,101,114,101,32,105,116,32,119,97,115,32,102,111,117,110,100,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,99,111,110,99,97,116,101,110,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,32,115,112,108,105,116,32,119,104,101,114,101,32,116,104,101,32,119,104,111,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,32,115,105,110,103,108,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,97,115,32,105,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,41,32,97,108,119,97,121,115,32,114,101,115,117,108,116,115,32,105,110,32,116,104,101,32,111,114,105,103,105,110,97,108,32,115,116,114,105,110,103,46>>]},{p,[],[<<65,115,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,102,111,114,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,40,116,104,101,32,34,103,34,41,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,84,111,32,109,97,107,101,32,116,104,101,32,103,114,111,117,112,32,111,102,32,115,116,114,105,110,103,115,32,97,110,100,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,111,114,101,32,111,98,118,105,111,117,115,44,32,111,110,101,32,99,97,110,32,117,115,101,32,111,112,116,105,111,110,32>>,{code,[],[<<103,114,111,117,112>>]},<<44,32,119,104,105,99,104,32,103,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,119,104,101,110,32,116,104,101,32,115,116,114,105,110,103,32,119,97,115,32,115,112,108,105,116,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,103,114,111,117,112,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,91,34,69,114,34,44,34,108,34,93,44,91,34,97,34,44,34,110,34,93,44,91,34,103,34,93,93>>]}]},{p,[],[<<72,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,102,105,114,115,116,32,109,97,116,99,104,101,100,32,116,104,101,32,34,108,34,44,32,99,97,117,115,105,110,103,32,34,69,114,34,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,112,97,114,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,87,104,101,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,100,44,32,116,104,101,32,40,111,110,108,121,41,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,98,111,117,110,100,32,116,111,32,116,104,101,32,34,108,34,44,32,115,111,32,116,104,101,32,34,108,34,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,103,114,111,117,112,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,34,69,114,34,46,32,84,104,101,32,110,101,120,116,32,109,97,116,99,104,32,105,115,32,111,102,32,116,104,101,32,34,110,34,44,32,109,97,107,105,110,103,32,34,97,34,32,116,104,101,32,110,101,120,116,32,112,97,114,116,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,65,115,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,105,115,32,98,111,117,110,100,32,116,111,32,115,117,98,115,116,114,105,110,103,32,34,110,34,32,105,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,34,110,34,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,105,115,32,103,114,111,117,112,46,32,84,104,101,32,108,97,115,116,32,103,114,111,117,112,32,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,44,32,97,115,32,110,111,32,109,111,114,101,32,109,97,116,99,104,101,115,32,97,114,101,32,102,111,117,110,100,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,97,108,108,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,44,32,97,114,101,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,110,34,44,91,93,93>>]}]},{p,[],[<<97,115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,111,102,32,116,104,101,32,34,103,34,32,105,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,108,101,97,118,101,115,32,97,110,32,101,109,112,116,121,32,114,101,115,116,44,32,119,104,105,99,104,32,105,115,32,97,108,115,111,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,115,112,108,105,116,32,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,44,32,119,104,101,114,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,98,121,32,100,101,102,97,117,108,116,32,114,101,109,111,118,101,100,46,32,84,111,32,103,101,116,32,116,104,101,32,34,116,114,105,109,109,105,110,103,34,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,80,101,114,108,44,32,115,112,101,99,105,102,121,32>>,{code,[],[<<116,114,105,109>>]},<<32,97,115,32,97,110,32,111,112,116,105,111,110,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,116,114,105,109,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,110,34,93>>]}]},{p,[],[<<84,104,101,32,34,116,114,105,109,34,32,111,112,116,105,111,110,32,115,97,121,115,59,32,34,103,105,118,101,32,109,101,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,101,120,99,101,112,116,32,116,104,101,32,101,109,112,116,121,32,111,110,101,115,34,44,32,119,104,105,99,104,32,115,111,109,101,116,105,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46,32,89,111,117,32,99,97,110,32,97,108,115,111,32,115,112,101,99,105,102,121,32,104,111,119,32,109,97,110,121,32,112,97,114,116,115,32,121,111,117,32,119,97,110,116,44,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,112,97,114,116,115,44>>]},<<78>>,{code,[],[<<125>>]},<<58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,50,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,110,103,34,93>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,115,32,34,97,110,103,34,44,32,110,111,116,32,34,97,110,34,44,32,97,115,32,115,112,108,105,116,116,105,110,103,32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,105,110,116,111,32,116,119,111,32,112,97,114,116,115,44,32,97,110,100,32,116,104,101,32,115,112,108,105,116,116,105,110,103,32,115,116,111,112,115,32,119,104,101,110,32,101,110,111,117,103,104,32,112,97,114,116,115,32,97,114,101,32,103,105,118,101,110,44,32,119,104,105,99,104,32,105,115,32,119,104,121,32,116,104,101,32,114,101,115,117,108,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,97,116,32,111,102,32>>,{code,[],[<<116,114,105,109>>]},<<46>>]},{p,[],[<<77,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,112,97,114,116,115,32,97,114,101,32,110,111,116,32,112,111,115,115,105,98,108,101,32,119,105,116,104,32,116,104,105,115,32,105,110,100,97,116,97,44,32,115,111>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,52,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,100,101,102,97,117,108,116,44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,118,105,101,119,101,100,32,97,115,32,34,97,110,32,105,110,102,105,110,105,116,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,34,46>>]},{p,[],[<<83,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<48>>]},<<32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,111,112,116,105,111,110,32>>,{code,[],[<<116,114,105,109>>]},<<46,32,73,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,99,97,112,116,117,114,101,100,44,32,101,109,112,116,121,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,97,116,99,104,101,100,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,97,108,115,111,32,115,116,114,105,112,112,101,100,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,105,102,32>>,{code,[],[<<116,114,105,109>>]},<<32,111,114,32>>,{code,[],[<<123,112,97,114,116,115,44,48,125>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<116,114,105,109>>]},<<32,98,101,104,97,118,105,111,114,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,100,101,102,97,117,108,116,46,32>>,{code,[],[<<123,112,97,114,116,115,44,78,125>>]},<<44,32,119,104,101,114,101,32,78,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,105,116,104,32,97,32,112,111,115,105,116,105,118,101,32,110,117,109,101,114,105,99,97,108,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,46,32,84,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32>>,{code,[],[<<115,112,108,105,116,47,51>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,32,102,111,114,32,116,104,101,32,80,101,114,108,32,114,111,117,116,105,110,101,46>>]},{p,[],[<<83,117,109,109,97,114,121,32,111,102,32,111,112,116,105,111,110,115,32,110,111,116,32,112,114,101,118,105,111,117,115,108,121,32,100,101,115,99,114,105,98,101,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<114,117,110,47,51>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<123,114,101,116,117,114,110,44,82,101,116,117,114,110,84,121,112,101,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,104,111,119,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,111,114,105,103,105,110,97,108,32,115,116,114,105,110,103,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,46,32,86,97,108,105,100,32,116,121,112,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<105,111,100,97,116,97>>]}]},{dd,[],[{p,[],[<<84,104,101,32,118,97,114,105,97,110,116,32,111,102,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,108,101,97,115,116,32,99,111,112,121,105,110,103,32,111,102,32,100,97,116,97,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,40,111,102,116,101,110,32,97,32,98,105,110,97,114,121,44,32,98,117,116,32,100,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,105,116,41,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,98,105,110,97,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<108,105,115,116>>]}]},{dd,[],[{p,[],[<<65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,34,115,116,114,105,110,103,115,34,41,46>>]}]}]}]},{dt,[],[{code,[],[<<103,114,111,117,112>>]}]},{dd,[],[{p,[],[<<71,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,32,116,104,105,115,32,99,97,115,101,32,97,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,111,102,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<115,46,32,69,97,99,104,32,115,117,98,108,105,115,116,32,98,101,103,105,110,115,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,112,105,99,107,101,100,32,111,117,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,101,97,99,104,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,111,114,100,101,114,32,111,102,32,111,99,99,117,114,114,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,112,97,114,116,115,44,78,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,116,111,32,98,101,32,115,112,108,105,116,32,105,110,116,111,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,105,115,32,116,111,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,44,32,97,110,100,32>>,{code,[],[<<105,110,102,105,110,105,116,121>>]},<<32,102,111,114,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,112,111,115,115,105,98,108,101,32,40,116,104,101,32,100,101,102,97,117,108,116,41,46,32,83,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,112,97,114,116,115,44,48,125>>]},<<32,103,105,118,101,115,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,100,105,115,114,101,103,97,114,100,105,110,103,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,44,32,116,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<116,114,105,109>>]},<<46>>]}]},{dt,[],[{code,[],[<<116,114,105,109>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,97,114,101,32,116,111,32,98,101,32,100,105,115,114,101,103,97,114,100,101,100,46,32,84,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,112,97,114,116,115,44,48,125>>]},<<46,32,84,104,105,115,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32>>,{code,[],[<<115,112,108,105,116>>]},<<32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,49,48,48,51>>,signature => [{attribute,166,spec,{{split,3},[{type,166,bounded_fun,[{type,166,'fun',[{type,166,product,[{var,166,'Subject'},{var,166,'RE'},{var,166,'Options'}]},{var,166,'SplitList'}]},[{type,167,constraint,[{atom,167,is_subtype},[{var,167,'Subject'},{type,167,union,[{type,167,iodata,[]},{remote_type,167,[{atom,167,unicode},{atom,167,charlist},[]]}]}]]},{type,168,constraint,[{atom,168,is_subtype},[{var,168,'RE'},{type,168,union,[{user_type,168,mp,[]},{type,168,iodata,[]},{remote_type,168,[{atom,168,unicode},{atom,168,charlist},[]]}]}]]},{type,169,constraint,[{atom,169,is_subtype},[{var,169,'Options'},{type,169,list,[{var,169,'Option'}]}]]},{type,170,constraint,[{atom,170,is_subtype},[{var,170,'Option'},{type,170,union,[{atom,170,anchored},{atom,170,notbol},{atom,170,noteol},{atom,170,notempty},{atom,170,notempty_atstart},{type,171,tuple,[{atom,171,offset},{type,171,non_neg_integer,[]}]},{type,171,tuple,[{atom,171,newline},{user_type,171,nl_spec,[]}]},{type,172,tuple,[{atom,172,match_limit},{type,172,non_neg_integer,[]}]},{type,173,tuple,[{atom,173,match_limit_recursion},{type,173,non_neg_integer,[]}]},{atom,174,bsr_anycrlf},{atom,174,bsr_unicode},{type,174,tuple,[{atom,174,return},{var,174,'ReturnType'}]},{type,175,tuple,[{atom,175,parts},{var,175,'NumParts'}]},{atom,175,group},{atom,175,trim},{var,175,'CompileOpt'}]}]]},{type,176,constraint,[{atom,176,is_subtype},[{var,176,'NumParts'},{type,176,union,[{type,176,non_neg_integer,[]},{atom,176,infinity}]}]]},{type,177,constraint,[{atom,177,is_subtype},[{var,177,'ReturnType'},{type,177,union,[{atom,177,iodata},{atom,177,list},{atom,177,binary}]}]]},{type,178,constraint,[{atom,178,is_subtype},[{var,178,'CompileOpt'},{user_type,178,compile_option,[]}]]},{type,179,constraint,[{atom,179,is_subtype},[{var,179,'SplitList'},{type,179,union,[{type,179,list,[{var,179,'RetData'}]},{type,179,list,[{var,179,'GroupedRetData'}]}]}]]},{type,180,constraint,[{atom,180,is_subtype},[{var,180,'GroupedRetData'},{type,180,list,[{var,180,'RetData'}]}]]},{type,181,constraint,[{atom,181,is_subtype},[{var,181,'RetData'},{type,181,union,[{type,181,iodata,[]},{remote_type,181,[{atom,181,unicode},{atom,181,charlist},[]]},{type,181,binary,[]},{type,181,list,[]}]}]]}]]}]}}]}},{{type,mp,0},[{file,[114,101,46,101,114,108]},{location,23}],[<<45,116,121,112,101,32,109,112,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<79,112,97,113,117,101,32,100,97,116,97,32,116,121,112,101,32,99,111,110,116,97,105,110,105,110,103,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32>>,{code,[],[<<109,112,40,41>>]},<<32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,97,32,116,117,112,108,101,40,41,32,104,97,118,105,110,103,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<114,101,95,112,97,116,116,101,114,110>>]},<<32,97,115,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,116,111,32,97,108,108,111,119,32,102,111,114,32,109,97,116,99,104,105,110,103,32,105,110,32,103,117,97,114,100,115,46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,116,117,112,108,101,32,111,114,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,111,116,104,101,114,32,102,105,101,108,100,115,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,115,46>>]}]},#{signature => [{attribute,23,type,{mp,{type,23,tuple,[{atom,23,re_pattern},{var,23,'_'},{var,23,'_'},{var,23,'_'},{var,23,'_'}]},[]}}]}},{{type,nl_spec,0},[{file,[114,101,46,101,114,108]},{location,25}],[<<45,116,121,112,101,32,110,108,95,115,112,101,99,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,25,type,{nl_spec,{type,25,union,[{atom,25,cr},{atom,25,crlf},{atom,25,lf},{atom,25,anycrlf},{atom,25,any}]},[]}}]}},{{type,compile_option,0},[{file,[114,101,46,101,114,108]},{location,27}],[<<45,116,121,112,101,32,99,111,109,112,105,108,101,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,27,type,{compile_option,{type,27,union,[{atom,27,unicode},{atom,27,anchored},{atom,27,caseless},{atom,27,dollar_endonly},{atom,28,dotall},{atom,28,extended},{atom,28,firstline},{atom,28,multiline},{atom,29,no_auto_capture},{atom,29,dupnames},{atom,29,ungreedy},{type,30,tuple,[{atom,30,newline},{user_type,30,nl_spec,[]}]},{atom,31,bsr_anycrlf},{atom,31,bsr_unicode},{atom,32,no_start_optimize},{atom,32,ucp},{atom,32,never_utf}]},[]}}]}}]}. \ No newline at end of file
+{docs_v1,[{file,[114,101,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<84,104,105,115,32,109,111,100,117,108,101,32,99,111,110,116,97,105,110,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,102,111,114,32,115,116,114,105,110,103,115,32,97,110,100,32,98,105,110,97,114,105,101,115,46>>]},{p,[],[<<84,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,101,103,101,120,112,95,115,121,110,116,97,120>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110>>]},<<32,115,121,110,116,97,120,32,97,110,100,32,115,101,109,97,110,116,105,99,115,32,114,101,115,101,109,98,108,101,32,116,104,97,116,32,111,102,32,80,101,114,108,46>>]},{p,[],[<<84,104,101,32,109,97,116,99,104,105,110,103,32,97,108,103,111,114,105,116,104,109,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,97,114,101,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,44,32,98,117,116,32,110,111,116,32,97,108,108,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,115,32,105,110,116,101,114,102,97,99,101,100,32,97,110,100,32,115,111,109,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,108,105,98,114,97,114,121,32,103,111,32,98,101,121,111,110,100,32,119,104,97,116,32,80,67,82,69,32,111,102,102,101,114,115,46,32,67,117,114,114,101,110,116,108,121,32,80,67,82,69,32,118,101,114,115,105,111,110,32,56,46,52,48,32,40,114,101,108,101,97,115,101,32,100,97,116,101,32,50,48,49,55,45,48,49,45,49,49,41,32,105,115,32,117,115,101,100,46,32,84,104,101,32,115,101,99,116,105,111,110,115,32,111,102,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,116,104,97,116,32,97,114,101,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,105,115,32,109,111,100,117,108,101,32,97,114,101,32,105,110,99,108,117,100,101,100,32,104,101,114,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,108,105,116,101,114,97,108,32,115,121,110,116,97,120,32,102,111,114,32,115,116,114,105,110,103,115,32,117,115,101,115,32,116,104,101,32,34,92,34,32,40,98,97,99,107,115,108,97,115,104,41,32,99,104,97,114,97,99,116,101,114,32,97,115,32,97,110,32,101,115,99,97,112,101,32,99,111,100,101,46,32,89,111,117,32,110,101,101,100,32,116,111,32,101,115,99,97,112,101,32,98,97,99,107,115,108,97,115,104,101,115,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,98,111,116,104,32,105,110,32,121,111,117,114,32,99,111,100,101,32,97,110,100,32,105,110,32,116,104,101,32,115,104,101,108,108,44,32,119,105,116,104,32,97,110,32,101,120,116,114,97,32,98,97,99,107,115,108,97,115,104,44,32,116,104,97,116,32,105,115,44,32,34,92,92,34,46>>]}]},{a,[{id,<<114,101,103,101,120,112,95,115,121,110,116,97,120>>}],[]},{h2,[],[<<80,101,114,108,45,76,105,107,101,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,83,121,110,116,97,120>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,99,111,110,116,97,105,110,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,102,111,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,117,115,101,100,32,98,121,32,116,104,105,115,32,109,111,100,117,108,101,46,32,84,104,101,32,105,110,102,111,114,109,97,116,105,111,110,32,105,115,32,98,97,115,101,100,32,111,110,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,119,105,116,104,32,99,104,97,110,103,101,115,32,119,104,101,114,101,32,116,104,105,115,32,109,111,100,117,108,101,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,46>>]},{a,[{id,<<114,101,103,101,120,112,95,115,121,110,116,97,120,95,100,101,116,97,105,108,115>>}],[]},{h2,[],[<<80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115>>]},{p,[],[<<84,104,101,32,115,121,110,116,97,120,32,97,110,100,32,115,101,109,97,110,116,105,99,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,100,101,116,97,105,108,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,46,32,80,101,114,108,39,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,105,116,115,32,111,119,110,32,100,111,99,117,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,101,110,101,114,97,108,32,97,114,101,32,99,111,118,101,114,101,100,32,105,110,32,109,97,110,121,32,98,111,111,107,115,44,32,115,111,109,101,32,119,105,116,104,32,99,111,112,105,111,117,115,32,101,120,97,109,112,108,101,115,46,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,34,77,97,115,116,101,114,105,110,103,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,115,34,44,32,112,117,98,108,105,115,104,101,100,32,98,121,32,79,39,82,101,105,108,108,121,44,32,99,111,118,101,114,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,103,114,101,97,116,32,100,101,116,97,105,108,46,32,84,104,105,115,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,116,104,101,32,80,67,82,69,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,105,115,32,105,110,116,101,110,100,101,100,32,97,115,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,46>>]},{p,[],[<<84,104,101,32,114,101,102,101,114,101,110,99,101,32,109,97,116,101,114,105,97,108,32,105,115,32,100,105,118,105,100,101,100,32,105,110,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<66,97,99,107,115,108,97,115,104>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,78>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,54>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,55>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,56>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,57>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<86,101,114,116,105,99,97,108,32,66,97,114>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,52>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<82,101,112,101,116,105,116,105,111,110>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,53>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,54>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,55>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<65,115,115,101,114,116,105,111,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,56>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,57>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,111,109,109,101,110,116,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120>>]}]},{li,[],[{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108>>]}]}]},{a,[{id,<<115,101,99,116,49>>}],[]},{h2,[],[<<83,112,101,99,105,97,108,32,83,116,97,114,116,45,111,102,45,80,97,116,116,101,114,110,32,73,116,101,109,115>>]},{p,[],[<<83,111,109,101,32,111,112,116,105,111,110,115,32,116,104,97,116,32,99,97,110,32,98,101,32,112,97,115,115,101,100,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,115,112,101,99,105,97,108,32,105,116,101,109,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,98,117,116,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,32,109,97,107,101,32,116,104,101,115,101,32,111,112,116,105,111,110,115,32,97,99,99,101,115,115,105,98,108,101,32,116,111,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,115,32,119,104,111,32,97,114,101,32,110,111,116,32,97,98,108,101,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,112,114,111,103,114,97,109,32,116,104,97,116,32,112,114,111,99,101,115,115,101,115,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,105,116,101,109,115,32,99,97,110,32,97,112,112,101,97,114,44,32,98,117,116,32,116,104,101,121,32,109,117,115,116,32,97,108,108,32,98,101,32,116,111,103,101,116,104,101,114,32,114,105,103,104,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,32,108,101,116,116,101,114,115,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,32,99,97,115,101,46>>]},{p,[],[{em,[],[<<85,84,70,32,83,117,112,112,111,114,116>>]}]},{p,[],[<<85,110,105,99,111,100,101,32,115,117,112,112,111,114,116,32,105,115,32,98,97,115,105,99,97,108,108,121,32,85,84,70,45,56,32,98,97,115,101,100,46,32,84,111,32,117,115,101,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,44,32,121,111,117,32,101,105,116,104,101,114,32,99,97,108,108,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,111,114,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,115,58>>]},{pre,[],[{code,[],[<<40,42,85,84,70,56,41,10,40,42,85,84,70,41>>]}]},{p,[],[<<66,111,116,104,32,111,112,116,105,111,110,115,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,44,32,116,104,101,32,105,110,112,117,116,32,115,116,114,105,110,103,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,85,84,70,45,56,46,32,78,111,116,105,99,101,32,116,104,97,116,32,119,105,116,104,32,116,104,101,115,101,32,105,110,115,116,114,117,99,116,105,111,110,115,44,32,116,104,101,32,97,117,116,111,109,97,116,105,99,32,99,111,110,118,101,114,115,105,111,110,32,111,102,32,108,105,115,116,115,32,116,111,32,85,84,70,45,56,32,105,115,32,110,111,116,32,112,101,114,102,111,114,109,101,100,32,98,121,32,116,104,101,32>>,{code,[],[<<114,101>>]},<<32,102,117,110,99,116,105,111,110,115,46,32,84,104,101,114,101,102,111,114,101,44,32,117,115,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,32,114,101,99,111,109,109,101,110,100,101,100,46,32,65,100,100,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,119,104,101,110,32,114,117,110,110,105,110,103,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,105,110,115,116,101,97,100,46>>]},{p,[],[<<83,111,109,101,32,97,112,112,108,105,99,97,116,105,111,110,115,32,116,104,97,116,32,97,108,108,111,119,32,116,104,101,105,114,32,117,115,101,114,115,32,116,111,32,115,117,112,112,108,121,32,112,97,116,116,101,114,110,115,32,99,97,110,32,119,105,115,104,32,116,111,32,114,101,115,116,114,105,99,116,32,116,104,101,109,32,116,111,32,110,111,110,45,85,84,70,32,100,97,116,97,32,102,111,114,32,115,101,99,117,114,105,116,121,32,114,101,97,115,111,110,115,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<110,101,118,101,114,95,117,116,102>>]},<<32,105,115,32,115,101,116,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,44,32,40,42,85,84,70,41,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,110,111,116,32,97,108,108,111,119,101,100,44,32,97,110,100,32,116,104,101,105,114,32,97,112,112,101,97,114,97,110,99,101,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,46>>]},{p,[],[{em,[],[<<85,110,105,99,111,100,101,32,80,114,111,112,101,114,116,121,32,83,117,112,112,111,114,116>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,97,110,111,116,104,101,114,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32,116,104,97,116,32,99,97,110,32,97,112,112,101,97,114,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,42,85,67,80,41>>]}]},{p,[],[<<84,104,105,115,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<58,32,105,116,32,99,97,117,115,101,115,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,92,100,32,97,110,100,32,92,119,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,105,110,115,116,101,97,100,32,111,102,32,114,101,99,111,103,110,105,122,105,110,103,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,115,32,60,32,50,53,54,32,116,104,114,111,117,103,104,32,97,32,108,111,111,107,117,112,32,116,97,98,108,101,46>>]},{p,[],[{em,[],[<<68,105,115,97,98,108,105,110,103,32,83,116,97,114,116,117,112,32,79,112,116,105,109,105,122,97,116,105,111,110,115>>]}]},{p,[],[<<73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32>>,{code,[],[<<40,42,78,79,95,83,84,65,82,84,95,79,80,84,41>>]},<<44,32,105,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]},<<32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46>>]},{p,[],[{em,[],[<<78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115>>]}]},{a,[{id,<<110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115>>}],[]},{p,[],[<<80,67,82,69,32,115,117,112,112,111,114,116,115,32,102,105,118,101,32,99,111,110,118,101,110,116,105,111,110,115,32,102,111,114,32,105,110,100,105,99,97,116,105,110,103,32,108,105,110,101,32,98,114,101,97,107,115,32,105,110,32,115,116,114,105,110,103,115,58,32,97,32,115,105,110,103,108,101,32,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,41,32,99,104,97,114,97,99,116,101,114,44,32,97,32,115,105,110,103,108,101,32,76,70,32,40,108,105,110,101,32,102,101,101,100,41,32,99,104,97,114,97,99,116,101,114,44,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,97,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,44,32,97,110,100,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,46>>]},{p,[],[<<65,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,118,101,32,115,101,113,117,101,110,99,101,115,58>>]},{dl,[],[{dt,[],[<<40,42,67,82,41>>]},{dd,[],[<<67,97,114,114,105,97,103,101,32,114,101,116,117,114,110>>]},{dt,[],[<<40,42,76,70,41>>]},{dd,[],[<<76,105,110,101,32,102,101,101,100>>]},{dt,[],[<<40,42,67,82,76,70,41>>]},{dd,[],[<<62,67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,102,111,108,108,111,119,101,100,32,98,121,32,108,105,110,101,32,102,101,101,100>>]},{dt,[],[<<40,42,65,78,89,67,82,76,70,41>>]},{dd,[],[<<65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,97,98,111,118,101>>]},{dt,[],[<<40,42,65,78,89,41>>]},{dd,[],[<<65,108,108,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115>>]}]},{p,[],[<<84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,99,104,97,110,103,101,115,32,116,104,101,32,99,111,110,118,101,110,116,105,111,110,32,116,111,32,67,82,58>>]},{pre,[],[{code,[],[<<40,42,67,82,41,97,46,98>>]}]},{p,[],[<<84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32>>,{code,[],[<<97,92,110,98>>]},<<44,32,97,115,32,76,70,32,105,115,32,110,111,32,108,111,110,103,101,114,32,97,32,110,101,119,108,105,110,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,97,102,102,101,99,116,115,32,119,104,101,114,101,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,116,114,117,101,46,32,73,116,32,97,108,115,111,32,97,102,102,101,99,116,115,32,116,104,101,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,116,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,105,115,32,110,111,116,32,115,101,116,44,32,97,110,100,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,92,78,46,32,72,111,119,101,118,101,114,44,32,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,119,104,97,116,32,116,104,101,32,92,82,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,109,97,116,99,104,101,115,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,105,115,32,105,115,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,59,32,115,101,101,32,116,104,101,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,92,82,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115>>]},<<46,32,65,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,92,82,32,115,101,116,116,105,110,103,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,46>>]},{p,[],[{em,[],[<<83,101,116,116,105,110,103,32,77,97,116,99,104,32,97,110,100,32,82,101,99,117,114,115,105,111,110,32,76,105,109,105,116,115>>]}]},{p,[],[<<84,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,99,97,110,32,115,101,116,32,97,32,108,105,109,105,116,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,40,41,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,97,110,100,32,111,110,32,116,104,101,32,109,97,120,105,109,117,109,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,115,46,32,84,104,101,115,101,32,102,97,99,105,108,105,116,105,101,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,116,111,32,99,97,116,99,104,32,114,117,110,97,119,97,121,32,109,97,116,99,104,101,115,32,116,104,97,116,32,97,114,101,32,112,114,111,118,111,107,101,100,32,98,121,32,112,97,116,116,101,114,110,115,32,119,105,116,104,32,104,117,103,101,32,109,97,116,99,104,105,110,103,32,116,114,101,101,115,32,40,97,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,41,32,97,110,100,32,116,111,32,97,118,111,105,100,32,114,117,110,110,105,110,103,32,111,117,116,32,111,102,32,115,121,115,116,101,109,32,115,116,97,99,107,32,98,121,32,116,111,111,32,109,117,99,104,32,114,101,99,117,114,115,105,111,110,46,32,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,108,105,109,105,116,115,32,105,115,32,114,101,97,99,104,101,100,44,32>>,{code,[],[<<112,99,114,101,95,101,120,101,99,40,41>>]},<<32,103,105,118,101,115,32,97,110,32,101,114,114,111,114,32,114,101,116,117,114,110,46,32,84,104,101,32,108,105,109,105,116,115,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,105,116,101,109,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,111,114,109,115,58>>]},{pre,[],[{code,[],[<<40,42,76,73,77,73,84,95,77,65,84,67,72,61,100,41,10,40,42,76,73,77,73,84,95,82,69,67,85,82,83,73,79,78,61,100,41>>]}]},{p,[],[<<72,101,114,101,32,100,32,105,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,109,117,115,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,116,104,101,32,118,97,108,117,101,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,102,111,114,32,105,116,32,116,111,32,104,97,118,101,32,97,110,121,32,101,102,102,101,99,116,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,119,114,105,116,101,114,32,99,97,110,32,108,111,119,101,114,32,116,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,116,104,101,32,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,110,111,116,32,114,97,105,115,101,32,105,116,46,32,73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,101,116,116,105,110,103,32,111,102,32,111,110,101,32,111,102,32,116,104,101,115,101,32,108,105,109,105,116,115,44,32,116,104,101,32,108,111,119,101,114,32,118,97,108,117,101,32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,102,111,114,32,98,111,116,104,32,116,104,101,32,108,105,109,105,116,115,32,105,115,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,108,105,109,105,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,115,116,97,99,107,32,100,101,112,116,104,32,111,102,32,116,104,101,32,86,77,44,32,97,115,32,80,67,82,69,32,102,111,114,32,69,114,108,97,110,103,32,105,115,32,99,111,109,112,105,108,101,100,32,105,110,32,115,117,99,104,32,97,32,119,97,121,32,116,104,97,116,32,116,104,101,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,100,111,101,115,32,114,101,99,117,114,115,105,111,110,32,111,110,32,116,104,101,32,67,32,115,116,97,99,107,46>>]},{p,[],[<<78,111,116,101,32,116,104,97,116,32>>,{code,[],[<<76,73,77,73,84,95,77,65,84,67,72>>]},<<32,97,110,100,32>>,{code,[],[<<76,73,77,73,84,95,82,69,67,85,82,83,73,79,78>>]},<<32,99,97,110,32,111,110,108,121,32,114,101,100,117,99,101,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,108,105,109,105,116,115,32,115,101,116,32,98,121,32,116,104,101,32,99,97,108,108,101,114,44,32,110,111,116,32,105,110,99,114,101,97,115,101,32,116,104,101,109,46>>]},{a,[{id,<<115,101,99,116,50>>}],[]},{h2,[],[<<67,104,97,114,97,99,116,101,114,115,32,97,110,100,32,77,101,116,97,99,104,97,114,97,99,116,101,114,115>>]},{p,[],[<<65,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,46,32,77,111,115,116,32,99,104,97,114,97,99,116,101,114,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,32,97,110,100,32,109,97,116,99,104,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,115,32,97,32,116,114,105,118,105,97,108,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,112,111,114,116,105,111,110,32,111,102,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,105,100,101,110,116,105,99,97,108,32,116,111,32,105,116,115,101,108,102,58>>]},{pre,[],[{code,[],[<<84,104,101,32,113,117,105,99,107,32,98,114,111,119,110,32,102,111,120>>]}]},{p,[],[<<87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,112,101,99,105,102,105,101,100,32,40,111,112,116,105,111,110,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<41,44,32,108,101,116,116,101,114,115,32,97,114,101,32,109,97,116,99,104,101,100,32,105,110,100,101,112,101,110,100,101,110,116,108,121,32,111,102,32,99,97,115,101,46>>]},{p,[],[<<84,104,101,32,112,111,119,101,114,32,111,102,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,97,98,105,108,105,116,121,32,116,111,32,105,110,99,108,117,100,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,114,101,112,101,116,105,116,105,111,110,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,115,101,32,97,114,101,32,101,110,99,111,100,101,100,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,116,104,101,32,117,115,101,32,111,102,32>>,{em,[],[<<109,101,116,97,99,104,97,114,97,99,116,101,114,115>>]},<<44,32,119,104,105,99,104,32,100,111,32,110,111,116,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,32,98,117,116,32,105,110,115,116,101,97,100,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,32,105,110,32,115,111,109,101,32,115,112,101,99,105,97,108,32,119,97,121,46>>]},{p,[],[<<84,119,111,32,115,101,116,115,32,111,102,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,101,120,105,115,116,58,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,97,110,121,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,101,120,99,101,112,116,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,79,117,116,115,105,100,101,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,44,32,116,104,101,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<92>>]},{dd,[],[<<71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,109,97,110,121,32,117,115,101,115>>]},{dt,[],[<<94>>]},{dd,[],[<<65,115,115,101,114,116,32,115,116,97,114,116,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41>>]},{dt,[],[<<36>>]},{dd,[],[<<65,115,115,101,114,116,32,101,110,100,32,111,102,32,115,116,114,105,110,103,32,40,111,114,32,108,105,110,101,44,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41>>]},{dt,[],[<<46>>]},{dd,[],[<<77,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,110,101,119,108,105,110,101,32,40,98,121,32,100,101,102,97,117,108,116,41>>]},{dt,[],[<<91>>]},{dd,[],[<<83,116,97,114,116,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110>>]},{dt,[],[<<124>>]},{dd,[],[<<83,116,97,114,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104>>]},{dt,[],[<<40>>]},{dd,[],[<<83,116,97,114,116,32,115,117,98,112,97,116,116,101,114,110>>]},{dt,[],[<<41>>]},{dd,[],[<<69,110,100,32,115,117,98,112,97,116,116,101,114,110>>]},{dt,[],[<<63>>]},{dd,[],[<<69,120,116,101,110,100,115,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,40,44,32,97,108,115,111,32,48,32,111,114,32,49,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,113,117,97,110,116,105,102,105,101,114,32,109,105,110,105,109,105,122,101,114>>]},{dt,[],[<<42>>]},{dd,[],[<<48,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,115>>]},{dt,[],[<<43>>]},{dd,[],[<<49,32,111,114,32,109,111,114,101,32,113,117,97,110,116,105,102,105,101,114,44,32,97,108,115,111,32,34,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,34>>]},{dt,[],[<<123>>]},{dd,[],[<<83,116,97,114,116,32,109,105,110,47,109,97,120,32,113,117,97,110,116,105,102,105,101,114>>]}]},{p,[],[<<80,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,119,105,116,104,105,110,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,32,105,115,32,99,97,108,108,101,100,32,97,32,34,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,34,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,111,110,108,121,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,58>>]},{dl,[],[{dt,[],[<<92>>]},{dd,[],[<<71,101,110,101,114,97,108,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<94>>]},{dd,[],[<<78,101,103,97,116,101,32,116,104,101,32,99,108,97,115,115,44,32,98,117,116,32,111,110,108,121,32,105,102,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<45>>]},{dd,[],[<<73,110,100,105,99,97,116,101,115,32,99,104,97,114,97,99,116,101,114,32,114,97,110,103,101>>]},{dt,[],[<<91>>]},{dd,[],[<<80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,111,110,108,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,80,111,115,105,120,32,115,121,110,116,97,120,41>>]},{dt,[],[<<93>>]},{dd,[],[<<84,101,114,109,105,110,97,116,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,99,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,101,32,117,115,101,32,111,102,32,101,97,99,104,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46>>]},{a,[{id,<<115,101,99,116,51>>}],[]},{h2,[],[<<66,97,99,107,115,108,97,115,104>>]},{p,[],[<<84,104,101,32,98,97,99,107,115,108,97,115,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,109,97,110,121,32,117,115,101,115,46,32,70,105,114,115,116,44,32,105,102,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,110,117,109,98,101,114,32,111,114,32,97,32,108,101,116,116,101,114,44,32,105,116,32,116,97,107,101,115,32,97,119,97,121,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,104,97,116,32,97,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,104,97,118,101,46,32,84,104,105,115,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,97,115,32,97,110,32,101,115,99,97,112,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,108,105,101,115,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,42,32,99,104,97,114,97,99,116,101,114,44,32,121,111,117,32,119,114,105,116,101,32,92,42,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,105,115,32,101,115,99,97,112,105,110,103,32,97,99,116,105,111,110,32,97,112,112,108,105,101,115,32,105,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,119,111,117,108,100,32,111,116,104,101,114,119,105,115,101,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,109,101,116,97,99,104,97,114,97,99,116,101,114,44,32,115,111,32,105,116,32,105,115,32,97,108,119,97,121,115,32,115,97,102,101,32,116,111,32,112,114,101,99,101,100,101,32,97,32,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,119,105,116,104,32,98,97,99,107,115,108,97,115,104,32,116,111,32,115,112,101,99,105,102,121,32,116,104,97,116,32,105,116,32,115,116,97,110,100,115,32,102,111,114,32,105,116,115,101,108,102,46,32,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,105,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,119,114,105,116,101,32,92,92,46>>]},{p,[],[<<73,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,109,111,100,101,44,32,111,110,108,121,32,65,83,67,73,73,32,110,117,109,98,101,114,115,32,97,110,100,32,108,101,116,116,101,114,115,32,104,97,118,101,32,97,110,121,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,97,102,116,101,114,32,97,32,98,97,99,107,115,108,97,115,104,46,32,65,108,108,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,32,112,97,114,116,105,99,117,108,97,114,44,32,116,104,111,115,101,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,62,32,49,50,55,41,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,108,105,116,101,114,97,108,115,46>>]},{p,[],[<<73,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<44,32,119,104,105,116,101,115,112,97,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,40,111,116,104,101,114,32,116,104,97,110,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,41,32,97,110,100,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,97,114,101,32,105,103,110,111,114,101,100,46,32,65,110,32,101,115,99,97,112,105,110,103,32,98,97,99,107,115,108,97,115,104,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,105,110,99,108,117,100,101,32,97,32,119,104,105,116,101,115,112,97,99,101,32,111,114,32,35,32,99,104,97,114,97,99,116,101,114,32,97,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<84,111,32,114,101,109,111,118,101,32,116,104,101,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,102,114,111,109,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,112,117,116,32,116,104,101,109,32,98,101,116,119,101,101,110,32,92,81,32,97,110,100,32,92,69,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,104,97,116,32,36,32,97,110,100,32,64,32,97,114,101,32,104,97,110,100,108,101,100,32,97,115,32,108,105,116,101,114,97,108,115,32,105,110,32,92,81,46,46,46,92,69,32,115,101,113,117,101,110,99,101,115,32,105,110,32,80,67,82,69,44,32,119,104,105,108,101,32,36,32,97,110,100,32,64,32,99,97,117,115,101,32,118,97,114,105,97,98,108,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,105,110,32,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<80,97,116,116,101,114,110,32,32,32,32,32,32,32,32,32,32,32,32,80,67,82,69,32,109,97,116,99,104,101,115,32,32,32,80,101,114,108,32,109,97,116,99,104,101,115,10,10,92,81,97,98,99,36,120,121,122,92,69,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,36,120,121,122,10,92,81,97,98,99,92,36,120,121,122,92,69,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,32,32,32,32,32,32,32,97,98,99,92,36,120,121,122,10,92,81,97,98,99,92,69,92,36,92,81,120,121,122,92,69,32,32,32,97,98,99,36,120,121,122,32,32,32,32,32,32,32,32,97,98,99,36,120,121,122>>]}]},{p,[],[<<84,104,101,32,92,81,46,46,46,92,69,32,115,101,113,117,101,110,99,101,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,65,110,32,105,115,111,108,97,116,101,100,32,92,69,32,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,92,81,32,105,115,32,105,103,110,111,114,101,100,46,32,73,102,32,92,81,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,92,69,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,116,104,101,32,108,105,116,101,114,97,108,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,99,111,110,116,105,110,117,101,115,32,116,111,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,40,116,104,97,116,32,105,115,44,32,92,69,32,105,115,32,97,115,115,117,109,101,100,32,97,116,32,116,104,101,32,101,110,100,41,46,32,73,102,32,116,104,101,32,105,115,111,108,97,116,101,100,32,92,81,32,105,115,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,105,115,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,44,32,97,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,110,111,116,32,116,101,114,109,105,110,97,116,101,100,46>>]},{p,[],[{em,[],[<<78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115>>]}]},{a,[{id,<<110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115>>}],[]},{p,[],[<<65,32,115,101,99,111,110,100,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,112,114,111,118,105,100,101,115,32,97,32,119,97,121,32,111,102,32,101,110,99,111,100,105,110,103,32,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,112,97,116,116,101,114,110,115,32,105,110,32,97,32,118,105,115,105,98,108,101,32,109,97,110,110,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,32,114,101,115,116,114,105,99,116,105,111,110,32,111,110,32,116,104,101,32,97,112,112,101,97,114,97,110,99,101,32,111,102,32,110,111,110,45,112,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,97,112,97,114,116,32,102,114,111,109,32,116,104,101,32,98,105,110,97,114,121,32,122,101,114,111,32,116,104,97,116,32,116,101,114,109,105,110,97,116,101,115,32,97,32,112,97,116,116,101,114,110,46,32,87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,112,97,114,101,100,32,98,121,32,116,101,120,116,32,101,100,105,116,105,110,103,44,32,105,116,32,105,115,32,111,102,116,101,110,32,101,97,115,105,101,114,32,116,111,32,117,115,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,110,32,116,104,101,32,98,105,110,97,114,121,32,99,104,97,114,97,99,116,101,114,32,105,116,32,114,101,112,114,101,115,101,110,116,115,58>>]},{dl,[],[{dt,[],[<<92,97>>]},{dd,[],[<<65,108,97,114,109,44,32,116,104,97,116,32,105,115,44,32,116,104,101,32,66,69,76,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,55,41>>]},{dt,[],[<<92,99,120>>]},{dd,[],[<<34,67,111,110,116,114,111,108,45,120,34,44,32,119,104,101,114,101,32,120,32,105,115,32,97,110,121,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,101>>]},{dd,[],[<<69,115,99,97,112,101,32,40,104,101,120,32,49,66,41>>]},{dt,[],[<<92,102>>]},{dd,[],[<<70,111,114,109,32,102,101,101,100,32,40,104,101,120,32,48,67,41>>]},{dt,[],[<<92,110>>]},{dd,[],[<<76,105,110,101,32,102,101,101,100,32,40,104,101,120,32,48,65,41>>]},{dt,[],[<<92,114>>]},{dd,[],[<<67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,104,101,120,32,48,68,41>>]},{dt,[],[<<92,116>>]},{dd,[],[<<84,97,98,32,40,104,101,120,32,48,57,41>>]},{dt,[],[<<92,48,100,100>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,48,100,100>>]},{dt,[],[<<92,100,100,100>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,44,32,111,114,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101>>]},{dt,[],[<<92,111,123,100,100,100,46,46,125>>]},{dd,[],[<<99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,100,100,100,46,46>>]},{dt,[],[<<92,120,104,104>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104>>]},{dt,[],[<<92,120,123,104,104,104,46,46,125>>]},{dd,[],[<<67,104,97,114,97,99,116,101,114,32,119,105,116,104,32,104,101,120,32,99,111,100,101,32,104,104,104,46,46>>]}]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<78,111,116,101,32,116,104,97,116,32,92,48,100,100,32,105,115,32,97,108,119,97,121,115,32,97,110,32,111,99,116,97,108,32,99,111,100,101,44,32,97,110,100,32,116,104,97,116,32,92,56,32,97,110,100,32,92,57,32,97,114,101,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,46>>]}]},{p,[],[<<84,104,101,32,112,114,101,99,105,115,101,32,101,102,102,101,99,116,32,111,102,32,92,99,120,32,111,110,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,97,115,32,102,111,108,108,111,119,115,58,32,105,102,32,120,32,105,115,32,97,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,44,32,105,116,32,105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,117,112,112,101,114,32,99,97,115,101,46,32,84,104,101,110,32,98,105,116,32,54,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,52,48,41,32,105,115,32,105,110,118,101,114,116,101,100,46,32,84,104,117,115,32,92,99,65,32,116,111,32,92,99,90,32,98,101,99,111,109,101,32,104,101,120,32,48,49,32,116,111,32,104,101,120,32,49,65,32,40,65,32,105,115,32,52,49,44,32,90,32,105,115,32,53,65,41,44,32,98,117,116,32,92,99,123,32,98,101,99,111,109,101,115,32,104,101,120,32,51,66,32,40,123,32,105,115,32,55,66,41,44,32,97,110,100,32,92,99,59,32,98,101,99,111,109,101,115,32,104,101,120,32,55,66,32,40,59,32,105,115,32,51,66,41,46,32,73,102,32,116,104,101,32,100,97,116,97,32,105,116,101,109,32,40,98,121,116,101,32,111,114,32,49,54,45,98,105,116,32,118,97,108,117,101,41,32,102,111,108,108,111,119,105,110,103,32,92,99,32,104,97,115,32,97,32,118,97,108,117,101,32,62,32,49,50,55,44,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,84,104,105,115,32,108,111,99,107,115,32,111,117,116,32,110,111,110,45,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,108,108,32,109,111,100,101,115,46>>]},{p,[],[<<84,104,101,32,92,99,32,102,97,99,105,108,105,116,121,32,119,97,115,32,100,101,115,105,103,110,101,100,32,102,111,114,32,117,115,101,32,119,105,116,104,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,44,32,98,117,116,32,119,105,116,104,32,116,104,101,32,101,120,116,101,110,115,105,111,110,32,116,111,32,85,110,105,99,111,100,101,32,105,116,32,105,115,32,101,118,101,110,32,108,101,115,115,32,117,115,101,102,117,108,32,116,104,97,110,32,105,116,32,111,110,99,101,32,119,97,115,46>>]},{p,[],[<<65,102,116,101,114,32,92,48,32,117,112,32,116,111,32,116,119,111,32,102,117,114,116,104,101,114,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,102,101,119,101,114,32,116,104,97,110,32,116,119,111,32,100,105,103,105,116,115,44,32,106,117,115,116,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,112,114,101,115,101,110,116,32,97,114,101,32,117,115,101,100,46,32,84,104,117,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,92,48,92,120,92,48,49,53,32,115,112,101,99,105,102,105,101,115,32,116,119,111,32,98,105,110,97,114,121,32,122,101,114,111,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,67,82,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,118,97,108,117,101,32,49,51,41,46,32,77,97,107,101,32,115,117,114,101,32,121,111,117,32,115,117,112,112,108,121,32,116,119,111,32,100,105,103,105,116,115,32,97,102,116,101,114,32,116,104,101,32,105,110,105,116,105,97,108,32,122,101,114,111,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,102,111,108,108,111,119,115,32,105,115,32,105,116,115,101,108,102,32,97,110,32,111,99,116,97,108,32,100,105,103,105,116,46>>]},{p,[],[<<84,104,101,32,101,115,99,97,112,101,32,92,111,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,111,99,116,97,108,32,100,105,103,105,116,115,44,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,46,32,65,110,32,101,114,114,111,114,32,111,99,99,117,114,115,32,105,102,32,116,104,105,115,32,105,115,32,110,111,116,32,116,104,101,32,99,97,115,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,105,115,32,97,32,114,101,99,101,110,116,32,97,100,100,105,116,105,111,110,32,116,111,32,80,101,114,108,59,32,105,116,32,112,114,111,118,105,100,101,115,32,119,97,121,32,111,102,32,115,112,101,99,105,102,121,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,111,100,101,32,112,111,105,110,116,115,32,97,115,32,111,99,116,97,108,32,110,117,109,98,101,114,115,32,103,114,101,97,116,101,114,32,116,104,97,110,32,48,55,55,55,44,32,97,110,100,32,105,116,32,97,108,115,111,32,97,108,108,111,119,115,32,111,99,116,97,108,32,110,117,109,98,101,114,115,32,97,110,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,98,101,32,117,110,97,109,98,105,103,117,111,117,115,108,121,32,115,112,101,99,105,102,105,101,100,46>>]},{p,[],[<<70,111,114,32,103,114,101,97,116,101,114,32,99,108,97,114,105,116,121,32,97,110,100,32,117,110,97,109,98,105,103,117,105,116,121,44,32,105,116,32,105,115,32,98,101,115,116,32,116,111,32,97,118,111,105,100,32,102,111,108,108,111,119,105,110,103,32,92,32,98,121,32,97,32,100,105,103,105,116,32,103,114,101,97,116,101,114,32,116,104,97,110,32,122,101,114,111,46,32,73,110,115,116,101,97,100,44,32,117,115,101,32,92,111,123,125,32,111,114,32,92,120,123,125,32,116,111,32,115,112,101,99,105,102,121,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,115,44,32,97,110,100,32,92,103,123,125,32,116,111,32,115,112,101,99,105,102,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,114,97,103,114,97,112,104,115,32,100,101,115,99,114,105,98,101,32,116,104,101,32,111,108,100,44,32,97,109,98,105,103,117,111,117,115,32,115,121,110,116,97,120,46>>]},{p,[],[<<84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,111,116,104,101,114,32,116,104,97,110,32,48,32,105,115,32,99,111,109,112,108,105,99,97,116,101,100,44,32,97,110,100,32,80,101,114,108,32,104,97,115,32,99,104,97,110,103,101,100,32,105,110,32,114,101,99,101,110,116,32,114,101,108,101,97,115,101,115,44,32,99,97,117,115,105,110,103,32,80,67,82,69,32,97,108,115,111,32,116,111,32,99,104,97,110,103,101,46,32,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,80,67,82,69,32,114,101,97,100,115,32,116,104,101,32,100,105,103,105,116,32,97,110,100,32,97,110,121,32,102,111,108,108,111,119,105,110,103,32,100,105,103,105,116,115,32,97,115,32,97,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,46,32,73,102,32,116,104,101,32,110,117,109,98,101,114,32,105,115,32,60,32,56,44,32,111,114,32,105,102,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,97,116,32,108,101,97,115,116,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32>>,{em,[],[<<98,97,99,107,32,114,101,102,101,114,101,110,99,101>>]},<<46,32,65,32,100,101,115,99,114,105,112,116,105,111,110,32,111,102,32,104,111,119,32,116,104,105,115,32,119,111,114,107,115,32,105,115,32,112,114,111,118,105,100,101,100,32,108,97,116,101,114,44,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46>>]},{p,[],[<<73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,92,32,105,115,32,62,32,55,32,97,110,100,32,116,104,101,114,101,32,104,97,118,101,32,110,111,116,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,80,67,82,69,32,104,97,110,100,108,101,115,32,92,56,32,97,110,100,32,92,57,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,57,34,44,32,97,110,100,32,111,116,104,101,114,119,105,115,101,32,114,101,45,114,101,97,100,115,32,117,112,32,116,111,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,44,32,97,110,100,32,117,115,105,110,103,32,116,104,101,109,32,116,111,32,103,101,110,101,114,97,116,101,32,97,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,46,32,65,110,121,32,115,117,98,115,101,113,117,101,110,116,32,100,105,103,105,116,115,32,115,116,97,110,100,32,102,111,114,32,116,104,101,109,115,101,108,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{dl,[],[{dt,[],[<<92,48,52,48>>]},{dd,[],[<<65,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,110,32,65,83,67,73,73,32,115,112,97,99,101>>]},{dt,[],[<<92,52,48>>]},{dd,[],[<<84,104,101,32,115,97,109,101,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,97,114,101,32,60,32,52,48,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115>>]},{dt,[],[<<92,55>>]},{dd,[],[<<65,108,119,97,121,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101>>]},{dt,[],[<<92,49,49>>]},{dd,[],[<<67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,97,110,111,116,104,101,114,32,119,97,121,32,111,102,32,119,114,105,116,105,110,103,32,97,32,116,97,98>>]},{dt,[],[<<92,48,49,49>>]},{dd,[],[<<65,108,119,97,121,115,32,97,32,116,97,98>>]},{dt,[],[<<92,48,49,49,51>>]},{dd,[],[<<65,32,116,97,98,32,102,111,108,108,111,119,101,100,32,98,121,32,99,104,97,114,97,99,116,101,114,32,34,51,34>>]},{dt,[],[<<92,49,49,51>>]},{dd,[],[<<67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,111,99,116,97,108,32,99,111,100,101,32,49,49,51>>]},{dt,[],[<<92,51,55,55>>]},{dd,[],[<<67,97,110,32,98,101,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,116,104,101,114,119,105,115,101,32,118,97,108,117,101,32,50,53,53,32,40,100,101,99,105,109,97,108,41>>]},{dt,[],[<<92,56,49>>]},{dd,[],[<<69,105,116,104,101,114,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,111,114,32,116,104,101,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,34,56,34,32,97,110,100,32,34,49,34>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,111,99,116,97,108,32,118,97,108,117,101,115,32,62,61,32,49,48,48,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,116,114,111,100,117,99,101,100,32,98,121,32,97,32,108,101,97,100,105,110,103,32,122,101,114,111,44,32,97,115,32,110,111,32,109,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,111,99,116,97,108,32,100,105,103,105,116,115,32,97,114,101,32,101,118,101,114,32,114,101,97,100,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,97,102,116,101,114,32,92,120,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,123,44,32,102,114,111,109,32,122,101,114,111,32,116,111,32,116,119,111,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,32,97,114,101,32,114,101,97,100,32,40,108,101,116,116,101,114,115,32,99,97,110,32,98,101,32,105,110,32,117,112,112,101,114,32,111,114,32,108,111,119,101,114,32,99,97,115,101,41,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115,32,109,97,121,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,92,120,123,32,97,110,100,32,125,46,32,73,102,32,97,32,99,104,97,114,97,99,116,101,114,32,111,116,104,101,114,32,116,104,97,110,32,97,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,32,97,112,112,101,97,114,115,32,98,101,116,119,101,101,110,32,92,120,123,32,97,110,100,32,125,44,32,111,114,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,116,101,114,109,105,110,97,116,105,110,103,32,125,44,32,97,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46>>]},{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,118,97,108,117,101,32,105,115,32,108,101,115,115,32,116,104,97,110,32,50,53,54,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,121,32,101,105,116,104,101,114,32,111,102,32,116,104,101,32,116,119,111,32,115,121,110,116,97,120,101,115,32,102,111,114,32,92,120,46,32,84,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,119,97,121,32,116,104,101,121,32,97,114,101,32,104,97,110,100,108,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,120,100,99,32,105,115,32,101,120,97,99,116,108,121,32,116,104,101,32,115,97,109,101,32,97,115,32,92,120,123,100,99,125,46>>]},{p,[],[{em,[],[<<67,111,110,115,116,114,97,105,110,116,115,32,111,110,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115>>]}]},{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,117,115,105,110,103,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,110,117,109,98,101,114,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,99,101,114,116,97,105,110,32,118,97,108,117,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<56,45,98,105,116,32,110,111,110,45,85,84,70,32,109,111,100,101>>]},{dd,[],[{p,[],[<<60,32,48,120,49,48,48>>]}]},{dt,[],[<<56,45,98,105,116,32,85,84,70,45,56,32,109,111,100,101>>]},{dd,[],[{p,[],[<<60,32,48,120,49,48,102,102,102,102,32,97,110,100,32,97,32,118,97,108,105,100,32,99,111,100,101,112,111,105,110,116>>]}]}]},{p,[],[<<73,110,118,97,108,105,100,32,85,110,105,99,111,100,101,32,99,111,100,101,112,111,105,110,116,115,32,97,114,101,32,116,104,101,32,114,97,110,103,101,32,48,120,100,56,48,48,32,116,111,32,48,120,100,102,102,102,32,40,116,104,101,32,115,111,45,99,97,108,108,101,100,32,34,115,117,114,114,111,103,97,116,101,34,32,99,111,100,101,112,111,105,110,116,115,41,44,32,97,110,100,32,48,120,102,102,101,102,46>>]},{p,[],[{em,[],[<<69,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115>>]}]},{p,[],[<<65,108,108,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,100,101,102,105,110,101,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,32,99,97,110,32,98,101,32,117,115,101,100,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,65,108,115,111,44,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,92,98,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,40,104,101,120,32,48,56,41,46>>]},{p,[],[<<92,78,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,92,66,44,32,92,82,44,32,97,110,100,32,92,88,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46,32,79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,115,46>>]},{p,[],[{em,[],[<<85,110,115,117,112,112,111,114,116,101,100,32,69,115,99,97,112,101,32,83,101,113,117,101,110,99,101,115>>]}]},{p,[],[<<73,110,32,80,101,114,108,44,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,92,108,44,32,92,76,44,32,92,117,44,32,97,110,100,32,92,85,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,105,116,115,32,115,116,114,105,110,103,32,104,97,110,100,108,101,114,32,97,110,100,32,117,115,101,100,32,116,111,32,109,111,100,105,102,121,32,116,104,101,32,99,97,115,101,32,111,102,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46>>]},{p,[],[{em,[],[<<65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]}]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,32,92,103,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,117,110,115,105,103,110,101,100,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,44,32,105,115,32,97,110,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,97,109,101,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,99,111,100,101,100,32,97,115,32,92,103,123,110,97,109,101,125,46,32,66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,32,108,97,116,101,114,44,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46>>]},{p,[],[{em,[],[<<65,98,115,111,108,117,116,101,32,97,110,100,32,82,101,108,97,116,105,118,101,32,83,117,98,114,111,117,116,105,110,101,32,67,97,108,108,115>>]}]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,92,103,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,32,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,32,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,34,115,117,98,114,111,117,116,105,110,101,34,46,32,68,101,116,97,105,108,115,32,97,114,101,32,100,105,115,99,117,115,115,101,100,32,108,97,116,101,114,46,32,78,111,116,105,99,101,32,116,104,97,116,32,92,103,123,46,46,46,125,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,92,103,60,46,46,46,62,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,97,110,100,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46>>]},{p,[],[{em,[],[<<71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115>>]}]},{a,[{id,<<103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115>>}],[]},{p,[],[<<65,110,111,116,104,101,114,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,103,101,110,101,114,105,99,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,58>>]},{dl,[],[{dt,[],[<<92,100>>]},{dd,[],[<<65,110,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116>>]},{dt,[],[<<92,68>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,100,101,99,105,109,97,108,32,100,105,103,105,116>>]},{dt,[],[<<92,104>>]},{dd,[],[<<65,110,121,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,72>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,104,111,114,105,122,111,110,116,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,115>>]},{dd,[],[<<65,110,121,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,83>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,118>>]},{dd,[],[<<65,110,121,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,86>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,118,101,114,116,105,99,97,108,32,119,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,119>>]},{dd,[],[<<65,110,121,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114>>]},{dt,[],[<<92,87>>]},{dd,[],[<<65,110,121,32,34,110,111,110,45,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114>>]}]},{p,[],[<<84,104,101,114,101,32,105,115,32,97,108,115,111,32,116,104,101,32,115,105,110,103,108,101,32,115,101,113,117,101,110,99,101,32,92,78,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,110,111,110,45,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,34,46,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,119,104,101,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,105,115,32,110,111,116,32,115,101,116,46,32,80,101,114,108,32,97,108,115,111,32,117,115,101,115,32,92,78,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46>>]},{p,[],[<<69,97,99,104,32,112,97,105,114,32,111,102,32,108,111,119,101,114,99,97,115,101,32,97,110,100,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,112,97,114,116,105,116,105,111,110,115,32,116,104,101,32,99,111,109,112,108,101,116,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,116,119,111,32,100,105,115,106,111,105,110,116,32,115,101,116,115,46,32,65,110,121,32,103,105,118,101,110,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,111,110,101,44,32,97,110,100,32,111,110,108,121,32,111,110,101,44,32,111,102,32,101,97,99,104,32,112,97,105,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,97,112,112,101,97,114,32,98,111,116,104,32,105,110,115,105,100,101,32,97,110,100,32,111,117,116,115,105,100,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,101,121,32,101,97,99,104,32,109,97,116,99,104,32,111,110,101,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,116,121,112,101,46,32,73,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,108,32,102,97,105,108,44,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111,32,99,104,97,114,97,99,116,101,114,32,116,111,32,109,97,116,99,104,46>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,92,115,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,49,49,41,44,32,119,104,105,99,104,32,109,97,100,101,32,105,116,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,116,104,101,32,80,79,83,73,88,32,34,115,112,97,99,101,34,32,99,108,97,115,115,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,97,100,100,101,100,32,86,84,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,115,117,105,116,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,84,104,101,32,100,101,102,97,117,108,116,32,92,115,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,119,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,32,97,110,100,32,115,112,97,99,101,32,40,51,50,41,44,32,119,104,105,99,104,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,32,105,110,32,116,104,101,32,34,67,34,32,108,111,99,97,108,101,46,32,84,104,105,115,32,108,105,115,116,32,109,97,121,32,118,97,114,121,32,105,102,32,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,110,32,115,111,109,101,32,108,111,99,97,108,101,115,32,116,104,101,32,34,110,111,110,45,98,114,101,97,107,105,110,103,32,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,32,40,92,120,65,48,41,32,105,115,32,114,101,99,111,103,110,105,122,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,44,32,97,110,100,32,105,110,32,111,116,104,101,114,115,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,46>>]},{p,[],[<<65,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,117,110,100,101,114,115,99,111,114,101,32,111,114,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,97,32,108,101,116,116,101,114,32,111,114,32,97,32,100,105,103,105,116,46,32,66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,108,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115,32,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,32,80,67,82,69,32,108,111,119,45,118,97,108,117,101,100,32,99,104,97,114,97,99,116,101,114,32,116,97,98,108,101,115,44,32,105,110,32,69,114,108,97,110,103,39,115,32,99,97,115,101,32,40,97,110,100,32,119,105,116,104,111,117,116,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<41,44,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,105,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,111,117,116,115,105,100,101,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,44,32,110,101,118,101,114,32,109,97,116,99,104,32,92,100,44,32,92,115,44,32,111,114,32,92,119,44,32,97,110,100,32,97,108,119,97,121,115,32,109,97,116,99,104,32,92,68,44,32,92,83,44,32,97,110,100,32,92,87,46,32,84,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,114,101,116,97,105,110,32,116,104,101,105,114,32,111,114,105,103,105,110,97,108,32,109,101,97,110,105,110,103,115,32,102,114,111,109,32,98,101,102,111,114,101,32,85,84,70,32,115,117,112,112,111,114,116,32,119,97,115,32,97,118,97,105,108,97,98,108,101,44,32,109,97,105,110,108,121,32,102,111,114,32,101,102,102,105,99,105,101,110,99,121,32,114,101,97,115,111,110,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,105,115,32,115,101,116,44,32,116,104,101,32,98,101,104,97,118,105,111,114,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,100,101,116,101,114,109,105,110,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<92,100>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,92,112,123,78,100,125,32,109,97,116,99,104,101,115,32,40,100,101,99,105,109,97,108,32,100,105,103,105,116,41>>]},{dt,[],[<<92,115>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,92,112,123,90,125,32,111,114,32,92,104,32,111,114,32,92,118>>]},{dt,[],[<<92,119>>]},{dd,[],[<<65,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,109,97,116,99,104,101,115,32,92,112,123,76,125,32,111,114,32,92,112,123,78,125,32,109,97,116,99,104,101,115,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101>>]}]},{p,[],[<<84,104,101,32,117,112,112,101,114,99,97,115,101,32,101,115,99,97,112,101,115,32,109,97,116,99,104,32,116,104,101,32,105,110,118,101,114,115,101,32,115,101,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46,32,78,111,116,105,99,101,32,116,104,97,116,32,92,100,32,109,97,116,99,104,101,115,32,111,110,108,121,32,100,101,99,105,109,97,108,32,100,105,103,105,116,115,44,32,119,104,105,108,101,32,92,119,32,109,97,116,99,104,101,115,32,97,110,121,32,85,110,105,99,111,100,101,32,100,105,103,105,116,44,32,97,110,121,32,85,110,105,99,111,100,101,32,108,101,116,116,101,114,44,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,46,32,78,111,116,105,99,101,32,97,108,115,111,32,116,104,97,116,32>>,{code,[],[<<117,99,112>>]},<<32,97,102,102,101,99,116,115,32,92,98,32,97,110,100,32,92,66,44,32,97,115,32,116,104,101,121,32,97,114,101,32,100,101,102,105,110,101,100,32,105,110,32,116,101,114,109,115,32,111,102,32,92,119,32,97,110,100,32,92,87,46,32,77,97,116,99,104,105,110,103,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,105,115,32,110,111,116,105,99,101,97,98,108,121,32,115,108,111,119,101,114,32,119,104,101,110,32>>,{code,[],[<<117,99,112>>]},<<32,105,115,32,115,101,116,46>>]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,115,32,92,104,44,32,92,72,44,32,92,118,44,32,97,110,100,32,92,86,32,97,114,101,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,119,101,114,101,32,97,100,100,101,100,32,116,111,32,80,101,114,108,32,105,110,32,114,101,108,101,97,115,101,32,53,46,49,48,46,32,73,110,32,99,111,110,116,114,97,115,116,32,116,111,32,116,104,101,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,119,104,105,99,104,32,109,97,116,99,104,32,111,110,108,121,32,65,83,67,73,73,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,115,101,32,97,108,119,97,121,115,32,109,97,116,99,104,32,99,101,114,116,97,105,110,32,104,105,103,104,45,118,97,108,117,101,100,32,99,111,100,101,32,112,111,105,110,116,115,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32>>,{code,[],[<<117,99,112>>]},<<32,105,115,32,115,101,116,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,104,111,114,105,122,111,110,116,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58>>]},{dl,[],[{dt,[],[<<85,43,48,48,48,57>>]},{dd,[],[<<72,111,114,105,122,111,110,116,97,108,32,116,97,98,32,40,72,84,41>>]},{dt,[],[<<85,43,48,48,50,48>>]},{dd,[],[<<83,112,97,99,101>>]},{dt,[],[<<85,43,48,48,65,48>>]},{dd,[],[<<78,111,110,45,98,114,101,97,107,32,115,112,97,99,101>>]},{dt,[],[<<85,43,49,54,56,48>>]},{dd,[],[<<79,103,104,97,109,32,115,112,97,99,101,32,109,97,114,107>>]},{dt,[],[<<85,43,49,56,48,69>>]},{dd,[],[<<77,111,110,103,111,108,105,97,110,32,118,111,119,101,108,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<85,43,50,48,48,48>>]},{dd,[],[<<69,110,32,113,117,97,100>>]},{dt,[],[<<85,43,50,48,48,49>>]},{dd,[],[<<69,109,32,113,117,97,100>>]},{dt,[],[<<85,43,50,48,48,50>>]},{dd,[],[<<69,110,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,51>>]},{dd,[],[<<69,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,52>>]},{dd,[],[<<84,104,114,101,101,45,112,101,114,45,101,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,53>>]},{dd,[],[<<70,111,117,114,45,112,101,114,45,101,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,54>>]},{dd,[],[<<83,105,120,45,112,101,114,45,101,109,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,55>>]},{dd,[],[<<70,105,103,117,114,101,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,56>>]},{dd,[],[<<80,117,110,99,116,117,97,116,105,111,110,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,57>>]},{dd,[],[<<84,104,105,110,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,48,65>>]},{dd,[],[<<72,97,105,114,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,50,70>>]},{dd,[],[<<78,97,114,114,111,119,32,110,111,45,98,114,101,97,107,32,115,112,97,99,101>>]},{dt,[],[<<85,43,50,48,53,70>>]},{dd,[],[<<77,101,100,105,117,109,32,109,97,116,104,101,109,97,116,105,99,97,108,32,115,112,97,99,101>>]},{dt,[],[<<85,43,51,48,48,48>>]},{dd,[],[<<73,100,101,111,103,114,97,112,104,105,99,32,115,112,97,99,101>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,118,101,114,116,105,99,97,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,58>>]},{dl,[],[{dt,[],[<<85,43,48,48,48,65>>]},{dd,[],[<<76,105,110,101,32,102,101,101,100,32,40,76,70,41>>]},{dt,[],[<<85,43,48,48,48,66>>]},{dd,[],[<<86,101,114,116,105,99,97,108,32,116,97,98,32,40,86,84,41>>]},{dt,[],[<<85,43,48,48,48,67>>]},{dd,[],[<<70,111,114,109,32,102,101,101,100,32,40,70,70,41>>]},{dt,[],[<<85,43,48,48,48,68>>]},{dd,[],[<<67,97,114,114,105,97,103,101,32,114,101,116,117,114,110,32,40,67,82,41>>]},{dt,[],[<<85,43,48,48,56,53>>]},{dd,[],[<<78,101,120,116,32,108,105,110,101,32,40,78,69,76,41>>]},{dt,[],[<<85,43,50,48,50,56>>]},{dd,[],[<<76,105,110,101,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<85,43,50,48,50,57>>]},{dd,[],[<<80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114>>]}]},{p,[],[<<73,110,32,56,45,98,105,116,44,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,111,110,108,121,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,32,112,111,105,110,116,115,32,60,32,50,53,54,32,97,114,101,32,114,101,108,101,118,97,110,116,46>>]},{p,[],[{em,[],[<<78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115>>]}]},{a,[{id,<<110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115>>}],[]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,82,32,109,97,116,99,104,101,115,32,97,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,46,32,73,110,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,92,82,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{pre,[],[{code,[],[<<40,63,62,92,114,92,110,124,92,110,124,92,120,48,98,124,92,102,124,92,114,124,92,120,56,53,41>>]}]},{p,[],[<<84,104,105,115,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,97,110,32,34,97,116,111,109,105,99,32,103,114,111,117,112,34,44,32,100,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46>>]},{p,[],[<<84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,103,114,111,117,112,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,32,102,111,108,108,111,119,101,100,32,98,121,32,76,70,44,32,111,114,32,111,110,101,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,115,32,76,70,32,40,108,105,110,101,32,102,101,101,100,44,32,85,43,48,48,48,65,41,44,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,32,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,67,82,32,40,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,85,43,48,48,48,68,41,44,32,111,114,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,46,32,84,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,117,110,105,116,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,115,112,108,105,116,46>>]},{p,[],[<<73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,116,119,111,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,62,32,50,53,53,32,97,114,101,32,97,100,100,101,100,58,32,76,83,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,32,105,115,32,110,111,116,32,110,101,101,100,101,100,32,102,111,114,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46>>]},{p,[],[<<92,82,32,99,97,110,32,98,101,32,114,101,115,116,114,105,99,116,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,40,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,99,111,109,112,108,101,116,101,32,115,101,116,32,111,102,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,41,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<98,115,114,95,97,110,121,99,114,108,102>>]},<<32,101,105,116,104,101,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,46,32,40,66,83,82,32,105,115,32,97,110,32,97,99,114,111,110,121,109,32,102,111,114,32,34,98,97,99,107,115,108,97,115,104,32,82,34,46,41,32,84,104,105,115,32,99,97,110,32,98,101,32,109,97,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,119,104,101,110,32,80,67,82,69,32,105,115,32,98,117,105,108,116,59,32,105,102,32,115,111,44,32,116,104,101,32,111,116,104,101,114,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,114,101,113,117,101,115,116,101,100,32,116,104,114,111,117,103,104,32,111,112,116,105,111,110,32>>,{code,[],[<<98,115,114,95,117,110,105,99,111,100,101>>]},<<46,32,84,104,101,115,101,32,115,101,116,116,105,110,103,115,32,99,97,110,32,97,108,115,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,115,116,97,114,116,105,110,103,32,97,32,112,97,116,116,101,114,110,32,115,116,114,105,110,103,32,119,105,116,104,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,101,113,117,101,110,99,101,115,58>>]},{dl,[],[{dt,[],[<<40,42,66,83,82,95,65,78,89,67,82,76,70,41>>]},{dd,[],[<<67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,111,110,108,121>>]},{dt,[],[<<40,42,66,83,82,95,85,78,73,67,79,68,69,41>>]},{dd,[],[<<65,110,121,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101>>]}]},{p,[],[<<84,104,101,115,101,32,111,118,101,114,114,105,100,101,32,116,104,101,32,100,101,102,97,117,108,116,32,97,110,100,32,116,104,101,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,101,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,44,32,98,117,116,32,116,104,101,121,32,99,97,110,32,116,104,101,109,115,101,108,118,101,115,32,98,101,32,111,118,101,114,114,105,100,100,101,110,32,98,121,32,111,112,116,105,111,110,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,97,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,115,101,116,116,105,110,103,115,44,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,44,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,97,116,32,116,104,101,121,32,109,117,115,116,32,98,101,32,105,110,32,117,112,112,101,114,32,99,97,115,101,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,32,108,97,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,99,97,110,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,97,32,99,104,97,110,103,101,32,111,102,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,59,32,102,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,99,97,110,32,115,116,97,114,116,32,119,105,116,104,58>>]},{pre,[],[{code,[],[<<40,42,65,78,89,41,40,42,66,83,82,95,65,78,89,67,82,76,70,41>>]}]},{p,[],[<<84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,116,104,101,32,40,42,85,84,70,56,41,44,32,40,42,85,84,70,41,44,32,111,114,32,40,42,85,67,80,41,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,115,46,32,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,92,82,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,44,32,97,110,100,32,115,111,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,32,34,82,34,32,98,121,32,100,101,102,97,117,108,116,46>>]},{p,[],[{em,[],[<<85,110,105,99,111,100,101,32,67,104,97,114,97,99,116,101,114,32,80,114,111,112,101,114,116,105,101,115>>]}]},{p,[],[<<84,104,114,101,101,32,109,111,114,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,115,112,101,99,105,102,105,99,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,97,118,97,105,108,97,98,108,101,46,32,87,104,101,110,32,105,110,32,56,45,98,105,116,32,110,111,110,45,85,84,70,45,56,32,109,111,100,101,44,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,101,115,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,60,32,50,53,54,44,32,98,117,116,32,116,104,101,121,32,100,111,32,119,111,114,107,32,105,110,32,116,104,105,115,32,109,111,100,101,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,101,120,116,114,97,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,58>>]},{dl,[],[{dt,[],[<<92,112,123>>,{em,[],[<<120,120>>]},<<125>>]},{dd,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,112,114,111,112,101,114,116,121,32>>,{em,[],[<<120,120>>]}]},{dt,[],[<<92,80,123>>,{em,[],[<<120,120>>]},<<125>>]},{dd,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,112,114,111,112,101,114,116,121,32>>,{em,[],[<<120,120>>]}]},{dt,[],[<<92,88>>]},{dd,[],[<<65,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114>>]}]},{p,[],[<<84,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32>>,{em,[],[<<120,120>>]},<<32,97,98,111,118,101,32,97,114,101,32,108,105,109,105,116,101,100,32,116,111,32,116,104,101,32,85,110,105,99,111,100,101,32,115,99,114,105,112,116,32,110,97,109,101,115,44,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,44,32,34,65,110,121,34,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,40,105,110,99,108,117,100,105,110,103,32,110,101,119,108,105,110,101,41,44,32,97,110,100,32,115,111,109,101,32,115,112,101,99,105,97,108,32,80,67,82,69,32,112,114,111,112,101,114,116,105,101,115,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,46,32,79,116,104,101,114,32,80,101,114,108,32,112,114,111,112,101,114,116,105,101,115,44,32,115,117,99,104,32,97,115,32,34,73,110,77,117,115,105,99,97,108,83,121,109,98,111,108,115,34,44,32,97,114,101,32,99,117,114,114,101,110,116,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,78,111,116,105,99,101,32,116,104,97,116,32,92,80,123,65,110,121,125,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,97,108,119,97,121,115,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46>>]},{p,[],[<<83,101,116,115,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,98,101,108,111,110,103,105,110,103,32,116,111,32,99,101,114,116,97,105,110,32,115,99,114,105,112,116,115,46,32,65,32,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,111,110,101,32,111,102,32,116,104,101,115,101,32,115,101,116,115,32,99,97,110,32,98,101,32,109,97,116,99,104,101,100,32,117,115,105,110,103,32,97,32,115,99,114,105,112,116,32,110,97,109,101,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<92,112,123,71,114,101,101,107,125,32,92,80,123,72,97,110,125>>]}]},{p,[],[<<84,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,97,110,32,105,100,101,110,116,105,102,105,101,100,32,115,99,114,105,112,116,32,97,114,101,32,108,117,109,112,101,100,32,116,111,103,101,116,104,101,114,32,97,115,32,34,67,111,109,109,111,110,34,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,116,104,101,32,99,117,114,114,101,110,116,32,108,105,115,116,32,111,102,32,115,99,114,105,112,116,115,58>>]},{ul,[],[{li,[],[<<65,114,97,98,105,99>>]},{li,[],[<<65,114,109,101,110,105,97,110>>]},{li,[],[<<65,118,101,115,116,97,110>>]},{li,[],[<<66,97,108,105,110,101,115,101>>]},{li,[],[<<66,97,109,117,109>>]},{li,[],[<<66,97,115,115,97,95,86,97,104>>]},{li,[],[<<66,97,116,97,107>>]},{li,[],[<<66,101,110,103,97,108,105>>]},{li,[],[<<66,111,112,111,109,111,102,111>>]},{li,[],[<<66,114,97,105,108,108,101>>]},{li,[],[<<66,117,103,105,110,101,115,101>>]},{li,[],[<<66,117,104,105,100>>]},{li,[],[<<67,97,110,97,100,105,97,110,95,65,98,111,114,105,103,105,110,97,108>>]},{li,[],[<<67,97,114,105,97,110>>]},{li,[],[<<67,97,117,99,97,115,105,97,110,95,65,108,98,97,110,105,97,110>>]},{li,[],[<<67,104,97,107,109,97>>]},{li,[],[<<67,104,97,109>>]},{li,[],[<<67,104,101,114,111,107,101,101>>]},{li,[],[<<67,111,109,109,111,110>>]},{li,[],[<<67,111,112,116,105,99>>]},{li,[],[<<67,117,110,101,105,102,111,114,109>>]},{li,[],[<<67,121,112,114,105,111,116>>]},{li,[],[<<67,121,114,105,108,108,105,99>>]},{li,[],[<<68,101,115,101,114,101,116>>]},{li,[],[<<68,101,118,97,110,97,103,97,114,105>>]},{li,[],[<<68,117,112,108,111,121,97,110>>]},{li,[],[<<69,103,121,112,116,105,97,110,95,72,105,101,114,111,103,108,121,112,104,115>>]},{li,[],[<<69,108,98,97,115,97,110>>]},{li,[],[<<69,116,104,105,111,112,105,99>>]},{li,[],[<<71,101,111,114,103,105,97,110>>]},{li,[],[<<71,108,97,103,111,108,105,116,105,99>>]},{li,[],[<<71,111,116,104,105,99>>]},{li,[],[<<71,114,97,110,116,104,97>>]},{li,[],[<<71,114,101,101,107>>]},{li,[],[<<71,117,106,97,114,97,116,105>>]},{li,[],[<<71,117,114,109,117,107,104,105>>]},{li,[],[<<72,97,110>>]},{li,[],[<<72,97,110,103,117,108>>]},{li,[],[<<72,97,110,117,110,111,111>>]},{li,[],[<<72,101,98,114,101,119>>]},{li,[],[<<72,105,114,97,103,97,110,97>>]},{li,[],[<<73,109,112,101,114,105,97,108,95,65,114,97,109,97,105,99>>]},{li,[],[<<73,110,104,101,114,105,116,101,100>>]},{li,[],[<<73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,104,108,97,118,105>>]},{li,[],[<<73,110,115,99,114,105,112,116,105,111,110,97,108,95,80,97,114,116,104,105,97,110>>]},{li,[],[<<74,97,118,97,110,101,115,101>>]},{li,[],[<<75,97,105,116,104,105>>]},{li,[],[<<75,97,110,110,97,100,97>>]},{li,[],[<<75,97,116,97,107,97,110,97>>]},{li,[],[<<75,97,121,97,104,95,76,105>>]},{li,[],[<<75,104,97,114,111,115,104,116,104,105>>]},{li,[],[<<75,104,109,101,114>>]},{li,[],[<<75,104,111,106,107,105>>]},{li,[],[<<75,104,117,100,97,119,97,100,105>>]},{li,[],[<<76,97,111>>]},{li,[],[<<76,97,116,105,110>>]},{li,[],[<<76,101,112,99,104,97>>]},{li,[],[<<76,105,109,98,117>>]},{li,[],[<<76,105,110,101,97,114,95,65>>]},{li,[],[<<76,105,110,101,97,114,95,66>>]},{li,[],[<<76,105,115,117>>]},{li,[],[<<76,121,99,105,97,110>>]},{li,[],[<<76,121,100,105,97,110>>]},{li,[],[<<77,97,104,97,106,97,110,105>>]},{li,[],[<<77,97,108,97,121,97,108,97,109>>]},{li,[],[<<77,97,110,100,97,105,99>>]},{li,[],[<<77,97,110,105,99,104,97,101,97,110>>]},{li,[],[<<77,101,101,116,101,105,95,77,97,121,101,107>>]},{li,[],[<<77,101,110,100,101,95,75,105,107,97,107,117,105>>]},{li,[],[<<77,101,114,111,105,116,105,99,95,67,117,114,115,105,118,101>>]},{li,[],[<<77,101,114,111,105,116,105,99,95,72,105,101,114,111,103,108,121,112,104,115>>]},{li,[],[<<77,105,97,111>>]},{li,[],[<<77,111,100,105>>]},{li,[],[<<77,111,110,103,111,108,105,97,110>>]},{li,[],[<<77,114,111>>]},{li,[],[<<77,121,97,110,109,97,114>>]},{li,[],[<<78,97,98,97,116,97,101,97,110>>]},{li,[],[<<78,101,119,95,84,97,105,95,76,117,101>>]},{li,[],[<<78,107,111>>]},{li,[],[<<79,103,104,97,109>>]},{li,[],[<<79,108,95,67,104,105,107,105>>]},{li,[],[<<79,108,100,95,73,116,97,108,105,99>>]},{li,[],[<<79,108,100,95,78,111,114,116,104,95,65,114,97,98,105,97,110>>]},{li,[],[<<79,108,100,95,80,101,114,109,105,99>>]},{li,[],[<<79,108,100,95,80,101,114,115,105,97,110>>]},{li,[],[<<79,114,105,121,97>>]},{li,[],[<<79,108,100,95,83,111,117,116,104,95,65,114,97,98,105,97,110>>]},{li,[],[<<79,108,100,95,84,117,114,107,105,99>>]},{li,[],[<<79,115,109,97,110,121,97>>]},{li,[],[<<80,97,104,97,119,104,95,72,109,111,110,103>>]},{li,[],[<<80,97,108,109,121,114,101,110,101>>]},{li,[],[<<80,97,117,95,67,105,110,95,72,97,117>>]},{li,[],[<<80,104,97,103,115,95,80,97>>]},{li,[],[<<80,104,111,101,110,105,99,105,97,110>>]},{li,[],[<<80,115,97,108,116,101,114,95,80,97,104,108,97,118,105>>]},{li,[],[<<82,101,106,97,110,103>>]},{li,[],[<<82,117,110,105,99>>]},{li,[],[<<83,97,109,97,114,105,116,97,110>>]},{li,[],[<<83,97,117,114,97,115,104,116,114,97>>]},{li,[],[<<83,104,97,114,97,100,97>>]},{li,[],[<<83,104,97,118,105,97,110>>]},{li,[],[<<83,105,100,100,104,97,109>>]},{li,[],[<<83,105,110,104,97,108,97>>]},{li,[],[<<83,111,114,97,95,83,111,109,112,101,110,103>>]},{li,[],[<<83,117,110,100,97,110,101,115,101>>]},{li,[],[<<83,121,108,111,116,105,95,78,97,103,114,105>>]},{li,[],[<<83,121,114,105,97,99>>]},{li,[],[<<84,97,103,97,108,111,103>>]},{li,[],[<<84,97,103,98,97,110,119,97>>]},{li,[],[<<84,97,105,95,76,101>>]},{li,[],[<<84,97,105,95,84,104,97,109>>]},{li,[],[<<84,97,105,95,86,105,101,116>>]},{li,[],[<<84,97,107,114,105>>]},{li,[],[<<84,97,109,105,108>>]},{li,[],[<<84,101,108,117,103,117>>]},{li,[],[<<84,104,97,97,110,97>>]},{li,[],[<<84,104,97,105>>]},{li,[],[<<84,105,98,101,116,97,110>>]},{li,[],[<<84,105,102,105,110,97,103,104>>]},{li,[],[<<84,105,114,104,117,116,97>>]},{li,[],[<<85,103,97,114,105,116,105,99>>]},{li,[],[<<86,97,105>>]},{li,[],[<<87,97,114,97,110,103,95,67,105,116,105>>]},{li,[],[<<89,105>>]}]},{p,[],[<<69,97,99,104,32,99,104,97,114,97,99,116,101,114,32,104,97,115,32,101,120,97,99,116,108,121,32,111,110,101,32,85,110,105,99,111,100,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,44,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,32,116,119,111,45,108,101,116,116,101,114,32,97,99,114,111,110,121,109,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,110,101,103,97,116,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,105,110,99,108,117,100,105,110,103,32,97,32,99,105,114,99,117,109,102,108,101,120,32,98,101,116,119,101,101,110,32,116,104,101,32,111,112,101,110,105,110,103,32,98,114,97,99,101,32,97,110,100,32,116,104,101,32,112,114,111,112,101,114,116,121,32,110,97,109,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,112,123,94,76,117,125,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,92,80,123,76,117,125,46>>]},{p,[],[<<73,102,32,111,110,108,121,32,111,110,101,32,108,101,116,116,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,32,92,112,32,111,114,32,92,80,44,32,105,116,32,105,110,99,108,117,100,101,115,32,97,108,108,32,116,104,101,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,105,101,115,32,116,104,97,116,32,115,116,97,114,116,32,119,105,116,104,32,116,104,97,116,32,108,101,116,116,101,114,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,105,110,32,116,104,101,32,97,98,115,101,110,99,101,32,111,102,32,110,101,103,97,116,105,111,110,44,32,116,104,101,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,105,110,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,97,114,101,32,111,112,116,105,111,110,97,108,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,116,119,111,32,101,120,97,109,112,108,101,115,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,58>>]},{pre,[],[{code,[],[<<92,112,123,76,125,10,92,112,76>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,103,101,110,101,114,97,108,32,99,97,116,101,103,111,114,121,32,112,114,111,112,101,114,116,121,32,99,111,100,101,115,32,97,114,101,32,115,117,112,112,111,114,116,101,100,58>>]},{dl,[],[{dt,[],[<<67>>]},{dd,[],[<<79,116,104,101,114>>]},{dt,[],[<<67,99>>]},{dd,[],[<<67,111,110,116,114,111,108>>]},{dt,[],[<<67,102>>]},{dd,[],[<<70,111,114,109,97,116>>]},{dt,[],[<<67,110>>]},{dd,[],[<<85,110,97,115,115,105,103,110,101,100>>]},{dt,[],[<<67,111>>]},{dd,[],[<<80,114,105,118,97,116,101,32,117,115,101>>]},{dt,[],[<<67,115>>]},{dd,[],[<<83,117,114,114,111,103,97,116,101>>]},{dt,[],[<<76>>]},{dd,[],[<<76,101,116,116,101,114>>]},{dt,[],[<<76,108>>]},{dd,[],[<<76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114>>]},{dt,[],[<<76,109>>]},{dd,[],[<<77,111,100,105,102,105,101,114,32,108,101,116,116,101,114>>]},{dt,[],[<<76,111>>]},{dd,[],[<<79,116,104,101,114,32,108,101,116,116,101,114>>]},{dt,[],[<<76,116>>]},{dd,[],[<<84,105,116,108,101,32,99,97,115,101,32,108,101,116,116,101,114>>]},{dt,[],[<<76,117>>]},{dd,[],[<<85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114>>]},{dt,[],[<<77>>]},{dd,[],[<<77,97,114,107>>]},{dt,[],[<<77,99>>]},{dd,[],[<<83,112,97,99,105,110,103,32,109,97,114,107>>]},{dt,[],[<<77,101>>]},{dd,[],[<<69,110,99,108,111,115,105,110,103,32,109,97,114,107>>]},{dt,[],[<<77,110>>]},{dd,[],[<<78,111,110,45,115,112,97,99,105,110,103,32,109,97,114,107>>]},{dt,[],[<<78>>]},{dd,[],[<<78,117,109,98,101,114>>]},{dt,[],[<<78,100>>]},{dd,[],[<<68,101,99,105,109,97,108,32,110,117,109,98,101,114>>]},{dt,[],[<<78,108>>]},{dd,[],[<<76,101,116,116,101,114,32,110,117,109,98,101,114>>]},{dt,[],[<<78,111>>]},{dd,[],[<<79,116,104,101,114,32,110,117,109,98,101,114>>]},{dt,[],[<<80>>]},{dd,[],[<<80,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,99>>]},{dd,[],[<<67,111,110,110,101,99,116,111,114,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,100>>]},{dd,[],[<<68,97,115,104,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,101>>]},{dd,[],[<<67,108,111,115,101,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,102>>]},{dd,[],[<<70,105,110,97,108,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,105>>]},{dd,[],[<<73,110,105,116,105,97,108,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,111>>]},{dd,[],[<<79,116,104,101,114,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<80,115>>]},{dd,[],[<<79,112,101,110,32,112,117,110,99,116,117,97,116,105,111,110>>]},{dt,[],[<<83>>]},{dd,[],[<<83,121,109,98,111,108>>]},{dt,[],[<<83,99>>]},{dd,[],[<<67,117,114,114,101,110,99,121,32,115,121,109,98,111,108>>]},{dt,[],[<<83,107>>]},{dd,[],[<<77,111,100,105,102,105,101,114,32,115,121,109,98,111,108>>]},{dt,[],[<<83,109>>]},{dd,[],[<<77,97,116,104,101,109,97,116,105,99,97,108,32,115,121,109,98,111,108>>]},{dt,[],[<<83,111>>]},{dd,[],[<<79,116,104,101,114,32,115,121,109,98,111,108>>]},{dt,[],[<<90>>]},{dd,[],[<<83,101,112,97,114,97,116,111,114>>]},{dt,[],[<<90,108>>]},{dd,[],[<<76,105,110,101,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<90,112>>]},{dd,[],[<<80,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114>>]},{dt,[],[<<90,115>>]},{dd,[],[<<83,112,97,99,101,32,115,101,112,97,114,97,116,111,114>>]}]},{p,[],[<<84,104,101,32,115,112,101,99,105,97,108,32,112,114,111,112,101,114,116,121,32,76,38,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,73,116,32,109,97,116,99,104,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,76,117,44,32,76,108,44,32,111,114,32,76,116,32,112,114,111,112,101,114,116,121,44,32,116,104,97,116,32,105,115,44,32,97,32,108,101,116,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,99,108,97,115,115,105,102,105,101,100,32,97,115,32,97,32,109,111,100,105,102,105,101,114,32,111,114,32,34,111,116,104,101,114,34,46>>]},{p,[],[<<84,104,101,32,67,115,32,40,83,117,114,114,111,103,97,116,101,41,32,112,114,111,112,101,114,116,121,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,85,43,68,56,48,48,32,116,111,32,85,43,68,70,70,70,46,32,83,117,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,118,97,108,105,100,32,105,110,32,85,110,105,99,111,100,101,32,115,116,114,105,110,103,115,32,97,110,100,32,115,111,32,99,97,110,110,111,116,32,98,101,32,116,101,115,116,101,100,32,98,121,32,80,67,82,69,46,32,80,101,114,108,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,67,115,32,112,114,111,112,101,114,116,121,46>>]},{p,[],[<<84,104,101,32,108,111,110,103,32,115,121,110,111,110,121,109,115,32,102,111,114,32,112,114,111,112,101,114,116,121,32,110,97,109,101,115,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,101,114,108,32,40,115,117,99,104,32,97,115,32,92,112,123,76,101,116,116,101,114,125,41,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,80,67,82,69,46,32,73,116,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,116,111,32,112,114,101,102,105,120,32,97,110,121,32,111,102,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,32,119,105,116,104,32,34,73,115,34,46>>]},{p,[],[<<78,111,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,32,104,97,115,32,116,104,101,32,67,110,32,40,117,110,97,115,115,105,103,110,101,100,41,32,112,114,111,112,101,114,116,121,46,32,84,104,105,115,32,112,114,111,112,101,114,116,121,32,105,115,32,105,110,115,116,101,97,100,32,97,115,115,117,109,101,100,32,102,111,114,32,97,110,121,32,99,111,100,101,32,112,111,105,110,116,32,116,104,97,116,32,105,115,32,110,111,116,32,105,110,32,116,104,101,32,85,110,105,99,111,100,101,32,116,97,98,108,101,46>>]},{p,[],[<<83,112,101,99,105,102,121,105,110,103,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,115,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,92,112,123,76,117,125,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,108,121,32,117,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115,46,32,84,104,105,115,32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,99,117,114,114,101,110,116,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,46>>]},{p,[],[<<77,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,105,115,32,110,111,116,32,102,97,115,116,44,32,97,115,32,80,67,82,69,32,109,117,115,116,32,100,111,32,97,32,109,117,108,116,105,115,116,97,103,101,32,116,97,98,108,101,32,108,111,111,107,117,112,32,116,111,32,102,105,110,100,32,97,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,121,46,32,84,104,97,116,32,105,115,32,119,104,121,32,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32,92,100,32,97,110,100,32,92,119,32,100,111,32,110,111,116,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,105,110,32,80,67,82,69,32,98,121,32,100,101,102,97,117,108,116,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,109,97,107,101,32,116,104,101,109,32,100,111,32,115,111,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,111,114,32,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,40,42,85,67,80,41,46>>]},{p,[],[{em,[],[<<69,120,116,101,110,100,101,100,32,71,114,97,112,104,101,109,101,32,67,108,117,115,116,101,114,115>>]}]},{p,[],[<<84,104,101,32,92,88,32,101,115,99,97,112,101,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,102,111,114,109,32,97,110,32,34,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,34,44,32,97,110,100,32,116,114,101,97,116,115,32,116,104,101,32,115,101,113,117,101,110,99,101,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,40,115,101,101,32,98,101,108,111,119,41,46,32,85,112,32,116,111,32,97,110,100,32,105,110,99,108,117,100,105,110,103,32,114,101,108,101,97,115,101,32,56,46,51,49,44,32,80,67,82,69,32,109,97,116,99,104,101,100,32,97,110,32,101,97,114,108,105,101,114,44,32,115,105,109,112,108,101,114,32,100,101,102,105,110,105,116,105,111,110,32,116,104,97,116,32,119,97,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<40,63,62,92,80,77,92,112,77,42,41>>]},<<46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,100,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,111,117,116,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,44,32,102,111,108,108,111,119,101,100,32,98,121,32,122,101,114,111,32,111,114,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,46,32,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,114,101,32,116,121,112,105,99,97,108,108,121,32,110,111,110,45,115,112,97,99,105,110,103,32,97,99,99,101,110,116,115,32,116,104,97,116,32,97,102,102,101,99,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,99,104,97,114,97,99,116,101,114,46>>]},{p,[],[<<84,104,105,115,32,115,105,109,112,108,101,32,100,101,102,105,110,105,116,105,111,110,32,119,97,115,32,101,120,116,101,110,100,101,100,32,105,110,32,85,110,105,99,111,100,101,32,116,111,32,105,110,99,108,117,100,101,32,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,107,105,110,100,115,32,111,102,32,99,111,109,112,111,115,105,116,101,32,99,104,97,114,97,99,116,101,114,32,98,121,32,103,105,118,105,110,103,32,101,97,99,104,32,99,104,97,114,97,99,116,101,114,32,97,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,44,32,97,110,100,32,99,114,101,97,116,105,110,103,32,114,117,108,101,115,32,116,104,97,116,32,117,115,101,32,116,104,101,115,101,32,112,114,111,112,101,114,116,105,101,115,32,116,111,32,100,101,102,105,110,101,32,116,104,101,32,98,111,117,110,100,97,114,105,101,115,32,111,102,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,46,32,73,110,32,80,67,82,69,32,114,101,108,101,97,115,101,115,32,108,97,116,101,114,32,116,104,97,110,32,56,46,51,49,44,32,92,88,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,32,116,104,101,115,101,32,99,108,117,115,116,101,114,115,46>>]},{p,[],[<<92,88,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,110,32,105,116,32,100,101,99,105,100,101,115,32,119,104,101,116,104,101,114,32,116,111,32,97,100,100,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,117,108,101,115,32,102,111,114,32,101,110,100,105,110,103,32,97,32,99,108,117,115,116,101,114,58>>]},{ol,[],[{li,[],[{p,[],[<<69,110,100,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,101,110,100,32,98,101,116,119,101,101,110,32,67,82,32,97,110,100,32,76,70,59,32,111,116,104,101,114,119,105,115,101,32,101,110,100,32,97,102,116,101,114,32,97,110,121,32,99,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,98,114,101,97,107,32,72,97,110,103,117,108,32,40,97,32,75,111,114,101,97,110,32,115,99,114,105,112,116,41,32,115,121,108,108,97,98,108,101,32,115,101,113,117,101,110,99,101,115,46,32,72,97,110,103,117,108,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,111,102,32,102,105,118,101,32,116,121,112,101,115,58,32,76,44,32,86,44,32,84,44,32,76,86,44,32,97,110,100,32,76,86,84,46,32,65,110,32,76,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,76,44,32,86,44,32,76,86,44,32,111,114,32,76,86,84,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,32,111,114,32,86,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,86,32,111,114,32,84,32,99,104,97,114,97,99,116,101,114,46,32,65,110,32,76,86,84,32,111,114,32,84,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,102,111,108,108,111,119,101,100,32,111,110,108,121,32,98,121,32,97,32,84,32,99,104,97,114,97,99,116,101,114,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,101,110,100,32,98,101,102,111,114,101,32,101,120,116,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,32,111,114,32,115,112,97,99,105,110,103,32,109,97,114,107,115,46,32,67,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,34,109,97,114,107,34,32,112,114,111,112,101,114,116,121,32,97,108,119,97,121,115,32,104,97,118,101,32,116,104,101,32,34,101,120,116,101,110,100,34,32,103,114,97,112,104,101,109,101,32,98,114,101,97,107,105,110,103,32,112,114,111,112,101,114,116,121,46>>]}]},{li,[],[{p,[],[<<68,111,32,110,111,116,32,101,110,100,32,97,102,116,101,114,32,112,114,101,112,101,110,100,32,99,104,97,114,97,99,116,101,114,115,46>>]}]},{li,[],[{p,[],[<<79,116,104,101,114,119,105,115,101,44,32,101,110,100,32,116,104,101,32,99,108,117,115,116,101,114,46>>]}]}]},{p,[],[{em,[],[<<80,67,82,69,32,65,100,100,105,116,105,111,110,97,108,32,80,114,111,112,101,114,116,105,101,115>>]}]},{p,[],[<<73,110,32,97,100,100,105,116,105,111,110,32,116,111,32,116,104,101,32,115,116,97,110,100,97,114,100,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,100,101,115,99,114,105,98,101,100,32,101,97,114,108,105,101,114,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,102,111,117,114,32,109,111,114,101,32,116,104,97,116,32,109,97,107,101,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,99,111,110,118,101,114,116,32,116,114,97,100,105,116,105,111,110,97,108,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,32,92,119,32,97,110,100,32,92,115,32,116,111,32,117,115,101,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,46,32,80,67,82,69,32,117,115,101,115,32,116,104,101,115,101,32,110,111,110,45,115,116,97,110,100,97,114,100,44,32,110,111,110,45,80,101,114,108,32,112,114,111,112,101,114,116,105,101,115,32,105,110,116,101,114,110,97,108,108,121,32,119,104,101,110,32,116,104,101,32>>,{code,[],[<<117,99,112>>]},<<32,111,112,116,105,111,110,32,105,115,32,112,97,115,115,101,100,46,32,72,111,119,101,118,101,114,44,32,116,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,101,120,112,108,105,99,105,116,108,121,46,32,84,104,101,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<88,97,110>>]},{dd,[],[{p,[],[<<65,110,121,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,32,112,114,111,112,101,114,116,121,46>>]}]},{dt,[],[<<88,112,115>>]},{dd,[],[{p,[],[<<65,110,121,32,80,111,115,105,120,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,32,102,101,101,100,44,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46>>]}]},{dt,[],[<<88,115,112>>]},{dd,[],[{p,[],[<<65,110,121,32,80,101,114,108,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,44,32,101,120,99,101,112,116,32,116,104,97,116,32,118,101,114,116,105,99,97,108,32,116,97,98,32,105,115,32,101,120,99,108,117,100,101,100,46>>]}]},{dt,[],[<<88,119,100>>]},{dd,[],[{p,[],[<<65,110,121,32,80,101,114,108,32,34,119,111,114,100,34,32,99,104,97,114,97,99,116,101,114,46,32,77,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101,46>>]}]}]},{p,[],[<<80,101,114,108,32,97,110,100,32,80,79,83,73,88,32,115,112,97,99,101,32,97,114,101,32,110,111,119,32,116,104,101,32,115,97,109,101,46,32,80,101,114,108,32,97,100,100,101,100,32,86,84,32,116,111,32,105,116,115,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,32,115,101,116,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,32,97,110,100,32,80,67,82,69,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46>>]},{p,[],[<<88,97,110,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,101,105,116,104,101,114,32,116,104,101,32,76,32,40,108,101,116,116,101,114,41,32,111,114,32,116,104,101,32,78,32,40,110,117,109,98,101,114,41,32,112,114,111,112,101,114,116,121,46,32,88,112,115,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,97,98,44,32,108,105,110,101,102,101,101,100,44,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,109,32,102,101,101,100,44,32,111,114,32,99,97,114,114,105,97,103,101,32,114,101,116,117,114,110,44,32,97,110,100,32,97,110,121,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,104,97,115,32,116,104,101,32,90,32,40,115,101,112,97,114,97,116,111,114,41,32,112,114,111,112,101,114,116,121,46,32,88,115,112,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,88,112,115,59,32,105,116,32,117,115,101,100,32,116,111,32,101,120,99,108,117,100,101,32,118,101,114,116,105,99,97,108,32,116,97,98,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,44,32,98,117,116,32,80,101,114,108,32,99,104,97,110,103,101,100,44,32,97,110,100,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,88,119,100,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,88,97,110,44,32,112,108,117,115,32,117,110,100,101,114,115,99,111,114,101,46>>]},{p,[],[<<84,104,101,114,101,32,105,115,32,97,110,111,116,104,101,114,32,110,111,110,45,115,116,97,110,100,97,114,100,32,112,114,111,112,101,114,116,121,44,32,88,117,99,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,32,78,97,109,101,32,105,110,32,67,43,43,32,97,110,100,32,111,116,104,101,114,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,115,46,32,84,104,101,115,101,32,97,114,101,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,36,44,32,64,44,32,96,32,40,103,114,97,118,101,32,97,99,99,101,110,116,41,44,32,97,110,100,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,111,100,101,32,112,111,105,110,116,115,32,62,61,32,85,43,48,48,65,48,44,32,101,120,99,101,112,116,32,102,111,114,32,116,104,101,32,115,117,114,114,111,103,97,116,101,115,32,85,43,68,56,48,48,32,116,111,32,85,43,68,70,70,70,46,32,78,111,116,105,99,101,32,116,104,97,116,32,109,111,115,116,32,98,97,115,101,32,40,65,83,67,73,73,41,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,101,120,99,108,117,100,101,100,46,32,40,85,110,105,118,101,114,115,97,108,32,67,104,97,114,97,99,116,101,114,32,78,97,109,101,115,32,97,114,101,32,111,102,32,116,104,101,32,102,111,114,109,32,92,117,72,72,72,72,32,111,114,32,92,85,72,72,72,72,72,72,72,72,44,32,119,104,101,114,101,32,72,32,105,115,32,97,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,32,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,88,117,99,32,112,114,111,112,101,114,116,121,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,115,101,32,115,101,113,117,101,110,99,101,115,32,98,117,116,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,116,104,101,121,32,114,101,112,114,101,115,101,110,116,46,41>>]},{p,[],[{em,[],[<<82,101,115,101,116,116,105,110,103,32,116,104,101,32,77,97,116,99,104,32,83,116,97,114,116>>]}]},{p,[],[<<84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,75,32,99,97,117,115,101,115,32,97,110,121,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,115,32,110,111,116,32,116,111,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,116,104,101,32,102,105,110,97,108,32,109,97,116,99,104,101,100,32,115,101,113,117,101,110,99,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,98,117,116,32,114,101,112,111,114,116,115,32,116,104,97,116,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,34,98,97,114,34,58>>]},{pre,[],[{code,[],[<<102,111,111,92,75,98,97,114>>]}]},{p,[],[<<84,104,105,115,32,102,101,97,116,117,114,101,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,46,32,72,111,119,101,118,101,114,44,32,105,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,98,101,102,111,114,101,32,116,104,101,32,114,101,97,108,32,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,111,102,32,102,105,120,101,100,32,108,101,110,103,116,104,44,32,97,115,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,100,111,46,32,84,104,101,32,117,115,101,32,111,102,32,92,75,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,102,101,114,101,32,119,105,116,104,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,98,97,114,34,44,32,116,104,101,32,102,105,114,115,116,32,115,117,98,115,116,114,105,110,103,32,105,115,32,115,116,105,108,108,32,115,101,116,32,116,111,32,34,102,111,111,34,58>>]},{pre,[],[{code,[],[<<40,102,111,111,41,92,75,98,97,114>>]}]},{p,[],[<<80,101,114,108,32,100,111,99,117,109,101,110,116,115,32,116,104,97,116,32,116,104,101,32,117,115,101,32,111,102,32,92,75,32,119,105,116,104,105,110,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,34,110,111,116,32,119,101,108,108,32,100,101,102,105,110,101,100,34,46,32,73,110,32,80,67,82,69,44,32,92,75,32,105,115,32,97,99,116,101,100,32,117,112,111,110,32,119,104,101,110,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,44,32,98,117,116,32,105,115,32,105,103,110,111,114,101,100,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,78,111,116,101,32,116,104,97,116,32,119,104,101,110,32,97,32,112,97,116,116,101,114,110,32,115,117,99,104,32,97,115,32,40,63,61,97,98,92,75,41,32,109,97,116,99,104,101,115,44,32,116,104,101,32,114,101,112,111,114,116,101,100,32,115,116,97,114,116,32,111,102,32,116,104,101,32,109,97,116,99,104,32,99,97,110,32,98,101,32,103,114,101,97,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,109,97,116,99,104,46>>]},{p,[],[{em,[],[<<83,105,109,112,108,101,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<84,104,101,32,102,105,110,97,108,32,117,115,101,32,111,102,32,98,97,99,107,115,108,97,115,104,32,105,115,32,102,111,114,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,112,101,99,105,102,105,101,115,32,97,32,99,111,110,100,105,116,105,111,110,32,116,104,97,116,32,109,117,115,116,32,98,101,32,109,101,116,32,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,112,111,105,110,116,32,105,110,32,97,32,109,97,116,99,104,44,32,119,105,116,104,111,117,116,32,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,117,115,101,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,109,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,98,97,99,107,115,108,97,115,104,101,100,32,97,115,115,101,114,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[<<92,98>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46>>]},{dt,[],[<<92,66>>]},{dd,[],[<<77,97,116,99,104,101,115,32,119,104,101,110,32,110,111,116,32,97,116,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,46>>]},{dt,[],[<<92,65>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46>>]},{dt,[],[<<92,90>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46>>]},{dt,[],[<<92,122>>]},{dd,[],[<<77,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46>>]},{dt,[],[<<92,71>>]},{dd,[],[<<77,97,116,99,104,101,115,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46>>]}]},{p,[],[<<73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,92,98,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,73,102,32,97,110,121,32,111,116,104,101,114,32,111,102,32,116,104,101,115,101,32,97,115,115,101,114,116,105,111,110,115,32,97,112,112,101,97,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,98,121,32,100,101,102,97,117,108,116,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,92,66,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,32,66,41,46>>]},{p,[],[<<65,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,105,115,32,97,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,104,101,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,99,104,97,114,97,99,116,101,114,32,97,110,100,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,104,97,114,97,99,116,101,114,32,100,111,32,110,111,116,32,98,111,116,104,32,109,97,116,99,104,32,92,119,32,111,114,32,92,87,32,40,116,104,97,116,32,105,115,44,32,111,110,101,32,109,97,116,99,104,101,115,32,92,119,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,109,97,116,99,104,101,115,32,92,87,41,44,32,111,114,32,116,104,101,32,115,116,97,114,116,32,111,114,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,102,32,116,104,101,32,102,105,114,115,116,32,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,109,97,116,99,104,101,115,32,92,119,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,73,110,32,85,84,70,32,109,111,100,101,44,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,92,119,32,97,110,100,32,92,87,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,100,111,110,101,44,32,105,116,32,97,108,115,111,32,97,102,102,101,99,116,115,32,92,98,32,97,110,100,32,92,66,46,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,111,32,110,111,116,32,104,97,118,101,32,97,32,115,101,112,97,114,97,116,101,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,111,114,32,34,101,110,100,32,111,102,32,119,111,114,100,34,32,109,101,116,97,115,101,113,117,101,110,99,101,46,32,72,111,119,101,118,101,114,44,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,92,98,32,110,111,114,109,97,108,108,121,32,100,101,116,101,114,109,105,110,101,115,32,119,104,105,99,104,32,105,116,32,105,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,114,97,103,109,101,110,116,32,92,98,97,32,109,97,116,99,104,101,115,32,34,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,119,111,114,100,46>>]},{p,[],[<<84,104,101,32,92,65,44,32,92,90,44,32,97,110,100,32,92,122,32,97,115,115,101,114,116,105,111,110,115,32,100,105,102,102,101,114,32,102,114,111,109,32,116,104,101,32,116,114,97,100,105,116,105,111,110,97,108,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,40,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,32,105,110,32,116,104,97,116,32,116,104,101,121,32,111,110,108,121,32,101,118,101,114,32,109,97,116,99,104,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,97,110,100,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,97,116,101,118,101,114,32,111,112,116,105,111,110,115,32,97,114,101,32,115,101,116,46,32,84,104,117,115,44,32,116,104,101,121,32,97,114,101,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,46,32,84,104,101,115,101,32,116,104,114,101,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,32,111,112,116,105,111,110,115,32>>,{code,[],[<<110,111,116,98,111,108>>]},<<32,111,114,32>>,{code,[],[<<110,111,116,101,111,108>>]},<<44,32,119,104,105,99,104,32,97,102,102,101,99,116,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,105,115,32,110,111,110,45,122,101,114,111,44,32,105,110,100,105,99,97,116,105,110,103,32,116,104,97,116,32,109,97,116,99,104,105,110,103,32,105,115,32,116,111,32,115,116,97,114,116,32,97,116,32,97,32,112,111,105,110,116,32,111,116,104,101,114,32,116,104,97,110,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,92,65,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,46,32,84,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32,92,90,32,97,110,100,32,92,122,32,105,115,32,116,104,97,116,32,92,90,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,97,110,100,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,44,32,119,104,105,108,101,32,92,122,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,46>>]},{p,[],[<<84,104,101,32,92,71,32,97,115,115,101,114,116,105,111,110,32,105,115,32,116,114,117,101,32,111,110,108,121,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,105,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,112,111,105,110,116,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<46,32,73,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,92,65,32,119,104,101,110,32,116,104,101,32,118,97,108,117,101,32,111,102,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,105,115,32,110,111,110,45,122,101,114,111,46,32,66,121,32,99,97,108,108,105,110,103,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,109,117,108,116,105,112,108,101,32,116,105,109,101,115,32,119,105,116,104,32,97,112,112,114,111,112,114,105,97,116,101,32,97,114,103,117,109,101,110,116,115,44,32,121,111,117,32,99,97,110,32,109,105,109,105,99,32,116,104,101,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,103>>]},<<44,32,97,110,100,32,105,116,32,105,115,32,105,110,32,116,104,105,115,32,107,105,110,100,32,111,102,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,119,104,101,114,101,32,92,71,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46>>]},{p,[],[<<78,111,116,105,99,101,44,32,104,111,119,101,118,101,114,44,32,116,104,97,116,32,116,104,101,32,80,67,82,69,32,105,110,116,101,114,112,114,101,116,97,116,105,111,110,32,111,102,32,92,71,44,32,97,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,44,32,105,115,32,115,117,98,116,108,121,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32,80,101,114,108,44,32,119,104,105,99,104,32,100,101,102,105,110,101,115,32,105,116,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,112,114,101,118,105,111,117,115,32,109,97,116,99,104,46,32,73,110,32,80,101,114,108,44,32,116,104,101,115,101,32,99,97,110,32,98,101,32,100,105,102,102,101,114,101,110,116,32,119,104,101,110,32,116,104,101,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,32,115,116,114,105,110,103,32,119,97,115,32,101,109,112,116,121,46,32,65,115,32,80,67,82,69,32,100,111,101,115,32,111,110,108,121,32,111,110,101,32,109,97,116,99,104,32,97,116,32,97,32,116,105,109,101,44,32,105,116,32,99,97,110,110,111,116,32,114,101,112,114,111,100,117,99,101,32,116,104,105,115,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<73,102,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,98,101,103,105,110,32,119,105,116,104,32,92,71,44,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,110,99,104,111,114,101,100,32,116,111,32,116,104,101,32,115,116,97,114,116,105,110,103,32,109,97,116,99,104,32,112,111,115,105,116,105,111,110,44,32,97,110,100,32,116,104,101,32,34,97,110,99,104,111,114,101,100,34,32,102,108,97,103,32,105,115,32,115,101,116,32,105,110,32,116,104,101,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{a,[{id,<<115,101,99,116,52>>}],[]},{h2,[],[<<67,105,114,99,117,109,102,108,101,120,32,97,110,100,32,68,111,108,108,97,114>>]},{p,[],[<<84,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,122,101,114,111,45,119,105,100,116,104,32,97,115,115,101,114,116,105,111,110,115,46,32,84,104,97,116,32,105,115,44,32,116,104,101,121,32,116,101,115,116,32,102,111,114,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,111,110,100,105,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,32,119,105,116,104,111,117,116,32,99,111,110,115,117,109,105,110,103,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,105,110,32,116,104,101,32,100,101,102,97,117,108,116,32,109,97,116,99,104,105,110,103,32,109,111,100,101,44,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,102,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,105,115,32,110,111,110,45,122,101,114,111,44,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,110,101,118,101,114,32,109,97,116,99,104,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,117,110,115,101,116,46,32,73,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,99,105,114,99,117,109,102,108,101,120,32,104,97,115,32,97,110,32,101,110,116,105,114,101,108,121,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,40,115,101,101,32,98,101,108,111,119,41,46>>]},{p,[],[<<67,105,114,99,117,109,102,108,101,120,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,116,104,105,110,103,32,105,110,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,101,118,101,114,32,116,111,32,109,97,116,99,104,32,116,104,97,116,32,98,114,97,110,99,104,46,32,73,102,32,97,108,108,32,112,111,115,115,105,98,108,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,115,116,97,114,116,32,119,105,116,104,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,105,116,32,105,115,32,115,97,105,100,32,116,111,32,98,101,32,97,110,32,34,97,110,99,104,111,114,101,100,34,32,112,97,116,116,101,114,110,46,32,40,84,104,101,114,101,32,97,114,101,32,97,108,115,111,32,111,116,104,101,114,32,99,111,110,115,116,114,117,99,116,115,32,116,104,97,116,32,99,97,110,32,99,97,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,111,32,98,101,32,97,110,99,104,111,114,101,100,46,41>>]},{p,[],[<<84,104,101,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,32,105,115,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,32,111,110,108,121,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,121,32,100,101,102,97,117,108,116,41,46,32,78,111,116,105,99,101,32,104,111,119,101,118,101,114,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,110,101,119,108,105,110,101,46,32,68,111,108,108,97,114,32,110,101,101,100,115,32,110,111,116,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,102,32,115,111,109,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,118,111,108,118,101,100,44,32,98,117,116,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,105,110,32,97,110,121,32,98,114,97,110,99,104,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,46,32,68,111,108,108,97,114,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46>>]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,100,111,108,108,97,114,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]},<<32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,92,90,32,97,115,115,101,114,116,105,111,110,46>>]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,99,104,97,110,103,101,100,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46,32,87,104,101,110,32,116,104,105,115,32,105,115,32,116,104,101,32,99,97,115,101,44,32,97,32,99,105,114,99,117,109,102,108,101,120,32,109,97,116,99,104,101,115,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,32,97,110,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,73,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,102,116,101,114,32,97,32,110,101,119,108,105,110,101,32,116,104,97,116,32,101,110,100,115,32,116,104,101,32,115,116,114,105,110,103,46,32,65,32,100,111,108,108,97,114,32,109,97,116,99,104,101,115,32,98,101,102,111,114,101,32,97,110,121,32,110,101,119,108,105,110,101,115,32,105,110,32,116,104,101,32,115,116,114,105,110,103,44,32,97,110,100,32,97,116,32,116,104,101,32,118,101,114,121,32,101,110,100,44,32,119,104,101,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46,32,87,104,101,110,32,110,101,119,108,105,110,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,44,32,105,115,111,108,97,116,101,100,32,67,82,32,97,110,100,32,76,70,32,99,104,97,114,97,99,116,101,114,115,32,100,111,32,110,111,116,32,105,110,100,105,99,97,116,101,32,110,101,119,108,105,110,101,115,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,47,94,97,98,99,36,47,32,109,97,116,99,104,101,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,100,101,102,92,110,97,98,99,34,32,40,119,104,101,114,101,32,92,110,32,114,101,112,114,101,115,101,110,116,115,32,97,32,110,101,119,108,105,110,101,41,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,98,117,116,32,110,111,116,32,111,116,104,101,114,119,105,115,101,46,32,83,111,44,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,97,110,99,104,111,114,101,100,32,105,110,32,115,105,110,103,108,101,45,108,105,110,101,32,109,111,100,101,32,98,101,99,97,117,115,101,32,97,108,108,32,98,114,97,110,99,104,101,115,32,115,116,97,114,116,32,119,105,116,104,32,94,32,97,114,101,32,110,111,116,32,97,110,99,104,111,114,101,100,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,44,32,97,110,100,32,97,32,109,97,116,99,104,32,102,111,114,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,112,111,115,115,105,98,108,101,32,119,104,101,110,32,97,114,103,117,109,101,110,116,32>>,{em,[],[<<115,116,97,114,116,111,102,102,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,105,115,32,110,111,110,45,122,101,114,111,46,32,79,112,116,105,111,110,32>>,{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]},<<32,105,115,32,105,103,110,111,114,101,100,32,105,102,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,115,101,113,117,101,110,99,101,115,32,92,65,44,32,92,90,44,32,97,110,100,32,92,122,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,116,97,114,116,32,97,110,100,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,110,32,98,111,116,104,32,109,111,100,101,115,46,32,73,102,32,97,108,108,32,98,114,97,110,99,104,101,115,32,111,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,32,119,105,116,104,32,92,65,44,32,105,116,32,105,115,32,97,108,119,97,121,115,32,97,110,99,104,111,114,101,100,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,101,116,46>>]},{a,[{id,<<115,101,99,116,53>>}],[]},{h2,[],[<<70,117,108,108,32,83,116,111,112,32,40,80,101,114,105,111,100,44,32,68,111,116,41,32,97,110,100,32,92,78>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,101,120,99,101,112,116,32,40,98,121,32,100,101,102,97,117,108,116,41,32,97,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46>>]},{p,[],[<<87,104,101,110,32,97,32,108,105,110,101,32,101,110,100,105,110,103,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,100,111,116,32,110,101,118,101,114,32,109,97,116,99,104,101,115,32,116,104,97,116,32,99,104,97,114,97,99,116,101,114,46,32,87,104,101,110,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,117,115,101,100,44,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,32,105,102,32,105,116,32,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,101,100,32,98,121,32,76,70,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,105,115,111,108,97,116,101,100,32,67,82,115,32,97,110,100,32,76,70,115,41,46,32,87,104,101,110,32,97,110,121,32,85,110,105,99,111,100,101,32,108,105,110,101,32,101,110,100,105,110,103,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,44,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,67,82,44,32,76,70,44,32,111,114,32,97,110,121,32,111,102,32,116,104,101,32,111,116,104,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,100,111,116,32,114,101,103,97,114,100,105,110,103,32,110,101,119,108,105,110,101,115,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,105,115,32,115,101,116,44,32,97,32,100,111,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,44,32,119,105,116,104,111,117,116,32,101,120,99,101,112,116,105,111,110,46,32,73,102,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,67,82,76,70,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,116,97,107,101,115,32,116,119,111,32,100,111,116,115,32,116,111,32,109,97,116,99,104,32,105,116,46>>]},{p,[],[<<84,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,100,111,116,32,105,115,32,101,110,116,105,114,101,108,121,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,105,114,99,117,109,102,108,101,120,32,97,110,100,32,100,111,108,108,97,114,44,32,116,104,101,32,111,110,108,121,32,114,101,108,97,116,105,111,110,115,104,105,112,32,105,115,32,116,104,97,116,32,98,111,116,104,32,105,110,118,111,108,118,101,32,110,101,119,108,105,110,101,115,46,32,68,111,116,32,104,97,115,32,110,111,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46>>]},{p,[],[<<84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,78,32,98,101,104,97,118,101,115,32,108,105,107,101,32,97,32,100,111,116,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,97,102,102,101,99,116,101,100,32,98,121,32,111,112,116,105,111,110,32>>,{code,[],[<<80,67,82,69,95,68,79,84,65,76,76>>]},<<46,32,84,104,97,116,32,105,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,101,120,99,101,112,116,32,111,110,101,32,116,104,97,116,32,115,105,103,110,105,102,105,101,115,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,46,32,80,101,114,108,32,97,108,115,111,32,117,115,101,115,32,92,78,32,116,111,32,109,97,116,99,104,32,99,104,97,114,97,99,116,101,114,115,32,98,121,32,110,97,109,101,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,105,115,46>>]},{a,[{id,<<115,101,99,116,54>>}],[]},{h2,[],[<<77,97,116,99,104,105,110,103,32,97,32,83,105,110,103,108,101,32,68,97,116,97,32,85,110,105,116>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,67,32,109,97,116,99,104,101,115,32,97,110,121,32,100,97,116,97,32,117,110,105,116,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,97,32,85,84,70,32,109,111,100,101,32,105,115,32,115,101,116,46,32,79,110,101,32,100,97,116,97,32,117,110,105,116,32,105,115,32,111,110,101,32,98,121,116,101,46,32,85,110,108,105,107,101,32,97,32,100,111,116,44,32,92,67,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,108,105,110,101,45,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,102,101,97,116,117,114,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,80,101,114,108,32,116,111,32,109,97,116,99,104,32,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,105,110,32,85,84,70,45,56,32,109,111,100,101,44,32,98,117,116,32,105,116,32,105,115,32,117,110,99,108,101,97,114,32,104,111,119,32,105,116,32,99,97,110,32,117,115,101,102,117,108,108,121,32,98,101,32,117,115,101,100,46,32,65,115,32,92,67,32,98,114,101,97,107,115,32,117,112,32,99,104,97,114,97,99,116,101,114,115,32,105,110,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,32,117,110,105,116,115,44,32,109,97,116,99,104,105,110,103,32,111,110,101,32,117,110,105,116,32,119,105,116,104,32,92,67,32,105,110,32,97,32,85,84,70,32,109,111,100,101,32,109,101,97,110,115,32,116,104,97,116,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,32,99,97,110,32,115,116,97,114,116,32,119,105,116,104,32,97,32,109,97,108,102,111,114,109,101,100,32,85,84,70,32,99,104,97,114,97,99,116,101,114,46,32,84,104,105,115,32,104,97,115,32,117,110,100,101,102,105,110,101,100,32,114,101,115,117,108,116,115,44,32,97,115,32,80,67,82,69,32,97,115,115,117,109,101,115,32,116,104,97,116,32,105,116,32,100,101,97,108,115,32,119,105,116,104,32,118,97,108,105,100,32,85,84,70,32,115,116,114,105,110,103,115,46>>]},{p,[],[<<80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,92,67,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,40,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,41,32,105,110,32,97,32,85,84,70,32,109,111,100,101,44,32,97,115,32,116,104,105,115,32,119,111,117,108,100,32,109,97,107,101,32,105,116,32,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,111,111,107,98,101,104,105,110,100,46>>]},{p,[],[<<84,104,101,32,92,67,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,105,115,32,98,101,115,116,32,97,118,111,105,100,101,100,46,32,72,111,119,101,118,101,114,44,32,111,110,101,32,119,97,121,32,111,102,32,117,115,105,110,103,32,105,116,32,116,104,97,116,32,97,118,111,105,100,115,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,108,102,111,114,109,101,100,32,85,84,70,32,99,104,97,114,97,99,116,101,114,115,32,105,115,32,116,111,32,117,115,101,32,97,32,108,111,111,107,97,104,101,97,100,32,116,111,32,99,104,101,99,107,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,44,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<40,63,124,32,40,63,61,91,92,120,48,48,45,92,120,55,102,93,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,56,48,45,92,120,123,55,102,102,125,93,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,56,48,48,125,45,92,120,123,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,32,124,10,32,32,32,32,40,63,61,91,92,120,123,49,48,48,48,48,125,45,92,120,123,49,102,102,102,102,102,125,93,41,40,92,67,41,40,92,67,41,40,92,67,41,40,92,67,41,41>>]}]},{p,[],[<<65,32,103,114,111,117,112,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,40,63,124,32,114,101,115,101,116,115,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,110,117,109,98,101,114,115,32,105,110,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]},<<41,46,32,84,104,101,32,97,115,115,101,114,116,105,111,110,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,32,99,104,101,99,107,32,116,104,101,32,110,101,120,116,32,85,84,70,45,56,32,99,104,97,114,97,99,116,101,114,32,102,111,114,32,118,97,108,117,101,115,32,119,104,111,115,101,32,101,110,99,111,100,105,110,103,32,117,115,101,115,32,49,44,32,50,44,32,51,44,32,111,114,32,52,32,98,121,116,101,115,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,105,110,100,105,118,105,100,117,97,108,32,98,121,116,101,115,32,111,102,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,97,114,101,32,116,104,101,110,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116,101,32,110,117,109,98,101,114,32,111,102,32,103,114,111,117,112,115,46>>]},{a,[{id,<<115,101,99,116,55>>}],[]},{h2,[],[<<83,113,117,97,114,101,32,66,114,97,99,107,101,116,115,32,97,110,100,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]},{p,[],[<<65,110,32,111,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,116,101,114,109,105,110,97,116,101,100,32,98,121,32,97,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,46,32,65,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,115,112,101,99,105,97,108,32,98,121,32,100,101,102,97,117,108,116,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<80,67,82,69,95,74,65,86,65,83,67,82,73,80,84,95,67,79,77,80,65,84>>]},<<32,105,115,32,115,101,116,44,32,97,32,108,111,110,101,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,99,97,117,115,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,32,73,102,32,97,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,32,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,99,108,97,115,115,44,32,105,116,32,105,115,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,32,40,97,102,116,101,114,32,97,110,32,105,110,105,116,105,97,108,32,99,105,114,99,117,109,102,108,101,120,44,32,105,102,32,112,114,101,115,101,110,116,41,32,111,114,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,46>>]},{p,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,100,97,116,97,32,117,110,105,116,32,108,111,110,103,46,32,65,32,109,97,116,99,104,101,100,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,32,105,110,32,116,104,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,44,32,117,110,108,101,115,115,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,32,100,101,102,105,110,105,116,105,111,110,32,105,115,32,97,32,99,105,114,99,117,109,102,108,101,120,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,115,117,98,106,101,99,116,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,32,116,104,101,32,115,101,116,32,100,101,102,105,110,101,100,32,98,121,32,116,104,101,32,99,108,97,115,115,46,32,73,102,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,114,101,113,117,105,114,101,100,32,97,115,32,97,32,109,101,109,98,101,114,32,111,102,32,116,104,101,32,99,108,97,115,115,44,32,101,110,115,117,114,101,32,116,104,97,116,32,105,116,32,105,115,32,110,111,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,101,115,99,97,112,101,32,105,116,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,46>>]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32>>,{code,[],[<<91,97,101,105,111,117,93>>]},<<32,109,97,116,99,104,101,115,32,97,110,121,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,44,32,119,104,105,108,101,32>>,{code,[],[<<91,94,97,101,105,111,117,93>>]},<<32,109,97,116,99,104,101,115,32,97,110,121,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,110,111,116,32,97,32,108,111,119,101,114,99,97,115,101,32,118,111,119,101,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,106,117,115,116,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,105,110,32,116,104,101,32,99,108,97,115,115,32,98,121,32,101,110,117,109,101,114,97,116,105,110,103,32,116,104,111,115,101,32,116,104,97,116,32,97,114,101,32,110,111,116,46,32,65,32,99,108,97,115,115,32,116,104,97,116,32,115,116,97,114,116,115,32,119,105,116,104,32,97,32,99,105,114,99,117,109,102,108,101,120,32,105,115,32,110,111,116,32,97,110,32,97,115,115,101,114,116,105,111,110,59,32,105,116,32,115,116,105,108,108,32,99,111,110,115,117,109,101,115,32,97,32,99,104,97,114,97,99,116,101,114,32,102,114,111,109,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,105,116,32,102,97,105,108,115,32,105,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,101,114,32,105,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,46>>]},{p,[],[<<73,110,32,85,84,70,45,56,32,109,111,100,101,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,40,48,120,102,102,102,102,41,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,32,105,110,32,97,32,99,108,97,115,115,32,97,115,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,111,114,32,98,121,32,117,115,105,110,103,32,116,104,101,32,92,120,123,32,101,115,99,97,112,105,110,103,32,109,101,99,104,97,110,105,115,109,46>>]},{p,[],[<<87,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,97,110,121,32,108,101,116,116,101,114,115,32,105,110,32,97,32,99,108,97,115,115,32,114,101,112,114,101,115,101,110,116,32,98,111,116,104,32,116,104,101,105,114,32,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,118,101,114,115,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,99,97,115,101,108,101,115,115,32>>,{code,[],[<<91,97,101,105,111,117,93>>]},<<32,109,97,116,99,104,101,115,32,34,65,34,32,97,110,100,32,34,97,34,44,32,97,110,100,32,97,32,99,97,115,101,108,101,115,115,32>>,{code,[],[<<91,94,97,101,105,111,117,93>>]},<<32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,65,34,44,32,98,117,116,32,97,32,99,97,115,101,102,117,108,32,118,101,114,115,105,111,110,32,119,111,117,108,100,46,32,73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,97,108,119,97,121,115,32,117,110,100,101,114,115,116,97,110,100,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,118,97,108,117,101,115,32,97,114,101,32,60,32,50,53,54,44,32,115,111,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,97,108,119,97,121,115,32,112,111,115,115,105,98,108,101,46,32,70,111,114,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,104,105,103,104,101,114,32,118,97,108,117,101,115,44,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,105,115,32,115,117,112,112,111,114,116,101,100,32,111,110,108,121,32,105,102,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,46,32,73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,117,115,101,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,110,32,97,32,85,84,70,32,109,111,100,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,62,61,44,32,101,110,115,117,114,101,32,116,104,97,116,32,80,67,82,69,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,32,97,110,100,32,119,105,116,104,32,85,84,70,32,115,117,112,112,111,114,116,46>>]},{p,[],[<<67,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,99,97,110,32,105,110,100,105,99,97,116,101,32,108,105,110,101,32,98,114,101,97,107,115,32,97,114,101,32,110,101,118,101,114,32,116,114,101,97,116,101,100,32,105,110,32,97,110,121,32,115,112,101,99,105,97,108,32,119,97,121,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,44,32,119,104,97,116,101,118,101,114,32,108,105,110,101,45,101,110,100,105,110,103,32,115,101,113,117,101,110,99,101,32,105,115,32,105,110,32,117,115,101,44,32,97,110,100,32,119,104,97,116,101,118,101,114,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,115,32>>,{code,[],[<<80,67,82,69,95,68,79,84,65,76,76>>]},<<32,97,110,100,32>>,{code,[],[<<80,67,82,69,95,77,85,76,84,73,76,73,78,69>>]},<<32,105,115,32,117,115,101,100,46,32,65,32,99,108,97,115,115,32,115,117,99,104,32,97,115,32,91,94,97,93,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,111,110,101,32,111,102,32,116,104,101,115,101,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,109,105,110,117,115,32,40,104,121,112,104,101,110,41,32,99,104,97,114,97,99,116,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,112,101,99,105,102,121,32,97,32,114,97,110,103,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,100,45,109,93,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,98,101,116,119,101,101,110,32,100,32,97,110,100,32,109,44,32,105,110,99,108,117,115,105,118,101,46,32,73,102,32,97,32,109,105,110,117,115,32,99,104,97,114,97,99,116,101,114,32,105,115,32,114,101,113,117,105,114,101,100,32,105,110,32,97,32,99,108,97,115,115,44,32,105,116,32,109,117,115,116,32,98,101,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,32,111,114,32,97,112,112,101,97,114,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,105,116,32,99,97,110,110,111,116,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,100,105,99,97,116,105,110,103,32,97,32,114,97,110,103,101,44,32,116,121,112,105,99,97,108,108,121,32,97,115,32,116,104,101,32,102,105,114,115,116,32,111,114,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,99,108,97,115,115,44,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,97,32,114,97,110,103,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,98,45,100,45,122,93,32,109,97,116,99,104,101,115,32,108,101,116,116,101,114,115,32,105,110,32,116,104,101,32,114,97,110,103,101,32,98,32,116,111,32,100,44,32,97,32,104,121,112,104,101,110,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,122,46>>]},{p,[],[<<84,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,32,34,93,34,32,99,97,110,110,111,116,32,98,101,32,116,104,101,32,101,110,100,32,99,104,97,114,97,99,116,101,114,32,111,102,32,97,32,114,97,110,103,101,46,32,65,32,112,97,116,116,101,114,110,32,115,117,99,104,32,97,115,32,91,87,45,93,52,54,93,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,111,102,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,40,34,87,34,32,97,110,100,32,34,45,34,41,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,34,52,54,93,34,44,32,115,111,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,87,52,54,93,34,32,111,114,32,34,45,52,54,93,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,34,93,34,32,105,115,32,101,115,99,97,112,101,100,32,119,105,116,104,32,97,32,98,97,99,107,115,108,97,115,104,44,32,105,116,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,114,97,110,103,101,44,32,115,111,32,91,87,45,92,93,52,54,93,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,108,97,115,115,32,99,111,110,116,97,105,110,105,110,103,32,97,32,114,97,110,103,101,32,102,111,108,108,111,119,101,100,32,98,121,32,116,119,111,32,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,111,99,116,97,108,32,111,114,32,104,101,120,97,100,101,99,105,109,97,108,32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,32,111,102,32,34,93,34,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,116,111,32,101,110,100,32,97,32,114,97,110,103,101,46>>]},{p,[],[<<65,110,32,101,114,114,111,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,105,102,32,97,32,80,79,83,73,88,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,40,115,101,101,32,98,101,108,111,119,41,32,111,114,32,97,110,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,111,116,104,101,114,32,116,104,97,110,32,111,110,101,32,116,104,97,116,32,100,101,102,105,110,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,97,112,112,101,97,114,115,32,97,116,32,97,32,112,111,105,110,116,32,119,104,101,114,101,32,97,32,114,97,110,103,101,32,101,110,100,105,110,103,32,99,104,97,114,97,99,116,101,114,32,105,115,32,101,120,112,101,99,116,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,122,45,92,120,102,102,93,32,105,115,32,118,97,108,105,100,44,32,98,117,116,32,91,65,45,92,100,93,32,97,110,100,32,91,65,45,91,58,100,105,103,105,116,58,93,93,32,97,114,101,32,110,111,116,46>>]},{p,[],[<<82,97,110,103,101,115,32,111,112,101,114,97,116,101,32,105,110,32,116,104,101,32,99,111,108,108,97,116,105,110,103,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,32,118,97,108,117,101,115,46,32,84,104,101,121,32,99,97,110,32,97,108,115,111,32,98,101,32,117,115,101,100,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,115,112,101,99,105,102,105,101,100,32,110,117,109,101,114,105,99,97,108,108,121,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,91,92,48,48,48,45,92,48,51,55,93,46,32,82,97,110,103,101,115,32,99,97,110,32,105,110,99,108,117,100,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,118,97,108,105,100,32,102,111,114,32,116,104,101,32,99,117,114,114,101,110,116,32,109,111,100,101,46>>]},{p,[],[<<73,102,32,97,32,114,97,110,103,101,32,116,104,97,116,32,105,110,99,108,117,100,101,115,32,108,101,116,116,101,114,115,32,105,115,32,117,115,101,100,32,119,104,101,110,32,99,97,115,101,108,101,115,115,32,109,97,116,99,104,105,110,103,32,105,115,32,115,101,116,44,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,108,101,116,116,101,114,115,32,105,110,32,101,105,116,104,101,114,32,99,97,115,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,87,45,99,93,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,91,93,91,92,92,94,95,96,119,120,121,122,97,98,99,93,44,32,109,97,116,99,104,101,100,32,99,97,115,101,108,101,115,115,108,121,46,32,73,110,32,97,32,110,111,110,45,85,84,70,32,109,111,100,101,44,32,105,102,32,99,104,97,114,97,99,116,101,114,32,116,97,98,108,101,115,32,102,111,114,32,97,32,70,114,101,110,99,104,32,108,111,99,97,108,101,32,97,114,101,32,105,110,32,117,115,101,44,32,91,92,120,99,56,45,92,120,99,98,93,32,109,97,116,99,104,101,115,32,97,99,99,101,110,116,101,100,32,69,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,98,111,116,104,32,99,97,115,101,115,46,32,73,110,32,85,84,70,32,109,111,100,101,115,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,99,111,110,99,101,112,116,32,111,102,32,99,97,115,101,32,102,111,114,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,111,110,108,121,32,119,104,101,110,32,105,116,32,105,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,115,117,112,112,111,114,116,46>>]},{p,[],[<<84,104,101,32,99,104,97,114,97,99,116,101,114,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,92,100,44,32,92,68,44,32,92,104,44,32,92,72,44,32,92,112,44,32,92,80,44,32,92,115,44,32,92,83,44,32,92,118,44,32,92,86,44,32,92,119,44,32,97,110,100,32,92,87,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,110,100,32,97,100,100,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,116,104,101,121,32,109,97,116,99,104,32,116,111,32,116,104,101,32,99,108,97,115,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,91,92,100,65,66,67,68,69,70,93,32,109,97,116,99,104,101,115,32,97,110,121,32,104,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,46,32,73,110,32,85,84,70,32,109,111,100,101,115,44,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,97,102,102,101,99,116,115,32,116,104,101,32,109,101,97,110,105,110,103,115,32,111,102,32,92,100,44,32,92,115,44,32,92,119,32,97,110,100,32,116,104,101,105,114,32,117,112,112,101,114,99,97,115,101,32,112,97,114,116,110,101,114,115,44,32,106,117,115,116,32,97,115,32,105,116,32,100,111,101,115,32,119,104,101,110,32,116,104,101,121,32,97,112,112,101,97,114,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,103,101,110,101,114,105,99,95,99,104,97,114,97,99,116,101,114,95,116,121,112,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<71,101,110,101,114,105,99,32,67,104,97,114,97,99,116,101,114,32,84,121,112,101,115>>]},<<32,101,97,114,108,105,101,114,46,32,84,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,98,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,59,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,98,97,99,107,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,115,101,113,117,101,110,99,101,115,32,92,66,44,32,92,78,44,32,92,82,44,32,97,110,100,32,92,88,32,97,114,101,32,110,111,116,32,115,112,101,99,105,97,108,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,76,105,107,101,32,97,110,121,32,111,116,104,101,114,32,117,110,114,101,99,111,103,110,105,122,101,100,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,44,32,116,104,101,121,32,97,114,101,32,116,114,101,97,116,101,100,32,97,115,32,116,104,101,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,115,32,34,66,34,44,32,34,78,34,44,32,34,82,34,44,32,97,110,100,32,34,88,34,46>>]},{p,[],[<<65,32,99,105,114,99,117,109,102,108,101,120,32,99,97,110,32,99,111,110,118,101,110,105,101,110,116,108,121,32,98,101,32,117,115,101,100,32,119,105,116,104,32,116,104,101,32,117,112,112,101,114,99,97,115,101,32,99,104,97,114,97,99,116,101,114,32,116,121,112,101,115,32,116,111,32,115,112,101,99,105,102,121,32,97,32,109,111,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,108,111,119,101,114,99,97,115,101,32,116,121,112,101,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,108,97,115,115,32,91,94,92,87,95,93,32,109,97,116,99,104,101,115,32,97,110,121,32,108,101,116,116,101,114,32,111,114,32,100,105,103,105,116,44,32,98,117,116,32,110,111,116,32,117,110,100,101,114,115,99,111,114,101,44,32,119,104,105,108,101,32,91,92,119,93,32,105,110,99,108,117,100,101,115,32,117,110,100,101,114,115,99,111,114,101,46,32,65,32,112,111,115,105,116,105,118,101,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,105,115,32,116,111,32,98,101,32,114,101,97,100,32,97,115,32,34,115,111,109,101,116,104,105,110,103,32,79,82,32,115,111,109,101,116,104,105,110,103,32,79,82,32,46,46,46,34,32,97,110,100,32,97,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,32,97,115,32,34,78,79,84,32,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,32,115,111,109,101,116,104,105,110,103,32,65,78,68,32,78,79,84,32,46,46,46,34,46>>]},{p,[],[<<79,110,108,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,101,116,97,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,32,105,110,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,58>>]},{ul,[],[{li,[],[<<66,97,99,107,115,108,97,115,104>>]},{li,[],[<<72,121,112,104,101,110,32,40,111,110,108,121,32,119,104,101,114,101,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32,97,32,114,97,110,103,101,41>>]},{li,[],[<<67,105,114,99,117,109,102,108,101,120,32,40,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,41>>]},{li,[],[<<79,112,101,110,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,32,40,111,110,108,121,32,119,104,101,110,32,105,116,32,99,97,110,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,105,110,116,114,111,100,117,99,105,110,103,32,97,32,80,111,115,105,120,32,99,108,97,115,115,32,110,97,109,101,44,32,111,114,32,102,111,114,32,97,32,115,112,101,99,105,97,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,102,101,97,116,117,114,101,59,32,115,101,101,32,116,104,101,32,110,101,120,116,32,116,119,111,32,115,101,99,116,105,111,110,115,41>>]},{li,[],[<<84,101,114,109,105,110,97,116,105,110,103,32,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116>>]}]},{p,[],[<<72,111,119,101,118,101,114,44,32,101,115,99,97,112,105,110,103,32,111,116,104,101,114,32,110,111,110,45,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,100,111,101,115,32,110,111,32,104,97,114,109,46>>]},{a,[{id,<<115,101,99,116,56>>}],[]},{h2,[],[<<80,111,115,105,120,32,67,104,97,114,97,99,116,101,114,32,67,108,97,115,115,101,115>>]},{p,[],[<<80,101,114,108,32,115,117,112,112,111,114,116,115,32,116,104,101,32,80,111,115,105,120,32,110,111,116,97,116,105,111,110,32,102,111,114,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,84,104,105,115,32,117,115,101,115,32,110,97,109,101,115,32,101,110,99,108,111,115,101,100,32,98,121,32,91,58,32,97,110,100,32,58,93,32,119,105,116,104,105,110,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,115,113,117,97,114,101,32,98,114,97,99,107,101,116,115,46,32,80,67,82,69,32,97,108,115,111,32,115,117,112,112,111,114,116,115,32,116,104,105,115,32,110,111,116,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,48,34,44,32,34,49,34,44,32,97,110,121,32,97,108,112,104,97,98,101,116,105,99,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,34,37,34,58>>]},{pre,[],[{code,[],[<<91,48,49,91,58,97,108,112,104,97,58,93,37,93>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,115,117,112,112,111,114,116,101,100,32,99,108,97,115,115,32,110,97,109,101,115,58>>]},{dl,[],[{dt,[],[<<97,108,110,117,109>>]},{dd,[],[<<76,101,116,116,101,114,115,32,97,110,100,32,100,105,103,105,116,115>>]},{dt,[],[<<97,108,112,104,97>>]},{dd,[],[<<76,101,116,116,101,114,115>>]},{dt,[],[<<98,108,97,110,107>>]},{dd,[],[<<83,112,97,99,101,32,111,114,32,116,97,98,32,111,110,108,121>>]},{dt,[],[<<99,110,116,114,108>>]},{dd,[],[<<67,111,110,116,114,111,108,32,99,104,97,114,97,99,116,101,114,115>>]},{dt,[],[<<100,105,103,105,116>>]},{dd,[],[<<68,101,99,105,109,97,108,32,100,105,103,105,116,115,32,40,115,97,109,101,32,97,115,32,92,100,41>>]},{dt,[],[<<103,114,97,112,104>>]},{dd,[],[<<80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,115,112,97,99,101>>]},{dt,[],[<<108,111,119,101,114>>]},{dd,[],[<<76,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115>>]},{dt,[],[<<112,114,105,110,116>>]},{dd,[],[<<80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,115,112,97,99,101>>]},{dt,[],[<<112,117,110,99,116>>]},{dd,[],[<<80,114,105,110,116,105,110,103,32,99,104,97,114,97,99,116,101,114,115,44,32,101,120,99,108,117,100,105,110,103,32,108,101,116,116,101,114,115,44,32,100,105,103,105,116,115,44,32,97,110,100,32,115,112,97,99,101>>]},{dt,[],[<<115,112,97,99,101>>]},{dd,[],[<<87,104,105,116,101,115,112,97,99,101,32,40,116,104,101,32,115,97,109,101,32,97,115,32,92,115,32,102,114,111,109,32,80,67,82,69,32,56,46,51,52,41>>]},{dt,[],[<<117,112,112,101,114>>]},{dd,[],[<<85,112,112,101,114,99,97,115,101,32,108,101,116,116,101,114,115>>]},{dt,[],[<<119,111,114,100>>]},{dd,[],[<<34,87,111,114,100,34,32,99,104,97,114,97,99,116,101,114,115,32,40,115,97,109,101,32,97,115,32,92,119,41>>]},{dt,[],[<<120,100,105,103,105,116>>]},{dd,[],[<<72,101,120,97,100,101,99,105,109,97,108,32,100,105,103,105,116,115>>]}]},{p,[],[<<84,104,101,114,101,32,105,115,32,97,110,111,116,104,101,114,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32>>,{code,[],[<<97,115,99,105,105>>]},<<44,32,116,104,97,116,32,101,114,114,111,110,101,111,117,115,108,121,32,109,97,116,99,104,101,115,32,76,97,116,105,110,45,49,32,99,104,97,114,97,99,116,101,114,115,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,48,45,49,50,55,32,114,97,110,103,101,32,115,112,101,99,105,102,105,101,100,32,98,121,32,80,79,83,73,88,46,32,84,104,105,115,32,99,97,110,110,111,116,32,98,101,32,102,105,120,101,100,32,119,105,116,104,111,117,116,32,97,108,116,101,114,105,110,103,32,116,104,101,32,98,101,104,97,118,105,111,117,114,32,111,102,32,111,116,104,101,114,32,99,108,97,115,115,101,115,44,32,115,111,32,119,101,32,114,101,99,111,109,109,101,110,100,32,109,97,116,99,104,105,110,103,32,116,104,101,32,114,97,110,103,101,32,119,105,116,104,32>>,{code,[],[<<91,92,92,48,45,92,120,55,102,93>>]},<<32,105,110,115,116,101,97,100,46>>]},{p,[],[<<84,104,101,32,100,101,102,97,117,108,116,32,34,115,112,97,99,101,34,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,72,84,32,40,57,41,44,32,76,70,32,40,49,48,41,44,32,86,84,32,40,49,49,41,44,32,70,70,32,40,49,50,41,44,32,67,82,32,40,49,51,41,44,32,97,110,100,32,115,112,97,99,101,32,40,51,50,41,46,32,73,102,32,108,111,99,97,108,101,45,115,112,101,99,105,102,105,99,32,109,97,116,99,104,105,110,103,32,105,115,32,116,97,107,105,110,103,32,112,108,97,99,101,44,32,116,104,101,32,108,105,115,116,32,111,102,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,109,97,121,32,98,101,32,100,105,102,102,101,114,101,110,116,59,32,116,104,101,114,101,32,109,97,121,32,98,101,32,102,101,119,101,114,32,111,114,32,109,111,114,101,32,111,102,32,116,104,101,109,46,32,34,83,112,97,99,101,34,32,117,115,101,100,32,116,111,32,98,101,32,100,105,102,102,101,114,101,110,116,32,116,111,32,92,115,44,32,119,104,105,99,104,32,100,105,100,32,110,111,116,32,105,110,99,108,117,100,101,32,86,84,44,32,102,111,114,32,80,101,114,108,32,99,111,109,112,97,116,105,98,105,108,105,116,121,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,97,110,100,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,46,32,34,83,112,97,99,101,34,32,97,110,100,32,92,115,32,110,111,119,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<84,104,101,32,110,97,109,101,32,34,119,111,114,100,34,32,105,115,32,97,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,44,32,97,110,100,32,34,98,108,97,110,107,34,32,105,115,32,97,32,71,78,85,32,101,120,116,101,110,115,105,111,110,32,102,114,111,109,32,80,101,114,108,32,53,46,56,46,32,65,110,111,116,104,101,114,32,80,101,114,108,32,101,120,116,101,110,115,105,111,110,32,105,115,32,110,101,103,97,116,105,111,110,44,32,119,104,105,99,104,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,94,32,99,104,97,114,97,99,116,101,114,32,97,102,116,101,114,32,116,104,101,32,99,111,108,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,49,34,44,32,34,50,34,44,32,111,114,32,97,110,121,32,110,111,110,45,100,105,103,105,116,58>>]},{pre,[],[{code,[],[<<91,49,50,91,58,94,100,105,103,105,116,58,93,93>>]}]},{p,[],[<<80,67,82,69,32,40,97,110,100,32,80,101,114,108,41,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,32,116,104,101,32,80,111,115,105,120,32,115,121,110,116,97,120,32,91,46,99,104,46,93,32,97,110,100,32,91,61,99,104,61,93,32,119,104,101,114,101,32,34,99,104,34,32,105,115,32,97,32,34,99,111,108,108,97,116,105,110,103,32,101,108,101,109,101,110,116,34,44,32,98,117,116,32,116,104,101,115,101,32,97,114,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,44,32,97,110,100,32,97,110,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,105,102,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,118,97,108,117,101,115,32,62,32,50,53,53,32,100,111,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,111,102,32,116,104,101,32,80,111,115,105,120,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,101,115,46,32,72,111,119,101,118,101,114,44,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<80,67,82,69,95,85,67,80>>]},<<32,105,115,32,112,97,115,115,101,100,32,116,111,32>>,{code,[],[<<112,99,114,101,95,99,111,109,112,105,108,101,40,41>>]},<<44,32,115,111,109,101,32,111,102,32,116,104,101,32,99,108,97,115,115,101,115,32,97,114,101,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,84,104,105,115,32,105,115,32,97,99,104,105,101,118,101,100,32,98,121,32,114,101,112,108,97,99,105,110,103,32,99,101,114,116,97,105,110,32,80,111,115,105,120,32,99,108,97,115,115,101,115,32,98,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,115,44,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<91,58,97,108,110,117,109,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,88,97,110,125>>]}]},{dt,[],[<<91,58,97,108,112,104,97,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,76,125>>]}]},{dt,[],[<<91,58,98,108,97,110,107,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,104>>]}]},{dt,[],[<<91,58,100,105,103,105,116,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,78,100,125>>]}]},{dt,[],[<<91,58,108,111,119,101,114,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,76,108,125>>]}]},{dt,[],[<<91,58,115,112,97,99,101,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,88,112,115,125>>]}]},{dt,[],[<<91,58,117,112,112,101,114,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,76,117,125>>]}]},{dt,[],[<<91,58,119,111,114,100,58,93>>]},{dd,[],[<<66,101,99,111,109,101,115,32>>,{em,[],[<<92,112,123,88,119,100,125>>]}]}]},{p,[],[<<78,101,103,97,116,101,100,32,118,101,114,115,105,111,110,115,44,32,115,117,99,104,32,97,115,32,91,58,94,97,108,112,104,97,58,93,44,32,117,115,101,32,92,80,32,105,110,115,116,101,97,100,32,111,102,32,92,112,46,32,84,104,114,101,101,32,111,116,104,101,114,32,80,79,83,73,88,32,99,108,97,115,115,101,115,32,97,114,101,32,104,97,110,100,108,101,100,32,115,112,101,99,105,97,108,108,121,32,105,110,32,85,67,80,32,109,111,100,101,58>>]},{dl,[],[{dt,[],[<<91,58,103,114,97,112,104,58,93>>]},{dd,[],[{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,103,108,121,112,104,115,32,116,104,97,116,32,109,97,114,107,32,116,104,101,32,112,97,103,101,32,119,104,101,110,32,112,114,105,110,116,101,100,46,32,73,110,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,116,101,114,109,115,44,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,76,44,32,77,44,32,78,44,32,80,44,32,83,44,32,111,114,32,67,102,32,112,114,111,112,101,114,116,105,101,115,44,32,101,120,99,101,112,116,32,102,111,114,58>>]},{dl,[],[{dt,[],[<<85,43,48,54,49,67>>]},{dd,[],[{p,[],[<<65,114,97,98,105,99,32,76,101,116,116,101,114,32,77,97,114,107>>]}]},{dt,[],[<<85,43,49,56,48,69>>]},{dd,[],[{p,[],[<<77,111,110,103,111,108,105,97,110,32,86,111,119,101,108,32,83,101,112,97,114,97,116,111,114>>]}]},{dt,[],[<<85,43,50,48,54,54,32,45,32,85,43,50,48,54,57>>]},{dd,[],[{p,[],[<<86,97,114,105,111,117,115,32,34,105,115,111,108,97,116,101,34,115>>]}]}]}]},{dt,[],[<<91,58,112,114,105,110,116,58,93>>]},{dd,[],[{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,116,104,101,32,115,97,109,101,32,99,104,97,114,97,99,116,101,114,115,32,97,115,32,91,58,103,114,97,112,104,58,93,32,112,108,117,115,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,99,111,110,116,114,111,108,115,44,32,116,104,97,116,32,105,115,44,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,116,104,101,32,90,115,32,112,114,111,112,101,114,116,121,46>>]}]},{dt,[],[<<91,58,112,117,110,99,116,58,93>>]},{dd,[],[{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,85,110,105,99,111,100,101,32,80,32,40,112,117,110,99,116,117,97,116,105,111,110,41,32,112,114,111,112,101,114,116,121,44,32,112,108,117,115,32,116,104,111,115,101,32,99,104,97,114,97,99,116,101,114,115,32,119,104,111,115,101,32,99,111,100,101,32,112,111,105,110,116,115,32,97,114,101,32,108,101,115,115,32,116,104,97,110,32,49,50,56,32,116,104,97,116,32,104,97,118,101,32,116,104,101,32,83,32,40,83,121,109,98,111,108,41,32,112,114,111,112,101,114,116,121,46>>]}]}]},{p,[],[<<84,104,101,32,111,116,104,101,114,32,80,79,83,73,88,32,99,108,97,115,115,101,115,32,97,114,101,32,117,110,99,104,97,110,103,101,100,44,32,97,110,100,32,109,97,116,99,104,32,111,110,108,121,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,99,111,100,101,32,112,111,105,110,116,115,32,108,101,115,115,32,116,104,97,110,32,49,50,56,46>>]},{p,[],[{em,[],[<<67,111,109,112,97,116,105,98,105,108,105,116,121,32,70,101,97,116,117,114,101,32,102,111,114,32,87,111,114,100,32,66,111,117,110,100,97,114,105,101,115>>]}]},{p,[],[<<73,110,32,116,104,101,32,80,79,83,73,88,46,50,32,99,111,109,112,108,105,97,110,116,32,108,105,98,114,97,114,121,32,116,104,97,116,32,119,97,115,32,105,110,99,108,117,100,101,100,32,105,110,32,52,46,52,66,83,68,32,85,110,105,120,44,32,116,104,101,32,117,103,108,121,32,115,121,110,116,97,120,32,91,91,58,60,58,93,93,32,97,110,100,32,91,91,58,62,58,93,93,32,105,115,32,117,115,101,100,32,102,111,114,32,109,97,116,99,104,105,110,103,32,34,115,116,97,114,116,32,111,102,32,119,111,114,100,34,32,97,110,100,32,34,101,110,100,32,111,102,32,119,111,114,100,34,46,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,115,101,32,105,116,101,109,115,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<91,91,58,60,58,93,93>>]},{dd,[],[{p,[],[<<105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,92,98,40,63,61,92,119,41>>]}]},{dt,[],[<<91,91,58,62,58,93,93>>]},{dd,[],[{p,[],[<<105,115,32,99,111,110,118,101,114,116,101,100,32,116,111,32,92,98,40,63,60,61,92,119,41>>]}]}]},{p,[],[<<79,110,108,121,32,116,104,101,115,101,32,101,120,97,99,116,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,97,114,101,32,114,101,99,111,103,110,105,122,101,100,46,32,65,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,32,91,97,91,58,60,58,93,98,93,32,112,114,111,118,111,107,101,115,32,101,114,114,111,114,32,102,111,114,32,97,110,32,117,110,114,101,99,111,103,110,105,122,101,100,32,80,79,83,73,88,32,99,108,97,115,115,32,110,97,109,101,46,32,84,104,105,115,32,115,117,112,112,111,114,116,32,105,115,32,110,111,116,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,105,115,32,112,114,111,118,105,100,101,100,32,116,111,32,104,101,108,112,32,109,105,103,114,97,116,105,111,110,115,32,102,114,111,109,32,111,116,104,101,114,32,101,110,118,105,114,111,110,109,101,110,116,115,44,32,97,110,100,32,105,115,32,98,101,115,116,32,110,111,116,32,117,115,101,100,32,105,110,32,97,110,121,32,110,101,119,32,112,97,116,116,101,114,110,115,46,32,78,111,116,101,32,116,104,97,116,32,92,98,32,109,97,116,99,104,101,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,97,110,100,32,116,104,101,32,101,110,100,32,111,102,32,97,32,119,111,114,100,32,40,115,101,101,32,34,83,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,34,32,97,98,111,118,101,41,44,32,97,110,100,32,105,110,32,97,32,80,101,114,108,45,115,116,121,108,101,32,112,97,116,116,101,114,110,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,111,114,32,102,111,108,108,111,119,105,110,103,32,99,104,97,114,97,99,116,101,114,32,110,111,114,109,97,108,108,121,32,115,104,111,119,115,32,119,104,105,99,104,32,105,115,32,119,97,110,116,101,100,44,32,119,105,116,104,111,117,116,32,116,104,101,32,110,101,101,100,32,102,111,114,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,97,98,111,118,101,32,105,110,32,111,114,100,101,114,32,116,111,32,103,105,118,101,32,101,120,97,99,116,108,121,32,116,104,101,32,80,79,83,73,88,32,98,101,104,97,118,105,111,117,114,46>>]},{a,[{id,<<115,101,99,116,57>>}],[]},{h2,[],[<<86,101,114,116,105,99,97,108,32,66,97,114>>]},{p,[],[<<86,101,114,116,105,99,97,108,32,98,97,114,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,117,115,101,100,32,116,111,32,115,101,112,97,114,97,116,101,32,97,108,116,101,114,110,97,116,105,118,101,32,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,101,105,116,104,101,114,32,34,103,105,108,98,101,114,116,34,32,111,114,32,34,115,117,108,108,105,118,97,110,34,58>>]},{pre,[],[{code,[],[<<103,105,108,98,101,114,116,124,115,117,108,108,105,118,97,110>>]}]},{p,[],[<<65,110,121,32,110,117,109,98,101,114,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,97,112,112,101,97,114,44,32,97,110,100,32,97,110,32,101,109,112,116,121,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,112,101,114,109,105,116,116,101,100,32,40,109,97,116,99,104,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,41,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,114,105,101,115,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,117,114,110,44,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,116,104,97,116,32,115,117,99,99,101,101,100,115,32,105,115,32,117,115,101,100,46,32,73,102,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,100,101,102,105,110,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115>>]},<<41,44,32,34,115,117,99,99,101,101,100,115,34,32,109,101,97,110,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,109,97,105,110,32,112,97,116,116,101,114,110,32,97,110,100,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46>>]},{a,[{id,<<115,101,99,116,49,48>>}],[]},{h2,[],[<<73,110,116,101,114,110,97,108,32,79,112,116,105,111,110,32,83,101,116,116,105,110,103>>]},{p,[],[<<84,104,101,32,115,101,116,116,105,110,103,115,32,111,102,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<44,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<44,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,102,114,111,109,32,119,105,116,104,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,121,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,80,101,114,108,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,101,110,99,108,111,115,101,100,32,98,101,116,119,101,101,110,32,34,40,63,34,32,97,110,100,32,34,41,34,46,32,84,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,97,114,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[<<105>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]}]},{dt,[],[<<109>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]}]},{dt,[],[<<115>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<100,111,116,97,108,108>>]}]},{dt,[],[<<120>>]},{dd,[],[<<70,111,114,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]}]}]},{p,[],[<<70,111,114,32,101,120,97,109,112,108,101,44,32>>,{code,[],[<<40,63,105,109,41>>]},<<32,115,101,116,115,32,99,97,115,101,108,101,115,115,44,32,109,117,108,116,105,108,105,110,101,32,109,97,116,99,104,105,110,103,46,32,84,104,101,115,101,32,111,112,116,105,111,110,115,32,99,97,110,32,97,108,115,111,32,98,101,32,117,110,115,101,116,32,98,121,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,108,101,116,116,101,114,32,119,105,116,104,32,97,32,104,121,112,104,101,110,46,32,65,32,99,111,109,98,105,110,101,100,32,115,101,116,116,105,110,103,32,97,110,100,32,117,110,115,101,116,116,105,110,103,32,115,117,99,104,32,97,115,32>>,{code,[],[<<40,63,105,109,45,115,120,41>>]},<<44,32,119,104,105,99,104,32,115,101,116,115,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<32,97,110,100,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<44,32,119,104,105,108,101,32,117,110,115,101,116,116,105,110,103,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,97,110,100,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<44,32,105,115,32,97,108,115,111,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,97,32,108,101,116,116,101,114,32,97,112,112,101,97,114,115,32,98,111,116,104,32,98,101,102,111,114,101,32,97,110,100,32,97,102,116,101,114,32,116,104,101,32,104,121,112,104,101,110,44,32,116,104,101,32,111,112,116,105,111,110,32,105,115,32,117,110,115,101,116,46>>]},{p,[],[<<84,104,101,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32>>,{code,[],[<<100,117,112,110,97,109,101,115>>]},<<44,32>>,{code,[],[<<117,110,103,114,101,101,100,121>>]},<<44,32,97,110,100,32>>,{code,[],[<<101,120,116,114,97>>]},<<32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,116,104,101,32,80,101,114,108,45,99,111,109,112,97,116,105,98,108,101,32,111,112,116,105,111,110,115,32,98,121,32,117,115,105,110,103,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,74,44,32,85,44,32,97,110,100,32,88,32,114,101,115,112,101,99,116,105,118,101,108,121,46>>]},{p,[],[<<87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,111,110,32,99,104,97,110,103,101,115,32,111,99,99,117,114,115,32,97,116,32,116,111,112,45,108,101,118,101,108,32,40,116,104,97,116,32,105,115,44,32,110,111,116,32,105,110,115,105,100,101,32,115,117,98,112,97,116,116,101,114,110,32,112,97,114,101,110,116,104,101,115,101,115,41,44,32,116,104,101,32,99,104,97,110,103,101,32,97,112,112,108,105,101,115,32,116,111,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,116,104,97,116,32,102,111,108,108,111,119,115,46>>]},{p,[],[<<65,110,32,111,112,116,105,111,110,32,99,104,97,110,103,101,32,119,105,116,104,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,115>>]},<<41,32,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,97,116,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,102,111,108,108,111,119,115,32,105,116,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,98,99,32,97,110,100,32,97,66,99,32,97,110,100,32,110,111,32,111,116,104,101,114,32,115,116,114,105,110,103,115,32,40,97,115,115,117,109,105,110,103,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<32,105,115,32,110,111,116,32,117,115,101,100,41,58>>]},{pre,[],[{code,[],[<<40,97,40,63,105,41,98,41,99>>]}]},{p,[],[<<66,121,32,116,104,105,115,32,109,101,97,110,115,44,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,109,97,100,101,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,115,101,116,116,105,110,103,115,32,105,110,32,100,105,102,102,101,114,101,110,116,32,112,97,114,116,115,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,99,104,97,110,103,101,115,32,109,97,100,101,32,105,110,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,32,100,111,32,99,97,114,114,121,32,111,110,32,105,110,116,111,32,115,117,98,115,101,113,117,101,110,116,32,98,114,97,110,99,104,101,115,32,119,105,116,104,105,110,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,40,63,105,41,98,124,99,41>>]}]},{p,[],[<<109,97,116,99,104,101,115,32,34,97,98,34,44,32,34,97,66,34,44,32,34,99,34,44,32,97,110,100,32,34,67,34,44,32,97,108,116,104,111,117,103,104,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,67,34,32,116,104,101,32,102,105,114,115,116,32,98,114,97,110,99,104,32,105,115,32,97,98,97,110,100,111,110,101,100,32,98,101,102,111,114,101,32,116,104,101,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,101,102,102,101,99,116,115,32,111,102,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,115,32,111,99,99,117,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,84,104,101,114,101,32,119,111,117,108,100,32,98,101,32,115,111,109,101,32,119,101,105,114,100,32,98,101,104,97,118,105,111,114,32,111,116,104,101,114,119,105,115,101,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<79,116,104,101,114,32,80,67,82,69,45,115,112,101,99,105,102,105,99,32,111,112,116,105,111,110,115,32,99,97,110,32,98,101,32,115,101,116,32,98,121,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,119,104,101,110,32,116,104,101,32,99,111,109,112,105,108,105,110,103,32,111,114,32,109,97,116,99,104,105,110,103,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,99,97,108,108,101,100,46,32,83,111,109,101,116,105,109,101,115,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,32,115,112,101,99,105,97,108,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,44,32,115,117,99,104,32,97,115,32,40,42,67,82,76,70,41,44,32,116,111,32,111,118,101,114,114,105,100,101,32,119,104,97,116,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,104,97,115,32,115,101,116,32,111,114,32,119,104,97,116,32,104,97,115,32,98,101,101,110,32,100,101,102,97,117,108,116,101,100,46,32,68,101,116,97,105,108,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,101,119,108,105,110,101,95,115,101,113,117,101,110,99,101,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,101,119,108,105,110,101,32,83,101,113,117,101,110,99,101,115>>]},<<32,101,97,114,108,105,101,114,46>>]},{p,[],[<<84,104,101,32,40,42,85,84,70,56,41,32,97,110,100,32,40,42,85,67,80,41,32,108,101,97,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,115,101,116,32,85,84,70,32,97,110,100,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,121,32,109,111,100,101,115,46,32,84,104,101,121,32,97,114,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,115,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,97,110,100,32>>,{code,[],[<<117,99,112>>]},<<44,32,114,101,115,112,101,99,116,105,118,101,108,121,46,32,84,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,32,105,115,32,97,32,103,101,110,101,114,105,99,32,118,101,114,115,105,111,110,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,110,121,32,111,102,32,116,104,101,32,108,105,98,114,97,114,105,101,115,46,32,72,111,119,101,118,101,114,44,32,116,104,101,32,97,112,112,108,105,99,97,116,105,111,110,32,99,97,110,32,115,101,116,32,111,112,116,105,111,110,32>>,{code,[],[<<110,101,118,101,114,95,117,116,102>>]},<<44,32,119,104,105,99,104,32,108,111,99,107,115,32,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,116,104,101,32,40,42,85,84,70,41,32,115,101,113,117,101,110,99,101,115,46>>]}]},{a,[{id,<<115,101,99,116,49,49>>}],[]},{h2,[],[<<83,117,98,112,97,116,116,101,114,110,115>>]},{p,[],[<<83,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,100,101,108,105,109,105,116,101,100,32,98,121,32,112,97,114,101,110,116,104,101,115,101,115,32,40,114,111,117,110,100,32,98,114,97,99,107,101,116,115,41,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,110,101,115,116,101,100,46,32,84,117,114,110,105,110,103,32,112,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,116,119,111,32,116,104,105,110,103,115,58>>]},{dl,[],[{dt,[],[<<49,46>>]},{dd,[],[{p,[],[<<73,116,32,108,111,99,97,108,105,122,101,115,32,97,32,115,101,116,32,111,102,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,99,97,116,97,114,97,99,116,34,44,32,34,99,97,116,101,114,112,105,108,108,97,114,34,44,32,111,114,32,34,99,97,116,34,58>>]},{pre,[],[{code,[],[<<99,97,116,40,97,114,97,99,116,124,101,114,112,105,108,108,97,114,124,41>>]}]},{p,[],[<<87,105,116,104,111,117,116,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,44,32,105,116,32,119,111,117,108,100,32,109,97,116,99,104,32,34,99,97,116,97,114,97,99,116,34,44,32,34,101,114,112,105,108,108,97,114,34,44,32,111,114,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,46>>]}]},{dt,[],[<<50,46>>]},{dd,[],[{p,[],[<<73,116,32,115,101,116,115,32,117,112,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,119,104,101,110,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,116,104,97,116,32,112,111,114,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,116,104,97,116,32,109,97,116,99,104,101,100,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,116,104,114,111,117,103,104,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<46>>]}]}]},{p,[],[<<79,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,40,115,116,97,114,116,105,110,103,32,102,114,111,109,32,49,41,32,116,111,32,111,98,116,97,105,110,32,110,117,109,98,101,114,115,32,102,111,114,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,114,101,100,32,107,105,110,103,34,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,114,101,100,32,107,105,110,103,34,44,32,34,114,101,100,34,44,32,97,110,100,32,34,107,105,110,103,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,44,32,50,44,32,97,110,100,32,51,44,32,114,101,115,112,101,99,116,105,118,101,108,121,58>>]},{pre,[],[{code,[],[<<116,104,101,32,40,40,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41>>]}]},{p,[],[<<73,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,104,101,108,112,102,117,108,32,116,104,97,116,32,112,108,97,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,102,117,108,102,105,108,108,32,116,119,111,32,102,117,110,99,116,105,111,110,115,46,32,79,102,116,101,110,32,97,32,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,111,117,116,32,97,32,99,97,112,116,117,114,105,110,103,32,114,101,113,117,105,114,101,109,101,110,116,46,32,73,102,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,97,110,100,32,97,32,99,111,108,111,110,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,100,111,32,97,110,121,32,99,97,112,116,117,114,105,110,103,44,32,97,110,100,32,105,115,32,110,111,116,32,99,111,117,110,116,101,100,32,119,104,101,110,32,99,111,109,112,117,116,105,110,103,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,97,110,121,32,115,117,98,115,101,113,117,101,110,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,116,104,101,32,115,116,114,105,110,103,32,34,116,104,101,32,119,104,105,116,101,32,113,117,101,101,110,34,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,34,119,104,105,116,101,32,113,117,101,101,110,34,32,97,110,100,32,34,113,117,101,101,110,34,44,32,97,110,100,32,97,114,101,32,110,117,109,98,101,114,101,100,32,49,32,97,110,100,32,50,58>>]},{pre,[],[{code,[],[<<116,104,101,32,40,40,63,58,114,101,100,124,119,104,105,116,101,41,32,40,107,105,110,103,124,113,117,101,101,110,41,41>>]}]},{p,[],[<<84,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,32,54,53,53,51,53,46>>]},{p,[],[<<65,115,32,97,32,99,111,110,118,101,110,105,101,110,116,32,115,104,111,114,116,104,97,110,100,44,32,105,102,32,97,110,121,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,115,32,97,114,101,32,114,101,113,117,105,114,101,100,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,111,112,116,105,111,110,32,108,101,116,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,34,63,34,32,97,110,100,32,34,58,34,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,116,119,111,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,115,101,116,32,111,102,32,115,116,114,105,110,103,115,58>>]},{pre,[],[{code,[],[<<40,63,105,58,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41,10,40,63,58,40,63,105,41,115,97,116,117,114,100,97,121,124,115,117,110,100,97,121,41>>]}]},{p,[],[<<65,115,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,97,114,101,32,116,114,105,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,97,110,100,32,111,112,116,105,111,110,115,32,97,114,101,32,110,111,116,32,114,101,115,101,116,32,117,110,116,105,108,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,97,99,104,101,100,44,32,97,110,32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,105,110,32,111,110,101,32,98,114,97,110,99,104,32,100,111,101,115,32,97,102,102,101,99,116,32,115,117,98,115,101,113,117,101,110,116,32,98,114,97,110,99,104,101,115,44,32,115,111,32,116,104,101,32,97,98,111,118,101,32,112,97,116,116,101,114,110,115,32,109,97,116,99,104,32,98,111,116,104,32,34,83,85,78,68,65,89,34,32,97,110,100,32,34,83,97,116,117,114,100,97,121,34,46>>]},{a,[{id,<<115,101,99,116,49,50>>}],[]},{h2,[],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]},{p,[],[<<80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,97,32,102,101,97,116,117,114,101,32,119,104,101,114,101,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,115,32,102,111,114,32,105,116,115,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,46,32,83,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32>>,{code,[],[<<40,63,124>>]},<<32,97,110,100,32,105,115,32,105,116,115,101,108,102,32,97,32,110,111,110,45,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,63,124,40,83,97,116,41,117,114,124,40,83,117,110,41,41,100,97,121>>]}]},{p,[],[<<65,115,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,105,110,115,105,100,101,32,97,32>>,{code,[],[<<40,63,124>>]},<<32,103,114,111,117,112,44,32,98,111,116,104,32,115,101,116,115,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,111,110,101,46,32,84,104,117,115,44,32,119,104,101,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,121,111,117,32,99,97,110,32,108,111,111,107,32,97,116,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,110,117,109,98,101,114,32,111,110,101,44,32,119,104,105,99,104,101,118,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,99,111,110,115,116,114,117,99,116,32,105,115,32,117,115,101,102,117,108,32,119,104,101,110,32,121,111,117,32,119,97,110,116,32,116,111,32,99,97,112,116,117,114,101,32,97,32,112,97,114,116,44,32,98,117,116,32,110,111,116,32,97,108,108,44,32,111,102,32,111,110,101,32,111,102,32,109,97,110,121,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,110,115,105,100,101,32,97,32>>,{code,[],[<<40,63,124>>]},<<32,103,114,111,117,112,44,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,117,109,98,101,114,101,100,32,97,115,32,117,115,117,97,108,44,32,98,117,116,32,116,104,101,32,110,117,109,98,101,114,32,105,115,32,114,101,115,101,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,98,114,97,110,99,104,46,32,84,104,101,32,110,117,109,98,101,114,115,32,111,102,32,97,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,102,111,108,108,111,119,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,115,116,97,114,116,32,97,102,116,101,114,32,116,104,101,32,104,105,103,104,101,115,116,32,110,117,109,98,101,114,32,117,115,101,100,32,105,110,32,97,110,121,32,98,114,97,110,99,104,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,105,115,32,102,114,111,109,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,59,32,116,104,101,32,110,117,109,98,101,114,115,32,117,110,100,101,114,110,101,97,116,104,32,115,104,111,119,32,105,110,32,119,104,105,99,104,32,98,117,102,102,101,114,32,116,104,101,32,99,97,112,116,117,114,101,100,32,99,111,110,116,101,110,116,32,105,115,32,115,116,111,114,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<35,32,98,101,102,111,114,101,32,32,45,45,45,45,45,45,45,45,45,45,45,45,45,45,45,98,114,97,110,99,104,45,114,101,115,101,116,45,45,45,45,45,45,45,45,45,45,45,32,97,102,116,101,114,10,47,32,40,32,97,32,41,32,32,40,63,124,32,120,32,40,32,121,32,41,32,122,32,124,32,40,112,32,40,113,41,32,114,41,32,124,32,40,116,41,32,117,32,40,118,41,32,41,32,40,32,122,32,41,32,47,120,10,35,32,49,32,32,32,32,32,32,32,32,32,32,32,32,50,32,32,32,32,32,32,32,32,32,50,32,32,51,32,32,32,32,32,32,32,32,50,32,32,32,32,32,51,32,32,32,32,32,52>>]}]},{p,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,117,115,101,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,118,97,108,117,101,32,116,104,97,116,32,105,115,32,115,101,116,32,102,111,114,32,116,104,97,116,32,110,117,109,98,101,114,32,98,121,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,111,114,32,34,100,101,102,100,101,102,34,58>>]},{pre,[],[{code,[],[<<47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,92,49,47>>]}]},{p,[],[<<73,110,32,99,111,110,116,114,97,115,116,44,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,114,101,102,101,114,115,32,116,111,32,116,104,101,32,102,105,114,115,116,32,111,110,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,103,105,118,101,110,32,110,117,109,98,101,114,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,111,114,32,34,100,101,102,97,98,99,34,58>>]},{pre,[],[{code,[],[<<47,40,63,124,40,97,98,99,41,124,40,100,101,102,41,41,40,63,49,41,47>>]}]},{p,[],[<<73,102,32,97,32,99,111,110,100,105,116,105,111,110,32,116,101,115,116,32,102,111,114,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,118,105,110,103,32,109,97,116,99,104,101,100,32,114,101,102,101,114,115,32,116,111,32,97,32,110,111,110,45,117,110,105,113,117,101,32,110,117,109,98,101,114,44,32,116,104,101,32,116,101,115,116,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,118,101,32,109,97,116,99,104,101,100,46>>]},{p,[],[<<65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,117,115,105,110,103,32,116,104,105,115,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,102,101,97,116,117,114,101,32,105,115,32,116,111,32,117,115,101,32,100,117,112,108,105,99,97,116,101,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46>>]},{a,[{id,<<115,101,99,116,49,51>>}],[]},{h2,[],[<<78,97,109,101,100,32,83,117,98,112,97,116,116,101,114,110,115>>]},{p,[],[<<73,100,101,110,116,105,102,121,105,110,103,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,98,121,32,110,117,109,98,101,114,32,105,115,32,115,105,109,112,108,101,44,32,98,117,116,32,105,116,32,99,97,110,32,98,101,32,104,97,114,100,32,116,111,32,107,101,101,112,32,116,114,97,99,107,32,111,102,32,116,104,101,32,110,117,109,98,101,114,115,32,105,110,32,99,111,109,112,108,105,99,97,116,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,46,32,65,108,115,111,44,32,105,102,32,97,110,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,109,111,100,105,102,105,101,100,44,32,116,104,101,32,110,117,109,98,101,114,115,32,99,97,110,32,99,104,97,110,103,101,46,32,84,111,32,104,101,108,112,32,119,105,116,104,32,116,104,105,115,32,100,105,102,102,105,99,117,108,116,121,44,32,80,67,82,69,32,115,117,112,112,111,114,116,115,32,116,104,101,32,110,97,109,105,110,103,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,105,115,32,102,101,97,116,117,114,101,32,119,97,115,32,110,111,116,32,97,100,100,101,100,32,116,111,32,80,101,114,108,32,117,110,116,105,108,32,114,101,108,101,97,115,101,32,53,46,49,48,46,32,80,121,116,104,111,110,32,104,97,100,32,116,104,101,32,102,101,97,116,117,114,101,32,101,97,114,108,105,101,114,44,32,97,110,100,32,80,67,82,69,32,105,110,116,114,111,100,117,99,101,100,32,105,116,32,97,116,32,114,101,108,101,97,115,101,32,52,46,48,44,32,117,115,105,110,103,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,67,82,69,32,110,111,119,32,115,117,112,112,111,114,116,115,32,98,111,116,104,32,116,104,101,32,80,101,114,108,32,97,110,100,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,46,32,80,101,114,108,32,97,108,108,111,119,115,32,105,100,101,110,116,105,99,97,108,108,121,32,110,117,109,98,101,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,104,97,118,101,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,44,32,98,117,116,32,80,67,82,69,32,100,111,101,115,32,110,111,116,46>>]},{p,[],[<<73,110,32,80,67,82,69,44,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,110,97,109,101,100,32,105,110,32,111,110,101,32,111,102,32,116,104,114,101,101,32,119,97,121,115,58,32>>,{code,[],[<<40,63,60,110,97,109,101,62,46,46,46,41>>]},<<32,111,114,32>>,{code,[],[<<40,63,39,110,97,109,101,39,46,46,46,41>>]},<<32,97,115,32,105,110,32,80,101,114,108,44,32,111,114,32>>,{code,[],[<<40,63,80,60,110,97,109,101,62,46,46,46,41>>]},<<32,97,115,32,105,110,32,80,121,116,104,111,110,46,32,82,101,102,101,114,101,110,99,101,115,32,116,111,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,102,114,111,109,32,111,116,104,101,114,32,112,97,114,116,115,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,115,117,99,104,32,97,115,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,44,32,114,101,99,117,114,115,105,111,110,44,32,97,110,100,32,99,111,110,100,105,116,105,111,110,115,44,32,99,97,110,32,98,101,32,109,97,100,101,32,98,121,32,110,97,109,101,32,97,110,100,32,98,121,32,110,117,109,98,101,114,46>>]},{p,[],[<<78,97,109,101,115,32,99,111,110,115,105,115,116,32,111,102,32,117,112,32,116,111,32,51,50,32,97,108,112,104,97,110,117,109,101,114,105,99,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,117,110,100,101,114,115,99,111,114,101,115,44,32,98,117,116,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,110,111,110,45,100,105,103,105,116,46,32,78,97,109,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,115,116,105,108,108,32,97,108,108,111,99,97,116,101,100,32,110,117,109,98,101,114,115,32,97,115,32,119,101,108,108,32,97,115,32,110,97,109,101,115,44,32,101,120,97,99,116,108,121,32,97,115,32,105,102,32,116,104,101,32,110,97,109,101,115,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<32,99,97,110,32,117,115,101,32,110,97,109,101,100,32,118,97,108,117,101,115,32,105,102,32,116,104,101,121,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,97,32,110,97,109,101,32,109,117,115,116,32,98,101,32,117,110,105,113,117,101,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,44,32,98,117,116,32,116,104,105,115,32,99,111,110,115,116,114,97,105,110,116,32,99,97,110,32,98,101,32,114,101,108,97,120,101,100,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<100,117,112,110,97,109,101,115>>]},<<32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,46,32,40,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,97,114,101,32,97,108,115,111,32,97,108,119,97,121,115,32,112,101,114,109,105,116,116,101,100,32,102,111,114,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,115,101,116,32,117,112,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41,32,68,117,112,108,105,99,97,116,101,32,110,97,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,112,97,116,116,101,114,110,115,32,119,104,101,114,101,32,111,110,108,121,32,111,110,101,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,109,97,116,99,104,46,32,83,117,112,112,111,115,101,32,116,104,97,116,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,104,101,32,110,97,109,101,32,111,102,32,97,32,119,101,101,107,100,97,121,44,32,101,105,116,104,101,114,32,97,115,32,97,32,51,45,108,101,116,116,101,114,32,97,98,98,114,101,118,105,97,116,105,111,110,32,111,114,32,97,115,32,116,104,101,32,102,117,108,108,32,110,97,109,101,44,32,97,110,100,32,105,110,32,98,111,116,104,32,99,97,115,101,115,32,121,111,117,32,119,97,110,116,32,116,111,32,101,120,116,114,97,99,116,32,116,104,101,32,97,98,98,114,101,118,105,97,116,105,111,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,40,105,103,110,111,114,105,110,103,32,116,104,101,32,108,105,110,101,32,98,114,101,97,107,115,41,32,100,111,101,115,32,116,104,101,32,106,111,98,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<40,63,60,68,78,62,77,111,110,124,70,114,105,124,83,117,110,41,40,63,58,100,97,121,41,63,124,10,40,63,60,68,78,62,84,117,101,41,40,63,58,115,100,97,121,41,63,124,10,40,63,60,68,78,62,87,101,100,41,40,63,58,110,101,115,100,97,121,41,63,124,10,40,63,60,68,78,62,84,104,117,41,40,63,58,114,115,100,97,121,41,63,124,10,40,63,60,68,78,62,83,97,116,41,40,63,58,117,114,100,97,121,41,63>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,102,105,118,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,115,116,114,105,110,103,115,44,32,98,117,116,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,115,101,116,32,97,102,116,101,114,32,97,32,109,97,116,99,104,46,32,40,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,119,97,121,32,111,102,32,115,111,108,118,105,110,103,32,116,104,105,115,32,112,114,111,98,108,101,109,32,105,115,32,116,111,32,117,115,101,32,97,32,34,98,114,97,110,99,104,32,114,101,115,101,116,34,32,115,117,98,112,97,116,116,101,114,110,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,46,41>>]},{p,[],[<<70,111,114,32,99,97,112,116,117,114,105,110,103,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,119,104,105,99,104,32,110,97,109,101,115,32,97,114,101,32,110,111,116,32,117,110,105,113,117,101,44,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,111,99,99,117,114,114,101,110,99,101,32,40,99,111,117,110,116,101,100,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,41,32,105,115,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,105,102,32,116,104,101,32,110,97,109,101,32,105,115,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32>>,{code,[],[<<118,97,108,117,101,115>>]},<<32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,115,116,97,116,101,109,101,110,116,46,32,84,104,101,32>>,{code,[],[<<97,108,108,95,110,97,109,101,115>>]},<<32,99,97,112,116,117,114,105,110,103,32,118,97,108,117,101,32,109,97,116,99,104,101,115,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<89,111,117,32,99,97,110,110,111,116,32,117,115,101,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,116,111,32,100,105,115,116,105,110,103,117,105,115,104,32,98,101,116,119,101,101,110,32,116,119,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,97,115,32,80,67,82,69,32,117,115,101,115,32,111,110,108,121,32,116,104,101,32,110,117,109,98,101,114,115,32,119,104,101,110,32,109,97,116,99,104,105,110,103,46,32,70,111,114,32,116,104,105,115,32,114,101,97,115,111,110,44,32,97,110,32,101,114,114,111,114,32,105,115,32,103,105,118,101,110,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,105,102,32,100,105,102,102,101,114,101,110,116,32,110,97,109,101,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,46,32,72,111,119,101,118,101,114,44,32,121,111,117,32,99,97,110,32,115,112,101,99,105,102,121,32,116,104,101,32,115,97,109,101,32,110,97,109,101,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,44,32,101,118,101,110,32,119,104,101,110,32>>,{code,[],[<<100,117,112,110,97,109,101,115>>]},<<32,105,115,32,110,111,116,32,115,101,116,46>>]}]},{a,[{id,<<115,101,99,116,49,52>>}],[]},{h2,[],[<<82,101,112,101,116,105,116,105,111,110>>]},{p,[],[<<82,101,112,101,116,105,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,113,117,97,110,116,105,102,105,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,102,111,108,108,111,119,32,97,110,121,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,116,101,109,115,58>>]},{ul,[],[{li,[],[<<65,32,108,105,116,101,114,97,108,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114>>]},{li,[],[<<84,104,101,32,100,111,116,32,109,101,116,97,99,104,97,114,97,99,116,101,114>>]},{li,[],[<<84,104,101,32,92,67,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101>>]},{li,[],[<<84,104,101,32,92,88,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101>>]},{li,[],[<<84,104,101,32,92,82,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101>>]},{li,[],[<<65,110,32,101,115,99,97,112,101,32,115,117,99,104,32,97,115,32,92,100,32,111,114,32,92,112,76,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114>>]},{li,[],[<<65,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115>>]},{li,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41>>]},{li,[],[<<65,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,40,105,110,99,108,117,100,105,110,103,32,97,115,115,101,114,116,105,111,110,115,41>>]},{li,[],[<<65,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,114,101,99,117,114,115,105,118,101,32,111,114,32,111,116,104,101,114,119,105,115,101,41>>]}]},{p,[],[<<84,104,101,32,103,101,110,101,114,97,108,32,114,101,112,101,116,105,116,105,111,110,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,32,109,105,110,105,109,117,109,32,97,110,100,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,101,114,109,105,116,116,101,100,32,109,97,116,99,104,101,115,44,32,98,121,32,103,105,118,105,110,103,32,116,104,101,32,116,119,111,32,110,117,109,98,101,114,115,32,105,110,32,99,117,114,108,121,32,98,114,97,99,107,101,116,115,32,40,98,114,97,99,101,115,41,44,32,115,101,112,97,114,97,116,101,100,32,98,121,32,97,32,99,111,109,109,97,46,32,84,104,101,32,110,117,109,98,101,114,115,32,109,117,115,116,32,98,101,32,60,32,54,53,53,51,54,44,32,97,110,100,32,116,104,101,32,102,105,114,115,116,32,109,117,115,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,111,114,32,101,113,117,97,108,32,116,111,32,116,104,101,32,115,101,99,111,110,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,122,122,34,44,32,34,122,122,122,34,44,32,111,114,32,34,122,122,122,122,34,58>>]},{pre,[],[{code,[],[<<122,123,50,44,52,125>>]}]},{p,[],[<<65,32,99,108,111,115,105,110,103,32,98,114,97,99,101,32,111,110,32,105,116,115,32,111,119,110,32,105,115,32,110,111,116,32,97,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,32,105,115,32,111,109,105,116,116,101,100,44,32,98,117,116,32,116,104,101,32,99,111,109,109,97,32,105,115,32,112,114,101,115,101,110,116,44,32,116,104,101,114,101,32,105,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,46,32,73,102,32,116,104,101,32,115,101,99,111,110,100,32,110,117,109,98,101,114,32,97,110,100,32,116,104,101,32,99,111,109,109,97,32,97,114,101,32,98,111,116,104,32,111,109,105,116,116,101,100,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,101,120,97,99,116,32,110,117,109,98,101,114,32,111,102,32,114,101,113,117,105,114,101,100,32,109,97,116,99,104,101,115,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,116,32,108,101,97,115,116,32,116,104,114,101,101,32,115,117,99,99,101,115,115,105,118,101,32,118,111,119,101,108,115,44,32,98,117,116,32,99,97,110,32,109,97,116,99,104,32,109,97,110,121,32,109,111,114,101,58>>]},{pre,[],[{code,[],[<<91,97,101,105,111,117,93,123,51,44,125>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,101,120,97,99,116,108,121,32,101,105,103,104,116,32,100,105,103,105,116,115,58>>]},{pre,[],[{code,[],[<<92,100,123,56,125>>]}]},{p,[],[<<65,110,32,111,112,101,110,105,110,103,32,99,117,114,108,121,32,98,114,97,99,107,101,116,32,116,104,97,116,32,97,112,112,101,97,114,115,32,105,110,32,97,32,112,111,115,105,116,105,111,110,32,119,104,101,114,101,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,44,32,111,114,32,111,110,101,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,116,104,101,32,115,121,110,116,97,120,32,111,102,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32,108,105,116,101,114,97,108,32,99,104,97,114,97,99,116,101,114,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,123,44,54,125,32,105,115,32,110,111,116,32,97,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,97,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,32,111,102,32,102,111,117,114,32,99,104,97,114,97,99,116,101,114,115,46>>]},{p,[],[<<73,110,32,85,110,105,99,111,100,101,32,109,111,100,101,44,32,113,117,97,110,116,105,102,105,101,114,115,32,97,112,112,108,121,32,116,111,32,99,104,97,114,97,99,116,101,114,115,32,114,97,116,104,101,114,32,116,104,97,110,32,116,111,32,105,110,100,105,118,105,100,117,97,108,32,100,97,116,97,32,117,110,105,116,115,46,32,84,104,117,115,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,92,120,123,49,48,48,125,123,50,125,32,109,97,116,99,104,101,115,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,50,45,98,121,116,101,32,115,101,113,117,101,110,99,101,32,105,110,32,97,32,85,84,70,45,56,32,115,116,114,105,110,103,46,32,83,105,109,105,108,97,114,108,121,44,32,92,88,123,51,125,32,109,97,116,99,104,101,115,32,116,104,114,101,101,32,85,110,105,99,111,100,101,32,101,120,116,101,110,100,101,100,32,103,114,97,112,104,101,109,101,32,99,108,117,115,116,101,114,115,44,32,101,97,99,104,32,111,102,32,119,104,105,99,104,32,99,97,110,32,98,101,32,109,97,110,121,32,100,97,116,97,32,117,110,105,116,115,32,108,111,110,103,32,40,97,110,100,32,116,104,101,121,32,99,97,110,32,98,101,32,111,102,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,41,46>>]},{p,[],[<<84,104,101,32,113,117,97,110,116,105,102,105,101,114,32,123,48,125,32,105,115,32,112,101,114,109,105,116,116,101,100,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,116,111,32,98,101,104,97,118,101,32,97,115,32,105,102,32,116,104,101,32,112,114,101,118,105,111,117,115,32,105,116,101,109,32,97,110,100,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,119,101,114,101,32,110,111,116,32,112,114,101,115,101,110,116,46,32,84,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,102,111,114,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,40,98,117,116,32,115,101,101,32,97,108,115,111,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,98,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121>>]},<<41,46,32,73,116,101,109,115,32,111,116,104,101,114,32,116,104,97,110,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,104,97,118,101,32,97,32,123,48,125,32,113,117,97,110,116,105,102,105,101,114,32,97,114,101,32,111,109,105,116,116,101,100,32,102,114,111,109,32,116,104,101,32,99,111,109,112,105,108,101,100,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<70,111,114,32,99,111,110,118,101,110,105,101,110,99,101,44,32,116,104,101,32,116,104,114,101,101,32,109,111,115,116,32,99,111,109,109,111,110,32,113,117,97,110,116,105,102,105,101,114,115,32,104,97,118,101,32,115,105,110,103,108,101,45,99,104,97,114,97,99,116,101,114,32,97,98,98,114,101,118,105,97,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[<<42>>]},{dd,[],[<<69,113,117,105,118,97,108,101,110,116,32,116,111,32,123,48,44,125>>]},{dt,[],[<<43>>]},{dd,[],[<<69,113,117,105,118,97,108,101,110,116,32,116,111,32,123,49,44,125>>]},{dt,[],[<<63>>]},{dd,[],[<<69,113,117,105,118,97,108,101,110,116,32,116,111,32,123,48,44,49,125>>]}]},{p,[],[<<73,110,102,105,110,105,116,101,32,108,111,111,112,115,32,99,97,110,32,98,101,32,99,111,110,115,116,114,117,99,116,101,100,32,98,121,32,102,111,108,108,111,119,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,109,97,116,99,104,32,110,111,32,99,104,97,114,97,99,116,101,114,115,32,119,105,116,104,32,97,32,113,117,97,110,116,105,102,105,101,114,32,116,104,97,116,32,104,97,115,32,110,111,32,117,112,112,101,114,32,108,105,109,105,116,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,63,41,42>>]}]},{p,[],[<<69,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,101,114,108,32,97,110,100,32,80,67,82,69,32,117,115,101,100,32,116,111,32,103,105,118,101,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,32,102,111,114,32,115,117,99,104,32,112,97,116,116,101,114,110,115,46,32,72,111,119,101,118,101,114,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,105,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,44,32,115,117,99,104,32,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,119,32,97,99,99,101,112,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,110,121,32,114,101,112,101,116,105,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,110,111,32,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,108,111,111,112,32,105,115,32,102,111,114,99,105,98,108,121,32,98,114,111,107,101,110,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,34,103,114,101,101,100,121,34,44,32,116,104,97,116,32,105,115,44,32,116,104,101,121,32,109,97,116,99,104,32,97,115,32,109,117,99,104,32,97,115,32,112,111,115,115,105,98,108,101,32,40,117,112,32,116,111,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,101,114,109,105,116,116,101,100,32,116,105,109,101,115,41,44,32,119,105,116,104,111,117,116,32,99,97,117,115,105,110,103,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,111,102,32,119,104,101,114,101,32,116,104,105,115,32,103,105,118,101,115,32,112,114,111,98,108,101,109,115,32,105,115,32,105,110,32,116,114,121,105,110,103,32,116,111,32,109,97,116,99,104,32,99,111,109,109,101,110,116,115,32,105,110,32,67,32,112,114,111,103,114,97,109,115,46,32,84,104,101,115,101,32,97,112,112,101,97,114,32,98,101,116,119,101,101,110,32,47,42,32,97,110,100,32,42,47,46,32,87,105,116,104,105,110,32,116,104,101,32,99,111,109,109,101,110,116,44,32,105,110,100,105,118,105,100,117,97,108,32,42,32,97,110,100,32,47,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,97,112,112,101,97,114,46,32,65,110,32,97,116,116,101,109,112,116,32,116,111,32,109,97,116,99,104,32,67,32,99,111,109,109,101,110,116,115,32,98,121,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110>>]},{pre,[],[{code,[],[<<47,92,42,46,42,92,42,47>>]}]},{p,[],[<<116,111,32,116,104,101,32,115,116,114,105,110,103>>]},{pre,[],[{code,[],[<<47,42,32,102,105,114,115,116,32,99,111,109,109,101,110,116,32,42,47,32,32,110,111,116,32,99,111,109,109,101,110,116,32,32,47,42,32,115,101,99,111,110,100,32,99,111,109,109,101,110,116,32,42,47>>]}]},{p,[],[<<102,97,105,108,115,44,32,97,115,32,105,116,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,111,119,105,110,103,32,116,111,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,46,42,32,105,116,101,109,46>>]},{p,[],[<<72,111,119,101,118,101,114,44,32,105,102,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,44,32,105,116,32,99,101,97,115,101,115,32,116,111,32,98,101,32,103,114,101,101,100,121,44,32,97,110,100,32,105,110,115,116,101,97,100,32,109,97,116,99,104,101,115,32,116,104,101,32,109,105,110,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,112,111,115,115,105,98,108,101,44,32,115,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,100,111,101,115,32,116,104,101,32,114,105,103,104,116,32,116,104,105,110,103,32,119,105,116,104,32,116,104,101,32,67,32,99,111,109,109,101,110,116,115,58>>]},{pre,[],[{code,[],[<<47,92,42,46,42,63,92,42,47>>]}]},{p,[],[<<84,104,101,32,109,101,97,110,105,110,103,32,111,102,32,116,104,101,32,118,97,114,105,111,117,115,32,113,117,97,110,116,105,102,105,101,114,115,32,105,115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32,99,104,97,110,103,101,100,44,32,111,110,108,121,32,116,104,101,32,112,114,101,102,101,114,114,101,100,32,110,117,109,98,101,114,32,111,102,32,109,97,116,99,104,101,115,46,32,68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,116,104,105,115,32,117,115,101,32,111,102,32,113,117,101,115,116,105,111,110,32,109,97,114,107,32,119,105,116,104,32,105,116,115,32,117,115,101,32,97,115,32,97,32,113,117,97,110,116,105,102,105,101,114,32,105,110,32,105,116,115,32,111,119,110,32,114,105,103,104,116,46,32,65,115,32,105,116,32,104,97,115,32,116,119,111,32,117,115,101,115,44,32,105,116,32,99,97,110,32,115,111,109,101,116,105,109,101,115,32,97,112,112,101,97,114,32,100,111,117,98,108,101,100,44,32,97,115,32,105,110>>]},{pre,[],[{code,[],[<<92,100,63,63,92,100>>]}]},{p,[],[<<119,104,105,99,104,32,109,97,116,99,104,101,115,32,111,110,101,32,100,105,103,105,116,32,98,121,32,112,114,101,102,101,114,101,110,99,101,44,32,98,117,116,32,99,97,110,32,109,97,116,99,104,32,116,119,111,32,105,102,32,116,104,97,116,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,46>>]},{p,[],[<<73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,103,114,101,101,100,121>>]},<<32,105,115,32,115,101,116,32,40,97,110,32,111,112,116,105,111,110,32,116,104,97,116,32,105,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,32,105,110,32,80,101,114,108,41,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,105,110,100,105,118,105,100,117,97,108,32,111,110,101,115,32,99,97,110,32,98,101,32,109,97,100,101,32,103,114,101,101,100,121,32,98,121,32,102,111,108,108,111,119,105,110,103,32,116,104,101,109,32,119,105,116,104,32,97,32,113,117,101,115,116,105,111,110,32,109,97,114,107,46,32,84,104,97,116,32,105,115,44,32,105,116,32,105,110,118,101,114,116,115,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,46>>]},{p,[],[<<87,104,101,110,32,97,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,113,117,97,110,116,105,102,105,101,100,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,114,101,112,101,97,116,32,99,111,117,110,116,32,116,104,97,116,32,105,115,32,62,32,49,32,111,114,32,119,105,116,104,32,97,32,108,105,109,105,116,101,100,32,109,97,120,105,109,117,109,44,32,109,111,114,101,32,109,101,109,111,114,121,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,116,104,101,32,99,111,109,112,105,108,101,100,32,112,97,116,116,101,114,110,44,32,105,110,32,112,114,111,112,111,114,116,105,111,110,32,116,111,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,109,105,110,105,109,117,109,32,111,114,32,109,97,120,105,109,117,109,46>>]},{p,[],[<<73,102,32,97,32,112,97,116,116,101,114,110,32,115,116,97,114,116,115,32,119,105,116,104,32,46,42,32,111,114,32,46,123,48,44,125,32,97,110,100,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,40,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,115>>]},<<41,32,105,115,32,115,101,116,44,32,116,104,117,115,32,97,108,108,111,119,105,110,103,32,116,104,101,32,100,111,116,32,116,111,32,109,97,116,99,104,32,110,101,119,108,105,110,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,44,32,98,101,99,97,117,115,101,32,119,104,97,116,101,118,101,114,32,102,111,108,108,111,119,115,32,105,115,32,116,114,105,101,100,32,97,103,97,105,110,115,116,32,101,118,101,114,121,32,99,104,97,114,97,99,116,101,114,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,83,111,44,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,114,101,116,114,121,105,110,103,32,116,104,101,32,111,118,101,114,97,108,108,32,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,115,105,116,105,111,110,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,46,32,80,67,82,69,32,110,111,114,109,97,108,108,121,32,116,114,101,97,116,115,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,97,115,32,105,102,32,105,116,32,119,97,115,32,112,114,101,99,101,100,101,100,32,98,121,32,92,65,46>>]},{p,[],[<<73,110,32,99,97,115,101,115,32,119,104,101,114,101,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,115,32,110,111,32,110,101,119,108,105,110,101,115,44,32,105,116,32,105,115,32,119,111,114,116,104,32,115,101,116,116,105,110,103,32>>,{code,[],[<<100,111,116,97,108,108>>]},<<32,116,111,32,111,98,116,97,105,110,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,44,32,111,114,32,97,108,116,101,114,110,97,116,105,118,101,108,121,32,117,115,105,110,103,32,94,32,116,111,32,105,110,100,105,99,97,116,101,32,97,110,99,104,111,114,105,110,103,32,101,120,112,108,105,99,105,116,108,121,46>>]},{p,[],[<<72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,99,97,115,101,115,32,119,104,101,114,101,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,99,97,110,110,111,116,32,98,101,32,117,115,101,100,46,32,87,104,101,110,32,46,42,32,105,115,32,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,116,104,101,32,115,117,98,106,101,99,116,32,111,102,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,101,108,115,101,119,104,101,114,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,32,111,110,101,32,115,117,99,99,101,101,100,115,46,32,67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,46,42,41,97,98,99,92,49>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,120,121,122,49,50,51,97,98,99,49,50,51,34,44,32,116,104,101,32,109,97,116,99,104,32,112,111,105,110,116,32,105,115,32,116,104,101,32,102,111,117,114,116,104,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,114,101,102,111,114,101,44,32,115,117,99,104,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,105,109,112,108,105,99,105,116,108,121,32,97,110,99,104,111,114,101,100,46>>]},{p,[],[<<65,110,111,116,104,101,114,32,99,97,115,101,32,119,104,101,114,101,32,105,109,112,108,105,99,105,116,32,97,110,99,104,111,114,105,110,103,32,105,115,32,110,111,116,32,97,112,112,108,105,101,100,32,105,115,32,119,104,101,110,32,116,104,101,32,108,101,97,100,105,110,103,32,46,42,32,105,115,32,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,97,103,97,105,110,44,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,115,116,97,114,116,32,99,97,110,32,102,97,105,108,32,119,104,101,114,101,32,97,32,108,97,116,101,114,32,111,110,101,32,115,117,99,99,101,101,100,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,63,62,46,42,63,97,41,98>>]}]},{p,[],[<<73,116,32,109,97,116,99,104,101,115,32,34,97,98,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,34,97,97,98,34,46,32,84,104,101,32,117,115,101,32,111,102,32,116,104,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,115,32,40,42,80,82,85,78,69,41,32,97,110,100,32,40,42,83,75,73,80,41,32,97,108,115,111,32,100,105,115,97,98,108,101,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,46>>]},{p,[],[<<87,104,101,110,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,114,101,112,101,97,116,101,100,44,32,116,104,101,32,118,97,108,117,101,32,99,97,112,116,117,114,101,100,32,105,115,32,116,104,101,32,115,117,98,115,116,114,105,110,103,32,116,104,97,116,32,109,97,116,99,104,101,100,32,116,104,101,32,102,105,110,97,108,32,105,116,101,114,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,102,116,101,114>>]},{pre,[],[{code,[],[<<40,116,119,101,101,100,108,101,91,100,117,109,101,93,123,51,125,92,115,42,41,43>>]}]},{p,[],[<<104,97,115,32,109,97,116,99,104,101,100,32,34,116,119,101,101,100,108,101,100,117,109,32,116,119,101,101,100,108,101,100,101,101,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,32,34,116,119,101,101,100,108,101,100,101,101,34,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,101,115,116,101,100,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,116,104,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,32,99,97,110,32,104,97,118,101,32,98,101,101,110,32,115,101,116,32,105,110,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,102,116,101,114>>]},{pre,[],[{code,[],[<<47,40,97,124,40,98,41,41,43,47>>]}]},{p,[],[<<109,97,116,99,104,101,115,32,34,97,98,97,34,44,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,115,101,99,111,110,100,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,32,105,115,32,34,98,34,46>>]},{a,[{id,<<115,101,99,116,49,53>>}],[]},{h2,[],[<<65,116,111,109,105,99,32,71,114,111,117,112,105,110,103,32,97,110,100,32,80,111,115,115,101,115,115,105,118,101,32,81,117,97,110,116,105,102,105,101,114,115>>]},{p,[],[<<87,105,116,104,32,98,111,116,104,32,109,97,120,105,109,105,122,105,110,103,32,40,34,103,114,101,101,100,121,34,41,32,97,110,100,32,109,105,110,105,109,105,122,105,110,103,32,40,34,117,110,103,114,101,101,100,121,34,32,111,114,32,34,108,97,122,121,34,41,32,114,101,112,101,116,105,116,105,111,110,44,32,102,97,105,108,117,114,101,32,111,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,110,111,114,109,97,108,108,121,32,99,97,117,115,101,115,32,116,104,101,32,114,101,112,101,97,116,101,100,32,105,116,101,109,32,116,111,32,98,101,32,114,101,45,101,118,97,108,117,97,116,101,100,32,116,111,32,115,101,101,32,105,102,32,97,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,32,111,102,32,114,101,112,101,97,116,115,32,97,108,108,111,119,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,46,32,83,111,109,101,116,105,109,101,115,32,105,116,32,105,115,32,117,115,101,102,117,108,32,116,111,32,112,114,101,118,101,110,116,32,116,104,105,115,44,32,101,105,116,104,101,114,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,110,97,116,117,114,101,32,111,102,32,116,104,101,32,109,97,116,99,104,44,32,111,114,32,116,111,32,99,97,117,115,101,32,105,116,32,116,111,32,102,97,105,108,32,101,97,114,108,105,101,114,32,116,104,97,110,32,105,116,32,111,116,104,101,114,119,105,115,101,32,109,105,103,104,116,44,32,119,104,101,110,32,116,104,101,32,97,117,116,104,111,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,107,110,111,119,115,32,116,104,97,116,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,99,97,114,114,121,105,110,103,32,111,110,46>>]},{p,[],[<<67,111,110,115,105,100,101,114,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,112,97,116,116,101,114,110,32,92,100,43,102,111,111,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,117,98,106,101,99,116,32,108,105,110,101,58>>]},{pre,[],[{code,[],[<<49,50,51,52,53,54,98,97,114>>]}]},{p,[],[<<65,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,108,108,32,115,105,120,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,44,32,116,104,101,32,110,111,114,109,97,108,32,97,99,116,105,111,110,32,111,102,32,116,104,101,32,109,97,116,99,104,101,114,32,105,115,32,116,111,32,116,114,121,32,97,103,97,105,110,32,119,105,116,104,32,111,110,108,121,32,102,105,118,101,32,100,105,103,105,116,115,32,109,97,116,99,104,105,110,103,32,105,116,101,109,32,92,100,43,44,32,97,110,100,32,116,104,101,110,32,119,105,116,104,32,102,111,117,114,44,32,97,110,100,32,115,111,32,111,110,44,32,98,101,102,111,114,101,32,117,108,116,105,109,97,116,101,108,121,32,102,97,105,108,105,110,103,46,32,34,65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,34,32,40,97,32,116,101,114,109,32,116,97,107,101,110,32,102,114,111,109,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,39,115,32,98,111,111,107,41,32,112,114,111,118,105,100,101,115,32,116,104,101,32,109,101,97,110,115,32,102,111,114,32,115,112,101,99,105,102,121,105,110,103,32,116,104,97,116,32,111,110,99,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,109,97,116,99,104,101,100,44,32,105,116,32,105,115,32,110,111,116,32,116,111,32,98,101,32,114,101,45,101,118,97,108,117,97,116,101,100,32,105,110,32,116,104,105,115,32,119,97,121,46>>]},{p,[],[<<73,102,32,97,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,105,115,32,117,115,101,100,32,102,111,114,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,103,105,118,101,115,32,117,112,32,105,109,109,101,100,105,97,116,101,108,121,32,111,110,32,102,97,105,108,105,110,103,32,116,111,32,109,97,116,99,104,32,34,102,111,111,34,32,116,104,101,32,102,105,114,115,116,32,116,105,109,101,46,32,84,104,101,32,110,111,116,97,116,105,111,110,32,105,115,32,97,32,107,105,110,100,32,111,102,32,115,112,101,99,105,97,108,32,112,97,114,101,110,116,104,101,115,105,115,44,32,115,116,97,114,116,105,110,103,32,119,105,116,104,32>>,{code,[],[<<40,63,62>>]},<<32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,63,62,92,100,43,41,102,111,111>>]}]},{p,[],[<<84,104,105,115,32,107,105,110,100,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,34,108,111,99,107,115,32,117,112,34,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,32,99,111,110,116,97,105,110,115,32,111,110,99,101,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,44,32,97,110,100,32,97,32,102,97,105,108,117,114,101,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,112,114,101,118,101,110,116,101,100,32,102,114,111,109,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,112,97,115,116,32,105,116,32,116,111,32,112,114,101,118,105,111,117,115,32,105,116,101,109,115,44,32,104,111,119,101,118,101,114,44,32,119,111,114,107,115,32,97,115,32,110,111,114,109,97,108,46>>]},{p,[],[<<65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,100,101,115,99,114,105,112,116,105,111,110,32,105,115,32,116,104,97,116,32,97,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,105,115,32,116,121,112,101,32,109,97,116,99,104,101,115,32,116,104,101,32,115,116,114,105,110,103,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,110,32,105,100,101,110,116,105,99,97,108,32,115,116,97,110,100,97,108,111,110,101,32,112,97,116,116,101,114,110,32,119,111,117,108,100,32,109,97,116,99,104,44,32,105,102,32,97,110,99,104,111,114,101,100,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]},{p,[],[<<65,116,111,109,105,99,32,103,114,111,117,112,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,83,105,109,112,108,101,32,99,97,115,101,115,32,115,117,99,104,32,97,115,32,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,109,97,120,105,109,105,122,105,110,103,32,114,101,112,101,97,116,32,116,104,97,116,32,109,117,115,116,32,115,119,97,108,108,111,119,32,101,118,101,114,121,116,104,105,110,103,32,105,116,32,99,97,110,46,32,83,111,44,32,119,104,105,108,101,32,98,111,116,104,32,92,100,43,32,97,110,100,32,92,100,43,63,32,97,114,101,32,112,114,101,112,97,114,101,100,32,116,111,32,97,100,106,117,115,116,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,100,105,103,105,116,115,32,116,104,101,121,32,109,97,116,99,104,32,116,111,32,109,97,107,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,44,32>>,{code,[],[<<40,63,62,92,100,43,41>>]},<<32,99,97,110,32,111,110,108,121,32,109,97,116,99,104,32,97,110,32,101,110,116,105,114,101,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,46>>]},{p,[],[<<65,116,111,109,105,99,32,103,114,111,117,112,115,32,105,110,32,103,101,110,101,114,97,108,32,99,97,110,32,99,111,110,116,97,105,110,32,97,110,121,32,99,111,109,112,108,105,99,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,97,110,100,32,99,97,110,32,98,101,32,110,101,115,116,101,100,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,102,111,114,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,106,117,115,116,32,97,32,115,105,110,103,108,101,32,114,101,112,101,97,116,101,100,32,105,116,101,109,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,97,32,115,105,109,112,108,101,114,32,110,111,116,97,116,105,111,110,44,32,99,97,108,108,101,100,32,97,32,34,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,34,32,99,97,110,32,98,101,32,117,115,101,100,46,32,84,104,105,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,110,32,101,120,116,114,97,32,43,32,99,104,97,114,97,99,116,101,114,32,102,111,108,108,111,119,105,110,103,32,97,32,113,117,97,110,116,105,102,105,101,114,46,32,85,115,105,110,103,32,116,104,105,115,32,110,111,116,97,116,105,111,110,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,97,115>>]},{pre,[],[{code,[],[<<92,100,43,43,102,111,111>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,97,110,32,101,110,116,105,114,101,32,103,114,111,117,112,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,98,99,124,120,121,122,41,123,50,44,51,125,43>>]}]},{p,[],[<<80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,97,108,119,97,121,115,32,103,114,101,101,100,121,59,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,103,114,101,101,100,121>>]},<<32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,121,32,97,114,101,32,97,32,99,111,110,118,101,110,105,101,110,116,32,110,111,116,97,116,105,111,110,32,102,111,114,32,116,104,101,32,115,105,109,112,108,101,114,32,102,111,114,109,115,32,111,102,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,72,111,119,101,118,101,114,44,32,116,104,101,114,101,32,105,115,32,110,111,32,100,105,102,102,101,114,101,110,99,101,32,105,110,32,116,104,101,32,109,101,97,110,105,110,103,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,116,104,101,32,101,113,117,105,118,97,108,101,110,116,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,98,117,116,32,116,104,101,114,101,32,99,97,110,32,98,101,32,97,32,112,101,114,102,111,114,109,97,110,99,101,32,100,105,102,102,101,114,101,110,99,101,59,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,97,114,101,32,112,114,111,98,97,98,108,121,32,115,108,105,103,104,116,108,121,32,102,97,115,116,101,114,46>>]},{p,[],[<<84,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,115,121,110,116,97,120,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,116,104,101,32,80,101,114,108,32,53,46,56,32,115,121,110,116,97,120,46,32,74,101,102,102,114,101,121,32,70,114,105,101,100,108,32,111,114,105,103,105,110,97,116,101,100,32,116,104,101,32,105,100,101,97,32,40,97,110,100,32,116,104,101,32,110,97,109,101,41,32,105,110,32,116,104,101,32,102,105,114,115,116,32,101,100,105,116,105,111,110,32,111,102,32,104,105,115,32,98,111,111,107,46,32,77,105,107,101,32,77,99,67,108,111,115,107,101,121,32,108,105,107,101,100,32,105,116,44,32,115,111,32,105,109,112,108,101,109,101,110,116,101,100,32,105,116,32,119,104,101,110,32,104,101,32,98,117,105,108,116,32,116,104,101,32,83,117,110,32,74,97,118,97,32,112,97,99,107,97,103,101,44,32,97,110,100,32,80,67,82,69,32,99,111,112,105,101,100,32,105,116,32,102,114,111,109,32,116,104,101,114,101,46,32,73,116,32,117,108,116,105,109,97,116,101,108,121,32,102,111,117,110,100,32,105,116,115,32,119,97,121,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,48,46>>]},{p,[],[<<80,67,82,69,32,104,97,115,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,34,112,111,115,115,101,115,115,105,102,105,101,115,34,32,99,101,114,116,97,105,110,32,115,105,109,112,108,101,32,112,97,116,116,101,114,110,32,99,111,110,115,116,114,117,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,115,101,113,117,101,110,99,101,32,65,43,66,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,65,43,43,66,44,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111,32,112,111,105,110,116,32,105,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,65,58,115,32,119,104,101,110,32,66,32,109,117,115,116,32,102,111,108,108,111,119,46>>]},{p,[],[<<87,104,101,110,32,97,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,99,97,110,32,105,116,115,101,108,102,32,98,101,32,114,101,112,101,97,116,101,100,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,105,115,32,116,104,101,32,111,110,108,121,32,119,97,121,32,116,111,32,97,118,111,105,100,32,115,111,109,101,32,102,97,105,108,105,110,103,32,109,97,116,99,104,101,115,32,116,97,107,105,110,103,32,97,32,108,111,110,103,32,116,105,109,101,46,32,84,104,101,32,112,97,116,116,101,114,110>>]},{pre,[],[{code,[],[<<40,92,68,43,124,60,92,100,43,62,41,42,91,33,63,93>>]}]},{p,[],[<<109,97,116,99,104,101,115,32,97,110,32,117,110,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,111,102,32,115,117,98,115,116,114,105,110,103,115,32,116,104,97,116,32,101,105,116,104,101,114,32,99,111,110,115,105,115,116,32,111,102,32,110,111,110,45,100,105,103,105,116,115,44,32,111,114,32,100,105,103,105,116,115,32,101,110,99,108,111,115,101,100,32,105,110,32,60,62,44,32,102,111,108,108,111,119,101,100,32,98,121,32,33,32,111,114,32,63,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,44,32,105,116,32,114,117,110,115,32,113,117,105,99,107,108,121,46,32,72,111,119,101,118,101,114,44,32,105,102,32,105,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111>>]},{pre,[],[{code,[],[<<97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97>>]}]},{p,[],[<<105,116,32,116,97,107,101,115,32,97,32,108,111,110,103,32,116,105,109,101,32,98,101,102,111,114,101,32,114,101,112,111,114,116,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,105,115,32,98,101,99,97,117,115,101,32,116,104,101,32,115,116,114,105,110,103,32,99,97,110,32,98,101,32,100,105,118,105,100,101,100,32,98,101,116,119,101,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,92,68,43,32,114,101,112,101,97,116,32,97,110,100,32,116,104,101,32,101,120,116,101,114,110,97,108,32,42,32,114,101,112,101,97,116,32,105,110,32,109,97,110,121,32,119,97,121,115,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,114,105,101,100,46,32,40,84,104,101,32,101,120,97,109,112,108,101,32,117,115,101,115,32,91,33,63,93,32,114,97,116,104,101,114,32,116,104,97,110,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,97,116,32,116,104,101,32,101,110,100,44,32,97,115,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,104,97,118,101,32,97,110,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,97,108,108,111,119,115,32,102,111,114,32,102,97,115,116,32,102,97,105,108,117,114,101,32,119,104,101,110,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,105,115,32,117,115,101,100,46,32,84,104,101,121,32,114,101,109,101,109,98,101,114,32,116,104,101,32,108,97,115,116,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,116,104,97,116,32,105,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,97,32,109,97,116,99,104,44,32,97,110,100,32,102,97,105,108,32,101,97,114,108,121,32,105,102,32,105,116,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,46,41,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,99,104,97,110,103,101,100,32,115,111,32,116,104,97,116,32,105,116,32,117,115,101,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,108,105,107,101,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,100,105,103,105,116,115,32,99,97,110,110,111,116,32,98,101,32,98,114,111,107,101,110,44,32,97,110,100,32,102,97,105,108,117,114,101,32,104,97,112,112,101,110,115,32,113,117,105,99,107,108,121,58>>]},{pre,[],[{code,[],[<<40,40,63,62,92,68,43,41,124,60,92,100,43,62,41,42,91,33,63,93>>]}]},{a,[{id,<<115,101,99,116,49,54>>}],[]},{h2,[],[<<66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]},{p,[],[<<79,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,97,32,98,97,99,107,115,108,97,115,104,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,100,105,103,105,116,32,62,32,48,32,40,97,110,100,32,112,111,115,115,105,98,108,121,32,102,117,114,116,104,101,114,32,100,105,103,105,116,115,41,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,101,97,114,108,105,101,114,32,40,116,104,97,116,32,105,115,44,32,116,111,32,105,116,115,32,108,101,102,116,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,44,32,112,114,111,118,105,100,101,100,32,116,104,101,114,101,32,104,97,118,101,32,98,101,101,110,32,116,104,97,116,32,109,97,110,121,32,112,114,101,118,105,111,117,115,32,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,100,101,99,105,109,97,108,32,110,117,109,98,101,114,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,32,105,115,32,60,32,49,48,44,32,105,116,32,105,115,32,97,108,119,97,121,115,32,116,97,107,101,110,32,97,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,97,110,100,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,97,114,101,32,110,111,116,32,116,104,97,116,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,108,101,102,116,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,32,100,111,32,110,101,101,100,32,110,111,116,32,98,101,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,102,111,114,32,110,117,109,98,101,114,115,32,60,32,49,48,46,32,65,32,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,110,32,109,97,107,101,32,115,101,110,115,101,32,119,104,101,110,32,97,32,114,101,112,101,116,105,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,32,97,110,100,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,114,105,103,104,116,32,104,97,115,32,112,97,114,116,105,99,105,112,97,116,101,100,32,105,110,32,97,110,32,101,97,114,108,105,101,114,32,105,116,101,114,97,116,105,111,110,46>>]},{p,[],[<<73,116,32,105,115,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,118,101,32,97,32,110,117,109,101,114,105,99,97,108,32,34,102,111,114,119,97,114,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,34,32,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,119,104,111,115,101,32,110,117,109,98,101,114,32,105,115,32,49,48,32,111,114,32,109,111,114,101,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,44,32,97,115,32,97,32,115,101,113,117,101,110,99,101,32,115,117,99,104,32,97,115,32,92,53,48,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,97,32,99,104,97,114,97,99,116,101,114,32,100,101,102,105,110,101,100,32,105,110,32,111,99,116,97,108,46,32,70,111,114,32,109,111,114,101,32,100,101,116,97,105,108,115,32,111,102,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,32,98,97,99,107,115,108,97,115,104,44,32,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,111,110,95,112,114,105,110,116,105,110,103,95,99,104,97,114,97,99,116,101,114,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,111,110,45,80,114,105,110,116,105,110,103,32,67,104,97,114,97,99,116,101,114,115>>]},<<32,101,97,114,108,105,101,114,46,32,84,104,101,114,101,32,105,115,32,110,111,32,115,117,99,104,32,112,114,111,98,108,101,109,32,119,104,101,110,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,117,115,101,100,46,32,65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,111,115,115,105,98,108,101,32,117,115,105,110,103,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,40,115,101,101,32,98,101,108,111,119,41,46>>]},{p,[],[<<65,110,111,116,104,101,114,32,119,97,121,32,116,111,32,97,118,111,105,100,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,105,110,104,101,114,101,110,116,32,105,110,32,116,104,101,32,117,115,101,32,111,102,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,97,32,98,97,99,107,115,108,97,115,104,32,105,115,32,116,111,32,117,115,101,32,116,104,101,32,92,103,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,46,32,84,104,105,115,32,101,115,99,97,112,101,32,109,117,115,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,111,114,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,98,114,97,99,101,115,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,32,97,114,101,32,105,100,101,110,116,105,99,97,108,58>>]},{pre,[],[{code,[],[<<40,114,105,110,103,41,44,32,92,49,10,40,114,105,110,103,41,44,32,92,103,49,10,40,114,105,110,103,41,44,32,92,103,123,49,125>>]}]},{p,[],[<<65,110,32,117,110,115,105,103,110,101,100,32,110,117,109,98,101,114,32,115,112,101,99,105,102,105,101,115,32,97,110,32,97,98,115,111,108,117,116,101,32,114,101,102,101,114,101,110,99,101,32,119,105,116,104,111,117,116,32,116,104,101,32,97,109,98,105,103,117,105,116,121,32,116,104,97,116,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,111,108,100,101,114,32,115,121,110,116,97,120,46,32,73,116,32,105,115,32,97,108,115,111,32,117,115,101,102,117,108,32,119,104,101,110,32,108,105,116,101,114,97,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,105,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,98,99,40,100,101,102,41,103,104,105,41,92,103,123,45,49,125>>]}]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,32,92,103,123,45,49,125,32,105,115,32,97,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,115,116,97,114,116,101,100,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,92,103,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,92,50,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,46,32,83,105,109,105,108,97,114,108,121,44,32,92,103,123,45,50,125,32,119,111,117,108,100,32,98,101,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,92,49,46,32,84,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,32,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,105,110,32,108,111,110,103,32,112,97,116,116,101,114,110,115,44,32,97,110,100,32,97,108,115,111,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,99,114,101,97,116,101,100,32,98,121,32,106,111,105,110,105,110,103,32,102,114,97,103,109,101,110,116,115,32,99,111,110,116,97,105,110,105,110,103,32,114,101,102,101,114,101,110,99,101,115,32,119,105,116,104,105,110,32,116,104,101,109,115,101,108,118,101,115,46>>]},{p,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,119,104,97,116,101,118,101,114,32,109,97,116,99,104,101,100,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,97,116,104,101,114,32,116,104,97,110,32,97,110,121,116,104,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,116,115,101,108,102,32,40,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,50,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,117,98,112,97,116,116,101,114,110,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115>>]},<<32,100,101,115,99,114,105,98,101,115,32,97,32,119,97,121,32,111,102,32,100,111,105,110,103,32,116,104,97,116,41,46,32,83,111,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58>>]},{pre,[],[{code,[],[<<40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121>>]}]},{p,[],[<<73,102,32,99,97,115,101,102,117,108,32,109,97,116,99,104,105,110,103,32,105,115,32,105,110,32,102,111,114,99,101,32,97,116,32,116,104,101,32,116,105,109,101,32,111,102,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,44,32,116,104,101,32,99,97,115,101,32,111,102,32,108,101,116,116,101,114,115,32,105,115,32,114,101,108,101,118,97,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,114,97,104,32,114,97,104,34,32,97,110,100,32,34,82,65,72,32,82,65,72,34,44,32,98,117,116,32,110,111,116,32,34,82,65,72,32,114,97,104,34,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,111,114,105,103,105,110,97,108,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,32,99,97,115,101,108,101,115,115,108,121,58>>]},{pre,[],[{code,[],[<<40,40,63,105,41,114,97,104,41,92,115,43,92,49>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,111,102,32,119,114,105,116,105,110,103,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,101,32,46,78,69,84,32,115,121,110,116,97,120,32>>,{code,[],[<<92,107,123,110,97,109,101,125>>]},<<32,97,110,100,32,116,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32>>,{code,[],[<<92,107,60,110,97,109,101,62>>]},<<32,111,114,32>>,{code,[],[<<92,107,39,110,97,109,101,39>>]},<<32,97,114,101,32,115,117,112,112,111,114,116,101,100,44,32,97,115,32,105,115,32,116,104,101,32,80,121,116,104,111,110,32,115,121,110,116,97,120,32>>,{code,[],[<<40,63,80,61,110,97,109,101,41>>]},<<46,32,84,104,101,32,117,110,105,102,105,101,100,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,115,121,110,116,97,120,32,105,110,32,80,101,114,108,32,53,46,49,48,44,32,105,110,32,119,104,105,99,104,32,92,103,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,98,111,116,104,32,110,117,109,101,114,105,99,32,97,110,100,32,110,97,109,101,100,32,114,101,102,101,114,101,110,99,101,115,44,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,84,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,99,97,110,32,98,101,32,114,101,119,114,105,116,116,101,110,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,119,97,121,115,58>>]},{pre,[],[{code,[],[<<40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,107,60,112,49,62,10,40,63,39,112,49,39,40,63,105,41,114,97,104,41,92,115,43,92,107,123,112,49,125,10,40,63,80,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,40,63,80,61,112,49,41,10,40,63,60,112,49,62,40,63,105,41,114,97,104,41,92,115,43,92,103,123,112,49,125>>]}]},{p,[],[<<65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32,110,97,109,101,32,99,97,110,32,97,112,112,101,97,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,98,101,102,111,114,101,32,111,114,32,97,102,116,101,114,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46>>]},{p,[],[<<84,104,101,114,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,115,97,109,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,97,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,110,111,116,32,98,101,101,110,32,117,115,101,100,32,105,110,32,97,32,112,97,114,116,105,99,117,108,97,114,32,109,97,116,99,104,44,32,97,110,121,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,105,116,32,97,108,119,97,121,115,32,102,97,105,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,102,97,105,108,115,32,105,102,32,105,116,32,115,116,97,114,116,115,32,116,111,32,109,97,116,99,104,32,34,97,34,32,114,97,116,104,101,114,32,116,104,97,110,32,34,98,99,34,58>>]},{pre,[],[{code,[],[<<40,97,124,40,98,99,41,41,92,50>>]}]},{p,[],[<<65,115,32,116,104,101,114,101,32,99,97,110,32,98,101,32,109,97,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,108,108,32,100,105,103,105,116,115,32,102,111,108,108,111,119,105,110,103,32,116,104,101,32,98,97,99,107,115,108,97,115,104,32,97,114,101,32,116,97,107,101,110,32,97,115,32,112,97,114,116,32,111,102,32,97,32,112,111,116,101,110,116,105,97,108,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,110,117,109,98,101,114,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,111,110,116,105,110,117,101,115,32,119,105,116,104,32,97,32,100,105,103,105,116,32,99,104,97,114,97,99,116,101,114,44,32,115,111,109,101,32,100,101,108,105,109,105,116,101,114,32,109,117,115,116,32,98,101,32,117,115,101,100,32,116,111,32,116,101,114,109,105,110,97,116,101,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,105,115,32,115,101,116,44,32,116,104,105,115,32,99,97,110,32,98,101,32,119,104,105,116,101,115,112,97,99,101,46,32,79,116,104,101,114,119,105,115,101,32,97,110,32,101,109,112,116,121,32,99,111,109,109,101,110,116,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,57>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,111,109,109,101,110,116,115>>]},<<41,32,99,97,110,32,98,101,32,117,115,101,100,46>>]},{p,[],[{em,[],[<<82,101,99,117,114,115,105,118,101,32,66,97,99,107,32,82,101,102,101,114,101,110,99,101,115>>]}]},{p,[],[<<65,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,116,104,97,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,32,102,97,105,108,115,32,119,104,101,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,102,105,114,115,116,32,117,115,101,100,44,32,115,111,44,32,102,111,114,32,101,120,97,109,112,108,101,44,32,40,97,92,49,41,32,110,101,118,101,114,32,109,97,116,99,104,101,115,46,32,72,111,119,101,118,101,114,44,32,115,117,99,104,32,114,101,102,101,114,101,110,99,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,32,105,110,115,105,100,101,32,114,101,112,101,97,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,34,97,34,115,32,97,110,100,32,97,108,115,111,32,34,97,98,97,34,44,32,34,97,98,97,98,98,97,97,34,44,32,97,110,100,32,115,111,32,111,110,58>>]},{pre,[],[{code,[],[<<40,97,124,98,92,49,41,43>>]}]},{p,[],[<<65,116,32,101,97,99,104,32,105,116,101,114,97,116,105,111,110,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,109,97,116,99,104,101,115,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,115,116,114,105,110,103,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,112,114,101,118,105,111,117,115,32,105,116,101,114,97,116,105,111,110,46,32,73,110,32,111,114,100,101,114,32,102,111,114,32,116,104,105,115,32,116,111,32,119,111,114,107,44,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,98,101,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,105,116,101,114,97,116,105,111,110,32,100,111,101,115,32,110,111,116,32,110,101,101,100,32,116,111,32,109,97,116,99,104,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,100,111,110,101,32,117,115,105,110,103,32,97,108,116,101,114,110,97,116,105,111,110,44,32,97,115,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,97,98,111,118,101,44,32,111,114,32,98,121,32,97,32,113,117,97,110,116,105,102,105,101,114,32,119,105,116,104,32,97,32,109,105,110,105,109,117,109,32,111,102,32,122,101,114,111,46>>]},{p,[],[<<66,97,99,107,32,114,101,102,101,114,101,110,99,101,115,32,111,102,32,116,104,105,115,32,116,121,112,101,32,99,97,117,115,101,32,116,104,101,32,103,114,111,117,112,32,116,104,97,116,32,116,104,101,121,32,114,101,102,101,114,101,110,99,101,32,116,111,32,98,101,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,79,110,99,101,32,116,104,101,32,119,104,111,108,101,32,103,114,111,117,112,32,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,99,97,110,110,111,116,32,99,97,117,115,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,116,104,101,32,109,105,100,100,108,101,32,111,102,32,116,104,101,32,103,114,111,117,112,46>>]},{a,[{id,<<115,101,99,116,49,55>>}],[]},{h2,[],[<<65,115,115,101,114,116,105,111,110,115>>]},{p,[],[<<65,110,32,97,115,115,101,114,116,105,111,110,32,105,115,32,97,32,116,101,115,116,32,111,110,32,116,104,101,32,99,104,97,114,97,99,116,101,114,115,32,102,111,108,108,111,119,105,110,103,32,111,114,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,115,117,109,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,115,105,109,112,108,101,32,97,115,115,101,114,116,105,111,110,115,32,99,111,100,101,100,32,97,115,32,92,98,44,32,92,66,44,32,92,65,44,32,92,71,44,32,92,90,44,32,92,122,44,32,94,44,32,97,110,100,32,36,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,115,101,99,116,105,111,110,115,46>>]},{p,[],[<<77,111,114,101,32,99,111,109,112,108,105,99,97,116,101,100,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,32,99,111,100,101,100,32,97,115,32,115,117,98,112,97,116,116,101,114,110,115,46,32,84,104,101,114,101,32,97,114,101,32,116,119,111,32,107,105,110,100,115,58,32,116,104,111,115,101,32,116,104,97,116,32,108,111,111,107,32,97,104,101,97,100,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,110,100,32,116,104,111,115,101,32,116,104,97,116,32,108,111,111,107,32,98,101,104,105,110,100,32,105,116,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,109,97,116,99,104,101,100,32,105,110,32,116,104,101,32,110,111,114,109,97,108,32,119,97,121,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,116,32,100,111,101,115,32,110,111,116,32,99,97,117,115,101,32,116,104,101,32,99,117,114,114,101,110,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,32,116,111,32,98,101,32,99,104,97,110,103,101,100,46>>]},{p,[],[<<65,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,110,111,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,46,32,73,102,32,115,117,99,104,32,97,110,32,97,115,115,101,114,116,105,111,110,32,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,119,105,116,104,105,110,32,105,116,44,32,116,104,101,115,101,32,97,114,101,32,99,111,117,110,116,101,100,32,102,111,114,32,116,104,101,32,112,117,114,112,111,115,101,115,32,111,102,32,110,117,109,98,101,114,105,110,103,32,116,104,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,115,117,98,115,116,114,105,110,103,32,99,97,112,116,117,114,105,110,103,32,105,115,32,100,111,110,101,32,111,110,108,121,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,40,80,101,114,108,32,115,111,109,101,116,105,109,101,115,44,32,98,117,116,32,110,111,116,32,97,108,119,97,121,115,44,32,112,101,114,102,111,114,109,115,32,99,97,112,116,117,114,105,110,103,32,105,110,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,41>>]},{'div',[{class,<<119,97,114,110,105,110,103>>}],[{p,[],[<<73,102,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,111,110,101,32,111,114,32,109,111,114,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,115,117,99,99,101,101,100,115,44,32,98,117,116,32,102,97,105,108,117,114,101,32,116,111,32,109,97,116,99,104,32,108,97,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,118,101,114,32,116,104,105,115,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,99,97,112,116,117,114,101,115,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,101,116,32,111,110,108,121,32,105,102,32,110,111,32,104,105,103,104,101,114,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,101,115,32,97,114,101,32,97,108,114,101,97,100,121,32,115,101,116,46,32,84,104,105,115,32,105,115,44,32,117,110,102,111,114,116,117,110,97,116,101,108,121,44,32,97,32,102,117,110,100,97,109,101,110,116,97,108,32,108,105,109,105,116,97,116,105,111,110,32,111,102,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,44,32,97,110,100,32,97,115,32,80,67,82,69,49,32,105,115,32,110,111,119,32,105,110,32,109,97,105,110,116,101,110,97,110,99,101,45,111,110,108,121,32,115,116,97,116,117,115,44,32,105,116,32,105,115,32,117,110,108,105,107,101,108,121,32,101,118,101,114,32,116,111,32,99,104,97,110,103,101,46>>]}]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,80,101,114,108,44,32,97,115,115,101,114,116,105,111,110,32,115,117,98,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,114,101,112,101,97,116,101,100,46,32,72,111,119,101,118,101,114,44,32,105,116,32,109,97,107,101,115,32,110,111,32,115,101,110,115,101,32,116,111,32,97,115,115,101,114,116,32,116,104,101,32,115,97,109,101,32,116,104,105,110,103,32,109,97,110,121,32,116,105,109,101,115,44,32,116,104,101,32,115,105,100,101,32,101,102,102,101,99,116,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,111,99,99,97,115,105,111,110,97,108,108,121,32,98,101,32,117,115,101,102,117,108,46,32,73,110,32,112,114,97,99,116,105,99,101,44,32,116,104,101,114,101,32,97,114,101,32,111,110,108,121,32,116,104,114,101,101,32,99,97,115,101,115,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,123,48,125,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,32,110,101,118,101,114,32,111,98,101,121,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46,32,72,111,119,101,118,101,114,44,32,105,116,32,99,97,110,32,99,111,110,116,97,105,110,32,105,110,116,101,114,110,97,108,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,103,114,111,117,112,115,32,116,104,97,116,32,97,114,101,32,99,97,108,108,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,32,116,104,114,111,117,103,104,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,101,99,104,97,110,105,115,109,46>>]}]},{li,[],[{p,[],[<<73,102,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,123,48,44,110,125,44,32,119,104,101,114,101,32,110,32,62,32,48,44,32,105,116,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,105,102,32,105,116,32,119,97,115,32,123,48,44,49,125,46,32,65,116,32,114,117,110,116,105,109,101,44,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,105,115,32,116,114,105,101,100,32,119,105,116,104,32,97,110,100,32,119,105,116,104,111,117,116,32,116,104,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,111,114,100,101,114,32,100,101,112,101,110,100,115,32,111,110,32,116,104,101,32,103,114,101,101,100,105,110,101,115,115,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,46>>]}]},{li,[],[{p,[],[<<73,102,32,116,104,101,32,109,105,110,105,109,117,109,32,114,101,112,101,116,105,116,105,111,110,32,105,115,32,62,32,48,44,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,105,103,110,111,114,101,100,46,32,84,104,101,32,97,115,115,101,114,116,105,111,110,32,105,115,32,111,98,101,121,101,100,32,111,110,108,121,32,111,110,99,101,32,119,104,101,110,32,101,110,99,111,117,110,116,101,114,101,100,32,100,117,114,105,110,103,32,109,97,116,99,104,105,110,103,46>>]}]}]},{p,[],[{em,[],[<<76,111,111,107,97,104,101,97,100,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<76,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,33,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,32,119,111,114,100,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,115,101,109,105,99,111,108,111,110,44,32,98,117,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,116,104,101,32,115,101,109,105,99,111,108,111,110,32,105,110,32,116,104,101,32,109,97,116,99,104,58>>]},{pre,[],[{code,[],[<<92,119,43,40,63,61,59,41>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,102,111,111,34,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32,34,98,97,114,34,58>>]},{pre,[],[{code,[],[<<102,111,111,40,63,33,98,97,114,41>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,97,112,112,97,114,101,110,116,108,121,32,115,105,109,105,108,97,114,32,112,97,116,116,101,114,110>>]},{pre,[],[{code,[],[<<40,63,33,102,111,111,41,98,97,114>>]}]},{p,[],[<<100,111,101,115,32,110,111,116,32,102,105,110,100,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,115,111,109,101,116,104,105,110,103,32,111,116,104,101,114,32,116,104,97,110,32,34,102,111,111,34,46,32,73,116,32,102,105,110,100,115,32,97,110,121,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,119,104,97,116,115,111,101,118,101,114,44,32,97,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,40,63,33,102,111,111,41,32,105,115,32,97,108,119,97,121,115,32,116,114,117,101,32,119,104,101,110,32,116,104,101,32,110,101,120,116,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,34,98,97,114,34,46,32,65,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,105,115,32,110,101,101,100,101,100,32,116,111,32,97,99,104,105,101,118,101,32,116,104,101,32,111,116,104,101,114,32,101,102,102,101,99,116,46>>]},{p,[],[<<73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,102,111,114,99,101,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,97,116,32,115,111,109,101,32,112,111,105,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,109,111,115,116,32,99,111,110,118,101,110,105,101,110,116,32,119,97,121,32,116,111,32,100,111,32,105,116,32,105,115,32,119,105,116,104,32,40,63,33,41,44,32,97,115,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,46,32,83,111,44,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,114,101,113,117,105,114,101,115,32,116,104,101,114,101,32,105,115,32,110,111,116,32,116,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,117,115,116,32,97,108,119,97,121,115,32,102,97,105,108,46,32,84,104,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,111,110,116,114,111,108,32,118,101,114,98,32,40,42,70,65,73,76,41,32,111,114,32,40,42,70,41,32,105,115,32,97,32,115,121,110,111,110,121,109,32,102,111,114,32,40,63,33,41,46>>]},{p,[],[{em,[],[<<76,111,111,107,98,101,104,105,110,100,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<76,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,115,116,97,114,116,32,119,105,116,104,32,40,63,60,61,32,102,111,114,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,110,100,32,40,63,60,33,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,105,110,100,115,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,114,34,32,116,104,97,116,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,34,102,111,111,34,58>>]},{pre,[],[{code,[],[<<40,63,60,33,102,111,111,41,98,97,114>>]}]},{p,[],[<<84,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,97,114,101,32,114,101,115,116,114,105,99,116,101,100,32,115,117,99,104,32,116,104,97,116,32,97,108,108,32,116,104,101,32,115,116,114,105,110,103,115,32,105,116,32,109,97,116,99,104,101,115,32,109,117,115,116,32,104,97,118,101,32,97,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,114,101,32,97,114,101,32,109,97,110,121,32,116,111,112,45,108,101,118,101,108,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,116,104,101,121,32,100,111,32,110,111,116,32,97,108,108,32,104,97,118,101,32,116,111,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,102,105,120,101,100,32,108,101,110,103,116,104,46,32,84,104,117,115,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,112,101,114,109,105,116,116,101,100,58>>]},{pre,[],[{code,[],[<<40,63,60,61,98,117,108,108,111,99,107,124,100,111,110,107,101,121,41>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,117,115,101,115,32,97,110,32,101,114,114,111,114,32,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,58>>]},{pre,[],[{code,[],[<<40,63,60,33,100,111,103,115,63,124,99,97,116,115,63,41>>]}]},{p,[],[<<66,114,97,110,99,104,101,115,32,116,104,97,116,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,84,104,105,115,32,105,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,80,101,114,108,44,32,119,104,105,99,104,32,114,101,113,117,105,114,101,115,32,97,108,108,32,98,114,97,110,99,104,101,115,32,116,111,32,109,97,116,99,104,32,116,104,101,32,115,97,109,101,32,108,101,110,103,116,104,32,111,102,32,115,116,114,105,110,103,46,32,65,110,32,97,115,115,101,114,116,105,111,110,32,115,117,99,104,32,97,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,105,115,32,110,111,116,32,112,101,114,109,105,116,116,101,100,44,32,97,115,32,105,116,115,32,115,105,110,103,108,101,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,32,99,97,110,32,109,97,116,99,104,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,108,101,110,103,116,104,115,58>>]},{pre,[],[{code,[],[<<40,63,60,61,97,98,40,99,124,100,101,41,41>>]}]},{p,[],[<<72,111,119,101,118,101,114,44,32,105,116,32,105,115,32,97,99,99,101,112,116,97,98,108,101,32,116,111,32,80,67,82,69,32,105,102,32,114,101,119,114,105,116,116,101,110,32,116,111,32,117,115,101,32,116,119,111,32,116,111,112,45,108,101,118,101,108,32,98,114,97,110,99,104,101,115,58>>]},{pre,[],[{code,[],[<<40,63,60,61,97,98,99,124,97,98,100,101,41>>]}]},{p,[],[<<83,111,109,101,116,105,109,101,115,32,116,104,101,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,32,92,75,32,40,115,101,101,32,97,98,111,118,101,41,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,111,102,32,97,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,116,111,32,103,101,116,32,114,111,117,110,100,32,116,104,101,32,102,105,120,101,100,45,108,101,110,103,116,104,32,114,101,115,116,114,105,99,116,105,111,110,46>>]},{p,[],[<<84,104,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,105,115,44,32,102,111,114,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,111,32,109,111,118,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,98,97,99,107,32,116,101,109,112,111,114,97,114,105,108,121,32,98,121,32,116,104,101,32,102,105,120,101,100,32,108,101,110,103,116,104,32,97,110,100,32,116,104,101,110,32,116,114,121,32,116,111,32,109,97,116,99,104,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,105,110,115,117,102,102,105,99,105,101,110,116,32,99,104,97,114,97,99,116,101,114,115,32,98,101,102,111,114,101,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,102,97,105,108,115,46>>]},{p,[],[<<73,110,32,97,32,85,84,70,32,109,111,100,101,44,32,80,67,82,69,32,100,111,101,115,32,110,111,116,32,97,108,108,111,119,32,116,104,101,32,92,67,32,101,115,99,97,112,101,32,40,119,104,105,99,104,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,100,97,116,97,32,117,110,105,116,32,101,118,101,110,32,105,110,32,97,32,85,84,70,32,109,111,100,101,41,32,116,111,32,97,112,112,101,97,114,32,105,110,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,44,32,97,115,32,105,116,32,109,97,107,101,115,32,105,116,32,105,109,112,111,115,115,105,98,108,101,32,116,111,32,99,97,108,99,117,108,97,116,101,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,108,111,111,107,98,101,104,105,110,100,46,32,84,104,101,32,92,88,32,97,110,100,32,92,82,32,101,115,99,97,112,101,115,44,32,119,104,105,99,104,32,99,97,110,32,109,97,116,99,104,32,100,105,102,102,101,114,101,110,116,32,110,117,109,98,101,114,115,32,111,102,32,100,97,116,97,32,117,110,105,116,115,44,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,32,101,105,116,104,101,114,46>>]},{p,[],[<<34,83,117,98,114,111,117,116,105,110,101,34,32,99,97,108,108,115,32,40,115,101,101,32,98,101,108,111,119,41,44,32,115,117,99,104,32,97,115,32,40,63,50,41,32,111,114,32,40,63,38,88,41,44,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,105,110,32,108,111,111,107,98,101,104,105,110,100,115,44,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,46,32,82,101,99,117,114,115,105,111,110,44,32,104,111,119,101,118,101,114,44,32,105,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,46>>]},{p,[],[<<80,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,115,32,99,97,110,32,98,101,32,117,115,101,100,32,119,105,116,104,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,115,32,116,111,32,115,112,101,99,105,102,121,32,101,102,102,105,99,105,101,110,116,32,109,97,116,99,104,105,110,103,32,111,102,32,102,105,120,101,100,45,108,101,110,103,116,104,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,105,109,112,108,101,32,112,97,116,116,101,114,110,32,119,104,101,110,32,97,112,112,108,105,101,100,32,116,111,32,97,32,108,111,110,103,32,115,116,114,105,110,103,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,58>>]},{pre,[],[{code,[],[<<97,98,99,100,36>>]}]},{p,[],[<<65,115,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,101,100,115,32,102,114,111,109,32,108,101,102,116,32,116,111,32,114,105,103,104,116,44,32,80,67,82,69,32,108,111,111,107,115,32,102,111,114,32,101,97,99,104,32,34,97,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,97,110,100,32,116,104,101,110,32,115,101,101,115,32,105,102,32,119,104,97,116,32,102,111,108,108,111,119,115,32,109,97,116,99,104,101,115,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115>>]},{pre,[],[{code,[],[<<94,46,42,97,98,99,100,36>>]}]},{p,[],[<<116,104,101,32,105,110,105,116,105,97,108,32,46,42,32,109,97,116,99,104,101,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,32,97,116,32,102,105,114,115,116,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,116,104,105,115,32,102,97,105,108,115,32,40,97,115,32,116,104,101,114,101,32,105,115,32,110,111,32,102,111,108,108,111,119,105,110,103,32,34,97,34,41,44,32,105,116,32,98,97,99,107,116,114,97,99,107,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,99,104,97,114,97,99,116,101,114,44,32,116,104,101,110,32,97,108,108,32,98,117,116,32,116,104,101,32,108,97,115,116,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,44,32,97,110,100,32,115,111,32,111,110,46,32,79,110,99,101,32,97,103,97,105,110,32,116,104,101,32,115,101,97,114,99,104,32,102,111,114,32,34,97,34,32,99,111,118,101,114,115,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,44,32,102,114,111,109,32,114,105,103,104,116,32,116,111,32,108,101,102,116,44,32,115,111,32,119,101,32,97,114,101,32,110,111,32,98,101,116,116,101,114,32,111,102,102,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,97,115>>]},{pre,[],[{code,[],[<<94,46,42,43,40,63,60,61,97,98,99,100,41>>]}]},{p,[],[<<116,104,101,114,101,32,99,97,110,32,98,101,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,102,111,114,32,116,104,101,32,46,42,43,32,105,116,101,109,59,32,105,116,32,99,97,110,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,46,32,84,104,101,32,115,117,98,115,101,113,117,101,110,116,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,97,32,115,105,110,103,108,101,32,116,101,115,116,32,111,110,32,116,104,101,32,108,97,115,116,32,102,111,117,114,32,99,104,97,114,97,99,116,101,114,115,46,32,73,102,32,105,116,32,102,97,105,108,115,44,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,32,105,109,109,101,100,105,97,116,101,108,121,46,32,70,111,114,32,108,111,110,103,32,115,116,114,105,110,103,115,44,32,116,104,105,115,32,97,112,112,114,111,97,99,104,32,109,97,107,101,115,32,97,32,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,32,116,111,32,116,104,101,32,112,114,111,99,101,115,115,105,110,103,32,116,105,109,101,46>>]},{p,[],[{em,[],[<<85,115,105,110,103,32,77,117,108,116,105,112,108,101,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<77,97,110,121,32,97,115,115,101,114,116,105,111,110,115,32,40,111,102,32,97,110,121,32,115,111,114,116,41,32,99,97,110,32,111,99,99,117,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58>>]},{pre,[],[{code,[],[<<40,63,60,61,92,100,123,51,125,41,40,63,60,33,57,57,57,41,102,111,111>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,101,97,99,104,32,111,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,115,32,105,115,32,97,112,112,108,105,101,100,32,105,110,100,101,112,101,110,100,101,110,116,108,121,32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,70,105,114,115,116,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,112,114,101,118,105,111,117,115,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,97,108,108,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,114,101,32,105,115,32,97,32,99,104,101,99,107,32,116,104,97,116,32,116,104,101,32,115,97,109,101,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32>>,{em,[],[<<110,111,116>>]},<<32,109,97,116,99,104,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,116,104,101,32,102,105,114,115,116,32,111,102,32,119,104,105,99,104,32,97,114,101,32,100,105,103,105,116,115,32,97,110,100,32,116,104,101,32,108,97,115,116,32,116,104,114,101,101,32,111,102,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,34,49,50,51,97,98,99,102,111,111,34,46,32,65,32,112,97,116,116,101,114,110,32,116,111,32,100,111,32,116,104,97,116,32,105,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{pre,[],[{code,[],[<<40,63,60,61,92,100,123,51,125,46,46,46,41,40,63,60,33,57,57,57,41,102,111,111>>]}]},{p,[],[<<84,104,105,115,32,116,105,109,101,32,116,104,101,32,102,105,114,115,116,32,97,115,115,101,114,116,105,111,110,32,108,111,111,107,115,32,97,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,115,105,120,32,99,104,97,114,97,99,116,101,114,115,44,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,116,104,114,101,101,32,97,114,101,32,100,105,103,105,116,115,44,32,97,110,100,32,116,104,101,110,32,116,104,101,32,115,101,99,111,110,100,32,97,115,115,101,114,116,105,111,110,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,32,112,114,101,99,101,100,105,110,103,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,110,111,116,32,34,57,57,57,34,46>>]},{p,[],[<<65,115,115,101,114,116,105,111,110,115,32,99,97,110,32,98,101,32,110,101,115,116,101,100,32,105,110,32,97,110,121,32,99,111,109,98,105,110,97,116,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,97,110,32,111,99,99,117,114,114,101,110,99,101,32,111,102,32,34,98,97,122,34,32,116,104,97,116,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,34,98,97,114,34,44,32,119,104,105,99,104,32,105,110,32,116,117,114,110,32,105,115,32,110,111,116,32,112,114,101,99,101,100,101,100,32,98,121,32,34,102,111,111,34,58>>]},{pre,[],[{code,[],[<<40,63,60,61,40,63,60,33,102,111,111,41,98,97,114,41,98,97,122>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,102,111,111,34,32,112,114,101,99,101,100,101,100,32,98,121,32,116,104,114,101,101,32,100,105,103,105,116,115,32,97,110,100,32,97,110,121,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,34,57,57,57,34,58>>]},{pre,[],[{code,[],[<<40,63,60,61,92,100,123,51,125,40,63,33,57,57,57,41,46,46,46,41,102,111,111>>]}]},{a,[{id,<<115,101,99,116,49,56>>}],[]},{h2,[],[<<67,111,110,100,105,116,105,111,110,97,108,32,83,117,98,112,97,116,116,101,114,110,115>>]},{p,[],[<<73,116,32,105,115,32,112,111,115,115,105,98,108,101,32,116,111,32,99,97,117,115,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,32,116,111,32,111,98,101,121,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,111,110,100,105,116,105,111,110,97,108,108,121,32,111,114,32,116,111,32,99,104,111,111,115,101,32,98,101,116,119,101,101,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,32,115,117,98,112,97,116,116,101,114,110,115,44,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,110,32,97,115,115,101,114,116,105,111,110,44,32,111,114,32,119,104,101,116,104,101,114,32,97,32,115,112,101,99,105,102,105,99,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,108,114,101,97,100,121,32,98,101,101,110,32,109,97,116,99,104,101,100,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,116,119,111,32,112,111,115,115,105,98,108,101,32,102,111,114,109,115,32,111,102,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,41,10,40,63,40,99,111,110,100,105,116,105,111,110,41,121,101,115,45,112,97,116,116,101,114,110,124,110,111,45,112,97,116,116,101,114,110,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,115,97,116,105,115,102,105,101,100,44,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,110,111,45,112,97,116,116,101,114,110,32,40,105,102,32,112,114,101,115,101,110,116,41,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,101,120,105,115,116,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,69,97,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,99,97,110,32,105,116,115,101,108,102,32,99,111,110,116,97,105,110,32,110,101,115,116,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,97,110,121,32,102,111,114,109,44,32,105,110,99,108,117,100,105,110,103,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,115,59,32,116,104,101,32,114,101,115,116,114,105,99,116,105,111,110,32,116,111,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,108,101,118,101,108,32,111,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,32,105,115,32,97,110,32,101,120,97,109,112,108,101,32,119,104,101,114,101,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,114,101,32,99,111,109,112,108,101,120,58>>]},{pre,[],[{code,[],[<<40,63,40,49,41,32,40,65,124,66,124,67,41,32,124,32,40,68,32,124,32,40,63,40,50,41,69,124,70,41,32,124,32,69,41,32,41>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,102,111,117,114,32,107,105,110,100,115,32,111,102,32,99,111,110,100,105,116,105,111,110,58,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,115,117,98,112,97,116,116,101,114,110,115,44,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,114,101,99,117,114,115,105,111,110,44,32,97,32,112,115,101,117,100,111,45,99,111,110,100,105,116,105,111,110,32,99,97,108,108,101,100,32,68,69,70,73,78,69,44,32,97,110,100,32,97,115,115,101,114,116,105,111,110,115,46>>]},{p,[],[{em,[],[<<67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,117,109,98,101,114>>]}]},{p,[],[<<73,102,32,116,104,101,32,116,101,120,116,32,98,101,116,119,101,101,110,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,99,111,110,115,105,115,116,115,32,111,102,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,100,105,103,105,116,115,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,97,116,32,110,117,109,98,101,114,32,104,97,115,32,112,114,101,118,105,111,117,115,108,121,32,109,97,116,99,104,101,100,46,32,73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,32,101,120,105,115,116,115,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,115,101,99,116,49,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<68,117,112,108,105,99,97,116,101,32,83,117,98,112,97,116,116,101,114,110,32,78,117,109,98,101,114,115>>]},<<32,101,97,114,108,105,101,114,41,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,102,32,116,104,101,109,32,104,97,118,101,32,109,97,116,99,104,101,100,46,32,65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,110,111,116,97,116,105,111,110,32,105,115,32,116,111,32,112,114,101,99,101,100,101,32,116,104,101,32,100,105,103,105,116,115,32,119,105,116,104,32,97,32,112,108,117,115,32,111,114,32,109,105,110,117,115,32,115,105,103,110,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,110,117,109,98,101,114,32,105,115,32,114,101,108,97,116,105,118,101,32,114,97,116,104,101,114,32,116,104,97,110,32,97,98,115,111,108,117,116,101,46,32,84,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,98,121,32,40,63,40,45,49,41,44,32,116,104,101,32,110,101,120,116,32,109,111,115,116,32,114,101,99,101,110,116,32,98,121,32,40,63,40,45,50,41,44,32,97,110,100,32,115,111,32,111,110,46,32,73,110,115,105,100,101,32,108,111,111,112,115,44,32,105,116,32,99,97,110,32,97,108,115,111,32,109,97,107,101,32,115,101,110,115,101,32,116,111,32,114,101,102,101,114,32,116,111,32,115,117,98,115,101,113,117,101,110,116,32,103,114,111,117,112,115,46,32,84,104,101,32,110,101,120,116,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,98,101,32,111,112,101,110,101,100,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,97,115,32,40,63,40,43,49,41,44,32,97,110,100,32,115,111,32,111,110,46,32,40,84,104,101,32,118,97,108,117,101,32,122,101,114,111,32,105,110,32,97,110,121,32,111,102,32,116,104,101,115,101,32,102,111,114,109,115,32,105,115,32,110,111,116,32,117,115,101,100,59,32,105,116,32,112,114,111,118,111,107,101,115,32,97,32,99,111,109,112,105,108,101,45,116,105,109,101,32,101,114,114,111,114,46,41>>]},{p,[],[<<67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,99,111,110,116,97,105,110,115,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,32,116,111,32,109,97,107,101,32,105,116,32,109,111,114,101,32,114,101,97,100,97,98,108,101,32,40,97,115,115,117,109,101,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<41,32,97,110,100,32,116,111,32,100,105,118,105,100,101,32,105,116,32,105,110,116,111,32,116,104,114,101,101,32,112,97,114,116,115,32,102,111,114,32,101,97,115,101,32,111,102,32,100,105,115,99,117,115,115,105,111,110,58>>]},{pre,[],[{code,[],[<<40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,49,41,32,92,41,32,41>>]}]},{p,[],[<<84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,97,110,100,32,105,102,32,116,104,97,116,32,99,104,97,114,97,99,116,101,114,32,105,115,32,112,114,101,115,101,110,116,44,32,115,101,116,115,32,105,116,32,97,115,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,46,32,84,104,101,32,115,101,99,111,110,100,32,112,97,114,116,32,109,97,116,99,104,101,115,32,111,110,101,32,111,114,32,109,111,114,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,97,114,101,110,116,104,101,115,101,115,46,32,84,104,101,32,116,104,105,114,100,32,112,97,114,116,32,105,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,116,101,115,116,115,32,119,104,101,116,104,101,114,32,116,104,101,32,102,105,114,115,116,32,115,101,116,32,111,102,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,101,100,32,111,114,32,110,111,116,46,32,73,102,32,116,104,101,121,32,100,105,100,44,32,116,104,97,116,32,105,115,44,32,105,102,32,115,117,98,106,101,99,116,32,115,116,97,114,116,101,100,32,119,105,116,104,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,44,32,97,110,100,32,115,111,32,116,104,101,32,121,101,115,45,112,97,116,116,101,114,110,32,105,115,32,101,120,101,99,117,116,101,100,32,97,110,100,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,114,101,113,117,105,114,101,100,46,32,79,116,104,101,114,119,105,115,101,44,32,97,115,32,110,111,45,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,44,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,110,111,116,104,105,110,103,46,32,84,104,97,116,32,105,115,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,44,32,111,112,116,105,111,110,97,108,108,121,32,101,110,99,108,111,115,101,100,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<73,102,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,101,109,98,101,100,100,101,100,32,105,110,32,97,32,108,97,114,103,101,114,32,111,110,101,44,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,117,115,101,100,58>>]},{pre,[],[{code,[],[<<46,46,46,111,116,104,101,114,32,115,116,117,102,102,46,46,46,32,40,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,45,49,41,32,92,41,32,41,32,46,46,46>>]}]},{p,[],[<<84,104,105,115,32,109,97,107,101,115,32,116,104,101,32,102,114,97,103,109,101,110,116,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,46>>]},{p,[],[{em,[],[<<67,104,101,99,107,105,110,103,32,102,111,114,32,97,32,85,115,101,100,32,83,117,98,112,97,116,116,101,114,110,32,66,121,32,78,97,109,101>>]}]},{p,[],[<<80,101,114,108,32,117,115,101,115,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,60,110,97,109,101,62,41,46,46,46,41,32,111,114,32,40,63,40,39,110,97,109,101,39,41,46,46,46,41,32,116,111,32,116,101,115,116,32,102,111,114,32,97,32,117,115,101,100,32,115,117,98,112,97,116,116,101,114,110,32,98,121,32,110,97,109,101,46,32,70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,101,97,114,108,105,101,114,32,118,101,114,115,105,111,110,115,32,111,102,32,80,67,82,69,44,32,119,104,105,99,104,32,104,97,100,32,116,104,105,115,32,102,97,99,105,108,105,116,121,32,98,101,102,111,114,101,32,80,101,114,108,44,32,116,104,101,32,115,121,110,116,97,120,32,40,63,40,110,97,109,101,41,46,46,46,41,32,105,115,32,97,108,115,111,32,114,101,99,111,103,110,105,122,101,100,46>>]},{p,[],[<<82,101,119,114,105,116,105,110,103,32,116,104,101,32,112,114,101,118,105,111,117,115,32,101,120,97,109,112,108,101,32,116,111,32,117,115,101,32,97,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,103,105,118,101,115,58>>]},{pre,[],[{code,[],[<<40,63,60,79,80,69,78,62,32,92,40,32,41,63,32,32,32,32,91,94,40,41,93,43,32,32,32,32,40,63,40,60,79,80,69,78,62,41,32,92,41,32,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,104,97,115,32,109,97,116,99,104,101,100,46>>]},{p,[],[{em,[],[<<67,104,101,99,107,105,110,103,32,102,111,114,32,80,97,116,116,101,114,110,32,82,101,99,117,114,115,105,111,110>>]}]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,82,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,82,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,32,111,114,32,97,110,121,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,98,101,101,110,32,109,97,100,101,46,32,73,102,32,100,105,103,105,116,115,32,111,114,32,97,32,110,97,109,101,32,112,114,101,99,101,100,101,100,32,98,121,32,97,109,112,101,114,115,97,110,100,32,102,111,108,108,111,119,32,116,104,101,32,108,101,116,116,101,114,32,82,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,63,40,82,51,41,46,46,46,41,32,111,114,32,40,63,40,82,38,110,97,109,101,41,46,46,46,41>>]}]},{p,[],[<<116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,114,117,101,32,105,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,32,105,115,32,105,110,116,111,32,97,32,115,117,98,112,97,116,116,101,114,110,32,119,104,111,115,101,32,110,117,109,98,101,114,32,111,114,32,110,97,109,101,32,105,115,32,103,105,118,101,110,46,32,84,104,105,115,32,99,111,110,100,105,116,105,111,110,32,100,111,101,115,32,110,111,116,32,99,104,101,99,107,32,116,104,101,32,101,110,116,105,114,101,32,114,101,99,117,114,115,105,111,110,32,115,116,97,99,107,46,32,73,102,32,116,104,101,32,110,97,109,101,32,117,115,101,100,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,32,111,102,32,116,104,105,115,32,107,105,110,100,32,105,115,32,97,32,100,117,112,108,105,99,97,116,101,44,32,116,104,101,32,116,101,115,116,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,108,108,32,115,117,98,112,97,116,116,101,114,110,115,32,111,102,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,97,110,100,32,105,115,32,116,114,117,101,32,105,102,32,97,110,121,32,111,110,101,32,111,102,32,116,104,101,109,32,105,115,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,114,101,99,117,114,115,105,111,110,46>>]},{p,[],[<<65,116,32,34,116,111,112,45,108,101,118,101,108,34,44,32,97,108,108,32,116,104,101,115,101,32,114,101,99,117,114,115,105,111,110,32,116,101,115,116,32,99,111,110,100,105,116,105,111,110,115,32,97,114,101,32,102,97,108,115,101,46,32,84,104,101,32,115,121,110,116,97,120,32,102,111,114,32,114,101,99,117,114,115,105,118,101,32,112,97,116,116,101,114,110,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46>>]},{p,[],[{em,[],[<<68,101,102,105,110,105,110,103,32,83,117,98,112,97,116,116,101,114,110,115,32,102,111,114,32,85,115,101,32,66,121,32,82,101,102,101,114,101,110,99,101,32,79,110,108,121>>]}]},{a,[{id,<<100,101,102,105,110,105,110,103,95,115,117,98,112,97,116,116,101,114,110,115>>}],[]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,116,104,101,32,115,116,114,105,110,103,32,40,68,69,70,73,78,69,41,44,32,97,110,100,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,110,97,109,101,32,68,69,70,73,78,69,44,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,108,119,97,121,115,32,102,97,108,115,101,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,114,101,32,99,97,110,32,98,101,32,111,110,108,121,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,46,32,73,116,32,105,115,32,97,108,119,97,121,115,32,115,107,105,112,112,101,100,32,105,102,32,99,111,110,116,114,111,108,32,114,101,97,99,104,101,115,32,116,104,105,115,32,112,111,105,110,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,105,100,101,97,32,111,102,32,68,69,70,73,78,69,32,105,115,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,100,101,102,105,110,101,32,34,115,117,98,114,111,117,116,105,110,101,115,34,32,116,104,97,116,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,32,102,114,111,109,32,101,108,115,101,119,104,101,114,101,46,32,40,84,104,101,32,117,115,101,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46,41,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,32,112,97,116,116,101,114,110,32,116,111,32,109,97,116,99,104,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,44,32,115,117,99,104,32,97,115,32,34,49,57,50,46,49,54,56,46,50,51,46,50,52,53,34,44,32,99,97,110,32,98,101,32,119,114,105,116,116,101,110,32,108,105,107,101,32,116,104,105,115,32,40,105,103,110,111,114,101,32,119,104,105,116,101,115,112,97,99,101,32,97,110,100,32,108,105,110,101,32,98,114,101,97,107,115,41,58>>]},{pre,[],[{code,[],[<<40,63,40,68,69,70,73,78,69,41,32,40,63,60,98,121,116,101,62,32,50,91,48,45,52,93,92,100,32,124,32,50,53,91,48,45,53,93,32,124,32,49,92,100,92,100,32,124,32,91,49,45,57,93,63,92,100,41,32,41,32,92,98,32,40,63,38,98,121,116,101,41,32,40,92,46,40,63,38,98,121,116,101,41,41,123,51,125,32,92,98>>]}]},{p,[],[<<84,104,101,32,102,105,114,115,116,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,32,68,69,70,73,78,69,32,103,114,111,117,112,32,105,110,115,105,100,101,32,119,104,105,99,104,32,105,115,32,97,32,97,110,111,116,104,101,114,32,103,114,111,117,112,32,110,97,109,101,100,32,34,98,121,116,101,34,32,105,115,32,100,101,102,105,110,101,100,46,32,84,104,105,115,32,109,97,116,99,104,101,115,32,97,110,32,105,110,100,105,118,105,100,117,97,108,32,99,111,109,112,111,110,101,110,116,32,111,102,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,32,40,97,32,110,117,109,98,101,114,32,60,32,50,53,54,41,46,32,87,104,101,110,32,109,97,116,99,104,105,110,103,32,116,97,107,101,115,32,112,108,97,99,101,44,32,116,104,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,107,105,112,112,101,100,44,32,97,115,32,68,69,70,73,78,69,32,97,99,116,115,32,108,105,107,101,32,97,32,102,97,108,115,101,32,99,111,110,100,105,116,105,111,110,46,32,84,104,101,32,114,101,109,97,105,110,105,110,103,32,112,97,116,116,101,114,110,32,117,115,101,115,32,114,101,102,101,114,101,110,99,101,115,32,116,111,32,116,104,101,32,110,97,109,101,100,32,103,114,111,117,112,32,116,111,32,109,97,116,99,104,32,116,104,101,32,102,111,117,114,32,100,111,116,45,115,101,112,97,114,97,116,101,100,32,99,111,109,112,111,110,101,110,116,115,32,111,102,32,97,110,32,73,80,118,52,32,97,100,100,114,101,115,115,44,32,105,110,115,105,115,116,105,110,103,32,111,110,32,97,32,119,111,114,100,32,98,111,117,110,100,97,114,121,32,97,116,32,101,97,99,104,32,101,110,100,46>>]},{p,[],[{em,[],[<<65,115,115,101,114,116,105,111,110,32,67,111,110,100,105,116,105,111,110,115>>]}]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,110,111,116,32,105,110,32,97,110,121,32,111,102,32,116,104,101,32,97,98,111,118,101,32,102,111,114,109,97,116,115,44,32,105,116,32,109,117,115,116,32,98,101,32,97,110,32,97,115,115,101,114,116,105,111,110,46,32,84,104,105,115,32,99,97,110,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,111,114,32,110,101,103,97,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,111,114,32,108,111,111,107,98,101,104,105,110,100,32,97,115,115,101,114,116,105,111,110,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,99,111,110,116,97,105,110,105,110,103,32,110,111,110,45,115,105,103,110,105,102,105,99,97,110,116,32,119,104,105,116,101,115,112,97,99,101,44,32,97,110,100,32,119,105,116,104,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,111,110,32,116,104,101,32,115,101,99,111,110,100,32,108,105,110,101,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<40,63,40,63,61,91,94,97,45,122,93,42,91,97,45,122,93,41,10,92,100,123,50,125,45,91,97,45,122,93,123,51,125,45,92,100,123,50,125,32,32,124,32,32,92,100,123,50,125,45,92,100,123,50,125,45,92,100,123,50,125,32,41>>]}]},{p,[],[<<84,104,101,32,99,111,110,100,105,116,105,111,110,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,108,111,111,107,97,104,101,97,100,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,116,105,111,110,97,108,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,108,101,116,116,101,114,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,108,101,116,116,101,114,46,32,84,104,97,116,32,105,115,44,32,105,116,32,116,101,115,116,115,32,102,111,114,32,116,104,101,32,112,114,101,115,101,110,99,101,32,111,102,32,97,116,32,108,101,97,115,116,32,111,110,101,32,108,101,116,116,101,114,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,73,102,32,97,32,108,101,116,116,101,114,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,111,116,104,101,114,119,105,115,101,32,105,116,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,115,101,99,111,110,100,46,32,84,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,115,116,114,105,110,103,115,32,105,110,32,111,110,101,32,111,102,32,116,104,101,32,116,119,111,32,102,111,114,109,115,32,100,100,45,97,97,97,45,100,100,32,111,114,32,100,100,45,100,100,45,100,100,44,32,119,104,101,114,101,32,97,97,97,32,97,114,101,32,108,101,116,116,101,114,115,32,97,110,100,32,100,100,32,97,114,101,32,100,105,103,105,116,115,46>>]},{a,[{id,<<115,101,99,116,49,57>>}],[]},{h2,[],[<<67,111,109,109,101,110,116,115>>]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,116,119,111,32,119,97,121,115,32,116,111,32,105,110,99,108,117,100,101,32,99,111,109,109,101,110,116,115,32,105,110,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,112,114,111,99,101,115,115,101,100,32,98,121,32,80,67,82,69,46,32,73,110,32,98,111,116,104,32,99,97,115,101,115,44,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,99,111,109,109,101,110,116,32,109,117,115,116,32,110,111,116,32,98,101,32,105,110,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,44,32,111,114,32,105,110,32,116,104,101,32,109,105,100,100,108,101,32,111,102,32,97,110,121,32,111,116,104,101,114,32,115,101,113,117,101,110,99,101,32,111,102,32,114,101,108,97,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,115,117,99,104,32,97,115,32,40,63,58,32,111,114,32,97,32,115,117,98,112,97,116,116,101,114,110,32,110,97,109,101,32,111,114,32,110,117,109,98,101,114,46,32,84,104,101,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,109,97,107,101,32,117,112,32,97,32,99,111,109,109,101,110,116,32,112,108,97,121,32,110,111,32,112,97,114,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,105,110,103,46>>]},{p,[],[<<84,104,101,32,115,101,113,117,101,110,99,101,32,40,63,35,32,109,97,114,107,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,109,109,101,110,116,32,116,104,97,116,32,99,111,110,116,105,110,117,101,115,32,117,112,32,116,111,32,116,104,101,32,110,101,120,116,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,110,111,116,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,111,112,116,105,111,110,32,80,67,82,69,95,69,88,84,69,78,68,69,68,32,105,115,32,115,101,116,44,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,99,104,97,114,97,99,116,101,114,32,97,108,115,111,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,109,109,101,110,116,44,32,119,104,105,99,104,32,105,110,32,116,104,105,115,32,99,97,115,101,32,99,111,110,116,105,110,117,101,115,32,116,111,32,105,109,109,101,100,105,97,116,101,108,121,32,97,102,116,101,114,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,32,111,114,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,87,104,105,99,104,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,110,101,119,108,105,110,101,115,32,105,115,32,99,111,110,116,114,111,108,108,101,100,32,98,121,32,116,104,101,32,111,112,116,105,111,110,115,32,112,97,115,115,101,100,32,116,111,32,97,32,99,111,109,112,105,108,105,110,103,32,102,117,110,99,116,105,111,110,32,111,114,32,98,121,32,97,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,110,101,119,108,105,110,101,95,99,111,110,118,101,110,116,105,111,110,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<78,101,119,108,105,110,101,32,67,111,110,118,101,110,116,105,111,110,115>>]},<<32,101,97,114,108,105,101,114,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,105,115,32,116,121,112,101,32,111,102,32,99,111,109,109,101,110,116,32,105,115,32,97,32,108,105,116,101,114,97,108,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,59,32,101,115,99,97,112,101,32,115,101,113,117,101,110,99,101,115,32,116,104,97,116,32,104,97,112,112,101,110,32,116,111,32,114,101,112,114,101,115,101,110,116,32,97,32,110,101,119,108,105,110,101,32,100,111,32,110,111,116,32,99,111,117,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,119,104,101,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,105,115,32,115,101,116,44,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,32,110,101,119,108,105,110,101,32,99,111,110,118,101,110,116,105,111,110,32,105,115,32,105,110,32,102,111,114,99,101,58>>]},{pre,[],[{code,[],[<<97,98,99,32,35,99,111,109,109,101,110,116,32,92,110,32,115,116,105,108,108,32,99,111,109,109,101,110,116>>]}]},{p,[],[<<79,110,32,101,110,99,111,117,110,116,101,114,105,110,103,32,99,104,97,114,97,99,116,101,114,32,35,44,32>>,{code,[],[<<112,99,114,101,95,99,111,109,112,105,108,101,40,41>>]},<<32,115,107,105,112,115,32,97,108,111,110,103,44,32,108,111,111,107,105,110,103,32,102,111,114,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,84,104,101,32,115,101,113,117,101,110,99,101,32,92,110,32,105,115,32,115,116,105,108,108,32,108,105,116,101,114,97,108,32,97,116,32,116,104,105,115,32,115,116,97,103,101,44,32,115,111,32,105,116,32,100,111,101,115,32,110,111,116,32,116,101,114,109,105,110,97,116,101,32,116,104,101,32,99,111,109,109,101,110,116,46,32,79,110,108,121,32,97,32,99,104,97,114,97,99,116,101,114,32,119,105,116,104,32,99,111,100,101,32,118,97,108,117,101,32,48,120,48,97,32,40,116,104,101,32,100,101,102,97,117,108,116,32,110,101,119,108,105,110,101,41,32,100,111,101,115,32,115,111,46>>]},{a,[{id,<<115,101,99,116,50,48>>}],[]},{h2,[],[<<82,101,99,117,114,115,105,118,101,32,80,97,116,116,101,114,110,115>>]},{p,[],[<<67,111,110,115,105,100,101,114,32,116,104,101,32,112,114,111,98,108,101,109,32,111,102,32,109,97,116,99,104,105,110,103,32,97,32,115,116,114,105,110,103,32,105,110,32,112,97,114,101,110,116,104,101,115,101,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,32,117,110,108,105,109,105,116,101,100,32,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,46,32,87,105,116,104,111,117,116,32,116,104,101,32,117,115,101,32,111,102,32,114,101,99,117,114,115,105,111,110,44,32,116,104,101,32,98,101,115,116,32,116,104,97,116,32,99,97,110,32,98,101,32,100,111,110,101,32,105,115,32,116,111,32,117,115,101,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,117,112,32,116,111,32,115,111,109,101,32,102,105,120,101,100,32,100,101,112,116,104,32,111,102,32,110,101,115,116,105,110,103,46,32,73,116,32,105,115,32,110,111,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,110,100,108,101,32,97,110,32,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,32,100,101,112,116,104,46>>]},{p,[],[<<70,111,114,32,115,111,109,101,32,116,105,109,101,44,32,80,101,114,108,32,104,97,115,32,112,114,111,118,105,100,101,100,32,97,32,102,97,99,105,108,105,116,121,32,116,104,97,116,32,97,108,108,111,119,115,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,115,32,116,111,32,114,101,99,117,114,115,101,32,40,97,109,111,110,103,32,111,116,104,101,114,32,116,104,105,110,103,115,41,46,32,73,116,32,100,111,101,115,32,116,104,105,115,32,98,121,32,105,110,116,101,114,112,111,108,97,116,105,110,103,32,80,101,114,108,32,99,111,100,101,32,105,110,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,116,104,101,32,99,111,100,101,32,99,97,110,32,114,101,102,101,114,32,116,111,32,116,104,101,32,101,120,112,114,101,115,115,105,111,110,32,105,116,115,101,108,102,46,32,65,32,80,101,114,108,32,112,97,116,116,101,114,110,32,117,115,105,110,103,32,99,111,100,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,116,111,32,115,111,108,118,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,99,97,110,32,98,101,32,99,114,101,97,116,101,100,32,108,105,107,101,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<36,114,101,32,61,32,113,114,123,92,40,32,40,63,58,32,40,63,62,91,94,40,41,93,43,41,32,124,32,40,63,112,123,36,114,101,125,41,32,41,42,32,92,41,125,120,59>>]}]},{p,[],[<<73,116,101,109,32,40,63,112,123,46,46,46,125,41,32,105,110,116,101,114,112,111,108,97,116,101,115,32,80,101,114,108,32,99,111,100,101,32,97,116,32,114,117,110,116,105,109,101,44,32,97,110,100,32,105,110,32,116,104,105,115,32,99,97,115,101,32,114,101,102,101,114,115,32,114,101,99,117,114,115,105,118,101,108,121,32,116,111,32,116,104,101,32,112,97,116,116,101,114,110,32,105,110,32,119,104,105,99,104,32,105,116,32,97,112,112,101,97,114,115,46>>]},{p,[],[<<79,98,118,105,111,117,115,108,121,44,32,80,67,82,69,32,99,97,110,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,105,110,116,101,114,112,111,108,97,116,105,111,110,32,111,102,32,80,101,114,108,32,99,111,100,101,46,32,73,110,115,116,101,97,100,44,32,105,116,32,115,117,112,112,111,114,116,115,32,115,112,101,99,105,97,108,32,115,121,110,116,97,120,32,102,111,114,32,114,101,99,117,114,115,105,111,110,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,102,111,114,32,105,110,100,105,118,105,100,117,97,108,32,115,117,98,112,97,116,116,101,114,110,32,114,101,99,117,114,115,105,111,110,46,32,65,102,116,101,114,32,105,116,115,32,105,110,116,114,111,100,117,99,116,105,111,110,32,105,110,32,80,67,82,69,32,97,110,100,32,80,121,116,104,111,110,44,32,116,104,105,115,32,107,105,110,100,32,111,102,32,114,101,99,117,114,115,105,111,110,32,119,97,115,32,108,97,116,101,114,32,105,110,116,114,111,100,117,99,101,100,32,105,110,116,111,32,80,101,114,108,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,48,46>>]},{p,[],[<<65,32,115,112,101,99,105,97,108,32,105,116,101,109,32,116,104,97,116,32,99,111,110,115,105,115,116,115,32,111,102,32,40,63,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,117,109,98,101,114,32,62,32,48,32,97,110,100,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,111,102,32,116,104,101,32,103,105,118,101,110,32,110,117,109,98,101,114,44,32,105,102,32,105,116,32,111,99,99,117,114,115,32,105,110,115,105,100,101,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,46,32,40,73,102,32,110,111,116,44,32,105,116,32,105,115,32,97,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,44,32,119,104,105,99,104,32,105,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46,41,32,84,104,101,32,115,112,101,99,105,97,108,32,105,116,101,109,32,40,63,82,41,32,111,114,32,40,63,48,41,32,105,115,32,97,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<84,104,105,115,32,80,67,82,69,32,112,97,116,116,101,114,110,32,115,111,108,118,101,115,32,116,104,101,32,110,101,115,116,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,111,98,108,101,109,32,40,97,115,115,117,109,101,32,116,104,97,116,32,111,112,116,105,111,110,32>>,{code,[],[<<101,120,116,101,110,100,101,100>>]},<<32,105,115,32,115,101,116,32,115,111,32,116,104,97,116,32,119,104,105,116,101,115,112,97,99,101,32,105,115,32,105,103,110,111,114,101,100,41,58>>]},{pre,[],[{code,[],[<<92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,82,41,32,41,42,32,92,41>>]}]},{p,[],[<<70,105,114,115,116,32,105,116,32,109,97,116,99,104,101,115,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,97,110,121,32,110,117,109,98,101,114,32,111,102,32,115,117,98,115,116,114,105,110,103,115,44,32,119,104,105,99,104,32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,32,115,101,113,117,101,110,99,101,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,111,114,32,97,32,114,101,99,117,114,115,105,118,101,32,109,97,116,99,104,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,32,40,116,104,97,116,32,105,115,44,32,97,32,99,111,114,114,101,99,116,108,121,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,115,116,114,105,110,103,41,46,32,70,105,110,97,108,108,121,32,116,104,101,114,101,32,105,115,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<73,102,32,116,104,105,115,32,119,97,115,32,112,97,114,116,32,111,102,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,121,111,117,32,119,111,117,108,100,32,110,111,116,32,119,97,110,116,32,116,111,32,114,101,99,117,114,115,101,32,116,104,101,32,101,110,116,105,114,101,32,112,97,116,116,101,114,110,44,32,115,111,32,105,110,115,116,101,97,100,32,121,111,117,32,99,97,110,32,117,115,101,58>>]},{pre,[],[{code,[],[<<40,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,49,41,32,41,42,32,92,41,32,41>>]}]},{p,[],[<<84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,104,101,114,101,32,119,105,116,104,105,110,32,112,97,114,101,110,116,104,101,115,101,115,32,115,111,32,116,104,97,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,114,101,102,101,114,115,32,116,111,32,116,104,101,109,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<73,110,32,97,32,108,97,114,103,101,114,32,112,97,116,116,101,114,110,44,32,107,101,101,112,105,110,103,32,116,114,97,99,107,32,111,102,32,112,97,114,101,110,116,104,101,115,105,115,32,110,117,109,98,101,114,115,32,99,97,110,32,98,101,32,116,114,105,99,107,121,46,32,84,104,105,115,32,105,115,32,109,97,100,101,32,101,97,115,105,101,114,32,98,121,32,116,104,101,32,117,115,101,32,111,102,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,115,46,32,73,110,115,116,101,97,100,32,111,102,32,40,63,49,41,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,97,98,111,118,101,44,32,121,111,117,32,99,97,110,32,119,114,105,116,101,32,40,63,45,50,41,32,116,111,32,114,101,102,101,114,32,116,111,32,116,104,101,32,115,101,99,111,110,100,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,112,114,101,99,101,100,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,84,104,97,116,32,105,115,44,32,97,32,110,101,103,97,116,105,118,101,32,110,117,109,98,101,114,32,99,111,117,110,116,115,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,108,101,102,116,119,97,114,100,115,32,102,114,111,109,32,116,104,101,32,112,111,105,110,116,32,97,116,32,119,104,105,99,104,32,105,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,46>>]},{p,[],[<<73,116,32,105,115,32,97,108,115,111,32,112,111,115,115,105,98,108,101,32,116,111,32,114,101,102,101,114,32,116,111,32,108,97,116,101,114,32,111,112,101,110,101,100,32,112,97,114,101,110,116,104,101,115,101,115,44,32,98,121,32,119,114,105,116,105,110,103,32,114,101,102,101,114,101,110,99,101,115,32,115,117,99,104,32,97,115,32,40,63,43,50,41,46,32,72,111,119,101,118,101,114,44,32,116,104,101,115,101,32,99,97,110,110,111,116,32,98,101,32,114,101,99,117,114,115,105,118,101,44,32,97,115,32,116,104,101,32,114,101,102,101,114,101,110,99,101,32,105,115,32,110,111,116,32,105,110,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,114,101,102,101,114,101,110,99,101,100,46,32,84,104,101,121,32,97,114,101,32,97,108,119,97,121,115,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,46>>]},{p,[],[<<65,110,32,97,108,116,101,114,110,97,116,105,118,101,32,97,112,112,114,111,97,99,104,32,105,115,32,116,111,32,117,115,101,32,110,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,115,116,101,97,100,46,32,84,104,101,32,80,101,114,108,32,115,121,110,116,97,120,32,102,111,114,32,116,104,105,115,32,105,115,32,40,63,38,110,97,109,101,41,46,32,84,104,101,32,101,97,114,108,105,101,114,32,80,67,82,69,32,115,121,110,116,97,120,32,40,63,80,62,110,97,109,101,41,32,105,115,32,97,108,115,111,32,115,117,112,112,111,114,116,101,100,46,32,87,101,32,99,97,110,32,114,101,119,114,105,116,101,32,116,104,101,32,97,98,111,118,101,32,101,120,97,109,112,108,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{pre,[],[{code,[],[<<40,63,60,112,110,62,32,92,40,32,40,32,91,94,40,41,93,43,43,32,124,32,40,63,38,112,110,41,32,41,42,32,92,41,32,41>>]}]},{p,[],[<<73,102,32,116,104,101,114,101,32,105,115,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,110,97,109,101,44,32,116,104,101,32,101,97,114,108,105,101,115,116,32,111,110,101,32,105,115,32,117,115,101,100,46>>]},{p,[],[<<84,104,105,115,32,112,97,114,116,105,99,117,108,97,114,32,101,120,97,109,112,108,101,32,112,97,116,116,101,114,110,32,116,104,97,116,32,119,101,32,104,97,118,101,32,115,116,117,100,105,101,100,32,99,111,110,116,97,105,110,115,32,110,101,115,116,101,100,32,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,117,115,101,32,111,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,102,111,114,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,115,32,111,102,32,110,111,110,45,112,97,114,101,110,116,104,101,115,101,115,32,105,115,32,105,109,112,111,114,116,97,110,116,32,119,104,101,110,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,115,116,114,105,110,103,115,32,116,104,97,116,32,100,111,32,110,111,116,32,109,97,116,99,104,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,119,104,101,110,32,116,104,105,115,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111>>]},{pre,[],[{code,[],[<<40,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,97,40,41>>]}]},{p,[],[<<105,116,32,103,105,118,101,115,32,34,110,111,32,109,97,116,99,104,34,32,113,117,105,99,107,108,121,46,32,72,111,119,101,118,101,114,44,32,105,102,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,105,115,32,110,111,116,32,117,115,101,100,44,32,116,104,101,32,109,97,116,99,104,32,114,117,110,115,32,102,111,114,32,97,32,108,111,110,103,32,116,105,109,101,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,115,111,32,109,97,110,121,32,100,105,102,102,101,114,101,110,116,32,119,97,121,115,32,116,104,101,32,43,32,97,110,100,32,42,32,114,101,112,101,97,116,115,32,99,97,110,32,99,97,114,118,101,32,117,112,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,110,100,32,97,108,108,32,109,117,115,116,32,98,101,32,116,101,115,116,101,100,32,98,101,102,111,114,101,32,102,97,105,108,117,114,101,32,99,97,110,32,98,101,32,114,101,112,111,114,116,101,100,46>>]},{p,[],[<<65,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,109,97,116,99,104,44,32,116,104,101,32,118,97,108,117,101,115,32,111,102,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,116,104,111,115,101,32,102,114,111,109,32,116,104,101,32,111,117,116,101,114,109,111,115,116,32,108,101,118,101,108,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,97,98,111,118,101,32,105,115,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116>>]},{pre,[],[{code,[],[<<40,97,98,40,99,100,41,101,102,41>>]}]},{p,[],[<<116,104,101,32,118,97,108,117,101,32,102,111,114,32,116,104,101,32,105,110,110,101,114,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,40,110,117,109,98,101,114,101,100,32,50,41,32,105,115,32,34,101,102,34,44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,108,97,115,116,32,118,97,108,117,101,32,116,97,107,101,110,32,111,110,32,97,116,32,116,104,101,32,116,111,112,45,108,101,118,101,108,46,32,73,102,32,97,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,109,97,116,99,104,101,100,32,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,105,116,115,32,102,105,110,97,108,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,32,105,115,32,117,110,115,101,116,44,32,101,118,101,110,32,105,102,32,105,116,32,119,97,115,32,40,116,101,109,112,111,114,97,114,105,108,121,41,32,115,101,116,32,97,116,32,97,32,100,101,101,112,101,114,32,108,101,118,101,108,32,100,117,114,105,110,103,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,114,111,99,101,115,115,46>>]},{p,[],[<<68,111,32,110,111,116,32,99,111,110,102,117,115,101,32,105,116,101,109,32,40,63,82,41,32,119,105,116,104,32,99,111,110,100,105,116,105,111,110,32,40,82,41,44,32,119,104,105,99,104,32,116,101,115,116,115,32,102,111,114,32,114,101,99,117,114,115,105,111,110,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,109,97,116,99,104,101,115,32,116,101,120,116,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,44,32,97,108,108,111,119,105,110,103,32,102,111,114,32,97,114,98,105,116,114,97,114,121,32,110,101,115,116,105,110,103,46,32,79,110,108,121,32,100,105,103,105,116,115,32,97,114,101,32,97,108,108,111,119,101,100,32,105,110,32,110,101,115,116,101,100,32,98,114,97,99,107,101,116,115,32,40,116,104,97,116,32,105,115,44,32,119,104,101,110,32,114,101,99,117,114,115,105,110,103,41,44,32,119,104,105,108,101,32,97,110,121,32,99,104,97,114,97,99,116,101,114,115,32,97,114,101,32,112,101,114,109,105,116,116,101,100,32,97,116,32,116,104,101,32,111,117,116,101,114,32,108,101,118,101,108,46>>]},{pre,[],[{code,[],[<<60,32,40,63,58,32,40,63,40,82,41,32,92,100,43,43,32,32,124,32,91,94,60,62,93,42,43,41,32,124,32,40,63,82,41,41,32,42,32,62>>]}]},{p,[],[<<72,101,114,101,32,40,63,40,82,41,32,105,115,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,44,32,119,105,116,104,32,116,119,111,32,100,105,102,102,101,114,101,110,116,32,97,108,116,101,114,110,97,116,105,118,101,115,32,102,111,114,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,97,110,100,32,110,111,110,45,114,101,99,117,114,115,105,118,101,32,99,97,115,101,115,46,32,73,116,101,109,32,40,63,82,41,32,105,115,32,116,104,101,32,97,99,116,117,97,108,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,46>>]},{p,[],[{em,[],[<<68,105,102,102,101,114,101,110,99,101,115,32,105,110,32,82,101,99,117,114,115,105,111,110,32,80,114,111,99,101,115,115,105,110,103,32,98,101,116,119,101,101,110,32,80,67,82,69,32,97,110,100,32,80,101,114,108>>]}]},{p,[],[<<82,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,110,32,80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,116,119,111,32,105,109,112,111,114,116,97,110,116,32,119,97,121,115,46,32,73,110,32,80,67,82,69,32,40,108,105,107,101,32,80,121,116,104,111,110,44,32,98,117,116,32,117,110,108,105,107,101,32,80,101,114,108,41,44,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,105,115,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,46,32,84,104,97,116,32,105,115,44,32,111,110,99,101,32,105,116,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,32,110,101,118,101,114,32,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,105,108,108,117,115,116,114,97,116,101,100,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,109,101,97,110,115,32,116,111,32,109,97,116,99,104,32,97,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,32,99,111,110,116,97,105,110,105,110,103,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,102,111,114,32,101,120,97,109,112,108,101,44,32,34,97,34,44,32,34,97,98,97,34,44,32,34,97,98,99,98,97,34,44,32,34,97,98,99,100,99,98,97,34,41,58>>]},{pre,[],[{code,[],[<<94,40,46,124,40,46,41,40,63,49,41,92,50,41,36>>]}]},{p,[],[<<84,104,101,32,105,100,101,97,32,105,115,32,116,104,97,116,32,105,116,32,101,105,116,104,101,114,32,109,97,116,99,104,101,115,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,111,114,32,116,119,111,32,105,100,101,110,116,105,99,97,108,32,99,104,97,114,97,99,116,101,114,115,32,115,117,114,114,111,117,110,100,105,110,103,32,97,32,115,117,98,112,97,108,105,110,100,114,111,109,101,46,32,73,110,32,80,101,114,108,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,119,111,114,107,115,59,32,105,110,32,80,67,82,69,32,105,116,32,100,111,101,115,32,110,111,116,32,119,111,114,107,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,108,111,110,103,101,114,32,116,104,97,110,32,116,104,114,101,101,32,99,104,97,114,97,99,116,101,114,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,34,97,98,99,98,97,34,46>>]},{p,[],[<<65,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,97,115,32,105,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,116,104,101,32,102,105,114,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,102,97,105,108,115,44,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,97,107,101,110,44,32,97,110,100,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,107,105,99,107,115,32,105,110,46,32,84,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,116,111,32,115,117,98,112,97,116,116,101,114,110,32,49,32,115,117,99,99,101,115,115,102,117,108,108,121,32,109,97,116,99,104,101,115,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,98,34,41,46,32,40,78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,97,110,100,32,101,110,100,32,111,102,32,108,105,110,101,32,116,101,115,116,115,32,97,114,101,32,110,111,116,32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,41>>]},{p,[],[<<66,97,99,107,32,97,116,32,116,104,101,32,116,111,112,32,108,101,118,101,108,44,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,34,99,34,41,32,105,115,32,99,111,109,112,97,114,101,100,32,119,105,116,104,32,119,104,97,116,32,115,117,98,112,97,116,116,101,114,110,32,50,32,109,97,116,99,104,101,100,44,32,119,104,105,99,104,32,119,97,115,32,34,97,34,46,32,84,104,105,115,32,102,97,105,108,115,46,32,65,115,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,105,115,32,116,114,101,97,116,101,100,32,97,115,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,44,32,116,104,101,114,101,32,97,114,101,32,110,111,119,32,110,111,32,98,97,99,107,116,114,97,99,107,105,110,103,32,112,111,105,110,116,115,44,32,97,110,100,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46,32,40,80,101,114,108,32,99,97,110,32,110,111,119,32,114,101,45,101,110,116,101,114,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,97,110,100,32,116,114,121,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,46,41,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,119,114,105,116,116,101,110,32,119,105,116,104,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,111,116,104,101,114,32,111,114,100,101,114,44,32,116,104,105,110,103,115,32,97,114,101,32,100,105,102,102,101,114,101,110,116,58>>]},{pre,[],[{code,[],[<<94,40,40,46,41,40,63,49,41,92,50,124,46,41,36>>]}]},{p,[],[<<84,104,105,115,32,116,105,109,101,44,32,116,104,101,32,114,101,99,117,114,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,116,114,105,101,100,32,102,105,114,115,116,44,32,97,110,100,32,99,111,110,116,105,110,117,101,115,32,116,111,32,114,101,99,117,114,115,101,32,117,110,116,105,108,32,105,116,32,114,117,110,115,32,111,117,116,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,97,116,32,119,104,105,99,104,32,112,111,105,110,116,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,115,46,32,66,117,116,32,116,104,105,115,32,116,105,109,101,32,119,101,32,104,97,118,101,32,97,110,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,116,114,121,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,46,32,84,104,97,116,32,105,115,32,116,104,101,32,115,105,103,110,105,102,105,99,97,110,116,32,100,105,102,102,101,114,101,110,99,101,58,32,105,110,32,116,104,101,32,112,114,101,118,105,111,117,115,32,99,97,115,101,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,105,115,32,97,116,32,97,32,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,108,101,118,101,108,44,32,119,104,105,99,104,32,80,67,82,69,32,99,97,110,110,111,116,32,117,115,101,46>>]},{p,[],[<<84,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,115,111,32,116,104,97,116,32,105,116,32,109,97,116,99,104,101,115,32,97,108,108,32,112,97,108,105,110,100,114,111,109,105,99,32,115,116,114,105,110,103,115,44,32,110,111,116,32,111,110,108,121,32,116,104,111,115,101,32,119,105,116,104,32,97,110,32,111,100,100,32,110,117,109,98,101,114,32,111,102,32,99,104,97,114,97,99,116,101,114,115,44,32,105,116,32,105,115,32,116,101,109,112,116,105,110,103,32,116,111,32,99,104,97,110,103,101,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<94,40,40,46,41,40,63,49,41,92,50,124,46,63,41,36>>]}]},{p,[],[<<65,103,97,105,110,44,32,116,104,105,115,32,119,111,114,107,115,32,105,110,32,80,101,114,108,44,32,98,117,116,32,110,111,116,32,105,110,32,80,67,82,69,44,32,97,110,100,32,102,111,114,32,116,104,101,32,115,97,109,101,32,114,101,97,115,111,110,46,32,87,104,101,110,32,97,32,100,101,101,112,101,114,32,114,101,99,117,114,115,105,111,110,32,104,97,115,32,109,97,116,99,104,101,100,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,101,110,116,101,114,101,100,32,97,103,97,105,110,32,116,111,32,109,97,116,99,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,46,32,84,104,101,32,115,111,108,117,116,105,111,110,32,105,115,32,116,111,32,115,101,112,97,114,97,116,101,32,116,104,101,32,116,119,111,32,99,97,115,101,115,44,32,97,110,100,32,119,114,105,116,101,32,111,117,116,32,116,104,101,32,111,100,100,32,97,110,100,32,101,118,101,110,32,99,97,115,101,115,32,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,116,32,116,104,101,32,104,105,103,104,101,114,32,108,101,118,101,108,58>>]},{pre,[],[{code,[],[<<94,40,63,58,40,40,46,41,40,63,49,41,92,50,124,41,124,40,40,46,41,40,63,51,41,92,52,124,46,41,41>>]}]},{p,[],[<<73,102,32,121,111,117,32,119,97,110,116,32,116,111,32,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,97,108,105,110,100,114,111,109,105,99,32,112,104,114,97,115,101,115,44,32,116,104,101,32,112,97,116,116,101,114,110,32,109,117,115,116,32,105,103,110,111,114,101,32,97,108,108,32,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,44,32,119,104,105,99,104,32,99,97,110,32,98,101,32,100,111,110,101,32,97,115,32,102,111,108,108,111,119,115,58>>]},{pre,[],[{code,[],[<<94,92,87,42,43,40,63,58,40,40,46,41,92,87,42,43,40,63,49,41,92,87,42,43,92,50,124,41,124,40,40,46,41,92,87,42,43,40,63,51,41,92,87,42,43,92,52,124,92,87,42,43,46,92,87,42,43,41,41,92,87,42,43,36>>]}]},{p,[],[<<73,102,32,114,117,110,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<99,97,115,101,108,101,115,115>>]},<<44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,112,104,114,97,115,101,115,32,115,117,99,104,32,97,115,32,34,65,32,109,97,110,44,32,97,32,112,108,97,110,44,32,97,32,99,97,110,97,108,58,32,80,97,110,97,109,97,33,34,32,97,110,100,32,105,116,32,119,111,114,107,115,32,119,101,108,108,32,105,110,32,98,111,116,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,46,32,78,111,116,105,99,101,32,116,104,101,32,117,115,101,32,111,102,32,116,104,101,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,42,43,32,116,111,32,97,118,111,105,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,115,101,113,117,101,110,99,101,115,32,111,102,32,110,111,110,45,119,111,114,100,32,99,104,97,114,97,99,116,101,114,115,46,32,87,105,116,104,111,117,116,32,116,104,105,115,44,32,80,67,82,69,32,116,97,107,101,115,32,109,117,99,104,32,108,111,110,103,101,114,32,40,49,48,32,116,105,109,101,115,32,111,114,32,109,111,114,101,41,32,116,111,32,109,97,116,99,104,32,116,121,112,105,99,97,108,32,112,104,114,97,115,101,115,44,32,97,110,100,32,80,101,114,108,32,116,97,107,101,115,32,115,111,32,108,111,110,103,32,116,104,97,116,32,121,111,117,32,116,104,105,110,107,32,105,116,32,104,97,115,32,103,111,110,101,32,105,110,116,111,32,97,32,108,111,111,112,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,112,97,108,105,110,100,114,111,109,101,45,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,115,32,97,98,111,118,101,32,119,111,114,107,32,111,110,108,121,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,100,111,101,115,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104,32,97,32,112,97,108,105,110,100,114,111,109,101,32,116,104,97,116,32,105,115,32,115,104,111,114,116,101,114,32,116,104,97,110,32,116,104,101,32,101,110,116,105,114,101,32,115,116,114,105,110,103,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,97,108,116,104,111,117,103,104,32,34,97,98,99,98,97,34,32,105,115,32,99,111,114,114,101,99,116,108,121,32,109,97,116,99,104,101,100,44,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,98,97,34,44,32,80,67,82,69,32,102,105,110,100,115,32,112,97,108,105,110,100,114,111,109,101,32,34,97,98,97,34,32,97,116,32,116,104,101,32,115,116,97,114,116,44,32,97,110,100,32,116,104,101,110,32,102,97,105,108,115,32,97,116,32,116,111,112,32,108,101,118,101,108,44,32,97,115,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,100,111,101,115,32,110,111,116,32,102,111,108,108,111,119,46,32,79,110,99,101,32,97,103,97,105,110,44,32,105,116,32,99,97,110,110,111,116,32,106,117,109,112,32,98,97,99,107,32,105,110,116,111,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,116,111,32,116,114,121,32,111,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46>>]}]},{p,[],[<<84,104,101,32,115,101,99,111,110,100,32,119,97,121,32,105,110,32,119,104,105,99,104,32,80,67,82,69,32,97,110,100,32,80,101,114,108,32,100,105,102,102,101,114,32,105,110,32,116,104,101,105,114,32,114,101,99,117,114,115,105,111,110,32,112,114,111,99,101,115,115,105,110,103,32,105,115,32,105,110,32,116,104,101,32,104,97,110,100,108,105,110,103,32,111,102,32,99,97,112,116,117,114,101,100,32,118,97,108,117,101,115,46,32,73,110,32,80,101,114,108,44,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,32,114,101,99,117,114,115,105,118,101,108,121,32,111,114,32,97,115,32,97,32,115,117,98,112,97,116,116,101,114,110,32,40,115,101,101,32,116,104,101,32,110,101,120,116,32,115,101,99,116,105,111,110,41,44,32,105,116,32,104,97,115,32,110,111,32,97,99,99,101,115,115,32,116,111,32,97,110,121,32,118,97,108,117,101,115,32,116,104,97,116,32,119,101,114,101,32,99,97,112,116,117,114,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,111,110,46,32,73,110,32,80,67,82,69,32,116,104,101,115,101,32,118,97,108,117,101,115,32,99,97,110,32,98,101,32,114,101,102,101,114,101,110,99,101,100,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<94,40,46,41,40,92,49,124,97,40,63,50,41,41>>]}]},{p,[],[<<73,110,32,80,67,82,69,44,32,105,116,32,109,97,116,99,104,101,115,32,34,98,97,98,34,46,32,84,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,110,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,103,114,111,117,112,44,32,119,104,101,110,32,116,104,101,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,32,92,49,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,109,97,116,99,104,101,115,32,34,97,34,44,32,97,110,100,32,116,104,101,110,32,114,101,99,117,114,115,101,115,46,32,73,110,32,116,104,101,32,114,101,99,117,114,115,105,111,110,44,32,92,49,32,100,111,101,115,32,110,111,119,32,109,97,116,99,104,32,34,98,34,32,97,110,100,32,115,111,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,46,32,73,110,32,80,101,114,108,44,32,116,104,101,32,112,97,116,116,101,114,110,32,102,97,105,108,115,32,116,111,32,109,97,116,99,104,32,98,101,99,97,117,115,101,32,105,110,115,105,100,101,32,116,104,101,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,92,49,32,99,97,110,110,111,116,32,97,99,99,101,115,115,32,116,104,101,32,101,120,116,101,114,110,97,108,108,121,32,115,101,116,32,118,97,108,117,101,46>>]},{a,[{id,<<115,101,99,116,50,49>>}],[]},{h2,[],[<<83,117,98,112,97,116,116,101,114,110,115,32,97,115,32,83,117,98,114,111,117,116,105,110,101,115>>]},{p,[],[<<73,102,32,116,104,101,32,115,121,110,116,97,120,32,102,111,114,32,97,32,114,101,99,117,114,115,105,118,101,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,32,40,101,105,116,104,101,114,32,98,121,32,110,117,109,98,101,114,32,111,114,32,98,121,32,110,97,109,101,41,32,105,115,32,117,115,101,100,32,111,117,116,115,105,100,101,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,116,111,32,119,104,105,99,104,32,105,116,32,114,101,102,101,114,115,44,32,105,116,32,111,112,101,114,97,116,101,115,32,108,105,107,101,32,97,32,115,117,98,114,111,117,116,105,110,101,32,105,110,32,97,32,112,114,111,103,114,97,109,109,105,110,103,32,108,97,110,103,117,97,103,101,46,32,84,104,101,32,99,97,108,108,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,98,101,32,100,101,102,105,110,101,100,32,98,101,102,111,114,101,32,111,114,32,97,102,116,101,114,32,116,104,101,32,114,101,102,101,114,101,110,99,101,46,32,65,32,110,117,109,98,101,114,101,100,32,114,101,102,101,114,101,110,99,101,32,99,97,110,32,98,101,32,97,98,115,111,108,117,116,101,32,111,114,32,114,101,108,97,116,105,118,101,44,32,97,115,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,115,58>>]},{pre,[],[{code,[],[<<40,46,46,46,40,97,98,115,111,108,117,116,101,41,46,46,46,41,46,46,46,40,63,50,41,46,46,46,10,40,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46,41,46,46,46,40,63,45,49,41,46,46,46,10,40,46,46,46,40,63,43,49,41,46,46,46,40,114,101,108,97,116,105,118,101,41,46,46,46>>]}]},{p,[],[<<65,110,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,32,112,111,105,110,116,101,100,32,111,117,116,32,116,104,97,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,115,101,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,34,114,101,115,112,111,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,44,32,98,117,116,32,110,111,116,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,58>>]},{pre,[],[{code,[],[<<40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,49,105,98,105,108,105,116,121>>]}]},{p,[],[<<73,102,32,105,110,115,116,101,97,100,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,117,115,101,100,44,32,105,116,32,109,97,116,99,104,101,115,32,34,115,101,110,115,101,32,97,110,100,32,114,101,115,112,111,110,115,105,98,105,108,105,116,121,34,32,97,110,100,32,116,104,101,32,111,116,104,101,114,32,116,119,111,32,115,116,114,105,110,103,115,58>>]},{pre,[],[{code,[],[<<40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,40,63,49,41,105,98,105,108,105,116,121>>]}]},{p,[],[<<65,110,111,116,104,101,114,32,101,120,97,109,112,108,101,32,105,115,32,112,114,111,118,105,100,101,100,32,105,110,32,116,104,101,32,100,105,115,99,117,115,115,105,111,110,32,111,102,32,68,69,70,73,78,69,32,101,97,114,108,105,101,114,46>>]},{p,[],[<<65,108,108,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,44,32,114,101,99,117,114,115,105,118,101,32,111,114,32,110,111,116,44,32,97,114,101,32,97,108,119,97,121,115,32,116,114,101,97,116,101,100,32,97,115,32,97,116,111,109,105,99,32,103,114,111,117,112,115,46,32,84,104,97,116,32,105,115,44,32,111,110,99,101,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,109,97,116,99,104,101,100,32,115,111,109,101,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,105,116,32,105,115,32,110,101,118,101,114,32,114,101,45,101,110,116,101,114,101,100,44,32,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,117,110,116,114,105,101,100,32,97,108,116,101,114,110,97,116,105,118,101,115,32,97,110,100,32,116,104,101,114,101,32,105,115,32,97,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,46,32,65,110,121,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,100,117,114,105,110,103,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,32,114,101,118,101,114,116,32,116,111,32,116,104,101,105,114,32,112,114,101,118,105,111,117,115,32,118,97,108,117,101,115,32,97,102,116,101,114,119,97,114,100,115,46>>]},{p,[],[<<80,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,115,32,115,117,99,104,32,97,115,32,99,97,115,101,45,105,110,100,101,112,101,110,100,101,110,99,101,32,97,114,101,32,102,105,120,101,100,32,119,104,101,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,100,101,102,105,110,101,100,44,32,115,111,32,105,102,32,105,116,32,105,115,32,117,115,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,115,117,99,104,32,111,112,116,105,111,110,115,32,99,97,110,110,111,116,32,98,101,32,99,104,97,110,103,101,100,32,102,111,114,32,100,105,102,102,101,114,101,110,116,32,99,97,108,108,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,34,97,98,99,97,98,99,34,32,98,117,116,32,110,111,116,32,34,97,98,99,65,66,67,34,44,32,97,115,32,116,104,101,32,99,104,97,110,103,101,32,111,102,32,112,114,111,99,101,115,115,105,110,103,32,111,112,116,105,111,110,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,116,104,101,32,99,97,108,108,101,100,32,115,117,98,112,97,116,116,101,114,110,58>>]},{pre,[],[{code,[],[<<40,97,98,99,41,40,63,105,58,40,63,45,49,41,41>>]}]},{a,[{id,<<115,101,99,116,50,50>>}],[]},{h2,[],[<<79,110,105,103,117,114,117,109,97,32,83,117,98,114,111,117,116,105,110,101,32,83,121,110,116,97,120>>]},{p,[],[<<70,111,114,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,119,105,116,104,32,79,110,105,103,117,114,117,109,97,44,32,116,104,101,32,110,111,110,45,80,101,114,108,32,115,121,110,116,97,120,32,92,103,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,32,111,114,32,97,32,110,117,109,98,101,114,32,101,110,99,108,111,115,101,100,32,101,105,116,104,101,114,32,105,110,32,97,110,103,108,101,32,98,114,97,99,107,101,116,115,32,111,114,32,115,105,110,103,108,101,32,113,117,111,116,101,115,44,32,105,115,32,97,108,116,101,114,110,97,116,105,118,101,32,115,121,110,116,97,120,32,102,111,114,32,114,101,102,101,114,101,110,99,105,110,103,32,97,32,115,117,98,112,97,116,116,101,114,110,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,112,111,115,115,105,98,108,121,32,114,101,99,117,114,115,105,118,101,108,121,46,32,72,101,114,101,32,102,111,108,108,111,119,115,32,116,119,111,32,111,102,32,116,104,101,32,101,120,97,109,112,108,101,115,32,117,115,101,100,32,97,98,111,118,101,44,32,114,101,119,114,105,116,116,101,110,32,117,115,105,110,103,32,116,104,105,115,32,115,121,110,116,97,120,58>>]},{pre,[],[{code,[],[<<40,63,60,112,110,62,32,92,40,32,40,32,40,63,62,91,94,40,41,93,43,41,32,124,32,92,103,60,112,110,62,32,41,42,32,92,41,32,41,10,40,115,101,110,115,124,114,101,115,112,111,110,115,41,101,32,97,110,100,32,92,103,39,49,39,105,98,105,108,105,116,121>>]}]},{p,[],[<<80,67,82,69,32,115,117,112,112,111,114,116,115,32,97,110,32,101,120,116,101,110,115,105,111,110,32,116,111,32,79,110,105,103,117,114,117,109,97,58,32,105,102,32,97,32,110,117,109,98,101,114,32,105,115,32,112,114,101,99,101,100,101,100,32,98,121,32,97,32,112,108,117,115,32,111,114,32,109,105,110,117,115,32,115,105,103,110,44,32,105,116,32,105,115,32,116,97,107,101,110,32,97,115,32,97,32,114,101,108,97,116,105,118,101,32,114,101,102,101,114,101,110,99,101,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<40,97,98,99,41,40,63,105,58,92,103,60,45,49,62,41>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,92,103,123,46,46,46,125,32,40,80,101,114,108,32,115,121,110,116,97,120,41,32,97,110,100,32,92,103,60,46,46,46,62,32,40,79,110,105,103,117,114,117,109,97,32,115,121,110,116,97,120,41,32,97,114,101,32>>,{em,[],[<<110,111,116>>]},<<32,115,121,110,111,110,121,109,111,117,115,46,32,84,104,101,32,102,111,114,109,101,114,32,105,115,32,97,32,98,97,99,107,32,114,101,102,101,114,101,110,99,101,59,32,116,104,101,32,108,97,116,116,101,114,32,105,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46>>]},{a,[{id,<<115,101,99,116,50,51>>}],[]},{h2,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108>>]},{p,[],[<<80,101,114,108,32,53,46,49,48,32,105,110,116,114,111,100,117,99,101,100,32,115,111,109,101,32,34,83,112,101,99,105,97,108,32,66,97,99,107,116,114,97,99,107,105,110,103,32,67,111,110,116,114,111,108,32,86,101,114,98,115,34,44,32,119,104,105,99,104,32,97,114,101,32,115,116,105,108,108,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,97,115,32,34,101,120,112,101,114,105,109,101,110,116,97,108,32,97,110,100,32,115,117,98,106,101,99,116,32,116,111,32,99,104,97,110,103,101,32,111,114,32,114,101,109,111,118,97,108,32,105,110,32,97,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,32,111,102,32,80,101,114,108,34,46,32,73,116,32,103,111,101,115,32,111,110,32,116,111,32,115,97,121,58,32,34,84,104,101,105,114,32,117,115,97,103,101,32,105,110,32,112,114,111,100,117,99,116,105,111,110,32,99,111,100,101,32,115,104,111,117,108,100,32,98,101,32,110,111,116,101,100,32,116,111,32,97,118,111,105,100,32,112,114,111,98,108,101,109,115,32,100,117,114,105,110,103,32,117,112,103,114,97,100,101,115,46,34,32,84,104,101,32,115,97,109,101,32,114,101,109,97,114,107,115,32,97,112,112,108,121,32,116,111,32,116,104,101,32,80,67,82,69,32,102,101,97,116,117,114,101,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,116,104,105,115,32,115,101,99,116,105,111,110,46>>]},{p,[],[<<84,104,101,32,110,101,119,32,118,101,114,98,115,32,109,97,107,101,32,117,115,101,32,111,102,32,119,104,97,116,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,105,110,118,97,108,105,100,32,115,121,110,116,97,120,58,32,97,110,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32,97,110,32,97,115,116,101,114,105,115,107,46,32,84,104,101,121,32,97,114,101,32,103,101,110,101,114,97,108,108,121,32,111,102,32,116,104,101,32,102,111,114,109,32,40,42,86,69,82,66,41,32,111,114,32,40,42,86,69,82,66,58,78,65,77,69,41,46,32,83,111,109,101,32,99,97,110,32,116,97,107,101,32,101,105,116,104,101,114,32,102,111,114,109,44,32,112,111,115,115,105,98,108,121,32,98,101,104,97,118,105,110,103,32,100,105,102,102,101,114,101,110,116,108,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,119,104,101,116,104,101,114,32,97,32,110,97,109,101,32,105,115,32,112,114,101,115,101,110,116,46,32,65,32,110,97,109,101,32,105,115,32,97,110,121,32,115,101,113,117,101,110,99,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,105,110,99,108,117,100,101,32,97,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,46,32,84,104,101,32,109,97,120,105,109,117,109,32,110,97,109,101,32,108,101,110,103,116,104,32,105,115,32,50,53,53,32,105,110,32,116,104,101,32,56,45,98,105,116,32,108,105,98,114,97,114,121,32,97,110,100,32,54,53,53,51,53,32,105,110,32,116,104,101,32,49,54,45,98,105,116,32,97,110,100,32,51,50,45,98,105,116,32,108,105,98,114,97,114,105,101,115,46,32,73,102,32,116,104,101,32,110,97,109,101,32,105,115,32,101,109,112,116,121,44,32,116,104,97,116,32,105,115,44,32,105,102,32,116,104,101,32,99,108,111,115,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,115,32,116,104,101,32,99,111,108,111,110,44,32,116,104,101,32,101,102,102,101,99,116,32,105,115,32,97,115,32,105,102,32,116,104,101,32,99,111,108,111,110,32,119,97,115,32,110,111,116,32,116,104,101,114,101,46,32,65,110,121,32,110,117,109,98,101,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,99,97,110,32,111,99,99,117,114,32,105,110,32,97,32,112,97,116,116,101,114,110,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,44,32,97,115,115,101,114,116,105,111,110,115,44,32,97,110,100,32,105,110,32,115,117,98,112,97,116,116,101,114,110,115,32,99,97,108,108,101,100,32,97,115,32,115,117,98,114,111,117,116,105,110,101,115,32,40,119,104,101,116,104,101,114,32,111,114,32,110,111,116,32,114,101,99,117,114,115,105,118,101,108,121,41,32,105,115,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,46>>]},{p,[],[{em,[],[<<79,112,116,105,109,105,122,97,116,105,111,110,115,32,84,104,97,116,32,65,102,102,101,99,116,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115>>]}]},{p,[],[<<80,67,82,69,32,99,111,110,116,97,105,110,115,32,115,111,109,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,116,104,97,116,32,97,114,101,32,117,115,101,100,32,116,111,32,115,112,101,101,100,32,117,112,32,109,97,116,99,104,105,110,103,32,98,121,32,114,117,110,110,105,110,103,32,115,111,109,101,32,99,104,101,99,107,115,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,101,97,99,104,32,109,97,116,99,104,32,97,116,116,101,109,112,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,116,32,99,97,110,32,107,110,111,119,32,116,104,101,32,109,105,110,105,109,117,109,32,108,101,110,103,116,104,32,111,102,32,109,97,116,99,104,105,110,103,32,115,117,98,106,101,99,116,44,32,111,114,32,116,104,97,116,32,97,32,112,97,114,116,105,99,117,108,97,114,32,99,104,97,114,97,99,116,101,114,32,109,117,115,116,32,98,101,32,112,114,101,115,101,110,116,46,32,87,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,112,97,115,115,101,115,32,116,104,101,32,114,117,110,110,105,110,103,32,111,102,32,97,32,109,97,116,99,104,44,32,97,110,121,32,105,110,99,108,117,100,101,100,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,112,114,111,99,101,115,115,101,100,46,32,112,114,111,99,101,115,115,101,100,46,32,89,111,117,32,99,97,110,32,115,117,112,112,114,101,115,115,32,116,104,101,32,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,98,121,32,115,101,116,116,105,110,103,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]},<<32,119,104,101,110,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,111,114,32,98,121,32,115,116,97,114,116,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,119,105,116,104,32,40,42,78,79,95,83,84,65,82,84,95,79,80,84,41,46>>]},{p,[],[<<69,120,112,101,114,105,109,101,110,116,115,32,119,105,116,104,32,80,101,114,108,32,115,117,103,103,101,115,116,32,116,104,97,116,32,105,116,32,116,111,111,32,104,97,115,32,115,105,109,105,108,97,114,32,111,112,116,105,109,105,122,97,116,105,111,110,115,44,32,115,111,109,101,116,105,109,101,115,32,108,101,97,100,105,110,103,32,116,111,32,97,110,111,109,97,108,111,117,115,32,114,101,115,117,108,116,115,46>>]},{p,[],[{em,[],[<<86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,73,109,109,101,100,105,97,116,101,108,121>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,97,99,116,32,97,115,32,115,111,111,110,32,97,115,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,101,121,32,109,117,115,116,32,110,111,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,46>>]},{pre,[],[{code,[],[<<40,42,65,67,67,69,80,84,41>>]}]},{p,[],[<<84,104,105,115,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,101,110,100,32,115,117,99,99,101,115,115,102,117,108,108,121,44,32,115,107,105,112,112,105,110,103,32,116,104,101,32,114,101,109,97,105,110,100,101,114,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,105,116,32,105,115,32,105,110,115,105,100,101,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,105,115,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,44,32,111,110,108,121,32,116,104,97,116,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,101,110,100,101,100,32,115,117,99,99,101,115,115,102,117,108,108,121,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,116,32,116,104,101,32,111,117,116,101,114,32,108,101,118,101,108,46,32,73,102,32,40,42,65,67,67,69,80,84,41,32,105,115,32,116,114,105,103,103,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,115,117,99,99,101,101,100,115,59,32,105,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,102,97,105,108,115,46>>]},{p,[],[<<73,102,32,40,42,65,67,67,69,80,84,41,32,105,115,32,105,110,115,105,100,101,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,44,32,116,104,101,32,100,97,116,97,32,115,111,32,102,97,114,32,105,115,32,99,97,112,116,117,114,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,65,65,68,34,44,32,111,114,32,34,65,67,68,34,46,32,87,104,101,110,32,105,116,32,109,97,116,99,104,101,115,32,34,65,66,34,44,32,34,66,34,32,105,115,32,99,97,112,116,117,114,101,100,32,98,121,32,116,104,101,32,111,117,116,101,114,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{pre,[],[{code,[],[<<65,40,40,63,58,65,124,66,40,42,65,67,67,69,80,84,41,124,67,41,68,41>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,44,32,102,111,114,99,105,110,103,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,111,99,99,117,114,46,32,73,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,40,63,33,41,32,98,117,116,32,101,97,115,105,101,114,32,116,111,32,114,101,97,100,46>>]},{pre,[],[{code,[],[<<40,42,70,65,73,76,41,32,111,114,32,40,42,70,41>>]}]},{p,[],[<<84,104,101,32,80,101,114,108,32,100,111,99,117,109,101,110,116,97,116,105,111,110,32,115,116,97,116,101,115,32,116,104,97,116,32,105,116,32,105,115,32,112,114,111,98,97,98,108,121,32,117,115,101,102,117,108,32,111,110,108,121,32,119,104,101,110,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,40,63,123,125,41,32,111,114,32,40,63,63,123,125,41,46,32,84,104,111,115,101,32,97,114,101,32,80,101,114,108,32,102,101,97,116,117,114,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,80,67,82,69,46>>]},{p,[],[<<65,32,109,97,116,99,104,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,34,97,97,97,97,34,32,97,108,119,97,121,115,32,102,97,105,108,115,44,32,98,117,116,32,116,104,101,32,99,97,108,108,111,117,116,32,105,115,32,116,97,107,101,110,32,98,101,102,111,114,101,32,101,97,99,104,32,98,97,99,107,116,114,97,99,107,32,111,99,99,117,114,115,32,40,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,44,32,49,48,32,116,105,109,101,115,41,46>>]},{p,[],[{em,[],[<<82,101,99,111,114,100,105,110,103,32,87,104,105,99,104,32,80,97,116,104,32,87,97,115,32,84,97,107,101,110>>]}]},{p,[],[<<84,104,101,32,109,97,105,110,32,112,117,114,112,111,115,101,32,111,102,32,116,104,105,115,32,118,101,114,98,32,105,115,32,116,111,32,116,114,97,99,107,32,104,111,119,32,97,32,109,97,116,99,104,32,119,97,115,32,97,114,114,105,118,101,100,32,97,116,44,32,97,108,116,104,111,117,103,104,32,105,116,32,97,108,115,111,32,104,97,115,32,97,32,115,101,99,111,110,100,97,114,121,32,117,115,101,32,105,110,32,119,105,116,104,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,109,97,116,99,104,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,40,115,101,101,32,40,42,83,75,73,80,41,32,98,101,108,111,119,41,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<73,110,32,69,114,108,97,110,103,44,32,116,104,101,114,101,32,105,115,32,110,111,32,105,110,116,101,114,102,97,99,101,32,116,111,32,114,101,116,114,105,101,118,101,32,97,32,109,97,114,107,32,119,105,116,104,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,50,44,51>>]}]},<<44,32,115,111,32,111,110,108,121,32,116,104,101,32,115,101,99,111,110,100,97,114,121,32,112,117,114,112,111,115,101,32,105,115,32,114,101,108,101,118,97,110,116,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,46>>]},{p,[],[<<84,104,101,32,114,101,115,116,32,111,102,32,116,104,105,115,32,115,101,99,116,105,111,110,32,105,115,32,116,104,101,114,101,102,111,114,101,32,100,101,108,105,98,101,114,97,116,101,108,121,32,110,111,116,32,97,100,97,112,116,101,100,32,102,111,114,32,114,101,97,100,105,110,103,32,98,121,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,98,117,116,32,116,104,101,32,101,120,97,109,112,108,101,115,32,99,97,110,32,104,101,108,112,32,105,110,32,117,110,100,101,114,115,116,97,110,100,105,110,103,32,78,65,77,69,83,32,97,115,32,116,104,101,121,32,99,97,110,32,98,101,32,117,115,101,100,32,98,121,32,40,42,83,75,73,80,41,46>>]}]},{pre,[],[{code,[],[<<40,42,77,65,82,75,58,78,65,77,69,41,32,111,114,32,40,42,58,78,65,77,69,41>>]}]},{p,[],[<<65,32,110,97,109,101,32,105,115,32,97,108,119,97,121,115,32,114,101,113,117,105,114,101,100,32,119,105,116,104,32,116,104,105,115,32,118,101,114,98,46,32,84,104,101,114,101,32,99,97,110,32,98,101,32,97,115,32,109,97,110,121,32,105,110,115,116,97,110,99,101,115,32,111,102,32,40,42,77,65,82,75,41,32,97,115,32,121,111,117,32,108,105,107,101,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,110,100,32,116,104,101,105,114,32,110,97,109,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,116,111,32,98,101,32,117,110,105,113,117,101,46>>]},{p,[],[<<87,104,101,110,32,97,32,109,97,116,99,104,32,115,117,99,99,101,101,100,115,44,32,116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,40,42,77,65,82,75,58,78,65,77,69,41,44,32,40,42,80,82,85,78,69,58,78,65,77,69,41,44,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,32,111,110,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,32,97,115,32,100,101,115,99,114,105,98,101,100,32,105,110,32,115,101,99,116,105,111,110,32,34,69,120,116,114,97,32,100,97,116,97,32,102,111,114,32>>,{code,[],[<<112,99,114,101,95,101,120,101,99,40,41>>]},<<34,32,105,110,32,116,104,101,32>>,{code,[],[<<112,99,114,101,97,112,105>>]},<<32,100,111,99,117,109,101,110,116,97,116,105,111,110,46,32,73,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,111,102,32>>,{code,[],[<<112,99,114,101,116,101,115,116>>]},<<32,111,117,116,112,117,116,44,32,116,104,101,32,47,75,32,109,111,100,105,102,105,101,114,32,114,101,113,117,101,115,116,115,32,116,104,101,32,114,101,116,114,105,101,118,97,108,32,97,110,100,32,111,117,116,112,117,116,116,105,110,103,32,111,102,32,40,42,77,65,82,75,41,32,100,97,116,97,58>>]},{pre,[],[{code,[],[<<32,32,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,89,10,32,48,58,32,88,89,10,77,75,58,32,65,10,88,90,10,32,48,58,32,88,90,10,77,75,58,32,66>>]}]},{p,[],[<<84,104,101,32,40,42,77,65,82,75,41,32,110,97,109,101,32,105,115,32,116,97,103,103,101,100,32,119,105,116,104,32,34,77,75,58,34,32,105,110,32,116,104,105,115,32,111,117,116,112,117,116,44,32,97,110,100,32,105,110,32,116,104,105,115,32,101,120,97,109,112,108,101,32,105,116,32,105,110,100,105,99,97,116,101,115,32,119,104,105,99,104,32,111,102,32,116,104,101,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,101,100,46,32,84,104,105,115,32,105,115,32,97,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,119,97,121,32,111,102,32,111,98,116,97,105,110,105,110,103,32,116,104,105,115,32,105,110,102,111,114,109,97,116,105,111,110,32,116,104,97,110,32,112,117,116,116,105,110,103,32,101,97,99,104,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,105,116,115,32,111,119,110,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,46>>]},{p,[],[<<73,102,32,97,32,118,101,114,98,32,119,105,116,104,32,97,32,110,97,109,101,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,99,111,114,100,101,100,32,97,110,100,32,112,97,115,115,101,100,32,98,97,99,107,32,105,102,32,105,116,32,105,115,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,46,32,84,104,105,115,32,100,111,101,115,32,110,111,116,32,111,99,99,117,114,32,102,111,114,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,111,114,32,102,97,105,108,105,110,103,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,46>>]},{p,[],[<<65,102,116,101,114,32,97,32,112,97,114,116,105,97,108,32,109,97,116,99,104,32,111,114,32,97,32,102,97,105,108,101,100,32,109,97,116,99,104,44,32,116,104,101,32,108,97,115,116,32,101,110,99,111,117,110,116,101,114,101,100,32,110,97,109,101,32,105,110,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,112,114,111,99,101,115,115,32,105,115,32,114,101,116,117,114,110,101,100,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<32,32,114,101,62,32,47,88,40,42,77,65,82,75,58,65,41,89,124,88,40,42,77,65,82,75,58,66,41,90,47,75,10,100,97,116,97,62,32,88,80,10,78,111,32,109,97,116,99,104,44,32,109,97,114,107,32,61,32,66>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,105,110,32,116,104,105,115,32,117,110,97,110,99,104,111,114,101,100,32,101,120,97,109,112,108,101,44,32,116,104,101,32,109,97,114,107,32,105,115,32,114,101,116,97,105,110,101,100,32,102,114,111,109,32,116,104,101,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,116,104,97,116,32,115,116,97,114,116,101,100,32,97,116,32,108,101,116,116,101,114,32,34,88,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,46,32,83,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,115,32,115,116,97,114,116,105,110,103,32,97,116,32,34,80,34,32,97,110,100,32,116,104,101,110,32,119,105,116,104,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,100,111,32,110,111,116,32,103,101,116,32,97,115,32,102,97,114,32,97,115,32,116,104,101,32,40,42,77,65,82,75,41,32,105,116,101,109,44,32,110,101,118,101,114,116,104,101,108,101,115,115,32,100,111,32,110,111,116,32,114,101,115,101,116,32,105,116,46>>]},{p,[],[{em,[],[<<86,101,114,98,115,32,84,104,97,116,32,65,99,116,32,97,102,116,101,114,32,66,97,99,107,116,114,97,99,107,105,110,103>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,115,32,100,111,32,110,111,116,104,105,110,103,32,119,104,101,110,32,116,104,101,121,32,97,114,101,32,101,110,99,111,117,110,116,101,114,101,100,46,32,77,97,116,99,104,105,110,103,32,99,111,110,116,105,110,117,101,115,32,119,105,116,104,32,119,104,97,116,32,102,111,108,108,111,119,115,44,32,98,117,116,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,44,32,99,97,117,115,105,110,103,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,32,116,104,101,32,118,101,114,98,44,32,97,32,102,97,105,108,117,114,101,32,105,115,32,102,111,114,99,101,100,46,32,84,104,97,116,32,105,115,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,112,97,115,115,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,118,101,114,98,46,32,72,111,119,101,118,101,114,44,32,119,104,101,110,32,111,110,101,32,111,102,32,116,104,101,115,101,32,118,101,114,98,115,32,97,112,112,101,97,114,115,32,105,110,115,105,100,101,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,97,110,32,97,115,115,101,114,116,105,111,110,32,116,104,97,116,32,105,115,32,116,114,117,101,44,32,105,116,115,32,101,102,102,101,99,116,32,105,115,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,97,116,32,103,114,111,117,112,44,32,97,115,32,111,110,99,101,32,116,104,101,32,103,114,111,117,112,32,104,97,115,32,98,101,101,110,32,109,97,116,99,104,101,100,44,32,116,104,101,114,101,32,105,115,32,110,101,118,101,114,32,97,110,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,105,116,46,32,73,110,32,116,104,105,115,32,115,105,116,117,97,116,105,111,110,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,34,106,117,109,112,32,98,97,99,107,34,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,116,104,101,32,101,110,116,105,114,101,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,97,115,115,101,114,116,105,111,110,46,32,40,82,101,109,101,109,98,101,114,32,97,108,115,111,44,32,97,115,32,115,116,97,116,101,100,32,97,98,111,118,101,44,32,116,104,97,116,32,116,104,105,115,32,108,111,99,97,108,105,122,97,116,105,111,110,32,97,108,115,111,32,97,112,112,108,105,101,115,32,105,110,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,115,46,41>>]},{p,[],[<<84,104,101,115,101,32,118,101,114,98,115,32,100,105,102,102,101,114,32,105,110,32,101,120,97,99,116,108,121,32,119,104,97,116,32,107,105,110,100,32,111,102,32,102,97,105,108,117,114,101,32,111,99,99,117,114,115,32,119,104,101,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,114,101,97,99,104,101,115,32,116,104,101,109,46,32,84,104,101,32,98,101,104,97,118,105,111,114,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,32,105,115,32,119,104,97,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,118,101,114,98,32,105,115,32,110,111,116,32,105,110,32,97,32,115,117,98,114,111,117,116,105,110,101,32,111,114,32,97,110,32,97,115,115,101,114,116,105,111,110,46,32,83,117,98,115,101,113,117,101,110,116,32,115,101,99,116,105,111,110,115,32,99,111,118,101,114,32,116,104,101,115,101,32,115,112,101,99,105,97,108,32,99,97,115,101,115,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,105,99,104,32,109,117,115,116,32,110,111,116,32,98,101,32,102,111,108,108,111,119,101,100,32,98,121,32,97,32,110,97,109,101,44,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,111,117,116,114,105,103,104,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,114,101,97,99,104,32,105,116,46,32,69,118,101,110,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,110,111,32,102,117,114,116,104,101,114,32,97,116,116,101,109,112,116,115,32,116,111,32,102,105,110,100,32,97,32,109,97,116,99,104,32,98,121,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,116,97,107,101,32,112,108,97,99,101,46>>]},{pre,[],[{code,[],[<<40,42,67,79,77,77,73,84,41>>]}]},{p,[],[<<73,102,32,40,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,111,110,108,121,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,116,104,97,116,32,105,115,32,101,110,99,111,117,110,116,101,114,101,100,44,32,111,110,99,101,32,105,116,32,104,97,115,32,98,101,101,110,32,112,97,115,115,101,100,44,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,50,44,51>>]}]},<<32,105,115,32,99,111,109,109,105,116,116,101,100,32,116,111,32,102,105,110,100,32,97,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,44,32,111,114,32,110,111,116,32,97,116,32,97,108,108,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<97,43,40,42,67,79,77,77,73,84,41,98>>]}]},{p,[],[<<84,104,105,115,32,109,97,116,99,104,101,115,32,34,120,120,97,97,98,34,32,98,117,116,32,110,111,116,32,34,97,97,99,97,97,98,34,46,32,73,116,32,99,97,110,32,98,101,32,116,104,111,117,103,104,116,32,111,102,32,97,115,32,97,32,107,105,110,100,32,111,102,32,100,121,110,97,109,105,99,32,97,110,99,104,111,114,44,32,111,114,32,34,73,39,118,101,32,115,116,97,114,116,101,100,44,32,115,111,32,73,32,109,117,115,116,32,102,105,110,105,115,104,34,46,32,84,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,108,121,32,112,97,115,115,101,100,32,40,42,77,65,82,75,41,32,105,110,32,116,104,101,32,112,97,116,104,32,105,115,32,112,97,115,115,101,100,32,98,97,99,107,32,119,104,101,110,32,40,42,67,79,77,77,73,84,41,32,102,111,114,99,101,115,32,97,32,109,97,116,99,104,32,102,97,105,108,117,114,101,46>>]},{p,[],[<<73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,101,120,105,115,116,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,97,32,100,105,102,102,101,114,101,110,116,32,111,110,101,32,116,104,97,116,32,102,111,108,108,111,119,115,32,40,42,67,79,77,77,73,84,41,32,99,97,110,32,98,101,32,116,114,105,103,103,101,114,101,100,32,102,105,114,115,116,44,32,115,111,32,109,101,114,101,108,121,32,112,97,115,115,105,110,103,32,40,42,67,79,77,77,73,84,41,32,100,117,114,105,110,103,32,97,32,109,97,116,99,104,32,100,111,101,115,32,110,111,116,32,97,108,119,97,121,115,32,103,117,97,114,97,110,116,101,101,32,116,104,97,116,32,97,32,109,97,116,99,104,32,109,117,115,116,32,98,101,32,97,116,32,116,104,105,115,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,40,42,67,79,77,77,73,84,41,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,97,32,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,97,110,32,97,110,99,104,111,114,44,32,117,110,108,101,115,115,32,116,104,101,32,80,67,82,69,32,115,116,97,114,116,45,111,102,45,109,97,116,99,104,32,111,112,116,105,109,105,122,97,116,105,111,110,115,32,97,114,101,32,116,117,114,110,101,100,32,111,102,102,44,32,97,115,32,115,104,111,119,110,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<49,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,93,41,46,10,123,109,97,116,99,104,44,91,34,97,98,99,34,93,125,10,50,62,32,114,101,58,114,117,110,40,34,120,121,122,97,98,99,34,44,34,40,42,67,79,77,77,73,84,41,97,98,99,34,44,91,123,99,97,112,116,117,114,101,44,97,108,108,44,108,105,115,116,125,44,110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101,93,41,46,10,110,111,109,97,116,99,104>>]}]},{p,[],[<<70,111,114,32,116,104,105,115,32,112,97,116,116,101,114,110,44,32,80,67,82,69,32,107,110,111,119,115,32,116,104,97,116,32,97,110,121,32,109,97,116,99,104,32,109,117,115,116,32,115,116,97,114,116,32,119,105,116,104,32,34,97,34,44,32,115,111,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,115,107,105,112,115,32,97,108,111,110,103,32,116,104,101,32,115,117,98,106,101,99,116,32,116,111,32,34,97,34,32,98,101,102,111,114,101,32,97,112,112,108,121,105,110,103,32,116,104,101,32,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,102,105,114,115,116,32,115,101,116,32,111,102,32,100,97,116,97,46,32,84,104,101,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,116,104,101,110,32,115,117,99,99,101,101,100,115,46,32,73,110,32,116,104,101,32,115,101,99,111,110,100,32,99,97,108,108,32,116,104,101,32>>,{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]},<<32,100,105,115,97,98,108,101,115,32,116,104,101,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,115,107,105,112,115,32,97,108,111,110,103,32,116,111,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,110,111,119,32,97,112,112,108,105,101,100,32,115,116,97,114,116,105,110,103,32,97,116,32,34,120,34,44,32,97,110,100,32,115,111,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,119,105,116,104,111,117,116,32,116,114,121,105,110,103,32,97,110,121,32,111,116,104,101,114,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,115,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,116,104,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,105,102,32,116,104,101,114,101,32,105,115,32,97,32,108,97,116,101,114,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,104,97,116,32,99,97,117,115,101,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,111,32,114,101,97,99,104,32,105,116,58>>]},{pre,[],[{code,[],[<<40,42,80,82,85,78,69,41,32,111,114,32,40,42,80,82,85,78,69,58,78,65,77,69,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,110,111,114,109,97,108,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,115,116,97,114,116,105,110,103,32,99,104,97,114,97,99,116,101,114,32,116,104,101,110,32,111,99,99,117,114,115,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,32,111,99,99,117,114,32,97,115,32,117,115,117,97,108,32,116,111,32,116,104,101,32,108,101,102,116,32,111,102,32,40,42,80,82,85,78,69,41,44,32,98,101,102,111,114,101,32,105,116,32,105,115,32,114,101,97,99,104,101,100,44,32,111,114,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,116,111,32,116,104,101,32,114,105,103,104,116,32,111,102,32,40,42,80,82,85,78,69,41,44,32,98,117,116,32,105,102,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,99,97,110,110,111,116,32,99,114,111,115,115,32,40,42,80,82,85,78,69,41,46,32,73,110,32,115,105,109,112,108,101,32,99,97,115,101,115,44,32,116,104,101,32,117,115,101,32,111,102,32,40,42,80,82,85,78,69,41,32,105,115,32,106,117,115,116,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,32,116,111,32,97,110,32,97,116,111,109,105,99,32,103,114,111,117,112,32,111,114,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,44,32,98,117,116,32,116,104,101,114,101,32,97,114,101,32,115,111,109,101,32,117,115,101,115,32,111,102,32,40,42,80,82,85,78,69,41,32,116,104,97,116,32,99,97,110,110,111,116,32,98,101,32,101,120,112,114,101,115,115,101,100,32,105,110,32,97,110,121,32,111,116,104,101,114,32,119,97,121,46,32,73,110,32,97,110,32,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,44,32,40,42,80,82,85,78,69,41,32,104,97,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,40,42,67,79,77,77,73,84,41,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,80,82,85,78,69,41,46,32,73,116,32,105,115,32,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,32,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,44,32,119,104,101,110,32,115,112,101,99,105,102,105,101,100,32,119,105,116,104,111,117,116,32,97,32,110,97,109,101,44,32,105,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,44,32,101,120,99,101,112,116,32,116,104,97,116,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,117,110,97,110,99,104,111,114,101,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,105,115,32,110,111,116,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,44,32,98,117,116,32,116,111,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46>>]},{pre,[],[{code,[],[<<40,42,83,75,73,80,41>>]}]},{p,[],[<<40,42,83,75,73,80,41,32,115,105,103,110,105,102,105,101,115,32,116,104,97,116,32,119,104,97,116,101,118,101,114,32,116,101,120,116,32,119,97,115,32,109,97,116,99,104,101,100,32,108,101,97,100,105,110,103,32,117,112,32,116,111,32,105,116,32,99,97,110,110,111,116,32,98,101,32,112,97,114,116,32,111,102,32,97,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,46,32,67,111,110,115,105,100,101,114,58>>]},{pre,[],[{code,[],[<<97,43,40,42,83,75,73,80,41,98>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,97,97,97,99,46,46,46,34,44,32,97,102,116,101,114,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,32,102,97,105,108,115,32,40,115,116,97,114,116,105,110,103,32,97,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,115,116,114,105,110,103,41,44,32,116,104,101,32,115,116,97,114,116,105,110,103,32,112,111,105,110,116,32,115,107,105,112,115,32,111,110,32,116,111,32,115,116,97,114,116,32,116,104,101,32,110,101,120,116,32,97,116,116,101,109,112,116,32,97,116,32,34,99,34,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,32,112,111,115,115,101,115,115,105,118,101,32,113,117,97,110,116,105,102,105,101,114,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,116,104,105,115,32,101,120,97,109,112,108,101,59,32,97,108,116,104,111,117,103,104,32,105,116,32,119,111,117,108,100,32,115,117,112,112,114,101,115,115,32,98,97,99,107,116,114,97,99,107,105,110,103,32,100,117,114,105,110,103,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,116,101,109,112,116,44,32,116,104,101,32,115,101,99,111,110,100,32,97,116,116,101,109,112,116,32,119,111,117,108,100,32,115,116,97,114,116,32,97,116,32,116,104,101,32,115,101,99,111,110,100,32,99,104,97,114,97,99,116,101,114,32,105,110,115,116,101,97,100,32,111,102,32,115,107,105,112,112,105,110,103,32,111,110,32,116,111,32,34,99,34,46>>]},{p,[],[<<87,104,101,110,32,40,42,83,75,73,80,41,32,104,97,115,32,97,110,32,97,115,115,111,99,105,97,116,101,100,32,110,97,109,101,44,32,105,116,115,32,98,101,104,97,118,105,111,114,32,105,115,32,109,111,100,105,102,105,101,100,58>>]},{pre,[],[{code,[],[<<40,42,83,75,73,80,58,78,65,77,69,41>>]}]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,105,115,32,116,114,105,103,103,101,114,101,100,44,32,116,104,101,32,112,114,101,118,105,111,117,115,32,112,97,116,104,32,116,104,114,111,117,103,104,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,115,101,97,114,99,104,101,100,32,102,111,114,32,116,104,101,32,109,111,115,116,32,114,101,99,101,110,116,32,40,42,77,65,82,75,41,32,116,104,97,116,32,104,97,115,32,116,104,101,32,115,97,109,101,32,110,97,109,101,46,32,73,102,32,111,110,101,32,105,115,32,102,111,117,110,100,44,32,116,104,101,32,34,98,117,109,112,97,108,111,110,103,34,32,97,100,118,97,110,99,101,32,105,115,32,116,111,32,116,104,101,32,115,117,98,106,101,99,116,32,112,111,115,105,116,105,111,110,32,116,104,97,116,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,97,116,32,40,42,77,65,82,75,41,32,105,110,115,116,101,97,100,32,111,102,32,116,111,32,119,104,101,114,101,32,40,42,83,75,73,80,41,32,119,97,115,32,101,110,99,111,117,110,116,101,114,101,100,46,32,73,102,32,110,111,32,40,42,77,65,82,75,41,32,119,105,116,104,32,97,32,109,97,116,99,104,105,110,103,32,110,97,109,101,32,105,115,32,102,111,117,110,100,44,32,40,42,83,75,73,80,41,32,105,115,32,105,103,110,111,114,101,100,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,98,121,32,40,42,77,65,82,75,58,78,65,77,69,41,46,32,73,116,32,105,103,110,111,114,101,115,32,110,97,109,101,115,32,116,104,97,116,32,97,114,101,32,115,101,116,32,98,121,32,40,42,80,82,85,78,69,58,78,65,77,69,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,118,101,114,98,32,99,97,117,115,101,115,32,97,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,105,110,110,101,114,109,111,115,116,32,97,108,116,101,114,110,97,116,105,118,101,32,119,104,101,110,32,98,97,99,107,116,114,97,99,107,105,110,103,32,114,101,97,99,104,101,115,32,105,116,46,32,84,104,97,116,32,105,115,44,32,105,116,32,99,97,110,99,101,108,115,32,97,110,121,32,102,117,114,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,119,105,116,104,105,110,32,116,104,101,32,99,117,114,114,101,110,116,32,97,108,116,101,114,110,97,116,105,118,101,46>>]},{pre,[],[{code,[],[<<40,42,84,72,69,78,41,32,111,114,32,40,42,84,72,69,78,58,78,65,77,69,41>>]}]},{p,[],[<<84,104,101,32,118,101,114,98,32,110,97,109,101,32,99,111,109,101,115,32,102,114,111,109,32,116,104,101,32,111,98,115,101,114,118,97,116,105,111,110,32,116,104,97,116,32,105,116,32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,97,32,112,97,116,116,101,114,110,45,98,97,115,101,100,32,105,102,45,116,104,101,110,45,101,108,115,101,32,98,108,111,99,107,58>>]},{pre,[],[{code,[],[<<40,32,67,79,78,68,49,32,40,42,84,72,69,78,41,32,70,79,79,32,124,32,67,79,78,68,50,32,40,42,84,72,69,78,41,32,66,65,82,32,124,32,67,79,78,68,51,32,40,42,84,72,69,78,41,32,66,65,90,32,41,32,46,46,46>>]}]},{p,[],[<<73,102,32,116,104,101,32,67,79,78,68,49,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,44,32,70,79,79,32,105,115,32,116,114,105,101,100,32,40,97,110,100,32,112,111,115,115,105,98,108,121,32,102,117,114,116,104,101,114,32,105,116,101,109,115,32,97,102,116,101,114,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,103,114,111,117,112,32,105,102,32,70,79,79,32,115,117,99,99,101,101,100,115,41,46,32,79,110,32,102,97,105,108,117,114,101,44,32,116,104,101,32,109,97,116,99,104,101,114,32,115,107,105,112,115,32,116,111,32,116,104,101,32,115,101,99,111,110,100,32,97,108,116,101,114,110,97,116,105,118,101,32,97,110,100,32,116,114,105,101,115,32,67,79,78,68,50,44,32,119,105,116,104,111,117,116,32,98,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,67,79,78,68,49,46,32,73,102,32,116,104,97,116,32,115,117,99,99,101,101,100,115,32,97,110,100,32,66,65,82,32,102,97,105,108,115,44,32,67,79,78,68,51,32,105,115,32,116,114,105,101,100,46,32,73,102,32,66,65,90,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,115,111,32,116,104,101,114,101,32,105,115,32,97,32,98,97,99,107,116,114,97,99,107,32,116,111,32,119,104,97,116,101,118,101,114,32,99,97,109,101,32,98,101,102,111,114,101,32,116,104,101,32,101,110,116,105,114,101,32,103,114,111,117,112,46,32,73,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,116,32,105,110,115,105,100,101,32,97,110,32,97,108,116,101,114,110,97,116,105,111,110,44,32,105,116,32,97,99,116,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46>>]},{p,[],[<<84,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,40,42,84,72,69,78,58,78,65,77,69,41,32,105,115,32,116,104,101,32,110,111,116,32,116,104,101,32,115,97,109,101,32,97,115,32,40,42,77,65,82,75,58,78,65,77,69,41,40,42,84,72,69,78,41,46,32,73,116,32,105,115,32,108,105,107,101,32,40,42,77,65,82,75,58,78,65,77,69,41,32,105,110,32,116,104,97,116,32,116,104,101,32,110,97,109,101,32,105,115,32,114,101,109,101,109,98,101,114,101,100,32,102,111,114,32,112,97,115,115,105,110,103,32,98,97,99,107,32,116,111,32,116,104,101,32,99,97,108,108,101,114,46,32,72,111,119,101,118,101,114,44,32,40,42,83,75,73,80,58,78,65,77,69,41,32,115,101,97,114,99,104,101,115,32,111,110,108,121,32,102,111,114,32,110,97,109,101,115,32,115,101,116,32,119,105,116,104,32,40,42,77,65,82,75,41,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,42,84,72,69,78,58,78,65,77,69,41,32,114,101,109,101,109,98,101,114,115,32,116,104,101,32,110,97,109,101,32,105,115,32,117,115,101,108,101,115,115,32,116,111,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,103,114,97,109,109,101,114,44,32,97,115,32,110,97,109,101,115,32,99,97,110,110,111,116,32,98,101,32,114,101,116,114,105,101,118,101,100,46>>]}]},{p,[],[<<65,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,99,111,110,116,97,105,110,32,97,32,124,32,99,104,97,114,97,99,116,101,114,32,105,115,32,106,117,115,116,32,97,32,112,97,114,116,32,111,102,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,59,32,105,116,32,105,115,32,110,111,116,32,97,32,110,101,115,116,101,100,32,97,108,116,101,114,110,97,116,105,111,110,32,119,105,116,104,32,111,110,108,121,32,111,110,101,32,97,108,116,101,114,110,97,116,105,118,101,46,32,84,104,101,32,101,102,102,101,99,116,32,111,102,32,40,42,84,72,69,78,41,32,101,120,116,101,110,100,115,32,98,101,121,111,110,100,32,115,117,99,104,32,97,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,116,104,101,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,32,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,32,116,104,97,116,32,100,111,32,110,111,116,32,99,111,110,116,97,105,110,32,97,110,121,32,124,32,99,104,97,114,97,99,116,101,114,115,32,97,116,32,116,104,105,115,32,108,101,118,101,108,58>>]},{pre,[],[{code,[],[<<65,32,40,66,40,42,84,72,69,78,41,67,41,32,124,32,68>>]}]},{p,[],[<<73,102,32,65,32,97,110,100,32,66,32,97,114,101,32,109,97,116,99,104,101,100,44,32,98,117,116,32,116,104,101,114,101,32,105,115,32,97,32,102,97,105,108,117,114,101,32,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,65,59,32,105,110,115,116,101,97,100,32,105,116,32,109,111,118,101,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,44,32,116,104,97,116,32,105,115,44,32,68,46,32,72,111,119,101,118,101,114,44,32,105,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,105,110,103,32,40,42,84,72,69,78,41,32,105,115,32,103,105,118,101,110,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,32,105,116,32,98,101,104,97,118,101,115,32,100,105,102,102,101,114,101,110,116,108,121,58>>]},{pre,[],[{code,[],[<<65,32,40,66,40,42,84,72,69,78,41,67,32,124,32,40,42,70,65,73,76,41,41,32,124,32,68>>]}]},{p,[],[<<84,104,101,32,101,102,102,101,99,116,32,111,102,32,40,42,84,72,69,78,41,32,105,115,32,110,111,119,32,99,111,110,102,105,110,101,100,32,116,111,32,116,104,101,32,105,110,110,101,114,32,115,117,98,112,97,116,116,101,114,110,46,32,65,102,116,101,114,32,97,32,102,97,105,108,117,114,101,32,105,110,32,67,44,32,109,97,116,99,104,105,110,103,32,109,111,118,101,115,32,116,111,32,40,42,70,65,73,76,41,44,32,119,104,105,99,104,32,99,97,117,115,101,115,32,116,104,101,32,119,104,111,108,101,32,115,117,98,112,97,116,116,101,114,110,32,116,111,32,102,97,105,108,44,32,97,115,32,116,104,101,114,101,32,97,114,101,32,110,111,32,109,111,114,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,116,111,32,116,114,121,46,32,73,110,32,116,104,105,115,32,99,97,115,101,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,119,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,65,46>>]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,97,115,32,104,97,118,105,110,103,32,116,119,111,32,97,108,116,101,114,110,97,116,105,118,101,115,44,32,97,115,32,111,110,108,121,32,111,110,101,32,105,115,32,101,118,101,114,32,117,115,101,100,46,32,84,104,97,116,32,105,115,44,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,32,105,110,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,104,97,115,32,97,32,100,105,102,102,101,114,101,110,116,32,109,101,97,110,105,110,103,46,32,73,103,110,111,114,105,110,103,32,119,104,105,116,101,115,112,97,99,101,44,32,99,111,110,115,105,100,101,114,58>>]},{pre,[],[{code,[],[<<94,46,42,63,32,40,63,40,63,61,97,41,32,97,32,124,32,98,40,42,84,72,69,78,41,99,32,41>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,98,97,34,44,32,116,104,105,115,32,112,97,116,116,101,114,110,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,46,32,65,115,32,46,42,63,32,105,115,32,117,110,103,114,101,101,100,121,44,32,105,116,32,105,110,105,116,105,97,108,108,121,32,109,97,116,99,104,101,115,32,122,101,114,111,32,99,104,97,114,97,99,116,101,114,115,46,32,84,104,101,32,99,111,110,100,105,116,105,111,110,32,40,63,61,97,41,32,116,104,101,110,32,102,97,105,108,115,44,32,116,104,101,32,99,104,97,114,97,99,116,101,114,32,34,98,34,32,105,115,32,109,97,116,99,104,101,100,44,32,98,117,116,32,34,99,34,32,105,115,32,110,111,116,46,32,65,116,32,116,104,105,115,32,112,111,105,110,116,44,32,109,97,116,99,104,105,110,103,32,100,111,101,115,32,110,111,116,32,98,97,99,107,116,114,97,99,107,32,116,111,32,46,42,63,32,97,115,32,99,97,110,32,112,101,114,104,97,112,115,32,98,101,32,101,120,112,101,99,116,101,100,32,102,114,111,109,32,116,104,101,32,112,114,101,115,101,110,99,101,32,111,102,32,116,104,101,32,124,32,99,104,97,114,97,99,116,101,114,46,32,84,104,101,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,115,105,110,103,108,101,32,97,108,116,101,114,110,97,116,105,118,101,32,116,104,97,116,32,99,111,109,112,114,105,115,101,115,32,116,104,101,32,119,104,111,108,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,115,111,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,46,32,40,73,102,32,116,104,101,114,101,32,119,97,115,32,97,32,98,97,99,107,116,114,97,99,107,32,105,110,116,111,32,46,42,63,44,32,97,108,108,111,119,105,110,103,32,105,116,32,116,111,32,109,97,116,99,104,32,34,98,34,44,32,116,104,101,32,109,97,116,99,104,32,119,111,117,108,100,32,115,117,99,99,101,101,100,46,41>>]},{p,[],[<<84,104,101,32,118,101,114,98,115,32,100,101,115,99,114,105,98,101,100,32,97,98,111,118,101,32,112,114,111,118,105,100,101,32,102,111,117,114,32,100,105,102,102,101,114,101,110,116,32,34,115,116,114,101,110,103,116,104,115,34,32,111,102,32,99,111,110,116,114,111,108,32,119,104,101,110,32,115,117,98,115,101,113,117,101,110,116,32,109,97,116,99,104,105,110,103,32,102,97,105,108,115,58>>]},{ul,[],[{li,[],[{p,[],[<<40,42,84,72,69,78,41,32,105,115,32,116,104,101,32,119,101,97,107,101,115,116,44,32,99,97,114,114,121,105,110,103,32,111,110,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,46>>]}]},{li,[],[{p,[],[<<40,42,80,82,85,78,69,41,32,99,111,109,101,115,32,110,101,120,116,44,32,102,97,105,108,115,32,116,104,101,32,109,97,116,99,104,32,97,116,32,116,104,101,32,99,117,114,114,101,110,116,32,115,116,97,114,116,105,110,103,32,112,111,115,105,116,105,111,110,44,32,98,117,116,32,97,108,108,111,119,115,32,97,110,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40,102,111,114,32,97,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,41,46>>]}]},{li,[],[{p,[],[<<40,42,83,75,73,80,41,32,105,115,32,115,105,109,105,108,97,114,44,32,101,120,99,101,112,116,32,116,104,97,116,32,116,104,101,32,97,100,118,97,110,99,101,32,99,97,110,32,98,101,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,99,104,97,114,97,99,116,101,114,46>>]}]},{li,[],[{p,[],[<<40,42,67,79,77,77,73,84,41,32,105,115,32,116,104,101,32,115,116,114,111,110,103,101,115,116,44,32,99,97,117,115,105,110,103,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>]}]}]},{p,[],[{em,[],[<<77,111,114,101,32,116,104,97,110,32,79,110,101,32,66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98>>]}]},{p,[],[<<73,102,32,109,111,114,101,32,116,104,97,110,32,111,110,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,32,105,115,32,112,114,101,115,101,110,116,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,116,104,101,32,111,110,101,32,116,104,97,116,32,105,115,32,98,97,99,107,116,114,97,99,107,101,100,32,111,110,116,111,32,102,105,114,115,116,32,97,99,116,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,44,32,119,104,101,114,101,32,65,44,32,66,44,32,97,110,100,32,115,111,32,111,110,44,32,97,114,101,32,99,111,109,112,108,101,120,32,112,97,116,116,101,114,110,32,102,114,97,103,109,101,110,116,115,58>>]},{pre,[],[{code,[],[<<40,65,40,42,67,79,77,77,73,84,41,66,40,42,84,72,69,78,41,67,124,65,66,68,41>>]}]},{p,[],[<<73,102,32,65,32,109,97,116,99,104,101,115,32,98,117,116,32,66,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,67,79,77,77,73,84,41,32,99,97,117,115,101,115,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46,32,72,111,119,101,118,101,114,44,32,105,102,32,65,32,97,110,100,32,66,32,109,97,116,99,104,44,32,98,117,116,32,67,32,102,97,105,108,115,44,32,116,104,101,32,98,97,99,107,116,114,97,99,107,32,116,111,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,40,65,66,68,41,32,116,111,32,98,101,32,116,114,105,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,105,115,32,99,111,110,115,105,115,116,101,110,116,44,32,98,117,116,32,105,115,32,110,111,116,32,97,108,119,97,121,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46,32,73,116,32,109,101,97,110,115,32,116,104,97,116,32,105,102,32,116,119,111,32,111,114,32,109,111,114,101,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,112,112,101,97,114,32,105,110,32,115,117,99,99,101,115,115,105,111,110,44,32,116,104,101,32,108,97,115,116,32,111,102,32,116,104,101,109,32,104,97,115,32,110,111,32,101,102,102,101,99,116,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<46,46,46,40,42,67,79,77,77,73,84,41,40,42,80,82,85,78,69,41,46,46,46>>]}]},{p,[],[<<73,102,32,116,104,101,114,101,32,105,115,32,97,32,109,97,116,99,104,105,110,103,32,102,97,105,108,117,114,101,32,116,111,32,116,104,101,32,114,105,103,104,116,44,32,98,97,99,107,116,114,97,99,107,105,110,103,32,111,110,116,111,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,32,105,116,32,116,111,32,98,101,32,116,114,105,103,103,101,114,101,100,44,32,97,110,100,32,105,116,115,32,97,99,116,105,111,110,32,105,115,32,116,97,107,101,110,46,32,84,104,101,114,101,32,99,97,110,32,110,101,118,101,114,32,98,101,32,97,32,98,97,99,107,116,114,97,99,107,32,111,110,116,111,32,40,42,67,79,77,77,73,84,41,46>>]},{p,[],[{em,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,82,101,112,101,97,116,101,100,32,71,114,111,117,112,115>>]}]},{p,[],[<<80,67,82,69,32,100,105,102,102,101,114,115,32,102,114,111,109,32,80,101,114,108,32,105,110,32,105,116,115,32,104,97,110,100,108,105,110,103,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,105,110,32,114,101,112,101,97,116,101,100,32,103,114,111,117,112,115,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,58>>]},{pre,[],[{code,[],[<<47,40,97,40,42,67,79,77,77,73,84,41,98,41,43,97,99,47>>]}]},{p,[],[<<73,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,34,97,98,97,99,34,44,32,80,101,114,108,32,109,97,116,99,104,101,115,44,32,98,117,116,32,80,67,82,69,32,102,97,105,108,115,32,98,101,99,97,117,115,101,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,114,101,112,101,97,116,32,111,102,32,116,104,101,32,103,114,111,117,112,32,97,99,116,115,46>>]},{p,[],[{em,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,65,115,115,101,114,116,105,111,110,115>>]}]},{p,[],[<<40,42,70,65,73,76,41,32,105,110,32,97,110,32,97,115,115,101,114,116,105,111,110,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,98,97,99,107,116,114,97,99,107,46>>]},{p,[],[<<40,42,65,67,67,69,80,84,41,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,73,110,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,44,32,40,42,65,67,67,69,80,84,41,32,99,97,117,115,101,115,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,102,97,105,108,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46>>]},{p,[],[<<84,104,101,32,111,116,104,101,114,32,98,97,99,107,116,114,97,99,107,105,110,103,32,118,101,114,98,115,32,97,114,101,32,110,111,116,32,116,114,101,97,116,101,100,32,115,112,101,99,105,97,108,108,121,32,105,102,32,116,104,101,121,32,97,112,112,101,97,114,32,105,110,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,46,32,73,110,32,112,97,114,116,105,99,117,108,97,114,44,32,40,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,111,110,115,44,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,105,115,32,105,115,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,46>>]},{p,[],[<<78,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,115,32,97,114,101,44,32,104,111,119,101,118,101,114,44,32,100,105,102,102,101,114,101,110,116,44,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,99,104,97,110,103,105,110,103,32,97,32,112,111,115,105,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,105,110,116,111,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,99,104,97,110,103,101,115,32,105,116,115,32,114,101,115,117,108,116,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,111,114,32,40,42,80,82,85,78,69,41,32,99,97,117,115,101,115,32,97,32,110,101,103,97,116,105,118,101,32,97,115,115,101,114,116,105,111,110,32,116,111,32,98,101,32,116,114,117,101,44,32,119,105,116,104,111,117,116,32,99,111,110,115,105,100,101,114,105,110,103,32,97,110,121,32,102,117,114,116,104,101,114,32,97,108,116,101,114,110,97,116,105,118,101,32,98,114,97,110,99,104,101,115,32,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,46,32,66,97,99,107,116,114,97,99,107,105,110,103,32,105,110,116,111,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,105,116,32,116,111,32,115,107,105,112,32,116,111,32,116,104,101,32,110,101,120,116,32,101,110,99,108,111,115,105,110,103,32,97,108,116,101,114,110,97,116,105,118,101,32,119,105,116,104,105,110,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,40,116,104,101,32,110,111,114,109,97,108,32,98,101,104,97,118,105,111,114,41,44,32,98,117,116,32,105,102,32,116,104,101,32,97,115,115,101,114,116,105,111,110,32,100,111,101,115,32,110,111,116,32,104,97,118,101,32,115,117,99,104,32,97,110,32,97,108,116,101,114,110,97,116,105,118,101,44,32,40,42,84,72,69,78,41,32,98,101,104,97,118,101,115,32,108,105,107,101,32,40,42,80,82,85,78,69,41,46>>]},{p,[],[{em,[],[<<66,97,99,107,116,114,97,99,107,105,110,103,32,86,101,114,98,115,32,105,110,32,83,117,98,114,111,117,116,105,110,101,115>>]}]},{p,[],[<<84,104,101,115,101,32,98,101,104,97,118,105,111,114,115,32,111,99,99,117,114,32,114,101,103,97,114,100,108,101,115,115,32,105,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,99,97,108,108,101,100,32,114,101,99,117,114,115,105,118,101,108,121,46,32,84,104,101,32,116,114,101,97,116,109,101,110,116,32,111,102,32,115,117,98,114,111,117,116,105,110,101,115,32,105,110,32,80,101,114,108,32,105,115,32,100,105,102,102,101,114,101,110,116,32,105,110,32,115,111,109,101,32,99,97,115,101,115,46>>]},{ul,[],[{li,[],[{p,[],[<<40,42,70,65,73,76,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,104,97,115,32,105,116,115,32,110,111,114,109,97,108,32,101,102,102,101,99,116,58,32,105,116,32,102,111,114,99,101,115,32,97,110,32,105,109,109,101,100,105,97,116,101,32,98,97,99,107,116,114,97,99,107,46>>]}]},{li,[],[{p,[],[<<40,42,65,67,67,69,80,84,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,115,117,99,99,101,101,100,32,119,105,116,104,111,117,116,32,97,110,121,32,102,117,114,116,104,101,114,32,112,114,111,99,101,115,115,105,110,103,46,32,77,97,116,99,104,105,110,103,32,116,104,101,110,32,99,111,110,116,105,110,117,101,115,32,97,102,116,101,114,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,99,97,108,108,46>>]}]},{li,[],[{p,[],[<<40,42,67,79,77,77,73,84,41,44,32,40,42,83,75,73,80,41,44,32,97,110,100,32,40,42,80,82,85,78,69,41,32,105,110,32,97,32,115,117,98,112,97,116,116,101,114,110,32,99,97,108,108,101,100,32,97,115,32,97,32,115,117,98,114,111,117,116,105,110,101,32,99,97,117,115,101,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>]}]},{li,[],[{p,[],[<<40,42,84,72,69,78,41,32,115,107,105,112,115,32,116,111,32,116,104,101,32,110,101,120,116,32,97,108,116,101,114,110,97,116,105,118,101,32,105,110,32,116,104,101,32,105,110,110,101,114,109,111,115,116,32,101,110,99,108,111,115,105,110,103,32,103,114,111,117,112,32,119,105,116,104,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,116,104,97,116,32,104,97,115,32,97,108,116,101,114,110,97,116,105,118,101,115,46,32,73,102,32,116,104,101,114,101,32,105,115,32,110,111,32,115,117,99,104,32,103,114,111,117,112,32,119,105,116,104,105,110,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,44,32,40,42,84,72,69,78,41,32,99,97,117,115,101,115,32,116,104,101,32,115,117,98,114,111,117,116,105,110,101,32,109,97,116,99,104,32,116,111,32,102,97,105,108,46>>]}]}]}]},#{name => <<114,101>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,114,101,46,120,109,108],types => #{{compile_option,0} => {attribute,{27,2},type,{compile_option,{type,{27,27},union,[{atom,{27,27},unicode},{atom,{27,37},anchored},{atom,{27,48},caseless},{atom,{27,59},dollar_endonly},{atom,{28,27},dotall},{atom,{28,36},extended},{atom,{28,47},firstline},{atom,{28,59},multiline},{atom,{29,27},no_auto_capture},{atom,{29,45},dupnames},{atom,{29,56},ungreedy},{type,{30,27},tuple,[{atom,{30,28},newline},{user_type,{30,37},nl_spec,[]}]},{atom,{31,27},bsr_anycrlf},{atom,{31,41},bsr_unicode},{atom,{32,27},no_start_optimize},{atom,{32,47},ucp},{atom,{32,53},never_utf}]},[]}},{mp,0} => {attribute,{23,2},type,{mp,{type,{23,15},tuple,[{atom,{23,16},re_pattern},{var,{23,28},'_'},{var,{23,31},'_'},{var,{23,34},'_'},{var,{23,37},'_'}]},[]}},{nl_spec,0} => {attribute,{25,2},type,{nl_spec,{type,{25,20},union,[{atom,{25,20},cr},{atom,{25,25},crlf},{atom,{25,32},lf},{atom,{25,37},anycrlf},{atom,{25,47},any}]},[]}}}},[{{function,grun,3},[{file,[114,101,46,101,114,108]},{location,0}],[<<103,114,117,110,47,51>>],hidden,#{}},{{function,internal_run,4},[{file,[114,101,46,101,114,108]},{location,0}],[<<105,110,116,101,114,110,97,108,95,114,117,110,47,52>>],hidden,#{}},{{function,ucompile,2},[{file,[114,101,46,101,114,108]},{location,0}],[<<117,99,111,109,112,105,108,101,47,50>>],hidden,#{}},{{function,urun,3},[{file,[114,101,46,101,114,108]},{location,0}],[<<117,114,117,110,47,51>>],hidden,#{}},{{function,version,0},[{file,[114,101,46,101,114,108]},{location,40}],[<<118,101,114,115,105,111,110,47,48>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,111,102,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,97,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,111,102,32,116,104,101,32,115,121,115,116,101,109,32,116,104,97,116,32,119,97,115,32,117,115,101,100,32,105,110,32,116,104,101,32,69,114,108,97,110,103,47,79,84,80,32,99,111,109,112,105,108,97,116,105,111,110,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,56,49>>,signature => [{attribute,{40,2},spec,{{version,0},[{type,{40,14},'fun',[{type,{40,14},product,[]},{type,{40,20},binary,[]}]}]}}],since => <<79,84,80,32,50,48,46,48>>}},{{function,compile,1},[{file,[114,101,46,101,114,108]},{location,49}],[<<99,111,109,112,105,108,101,47,49>>],#{<<101,110>> => [{p,[],[<<84,104,101,32,115,97,109,101,32,97,115,32>>,{code,[],[<<99,111,109,112,105,108,101,40,82,101,103,101,120,112,44,91,93,41>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,56,57>>,signature => [{attribute,{49,2},spec,{{compile,1},[{type,{49,14},bounded_fun,[{type,{49,14},'fun',[{type,{49,14},product,[{var,{49,15},'Regexp'}]},{type,{49,26},union,[{type,{49,26},tuple,[{atom,{49,27},ok},{var,{49,31},'MP'}]},{type,{49,37},tuple,[{atom,{49,38},error},{var,{49,45},'ErrSpec'}]}]}]},[{type,{50,7},constraint,[{atom,{50,7},is_subtype},[{var,{50,7},'Regexp'},{type,{50,17},iodata,[]}]]},{type,{51,7},constraint,[{atom,{51,7},is_subtype},[{var,{51,7},'MP'},{user_type,{51,13},mp,[]}]]},{type,{52,7},constraint,[{atom,{52,7},is_subtype},[{var,{52,7},'ErrSpec'},{type,{52,18},tuple,[{ann_type,{52,19},[{var,{52,19},'ErrString'},{type,{52,32},string,[]}]},{ann_type,{52,42},[{var,{52,42},'Position'},{type,{52,54},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,compile,2},[{file,[114,101,46,101,114,108]},{location,57}],[<<99,111,109,112,105,108,101,47,50>>],#{<<101,110>> => [{p,[],[<<67,111,109,112,105,108,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,119,105,116,104,32,116,104,101,32,115,121,110,116,97,120,32,100,101,115,99,114,105,98,101,100,32,98,101,108,111,119,44,32,105,110,116,111,32,97,110,32,105,110,116,101,114,110,97,108,32,102,111,114,109,97,116,32,116,111,32,98,101,32,117,115,101,100,32,108,97,116,101,114,32,97,115,32,97,32,112,97,114,97,109,101,116,101,114,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<46>>]},{p,[],[<<67,111,109,112,105,108,105,110,103,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,115,97,109,101,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,109,97,116,99,104,105,110,103,32,97,103,97,105,110,115,116,32,109,117,108,116,105,112,108,101,32,115,117,98,106,101,99,116,115,32,100,117,114,105,110,103,32,116,104,101,32,108,105,102,101,116,105,109,101,32,111,102,32,116,104,101,32,112,114,111,103,114,97,109,46,32,67,111,109,112,105,108,105,110,103,32,111,110,99,101,32,97,110,100,32,101,120,101,99,117,116,105,110,103,32,109,97,110,121,32,116,105,109,101,115,32,105,115,32,102,97,114,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,99,111,109,112,105,108,105,110,103,32,101,97,99,104,32,116,105,109,101,32,111,110,101,32,119,97,110,116,115,32,116,111,32,109,97,116,99,104,46>>]},{p,[],[<<87,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<44,32,111,116,104,101,114,119,105,115,101,32,97,115,32,97,110,121,32,118,97,108,105,100,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<46>>]},{a,[{id,<<99,111,109,112,105,108,101,95,111,112,116,105,111,110,115>>}],[]},{p,[],[<<79,112,116,105,111,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<117,110,105,99,111,100,101>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,100,101,32,105,115,32,116,111,32,98,101,32,114,117,110,32,97,103,97,105,110,115,116,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<32,115,117,98,106,101,99,116,46,32,65,108,115,111,32,99,111,110,115,105,100,101,114,32,111,112,116,105,111,110,32>>,{code,[],[<<117,99,112>>]},<<32,119,104,101,110,32,117,115,105,110,103,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,46>>]}]},{dt,[],[{code,[],[<<97,110,99,104,111,114,101,100>>]}]},{dd,[],[{p,[],[<<84,104,101,32,112,97,116,116,101,114,110,32,105,115,32,102,111,114,99,101,100,32,116,111,32,98,101,32,34,97,110,99,104,111,114,101,100,34,44,32,116,104,97,116,32,105,115,44,32,105,116,32,105,115,32,99,111,110,115,116,114,97,105,110,101,100,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,105,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,32,116,104,97,116,32,105,115,32,115,101,97,114,99,104,101,100,32,40,116,104,101,32,34,115,117,98,106,101,99,116,32,115,116,114,105,110,103,34,41,46,32,84,104,105,115,32,101,102,102,101,99,116,32,99,97,110,32,97,108,115,111,32,98,101,32,97,99,104,105,101,118,101,100,32,98,121,32,97,112,112,114,111,112,114,105,97,116,101,32,99,111,110,115,116,114,117,99,116,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,105,116,115,101,108,102,46>>]}]},{dt,[],[{code,[],[<<99,97,115,101,108,101,115,115>>]}]},{dd,[],[{p,[],[<<76,101,116,116,101,114,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,98,111,116,104,32,117,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,46,32,73,116,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,105>>]},<<32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,105,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,85,112,112,101,114,99,97,115,101,32,97,110,100,32,108,111,119,101,114,99,97,115,101,32,108,101,116,116,101,114,115,32,97,114,101,32,100,101,102,105,110,101,100,32,97,115,32,105,110,32,116,104,101,32,73,83,79,32,56,56,53,57,45,49,32,99,104,97,114,97,99,116,101,114,32,115,101,116,46>>]}]},{dt,[],[{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]}]},{dd,[],[{p,[],[<<65,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,111,112,116,105,111,110,44,32,97,32,100,111,108,108,97,114,32,97,108,115,111,32,109,97,116,99,104,101,115,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,97,32,110,101,119,108,105,110,101,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,40,98,117,116,32,110,111,116,32,98,101,102,111,114,101,32,97,110,121,32,111,116,104,101,114,32,110,101,119,108,105,110,101,115,41,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,105,103,110,111,114,101,100,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,44,32,97,110,100,32,105,116,32,99,97,110,110,111,116,32,98,101,32,115,101,116,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,46>>]}]},{dt,[],[{code,[],[<<100,111,116,97,108,108>>]}]},{dd,[],[{p,[],[<<65,32,100,111,116,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,97,108,108,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,99,108,117,100,105,110,103,32,116,104,111,115,101,32,105,110,100,105,99,97,116,105,110,103,32,110,101,119,108,105,110,101,46,32,87,105,116,104,111,117,116,32,105,116,44,32,97,32,100,111,116,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,119,104,101,110,32,116,104,101,32,99,117,114,114,101,110,116,32,112,111,115,105,116,105,111,110,32,105,115,32,97,116,32,97,32,110,101,119,108,105,110,101,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,115>>]},<<32,97,110,100,32,105,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,115,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,65,32,110,101,103,97,116,105,118,101,32,99,108,97,115,115,44,32,115,117,99,104,32,97,115,32>>,{code,[],[<<91,94,97,93>>]},<<44,32,97,108,119,97,121,115,32,109,97,116,99,104,101,115,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,44,32,105,110,100,101,112,101,110,100,101,110,116,32,111,102,32,116,104,101,32,115,101,116,116,105,110,103,32,111,102,32,116,104,105,115,32,111,112,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<101,120,116,101,110,100,101,100>>]}]},{dd,[],[{p,[],[<<73,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,101,116,44,32,109,111,115,116,32,119,104,105,116,101,32,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,97,114,101,32,116,111,116,97,108,108,121,32,105,103,110,111,114,101,100,32,101,120,99,101,112,116,32,119,104,101,110,32,101,115,99,97,112,101,100,32,111,114,32,105,110,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,46,32,72,111,119,101,118,101,114,44,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,115,32,115,117,99,104,32,97,115,32>>,{code,[],[<<40,63,62>>]},<<32,116,104,97,116,32,105,110,116,114,111,100,117,99,101,32,118,97,114,105,111,117,115,32,112,97,114,101,110,116,104,101,115,105,122,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,110,111,114,32,119,105,116,104,105,110,32,97,32,110,117,109,101,114,105,99,97,108,32,113,117,97,110,116,105,102,105,101,114,32,115,117,99,104,32,97,115,32>>,{code,[],[<<123,49,44,51,125>>]},<<46,32,72,111,119,101,118,101,114,44,32,105,103,110,111,114,97,98,108,101,32,119,104,105,116,101,32,115,112,97,99,101,32,105,115,32,112,101,114,109,105,116,116,101,100,32,98,101,116,119,101,101,110,32,97,110,32,105,116,101,109,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,98,101,116,119,101,101,110,32,97,32,113,117,97,110,116,105,102,105,101,114,32,97,110,100,32,97,32,102,111,108,108,111,119,105,110,103,32,43,32,116,104,97,116,32,105,110,100,105,99,97,116,101,115,32,112,111,115,115,101,115,115,105,118,101,110,101,115,115,46>>]},{p,[],[<<87,104,105,116,101,32,115,112,97,99,101,32,100,105,100,32,110,111,116,32,117,115,101,100,32,116,111,32,105,110,99,108,117,100,101,32,116,104,101,32,86,84,32,99,104,97,114,97,99,116,101,114,32,40,99,111,100,101,32,49,49,41,44,32,98,101,99,97,117,115,101,32,80,101,114,108,32,100,105,100,32,110,111,116,32,116,114,101,97,116,32,116,104,105,115,32,99,104,97,114,97,99,116,101,114,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46,32,72,111,119,101,118,101,114,44,32,80,101,114,108,32,99,104,97,110,103,101,100,32,97,116,32,114,101,108,101,97,115,101,32,53,46,49,56,44,32,115,111,32,80,67,82,69,32,102,111,108,108,111,119,101,100,32,97,116,32,114,101,108,101,97,115,101,32,56,46,51,52,44,32,97,110,100,32,86,84,32,105,115,32,110,111,119,32,116,114,101,97,116,101,100,32,97,115,32,119,104,105,116,101,32,115,112,97,99,101,46>>]},{p,[],[<<84,104,105,115,32,97,108,115,111,32,99,97,117,115,101,115,32,99,104,97,114,97,99,116,101,114,115,32,98,101,116,119,101,101,110,32,97,110,32,117,110,101,115,99,97,112,101,100,32,35,32,111,117,116,115,105,100,101,32,97,32,99,104,97,114,97,99,116,101,114,32,99,108,97,115,115,32,97,110,100,32,116,104,101,32,110,101,120,116,32,110,101,119,108,105,110,101,44,32,105,110,99,108,117,115,105,118,101,44,32,116,111,32,98,101,32,105,103,110,111,114,101,100,46,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,39,115,32>>,{code,[],[<<47,120>>]},<<32,111,112,116,105,111,110,44,32,97,110,100,32,105,116,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,120,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46>>]},{p,[],[<<87,105,116,104,32,116,104,105,115,32,111,112,116,105,111,110,44,32,99,111,109,109,101,110,116,115,32,105,110,115,105,100,101,32,99,111,109,112,108,105,99,97,116,101,100,32,112,97,116,116,101,114,110,115,32,99,97,110,32,98,101,32,105,110,99,108,117,100,101,100,46,32,72,111,119,101,118,101,114,44,32,110,111,116,105,99,101,32,116,104,97,116,32,116,104,105,115,32,97,112,112,108,105,101,115,32,111,110,108,121,32,116,111,32,100,97,116,97,32,99,104,97,114,97,99,116,101,114,115,46,32,87,104,105,116,101,115,112,97,99,101,32,99,104,97,114,97,99,116,101,114,115,32,99,97,110,32,110,101,118,101,114,32,97,112,112,101,97,114,32,119,105,116,104,105,110,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,32,115,101,113,117,101,110,99,101,115,32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,102,111,114,32,101,120,97,109,112,108,101,32,119,105,116,104,105,110,32,115,101,113,117,101,110,99,101,32>>,{code,[],[<<40,63,40>>]},<<32,116,104,97,116,32,105,110,116,114,111,100,117,99,101,115,32,97,32,99,111,110,100,105,116,105,111,110,97,108,32,115,117,98,112,97,116,116,101,114,110,46>>]}]},{dt,[],[{code,[],[<<102,105,114,115,116,108,105,110,101>>]}]},{dd,[],[{p,[],[<<65,110,32,117,110,97,110,99,104,111,114,101,100,32,112,97,116,116,101,114,110,32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32,109,97,116,99,104,32,98,101,102,111,114,101,32,111,114,32,97,116,32,116,104,101,32,102,105,114,115,116,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,97,108,116,104,111,117,103,104,32,116,104,101,32,109,97,116,99,104,101,100,32,116,101,120,116,32,99,97,110,32,99,111,110,116,105,110,117,101,32,111,118,101,114,32,116,104,101,32,110,101,119,108,105,110,101,46>>]}]},{dt,[],[{code,[],[<<109,117,108,116,105,108,105,110,101>>]}]},{dd,[],[{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,80,67,82,69,32,116,114,101,97,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,115,32,99,111,110,115,105,115,116,105,110,103,32,111,102,32,97,32,115,105,110,103,108,101,32,108,105,110,101,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,101,118,101,110,32,105,102,32,105,116,32,99,111,110,116,97,105,110,115,32,110,101,119,108,105,110,101,115,41,46,32,84,104,101,32,34,115,116,97,114,116,32,111,102,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40>>,{code,[],[<<94>>]},<<41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,119,104,105,108,101,32,116,104,101,32,34,101,110,100,32,111,102,32,108,105,110,101,34,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,40>>,{code,[],[<<36>>]},<<41,32,109,97,116,99,104,101,115,32,111,110,108,121,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,111,114,32,98,101,102,111,114,101,32,97,32,116,101,114,109,105,110,97,116,105,110,103,32,110,101,119,108,105,110,101,32,40,117,110,108,101,115,115,32,111,112,116,105,111,110,32>>,{code,[],[<<100,111,108,108,97,114,95,101,110,100,111,110,108,121>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,41,46,32,84,104,105,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,105,110,32,80,101,114,108,46>>]},{p,[],[<<87,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,34,115,116,97,114,116,32,111,102,32,108,105,110,101,34,32,97,110,100,32,34,101,110,100,32,111,102,32,108,105,110,101,34,32,99,111,110,115,116,114,117,99,116,115,32,109,97,116,99,104,32,105,109,109,101,100,105,97,116,101,108,121,32,102,111,108,108,111,119,105,110,103,32,111,114,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,110,116,101,114,110,97,108,32,110,101,119,108,105,110,101,115,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,97,115,32,119,101,108,108,32,97,115,32,97,116,32,116,104,101,32,118,101,114,121,32,115,116,97,114,116,32,97,110,100,32,101,110,100,46,32,84,104,105,115,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,80,101,114,108,32,111,112,116,105,111,110,32>>,{code,[],[<<47,109>>]},<<32,97,110,100,32,99,97,110,32,98,101,32,99,104,97,110,103,101,100,32,119,105,116,104,105,110,32,97,32,112,97,116,116,101,114,110,32,98,121,32,97,32>>,{code,[],[<<40,63,109,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,46,32,73,102,32,116,104,101,114,101,32,97,114,101,32,110,111,32,110,101,119,108,105,110,101,115,32,105,110,32,97,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,111,114,32,110,111,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32>>,{code,[],[<<94>>]},<<32,111,114,32>>,{code,[],[<<36>>]},<<32,105,110,32,97,32,112,97,116,116,101,114,110,44,32,115,101,116,116,105,110,103,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,104,97,115,32,110,111,32,101,102,102,101,99,116,46>>]}]},{dt,[],[{code,[],[<<110,111,95,97,117,116,111,95,99,97,112,116,117,114,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,116,104,101,32,117,115,101,32,111,102,32,110,117,109,98,101,114,101,100,32,99,97,112,116,117,114,105,110,103,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46,32,65,110,121,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,116,104,97,116,32,105,115,32,110,111,116,32,102,111,108,108,111,119,101,100,32,98,121,32>>,{code,[],[<<63>>]},<<32,98,101,104,97,118,101,115,32,97,115,32,105,102,32,105,116,32,105,115,32,102,111,108,108,111,119,101,100,32,98,121,32>>,{code,[],[<<63,58>>]},<<46,32,78,97,109,101,100,32,112,97,114,101,110,116,104,101,115,101,115,32,99,97,110,32,115,116,105,108,108,32,98,101,32,117,115,101,100,32,102,111,114,32,99,97,112,116,117,114,105,110,103,32,40,97,110,100,32,116,104,101,121,32,97,99,113,117,105,114,101,32,110,117,109,98,101,114,115,32,105,110,32,116,104,101,32,117,115,117,97,108,32,119,97,121,41,46,32,84,104,101,114,101,32,105,115,32,110,111,32,101,113,117,105,118,97,108,101,110,116,32,111,112,116,105,111,110,32,105,110,32,80,101,114,108,46>>]}]},{dt,[],[{code,[],[<<100,117,112,110,97,109,101,115>>]}]},{dd,[],[{p,[],[<<78,97,109,101,115,32,117,115,101,100,32,116,111,32,105,100,101,110,116,105,102,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,110,101,101,100,32,110,111,116,32,98,101,32,117,110,105,113,117,101,46,32,84,104,105,115,32,99,97,110,32,98,101,32,104,101,108,112,102,117,108,32,102,111,114,32,99,101,114,116,97,105,110,32,116,121,112,101,115,32,111,102,32,112,97,116,116,101,114,110,32,119,104,101,110,32,105,116,32,105,115,32,107,110,111,119,110,32,116,104,97,116,32,111,110,108,121,32,111,110,101,32,105,110,115,116,97,110,99,101,32,111,102,32,116,104,101,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,101,118,101,114,32,98,101,32,109,97,116,99,104,101,100,46,32,77,111,114,101,32,100,101,116,97,105,108,115,32,111,102,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,112,114,111,118,105,100,101,100,32,98,101,108,111,119,46>>]}]},{dt,[],[{code,[],[<<117,110,103,114,101,101,100,121>>]}]},{dd,[],[{p,[],[<<73,110,118,101,114,116,115,32,116,104,101,32,34,103,114,101,101,100,105,110,101,115,115,34,32,111,102,32,116,104,101,32,113,117,97,110,116,105,102,105,101,114,115,32,115,111,32,116,104,97,116,32,116,104,101,121,32,97,114,101,32,110,111,116,32,103,114,101,101,100,121,32,98,121,32,100,101,102,97,117,108,116,44,32,98,117,116,32,98,101,99,111,109,101,32,103,114,101,101,100,121,32,105,102,32,102,111,108,108,111,119,101,100,32,98,121,32,34,63,34,46,32,73,116,32,105,115,32,110,111,116,32,99,111,109,112,97,116,105,98,108,101,32,119,105,116,104,32,80,101,114,108,46,32,73,116,32,99,97,110,32,97,108,115,111,32,98,101,32,115,101,116,32,98,121,32,97,32>>,{code,[],[<<40,63,85,41>>]},<<32,111,112,116,105,111,110,32,115,101,116,116,105,110,103,32,119,105,116,104,105,110,32,116,104,101,32,112,97,116,116,101,114,110,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]}]},{dd,[],[{p,[],[<<79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46>>]},{dl,[],[{dt,[],[{code,[],[<<99,114>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32>>,{code,[],[<<99,114>>]},<<32,40,65,83,67,73,73,32,49,51,41,46>>]}]},{dt,[],[{code,[],[<<108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<99,114,108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46>>]}]},{dt,[],[{code,[],[<<97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,116,111,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46>>]}]},{dt,[],[{code,[],[<<97,110,121>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46>>]}]}]}]},{dt,[],[{code,[],[<<98,115,114,95,97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,44,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46>>]}]},{dt,[],[{code,[],[<<98,115,114,95,117,110,105,99,111,100,101>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46>>]}]},{dt,[],[{code,[],[<<110,111,95,115,116,97,114,116,95,111,112,116,105,109,105,122,101>>]}]},{dd,[],[{p,[],[<<68,105,115,97,98,108,101,115,32,111,112,116,105,109,105,122,97,116,105,111,110,32,116,104,97,116,32,99,97,110,32,109,97,108,102,117,110,99,116,105,111,110,32,105,102,32,34,83,112,101,99,105,97,108,32,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,32,97,114,101,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,65,32,116,121,112,105,99,97,108,32,101,120,97,109,112,108,101,32,119,111,117,108,100,32,98,101,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,34,68,69,70,65,66,67,34,32,97,103,97,105,110,115,116,32,34,40,42,67,79,77,77,73,84,41,65,66,67,34,44,32,119,104,101,114,101,32,116,104,101,32,115,116,97,114,116,32,111,112,116,105,109,105,122,97,116,105,111,110,32,111,102,32,80,67,82,69,32,119,111,117,108,100,32,115,107,105,112,32,116,104,101,32,115,117,98,106,101,99,116,32,117,112,32,116,111,32,34,65,34,32,97,110,100,32,110,101,118,101,114,32,114,101,97,108,105,122,101,32,116,104,97,116,32,116,104,101,32,40,42,67,79,77,77,73,84,41,32,105,110,115,116,114,117,99,116,105,111,110,32,105,115,32,116,111,32,104,97,118,101,32,109,97,100,101,32,116,104,101,32,109,97,116,99,104,105,110,103,32,102,97,105,108,46,32,84,104,105,115,32,111,112,116,105,111,110,32,105,115,32,111,110,108,121,32,114,101,108,101,118,97,110,116,32,105,102,32,121,111,117,32,117,115,101,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,44,32,97,115,32,100,105,115,99,117,115,115,101,100,32,105,110,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,101,103,101,120,112,95,115,121,110,116,97,120,95,100,101,116,97,105,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<80,67,82,69,32,82,101,103,117,108,97,114,32,69,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115>>]},<<46>>]}]},{dt,[],[{code,[],[<<117,99,112>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,116,111,32,98,101,32,117,115,101,100,32,119,104,101,110,32,114,101,115,111,108,118,105,110,103,32,92,66,44,32,92,98,44,32,92,68,44,32,92,100,44,32,92,83,44,32,92,115,44,32,92,87,32,97,110,100,32,92,119,46,32,87,105,116,104,111,117,116,32,116,104,105,115,32,102,108,97,103,44,32,111,110,108,121,32,73,83,79,32,76,97,116,105,110,45,49,32,112,114,111,112,101,114,116,105,101,115,32,97,114,101,32,117,115,101,100,46,32,85,115,105,110,103,32,85,110,105,99,111,100,101,32,112,114,111,112,101,114,116,105,101,115,32,104,117,114,116,115,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98,117,116,32,105,115,32,115,101,109,97,110,116,105,99,97,108,108,121,32,99,111,114,114,101,99,116,32,119,104,101,110,32,119,111,114,107,105,110,103,32,119,105,116,104,32,85,110,105,99,111,100,101,32,99,104,97,114,97,99,116,101,114,115,32,98,101,121,111,110,100,32,116,104,101,32,73,83,79,32,76,97,116,105,110,45,49,32,114,97,110,103,101,46>>]}]},{dt,[],[{code,[],[<<110,101,118,101,114,95,117,116,102>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,40,42,85,84,70,41,32,97,110,100,47,111,114,32,40,42,85,84,70,56,41,32,34,115,116,97,114,116,45,111,102,45,112,97,116,116,101,114,110,32,105,116,101,109,115,34,32,97,114,101,32,102,111,114,98,105,100,100,101,110,46,32,84,104,105,115,32,102,108,97,103,32,99,97,110,110,111,116,32,98,101,32,99,111,109,98,105,110,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<46,32,85,115,101,102,117,108,32,105,102,32,73,83,79,32,76,97,116,105,110,45,49,32,112,97,116,116,101,114,110,115,32,102,114,111,109,32,97,110,32,101,120,116,101,114,110,97,108,32,115,111,117,114,99,101,32,97,114,101,32,116,111,32,98,101,32,99,111,109,112,105,108,101,100,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,57,55>>,signature => [{attribute,{57,2},spec,{{compile,2},[{type,{57,14},bounded_fun,[{type,{57,14},'fun',[{type,{57,14},product,[{var,{57,15},'Regexp'},{var,{57,23},'Options'}]},{type,{57,35},union,[{type,{57,35},tuple,[{atom,{57,36},ok},{var,{57,40},'MP'}]},{type,{57,46},tuple,[{atom,{57,47},error},{var,{57,54},'ErrSpec'}]}]}]},[{type,{58,7},constraint,[{atom,{58,7},is_subtype},[{var,{58,7},'Regexp'},{type,{58,17},union,[{type,{58,17},iodata,[]},{remote_type,{58,28},[{atom,{58,28},unicode},{atom,{58,36},charlist},[]]}]}]]},{type,{59,7},constraint,[{atom,{59,7},is_subtype},[{var,{59,7},'Options'},{type,{59,18},list,[{var,{59,19},'Option'}]}]]},{type,{60,7},constraint,[{atom,{60,7},is_subtype},[{var,{60,7},'Option'},{user_type,{60,17},compile_option,[]}]]},{type,{61,7},constraint,[{atom,{61,7},is_subtype},[{var,{61,7},'MP'},{user_type,{61,13},mp,[]}]]},{type,{62,7},constraint,[{atom,{62,7},is_subtype},[{var,{62,7},'ErrSpec'},{type,{62,18},tuple,[{ann_type,{62,19},[{var,{62,19},'ErrString'},{type,{62,32},string,[]}]},{ann_type,{62,42},[{var,{62,42},'Position'},{type,{62,54},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,inspect,2},[{file,[114,101,46,101,114,108]},{location,143}],[<<105,110,115,112,101,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<84,97,107,101,115,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32,97,110,32,105,116,101,109,44,32,97,110,100,32,114,101,116,117,114,110,115,32,116,104,101,32,114,101,108,101,118,97,110,116,32,100,97,116,97,32,102,114,111,109,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,111,110,108,121,32,115,117,112,112,111,114,116,101,100,32,105,116,101,109,32,105,115,32>>,{code,[],[<<110,97,109,101,108,105,115,116>>]},<<44,32,119,104,105,99,104,32,114,101,116,117,114,110,115,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,110,97,109,101,108,105,115,116,44,32,91,98,105,110,97,114,121,40,41,93,125>>]},<<44,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,110,97,109,101,115,32,111,102,32,97,108,108,32,40,117,110,105,113,117,101,41,32,110,97,109,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,111,107,44,77,80,68,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,67,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,44,91,100,117,112,110,97,109,101,115,93,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,56,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,52,62,32,114,101,58,105,110,115,112,101,99,116,40,77,80,68,44,110,97,109,101,108,105,115,116,41,46,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125>>]}]},{p,[],[<<78,111,116,105,99,101,32,105,110,32,116,104,101,32,115,101,99,111,110,100,32,101,120,97,109,112,108,101,32,116,104,97,116,32,116,104,101,32,100,117,112,108,105,99,97,116,101,32,110,97,109,101,32,111,110,108,121,32,111,99,99,117,114,115,32,111,110,99,101,32,105,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,108,105,115,116,44,32,97,110,100,32,116,104,97,116,32,116,104,101,32,108,105,115,116,32,105,115,32,105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,119,104,101,114,101,32,116,104,101,32,110,97,109,101,115,32,97,114,101,32,112,111,115,105,116,105,111,110,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32,84,104,101,32,111,114,100,101,114,32,111,102,32,116,104,101,32,110,97,109,101,115,32,105,115,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,111,114,100,101,114,32,111,102,32,99,97,112,116,117,114,101,100,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,102,32>>,{code,[],[<<123,99,97,112,116,117,114,101,44,32,97,108,108,95,110,97,109,101,115,125>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,110,32,111,112,116,105,111,110,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<46,32,89,111,117,32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,99,114,101,97,116,101,32,97,32,110,97,109,101,45,116,111,45,118,97,108,117,101,32,109,97,112,112,105,110,103,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,108,105,107,101,32,116,104,105,115,58>>]},{pre,[],[{code,[],[<<49,62,32,123,111,107,44,77,80,125,32,61,32,114,101,58,99,111,109,112,105,108,101,40,34,40,63,60,65,62,65,41,124,40,63,60,66,62,66,41,124,40,63,60,67,62,67,41,34,41,46,10,123,111,107,44,123,114,101,95,112,97,116,116,101,114,110,44,51,44,48,44,48,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,60,54,57,44,56,50,44,54,55,44,56,48,44,49,49,57,44,48,44,48,44,48,44,48,44,48,44,48,44,48,44,49,44,48,44,48,44,48,44,50,53,53,44,50,53,53,44,50,53,53,44,50,53,53,44,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,50,53,53,44,50,53,53,44,46,46,46,62,62,125,125,10,50,62,32,123,110,97,109,101,108,105,115,116,44,32,78,125,32,61,32,114,101,58,105,110,115,112,101,99,116,40,77,80,44,110,97,109,101,108,105,115,116,41,46,10,123,110,97,109,101,108,105,115,116,44,91,60,60,34,65,34,62,62,44,60,60,34,66,34,62,62,44,60,60,34,67,34,62,62,93,125,10,51,62,32,123,109,97,116,99,104,44,76,125,32,61,32,114,101,58,114,117,110,40,34,65,65,34,44,77,80,44,91,123,99,97,112,116,117,114,101,44,97,108,108,95,110,97,109,101,115,44,98,105,110,97,114,121,125,93,41,46,10,123,109,97,116,99,104,44,91,60,60,34,65,34,62,62,44,60,60,62,62,44,60,60,62,62,93,125,10,52,62,32,78,97,109,101,77,97,112,32,61,32,108,105,115,116,115,58,122,105,112,40,78,44,76,41,46,10,91,123,60,60,34,65,34,62,62,44,60,60,34,65,34,62,62,125,44,123,60,60,34,66,34,62,62,44,60,60,62,62,125,44,123,60,60,34,67,34,62,62,44,60,60,62,62,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,51,48,54>>,signature => [{attribute,{143,2},spec,{{inspect,2},[{type,{143,14},bounded_fun,[{type,{143,14},'fun',[{type,{143,14},product,[{var,{143,15},'MP'},{var,{143,18},'Item'}]},{type,{143,27},tuple,[{atom,{143,28},namelist},{type,{143,38},list,[{type,{143,40},binary,[]}]}]}]},[{type,{144,7},constraint,[{atom,{144,7},is_subtype},[{var,{144,7},'MP'},{user_type,{144,13},mp,[]}]]},{type,{145,7},constraint,[{atom,{145,7},is_subtype},[{var,{145,7},'Item'},{atom,{145,15},namelist}]]}]]}]}}],since => <<79,84,80,32,49,55,46,48>>}},{{function,replace,3},[{file,[114,101,46,101,114,108]},{location,353}],[<<114,101,112,108,97,99,101,47,51>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<114,101,112,108,97,99,101,40,83,117,98,106,101,99,116,44,32,82,69,44,32,82,101,112,108,97,99,101,109,101,110,116,44,32,91,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,51,53,48>>,signature => [{attribute,{353,2},spec,{{replace,3},[{type,{353,14},bounded_fun,[{type,{353,14},'fun',[{type,{353,14},product,[{var,{353,15},'Subject'},{var,{353,24},'RE'},{var,{353,28},'Replacement'}]},{type,{353,44},union,[{type,{353,44},iodata,[]},{remote_type,{353,55},[{atom,{353,55},unicode},{atom,{353,63},charlist},[]]}]}]},[{type,{354,7},constraint,[{atom,{354,7},is_subtype},[{var,{354,7},'Subject'},{type,{354,18},union,[{type,{354,18},iodata,[]},{remote_type,{354,29},[{atom,{354,29},unicode},{atom,{354,37},charlist},[]]}]}]]},{type,{355,7},constraint,[{atom,{355,7},is_subtype},[{var,{355,7},'RE'},{type,{355,13},union,[{user_type,{355,13},mp,[]},{type,{355,20},iodata,[]}]}]]},{type,{356,7},constraint,[{atom,{356,7},is_subtype},[{var,{356,7},'Replacement'},{type,{356,22},union,[{type,{356,22},iodata,[]},{remote_type,{356,33},[{atom,{356,33},unicode},{atom,{356,41},charlist},[]]}]}]]}]]}]}}]}},{{function,replace,4},[{file,[114,101,46,101,114,108]},{location,366}],[<<114,101,112,108,97,99,101,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,112,108,97,99,101,115,32,116,104,101,32,109,97,116,99,104,101,100,32,112,97,114,116,32,111,102,32,116,104,101,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,99,111,110,116,101,110,116,115,32,111,102,32>>,{code,[],[<<82,101,112,108,97,99,101,109,101,110,116>>]},<<46>>]},{p,[],[<<84,104,101,32,112,101,114,109,105,115,115,105,98,108,101,32,111,112,116,105,111,110,115,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,102,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,111,112,116,105,111,110>>,{code,[],[<<32,99,97,112,116,117,114,101>>]},<<32,105,115,32,110,111,116,32,97,108,108,111,119,101,100,46,32,73,110,115,116,101,97,100,32,97,32>>,{code,[],[<<123,114,101,116,117,114,110,44,32,82,101,116,117,114,110,84,121,112,101,125>>]},<<32,105,115,32,112,114,101,115,101,110,116,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<44,32,99,111,110,115,116,114,117,99,116,101,100,32,105,110,32,97,32,119,97,121,32,116,111,32,109,105,110,105,109,105,122,101,32,99,111,112,121,105,110,103,46,32,84,104,101,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<32,114,101,115,117,108,116,32,99,97,110,32,98,101,32,117,115,101,100,32,100,105,114,101,99,116,108,121,32,105,110,32,109,97,110,121,32,73,47,79,32,111,112,101,114,97,116,105,111,110,115,46,32,73,102,32,97,32,102,108,97,116,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,32>>,{code,[],[<<123,114,101,116,117,114,110,44,32,108,105,115,116,125>>]},<<46,32,73,102,32,97,32,98,105,110,97,114,121,32,105,115,32,100,101,115,105,114,101,100,44,32,115,112,101,99,105,102,121,32>>,{code,[],[<<123,114,101,116,117,114,110,44,32,98,105,110,97,114,121,125>>]},<<46>>]},{p,[],[<<65,115,32,105,110,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<114,117,110,47,51>>]},<<44,32,97,110,32>>,{code,[],[<<109,112,40,41>>]},<<32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,114,101,113,117,105,114,101,115,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,116,111,32,98,101,32,97,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,97,114,101,32,116,111,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<115,46>>]},{p,[],[<<84,104,101,32,114,101,112,108,97,99,101,109,101,110,116,32,115,116,114,105,110,103,32,99,97,110,32,99,111,110,116,97,105,110,32,116,104,101,32,115,112,101,99,105,97,108,32,99,104,97,114,97,99,116,101,114,32>>,{code,[],[<<38>>]},<<44,32,119,104,105,99,104,32,105,110,115,101,114,116,115,32,116,104,101,32,119,104,111,108,101,32,109,97,116,99,104,105,110,103,32,101,120,112,114,101,115,115,105,111,110,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,97,110,100,32,116,104,101,32,115,112,101,99,105,97,108,32,115,101,113,117,101,110,99,101,32>>,{code,[],[<<92>>]},<<78,32,40,119,104,101,114,101,32,78,32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,62,32,48,41,44,32>>,{code,[],[<<92,103>>]},<<78,44,32,111,114,32>>,{code,[],[<<92,103,123>>]},<<78>>,{code,[],[<<125>>]},<<44,32,114,101,115,117,108,116,105,110,103,32,105,110,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,110,117,109,98,101,114,32,78,44,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,73,102,32,110,111,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,105,116,104,32,116,104,97,116,32,110,117,109,98,101,114,32,105,115,32,103,101,110,101,114,97,116,101,100,32,98,121,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,46>>]},{p,[],[<<84,111,32,105,110,115,101,114,116,32,97,110,32,38,32,111,114,32,97,32,92,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,112,114,101,99,101,100,101,32,105,116,32,119,105,116,104,32,97,32,92,46,32,78,111,116,105,99,101,32,116,104,97,116,32,69,114,108,97,110,103,32,97,108,114,101,97,100,121,32,103,105,118,101,115,32,97,32,115,112,101,99,105,97,108,32,109,101,97,110,105,110,103,32,116,111,32,92,32,105,110,32,108,105,116,101,114,97,108,32,115,116,114,105,110,103,115,44,32,115,111,32,97,32,115,105,110,103,108,101,32,92,32,109,117,115,116,32,98,101,32,119,114,105,116,116,101,110,32,97,115,32>>,{code,[],[<<34,92,92,34>>]},<<32,97,110,100,32,116,104,101,114,101,102,111,114,101,32,97,32,100,111,117,98,108,101,32,92,32,97,115,32>>,{code,[],[<<34,92,92,92,92,34>>]},<<46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{pre,[],[{code,[],[<<114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<34,97,98,91,99,93,100,34>>]}]},{p,[],[<<119,104,105,108,101>>]},{pre,[],[{code,[],[<<114,101,58,114,101,112,108,97,99,101,40,34,97,98,99,100,34,44,34,99,34,44,34,91,92,92,38,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<34,97,98,91,38,93,100,34>>]}]},{p,[],[<<65,115,32,119,105,116,104,32>>,{code,[],[<<114,117,110,47,51>>]},<<44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,114,97,105,115,101,32,116,104,101,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,46,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,103,101,116,32,109,111,114,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,101,114,114,111,114,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,51,54,48>>,signature => [{attribute,{366,2},spec,{{replace,4},[{type,{366,14},bounded_fun,[{type,{366,14},'fun',[{type,{366,14},product,[{var,{366,15},'Subject'},{var,{366,24},'RE'},{var,{366,28},'Replacement'},{var,{366,41},'Options'}]},{type,{366,53},union,[{type,{366,53},iodata,[]},{remote_type,{366,64},[{atom,{366,64},unicode},{atom,{366,72},charlist},[]]}]}]},[{type,{367,7},constraint,[{atom,{367,7},is_subtype},[{var,{367,7},'Subject'},{type,{367,18},union,[{type,{367,18},iodata,[]},{remote_type,{367,29},[{atom,{367,29},unicode},{atom,{367,37},charlist},[]]}]}]]},{type,{368,7},constraint,[{atom,{368,7},is_subtype},[{var,{368,7},'RE'},{type,{368,13},union,[{user_type,{368,13},mp,[]},{type,{368,20},iodata,[]},{remote_type,{368,31},[{atom,{368,31},unicode},{atom,{368,39},charlist},[]]}]}]]},{type,{369,7},constraint,[{atom,{369,7},is_subtype},[{var,{369,7},'Replacement'},{type,{369,22},union,[{type,{369,22},iodata,[]},{remote_type,{369,33},[{atom,{369,33},unicode},{atom,{369,41},charlist},[]]}]}]]},{type,{370,7},constraint,[{atom,{370,7},is_subtype},[{var,{370,7},'Options'},{type,{370,18},list,[{var,{370,19},'Option'}]}]]},{type,{371,7},constraint,[{atom,{371,7},is_subtype},[{var,{371,7},'Option'},{type,{371,17},union,[{atom,{371,17},anchored},{atom,{371,28},global},{atom,{371,37},notbol},{atom,{371,46},noteol},{atom,{371,55},notempty},{atom,{372,10},notempty_atstart},{type,{373,17},tuple,[{atom,{373,18},offset},{type,{373,26},non_neg_integer,[]}]},{type,{373,47},tuple,[{atom,{373,48},newline},{var,{373,57},'NLSpec'}]},{atom,{373,67},bsr_anycrlf},{type,{374,17},tuple,[{atom,{374,18},match_limit},{type,{374,31},non_neg_integer,[]}]},{type,{375,17},tuple,[{atom,{375,18},match_limit_recursion},{type,{375,41},non_neg_integer,[]}]},{atom,{376,17},bsr_unicode},{type,{376,31},tuple,[{atom,{376,32},return},{var,{376,40},'ReturnType'}]},{var,{376,54},'CompileOpt'}]}]]},{type,{377,7},constraint,[{atom,{377,7},is_subtype},[{var,{377,7},'ReturnType'},{type,{377,21},union,[{atom,{377,21},iodata},{atom,{377,30},list},{atom,{377,37},binary}]}]]},{type,{378,7},constraint,[{atom,{378,7},is_subtype},[{var,{378,7},'CompileOpt'},{user_type,{378,21},compile_option,[]}]]},{type,{379,7},constraint,[{atom,{379,7},is_subtype},[{var,{379,7},'NLSpec'},{type,{379,17},union,[{atom,{379,17},cr},{atom,{379,22},crlf},{atom,{379,29},lf},{atom,{379,34},anycrlf},{atom,{379,44},any}]}]]}]]}]}}]}},{{function,run,2},[{file,[114,101,46,101,114,108]},{location,67}],[<<114,117,110,47,50>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<114,117,110,40,83,117,98,106,101,99,116,44,82,69,44,91,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,52,49,48>>,signature => [{attribute,{67,2},spec,{{run,2},[{type,{67,10},bounded_fun,[{type,{67,10},'fun',[{type,{67,10},product,[{var,{67,11},'Subject'},{var,{67,20},'RE'}]},{type,{67,27},union,[{type,{67,27},tuple,[{atom,{67,28},match},{var,{67,35},'Captured'}]},{atom,{67,47},nomatch}]}]},[{type,{68,7},constraint,[{atom,{68,7},is_subtype},[{var,{68,7},'Subject'},{type,{68,18},union,[{type,{68,18},iodata,[]},{remote_type,{68,29},[{atom,{68,29},unicode},{atom,{68,37},charlist},[]]}]}]]},{type,{69,7},constraint,[{atom,{69,7},is_subtype},[{var,{69,7},'RE'},{type,{69,13},union,[{user_type,{69,13},mp,[]},{type,{69,20},iodata,[]}]}]]},{type,{70,7},constraint,[{atom,{70,7},is_subtype},[{var,{70,7},'Captured'},{type,{70,19},list,[{var,{70,20},'CaptureData'}]}]]},{type,{71,7},constraint,[{atom,{71,7},is_subtype},[{var,{71,7},'CaptureData'},{type,{71,22},tuple,[{type,{71,23},integer,[]},{type,{71,34},integer,[]}]}]]}]]}]}}]}},{{function,run,3},[{file,[114,101,46,101,114,108]},{location,76}],[<<114,117,110,47,51>>],#{<<101,110>> => [{p,[],[<<69,120,101,99,117,116,101,115,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,105,110,103,44,32,97,110,100,32,114,101,116,117,114,110,115,32>>,{code,[],[<<109,97,116,99,104,47,123,109,97,116,99,104,44,32,67,97,112,116,117,114,101,100,125>>]},<<32,111,114,32>>,{code,[],[<<110,111,109,97,116,99,104>>]},<<46,32,84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,101,105,116,104,101,114,32,97,115,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,111,109,112,105,108,101,100,32,40,97,115,32,98,121,32>>,{code,[],[<<99,111,109,112,105,108,101,47,50>>]},<<41,32,97,110,100,32,101,120,101,99,117,116,101,100,44,32,111,114,32,97,115,32,97,32,112,114,101,99,111,109,112,105,108,101,100,32>>,{code,[],[<<109,112,40,41>>]},<<32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,105,116,32,105,115,32,101,120,101,99,117,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,115,117,98,106,101,99,116,32,100,105,114,101,99,116,108,121,46>>]},{p,[],[<<87,104,101,110,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,44,32,101,120,99,101,112,116,105,111,110,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,105,115,32,116,104,114,111,119,110,32,105,102,32,97,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,32,111,99,99,117,114,115,46,32,67,97,108,108,32>>,{code,[],[<<99,111,109,112,105,108,101,47,50>>]},<<32,116,111,32,103,101,116,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,108,111,99,97,116,105,111,110,32,111,102,32,116,104,101,32,101,114,114,111,114,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,44,32,116,104,101,32,111,112,116,105,111,110,32,108,105,115,116,32,99,97,110,32,111,110,108,121,32,99,111,110,116,97,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,58>>]},{ul,[],[{li,[],[{code,[],[<<97,110,99,104,111,114,101,100>>]}]},{li,[],[{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125>>]}]},{li,[],[{code,[],[<<103,108,111,98,97,108>>]}]},{li,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{li,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{li,[],[{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]}]},{li,[],[{code,[],[<<110,111,116,98,111,108>>]}]},{li,[],[{code,[],[<<110,111,116,101,109,112,116,121>>]}]},{li,[],[{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]}]},{li,[],[{code,[],[<<110,111,116,101,111,108>>]}]},{li,[],[{code,[],[<<123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{li,[],[{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]}]}]},{p,[],[<<79,116,104,101,114,119,105,115,101,32,97,108,108,32,111,112,116,105,111,110,115,32,118,97,108,105,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<99,111,109,112,105,108,101,47,50>>]},<<32,97,114,101,32,97,108,115,111,32,97,108,108,111,119,101,100,46,32,79,112,116,105,111,110,115,32,97,108,108,111,119,101,100,32,98,111,116,104,32,102,111,114,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,44,32,110,97,109,101,108,121,32>>,{code,[],[<<97,110,99,104,111,114,101,100>>]},<<32,97,110,100,32>>,{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]},<<44,32,97,102,102,101,99,116,32,98,111,116,104,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,97,110,100,32,101,120,101,99,117,116,105,111,110,32,105,102,32,112,114,101,115,101,110,116,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,97,32,110,111,110,45,112,114,101,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,112,114,101,118,105,111,117,115,108,121,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,105,115,32,116,111,32,98,101,32,112,114,111,118,105,100,101,100,32,97,115,32,97,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<44,32,111,116,104,101,114,119,105,115,101,32,97,110,121,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<32,119,105,108,108,32,100,111,46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,105,110,118,111,108,118,101,100,32,97,110,100,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32,98,111,116,104,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,97,110,100,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,115,40,41>>]},<<46>>]},{p,[],[{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125,47,123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125>>]},<<32,100,101,102,105,110,101,115,32,119,104,97,116,32,116,111,32,114,101,116,117,114,110,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,32,117,112,111,110,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,46,32,84,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,116,117,112,108,101,32,99,97,110,32,99,111,110,116,97,105,110,32,98,111,116,104,32,97,32,118,97,108,117,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,119,104,105,99,104,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,44,32,97,110,100,32,97,32,116,121,112,101,32,115,112,101,99,105,102,105,99,97,116,105,111,110,44,32,116,101,108,108,105,110,103,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,32,40,97,115,32,105,110,100,101,120,32,116,117,112,108,101,115,44,32,108,105,115,116,115,44,32,111,114,32,98,105,110,97,114,105,101,115,41,46,32,84,104,101,32,111,112,116,105,111,110,115,32,97,114,101,32,100,101,115,99,114,105,98,101,100,32,105,110,32,100,101,116,97,105,108,32,98,101,108,111,119,46>>]},{p,[],[<<73,102,32,116,104,101,32,99,97,112,116,117,114,101,32,111,112,116,105,111,110,115,32,100,101,115,99,114,105,98,101,32,116,104,97,116,32,110,111,32,115,117,98,115,116,114,105,110,103,32,99,97,112,116,117,114,105,110,103,32,105,115,32,116,111,32,98,101,32,100,111,110,101,32,40>>,{code,[],[<<123,99,97,112,116,117,114,101,44,32,110,111,110,101,125>>]},<<41,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,114,101,116,117,114,110,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,32>>,{code,[],[<<109,97,116,99,104>>]},<<32,117,112,111,110,32,115,117,99,99,101,115,115,102,117,108,32,109,97,116,99,104,105,110,103,44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,109,97,116,99,104,44,32,86,97,108,117,101,76,105,115,116,125>>]},<<46,32,68,105,115,97,98,108,105,110,103,32,99,97,112,116,117,114,105,110,103,32,99,97,110,32,98,101,32,100,111,110,101,32,101,105,116,104,101,114,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<110,111,110,101>>]},<<32,111,114,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,97,115,32>>,{code,[],[<<86,97,108,117,101,83,112,101,99>>]},<<46>>]},{p,[],[<<79,112,116,105,111,110,32>>,{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]},<<32,97,100,100,115,32,116,104,101,32,112,111,115,115,105,98,105,108,105,116,121,32,116,104,97,116,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,32,105,115,32,114,101,116,117,114,110,101,100,46,32,84,104,101,32,116,117,112,108,101,32,101,105,116,104,101,114,32,105,110,100,105,99,97,116,101,115,32,97,32,109,97,116,99,104,105,110,103,32,101,114,114,111,114,32,40>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,111,114,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]},<<41,44,32,111,114,32,97,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,44,32,119,104,101,114,101,32,116,104,101,32,101,114,114,111,114,32,116,117,112,108,101,32,104,97,115,32,116,104,101,32,102,111,114,109,97,116,32>>,{code,[],[<<123,101,114,114,111,114,44,32,123,99,111,109,112,105,108,101,44,32,67,111,109,112,105,108,101,69,114,114,125,125>>]},<<46,32,78,111,116,105,99,101,32,116,104,97,116,32,105,102,32,111,112,116,105,111,110,32>>,{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]},<<32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,110,101,118,101,114,32,114,101,116,117,114,110,115,32,101,114,114,111,114,32,116,117,112,108,101,115,44,32,98,117,116,32,114,101,112,111,114,116,115,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,97,115,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,101,120,99,101,112,116,105,111,110,32,97,110,100,32,102,97,105,108,101,100,32,109,97,116,99,104,101,115,32,98,101,99,97,117,115,101,32,111,102,32,101,120,99,101,101,100,101,100,32,109,97,116,99,104,32,108,105,109,105,116,115,32,115,105,109,112,108,121,32,97,115,32>>,{code,[],[<<110,111,109,97,116,99,104>>]},<<46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,111,112,116,105,111,110,115,32,97,114,101,32,114,101,108,101,118,97,110,116,32,102,111,114,32,101,120,101,99,117,116,105,111,110,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,110,99,104,111,114,101,100>>]}]},{dd,[],[{p,[],[<<76,105,109,105,116,115,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,116,111,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,112,111,115,105,116,105,111,110,46,32,73,102,32,97,32,112,97,116,116,101,114,110,32,119,97,115,32,99,111,109,112,105,108,101,100,32,119,105,116,104,32>>,{code,[],[<<97,110,99,104,111,114,101,100>>]},<<44,32,111,114,32,116,117,114,110,101,100,32,111,117,116,32,116,111,32,98,101,32,97,110,99,104,111,114,101,100,32,98,121,32,118,105,114,116,117,101,32,111,102,32,105,116,115,32,99,111,110,116,101,110,116,115,44,32,105,116,32,99,97,110,110,111,116,32,98,101,32,109,97,100,101,32,117,110,97,110,99,104,111,114,101,100,32,97,116,32,109,97,116,99,104,105,110,103,32,116,105,109,101,44,32,104,101,110,99,101,32,116,104,101,114,101,32,105,115,32,110,111,32>>,{code,[],[<<117,110,97,110,99,104,111,114,101,100>>]},<<32,111,112,116,105,111,110,46>>]}]},{dt,[],[{code,[],[<<103,108,111,98,97,108>>]}]},{dd,[],[{p,[],[<<73,109,112,108,101,109,101,110,116,115,32,103,108,111,98,97,108,32,40,114,101,112,101,116,105,116,105,118,101,41,32,115,101,97,114,99,104,32,40,102,108,97,103,32>>,{code,[],[<<103>>]},<<32,105,110,32,80,101,114,108,41,46,32,69,97,99,104,32,109,97,116,99,104,32,105,115,32,114,101,116,117,114,110,101,100,32,97,115,32,97,32,115,101,112,97,114,97,116,101,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,112,101,99,105,102,105,99,32,109,97,116,99,104,32,97,110,100,32,97,110,121,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,40,111,114,32,97,115,32,115,112,101,99,105,102,105,101,100,32,98,121,32,111,112,116,105,111,110,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<46,32,84,104,101,32>>,{code,[],[<<67,97,112,116,117,114,101,100>>]},<<32,112,97,114,116,32,111,102,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,104,101,110,99,101,32,97,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,111,102,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<115,32,119,104,101,110,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46>>]},{p,[],[<<84,104,101,32,105,110,116,101,114,97,99,116,105,111,110,32,111,102,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,119,105,116,104,32,97,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,116,104,97,116,32,109,97,116,99,104,101,115,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,115,117,114,112,114,105,115,101,115,32,115,111,109,101,32,117,115,101,114,115,46,32,87,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,104,97,110,100,108,101,115,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,105,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,97,115,32,80,101,114,108,58,32,97,32,122,101,114,111,45,108,101,110,103,116,104,32,109,97,116,99,104,32,97,116,32,97,110,121,32,112,111,105,110,116,32,105,115,32,97,108,115,111,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]},<<46,32,73,102,32,116,104,97,116,32,115,101,97,114,99,104,32,103,105,118,101,115,32,97,32,114,101,115,117,108,116,32,111,102,32,108,101,110,103,116,104,32,62,32,48,44,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,105,110,99,108,117,100,101,100,46,32,69,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,99,97,116,34,44,34,40,124,97,116,41,34,44,91,103,108,111,98,97,108,93,41,46>>]}]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,109,97,116,99,104,105,110,103,115,32,97,114,101,32,112,101,114,102,111,114,109,101,100,58>>]},{dl,[],[{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<48>>]}]},{dd,[],[{p,[],[<<84,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32>>,{code,[],[<<40,124,97,116,41>>]},<<32,102,105,114,115,116,32,109,97,116,99,104,32,97,116,32,116,104,101,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,32,111,102,32,115,116,114,105,110,103,32>>,{code,[],[<<99,97,116>>]},<<44,32,103,105,118,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,115,101,116,32>>,{code,[],[<<91,123,48,44,48,125,44,123,48,44,48,125,93>>]},<<32,40,116,104,101,32,115,101,99,111,110,100,32>>,{code,[],[<<123,48,44,48,125>>]},<<32,105,115,32,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,41,46,32,65,115,32,116,104,101,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,32,105,115,32,48,44,32,119,101,32,100,111,32,110,111,116,32,97,100,118,97,110,99,101,32,116,111,32,116,104,101,32,110,101,120,116,32,112,111,115,105,116,105,111,110,32,121,101,116,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<48>>]},<<32,119,105,116,104,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,101,97,114,99,104,32,105,115,32,114,101,116,114,105,101,100,32,119,105,116,104,32,111,112,116,105,111,110,115,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]},<<32,97,116,32,116,104,101,32,115,97,109,101,32,112,111,115,105,116,105,111,110,44,32,119,104,105,99,104,32,100,111,101,115,32,110,111,116,32,103,105,118,101,32,97,110,121,32,105,110,116,101,114,101,115,116,105,110,103,32,114,101,115,117,108,116,32,111,102,32,108,111,110,103,101,114,32,108,101,110,103,116,104,44,32,115,111,32,116,104,101,32,115,101,97,114,99,104,32,112,111,115,105,116,105,111,110,32,105,115,32,97,100,118,97,110,99,101,100,32,116,111,32,116,104,101,32,110,101,120,116,32,99,104,97,114,97,99,116,101,114,32,40>>,{code,[],[<<97>>]},<<41,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<49>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,101,97,114,99,104,32,114,101,115,117,108,116,115,32,105,110,32>>,{code,[],[<<91,123,49,44,48,125,44,123,49,44,48,125,93>>]},<<44,32,115,111,32,116,104,105,115,32,115,101,97,114,99,104,32,105,115,32,97,108,115,111,32,114,101,112,101,97,116,101,100,32,119,105,116,104,32,116,104,101,32,101,120,116,114,97,32,111,112,116,105,111,110,115,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<49>>]},<<32,119,105,116,104,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]}]},{dd,[],[{p,[],[<<65,108,116,101,114,110,97,116,105,118,101,32>>,{code,[],[<<97,98>>]},<<32,105,115,32,102,111,117,110,100,32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,91,123,49,44,50,125,44,123,49,44,50,125,93,46,32,84,104,101,32,114,101,115,117,108,116,32,105,115,32,97,100,100,101,100,32,116,111,32,116,104,101,32,108,105,115,116,32,111,102,32,114,101,115,117,108,116,115,32,97,110,100,32,116,104,101,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,101,97,114,99,104,32,115,116,114,105,110,103,32,105,115,32,97,100,118,97,110,99,101,100,32,116,119,111,32,115,116,101,112,115,46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<51>>]}]},{dd,[],[{p,[],[<<84,104,101,32,115,101,97,114,99,104,32,111,110,99,101,32,97,103,97,105,110,32,109,97,116,99,104,101,115,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,103,105,118,105,110,103,32>>,{code,[],[<<91,123,51,44,48,125,44,123,51,44,48,125,93>>]},<<46>>]}]},{dt,[],[<<65,116,32,111,102,102,115,101,116,32>>,{code,[],[<<49>>]},<<32,119,105,116,104,32>>,{code,[],[<<91,97,110,99,104,111,114,101,100,44,32,110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116,93>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,103,105,118,101,115,32,110,111,32,114,101,115,117,108,116,32,111,102,32,108,101,110,103,116,104,32,62,32,48,32,97,110,100,32,119,101,32,97,114,101,32,97,116,32,116,104,101,32,108,97,115,116,32,112,111,115,105,116,105,111,110,44,32,115,111,32,116,104,101,32,103,108,111,98,97,108,32,115,101,97,114,99,104,32,105,115,32,99,111,109,112,108,101,116,101,46>>]}]}]},{p,[],[<<84,104,101,32,114,101,115,117,108,116,32,111,102,32,116,104,101,32,99,97,108,108,32,105,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,91,123,48,44,48,125,44,123,48,44,48,125,93,44,91,123,49,44,48,125,44,123,49,44,48,125,93,44,91,123,49,44,50,125,44,123,49,44,50,125,93,44,91,123,51,44,48,125,44,123,51,44,48,125,93,93,125>>]}]}]},{dt,[],[{code,[],[<<110,111,116,101,109,112,116,121>>]}]},{dd,[],[{p,[],[<<65,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,99,111,110,115,105,100,101,114,101,100,32,116,111,32,98,101,32,97,32,118,97,108,105,100,32,109,97,116,99,104,32,105,102,32,116,104,105,115,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,46,32,73,102,32,97,108,116,101,114,110,97,116,105,118,101,115,32,105,110,32,116,104,101,32,112,97,116,116,101,114,110,32,101,120,105,115,116,44,32,116,104,101,121,32,97,114,101,32,116,114,105,101,100,46,32,73,102,32,97,108,108,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,115,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,44,32,116,104,101,32,101,110,116,105,114,101,32,109,97,116,99,104,32,102,97,105,108,115,46>>]},{p,[],[{em,[],[<<69,120,97,109,112,108,101,58>>]}]},{p,[],[<<73,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,112,97,116,116,101,114,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,97,32,115,116,114,105,110,103,32,110,111,116,32,98,101,103,105,110,110,105,110,103,32,119,105,116,104,32,34,97,34,32,111,114,32,34,98,34,44,32,105,116,32,119,111,117,108,100,32,110,111,114,109,97,108,108,121,32,109,97,116,99,104,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,58>>]},{pre,[],[{code,[],[<<97,63,98,63>>]}]},{p,[],[<<87,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<110,111,116,101,109,112,116,121>>]},<<44,32,116,104,105,115,32,109,97,116,99,104,32,105,115,32,105,110,118,97,108,105,100,44,32,115,111,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,115,101,97,114,99,104,101,115,32,102,117,114,116,104,101,114,32,105,110,116,111,32,116,104,101,32,115,116,114,105,110,103,32,102,111,114,32,111,99,99,117,114,114,101,110,99,101,115,32,111,102,32,34,97,34,32,111,114,32,34,98,34,46>>]}]},{dt,[],[{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]}]},{dd,[],[{p,[],[<<76,105,107,101,32>>,{code,[],[<<110,111,116,101,109,112,116,121>>]},<<44,32,101,120,99,101,112,116,32,116,104,97,116,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,109,97,116,99,104,32,116,104,97,116,32,105,115,32,110,111,116,32,97,116,32,116,104,101,32,115,116,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,105,115,32,112,101,114,109,105,116,116,101,100,46,32,73,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,110,99,104,111,114,101,100,44,32,115,117,99,104,32,97,32,109,97,116,99,104,32,99,97,110,32,111,99,99,117,114,32,111,110,108,121,32,105,102,32,116,104,101,32,112,97,116,116,101,114,110,32,99,111,110,116,97,105,110,115,32,92,75,46>>]},{p,[],[<<80,101,114,108,32,104,97,115,32,110,111,32,100,105,114,101,99,116,32,101,113,117,105,118,97,108,101,110,116,32,111,102,32>>,{code,[],[<<110,111,116,101,109,112,116,121>>]},<<32,111,114,32>>,{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]},<<44,32,98,117,116,32,105,116,32,100,111,101,115,32,109,97,107,101,32,97,32,115,112,101,99,105,97,108,32,99,97,115,101,32,111,102,32,97,32,112,97,116,116,101,114,110,32,109,97,116,99,104,32,111,102,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,32,119,105,116,104,105,110,32,105,116,115,32,115,112,108,105,116,40,41,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,119,104,101,110,32,117,115,105,110,103,32,109,111,100,105,102,105,101,114,32>>,{code,[],[<<47,103>>]},<<46,32,84,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,99,97,110,32,98,101,32,101,109,117,108,97,116,101,100,32,97,102,116,101,114,32,109,97,116,99,104,105,110,103,32,97,32,110,117,108,108,32,115,116,114,105,110,103,32,98,121,32,102,105,114,115,116,32,116,114,121,105,110,103,32,116,104,101,32,109,97,116,99,104,32,97,103,97,105,110,32,97,116,32,116,104,101,32,115,97,109,101,32,111,102,102,115,101,116,32,119,105,116,104,32>>,{code,[],[<<110,111,116,101,109,112,116,121,95,97,116,115,116,97,114,116>>]},<<32,97,110,100,32>>,{code,[],[<<97,110,99,104,111,114,101,100>>]},<<44,32,97,110,100,32,116,104,101,110,44,32,105,102,32,116,104,97,116,32,102,97,105,108,115,44,32,98,121,32,97,100,118,97,110,99,105,110,103,32,116,104,101,32,115,116,97,114,116,105,110,103,32,111,102,102,115,101,116,32,40,115,101,101,32,98,101,108,111,119,41,32,97,110,100,32,116,114,121,105,110,103,32,97,110,32,111,114,100,105,110,97,114,121,32,109,97,116,99,104,32,97,103,97,105,110,46>>]}]},{dt,[],[{code,[],[<<110,111,116,98,111,108>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,102,105,114,115,116,32,99,104,97,114,97,99,116,101,114,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,116,104,101,32,98,101,103,105,110,110,105,110,103,32,111,102,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,32,99,105,114,99,117,109,102,108,101,120,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,32,111,110,108,121,32,97,102,102,101,99,116,115,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,99,105,114,99,117,109,102,108,101,120,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,65,46>>]}]},{dt,[],[{code,[],[<<110,111,116,101,111,108>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,110,111,116,32,116,104,101,32,101,110,100,32,111,102,32,97,32,108,105,110,101,44,32,115,111,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,32,105,115,32,110,111,116,32,116,111,32,109,97,116,99,104,32,105,116,32,110,111,114,32,40,101,120,99,101,112,116,32,105,110,32,109,117,108,116,105,108,105,110,101,32,109,111,100,101,41,32,97,32,110,101,119,108,105,110,101,32,105,109,109,101,100,105,97,116,101,108,121,32,98,101,102,111,114,101,32,105,116,46,32,83,101,116,116,105,110,103,32,116,104,105,115,32,119,105,116,104,111,117,116,32>>,{code,[],[<<109,117,108,116,105,108,105,110,101>>]},<<32,40,97,116,32,99,111,109,112,105,108,101,32,116,105,109,101,41,32,99,97,117,115,101,115,32,100,111,108,108,97,114,32,110,101,118,101,114,32,116,111,32,109,97,116,99,104,46,32,84,104,105,115,32,111,112,116,105,111,110,32,97,102,102,101,99,116,115,32,111,110,108,121,32,116,104,101,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,100,111,108,108,97,114,32,109,101,116,97,99,104,97,114,97,99,116,101,114,46,32,73,116,32,100,111,101,115,32,110,111,116,32,97,102,102,101,99,116,32,92,90,32,111,114,32,92,122,46>>]}]},{dt,[],[{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]}]},{dd,[],[{p,[],[<<71,105,118,101,115,32,98,101,116,116,101,114,32,99,111,110,116,114,111,108,32,111,102,32,116,104,101,32,101,114,114,111,114,32,104,97,110,100,108,105,110,103,32,105,110,32>>,{code,[],[<<114,117,110,47,51>>]},<<46,32,87,104,101,110,32,115,112,101,99,105,102,105,101,100,44,32,99,111,109,112,105,108,97,116,105,111,110,32,101,114,114,111,114,115,32,40,105,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,110,111,116,32,97,108,114,101,97,100,121,32,99,111,109,112,105,108,101,100,41,32,97,110,100,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,32,97,114,101,32,101,120,112,108,105,99,105,116,108,121,32,114,101,116,117,114,110,101,100,32,97,115,32,97,110,32,101,114,114,111,114,32,116,117,112,108,101,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,111,115,115,105,98,108,101,32,114,117,110,116,105,109,101,32,101,114,114,111,114,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]}]},{dd,[],[{p,[],[<<84,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,115,101,116,115,32,97,32,108,105,109,105,116,32,111,110,32,104,111,119,32,109,97,110,121,32,116,105,109,101,115,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,99,97,108,108,101,100,46,32,68,101,102,97,117,108,116,115,32,116,111,32,49,48,44,48,48,48,44,48,48,48,32,105,110,32,116,104,101,32,108,105,98,114,97,114,121,32,99,111,109,112,105,108,101,100,32,102,111,114,32,69,114,108,97,110,103,46,32,73,102,32>>,{code,[],[<<123,101,114,114,111,114,44,32,109,97,116,99,104,95,108,105,109,105,116,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,44,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,104,97,115,32,114,101,97,99,104,101,100,32,116,104,105,115,32,108,105,109,105,116,46,32,84,104,105,115,32,105,115,32,110,111,114,109,97,108,108,121,32,116,111,32,98,101,32,114,101,103,97,114,100,101,100,32,97,115,32,97,32>>,{code,[],[<<110,111,109,97,116,99,104>>]},<<44,32,119,104,105,99,104,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,119,104,101,110,32,116,104,105,115,32,111,99,99,117,114,115,44,32,98,117,116,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<114,101,112,111,114,116,95,101,114,114,111,114,115>>]},<<44,32,121,111,117,32,97,114,101,32,105,110,102,111,114,109,101,100,32,119,104,101,110,32,116,104,101,32,109,97,116,99,104,32,102,97,105,108,115,32,98,101,99,97,117,115,101,32,111,102,32,116,111,111,32,109,97,110,121,32,105,110,116,101,114,110,97,108,32,99,97,108,108,115,46>>]}]},{dt,[],[{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]}]},{dd,[],[{p,[],[<<84,104,105,115,32,101,114,114,111,114,32,105,115,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<44,32,98,117,116,32,111,99,99,117,114,115,32,119,104,101,110,32,116,104,101,32,105,110,116,101,114,110,97,108,32,109,97,116,99,104,32,102,117,110,99,116,105,111,110,32,111,102,32,80,67,82,69,32,105,115,32,34,114,101,99,117,114,115,105,118,101,108,121,34,32,99,97,108,108,101,100,32,109,111,114,101,32,116,105,109,101,115,32,116,104,97,110,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]},<<32,108,105,109,105,116,44,32,119,104,105,99,104,32,100,101,102,97,117,108,116,115,32,116,111,32,49,48,44,48,48,48,44,48,48,48,32,97,115,32,119,101,108,108,46,32,78,111,116,105,99,101,32,116,104,97,116,32,97,115,32,108,111,110,103,32,97,115,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,97,110,100,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,100,101,102,97,117,108,116>>]},<<32,118,97,108,117,101,115,32,97,114,101,32,107,101,112,116,32,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,115,44,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110>>]},<<32,101,114,114,111,114,32,99,97,110,110,111,116,32,111,99,99,117,114,44,32,97,115,32,116,104,101,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,101,114,114,111,114,32,111,99,99,117,114,115,32,98,101,102,111,114,101,32,116,104,97,116,32,40,101,97,99,104,32,114,101,99,117,114,115,105,118,101,32,99,97,108,108,32,105,115,32,97,108,115,111,32,97,32,99,97,108,108,44,32,98,117,116,32,110,111,116,32,99,111,110,118,101,114,115,101,108,121,41,46,32,66,111,116,104,32,108,105,109,105,116,115,32,99,97,110,32,104,111,119,101,118,101,114,32,98,101,32,99,104,97,110,103,101,100,44,32,101,105,116,104,101,114,32,98,121,32,115,101,116,116,105,110,103,32,108,105,109,105,116,115,32,100,105,114,101,99,116,108,121,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,115,116,114,105,110,103,32,40,115,101,101,32,115,101,99,116,105,111,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,101,103,101,120,112,95,115,121,110,116,97,120,95,100,101,116,97,105,108,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<80,67,82,69,32,82,101,103,117,108,97,114,32,69,101,120,112,114,101,115,115,105,111,110,32,68,101,116,97,105,108,115>>]},<<41,32,111,114,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32,111,112,116,105,111,110,115,32,116,111,32>>,{code,[],[<<114,117,110,47,51>>]},<<46>>]}]}]},{p,[],[<<73,116,32,105,115,32,105,109,112,111,114,116,97,110,116,32,116,111,32,117,110,100,101,114,115,116,97,110,100,32,116,104,97,116,32,119,104,97,116,32,105,115,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32,34,114,101,99,117,114,115,105,111,110,34,32,119,104,101,110,32,108,105,109,105,116,105,110,103,32,109,97,116,99,104,101,115,32,105,115,32,110,111,116,32,114,101,99,117,114,115,105,111,110,32,111,110,32,116,104,101,32,67,32,115,116,97,99,107,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,109,97,99,104,105,110,101,32,111,114,32,111,110,32,116,104,101,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,32,115,116,97,99,107,46,32,84,104,101,32,80,67,82,69,32,118,101,114,115,105,111,110,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,32,109,97,99,104,105,110,101,32,34,104,101,97,112,34,32,109,101,109,111,114,121,32,116,111,32,115,116,111,114,101,32,118,97,108,117,101,115,32,116,104,97,116,32,109,117,115,116,32,98,101,32,107,101,112,116,32,111,118,101,114,32,114,101,99,117,114,115,105,111,110,32,105,110,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,46>>]}]},{dt,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,97,32,109,97,116,99,104,32,105,110,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58>>]},{pre,[],[{code,[],[<<84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,32,102,105,101,108,100,32,112,114,111,118,105,100,101,115,32,97,32,109,101,97,110,115,32,111,102,32,112,114,101,118,101,110,116,105,110,103,32,80,67,82,69,32,102,114,111,109,32,117,115,105,110,103,10,117,112,32,97,32,118,97,115,116,32,97,109,111,117,110,116,32,111,102,32,114,101,115,111,117,114,99,101,115,32,119,104,101,110,32,114,117,110,110,105,110,103,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,103,111,105,110,103,10,116,111,32,109,97,116,99,104,44,32,98,117,116,32,119,104,105,99,104,32,104,97,118,101,32,97,32,118,101,114,121,32,108,97,114,103,101,32,110,117,109,98,101,114,32,111,102,32,112,111,115,115,105,98,105,108,105,116,105,101,115,32,105,110,32,116,104,101,105,114,10,115,101,97,114,99,104,32,116,114,101,101,115,46,32,84,104,101,32,99,108,97,115,115,105,99,32,101,120,97,109,112,108,101,32,105,115,32,97,32,112,97,116,116,101,114,110,32,116,104,97,116,32,117,115,101,115,32,110,101,115,116,101,100,10,117,110,108,105,109,105,116,101,100,32,114,101,112,101,97,116,115,46,10,10,73,110,116,101,114,110,97,108,108,121,44,32,112,99,114,101,95,101,120,101,99,40,41,32,117,115,101,115,32,97,32,102,117,110,99,116,105,111,110,32,99,97,108,108,101,100,32,109,97,116,99,104,40,41,44,32,119,104,105,99,104,32,105,116,32,99,97,108,108,115,10,114,101,112,101,97,116,101,100,108,121,32,40,115,111,109,101,116,105,109,101,115,32,114,101,99,117,114,115,105,118,101,108,121,41,46,32,84,104,101,32,108,105,109,105,116,32,115,101,116,32,98,121,32,109,97,116,99,104,95,108,105,109,105,116,32,105,115,10,105,109,112,111,115,101,100,32,111,110,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,105,115,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,100,117,114,105,110,103,32,97,32,109,97,116,99,104,44,10,119,104,105,99,104,32,104,97,115,32,116,104,101,32,101,102,102,101,99,116,32,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,98,97,99,107,116,114,97,99,107,105,110,103,32,116,104,97,116,32,99,97,110,10,116,97,107,101,32,112,108,97,99,101,46,32,70,111,114,32,112,97,116,116,101,114,110,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,97,110,99,104,111,114,101,100,44,32,116,104,101,32,99,111,117,110,116,32,114,101,115,116,97,114,116,115,10,102,114,111,109,32,122,101,114,111,32,102,111,114,32,101,97,99,104,32,112,111,115,105,116,105,111,110,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46>>]}]},{p,[],[<<84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,114,117,110,97,119,97,121,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,99,97,110,32,102,97,105,108,32,102,97,115,116,101,114,32,105,102,32,116,104,101,32,108,105,109,105,116,32,105,115,32,108,111,119,101,114,101,100,32,117,115,105,110,103,32,116,104,105,115,32,111,112,116,105,111,110,46,32,84,104,101,32,100,101,102,97,117,108,116,32,118,97,108,117,101,32,49,48,44,48,48,48,44,48,48,48,32,105,115,32,99,111,109,112,105,108,101,100,32,105,110,116,111,32,116,104,101,32,69,114,108,97,110,103,32,86,77,46>>]},{'div',[{class,<<110,111,116,101>>}],[{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,100,111,101,115,32,105,110,32,110,111,32,119,97,121,32,97,102,102,101,99,116,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,86,77,32,105,110,32,116,101,114,109,115,32,111,102,32,34,108,111,110,103,32,114,117,110,110,105,110,103,32,66,73,70,115,34,46,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,97,108,119,97,121,115,32,103,105,118,101,115,32,99,111,110,116,114,111,108,32,98,97,99,107,32,116,111,32,116,104,101,32,115,99,104,101,100,117,108,101,114,32,111,102,32,69,114,108,97,110,103,32,112,114,111,99,101,115,115,101,115,32,97,116,32,105,110,116,101,114,118,97,108,115,32,116,104,97,116,32,101,110,115,117,114,101,115,32,116,104,101,32,114,101,97,108,45,116,105,109,101,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,116,104,101,32,69,114,108,97,110,103,32,115,121,115,116,101,109,46>>]}]}]},{dt,[],[{code,[],[<<123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<76,105,109,105,116,115,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,97,110,100,32,109,101,109,111,114,121,32,99,111,110,115,117,109,112,116,105,111,110,32,111,102,32,97,32,109,97,116,99,104,32,105,110,32,97,110,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,45,115,112,101,99,105,102,105,99,32,119,97,121,44,32,118,101,114,121,32,115,105,109,105,108,97,114,32,116,111,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<46,32,73,116,32,105,115,32,100,101,115,99,114,105,98,101,100,32,97,115,32,102,111,108,108,111,119,115,32,98,121,32,116,104,101,32,80,67,82,69,32,100,111,99,117,109,101,110,116,97,116,105,111,110,58>>]},{pre,[],[{code,[],[<<84,104,101,32,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,32,102,105,101,108,100,32,105,115,32,115,105,109,105,108,97,114,32,116,111,32,109,97,116,99,104,95,108,105,109,105,116,44,32,98,117,116,32,105,110,115,116,101,97,100,10,111,102,32,108,105,109,105,116,105,110,103,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,116,105,109,101,115,32,116,104,97,116,32,109,97,116,99,104,40,41,32,105,115,32,99,97,108,108,101,100,44,32,105,116,10,108,105,109,105,116,115,32,116,104,101,32,100,101,112,116,104,32,111,102,32,114,101,99,117,114,115,105,111,110,46,32,84,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,105,115,32,97,32,115,109,97,108,108,101,114,32,110,117,109,98,101,114,10,116,104,97,110,32,116,104,101,32,116,111,116,97,108,32,110,117,109,98,101,114,32,111,102,32,99,97,108,108,115,44,32,98,101,99,97,117,115,101,32,110,111,116,32,97,108,108,32,99,97,108,108,115,32,116,111,32,109,97,116,99,104,40,41,32,97,114,101,10,114,101,99,117,114,115,105,118,101,46,32,84,104,105,115,32,108,105,109,105,116,32,105,115,32,111,102,32,117,115,101,32,111,110,108,121,32,105,102,32,105,116,32,105,115,32,115,101,116,32,115,109,97,108,108,101,114,32,116,104,97,110,10,109,97,116,99,104,95,108,105,109,105,116,46,10,10,76,105,109,105,116,105,110,103,32,116,104,101,32,114,101,99,117,114,115,105,111,110,32,100,101,112,116,104,32,108,105,109,105,116,115,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,109,97,99,104,105,110,101,32,115,116,97,99,107,32,116,104,97,116,10,99,97,110,32,98,101,32,117,115,101,100,44,32,111,114,44,32,119,104,101,110,32,80,67,82,69,32,104,97,115,32,98,101,101,110,32,99,111,109,112,105,108,101,100,32,116,111,32,117,115,101,32,109,101,109,111,114,121,32,111,110,32,116,104,101,32,104,101,97,112,10,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32,115,116,97,99,107,44,32,116,104,101,32,97,109,111,117,110,116,32,111,102,32,104,101,97,112,32,109,101,109,111,114,121,32,116,104,97,116,32,99,97,110,32,98,101,32,117,115,101,100,46>>]}]},{p,[],[<<84,104,101,32,69,114,108,97,110,103,32,86,77,32,117,115,101,115,32,97,32,80,67,82,69,32,108,105,98,114,97,114,121,32,119,104,101,114,101,32,104,101,97,112,32,109,101,109,111,114,121,32,105,115,32,117,115,101,100,32,119,104,101,110,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,114,101,99,117,114,115,105,111,110,32,111,99,99,117,114,115,46,32,84,104,105,115,32,116,104,101,114,101,102,111,114,101,32,108,105,109,105,116,115,32,116,104,101,32,117,115,101,32,111,102,32,109,97,99,104,105,110,101,32,104,101,97,112,44,32,110,111,116,32,67,32,115,116,97,99,107,46>>]},{p,[],[<<83,112,101,99,105,102,121,105,110,103,32,97,32,108,111,119,101,114,32,118,97,108,117,101,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,109,97,116,99,104,101,115,32,119,105,116,104,32,100,101,101,112,32,114,101,99,117,114,115,105,111,110,32,102,97,105,108,105,110,103,44,32,119,104,101,110,32,116,104,101,121,32,115,104,111,117,108,100,32,104,97,118,101,32,109,97,116,99,104,101,100,58>>]},{pre,[],[{code,[{type,<<110,111,110,101>>}],[<<49,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,41,46,10,123,109,97,116,99,104,44,91,123,48,44,49,52,125,44,123,48,44,49,51,125,93,125,10,50,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,93,41,46,10,110,111,109,97,116,99,104,10,51,62,32,114,101,58,114,117,110,40,34,97,97,97,97,97,97,97,97,97,97,97,97,97,122,34,44,34,40,97,43,41,42,122,34,44,91,123,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,44,53,125,44,114,101,112,111,114,116,95,101,114,114,111,114,115,93,41,46,10,123,101,114,114,111,114,44,109,97,116,99,104,95,108,105,109,105,116,95,114,101,99,117,114,115,105,111,110,125>>]}]},{p,[],[<<84,104,105,115,32,111,112,116,105,111,110,32,97,110,100,32,111,112,116,105,111,110,32>>,{code,[],[<<109,97,116,99,104,95,108,105,109,105,116>>]},<<32,97,114,101,32,111,110,108,121,32,116,111,32,98,101,32,117,115,101,100,32,105,110,32,114,97,114,101,32,99,97,115,101,115,46,32,85,110,100,101,114,115,116,97,110,100,105,110,103,32,111,102,32,116,104,101,32,80,67,82,69,32,108,105,98,114,97,114,121,32,105,110,116,101,114,110,97,108,115,32,105,115,32,114,101,99,111,109,109,101,110,100,101,100,32,98,101,102,111,114,101,32,116,97,109,112,101,114,105,110,103,32,119,105,116,104,32,116,104,101,115,101,32,108,105,109,105,116,115,46>>]}]},{dt,[],[{code,[],[<<123,111,102,102,115,101,116,44,32,105,110,116,101,103,101,114,40,41,32,62,61,32,48,125>>]}]},{dd,[],[{p,[],[<<83,116,97,114,116,32,109,97,116,99,104,105,110,103,32,97,116,32,116,104,101,32,111,102,102,115,101,116,32,40,112,111,115,105,116,105,111,110,41,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,101,32,111,102,102,115,101,116,32,105,115,32,122,101,114,111,45,98,97,115,101,100,44,32,115,111,32,116,104,97,116,32,116,104,101,32,100,101,102,97,117,108,116,32,105,115,32>>,{code,[],[<<123,111,102,102,115,101,116,44,48,125>>]},<<32,40,97,108,108,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,41,46>>]}]},{dt,[],[{code,[],[<<123,110,101,119,108,105,110,101,44,32,78,76,83,112,101,99,125>>]}]},{dd,[],[{p,[],[<<79,118,101,114,114,105,100,101,115,32,116,104,101,32,100,101,102,97,117,108,116,32,100,101,102,105,110,105,116,105,111,110,32,111,102,32,97,32,110,101,119,108,105,110,101,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,119,104,105,99,104,32,105,115,32,76,70,32,40,65,83,67,73,73,32,49,48,41,32,105,110,32,69,114,108,97,110,103,46>>]},{dl,[],[{dt,[],[{code,[],[<<99,114>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,67,82,32,40,65,83,67,73,73,32,49,51,41,46>>]}]},{dt,[],[{code,[],[<<108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,97,32,115,105,110,103,108,101,32,99,104,97,114,97,99,116,101,114,32,76,70,32,40,65,83,67,73,73,32,49,48,41,44,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<99,114,108,102>>]}]},{dd,[],[{p,[],[<<78,101,119,108,105,110,101,32,105,115,32,105,110,100,105,99,97,116,101,100,32,98,121,32,116,104,101,32,116,119,111,45,99,104,97,114,97,99,116,101,114,32,67,82,76,70,32,40,65,83,67,73,73,32,49,51,32,102,111,108,108,111,119,101,100,32,98,121,32,65,83,67,73,73,32,49,48,41,32,115,101,113,117,101,110,99,101,46>>]}]},{dt,[],[{code,[],[<<97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,116,104,114,101,101,32,112,114,101,99,101,100,105,110,103,32,115,101,113,117,101,110,99,101,115,32,105,115,32,98,101,32,114,101,99,111,103,110,105,122,101,100,46>>]}]},{dt,[],[{code,[],[<<97,110,121>>]}]},{dd,[],[{p,[],[<<65,110,121,32,111,102,32,116,104,101,32,110,101,119,108,105,110,101,32,115,101,113,117,101,110,99,101,115,32,97,98,111,118,101,44,32,97,110,100,32,116,104,101,32,85,110,105,99,111,100,101,32,115,101,113,117,101,110,99,101,115,32,86,84,32,40,118,101,114,116,105,99,97,108,32,116,97,98,44,32,85,43,48,48,48,66,41,44,32,70,70,32,40,102,111,114,109,102,101,101,100,44,32,85,43,48,48,48,67,41,44,32,78,69,76,32,40,110,101,120,116,32,108,105,110,101,44,32,85,43,48,48,56,53,41,44,32,76,83,32,40,108,105,110,101,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,56,41,44,32,97,110,100,32,80,83,32,40,112,97,114,97,103,114,97,112,104,32,115,101,112,97,114,97,116,111,114,44,32,85,43,50,48,50,57,41,46>>]}]}]}]},{dt,[],[{code,[],[<<98,115,114,95,97,110,121,99,114,108,102>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,111,110,108,121,32,116,104,101,32,67,82,32,76,70,44,32,111,114,32,67,82,76,70,32,115,101,113,117,101,110,99,101,115,44,32,110,111,116,32,116,104,101,32,85,110,105,99,111,100,101,45,115,112,101,99,105,102,105,99,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,46,32,40,79,118,101,114,114,105,100,101,115,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41>>]}]},{dt,[],[{code,[],[<<98,115,114,95,117,110,105,99,111,100,101>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,115,112,101,99,105,102,105,99,97,108,108,121,32,116,104,97,116,32,92,82,32,105,115,32,116,111,32,109,97,116,99,104,32,97,108,108,32,116,104,101,32,85,110,105,99,111,100,101,32,110,101,119,108,105,110,101,32,99,104,97,114,97,99,116,101,114,115,32,40,105,110,99,108,117,100,105,110,103,32,67,82,76,70,44,32,97,110,100,32,115,111,32,111,110,44,32,116,104,101,32,100,101,102,97,117,108,116,41,46,32,40,79,118,101,114,114,105,100,101,115,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,46,41>>]}]},{dt,[],[{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,125>>]},<<47>>,{code,[],[<<123,99,97,112,116,117,114,101,44,32,86,97,108,117,101,83,112,101,99,44,32,84,121,112,101,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,110,100,32,105,110,32,119,104,97,116,32,102,111,114,109,97,116,46,32,66,121,32,100,101,102,97,117,108,116,44,32>>,{code,[],[<<114,117,110,47,51>>]},<<32,99,97,112,116,117,114,101,115,32,97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,115,116,114,105,110,103,32,97,110,100,32,97,108,108,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,40,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,32,105,115,32,97,117,116,111,109,97,116,105,99,97,108,108,121,32,99,97,112,116,117,114,101,100,41,46,32,84,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,40,122,101,114,111,45,98,97,115,101,100,41,32,105,110,100,101,120,101,115,32,111,102,32,116,104,101,32,99,97,112,116,117,114,101,100,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,115,112,101,99,105,102,105,101,100,32,97,115,32>>,{code,[],[<<123,79,102,102,115,101,116,44,76,101,110,103,116,104,125>>]},<<32,112,97,105,114,115,32,40,116,104,101,32>>,{code,[],[<<105,110,100,101,120>>]},<<32>>,{code,[],[<<84,121,112,101>>]},<<32,111,102,32,99,97,112,116,117,114,105,110,103,41,46>>]},{p,[],[<<65,115,32,97,110,32,101,120,97,109,112,108,101,32,111,102,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,44,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,32,114,101,116,117,114,110,115,44,32,97,115,32,102,105,114,115,116,32,97,110,100,32,111,110,108,121,32,99,97,112,116,117,114,101,100,32,115,116,114,105,110,103,44,32,116,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,40,34,97,98,99,100,34,32,105,110,32,116,104,101,32,109,105,100,100,108,101,41,32,97,115,32,97,110,32,105,110,100,101,120,32,112,97,105,114,32>>,{code,[],[<<123,51,44,52,125>>]},<<44,32,119,104,101,114,101,32,99,104,97,114,97,99,116,101,114,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,122,101,114,111,45,98,97,115,101,100,44,32,106,117,115,116,32,97,115,32,105,110,32,111,102,102,115,101,116,115,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,97,98,99,100,34,44,91,93,41,46>>]}]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,105,115,32,99,97,108,108,32,105,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,51,44,52,125,93,125>>]}]},{p,[],[<<65,110,111,116,104,101,114,32,40,97,110,100,32,113,117,105,116,101,32,99,111,109,109,111,110,41,32,99,97,115,101,32,105,115,32,119,104,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,115,32,97,108,108,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,97,98,99,100,46,42,34,44,91,93,41,46>>]}]},{p,[],[<<72,101,114,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,99,111,114,114,101,115,112,111,110,100,105,110,103,108,121,32,112,111,105,110,116,115,32,111,117,116,32,97,108,108,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,98,101,103,105,110,110,105,110,103,32,97,116,32,105,110,100,101,120,32,48,44,32,97,110,100,32,105,116,32,105,115,32,49,48,32,99,104,97,114,97,99,116,101,114,115,32,108,111,110,103,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,48,44,49,48,125,93,125>>]}]},{p,[],[<<73,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,99,111,110,116,97,105,110,115,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,108,105,107,101,32,105,110,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,93,41,46>>]}]},{p,[],[<<97,108,108,32,111,102,32,116,104,101,32,109,97,116,99,104,101,100,32,115,117,98,106,101,99,116,32,105,115,32,99,97,112,116,117,114,101,100,44,32,97,115,32,119,101,108,108,32,97,115,32,116,104,101,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,93,125>>]}]},{p,[],[<<84,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,116,116,101,114,110,32,97,108,119,97,121,115,32,103,105,118,101,115,32,116,104,101,32,102,105,114,115,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,110,32,116,104,101,32,108,105,115,116,32,97,110,100,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,97,100,100,101,100,32,105,110,32,116,104,101,32,111,114,100,101,114,32,116,104,101,121,32,111,99,99,117,114,114,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<84,104,101,32,99,97,112,116,117,114,101,32,116,117,112,108,101,32,105,115,32,98,117,105,108,116,32,117,112,32,97,115,32,102,111,108,108,111,119,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<86,97,108,117,101,83,112,101,99>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,119,104,105,99,104,32,99,97,112,116,117,114,101,100,32,40,115,117,98,41,112,97,116,116,101,114,110,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32>>,{code,[],[<<86,97,108,117,101,83,112,101,99>>]},<<32,99,97,110,32,101,105,116,104,101,114,32,98,101,32,97,110,32,97,116,111,109,32,100,101,115,99,114,105,98,105,110,103,32,97,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,32,111,102,32,114,101,116,117,114,110,32,118,97,108,117,101,115,44,32,111,114,32,97,32,108,105,115,116,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,105,110,100,101,120,101,115,32,111,114,32,116,104,101,32,110,97,109,101,115,32,111,102,32,115,112,101,99,105,102,105,99,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,46>>]},{p,[],[<<84,104,101,32,102,111,108,108,111,119,105,110,103,32,97,114,101,32,116,104,101,32,112,114,101,100,101,102,105,110,101,100,32,115,101,116,115,32,111,102,32,115,117,98,112,97,116,116,101,114,110,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<97,108,108>>]}]},{dd,[],[{p,[],[<<65,108,108,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<97,108,108,95,110,97,109,101,115>>]}]},{dd,[],[{p,[],[<<65,108,108,32>>,{em,[],[<<110,97,109,101,100>>]},<<32,115,117,98,112,97,116,116,101,114,110,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,115,32,105,102,32,97,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,111,102,32,97,108,108,32,116,104,101,32,110,97,109,101,115,32>>,{em,[],[<<105,110,32,97,108,112,104,97,98,101,116,105,99,97,108,32,111,114,100,101,114>>]},<<32,119,97,115,32,115,112,101,99,105,102,105,101,100,46,32,84,104,101,32,108,105,115,116,32,111,102,32,97,108,108,32,110,97,109,101,115,32,99,97,110,32,97,108,115,111,32,98,101,32,114,101,116,114,105,101,118,101,100,32,119,105,116,104,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,105,110,115,112,101,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,110,115,112,101,99,116,47,50>>]}]},<<46>>]}]},{dt,[],[{code,[],[<<102,105,114,115,116>>]}]},{dd,[],[{p,[],[<<79,110,108,121,32,116,104,101,32,102,105,114,115,116,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,44,32,119,104,105,99,104,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,46,32,65,108,108,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,100,105,115,99,97,114,100,101,100,46>>]}]},{dt,[],[{code,[],[<<97,108,108,95,98,117,116,95,102,105,114,115,116>>]}]},{dd,[],[{p,[],[<<65,108,108,32,98,117,116,32,116,104,101,32,102,105,114,115,116,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,44,32,116,104,97,116,32,105,115,44,32,97,108,108,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,44,32,98,117,116,32,110,111,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,46,32,84,104,105,115,32,105,115,32,117,115,101,102,117,108,32,105,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,115,32,97,32,119,104,111,108,101,32,109,97,116,99,104,101,115,32,97,32,108,97,114,103,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,44,32,98,117,116,32,116,104,101,32,112,97,114,116,32,121,111,117,32,97,114,101,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,32,105,110,32,97,110,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,102,32,116,104,101,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32>>,{code,[],[<<108,105,115,116>>]},<<32,111,114,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<44,32,110,111,116,32,114,101,116,117,114,110,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,121,111,117,32,97,114,101,32,110,111,116,32,105,110,116,101,114,101,115,116,101,100,32,105,110,32,105,115,32,97,32,103,111,111,100,32,119,97,121,32,116,111,32,111,112,116,105,109,105,122,101,46>>]}]},{dt,[],[{code,[],[<<110,111,110,101>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,103,105,118,101,115,32,116,104,101,32,115,105,110,103,108,101,32,97,116,111,109,32>>,{code,[],[<<109,97,116,99,104>>]},<<32,97,115,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,119,104,101,110,32,109,97,116,99,104,105,110,103,32,115,117,99,99,101,115,115,102,117,108,108,121,32,105,110,115,116,101,97,100,32,111,102,32,116,104,101,32>>,{code,[],[<<123,109,97,116,99,104,44,32,108,105,115,116,40,41,125>>]},<<32,114,101,116,117,114,110,46,32,83,112,101,99,105,102,121,105,110,103,32,97,110,32,101,109,112,116,121,32,108,105,115,116,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,98,101,104,97,118,105,111,114,46>>]}]}]},{p,[],[<<84,104,101,32,118,97,108,117,101,32,108,105,115,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,105,110,100,101,120,101,115,32,102,111,114,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,114,101,116,117,114,110,44,32,119,104,101,114,101,32,105,110,100,101,120,32,48,32,105,115,32,102,111,114,32,97,108,108,32,111,102,32,116,104,101,32,112,97,116,116,101,114,110,44,32,97,110,100,32,49,32,105,115,32,102,111,114,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,110,100,32,115,111,32,111,110,46,32,87,104,101,110,32,117,115,105,110,103,32,110,97,109,101,100,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,40,115,101,101,32,98,101,108,111,119,41,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,111,110,101,32,99,97,110,32,117,115,101,32>>,{code,[],[<<97,116,111,109,40,41>>]},<<115,32,111,114,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<115,32,116,111,32,115,112,101,99,105,102,121,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,115,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58>>]},{pre,[],[{code,[],[<<34,46,42,40,97,98,99,100,41,46,42,34>>]}]},{p,[],[<<109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,115,116,114,105,110,103,32,34,65,66,67,97,98,99,100,65,66,67,34,44,32,99,97,112,116,117,114,105,110,103,32,111,110,108,121,32,116,104,101,32,34,97,98,99,100,34,32,112,97,114,116,32,40,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,32,115,117,98,112,97,116,116,101,114,110,41,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46>>]}]},{p,[],[<<84,104,101,32,99,97,108,108,32,103,105,118,101,115,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,115,117,108,116,44,32,97,115,32,116,104,101,32,102,105,114,115,116,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,34,40,97,98,99,100,41,34,44,32,109,97,116,99,104,105,110,103,32,34,97,98,99,100,34,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,44,32,97,116,32,40,122,101,114,111,45,98,97,115,101,100,41,32,112,111,115,105,116,105,111,110,32,51,44,32,111,102,32,108,101,110,103,116,104,32,52,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,51,44,52,125,93,125>>]}]},{p,[],[<<67,111,110,115,105,100,101,114,32,116,104,101,32,115,97,109,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,119,105,116,104,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,101,120,112,108,105,99,105,116,108,121,32,110,97,109,101,100,32,39,70,79,79,39,58>>]},{pre,[],[{code,[],[<<34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34>>]}]},{p,[],[<<87,105,116,104,32,116,104,105,115,32,101,120,112,114,101,115,115,105,111,110,44,32,119,101,32,99,111,117,108,100,32,115,116,105,108,108,32,103,105,118,101,32,116,104,101,32,105,110,100,101,120,32,111,102,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,119,105,116,104,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,99,97,108,108,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,49,93,125,93,41,46>>]}]},{p,[],[<<103,105,118,105,110,103,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,98,101,102,111,114,101,46,32,66,117,116,44,32,97,115,32,116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,105,115,32,110,97,109,101,100,44,32,119,101,32,99,97,110,32,97,108,115,111,32,115,112,101,99,105,102,121,32,105,116,115,32,110,97,109,101,32,105,110,32,116,104,101,32,118,97,108,117,101,32,108,105,115,116,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,65,66,67,97,98,99,100,65,66,67,34,44,34,46,42,40,63,60,70,79,79,62,97,98,99,100,41,46,42,34,44,91,123,99,97,112,116,117,114,101,44,91,39,70,79,79,39,93,125,93,41,46>>]}]},{p,[],[<<84,104,105,115,32,119,111,117,108,100,32,103,105,118,101,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,101,97,114,108,105,101,114,32,101,120,97,109,112,108,101,115,44,32,110,97,109,101,108,121,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,51,44,52,125,93,125>>]}]},{p,[],[<<84,104,101,32,118,97,108,117,101,115,32,108,105,115,116,32,99,97,110,32,115,112,101,99,105,102,121,32,105,110,100,101,120,101,115,32,111,114,32,110,97,109,101,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,105,110,32,119,104,105,99,104,32,99,97,115,101,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,115,32,118,97,114,121,32,100,101,112,101,110,100,105,110,103,32,111,110,32,116,104,101,32,116,121,112,101,46,32,73,102,32,116,104,101,32,116,121,112,101,32,105,115,32>>,{code,[],[<<105,110,100,101,120>>]},<<44,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,45,49,44,48,125>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,102,111,114,32,118,97,108,117,101,115,32,119,105,116,104,32,110,111,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,115,117,98,112,97,116,116,101,114,110,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,98,117,116,32,102,111,114,32,116,104,101,32,111,116,104,101,114,32,116,121,112,101,115,32,40>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,97,110,100,32>>,{code,[],[<<108,105,115,116>>]},<<41,44,32,116,104,101,32,118,97,108,117,101,115,32,97,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46>>]}]},{dt,[],[{code,[],[<<84,121,112,101>>]}]},{dd,[],[{p,[],[<<79,112,116,105,111,110,97,108,108,121,32,115,112,101,99,105,102,105,101,115,32,104,111,119,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,114,101,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,73,102,32,111,109,105,116,116,101,100,44,32,116,104,101,32,100,101,102,97,117,108,116,32,111,102,32>>,{code,[],[<<105,110,100,101,120>>]},<<32,105,115,32,117,115,101,100,46>>]},{p,[],[{code,[],[<<84,121,112,101>>]},<<32,99,97,110,32,98,101,32,111,110,101,32,111,102,32,116,104,101,32,102,111,108,108,111,119,105,110,103,58>>]},{dl,[],[{dt,[],[{code,[],[<<105,110,100,101,120>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,99,97,112,116,117,114,101,100,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,112,97,105,114,115,32,111,102,32,98,121,116,101,32,105,110,100,101,120,101,115,32,105,110,116,111,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,97,110,100,32,108,101,110,103,116,104,32,111,102,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,116,114,105,110,103,32,105,110,32,116,104,101,32,115,117,98,106,101,99,116,32,40,97,115,32,105,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,97,115,32,102,108,97,116,116,101,110,101,100,32,119,105,116,104,32>>,{a,[{href,<<101,114,116,115,58,101,114,108,97,110,103,35,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,114,108,97,110,103,58,105,111,108,105,115,116,95,116,111,95,98,105,110,97,114,121,47,49>>]}]},<<32,111,114,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,35,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,98,105,110,97,114,121,47,50>>]}]},<<32,98,101,102,111,114,101,32,109,97,116,99,104,105,110,103,41,46,32,78,111,116,105,99,101,32,116,104,97,116,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,114,101,115,117,108,116,115,32,105,110,32>>,{em,[],[<<98,121,116,101,45,111,114,105,101,110,116,101,100>>]},<<32,105,110,100,101,120,101,115,32,105,110,32,97,32,40,112,111,115,115,105,98,108,121,32,118,105,114,116,117,97,108,41,32>>,{em,[],[<<85,84,70,45,56,32,101,110,99,111,100,101,100>>]},<<32,98,105,110,97,114,121,46,32,65,32,98,121,116,101,32,105,110,100,101,120,32,116,117,112,108,101,32>>,{code,[],[<<123,48,44,50,125>>]},<<32,99,97,110,32,116,104,101,114,101,102,111,114,101,32,114,101,112,114,101,115,101,110,116,32,111,110,101,32,111,114,32,116,119,111,32,99,104,97,114,97,99,116,101,114,115,32,119,104,101,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,105,110,32,101,102,102,101,99,116,46,32,84,104,105,115,32,99,97,110,32,115,101,101,109,32,99,111,117,110,116,101,114,45,105,110,116,117,105,116,105,118,101,44,32,98,117,116,32,104,97,115,32,98,101,101,110,32,100,101,101,109,101,100,32,116,104,101,32,109,111,115,116,32,101,102,102,101,99,116,105,118,101,32,97,110,100,32,117,115,101,102,117,108,32,119,97,121,32,116,111,32,100,111,32,105,116,46,32,84,111,32,114,101,116,117,114,110,32,108,105,115,116,115,32,105,110,115,116,101,97,100,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,115,105,109,112,108,101,114,32,99,111,100,101,32,105,102,32,116,104,97,116,32,105,115,32,100,101,115,105,114,101,100,46,32,84,104,105,115,32,114,101,116,117,114,110,32,116,121,112,101,32,105,115,32,116,104,101,32,100,101,102,97,117,108,116,46>>]}]},{dt,[],[{code,[],[<<108,105,115,116>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,69,114,108,97,110,103,32>>,{code,[],[<<115,116,114,105,110,103,40,41>>]},<<115,41,46,32,73,116,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,117,115,101,100,32,105,110,32,99,111,109,98,105,110,97,116,105,111,110,32,119,105,116,104,32,116,104,101,32,92,67,32,115,101,113,117,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,97,32,99,97,112,116,117,114,101,100,32,115,117,98,112,97,116,116,101,114,110,32,99,97,110,32,99,111,110,116,97,105,110,32,98,121,116,101,115,32,116,104,97,116,32,97,114,101,32,110,111,116,32,118,97,108,105,100,32,85,84,70,45,56,32,40,92,67,32,109,97,116,99,104,101,115,32,98,121,116,101,115,32,114,101,103,97,114,100,108,101,115,115,32,111,102,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,41,46,32,73,110,32,116,104,97,116,32,99,97,115,101,32,116,104,101,32>>,{code,[],[<<108,105,115,116>>]},<<32,99,97,112,116,117,114,105,110,103,32,99,97,110,32,114,101,115,117,108,116,32,105,110,32,116,104,101,32,115,97,109,101,32,116,121,112,101,115,32,111,102,32,116,117,112,108,101,115,32,116,104,97,116,32>>,{a,[{href,<<115,116,100,108,105,98,58,117,110,105,99,111,100,101,35,99,104,97,114,97,99,116,101,114,115,95,116,111,95,108,105,115,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,105,99,111,100,101,58,99,104,97,114,97,99,116,101,114,115,95,116,111,95,108,105,115,116,47,50>>]}]},<<32,99,97,110,32,114,101,116,117,114,110,44,32,110,97,109,101,108,121,32,116,104,114,101,101,45,116,117,112,108,101,115,32,119,105,116,104,32,116,97,103,32>>,{code,[],[<<105,110,99,111,109,112,108,101,116,101>>]},<<32,111,114,32>>,{code,[],[<<101,114,114,111,114>>]},<<44,32,116,104,101,32,115,117,99,99,101,115,115,102,117,108,108,121,32,99,111,110,118,101,114,116,101,100,32,99,104,97,114,97,99,116,101,114,115,32,97,110,100,32,116,104,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,32,116,97,105,108,32,111,102,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,97,115,32,97,32,98,105,110,97,114,121,46,32,84,104,101,32,98,101,115,116,32,115,116,114,97,116,101,103,121,32,105,115,32,116,111,32,97,118,111,105,100,32,117,115,105,110,103,32,116,104,101,32,92,67,32,115,101,113,117,101,110,99,101,32,119,104,101,110,32,99,97,112,116,117,114,105,110,103,32,108,105,115,116,115,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<82,101,116,117,114,110,115,32,109,97,116,99,104,105,110,103,32,115,117,98,115,116,114,105,110,103,115,32,97,115,32,98,105,110,97,114,105,101,115,46,32,73,102,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,105,115,32,117,115,101,100,44,32,116,104,101,115,101,32,98,105,110,97,114,105,101,115,32,97,114,101,32,105,110,32,85,84,70,45,56,46,32,73,102,32,116,104,101,32,92,67,32,115,101,113,117,101,110,99,101,32,105,115,32,117,115,101,100,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<44,32,116,104,101,32,98,105,110,97,114,105,101,115,32,99,97,110,32,98,101,32,105,110,118,97,108,105,100,32,85,84,70,45,56,46>>]}]}]}]}]},{p,[],[<<73,110,32,103,101,110,101,114,97,108,44,32,115,117,98,112,97,116,116,101,114,110,115,32,116,104,97,116,32,119,101,114,101,32,110,111,116,32,97,115,115,105,103,110,101,100,32,97,32,118,97,108,117,101,32,105,110,32,116,104,101,32,109,97,116,99,104,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,116,117,112,108,101,32>>,{code,[],[<<123,45,49,44,48,125>>]},<<32,119,104,101,110,32>>,{code,[],[<<116,121,112,101>>]},<<32,105,115,32>>,{code,[],[<<105,110,100,101,120>>]},<<46,32,85,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,97,115,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,111,114,32,108,105,115,116,44,32,114,101,115,112,101,99,116,105,118,101,108,121,44,32,102,111,114,32,111,116,104,101,114,32,114,101,116,117,114,110,32,116,121,112,101,115,46,32,67,111,110,115,105,100,101,114,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,58>>]},{pre,[],[{code,[],[<<34,46,42,40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41,46,42,34>>]}]},{p,[],[<<84,104,101,114,101,32,97,114,101,32,116,104,114,101,101,32,101,120,112,108,105,99,105,116,108,121,32,99,97,112,116,117,114,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,44,32,119,104,101,114,101,32,116,104,101,32,111,112,101,110,105,110,103,32,112,97,114,101,110,116,104,101,115,105,115,32,112,111,115,105,116,105,111,110,32,100,101,116,101,114,109,105,110,101,115,32,116,104,101,32,111,114,100,101,114,32,105,110,32,116,104,101,32,114,101,115,117,108,116,44,32,104,101,110,99,101,32>>,{code,[],[<<40,40,63,60,70,79,79,62,97,98,100,100,41,124,97,40,46,46,100,41,41>>]},<<32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,49,44,32>>,{code,[],[<<40,63,60,70,79,79,62,97,98,100,100,41>>]},<<32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,50,44,32,97,110,100,32>>,{code,[],[<<40,46,46,100,41>>]},<<32,105,115,32,115,117,98,112,97,116,116,101,114,110,32,105,110,100,101,120,32,51,46,32,87,104,101,110,32,109,97,116,99,104,101,100,32,97,103,97,105,110,115,116,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,115,116,114,105,110,103,58>>]},{pre,[],[{code,[],[<<34,65,66,67,97,98,99,100,65,66,67,34>>]}]},{p,[],[<<116,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,44,32,97,115,32,34,97,98,100,100,34,32,105,115,32,110,111,116,32,112,114,101,115,101,110,116,32,105,110,32,116,104,101,32,115,116,114,105,110,103,44,32,98,117,116,32,116,104,101,32,99,111,109,112,108,101,116,101,32,112,97,116,116,101,114,110,32,109,97,116,99,104,101,115,32,40,98,101,99,97,117,115,101,32,111,102,32,116,104,101,32,97,108,116,101,114,110,97,116,105,118,101,32>>,{code,[],[<<97,40,46,46,100,41>>]},<<41,46,32,84,104,101,32,115,117,98,112,97,116,116,101,114,110,32,97,116,32,105,110,100,101,120,32,50,32,105,115,32,116,104,101,114,101,102,111,114,101,32,117,110,97,115,115,105,103,110,101,100,32,97,110,100,32,116,104,101,32,100,101,102,97,117,108,116,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,123,48,44,49,48,125,44,123,51,44,52,125,44,123,45,49,44,48,125,44,123,52,44,51,125,93,125>>]}]},{p,[],[<<83,101,116,116,105,110,103,32,116,104,101,32,99,97,112,116,117,114,101,32>>,{code,[],[<<84,121,112,101>>]},<<32,116,111,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,103,105,118,101,115,58>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,60,60,34,65,66,67,97,98,99,100,65,66,67,34,62,62,44,60,60,34,97,98,99,100,34,62,62,44,60,60,62,62,44,60,60,34,98,99,100,34,62,62,93,125>>]}]},{p,[],[<<72,101,114,101,32,116,104,101,32,101,109,112,116,121,32,98,105,110,97,114,121,32,40>>,{code,[],[<<60,60,62,62>>]},<<41,32,114,101,112,114,101,115,101,110,116,115,32,116,104,101,32,117,110,97,115,115,105,103,110,101,100,32,115,117,98,112,97,116,116,101,114,110,46,32,73,110,32,116,104,101,32>>,{code,[],[<<98,105,110,97,114,121>>]},<<32,99,97,115,101,44,32,115,111,109,101,32,105,110,102,111,114,109,97,116,105,111,110,32,97,98,111,117,116,32,116,104,101,32,109,97,116,99,104,105,110,103,32,105,115,32,116,104,101,114,101,102,111,114,101,32,108,111,115,116,44,32,97,115,32>>,{code,[],[<<60,60,62,62>>]},<<32,99,97,110,32,97,108,115,111,32,98,101,32,97,110,32,101,109,112,116,121,32,115,116,114,105,110,103,32,99,97,112,116,117,114,101,100,46>>]},{p,[],[<<73,102,32,100,105,102,102,101,114,101,110,116,105,97,116,105,111,110,32,98,101,116,119,101,101,110,32,101,109,112,116,121,32,109,97,116,99,104,101,115,32,97,110,100,32,110,111,110,45,101,120,105,115,116,105,110,103,32,115,117,98,112,97,116,116,101,114,110,115,32,105,115,32,110,101,99,101,115,115,97,114,121,44,32,117,115,101,32,116,104,101,32>>,{code,[],[<<116,121,112,101>>]},<<32>>,{code,[],[<<105,110,100,101,120>>]},<<32,97,110,100,32,100,111,32,116,104,101,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,116,104,101,32,102,105,110,97,108,32,116,121,112,101,32,105,110,32,69,114,108,97,110,103,32,99,111,100,101,46>>]},{p,[],[<<87,104,101,110,32,111,112,116,105,111,110,32>>,{code,[],[<<103,108,111,98,97,108>>]},<<32,105,115,32,115,112,101,99,105,105,102,105,101,100,44,32,116,104,101,32>>,{code,[],[<<99,97,112,116,117,114,101>>]},<<32,115,112,101,99,105,102,105,99,97,116,105,111,110,32,97,102,102,101,99,116,115,32,101,97,99,104,32,109,97,116,99,104,32,115,101,112,97,114,97,116,101,108,121,44,32,115,111,32,116,104,97,116,58>>]},{pre,[],[{code,[],[<<114,101,58,114,117,110,40,34,99,97,99,98,34,44,34,99,40,97,124,98,41,34,44,91,103,108,111,98,97,108,44,123,99,97,112,116,117,114,101,44,91,49,93,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<123,109,97,116,99,104,44,91,91,34,97,34,93,44,91,34,98,34,93,93,125>>]}]}]}]},{p,[],[<<70,111,114,32,97,32,100,101,115,99,114,105,112,116,105,111,110,115,32,111,102,32,111,112,116,105,111,110,115,32,111,110,108,121,32,97,102,102,101,99,116,105,110,103,32,116,104,101,32,99,111,109,112,105,108,97,116,105,111,110,32,115,116,101,112,44,32,115,101,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,99,111,109,112,105,108,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<99,111,109,112,105,108,101,47,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,52,49,57>>,signature => [{attribute,{76,2},spec,{{run,3},[{type,{76,10},bounded_fun,[{type,{76,10},'fun',[{type,{76,10},product,[{var,{76,11},'Subject'},{var,{76,20},'RE'},{var,{76,24},'Options'}]},{type,{76,36},union,[{type,{76,36},tuple,[{atom,{76,37},match},{var,{76,44},'Captured'}]},{atom,{77,36},match},{atom,{78,36},nomatch},{type,{79,8},tuple,[{atom,{79,9},error},{var,{79,16},'ErrType'}]}]}]},[{type,{80,7},constraint,[{atom,{80,7},is_subtype},[{var,{80,7},'Subject'},{type,{80,18},union,[{type,{80,18},iodata,[]},{remote_type,{80,29},[{atom,{80,29},unicode},{atom,{80,37},charlist},[]]}]}]]},{type,{81,7},constraint,[{atom,{81,7},is_subtype},[{var,{81,7},'RE'},{type,{81,13},union,[{user_type,{81,13},mp,[]},{type,{81,20},iodata,[]},{remote_type,{81,31},[{atom,{81,31},unicode},{atom,{81,39},charlist},[]]}]}]]},{type,{82,7},constraint,[{atom,{82,7},is_subtype},[{var,{82,7},'Options'},{type,{82,18},list,[{var,{82,19},'Option'}]}]]},{type,{83,7},constraint,[{atom,{83,7},is_subtype},[{var,{83,7},'Option'},{type,{83,17},union,[{atom,{83,17},anchored},{atom,{83,28},global},{atom,{83,37},notbol},{atom,{83,46},noteol},{atom,{83,55},notempty},{atom,{84,10},notempty_atstart},{atom,{84,29},report_errors},{type,{85,17},tuple,[{atom,{85,18},offset},{type,{85,26},non_neg_integer,[]}]},{type,{86,3},tuple,[{atom,{86,4},match_limit},{type,{86,17},non_neg_integer,[]}]},{type,{87,3},tuple,[{atom,{87,4},match_limit_recursion},{type,{87,27},non_neg_integer,[]}]},{type,{88,17},tuple,[{atom,{88,18},newline},{ann_type,{88,27},[{var,{88,27},'NLSpec'},{user_type,{88,37},nl_spec,[]}]}]},{atom,{89,17},bsr_anycrlf},{atom,{89,31},bsr_unicode},{type,{89,45},tuple,[{atom,{89,46},capture},{var,{89,55},'ValueSpec'}]},{type,{90,17},tuple,[{atom,{90,18},capture},{var,{90,27},'ValueSpec'},{var,{90,38},'Type'}]},{var,{90,46},'CompileOpt'}]}]]},{type,{91,7},constraint,[{atom,{91,7},is_subtype},[{var,{91,7},'Type'},{type,{91,15},union,[{atom,{91,15},index},{atom,{91,23},list},{atom,{91,30},binary}]}]]},{type,{92,7},constraint,[{atom,{92,7},is_subtype},[{var,{92,7},'ValueSpec'},{type,{92,20},union,[{atom,{92,20},all},{atom,{92,26},all_but_first},{atom,{92,42},all_names},{atom,{92,54},first},{atom,{92,62},none},{var,{92,69},'ValueList'}]}]]},{type,{93,7},constraint,[{atom,{93,7},is_subtype},[{var,{93,7},'ValueList'},{type,{93,20},list,[{var,{93,21},'ValueID'}]}]]},{type,{94,7},constraint,[{atom,{94,7},is_subtype},[{var,{94,7},'ValueID'},{type,{94,18},union,[{type,{94,18},integer,[]},{type,{94,30},string,[]},{type,{94,41},atom,[]}]}]]},{type,{95,7},constraint,[{atom,{95,7},is_subtype},[{var,{95,7},'CompileOpt'},{user_type,{95,21},compile_option,[]}]]},{type,{96,7},constraint,[{atom,{96,7},is_subtype},[{var,{96,7},'Captured'},{type,{96,19},union,[{type,{96,19},list,[{var,{96,20},'CaptureData'}]},{type,{96,35},list,[{type,{96,36},list,[{var,{96,37},'CaptureData'}]}]}]}]]},{type,{97,7},constraint,[{atom,{97,7},is_subtype},[{var,{97,7},'CaptureData'},{type,{97,22},union,[{type,{97,22},tuple,[{type,{97,23},integer,[]},{type,{97,34},integer,[]}]},{var,{98,22},'ListConversionData'},{type,{99,22},binary,[]}]}]]},{type,{100,7},constraint,[{atom,{100,7},is_subtype},[{var,{100,7},'ListConversionData'},{type,{100,29},union,[{type,{100,29},string,[]},{type,{101,29},tuple,[{atom,{101,30},error},{type,{101,37},string,[]},{type,{101,47},binary,[]}]},{type,{102,29},tuple,[{atom,{102,30},incomplete},{type,{102,42},string,[]},{type,{102,52},binary,[]}]}]}]]},{type,{103,7},constraint,[{atom,{103,7},is_subtype},[{var,{103,7},'ErrType'},{type,{103,18},union,[{atom,{103,18},match_limit},{atom,{103,32},match_limit_recursion},{type,{103,56},tuple,[{atom,{103,57},compile},{var,{103,67},'CompileErr'}]}]}]]},{type,{104,7},constraint,[{atom,{104,7},is_subtype},[{var,{104,7},'CompileErr'},{type,{104,21},tuple,[{ann_type,{104,22},[{var,{104,22},'ErrString'},{type,{104,35},string,[]}]},{ann_type,{104,45},[{var,{104,45},'Position'},{type,{104,57},non_neg_integer,[]}]}]}]]}]]}]}}]}},{{function,split,2},[{file,[114,101,46,101,114,108]},{location,153}],[<<115,112,108,105,116,47,50>>],#{<<101,110>> => [{p,[],[<<83,97,109,101,32,97,115,32>>,{code,[],[<<115,112,108,105,116,40,83,117,98,106,101,99,116,44,32,82,69,44,32,91,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,57,57,52>>,signature => [{attribute,{153,2},spec,{{split,2},[{type,{153,12},bounded_fun,[{type,{153,12},'fun',[{type,{153,12},product,[{var,{153,13},'Subject'},{var,{153,22},'RE'}]},{var,{153,29},'SplitList'}]},[{type,{154,7},constraint,[{atom,{154,7},is_subtype},[{var,{154,7},'Subject'},{type,{154,18},union,[{type,{154,18},iodata,[]},{remote_type,{154,29},[{atom,{154,29},unicode},{atom,{154,37},charlist},[]]}]}]]},{type,{155,7},constraint,[{atom,{155,7},is_subtype},[{var,{155,7},'RE'},{type,{155,13},union,[{user_type,{155,13},mp,[]},{type,{155,20},iodata,[]}]}]]},{type,{156,7},constraint,[{atom,{156,7},is_subtype},[{var,{156,7},'SplitList'},{type,{156,20},list,[{type,{156,21},union,[{type,{156,21},iodata,[]},{remote_type,{156,32},[{atom,{156,32},unicode},{atom,{156,40},charlist},[]]}]}]}]]}]]}]}}]}},{{function,split,3},[{file,[114,101,46,101,114,108]},{location,166}],[<<115,112,108,105,116,47,51>>],#{<<101,110>> => [{p,[],[<<83,112,108,105,116,115,32,116,104,101,32,105,110,112,117,116,32,105,110,116,111,32,112,97,114,116,115,32,98,121,32,102,105,110,100,105,110,103,32,116,111,107,101,110,115,32,97,99,99,111,114,100,105,110,103,32,116,111,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,115,117,112,112,108,105,101,100,46,32,84,104,101,32,115,112,108,105,116,116,105,110,103,32,105,115,32,98,97,115,105,99,97,108,108,121,32,100,111,110,101,32,98,121,32,114,117,110,110,105,110,103,32,97,32,103,108,111,98,97,108,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,32,97,110,100,32,100,105,118,105,100,105,110,103,32,116,104,101,32,105,110,105,116,105,97,108,32,115,116,114,105,110,103,32,119,104,101,114,101,118,101,114,32,97,32,109,97,116,99,104,32,111,99,99,117,114,115,46,32,84,104,101,32,109,97,116,99,104,105,110,103,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,105,115,32,114,101,109,111,118,101,100,32,102,114,111,109,32,116,104,101,32,111,117,116,112,117,116,46>>]},{p,[],[<<65,115,32,105,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,114,101,35,114,117,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,117,110,47,51>>]}]},<<44,32,97,110,32>>,{code,[],[<<109,112,40,41>>]},<<32,99,111,109,112,105,108,101,100,32,119,105,116,104,32,111,112,116,105,111,110,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,114,101,113,117,105,114,101,115,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,116,111,32,98,101,32,97,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<46,32,73,102,32,99,111,109,112,105,108,97,116,105,111,110,32,105,115,32,100,111,110,101,32,105,109,112,108,105,99,105,116,108,121,32,97,110,100,32,116,104,101,32>>,{code,[],[<<117,110,105,99,111,100,101>>]},<<32,99,111,109,112,105,108,97,116,105,111,110,32,111,112,116,105,111,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,116,111,32,116,104,105,115,32,102,117,110,99,116,105,111,110,44,32,98,111,116,104,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,97,110,100,32>>,{code,[],[<<83,117,98,106,101,99,116>>]},<<32,97,114,101,32,116,111,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,118,97,108,105,100,32,85,110,105,99,111,100,101,32>>,{code,[],[<<99,104,97,114,108,105,115,116,40,41>>]},<<115,46>>]},{p,[],[<<84,104,101,32,114,101,115,117,108,116,32,105,115,32,103,105,118,101,110,32,97,115,32,97,32,108,105,115,116,32,111,102,32,34,115,116,114,105,110,103,115,34,44,32,116,104,101,32,112,114,101,102,101,114,114,101,100,32,100,97,116,97,32,116,121,112,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,111,112,116,105,111,110,32>>,{code,[],[<<114,101,116,117,114,110>>]},<<32,40,100,101,102,97,117,108,116,32>>,{code,[],[<<105,111,100,97,116,97>>]},<<41,46>>]},{p,[],[<<73,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,115,112,101,99,105,102,105,101,100,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,44,32,116,104,101,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,114,101,116,117,114,110,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,105,110,103,32,108,105,115,116,32,97,115,32,119,101,108,108,46,32,70,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,110,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,34,44,34,103,34,93>>]}]},{p,[],[<<119,104,105,108,101>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,108,34,44,34,97,34,44,34,110,34,44,34,103,34,93>>]}]},{p,[],[<<84,104,101,32,116,101,120,116,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,109,97,114,107,101,100,32,98,121,32,116,104,101,32,112,97,114,101,110,116,104,101,115,101,115,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,41,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,119,104,101,114,101,32,105,116,32,119,97,115,32,102,111,117,110,100,46,32,84,104,105,115,32,109,101,97,110,115,32,116,104,97,116,32,99,111,110,99,97,116,101,110,97,116,105,110,103,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,32,115,112,108,105,116,32,119,104,101,114,101,32,116,104,101,32,119,104,111,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,105,115,32,97,32,115,105,110,103,108,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,40,97,115,32,105,110,32,116,104,101,32,108,97,115,116,32,101,120,97,109,112,108,101,41,32,97,108,119,97,121,115,32,114,101,115,117,108,116,115,32,105,110,32,116,104,101,32,111,114,105,103,105,110,97,108,32,115,116,114,105,110,103,46>>]},{p,[],[<<65,115,32,116,104,101,114,101,32,105,115,32,110,111,32,109,97,116,99,104,105,110,103,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,102,111,114,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,110,32,116,104,101,32,101,120,97,109,112,108,101,32,40,116,104,101,32,34,103,34,41,44,32,110,111,116,104,105,110,103,32,105,115,32,105,110,115,101,114,116,101,100,32,97,102,116,101,114,32,116,104,97,116,46,32,84,111,32,109,97,107,101,32,116,104,101,32,103,114,111,117,112,32,111,102,32,115,116,114,105,110,103,115,32,97,110,100,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,111,114,101,32,111,98,118,105,111,117,115,44,32,111,110,101,32,99,97,110,32,117,115,101,32,111,112,116,105,111,110,32>>,{code,[],[<<103,114,111,117,112>>]},<<44,32,119,104,105,99,104,32,103,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,119,104,101,110,32,116,104,101,32,115,116,114,105,110,103,32,119,97,115,32,115,112,108,105,116,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,40,91,108,110,93,41,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,103,114,111,117,112,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,91,34,69,114,34,44,34,108,34,93,44,91,34,97,34,44,34,110,34,93,44,91,34,103,34,93,93>>]}]},{p,[],[<<72,101,114,101,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,102,105,114,115,116,32,109,97,116,99,104,101,100,32,116,104,101,32,34,108,34,44,32,99,97,117,115,105,110,103,32,34,69,114,34,32,116,111,32,98,101,32,116,104,101,32,102,105,114,115,116,32,112,97,114,116,32,105,110,32,116,104,101,32,114,101,115,117,108,116,46,32,87,104,101,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,109,97,116,99,104,101,100,44,32,116,104,101,32,40,111,110,108,121,41,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,119,97,115,32,98,111,117,110,100,32,116,111,32,116,104,101,32,34,108,34,44,32,115,111,32,116,104,101,32,34,108,34,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,32,116,104,101,32,103,114,111,117,112,32,116,111,103,101,116,104,101,114,32,119,105,116,104,32,34,69,114,34,46,32,84,104,101,32,110,101,120,116,32,109,97,116,99,104,32,105,115,32,111,102,32,116,104,101,32,34,110,34,44,32,109,97,107,105,110,103,32,34,97,34,32,116,104,101,32,110,101,120,116,32,112,97,114,116,32,116,111,32,98,101,32,114,101,116,117,114,110,101,100,46,32,65,115,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,32,105,115,32,98,111,117,110,100,32,116,111,32,115,117,98,115,116,114,105,110,103,32,34,110,34,32,105,110,32,116,104,105,115,32,99,97,115,101,44,32,116,104,101,32,34,110,34,32,105,115,32,105,110,115,101,114,116,101,100,32,105,110,116,111,32,116,104,105,115,32,103,114,111,117,112,46,32,84,104,101,32,108,97,115,116,32,103,114,111,117,112,32,99,111,110,115,105,115,116,115,32,111,102,32,116,104,101,32,114,101,109,97,105,110,105,110,103,32,115,116,114,105,110,103,44,32,97,115,32,110,111,32,109,111,114,101,32,109,97,116,99,104,101,115,32,97,114,101,32,102,111,117,110,100,46>>]},{p,[],[<<66,121,32,100,101,102,97,117,108,116,44,32,97,108,108,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,44,32,105,110,99,108,117,100,105,110,103,32,116,104,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,44,32,97,114,101,32,114,101,116,117,114,110,101,100,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,44,32,102,111,114,32,101,120,97,109,112,108,101,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,110,34,44,91,93,93>>]}]},{p,[],[<<97,115,32,116,104,101,32,109,97,116,99,104,105,110,103,32,111,102,32,116,104,101,32,34,103,34,32,105,110,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,108,101,97,118,101,115,32,97,110,32,101,109,112,116,121,32,114,101,115,116,44,32,119,104,105,99,104,32,105,115,32,97,108,115,111,32,114,101,116,117,114,110,101,100,46,32,84,104,105,115,32,98,101,104,97,118,105,111,114,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32,115,112,108,105,116,32,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,44,32,119,104,101,114,101,32,101,109,112,116,121,32,115,116,114,105,110,103,115,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,98,121,32,100,101,102,97,117,108,116,32,114,101,109,111,118,101,100,46,32,84,111,32,103,101,116,32,116,104,101,32,34,116,114,105,109,109,105,110,103,34,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,80,101,114,108,44,32,115,112,101,99,105,102,121,32>>,{code,[],[<<116,114,105,109>>]},<<32,97,115,32,97,110,32,111,112,116,105,111,110,58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,116,114,105,109,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,110,34,93>>]}]},{p,[],[<<84,104,101,32,34,116,114,105,109,34,32,111,112,116,105,111,110,32,115,97,121,115,59,32,34,103,105,118,101,32,109,101,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,101,120,99,101,112,116,32,116,104,101,32,101,109,112,116,121,32,111,110,101,115,34,44,32,119,104,105,99,104,32,115,111,109,101,116,105,109,101,115,32,99,97,110,32,98,101,32,117,115,101,102,117,108,46,32,89,111,117,32,99,97,110,32,97,108,115,111,32,115,112,101,99,105,102,121,32,104,111,119,32,109,97,110,121,32,112,97,114,116,115,32,121,111,117,32,119,97,110,116,44,32,98,121,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,112,97,114,116,115,44>>]},<<78>>,{code,[],[<<125>>]},<<58>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,50,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115>>]},{pre,[],[{code,[],[<<91,34,69,114,34,44,34,97,110,103,34,93>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32,116,104,101,32,108,97,115,116,32,112,97,114,116,32,105,115,32,34,97,110,103,34,44,32,110,111,116,32,34,97,110,34,44,32,97,115,32,115,112,108,105,116,116,105,110,103,32,119,97,115,32,115,112,101,99,105,102,105,101,100,32,105,110,116,111,32,116,119,111,32,112,97,114,116,115,44,32,97,110,100,32,116,104,101,32,115,112,108,105,116,116,105,110,103,32,115,116,111,112,115,32,119,104,101,110,32,101,110,111,117,103,104,32,112,97,114,116,115,32,97,114,101,32,103,105,118,101,110,44,32,119,104,105,99,104,32,105,115,32,119,104,121,32,116,104,101,32,114,101,115,117,108,116,32,100,105,102,102,101,114,115,32,102,114,111,109,32,116,104,97,116,32,111,102,32>>,{code,[],[<<116,114,105,109>>]},<<46>>]},{p,[],[<<77,111,114,101,32,116,104,97,110,32,116,104,114,101,101,32,112,97,114,116,115,32,97,114,101,32,110,111,116,32,112,111,115,115,105,98,108,101,32,119,105,116,104,32,116,104,105,115,32,105,110,100,97,116,97,44,32,115,111>>]},{pre,[],[{code,[],[<<114,101,58,115,112,108,105,116,40,34,69,114,108,97,110,103,34,44,34,91,108,103,93,34,44,91,123,114,101,116,117,114,110,44,108,105,115,116,125,44,123,112,97,114,116,115,44,52,125,93,41,46>>]}]},{p,[],[<<103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,114,101,115,117,108,116,32,97,115,32,116,104,101,32,100,101,102,97,117,108,116,44,32,119,104,105,99,104,32,105,115,32,116,111,32,98,101,32,118,105,101,119,101,100,32,97,115,32,34,97,110,32,105,110,102,105,110,105,116,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,34,46>>]},{p,[],[<<83,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<48>>]},<<32,97,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,103,105,118,101,115,32,116,104,101,32,115,97,109,101,32,101,102,102,101,99,116,32,97,115,32,111,112,116,105,111,110,32>>,{code,[],[<<116,114,105,109>>]},<<46,32,73,102,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,97,114,101,32,99,97,112,116,117,114,101,100,44,32,101,109,112,116,121,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,109,97,116,99,104,101,100,32,97,116,32,116,104,101,32,101,110,100,32,97,114,101,32,97,108,115,111,32,115,116,114,105,112,112,101,100,32,102,114,111,109,32,116,104,101,32,114,101,115,117,108,116,32,105,102,32>>,{code,[],[<<116,114,105,109>>]},<<32,111,114,32>>,{code,[],[<<123,112,97,114,116,115,44,48,125>>]},<<32,105,115,32,115,112,101,99,105,102,105,101,100,46>>]},{p,[],[<<84,104,101,32>>,{code,[],[<<116,114,105,109>>]},<<32,98,101,104,97,118,105,111,114,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,100,101,102,97,117,108,116,46,32>>,{code,[],[<<123,112,97,114,116,115,44,78,125>>]},<<44,32,119,104,101,114,101,32,78,32,105,115,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,44,32,99,111,114,114,101,115,112,111,110,100,115,32,101,120,97,99,116,108,121,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,105,116,104,32,97,32,112,111,115,105,116,105,118,101,32,110,117,109,101,114,105,99,97,108,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,46,32,84,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32>>,{code,[],[<<115,112,108,105,116,47,51>>]},<<32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,80,101,114,108,32,98,101,104,97,118,105,111,114,32,119,104,101,110,32,97,32,110,101,103,97,116,105,118,101,32,105,110,116,101,103,101,114,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,116,104,101,32,116,104,105,114,100,32,112,97,114,97,109,101,116,101,114,32,102,111,114,32,116,104,101,32,80,101,114,108,32,114,111,117,116,105,110,101,46>>]},{p,[],[<<83,117,109,109,97,114,121,32,111,102,32,111,112,116,105,111,110,115,32,110,111,116,32,112,114,101,118,105,111,117,115,108,121,32,100,101,115,99,114,105,98,101,100,32,102,111,114,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<114,117,110,47,51>>]},<<58>>]},{dl,[],[{dt,[],[{code,[],[<<123,114,101,116,117,114,110,44,82,101,116,117,114,110,84,121,112,101,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,104,111,119,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,111,114,105,103,105,110,97,108,32,115,116,114,105,110,103,32,97,114,101,32,112,114,101,115,101,110,116,101,100,32,105,110,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,46,32,86,97,108,105,100,32,116,121,112,101,115,58>>]},{dl,[],[{dt,[],[{code,[],[<<105,111,100,97,116,97>>]}]},{dd,[],[{p,[],[<<84,104,101,32,118,97,114,105,97,110,116,32,111,102,32>>,{code,[],[<<105,111,100,97,116,97,40,41>>]},<<32,116,104,97,116,32,103,105,118,101,115,32,116,104,101,32,108,101,97,115,116,32,99,111,112,121,105,110,103,32,111,102,32,100,97,116,97,32,119,105,116,104,32,116,104,101,32,99,117,114,114,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,40,111,102,116,101,110,32,97,32,98,105,110,97,114,121,44,32,98,117,116,32,100,111,32,110,111,116,32,100,101,112,101,110,100,32,111,110,32,105,116,41,46>>]}]},{dt,[],[{code,[],[<<98,105,110,97,114,121>>]}]},{dd,[],[{p,[],[<<65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,98,105,110,97,114,105,101,115,46>>]}]},{dt,[],[{code,[],[<<108,105,115,116>>]}]},{dd,[],[{p,[],[<<65,108,108,32,112,97,114,116,115,32,114,101,116,117,114,110,101,100,32,97,115,32,108,105,115,116,115,32,111,102,32,99,104,97,114,97,99,116,101,114,115,32,40,34,115,116,114,105,110,103,115,34,41,46>>]}]}]}]},{dt,[],[{code,[],[<<103,114,111,117,112>>]}]},{dd,[],[{p,[],[<<71,114,111,117,112,115,32,116,111,103,101,116,104,101,114,32,116,104,101,32,112,97,114,116,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,119,105,116,104,32,116,104,101,32,112,97,114,116,115,32,111,102,32,116,104,101,32,115,116,114,105,110,103,32,109,97,116,99,104,105,110,103,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,111,102,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]},{p,[],[<<84,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,102,114,111,109,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,105,110,32,116,104,105,115,32,99,97,115,101,32,97,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<32,111,102,32>>,{code,[],[<<108,105,115,116,40,41>>]},<<115,46,32,69,97,99,104,32,115,117,98,108,105,115,116,32,98,101,103,105,110,115,32,119,105,116,104,32,116,104,101,32,115,116,114,105,110,103,32,112,105,99,107,101,100,32,111,117,116,32,111,102,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,44,32,102,111,108,108,111,119,101,100,32,98,121,32,116,104,101,32,112,97,114,116,115,32,109,97,116,99,104,105,110,103,32,101,97,99,104,32,111,102,32,116,104,101,32,115,117,98,101,120,112,114,101,115,115,105,111,110,115,32,105,110,32,111,114,100,101,114,32,111,102,32,111,99,99,117,114,114,101,110,99,101,32,105,110,32,116,104,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46>>]}]},{dt,[],[{code,[],[<<123,112,97,114,116,115,44,78,125>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,116,104,101,32,115,117,98,106,101,99,116,32,115,116,114,105,110,103,32,105,115,32,116,111,32,98,101,32,115,112,108,105,116,32,105,110,116,111,46>>]},{p,[],[<<84,104,101,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,105,115,32,116,111,32,98,101,32,97,32,112,111,115,105,116,105,118,101,32,105,110,116,101,103,101,114,32,102,111,114,32,97,32,115,112,101,99,105,102,105,99,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,44,32,97,110,100,32>>,{code,[],[<<105,110,102,105,110,105,116,121>>]},<<32,102,111,114,32,116,104,101,32,109,97,120,105,109,117,109,32,110,117,109,98,101,114,32,111,102,32,112,97,114,116,115,32,112,111,115,115,105,98,108,101,32,40,116,104,101,32,100,101,102,97,117,108,116,41,46,32,83,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,112,97,114,116,115,44,48,125>>]},<<32,103,105,118,101,115,32,97,115,32,109,97,110,121,32,112,97,114,116,115,32,97,115,32,112,111,115,115,105,98,108,101,32,100,105,115,114,101,103,97,114,100,105,110,103,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,44,32,116,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<116,114,105,109>>]},<<46>>]}]},{dt,[],[{code,[],[<<116,114,105,109>>]}]},{dd,[],[{p,[],[<<83,112,101,99,105,102,105,101,115,32,116,104,97,116,32,101,109,112,116,121,32,112,97,114,116,115,32,97,116,32,116,104,101,32,101,110,100,32,111,102,32,116,104,101,32,114,101,115,117,108,116,32,108,105,115,116,32,97,114,101,32,116,111,32,98,101,32,100,105,115,114,101,103,97,114,100,101,100,46,32,84,104,101,32,115,97,109,101,32,97,115,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,112,97,114,116,115,44,48,125>>]},<<46,32,84,104,105,115,32,99,111,114,114,101,115,112,111,110,100,115,32,116,111,32,116,104,101,32,100,101,102,97,117,108,116,32,98,101,104,97,118,105,111,114,32,111,102,32,116,104,101,32>>,{code,[],[<<115,112,108,105,116>>]},<<32,98,117,105,108,116,45,105,110,32,102,117,110,99,116,105,111,110,32,105,110,32,80,101,114,108,46>>]}]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,114,101,46,120,109,108,35,76,49,48,48,51>>,signature => [{attribute,{166,2},spec,{{split,3},[{type,{166,12},bounded_fun,[{type,{166,12},'fun',[{type,{166,12},product,[{var,{166,13},'Subject'},{var,{166,22},'RE'},{var,{166,26},'Options'}]},{var,{166,38},'SplitList'}]},[{type,{167,7},constraint,[{atom,{167,7},is_subtype},[{var,{167,7},'Subject'},{type,{167,18},union,[{type,{167,18},iodata,[]},{remote_type,{167,29},[{atom,{167,29},unicode},{atom,{167,37},charlist},[]]}]}]]},{type,{168,7},constraint,[{atom,{168,7},is_subtype},[{var,{168,7},'RE'},{type,{168,13},union,[{user_type,{168,13},mp,[]},{type,{168,20},iodata,[]},{remote_type,{168,31},[{atom,{168,31},unicode},{atom,{168,39},charlist},[]]}]}]]},{type,{169,7},constraint,[{atom,{169,7},is_subtype},[{var,{169,7},'Options'},{type,{169,18},list,[{var,{169,20},'Option'}]}]]},{type,{170,7},constraint,[{atom,{170,7},is_subtype},[{var,{170,7},'Option'},{type,{170,17},union,[{atom,{170,17},anchored},{atom,{170,28},notbol},{atom,{170,37},noteol},{atom,{170,46},notempty},{atom,{170,57},notempty_atstart},{type,{171,17},tuple,[{atom,{171,18},offset},{type,{171,26},non_neg_integer,[]}]},{type,{171,47},tuple,[{atom,{171,48},newline},{user_type,{171,57},nl_spec,[]}]},{type,{172,17},tuple,[{atom,{172,18},match_limit},{type,{172,31},non_neg_integer,[]}]},{type,{173,17},tuple,[{atom,{173,18},match_limit_recursion},{type,{173,41},non_neg_integer,[]}]},{atom,{174,17},bsr_anycrlf},{atom,{174,31},bsr_unicode},{type,{174,45},tuple,[{atom,{174,46},return},{var,{174,54},'ReturnType'}]},{type,{175,17},tuple,[{atom,{175,18},parts},{var,{175,25},'NumParts'}]},{atom,{175,37},group},{atom,{175,45},trim},{var,{175,52},'CompileOpt'}]}]]},{type,{176,7},constraint,[{atom,{176,7},is_subtype},[{var,{176,7},'NumParts'},{type,{176,19},union,[{type,{176,19},non_neg_integer,[]},{atom,{176,39},infinity}]}]]},{type,{177,7},constraint,[{atom,{177,7},is_subtype},[{var,{177,7},'ReturnType'},{type,{177,21},union,[{atom,{177,21},iodata},{atom,{177,30},list},{atom,{177,37},binary}]}]]},{type,{178,7},constraint,[{atom,{178,7},is_subtype},[{var,{178,7},'CompileOpt'},{user_type,{178,21},compile_option,[]}]]},{type,{179,7},constraint,[{atom,{179,7},is_subtype},[{var,{179,7},'SplitList'},{type,{179,20},union,[{type,{179,20},list,[{var,{179,21},'RetData'}]},{type,{179,32},list,[{var,{179,33},'GroupedRetData'}]}]}]]},{type,{180,7},constraint,[{atom,{180,7},is_subtype},[{var,{180,7},'GroupedRetData'},{type,{180,25},list,[{var,{180,26},'RetData'}]}]]},{type,{181,7},constraint,[{atom,{181,7},is_subtype},[{var,{181,7},'RetData'},{type,{181,18},union,[{type,{181,18},iodata,[]},{remote_type,{181,29},[{atom,{181,29},unicode},{atom,{181,37},charlist},[]]},{type,{181,50},binary,[]},{type,{181,61},list,[]}]}]]}]]}]}}]}},{{type,mp,0},[{file,[114,101,46,101,114,108]},{location,23}],[<<45,116,121,112,101,32,109,112,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<79,112,97,113,117,101,32,100,97,116,97,32,116,121,112,101,32,99,111,110,116,97,105,110,105,110,103,32,97,32,99,111,109,112,105,108,101,100,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,46,32>>,{code,[],[<<109,112,40,41>>]},<<32,105,115,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,97,32,116,117,112,108,101,40,41,32,104,97,118,105,110,103,32,116,104,101,32,97,116,111,109,32>>,{code,[],[<<114,101,95,112,97,116,116,101,114,110>>]},<<32,97,115,32,105,116,115,32,102,105,114,115,116,32,101,108,101,109,101,110,116,44,32,116,111,32,97,108,108,111,119,32,102,111,114,32,109,97,116,99,104,105,110,103,32,105,110,32,103,117,97,114,100,115,46,32,84,104,101,32,97,114,105,116,121,32,111,102,32,116,104,101,32,116,117,112,108,101,32,111,114,32,116,104,101,32,99,111,110,116,101,110,116,32,111,102,32,116,104,101,32,111,116,104,101,114,32,102,105,101,108,100,115,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,69,114,108,97,110,103,47,79,84,80,32,114,101,108,101,97,115,101,115,46>>]}]},#{signature => [{attribute,{23,2},type,{mp,{type,{23,15},tuple,[{atom,{23,16},re_pattern},{var,{23,28},'_'},{var,{23,31},'_'},{var,{23,34},'_'},{var,{23,37},'_'}]},[]}}]}},{{type,nl_spec,0},[{file,[114,101,46,101,114,108]},{location,25}],[<<45,116,121,112,101,32,110,108,95,115,112,101,99,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{25,2},type,{nl_spec,{type,{25,20},union,[{atom,{25,20},cr},{atom,{25,25},crlf},{atom,{25,32},lf},{atom,{25,37},anycrlf},{atom,{25,47},any}]},[]}}]}},{{type,compile_option,0},[{file,[114,101,46,101,114,108]},{location,27}],[<<45,116,121,112,101,32,99,111,109,112,105,108,101,95,111,112,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{27,2},type,{compile_option,{type,{27,27},union,[{atom,{27,27},unicode},{atom,{27,37},anchored},{atom,{27,48},caseless},{atom,{27,59},dollar_endonly},{atom,{28,27},dotall},{atom,{28,36},extended},{atom,{28,47},firstline},{atom,{28,59},multiline},{atom,{29,27},no_auto_capture},{atom,{29,45},dupnames},{atom,{29,56},ungreedy},{type,{30,27},tuple,[{atom,{30,28},newline},{user_type,{30,37},nl_spec,[]}]},{atom,{31,27},bsr_anycrlf},{atom,{31,41},bsr_unicode},{atom,{32,27},no_start_optimize},{atom,{32,47},ucp},{atom,{32,53},never_utf}]},[]}}]}}]}. \ No newline at end of file
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v1
new file mode 100644
index 0000000000..4c3f53de9d
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/shell_docs_SUITE.docs_v1
@@ -0,0 +1 @@
+{docs_v1,0,erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,none,#{generated => true,otp_doc_vsn => {1,0,0}},[{{function,suite,0},{32,1},[<<115,117,105,116,101,47,48>>],none,#{}},{{function,all,0},{35,1},[<<97,108,108,47,48>>],none,#{}},{{function,groups,0},{38,1},[<<103,114,111,117,112,115,47,48>>],none,#{}},{{function,init_per_suite,1},{46,1},[<<105,110,105,116,95,112,101,114,95,115,117,105,116,101,47,49>>],none,#{signature => [{attribute,{43,2},spec,{{init_per_suite,1},[{type,{43,21},bounded_fun,[{type,{43,21},'fun',[{type,{43,21},product,[{var,{43,22},'Config1'}]},{var,{43,34},'Config2'}]},[{type,{44,7},constraint,[{atom,{44,7},is_subtype},[{var,{44,7},'Config1'},{type,{44,18},list,[{type,{44,23},tuple,[{type,{44,24},atom,[]},{type,{44,31},term,[]}]}]}]]},{type,{45,7},constraint,[{atom,{45,7},is_subtype},[{var,{45,7},'Config2'},{type,{45,18},list,[{type,{45,23},tuple,[{type,{45,24},atom,[]},{type,{45,31},term,[]}]}]}]]}]]}]}}]}},{{function,end_per_suite,1},{50,1},[<<101,110,100,95,112,101,114,95,115,117,105,116,101,47,49>>],none,#{}},{{function,init_per_group,2},{53,1},[<<105,110,105,116,95,112,101,114,95,103,114,111,117,112,47,50>>],none,#{}},{{function,end_per_group,2},{58,1},[<<101,110,100,95,112,101,114,95,103,114,111,117,112,47,50>>],none,#{}},{{function,render,1},{76,1},[<<114,101,110,100,101,114,47,49>>],none,#{}},{{function,update_render,0},{101,1},[<<117,112,100,97,116,101,95,114,101,110,100,101,114,47,48>>],none,#{}},{{function,update_render,1},{105,1},[<<117,112,100,97,116,101,95,114,101,110,100,101,114,47,49>>],none,#{}},{{function,render_smoke,1},{122,1},[<<114,101,110,100,101,114,95,115,109,111,107,101,47,49>>],none,#{}},{{function,render_prop,1},{175,1},[<<114,101,110,100,101,114,95,112,114,111,112,47,49>>],none,#{}},{{function,links,1},{180,1},[<<108,105,110,107,115,47,49>>],none,#{}},{{function,check_links,2},{199,1},[<<99,104,101,99,107,95,108,105,110,107,115,47,50>>],none,#{}},{{function,normalize,1},{233,1},[<<110,111,114,109,97,108,105,122,101,47,49>>],none,#{}},{{function,b2a,1},{245,1},[<<98,50,97,47,49>>],none,#{}},{{function,render_non_native,1},{252,1},[<<114,101,110,100,101,114,95,110,111,110,95,110,97,116,105,118,101,47,49>>],none,#{}},{{function,render_all,1},{270,1},[<<114,101,110,100,101,114,95,97,108,108,47,49>>],none,#{}},{{function,render_module,2},{289,1},[<<114,101,110,100,101,114,95,109,111,100,117,108,101,47,50>>],none,#{}},{{function,sanitize,1},{324,1},[<<115,97,110,105,116,105,122,101,47,49>>],none,#{}},{{function,docsmap,1},{331,1},[<<100,111,99,115,109,97,112,47,49>>],none,#{}}]}. \ No newline at end of file
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/sofs.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/sofs.docs_v1
index e4a4c4cfb7..f1aecb2830 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/sofs.docs_v1
+++ b/lib/stdlib/test/shell_docs_SUITE_data/sofs.docs_v1
@@ -1 +1 @@
-{docs_v1,[{file,[115,111,102,115,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<84,104,105,115,32,109,111,100,117,108,101,32,112,114,111,118,105,100,101,115,32,111,112,101,114,97,116,105,111,110,115,32,111,110,32,102,105,110,105,116,101,32,115,101,116,115,32,97,110,100,32,114,101,108,97,116,105,111,110,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,115,101,116,115,46,32,73,110,116,117,105,116,105,118,101,108,121,44,32,97,32,115,101,116,32,105,115,32,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,101,108,101,109,101,110,116,115,59,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,98,101,108,111,110,103,115,32,116,111,32,116,104,101,32,115,101,116,44,32,97,110,100,32,116,104,101,32,115,101,116,32,99,111,110,116,97,105,110,115,32,101,118,101,114,121,32,101,108,101,109,101,110,116,46>>]},{p,[],[<<71,105,118,101,110,32,97,32,115,101,116,32,65,32,97,110,100,32,97,32,115,101,110,116,101,110,99,101,32,83,40,120,41,44,32,119,104,101,114,101,32,120,32,105,115,32,97,32,102,114,101,101,32,118,97,114,105,97,98,108,101,44,32,97,32,110,101,119,32,115,101,116,32,66,32,119,104,111,115,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,101,120,97,99,116,108,121,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,102,111,114,32,119,104,105,99,104,32,83,40,120,41,32,104,111,108,100,115,32,99,97,110,32,98,101,32,102,111,114,109,101,100,44,32,116,104,105,115,32,105,115,32,100,101,110,111,116,101,100,32,66,194,160,61,32,123,120,194,160,105,110,194,160,65,194,160,58,32,83,40,120,41,125,46,32,83,101,110,116,101,110,99,101,115,32,97,114,101,32,101,120,112,114,101,115,115,101,100,32,117,115,105,110,103,32,116,104,101,32,108,111,103,105,99,97,108,32,111,112,101,114,97,116,111,114,115,32,34,102,111,114,32,115,111,109,101,34,32,40,111,114,32,34,116,104,101,114,101,32,101,120,105,115,116,115,34,41,44,32,34,102,111,114,32,97,108,108,34,44,32,34,97,110,100,34,44,32,34,111,114,34,44,32,34,110,111,116,34,46,32,73,102,32,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,32,97,32,115,101,116,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,101,108,101,109,101,110,116,115,32,105,115,32,107,110,111,119,110,32,40,97,115,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,99,97,115,101,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,41,44,32,116,104,105,115,32,105,115,32,100,101,110,111,116,101,100,32,66,194,160,61,32,123,120,194,160,58,32,83,40,120,41,125,46>>]},{ul,[],[{li,[],[{p,[],[<<84,104,101,32>>,{em,[],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,97,44,32,98,44,32,97,110,100,32,99,32,105,115,32,100,101,110,111,116,101,100,32,123,97,44,194,160,98,44,194,160,99,125,46,32,84,104,105,115,32,110,111,116,97,116,105,111,110,32,105,115,32,110,111,116,32,116,111,32,98,101,32,99,111,110,102,117,115,101,100,32,119,105,116,104,32,116,117,112,108,101,115,46>>]},{p,[],[<<84,104,101,32>>,{em,[],[<<111,114,100,101,114,101,100,32,112,97,105,114>>]},<<32,111,102,32,97,32,97,110,100,32,98,44,32,119,105,116,104,32,102,105,114,115,116,32>>,{em,[],[<<99,111,111,114,100,105,110,97,116,101>>]},<<32,97,32,97,110,100,32,115,101,99,111,110,100,32,99,111,111,114,100,105,110,97,116,101,32,98,44,32,105,115,32,100,101,110,111,116,101,100,32,40,97,44,194,160,98,41,46,32,65,110,32,111,114,100,101,114,101,100,32,112,97,105,114,32,105,115,32,97,110,32>>,{em,[],[<<111,114,100,101,114,101,100,32,115,101,116>>]},<<32,111,102,32,116,119,111,32,101,108,101,109,101,110,116,115,46,32,73,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,100,101,114,101,100,32,115,101,116,115,32,99,97,110,32,99,111,110,116,97,105,110,32,111,110,101,44,32,116,119,111,44,32,111,114,32,109,111,114,101,32,101,108,101,109,101,110,116,115,44,32,97,110,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,101,110,99,108,111,115,101,32,116,104,101,32,101,108,101,109,101,110,116,115,46>>]},{p,[],[<<85,110,111,114,100,101,114,101,100,32,115,101,116,115,32,97,110,100,32,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,111,114,116,104,111,103,111,110,97,108,44,32,97,103,97,105,110,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,59,32,116,104,101,114,101,32,105,115,32,110,111,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,101,113,117,97,108,32,116,111,32,97,110,121,32,111,114,100,101,114,101,100,32,115,101,116,46>>]}]},{li,[],[{p,[],[<<84,104,101,32>>,{em,[],[<<101,109,112,116,121,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,115,32,110,111,32,101,108,101,109,101,110,116,115,46>>]},{p,[],[<<83,101,116,32,65,32,105,115,32>>,{a,[{id,<<101,113,117,97,108>>}],[]},{em,[],[<<101,113,117,97,108>>]},<<32,116,111,32,115,101,116,32,66,32,105,102,32,116,104,101,121,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32,101,108,101,109,101,110,116,115,44,32,119,104,105,99,104,32,105,115,32,100,101,110,111,116,101,100,32,65,194,160,61,194,160,66,46,32,84,119,111,32,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,101,113,117,97,108,32,105,102,32,116,104,101,121,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,97,110,100,32,104,97,118,101,32,101,113,117,97,108,32,101,108,101,109,101,110,116,115,32,97,116,32,101,97,99,104,32,99,111,111,114,100,105,110,97,116,101,46>>]},{p,[],[<<83,101,116,32,66,32,105,115,32,97,32>>,{a,[{id,<<115,117,98,115,101,116>>}],[]},{em,[],[<<115,117,98,115,101,116>>]},<<32,111,102,32,115,101,116,32,65,32,105,102,32,65,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,66,32,99,111,110,116,97,105,110,115,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<117,110,105,111,110>>}],[]},{em,[],[<<117,110,105,111,110>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,65,32,97,110,100,32,66,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,97,110,100,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,66,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<105,110,116,101,114,115,101,99,116,105,111,110>>}],[]},{em,[],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,65,32,97,110,100,32,66,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,66,46>>]},{p,[],[<<84,119,111,32,115,101,116,115,32,97,114,101,32>>,{a,[{id,<<100,105,115,106,111,105,110,116>>}],[]},{em,[],[<<100,105,115,106,111,105,110,116>>]},<<32,105,102,32,116,104,101,105,114,32,105,110,116,101,114,115,101,99,116,105,111,110,32,105,115,32,116,104,101,32,101,109,112,116,121,32,115,101,116,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<100,105,102,102,101,114,101,110,99,101>>}],[]},{em,[],[<<100,105,102,102,101,114,101,110,99,101>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,65,32,97,110,100,32,66,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,116,104,97,116,32,100,111,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32,66,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<115,121,109,109,101,116,114,105,99,95,100,105,102,102,101,114,101,110,99,101>>}],[]},{em,[],[<<115,121,109,109,101,116,114,105,99,32,100,105,102,102,101,114,101,110,99,101>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,104,111,115,101,32,101,108,101,109,101,110,116,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,101,105,116,104,101,114,32,111,102,32,116,104,101,32,116,119,111,32,115,101,116,115,44,32,98,117,116,32,110,111,116,32,98,111,116,104,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<117,110,105,111,110,95,110>>}],[]},{em,[],[<<117,110,105,111,110>>]},<<32,111,102,32,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,115,101,116,115,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,116,104,101,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,97,116,32,108,101,97,115,116,32,111,110,101,32,115,101,116,32,111,102,32,116,104,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<105,110,116,101,114,115,101,99,116,105,111,110,95,110>>}],[]},{em,[],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32,97,32,110,111,110,45,101,109,112,116,121,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,115,101,116,115,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,101,118,101,114,121,32,115,101,116,32,111,102,32,116,104,101,32,99,111,108,108,101,99,116,105,111,110,46>>]}]},{li,[],[{p,[],[<<84,104,101,32>>,{a,[{id,<<67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,88,32,97,110,100,32,89,44,32,100,101,110,111,116,101,100,32,88,194,160,195,151,194,160,89,44,32,105,115,32,116,104,101,32,115,101,116,32,123,97,194,160,58,32,97,194,160,61,32,40,120,44,194,160,121,41,32,102,111,114,32,115,111,109,101,32,120,194,160,105,110,194,160,88,32,97,110,100,32,102,111,114,32,115,111,109,101,32,121,194,160,105,110,194,160,89,125,46>>]},{p,[],[<<65,32>>,{a,[{id,<<114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<114,101,108,97,116,105,111,110>>]},<<32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,88,194,160,195,151,194,160,89,46,32,76,101,116,32,82,32,98,101,32,97,32,114,101,108,97,116,105,111,110,46,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,120,44,194,160,121,41,32,98,101,108,111,110,103,115,32,116,111,32,82,32,105,115,32,119,114,105,116,116,101,110,32,97,115,32,120,194,160,82,194,160,121,46,32,65,115,32,114,101,108,97,116,105,111,110,115,32,97,114,101,32,115,101,116,115,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,115,32,111,102,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,40,115,117,98,115,101,116,44,32,117,110,105,111,110,44,32,97,110,100,32,115,111,32,111,110,41,32,97,112,112,108,121,32,116,111,32,114,101,108,97,116,105,111,110,115,32,97,115,32,119,101,108,108,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<100,111,109,97,105,110>>}],[]},{em,[],[<<100,111,109,97,105,110>>]},<<32,111,102,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,120,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,121,194,160,105,110,194,160,89,125,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<114,97,110,103,101>>}],[]},{em,[],[<<114,97,110,103,101>>]},<<32,111,102,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,121,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,120,194,160,105,110,194,160,88,125,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<99,111,110,118,101,114,115,101>>}],[]},{em,[],[<<99,111,110,118,101,114,115,101>>]},<<32,111,102,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,97,194,160,58,32,97,194,160,61,32,40,121,44,194,160,120,41,32,102,111,114,32,115,111,109,101,32,40,120,44,194,160,121,41,194,160,105,110,194,160,82,125,46>>]},{p,[],[<<73,102,32,65,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,88,44,32,116,104,101,32>>,{a,[{id,<<105,109,97,103,101>>}],[]},{em,[],[<<105,109,97,103,101>>]},<<32,111,102,32,65,32,117,110,100,101,114,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,121,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,120,194,160,105,110,194,160,65,125,46,32,73,102,32,66,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,89,44,32,116,104,101,32>>,{a,[{id,<<105,110,118,101,114,115,101,95,105,109,97,103,101>>}],[]},{em,[],[<<105,110,118,101,114,115,101,32,105,109,97,103,101>>]},<<32,111,102,32,66,32,105,115,32,116,104,101,32,115,101,116,32,123,120,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,121,194,160,105,110,194,160,66,125,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,88,32,116,111,32,89,44,32,97,110,100,32,83,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,89,32,116,111,32,90,44,32,116,104,101,32>>,{a,[{id,<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,82,32,97,110,100,32,83,32,105,115,32,116,104,101,32,114,101,108,97,116,105,111,110,32,84,32,102,114,111,109,32,88,32,116,111,32,90,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,84,194,160,122,32,105,102,32,97,110,100,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,101,120,105,115,116,115,32,97,110,32,101,108,101,109,101,110,116,32,121,32,105,110,32,89,32,115,117,99,104,32,116,104,97,116,32,120,194,160,82,194,160,121,32,97,110,100,32,121,194,160,83,194,160,122,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<114,101,115,116,114,105,99,116,105,111,110>>}],[]},{em,[],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32,82,32,116,111,32,65,32,105,115,32,116,104,101,32,115,101,116,32,83,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,83,194,160,121,32,105,102,32,97,110,100,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,101,120,105,115,116,115,32,97,110,32,101,108,101,109,101,110,116,32,120,32,105,110,32,65,32,115,117,99,104,32,116,104,97,116,32,120,194,160,82,194,160,121,46>>]},{p,[],[<<73,102,32,83,32,105,115,32,97,32,114,101,115,116,114,105,99,116,105,111,110,32,111,102,32,82,32,116,111,32,65,44,32,116,104,101,110,32,82,32,105,115,32,97,110,32>>,{a,[{id,<<101,120,116,101,110,115,105,111,110>>}],[]},{em,[],[<<101,120,116,101,110,115,105,111,110>>]},<<32,111,102,32,83,32,116,111,32,88,46>>]},{p,[],[<<73,102,32,88,194,160,61,194,160,89,44,32,116,104,101,110,32,82,32,105,115,32,99,97,108,108,101,100,32,97,32,114,101,108,97,116,105,111,110,32>>,{em,[],[<<105,110>>]},<<32,88,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<102,105,101,108,100>>}],[]},{em,[],[<<102,105,101,108,100>>]},<<32,111,102,32,97,32,114,101,108,97,116,105,111,110,32,82,32,105,110,32,88,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,82,32,97,110,100,32,116,104,101,32,114,97,110,103,101,32,111,102,32,82,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,97,110,100,32,105,102,32,83,32,105,115,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,83,194,160,121,32,105,102,32,120,194,160,82,194,160,121,32,97,110,100,32,110,111,116,32,120,194,160,61,194,160,121,44,32,116,104,101,110,32,83,32,105,115,32,116,104,101,32>>,{a,[{id,<<115,116,114,105,99,116,95,114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<115,116,114,105,99,116>>]},<<32,114,101,108,97,116,105,111,110,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,82,46,32,67,111,110,118,101,114,115,101,108,121,44,32,105,102,32,83,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,97,110,100,32,105,102,32,82,32,105,115,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,82,194,160,121,32,105,102,32,120,194,160,83,194,160,121,32,111,114,32,120,194,160,61,194,160,121,44,32,116,104,101,110,32,82,32,105,115,32,116,104,101,32>>,{a,[{id,<<119,101,97,107,95,114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<119,101,97,107>>]},<<32,114,101,108,97,116,105,111,110,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,83,46>>]},{p,[],[<<65,32,114,101,108,97,116,105,111,110,32,82,32,105,110,32,88,32,105,115,32>>,{em,[],[<<114,101,102,108,101,120,105,118,101>>]},<<32,105,102,32,120,194,160,82,194,160,120,32,102,111,114,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,120,32,111,102,32,88,44,32,105,116,32,105,115,32>>,{em,[],[<<115,121,109,109,101,116,114,105,99>>]},<<32,105,102,32,120,194,160,82,194,160,121,32,105,109,112,108,105,101,115,32,116,104,97,116,32,121,194,160,82,194,160,120,44,32,97,110,100,32,105,116,32,105,115,32>>,{em,[],[<<116,114,97,110,115,105,116,105,118,101>>]},<<32,105,102,32,120,194,160,82,194,160,121,32,97,110,100,32,121,194,160,82,194,160,122,32,105,109,112,108,121,32,116,104,97,116,32,120,194,160,82,194,160,122,46>>]}]},{li,[],[{p,[],[<<65,32>>,{a,[{id,<<102,117,110,99,116,105,111,110>>}],[]},{em,[],[<<102,117,110,99,116,105,111,110>>]},<<32,70,32,105,115,32,97,32,114,101,108,97,116,105,111,110,44,32,97,32,115,117,98,115,101,116,32,111,102,32,88,194,160,195,151,194,160,89,44,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,70,32,105,115,32,101,113,117,97,108,32,116,111,32,88,32,97,110,100,32,115,117,99,104,32,116,104,97,116,32,102,111,114,32,101,118,101,114,121,32,120,32,105,110,32,88,32,116,104,101,114,101,32,105,115,32,97,32,117,110,105,113,117,101,32,101,108,101,109,101,110,116,32,121,32,105,110,32,89,32,119,105,116,104,32,40,120,44,194,160,121,41,32,105,110,32,70,46,32,84,104,101,32,108,97,116,116,101,114,32,99,111,110,100,105,116,105,111,110,32,99,97,110,32,98,101,32,102,111,114,109,117,108,97,116,101,100,32,97,115,32,102,111,108,108,111,119,115,58,32,105,102,32,120,194,160,70,194,160,121,32,97,110,100,32,120,194,160,70,194,160,122,44,32,116,104,101,110,32,121,194,160,61,194,160,122,46,32,73,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,105,116,32,105,115,32,110,111,116,32,114,101,113,117,105,114,101,100,32,116,104,97,116,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,70,32,105,115,32,101,113,117,97,108,32,116,111,32,88,32,102,111,114,32,97,32,114,101,108,97,116,105,111,110,32,116,111,32,98,101,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102,117,110,99,116,105,111,110,46>>]},{p,[],[<<73,110,115,116,101,97,100,32,111,102,32,119,114,105,116,105,110,103,32,40,120,44,194,160,121,41,194,160,105,110,194,160,70,32,111,114,32,120,194,160,70,194,160,121,44,32,119,101,32,119,114,105,116,101,32,70,40,120,41,194,160,61,194,160,121,32,119,104,101,110,32,70,32,105,115,32,97,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,115,97,121,32,116,104,97,116,32,70,32,109,97,112,115,32,120,32,111,110,116,111,32,121,44,32,111,114,32,116,104,97,116,32,116,104,101,32,118,97,108,117,101,32,111,102,32,70,32,97,116,32,120,32,105,115,32,121,46>>]},{p,[],[<<65,115,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,114,101,108,97,116,105,111,110,115,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,115,32,111,102,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,40,100,111,109,97,105,110,44,32,114,97,110,103,101,44,32,97,110,100,32,115,111,32,111,110,41,32,97,112,112,108,121,32,116,111,32,102,117,110,99,116,105,111,110,115,32,97,115,32,119,101,108,108,46>>]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,118,101,114,115,101,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,70,32,105,115,32,97,32,102,117,110,99,116,105,111,110,32,70,39,44,32,116,104,101,110,32,70,39,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{a,[{id,<<105,110,118,101,114,115,101>>}],[]},{em,[],[<<105,110,118,101,114,115,101>>]},<<32,111,102,32,70,46>>]},{p,[],[<<84,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,116,119,111,32,102,117,110,99,116,105,111,110,115,32,70,49,32,97,110,100,32,70,50,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{a,[{id,<<99,111,109,112,111,115,105,116,101>>}],[]},{em,[],[<<99,111,109,112,111,115,105,116,101>>]},<<32,111,102,32,70,49,32,97,110,100,32,70,50,32,105,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,70,49,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,70,50,46>>]}]},{li,[],[{p,[],[<<83,111,109,101,116,105,109,101,115,44,32,119,104,101,110,32,116,104,101,32,114,97,110,103,101,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,109,111,114,101,32,105,109,112,111,114,116,97,110,116,32,116,104,97,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,116,115,101,108,102,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,97,32>>,{em,[],[<<102,97,109,105,108,121>>]},<<46>>]},{p,[],[<<84,104,101,32,100,111,109,97,105,110,32,111,102,32,97,32,102,97,109,105,108,121,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{em,[],[<<105,110,100,101,120,32,115,101,116>>]},<<44,32,97,110,100,32,116,104,101,32,114,97,110,103,101,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{em,[],[<<105,110,100,101,120,101,100,32,115,101,116>>]},<<46>>]},{p,[],[<<73,102,32,120,32,105,115,32,97,32,102,97,109,105,108,121,32,102,114,111,109,32,73,32,116,111,32,88,44,32,116,104,101,110,32,120,91,105,93,32,100,101,110,111,116,101,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,97,116,32,105,110,100,101,120,32,105,46,32,84,104,101,32,110,111,116,97,116,105,111,110,32,34,97,32,102,97,109,105,108,121,32,105,110,32,88,34,32,105,115,32,117,115,101,100,32,102,111,114,32,115,117,99,104,32,97,32,102,97,109,105,108,121,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,105,110,100,101,120,101,100,32,115,101,116,32,105,115,32,97,32,115,101,116,32,111,102,32,115,117,98,115,101,116,115,32,111,102,32,97,32,115,101,116,32,88,44,32,119,101,32,99,97,108,108,32,120,32,97,32>>,{a,[{id,<<102,97,109,105,108,121>>}],[]},{em,[],[<<102,97,109,105,108,121,32,111,102,32,115,117,98,115,101,116,115>>]},<<32,111,102,32,88,46>>]},{p,[],[<<73,102,32,120,32,105,115,32,97,32,102,97,109,105,108,121,32,111,102,32,115,117,98,115,101,116,115,32,111,102,32,88,44,32,116,104,101,32,117,110,105,111,110,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,120,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{em,[],[<<117,110,105,111,110,32,111,102,32,116,104,101,32,102,97,109,105,108,121>>]},<<32,120,46>>]},{p,[],[<<73,102,32,120,32,105,115,32,110,111,110,45,101,109,112,116,121,32,40,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,110,111,110,45,101,109,112,116,121,41,44,32,116,104,101,32>>,{em,[],[<<105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32,102,97,109,105,108,121>>]},<<32,120,32,105,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,120,46>>]},{p,[],[<<73,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,116,104,101,32,111,110,108,121,32,102,97,109,105,108,105,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,97,114,101,32,102,97,109,105,108,105,101,115,32,111,102,32,115,117,98,115,101,116,115,32,111,102,32,115,111,109,101,32,115,101,116,32,88,59,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,116,104,101,32,119,111,114,100,32,34,102,97,109,105,108,121,34,32,105,115,32,117,115,101,100,32,102,111,114,32,115,117,99,104,32,102,97,109,105,108,105,101,115,32,111,102,32,115,117,98,115,101,116,115,46>>]}]},{li,[],[{p,[],[<<65,32>>,{a,[{id,<<112,97,114,116,105,116,105,111,110>>}],[]},{em,[],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32,97,32,115,101,116,32,88,32,105,115,32,97,32,99,111,108,108,101,99,116,105,111,110,32,83,32,111,102,32,110,111,110,45,101,109,112,116,121,32,115,117,98,115,101,116,115,32,111,102,32,88,32,119,104,111,115,101,32,117,110,105,111,110,32,105,115,32,88,32,97,110,100,32,119,104,111,115,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,112,97,105,114,119,105,115,101,32,100,105,115,106,111,105,110,116,46>>]},{p,[],[<<65,32,114,101,108,97,116,105,111,110,32,105,110,32,97,32,115,101,116,32,105,115,32,97,110,32>>,{em,[],[<<101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110>>]},<<32,105,102,32,105,116,32,105,115,32,114,101,102,108,101,120,105,118,101,44,32,115,121,109,109,101,116,114,105,99,44,32,97,110,100,32,116,114,97,110,115,105,116,105,118,101,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,110,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,97,110,100,32,120,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,88,44,32,116,104,101,32>>,{a,[{id,<<101,113,117,105,118,97,108,101,110,99,101,95,99,108,97,115,115>>}],[]},{em,[],[<<101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115>>]},<<32,111,102,32,120,32,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,32,82,32,105,115,32,116,104,101,32,115,101,116,32,111,102,32,97,108,108,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,121,32,111,102,32,88,32,102,111,114,32,119,104,105,99,104,32,120,194,160,82,194,160,121,32,104,111,108,100,115,46,32,84,104,101,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,101,115,32,99,111,110,115,116,105,116,117,116,101,32,97,32,112,97,114,116,105,116,105,111,110,105,110,103,32,111,102,32,88,46,32,67,111,110,118,101,114,115,101,108,121,44,32,105,102,32,67,32,105,115,32,97,32,112,97,114,116,105,116,105,111,110,32,111,102,32,88,44,32,116,104,101,32,114,101,108,97,116,105,111,110,32,116,104,97,116,32,104,111,108,100,115,32,102,111,114,32,97,110,121,32,116,119,111,32,101,108,101,109,101,110,116,115,32,111,102,32,88,32,105,102,32,116,104,101,121,32,98,101,108,111,110,103,32,116,111,32,116,104,101,32,115,97,109,101,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,44,32,105,115,32,97,110,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,100,117,99,101,100,32,98,121,32,116,104,101,32,112,97,114,116,105,116,105,111,110,32,67,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,110,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,116,104,101,32>>,{a,[{id,<<99,97,110,111,110,105,99,97,108,95,109,97,112>>}],[]},{em,[],[<<99,97,110,111,110,105,99,97,108,32,109,97,112>>]},<<32,105,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,109,97,112,115,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,111,102,32,88,32,111,110,116,111,32,105,116,115,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,46>>]}]},{li,[],[{p,[],[{a,[{id,<<98,105,110,97,114,121,95,114,101,108,97,116,105,111,110>>}],[]},<<82,101,108,97,116,105,111,110,115,32,97,115,32,100,101,102,105,110,101,100,32,97,98,111,118,101,32,40,97,115,32,115,101,116,115,32,111,102,32,111,114,100,101,114,101,100,32,112,97,105,114,115,41,32,97,114,101,32,102,114,111,109,32,110,111,119,32,111,110,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32>>,{em,[],[<<98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115>>]},<<46>>]},{p,[],[<<87,101,32,99,97,108,108,32,97,32,115,101,116,32,111,102,32,111,114,100,101,114,101,100,32,115,101,116,115,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,32,97,110,32>>,{a,[{id,<<110,95,97,114,121,95,114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<40,110,45,97,114,121,41,32,114,101,108,97,116,105,111,110>>]},<<44,32,97,110,100,32,115,97,121,32,116,104,97,116,32,116,104,101,32,114,101,108,97,116,105,111,110,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32>>,{a,[{id,<<67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116,95,116,117,112,108,101>>}],[]},<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116,32,88,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,88,91,110,93,44,32,119,104,101,114,101,32,120,91,105,93,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,88,91,105,93,44,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<112,114,111,106,101,99,116,105,111,110>>}],[]},{em,[],[<<112,114,111,106,101,99,116,105,111,110>>]},<<32,111,102,32,97,110,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,32,82,32,111,110,116,111,32,99,111,111,114,100,105,110,97,116,101,32,105,32,105,115,32,116,104,101,32,115,101,116,32,123,120,91,105,93,194,160,58,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,105,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,32,105,110,32,82,32,102,111,114,32,115,111,109,101,32,120,91,106,93,194,160,105,110,194,160,88,91,106,93,44,32,49,194,160,60,61,194,160,106,194,160,60,61,194,160,110,32,97,110,100,32,110,111,116,32,105,194,160,61,194,160,106,125,46,32,84,104,101,32,112,114,111,106,101,99,116,105,111,110,115,32,111,102,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,82,32,111,110,116,111,32,116,104,101,32,102,105,114,115,116,32,97,110,100,32,115,101,99,111,110,100,32,99,111,111,114,100,105,110,97,116,101,115,32,97,114,101,32,116,104,101,32,100,111,109,97,105,110,32,97,110,100,32,116,104,101,32,114,97,110,103,101,32,111,102,32,82,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46>>]},{p,[],[<<84,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,99,97,110,32,98,101,32,103,101,110,101,114,97,108,105,122,101,100,32,116,111,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,115,32,97,115,32,102,111,108,108,111,119,115,46,32,76,101,116,32,84,82,32,98,101,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,102,114,111,109,32,88,32,116,111,32,89,91,105,93,32,97,110,100,32,83,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,40,89,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,89,91,110,93,41,32,116,111,32,90,46,32,84,104,101,32>>,{a,[{id,<<116,117,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,84,82,32,97,110,100,32,83,32,105,115,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,84,32,102,114,111,109,32,88,32,116,111,32,90,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,84,194,160,122,32,105,102,32,97,110,100,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,101,120,105,115,116,115,32,97,110,32,101,108,101,109,101,110,116,32,121,91,105,93,32,105,110,32,89,91,105,93,32,102,111,114,32,101,97,99,104,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,32,115,117,99,104,32,116,104,97,116,32,120,194,160,82,91,105,93,194,160,121,91,105,93,32,97,110,100,32,40,121,91,49,93,44,194,160,46,46,46,44,194,160,121,91,110,93,41,194,160,83,194,160,122,46,32,78,111,119,32,108,101,116,32,84,82,32,98,101,32,97,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,102,114,111,109,32,88,91,105,93,32,116,111,32,89,91,105,93,32,97,110,100,32,83,32,97,32,115,117,98,115,101,116,32,111,102,32,88,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,88,91,110,93,46,32,84,104,101,32>>,{a,[{id,<<109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<109,117,108,116,105,112,108,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,84,82,32,97,110,100,32,83,32,105,115,32,100,101,102,105,110,101,100,32,116,111,32,98,101,32,116,104,101,32,115,101,116,32,123,122,194,160,58,32,122,194,160,61,32,40,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,44,32,40,121,91,49,93,44,46,46,46,44,121,91,110,93,41,41,32,102,111,114,32,115,111,109,101,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,194,160,105,110,194,160,83,32,97,110,100,32,102,111,114,32,115,111,109,101,32,40,120,91,105,93,44,194,160,121,91,105,93,41,32,105,110,32,82,91,105,93,44,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,125,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<110,97,116,117,114,97,108,95,106,111,105,110>>}],[]},{em,[],[<<110,97,116,117,114,97,108,32,106,111,105,110>>]},<<32,111,102,32,97,110,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,32,82,32,97,110,100,32,97,110,32,109,45,97,114,121,32,114,101,108,97,116,105,111,110,32,83,32,111,110,32,99,111,111,114,100,105,110,97,116,101,32,105,32,97,110,100,32,106,32,105,115,32,100,101,102,105,110,101,100,32,116,111,32,98,101,32,116,104,101,32,115,101,116,32,123,122,194,160,58,32,122,194,160,61,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,44,194,160,32,121,91,49,93,44,194,160,46,46,46,44,194,160,121,91,106,45,49,93,44,194,160,121,91,106,43,49,93,44,194,160,46,46,46,44,194,160,121,91,109,93,41,32,102,111,114,32,115,111,109,101,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,194,160,105,110,194,160,82,32,97,110,100,32,102,111,114,32,115,111,109,101,32,40,121,91,49,93,44,194,160,46,46,46,44,194,160,121,91,109,93,41,194,160,105,110,194,160,83,32,115,117,99,104,32,116,104,97,116,32,120,91,105,93,194,160,61,194,160,121,91,106,93,125,46>>]}]},{li,[],[{p,[],[{a,[{id,<<115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>}],[]},<<84,104,101,32,115,101,116,115,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,116,104,105,115,32,109,111,100,117,108,101,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,114,101,108,97,116,105,111,110,32,83,101,116,115,44,32,119,104,105,99,104,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,115,101,116,32,115,117,99,104,32,116,104,97,116,58>>]},{ul,[],[{li,[],[{p,[],[<<70,111,114,32,101,118,101,114,121,32,97,116,111,109,32,84,44,32,101,120,99,101,112,116,32,39,95,39,44,32,97,110,100,32,102,111,114,32,101,118,101,114,121,32,116,101,114,109,32,88,44,32,40,84,44,194,160,88,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40>>,{em,[],[<<97,116,111,109,105,99,32,115,101,116,115>>]},<<41,46>>]}]},{li,[],[{p,[],[<<40,91,39,95,39,93,44,194,160,91,93,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40,116,104,101,32>>,{em,[],[<<117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116>>]},<<41,46>>]}]},{li,[],[{p,[],[<<70,111,114,32,101,118,101,114,121,32,116,117,112,108,101,32,84,194,160,61,32,123,84,91,49,93,44,194,160,46,46,46,44,194,160,84,91,110,93,125,32,97,110,100,32,102,111,114,32,101,118,101,114,121,32,116,117,112,108,101,32,88,194,160,61,32,123,88,91,49,93,44,194,160,46,46,46,44,194,160,88,91,110,93,125,44,32,105,102,32,40,84,91,105,93,44,194,160,88,91,105,93,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,102,111,114,32,101,118,101,114,121,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,44,32,116,104,101,110,32,40,84,44,194,160,88,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40>>,{em,[],[<<111,114,100,101,114,101,100,32,115,101,116,115>>]},<<41,46>>]}]},{li,[],[{p,[],[<<70,111,114,32,101,118,101,114,121,32,116,101,114,109,32,84,44,32,105,102,32,88,32,105,115,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,111,114,32,97,32,110,111,110,45,101,109,112,116,121,32,115,111,114,116,101,100,32,108,105,115,116,32,91,88,91,49,93,44,194,160,46,46,46,44,194,160,88,91,110,93,93,32,119,105,116,104,111,117,116,32,100,117,112,108,105,99,97,116,101,115,32,115,117,99,104,32,116,104,97,116,32,40,84,44,194,160,88,91,105,93,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,102,111,114,32,101,118,101,114,121,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,44,32,116,104,101,110,32,40,91,84,93,44,194,160,88,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40>>,{em,[],[<<116,121,112,101,100,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115>>]},<<41,46>>]}]}]},{p,[],[<<65,110,32>>,{a,[{id,<<101,120,116,101,114,110,97,108,95,115,101,116>>}],[]},{em,[],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,83,101,116,115,46>>]},{p,[],[<<65,32>>,{a,[{id,<<116,121,112,101>>}],[]},{em,[],[<<116,121,112,101>>]},<<32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,83,101,116,115,46>>]},{p,[],[<<73,102,32,83,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,40,84,44,194,160,88,41,32,111,102,32,83,101,116,115,44,32,116,104,101,110,32,84,32,105,115,32,97,32>>,{a,[{id,<<118,97,108,105,100,95,116,121,112,101>>}],[]},{em,[],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,111,102,32,88,44,32,84,32,105,115,32,116,104,101,32,116,121,112,101,32,111,102,32,83,44,32,97,110,100,32,88,32,105,115,32,116,104,101,32,101,120,116,101,114,110,97,108,32,115,101,116,32,111,102,32,83,46,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,116,101,114,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,116,101,114,109,47,50>>]}]},<<32,99,114,101,97,116,101,115,32,97,32,115,101,116,32,102,114,111,109,32,97,32,116,121,112,101,32,97,110,100,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,117,114,110,101,100,32,105,110,116,111,32,97,110,32,101,120,116,101,114,110,97,108,32,115,101,116,46>>]},{p,[],[<<84,104,101,32,115,101,116,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,83,101,116,115,32,97,114,101,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,102,117,110,99,116,105,111,110,32,83,101,116,32,102,114,111,109,32,83,101,116,115,32,116,111,32,69,114,108,97,110,103,32,116,101,114,109,115,32,97,110,100,32,115,101,116,115,32,111,102,32,69,114,108,97,110,103,32,116,101,114,109,115,58>>]},{ul,[],[{li,[],[<<83,101,116,40,84,44,84,101,114,109,41,194,160,61,32,84,101,114,109,44,32,119,104,101,114,101,32,84,32,105,115,32,97,110,32,97,116,111,109>>]},{li,[],[<<83,101,116,40,123,84,91,49,93,44,194,160,46,46,46,44,194,160,84,91,110,93,125,44,194,160,123,88,91,49,93,44,194,160,46,46,46,44,32,194,160,88,91,110,93,125,41,194,160,61,32,40,83,101,116,40,84,91,49,93,44,194,160,88,91,49,93,41,44,194,160,46,46,46,44,194,160,32,83,101,116,40,84,91,110,93,44,194,160,88,91,110,93,41,41>>]},{li,[],[<<83,101,116,40,91,84,93,44,194,160,91,88,91,49,93,44,194,160,46,46,46,44,194,160,88,91,110,93,93,41,194,160,61,32,123,83,101,116,40,84,44,194,160,88,91,49,93,41,44,194,160,46,46,46,44,194,160,83,101,116,40,84,44,194,160,88,91,110,93,41,125>>]},{li,[],[<<83,101,116,40,91,84,93,44,194,160,91,93,41,194,160,61,32,123,125>>]}]},{p,[],[<<87,104,101,110,32,116,104,101,114,101,32,105,115,32,110,111,32,114,105,115,107,32,111,102,32,99,111,110,102,117,115,105,111,110,44,32,101,108,101,109,101,110,116,115,32,111,102,32,83,101,116,115,32,97,114,101,32,105,100,101,110,116,105,102,105,101,100,32,119,105,116,104,32,116,104,101,32,115,101,116,115,32,116,104,101,121,32,114,101,112,114,101,115,101,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,85,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,105,111,110,47,50>>]}]},<<32,119,105,116,104,32,83,49,32,97,110,100,32,83,50,32,97,115,32,97,114,103,117,109,101,110,116,115,44,32,116,104,101,110,32,85,32,105,115,32,115,97,105,100,32,116,111,32,98,101,32,116,104,101,32,117,110,105,111,110,32,111,102,32,83,49,32,97,110,100,32,83,50,46,32,65,32,109,111,114,101,32,112,114,101,99,105,115,101,32,102,111,114,109,117,108,97,116,105,111,110,32,105,115,32,116,104,97,116,32,83,101,116,40,85,41,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32,83,101,116,40,83,49,41,32,97,110,100,32,83,101,116,40,83,50,41,46>>]}]}]},{p,[],[<<84,104,101,32,116,121,112,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,105,109,112,108,101,109,101,110,116,32,116,104,101,32,118,97,114,105,111,117,115,32,99,111,110,100,105,116,105,111,110,115,32,116,104,97,116,32,115,101,116,115,32,109,117,115,116,32,102,117,108,102,105,108,108,46,32,65,115,32,97,110,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,116,119,111,32,115,101,116,115,32,82,32,97,110,100,32,83,44,32,97,110,100,32,114,101,99,97,108,108,32,116,104,97,116,32,116,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,82,32,97,110,100,32,83,32,105,115,32,100,101,102,105,110,101,100,32,105,102,32,82,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,116,111,32,89,32,97,110,100,32,83,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,89,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>]}]},<<44,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,114,101,112,114,101,115,101,110,116,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,98,121,32,109,97,116,99,104,105,110,103,32,91,123,65,44,66,125,93,32,97,103,97,105,110,115,116,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,32,40,65,114,103,49,32,115,97,121,41,44,32,97,110,100,32,91,123,67,44,68,125,93,32,97,103,97,105,110,115,116,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,40,65,114,103,50,32,115,97,121,41,46,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,91,123,65,44,66,125,93,32,109,97,116,99,104,101,115,32,116,104,101,32,116,121,112,101,32,111,102,32,65,114,103,49,32,105,115,32,116,111,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,65,114,103,49,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,88,32,116,111,32,89,44,32,119,104,101,114,101,32,88,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,97,108,108,32,115,101,116,115,32,83,101,116,40,120,41,32,102,111,114,32,115,111,109,101,32,101,108,101,109,101,110,116,32,120,32,105,110,32,83,101,116,115,32,116,104,101,32,116,121,112,101,32,111,102,32,119,104,105,99,104,32,105,115,32,65,44,32,97,110,100,32,115,105,109,105,108,97,114,108,121,32,102,111,114,32,89,46,32,73,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,65,114,103,50,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,87,32,116,111,32,90,46,32,70,105,110,97,108,108,121,32,105,116,32,105,115,32,99,104,101,99,107,101,100,32,116,104,97,116,32,66,32,109,97,116,99,104,101,115,32,67,44,32,119,104,105,99,104,32,105,115,32,115,117,102,102,105,99,105,101,110,116,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,87,32,105,115,32,101,113,117,97,108,32,116,111,32,89,46,32,84,104,101,32,117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116,32,105,115,32,104,97,110,100,108,101,100,32,115,101,112,97,114,97,116,101,108,121,58,32,105,116,115,32,116,121,112,101,44,32,91,39,95,39,93,44,32,109,97,116,99,104,101,115,32,116,104,101,32,116,121,112,101,32,111,102,32,97,110,121,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46>>]},{p,[],[<<65,32,102,101,119,32,102,117,110,99,116,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,32,40>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,114,101,115,116,114,105,99,116,105,111,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,114,101,115,116,114,105,99,116,105,111,110,47,51>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,97,114,116,105,116,105,111,110,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,114,111,106,101,99,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,106,101,99,116,105,111,110,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,115,116,114,105,99,116,105,111,110,47,51>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,117,98,115,116,105,116,117,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,117,98,115,116,105,116,117,116,105,111,110,47,50>>]}]},<<41,32,97,99,99,101,112,116,32,97,110,32,69,114,108,97,110,103,32,102,117,110,99,116,105,111,110,32,97,115,32,97,32,109,101,97,110,115,32,116,111,32,109,111,100,105,102,121,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,97,32,103,105,118,101,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46,32>>,{a,[{id,<<115,101,116,95,102,117,110>>}],[]},<<83,117,99,104,32,97,32,102,117,110,99,116,105,111,110,44,32,99,97,108,108,101,100,32,83,101,116,70,117,110,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,102,117,110,99,116,105,111,110,97,108,32,111,98,106,101,99,116,32,40,102,117,110,41,44,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,194,160,70,117,110,125>>]},<<44,32,111,114,32,97,110,32,105,110,116,101,103,101,114,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,83,101,116,70,117,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,102,117,110,44,32,116,104,101,32,102,117,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,103,105,118,101,110,32,115,101,116,32,97,110,100,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,115,115,117,109,101,100,32,116,111,32,98,101,32,97,32,115,101,116,46>>]}]},{li,[],[{p,[],[<<73,102,32,83,101,116,70,117,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,32,70,117,110,125>>]},<<44,32,70,117,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,101,120,116,101,114,110,97,108,32,115,101,116,32,111,102,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,103,105,118,101,110,32,115,101,116,32,97,110,100,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,115,115,117,109,101,100,32,116,111,32,98,101,32,97,110,32,101,120,116,101,114,110,97,108,32,115,101,116,46,32,83,101,108,101,99,116,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,97,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,97,115,32,101,120,116,101,114,110,97,108,32,115,101,116,115,32,97,110,100,32,97,115,115,101,109,98,108,105,110,103,32,97,32,110,101,119,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,102,114,111,109,32,97,32,108,105,115,116,32,111,102,32,101,120,116,101,114,110,97,108,32,115,101,116,115,32,105,115,32,105,110,32,116,104,101,32,112,114,101,115,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,109,111,100,105,102,121,105,110,103,32,101,97,99,104,32,101,108,101,109,101,110,116,32,97,115,32,97,32,115,101,116,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,97,114,101,32,97,116,111,109,105,99,32,111,114,32,111,114,100,101,114,101,100,32,115,101,116,115,46,32,73,116,32,109,117,115,116,32,97,108,115,111,32,98,101,32,116,104,101,32,99,97,115,101,32,116,104,97,116,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,101,108,101,109,101,110,116,115,32,109,97,116,99,104,101,115,32,115,111,109,101,32,99,108,97,117,115,101,32,111,102,32,70,117,110,32,40,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,99,114,101,97,116,101,100,32,115,101,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32,70,117,110,32,116,111,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,103,105,118,101,110,32,115,101,116,41,44,32,97,110,100,32,116,104,97,116,32,70,117,110,32,100,111,101,115,32,110,111,116,104,105,110,103,32,98,117,116,32,115,101,108,101,99,116,105,110,103,44,32,100,117,112,108,105,99,97,116,105,110,103,44,32,111,114,32,114,101,97,114,114,97,110,103,105,110,103,32,112,97,114,116,115,32,111,102,32,116,104,101,32,101,108,101,109,101,110,116,115,46>>]}]},{li,[],[{p,[],[<<83,112,101,99,105,102,121,105,110,103,32,97,32,83,101,116,70,117,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,32,73,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,88,41,194,160,45,62,32,101,108,101,109,101,110,116,40,73,44,194,160,88,41,194,160,101,110,100,125>>]},<<44,32,98,117,116,32,105,115,32,116,111,32,98,101,32,112,114,101,102,101,114,114,101,100,44,32,97,115,32,105,116,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,110,100,108,101,32,116,104,105,115,32,99,97,115,101,32,101,118,101,110,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,108,121,46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,115,32,111,102,32,83,101,116,70,117,110,115,58>>]},{pre,[],[{code,[],[<<102,117,110,32,115,111,102,115,58,117,110,105,111,110,47,49,10,102,117,110,40,83,41,32,45,62,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,49,44,32,83,41,32,101,110,100,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,65,41,32,45,62,32,65,32,101,110,100,125,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,65,44,95,44,67,125,41,32,45,62,32,123,67,44,65,125,32,101,110,100,125,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,95,44,123,95,44,67,125,125,41,32,45,62,32,67,32,101,110,100,125,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,95,44,123,95,44,123,95,44,69,125,61,67,125,125,41,32,45,62,32,123,69,44,123,69,44,67,125,125,32,101,110,100,125,10,50>>]}]},{p,[],[<<84,104,101,32,111,114,100,101,114,32,105,110,32,119,104,105,99,104,32,97,32,83,101,116,70,117,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,97,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,44,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,46>>]},{p,[],[<<84,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,32,105,115,32,100,111,109,105,110,97,116,101,100,32,98,121,32,116,104,101,32,116,105,109,101,32,105,116,32,116,97,107,101,115,32,116,111,32,115,111,114,116,32,108,105,115,116,115,46,32,87,104,101,110,32,110,111,32,115,111,114,116,105,110,103,32,105,115,32,110,101,101,100,101,100,44,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,105,115,32,105,110,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,112,114,111,112,111,114,116,105,111,110,97,108,32,116,111,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,115,105,122,101,115,32,111,102,32,116,104,101,32,105,110,112,117,116,32,97,114,103,117,109,101,110,116,115,32,97,110,100,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,46,32,65,32,102,101,119,32,102,117,110,99,116,105,111,110,115,32,101,120,101,99,117,116,101,32,105,110,32,99,111,110,115,116,97,110,116,32,116,105,109,101,58,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,115,95,101,109,112,116,121,95,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,101,109,112,116,121,95,115,101,116,47,49>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,115,95,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,115,101,116,47,49>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,115,95,115,111,102,115,95,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,115,111,102,115,95,115,101,116,47,49>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,111,95,101,120,116,101,114,110,97,108,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,111,95,101,120,116,101,114,110,97,108,47,49>>]}]},<<32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,121,112,101,47,49>>]}]},<<46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,32,101,120,105,116,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<44,32>>,{code,[],[<<98,97,100,95,102,117,110,99,116,105,111,110>>]},<<44,32,111,114,32>>,{code,[],[<<116,121,112,101,95,109,105,115,109,97,116,99,104>>]},<<32,109,101,115,115,97,103,101,32,119,104,101,110,32,103,105,118,101,110,32,98,97,100,108,121,32,102,111,114,109,101,100,32,97,114,103,117,109,101,110,116,115,32,111,114,32,115,101,116,115,32,116,104,101,32,116,121,112,101,115,32,111,102,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,99,111,109,112,97,116,105,98,108,101,46>>]},{p,[],[<<87,104,101,110,32,99,111,109,112,97,114,105,110,103,32,101,120,116,101,114,110,97,108,32,115,101,116,115,44,32,111,112,101,114,97,116,111,114,32>>,{code,[],[<<61,61,47,50>>]},<<32,105,115,32,117,115,101,100,46>>]},{h2,[],[<<83,101,101,32,65,108,115,111>>]},{p,[],[{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,105,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,99,116,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,105,103,114,97,112,104>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,103,114,97,112,104,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,111,114,100,100,105,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,114,100,100,105,99,116,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,111,114,100,115,101,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,114,100,115,101,116,115,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,116,115,40,51,41>>]}]}]}]},#{name => <<115,111,102,115>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,115,111,102,115,46,120,109,108],types => #{{a_function,0} => {attribute,120,type,{a_function,{user_type,120,relation,[]},[]}},{a_set,0} => {attribute,124,opaque,{a_set,{type,124,record,[{atom,124,'Set'}]},[]}},{anyset,0} => {attribute,117,type,{anyset,{type,117,union,[{user_type,117,ordset,[]},{user_type,117,a_set,[]}]},[]}},{binary_relation,0} => {attribute,118,type,{binary_relation,{user_type,118,relation,[]},[]}},{external_set,0} => {attribute,119,type,{external_set,{type,119,term,[]},[]}},{family,0} => {attribute,121,type,{family,{user_type,121,a_function,[]},[]}},{ordset,0} => {attribute,122,opaque,{ordset,{type,122,record,[{atom,122,'OrdSet'}]},[]}},{relation,0} => {attribute,123,type,{relation,{user_type,123,a_set,[]},[]}},{set_fun,0} => {attribute,126,type,{set_fun,{type,126,union,[{type,126,pos_integer,[]},{type,127,tuple,[{atom,127,external},{type,127,'fun',[{type,127,product,[{user_type,127,external_set,[]}]},{user_type,127,external_set,[]}]}]},{type,128,'fun',[{type,128,product,[{user_type,128,anyset,[]}]},{user_type,128,anyset,[]}]}]},[]}},{set_of_sets,0} => {attribute,125,type,{set_of_sets,{user_type,125,a_set,[]},[]}},{spec_fun,0} => {attribute,129,type,{spec_fun,{type,129,union,[{type,129,tuple,[{atom,129,external},{type,129,'fun',[{type,129,product,[{user_type,129,external_set,[]}]},{type,129,boolean,[]}]}]},{type,130,'fun',[{type,130,product,[{user_type,130,anyset,[]}]},{type,130,boolean,[]}]}]},[]}},{tuple_of,1} => {attribute,133,type,{tuple_of,{type,133,tuple,any},[{var,133,'_T'}]}},{type,0} => {attribute,131,type,{type,{type,131,term,[]},[]}}}},[{{function,a_function,2},[{file,[115,111,102,115,46,101,114,108]},{location,277}],[<<97,95,102,117,110,99,116,105,111,110,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,53,56>>,equiv => {function,a_function,1},signature => [{attribute,277,spec,{{a_function,2},[{type,277,bounded_fun,[{type,277,'fun',[{type,277,product,[{var,277,'Tuples'},{var,277,'Type'}]},{var,277,'Function'}]},[{type,278,constraint,[{atom,278,is_subtype},[{var,278,'Function'},{user_type,278,a_function,[]}]]},{type,279,constraint,[{atom,279,is_subtype},[{var,279,'Tuples'},{type,279,list,[{type,279,tuple,any}]}]]},{type,280,constraint,[{atom,280,is_subtype},[{var,280,'Type'},{user_type,280,type,[]}]]}]]}]}}]}},{{function,a_function,1},[{file,[115,111,102,115,46,101,114,108]},{location,265}],[<<97,95,102,117,110,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<46,32>>,{code,[],[<<97,95,102,117,110,99,116,105,111,110,40,70,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,70,44,194,160,84,41>>]},<<32,105,102,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,102,117,110,99,116,105,111,110,46,32,73,102,32,110,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<91,123,97,116,111,109,44,194,160,97,116,111,109,125,93>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,121,112,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,53,56>>,signature => [{attribute,265,spec,{{a_function,1},[{type,265,bounded_fun,[{type,265,'fun',[{type,265,product,[{var,265,'Tuples'}]},{var,265,'Function'}]},[{type,266,constraint,[{atom,266,is_subtype},[{var,266,'Function'},{user_type,266,a_function,[]}]]},{type,267,constraint,[{atom,267,is_subtype},[{var,267,'Tuples'},{type,267,list,[{type,267,tuple,any}]}]]}]]}]}}]}},{{function,canonical_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,577}],[<<99,97,110,111,110,105,99,97,108,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,40,69,44,194,160,83,101,116,41,32,115,117,99,104,32,116,104,97,116,32,83,101,116,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,97,110,100,32,69,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,46,32,73,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32,97,32,115,101,116,32,88,32,97,110,100,32,82,32,105,115,32,116,104,101,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,32,88,32,105,110,100,117,99,101,100,32,98,121,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<44,32,116,104,101,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,108,97,116,105,111,110,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,97,110,111,110,105,99,97,108,95,109,97,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,97,110,111,110,105,99,97,108,32,109,97,112>>]},<<32,102,114,111,109,32,88,32,111,110,116,111,32,116,104,101,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,101,115,32,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,32,82,46>>]},{pre,[],[{code,[],[<<49,62,32,83,115,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,97,44,98,93,44,91,98,44,99,93,93,41,44,10,67,82,32,61,32,115,111,102,115,58,99,97,110,111,110,105,99,97,108,95,114,101,108,97,116,105,111,110,40,83,115,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,67,82,41,46,10,91,123,97,44,91,97,44,98,93,125,44,123,98,44,91,97,44,98,93,125,44,123,98,44,91,98,44,99,93,125,44,123,99,44,91,98,44,99,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,55,50>>,signature => [{attribute,577,spec,{{canonical_relation,1},[{type,577,bounded_fun,[{type,577,'fun',[{type,577,product,[{var,577,'SetOfSets'}]},{var,577,'BinRel'}]},[{type,578,constraint,[{atom,578,is_subtype},[{var,578,'BinRel'},{user_type,578,binary_relation,[]}]]},{type,579,constraint,[{atom,579,is_subtype},[{var,579,'SetOfSets'},{user_type,579,set_of_sets,[]}]]}]]}]}}]}},{{function,composite,2},[{file,[115,111,102,115,46,101,114,108]},{location,844}],[<<99,111,109,112,111,115,105,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,111,109,112,111,115,105,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,109,112,111,115,105,116,101>>]},<<32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32>>,{code,[],[<<70,117,110,99,116,105,111,110,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,117,110,99,116,105,111,110,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,97,95,102,117,110,99,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,44,123,99,44,50,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,97,95,102,117,110,99,116,105,111,110,40,91,123,49,44,120,125,44,123,50,44,121,125,44,123,51,44,122,125,93,41,44,10,70,32,61,32,115,111,102,115,58,99,111,109,112,111,115,105,116,101,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,120,125,44,123,98,44,121,125,44,123,99,44,121,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,57,50>>,signature => [{attribute,844,spec,{{composite,2},[{type,844,bounded_fun,[{type,844,'fun',[{type,844,product,[{var,844,'Function1'},{var,844,'Function2'}]},{var,844,'Function3'}]},[{type,845,constraint,[{atom,845,is_subtype},[{var,845,'Function1'},{user_type,845,a_function,[]}]]},{type,846,constraint,[{atom,846,is_subtype},[{var,846,'Function2'},{user_type,846,a_function,[]}]]},{type,847,constraint,[{atom,847,is_subtype},[{var,847,'Function3'},{user_type,847,a_function,[]}]]}]]}]}}]}},{{function,constant_function,2},[{file,[115,111,102,115,46,101,114,108]},{location,465}],[<<99,111,110,115,116,97,110,116,95,102,117,110,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<32,116,104,97,116,32,109,97,112,115,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,115,101,116,32>>,{code,[],[<<83,101,116>>]},<<32,111,110,116,111,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,115,101,116,40,91,97,44,98,93,41,44,10,69,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,49,41,44,10,82,32,61,32,115,111,102,115,58,99,111,110,115,116,97,110,116,95,102,117,110,99,116,105,111,110,40,83,44,32,69,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,41,46,10,91,123,97,44,49,125,44,123,98,44,49,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,48,56>>,signature => [{attribute,465,spec,{{constant_function,2},[{type,465,bounded_fun,[{type,465,'fun',[{type,465,product,[{var,465,'Set'},{var,465,'AnySet'}]},{var,465,'Function'}]},[{type,466,constraint,[{atom,466,is_subtype},[{var,466,'AnySet'},{user_type,466,anyset,[]}]]},{type,467,constraint,[{atom,467,is_subtype},[{var,467,'Function'},{user_type,467,a_function,[]}]]},{type,468,constraint,[{atom,468,is_subtype},[{var,468,'Set'},{user_type,468,a_set,[]}]]}]]}]}}]}},{{function,converse,1},[{file,[115,111,102,115,46,101,114,108]},{location,707}],[<<99,111,110,118,101,114,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,111,110,118,101,114,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,110,118,101,114,115,101>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,97,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,99,111,110,118,101,114,115,101,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,97,44,49,125,44,123,97,44,51,125,44,123,98,44,50,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,50,52>>,signature => [{attribute,707,spec,{{converse,1},[{type,707,bounded_fun,[{type,707,'fun',[{type,707,product,[{var,707,'BinRel1'}]},{var,707,'BinRel2'}]},[{type,708,constraint,[{atom,708,is_subtype},[{var,708,'BinRel1'},{user_type,708,binary_relation,[]}]]},{type,709,constraint,[{atom,709,is_subtype},[{var,709,'BinRel2'},{user_type,709,binary_relation,[]}]]}]]}]}}]}},{{function,difference,2},[{file,[115,111,102,115,46,101,114,108]},{location,398}],[<<100,105,102,102,101,114,101,110,99,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,105,102,102,101,114,101,110,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,102,102,101,114,101,110,99,101>>]},<<32,111,102,32,116,104,101,32,115,101,116,115,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,51,56>>,signature => [{attribute,398,spec,{{difference,2},[{type,398,bounded_fun,[{type,398,'fun',[{type,398,product,[{var,398,'Set1'},{var,398,'Set2'}]},{var,398,'Set3'}]},[{type,399,constraint,[{atom,399,is_subtype},[{var,399,'Set1'},{user_type,399,a_set,[]}]]},{type,400,constraint,[{atom,400,is_subtype},[{var,400,'Set2'},{user_type,400,a_set,[]}]]},{type,401,constraint,[{atom,401,is_subtype},[{var,401,'Set3'},{user_type,401,a_set,[]}]]}]]}]}}]}},{{function,digraph_to_family,2},[{file,[115,111,102,115,46,101,114,108]},{location,1520}],[<<100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,52,55>>,equiv => {function,digraph_to_family,1},signature => [{attribute,1520,spec,{{digraph_to_family,2},[{type,1520,bounded_fun,[{type,1520,'fun',[{type,1520,product,[{var,1520,'Graph'},{var,1520,'Type'}]},{var,1520,'Family'}]},[{type,1521,constraint,[{atom,1521,is_subtype},[{var,1521,'Graph'},{remote_type,1521,[{atom,1521,digraph},{atom,1521,graph},[]]}]]},{type,1522,constraint,[{atom,1522,is_subtype},[{var,1522,'Family'},{user_type,1522,family,[]}]]},{type,1523,constraint,[{atom,1523,is_subtype},[{var,1523,'Type'},{user_type,1523,type,[]}]]}]]}]}}]}},{{function,digraph_to_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,1511}],[<<100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,102,114,111,109,32,116,104,101,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,32>>,{code,[],[<<71,114,97,112,104>>]},<<46,32,69,97,99,104,32,118,101,114,116,101,120,32,97,32,111,102,32>>,{code,[],[<<71,114,97,112,104>>]},<<32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,112,97,105,114,32,40,97,44,194,160,123,98,91,49,93,44,194,160,46,46,46,44,194,160,98,91,110,93,125,41,44,32,119,104,101,114,101,32,116,104,101,32,98,91,105,93,58,115,32,97,114,101,32,116,104,101,32,111,117,116,45,110,101,105,103,104,98,111,114,115,32,111,102,32,97,46,32,73,102,32,110,111,32,116,121,112,101,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32,91,123,97,116,111,109,44,194,160,91,97,116,111,109,93,125,93,32,105,115,32,117,115,101,100,32,97,115,32,116,121,112,101,32,111,102,32,116,104,101,32,102,97,109,105,108,121,46,32,73,116,32,105,115,32,97,115,115,117,109,101,100,32,116,104,97,116,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,118,97,108,105,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,115,101,116,32,111,102,32,116,104,101,32,102,97,109,105,108,121,46>>]},{p,[],[<<73,102,32,71,32,105,115,32,97,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,44,32,105,116,32,104,111,108,100,115,32,116,104,97,116,32,116,104,101,32,118,101,114,116,105,99,101,115,32,97,110,100,32,101,100,103,101,115,32,111,102,32,71,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,118,101,114,116,105,99,101,115,32,97,110,100,32,101,100,103,101,115,32,111,102,32>>,{code,[],[<<102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,40,100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,40,71,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,52,55>>,signature => [{attribute,1511,spec,{{digraph_to_family,1},[{type,1511,bounded_fun,[{type,1511,'fun',[{type,1511,product,[{var,1511,'Graph'}]},{var,1511,'Family'}]},[{type,1512,constraint,[{atom,1512,is_subtype},[{var,1512,'Graph'},{remote_type,1512,[{atom,1512,digraph},{atom,1512,graph},[]]}]]},{type,1513,constraint,[{atom,1513,is_subtype},[{var,1513,'Family'},{user_type,1513,family,[]}]]}]]}]}}]}},{{function,domain,1},[{file,[115,111,102,115,46,101,114,108]},{location,612}],[<<100,111,109,97,105,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,98,125,44,123,50,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,100,111,109,97,105,110,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,49,44,50,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,54,55>>,signature => [{attribute,612,spec,{{domain,1},[{type,612,bounded_fun,[{type,612,'fun',[{type,612,product,[{var,612,'BinRel'}]},{var,612,'Set'}]},[{type,613,constraint,[{atom,613,is_subtype},[{var,613,'BinRel'},{user_type,613,binary_relation,[]}]]},{type,614,constraint,[{atom,614,is_subtype},[{var,614,'Set'},{user_type,614,a_set,[]}]]}]]}]}}]}},{{function,drestriction,2},[{file,[115,111,102,115,46,101,114,108]},{location,833}],[<<100,114,101,115,116,114,105,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,97,110,100,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,116,111,32>>,{code,[],[<<83,101,116>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,50,44,52,44,54,93,41,44,10,82,50,32,61,32,115,111,102,115,58,100,114,101,115,116,114,105,99,116,105,111,110,40,82,49,44,32,83,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,97,125,44,123,51,44,99,125,93>>]}]},{p,[],[{code,[],[<<100,114,101,115,116,114,105,99,116,105,111,110,40,82,44,194,160,83,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<100,105,102,102,101,114,101,110,99,101,40,82,44,194,160,114,101,115,116,114,105,99,116,105,111,110,40,82,44,194,160,83,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,56,49>>,signature => [{attribute,833,spec,{{drestriction,2},[{type,833,bounded_fun,[{type,833,'fun',[{type,833,product,[{var,833,'BinRel1'},{var,833,'Set'}]},{var,833,'BinRel2'}]},[{type,834,constraint,[{atom,834,is_subtype},[{var,834,'BinRel1'},{user_type,834,binary_relation,[]}]]},{type,835,constraint,[{atom,835,is_subtype},[{var,835,'BinRel2'},{user_type,835,binary_relation,[]}]]},{type,836,constraint,[{atom,836,is_subtype},[{var,836,'Set'},{user_type,836,a_set,[]}]]}]]}]}}]}},{{function,drestriction,3},[{file,[115,111,102,115,46,101,114,108]},{location,960}],[<<100,114,101,115,116,114,105,99,116,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,100,111,32,110,111,116,32,103,105,118,101,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<83,101,116,50>>]},<<32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,101,116,70,117,110,32,61,32,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,95,65,44,66,44,67,125,41,32,45,62,32,123,66,44,67,125,32,101,110,100,125,44,10,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,97,97,44,49,125,44,123,98,44,98,98,44,50,125,44,123,99,44,99,99,44,51,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,98,98,44,50,125,44,123,99,99,44,51,125,44,123,100,100,44,52,125,93,41,44,10,82,51,32,61,32,115,111,102,115,58,100,114,101,115,116,114,105,99,116,105,111,110,40,83,101,116,70,117,110,44,32,82,49,44,32,82,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,51,41,46,10,91,123,97,44,97,97,44,49,125,93>>]}]},{p,[],[{code,[],[<<100,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<100,105,102,102,101,114,101,110,99,101,40,83,49,44,194,160,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,48,48>>,signature => [{attribute,960,spec,{{drestriction,3},[{type,960,bounded_fun,[{type,960,'fun',[{type,960,product,[{var,960,'SetFun'},{var,960,'Set1'},{var,960,'Set2'}]},{var,960,'Set3'}]},[{type,961,constraint,[{atom,961,is_subtype},[{var,961,'SetFun'},{user_type,961,set_fun,[]}]]},{type,962,constraint,[{atom,962,is_subtype},[{var,962,'Set1'},{user_type,962,a_set,[]}]]},{type,963,constraint,[{atom,963,is_subtype},[{var,963,'Set2'},{user_type,963,a_set,[]}]]},{type,964,constraint,[{atom,964,is_subtype},[{var,964,'Set3'},{user_type,964,a_set,[]}]]}]]}]}}]}},{{function,empty_set,0},[{file,[115,111,102,115,46,101,114,108]},{location,178}],[<<101,109,112,116,121,95,115,101,116,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116>>]},<<46,32>>,{code,[],[<<101,109,112,116,121,95,115,101,116,40,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,91,93,44,194,160,91,39,95,39,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,50,48>>,signature => [{attribute,178,spec,{{empty_set,0},[{type,178,bounded_fun,[{type,178,'fun',[{type,178,product,[]},{var,178,'Set'}]},[{type,179,constraint,[{atom,179,is_subtype},[{var,179,'Set'},{user_type,179,a_set,[]}]]}]]}]}}]}},{{function,extension,3},[{file,[115,111,102,115,46,101,114,108]},{location,779}],[<<101,120,116,101,110,115,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,110,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,110,115,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,115,117,99,104,32,116,104,97,116,32,102,111,114,32,101,97,99,104,32,101,108,101,109,101,110,116,32,69,32,105,110,32>>,{code,[],[<<83,101,116>>]},<<32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<44,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,112,97,105,114,32,40,69,44,194,160>>,{code,[],[<<65,110,121,83,101,116>>]},<<41,46>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,115,101,116,40,91,98,44,99,93,41,44,10,65,32,61,32,115,111,102,115,58,101,109,112,116,121,95,115,101,116,40,41,44,10,82,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,93,125,93,41,44,10,88,32,61,32,115,111,102,115,58,101,120,116,101,110,115,105,111,110,40,82,44,32,83,44,32,65,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,88,41,46,10,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,93,125,44,123,99,44,91,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,51,48>>,signature => [{attribute,779,spec,{{extension,3},[{type,779,bounded_fun,[{type,779,'fun',[{type,779,product,[{var,779,'BinRel1'},{var,779,'Set'},{var,779,'AnySet'}]},{var,779,'BinRel2'}]},[{type,780,constraint,[{atom,780,is_subtype},[{var,780,'AnySet'},{user_type,780,anyset,[]}]]},{type,781,constraint,[{atom,781,is_subtype},[{var,781,'BinRel1'},{user_type,781,binary_relation,[]}]]},{type,782,constraint,[{atom,782,is_subtype},[{var,782,'BinRel2'},{user_type,782,binary_relation,[]}]]},{type,783,constraint,[{atom,783,is_subtype},[{var,783,'Set'},{user_type,783,a_set,[]}]]}]]}]}}]}},{{function,family,2},[{file,[115,111,102,115,46,101,114,108]},{location,302}],[<<102,97,109,105,108,121,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,53,48>>,equiv => {function,family,1},signature => [{attribute,302,spec,{{family,2},[{type,302,bounded_fun,[{type,302,'fun',[{type,302,product,[{var,302,'Tuples'},{var,302,'Type'}]},{var,302,'Family'}]},[{type,303,constraint,[{atom,303,is_subtype},[{var,303,'Family'},{user_type,303,family,[]}]]},{type,304,constraint,[{atom,304,is_subtype},[{var,304,'Tuples'},{type,304,list,[{type,304,tuple,any}]}]]},{type,305,constraint,[{atom,305,is_subtype},[{var,305,'Type'},{user_type,305,type,[]}]]}]]}]}}]}},{{function,family,1},[{file,[115,111,102,115,46,101,114,108]},{location,290}],[<<102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121,32,111,102,32,115,117,98,115,101,116,115>>]},<<46,32>>,{code,[],[<<102,97,109,105,108,121,40,70,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,70,44,194,160,84,41>>]},<<32,105,102,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,102,97,109,105,108,121,46,32,73,102,32,110,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<91,123,97,116,111,109,44,194,160,91,97,116,111,109,93,125,93>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,102,97,109,105,108,121,32,116,121,112,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,53,48>>,signature => [{attribute,290,spec,{{family,1},[{type,290,bounded_fun,[{type,290,'fun',[{type,290,product,[{var,290,'Tuples'}]},{var,290,'Family'}]},[{type,291,constraint,[{atom,291,is_subtype},[{var,291,'Family'},{user_type,291,family,[]}]]},{type,292,constraint,[{atom,292,is_subtype},[{var,292,'Tuples'},{type,292,list,[{type,292,tuple,any}]}]]}]]}]}}]}},{{function,family_difference,2},[{file,[115,111,102,115,46,101,114,108]},{location,1385}],[<<102,97,109,105,108,121,95,100,105,102,102,101,114,101,110,99,101,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,105,101,115>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,101,113,117,97,108,32,116,111,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<91,105,93,32,105,115,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,102,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,109,97,112,115,32,105,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,97,109,105,108,121,49,91,105,93>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,98,44,91,52,44,53,93,125,44,123,99,44,91,54,44,55,93,125,93,41,44,10,70,51,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,100,105,102,102,101,114,101,110,99,101,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,51,41,46,10,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,54,52>>,signature => [{attribute,1385,spec,{{family_difference,2},[{type,1385,bounded_fun,[{type,1385,'fun',[{type,1385,product,[{var,1385,'Family1'},{var,1385,'Family2'}]},{var,1385,'Family3'}]},[{type,1386,constraint,[{atom,1386,is_subtype},[{var,1386,'Family1'},{user_type,1386,family,[]}]]},{type,1387,constraint,[{atom,1387,is_subtype},[{var,1387,'Family2'},{user_type,1387,family,[]}]]},{type,1388,constraint,[{atom,1388,is_subtype},[{var,1388,'Family3'},{user_type,1388,family,[]}]]}]]}]}}]}},{{function,family_domain,1},[{file,[115,111,102,115,46,101,114,108]},{location,1341}],[<<102,97,109,105,108,121,95,100,111,109,97,105,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49,91,105,93>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,82,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,125,44,123,98,44,91,93,125,44,123,99,44,91,123,52,44,100,125,44,123,53,44,101,125,93,125,93,41,44,10,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,100,111,109,97,105,110,40,70,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,93,125,44,123,99,44,91,52,44,53,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,56,53>>,signature => [{attribute,1341,spec,{{family_domain,1},[{type,1341,bounded_fun,[{type,1341,'fun',[{type,1341,product,[{var,1341,'Family1'}]},{var,1341,'Family2'}]},[{type,1342,constraint,[{atom,1342,is_subtype},[{var,1342,'Family1'},{user_type,1342,family,[]}]]},{type,1343,constraint,[{atom,1343,is_subtype},[{var,1343,'Family2'},{user_type,1343,family,[]}]]}]]}]}}]}},{{function,family_field,1},[{file,[115,111,102,115,46,101,114,108]},{location,1365}],[<<102,97,109,105,108,121,95,102,105,101,108,100,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,105,101,108,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,101,108,100>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,82,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,125,44,123,98,44,91,93,125,44,123,99,44,91,123,52,44,100,125,44,123,53,44,101,125,93,125,93,41,44,10,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,102,105,101,108,100,40,70,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,91,49,44,50,44,51,44,97,44,98,44,99,93,125,44,123,98,44,91,93,125,44,123,99,44,91,52,44,53,44,100,44,101,93,125,93>>]}]},{p,[],[{code,[],[<<102,97,109,105,108,121,95,102,105,101,108,100,40,70,97,109,105,108,121,49,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,97,109,105,108,121,95,117,110,105,111,110,40,102,97,109,105,108,121,95,100,111,109,97,105,110,40,70,97,109,105,108,121,49,41,44,32,102,97,109,105,108,121,95,114,97,110,103,101,40,70,97,109,105,108,121,49,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,48,54>>,signature => [{attribute,1365,spec,{{family_field,1},[{type,1365,bounded_fun,[{type,1365,'fun',[{type,1365,product,[{var,1365,'Family1'}]},{var,1365,'Family2'}]},[{type,1366,constraint,[{atom,1366,is_subtype},[{var,1366,'Family1'},{user_type,1366,family,[]}]]},{type,1367,constraint,[{atom,1367,is_subtype},[{var,1367,'Family2'},{user_type,1367,family,[]}]]}]]}]}}]}},{{function,family_intersection,1},[{file,[115,111,102,115,46,101,114,108]},{location,1325}],[<<102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,115,101,116,32,111,102,32,115,101,116,115,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,116,101,114,115,101,99,116,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,110,32,101,109,112,116,121,32,115,101,116,32,102,111,114,32,115,111,109,101,32,105,44,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,109,101,115,115,97,103,101,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,91,49,44,50,44,51,93,44,91,50,44,51,44,52,93,93,125,44,123,98,44,91,91,120,44,121,44,122,93,44,91,120,44,121,93,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,40,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,97,44,91,50,44,51,93,125,44,123,98,44,91,120,44,121,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,51,48>>,signature => [{attribute,1325,spec,{{family_intersection,1},[{type,1325,bounded_fun,[{type,1325,'fun',[{type,1325,product,[{var,1325,'Family1'}]},{var,1325,'Family2'}]},[{type,1326,constraint,[{atom,1326,is_subtype},[{var,1326,'Family1'},{user_type,1326,family,[]}]]},{type,1327,constraint,[{atom,1327,is_subtype},[{var,1327,'Family2'},{user_type,1327,family,[]}]]}]]}]}}]}},{{function,family_intersection,2},[{file,[115,111,102,115,46,101,114,108]},{location,1378}],[<<102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,105,101,115>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<58,115,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<58,115,32,105,110,100,101,120,32,115,101,116,115,44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<91,105,93,32,105,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,93,125,44,123,99,44,91,53,44,54,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,98,44,91,52,44,53,93,125,44,123,99,44,91,55,44,56,93,125,44,123,100,44,91,57,44,49,48,93,125,93,41,44,10,70,51,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,51,41,46,10,91,123,98,44,91,52,93,125,44,123,99,44,91,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,53,52>>,signature => [{attribute,1378,spec,{{family_intersection,2},[{type,1378,bounded_fun,[{type,1378,'fun',[{type,1378,product,[{var,1378,'Family1'},{var,1378,'Family2'}]},{var,1378,'Family3'}]},[{type,1379,constraint,[{atom,1379,is_subtype},[{var,1379,'Family1'},{user_type,1379,family,[]}]]},{type,1380,constraint,[{atom,1380,is_subtype},[{var,1380,'Family2'},{user_type,1380,family,[]}]]},{type,1381,constraint,[{atom,1381,is_subtype},[{var,1381,'Family3'},{user_type,1381,family,[]}]]}]]}]}}]}},{{function,family_projection,2},[{file,[115,111,102,115,46,101,114,108]},{location,1451}],[<<102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,99,97,108,108,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,119,105,116,104,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,91,49,44,50,93,44,91,50,44,51,93,93,125,44,123,98,44,91,91,93,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,40,102,117,110,32,115,111,102,115,58,117,110,105,111,110,47,49,44,32,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,55,52>>,signature => [{attribute,1451,spec,{{family_projection,2},[{type,1451,bounded_fun,[{type,1451,'fun',[{type,1451,product,[{var,1451,'SetFun'},{var,1451,'Family1'}]},{var,1451,'Family2'}]},[{type,1452,constraint,[{atom,1452,is_subtype},[{var,1452,'SetFun'},{user_type,1452,set_fun,[]}]]},{type,1453,constraint,[{atom,1453,is_subtype},[{var,1453,'Family1'},{user_type,1453,family,[]}]]},{type,1454,constraint,[{atom,1454,is_subtype},[{var,1454,'Family2'},{user_type,1454,family,[]}]]}]]}]}}]}},{{function,family_range,1},[{file,[115,111,102,115,46,101,114,108]},{location,1353}],[<<102,97,109,105,108,121,95,114,97,110,103,101,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,97,110,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,97,110,103,101>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,82,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,125,44,123,98,44,91,93,125,44,123,99,44,91,123,52,44,100,125,44,123,53,44,101,125,93,125,93,41,44,10,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,114,97,110,103,101,40,70,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,91,97,44,98,44,99,93,125,44,123,98,44,91,93,125,44,123,99,44,91,100,44,101,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,57,51>>,signature => [{attribute,1353,spec,{{family_range,1},[{type,1353,bounded_fun,[{type,1353,'fun',[{type,1353,product,[{var,1353,'Family1'}]},{var,1353,'Family2'}]},[{type,1354,constraint,[{atom,1354,is_subtype},[{var,1354,'Family1'},{user_type,1354,family,[]}]]},{type,1355,constraint,[{atom,1355,is_subtype},[{var,1355,'Family2'},{user_type,1355,family,[]}]]}]]}]}}]}},{{function,family_specification,2},[{file,[115,111,102,115,46,101,114,108]},{location,1265}],[<<102,97,109,105,108,121,95,115,112,101,99,105,102,105,99,97,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,116,111,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,105,32,111,102,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,102,111,114,32,119,104,105,99,104,32>>,{code,[],[<<70,117,110>>]},<<32,97,112,112,108,105,101,100,32,116,111,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,194,160,70,117,110,50,125>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,117,110,50>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,49,44,50,93,125,44,123,99,44,91,49,93,125,93,41,44,10,83,112,101,99,70,117,110,32,61,32,102,117,110,40,83,41,32,45,62,32,115,111,102,115,58,110,111,95,101,108,101,109,101,110,116,115,40,83,41,32,61,58,61,32,50,32,101,110,100,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,115,112,101,99,105,102,105,99,97,116,105,111,110,40,83,112,101,99,70,117,110,44,32,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,98,44,91,49,44,50,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,49,52>>,signature => [{attribute,1265,spec,{{family_specification,2},[{type,1265,bounded_fun,[{type,1265,'fun',[{type,1265,product,[{var,1265,'Fun'},{var,1265,'Family1'}]},{var,1265,'Family2'}]},[{type,1266,constraint,[{atom,1266,is_subtype},[{var,1266,'Fun'},{user_type,1266,spec_fun,[]}]]},{type,1267,constraint,[{atom,1267,is_subtype},[{var,1267,'Family1'},{user_type,1267,family,[]}]]},{type,1268,constraint,[{atom,1268,is_subtype},[{var,1268,'Family2'},{user_type,1268,family,[]}]]}]]}]}}]}},{{function,family_to_digraph,2},[{file,[115,111,102,115,46,101,114,108]},{location,1489}],[<<102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,51,57>>,equiv => {function,family_to_digraph,1},signature => [{attribute,1489,spec,{{family_to_digraph,2},[{type,1489,bounded_fun,[{type,1489,'fun',[{type,1489,product,[{var,1489,'Family'},{var,1489,'GraphType'}]},{var,1489,'Graph'}]},[{type,1490,constraint,[{atom,1490,is_subtype},[{var,1490,'Graph'},{remote_type,1490,[{atom,1490,digraph},{atom,1490,graph},[]]}]]},{type,1491,constraint,[{atom,1491,is_subtype},[{var,1491,'Family'},{user_type,1491,family,[]}]]},{type,1492,constraint,[{atom,1492,is_subtype},[{var,1492,'GraphType'},{type,1492,list,[{remote_type,1492,[{atom,1492,digraph},{atom,1492,d_type},[]]}]}]]}]]}]}}]}},{{function,family_to_digraph,1},[{file,[115,111,102,115,46,101,114,108]},{location,1479}],[<<102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,32,102,114,111,109,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<46,32,70,111,114,32,101,97,99,104,32,112,97,105,114,32,40,97,44,194,160,123,98,91,49,93,44,194,160,46,46,46,44,194,160,98,91,110,93,125,41,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<44,32,118,101,114,116,101,120,32,97,32,97,110,100,32,116,104,101,32,101,100,103,101,115,32,40,97,44,194,160,98,91,105,93,41,32,102,111,114,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,32,97,114,101,32,97,100,100,101,100,32,116,111,32,97,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,46>>]},{p,[],[<<73,102,32,110,111,32,103,114,97,112,104,32,116,121,112,101,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32>>,{a,[{href,<<115,116,100,108,105,98,58,100,105,103,114,97,112,104,35,110,101,119,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,105,103,114,97,112,104,58,110,101,119,47,48>>]}]},<<32,105,115,32,117,115,101,100,32,102,111,114,32,99,114,101,97,116,105,110,103,32,116,104,101,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,44,32,111,116,104,101,114,119,105,115,101,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<71,114,97,112,104,84,121,112,101>>]},<<32,105,115,32,112,97,115,115,101,100,32,111,110,32,97,115,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,100,105,103,114,97,112,104,35,110,101,119,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,105,103,114,97,112,104,58,110,101,119,47,49>>]}]},<<46>>]},{p,[],[<<73,116,32,70,32,105,115,32,97,32,102,97,109,105,108,121,44,32,105,116,32,104,111,108,100,115,32,116,104,97,116,32,70,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,40,102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,40,70,41,44,194,160,116,121,112,101,40,70,41,41>>]},<<46,32,69,113,117,97,108,105,116,121,32,104,111,108,100,115,32,105,102,32>>,{code,[],[<<117,110,105,111,110,95,111,102,95,102,97,109,105,108,121,40,70,41>>]},<<32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<100,111,109,97,105,110,40,70,41>>]},<<46>>]},{p,[],[<<67,114,101,97,116,105,110,103,32,97,32,99,121,99,108,101,32,105,110,32,97,110,32,97,99,121,99,108,105,99,32,103,114,97,112,104,32,101,120,105,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<99,121,99,108,105,99>>]},<<32,109,101,115,115,97,103,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,51,57>>,signature => [{attribute,1479,spec,{{family_to_digraph,1},[{type,1479,bounded_fun,[{type,1479,'fun',[{type,1479,product,[{var,1479,'Family'}]},{var,1479,'Graph'}]},[{type,1480,constraint,[{atom,1480,is_subtype},[{var,1480,'Graph'},{remote_type,1480,[{atom,1480,digraph},{atom,1480,graph},[]]}]]},{type,1481,constraint,[{atom,1481,is_subtype},[{var,1481,'Family'},{user_type,1481,family,[]}]]}]]}]}}]}},{{function,family_to_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,1253}],[<<102,97,109,105,108,121,95,116,111,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,112,97,105,114,115,32,40,105,44,194,160,120,41,32,115,117,99,104,32,116,104,97,116,32,105,32,98,101,108,111,110,103,115,32,116,111,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,97,110,100,32,120,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,93,125,44,32,123,98,44,91,49,93,125,44,32,123,99,44,91,50,44,51,93,125,93,41,44,10,82,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,116,111,95,114,101,108,97,116,105,111,110,40,70,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,41,46,10,91,123,98,44,49,125,44,123,99,44,50,125,44,123,99,44,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,54,53>>,signature => [{attribute,1253,spec,{{family_to_relation,1},[{type,1253,bounded_fun,[{type,1253,'fun',[{type,1253,product,[{var,1253,'Family'}]},{var,1253,'BinRel'}]},[{type,1254,constraint,[{atom,1254,is_subtype},[{var,1254,'Family'},{user_type,1254,family,[]}]]},{type,1255,constraint,[{atom,1255,is_subtype},[{var,1255,'BinRel'},{user_type,1255,binary_relation,[]}]]}]]}]}}]}},{{function,family_union,1},[{file,[115,111,102,115,46,101,114,108]},{location,1314}],[<<102,97,109,105,108,121,95,117,110,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,115,101,116,32,111,102,32,115,101,116,115,32,102,111,114,32,101,97,99,104,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,91,49,44,50,93,44,91,50,44,51,93,93,125,44,123,98,44,91,91,93,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,117,110,105,111,110,40,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,93,125,93>>]}]},{p,[],[{code,[],[<<102,97,109,105,108,121,95,117,110,105,111,110,40,70,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,40,102,117,110,32,115,111,102,115,58,117,110,105,111,110,47,49,44,194,160,70,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,56,51>>,signature => [{attribute,1314,spec,{{family_union,1},[{type,1314,bounded_fun,[{type,1314,'fun',[{type,1314,product,[{var,1314,'Family1'}]},{var,1314,'Family2'}]},[{type,1315,constraint,[{atom,1315,is_subtype},[{var,1315,'Family1'},{user_type,1315,family,[]}]]},{type,1316,constraint,[{atom,1316,is_subtype},[{var,1316,'Family2'},{user_type,1316,family,[]}]]}]]}]}}]}},{{function,family_union,2},[{file,[115,111,102,115,46,101,114,108]},{location,1371}],[<<102,97,109,105,108,121,95,117,110,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,105,101,115>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<58,115,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<58,115,32,105,110,100,101,120,32,115,101,116,115,44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<91,105,93,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,102,32,98,111,116,104,32,109,97,112,32,105,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,111,114,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,93,125,44,123,99,44,91,53,44,54,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,98,44,91,52,44,53,93,125,44,123,99,44,91,55,44,56,93,125,44,123,100,44,91,57,44,49,48,93,125,93,41,44,10,70,51,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,117,110,105,111,110,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,51,41,46,10,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,44,53,93,125,44,123,99,44,91,53,44,54,44,55,44,56,93,125,44,123,100,44,91,57,44,49,48,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,48,54>>,signature => [{attribute,1371,spec,{{family_union,2},[{type,1371,bounded_fun,[{type,1371,'fun',[{type,1371,product,[{var,1371,'Family1'},{var,1371,'Family2'}]},{var,1371,'Family3'}]},[{type,1372,constraint,[{atom,1372,is_subtype},[{var,1372,'Family1'},{user_type,1372,family,[]}]]},{type,1373,constraint,[{atom,1373,is_subtype},[{var,1373,'Family2'},{user_type,1373,family,[]}]]},{type,1374,constraint,[{atom,1374,is_subtype},[{var,1374,'Family3'},{user_type,1374,family,[]}]]}]]}]}}]}},{{function,field,1},[{file,[115,111,102,115,46,101,114,108]},{location,632}],[<<102,105,101,108,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,105,101,108,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,101,108,100>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,98,125,44,123,50,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,102,105,101,108,100,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,49,44,50,44,97,44,98,44,99,93>>]}]},{p,[],[{code,[],[<<102,105,101,108,100,40,82,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<117,110,105,111,110,40,100,111,109,97,105,110,40,82,41,44,32,114,97,110,103,101,40,82,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,50,56>>,signature => [{attribute,632,spec,{{field,1},[{type,632,bounded_fun,[{type,632,'fun',[{type,632,product,[{var,632,'BinRel'}]},{var,632,'Set'}]},[{type,633,constraint,[{atom,633,is_subtype},[{var,633,'BinRel'},{user_type,633,binary_relation,[]}]]},{type,634,constraint,[{atom,634,is_subtype},[{var,634,'Set'},{user_type,634,a_set,[]}]]}]]}]}}]}},{{function,from_external,2},[{file,[115,111,102,115,46,101,114,108]},{location,169}],[<<102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,115,101,116,32,102,114,111,109,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32>>,{code,[],[<<69,120,116,101,114,110,97,108,83,101,116>>]},<<32,97,110,100,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32>>,{code,[],[<<84,121,112,101>>]},<<46,32,73,116,32,105,115,32,97,115,115,117,109,101,100,32,116,104,97,116,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,118,97,108,105,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,111,102,32>>,{code,[],[<<69,120,116,101,114,110,97,108,83,101,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,52,52>>,signature => [{attribute,169,spec,{{from_external,2},[{type,169,bounded_fun,[{type,169,'fun',[{type,169,product,[{var,169,'ExternalSet'},{var,169,'Type'}]},{var,169,'AnySet'}]},[{type,170,constraint,[{atom,170,is_subtype},[{var,170,'ExternalSet'},{user_type,170,external_set,[]}]]},{type,171,constraint,[{atom,171,is_subtype},[{var,171,'AnySet'},{user_type,171,anyset,[]}]]},{type,172,constraint,[{atom,172,is_subtype},[{var,172,'Type'},{user_type,172,type,[]}]]}]]}]}}]}},{{function,from_sets,1},[{file,[115,111,102,115,46,101,114,108]},{location,220}],[<<102,114,111,109,95,115,101,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,101,116,115,32,111,102,32,108,105,115,116,32>>,{code,[],[<<76,105,115,116,79,102,83,101,116,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,93,41,44,10,83,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,120,44,51,125,44,123,121,44,52,125,93,41,44,10,83,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,91,83,49,44,83,50,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,91,123,97,44,49,125,44,123,98,44,50,125,93,44,91,123,120,44,51,125,44,123,121,44,52,125,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,53,55>>,signature => [{attribute,220,spec,{{from_sets,1},[{type,220,bounded_fun,[{type,220,'fun',[{type,220,product,[{var,220,'ListOfSets'}]},{var,220,'Set'}]},[{type,221,constraint,[{atom,221,is_subtype},[{var,221,'Set'},{user_type,221,a_set,[]}]]},{type,222,constraint,[{atom,222,is_subtype},[{var,222,'ListOfSets'},{type,222,list,[{user_type,222,anyset,[]}]}]]}]]}]}}]}},{{function,from_sets,1},[{file,[115,111,102,115,46,101,114,108]},{location,220}],[<<102,114,111,109,95,115,101,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<111,114,100,101,114,101,100,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,101,116,115,32,111,102,32,116,104,101,32,110,111,110,45,101,109,112,116,121,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,79,102,83,101,116,115>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,55,51>>,signature => [{attribute,220,spec,{{from_sets,1},[{type,223,bounded_fun,[{type,223,'fun',[{type,223,product,[{var,223,'TupleOfSets'}]},{var,223,'Ordset'}]},[{type,224,constraint,[{atom,224,is_subtype},[{var,224,'Ordset'},{user_type,224,ordset,[]}]]},{type,225,constraint,[{atom,225,is_subtype},[{var,225,'TupleOfSets'},{user_type,225,tuple_of,[{user_type,225,anyset,[]}]}]]}]]}]}}]}},{{function,from_term,2},[{file,[115,111,102,115,46,101,114,108]},{location,155}],[<<102,114,111,109,95,116,101,114,109,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,56,51>>,equiv => {function,from_term,1},signature => [{attribute,155,spec,{{from_term,2},[{type,155,bounded_fun,[{type,155,'fun',[{type,155,product,[{var,155,'Term'},{var,155,'Type'}]},{var,155,'AnySet'}]},[{type,156,constraint,[{atom,156,is_subtype},[{var,156,'AnySet'},{user_type,156,anyset,[]}]]},{type,157,constraint,[{atom,157,is_subtype},[{var,157,'Term'},{type,157,term,[]}]]},{type,158,constraint,[{atom,158,is_subtype},[{var,158,'Type'},{user_type,158,type,[]}]]}]]}]}}]}},{{function,from_term,1},[{file,[115,111,102,115,46,101,114,108]},{location,143}],[<<102,114,111,109,95,116,101,114,109,47,49>>],#{<<101,110>> => [{p,[],[{a,[{id,<<102,114,111,109,95,116,101,114,109>>}],[]},<<67,114,101,97,116,101,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,101,116,115>>]},<<32,98,121,32,116,114,97,118,101,114,115,105,110,103,32,116,101,114,109,32>>,{code,[],[<<84,101,114,109>>]},<<44,32,115,111,114,116,105,110,103,32,108,105,115,116,115,44,32,114,101,109,111,118,105,110,103,32,100,117,112,108,105,99,97,116,101,115,44,32,97,110,100,32,100,101,114,105,118,105,110,103,32,111,114,32,118,101,114,105,102,121,105,110,103,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,118,97,108,105,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,102,111,114,32,116,104,101,32,115,111,32,111,98,116,97,105,110,101,100,32,101,120,116,101,114,110,97,108,32,115,101,116,46,32,65,110,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32>>,{code,[],[<<84,121,112,101>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,108,105,109,105,116,32,116,104,101,32,100,101,112,116,104,32,111,102,32,116,104,101,32,116,114,97,118,101,114,115,97,108,59,32,97,110,32,97,116,111,109,105,99,32,116,121,112,101,32,115,116,111,112,115,32,116,104,101,32,116,114,97,118,101,114,115,97,108,44,32,97,115,32,115,104,111,119,110,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,119,104,101,114,101,32>>,{code,[],[<<34,102,111,111,34>>]},<<32,97,110,100,32>>,{code,[],[<<123,34,102,111,111,34,125>>]},<<32,97,114,101,32,108,101,102,116,32,117,110,109,111,100,105,102,105,101,100,58>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,123,34,102,111,111,34,125,44,91,49,44,49,93,125,44,123,34,102,111,111,34,44,91,50,44,50,93,125,93,44,10,91,123,97,116,111,109,44,91,97,116,111,109,93,125,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,123,123,34,102,111,111,34,125,44,91,49,93,125,44,123,34,102,111,111,34,44,91,50,93,125,93>>]}]},{p,[],[{code,[],[<<102,114,111,109,95,116,101,114,109>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,99,114,101,97,116,105,110,103,32,97,116,111,109,105,99,32,111,114,32,111,114,100,101,114,101,100,32,115,101,116,115,46,32,84,104,101,32,111,110,108,121,32,112,117,114,112,111,115,101,32,111,102,32,115,117,99,104,32,97,32,115,101,116,32,105,115,32,116,104,97,116,32,111,102,32,108,97,116,101,114,32,98,117,105,108,100,105,110,103,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,44,32,97,115,32,97,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,32,116,104,97,116,32>>,{em,[],[<<100,111>>]},<<32,97,110,121,116,104,105,110,103,32,111,112,101,114,97,116,101,32,111,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,46,32,67,114,101,97,116,105,110,103,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,32,102,114,111,109,32,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,111,114,100,101,114,101,100,32,115,101,116,115,32,99,97,110,32,98,101,32,116,104,101,32,119,97,121,32,116,111,32,103,111,32,105,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,98,105,103,32,97,110,100,32,111,110,101,32,100,111,101,115,32,110,111,116,32,119,97,110,116,32,116,111,32,119,97,115,116,101,32,104,101,97,112,32,98,121,32,114,101,98,117,105,108,100,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,115,104,111,119,115,32,116,104,97,116,32,97,32,115,101,116,32,99,97,110,32,98,101,32,98,117,105,108,116,32,34,108,97,121,101,114,32,98,121,32,108,97,121,101,114,34,58>>]},{pre,[],[{code,[],[<<49,62,32,65,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,97,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,44,51,93,41,44,10,80,49,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,123,65,44,83,125,41,44,10,80,50,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,123,98,44,91,54,44,53,44,52,93,125,41,44,10,83,115,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,91,80,49,44,80,50,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,115,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,52,44,53,44,54,93,125,93>>]}]},{p,[],[<<79,116,104,101,114,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,99,114,101,97,116,101,32,115,101,116,115,32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,115,101,116,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,115,101,116,115,47,49>>]}]},<<46,32,83,112,101,99,105,97,108,32,99,97,115,101,115,32,111,102,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,47,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,97,95,102,117,110,99,116,105,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,95,102,117,110,99,116,105,111,110,47,49,44,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,109,112,116,121,95,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,109,112,116,121,95,115,101,116,47,48>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,97,109,105,108,121,47,49,44,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,108,97,116,105,111,110,47,49,44,50>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,101,116,47,49,44,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,56,51>>,signature => [{attribute,143,spec,{{from_term,1},[{type,143,bounded_fun,[{type,143,'fun',[{type,143,product,[{var,143,'Term'}]},{var,143,'AnySet'}]},[{type,144,constraint,[{atom,144,is_subtype},[{var,144,'AnySet'},{user_type,144,anyset,[]}]]},{type,145,constraint,[{atom,145,is_subtype},[{var,145,'Term'},{type,145,term,[]}]]}]]}]}}]}},{{function,image,2},[{file,[115,111,102,115,46,101,114,108]},{location,717}],[<<105,109,97,103,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,109,97,103,101>>]},<<32,111,102,32,115,101,116,32>>,{code,[],[<<83,101,116,49>>]},<<32,117,110,100,101,114,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,50,44,99,125,44,123,51,44,100,125,93,41,44,10,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,93,41,44,10,83,50,32,61,32,115,111,102,115,58,105,109,97,103,101,40,82,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,97,44,98,44,99,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,51,51>>,signature => [{attribute,717,spec,{{image,2},[{type,717,bounded_fun,[{type,717,'fun',[{type,717,product,[{var,717,'BinRel'},{var,717,'Set1'}]},{var,717,'Set2'}]},[{type,718,constraint,[{atom,718,is_subtype},[{var,718,'BinRel'},{user_type,718,binary_relation,[]}]]},{type,719,constraint,[{atom,719,is_subtype},[{var,719,'Set1'},{user_type,719,a_set,[]}]]},{type,720,constraint,[{atom,720,is_subtype},[{var,720,'Set2'},{user_type,720,a_set,[]}]]}]]}]}}]}},{{function,intersection,1},[{file,[115,111,102,115,46,101,114,108]},{location,563}],[<<105,110,116,101,114,115,101,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,116,101,114,115,101,99,116,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,115,101,116,115,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<46>>]},{p,[],[<<73,110,116,101,114,115,101,99,116,105,110,103,32,97,110,32,101,109,112,116,121,32,115,101,116,32,111,102,32,115,101,116,115,32,101,120,105,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,109,101,115,115,97,103,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,52,57>>,signature => [{attribute,563,spec,{{intersection,1},[{type,563,bounded_fun,[{type,563,'fun',[{type,563,product,[{var,563,'SetOfSets'}]},{var,563,'Set'}]},[{type,564,constraint,[{atom,564,is_subtype},[{var,564,'Set'},{user_type,564,a_set,[]}]]},{type,565,constraint,[{atom,565,is_subtype},[{var,565,'SetOfSets'},{user_type,565,set_of_sets,[]}]]}]]}]}}]}},{{function,intersection,2},[{file,[115,111,102,115,46,101,114,108]},{location,388}],[<<105,110,116,101,114,115,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,116,101,114,115,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,54,49>>,signature => [{attribute,388,spec,{{intersection,2},[{type,388,bounded_fun,[{type,388,'fun',[{type,388,product,[{var,388,'Set1'},{var,388,'Set2'}]},{var,388,'Set3'}]},[{type,389,constraint,[{atom,389,is_subtype},[{var,389,'Set1'},{user_type,389,a_set,[]}]]},{type,390,constraint,[{atom,390,is_subtype},[{var,390,'Set2'},{user_type,390,a_set,[]}]]},{type,391,constraint,[{atom,391,is_subtype},[{var,391,'Set3'},{user_type,391,a_set,[]}]]}]]}]}}]}},{{function,intersection_of_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,1299}],[<<105,110,116,101,114,115,101,99,116,105,111,110,95,111,102,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<46>>]},{p,[],[<<73,110,116,101,114,115,101,99,116,105,110,103,32,97,110,32,101,109,112,116,121,32,102,97,109,105,108,121,32,101,120,105,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,109,101,115,115,97,103,101,46>>]},{pre,[],[{code,[],[<<49,62,32,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,48,44,50,44,52,93,125,44,123,98,44,91,48,44,49,44,50,93,125,44,123,99,44,91,50,44,51,93,125,93,41,44,10,83,32,61,32,115,111,102,115,58,105,110,116,101,114,115,101,99,116,105,111,110,95,111,102,95,102,97,109,105,108,121,40,70,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,50,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,55,49>>,signature => [{attribute,1299,spec,{{intersection_of_family,1},[{type,1299,bounded_fun,[{type,1299,'fun',[{type,1299,product,[{var,1299,'Family'}]},{var,1299,'Set'}]},[{type,1300,constraint,[{atom,1300,is_subtype},[{var,1300,'Family'},{user_type,1300,family,[]}]]},{type,1301,constraint,[{atom,1301,is_subtype},[{var,1301,'Set'},{user_type,1301,a_set,[]}]]}]]}]}}]}},{{function,inverse,1},[{file,[115,111,102,115,46,101,114,108]},{location,872}],[<<105,110,118,101,114,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,118,101,114,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,118,101,114,115,101>>]},<<32,111,102,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<70,117,110,99,116,105,111,110,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,105,110,118,101,114,115,101,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,97,44,49,125,44,123,98,44,50,125,44,123,99,44,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,56,56>>,signature => [{attribute,872,spec,{{inverse,1},[{type,872,bounded_fun,[{type,872,'fun',[{type,872,product,[{var,872,'Function1'}]},{var,872,'Function2'}]},[{type,873,constraint,[{atom,873,is_subtype},[{var,873,'Function1'},{user_type,873,a_function,[]}]]},{type,874,constraint,[{atom,874,is_subtype},[{var,874,'Function2'},{user_type,874,a_function,[]}]]}]]}]}}]}},{{function,inverse_image,2},[{file,[115,111,102,115,46,101,114,108]},{location,734}],[<<105,110,118,101,114,115,101,95,105,109,97,103,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,118,101,114,115,101,95,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,118,101,114,115,101,32,105,109,97,103,101>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,117,110,100,101,114,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,50,44,99,125,44,123,51,44,100,125,93,41,44,10,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,99,44,100,44,101,93,41,44,10,83,50,32,61,32,115,111,102,115,58,105,110,118,101,114,115,101,95,105,109,97,103,101,40,82,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,50,44,51,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,48,50>>,signature => [{attribute,734,spec,{{inverse_image,2},[{type,734,bounded_fun,[{type,734,'fun',[{type,734,product,[{var,734,'BinRel'},{var,734,'Set1'}]},{var,734,'Set2'}]},[{type,735,constraint,[{atom,735,is_subtype},[{var,735,'BinRel'},{user_type,735,binary_relation,[]}]]},{type,736,constraint,[{atom,736,is_subtype},[{var,736,'Set1'},{user_type,736,a_set,[]}]]},{type,737,constraint,[{atom,737,is_subtype},[{var,737,'Set2'},{user_type,737,a_set,[]}]]}]]}]}}]}},{{function,is_a_function,1},[{file,[115,111,102,115,46,101,114,108]},{location,812}],[<<105,115,95,97,95,102,117,110,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<32,111,114,32,116,104,101,32,117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,49,57>>,signature => [{attribute,812,spec,{{is_a_function,1},[{type,812,bounded_fun,[{type,812,'fun',[{type,812,product,[{var,812,'BinRel'}]},{var,812,'Bool'}]},[{type,813,constraint,[{atom,813,is_subtype},[{var,813,'Bool'},{type,813,boolean,[]}]]},{type,814,constraint,[{atom,814,is_subtype},[{var,814,'BinRel'},{user_type,814,binary_relation,[]}]]}]]}]}}]}},{{function,is_disjoint,2},[{file,[115,111,102,115,46,101,114,108]},{location,535}],[<<105,115,95,100,105,115,106,111,105,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,105,115,106,111,105,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,115,106,111,105,110,116>>]},<<44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,50,57>>,signature => [{attribute,535,spec,{{is_disjoint,2},[{type,535,bounded_fun,[{type,535,'fun',[{type,535,product,[{var,535,'Set1'},{var,535,'Set2'}]},{var,535,'Bool'}]},[{type,536,constraint,[{atom,536,is_subtype},[{var,536,'Bool'},{type,536,boolean,[]}]]},{type,537,constraint,[{atom,537,is_subtype},[{var,537,'Set1'},{user_type,537,a_set,[]}]]},{type,538,constraint,[{atom,538,is_subtype},[{var,538,'Set2'},{user_type,538,a_set,[]}]]}]]}]}}]}},{{function,is_empty_set,1},[{file,[115,111,102,115,46,101,114,108]},{location,527}],[<<105,115,95,101,109,112,116,121,95,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<32,105,115,32,97,110,32,101,109,112,116,121,32,117,110,111,114,100,101,114,101,100,32,115,101,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,52,48>>,signature => [{attribute,527,spec,{{is_empty_set,1},[{type,527,bounded_fun,[{type,527,'fun',[{type,527,product,[{var,527,'AnySet'}]},{var,527,'Bool'}]},[{type,528,constraint,[{atom,528,is_subtype},[{var,528,'AnySet'},{user_type,528,anyset,[]}]]},{type,529,constraint,[{atom,529,is_subtype},[{var,529,'Bool'},{type,529,boolean,[]}]]}]]}]}}]}},{{function,is_equal,2},[{file,[115,111,102,115,46,101,114,108]},{location,480}],[<<105,115,95,101,113,117,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<65,110,121,83,101,116,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,113,117,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,113,117,97,108>>]},<<44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,115,104,111,119,115,32,116,104,97,116,32>>,{code,[],[<<61,61,47,50>>]},<<32,105,115,32,117,115,101,100,32,119,104,101,110,32,99,111,109,112,97,114,105,110,103,32,115,101,116,115,32,102,111,114,32,101,113,117,97,108,105,116,121,58>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,46,48,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,49,93,41,44,10,115,111,102,115,58,105,115,95,101,113,117,97,108,40,83,49,44,32,83,50,41,46,10,116,114,117,101>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,52,57>>,signature => [{attribute,480,spec,{{is_equal,2},[{type,480,bounded_fun,[{type,480,'fun',[{type,480,product,[{var,480,'AnySet1'},{var,480,'AnySet2'}]},{var,480,'Bool'}]},[{type,481,constraint,[{atom,481,is_subtype},[{var,481,'AnySet1'},{user_type,481,anyset,[]}]]},{type,482,constraint,[{atom,482,is_subtype},[{var,482,'AnySet2'},{user_type,482,anyset,[]}]]},{type,483,constraint,[{atom,483,is_subtype},[{var,483,'Bool'},{type,483,boolean,[]}]]}]]}]}}]}},{{function,is_set,1},[{file,[115,111,102,115,46,101,114,108]},{location,519}],[<<105,115,95,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<32,105,115,32,97,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<32,105,115,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,32,111,114,32,97,110,32,97,116,111,109,105,99,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,54,54>>,signature => [{attribute,519,spec,{{is_set,1},[{type,519,bounded_fun,[{type,519,'fun',[{type,519,product,[{var,519,'AnySet'}]},{var,519,'Bool'}]},[{type,520,constraint,[{atom,520,is_subtype},[{var,520,'AnySet'},{user_type,520,anyset,[]}]]},{type,521,constraint,[{atom,521,is_subtype},[{var,521,'Bool'},{type,521,boolean,[]}]]}]]}]}}]}},{{function,is_sofs_set,1},[{file,[115,111,102,115,46,101,114,108]},{location,509}],[<<105,115,95,115,111,102,115,95,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<44,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,44,32,111,114,32,97,110,32,97,116,111,109,105,99,32,115,101,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,55,55>>,signature => [{attribute,509,spec,{{is_sofs_set,1},[{type,509,bounded_fun,[{type,509,'fun',[{type,509,product,[{var,509,'Term'}]},{var,509,'Bool'}]},[{type,510,constraint,[{atom,510,is_subtype},[{var,510,'Bool'},{type,510,boolean,[]}]]},{type,511,constraint,[{atom,511,is_subtype},[{var,511,'Term'},{type,511,term,[]}]]}]]}]}}]}},{{function,is_subset,2},[{file,[115,111,102,115,46,101,114,108]},{location,499}],[<<105,115,95,115,117,98,115,101,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,117,98,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,117,98,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,50>>]},<<44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,56,55>>,signature => [{attribute,499,spec,{{is_subset,2},[{type,499,bounded_fun,[{type,499,'fun',[{type,499,product,[{var,499,'Set1'},{var,499,'Set2'}]},{var,499,'Bool'}]},[{type,500,constraint,[{atom,500,is_subtype},[{var,500,'Bool'},{type,500,boolean,[]}]]},{type,501,constraint,[{atom,501,is_subtype},[{var,501,'Set1'},{user_type,501,a_set,[]}]]},{type,502,constraint,[{atom,502,is_subtype},[{var,502,'Set2'},{user_type,502,a_set,[]}]]}]]}]}}]}},{{function,is_type,1},[{file,[115,111,102,115,46,101,114,108]},{location,183}],[<<105,115,95,116,121,112,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,101,114,109,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,57,55>>,signature => [{attribute,183,spec,{{is_type,1},[{type,183,bounded_fun,[{type,183,'fun',[{type,183,product,[{var,183,'Term'}]},{var,183,'Bool'}]},[{type,184,constraint,[{atom,184,is_subtype},[{var,184,'Bool'},{type,184,boolean,[]}]]},{type,185,constraint,[{atom,185,is_subtype},[{var,185,'Term'},{type,185,term,[]}]]}]]}]}}]}},{{function,join,4},[{file,[115,111,102,115,46,101,114,108]},{location,1206}],[<<106,111,105,110,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,110,97,116,117,114,97,108,95,106,111,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<110,97,116,117,114,97,108,32,106,111,105,110>>]},<<32,111,102,32,116,104,101,32,114,101,108,97,116,105,111,110,115,32>>,{code,[],[<<82,101,108,97,116,105,111,110,49>>]},<<32,97,110,100,32>>,{code,[],[<<82,101,108,97,116,105,111,110,50>>]},<<32,111,110,32,99,111,111,114,100,105,110,97,116,101,115,32>>,{code,[],[<<73>>]},<<32,97,110,100,32>>,{code,[],[<<74>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,120,44,49,125,44,123,98,44,121,44,50,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,102,44,103,125,44,123,49,44,104,44,105,125,44,123,50,44,51,44,52,125,93,41,44,10,74,32,61,32,115,111,102,115,58,106,111,105,110,40,82,49,44,32,51,44,32,82,50,44,32,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,74,41,46,10,91,123,97,44,120,44,49,44,102,44,103,125,44,123,97,44,120,44,49,44,104,44,105,125,44,123,98,44,121,44,50,44,51,44,52,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,48,54>>,signature => [{attribute,1206,spec,{{join,4},[{type,1206,bounded_fun,[{type,1206,'fun',[{type,1206,product,[{var,1206,'Relation1'},{var,1206,'I'},{var,1206,'Relation2'},{var,1206,'J'}]},{var,1206,'Relation3'}]},[{type,1207,constraint,[{atom,1207,is_subtype},[{var,1207,'Relation1'},{user_type,1207,relation,[]}]]},{type,1208,constraint,[{atom,1208,is_subtype},[{var,1208,'Relation2'},{user_type,1208,relation,[]}]]},{type,1209,constraint,[{atom,1209,is_subtype},[{var,1209,'Relation3'},{user_type,1209,relation,[]}]]},{type,1210,constraint,[{atom,1210,is_subtype},[{var,1210,'I'},{type,1210,pos_integer,[]}]]},{type,1211,constraint,[{atom,1211,is_subtype},[{var,1211,'J'},{type,1211,pos_integer,[]}]]}]]}]}}]}},{{function,multiple_relative_product,2},[{file,[115,111,102,115,46,101,114,108]},{location,1190}],[<<109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<84,117,112,108,101,79,102,66,105,110,82,101,108,115>>]},<<32,105,115,32,97,32,110,111,110,45,101,109,112,116,121,32,116,117,112,108,101,32,123,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,125,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,44,32,116,104,101,110,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<109,117,108,116,105,112,108,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,105,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,105,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,44,123,99,44,51,125,93,41,44,10,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,98,125,44,123,98,44,99,125,44,123,99,44,97,125,93,41,44,10,77,80,32,61,32,115,111,102,115,58,109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,123,82,105,44,32,82,105,125,44,32,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,114,97,110,103,101,40,77,80,41,41,46,10,91,123,49,44,50,125,44,123,50,44,51,125,44,123,51,44,49,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,50,51>>,signature => [{attribute,1190,spec,{{multiple_relative_product,2},[{type,1190,bounded_fun,[{type,1190,'fun',[{type,1190,product,[{var,1190,'TupleOfBinRels'},{var,1190,'BinRel1'}]},{var,1190,'BinRel2'}]},[{type,1191,constraint,[{atom,1191,is_subtype},[{var,1191,'TupleOfBinRels'},{user_type,1191,tuple_of,[{var,1191,'BinRel'}]}]]},{type,1192,constraint,[{atom,1192,is_subtype},[{var,1192,'BinRel'},{user_type,1192,binary_relation,[]}]]},{type,1193,constraint,[{atom,1193,is_subtype},[{var,1193,'BinRel1'},{user_type,1193,binary_relation,[]}]]},{type,1194,constraint,[{atom,1194,is_subtype},[{var,1194,'BinRel2'},{user_type,1194,binary_relation,[]}]]}]]}]}}]}},{{function,no_elements,1},[{file,[115,111,102,115,46,101,114,108]},{location,349}],[<<110,111,95,101,108,101,109,101,110,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,111,114,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32>>,{code,[],[<<65,83,101,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,52,52>>,signature => [{attribute,349,spec,{{no_elements,1},[{type,349,bounded_fun,[{type,349,'fun',[{type,349,product,[{var,349,'ASet'}]},{var,349,'NoElements'}]},[{type,350,constraint,[{atom,350,is_subtype},[{var,350,'ASet'},{type,350,union,[{user_type,350,a_set,[]},{user_type,350,ordset,[]}]}]]},{type,351,constraint,[{atom,351,is_subtype},[{var,351,'NoElements'},{type,351,non_neg_integer,[]}]]}]]}]}}]}},{{function,partition,1},[{file,[115,111,102,115,46,101,114,108]},{location,1091}],[<<112,97,114,116,105,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32,116,104,101,32,117,110,105,111,110,32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,115,101,116,115,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,119,111,32,101,108,101,109,101,110,116,115,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,101,113,117,97,108,32,105,102,32,116,104,101,121,32,98,101,108,111,110,103,32,116,111,32,116,104,101,32,115,97,109,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,101,116,115,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,97,44,98,44,99,93,44,91,100,44,101,44,102,93,44,91,103,44,104,44,105,93,93,41,44,10,83,101,116,115,50,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,98,44,99,44,100,93,44,91,101,44,102,44,103,93,44,91,104,44,105,44,106,93,93,41,44,10,80,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,115,111,102,115,58,117,110,105,111,110,40,83,101,116,115,49,44,32,83,101,116,115,50,41,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,41,46,10,91,91,97,93,44,91,98,44,99,93,44,91,100,93,44,91,101,44,102,93,44,91,103,93,44,91,104,44,105,93,44,91,106,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,53,51>>,signature => [{attribute,1091,spec,{{partition,1},[{type,1091,bounded_fun,[{type,1091,'fun',[{type,1091,product,[{var,1091,'SetOfSets'}]},{var,1091,'Partition'}]},[{type,1092,constraint,[{atom,1092,is_subtype},[{var,1092,'SetOfSets'},{user_type,1092,set_of_sets,[]}]]},{type,1093,constraint,[{atom,1093,is_subtype},[{var,1093,'Partition'},{user_type,1093,a_set,[]}]]}]]}]}}]}},{{function,partition,2},[{file,[115,111,102,115,46,101,114,108]},{location,1099}],[<<112,97,114,116,105,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,119,111,32,101,108,101,109,101,110,116,115,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,101,113,117,97,108,32,105,102,32,116,104,101,32,114,101,115,117,108,116,115,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,97,114,101,32,101,113,117,97,108,46>>]},{pre,[],[{code,[],[<<49,62,32,83,115,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,97,93,44,91,98,93,44,91,99,44,100,93,44,91,101,44,102,93,93,41,44,10,83,101,116,70,117,110,32,61,32,102,117,110,40,83,41,32,45,62,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,115,111,102,115,58,110,111,95,101,108,101,109,101,110,116,115,40,83,41,41,32,101,110,100,44,10,80,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,83,101,116,70,117,110,44,32,83,115,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,41,46,10,91,91,91,97,93,44,91,98,93,93,44,91,91,99,44,100,93,44,91,101,44,102,93,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,55,48>>,signature => [{attribute,1099,spec,{{partition,2},[{type,1099,bounded_fun,[{type,1099,'fun',[{type,1099,product,[{var,1099,'SetFun'},{var,1099,'Set'}]},{var,1099,'Partition'}]},[{type,1100,constraint,[{atom,1100,is_subtype},[{var,1100,'SetFun'},{user_type,1100,set_fun,[]}]]},{type,1101,constraint,[{atom,1101,is_subtype},[{var,1101,'Partition'},{user_type,1101,a_set,[]}]]},{type,1102,constraint,[{atom,1102,is_subtype},[{var,1102,'Set'},{user_type,1102,a_set,[]}]]}]]}]}}]}},{{function,partition,3},[{file,[115,111,102,115,46,101,114,108]},{location,1118}],[<<112,97,114,116,105,116,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,97,105,114,32,111,102,32,115,101,116,115,32,116,104,97,116,44,32,114,101,103,97,114,100,101,100,32,97,115,32,99,111,110,115,116,105,116,117,116,105,110,103,32,97,32,115,101,116,44,32,102,111,114,109,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<46,32,73,102,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,116,111,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,103,105,118,101,115,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<83,101,116,50>>]},<<44,32,116,104,101,32,101,108,101,109,101,110,116,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<83,101,116,51>>]},<<44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,108,101,109,101,110,116,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<83,101,116,52>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,50,44,52,44,54,93,41,44,10,123,82,50,44,82,51,125,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,49,44,32,82,49,44,32,83,41,44,10,123,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,44,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,51,41,125,46,10,123,91,123,50,44,98,125,93,44,91,123,49,44,97,125,44,123,51,44,99,125,93,125>>]}]},{p,[],[{code,[],[<<112,97,114,116,105,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<123,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41,44,32,100,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41,125>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,56,54>>,signature => [{attribute,1118,spec,{{partition,3},[{type,1118,bounded_fun,[{type,1118,'fun',[{type,1118,product,[{var,1118,'SetFun'},{var,1118,'Set1'},{var,1118,'Set2'}]},{type,1118,tuple,[{var,1118,'Set3'},{var,1118,'Set4'}]}]},[{type,1119,constraint,[{atom,1119,is_subtype},[{var,1119,'SetFun'},{user_type,1119,set_fun,[]}]]},{type,1120,constraint,[{atom,1120,is_subtype},[{var,1120,'Set1'},{user_type,1120,a_set,[]}]]},{type,1121,constraint,[{atom,1121,is_subtype},[{var,1121,'Set2'},{user_type,1121,a_set,[]}]]},{type,1122,constraint,[{atom,1122,is_subtype},[{var,1122,'Set3'},{user_type,1122,a_set,[]}]]},{type,1123,constraint,[{atom,1123,is_subtype},[{var,1123,'Set4'},{user_type,1123,a_set,[]}]]}]]}]}}]}},{{function,partition_family,2},[{file,[115,111,102,115,46,101,114,108]},{location,1404}],[<<112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,119,104,101,114,101,32,116,104,101,32,105,110,100,101,120,101,100,32,115,101,116,32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,119,111,32,101,108,101,109,101,110,116,115,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,101,113,117,97,108,32,105,102,32,116,104,101,32,114,101,115,117,108,116,115,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,105,46,32,84,104,105,115,32,105,32,105,115,32,116,104,101,32,105,110,100,101,120,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,109,97,112,115,32,111,110,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,113,117,105,118,97,108,101,110,99,101,95,99,108,97,115,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,97,44,97,44,97,125,44,123,97,44,97,44,98,44,98,125,44,123,97,44,98,44,98,44,98,125,93,41,44,10,83,101,116,70,117,110,32,61,32,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,65,44,95,44,67,44,95,125,41,32,45,62,32,123,65,44,67,125,32,101,110,100,125,44,10,70,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,40,83,101,116,70,117,110,44,32,83,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,123,97,44,97,125,44,91,123,97,44,97,44,97,44,97,125,93,125,44,123,123,97,44,98,125,44,91,123,97,44,97,44,98,44,98,125,44,123,97,44,98,44,98,44,98,125,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,48,57>>,signature => [{attribute,1404,spec,{{partition_family,2},[{type,1404,bounded_fun,[{type,1404,'fun',[{type,1404,product,[{var,1404,'SetFun'},{var,1404,'Set'}]},{var,1404,'Family'}]},[{type,1405,constraint,[{atom,1405,is_subtype},[{var,1405,'Family'},{user_type,1405,family,[]}]]},{type,1406,constraint,[{atom,1406,is_subtype},[{var,1406,'SetFun'},{user_type,1406,set_fun,[]}]]},{type,1407,constraint,[{atom,1407,is_subtype},[{var,1407,'Set'},{user_type,1407,a_set,[]}]]}]]}]}}]}},{{function,product,1},[{file,[115,111,102,115,46,101,114,108]},{location,444}],[<<112,114,111,100,117,99,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116,95,116,117,112,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,110,111,110,45,101,109,112,116,121,32,116,117,112,108,101,32,111,102,32,115,101,116,115,32>>,{code,[],[<<84,117,112,108,101,79,102,83,101,116,115>>]},<<46,32,73,102,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<82,101,108,97,116,105,111,110>>]},<<44,32,116,104,101,110,32,120,91,105,93,32,105,115,32,100,114,97,119,110,32,102,114,111,109,32,101,108,101,109,101,110,116,32,105,32,111,102,32>>,{code,[],[<<84,117,112,108,101,79,102,83,101,116,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,97,44,98,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,93,41,44,10,83,51,32,61,32,115,111,102,115,58,115,101,116,40,91,120,44,121,93,41,44,10,80,51,32,61,32,115,111,102,115,58,112,114,111,100,117,99,116,40,123,83,49,44,83,50,44,83,51,125,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,51,41,46,10,91,123,97,44,49,44,120,125,44,123,97,44,49,44,121,125,44,123,97,44,50,44,120,125,44,123,97,44,50,44,121,125,44,123,98,44,49,44,120,125,44,123,98,44,49,44,121,125,44,123,98,44,50,44,120,125,44,123,98,44,50,44,121,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,51,48>>,signature => [{attribute,444,spec,{{product,1},[{type,444,bounded_fun,[{type,444,'fun',[{type,444,product,[{var,444,'TupleOfSets'}]},{var,444,'Relation'}]},[{type,445,constraint,[{atom,445,is_subtype},[{var,445,'Relation'},{user_type,445,relation,[]}]]},{type,446,constraint,[{atom,446,is_subtype},[{var,446,'TupleOfSets'},{user_type,446,tuple_of,[{user_type,446,a_set,[]}]}]]}]]}]}}]}},{{function,product,2},[{file,[115,111,102,115,46,101,114,108]},{location,430}],[<<112,114,111,100,117,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,97,44,98,93,41,44,10,82,32,61,32,115,111,102,115,58,112,114,111,100,117,99,116,40,83,49,44,32,83,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,41,46,10,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,97,125,44,123,50,44,98,125,93>>]}]},{p,[],[{code,[],[<<112,114,111,100,117,99,116,40,83,49,44,194,160,83,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<112,114,111,100,117,99,116,40,123,83,49,44,194,160,83,50,125,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,52,57>>,signature => [{attribute,430,spec,{{product,2},[{type,430,bounded_fun,[{type,430,'fun',[{type,430,product,[{var,430,'Set1'},{var,430,'Set2'}]},{var,430,'BinRel'}]},[{type,431,constraint,[{atom,431,is_subtype},[{var,431,'BinRel'},{user_type,431,binary_relation,[]}]]},{type,432,constraint,[{atom,432,is_subtype},[{var,432,'Set1'},{user_type,432,a_set,[]}]]},{type,433,constraint,[{atom,433,is_subtype},[{var,433,'Set2'},{user_type,433,a_set,[]}]]}]]}]}}]}},{{function,projection,2},[{file,[115,111,102,115,46,101,114,108]},{location,1029}],[<<112,114,111,106,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,101,116,32,99,114,101,97,116,101,100,32,98,121,32,115,117,98,115,116,105,116,117,116,105,110,103,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,98,121,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,116,111,32,116,104,101,32,101,108,101,109,101,110,116,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,105,115,32,97,32,110,117,109,98,101,114,32,105,194,160,62,61,194,160,49,32,97,110,100,32>>,{code,[],[<<83,101,116,49>>]},<<32,105,115,32,97,32,114,101,108,97,116,105,111,110,44,32,116,104,101,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,115,101,116,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,114,111,106,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,114,111,106,101,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,111,110,116,111,32,99,111,111,114,100,105,110,97,116,101,32,105,46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,97,125,93,41,44,10,83,50,32,61,32,115,111,102,115,58,112,114,111,106,101,99,116,105,111,110,40,50,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,97,44,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,54,55>>,signature => [{attribute,1029,spec,{{projection,2},[{type,1029,bounded_fun,[{type,1029,'fun',[{type,1029,product,[{var,1029,'SetFun'},{var,1029,'Set1'}]},{var,1029,'Set2'}]},[{type,1030,constraint,[{atom,1030,is_subtype},[{var,1030,'SetFun'},{user_type,1030,set_fun,[]}]]},{type,1031,constraint,[{atom,1031,is_subtype},[{var,1031,'Set1'},{user_type,1031,a_set,[]}]]},{type,1032,constraint,[{atom,1032,is_subtype},[{var,1032,'Set2'},{user_type,1032,a_set,[]}]]}]]}]}}]}},{{function,range,1},[{file,[115,111,102,115,46,101,114,108]},{location,622}],[<<114,97,110,103,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,97,110,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,97,110,103,101>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,98,125,44,123,50,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,114,97,110,103,101,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,97,44,98,44,99,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,56,54>>,signature => [{attribute,622,spec,{{range,1},[{type,622,bounded_fun,[{type,622,'fun',[{type,622,product,[{var,622,'BinRel'}]},{var,622,'Set'}]},[{type,623,constraint,[{atom,623,is_subtype},[{var,623,'BinRel'},{user_type,623,binary_relation,[]}]]},{type,624,constraint,[{atom,624,is_subtype},[{var,624,'Set'},{user_type,624,a_set,[]}]]}]]}]}}]}},{{function,relation,2},[{file,[115,111,102,115,46,101,114,108]},{location,255}],[<<114,101,108,97,116,105,111,110,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,48,48>>,equiv => {function,relation,1},signature => [{attribute,255,spec,{{relation,2},[{type,255,bounded_fun,[{type,255,'fun',[{type,255,product,[{var,255,'Tuples'},{var,255,'Type'}]},{var,255,'Relation'}]},[{type,256,constraint,[{atom,256,is_subtype},[{var,256,'N'},{type,256,integer,[]}]]},{type,257,constraint,[{atom,257,is_subtype},[{var,257,'Type'},{type,257,union,[{var,257,'N'},{user_type,257,type,[]}]}]]},{type,258,constraint,[{atom,258,is_subtype},[{var,258,'Relation'},{user_type,258,relation,[]}]]},{type,259,constraint,[{atom,259,is_subtype},[{var,259,'Tuples'},{type,259,list,[{type,259,tuple,any}]}]]}]]}]}}]}},{{function,relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,243}],[<<114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,111,110>>]},<<46,32>>,{code,[],[<<114,101,108,97,116,105,111,110,40,82,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,82,44,194,160,84,41>>]},<<44,32,105,102,32,84,32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,114,101,108,97,116,105,111,110,46,32,73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,78,44,32,116,104,101,110,32>>,{code,[],[<<91,123,97,116,111,109,44,194,160,46,46,46,44,194,160,97,116,111,109,125,93,41>>]},<<44,32,119,104,101,114,101,32,116,104,101,32,116,117,112,108,101,32,115,105,122,101,32,105,115,32,78,44,32,105,115,32,117,115,101,100,32,97,115,32,116,121,112,101,32,111,102,32,116,104,101,32,114,101,108,97,116,105,111,110,46,32,73,102,32,110,111,32,116,121,112,101,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,102,105,114,115,116,32,116,117,112,108,101,32,111,102,32>>,{code,[],[<<84,117,112,108,101,115>>]},<<32,105,115,32,117,115,101,100,32,105,102,32,116,104,101,114,101,32,105,115,32,115,117,99,104,32,97,32,116,117,112,108,101,46,32>>,{code,[],[<<114,101,108,97,116,105,111,110,40,91,93,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<114,101,108,97,116,105,111,110,40,91,93,44,194,160,50,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,48,48>>,signature => [{attribute,243,spec,{{relation,1},[{type,243,bounded_fun,[{type,243,'fun',[{type,243,product,[{var,243,'Tuples'}]},{var,243,'Relation'}]},[{type,244,constraint,[{atom,244,is_subtype},[{var,244,'Relation'},{user_type,244,relation,[]}]]},{type,245,constraint,[{atom,245,is_subtype},[{var,245,'Tuples'},{type,245,list,[{type,245,tuple,any}]}]]}]]}]}}]}},{{function,relation_to_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,600}],[<<114,101,108,97,116,105,111,110,95,116,111,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,101,113,117,97,108,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,109,97,103,101>>]},<<32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,105,32,117,110,100,101,114,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,98,44,49,125,44,123,99,44,50,125,44,123,99,44,51,125,93,41,44,10,70,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,95,116,111,95,102,97,109,105,108,121,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,98,44,91,49,93,125,44,123,99,44,91,50,44,51,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,49,57>>,signature => [{attribute,600,spec,{{relation_to_family,1},[{type,600,bounded_fun,[{type,600,'fun',[{type,600,product,[{var,600,'BinRel'}]},{var,600,'Family'}]},[{type,601,constraint,[{atom,601,is_subtype},[{var,601,'Family'},{user_type,601,family,[]}]]},{type,602,constraint,[{atom,602,is_subtype},[{var,602,'BinRel'},{user_type,602,binary_relation,[]}]]}]]}]}}]}},{{function,relative_product,2},[{file,[115,111,102,115,46,101,114,108]},{location,657}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,51,55>>,equiv => {function,relative_product,1},signature => [{attribute,657,spec,{{relative_product,2},[{type,657,bounded_fun,[{type,657,'fun',[{type,657,product,[{var,657,'ListOfBinRels'},{var,657,'BinRel1'}]},{var,657,'BinRel2'}]},[{type,658,constraint,[{atom,658,is_subtype},[{var,658,'ListOfBinRels'},{type,658,nonempty_list,[{var,658,'BinRel'}]}]]},{type,659,constraint,[{atom,659,is_subtype},[{var,659,'BinRel'},{user_type,659,binary_relation,[]}]]},{type,660,constraint,[{atom,660,is_subtype},[{var,660,'BinRel1'},{user_type,660,binary_relation,[]}]]},{type,661,constraint,[{atom,661,is_subtype},[{var,661,'BinRel2'},{user_type,661,binary_relation,[]}]]}]]}]}}]}},{{function,relative_product,1},[{file,[115,111,102,115,46,101,114,108]},{location,641}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<76,105,115,116,79,102,66,105,110,82,101,108,115>>]},<<32,105,115,32,97,32,110,111,110,45,101,109,112,116,121,32,108,105,115,116,32,91,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,93,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,44,32,116,104,101,110,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,117,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,105,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,105,115,32,111,109,105,116,116,101,100,44,32,116,104,101,32,114,101,108,97,116,105,111,110,32,111,102,32,101,113,117,97,108,105,116,121,32,98,101,116,119,101,101,110,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116,95,116,117,112,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,114,97,110,103,101,115,32,111,102,32,82,91,105,93,44,32,114,97,110,103,101,194,160,82,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,114,97,110,103,101,194,160,82,91,110,93,44,32,105,115,32,117,115,101,100,32,105,110,115,116,101,97,100,32,40,105,110,116,117,105,116,105,118,101,108,121,44,32,110,111,116,104,105,110,103,32,105,115,32,34,108,111,115,116,34,41,46>>]},{pre,[],[{code,[],[<<49,62,32,84,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,97,97,125,44,123,50,44,98,125,93,41,44,10,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,117,125,44,123,50,44,118,125,44,123,51,44,99,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,91,84,82,44,32,82,49,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,123,97,44,117,125,125,44,123,49,44,123,97,97,44,117,125,125,44,123,50,44,123,98,44,118,125,125,93>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,91,82,49,93,44,194,160,82,50,41>>]},<<32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32>>,{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,82,49,44,194,160,82,50,41>>]},<<59,32,116,104,101,32,108,105,115,116,32,111,102,32,111,110,101,32,101,108,101,109,101,110,116,32,105,115,32,110,111,116,32,105,100,101,110,116,105,102,105,101,100,32,119,105,116,104,32,116,104,101,32,101,108,101,109,101,110,116,32,105,116,115,101,108,102,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,51,55>>,signature => [{attribute,641,spec,{{relative_product,1},[{type,641,bounded_fun,[{type,641,'fun',[{type,641,product,[{var,641,'ListOfBinRels'}]},{var,641,'BinRel2'}]},[{type,642,constraint,[{atom,642,is_subtype},[{var,642,'ListOfBinRels'},{type,642,nonempty_list,[{var,642,'BinRel'}]}]]},{type,643,constraint,[{atom,643,is_subtype},[{var,643,'BinRel'},{user_type,643,binary_relation,[]}]]},{type,644,constraint,[{atom,644,is_subtype},[{var,644,'BinRel2'},{user_type,644,binary_relation,[]}]]}]]}]}}]}},{{function,relative_product,2},[{file,[115,111,102,115,46,101,114,108]},{location,657}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,54,56>>,signature => [{attribute,657,spec,{{relative_product,2},[{type,662,bounded_fun,[{type,662,'fun',[{type,662,product,[{var,662,'BinRel1'},{var,662,'BinRel2'}]},{var,662,'BinRel3'}]},[{type,663,constraint,[{atom,663,is_subtype},[{var,663,'BinRel1'},{user_type,663,binary_relation,[]}]]},{type,664,constraint,[{atom,664,is_subtype},[{var,664,'BinRel2'},{user_type,664,binary_relation,[]}]]},{type,665,constraint,[{atom,665,is_subtype},[{var,665,'BinRel3'},{user_type,665,binary_relation,[]}]]}]]}]}}]}},{{function,relative_product1,2},[{file,[115,111,102,115,46,101,114,108]},{location,685}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,111,110,118,101,114,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,110,118,101,114,115,101>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,97,110,100,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,97,97,125,44,123,50,44,98,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,117,125,44,123,50,44,118,125,44,123,51,44,99,125,93,41,44,10,82,51,32,61,32,115,111,102,115,58,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,40,82,49,44,32,82,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,51,41,46,10,91,123,97,44,117,125,44,123,97,97,44,117,125,44,123,98,44,118,125,93>>]}]},{p,[],[{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,40,82,49,44,194,160,82,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,99,111,110,118,101,114,115,101,40,82,49,41,44,194,160,82,50,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,55,57>>,signature => [{attribute,685,spec,{{relative_product1,2},[{type,685,bounded_fun,[{type,685,'fun',[{type,685,product,[{var,685,'BinRel1'},{var,685,'BinRel2'}]},{var,685,'BinRel3'}]},[{type,686,constraint,[{atom,686,is_subtype},[{var,686,'BinRel1'},{user_type,686,binary_relation,[]}]]},{type,687,constraint,[{atom,687,is_subtype},[{var,687,'BinRel2'},{user_type,687,binary_relation,[]}]]},{type,688,constraint,[{atom,688,is_subtype},[{var,688,'BinRel3'},{user_type,688,binary_relation,[]}]]}]]}]}}]}},{{function,restriction,2},[{file,[115,111,102,115,46,101,114,108]},{location,826}],[<<114,101,115,116,114,105,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,116,111,32>>,{code,[],[<<83,101,116>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,44,52,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,115,116,114,105,99,116,105,111,110,40,82,49,44,32,83,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,97,125,44,123,50,44,98,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,48,48>>,signature => [{attribute,826,spec,{{restriction,2},[{type,826,bounded_fun,[{type,826,'fun',[{type,826,product,[{var,826,'BinRel1'},{var,826,'Set'}]},{var,826,'BinRel2'}]},[{type,827,constraint,[{atom,827,is_subtype},[{var,827,'BinRel1'},{user_type,827,binary_relation,[]}]]},{type,828,constraint,[{atom,828,is_subtype},[{var,828,'BinRel2'},{user_type,828,binary_relation,[]}]]},{type,829,constraint,[{atom,829,is_subtype},[{var,829,'Set'},{user_type,829,a_set,[]}]]}]]}]}}]}},{{function,restriction,3},[{file,[115,111,102,115,46,101,114,108]},{location,892}],[<<114,101,115,116,114,105,99,116,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,103,105,118,101,115,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<83,101,116,50>>]},<<32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,98,44,99,44,100,93,41,44,10,83,51,32,61,32,115,111,102,115,58,114,101,115,116,114,105,99,116,105,111,110,40,50,44,32,83,49,44,32,83,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,51,41,46,10,91,123,50,44,98,125,44,123,51,44,99,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,49,54>>,signature => [{attribute,892,spec,{{restriction,3},[{type,892,bounded_fun,[{type,892,'fun',[{type,892,product,[{var,892,'SetFun'},{var,892,'Set1'},{var,892,'Set2'}]},{var,892,'Set3'}]},[{type,893,constraint,[{atom,893,is_subtype},[{var,893,'SetFun'},{user_type,893,set_fun,[]}]]},{type,894,constraint,[{atom,894,is_subtype},[{var,894,'Set1'},{user_type,894,a_set,[]}]]},{type,895,constraint,[{atom,895,is_subtype},[{var,895,'Set2'},{user_type,895,a_set,[]}]]},{type,896,constraint,[{atom,896,is_subtype},[{var,896,'Set3'},{user_type,896,a_set,[]}]]}]]}]}}]}},{{function,set,2},[{file,[115,111,102,115,46,101,114,108]},{location,204}],[<<115,101,116,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,51,50>>,equiv => {function,set,1},signature => [{attribute,204,spec,{{set,2},[{type,204,bounded_fun,[{type,204,'fun',[{type,204,product,[{var,204,'Terms'},{var,204,'Type'}]},{var,204,'Set'}]},[{type,205,constraint,[{atom,205,is_subtype},[{var,205,'Set'},{user_type,205,a_set,[]}]]},{type,206,constraint,[{atom,206,is_subtype},[{var,206,'Terms'},{type,206,list,[{type,206,term,[]}]}]]},{type,207,constraint,[{atom,207,is_subtype},[{var,207,'Type'},{user_type,207,type,[]}]]}]]}]}}]}},{{function,set,1},[{file,[115,111,102,115,46,101,114,108]},{location,195}],[<<115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<46,32>>,{code,[],[<<115,101,116,40,76,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,76,44,194,160,84,41>>]},<<44,32,105,102,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46,32,73,102,32,110,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<91,97,116,111,109,93>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,115,101,116,32,116,121,112,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,51,50>>,signature => [{attribute,195,spec,{{set,1},[{type,195,bounded_fun,[{type,195,'fun',[{type,195,product,[{var,195,'Terms'}]},{var,195,'Set'}]},[{type,196,constraint,[{atom,196,is_subtype},[{var,196,'Set'},{user_type,196,a_set,[]}]]},{type,197,constraint,[{atom,197,is_subtype},[{var,197,'Terms'},{type,197,list,[{type,197,term,[]}]}]]}]]}]}}]}},{{function,specification,2},[{file,[115,111,102,115,46,101,114,108]},{location,359}],[<<115,112,101,99,105,102,105,99,97,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,101,116,32,99,111,110,116,97,105,110,105,110,103,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,102,111,114,32,119,104,105,99,104,32>>,{code,[],[<<70,117,110>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,194,160,70,117,110,50,125>>]},<<44,32>>,{code,[],[<<70,117,110,50>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,111,102,32,101,97,99,104,32,101,108,101,109,101,110,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,101,97,99,104,32,101,108,101,109,101,110,116,46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,120,44,49,125,44,123,120,44,50,125,44,123,121,44,51,125,93,41,44,10,83,49,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,91,82,49,44,82,50,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,112,101,99,105,102,105,99,97,116,105,111,110,40,102,117,110,32,115,111,102,115,58,105,115,95,97,95,102,117,110,99,116,105,111,110,47,49,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,91,123,97,44,49,125,44,123,98,44,50,125,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,52,53>>,signature => [{attribute,359,spec,{{specification,2},[{type,359,bounded_fun,[{type,359,'fun',[{type,359,product,[{var,359,'Fun'},{var,359,'Set1'}]},{var,359,'Set2'}]},[{type,360,constraint,[{atom,360,is_subtype},[{var,360,'Fun'},{user_type,360,spec_fun,[]}]]},{type,361,constraint,[{atom,361,is_subtype},[{var,361,'Set1'},{user_type,361,a_set,[]}]]},{type,362,constraint,[{atom,362,is_subtype},[{var,362,'Set2'},{user_type,362,a_set,[]}]]}]]}]}}]}},{{function,strict_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,752}],[<<115,116,114,105,99,116,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,116,114,105,99,116,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,116,114,105,99,116,32,114,101,108,97,116,105,111,110>>]},<<32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,49,125,44,123,49,44,50,125,44,123,50,44,49,125,44,123,50,44,50,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,115,116,114,105,99,116,95,114,101,108,97,116,105,111,110,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,50,125,44,123,50,44,49,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,54,54>>,signature => [{attribute,752,spec,{{strict_relation,1},[{type,752,bounded_fun,[{type,752,'fun',[{type,752,product,[{var,752,'BinRel1'}]},{var,752,'BinRel2'}]},[{type,753,constraint,[{atom,753,is_subtype},[{var,753,'BinRel1'},{user_type,753,binary_relation,[]}]]},{type,754,constraint,[{atom,754,is_subtype},[{var,754,'BinRel2'},{user_type,754,binary_relation,[]}]]}]]}]}}]}},{{function,substitution,2},[{file,[115,111,102,115,46,101,114,108]},{location,1048}],[<<115,117,98,115,116,105,116,117,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,102,117,110,99,116,105,111,110,44,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,119,104,105,99,104,32,105,115,32>>,{code,[],[<<83,101,116,49>>]},<<46,32,84,104,101,32,118,97,108,117,101,32,111,102,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,116,111,32,116,104,101,32,101,108,101,109,101,110,116,46>>]},{pre,[],[{code,[],[<<49,62,32,76,32,61,32,91,123,97,44,49,125,44,123,98,44,50,125,93,46,10,91,123,97,44,49,125,44,123,98,44,50,125,93,10,50,62,32,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,112,114,111,106,101,99,116,105,111,110,40,49,44,115,111,102,115,58,114,101,108,97,116,105,111,110,40,76,41,41,41,46,10,91,97,44,98,93,10,51,62,32,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,115,117,98,115,116,105,116,117,116,105,111,110,40,49,44,115,111,102,115,58,114,101,108,97,116,105,111,110,40,76,41,41,41,46,10,91,123,123,97,44,49,125,44,97,125,44,123,123,98,44,50,125,44,98,125,93,10,52,62,32,83,101,116,70,117,110,32,61,32,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,65,44,95,125,61,69,41,32,45,62,32,123,69,44,65,125,32,101,110,100,125,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,112,114,111,106,101,99,116,105,111,110,40,83,101,116,70,117,110,44,115,111,102,115,58,114,101,108,97,116,105,111,110,40,76,41,41,41,46,10,91,123,123,97,44,49,125,44,97,125,44,123,123,98,44,50,125,44,98,125,93>>]}]},{p,[],[<<84,104,101,32,114,101,108,97,116,105,111,110,32,111,102,32,101,113,117,97,108,105,116,121,32,98,101,116,119,101,101,110,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,123,97,44,98,44,99,125,58>>]},{pre,[],[{code,[],[<<49,62,32,73,32,61,32,115,111,102,115,58,115,117,98,115,116,105,116,117,116,105,111,110,40,102,117,110,40,65,41,32,45,62,32,65,32,101,110,100,44,32,115,111,102,115,58,115,101,116,40,91,97,44,98,44,99,93,41,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,73,41,46,10,91,123,97,44,97,125,44,123,98,44,98,125,44,123,99,44,99,125,93>>]}]},{p,[],[<<76,101,116,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,98,101,32,97,32,115,101,116,32,111,102,32,115,101,116,115,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,109,97,112,115,32,101,97,99,104,32,101,108,101,109,101,110,116,32>>,{code,[],[<<83,101,116>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,111,110,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,109,97,103,101>>]},<<32,111,102,32>>,{code,[],[<<83,101,116>>]},<<32,117,110,100,101,114,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,117,110,99,116,105,111,110,58>>]},{pre,[],[{code,[],[<<105,109,97,103,101,115,40,83,101,116,79,102,83,101,116,115,44,32,66,105,110,82,101,108,41,32,45,62,10,32,32,32,70,117,110,32,61,32,102,117,110,40,83,101,116,41,32,45,62,32,115,111,102,115,58,105,109,97,103,101,40,66,105,110,82,101,108,44,32,83,101,116,41,32,101,110,100,44,10,32,32,32,115,111,102,115,58,115,117,98,115,116,105,116,117,116,105,111,110,40,70,117,110,44,32,83,101,116,79,102,83,101,116,115,41,46>>]}]},{p,[],[<<69,120,116,101,114,110,97,108,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,115,111,114,116,101,100,32,108,105,115,116,115,46,32,83,111,44,32,99,114,101,97,116,105,110,103,32,116,104,101,32,105,109,97,103,101,32,111,102,32,97,32,115,101,116,32,117,110,100,101,114,32,97,32,114,101,108,97,116,105,111,110,32,82,32,99,97,110,32,116,114,97,118,101,114,115,101,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,82,32,40,116,111,32,116,104,97,116,32,99,111,109,101,115,32,116,104,101,32,115,111,114,116,105,110,103,32,111,102,32,114,101,115,117,108,116,115,44,32,116,104,101,32,105,109,97,103,101,41,46,32,73,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,109,97,103,101,47,50>>]}]},<<44,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,116,114,97,118,101,114,115,101,100,32,111,110,99,101,32,102,111,114,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,116,97,107,101,32,116,111,111,32,108,111,110,103,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,102,102,105,99,105,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,117,110,100,101,114,32,116,104,101,32,97,115,115,117,109,112,116,105,111,110,32,116,104,97,116,32,116,104,101,32,105,109,97,103,101,32,111,102,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,117,110,100,101,114,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,110,111,110,45,101,109,112,116,121,58>>]},{pre,[],[{code,[],[<<105,109,97,103,101,115,50,40,83,101,116,79,102,83,101,116,115,44,32,66,105,110,82,101,108,41,32,45,62,10,32,32,32,67,82,32,61,32,115,111,102,115,58,99,97,110,111,110,105,99,97,108,95,114,101,108,97,116,105,111,110,40,83,101,116,79,102,83,101,116,115,41,44,10,32,32,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,40,67,82,44,32,66,105,110,82,101,108,41,44,10,32,32,32,115,111,102,115,58,114,101,108,97,116,105,111,110,95,116,111,95,102,97,109,105,108,121,40,82,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,56,50>>,signature => [{attribute,1048,spec,{{substitution,2},[{type,1048,bounded_fun,[{type,1048,'fun',[{type,1048,product,[{var,1048,'SetFun'},{var,1048,'Set1'}]},{var,1048,'Set2'}]},[{type,1049,constraint,[{atom,1049,is_subtype},[{var,1049,'SetFun'},{user_type,1049,set_fun,[]}]]},{type,1050,constraint,[{atom,1050,is_subtype},[{var,1050,'Set1'},{user_type,1050,a_set,[]}]]},{type,1051,constraint,[{atom,1051,is_subtype},[{var,1051,'Set2'},{user_type,1051,a_set,[]}]]}]]}]}}]}},{{function,symdiff,2},[{file,[115,111,102,115,46,101,114,108]},{location,408}],[<<115,121,109,100,105,102,102,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,121,109,109,101,116,114,105,99,95,100,105,102,102,101,114,101,110,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,121,109,109,101,116,114,105,99,32,100,105,102,102,101,114,101,110,99,101>>]},<<32,40,111,114,32,116,104,101,32,66,111,111,108,101,97,110,32,115,117,109,41,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,44,51,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,50,44,51,44,52,93,41,44,10,80,32,61,32,115,111,102,115,58,115,121,109,100,105,102,102,40,83,49,44,32,83,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,41,46,10,91,49,44,52,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,51,49>>,signature => [{attribute,408,spec,{{symdiff,2},[{type,408,bounded_fun,[{type,408,'fun',[{type,408,product,[{var,408,'Set1'},{var,408,'Set2'}]},{var,408,'Set3'}]},[{type,409,constraint,[{atom,409,is_subtype},[{var,409,'Set1'},{user_type,409,a_set,[]}]]},{type,410,constraint,[{atom,410,is_subtype},[{var,410,'Set2'},{user_type,410,a_set,[]}]]},{type,411,constraint,[{atom,411,is_subtype},[{var,411,'Set3'},{user_type,411,a_set,[]}]]}]]}]}}]}},{{function,symmetric_partition,2},[{file,[115,111,102,115,46,101,114,108]},{location,418}],[<<115,121,109,109,101,116,114,105,99,95,112,97,114,116,105,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,114,105,112,108,101,32,111,102,32,115,101,116,115,58>>]},{ul,[],[{li,[],[{code,[],[<<83,101,116,51>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,116,104,97,116,32,100,111,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{li,[],[{code,[],[<<83,101,116,52>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{li,[],[{code,[],[<<83,101,116,53>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,50>>]},<<32,116,104,97,116,32,100,111,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32>>,{code,[],[<<83,101,116,49>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,52,55>>,signature => [{attribute,418,spec,{{symmetric_partition,2},[{type,418,bounded_fun,[{type,418,'fun',[{type,418,product,[{var,418,'Set1'},{var,418,'Set2'}]},{type,418,tuple,[{var,418,'Set3'},{var,418,'Set4'},{var,418,'Set5'}]}]},[{type,419,constraint,[{atom,419,is_subtype},[{var,419,'Set1'},{user_type,419,a_set,[]}]]},{type,420,constraint,[{atom,420,is_subtype},[{var,420,'Set2'},{user_type,420,a_set,[]}]]},{type,421,constraint,[{atom,421,is_subtype},[{var,421,'Set3'},{user_type,421,a_set,[]}]]},{type,422,constraint,[{atom,422,is_subtype},[{var,422,'Set4'},{user_type,422,a_set,[]}]]},{type,423,constraint,[{atom,423,is_subtype},[{var,423,'Set5'},{user_type,423,a_set,[]}]]}]]}]}}]}},{{function,to_external,1},[{file,[115,111,102,115,46,101,114,108]},{location,319}],[<<116,111,95,101,120,116,101,114,110,97,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,111,102,32,97,110,32,97,116,111,109,105,99,44,32,111,114,100,101,114,101,100,44,32,111,114,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,54,56>>,signature => [{attribute,319,spec,{{to_external,1},[{type,319,bounded_fun,[{type,319,'fun',[{type,319,product,[{var,319,'AnySet'}]},{var,319,'ExternalSet'}]},[{type,320,constraint,[{atom,320,is_subtype},[{var,320,'ExternalSet'},{user_type,320,external_set,[]}]]},{type,321,constraint,[{atom,321,is_subtype},[{var,321,'AnySet'},{user_type,321,anyset,[]}]]}]]}]}}]}},{{function,to_sets,1},[{file,[115,111,102,115,46,101,114,108]},{location,335}],[<<116,111,95,115,101,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,32>>,{code,[],[<<65,83,101,116>>]},<<32,97,115,32,97,32,116,117,112,108,101,32,111,102,32,115,101,116,115,44,32,97,110,100,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32>>,{code,[],[<<65,83,101,116>>]},<<32,97,115,32,97,32,115,111,114,116,101,100,32,108,105,115,116,32,111,102,32,115,101,116,115,32,119,105,116,104,111,117,116,32,100,117,112,108,105,99,97,116,101,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,55,55>>,signature => [{attribute,335,spec,{{to_sets,1},[{type,335,bounded_fun,[{type,335,'fun',[{type,335,product,[{var,335,'ASet'}]},{var,335,'Sets'}]},[{type,336,constraint,[{atom,336,is_subtype},[{var,336,'ASet'},{type,336,union,[{user_type,336,a_set,[]},{user_type,336,ordset,[]}]}]]},{type,337,constraint,[{atom,337,is_subtype},[{var,337,'Sets'},{type,337,union,[{user_type,337,tuple_of,[{var,337,'AnySet'}]},{type,337,list,[{var,337,'AnySet'}]}]}]]},{type,338,constraint,[{atom,338,is_subtype},[{var,338,'AnySet'},{user_type,338,anyset,[]}]]}]]}]}}]}},{{function,type,1},[{file,[115,111,102,115,46,101,114,108]},{location,327}],[<<116,121,112,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,111,102,32,97,110,32,97,116,111,109,105,99,44,32,111,114,100,101,114,101,100,44,32,111,114,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,56,56>>,signature => [{attribute,327,spec,{{type,1},[{type,327,bounded_fun,[{type,327,'fun',[{type,327,product,[{var,327,'AnySet'}]},{var,327,'Type'}]},[{type,328,constraint,[{atom,328,is_subtype},[{var,328,'AnySet'},{user_type,328,anyset,[]}]]},{type,329,constraint,[{atom,329,is_subtype},[{var,329,'Type'},{user_type,329,type,[]}]]}]]}]}}]}},{{function,union,1},[{file,[115,111,102,115,46,101,114,108]},{location,553}],[<<117,110,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,105,111,110>>]},<<32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,115,101,116,115,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,57,55>>,signature => [{attribute,553,spec,{{union,1},[{type,553,bounded_fun,[{type,553,'fun',[{type,553,product,[{var,553,'SetOfSets'}]},{var,553,'Set'}]},[{type,554,constraint,[{atom,554,is_subtype},[{var,554,'Set'},{user_type,554,a_set,[]}]]},{type,555,constraint,[{atom,555,is_subtype},[{var,555,'SetOfSets'},{user_type,555,set_of_sets,[]}]]}]]}]}}]}},{{function,union,2},[{file,[115,111,102,115,46,101,114,108]},{location,378}],[<<117,110,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,55,48,54>>,signature => [{attribute,378,spec,{{union,2},[{type,378,bounded_fun,[{type,378,'fun',[{type,378,product,[{var,378,'Set1'},{var,378,'Set2'}]},{var,378,'Set3'}]},[{type,379,constraint,[{atom,379,is_subtype},[{var,379,'Set1'},{user_type,379,a_set,[]}]]},{type,380,constraint,[{atom,380,is_subtype},[{var,380,'Set2'},{user_type,380,a_set,[]}]]},{type,381,constraint,[{atom,381,is_subtype},[{var,381,'Set3'},{user_type,381,a_set,[]}]]}]]}]}}]}},{{function,union_of_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,1288}],[<<117,110,105,111,110,95,111,102,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,48,44,50,44,52,93,125,44,123,98,44,91,48,44,49,44,50,93,125,44,123,99,44,91,50,44,51,93,125,93,41,44,10,83,32,61,32,115,111,102,115,58,117,110,105,111,110,95,111,102,95,102,97,109,105,108,121,40,70,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,48,44,49,44,50,44,51,44,52,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,55,49,53>>,signature => [{attribute,1288,spec,{{union_of_family,1},[{type,1288,bounded_fun,[{type,1288,'fun',[{type,1288,product,[{var,1288,'Family'}]},{var,1288,'Set'}]},[{type,1289,constraint,[{atom,1289,is_subtype},[{var,1289,'Family'},{user_type,1289,family,[]}]]},{type,1290,constraint,[{atom,1290,is_subtype},[{var,1290,'Set'},{user_type,1290,a_set,[]}]]}]]}]}}]}},{{function,weak_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,763}],[<<119,101,97,107,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,117,98,115,101,116,32,83,32,111,102,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,119,101,97,107,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<119,101,97,107,32,114,101,108,97,116,105,111,110>>]},<<32,87,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46,32,76,101,116,32,70,32,98,101,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,105,101,108,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,101,108,100>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46,32,84,104,101,32,115,117,98,115,101,116,32,83,32,105,115,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,32,83,32,121,32,105,102,32,120,32,87,32,121,32,102,111,114,32,115,111,109,101,32,120,32,105,110,32,70,32,97,110,100,32,102,111,114,32,115,111,109,101,32,121,32,105,110,32,70,46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,49,125,44,123,49,44,50,125,44,123,51,44,49,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,119,101,97,107,95,114,101,108,97,116,105,111,110,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,49,125,44,123,49,44,50,125,44,123,50,44,50,125,44,123,51,44,49,125,44,123,51,44,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,55,50,57>>,signature => [{attribute,763,spec,{{weak_relation,1},[{type,763,bounded_fun,[{type,763,'fun',[{type,763,product,[{var,763,'BinRel1'}]},{var,763,'BinRel2'}]},[{type,764,constraint,[{atom,764,is_subtype},[{var,764,'BinRel1'},{user_type,764,binary_relation,[]}]]},{type,765,constraint,[{atom,765,is_subtype},[{var,765,'BinRel2'},{user_type,765,binary_relation,[]}]]}]]}]}}]}},{{type,anyset,0},[{file,[115,111,102,115,46,101,114,108]},{location,117}],[<<45,116,121,112,101,32,97,110,121,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,121,32,107,105,110,100,32,111,102,32,115,101,116,32,40,97,108,115,111,32,105,110,99,108,117,100,101,100,32,97,114,101,32,116,104,101,32,97,116,111,109,105,99,32,115,101,116,115,41,46>>]}]},#{signature => [{attribute,117,type,{anyset,{type,117,union,[{user_type,117,ordset,[]},{user_type,117,a_set,[]}]},[]}}]}},{{type,binary_relation,0},[{file,[115,111,102,115,46,101,114,108]},{location,118}],[<<45,116,121,112,101,32,98,105,110,97,114,121,95,114,101,108,97,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,98,105,110,97,114,121,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<98,105,110,97,114,121,32,114,101,108,97,116,105,111,110>>]},<<46>>]}]},#{signature => [{attribute,118,type,{binary_relation,{user_type,118,relation,[]},[]}}]}},{{type,external_set,0},[{file,[115,111,102,115,46,101,114,108]},{location,119}],[<<45,116,121,112,101,32,101,120,116,101,114,110,97,108,95,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<46>>]}]},#{signature => [{attribute,119,type,{external_set,{type,119,term,[]},[]}}]}},{{type,family,0},[{file,[115,111,102,115,46,101,114,108]},{location,121}],[<<45,116,121,112,101,32,102,97,109,105,108,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,40,111,102,32,115,117,98,115,101,116,115,41,46>>]}]},#{signature => [{attribute,121,type,{family,{user_type,121,a_function,[]},[]}}]}},{{type,a_function,0},[{file,[115,111,102,115,46,101,114,108]},{location,120}],[<<45,116,121,112,101,32,97,95,102,117,110,99,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<46>>]}]},#{signature => [{attribute,120,type,{a_function,{user_type,120,relation,[]},[]}}]}},{{type,ordset,0},[{file,[115,111,102,115,46,101,114,108]},{location,122}],[<<45,116,121,112,101,32,111,114,100,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<111,114,100,101,114,101,100,32,115,101,116>>]},<<46>>]}]},#{signature => [{attribute,122,opaque,{ordset,{type,122,record,[{atom,122,'OrdSet'}]},[]}}]}},{{type,relation,0},[{file,[115,111,102,115,46,101,114,108]},{location,123}],[<<45,116,121,112,101,32,114,101,108,97,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,110,95,97,114,121,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<110,45,97,114,121,32,114,101,108,97,116,105,111,110>>]},<<46>>]}]},#{signature => [{attribute,123,type,{relation,{user_type,123,a_set,[]},[]}}]}},{{type,a_set,0},[{file,[115,111,102,115,46,101,114,108]},{location,124}],[<<45,116,121,112,101,32,97,95,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<46>>]}]},#{signature => [{attribute,124,opaque,{a_set,{type,124,record,[{atom,124,'Set'}]},[]}}]}},{{type,set_of_sets,0},[{file,[115,111,102,115,46,101,114,108]},{location,125}],[<<45,116,121,112,101,32,115,101,116,95,111,102,95,115,101,116,115,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<32,111,102,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,46>>]}]},#{signature => [{attribute,125,type,{set_of_sets,{user_type,125,a_set,[]},[]}}]}},{{type,set_fun,0},[{file,[115,111,102,115,46,101,114,108]},{location,126}],[<<45,116,121,112,101,32,115,101,116,95,102,117,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,95,102,117,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,101,116,70,117,110>>]},<<46>>]}]},#{signature => [{attribute,126,type,{set_fun,{type,126,union,[{type,126,pos_integer,[]},{type,127,tuple,[{atom,127,external},{type,127,'fun',[{type,127,product,[{user_type,127,external_set,[]}]},{user_type,127,external_set,[]}]}]},{type,128,'fun',[{type,128,product,[{user_type,128,anyset,[]}]},{user_type,128,anyset,[]}]}]},[]}}]}},{{type,spec_fun,0},[{file,[115,111,102,115,46,101,114,108]},{location,129}],[<<45,116,121,112,101,32,115,112,101,99,95,102,117,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,129,type,{spec_fun,{type,129,union,[{type,129,tuple,[{atom,129,external},{type,129,'fun',[{type,129,product,[{user_type,129,external_set,[]}]},{type,129,boolean,[]}]}]},{type,130,'fun',[{type,130,product,[{user_type,130,anyset,[]}]},{type,130,boolean,[]}]}]},[]}}]}},{{type,type,0},[{file,[115,111,102,115,46,101,114,108]},{location,131}],[<<45,116,121,112,101,32,116,121,112,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<46>>]}]},#{signature => [{attribute,131,type,{type,{type,131,term,[]},[]}}]}},{{type,tuple_of,1},[{file,[115,111,102,115,46,101,114,108]},{location,133}],[<<116,117,112,108,101,95,111,102,40,84,41>>],#{<<101,110>> => [{p,[],[<<65,32,116,117,112,108,101,32,119,104,101,114,101,32,116,104,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,102,32,116,121,112,101,32>>,{code,[],[<<84>>]},<<46>>]}]},#{signature => [{attribute,133,type,{tuple_of,{type,133,tuple,any},[{var,133,'_T'}]}}]}}]}. \ No newline at end of file
+{docs_v1,[{file,[115,111,102,115,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,#{<<101,110>> => [{p,[],[<<84,104,105,115,32,109,111,100,117,108,101,32,112,114,111,118,105,100,101,115,32,111,112,101,114,97,116,105,111,110,115,32,111,110,32,102,105,110,105,116,101,32,115,101,116,115,32,97,110,100,32,114,101,108,97,116,105,111,110,115,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,115,101,116,115,46,32,73,110,116,117,105,116,105,118,101,108,121,44,32,97,32,115,101,116,32,105,115,32,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,101,108,101,109,101,110,116,115,59,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,98,101,108,111,110,103,115,32,116,111,32,116,104,101,32,115,101,116,44,32,97,110,100,32,116,104,101,32,115,101,116,32,99,111,110,116,97,105,110,115,32,101,118,101,114,121,32,101,108,101,109,101,110,116,46>>]},{p,[],[<<71,105,118,101,110,32,97,32,115,101,116,32,65,32,97,110,100,32,97,32,115,101,110,116,101,110,99,101,32,83,40,120,41,44,32,119,104,101,114,101,32,120,32,105,115,32,97,32,102,114,101,101,32,118,97,114,105,97,98,108,101,44,32,97,32,110,101,119,32,115,101,116,32,66,32,119,104,111,115,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,101,120,97,99,116,108,121,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,102,111,114,32,119,104,105,99,104,32,83,40,120,41,32,104,111,108,100,115,32,99,97,110,32,98,101,32,102,111,114,109,101,100,44,32,116,104,105,115,32,105,115,32,100,101,110,111,116,101,100,32,66,194,160,61,32,123,120,194,160,105,110,194,160,65,194,160,58,32,83,40,120,41,125,46,32,83,101,110,116,101,110,99,101,115,32,97,114,101,32,101,120,112,114,101,115,115,101,100,32,117,115,105,110,103,32,116,104,101,32,108,111,103,105,99,97,108,32,111,112,101,114,97,116,111,114,115,32,34,102,111,114,32,115,111,109,101,34,32,40,111,114,32,34,116,104,101,114,101,32,101,120,105,115,116,115,34,41,44,32,34,102,111,114,32,97,108,108,34,44,32,34,97,110,100,34,44,32,34,111,114,34,44,32,34,110,111,116,34,46,32,73,102,32,116,104,101,32,101,120,105,115,116,101,110,99,101,32,111,102,32,97,32,115,101,116,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32,101,108,101,109,101,110,116,115,32,105,115,32,107,110,111,119,110,32,40,97,115,32,105,115,32,97,108,119,97,121,115,32,116,104,101,32,99,97,115,101,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,41,44,32,116,104,105,115,32,105,115,32,100,101,110,111,116,101,100,32,66,194,160,61,32,123,120,194,160,58,32,83,40,120,41,125,46>>]},{ul,[],[{li,[],[{p,[],[<<84,104,101,32>>,{em,[],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,97,44,32,98,44,32,97,110,100,32,99,32,105,115,32,100,101,110,111,116,101,100,32,123,97,44,194,160,98,44,194,160,99,125,46,32,84,104,105,115,32,110,111,116,97,116,105,111,110,32,105,115,32,110,111,116,32,116,111,32,98,101,32,99,111,110,102,117,115,101,100,32,119,105,116,104,32,116,117,112,108,101,115,46>>]},{p,[],[<<84,104,101,32>>,{em,[],[<<111,114,100,101,114,101,100,32,112,97,105,114>>]},<<32,111,102,32,97,32,97,110,100,32,98,44,32,119,105,116,104,32,102,105,114,115,116,32>>,{em,[],[<<99,111,111,114,100,105,110,97,116,101>>]},<<32,97,32,97,110,100,32,115,101,99,111,110,100,32,99,111,111,114,100,105,110,97,116,101,32,98,44,32,105,115,32,100,101,110,111,116,101,100,32,40,97,44,194,160,98,41,46,32,65,110,32,111,114,100,101,114,101,100,32,112,97,105,114,32,105,115,32,97,110,32>>,{em,[],[<<111,114,100,101,114,101,100,32,115,101,116>>]},<<32,111,102,32,116,119,111,32,101,108,101,109,101,110,116,115,46,32,73,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,111,114,100,101,114,101,100,32,115,101,116,115,32,99,97,110,32,99,111,110,116,97,105,110,32,111,110,101,44,32,116,119,111,44,32,111,114,32,109,111,114,101,32,101,108,101,109,101,110,116,115,44,32,97,110,100,32,112,97,114,101,110,116,104,101,115,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,101,110,99,108,111,115,101,32,116,104,101,32,101,108,101,109,101,110,116,115,46>>]},{p,[],[<<85,110,111,114,100,101,114,101,100,32,115,101,116,115,32,97,110,100,32,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,111,114,116,104,111,103,111,110,97,108,44,32,97,103,97,105,110,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,59,32,116,104,101,114,101,32,105,115,32,110,111,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,101,113,117,97,108,32,116,111,32,97,110,121,32,111,114,100,101,114,101,100,32,115,101,116,46>>]}]},{li,[],[{p,[],[<<84,104,101,32>>,{em,[],[<<101,109,112,116,121,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,115,32,110,111,32,101,108,101,109,101,110,116,115,46>>]},{p,[],[<<83,101,116,32,65,32,105,115,32>>,{a,[{id,<<101,113,117,97,108>>}],[]},{em,[],[<<101,113,117,97,108>>]},<<32,116,111,32,115,101,116,32,66,32,105,102,32,116,104,101,121,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32,101,108,101,109,101,110,116,115,44,32,119,104,105,99,104,32,105,115,32,100,101,110,111,116,101,100,32,65,194,160,61,194,160,66,46,32,84,119,111,32,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,101,113,117,97,108,32,105,102,32,116,104,101,121,32,99,111,110,116,97,105,110,32,116,104,101,32,115,97,109,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,97,110,100,32,104,97,118,101,32,101,113,117,97,108,32,101,108,101,109,101,110,116,115,32,97,116,32,101,97,99,104,32,99,111,111,114,100,105,110,97,116,101,46>>]},{p,[],[<<83,101,116,32,66,32,105,115,32,97,32>>,{a,[{id,<<115,117,98,115,101,116>>}],[]},{em,[],[<<115,117,98,115,101,116>>]},<<32,111,102,32,115,101,116,32,65,32,105,102,32,65,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,66,32,99,111,110,116,97,105,110,115,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<117,110,105,111,110>>}],[]},{em,[],[<<117,110,105,111,110>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,65,32,97,110,100,32,66,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,97,110,100,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,66,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<105,110,116,101,114,115,101,99,116,105,111,110>>}],[]},{em,[],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,65,32,97,110,100,32,66,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,66,46>>]},{p,[],[<<84,119,111,32,115,101,116,115,32,97,114,101,32>>,{a,[{id,<<100,105,115,106,111,105,110,116>>}],[]},{em,[],[<<100,105,115,106,111,105,110,116>>]},<<32,105,102,32,116,104,101,105,114,32,105,110,116,101,114,115,101,99,116,105,111,110,32,105,115,32,116,104,101,32,101,109,112,116,121,32,115,101,116,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<100,105,102,102,101,114,101,110,99,101>>}],[]},{em,[],[<<100,105,102,102,101,114,101,110,99,101>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,65,32,97,110,100,32,66,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,65,32,116,104,97,116,32,100,111,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32,66,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<115,121,109,109,101,116,114,105,99,95,100,105,102,102,101,114,101,110,99,101>>}],[]},{em,[],[<<115,121,109,109,101,116,114,105,99,32,100,105,102,102,101,114,101,110,99,101>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,116,104,111,115,101,32,101,108,101,109,101,110,116,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,101,105,116,104,101,114,32,111,102,32,116,104,101,32,116,119,111,32,115,101,116,115,44,32,98,117,116,32,110,111,116,32,98,111,116,104,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<117,110,105,111,110,95,110>>}],[]},{em,[],[<<117,110,105,111,110>>]},<<32,111,102,32,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,115,101,116,115,32,105,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,116,104,101,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,97,116,32,108,101,97,115,116,32,111,110,101,32,115,101,116,32,111,102,32,116,104,101,32,99,111,108,108,101,99,116,105,111,110,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<105,110,116,101,114,115,101,99,116,105,111,110,95,110>>}],[]},{em,[],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32,97,32,110,111,110,45,101,109,112,116,121,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,115,101,116,115,32,105,115,32,116,104,101,32,115,101,116,32,116,104,97,116,32,99,111,110,116,97,105,110,115,32,97,108,108,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32,101,118,101,114,121,32,115,101,116,32,111,102,32,116,104,101,32,99,111,108,108,101,99,116,105,111,110,46>>]}]},{li,[],[{p,[],[<<84,104,101,32>>,{a,[{id,<<67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,119,111,32,115,101,116,115,32,88,32,97,110,100,32,89,44,32,100,101,110,111,116,101,100,32,88,194,160,195,151,194,160,89,44,32,105,115,32,116,104,101,32,115,101,116,32,123,97,194,160,58,32,97,194,160,61,32,40,120,44,194,160,121,41,32,102,111,114,32,115,111,109,101,32,120,194,160,105,110,194,160,88,32,97,110,100,32,102,111,114,32,115,111,109,101,32,121,194,160,105,110,194,160,89,125,46>>]},{p,[],[<<65,32>>,{a,[{id,<<114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<114,101,108,97,116,105,111,110>>]},<<32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,88,194,160,195,151,194,160,89,46,32,76,101,116,32,82,32,98,101,32,97,32,114,101,108,97,116,105,111,110,46,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,40,120,44,194,160,121,41,32,98,101,108,111,110,103,115,32,116,111,32,82,32,105,115,32,119,114,105,116,116,101,110,32,97,115,32,120,194,160,82,194,160,121,46,32,65,115,32,114,101,108,97,116,105,111,110,115,32,97,114,101,32,115,101,116,115,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,115,32,111,102,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,40,115,117,98,115,101,116,44,32,117,110,105,111,110,44,32,97,110,100,32,115,111,32,111,110,41,32,97,112,112,108,121,32,116,111,32,114,101,108,97,116,105,111,110,115,32,97,115,32,119,101,108,108,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<100,111,109,97,105,110>>}],[]},{em,[],[<<100,111,109,97,105,110>>]},<<32,111,102,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,120,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,121,194,160,105,110,194,160,89,125,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<114,97,110,103,101>>}],[]},{em,[],[<<114,97,110,103,101>>]},<<32,111,102,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,121,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,120,194,160,105,110,194,160,88,125,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<99,111,110,118,101,114,115,101>>}],[]},{em,[],[<<99,111,110,118,101,114,115,101>>]},<<32,111,102,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,97,194,160,58,32,97,194,160,61,32,40,121,44,194,160,120,41,32,102,111,114,32,115,111,109,101,32,40,120,44,194,160,121,41,194,160,105,110,194,160,82,125,46>>]},{p,[],[<<73,102,32,65,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,88,44,32,116,104,101,32>>,{a,[{id,<<105,109,97,103,101>>}],[]},{em,[],[<<105,109,97,103,101>>]},<<32,111,102,32,65,32,117,110,100,101,114,32,82,32,105,115,32,116,104,101,32,115,101,116,32,123,121,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,120,194,160,105,110,194,160,65,125,46,32,73,102,32,66,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,89,44,32,116,104,101,32>>,{a,[{id,<<105,110,118,101,114,115,101,95,105,109,97,103,101>>}],[]},{em,[],[<<105,110,118,101,114,115,101,32,105,109,97,103,101>>]},<<32,111,102,32,66,32,105,115,32,116,104,101,32,115,101,116,32,123,120,194,160,58,32,120,194,160,82,194,160,121,32,102,111,114,32,115,111,109,101,32,121,194,160,105,110,194,160,66,125,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,88,32,116,111,32,89,44,32,97,110,100,32,83,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,89,32,116,111,32,90,44,32,116,104,101,32>>,{a,[{id,<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,82,32,97,110,100,32,83,32,105,115,32,116,104,101,32,114,101,108,97,116,105,111,110,32,84,32,102,114,111,109,32,88,32,116,111,32,90,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,84,194,160,122,32,105,102,32,97,110,100,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,101,120,105,115,116,115,32,97,110,32,101,108,101,109,101,110,116,32,121,32,105,110,32,89,32,115,117,99,104,32,116,104,97,116,32,120,194,160,82,194,160,121,32,97,110,100,32,121,194,160,83,194,160,122,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<114,101,115,116,114,105,99,116,105,111,110>>}],[]},{em,[],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32,82,32,116,111,32,65,32,105,115,32,116,104,101,32,115,101,116,32,83,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,83,194,160,121,32,105,102,32,97,110,100,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,101,120,105,115,116,115,32,97,110,32,101,108,101,109,101,110,116,32,120,32,105,110,32,65,32,115,117,99,104,32,116,104,97,116,32,120,194,160,82,194,160,121,46>>]},{p,[],[<<73,102,32,83,32,105,115,32,97,32,114,101,115,116,114,105,99,116,105,111,110,32,111,102,32,82,32,116,111,32,65,44,32,116,104,101,110,32,82,32,105,115,32,97,110,32>>,{a,[{id,<<101,120,116,101,110,115,105,111,110>>}],[]},{em,[],[<<101,120,116,101,110,115,105,111,110>>]},<<32,111,102,32,83,32,116,111,32,88,46>>]},{p,[],[<<73,102,32,88,194,160,61,194,160,89,44,32,116,104,101,110,32,82,32,105,115,32,99,97,108,108,101,100,32,97,32,114,101,108,97,116,105,111,110,32>>,{em,[],[<<105,110>>]},<<32,88,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<102,105,101,108,100>>}],[]},{em,[],[<<102,105,101,108,100>>]},<<32,111,102,32,97,32,114,101,108,97,116,105,111,110,32,82,32,105,110,32,88,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,82,32,97,110,100,32,116,104,101,32,114,97,110,103,101,32,111,102,32,82,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,97,110,100,32,105,102,32,83,32,105,115,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,83,194,160,121,32,105,102,32,120,194,160,82,194,160,121,32,97,110,100,32,110,111,116,32,120,194,160,61,194,160,121,44,32,116,104,101,110,32,83,32,105,115,32,116,104,101,32>>,{a,[{id,<<115,116,114,105,99,116,95,114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<115,116,114,105,99,116>>]},<<32,114,101,108,97,116,105,111,110,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,82,46,32,67,111,110,118,101,114,115,101,108,121,44,32,105,102,32,83,32,105,115,32,97,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,97,110,100,32,105,102,32,82,32,105,115,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,82,194,160,121,32,105,102,32,120,194,160,83,194,160,121,32,111,114,32,120,194,160,61,194,160,121,44,32,116,104,101,110,32,82,32,105,115,32,116,104,101,32>>,{a,[{id,<<119,101,97,107,95,114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<119,101,97,107>>]},<<32,114,101,108,97,116,105,111,110,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,83,46>>]},{p,[],[<<65,32,114,101,108,97,116,105,111,110,32,82,32,105,110,32,88,32,105,115,32>>,{em,[],[<<114,101,102,108,101,120,105,118,101>>]},<<32,105,102,32,120,194,160,82,194,160,120,32,102,111,114,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,120,32,111,102,32,88,44,32,105,116,32,105,115,32>>,{em,[],[<<115,121,109,109,101,116,114,105,99>>]},<<32,105,102,32,120,194,160,82,194,160,121,32,105,109,112,108,105,101,115,32,116,104,97,116,32,121,194,160,82,194,160,120,44,32,97,110,100,32,105,116,32,105,115,32>>,{em,[],[<<116,114,97,110,115,105,116,105,118,101>>]},<<32,105,102,32,120,194,160,82,194,160,121,32,97,110,100,32,121,194,160,82,194,160,122,32,105,109,112,108,121,32,116,104,97,116,32,120,194,160,82,194,160,122,46>>]}]},{li,[],[{p,[],[<<65,32>>,{a,[{id,<<102,117,110,99,116,105,111,110>>}],[]},{em,[],[<<102,117,110,99,116,105,111,110>>]},<<32,70,32,105,115,32,97,32,114,101,108,97,116,105,111,110,44,32,97,32,115,117,98,115,101,116,32,111,102,32,88,194,160,195,151,194,160,89,44,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,70,32,105,115,32,101,113,117,97,108,32,116,111,32,88,32,97,110,100,32,115,117,99,104,32,116,104,97,116,32,102,111,114,32,101,118,101,114,121,32,120,32,105,110,32,88,32,116,104,101,114,101,32,105,115,32,97,32,117,110,105,113,117,101,32,101,108,101,109,101,110,116,32,121,32,105,110,32,89,32,119,105,116,104,32,40,120,44,194,160,121,41,32,105,110,32,70,46,32,84,104,101,32,108,97,116,116,101,114,32,99,111,110,100,105,116,105,111,110,32,99,97,110,32,98,101,32,102,111,114,109,117,108,97,116,101,100,32,97,115,32,102,111,108,108,111,119,115,58,32,105,102,32,120,194,160,70,194,160,121,32,97,110,100,32,120,194,160,70,194,160,122,44,32,116,104,101,110,32,121,194,160,61,194,160,122,46,32,73,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,105,116,32,105,115,32,110,111,116,32,114,101,113,117,105,114,101,100,32,116,104,97,116,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,70,32,105,115,32,101,113,117,97,108,32,116,111,32,88,32,102,111,114,32,97,32,114,101,108,97,116,105,111,110,32,116,111,32,98,101,32,99,111,110,115,105,100,101,114,101,100,32,97,32,102,117,110,99,116,105,111,110,46>>]},{p,[],[<<73,110,115,116,101,97,100,32,111,102,32,119,114,105,116,105,110,103,32,40,120,44,194,160,121,41,194,160,105,110,194,160,70,32,111,114,32,120,194,160,70,194,160,121,44,32,119,101,32,119,114,105,116,101,32,70,40,120,41,194,160,61,194,160,121,32,119,104,101,110,32,70,32,105,115,32,97,32,102,117,110,99,116,105,111,110,44,32,97,110,100,32,115,97,121,32,116,104,97,116,32,70,32,109,97,112,115,32,120,32,111,110,116,111,32,121,44,32,111,114,32,116,104,97,116,32,116,104,101,32,118,97,108,117,101,32,111,102,32,70,32,97,116,32,120,32,105,115,32,121,46>>]},{p,[],[<<65,115,32,102,117,110,99,116,105,111,110,115,32,97,114,101,32,114,101,108,97,116,105,111,110,115,44,32,116,104,101,32,100,101,102,105,110,105,116,105,111,110,115,32,111,102,32,116,104,101,32,108,97,115,116,32,105,116,101,109,32,40,100,111,109,97,105,110,44,32,114,97,110,103,101,44,32,97,110,100,32,115,111,32,111,110,41,32,97,112,112,108,121,32,116,111,32,102,117,110,99,116,105,111,110,115,32,97,115,32,119,101,108,108,46>>]},{p,[],[<<73,102,32,116,104,101,32,99,111,110,118,101,114,115,101,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,70,32,105,115,32,97,32,102,117,110,99,116,105,111,110,32,70,39,44,32,116,104,101,110,32,70,39,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{a,[{id,<<105,110,118,101,114,115,101>>}],[]},{em,[],[<<105,110,118,101,114,115,101>>]},<<32,111,102,32,70,46>>]},{p,[],[<<84,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,116,119,111,32,102,117,110,99,116,105,111,110,115,32,70,49,32,97,110,100,32,70,50,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{a,[{id,<<99,111,109,112,111,115,105,116,101>>}],[]},{em,[],[<<99,111,109,112,111,115,105,116,101>>]},<<32,111,102,32,70,49,32,97,110,100,32,70,50,32,105,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,70,49,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,70,50,46>>]}]},{li,[],[{p,[],[<<83,111,109,101,116,105,109,101,115,44,32,119,104,101,110,32,116,104,101,32,114,97,110,103,101,32,111,102,32,97,32,102,117,110,99,116,105,111,110,32,105,115,32,109,111,114,101,32,105,109,112,111,114,116,97,110,116,32,116,104,97,110,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,116,115,101,108,102,44,32,116,104,101,32,102,117,110,99,116,105,111,110,32,105,115,32,99,97,108,108,101,100,32,97,32>>,{em,[],[<<102,97,109,105,108,121>>]},<<46>>]},{p,[],[<<84,104,101,32,100,111,109,97,105,110,32,111,102,32,97,32,102,97,109,105,108,121,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{em,[],[<<105,110,100,101,120,32,115,101,116>>]},<<44,32,97,110,100,32,116,104,101,32,114,97,110,103,101,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{em,[],[<<105,110,100,101,120,101,100,32,115,101,116>>]},<<46>>]},{p,[],[<<73,102,32,120,32,105,115,32,97,32,102,97,109,105,108,121,32,102,114,111,109,32,73,32,116,111,32,88,44,32,116,104,101,110,32,120,91,105,93,32,100,101,110,111,116,101,115,32,116,104,101,32,118,97,108,117,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,32,97,116,32,105,110,100,101,120,32,105,46,32,84,104,101,32,110,111,116,97,116,105,111,110,32,34,97,32,102,97,109,105,108,121,32,105,110,32,88,34,32,105,115,32,117,115,101,100,32,102,111,114,32,115,117,99,104,32,97,32,102,97,109,105,108,121,46>>]},{p,[],[<<87,104,101,110,32,116,104,101,32,105,110,100,101,120,101,100,32,115,101,116,32,105,115,32,97,32,115,101,116,32,111,102,32,115,117,98,115,101,116,115,32,111,102,32,97,32,115,101,116,32,88,44,32,119,101,32,99,97,108,108,32,120,32,97,32>>,{a,[{id,<<102,97,109,105,108,121>>}],[]},{em,[],[<<102,97,109,105,108,121,32,111,102,32,115,117,98,115,101,116,115>>]},<<32,111,102,32,88,46>>]},{p,[],[<<73,102,32,120,32,105,115,32,97,32,102,97,109,105,108,121,32,111,102,32,115,117,98,115,101,116,115,32,111,102,32,88,44,32,116,104,101,32,117,110,105,111,110,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,120,32,105,115,32,99,97,108,108,101,100,32,116,104,101,32>>,{em,[],[<<117,110,105,111,110,32,111,102,32,116,104,101,32,102,97,109,105,108,121>>]},<<32,120,46>>]},{p,[],[<<73,102,32,120,32,105,115,32,110,111,110,45,101,109,112,116,121,32,40,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,110,111,110,45,101,109,112,116,121,41,44,32,116,104,101,32>>,{em,[],[<<105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32,102,97,109,105,108,121>>]},<<32,120,32,105,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,120,46>>]},{p,[],[<<73,110,32,116,104,105,115,32,109,111,100,117,108,101,44,32,116,104,101,32,111,110,108,121,32,102,97,109,105,108,105,101,115,32,116,104,97,116,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,97,114,101,32,102,97,109,105,108,105,101,115,32,111,102,32,115,117,98,115,101,116,115,32,111,102,32,115,111,109,101,32,115,101,116,32,88,59,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,116,104,101,32,119,111,114,100,32,34,102,97,109,105,108,121,34,32,105,115,32,117,115,101,100,32,102,111,114,32,115,117,99,104,32,102,97,109,105,108,105,101,115,32,111,102,32,115,117,98,115,101,116,115,46>>]}]},{li,[],[{p,[],[<<65,32>>,{a,[{id,<<112,97,114,116,105,116,105,111,110>>}],[]},{em,[],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32,97,32,115,101,116,32,88,32,105,115,32,97,32,99,111,108,108,101,99,116,105,111,110,32,83,32,111,102,32,110,111,110,45,101,109,112,116,121,32,115,117,98,115,101,116,115,32,111,102,32,88,32,119,104,111,115,101,32,117,110,105,111,110,32,105,115,32,88,32,97,110,100,32,119,104,111,115,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,112,97,105,114,119,105,115,101,32,100,105,115,106,111,105,110,116,46>>]},{p,[],[<<65,32,114,101,108,97,116,105,111,110,32,105,110,32,97,32,115,101,116,32,105,115,32,97,110,32>>,{em,[],[<<101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110>>]},<<32,105,102,32,105,116,32,105,115,32,114,101,102,108,101,120,105,118,101,44,32,115,121,109,109,101,116,114,105,99,44,32,97,110,100,32,116,114,97,110,115,105,116,105,118,101,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,110,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,97,110,100,32,120,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,88,44,32,116,104,101,32>>,{a,[{id,<<101,113,117,105,118,97,108,101,110,99,101,95,99,108,97,115,115>>}],[]},{em,[],[<<101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115>>]},<<32,111,102,32,120,32,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,32,82,32,105,115,32,116,104,101,32,115,101,116,32,111,102,32,97,108,108,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,121,32,111,102,32,88,32,102,111,114,32,119,104,105,99,104,32,120,194,160,82,194,160,121,32,104,111,108,100,115,46,32,84,104,101,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,101,115,32,99,111,110,115,116,105,116,117,116,101,32,97,32,112,97,114,116,105,116,105,111,110,105,110,103,32,111,102,32,88,46,32,67,111,110,118,101,114,115,101,108,121,44,32,105,102,32,67,32,105,115,32,97,32,112,97,114,116,105,116,105,111,110,32,111,102,32,88,44,32,116,104,101,32,114,101,108,97,116,105,111,110,32,116,104,97,116,32,104,111,108,100,115,32,102,111,114,32,97,110,121,32,116,119,111,32,101,108,101,109,101,110,116,115,32,111,102,32,88,32,105,102,32,116,104,101,121,32,98,101,108,111,110,103,32,116,111,32,116,104,101,32,115,97,109,101,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,44,32,105,115,32,97,110,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,100,117,99,101,100,32,98,121,32,116,104,101,32,112,97,114,116,105,116,105,111,110,32,67,46>>]},{p,[],[<<73,102,32,82,32,105,115,32,97,110,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,32,88,44,32,116,104,101,32>>,{a,[{id,<<99,97,110,111,110,105,99,97,108,95,109,97,112>>}],[]},{em,[],[<<99,97,110,111,110,105,99,97,108,32,109,97,112>>]},<<32,105,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,109,97,112,115,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,111,102,32,88,32,111,110,116,111,32,105,116,115,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,46>>]}]},{li,[],[{p,[],[{a,[{id,<<98,105,110,97,114,121,95,114,101,108,97,116,105,111,110>>}],[]},<<82,101,108,97,116,105,111,110,115,32,97,115,32,100,101,102,105,110,101,100,32,97,98,111,118,101,32,40,97,115,32,115,101,116,115,32,111,102,32,111,114,100,101,114,101,100,32,112,97,105,114,115,41,32,97,114,101,32,102,114,111,109,32,110,111,119,32,111,110,32,114,101,102,101,114,114,101,100,32,116,111,32,97,115,32>>,{em,[],[<<98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115>>]},<<46>>]},{p,[],[<<87,101,32,99,97,108,108,32,97,32,115,101,116,32,111,102,32,111,114,100,101,114,101,100,32,115,101,116,115,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,32,97,110,32>>,{a,[{id,<<110,95,97,114,121,95,114,101,108,97,116,105,111,110>>}],[]},{em,[],[<<40,110,45,97,114,121,41,32,114,101,108,97,116,105,111,110>>]},<<44,32,97,110,100,32,115,97,121,32,116,104,97,116,32,116,104,101,32,114,101,108,97,116,105,111,110,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32,116,104,101,32>>,{a,[{id,<<67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116,95,116,117,112,108,101>>}],[]},<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116,32,88,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,88,91,110,93,44,32,119,104,101,114,101,32,120,91,105,93,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,88,91,105,93,44,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<112,114,111,106,101,99,116,105,111,110>>}],[]},{em,[],[<<112,114,111,106,101,99,116,105,111,110>>]},<<32,111,102,32,97,110,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,32,82,32,111,110,116,111,32,99,111,111,114,100,105,110,97,116,101,32,105,32,105,115,32,116,104,101,32,115,101,116,32,123,120,91,105,93,194,160,58,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,105,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,32,105,110,32,82,32,102,111,114,32,115,111,109,101,32,120,91,106,93,194,160,105,110,194,160,88,91,106,93,44,32,49,194,160,60,61,194,160,106,194,160,60,61,194,160,110,32,97,110,100,32,110,111,116,32,105,194,160,61,194,160,106,125,46,32,84,104,101,32,112,114,111,106,101,99,116,105,111,110,115,32,111,102,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,82,32,111,110,116,111,32,116,104,101,32,102,105,114,115,116,32,97,110,100,32,115,101,99,111,110,100,32,99,111,111,114,100,105,110,97,116,101,115,32,97,114,101,32,116,104,101,32,100,111,109,97,105,110,32,97,110,100,32,116,104,101,32,114,97,110,103,101,32,111,102,32,82,44,32,114,101,115,112,101,99,116,105,118,101,108,121,46>>]},{p,[],[<<84,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,99,97,110,32,98,101,32,103,101,110,101,114,97,108,105,122,101,100,32,116,111,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,115,32,97,115,32,102,111,108,108,111,119,115,46,32,76,101,116,32,84,82,32,98,101,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,102,114,111,109,32,88,32,116,111,32,89,91,105,93,32,97,110,100,32,83,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,40,89,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,89,91,110,93,41,32,116,111,32,90,46,32,84,104,101,32>>,{a,[{id,<<116,117,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,84,82,32,97,110,100,32,83,32,105,115,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,84,32,102,114,111,109,32,88,32,116,111,32,90,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,194,160,84,194,160,122,32,105,102,32,97,110,100,32,111,110,108,121,32,105,102,32,116,104,101,114,101,32,101,120,105,115,116,115,32,97,110,32,101,108,101,109,101,110,116,32,121,91,105,93,32,105,110,32,89,91,105,93,32,102,111,114,32,101,97,99,104,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,32,115,117,99,104,32,116,104,97,116,32,120,194,160,82,91,105,93,194,160,121,91,105,93,32,97,110,100,32,40,121,91,49,93,44,194,160,46,46,46,44,194,160,121,91,110,93,41,194,160,83,194,160,122,46,32,78,111,119,32,108,101,116,32,84,82,32,98,101,32,97,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,102,114,111,109,32,88,91,105,93,32,116,111,32,89,91,105,93,32,97,110,100,32,83,32,97,32,115,117,98,115,101,116,32,111,102,32,88,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,88,91,110,93,46,32,84,104,101,32>>,{a,[{id,<<109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>}],[]},{em,[],[<<109,117,108,116,105,112,108,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,84,82,32,97,110,100,32,83,32,105,115,32,100,101,102,105,110,101,100,32,116,111,32,98,101,32,116,104,101,32,115,101,116,32,123,122,194,160,58,32,122,194,160,61,32,40,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,44,32,40,121,91,49,93,44,46,46,46,44,121,91,110,93,41,41,32,102,111,114,32,115,111,109,101,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,194,160,105,110,194,160,83,32,97,110,100,32,102,111,114,32,115,111,109,101,32,40,120,91,105,93,44,194,160,121,91,105,93,41,32,105,110,32,82,91,105,93,44,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,125,46>>]},{p,[],[<<84,104,101,32>>,{a,[{id,<<110,97,116,117,114,97,108,95,106,111,105,110>>}],[]},{em,[],[<<110,97,116,117,114,97,108,32,106,111,105,110>>]},<<32,111,102,32,97,110,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,32,82,32,97,110,100,32,97,110,32,109,45,97,114,121,32,114,101,108,97,116,105,111,110,32,83,32,111,110,32,99,111,111,114,100,105,110,97,116,101,32,105,32,97,110,100,32,106,32,105,115,32,100,101,102,105,110,101,100,32,116,111,32,98,101,32,116,104,101,32,115,101,116,32,123,122,194,160,58,32,122,194,160,61,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,44,194,160,32,121,91,49,93,44,194,160,46,46,46,44,194,160,121,91,106,45,49,93,44,194,160,121,91,106,43,49,93,44,194,160,46,46,46,44,194,160,121,91,109,93,41,32,102,111,114,32,115,111,109,101,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,194,160,105,110,194,160,82,32,97,110,100,32,102,111,114,32,115,111,109,101,32,40,121,91,49,93,44,194,160,46,46,46,44,194,160,121,91,109,93,41,194,160,105,110,194,160,83,32,115,117,99,104,32,116,104,97,116,32,120,91,105,93,194,160,61,194,160,121,91,106,93,125,46>>]}]},{li,[],[{p,[],[{a,[{id,<<115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>}],[]},<<84,104,101,32,115,101,116,115,32,114,101,99,111,103,110,105,122,101,100,32,98,121,32,116,104,105,115,32,109,111,100,117,108,101,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,114,101,108,97,116,105,111,110,32,83,101,116,115,44,32,119,104,105,99,104,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,116,104,101,32,115,109,97,108,108,101,115,116,32,115,101,116,32,115,117,99,104,32,116,104,97,116,58>>]},{ul,[],[{li,[],[{p,[],[<<70,111,114,32,101,118,101,114,121,32,97,116,111,109,32,84,44,32,101,120,99,101,112,116,32,39,95,39,44,32,97,110,100,32,102,111,114,32,101,118,101,114,121,32,116,101,114,109,32,88,44,32,40,84,44,194,160,88,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40>>,{em,[],[<<97,116,111,109,105,99,32,115,101,116,115>>]},<<41,46>>]}]},{li,[],[{p,[],[<<40,91,39,95,39,93,44,194,160,91,93,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40,116,104,101,32>>,{em,[],[<<117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116>>]},<<41,46>>]}]},{li,[],[{p,[],[<<70,111,114,32,101,118,101,114,121,32,116,117,112,108,101,32,84,194,160,61,32,123,84,91,49,93,44,194,160,46,46,46,44,194,160,84,91,110,93,125,32,97,110,100,32,102,111,114,32,101,118,101,114,121,32,116,117,112,108,101,32,88,194,160,61,32,123,88,91,49,93,44,194,160,46,46,46,44,194,160,88,91,110,93,125,44,32,105,102,32,40,84,91,105,93,44,194,160,88,91,105,93,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,102,111,114,32,101,118,101,114,121,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,44,32,116,104,101,110,32,40,84,44,194,160,88,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40>>,{em,[],[<<111,114,100,101,114,101,100,32,115,101,116,115>>]},<<41,46>>]}]},{li,[],[{p,[],[<<70,111,114,32,101,118,101,114,121,32,116,101,114,109,32,84,44,32,105,102,32,88,32,105,115,32,116,104,101,32,101,109,112,116,121,32,108,105,115,116,32,111,114,32,97,32,110,111,110,45,101,109,112,116,121,32,115,111,114,116,101,100,32,108,105,115,116,32,91,88,91,49,93,44,194,160,46,46,46,44,194,160,88,91,110,93,93,32,119,105,116,104,111,117,116,32,100,117,112,108,105,99,97,116,101,115,32,115,117,99,104,32,116,104,97,116,32,40,84,44,194,160,88,91,105,93,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,102,111,114,32,101,118,101,114,121,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,44,32,116,104,101,110,32,40,91,84,93,44,194,160,88,41,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,115,32,40>>,{em,[],[<<116,121,112,101,100,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115>>]},<<41,46>>]}]}]},{p,[],[<<65,110,32>>,{a,[{id,<<101,120,116,101,114,110,97,108,95,115,101,116>>}],[]},{em,[],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,83,101,116,115,46>>]},{p,[],[<<65,32>>,{a,[{id,<<116,121,112,101>>}],[]},{em,[],[<<116,121,112,101>>]},<<32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,83,101,116,115,46>>]},{p,[],[<<73,102,32,83,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,40,84,44,194,160,88,41,32,111,102,32,83,101,116,115,44,32,116,104,101,110,32,84,32,105,115,32,97,32>>,{a,[{id,<<118,97,108,105,100,95,116,121,112,101>>}],[]},{em,[],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,111,102,32,88,44,32,84,32,105,115,32,116,104,101,32,116,121,112,101,32,111,102,32,83,44,32,97,110,100,32,88,32,105,115,32,116,104,101,32,101,120,116,101,114,110,97,108,32,115,101,116,32,111,102,32,83,46,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,116,101,114,109,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,116,101,114,109,47,50>>]}]},<<32,99,114,101,97,116,101,115,32,97,32,115,101,116,32,102,114,111,109,32,97,32,116,121,112,101,32,97,110,100,32,97,110,32,69,114,108,97,110,103,32,116,101,114,109,32,116,117,114,110,101,100,32,105,110,116,111,32,97,110,32,101,120,116,101,114,110,97,108,32,115,101,116,46>>]},{p,[],[<<84,104,101,32,115,101,116,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,83,101,116,115,32,97,114,101,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,114,97,110,103,101,32,111,102,32,102,117,110,99,116,105,111,110,32,83,101,116,32,102,114,111,109,32,83,101,116,115,32,116,111,32,69,114,108,97,110,103,32,116,101,114,109,115,32,97,110,100,32,115,101,116,115,32,111,102,32,69,114,108,97,110,103,32,116,101,114,109,115,58>>]},{ul,[],[{li,[],[<<83,101,116,40,84,44,84,101,114,109,41,194,160,61,32,84,101,114,109,44,32,119,104,101,114,101,32,84,32,105,115,32,97,110,32,97,116,111,109>>]},{li,[],[<<83,101,116,40,123,84,91,49,93,44,194,160,46,46,46,44,194,160,84,91,110,93,125,44,194,160,123,88,91,49,93,44,194,160,46,46,46,44,32,194,160,88,91,110,93,125,41,194,160,61,32,40,83,101,116,40,84,91,49,93,44,194,160,88,91,49,93,41,44,194,160,46,46,46,44,194,160,32,83,101,116,40,84,91,110,93,44,194,160,88,91,110,93,41,41>>]},{li,[],[<<83,101,116,40,91,84,93,44,194,160,91,88,91,49,93,44,194,160,46,46,46,44,194,160,88,91,110,93,93,41,194,160,61,32,123,83,101,116,40,84,44,194,160,88,91,49,93,41,44,194,160,46,46,46,44,194,160,83,101,116,40,84,44,194,160,88,91,110,93,41,125>>]},{li,[],[<<83,101,116,40,91,84,93,44,194,160,91,93,41,194,160,61,32,123,125>>]}]},{p,[],[<<87,104,101,110,32,116,104,101,114,101,32,105,115,32,110,111,32,114,105,115,107,32,111,102,32,99,111,110,102,117,115,105,111,110,44,32,101,108,101,109,101,110,116,115,32,111,102,32,83,101,116,115,32,97,114,101,32,105,100,101,110,116,105,102,105,101,100,32,119,105,116,104,32,116,104,101,32,115,101,116,115,32,116,104,101,121,32,114,101,112,114,101,115,101,110,116,46,32,70,111,114,32,101,120,97,109,112,108,101,44,32,105,102,32,85,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,99,97,108,108,105,110,103,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<117,110,105,111,110,47,50>>]}]},<<32,119,105,116,104,32,83,49,32,97,110,100,32,83,50,32,97,115,32,97,114,103,117,109,101,110,116,115,44,32,116,104,101,110,32,85,32,105,115,32,115,97,105,100,32,116,111,32,98,101,32,116,104,101,32,117,110,105,111,110,32,111,102,32,83,49,32,97,110,100,32,83,50,46,32,65,32,109,111,114,101,32,112,114,101,99,105,115,101,32,102,111,114,109,117,108,97,116,105,111,110,32,105,115,32,116,104,97,116,32,83,101,116,40,85,41,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32,83,101,116,40,83,49,41,32,97,110,100,32,83,101,116,40,83,50,41,46>>]}]}]},{p,[],[<<84,104,101,32,116,121,112,101,115,32,97,114,101,32,117,115,101,100,32,116,111,32,105,109,112,108,101,109,101,110,116,32,116,104,101,32,118,97,114,105,111,117,115,32,99,111,110,100,105,116,105,111,110,115,32,116,104,97,116,32,115,101,116,115,32,109,117,115,116,32,102,117,108,102,105,108,108,46,32,65,115,32,97,110,32,101,120,97,109,112,108,101,44,32,99,111,110,115,105,100,101,114,32,116,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,116,119,111,32,115,101,116,115,32,82,32,97,110,100,32,83,44,32,97,110,100,32,114,101,99,97,108,108,32,116,104,97,116,32,116,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,32,111,102,32,82,32,97,110,100,32,83,32,105,115,32,100,101,102,105,110,101,100,32,105,102,32,82,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,116,111,32,89,32,97,110,100,32,83,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,89,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,105,109,112,108,101,109,101,110,116,115,32,116,104,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116,44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>]}]},<<44,32,99,104,101,99,107,115,32,116,104,97,116,32,116,104,101,32,97,114,103,117,109,101,110,116,115,32,114,101,112,114,101,115,101,110,116,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,98,121,32,109,97,116,99,104,105,110,103,32,91,123,65,44,66,125,93,32,97,103,97,105,110,115,116,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116,32,40,65,114,103,49,32,115,97,121,41,44,32,97,110,100,32,91,123,67,44,68,125,93,32,97,103,97,105,110,115,116,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,40,65,114,103,50,32,115,97,121,41,46,32,84,104,101,32,102,97,99,116,32,116,104,97,116,32,91,123,65,44,66,125,93,32,109,97,116,99,104,101,115,32,116,104,101,32,116,121,112,101,32,111,102,32,65,114,103,49,32,105,115,32,116,111,32,98,101,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,65,114,103,49,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,88,32,116,111,32,89,44,32,119,104,101,114,101,32,88,32,105,115,32,100,101,102,105,110,101,100,32,97,115,32,97,108,108,32,115,101,116,115,32,83,101,116,40,120,41,32,102,111,114,32,115,111,109,101,32,101,108,101,109,101,110,116,32,120,32,105,110,32,83,101,116,115,32,116,104,101,32,116,121,112,101,32,111,102,32,119,104,105,99,104,32,105,115,32,65,44,32,97,110,100,32,115,105,109,105,108,97,114,108,121,32,102,111,114,32,89,46,32,73,110,32,116,104,101,32,115,97,109,101,32,119,97,121,32,65,114,103,50,32,105,115,32,105,110,116,101,114,112,114,101,116,101,100,32,97,115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,114,111,109,32,87,32,116,111,32,90,46,32,70,105,110,97,108,108,121,32,105,116,32,105,115,32,99,104,101,99,107,101,100,32,116,104,97,116,32,66,32,109,97,116,99,104,101,115,32,67,44,32,119,104,105,99,104,32,105,115,32,115,117,102,102,105,99,105,101,110,116,32,116,111,32,101,110,115,117,114,101,32,116,104,97,116,32,87,32,105,115,32,101,113,117,97,108,32,116,111,32,89,46,32,84,104,101,32,117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116,32,105,115,32,104,97,110,100,108,101,100,32,115,101,112,97,114,97,116,101,108,121,58,32,105,116,115,32,116,121,112,101,44,32,91,39,95,39,93,44,32,109,97,116,99,104,101,115,32,116,104,101,32,116,121,112,101,32,111,102,32,97,110,121,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46>>]},{p,[],[<<65,32,102,101,119,32,102,117,110,99,116,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,32,40>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,114,101,115,116,114,105,99,116,105,111,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,114,101,115,116,114,105,99,116,105,111,110,47,51>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,97,114,116,105,116,105,111,110,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,114,111,106,101,99,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<112,114,111,106,101,99,116,105,111,110,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110,47,51>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,115,116,114,105,99,116,105,111,110,47,51>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,117,98,115,116,105,116,117,116,105,111,110,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,117,98,115,116,105,116,117,116,105,111,110,47,50>>]}]},<<41,32,97,99,99,101,112,116,32,97,110,32,69,114,108,97,110,103,32,102,117,110,99,116,105,111,110,32,97,115,32,97,32,109,101,97,110,115,32,116,111,32,109,111,100,105,102,121,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,97,32,103,105,118,101,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46,32>>,{a,[{id,<<115,101,116,95,102,117,110>>}],[]},<<83,117,99,104,32,97,32,102,117,110,99,116,105,111,110,44,32,99,97,108,108,101,100,32,83,101,116,70,117,110,32,105,110,32,116,104,101,32,102,111,108,108,111,119,105,110,103,44,32,99,97,110,32,98,101,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,102,117,110,99,116,105,111,110,97,108,32,111,98,106,101,99,116,32,40,102,117,110,41,44,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,194,160,70,117,110,125>>]},<<44,32,111,114,32,97,110,32,105,110,116,101,103,101,114,58>>]},{ul,[],[{li,[],[{p,[],[<<73,102,32,83,101,116,70,117,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,102,117,110,44,32,116,104,101,32,102,117,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,103,105,118,101,110,32,115,101,116,32,97,110,100,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,115,115,117,109,101,100,32,116,111,32,98,101,32,97,32,115,101,116,46>>]}]},{li,[],[{p,[],[<<73,102,32,83,101,116,70,117,110,32,105,115,32,115,112,101,99,105,102,105,101,100,32,97,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,32,70,117,110,125>>]},<<44,32,70,117,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,101,120,116,101,114,110,97,108,32,115,101,116,32,111,102,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,103,105,118,101,110,32,115,101,116,32,97,110,100,32,116,104,101,32,114,101,116,117,114,110,32,118,97,108,117,101,32,105,115,32,97,115,115,117,109,101,100,32,116,111,32,98,101,32,97,110,32,101,120,116,101,114,110,97,108,32,115,101,116,46,32,83,101,108,101,99,116,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,97,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,97,115,32,101,120,116,101,114,110,97,108,32,115,101,116,115,32,97,110,100,32,97,115,115,101,109,98,108,105,110,103,32,97,32,110,101,119,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,102,114,111,109,32,97,32,108,105,115,116,32,111,102,32,101,120,116,101,114,110,97,108,32,115,101,116,115,32,105,115,32,105,110,32,116,104,101,32,112,114,101,115,101,110,116,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,32,116,104,97,110,32,109,111,100,105,102,121,105,110,103,32,101,97,99,104,32,101,108,101,109,101,110,116,32,97,115,32,97,32,115,101,116,46,32,72,111,119,101,118,101,114,44,32,116,104,105,115,32,111,112,116,105,109,105,122,97,116,105,111,110,32,99,97,110,32,111,110,108,121,32,98,101,32,117,115,101,100,32,119,104,101,110,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,97,114,101,32,97,116,111,109,105,99,32,111,114,32,111,114,100,101,114,101,100,32,115,101,116,115,46,32,73,116,32,109,117,115,116,32,97,108,115,111,32,98,101,32,116,104,101,32,99,97,115,101,32,116,104,97,116,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,101,108,101,109,101,110,116,115,32,109,97,116,99,104,101,115,32,115,111,109,101,32,99,108,97,117,115,101,32,111,102,32,70,117,110,32,40,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,99,114,101,97,116,101,100,32,115,101,116,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32,70,117,110,32,116,111,32,116,104,101,32,116,121,112,101,32,111,102,32,116,104,101,32,103,105,118,101,110,32,115,101,116,41,44,32,97,110,100,32,116,104,97,116,32,70,117,110,32,100,111,101,115,32,110,111,116,104,105,110,103,32,98,117,116,32,115,101,108,101,99,116,105,110,103,44,32,100,117,112,108,105,99,97,116,105,110,103,44,32,111,114,32,114,101,97,114,114,97,110,103,105,110,103,32,112,97,114,116,115,32,111,102,32,116,104,101,32,101,108,101,109,101,110,116,115,46>>]}]},{li,[],[{p,[],[<<83,112,101,99,105,102,121,105,110,103,32,97,32,83,101,116,70,117,110,32,97,115,32,97,110,32,105,110,116,101,103,101,114,32,73,32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,112,101,99,105,102,121,105,110,103,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,88,41,194,160,45,62,32,101,108,101,109,101,110,116,40,73,44,194,160,88,41,194,160,101,110,100,125>>]},<<44,32,98,117,116,32,105,115,32,116,111,32,98,101,32,112,114,101,102,101,114,114,101,100,44,32,97,115,32,105,116,32,109,97,107,101,115,32,105,116,32,112,111,115,115,105,98,108,101,32,116,111,32,104,97,110,100,108,101,32,116,104,105,115,32,99,97,115,101,32,101,118,101,110,32,109,111,114,101,32,101,102,102,105,99,105,101,110,116,108,121,46>>]}]}]},{p,[],[<<69,120,97,109,112,108,101,115,32,111,102,32,83,101,116,70,117,110,115,58>>]},{pre,[],[{code,[],[<<102,117,110,32,115,111,102,115,58,117,110,105,111,110,47,49,10,102,117,110,40,83,41,32,45,62,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,49,44,32,83,41,32,101,110,100,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,65,41,32,45,62,32,65,32,101,110,100,125,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,65,44,95,44,67,125,41,32,45,62,32,123,67,44,65,125,32,101,110,100,125,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,95,44,123,95,44,67,125,125,41,32,45,62,32,67,32,101,110,100,125,10,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,95,44,123,95,44,123,95,44,69,125,61,67,125,125,41,32,45,62,32,123,69,44,123,69,44,67,125,125,32,101,110,100,125,10,50>>]}]},{p,[],[<<84,104,101,32,111,114,100,101,114,32,105,110,32,119,104,105,99,104,32,97,32,83,101,116,70,117,110,32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,97,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32,105,115,32,110,111,116,32,115,112,101,99,105,102,105,101,100,44,32,97,110,100,32,99,97,110,32,99,104,97,110,103,101,32,105,110,32,102,117,116,117,114,101,32,118,101,114,115,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,46>>]},{p,[],[<<84,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,32,105,115,32,100,111,109,105,110,97,116,101,100,32,98,121,32,116,104,101,32,116,105,109,101,32,105,116,32,116,97,107,101,115,32,116,111,32,115,111,114,116,32,108,105,115,116,115,46,32,87,104,101,110,32,110,111,32,115,111,114,116,105,110,103,32,105,115,32,110,101,101,100,101,100,44,32,116,104,101,32,101,120,101,99,117,116,105,111,110,32,116,105,109,101,32,105,115,32,105,110,32,116,104,101,32,119,111,114,115,116,32,99,97,115,101,32,112,114,111,112,111,114,116,105,111,110,97,108,32,116,111,32,116,104,101,32,115,117,109,32,111,102,32,116,104,101,32,115,105,122,101,115,32,111,102,32,116,104,101,32,105,110,112,117,116,32,97,114,103,117,109,101,110,116,115,32,97,110,100,32,116,104,101,32,114,101,116,117,114,110,101,100,32,118,97,108,117,101,46,32,65,32,102,101,119,32,102,117,110,99,116,105,111,110,115,32,101,120,101,99,117,116,101,32,105,110,32,99,111,110,115,116,97,110,116,32,116,105,109,101,58,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,115,95,101,109,112,116,121,95,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,101,109,112,116,121,95,115,101,116,47,49>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,115,95,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,115,101,116,47,49>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,115,95,115,111,102,115,95,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,115,95,115,111,102,115,95,115,101,116,47,49>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,111,95,101,120,116,101,114,110,97,108,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,111,95,101,120,116,101,114,110,97,108,47,49>>]}]},<<32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<116,121,112,101,47,49>>]}]},<<46>>]},{p,[],[<<84,104,101,32,102,117,110,99,116,105,111,110,115,32,111,102,32,116,104,105,115,32,109,111,100,117,108,101,32,101,120,105,116,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<44,32>>,{code,[],[<<98,97,100,95,102,117,110,99,116,105,111,110>>]},<<44,32,111,114,32>>,{code,[],[<<116,121,112,101,95,109,105,115,109,97,116,99,104>>]},<<32,109,101,115,115,97,103,101,32,119,104,101,110,32,103,105,118,101,110,32,98,97,100,108,121,32,102,111,114,109,101,100,32,97,114,103,117,109,101,110,116,115,32,111,114,32,115,101,116,115,32,116,104,101,32,116,121,112,101,115,32,111,102,32,119,104,105,99,104,32,97,114,101,32,110,111,116,32,99,111,109,112,97,116,105,98,108,101,46>>]},{p,[],[<<87,104,101,110,32,99,111,109,112,97,114,105,110,103,32,101,120,116,101,114,110,97,108,32,115,101,116,115,44,32,111,112,101,114,97,116,111,114,32>>,{code,[],[<<61,61,47,50>>]},<<32,105,115,32,117,115,101,100,46>>]},{h2,[],[<<83,101,101,32,65,108,115,111>>]},{p,[],[{a,[{href,<<115,116,100,108,105,98,58,100,105,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,99,116,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,100,105,103,114,97,112,104>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<100,105,103,114,97,112,104,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,111,114,100,100,105,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,114,100,100,105,99,116,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,111,114,100,115,101,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<111,114,100,115,101,116,115,40,51,41>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,101,116,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[{code,[],[<<115,101,116,115,40,51,41>>]}]}]}]},#{name => <<115,111,102,115>>,otp_doc_vsn => {1,0,0},source => [46,46,47,120,109,108,47,115,111,102,115,46,120,109,108],types => #{{a_function,0} => {attribute,{120,2},type,{a_function,{user_type,{120,23},relation,[]},[]}},{a_set,0} => {attribute,{124,2},opaque,{a_set,{type,{124,20},record,[{atom,{124,22},'Set'}]},[]}},{anyset,0} => {attribute,{117,2},type,{anyset,{type,{117,19},union,[{user_type,{117,19},ordset,[]},{user_type,{117,30},a_set,[]}]},[]}},{binary_relation,0} => {attribute,{118,2},type,{binary_relation,{user_type,{118,28},relation,[]},[]}},{external_set,0} => {attribute,{119,2},type,{external_set,{type,{119,25},term,[]},[]}},{family,0} => {attribute,{121,2},type,{family,{user_type,{121,19},a_function,[]},[]}},{ordset,0} => {attribute,{122,2},opaque,{ordset,{type,{122,21},record,[{atom,{122,23},'OrdSet'}]},[]}},{relation,0} => {attribute,{123,2},type,{relation,{user_type,{123,21},a_set,[]},[]}},{set_fun,0} => {attribute,{126,2},type,{set_fun,{type,{126,20},union,[{type,{126,20},pos_integer,[]},{type,{127,20},tuple,[{atom,{127,21},external},{type,{127,35},'fun',[{type,{127,35},product,[{user_type,{127,36},external_set,[]}]},{user_type,{127,55},external_set,[]}]}]},{type,{128,24},'fun',[{type,{128,24},product,[{user_type,{128,25},anyset,[]}]},{user_type,{128,38},anyset,[]}]}]},[]}},{set_of_sets,0} => {attribute,{125,2},type,{set_of_sets,{user_type,{125,24},a_set,[]},[]}},{spec_fun,0} => {attribute,{129,2},type,{spec_fun,{type,{129,21},union,[{type,{129,21},tuple,[{atom,{129,22},external},{type,{129,36},'fun',[{type,{129,36},product,[{user_type,{129,37},external_set,[]}]},{type,{129,56},boolean,[]}]}]},{type,{130,25},'fun',[{type,{130,25},product,[{user_type,{130,26},anyset,[]}]},{type,{130,39},boolean,[]}]}]},[]}},{tuple_of,1} => {attribute,{133,2},type,{tuple_of,{type,{133,23},tuple,any},[{var,{133,16},'_T'}]}},{type,0} => {attribute,{131,2},type,{type,{type,{131,17},term,[]},[]}}}},[{{function,fam2rel,1},[{file,[115,111,102,115,46,101,114,108]},{location,0}],[<<102,97,109,50,114,101,108,47,49>>],hidden,#{}},{{function,rel2fam,1},[{file,[115,111,102,115,46,101,114,108]},{location,0}],[<<114,101,108,50,102,97,109,47,49>>],hidden,#{}},{{function,a_function,2},[{file,[115,111,102,115,46,101,114,108]},{location,277}],[<<97,95,102,117,110,99,116,105,111,110,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,53,56>>,equiv => {function,a_function,1},signature => [{attribute,{277,2},spec,{{a_function,2},[{type,{277,17},bounded_fun,[{type,{277,17},'fun',[{type,{277,17},product,[{var,{277,18},'Tuples'},{var,{277,26},'Type'}]},{var,{277,35},'Function'}]},[{type,{278,7},constraint,[{atom,{278,7},is_subtype},[{var,{278,7},'Function'},{user_type,{278,19},a_function,[]}]]},{type,{279,7},constraint,[{atom,{279,7},is_subtype},[{var,{279,7},'Tuples'},{type,{279,17},list,[{type,{279,18},tuple,any}]}]]},{type,{280,7},constraint,[{atom,{280,7},is_subtype},[{var,{280,7},'Type'},{user_type,{280,15},type,[]}]]}]]}]}}]}},{{function,a_function,1},[{file,[115,111,102,115,46,101,114,108]},{location,265}],[<<97,95,102,117,110,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<46,32>>,{code,[],[<<97,95,102,117,110,99,116,105,111,110,40,70,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,70,44,194,160,84,41>>]},<<32,105,102,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,102,117,110,99,116,105,111,110,46,32,73,102,32,110,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<91,123,97,116,111,109,44,194,160,97,116,111,109,125,93>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,102,117,110,99,116,105,111,110,32,116,121,112,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,53,56>>,signature => [{attribute,{265,2},spec,{{a_function,1},[{type,{265,17},bounded_fun,[{type,{265,17},'fun',[{type,{265,17},product,[{var,{265,18},'Tuples'}]},{var,{265,29},'Function'}]},[{type,{266,7},constraint,[{atom,{266,7},is_subtype},[{var,{266,7},'Function'},{user_type,{266,19},a_function,[]}]]},{type,{267,7},constraint,[{atom,{267,7},is_subtype},[{var,{267,7},'Tuples'},{type,{267,17},list,[{type,{267,18},tuple,any}]}]]}]]}]}}]}},{{function,canonical_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,577}],[<<99,97,110,111,110,105,99,97,108,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,40,69,44,194,160,83,101,116,41,32,115,117,99,104,32,116,104,97,116,32,83,101,116,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,97,110,100,32,69,32,98,101,108,111,110,103,115,32,116,111,32,83,101,116,46,32,73,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32,97,32,115,101,116,32,88,32,97,110,100,32,82,32,105,115,32,116,104,101,32,101,113,117,105,118,97,108,101,110,99,101,32,114,101,108,97,116,105,111,110,32,105,110,32,88,32,105,110,100,117,99,101,100,32,98,121,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<44,32,116,104,101,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,114,101,108,97,116,105,111,110,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,97,110,111,110,105,99,97,108,95,109,97,112>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,97,110,111,110,105,99,97,108,32,109,97,112>>]},<<32,102,114,111,109,32,88,32,111,110,116,111,32,116,104,101,32,101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115,101,115,32,119,105,116,104,32,114,101,115,112,101,99,116,32,116,111,32,82,46>>]},{pre,[],[{code,[],[<<49,62,32,83,115,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,97,44,98,93,44,91,98,44,99,93,93,41,44,10,67,82,32,61,32,115,111,102,115,58,99,97,110,111,110,105,99,97,108,95,114,101,108,97,116,105,111,110,40,83,115,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,67,82,41,46,10,91,123,97,44,91,97,44,98,93,125,44,123,98,44,91,97,44,98,93,125,44,123,98,44,91,98,44,99,93,125,44,123,99,44,91,98,44,99,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,55,50>>,signature => [{attribute,{577,2},spec,{{canonical_relation,1},[{type,{577,25},bounded_fun,[{type,{577,25},'fun',[{type,{577,25},product,[{var,{577,26},'SetOfSets'}]},{var,{577,40},'BinRel'}]},[{type,{578,7},constraint,[{atom,{578,7},is_subtype},[{var,{578,7},'BinRel'},{user_type,{578,17},binary_relation,[]}]]},{type,{579,7},constraint,[{atom,{579,7},is_subtype},[{var,{579,7},'SetOfSets'},{user_type,{579,20},set_of_sets,[]}]]}]]}]}}]}},{{function,composite,2},[{file,[115,111,102,115,46,101,114,108]},{location,844}],[<<99,111,109,112,111,115,105,116,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,111,109,112,111,115,105,116,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,109,112,111,115,105,116,101>>]},<<32,111,102,32,116,104,101,32,102,117,110,99,116,105,111,110,115,32>>,{code,[],[<<70,117,110,99,116,105,111,110,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,117,110,99,116,105,111,110,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,97,95,102,117,110,99,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,44,123,99,44,50,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,97,95,102,117,110,99,116,105,111,110,40,91,123,49,44,120,125,44,123,50,44,121,125,44,123,51,44,122,125,93,41,44,10,70,32,61,32,115,111,102,115,58,99,111,109,112,111,115,105,116,101,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,120,125,44,123,98,44,121,125,44,123,99,44,121,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,52,57,50>>,signature => [{attribute,{844,2},spec,{{composite,2},[{type,{844,16},bounded_fun,[{type,{844,16},'fun',[{type,{844,16},product,[{var,{844,17},'Function1'},{var,{844,28},'Function2'}]},{var,{844,42},'Function3'}]},[{type,{845,7},constraint,[{atom,{845,7},is_subtype},[{var,{845,7},'Function1'},{user_type,{845,20},a_function,[]}]]},{type,{846,7},constraint,[{atom,{846,7},is_subtype},[{var,{846,7},'Function2'},{user_type,{846,20},a_function,[]}]]},{type,{847,7},constraint,[{atom,{847,7},is_subtype},[{var,{847,7},'Function3'},{user_type,{847,20},a_function,[]}]]}]]}]}}]}},{{function,constant_function,2},[{file,[115,111,102,115,46,101,114,108]},{location,465}],[<<99,111,110,115,116,97,110,116,95,102,117,110,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<32,116,104,97,116,32,109,97,112,115,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32,115,101,116,32>>,{code,[],[<<83,101,116>>]},<<32,111,110,116,111,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,115,101,116,40,91,97,44,98,93,41,44,10,69,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,49,41,44,10,82,32,61,32,115,111,102,115,58,99,111,110,115,116,97,110,116,95,102,117,110,99,116,105,111,110,40,83,44,32,69,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,41,46,10,91,123,97,44,49,125,44,123,98,44,49,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,48,56>>,signature => [{attribute,{465,2},spec,{{constant_function,2},[{type,{465,24},bounded_fun,[{type,{465,24},'fun',[{type,{465,24},product,[{var,{465,25},'Set'},{var,{465,30},'AnySet'}]},{var,{465,41},'Function'}]},[{type,{466,7},constraint,[{atom,{466,7},is_subtype},[{var,{466,7},'AnySet'},{user_type,{466,17},anyset,[]}]]},{type,{467,7},constraint,[{atom,{467,7},is_subtype},[{var,{467,7},'Function'},{user_type,{467,19},a_function,[]}]]},{type,{468,7},constraint,[{atom,{468,7},is_subtype},[{var,{468,7},'Set'},{user_type,{468,14},a_set,[]}]]}]]}]}}]}},{{function,converse,1},[{file,[115,111,102,115,46,101,114,108]},{location,707}],[<<99,111,110,118,101,114,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,111,110,118,101,114,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,110,118,101,114,115,101>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,97,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,99,111,110,118,101,114,115,101,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,97,44,49,125,44,123,97,44,51,125,44,123,98,44,50,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,50,52>>,signature => [{attribute,{707,2},spec,{{converse,1},[{type,{707,15},bounded_fun,[{type,{707,15},'fun',[{type,{707,15},product,[{var,{707,16},'BinRel1'}]},{var,{707,28},'BinRel2'}]},[{type,{708,7},constraint,[{atom,{708,7},is_subtype},[{var,{708,7},'BinRel1'},{user_type,{708,18},binary_relation,[]}]]},{type,{709,7},constraint,[{atom,{709,7},is_subtype},[{var,{709,7},'BinRel2'},{user_type,{709,18},binary_relation,[]}]]}]]}]}}]}},{{function,difference,2},[{file,[115,111,102,115,46,101,114,108]},{location,398}],[<<100,105,102,102,101,114,101,110,99,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,105,102,102,101,114,101,110,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,102,102,101,114,101,110,99,101>>]},<<32,111,102,32,116,104,101,32,115,101,116,115,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,51,56>>,signature => [{attribute,{398,2},spec,{{difference,2},[{type,{398,17},bounded_fun,[{type,{398,17},'fun',[{type,{398,17},product,[{var,{398,18},'Set1'},{var,{398,24},'Set2'}]},{var,{398,33},'Set3'}]},[{type,{399,7},constraint,[{atom,{399,7},is_subtype},[{var,{399,7},'Set1'},{user_type,{399,15},a_set,[]}]]},{type,{400,7},constraint,[{atom,{400,7},is_subtype},[{var,{400,7},'Set2'},{user_type,{400,15},a_set,[]}]]},{type,{401,7},constraint,[{atom,{401,7},is_subtype},[{var,{401,7},'Set3'},{user_type,{401,15},a_set,[]}]]}]]}]}}]}},{{function,digraph_to_family,2},[{file,[115,111,102,115,46,101,114,108]},{location,1520}],[<<100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,52,55>>,equiv => {function,digraph_to_family,1},signature => [{attribute,{1520,2},spec,{{digraph_to_family,2},[{type,{1520,24},bounded_fun,[{type,{1520,24},'fun',[{type,{1520,24},product,[{var,{1520,25},'Graph'},{var,{1520,32},'Type'}]},{var,{1520,41},'Family'}]},[{type,{1521,7},constraint,[{atom,{1521,7},is_subtype},[{var,{1521,7},'Graph'},{remote_type,{1521,16},[{atom,{1521,16},digraph},{atom,{1521,24},graph},[]]}]]},{type,{1522,7},constraint,[{atom,{1522,7},is_subtype},[{var,{1522,7},'Family'},{user_type,{1522,17},family,[]}]]},{type,{1523,7},constraint,[{atom,{1523,7},is_subtype},[{var,{1523,7},'Type'},{user_type,{1523,15},type,[]}]]}]]}]}}]}},{{function,digraph_to_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,1511}],[<<100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,102,114,111,109,32,116,104,101,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,32>>,{code,[],[<<71,114,97,112,104>>]},<<46,32,69,97,99,104,32,118,101,114,116,101,120,32,97,32,111,102,32>>,{code,[],[<<71,114,97,112,104>>]},<<32,105,115,32,114,101,112,114,101,115,101,110,116,101,100,32,98,121,32,97,32,112,97,105,114,32,40,97,44,194,160,123,98,91,49,93,44,194,160,46,46,46,44,194,160,98,91,110,93,125,41,44,32,119,104,101,114,101,32,116,104,101,32,98,91,105,93,58,115,32,97,114,101,32,116,104,101,32,111,117,116,45,110,101,105,103,104,98,111,114,115,32,111,102,32,97,46,32,73,102,32,110,111,32,116,121,112,101,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32,91,123,97,116,111,109,44,194,160,91,97,116,111,109,93,125,93,32,105,115,32,117,115,101,100,32,97,115,32,116,121,112,101,32,111,102,32,116,104,101,32,102,97,109,105,108,121,46,32,73,116,32,105,115,32,97,115,115,117,109,101,100,32,116,104,97,116,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,118,97,108,105,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,111,102,32,116,104,101,32,101,120,116,101,114,110,97,108,32,115,101,116,32,111,102,32,116,104,101,32,102,97,109,105,108,121,46>>]},{p,[],[<<73,102,32,71,32,105,115,32,97,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,44,32,105,116,32,104,111,108,100,115,32,116,104,97,116,32,116,104,101,32,118,101,114,116,105,99,101,115,32,97,110,100,32,101,100,103,101,115,32,111,102,32,71,32,97,114,101,32,116,104,101,32,115,97,109,101,32,97,115,32,116,104,101,32,118,101,114,116,105,99,101,115,32,97,110,100,32,101,100,103,101,115,32,111,102,32>>,{code,[],[<<102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,40,100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,40,71,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,52,55>>,signature => [{attribute,{1511,2},spec,{{digraph_to_family,1},[{type,{1511,24},bounded_fun,[{type,{1511,24},'fun',[{type,{1511,24},product,[{var,{1511,25},'Graph'}]},{var,{1511,35},'Family'}]},[{type,{1512,7},constraint,[{atom,{1512,7},is_subtype},[{var,{1512,7},'Graph'},{remote_type,{1512,16},[{atom,{1512,16},digraph},{atom,{1512,24},graph},[]]}]]},{type,{1513,7},constraint,[{atom,{1513,7},is_subtype},[{var,{1513,7},'Family'},{user_type,{1513,17},family,[]}]]}]]}]}}]}},{{function,domain,1},[{file,[115,111,102,115,46,101,114,108]},{location,612}],[<<100,111,109,97,105,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,98,125,44,123,50,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,100,111,109,97,105,110,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,49,44,50,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,54,55>>,signature => [{attribute,{612,2},spec,{{domain,1},[{type,{612,13},bounded_fun,[{type,{612,13},'fun',[{type,{612,13},product,[{var,{612,14},'BinRel'}]},{var,{612,25},'Set'}]},[{type,{613,7},constraint,[{atom,{613,7},is_subtype},[{var,{613,7},'BinRel'},{user_type,{613,17},binary_relation,[]}]]},{type,{614,7},constraint,[{atom,{614,7},is_subtype},[{var,{614,7},'Set'},{user_type,{614,14},a_set,[]}]]}]]}]}}]}},{{function,drestriction,2},[{file,[115,111,102,115,46,101,114,108]},{location,833}],[<<100,114,101,115,116,114,105,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,97,110,100,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,116,111,32>>,{code,[],[<<83,101,116>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,50,44,52,44,54,93,41,44,10,82,50,32,61,32,115,111,102,115,58,100,114,101,115,116,114,105,99,116,105,111,110,40,82,49,44,32,83,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,97,125,44,123,51,44,99,125,93>>]}]},{p,[],[{code,[],[<<100,114,101,115,116,114,105,99,116,105,111,110,40,82,44,194,160,83,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<100,105,102,102,101,114,101,110,99,101,40,82,44,194,160,114,101,115,116,114,105,99,116,105,111,110,40,82,44,194,160,83,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,53,56,49>>,signature => [{attribute,{833,2},spec,{{drestriction,2},[{type,{833,19},bounded_fun,[{type,{833,19},'fun',[{type,{833,19},product,[{var,{833,20},'BinRel1'},{var,{833,29},'Set'}]},{var,{833,37},'BinRel2'}]},[{type,{834,7},constraint,[{atom,{834,7},is_subtype},[{var,{834,7},'BinRel1'},{user_type,{834,18},binary_relation,[]}]]},{type,{835,7},constraint,[{atom,{835,7},is_subtype},[{var,{835,7},'BinRel2'},{user_type,{835,18},binary_relation,[]}]]},{type,{836,7},constraint,[{atom,{836,7},is_subtype},[{var,{836,7},'Set'},{user_type,{836,14},a_set,[]}]]}]]}]}}]}},{{function,drestriction,3},[{file,[115,111,102,115,46,101,114,108]},{location,960}],[<<100,114,101,115,116,114,105,99,116,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,100,111,32,110,111,116,32,103,105,118,101,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<83,101,116,50>>]},<<32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,101,116,70,117,110,32,61,32,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,95,65,44,66,44,67,125,41,32,45,62,32,123,66,44,67,125,32,101,110,100,125,44,10,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,97,97,44,49,125,44,123,98,44,98,98,44,50,125,44,123,99,44,99,99,44,51,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,98,98,44,50,125,44,123,99,99,44,51,125,44,123,100,100,44,52,125,93,41,44,10,82,51,32,61,32,115,111,102,115,58,100,114,101,115,116,114,105,99,116,105,111,110,40,83,101,116,70,117,110,44,32,82,49,44,32,82,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,51,41,46,10,91,123,97,44,97,97,44,49,125,93>>]}]},{p,[],[{code,[],[<<100,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<100,105,102,102,101,114,101,110,99,101,40,83,49,44,194,160,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,48,48>>,signature => [{attribute,{960,2},spec,{{drestriction,3},[{type,{960,19},bounded_fun,[{type,{960,19},'fun',[{type,{960,19},product,[{var,{960,20},'SetFun'},{var,{960,28},'Set1'},{var,{960,34},'Set2'}]},{var,{960,43},'Set3'}]},[{type,{961,7},constraint,[{atom,{961,7},is_subtype},[{var,{961,7},'SetFun'},{user_type,{961,17},set_fun,[]}]]},{type,{962,7},constraint,[{atom,{962,7},is_subtype},[{var,{962,7},'Set1'},{user_type,{962,15},a_set,[]}]]},{type,{963,7},constraint,[{atom,{963,7},is_subtype},[{var,{963,7},'Set2'},{user_type,{963,15},a_set,[]}]]},{type,{964,7},constraint,[{atom,{964,7},is_subtype},[{var,{964,7},'Set3'},{user_type,{964,15},a_set,[]}]]}]]}]}}]}},{{function,empty_set,0},[{file,[115,111,102,115,46,101,114,108]},{location,178}],[<<101,109,112,116,121,95,115,101,116,47,48>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116>>]},<<46,32>>,{code,[],[<<101,109,112,116,121,95,115,101,116,40,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,91,93,44,194,160,91,39,95,39,93,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,50,48>>,signature => [{attribute,{178,2},spec,{{empty_set,0},[{type,{178,16},bounded_fun,[{type,{178,16},'fun',[{type,{178,16},product,[]},{var,{178,22},'Set'}]},[{type,{179,7},constraint,[{atom,{179,7},is_subtype},[{var,{179,7},'Set'},{user_type,{179,14},a_set,[]}]]}]]}]}}]}},{{function,extension,3},[{file,[115,111,102,115,46,101,114,108]},{location,779}],[<<101,120,116,101,110,115,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,110,115,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,110,115,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,115,117,99,104,32,116,104,97,116,32,102,111,114,32,101,97,99,104,32,101,108,101,109,101,110,116,32,69,32,105,110,32>>,{code,[],[<<83,101,116>>]},<<32,116,104,97,116,32,100,111,101,115,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<44,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,112,97,105,114,32,40,69,44,194,160>>,{code,[],[<<65,110,121,83,101,116>>]},<<41,46>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,115,101,116,40,91,98,44,99,93,41,44,10,65,32,61,32,115,111,102,115,58,101,109,112,116,121,95,115,101,116,40,41,44,10,82,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,93,125,93,41,44,10,88,32,61,32,115,111,102,115,58,101,120,116,101,110,115,105,111,110,40,82,44,32,83,44,32,65,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,88,41,46,10,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,93,125,44,123,99,44,91,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,51,48>>,signature => [{attribute,{779,2},spec,{{extension,3},[{type,{779,16},bounded_fun,[{type,{779,16},'fun',[{type,{779,16},product,[{var,{779,17},'BinRel1'},{var,{779,26},'Set'},{var,{779,31},'AnySet'}]},{var,{779,42},'BinRel2'}]},[{type,{780,7},constraint,[{atom,{780,7},is_subtype},[{var,{780,7},'AnySet'},{user_type,{780,17},anyset,[]}]]},{type,{781,7},constraint,[{atom,{781,7},is_subtype},[{var,{781,7},'BinRel1'},{user_type,{781,18},binary_relation,[]}]]},{type,{782,7},constraint,[{atom,{782,7},is_subtype},[{var,{782,7},'BinRel2'},{user_type,{782,18},binary_relation,[]}]]},{type,{783,7},constraint,[{atom,{783,7},is_subtype},[{var,{783,7},'Set'},{user_type,{783,14},a_set,[]}]]}]]}]}}]}},{{function,family,2},[{file,[115,111,102,115,46,101,114,108]},{location,302}],[<<102,97,109,105,108,121,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,53,48>>,equiv => {function,family,1},signature => [{attribute,{302,2},spec,{{family,2},[{type,{302,13},bounded_fun,[{type,{302,13},'fun',[{type,{302,13},product,[{var,{302,14},'Tuples'},{var,{302,22},'Type'}]},{var,{302,31},'Family'}]},[{type,{303,7},constraint,[{atom,{303,7},is_subtype},[{var,{303,7},'Family'},{user_type,{303,17},family,[]}]]},{type,{304,7},constraint,[{atom,{304,7},is_subtype},[{var,{304,7},'Tuples'},{type,{304,17},list,[{type,{304,18},tuple,any}]}]]},{type,{305,7},constraint,[{atom,{305,7},is_subtype},[{var,{305,7},'Type'},{user_type,{305,15},type,[]}]]}]]}]}}]}},{{function,family,1},[{file,[115,111,102,115,46,101,114,108]},{location,290}],[<<102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121,32,111,102,32,115,117,98,115,101,116,115>>]},<<46,32>>,{code,[],[<<102,97,109,105,108,121,40,70,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,70,44,194,160,84,41>>]},<<32,105,102,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,102,97,109,105,108,121,46,32,73,102,32,110,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<91,123,97,116,111,109,44,194,160,91,97,116,111,109,93,125,93>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,102,97,109,105,108,121,32,116,121,112,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,53,48>>,signature => [{attribute,{290,2},spec,{{family,1},[{type,{290,13},bounded_fun,[{type,{290,13},'fun',[{type,{290,13},product,[{var,{290,14},'Tuples'}]},{var,{290,25},'Family'}]},[{type,{291,7},constraint,[{atom,{291,7},is_subtype},[{var,{291,7},'Family'},{user_type,{291,17},family,[]}]]},{type,{292,7},constraint,[{atom,{292,7},is_subtype},[{var,{292,7},'Tuples'},{type,{292,17},list,[{type,{292,18},tuple,any}]}]]}]]}]}}]}},{{function,family_difference,2},[{file,[115,111,102,115,46,101,114,108]},{location,1385}],[<<102,97,109,105,108,121,95,100,105,102,102,101,114,101,110,99,101,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,105,101,115>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,101,113,117,97,108,32,116,111,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<91,105,93,32,105,115,32,116,104,101,32,100,105,102,102,101,114,101,110,99,101,32,98,101,116,119,101,101,110,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,102,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,109,97,112,115,32,105,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,97,109,105,108,121,49,91,105,93>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,98,44,91,52,44,53,93,125,44,123,99,44,91,54,44,55,93,125,93,41,44,10,70,51,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,100,105,102,102,101,114,101,110,99,101,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,51,41,46,10,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,54,52>>,signature => [{attribute,{1385,2},spec,{{family_difference,2},[{type,{1385,24},bounded_fun,[{type,{1385,24},'fun',[{type,{1385,24},product,[{var,{1385,25},'Family1'},{var,{1385,34},'Family2'}]},{var,{1385,46},'Family3'}]},[{type,{1386,7},constraint,[{atom,{1386,7},is_subtype},[{var,{1386,7},'Family1'},{user_type,{1386,18},family,[]}]]},{type,{1387,7},constraint,[{atom,{1387,7},is_subtype},[{var,{1387,7},'Family2'},{user_type,{1387,18},family,[]}]]},{type,{1388,7},constraint,[{atom,{1388,7},is_subtype},[{var,{1388,7},'Family3'},{user_type,{1388,18},family,[]}]]}]]}]}}]}},{{function,family_domain,1},[{file,[115,111,102,115,46,101,114,108]},{location,1341}],[<<102,97,109,105,108,121,95,100,111,109,97,105,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49,91,105,93>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,82,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,125,44,123,98,44,91,93,125,44,123,99,44,91,123,52,44,100,125,44,123,53,44,101,125,93,125,93,41,44,10,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,100,111,109,97,105,110,40,70,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,93,125,44,123,99,44,91,52,44,53,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,54,56,53>>,signature => [{attribute,{1341,2},spec,{{family_domain,1},[{type,{1341,20},bounded_fun,[{type,{1341,20},'fun',[{type,{1341,20},product,[{var,{1341,21},'Family1'}]},{var,{1341,33},'Family2'}]},[{type,{1342,7},constraint,[{atom,{1342,7},is_subtype},[{var,{1342,7},'Family1'},{user_type,{1342,18},family,[]}]]},{type,{1343,7},constraint,[{atom,{1343,7},is_subtype},[{var,{1343,7},'Family2'},{user_type,{1343,18},family,[]}]]}]]}]}}]}},{{function,family_field,1},[{file,[115,111,102,115,46,101,114,108]},{location,1365}],[<<102,97,109,105,108,121,95,102,105,101,108,100,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,105,101,108,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,101,108,100>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,82,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,125,44,123,98,44,91,93,125,44,123,99,44,91,123,52,44,100,125,44,123,53,44,101,125,93,125,93,41,44,10,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,102,105,101,108,100,40,70,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,91,49,44,50,44,51,44,97,44,98,44,99,93,125,44,123,98,44,91,93,125,44,123,99,44,91,52,44,53,44,100,44,101,93,125,93>>]}]},{p,[],[{code,[],[<<102,97,109,105,108,121,95,102,105,101,108,100,40,70,97,109,105,108,121,49,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,97,109,105,108,121,95,117,110,105,111,110,40,102,97,109,105,108,121,95,100,111,109,97,105,110,40,70,97,109,105,108,121,49,41,44,32,102,97,109,105,108,121,95,114,97,110,103,101,40,70,97,109,105,108,121,49,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,48,54>>,signature => [{attribute,{1365,2},spec,{{family_field,1},[{type,{1365,19},bounded_fun,[{type,{1365,19},'fun',[{type,{1365,19},product,[{var,{1365,20},'Family1'}]},{var,{1365,32},'Family2'}]},[{type,{1366,7},constraint,[{atom,{1366,7},is_subtype},[{var,{1366,7},'Family1'},{user_type,{1366,18},family,[]}]]},{type,{1367,7},constraint,[{atom,{1367,7},is_subtype},[{var,{1367,7},'Family2'},{user_type,{1367,18},family,[]}]]}]]}]}}]}},{{function,family_intersection,1},[{file,[115,111,102,115,46,101,114,108]},{location,1325}],[<<102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,115,101,116,32,111,102,32,115,101,116,115,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,116,101,114,115,101,99,116,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,110,32,101,109,112,116,121,32,115,101,116,32,102,111,114,32,115,111,109,101,32,105,44,32,116,104,101,32,112,114,111,99,101,115,115,32,101,120,105,116,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,109,101,115,115,97,103,101,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,91,49,44,50,44,51,93,44,91,50,44,51,44,52,93,93,125,44,123,98,44,91,91,120,44,121,44,122,93,44,91,120,44,121,93,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,40,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,97,44,91,50,44,51,93,125,44,123,98,44,91,120,44,121,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,51,48>>,signature => [{attribute,{1325,2},spec,{{family_intersection,1},[{type,{1325,26},bounded_fun,[{type,{1325,26},'fun',[{type,{1325,26},product,[{var,{1325,27},'Family1'}]},{var,{1325,39},'Family2'}]},[{type,{1326,7},constraint,[{atom,{1326,7},is_subtype},[{var,{1326,7},'Family1'},{user_type,{1326,18},family,[]}]]},{type,{1327,7},constraint,[{atom,{1327,7},is_subtype},[{var,{1327,7},'Family2'},{user_type,{1327,18},family,[]}]]}]]}]}}]}},{{function,family_intersection,2},[{file,[115,111,102,115,46,101,114,108]},{location,1378}],[<<102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,105,101,115>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<58,115,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<58,115,32,105,110,100,101,120,32,115,101,116,115,44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<91,105,93,32,105,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,93,125,44,123,99,44,91,53,44,54,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,98,44,91,52,44,53,93,125,44,123,99,44,91,55,44,56,93,125,44,123,100,44,91,57,44,49,48,93,125,93,41,44,10,70,51,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,105,110,116,101,114,115,101,99,116,105,111,110,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,51,41,46,10,91,123,98,44,91,52,93,125,44,123,99,44,91,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,53,52>>,signature => [{attribute,{1378,2},spec,{{family_intersection,2},[{type,{1378,26},bounded_fun,[{type,{1378,26},'fun',[{type,{1378,26},product,[{var,{1378,27},'Family1'},{var,{1378,36},'Family2'}]},{var,{1378,48},'Family3'}]},[{type,{1379,7},constraint,[{atom,{1379,7},is_subtype},[{var,{1379,7},'Family1'},{user_type,{1379,18},family,[]}]]},{type,{1380,7},constraint,[{atom,{1380,7},is_subtype},[{var,{1380,7},'Family2'},{user_type,{1380,18},family,[]}]]},{type,{1381,7},constraint,[{atom,{1381,7},is_subtype},[{var,{1381,7},'Family3'},{user_type,{1381,18},family,[]}]]}]]}]}}]}},{{function,family_projection,2},[{file,[115,111,102,115,46,101,114,108]},{location,1451}],[<<102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,99,97,108,108,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,119,105,116,104,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,115,32,97,114,103,117,109,101,110,116,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,91,49,44,50,93,44,91,50,44,51,93,93,125,44,123,98,44,91,91,93,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,40,102,117,110,32,115,111,102,115,58,117,110,105,111,110,47,49,44,32,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,55,52>>,signature => [{attribute,{1451,2},spec,{{family_projection,2},[{type,{1451,24},bounded_fun,[{type,{1451,24},'fun',[{type,{1451,24},product,[{var,{1451,25},'SetFun'},{var,{1451,33},'Family1'}]},{var,{1451,45},'Family2'}]},[{type,{1452,7},constraint,[{atom,{1452,7},is_subtype},[{var,{1452,7},'SetFun'},{user_type,{1452,17},set_fun,[]}]]},{type,{1453,7},constraint,[{atom,{1453,7},is_subtype},[{var,{1453,7},'Family1'},{user_type,{1453,18},family,[]}]]},{type,{1454,7},constraint,[{atom,{1454,7},is_subtype},[{var,{1454,7},'Family2'},{user_type,{1454,18},family,[]}]]}]]}]}}]}},{{function,family_range,1},[{file,[115,111,102,115,46,101,114,108]},{location,1353}],[<<102,97,109,105,108,121,95,114,97,110,103,101,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,102,111,114,32,101,118,101,114,121,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,97,110,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,97,110,103,101>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,82,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,125,44,123,98,44,91,93,125,44,123,99,44,91,123,52,44,100,125,44,123,53,44,101,125,93,125,93,41,44,10,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,114,97,110,103,101,40,70,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,97,44,91,97,44,98,44,99,93,125,44,123,98,44,91,93,125,44,123,99,44,91,100,44,101,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,55,57,51>>,signature => [{attribute,{1353,2},spec,{{family_range,1},[{type,{1353,19},bounded_fun,[{type,{1353,19},'fun',[{type,{1353,19},product,[{var,{1353,20},'Family1'}]},{var,{1353,32},'Family2'}]},[{type,{1354,7},constraint,[{atom,{1354,7},is_subtype},[{var,{1354,7},'Family1'},{user_type,{1354,18},family,[]}]]},{type,{1355,7},constraint,[{atom,{1355,7},is_subtype},[{var,{1355,7},'Family2'},{user_type,{1355,18},family,[]}]]}]]}]}}]}},{{function,family_specification,2},[{file,[115,111,102,115,46,101,114,108]},{location,1265}],[<<102,97,109,105,108,121,95,115,112,101,99,105,102,105,99,97,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,116,111,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,105,32,111,102,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,102,111,114,32,119,104,105,99,104,32>>,{code,[],[<<70,117,110>>]},<<32,97,112,112,108,105,101,100,32,116,111,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,194,160,70,117,110,50,125>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,117,110,50>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,49,44,50,93,125,44,123,99,44,91,49,93,125,93,41,44,10,83,112,101,99,70,117,110,32,61,32,102,117,110,40,83,41,32,45,62,32,115,111,102,115,58,110,111,95,101,108,101,109,101,110,116,115,40,83,41,32,61,58,61,32,50,32,101,110,100,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,115,112,101,99,105,102,105,99,97,116,105,111,110,40,83,112,101,99,70,117,110,44,32,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,98,44,91,49,44,50,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,49,52>>,signature => [{attribute,{1265,2},spec,{{family_specification,2},[{type,{1265,27},bounded_fun,[{type,{1265,27},'fun',[{type,{1265,27},product,[{var,{1265,28},'Fun'},{var,{1265,33},'Family1'}]},{var,{1265,45},'Family2'}]},[{type,{1266,7},constraint,[{atom,{1266,7},is_subtype},[{var,{1266,7},'Fun'},{user_type,{1266,14},spec_fun,[]}]]},{type,{1267,7},constraint,[{atom,{1267,7},is_subtype},[{var,{1267,7},'Family1'},{user_type,{1267,18},family,[]}]]},{type,{1268,7},constraint,[{atom,{1268,7},is_subtype},[{var,{1268,7},'Family2'},{user_type,{1268,18},family,[]}]]}]]}]}}]}},{{function,family_to_digraph,2},[{file,[115,111,102,115,46,101,114,108]},{location,1489}],[<<102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,51,57>>,equiv => {function,family_to_digraph,1},signature => [{attribute,{1489,2},spec,{{family_to_digraph,2},[{type,{1489,24},bounded_fun,[{type,{1489,24},'fun',[{type,{1489,24},product,[{var,{1489,25},'Family'},{var,{1489,33},'GraphType'}]},{var,{1489,47},'Graph'}]},[{type,{1490,7},constraint,[{atom,{1490,7},is_subtype},[{var,{1490,7},'Graph'},{remote_type,{1490,16},[{atom,{1490,16},digraph},{atom,{1490,24},graph},[]]}]]},{type,{1491,7},constraint,[{atom,{1491,7},is_subtype},[{var,{1491,7},'Family'},{user_type,{1491,17},family,[]}]]},{type,{1492,7},constraint,[{atom,{1492,7},is_subtype},[{var,{1492,7},'GraphType'},{type,{1492,20},list,[{remote_type,{1492,21},[{atom,{1492,21},digraph},{atom,{1492,29},d_type},[]]}]}]]}]]}]}}]}},{{function,family_to_digraph,1},[{file,[115,111,102,115,46,101,114,108]},{location,1479}],[<<102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,32,102,114,111,109,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<46,32,70,111,114,32,101,97,99,104,32,112,97,105,114,32,40,97,44,194,160,123,98,91,49,93,44,194,160,46,46,46,44,194,160,98,91,110,93,125,41,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<44,32,118,101,114,116,101,120,32,97,32,97,110,100,32,116,104,101,32,101,100,103,101,115,32,40,97,44,194,160,98,91,105,93,41,32,102,111,114,32,49,194,160,60,61,194,160,105,194,160,60,61,194,160,110,32,97,114,101,32,97,100,100,101,100,32,116,111,32,97,32,110,101,119,108,121,32,99,114,101,97,116,101,100,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,46>>]},{p,[],[<<73,102,32,110,111,32,103,114,97,112,104,32,116,121,112,101,32,105,115,32,115,112,101,99,105,102,105,101,100,44,32>>,{a,[{href,<<115,116,100,108,105,98,58,100,105,103,114,97,112,104,35,110,101,119,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,105,103,114,97,112,104,58,110,101,119,47,48>>]}]},<<32,105,115,32,117,115,101,100,32,102,111,114,32,99,114,101,97,116,105,110,103,32,116,104,101,32,100,105,114,101,99,116,101,100,32,103,114,97,112,104,44,32,111,116,104,101,114,119,105,115,101,32,97,114,103,117,109,101,110,116,32>>,{code,[],[<<71,114,97,112,104,84,121,112,101>>]},<<32,105,115,32,112,97,115,115,101,100,32,111,110,32,97,115,32,115,101,99,111,110,100,32,97,114,103,117,109,101,110,116,32,116,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,100,105,103,114,97,112,104,35,110,101,119,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<100,105,103,114,97,112,104,58,110,101,119,47,49>>]}]},<<46>>]},{p,[],[<<73,116,32,70,32,105,115,32,97,32,102,97,109,105,108,121,44,32,105,116,32,104,111,108,100,115,32,116,104,97,116,32,70,32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<100,105,103,114,97,112,104,95,116,111,95,102,97,109,105,108,121,40,102,97,109,105,108,121,95,116,111,95,100,105,103,114,97,112,104,40,70,41,44,194,160,116,121,112,101,40,70,41,41>>]},<<46,32,69,113,117,97,108,105,116,121,32,104,111,108,100,115,32,105,102,32>>,{code,[],[<<117,110,105,111,110,95,111,102,95,102,97,109,105,108,121,40,70,41>>]},<<32,105,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<100,111,109,97,105,110,40,70,41>>]},<<46>>]},{p,[],[<<67,114,101,97,116,105,110,103,32,97,32,99,121,99,108,101,32,105,110,32,97,110,32,97,99,121,99,108,105,99,32,103,114,97,112,104,32,101,120,105,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<99,121,99,108,105,99>>]},<<32,109,101,115,115,97,103,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,51,57>>,signature => [{attribute,{1479,2},spec,{{family_to_digraph,1},[{type,{1479,24},bounded_fun,[{type,{1479,24},'fun',[{type,{1479,24},product,[{var,{1479,25},'Family'}]},{var,{1479,36},'Graph'}]},[{type,{1480,7},constraint,[{atom,{1480,7},is_subtype},[{var,{1480,7},'Graph'},{remote_type,{1480,16},[{atom,{1480,16},digraph},{atom,{1480,24},graph},[]]}]]},{type,{1481,7},constraint,[{atom,{1481,7},is_subtype},[{var,{1481,7},'Family'},{user_type,{1481,17},family,[]}]]}]]}]}}]}},{{function,family_to_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,1253}],[<<102,97,109,105,108,121,95,116,111,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32,99,111,110,116,97,105,110,105,110,103,32,97,108,108,32,112,97,105,114,115,32,40,105,44,194,160,120,41,32,115,117,99,104,32,116,104,97,116,32,105,32,98,101,108,111,110,103,115,32,116,111,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,97,110,100,32,120,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,93,125,44,32,123,98,44,91,49,93,125,44,32,123,99,44,91,50,44,51,93,125,93,41,44,10,82,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,116,111,95,114,101,108,97,116,105,111,110,40,70,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,41,46,10,91,123,98,44,49,125,44,123,99,44,50,125,44,123,99,44,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,54,53>>,signature => [{attribute,{1253,2},spec,{{family_to_relation,1},[{type,{1253,25},bounded_fun,[{type,{1253,25},'fun',[{type,{1253,25},product,[{var,{1253,26},'Family'}]},{var,{1253,37},'BinRel'}]},[{type,{1254,7},constraint,[{atom,{1254,7},is_subtype},[{var,{1254,7},'Family'},{user_type,{1254,17},family,[]}]]},{type,{1255,7},constraint,[{atom,{1255,7},is_subtype},[{var,{1255,7},'BinRel'},{user_type,{1255,17},binary_relation,[]}]]}]]}]}}]}},{{function,family_union,1},[{file,[115,111,102,115,46,101,114,108]},{location,1314}],[<<102,97,109,105,108,121,95,117,110,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,105,115,32,97,32,115,101,116,32,111,102,32,115,101,116,115,32,102,111,114,32,101,97,99,104,32,105,32,105,110,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,119,105,116,104,32,116,104,101,32,115,97,109,101,32,105,110,100,101,120,32,115,101,116,32,97,115,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,115,117,99,104,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,97,44,91,91,49,44,50,93,44,91,50,44,51,93,93,125,44,123,98,44,91,91,93,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,117,110,105,111,110,40,70,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,50,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,93,125,93>>]}]},{p,[],[{code,[],[<<102,97,109,105,108,121,95,117,110,105,111,110,40,70,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,97,109,105,108,121,95,112,114,111,106,101,99,116,105,111,110,40,102,117,110,32,115,111,102,115,58,117,110,105,111,110,47,49,44,194,160,70,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,56,56,51>>,signature => [{attribute,{1314,2},spec,{{family_union,1},[{type,{1314,19},bounded_fun,[{type,{1314,19},'fun',[{type,{1314,19},product,[{var,{1314,20},'Family1'}]},{var,{1314,32},'Family2'}]},[{type,{1315,7},constraint,[{atom,{1315,7},is_subtype},[{var,{1315,7},'Family1'},{user_type,{1315,18},family,[]}]]},{type,{1316,7},constraint,[{atom,{1316,7},is_subtype},[{var,{1316,7},'Family2'},{user_type,{1316,18},family,[]}]]}]]}]}}]}},{{function,family_union,2},[{file,[115,111,102,115,46,101,114,108]},{location,1371}],[<<102,97,109,105,108,121,95,117,110,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,105,101,115>>]},<<44,32,116,104,101,110,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<32,105,115,32,116,104,101,32,102,97,109,105,108,121,32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<58,115,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<58,115,32,105,110,100,101,120,32,115,101,116,115,44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,51>>]},<<91,105,93,32,105,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,32,105,102,32,98,111,116,104,32,109,97,112,32,105,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,97,109,105,108,121,49>>]},<<91,105,93,32,111,114,32>>,{code,[],[<<70,97,109,105,108,121,50>>]},<<91,105,93,46>>]},{pre,[],[{code,[],[<<49,62,32,70,49,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,93,125,44,123,99,44,91,53,44,54,93,125,93,41,44,10,70,50,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,98,44,91,52,44,53,93,125,44,123,99,44,91,55,44,56,93,125,44,123,100,44,91,57,44,49,48,93,125,93,41,44,10,70,51,32,61,32,115,111,102,115,58,102,97,109,105,108,121,95,117,110,105,111,110,40,70,49,44,32,70,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,51,41,46,10,91,123,97,44,91,49,44,50,93,125,44,123,98,44,91,51,44,52,44,53,93,125,44,123,99,44,91,53,44,54,44,55,44,56,93,125,44,123,100,44,91,57,44,49,48,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,48,54>>,signature => [{attribute,{1371,2},spec,{{family_union,2},[{type,{1371,19},bounded_fun,[{type,{1371,19},'fun',[{type,{1371,19},product,[{var,{1371,20},'Family1'},{var,{1371,29},'Family2'}]},{var,{1371,41},'Family3'}]},[{type,{1372,7},constraint,[{atom,{1372,7},is_subtype},[{var,{1372,7},'Family1'},{user_type,{1372,18},family,[]}]]},{type,{1373,7},constraint,[{atom,{1373,7},is_subtype},[{var,{1373,7},'Family2'},{user_type,{1373,18},family,[]}]]},{type,{1374,7},constraint,[{atom,{1374,7},is_subtype},[{var,{1374,7},'Family3'},{user_type,{1374,18},family,[]}]]}]]}]}}]}},{{function,field,1},[{file,[115,111,102,115,46,101,114,108]},{location,632}],[<<102,105,101,108,100,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,105,101,108,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,101,108,100>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,98,125,44,123,50,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,102,105,101,108,100,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,49,44,50,44,97,44,98,44,99,93>>]}]},{p,[],[{code,[],[<<102,105,101,108,100,40,82,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<117,110,105,111,110,40,100,111,109,97,105,110,40,82,41,44,32,114,97,110,103,101,40,82,41,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,50,56>>,signature => [{attribute,{632,2},spec,{{field,1},[{type,{632,12},bounded_fun,[{type,{632,12},'fun',[{type,{632,12},product,[{var,{632,13},'BinRel'}]},{var,{632,24},'Set'}]},[{type,{633,7},constraint,[{atom,{633,7},is_subtype},[{var,{633,7},'BinRel'},{user_type,{633,17},binary_relation,[]}]]},{type,{634,7},constraint,[{atom,{634,7},is_subtype},[{var,{634,7},'Set'},{user_type,{634,14},a_set,[]}]]}]]}]}}]}},{{function,from_external,2},[{file,[115,111,102,115,46,101,114,108]},{location,169}],[<<102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32,115,101,116,32,102,114,111,109,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32>>,{code,[],[<<69,120,116,101,114,110,97,108,83,101,116>>]},<<32,97,110,100,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32>>,{code,[],[<<84,121,112,101>>]},<<46,32,73,116,32,105,115,32,97,115,115,117,109,101,100,32,116,104,97,116,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,118,97,108,105,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,111,102,32>>,{code,[],[<<69,120,116,101,114,110,97,108,83,101,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,52,52>>,signature => [{attribute,{169,2},spec,{{from_external,2},[{type,{169,20},bounded_fun,[{type,{169,20},'fun',[{type,{169,20},product,[{var,{169,21},'ExternalSet'},{var,{169,34},'Type'}]},{var,{169,43},'AnySet'}]},[{type,{170,7},constraint,[{atom,{170,7},is_subtype},[{var,{170,7},'ExternalSet'},{user_type,{170,22},external_set,[]}]]},{type,{171,7},constraint,[{atom,{171,7},is_subtype},[{var,{171,7},'AnySet'},{user_type,{171,17},anyset,[]}]]},{type,{172,7},constraint,[{atom,{172,7},is_subtype},[{var,{172,7},'Type'},{user_type,{172,15},type,[]}]]}]]}]}}]}},{{function,from_sets,1},[{file,[115,111,102,115,46,101,114,108]},{location,220}],[<<102,114,111,109,95,115,101,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,101,116,115,32,111,102,32,108,105,115,116,32>>,{code,[],[<<76,105,115,116,79,102,83,101,116,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,93,41,44,10,83,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,120,44,51,125,44,123,121,44,52,125,93,41,44,10,83,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,91,83,49,44,83,50,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,91,123,97,44,49,125,44,123,98,44,50,125,93,44,91,123,120,44,51,125,44,123,121,44,52,125,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,53,55>>,signature => [{attribute,{220,2},spec,{{from_sets,1},[{type,{220,16},bounded_fun,[{type,{220,16},'fun',[{type,{220,16},product,[{var,{220,17},'ListOfSets'}]},{var,{220,32},'Set'}]},[{type,{221,7},constraint,[{atom,{221,7},is_subtype},[{var,{221,7},'Set'},{user_type,{221,14},a_set,[]}]]},{type,{222,7},constraint,[{atom,{222,7},is_subtype},[{var,{222,7},'ListOfSets'},{type,{222,21},list,[{user_type,{222,22},anyset,[]}]}]]}]]}]}}]}},{{function,from_sets,1},[{file,[115,111,102,115,46,101,114,108]},{location,220}],[<<102,114,111,109,95,115,101,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<111,114,100,101,114,101,100,32,115,101,116>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,101,32,115,101,116,115,32,111,102,32,116,104,101,32,110,111,110,45,101,109,112,116,121,32,116,117,112,108,101,32>>,{code,[],[<<84,117,112,108,101,79,102,83,101,116,115>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,55,51>>,signature => [{attribute,{220,2},spec,{{from_sets,1},[{type,{223,16},bounded_fun,[{type,{223,16},'fun',[{type,{223,16},product,[{var,{223,17},'TupleOfSets'}]},{var,{223,33},'Ordset'}]},[{type,{224,7},constraint,[{atom,{224,7},is_subtype},[{var,{224,7},'Ordset'},{user_type,{224,17},ordset,[]}]]},{type,{225,7},constraint,[{atom,{225,7},is_subtype},[{var,{225,7},'TupleOfSets'},{user_type,{225,22},tuple_of,[{user_type,{225,31},anyset,[]}]}]]}]]}]}}]}},{{function,from_term,2},[{file,[115,111,102,115,46,101,114,108]},{location,155}],[<<102,114,111,109,95,116,101,114,109,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,56,51>>,equiv => {function,from_term,1},signature => [{attribute,{155,2},spec,{{from_term,2},[{type,{155,16},bounded_fun,[{type,{155,16},'fun',[{type,{155,16},product,[{var,{155,17},'Term'},{var,{155,23},'Type'}]},{var,{155,32},'AnySet'}]},[{type,{156,7},constraint,[{atom,{156,7},is_subtype},[{var,{156,7},'AnySet'},{user_type,{156,17},anyset,[]}]]},{type,{157,7},constraint,[{atom,{157,7},is_subtype},[{var,{157,7},'Term'},{type,{157,15},term,[]}]]},{type,{158,7},constraint,[{atom,{158,7},is_subtype},[{var,{158,7},'Type'},{user_type,{158,15},type,[]}]]}]]}]}}]}},{{function,from_term,1},[{file,[115,111,102,115,46,101,114,108]},{location,143}],[<<102,114,111,109,95,116,101,114,109,47,49>>],#{<<101,110>> => [{p,[],[{a,[{id,<<102,114,111,109,95,116,101,114,109>>}],[]},<<67,114,101,97,116,101,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,101,116,115>>]},<<32,98,121,32,116,114,97,118,101,114,115,105,110,103,32,116,101,114,109,32>>,{code,[],[<<84,101,114,109>>]},<<44,32,115,111,114,116,105,110,103,32,108,105,115,116,115,44,32,114,101,109,111,118,105,110,103,32,100,117,112,108,105,99,97,116,101,115,44,32,97,110,100,32,100,101,114,105,118,105,110,103,32,111,114,32,118,101,114,105,102,121,105,110,103,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,118,97,108,105,100,95,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<118,97,108,105,100,32,116,121,112,101>>]},<<32,102,111,114,32,116,104,101,32,115,111,32,111,98,116,97,105,110,101,100,32,101,120,116,101,114,110,97,108,32,115,101,116,46,32,65,110,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32>>,{code,[],[<<84,121,112,101>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,116,111,32,108,105,109,105,116,32,116,104,101,32,100,101,112,116,104,32,111,102,32,116,104,101,32,116,114,97,118,101,114,115,97,108,59,32,97,110,32,97,116,111,109,105,99,32,116,121,112,101,32,115,116,111,112,115,32,116,104,101,32,116,114,97,118,101,114,115,97,108,44,32,97,115,32,115,104,111,119,110,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,119,104,101,114,101,32>>,{code,[],[<<34,102,111,111,34>>]},<<32,97,110,100,32>>,{code,[],[<<123,34,102,111,111,34,125>>]},<<32,97,114,101,32,108,101,102,116,32,117,110,109,111,100,105,102,105,101,100,58>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,123,34,102,111,111,34,125,44,91,49,44,49,93,125,44,123,34,102,111,111,34,44,91,50,44,50,93,125,93,44,10,91,123,97,116,111,109,44,91,97,116,111,109,93,125,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,123,123,34,102,111,111,34,125,44,91,49,93,125,44,123,34,102,111,111,34,44,91,50,93,125,93>>]}]},{p,[],[{code,[],[<<102,114,111,109,95,116,101,114,109>>]},<<32,99,97,110,32,98,101,32,117,115,101,100,32,102,111,114,32,99,114,101,97,116,105,110,103,32,97,116,111,109,105,99,32,111,114,32,111,114,100,101,114,101,100,32,115,101,116,115,46,32,84,104,101,32,111,110,108,121,32,112,117,114,112,111,115,101,32,111,102,32,115,117,99,104,32,97,32,115,101,116,32,105,115,32,116,104,97,116,32,111,102,32,108,97,116,101,114,32,98,117,105,108,100,105,110,103,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,44,32,97,115,32,97,108,108,32,102,117,110,99,116,105,111,110,115,32,105,110,32,116,104,105,115,32,109,111,100,117,108,101,32,116,104,97,116,32>>,{em,[],[<<100,111>>]},<<32,97,110,121,116,104,105,110,103,32,111,112,101,114,97,116,101,32,111,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,46,32,67,114,101,97,116,105,110,103,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,32,102,114,111,109,32,97,32,99,111,108,108,101,99,116,105,111,110,32,111,102,32,111,114,100,101,114,101,100,32,115,101,116,115,32,99,97,110,32,98,101,32,116,104,101,32,119,97,121,32,116,111,32,103,111,32,105,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,98,105,103,32,97,110,100,32,111,110,101,32,100,111,101,115,32,110,111,116,32,119,97,110,116,32,116,111,32,119,97,115,116,101,32,104,101,97,112,32,98,121,32,114,101,98,117,105,108,100,105,110,103,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,115,104,111,119,115,32,116,104,97,116,32,97,32,115,101,116,32,99,97,110,32,98,101,32,98,117,105,108,116,32,34,108,97,121,101,114,32,98,121,32,108,97,121,101,114,34,58>>]},{pre,[],[{code,[],[<<49,62,32,65,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,97,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,44,51,93,41,44,10,80,49,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,123,65,44,83,125,41,44,10,80,50,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,123,98,44,91,54,44,53,44,52,93,125,41,44,10,83,115,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,91,80,49,44,80,50,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,115,41,46,10,91,123,97,44,91,49,44,50,44,51,93,125,44,123,98,44,91,52,44,53,44,54,93,125,93>>]}]},{p,[],[<<79,116,104,101,114,32,102,117,110,99,116,105,111,110,115,32,116,104,97,116,32,99,114,101,97,116,101,32,115,101,116,115,32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,101,120,116,101,114,110,97,108,47,50>>]}]},<<32,97,110,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,114,111,109,95,115,101,116,115,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,114,111,109,95,115,101,116,115,47,49>>]}]},<<46,32,83,112,101,99,105,97,108,32,99,97,115,101,115,32,111,102,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,47,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,97,95,102,117,110,99,116,105,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<97,95,102,117,110,99,116,105,111,110,47,49,44,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,109,112,116,121,95,115,101,116,47,48>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<101,109,112,116,121,95,115,101,116,47,48>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<102,97,109,105,108,121,47,49,44,50>>]}]},<<44,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,111,110,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<114,101,108,97,116,105,111,110,47,49,44,50>>]}]},<<44,32,97,110,100,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,47,49>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<115,101,116,47,49,44,50>>]}]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,57,56,51>>,signature => [{attribute,{143,2},spec,{{from_term,1},[{type,{143,16},bounded_fun,[{type,{143,16},'fun',[{type,{143,16},product,[{var,{143,17},'Term'}]},{var,{143,26},'AnySet'}]},[{type,{144,7},constraint,[{atom,{144,7},is_subtype},[{var,{144,7},'AnySet'},{user_type,{144,17},anyset,[]}]]},{type,{145,7},constraint,[{atom,{145,7},is_subtype},[{var,{145,7},'Term'},{type,{145,15},term,[]}]]}]]}]}}]}},{{function,image,2},[{file,[115,111,102,115,46,101,114,108]},{location,717}],[<<105,109,97,103,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,109,97,103,101>>]},<<32,111,102,32,115,101,116,32>>,{code,[],[<<83,101,116,49>>]},<<32,117,110,100,101,114,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,50,44,99,125,44,123,51,44,100,125,93,41,44,10,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,93,41,44,10,83,50,32,61,32,115,111,102,115,58,105,109,97,103,101,40,82,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,97,44,98,44,99,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,51,51>>,signature => [{attribute,{717,2},spec,{{image,2},[{type,{717,12},bounded_fun,[{type,{717,12},'fun',[{type,{717,12},product,[{var,{717,13},'BinRel'},{var,{717,21},'Set1'}]},{var,{717,30},'Set2'}]},[{type,{718,7},constraint,[{atom,{718,7},is_subtype},[{var,{718,7},'BinRel'},{user_type,{718,17},binary_relation,[]}]]},{type,{719,7},constraint,[{atom,{719,7},is_subtype},[{var,{719,7},'Set1'},{user_type,{719,15},a_set,[]}]]},{type,{720,7},constraint,[{atom,{720,7},is_subtype},[{var,{720,7},'Set2'},{user_type,{720,15},a_set,[]}]]}]]}]}}]}},{{function,intersection,1},[{file,[115,111,102,115,46,101,114,108]},{location,563}],[<<105,110,116,101,114,115,101,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,116,101,114,115,101,99,116,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,115,101,116,115,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<46>>]},{p,[],[<<73,110,116,101,114,115,101,99,116,105,110,103,32,97,110,32,101,109,112,116,121,32,115,101,116,32,111,102,32,115,101,116,115,32,101,120,105,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,109,101,115,115,97,103,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,52,57>>,signature => [{attribute,{563,2},spec,{{intersection,1},[{type,{563,19},bounded_fun,[{type,{563,19},'fun',[{type,{563,19},product,[{var,{563,20},'SetOfSets'}]},{var,{563,34},'Set'}]},[{type,{564,7},constraint,[{atom,{564,7},is_subtype},[{var,{564,7},'Set'},{user_type,{564,14},a_set,[]}]]},{type,{565,7},constraint,[{atom,{565,7},is_subtype},[{var,{565,7},'SetOfSets'},{user_type,{565,20},set_of_sets,[]}]]}]]}]}}]}},{{function,intersection,2},[{file,[115,111,102,115,46,101,114,108]},{location,388}],[<<105,110,116,101,114,115,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,116,101,114,115,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,116,101,114,115,101,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,54,49>>,signature => [{attribute,{388,2},spec,{{intersection,2},[{type,{388,19},bounded_fun,[{type,{388,19},'fun',[{type,{388,19},product,[{var,{388,20},'Set1'},{var,{388,26},'Set2'}]},{var,{388,35},'Set3'}]},[{type,{389,7},constraint,[{atom,{389,7},is_subtype},[{var,{389,7},'Set1'},{user_type,{389,15},a_set,[]}]]},{type,{390,7},constraint,[{atom,{390,7},is_subtype},[{var,{390,7},'Set2'},{user_type,{390,15},a_set,[]}]]},{type,{391,7},constraint,[{atom,{391,7},is_subtype},[{var,{391,7},'Set3'},{user_type,{391,15},a_set,[]}]]}]]}]}}]}},{{function,intersection_of_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,1299}],[<<105,110,116,101,114,115,101,99,116,105,111,110,95,111,102,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,105,110,116,101,114,115,101,99,116,105,111,110,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<46>>]},{p,[],[<<73,110,116,101,114,115,101,99,116,105,110,103,32,97,110,32,101,109,112,116,121,32,102,97,109,105,108,121,32,101,120,105,116,115,32,116,104,101,32,112,114,111,99,101,115,115,32,119,105,116,104,32,97,32>>,{code,[],[<<98,97,100,97,114,103>>]},<<32,109,101,115,115,97,103,101,46>>]},{pre,[],[{code,[],[<<49,62,32,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,48,44,50,44,52,93,125,44,123,98,44,91,48,44,49,44,50,93,125,44,123,99,44,91,50,44,51,93,125,93,41,44,10,83,32,61,32,115,111,102,115,58,105,110,116,101,114,115,101,99,116,105,111,110,95,111,102,95,102,97,109,105,108,121,40,70,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,50,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,55,49>>,signature => [{attribute,{1299,2},spec,{{intersection_of_family,1},[{type,{1299,29},bounded_fun,[{type,{1299,29},'fun',[{type,{1299,29},product,[{var,{1299,30},'Family'}]},{var,{1299,41},'Set'}]},[{type,{1300,7},constraint,[{atom,{1300,7},is_subtype},[{var,{1300,7},'Family'},{user_type,{1300,17},family,[]}]]},{type,{1301,7},constraint,[{atom,{1301,7},is_subtype},[{var,{1301,7},'Set'},{user_type,{1301,14},a_set,[]}]]}]]}]}}]}},{{function,inverse,1},[{file,[115,111,102,115,46,101,114,108]},{location,872}],[<<105,110,118,101,114,115,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,118,101,114,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,118,101,114,115,101>>]},<<32,111,102,32,102,117,110,99,116,105,111,110,32>>,{code,[],[<<70,117,110,99,116,105,111,110,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,105,110,118,101,114,115,101,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,97,44,49,125,44,123,98,44,50,125,44,123,99,44,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,48,56,56>>,signature => [{attribute,{872,2},spec,{{inverse,1},[{type,{872,14},bounded_fun,[{type,{872,14},'fun',[{type,{872,14},product,[{var,{872,15},'Function1'}]},{var,{872,29},'Function2'}]},[{type,{873,7},constraint,[{atom,{873,7},is_subtype},[{var,{873,7},'Function1'},{user_type,{873,20},a_function,[]}]]},{type,{874,7},constraint,[{atom,{874,7},is_subtype},[{var,{874,7},'Function2'},{user_type,{874,20},a_function,[]}]]}]]}]}}]}},{{function,inverse_image,2},[{file,[115,111,102,115,46,101,114,108]},{location,734}],[<<105,110,118,101,114,115,101,95,105,109,97,103,101,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,110,118,101,114,115,101,95,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,110,118,101,114,115,101,32,105,109,97,103,101>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,117,110,100,101,114,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,50,44,99,125,44,123,51,44,100,125,93,41,44,10,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,99,44,100,44,101,93,41,44,10,83,50,32,61,32,115,111,102,115,58,105,110,118,101,114,115,101,95,105,109,97,103,101,40,82,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,50,44,51,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,48,50>>,signature => [{attribute,{734,2},spec,{{inverse_image,2},[{type,{734,20},bounded_fun,[{type,{734,20},'fun',[{type,{734,20},product,[{var,{734,21},'BinRel'},{var,{734,29},'Set1'}]},{var,{734,38},'Set2'}]},[{type,{735,7},constraint,[{atom,{735,7},is_subtype},[{var,{735,7},'BinRel'},{user_type,{735,17},binary_relation,[]}]]},{type,{736,7},constraint,[{atom,{736,7},is_subtype},[{var,{736,7},'Set1'},{user_type,{736,15},a_set,[]}]]},{type,{737,7},constraint,[{atom,{737,7},is_subtype},[{var,{737,7},'Set2'},{user_type,{737,15},a_set,[]}]]}]]}]}}]}},{{function,is_a_function,1},[{file,[115,111,102,115,46,101,114,108]},{location,812}],[<<105,115,95,97,95,102,117,110,99,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<32,111,114,32,116,104,101,32,117,110,116,121,112,101,100,32,101,109,112,116,121,32,115,101,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,49,57>>,signature => [{attribute,{812,2},spec,{{is_a_function,1},[{type,{812,20},bounded_fun,[{type,{812,20},'fun',[{type,{812,20},product,[{var,{812,21},'BinRel'}]},{var,{812,32},'Bool'}]},[{type,{813,7},constraint,[{atom,{813,7},is_subtype},[{var,{813,7},'Bool'},{type,{813,15},boolean,[]}]]},{type,{814,7},constraint,[{atom,{814,7},is_subtype},[{var,{814,7},'BinRel'},{user_type,{814,17},binary_relation,[]}]]}]]}]}}]}},{{function,is_disjoint,2},[{file,[115,111,102,115,46,101,114,108]},{location,535}],[<<105,115,95,100,105,115,106,111,105,110,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,105,115,106,111,105,110,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,105,115,106,111,105,110,116>>]},<<44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,50,57>>,signature => [{attribute,{535,2},spec,{{is_disjoint,2},[{type,{535,18},bounded_fun,[{type,{535,18},'fun',[{type,{535,18},product,[{var,{535,19},'Set1'},{var,{535,25},'Set2'}]},{var,{535,34},'Bool'}]},[{type,{536,7},constraint,[{atom,{536,7},is_subtype},[{var,{536,7},'Bool'},{type,{536,15},boolean,[]}]]},{type,{537,7},constraint,[{atom,{537,7},is_subtype},[{var,{537,7},'Set1'},{user_type,{537,15},a_set,[]}]]},{type,{538,7},constraint,[{atom,{538,7},is_subtype},[{var,{538,7},'Set2'},{user_type,{538,15},a_set,[]}]]}]]}]}}]}},{{function,is_empty_set,1},[{file,[115,111,102,115,46,101,114,108]},{location,527}],[<<105,115,95,101,109,112,116,121,95,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<32,105,115,32,97,110,32,101,109,112,116,121,32,117,110,111,114,100,101,114,101,100,32,115,101,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,52,48>>,signature => [{attribute,{527,2},spec,{{is_empty_set,1},[{type,{527,19},bounded_fun,[{type,{527,19},'fun',[{type,{527,19},product,[{var,{527,20},'AnySet'}]},{var,{527,31},'Bool'}]},[{type,{528,7},constraint,[{atom,{528,7},is_subtype},[{var,{528,7},'AnySet'},{user_type,{528,17},anyset,[]}]]},{type,{529,7},constraint,[{atom,{529,7},is_subtype},[{var,{529,7},'Bool'},{type,{529,15},boolean,[]}]]}]]}]}}]}},{{function,is_equal,2},[{file,[115,111,102,115,46,101,114,108]},{location,480}],[<<105,115,95,101,113,117,97,108,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<65,110,121,83,101,116,50>>]},<<32,97,114,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,113,117,97,108>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,113,117,97,108>>]},<<44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,120,97,109,112,108,101,32,115,104,111,119,115,32,116,104,97,116,32>>,{code,[],[<<61,61,47,50>>]},<<32,105,115,32,117,115,101,100,32,119,104,101,110,32,99,111,109,112,97,114,105,110,103,32,115,101,116,115,32,102,111,114,32,101,113,117,97,108,105,116,121,58>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,46,48,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,49,93,41,44,10,115,111,102,115,58,105,115,95,101,113,117,97,108,40,83,49,44,32,83,50,41,46,10,116,114,117,101>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,52,57>>,signature => [{attribute,{480,2},spec,{{is_equal,2},[{type,{480,15},bounded_fun,[{type,{480,15},'fun',[{type,{480,15},product,[{var,{480,16},'AnySet1'},{var,{480,25},'AnySet2'}]},{var,{480,37},'Bool'}]},[{type,{481,7},constraint,[{atom,{481,7},is_subtype},[{var,{481,7},'AnySet1'},{user_type,{481,18},anyset,[]}]]},{type,{482,7},constraint,[{atom,{482,7},is_subtype},[{var,{482,7},'AnySet2'},{user_type,{482,18},anyset,[]}]]},{type,{483,7},constraint,[{atom,{483,7},is_subtype},[{var,{483,7},'Bool'},{type,{483,15},boolean,[]}]]}]]}]}}]}},{{function,is_set,1},[{file,[115,111,102,115,46,101,114,108]},{location,519}],[<<105,115,95,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<32,105,115,32,97,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<44,32,97,110,100,32>>,{code,[],[<<102,97,108,115,101>>]},<<32,105,102,32>>,{code,[],[<<65,110,121,83,101,116>>]},<<32,105,115,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,32,111,114,32,97,110,32,97,116,111,109,105,99,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,54,54>>,signature => [{attribute,{519,2},spec,{{is_set,1},[{type,{519,13},bounded_fun,[{type,{519,13},'fun',[{type,{519,13},product,[{var,{519,14},'AnySet'}]},{var,{519,25},'Bool'}]},[{type,{520,7},constraint,[{atom,{520,7},is_subtype},[{var,{520,7},'AnySet'},{user_type,{520,17},anyset,[]}]]},{type,{521,7},constraint,[{atom,{521,7},is_subtype},[{var,{521,7},'Bool'},{type,{521,15},boolean,[]}]]}]]}]}}]}},{{function,is_sofs_set,1},[{file,[115,111,102,115,46,101,114,108]},{location,509}],[<<105,115,95,115,111,102,115,95,115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<44,32,97,110,32,111,114,100,101,114,101,100,32,115,101,116,44,32,111,114,32,97,110,32,97,116,111,109,105,99,32,115,101,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,55,55>>,signature => [{attribute,{509,2},spec,{{is_sofs_set,1},[{type,{509,18},bounded_fun,[{type,{509,18},'fun',[{type,{509,18},product,[{var,{509,19},'Term'}]},{var,{509,28},'Bool'}]},[{type,{510,7},constraint,[{atom,{510,7},is_subtype},[{var,{510,7},'Bool'},{type,{510,15},boolean,[]}]]},{type,{511,7},constraint,[{atom,{511,7},is_subtype},[{var,{511,7},'Term'},{type,{511,15},term,[]}]]}]]}]}}]}},{{function,is_subset,2},[{file,[115,111,102,115,46,101,114,108]},{location,499}],[<<105,115,95,115,117,98,115,101,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,117,98,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,117,98,115,101,116>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,50>>]},<<44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<102,97,108,115,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,56,55>>,signature => [{attribute,{499,2},spec,{{is_subset,2},[{type,{499,16},bounded_fun,[{type,{499,16},'fun',[{type,{499,16},product,[{var,{499,17},'Set1'},{var,{499,23},'Set2'}]},{var,{499,32},'Bool'}]},[{type,{500,7},constraint,[{atom,{500,7},is_subtype},[{var,{500,7},'Bool'},{type,{500,15},boolean,[]}]]},{type,{501,7},constraint,[{atom,{501,7},is_subtype},[{var,{501,7},'Set1'},{user_type,{501,15},a_set,[]}]]},{type,{502,7},constraint,[{atom,{502,7},is_subtype},[{var,{502,7},'Set2'},{user_type,{502,15},a_set,[]}]]}]]}]}}]}},{{function,is_type,1},[{file,[115,111,102,115,46,101,114,108]},{location,183}],[<<105,115,95,116,121,112,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<32,105,102,32,116,101,114,109,32>>,{code,[],[<<84,101,114,109>>]},<<32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,49,57,55>>,signature => [{attribute,{183,2},spec,{{is_type,1},[{type,{183,14},bounded_fun,[{type,{183,14},'fun',[{type,{183,14},product,[{var,{183,15},'Term'}]},{var,{183,24},'Bool'}]},[{type,{184,7},constraint,[{atom,{184,7},is_subtype},[{var,{184,7},'Bool'},{type,{184,15},boolean,[]}]]},{type,{185,7},constraint,[{atom,{185,7},is_subtype},[{var,{185,7},'Term'},{type,{185,15},term,[]}]]}]]}]}}]}},{{function,join,4},[{file,[115,111,102,115,46,101,114,108]},{location,1206}],[<<106,111,105,110,47,52>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,110,97,116,117,114,97,108,95,106,111,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<110,97,116,117,114,97,108,32,106,111,105,110>>]},<<32,111,102,32,116,104,101,32,114,101,108,97,116,105,111,110,115,32>>,{code,[],[<<82,101,108,97,116,105,111,110,49>>]},<<32,97,110,100,32>>,{code,[],[<<82,101,108,97,116,105,111,110,50>>]},<<32,111,110,32,99,111,111,114,100,105,110,97,116,101,115,32>>,{code,[],[<<73>>]},<<32,97,110,100,32>>,{code,[],[<<74>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,120,44,49,125,44,123,98,44,121,44,50,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,102,44,103,125,44,123,49,44,104,44,105,125,44,123,50,44,51,44,52,125,93,41,44,10,74,32,61,32,115,111,102,115,58,106,111,105,110,40,82,49,44,32,51,44,32,82,50,44,32,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,74,41,46,10,91,123,97,44,120,44,49,44,102,44,103,125,44,123,97,44,120,44,49,44,104,44,105,125,44,123,98,44,121,44,50,44,51,44,52,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,48,54>>,signature => [{attribute,{1206,2},spec,{{join,4},[{type,{1206,11},bounded_fun,[{type,{1206,11},'fun',[{type,{1206,11},product,[{var,{1206,12},'Relation1'},{var,{1206,23},'I'},{var,{1206,26},'Relation2'},{var,{1206,37},'J'}]},{var,{1206,43},'Relation3'}]},[{type,{1207,7},constraint,[{atom,{1207,7},is_subtype},[{var,{1207,7},'Relation1'},{user_type,{1207,20},relation,[]}]]},{type,{1208,7},constraint,[{atom,{1208,7},is_subtype},[{var,{1208,7},'Relation2'},{user_type,{1208,20},relation,[]}]]},{type,{1209,7},constraint,[{atom,{1209,7},is_subtype},[{var,{1209,7},'Relation3'},{user_type,{1209,20},relation,[]}]]},{type,{1210,7},constraint,[{atom,{1210,7},is_subtype},[{var,{1210,7},'I'},{type,{1210,12},pos_integer,[]}]]},{type,{1211,7},constraint,[{atom,{1211,7},is_subtype},[{var,{1211,7},'J'},{type,{1211,12},pos_integer,[]}]]}]]}]}}]}},{{function,multiple_relative_product,2},[{file,[115,111,102,115,46,101,114,108]},{location,1190}],[<<109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<84,117,112,108,101,79,102,66,105,110,82,101,108,115>>]},<<32,105,115,32,97,32,110,111,110,45,101,109,112,116,121,32,116,117,112,108,101,32,123,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,125,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,44,32,116,104,101,110,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<109,117,108,116,105,112,108,101,32,114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,105,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,105,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,44,123,99,44,51,125,93,41,44,10,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,98,125,44,123,98,44,99,125,44,123,99,44,97,125,93,41,44,10,77,80,32,61,32,115,111,102,115,58,109,117,108,116,105,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,123,82,105,44,32,82,105,125,44,32,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,114,97,110,103,101,40,77,80,41,41,46,10,91,123,49,44,50,125,44,123,50,44,51,125,44,123,51,44,49,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,50,51>>,signature => [{attribute,{1190,2},spec,{{multiple_relative_product,2},[{type,{1190,32},bounded_fun,[{type,{1190,32},'fun',[{type,{1190,32},product,[{var,{1190,33},'TupleOfBinRels'},{var,{1190,49},'BinRel1'}]},{var,{1190,61},'BinRel2'}]},[{type,{1191,7},constraint,[{atom,{1191,7},is_subtype},[{var,{1191,7},'TupleOfBinRels'},{user_type,{1191,25},tuple_of,[{var,{1191,34},'BinRel'}]}]]},{type,{1192,7},constraint,[{atom,{1192,7},is_subtype},[{var,{1192,7},'BinRel'},{user_type,{1192,17},binary_relation,[]}]]},{type,{1193,7},constraint,[{atom,{1193,7},is_subtype},[{var,{1193,7},'BinRel1'},{user_type,{1193,18},binary_relation,[]}]]},{type,{1194,7},constraint,[{atom,{1194,7},is_subtype},[{var,{1194,7},'BinRel2'},{user_type,{1194,18},binary_relation,[]}]]}]]}]}}]}},{{function,no_elements,1},[{file,[115,111,102,115,46,101,114,108]},{location,349}],[<<110,111,95,101,108,101,109,101,110,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,110,117,109,98,101,114,32,111,102,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,111,114,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32>>,{code,[],[<<65,83,101,116>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,52,52>>,signature => [{attribute,{349,2},spec,{{no_elements,1},[{type,{349,18},bounded_fun,[{type,{349,18},'fun',[{type,{349,18},product,[{var,{349,19},'ASet'}]},{var,{349,28},'NoElements'}]},[{type,{350,7},constraint,[{atom,{350,7},is_subtype},[{var,{350,7},'ASet'},{type,{350,15},union,[{user_type,{350,15},a_set,[]},{user_type,{350,25},ordset,[]}]}]]},{type,{351,7},constraint,[{atom,{351,7},is_subtype},[{var,{351,7},'NoElements'},{type,{351,21},non_neg_integer,[]}]]}]]}]}}]}},{{function,partition,1},[{file,[115,111,102,115,46,101,114,108]},{location,1091}],[<<112,97,114,116,105,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32,116,104,101,32,117,110,105,111,110,32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,115,101,116,115,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,119,111,32,101,108,101,109,101,110,116,115,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,101,113,117,97,108,32,105,102,32,116,104,101,121,32,98,101,108,111,110,103,32,116,111,32,116,104,101,32,115,97,109,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,101,116,115,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,97,44,98,44,99,93,44,91,100,44,101,44,102,93,44,91,103,44,104,44,105,93,93,41,44,10,83,101,116,115,50,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,98,44,99,44,100,93,44,91,101,44,102,44,103,93,44,91,104,44,105,44,106,93,93,41,44,10,80,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,115,111,102,115,58,117,110,105,111,110,40,83,101,116,115,49,44,32,83,101,116,115,50,41,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,41,46,10,91,91,97,93,44,91,98,44,99,93,44,91,100,93,44,91,101,44,102,93,44,91,103,93,44,91,104,44,105,93,44,91,106,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,53,51>>,signature => [{attribute,{1091,2},spec,{{partition,1},[{type,{1091,16},bounded_fun,[{type,{1091,16},'fun',[{type,{1091,16},product,[{var,{1091,17},'SetOfSets'}]},{var,{1091,31},'Partition'}]},[{type,{1092,7},constraint,[{atom,{1092,7},is_subtype},[{var,{1092,7},'SetOfSets'},{user_type,{1092,20},set_of_sets,[]}]]},{type,{1093,7},constraint,[{atom,{1093,7},is_subtype},[{var,{1093,7},'Partition'},{user_type,{1093,20},a_set,[]}]]}]]}]}}]}},{{function,partition,2},[{file,[115,111,102,115,46,101,114,108]},{location,1099}],[<<112,97,114,116,105,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,119,111,32,101,108,101,109,101,110,116,115,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,101,113,117,97,108,32,105,102,32,116,104,101,32,114,101,115,117,108,116,115,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,97,114,101,32,101,113,117,97,108,46>>]},{pre,[],[{code,[],[<<49,62,32,83,115,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,91,97,93,44,91,98,93,44,91,99,44,100,93,44,91,101,44,102,93,93,41,44,10,83,101,116,70,117,110,32,61,32,102,117,110,40,83,41,32,45,62,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,115,111,102,115,58,110,111,95,101,108,101,109,101,110,116,115,40,83,41,41,32,101,110,100,44,10,80,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,83,101,116,70,117,110,44,32,83,115,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,41,46,10,91,91,91,97,93,44,91,98,93,93,44,91,91,99,44,100,93,44,91,101,44,102,93,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,55,48>>,signature => [{attribute,{1099,2},spec,{{partition,2},[{type,{1099,16},bounded_fun,[{type,{1099,16},'fun',[{type,{1099,16},product,[{var,{1099,17},'SetFun'},{var,{1099,25},'Set'}]},{var,{1099,33},'Partition'}]},[{type,{1100,7},constraint,[{atom,{1100,7},is_subtype},[{var,{1100,7},'SetFun'},{user_type,{1100,17},set_fun,[]}]]},{type,{1101,7},constraint,[{atom,{1101,7},is_subtype},[{var,{1101,7},'Partition'},{user_type,{1101,20},a_set,[]}]]},{type,{1102,7},constraint,[{atom,{1102,7},is_subtype},[{var,{1102,7},'Set'},{user_type,{1102,14},a_set,[]}]]}]]}]}}]}},{{function,partition,3},[{file,[115,111,102,115,46,101,114,108]},{location,1118}],[<<112,97,114,116,105,116,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,112,97,105,114,32,111,102,32,115,101,116,115,32,116,104,97,116,44,32,114,101,103,97,114,100,101,100,32,97,115,32,99,111,110,115,116,105,116,117,116,105,110,103,32,97,32,115,101,116,44,32,102,111,114,109,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<46,32,73,102,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,116,111,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,103,105,118,101,115,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<83,101,116,50>>]},<<44,32,116,104,101,32,101,108,101,109,101,110,116,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<83,101,116,51>>]},<<44,32,111,116,104,101,114,119,105,115,101,32,116,104,101,32,101,108,101,109,101,110,116,32,98,101,108,111,110,103,115,32,116,111,32>>,{code,[],[<<83,101,116,52>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,50,44,52,44,54,93,41,44,10,123,82,50,44,82,51,125,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,40,49,44,32,82,49,44,32,83,41,44,10,123,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,44,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,51,41,125,46,10,123,91,123,50,44,98,125,93,44,91,123,49,44,97,125,44,123,51,44,99,125,93,125>>]}]},{p,[],[{code,[],[<<112,97,114,116,105,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<123,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41,44,32,100,114,101,115,116,114,105,99,116,105,111,110,40,70,44,194,160,83,49,44,194,160,83,50,41,125>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,50,56,54>>,signature => [{attribute,{1118,2},spec,{{partition,3},[{type,{1118,16},bounded_fun,[{type,{1118,16},'fun',[{type,{1118,16},product,[{var,{1118,17},'SetFun'},{var,{1118,25},'Set1'},{var,{1118,31},'Set2'}]},{type,{1118,40},tuple,[{var,{1118,41},'Set3'},{var,{1118,47},'Set4'}]}]},[{type,{1119,7},constraint,[{atom,{1119,7},is_subtype},[{var,{1119,7},'SetFun'},{user_type,{1119,17},set_fun,[]}]]},{type,{1120,7},constraint,[{atom,{1120,7},is_subtype},[{var,{1120,7},'Set1'},{user_type,{1120,15},a_set,[]}]]},{type,{1121,7},constraint,[{atom,{1121,7},is_subtype},[{var,{1121,7},'Set2'},{user_type,{1121,15},a_set,[]}]]},{type,{1122,7},constraint,[{atom,{1122,7},is_subtype},[{var,{1122,7},'Set3'},{user_type,{1122,15},a_set,[]}]]},{type,{1123,7},constraint,[{atom,{1123,7},is_subtype},[{var,{1123,7},'Set4'},{user_type,{1123,15},a_set,[]}]]}]]}]}}]}},{{function,partition_family,2},[{file,[115,111,102,115,46,101,114,108]},{location,1404}],[<<112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,119,104,101,114,101,32,116,104,101,32,105,110,100,101,120,101,100,32,115,101,116,32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,97,114,116,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,97,114,116,105,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,119,111,32,101,108,101,109,101,110,116,115,32,97,114,101,32,99,111,110,115,105,100,101,114,101,100,32,101,113,117,97,108,32,105,102,32,116,104,101,32,114,101,115,117,108,116,115,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,97,114,101,32,116,104,101,32,115,97,109,101,32,118,97,108,117,101,32,105,46,32,84,104,105,115,32,105,32,105,115,32,116,104,101,32,105,110,100,101,120,32,116,104,97,116,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,109,97,112,115,32,111,110,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,113,117,105,118,97,108,101,110,99,101,95,99,108,97,115,115>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,113,117,105,118,97,108,101,110,99,101,32,99,108,97,115,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,97,44,97,44,97,125,44,123,97,44,97,44,98,44,98,125,44,123,97,44,98,44,98,44,98,125,93,41,44,10,83,101,116,70,117,110,32,61,32,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,65,44,95,44,67,44,95,125,41,32,45,62,32,123,65,44,67,125,32,101,110,100,125,44,10,70,32,61,32,115,111,102,115,58,112,97,114,116,105,116,105,111,110,95,102,97,109,105,108,121,40,83,101,116,70,117,110,44,32,83,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,123,97,44,97,125,44,91,123,97,44,97,44,97,44,97,125,93,125,44,123,123,97,44,98,125,44,91,123,97,44,97,44,98,44,98,125,44,123,97,44,98,44,98,44,98,125,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,48,57>>,signature => [{attribute,{1404,2},spec,{{partition_family,2},[{type,{1404,23},bounded_fun,[{type,{1404,23},'fun',[{type,{1404,23},product,[{var,{1404,24},'SetFun'},{var,{1404,32},'Set'}]},{var,{1404,40},'Family'}]},[{type,{1405,7},constraint,[{atom,{1405,7},is_subtype},[{var,{1405,7},'Family'},{user_type,{1405,17},family,[]}]]},{type,{1406,7},constraint,[{atom,{1406,7},is_subtype},[{var,{1406,7},'SetFun'},{user_type,{1406,17},set_fun,[]}]]},{type,{1407,7},constraint,[{atom,{1407,7},is_subtype},[{var,{1407,7},'Set'},{user_type,{1407,14},a_set,[]}]]}]]}]}}]}},{{function,product,1},[{file,[115,111,102,115,46,101,114,108]},{location,444}],[<<112,114,111,100,117,99,116,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116,95,116,117,112,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,110,111,110,45,101,109,112,116,121,32,116,117,112,108,101,32,111,102,32,115,101,116,115,32>>,{code,[],[<<84,117,112,108,101,79,102,83,101,116,115>>]},<<46,32,73,102,32,40,120,91,49,93,44,194,160,46,46,46,44,194,160,120,91,110,93,41,32,105,115,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,110,45,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<82,101,108,97,116,105,111,110>>]},<<44,32,116,104,101,110,32,120,91,105,93,32,105,115,32,100,114,97,119,110,32,102,114,111,109,32,101,108,101,109,101,110,116,32,105,32,111,102,32>>,{code,[],[<<84,117,112,108,101,79,102,83,101,116,115>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,97,44,98,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,93,41,44,10,83,51,32,61,32,115,111,102,115,58,115,101,116,40,91,120,44,121,93,41,44,10,80,51,32,61,32,115,111,102,115,58,112,114,111,100,117,99,116,40,123,83,49,44,83,50,44,83,51,125,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,51,41,46,10,91,123,97,44,49,44,120,125,44,123,97,44,49,44,121,125,44,123,97,44,50,44,120,125,44,123,97,44,50,44,121,125,44,123,98,44,49,44,120,125,44,123,98,44,49,44,121,125,44,123,98,44,50,44,120,125,44,123,98,44,50,44,121,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,51,48>>,signature => [{attribute,{444,2},spec,{{product,1},[{type,{444,14},bounded_fun,[{type,{444,14},'fun',[{type,{444,14},product,[{var,{444,15},'TupleOfSets'}]},{var,{444,31},'Relation'}]},[{type,{445,7},constraint,[{atom,{445,7},is_subtype},[{var,{445,7},'Relation'},{user_type,{445,19},relation,[]}]]},{type,{446,7},constraint,[{atom,{446,7},is_subtype},[{var,{446,7},'TupleOfSets'},{user_type,{446,22},tuple_of,[{user_type,{446,31},a_set,[]}]}]]}]]}]}}]}},{{function,product,2},[{file,[115,111,102,115,46,101,114,108]},{location,430}],[<<112,114,111,100,117,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,97,44,98,93,41,44,10,82,32,61,32,115,111,102,115,58,112,114,111,100,117,99,116,40,83,49,44,32,83,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,41,46,10,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,97,125,44,123,50,44,98,125,93>>]}]},{p,[],[{code,[],[<<112,114,111,100,117,99,116,40,83,49,44,194,160,83,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<112,114,111,100,117,99,116,40,123,83,49,44,194,160,83,50,125,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,52,57>>,signature => [{attribute,{430,2},spec,{{product,2},[{type,{430,14},bounded_fun,[{type,{430,14},'fun',[{type,{430,14},product,[{var,{430,15},'Set1'},{var,{430,21},'Set2'}]},{var,{430,30},'BinRel'}]},[{type,{431,7},constraint,[{atom,{431,7},is_subtype},[{var,{431,7},'BinRel'},{user_type,{431,17},binary_relation,[]}]]},{type,{432,7},constraint,[{atom,{432,7},is_subtype},[{var,{432,7},'Set1'},{user_type,{432,15},a_set,[]}]]},{type,{433,7},constraint,[{atom,{433,7},is_subtype},[{var,{433,7},'Set2'},{user_type,{433,15},a_set,[]}]]}]]}]}}]}},{{function,projection,2},[{file,[115,111,102,115,46,101,114,108]},{location,1029}],[<<112,114,111,106,101,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,101,116,32,99,114,101,97,116,101,100,32,98,121,32,115,117,98,115,116,105,116,117,116,105,110,103,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,98,121,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,116,111,32,116,104,101,32,101,108,101,109,101,110,116,46>>]},{p,[],[<<73,102,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,105,115,32,97,32,110,117,109,98,101,114,32,105,194,160,62,61,194,160,49,32,97,110,100,32>>,{code,[],[<<83,101,116,49>>]},<<32,105,115,32,97,32,114,101,108,97,116,105,111,110,44,32,116,104,101,110,32,116,104,101,32,114,101,116,117,114,110,101,100,32,115,101,116,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,112,114,111,106,101,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<112,114,111,106,101,99,116,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,111,110,116,111,32,99,111,111,114,100,105,110,97,116,101,32,105,46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,102,114,111,109,95,116,101,114,109,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,97,125,93,41,44,10,83,50,32,61,32,115,111,102,115,58,112,114,111,106,101,99,116,105,111,110,40,50,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,97,44,98,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,54,55>>,signature => [{attribute,{1029,2},spec,{{projection,2},[{type,{1029,17},bounded_fun,[{type,{1029,17},'fun',[{type,{1029,17},product,[{var,{1029,18},'SetFun'},{var,{1029,26},'Set1'}]},{var,{1029,35},'Set2'}]},[{type,{1030,7},constraint,[{atom,{1030,7},is_subtype},[{var,{1030,7},'SetFun'},{user_type,{1030,17},set_fun,[]}]]},{type,{1031,7},constraint,[{atom,{1031,7},is_subtype},[{var,{1031,7},'Set1'},{user_type,{1031,15},a_set,[]}]]},{type,{1032,7},constraint,[{atom,{1032,7},is_subtype},[{var,{1032,7},'Set2'},{user_type,{1032,15},a_set,[]}]]}]]}]}}]}},{{function,range,1},[{file,[115,111,102,115,46,101,114,108]},{location,622}],[<<114,97,110,103,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,97,110,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,97,110,103,101>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,98,125,44,123,50,44,98,125,44,123,50,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,114,97,110,103,101,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,97,44,98,44,99,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,51,56,54>>,signature => [{attribute,{622,2},spec,{{range,1},[{type,{622,12},bounded_fun,[{type,{622,12},'fun',[{type,{622,12},product,[{var,{622,13},'BinRel'}]},{var,{622,24},'Set'}]},[{type,{623,7},constraint,[{atom,{623,7},is_subtype},[{var,{623,7},'BinRel'},{user_type,{623,17},binary_relation,[]}]]},{type,{624,7},constraint,[{atom,{624,7},is_subtype},[{var,{624,7},'Set'},{user_type,{624,14},a_set,[]}]]}]]}]}}]}},{{function,relation,2},[{file,[115,111,102,115,46,101,114,108]},{location,255}],[<<114,101,108,97,116,105,111,110,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,48,48>>,equiv => {function,relation,1},signature => [{attribute,{255,2},spec,{{relation,2},[{type,{255,15},bounded_fun,[{type,{255,15},'fun',[{type,{255,15},product,[{var,{255,16},'Tuples'},{var,{255,24},'Type'}]},{var,{255,33},'Relation'}]},[{type,{256,7},constraint,[{atom,{256,7},is_subtype},[{var,{256,7},'N'},{type,{256,12},integer,[]}]]},{type,{257,7},constraint,[{atom,{257,7},is_subtype},[{var,{257,7},'Type'},{type,{257,15},union,[{var,{257,15},'N'},{user_type,{257,19},type,[]}]}]]},{type,{258,7},constraint,[{atom,{258,7},is_subtype},[{var,{258,7},'Relation'},{user_type,{258,19},relation,[]}]]},{type,{259,7},constraint,[{atom,{259,7},is_subtype},[{var,{259,7},'Tuples'},{type,{259,17},list,[{type,{259,18},tuple,any}]}]]}]]}]}}]}},{{function,relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,243}],[<<114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,111,110>>]},<<46,32>>,{code,[],[<<114,101,108,97,116,105,111,110,40,82,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,82,44,194,160,84,41>>]},<<44,32,105,102,32,84,32,105,115,32,97,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,97,110,100,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,32,114,101,108,97,116,105,111,110,46,32,73,102,32>>,{code,[],[<<84,121,112,101>>]},<<32,105,115,32,97,110,32,105,110,116,101,103,101,114,32,78,44,32,116,104,101,110,32>>,{code,[],[<<91,123,97,116,111,109,44,194,160,46,46,46,44,194,160,97,116,111,109,125,93,41>>]},<<44,32,119,104,101,114,101,32,116,104,101,32,116,117,112,108,101,32,115,105,122,101,32,105,115,32,78,44,32,105,115,32,117,115,101,100,32,97,115,32,116,121,112,101,32,111,102,32,116,104,101,32,114,101,108,97,116,105,111,110,46,32,73,102,32,110,111,32,116,121,112,101,32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32,116,104,101,32,115,105,122,101,32,111,102,32,116,104,101,32,102,105,114,115,116,32,116,117,112,108,101,32,111,102,32>>,{code,[],[<<84,117,112,108,101,115>>]},<<32,105,115,32,117,115,101,100,32,105,102,32,116,104,101,114,101,32,105,115,32,115,117,99,104,32,97,32,116,117,112,108,101,46,32>>,{code,[],[<<114,101,108,97,116,105,111,110,40,91,93,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<114,101,108,97,116,105,111,110,40,91,93,44,194,160,50,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,48,48>>,signature => [{attribute,{243,2},spec,{{relation,1},[{type,{243,15},bounded_fun,[{type,{243,15},'fun',[{type,{243,15},product,[{var,{243,16},'Tuples'}]},{var,{243,27},'Relation'}]},[{type,{244,7},constraint,[{atom,{244,7},is_subtype},[{var,{244,7},'Relation'},{user_type,{244,19},relation,[]}]]},{type,{245,7},constraint,[{atom,{245,7},is_subtype},[{var,{245,7},'Tuples'},{type,{245,17},list,[{type,{245,18},tuple,any}]}]]}]]}]}}]}},{{function,relation_to_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,600}],[<<114,101,108,97,116,105,111,110,95,116,111,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<32,115,117,99,104,32,116,104,97,116,32,116,104,101,32,105,110,100,101,120,32,115,101,116,32,105,115,32,101,113,117,97,108,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,100,111,109,97,105,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<100,111,109,97,105,110>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<44,32,97,110,100,32>>,{code,[],[<<70,97,109,105,108,121>>]},<<91,105,93,32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,109,97,103,101>>]},<<32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,105,32,117,110,100,101,114,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,98,44,49,125,44,123,99,44,50,125,44,123,99,44,51,125,93,41,44,10,70,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,95,116,111,95,102,97,109,105,108,121,40,82,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,70,41,46,10,91,123,98,44,91,49,93,125,44,123,99,44,91,50,44,51,93,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,49,57>>,signature => [{attribute,{600,2},spec,{{relation_to_family,1},[{type,{600,25},bounded_fun,[{type,{600,25},'fun',[{type,{600,25},product,[{var,{600,26},'BinRel'}]},{var,{600,37},'Family'}]},[{type,{601,7},constraint,[{atom,{601,7},is_subtype},[{var,{601,7},'Family'},{user_type,{601,17},family,[]}]]},{type,{602,7},constraint,[{atom,{602,7},is_subtype},[{var,{602,7},'BinRel'},{user_type,{602,17},binary_relation,[]}]]}]]}]}}]}},{{function,relative_product,2},[{file,[115,111,102,115,46,101,114,108]},{location,657}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,51,55>>,equiv => {function,relative_product,1},signature => [{attribute,{657,2},spec,{{relative_product,2},[{type,{657,23},bounded_fun,[{type,{657,23},'fun',[{type,{657,23},product,[{var,{657,24},'ListOfBinRels'},{var,{657,39},'BinRel1'}]},{var,{657,51},'BinRel2'}]},[{type,{658,7},constraint,[{atom,{658,7},is_subtype},[{var,{658,7},'ListOfBinRels'},{type,{658,24},nonempty_list,[{var,{658,25},'BinRel'}]}]]},{type,{659,7},constraint,[{atom,{659,7},is_subtype},[{var,{659,7},'BinRel'},{user_type,{659,17},binary_relation,[]}]]},{type,{660,7},constraint,[{atom,{660,7},is_subtype},[{var,{660,7},'BinRel1'},{user_type,{660,18},binary_relation,[]}]]},{type,{661,7},constraint,[{atom,{661,7},is_subtype},[{var,{661,7},'BinRel2'},{user_type,{661,18},binary_relation,[]}]]}]]}]}}]}},{{function,relative_product,1},[{file,[115,111,102,115,46,101,114,108]},{location,641}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,49>>],#{<<101,110>> => [{p,[],[<<73,102,32>>,{code,[],[<<76,105,115,116,79,102,66,105,110,82,101,108,115>>]},<<32,105,115,32,97,32,110,111,110,45,101,109,112,116,121,32,108,105,115,116,32,91,82,91,49,93,44,194,160,46,46,46,44,194,160,82,91,110,93,93,32,111,102,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,105,115,32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,44,32,116,104,101,110,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<32,105,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,117,112,108,101,95,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,32,40,82,91,105,93,44,194,160,46,46,46,44,194,160,82,91,110,93,41,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{p,[],[<<73,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,105,115,32,111,109,105,116,116,101,100,44,32,116,104,101,32,114,101,108,97,116,105,111,110,32,111,102,32,101,113,117,97,108,105,116,121,32,98,101,116,119,101,101,110,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,67,97,114,116,101,115,105,97,110,95,112,114,111,100,117,99,116,95,116,117,112,108,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<67,97,114,116,101,115,105,97,110,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,114,97,110,103,101,115,32,111,102,32,82,91,105,93,44,32,114,97,110,103,101,194,160,82,91,49,93,194,160,195,151,194,160,46,46,46,194,160,195,151,194,160,114,97,110,103,101,194,160,82,91,110,93,44,32,105,115,32,117,115,101,100,32,105,110,115,116,101,97,100,32,40,105,110,116,117,105,116,105,118,101,108,121,44,32,110,111,116,104,105,110,103,32,105,115,32,34,108,111,115,116,34,41,46>>]},{pre,[],[{code,[],[<<49,62,32,84,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,97,97,125,44,123,50,44,98,125,93,41,44,10,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,117,125,44,123,50,44,118,125,44,123,51,44,99,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,91,84,82,44,32,82,49,93,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,123,97,44,117,125,125,44,123,49,44,123,97,97,44,117,125,125,44,123,50,44,123,98,44,118,125,125,93>>]}]},{p,[],[<<78,111,116,105,99,101,32,116,104,97,116,32>>,{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,91,82,49,93,44,194,160,82,50,41>>]},<<32,105,115,32,100,105,102,102,101,114,101,110,116,32,102,114,111,109,32>>,{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,82,49,44,194,160,82,50,41>>]},<<59,32,116,104,101,32,108,105,115,116,32,111,102,32,111,110,101,32,101,108,101,109,101,110,116,32,105,115,32,110,111,116,32,105,100,101,110,116,105,102,105,101,100,32,119,105,116,104,32,116,104,101,32,101,108,101,109,101,110,116,32,105,116,115,101,108,102,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,51,55>>,signature => [{attribute,{641,2},spec,{{relative_product,1},[{type,{641,23},bounded_fun,[{type,{641,23},'fun',[{type,{641,23},product,[{var,{641,24},'ListOfBinRels'}]},{var,{641,42},'BinRel2'}]},[{type,{642,7},constraint,[{atom,{642,7},is_subtype},[{var,{642,7},'ListOfBinRels'},{type,{642,24},nonempty_list,[{var,{642,25},'BinRel'}]}]]},{type,{643,7},constraint,[{atom,{643,7},is_subtype},[{var,{643,7},'BinRel'},{user_type,{643,17},binary_relation,[]}]]},{type,{644,7},constraint,[{atom,{644,7},is_subtype},[{var,{644,7},'BinRel2'},{user_type,{644,18},binary_relation,[]}]]}]]}]}}]}},{{function,relative_product,2},[{file,[115,111,102,115,46,101,114,108]},{location,657}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,115,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,54,56>>,signature => [{attribute,{657,2},spec,{{relative_product,2},[{type,{662,23},bounded_fun,[{type,{662,23},'fun',[{type,{662,23},product,[{var,{662,24},'BinRel1'},{var,{662,33},'BinRel2'}]},{var,{662,45},'BinRel3'}]},[{type,{663,7},constraint,[{atom,{663,7},is_subtype},[{var,{663,7},'BinRel1'},{user_type,{663,18},binary_relation,[]}]]},{type,{664,7},constraint,[{atom,{664,7},is_subtype},[{var,{664,7},'BinRel2'},{user_type,{664,18},binary_relation,[]}]]},{type,{665,7},constraint,[{atom,{665,7},is_subtype},[{var,{665,7},'BinRel3'},{user_type,{665,18},binary_relation,[]}]]}]]}]}}]}},{{function,relative_product1,2},[{file,[115,111,102,115,46,101,114,108]},{location,685}],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,108,97,116,105,118,101,32,112,114,111,100,117,99,116>>]},<<32,111,102,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,99,111,110,118,101,114,115,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<99,111,110,118,101,114,115,101>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,97,110,100,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,49,44,97,97,125,44,123,50,44,98,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,117,125,44,123,50,44,118,125,44,123,51,44,99,125,93,41,44,10,82,51,32,61,32,115,111,102,115,58,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,40,82,49,44,32,82,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,51,41,46,10,91,123,97,44,117,125,44,123,97,97,44,117,125,44,123,98,44,118,125,93>>]}]},{p,[],[{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,40,82,49,44,194,160,82,50,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,40,99,111,110,118,101,114,115,101,40,82,49,41,44,194,160,82,50,41>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,52,55,57>>,signature => [{attribute,{685,2},spec,{{relative_product1,2},[{type,{685,24},bounded_fun,[{type,{685,24},'fun',[{type,{685,24},product,[{var,{685,25},'BinRel1'},{var,{685,34},'BinRel2'}]},{var,{685,46},'BinRel3'}]},[{type,{686,7},constraint,[{atom,{686,7},is_subtype},[{var,{686,7},'BinRel1'},{user_type,{686,18},binary_relation,[]}]]},{type,{687,7},constraint,[{atom,{687,7},is_subtype},[{var,{687,7},'BinRel2'},{user_type,{687,18},binary_relation,[]}]]},{type,{688,7},constraint,[{atom,{688,7},is_subtype},[{var,{688,7},'BinRel3'},{user_type,{688,18},binary_relation,[]}]]}]]}]}}]}},{{function,restriction,2},[{file,[115,111,102,115,46,101,114,108]},{location,826}],[<<114,101,115,116,114,105,99,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,114,101,115,116,114,105,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<114,101,115,116,114,105,99,116,105,111,110>>]},<<32,111,102,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<32,116,111,32>>,{code,[],[<<83,101,116>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,44,52,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,115,116,114,105,99,116,105,111,110,40,82,49,44,32,83,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,97,125,44,123,50,44,98,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,48,48>>,signature => [{attribute,{826,2},spec,{{restriction,2},[{type,{826,18},bounded_fun,[{type,{826,18},'fun',[{type,{826,18},product,[{var,{826,19},'BinRel1'},{var,{826,28},'Set'}]},{var,{826,36},'BinRel2'}]},[{type,{827,7},constraint,[{atom,{827,7},is_subtype},[{var,{827,7},'BinRel1'},{user_type,{827,18},binary_relation,[]}]]},{type,{828,7},constraint,[{atom,{828,7},is_subtype},[{var,{828,7},'BinRel2'},{user_type,{828,18},binary_relation,[]}]]},{type,{829,7},constraint,[{atom,{829,7},is_subtype},[{var,{829,7},'Set'},{user_type,{829,14},a_set,[]}]]}]]}]}}]}},{{function,restriction,3},[{file,[115,111,102,115,46,101,114,108]},{location,892}],[<<114,101,115,116,114,105,99,116,105,111,110,47,51>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,117,98,115,101,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,99,111,110,116,97,105,110,105,110,103,32,116,104,111,115,101,32,101,108,101,109,101,110,116,115,32,116,104,97,116,32,103,105,118,101,115,32,97,110,32,101,108,101,109,101,110,116,32,105,110,32>>,{code,[],[<<83,101,116,50>>]},<<32,97,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,97,125,44,123,50,44,98,125,44,123,51,44,99,125,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,98,44,99,44,100,93,41,44,10,83,51,32,61,32,115,111,102,115,58,114,101,115,116,114,105,99,116,105,111,110,40,50,44,32,83,49,44,32,83,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,51,41,46,10,91,123,50,44,98,125,44,123,51,44,99,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,49,54>>,signature => [{attribute,{892,2},spec,{{restriction,3},[{type,{892,18},bounded_fun,[{type,{892,18},'fun',[{type,{892,18},product,[{var,{892,19},'SetFun'},{var,{892,27},'Set1'},{var,{892,33},'Set2'}]},{var,{892,42},'Set3'}]},[{type,{893,7},constraint,[{atom,{893,7},is_subtype},[{var,{893,7},'SetFun'},{user_type,{893,17},set_fun,[]}]]},{type,{894,7},constraint,[{atom,{894,7},is_subtype},[{var,{894,7},'Set1'},{user_type,{894,15},a_set,[]}]]},{type,{895,7},constraint,[{atom,{895,7},is_subtype},[{var,{895,7},'Set2'},{user_type,{895,15},a_set,[]}]]},{type,{896,7},constraint,[{atom,{896,7},is_subtype},[{var,{896,7},'Set3'},{user_type,{896,15},a_set,[]}]]}]]}]}}]}},{{function,set,2},[{file,[115,111,102,115,46,101,114,108]},{location,204}],[<<115,101,116,47,50>>],#{},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,51,50>>,equiv => {function,set,1},signature => [{attribute,{204,2},spec,{{set,2},[{type,{204,10},bounded_fun,[{type,{204,10},'fun',[{type,{204,10},product,[{var,{204,11},'Terms'},{var,{204,18},'Type'}]},{var,{204,27},'Set'}]},[{type,{205,7},constraint,[{atom,{205,7},is_subtype},[{var,{205,7},'Set'},{user_type,{205,14},a_set,[]}]]},{type,{206,7},constraint,[{atom,{206,7},is_subtype},[{var,{206,7},'Terms'},{type,{206,16},list,[{type,{206,17},term,[]}]}]]},{type,{207,7},constraint,[{atom,{207,7},is_subtype},[{var,{207,7},'Type'},{user_type,{207,15},type,[]}]]}]]}]}}]}},{{function,set,1},[{file,[115,111,102,115,46,101,114,108]},{location,195}],[<<115,101,116,47,49>>],#{<<101,110>> => [{p,[],[<<67,114,101,97,116,101,115,32,97,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<46,32>>,{code,[],[<<115,101,116,40,76,44,194,160,84,41>>]},<<32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116,111,32>>,{code,[],[<<102,114,111,109,95,116,101,114,109,40,76,44,194,160,84,41>>]},<<44,32,105,102,32,116,104,101,32,114,101,115,117,108,116,32,105,115,32,97,110,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46,32,73,102,32,110,111,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,105,115,32,101,120,112,108,105,99,105,116,108,121,32,115,112,101,99,105,102,105,101,100,44,32>>,{code,[],[<<91,97,116,111,109,93>>]},<<32,105,115,32,117,115,101,100,32,97,115,32,116,104,101,32,115,101,116,32,116,121,112,101,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,51,50>>,signature => [{attribute,{195,2},spec,{{set,1},[{type,{195,10},bounded_fun,[{type,{195,10},'fun',[{type,{195,10},product,[{var,{195,11},'Terms'}]},{var,{195,21},'Set'}]},[{type,{196,7},constraint,[{atom,{196,7},is_subtype},[{var,{196,7},'Set'},{user_type,{196,14},a_set,[]}]]},{type,{197,7},constraint,[{atom,{197,7},is_subtype},[{var,{197,7},'Terms'},{type,{197,16},list,[{type,{197,17},term,[]}]}]]}]]}]}}]}},{{function,specification,2},[{file,[115,111,102,115,46,101,114,108]},{location,359}],[<<115,112,101,99,105,102,105,99,97,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,115,101,116,32,99,111,110,116,97,105,110,105,110,103,32,101,118,101,114,121,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,102,111,114,32,119,104,105,99,104,32>>,{code,[],[<<70,117,110>>]},<<32,114,101,116,117,114,110,115,32>>,{code,[],[<<116,114,117,101>>]},<<46,32,73,102,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,32,116,117,112,108,101,32>>,{code,[],[<<123,101,120,116,101,114,110,97,108,44,194,160,70,117,110,50,125>>]},<<44,32>>,{code,[],[<<70,117,110,50>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,111,102,32,101,97,99,104,32,101,108,101,109,101,110,116,44,32,111,116,104,101,114,119,105,115,101,32>>,{code,[],[<<70,117,110>>]},<<32,105,115,32,97,112,112,108,105,101,100,32,116,111,32,101,97,99,104,32,101,108,101,109,101,110,116,46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,97,44,49,125,44,123,98,44,50,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,120,44,49,125,44,123,120,44,50,125,44,123,121,44,51,125,93,41,44,10,83,49,32,61,32,115,111,102,115,58,102,114,111,109,95,115,101,116,115,40,91,82,49,44,82,50,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,112,101,99,105,102,105,99,97,116,105,111,110,40,102,117,110,32,115,111,102,115,58,105,115,95,97,95,102,117,110,99,116,105,111,110,47,49,44,32,83,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,50,41,46,10,91,91,123,97,44,49,125,44,123,98,44,50,125,93,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,52,53>>,signature => [{attribute,{359,2},spec,{{specification,2},[{type,{359,20},bounded_fun,[{type,{359,20},'fun',[{type,{359,20},product,[{var,{359,21},'Fun'},{var,{359,26},'Set1'}]},{var,{359,35},'Set2'}]},[{type,{360,7},constraint,[{atom,{360,7},is_subtype},[{var,{360,7},'Fun'},{user_type,{360,14},spec_fun,[]}]]},{type,{361,7},constraint,[{atom,{361,7},is_subtype},[{var,{361,7},'Set1'},{user_type,{361,15},a_set,[]}]]},{type,{362,7},constraint,[{atom,{362,7},is_subtype},[{var,{362,7},'Set2'},{user_type,{362,15},a_set,[]}]]}]]}]}}]}},{{function,strict_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,752}],[<<115,116,114,105,99,116,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,116,114,105,99,116,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,116,114,105,99,116,32,114,101,108,97,116,105,111,110>>]},<<32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,49,125,44,123,49,44,50,125,44,123,50,44,49,125,44,123,50,44,50,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,115,116,114,105,99,116,95,114,101,108,97,116,105,111,110,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,50,125,44,123,50,44,49,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,54,54>>,signature => [{attribute,{752,2},spec,{{strict_relation,1},[{type,{752,22},bounded_fun,[{type,{752,22},'fun',[{type,{752,22},product,[{var,{752,23},'BinRel1'}]},{var,{752,35},'BinRel2'}]},[{type,{753,7},constraint,[{atom,{753,7},is_subtype},[{var,{753,7},'BinRel1'},{user_type,{753,18},binary_relation,[]}]]},{type,{754,7},constraint,[{atom,{754,7},is_subtype},[{var,{754,7},'BinRel2'},{user_type,{754,18},binary_relation,[]}]]}]]}]}}]}},{{function,substitution,2},[{file,[115,111,102,115,46,101,114,108]},{location,1048}],[<<115,117,98,115,116,105,116,117,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,102,117,110,99,116,105,111,110,44,32,116,104,101,32,100,111,109,97,105,110,32,111,102,32,119,104,105,99,104,32,105,115,32>>,{code,[],[<<83,101,116,49>>]},<<46,32,84,104,101,32,118,97,108,117,101,32,111,102,32,97,110,32,101,108,101,109,101,110,116,32,111,102,32,116,104,101,32,100,111,109,97,105,110,32,105,115,32,116,104,101,32,114,101,115,117,108,116,32,111,102,32,97,112,112,108,121,105,110,103,32>>,{code,[],[<<83,101,116,70,117,110>>]},<<32,116,111,32,116,104,101,32,101,108,101,109,101,110,116,46>>]},{pre,[],[{code,[],[<<49,62,32,76,32,61,32,91,123,97,44,49,125,44,123,98,44,50,125,93,46,10,91,123,97,44,49,125,44,123,98,44,50,125,93,10,50,62,32,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,112,114,111,106,101,99,116,105,111,110,40,49,44,115,111,102,115,58,114,101,108,97,116,105,111,110,40,76,41,41,41,46,10,91,97,44,98,93,10,51,62,32,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,115,117,98,115,116,105,116,117,116,105,111,110,40,49,44,115,111,102,115,58,114,101,108,97,116,105,111,110,40,76,41,41,41,46,10,91,123,123,97,44,49,125,44,97,125,44,123,123,98,44,50,125,44,98,125,93,10,52,62,32,83,101,116,70,117,110,32,61,32,123,101,120,116,101,114,110,97,108,44,32,102,117,110,40,123,65,44,95,125,61,69,41,32,45,62,32,123,69,44,65,125,32,101,110,100,125,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,115,111,102,115,58,112,114,111,106,101,99,116,105,111,110,40,83,101,116,70,117,110,44,115,111,102,115,58,114,101,108,97,116,105,111,110,40,76,41,41,41,46,10,91,123,123,97,44,49,125,44,97,125,44,123,123,98,44,50,125,44,98,125,93>>]}]},{p,[],[<<84,104,101,32,114,101,108,97,116,105,111,110,32,111,102,32,101,113,117,97,108,105,116,121,32,98,101,116,119,101,101,110,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,123,97,44,98,44,99,125,58>>]},{pre,[],[{code,[],[<<49,62,32,73,32,61,32,115,111,102,115,58,115,117,98,115,116,105,116,117,116,105,111,110,40,102,117,110,40,65,41,32,45,62,32,65,32,101,110,100,44,32,115,111,102,115,58,115,101,116,40,91,97,44,98,44,99,93,41,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,73,41,46,10,91,123,97,44,97,125,44,123,98,44,98,125,44,123,99,44,99,125,93>>]}]},{p,[],[<<76,101,116,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,98,101,32,97,32,115,101,116,32,111,102,32,115,101,116,115,32,97,110,100,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,97,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,46,32,84,104,101,32,102,117,110,99,116,105,111,110,32,116,104,97,116,32,109,97,112,115,32,101,97,99,104,32,101,108,101,109,101,110,116,32>>,{code,[],[<<83,101,116>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,111,110,116,111,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<105,109,97,103,101>>]},<<32,111,102,32>>,{code,[],[<<83,101,116>>]},<<32,117,110,100,101,114,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,114,101,116,117,114,110,101,100,32,98,121,32,116,104,101,32,102,111,108,108,111,119,105,110,103,32,102,117,110,99,116,105,111,110,58>>]},{pre,[],[{code,[],[<<105,109,97,103,101,115,40,83,101,116,79,102,83,101,116,115,44,32,66,105,110,82,101,108,41,32,45,62,10,32,32,32,70,117,110,32,61,32,102,117,110,40,83,101,116,41,32,45,62,32,115,111,102,115,58,105,109,97,103,101,40,66,105,110,82,101,108,44,32,83,101,116,41,32,101,110,100,44,10,32,32,32,115,111,102,115,58,115,117,98,115,116,105,116,117,116,105,111,110,40,70,117,110,44,32,83,101,116,79,102,83,101,116,115,41,46>>]}]},{p,[],[<<69,120,116,101,114,110,97,108,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,32,97,114,101,32,114,101,112,114,101,115,101,110,116,101,100,32,97,115,32,115,111,114,116,101,100,32,108,105,115,116,115,46,32,83,111,44,32,99,114,101,97,116,105,110,103,32,116,104,101,32,105,109,97,103,101,32,111,102,32,97,32,115,101,116,32,117,110,100,101,114,32,97,32,114,101,108,97,116,105,111,110,32,82,32,99,97,110,32,116,114,97,118,101,114,115,101,32,97,108,108,32,101,108,101,109,101,110,116,115,32,111,102,32,82,32,40,116,111,32,116,104,97,116,32,99,111,109,101,115,32,116,104,101,32,115,111,114,116,105,110,103,32,111,102,32,114,101,115,117,108,116,115,44,32,116,104,101,32,105,109,97,103,101,41,46,32,73,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,105,109,97,103,101,47,50>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,109,102,97>>}],[{code,[],[<<105,109,97,103,101,47,50>>]}]},<<44,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,116,114,97,118,101,114,115,101,100,32,111,110,99,101,32,102,111,114,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<44,32,119,104,105,99,104,32,99,97,110,32,116,97,107,101,32,116,111,111,32,108,111,110,103,46,32,84,104,101,32,102,111,108,108,111,119,105,110,103,32,101,102,102,105,99,105,101,110,116,32,102,117,110,99,116,105,111,110,32,99,97,110,32,98,101,32,117,115,101,100,32,105,110,115,116,101,97,100,32,117,110,100,101,114,32,116,104,101,32,97,115,115,117,109,112,116,105,111,110,32,116,104,97,116,32,116,104,101,32,105,109,97,103,101,32,111,102,32,101,97,99,104,32,101,108,101,109,101,110,116,32,111,102,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<32,117,110,100,101,114,32>>,{code,[],[<<66,105,110,82,101,108>>]},<<32,105,115,32,110,111,110,45,101,109,112,116,121,58>>]},{pre,[],[{code,[],[<<105,109,97,103,101,115,50,40,83,101,116,79,102,83,101,116,115,44,32,66,105,110,82,101,108,41,32,45,62,10,32,32,32,67,82,32,61,32,115,111,102,115,58,99,97,110,111,110,105,99,97,108,95,114,101,108,97,116,105,111,110,40,83,101,116,79,102,83,101,116,115,41,44,10,32,32,32,82,32,61,32,115,111,102,115,58,114,101,108,97,116,105,118,101,95,112,114,111,100,117,99,116,49,40,67,82,44,32,66,105,110,82,101,108,41,44,10,32,32,32,115,111,102,115,58,114,101,108,97,116,105,111,110,95,116,111,95,102,97,109,105,108,121,40,82,41,46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,53,56,50>>,signature => [{attribute,{1048,2},spec,{{substitution,2},[{type,{1048,19},bounded_fun,[{type,{1048,19},'fun',[{type,{1048,19},product,[{var,{1048,20},'SetFun'},{var,{1048,28},'Set1'}]},{var,{1048,37},'Set2'}]},[{type,{1049,7},constraint,[{atom,{1049,7},is_subtype},[{var,{1049,7},'SetFun'},{user_type,{1049,17},set_fun,[]}]]},{type,{1050,7},constraint,[{atom,{1050,7},is_subtype},[{var,{1050,7},'Set1'},{user_type,{1050,15},a_set,[]}]]},{type,{1051,7},constraint,[{atom,{1051,7},is_subtype},[{var,{1051,7},'Set2'},{user_type,{1051,15},a_set,[]}]]}]]}]}}]}},{{function,symdiff,2},[{file,[115,111,102,115,46,101,114,108]},{location,408}],[<<115,121,109,100,105,102,102,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,121,109,109,101,116,114,105,99,95,100,105,102,102,101,114,101,110,99,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<115,121,109,109,101,116,114,105,99,32,100,105,102,102,101,114,101,110,99,101>>]},<<32,40,111,114,32,116,104,101,32,66,111,111,108,101,97,110,32,115,117,109,41,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,83,49,32,61,32,115,111,102,115,58,115,101,116,40,91,49,44,50,44,51,93,41,44,10,83,50,32,61,32,115,111,102,115,58,115,101,116,40,91,50,44,51,44,52,93,41,44,10,80,32,61,32,115,111,102,115,58,115,121,109,100,105,102,102,40,83,49,44,32,83,50,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,80,41,46,10,91,49,44,52,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,51,49>>,signature => [{attribute,{408,2},spec,{{symdiff,2},[{type,{408,14},bounded_fun,[{type,{408,14},'fun',[{type,{408,14},product,[{var,{408,15},'Set1'},{var,{408,21},'Set2'}]},{var,{408,30},'Set3'}]},[{type,{409,7},constraint,[{atom,{409,7},is_subtype},[{var,{409,7},'Set1'},{user_type,{409,15},a_set,[]}]]},{type,{410,7},constraint,[{atom,{410,7},is_subtype},[{var,{410,7},'Set2'},{user_type,{410,15},a_set,[]}]]},{type,{411,7},constraint,[{atom,{411,7},is_subtype},[{var,{411,7},'Set3'},{user_type,{411,15},a_set,[]}]]}]]}]}}]}},{{function,symmetric_partition,2},[{file,[115,111,102,115,46,101,114,108]},{location,418}],[<<115,121,109,109,101,116,114,105,99,95,112,97,114,116,105,116,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,116,114,105,112,108,101,32,111,102,32,115,101,116,115,58>>]},{ul,[],[{li,[],[{code,[],[<<83,101,116,51>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,116,104,97,116,32,100,111,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{li,[],[{code,[],[<<83,101,116,52>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,116,104,97,116,32,98,101,108,111,110,103,32,116,111,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]},{li,[],[{code,[],[<<83,101,116,53>>]},<<32,99,111,110,116,97,105,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32>>,{code,[],[<<83,101,116,50>>]},<<32,116,104,97,116,32,100,111,32,110,111,116,32,98,101,108,111,110,103,32,116,111,32>>,{code,[],[<<83,101,116,49>>]},<<46>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,52,55>>,signature => [{attribute,{418,2},spec,{{symmetric_partition,2},[{type,{418,26},bounded_fun,[{type,{418,26},'fun',[{type,{418,26},product,[{var,{418,27},'Set1'},{var,{418,33},'Set2'}]},{type,{418,42},tuple,[{var,{418,43},'Set3'},{var,{418,49},'Set4'},{var,{418,55},'Set5'}]}]},[{type,{419,7},constraint,[{atom,{419,7},is_subtype},[{var,{419,7},'Set1'},{user_type,{419,15},a_set,[]}]]},{type,{420,7},constraint,[{atom,{420,7},is_subtype},[{var,{420,7},'Set2'},{user_type,{420,15},a_set,[]}]]},{type,{421,7},constraint,[{atom,{421,7},is_subtype},[{var,{421,7},'Set3'},{user_type,{421,15},a_set,[]}]]},{type,{422,7},constraint,[{atom,{422,7},is_subtype},[{var,{422,7},'Set4'},{user_type,{422,15},a_set,[]}]]},{type,{423,7},constraint,[{atom,{423,7},is_subtype},[{var,{423,7},'Set5'},{user_type,{423,15},a_set,[]}]]}]]}]}}]}},{{function,to_external,1},[{file,[115,111,102,115,46,101,114,108]},{location,319}],[<<116,111,95,101,120,116,101,114,110,97,108,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<32,111,102,32,97,110,32,97,116,111,109,105,99,44,32,111,114,100,101,114,101,100,44,32,111,114,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,54,56>>,signature => [{attribute,{319,2},spec,{{to_external,1},[{type,{319,18},bounded_fun,[{type,{319,18},'fun',[{type,{319,18},product,[{var,{319,19},'AnySet'}]},{var,{319,30},'ExternalSet'}]},[{type,{320,7},constraint,[{atom,{320,7},is_subtype},[{var,{320,7},'ExternalSet'},{user_type,{320,22},external_set,[]}]]},{type,{321,7},constraint,[{atom,{321,7},is_subtype},[{var,{321,7},'AnySet'},{user_type,{321,17},anyset,[]}]]}]]}]}}]}},{{function,to_sets,1},[{file,[115,111,102,115,46,101,114,108]},{location,335}],[<<116,111,95,115,101,116,115,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,111,114,100,101,114,101,100,32,115,101,116,32>>,{code,[],[<<65,83,101,116>>]},<<32,97,115,32,97,32,116,117,112,108,101,32,111,102,32,115,101,116,115,44,32,97,110,100,32,116,104,101,32,101,108,101,109,101,110,116,115,32,111,102,32,116,104,101,32,117,110,111,114,100,101,114,101,100,32,115,101,116,32>>,{code,[],[<<65,83,101,116>>]},<<32,97,115,32,97,32,115,111,114,116,101,100,32,108,105,115,116,32,111,102,32,115,101,116,115,32,119,105,116,104,111,117,116,32,100,117,112,108,105,99,97,116,101,115,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,55,55>>,signature => [{attribute,{335,2},spec,{{to_sets,1},[{type,{335,14},bounded_fun,[{type,{335,14},'fun',[{type,{335,14},product,[{var,{335,15},'ASet'}]},{var,{335,24},'Sets'}]},[{type,{336,7},constraint,[{atom,{336,7},is_subtype},[{var,{336,7},'ASet'},{type,{336,15},union,[{user_type,{336,15},a_set,[]},{user_type,{336,25},ordset,[]}]}]]},{type,{337,7},constraint,[{atom,{337,7},is_subtype},[{var,{337,7},'Sets'},{type,{337,15},union,[{user_type,{337,15},tuple_of,[{var,{337,24},'AnySet'}]},{type,{337,34},list,[{var,{337,35},'AnySet'}]}]}]]},{type,{338,7},constraint,[{atom,{338,7},is_subtype},[{var,{338,7},'AnySet'},{user_type,{338,17},anyset,[]}]]}]]}]}}]}},{{function,type,1},[{file,[115,111,102,115,46,101,114,108]},{location,327}],[<<116,121,112,101,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<32,111,102,32,97,110,32,97,116,111,109,105,99,44,32,111,114,100,101,114,101,100,44,32,111,114,32,117,110,111,114,100,101,114,101,100,32,115,101,116,46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,56,56>>,signature => [{attribute,{327,2},spec,{{type,1},[{type,{327,11},bounded_fun,[{type,{327,11},'fun',[{type,{327,11},product,[{var,{327,12},'AnySet'}]},{var,{327,23},'Type'}]},[{type,{328,7},constraint,[{atom,{328,7},is_subtype},[{var,{328,7},'AnySet'},{user_type,{328,17},anyset,[]}]]},{type,{329,7},constraint,[{atom,{329,7},is_subtype},[{var,{329,7},'Type'},{user_type,{329,15},type,[]}]]}]]}]}}]}},{{function,union,1},[{file,[115,111,102,115,46,101,114,108]},{location,553}],[<<117,110,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110,95,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,105,111,110>>]},<<32,111,102,32,116,104,101,32,115,101,116,32,111,102,32,115,101,116,115,32>>,{code,[],[<<83,101,116,79,102,83,101,116,115>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,54,57,55>>,signature => [{attribute,{553,2},spec,{{union,1},[{type,{553,12},bounded_fun,[{type,{553,12},'fun',[{type,{553,12},product,[{var,{553,13},'SetOfSets'}]},{var,{553,27},'Set'}]},[{type,{554,7},constraint,[{atom,{554,7},is_subtype},[{var,{554,7},'Set'},{user_type,{554,14},a_set,[]}]]},{type,{555,7},constraint,[{atom,{555,7},is_subtype},[{var,{555,7},'SetOfSets'},{user_type,{555,20},set_of_sets,[]}]]}]]}]}}]}},{{function,union,2},[{file,[115,111,102,115,46,101,114,108]},{location,378}],[<<117,110,105,111,110,47,50>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,117,110,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,105,111,110>>]},<<32,111,102,32>>,{code,[],[<<83,101,116,49>>]},<<32,97,110,100,32>>,{code,[],[<<83,101,116,50>>]},<<46>>]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,55,48,54>>,signature => [{attribute,{378,2},spec,{{union,2},[{type,{378,12},bounded_fun,[{type,{378,12},'fun',[{type,{378,12},product,[{var,{378,13},'Set1'},{var,{378,19},'Set2'}]},{var,{378,28},'Set3'}]},[{type,{379,7},constraint,[{atom,{379,7},is_subtype},[{var,{379,7},'Set1'},{user_type,{379,15},a_set,[]}]]},{type,{380,7},constraint,[{atom,{380,7},is_subtype},[{var,{380,7},'Set2'},{user_type,{380,15},a_set,[]}]]},{type,{381,7},constraint,[{atom,{381,7},is_subtype},[{var,{381,7},'Set3'},{user_type,{381,15},a_set,[]}]]}]]}]}}]}},{{function,union_of_family,1},[{file,[115,111,102,115,46,101,114,108]},{location,1288}],[<<117,110,105,111,110,95,111,102,95,102,97,109,105,108,121,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,116,104,101,32,117,110,105,111,110,32,111,102,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32>>,{code,[],[<<70,97,109,105,108,121>>]},<<46>>]},{pre,[],[{code,[],[<<49,62,32,70,32,61,32,115,111,102,115,58,102,97,109,105,108,121,40,91,123,97,44,91,48,44,50,44,52,93,125,44,123,98,44,91,48,44,49,44,50,93,125,44,123,99,44,91,50,44,51,93,125,93,41,44,10,83,32,61,32,115,111,102,115,58,117,110,105,111,110,95,111,102,95,102,97,109,105,108,121,40,70,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,83,41,46,10,91,48,44,49,44,50,44,51,44,52,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,55,49,53>>,signature => [{attribute,{1288,2},spec,{{union_of_family,1},[{type,{1288,22},bounded_fun,[{type,{1288,22},'fun',[{type,{1288,22},product,[{var,{1288,23},'Family'}]},{var,{1288,34},'Set'}]},[{type,{1289,7},constraint,[{atom,{1289,7},is_subtype},[{var,{1289,7},'Family'},{user_type,{1289,17},family,[]}]]},{type,{1290,7},constraint,[{atom,{1290,7},is_subtype},[{var,{1290,7},'Set'},{user_type,{1290,14},a_set,[]}]]}]]}]}}]}},{{function,weak_relation,1},[{file,[115,111,102,115,46,101,114,108]},{location,763}],[<<119,101,97,107,95,114,101,108,97,116,105,111,110,47,49>>],#{<<101,110>> => [{p,[],[<<82,101,116,117,114,110,115,32,97,32,115,117,98,115,101,116,32,83,32,111,102,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,119,101,97,107,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<119,101,97,107,32,114,101,108,97,116,105,111,110>>]},<<32,87,32,99,111,114,114,101,115,112,111,110,100,105,110,103,32,116,111,32,116,104,101,32,98,105,110,97,114,121,32,114,101,108,97,116,105,111,110,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46,32,76,101,116,32,70,32,98,101,32,116,104,101,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,105,101,108,100>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,105,101,108,100>>]},<<32,111,102,32>>,{code,[],[<<66,105,110,82,101,108,49>>]},<<46,32,84,104,101,32,115,117,98,115,101,116,32,83,32,105,115,32,100,101,102,105,110,101,100,32,115,111,32,116,104,97,116,32,120,32,83,32,121,32,105,102,32,120,32,87,32,121,32,102,111,114,32,115,111,109,101,32,120,32,105,110,32,70,32,97,110,100,32,102,111,114,32,115,111,109,101,32,121,32,105,110,32,70,46>>]},{pre,[],[{code,[],[<<49,62,32,82,49,32,61,32,115,111,102,115,58,114,101,108,97,116,105,111,110,40,91,123,49,44,49,125,44,123,49,44,50,125,44,123,51,44,49,125,93,41,44,10,82,50,32,61,32,115,111,102,115,58,119,101,97,107,95,114,101,108,97,116,105,111,110,40,82,49,41,44,10,115,111,102,115,58,116,111,95,101,120,116,101,114,110,97,108,40,82,50,41,46,10,91,123,49,44,49,125,44,123,49,44,50,125,44,123,50,44,50,125,44,123,51,44,49,125,44,123,51,44,51,125,93>>]}]}]},#{edit_url => <<104,116,116,112,115,58,47,47,103,105,116,104,117,98,46,99,111,109,47,101,114,108,97,110,103,47,111,116,112,47,101,100,105,116,47,109,97,105,110,116,47,108,105,98,47,115,116,100,108,105,98,47,100,111,99,47,115,114,99,47,115,111,102,115,46,120,109,108,35,76,49,55,50,57>>,signature => [{attribute,{763,2},spec,{{weak_relation,1},[{type,{763,20},bounded_fun,[{type,{763,20},'fun',[{type,{763,20},product,[{var,{763,21},'BinRel1'}]},{var,{763,33},'BinRel2'}]},[{type,{764,7},constraint,[{atom,{764,7},is_subtype},[{var,{764,7},'BinRel1'},{user_type,{764,18},binary_relation,[]}]]},{type,{765,7},constraint,[{atom,{765,7},is_subtype},[{var,{765,7},'BinRel2'},{user_type,{765,18},binary_relation,[]}]]}]]}]}}]}},{{type,anyset,0},[{file,[115,111,102,115,46,101,114,108]},{location,117}],[<<45,116,121,112,101,32,97,110,121,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,121,32,107,105,110,100,32,111,102,32,115,101,116,32,40,97,108,115,111,32,105,110,99,108,117,100,101,100,32,97,114,101,32,116,104,101,32,97,116,111,109,105,99,32,115,101,116,115,41,46>>]}]},#{signature => [{attribute,{117,2},type,{anyset,{type,{117,19},union,[{user_type,{117,19},ordset,[]},{user_type,{117,30},a_set,[]}]},[]}}]}},{{type,binary_relation,0},[{file,[115,111,102,115,46,101,114,108]},{location,118}],[<<45,116,121,112,101,32,98,105,110,97,114,121,95,114,101,108,97,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,98,105,110,97,114,121,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<98,105,110,97,114,121,32,114,101,108,97,116,105,111,110>>]},<<46>>]}]},#{signature => [{attribute,{118,2},type,{binary_relation,{user_type,{118,28},relation,[]},[]}}]}},{{type,external_set,0},[{file,[115,111,102,115,46,101,114,108]},{location,119}],[<<45,116,121,112,101,32,101,120,116,101,114,110,97,108,95,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,101,120,116,101,114,110,97,108,95,115,101,116>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<101,120,116,101,114,110,97,108,32,115,101,116>>]},<<46>>]}]},#{signature => [{attribute,{119,2},type,{external_set,{type,{119,25},term,[]},[]}}]}},{{type,family,0},[{file,[115,111,102,115,46,101,114,108]},{location,121}],[<<45,116,121,112,101,32,102,97,109,105,108,121,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,97,109,105,108,121>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,97,109,105,108,121>>]},<<32,40,111,102,32,115,117,98,115,101,116,115,41,46>>]}]},#{signature => [{attribute,{121,2},type,{family,{user_type,{121,19},a_function,[]},[]}}]}},{{type,a_function,0},[{file,[115,111,102,115,46,101,114,108]},{location,120}],[<<45,116,121,112,101,32,97,95,102,117,110,99,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,102,117,110,99,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<102,117,110,99,116,105,111,110>>]},<<46>>]}]},#{signature => [{attribute,{120,2},type,{a_function,{user_type,{120,23},relation,[]},[]}}]}},{{type,ordset,0},[{file,[115,111,102,115,46,101,114,108]},{location,122}],[<<45,116,121,112,101,32,111,114,100,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<111,114,100,101,114,101,100,32,115,101,116>>]},<<46>>]}]},#{signature => [{attribute,{122,2},opaque,{ordset,{type,{122,21},record,[{atom,{122,23},'OrdSet'}]},[]}}]}},{{type,relation,0},[{file,[115,111,102,115,46,101,114,108]},{location,123}],[<<45,116,121,112,101,32,114,101,108,97,116,105,111,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,110,95,97,114,121,95,114,101,108,97,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<110,45,97,114,121,32,114,101,108,97,116,105,111,110>>]},<<46>>]}]},#{signature => [{attribute,{123,2},type,{relation,{user_type,{123,21},a_set,[]},[]}}]}},{{type,a_set,0},[{file,[115,111,102,115,46,101,114,108]},{location,124}],[<<45,116,121,112,101,32,97,95,115,101,116,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<46>>]}]},#{signature => [{attribute,{124,2},opaque,{a_set,{type,{124,20},record,[{atom,{124,22},'Set'}]},[]}}]}},{{type,set_of_sets,0},[{file,[115,111,102,115,46,101,114,108]},{location,125}],[<<45,116,121,112,101,32,115,101,116,95,111,102,95,115,101,116,115,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,110,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,115,95,100,101,102,105,110,105,116,105,111,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<117,110,111,114,100,101,114,101,100,32,115,101,116>>]},<<32,111,102,32,117,110,111,114,100,101,114,101,100,32,115,101,116,115,46>>]}]},#{signature => [{attribute,{125,2},type,{set_of_sets,{user_type,{125,24},a_set,[]},[]}}]}},{{type,set_fun,0},[{file,[115,111,102,115,46,101,114,108]},{location,126}],[<<45,116,121,112,101,32,115,101,116,95,102,117,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,115,101,116,95,102,117,110>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<83,101,116,70,117,110>>]},<<46>>]}]},#{signature => [{attribute,{126,2},type,{set_fun,{type,{126,20},union,[{type,{126,20},pos_integer,[]},{type,{127,20},tuple,[{atom,{127,21},external},{type,{127,35},'fun',[{type,{127,35},product,[{user_type,{127,36},external_set,[]}]},{user_type,{127,55},external_set,[]}]}]},{type,{128,24},'fun',[{type,{128,24},product,[{user_type,{128,25},anyset,[]}]},{user_type,{128,38},anyset,[]}]}]},[]}}]}},{{type,spec_fun,0},[{file,[115,111,102,115,46,101,114,108]},{location,129}],[<<45,116,121,112,101,32,115,112,101,99,95,102,117,110,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{},#{signature => [{attribute,{129,2},type,{spec_fun,{type,{129,21},union,[{type,{129,21},tuple,[{atom,{129,22},external},{type,{129,36},'fun',[{type,{129,36},product,[{user_type,{129,37},external_set,[]}]},{type,{129,56},boolean,[]}]}]},{type,{130,25},'fun',[{type,{130,25},product,[{user_type,{130,26},anyset,[]}]},{type,{130,39},boolean,[]}]}]},[]}}]}},{{type,type,0},[{file,[115,111,102,115,46,101,114,108]},{location,131}],[<<45,116,121,112,101,32,116,121,112,101,40,41,32,58,58,32,116,101,114,109,40,41,46>>],#{<<101,110>> => [{p,[],[<<65,32>>,{a,[{href,<<115,116,100,108,105,98,58,115,111,102,115,35,116,121,112,101>>},{rel,<<104,116,116,112,115,58,47,47,101,114,108,97,110,103,46,111,114,103,47,100,111,99,47,108,105,110,107,47,115,101,101,101,114,108>>}],[<<116,121,112,101>>]},<<46>>]}]},#{signature => [{attribute,{131,2},type,{type,{type,{131,17},term,[]},[]}}]}},{{type,tuple_of,1},[{file,[115,111,102,115,46,101,114,108]},{location,133}],[<<116,117,112,108,101,95,111,102,40,84,41>>],#{<<101,110>> => [{p,[],[<<65,32,116,117,112,108,101,32,119,104,101,114,101,32,116,104,101,32,101,108,101,109,101,110,116,115,32,97,114,101,32,111,102,32,116,121,112,101,32>>,{code,[],[<<84>>]},<<46>>]}]},#{signature => [{attribute,{133,2},type,{tuple_of,{type,{133,23},tuple,any},[{var,{133,16},'_T'}]}}]}}]}. \ No newline at end of file
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re.txt b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re.txt
index 21a3dbf487..2d8a293de2 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re.txt
@@ -1645,9 +1645,6 @@
alpha:
Letters
- ascii:
- Character codes 0-127
-
blank:
Space or tab only
@@ -1681,6 +1678,12 @@
xdigit:
Hexadecimal digits
+ There is another character class, ascii, that erroneously
+ matches Latin-1 characters instead of the 0-127 range specified by
+ POSIX. This cannot be fixed without altering the behaviour of
+ other classes, so we recommend matching the range with [\\0-\x7f]
+ instead.
+
The default "space" characters are HT (9), LF (10), VT (11), FF
(12), CR (13), and space (32). If locale-specific matching is
taking place, the list of space characters may be different; there
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_grun_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_grun_3_func.txt
new file mode 100644
index 0000000000..6f0af3fc67
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_grun_3_func.txt
@@ -0,0 +1,5 @@
+
+  grun/3
+
+ The documentation for grun/3 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_internal_run_4_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_internal_run_4_func.txt
new file mode 100644
index 0000000000..d896aabce3
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_internal_run_4_func.txt
@@ -0,0 +1,6 @@
+
+  internal_run/4
+
+ The documentation for internal_run/4 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_ucompile_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_ucompile_2_func.txt
new file mode 100644
index 0000000000..148c48a4b0
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_ucompile_2_func.txt
@@ -0,0 +1,5 @@
+
+  ucompile/2
+
+ The documentation for ucompile/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_urun_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_urun_3_func.txt
new file mode 100644
index 0000000000..ddfb951486
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_re_urun_3_func.txt
@@ -0,0 +1,5 @@
+
+  urun/3
+
+ The documentation for urun/3 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_fam2rel_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_fam2rel_1_func.txt
new file mode 100644
index 0000000000..1eafcb4078
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_fam2rel_1_func.txt
@@ -0,0 +1,5 @@
+
+  fam2rel/1
+
+ The documentation for fam2rel/1 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_rel2fam_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_rel2fam_1_func.txt
new file mode 100644
index 0000000000..d41d2c6c18
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/stdlib_sofs_rel2fam_1_func.txt
@@ -0,0 +1,5 @@
+
+  rel2fam/1
+
+ The documentation for rel2fam/1 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang.txt
index a2fb62f0d0..b275eb19da 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang.txt
@@ -1,16 +1,21 @@
 erlang
- By convention, most Built-In Functions (BIFs) are included in this
- module. Some of the BIFs are viewed more or less as part of the
- Erlang programming language and are auto-imported. Thus, it is
- not necessary to specify the module name. For example, the calls 
+ By convention, most Built-In Functions (BIFs) and all predefined
+ types are included in this module. Some of the BIFs and all of the
+ predefined types are viewed more or less as part of the Erlang
+ programming language and are auto-imported. Thus, it is not
+ necessary to specify the module name. For example, the calls 
atom_to_list(erlang) and erlang:atom_to_list(erlang) are
identical.
Auto-imported BIFs are listed without module prefix. BIFs listed
with module prefix are not auto-imported.
+ Predefined types are listed in the Predefined datatypes section
+ of this reference manual and in the Types and Function
+ Specifications section of the Erlang Reference Manual.
+
BIFs can fail for various reasons. All BIFs fail with reason 
badarg if they are called with arguments of an incorrect type.
The other reasons are described in the description of each
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_!_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_!_2_func.txt
new file mode 100644
index 0000000000..222e852764
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_!_2_func.txt
@@ -0,0 +1,5 @@
+
+  '!'/2
+
+ The documentation for '!'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_++_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_++_2_func.txt
new file mode 100644
index 0000000000..5dcd568da5
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_++_2_func.txt
@@ -0,0 +1,5 @@
+
+  '++'/2
+
+ The documentation for '++'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_1_func.txt
new file mode 100644
index 0000000000..e3ecf4bf3c
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_1_func.txt
@@ -0,0 +1,5 @@
+
+  '+'/1
+
+ The documentation for '+'/1 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_2_func.txt
new file mode 100644
index 0000000000..bf738628fc
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_+_2_func.txt
@@ -0,0 +1,5 @@
+
+  '+'/2
+
+ The documentation for '+'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_--_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_--_2_func.txt
new file mode 100644
index 0000000000..797d1d5b45
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_--_2_func.txt
@@ -0,0 +1,5 @@
+
+  '--'/2
+
+ The documentation for '--'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_1_func.txt
new file mode 100644
index 0000000000..51cf374386
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_1_func.txt
@@ -0,0 +1,5 @@
+
+  '-'/1
+
+ The documentation for '-'/1 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_2_func.txt
new file mode 100644
index 0000000000..797a700c86
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_-_2_func.txt
@@ -0,0 +1,5 @@
+
+  '-'/2
+
+ The documentation for '-'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_0_func.txt
index 0b0446302f..150c8604b9 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_0_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_0_func.txt
@@ -2,7 +2,7 @@
-spec alias() -> Alias when Alias :: reference().
Since:
- OTP @OTP-16718@
+ OTP 24.0
Create an alias which can be used when sending messages to the
process that created the alias. When the alias has been
@@ -19,3 +19,36 @@
The alias will be automatically deactivated when a reply
message sent via the alias is received. The alias can also
still be deactivated via a call to unalias/1.
+
+ Example:
+
+ server() ->
+ receive
+ {request, AliasReqId, Request} ->
+ Result = perform_request(Request),
+ AliasReqId ! {reply, AliasReqId, Result}
+ end,
+ server().
+
+ client(ServerPid, Request) ->
+ AliasReqId = alias([reply]),
+ ServerPid ! {request, AliasReqId, Request},
+ %% Alias will be automatically deactivated if we receive a reply
+ %% since we used the 'reply' option...
+ receive
+ {reply, AliasReqId, Result} -> Result
+ after 5000 ->
+ unalias(AliasReqId),
+ %% Flush message queue in case the reply arrived
+ %% just before the alias was deactivated...
+ receive {reply, AliasReqId, Result} -> Result
+ after 0 -> exit(timeout)
+ end
+ end.
+
+
+ Note that both the server and the client in this example must be
+ executing on at least OTP 24 systems in order for this to work.
+
+ For more information on process aliases see the Process Aliases
+ section of the Erlang Reference Manual.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_1_func.txt
index 291db25ac3..03aa38c1cd 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alias_1_func.txt
@@ -5,7 +5,7 @@
 Opts :: [explicit_unalias | reply].
Since:
- OTP @OTP-16718@
+ OTP 24.0
Create an alias which can be used when sending messages to the
process that created the alias. When the alias has been
@@ -22,3 +22,36 @@
The alias will be automatically deactivated when a reply
message sent via the alias is received. The alias can also
still be deactivated via a call to unalias/1.
+
+ Example:
+
+ server() ->
+ receive
+ {request, AliasReqId, Request} ->
+ Result = perform_request(Request),
+ AliasReqId ! {reply, AliasReqId, Result}
+ end,
+ server().
+
+ client(ServerPid, Request) ->
+ AliasReqId = alias([reply]),
+ ServerPid ! {request, AliasReqId, Request},
+ %% Alias will be automatically deactivated if we receive a reply
+ %% since we used the 'reply' option...
+ receive
+ {reply, AliasReqId, Result} -> Result
+ after 5000 ->
+ unalias(AliasReqId),
+ %% Flush message queue in case the reply arrived
+ %% just before the alias was deactivated...
+ receive {reply, AliasReqId, Result} -> Result
+ after 0 -> exit(timeout)
+ end
+ end.
+
+
+ Note that both the server and the client in this example must be
+ executing on at least OTP 24 systems in order for this to work.
+
+ For more information on process aliases see the Process Aliases
+ section of the Erlang Reference Manual.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_info_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_info_1_func.txt
new file mode 100644
index 0000000000..110bd44e53
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_info_1_func.txt
@@ -0,0 +1,6 @@
+
+  alloc_info/1
+
+ The documentation for alloc_info/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_sizes_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_sizes_1_func.txt
new file mode 100644
index 0000000000..e2abffaa6e
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_alloc_sizes_1_func.txt
@@ -0,0 +1,6 @@
+
+  alloc_sizes/1
+
+ The documentation for alloc_sizes/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_and_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_and_2_func.txt
new file mode 100644
index 0000000000..820cf83475
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_and_2_func.txt
@@ -0,0 +1,5 @@
+
+  'and'/2
+
+ The documentation for 'and'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_any_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_any_0_type.txt
new file mode 100644
index 0000000000..99d9f7affa
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_any_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type any() :: any().
+
+ All possible Erlang terms. Synonym for term().
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_append_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_append_2_func.txt
new file mode 100644
index 0000000000..a65746afaf
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_append_2_func.txt
@@ -0,0 +1,5 @@
+
+  append/2
+
+ The documentation for append/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_arity_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_arity_0_type.txt
new file mode 100644
index 0000000000..0ff062f3dc
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_arity_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type arity() :: arity().
+
+ The arity of a function or type.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_atom_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_atom_0_type.txt
new file mode 100644
index 0000000000..44e92c9560
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_atom_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type atom() :: atom().
+
+ An Erlang atom.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_band_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_band_2_func.txt
new file mode 100644
index 0000000000..f3781ac0e0
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_band_2_func.txt
@@ -0,0 +1,5 @@
+
+  'band'/2
+
+ The documentation for 'band'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_0_type.txt
new file mode 100644
index 0000000000..25e2353a9a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type binary() :: <<_:_*8>>.
+
+ An Erlang binary, that is, a bitstring with a size divisible by
+ 8.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_atom_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_atom_2_func.txt
index e86900006d..cf0eb33859 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_atom_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_atom_2_func.txt
@@ -10,11 +10,8 @@
Note:
As from Erlang/OTP 20, binary_to_atom(Binary, utf8) is
- capable of encoding any Unicode character. Earlier versions
+ capable of decoding any Unicode character. Earlier versions
would fail if the binary contained Unicode characters > 255.
- For more information about Unicode support in atoms, see the
- note on UTF-8 encoded atoms in section "External Term Format"
- in the User's Guide.
Note:
The number of characters that are permitted in an atom name is
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_1_func.txt
index 53488792d3..413260f6a8 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_1_func.txt
@@ -11,7 +11,10 @@
hello
Warning:
- When decoding binaries from untrusted sources, consider using 
- binary_to_term/2 to prevent Denial of Service attacks.
+ When decoding binaries from untrusted sources, the untrusted
+ source may submit data in a way to create resources, such as
+ atoms and remote references, that cannot be garbage collected
+ and lead to Denial of Service attack. In such cases, consider
+ using binary_to_term/2 with the safe option.
See also term_to_binary/1 and binary_to_term/2.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_2_func.txt
index 026b8d18cb..60e6109348 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_binary_to_term_2_func.txt
@@ -16,7 +16,7 @@
source.
When enabled, it prevents decoding data that can be used to
- attack the Erlang system. In the event of receiving unsafe
+ attack the Erlang runtime. In the event of receiving unsafe
data, decoding fails with a badarg error.
This prevents creation of new atoms directly, creation of new
@@ -33,6 +33,14 @@
> binary_to_term(<<131,100,0,5,"hello">>, [safe]).
hello
+ Warning:
+ The safe option ensures the data is safely processed by
+ the Erlang runtime but it does not guarantee the data is
+ safe to your application. You must always validate data
+ from untrusted sources. If the binary is stored or
+ transits through untrusted sources, you should also
+ consider cryptographically signing it.
+
used:
Changes the return value to {Term, Used} where Used is the
number of bytes actually read from Binary.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bitstring_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bitstring_0_type.txt
new file mode 100644
index 0000000000..71ffcc1f02
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bitstring_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type bitstring() :: <<_:_*1>>.
+
+ An Erlang bitstring.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bnot_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bnot_1_func.txt
new file mode 100644
index 0000000000..7fb3acadcc
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bnot_1_func.txt
@@ -0,0 +1,5 @@
+
+  'bnot'/1
+
+ The documentation for 'bnot'/1 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_boolean_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_boolean_0_type.txt
new file mode 100644
index 0000000000..1cda883d3b
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_boolean_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type boolean() :: true | false.
+
+ A boolean value.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bor_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bor_2_func.txt
new file mode 100644
index 0000000000..698de2bfe3
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bor_2_func.txt
@@ -0,0 +1,5 @@
+
+  'bor'/2
+
+ The documentation for 'bor'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsl_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsl_2_func.txt
new file mode 100644
index 0000000000..65b26f4c03
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsl_2_func.txt
@@ -0,0 +1,5 @@
+
+  'bsl'/2
+
+ The documentation for 'bsl'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsr_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsr_2_func.txt
new file mode 100644
index 0000000000..6b6849672f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bsr_2_func.txt
@@ -0,0 +1,5 @@
+
+  'bsr'/2
+
+ The documentation for 'bsr'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bxor_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bxor_2_func.txt
new file mode 100644
index 0000000000..76aa3fbe7e
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_bxor_2_func.txt
@@ -0,0 +1,5 @@
+
+  'bxor'/2
+
+ The documentation for 'bxor'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_byte_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_byte_0_type.txt
new file mode 100644
index 0000000000..6f6c6b4b28
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_byte_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type byte() :: 0..255.
+
+ A byte of data represented by an integer.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_call_on_load_function_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_call_on_load_function_1_func.txt
new file mode 100644
index 0000000000..abf49640cc
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_call_on_load_function_1_func.txt
@@ -0,0 +1,6 @@
+
+  call_on_load_function/1
+
+ The documentation for call_on_load_function/1 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_char_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_char_0_type.txt
new file mode 100644
index 0000000000..e0c2f2333f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_char_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type char() :: 0..1114111.
+
+ An ASCII character or a unicode codepoint presented by an
+ integer.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_delay_trap_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_delay_trap_2_func.txt
new file mode 100644
index 0000000000..6e1f78dcaa
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_delay_trap_2_func.txt
@@ -0,0 +1,6 @@
+
+  delay_trap/2
+
+ The documentation for delay_trap/2 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_nl_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_nl_0_func.txt
new file mode 100644
index 0000000000..4378ba670f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_nl_0_func.txt
@@ -0,0 +1,6 @@
+
+  display_nl/0
+
+ The documentation for display_nl/0 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_string_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_string_1_func.txt
new file mode 100644
index 0000000000..2d5267009a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_display_string_1_func.txt
@@ -0,0 +1,6 @@
+
+  display_string/1
+
+ The documentation for display_string/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_1_func.txt
index 93228fd6e0..182a8e0ef1 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_1_func.txt
@@ -28,7 +28,7 @@
This function is used when implementing an alternative
distribution carrier using processes as distribution controllers. 
- DHandle is retrived via the callback f_handshake_complete. More
- information can be found in the documentation of ERTS User's
+ DHandle is retrieved via the callback f_handshake_complete.
+ More information can be found in the documentation of ERTS User's
Guide ➜ How to implement an Alternative Carrier for the Erlang
Distribution ➜ Distribution Module.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_notification_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_notification_1_func.txt
index 5f2e5b7212..02197ca805 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_notification_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_data_notification_1_func.txt
@@ -21,7 +21,7 @@
This function is used when implementing an alternative
distribution carrier using processes as distribution controllers. 
- DHandle is retrived via the callback f_handshake_complete. More
- information can be found in the documentation of ERTS User's
+ DHandle is retrieved via the callback f_handshake_complete.
+ More information can be found in the documentation of ERTS User's
Guide ➜ How to implement an Alternative Carrier for the Erlang
Distribution ➜ Distribution Module.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_opt_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_opt_2_func.txt
index 1f7cf3782f..7e9050f105 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_opt_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_get_opt_2_func.txt
@@ -19,7 +19,7 @@
This function is used when implementing an alternative
distribution carrier using processes as distribution controllers. 
- DHandle is retrived via the callback f_handshake_complete. More
- information can be found in the documentation of ERTS User's
+ DHandle is retrieved via the callback f_handshake_complete.
+ More information can be found in the documentation of ERTS User's
Guide ➜ How to implement an Alternative Carrier for the Erlang
Distribution ➜ Distribution Module.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_input_handler_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_input_handler_2_func.txt
index 05201a2dc0..0e8202aa10 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_input_handler_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_input_handler_2_func.txt
@@ -11,7 +11,7 @@
channel identified by DHandle. Once this function has been
called, InputHandler is the only process allowed to call 
erlang:dist_ctrl_put_data(DHandle, Data) with the DHandle
- identifing this distribution channel.
+ identifying this distribution channel.
Note:
Only the process registered as distribution controller for the
@@ -20,7 +20,7 @@
This function is used when implementing an alternative
distribution carrier using processes as distribution controllers. 
- DHandle is retrived via the callback f_handshake_complete. More
- information can be found in the documentation of ERTS User's
+ DHandle is retrieved via the callback f_handshake_complete.
+ More information can be found in the documentation of ERTS User's
Guide ➜ How to implement an Alternative Carrier for the Erlang
Distribution ➜ Distribution Module.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_put_data_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_put_data_2_func.txt
index 65c6b53d10..1279f67fa3 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_put_data_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_put_data_2_func.txt
@@ -22,7 +22,7 @@
This function is used when implementing an alternative
distribution carrier using processes as distribution controllers. 
- DHandle is retrived via the callback f_handshake_complete. More
- information can be found in the documentation of ERTS User's
+ DHandle is retrieved via the callback f_handshake_complete.
+ More information can be found in the documentation of ERTS User's
Guide ➜ How to implement an Alternative Carrier for the Erlang
Distribution ➜ Distribution Module.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_set_opt_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_set_opt_3_func.txt
index 355a006814..70c5a44334 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_set_opt_3_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_ctrl_set_opt_3_func.txt
@@ -35,7 +35,7 @@
This function is used when implementing an alternative
distribution carrier using processes as distribution controllers. 
- DHandle is retrived via the callback f_handshake_complete. More
- information can be found in the documentation of ERTS User's
+ DHandle is retrieved via the callback f_handshake_complete.
+ More information can be found in the documentation of ERTS User's
Guide ➜ How to implement an Alternative Carrier for the Erlang
Distribution ➜ Distribution Module.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_get_stat_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_get_stat_1_func.txt
new file mode 100644
index 0000000000..141fe118ae
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_get_stat_1_func.txt
@@ -0,0 +1,6 @@
+
+  dist_get_stat/1
+
+ The documentation for dist_get_stat/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_handle_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_handle_0_type.txt
index 9bcad3af74..e2a5c64265 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_handle_0_type.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dist_handle_0_type.txt
@@ -1,4 +1,4 @@
-opaque dist_handle() 
- An opaque handle identifing a distribution channel.
+ An opaque handle identifying a distribution channel.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_div_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_div_2_func.txt
new file mode 100644
index 0000000000..1b349e7ecf
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_div_2_func.txt
@@ -0,0 +1,5 @@
+
+  'div'/2
+
+ The documentation for 'div'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dmonitor_node_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dmonitor_node_3_func.txt
new file mode 100644
index 0000000000..a8ae905063
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dmonitor_node_3_func.txt
@@ -0,0 +1,6 @@
+
+  dmonitor_node/3
+
+ The documentation for dmonitor_node/3 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_append_vm_tag_data_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_append_vm_tag_data_1_func.txt
new file mode 100644
index 0000000000..456b93faba
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_append_vm_tag_data_1_func.txt
@@ -0,0 +1,6 @@
+
+  dt_append_vm_tag_data/1
+
+ The documentation for dt_append_vm_tag_data/1 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_0_func.txt
new file mode 100644
index 0000000000..0b06a2134f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_0_func.txt
@@ -0,0 +1,6 @@
+
+  dt_get_tag/0
+
+ The documentation for dt_get_tag/0 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_data_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_data_0_func.txt
new file mode 100644
index 0000000000..b7f39991ef
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_get_tag_data_0_func.txt
@@ -0,0 +1,6 @@
+
+  dt_get_tag_data/0
+
+ The documentation for dt_get_tag_data/0 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_prepend_vm_tag_data_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_prepend_vm_tag_data_1_func.txt
new file mode 100644
index 0000000000..59c1834649
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_prepend_vm_tag_data_1_func.txt
@@ -0,0 +1,6 @@
+
+  dt_prepend_vm_tag_data/1
+
+ The documentation for dt_prepend_vm_tag_data/1 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_put_tag_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_put_tag_1_func.txt
new file mode 100644
index 0000000000..83906151a7
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_put_tag_1_func.txt
@@ -0,0 +1,6 @@
+
+  dt_put_tag/1
+
+ The documentation for dt_put_tag/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_restore_tag_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_restore_tag_1_func.txt
new file mode 100644
index 0000000000..bf52d2f5d2
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_restore_tag_1_func.txt
@@ -0,0 +1,6 @@
+
+  dt_restore_tag/1
+
+ The documentation for dt_restore_tag/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_spread_tag_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_spread_tag_1_func.txt
new file mode 100644
index 0000000000..6a8496bc58
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_dt_spread_tag_1_func.txt
@@ -0,0 +1,6 @@
+
+  dt_spread_tag/1
+
+ The documentation for dt_spread_tag/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqcoloneq_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqcoloneq_2_func.txt
new file mode 100644
index 0000000000..00c8120ad8
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqcoloneq_2_func.txt
@@ -0,0 +1,5 @@
+
+  '=:='/2
+
+ The documentation for '=:='/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqeq_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqeq_2_func.txt
new file mode 100644
index 0000000000..eab30981c2
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqeq_2_func.txt
@@ -0,0 +1,5 @@
+
+  '=='/2
+
+ The documentation for '=='/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqlt_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqlt_2_func.txt
new file mode 100644
index 0000000000..fce7453bc2
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqlt_2_func.txt
@@ -0,0 +1,5 @@
+
+  '=<'/2
+
+ The documentation for '=<'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqslasheq_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqslasheq_2_func.txt
new file mode 100644
index 0000000000..69dfca83fc
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_eqslasheq_2_func.txt
@@ -0,0 +1,5 @@
+
+  '=/='/2
+
+ The documentation for '=/='/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_1_func.txt
index 6324d2884e..18c0010a75 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_1_func.txt
@@ -1,15 +1,14 @@
-spec error(Reason) -> no_return() when Reason :: term().
- Raises an exception of class error with the reason Reason,
- where Reason is any term. The error reason is {Reason, Where},
- where Where is a list of the functions most recently called (the
- current function first). As evaluating this function causes an
- exception to be thrown, it has no return value. The intent of the
- exception class error is to signal that an unexpected error has
- happened (for example, a function is called with a parameter that
- has an incorrect type). See the guide about errors and error
- handling for additional information. Example:
+ Raises an exception of class error with the reason Reason. As
+ evaluating this function causes an exception to be thrown, it has
+ no return value.
+
+ The intent of the exception class error is to signal that an
+ unexpected error has happened (for example, a function is called
+ with a parameter that has an incorrect type). See the guide about
+ errors and error handling for additional information. Example:
> catch error(foobar).
{'EXIT',{foobar,[{shell,apply_fun,3,
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_2_func.txt
index 0b91e45030..9a87a345bb 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_2_func.txt
@@ -1,19 +1,19 @@
-spec error(Reason, Args) -> no_return()
-  when Reason :: term(), Args :: [term()].
+  when Reason :: term(), Args :: [term()] | none.
- Raises an exception of class error with the reason Reason,
- where Reason is any term. The error reason is {Reason, Where},
- where Where is a list of the functions most recently called (the
- current function first). Args is expected to be the list of
- arguments for the current function; it is used to provide the
- arguments for the current function in the term Where. As
- evaluating this function causes an exception to be raised, it has
- no return value. The intent of the exception class error is to
- signal that an unexpected error has happened (for example, a
- function is called with a parameter that has an incorrect type).
- See the guide about errors and error handling for additional
- information. Example:
+ Raises an exception of class error with the reason Reason. 
+ Args is expected to be the list of arguments for the current
+ function or the atom none. If it is a list, it is used to
+ provide the arguments for the current function in the stack
+ back-trace. If it is none, the arity of the calling function is
+ used in the stacktrace. As evaluating this function causes an
+ exception to be raised, it has no return value.
+
+ The intent of the exception class error is to signal that an
+ unexpected error has happened (for example, a function is called
+ with a parameter that has an incorrect type). See the guide about
+ errors and error handling for additional information. Example:
test.erl:
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_3_func.txt
index 0af05f72c5..73f183013f 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_3_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_error_3_func.txt
@@ -2,7 +2,7 @@
-spec error(Reason, Args, Options) -> no_return()
 when
 Reason :: term(),
-  Args :: [term()],
+  Args :: [term()] | none,
 Options :: [Option],
 Option :: {error_info, ErrorInfoMap},
 ErrorInfoMap ::
@@ -11,18 +11,27 @@
 function => atom()}.
Since:
- 24.0
+ OTP 24.0
- Raises an exception of class error with the reason Reason,
- where Reason is any term. Args is expected to be the list of
- arguments for the current function; it is used to provide the
- arguments for the current function in the stack back-trace. If the 
- {error_info, ErrorInfoMap} option is given, it will be injected
- into the stacktrace.
+ Raises an exception of class error with the reason Reason. 
+ Args is expected to be the list of arguments for the current
+ function or the atom none. If it is a list, it is used to
+ provide the arguments for the current function in the stack
+ back-trace. If it is none, the arity of the calling function is
+ used in the stacktrace. As evaluating this function causes an
+ exception to be raised, it has no return value.
- As evaluating this function causes an exception to be raised, it
- has no return value. The intent of the exception class error is
- to signal that an unexpected error has happened (for example, a
- function is called with a parameter that has an incorrect type).
- See the guide about errors and error handling for additional
- information.
+ If the error_info option is given, the ErrorInfoMap will be
+ inserted into the stacktrace. The information given in the 
+ ErrorInfoMap is to be used by error formatters such as erl_error
+ to provide more context around an error.
+
+ The default module of the ErrorInfoMap is the module that the
+ call to error/3 is made. The default function is format_error.
+ See format_error/2 for more details on how this
+ Module:Function/2 is to be used
+
+ The intent of the exception class error is to signal that an
+ unexpected error has happened (for example, a function is called
+ with a parameter that has an incorrect type). See the guide about
+ errors and error handling for additional information.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_1_func.txt
index f97e38039c..481fd9f793 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_1_func.txt
@@ -1,13 +1,17 @@
-spec exit(Reason) -> no_return() when Reason :: term().
- Raises an exception of class exit with exit reason Reason,
- where Reason is any term. As evaluating this function causes an
- exception to be raised, it has no return value. This function
- should be used when the intent is to stop the current process.
- This function differ from erlang:error/1 and erlang:error/2 by
- causing an exception of a different class and by having a reason
- that does not include the list of functions from the call stack.
+ Raises an exception of class exit with exit reason Reason. As
+ evaluating this function causes an exception to be raised, it has
+ no return value.
+
+ The intent of the exception class exit is that the current
+ process should be stopped (for example when a message telling a
+ process to stop is received).
+
+ This function differ from error/1,2,3 by causing an exception of
+ a different class and by having a reason that does not include the
+ list of functions from the call stack.
See the guide about errors and error handling for additional
information.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_signal_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_signal_2_func.txt
new file mode 100644
index 0000000000..e952dad6a8
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_exit_signal_2_func.txt
@@ -0,0 +1,6 @@
+
+  exit_signal/2
+
+ The documentation for exit_signal/2 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_after_on_load_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_after_on_load_2_func.txt
new file mode 100644
index 0000000000..63b677da23
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_after_on_load_2_func.txt
@@ -0,0 +1,6 @@
+
+  finish_after_on_load/2
+
+ The documentation for finish_after_on_load/2 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_loading_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_loading_1_func.txt
new file mode 100644
index 0000000000..c22cf49f7d
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_finish_loading_1_func.txt
@@ -0,0 +1,6 @@
+
+  finish_loading/1
+
+ The documentation for finish_loading/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_0_type.txt
new file mode 100644
index 0000000000..e1df49edf4
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type float() :: float().
+
+ An Erlang float.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_binary_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_binary_2_func.txt
index b7a690fee9..2f7a559f77 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_binary_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_binary_2_func.txt
@@ -6,7 +6,7 @@
 Option ::
 {decimals, Decimals :: 0..253} |
 {scientific, Decimals :: 0..249} |
-  compact.
+  compact | short.
Since:
OTP R16B
@@ -21,3 +21,9 @@
<<"7.12">>
> float_to_binary(7.12, [{scientific, 3}]).
<<"7.120e+00">>
+ > float_to_binary(7.12, [short]).
+ <<"7.12">>
+ > float_to_binary(0.1+0.2, [short]).
+ <<"0.30000000000000004">>
+ > float_to_binary(0.1+0.2)
+ <<"3.00000000000000044409e-01">>
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_list_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_list_2_func.txt
index bfe4abe53a..14dbc3763e 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_list_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_float_to_list_2_func.txt
@@ -6,7 +6,7 @@
 Option ::
 {decimals, Decimals :: 0..253} |
 {scientific, Decimals :: 0..249} |
-  compact.
+  compact | short.
Since:
OTP R16B
@@ -29,6 +29,16 @@
using scientific notation with Decimals digits of
precision.
+ • If option short is specified, the float is formatted with
+ the smallest number of digits that still guarantees that F
+ =:= list_to_float(float_to_list(F, [short])). When the
+ float is inside the range (-2âµÂ³, 2âµÂ³), the notation that
+ yields the smallest number of characters is used (scientific
+ notation or normal decimal notation). Floats outside the
+ range (-2âµÂ³, 2âµÂ³) are always formatted using scientific
+ notation to avoid confusing results when doing arithmetic
+ operations.
+
• If Options is [], the function behaves as 
float_to_list/1.
@@ -40,6 +50,10 @@
"7.12"
> float_to_list(7.12, [{scientific, 3}]).
"7.120e+00"
+ > float_to_list(7.12, [short]).
+ "7.12"
+ > float_to_list(0.1+0.2, [short]).
+ "0.30000000000000004"
> float_to_list(0.1+0.2)
"3.00000000000000044409e-01"
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_format_cpu_topology_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_format_cpu_topology_1_func.txt
new file mode 100644
index 0000000000..7ef9f0481c
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_format_cpu_topology_1_func.txt
@@ -0,0 +1,6 @@
+
+  format_cpu_topology/1
+
+ The documentation for format_cpu_topology/1 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_info_mfa_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_info_mfa_1_func.txt
new file mode 100644
index 0000000000..26bd5c979a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_info_mfa_1_func.txt
@@ -0,0 +1,6 @@
+
+  fun_info_mfa/1
+
+ The documentation for fun_info_mfa/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_to_list_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_to_list_1_func.txt
index 259eafe909..ecd103b496 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_to_list_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_fun_to_list_1_func.txt
@@ -59,7 +59,7 @@
{#Fun<test.2.107738983>,#Fun<test.3.107738983>}
Explanation: The string representations differ because the funs
- come from different fun experssions.
+ come from different fun expressions.
> {fun() -> 1 end, fun() -> 1 end}. >
{#Fun<erl_eval.45.97283095>,#Fun<erl_eval.45.97283095>}
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_0_type.txt
new file mode 100644
index 0000000000..0c3d189c7d
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type function() :: fun().
+
+ An Erlang fun.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_exported_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_exported_3_func.txt
index 4ea9703aa4..0b7f45f6fb 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_exported_3_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_function_exported_3_func.txt
@@ -5,11 +5,7 @@
 Function :: atom(),
 Arity :: arity().
- Returns true if the module Module is loaded and contains an
+ Returns true if the module Module is current and contains an
exported function Function/Arity, or if there is a BIF (a
built-in function implemented in C) with the specified name,
otherwise returns false.
-
- Note:
- This function used to return false for BIFs before
- Erlang/OTP 18.0.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_garbage_collect_message_area_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_garbage_collect_message_area_0_func.txt
new file mode 100644
index 0000000000..4ffd915f60
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_garbage_collect_message_area_0_func.txt
@@ -0,0 +1,6 @@
+
+  garbage_collect_message_area/0
+
+ The documentation for garbage_collect_message_area/0 is hidden.
+ This probably means that it is internal and not to be used by
+ other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gather_gc_info_result_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gather_gc_info_result_1_func.txt
new file mode 100644
index 0000000000..594193be73
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gather_gc_info_result_1_func.txt
@@ -0,0 +1,6 @@
+
+  gather_gc_info_result/1
+
+ The documentation for gather_gc_info_result/1 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_cookie_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_cookie_1_func.txt
new file mode 100644
index 0000000000..7e85ffdbc6
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_cookie_1_func.txt
@@ -0,0 +1,9 @@
+
+ -spec erlang:get_cookie(Node) -> Cookie | nocookie
+  when Node :: node(), Cookie :: atom().
+
+Since:
+ OTP 24.1
+
+ Returns the magic cookie for node Node if the local node is
+ alive, otherwise the atom nocookie.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_1_func.txt
new file mode 100644
index 0000000000..15653bba3e
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_1_func.txt
@@ -0,0 +1,6 @@
+
+  get_module_info/1
+
+ The documentation for get_module_info/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_2_func.txt
new file mode 100644
index 0000000000..831a63cadb
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_get_module_info_2_func.txt
@@ -0,0 +1,6 @@
+
+  get_module_info/2
+
+ The documentation for get_module_info/2 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_group_leader_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_group_leader_2_func.txt
index 592d6bd6e5..e5268acd80 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_group_leader_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_group_leader_2_func.txt
@@ -10,5 +10,9 @@
supervision tree, because OTP assumes the group leader of their
processes is their application master.
+ Setting the group leader follows the signal ordering guarantees
+ described in the Processes Chapter in the Erlang Reference
+ Manual.
+
See also group_leader/0 and OTP design principles related to
starting and stopping applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gt_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gt_2_func.txt
new file mode 100644
index 0000000000..013f679ceb
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gt_2_func.txt
@@ -0,0 +1,5 @@
+
+  '>'/2
+
+ The documentation for '>'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gteq_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gteq_2_func.txt
new file mode 100644
index 0000000000..16f4e2b4e5
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_gteq_2_func.txt
@@ -0,0 +1,5 @@
+
+  '>='/2
+
+ The documentation for '>='/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_has_prepared_code_on_load_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_has_prepared_code_on_load_1_func.txt
new file mode 100644
index 0000000000..c012053e6d
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_has_prepared_code_on_load_1_func.txt
@@ -0,0 +1,6 @@
+
+  has_prepared_code_on_load/1
+
+ The documentation for has_prepared_code_on_load/1 is hidden.
+ This probably means that it is internal and not to be used by
+ other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt
index bc61de77bd..92b9b0302b 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_hibernate_3_func.txt
@@ -13,7 +13,8 @@
resumes in Module:Function with the arguments specified by Args
with the call stack emptied, meaning that the process terminates
when that function returns. Thus erlang:hibernate/3 never
- returns to its caller.
+ returns to its caller. The resume function Module:Function/Arity
+ must be exported (Arity =:= length(Args)).
If the process has any message in its message queue, the process
is awakened immediately in the same way as described earlier.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_identifier_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_identifier_0_type.txt
new file mode 100644
index 0000000000..f7f5ac6876
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_identifier_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type identifier() :: pid() | port() | reference().
+
+ An unique identifier for some entity, for example a process,
+ port or monitor.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_integer_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_integer_0_type.txt
new file mode 100644
index 0000000000..2b9b3bab4a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_integer_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type integer() :: integer().
+
+ An Erlang integer.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iodata_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iodata_0_type.txt
new file mode 100644
index 0000000000..ba46c3331d
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iodata_0_type.txt
@@ -0,0 +1,11 @@
+
+ -type iodata() :: iolist() | binary().
+
+ A binary or list containing bytes and/or iodata. This datatype is
+ used to represent data that is meant to be output using any I/O
+ module. For example: file:write/2 or gen_tcp:send/2.
+
+ To convert an iodata() term to binary() you can use
+ iolist_to_binary/2. To transcode a string() or
+ unicode:chardata() to iodata() you can use
+ unicode:characters_to_binary/1.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_0_type.txt
new file mode 100644
index 0000000000..aa17b96ab8
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_0_type.txt
@@ -0,0 +1,10 @@
+
+ -type iolist() ::
+  maybe_improper_list(byte() | binary() | iolist(),
+  binary() | []).
+
+ A list containing bytes and/or iodata. This datatype is used to
+ represent data that is meant to be output using any I/O module.
+ For example: file:write/2 or gen_tcp:send/2.
+
+ In most use cases you want to use iodata() instead of this type.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_to_iovec_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_to_iovec_1_func.txt
index e362ef610a..83cb5ad81c 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_to_iovec_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_iolist_to_iovec_1_func.txt
@@ -8,4 +8,27 @@
OTP 20.1
Returns an iovec that is made from the integers and binaries in 
- IoListOrBinary.
+ IoListOrBinary. This function is useful when you want to flatten
+ an iolist but you do not need a single binary. This can be useful
+ for passing the data to nif functions such as enif_inspect_iovec
+ or do more efficient message passing. The advantage of using this
+ function over iolist_to_binary/1 is that it does not have to
+ copy off-heap binaries. Example:
+
+ > Bin1 = <<1,2,3>>.
+ <<1,2,3>>
+ > Bin2 = <<4,5>>.
+ <<4,5>>
+ > Bin3 = <<6>>.
+ <<6>>
+ %% If you pass small binaries and integers it works as iolist_to_binary
+ > erlang:iolist_to_iovec([Bin1,1,[2,3,Bin2],4|Bin3]).
+ [<<1,2,3,1,2,3,4,5,4,6>>]
+ %% If you pass larger binaries, they are split and returned in a form
+ %% optimized for calling the C function writev.
+ > erlang:iolist_to_iovec([<<1>>,<<2:8096>>,<<3:8096>>]).
+ [<<1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,...>>,
+ <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ ...>>,
+ <<0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,...>>]
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_is_process_alive_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_is_process_alive_1_func.txt
index 919d6b4f68..e8a9970a4d 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_is_process_alive_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_is_process_alive_1_func.txt
@@ -19,6 +19,5 @@
is_process_alive(P2Pid),
% P2 is not alive (the call above always return false)
- See the documentation about communication in Erlang and
- erlang:exit/2 for more information about signals and exit
- singnals.
+ See the documentation about signals and erlang:exit/2 for more
+ information about signals and exit signals.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_link_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_link_1_func.txt
index 6286448237..407d8c7fa7 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_link_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_link_1_func.txt
@@ -1,25 +1,51 @@
-spec link(PidOrPort) -> true when PidOrPort :: pid() | port().
- Creates a link between the calling process and another process (or
- port) PidOrPort. If the link already exists or a process
- attempts to create a link to itself, nothing is done. Returns 
- true if the link is set up.
+ Sets up and activates a link between the calling process and
+ another process or a port identified by PidOrPort. We will from
+ here on call the identified process or port linkee. If the linkee
+ is a port, it must reside on the same node as the caller.
- If PidOrPort does not exist and checking it is cheap, a noproc
- error is raised. Currently, checking is cheap if the PidOrPort
- is local and the caller does not trap exits (see process_flag/2 
- ).
+ If one of the participants of a link terminates, it will send an
+ exit signal to the other participant. The exit signal will
+ contain the exit reason of the terminated participant. Other
+ cases when exit signals are triggered due to a link are when no
+ linkee exist (noproc exit reason) and when the connection
+ between linked processes on different nodes is lost or cannot be
+ established (noconnection exit reason).
- Apart from any exit signals from the linked process itself, two
- special exit signals may be sent to the calling process:
+ An existing link can be removed by calling unlink/1. For more
+ information on links and exit signals due to links, see the
+ Processes chapter in the Erlang Reference Manual:
- • noproc is sent immediately if PidOrPort does not exist at
- the time of linking (if the caller is trapping exits or 
- PidOrPort is remote).
+ • Links
- • noconnection if PidOrPort is remote and a connection
- between the nodes could not be established or was severed.
+ • Sending Exit Signals
- See Processes ➜ Links in the Erlang Reference Manual for more
- details.
+ • Receiving Exit Signals
+
+ For historical reasons, link/1 has a strange semi-synchronous
+ behavior when it is "cheap" to check if the linkee exists or not,
+ and the caller does not trap exits. If the above is true and the
+ linkee does not exist, link/1 will raise a noproc error
+ exception. The expected behavior would instead have been that 
+ link/1 returned true, and the caller later was sent an exit
+ signal with noproc exit reason, but this is unfortunately not
+ the case. The noproc exception is not to be confused with an
+ exit signal with exit reason noproc. Currently it is "cheap" to
+ check if the linkee exists when it is supposed to reside on the
+ same node as the calling process.
+
+ The link setup and activation is performed asynchronously. If the
+ link already exists, or if the caller attempts to create a link to
+ itself, nothing is done. A detailed description of the link
+ protocol can be found in the Distribution Protocol chapter of
+ the ERTS User's Guide.
+
+ Failure:
+
+ • badarg if PidOrPort does not identify a process or a node
+ local port.
+
+ • noproc linkee does not exist and it is "cheap" to check if
+ it exists as described above.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_0_type.txt
new file mode 100644
index 0000000000..dccc26b30f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type list() :: list().
+
+ An Erlang list containing terms of any type.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_1_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_1_type.txt
new file mode 100644
index 0000000000..3fdedd543b
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_1_type.txt
@@ -0,0 +1,4 @@
+
+ -type list(ContentType) :: [ContentType].
+
+ An Erlang list containing terms of the type ContentType.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_atom_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_atom_1_func.txt
index 30a6bb2b2a..c77d5233d4 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_atom_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_atom_1_func.txt
@@ -5,10 +5,7 @@
As from Erlang/OTP 20, String may contain any Unicode character.
Earlier versions allowed only ISO-latin-1 characters as the
- implementation did not allow Unicode characters above 255. For
- more information on Unicode support in atoms, see note on UTF-8
- encoded atoms in section "External Term Format" in the User's
- Guide.
+ implementation did not allow Unicode characters above 255.
Note:
The number of characters that are permitted in an atom name is
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_existing_atom_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_existing_atom_1_func.txt
index d89f63af15..315d160be9 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_existing_atom_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_list_to_existing_atom_1_func.txt
@@ -2,7 +2,9 @@
-spec list_to_existing_atom(String) -> atom() when String :: string().
Returns the atom whose text representation is String, but only
- if there already exists such atom.
+ if there already exists such atom. An atom exists if it has been
+ created by the run-time system by either loading code or creating
+ a term in which the atom is part.
Failure: badarg if there does not already exist an atom whose
text representation is String.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_load_module_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_load_module_2_func.txt
index 6b3d2b5a1f..b9368aba59 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_load_module_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_load_module_2_func.txt
@@ -23,6 +23,12 @@
Binary contains a module that cannot be loaded because old
code for this module already exists.
+ on_load:
+ The code in Binary contains an on_load declaration that
+ must be executed before Binary can become the current code.
+ Any previous current code for Module will remain until the 
+ on_load call has finished.
+
Warning:
This BIF is intended for the code server (see code(3)) and
is not to be used elsewhere.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_lt_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_lt_2_func.txt
new file mode 100644
index 0000000000..64323d56c2
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_lt_2_func.txt
@@ -0,0 +1,5 @@
+
+  '<'/2
+
+ The documentation for '<'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_fun_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_fun_3_func.txt
new file mode 100644
index 0000000000..b88f7a06ac
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_fun_3_func.txt
@@ -0,0 +1,5 @@
+
+  make_fun/3
+
+ The documentation for make_fun/3 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_ref_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_ref_0_func.txt
index b282e3b375..64f347e9c3 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_ref_0_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_make_ref_0_func.txt
@@ -5,7 +5,7 @@
connected nodes.
Warning:
- Known issue: When a node is restarted multiple times with the
+ Before OTP-23 when a node is restarted multiple times with the
same node name, references created on a newer node can be
mistaken for a reference created on an older node with the
same node name.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_map_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_map_0_type.txt
new file mode 100644
index 0000000000..33cd36bd08
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_map_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type map() :: #{any() => any()}.
+
+ An Erlang map containing any number of key and value
+ associations.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_0_type.txt
new file mode 100644
index 0000000000..f432632fd9
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type maybe_improper_list() :: maybe_improper_list(any(), any()).
+
+ An Erlang list that is not guaranteed to end with a [], and
+ where the list elements can be of any type.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_2_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_2_type.txt
new file mode 100644
index 0000000000..b7aaf7bc2c
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_maybe_improper_list_2_type.txt
@@ -0,0 +1,6 @@
+
+ -type maybe_improper_list(ContentType, TerminationType) ::
+  maybe_improper_list(ContentType, TerminationType).
+
+ An Erlang list, that is not guaranteed to end with a [], and
+ where the list elements are of the type ContentType.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_memory_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_memory_0_func.txt
index e440dfd550..d87777c8de 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_memory_0_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_memory_0_func.txt
@@ -59,13 +59,6 @@
This memory is part of the memory presented as system
memory.
- low:
- Only on 64-bit halfword emulator. The total amount of memory
- allocated in low memory areas that are restricted to < 4 GB,
- although the system can have more memory.
-
- Can be removed in a future release of the halfword emulator.
-
maximum:
The maximum total amount of memory allocated since the
emulator was started. This tuple is only present when the
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_message_queue_data_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_message_queue_data_0_type.txt
index c4789ef677..5799c41b4d 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_message_queue_data_0_type.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_message_queue_data_0_type.txt
@@ -5,5 +5,5 @@
-type message_queue_data() :: off_heap | on_heap.
- Process message queue data configuration. For more info see 
- process_flag(message_queue_data, MQD)
+ Process message queue data configuration. For more information,
+ see process_flag(message_queue_data, MQD)
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_mfa_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_mfa_0_type.txt
new file mode 100644
index 0000000000..acc57bebf0
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_mfa_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type mfa() :: {module(), atom(), arity()}.
+
+ A three-tuple representing a Module:Function/Arity function
+ signature.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_module_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_module_0_type.txt
new file mode 100644
index 0000000000..f7274e1ffc
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_module_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type module() :: atom().
+
+ An Erlang module represented by an atom.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt
index c88c266702..f569717945 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_2_func.txt
@@ -54,8 +54,8 @@
Object:
The monitored entity, which triggered the event. When
- monitoring a local process or port, Object will be equal to
- the pid() or port() that was being monitored. When
+ monitoring a process or a local port, Object will be equal
+ to the pid() or port() that was being monitored. When
monitoring process or port by name, Object will have format 
{RegisteredName, Node} where RegisteredName is the name
which has been used with monitor/2 call and Node is local
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_3_func.txt
index 35cab15b0d..d2568b9d01 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_3_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_3_func.txt
@@ -10,7 +10,7 @@
 when MonitorRef :: reference().
Since:
- OTP @OTP-16718@
+ OTP 24.0
Types:
-type monitor_port_identifier() :: port() | registered_name().
@@ -59,8 +59,86 @@
removed using the unalias/1 BIF, the monitor will still
be left active.
+ Example:
+
+ server() ->
+ receive
+ {request, AliasReqId, Request} ->
+ Result = perform_request(Request),
+ AliasReqId ! {reply, AliasReqId, Result}
+ end,
+ server().
+
+ client(ServerPid, Request) ->
+ AliasMonReqId = monitor(process, ServerPid, [{alias, reply_demonitor}]),
+ ServerPid ! {request, AliasMonReqId, Request},
+ %% Alias as well as monitor will be automatically deactivated if we
+ %% receive a reply or a 'DOWN' message since we used 'reply_demonitor'
+ %% as unalias option...
+ receive
+ {reply, AliasMonReqId, Result} ->
+ Result;
+ {'DOWN', AliasMonReqId, process, ServerPid, ExitReason} ->
+ error(ExitReason)
+ end.
+
+
+ Note that both the server and the client in this example must
+ be executing on at least OTP 24 systems in order for this to
+ work.
+
+ For more information on process aliases see the Process
+ Aliases section of the Erlang Reference Manual.
+
{tag, UserDefinedTag}:
Replace the default Tag with UserDefinedTag in the
monitor message delivered when the monitor is triggered. For
example, when monitoring a process, the 'DOWN' tag in the
down message will be replaced by UserDefinedTag.
+
+ An example of how the {tag, UserDefinedTag} option can be
+ used in order to enable the new selective receive
+ optimization, introduced in OTP 24, when making multiple
+ requests to different servers:
+
+ server() ->
+ receive
+ {request, From, ReqId, Request} ->
+ Result = perform_request(Request),
+ From ! {reply, self(), ReqId, Result}
+ end,
+ server().
+
+ client(ServerPids, Request) when is_list(ServerPids) ->
+ ReqId = make_ref(),
+ lists:foreach(fun (ServerPid) ->
+ _ = monitor(process, ServerPid,
+ [{tag, {'DOWN', ReqId}}]),
+ ServerPid ! {request, self(), ReqId, Request}
+ end,
+ ServerPids),
+ receive_replies(ReqId, length(ServerPids), []).
+
+ receive_replies(_ReqId, 0, Acc) ->
+ Acc;
+ receive_replies(ReqId, N, Acc) ->
+ %% The compiler will detect that we match on the 'ReqId'
+ %% reference in all clauses, and will enable the selective
+ %% receive optimization which makes the receive able to
+ %% skip past all messages present in the message queue at
+ %% the time when the 'ReqId' reference was created...
+ Res = receive
+ {reply, ServerPid, ReqId, Result} ->
+ %% Here we typically would have deactivated the
+ %% monitor by a call to demonitor(Mon, [flush]) but
+ %% we ignore this in this example for simplicity...
+ {ok, ServerPid, Result};
+ {{'DOWN', ReqId}, _Mon, process, ServerPid, ExitReason} ->
+ {error, ServerPid, ExitReason}
+ end,
+ receive_replies(ReqId, N-1, [Res | Acc]).
+
+
+ In order for this example to work as intended, the client must
+ be executing on at least an OTP 24 system, but the servers may
+ execute on older systems.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_node_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_node_2_func.txt
index c137ca38fd..89561c41ad 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_node_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_monitor_node_2_func.txt
@@ -17,6 +17,12 @@
to Node, an attempt is made to create one. If this fails, a 
nodedown message is delivered.
+ The delivery of the nodedown signal is not ordered with respect
+ to other link or monitor signals from the node that goes down. If
+ you need a guarantee that all signals from the remote node has
+ been delivered before the nodedown signal is sent, you should
+ use net_kernel:monitor_nodes/1.
+
Nodes connected through hidden connections can be monitored as any
other nodes.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_neg_integer_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_neg_integer_0_type.txt
new file mode 100644
index 0000000000..bce7a55517
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_neg_integer_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type neg_integer() :: neg_integer().
+
+ A negative integer.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nif_resource_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nif_resource_0_type.txt
index 7cc1f2598b..6c2cf4ced7 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nif_resource_0_type.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nif_resource_0_type.txt
@@ -1,4 +1,4 @@
-opaque nif_resource() 
- An opaque handle identifing a NIF resource object .
+ An opaque handle identifying a NIF resource object .
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nil_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nil_0_type.txt
new file mode 100644
index 0000000000..3f20bcd23d
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nil_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type nil() :: [].
+
+ The empty list().
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_no_return_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_no_return_0_type.txt
new file mode 100644
index 0000000000..660047e345
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_no_return_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type no_return() :: none().
+
+ The type used to show that a function will never return a value,
+ that is it will always throw an exception.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_node_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_node_0_type.txt
new file mode 100644
index 0000000000..b6d6364aca
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_node_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type node() :: atom().
+
+ An Erlang node represented by an atom.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_non_neg_integer_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_non_neg_integer_0_type.txt
new file mode 100644
index 0000000000..f07d7a4ee5
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_non_neg_integer_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type non_neg_integer() :: non_neg_integer().
+
+ A non-negative integer, that is any positive integer or 0.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_none_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_none_0_type.txt
new file mode 100644
index 0000000000..bcefabd355
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_none_0_type.txt
@@ -0,0 +1,6 @@
+
+ -type none() :: none().
+
+ This type is used to show that a function will never return a
+ value; that is it will always throw an exception. In a spec, use 
+ no_return() for the sake of clarity.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_binary_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_binary_0_type.txt
new file mode 100644
index 0000000000..9df59ae11a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_binary_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type nonempty_binary() :: <<_:8, _:_*8>>.
+
+ A binary() that contains some data.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_bitstring_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_bitstring_0_type.txt
new file mode 100644
index 0000000000..e25e9fda6b
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_bitstring_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type nonempty_bitstring() :: <<_:1, _:_*1>>.
+
+ A bitstring() that contains some data.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_improper_list_2_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_improper_list_2_type.txt
new file mode 100644
index 0000000000..6c6cef0861
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_improper_list_2_type.txt
@@ -0,0 +1,5 @@
+
+ -type nonempty_improper_list(ContentType, TerminationType) ::
+  nonempty_improper_list(ContentType, TerminationType).
+
+ A maybe_improper_list/2 that contains some items.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_0_type.txt
new file mode 100644
index 0000000000..266d82dc9b
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type nonempty_list() :: [any(), ...].
+
+ A list() that contains some items.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_1_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_1_type.txt
new file mode 100644
index 0000000000..4184648089
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_list_1_type.txt
@@ -0,0 +1,4 @@
+
+ -type nonempty_list(ContentType) :: [ContentType, ...].
+
+ A list(ContentType) that contains some items.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_0_type.txt
new file mode 100644
index 0000000000..ea43e2683a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type nonempty_maybe_improper_list() ::
+  nonempty_maybe_improper_list(any(), any()).
+
+ A maybe_improper_list() that contains some items.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_2_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_2_type.txt
new file mode 100644
index 0000000000..49d5acbb14
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_maybe_improper_list_2_type.txt
@@ -0,0 +1,6 @@
+
+ -type nonempty_maybe_improper_list(ContentType, TerminationType) ::
+  nonempty_maybe_improper_list(ContentType, TerminationType).
+
+ A maybe_improper_list(ContentType, TerminationType) that
+ contains some items.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_string_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_string_0_type.txt
new file mode 100644
index 0000000000..05e01446b3
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_nonempty_string_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type nonempty_string() :: [char(), ...].
+
+ A string() that contains some characters.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_not_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_not_1_func.txt
new file mode 100644
index 0000000000..bc2eb81305
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_not_1_func.txt
@@ -0,0 +1,5 @@
+
+  'not'/1
+
+ The documentation for 'not'/1 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_number_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_number_0_type.txt
new file mode 100644
index 0000000000..ead7a9e2dd
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_number_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type number() :: integer() | float().
+
+ An Erlang number.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_open_port_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_open_port_2_func.txt
index 06de905786..1c8a625bb5 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_open_port_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_open_port_2_func.txt
@@ -36,7 +36,7 @@
Returns a port identifier as the result of opening a new Erlang
port. A port can be seen as an external Erlang process.
- The name of the executable as well as the arguments specifed in 
+ The name of the executable as well as the arguments specified in 
cd, env, args, and arg0 are subject to Unicode filename
translation if the system is running in Unicode filename mode. To
avoid translation or to force, for example UTF-8, supply the
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_or_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_or_2_func.txt
new file mode 100644
index 0000000000..5d8fcc2497
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_or_2_func.txt
@@ -0,0 +1,5 @@
+
+  'or'/2
+
+ The documentation for 'or'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pid_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pid_0_type.txt
new file mode 100644
index 0000000000..0a2d75b259
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pid_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type pid() :: pid().
+
+ An Erlang process identifier.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_0_type.txt
new file mode 100644
index 0000000000..5484e96380
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type port() :: port().
+
+ An Erlang port identifier.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_call_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_call_2_func.txt
new file mode 100644
index 0000000000..bb00bda40f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_call_2_func.txt
@@ -0,0 +1,5 @@
+
+  port_call/2
+
+ The documentation for port_call/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_get_data_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_get_data_1_func.txt
new file mode 100644
index 0000000000..090db5838b
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_get_data_1_func.txt
@@ -0,0 +1,6 @@
+
+  port_get_data/1
+
+ The documentation for port_get_data/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_set_data_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_set_data_2_func.txt
new file mode 100644
index 0000000000..d27a36b7e8
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_port_set_data_2_func.txt
@@ -0,0 +1,6 @@
+
+  port_set_data/2
+
+ The documentation for port_set_data/2 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pos_integer_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pos_integer_0_type.txt
new file mode 100644
index 0000000000..a8cfd39cc8
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pos_integer_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type pos_integer() :: pos_integer().
+
+ An integer greater than zero.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_posixtime_to_universaltime_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_posixtime_to_universaltime_1_func.txt
new file mode 100644
index 0000000000..6f39b81c43
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_posixtime_to_universaltime_1_func.txt
@@ -0,0 +1,6 @@
+
+  posixtime_to_universaltime/1
+
+ The documentation for posixtime_to_universaltime/1 is hidden.
+ This probably means that it is internal and not to be used by
+ other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pre_loaded_0_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pre_loaded_0_func.txt
index 795a78ef0e..efaf2aaba9 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pre_loaded_0_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_pre_loaded_0_func.txt
@@ -1,7 +1,7 @@
-spec pre_loaded() -> [module()].
- Returns a list of Erlang modules that are preloaded in the system.
- As all loading of code is done through the file system, the file
- system must have been loaded previously. Hence, at least the
- module init must be preloaded.
+ Returns a list of Erlang modules that are preloaded in the
+ run-time system. Pre-loaded modules are Erlang modules that are
+ needed to bootstrap the system to load the first Erlang modules
+ from either disk or by using erl_boot_server.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_prepare_loading_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_prepare_loading_2_func.txt
new file mode 100644
index 0000000000..4b551a5b91
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_prepare_loading_2_func.txt
@@ -0,0 +1,6 @@
+
+  prepare_loading/2
+
+ The documentation for prepare_loading/2 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt
index dac53ad065..8c7b6640dd 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_flag_2_func.txt
@@ -2,6 +2,14 @@
-spec process_flag(save_calls, N) -> OldN
 when N :: 0..10000, OldN :: 0..10000.
+ -spec process_flag(fullsweep_after, FullsweepAfter) -> OldFullsweepAfter
+  when
+  FullsweepAfter :: non_neg_integer(),
+  OldFullsweepAfter :: non_neg_integer().
+
+Since:
+ OTP 24.0
+
-spec process_flag(min_bin_vheap_size, MinBinVHeapSize) ->
 OldMinBinVHeapSize
 when
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_info_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_info_2_func.txt
index 8a5af38f1c..7df3d29d68 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_info_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_process_info_2_func.txt
@@ -117,6 +117,10 @@
Items in the same order as the Items were included in ItemList.
Valid Items can be included multiple times in ItemList.
+ Getting process information follows the signal ordering guarantees
+ described in the Processes Chapter in the Erlang Reference
+ Manual.
+
Note:
If registered_name is part of ItemList and the process has
no name registered, a {registered_name, []}, InfoTuple
@@ -138,8 +142,8 @@
implementation BinInfo is a list of tuples. The tuples
contain; BinaryId, BinarySize, BinaryRefcCount.
- The message queue is on the heap depending on the process flag 
- message_queue_data.
+ Depending on the value of the message_queue_data process
+ flag the message queue may be stored on the heap.
{catchlevel, CatchLevel}:
CatchLevel is the number of currently active catches in this
@@ -251,10 +255,10 @@
the local node name.
{message_queue_data, MQD}:
- Returns the current state of process flag message_queue_data. 
- MQD is either off_heap or on_heap. For more information,
- see the documentation of process_flag(message_queue_data,
- MQD).
+ MQD is the current value of the message_queue_data process
+ flag, which can be either off_heap or on_heap. For more
+ information, see the documentation of 
+ process_flag(message_queue_data, MQD).
{priority, Level}:
Level is the current priority level for the process. For more
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_raise_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_raise_3_func.txt
index 407a06aab4..e661585ba6 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_raise_3_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_raise_3_func.txt
@@ -3,14 +3,13 @@
 when
 Class :: error | exit | throw,
 Reason :: term(),
-  Stacktrace :: raise_stacktrace().
+  Stacktrace ::
+  raise_stacktrace() | stacktrace().
Types:
-type raise_stacktrace() ::
[{module(), atom(), arity() | [term()]} |
- {function(), [term()]}] |
- [{module(), atom(), arity() | [term()], [{atom(), term()}]} |
- {function(), [term()], [{atom(), term()}]}].
+ {function(), arity() | [term()]}].
Raises an exception of the specified class, reason, and call stack
backtrace (stacktrace).
@@ -31,12 +30,12 @@
end
That is, a list of four-tuples {Module, Function, Arity | Args,
- Location}, where Module and Function are atoms, and the third
- element is an integer arity or an argument list. The stacktrace
- can also contain {Fun, Args, Location} tuples, where Fun is a
- local fun and Args is an argument list.
+ ExtraInfo}, where Module and Function are atoms, and the
+ third element is an integer arity or an argument list. The
+ stacktrace can also contain {Fun, Args, ExtraInfo} tuples, where 
+ Fun is a local fun and Args is an argument list.
- Element Location at the end is optional. Omitting it is
+ Element ExtraInfo at the end is optional. Omitting it is
equivalent to specifying an empty list.
The stacktrace is used as the exception stacktrace for the calling
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_reference_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_reference_0_type.txt
new file mode 100644
index 0000000000..e2ded8970e
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_reference_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type reference() :: reference().
+
+ An Erlang reference.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_register_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_register_2_func.txt
index aa1ea7ef8d..b4b5c8a543 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_register_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_register_2_func.txt
@@ -2,14 +2,19 @@
-spec register(RegName, PidOrPort) -> true
 when RegName :: atom(), PidOrPort :: port() | pid().
- Associates the name RegName with a process identifier (pid) or a
- port identifier. RegName, which must be an atom, can be used
- instead of the pid or port identifier in send operator (RegName !
- Message). Example:
+ Registers the name RegName with a process identifier (pid) or a
+ port identifier in the name registry. RegName, which must be
+ an atom, can be used instead of the pid or port identifier in send
+ operator (RegName ! Message) and most other BIFs that take a pid
+ or port identifies as an argument. Example:
> register(db, Pid).
true
+ The registered name is considered a Directly Visible Erlang
+ Resource and is automatically unregistered when the process
+ terminates.
+
Failures:
badarg:
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_rem_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_rem_2_func.txt
new file mode 100644
index 0000000000..d1f2d8eb5e
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_rem_2_func.txt
@@ -0,0 +1,5 @@
+
+  'rem'/2
+
+ The documentation for 'rem'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_send_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_send_2_func.txt
index 67721a962c..08871de4ea 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_send_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_send_2_func.txt
@@ -12,9 +12,9 @@
Sends a message and returns Msg. This is the same as using the
send operator: Dest ! Msg.
- Dest can be a remote or local process identifier, a (local) port,
- a locally registered name, or a tuple {RegName, Node} for a
- registered name at another node.
+ Dest can be a remote or local process identifier, an alias, a
+ (local) port, a locally registered name, or a tuple {RegName,
+ Node} for a registered name at another node.
The function fails with a badarg run-time error if Dest is an
atom name, but this name is not registered. This is the only case
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_2_func.txt
new file mode 100644
index 0000000000..eac7f6352c
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_2_func.txt
@@ -0,0 +1,5 @@
+
+  seq_trace/2
+
+ The documentation for seq_trace/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_info_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_info_1_func.txt
new file mode 100644
index 0000000000..6dc372826e
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_info_1_func.txt
@@ -0,0 +1,6 @@
+
+  seq_trace_info/1
+
+ The documentation for seq_trace_info/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_1_func.txt
new file mode 100644
index 0000000000..d0ae337121
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_1_func.txt
@@ -0,0 +1,6 @@
+
+  seq_trace_print/1
+
+ The documentation for seq_trace_print/1 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_2_func.txt
new file mode 100644
index 0000000000..54905aa1a9
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_seq_trace_print_2_func.txt
@@ -0,0 +1,6 @@
+
+  seq_trace_print/2
+
+ The documentation for seq_trace_print/2 is hidden. This probably
+ means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_1_func.txt
new file mode 100644
index 0000000000..d775c2ca6f
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_1_func.txt
@@ -0,0 +1,12 @@
+
+ -spec erlang:set_cookie(Cookie) -> true when Cookie :: atom().
+
+Since:
+ OTP 24.1
+
+ Sets the magic cookie of the local node to the atom Cookie,
+ which is also the cookie for all nodes that have no explicit
+ cookie set with set_cookie/2 Cookie (see section Distributed
+ Erlang in the Erlang Reference Manual in System Documentation).
+
+ Failure: function_clause if the local node is not alive.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_2_func.txt
index 841be9c7cd..571d771ae8 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cookie_2_func.txt
@@ -2,9 +2,10 @@
-spec erlang:set_cookie(Node, Cookie) -> true
 when Node :: node(), Cookie :: atom().
- Sets the magic cookie of Node to the atom Cookie. If Node is
- the local node, the function also sets the cookie of all other
- unknown nodes to Cookie (see section Distributed Erlang in the
- Erlang Reference Manual in System Documentation).
+ Sets the magic cookie for Node to the atom Cookie. If Node
+ is the local node, the function sets the cookie of all other nodes
+ (that have no explicit cookie set with this function) to Cookie
+ (see section Distributed Erlang in the Erlang Reference Manual
+ in System Documentation).
Failure: function_clause if the local node is not alive.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cpu_topology_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cpu_topology_1_func.txt
new file mode 100644
index 0000000000..1b44778f1a
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_set_cpu_topology_1_func.txt
@@ -0,0 +1,6 @@
+
+  set_cpu_topology/1
+
+ The documentation for set_cpu_topology/1 is hidden. This
+ probably means that it is internal and not to be used by other
+ applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_2_func.txt
new file mode 100644
index 0000000000..93491f7786
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_2_func.txt
@@ -0,0 +1,5 @@
+
+  setnode/2
+
+ The documentation for setnode/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_3_func.txt
new file mode 100644
index 0000000000..0e2112a100
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_setnode_3_func.txt
@@ -0,0 +1,5 @@
+
+  setnode/3
+
+ The documentation for setnode/3 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slash_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slash_2_func.txt
new file mode 100644
index 0000000000..688a861491
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slash_2_func.txt
@@ -0,0 +1,5 @@
+
+  '/'/2
+
+ The documentation for '/'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slasheq_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slasheq_2_func.txt
new file mode 100644
index 0000000000..37d8260593
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_slasheq_2_func.txt
@@ -0,0 +1,5 @@
+
+  '/='/2
+
+ The documentation for '/='/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_spawn_opt_4_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_spawn_opt_4_func.txt
index 7a7ab7a819..22956f6ce9 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_spawn_opt_4_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_spawn_opt_4_func.txt
@@ -125,8 +125,9 @@
process_flag(max_heap_size, Size).
{message_queue_data, MQD}:
- Sets the state of the message_queue_data process flag. MQD
- is to be either off_heap or on_heap. The default 
- message_queue_data process flag is determined by command-line
- argument +hmqd in erl(1). For more information, see the
- documentation of process_flag(message_queue_data, MQD).
+ Sets the value of the message_queue_data process flag. MQD
+ can be either off_heap or on_heap. The default value of
+ the message_queue_data process flag is determined by the
+ command-line argument +hmqd in erl(1). For more
+ information, see the documentation of 
+ process_flag(message_queue_data, MQD).
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_0_type.txt
new file mode 100644
index 0000000000..9d02af6aa5
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_0_type.txt
@@ -0,0 +1,10 @@
+
+ -type stacktrace() ::
+  [{module(),
+  atom(),
+  arity() | [term()],
+  [stacktrace_extrainfo()]} |
+  {function(), arity() | [term()], [stacktrace_extrainfo()]}].
+
+ An Erlang stacktrace as described by Errors and Error Handling
+ section in the Erlang Reference Manual.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_extrainfo_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_extrainfo_0_type.txt
new file mode 100644
index 0000000000..acdcdd1eb4
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_stacktrace_extrainfo_0_type.txt
@@ -0,0 +1,10 @@
+
+ -type stacktrace_extrainfo() ::
+  {line, pos_integer()} |
+  {file, unicode:chardata()} |
+  {error_info,
+  #{module => module(), function => atom(), cause => term()}} |
+  {atom(), term()}.
+
+ An Erlang stacktrace as described by Errors and Error Handling
+ section in the Erlang Reference Manual.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_star_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_star_2_func.txt
new file mode 100644
index 0000000000..ff7f8595a1
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_star_2_func.txt
@@ -0,0 +1,5 @@
+
+  '*'/2
+
+ The documentation for '*'/2 is hidden. This probably means that
+ it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_statistics_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_statistics_1_func.txt
index e54fa13ce6..f9bb276f72 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_statistics_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_statistics_1_func.txt
@@ -24,16 +24,6 @@
 Input :: non_neg_integer(),
 Output :: non_neg_integer().
- -spec statistics(scheduler_wall_time) ->
-  [{SchedulerId, ActiveTime, TotalTime}] | undefined
-  when
-  SchedulerId :: pos_integer(),
-  ActiveTime :: non_neg_integer(),
-  TotalTime :: non_neg_integer().
-
-Since:
- OTP R15B01
-
-spec statistics(active_tasks_all) -> [ActiveTasks]
 when ActiveTasks :: non_neg_integer().
@@ -71,6 +61,16 @@
 Wallclock_Time_Since_Last_Call ::
 non_neg_integer().
+ -spec statistics(scheduler_wall_time) ->
+  [{SchedulerId, ActiveTime, TotalTime}] | undefined
+  when
+  SchedulerId :: pos_integer(),
+  ActiveTime :: non_neg_integer(),
+  TotalTime :: non_neg_integer().
+
+Since:
+ OTP R15B01
+
-spec statistics(exact_reductions) ->
 {Total_Exact_Reductions,
 Exact_Reductions_Since_Last_Call}
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_string_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_string_0_type.txt
new file mode 100644
index 0000000000..fee694adbc
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_string_0_type.txt
@@ -0,0 +1,5 @@
+
+ -type string() :: [char()].
+
+ A character string represented by a list of ASCII characters or
+ unicode codepoints.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_subtract_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_subtract_2_func.txt
new file mode 100644
index 0000000000..b3e9734abf
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_subtract_2_func.txt
@@ -0,0 +1,5 @@
+
+  subtract/2
+
+ The documentation for subtract/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_suspend_process_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_suspend_process_2_func.txt
index 7f22bae23c..8b604b5025 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_suspend_process_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_suspend_process_2_func.txt
@@ -55,7 +55,7 @@
process that issued this request, have called 
resume_process(Suspendee) before getting the reply.
- Appart from the reply message, the {asynchronous, ReplyTag}
+ Apart from the reply message, the {asynchronous, ReplyTag}
option behaves exactly the same as the asynchronous option
without reply tag.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_info_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_info_1_func.txt
index 958bee44a1..1015fbac90 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_info_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_system_info_1_func.txt
@@ -198,10 +198,10 @@
message_queue_data:
Returns the default value of the message_queue_data process
- flag, which is either off_heap or on_heap. This default is
- set by command-line argument +hmqd in erl(1). For more
- information on the message_queue_data process flag, see
- documentation of process_flag(message_queue_data, MQD).
+ flag, which can be either off_heap or on_heap. The default
+ value is set by the command-line argument +hmqd in erl(1).
+ For more information, see the documentation of 
+ process_flag(message_queue_data, MQD).
min_heap_size:
Returns {min_heap_size, MinHeapSize}, where MinHeapSize is
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_0_type.txt
new file mode 100644
index 0000000000..275c5aa8c3
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type term() :: any().
+
+ All possible Erlang terms. Synonym for any().
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_binary_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_binary_2_func.txt
index 5c2cc9e708..f72b5be32c 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_binary_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_binary_2_func.txt
@@ -5,6 +5,7 @@
 Options ::
 [compressed |
 {compressed, Level :: 0..9} |
+  deterministic |
 {minor_version, Version :: 0..2}].
Returns a binary data object that is the result of encoding Term
@@ -57,8 +58,18 @@
2:
Drops usage of the latin1 atom encoding and unconditionally
- use utf8 encoding for all atoms. This will be changed to the
- default in a future major release of Erlang/OTP. Erlang/OTP
- systems as of R16B can decode this representation.
+ use utf8 encoding for all atoms. Erlang/OTP systems as of R16B
+ can decode this representation.
+
+ Note:
+ In Erlang/OTP 26, the default minor_version is planned
+ to change from 1 to 2. See Upcoming Potential
+ Incompatibilities .
+
+ Option deterministic (introduced in OTP 24.1) can be used to
+ ensure that within the same major release of Erlang/OTP, the same
+ encoded representation is returned for the same term. There is
+ still no guarantee that the encoded representation remains the
+ same between major releases of Erlang/OTP.
See also binary_to_term/1.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_iovec_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_iovec_2_func.txt
index 176c8eef09..1379c95c36 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_iovec_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_term_to_iovec_2_func.txt
@@ -5,6 +5,7 @@
 Options ::
 [compressed |
 {compressed, Level :: 0..9} |
+  deterministic |
 {minor_version, Version :: 0..2}].
Since:
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_timeout_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_timeout_0_type.txt
new file mode 100644
index 0000000000..df22bfd787
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_timeout_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type timeout() :: infinity | non_neg_integer().
+
+ A timeout value that can be passed to a receive expression.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_3_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_3_func.txt
index 1712d8dca3..46b04a1c4a 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_3_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_3_func.txt
@@ -328,9 +328,6 @@
{trace, PidPort, getting_unlinked, Pid2}:
When PidPort gets unlinked from a process Pid2.
- {trace, Pid, exit, Reason}:
- When Pid exits with reason Reason.
-
{trace, Port, open, Pid, Driver}:
When Pid opens a new port Port with the running Driver.
@@ -412,6 +409,12 @@
The total size of binaries allowed in the virtual old heap
in the process before doing a garbage collection.
+ wordsize:
+ For the gc_minor_start event it is the size of the need
+ that triggered the GC. For the corresponding gc_minor_end
+ event it is the size of reclaimed memory = start 
+ heap_size - end heap_size.
+
All sizes are in words.
{trace, Pid, gc_max_heap_size, Info}:
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_info_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_info_2_func.txt
index eb15ee6787..978e3bb1c7 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_info_2_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_trace_info_2_func.txt
@@ -63,7 +63,7 @@
flags:
Returns a list of atoms indicating what kind of traces is
enabled for the process. The list is empty if no traces are
- enabled, and one or more of the followings atoms if traces are
+ enabled, and one or more of the following atoms if traces are
enabled: send, 'receive', set_on_spawn, call, 
return_to, procs, ports, set_on_first_spawn, 
set_on_link, running, running_procs, running_ports, 
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_tuple_0_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_tuple_0_type.txt
new file mode 100644
index 0000000000..c077d1d4ba
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_tuple_0_type.txt
@@ -0,0 +1,4 @@
+
+ -type tuple() :: tuple().
+
+ An Erlang tuple.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_type.txt
index 89aa1c4acc..e18a340c2b 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_type.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_type.txt
@@ -2,6 +2,100 @@
These types are documented in this module:
+ -type any() :: any().
+
+ -type arity() :: arity().
+
+ -type atom() :: atom().
+
+ -type binary() :: <<_:_*8>>.
+
+ -type bitstring() :: <<_:_*1>>.
+
+ -type boolean() :: true | false.
+
+ -type byte() :: 0..255.
+
+ -type char() :: 0..1114111.
+
+ -type float() :: float().
+
+ -type function() :: fun().
+
+ -type identifier() :: pid() | port() | reference().
+
+ -type integer() :: integer().
+
+ -type iodata() :: iolist() | binary().
+
+ -type iolist() ::
+  maybe_improper_list(byte() | binary() | iolist(),
+  binary() | []).
+
+ -type list() :: list().
+
+ -type list(ContentType) :: [ContentType].
+
+ -type map() :: #{any() => any()}.
+
+ -type maybe_improper_list() :: maybe_improper_list(any(), any()).
+
+ -type maybe_improper_list(ContentType, TerminationType) ::
+  maybe_improper_list(ContentType, TerminationType).
+
+ -type mfa() :: {module(), atom(), arity()}.
+
+ -type module() :: atom().
+
+ -type neg_integer() :: neg_integer().
+
+ -type nil() :: [].
+
+ -type no_return() :: none().
+
+ -type node() :: atom().
+
+ -type non_neg_integer() :: non_neg_integer().
+
+ -type none() :: none().
+
+ -type nonempty_binary() :: <<_:8, _:_*8>>.
+
+ -type nonempty_bitstring() :: <<_:1, _:_*1>>.
+
+ -type nonempty_improper_list(ContentType, TerminationType) ::
+  nonempty_improper_list(ContentType, TerminationType).
+
+ -type nonempty_list() :: [any(), ...].
+
+ -type nonempty_list(ContentType) :: [ContentType, ...].
+
+ -type nonempty_maybe_improper_list() ::
+  nonempty_maybe_improper_list(any(), any()).
+
+ -type nonempty_maybe_improper_list(ContentType, TerminationType) ::
+  nonempty_maybe_improper_list(ContentType, TerminationType).
+
+ -type nonempty_string() :: [char(), ...].
+
+ -type number() :: integer() | float().
+
+ -type pid() :: pid().
+
+ -type port() :: port().
+
+ -type pos_integer() :: pos_integer().
+
+ -type reference() :: reference().
+
+ -type string() :: [char()].
+
+ -type term() :: any().
+
+ -type timeout() :: infinity | non_neg_integer().
+
+ -type tuple() :: tuple().
+
-type ext_binary() :: binary().
-type ext_iovec() :: iovec().
@@ -52,3 +146,17 @@ These types are documented in this module:
 error_logger => boolean()}.
-type message_queue_data() :: off_heap | on_heap.
+
+ -type stacktrace_extrainfo() ::
+  {line, pos_integer()} |
+  {file, unicode:chardata()} |
+  {error_info,
+  #{module => module(), function => atom(), cause => term()}} |
+  {atom(), term()}.
+
+ -type stacktrace() ::
+  [{module(),
+  atom(),
+  arity() | [term()],
+  [stacktrace_extrainfo()]} |
+  {function(), arity() | [term()], [stacktrace_extrainfo()]}].
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unalias_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unalias_1_func.txt
index d4e54f4156..308c28a1e4 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unalias_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unalias_1_func.txt
@@ -2,7 +2,7 @@
-spec unalias(Alias) -> boolean() when Alias :: reference().
Since:
- OTP @OTP-16718@
+ OTP 24.0
Deactivate the alias Alias previously created by the calling
process. An alias can for example be created via alias/0, or 
@@ -11,3 +11,6 @@
Returns true if Alias was a currently active alias for current
processes; otherwise, false.
+
+ For more information on process aliases see the Process Aliases
+ section of the Erlang Reference Manual.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_universaltime_to_posixtime_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_universaltime_to_posixtime_1_func.txt
new file mode 100644
index 0000000000..a749876149
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_universaltime_to_posixtime_1_func.txt
@@ -0,0 +1,6 @@
+
+  universaltime_to_posixtime/1
+
+ The documentation for universaltime_to_posixtime/1 is hidden.
+ This probably means that it is internal and not to be used by
+ other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unlink_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unlink_1_func.txt
index 23fecba59c..9668d64fe3 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unlink_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unlink_1_func.txt
@@ -1,23 +1,31 @@
-spec unlink(Id) -> true when Id :: pid() | port().
- Removes the link, if there is one, between the calling process and
- the process or port referred to by Id.
+ Removes a link between the calling process and another process or
+ a port identified by Id. We will from here on call the
+ identified process or port unlinkee.
- Returns true and does not fail, even if there is no link to Id,
- or if Id does not exist.
+ A link can be set up using the link/1 BIF. For more information
+ on links and exit signals due to links, see the Processes
+ chapter in the Erlang Reference Manual:
- Once unlink(Id) has returned, it is guaranteed that the link
- between the caller and the entity referred to by Id has no
- effect on the caller in the future (unless the link is setup
- again). If the caller is trapping exits, an {'EXIT', Id, _}
- message from the link can have been placed in the caller's message
- queue before the call.
+ • Links
+
+ • Sending Exit Signals
- Notice that the {'EXIT', Id, _} message can be the result of the
- link, but can also be the result of Id calling exit/2.
- Therefore, it can be appropriate to clean up the message queue
- when trapping exits after the call to unlink(Id), as follows:
+ • Receiving Exit Signals
+
+ Once unlink(Id) has returned, it is guaranteed that the link
+ between the caller and the unlinkee has no effect on the caller in
+ the future (unless the link is setup again). Note that if the
+ caller is trapping exits, an {'EXIT', Id, ExitReason} message
+ due to the link may have been placed in the message queue of the
+ caller before the unlink(Id) call completed. Also note that the 
+ {'EXIT', Id, ExitReason} message may be the result of the link,
+ but may also be the result of the unlikee sending the caller an
+ exit signal by calling the exit/2 BIF. Therefore, it may or may
+ not be appropriate to clean up the message queue after a call to 
+ unlink(Id) as follows, when trapping exits:
unlink(Id),
receive
@@ -27,13 +35,10 @@
true
end
- Note:
- Before Erlang/OTP R11B (ERTS 5.5) unlink/1 behaved
- completely asynchronously, that is, the link was active until
- the "unlink signal" reached the linked entity. This had an
- undesirable effect, as you could never know when you were
- guaranteed not to be effected by the link.
+ The link removal is performed asynchronously. If such a link does
+ not exist, nothing is done. A detailed description of the link
+ protocol can be found in the Distribution Protocol chapter of
+ the ERTS User's Guide.
- The current behavior can be viewed as two combined operations:
- asynchronously send an "unlink signal" to the linked entity
- and ignore any future results of the link.
+ Failure: badarg if Id does not identify a process or a node
+ local port.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unregister_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unregister_1_func.txt
index 4e25c97d02..3697bac815 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unregister_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_unregister_1_func.txt
@@ -1,12 +1,17 @@
-spec unregister(RegName) -> true when RegName :: atom().
- Removes the registered name RegName associated with a process
- identifier or a port identifier, for example:
+ Removes the registered name RegName associated with a process
+ identifier or a port identifier from the name registry. For
+ example:
> unregister(db).
true
+ Keep in mind that you can still receive signals associated with
+ the registered name after it has been unregistered as the sender
+ may have looked up the name before sending to it.
+
Users are advised not to unregister system processes.
Failure: badarg if RegName is not a registered name.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_whereis_1_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_whereis_1_func.txt
index 757ec8a7e1..6a432f954c 100644
--- a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_whereis_1_func.txt
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_whereis_1_func.txt
@@ -2,9 +2,9 @@
-spec whereis(RegName) -> pid() | port() | undefined
 when RegName :: atom().
- Returns the process identifier or port identifier with the
- registered name RegName. Returns undefined if the name is not
- registered. Example:
+ Returns the process identifier or port identifier with the 
+ registered name RegName from the name registry. Returns 
+ undefined if the name is not registered. Example:
> whereis(db).
<0.43.0>
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_xor_2_func.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_xor_2_func.txt
new file mode 100644
index 0000000000..3a833a1dfb
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_erlang_xor_2_func.txt
@@ -0,0 +1,5 @@
+
+  'xor'/2
+
+ The documentation for 'xor'/2 is hidden. This probably means
+ that it is internal and not to be used by other applications.
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE.txt
new file mode 100644
index 0000000000..3c3f49196d
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE.txt
@@ -0,0 +1,4 @@
+
+ shell_docs_SUITE
+
+ There is no documentation for shell_docs_SUITE
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_cb.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_cb.txt
new file mode 100644
index 0000000000..917fb3b6a7
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_cb.txt
@@ -0,0 +1,3 @@
+ shell_docs_SUITE
+
+There are no callbacks in this module
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_type.txt b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_type.txt
new file mode 100644
index 0000000000..ad4b506280
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/unknown_shell_docs_SUITE_type.txt
@@ -0,0 +1,3 @@
+ shell_docs_SUITE
+
+There are no types in this module
diff --git a/lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v1 b/lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v1
new file mode 100644
index 0000000000..43ca532712
--- /dev/null
+++ b/lib/stdlib/test/shell_docs_SUITE_data/user_drv.docs_v1
@@ -0,0 +1 @@
+{docs_v1,[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],erlang,<<97,112,112,108,105,99,97,116,105,111,110,47,101,114,108,97,110,103,43,104,116,109,108>>,hidden,#{otp_doc_vsn => {1,0,0}},[{{function,interfaces,1},[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],[<<105,110,116,101,114,102,97,99,101,115,47,49>>],hidden,#{}},{{function,server,2},[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],[<<115,101,114,118,101,114,47,50>>],hidden,#{}},{{function,server,3},[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],[<<115,101,114,118,101,114,47,51>>],hidden,#{}},{{function,start,0},[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],[<<115,116,97,114,116,47,48>>],hidden,#{}},{{function,start,1},[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],[<<115,116,97,114,116,47,49>>],hidden,#{}},{{function,start,2},[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],[<<115,116,97,114,116,47,50>>],hidden,#{}},{{function,start,3},[{file,[117,115,101,114,95,100,114,118,46,101,114,108]},{location,0}],[<<115,116,97,114,116,47,51>>],hidden,#{}}]}. \ No newline at end of file
diff --git a/lib/stdlib/test/stdlib_SUITE.erl b/lib/stdlib/test/stdlib_SUITE.erl
index 7e05723036..938b6ba3e3 100644
--- a/lib/stdlib/test/stdlib_SUITE.erl
+++ b/lib/stdlib/test/stdlib_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -27,7 +27,7 @@
init_per_testcase/2, end_per_testcase/2,
app_test/1, appup_test/1, assert_test/1]).
--compile(r21).
+-compile(r22).
suite() -> [{ct_hooks,[ts_install_cth]}].
@@ -46,7 +46,19 @@ init_per_group(_GroupName, Config) ->
end_per_group(_GroupName, Config) ->
Config.
-
+init_per_testcase(appup_test, Config) ->
+ %% We check if the test results were released using a version
+ %% of Erlang/OTP that was a tagged version or not. On a non-tagged
+ %% version this testcase most likely will fail.
+ case file:read_file(
+ filename:join(
+ proplists:get_value(data_dir,Config), "otp_version_tickets")) of
+ {ok,<<"DEVELOPMENT",_/binary>>} ->
+ {skip, "This is a development version, test might fail "
+ "because of incorrect version numbers"};
+ {ok,S} ->
+ Config
+ end;
init_per_testcase(_Case, Config) ->
Config.
end_per_testcase(_Case, _Config) ->
@@ -65,8 +77,6 @@ app_test(Config) when is_list(Config) ->
appup_test(_Config) ->
appup_tests(stdlib,create_test_vsns(stdlib)).
-appup_tests(_App,{[],[]}) ->
- {skip,"no previous releases available"};
appup_tests(App,{OkVsns0,NokVsns}) ->
application:load(App),
{_,_,Vsn} = lists:keyfind(App,1,application:loaded_applications()),
@@ -79,8 +89,7 @@ appup_tests(App,{OkVsns0,NokVsns}) ->
OkVsns0 ->
OkVsns0;
Ok ->
- ct:log("Current version, ~p, is same as in previous release.~n"
- "Removing this from the list of ok versions.",
+ ct:log("Removed current version ~p from the list of ok versions to test.",
[Vsn]),
Ok
end,
@@ -95,57 +104,46 @@ appup_tests(App,{OkVsns0,NokVsns}) ->
ok.
create_test_vsns(App) ->
- ThisMajor = erlang:system_info(otp_release),
- FirstMajor = previous_major(ThisMajor),
- SecondMajor = previous_major(previous_major(FirstMajor)),
- Ok = app_vsn(App,[ThisMajor,FirstMajor]),
- Nok0 = app_vsn(App,[SecondMajor]),
+ S = otp_vsns:read_state(),
+ Rel = list_to_integer(erlang:system_info(otp_release)),
+ AppStr = atom_to_list(App),
+ Ok = ok_app_vsns(S, Rel, AppStr),
+ Nok0 = nok_app_vsns(S, Rel, AppStr, hd(Ok)),
Nok = case Ok of
- [Ok1|_] ->
- [Ok1 ++ ",1" | Nok0]; % illegal
- _ ->
- Nok0
- end,
- {Ok,Nok}.
-
-previous_major("17") ->
- "r16b";
-previous_major("r16b") ->
- "r15b";
-previous_major(Rel) ->
- integer_to_list(list_to_integer(Rel)-1).
-
-app_vsn(App,[R|Rs]) ->
- OldRel =
- case test_server:is_release_available(R) of
- true ->
- {release,R};
- false ->
- case ct:get_config({otp_releases,list_to_atom(R)}) of
- undefined ->
- false;
- Prog0 ->
- case os:find_executable(Prog0) of
- false ->
- false;
- Prog ->
- {prog,Prog}
- end
- end
- end,
- case OldRel of
- false ->
- app_vsn(App,Rs);
- _ ->
- {ok,N} = test_server:start_node(prevrel,peer,[{erl,[OldRel]}]),
- _ = rpc:call(N,application,load,[App]),
- As = rpc:call(N,application,loaded_applications,[]),
- {_,_,V} = lists:keyfind(App,1,As),
- test_server:stop_node(N),
- [V|app_vsn(App,Rs)]
- end;
-app_vsn(_App,[]) ->
- [].
+ [Ok1|_] ->
+ [Ok1 ++ ",1" | Nok0]; % illegal
+ _ ->
+ Nok0
+ end,
+ {Ok, Nok}.
+
+ok_app_vsns(S, Rel, AppStr) ->
+ AppVsns0 = get_rel_app_vsns(S, Rel-2, AppStr),
+ AppVsns1 = get_rel_app_vsns(S, Rel-1, AppStr),
+ AppVsns2 = try
+ get_rel_app_vsns(S, Rel, AppStr)
+ catch
+ _:_ -> []
+ end,
+ lists:usort(AppVsns2 ++ AppVsns1 ++ AppVsns0).
+
+nok_app_vsns(S, Rel, AppStr, EarliestOkVsn) ->
+ AppVsns0 = get_rel_app_vsns(S, Rel-4, AppStr),
+ AppVsns1 = get_rel_app_vsns(S, Rel-3, AppStr),
+ %% Earliest OK version may exist in not OK versions
+ %% as well if there were no application version bump
+ %% between two releases, so we need to remove it
+ %% if that is the case...
+ lists:usort(AppVsns1 ++ AppVsns0) -- EarliestOkVsn.
+
+get_rel_app_vsns(S, Rel, App) ->
+ RelStr = integer_to_list(Rel),
+ OtpVsns = otp_vsns:branch_vsns(S, "maint-"++RelStr),
+ lists:map(fun (OtpVsn) ->
+ AppVsn = otp_vsns:app_vsn(S, OtpVsn, App),
+ [_, Vsn] = string:lexemes(AppVsn, "-"),
+ Vsn
+ end, OtpVsns).
check_appup([Vsn|Vsns],Instrs,Expected) ->
case systools_relup:appup_search_for_version(Vsn, Instrs) of
diff --git a/lib/stdlib/test/stdlib_bench_SUITE.erl b/lib/stdlib/test/stdlib_bench_SUITE.erl
index 81764a5913..4ccbdb9b57 100644
--- a/lib/stdlib/test/stdlib_bench_SUITE.erl
+++ b/lib/stdlib/test/stdlib_bench_SUITE.erl
@@ -52,7 +52,7 @@ groups() ->
encode_list, encode_list_to_string,
mime_binary_decode, mime_binary_decode_to_string,
mime_list_decode, mime_list_decode_to_string]},
- {io, [{repeat, 5}], [double_random_to_list]},
+ {io, [{repeat, 5}], [double_random_to_list, double_random_to_list_array]},
{gen_server, [{repeat,5}], cases(gen_server)},
{gen_statem, [{repeat,3}], cases(gen_statem)},
{gen_server_comparison, [],
@@ -283,14 +283,17 @@ mbb(N, Acc) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-define(MAX_DOUBLE, (1 bsl 62) - 1).
--define(DOUBLE_SAMPLE, 10000).
+-define(DOUBLE_SAMPLE, 100000).
-define(SMALL_DIGITS, 6).
double_random_to_list(_Config) ->
- comment(test_double(io_lib_format, fwrite_g, 0)).
+ comment(test_double(0)).
+
+double_random_to_list_array(_Config) ->
+ comment(test_double_array(0)).
double_small_digit_to_list(_Config) ->
- comment(test_double(io_lib_format, fwrite_g, ?SMALL_DIGITS)).
+ comment(test_double(?SMALL_DIGITS)).
double(0) ->
Int = rand:uniform(?MAX_DOUBLE),
@@ -319,17 +322,34 @@ exp10(Acc, 0) ->
exp10(Acc, X) ->
exp10(Acc, X - 1).
-test_double(Mod, Fun, SmallDigits) ->
- test_double(?DOUBLE_SAMPLE, Mod, Fun, SmallDigits).
-test_double(Iter, Mod, Fun, SmallDigits) ->
- F = fun() -> loop_double(Iter, Mod, Fun, SmallDigits) end,
+test_double(Samples) when is_list(Samples) ->
+ F = fun() -> loop_double(Samples) end,
{Time, ok} = timer:tc(fun() -> lspawn(F) end),
- report_mfa(Iter, Time, Mod).
+ report_mfa(?DOUBLE_SAMPLE, Time, io_lib_format);
+test_double(SmallDigits) when is_integer(SmallDigits) ->
+ rand:seed(exsplus, {1201,855653,380975}),
+ Samples = [double(SmallDigits) || _ <- lists:seq(1, ?DOUBLE_SAMPLE)],
+ test_double(Samples).
+
+loop_double([]) -> garbage_collect(), ok;
+loop_double([Sample | Rest]) ->
+ _ = io_lib_format:fwrite_g(Sample),
+ loop_double(Rest).
+
+test_double_array(SmallDigits) when is_integer(SmallDigits) ->
+ rand:seed(exsplus, {1201,855653,380975}),
+ Samples = [double(SmallDigits) || _ <- lists:seq(1, ?DOUBLE_SAMPLE)],
+ Samples_array = array:from_list(Samples),
+ test_double_array(?DOUBLE_SAMPLE - 1, Samples_array).
+test_double_array(Iter, Samples_array) ->
+ F = fun() -> loop_double_array(Iter, Samples_array) end,
+ {Time, ok} = timer:tc(fun() -> lspawn(F) end),
+ report_mfa(?DOUBLE_SAMPLE, Time, io_lib_format).
-loop_double(0, _M, _F, _SmallDigits) -> garbage_collect(), ok;
-loop_double(N, M, F, SmallDigits) ->
- _ = apply(M, F, [double(SmallDigits)]),
- loop_double(N - 1, M, F, SmallDigits).
+loop_double_array(0, _Samples_array) -> garbage_collect(), ok;
+loop_double_array(Iter, Samples_array) ->
+ _ = io_lib_format:fwrite_g(array:get(Iter, Samples_array)),
+ loop_double_array(Iter - 1, Samples_array).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/stdlib/test/supervisor_SUITE.erl b/lib/stdlib/test/supervisor_SUITE.erl
index a52c5b1b44..78d7e7d7bc 100644
--- a/lib/stdlib/test/supervisor_SUITE.erl
+++ b/lib/stdlib/test/supervisor_SUITE.erl
@@ -904,7 +904,7 @@ child_specs_map(Config) when is_list(Config) ->
B7 = CS0#{type => wrker},
B8 = CS0#{modules => dy},
B9 = CS0#{modules => [1,2,3]},
- B10 = CS0#{significant => maybe},
+ B10 = CS0#{significant => 'maybe'},
{error, missing_id} = supervisor:start_child(sup_test, B1),
{error, missing_start} = supervisor:start_child(sup_test, B2),
@@ -932,7 +932,7 @@ child_specs_map(Config) when is_list(Config) ->
{error, {invalid_modules,dy}} = supervisor:check_childspecs([B8]),
{error, {invalid_module, 1}} =
supervisor:check_childspecs([B9]),
- {error, {invalid_significant, maybe}} =
+ {error, {invalid_significant, 'maybe'}} =
supervisor:check_childspecs([B10]),
CSFilter = fun (CS) -> maps:filter(fun (_, V) -> V =/= undefined end, CS) end,
diff --git a/lib/stdlib/test/tar_SUITE.erl b/lib/stdlib/test/tar_SUITE.erl
index d055eb88cc..4eac9c8162 100644
--- a/lib/stdlib/test/tar_SUITE.erl
+++ b/lib/stdlib/test/tar_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -914,23 +914,20 @@ do_sparse([Name|Rest], DataDir, PrivDir) ->
%% Test filenames with characters outside the US ASCII range.
unicode(Config) when is_list(Config) ->
- run_unicode_node(Config, "+fnu"),
+ run_unicode_node(Config, ["+fnu"]),
case has_transparent_naming() of
true ->
- run_unicode_node(Config, "+fnl");
+ run_unicode_node(Config, ["+fnl"]);
false ->
ok
end.
-run_unicode_node(Config, Option) ->
+run_unicode_node(Config, Args) ->
PrivDir = proplists:get_value(priv_dir, Config),
- Pa = filename:dirname(code:which(?MODULE)),
- Args = Option ++ " -pa "++Pa,
- io:format("~s\n", [Args]),
- Node = start_node(unicode, Args),
+ {ok, Peer, Node} = ?CT_PEER(Args),
ok = rpc:call(Node, erlang, apply,
[fun() -> do_unicode(PrivDir) end,[]]),
- true = test_server:stop_node(Node),
+ peer:stop(Peer),
ok.
has_transparent_naming() ->
@@ -942,21 +939,25 @@ has_transparent_naming() ->
do_unicode(PrivDir) ->
ok = file:set_cwd(PrivDir),
- ok = file:make_dir("unicöde"),
-
- Names = lists:sort(unicode_create_files()),
- Tar = "unicöde.tar",
- ok = erl_tar:create(Tar, ["unicöde"], []),
-
- %% Unicode filenames require PAX format.
- false = is_ustar(Tar),
- {ok,Names0} = erl_tar:table(Tar, []),
- Names = lists:sort(Names0),
- _ = [ok = file:delete(Name) || Name <- Names],
- ok = erl_tar:extract(Tar),
- _ = [{ok,_} = file:read_file(Name) || Name <- Names],
- _ = [ok = file:delete(Name) || Name <- Names],
- ok = file:del_dir("unicöde"),
+ case file:make_dir("unicöde") of
+ ok ->
+ Names = lists:sort(unicode_create_files()),
+ Tar = "unicöde.tar",
+ ok = erl_tar:create(Tar, ["unicöde"], []),
+
+ %% Unicode filenames require PAX format.
+ false = is_ustar(Tar),
+ {ok,Names0} = erl_tar:table(Tar, []),
+ Names = lists:sort(Names0),
+ _ = [ok = file:delete(Name) || Name <- Names],
+ ok = erl_tar:extract(Tar),
+ _ = [{ok,_} = file:read_file(Name) || Name <- Names],
+ _ = [ok = file:delete(Name) || Name <- Names],
+ ok = file:del_dir("unicöde");
+ {error,eilseq} ->
+ %% The FS (eg zfs) does not support transparent naming
+ ok
+ end,
ok.
unicode_create_files() ->
@@ -1014,7 +1015,7 @@ roundtrip_metadata(Config) ->
do_roundtrip_metadata(Dir, File) ->
Tar = filename:join(Dir, atom_to_list(?FUNCTION_NAME)++".tar"),
- BeamFile = code:which(compile),
+ BeamFile = code:which(?MODULE),
{ok,Fd} = erl_tar:open(Tar, [write]),
ok = erl_tar:add(Fd, BeamFile, File, []),
ok = erl_tar:close(Fd),
@@ -1131,17 +1132,6 @@ make_temp_dir(Base, I) ->
{error,eexist} -> make_temp_dir(Base, I+1)
end.
-start_node(Name, Args) ->
- [_,Host] = string:tokens(atom_to_list(node()), "@"),
- ct:log("Trying to start ~w@~s~n", [Name,Host]),
- case test_server:start_node(Name, peer, [{args,Args}]) of
- {error,Reason} ->
- ct:fail(Reason);
- {ok,Node} ->
- ct:log("Node ~p started~n", [Node]),
- Node
- end.
-
%% Test that the given tar file is a plain USTAR archive,
%% without any PAX extensions.
is_ustar(File) ->
diff --git a/lib/stdlib/test/timer_SUITE.erl b/lib/stdlib/test/timer_SUITE.erl
index 9062cbae80..d6211acf9d 100644
--- a/lib/stdlib/test/timer_SUITE.erl
+++ b/lib/stdlib/test/timer_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -132,7 +132,7 @@ big_loop(C, N, Pids) ->
%%Pids2=Pids1,
%% wait a little while
- timer:sleep(rand:uniform(200)*3),
+ ok = timer:sleep(rand:uniform(200)*3),
%% spawn zero, one or two nrev to get some load ;-/
Pids3 = start_nrev(Pids2, rand:uniform(100)),
@@ -168,7 +168,7 @@ s_a_t(C, TimeOut) ->
a_t(C, TimeOut) ->
start_watchdog(self(), TimeOut),
Start = system_time(),
- timer:send_after(TimeOut, self(), now),
+ {ok, _} = timer:send_after(TimeOut, self(), now),
receive
now ->
Stop = system_time(),
@@ -202,12 +202,12 @@ i_wait(Start, Prev, Times, TimeOut, Times, Ref, C) ->
interval ->
Now = system_time(),
report_interval(C, {final,Times}, Start, Prev, Now, TimeOut),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
exit(done);
watchdog ->
Now = system_time(),
report_interval(C, {final,Times}, Start, Prev, Now, TimeOut),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
ok = io:format("Internal watchdog timeout (i), not good!!~n",
[]),
exit(done)
@@ -358,7 +358,7 @@ system_time() ->
%% ------------------------------------------------------- %%
do_nrev(Sleep) ->
- timer:sleep(Sleep),
+ ok = timer:sleep(Sleep),
test(1000,"abcdefghijklmnopqrstuvxyz1234"),
exit(done).
diff --git a/lib/stdlib/test/timer_simple_SUITE.erl b/lib/stdlib/test/timer_simple_SUITE.erl
index 1a582ae95a..39a477401c 100644
--- a/lib/stdlib/test/timer_simple_SUITE.erl
+++ b/lib/stdlib/test/timer_simple_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,25 +21,43 @@
-module(timer_simple_SUITE).
+%% This test suite matches on opaque tref() return values from the *_after
+%% and *_interval functions, namely {instant, _}, {send_local, _}, {once, _}
+%% and {interval, _}.
+%% If the implementation changes, the test suite has to be changed accordingly.
+
%% external
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2,
init_per_testcase/2,
- apply_after/1,
+ apply_after1/1,
+ apply_after2/1,
+ apply_after_invalid_args/1,
send_after1/1,
send_after2/1,
send_after3/1,
+ send_after4/1,
+ send_after_invalid_args/1,
exit_after1/1,
exit_after2/1,
+ exit_after3/1,
kill_after1/1,
kill_after2/1,
- apply_interval/1,
+ kill_after3/1,
+ apply_interval1/1,
+ apply_interval_invalid_args/1,
send_interval1/1,
send_interval2/1,
send_interval3/1,
send_interval4/1,
+ send_interval_invalid_args/1,
cancel1/1,
cancel2/1,
+ cancel3/1,
+ cancel4/1,
+ cancel_invalid_args/1,
+ sleep1/1,
+ sleep2/1,
tc/1,
unique_refs/1,
timer_perf/1]).
@@ -60,15 +78,107 @@ suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,10}}].
-all() ->
- [apply_after, send_after1, send_after2, send_after3,
- exit_after1, exit_after2, kill_after1, kill_after2,
- apply_interval, send_interval1, send_interval2,
- send_interval3, send_interval4, cancel1, cancel2, tc,
- unique_refs, timer_perf].
+all() ->
+ [
+ {group, apply_after},
+ {group, send_after},
+ {group, exit_after},
+ {group, kill_after},
+ {group, apply_interval},
+ {group, send_interval},
+ {group, cancel},
+ {group, sleep},
+ {group, misc}
+ ].
groups() ->
- [].
+ [
+ {
+ apply_after,
+ [],
+ [
+ apply_after1,
+ apply_after2,
+ apply_after_invalid_args
+ ]
+ },
+ {
+ send_after,
+ [],
+ [
+ send_after1,
+ send_after2,
+ send_after3,
+ send_after4,
+ send_after_invalid_args
+ ]
+ },
+ {
+ exit_after,
+ [],
+ [
+ exit_after1,
+ exit_after2,
+ exit_after3
+ ]
+ },
+ {
+ kill_after,
+ [],
+ [
+ kill_after1,
+ kill_after2,
+ kill_after3
+ ]
+ },
+ {
+ apply_interval,
+ [],
+ [
+ apply_interval1,
+ apply_interval_invalid_args
+ ]
+ },
+ {
+ send_interval,
+ [],
+ [
+ send_interval1,
+ send_interval2,
+ send_interval3,
+ send_interval4,
+ send_interval_invalid_args
+ ]
+ },
+ {
+ cancel,
+ [],
+ [
+ cancel1,
+ cancel2,
+ cancel3,
+ cancel4,
+ cancel_invalid_args
+ ]
+ },
+ {
+ sleep,
+ [],
+ [
+ sleep1,
+ sleep2
+ ]
+ },
+ {
+ misc,
+ [],
+ [
+ tc,
+ unique_refs,
+ timer_perf
+ ]
+ }
+ ].
init_per_suite(Config) ->
Config.
@@ -84,24 +194,37 @@ end_per_group(_GroupName, Config) ->
init_per_testcase(_, Config) when is_list(Config) ->
- timer:start(),
+ ok = timer:start(),
Config.
%% Testing timer interface!!
-%% Test of apply_after, with sending of message.
-apply_after(Config) when is_list(Config) ->
- timer:apply_after(500, ?MODULE, send, [self(), ok_apply]),
+%% Test of apply_after with time = 0, with sending of message.
+apply_after1(Config) when is_list(Config) ->
+ {ok, {instant, _}} = timer:apply_after(0, ?MODULE, send, [self(), ok_apply]),
+ ok = get_mess(1000, ok_apply).
+
+%% Test of apply_after with time = 500, with sending of message.
+apply_after2(Config) when is_list(Config) ->
+ {ok, {once, _}} = timer:apply_after(500, ?MODULE, send, [self(), ok_apply]),
ok = get_mess(1000, ok_apply).
+%% Test that apply_after rejects invalid arguments.
+apply_after_invalid_args(Config) when is_list(Config) ->
+ {error, badarg} = timer:apply_after(-1, foo, bar, []),
+ {error, badarg} = timer:apply_after(0, "foo", bar, []),
+ {error, badarg} = timer:apply_after(0, foo, "bar", []),
+ {error, badarg} = timer:apply_after(0, foo, bar, baz),
+ ok.
+
%% Test of send_after with time = 0.
send_after1(Config) when is_list(Config) ->
- timer:send_after(0, ok_send1),
+ {ok, {instant, _}} = timer:send_after(0, ok_send1),
ok = get_mess(1000, ok_send1).
%% Test of send_after with time = 500.
send_after2(Config) when is_list(Config) ->
- timer:send_after(500, self(), ok_send2),
+ {ok, {send_local, _}} = timer:send_after(500, self(), ok_send2),
ok = get_mess(2000, ok_send2).
%% Test of send_after with time = 500, with receiver a registered
@@ -109,15 +232,32 @@ send_after2(Config) when is_list(Config) ->
send_after3(Config) when is_list(Config) ->
Name = list_to_atom(pid_to_list(self())),
register(Name, self()),
- timer:send_after(500, Name, ok_send3),
+ {ok, {once, _}} = timer:send_after(500, Name, ok_send3),
ok = get_mess(2000, ok_send3),
unregister(Name).
+%% Test that send_after works if the destination is a registered
+%% name which gets registered after the timer is started.
+send_after4(Config) when is_list(Config) ->
+ Name = list_to_atom(pid_to_list(self())),
+ {ok, {once, _}} = timer:send_after(500, Name, ok_send4),
+ register(Name, self()),
+ ok = get_mess(2000, ok_send4),
+ unregister(Name).
+
+%% Test that send_after rejects invalid arguments.
+send_after_invalid_args(Config) when is_list(Config) ->
+ {error, badarg} = timer:send_after(-1, test),
+ {error, badarg} = timer:send_after(-1, self(), test),
+ {error, badarg} = timer:send_after(-1, ?MODULE, test),
+ {error, badarg} = timer:send_after(0, "", test),
+ ok.
+
%% Test of exit_after with time = 1000.
exit_after1(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Pid = spawn_link(?MODULE, forever, []),
- timer:exit_after(1000, Pid, exit_test1),
+ {ok, {once, _}} = timer:exit_after(1000, Pid, exit_test1),
ok = get_mess(5000, {'EXIT', Pid, exit_test1}).
%% Test of exit_after with time = 1000. The process to exit is the
@@ -127,14 +267,25 @@ exit_after2(Config) when is_list(Config) ->
Pid = spawn_link(?MODULE, forever, []),
Name = list_to_atom(pid_to_list(Pid)),
register(Name, Pid),
- timer:exit_after(1000, Name, exit_test2),
+ {ok, {once, _}} = timer:exit_after(1000, Name, exit_test2),
ok = get_mess(2000, {'EXIT', Pid, exit_test2}).
+%% Test of exit_after for sending an exit to self.
+exit_after3(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ Pid = spawn_link(
+ fun () ->
+ {ok, {once, _}} = timer:exit_after(1000, exit_test3),
+ forever()
+ end
+ ),
+ ok = get_mess(2000, {'EXIT', Pid, exit_test3}).
+
%% Test of kill_after with time = 1000.
kill_after1(Config) when is_list(Config) ->
process_flag(trap_exit, true),
Pid = spawn_link(?MODULE, forever, []),
- timer:kill_after(1000, Pid),
+ {ok, {once, _}} = timer:kill_after(1000, Pid),
ok = get_mess(2000, {'EXIT', Pid, killed}).
%% Test of kill_after with time = 1000. The process to exit is the
@@ -144,25 +295,44 @@ kill_after2(Config) when is_list(Config) ->
Pid = spawn_link(?MODULE, forever, []),
Name = list_to_atom(pid_to_list(Pid)),
register(Name, Pid),
- timer:kill_after(1000, Name),
+ {ok, {once, _}} = timer:kill_after(1000, Name),
+ ok = get_mess(2000, {'EXIT', Pid, killed}).
+
+%% Test of kill_after for self-killing.
+kill_after3(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ Pid = spawn_link(
+ fun () ->
+ {ok, {once, _}} = timer:kill_after(1000),
+ forever()
+ end
+ ),
ok = get_mess(2000, {'EXIT', Pid, killed}).
%% Test of apply_interval by sending messages. Receive
%% 3 messages, cancel the timer, and check that we do
%% not get any more messages.
-apply_interval(Config) when is_list(Config) ->
+apply_interval1(Config) when is_list(Config) ->
{ok, Ref} = timer:apply_interval(1000, ?MODULE, send,
[self(), apply_int]),
ok = get_mess(1500, apply_int, 3),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
nor = get_mess(1000, apply_int).
+%% Test that apply_interval rejects invalid arguments.
+apply_interval_invalid_args(Config) when is_list(Config) ->
+ {error, badarg} = timer:apply_interval(-1, foo, bar, []),
+ {error, badarg} = timer:apply_interval(0, "foo", bar, []),
+ {error, badarg} = timer:apply_interval(0, foo, "bar", []),
+ {error, badarg} = timer:apply_interval(0, foo, bar, baz),
+ ok.
+
%% Test of send_interval/2. Receive 5 messages, cancel the timer, and
%% check that we do not get any more messages.
send_interval1(Config) when is_list(Config) ->
{ok, Ref} = timer:send_interval(1000, send_int),
ok = get_mess(1500, send_int, 5),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
nor = get_mess(1000, send_int). % We should receive only five
%% Test of send_interval/3. Receive 2 messages, cancel the timer, and
@@ -170,7 +340,7 @@ send_interval1(Config) when is_list(Config) ->
send_interval2(Config) when is_list(Config) ->
{ok, Ref} = timer:send_interval(1000, self(), send_int2),
ok = get_mess(1500, send_int2, 2),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
nor = get_mess(1000, send_int2). % We should receive only two
%% Test of send_interval/3. Receive 2 messages, cancel the timer, and
@@ -182,32 +352,97 @@ send_interval3(Config) when is_list(Config) ->
register(Name, self()),
{ok, Ref} = timer:send_interval(1000, Name, send_int3),
ok = get_mess(1500, send_int3, 2),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
nor = get_mess(1000, send_int3), % We should receive only two
unregister(Name).
%% Test that send interval stops sending msg when the receiving
%% process terminates.
send_interval4(Config) when is_list(Config) ->
- timer:send_interval(500, one_time_only),
+ {ok, {interval, Ref}} = timer:send_interval(500, one_time_only),
receive
one_time_only -> ok
end,
- timer_server ! {'EXIT', self(), normal}, % Should remove the timer
- timer:send_after(600, send_intv_ok),
+ timer_server ! {'DOWN', Ref, process, self(), test},
+ {ok, {send_local, _}} = timer:send_after(600, send_intv_ok),
send_intv_ok = receive
Msg -> Msg
end.
-%% Test that we can cancel a timer.
+%% Test that send_interval rejects invalid arguments.
+send_interval_invalid_args(Config) when is_list(Config) ->
+ {error, badarg} = timer:send_interval(-1, test),
+ {error, badarg} = timer:send_interval(-1, self(), test),
+ {error, badarg} = timer:send_interval(-1, ?MODULE, test),
+ {error, badarg} = timer:send_interval(0, "", test),
+ ok.
+
+%% Test that we can cancel a send-once timer.
cancel1(Config) when is_list(Config) ->
{ok, Ref} = timer:send_after(1000, this_should_be_canceled),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
nor = get_mess(2000, this_should_be_canceled). % We should rec 0 msgs
-%% Test cancel/1 with bad argument.
+%% Test that we can cancel an apply-once timer.
cancel2(Config) when is_list(Config) ->
- {error, badarg} = timer:cancel(no_reference).
+ {ok, Ref} = timer:apply_after(1000, erlang, send, [self(), this_should_be_canceled]),
+ {ok, cancel} = timer:cancel(Ref),
+ nor = get_mess(2000, this_should_be_canceled).
+
+%% Test that we can cancel a send-interval timer.
+cancel3(Config) when is_list(Config) ->
+ {ok, Ref} = timer:send_interval(500, one_time_only),
+ receive
+ one_time_only -> ok
+ end,
+ {ok, cancel} = timer:cancel(Ref),
+ {ok, {send_local, _}} = timer:send_after(600, send_intv_ok),
+ send_intv_ok = receive
+ Msg -> Msg
+ end.
+
+%% Test that we can cancel an apply-interval timer.
+cancel4(Config) when is_list(Config) ->
+ {ok, Ref} = timer:apply_interval(500, erlang, send, [self(), one_time_only]),
+ receive
+ one_time_only -> ok
+ end,
+ {ok, cancel} = timer:cancel(Ref),
+ {ok, {send_local, _}} = timer:send_after(600, send_intv_ok),
+ send_intv_ok = receive
+ Msg -> Msg
+ end.
+
+%% Test that cancel rejects invalid arguments.
+cancel_invalid_args(Config) when is_list(Config) ->
+ {error, badarg} = timer:cancel(no_reference),
+ {error, badarg} = timer:cancel({foo, make_ref()}),
+ {error, badarg} = timer:cancel({once, foo}),
+ {error, badarg} = timer:cancel({interval, foo}),
+ {error, badarg} = timer:cancel({instant, foo}),
+ ok.
+
+%% Test that sleep pauses the calling process for
+%% at least the given time.
+sleep1(Config) when is_list(Config) ->
+ T0 = erlang:monotonic_time(millisecond),
+ ok = timer:sleep(1000),
+ T1 = erlang:monotonic_time(millisecond),
+ true = T1 - T0 >= 1000,
+ ok.
+
+%% Test that sleep accepts times >(2^32)-1, which is
+%% the maximum time for the after clause of a receive
+%% operation, at the time of this writing.
+sleep2(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ Pid = spawn_link(
+ fun () ->
+ {ok, {once, _}} = timer:kill_after(1000),
+ ok = timer:sleep(16#ffffffff+1)
+ end
+ ),
+ ok = get_mess(2000, {'EXIT', Pid, killed}).
%% Test sleep/1 and tc/3.
tc(Config) when is_list(Config) ->
@@ -220,7 +455,7 @@ tc(Config) when is_list(Config) ->
end,
%% tc/2
- {Res2, ok} = timer:tc(fun(T) -> timer:sleep(T) end, [500]),
+ {Res2, ok} = timer:tc(fun(T) -> ok = timer:sleep(T) end, [500]),
ok = if
Res2 < 500*1000 -> {too_early, Res2}; % Too early
Res2 > 800*1000 -> {too_late, Res2}; % Too much time
@@ -228,7 +463,7 @@ tc(Config) when is_list(Config) ->
end,
%% tc/1
- {Res3, ok} = timer:tc(fun() -> timer:sleep(500) end),
+ {Res3, ok} = timer:tc(fun() -> ok = timer:sleep(500) end),
ok = if
Res3 < 500*1000 -> {too_early, Res3}; % Too early
Res3 > 800*1000 -> {too_late, Res3}; % Too much time
@@ -293,19 +528,19 @@ set_and_cancel_one_shots(0) ->
set_and_cancel_one_shots(N) ->
{ok, Ref} = timer:send_after(7000, self(), kalle),
%% Cancel twice
- timer:cancel(Ref),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
set_and_cancel_one_shots(N-1).
cancel([T| Ts]) ->
- timer:cancel(T),
+ {ok, cancel} = timer:cancel(T),
cancel(Ts);
cancel([]) ->
ok.
num_timers() ->
- {{_, TotalTimers},{_, _IntervalTimers}} = timer:get_status(),
- TotalTimers.
+ Tab = sys:get_state(timer_server),
+ ets:info(Tab, size).
receive_nisse() ->
receive
@@ -326,7 +561,7 @@ get_mess(Time, Mess, N) ->
end.
forever() ->
- timer:sleep(1000),
+ ok = timer:sleep(1000),
forever().
@@ -395,7 +630,7 @@ timer(apply, Mod, T, Pid) ->
Pid ! {self(), ok, (After-Before) div 1000, T}
after T*3 + 300 -> % Watch dog
io:format("WARNING TIMER WATCHDOG timed out: ~w ~n", [T]),
- timer:cancel(Ref),
+ {ok, cancel} = timer:cancel(Ref),
Pid ! {self(), watch_dog_timed_out}
end.
diff --git a/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt b/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt
index 5baf292a07..eff2fd33b0 100644
--- a/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt
+++ b/lib/stdlib/test/unicode_util_SUITE_data/GraphemeBreakTest.txt
@@ -1,6 +1,6 @@
-# GraphemeBreakTest-13.0.0.txt
-# Date: 2019-11-15, 19:49:10 GMT
-# © 2019 Unicode®, Inc.
+# GraphemeBreakTest-14.0.0.txt
+# Date: 2021-03-08, 06:22:32 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt b/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt
index d8666c458f..8d1cef0f78 100644
--- a/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt
+++ b/lib/stdlib/test/unicode_util_SUITE_data/LineBreakTest.txt
@@ -1,6 +1,6 @@
-# LineBreakTest-13.0.0.txt
-# Date: 2019-11-21, 16:13:36 GMT
-# © 2019 Unicode®, Inc.
+# LineBreakTest-14.0.0.txt
+# Date: 2021-08-20, 21:08:45 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -1846,9 +1846,9 @@
× AC00 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× AC00 × 0308 ÷ 2329 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× AC00 × 0308 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
-× AC00 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× AC00 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× AC00 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× AC00 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× AC00 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× AC00 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× AC00 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× AC00 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GA (H2) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
@@ -2018,9 +2018,9 @@
× AC01 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× AC01 × 0308 ÷ 2329 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× AC01 × 0308 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
-× AC01 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× AC01 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× AC01 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× AC01 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× AC01 × 0308 × 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× AC01 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× AC01 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× AC01 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL SYLLABLE GAG (H3) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
@@ -3050,9 +3050,9 @@
× 1100 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× 1100 × 0308 ÷ 2329 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× 1100 × 0308 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
-× 1100 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 1100 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× 1100 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 1100 × 0308 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 1100 × 0308 × 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× 1100 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 1100 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1100 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL CHOSEONG KIYEOK (JL) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
@@ -3222,9 +3222,9 @@
× 11A8 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× 11A8 × 0308 ÷ 2329 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× 11A8 × 0308 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
-× 11A8 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 11A8 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× 11A8 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 11A8 × 0308 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 11A8 × 0308 × 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× 11A8 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 11A8 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 11A8 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
@@ -3394,9 +3394,9 @@
× 1160 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× 1160 × 0308 ÷ 2329 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
× 1160 × 0308 × 0020 ÷ 2329 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] LEFT-POINTING ANGLE BRACKET (OP) ÷ [0.3]
-× 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× 1160 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
-× 1160 × 0308 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
+× 1160 × 0308 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
× 1160 × 0308 × 0020 ÷ 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] PERCENT SIGN (PO) ÷ [0.3]
× 1160 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) ÷ [999.0] DOLLAR SIGN (PR) ÷ [0.3]
× 1160 × 0020 ÷ 0024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [7.01] SPACE (SP) ÷ [18.0] DOLLAR SIGN (PR) ÷ [0.3]
@@ -4538,13 +4538,13 @@
× 0024 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
× 0024 × 0308 × 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [12.2] NO-BREAK SPACE (GL) ÷ [0.3]
× 0024 × 0308 × 0020 ÷ 00A0 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] NO-BREAK SPACE (GL) ÷ [0.3]
-× 0024 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0024 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0024 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0024 × 0308 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL SYLLABLE GA (H2) ÷ [0.3]
+× 0024 × 0308 × AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] HANGUL SYLLABLE GA (H2) ÷ [0.3]
× 0024 × 0308 × 0020 ÷ AC00 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GA (H2) ÷ [0.3]
-× 0024 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0024 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0024 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
-× 0024 × 0308 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
+× 0024 × 0308 × AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0024 × 0308 × 0020 ÷ AC01 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL SYLLABLE GAG (H3) ÷ [0.3]
× 0024 × 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [24.02] HEBREW LETTER ALEF (HL) ÷ [0.3]
× 0024 × 0020 ÷ 05D0 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HEBREW LETTER ALEF (HL) ÷ [0.3]
@@ -4566,17 +4566,17 @@
× 0024 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
× 0024 × 0308 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [13.03] COMMA (IS) ÷ [0.3]
× 0024 × 0308 × 0020 × 002C ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) × [13.02] COMMA (IS) ÷ [0.3]
-× 0024 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0024 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0024 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0024 × 0308 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
+× 0024 × 0308 × 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
× 0024 × 0308 × 0020 ÷ 1100 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL CHOSEONG KIYEOK (JL) ÷ [0.3]
-× 0024 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0024 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0024 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0024 × 0308 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
+× 0024 × 0308 × 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 0024 × 0308 × 0020 ÷ 11A8 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
-× 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0024 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 0024 × 0308 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 0024 × 0308 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [27.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0024 × 0308 × 0020 ÷ 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 0024 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
× 0024 × 0020 × 000A ÷ # × [0.3] DOLLAR SIGN (PR) × [7.01] SPACE (SP) × [6.0] <LINE FEED (LF)> (LF) ÷ [0.3]
@@ -5838,9 +5838,9 @@
× 261D × 0020 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
× 261D × 0308 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) ÷ [999.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
× 261D × 0308 × 0020 ÷ 261D ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] WHITE UP POINTING INDEX (EB) ÷ [0.3]
-× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.21] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
× 261D × 0020 ÷ 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
-× 261D × 0308 × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 261D × 0308 × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [30.21] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
× 261D × 0308 × 0020 ÷ 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [9.0] COMBINING DIAERESIS (CM1_CM) × [7.01] SPACE (SP) ÷ [18.0] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
× 261D × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [13.02] RIGHT PARENTHESIS (CP_CP30) ÷ [0.3]
× 261D × 0020 × 0029 ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [7.01] SPACE (SP) × [13.02] RIGHT PARENTHESIS (CP_CP30) ÷ [0.3]
@@ -7452,9 +7452,9 @@
× 1160 × 1160 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [26.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
× 11A8 × 11A8 ÷ # × [0.3] HANGUL JONGSEONG KIYEOK (JT) × [26.03] HANGUL JONGSEONG KIYEOK (JT) ÷ [0.3]
× 1160 × 2024 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [22.0] ONE DOT LEADER (IN) ÷ [0.3]
-× 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.02] PERCENT SIGN (PO) ÷ [0.3]
-× 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.03] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
-× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.2] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
+× 1160 × 0025 ÷ # × [0.3] HANGUL JUNGSEONG FILLER (JV) × [27.01] PERCENT SIGN (PO) ÷ [0.3]
+× 0024 × 1160 ÷ # × [0.3] DOLLAR SIGN (PR) × [27.02] HANGUL JUNGSEONG FILLER (JV) ÷ [0.3]
+× 261D × 1F3FB ÷ # × [0.3] WHITE UP POINTING INDEX (EB) × [30.21] EMOJI MODIFIER FITZPATRICK TYPE-1-2 (EM) ÷ [0.3]
× 0066 × 0069 × 006E × 0061 × 006C ÷ # × [0.3] LATIN SMALL LETTER F (AL) × [28.0] LATIN SMALL LETTER I (AL) × [28.0] LATIN SMALL LETTER N (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER L (AL) ÷ [0.3]
× 0063 × 0061 × 006E × 0027 × 0074 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] APOSTROPHE (QU) × [19.02] LATIN SMALL LETTER T (AL) ÷ [0.3]
× 0063 × 0061 × 006E × 2019 × 0074 ÷ # × [0.3] LATIN SMALL LETTER C (AL) × [28.0] LATIN SMALL LETTER A (AL) × [28.0] LATIN SMALL LETTER N (AL) × [19.01] RIGHT SINGLE QUOTATION MARK (QU) × [19.02] LATIN SMALL LETTER T (AL) ÷ [0.3]
@@ -7678,7 +7678,9 @@
× 1F1F7 × 1F1FA ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) ÷ [30.13] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3]
× 1F1F7 × 1F1FA × 200B ÷ 1F1F8 × 1F1EA ÷ # × [0.3] REGIONAL INDICATOR SYMBOL LETTER R (RI) × [30.11] REGIONAL INDICATOR SYMBOL LETTER U (RI) × [7.02] ZERO WIDTH SPACE (ZW) ÷ [8.0] REGIONAL INDICATOR SYMBOL LETTER S (RI) × [30.12] REGIONAL INDICATOR SYMBOL LETTER E (RI) ÷ [0.3]
× 05D0 × 002D × 05D0 ÷ # × [0.3] HEBREW LETTER ALEF (HL) × [21.02] HYPHEN-MINUS (HY) × [21.1] HEBREW LETTER ALEF (HL) ÷ [0.3]
+× 1F02C × 1F3FF ÷ # × [0.3] <reserved-1F02C> (Other) × [30.22] EMOJI MODIFIER FITZPATRICK TYPE-6 (EM) ÷ [0.3]
+× 00A9 ÷ 1F3FF ÷ # × [0.3] COPYRIGHT SIGN (AL) ÷ [999.0] EMOJI MODIFIER FITZPATRICK TYPE-6 (EM) ÷ [0.3]
#
-# Lines: 7652
+# Lines: 7654
#
# EOF
diff --git a/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt b/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt
index fa9b0d954c..302c35f37c 100644
--- a/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt
+++ b/lib/stdlib/test/unicode_util_SUITE_data/NormalizationTest.txt
@@ -1,6 +1,6 @@
-# NormalizationTest-13.0.0.txt
-# Date: 2019-09-08, 23:31:12 GMT
-# © 2019 Unicode®, Inc.
+# NormalizationTest-14.0.0.txt
+# Date: 2021-05-28, 21:49:12 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -2409,6 +2409,9 @@
A69C;A69C;A69C;044A;044A; # (ꚜ; ꚜ; ꚜ; ъ; ъ; ) MODIFIER LETTER CYRILLIC HARD SIGN
A69D;A69D;A69D;044C;044C; # (êš; êš; êš; ÑŒ; ÑŒ; ) MODIFIER LETTER CYRILLIC SOFT SIGN
A770;A770;A770;A76F;A76F; # (ê°; ê°; ê°; ê¯; ê¯; ) MODIFIER LETTER US
+A7F2;A7F2;A7F2;0043;0043; # (ꟲ; ꟲ; ꟲ; C; C; ) MODIFIER LETTER CAPITAL C
+A7F3;A7F3;A7F3;0046;0046; # (ꟳ; ꟳ; ꟳ; F; F; ) MODIFIER LETTER CAPITAL F
+A7F4;A7F4;A7F4;0051;0051; # (ꟴ; ꟴ; ꟴ; Q; Q; ) MODIFIER LETTER CAPITAL Q
A7F8;A7F8;A7F8;0126;0126; # (ꟸ; ꟸ; ꟸ; Ħ; Ħ; ) MODIFIER LETTER CAPITAL H WITH STROKE
A7F9;A7F9;A7F9;0153;0153; # (ꟹ; ꟹ; ꟹ; œ; œ; ) MODIFIER LETTER SMALL LIGATURE OE
AB5C;AB5C;AB5C;A727;A727; # (ꭜ; ꭜ; ꭜ; ꜧ; ꜧ; ) MODIFIER LETTER SMALL HENG
@@ -15127,6 +15130,62 @@ FFEB;FFEB;FFEB;2192;2192; # (→; →; →; →; →; ) HALFWIDTH RIGHTWARDS ARR
FFEC;FFEC;FFEC;2193;2193; # (↓; ↓; ↓; ↓; ↓; ) HALFWIDTH DOWNWARDS ARROW
FFED;FFED;FFED;25A0;25A0; # (ï¿­; ï¿­; ï¿­; â– ; â– ; ) HALFWIDTH BLACK SQUARE
FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
+10781;10781;10781;02D0;02D0; # (ðž; ðž; ðž; Ë; Ë; ) MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON
+10782;10782;10782;02D1;02D1; # (ðž‚; ðž‚; ðž‚; Ë‘; Ë‘; ) MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON
+10783;10783;10783;00E6;00E6; # (ðžƒ; ðžƒ; ðžƒ; æ; æ; ) MODIFIER LETTER SMALL AE
+10784;10784;10784;0299;0299; # (ðž„; ðž„; ðž„; Ê™; Ê™; ) MODIFIER LETTER SMALL CAPITAL B
+10785;10785;10785;0253;0253; # (ðž…; ðž…; ðž…; É“; É“; ) MODIFIER LETTER SMALL B WITH HOOK
+10787;10787;10787;02A3;02A3; # (ðž‡; ðž‡; ðž‡; Ê£; Ê£; ) MODIFIER LETTER SMALL DZ DIGRAPH
+10788;10788;10788;AB66;AB66; # (ðžˆ; ðžˆ; ðžˆ; ê­¦; ê­¦; ) MODIFIER LETTER SMALL DZ DIGRAPH WITH RETROFLEX HOOK
+10789;10789;10789;02A5;02A5; # (ðž‰; ðž‰; ðž‰; Ê¥; Ê¥; ) MODIFIER LETTER SMALL DZ DIGRAPH WITH CURL
+1078A;1078A;1078A;02A4;02A4; # (ðžŠ; ðžŠ; ðžŠ; ʤ; ʤ; ) MODIFIER LETTER SMALL DEZH DIGRAPH
+1078B;1078B;1078B;0256;0256; # (ðž‹; ðž‹; ðž‹; É–; É–; ) MODIFIER LETTER SMALL D WITH TAIL
+1078C;1078C;1078C;0257;0257; # (ðžŒ; ðžŒ; ðžŒ; É—; É—; ) MODIFIER LETTER SMALL D WITH HOOK
+1078D;1078D;1078D;1D91;1D91; # (ðž; ðž; ðž; ᶑ; ᶑ; ) MODIFIER LETTER SMALL D WITH HOOK AND TAIL
+1078E;1078E;1078E;0258;0258; # (ðžŽ; ðžŽ; ðžŽ; ɘ; ɘ; ) MODIFIER LETTER SMALL REVERSED E
+1078F;1078F;1078F;025E;025E; # (ðž; ðž; ðž; Éž; Éž; ) MODIFIER LETTER SMALL CLOSED REVERSED OPEN E
+10790;10790;10790;02A9;02A9; # (ðž; ðž; ðž; Ê©; Ê©; ) MODIFIER LETTER SMALL FENG DIGRAPH
+10791;10791;10791;0264;0264; # (ðž‘; ðž‘; ðž‘; ɤ; ɤ; ) MODIFIER LETTER SMALL RAMS HORN
+10792;10792;10792;0262;0262; # (ðž’; ðž’; ðž’; É¢; É¢; ) MODIFIER LETTER SMALL CAPITAL G
+10793;10793;10793;0260;0260; # (ðž“; ðž“; ðž“; É ; É ; ) MODIFIER LETTER SMALL G WITH HOOK
+10794;10794;10794;029B;029B; # (ðž”; ðž”; ðž”; Ê›; Ê›; ) MODIFIER LETTER SMALL CAPITAL G WITH HOOK
+10795;10795;10795;0127;0127; # (ðž•; ðž•; ðž•; ħ; ħ; ) MODIFIER LETTER SMALL H WITH STROKE
+10796;10796;10796;029C;029C; # (ðž–; ðž–; ðž–; Êœ; Êœ; ) MODIFIER LETTER SMALL CAPITAL H
+10797;10797;10797;0267;0267; # (ðž—; ðž—; ðž—; ɧ; ɧ; ) MODIFIER LETTER SMALL HENG WITH HOOK
+10798;10798;10798;0284;0284; # (ðž˜; ðž˜; ðž˜; Ê„; Ê„; ) MODIFIER LETTER SMALL DOTLESS J WITH STROKE AND HOOK
+10799;10799;10799;02AA;02AA; # (ðž™; ðž™; ðž™; ʪ; ʪ; ) MODIFIER LETTER SMALL LS DIGRAPH
+1079A;1079A;1079A;02AB;02AB; # (ðžš; ðžš; ðžš; Ê«; Ê«; ) MODIFIER LETTER SMALL LZ DIGRAPH
+1079B;1079B;1079B;026C;026C; # (ðž›; ðž›; ðž›; ɬ; ɬ; ) MODIFIER LETTER SMALL L WITH BELT
+1079C;1079C;1079C;1DF04;1DF04; # (ðžœ; ðžœ; ðžœ; ð¼„; ð¼„; ) MODIFIER LETTER SMALL CAPITAL L WITH BELT
+1079D;1079D;1079D;A78E;A78E; # (ðž; ðž; ðž; ꞎ; ꞎ; ) MODIFIER LETTER SMALL L WITH RETROFLEX HOOK AND BELT
+1079E;1079E;1079E;026E;026E; # (ðžž; ðžž; ðžž; É®; É®; ) MODIFIER LETTER SMALL LEZH
+1079F;1079F;1079F;1DF05;1DF05; # (ðžŸ; ðžŸ; ðžŸ; ð¼…; ð¼…; ) MODIFIER LETTER SMALL LEZH WITH RETROFLEX HOOK
+107A0;107A0;107A0;028E;028E; # (ðž ; ðž ; ðž ; ÊŽ; ÊŽ; ) MODIFIER LETTER SMALL TURNED Y
+107A1;107A1;107A1;1DF06;1DF06; # (ðž¡; ðž¡; ðž¡; ð¼†; ð¼†; ) MODIFIER LETTER SMALL TURNED Y WITH BELT
+107A2;107A2;107A2;00F8;00F8; # (ðž¢; ðž¢; ðž¢; ø; ø; ) MODIFIER LETTER SMALL O WITH STROKE
+107A3;107A3;107A3;0276;0276; # (ðž£; ðž£; ðž£; ɶ; ɶ; ) MODIFIER LETTER SMALL CAPITAL OE
+107A4;107A4;107A4;0277;0277; # (ðž¤; ðž¤; ðž¤; É·; É·; ) MODIFIER LETTER SMALL CLOSED OMEGA
+107A5;107A5;107A5;0071;0071; # (ðž¥; ðž¥; ðž¥; q; q; ) MODIFIER LETTER SMALL Q
+107A6;107A6;107A6;027A;027A; # (ðž¦; ðž¦; ðž¦; ɺ; ɺ; ) MODIFIER LETTER SMALL TURNED R WITH LONG LEG
+107A7;107A7;107A7;1DF08;1DF08; # (ðž§; ðž§; ðž§; ð¼ˆ; ð¼ˆ; ) MODIFIER LETTER SMALL TURNED R WITH LONG LEG AND RETROFLEX HOOK
+107A8;107A8;107A8;027D;027D; # (ðž¨; ðž¨; ðž¨; ɽ; ɽ; ) MODIFIER LETTER SMALL R WITH TAIL
+107A9;107A9;107A9;027E;027E; # (ðž©; ðž©; ðž©; ɾ; ɾ; ) MODIFIER LETTER SMALL R WITH FISHHOOK
+107AA;107AA;107AA;0280;0280; # (ðžª; ðžª; ðžª; Ê€; Ê€; ) MODIFIER LETTER SMALL CAPITAL R
+107AB;107AB;107AB;02A8;02A8; # (ðž«; ðž«; ðž«; ʨ; ʨ; ) MODIFIER LETTER SMALL TC DIGRAPH WITH CURL
+107AC;107AC;107AC;02A6;02A6; # (ðž¬; ðž¬; ðž¬; ʦ; ʦ; ) MODIFIER LETTER SMALL TS DIGRAPH
+107AD;107AD;107AD;AB67;AB67; # (ðž­; ðž­; ðž­; ê­§; ê­§; ) MODIFIER LETTER SMALL TS DIGRAPH WITH RETROFLEX HOOK
+107AE;107AE;107AE;02A7;02A7; # (ðž®; ðž®; ðž®; ʧ; ʧ; ) MODIFIER LETTER SMALL TESH DIGRAPH
+107AF;107AF;107AF;0288;0288; # (ðž¯; ðž¯; ðž¯; ʈ; ʈ; ) MODIFIER LETTER SMALL T WITH RETROFLEX HOOK
+107B0;107B0;107B0;2C71;2C71; # (ðž°; ðž°; ðž°; â±±; â±±; ) MODIFIER LETTER SMALL V WITH RIGHT HOOK
+107B2;107B2;107B2;028F;028F; # (ðž²; ðž²; ðž²; Ê; Ê; ) MODIFIER LETTER SMALL CAPITAL Y
+107B3;107B3;107B3;02A1;02A1; # (ðž³; ðž³; ðž³; Ê¡; Ê¡; ) MODIFIER LETTER GLOTTAL STOP WITH STROKE
+107B4;107B4;107B4;02A2;02A2; # (ðž´; ðž´; ðž´; Ê¢; Ê¢; ) MODIFIER LETTER REVERSED GLOTTAL STOP WITH STROKE
+107B5;107B5;107B5;0298;0298; # (ðžµ; ðžµ; ðžµ; ʘ; ʘ; ) MODIFIER LETTER BILABIAL CLICK
+107B6;107B6;107B6;01C0;01C0; # (ðž¶; ðž¶; ðž¶; Ç€; Ç€; ) MODIFIER LETTER DENTAL CLICK
+107B7;107B7;107B7;01C1;01C1; # (ðž·; ðž·; ðž·; Ç; Ç; ) MODIFIER LETTER LATERAL CLICK
+107B8;107B8;107B8;01C2;01C2; # (ðž¸; ðž¸; ðž¸; Ç‚; Ç‚; ) MODIFIER LETTER ALVEOLAR CLICK
+107B9;107B9;107B9;1DF0A;1DF0A; # (ðž¹; ðž¹; ðž¹; ð¼Š; ð¼Š; ) MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK
+107BA;107BA;107BA;1DF1E;1DF1E; # (ðžº; ðžº; ðžº; ð¼ž; ð¼ž; ) MODIFIER LETTER SMALL S WITH CURL
1109A;1109A;11099 110BA;1109A;11099 110BA; # (𑂚; 𑂚; 𑂙◌𑂺; 𑂚; 𑂙◌𑂺; ) KAITHI LETTER DDDHA
1109C;1109C;1109B 110BA;1109C;1109B 110BA; # (𑂜; 𑂜; 𑂛◌𑂺; 𑂜; 𑂛◌𑂺; ) KAITHI LETTER RHA
110AB;110AB;110A5 110BA;110AB;110A5 110BA; # (𑂫; 𑂫; 𑂥◌𑂺; 𑂫; 𑂥◌𑂺; ) KAITHI LETTER VA
@@ -17025,66 +17084,66 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0314 0315 0300 05AE 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062;0061 05AE 0314 0300 0315 0062; # (a◌̔◌̕◌̀◌֮b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; a◌֮◌̔◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING REVERSED COMMA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 035C 0315 0300 0315 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062; # (a◌͜◌̕◌̀◌̕b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B
0061 0315 035C 0315 0300 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062;00E0 0315 0315 035C 0062;0061 0300 0315 0315 035C 0062; # (a◌̕◌͜◌̕◌̀b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; à◌̕◌̕◌͜b; a◌̀◌̕◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B
-0061 059A 0316 302A 0316 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062; # (a◌֚◌̖◌〪◌̖b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B
-0061 0316 059A 0316 302A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062;0061 302A 0316 0316 059A 0062; # (a◌̖◌֚◌̖◌〪b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; a◌〪◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0317 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062;0061 302A 0316 0317 059A 0062; # (a◌֚◌̖◌〪◌̗b; a◌〪◌̖◌̗◌֚b; a◌〪◌̖◌̗◌֚b; a◌〪◌̖◌̗◌֚b; a◌〪◌̖◌̗◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING ACUTE ACCENT BELOW, LATIN SMALL LETTER B
-0061 0317 059A 0316 302A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062;0061 302A 0317 0316 059A 0062; # (a◌̗◌֚◌̖◌〪b; a◌〪◌̗◌̖◌֚b; a◌〪◌̗◌̖◌֚b; a◌〪◌̗◌̖◌֚b; a◌〪◌̗◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ACUTE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0318 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062;0061 302A 0316 0318 059A 0062; # (a◌֚◌̖◌〪◌̘b; a◌〪◌̖◌̘◌֚b; a◌〪◌̖◌̘◌֚b; a◌〪◌̖◌̘◌֚b; a◌〪◌̖◌̘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT TACK BELOW, LATIN SMALL LETTER B
-0061 0318 059A 0316 302A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062;0061 302A 0318 0316 059A 0062; # (a◌̘◌֚◌̖◌〪b; a◌〪◌̘◌̖◌֚b; a◌〪◌̘◌̖◌֚b; a◌〪◌̘◌̖◌֚b; a◌〪◌̘◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0319 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062;0061 302A 0316 0319 059A 0062; # (a◌֚◌̖◌〪◌̙b; a◌〪◌̖◌̙◌֚b; a◌〪◌̖◌̙◌֚b; a◌〪◌̖◌̙◌֚b; a◌〪◌̖◌̙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT TACK BELOW, LATIN SMALL LETTER B
-0061 0319 059A 0316 302A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062;0061 302A 0319 0316 059A 0062; # (a◌̙◌֚◌̖◌〪b; a◌〪◌̙◌̖◌֚b; a◌〪◌̙◌̖◌֚b; a◌〪◌̙◌̖◌֚b; a◌〪◌̙◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0316 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062; # (a◌֚◌̖◌᷺◌̖b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B
+0061 0316 059A 0316 1DFA 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062;0061 1DFA 0316 0316 059A 0062; # (a◌̖◌֚◌̖◌᷺b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; a◌᷺◌̖◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0317 0062;0061 1DFA 0316 0317 059A 0062;0061 1DFA 0316 0317 059A 0062;0061 1DFA 0316 0317 059A 0062;0061 1DFA 0316 0317 059A 0062; # (a◌֚◌̖◌᷺◌̗b; a◌᷺◌̖◌̗◌֚b; a◌᷺◌̖◌̗◌֚b; a◌᷺◌̖◌̗◌֚b; a◌᷺◌̖◌̗◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ACUTE ACCENT BELOW, LATIN SMALL LETTER B
+0061 0317 059A 0316 1DFA 0062;0061 1DFA 0317 0316 059A 0062;0061 1DFA 0317 0316 059A 0062;0061 1DFA 0317 0316 059A 0062;0061 1DFA 0317 0316 059A 0062; # (a◌̗◌֚◌̖◌᷺b; a◌᷺◌̗◌̖◌֚b; a◌᷺◌̗◌̖◌֚b; a◌᷺◌̗◌̖◌֚b; a◌᷺◌̗◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ACUTE ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0318 0062;0061 1DFA 0316 0318 059A 0062;0061 1DFA 0316 0318 059A 0062;0061 1DFA 0316 0318 059A 0062;0061 1DFA 0316 0318 059A 0062; # (a◌֚◌̖◌᷺◌̘b; a◌᷺◌̖◌̘◌֚b; a◌᷺◌̖◌̘◌֚b; a◌᷺◌̖◌̘◌֚b; a◌᷺◌̖◌̘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT TACK BELOW, LATIN SMALL LETTER B
+0061 0318 059A 0316 1DFA 0062;0061 1DFA 0318 0316 059A 0062;0061 1DFA 0318 0316 059A 0062;0061 1DFA 0318 0316 059A 0062;0061 1DFA 0318 0316 059A 0062; # (a◌̘◌֚◌̖◌᷺b; a◌᷺◌̘◌̖◌֚b; a◌᷺◌̘◌̖◌֚b; a◌᷺◌̘◌̖◌֚b; a◌᷺◌̘◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0319 0062;0061 1DFA 0316 0319 059A 0062;0061 1DFA 0316 0319 059A 0062;0061 1DFA 0316 0319 059A 0062;0061 1DFA 0316 0319 059A 0062; # (a◌֚◌̖◌᷺◌̙b; a◌᷺◌̖◌̙◌֚b; a◌᷺◌̖◌̙◌֚b; a◌᷺◌̖◌̙◌֚b; a◌᷺◌̖◌̙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT TACK BELOW, LATIN SMALL LETTER B
+0061 0319 059A 0316 1DFA 0062;0061 1DFA 0319 0316 059A 0062;0061 1DFA 0319 0316 059A 0062;0061 1DFA 0319 0316 059A 0062;0061 1DFA 0319 0316 059A 0062; # (a◌̙◌֚◌̖◌᷺b; a◌᷺◌̙◌̖◌֚b; a◌᷺◌̙◌̖◌֚b; a◌᷺◌̙◌̖◌֚b; a◌᷺◌̙◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 035C 0315 0300 031A 0062;00E0 0315 031A 035C 0062;0061 0300 0315 031A 035C 0062;00E0 0315 031A 035C 0062;0061 0300 0315 031A 035C 0062; # (a◌͜◌̕◌̀◌̚b; à◌̕◌̚◌͜b; a◌̀◌̕◌̚◌͜b; à◌̕◌̚◌͜b; a◌̀◌̕◌̚◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING LEFT ANGLE ABOVE, LATIN SMALL LETTER B
0061 031A 035C 0315 0300 0062;00E0 031A 0315 035C 0062;0061 0300 031A 0315 035C 0062;00E0 031A 0315 035C 0062;0061 0300 031A 0315 035C 0062; # (a◌̚◌͜◌̕◌̀b; à◌̚◌̕◌͜b; a◌̀◌̚◌̕◌͜b; à◌̚◌̕◌͜b; a◌̀◌̚◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING LEFT ANGLE ABOVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 031B 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062; # (a◌〪◌̛◌᷎◌̛b; a◌᷎◌̛◌̛◌〪b; a◌᷎◌̛◌̛◌〪b; a◌᷎◌̛◌̛◌〪b; a◌᷎◌̛◌̛◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, COMBINING HORN, LATIN SMALL LETTER B
-0061 031B 302A 031B 1DCE 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062;0061 1DCE 031B 031B 302A 0062; # (a◌̛◌〪◌̛◌᷎b; a◌᷎◌̛◌̛◌〪b; a◌᷎◌̛◌̛◌〪b; a◌᷎◌̛◌̛◌〪b; a◌᷎◌̛◌̛◌〪b; ) LATIN SMALL LETTER A, COMBINING HORN, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
-0061 059A 0316 302A 031C 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062;0061 302A 0316 031C 059A 0062; # (a◌֚◌̖◌〪◌̜b; a◌〪◌̖◌̜◌֚b; a◌〪◌̖◌̜◌֚b; a◌〪◌̖◌̜◌֚b; a◌〪◌̖◌̜◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT HALF RING BELOW, LATIN SMALL LETTER B
-0061 031C 059A 0316 302A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062;0061 302A 031C 0316 059A 0062; # (a◌̜◌֚◌̖◌〪b; a◌〪◌̜◌̖◌֚b; a◌〪◌̜◌̖◌֚b; a◌〪◌̜◌̖◌֚b; a◌〪◌̜◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 031D 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062;0061 302A 0316 031D 059A 0062; # (a◌֚◌̖◌〪◌Ìb; a◌〪◌̖◌Ì◌֚b; a◌〪◌̖◌Ì◌֚b; a◌〪◌̖◌Ì◌֚b; a◌〪◌̖◌Ì◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING UP TACK BELOW, LATIN SMALL LETTER B
-0061 031D 059A 0316 302A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062;0061 302A 031D 0316 059A 0062; # (aâ—ŒÌ◌֚◌̖◌〪b; a◌〪◌Ì◌̖◌֚b; a◌〪◌Ì◌̖◌֚b; a◌〪◌Ì◌̖◌֚b; a◌〪◌Ì◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UP TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 031E 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062;0061 302A 0316 031E 059A 0062; # (a◌֚◌̖◌〪◌̞b; a◌〪◌̖◌̞◌֚b; a◌〪◌̖◌̞◌֚b; a◌〪◌̖◌̞◌֚b; a◌〪◌̖◌̞◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOWN TACK BELOW, LATIN SMALL LETTER B
-0061 031E 059A 0316 302A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062;0061 302A 031E 0316 059A 0062; # (a◌̞◌֚◌̖◌〪b; a◌〪◌̞◌̖◌֚b; a◌〪◌̞◌̖◌֚b; a◌〪◌̞◌̖◌֚b; a◌〪◌̞◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOWN TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 031F 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062;0061 302A 0316 031F 059A 0062; # (a◌֚◌̖◌〪◌̟b; a◌〪◌̖◌̟◌֚b; a◌〪◌̖◌̟◌֚b; a◌〪◌̖◌̟◌֚b; a◌〪◌̖◌̟◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING PLUS SIGN BELOW, LATIN SMALL LETTER B
-0061 031F 059A 0316 302A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062;0061 302A 031F 0316 059A 0062; # (a◌̟◌֚◌̖◌〪b; a◌〪◌̟◌̖◌֚b; a◌〪◌̟◌̖◌֚b; a◌〪◌̟◌̖◌֚b; a◌〪◌̟◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING PLUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0320 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062;0061 302A 0316 0320 059A 0062; # (a◌֚◌̖◌〪◌̠b; a◌〪◌̖◌̠◌֚b; a◌〪◌̖◌̠◌֚b; a◌〪◌̖◌̠◌֚b; a◌〪◌̖◌̠◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING MINUS SIGN BELOW, LATIN SMALL LETTER B
-0061 0320 059A 0316 302A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062;0061 302A 0320 0316 059A 0062; # (a◌̠◌֚◌̖◌〪b; a◌〪◌̠◌̖◌֚b; a◌〪◌̠◌̖◌֚b; a◌〪◌̠◌̖◌֚b; a◌〪◌̠◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MINUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 031B 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062; # (a◌᷺◌̛◌᷎◌̛b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, COMBINING HORN, LATIN SMALL LETTER B
+0061 031B 1DFA 031B 1DCE 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062;0061 1DCE 031B 031B 1DFA 0062; # (a◌̛◌᷺◌̛◌᷎b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; a◌᷎◌̛◌̛◌᷺b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 031C 0062;0061 1DFA 0316 031C 059A 0062;0061 1DFA 0316 031C 059A 0062;0061 1DFA 0316 031C 059A 0062;0061 1DFA 0316 031C 059A 0062; # (a◌֚◌̖◌᷺◌̜b; a◌᷺◌̖◌̜◌֚b; a◌᷺◌̖◌̜◌֚b; a◌᷺◌̖◌̜◌֚b; a◌᷺◌̖◌̜◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT HALF RING BELOW, LATIN SMALL LETTER B
+0061 031C 059A 0316 1DFA 0062;0061 1DFA 031C 0316 059A 0062;0061 1DFA 031C 0316 059A 0062;0061 1DFA 031C 0316 059A 0062;0061 1DFA 031C 0316 059A 0062; # (a◌̜◌֚◌̖◌᷺b; a◌᷺◌̜◌̖◌֚b; a◌᷺◌̜◌̖◌֚b; a◌᷺◌̜◌̖◌֚b; a◌᷺◌̜◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 031D 0062;0061 1DFA 0316 031D 059A 0062;0061 1DFA 0316 031D 059A 0062;0061 1DFA 0316 031D 059A 0062;0061 1DFA 0316 031D 059A 0062; # (a◌֚◌̖◌᷺◌Ìb; a◌᷺◌̖◌Ì◌֚b; a◌᷺◌̖◌Ì◌֚b; a◌᷺◌̖◌Ì◌֚b; a◌᷺◌̖◌Ì◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING UP TACK BELOW, LATIN SMALL LETTER B
+0061 031D 059A 0316 1DFA 0062;0061 1DFA 031D 0316 059A 0062;0061 1DFA 031D 0316 059A 0062;0061 1DFA 031D 0316 059A 0062;0061 1DFA 031D 0316 059A 0062; # (aâ—ŒÌ◌֚◌̖◌᷺b; a◌᷺◌Ì◌̖◌֚b; a◌᷺◌Ì◌̖◌֚b; a◌᷺◌Ì◌̖◌֚b; a◌᷺◌Ì◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UP TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 031E 0062;0061 1DFA 0316 031E 059A 0062;0061 1DFA 0316 031E 059A 0062;0061 1DFA 0316 031E 059A 0062;0061 1DFA 0316 031E 059A 0062; # (a◌֚◌̖◌᷺◌̞b; a◌᷺◌̖◌̞◌֚b; a◌᷺◌̖◌̞◌֚b; a◌᷺◌̖◌̞◌֚b; a◌᷺◌̖◌̞◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOWN TACK BELOW, LATIN SMALL LETTER B
+0061 031E 059A 0316 1DFA 0062;0061 1DFA 031E 0316 059A 0062;0061 1DFA 031E 0316 059A 0062;0061 1DFA 031E 0316 059A 0062;0061 1DFA 031E 0316 059A 0062; # (a◌̞◌֚◌̖◌᷺b; a◌᷺◌̞◌̖◌֚b; a◌᷺◌̞◌̖◌֚b; a◌᷺◌̞◌̖◌֚b; a◌᷺◌̞◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOWN TACK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 031F 0062;0061 1DFA 0316 031F 059A 0062;0061 1DFA 0316 031F 059A 0062;0061 1DFA 0316 031F 059A 0062;0061 1DFA 0316 031F 059A 0062; # (a◌֚◌̖◌᷺◌̟b; a◌᷺◌̖◌̟◌֚b; a◌᷺◌̖◌̟◌֚b; a◌᷺◌̖◌̟◌֚b; a◌᷺◌̖◌̟◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING PLUS SIGN BELOW, LATIN SMALL LETTER B
+0061 031F 059A 0316 1DFA 0062;0061 1DFA 031F 0316 059A 0062;0061 1DFA 031F 0316 059A 0062;0061 1DFA 031F 0316 059A 0062;0061 1DFA 031F 0316 059A 0062; # (a◌̟◌֚◌̖◌᷺b; a◌᷺◌̟◌̖◌֚b; a◌᷺◌̟◌̖◌֚b; a◌᷺◌̟◌̖◌֚b; a◌᷺◌̟◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING PLUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0320 0062;0061 1DFA 0316 0320 059A 0062;0061 1DFA 0316 0320 059A 0062;0061 1DFA 0316 0320 059A 0062;0061 1DFA 0316 0320 059A 0062; # (a◌֚◌̖◌᷺◌̠b; a◌᷺◌̖◌̠◌֚b; a◌᷺◌̖◌̠◌֚b; a◌᷺◌̖◌̠◌֚b; a◌᷺◌̖◌̠◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MINUS SIGN BELOW, LATIN SMALL LETTER B
+0061 0320 059A 0316 1DFA 0062;0061 1DFA 0320 0316 059A 0062;0061 1DFA 0320 0316 059A 0062;0061 1DFA 0320 0316 059A 0062;0061 1DFA 0320 0316 059A 0062; # (a◌̠◌֚◌̖◌᷺b; a◌᷺◌̠◌̖◌֚b; a◌᷺◌̠◌̖◌֚b; a◌᷺◌̠◌̖◌֚b; a◌᷺◌̠◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MINUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 1DCE 0321 0F74 0321 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062; # (a◌᷎◌̡◌ུ◌̡b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B
0061 0321 1DCE 0321 0F74 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062;0061 0F74 0321 0321 1DCE 0062; # (a◌̡◌᷎◌̡◌ུb; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; a◌ུ◌̡◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING PALATALIZED HOOK BELOW, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B
0061 1DCE 0321 0F74 0322 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062;0061 0F74 0321 0322 1DCE 0062; # (a◌᷎◌̡◌ུ◌̢b; a◌ུ◌̡◌̢◌᷎b; a◌ུ◌̡◌̢◌᷎b; a◌ུ◌̡◌̢◌᷎b; a◌ུ◌̡◌̢◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING RETROFLEX HOOK BELOW, LATIN SMALL LETTER B
0061 0322 1DCE 0321 0F74 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062;0061 0F74 0322 0321 1DCE 0062; # (a◌̢◌᷎◌̡◌ུb; a◌ུ◌̢◌̡◌᷎b; a◌ུ◌̢◌̡◌᷎b; a◌ུ◌̢◌̡◌᷎b; a◌ུ◌̢◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING RETROFLEX HOOK BELOW, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B
-0061 059A 0316 302A 0323 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062;0061 302A 0316 0323 059A 0062; # (a◌֚◌̖◌〪◌̣b; a◌〪◌̖◌̣◌֚b; a◌〪◌̖◌̣◌֚b; a◌〪◌̖◌̣◌֚b; a◌〪◌̖◌̣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOT BELOW, LATIN SMALL LETTER B
-0061 0323 059A 0316 302A 0062;1EA1 302A 0316 059A 0062;0061 302A 0323 0316 059A 0062;1EA1 302A 0316 059A 0062;0061 302A 0323 0316 059A 0062; # (a◌̣◌֚◌̖◌〪b; ạ◌〪◌̖◌֚b; a◌〪◌̣◌̖◌֚b; ạ◌〪◌̖◌֚b; a◌〪◌̣◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0324 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062;0061 302A 0316 0324 059A 0062; # (a◌֚◌̖◌〪◌̤b; a◌〪◌̖◌̤◌֚b; a◌〪◌̖◌̤◌֚b; a◌〪◌̖◌̤◌֚b; a◌〪◌̖◌̤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DIAERESIS BELOW, LATIN SMALL LETTER B
-0061 0324 059A 0316 302A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062;0061 302A 0324 0316 059A 0062; # (a◌̤◌֚◌̖◌〪b; a◌〪◌̤◌̖◌֚b; a◌〪◌̤◌̖◌֚b; a◌〪◌̤◌̖◌֚b; a◌〪◌̤◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DIAERESIS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0325 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062;0061 302A 0316 0325 059A 0062; # (a◌֚◌̖◌〪◌̥b; a◌〪◌̖◌̥◌֚b; a◌〪◌̖◌̥◌֚b; a◌〪◌̖◌̥◌֚b; a◌〪◌̖◌̥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RING BELOW, LATIN SMALL LETTER B
-0061 0325 059A 0316 302A 0062;1E01 302A 0316 059A 0062;0061 302A 0325 0316 059A 0062;1E01 302A 0316 059A 0062;0061 302A 0325 0316 059A 0062; # (a◌̥◌֚◌̖◌〪b; á¸â—Œã€ªâ—ŒÌ–◌֚b; a◌〪◌̥◌̖◌֚b; á¸â—Œã€ªâ—ŒÌ–◌֚b; a◌〪◌̥◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0326 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062;0061 302A 0316 0326 059A 0062; # (a◌֚◌̖◌〪◌̦b; a◌〪◌̖◌̦◌֚b; a◌〪◌̖◌̦◌֚b; a◌〪◌̖◌̦◌֚b; a◌〪◌̖◌̦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING COMMA BELOW, LATIN SMALL LETTER B
-0061 0326 059A 0316 302A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062;0061 302A 0326 0316 059A 0062; # (a◌̦◌֚◌̖◌〪b; a◌〪◌̦◌̖◌֚b; a◌〪◌̦◌̖◌֚b; a◌〪◌̦◌̖◌֚b; a◌〪◌̦◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING COMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0323 0062;0061 1DFA 0316 0323 059A 0062;0061 1DFA 0316 0323 059A 0062;0061 1DFA 0316 0323 059A 0062;0061 1DFA 0316 0323 059A 0062; # (a◌֚◌̖◌᷺◌̣b; a◌᷺◌̖◌̣◌֚b; a◌᷺◌̖◌̣◌֚b; a◌᷺◌̖◌̣◌֚b; a◌᷺◌̖◌̣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOT BELOW, LATIN SMALL LETTER B
+0061 0323 059A 0316 1DFA 0062;1EA1 1DFA 0316 059A 0062;0061 1DFA 0323 0316 059A 0062;1EA1 1DFA 0316 059A 0062;0061 1DFA 0323 0316 059A 0062; # (a◌̣◌֚◌̖◌᷺b; ạ◌᷺◌̖◌֚b; a◌᷺◌̣◌̖◌֚b; ạ◌᷺◌̖◌֚b; a◌᷺◌̣◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0324 0062;0061 1DFA 0316 0324 059A 0062;0061 1DFA 0316 0324 059A 0062;0061 1DFA 0316 0324 059A 0062;0061 1DFA 0316 0324 059A 0062; # (a◌֚◌̖◌᷺◌̤b; a◌᷺◌̖◌̤◌֚b; a◌᷺◌̖◌̤◌֚b; a◌᷺◌̖◌̤◌֚b; a◌᷺◌̖◌̤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DIAERESIS BELOW, LATIN SMALL LETTER B
+0061 0324 059A 0316 1DFA 0062;0061 1DFA 0324 0316 059A 0062;0061 1DFA 0324 0316 059A 0062;0061 1DFA 0324 0316 059A 0062;0061 1DFA 0324 0316 059A 0062; # (a◌̤◌֚◌̖◌᷺b; a◌᷺◌̤◌̖◌֚b; a◌᷺◌̤◌̖◌֚b; a◌᷺◌̤◌̖◌֚b; a◌᷺◌̤◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DIAERESIS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0325 0062;0061 1DFA 0316 0325 059A 0062;0061 1DFA 0316 0325 059A 0062;0061 1DFA 0316 0325 059A 0062;0061 1DFA 0316 0325 059A 0062; # (a◌֚◌̖◌᷺◌̥b; a◌᷺◌̖◌̥◌֚b; a◌᷺◌̖◌̥◌֚b; a◌᷺◌̖◌̥◌֚b; a◌᷺◌̖◌̥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RING BELOW, LATIN SMALL LETTER B
+0061 0325 059A 0316 1DFA 0062;1E01 1DFA 0316 059A 0062;0061 1DFA 0325 0316 059A 0062;1E01 1DFA 0316 059A 0062;0061 1DFA 0325 0316 059A 0062; # (a◌̥◌֚◌̖◌᷺b; á¸â—Œá·ºâ—ŒÌ–◌֚b; a◌᷺◌̥◌̖◌֚b; á¸â—Œá·ºâ—ŒÌ–◌֚b; a◌᷺◌̥◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0326 0062;0061 1DFA 0316 0326 059A 0062;0061 1DFA 0316 0326 059A 0062;0061 1DFA 0316 0326 059A 0062;0061 1DFA 0316 0326 059A 0062; # (a◌֚◌̖◌᷺◌̦b; a◌᷺◌̖◌̦◌֚b; a◌᷺◌̖◌̦◌֚b; a◌᷺◌̖◌̦◌֚b; a◌᷺◌̖◌̦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING COMMA BELOW, LATIN SMALL LETTER B
+0061 0326 059A 0316 1DFA 0062;0061 1DFA 0326 0316 059A 0062;0061 1DFA 0326 0316 059A 0062;0061 1DFA 0326 0316 059A 0062;0061 1DFA 0326 0316 059A 0062; # (a◌̦◌֚◌̖◌᷺b; a◌᷺◌̦◌̖◌֚b; a◌᷺◌̦◌̖◌֚b; a◌᷺◌̦◌̖◌֚b; a◌᷺◌̦◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING COMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 1DCE 0321 0F74 0327 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062;0061 0F74 0321 0327 1DCE 0062; # (a◌᷎◌̡◌ུ◌̧b; a◌ུ◌̡◌̧◌᷎b; a◌ུ◌̡◌̧◌᷎b; a◌ུ◌̡◌̧◌᷎b; a◌ུ◌̡◌̧◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING CEDILLA, LATIN SMALL LETTER B
0061 0327 1DCE 0321 0F74 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062;0061 0F74 0327 0321 1DCE 0062; # (a◌̧◌᷎◌̡◌ུb; a◌ུ◌̧◌̡◌᷎b; a◌ུ◌̧◌̡◌᷎b; a◌ུ◌̧◌̡◌᷎b; a◌ུ◌̧◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING CEDILLA, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B
0061 1DCE 0321 0F74 0328 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062;0061 0F74 0321 0328 1DCE 0062; # (a◌᷎◌̡◌ུ◌̨b; a◌ུ◌̡◌̨◌᷎b; a◌ུ◌̡◌̨◌᷎b; a◌ུ◌̡◌̨◌᷎b; a◌ུ◌̡◌̨◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING OGONEK, LATIN SMALL LETTER B
0061 0328 1DCE 0321 0F74 0062;0105 0F74 0321 1DCE 0062;0061 0F74 0328 0321 1DCE 0062;0105 0F74 0321 1DCE 0062;0061 0F74 0328 0321 1DCE 0062; # (a◌̨◌᷎◌̡◌ུb; ą◌ུ◌̡◌᷎b; a◌ུ◌̨◌̡◌᷎b; ą◌ུ◌̡◌᷎b; a◌ུ◌̨◌̡◌᷎b; ) LATIN SMALL LETTER A, COMBINING OGONEK, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B
-0061 059A 0316 302A 0329 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062;0061 302A 0316 0329 059A 0062; # (a◌֚◌̖◌〪◌̩b; a◌〪◌̖◌̩◌֚b; a◌〪◌̖◌̩◌֚b; a◌〪◌̖◌̩◌֚b; a◌〪◌̖◌̩◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING VERTICAL LINE BELOW, LATIN SMALL LETTER B
-0061 0329 059A 0316 302A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062;0061 302A 0329 0316 059A 0062; # (a◌̩◌֚◌̖◌〪b; a◌〪◌̩◌̖◌֚b; a◌〪◌̩◌̖◌֚b; a◌〪◌̩◌̖◌֚b; a◌〪◌̩◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 032A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062;0061 302A 0316 032A 059A 0062; # (a◌֚◌̖◌〪◌̪b; a◌〪◌̖◌̪◌֚b; a◌〪◌̖◌̪◌֚b; a◌〪◌̖◌̪◌֚b; a◌〪◌̖◌̪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING BRIDGE BELOW, LATIN SMALL LETTER B
-0061 032A 059A 0316 302A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062;0061 302A 032A 0316 059A 0062; # (a◌̪◌֚◌̖◌〪b; a◌〪◌̪◌̖◌֚b; a◌〪◌̪◌̖◌֚b; a◌〪◌̪◌̖◌֚b; a◌〪◌̪◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 032B 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062;0061 302A 0316 032B 059A 0062; # (a◌֚◌̖◌〪◌̫b; a◌〪◌̖◌̫◌֚b; a◌〪◌̖◌̫◌֚b; a◌〪◌̖◌̫◌֚b; a◌〪◌̖◌̫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING INVERTED DOUBLE ARCH BELOW, LATIN SMALL LETTER B
-0061 032B 059A 0316 302A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062;0061 302A 032B 0316 059A 0062; # (a◌̫◌֚◌̖◌〪b; a◌〪◌̫◌̖◌֚b; a◌〪◌̫◌̖◌֚b; a◌〪◌̫◌̖◌֚b; a◌〪◌̫◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED DOUBLE ARCH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 032C 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062;0061 302A 0316 032C 059A 0062; # (a◌֚◌̖◌〪◌̬b; a◌〪◌̖◌̬◌֚b; a◌〪◌̖◌̬◌֚b; a◌〪◌̖◌̬◌֚b; a◌〪◌̖◌̬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING CARON BELOW, LATIN SMALL LETTER B
-0061 032C 059A 0316 302A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062;0061 302A 032C 0316 059A 0062; # (a◌̬◌֚◌̖◌〪b; a◌〪◌̬◌̖◌֚b; a◌〪◌̬◌̖◌֚b; a◌〪◌̬◌̖◌֚b; a◌〪◌̬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CARON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 032D 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062;0061 302A 0316 032D 059A 0062; # (a◌֚◌̖◌〪◌̭b; a◌〪◌̖◌̭◌֚b; a◌〪◌̖◌̭◌֚b; a◌〪◌̖◌̭◌֚b; a◌〪◌̖◌̭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING CIRCUMFLEX ACCENT BELOW, LATIN SMALL LETTER B
-0061 032D 059A 0316 302A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062;0061 302A 032D 0316 059A 0062; # (a◌̭◌֚◌̖◌〪b; a◌〪◌̭◌̖◌֚b; a◌〪◌̭◌̖◌֚b; a◌〪◌̭◌̖◌֚b; a◌〪◌̭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CIRCUMFLEX ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 032E 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062;0061 302A 0316 032E 059A 0062; # (a◌֚◌̖◌〪◌̮b; a◌〪◌̖◌̮◌֚b; a◌〪◌̖◌̮◌֚b; a◌〪◌̖◌̮◌֚b; a◌〪◌̖◌̮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING BREVE BELOW, LATIN SMALL LETTER B
-0061 032E 059A 0316 302A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062;0061 302A 032E 0316 059A 0062; # (a◌̮◌֚◌̖◌〪b; a◌〪◌̮◌̖◌֚b; a◌〪◌̮◌̖◌֚b; a◌〪◌̮◌̖◌֚b; a◌〪◌̮◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 032F 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062;0061 302A 0316 032F 059A 0062; # (a◌֚◌̖◌〪◌̯b; a◌〪◌̖◌̯◌֚b; a◌〪◌̖◌̯◌֚b; a◌〪◌̖◌̯◌֚b; a◌〪◌̖◌̯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING INVERTED BREVE BELOW, LATIN SMALL LETTER B
-0061 032F 059A 0316 302A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062;0061 302A 032F 0316 059A 0062; # (a◌̯◌֚◌̖◌〪b; a◌〪◌̯◌̖◌֚b; a◌〪◌̯◌̖◌֚b; a◌〪◌̯◌̖◌֚b; a◌〪◌̯◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0330 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062;0061 302A 0316 0330 059A 0062; # (a◌֚◌̖◌〪◌̰b; a◌〪◌̖◌̰◌֚b; a◌〪◌̖◌̰◌֚b; a◌〪◌̖◌̰◌֚b; a◌〪◌̖◌̰◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING TILDE BELOW, LATIN SMALL LETTER B
-0061 0330 059A 0316 302A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062;0061 302A 0330 0316 059A 0062; # (a◌̰◌֚◌̖◌〪b; a◌〪◌̰◌̖◌֚b; a◌〪◌̰◌̖◌֚b; a◌〪◌̰◌̖◌֚b; a◌〪◌̰◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0331 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062;0061 302A 0316 0331 059A 0062; # (a◌֚◌̖◌〪◌̱b; a◌〪◌̖◌̱◌֚b; a◌〪◌̖◌̱◌֚b; a◌〪◌̖◌̱◌֚b; a◌〪◌̖◌̱◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING MACRON BELOW, LATIN SMALL LETTER B
-0061 0331 059A 0316 302A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062;0061 302A 0331 0316 059A 0062; # (a◌̱◌֚◌̖◌〪b; a◌〪◌̱◌̖◌֚b; a◌〪◌̱◌̖◌֚b; a◌〪◌̱◌̖◌֚b; a◌〪◌̱◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0332 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062;0061 302A 0316 0332 059A 0062; # (a◌֚◌̖◌〪◌̲b; a◌〪◌̖◌̲◌֚b; a◌〪◌̖◌̲◌֚b; a◌〪◌̖◌̲◌֚b; a◌〪◌̖◌̲◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LOW LINE, LATIN SMALL LETTER B
-0061 0332 059A 0316 302A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062;0061 302A 0332 0316 059A 0062; # (a◌̲◌֚◌̖◌〪b; a◌〪◌̲◌̖◌֚b; a◌〪◌̲◌̖◌֚b; a◌〪◌̲◌̖◌֚b; a◌〪◌̲◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0333 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062;0061 302A 0316 0333 059A 0062; # (a◌֚◌̖◌〪◌̳b; a◌〪◌̖◌̳◌֚b; a◌〪◌̖◌̳◌֚b; a◌〪◌̖◌̳◌֚b; a◌〪◌̖◌̳◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOUBLE LOW LINE, LATIN SMALL LETTER B
-0061 0333 059A 0316 302A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062;0061 302A 0333 0316 059A 0062; # (a◌̳◌֚◌̖◌〪b; a◌〪◌̳◌̖◌֚b; a◌〪◌̳◌̖◌֚b; a◌〪◌̳◌̖◌֚b; a◌〪◌̳◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0329 0062;0061 1DFA 0316 0329 059A 0062;0061 1DFA 0316 0329 059A 0062;0061 1DFA 0316 0329 059A 0062;0061 1DFA 0316 0329 059A 0062; # (a◌֚◌̖◌᷺◌̩b; a◌᷺◌̖◌̩◌֚b; a◌᷺◌̖◌̩◌֚b; a◌᷺◌̖◌̩◌֚b; a◌᷺◌̖◌̩◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING VERTICAL LINE BELOW, LATIN SMALL LETTER B
+0061 0329 059A 0316 1DFA 0062;0061 1DFA 0329 0316 059A 0062;0061 1DFA 0329 0316 059A 0062;0061 1DFA 0329 0316 059A 0062;0061 1DFA 0329 0316 059A 0062; # (a◌̩◌֚◌̖◌᷺b; a◌᷺◌̩◌̖◌֚b; a◌᷺◌̩◌̖◌֚b; a◌᷺◌̩◌̖◌֚b; a◌᷺◌̩◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 032A 0062;0061 1DFA 0316 032A 059A 0062;0061 1DFA 0316 032A 059A 0062;0061 1DFA 0316 032A 059A 0062;0061 1DFA 0316 032A 059A 0062; # (a◌֚◌̖◌᷺◌̪b; a◌᷺◌̖◌̪◌֚b; a◌᷺◌̖◌̪◌֚b; a◌᷺◌̖◌̪◌֚b; a◌᷺◌̖◌̪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING BRIDGE BELOW, LATIN SMALL LETTER B
+0061 032A 059A 0316 1DFA 0062;0061 1DFA 032A 0316 059A 0062;0061 1DFA 032A 0316 059A 0062;0061 1DFA 032A 0316 059A 0062;0061 1DFA 032A 0316 059A 0062; # (a◌̪◌֚◌̖◌᷺b; a◌᷺◌̪◌̖◌֚b; a◌᷺◌̪◌̖◌֚b; a◌᷺◌̪◌̖◌֚b; a◌᷺◌̪◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 032B 0062;0061 1DFA 0316 032B 059A 0062;0061 1DFA 0316 032B 059A 0062;0061 1DFA 0316 032B 059A 0062;0061 1DFA 0316 032B 059A 0062; # (a◌֚◌̖◌᷺◌̫b; a◌᷺◌̖◌̫◌֚b; a◌᷺◌̖◌̫◌֚b; a◌᷺◌̖◌̫◌֚b; a◌᷺◌̖◌̫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING INVERTED DOUBLE ARCH BELOW, LATIN SMALL LETTER B
+0061 032B 059A 0316 1DFA 0062;0061 1DFA 032B 0316 059A 0062;0061 1DFA 032B 0316 059A 0062;0061 1DFA 032B 0316 059A 0062;0061 1DFA 032B 0316 059A 0062; # (a◌̫◌֚◌̖◌᷺b; a◌᷺◌̫◌̖◌֚b; a◌᷺◌̫◌̖◌֚b; a◌᷺◌̫◌̖◌֚b; a◌᷺◌̫◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED DOUBLE ARCH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 032C 0062;0061 1DFA 0316 032C 059A 0062;0061 1DFA 0316 032C 059A 0062;0061 1DFA 0316 032C 059A 0062;0061 1DFA 0316 032C 059A 0062; # (a◌֚◌̖◌᷺◌̬b; a◌᷺◌̖◌̬◌֚b; a◌᷺◌̖◌̬◌֚b; a◌᷺◌̖◌̬◌֚b; a◌᷺◌̖◌̬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING CARON BELOW, LATIN SMALL LETTER B
+0061 032C 059A 0316 1DFA 0062;0061 1DFA 032C 0316 059A 0062;0061 1DFA 032C 0316 059A 0062;0061 1DFA 032C 0316 059A 0062;0061 1DFA 032C 0316 059A 0062; # (a◌̬◌֚◌̖◌᷺b; a◌᷺◌̬◌̖◌֚b; a◌᷺◌̬◌̖◌֚b; a◌᷺◌̬◌̖◌֚b; a◌᷺◌̬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CARON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 032D 0062;0061 1DFA 0316 032D 059A 0062;0061 1DFA 0316 032D 059A 0062;0061 1DFA 0316 032D 059A 0062;0061 1DFA 0316 032D 059A 0062; # (a◌֚◌̖◌᷺◌̭b; a◌᷺◌̖◌̭◌֚b; a◌᷺◌̖◌̭◌֚b; a◌᷺◌̖◌̭◌֚b; a◌᷺◌̖◌̭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING CIRCUMFLEX ACCENT BELOW, LATIN SMALL LETTER B
+0061 032D 059A 0316 1DFA 0062;0061 1DFA 032D 0316 059A 0062;0061 1DFA 032D 0316 059A 0062;0061 1DFA 032D 0316 059A 0062;0061 1DFA 032D 0316 059A 0062; # (a◌̭◌֚◌̖◌᷺b; a◌᷺◌̭◌̖◌֚b; a◌᷺◌̭◌̖◌֚b; a◌᷺◌̭◌̖◌֚b; a◌᷺◌̭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CIRCUMFLEX ACCENT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 032E 0062;0061 1DFA 0316 032E 059A 0062;0061 1DFA 0316 032E 059A 0062;0061 1DFA 0316 032E 059A 0062;0061 1DFA 0316 032E 059A 0062; # (a◌֚◌̖◌᷺◌̮b; a◌᷺◌̖◌̮◌֚b; a◌᷺◌̖◌̮◌֚b; a◌᷺◌̖◌̮◌֚b; a◌᷺◌̖◌̮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING BREVE BELOW, LATIN SMALL LETTER B
+0061 032E 059A 0316 1DFA 0062;0061 1DFA 032E 0316 059A 0062;0061 1DFA 032E 0316 059A 0062;0061 1DFA 032E 0316 059A 0062;0061 1DFA 032E 0316 059A 0062; # (a◌̮◌֚◌̖◌᷺b; a◌᷺◌̮◌̖◌֚b; a◌᷺◌̮◌̖◌֚b; a◌᷺◌̮◌̖◌֚b; a◌᷺◌̮◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 032F 0062;0061 1DFA 0316 032F 059A 0062;0061 1DFA 0316 032F 059A 0062;0061 1DFA 0316 032F 059A 0062;0061 1DFA 0316 032F 059A 0062; # (a◌֚◌̖◌᷺◌̯b; a◌᷺◌̖◌̯◌֚b; a◌᷺◌̖◌̯◌֚b; a◌᷺◌̖◌̯◌֚b; a◌᷺◌̖◌̯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING INVERTED BREVE BELOW, LATIN SMALL LETTER B
+0061 032F 059A 0316 1DFA 0062;0061 1DFA 032F 0316 059A 0062;0061 1DFA 032F 0316 059A 0062;0061 1DFA 032F 0316 059A 0062;0061 1DFA 032F 0316 059A 0062; # (a◌̯◌֚◌̖◌᷺b; a◌᷺◌̯◌̖◌֚b; a◌᷺◌̯◌̖◌֚b; a◌᷺◌̯◌̖◌֚b; a◌᷺◌̯◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BREVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0330 0062;0061 1DFA 0316 0330 059A 0062;0061 1DFA 0316 0330 059A 0062;0061 1DFA 0316 0330 059A 0062;0061 1DFA 0316 0330 059A 0062; # (a◌֚◌̖◌᷺◌̰b; a◌᷺◌̖◌̰◌֚b; a◌᷺◌̖◌̰◌֚b; a◌᷺◌̖◌̰◌֚b; a◌᷺◌̖◌̰◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TILDE BELOW, LATIN SMALL LETTER B
+0061 0330 059A 0316 1DFA 0062;0061 1DFA 0330 0316 059A 0062;0061 1DFA 0330 0316 059A 0062;0061 1DFA 0330 0316 059A 0062;0061 1DFA 0330 0316 059A 0062; # (a◌̰◌֚◌̖◌᷺b; a◌᷺◌̰◌̖◌֚b; a◌᷺◌̰◌̖◌֚b; a◌᷺◌̰◌̖◌֚b; a◌᷺◌̰◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0331 0062;0061 1DFA 0316 0331 059A 0062;0061 1DFA 0316 0331 059A 0062;0061 1DFA 0316 0331 059A 0062;0061 1DFA 0316 0331 059A 0062; # (a◌֚◌̖◌᷺◌̱b; a◌᷺◌̖◌̱◌֚b; a◌᷺◌̖◌̱◌֚b; a◌᷺◌̖◌̱◌֚b; a◌᷺◌̖◌̱◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MACRON BELOW, LATIN SMALL LETTER B
+0061 0331 059A 0316 1DFA 0062;0061 1DFA 0331 0316 059A 0062;0061 1DFA 0331 0316 059A 0062;0061 1DFA 0331 0316 059A 0062;0061 1DFA 0331 0316 059A 0062; # (a◌̱◌֚◌̖◌᷺b; a◌᷺◌̱◌̖◌֚b; a◌᷺◌̱◌̖◌֚b; a◌᷺◌̱◌̖◌֚b; a◌᷺◌̱◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0332 0062;0061 1DFA 0316 0332 059A 0062;0061 1DFA 0316 0332 059A 0062;0061 1DFA 0316 0332 059A 0062;0061 1DFA 0316 0332 059A 0062; # (a◌֚◌̖◌᷺◌̲b; a◌᷺◌̖◌̲◌֚b; a◌᷺◌̖◌̲◌֚b; a◌᷺◌̖◌̲◌֚b; a◌᷺◌̖◌̲◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LOW LINE, LATIN SMALL LETTER B
+0061 0332 059A 0316 1DFA 0062;0061 1DFA 0332 0316 059A 0062;0061 1DFA 0332 0316 059A 0062;0061 1DFA 0332 0316 059A 0062;0061 1DFA 0332 0316 059A 0062; # (a◌̲◌֚◌̖◌᷺b; a◌᷺◌̲◌̖◌֚b; a◌᷺◌̲◌̖◌֚b; a◌᷺◌̲◌̖◌֚b; a◌᷺◌̲◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0333 0062;0061 1DFA 0316 0333 059A 0062;0061 1DFA 0316 0333 059A 0062;0061 1DFA 0316 0333 059A 0062;0061 1DFA 0316 0333 059A 0062; # (a◌֚◌̖◌᷺◌̳b; a◌᷺◌̖◌̳◌֚b; a◌᷺◌̖◌̳◌֚b; a◌᷺◌̖◌̳◌֚b; a◌᷺◌̖◌̳◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE LOW LINE, LATIN SMALL LETTER B
+0061 0333 059A 0316 1DFA 0062;0061 1DFA 0333 0316 059A 0062;0061 1DFA 0333 0316 059A 0062;0061 1DFA 0333 0316 059A 0062;0061 1DFA 0333 0316 059A 0062; # (a◌̳◌֚◌̖◌᷺b; a◌᷺◌̳◌̖◌֚b; a◌᷺◌̳◌̖◌֚b; a◌᷺◌̳◌̖◌֚b; a◌᷺◌̳◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE LOW LINE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 16FF0 0334 0334 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062; # (a𖿰◌̴◌̴b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 0334 16FF0 0334 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062;0061 0334 0334 16FF0 0062; # (a◌̴𖿰◌̴b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; a◌̴◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING TILDE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 16FF0 0334 0335 0062;0061 0334 0335 16FF0 0062;0061 0334 0335 16FF0 0062;0061 0334 0335 16FF0 0062;0061 0334 0335 16FF0 0062; # (a𖿰◌̴◌̵b; a◌̴◌̵𖿰b; a◌̴◌̵𖿰b; a◌̴◌̵𖿰b; a◌̴◌̵𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING SHORT STROKE OVERLAY, LATIN SMALL LETTER B
@@ -17095,14 +17154,14 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0337 16FF0 0334 0062;0061 0337 0334 16FF0 0062;0061 0337 0334 16FF0 0062;0061 0337 0334 16FF0 0062;0061 0337 0334 16FF0 0062; # (a◌̷𖿰◌̴b; a◌̷◌̴𖿰b; a◌̷◌̴𖿰b; a◌̷◌̴𖿰b; a◌̷◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING SHORT SOLIDUS OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 16FF0 0334 0338 0062;0061 0334 0338 16FF0 0062;0061 0334 0338 16FF0 0062;0061 0334 0338 16FF0 0062;0061 0334 0338 16FF0 0062; # (a𖿰◌̴◌̸b; a◌̴◌̸𖿰b; a◌̴◌̸𖿰b; a◌̴◌̸𖿰b; a◌̴◌̸𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LONG SOLIDUS OVERLAY, LATIN SMALL LETTER B
0061 0338 16FF0 0334 0062;0061 0338 0334 16FF0 0062;0061 0338 0334 16FF0 0062;0061 0338 0334 16FF0 0062;0061 0338 0334 16FF0 0062; # (a◌̸𖿰◌̴b; a◌̸◌̴𖿰b; a◌̸◌̴𖿰b; a◌̸◌̴𖿰b; a◌̸◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LONG SOLIDUS OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
-0061 059A 0316 302A 0339 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062;0061 302A 0316 0339 059A 0062; # (a◌֚◌̖◌〪◌̹b; a◌〪◌̖◌̹◌֚b; a◌〪◌̖◌̹◌֚b; a◌〪◌̖◌̹◌֚b; a◌〪◌̖◌̹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT HALF RING BELOW, LATIN SMALL LETTER B
-0061 0339 059A 0316 302A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062;0061 302A 0339 0316 059A 0062; # (a◌̹◌֚◌̖◌〪b; a◌〪◌̹◌̖◌֚b; a◌〪◌̹◌̖◌֚b; a◌〪◌̹◌̖◌֚b; a◌〪◌̹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 033A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062;0061 302A 0316 033A 059A 0062; # (a◌֚◌̖◌〪◌̺b; a◌〪◌̖◌̺◌֚b; a◌〪◌̖◌̺◌֚b; a◌〪◌̖◌̺◌֚b; a◌〪◌̖◌̺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING INVERTED BRIDGE BELOW, LATIN SMALL LETTER B
-0061 033A 059A 0316 302A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062;0061 302A 033A 0316 059A 0062; # (a◌̺◌֚◌̖◌〪b; a◌〪◌̺◌̖◌֚b; a◌〪◌̺◌̖◌֚b; a◌〪◌̺◌̖◌֚b; a◌〪◌̺◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 033B 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062;0061 302A 0316 033B 059A 0062; # (a◌֚◌̖◌〪◌̻b; a◌〪◌̖◌̻◌֚b; a◌〪◌̖◌̻◌֚b; a◌〪◌̖◌̻◌֚b; a◌〪◌̖◌̻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING SQUARE BELOW, LATIN SMALL LETTER B
-0061 033B 059A 0316 302A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062;0061 302A 033B 0316 059A 0062; # (a◌̻◌֚◌̖◌〪b; a◌〪◌̻◌̖◌֚b; a◌〪◌̻◌̖◌֚b; a◌〪◌̻◌̖◌֚b; a◌〪◌̻◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SQUARE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 033C 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062;0061 302A 0316 033C 059A 0062; # (a◌֚◌̖◌〪◌̼b; a◌〪◌̖◌̼◌֚b; a◌〪◌̖◌̼◌֚b; a◌〪◌̖◌̼◌֚b; a◌〪◌̖◌̼◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING SEAGULL BELOW, LATIN SMALL LETTER B
-0061 033C 059A 0316 302A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062;0061 302A 033C 0316 059A 0062; # (a◌̼◌֚◌̖◌〪b; a◌〪◌̼◌̖◌֚b; a◌〪◌̼◌̖◌֚b; a◌〪◌̼◌̖◌֚b; a◌〪◌̼◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SEAGULL BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0339 0062;0061 1DFA 0316 0339 059A 0062;0061 1DFA 0316 0339 059A 0062;0061 1DFA 0316 0339 059A 0062;0061 1DFA 0316 0339 059A 0062; # (a◌֚◌̖◌᷺◌̹b; a◌᷺◌̖◌̹◌֚b; a◌᷺◌̖◌̹◌֚b; a◌᷺◌̖◌̹◌֚b; a◌᷺◌̖◌̹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT HALF RING BELOW, LATIN SMALL LETTER B
+0061 0339 059A 0316 1DFA 0062;0061 1DFA 0339 0316 059A 0062;0061 1DFA 0339 0316 059A 0062;0061 1DFA 0339 0316 059A 0062;0061 1DFA 0339 0316 059A 0062; # (a◌̹◌֚◌̖◌᷺b; a◌᷺◌̹◌̖◌֚b; a◌᷺◌̹◌̖◌֚b; a◌᷺◌̹◌̖◌֚b; a◌᷺◌̹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT HALF RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 033A 0062;0061 1DFA 0316 033A 059A 0062;0061 1DFA 0316 033A 059A 0062;0061 1DFA 0316 033A 059A 0062;0061 1DFA 0316 033A 059A 0062; # (a◌֚◌̖◌᷺◌̺b; a◌᷺◌̖◌̺◌֚b; a◌᷺◌̖◌̺◌֚b; a◌᷺◌̖◌̺◌֚b; a◌᷺◌̖◌̺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING INVERTED BRIDGE BELOW, LATIN SMALL LETTER B
+0061 033A 059A 0316 1DFA 0062;0061 1DFA 033A 0316 059A 0062;0061 1DFA 033A 0316 059A 0062;0061 1DFA 033A 0316 059A 0062;0061 1DFA 033A 0316 059A 0062; # (a◌̺◌֚◌̖◌᷺b; a◌᷺◌̺◌̖◌֚b; a◌᷺◌̺◌̖◌֚b; a◌᷺◌̺◌̖◌֚b; a◌᷺◌̺◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 033B 0062;0061 1DFA 0316 033B 059A 0062;0061 1DFA 0316 033B 059A 0062;0061 1DFA 0316 033B 059A 0062;0061 1DFA 0316 033B 059A 0062; # (a◌֚◌̖◌᷺◌̻b; a◌᷺◌̖◌̻◌֚b; a◌᷺◌̖◌̻◌֚b; a◌᷺◌̖◌̻◌֚b; a◌᷺◌̖◌̻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING SQUARE BELOW, LATIN SMALL LETTER B
+0061 033B 059A 0316 1DFA 0062;0061 1DFA 033B 0316 059A 0062;0061 1DFA 033B 0316 059A 0062;0061 1DFA 033B 0316 059A 0062;0061 1DFA 033B 0316 059A 0062; # (a◌̻◌֚◌̖◌᷺b; a◌᷺◌̻◌̖◌֚b; a◌᷺◌̻◌̖◌֚b; a◌᷺◌̻◌̖◌֚b; a◌᷺◌̻◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SQUARE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 033C 0062;0061 1DFA 0316 033C 059A 0062;0061 1DFA 0316 033C 059A 0062;0061 1DFA 0316 033C 059A 0062;0061 1DFA 0316 033C 059A 0062; # (a◌֚◌̖◌᷺◌̼b; a◌᷺◌̖◌̼◌֚b; a◌᷺◌̖◌̼◌֚b; a◌᷺◌̖◌̼◌֚b; a◌᷺◌̖◌̼◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING SEAGULL BELOW, LATIN SMALL LETTER B
+0061 033C 059A 0316 1DFA 0062;0061 1DFA 033C 0316 059A 0062;0061 1DFA 033C 0316 059A 0062;0061 1DFA 033C 0316 059A 0062;0061 1DFA 033C 0316 059A 0062; # (a◌̼◌֚◌̖◌᷺b; a◌᷺◌̼◌̖◌֚b; a◌᷺◌̼◌̖◌֚b; a◌᷺◌̼◌̖◌֚b; a◌᷺◌̼◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SEAGULL BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 033D 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062;00E0 05AE 033D 0315 0062;0061 05AE 0300 033D 0315 0062; # (a◌̕◌̀◌֮◌̽b; à◌֮◌̽◌̕b; a◌֮◌̀◌̽◌̕b; à◌֮◌̽◌̕b; a◌֮◌̀◌̽◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING X ABOVE, LATIN SMALL LETTER B
0061 033D 0315 0300 05AE 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062;0061 05AE 033D 0300 0315 0062; # (a◌̽◌̕◌̀◌֮b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; a◌֮◌̽◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING X ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 033E 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062;00E0 05AE 033E 0315 0062;0061 05AE 0300 033E 0315 0062; # (a◌̕◌̀◌֮◌̾b; à◌֮◌̾◌̕b; a◌֮◌̀◌̾◌̕b; à◌֮◌̾◌̕b; a◌֮◌̀◌̾◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING VERTICAL TILDE, LATIN SMALL LETTER B
@@ -17123,44 +17182,44 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0345 0345 035D 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062;0061 035D 0345 0345 0062; # (a◌ͅ◌ͅ◌Íb; aâ—ŒÍ◌ͅ◌ͅb; aâ—ŒÍ◌ͅ◌ͅb; aâ—ŒÍ◌ͅ◌ͅb; aâ—ŒÍ◌ͅ◌ͅb; ) LATIN SMALL LETTER A, COMBINING GREEK YPOGEGRAMMENI, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, LATIN SMALL LETTER B
0061 0315 0300 05AE 0346 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062;00E0 05AE 0346 0315 0062;0061 05AE 0300 0346 0315 0062; # (a◌̕◌̀◌֮◌͆b; à◌֮◌͆◌̕b; a◌֮◌̀◌͆◌̕b; à◌֮◌͆◌̕b; a◌֮◌̀◌͆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING BRIDGE ABOVE, LATIN SMALL LETTER B
0061 0346 0315 0300 05AE 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062;0061 05AE 0346 0300 0315 0062; # (a◌͆◌̕◌̀◌֮b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; a◌֮◌͆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING BRIDGE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0347 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062;0061 302A 0316 0347 059A 0062; # (a◌֚◌̖◌〪◌͇b; a◌〪◌̖◌͇◌֚b; a◌〪◌̖◌͇◌֚b; a◌〪◌̖◌͇◌֚b; a◌〪◌̖◌͇◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING EQUALS SIGN BELOW, LATIN SMALL LETTER B
-0061 0347 059A 0316 302A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062;0061 302A 0347 0316 059A 0062; # (a◌͇◌֚◌̖◌〪b; a◌〪◌͇◌̖◌֚b; a◌〪◌͇◌̖◌֚b; a◌〪◌͇◌̖◌֚b; a◌〪◌͇◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING EQUALS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0348 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062;0061 302A 0316 0348 059A 0062; # (a◌֚◌̖◌〪◌͈b; a◌〪◌̖◌͈◌֚b; a◌〪◌̖◌͈◌֚b; a◌〪◌̖◌͈◌֚b; a◌〪◌̖◌͈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOUBLE VERTICAL LINE BELOW, LATIN SMALL LETTER B
-0061 0348 059A 0316 302A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062;0061 302A 0348 0316 059A 0062; # (a◌͈◌֚◌̖◌〪b; a◌〪◌͈◌̖◌֚b; a◌〪◌͈◌̖◌֚b; a◌〪◌͈◌̖◌֚b; a◌〪◌͈◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0349 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062;0061 302A 0316 0349 059A 0062; # (a◌֚◌̖◌〪◌͉b; a◌〪◌̖◌͉◌֚b; a◌〪◌̖◌͉◌֚b; a◌〪◌̖◌͉◌֚b; a◌〪◌̖◌͉◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT ANGLE BELOW, LATIN SMALL LETTER B
-0061 0349 059A 0316 302A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062;0061 302A 0349 0316 059A 0062; # (a◌͉◌֚◌̖◌〪b; a◌〪◌͉◌̖◌֚b; a◌〪◌͉◌̖◌֚b; a◌〪◌͉◌̖◌֚b; a◌〪◌͉◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ANGLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0347 0062;0061 1DFA 0316 0347 059A 0062;0061 1DFA 0316 0347 059A 0062;0061 1DFA 0316 0347 059A 0062;0061 1DFA 0316 0347 059A 0062; # (a◌֚◌̖◌᷺◌͇b; a◌᷺◌̖◌͇◌֚b; a◌᷺◌̖◌͇◌֚b; a◌᷺◌̖◌͇◌֚b; a◌᷺◌̖◌͇◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING EQUALS SIGN BELOW, LATIN SMALL LETTER B
+0061 0347 059A 0316 1DFA 0062;0061 1DFA 0347 0316 059A 0062;0061 1DFA 0347 0316 059A 0062;0061 1DFA 0347 0316 059A 0062;0061 1DFA 0347 0316 059A 0062; # (a◌͇◌֚◌̖◌᷺b; a◌᷺◌͇◌̖◌֚b; a◌᷺◌͇◌̖◌֚b; a◌᷺◌͇◌̖◌֚b; a◌᷺◌͇◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING EQUALS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0348 0062;0061 1DFA 0316 0348 059A 0062;0061 1DFA 0316 0348 059A 0062;0061 1DFA 0316 0348 059A 0062;0061 1DFA 0316 0348 059A 0062; # (a◌֚◌̖◌᷺◌͈b; a◌᷺◌̖◌͈◌֚b; a◌᷺◌̖◌͈◌֚b; a◌᷺◌̖◌͈◌֚b; a◌᷺◌̖◌͈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE VERTICAL LINE BELOW, LATIN SMALL LETTER B
+0061 0348 059A 0316 1DFA 0062;0061 1DFA 0348 0316 059A 0062;0061 1DFA 0348 0316 059A 0062;0061 1DFA 0348 0316 059A 0062;0061 1DFA 0348 0316 059A 0062; # (a◌͈◌֚◌̖◌᷺b; a◌᷺◌͈◌̖◌֚b; a◌᷺◌͈◌̖◌֚b; a◌᷺◌͈◌̖◌֚b; a◌᷺◌͈◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0349 0062;0061 1DFA 0316 0349 059A 0062;0061 1DFA 0316 0349 059A 0062;0061 1DFA 0316 0349 059A 0062;0061 1DFA 0316 0349 059A 0062; # (a◌֚◌̖◌᷺◌͉b; a◌᷺◌̖◌͉◌֚b; a◌᷺◌̖◌͉◌֚b; a◌᷺◌̖◌͉◌֚b; a◌᷺◌̖◌͉◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT ANGLE BELOW, LATIN SMALL LETTER B
+0061 0349 059A 0316 1DFA 0062;0061 1DFA 0349 0316 059A 0062;0061 1DFA 0349 0316 059A 0062;0061 1DFA 0349 0316 059A 0062;0061 1DFA 0349 0316 059A 0062; # (a◌͉◌֚◌̖◌᷺b; a◌᷺◌͉◌̖◌֚b; a◌᷺◌͉◌̖◌֚b; a◌᷺◌͉◌̖◌֚b; a◌᷺◌͉◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ANGLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 034A 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062;00E0 05AE 034A 0315 0062;0061 05AE 0300 034A 0315 0062; # (a◌̕◌̀◌֮◌͊b; à◌֮◌͊◌̕b; a◌֮◌̀◌͊◌̕b; à◌֮◌͊◌̕b; a◌֮◌̀◌͊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING NOT TILDE ABOVE, LATIN SMALL LETTER B
0061 034A 0315 0300 05AE 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062;0061 05AE 034A 0300 0315 0062; # (a◌͊◌̕◌̀◌֮b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; a◌֮◌͊◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING NOT TILDE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 034B 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062;00E0 05AE 034B 0315 0062;0061 05AE 0300 034B 0315 0062; # (a◌̕◌̀◌֮◌͋b; à◌֮◌͋◌̕b; a◌֮◌̀◌͋◌̕b; à◌֮◌͋◌̕b; a◌֮◌̀◌͋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING HOMOTHETIC ABOVE, LATIN SMALL LETTER B
0061 034B 0315 0300 05AE 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062;0061 05AE 034B 0300 0315 0062; # (a◌͋◌̕◌̀◌֮b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; a◌֮◌͋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING HOMOTHETIC ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 034C 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062;00E0 05AE 034C 0315 0062;0061 05AE 0300 034C 0315 0062; # (a◌̕◌̀◌֮◌͌b; à◌֮◌͌◌̕b; a◌֮◌̀◌͌◌̕b; à◌֮◌͌◌̕b; a◌֮◌̀◌͌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ALMOST EQUAL TO ABOVE, LATIN SMALL LETTER B
0061 034C 0315 0300 05AE 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062;0061 05AE 034C 0300 0315 0062; # (a◌͌◌̕◌̀◌֮b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; a◌֮◌͌◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ALMOST EQUAL TO ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 034D 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062;0061 302A 0316 034D 059A 0062; # (a◌֚◌̖◌〪◌Íb; a◌〪◌̖◌Í◌֚b; a◌〪◌̖◌Í◌֚b; a◌〪◌̖◌Í◌֚b; a◌〪◌̖◌Í◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT RIGHT ARROW BELOW, LATIN SMALL LETTER B
-0061 034D 059A 0316 302A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062;0061 302A 034D 0316 059A 0062; # (aâ—ŒÍ◌֚◌̖◌〪b; a◌〪◌Í◌̖◌֚b; a◌〪◌Í◌̖◌֚b; a◌〪◌Í◌̖◌֚b; a◌〪◌Í◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT RIGHT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 034E 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062;0061 302A 0316 034E 059A 0062; # (a◌֚◌̖◌〪◌͎b; a◌〪◌̖◌͎◌֚b; a◌〪◌̖◌͎◌֚b; a◌〪◌̖◌͎◌֚b; a◌〪◌̖◌͎◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING UPWARDS ARROW BELOW, LATIN SMALL LETTER B
-0061 034E 059A 0316 302A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062;0061 302A 034E 0316 059A 0062; # (a◌͎◌֚◌̖◌〪b; a◌〪◌͎◌̖◌֚b; a◌〪◌͎◌̖◌֚b; a◌〪◌͎◌̖◌֚b; a◌〪◌͎◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UPWARDS ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 034D 0062;0061 1DFA 0316 034D 059A 0062;0061 1DFA 0316 034D 059A 0062;0061 1DFA 0316 034D 059A 0062;0061 1DFA 0316 034D 059A 0062; # (a◌֚◌̖◌᷺◌Íb; a◌᷺◌̖◌Í◌֚b; a◌᷺◌̖◌Í◌֚b; a◌᷺◌̖◌Í◌֚b; a◌᷺◌̖◌Í◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT RIGHT ARROW BELOW, LATIN SMALL LETTER B
+0061 034D 059A 0316 1DFA 0062;0061 1DFA 034D 0316 059A 0062;0061 1DFA 034D 0316 059A 0062;0061 1DFA 034D 0316 059A 0062;0061 1DFA 034D 0316 059A 0062; # (aâ—ŒÍ◌֚◌̖◌᷺b; a◌᷺◌Í◌̖◌֚b; a◌᷺◌Í◌̖◌֚b; a◌᷺◌Í◌̖◌֚b; a◌᷺◌Í◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT RIGHT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 034E 0062;0061 1DFA 0316 034E 059A 0062;0061 1DFA 0316 034E 059A 0062;0061 1DFA 0316 034E 059A 0062;0061 1DFA 0316 034E 059A 0062; # (a◌֚◌̖◌᷺◌͎b; a◌᷺◌̖◌͎◌֚b; a◌᷺◌̖◌͎◌֚b; a◌᷺◌̖◌͎◌֚b; a◌᷺◌̖◌͎◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING UPWARDS ARROW BELOW, LATIN SMALL LETTER B
+0061 034E 059A 0316 1DFA 0062;0061 1DFA 034E 0316 059A 0062;0061 1DFA 034E 0316 059A 0062;0061 1DFA 034E 0316 059A 0062;0061 1DFA 034E 0316 059A 0062; # (a◌͎◌֚◌̖◌᷺b; a◌᷺◌͎◌̖◌֚b; a◌᷺◌͎◌̖◌֚b; a◌᷺◌͎◌̖◌֚b; a◌᷺◌͎◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING UPWARDS ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0350 0062;00E0 05AE 0350 0315 0062;0061 05AE 0300 0350 0315 0062;00E0 05AE 0350 0315 0062;0061 05AE 0300 0350 0315 0062; # (a◌̕◌̀◌֮◌Íb; à◌֮◌Í◌̕b; a◌֮◌̀◌Í◌̕b; à◌֮◌Í◌̕b; a◌֮◌̀◌Í◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT ARROWHEAD ABOVE, LATIN SMALL LETTER B
0061 0350 0315 0300 05AE 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062;0061 05AE 0350 0300 0315 0062; # (aâ—ŒÍ◌̕◌̀◌֮b; a◌֮◌Í◌̀◌̕b; a◌֮◌Í◌̀◌̕b; a◌֮◌Í◌̀◌̕b; a◌֮◌Í◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0351 0062;00E0 05AE 0351 0315 0062;0061 05AE 0300 0351 0315 0062;00E0 05AE 0351 0315 0062;0061 05AE 0300 0351 0315 0062; # (a◌̕◌̀◌֮◌͑b; à◌֮◌͑◌̕b; a◌֮◌̀◌͑◌̕b; à◌֮◌͑◌̕b; a◌֮◌̀◌͑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT HALF RING ABOVE, LATIN SMALL LETTER B
0061 0351 0315 0300 05AE 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062;0061 05AE 0351 0300 0315 0062; # (a◌͑◌̕◌̀◌֮b; a◌֮◌͑◌̀◌̕b; a◌֮◌͑◌̀◌̕b; a◌֮◌͑◌̀◌̕b; a◌֮◌͑◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT HALF RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0352 0062;00E0 05AE 0352 0315 0062;0061 05AE 0300 0352 0315 0062;00E0 05AE 0352 0315 0062;0061 05AE 0300 0352 0315 0062; # (a◌̕◌̀◌֮◌͒b; à◌֮◌͒◌̕b; a◌֮◌̀◌͒◌̕b; à◌֮◌͒◌̕b; a◌֮◌̀◌͒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING FERMATA, LATIN SMALL LETTER B
0061 0352 0315 0300 05AE 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062;0061 05AE 0352 0300 0315 0062; # (a◌͒◌̕◌̀◌֮b; a◌֮◌͒◌̀◌̕b; a◌֮◌͒◌̀◌̕b; a◌֮◌͒◌̀◌̕b; a◌֮◌͒◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING FERMATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0353 0062;0061 302A 0316 0353 059A 0062;0061 302A 0316 0353 059A 0062;0061 302A 0316 0353 059A 0062;0061 302A 0316 0353 059A 0062; # (a◌֚◌̖◌〪◌͓b; a◌〪◌̖◌͓◌֚b; a◌〪◌̖◌͓◌֚b; a◌〪◌̖◌͓◌֚b; a◌〪◌̖◌͓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING X BELOW, LATIN SMALL LETTER B
-0061 0353 059A 0316 302A 0062;0061 302A 0353 0316 059A 0062;0061 302A 0353 0316 059A 0062;0061 302A 0353 0316 059A 0062;0061 302A 0353 0316 059A 0062; # (a◌͓◌֚◌̖◌〪b; a◌〪◌͓◌̖◌֚b; a◌〪◌͓◌̖◌֚b; a◌〪◌͓◌̖◌֚b; a◌〪◌͓◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING X BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0354 0062;0061 302A 0316 0354 059A 0062;0061 302A 0316 0354 059A 0062;0061 302A 0316 0354 059A 0062;0061 302A 0316 0354 059A 0062; # (a◌֚◌̖◌〪◌͔b; a◌〪◌̖◌͔◌֚b; a◌〪◌̖◌͔◌֚b; a◌〪◌̖◌͔◌֚b; a◌〪◌̖◌͔◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT ARROWHEAD BELOW, LATIN SMALL LETTER B
-0061 0354 059A 0316 302A 0062;0061 302A 0354 0316 059A 0062;0061 302A 0354 0316 059A 0062;0061 302A 0354 0316 059A 0062;0061 302A 0354 0316 059A 0062; # (a◌͔◌֚◌̖◌〪b; a◌〪◌͔◌̖◌֚b; a◌〪◌͔◌̖◌֚b; a◌〪◌͔◌̖◌֚b; a◌〪◌͔◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0355 0062;0061 302A 0316 0355 059A 0062;0061 302A 0316 0355 059A 0062;0061 302A 0316 0355 059A 0062;0061 302A 0316 0355 059A 0062; # (a◌֚◌̖◌〪◌͕b; a◌〪◌̖◌͕◌֚b; a◌〪◌̖◌͕◌֚b; a◌〪◌̖◌͕◌֚b; a◌〪◌̖◌͕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT ARROWHEAD BELOW, LATIN SMALL LETTER B
-0061 0355 059A 0316 302A 0062;0061 302A 0355 0316 059A 0062;0061 302A 0355 0316 059A 0062;0061 302A 0355 0316 059A 0062;0061 302A 0355 0316 059A 0062; # (a◌͕◌֚◌̖◌〪b; a◌〪◌͕◌̖◌֚b; a◌〪◌͕◌̖◌֚b; a◌〪◌͕◌̖◌֚b; a◌〪◌͕◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0356 0062;0061 302A 0316 0356 059A 0062;0061 302A 0316 0356 059A 0062;0061 302A 0316 0356 059A 0062;0061 302A 0316 0356 059A 0062; # (a◌֚◌̖◌〪◌͖b; a◌〪◌̖◌͖◌֚b; a◌〪◌̖◌͖◌֚b; a◌〪◌̖◌͖◌֚b; a◌〪◌̖◌͖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW, LATIN SMALL LETTER B
-0061 0356 059A 0316 302A 0062;0061 302A 0356 0316 059A 0062;0061 302A 0356 0316 059A 0062;0061 302A 0356 0316 059A 0062;0061 302A 0356 0316 059A 0062; # (a◌͖◌֚◌̖◌〪b; a◌〪◌͖◌̖◌֚b; a◌〪◌͖◌̖◌֚b; a◌〪◌͖◌̖◌֚b; a◌〪◌͖◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0353 0062;0061 1DFA 0316 0353 059A 0062;0061 1DFA 0316 0353 059A 0062;0061 1DFA 0316 0353 059A 0062;0061 1DFA 0316 0353 059A 0062; # (a◌֚◌̖◌᷺◌͓b; a◌᷺◌̖◌͓◌֚b; a◌᷺◌̖◌͓◌֚b; a◌᷺◌̖◌͓◌֚b; a◌᷺◌̖◌͓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING X BELOW, LATIN SMALL LETTER B
+0061 0353 059A 0316 1DFA 0062;0061 1DFA 0353 0316 059A 0062;0061 1DFA 0353 0316 059A 0062;0061 1DFA 0353 0316 059A 0062;0061 1DFA 0353 0316 059A 0062; # (a◌͓◌֚◌̖◌᷺b; a◌᷺◌͓◌̖◌֚b; a◌᷺◌͓◌̖◌֚b; a◌᷺◌͓◌̖◌֚b; a◌᷺◌͓◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING X BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0354 0062;0061 1DFA 0316 0354 059A 0062;0061 1DFA 0316 0354 059A 0062;0061 1DFA 0316 0354 059A 0062;0061 1DFA 0316 0354 059A 0062; # (a◌֚◌̖◌᷺◌͔b; a◌᷺◌̖◌͔◌֚b; a◌᷺◌̖◌͔◌֚b; a◌᷺◌̖◌͔◌֚b; a◌᷺◌̖◌͔◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT ARROWHEAD BELOW, LATIN SMALL LETTER B
+0061 0354 059A 0316 1DFA 0062;0061 1DFA 0354 0316 059A 0062;0061 1DFA 0354 0316 059A 0062;0061 1DFA 0354 0316 059A 0062;0061 1DFA 0354 0316 059A 0062; # (a◌͔◌֚◌̖◌᷺b; a◌᷺◌͔◌̖◌֚b; a◌᷺◌͔◌̖◌֚b; a◌᷺◌͔◌̖◌֚b; a◌᷺◌͔◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0355 0062;0061 1DFA 0316 0355 059A 0062;0061 1DFA 0316 0355 059A 0062;0061 1DFA 0316 0355 059A 0062;0061 1DFA 0316 0355 059A 0062; # (a◌֚◌̖◌᷺◌͕b; a◌᷺◌̖◌͕◌֚b; a◌᷺◌̖◌͕◌֚b; a◌᷺◌̖◌͕◌֚b; a◌᷺◌̖◌͕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROWHEAD BELOW, LATIN SMALL LETTER B
+0061 0355 059A 0316 1DFA 0062;0061 1DFA 0355 0316 059A 0062;0061 1DFA 0355 0316 059A 0062;0061 1DFA 0355 0316 059A 0062;0061 1DFA 0355 0316 059A 0062; # (a◌͕◌֚◌̖◌᷺b; a◌᷺◌͕◌̖◌֚b; a◌᷺◌͕◌̖◌֚b; a◌᷺◌͕◌̖◌֚b; a◌᷺◌͕◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0356 0062;0061 1DFA 0316 0356 059A 0062;0061 1DFA 0316 0356 059A 0062;0061 1DFA 0316 0356 059A 0062;0061 1DFA 0316 0356 059A 0062; # (a◌֚◌̖◌᷺◌͖b; a◌᷺◌̖◌͖◌֚b; a◌᷺◌̖◌͖◌֚b; a◌᷺◌̖◌͖◌֚b; a◌᷺◌̖◌͖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW, LATIN SMALL LETTER B
+0061 0356 059A 0316 1DFA 0062;0061 1DFA 0356 0316 059A 0062;0061 1DFA 0356 0316 059A 0062;0061 1DFA 0356 0316 059A 0062;0061 1DFA 0356 0316 059A 0062; # (a◌͖◌֚◌̖◌᷺b; a◌᷺◌͖◌̖◌֚b; a◌᷺◌͖◌̖◌֚b; a◌᷺◌͖◌̖◌֚b; a◌᷺◌͖◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0357 0062;00E0 05AE 0357 0315 0062;0061 05AE 0300 0357 0315 0062;00E0 05AE 0357 0315 0062;0061 05AE 0300 0357 0315 0062; # (a◌̕◌̀◌֮◌͗b; à◌֮◌͗◌̕b; a◌֮◌̀◌͗◌̕b; à◌֮◌͗◌̕b; a◌֮◌̀◌͗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT HALF RING ABOVE, LATIN SMALL LETTER B
0061 0357 0315 0300 05AE 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062;0061 05AE 0357 0300 0315 0062; # (a◌͗◌̕◌̀◌֮b; a◌֮◌͗◌̀◌̕b; a◌֮◌͗◌̀◌̕b; a◌֮◌͗◌̀◌̕b; a◌֮◌͗◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT HALF RING ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 035C 0315 0300 0358 0062;00E0 0315 0358 035C 0062;0061 0300 0315 0358 035C 0062;00E0 0315 0358 035C 0062;0061 0300 0315 0358 035C 0062; # (a◌͜◌̕◌̀◌͘b; à◌̕◌͘◌͜b; a◌̀◌̕◌͘◌͜b; à◌̕◌͘◌͜b; a◌̀◌̕◌͘◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, COMBINING DOT ABOVE RIGHT, LATIN SMALL LETTER B
0061 0358 035C 0315 0300 0062;00E0 0358 0315 035C 0062;0061 0300 0358 0315 035C 0062;00E0 0358 0315 035C 0062;0061 0300 0358 0315 035C 0062; # (a◌͘◌͜◌̕◌̀b; à◌͘◌̕◌͜b; a◌̀◌͘◌̕◌͜b; à◌͘◌̕◌͜b; a◌̀◌͘◌̕◌͜b; ) LATIN SMALL LETTER A, COMBINING DOT ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, LATIN SMALL LETTER B
-0061 059A 0316 302A 0359 0062;0061 302A 0316 0359 059A 0062;0061 302A 0316 0359 059A 0062;0061 302A 0316 0359 059A 0062;0061 302A 0316 0359 059A 0062; # (a◌֚◌̖◌〪◌͙b; a◌〪◌̖◌͙◌֚b; a◌〪◌̖◌͙◌֚b; a◌〪◌̖◌͙◌֚b; a◌〪◌̖◌͙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING ASTERISK BELOW, LATIN SMALL LETTER B
-0061 0359 059A 0316 302A 0062;0061 302A 0359 0316 059A 0062;0061 302A 0359 0316 059A 0062;0061 302A 0359 0316 059A 0062;0061 302A 0359 0316 059A 0062; # (a◌͙◌֚◌̖◌〪b; a◌〪◌͙◌̖◌֚b; a◌〪◌͙◌̖◌֚b; a◌〪◌͙◌̖◌֚b; a◌〪◌͙◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ASTERISK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 035A 0062;0061 302A 0316 035A 059A 0062;0061 302A 0316 035A 059A 0062;0061 302A 0316 035A 059A 0062;0061 302A 0316 035A 059A 0062; # (a◌֚◌̖◌〪◌͚b; a◌〪◌̖◌͚◌֚b; a◌〪◌̖◌͚◌֚b; a◌〪◌̖◌͚◌֚b; a◌〪◌̖◌͚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOUBLE RING BELOW, LATIN SMALL LETTER B
-0061 035A 059A 0316 302A 0062;0061 302A 035A 0316 059A 0062;0061 302A 035A 0316 059A 0062;0061 302A 035A 0316 059A 0062;0061 302A 035A 0316 059A 0062; # (a◌͚◌֚◌̖◌〪b; a◌〪◌͚◌̖◌֚b; a◌〪◌͚◌̖◌֚b; a◌〪◌͚◌̖◌֚b; a◌〪◌͚◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0359 0062;0061 1DFA 0316 0359 059A 0062;0061 1DFA 0316 0359 059A 0062;0061 1DFA 0316 0359 059A 0062;0061 1DFA 0316 0359 059A 0062; # (a◌֚◌̖◌᷺◌͙b; a◌᷺◌̖◌͙◌֚b; a◌᷺◌̖◌͙◌֚b; a◌᷺◌̖◌͙◌֚b; a◌᷺◌̖◌͙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ASTERISK BELOW, LATIN SMALL LETTER B
+0061 0359 059A 0316 1DFA 0062;0061 1DFA 0359 0316 059A 0062;0061 1DFA 0359 0316 059A 0062;0061 1DFA 0359 0316 059A 0062;0061 1DFA 0359 0316 059A 0062; # (a◌͙◌֚◌̖◌᷺b; a◌᷺◌͙◌̖◌֚b; a◌᷺◌͙◌̖◌֚b; a◌᷺◌͙◌̖◌֚b; a◌᷺◌͙◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ASTERISK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 035A 0062;0061 1DFA 0316 035A 059A 0062;0061 1DFA 0316 035A 059A 0062;0061 1DFA 0316 035A 059A 0062;0061 1DFA 0316 035A 059A 0062; # (a◌֚◌̖◌᷺◌͚b; a◌᷺◌̖◌͚◌֚b; a◌᷺◌̖◌͚◌֚b; a◌᷺◌̖◌͚◌֚b; a◌᷺◌̖◌͚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE RING BELOW, LATIN SMALL LETTER B
+0061 035A 059A 0316 1DFA 0062;0061 1DFA 035A 0316 059A 0062;0061 1DFA 035A 0316 059A 0062;0061 1DFA 035A 0316 059A 0062;0061 1DFA 035A 0316 059A 0062; # (a◌͚◌֚◌̖◌᷺b; a◌᷺◌͚◌̖◌֚b; a◌᷺◌͚◌̖◌֚b; a◌᷺◌͚◌̖◌֚b; a◌᷺◌͚◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 035B 0062;00E0 05AE 035B 0315 0062;0061 05AE 0300 035B 0315 0062;00E0 05AE 035B 0315 0062;0061 05AE 0300 035B 0315 0062; # (a◌̕◌̀◌֮◌͛b; à◌֮◌͛◌̕b; a◌֮◌̀◌͛◌̕b; à◌֮◌͛◌̕b; a◌֮◌̀◌͛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ZIGZAG ABOVE, LATIN SMALL LETTER B
0061 035B 0315 0300 05AE 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062;0061 05AE 035B 0300 0315 0062; # (a◌͛◌̕◌̀◌֮b; a◌֮◌͛◌̀◌̕b; a◌֮◌͛◌̀◌̕b; a◌֮◌͛◌̀◌̕b; a◌֮◌͛◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ZIGZAG ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 035D 035C 0315 035C 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062;0061 0315 035C 035C 035D 0062; # (aâ—ŒÍ◌͜◌̕◌͜b; a◌̕◌͜◌͜◌Íb; a◌̕◌͜◌͜◌Íb; a◌̕◌͜◌͜◌Íb; a◌̕◌͜◌͜◌Íb; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B
@@ -17213,8 +17272,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0486 0315 0300 05AE 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062;0061 05AE 0486 0300 0315 0062; # (a◌҆◌̕◌̀◌֮b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; a◌֮◌҆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC PSILI PNEUMATA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0487 0062;00E0 05AE 0487 0315 0062;0061 05AE 0300 0487 0315 0062;00E0 05AE 0487 0315 0062;0061 05AE 0300 0487 0315 0062; # (a◌̕◌̀◌֮◌҇b; à◌֮◌҇◌̕b; a◌֮◌̀◌҇◌̕b; à◌֮◌҇◌̕b; a◌֮◌̀◌҇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC POKRYTIE, LATIN SMALL LETTER B
0061 0487 0315 0300 05AE 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062;0061 05AE 0487 0300 0315 0062; # (a◌҇◌̕◌̀◌֮b; a◌֮◌҇◌̀◌̕b; a◌֮◌҇◌̀◌̕b; a◌֮◌҇◌̀◌̕b; a◌֮◌҇◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC POKRYTIE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0591 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062;0061 302A 0316 0591 059A 0062; # (a◌֚◌̖◌〪◌֑b; a◌〪◌̖◌֑◌֚b; a◌〪◌̖◌֑◌֚b; a◌〪◌̖◌֑◌֚b; a◌〪◌̖◌֑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT ETNAHTA, LATIN SMALL LETTER B
-0061 0591 059A 0316 302A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062;0061 302A 0591 0316 059A 0062; # (a◌֑◌֚◌̖◌〪b; a◌〪◌֑◌̖◌֚b; a◌〪◌֑◌̖◌֚b; a◌〪◌֑◌̖◌֚b; a◌〪◌֑◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT ETNAHTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0591 0062;0061 1DFA 0316 0591 059A 0062;0061 1DFA 0316 0591 059A 0062;0061 1DFA 0316 0591 059A 0062;0061 1DFA 0316 0591 059A 0062; # (a◌֚◌̖◌᷺◌֑b; a◌᷺◌̖◌֑◌֚b; a◌᷺◌̖◌֑◌֚b; a◌᷺◌̖◌֑◌֚b; a◌᷺◌̖◌֑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT ETNAHTA, LATIN SMALL LETTER B
+0061 0591 059A 0316 1DFA 0062;0061 1DFA 0591 0316 059A 0062;0061 1DFA 0591 0316 059A 0062;0061 1DFA 0591 0316 059A 0062;0061 1DFA 0591 0316 059A 0062; # (a◌֑◌֚◌̖◌᷺b; a◌᷺◌֑◌̖◌֚b; a◌᷺◌֑◌̖◌֚b; a◌᷺◌֑◌̖◌֚b; a◌᷺◌֑◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT ETNAHTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0592 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062;00E0 05AE 0592 0315 0062;0061 05AE 0300 0592 0315 0062; # (a◌̕◌̀◌֮◌֒b; à◌֮◌֒◌̕b; a◌֮◌̀◌֒◌̕b; à◌֮◌֒◌̕b; a◌֮◌̀◌֒◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT SEGOL, LATIN SMALL LETTER B
0061 0592 0315 0300 05AE 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062;0061 05AE 0592 0300 0315 0062; # (a◌֒◌̕◌̀◌֮b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; a◌֮◌֒◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT SEGOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0593 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062;00E0 05AE 0593 0315 0062;0061 05AE 0300 0593 0315 0062; # (a◌̕◌̀◌֮◌֓b; à◌֮◌֓◌̕b; a◌֮◌̀◌֓◌̕b; à◌֮◌֓◌̕b; a◌֮◌̀◌֓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT SHALSHELET, LATIN SMALL LETTER B
@@ -17223,8 +17282,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0594 0315 0300 05AE 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062;0061 05AE 0594 0300 0315 0062; # (a◌֔◌̕◌̀◌֮b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; a◌֮◌֔◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZAQEF QATAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0595 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062;00E0 05AE 0595 0315 0062;0061 05AE 0300 0595 0315 0062; # (a◌̕◌̀◌֮◌֕b; à◌֮◌֕◌̕b; a◌֮◌̀◌֕◌̕b; à◌֮◌֕◌̕b; a◌֮◌̀◌֕◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZAQEF GADOL, LATIN SMALL LETTER B
0061 0595 0315 0300 05AE 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062;0061 05AE 0595 0300 0315 0062; # (a◌֕◌̕◌̀◌֮b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; a◌֮◌֕◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZAQEF GADOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0596 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062;0061 302A 0316 0596 059A 0062; # (a◌֚◌̖◌〪◌֖b; a◌〪◌̖◌֖◌֚b; a◌〪◌̖◌֖◌֚b; a◌〪◌̖◌֖◌֚b; a◌〪◌̖◌֖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT TIPEHA, LATIN SMALL LETTER B
-0061 0596 059A 0316 302A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062;0061 302A 0596 0316 059A 0062; # (a◌֖◌֚◌̖◌〪b; a◌〪◌֖◌̖◌֚b; a◌〪◌֖◌̖◌֚b; a◌〪◌֖◌̖◌֚b; a◌〪◌֖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TIPEHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0596 0062;0061 1DFA 0316 0596 059A 0062;0061 1DFA 0316 0596 059A 0062;0061 1DFA 0316 0596 059A 0062;0061 1DFA 0316 0596 059A 0062; # (a◌֚◌̖◌᷺◌֖b; a◌᷺◌̖◌֖◌֚b; a◌᷺◌̖◌֖◌֚b; a◌᷺◌̖◌֖◌֚b; a◌᷺◌̖◌֖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT TIPEHA, LATIN SMALL LETTER B
+0061 0596 059A 0316 1DFA 0062;0061 1DFA 0596 0316 059A 0062;0061 1DFA 0596 0316 059A 0062;0061 1DFA 0596 0316 059A 0062;0061 1DFA 0596 0316 059A 0062; # (a◌֖◌֚◌̖◌᷺b; a◌᷺◌֖◌̖◌֚b; a◌᷺◌֖◌̖◌֚b; a◌᷺◌֖◌̖◌֚b; a◌᷺◌֖◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TIPEHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0597 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062;00E0 05AE 0597 0315 0062;0061 05AE 0300 0597 0315 0062; # (a◌̕◌̀◌֮◌֗b; à◌֮◌֗◌̕b; a◌֮◌̀◌֗◌̕b; à◌֮◌֗◌̕b; a◌֮◌̀◌֗◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT REVIA, LATIN SMALL LETTER B
0061 0597 0315 0300 05AE 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062;0061 05AE 0597 0300 0315 0062; # (a◌֗◌̕◌̀◌֮b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; a◌֮◌֗◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT REVIA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0598 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062;00E0 05AE 0598 0315 0062;0061 05AE 0300 0598 0315 0062; # (a◌̕◌̀◌֮◌֘b; à◌֮◌֘◌̕b; a◌֮◌̀◌֘◌̕b; à◌֮◌֘◌̕b; a◌֮◌̀◌֘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ZARQA, LATIN SMALL LETTER B
@@ -17233,8 +17292,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0599 0315 0300 05AE 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062;0061 05AE 0599 0300 0315 0062; # (a◌֙◌̕◌̀◌֮b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; a◌֮◌֙◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT PASHTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 302E 059A 0316 059A 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062; # (a〮◌֚◌̖◌֚b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; ) LATIN SMALL LETTER A, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, HEBREW ACCENT YETIV, LATIN SMALL LETTER B
0061 059A 302E 059A 0316 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062;0061 0316 059A 059A 302E 0062; # (a◌֚〮◌֚◌̖b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; a◌̖◌֚◌֚〮b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B
-0061 059A 0316 302A 059B 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062;0061 302A 0316 059B 059A 0062; # (a◌֚◌̖◌〪◌֛b; a◌〪◌̖◌֛◌֚b; a◌〪◌̖◌֛◌֚b; a◌〪◌̖◌֛◌֚b; a◌〪◌̖◌֛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT TEVIR, LATIN SMALL LETTER B
-0061 059B 059A 0316 302A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062;0061 302A 059B 0316 059A 0062; # (a◌֛◌֚◌̖◌〪b; a◌〪◌֛◌̖◌֚b; a◌〪◌֛◌̖◌֚b; a◌〪◌֛◌̖◌֚b; a◌〪◌֛◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TEVIR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 059B 0062;0061 1DFA 0316 059B 059A 0062;0061 1DFA 0316 059B 059A 0062;0061 1DFA 0316 059B 059A 0062;0061 1DFA 0316 059B 059A 0062; # (a◌֚◌̖◌᷺◌֛b; a◌᷺◌̖◌֛◌֚b; a◌᷺◌̖◌֛◌֚b; a◌᷺◌̖◌֛◌֚b; a◌᷺◌̖◌֛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT TEVIR, LATIN SMALL LETTER B
+0061 059B 059A 0316 1DFA 0062;0061 1DFA 059B 0316 059A 0062;0061 1DFA 059B 0316 059A 0062;0061 1DFA 059B 0316 059A 0062;0061 1DFA 059B 0316 059A 0062; # (a◌֛◌֚◌̖◌᷺b; a◌᷺◌֛◌̖◌֚b; a◌᷺◌֛◌̖◌֚b; a◌᷺◌֛◌̖◌֚b; a◌᷺◌֛◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT TEVIR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 059C 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062;00E0 05AE 059C 0315 0062;0061 05AE 0300 059C 0315 0062; # (a◌̕◌̀◌֮◌֜b; à◌֮◌֜◌̕b; a◌֮◌̀◌֜◌̕b; à◌֮◌֜◌̕b; a◌֮◌̀◌֜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERESH, LATIN SMALL LETTER B
0061 059C 0315 0300 05AE 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062;0061 05AE 059C 0300 0315 0062; # (a◌֜◌̕◌̀◌֮b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; a◌֮◌֜◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT GERESH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 059D 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062;00E0 05AE 059D 0315 0062;0061 05AE 0300 059D 0315 0062; # (a◌̕◌̀◌֮◌Öb; à◌֮◌Ö◌̕b; a◌֮◌̀◌Ö◌̕b; à◌֮◌Ö◌̕b; a◌֮◌̀◌Ö◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT GERESH MUQDAM, LATIN SMALL LETTER B
@@ -17247,24 +17306,24 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 05A0 0315 0300 05AE 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062;0061 05AE 05A0 0300 0315 0062; # (a◌֠◌̕◌̀◌֮b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; a◌֮◌֠◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT TELISHA GEDOLA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 05A1 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062;00E0 05AE 05A1 0315 0062;0061 05AE 0300 05A1 0315 0062; # (a◌̕◌̀◌֮◌֡b; à◌֮◌֡◌̕b; a◌֮◌̀◌֡◌̕b; à◌֮◌֡◌̕b; a◌֮◌̀◌֡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT PAZER, LATIN SMALL LETTER B
0061 05A1 0315 0300 05AE 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062;0061 05AE 05A1 0300 0315 0062; # (a◌֡◌̕◌̀◌֮b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; a◌֮◌֡◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT PAZER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 05A2 0062;0061 302A 0316 05A2 059A 0062;0061 302A 0316 05A2 059A 0062;0061 302A 0316 05A2 059A 0062;0061 302A 0316 05A2 059A 0062; # (a◌֚◌̖◌〪◌֢b; a◌〪◌̖◌֢◌֚b; a◌〪◌̖◌֢◌֚b; a◌〪◌̖◌֢◌֚b; a◌〪◌̖◌֢◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT ATNAH HAFUKH, LATIN SMALL LETTER B
-0061 05A2 059A 0316 302A 0062;0061 302A 05A2 0316 059A 0062;0061 302A 05A2 0316 059A 0062;0061 302A 05A2 0316 059A 0062;0061 302A 05A2 0316 059A 0062; # (a◌֢◌֚◌̖◌〪b; a◌〪◌֢◌̖◌֚b; a◌〪◌֢◌̖◌֚b; a◌〪◌֢◌̖◌֚b; a◌〪◌֢◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT ATNAH HAFUKH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 05A3 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062;0061 302A 0316 05A3 059A 0062; # (a◌֚◌̖◌〪◌֣b; a◌〪◌̖◌֣◌֚b; a◌〪◌̖◌֣◌֚b; a◌〪◌̖◌֣◌֚b; a◌〪◌̖◌֣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MUNAH, LATIN SMALL LETTER B
-0061 05A3 059A 0316 302A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062;0061 302A 05A3 0316 059A 0062; # (a◌֣◌֚◌̖◌〪b; a◌〪◌֣◌̖◌֚b; a◌〪◌֣◌̖◌֚b; a◌〪◌֣◌̖◌֚b; a◌〪◌֣◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MUNAH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 05A4 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062;0061 302A 0316 05A4 059A 0062; # (a◌֚◌̖◌〪◌֤b; a◌〪◌̖◌֤◌֚b; a◌〪◌̖◌֤◌֚b; a◌〪◌̖◌֤◌֚b; a◌〪◌̖◌֤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MAHAPAKH, LATIN SMALL LETTER B
-0061 05A4 059A 0316 302A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062;0061 302A 05A4 0316 059A 0062; # (a◌֤◌֚◌̖◌〪b; a◌〪◌֤◌̖◌֚b; a◌〪◌֤◌̖◌֚b; a◌〪◌֤◌̖◌֚b; a◌〪◌֤◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MAHAPAKH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 05A5 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062;0061 302A 0316 05A5 059A 0062; # (a◌֚◌̖◌〪◌֥b; a◌〪◌̖◌֥◌֚b; a◌〪◌̖◌֥◌֚b; a◌〪◌̖◌֥◌֚b; a◌〪◌̖◌֥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MERKHA, LATIN SMALL LETTER B
-0061 05A5 059A 0316 302A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062;0061 302A 05A5 0316 059A 0062; # (a◌֥◌֚◌̖◌〪b; a◌〪◌֥◌̖◌֚b; a◌〪◌֥◌̖◌֚b; a◌〪◌֥◌̖◌֚b; a◌〪◌֥◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 05A6 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062;0061 302A 0316 05A6 059A 0062; # (a◌֚◌̖◌〪◌֦b; a◌〪◌̖◌֦◌֚b; a◌〪◌̖◌֦◌֚b; a◌〪◌̖◌֦◌֚b; a◌〪◌̖◌֦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT MERKHA KEFULA, LATIN SMALL LETTER B
-0061 05A6 059A 0316 302A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062;0061 302A 05A6 0316 059A 0062; # (a◌֦◌֚◌̖◌〪b; a◌〪◌֦◌̖◌֚b; a◌〪◌֦◌̖◌֚b; a◌〪◌֦◌̖◌֚b; a◌〪◌֦◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA KEFULA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 05A7 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062;0061 302A 0316 05A7 059A 0062; # (a◌֚◌̖◌〪◌֧b; a◌〪◌̖◌֧◌֚b; a◌〪◌̖◌֧◌֚b; a◌〪◌̖◌֧◌֚b; a◌〪◌̖◌֧◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT DARGA, LATIN SMALL LETTER B
-0061 05A7 059A 0316 302A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062;0061 302A 05A7 0316 059A 0062; # (a◌֧◌֚◌̖◌〪b; a◌〪◌֧◌̖◌֚b; a◌〪◌֧◌̖◌֚b; a◌〪◌֧◌̖◌֚b; a◌〪◌֧◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT DARGA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05A2 0062;0061 1DFA 0316 05A2 059A 0062;0061 1DFA 0316 05A2 059A 0062;0061 1DFA 0316 05A2 059A 0062;0061 1DFA 0316 05A2 059A 0062; # (a◌֚◌̖◌᷺◌֢b; a◌᷺◌̖◌֢◌֚b; a◌᷺◌̖◌֢◌֚b; a◌᷺◌̖◌֢◌֚b; a◌᷺◌̖◌֢◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT ATNAH HAFUKH, LATIN SMALL LETTER B
+0061 05A2 059A 0316 1DFA 0062;0061 1DFA 05A2 0316 059A 0062;0061 1DFA 05A2 0316 059A 0062;0061 1DFA 05A2 0316 059A 0062;0061 1DFA 05A2 0316 059A 0062; # (a◌֢◌֚◌̖◌᷺b; a◌᷺◌֢◌̖◌֚b; a◌᷺◌֢◌̖◌֚b; a◌᷺◌֢◌̖◌֚b; a◌᷺◌֢◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT ATNAH HAFUKH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05A3 0062;0061 1DFA 0316 05A3 059A 0062;0061 1DFA 0316 05A3 059A 0062;0061 1DFA 0316 05A3 059A 0062;0061 1DFA 0316 05A3 059A 0062; # (a◌֚◌̖◌᷺◌֣b; a◌᷺◌̖◌֣◌֚b; a◌᷺◌̖◌֣◌֚b; a◌᷺◌̖◌֣◌֚b; a◌᷺◌̖◌֣◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MUNAH, LATIN SMALL LETTER B
+0061 05A3 059A 0316 1DFA 0062;0061 1DFA 05A3 0316 059A 0062;0061 1DFA 05A3 0316 059A 0062;0061 1DFA 05A3 0316 059A 0062;0061 1DFA 05A3 0316 059A 0062; # (a◌֣◌֚◌̖◌᷺b; a◌᷺◌֣◌̖◌֚b; a◌᷺◌֣◌̖◌֚b; a◌᷺◌֣◌̖◌֚b; a◌᷺◌֣◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MUNAH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05A4 0062;0061 1DFA 0316 05A4 059A 0062;0061 1DFA 0316 05A4 059A 0062;0061 1DFA 0316 05A4 059A 0062;0061 1DFA 0316 05A4 059A 0062; # (a◌֚◌̖◌᷺◌֤b; a◌᷺◌̖◌֤◌֚b; a◌᷺◌̖◌֤◌֚b; a◌᷺◌̖◌֤◌֚b; a◌᷺◌̖◌֤◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MAHAPAKH, LATIN SMALL LETTER B
+0061 05A4 059A 0316 1DFA 0062;0061 1DFA 05A4 0316 059A 0062;0061 1DFA 05A4 0316 059A 0062;0061 1DFA 05A4 0316 059A 0062;0061 1DFA 05A4 0316 059A 0062; # (a◌֤◌֚◌̖◌᷺b; a◌᷺◌֤◌̖◌֚b; a◌᷺◌֤◌̖◌֚b; a◌᷺◌֤◌̖◌֚b; a◌᷺◌֤◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MAHAPAKH, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05A5 0062;0061 1DFA 0316 05A5 059A 0062;0061 1DFA 0316 05A5 059A 0062;0061 1DFA 0316 05A5 059A 0062;0061 1DFA 0316 05A5 059A 0062; # (a◌֚◌̖◌᷺◌֥b; a◌᷺◌̖◌֥◌֚b; a◌᷺◌̖◌֥◌֚b; a◌᷺◌̖◌֥◌֚b; a◌᷺◌̖◌֥◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MERKHA, LATIN SMALL LETTER B
+0061 05A5 059A 0316 1DFA 0062;0061 1DFA 05A5 0316 059A 0062;0061 1DFA 05A5 0316 059A 0062;0061 1DFA 05A5 0316 059A 0062;0061 1DFA 05A5 0316 059A 0062; # (a◌֥◌֚◌̖◌᷺b; a◌᷺◌֥◌̖◌֚b; a◌᷺◌֥◌̖◌֚b; a◌᷺◌֥◌̖◌֚b; a◌᷺◌֥◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05A6 0062;0061 1DFA 0316 05A6 059A 0062;0061 1DFA 0316 05A6 059A 0062;0061 1DFA 0316 05A6 059A 0062;0061 1DFA 0316 05A6 059A 0062; # (a◌֚◌̖◌᷺◌֦b; a◌᷺◌̖◌֦◌֚b; a◌᷺◌̖◌֦◌֚b; a◌᷺◌̖◌֦◌֚b; a◌᷺◌̖◌֦◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT MERKHA KEFULA, LATIN SMALL LETTER B
+0061 05A6 059A 0316 1DFA 0062;0061 1DFA 05A6 0316 059A 0062;0061 1DFA 05A6 0316 059A 0062;0061 1DFA 05A6 0316 059A 0062;0061 1DFA 05A6 0316 059A 0062; # (a◌֦◌֚◌̖◌᷺b; a◌᷺◌֦◌̖◌֚b; a◌᷺◌֦◌̖◌֚b; a◌᷺◌֦◌̖◌֚b; a◌᷺◌֦◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT MERKHA KEFULA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05A7 0062;0061 1DFA 0316 05A7 059A 0062;0061 1DFA 0316 05A7 059A 0062;0061 1DFA 0316 05A7 059A 0062;0061 1DFA 0316 05A7 059A 0062; # (a◌֚◌̖◌᷺◌֧b; a◌᷺◌̖◌֧◌֚b; a◌᷺◌̖◌֧◌֚b; a◌᷺◌̖◌֧◌֚b; a◌᷺◌̖◌֧◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT DARGA, LATIN SMALL LETTER B
+0061 05A7 059A 0316 1DFA 0062;0061 1DFA 05A7 0316 059A 0062;0061 1DFA 05A7 0316 059A 0062;0061 1DFA 05A7 0316 059A 0062;0061 1DFA 05A7 0316 059A 0062; # (a◌֧◌֚◌̖◌᷺b; a◌᷺◌֧◌̖◌֚b; a◌᷺◌֧◌̖◌֚b; a◌᷺◌֧◌̖◌֚b; a◌᷺◌֧◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT DARGA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 05A8 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062;00E0 05AE 05A8 0315 0062;0061 05AE 0300 05A8 0315 0062; # (a◌̕◌̀◌֮◌֨b; à◌֮◌֨◌̕b; a◌֮◌̀◌֨◌̕b; à◌֮◌֨◌̕b; a◌֮◌̀◌֨◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT QADMA, LATIN SMALL LETTER B
0061 05A8 0315 0300 05AE 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062;0061 05AE 05A8 0300 0315 0062; # (a◌֨◌̕◌̀◌֮b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; a◌֮◌֨◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT QADMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 05A9 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062;00E0 05AE 05A9 0315 0062;0061 05AE 0300 05A9 0315 0062; # (a◌̕◌̀◌֮◌֩b; à◌֮◌֩◌̕b; a◌֮◌̀◌֩◌̕b; à◌֮◌֩◌̕b; a◌֮◌̀◌֩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT TELISHA QETANA, LATIN SMALL LETTER B
0061 05A9 0315 0300 05AE 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062;0061 05AE 05A9 0300 0315 0062; # (a◌֩◌̕◌̀◌֮b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; a◌֮◌֩◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT TELISHA QETANA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 05AA 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062;0061 302A 0316 05AA 059A 0062; # (a◌֚◌̖◌〪◌֪b; a◌〪◌̖◌֪◌֚b; a◌〪◌̖◌֪◌֚b; a◌〪◌̖◌֪◌֚b; a◌〪◌̖◌֪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW ACCENT YERAH BEN YOMO, LATIN SMALL LETTER B
-0061 05AA 059A 0316 302A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062;0061 302A 05AA 0316 059A 0062; # (a◌֪◌֚◌̖◌〪b; a◌〪◌֪◌̖◌֚b; a◌〪◌֪◌̖◌֚b; a◌〪◌֪◌̖◌֚b; a◌〪◌֪◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YERAH BEN YOMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05AA 0062;0061 1DFA 0316 05AA 059A 0062;0061 1DFA 0316 05AA 059A 0062;0061 1DFA 0316 05AA 059A 0062;0061 1DFA 0316 05AA 059A 0062; # (a◌֚◌̖◌᷺◌֪b; a◌᷺◌̖◌֪◌֚b; a◌᷺◌̖◌֪◌֚b; a◌᷺◌̖◌֪◌֚b; a◌᷺◌̖◌֪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW ACCENT YERAH BEN YOMO, LATIN SMALL LETTER B
+0061 05AA 059A 0316 1DFA 0062;0061 1DFA 05AA 0316 059A 0062;0061 1DFA 05AA 0316 059A 0062;0061 1DFA 05AA 0316 059A 0062;0061 1DFA 05AA 0316 059A 0062; # (a◌֪◌֚◌̖◌᷺b; a◌᷺◌֪◌̖◌֚b; a◌᷺◌֪◌̖◌֚b; a◌᷺◌֪◌̖◌֚b; a◌᷺◌֪◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YERAH BEN YOMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 05AB 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062;00E0 05AE 05AB 0315 0062;0061 05AE 0300 05AB 0315 0062; # (a◌̕◌̀◌֮◌֫b; à◌֮◌֫◌̕b; a◌֮◌̀◌֫◌̕b; à◌֮◌֫◌̕b; a◌֮◌̀◌֫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT OLE, LATIN SMALL LETTER B
0061 05AB 0315 0300 05AE 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062;0061 05AE 05AB 0300 0315 0062; # (a◌֫◌̕◌̀◌֮b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; a◌֮◌֫◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW ACCENT OLE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 05AC 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062;00E0 05AE 05AC 0315 0062;0061 05AE 0300 05AC 0315 0062; # (a◌̕◌̀◌֮◌֬b; à◌֮◌֬◌̕b; a◌֮◌̀◌֬◌̕b; à◌֮◌֬◌̕b; a◌֮◌̀◌֬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW ACCENT ILUY, LATIN SMALL LETTER B
@@ -17311,8 +17370,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 05C2 FB1E 05C2 05C1 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062;0061 05C1 05C2 05C2 FB1E 0062; # (a◌ׂ◌ﬞ◌ׂ◌×b; aâ—Œ×◌ׂ◌ׂ◌ﬞb; aâ—Œ×◌ׂ◌ׂ◌ﬞb; aâ—Œ×◌ׂ◌ׂ◌ﬞb; aâ—Œ×◌ׂ◌ׂ◌ﬞb; ) LATIN SMALL LETTER A, HEBREW POINT SIN DOT, HEBREW POINT JUDEO-SPANISH VARIKA, HEBREW POINT SIN DOT, HEBREW POINT SHIN DOT, LATIN SMALL LETTER B
0061 0315 0300 05AE 05C4 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062;00E0 05AE 05C4 0315 0062;0061 05AE 0300 05C4 0315 0062; # (a◌̕◌̀◌֮◌ׄb; à◌֮◌ׄ◌̕b; a◌֮◌̀◌ׄ◌̕b; à◌֮◌ׄ◌̕b; a◌֮◌̀◌ׄ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HEBREW MARK UPPER DOT, LATIN SMALL LETTER B
0061 05C4 0315 0300 05AE 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062;0061 05AE 05C4 0300 0315 0062; # (a◌ׄ◌̕◌̀◌֮b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; a◌֮◌ׄ◌̀◌̕b; ) LATIN SMALL LETTER A, HEBREW MARK UPPER DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 05C5 0062;0061 302A 0316 05C5 059A 0062;0061 302A 0316 05C5 059A 0062;0061 302A 0316 05C5 059A 0062;0061 302A 0316 05C5 059A 0062; # (a◌֚◌̖◌〪◌ׅb; a◌〪◌̖◌ׅ◌֚b; a◌〪◌̖◌ׅ◌֚b; a◌〪◌̖◌ׅ◌֚b; a◌〪◌̖◌ׅ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, HEBREW MARK LOWER DOT, LATIN SMALL LETTER B
-0061 05C5 059A 0316 302A 0062;0061 302A 05C5 0316 059A 0062;0061 302A 05C5 0316 059A 0062;0061 302A 05C5 0316 059A 0062;0061 302A 05C5 0316 059A 0062; # (a◌ׅ◌֚◌̖◌〪b; a◌〪◌ׅ◌̖◌֚b; a◌〪◌ׅ◌̖◌֚b; a◌〪◌ׅ◌̖◌֚b; a◌〪◌ׅ◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW MARK LOWER DOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 05C5 0062;0061 1DFA 0316 05C5 059A 0062;0061 1DFA 0316 05C5 059A 0062;0061 1DFA 0316 05C5 059A 0062;0061 1DFA 0316 05C5 059A 0062; # (a◌֚◌̖◌᷺◌ׅb; a◌᷺◌̖◌ׅ◌֚b; a◌᷺◌̖◌ׅ◌֚b; a◌᷺◌̖◌ׅ◌֚b; a◌᷺◌̖◌ׅ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, HEBREW MARK LOWER DOT, LATIN SMALL LETTER B
+0061 05C5 059A 0316 1DFA 0062;0061 1DFA 05C5 0316 059A 0062;0061 1DFA 05C5 0316 059A 0062;0061 1DFA 05C5 0316 059A 0062;0061 1DFA 05C5 0316 059A 0062; # (a◌ׅ◌֚◌̖◌᷺b; a◌᷺◌ׅ◌̖◌֚b; a◌᷺◌ׅ◌̖◌֚b; a◌᷺◌ׅ◌̖◌֚b; a◌᷺◌ׅ◌̖◌֚b; ) LATIN SMALL LETTER A, HEBREW MARK LOWER DOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 05B9 05B8 05B7 05C7 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062;0061 05B7 05B8 05C7 05B9 0062; # (a◌ֹ◌ָ◌ַ◌ׇb; a◌ַ◌ָ◌ׇ◌ֹb; a◌ַ◌ָ◌ׇ◌ֹb; a◌ַ◌ָ◌ׇ◌ֹb; a◌ַ◌ָ◌ׇ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, HEBREW POINT QAMATS QATAN, LATIN SMALL LETTER B
0061 05C7 05B9 05B8 05B7 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062;0061 05B7 05C7 05B8 05B9 0062; # (a◌ׇ◌ֹ◌ָ◌ַb; a◌ַ◌ׇ◌ָ◌ֹb; a◌ַ◌ׇ◌ָ◌ֹb; a◌ַ◌ׇ◌ָ◌ֹb; a◌ַ◌ׇ◌ָ◌ֹb; ) LATIN SMALL LETTER A, HEBREW POINT QAMATS QATAN, HEBREW POINT HOLAM, HEBREW POINT QAMATS, HEBREW POINT PATAH, LATIN SMALL LETTER B
0061 0315 0300 05AE 0610 0062;00E0 05AE 0610 0315 0062;0061 05AE 0300 0610 0315 0062;00E0 05AE 0610 0315 0062;0061 05AE 0300 0610 0315 0062; # (a◌̕◌̀◌֮◌Øb; à◌֮◌Ø◌̕b; a◌֮◌̀◌Ø◌̕b; à◌֮◌Ø◌̕b; a◌֮◌̀◌Ø◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM, LATIN SMALL LETTER B
@@ -17357,10 +17416,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0653 0315 0300 05AE 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062;0061 05AE 0653 0300 0315 0062; # (a◌ٓ◌̕◌̀◌֮b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; a◌֮◌ٓ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC MADDAH ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0654 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062;00E0 05AE 0654 0315 0062;0061 05AE 0300 0654 0315 0062; # (a◌̕◌̀◌֮◌ٔb; à◌֮◌ٔ◌̕b; a◌֮◌̀◌ٔ◌̕b; à◌֮◌ٔ◌̕b; a◌֮◌̀◌ٔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC HAMZA ABOVE, LATIN SMALL LETTER B
0061 0654 0315 0300 05AE 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062;0061 05AE 0654 0300 0315 0062; # (a◌ٔ◌̕◌̀◌֮b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; a◌֮◌ٔ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC HAMZA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0655 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062;0061 302A 0316 0655 059A 0062; # (a◌֚◌̖◌〪◌ٕb; a◌〪◌̖◌ٕ◌֚b; a◌〪◌̖◌ٕ◌֚b; a◌〪◌̖◌ٕ◌֚b; a◌〪◌̖◌ٕ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC HAMZA BELOW, LATIN SMALL LETTER B
-0061 0655 059A 0316 302A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062;0061 302A 0655 0316 059A 0062; # (a◌ٕ◌֚◌̖◌〪b; a◌〪◌ٕ◌̖◌֚b; a◌〪◌ٕ◌̖◌֚b; a◌〪◌ٕ◌̖◌֚b; a◌〪◌ٕ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC HAMZA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0656 0062;0061 302A 0316 0656 059A 0062;0061 302A 0316 0656 059A 0062;0061 302A 0316 0656 059A 0062;0061 302A 0316 0656 059A 0062; # (a◌֚◌̖◌〪◌ٖb; a◌〪◌̖◌ٖ◌֚b; a◌〪◌̖◌ٖ◌֚b; a◌〪◌̖◌ٖ◌֚b; a◌〪◌̖◌ٖ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC SUBSCRIPT ALEF, LATIN SMALL LETTER B
-0061 0656 059A 0316 302A 0062;0061 302A 0656 0316 059A 0062;0061 302A 0656 0316 059A 0062;0061 302A 0656 0316 059A 0062;0061 302A 0656 0316 059A 0062; # (a◌ٖ◌֚◌̖◌〪b; a◌〪◌ٖ◌̖◌֚b; a◌〪◌ٖ◌̖◌֚b; a◌〪◌ٖ◌̖◌֚b; a◌〪◌ٖ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SUBSCRIPT ALEF, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0655 0062;0061 1DFA 0316 0655 059A 0062;0061 1DFA 0316 0655 059A 0062;0061 1DFA 0316 0655 059A 0062;0061 1DFA 0316 0655 059A 0062; # (a◌֚◌̖◌᷺◌ٕb; a◌᷺◌̖◌ٕ◌֚b; a◌᷺◌̖◌ٕ◌֚b; a◌᷺◌̖◌ٕ◌֚b; a◌᷺◌̖◌ٕ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC HAMZA BELOW, LATIN SMALL LETTER B
+0061 0655 059A 0316 1DFA 0062;0061 1DFA 0655 0316 059A 0062;0061 1DFA 0655 0316 059A 0062;0061 1DFA 0655 0316 059A 0062;0061 1DFA 0655 0316 059A 0062; # (a◌ٕ◌֚◌̖◌᷺b; a◌᷺◌ٕ◌̖◌֚b; a◌᷺◌ٕ◌̖◌֚b; a◌᷺◌ٕ◌̖◌֚b; a◌᷺◌ٕ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC HAMZA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0656 0062;0061 1DFA 0316 0656 059A 0062;0061 1DFA 0316 0656 059A 0062;0061 1DFA 0316 0656 059A 0062;0061 1DFA 0316 0656 059A 0062; # (a◌֚◌̖◌᷺◌ٖb; a◌᷺◌̖◌ٖ◌֚b; a◌᷺◌̖◌ٖ◌֚b; a◌᷺◌̖◌ٖ◌֚b; a◌᷺◌̖◌ٖ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SUBSCRIPT ALEF, LATIN SMALL LETTER B
+0061 0656 059A 0316 1DFA 0062;0061 1DFA 0656 0316 059A 0062;0061 1DFA 0656 0316 059A 0062;0061 1DFA 0656 0316 059A 0062;0061 1DFA 0656 0316 059A 0062; # (a◌ٖ◌֚◌̖◌᷺b; a◌᷺◌ٖ◌̖◌֚b; a◌᷺◌ٖ◌̖◌֚b; a◌᷺◌ٖ◌̖◌֚b; a◌᷺◌ٖ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SUBSCRIPT ALEF, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0657 0062;00E0 05AE 0657 0315 0062;0061 05AE 0300 0657 0315 0062;00E0 05AE 0657 0315 0062;0061 05AE 0300 0657 0315 0062; # (a◌̕◌̀◌֮◌ٗb; à◌֮◌ٗ◌̕b; a◌֮◌̀◌ٗ◌̕b; à◌֮◌ٗ◌̕b; a◌֮◌̀◌ٗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC INVERTED DAMMA, LATIN SMALL LETTER B
0061 0657 0315 0300 05AE 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062;0061 05AE 0657 0300 0315 0062; # (a◌ٗ◌̕◌̀◌֮b; a◌֮◌ٗ◌̀◌̕b; a◌֮◌ٗ◌̀◌̕b; a◌֮◌ٗ◌̀◌̕b; a◌֮◌ٗ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC INVERTED DAMMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0658 0062;00E0 05AE 0658 0315 0062;0061 05AE 0300 0658 0315 0062;00E0 05AE 0658 0315 0062;0061 05AE 0300 0658 0315 0062; # (a◌̕◌̀◌֮◌٘b; à◌֮◌٘◌̕b; a◌֮◌̀◌٘◌̕b; à◌֮◌٘◌̕b; a◌֮◌̀◌٘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC MARK NOON GHUNNA, LATIN SMALL LETTER B
@@ -17371,14 +17430,14 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 065A 0315 0300 05AE 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062;0061 05AE 065A 0300 0315 0062; # (a◌ٚ◌̕◌̀◌֮b; a◌֮◌ٚ◌̀◌̕b; a◌֮◌ٚ◌̀◌̕b; a◌֮◌ٚ◌̀◌̕b; a◌֮◌ٚ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC VOWEL SIGN SMALL V ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 065B 0062;00E0 05AE 065B 0315 0062;0061 05AE 0300 065B 0315 0062;00E0 05AE 065B 0315 0062;0061 05AE 0300 065B 0315 0062; # (a◌̕◌̀◌֮◌ٛb; à◌֮◌ٛ◌̕b; a◌֮◌̀◌ٛ◌̕b; à◌֮◌ٛ◌̕b; a◌֮◌̀◌ٛ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC VOWEL SIGN INVERTED SMALL V ABOVE, LATIN SMALL LETTER B
0061 065B 0315 0300 05AE 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062;0061 05AE 065B 0300 0315 0062; # (a◌ٛ◌̕◌̀◌֮b; a◌֮◌ٛ◌̀◌̕b; a◌֮◌ٛ◌̀◌̕b; a◌֮◌ٛ◌̀◌̕b; a◌֮◌ٛ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC VOWEL SIGN INVERTED SMALL V ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 065C 0062;0061 302A 0316 065C 059A 0062;0061 302A 0316 065C 059A 0062;0061 302A 0316 065C 059A 0062;0061 302A 0316 065C 059A 0062; # (a◌֚◌̖◌〪◌ٜb; a◌〪◌̖◌ٜ◌֚b; a◌〪◌̖◌ٜ◌֚b; a◌〪◌̖◌ٜ◌֚b; a◌〪◌̖◌ٜ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC VOWEL SIGN DOT BELOW, LATIN SMALL LETTER B
-0061 065C 059A 0316 302A 0062;0061 302A 065C 0316 059A 0062;0061 302A 065C 0316 059A 0062;0061 302A 065C 0316 059A 0062;0061 302A 065C 0316 059A 0062; # (a◌ٜ◌֚◌̖◌〪b; a◌〪◌ٜ◌̖◌֚b; a◌〪◌ٜ◌̖◌֚b; a◌〪◌ٜ◌̖◌֚b; a◌〪◌ٜ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC VOWEL SIGN DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 065C 0062;0061 1DFA 0316 065C 059A 0062;0061 1DFA 0316 065C 059A 0062;0061 1DFA 0316 065C 059A 0062;0061 1DFA 0316 065C 059A 0062; # (a◌֚◌̖◌᷺◌ٜb; a◌᷺◌̖◌ٜ◌֚b; a◌᷺◌̖◌ٜ◌֚b; a◌᷺◌̖◌ٜ◌֚b; a◌᷺◌̖◌ٜ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC VOWEL SIGN DOT BELOW, LATIN SMALL LETTER B
+0061 065C 059A 0316 1DFA 0062;0061 1DFA 065C 0316 059A 0062;0061 1DFA 065C 0316 059A 0062;0061 1DFA 065C 0316 059A 0062;0061 1DFA 065C 0316 059A 0062; # (a◌ٜ◌֚◌̖◌᷺b; a◌᷺◌ٜ◌̖◌֚b; a◌᷺◌ٜ◌̖◌֚b; a◌᷺◌ٜ◌̖◌֚b; a◌᷺◌ٜ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC VOWEL SIGN DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 065D 0062;00E0 05AE 065D 0315 0062;0061 05AE 0300 065D 0315 0062;00E0 05AE 065D 0315 0062;0061 05AE 0300 065D 0315 0062; # (a◌̕◌̀◌֮◌Ùb; à◌֮◌Ù◌̕b; a◌֮◌̀◌Ù◌̕b; à◌֮◌Ù◌̕b; a◌֮◌̀◌Ù◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC REVERSED DAMMA, LATIN SMALL LETTER B
0061 065D 0315 0300 05AE 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062;0061 05AE 065D 0300 0315 0062; # (aâ—ŒÙ◌̕◌̀◌֮b; a◌֮◌Ù◌̀◌̕b; a◌֮◌Ù◌̀◌̕b; a◌֮◌Ù◌̀◌̕b; a◌֮◌Ù◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC REVERSED DAMMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 065E 0062;00E0 05AE 065E 0315 0062;0061 05AE 0300 065E 0315 0062;00E0 05AE 065E 0315 0062;0061 05AE 0300 065E 0315 0062; # (a◌̕◌̀◌֮◌ٞb; à◌֮◌ٞ◌̕b; a◌֮◌̀◌ٞ◌̕b; à◌֮◌ٞ◌̕b; a◌֮◌̀◌ٞ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC FATHA WITH TWO DOTS, LATIN SMALL LETTER B
0061 065E 0315 0300 05AE 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062;0061 05AE 065E 0300 0315 0062; # (a◌ٞ◌̕◌̀◌֮b; a◌֮◌ٞ◌̀◌̕b; a◌֮◌ٞ◌̀◌̕b; a◌֮◌ٞ◌̀◌̕b; a◌֮◌ٞ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC FATHA WITH TWO DOTS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 065F 0062;0061 302A 0316 065F 059A 0062;0061 302A 0316 065F 059A 0062;0061 302A 0316 065F 059A 0062;0061 302A 0316 065F 059A 0062; # (a◌֚◌̖◌〪◌ٟb; a◌〪◌̖◌ٟ◌֚b; a◌〪◌̖◌ٟ◌֚b; a◌〪◌̖◌ٟ◌֚b; a◌〪◌̖◌ٟ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC WAVY HAMZA BELOW, LATIN SMALL LETTER B
-0061 065F 059A 0316 302A 0062;0061 302A 065F 0316 059A 0062;0061 302A 065F 0316 059A 0062;0061 302A 065F 0316 059A 0062;0061 302A 065F 0316 059A 0062; # (a◌ٟ◌֚◌̖◌〪b; a◌〪◌ٟ◌̖◌֚b; a◌〪◌ٟ◌̖◌֚b; a◌〪◌ٟ◌̖◌֚b; a◌〪◌ٟ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC WAVY HAMZA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 065F 0062;0061 1DFA 0316 065F 059A 0062;0061 1DFA 0316 065F 059A 0062;0061 1DFA 0316 065F 059A 0062;0061 1DFA 0316 065F 059A 0062; # (a◌֚◌̖◌᷺◌ٟb; a◌᷺◌̖◌ٟ◌֚b; a◌᷺◌̖◌ٟ◌֚b; a◌᷺◌̖◌ٟ◌֚b; a◌᷺◌̖◌ٟ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC WAVY HAMZA BELOW, LATIN SMALL LETTER B
+0061 065F 059A 0316 1DFA 0062;0061 1DFA 065F 0316 059A 0062;0061 1DFA 065F 0316 059A 0062;0061 1DFA 065F 0316 059A 0062;0061 1DFA 065F 0316 059A 0062; # (a◌ٟ◌֚◌̖◌᷺b; a◌᷺◌ٟ◌̖◌֚b; a◌᷺◌ٟ◌̖◌֚b; a◌᷺◌ٟ◌̖◌֚b; a◌᷺◌ٟ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC WAVY HAMZA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0711 0670 0652 0670 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062; # (a◌ܑ◌ٰ◌ْ◌ٰb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; ) LATIN SMALL LETTER A, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER B
0061 0670 0711 0670 0652 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062;0061 0652 0670 0670 0711 0062; # (a◌ٰ◌ܑ◌ٰ◌ْb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; a◌ْ◌ٰ◌ٰ◌ܑb; ) LATIN SMALL LETTER A, ARABIC LETTER SUPERSCRIPT ALEF, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, ARABIC SUKUN, LATIN SMALL LETTER B
0061 0315 0300 05AE 06D6 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062;00E0 05AE 06D6 0315 0062;0061 05AE 0300 06D6 0315 0062; # (a◌̕◌̀◌֮◌ۖb; à◌֮◌ۖ◌̕b; a◌֮◌̀◌ۖ◌̕b; à◌֮◌ۖ◌̕b; a◌֮◌̀◌ۖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA, LATIN SMALL LETTER B
@@ -17403,74 +17462,74 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 06E1 0315 0300 05AE 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062;0061 05AE 06E1 0300 0315 0062; # (a◌ۡ◌̕◌̀◌֮b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; a◌֮◌ۡ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH DOTLESS HEAD OF KHAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 06E2 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062;00E0 05AE 06E2 0315 0062;0061 05AE 0300 06E2 0315 0062; # (a◌̕◌̀◌֮◌ۢb; à◌֮◌ۢ◌̕b; a◌֮◌̀◌ۢ◌̕b; à◌֮◌ۢ◌̕b; a◌֮◌̀◌ۢ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MEEM ISOLATED FORM, LATIN SMALL LETTER B
0061 06E2 0315 0300 05AE 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062;0061 05AE 06E2 0300 0315 0062; # (a◌ۢ◌̕◌̀◌֮b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; a◌֮◌ۢ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MEEM ISOLATED FORM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 06E3 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062;0061 302A 0316 06E3 059A 0062; # (a◌֚◌̖◌〪◌ۣb; a◌〪◌̖◌ۣ◌֚b; a◌〪◌̖◌ۣ◌֚b; a◌〪◌̖◌ۣ◌֚b; a◌〪◌̖◌ۣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC SMALL LOW SEEN, LATIN SMALL LETTER B
-0061 06E3 059A 0316 302A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062;0061 302A 06E3 0316 059A 0062; # (a◌ۣ◌֚◌̖◌〪b; a◌〪◌ۣ◌̖◌֚b; a◌〪◌ۣ◌̖◌֚b; a◌〪◌ۣ◌̖◌֚b; a◌〪◌ۣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW SEEN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 06E3 0062;0061 1DFA 0316 06E3 059A 0062;0061 1DFA 0316 06E3 059A 0062;0061 1DFA 0316 06E3 059A 0062;0061 1DFA 0316 06E3 059A 0062; # (a◌֚◌̖◌᷺◌ۣb; a◌᷺◌̖◌ۣ◌֚b; a◌᷺◌̖◌ۣ◌֚b; a◌᷺◌̖◌ۣ◌֚b; a◌᷺◌̖◌ۣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW SEEN, LATIN SMALL LETTER B
+0061 06E3 059A 0316 1DFA 0062;0061 1DFA 06E3 0316 059A 0062;0061 1DFA 06E3 0316 059A 0062;0061 1DFA 06E3 0316 059A 0062;0061 1DFA 06E3 0316 059A 0062; # (a◌ۣ◌֚◌̖◌᷺b; a◌᷺◌ۣ◌̖◌֚b; a◌᷺◌ۣ◌̖◌֚b; a◌᷺◌ۣ◌̖◌֚b; a◌᷺◌ۣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW SEEN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 06E4 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062;00E0 05AE 06E4 0315 0062;0061 05AE 0300 06E4 0315 0062; # (a◌̕◌̀◌֮◌ۤb; à◌֮◌ۤ◌̕b; a◌֮◌̀◌ۤ◌̕b; à◌֮◌ۤ◌̕b; a◌֮◌̀◌ۤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH MADDA, LATIN SMALL LETTER B
0061 06E4 0315 0300 05AE 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062;0061 05AE 06E4 0300 0315 0062; # (a◌ۤ◌̕◌̀◌֮b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; a◌֮◌ۤ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH MADDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 06E7 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062;00E0 05AE 06E7 0315 0062;0061 05AE 0300 06E7 0315 0062; # (a◌̕◌̀◌֮◌ۧb; à◌֮◌ۧ◌̕b; a◌֮◌̀◌ۧ◌̕b; à◌֮◌ۧ◌̕b; a◌֮◌̀◌ۧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH YEH, LATIN SMALL LETTER B
0061 06E7 0315 0300 05AE 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062;0061 05AE 06E7 0300 0315 0062; # (a◌ۧ◌̕◌̀◌֮b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; a◌֮◌ۧ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH YEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 06E8 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062;00E0 05AE 06E8 0315 0062;0061 05AE 0300 06E8 0315 0062; # (a◌̕◌̀◌֮◌ۨb; à◌֮◌ۨ◌̕b; a◌֮◌̀◌ۨ◌̕b; à◌֮◌ۨ◌̕b; a◌֮◌̀◌ۨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH NOON, LATIN SMALL LETTER B
0061 06E8 0315 0300 05AE 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062;0061 05AE 06E8 0300 0315 0062; # (a◌ۨ◌̕◌̀◌֮b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; a◌֮◌ۨ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH NOON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 06EA 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062;0061 302A 0316 06EA 059A 0062; # (a◌֚◌̖◌〪◌۪b; a◌〪◌̖◌۪◌֚b; a◌〪◌̖◌۪◌֚b; a◌〪◌̖◌۪◌֚b; a◌〪◌̖◌۪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC EMPTY CENTRE LOW STOP, LATIN SMALL LETTER B
-0061 06EA 059A 0316 302A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062;0061 302A 06EA 0316 059A 0062; # (a◌۪◌֚◌̖◌〪b; a◌〪◌۪◌̖◌֚b; a◌〪◌۪◌̖◌֚b; a◌〪◌۪◌̖◌֚b; a◌〪◌۪◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC EMPTY CENTRE LOW STOP, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 06EA 0062;0061 1DFA 0316 06EA 059A 0062;0061 1DFA 0316 06EA 059A 0062;0061 1DFA 0316 06EA 059A 0062;0061 1DFA 0316 06EA 059A 0062; # (a◌֚◌̖◌᷺◌۪b; a◌᷺◌̖◌۪◌֚b; a◌᷺◌̖◌۪◌֚b; a◌᷺◌̖◌۪◌֚b; a◌᷺◌̖◌۪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC EMPTY CENTRE LOW STOP, LATIN SMALL LETTER B
+0061 06EA 059A 0316 1DFA 0062;0061 1DFA 06EA 0316 059A 0062;0061 1DFA 06EA 0316 059A 0062;0061 1DFA 06EA 0316 059A 0062;0061 1DFA 06EA 0316 059A 0062; # (a◌۪◌֚◌̖◌᷺b; a◌᷺◌۪◌̖◌֚b; a◌᷺◌۪◌̖◌֚b; a◌᷺◌۪◌̖◌֚b; a◌᷺◌۪◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC EMPTY CENTRE LOW STOP, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 06EB 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062;00E0 05AE 06EB 0315 0062;0061 05AE 0300 06EB 0315 0062; # (a◌̕◌̀◌֮◌۫b; à◌֮◌۫◌̕b; a◌֮◌̀◌۫◌̕b; à◌֮◌۫◌̕b; a◌֮◌̀◌۫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC EMPTY CENTRE HIGH STOP, LATIN SMALL LETTER B
0061 06EB 0315 0300 05AE 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062;0061 05AE 06EB 0300 0315 0062; # (a◌۫◌̕◌̀◌֮b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; a◌֮◌۫◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC EMPTY CENTRE HIGH STOP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 06EC 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062;00E0 05AE 06EC 0315 0062;0061 05AE 0300 06EC 0315 0062; # (a◌̕◌̀◌֮◌۬b; à◌֮◌۬◌̕b; a◌֮◌̀◌۬◌̕b; à◌֮◌۬◌̕b; a◌֮◌̀◌۬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE, LATIN SMALL LETTER B
0061 06EC 0315 0300 05AE 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062;0061 05AE 06EC 0300 0315 0062; # (a◌۬◌̕◌̀◌֮b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; a◌֮◌۬◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 06ED 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062;0061 302A 0316 06ED 059A 0062; # (a◌֚◌̖◌〪◌ۭb; a◌〪◌̖◌ۭ◌֚b; a◌〪◌̖◌ۭ◌֚b; a◌〪◌̖◌ۭ◌֚b; a◌〪◌̖◌ۭ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC SMALL LOW MEEM, LATIN SMALL LETTER B
-0061 06ED 059A 0316 302A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062;0061 302A 06ED 0316 059A 0062; # (a◌ۭ◌֚◌̖◌〪b; a◌〪◌ۭ◌̖◌֚b; a◌〪◌ۭ◌̖◌֚b; a◌〪◌ۭ◌̖◌֚b; a◌〪◌ۭ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW MEEM, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 06ED 0062;0061 1DFA 0316 06ED 059A 0062;0061 1DFA 0316 06ED 059A 0062;0061 1DFA 0316 06ED 059A 0062;0061 1DFA 0316 06ED 059A 0062; # (a◌֚◌̖◌᷺◌ۭb; a◌᷺◌̖◌ۭ◌֚b; a◌᷺◌̖◌ۭ◌֚b; a◌᷺◌̖◌ۭ◌֚b; a◌᷺◌̖◌ۭ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW MEEM, LATIN SMALL LETTER B
+0061 06ED 059A 0316 1DFA 0062;0061 1DFA 06ED 0316 059A 0062;0061 1DFA 06ED 0316 059A 0062;0061 1DFA 06ED 0316 059A 0062;0061 1DFA 06ED 0316 059A 0062; # (a◌ۭ◌֚◌̖◌᷺b; a◌᷺◌ۭ◌̖◌֚b; a◌᷺◌ۭ◌̖◌֚b; a◌᷺◌ۭ◌̖◌֚b; a◌᷺◌ۭ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW MEEM, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0C55 0711 0670 0711 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062; # (a◌ౕ◌ܑ◌ٰ◌ܑb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; ) LATIN SMALL LETTER A, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, SYRIAC LETTER SUPERSCRIPT ALAPH, LATIN SMALL LETTER B
0061 0711 0C55 0711 0670 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062;0061 0670 0711 0711 0C55 0062; # (a◌ܑ◌ౕ◌ܑ◌ٰb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; a◌ٰ◌ܑ◌ܑ◌ౕb; ) LATIN SMALL LETTER A, SYRIAC LETTER SUPERSCRIPT ALAPH, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, ARABIC LETTER SUPERSCRIPT ALEF, LATIN SMALL LETTER B
0061 0315 0300 05AE 0730 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062;00E0 05AE 0730 0315 0062;0061 05AE 0300 0730 0315 0062; # (a◌̕◌̀◌֮◌ܰb; à◌֮◌ܰ◌̕b; a◌֮◌̀◌ܰ◌̕b; à◌֮◌ܰ◌̕b; a◌֮◌̀◌ܰ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC PTHAHA ABOVE, LATIN SMALL LETTER B
0061 0730 0315 0300 05AE 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062;0061 05AE 0730 0300 0315 0062; # (a◌ܰ◌̕◌̀◌֮b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; a◌֮◌ܰ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0731 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062;0061 302A 0316 0731 059A 0062; # (a◌֚◌̖◌〪◌ܱb; a◌〪◌̖◌ܱ◌֚b; a◌〪◌̖◌ܱ◌֚b; a◌〪◌̖◌ܱ◌֚b; a◌〪◌̖◌ܱ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC PTHAHA BELOW, LATIN SMALL LETTER B
-0061 0731 059A 0316 302A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062;0061 302A 0731 0316 059A 0062; # (a◌ܱ◌֚◌̖◌〪b; a◌〪◌ܱ◌̖◌֚b; a◌〪◌ܱ◌̖◌֚b; a◌〪◌ܱ◌̖◌֚b; a◌〪◌ܱ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0731 0062;0061 1DFA 0316 0731 059A 0062;0061 1DFA 0316 0731 059A 0062;0061 1DFA 0316 0731 059A 0062;0061 1DFA 0316 0731 059A 0062; # (a◌֚◌̖◌᷺◌ܱb; a◌᷺◌̖◌ܱ◌֚b; a◌᷺◌̖◌ܱ◌֚b; a◌᷺◌̖◌ܱ◌֚b; a◌᷺◌̖◌ܱ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC PTHAHA BELOW, LATIN SMALL LETTER B
+0061 0731 059A 0316 1DFA 0062;0061 1DFA 0731 0316 059A 0062;0061 1DFA 0731 0316 059A 0062;0061 1DFA 0731 0316 059A 0062;0061 1DFA 0731 0316 059A 0062; # (a◌ܱ◌֚◌̖◌᷺b; a◌᷺◌ܱ◌̖◌֚b; a◌᷺◌ܱ◌̖◌֚b; a◌᷺◌ܱ◌̖◌֚b; a◌᷺◌ܱ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0732 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062;00E0 05AE 0732 0315 0062;0061 05AE 0300 0732 0315 0062; # (a◌̕◌̀◌֮◌ܲb; à◌֮◌ܲ◌̕b; a◌֮◌̀◌ܲ◌̕b; à◌֮◌ܲ◌̕b; a◌֮◌̀◌ܲ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC PTHAHA DOTTED, LATIN SMALL LETTER B
0061 0732 0315 0300 05AE 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062;0061 05AE 0732 0300 0315 0062; # (a◌ܲ◌̕◌̀◌֮b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; a◌֮◌ܲ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC PTHAHA DOTTED, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0733 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062;00E0 05AE 0733 0315 0062;0061 05AE 0300 0733 0315 0062; # (a◌̕◌̀◌֮◌ܳb; à◌֮◌ܳ◌̕b; a◌֮◌̀◌ܳ◌̕b; à◌֮◌ܳ◌̕b; a◌֮◌̀◌ܳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ZQAPHA ABOVE, LATIN SMALL LETTER B
0061 0733 0315 0300 05AE 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062;0061 05AE 0733 0300 0315 0062; # (a◌ܳ◌̕◌̀◌֮b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; a◌֮◌ܳ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0734 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062;0061 302A 0316 0734 059A 0062; # (a◌֚◌̖◌〪◌ܴb; a◌〪◌̖◌ܴ◌֚b; a◌〪◌̖◌ܴ◌֚b; a◌〪◌̖◌ܴ◌֚b; a◌〪◌̖◌ܴ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC ZQAPHA BELOW, LATIN SMALL LETTER B
-0061 0734 059A 0316 302A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062;0061 302A 0734 0316 059A 0062; # (a◌ܴ◌֚◌̖◌〪b; a◌〪◌ܴ◌̖◌֚b; a◌〪◌ܴ◌̖◌֚b; a◌〪◌ܴ◌̖◌֚b; a◌〪◌ܴ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0734 0062;0061 1DFA 0316 0734 059A 0062;0061 1DFA 0316 0734 059A 0062;0061 1DFA 0316 0734 059A 0062;0061 1DFA 0316 0734 059A 0062; # (a◌֚◌̖◌᷺◌ܴb; a◌᷺◌̖◌ܴ◌֚b; a◌᷺◌̖◌ܴ◌֚b; a◌᷺◌̖◌ܴ◌֚b; a◌᷺◌̖◌ܴ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC ZQAPHA BELOW, LATIN SMALL LETTER B
+0061 0734 059A 0316 1DFA 0062;0061 1DFA 0734 0316 059A 0062;0061 1DFA 0734 0316 059A 0062;0061 1DFA 0734 0316 059A 0062;0061 1DFA 0734 0316 059A 0062; # (a◌ܴ◌֚◌̖◌᷺b; a◌᷺◌ܴ◌̖◌֚b; a◌᷺◌ܴ◌̖◌֚b; a◌᷺◌ܴ◌̖◌֚b; a◌᷺◌ܴ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0735 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062;00E0 05AE 0735 0315 0062;0061 05AE 0300 0735 0315 0062; # (a◌̕◌̀◌֮◌ܵb; à◌֮◌ܵ◌̕b; a◌֮◌̀◌ܵ◌̕b; à◌֮◌ܵ◌̕b; a◌֮◌̀◌ܵ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ZQAPHA DOTTED, LATIN SMALL LETTER B
0061 0735 0315 0300 05AE 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062;0061 05AE 0735 0300 0315 0062; # (a◌ܵ◌̕◌̀◌֮b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; a◌֮◌ܵ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ZQAPHA DOTTED, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0736 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062;00E0 05AE 0736 0315 0062;0061 05AE 0300 0736 0315 0062; # (a◌̕◌̀◌֮◌ܶb; à◌֮◌ܶ◌̕b; a◌֮◌̀◌ܶ◌̕b; à◌֮◌ܶ◌̕b; a◌֮◌̀◌ܶ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC RBASA ABOVE, LATIN SMALL LETTER B
0061 0736 0315 0300 05AE 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062;0061 05AE 0736 0300 0315 0062; # (a◌ܶ◌̕◌̀◌֮b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; a◌֮◌ܶ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC RBASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0737 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062;0061 302A 0316 0737 059A 0062; # (a◌֚◌̖◌〪◌ܷb; a◌〪◌̖◌ܷ◌֚b; a◌〪◌̖◌ܷ◌֚b; a◌〪◌̖◌ܷ◌֚b; a◌〪◌̖◌ܷ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC RBASA BELOW, LATIN SMALL LETTER B
-0061 0737 059A 0316 302A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062;0061 302A 0737 0316 059A 0062; # (a◌ܷ◌֚◌̖◌〪b; a◌〪◌ܷ◌̖◌֚b; a◌〪◌ܷ◌̖◌֚b; a◌〪◌ܷ◌̖◌֚b; a◌〪◌ܷ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0738 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062;0061 302A 0316 0738 059A 0062; # (a◌֚◌̖◌〪◌ܸb; a◌〪◌̖◌ܸ◌֚b; a◌〪◌̖◌ܸ◌֚b; a◌〪◌̖◌ܸ◌֚b; a◌〪◌̖◌ܸ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC DOTTED ZLAMA HORIZONTAL, LATIN SMALL LETTER B
-0061 0738 059A 0316 302A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062;0061 302A 0738 0316 059A 0062; # (a◌ܸ◌֚◌̖◌〪b; a◌〪◌ܸ◌̖◌֚b; a◌〪◌ܸ◌̖◌֚b; a◌〪◌ܸ◌̖◌֚b; a◌〪◌ܸ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA HORIZONTAL, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0739 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062;0061 302A 0316 0739 059A 0062; # (a◌֚◌̖◌〪◌ܹb; a◌〪◌̖◌ܹ◌֚b; a◌〪◌̖◌ܹ◌֚b; a◌〪◌̖◌ܹ◌֚b; a◌〪◌̖◌ܹ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC DOTTED ZLAMA ANGULAR, LATIN SMALL LETTER B
-0061 0739 059A 0316 302A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062;0061 302A 0739 0316 059A 0062; # (a◌ܹ◌֚◌̖◌〪b; a◌〪◌ܹ◌̖◌֚b; a◌〪◌ܹ◌̖◌֚b; a◌〪◌ܹ◌̖◌֚b; a◌〪◌ܹ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA ANGULAR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0737 0062;0061 1DFA 0316 0737 059A 0062;0061 1DFA 0316 0737 059A 0062;0061 1DFA 0316 0737 059A 0062;0061 1DFA 0316 0737 059A 0062; # (a◌֚◌̖◌᷺◌ܷb; a◌᷺◌̖◌ܷ◌֚b; a◌᷺◌̖◌ܷ◌֚b; a◌᷺◌̖◌ܷ◌֚b; a◌᷺◌̖◌ܷ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC RBASA BELOW, LATIN SMALL LETTER B
+0061 0737 059A 0316 1DFA 0062;0061 1DFA 0737 0316 059A 0062;0061 1DFA 0737 0316 059A 0062;0061 1DFA 0737 0316 059A 0062;0061 1DFA 0737 0316 059A 0062; # (a◌ܷ◌֚◌̖◌᷺b; a◌᷺◌ܷ◌̖◌֚b; a◌᷺◌ܷ◌̖◌֚b; a◌᷺◌ܷ◌̖◌֚b; a◌᷺◌ܷ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0738 0062;0061 1DFA 0316 0738 059A 0062;0061 1DFA 0316 0738 059A 0062;0061 1DFA 0316 0738 059A 0062;0061 1DFA 0316 0738 059A 0062; # (a◌֚◌̖◌᷺◌ܸb; a◌᷺◌̖◌ܸ◌֚b; a◌᷺◌̖◌ܸ◌֚b; a◌᷺◌̖◌ܸ◌֚b; a◌᷺◌̖◌ܸ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC DOTTED ZLAMA HORIZONTAL, LATIN SMALL LETTER B
+0061 0738 059A 0316 1DFA 0062;0061 1DFA 0738 0316 059A 0062;0061 1DFA 0738 0316 059A 0062;0061 1DFA 0738 0316 059A 0062;0061 1DFA 0738 0316 059A 0062; # (a◌ܸ◌֚◌̖◌᷺b; a◌᷺◌ܸ◌̖◌֚b; a◌᷺◌ܸ◌̖◌֚b; a◌᷺◌ܸ◌̖◌֚b; a◌᷺◌ܸ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA HORIZONTAL, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0739 0062;0061 1DFA 0316 0739 059A 0062;0061 1DFA 0316 0739 059A 0062;0061 1DFA 0316 0739 059A 0062;0061 1DFA 0316 0739 059A 0062; # (a◌֚◌̖◌᷺◌ܹb; a◌᷺◌̖◌ܹ◌֚b; a◌᷺◌̖◌ܹ◌֚b; a◌᷺◌̖◌ܹ◌֚b; a◌᷺◌̖◌ܹ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC DOTTED ZLAMA ANGULAR, LATIN SMALL LETTER B
+0061 0739 059A 0316 1DFA 0062;0061 1DFA 0739 0316 059A 0062;0061 1DFA 0739 0316 059A 0062;0061 1DFA 0739 0316 059A 0062;0061 1DFA 0739 0316 059A 0062; # (a◌ܹ◌֚◌̖◌᷺b; a◌᷺◌ܹ◌̖◌֚b; a◌᷺◌ܹ◌̖◌֚b; a◌᷺◌ܹ◌̖◌֚b; a◌᷺◌ܹ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC DOTTED ZLAMA ANGULAR, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 073A 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062;00E0 05AE 073A 0315 0062;0061 05AE 0300 073A 0315 0062; # (a◌̕◌̀◌֮◌ܺb; à◌֮◌ܺ◌̕b; a◌֮◌̀◌ܺ◌̕b; à◌֮◌ܺ◌̕b; a◌֮◌̀◌ܺ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC HBASA ABOVE, LATIN SMALL LETTER B
0061 073A 0315 0300 05AE 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062;0061 05AE 073A 0300 0315 0062; # (a◌ܺ◌̕◌̀◌֮b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; a◌֮◌ܺ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC HBASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 073B 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062;0061 302A 0316 073B 059A 0062; # (a◌֚◌̖◌〪◌ܻb; a◌〪◌̖◌ܻ◌֚b; a◌〪◌̖◌ܻ◌֚b; a◌〪◌̖◌ܻ◌֚b; a◌〪◌̖◌ܻ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC HBASA BELOW, LATIN SMALL LETTER B
-0061 073B 059A 0316 302A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062;0061 302A 073B 0316 059A 0062; # (a◌ܻ◌֚◌̖◌〪b; a◌〪◌ܻ◌̖◌֚b; a◌〪◌ܻ◌̖◌֚b; a◌〪◌ܻ◌̖◌֚b; a◌〪◌ܻ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 073C 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062;0061 302A 0316 073C 059A 0062; # (a◌֚◌̖◌〪◌ܼb; a◌〪◌̖◌ܼ◌֚b; a◌〪◌̖◌ܼ◌֚b; a◌〪◌̖◌ܼ◌֚b; a◌〪◌̖◌ܼ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC HBASA-ESASA DOTTED, LATIN SMALL LETTER B
-0061 073C 059A 0316 302A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062;0061 302A 073C 0316 059A 0062; # (a◌ܼ◌֚◌̖◌〪b; a◌〪◌ܼ◌̖◌֚b; a◌〪◌ܼ◌̖◌֚b; a◌〪◌ܼ◌̖◌֚b; a◌〪◌ܼ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA-ESASA DOTTED, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 073B 0062;0061 1DFA 0316 073B 059A 0062;0061 1DFA 0316 073B 059A 0062;0061 1DFA 0316 073B 059A 0062;0061 1DFA 0316 073B 059A 0062; # (a◌֚◌̖◌᷺◌ܻb; a◌᷺◌̖◌ܻ◌֚b; a◌᷺◌̖◌ܻ◌֚b; a◌᷺◌̖◌ܻ◌֚b; a◌᷺◌̖◌ܻ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC HBASA BELOW, LATIN SMALL LETTER B
+0061 073B 059A 0316 1DFA 0062;0061 1DFA 073B 0316 059A 0062;0061 1DFA 073B 0316 059A 0062;0061 1DFA 073B 0316 059A 0062;0061 1DFA 073B 0316 059A 0062; # (a◌ܻ◌֚◌̖◌᷺b; a◌᷺◌ܻ◌̖◌֚b; a◌᷺◌ܻ◌̖◌֚b; a◌᷺◌ܻ◌̖◌֚b; a◌᷺◌ܻ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 073C 0062;0061 1DFA 0316 073C 059A 0062;0061 1DFA 0316 073C 059A 0062;0061 1DFA 0316 073C 059A 0062;0061 1DFA 0316 073C 059A 0062; # (a◌֚◌̖◌᷺◌ܼb; a◌᷺◌̖◌ܼ◌֚b; a◌᷺◌̖◌ܼ◌֚b; a◌᷺◌̖◌ܼ◌֚b; a◌᷺◌̖◌ܼ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC HBASA-ESASA DOTTED, LATIN SMALL LETTER B
+0061 073C 059A 0316 1DFA 0062;0061 1DFA 073C 0316 059A 0062;0061 1DFA 073C 0316 059A 0062;0061 1DFA 073C 0316 059A 0062;0061 1DFA 073C 0316 059A 0062; # (a◌ܼ◌֚◌̖◌᷺b; a◌᷺◌ܼ◌̖◌֚b; a◌᷺◌ܼ◌̖◌֚b; a◌᷺◌ܼ◌̖◌֚b; a◌᷺◌ܼ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC HBASA-ESASA DOTTED, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 073D 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062;00E0 05AE 073D 0315 0062;0061 05AE 0300 073D 0315 0062; # (a◌̕◌̀◌֮◌ܽb; à◌֮◌ܽ◌̕b; a◌֮◌̀◌ܽ◌̕b; à◌֮◌ܽ◌̕b; a◌֮◌̀◌ܽ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC ESASA ABOVE, LATIN SMALL LETTER B
0061 073D 0315 0300 05AE 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062;0061 05AE 073D 0300 0315 0062; # (a◌ܽ◌̕◌̀◌֮b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; a◌֮◌ܽ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC ESASA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 073E 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062;0061 302A 0316 073E 059A 0062; # (a◌֚◌̖◌〪◌ܾb; a◌〪◌̖◌ܾ◌֚b; a◌〪◌̖◌ܾ◌֚b; a◌〪◌̖◌ܾ◌֚b; a◌〪◌̖◌ܾ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC ESASA BELOW, LATIN SMALL LETTER B
-0061 073E 059A 0316 302A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062;0061 302A 073E 0316 059A 0062; # (a◌ܾ◌֚◌̖◌〪b; a◌〪◌ܾ◌̖◌֚b; a◌〪◌ܾ◌̖◌֚b; a◌〪◌ܾ◌̖◌֚b; a◌〪◌ܾ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ESASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 073E 0062;0061 1DFA 0316 073E 059A 0062;0061 1DFA 0316 073E 059A 0062;0061 1DFA 0316 073E 059A 0062;0061 1DFA 0316 073E 059A 0062; # (a◌֚◌̖◌᷺◌ܾb; a◌᷺◌̖◌ܾ◌֚b; a◌᷺◌̖◌ܾ◌֚b; a◌᷺◌̖◌ܾ◌֚b; a◌᷺◌̖◌ܾ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC ESASA BELOW, LATIN SMALL LETTER B
+0061 073E 059A 0316 1DFA 0062;0061 1DFA 073E 0316 059A 0062;0061 1DFA 073E 0316 059A 0062;0061 1DFA 073E 0316 059A 0062;0061 1DFA 073E 0316 059A 0062; # (a◌ܾ◌֚◌̖◌᷺b; a◌᷺◌ܾ◌̖◌֚b; a◌᷺◌ܾ◌̖◌֚b; a◌᷺◌ܾ◌̖◌֚b; a◌᷺◌ܾ◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC ESASA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 073F 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062;00E0 05AE 073F 0315 0062;0061 05AE 0300 073F 0315 0062; # (a◌̕◌̀◌֮◌ܿb; à◌֮◌ܿ◌̕b; a◌֮◌̀◌ܿ◌̕b; à◌֮◌ܿ◌̕b; a◌֮◌̀◌ܿ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC RWAHA, LATIN SMALL LETTER B
0061 073F 0315 0300 05AE 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062;0061 05AE 073F 0300 0315 0062; # (a◌ܿ◌̕◌̀◌֮b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; a◌֮◌ܿ◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC RWAHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0740 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062;00E0 05AE 0740 0315 0062;0061 05AE 0300 0740 0315 0062; # (a◌̕◌̀◌֮◌݀b; à◌֮◌݀◌̕b; a◌֮◌̀◌݀◌̕b; à◌֮◌݀◌̕b; a◌֮◌̀◌݀◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC FEMININE DOT, LATIN SMALL LETTER B
0061 0740 0315 0300 05AE 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062;0061 05AE 0740 0300 0315 0062; # (a◌݀◌̕◌̀◌֮b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; a◌֮◌݀◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC FEMININE DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0741 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062;00E0 05AE 0741 0315 0062;0061 05AE 0300 0741 0315 0062; # (a◌̕◌̀◌֮◌Ýb; à◌֮◌Ý◌̕b; a◌֮◌̀◌Ý◌̕b; à◌֮◌Ý◌̕b; a◌֮◌̀◌Ý◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC QUSHSHAYA, LATIN SMALL LETTER B
0061 0741 0315 0300 05AE 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062;0061 05AE 0741 0300 0315 0062; # (aâ—ŒÝ◌̕◌̀◌֮b; a◌֮◌Ý◌̀◌̕b; a◌֮◌Ý◌̀◌̕b; a◌֮◌Ý◌̀◌̕b; a◌֮◌Ý◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC QUSHSHAYA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0742 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062;0061 302A 0316 0742 059A 0062; # (a◌֚◌̖◌〪◌݂b; a◌〪◌̖◌݂◌֚b; a◌〪◌̖◌݂◌֚b; a◌〪◌̖◌݂◌֚b; a◌〪◌̖◌݂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC RUKKAKHA, LATIN SMALL LETTER B
-0061 0742 059A 0316 302A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062;0061 302A 0742 0316 059A 0062; # (a◌݂◌֚◌̖◌〪b; a◌〪◌݂◌̖◌֚b; a◌〪◌݂◌̖◌֚b; a◌〪◌݂◌̖◌֚b; a◌〪◌݂◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RUKKAKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0742 0062;0061 1DFA 0316 0742 059A 0062;0061 1DFA 0316 0742 059A 0062;0061 1DFA 0316 0742 059A 0062;0061 1DFA 0316 0742 059A 0062; # (a◌֚◌̖◌᷺◌݂b; a◌᷺◌̖◌݂◌֚b; a◌᷺◌̖◌݂◌֚b; a◌᷺◌̖◌݂◌֚b; a◌᷺◌̖◌݂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC RUKKAKHA, LATIN SMALL LETTER B
+0061 0742 059A 0316 1DFA 0062;0061 1DFA 0742 0316 059A 0062;0061 1DFA 0742 0316 059A 0062;0061 1DFA 0742 0316 059A 0062;0061 1DFA 0742 0316 059A 0062; # (a◌݂◌֚◌̖◌᷺b; a◌᷺◌݂◌̖◌֚b; a◌᷺◌݂◌̖◌֚b; a◌᷺◌݂◌̖◌֚b; a◌᷺◌݂◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC RUKKAKHA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0743 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062;00E0 05AE 0743 0315 0062;0061 05AE 0300 0743 0315 0062; # (a◌̕◌̀◌֮◌݃b; à◌֮◌݃◌̕b; a◌֮◌̀◌݃◌̕b; à◌֮◌݃◌̕b; a◌֮◌̀◌݃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC TWO VERTICAL DOTS ABOVE, LATIN SMALL LETTER B
0061 0743 0315 0300 05AE 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062;0061 05AE 0743 0300 0315 0062; # (a◌݃◌̕◌̀◌֮b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; a◌֮◌݃◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC TWO VERTICAL DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0744 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062;0061 302A 0316 0744 059A 0062; # (a◌֚◌̖◌〪◌݄b; a◌〪◌̖◌݄◌֚b; a◌〪◌̖◌݄◌֚b; a◌〪◌̖◌݄◌֚b; a◌〪◌̖◌݄◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC TWO VERTICAL DOTS BELOW, LATIN SMALL LETTER B
-0061 0744 059A 0316 302A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062;0061 302A 0744 0316 059A 0062; # (a◌݄◌֚◌̖◌〪b; a◌〪◌݄◌̖◌֚b; a◌〪◌݄◌̖◌֚b; a◌〪◌݄◌̖◌֚b; a◌〪◌݄◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC TWO VERTICAL DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0744 0062;0061 1DFA 0316 0744 059A 0062;0061 1DFA 0316 0744 059A 0062;0061 1DFA 0316 0744 059A 0062;0061 1DFA 0316 0744 059A 0062; # (a◌֚◌̖◌᷺◌݄b; a◌᷺◌̖◌݄◌֚b; a◌᷺◌̖◌݄◌֚b; a◌᷺◌̖◌݄◌֚b; a◌᷺◌̖◌݄◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC TWO VERTICAL DOTS BELOW, LATIN SMALL LETTER B
+0061 0744 059A 0316 1DFA 0062;0061 1DFA 0744 0316 059A 0062;0061 1DFA 0744 0316 059A 0062;0061 1DFA 0744 0316 059A 0062;0061 1DFA 0744 0316 059A 0062; # (a◌݄◌֚◌̖◌᷺b; a◌᷺◌݄◌̖◌֚b; a◌᷺◌݄◌̖◌֚b; a◌᷺◌݄◌̖◌֚b; a◌᷺◌݄◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC TWO VERTICAL DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0745 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062;00E0 05AE 0745 0315 0062;0061 05AE 0300 0745 0315 0062; # (a◌̕◌̀◌֮◌݅b; à◌֮◌݅◌̕b; a◌֮◌̀◌݅◌̕b; à◌֮◌݅◌̕b; a◌֮◌̀◌݅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC THREE DOTS ABOVE, LATIN SMALL LETTER B
0061 0745 0315 0300 05AE 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062;0061 05AE 0745 0300 0315 0062; # (a◌݅◌̕◌̀◌֮b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; a◌֮◌݅◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC THREE DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0746 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062;0061 302A 0316 0746 059A 0062; # (a◌֚◌̖◌〪◌݆b; a◌〪◌̖◌݆◌֚b; a◌〪◌̖◌݆◌֚b; a◌〪◌̖◌݆◌֚b; a◌〪◌̖◌݆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC THREE DOTS BELOW, LATIN SMALL LETTER B
-0061 0746 059A 0316 302A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062;0061 302A 0746 0316 059A 0062; # (a◌݆◌֚◌̖◌〪b; a◌〪◌݆◌̖◌֚b; a◌〪◌݆◌̖◌֚b; a◌〪◌݆◌̖◌֚b; a◌〪◌݆◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC THREE DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0746 0062;0061 1DFA 0316 0746 059A 0062;0061 1DFA 0316 0746 059A 0062;0061 1DFA 0316 0746 059A 0062;0061 1DFA 0316 0746 059A 0062; # (a◌֚◌̖◌᷺◌݆b; a◌᷺◌̖◌݆◌֚b; a◌᷺◌̖◌݆◌֚b; a◌᷺◌̖◌݆◌֚b; a◌᷺◌̖◌݆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC THREE DOTS BELOW, LATIN SMALL LETTER B
+0061 0746 059A 0316 1DFA 0062;0061 1DFA 0746 0316 059A 0062;0061 1DFA 0746 0316 059A 0062;0061 1DFA 0746 0316 059A 0062;0061 1DFA 0746 0316 059A 0062; # (a◌݆◌֚◌̖◌᷺b; a◌᷺◌݆◌̖◌֚b; a◌᷺◌݆◌̖◌֚b; a◌᷺◌݆◌̖◌֚b; a◌᷺◌݆◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC THREE DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0747 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062;00E0 05AE 0747 0315 0062;0061 05AE 0300 0747 0315 0062; # (a◌̕◌̀◌֮◌݇b; à◌֮◌݇◌̕b; a◌֮◌̀◌݇◌̕b; à◌֮◌݇◌̕b; a◌֮◌̀◌݇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC OBLIQUE LINE ABOVE, LATIN SMALL LETTER B
0061 0747 0315 0300 05AE 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062;0061 05AE 0747 0300 0315 0062; # (a◌݇◌̕◌̀◌֮b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; a◌֮◌݇◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC OBLIQUE LINE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0748 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062;0061 302A 0316 0748 059A 0062; # (a◌֚◌̖◌〪◌݈b; a◌〪◌̖◌݈◌֚b; a◌〪◌̖◌݈◌֚b; a◌〪◌̖◌݈◌֚b; a◌〪◌̖◌݈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SYRIAC OBLIQUE LINE BELOW, LATIN SMALL LETTER B
-0061 0748 059A 0316 302A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062;0061 302A 0748 0316 059A 0062; # (a◌݈◌֚◌̖◌〪b; a◌〪◌݈◌̖◌֚b; a◌〪◌݈◌̖◌֚b; a◌〪◌݈◌̖◌֚b; a◌〪◌݈◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC OBLIQUE LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0748 0062;0061 1DFA 0316 0748 059A 0062;0061 1DFA 0316 0748 059A 0062;0061 1DFA 0316 0748 059A 0062;0061 1DFA 0316 0748 059A 0062; # (a◌֚◌̖◌᷺◌݈b; a◌᷺◌̖◌݈◌֚b; a◌᷺◌̖◌݈◌֚b; a◌᷺◌̖◌݈◌֚b; a◌᷺◌̖◌݈◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SYRIAC OBLIQUE LINE BELOW, LATIN SMALL LETTER B
+0061 0748 059A 0316 1DFA 0062;0061 1DFA 0748 0316 059A 0062;0061 1DFA 0748 0316 059A 0062;0061 1DFA 0748 0316 059A 0062;0061 1DFA 0748 0316 059A 0062; # (a◌݈◌֚◌̖◌᷺b; a◌᷺◌݈◌̖◌֚b; a◌᷺◌݈◌̖◌֚b; a◌᷺◌݈◌̖◌֚b; a◌᷺◌݈◌̖◌֚b; ) LATIN SMALL LETTER A, SYRIAC OBLIQUE LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0749 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062;00E0 05AE 0749 0315 0062;0061 05AE 0300 0749 0315 0062; # (a◌̕◌̀◌֮◌݉b; à◌֮◌݉◌̕b; a◌֮◌̀◌݉◌̕b; à◌֮◌݉◌̕b; a◌֮◌̀◌݉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC MUSIC, LATIN SMALL LETTER B
0061 0749 0315 0300 05AE 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062;0061 05AE 0749 0300 0315 0062; # (a◌݉◌̕◌̀◌֮b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; a◌֮◌݉◌̀◌̕b; ) LATIN SMALL LETTER A, SYRIAC MUSIC, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 074A 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062;00E0 05AE 074A 0315 0062;0061 05AE 0300 074A 0315 0062; # (a◌̕◌̀◌֮◌݊b; à◌֮◌݊◌̕b; a◌֮◌̀◌݊◌̕b; à◌֮◌݊◌̕b; a◌֮◌̀◌݊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SYRIAC BARREKH, LATIN SMALL LETTER B
@@ -17489,12 +17548,12 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 07F0 0315 0300 05AE 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062;0061 05AE 07F0 0300 0315 0062; # (a◌߰◌̕◌̀◌֮b; a◌֮◌߰◌̀◌̕b; a◌֮◌߰◌̀◌̕b; a◌֮◌߰◌̀◌̕b; a◌֮◌߰◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING LONG LOW TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 07F1 0062;00E0 05AE 07F1 0315 0062;0061 05AE 0300 07F1 0315 0062;00E0 05AE 07F1 0315 0062;0061 05AE 0300 07F1 0315 0062; # (a◌̕◌̀◌֮◌߱b; à◌֮◌߱◌̕b; a◌֮◌̀◌߱◌̕b; à◌֮◌߱◌̕b; a◌֮◌̀◌߱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING LONG RISING TONE, LATIN SMALL LETTER B
0061 07F1 0315 0300 05AE 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062;0061 05AE 07F1 0300 0315 0062; # (a◌߱◌̕◌̀◌֮b; a◌֮◌߱◌̀◌̕b; a◌֮◌߱◌̀◌̕b; a◌֮◌߱◌̀◌̕b; a◌֮◌߱◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING LONG RISING TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 07F2 0062;0061 302A 0316 07F2 059A 0062;0061 302A 0316 07F2 059A 0062;0061 302A 0316 07F2 059A 0062;0061 302A 0316 07F2 059A 0062; # (a◌֚◌̖◌〪◌߲b; a◌〪◌̖◌߲◌֚b; a◌〪◌̖◌߲◌֚b; a◌〪◌̖◌߲◌֚b; a◌〪◌̖◌߲◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, NKO COMBINING NASALIZATION MARK, LATIN SMALL LETTER B
-0061 07F2 059A 0316 302A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062;0061 302A 07F2 0316 059A 0062; # (a◌߲◌֚◌̖◌〪b; a◌〪◌߲◌̖◌֚b; a◌〪◌߲◌̖◌֚b; a◌〪◌߲◌̖◌֚b; a◌〪◌߲◌̖◌֚b; ) LATIN SMALL LETTER A, NKO COMBINING NASALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 07F2 0062;0061 1DFA 0316 07F2 059A 0062;0061 1DFA 0316 07F2 059A 0062;0061 1DFA 0316 07F2 059A 0062;0061 1DFA 0316 07F2 059A 0062; # (a◌֚◌̖◌᷺◌߲b; a◌᷺◌̖◌߲◌֚b; a◌᷺◌̖◌߲◌֚b; a◌᷺◌̖◌߲◌֚b; a◌᷺◌̖◌߲◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, NKO COMBINING NASALIZATION MARK, LATIN SMALL LETTER B
+0061 07F2 059A 0316 1DFA 0062;0061 1DFA 07F2 0316 059A 0062;0061 1DFA 07F2 0316 059A 0062;0061 1DFA 07F2 0316 059A 0062;0061 1DFA 07F2 0316 059A 0062; # (a◌߲◌֚◌̖◌᷺b; a◌᷺◌߲◌̖◌֚b; a◌᷺◌߲◌̖◌֚b; a◌᷺◌߲◌̖◌֚b; a◌᷺◌߲◌̖◌֚b; ) LATIN SMALL LETTER A, NKO COMBINING NASALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 07F3 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062;00E0 05AE 07F3 0315 0062;0061 05AE 0300 07F3 0315 0062; # (a◌̕◌̀◌֮◌߳b; à◌֮◌߳◌̕b; a◌֮◌̀◌߳◌̕b; à◌֮◌߳◌̕b; a◌֮◌̀◌߳◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NKO COMBINING DOUBLE DOT ABOVE, LATIN SMALL LETTER B
0061 07F3 0315 0300 05AE 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062;0061 05AE 07F3 0300 0315 0062; # (a◌߳◌̕◌̀◌֮b; a◌֮◌߳◌̀◌̕b; a◌֮◌߳◌̀◌̕b; a◌֮◌߳◌̀◌̕b; a◌֮◌߳◌̀◌̕b; ) LATIN SMALL LETTER A, NKO COMBINING DOUBLE DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 07FD 0062;0061 302A 0316 07FD 059A 0062;0061 302A 0316 07FD 059A 0062;0061 302A 0316 07FD 059A 0062;0061 302A 0316 07FD 059A 0062; # (a◌֚◌̖◌〪◌߽b; a◌〪◌̖◌߽◌֚b; a◌〪◌̖◌߽◌֚b; a◌〪◌̖◌߽◌֚b; a◌〪◌̖◌߽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, NKO DANTAYALAN, LATIN SMALL LETTER B
-0061 07FD 059A 0316 302A 0062;0061 302A 07FD 0316 059A 0062;0061 302A 07FD 0316 059A 0062;0061 302A 07FD 0316 059A 0062;0061 302A 07FD 0316 059A 0062; # (a◌߽◌֚◌̖◌〪b; a◌〪◌߽◌̖◌֚b; a◌〪◌߽◌̖◌֚b; a◌〪◌߽◌̖◌֚b; a◌〪◌߽◌̖◌֚b; ) LATIN SMALL LETTER A, NKO DANTAYALAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 07FD 0062;0061 1DFA 0316 07FD 059A 0062;0061 1DFA 0316 07FD 059A 0062;0061 1DFA 0316 07FD 059A 0062;0061 1DFA 0316 07FD 059A 0062; # (a◌֚◌̖◌᷺◌߽b; a◌᷺◌̖◌߽◌֚b; a◌᷺◌̖◌߽◌֚b; a◌᷺◌̖◌߽◌֚b; a◌᷺◌̖◌߽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, NKO DANTAYALAN, LATIN SMALL LETTER B
+0061 07FD 059A 0316 1DFA 0062;0061 1DFA 07FD 0316 059A 0062;0061 1DFA 07FD 0316 059A 0062;0061 1DFA 07FD 0316 059A 0062;0061 1DFA 07FD 0316 059A 0062; # (a◌߽◌֚◌̖◌᷺b; a◌᷺◌߽◌̖◌֚b; a◌᷺◌߽◌̖◌֚b; a◌᷺◌߽◌̖◌֚b; a◌᷺◌߽◌̖◌֚b; ) LATIN SMALL LETTER A, NKO DANTAYALAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0816 0062;00E0 05AE 0816 0315 0062;0061 05AE 0300 0816 0315 0062;00E0 05AE 0816 0315 0062;0061 05AE 0300 0816 0315 0062; # (a◌̕◌̀◌֮◌ࠖb; à◌֮◌ࠖ◌̕b; a◌֮◌̀◌ࠖ◌̕b; à◌֮◌ࠖ◌̕b; a◌֮◌̀◌ࠖ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK IN, LATIN SMALL LETTER B
0061 0816 0315 0300 05AE 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062;0061 05AE 0816 0300 0315 0062; # (a◌ࠖ◌̕◌̀◌֮b; a◌֮◌ࠖ◌̀◌̕b; a◌֮◌ࠖ◌̀◌̕b; a◌֮◌ࠖ◌̀◌̕b; a◌֮◌ࠖ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK IN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0817 0062;00E0 05AE 0817 0315 0062;0061 05AE 0300 0817 0315 0062;00E0 05AE 0817 0315 0062;0061 05AE 0300 0817 0315 0062; # (a◌̕◌̀◌֮◌ࠗb; à◌֮◌ࠗ◌̕b; a◌֮◌̀◌ࠗ◌̕b; à◌֮◌ࠗ◌̕b; a◌֮◌̀◌ࠗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK IN-ALAF, LATIN SMALL LETTER B
@@ -17537,14 +17596,48 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 082C 0315 0300 05AE 0062;0061 05AE 082C 0300 0315 0062;0061 05AE 082C 0300 0315 0062;0061 05AE 082C 0300 0315 0062;0061 05AE 082C 0300 0315 0062; # (a◌ࠬ◌̕◌̀◌֮b; a◌֮◌ࠬ◌̀◌̕b; a◌֮◌ࠬ◌̀◌̕b; a◌֮◌ࠬ◌̀◌̕b; a◌֮◌ࠬ◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN VOWEL SIGN SUKUN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 082D 0062;00E0 05AE 082D 0315 0062;0061 05AE 0300 082D 0315 0062;00E0 05AE 082D 0315 0062;0061 05AE 0300 082D 0315 0062; # (a◌̕◌̀◌֮◌࠭b; à◌֮◌࠭◌̕b; a◌֮◌̀◌࠭◌̕b; à◌֮◌࠭◌̕b; a◌֮◌̀◌࠭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SAMARITAN MARK NEQUDAA, LATIN SMALL LETTER B
0061 082D 0315 0300 05AE 0062;0061 05AE 082D 0300 0315 0062;0061 05AE 082D 0300 0315 0062;0061 05AE 082D 0300 0315 0062;0061 05AE 082D 0300 0315 0062; # (a◌࠭◌̕◌̀◌֮b; a◌֮◌࠭◌̀◌̕b; a◌֮◌࠭◌̀◌̕b; a◌֮◌࠭◌̀◌̕b; a◌֮◌࠭◌̀◌̕b; ) LATIN SMALL LETTER A, SAMARITAN MARK NEQUDAA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0859 0062;0061 302A 0316 0859 059A 0062;0061 302A 0316 0859 059A 0062;0061 302A 0316 0859 059A 0062;0061 302A 0316 0859 059A 0062; # (a◌֚◌̖◌〪◌࡙b; a◌〪◌̖◌࡙◌֚b; a◌〪◌̖◌࡙◌֚b; a◌〪◌̖◌࡙◌֚b; a◌〪◌̖◌࡙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANDAIC AFFRICATION MARK, LATIN SMALL LETTER B
-0061 0859 059A 0316 302A 0062;0061 302A 0859 0316 059A 0062;0061 302A 0859 0316 059A 0062;0061 302A 0859 0316 059A 0062;0061 302A 0859 0316 059A 0062; # (a◌࡙◌֚◌̖◌〪b; a◌〪◌࡙◌̖◌֚b; a◌〪◌࡙◌̖◌֚b; a◌〪◌࡙◌̖◌֚b; a◌〪◌࡙◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC AFFRICATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 085A 0062;0061 302A 0316 085A 059A 0062;0061 302A 0316 085A 059A 0062;0061 302A 0316 085A 059A 0062;0061 302A 0316 085A 059A 0062; # (a◌֚◌̖◌〪◌࡚b; a◌〪◌̖◌࡚◌֚b; a◌〪◌̖◌࡚◌֚b; a◌〪◌̖◌࡚◌֚b; a◌〪◌̖◌࡚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANDAIC VOCALIZATION MARK, LATIN SMALL LETTER B
-0061 085A 059A 0316 302A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062;0061 302A 085A 0316 059A 0062; # (a◌࡚◌֚◌̖◌〪b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; a◌〪◌࡚◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC VOCALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 085B 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062;0061 302A 0316 085B 059A 0062; # (a◌֚◌̖◌〪◌࡛b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; a◌〪◌̖◌࡛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANDAIC GEMINATION MARK, LATIN SMALL LETTER B
-0061 085B 059A 0316 302A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062;0061 302A 085B 0316 059A 0062; # (a◌࡛◌֚◌̖◌〪b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; a◌〪◌࡛◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC GEMINATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 08D3 0062;0061 302A 0316 08D3 059A 0062;0061 302A 0316 08D3 059A 0062;0061 302A 0316 08D3 059A 0062;0061 302A 0316 08D3 059A 0062; # (a◌֚◌̖◌〪◌࣓b; a◌〪◌̖◌࣓◌֚b; a◌〪◌̖◌࣓◌֚b; a◌〪◌̖◌࣓◌֚b; a◌〪◌̖◌࣓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC SMALL LOW WAW, LATIN SMALL LETTER B
-0061 08D3 059A 0316 302A 0062;0061 302A 08D3 0316 059A 0062;0061 302A 08D3 0316 059A 0062;0061 302A 08D3 0316 059A 0062;0061 302A 08D3 0316 059A 0062; # (a◌࣓◌֚◌̖◌〪b; a◌〪◌࣓◌̖◌֚b; a◌〪◌࣓◌̖◌֚b; a◌〪◌࣓◌̖◌֚b; a◌〪◌࣓◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WAW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0859 0062;0061 1DFA 0316 0859 059A 0062;0061 1DFA 0316 0859 059A 0062;0061 1DFA 0316 0859 059A 0062;0061 1DFA 0316 0859 059A 0062; # (a◌֚◌̖◌᷺◌࡙b; a◌᷺◌̖◌࡙◌֚b; a◌᷺◌̖◌࡙◌֚b; a◌᷺◌̖◌࡙◌֚b; a◌᷺◌̖◌࡙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANDAIC AFFRICATION MARK, LATIN SMALL LETTER B
+0061 0859 059A 0316 1DFA 0062;0061 1DFA 0859 0316 059A 0062;0061 1DFA 0859 0316 059A 0062;0061 1DFA 0859 0316 059A 0062;0061 1DFA 0859 0316 059A 0062; # (a◌࡙◌֚◌̖◌᷺b; a◌᷺◌࡙◌̖◌֚b; a◌᷺◌࡙◌̖◌֚b; a◌᷺◌࡙◌̖◌֚b; a◌᷺◌࡙◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC AFFRICATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 085A 0062;0061 1DFA 0316 085A 059A 0062;0061 1DFA 0316 085A 059A 0062;0061 1DFA 0316 085A 059A 0062;0061 1DFA 0316 085A 059A 0062; # (a◌֚◌̖◌᷺◌࡚b; a◌᷺◌̖◌࡚◌֚b; a◌᷺◌̖◌࡚◌֚b; a◌᷺◌̖◌࡚◌֚b; a◌᷺◌̖◌࡚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANDAIC VOCALIZATION MARK, LATIN SMALL LETTER B
+0061 085A 059A 0316 1DFA 0062;0061 1DFA 085A 0316 059A 0062;0061 1DFA 085A 0316 059A 0062;0061 1DFA 085A 0316 059A 0062;0061 1DFA 085A 0316 059A 0062; # (a◌࡚◌֚◌̖◌᷺b; a◌᷺◌࡚◌̖◌֚b; a◌᷺◌࡚◌̖◌֚b; a◌᷺◌࡚◌̖◌֚b; a◌᷺◌࡚◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC VOCALIZATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 085B 0062;0061 1DFA 0316 085B 059A 0062;0061 1DFA 0316 085B 059A 0062;0061 1DFA 0316 085B 059A 0062;0061 1DFA 0316 085B 059A 0062; # (a◌֚◌̖◌᷺◌࡛b; a◌᷺◌̖◌࡛◌֚b; a◌᷺◌̖◌࡛◌֚b; a◌᷺◌̖◌࡛◌֚b; a◌᷺◌̖◌࡛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANDAIC GEMINATION MARK, LATIN SMALL LETTER B
+0061 085B 059A 0316 1DFA 0062;0061 1DFA 085B 0316 059A 0062;0061 1DFA 085B 0316 059A 0062;0061 1DFA 085B 0316 059A 0062;0061 1DFA 085B 0316 059A 0062; # (a◌࡛◌֚◌̖◌᷺b; a◌᷺◌࡛◌̖◌֚b; a◌᷺◌࡛◌̖◌֚b; a◌᷺◌࡛◌̖◌֚b; a◌᷺◌࡛◌̖◌֚b; ) LATIN SMALL LETTER A, MANDAIC GEMINATION MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 0898 0062;00E0 05AE 0898 0315 0062;0061 05AE 0300 0898 0315 0062;00E0 05AE 0898 0315 0062;0061 05AE 0300 0898 0315 0062; # (a◌̕◌̀◌֮◌࢘b; à◌֮◌࢘◌̕b; a◌֮◌̀◌࢘◌̕b; à◌֮◌࢘◌̕b; a◌֮◌̀◌࢘◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AL-JUZ, LATIN SMALL LETTER B
+0061 0898 0315 0300 05AE 0062;0061 05AE 0898 0300 0315 0062;0061 05AE 0898 0300 0315 0062;0061 05AE 0898 0300 0315 0062;0061 05AE 0898 0300 0315 0062; # (a◌࢘◌̕◌̀◌֮b; a◌֮◌࢘◌̀◌̕b; a◌֮◌࢘◌̀◌̕b; a◌֮◌࢘◌̀◌̕b; a◌֮◌࢘◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AL-JUZ, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0899 0062;0061 1DFA 0316 0899 059A 0062;0061 1DFA 0316 0899 059A 0062;0061 1DFA 0316 0899 059A 0062;0061 1DFA 0316 0899 059A 0062; # (a◌֚◌̖◌᷺◌࢙b; a◌᷺◌̖◌࢙◌֚b; a◌᷺◌̖◌࢙◌֚b; a◌᷺◌̖◌࢙◌֚b; a◌᷺◌̖◌࢙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD ISHMAAM, LATIN SMALL LETTER B
+0061 0899 059A 0316 1DFA 0062;0061 1DFA 0899 0316 059A 0062;0061 1DFA 0899 0316 059A 0062;0061 1DFA 0899 0316 059A 0062;0061 1DFA 0899 0316 059A 0062; # (a◌࢙◌֚◌̖◌᷺b; a◌᷺◌࢙◌̖◌֚b; a◌᷺◌࢙◌̖◌֚b; a◌᷺◌࢙◌̖◌֚b; a◌᷺◌࢙◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD ISHMAAM, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 089A 0062;0061 1DFA 0316 089A 059A 0062;0061 1DFA 0316 089A 059A 0062;0061 1DFA 0316 089A 059A 0062;0061 1DFA 0316 089A 059A 0062; # (a◌֚◌̖◌᷺◌࢚b; a◌᷺◌̖◌࢚◌֚b; a◌᷺◌̖◌࢚◌֚b; a◌᷺◌̖◌࢚◌֚b; a◌᷺◌̖◌࢚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD IMAALA, LATIN SMALL LETTER B
+0061 089A 059A 0316 1DFA 0062;0061 1DFA 089A 0316 059A 0062;0061 1DFA 089A 0316 059A 0062;0061 1DFA 089A 0316 059A 0062;0061 1DFA 089A 0316 059A 0062; # (a◌࢚◌֚◌̖◌᷺b; a◌᷺◌࢚◌̖◌֚b; a◌᷺◌࢚◌̖◌֚b; a◌᷺◌࢚◌̖◌֚b; a◌᷺◌࢚◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD IMAALA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 089B 0062;0061 1DFA 0316 089B 059A 0062;0061 1DFA 0316 089B 059A 0062;0061 1DFA 0316 089B 059A 0062;0061 1DFA 0316 089B 059A 0062; # (a◌֚◌̖◌᷺◌࢛b; a◌᷺◌̖◌࢛◌֚b; a◌᷺◌̖◌࢛◌֚b; a◌᷺◌̖◌࢛◌֚b; a◌᷺◌̖◌࢛◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WORD TASHEEL, LATIN SMALL LETTER B
+0061 089B 059A 0316 1DFA 0062;0061 1DFA 089B 0316 059A 0062;0061 1DFA 089B 0316 059A 0062;0061 1DFA 089B 0316 059A 0062;0061 1DFA 089B 0316 059A 0062; # (a◌࢛◌֚◌̖◌᷺b; a◌᷺◌࢛◌̖◌֚b; a◌᷺◌࢛◌̖◌֚b; a◌᷺◌࢛◌̖◌֚b; a◌᷺◌࢛◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WORD TASHEEL, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 089C 0062;00E0 05AE 089C 0315 0062;0061 05AE 0300 089C 0315 0062;00E0 05AE 089C 0315 0062;0061 05AE 0300 089C 0315 0062; # (a◌̕◌̀◌֮◌࢜b; à◌֮◌࢜◌̕b; a◌֮◌̀◌࢜◌̕b; à◌֮◌࢜◌̕b; a◌֮◌̀◌࢜◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC MADDA WAAJIB, LATIN SMALL LETTER B
+0061 089C 0315 0300 05AE 0062;0061 05AE 089C 0300 0315 0062;0061 05AE 089C 0300 0315 0062;0061 05AE 089C 0300 0315 0062;0061 05AE 089C 0300 0315 0062; # (a◌࢜◌̕◌̀◌֮b; a◌֮◌࢜◌̀◌̕b; a◌֮◌࢜◌̀◌̕b; a◌֮◌࢜◌̀◌̕b; a◌֮◌࢜◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC MADDA WAAJIB, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 089D 0062;00E0 05AE 089D 0315 0062;0061 05AE 0300 089D 0315 0062;00E0 05AE 089D 0315 0062;0061 05AE 0300 089D 0315 0062; # (a◌̕◌̀◌֮◌à¢b; à◌֮◌à¢â—ŒÌ•b; a◌֮◌̀◌à¢â—ŒÌ•b; à◌֮◌à¢â—ŒÌ•b; a◌֮◌̀◌à¢â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SUPERSCRIPT ALEF MOKHASSAS, LATIN SMALL LETTER B
+0061 089D 0315 0300 05AE 0062;0061 05AE 089D 0300 0315 0062;0061 05AE 089D 0300 0315 0062;0061 05AE 089D 0300 0315 0062;0061 05AE 089D 0300 0315 0062; # (aâ—Œà¢â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌à¢â—ŒÌ€â—ŒÌ•b; a◌֮◌à¢â—ŒÌ€â—ŒÌ•b; a◌֮◌à¢â—ŒÌ€â—ŒÌ•b; a◌֮◌à¢â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, ARABIC SUPERSCRIPT ALEF MOKHASSAS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 089E 0062;00E0 05AE 089E 0315 0062;0061 05AE 0300 089E 0315 0062;00E0 05AE 089E 0315 0062;0061 05AE 0300 089E 0315 0062; # (a◌̕◌̀◌֮◌࢞b; à◌֮◌࢞◌̕b; a◌֮◌̀◌࢞◌̕b; à◌֮◌࢞◌̕b; a◌֮◌̀◌࢞◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC DOUBLED MADDA, LATIN SMALL LETTER B
+0061 089E 0315 0300 05AE 0062;0061 05AE 089E 0300 0315 0062;0061 05AE 089E 0300 0315 0062;0061 05AE 089E 0300 0315 0062;0061 05AE 089E 0300 0315 0062; # (a◌࢞◌̕◌̀◌֮b; a◌֮◌࢞◌̀◌̕b; a◌֮◌࢞◌̀◌̕b; a◌֮◌࢞◌̀◌̕b; a◌֮◌࢞◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC DOUBLED MADDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 089F 0062;00E0 05AE 089F 0315 0062;0061 05AE 0300 089F 0315 0062;00E0 05AE 089F 0315 0062;0061 05AE 0300 089F 0315 0062; # (a◌̕◌̀◌֮◌࢟b; à◌֮◌࢟◌̕b; a◌֮◌̀◌࢟◌̕b; à◌֮◌࢟◌̕b; a◌֮◌̀◌࢟◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC HALF MADDA OVER MADDA, LATIN SMALL LETTER B
+0061 089F 0315 0300 05AE 0062;0061 05AE 089F 0300 0315 0062;0061 05AE 089F 0300 0315 0062;0061 05AE 089F 0300 0315 0062;0061 05AE 089F 0300 0315 0062; # (a◌࢟◌̕◌̀◌֮b; a◌֮◌࢟◌̀◌̕b; a◌֮◌࢟◌̀◌̕b; a◌֮◌࢟◌̀◌̕b; a◌֮◌࢟◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC HALF MADDA OVER MADDA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 08CA 0062;00E0 05AE 08CA 0315 0062;0061 05AE 0300 08CA 0315 0062;00E0 05AE 08CA 0315 0062;0061 05AE 0300 08CA 0315 0062; # (a◌̕◌̀◌֮◌࣊b; à◌֮◌࣊◌̕b; a◌֮◌̀◌࣊◌̕b; à◌֮◌࣊◌̕b; a◌֮◌̀◌࣊◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH FARSI YEH, LATIN SMALL LETTER B
+0061 08CA 0315 0300 05AE 0062;0061 05AE 08CA 0300 0315 0062;0061 05AE 08CA 0300 0315 0062;0061 05AE 08CA 0300 0315 0062;0061 05AE 08CA 0300 0315 0062; # (a◌࣊◌̕◌̀◌֮b; a◌֮◌࣊◌̀◌̕b; a◌֮◌࣊◌̀◌̕b; a◌֮◌࣊◌̀◌̕b; a◌֮◌࣊◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH FARSI YEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 08CB 0062;00E0 05AE 08CB 0315 0062;0061 05AE 0300 08CB 0315 0062;00E0 05AE 08CB 0315 0062;0061 05AE 0300 08CB 0315 0062; # (a◌̕◌̀◌֮◌࣋b; à◌֮◌࣋◌̕b; a◌֮◌̀◌࣋◌̕b; à◌֮◌࣋◌̕b; a◌֮◌̀◌࣋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW, LATIN SMALL LETTER B
+0061 08CB 0315 0300 05AE 0062;0061 05AE 08CB 0300 0315 0062;0061 05AE 08CB 0300 0315 0062;0061 05AE 08CB 0300 0315 0062;0061 05AE 08CB 0300 0315 0062; # (a◌࣋◌̕◌̀◌֮b; a◌֮◌࣋◌̀◌̕b; a◌֮◌࣋◌̀◌̕b; a◌֮◌࣋◌̀◌̕b; a◌֮◌࣋◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 08CC 0062;00E0 05AE 08CC 0315 0062;0061 05AE 0300 08CC 0315 0062;00E0 05AE 08CC 0315 0062;0061 05AE 0300 08CC 0315 0062; # (a◌̕◌̀◌֮◌࣌b; à◌֮◌࣌◌̕b; a◌֮◌̀◌࣌◌̕b; à◌֮◌࣌◌̕b; a◌֮◌̀◌࣌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD SAH, LATIN SMALL LETTER B
+0061 08CC 0315 0300 05AE 0062;0061 05AE 08CC 0300 0315 0062;0061 05AE 08CC 0300 0315 0062;0061 05AE 08CC 0300 0315 0062;0061 05AE 08CC 0300 0315 0062; # (a◌࣌◌̕◌̀◌֮b; a◌֮◌࣌◌̀◌̕b; a◌֮◌࣌◌̀◌̕b; a◌֮◌࣌◌̀◌̕b; a◌֮◌࣌◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD SAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 08CD 0062;00E0 05AE 08CD 0315 0062;0061 05AE 0300 08CD 0315 0062;00E0 05AE 08CD 0315 0062;0061 05AE 0300 08CD 0315 0062; # (a◌̕◌̀◌֮◌à£b; à◌֮◌à£â—ŒÌ•b; a◌֮◌̀◌à£â—ŒÌ•b; à◌֮◌à£â—ŒÌ•b; a◌֮◌̀◌à£â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH ZAH, LATIN SMALL LETTER B
+0061 08CD 0315 0300 05AE 0062;0061 05AE 08CD 0300 0315 0062;0061 05AE 08CD 0300 0315 0062;0061 05AE 08CD 0300 0315 0062;0061 05AE 08CD 0300 0315 0062; # (aâ—Œà£â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌à£â—ŒÌ€â—ŒÌ•b; a◌֮◌à£â—ŒÌ€â—ŒÌ•b; a◌֮◌à£â—ŒÌ€â—ŒÌ•b; a◌֮◌à£â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH ZAH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 08CE 0062;00E0 05AE 08CE 0315 0062;0061 05AE 0300 08CE 0315 0062;00E0 05AE 08CE 0315 0062;0061 05AE 0300 08CE 0315 0062; # (a◌̕◌̀◌֮◌࣎b; à◌֮◌࣎◌̕b; a◌֮◌̀◌࣎◌̕b; à◌֮◌࣎◌̕b; a◌֮◌̀◌࣎◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC LARGE ROUND DOT ABOVE, LATIN SMALL LETTER B
+0061 08CE 0315 0300 05AE 0062;0061 05AE 08CE 0300 0315 0062;0061 05AE 08CE 0300 0315 0062;0061 05AE 08CE 0300 0315 0062;0061 05AE 08CE 0300 0315 0062; # (a◌࣎◌̕◌̀◌֮b; a◌֮◌࣎◌̀◌̕b; a◌֮◌࣎◌̀◌̕b; a◌֮◌࣎◌̀◌̕b; a◌֮◌࣎◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC LARGE ROUND DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08CF 0062;0061 1DFA 0316 08CF 059A 0062;0061 1DFA 0316 08CF 059A 0062;0061 1DFA 0316 08CF 059A 0062;0061 1DFA 0316 08CF 059A 0062; # (a◌֚◌̖◌᷺◌à£b; a◌᷺◌̖◌à£â—ŒÖšb; a◌᷺◌̖◌à£â—ŒÖšb; a◌᷺◌̖◌à£â—ŒÖšb; a◌᷺◌̖◌à£â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LARGE ROUND DOT BELOW, LATIN SMALL LETTER B
+0061 08CF 059A 0316 1DFA 0062;0061 1DFA 08CF 0316 059A 0062;0061 1DFA 08CF 0316 059A 0062;0061 1DFA 08CF 0316 059A 0062;0061 1DFA 08CF 0316 059A 0062; # (aâ—Œà£â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌à£â—ŒÌ–◌֚b; a◌᷺◌à£â—ŒÌ–◌֚b; a◌᷺◌à£â—ŒÌ–◌֚b; a◌᷺◌à£â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, ARABIC LARGE ROUND DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08D0 0062;0061 1DFA 0316 08D0 059A 0062;0061 1DFA 0316 08D0 059A 0062;0061 1DFA 0316 08D0 059A 0062;0061 1DFA 0316 08D0 059A 0062; # (a◌֚◌̖◌᷺◌à£b; a◌᷺◌̖◌à£â—ŒÖšb; a◌᷺◌̖◌à£â—ŒÖšb; a◌᷺◌̖◌à£â—ŒÖšb; a◌᷺◌̖◌à£â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SUKUN BELOW, LATIN SMALL LETTER B
+0061 08D0 059A 0316 1DFA 0062;0061 1DFA 08D0 0316 059A 0062;0061 1DFA 08D0 0316 059A 0062;0061 1DFA 08D0 0316 059A 0062;0061 1DFA 08D0 0316 059A 0062; # (aâ—Œà£â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌à£â—ŒÌ–◌֚b; a◌᷺◌à£â—ŒÌ–◌֚b; a◌᷺◌à£â—ŒÌ–◌֚b; a◌᷺◌à£â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, ARABIC SUKUN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08D1 0062;0061 1DFA 0316 08D1 059A 0062;0061 1DFA 0316 08D1 059A 0062;0061 1DFA 0316 08D1 059A 0062;0061 1DFA 0316 08D1 059A 0062; # (a◌֚◌̖◌᷺◌࣑b; a◌᷺◌̖◌࣑◌֚b; a◌᷺◌̖◌࣑◌֚b; a◌᷺◌̖◌࣑◌֚b; a◌᷺◌̖◌࣑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LARGE CIRCLE BELOW, LATIN SMALL LETTER B
+0061 08D1 059A 0316 1DFA 0062;0061 1DFA 08D1 0316 059A 0062;0061 1DFA 08D1 0316 059A 0062;0061 1DFA 08D1 0316 059A 0062;0061 1DFA 08D1 0316 059A 0062; # (a◌࣑◌֚◌̖◌᷺b; a◌᷺◌࣑◌̖◌֚b; a◌᷺◌࣑◌̖◌֚b; a◌᷺◌࣑◌̖◌֚b; a◌᷺◌࣑◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LARGE CIRCLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08D2 0062;0061 1DFA 0316 08D2 059A 0062;0061 1DFA 0316 08D2 059A 0062;0061 1DFA 0316 08D2 059A 0062;0061 1DFA 0316 08D2 059A 0062; # (a◌֚◌̖◌᷺◌࣒b; a◌᷺◌̖◌࣒◌֚b; a◌᷺◌̖◌࣒◌֚b; a◌᷺◌̖◌࣒◌֚b; a◌᷺◌̖◌࣒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW, LATIN SMALL LETTER B
+0061 08D2 059A 0316 1DFA 0062;0061 1DFA 08D2 0316 059A 0062;0061 1DFA 08D2 0316 059A 0062;0061 1DFA 08D2 0316 059A 0062;0061 1DFA 08D2 0316 059A 0062; # (a◌࣒◌֚◌̖◌᷺b; a◌᷺◌࣒◌̖◌֚b; a◌᷺◌࣒◌̖◌֚b; a◌᷺◌࣒◌̖◌֚b; a◌᷺◌࣒◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08D3 0062;0061 1DFA 0316 08D3 059A 0062;0061 1DFA 0316 08D3 059A 0062;0061 1DFA 0316 08D3 059A 0062;0061 1DFA 0316 08D3 059A 0062; # (a◌֚◌̖◌᷺◌࣓b; a◌᷺◌̖◌࣓◌֚b; a◌᷺◌̖◌࣓◌֚b; a◌᷺◌̖◌࣓◌֚b; a◌᷺◌̖◌࣓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC SMALL LOW WAW, LATIN SMALL LETTER B
+0061 08D3 059A 0316 1DFA 0062;0061 1DFA 08D3 0316 059A 0062;0061 1DFA 08D3 0316 059A 0062;0061 1DFA 08D3 0316 059A 0062;0061 1DFA 08D3 0316 059A 0062; # (a◌࣓◌֚◌̖◌᷺b; a◌᷺◌࣓◌̖◌֚b; a◌᷺◌࣓◌̖◌֚b; a◌᷺◌࣓◌̖◌֚b; a◌᷺◌࣓◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC SMALL LOW WAW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 08D4 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062;00E0 05AE 08D4 0315 0062;0061 05AE 0300 08D4 0315 0062; # (a◌̕◌̀◌֮◌ࣔb; à◌֮◌ࣔ◌̕b; a◌֮◌̀◌ࣔ◌̕b; à◌֮◌ࣔ◌̕b; a◌֮◌̀◌ࣔ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH WORD AR-RUB, LATIN SMALL LETTER B
0061 08D4 0315 0300 05AE 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062;0061 05AE 08D4 0300 0315 0062; # (a◌ࣔ◌̕◌̀◌֮b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; a◌֮◌ࣔ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH WORD AR-RUB, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08D5 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062;00E0 05AE 08D5 0315 0062;0061 05AE 0300 08D5 0315 0062; # (a◌̕◌̀◌֮◌ࣕb; à◌֮◌ࣕ◌̕b; a◌֮◌̀◌ࣕ◌̕b; à◌֮◌ࣕ◌̕b; a◌֮◌̀◌ࣕ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SAD, LATIN SMALL LETTER B
@@ -17573,32 +17666,32 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 08E0 0315 0300 05AE 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062;0061 05AE 08E0 0300 0315 0062; # (a◌࣠◌̕◌̀◌֮b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; a◌֮◌࣠◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH FOOTNOTE MARKER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08E1 0062;00E0 05AE 08E1 0315 0062;0061 05AE 0300 08E1 0315 0062;00E0 05AE 08E1 0315 0062;0061 05AE 0300 08E1 0315 0062; # (a◌̕◌̀◌֮◌࣡b; à◌֮◌࣡◌̕b; a◌֮◌̀◌࣡◌̕b; à◌֮◌࣡◌̕b; a◌֮◌̀◌࣡◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC SMALL HIGH SIGN SAFHA, LATIN SMALL LETTER B
0061 08E1 0315 0300 05AE 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062;0061 05AE 08E1 0300 0315 0062; # (a◌࣡◌̕◌̀◌֮b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; a◌֮◌࣡◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC SMALL HIGH SIGN SAFHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 08E3 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062;0061 302A 0316 08E3 059A 0062; # (a◌֚◌̖◌〪◌ࣣb; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; a◌〪◌̖◌ࣣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC TURNED DAMMA BELOW, LATIN SMALL LETTER B
-0061 08E3 059A 0316 302A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062;0061 302A 08E3 0316 059A 0062; # (a◌ࣣ◌֚◌̖◌〪b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; a◌〪◌ࣣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TURNED DAMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08E3 0062;0061 1DFA 0316 08E3 059A 0062;0061 1DFA 0316 08E3 059A 0062;0061 1DFA 0316 08E3 059A 0062;0061 1DFA 0316 08E3 059A 0062; # (a◌֚◌̖◌᷺◌ࣣb; a◌᷺◌̖◌ࣣ◌֚b; a◌᷺◌̖◌ࣣ◌֚b; a◌᷺◌̖◌ࣣ◌֚b; a◌᷺◌̖◌ࣣ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TURNED DAMMA BELOW, LATIN SMALL LETTER B
+0061 08E3 059A 0316 1DFA 0062;0061 1DFA 08E3 0316 059A 0062;0061 1DFA 08E3 0316 059A 0062;0061 1DFA 08E3 0316 059A 0062;0061 1DFA 08E3 0316 059A 0062; # (a◌ࣣ◌֚◌̖◌᷺b; a◌᷺◌ࣣ◌̖◌֚b; a◌᷺◌ࣣ◌̖◌֚b; a◌᷺◌ࣣ◌̖◌֚b; a◌᷺◌ࣣ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TURNED DAMMA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 08E4 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062;00E0 05AE 08E4 0315 0062;0061 05AE 0300 08E4 0315 0062; # (a◌̕◌̀◌֮◌ࣤb; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; à◌֮◌ࣤ◌̕b; a◌֮◌̀◌ࣤ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY FATHA, LATIN SMALL LETTER B
0061 08E4 0315 0300 05AE 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062;0061 05AE 08E4 0300 0315 0062; # (a◌ࣤ◌̕◌̀◌֮b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; a◌֮◌ࣤ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY FATHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08E5 0062;00E0 05AE 08E5 0315 0062;0061 05AE 0300 08E5 0315 0062;00E0 05AE 08E5 0315 0062;0061 05AE 0300 08E5 0315 0062; # (a◌̕◌̀◌֮◌ࣥb; à◌֮◌ࣥ◌̕b; a◌֮◌̀◌ࣥ◌̕b; à◌֮◌ࣥ◌̕b; a◌֮◌̀◌ࣥ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY DAMMA, LATIN SMALL LETTER B
0061 08E5 0315 0300 05AE 0062;0061 05AE 08E5 0300 0315 0062;0061 05AE 08E5 0300 0315 0062;0061 05AE 08E5 0300 0315 0062;0061 05AE 08E5 0300 0315 0062; # (a◌ࣥ◌̕◌̀◌֮b; a◌֮◌ࣥ◌̀◌̕b; a◌֮◌ࣥ◌̀◌̕b; a◌֮◌ࣥ◌̀◌̕b; a◌֮◌ࣥ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY DAMMA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 08E6 0062;0061 302A 0316 08E6 059A 0062;0061 302A 0316 08E6 059A 0062;0061 302A 0316 08E6 059A 0062;0061 302A 0316 08E6 059A 0062; # (a◌֚◌̖◌〪◌ࣦb; a◌〪◌̖◌ࣦ◌֚b; a◌〪◌̖◌ࣦ◌֚b; a◌〪◌̖◌ࣦ◌֚b; a◌〪◌̖◌ࣦ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC CURLY KASRA, LATIN SMALL LETTER B
-0061 08E6 059A 0316 302A 0062;0061 302A 08E6 0316 059A 0062;0061 302A 08E6 0316 059A 0062;0061 302A 08E6 0316 059A 0062;0061 302A 08E6 0316 059A 0062; # (a◌ࣦ◌֚◌̖◌〪b; a◌〪◌ࣦ◌̖◌֚b; a◌〪◌ࣦ◌̖◌֚b; a◌〪◌ࣦ◌̖◌֚b; a◌〪◌ࣦ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC CURLY KASRA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08E6 0062;0061 1DFA 0316 08E6 059A 0062;0061 1DFA 0316 08E6 059A 0062;0061 1DFA 0316 08E6 059A 0062;0061 1DFA 0316 08E6 059A 0062; # (a◌֚◌̖◌᷺◌ࣦb; a◌᷺◌̖◌ࣦ◌֚b; a◌᷺◌̖◌ࣦ◌֚b; a◌᷺◌̖◌ࣦ◌֚b; a◌᷺◌̖◌ࣦ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC CURLY KASRA, LATIN SMALL LETTER B
+0061 08E6 059A 0316 1DFA 0062;0061 1DFA 08E6 0316 059A 0062;0061 1DFA 08E6 0316 059A 0062;0061 1DFA 08E6 0316 059A 0062;0061 1DFA 08E6 0316 059A 0062; # (a◌ࣦ◌֚◌̖◌᷺b; a◌᷺◌ࣦ◌̖◌֚b; a◌᷺◌ࣦ◌̖◌֚b; a◌᷺◌ࣦ◌̖◌֚b; a◌᷺◌ࣦ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC CURLY KASRA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 08E7 0062;00E0 05AE 08E7 0315 0062;0061 05AE 0300 08E7 0315 0062;00E0 05AE 08E7 0315 0062;0061 05AE 0300 08E7 0315 0062; # (a◌̕◌̀◌֮◌ࣧb; à◌֮◌ࣧ◌̕b; a◌֮◌̀◌ࣧ◌̕b; à◌֮◌ࣧ◌̕b; a◌֮◌̀◌ࣧ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY FATHATAN, LATIN SMALL LETTER B
0061 08E7 0315 0300 05AE 0062;0061 05AE 08E7 0300 0315 0062;0061 05AE 08E7 0300 0315 0062;0061 05AE 08E7 0300 0315 0062;0061 05AE 08E7 0300 0315 0062; # (a◌ࣧ◌̕◌̀◌֮b; a◌֮◌ࣧ◌̀◌̕b; a◌֮◌ࣧ◌̀◌̕b; a◌֮◌ࣧ◌̀◌̕b; a◌֮◌ࣧ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY FATHATAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08E8 0062;00E0 05AE 08E8 0315 0062;0061 05AE 0300 08E8 0315 0062;00E0 05AE 08E8 0315 0062;0061 05AE 0300 08E8 0315 0062; # (a◌̕◌̀◌֮◌ࣨb; à◌֮◌ࣨ◌̕b; a◌֮◌̀◌ࣨ◌̕b; à◌֮◌ࣨ◌̕b; a◌֮◌̀◌ࣨ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC CURLY DAMMATAN, LATIN SMALL LETTER B
0061 08E8 0315 0300 05AE 0062;0061 05AE 08E8 0300 0315 0062;0061 05AE 08E8 0300 0315 0062;0061 05AE 08E8 0300 0315 0062;0061 05AE 08E8 0300 0315 0062; # (a◌ࣨ◌̕◌̀◌֮b; a◌֮◌ࣨ◌̀◌̕b; a◌֮◌ࣨ◌̀◌̕b; a◌֮◌ࣨ◌̀◌̕b; a◌֮◌ࣨ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC CURLY DAMMATAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 08E9 0062;0061 302A 0316 08E9 059A 0062;0061 302A 0316 08E9 059A 0062;0061 302A 0316 08E9 059A 0062;0061 302A 0316 08E9 059A 0062; # (a◌֚◌̖◌〪◌ࣩb; a◌〪◌̖◌ࣩ◌֚b; a◌〪◌̖◌ࣩ◌֚b; a◌〪◌̖◌ࣩ◌֚b; a◌〪◌̖◌ࣩ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC CURLY KASRATAN, LATIN SMALL LETTER B
-0061 08E9 059A 0316 302A 0062;0061 302A 08E9 0316 059A 0062;0061 302A 08E9 0316 059A 0062;0061 302A 08E9 0316 059A 0062;0061 302A 08E9 0316 059A 0062; # (a◌ࣩ◌֚◌̖◌〪b; a◌〪◌ࣩ◌̖◌֚b; a◌〪◌ࣩ◌̖◌֚b; a◌〪◌ࣩ◌̖◌֚b; a◌〪◌ࣩ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC CURLY KASRATAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08E9 0062;0061 1DFA 0316 08E9 059A 0062;0061 1DFA 0316 08E9 059A 0062;0061 1DFA 0316 08E9 059A 0062;0061 1DFA 0316 08E9 059A 0062; # (a◌֚◌̖◌᷺◌ࣩb; a◌᷺◌̖◌ࣩ◌֚b; a◌᷺◌̖◌ࣩ◌֚b; a◌᷺◌̖◌ࣩ◌֚b; a◌᷺◌̖◌ࣩ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC CURLY KASRATAN, LATIN SMALL LETTER B
+0061 08E9 059A 0316 1DFA 0062;0061 1DFA 08E9 0316 059A 0062;0061 1DFA 08E9 0316 059A 0062;0061 1DFA 08E9 0316 059A 0062;0061 1DFA 08E9 0316 059A 0062; # (a◌ࣩ◌֚◌̖◌᷺b; a◌᷺◌ࣩ◌̖◌֚b; a◌᷺◌ࣩ◌̖◌֚b; a◌᷺◌ࣩ◌̖◌֚b; a◌᷺◌ࣩ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC CURLY KASRATAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 08EA 0062;00E0 05AE 08EA 0315 0062;0061 05AE 0300 08EA 0315 0062;00E0 05AE 08EA 0315 0062;0061 05AE 0300 08EA 0315 0062; # (a◌̕◌̀◌֮◌࣪b; à◌֮◌࣪◌̕b; a◌֮◌̀◌࣪◌̕b; à◌֮◌࣪◌̕b; a◌֮◌̀◌࣪◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC TONE ONE DOT ABOVE, LATIN SMALL LETTER B
0061 08EA 0315 0300 05AE 0062;0061 05AE 08EA 0300 0315 0062;0061 05AE 08EA 0300 0315 0062;0061 05AE 08EA 0300 0315 0062;0061 05AE 08EA 0300 0315 0062; # (a◌࣪◌̕◌̀◌֮b; a◌֮◌࣪◌̀◌̕b; a◌֮◌࣪◌̀◌̕b; a◌֮◌࣪◌̀◌̕b; a◌֮◌࣪◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC TONE ONE DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08EB 0062;00E0 05AE 08EB 0315 0062;0061 05AE 0300 08EB 0315 0062;00E0 05AE 08EB 0315 0062;0061 05AE 0300 08EB 0315 0062; # (a◌̕◌̀◌֮◌࣫b; à◌֮◌࣫◌̕b; a◌֮◌̀◌࣫◌̕b; à◌֮◌࣫◌̕b; a◌֮◌̀◌࣫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC TONE TWO DOTS ABOVE, LATIN SMALL LETTER B
0061 08EB 0315 0300 05AE 0062;0061 05AE 08EB 0300 0315 0062;0061 05AE 08EB 0300 0315 0062;0061 05AE 08EB 0300 0315 0062;0061 05AE 08EB 0300 0315 0062; # (a◌࣫◌̕◌̀◌֮b; a◌֮◌࣫◌̀◌̕b; a◌֮◌࣫◌̀◌̕b; a◌֮◌࣫◌̀◌̕b; a◌֮◌࣫◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC TONE TWO DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08EC 0062;00E0 05AE 08EC 0315 0062;0061 05AE 0300 08EC 0315 0062;00E0 05AE 08EC 0315 0062;0061 05AE 0300 08EC 0315 0062; # (a◌̕◌̀◌֮◌࣬b; à◌֮◌࣬◌̕b; a◌֮◌̀◌࣬◌̕b; à◌֮◌࣬◌̕b; a◌֮◌̀◌࣬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC TONE LOOP ABOVE, LATIN SMALL LETTER B
0061 08EC 0315 0300 05AE 0062;0061 05AE 08EC 0300 0315 0062;0061 05AE 08EC 0300 0315 0062;0061 05AE 08EC 0300 0315 0062;0061 05AE 08EC 0300 0315 0062; # (a◌࣬◌̕◌̀◌֮b; a◌֮◌࣬◌̀◌̕b; a◌֮◌࣬◌̀◌̕b; a◌֮◌࣬◌̀◌̕b; a◌֮◌࣬◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC TONE LOOP ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 08ED 0062;0061 302A 0316 08ED 059A 0062;0061 302A 0316 08ED 059A 0062;0061 302A 0316 08ED 059A 0062;0061 302A 0316 08ED 059A 0062; # (a◌֚◌̖◌〪◌࣭b; a◌〪◌̖◌࣭◌֚b; a◌〪◌̖◌࣭◌֚b; a◌〪◌̖◌࣭◌֚b; a◌〪◌̖◌࣭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC TONE ONE DOT BELOW, LATIN SMALL LETTER B
-0061 08ED 059A 0316 302A 0062;0061 302A 08ED 0316 059A 0062;0061 302A 08ED 0316 059A 0062;0061 302A 08ED 0316 059A 0062;0061 302A 08ED 0316 059A 0062; # (a◌࣭◌֚◌̖◌〪b; a◌〪◌࣭◌̖◌֚b; a◌〪◌࣭◌̖◌֚b; a◌〪◌࣭◌̖◌֚b; a◌〪◌࣭◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE ONE DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 08EE 0062;0061 302A 0316 08EE 059A 0062;0061 302A 0316 08EE 059A 0062;0061 302A 0316 08EE 059A 0062;0061 302A 0316 08EE 059A 0062; # (a◌֚◌̖◌〪◌࣮b; a◌〪◌̖◌࣮◌֚b; a◌〪◌̖◌࣮◌֚b; a◌〪◌̖◌࣮◌֚b; a◌〪◌̖◌࣮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC TONE TWO DOTS BELOW, LATIN SMALL LETTER B
-0061 08EE 059A 0316 302A 0062;0061 302A 08EE 0316 059A 0062;0061 302A 08EE 0316 059A 0062;0061 302A 08EE 0316 059A 0062;0061 302A 08EE 0316 059A 0062; # (a◌࣮◌֚◌̖◌〪b; a◌〪◌࣮◌̖◌֚b; a◌〪◌࣮◌̖◌֚b; a◌〪◌࣮◌̖◌֚b; a◌〪◌࣮◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 08EF 0062;0061 302A 0316 08EF 059A 0062;0061 302A 0316 08EF 059A 0062;0061 302A 0316 08EF 059A 0062;0061 302A 0316 08EF 059A 0062; # (a◌֚◌̖◌〪◌࣯b; a◌〪◌̖◌࣯◌֚b; a◌〪◌̖◌࣯◌֚b; a◌〪◌̖◌࣯◌֚b; a◌〪◌̖◌࣯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC TONE LOOP BELOW, LATIN SMALL LETTER B
-0061 08EF 059A 0316 302A 0062;0061 302A 08EF 0316 059A 0062;0061 302A 08EF 0316 059A 0062;0061 302A 08EF 0316 059A 0062;0061 302A 08EF 0316 059A 0062; # (a◌࣯◌֚◌̖◌〪b; a◌〪◌࣯◌̖◌֚b; a◌〪◌࣯◌̖◌֚b; a◌〪◌࣯◌̖◌֚b; a◌〪◌࣯◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE LOOP BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08ED 0062;0061 1DFA 0316 08ED 059A 0062;0061 1DFA 0316 08ED 059A 0062;0061 1DFA 0316 08ED 059A 0062;0061 1DFA 0316 08ED 059A 0062; # (a◌֚◌̖◌᷺◌࣭b; a◌᷺◌̖◌࣭◌֚b; a◌᷺◌̖◌࣭◌֚b; a◌᷺◌̖◌࣭◌֚b; a◌᷺◌̖◌࣭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TONE ONE DOT BELOW, LATIN SMALL LETTER B
+0061 08ED 059A 0316 1DFA 0062;0061 1DFA 08ED 0316 059A 0062;0061 1DFA 08ED 0316 059A 0062;0061 1DFA 08ED 0316 059A 0062;0061 1DFA 08ED 0316 059A 0062; # (a◌࣭◌֚◌̖◌᷺b; a◌᷺◌࣭◌̖◌֚b; a◌᷺◌࣭◌̖◌֚b; a◌᷺◌࣭◌̖◌֚b; a◌᷺◌࣭◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE ONE DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08EE 0062;0061 1DFA 0316 08EE 059A 0062;0061 1DFA 0316 08EE 059A 0062;0061 1DFA 0316 08EE 059A 0062;0061 1DFA 0316 08EE 059A 0062; # (a◌֚◌̖◌᷺◌࣮b; a◌᷺◌̖◌࣮◌֚b; a◌᷺◌̖◌࣮◌֚b; a◌᷺◌̖◌࣮◌֚b; a◌᷺◌̖◌࣮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TONE TWO DOTS BELOW, LATIN SMALL LETTER B
+0061 08EE 059A 0316 1DFA 0062;0061 1DFA 08EE 0316 059A 0062;0061 1DFA 08EE 0316 059A 0062;0061 1DFA 08EE 0316 059A 0062;0061 1DFA 08EE 0316 059A 0062; # (a◌࣮◌֚◌̖◌᷺b; a◌᷺◌࣮◌̖◌֚b; a◌᷺◌࣮◌̖◌֚b; a◌᷺◌࣮◌̖◌֚b; a◌᷺◌࣮◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08EF 0062;0061 1DFA 0316 08EF 059A 0062;0061 1DFA 0316 08EF 059A 0062;0061 1DFA 0316 08EF 059A 0062;0061 1DFA 0316 08EF 059A 0062; # (a◌֚◌̖◌᷺◌࣯b; a◌᷺◌̖◌࣯◌֚b; a◌᷺◌̖◌࣯◌֚b; a◌᷺◌̖◌࣯◌֚b; a◌᷺◌̖◌࣯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC TONE LOOP BELOW, LATIN SMALL LETTER B
+0061 08EF 059A 0316 1DFA 0062;0061 1DFA 08EF 0316 059A 0062;0061 1DFA 08EF 0316 059A 0062;0061 1DFA 08EF 0316 059A 0062;0061 1DFA 08EF 0316 059A 0062; # (a◌࣯◌֚◌̖◌᷺b; a◌᷺◌࣯◌̖◌֚b; a◌᷺◌࣯◌̖◌֚b; a◌᷺◌࣯◌̖◌֚b; a◌᷺◌࣯◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC TONE LOOP BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 064C 064B FB1E 08F0 0062;0061 FB1E 064B 08F0 064C 0062;0061 FB1E 064B 08F0 064C 0062;0061 FB1E 064B 08F0 064C 0062;0061 FB1E 064B 08F0 064C 0062; # (a◌ٌ◌ً◌ﬞ◌ࣰb; a◌ﬞ◌ً◌ࣰ◌ٌb; a◌ﬞ◌ً◌ࣰ◌ٌb; a◌ﬞ◌ً◌ࣰ◌ٌb; a◌ﬞ◌ً◌ࣰ◌ٌb; ) LATIN SMALL LETTER A, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, ARABIC OPEN FATHATAN, LATIN SMALL LETTER B
0061 08F0 064C 064B FB1E 0062;0061 FB1E 08F0 064B 064C 0062;0061 FB1E 08F0 064B 064C 0062;0061 FB1E 08F0 064B 064C 0062;0061 FB1E 08F0 064B 064C 0062; # (a◌ࣰ◌ٌ◌ً◌ﬞb; a◌ﬞ◌ࣰ◌ً◌ٌb; a◌ﬞ◌ࣰ◌ً◌ٌb; a◌ﬞ◌ࣰ◌ً◌ٌb; a◌ﬞ◌ࣰ◌ً◌ٌb; ) LATIN SMALL LETTER A, ARABIC OPEN FATHATAN, ARABIC DAMMATAN, ARABIC FATHATAN, HEBREW POINT JUDEO-SPANISH VARIKA, LATIN SMALL LETTER B
0061 064D 064C 064B 08F1 0062;0061 064B 064C 08F1 064D 0062;0061 064B 064C 08F1 064D 0062;0061 064B 064C 08F1 064D 0062;0061 064B 064C 08F1 064D 0062; # (aâ—ŒÙ◌ٌ◌ً◌ࣱb; a◌ً◌ٌ◌ࣱ◌Ùb; a◌ً◌ٌ◌ࣱ◌Ùb; a◌ً◌ٌ◌ࣱ◌Ùb; a◌ً◌ٌ◌ࣱ◌Ùb; ) LATIN SMALL LETTER A, ARABIC KASRATAN, ARABIC DAMMATAN, ARABIC FATHATAN, ARABIC OPEN DAMMATAN, LATIN SMALL LETTER B
@@ -17611,16 +17704,16 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 08F4 0315 0300 05AE 0062;0061 05AE 08F4 0300 0315 0062;0061 05AE 08F4 0300 0315 0062;0061 05AE 08F4 0300 0315 0062;0061 05AE 08F4 0300 0315 0062; # (a◌ࣴ◌̕◌̀◌֮b; a◌֮◌ࣴ◌̀◌̕b; a◌֮◌ࣴ◌̀◌̕b; a◌֮◌ࣴ◌̀◌̕b; a◌֮◌ࣴ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC FATHA WITH RING, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08F5 0062;00E0 05AE 08F5 0315 0062;0061 05AE 0300 08F5 0315 0062;00E0 05AE 08F5 0315 0062;0061 05AE 0300 08F5 0315 0062; # (a◌̕◌̀◌֮◌ࣵb; à◌֮◌ࣵ◌̕b; a◌֮◌̀◌ࣵ◌̕b; à◌֮◌ࣵ◌̕b; a◌֮◌̀◌ࣵ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC FATHA WITH DOT ABOVE, LATIN SMALL LETTER B
0061 08F5 0315 0300 05AE 0062;0061 05AE 08F5 0300 0315 0062;0061 05AE 08F5 0300 0315 0062;0061 05AE 08F5 0300 0315 0062;0061 05AE 08F5 0300 0315 0062; # (a◌ࣵ◌̕◌̀◌֮b; a◌֮◌ࣵ◌̀◌̕b; a◌֮◌ࣵ◌̀◌̕b; a◌֮◌ࣵ◌̀◌̕b; a◌֮◌ࣵ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC FATHA WITH DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 08F6 0062;0061 302A 0316 08F6 059A 0062;0061 302A 0316 08F6 059A 0062;0061 302A 0316 08F6 059A 0062;0061 302A 0316 08F6 059A 0062; # (a◌֚◌̖◌〪◌ࣶb; a◌〪◌̖◌ࣶ◌֚b; a◌〪◌̖◌ࣶ◌֚b; a◌〪◌̖◌ࣶ◌֚b; a◌〪◌̖◌ࣶ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC KASRA WITH DOT BELOW, LATIN SMALL LETTER B
-0061 08F6 059A 0316 302A 0062;0061 302A 08F6 0316 059A 0062;0061 302A 08F6 0316 059A 0062;0061 302A 08F6 0316 059A 0062;0061 302A 08F6 0316 059A 0062; # (a◌ࣶ◌֚◌̖◌〪b; a◌〪◌ࣶ◌̖◌֚b; a◌〪◌ࣶ◌̖◌֚b; a◌〪◌ࣶ◌̖◌֚b; a◌〪◌ࣶ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC KASRA WITH DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08F6 0062;0061 1DFA 0316 08F6 059A 0062;0061 1DFA 0316 08F6 059A 0062;0061 1DFA 0316 08F6 059A 0062;0061 1DFA 0316 08F6 059A 0062; # (a◌֚◌̖◌᷺◌ࣶb; a◌᷺◌̖◌ࣶ◌֚b; a◌᷺◌̖◌ࣶ◌֚b; a◌᷺◌̖◌ࣶ◌֚b; a◌᷺◌̖◌ࣶ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC KASRA WITH DOT BELOW, LATIN SMALL LETTER B
+0061 08F6 059A 0316 1DFA 0062;0061 1DFA 08F6 0316 059A 0062;0061 1DFA 08F6 0316 059A 0062;0061 1DFA 08F6 0316 059A 0062;0061 1DFA 08F6 0316 059A 0062; # (a◌ࣶ◌֚◌̖◌᷺b; a◌᷺◌ࣶ◌̖◌֚b; a◌᷺◌ࣶ◌̖◌֚b; a◌᷺◌ࣶ◌̖◌֚b; a◌᷺◌ࣶ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC KASRA WITH DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 08F7 0062;00E0 05AE 08F7 0315 0062;0061 05AE 0300 08F7 0315 0062;00E0 05AE 08F7 0315 0062;0061 05AE 0300 08F7 0315 0062; # (a◌̕◌̀◌֮◌ࣷb; à◌֮◌ࣷ◌̕b; a◌֮◌̀◌ࣷ◌̕b; à◌֮◌ࣷ◌̕b; a◌֮◌̀◌ࣷ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC LEFT ARROWHEAD ABOVE, LATIN SMALL LETTER B
0061 08F7 0315 0300 05AE 0062;0061 05AE 08F7 0300 0315 0062;0061 05AE 08F7 0300 0315 0062;0061 05AE 08F7 0300 0315 0062;0061 05AE 08F7 0300 0315 0062; # (a◌ࣷ◌̕◌̀◌֮b; a◌֮◌ࣷ◌̀◌̕b; a◌֮◌ࣷ◌̀◌̕b; a◌֮◌ࣷ◌̀◌̕b; a◌֮◌ࣷ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC LEFT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08F8 0062;00E0 05AE 08F8 0315 0062;0061 05AE 0300 08F8 0315 0062;00E0 05AE 08F8 0315 0062;0061 05AE 0300 08F8 0315 0062; # (a◌̕◌̀◌֮◌ࣸb; à◌֮◌ࣸ◌̕b; a◌֮◌̀◌ࣸ◌̕b; à◌֮◌ࣸ◌̕b; a◌֮◌̀◌ࣸ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC RIGHT ARROWHEAD ABOVE, LATIN SMALL LETTER B
0061 08F8 0315 0300 05AE 0062;0061 05AE 08F8 0300 0315 0062;0061 05AE 08F8 0300 0315 0062;0061 05AE 08F8 0300 0315 0062;0061 05AE 08F8 0300 0315 0062; # (a◌ࣸ◌̕◌̀◌֮b; a◌֮◌ࣸ◌̀◌̕b; a◌֮◌ࣸ◌̀◌̕b; a◌֮◌ࣸ◌̀◌̕b; a◌֮◌ࣸ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC RIGHT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 08F9 0062;0061 302A 0316 08F9 059A 0062;0061 302A 0316 08F9 059A 0062;0061 302A 0316 08F9 059A 0062;0061 302A 0316 08F9 059A 0062; # (a◌֚◌̖◌〪◌ࣹb; a◌〪◌̖◌ࣹ◌֚b; a◌〪◌̖◌ࣹ◌֚b; a◌〪◌̖◌ࣹ◌֚b; a◌〪◌̖◌ࣹ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC LEFT ARROWHEAD BELOW, LATIN SMALL LETTER B
-0061 08F9 059A 0316 302A 0062;0061 302A 08F9 0316 059A 0062;0061 302A 08F9 0316 059A 0062;0061 302A 08F9 0316 059A 0062;0061 302A 08F9 0316 059A 0062; # (a◌ࣹ◌֚◌̖◌〪b; a◌〪◌ࣹ◌̖◌֚b; a◌〪◌ࣹ◌̖◌֚b; a◌〪◌ࣹ◌̖◌֚b; a◌〪◌ࣹ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LEFT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 08FA 0062;0061 302A 0316 08FA 059A 0062;0061 302A 0316 08FA 059A 0062;0061 302A 0316 08FA 059A 0062;0061 302A 0316 08FA 059A 0062; # (a◌֚◌̖◌〪◌ࣺb; a◌〪◌̖◌ࣺ◌֚b; a◌〪◌̖◌ࣺ◌֚b; a◌〪◌̖◌ࣺ◌֚b; a◌〪◌̖◌ࣺ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, ARABIC RIGHT ARROWHEAD BELOW, LATIN SMALL LETTER B
-0061 08FA 059A 0316 302A 0062;0061 302A 08FA 0316 059A 0062;0061 302A 08FA 0316 059A 0062;0061 302A 08FA 0316 059A 0062;0061 302A 08FA 0316 059A 0062; # (a◌ࣺ◌֚◌̖◌〪b; a◌〪◌ࣺ◌̖◌֚b; a◌〪◌ࣺ◌̖◌֚b; a◌〪◌ࣺ◌̖◌֚b; a◌〪◌ࣺ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC RIGHT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08F9 0062;0061 1DFA 0316 08F9 059A 0062;0061 1DFA 0316 08F9 059A 0062;0061 1DFA 0316 08F9 059A 0062;0061 1DFA 0316 08F9 059A 0062; # (a◌֚◌̖◌᷺◌ࣹb; a◌᷺◌̖◌ࣹ◌֚b; a◌᷺◌̖◌ࣹ◌֚b; a◌᷺◌̖◌ࣹ◌֚b; a◌᷺◌̖◌ࣹ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC LEFT ARROWHEAD BELOW, LATIN SMALL LETTER B
+0061 08F9 059A 0316 1DFA 0062;0061 1DFA 08F9 0316 059A 0062;0061 1DFA 08F9 0316 059A 0062;0061 1DFA 08F9 0316 059A 0062;0061 1DFA 08F9 0316 059A 0062; # (a◌ࣹ◌֚◌̖◌᷺b; a◌᷺◌ࣹ◌̖◌֚b; a◌᷺◌ࣹ◌̖◌֚b; a◌᷺◌ࣹ◌̖◌֚b; a◌᷺◌ࣹ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC LEFT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 08FA 0062;0061 1DFA 0316 08FA 059A 0062;0061 1DFA 0316 08FA 059A 0062;0061 1DFA 0316 08FA 059A 0062;0061 1DFA 0316 08FA 059A 0062; # (a◌֚◌̖◌᷺◌ࣺb; a◌᷺◌̖◌ࣺ◌֚b; a◌᷺◌̖◌ࣺ◌֚b; a◌᷺◌̖◌ࣺ◌֚b; a◌᷺◌̖◌ࣺ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, ARABIC RIGHT ARROWHEAD BELOW, LATIN SMALL LETTER B
+0061 08FA 059A 0316 1DFA 0062;0061 1DFA 08FA 0316 059A 0062;0061 1DFA 08FA 0316 059A 0062;0061 1DFA 08FA 0316 059A 0062;0061 1DFA 08FA 0316 059A 0062; # (a◌ࣺ◌֚◌̖◌᷺b; a◌᷺◌ࣺ◌̖◌֚b; a◌᷺◌ࣺ◌̖◌֚b; a◌᷺◌ࣺ◌̖◌֚b; a◌᷺◌ࣺ◌̖◌֚b; ) LATIN SMALL LETTER A, ARABIC RIGHT ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 08FB 0062;00E0 05AE 08FB 0315 0062;0061 05AE 0300 08FB 0315 0062;00E0 05AE 08FB 0315 0062;0061 05AE 0300 08FB 0315 0062; # (a◌̕◌̀◌֮◌ࣻb; à◌֮◌ࣻ◌̕b; a◌֮◌̀◌ࣻ◌̕b; à◌֮◌ࣻ◌̕b; a◌֮◌̀◌ࣻ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC DOUBLE RIGHT ARROWHEAD ABOVE, LATIN SMALL LETTER B
0061 08FB 0315 0300 05AE 0062;0061 05AE 08FB 0300 0315 0062;0061 05AE 08FB 0300 0315 0062;0061 05AE 08FB 0300 0315 0062;0061 05AE 08FB 0300 0315 0062; # (a◌ࣻ◌̕◌̀◌֮b; a◌֮◌ࣻ◌̀◌̕b; a◌֮◌ࣻ◌̀◌̕b; a◌֮◌ࣻ◌̀◌̕b; a◌֮◌ࣻ◌̀◌̕b; ) LATIN SMALL LETTER A, ARABIC DOUBLE RIGHT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 08FC 0062;00E0 05AE 08FC 0315 0062;0061 05AE 0300 08FC 0315 0062;00E0 05AE 08FC 0315 0062;0061 05AE 0300 08FC 0315 0062; # (a◌̕◌̀◌֮◌ࣼb; à◌֮◌ࣼ◌̕b; a◌֮◌̀◌ࣼ◌̕b; à◌֮◌ࣼ◌̕b; a◌֮◌̀◌ࣼ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT, LATIN SMALL LETTER B
@@ -17637,8 +17730,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 094D 05B0 094D 3099 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062;0061 3099 094D 094D 05B0 0062; # (aâ—Œà¥â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌à¥â—Œà¥â—ŒÖ°b; a◌゙◌à¥â—Œà¥â—ŒÖ°b; a◌゙◌à¥â—Œà¥â—ŒÖ°b; a◌゙◌à¥â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, DEVANAGARI SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 0951 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062;00E0 05AE 0951 0315 0062;0061 05AE 0300 0951 0315 0062; # (a◌̕◌̀◌֮◌॑b; à◌֮◌॑◌̕b; a◌֮◌̀◌॑◌̕b; à◌֮◌॑◌̕b; a◌֮◌̀◌॑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI STRESS SIGN UDATTA, LATIN SMALL LETTER B
0061 0951 0315 0300 05AE 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062;0061 05AE 0951 0300 0315 0062; # (a◌॑◌̕◌̀◌֮b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; a◌֮◌॑◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI STRESS SIGN UDATTA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0952 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062;0061 302A 0316 0952 059A 0062; # (a◌֚◌̖◌〪◌॒b; a◌〪◌̖◌॒◌֚b; a◌〪◌̖◌॒◌֚b; a◌〪◌̖◌॒◌֚b; a◌〪◌̖◌॒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, DEVANAGARI STRESS SIGN ANUDATTA, LATIN SMALL LETTER B
-0061 0952 059A 0316 302A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062;0061 302A 0952 0316 059A 0062; # (a◌॒◌֚◌̖◌〪b; a◌〪◌॒◌̖◌֚b; a◌〪◌॒◌̖◌֚b; a◌〪◌॒◌̖◌֚b; a◌〪◌॒◌̖◌֚b; ) LATIN SMALL LETTER A, DEVANAGARI STRESS SIGN ANUDATTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0952 0062;0061 1DFA 0316 0952 059A 0062;0061 1DFA 0316 0952 059A 0062;0061 1DFA 0316 0952 059A 0062;0061 1DFA 0316 0952 059A 0062; # (a◌֚◌̖◌᷺◌॒b; a◌᷺◌̖◌॒◌֚b; a◌᷺◌̖◌॒◌֚b; a◌᷺◌̖◌॒◌֚b; a◌᷺◌̖◌॒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, DEVANAGARI STRESS SIGN ANUDATTA, LATIN SMALL LETTER B
+0061 0952 059A 0316 1DFA 0062;0061 1DFA 0952 0316 059A 0062;0061 1DFA 0952 0316 059A 0062;0061 1DFA 0952 0316 059A 0062;0061 1DFA 0952 0316 059A 0062; # (a◌॒◌֚◌̖◌᷺b; a◌᷺◌॒◌̖◌֚b; a◌᷺◌॒◌̖◌֚b; a◌᷺◌॒◌̖◌֚b; a◌᷺◌॒◌̖◌֚b; ) LATIN SMALL LETTER A, DEVANAGARI STRESS SIGN ANUDATTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 0953 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062;00E0 05AE 0953 0315 0062;0061 05AE 0300 0953 0315 0062; # (a◌̕◌̀◌֮◌॓b; à◌֮◌॓◌̕b; a◌֮◌̀◌॓◌̕b; à◌֮◌॓◌̕b; a◌֮◌̀◌॓◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI GRAVE ACCENT, LATIN SMALL LETTER B
0061 0953 0315 0300 05AE 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062;0061 05AE 0953 0300 0315 0062; # (a◌॓◌̕◌̀◌֮b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; a◌֮◌॓◌̀◌̕b; ) LATIN SMALL LETTER A, DEVANAGARI GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0954 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062;00E0 05AE 0954 0315 0062;0061 05AE 0300 0954 0315 0062; # (a◌̕◌̀◌֮◌॔b; à◌֮◌॔◌̕b; a◌֮◌̀◌॔◌̕b; à◌֮◌॔◌̕b; a◌֮◌̀◌॔◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, DEVANAGARI ACUTE ACCENT, LATIN SMALL LETTER B
@@ -17663,6 +17756,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0B4D 05B0 094D 3099 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062;0061 3099 0B4D 094D 05B0 0062; # (aâ—Œà­â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌à­â—Œà¥â—ŒÖ°b; a◌゙◌à­â—Œà¥â—ŒÖ°b; a◌゙◌à­â—Œà¥â—ŒÖ°b; a◌゙◌à­â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, ORIYA SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 0BCD 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062;0061 3099 094D 0BCD 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œà¯b; a◌゙◌à¥â—Œà¯â—ŒÖ°b; a◌゙◌à¥â—Œà¯â—ŒÖ°b; a◌゙◌à¥â—Œà¯â—ŒÖ°b; a◌゙◌à¥â—Œà¯â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAMIL SIGN VIRAMA, LATIN SMALL LETTER B
0061 0BCD 05B0 094D 3099 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062;0061 3099 0BCD 094D 05B0 0062; # (aâ—Œà¯â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌à¯â—Œà¥â—ŒÖ°b; a◌゙◌à¯â—Œà¥â—ŒÖ°b; a◌゙◌à¯â—Œà¥â—ŒÖ°b; a◌゙◌à¯â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, TAMIL SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 3099 093C 16FF0 0C3C 0062;0061 16FF0 093C 0C3C 3099 0062;0061 16FF0 093C 0C3C 3099 0062;0061 16FF0 093C 0C3C 3099 0062;0061 16FF0 093C 0C3C 3099 0062; # (a◌゙◌𖿰़◌఼b; a𖿰◌़◌఼◌゙b; a𖿰◌़◌఼◌゙b; a𖿰◌़◌఼◌゙b; a𖿰◌़◌఼◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, TELUGU SIGN NUKTA, LATIN SMALL LETTER B
+0061 0C3C 3099 093C 16FF0 0062;0061 16FF0 0C3C 093C 3099 0062;0061 16FF0 0C3C 093C 3099 0062;0061 16FF0 0C3C 093C 3099 0062;0061 16FF0 0C3C 093C 3099 0062; # (a◌఼◌゙◌𖿰़b; a𖿰◌఼◌़◌゙b; a𖿰◌఼◌़◌゙b; a𖿰◌఼◌़◌゙b; a𖿰◌఼◌़◌゙b; ) LATIN SMALL LETTER A, TELUGU SIGN NUKTA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B
0061 05B0 094D 3099 0C4D 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062;0061 3099 094D 0C4D 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œà±b; a◌゙◌à¥â—Œà±â—ŒÖ°b; a◌゙◌à¥â—Œà±â—ŒÖ°b; a◌゙◌à¥â—Œà±â—ŒÖ°b; a◌゙◌à¥â—Œà±â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TELUGU SIGN VIRAMA, LATIN SMALL LETTER B
0061 0C4D 05B0 094D 3099 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062;0061 3099 0C4D 094D 05B0 0062; # (aâ—Œà±â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌à±â—Œà¥â—ŒÖ°b; a◌゙◌à±â—Œà¥â—ŒÖ°b; a◌゙◌à±â—Œà¥â—ŒÖ°b; a◌゙◌à±â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, TELUGU SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 0C56 0C55 0711 0C55 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062;0061 0711 0C55 0C55 0C56 0062; # (a◌ౖ◌ౕ◌ܑ◌ౕb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; a◌ܑ◌ౕ◌ౕ◌ౖb; ) LATIN SMALL LETTER A, TELUGU AI LENGTH MARK, TELUGU LENGTH MARK, SYRIAC LETTER SUPERSCRIPT ALAPH, TELUGU LENGTH MARK, LATIN SMALL LETTER B
@@ -17709,16 +17804,16 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0ECA 0F71 0EC8 0EB8 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062;0061 0EB8 0ECA 0EC8 0F71 0062; # (a◌໊◌ཱ◌່◌ຸb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; a◌ຸ◌໊◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI TI, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B
0061 0F71 0EC8 0EB8 0ECB 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062;0061 0EB8 0EC8 0ECB 0F71 0062; # (a◌ཱ◌່◌ຸ◌໋b; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; a◌ຸ◌່◌໋◌ཱb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LAO TONE MAI CATAWA, LATIN SMALL LETTER B
0061 0ECB 0F71 0EC8 0EB8 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062;0061 0EB8 0ECB 0EC8 0F71 0062; # (a◌໋◌ཱ◌່◌ຸb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; a◌ຸ◌໋◌່◌ཱb; ) LATIN SMALL LETTER A, LAO TONE MAI CATAWA, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LAO VOWEL SIGN U, LATIN SMALL LETTER B
-0061 059A 0316 302A 0F18 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062;0061 302A 0316 0F18 059A 0062; # (a◌֚◌̖◌〪◌༘b; a◌〪◌̖◌༘◌֚b; a◌〪◌̖◌༘◌֚b; a◌〪◌̖◌༘◌֚b; a◌〪◌̖◌༘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, LATIN SMALL LETTER B
-0061 0F18 059A 0316 302A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062;0061 302A 0F18 0316 059A 0062; # (a◌༘◌֚◌̖◌〪b; a◌〪◌༘◌̖◌֚b; a◌〪◌༘◌̖◌֚b; a◌〪◌༘◌̖◌֚b; a◌〪◌༘◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0F19 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062;0061 302A 0316 0F19 059A 0062; # (a◌֚◌̖◌〪◌༙b; a◌〪◌̖◌༙◌֚b; a◌〪◌̖◌༙◌֚b; a◌〪◌̖◌༙◌֚b; a◌〪◌̖◌༙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, LATIN SMALL LETTER B
-0061 0F19 059A 0316 302A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062;0061 302A 0F19 0316 059A 0062; # (a◌༙◌֚◌̖◌〪b; a◌〪◌༙◌̖◌֚b; a◌〪◌༙◌̖◌֚b; a◌〪◌༙◌̖◌֚b; a◌〪◌༙◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0F35 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062;0061 302A 0316 0F35 059A 0062; # (a◌֚◌̖◌〪◌༵b; a◌〪◌̖◌༵◌֚b; a◌〪◌̖◌༵◌֚b; a◌〪◌̖◌༵◌֚b; a◌〪◌̖◌༵◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN MARK NGAS BZUNG NYI ZLA, LATIN SMALL LETTER B
-0061 0F35 059A 0316 302A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062;0061 302A 0F35 0316 059A 0062; # (a◌༵◌֚◌̖◌〪b; a◌〪◌༵◌̖◌֚b; a◌〪◌༵◌̖◌֚b; a◌〪◌༵◌̖◌֚b; a◌〪◌༵◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG NYI ZLA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 0F37 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062;0061 302A 0316 0F37 059A 0062; # (a◌֚◌̖◌〪◌༷b; a◌〪◌̖◌༷◌֚b; a◌〪◌̖◌༷◌֚b; a◌〪◌̖◌༷◌֚b; a◌〪◌̖◌༷◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN MARK NGAS BZUNG SGOR RTAGS, LATIN SMALL LETTER B
-0061 0F37 059A 0316 302A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062;0061 302A 0F37 0316 059A 0062; # (a◌༷◌֚◌̖◌〪b; a◌〪◌༷◌̖◌֚b; a◌〪◌༷◌̖◌֚b; a◌〪◌༷◌̖◌֚b; a◌〪◌༷◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG SGOR RTAGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 0F39 0062;0061 1DCE 031B 0F39 302A 0062;0061 1DCE 031B 0F39 302A 0062;0061 1DCE 031B 0F39 302A 0062;0061 1DCE 031B 0F39 302A 0062; # (a◌〪◌̛◌᷎◌༹b; a◌᷎◌̛◌༹◌〪b; a◌᷎◌̛◌༹◌〪b; a◌᷎◌̛◌༹◌〪b; a◌᷎◌̛◌༹◌〪b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, TIBETAN MARK TSA -PHRU, LATIN SMALL LETTER B
-0061 0F39 302A 031B 1DCE 0062;0061 1DCE 0F39 031B 302A 0062;0061 1DCE 0F39 031B 302A 0062;0061 1DCE 0F39 031B 302A 0062;0061 1DCE 0F39 031B 302A 0062; # (a◌༹◌〪◌̛◌᷎b; a◌᷎◌༹◌̛◌〪b; a◌᷎◌༹◌̛◌〪b; a◌᷎◌༹◌̛◌〪b; a◌᷎◌༹◌̛◌〪b; ) LATIN SMALL LETTER A, TIBETAN MARK TSA -PHRU, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0F18 0062;0061 1DFA 0316 0F18 059A 0062;0061 1DFA 0316 0F18 059A 0062;0061 1DFA 0316 0F18 059A 0062;0061 1DFA 0316 0F18 059A 0062; # (a◌֚◌̖◌᷺◌༘b; a◌᷺◌̖◌༘◌֚b; a◌᷺◌̖◌༘◌֚b; a◌᷺◌̖◌༘◌֚b; a◌᷺◌̖◌༘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, LATIN SMALL LETTER B
+0061 0F18 059A 0316 1DFA 0062;0061 1DFA 0F18 0316 059A 0062;0061 1DFA 0F18 0316 059A 0062;0061 1DFA 0F18 0316 059A 0062;0061 1DFA 0F18 0316 059A 0062; # (a◌༘◌֚◌̖◌᷺b; a◌᷺◌༘◌̖◌֚b; a◌᷺◌༘◌̖◌֚b; a◌᷺◌༘◌̖◌֚b; a◌᷺◌༘◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN -KHYUD PA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0F19 0062;0061 1DFA 0316 0F19 059A 0062;0061 1DFA 0316 0F19 059A 0062;0061 1DFA 0316 0F19 059A 0062;0061 1DFA 0316 0F19 059A 0062; # (a◌֚◌̖◌᷺◌༙b; a◌᷺◌̖◌༙◌֚b; a◌᷺◌̖◌༙◌֚b; a◌᷺◌̖◌༙◌֚b; a◌᷺◌̖◌༙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, LATIN SMALL LETTER B
+0061 0F19 059A 0316 1DFA 0062;0061 1DFA 0F19 0316 059A 0062;0061 1DFA 0F19 0316 059A 0062;0061 1DFA 0F19 0316 059A 0062;0061 1DFA 0F19 0316 059A 0062; # (a◌༙◌֚◌̖◌᷺b; a◌᷺◌༙◌̖◌֚b; a◌᷺◌༙◌̖◌֚b; a◌᷺◌༙◌̖◌֚b; a◌᷺◌༙◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0F35 0062;0061 1DFA 0316 0F35 059A 0062;0061 1DFA 0316 0F35 059A 0062;0061 1DFA 0316 0F35 059A 0062;0061 1DFA 0316 0F35 059A 0062; # (a◌֚◌̖◌᷺◌༵b; a◌᷺◌̖◌༵◌֚b; a◌᷺◌̖◌༵◌֚b; a◌᷺◌̖◌༵◌֚b; a◌᷺◌̖◌༵◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN MARK NGAS BZUNG NYI ZLA, LATIN SMALL LETTER B
+0061 0F35 059A 0316 1DFA 0062;0061 1DFA 0F35 0316 059A 0062;0061 1DFA 0F35 0316 059A 0062;0061 1DFA 0F35 0316 059A 0062;0061 1DFA 0F35 0316 059A 0062; # (a◌༵◌֚◌̖◌᷺b; a◌᷺◌༵◌̖◌֚b; a◌᷺◌༵◌̖◌֚b; a◌᷺◌༵◌̖◌֚b; a◌᷺◌༵◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG NYI ZLA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0F37 0062;0061 1DFA 0316 0F37 059A 0062;0061 1DFA 0316 0F37 059A 0062;0061 1DFA 0316 0F37 059A 0062;0061 1DFA 0316 0F37 059A 0062; # (a◌֚◌̖◌᷺◌༷b; a◌᷺◌̖◌༷◌֚b; a◌᷺◌̖◌༷◌֚b; a◌᷺◌̖◌༷◌֚b; a◌᷺◌̖◌༷◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN MARK NGAS BZUNG SGOR RTAGS, LATIN SMALL LETTER B
+0061 0F37 059A 0316 1DFA 0062;0061 1DFA 0F37 0316 059A 0062;0061 1DFA 0F37 0316 059A 0062;0061 1DFA 0F37 0316 059A 0062;0061 1DFA 0F37 0316 059A 0062; # (a◌༷◌֚◌̖◌᷺b; a◌᷺◌༷◌̖◌֚b; a◌᷺◌༷◌̖◌֚b; a◌᷺◌༷◌̖◌֚b; a◌᷺◌༷◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN MARK NGAS BZUNG SGOR RTAGS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 0F39 0062;0061 1DCE 031B 0F39 1DFA 0062;0061 1DCE 031B 0F39 1DFA 0062;0061 1DCE 031B 0F39 1DFA 0062;0061 1DCE 031B 0F39 1DFA 0062; # (a◌᷺◌̛◌᷎◌༹b; a◌᷎◌̛◌༹◌᷺b; a◌᷎◌̛◌༹◌᷺b; a◌᷎◌̛◌༹◌᷺b; a◌᷎◌̛◌༹◌᷺b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, TIBETAN MARK TSA -PHRU, LATIN SMALL LETTER B
+0061 0F39 1DFA 031B 1DCE 0062;0061 1DCE 0F39 031B 1DFA 0062;0061 1DCE 0F39 031B 1DFA 0062;0061 1DCE 0F39 031B 1DFA 0062;0061 1DCE 0F39 031B 1DFA 0062; # (a◌༹◌᷺◌̛◌᷎b; a◌᷎◌༹◌̛◌᷺b; a◌᷎◌༹◌̛◌᷺b; a◌᷎◌༹◌̛◌᷺b; a◌᷎◌༹◌̛◌᷺b; ) LATIN SMALL LETTER A, TIBETAN MARK TSA -PHRU, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
0061 0F72 0F71 0EC8 0F71 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062; # (a◌ི◌ཱ◌່◌ཱb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, TIBETAN VOWEL SIGN AA, LATIN SMALL LETTER B
0061 0F71 0F72 0F71 0EC8 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062;0061 0EC8 0F71 0F71 0F72 0062; # (a◌ཱ◌ི◌ཱ◌່b; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; a◌່◌ཱ◌ཱ◌ིb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, LAO TONE MAI EK, LATIN SMALL LETTER B
0061 0F74 0F72 0F71 0F72 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062;0061 0F71 0F72 0F72 0F74 0062; # (a◌ུ◌ི◌ཱ◌ིb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; a◌ཱ◌ི◌ི◌ུb; ) LATIN SMALL LETTER A, TIBETAN VOWEL SIGN U, TIBETAN VOWEL SIGN I, TIBETAN VOWEL SIGN AA, TIBETAN VOWEL SIGN I, LATIN SMALL LETTER B
@@ -17745,16 +17840,16 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 0F86 0315 0300 05AE 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062;0061 05AE 0F86 0300 0315 0062; # (a◌྆◌̕◌̀◌֮b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; a◌֮◌྆◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN LCI RTAGS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 0F87 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062;00E0 05AE 0F87 0315 0062;0061 05AE 0300 0F87 0315 0062; # (a◌̕◌̀◌֮◌྇b; à◌֮◌྇◌̕b; a◌֮◌̀◌྇◌̕b; à◌֮◌྇◌̕b; a◌֮◌̀◌྇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TIBETAN SIGN YANG RTAGS, LATIN SMALL LETTER B
0061 0F87 0315 0300 05AE 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062;0061 05AE 0F87 0300 0315 0062; # (a◌྇◌̕◌̀◌֮b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; a◌֮◌྇◌̀◌̕b; ) LATIN SMALL LETTER A, TIBETAN SIGN YANG RTAGS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 0FC6 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062;0061 302A 0316 0FC6 059A 0062; # (a◌֚◌̖◌〪◌࿆b; a◌〪◌̖◌࿆◌֚b; a◌〪◌̖◌࿆◌֚b; a◌〪◌̖◌࿆◌֚b; a◌〪◌̖◌࿆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TIBETAN SYMBOL PADMA GDAN, LATIN SMALL LETTER B
-0061 0FC6 059A 0316 302A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062;0061 302A 0FC6 0316 059A 0062; # (a◌࿆◌֚◌̖◌〪b; a◌〪◌࿆◌̖◌֚b; a◌〪◌࿆◌̖◌֚b; a◌〪◌࿆◌̖◌֚b; a◌〪◌࿆◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN SYMBOL PADMA GDAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 0FC6 0062;0061 1DFA 0316 0FC6 059A 0062;0061 1DFA 0316 0FC6 059A 0062;0061 1DFA 0316 0FC6 059A 0062;0061 1DFA 0316 0FC6 059A 0062; # (a◌֚◌̖◌᷺◌࿆b; a◌᷺◌̖◌࿆◌֚b; a◌᷺◌̖◌࿆◌֚b; a◌᷺◌̖◌࿆◌֚b; a◌᷺◌̖◌࿆◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TIBETAN SYMBOL PADMA GDAN, LATIN SMALL LETTER B
+0061 0FC6 059A 0316 1DFA 0062;0061 1DFA 0FC6 0316 059A 0062;0061 1DFA 0FC6 0316 059A 0062;0061 1DFA 0FC6 0316 059A 0062;0061 1DFA 0FC6 0316 059A 0062; # (a◌࿆◌֚◌̖◌᷺b; a◌᷺◌࿆◌̖◌֚b; a◌᷺◌࿆◌̖◌֚b; a◌᷺◌࿆◌̖◌֚b; a◌᷺◌࿆◌̖◌֚b; ) LATIN SMALL LETTER A, TIBETAN SYMBOL PADMA GDAN, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 3099 093C 16FF0 1037 0062;0061 16FF0 093C 1037 3099 0062;0061 16FF0 093C 1037 3099 0062;0061 16FF0 093C 1037 3099 0062;0061 16FF0 093C 1037 3099 0062; # (a◌゙◌𖿰़◌့b; a𖿰◌़◌့◌゙b; a𖿰◌़◌့◌゙b; a𖿰◌़◌့◌゙b; a𖿰◌़◌့◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, MYANMAR SIGN DOT BELOW, LATIN SMALL LETTER B
0061 1037 3099 093C 16FF0 0062;0061 16FF0 1037 093C 3099 0062;0061 16FF0 1037 093C 3099 0062;0061 16FF0 1037 093C 3099 0062;0061 16FF0 1037 093C 3099 0062; # (a◌့◌゙◌𖿰़b; a𖿰◌့◌़◌゙b; a𖿰◌့◌़◌゙b; a𖿰◌့◌़◌゙b; a𖿰◌့◌़◌゙b; ) LATIN SMALL LETTER A, MYANMAR SIGN DOT BELOW, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B
0061 05B0 094D 3099 1039 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062;0061 3099 094D 1039 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œá€¹b; a◌゙◌à¥â—Œá€¹â—ŒÖ°b; a◌゙◌à¥â—Œá€¹â—ŒÖ°b; a◌゙◌à¥â—Œá€¹â—ŒÖ°b; a◌゙◌à¥â—Œá€¹â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MYANMAR SIGN VIRAMA, LATIN SMALL LETTER B
0061 1039 05B0 094D 3099 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062;0061 3099 1039 094D 05B0 0062; # (a◌္◌ְ◌à¥â—Œã‚™b; a◌゙◌္◌à¥â—ŒÖ°b; a◌゙◌္◌à¥â—ŒÖ°b; a◌゙◌္◌à¥â—ŒÖ°b; a◌゙◌္◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, MYANMAR SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 103A 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062;0061 3099 094D 103A 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œá€ºb; a◌゙◌à¥â—Œá€ºâ—ŒÖ°b; a◌゙◌à¥â—Œá€ºâ—ŒÖ°b; a◌゙◌à¥â—Œá€ºâ—ŒÖ°b; a◌゙◌à¥â—Œá€ºâ—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, MYANMAR SIGN ASAT, LATIN SMALL LETTER B
0061 103A 05B0 094D 3099 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062;0061 3099 103A 094D 05B0 0062; # (a◌်◌ְ◌à¥â—Œã‚™b; a◌゙◌်◌à¥â—ŒÖ°b; a◌゙◌်◌à¥â—ŒÖ°b; a◌゙◌်◌à¥â—ŒÖ°b; a◌゙◌်◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, MYANMAR SIGN ASAT, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 108D 0062;0061 302A 0316 108D 059A 0062;0061 302A 0316 108D 059A 0062;0061 302A 0316 108D 059A 0062;0061 302A 0316 108D 059A 0062; # (a◌֚◌̖◌〪◌á‚b; a◌〪◌̖◌á‚◌֚b; a◌〪◌̖◌á‚◌֚b; a◌〪◌̖◌á‚◌֚b; a◌〪◌̖◌á‚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE, LATIN SMALL LETTER B
-0061 108D 059A 0316 302A 0062;0061 302A 108D 0316 059A 0062;0061 302A 108D 0316 059A 0062;0061 302A 108D 0316 059A 0062;0061 302A 108D 0316 059A 0062; # (aâ—Œá‚◌֚◌̖◌〪b; a◌〪◌á‚◌̖◌֚b; a◌〪◌á‚◌̖◌֚b; a◌〪◌á‚◌̖◌֚b; a◌〪◌á‚◌̖◌֚b; ) LATIN SMALL LETTER A, MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 108D 0062;0061 1DFA 0316 108D 059A 0062;0061 1DFA 0316 108D 059A 0062;0061 1DFA 0316 108D 059A 0062;0061 1DFA 0316 108D 059A 0062; # (a◌֚◌̖◌᷺◌á‚b; a◌᷺◌̖◌á‚◌֚b; a◌᷺◌̖◌á‚◌֚b; a◌᷺◌̖◌á‚◌֚b; a◌᷺◌̖◌á‚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE, LATIN SMALL LETTER B
+0061 108D 059A 0316 1DFA 0062;0061 1DFA 108D 0316 059A 0062;0061 1DFA 108D 0316 059A 0062;0061 1DFA 108D 0316 059A 0062;0061 1DFA 108D 0316 059A 0062; # (aâ—Œá‚◌֚◌̖◌᷺b; a◌᷺◌á‚◌̖◌֚b; a◌᷺◌á‚◌̖◌֚b; a◌᷺◌á‚◌̖◌֚b; a◌᷺◌á‚◌̖◌֚b; ) LATIN SMALL LETTER A, MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 135D 0062;00E0 05AE 135D 0315 0062;0061 05AE 0300 135D 0315 0062;00E0 05AE 135D 0315 0062;0061 05AE 0300 135D 0315 0062; # (a◌̕◌̀◌֮◌áb; à◌֮◌á◌̕b; a◌֮◌̀◌á◌̕b; à◌֮◌á◌̕b; a◌֮◌̀◌á◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK, LATIN SMALL LETTER B
0061 135D 0315 0300 05AE 0062;0061 05AE 135D 0300 0315 0062;0061 05AE 135D 0300 0315 0062;0061 05AE 135D 0300 0315 0062;0061 05AE 135D 0300 0315 0062; # (aâ—Œá◌̕◌̀◌֮b; a◌֮◌á◌̀◌̕b; a◌֮◌á◌̀◌̕b; a◌֮◌á◌̀◌̕b; a◌֮◌á◌̀◌̕b; ) LATIN SMALL LETTER A, ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 135E 0062;00E0 05AE 135E 0315 0062;0061 05AE 0300 135E 0315 0062;00E0 05AE 135E 0315 0062;0061 05AE 0300 135E 0315 0062; # (a◌̕◌̀◌֮◌ážb; à◌֮◌ážâ—ŒÌ•b; a◌֮◌̀◌ážâ—ŒÌ•b; à◌֮◌ážâ—ŒÌ•b; a◌֮◌̀◌ážâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ETHIOPIC COMBINING VOWEL LENGTH MARK, LATIN SMALL LETTER B
@@ -17763,8 +17858,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 135F 0315 0300 05AE 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062;0061 05AE 135F 0300 0315 0062; # (aâ—ŒáŸâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌áŸâ—ŒÌ€â—ŒÌ•b; a◌֮◌áŸâ—ŒÌ€â—ŒÌ•b; a◌֮◌áŸâ—ŒÌ€â—ŒÌ•b; a◌֮◌áŸâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, ETHIOPIC COMBINING GEMINATION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 05B0 094D 3099 1714 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062;0061 3099 094D 1714 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œáœ”b; a◌゙◌à¥â—Œáœ”◌ְb; a◌゙◌à¥â—Œáœ”◌ְb; a◌゙◌à¥â—Œáœ”◌ְb; a◌゙◌à¥â—Œáœ”◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAGALOG SIGN VIRAMA, LATIN SMALL LETTER B
0061 1714 05B0 094D 3099 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062;0061 3099 1714 094D 05B0 0062; # (a◌᜔◌ְ◌à¥â—Œã‚™b; a◌゙◌᜔◌à¥â—ŒÖ°b; a◌゙◌᜔◌à¥â—ŒÖ°b; a◌゙◌᜔◌à¥â—ŒÖ°b; a◌゙◌᜔◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, TAGALOG SIGN VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
-0061 05B0 094D 3099 1734 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œáœ´b; a◌゙◌à¥â—Œáœ´â—ŒÖ°b; a◌゙◌à¥â—Œáœ´â—ŒÖ°b; a◌゙◌à¥â—Œáœ´â—ŒÖ°b; a◌゙◌à¥â—Œáœ´â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, HANUNOO SIGN PAMUDPOD, LATIN SMALL LETTER B
-0061 1734 05B0 094D 3099 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062; # (a◌᜴◌ְ◌à¥â—Œã‚™b; a◌゙◌᜴◌à¥â—ŒÖ°b; a◌゙◌᜴◌à¥â—ŒÖ°b; a◌゙◌᜴◌à¥â—ŒÖ°b; a◌゙◌᜴◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, HANUNOO SIGN PAMUDPOD, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 05B0 094D 3099 1715 0062;0061 3099 094D 1715 05B0 0062;0061 3099 094D 1715 05B0 0062;0061 3099 094D 1715 05B0 0062;0061 3099 094D 1715 05B0 0062; # (a◌ְ◌à¥â—Œã‚™áœ•b; a◌゙◌à¥áœ•â—ŒÖ°b; a◌゙◌à¥áœ•â—ŒÖ°b; a◌゙◌à¥áœ•â—ŒÖ°b; a◌゙◌à¥áœ•â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAGALOG SIGN PAMUDPOD, LATIN SMALL LETTER B
+0061 1715 05B0 094D 3099 0062;0061 3099 1715 094D 05B0 0062;0061 3099 1715 094D 05B0 0062;0061 3099 1715 094D 05B0 0062;0061 3099 1715 094D 05B0 0062; # (a᜕◌ְ◌à¥â—Œã‚™b; a◌゙᜕◌à¥â—ŒÖ°b; a◌゙᜕◌à¥â—ŒÖ°b; a◌゙᜕◌à¥â—ŒÖ°b; a◌゙᜕◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, TAGALOG SIGN PAMUDPOD, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 05B0 094D 3099 1734 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062;0061 3099 094D 1734 05B0 0062; # (a◌ְ◌à¥â—Œã‚™áœ´b; a◌゙◌à¥áœ´â—ŒÖ°b; a◌゙◌à¥áœ´â—ŒÖ°b; a◌゙◌à¥áœ´â—ŒÖ°b; a◌゙◌à¥áœ´â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, HANUNOO SIGN PAMUDPOD, LATIN SMALL LETTER B
+0061 1734 05B0 094D 3099 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062;0061 3099 1734 094D 05B0 0062; # (a᜴◌ְ◌à¥â—Œã‚™b; a◌゙᜴◌à¥â—ŒÖ°b; a◌゙᜴◌à¥â—ŒÖ°b; a◌゙᜴◌à¥â—ŒÖ°b; a◌゙᜴◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, HANUNOO SIGN PAMUDPOD, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 17D2 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062;0061 3099 094D 17D2 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—ŒáŸ’b; a◌゙◌à¥â—ŒáŸ’◌ְb; a◌゙◌à¥â—ŒáŸ’◌ְb; a◌゙◌à¥â—ŒáŸ’◌ְb; a◌゙◌à¥â—ŒáŸ’◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHMER SIGN COENG, LATIN SMALL LETTER B
0061 17D2 05B0 094D 3099 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062;0061 3099 17D2 094D 05B0 0062; # (a◌្◌ְ◌à¥â—Œã‚™b; a◌゙◌្◌à¥â—ŒÖ°b; a◌゙◌្◌à¥â—ŒÖ°b; a◌゙◌្◌à¥â—ŒÖ°b; a◌゙◌្◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, KHMER SIGN COENG, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 17DD 0062;00E0 05AE 17DD 0315 0062;0061 05AE 0300 17DD 0315 0062;00E0 05AE 17DD 0315 0062;0061 05AE 0300 17DD 0315 0062; # (a◌̕◌̀◌֮◌áŸb; à◌֮◌áŸâ—ŒÌ•b; a◌֮◌̀◌áŸâ—ŒÌ•b; à◌֮◌áŸâ—ŒÌ•b; a◌֮◌̀◌áŸâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, KHMER SIGN ATTHACAN, LATIN SMALL LETTER B
@@ -17775,12 +17872,12 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1939 302E 059A 0316 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062;0061 0316 1939 059A 302E 0062; # (a◌᤹〮◌֚◌̖b; a◌̖◌᤹◌֚〮b; a◌̖◌᤹◌֚〮b; a◌̖◌᤹◌֚〮b; a◌̖◌᤹◌֚〮b; ) LATIN SMALL LETTER A, LIMBU SIGN MUKPHRENG, HANGUL SINGLE DOT TONE MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, LATIN SMALL LETTER B
0061 0315 0300 05AE 193A 0062;00E0 05AE 193A 0315 0062;0061 05AE 0300 193A 0315 0062;00E0 05AE 193A 0315 0062;0061 05AE 0300 193A 0315 0062; # (a◌̕◌̀◌֮◌᤺b; à◌֮◌᤺◌̕b; a◌֮◌̀◌᤺◌̕b; à◌֮◌᤺◌̕b; a◌֮◌̀◌᤺◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LIMBU SIGN KEMPHRENG, LATIN SMALL LETTER B
0061 193A 0315 0300 05AE 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062;0061 05AE 193A 0300 0315 0062; # (a◌᤺◌̕◌̀◌֮b; a◌֮◌᤺◌̀◌̕b; a◌֮◌᤺◌̀◌̕b; a◌֮◌᤺◌̀◌̕b; a◌֮◌᤺◌̀◌̕b; ) LATIN SMALL LETTER A, LIMBU SIGN KEMPHRENG, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 193B 0062;0061 302A 0316 193B 059A 0062;0061 302A 0316 193B 059A 0062;0061 302A 0316 193B 059A 0062;0061 302A 0316 193B 059A 0062; # (a◌֚◌̖◌〪◌᤻b; a◌〪◌̖◌᤻◌֚b; a◌〪◌̖◌᤻◌֚b; a◌〪◌̖◌᤻◌֚b; a◌〪◌̖◌᤻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LIMBU SIGN SA-I, LATIN SMALL LETTER B
-0061 193B 059A 0316 302A 0062;0061 302A 193B 0316 059A 0062;0061 302A 193B 0316 059A 0062;0061 302A 193B 0316 059A 0062;0061 302A 193B 0316 059A 0062; # (a◌᤻◌֚◌̖◌〪b; a◌〪◌᤻◌̖◌֚b; a◌〪◌᤻◌̖◌֚b; a◌〪◌᤻◌̖◌֚b; a◌〪◌᤻◌̖◌֚b; ) LATIN SMALL LETTER A, LIMBU SIGN SA-I, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 193B 0062;0061 1DFA 0316 193B 059A 0062;0061 1DFA 0316 193B 059A 0062;0061 1DFA 0316 193B 059A 0062;0061 1DFA 0316 193B 059A 0062; # (a◌֚◌̖◌᷺◌᤻b; a◌᷺◌̖◌᤻◌֚b; a◌᷺◌̖◌᤻◌֚b; a◌᷺◌̖◌᤻◌֚b; a◌᷺◌̖◌᤻◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LIMBU SIGN SA-I, LATIN SMALL LETTER B
+0061 193B 059A 0316 1DFA 0062;0061 1DFA 193B 0316 059A 0062;0061 1DFA 193B 0316 059A 0062;0061 1DFA 193B 0316 059A 0062;0061 1DFA 193B 0316 059A 0062; # (a◌᤻◌֚◌̖◌᷺b; a◌᷺◌᤻◌̖◌֚b; a◌᷺◌᤻◌̖◌֚b; a◌᷺◌᤻◌̖◌֚b; a◌᷺◌᤻◌̖◌֚b; ) LATIN SMALL LETTER A, LIMBU SIGN SA-I, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1A17 0062;00E0 05AE 1A17 0315 0062;0061 05AE 0300 1A17 0315 0062;00E0 05AE 1A17 0315 0062;0061 05AE 0300 1A17 0315 0062; # (a◌̕◌̀◌֮◌ᨗb; à◌֮◌ᨗ◌̕b; a◌֮◌̀◌ᨗ◌̕b; à◌֮◌ᨗ◌̕b; a◌֮◌̀◌ᨗ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BUGINESE VOWEL SIGN I, LATIN SMALL LETTER B
0061 1A17 0315 0300 05AE 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062;0061 05AE 1A17 0300 0315 0062; # (a◌ᨗ◌̕◌̀◌֮b; a◌֮◌ᨗ◌̀◌̕b; a◌֮◌ᨗ◌̀◌̕b; a◌֮◌ᨗ◌̀◌̕b; a◌֮◌ᨗ◌̀◌̕b; ) LATIN SMALL LETTER A, BUGINESE VOWEL SIGN I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1A18 0062;0061 302A 0316 1A18 059A 0062;0061 302A 0316 1A18 059A 0062;0061 302A 0316 1A18 059A 0062;0061 302A 0316 1A18 059A 0062; # (a◌֚◌̖◌〪◌ᨘb; a◌〪◌̖◌ᨘ◌֚b; a◌〪◌̖◌ᨘ◌֚b; a◌〪◌̖◌ᨘ◌֚b; a◌〪◌̖◌ᨘ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, BUGINESE VOWEL SIGN U, LATIN SMALL LETTER B
-0061 1A18 059A 0316 302A 0062;0061 302A 1A18 0316 059A 0062;0061 302A 1A18 0316 059A 0062;0061 302A 1A18 0316 059A 0062;0061 302A 1A18 0316 059A 0062; # (a◌ᨘ◌֚◌̖◌〪b; a◌〪◌ᨘ◌̖◌֚b; a◌〪◌ᨘ◌̖◌֚b; a◌〪◌ᨘ◌̖◌֚b; a◌〪◌ᨘ◌̖◌֚b; ) LATIN SMALL LETTER A, BUGINESE VOWEL SIGN U, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1A18 0062;0061 1DFA 0316 1A18 059A 0062;0061 1DFA 0316 1A18 059A 0062;0061 1DFA 0316 1A18 059A 0062;0061 1DFA 0316 1A18 059A 0062; # (a◌֚◌̖◌᷺◌ᨘb; a◌᷺◌̖◌ᨘ◌֚b; a◌᷺◌̖◌ᨘ◌֚b; a◌᷺◌̖◌ᨘ◌֚b; a◌᷺◌̖◌ᨘ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, BUGINESE VOWEL SIGN U, LATIN SMALL LETTER B
+0061 1A18 059A 0316 1DFA 0062;0061 1DFA 1A18 0316 059A 0062;0061 1DFA 1A18 0316 059A 0062;0061 1DFA 1A18 0316 059A 0062;0061 1DFA 1A18 0316 059A 0062; # (a◌ᨘ◌֚◌̖◌᷺b; a◌᷺◌ᨘ◌̖◌֚b; a◌᷺◌ᨘ◌̖◌֚b; a◌᷺◌ᨘ◌̖◌֚b; a◌᷺◌ᨘ◌̖◌֚b; ) LATIN SMALL LETTER A, BUGINESE VOWEL SIGN U, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 05B0 094D 3099 1A60 0062;0061 3099 094D 1A60 05B0 0062;0061 3099 094D 1A60 05B0 0062;0061 3099 094D 1A60 05B0 0062;0061 3099 094D 1A60 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œá© b; a◌゙◌à¥â—Œá© â—ŒÖ°b; a◌゙◌à¥â—Œá© â—ŒÖ°b; a◌゙◌à¥â—Œá© â—ŒÖ°b; a◌゙◌à¥â—Œá© â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, TAI THAM SIGN SAKOT, LATIN SMALL LETTER B
0061 1A60 05B0 094D 3099 0062;0061 3099 1A60 094D 05B0 0062;0061 3099 1A60 094D 05B0 0062;0061 3099 1A60 094D 05B0 0062;0061 3099 1A60 094D 05B0 0062; # (a◌᩠◌ְ◌à¥â—Œã‚™b; a◌゙◌᩠◌à¥â—ŒÖ°b; a◌゙◌᩠◌à¥â—ŒÖ°b; a◌゙◌᩠◌à¥â—ŒÖ°b; a◌゙◌᩠◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, TAI THAM SIGN SAKOT, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 1A75 0062;00E0 05AE 1A75 0315 0062;0061 05AE 0300 1A75 0315 0062;00E0 05AE 1A75 0315 0062;0061 05AE 0300 1A75 0315 0062; # (a◌̕◌̀◌֮◌᩵b; à◌֮◌᩵◌̕b; a◌֮◌̀◌᩵◌̕b; à◌֮◌᩵◌̕b; a◌֮◌̀◌᩵◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN TONE-1, LATIN SMALL LETTER B
@@ -17799,8 +17896,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1A7B 0315 0300 05AE 0062;0061 05AE 1A7B 0300 0315 0062;0061 05AE 1A7B 0300 0315 0062;0061 05AE 1A7B 0300 0315 0062;0061 05AE 1A7B 0300 0315 0062; # (a◌᩻◌̕◌̀◌֮b; a◌֮◌᩻◌̀◌̕b; a◌֮◌᩻◌̀◌̕b; a◌֮◌᩻◌̀◌̕b; a◌֮◌᩻◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN MAI SAM, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1A7C 0062;00E0 05AE 1A7C 0315 0062;0061 05AE 0300 1A7C 0315 0062;00E0 05AE 1A7C 0315 0062;0061 05AE 0300 1A7C 0315 0062; # (a◌̕◌̀◌֮◌᩼b; à◌֮◌᩼◌̕b; a◌֮◌̀◌᩼◌̕b; à◌֮◌᩼◌̕b; a◌֮◌̀◌᩼◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI THAM SIGN KHUEN-LUE KARAN, LATIN SMALL LETTER B
0061 1A7C 0315 0300 05AE 0062;0061 05AE 1A7C 0300 0315 0062;0061 05AE 1A7C 0300 0315 0062;0061 05AE 1A7C 0300 0315 0062;0061 05AE 1A7C 0300 0315 0062; # (a◌᩼◌̕◌̀◌֮b; a◌֮◌᩼◌̀◌̕b; a◌֮◌᩼◌̀◌̕b; a◌֮◌᩼◌̀◌̕b; a◌֮◌᩼◌̀◌̕b; ) LATIN SMALL LETTER A, TAI THAM SIGN KHUEN-LUE KARAN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1A7F 0062;0061 302A 0316 1A7F 059A 0062;0061 302A 0316 1A7F 059A 0062;0061 302A 0316 1A7F 059A 0062;0061 302A 0316 1A7F 059A 0062; # (a◌֚◌̖◌〪◌᩿b; a◌〪◌̖◌᩿◌֚b; a◌〪◌̖◌᩿◌֚b; a◌〪◌̖◌᩿◌֚b; a◌〪◌̖◌᩿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TAI THAM COMBINING CRYPTOGRAMMIC DOT, LATIN SMALL LETTER B
-0061 1A7F 059A 0316 302A 0062;0061 302A 1A7F 0316 059A 0062;0061 302A 1A7F 0316 059A 0062;0061 302A 1A7F 0316 059A 0062;0061 302A 1A7F 0316 059A 0062; # (a◌᩿◌֚◌̖◌〪b; a◌〪◌᩿◌̖◌֚b; a◌〪◌᩿◌̖◌֚b; a◌〪◌᩿◌̖◌֚b; a◌〪◌᩿◌̖◌֚b; ) LATIN SMALL LETTER A, TAI THAM COMBINING CRYPTOGRAMMIC DOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1A7F 0062;0061 1DFA 0316 1A7F 059A 0062;0061 1DFA 0316 1A7F 059A 0062;0061 1DFA 0316 1A7F 059A 0062;0061 1DFA 0316 1A7F 059A 0062; # (a◌֚◌̖◌᷺◌᩿b; a◌᷺◌̖◌᩿◌֚b; a◌᷺◌̖◌᩿◌֚b; a◌᷺◌̖◌᩿◌֚b; a◌᷺◌̖◌᩿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TAI THAM COMBINING CRYPTOGRAMMIC DOT, LATIN SMALL LETTER B
+0061 1A7F 059A 0316 1DFA 0062;0061 1DFA 1A7F 0316 059A 0062;0061 1DFA 1A7F 0316 059A 0062;0061 1DFA 1A7F 0316 059A 0062;0061 1DFA 1A7F 0316 059A 0062; # (a◌᩿◌֚◌̖◌᷺b; a◌᷺◌᩿◌̖◌֚b; a◌᷺◌᩿◌̖◌֚b; a◌᷺◌᩿◌̖◌֚b; a◌᷺◌᩿◌̖◌֚b; ) LATIN SMALL LETTER A, TAI THAM COMBINING CRYPTOGRAMMIC DOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1AB0 0062;00E0 05AE 1AB0 0315 0062;0061 05AE 0300 1AB0 0315 0062;00E0 05AE 1AB0 0315 0062;0061 05AE 0300 1AB0 0315 0062; # (a◌̕◌̀◌֮◌᪰b; à◌֮◌᪰◌̕b; a◌֮◌̀◌᪰◌̕b; à◌֮◌᪰◌̕b; a◌֮◌̀◌᪰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLED CIRCUMFLEX ACCENT, LATIN SMALL LETTER B
0061 1AB0 0315 0300 05AE 0062;0061 05AE 1AB0 0300 0315 0062;0061 05AE 1AB0 0300 0315 0062;0061 05AE 1AB0 0300 0315 0062;0061 05AE 1AB0 0300 0315 0062; # (a◌᪰◌̕◌̀◌֮b; a◌֮◌᪰◌̀◌̕b; a◌֮◌᪰◌̀◌̕b; a◌֮◌᪰◌̀◌̕b; a◌֮◌᪰◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLED CIRCUMFLEX ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1AB1 0062;00E0 05AE 1AB1 0315 0062;0061 05AE 0300 1AB1 0315 0062;00E0 05AE 1AB1 0315 0062;0061 05AE 0300 1AB1 0315 0062; # (a◌̕◌̀◌֮◌᪱b; à◌֮◌᪱◌̕b; a◌֮◌̀◌᪱◌̕b; à◌֮◌᪱◌̕b; a◌֮◌̀◌᪱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DIAERESIS-RING, LATIN SMALL LETTER B
@@ -17811,36 +17908,64 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1AB3 0315 0300 05AE 0062;0061 05AE 1AB3 0300 0315 0062;0061 05AE 1AB3 0300 0315 0062;0061 05AE 1AB3 0300 0315 0062;0061 05AE 1AB3 0300 0315 0062; # (a◌᪳◌̕◌̀◌֮b; a◌֮◌᪳◌̀◌̕b; a◌֮◌᪳◌̀◌̕b; a◌֮◌᪳◌̀◌̕b; a◌֮◌᪳◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOWNWARDS ARROW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1AB4 0062;00E0 05AE 1AB4 0315 0062;0061 05AE 0300 1AB4 0315 0062;00E0 05AE 1AB4 0315 0062;0061 05AE 0300 1AB4 0315 0062; # (a◌̕◌̀◌֮◌᪴b; à◌֮◌᪴◌̕b; a◌֮◌̀◌᪴◌̕b; à◌֮◌᪴◌̕b; a◌֮◌̀◌᪴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TRIPLE DOT, LATIN SMALL LETTER B
0061 1AB4 0315 0300 05AE 0062;0061 05AE 1AB4 0300 0315 0062;0061 05AE 1AB4 0300 0315 0062;0061 05AE 1AB4 0300 0315 0062;0061 05AE 1AB4 0300 0315 0062; # (a◌᪴◌̕◌̀◌֮b; a◌֮◌᪴◌̀◌̕b; a◌֮◌᪴◌̀◌̕b; a◌֮◌᪴◌̀◌̕b; a◌֮◌᪴◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TRIPLE DOT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1AB5 0062;0061 302A 0316 1AB5 059A 0062;0061 302A 0316 1AB5 059A 0062;0061 302A 0316 1AB5 059A 0062;0061 302A 0316 1AB5 059A 0062; # (a◌֚◌̖◌〪◌᪵b; a◌〪◌̖◌᪵◌֚b; a◌〪◌̖◌᪵◌֚b; a◌〪◌̖◌᪵◌֚b; a◌〪◌̖◌᪵◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING X-X BELOW, LATIN SMALL LETTER B
-0061 1AB5 059A 0316 302A 0062;0061 302A 1AB5 0316 059A 0062;0061 302A 1AB5 0316 059A 0062;0061 302A 1AB5 0316 059A 0062;0061 302A 1AB5 0316 059A 0062; # (a◌᪵◌֚◌̖◌〪b; a◌〪◌᪵◌̖◌֚b; a◌〪◌᪵◌̖◌֚b; a◌〪◌᪵◌̖◌֚b; a◌〪◌᪵◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING X-X BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1AB6 0062;0061 302A 0316 1AB6 059A 0062;0061 302A 0316 1AB6 059A 0062;0061 302A 0316 1AB6 059A 0062;0061 302A 0316 1AB6 059A 0062; # (a◌֚◌̖◌〪◌᪶b; a◌〪◌̖◌᪶◌֚b; a◌〪◌̖◌᪶◌֚b; a◌〪◌̖◌᪶◌֚b; a◌〪◌̖◌᪶◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING WIGGLY LINE BELOW, LATIN SMALL LETTER B
-0061 1AB6 059A 0316 302A 0062;0061 302A 1AB6 0316 059A 0062;0061 302A 1AB6 0316 059A 0062;0061 302A 1AB6 0316 059A 0062;0061 302A 1AB6 0316 059A 0062; # (a◌᪶◌֚◌̖◌〪b; a◌〪◌᪶◌̖◌֚b; a◌〪◌᪶◌̖◌֚b; a◌〪◌᪶◌̖◌֚b; a◌〪◌᪶◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING WIGGLY LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1AB7 0062;0061 302A 0316 1AB7 059A 0062;0061 302A 0316 1AB7 059A 0062;0061 302A 0316 1AB7 059A 0062;0061 302A 0316 1AB7 059A 0062; # (a◌֚◌̖◌〪◌᪷b; a◌〪◌̖◌᪷◌֚b; a◌〪◌̖◌᪷◌֚b; a◌〪◌̖◌᪷◌֚b; a◌〪◌̖◌᪷◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING OPEN MARK BELOW, LATIN SMALL LETTER B
-0061 1AB7 059A 0316 302A 0062;0061 302A 1AB7 0316 059A 0062;0061 302A 1AB7 0316 059A 0062;0061 302A 1AB7 0316 059A 0062;0061 302A 1AB7 0316 059A 0062; # (a◌᪷◌֚◌̖◌〪b; a◌〪◌᪷◌̖◌֚b; a◌〪◌᪷◌̖◌֚b; a◌〪◌᪷◌̖◌֚b; a◌〪◌᪷◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING OPEN MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1AB8 0062;0061 302A 0316 1AB8 059A 0062;0061 302A 0316 1AB8 059A 0062;0061 302A 0316 1AB8 059A 0062;0061 302A 0316 1AB8 059A 0062; # (a◌֚◌̖◌〪◌᪸b; a◌〪◌̖◌᪸◌֚b; a◌〪◌̖◌᪸◌֚b; a◌〪◌̖◌᪸◌֚b; a◌〪◌̖◌᪸◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING DOUBLE OPEN MARK BELOW, LATIN SMALL LETTER B
-0061 1AB8 059A 0316 302A 0062;0061 302A 1AB8 0316 059A 0062;0061 302A 1AB8 0316 059A 0062;0061 302A 1AB8 0316 059A 0062;0061 302A 1AB8 0316 059A 0062; # (a◌᪸◌֚◌̖◌〪b; a◌〪◌᪸◌̖◌֚b; a◌〪◌᪸◌̖◌֚b; a◌〪◌᪸◌̖◌֚b; a◌〪◌᪸◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE OPEN MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1AB9 0062;0061 302A 0316 1AB9 059A 0062;0061 302A 0316 1AB9 059A 0062;0061 302A 0316 1AB9 059A 0062;0061 302A 0316 1AB9 059A 0062; # (a◌֚◌̖◌〪◌᪹b; a◌〪◌̖◌᪹◌֚b; a◌〪◌̖◌᪹◌֚b; a◌〪◌̖◌᪹◌֚b; a◌〪◌̖◌᪹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LIGHT CENTRALIZATION STROKE BELOW, LATIN SMALL LETTER B
-0061 1AB9 059A 0316 302A 0062;0061 302A 1AB9 0316 059A 0062;0061 302A 1AB9 0316 059A 0062;0061 302A 1AB9 0316 059A 0062;0061 302A 1AB9 0316 059A 0062; # (a◌᪹◌֚◌̖◌〪b; a◌〪◌᪹◌̖◌֚b; a◌〪◌᪹◌̖◌֚b; a◌〪◌᪹◌̖◌֚b; a◌〪◌᪹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGHT CENTRALIZATION STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1ABA 0062;0061 302A 0316 1ABA 059A 0062;0061 302A 0316 1ABA 059A 0062;0061 302A 0316 1ABA 059A 0062;0061 302A 0316 1ABA 059A 0062; # (a◌֚◌̖◌〪◌᪺b; a◌〪◌̖◌᪺◌֚b; a◌〪◌̖◌᪺◌֚b; a◌〪◌̖◌᪺◌֚b; a◌〪◌̖◌᪺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING STRONG CENTRALIZATION STROKE BELOW, LATIN SMALL LETTER B
-0061 1ABA 059A 0316 302A 0062;0061 302A 1ABA 0316 059A 0062;0061 302A 1ABA 0316 059A 0062;0061 302A 1ABA 0316 059A 0062;0061 302A 1ABA 0316 059A 0062; # (a◌᪺◌֚◌̖◌〪b; a◌〪◌᪺◌̖◌֚b; a◌〪◌᪺◌̖◌֚b; a◌〪◌᪺◌̖◌֚b; a◌〪◌᪺◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING STRONG CENTRALIZATION STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AB5 0062;0061 1DFA 0316 1AB5 059A 0062;0061 1DFA 0316 1AB5 059A 0062;0061 1DFA 0316 1AB5 059A 0062;0061 1DFA 0316 1AB5 059A 0062; # (a◌֚◌̖◌᷺◌᪵b; a◌᷺◌̖◌᪵◌֚b; a◌᷺◌̖◌᪵◌֚b; a◌᷺◌̖◌᪵◌֚b; a◌᷺◌̖◌᪵◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING X-X BELOW, LATIN SMALL LETTER B
+0061 1AB5 059A 0316 1DFA 0062;0061 1DFA 1AB5 0316 059A 0062;0061 1DFA 1AB5 0316 059A 0062;0061 1DFA 1AB5 0316 059A 0062;0061 1DFA 1AB5 0316 059A 0062; # (a◌᪵◌֚◌̖◌᷺b; a◌᷺◌᪵◌̖◌֚b; a◌᷺◌᪵◌̖◌֚b; a◌᷺◌᪵◌̖◌֚b; a◌᷺◌᪵◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING X-X BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AB6 0062;0061 1DFA 0316 1AB6 059A 0062;0061 1DFA 0316 1AB6 059A 0062;0061 1DFA 0316 1AB6 059A 0062;0061 1DFA 0316 1AB6 059A 0062; # (a◌֚◌̖◌᷺◌᪶b; a◌᷺◌̖◌᪶◌֚b; a◌᷺◌̖◌᪶◌֚b; a◌᷺◌̖◌᪶◌֚b; a◌᷺◌̖◌᪶◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING WIGGLY LINE BELOW, LATIN SMALL LETTER B
+0061 1AB6 059A 0316 1DFA 0062;0061 1DFA 1AB6 0316 059A 0062;0061 1DFA 1AB6 0316 059A 0062;0061 1DFA 1AB6 0316 059A 0062;0061 1DFA 1AB6 0316 059A 0062; # (a◌᪶◌֚◌̖◌᷺b; a◌᷺◌᪶◌̖◌֚b; a◌᷺◌᪶◌̖◌֚b; a◌᷺◌᪶◌̖◌֚b; a◌᷺◌᪶◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING WIGGLY LINE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AB7 0062;0061 1DFA 0316 1AB7 059A 0062;0061 1DFA 0316 1AB7 059A 0062;0061 1DFA 0316 1AB7 059A 0062;0061 1DFA 0316 1AB7 059A 0062; # (a◌֚◌̖◌᷺◌᪷b; a◌᷺◌̖◌᪷◌֚b; a◌᷺◌̖◌᪷◌֚b; a◌᷺◌̖◌᪷◌֚b; a◌᷺◌̖◌᪷◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING OPEN MARK BELOW, LATIN SMALL LETTER B
+0061 1AB7 059A 0316 1DFA 0062;0061 1DFA 1AB7 0316 059A 0062;0061 1DFA 1AB7 0316 059A 0062;0061 1DFA 1AB7 0316 059A 0062;0061 1DFA 1AB7 0316 059A 0062; # (a◌᪷◌֚◌̖◌᷺b; a◌᷺◌᪷◌̖◌֚b; a◌᷺◌᪷◌̖◌֚b; a◌᷺◌᪷◌̖◌֚b; a◌᷺◌᪷◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING OPEN MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AB8 0062;0061 1DFA 0316 1AB8 059A 0062;0061 1DFA 0316 1AB8 059A 0062;0061 1DFA 0316 1AB8 059A 0062;0061 1DFA 0316 1AB8 059A 0062; # (a◌֚◌̖◌᷺◌᪸b; a◌᷺◌̖◌᪸◌֚b; a◌᷺◌̖◌᪸◌֚b; a◌᷺◌̖◌᪸◌֚b; a◌᷺◌̖◌᪸◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE OPEN MARK BELOW, LATIN SMALL LETTER B
+0061 1AB8 059A 0316 1DFA 0062;0061 1DFA 1AB8 0316 059A 0062;0061 1DFA 1AB8 0316 059A 0062;0061 1DFA 1AB8 0316 059A 0062;0061 1DFA 1AB8 0316 059A 0062; # (a◌᪸◌֚◌̖◌᷺b; a◌᷺◌᪸◌̖◌֚b; a◌᷺◌᪸◌̖◌֚b; a◌᷺◌᪸◌̖◌֚b; a◌᷺◌᪸◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE OPEN MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AB9 0062;0061 1DFA 0316 1AB9 059A 0062;0061 1DFA 0316 1AB9 059A 0062;0061 1DFA 0316 1AB9 059A 0062;0061 1DFA 0316 1AB9 059A 0062; # (a◌֚◌̖◌᷺◌᪹b; a◌᷺◌̖◌᪹◌֚b; a◌᷺◌̖◌᪹◌֚b; a◌᷺◌̖◌᪹◌֚b; a◌᷺◌̖◌᪹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LIGHT CENTRALIZATION STROKE BELOW, LATIN SMALL LETTER B
+0061 1AB9 059A 0316 1DFA 0062;0061 1DFA 1AB9 0316 059A 0062;0061 1DFA 1AB9 0316 059A 0062;0061 1DFA 1AB9 0316 059A 0062;0061 1DFA 1AB9 0316 059A 0062; # (a◌᪹◌֚◌̖◌᷺b; a◌᷺◌᪹◌̖◌֚b; a◌᷺◌᪹◌̖◌֚b; a◌᷺◌᪹◌̖◌֚b; a◌᷺◌᪹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGHT CENTRALIZATION STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1ABA 0062;0061 1DFA 0316 1ABA 059A 0062;0061 1DFA 0316 1ABA 059A 0062;0061 1DFA 0316 1ABA 059A 0062;0061 1DFA 0316 1ABA 059A 0062; # (a◌֚◌̖◌᷺◌᪺b; a◌᷺◌̖◌᪺◌֚b; a◌᷺◌̖◌᪺◌֚b; a◌᷺◌̖◌᪺◌֚b; a◌᷺◌̖◌᪺◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING STRONG CENTRALIZATION STROKE BELOW, LATIN SMALL LETTER B
+0061 1ABA 059A 0316 1DFA 0062;0061 1DFA 1ABA 0316 059A 0062;0061 1DFA 1ABA 0316 059A 0062;0061 1DFA 1ABA 0316 059A 0062;0061 1DFA 1ABA 0316 059A 0062; # (a◌᪺◌֚◌̖◌᷺b; a◌᷺◌᪺◌̖◌֚b; a◌᷺◌᪺◌̖◌֚b; a◌᷺◌᪺◌̖◌֚b; a◌᷺◌᪺◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING STRONG CENTRALIZATION STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1ABB 0062;00E0 05AE 1ABB 0315 0062;0061 05AE 0300 1ABB 0315 0062;00E0 05AE 1ABB 0315 0062;0061 05AE 0300 1ABB 0315 0062; # (a◌̕◌̀◌֮◌᪻b; à◌֮◌᪻◌̕b; a◌֮◌̀◌᪻◌̕b; à◌֮◌᪻◌̕b; a◌֮◌̀◌᪻◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING PARENTHESES ABOVE, LATIN SMALL LETTER B
0061 1ABB 0315 0300 05AE 0062;0061 05AE 1ABB 0300 0315 0062;0061 05AE 1ABB 0300 0315 0062;0061 05AE 1ABB 0300 0315 0062;0061 05AE 1ABB 0300 0315 0062; # (a◌᪻◌̕◌̀◌֮b; a◌֮◌᪻◌̀◌̕b; a◌֮◌᪻◌̀◌̕b; a◌֮◌᪻◌̀◌̕b; a◌֮◌᪻◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING PARENTHESES ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1ABC 0062;00E0 05AE 1ABC 0315 0062;0061 05AE 0300 1ABC 0315 0062;00E0 05AE 1ABC 0315 0062;0061 05AE 0300 1ABC 0315 0062; # (a◌̕◌̀◌֮◌᪼b; à◌֮◌᪼◌̕b; a◌֮◌̀◌᪼◌̕b; à◌֮◌᪼◌̕b; a◌֮◌̀◌᪼◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE PARENTHESES ABOVE, LATIN SMALL LETTER B
0061 1ABC 0315 0300 05AE 0062;0061 05AE 1ABC 0300 0315 0062;0061 05AE 1ABC 0300 0315 0062;0061 05AE 1ABC 0300 0315 0062;0061 05AE 1ABC 0300 0315 0062; # (a◌᪼◌̕◌̀◌֮b; a◌֮◌᪼◌̀◌̕b; a◌֮◌᪼◌̀◌̕b; a◌֮◌᪼◌̀◌̕b; a◌֮◌᪼◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE PARENTHESES ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1ABD 0062;0061 302A 0316 1ABD 059A 0062;0061 302A 0316 1ABD 059A 0062;0061 302A 0316 1ABD 059A 0062;0061 302A 0316 1ABD 059A 0062; # (a◌֚◌̖◌〪◌᪽b; a◌〪◌̖◌᪽◌֚b; a◌〪◌̖◌᪽◌֚b; a◌〪◌̖◌᪽◌֚b; a◌〪◌̖◌᪽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING PARENTHESES BELOW, LATIN SMALL LETTER B
-0061 1ABD 059A 0316 302A 0062;0061 302A 1ABD 0316 059A 0062;0061 302A 1ABD 0316 059A 0062;0061 302A 1ABD 0316 059A 0062;0061 302A 1ABD 0316 059A 0062; # (a◌᪽◌֚◌̖◌〪b; a◌〪◌᪽◌̖◌֚b; a◌〪◌᪽◌̖◌֚b; a◌〪◌᪽◌̖◌֚b; a◌〪◌᪽◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING PARENTHESES BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1ABF 0062;0061 302A 0316 1ABF 059A 0062;0061 302A 0316 1ABF 059A 0062;0061 302A 0316 1ABF 059A 0062;0061 302A 0316 1ABF 059A 0062; # (a◌֚◌̖◌〪◌ᪿb; a◌〪◌̖◌ᪿ◌֚b; a◌〪◌̖◌ᪿ◌֚b; a◌〪◌̖◌ᪿ◌֚b; a◌〪◌̖◌ᪿ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LATIN SMALL LETTER W BELOW, LATIN SMALL LETTER B
-0061 1ABF 059A 0316 302A 0062;0061 302A 1ABF 0316 059A 0062;0061 302A 1ABF 0316 059A 0062;0061 302A 1ABF 0316 059A 0062;0061 302A 1ABF 0316 059A 0062; # (a◌ᪿ◌֚◌̖◌〪b; a◌〪◌ᪿ◌̖◌֚b; a◌〪◌ᪿ◌̖◌֚b; a◌〪◌ᪿ◌̖◌֚b; a◌〪◌ᪿ◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER W BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1AC0 0062;0061 302A 0316 1AC0 059A 0062;0061 302A 0316 1AC0 059A 0062;0061 302A 0316 1AC0 059A 0062;0061 302A 0316 1AC0 059A 0062; # (a◌֚◌̖◌〪◌ᫀb; a◌〪◌̖◌ᫀ◌֚b; a◌〪◌̖◌ᫀ◌֚b; a◌〪◌̖◌ᫀ◌֚b; a◌〪◌̖◌ᫀ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LATIN SMALL LETTER TURNED W BELOW, LATIN SMALL LETTER B
-0061 1AC0 059A 0316 302A 0062;0061 302A 1AC0 0316 059A 0062;0061 302A 1AC0 0316 059A 0062;0061 302A 1AC0 0316 059A 0062;0061 302A 1AC0 0316 059A 0062; # (a◌ᫀ◌֚◌̖◌〪b; a◌〪◌ᫀ◌̖◌֚b; a◌〪◌ᫀ◌̖◌֚b; a◌〪◌ᫀ◌̖◌֚b; a◌〪◌ᫀ◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER TURNED W BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1ABD 0062;0061 1DFA 0316 1ABD 059A 0062;0061 1DFA 0316 1ABD 059A 0062;0061 1DFA 0316 1ABD 059A 0062;0061 1DFA 0316 1ABD 059A 0062; # (a◌֚◌̖◌᷺◌᪽b; a◌᷺◌̖◌᪽◌֚b; a◌᷺◌̖◌᪽◌֚b; a◌᷺◌̖◌᪽◌֚b; a◌᷺◌̖◌᪽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING PARENTHESES BELOW, LATIN SMALL LETTER B
+0061 1ABD 059A 0316 1DFA 0062;0061 1DFA 1ABD 0316 059A 0062;0061 1DFA 1ABD 0316 059A 0062;0061 1DFA 1ABD 0316 059A 0062;0061 1DFA 1ABD 0316 059A 0062; # (a◌᪽◌֚◌̖◌᷺b; a◌᷺◌᪽◌̖◌֚b; a◌᷺◌᪽◌̖◌֚b; a◌᷺◌᪽◌̖◌֚b; a◌᷺◌᪽◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING PARENTHESES BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1ABF 0062;0061 1DFA 0316 1ABF 059A 0062;0061 1DFA 0316 1ABF 059A 0062;0061 1DFA 0316 1ABF 059A 0062;0061 1DFA 0316 1ABF 059A 0062; # (a◌֚◌̖◌᷺◌ᪿb; a◌᷺◌̖◌ᪿ◌֚b; a◌᷺◌̖◌ᪿ◌֚b; a◌᷺◌̖◌ᪿ◌֚b; a◌᷺◌̖◌ᪿ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LATIN SMALL LETTER W BELOW, LATIN SMALL LETTER B
+0061 1ABF 059A 0316 1DFA 0062;0061 1DFA 1ABF 0316 059A 0062;0061 1DFA 1ABF 0316 059A 0062;0061 1DFA 1ABF 0316 059A 0062;0061 1DFA 1ABF 0316 059A 0062; # (a◌ᪿ◌֚◌̖◌᷺b; a◌᷺◌ᪿ◌̖◌֚b; a◌᷺◌ᪿ◌̖◌֚b; a◌᷺◌ᪿ◌̖◌֚b; a◌᷺◌ᪿ◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER W BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AC0 0062;0061 1DFA 0316 1AC0 059A 0062;0061 1DFA 0316 1AC0 059A 0062;0061 1DFA 0316 1AC0 059A 0062;0061 1DFA 0316 1AC0 059A 0062; # (a◌֚◌̖◌᷺◌ᫀb; a◌᷺◌̖◌ᫀ◌֚b; a◌᷺◌̖◌ᫀ◌֚b; a◌᷺◌̖◌ᫀ◌֚b; a◌᷺◌̖◌ᫀ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LATIN SMALL LETTER TURNED W BELOW, LATIN SMALL LETTER B
+0061 1AC0 059A 0316 1DFA 0062;0061 1DFA 1AC0 0316 059A 0062;0061 1DFA 1AC0 0316 059A 0062;0061 1DFA 1AC0 0316 059A 0062;0061 1DFA 1AC0 0316 059A 0062; # (a◌ᫀ◌֚◌̖◌᷺b; a◌᷺◌ᫀ◌̖◌֚b; a◌᷺◌ᫀ◌̖◌֚b; a◌᷺◌ᫀ◌̖◌֚b; a◌᷺◌ᫀ◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER TURNED W BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1AC1 0062;00E0 05AE 1AC1 0315 0062;0061 05AE 0300 1AC1 0315 0062;00E0 05AE 1AC1 0315 0062;0061 05AE 0300 1AC1 0315 0062; # (a◌̕◌̀◌֮◌á«b; à◌֮◌á«â—ŒÌ•b; a◌֮◌̀◌á«â—ŒÌ•b; à◌֮◌á«â—ŒÌ•b; a◌֮◌̀◌á«â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT PARENTHESIS ABOVE LEFT, LATIN SMALL LETTER B
+0061 1AC1 0315 0300 05AE 0062;0061 05AE 1AC1 0300 0315 0062;0061 05AE 1AC1 0300 0315 0062;0061 05AE 1AC1 0300 0315 0062;0061 05AE 1AC1 0300 0315 0062; # (aâ—Œá«â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING LEFT PARENTHESIS ABOVE LEFT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1AC2 0062;00E0 05AE 1AC2 0315 0062;0061 05AE 0300 1AC2 0315 0062;00E0 05AE 1AC2 0315 0062;0061 05AE 0300 1AC2 0315 0062; # (a◌̕◌̀◌֮◌᫂b; à◌֮◌᫂◌̕b; a◌֮◌̀◌᫂◌̕b; à◌֮◌᫂◌̕b; a◌֮◌̀◌᫂◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT PARENTHESIS ABOVE RIGHT, LATIN SMALL LETTER B
+0061 1AC2 0315 0300 05AE 0062;0061 05AE 1AC2 0300 0315 0062;0061 05AE 1AC2 0300 0315 0062;0061 05AE 1AC2 0300 0315 0062;0061 05AE 1AC2 0300 0315 0062; # (a◌᫂◌̕◌̀◌֮b; a◌֮◌᫂◌̀◌̕b; a◌֮◌᫂◌̀◌̕b; a◌֮◌᫂◌̀◌̕b; a◌֮◌᫂◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING RIGHT PARENTHESIS ABOVE RIGHT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AC3 0062;0061 1DFA 0316 1AC3 059A 0062;0061 1DFA 0316 1AC3 059A 0062;0061 1DFA 0316 1AC3 059A 0062;0061 1DFA 0316 1AC3 059A 0062; # (a◌֚◌̖◌᷺◌᫃b; a◌᷺◌̖◌᫃◌֚b; a◌᷺◌̖◌᫃◌֚b; a◌᷺◌̖◌᫃◌֚b; a◌᷺◌̖◌᫃◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT PARENTHESIS BELOW LEFT, LATIN SMALL LETTER B
+0061 1AC3 059A 0316 1DFA 0062;0061 1DFA 1AC3 0316 059A 0062;0061 1DFA 1AC3 0316 059A 0062;0061 1DFA 1AC3 0316 059A 0062;0061 1DFA 1AC3 0316 059A 0062; # (a◌᫃◌֚◌̖◌᷺b; a◌᷺◌᫃◌̖◌֚b; a◌᷺◌᫃◌̖◌֚b; a◌᷺◌᫃◌̖◌֚b; a◌᷺◌᫃◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT PARENTHESIS BELOW LEFT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1AC4 0062;0061 1DFA 0316 1AC4 059A 0062;0061 1DFA 0316 1AC4 059A 0062;0061 1DFA 0316 1AC4 059A 0062;0061 1DFA 0316 1AC4 059A 0062; # (a◌֚◌̖◌᷺◌᫄b; a◌᷺◌̖◌᫄◌֚b; a◌᷺◌̖◌᫄◌֚b; a◌᷺◌̖◌᫄◌֚b; a◌᷺◌̖◌᫄◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT PARENTHESIS BELOW RIGHT, LATIN SMALL LETTER B
+0061 1AC4 059A 0316 1DFA 0062;0061 1DFA 1AC4 0316 059A 0062;0061 1DFA 1AC4 0316 059A 0062;0061 1DFA 1AC4 0316 059A 0062;0061 1DFA 1AC4 0316 059A 0062; # (a◌᫄◌֚◌̖◌᷺b; a◌᷺◌᫄◌̖◌֚b; a◌᷺◌᫄◌̖◌֚b; a◌᷺◌᫄◌̖◌֚b; a◌᷺◌᫄◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT PARENTHESIS BELOW RIGHT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1AC5 0062;00E0 05AE 1AC5 0315 0062;0061 05AE 0300 1AC5 0315 0062;00E0 05AE 1AC5 0315 0062;0061 05AE 0300 1AC5 0315 0062; # (a◌̕◌̀◌֮◌᫅b; à◌֮◌᫅◌̕b; a◌֮◌̀◌᫅◌̕b; à◌֮◌᫅◌̕b; a◌֮◌̀◌᫅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING SQUARE BRACKETS ABOVE, LATIN SMALL LETTER B
+0061 1AC5 0315 0300 05AE 0062;0061 05AE 1AC5 0300 0315 0062;0061 05AE 1AC5 0300 0315 0062;0061 05AE 1AC5 0300 0315 0062;0061 05AE 1AC5 0300 0315 0062; # (a◌᫅◌̕◌̀◌֮b; a◌֮◌᫅◌̀◌̕b; a◌֮◌᫅◌̀◌̕b; a◌֮◌᫅◌̀◌̕b; a◌֮◌᫅◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING SQUARE BRACKETS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1AC6 0062;00E0 05AE 1AC6 0315 0062;0061 05AE 0300 1AC6 0315 0062;00E0 05AE 1AC6 0315 0062;0061 05AE 0300 1AC6 0315 0062; # (a◌̕◌̀◌֮◌᫆b; à◌֮◌᫆◌̕b; a◌֮◌̀◌᫆◌̕b; à◌֮◌᫆◌̕b; a◌֮◌̀◌᫆◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING NUMBER SIGN ABOVE, LATIN SMALL LETTER B
+0061 1AC6 0315 0300 05AE 0062;0061 05AE 1AC6 0300 0315 0062;0061 05AE 1AC6 0300 0315 0062;0061 05AE 1AC6 0300 0315 0062;0061 05AE 1AC6 0300 0315 0062; # (a◌᫆◌̕◌̀◌֮b; a◌֮◌᫆◌̀◌̕b; a◌֮◌᫆◌̀◌̕b; a◌֮◌᫆◌̀◌̕b; a◌֮◌᫆◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING NUMBER SIGN ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1AC7 0062;00E0 05AE 1AC7 0315 0062;0061 05AE 0300 1AC7 0315 0062;00E0 05AE 1AC7 0315 0062;0061 05AE 0300 1AC7 0315 0062; # (a◌̕◌̀◌֮◌᫇b; à◌֮◌᫇◌̕b; a◌֮◌̀◌᫇◌̕b; à◌֮◌᫇◌̕b; a◌֮◌̀◌᫇◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING INVERTED DOUBLE ARCH ABOVE, LATIN SMALL LETTER B
+0061 1AC7 0315 0300 05AE 0062;0061 05AE 1AC7 0300 0315 0062;0061 05AE 1AC7 0300 0315 0062;0061 05AE 1AC7 0300 0315 0062;0061 05AE 1AC7 0300 0315 0062; # (a◌᫇◌̕◌̀◌֮b; a◌֮◌᫇◌̀◌̕b; a◌֮◌᫇◌̀◌̕b; a◌֮◌᫇◌̀◌̕b; a◌֮◌᫇◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING INVERTED DOUBLE ARCH ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1AC8 0062;00E0 05AE 1AC8 0315 0062;0061 05AE 0300 1AC8 0315 0062;00E0 05AE 1AC8 0315 0062;0061 05AE 0300 1AC8 0315 0062; # (a◌̕◌̀◌֮◌᫈b; à◌֮◌᫈◌̕b; a◌֮◌̀◌᫈◌̕b; à◌֮◌᫈◌̕b; a◌֮◌̀◌᫈◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING PLUS SIGN ABOVE, LATIN SMALL LETTER B
+0061 1AC8 0315 0300 05AE 0062;0061 05AE 1AC8 0300 0315 0062;0061 05AE 1AC8 0300 0315 0062;0061 05AE 1AC8 0300 0315 0062;0061 05AE 1AC8 0300 0315 0062; # (a◌᫈◌̕◌̀◌֮b; a◌֮◌᫈◌̀◌̕b; a◌֮◌᫈◌̀◌̕b; a◌֮◌᫈◌̀◌̕b; a◌֮◌᫈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING PLUS SIGN ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1AC9 0062;00E0 05AE 1AC9 0315 0062;0061 05AE 0300 1AC9 0315 0062;00E0 05AE 1AC9 0315 0062;0061 05AE 0300 1AC9 0315 0062; # (a◌̕◌̀◌֮◌᫉b; à◌֮◌᫉◌̕b; a◌֮◌̀◌᫉◌̕b; à◌֮◌᫉◌̕b; a◌֮◌̀◌᫉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOUBLE PLUS SIGN ABOVE, LATIN SMALL LETTER B
+0061 1AC9 0315 0300 05AE 0062;0061 05AE 1AC9 0300 0315 0062;0061 05AE 1AC9 0300 0315 0062;0061 05AE 1AC9 0300 0315 0062;0061 05AE 1AC9 0300 0315 0062; # (a◌᫉◌̕◌̀◌֮b; a◌֮◌᫉◌̀◌̕b; a◌֮◌᫉◌̀◌̕b; a◌֮◌᫉◌̀◌̕b; a◌֮◌᫉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOUBLE PLUS SIGN ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1ACA 0062;0061 1DFA 0316 1ACA 059A 0062;0061 1DFA 0316 1ACA 059A 0062;0061 1DFA 0316 1ACA 059A 0062;0061 1DFA 0316 1ACA 059A 0062; # (a◌֚◌̖◌᷺◌᫊b; a◌᷺◌̖◌᫊◌֚b; a◌᷺◌̖◌᫊◌֚b; a◌᷺◌̖◌᫊◌֚b; a◌᷺◌̖◌᫊◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING DOUBLE PLUS SIGN BELOW, LATIN SMALL LETTER B
+0061 1ACA 059A 0316 1DFA 0062;0061 1DFA 1ACA 0316 059A 0062;0061 1DFA 1ACA 0316 059A 0062;0061 1DFA 1ACA 0316 059A 0062;0061 1DFA 1ACA 0316 059A 0062; # (a◌᫊◌֚◌̖◌᷺b; a◌᷺◌᫊◌̖◌֚b; a◌᷺◌᫊◌̖◌֚b; a◌᷺◌᫊◌̖◌֚b; a◌᷺◌᫊◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING DOUBLE PLUS SIGN BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1ACB 0062;00E0 05AE 1ACB 0315 0062;0061 05AE 0300 1ACB 0315 0062;00E0 05AE 1ACB 0315 0062;0061 05AE 0300 1ACB 0315 0062; # (a◌̕◌̀◌֮◌᫋b; à◌֮◌᫋◌̕b; a◌֮◌̀◌᫋◌̕b; à◌֮◌᫋◌̕b; a◌֮◌̀◌᫋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING TRIPLE ACUTE ACCENT, LATIN SMALL LETTER B
+0061 1ACB 0315 0300 05AE 0062;0061 05AE 1ACB 0300 0315 0062;0061 05AE 1ACB 0300 0315 0062;0061 05AE 1ACB 0300 0315 0062;0061 05AE 1ACB 0300 0315 0062; # (a◌᫋◌̕◌̀◌֮b; a◌֮◌᫋◌̀◌̕b; a◌֮◌᫋◌̀◌̕b; a◌֮◌᫋◌̀◌̕b; a◌֮◌᫋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING TRIPLE ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1ACC 0062;00E0 05AE 1ACC 0315 0062;0061 05AE 0300 1ACC 0315 0062;00E0 05AE 1ACC 0315 0062;0061 05AE 0300 1ACC 0315 0062; # (a◌̕◌̀◌֮◌ᫌb; à◌֮◌ᫌ◌̕b; a◌֮◌̀◌ᫌ◌̕b; à◌֮◌ᫌ◌̕b; a◌֮◌̀◌ᫌ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER INSULAR G, LATIN SMALL LETTER B
+0061 1ACC 0315 0300 05AE 0062;0061 05AE 1ACC 0300 0315 0062;0061 05AE 1ACC 0300 0315 0062;0061 05AE 1ACC 0300 0315 0062;0061 05AE 1ACC 0300 0315 0062; # (a◌ᫌ◌̕◌̀◌֮b; a◌֮◌ᫌ◌̀◌̕b; a◌֮◌ᫌ◌̀◌̕b; a◌֮◌ᫌ◌̀◌̕b; a◌֮◌ᫌ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER INSULAR G, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1ACD 0062;00E0 05AE 1ACD 0315 0062;0061 05AE 0300 1ACD 0315 0062;00E0 05AE 1ACD 0315 0062;0061 05AE 0300 1ACD 0315 0062; # (a◌̕◌̀◌֮◌á«b; à◌֮◌á«â—ŒÌ•b; a◌֮◌̀◌á«â—ŒÌ•b; à◌֮◌á«â—ŒÌ•b; a◌֮◌̀◌á«â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER INSULAR R, LATIN SMALL LETTER B
+0061 1ACD 0315 0300 05AE 0062;0061 05AE 1ACD 0300 0315 0062;0061 05AE 1ACD 0300 0315 0062;0061 05AE 1ACD 0300 0315 0062;0061 05AE 1ACD 0300 0315 0062; # (aâ—Œá«â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; a◌֮◌á«â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER INSULAR R, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1ACE 0062;00E0 05AE 1ACE 0315 0062;0061 05AE 0300 1ACE 0315 0062;00E0 05AE 1ACE 0315 0062;0061 05AE 0300 1ACE 0315 0062; # (a◌̕◌̀◌֮◌ᫎb; à◌֮◌ᫎ◌̕b; a◌֮◌̀◌ᫎ◌̕b; à◌֮◌ᫎ◌̕b; a◌֮◌̀◌ᫎ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LATIN SMALL LETTER INSULAR T, LATIN SMALL LETTER B
+0061 1ACE 0315 0300 05AE 0062;0061 05AE 1ACE 0300 0315 0062;0061 05AE 1ACE 0300 0315 0062;0061 05AE 1ACE 0300 0315 0062;0061 05AE 1ACE 0300 0315 0062; # (a◌ᫎ◌̕◌̀◌֮b; a◌֮◌ᫎ◌̀◌̕b; a◌֮◌ᫎ◌̀◌̕b; a◌֮◌ᫎ◌̀◌̕b; a◌֮◌ᫎ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER INSULAR T, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 3099 093C 16FF0 1B34 0062;0061 16FF0 093C 1B34 3099 0062;0061 16FF0 093C 1B34 3099 0062;0061 16FF0 093C 1B34 3099 0062;0061 16FF0 093C 1B34 3099 0062; # (a◌゙◌𖿰़◌᬴b; a𖿰◌़◌᬴◌゙b; a𖿰◌़◌᬴◌゙b; a𖿰◌़◌᬴◌゙b; a𖿰◌़◌᬴◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, BALINESE SIGN REREKAN, LATIN SMALL LETTER B
0061 1B34 3099 093C 16FF0 0062;0061 16FF0 1B34 093C 3099 0062;0061 16FF0 1B34 093C 3099 0062;0061 16FF0 1B34 093C 3099 0062;0061 16FF0 1B34 093C 3099 0062; # (a◌᬴◌゙◌𖿰़b; a𖿰◌᬴◌़◌゙b; a𖿰◌᬴◌़◌゙b; a𖿰◌᬴◌़◌゙b; a𖿰◌᬴◌़◌゙b; ) LATIN SMALL LETTER A, BALINESE SIGN REREKAN, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, LATIN SMALL LETTER B
0061 05B0 094D 3099 1B44 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062;0061 3099 094D 1B44 05B0 0062; # (a◌ְ◌à¥â—Œã‚™á­„b; a◌゙◌à¥á­„◌ְb; a◌゙◌à¥á­„◌ְb; a◌゙◌à¥á­„◌ְb; a◌゙◌à¥á­„◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BALINESE ADEG ADEG, LATIN SMALL LETTER B
0061 1B44 05B0 094D 3099 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062;0061 3099 1B44 094D 05B0 0062; # (a᭄◌ְ◌à¥â—Œã‚™b; a◌゙᭄◌à¥â—ŒÖ°b; a◌゙᭄◌à¥â—ŒÖ°b; a◌゙᭄◌à¥â—ŒÖ°b; a◌゙᭄◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, BALINESE ADEG ADEG, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 1B6B 0062;00E0 05AE 1B6B 0315 0062;0061 05AE 0300 1B6B 0315 0062;00E0 05AE 1B6B 0315 0062;0061 05AE 0300 1B6B 0315 0062; # (a◌̕◌̀◌֮◌᭫b; à◌֮◌᭫◌̕b; a◌֮◌̀◌᭫◌̕b; à◌֮◌᭫◌̕b; a◌֮◌̀◌᭫◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING TEGEH, LATIN SMALL LETTER B
0061 1B6B 0315 0300 05AE 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062;0061 05AE 1B6B 0300 0315 0062; # (a◌᭫◌̕◌̀◌֮b; a◌֮◌᭫◌̀◌̕b; a◌֮◌᭫◌̀◌̕b; a◌֮◌᭫◌̀◌̕b; a◌֮◌᭫◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING TEGEH, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1B6C 0062;0061 302A 0316 1B6C 059A 0062;0061 302A 0316 1B6C 059A 0062;0061 302A 0316 1B6C 059A 0062;0061 302A 0316 1B6C 059A 0062; # (a◌֚◌̖◌〪◌᭬b; a◌〪◌̖◌᭬◌֚b; a◌〪◌̖◌᭬◌֚b; a◌〪◌̖◌᭬◌֚b; a◌〪◌̖◌᭬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, BALINESE MUSICAL SYMBOL COMBINING ENDEP, LATIN SMALL LETTER B
-0061 1B6C 059A 0316 302A 0062;0061 302A 1B6C 0316 059A 0062;0061 302A 1B6C 0316 059A 0062;0061 302A 1B6C 0316 059A 0062;0061 302A 1B6C 0316 059A 0062; # (a◌᭬◌֚◌̖◌〪b; a◌〪◌᭬◌̖◌֚b; a◌〪◌᭬◌̖◌֚b; a◌〪◌᭬◌̖◌֚b; a◌〪◌᭬◌̖◌֚b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING ENDEP, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1B6C 0062;0061 1DFA 0316 1B6C 059A 0062;0061 1DFA 0316 1B6C 059A 0062;0061 1DFA 0316 1B6C 059A 0062;0061 1DFA 0316 1B6C 059A 0062; # (a◌֚◌̖◌᷺◌᭬b; a◌᷺◌̖◌᭬◌֚b; a◌᷺◌̖◌᭬◌֚b; a◌᷺◌̖◌᭬◌֚b; a◌᷺◌̖◌᭬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, BALINESE MUSICAL SYMBOL COMBINING ENDEP, LATIN SMALL LETTER B
+0061 1B6C 059A 0316 1DFA 0062;0061 1DFA 1B6C 0316 059A 0062;0061 1DFA 1B6C 0316 059A 0062;0061 1DFA 1B6C 0316 059A 0062;0061 1DFA 1B6C 0316 059A 0062; # (a◌᭬◌֚◌̖◌᷺b; a◌᷺◌᭬◌̖◌֚b; a◌᷺◌᭬◌̖◌֚b; a◌᷺◌᭬◌̖◌֚b; a◌᷺◌᭬◌̖◌֚b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING ENDEP, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1B6D 0062;00E0 05AE 1B6D 0315 0062;0061 05AE 0300 1B6D 0315 0062;00E0 05AE 1B6D 0315 0062;0061 05AE 0300 1B6D 0315 0062; # (a◌̕◌̀◌֮◌᭭b; à◌֮◌᭭◌̕b; a◌֮◌̀◌᭭◌̕b; à◌֮◌᭭◌̕b; a◌֮◌̀◌᭭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING KEMPUL, LATIN SMALL LETTER B
0061 1B6D 0315 0300 05AE 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062;0061 05AE 1B6D 0300 0315 0062; # (a◌᭭◌̕◌̀◌֮b; a◌֮◌᭭◌̀◌̕b; a◌֮◌᭭◌̀◌̕b; a◌֮◌᭭◌̀◌̕b; a◌֮◌᭭◌̀◌̕b; ) LATIN SMALL LETTER A, BALINESE MUSICAL SYMBOL COMBINING KEMPUL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1B6E 0062;00E0 05AE 1B6E 0315 0062;0061 05AE 0300 1B6E 0315 0062;00E0 05AE 1B6E 0315 0062;0061 05AE 0300 1B6E 0315 0062; # (a◌̕◌̀◌֮◌᭮b; à◌֮◌᭮◌̕b; a◌֮◌̀◌᭮◌̕b; à◌֮◌᭮◌̕b; a◌֮◌̀◌᭮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, BALINESE MUSICAL SYMBOL COMBINING KEMPLI, LATIN SMALL LETTER B
@@ -17875,28 +18000,28 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1CD2 0315 0300 05AE 0062;0061 05AE 1CD2 0300 0315 0062;0061 05AE 1CD2 0300 0315 0062;0061 05AE 1CD2 0300 0315 0062;0061 05AE 1CD2 0300 0315 0062; # (a◌᳒◌̕◌̀◌֮b; a◌֮◌᳒◌̀◌̕b; a◌֮◌᳒◌̀◌̕b; a◌֮◌᳒◌̀◌̕b; a◌֮◌᳒◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE PRENKHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 16FF0 0334 1CD4 0062;0061 0334 1CD4 16FF0 0062;0061 0334 1CD4 16FF0 0062;0061 0334 1CD4 16FF0 0062;0061 0334 1CD4 16FF0 0062; # (a𖿰◌̴◌᳔b; a◌̴◌᳔𖿰b; a◌̴◌᳔𖿰b; a◌̴◌᳔𖿰b; a◌̴◌᳔𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN YAJURVEDIC MIDLINE SVARITA, LATIN SMALL LETTER B
0061 1CD4 16FF0 0334 0062;0061 1CD4 0334 16FF0 0062;0061 1CD4 0334 16FF0 0062;0061 1CD4 0334 16FF0 0062;0061 1CD4 0334 16FF0 0062; # (a◌᳔𖿰◌̴b; a◌᳔◌̴𖿰b; a◌᳔◌̴𖿰b; a◌᳔◌̴𖿰b; a◌᳔◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN YAJURVEDIC MIDLINE SVARITA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CD5 0062;0061 302A 0316 1CD5 059A 0062;0061 302A 0316 1CD5 059A 0062;0061 302A 0316 1CD5 059A 0062;0061 302A 0316 1CD5 059A 0062; # (a◌֚◌̖◌〪◌᳕b; a◌〪◌̖◌᳕◌֚b; a◌〪◌̖◌᳕◌֚b; a◌〪◌̖◌᳕◌֚b; a◌〪◌̖◌᳕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA, LATIN SMALL LETTER B
-0061 1CD5 059A 0316 302A 0062;0061 302A 1CD5 0316 059A 0062;0061 302A 1CD5 0316 059A 0062;0061 302A 1CD5 0316 059A 0062;0061 302A 1CD5 0316 059A 0062; # (a◌᳕◌֚◌̖◌〪b; a◌〪◌᳕◌̖◌֚b; a◌〪◌᳕◌̖◌֚b; a◌〪◌᳕◌̖◌֚b; a◌〪◌᳕◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CD6 0062;0061 302A 0316 1CD6 059A 0062;0061 302A 0316 1CD6 059A 0062;0061 302A 0316 1CD6 059A 0062;0061 302A 0316 1CD6 059A 0062; # (a◌֚◌̖◌〪◌᳖b; a◌〪◌̖◌᳖◌֚b; a◌〪◌̖◌᳖◌֚b; a◌〪◌̖◌᳖◌֚b; a◌〪◌̖◌᳖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA, LATIN SMALL LETTER B
-0061 1CD6 059A 0316 302A 0062;0061 302A 1CD6 0316 059A 0062;0061 302A 1CD6 0316 059A 0062;0061 302A 1CD6 0316 059A 0062;0061 302A 1CD6 0316 059A 0062; # (a◌᳖◌֚◌̖◌〪b; a◌〪◌᳖◌̖◌֚b; a◌〪◌᳖◌̖◌֚b; a◌〪◌᳖◌̖◌֚b; a◌〪◌᳖◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CD7 0062;0061 302A 0316 1CD7 059A 0062;0061 302A 0316 1CD7 059A 0062;0061 302A 0316 1CD7 059A 0062;0061 302A 0316 1CD7 059A 0062; # (a◌֚◌̖◌〪◌᳗b; a◌〪◌̖◌᳗◌֚b; a◌〪◌̖◌᳗◌֚b; a◌〪◌̖◌᳗◌֚b; a◌〪◌̖◌᳗◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA, LATIN SMALL LETTER B
-0061 1CD7 059A 0316 302A 0062;0061 302A 1CD7 0316 059A 0062;0061 302A 1CD7 0316 059A 0062;0061 302A 1CD7 0316 059A 0062;0061 302A 1CD7 0316 059A 0062; # (a◌᳗◌֚◌̖◌〪b; a◌〪◌᳗◌̖◌֚b; a◌〪◌᳗◌̖◌֚b; a◌〪◌᳗◌̖◌֚b; a◌〪◌᳗◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CD8 0062;0061 302A 0316 1CD8 059A 0062;0061 302A 0316 1CD8 059A 0062;0061 302A 0316 1CD8 059A 0062;0061 302A 0316 1CD8 059A 0062; # (a◌֚◌̖◌〪◌᳘b; a◌〪◌̖◌᳘◌֚b; a◌〪◌̖◌᳘◌֚b; a◌〪◌̖◌᳘◌֚b; a◌〪◌̖◌᳘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE CANDRA BELOW, LATIN SMALL LETTER B
-0061 1CD8 059A 0316 302A 0062;0061 302A 1CD8 0316 059A 0062;0061 302A 1CD8 0316 059A 0062;0061 302A 1CD8 0316 059A 0062;0061 302A 1CD8 0316 059A 0062; # (a◌᳘◌֚◌̖◌〪b; a◌〪◌᳘◌̖◌֚b; a◌〪◌᳘◌̖◌֚b; a◌〪◌᳘◌̖◌֚b; a◌〪◌᳘◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE CANDRA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CD9 0062;0061 302A 0316 1CD9 059A 0062;0061 302A 0316 1CD9 059A 0062;0061 302A 0316 1CD9 059A 0062;0061 302A 0316 1CD9 059A 0062; # (a◌֚◌̖◌〪◌᳙b; a◌〪◌̖◌᳙◌֚b; a◌〪◌̖◌᳙◌֚b; a◌〪◌̖◌᳙◌֚b; a◌〪◌̖◌᳙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER, LATIN SMALL LETTER B
-0061 1CD9 059A 0316 302A 0062;0061 302A 1CD9 0316 059A 0062;0061 302A 1CD9 0316 059A 0062;0061 302A 1CD9 0316 059A 0062;0061 302A 1CD9 0316 059A 0062; # (a◌᳙◌֚◌̖◌〪b; a◌〪◌᳙◌̖◌֚b; a◌〪◌᳙◌̖◌֚b; a◌〪◌᳙◌̖◌֚b; a◌〪◌᳙◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CD5 0062;0061 1DFA 0316 1CD5 059A 0062;0061 1DFA 0316 1CD5 059A 0062;0061 1DFA 0316 1CD5 059A 0062;0061 1DFA 0316 1CD5 059A 0062; # (a◌֚◌̖◌᷺◌᳕b; a◌᷺◌̖◌᳕◌֚b; a◌᷺◌̖◌᳕◌֚b; a◌᷺◌̖◌᳕◌֚b; a◌᷺◌̖◌᳕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA, LATIN SMALL LETTER B
+0061 1CD5 059A 0316 1DFA 0062;0061 1DFA 1CD5 0316 059A 0062;0061 1DFA 1CD5 0316 059A 0062;0061 1DFA 1CD5 0316 059A 0062;0061 1DFA 1CD5 0316 059A 0062; # (a◌᳕◌֚◌̖◌᷺b; a◌᷺◌᳕◌̖◌֚b; a◌᷺◌᳕◌̖◌֚b; a◌᷺◌᳕◌̖◌֚b; a◌᷺◌᳕◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CD6 0062;0061 1DFA 0316 1CD6 059A 0062;0061 1DFA 0316 1CD6 059A 0062;0061 1DFA 0316 1CD6 059A 0062;0061 1DFA 0316 1CD6 059A 0062; # (a◌֚◌̖◌᷺◌᳖b; a◌᷺◌̖◌᳖◌֚b; a◌᷺◌̖◌᳖◌֚b; a◌᷺◌̖◌᳖◌֚b; a◌᷺◌̖◌᳖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA, LATIN SMALL LETTER B
+0061 1CD6 059A 0316 1DFA 0062;0061 1DFA 1CD6 0316 059A 0062;0061 1DFA 1CD6 0316 059A 0062;0061 1DFA 1CD6 0316 059A 0062;0061 1DFA 1CD6 0316 059A 0062; # (a◌᳖◌֚◌̖◌᷺b; a◌᷺◌᳖◌̖◌֚b; a◌᷺◌᳖◌̖◌֚b; a◌᷺◌᳖◌̖◌֚b; a◌᷺◌᳖◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CD7 0062;0061 1DFA 0316 1CD7 059A 0062;0061 1DFA 0316 1CD7 059A 0062;0061 1DFA 0316 1CD7 059A 0062;0061 1DFA 0316 1CD7 059A 0062; # (a◌֚◌̖◌᷺◌᳗b; a◌᷺◌̖◌᳗◌֚b; a◌᷺◌̖◌᳗◌֚b; a◌᷺◌̖◌᳗◌֚b; a◌᷺◌̖◌᳗◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA, LATIN SMALL LETTER B
+0061 1CD7 059A 0316 1DFA 0062;0061 1DFA 1CD7 0316 059A 0062;0061 1DFA 1CD7 0316 059A 0062;0061 1DFA 1CD7 0316 059A 0062;0061 1DFA 1CD7 0316 059A 0062; # (a◌᳗◌֚◌̖◌᷺b; a◌᷺◌᳗◌̖◌֚b; a◌᷺◌᳗◌̖◌֚b; a◌᷺◌᳗◌̖◌֚b; a◌᷺◌᳗◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CD8 0062;0061 1DFA 0316 1CD8 059A 0062;0061 1DFA 0316 1CD8 059A 0062;0061 1DFA 0316 1CD8 059A 0062;0061 1DFA 0316 1CD8 059A 0062; # (a◌֚◌̖◌᷺◌᳘b; a◌᷺◌̖◌᳘◌֚b; a◌᷺◌̖◌᳘◌֚b; a◌᷺◌̖◌᳘◌֚b; a◌᷺◌̖◌᳘◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE CANDRA BELOW, LATIN SMALL LETTER B
+0061 1CD8 059A 0316 1DFA 0062;0061 1DFA 1CD8 0316 059A 0062;0061 1DFA 1CD8 0316 059A 0062;0061 1DFA 1CD8 0316 059A 0062;0061 1DFA 1CD8 0316 059A 0062; # (a◌᳘◌֚◌̖◌᷺b; a◌᷺◌᳘◌̖◌֚b; a◌᷺◌᳘◌̖◌֚b; a◌᷺◌᳘◌̖◌֚b; a◌᷺◌᳘◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE CANDRA BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CD9 0062;0061 1DFA 0316 1CD9 059A 0062;0061 1DFA 0316 1CD9 059A 0062;0061 1DFA 0316 1CD9 059A 0062;0061 1DFA 0316 1CD9 059A 0062; # (a◌֚◌̖◌᷺◌᳙b; a◌᷺◌̖◌᳙◌֚b; a◌᷺◌̖◌᳙◌֚b; a◌᷺◌̖◌᳙◌֚b; a◌᷺◌̖◌᳙◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER, LATIN SMALL LETTER B
+0061 1CD9 059A 0316 1DFA 0062;0061 1DFA 1CD9 0316 059A 0062;0061 1DFA 1CD9 0316 059A 0062;0061 1DFA 1CD9 0316 059A 0062;0061 1DFA 1CD9 0316 059A 0062; # (a◌᳙◌֚◌̖◌᷺b; a◌᷺◌᳙◌̖◌֚b; a◌᷺◌᳙◌̖◌֚b; a◌᷺◌᳙◌̖◌֚b; a◌᷺◌᳙◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1CDA 0062;00E0 05AE 1CDA 0315 0062;0061 05AE 0300 1CDA 0315 0062;00E0 05AE 1CDA 0315 0062;0061 05AE 0300 1CDA 0315 0062; # (a◌̕◌̀◌֮◌᳚b; à◌֮◌᳚◌̕b; a◌֮◌̀◌᳚◌̕b; à◌֮◌᳚◌̕b; a◌֮◌̀◌᳚◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE DOUBLE SVARITA, LATIN SMALL LETTER B
0061 1CDA 0315 0300 05AE 0062;0061 05AE 1CDA 0300 0315 0062;0061 05AE 1CDA 0300 0315 0062;0061 05AE 1CDA 0300 0315 0062;0061 05AE 1CDA 0300 0315 0062; # (a◌᳚◌̕◌̀◌֮b; a◌֮◌᳚◌̀◌̕b; a◌֮◌᳚◌̀◌̕b; a◌֮◌᳚◌̀◌̕b; a◌֮◌᳚◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE DOUBLE SVARITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1CDB 0062;00E0 05AE 1CDB 0315 0062;0061 05AE 0300 1CDB 0315 0062;00E0 05AE 1CDB 0315 0062;0061 05AE 0300 1CDB 0315 0062; # (a◌̕◌̀◌֮◌᳛b; à◌֮◌᳛◌̕b; a◌֮◌̀◌᳛◌̕b; à◌֮◌᳛◌̕b; a◌֮◌̀◌᳛◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE TRIPLE SVARITA, LATIN SMALL LETTER B
0061 1CDB 0315 0300 05AE 0062;0061 05AE 1CDB 0300 0315 0062;0061 05AE 1CDB 0300 0315 0062;0061 05AE 1CDB 0300 0315 0062;0061 05AE 1CDB 0300 0315 0062; # (a◌᳛◌̕◌̀◌֮b; a◌֮◌᳛◌̀◌̕b; a◌֮◌᳛◌̀◌̕b; a◌֮◌᳛◌̀◌̕b; a◌֮◌᳛◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE TRIPLE SVARITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CDC 0062;0061 302A 0316 1CDC 059A 0062;0061 302A 0316 1CDC 059A 0062;0061 302A 0316 1CDC 059A 0062;0061 302A 0316 1CDC 059A 0062; # (a◌֚◌̖◌〪◌᳜b; a◌〪◌̖◌᳜◌֚b; a◌〪◌̖◌᳜◌֚b; a◌〪◌̖◌᳜◌֚b; a◌〪◌̖◌᳜◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE KATHAKA ANUDATTA, LATIN SMALL LETTER B
-0061 1CDC 059A 0316 302A 0062;0061 302A 1CDC 0316 059A 0062;0061 302A 1CDC 0316 059A 0062;0061 302A 1CDC 0316 059A 0062;0061 302A 1CDC 0316 059A 0062; # (a◌᳜◌֚◌̖◌〪b; a◌〪◌᳜◌̖◌֚b; a◌〪◌᳜◌̖◌֚b; a◌〪◌᳜◌̖◌֚b; a◌〪◌᳜◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE KATHAKA ANUDATTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CDD 0062;0061 302A 0316 1CDD 059A 0062;0061 302A 0316 1CDD 059A 0062;0061 302A 0316 1CDD 059A 0062;0061 302A 0316 1CDD 059A 0062; # (a◌֚◌̖◌〪◌á³b; a◌〪◌̖◌á³â—ŒÖšb; a◌〪◌̖◌á³â—ŒÖšb; a◌〪◌̖◌á³â—ŒÖšb; a◌〪◌̖◌á³â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE DOT BELOW, LATIN SMALL LETTER B
-0061 1CDD 059A 0316 302A 0062;0061 302A 1CDD 0316 059A 0062;0061 302A 1CDD 0316 059A 0062;0061 302A 1CDD 0316 059A 0062;0061 302A 1CDD 0316 059A 0062; # (aâ—Œá³â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌á³â—ŒÌ–◌֚b; a◌〪◌á³â—ŒÌ–◌֚b; a◌〪◌á³â—ŒÌ–◌֚b; a◌〪◌á³â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CDE 0062;0061 302A 0316 1CDE 059A 0062;0061 302A 0316 1CDE 059A 0062;0061 302A 0316 1CDE 059A 0062;0061 302A 0316 1CDE 059A 0062; # (a◌֚◌̖◌〪◌᳞b; a◌〪◌̖◌᳞◌֚b; a◌〪◌̖◌᳞◌֚b; a◌〪◌̖◌᳞◌֚b; a◌〪◌̖◌᳞◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE TWO DOTS BELOW, LATIN SMALL LETTER B
-0061 1CDE 059A 0316 302A 0062;0061 302A 1CDE 0316 059A 0062;0061 302A 1CDE 0316 059A 0062;0061 302A 1CDE 0316 059A 0062;0061 302A 1CDE 0316 059A 0062; # (a◌᳞◌֚◌̖◌〪b; a◌〪◌᳞◌̖◌֚b; a◌〪◌᳞◌̖◌֚b; a◌〪◌᳞◌̖◌֚b; a◌〪◌᳞◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CDF 0062;0061 302A 0316 1CDF 059A 0062;0061 302A 0316 1CDF 059A 0062;0061 302A 0316 1CDF 059A 0062;0061 302A 0316 1CDF 059A 0062; # (a◌֚◌̖◌〪◌᳟b; a◌〪◌̖◌᳟◌֚b; a◌〪◌̖◌᳟◌֚b; a◌〪◌̖◌᳟◌֚b; a◌〪◌̖◌᳟◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC TONE THREE DOTS BELOW, LATIN SMALL LETTER B
-0061 1CDF 059A 0316 302A 0062;0061 302A 1CDF 0316 059A 0062;0061 302A 1CDF 0316 059A 0062;0061 302A 1CDF 0316 059A 0062;0061 302A 1CDF 0316 059A 0062; # (a◌᳟◌֚◌̖◌〪b; a◌〪◌᳟◌̖◌֚b; a◌〪◌᳟◌̖◌֚b; a◌〪◌᳟◌̖◌֚b; a◌〪◌᳟◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE THREE DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CDC 0062;0061 1DFA 0316 1CDC 059A 0062;0061 1DFA 0316 1CDC 059A 0062;0061 1DFA 0316 1CDC 059A 0062;0061 1DFA 0316 1CDC 059A 0062; # (a◌֚◌̖◌᷺◌᳜b; a◌᷺◌̖◌᳜◌֚b; a◌᷺◌̖◌᳜◌֚b; a◌᷺◌̖◌᳜◌֚b; a◌᷺◌̖◌᳜◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE KATHAKA ANUDATTA, LATIN SMALL LETTER B
+0061 1CDC 059A 0316 1DFA 0062;0061 1DFA 1CDC 0316 059A 0062;0061 1DFA 1CDC 0316 059A 0062;0061 1DFA 1CDC 0316 059A 0062;0061 1DFA 1CDC 0316 059A 0062; # (a◌᳜◌֚◌̖◌᷺b; a◌᷺◌᳜◌̖◌֚b; a◌᷺◌᳜◌̖◌֚b; a◌᷺◌᳜◌̖◌֚b; a◌᷺◌᳜◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE KATHAKA ANUDATTA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CDD 0062;0061 1DFA 0316 1CDD 059A 0062;0061 1DFA 0316 1CDD 059A 0062;0061 1DFA 0316 1CDD 059A 0062;0061 1DFA 0316 1CDD 059A 0062; # (a◌֚◌̖◌᷺◌á³b; a◌᷺◌̖◌á³â—ŒÖšb; a◌᷺◌̖◌á³â—ŒÖšb; a◌᷺◌̖◌á³â—ŒÖšb; a◌᷺◌̖◌á³â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE DOT BELOW, LATIN SMALL LETTER B
+0061 1CDD 059A 0316 1DFA 0062;0061 1DFA 1CDD 0316 059A 0062;0061 1DFA 1CDD 0316 059A 0062;0061 1DFA 1CDD 0316 059A 0062;0061 1DFA 1CDD 0316 059A 0062; # (aâ—Œá³â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌á³â—ŒÌ–◌֚b; a◌᷺◌á³â—ŒÌ–◌֚b; a◌᷺◌á³â—ŒÌ–◌֚b; a◌᷺◌á³â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CDE 0062;0061 1DFA 0316 1CDE 059A 0062;0061 1DFA 0316 1CDE 059A 0062;0061 1DFA 0316 1CDE 059A 0062;0061 1DFA 0316 1CDE 059A 0062; # (a◌֚◌̖◌᷺◌᳞b; a◌᷺◌̖◌᳞◌֚b; a◌᷺◌̖◌᳞◌֚b; a◌᷺◌̖◌᳞◌֚b; a◌᷺◌̖◌᳞◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE TWO DOTS BELOW, LATIN SMALL LETTER B
+0061 1CDE 059A 0316 1DFA 0062;0061 1DFA 1CDE 0316 059A 0062;0061 1DFA 1CDE 0316 059A 0062;0061 1DFA 1CDE 0316 059A 0062;0061 1DFA 1CDE 0316 059A 0062; # (a◌᳞◌֚◌̖◌᷺b; a◌᷺◌᳞◌̖◌֚b; a◌᷺◌᳞◌̖◌֚b; a◌᷺◌᳞◌̖◌֚b; a◌᷺◌᳞◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CDF 0062;0061 1DFA 0316 1CDF 059A 0062;0061 1DFA 0316 1CDF 059A 0062;0061 1DFA 0316 1CDF 059A 0062;0061 1DFA 0316 1CDF 059A 0062; # (a◌֚◌̖◌᷺◌᳟b; a◌᷺◌̖◌᳟◌֚b; a◌᷺◌̖◌᳟◌֚b; a◌᷺◌̖◌᳟◌֚b; a◌᷺◌̖◌᳟◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC TONE THREE DOTS BELOW, LATIN SMALL LETTER B
+0061 1CDF 059A 0316 1DFA 0062;0061 1DFA 1CDF 0316 059A 0062;0061 1DFA 1CDF 0316 059A 0062;0061 1DFA 1CDF 0316 059A 0062;0061 1DFA 1CDF 0316 059A 0062; # (a◌᳟◌֚◌̖◌᷺b; a◌᷺◌᳟◌̖◌֚b; a◌᷺◌᳟◌̖◌֚b; a◌᷺◌᳟◌̖◌֚b; a◌᷺◌᳟◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC TONE THREE DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1CE0 0062;00E0 05AE 1CE0 0315 0062;0061 05AE 0300 1CE0 0315 0062;00E0 05AE 1CE0 0315 0062;0061 05AE 0300 1CE0 0315 0062; # (a◌̕◌̀◌֮◌᳠b; à◌֮◌᳠◌̕b; a◌֮◌̀◌᳠◌̕b; à◌֮◌᳠◌̕b; a◌֮◌̀◌᳠◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA, LATIN SMALL LETTER B
0061 1CE0 0315 0300 05AE 0062;0061 05AE 1CE0 0300 0315 0062;0061 05AE 1CE0 0300 0315 0062;0061 05AE 1CE0 0300 0315 0062;0061 05AE 1CE0 0300 0315 0062; # (a◌᳠◌̕◌̀◌֮b; a◌֮◌᳠◌̀◌̕b; a◌֮◌᳠◌̀◌̕b; a◌֮◌᳠◌̀◌̕b; a◌֮◌᳠◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 16FF0 0334 1CE2 0062;0061 0334 1CE2 16FF0 0062;0061 0334 1CE2 16FF0 0062;0061 0334 1CE2 16FF0 0062;0061 0334 1CE2 16FF0 0062; # (a𖿰◌̴◌᳢b; a◌̴◌᳢𖿰b; a◌̴◌᳢𖿰b; a◌̴◌᳢𖿰b; a◌̴◌᳢𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN VISARGA SVARITA, LATIN SMALL LETTER B
@@ -17913,8 +18038,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1CE7 16FF0 0334 0062;0061 1CE7 0334 16FF0 0062;0061 1CE7 0334 16FF0 0062;0061 1CE7 0334 16FF0 0062;0061 1CE7 0334 16FF0 0062; # (a◌᳧𖿰◌̴b; a◌᳧◌̴𖿰b; a◌᳧◌̴𖿰b; a◌᳧◌̴𖿰b; a◌᳧◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN VISARGA UDATTA WITH TAIL, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 16FF0 0334 1CE8 0062;0061 0334 1CE8 16FF0 0062;0061 0334 1CE8 16FF0 0062;0061 0334 1CE8 16FF0 0062;0061 0334 1CE8 16FF0 0062; # (a𖿰◌̴◌᳨b; a◌̴◌᳨𖿰b; a◌̴◌᳨𖿰b; a◌̴◌᳨𖿰b; a◌̴◌᳨𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, VEDIC SIGN VISARGA ANUDATTA WITH TAIL, LATIN SMALL LETTER B
0061 1CE8 16FF0 0334 0062;0061 1CE8 0334 16FF0 0062;0061 1CE8 0334 16FF0 0062;0061 1CE8 0334 16FF0 0062;0061 1CE8 0334 16FF0 0062; # (a◌᳨𖿰◌̴b; a◌᳨◌̴𖿰b; a◌᳨◌̴𖿰b; a◌᳨◌̴𖿰b; a◌᳨◌̴𖿰b; ) LATIN SMALL LETTER A, VEDIC SIGN VISARGA ANUDATTA WITH TAIL, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
-0061 059A 0316 302A 1CED 0062;0061 302A 0316 1CED 059A 0062;0061 302A 0316 1CED 059A 0062;0061 302A 0316 1CED 059A 0062;0061 302A 0316 1CED 059A 0062; # (a◌֚◌̖◌〪◌᳭b; a◌〪◌̖◌᳭◌֚b; a◌〪◌̖◌᳭◌֚b; a◌〪◌̖◌᳭◌֚b; a◌〪◌̖◌᳭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, VEDIC SIGN TIRYAK, LATIN SMALL LETTER B
-0061 1CED 059A 0316 302A 0062;0061 302A 1CED 0316 059A 0062;0061 302A 1CED 0316 059A 0062;0061 302A 1CED 0316 059A 0062;0061 302A 1CED 0316 059A 0062; # (a◌᳭◌֚◌̖◌〪b; a◌〪◌᳭◌̖◌֚b; a◌〪◌᳭◌̖◌֚b; a◌〪◌᳭◌̖◌֚b; a◌〪◌᳭◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC SIGN TIRYAK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1CED 0062;0061 1DFA 0316 1CED 059A 0062;0061 1DFA 0316 1CED 059A 0062;0061 1DFA 0316 1CED 059A 0062;0061 1DFA 0316 1CED 059A 0062; # (a◌֚◌̖◌᷺◌᳭b; a◌᷺◌̖◌᳭◌֚b; a◌᷺◌̖◌᳭◌֚b; a◌᷺◌̖◌᳭◌֚b; a◌᷺◌̖◌᳭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, VEDIC SIGN TIRYAK, LATIN SMALL LETTER B
+0061 1CED 059A 0316 1DFA 0062;0061 1DFA 1CED 0316 059A 0062;0061 1DFA 1CED 0316 059A 0062;0061 1DFA 1CED 0316 059A 0062;0061 1DFA 1CED 0316 059A 0062; # (a◌᳭◌֚◌̖◌᷺b; a◌᷺◌᳭◌̖◌֚b; a◌᷺◌᳭◌̖◌֚b; a◌᷺◌᳭◌̖◌֚b; a◌᷺◌᳭◌̖◌֚b; ) LATIN SMALL LETTER A, VEDIC SIGN TIRYAK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1CF4 0062;00E0 05AE 1CF4 0315 0062;0061 05AE 0300 1CF4 0315 0062;00E0 05AE 1CF4 0315 0062;0061 05AE 0300 1CF4 0315 0062; # (a◌̕◌̀◌֮◌᳴b; à◌֮◌᳴◌̕b; a◌֮◌̀◌᳴◌̕b; à◌֮◌᳴◌̕b; a◌֮◌̀◌᳴◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE CANDRA ABOVE, LATIN SMALL LETTER B
0061 1CF4 0315 0300 05AE 0062;0061 05AE 1CF4 0300 0315 0062;0061 05AE 1CF4 0300 0315 0062;0061 05AE 1CF4 0300 0315 0062;0061 05AE 1CF4 0300 0315 0062; # (a◌᳴◌̕◌̀◌֮b; a◌֮◌᳴◌̀◌̕b; a◌֮◌᳴◌̀◌̕b; a◌֮◌᳴◌̀◌̕b; a◌֮◌᳴◌̀◌̕b; ) LATIN SMALL LETTER A, VEDIC TONE CANDRA ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1CF8 0062;00E0 05AE 1CF8 0315 0062;0061 05AE 0300 1CF8 0315 0062;00E0 05AE 1CF8 0315 0062;0061 05AE 0300 1CF8 0315 0062; # (a◌̕◌̀◌֮◌᳸b; à◌֮◌᳸◌̕b; a◌֮◌̀◌᳸◌̕b; à◌֮◌᳸◌̕b; a◌֮◌̀◌᳸◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, VEDIC TONE RING ABOVE, LATIN SMALL LETTER B
@@ -17925,8 +18050,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1DC0 0315 0300 05AE 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062;0061 05AE 1DC0 0300 0315 0062; # (a◌᷀◌̕◌̀◌֮b; a◌֮◌᷀◌̀◌̕b; a◌֮◌᷀◌̀◌̕b; a◌֮◌᷀◌̀◌̕b; a◌֮◌᷀◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DOTTED GRAVE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DC1 0062;00E0 05AE 1DC1 0315 0062;0061 05AE 0300 1DC1 0315 0062;00E0 05AE 1DC1 0315 0062;0061 05AE 0300 1DC1 0315 0062; # (a◌̕◌̀◌֮◌á·b; à◌֮◌á·â—ŒÌ•b; a◌֮◌̀◌á·â—ŒÌ•b; à◌֮◌á·â—ŒÌ•b; a◌֮◌̀◌á·â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DOTTED ACUTE ACCENT, LATIN SMALL LETTER B
0061 1DC1 0315 0300 05AE 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062;0061 05AE 1DC1 0300 0315 0062; # (aâ—Œá·â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌á·â—ŒÌ€â—ŒÌ•b; a◌֮◌á·â—ŒÌ€â—ŒÌ•b; a◌֮◌á·â—ŒÌ€â—ŒÌ•b; a◌֮◌á·â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING DOTTED ACUTE ACCENT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1DC2 0062;0061 302A 0316 1DC2 059A 0062;0061 302A 0316 1DC2 059A 0062;0061 302A 0316 1DC2 059A 0062;0061 302A 0316 1DC2 059A 0062; # (a◌֚◌̖◌〪◌᷂b; a◌〪◌̖◌᷂◌֚b; a◌〪◌̖◌᷂◌֚b; a◌〪◌̖◌᷂◌֚b; a◌〪◌̖◌᷂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING SNAKE BELOW, LATIN SMALL LETTER B
-0061 1DC2 059A 0316 302A 0062;0061 302A 1DC2 0316 059A 0062;0061 302A 1DC2 0316 059A 0062;0061 302A 1DC2 0316 059A 0062;0061 302A 1DC2 0316 059A 0062; # (a◌᷂◌֚◌̖◌〪b; a◌〪◌᷂◌̖◌֚b; a◌〪◌᷂◌̖◌֚b; a◌〪◌᷂◌̖◌֚b; a◌〪◌᷂◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SNAKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1DC2 0062;0061 1DFA 0316 1DC2 059A 0062;0061 1DFA 0316 1DC2 059A 0062;0061 1DFA 0316 1DC2 059A 0062;0061 1DFA 0316 1DC2 059A 0062; # (a◌֚◌̖◌᷺◌᷂b; a◌᷺◌̖◌᷂◌֚b; a◌᷺◌̖◌᷂◌֚b; a◌᷺◌̖◌᷂◌֚b; a◌᷺◌̖◌᷂◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING SNAKE BELOW, LATIN SMALL LETTER B
+0061 1DC2 059A 0316 1DFA 0062;0061 1DFA 1DC2 0316 059A 0062;0061 1DFA 1DC2 0316 059A 0062;0061 1DFA 1DC2 0316 059A 0062;0061 1DFA 1DC2 0316 059A 0062; # (a◌᷂◌֚◌̖◌᷺b; a◌᷺◌᷂◌̖◌֚b; a◌᷺◌᷂◌̖◌֚b; a◌᷺◌᷂◌̖◌֚b; a◌᷺◌᷂◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING SNAKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DC3 0062;00E0 05AE 1DC3 0315 0062;0061 05AE 0300 1DC3 0315 0062;00E0 05AE 1DC3 0315 0062;0061 05AE 0300 1DC3 0315 0062; # (a◌̕◌̀◌֮◌᷃b; à◌֮◌᷃◌̕b; a◌֮◌̀◌᷃◌̕b; à◌֮◌᷃◌̕b; a◌֮◌̀◌᷃◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING SUSPENSION MARK, LATIN SMALL LETTER B
0061 1DC3 0315 0300 05AE 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062;0061 05AE 1DC3 0300 0315 0062; # (a◌᷃◌̕◌̀◌֮b; a◌֮◌᷃◌̀◌̕b; a◌֮◌᷃◌̀◌̕b; a◌֮◌᷃◌̀◌̕b; a◌֮◌᷃◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING SUSPENSION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DC4 0062;00E0 05AE 1DC4 0315 0062;0061 05AE 0300 1DC4 0315 0062;00E0 05AE 1DC4 0315 0062;0061 05AE 0300 1DC4 0315 0062; # (a◌̕◌̀◌֮◌᷄b; à◌֮◌᷄◌̕b; a◌֮◌̀◌᷄◌̕b; à◌֮◌᷄◌̕b; a◌֮◌̀◌᷄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON-ACUTE, LATIN SMALL LETTER B
@@ -17941,8 +18066,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1DC8 0315 0300 05AE 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062;0061 05AE 1DC8 0300 0315 0062; # (a◌᷈◌̕◌̀◌֮b; a◌֮◌᷈◌̀◌̕b; a◌֮◌᷈◌̀◌̕b; a◌֮◌᷈◌̀◌̕b; a◌֮◌᷈◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING GRAVE-ACUTE-GRAVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DC9 0062;00E0 05AE 1DC9 0315 0062;0061 05AE 0300 1DC9 0315 0062;00E0 05AE 1DC9 0315 0062;0061 05AE 0300 1DC9 0315 0062; # (a◌̕◌̀◌֮◌᷉b; à◌֮◌᷉◌̕b; a◌֮◌̀◌᷉◌̕b; à◌֮◌᷉◌̕b; a◌֮◌̀◌᷉◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ACUTE-GRAVE-ACUTE, LATIN SMALL LETTER B
0061 1DC9 0315 0300 05AE 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062;0061 05AE 1DC9 0300 0315 0062; # (a◌᷉◌̕◌̀◌֮b; a◌֮◌᷉◌̀◌̕b; a◌֮◌᷉◌̀◌̕b; a◌֮◌᷉◌̀◌̕b; a◌֮◌᷉◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ACUTE-GRAVE-ACUTE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1DCA 0062;0061 302A 0316 1DCA 059A 0062;0061 302A 0316 1DCA 059A 0062;0061 302A 0316 1DCA 059A 0062;0061 302A 0316 1DCA 059A 0062; # (a◌֚◌̖◌〪◌᷊b; a◌〪◌̖◌᷊◌֚b; a◌〪◌̖◌᷊◌֚b; a◌〪◌̖◌᷊◌֚b; a◌〪◌̖◌᷊◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LATIN SMALL LETTER R BELOW, LATIN SMALL LETTER B
-0061 1DCA 059A 0316 302A 0062;0061 302A 1DCA 0316 059A 0062;0061 302A 1DCA 0316 059A 0062;0061 302A 1DCA 0316 059A 0062;0061 302A 1DCA 0316 059A 0062; # (a◌᷊◌֚◌̖◌〪b; a◌〪◌᷊◌̖◌֚b; a◌〪◌᷊◌̖◌֚b; a◌〪◌᷊◌̖◌֚b; a◌〪◌᷊◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER R BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1DCA 0062;0061 1DFA 0316 1DCA 059A 0062;0061 1DFA 0316 1DCA 059A 0062;0061 1DFA 0316 1DCA 059A 0062;0061 1DFA 0316 1DCA 059A 0062; # (a◌֚◌̖◌᷺◌᷊b; a◌᷺◌̖◌᷊◌֚b; a◌᷺◌̖◌᷊◌֚b; a◌᷺◌̖◌᷊◌֚b; a◌᷺◌̖◌᷊◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LATIN SMALL LETTER R BELOW, LATIN SMALL LETTER B
+0061 1DCA 059A 0316 1DFA 0062;0061 1DFA 1DCA 0316 059A 0062;0061 1DFA 1DCA 0316 059A 0062;0061 1DFA 1DCA 0316 059A 0062;0061 1DFA 1DCA 0316 059A 0062; # (a◌᷊◌֚◌̖◌᷺b; a◌᷺◌᷊◌̖◌֚b; a◌᷺◌᷊◌̖◌֚b; a◌᷺◌᷊◌̖◌֚b; a◌᷺◌᷊◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LATIN SMALL LETTER R BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DCB 0062;00E0 05AE 1DCB 0315 0062;0061 05AE 0300 1DCB 0315 0062;00E0 05AE 1DCB 0315 0062;0061 05AE 0300 1DCB 0315 0062; # (a◌̕◌̀◌֮◌᷋b; à◌֮◌᷋◌̕b; a◌֮◌̀◌᷋◌̕b; à◌֮◌᷋◌̕b; a◌֮◌̀◌᷋◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING BREVE-MACRON, LATIN SMALL LETTER B
0061 1DCB 0315 0300 05AE 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062;0061 05AE 1DCB 0300 0315 0062; # (a◌᷋◌̕◌̀◌֮b; a◌֮◌᷋◌̀◌̕b; a◌֮◌᷋◌̀◌̕b; a◌֮◌᷋◌̀◌̕b; a◌֮◌᷋◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING BREVE-MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DCC 0062;00E0 05AE 1DCC 0315 0062;0061 05AE 0300 1DCC 0315 0062;00E0 05AE 1DCC 0315 0062;0061 05AE 0300 1DCC 0315 0062; # (a◌̕◌̀◌֮◌᷌b; à◌֮◌᷌◌̕b; a◌֮◌̀◌᷌◌̕b; à◌֮◌᷌◌̕b; a◌֮◌̀◌᷌◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING MACRON-BREVE, LATIN SMALL LETTER B
@@ -17951,8 +18076,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1DCD 0345 035D 035C 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062;0061 035C 1DCD 035D 0345 0062; # (aâ—Œá·â—ŒÍ…â—ŒÍ◌͜b; a◌͜◌á·â—ŒÍ◌ͅb; a◌͜◌á·â—ŒÍ◌ͅb; a◌͜◌á·â—ŒÍ◌ͅb; a◌͜◌á·â—ŒÍ◌ͅb; ) LATIN SMALL LETTER A, COMBINING DOUBLE CIRCUMFLEX ABOVE, COMBINING GREEK YPOGEGRAMMENI, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, LATIN SMALL LETTER B
0061 031B 1DCE 0321 1DCE 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062; # (a◌̛◌᷎◌̡◌᷎b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; ) LATIN SMALL LETTER A, COMBINING HORN, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
0061 1DCE 031B 1DCE 0321 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062;0061 0321 1DCE 1DCE 031B 0062; # (a◌᷎◌̛◌᷎◌̡b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; a◌̡◌᷎◌᷎◌̛b; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING HORN, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, LATIN SMALL LETTER B
-0061 059A 0316 302A 1DCF 0062;0061 302A 0316 1DCF 059A 0062;0061 302A 0316 1DCF 059A 0062;0061 302A 0316 1DCF 059A 0062;0061 302A 0316 1DCF 059A 0062; # (a◌֚◌̖◌〪◌á·b; a◌〪◌̖◌á·â—ŒÖšb; a◌〪◌̖◌á·â—ŒÖšb; a◌〪◌̖◌á·â—ŒÖšb; a◌〪◌̖◌á·â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING ZIGZAG BELOW, LATIN SMALL LETTER B
-0061 1DCF 059A 0316 302A 0062;0061 302A 1DCF 0316 059A 0062;0061 302A 1DCF 0316 059A 0062;0061 302A 1DCF 0316 059A 0062;0061 302A 1DCF 0316 059A 0062; # (aâ—Œá·â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌á·â—ŒÌ–◌֚b; a◌〪◌á·â—ŒÌ–◌֚b; a◌〪◌á·â—ŒÌ–◌֚b; a◌〪◌á·â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, COMBINING ZIGZAG BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1DCF 0062;0061 1DFA 0316 1DCF 059A 0062;0061 1DFA 0316 1DCF 059A 0062;0061 1DFA 0316 1DCF 059A 0062;0061 1DFA 0316 1DCF 059A 0062; # (a◌֚◌̖◌᷺◌á·b; a◌᷺◌̖◌á·â—ŒÖšb; a◌᷺◌̖◌á·â—ŒÖšb; a◌᷺◌̖◌á·â—ŒÖšb; a◌᷺◌̖◌á·â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ZIGZAG BELOW, LATIN SMALL LETTER B
+0061 1DCF 059A 0316 1DFA 0062;0061 1DFA 1DCF 0316 059A 0062;0061 1DFA 1DCF 0316 059A 0062;0061 1DFA 1DCF 0316 059A 0062;0061 1DFA 1DCF 0316 059A 0062; # (aâ—Œá·â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌á·â—ŒÌ–◌֚b; a◌᷺◌á·â—ŒÌ–◌֚b; a◌᷺◌á·â—ŒÌ–◌֚b; a◌᷺◌á·â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, COMBINING ZIGZAG BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 1DCE 0321 0F74 1DD0 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062;0061 0F74 0321 1DD0 1DCE 0062; # (a◌᷎◌̡◌ུ◌á·b; a◌ུ◌̡◌á·â—Œá·Žb; a◌ུ◌̡◌á·â—Œá·Žb; a◌ུ◌̡◌á·â—Œá·Žb; a◌ུ◌̡◌á·â—Œá·Žb; ) LATIN SMALL LETTER A, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, COMBINING IS BELOW, LATIN SMALL LETTER B
0061 1DD0 1DCE 0321 0F74 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062;0061 0F74 1DD0 0321 1DCE 0062; # (aâ—Œá·â—Œá·Žâ—ŒÌ¡â—Œà½´b; a◌ུ◌á·â—ŒÌ¡â—Œá·Žb; a◌ུ◌á·â—ŒÌ¡â—Œá·Žb; a◌ུ◌á·â—ŒÌ¡â—Œá·Žb; a◌ུ◌á·â—ŒÌ¡â—Œá·Žb; ) LATIN SMALL LETTER A, COMBINING IS BELOW, COMBINING OGONEK ABOVE, COMBINING PALATALIZED HOOK BELOW, TIBETAN VOWEL SIGN U, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DD1 0062;00E0 05AE 1DD1 0315 0062;0061 05AE 0300 1DD1 0315 0062;00E0 05AE 1DD1 0315 0062;0061 05AE 0300 1DD1 0315 0062; # (a◌̕◌̀◌֮◌᷑b; à◌֮◌᷑◌̕b; a◌֮◌̀◌᷑◌̕b; à◌֮◌᷑◌̕b; a◌֮◌̀◌᷑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING UR ABOVE, LATIN SMALL LETTER B
@@ -18035,18 +18160,20 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1DF7 0300 05AE 1D16D 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062;00E0 1D16D 1DF7 05AE 0062;0061 1D16D 1DF7 05AE 0300 0062; # (a◌᷷◌̀◌֮ð…­b; àð…­â—Œá··â—ŒÖ®b; að…­â—Œá··â—ŒÖ®â—ŒÌ€b; àð…­â—Œá··â—ŒÖ®b; að…­â—Œá··â—ŒÖ®â—ŒÌ€b; ) LATIN SMALL LETTER A, COMBINING KAVYKA ABOVE LEFT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B
0061 0300 05AE 1D16D 1DF8 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062;00E0 1D16D 05AE 1DF8 0062;0061 1D16D 05AE 1DF8 0300 0062; # (a◌̀◌֮ð…­â—Œá·¸b; àð…­â—ŒÖ®â—Œá·¸b; að…­â—ŒÖ®â—Œá·¸â—ŒÌ€b; àð…­â—ŒÖ®â—Œá·¸b; að…­â—ŒÖ®â—Œá·¸â—ŒÌ€b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, COMBINING DOT ABOVE LEFT, LATIN SMALL LETTER B
0061 1DF8 0300 05AE 1D16D 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062;00E0 1D16D 1DF8 05AE 0062;0061 1D16D 1DF8 05AE 0300 0062; # (a◌᷸◌̀◌֮ð…­b; àð…­â—Œá·¸â—ŒÖ®b; að…­â—Œá·¸â—ŒÖ®â—ŒÌ€b; àð…­â—Œá·¸â—ŒÖ®b; að…­â—Œá·¸â—ŒÖ®â—ŒÌ€b; ) LATIN SMALL LETTER A, COMBINING DOT ABOVE LEFT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B
-0061 059A 0316 302A 1DF9 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062;0061 302A 0316 1DF9 059A 0062; # (a◌֚◌̖◌〪◌᷹b; a◌〪◌̖◌᷹◌֚b; a◌〪◌̖◌᷹◌֚b; a◌〪◌̖◌᷹◌֚b; a◌〪◌̖◌᷹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING WIDE INVERTED BRIDGE BELOW, LATIN SMALL LETTER B
-0061 1DF9 059A 0316 302A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062;0061 302A 1DF9 0316 059A 0062; # (a◌᷹◌֚◌̖◌〪b; a◌〪◌᷹◌̖◌֚b; a◌〪◌᷹◌̖◌֚b; a◌〪◌᷹◌̖◌֚b; a◌〪◌᷹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING WIDE INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1DF9 0062;0061 1DFA 0316 1DF9 059A 0062;0061 1DFA 0316 1DF9 059A 0062;0061 1DFA 0316 1DF9 059A 0062;0061 1DFA 0316 1DF9 059A 0062; # (a◌֚◌̖◌᷺◌᷹b; a◌᷺◌̖◌᷹◌֚b; a◌᷺◌̖◌᷹◌֚b; a◌᷺◌̖◌᷹◌֚b; a◌᷺◌̖◌᷹◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING WIDE INVERTED BRIDGE BELOW, LATIN SMALL LETTER B
+0061 1DF9 059A 0316 1DFA 0062;0061 1DFA 1DF9 0316 059A 0062;0061 1DFA 1DF9 0316 059A 0062;0061 1DFA 1DF9 0316 059A 0062;0061 1DFA 1DF9 0316 059A 0062; # (a◌᷹◌֚◌̖◌᷺b; a◌᷺◌᷹◌̖◌֚b; a◌᷺◌᷹◌̖◌֚b; a◌᷺◌᷹◌̖◌֚b; a◌᷺◌᷹◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING WIDE INVERTED BRIDGE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0316 1DFA 031B 1DFA 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062; # (a◌̖◌᷺◌̛◌᷺b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 1DFA 0316 1DFA 031B 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062;0061 031B 1DFA 1DFA 0316 0062; # (a◌᷺◌̖◌᷺◌̛b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; a◌̛◌᷺◌᷺◌̖b; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DFB 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062;00E0 05AE 1DFB 0315 0062;0061 05AE 0300 1DFB 0315 0062; # (a◌̕◌̀◌֮◌᷻b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; à◌֮◌᷻◌̕b; a◌֮◌̀◌᷻◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DELETION MARK, LATIN SMALL LETTER B
0061 1DFB 0315 0300 05AE 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062;0061 05AE 1DFB 0300 0315 0062; # (a◌᷻◌̕◌̀◌֮b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; a◌֮◌᷻◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DELETION MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 035D 035C 0315 1DFC 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062;0061 0315 035C 1DFC 035D 0062; # (aâ—ŒÍ◌͜◌̕◌᷼b; a◌̕◌͜◌᷼◌Íb; a◌̕◌͜◌᷼◌Íb; a◌̕◌͜◌᷼◌Íb; a◌̕◌͜◌᷼◌Íb; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING DOUBLE INVERTED BREVE BELOW, LATIN SMALL LETTER B
0061 1DFC 035D 035C 0315 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062;0061 0315 1DFC 035C 035D 0062; # (a◌᷼◌Í◌͜◌̕b; a◌̕◌᷼◌͜◌Íb; a◌̕◌᷼◌͜◌Íb; a◌̕◌᷼◌͜◌Íb; a◌̕◌᷼◌͜◌Íb; ) LATIN SMALL LETTER A, COMBINING DOUBLE INVERTED BREVE BELOW, COMBINING DOUBLE BREVE, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, LATIN SMALL LETTER B
-0061 059A 0316 302A 1DFD 0062;0061 302A 0316 1DFD 059A 0062;0061 302A 0316 1DFD 059A 0062;0061 302A 0316 1DFD 059A 0062;0061 302A 0316 1DFD 059A 0062; # (a◌֚◌̖◌〪◌᷽b; a◌〪◌̖◌᷽◌֚b; a◌〪◌̖◌᷽◌֚b; a◌〪◌̖◌᷽◌֚b; a◌〪◌̖◌᷽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING ALMOST EQUAL TO BELOW, LATIN SMALL LETTER B
-0061 1DFD 059A 0316 302A 0062;0061 302A 1DFD 0316 059A 0062;0061 302A 1DFD 0316 059A 0062;0061 302A 1DFD 0316 059A 0062;0061 302A 1DFD 0316 059A 0062; # (a◌᷽◌֚◌̖◌〪b; a◌〪◌᷽◌̖◌֚b; a◌〪◌᷽◌̖◌֚b; a◌〪◌᷽◌̖◌֚b; a◌〪◌᷽◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ALMOST EQUAL TO BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1DFD 0062;0061 1DFA 0316 1DFD 059A 0062;0061 1DFA 0316 1DFD 059A 0062;0061 1DFA 0316 1DFD 059A 0062;0061 1DFA 0316 1DFD 059A 0062; # (a◌֚◌̖◌᷺◌᷽b; a◌᷺◌̖◌᷽◌֚b; a◌᷺◌̖◌᷽◌֚b; a◌᷺◌̖◌᷽◌֚b; a◌᷺◌̖◌᷽◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING ALMOST EQUAL TO BELOW, LATIN SMALL LETTER B
+0061 1DFD 059A 0316 1DFA 0062;0061 1DFA 1DFD 0316 059A 0062;0061 1DFA 1DFD 0316 059A 0062;0061 1DFA 1DFD 0316 059A 0062;0061 1DFA 1DFD 0316 059A 0062; # (a◌᷽◌֚◌̖◌᷺b; a◌᷺◌᷽◌̖◌֚b; a◌᷺◌᷽◌̖◌֚b; a◌᷺◌᷽◌̖◌֚b; a◌᷺◌᷽◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING ALMOST EQUAL TO BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1DFE 0062;00E0 05AE 1DFE 0315 0062;0061 05AE 0300 1DFE 0315 0062;00E0 05AE 1DFE 0315 0062;0061 05AE 0300 1DFE 0315 0062; # (a◌̕◌̀◌֮◌᷾b; à◌֮◌᷾◌̕b; a◌֮◌̀◌᷾◌̕b; à◌֮◌᷾◌̕b; a◌֮◌̀◌᷾◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT ARROWHEAD ABOVE, LATIN SMALL LETTER B
0061 1DFE 0315 0300 05AE 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062;0061 05AE 1DFE 0300 0315 0062; # (a◌᷾◌̕◌̀◌֮b; a◌֮◌᷾◌̀◌̕b; a◌֮◌᷾◌̀◌̕b; a◌֮◌᷾◌̀◌̕b; a◌֮◌᷾◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROWHEAD ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1DFF 0062;0061 302A 0316 1DFF 059A 0062;0061 302A 0316 1DFF 059A 0062;0061 302A 0316 1DFF 059A 0062;0061 302A 0316 1DFF 059A 0062; # (a◌֚◌̖◌〪◌᷿b; a◌〪◌̖◌᷿◌֚b; a◌〪◌̖◌᷿◌֚b; a◌〪◌̖◌᷿◌֚b; a◌〪◌̖◌᷿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW, LATIN SMALL LETTER B
-0061 1DFF 059A 0316 302A 0062;0061 302A 1DFF 0316 059A 0062;0061 302A 1DFF 0316 059A 0062;0061 302A 1DFF 0316 059A 0062;0061 302A 1DFF 0316 059A 0062; # (a◌᷿◌֚◌̖◌〪b; a◌〪◌᷿◌̖◌֚b; a◌〪◌᷿◌̖◌֚b; a◌〪◌᷿◌̖◌֚b; a◌〪◌᷿◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1DFF 0062;0061 1DFA 0316 1DFF 059A 0062;0061 1DFA 0316 1DFF 059A 0062;0061 1DFA 0316 1DFF 059A 0062;0061 1DFA 0316 1DFF 059A 0062; # (a◌֚◌̖◌᷺◌᷿b; a◌᷺◌̖◌᷿◌֚b; a◌᷺◌̖◌᷿◌֚b; a◌᷺◌̖◌᷿◌֚b; a◌᷺◌̖◌᷿◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW, LATIN SMALL LETTER B
+0061 1DFF 059A 0316 1DFA 0062;0061 1DFA 1DFF 0316 059A 0062;0061 1DFA 1DFF 0316 059A 0062;0061 1DFA 1DFF 0316 059A 0062;0061 1DFA 1DFF 0316 059A 0062; # (a◌᷿◌֚◌̖◌᷺b; a◌᷺◌᷿◌̖◌֚b; a◌᷺◌᷿◌̖◌֚b; a◌᷺◌᷿◌̖◌֚b; a◌᷺◌᷿◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 20D0 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062;00E0 05AE 20D0 0315 0062;0061 05AE 0300 20D0 0315 0062; # (a◌̕◌̀◌֮◌âƒb; à◌֮◌âƒâ—ŒÌ•b; a◌֮◌̀◌âƒâ—ŒÌ•b; à◌֮◌âƒâ—ŒÌ•b; a◌֮◌̀◌âƒâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING LEFT HARPOON ABOVE, LATIN SMALL LETTER B
0061 20D0 0315 0300 05AE 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062;0061 05AE 20D0 0300 0315 0062; # (aâ—Œâƒâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌âƒâ—ŒÌ€â—ŒÌ•b; a◌֮◌âƒâ—ŒÌ€â—ŒÌ•b; a◌֮◌âƒâ—ŒÌ€â—ŒÌ•b; a◌֮◌âƒâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING LEFT HARPOON ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 20D1 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062;00E0 05AE 20D1 0315 0062;0061 05AE 0300 20D1 0315 0062; # (a◌̕◌̀◌֮◌⃑b; à◌֮◌⃑◌̕b; a◌֮◌̀◌⃑◌̕b; à◌֮◌⃑◌̕b; a◌֮◌̀◌⃑◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING RIGHT HARPOON ABOVE, LATIN SMALL LETTER B
@@ -18081,22 +18208,22 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 20E6 16FF0 0334 0062;0061 20E6 0334 16FF0 0062;0061 20E6 0334 16FF0 0062;0061 20E6 0334 16FF0 0062;0061 20E6 0334 16FF0 0062; # (a◌⃦𖿰◌̴b; a◌⃦◌̴𖿰b; a◌⃦◌̴𖿰b; a◌⃦◌̴𖿰b; a◌⃦◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING DOUBLE VERTICAL STROKE OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 0315 0300 05AE 20E7 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062;00E0 05AE 20E7 0315 0062;0061 05AE 0300 20E7 0315 0062; # (a◌̕◌̀◌֮◌⃧b; à◌֮◌⃧◌̕b; a◌֮◌̀◌⃧◌̕b; à◌֮◌⃧◌̕b; a◌֮◌̀◌⃧◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ANNUITY SYMBOL, LATIN SMALL LETTER B
0061 20E7 0315 0300 05AE 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062;0061 05AE 20E7 0300 0315 0062; # (a◌⃧◌̕◌̀◌֮b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; a◌֮◌⃧◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ANNUITY SYMBOL, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 20E8 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062;0061 302A 0316 20E8 059A 0062; # (a◌֚◌̖◌〪◌⃨b; a◌〪◌̖◌⃨◌֚b; a◌〪◌̖◌⃨◌֚b; a◌〪◌̖◌⃨◌֚b; a◌〪◌̖◌⃨◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING TRIPLE UNDERDOT, LATIN SMALL LETTER B
-0061 20E8 059A 0316 302A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062;0061 302A 20E8 0316 059A 0062; # (a◌⃨◌֚◌̖◌〪b; a◌〪◌⃨◌̖◌֚b; a◌〪◌⃨◌̖◌֚b; a◌〪◌⃨◌̖◌֚b; a◌〪◌⃨◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TRIPLE UNDERDOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 20E8 0062;0061 1DFA 0316 20E8 059A 0062;0061 1DFA 0316 20E8 059A 0062;0061 1DFA 0316 20E8 059A 0062;0061 1DFA 0316 20E8 059A 0062; # (a◌֚◌̖◌᷺◌⃨b; a◌᷺◌̖◌⃨◌֚b; a◌᷺◌̖◌⃨◌֚b; a◌᷺◌̖◌⃨◌֚b; a◌᷺◌̖◌⃨◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TRIPLE UNDERDOT, LATIN SMALL LETTER B
+0061 20E8 059A 0316 1DFA 0062;0061 1DFA 20E8 0316 059A 0062;0061 1DFA 20E8 0316 059A 0062;0061 1DFA 20E8 0316 059A 0062;0061 1DFA 20E8 0316 059A 0062; # (a◌⃨◌֚◌̖◌᷺b; a◌᷺◌⃨◌̖◌֚b; a◌᷺◌⃨◌̖◌֚b; a◌᷺◌⃨◌̖◌֚b; a◌᷺◌⃨◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TRIPLE UNDERDOT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 20E9 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062;00E0 05AE 20E9 0315 0062;0061 05AE 0300 20E9 0315 0062; # (a◌̕◌̀◌֮◌⃩b; à◌֮◌⃩◌̕b; a◌֮◌̀◌⃩◌̕b; à◌֮◌⃩◌̕b; a◌֮◌̀◌⃩◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING WIDE BRIDGE ABOVE, LATIN SMALL LETTER B
0061 20E9 0315 0300 05AE 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062;0061 05AE 20E9 0300 0315 0062; # (a◌⃩◌̕◌̀◌֮b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; a◌֮◌⃩◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING WIDE BRIDGE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 16FF0 0334 20EA 0062;0061 0334 20EA 16FF0 0062;0061 0334 20EA 16FF0 0062;0061 0334 20EA 16FF0 0062;0061 0334 20EA 16FF0 0062; # (a𖿰◌̴◌⃪b; a◌̴◌⃪𖿰b; a◌̴◌⃪𖿰b; a◌̴◌⃪𖿰b; a◌̴◌⃪𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LEFTWARDS ARROW OVERLAY, LATIN SMALL LETTER B
0061 20EA 16FF0 0334 0062;0061 20EA 0334 16FF0 0062;0061 20EA 0334 16FF0 0062;0061 20EA 0334 16FF0 0062;0061 20EA 0334 16FF0 0062; # (a◌⃪𖿰◌̴b; a◌⃪◌̴𖿰b; a◌⃪◌̴𖿰b; a◌⃪◌̴𖿰b; a◌⃪◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LEFTWARDS ARROW OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 16FF0 0334 20EB 0062;0061 0334 20EB 16FF0 0062;0061 0334 20EB 16FF0 0062;0061 0334 20EB 16FF0 0062;0061 0334 20EB 16FF0 0062; # (a𖿰◌̴◌⃫b; a◌̴◌⃫𖿰b; a◌̴◌⃫𖿰b; a◌̴◌⃫𖿰b; a◌̴◌⃫𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, COMBINING LONG DOUBLE SOLIDUS OVERLAY, LATIN SMALL LETTER B
0061 20EB 16FF0 0334 0062;0061 20EB 0334 16FF0 0062;0061 20EB 0334 16FF0 0062;0061 20EB 0334 16FF0 0062;0061 20EB 0334 16FF0 0062; # (a◌⃫𖿰◌̴b; a◌⃫◌̴𖿰b; a◌⃫◌̴𖿰b; a◌⃫◌̴𖿰b; a◌⃫◌̴𖿰b; ) LATIN SMALL LETTER A, COMBINING LONG DOUBLE SOLIDUS OVERLAY, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
-0061 059A 0316 302A 20EC 0062;0061 302A 0316 20EC 059A 0062;0061 302A 0316 20EC 059A 0062;0061 302A 0316 20EC 059A 0062;0061 302A 0316 20EC 059A 0062; # (a◌֚◌̖◌〪◌⃬b; a◌〪◌̖◌⃬◌֚b; a◌〪◌̖◌⃬◌֚b; a◌〪◌̖◌⃬◌֚b; a◌〪◌̖◌⃬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS, LATIN SMALL LETTER B
-0061 20EC 059A 0316 302A 0062;0061 302A 20EC 0316 059A 0062;0061 302A 20EC 0316 059A 0062;0061 302A 20EC 0316 059A 0062;0061 302A 20EC 0316 059A 0062; # (a◌⃬◌֚◌̖◌〪b; a◌〪◌⃬◌̖◌֚b; a◌〪◌⃬◌̖◌֚b; a◌〪◌⃬◌̖◌֚b; a◌〪◌⃬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 20ED 0062;0061 302A 0316 20ED 059A 0062;0061 302A 0316 20ED 059A 0062;0061 302A 0316 20ED 059A 0062;0061 302A 0316 20ED 059A 0062; # (a◌֚◌̖◌〪◌⃭b; a◌〪◌̖◌⃭◌֚b; a◌〪◌̖◌⃭◌֚b; a◌〪◌̖◌⃭◌֚b; a◌〪◌̖◌⃭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS, LATIN SMALL LETTER B
-0061 20ED 059A 0316 302A 0062;0061 302A 20ED 0316 059A 0062;0061 302A 20ED 0316 059A 0062;0061 302A 20ED 0316 059A 0062;0061 302A 20ED 0316 059A 0062; # (a◌⃭◌֚◌̖◌〪b; a◌〪◌⃭◌̖◌֚b; a◌〪◌⃭◌̖◌֚b; a◌〪◌⃭◌̖◌֚b; a◌〪◌⃭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 20EE 0062;0061 302A 0316 20EE 059A 0062;0061 302A 0316 20EE 059A 0062;0061 302A 0316 20EE 059A 0062;0061 302A 0316 20EE 059A 0062; # (a◌֚◌̖◌〪◌⃮b; a◌〪◌̖◌⃮◌֚b; a◌〪◌̖◌⃮◌֚b; a◌〪◌̖◌⃮◌֚b; a◌〪◌̖◌⃮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LEFT ARROW BELOW, LATIN SMALL LETTER B
-0061 20EE 059A 0316 302A 0062;0061 302A 20EE 0316 059A 0062;0061 302A 20EE 0316 059A 0062;0061 302A 20EE 0316 059A 0062;0061 302A 20EE 0316 059A 0062; # (a◌⃮◌֚◌̖◌〪b; a◌〪◌⃮◌̖◌֚b; a◌〪◌⃮◌̖◌֚b; a◌〪◌⃮◌̖◌֚b; a◌〪◌⃮◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 20EF 0062;0061 302A 0316 20EF 059A 0062;0061 302A 0316 20EF 059A 0062;0061 302A 0316 20EF 059A 0062;0061 302A 0316 20EF 059A 0062; # (a◌֚◌̖◌〪◌⃯b; a◌〪◌̖◌⃯◌֚b; a◌〪◌̖◌⃯◌֚b; a◌〪◌̖◌⃯◌֚b; a◌〪◌̖◌⃯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING RIGHT ARROW BELOW, LATIN SMALL LETTER B
-0061 20EF 059A 0316 302A 0062;0061 302A 20EF 0316 059A 0062;0061 302A 20EF 0316 059A 0062;0061 302A 20EF 0316 059A 0062;0061 302A 20EF 0316 059A 0062; # (a◌⃯◌֚◌̖◌〪b; a◌〪◌⃯◌̖◌֚b; a◌〪◌⃯◌̖◌֚b; a◌〪◌⃯◌̖◌֚b; a◌〪◌⃯◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 20EC 0062;0061 1DFA 0316 20EC 059A 0062;0061 1DFA 0316 20EC 059A 0062;0061 1DFA 0316 20EC 059A 0062;0061 1DFA 0316 20EC 059A 0062; # (a◌֚◌̖◌᷺◌⃬b; a◌᷺◌̖◌⃬◌֚b; a◌᷺◌̖◌⃬◌֚b; a◌᷺◌̖◌⃬◌֚b; a◌᷺◌̖◌⃬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS, LATIN SMALL LETTER B
+0061 20EC 059A 0316 1DFA 0062;0061 1DFA 20EC 0316 059A 0062;0061 1DFA 20EC 0316 059A 0062;0061 1DFA 20EC 0316 059A 0062;0061 1DFA 20EC 0316 059A 0062; # (a◌⃬◌֚◌̖◌᷺b; a◌᷺◌⃬◌̖◌֚b; a◌᷺◌⃬◌̖◌֚b; a◌᷺◌⃬◌̖◌֚b; a◌᷺◌⃬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 20ED 0062;0061 1DFA 0316 20ED 059A 0062;0061 1DFA 0316 20ED 059A 0062;0061 1DFA 0316 20ED 059A 0062;0061 1DFA 0316 20ED 059A 0062; # (a◌֚◌̖◌᷺◌⃭b; a◌᷺◌̖◌⃭◌֚b; a◌᷺◌̖◌⃭◌֚b; a◌᷺◌̖◌⃭◌֚b; a◌᷺◌̖◌⃭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS, LATIN SMALL LETTER B
+0061 20ED 059A 0316 1DFA 0062;0061 1DFA 20ED 0316 059A 0062;0061 1DFA 20ED 0316 059A 0062;0061 1DFA 20ED 0316 059A 0062;0061 1DFA 20ED 0316 059A 0062; # (a◌⃭◌֚◌̖◌᷺b; a◌᷺◌⃭◌̖◌֚b; a◌᷺◌⃭◌̖◌֚b; a◌᷺◌⃭◌̖◌֚b; a◌᷺◌⃭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 20EE 0062;0061 1DFA 0316 20EE 059A 0062;0061 1DFA 0316 20EE 059A 0062;0061 1DFA 0316 20EE 059A 0062;0061 1DFA 0316 20EE 059A 0062; # (a◌֚◌̖◌᷺◌⃮b; a◌᷺◌̖◌⃮◌֚b; a◌᷺◌̖◌⃮◌֚b; a◌᷺◌̖◌⃮◌֚b; a◌᷺◌̖◌⃮◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LEFT ARROW BELOW, LATIN SMALL LETTER B
+0061 20EE 059A 0316 1DFA 0062;0061 1DFA 20EE 0316 059A 0062;0061 1DFA 20EE 0316 059A 0062;0061 1DFA 20EE 0316 059A 0062;0061 1DFA 20EE 0316 059A 0062; # (a◌⃮◌֚◌̖◌᷺b; a◌᷺◌⃮◌̖◌֚b; a◌᷺◌⃮◌̖◌֚b; a◌᷺◌⃮◌̖◌֚b; a◌᷺◌⃮◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LEFT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 20EF 0062;0061 1DFA 0316 20EF 059A 0062;0061 1DFA 0316 20EF 059A 0062;0061 1DFA 0316 20EF 059A 0062;0061 1DFA 0316 20EF 059A 0062; # (a◌֚◌̖◌᷺◌⃯b; a◌᷺◌̖◌⃯◌֚b; a◌᷺◌̖◌⃯◌֚b; a◌᷺◌̖◌⃯◌֚b; a◌᷺◌̖◌⃯◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING RIGHT ARROW BELOW, LATIN SMALL LETTER B
+0061 20EF 059A 0316 1DFA 0062;0061 1DFA 20EF 0316 059A 0062;0061 1DFA 20EF 0316 059A 0062;0061 1DFA 20EF 0316 059A 0062;0061 1DFA 20EF 0316 059A 0062; # (a◌⃯◌֚◌̖◌᷺b; a◌᷺◌⃯◌̖◌֚b; a◌᷺◌⃯◌̖◌֚b; a◌᷺◌⃯◌̖◌֚b; a◌᷺◌⃯◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING RIGHT ARROW BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 20F0 0062;00E0 05AE 20F0 0315 0062;0061 05AE 0300 20F0 0315 0062;00E0 05AE 20F0 0315 0062;0061 05AE 0300 20F0 0315 0062; # (a◌̕◌̀◌֮◌⃰b; à◌֮◌⃰◌̕b; a◌֮◌̀◌⃰◌̕b; à◌֮◌⃰◌̕b; a◌֮◌̀◌⃰◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING ASTERISK ABOVE, LATIN SMALL LETTER B
0061 20F0 0315 0300 05AE 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062;0061 05AE 20F0 0300 0315 0062; # (a◌⃰◌̕◌̀◌֮b; a◌֮◌⃰◌̀◌̕b; a◌֮◌⃰◌̀◌̕b; a◌֮◌⃰◌̀◌̕b; a◌֮◌⃰◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING ASTERISK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 2CEF 0062;00E0 05AE 2CEF 0315 0062;0061 05AE 0300 2CEF 0315 0062;00E0 05AE 2CEF 0315 0062;0061 05AE 0300 2CEF 0315 0062; # (a◌̕◌̀◌֮◌⳯b; à◌֮◌⳯◌̕b; a◌֮◌̀◌⳯◌̕b; à◌֮◌⳯◌̕b; a◌֮◌̀◌⳯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COPTIC COMBINING NI ABOVE, LATIN SMALL LETTER B
@@ -18171,8 +18298,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 2DFE 0315 0300 05AE 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062;0061 05AE 2DFE 0300 0315 0062; # (a◌ⷾ◌̕◌̀◌֮b; a◌֮◌ⷾ◌̀◌̕b; a◌֮◌ⷾ◌̀◌̕b; a◌֮◌ⷾ◌̀◌̕b; a◌֮◌ⷾ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 2DFF 0062;00E0 05AE 2DFF 0315 0062;0061 05AE 0300 2DFF 0315 0062;00E0 05AE 2DFF 0315 0062;0061 05AE 0300 2DFF 0315 0062; # (a◌̕◌̀◌֮◌ⷿb; à◌֮◌ⷿ◌̕b; a◌֮◌̀◌ⷿ◌̕b; à◌֮◌ⷿ◌̕b; a◌֮◌̀◌ⷿ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC LETTER IOTIFIED BIG YUS, LATIN SMALL LETTER B
0061 2DFF 0315 0300 05AE 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062;0061 05AE 2DFF 0300 0315 0062; # (a◌ⷿ◌̕◌̀◌֮b; a◌֮◌ⷿ◌̀◌̕b; a◌֮◌ⷿ◌̀◌̕b; a◌֮◌ⷿ◌̀◌̕b; a◌֮◌ⷿ◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC LETTER IOTIFIED BIG YUS, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 0316 302A 031B 302A 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062; # (a◌̖◌〪◌̛◌〪b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 302A 0316 302A 031B 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062;0061 031B 302A 302A 0316 0062; # (a◌〪◌̖◌〪◌̛b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; a◌̛◌〪◌〪◌̖b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, LATIN SMALL LETTER B
+0061 0316 1DFA 031B 302A 0062;0061 031B 1DFA 302A 0316 0062;0061 031B 1DFA 302A 0316 0062;0061 031B 1DFA 302A 0316 0062;0061 031B 1DFA 302A 0316 0062; # (a◌̖◌᷺◌̛◌〪b; a◌̛◌᷺◌〪◌̖b; a◌̛◌᷺◌〪◌̖b; a◌̛◌᷺◌〪◌̖b; a◌̛◌᷺◌〪◌̖b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 302A 0316 1DFA 031B 0062;0061 031B 302A 1DFA 0316 0062;0061 031B 302A 1DFA 0316 0062;0061 031B 302A 1DFA 0316 0062;0061 031B 302A 1DFA 0316 0062; # (a◌〪◌̖◌᷺◌̛b; a◌̛◌〪◌᷺◌̖b; a◌̛◌〪◌᷺◌̖b; a◌̛◌〪◌᷺◌̖b; a◌̛◌〪◌᷺◌̖b; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING HORN, LATIN SMALL LETTER B
0061 0300 05AE 1D16D 302B 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062;00E0 1D16D 05AE 302B 0062;0061 1D16D 05AE 302B 0300 0062; # (a◌̀◌֮ð…­â—Œã€«b; àð…­â—ŒÖ®â—Œã€«b; að…­â—ŒÖ®â—Œã€«â—ŒÌ€b; àð…­â—ŒÖ®â—Œã€«b; að…­â—ŒÖ®â—Œã€«â—ŒÌ€b; ) LATIN SMALL LETTER A, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, IDEOGRAPHIC RISING TONE MARK, LATIN SMALL LETTER B
0061 302B 0300 05AE 1D16D 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062;00E0 1D16D 302B 05AE 0062;0061 1D16D 302B 05AE 0300 0062; # (a◌〫◌̀◌֮ð…­b; àð…­â—Œã€«â—ŒÖ®b; að…­â—Œã€«â—ŒÖ®â—ŒÌ€b; àð…­â—Œã€«â—ŒÖ®b; að…­â—Œã€«â—ŒÖ®â—ŒÌ€b; ) LATIN SMALL LETTER A, IDEOGRAPHIC RISING TONE MARK, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B
0061 035C 0315 0300 302C 0062;00E0 0315 302C 035C 0062;0061 0300 0315 302C 035C 0062;00E0 0315 302C 035C 0062;0061 0300 0315 302C 035C 0062; # (a◌͜◌̕◌̀◌〬b; à◌̕◌〬◌͜b; a◌̀◌̕◌〬◌͜b; à◌̕◌〬◌͜b; a◌̀◌̕◌〬◌͜b; ) LATIN SMALL LETTER A, COMBINING DOUBLE BREVE BELOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, IDEOGRAPHIC DEPARTING TONE MARK, LATIN SMALL LETTER B
@@ -18259,12 +18386,12 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 A8F0 0315 0300 05AE 0062;0061 05AE A8F0 0300 0315 0062;0061 05AE A8F0 0300 0315 0062;0061 05AE A8F0 0300 0315 0062;0061 05AE A8F0 0300 0315 0062; # (a◌꣰◌̕◌̀◌֮b; a◌֮◌꣰◌̀◌̕b; a◌֮◌꣰◌̀◌̕b; a◌֮◌꣰◌̀◌̕b; a◌֮◌꣰◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI LETTER VI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE A8F1 0062;00E0 05AE A8F1 0315 0062;0061 05AE 0300 A8F1 0315 0062;00E0 05AE A8F1 0315 0062;0061 05AE 0300 A8F1 0315 0062; # (a◌̕◌̀◌֮◌꣱b; à◌֮◌꣱◌̕b; a◌֮◌̀◌꣱◌̕b; à◌֮◌꣱◌̕b; a◌֮◌̀◌꣱◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING DEVANAGARI SIGN AVAGRAHA, LATIN SMALL LETTER B
0061 A8F1 0315 0300 05AE 0062;0061 05AE A8F1 0300 0315 0062;0061 05AE A8F1 0300 0315 0062;0061 05AE A8F1 0300 0315 0062;0061 05AE A8F1 0300 0315 0062; # (a◌꣱◌̕◌̀◌֮b; a◌֮◌꣱◌̀◌̕b; a◌֮◌꣱◌̀◌̕b; a◌֮◌꣱◌̀◌̕b; a◌֮◌꣱◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING DEVANAGARI SIGN AVAGRAHA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A A92B 0062;0061 302A 0316 A92B 059A 0062;0061 302A 0316 A92B 059A 0062;0061 302A 0316 A92B 059A 0062;0061 302A 0316 A92B 059A 0062; # (a◌֚◌̖◌〪◌꤫b; a◌〪◌̖◌꤫◌֚b; a◌〪◌̖◌꤫◌֚b; a◌〪◌̖◌꤫◌֚b; a◌〪◌̖◌꤫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, KAYAH LI TONE PLOPHU, LATIN SMALL LETTER B
-0061 A92B 059A 0316 302A 0062;0061 302A A92B 0316 059A 0062;0061 302A A92B 0316 059A 0062;0061 302A A92B 0316 059A 0062;0061 302A A92B 0316 059A 0062; # (a◌꤫◌֚◌̖◌〪b; a◌〪◌꤫◌̖◌֚b; a◌〪◌꤫◌̖◌֚b; a◌〪◌꤫◌̖◌֚b; a◌〪◌꤫◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE PLOPHU, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A A92C 0062;0061 302A 0316 A92C 059A 0062;0061 302A 0316 A92C 059A 0062;0061 302A 0316 A92C 059A 0062;0061 302A 0316 A92C 059A 0062; # (a◌֚◌̖◌〪◌꤬b; a◌〪◌̖◌꤬◌֚b; a◌〪◌̖◌꤬◌֚b; a◌〪◌̖◌꤬◌֚b; a◌〪◌̖◌꤬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, KAYAH LI TONE CALYA, LATIN SMALL LETTER B
-0061 A92C 059A 0316 302A 0062;0061 302A A92C 0316 059A 0062;0061 302A A92C 0316 059A 0062;0061 302A A92C 0316 059A 0062;0061 302A A92C 0316 059A 0062; # (a◌꤬◌֚◌̖◌〪b; a◌〪◌꤬◌̖◌֚b; a◌〪◌꤬◌̖◌֚b; a◌〪◌꤬◌̖◌֚b; a◌〪◌꤬◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE CALYA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A A92D 0062;0061 302A 0316 A92D 059A 0062;0061 302A 0316 A92D 059A 0062;0061 302A 0316 A92D 059A 0062;0061 302A 0316 A92D 059A 0062; # (a◌֚◌̖◌〪◌꤭b; a◌〪◌̖◌꤭◌֚b; a◌〪◌̖◌꤭◌֚b; a◌〪◌̖◌꤭◌֚b; a◌〪◌̖◌꤭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, KAYAH LI TONE CALYA PLOPHU, LATIN SMALL LETTER B
-0061 A92D 059A 0316 302A 0062;0061 302A A92D 0316 059A 0062;0061 302A A92D 0316 059A 0062;0061 302A A92D 0316 059A 0062;0061 302A A92D 0316 059A 0062; # (a◌꤭◌֚◌̖◌〪b; a◌〪◌꤭◌̖◌֚b; a◌〪◌꤭◌̖◌֚b; a◌〪◌꤭◌̖◌֚b; a◌〪◌꤭◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE CALYA PLOPHU, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA A92B 0062;0061 1DFA 0316 A92B 059A 0062;0061 1DFA 0316 A92B 059A 0062;0061 1DFA 0316 A92B 059A 0062;0061 1DFA 0316 A92B 059A 0062; # (a◌֚◌̖◌᷺◌꤫b; a◌᷺◌̖◌꤫◌֚b; a◌᷺◌̖◌꤫◌֚b; a◌᷺◌̖◌꤫◌֚b; a◌᷺◌̖◌꤫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KAYAH LI TONE PLOPHU, LATIN SMALL LETTER B
+0061 A92B 059A 0316 1DFA 0062;0061 1DFA A92B 0316 059A 0062;0061 1DFA A92B 0316 059A 0062;0061 1DFA A92B 0316 059A 0062;0061 1DFA A92B 0316 059A 0062; # (a◌꤫◌֚◌̖◌᷺b; a◌᷺◌꤫◌̖◌֚b; a◌᷺◌꤫◌̖◌֚b; a◌᷺◌꤫◌̖◌֚b; a◌᷺◌꤫◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE PLOPHU, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA A92C 0062;0061 1DFA 0316 A92C 059A 0062;0061 1DFA 0316 A92C 059A 0062;0061 1DFA 0316 A92C 059A 0062;0061 1DFA 0316 A92C 059A 0062; # (a◌֚◌̖◌᷺◌꤬b; a◌᷺◌̖◌꤬◌֚b; a◌᷺◌̖◌꤬◌֚b; a◌᷺◌̖◌꤬◌֚b; a◌᷺◌̖◌꤬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KAYAH LI TONE CALYA, LATIN SMALL LETTER B
+0061 A92C 059A 0316 1DFA 0062;0061 1DFA A92C 0316 059A 0062;0061 1DFA A92C 0316 059A 0062;0061 1DFA A92C 0316 059A 0062;0061 1DFA A92C 0316 059A 0062; # (a◌꤬◌֚◌̖◌᷺b; a◌᷺◌꤬◌̖◌֚b; a◌᷺◌꤬◌̖◌֚b; a◌᷺◌꤬◌̖◌֚b; a◌᷺◌꤬◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE CALYA, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA A92D 0062;0061 1DFA 0316 A92D 059A 0062;0061 1DFA 0316 A92D 059A 0062;0061 1DFA 0316 A92D 059A 0062;0061 1DFA 0316 A92D 059A 0062; # (a◌֚◌̖◌᷺◌꤭b; a◌᷺◌̖◌꤭◌֚b; a◌᷺◌̖◌꤭◌֚b; a◌᷺◌̖◌꤭◌֚b; a◌᷺◌̖◌꤭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KAYAH LI TONE CALYA PLOPHU, LATIN SMALL LETTER B
+0061 A92D 059A 0316 1DFA 0062;0061 1DFA A92D 0316 059A 0062;0061 1DFA A92D 0316 059A 0062;0061 1DFA A92D 0316 059A 0062;0061 1DFA A92D 0316 059A 0062; # (a◌꤭◌֚◌̖◌᷺b; a◌᷺◌꤭◌̖◌֚b; a◌᷺◌꤭◌̖◌֚b; a◌᷺◌꤭◌̖◌֚b; a◌᷺◌꤭◌̖◌֚b; ) LATIN SMALL LETTER A, KAYAH LI TONE CALYA PLOPHU, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 05B0 094D 3099 A953 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062;0061 3099 094D A953 05B0 0062; # (a◌ְ◌à¥â—Œã‚™ê¥“b; a◌゙◌à¥ê¥“◌ְb; a◌゙◌à¥ê¥“◌ְb; a◌゙◌à¥ê¥“◌ְb; a◌゙◌à¥ê¥“◌ְb; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, REJANG VIRAMA, LATIN SMALL LETTER B
0061 A953 05B0 094D 3099 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062;0061 3099 A953 094D 05B0 0062; # (a꥓◌ְ◌à¥â—Œã‚™b; a◌゙꥓◌à¥â—ŒÖ°b; a◌゙꥓◌à¥â—ŒÖ°b; a◌゙꥓◌à¥â—ŒÖ°b; a◌゙꥓◌à¥â—ŒÖ°b; ) LATIN SMALL LETTER A, REJANG VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 3099 093C 16FF0 A9B3 0062;0061 16FF0 093C A9B3 3099 0062;0061 16FF0 093C A9B3 3099 0062;0061 16FF0 093C A9B3 3099 0062;0061 16FF0 093C A9B3 3099 0062; # (a◌゙◌𖿰़◌꦳b; a𖿰◌़◌꦳◌゙b; a𖿰◌़◌꦳◌゙b; a𖿰◌़◌꦳◌゙b; a𖿰◌़◌꦳◌゙b; ) LATIN SMALL LETTER A, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, JAVANESE SIGN CECAK TELU, LATIN SMALL LETTER B
@@ -18277,8 +18404,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 AAB2 0315 0300 05AE 0062;0061 05AE AAB2 0300 0315 0062;0061 05AE AAB2 0300 0315 0062;0061 05AE AAB2 0300 0315 0062;0061 05AE AAB2 0300 0315 0062; # (a◌ꪲ◌̕◌̀◌֮b; a◌֮◌ꪲ◌̀◌̕b; a◌֮◌ꪲ◌̀◌̕b; a◌֮◌ꪲ◌̀◌̕b; a◌֮◌ꪲ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET VOWEL I, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE AAB3 0062;00E0 05AE AAB3 0315 0062;0061 05AE 0300 AAB3 0315 0062;00E0 05AE AAB3 0315 0062;0061 05AE 0300 AAB3 0315 0062; # (a◌̕◌̀◌֮◌ꪳb; à◌֮◌ꪳ◌̕b; a◌֮◌̀◌ꪳ◌̕b; à◌֮◌ꪳ◌̕b; a◌֮◌̀◌ꪳ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET VOWEL UE, LATIN SMALL LETTER B
0061 AAB3 0315 0300 05AE 0062;0061 05AE AAB3 0300 0315 0062;0061 05AE AAB3 0300 0315 0062;0061 05AE AAB3 0300 0315 0062;0061 05AE AAB3 0300 0315 0062; # (a◌ꪳ◌̕◌̀◌֮b; a◌֮◌ꪳ◌̀◌̕b; a◌֮◌ꪳ◌̀◌̕b; a◌֮◌ꪳ◌̀◌̕b; a◌֮◌ꪳ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET VOWEL UE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A AAB4 0062;0061 302A 0316 AAB4 059A 0062;0061 302A 0316 AAB4 059A 0062;0061 302A 0316 AAB4 059A 0062;0061 302A 0316 AAB4 059A 0062; # (a◌֚◌̖◌〪◌ꪴb; a◌〪◌̖◌ꪴ◌֚b; a◌〪◌̖◌ꪴ◌֚b; a◌〪◌̖◌ꪴ◌֚b; a◌〪◌̖◌ꪴ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, TAI VIET VOWEL U, LATIN SMALL LETTER B
-0061 AAB4 059A 0316 302A 0062;0061 302A AAB4 0316 059A 0062;0061 302A AAB4 0316 059A 0062;0061 302A AAB4 0316 059A 0062;0061 302A AAB4 0316 059A 0062; # (a◌ꪴ◌֚◌̖◌〪b; a◌〪◌ꪴ◌̖◌֚b; a◌〪◌ꪴ◌̖◌֚b; a◌〪◌ꪴ◌̖◌֚b; a◌〪◌ꪴ◌̖◌֚b; ) LATIN SMALL LETTER A, TAI VIET VOWEL U, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA AAB4 0062;0061 1DFA 0316 AAB4 059A 0062;0061 1DFA 0316 AAB4 059A 0062;0061 1DFA 0316 AAB4 059A 0062;0061 1DFA 0316 AAB4 059A 0062; # (a◌֚◌̖◌᷺◌ꪴb; a◌᷺◌̖◌ꪴ◌֚b; a◌᷺◌̖◌ꪴ◌֚b; a◌᷺◌̖◌ꪴ◌֚b; a◌᷺◌̖◌ꪴ◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, TAI VIET VOWEL U, LATIN SMALL LETTER B
+0061 AAB4 059A 0316 1DFA 0062;0061 1DFA AAB4 0316 059A 0062;0061 1DFA AAB4 0316 059A 0062;0061 1DFA AAB4 0316 059A 0062;0061 1DFA AAB4 0316 059A 0062; # (a◌ꪴ◌֚◌̖◌᷺b; a◌᷺◌ꪴ◌̖◌֚b; a◌᷺◌ꪴ◌̖◌֚b; a◌᷺◌ꪴ◌̖◌֚b; a◌᷺◌ꪴ◌̖◌֚b; ) LATIN SMALL LETTER A, TAI VIET VOWEL U, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE AAB7 0062;00E0 05AE AAB7 0315 0062;0061 05AE 0300 AAB7 0315 0062;00E0 05AE AAB7 0315 0062;0061 05AE 0300 AAB7 0315 0062; # (a◌̕◌̀◌֮◌ꪷb; à◌֮◌ꪷ◌̕b; a◌֮◌̀◌ꪷ◌̕b; à◌֮◌ꪷ◌̕b; a◌֮◌̀◌ꪷ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET MAI KHIT, LATIN SMALL LETTER B
0061 AAB7 0315 0300 05AE 0062;0061 05AE AAB7 0300 0315 0062;0061 05AE AAB7 0300 0315 0062;0061 05AE AAB7 0300 0315 0062;0061 05AE AAB7 0300 0315 0062; # (a◌ꪷ◌̕◌̀◌֮b; a◌֮◌ꪷ◌̀◌̕b; a◌֮◌ꪷ◌̀◌̕b; a◌֮◌ꪷ◌̀◌̕b; a◌֮◌ꪷ◌̀◌̕b; ) LATIN SMALL LETTER A, TAI VIET MAI KHIT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE AAB8 0062;00E0 05AE AAB8 0315 0062;0061 05AE 0300 AAB8 0315 0062;00E0 05AE AAB8 0315 0062;0061 05AE 0300 AAB8 0315 0062; # (a◌̕◌̀◌֮◌ꪸb; à◌֮◌ꪸ◌̕b; a◌֮◌̀◌ꪸ◌̕b; à◌֮◌ꪸ◌̕b; a◌֮◌̀◌ꪸ◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TAI VIET VOWEL IA, LATIN SMALL LETTER B
@@ -18309,28 +18436,28 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 FE25 0315 0300 05AE 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062;0061 05AE FE25 0300 0315 0062; # (a◌︥◌̕◌̀◌֮b; a◌֮◌︥◌̀◌̕b; a◌֮◌︥◌̀◌̕b; a◌֮◌︥◌̀◌̕b; a◌֮◌︥◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING MACRON RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE FE26 0062;00E0 05AE FE26 0315 0062;0061 05AE 0300 FE26 0315 0062;00E0 05AE FE26 0315 0062;0061 05AE 0300 FE26 0315 0062; # (a◌̕◌̀◌֮◌︦b; à◌֮◌︦◌̕b; a◌֮◌̀◌︦◌̕b; à◌֮◌︦◌̕b; a◌֮◌̀◌︦◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CONJOINING MACRON, LATIN SMALL LETTER B
0061 FE26 0315 0300 05AE 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062;0061 05AE FE26 0300 0315 0062; # (a◌︦◌̕◌̀◌֮b; a◌֮◌︦◌̀◌̕b; a◌֮◌︦◌̀◌̕b; a◌֮◌︦◌̀◌̕b; a◌֮◌︦◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CONJOINING MACRON, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A FE27 0062;0061 302A 0316 FE27 059A 0062;0061 302A 0316 FE27 059A 0062;0061 302A 0316 FE27 059A 0062;0061 302A 0316 FE27 059A 0062; # (a◌֚◌̖◌〪◌︧b; a◌〪◌̖◌︧◌֚b; a◌〪◌̖◌︧◌֚b; a◌〪◌̖◌︧◌֚b; a◌〪◌̖◌︧◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LIGATURE LEFT HALF BELOW, LATIN SMALL LETTER B
-0061 FE27 059A 0316 302A 0062;0061 302A FE27 0316 059A 0062;0061 302A FE27 0316 059A 0062;0061 302A FE27 0316 059A 0062;0061 302A FE27 0316 059A 0062; # (a◌︧◌֚◌̖◌〪b; a◌〪◌︧◌̖◌֚b; a◌〪◌︧◌̖◌֚b; a◌〪◌︧◌̖◌֚b; a◌〪◌︧◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGATURE LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A FE28 0062;0061 302A 0316 FE28 059A 0062;0061 302A 0316 FE28 059A 0062;0061 302A 0316 FE28 059A 0062;0061 302A 0316 FE28 059A 0062; # (a◌֚◌̖◌〪◌︨b; a◌〪◌̖◌︨◌֚b; a◌〪◌̖◌︨◌֚b; a◌〪◌̖◌︨◌֚b; a◌〪◌̖◌︨◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING LIGATURE RIGHT HALF BELOW, LATIN SMALL LETTER B
-0061 FE28 059A 0316 302A 0062;0061 302A FE28 0316 059A 0062;0061 302A FE28 0316 059A 0062;0061 302A FE28 0316 059A 0062;0061 302A FE28 0316 059A 0062; # (a◌︨◌֚◌̖◌〪b; a◌〪◌︨◌̖◌֚b; a◌〪◌︨◌̖◌֚b; a◌〪◌︨◌̖◌֚b; a◌〪◌︨◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGATURE RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A FE29 0062;0061 302A 0316 FE29 059A 0062;0061 302A 0316 FE29 059A 0062;0061 302A 0316 FE29 059A 0062;0061 302A 0316 FE29 059A 0062; # (a◌֚◌̖◌〪◌︩b; a◌〪◌̖◌︩◌֚b; a◌〪◌̖◌︩◌֚b; a◌〪◌̖◌︩◌֚b; a◌〪◌̖◌︩◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING TILDE LEFT HALF BELOW, LATIN SMALL LETTER B
-0061 FE29 059A 0316 302A 0062;0061 302A FE29 0316 059A 0062;0061 302A FE29 0316 059A 0062;0061 302A FE29 0316 059A 0062;0061 302A FE29 0316 059A 0062; # (a◌︩◌֚◌̖◌〪b; a◌〪◌︩◌̖◌֚b; a◌〪◌︩◌̖◌֚b; a◌〪◌︩◌̖◌֚b; a◌〪◌︩◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A FE2A 0062;0061 302A 0316 FE2A 059A 0062;0061 302A 0316 FE2A 059A 0062;0061 302A 0316 FE2A 059A 0062;0061 302A 0316 FE2A 059A 0062; # (a◌֚◌̖◌〪◌︪b; a◌〪◌̖◌︪◌֚b; a◌〪◌̖◌︪◌֚b; a◌〪◌̖◌︪◌֚b; a◌〪◌̖◌︪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING TILDE RIGHT HALF BELOW, LATIN SMALL LETTER B
-0061 FE2A 059A 0316 302A 0062;0061 302A FE2A 0316 059A 0062;0061 302A FE2A 0316 059A 0062;0061 302A FE2A 0316 059A 0062;0061 302A FE2A 0316 059A 0062; # (a◌︪◌֚◌̖◌〪b; a◌〪◌︪◌̖◌֚b; a◌〪◌︪◌̖◌֚b; a◌〪◌︪◌̖◌֚b; a◌〪◌︪◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A FE2B 0062;0061 302A 0316 FE2B 059A 0062;0061 302A 0316 FE2B 059A 0062;0061 302A 0316 FE2B 059A 0062;0061 302A 0316 FE2B 059A 0062; # (a◌֚◌̖◌〪◌︫b; a◌〪◌̖◌︫◌֚b; a◌〪◌̖◌︫◌֚b; a◌〪◌̖◌︫◌֚b; a◌〪◌̖◌︫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING MACRON LEFT HALF BELOW, LATIN SMALL LETTER B
-0061 FE2B 059A 0316 302A 0062;0061 302A FE2B 0316 059A 0062;0061 302A FE2B 0316 059A 0062;0061 302A FE2B 0316 059A 0062;0061 302A FE2B 0316 059A 0062; # (a◌︫◌֚◌̖◌〪b; a◌〪◌︫◌̖◌֚b; a◌〪◌︫◌̖◌֚b; a◌〪◌︫◌̖◌֚b; a◌〪◌︫◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A FE2C 0062;0061 302A 0316 FE2C 059A 0062;0061 302A 0316 FE2C 059A 0062;0061 302A 0316 FE2C 059A 0062;0061 302A 0316 FE2C 059A 0062; # (a◌֚◌̖◌〪◌︬b; a◌〪◌̖◌︬◌֚b; a◌〪◌̖◌︬◌֚b; a◌〪◌̖◌︬◌֚b; a◌〪◌̖◌︬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING MACRON RIGHT HALF BELOW, LATIN SMALL LETTER B
-0061 FE2C 059A 0316 302A 0062;0061 302A FE2C 0316 059A 0062;0061 302A FE2C 0316 059A 0062;0061 302A FE2C 0316 059A 0062;0061 302A FE2C 0316 059A 0062; # (a◌︬◌֚◌̖◌〪b; a◌〪◌︬◌̖◌֚b; a◌〪◌︬◌̖◌֚b; a◌〪◌︬◌̖◌֚b; a◌〪◌︬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A FE2D 0062;0061 302A 0316 FE2D 059A 0062;0061 302A 0316 FE2D 059A 0062;0061 302A 0316 FE2D 059A 0062;0061 302A 0316 FE2D 059A 0062; # (a◌֚◌̖◌〪◌︭b; a◌〪◌̖◌︭◌֚b; a◌〪◌̖◌︭◌֚b; a◌〪◌̖◌︭◌֚b; a◌〪◌̖◌︭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COMBINING CONJOINING MACRON BELOW, LATIN SMALL LETTER B
-0061 FE2D 059A 0316 302A 0062;0061 302A FE2D 0316 059A 0062;0061 302A FE2D 0316 059A 0062;0061 302A FE2D 0316 059A 0062;0061 302A FE2D 0316 059A 0062; # (a◌︭◌֚◌̖◌〪b; a◌〪◌︭◌̖◌֚b; a◌〪◌︭◌̖◌֚b; a◌〪◌︭◌̖◌֚b; a◌〪◌︭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CONJOINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA FE27 0062;0061 1DFA 0316 FE27 059A 0062;0061 1DFA 0316 FE27 059A 0062;0061 1DFA 0316 FE27 059A 0062;0061 1DFA 0316 FE27 059A 0062; # (a◌֚◌̖◌᷺◌︧b; a◌᷺◌̖◌︧◌֚b; a◌᷺◌̖◌︧◌֚b; a◌᷺◌̖◌︧◌֚b; a◌᷺◌̖◌︧◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LIGATURE LEFT HALF BELOW, LATIN SMALL LETTER B
+0061 FE27 059A 0316 1DFA 0062;0061 1DFA FE27 0316 059A 0062;0061 1DFA FE27 0316 059A 0062;0061 1DFA FE27 0316 059A 0062;0061 1DFA FE27 0316 059A 0062; # (a◌︧◌֚◌̖◌᷺b; a◌᷺◌︧◌̖◌֚b; a◌᷺◌︧◌̖◌֚b; a◌᷺◌︧◌̖◌֚b; a◌᷺◌︧◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGATURE LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA FE28 0062;0061 1DFA 0316 FE28 059A 0062;0061 1DFA 0316 FE28 059A 0062;0061 1DFA 0316 FE28 059A 0062;0061 1DFA 0316 FE28 059A 0062; # (a◌֚◌̖◌᷺◌︨b; a◌᷺◌̖◌︨◌֚b; a◌᷺◌̖◌︨◌֚b; a◌᷺◌̖◌︨◌֚b; a◌᷺◌̖◌︨◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING LIGATURE RIGHT HALF BELOW, LATIN SMALL LETTER B
+0061 FE28 059A 0316 1DFA 0062;0061 1DFA FE28 0316 059A 0062;0061 1DFA FE28 0316 059A 0062;0061 1DFA FE28 0316 059A 0062;0061 1DFA FE28 0316 059A 0062; # (a◌︨◌֚◌̖◌᷺b; a◌᷺◌︨◌̖◌֚b; a◌᷺◌︨◌̖◌֚b; a◌᷺◌︨◌̖◌֚b; a◌᷺◌︨◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING LIGATURE RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA FE29 0062;0061 1DFA 0316 FE29 059A 0062;0061 1DFA 0316 FE29 059A 0062;0061 1DFA 0316 FE29 059A 0062;0061 1DFA 0316 FE29 059A 0062; # (a◌֚◌̖◌᷺◌︩b; a◌᷺◌̖◌︩◌֚b; a◌᷺◌̖◌︩◌֚b; a◌᷺◌̖◌︩◌֚b; a◌᷺◌̖◌︩◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TILDE LEFT HALF BELOW, LATIN SMALL LETTER B
+0061 FE29 059A 0316 1DFA 0062;0061 1DFA FE29 0316 059A 0062;0061 1DFA FE29 0316 059A 0062;0061 1DFA FE29 0316 059A 0062;0061 1DFA FE29 0316 059A 0062; # (a◌︩◌֚◌̖◌᷺b; a◌᷺◌︩◌̖◌֚b; a◌᷺◌︩◌̖◌֚b; a◌᷺◌︩◌̖◌֚b; a◌᷺◌︩◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA FE2A 0062;0061 1DFA 0316 FE2A 059A 0062;0061 1DFA 0316 FE2A 059A 0062;0061 1DFA 0316 FE2A 059A 0062;0061 1DFA 0316 FE2A 059A 0062; # (a◌֚◌̖◌᷺◌︪b; a◌᷺◌̖◌︪◌֚b; a◌᷺◌̖◌︪◌֚b; a◌᷺◌̖◌︪◌֚b; a◌᷺◌̖◌︪◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING TILDE RIGHT HALF BELOW, LATIN SMALL LETTER B
+0061 FE2A 059A 0316 1DFA 0062;0061 1DFA FE2A 0316 059A 0062;0061 1DFA FE2A 0316 059A 0062;0061 1DFA FE2A 0316 059A 0062;0061 1DFA FE2A 0316 059A 0062; # (a◌︪◌֚◌̖◌᷺b; a◌᷺◌︪◌̖◌֚b; a◌᷺◌︪◌̖◌֚b; a◌᷺◌︪◌̖◌֚b; a◌᷺◌︪◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING TILDE RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA FE2B 0062;0061 1DFA 0316 FE2B 059A 0062;0061 1DFA 0316 FE2B 059A 0062;0061 1DFA 0316 FE2B 059A 0062;0061 1DFA 0316 FE2B 059A 0062; # (a◌֚◌̖◌᷺◌︫b; a◌᷺◌̖◌︫◌֚b; a◌᷺◌̖◌︫◌֚b; a◌᷺◌̖◌︫◌֚b; a◌᷺◌̖◌︫◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MACRON LEFT HALF BELOW, LATIN SMALL LETTER B
+0061 FE2B 059A 0316 1DFA 0062;0061 1DFA FE2B 0316 059A 0062;0061 1DFA FE2B 0316 059A 0062;0061 1DFA FE2B 0316 059A 0062;0061 1DFA FE2B 0316 059A 0062; # (a◌︫◌֚◌̖◌᷺b; a◌᷺◌︫◌̖◌֚b; a◌᷺◌︫◌̖◌֚b; a◌᷺◌︫◌̖◌֚b; a◌᷺◌︫◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON LEFT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA FE2C 0062;0061 1DFA 0316 FE2C 059A 0062;0061 1DFA 0316 FE2C 059A 0062;0061 1DFA 0316 FE2C 059A 0062;0061 1DFA 0316 FE2C 059A 0062; # (a◌֚◌̖◌᷺◌︬b; a◌᷺◌̖◌︬◌֚b; a◌᷺◌̖◌︬◌֚b; a◌᷺◌̖◌︬◌֚b; a◌᷺◌̖◌︬◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING MACRON RIGHT HALF BELOW, LATIN SMALL LETTER B
+0061 FE2C 059A 0316 1DFA 0062;0061 1DFA FE2C 0316 059A 0062;0061 1DFA FE2C 0316 059A 0062;0061 1DFA FE2C 0316 059A 0062;0061 1DFA FE2C 0316 059A 0062; # (a◌︬◌֚◌̖◌᷺b; a◌᷺◌︬◌̖◌֚b; a◌᷺◌︬◌̖◌֚b; a◌᷺◌︬◌̖◌֚b; a◌᷺◌︬◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING MACRON RIGHT HALF BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA FE2D 0062;0061 1DFA 0316 FE2D 059A 0062;0061 1DFA 0316 FE2D 059A 0062;0061 1DFA 0316 FE2D 059A 0062;0061 1DFA 0316 FE2D 059A 0062; # (a◌֚◌̖◌᷺◌︭b; a◌᷺◌̖◌︭◌֚b; a◌᷺◌̖◌︭◌֚b; a◌᷺◌̖◌︭◌֚b; a◌᷺◌̖◌︭◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COMBINING CONJOINING MACRON BELOW, LATIN SMALL LETTER B
+0061 FE2D 059A 0316 1DFA 0062;0061 1DFA FE2D 0316 059A 0062;0061 1DFA FE2D 0316 059A 0062;0061 1DFA FE2D 0316 059A 0062;0061 1DFA FE2D 0316 059A 0062; # (a◌︭◌֚◌̖◌᷺b; a◌᷺◌︭◌̖◌֚b; a◌᷺◌︭◌̖◌֚b; a◌᷺◌︭◌̖◌֚b; a◌᷺◌︭◌̖◌֚b; ) LATIN SMALL LETTER A, COMBINING CONJOINING MACRON BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE FE2E 0062;00E0 05AE FE2E 0315 0062;0061 05AE 0300 FE2E 0315 0062;00E0 05AE FE2E 0315 0062;0061 05AE 0300 FE2E 0315 0062; # (a◌̕◌̀◌֮◌︮b; à◌֮◌︮◌̕b; a◌֮◌̀◌︮◌̕b; à◌֮◌︮◌̕b; a◌֮◌̀◌︮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO LEFT HALF, LATIN SMALL LETTER B
0061 FE2E 0315 0300 05AE 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062;0061 05AE FE2E 0300 0315 0062; # (a◌︮◌̕◌̀◌֮b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; a◌֮◌︮◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO LEFT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE FE2F 0062;00E0 05AE FE2F 0315 0062;0061 05AE 0300 FE2F 0315 0062;00E0 05AE FE2F 0315 0062;0061 05AE 0300 FE2F 0315 0062; # (a◌̕◌̀◌֮◌︯b; à◌֮◌︯◌̕b; a◌֮◌̀◌︯◌̕b; à◌֮◌︯◌̕b; a◌֮◌̀◌︯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING CYRILLIC TITLO RIGHT HALF, LATIN SMALL LETTER B
0061 FE2F 0315 0300 05AE 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062;0061 05AE FE2F 0300 0315 0062; # (a◌︯◌̕◌̀◌֮b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; a◌֮◌︯◌̀◌̕b; ) LATIN SMALL LETTER A, COMBINING CYRILLIC TITLO RIGHT HALF, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 101FD 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062;0061 302A 0316 101FD 059A 0062; # (a◌֚◌̖◌〪◌ð‡½b; a◌〪◌̖◌ð‡½â—ŒÖšb; a◌〪◌̖◌ð‡½â—ŒÖšb; a◌〪◌̖◌ð‡½â—ŒÖšb; a◌〪◌̖◌ð‡½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, LATIN SMALL LETTER B
-0061 101FD 059A 0316 302A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062;0061 302A 101FD 0316 059A 0062; # (aâ—Œð‡½â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð‡½â—ŒÌ–◌֚b; a◌〪◌ð‡½â—ŒÌ–◌֚b; a◌〪◌ð‡½â—ŒÌ–◌֚b; a◌〪◌ð‡½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 102E0 0062;0061 302A 0316 102E0 059A 0062;0061 302A 0316 102E0 059A 0062;0061 302A 0316 102E0 059A 0062;0061 302A 0316 102E0 059A 0062; # (a◌֚◌̖◌〪◌ð‹ b; a◌〪◌̖◌ð‹ â—ŒÖšb; a◌〪◌̖◌ð‹ â—ŒÖšb; a◌〪◌̖◌ð‹ â—ŒÖšb; a◌〪◌̖◌ð‹ â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, COPTIC EPACT THOUSANDS MARK, LATIN SMALL LETTER B
-0061 102E0 059A 0316 302A 0062;0061 302A 102E0 0316 059A 0062;0061 302A 102E0 0316 059A 0062;0061 302A 102E0 0316 059A 0062;0061 302A 102E0 0316 059A 0062; # (aâ—Œð‹ â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð‹ â—ŒÌ–◌֚b; a◌〪◌ð‹ â—ŒÌ–◌֚b; a◌〪◌ð‹ â—ŒÌ–◌֚b; a◌〪◌ð‹ â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, COPTIC EPACT THOUSANDS MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 101FD 0062;0061 1DFA 0316 101FD 059A 0062;0061 1DFA 0316 101FD 059A 0062;0061 1DFA 0316 101FD 059A 0062;0061 1DFA 0316 101FD 059A 0062; # (a◌֚◌̖◌᷺◌ð‡½b; a◌᷺◌̖◌ð‡½â—ŒÖšb; a◌᷺◌̖◌ð‡½â—ŒÖšb; a◌᷺◌̖◌ð‡½â—ŒÖšb; a◌᷺◌̖◌ð‡½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, LATIN SMALL LETTER B
+0061 101FD 059A 0316 1DFA 0062;0061 1DFA 101FD 0316 059A 0062;0061 1DFA 101FD 0316 059A 0062;0061 1DFA 101FD 0316 059A 0062;0061 1DFA 101FD 0316 059A 0062; # (aâ—Œð‡½â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð‡½â—ŒÌ–◌֚b; a◌᷺◌ð‡½â—ŒÌ–◌֚b; a◌᷺◌ð‡½â—ŒÌ–◌֚b; a◌᷺◌ð‡½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 102E0 0062;0061 1DFA 0316 102E0 059A 0062;0061 1DFA 0316 102E0 059A 0062;0061 1DFA 0316 102E0 059A 0062;0061 1DFA 0316 102E0 059A 0062; # (a◌֚◌̖◌᷺◌ð‹ b; a◌᷺◌̖◌ð‹ â—ŒÖšb; a◌᷺◌̖◌ð‹ â—ŒÖšb; a◌᷺◌̖◌ð‹ â—ŒÖšb; a◌᷺◌̖◌ð‹ â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, COPTIC EPACT THOUSANDS MARK, LATIN SMALL LETTER B
+0061 102E0 059A 0316 1DFA 0062;0061 1DFA 102E0 0316 059A 0062;0061 1DFA 102E0 0316 059A 0062;0061 1DFA 102E0 0316 059A 0062;0061 1DFA 102E0 0316 059A 0062; # (aâ—Œð‹ â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð‹ â—ŒÌ–◌֚b; a◌᷺◌ð‹ â—ŒÌ–◌֚b; a◌᷺◌ð‹ â—ŒÌ–◌֚b; a◌᷺◌ð‹ â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, COPTIC EPACT THOUSANDS MARK, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 10376 0062;00E0 05AE 10376 0315 0062;0061 05AE 0300 10376 0315 0062;00E0 05AE 10376 0315 0062;0061 05AE 0300 10376 0315 0062; # (a◌̕◌̀◌֮◌ð¶b; à◌֮◌ð¶â—ŒÌ•b; a◌֮◌̀◌ð¶â—ŒÌ•b; à◌֮◌ð¶â—ŒÌ•b; a◌֮◌̀◌ð¶â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER AN, LATIN SMALL LETTER B
0061 10376 0315 0300 05AE 0062;0061 05AE 10376 0300 0315 0062;0061 05AE 10376 0300 0315 0062;0061 05AE 10376 0300 0315 0062;0061 05AE 10376 0300 0315 0062; # (aâ—Œð¶â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð¶â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¶â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¶â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¶â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER AN, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 10377 0062;00E0 05AE 10377 0315 0062;0061 05AE 0300 10377 0315 0062;00E0 05AE 10377 0315 0062;0061 05AE 0300 10377 0315 0062; # (a◌̕◌̀◌֮◌ð·b; à◌֮◌ð·â—ŒÌ•b; a◌֮◌̀◌ð·â—ŒÌ•b; à◌֮◌ð·â—ŒÌ•b; a◌֮◌̀◌ð·â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER DOI, LATIN SMALL LETTER B
@@ -18341,22 +18468,22 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 10379 0315 0300 05AE 0062;0061 05AE 10379 0300 0315 0062;0061 05AE 10379 0300 0315 0062;0061 05AE 10379 0300 0315 0062;0061 05AE 10379 0300 0315 0062; # (aâ—Œð¹â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð¹â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¹â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¹â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¹â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER NENOE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1037A 0062;00E0 05AE 1037A 0315 0062;0061 05AE 0300 1037A 0315 0062;00E0 05AE 1037A 0315 0062;0061 05AE 0300 1037A 0315 0062; # (a◌̕◌̀◌֮◌ðºb; à◌֮◌ðºâ—ŒÌ•b; a◌֮◌̀◌ðºâ—ŒÌ•b; à◌֮◌ðºâ—ŒÌ•b; a◌֮◌̀◌ðºâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, COMBINING OLD PERMIC LETTER SII, LATIN SMALL LETTER B
0061 1037A 0315 0300 05AE 0062;0061 05AE 1037A 0300 0315 0062;0061 05AE 1037A 0300 0315 0062;0061 05AE 1037A 0300 0315 0062;0061 05AE 1037A 0300 0315 0062; # (aâ—Œðºâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ðºâ—ŒÌ€â—ŒÌ•b; a◌֮◌ðºâ—ŒÌ€â—ŒÌ•b; a◌֮◌ðºâ—ŒÌ€â—ŒÌ•b; a◌֮◌ðºâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING OLD PERMIC LETTER SII, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 10A0D 0062;0061 302A 0316 10A0D 059A 0062;0061 302A 0316 10A0D 059A 0062;0061 302A 0316 10A0D 059A 0062;0061 302A 0316 10A0D 059A 0062; # (a◌֚◌̖◌〪◌ð¨b; a◌〪◌̖◌ð¨â—ŒÖšb; a◌〪◌̖◌ð¨â—ŒÖšb; a◌〪◌̖◌ð¨â—ŒÖšb; a◌〪◌̖◌ð¨â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, KHAROSHTHI SIGN DOUBLE RING BELOW, LATIN SMALL LETTER B
-0061 10A0D 059A 0316 302A 0062;0061 302A 10A0D 0316 059A 0062;0061 302A 10A0D 0316 059A 0062;0061 302A 10A0D 0316 059A 0062;0061 302A 10A0D 0316 059A 0062; # (aâ—Œð¨â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð¨â—ŒÌ–◌֚b; a◌〪◌ð¨â—ŒÌ–◌֚b; a◌〪◌ð¨â—ŒÌ–◌֚b; a◌〪◌ð¨â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN DOUBLE RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10A0D 0062;0061 1DFA 0316 10A0D 059A 0062;0061 1DFA 0316 10A0D 059A 0062;0061 1DFA 0316 10A0D 059A 0062;0061 1DFA 0316 10A0D 059A 0062; # (a◌֚◌̖◌᷺◌ð¨b; a◌᷺◌̖◌ð¨â—ŒÖšb; a◌᷺◌̖◌ð¨â—ŒÖšb; a◌᷺◌̖◌ð¨â—ŒÖšb; a◌᷺◌̖◌ð¨â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KHAROSHTHI SIGN DOUBLE RING BELOW, LATIN SMALL LETTER B
+0061 10A0D 059A 0316 1DFA 0062;0061 1DFA 10A0D 0316 059A 0062;0061 1DFA 10A0D 0316 059A 0062;0061 1DFA 10A0D 0316 059A 0062;0061 1DFA 10A0D 0316 059A 0062; # (aâ—Œð¨â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð¨â—ŒÌ–◌֚b; a◌᷺◌ð¨â—ŒÌ–◌֚b; a◌᷺◌ð¨â—ŒÌ–◌֚b; a◌᷺◌ð¨â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN DOUBLE RING BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 10A0F 0062;00E0 05AE 10A0F 0315 0062;0061 05AE 0300 10A0F 0315 0062;00E0 05AE 10A0F 0315 0062;0061 05AE 0300 10A0F 0315 0062; # (a◌̕◌̀◌֮◌ð¨b; à◌֮◌ð¨â—ŒÌ•b; a◌֮◌̀◌ð¨â—ŒÌ•b; à◌֮◌ð¨â—ŒÌ•b; a◌֮◌̀◌ð¨â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, KHAROSHTHI SIGN VISARGA, LATIN SMALL LETTER B
0061 10A0F 0315 0300 05AE 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062;0061 05AE 10A0F 0300 0315 0062; # (aâ—Œð¨â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð¨â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¨â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¨â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¨â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN VISARGA, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 10A38 0062;00E0 05AE 10A38 0315 0062;0061 05AE 0300 10A38 0315 0062;00E0 05AE 10A38 0315 0062;0061 05AE 0300 10A38 0315 0062; # (a◌̕◌̀◌֮◌ð¨¸b; à◌֮◌ð¨¸â—ŒÌ•b; a◌֮◌̀◌ð¨¸â—ŒÌ•b; à◌֮◌ð¨¸â—ŒÌ•b; a◌֮◌̀◌ð¨¸â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, KHAROSHTHI SIGN BAR ABOVE, LATIN SMALL LETTER B
0061 10A38 0315 0300 05AE 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062;0061 05AE 10A38 0300 0315 0062; # (aâ—Œð¨¸â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð¨¸â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¨¸â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¨¸â—ŒÌ€â—ŒÌ•b; a◌֮◌ð¨¸â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN BAR ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 16FF0 0334 10A39 0062;0061 0334 10A39 16FF0 0062;0061 0334 10A39 16FF0 0062;0061 0334 10A39 16FF0 0062;0061 0334 10A39 16FF0 0062; # (a𖿰◌̴◌ð¨¹b; a◌̴◌ð¨¹ð–¿°b; a◌̴◌ð¨¹ð–¿°b; a◌̴◌ð¨¹ð–¿°b; a◌̴◌ð¨¹ð–¿°b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, KHAROSHTHI SIGN CAUDA, LATIN SMALL LETTER B
0061 10A39 16FF0 0334 0062;0061 10A39 0334 16FF0 0062;0061 10A39 0334 16FF0 0062;0061 10A39 0334 16FF0 0062;0061 10A39 0334 16FF0 0062; # (aâ—Œð¨¹ð–¿°â—ŒÌ´b; aâ—Œð¨¹â—ŒÌ´ð–¿°b; aâ—Œð¨¹â—ŒÌ´ð–¿°b; aâ—Œð¨¹â—ŒÌ´ð–¿°b; aâ—Œð¨¹â—ŒÌ´ð–¿°b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN CAUDA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
-0061 059A 0316 302A 10A3A 0062;0061 302A 0316 10A3A 059A 0062;0061 302A 0316 10A3A 059A 0062;0061 302A 0316 10A3A 059A 0062;0061 302A 0316 10A3A 059A 0062; # (a◌֚◌̖◌〪◌ð¨ºb; a◌〪◌̖◌ð¨ºâ—ŒÖšb; a◌〪◌̖◌ð¨ºâ—ŒÖšb; a◌〪◌̖◌ð¨ºâ—ŒÖšb; a◌〪◌̖◌ð¨ºâ—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, KHAROSHTHI SIGN DOT BELOW, LATIN SMALL LETTER B
-0061 10A3A 059A 0316 302A 0062;0061 302A 10A3A 0316 059A 0062;0061 302A 10A3A 0316 059A 0062;0061 302A 10A3A 0316 059A 0062;0061 302A 10A3A 0316 059A 0062; # (aâ—Œð¨ºâ—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð¨ºâ—ŒÌ–◌֚b; a◌〪◌ð¨ºâ—ŒÌ–◌֚b; a◌〪◌ð¨ºâ—ŒÌ–◌֚b; a◌〪◌ð¨ºâ—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10A3A 0062;0061 1DFA 0316 10A3A 059A 0062;0061 1DFA 0316 10A3A 059A 0062;0061 1DFA 0316 10A3A 059A 0062;0061 1DFA 0316 10A3A 059A 0062; # (a◌֚◌̖◌᷺◌ð¨ºb; a◌᷺◌̖◌ð¨ºâ—ŒÖšb; a◌᷺◌̖◌ð¨ºâ—ŒÖšb; a◌᷺◌̖◌ð¨ºâ—ŒÖšb; a◌᷺◌̖◌ð¨ºâ—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, KHAROSHTHI SIGN DOT BELOW, LATIN SMALL LETTER B
+0061 10A3A 059A 0316 1DFA 0062;0061 1DFA 10A3A 0316 059A 0062;0061 1DFA 10A3A 0316 059A 0062;0061 1DFA 10A3A 0316 059A 0062;0061 1DFA 10A3A 0316 059A 0062; # (aâ—Œð¨ºâ—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð¨ºâ—ŒÌ–◌֚b; a◌᷺◌ð¨ºâ—ŒÌ–◌֚b; a◌᷺◌ð¨ºâ—ŒÌ–◌֚b; a◌᷺◌ð¨ºâ—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, KHAROSHTHI SIGN DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 05B0 094D 3099 10A3F 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062;0061 3099 094D 10A3F 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œð¨¿b; a◌゙◌à¥â—Œð¨¿â—ŒÖ°b; a◌゙◌à¥â—Œð¨¿â—ŒÖ°b; a◌゙◌à¥â—Œð¨¿â—ŒÖ°b; a◌゙◌à¥â—Œð¨¿â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KHAROSHTHI VIRAMA, LATIN SMALL LETTER B
0061 10A3F 05B0 094D 3099 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062;0061 3099 10A3F 094D 05B0 0062; # (aâ—Œð¨¿â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌ð¨¿â—Œà¥â—ŒÖ°b; a◌゙◌ð¨¿â—Œà¥â—ŒÖ°b; a◌゙◌ð¨¿â—Œà¥â—ŒÖ°b; a◌゙◌ð¨¿â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, KHAROSHTHI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 0315 0300 05AE 10AE5 0062;00E0 05AE 10AE5 0315 0062;0061 05AE 0300 10AE5 0315 0062;00E0 05AE 10AE5 0315 0062;0061 05AE 0300 10AE5 0315 0062; # (a◌̕◌̀◌֮◌ð«¥b; à◌֮◌ð«¥â—ŒÌ•b; a◌֮◌̀◌ð«¥â—ŒÌ•b; à◌֮◌ð«¥â—ŒÌ•b; a◌֮◌̀◌ð«¥â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MANICHAEAN ABBREVIATION MARK ABOVE, LATIN SMALL LETTER B
0061 10AE5 0315 0300 05AE 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062;0061 05AE 10AE5 0300 0315 0062; # (aâ—Œð«¥â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð«¥â—ŒÌ€â—ŒÌ•b; a◌֮◌ð«¥â—ŒÌ€â—ŒÌ•b; a◌֮◌ð«¥â—ŒÌ€â—ŒÌ•b; a◌֮◌ð«¥â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, MANICHAEAN ABBREVIATION MARK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 10AE6 0062;0061 302A 0316 10AE6 059A 0062;0061 302A 0316 10AE6 059A 0062;0061 302A 0316 10AE6 059A 0062;0061 302A 0316 10AE6 059A 0062; # (a◌֚◌̖◌〪◌ð«¦b; a◌〪◌̖◌ð«¦â—ŒÖšb; a◌〪◌̖◌ð«¦â—ŒÖšb; a◌〪◌̖◌ð«¦â—ŒÖšb; a◌〪◌̖◌ð«¦â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MANICHAEAN ABBREVIATION MARK BELOW, LATIN SMALL LETTER B
-0061 10AE6 059A 0316 302A 0062;0061 302A 10AE6 0316 059A 0062;0061 302A 10AE6 0316 059A 0062;0061 302A 10AE6 0316 059A 0062;0061 302A 10AE6 0316 059A 0062; # (aâ—Œð«¦â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð«¦â—ŒÌ–◌֚b; a◌〪◌ð«¦â—ŒÌ–◌֚b; a◌〪◌ð«¦â—ŒÌ–◌֚b; a◌〪◌ð«¦â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MANICHAEAN ABBREVIATION MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10AE6 0062;0061 1DFA 0316 10AE6 059A 0062;0061 1DFA 0316 10AE6 059A 0062;0061 1DFA 0316 10AE6 059A 0062;0061 1DFA 0316 10AE6 059A 0062; # (a◌֚◌̖◌᷺◌ð«¦b; a◌᷺◌̖◌ð«¦â—ŒÖšb; a◌᷺◌̖◌ð«¦â—ŒÖšb; a◌᷺◌̖◌ð«¦â—ŒÖšb; a◌᷺◌̖◌ð«¦â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MANICHAEAN ABBREVIATION MARK BELOW, LATIN SMALL LETTER B
+0061 10AE6 059A 0316 1DFA 0062;0061 1DFA 10AE6 0316 059A 0062;0061 1DFA 10AE6 0316 059A 0062;0061 1DFA 10AE6 0316 059A 0062;0061 1DFA 10AE6 0316 059A 0062; # (aâ—Œð«¦â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð«¦â—ŒÌ–◌֚b; a◌᷺◌ð«¦â—ŒÌ–◌֚b; a◌᷺◌ð«¦â—ŒÌ–◌֚b; a◌᷺◌ð«¦â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MANICHAEAN ABBREVIATION MARK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 10D24 0062;00E0 05AE 10D24 0315 0062;0061 05AE 0300 10D24 0315 0062;00E0 05AE 10D24 0315 0062;0061 05AE 0300 10D24 0315 0062; # (a◌̕◌̀◌֮◌ð´¤b; à◌֮◌ð´¤â—ŒÌ•b; a◌֮◌̀◌ð´¤â—ŒÌ•b; à◌֮◌ð´¤â—ŒÌ•b; a◌֮◌̀◌ð´¤â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN HARBAHAY, LATIN SMALL LETTER B
0061 10D24 0315 0300 05AE 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062;0061 05AE 10D24 0300 0315 0062; # (aâ—Œð´¤â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð´¤â—ŒÌ€â—ŒÌ•b; a◌֮◌ð´¤â—ŒÌ€â—ŒÌ•b; a◌֮◌ð´¤â—ŒÌ€â—ŒÌ•b; a◌֮◌ð´¤â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, HANIFI ROHINGYA SIGN HARBAHAY, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 10D25 0062;00E0 05AE 10D25 0315 0062;0061 05AE 0300 10D25 0315 0062;00E0 05AE 10D25 0315 0062;0061 05AE 0300 10D25 0315 0062; # (a◌̕◌̀◌֮◌ð´¥b; à◌֮◌ð´¥â—ŒÌ•b; a◌֮◌̀◌ð´¥â—ŒÌ•b; à◌֮◌ð´¥â—ŒÌ•b; a◌֮◌̀◌ð´¥â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, HANIFI ROHINGYA SIGN TAHALA, LATIN SMALL LETTER B
@@ -18369,30 +18496,40 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 10EAB 0315 0300 05AE 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062;0061 05AE 10EAB 0300 0315 0062; # (aâ—Œðº«â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ðº«â—ŒÌ€â—ŒÌ•b; a◌֮◌ðº«â—ŒÌ€â—ŒÌ•b; a◌֮◌ðº«â—ŒÌ€â—ŒÌ•b; a◌֮◌ðº«â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, YEZIDI COMBINING HAMZA MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 10EAC 0062;00E0 05AE 10EAC 0315 0062;0061 05AE 0300 10EAC 0315 0062;00E0 05AE 10EAC 0315 0062;0061 05AE 0300 10EAC 0315 0062; # (a◌̕◌̀◌֮◌ðº¬b; à◌֮◌ðº¬â—ŒÌ•b; a◌֮◌̀◌ðº¬â—ŒÌ•b; à◌֮◌ðº¬â—ŒÌ•b; a◌֮◌̀◌ðº¬â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, YEZIDI COMBINING MADDA MARK, LATIN SMALL LETTER B
0061 10EAC 0315 0300 05AE 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062;0061 05AE 10EAC 0300 0315 0062; # (aâ—Œðº¬â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ðº¬â—ŒÌ€â—ŒÌ•b; a◌֮◌ðº¬â—ŒÌ€â—ŒÌ•b; a◌֮◌ðº¬â—ŒÌ€â—ŒÌ•b; a◌֮◌ðº¬â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, YEZIDI COMBINING MADDA MARK, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 10F46 0062;0061 302A 0316 10F46 059A 0062;0061 302A 0316 10F46 059A 0062;0061 302A 0316 10F46 059A 0062;0061 302A 0316 10F46 059A 0062; # (a◌֚◌̖◌〪◌ð½†b; a◌〪◌̖◌ð½†â—ŒÖšb; a◌〪◌̖◌ð½†â—ŒÖšb; a◌〪◌̖◌ð½†â—ŒÖšb; a◌〪◌̖◌ð½†â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING DOT BELOW, LATIN SMALL LETTER B
-0061 10F46 059A 0316 302A 0062;0061 302A 10F46 0316 059A 0062;0061 302A 10F46 0316 059A 0062;0061 302A 10F46 0316 059A 0062;0061 302A 10F46 0316 059A 0062; # (aâ—Œð½†â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð½†â—ŒÌ–◌֚b; a◌〪◌ð½†â—ŒÌ–◌֚b; a◌〪◌ð½†â—ŒÌ–◌֚b; a◌〪◌ð½†â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 10F47 0062;0061 302A 0316 10F47 059A 0062;0061 302A 0316 10F47 059A 0062;0061 302A 0316 10F47 059A 0062;0061 302A 0316 10F47 059A 0062; # (a◌֚◌̖◌〪◌ð½‡b; a◌〪◌̖◌ð½‡â—ŒÖšb; a◌〪◌̖◌ð½‡â—ŒÖšb; a◌〪◌̖◌ð½‡â—ŒÖšb; a◌〪◌̖◌ð½‡â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING TWO DOTS BELOW, LATIN SMALL LETTER B
-0061 10F47 059A 0316 302A 0062;0061 302A 10F47 0316 059A 0062;0061 302A 10F47 0316 059A 0062;0061 302A 10F47 0316 059A 0062;0061 302A 10F47 0316 059A 0062; # (aâ—Œð½‡â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð½‡â—ŒÌ–◌֚b; a◌〪◌ð½‡â—ŒÌ–◌֚b; a◌〪◌ð½‡â—ŒÌ–◌֚b; a◌〪◌ð½‡â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F46 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062;0061 1DFA 0316 10F46 059A 0062; # (a◌֚◌̖◌᷺◌ð½†b; a◌᷺◌̖◌ð½†â—ŒÖšb; a◌᷺◌̖◌ð½†â—ŒÖšb; a◌᷺◌̖◌ð½†â—ŒÖšb; a◌᷺◌̖◌ð½†â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING DOT BELOW, LATIN SMALL LETTER B
+0061 10F46 059A 0316 1DFA 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062;0061 1DFA 10F46 0316 059A 0062; # (aâ—Œð½†â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð½†â—ŒÌ–◌֚b; a◌᷺◌ð½†â—ŒÌ–◌֚b; a◌᷺◌ð½†â—ŒÌ–◌֚b; a◌᷺◌ð½†â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F47 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062;0061 1DFA 0316 10F47 059A 0062; # (a◌֚◌̖◌᷺◌ð½‡b; a◌᷺◌̖◌ð½‡â—ŒÖšb; a◌᷺◌̖◌ð½‡â—ŒÖšb; a◌᷺◌̖◌ð½‡â—ŒÖšb; a◌᷺◌̖◌ð½‡â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING TWO DOTS BELOW, LATIN SMALL LETTER B
+0061 10F47 059A 0316 1DFA 0062;0061 1DFA 10F47 0316 059A 0062;0061 1DFA 10F47 0316 059A 0062;0061 1DFA 10F47 0316 059A 0062;0061 1DFA 10F47 0316 059A 0062; # (aâ—Œð½‡â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð½‡â—ŒÌ–◌֚b; a◌᷺◌ð½‡â—ŒÌ–◌֚b; a◌᷺◌ð½‡â—ŒÌ–◌֚b; a◌᷺◌ð½‡â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 10F48 0062;00E0 05AE 10F48 0315 0062;0061 05AE 0300 10F48 0315 0062;00E0 05AE 10F48 0315 0062;0061 05AE 0300 10F48 0315 0062; # (a◌̕◌̀◌֮◌ð½ˆb; à◌֮◌ð½ˆâ—ŒÌ•b; a◌֮◌̀◌ð½ˆâ—ŒÌ•b; à◌֮◌ð½ˆâ—ŒÌ•b; a◌֮◌̀◌ð½ˆâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING DOT ABOVE, LATIN SMALL LETTER B
0061 10F48 0315 0300 05AE 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062;0061 05AE 10F48 0300 0315 0062; # (aâ—Œð½ˆâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð½ˆâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½ˆâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½ˆâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½ˆâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 10F49 0062;00E0 05AE 10F49 0315 0062;0061 05AE 0300 10F49 0315 0062;00E0 05AE 10F49 0315 0062;0061 05AE 0300 10F49 0315 0062; # (a◌̕◌̀◌֮◌ð½‰b; à◌֮◌ð½‰â—ŒÌ•b; a◌֮◌̀◌ð½‰â—ŒÌ•b; à◌֮◌ð½‰â—ŒÌ•b; a◌֮◌̀◌ð½‰â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING TWO DOTS ABOVE, LATIN SMALL LETTER B
0061 10F49 0315 0300 05AE 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062;0061 05AE 10F49 0300 0315 0062; # (aâ—Œð½‰â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð½‰â—ŒÌ€â—ŒÌ•b; a◌֮◌ð½‰â—ŒÌ€â—ŒÌ•b; a◌֮◌ð½‰â—ŒÌ€â—ŒÌ•b; a◌֮◌ð½‰â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING TWO DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 10F4A 0062;00E0 05AE 10F4A 0315 0062;0061 05AE 0300 10F4A 0315 0062;00E0 05AE 10F4A 0315 0062;0061 05AE 0300 10F4A 0315 0062; # (a◌̕◌̀◌֮◌ð½Šb; à◌֮◌ð½Šâ—ŒÌ•b; a◌֮◌̀◌ð½Šâ—ŒÌ•b; à◌֮◌ð½Šâ—ŒÌ•b; a◌֮◌̀◌ð½Šâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING CURVE ABOVE, LATIN SMALL LETTER B
0061 10F4A 0315 0300 05AE 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062;0061 05AE 10F4A 0300 0315 0062; # (aâ—Œð½Šâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð½Šâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½Šâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½Šâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½Šâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING CURVE ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 10F4B 0062;0061 302A 0316 10F4B 059A 0062;0061 302A 0316 10F4B 059A 0062;0061 302A 0316 10F4B 059A 0062;0061 302A 0316 10F4B 059A 0062; # (a◌֚◌̖◌〪◌ð½‹b; a◌〪◌̖◌ð½‹â—ŒÖšb; a◌〪◌̖◌ð½‹â—ŒÖšb; a◌〪◌̖◌ð½‹â—ŒÖšb; a◌〪◌̖◌ð½‹â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING CURVE BELOW, LATIN SMALL LETTER B
-0061 10F4B 059A 0316 302A 0062;0061 302A 10F4B 0316 059A 0062;0061 302A 10F4B 0316 059A 0062;0061 302A 10F4B 0316 059A 0062;0061 302A 10F4B 0316 059A 0062; # (aâ—Œð½‹â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð½‹â—ŒÌ–◌֚b; a◌〪◌ð½‹â—ŒÌ–◌֚b; a◌〪◌ð½‹â—ŒÌ–◌֚b; a◌〪◌ð½‹â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING CURVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F4B 0062;0061 1DFA 0316 10F4B 059A 0062;0061 1DFA 0316 10F4B 059A 0062;0061 1DFA 0316 10F4B 059A 0062;0061 1DFA 0316 10F4B 059A 0062; # (a◌֚◌̖◌᷺◌ð½‹b; a◌᷺◌̖◌ð½‹â—ŒÖšb; a◌᷺◌̖◌ð½‹â—ŒÖšb; a◌᷺◌̖◌ð½‹â—ŒÖšb; a◌᷺◌̖◌ð½‹â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING CURVE BELOW, LATIN SMALL LETTER B
+0061 10F4B 059A 0316 1DFA 0062;0061 1DFA 10F4B 0316 059A 0062;0061 1DFA 10F4B 0316 059A 0062;0061 1DFA 10F4B 0316 059A 0062;0061 1DFA 10F4B 0316 059A 0062; # (aâ—Œð½‹â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð½‹â—ŒÌ–◌֚b; a◌᷺◌ð½‹â—ŒÌ–◌֚b; a◌᷺◌ð½‹â—ŒÌ–◌֚b; a◌᷺◌ð½‹â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING CURVE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 10F4C 0062;00E0 05AE 10F4C 0315 0062;0061 05AE 0300 10F4C 0315 0062;00E0 05AE 10F4C 0315 0062;0061 05AE 0300 10F4C 0315 0062; # (a◌̕◌̀◌֮◌ð½Œb; à◌֮◌ð½Œâ—ŒÌ•b; a◌֮◌̀◌ð½Œâ—ŒÌ•b; à◌֮◌ð½Œâ—ŒÌ•b; a◌֮◌̀◌ð½Œâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, SOGDIAN COMBINING HOOK ABOVE, LATIN SMALL LETTER B
0061 10F4C 0315 0300 05AE 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062;0061 05AE 10F4C 0300 0315 0062; # (aâ—Œð½Œâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð½Œâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½Œâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½Œâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð½Œâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING HOOK ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 10F4D 0062;0061 302A 0316 10F4D 059A 0062;0061 302A 0316 10F4D 059A 0062;0061 302A 0316 10F4D 059A 0062;0061 302A 0316 10F4D 059A 0062; # (a◌֚◌̖◌〪◌ð½b; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING HOOK BELOW, LATIN SMALL LETTER B
-0061 10F4D 059A 0316 302A 0062;0061 302A 10F4D 0316 059A 0062;0061 302A 10F4D 0316 059A 0062;0061 302A 10F4D 0316 059A 0062;0061 302A 10F4D 0316 059A 0062; # (aâ—Œð½â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 10F4E 0062;0061 302A 0316 10F4E 059A 0062;0061 302A 0316 10F4E 059A 0062;0061 302A 0316 10F4E 059A 0062;0061 302A 0316 10F4E 059A 0062; # (a◌֚◌̖◌〪◌ð½Žb; a◌〪◌̖◌ð½Žâ—ŒÖšb; a◌〪◌̖◌ð½Žâ—ŒÖšb; a◌〪◌̖◌ð½Žâ—ŒÖšb; a◌〪◌̖◌ð½Žâ—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING LONG HOOK BELOW, LATIN SMALL LETTER B
-0061 10F4E 059A 0316 302A 0062;0061 302A 10F4E 0316 059A 0062;0061 302A 10F4E 0316 059A 0062;0061 302A 10F4E 0316 059A 0062;0061 302A 10F4E 0316 059A 0062; # (aâ—Œð½Žâ—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð½Žâ—ŒÌ–◌֚b; a◌〪◌ð½Žâ—ŒÌ–◌֚b; a◌〪◌ð½Žâ—ŒÌ–◌֚b; a◌〪◌ð½Žâ—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING LONG HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 10F4F 0062;0061 302A 0316 10F4F 059A 0062;0061 302A 0316 10F4F 059A 0062;0061 302A 0316 10F4F 059A 0062;0061 302A 0316 10F4F 059A 0062; # (a◌֚◌̖◌〪◌ð½b; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING RESH BELOW, LATIN SMALL LETTER B
-0061 10F4F 059A 0316 302A 0062;0061 302A 10F4F 0316 059A 0062;0061 302A 10F4F 0316 059A 0062;0061 302A 10F4F 0316 059A 0062;0061 302A 10F4F 0316 059A 0062; # (aâ—Œð½â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING RESH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 10F50 0062;0061 302A 0316 10F50 059A 0062;0061 302A 0316 10F50 059A 0062;0061 302A 0316 10F50 059A 0062;0061 302A 0316 10F50 059A 0062; # (a◌֚◌̖◌〪◌ð½b; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; a◌〪◌̖◌ð½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, SOGDIAN COMBINING STROKE BELOW, LATIN SMALL LETTER B
-0061 10F50 059A 0316 302A 0062;0061 302A 10F50 0316 059A 0062;0061 302A 10F50 0316 059A 0062;0061 302A 10F50 0316 059A 0062;0061 302A 10F50 0316 059A 0062; # (aâ—Œð½â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; a◌〪◌ð½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F4D 0062;0061 1DFA 0316 10F4D 059A 0062;0061 1DFA 0316 10F4D 059A 0062;0061 1DFA 0316 10F4D 059A 0062;0061 1DFA 0316 10F4D 059A 0062; # (a◌֚◌̖◌᷺◌ð½b; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING HOOK BELOW, LATIN SMALL LETTER B
+0061 10F4D 059A 0316 1DFA 0062;0061 1DFA 10F4D 0316 059A 0062;0061 1DFA 10F4D 0316 059A 0062;0061 1DFA 10F4D 0316 059A 0062;0061 1DFA 10F4D 0316 059A 0062; # (aâ—Œð½â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F4E 0062;0061 1DFA 0316 10F4E 059A 0062;0061 1DFA 0316 10F4E 059A 0062;0061 1DFA 0316 10F4E 059A 0062;0061 1DFA 0316 10F4E 059A 0062; # (a◌֚◌̖◌᷺◌ð½Žb; a◌᷺◌̖◌ð½Žâ—ŒÖšb; a◌᷺◌̖◌ð½Žâ—ŒÖšb; a◌᷺◌̖◌ð½Žâ—ŒÖšb; a◌᷺◌̖◌ð½Žâ—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING LONG HOOK BELOW, LATIN SMALL LETTER B
+0061 10F4E 059A 0316 1DFA 0062;0061 1DFA 10F4E 0316 059A 0062;0061 1DFA 10F4E 0316 059A 0062;0061 1DFA 10F4E 0316 059A 0062;0061 1DFA 10F4E 0316 059A 0062; # (aâ—Œð½Žâ—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð½Žâ—ŒÌ–◌֚b; a◌᷺◌ð½Žâ—ŒÌ–◌֚b; a◌᷺◌ð½Žâ—ŒÌ–◌֚b; a◌᷺◌ð½Žâ—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING LONG HOOK BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F4F 0062;0061 1DFA 0316 10F4F 059A 0062;0061 1DFA 0316 10F4F 059A 0062;0061 1DFA 0316 10F4F 059A 0062;0061 1DFA 0316 10F4F 059A 0062; # (a◌֚◌̖◌᷺◌ð½b; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING RESH BELOW, LATIN SMALL LETTER B
+0061 10F4F 059A 0316 1DFA 0062;0061 1DFA 10F4F 0316 059A 0062;0061 1DFA 10F4F 0316 059A 0062;0061 1DFA 10F4F 0316 059A 0062;0061 1DFA 10F4F 0316 059A 0062; # (aâ—Œð½â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING RESH BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F50 0062;0061 1DFA 0316 10F50 059A 0062;0061 1DFA 0316 10F50 059A 0062;0061 1DFA 0316 10F50 059A 0062;0061 1DFA 0316 10F50 059A 0062; # (a◌֚◌̖◌᷺◌ð½b; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; a◌᷺◌̖◌ð½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, SOGDIAN COMBINING STROKE BELOW, LATIN SMALL LETTER B
+0061 10F50 059A 0316 1DFA 0062;0061 1DFA 10F50 0316 059A 0062;0061 1DFA 10F50 0316 059A 0062;0061 1DFA 10F50 0316 059A 0062;0061 1DFA 10F50 0316 059A 0062; # (aâ—Œð½â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; a◌᷺◌ð½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, SOGDIAN COMBINING STROKE BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10F82 0062;00E0 05AE 10F82 0315 0062;0061 05AE 0300 10F82 0315 0062;00E0 05AE 10F82 0315 0062;0061 05AE 0300 10F82 0315 0062; # (a◌̕◌̀◌֮◌ð¾‚b; à◌֮◌ð¾‚◌̕b; a◌֮◌̀◌ð¾‚◌̕b; à◌֮◌ð¾‚◌̕b; a◌֮◌̀◌ð¾‚◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, OLD UYGHUR COMBINING DOT ABOVE, LATIN SMALL LETTER B
+0061 10F82 0315 0300 05AE 0062;0061 05AE 10F82 0300 0315 0062;0061 05AE 10F82 0300 0315 0062;0061 05AE 10F82 0300 0315 0062;0061 05AE 10F82 0300 0315 0062; # (aâ—Œð¾‚◌̕◌̀◌֮b; a◌֮◌ð¾‚◌̀◌̕b; a◌֮◌ð¾‚◌̀◌̕b; a◌֮◌ð¾‚◌̀◌̕b; a◌֮◌ð¾‚◌̀◌̕b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING DOT ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F83 0062;0061 1DFA 0316 10F83 059A 0062;0061 1DFA 0316 10F83 059A 0062;0061 1DFA 0316 10F83 059A 0062;0061 1DFA 0316 10F83 059A 0062; # (a◌֚◌̖◌᷺◌ð¾ƒb; a◌᷺◌̖◌ð¾ƒâ—ŒÖšb; a◌᷺◌̖◌ð¾ƒâ—ŒÖšb; a◌᷺◌̖◌ð¾ƒâ—ŒÖšb; a◌᷺◌̖◌ð¾ƒâ—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, OLD UYGHUR COMBINING DOT BELOW, LATIN SMALL LETTER B
+0061 10F83 059A 0316 1DFA 0062;0061 1DFA 10F83 0316 059A 0062;0061 1DFA 10F83 0316 059A 0062;0061 1DFA 10F83 0316 059A 0062;0061 1DFA 10F83 0316 059A 0062; # (aâ—Œð¾ƒâ—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð¾ƒâ—ŒÌ–◌֚b; a◌᷺◌ð¾ƒâ—ŒÌ–◌֚b; a◌᷺◌ð¾ƒâ—ŒÌ–◌֚b; a◌᷺◌ð¾ƒâ—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING DOT BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 0315 0300 05AE 10F84 0062;00E0 05AE 10F84 0315 0062;0061 05AE 0300 10F84 0315 0062;00E0 05AE 10F84 0315 0062;0061 05AE 0300 10F84 0315 0062; # (a◌̕◌̀◌֮◌ð¾„b; à◌֮◌ð¾„◌̕b; a◌֮◌̀◌ð¾„◌̕b; à◌֮◌ð¾„◌̕b; a◌֮◌̀◌ð¾„◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, OLD UYGHUR COMBINING TWO DOTS ABOVE, LATIN SMALL LETTER B
+0061 10F84 0315 0300 05AE 0062;0061 05AE 10F84 0300 0315 0062;0061 05AE 10F84 0300 0315 0062;0061 05AE 10F84 0300 0315 0062;0061 05AE 10F84 0300 0315 0062; # (aâ—Œð¾„◌̕◌̀◌֮b; a◌֮◌ð¾„◌̀◌̕b; a◌֮◌ð¾„◌̀◌̕b; a◌֮◌ð¾„◌̀◌̕b; a◌֮◌ð¾„◌̀◌̕b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING TWO DOTS ABOVE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 10F85 0062;0061 1DFA 0316 10F85 059A 0062;0061 1DFA 0316 10F85 059A 0062;0061 1DFA 0316 10F85 059A 0062;0061 1DFA 0316 10F85 059A 0062; # (a◌֚◌̖◌᷺◌ð¾…b; a◌᷺◌̖◌ð¾…◌֚b; a◌᷺◌̖◌ð¾…◌֚b; a◌᷺◌̖◌ð¾…◌֚b; a◌᷺◌̖◌ð¾…◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, OLD UYGHUR COMBINING TWO DOTS BELOW, LATIN SMALL LETTER B
+0061 10F85 059A 0316 1DFA 0062;0061 1DFA 10F85 0316 059A 0062;0061 1DFA 10F85 0316 059A 0062;0061 1DFA 10F85 0316 059A 0062;0061 1DFA 10F85 0316 059A 0062; # (aâ—Œð¾…◌֚◌̖◌᷺b; a◌᷺◌ð¾…◌̖◌֚b; a◌᷺◌ð¾…◌̖◌֚b; a◌᷺◌ð¾…◌̖◌֚b; a◌᷺◌ð¾…◌̖◌֚b; ) LATIN SMALL LETTER A, OLD UYGHUR COMBINING TWO DOTS BELOW, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 05B0 094D 3099 11046 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062;0061 3099 094D 11046 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œð‘†b; a◌゙◌à¥â—Œð‘†â—ŒÖ°b; a◌゙◌à¥â—Œð‘†â—ŒÖ°b; a◌゙◌à¥â—Œð‘†â—ŒÖ°b; a◌゙◌à¥â—Œð‘†â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI VIRAMA, LATIN SMALL LETTER B
0061 11046 05B0 094D 3099 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062;0061 3099 11046 094D 05B0 0062; # (aâ—Œð‘†â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌ð‘†â—Œà¥â—ŒÖ°b; a◌゙◌ð‘†â—Œà¥â—ŒÖ°b; a◌゙◌ð‘†â—Œà¥â—ŒÖ°b; a◌゙◌ð‘†â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, BRAHMI VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
+0061 05B0 094D 3099 11070 0062;0061 3099 094D 11070 05B0 0062;0061 3099 094D 11070 05B0 0062;0061 3099 094D 11070 05B0 0062;0061 3099 094D 11070 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œð‘°b; a◌゙◌à¥â—Œð‘°â—ŒÖ°b; a◌゙◌à¥â—Œð‘°â—ŒÖ°b; a◌゙◌à¥â—Œð‘°â—ŒÖ°b; a◌゙◌à¥â—Œð‘°â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI SIGN OLD TAMIL VIRAMA, LATIN SMALL LETTER B
+0061 11070 05B0 094D 3099 0062;0061 3099 11070 094D 05B0 0062;0061 3099 11070 094D 05B0 0062;0061 3099 11070 094D 05B0 0062;0061 3099 11070 094D 05B0 0062; # (aâ—Œð‘°â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌ð‘°â—Œà¥â—ŒÖ°b; a◌゙◌ð‘°â—Œà¥â—ŒÖ°b; a◌゙◌ð‘°â—Œà¥â—ŒÖ°b; a◌゙◌ð‘°â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, BRAHMI SIGN OLD TAMIL VIRAMA, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 1107F 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062;0061 3099 094D 1107F 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œð‘¿b; a◌゙◌à¥â—Œð‘¿â—ŒÖ°b; a◌゙◌à¥â—Œð‘¿â—ŒÖ°b; a◌゙◌à¥â—Œð‘¿â—ŒÖ°b; a◌゙◌à¥â—Œð‘¿â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, BRAHMI NUMBER JOINER, LATIN SMALL LETTER B
0061 1107F 05B0 094D 3099 0062;0061 3099 1107F 094D 05B0 0062;0061 3099 1107F 094D 05B0 0062;0061 3099 1107F 094D 05B0 0062;0061 3099 1107F 094D 05B0 0062; # (aâ—Œð‘¿â—ŒÖ°â—Œà¥â—Œã‚™b; a◌゙◌ð‘¿â—Œà¥â—ŒÖ°b; a◌゙◌ð‘¿â—Œà¥â—ŒÖ°b; a◌゙◌ð‘¿â—Œà¥â—ŒÖ°b; a◌゙◌ð‘¿â—Œà¥â—ŒÖ°b; ) LATIN SMALL LETTER A, BRAHMI NUMBER JOINER, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, LATIN SMALL LETTER B
0061 05B0 094D 3099 110B9 0062;0061 3099 094D 110B9 05B0 0062;0061 3099 094D 110B9 05B0 0062;0061 3099 094D 110B9 05B0 0062;0061 3099 094D 110B9 05B0 0062; # (a◌ְ◌à¥â—Œã‚™â—Œð‘‚¹b; a◌゙◌à¥â—Œð‘‚¹â—ŒÖ°b; a◌゙◌à¥â—Œð‘‚¹â—ŒÖ°b; a◌゙◌à¥â—Œð‘‚¹â—ŒÖ°b; a◌゙◌à¥â—Œð‘‚¹â—ŒÖ°b; ) LATIN SMALL LETTER A, HEBREW POINT SHEVA, DEVANAGARI SIGN VIRAMA, COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK, KAITHI SIGN VIRAMA, LATIN SMALL LETTER B
@@ -18533,10 +18670,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 16FF1 093C 16FF0 0334 0062;0061 0334 16FF1 16FF0 093C 0062;0061 0334 16FF1 16FF0 093C 0062;0061 0334 16FF1 16FF0 093C 0062;0061 0334 16FF1 16FF0 093C 0062; # (a𖿱◌𖿰़◌̴b; a◌̴𖿱𖿰◌़b; a◌̴𖿱𖿰◌़b; a◌̴𖿱𖿰◌़b; a◌̴𖿱𖿰◌़b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK NHAY, DEVANAGARI SIGN NUKTA, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 16FF0 0334 1BC9E 0062;0061 0334 1BC9E 16FF0 0062;0061 0334 1BC9E 16FF0 0062;0061 0334 1BC9E 16FF0 0062;0061 0334 1BC9E 16FF0 0062; # (a𖿰◌̴◌𛲞b; a◌̴◌𛲞𖿰b; a◌̴◌𛲞𖿰b; a◌̴◌𛲞𖿰b; a◌̴◌𛲞𖿰b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, DUPLOYAN DOUBLE MARK, LATIN SMALL LETTER B
0061 1BC9E 16FF0 0334 0062;0061 1BC9E 0334 16FF0 0062;0061 1BC9E 0334 16FF0 0062;0061 1BC9E 0334 16FF0 0062;0061 1BC9E 0334 16FF0 0062; # (a◌𛲞𖿰◌̴b; a◌𛲞◌̴𖿰b; a◌𛲞◌̴𖿰b; a◌𛲞◌̴𖿰b; a◌𛲞◌̴𖿰b; ) LATIN SMALL LETTER A, DUPLOYAN DOUBLE MARK, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 1D165 0062;0061 1DCE 031B 1D165 302A 0062;0061 1DCE 031B 1D165 302A 0062;0061 1DCE 031B 1D165 302A 0062;0061 1DCE 031B 1D165 302A 0062; # (a◌〪◌̛◌᷎ð…¥b; a◌᷎◌̛ð…¥â—Œã€ªb; a◌᷎◌̛ð…¥â—Œã€ªb; a◌᷎◌̛ð…¥â—Œã€ªb; a◌᷎◌̛ð…¥â—Œã€ªb; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING STEM, LATIN SMALL LETTER B
-0061 1D165 302A 031B 1DCE 0062;0061 1DCE 1D165 031B 302A 0062;0061 1DCE 1D165 031B 302A 0062;0061 1DCE 1D165 031B 302A 0062;0061 1DCE 1D165 031B 302A 0062; # (að…¥â—Œã€ªâ—ŒÌ›â—Œá·Žb; a◌᷎ð…¥â—ŒÌ›â—Œã€ªb; a◌᷎ð…¥â—ŒÌ›â—Œã€ªb; a◌᷎ð…¥â—ŒÌ›â—Œã€ªb; a◌᷎ð…¥â—ŒÌ›â—Œã€ªb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STEM, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 1D166 0062;0061 1DCE 031B 1D166 302A 0062;0061 1DCE 031B 1D166 302A 0062;0061 1DCE 031B 1D166 302A 0062;0061 1DCE 031B 1D166 302A 0062; # (a◌〪◌̛◌᷎ð…¦b; a◌᷎◌̛ð…¦â—Œã€ªb; a◌᷎◌̛ð…¦â—Œã€ªb; a◌᷎◌̛ð…¦â—Œã€ªb; a◌᷎◌̛ð…¦â—Œã€ªb; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, LATIN SMALL LETTER B
-0061 1D166 302A 031B 1DCE 0062;0061 1DCE 1D166 031B 302A 0062;0061 1DCE 1D166 031B 302A 0062;0061 1DCE 1D166 031B 302A 0062;0061 1DCE 1D166 031B 302A 0062; # (að…¦â—Œã€ªâ—ŒÌ›â—Œá·Žb; a◌᷎ð…¦â—ŒÌ›â—Œã€ªb; a◌᷎ð…¦â—ŒÌ›â—Œã€ªb; a◌᷎ð…¦â—ŒÌ›â—Œã€ªb; a◌᷎ð…¦â—ŒÌ›â—Œã€ªb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 1D165 0062;0061 1DCE 031B 1D165 1DFA 0062;0061 1DCE 031B 1D165 1DFA 0062;0061 1DCE 031B 1D165 1DFA 0062;0061 1DCE 031B 1D165 1DFA 0062; # (a◌᷺◌̛◌᷎ð…¥b; a◌᷎◌̛ð…¥â—Œá·ºb; a◌᷎◌̛ð…¥â—Œá·ºb; a◌᷎◌̛ð…¥â—Œá·ºb; a◌᷎◌̛ð…¥â—Œá·ºb; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING STEM, LATIN SMALL LETTER B
+0061 1D165 1DFA 031B 1DCE 0062;0061 1DCE 1D165 031B 1DFA 0062;0061 1DCE 1D165 031B 1DFA 0062;0061 1DCE 1D165 031B 1DFA 0062;0061 1DCE 1D165 031B 1DFA 0062; # (að…¥â—Œá·ºâ—ŒÌ›â—Œá·Žb; a◌᷎ð…¥â—ŒÌ›â—Œá·ºb; a◌᷎ð…¥â—ŒÌ›â—Œá·ºb; a◌᷎ð…¥â—ŒÌ›â—Œá·ºb; a◌᷎ð…¥â—ŒÌ›â—Œá·ºb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STEM, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 1D166 0062;0061 1DCE 031B 1D166 1DFA 0062;0061 1DCE 031B 1D166 1DFA 0062;0061 1DCE 031B 1D166 1DFA 0062;0061 1DCE 031B 1D166 1DFA 0062; # (a◌᷺◌̛◌᷎ð…¦b; a◌᷎◌̛ð…¦â—Œá·ºb; a◌᷎◌̛ð…¦â—Œá·ºb; a◌᷎◌̛ð…¦â—Œá·ºb; a◌᷎◌̛ð…¦â—Œá·ºb; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, LATIN SMALL LETTER B
+0061 1D166 1DFA 031B 1DCE 0062;0061 1DCE 1D166 031B 1DFA 0062;0061 1DCE 1D166 031B 1DFA 0062;0061 1DCE 1D166 031B 1DFA 0062;0061 1DCE 1D166 031B 1DFA 0062; # (að…¦â—Œá·ºâ—ŒÌ›â—Œá·Žb; a◌᷎ð…¦â—ŒÌ›â—Œá·ºb; a◌᷎ð…¦â—ŒÌ›â—Œá·ºb; a◌᷎ð…¦â—ŒÌ›â—Œá·ºb; a◌᷎ð…¦â—ŒÌ›â—Œá·ºb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SPRECHGESANG STEM, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
0061 16FF0 0334 1D167 0062;0061 0334 1D167 16FF0 0062;0061 0334 1D167 16FF0 0062;0061 0334 1D167 16FF0 0062;0061 0334 1D167 16FF0 0062; # (a𖿰◌̴◌ð…§b; a◌̴◌ð…§ð–¿°b; a◌̴◌ð…§ð–¿°b; a◌̴◌ð…§ð–¿°b; a◌̴◌ð…§ð–¿°b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-1, LATIN SMALL LETTER B
0061 1D167 16FF0 0334 0062;0061 1D167 0334 16FF0 0062;0061 1D167 0334 16FF0 0062;0061 1D167 0334 16FF0 0062;0061 1D167 0334 16FF0 0062; # (aâ—Œð…§ð–¿°â—ŒÌ´b; aâ—Œð…§â—ŒÌ´ð–¿°b; aâ—Œð…§â—ŒÌ´ð–¿°b; aâ—Œð…§â—ŒÌ´ð–¿°b; aâ—Œð…§â—ŒÌ´ð–¿°b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-1, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 16FF0 0334 1D168 0062;0061 0334 1D168 16FF0 0062;0061 0334 1D168 16FF0 0062;0061 0334 1D168 16FF0 0062;0061 0334 1D168 16FF0 0062; # (a𖿰◌̴◌ð…¨b; a◌̴◌ð…¨ð–¿°b; a◌̴◌ð…¨ð–¿°b; a◌̴◌ð…¨ð–¿°b; a◌̴◌ð…¨ð–¿°b; ) LATIN SMALL LETTER A, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, MUSICAL SYMBOL COMBINING TREMOLO-2, LATIN SMALL LETTER B
@@ -18545,32 +18682,32 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1D169 16FF0 0334 0062;0061 1D169 0334 16FF0 0062;0061 1D169 0334 16FF0 0062;0061 1D169 0334 16FF0 0062;0061 1D169 0334 16FF0 0062; # (aâ—Œð…©ð–¿°â—ŒÌ´b; aâ—Œð…©â—ŒÌ´ð–¿°b; aâ—Œð…©â—ŒÌ´ð–¿°b; aâ—Œð…©â—ŒÌ´ð–¿°b; aâ—Œð…©â—ŒÌ´ð–¿°b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TREMOLO-3, VIETNAMESE ALTERNATE READING MARK CA, COMBINING TILDE OVERLAY, LATIN SMALL LETTER B
0061 05AE 1D16D 302E 1D16D 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062; # (a◌֮ð…­ã€®ð…­b; a〮ð…­ð…­â—ŒÖ®b; a〮ð…­ð…­â—ŒÖ®b; a〮ð…­ð…­â—ŒÖ®b; a〮ð…­ð…­â—ŒÖ®b; ) LATIN SMALL LETTER A, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, LATIN SMALL LETTER B
0061 1D16D 05AE 1D16D 302E 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062;0061 302E 1D16D 1D16D 05AE 0062; # (að…­â—ŒÖ®ð…­ã€®b; a〮ð…­ð…­â—ŒÖ®b; a〮ð…­ð…­â—ŒÖ®b; a〮ð…­ð…­â—ŒÖ®b; a〮ð…­ð…­â—ŒÖ®b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING AUGMENTATION DOT, HANGUL SINGLE DOT TONE MARK, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 1D16E 0062;0061 1DCE 031B 1D16E 302A 0062;0061 1DCE 031B 1D16E 302A 0062;0061 1DCE 031B 1D16E 302A 0062;0061 1DCE 031B 1D16E 302A 0062; # (a◌〪◌̛◌᷎ð…®b; a◌᷎◌̛ð…®â—Œã€ªb; a◌᷎◌̛ð…®â—Œã€ªb; a◌᷎◌̛ð…®â—Œã€ªb; a◌᷎◌̛ð…®â—Œã€ªb; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-1, LATIN SMALL LETTER B
-0061 1D16E 302A 031B 1DCE 0062;0061 1DCE 1D16E 031B 302A 0062;0061 1DCE 1D16E 031B 302A 0062;0061 1DCE 1D16E 031B 302A 0062;0061 1DCE 1D16E 031B 302A 0062; # (að…®â—Œã€ªâ—ŒÌ›â—Œá·Žb; a◌᷎ð…®â—ŒÌ›â—Œã€ªb; a◌᷎ð…®â—ŒÌ›â—Œã€ªb; a◌᷎ð…®â—ŒÌ›â—Œã€ªb; a◌᷎ð…®â—ŒÌ›â—Œã€ªb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-1, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 1D16F 0062;0061 1DCE 031B 1D16F 302A 0062;0061 1DCE 031B 1D16F 302A 0062;0061 1DCE 031B 1D16F 302A 0062;0061 1DCE 031B 1D16F 302A 0062; # (a◌〪◌̛◌᷎ð…¯b; a◌᷎◌̛ð…¯â—Œã€ªb; a◌᷎◌̛ð…¯â—Œã€ªb; a◌᷎◌̛ð…¯â—Œã€ªb; a◌᷎◌̛ð…¯â—Œã€ªb; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-2, LATIN SMALL LETTER B
-0061 1D16F 302A 031B 1DCE 0062;0061 1DCE 1D16F 031B 302A 0062;0061 1DCE 1D16F 031B 302A 0062;0061 1DCE 1D16F 031B 302A 0062;0061 1DCE 1D16F 031B 302A 0062; # (að…¯â—Œã€ªâ—ŒÌ›â—Œá·Žb; a◌᷎ð…¯â—ŒÌ›â—Œã€ªb; a◌᷎ð…¯â—ŒÌ›â—Œã€ªb; a◌᷎ð…¯â—ŒÌ›â—Œã€ªb; a◌᷎ð…¯â—ŒÌ›â—Œã€ªb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-2, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 1D170 0062;0061 1DCE 031B 1D170 302A 0062;0061 1DCE 031B 1D170 302A 0062;0061 1DCE 031B 1D170 302A 0062;0061 1DCE 031B 1D170 302A 0062; # (a◌〪◌̛◌᷎ð…°b; a◌᷎◌̛ð…°â—Œã€ªb; a◌᷎◌̛ð…°â—Œã€ªb; a◌᷎◌̛ð…°â—Œã€ªb; a◌᷎◌̛ð…°â—Œã€ªb; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-3, LATIN SMALL LETTER B
-0061 1D170 302A 031B 1DCE 0062;0061 1DCE 1D170 031B 302A 0062;0061 1DCE 1D170 031B 302A 0062;0061 1DCE 1D170 031B 302A 0062;0061 1DCE 1D170 031B 302A 0062; # (að…°â—Œã€ªâ—ŒÌ›â—Œá·Žb; a◌᷎ð…°â—ŒÌ›â—Œã€ªb; a◌᷎ð…°â—ŒÌ›â—Œã€ªb; a◌᷎ð…°â—ŒÌ›â—Œã€ªb; a◌᷎ð…°â—ŒÌ›â—Œã€ªb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-3, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 1D171 0062;0061 1DCE 031B 1D171 302A 0062;0061 1DCE 031B 1D171 302A 0062;0061 1DCE 031B 1D171 302A 0062;0061 1DCE 031B 1D171 302A 0062; # (a◌〪◌̛◌᷎ð…±b; a◌᷎◌̛ð…±â—Œã€ªb; a◌᷎◌̛ð…±â—Œã€ªb; a◌᷎◌̛ð…±â—Œã€ªb; a◌᷎◌̛ð…±â—Œã€ªb; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-4, LATIN SMALL LETTER B
-0061 1D171 302A 031B 1DCE 0062;0061 1DCE 1D171 031B 302A 0062;0061 1DCE 1D171 031B 302A 0062;0061 1DCE 1D171 031B 302A 0062;0061 1DCE 1D171 031B 302A 0062; # (að…±â—Œã€ªâ—ŒÌ›â—Œá·Žb; a◌᷎ð…±â—ŒÌ›â—Œã€ªb; a◌᷎ð…±â—ŒÌ›â—Œã€ªb; a◌᷎ð…±â—ŒÌ›â—Œã€ªb; a◌᷎ð…±â—ŒÌ›â—Œã€ªb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-4, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
-0061 302A 031B 1DCE 1D172 0062;0061 1DCE 031B 1D172 302A 0062;0061 1DCE 031B 1D172 302A 0062;0061 1DCE 031B 1D172 302A 0062;0061 1DCE 031B 1D172 302A 0062; # (a◌〪◌̛◌᷎ð…²b; a◌᷎◌̛ð…²â—Œã€ªb; a◌᷎◌̛ð…²â—Œã€ªb; a◌᷎◌̛ð…²â—Œã€ªb; a◌᷎◌̛ð…²â—Œã€ªb; ) LATIN SMALL LETTER A, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-5, LATIN SMALL LETTER B
-0061 1D172 302A 031B 1DCE 0062;0061 1DCE 1D172 031B 302A 0062;0061 1DCE 1D172 031B 302A 0062;0061 1DCE 1D172 031B 302A 0062;0061 1DCE 1D172 031B 302A 0062; # (að…²â—Œã€ªâ—ŒÌ›â—Œá·Žb; a◌᷎ð…²â—ŒÌ›â—Œã€ªb; a◌᷎ð…²â—ŒÌ›â—Œã€ªb; a◌᷎ð…²â—ŒÌ›â—Œã€ªb; a◌᷎ð…²â—ŒÌ›â—Œã€ªb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-5, IDEOGRAPHIC LEVEL TONE MARK, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D17B 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062;0061 302A 0316 1D17B 059A 0062; # (a◌֚◌̖◌〪◌ð…»b; a◌〪◌̖◌ð…»â—ŒÖšb; a◌〪◌̖◌ð…»â—ŒÖšb; a◌〪◌̖◌ð…»â—ŒÖšb; a◌〪◌̖◌ð…»â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING ACCENT, LATIN SMALL LETTER B
-0061 1D17B 059A 0316 302A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062;0061 302A 1D17B 0316 059A 0062; # (aâ—Œð…»â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð…»â—ŒÌ–◌֚b; a◌〪◌ð…»â—ŒÌ–◌֚b; a◌〪◌ð…»â—ŒÌ–◌֚b; a◌〪◌ð…»â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D17C 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062;0061 302A 0316 1D17C 059A 0062; # (a◌֚◌̖◌〪◌ð…¼b; a◌〪◌̖◌ð…¼â—ŒÖšb; a◌〪◌̖◌ð…¼â—ŒÖšb; a◌〪◌̖◌ð…¼â—ŒÖšb; a◌〪◌̖◌ð…¼â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING STACCATO, LATIN SMALL LETTER B
-0061 1D17C 059A 0316 302A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062;0061 302A 1D17C 0316 059A 0062; # (aâ—Œð…¼â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð…¼â—ŒÌ–◌֚b; a◌〪◌ð…¼â—ŒÌ–◌֚b; a◌〪◌ð…¼â—ŒÌ–◌֚b; a◌〪◌ð…¼â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D17D 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062;0061 302A 0316 1D17D 059A 0062; # (a◌֚◌̖◌〪◌ð…½b; a◌〪◌̖◌ð…½â—ŒÖšb; a◌〪◌̖◌ð…½â—ŒÖšb; a◌〪◌̖◌ð…½â—ŒÖšb; a◌〪◌̖◌ð…½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING TENUTO, LATIN SMALL LETTER B
-0061 1D17D 059A 0316 302A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062;0061 302A 1D17D 0316 059A 0062; # (aâ—Œð…½â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð…½â—ŒÌ–◌֚b; a◌〪◌ð…½â—ŒÌ–◌֚b; a◌〪◌ð…½â—ŒÌ–◌֚b; a◌〪◌ð…½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TENUTO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D17E 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062;0061 302A 0316 1D17E 059A 0062; # (a◌֚◌̖◌〪◌ð…¾b; a◌〪◌̖◌ð…¾â—ŒÖšb; a◌〪◌̖◌ð…¾â—ŒÖšb; a◌〪◌̖◌ð…¾â—ŒÖšb; a◌〪◌̖◌ð…¾â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING STACCATISSIMO, LATIN SMALL LETTER B
-0061 1D17E 059A 0316 302A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062;0061 302A 1D17E 0316 059A 0062; # (aâ—Œð…¾â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð…¾â—ŒÌ–◌֚b; a◌〪◌ð…¾â—ŒÌ–◌֚b; a◌〪◌ð…¾â—ŒÌ–◌֚b; a◌〪◌ð…¾â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATISSIMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D17F 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062;0061 302A 0316 1D17F 059A 0062; # (a◌֚◌̖◌〪◌ð…¿b; a◌〪◌̖◌ð…¿â—ŒÖšb; a◌〪◌̖◌ð…¿â—ŒÖšb; a◌〪◌̖◌ð…¿â—ŒÖšb; a◌〪◌̖◌ð…¿â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING MARCATO, LATIN SMALL LETTER B
-0061 1D17F 059A 0316 302A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062;0061 302A 1D17F 0316 059A 0062; # (aâ—Œð…¿â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð…¿â—ŒÌ–◌֚b; a◌〪◌ð…¿â—ŒÌ–◌֚b; a◌〪◌ð…¿â—ŒÌ–◌֚b; a◌〪◌ð…¿â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D180 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062;0061 302A 0316 1D180 059A 0062; # (a◌֚◌̖◌〪◌ð†€b; a◌〪◌̖◌ð†€â—ŒÖšb; a◌〪◌̖◌ð†€â—ŒÖšb; a◌〪◌̖◌ð†€â—ŒÖšb; a◌〪◌̖◌ð†€â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, LATIN SMALL LETTER B
-0061 1D180 059A 0316 302A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062;0061 302A 1D180 0316 059A 0062; # (aâ—Œð†€â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð†€â—ŒÌ–◌֚b; a◌〪◌ð†€â—ŒÌ–◌֚b; a◌〪◌ð†€â—ŒÌ–◌֚b; a◌〪◌ð†€â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D181 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062;0061 302A 0316 1D181 059A 0062; # (a◌֚◌̖◌〪◌ð†b; a◌〪◌̖◌ð†â—ŒÖšb; a◌〪◌̖◌ð†â—ŒÖšb; a◌〪◌̖◌ð†â—ŒÖšb; a◌〪◌̖◌ð†â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, LATIN SMALL LETTER B
-0061 1D181 059A 0316 302A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062;0061 302A 1D181 0316 059A 0062; # (aâ—Œð†â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð†â—ŒÌ–◌֚b; a◌〪◌ð†â—ŒÌ–◌֚b; a◌〪◌ð†â—ŒÌ–◌֚b; a◌〪◌ð†â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D182 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062;0061 302A 0316 1D182 059A 0062; # (a◌֚◌̖◌〪◌ð†‚b; a◌〪◌̖◌ð†‚◌֚b; a◌〪◌̖◌ð†‚◌֚b; a◌〪◌̖◌ð†‚◌֚b; a◌〪◌̖◌ð†‚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING LOURE, LATIN SMALL LETTER B
-0061 1D182 059A 0316 302A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062;0061 302A 1D182 0316 059A 0062; # (aâ—Œð†‚◌֚◌̖◌〪b; a◌〪◌ð†‚◌̖◌֚b; a◌〪◌ð†‚◌̖◌֚b; a◌〪◌ð†‚◌̖◌֚b; a◌〪◌ð†‚◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING LOURE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 1D16E 0062;0061 1DCE 031B 1D16E 1DFA 0062;0061 1DCE 031B 1D16E 1DFA 0062;0061 1DCE 031B 1D16E 1DFA 0062;0061 1DCE 031B 1D16E 1DFA 0062; # (a◌᷺◌̛◌᷎ð…®b; a◌᷎◌̛ð…®â—Œá·ºb; a◌᷎◌̛ð…®â—Œá·ºb; a◌᷎◌̛ð…®â—Œá·ºb; a◌᷎◌̛ð…®â—Œá·ºb; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-1, LATIN SMALL LETTER B
+0061 1D16E 1DFA 031B 1DCE 0062;0061 1DCE 1D16E 031B 1DFA 0062;0061 1DCE 1D16E 031B 1DFA 0062;0061 1DCE 1D16E 031B 1DFA 0062;0061 1DCE 1D16E 031B 1DFA 0062; # (að…®â—Œá·ºâ—ŒÌ›â—Œá·Žb; a◌᷎ð…®â—ŒÌ›â—Œá·ºb; a◌᷎ð…®â—ŒÌ›â—Œá·ºb; a◌᷎ð…®â—ŒÌ›â—Œá·ºb; a◌᷎ð…®â—ŒÌ›â—Œá·ºb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-1, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 1D16F 0062;0061 1DCE 031B 1D16F 1DFA 0062;0061 1DCE 031B 1D16F 1DFA 0062;0061 1DCE 031B 1D16F 1DFA 0062;0061 1DCE 031B 1D16F 1DFA 0062; # (a◌᷺◌̛◌᷎ð…¯b; a◌᷎◌̛ð…¯â—Œá·ºb; a◌᷎◌̛ð…¯â—Œá·ºb; a◌᷎◌̛ð…¯â—Œá·ºb; a◌᷎◌̛ð…¯â—Œá·ºb; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-2, LATIN SMALL LETTER B
+0061 1D16F 1DFA 031B 1DCE 0062;0061 1DCE 1D16F 031B 1DFA 0062;0061 1DCE 1D16F 031B 1DFA 0062;0061 1DCE 1D16F 031B 1DFA 0062;0061 1DCE 1D16F 031B 1DFA 0062; # (að…¯â—Œá·ºâ—ŒÌ›â—Œá·Žb; a◌᷎ð…¯â—ŒÌ›â—Œá·ºb; a◌᷎ð…¯â—ŒÌ›â—Œá·ºb; a◌᷎ð…¯â—ŒÌ›â—Œá·ºb; a◌᷎ð…¯â—ŒÌ›â—Œá·ºb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-2, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 1D170 0062;0061 1DCE 031B 1D170 1DFA 0062;0061 1DCE 031B 1D170 1DFA 0062;0061 1DCE 031B 1D170 1DFA 0062;0061 1DCE 031B 1D170 1DFA 0062; # (a◌᷺◌̛◌᷎ð…°b; a◌᷎◌̛ð…°â—Œá·ºb; a◌᷎◌̛ð…°â—Œá·ºb; a◌᷎◌̛ð…°â—Œá·ºb; a◌᷎◌̛ð…°â—Œá·ºb; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-3, LATIN SMALL LETTER B
+0061 1D170 1DFA 031B 1DCE 0062;0061 1DCE 1D170 031B 1DFA 0062;0061 1DCE 1D170 031B 1DFA 0062;0061 1DCE 1D170 031B 1DFA 0062;0061 1DCE 1D170 031B 1DFA 0062; # (að…°â—Œá·ºâ—ŒÌ›â—Œá·Žb; a◌᷎ð…°â—ŒÌ›â—Œá·ºb; a◌᷎ð…°â—ŒÌ›â—Œá·ºb; a◌᷎ð…°â—ŒÌ›â—Œá·ºb; a◌᷎ð…°â—ŒÌ›â—Œá·ºb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-3, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 1D171 0062;0061 1DCE 031B 1D171 1DFA 0062;0061 1DCE 031B 1D171 1DFA 0062;0061 1DCE 031B 1D171 1DFA 0062;0061 1DCE 031B 1D171 1DFA 0062; # (a◌᷺◌̛◌᷎ð…±b; a◌᷎◌̛ð…±â—Œá·ºb; a◌᷎◌̛ð…±â—Œá·ºb; a◌᷎◌̛ð…±â—Œá·ºb; a◌᷎◌̛ð…±â—Œá·ºb; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-4, LATIN SMALL LETTER B
+0061 1D171 1DFA 031B 1DCE 0062;0061 1DCE 1D171 031B 1DFA 0062;0061 1DCE 1D171 031B 1DFA 0062;0061 1DCE 1D171 031B 1DFA 0062;0061 1DCE 1D171 031B 1DFA 0062; # (að…±â—Œá·ºâ—ŒÌ›â—Œá·Žb; a◌᷎ð…±â—ŒÌ›â—Œá·ºb; a◌᷎ð…±â—ŒÌ›â—Œá·ºb; a◌᷎ð…±â—ŒÌ›â—Œá·ºb; a◌᷎ð…±â—ŒÌ›â—Œá·ºb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-4, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 1DFA 031B 1DCE 1D172 0062;0061 1DCE 031B 1D172 1DFA 0062;0061 1DCE 031B 1D172 1DFA 0062;0061 1DCE 031B 1D172 1DFA 0062;0061 1DCE 031B 1D172 1DFA 0062; # (a◌᷺◌̛◌᷎ð…²b; a◌᷎◌̛ð…²â—Œá·ºb; a◌᷎◌̛ð…²â—Œá·ºb; a◌᷎◌̛ð…²â—Œá·ºb; a◌᷎◌̛ð…²â—Œá·ºb; ) LATIN SMALL LETTER A, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, MUSICAL SYMBOL COMBINING FLAG-5, LATIN SMALL LETTER B
+0061 1D172 1DFA 031B 1DCE 0062;0061 1DCE 1D172 031B 1DFA 0062;0061 1DCE 1D172 031B 1DFA 0062;0061 1DCE 1D172 031B 1DFA 0062;0061 1DCE 1D172 031B 1DFA 0062; # (að…²â—Œá·ºâ—ŒÌ›â—Œá·Žb; a◌᷎ð…²â—ŒÌ›â—Œá·ºb; a◌᷎ð…²â—ŒÌ›â—Œá·ºb; a◌᷎ð…²â—ŒÌ›â—Œá·ºb; a◌᷎ð…²â—ŒÌ›â—Œá·ºb; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING FLAG-5, COMBINING DOT BELOW LEFT, COMBINING HORN, COMBINING OGONEK ABOVE, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D17B 0062;0061 1DFA 0316 1D17B 059A 0062;0061 1DFA 0316 1D17B 059A 0062;0061 1DFA 0316 1D17B 059A 0062;0061 1DFA 0316 1D17B 059A 0062; # (a◌֚◌̖◌᷺◌ð…»b; a◌᷺◌̖◌ð…»â—ŒÖšb; a◌᷺◌̖◌ð…»â—ŒÖšb; a◌᷺◌̖◌ð…»â—ŒÖšb; a◌᷺◌̖◌ð…»â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING ACCENT, LATIN SMALL LETTER B
+0061 1D17B 059A 0316 1DFA 0062;0061 1DFA 1D17B 0316 059A 0062;0061 1DFA 1D17B 0316 059A 0062;0061 1DFA 1D17B 0316 059A 0062;0061 1DFA 1D17B 0316 059A 0062; # (aâ—Œð…»â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð…»â—ŒÌ–◌֚b; a◌᷺◌ð…»â—ŒÌ–◌֚b; a◌᷺◌ð…»â—ŒÌ–◌֚b; a◌᷺◌ð…»â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D17C 0062;0061 1DFA 0316 1D17C 059A 0062;0061 1DFA 0316 1D17C 059A 0062;0061 1DFA 0316 1D17C 059A 0062;0061 1DFA 0316 1D17C 059A 0062; # (a◌֚◌̖◌᷺◌ð…¼b; a◌᷺◌̖◌ð…¼â—ŒÖšb; a◌᷺◌̖◌ð…¼â—ŒÖšb; a◌᷺◌̖◌ð…¼â—ŒÖšb; a◌᷺◌̖◌ð…¼â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING STACCATO, LATIN SMALL LETTER B
+0061 1D17C 059A 0316 1DFA 0062;0061 1DFA 1D17C 0316 059A 0062;0061 1DFA 1D17C 0316 059A 0062;0061 1DFA 1D17C 0316 059A 0062;0061 1DFA 1D17C 0316 059A 0062; # (aâ—Œð…¼â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð…¼â—ŒÌ–◌֚b; a◌᷺◌ð…¼â—ŒÌ–◌֚b; a◌᷺◌ð…¼â—ŒÌ–◌֚b; a◌᷺◌ð…¼â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D17D 0062;0061 1DFA 0316 1D17D 059A 0062;0061 1DFA 0316 1D17D 059A 0062;0061 1DFA 0316 1D17D 059A 0062;0061 1DFA 0316 1D17D 059A 0062; # (a◌֚◌̖◌᷺◌ð…½b; a◌᷺◌̖◌ð…½â—ŒÖšb; a◌᷺◌̖◌ð…½â—ŒÖšb; a◌᷺◌̖◌ð…½â—ŒÖšb; a◌᷺◌̖◌ð…½â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING TENUTO, LATIN SMALL LETTER B
+0061 1D17D 059A 0316 1DFA 0062;0061 1DFA 1D17D 0316 059A 0062;0061 1DFA 1D17D 0316 059A 0062;0061 1DFA 1D17D 0316 059A 0062;0061 1DFA 1D17D 0316 059A 0062; # (aâ—Œð…½â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð…½â—ŒÌ–◌֚b; a◌᷺◌ð…½â—ŒÌ–◌֚b; a◌᷺◌ð…½â—ŒÌ–◌֚b; a◌᷺◌ð…½â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TENUTO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D17E 0062;0061 1DFA 0316 1D17E 059A 0062;0061 1DFA 0316 1D17E 059A 0062;0061 1DFA 0316 1D17E 059A 0062;0061 1DFA 0316 1D17E 059A 0062; # (a◌֚◌̖◌᷺◌ð…¾b; a◌᷺◌̖◌ð…¾â—ŒÖšb; a◌᷺◌̖◌ð…¾â—ŒÖšb; a◌᷺◌̖◌ð…¾â—ŒÖšb; a◌᷺◌̖◌ð…¾â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING STACCATISSIMO, LATIN SMALL LETTER B
+0061 1D17E 059A 0316 1DFA 0062;0061 1DFA 1D17E 0316 059A 0062;0061 1DFA 1D17E 0316 059A 0062;0061 1DFA 1D17E 0316 059A 0062;0061 1DFA 1D17E 0316 059A 0062; # (aâ—Œð…¾â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð…¾â—ŒÌ–◌֚b; a◌᷺◌ð…¾â—ŒÌ–◌֚b; a◌᷺◌ð…¾â—ŒÌ–◌֚b; a◌᷺◌ð…¾â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING STACCATISSIMO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D17F 0062;0061 1DFA 0316 1D17F 059A 0062;0061 1DFA 0316 1D17F 059A 0062;0061 1DFA 0316 1D17F 059A 0062;0061 1DFA 0316 1D17F 059A 0062; # (a◌֚◌̖◌᷺◌ð…¿b; a◌᷺◌̖◌ð…¿â—ŒÖšb; a◌᷺◌̖◌ð…¿â—ŒÖšb; a◌᷺◌̖◌ð…¿â—ŒÖšb; a◌᷺◌̖◌ð…¿â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING MARCATO, LATIN SMALL LETTER B
+0061 1D17F 059A 0316 1DFA 0062;0061 1DFA 1D17F 0316 059A 0062;0061 1DFA 1D17F 0316 059A 0062;0061 1DFA 1D17F 0316 059A 0062;0061 1DFA 1D17F 0316 059A 0062; # (aâ—Œð…¿â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð…¿â—ŒÌ–◌֚b; a◌᷺◌ð…¿â—ŒÌ–◌֚b; a◌᷺◌ð…¿â—ŒÌ–◌֚b; a◌᷺◌ð…¿â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D180 0062;0061 1DFA 0316 1D180 059A 0062;0061 1DFA 0316 1D180 059A 0062;0061 1DFA 0316 1D180 059A 0062;0061 1DFA 0316 1D180 059A 0062; # (a◌֚◌̖◌᷺◌ð†€b; a◌᷺◌̖◌ð†€â—ŒÖšb; a◌᷺◌̖◌ð†€â—ŒÖšb; a◌᷺◌̖◌ð†€â—ŒÖšb; a◌᷺◌̖◌ð†€â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, LATIN SMALL LETTER B
+0061 1D180 059A 0316 1DFA 0062;0061 1DFA 1D180 0316 059A 0062;0061 1DFA 1D180 0316 059A 0062;0061 1DFA 1D180 0316 059A 0062;0061 1DFA 1D180 0316 059A 0062; # (aâ—Œð†€â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð†€â—ŒÌ–◌֚b; a◌᷺◌ð†€â—ŒÌ–◌֚b; a◌᷺◌ð†€â—ŒÌ–◌֚b; a◌᷺◌ð†€â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING MARCATO-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D181 0062;0061 1DFA 0316 1D181 059A 0062;0061 1DFA 0316 1D181 059A 0062;0061 1DFA 0316 1D181 059A 0062;0061 1DFA 0316 1D181 059A 0062; # (a◌֚◌̖◌᷺◌ð†b; a◌᷺◌̖◌ð†â—ŒÖšb; a◌᷺◌̖◌ð†â—ŒÖšb; a◌᷺◌̖◌ð†â—ŒÖšb; a◌᷺◌̖◌ð†â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, LATIN SMALL LETTER B
+0061 1D181 059A 0316 1DFA 0062;0061 1DFA 1D181 0316 059A 0062;0061 1DFA 1D181 0316 059A 0062;0061 1DFA 1D181 0316 059A 0062;0061 1DFA 1D181 0316 059A 0062; # (aâ—Œð†â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð†â—ŒÌ–◌֚b; a◌᷺◌ð†â—ŒÌ–◌֚b; a◌᷺◌ð†â—ŒÌ–◌֚b; a◌᷺◌ð†â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING ACCENT-STACCATO, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D182 0062;0061 1DFA 0316 1D182 059A 0062;0061 1DFA 0316 1D182 059A 0062;0061 1DFA 0316 1D182 059A 0062;0061 1DFA 0316 1D182 059A 0062; # (a◌֚◌̖◌᷺◌ð†‚b; a◌᷺◌̖◌ð†‚◌֚b; a◌᷺◌̖◌ð†‚◌֚b; a◌᷺◌̖◌ð†‚◌֚b; a◌᷺◌̖◌ð†‚◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING LOURE, LATIN SMALL LETTER B
+0061 1D182 059A 0316 1DFA 0062;0061 1DFA 1D182 0316 059A 0062;0061 1DFA 1D182 0316 059A 0062;0061 1DFA 1D182 0316 059A 0062;0061 1DFA 1D182 0316 059A 0062; # (aâ—Œð†‚◌֚◌̖◌᷺b; a◌᷺◌ð†‚◌̖◌֚b; a◌᷺◌ð†‚◌̖◌֚b; a◌᷺◌ð†‚◌̖◌֚b; a◌᷺◌ð†‚◌̖◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING LOURE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1D185 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062;00E0 05AE 1D185 0315 0062;0061 05AE 0300 1D185 0315 0062; # (a◌̕◌̀◌֮◌ð†…b; à◌֮◌ð†…◌̕b; a◌֮◌̀◌ð†…◌̕b; à◌֮◌ð†…◌̕b; a◌֮◌̀◌ð†…◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING DOIT, LATIN SMALL LETTER B
0061 1D185 0315 0300 05AE 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062;0061 05AE 1D185 0300 0315 0062; # (aâ—Œð†…◌̕◌̀◌֮b; a◌֮◌ð†…◌̀◌̕b; a◌֮◌ð†…◌̀◌̕b; a◌֮◌ð†…◌̀◌̕b; a◌֮◌ð†…◌̀◌̕b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOIT, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1D186 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062;00E0 05AE 1D186 0315 0062;0061 05AE 0300 1D186 0315 0062; # (a◌̕◌̀◌֮◌ð††b; à◌֮◌ð††â—ŒÌ•b; a◌֮◌̀◌ð††â—ŒÌ•b; à◌֮◌ð††â—ŒÌ•b; a◌֮◌̀◌ð††â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING RIP, LATIN SMALL LETTER B
@@ -18581,10 +18718,10 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1D188 0315 0300 05AE 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062;0061 05AE 1D188 0300 0315 0062; # (aâ—Œð†ˆâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð†ˆâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð†ˆâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð†ˆâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð†ˆâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING SMEAR, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1D189 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062;00E0 05AE 1D189 0315 0062;0061 05AE 0300 1D189 0315 0062; # (a◌̕◌̀◌֮◌ð†‰b; à◌֮◌ð†‰â—ŒÌ•b; a◌֮◌̀◌ð†‰â—ŒÌ•b; à◌֮◌ð†‰â—ŒÌ•b; a◌֮◌̀◌ð†‰â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING BEND, LATIN SMALL LETTER B
0061 1D189 0315 0300 05AE 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062;0061 05AE 1D189 0300 0315 0062; # (aâ—Œð†‰â—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð†‰â—ŒÌ€â—ŒÌ•b; a◌֮◌ð†‰â—ŒÌ€â—ŒÌ•b; a◌֮◌ð†‰â—ŒÌ€â—ŒÌ•b; a◌֮◌ð†‰â—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING BEND, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D18A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062;0061 302A 0316 1D18A 059A 0062; # (a◌֚◌̖◌〪◌ð†Šb; a◌〪◌̖◌ð†Šâ—ŒÖšb; a◌〪◌̖◌ð†Šâ—ŒÖšb; a◌〪◌̖◌ð†Šâ—ŒÖšb; a◌〪◌̖◌ð†Šâ—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, LATIN SMALL LETTER B
-0061 1D18A 059A 0316 302A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062;0061 302A 1D18A 0316 059A 0062; # (aâ—Œð†Šâ—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð†Šâ—ŒÌ–◌֚b; a◌〪◌ð†Šâ—ŒÌ–◌֚b; a◌〪◌ð†Šâ—ŒÌ–◌֚b; a◌〪◌ð†Šâ—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1D18B 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062;0061 302A 0316 1D18B 059A 0062; # (a◌֚◌̖◌〪◌ð†‹b; a◌〪◌̖◌ð†‹â—ŒÖšb; a◌〪◌̖◌ð†‹â—ŒÖšb; a◌〪◌̖◌ð†‹â—ŒÖšb; a◌〪◌̖◌ð†‹â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, LATIN SMALL LETTER B
-0061 1D18B 059A 0316 302A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062;0061 302A 1D18B 0316 059A 0062; # (aâ—Œð†‹â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ð†‹â—ŒÌ–◌֚b; a◌〪◌ð†‹â—ŒÌ–◌֚b; a◌〪◌ð†‹â—ŒÌ–◌֚b; a◌〪◌ð†‹â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D18A 0062;0061 1DFA 0316 1D18A 059A 0062;0061 1DFA 0316 1D18A 059A 0062;0061 1DFA 0316 1D18A 059A 0062;0061 1DFA 0316 1D18A 059A 0062; # (a◌֚◌̖◌᷺◌ð†Šb; a◌᷺◌̖◌ð†Šâ—ŒÖšb; a◌᷺◌̖◌ð†Šâ—ŒÖšb; a◌᷺◌̖◌ð†Šâ—ŒÖšb; a◌᷺◌̖◌ð†Šâ—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, LATIN SMALL LETTER B
+0061 1D18A 059A 0316 1DFA 0062;0061 1DFA 1D18A 0316 059A 0062;0061 1DFA 1D18A 0316 059A 0062;0061 1DFA 1D18A 0316 059A 0062;0061 1DFA 1D18A 0316 059A 0062; # (aâ—Œð†Šâ—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð†Šâ—ŒÌ–◌֚b; a◌᷺◌ð†Šâ—ŒÌ–◌֚b; a◌᷺◌ð†Šâ—ŒÌ–◌֚b; a◌᷺◌ð†Šâ—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOUBLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1D18B 0062;0061 1DFA 0316 1D18B 059A 0062;0061 1DFA 0316 1D18B 059A 0062;0061 1DFA 0316 1D18B 059A 0062;0061 1DFA 0316 1D18B 059A 0062; # (a◌֚◌̖◌᷺◌ð†‹b; a◌᷺◌̖◌ð†‹â—ŒÖšb; a◌᷺◌̖◌ð†‹â—ŒÖšb; a◌᷺◌̖◌ð†‹â—ŒÖšb; a◌᷺◌̖◌ð†‹â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, LATIN SMALL LETTER B
+0061 1D18B 059A 0316 1DFA 0062;0061 1DFA 1D18B 0316 059A 0062;0061 1DFA 1D18B 0316 059A 0062;0061 1DFA 1D18B 0316 059A 0062;0061 1DFA 1D18B 0316 059A 0062; # (aâ—Œð†‹â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ð†‹â—ŒÌ–◌֚b; a◌᷺◌ð†‹â—ŒÌ–◌֚b; a◌᷺◌ð†‹â—ŒÌ–◌֚b; a◌᷺◌ð†‹â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING TRIPLE TONGUE, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1D1AA 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062;00E0 05AE 1D1AA 0315 0062;0061 05AE 0300 1D1AA 0315 0062; # (a◌̕◌̀◌֮◌ð†ªb; à◌֮◌ð†ªâ—ŒÌ•b; a◌֮◌̀◌ð†ªâ—ŒÌ•b; à◌֮◌ð†ªâ—ŒÌ•b; a◌֮◌̀◌ð†ªâ—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING DOWN BOW, LATIN SMALL LETTER B
0061 1D1AA 0315 0300 05AE 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062;0061 05AE 1D1AA 0300 0315 0062; # (aâ—Œð†ªâ—ŒÌ•â—ŒÌ€â—ŒÖ®b; a◌֮◌ð†ªâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð†ªâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð†ªâ—ŒÌ€â—ŒÌ•b; a◌֮◌ð†ªâ—ŒÌ€â—ŒÌ•b; ) LATIN SMALL LETTER A, MUSICAL SYMBOL COMBINING DOWN BOW, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1D1AB 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062;00E0 05AE 1D1AB 0315 0062;0061 05AE 0300 1D1AB 0315 0062; # (a◌̕◌̀◌֮◌ð†«b; à◌֮◌ð†«â—ŒÌ•b; a◌֮◌̀◌ð†«â—ŒÌ•b; à◌֮◌ð†«â—ŒÌ•b; a◌֮◌̀◌ð†«â—ŒÌ•b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, MUSICAL SYMBOL COMBINING UP BOW, LATIN SMALL LETTER B
@@ -18689,6 +18826,8 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1E135 0315 0300 05AE 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062;0061 05AE 1E135 0300 0315 0062; # (a◌𞄵◌̕◌̀◌֮b; a◌֮◌𞄵◌̀◌̕b; a◌֮◌𞄵◌̀◌̕b; a◌֮◌𞄵◌̀◌̕b; a◌֮◌𞄵◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-G, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E136 0062;00E0 05AE 1E136 0315 0062;0061 05AE 0300 1E136 0315 0062;00E0 05AE 1E136 0315 0062;0061 05AE 0300 1E136 0315 0062; # (a◌̕◌̀◌֮◌𞄶b; à◌֮◌𞄶◌̕b; a◌֮◌̀◌𞄶◌̕b; à◌֮◌𞄶◌̕b; a◌֮◌̀◌𞄶◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, NYIAKENG PUACHUE HMONG TONE-D, LATIN SMALL LETTER B
0061 1E136 0315 0300 05AE 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062;0061 05AE 1E136 0300 0315 0062; # (a◌𞄶◌̕◌̀◌֮b; a◌֮◌𞄶◌̀◌̕b; a◌֮◌𞄶◌̀◌̕b; a◌֮◌𞄶◌̀◌̕b; a◌֮◌𞄶◌̀◌̕b; ) LATIN SMALL LETTER A, NYIAKENG PUACHUE HMONG TONE-D, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
+0061 0315 0300 05AE 1E2AE 0062;00E0 05AE 1E2AE 0315 0062;0061 05AE 0300 1E2AE 0315 0062;00E0 05AE 1E2AE 0315 0062;0061 05AE 0300 1E2AE 0315 0062; # (a◌̕◌̀◌֮◌𞊮b; à◌֮◌𞊮◌̕b; a◌֮◌̀◌𞊮◌̕b; à◌֮◌𞊮◌̕b; a◌֮◌̀◌𞊮◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, TOTO SIGN RISING TONE, LATIN SMALL LETTER B
+0061 1E2AE 0315 0300 05AE 0062;0061 05AE 1E2AE 0300 0315 0062;0061 05AE 1E2AE 0300 0315 0062;0061 05AE 1E2AE 0300 0315 0062;0061 05AE 1E2AE 0300 0315 0062; # (a◌𞊮◌̕◌̀◌֮b; a◌֮◌𞊮◌̀◌̕b; a◌֮◌𞊮◌̀◌̕b; a◌֮◌𞊮◌̀◌̕b; a◌֮◌𞊮◌̀◌̕b; ) LATIN SMALL LETTER A, TOTO SIGN RISING TONE, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E2EC 0062;00E0 05AE 1E2EC 0315 0062;0061 05AE 0300 1E2EC 0315 0062;00E0 05AE 1E2EC 0315 0062;0061 05AE 0300 1E2EC 0315 0062; # (a◌̕◌̀◌֮◌𞋬b; à◌֮◌𞋬◌̕b; a◌֮◌̀◌𞋬◌̕b; à◌֮◌𞋬◌̕b; a◌֮◌̀◌𞋬◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE TUP, LATIN SMALL LETTER B
0061 1E2EC 0315 0300 05AE 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062;0061 05AE 1E2EC 0300 0315 0062; # (a◌𞋬◌̕◌̀◌֮b; a◌֮◌𞋬◌̀◌̕b; a◌֮◌𞋬◌̀◌̕b; a◌֮◌𞋬◌̀◌̕b; a◌֮◌𞋬◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE TUP, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E2ED 0062;00E0 05AE 1E2ED 0315 0062;0061 05AE 0300 1E2ED 0315 0062;00E0 05AE 1E2ED 0315 0062;0061 05AE 0300 1E2ED 0315 0062; # (a◌̕◌̀◌֮◌𞋭b; à◌֮◌𞋭◌̕b; a◌֮◌̀◌𞋭◌̕b; à◌֮◌𞋭◌̕b; a◌֮◌̀◌𞋭◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE TUPNI, LATIN SMALL LETTER B
@@ -18697,20 +18836,20 @@ FFEE;FFEE;FFEE;25CB;25CB; # (ï¿®; ï¿®; ï¿®; â—‹; â—‹; ) HALFWIDTH WHITE CIRCLE
0061 1E2EE 0315 0300 05AE 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062;0061 05AE 1E2EE 0300 0315 0062; # (a◌𞋮◌̕◌̀◌֮b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; a◌֮◌𞋮◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE KOI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E2EF 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062;00E0 05AE 1E2EF 0315 0062;0061 05AE 0300 1E2EF 0315 0062; # (a◌̕◌̀◌֮◌𞋯b; à◌֮◌𞋯◌̕b; a◌֮◌̀◌𞋯◌̕b; à◌֮◌𞋯◌̕b; a◌֮◌̀◌𞋯◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, WANCHO TONE KOINI, LATIN SMALL LETTER B
0061 1E2EF 0315 0300 05AE 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062;0061 05AE 1E2EF 0300 0315 0062; # (a◌𞋯◌̕◌̀◌֮b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; a◌֮◌𞋯◌̀◌̕b; ) LATIN SMALL LETTER A, WANCHO TONE KOINI, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
-0061 059A 0316 302A 1E8D0 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062;0061 302A 0316 1E8D0 059A 0062; # (a◌֚◌̖◌〪◌ðž£b; a◌〪◌̖◌ðž£â—ŒÖšb; a◌〪◌̖◌ðž£â—ŒÖšb; a◌〪◌̖◌ðž£â—ŒÖšb; a◌〪◌̖◌ðž£â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER TEENS, LATIN SMALL LETTER B
-0061 1E8D0 059A 0316 302A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062;0061 302A 1E8D0 0316 059A 0062; # (aâ—Œðž£â—ŒÖšâ—ŒÌ–◌〪b; a◌〪◌ðž£â—ŒÌ–◌֚b; a◌〪◌ðž£â—ŒÌ–◌֚b; a◌〪◌ðž£â—ŒÌ–◌֚b; a◌〪◌ðž£â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1E8D1 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062;0061 302A 0316 1E8D1 059A 0062; # (a◌֚◌̖◌〪◌𞣑b; a◌〪◌̖◌𞣑◌֚b; a◌〪◌̖◌𞣑◌֚b; a◌〪◌̖◌𞣑◌֚b; a◌〪◌̖◌𞣑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER TENS, LATIN SMALL LETTER B
-0061 1E8D1 059A 0316 302A 0062;0061 302A 1E8D1 0316 059A 0062;0061 302A 1E8D1 0316 059A 0062;0061 302A 1E8D1 0316 059A 0062;0061 302A 1E8D1 0316 059A 0062; # (a◌𞣑◌֚◌̖◌〪b; a◌〪◌𞣑◌̖◌֚b; a◌〪◌𞣑◌̖◌֚b; a◌〪◌𞣑◌̖◌֚b; a◌〪◌𞣑◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1E8D2 0062;0061 302A 0316 1E8D2 059A 0062;0061 302A 0316 1E8D2 059A 0062;0061 302A 0316 1E8D2 059A 0062;0061 302A 0316 1E8D2 059A 0062; # (a◌֚◌̖◌〪◌𞣒b; a◌〪◌̖◌𞣒◌֚b; a◌〪◌̖◌𞣒◌֚b; a◌〪◌̖◌𞣒◌֚b; a◌〪◌̖◌𞣒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER HUNDREDS, LATIN SMALL LETTER B
-0061 1E8D2 059A 0316 302A 0062;0061 302A 1E8D2 0316 059A 0062;0061 302A 1E8D2 0316 059A 0062;0061 302A 1E8D2 0316 059A 0062;0061 302A 1E8D2 0316 059A 0062; # (a◌𞣒◌֚◌̖◌〪b; a◌〪◌𞣒◌̖◌֚b; a◌〪◌𞣒◌̖◌֚b; a◌〪◌𞣒◌̖◌֚b; a◌〪◌𞣒◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER HUNDREDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1E8D3 0062;0061 302A 0316 1E8D3 059A 0062;0061 302A 0316 1E8D3 059A 0062;0061 302A 0316 1E8D3 059A 0062;0061 302A 0316 1E8D3 059A 0062; # (a◌֚◌̖◌〪◌𞣓b; a◌〪◌̖◌𞣓◌֚b; a◌〪◌̖◌𞣓◌֚b; a◌〪◌̖◌𞣓◌֚b; a◌〪◌̖◌𞣓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER THOUSANDS, LATIN SMALL LETTER B
-0061 1E8D3 059A 0316 302A 0062;0061 302A 1E8D3 0316 059A 0062;0061 302A 1E8D3 0316 059A 0062;0061 302A 1E8D3 0316 059A 0062;0061 302A 1E8D3 0316 059A 0062; # (a◌𞣓◌֚◌̖◌〪b; a◌〪◌𞣓◌̖◌֚b; a◌〪◌𞣓◌̖◌֚b; a◌〪◌𞣓◌̖◌֚b; a◌〪◌𞣓◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1E8D4 0062;0061 302A 0316 1E8D4 059A 0062;0061 302A 0316 1E8D4 059A 0062;0061 302A 0316 1E8D4 059A 0062;0061 302A 0316 1E8D4 059A 0062; # (a◌֚◌̖◌〪◌𞣔b; a◌〪◌̖◌𞣔◌֚b; a◌〪◌̖◌𞣔◌֚b; a◌〪◌̖◌𞣔◌֚b; a◌〪◌̖◌𞣔◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS, LATIN SMALL LETTER B
-0061 1E8D4 059A 0316 302A 0062;0061 302A 1E8D4 0316 059A 0062;0061 302A 1E8D4 0316 059A 0062;0061 302A 1E8D4 0316 059A 0062;0061 302A 1E8D4 0316 059A 0062; # (a◌𞣔◌֚◌̖◌〪b; a◌〪◌𞣔◌̖◌֚b; a◌〪◌𞣔◌̖◌֚b; a◌〪◌𞣔◌̖◌֚b; a◌〪◌𞣔◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1E8D5 0062;0061 302A 0316 1E8D5 059A 0062;0061 302A 0316 1E8D5 059A 0062;0061 302A 0316 1E8D5 059A 0062;0061 302A 0316 1E8D5 059A 0062; # (a◌֚◌̖◌〪◌𞣕b; a◌〪◌̖◌𞣕◌֚b; a◌〪◌̖◌𞣕◌֚b; a◌〪◌̖◌𞣕◌֚b; a◌〪◌̖◌𞣕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, LATIN SMALL LETTER B
-0061 1E8D5 059A 0316 302A 0062;0061 302A 1E8D5 0316 059A 0062;0061 302A 1E8D5 0316 059A 0062;0061 302A 1E8D5 0316 059A 0062;0061 302A 1E8D5 0316 059A 0062; # (a◌𞣕◌֚◌̖◌〪b; a◌〪◌𞣕◌̖◌֚b; a◌〪◌𞣕◌̖◌֚b; a◌〪◌𞣕◌̖◌֚b; a◌〪◌𞣕◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
-0061 059A 0316 302A 1E8D6 0062;0061 302A 0316 1E8D6 059A 0062;0061 302A 0316 1E8D6 059A 0062;0061 302A 0316 1E8D6 059A 0062;0061 302A 0316 1E8D6 059A 0062; # (a◌֚◌̖◌〪◌𞣖b; a◌〪◌̖◌𞣖◌֚b; a◌〪◌̖◌𞣖◌֚b; a◌〪◌̖◌𞣖◌֚b; a◌〪◌̖◌𞣖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, MENDE KIKAKUI COMBINING NUMBER MILLIONS, LATIN SMALL LETTER B
-0061 1E8D6 059A 0316 302A 0062;0061 302A 1E8D6 0316 059A 0062;0061 302A 1E8D6 0316 059A 0062;0061 302A 1E8D6 0316 059A 0062;0061 302A 1E8D6 0316 059A 0062; # (a◌𞣖◌֚◌̖◌〪b; a◌〪◌𞣖◌̖◌֚b; a◌〪◌𞣖◌̖◌֚b; a◌〪◌𞣖◌̖◌֚b; a◌〪◌𞣖◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER MILLIONS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, IDEOGRAPHIC LEVEL TONE MARK, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E8D0 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062;0061 1DFA 0316 1E8D0 059A 0062; # (a◌֚◌̖◌᷺◌ðž£b; a◌᷺◌̖◌ðž£â—ŒÖšb; a◌᷺◌̖◌ðž£â—ŒÖšb; a◌᷺◌̖◌ðž£â—ŒÖšb; a◌᷺◌̖◌ðž£â—ŒÖšb; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TEENS, LATIN SMALL LETTER B
+0061 1E8D0 059A 0316 1DFA 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062;0061 1DFA 1E8D0 0316 059A 0062; # (aâ—Œðž£â—ŒÖšâ—ŒÌ–◌᷺b; a◌᷺◌ðž£â—ŒÌ–◌֚b; a◌᷺◌ðž£â—ŒÌ–◌֚b; a◌᷺◌ðž£â—ŒÌ–◌֚b; a◌᷺◌ðž£â—ŒÌ–◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E8D1 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062;0061 1DFA 0316 1E8D1 059A 0062; # (a◌֚◌̖◌᷺◌𞣑b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; a◌᷺◌̖◌𞣑◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TENS, LATIN SMALL LETTER B
+0061 1E8D1 059A 0316 1DFA 0062;0061 1DFA 1E8D1 0316 059A 0062;0061 1DFA 1E8D1 0316 059A 0062;0061 1DFA 1E8D1 0316 059A 0062;0061 1DFA 1E8D1 0316 059A 0062; # (a◌𞣑◌֚◌̖◌᷺b; a◌᷺◌𞣑◌̖◌֚b; a◌᷺◌𞣑◌̖◌֚b; a◌᷺◌𞣑◌̖◌֚b; a◌᷺◌𞣑◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TENS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E8D2 0062;0061 1DFA 0316 1E8D2 059A 0062;0061 1DFA 0316 1E8D2 059A 0062;0061 1DFA 0316 1E8D2 059A 0062;0061 1DFA 0316 1E8D2 059A 0062; # (a◌֚◌̖◌᷺◌𞣒b; a◌᷺◌̖◌𞣒◌֚b; a◌᷺◌̖◌𞣒◌֚b; a◌᷺◌̖◌𞣒◌֚b; a◌᷺◌̖◌𞣒◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER HUNDREDS, LATIN SMALL LETTER B
+0061 1E8D2 059A 0316 1DFA 0062;0061 1DFA 1E8D2 0316 059A 0062;0061 1DFA 1E8D2 0316 059A 0062;0061 1DFA 1E8D2 0316 059A 0062;0061 1DFA 1E8D2 0316 059A 0062; # (a◌𞣒◌֚◌̖◌᷺b; a◌᷺◌𞣒◌̖◌֚b; a◌᷺◌𞣒◌̖◌֚b; a◌᷺◌𞣒◌̖◌֚b; a◌᷺◌𞣒◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER HUNDREDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E8D3 0062;0061 1DFA 0316 1E8D3 059A 0062;0061 1DFA 0316 1E8D3 059A 0062;0061 1DFA 0316 1E8D3 059A 0062;0061 1DFA 0316 1E8D3 059A 0062; # (a◌֚◌̖◌᷺◌𞣓b; a◌᷺◌̖◌𞣓◌֚b; a◌᷺◌̖◌𞣓◌֚b; a◌᷺◌̖◌𞣓◌֚b; a◌᷺◌̖◌𞣓◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER THOUSANDS, LATIN SMALL LETTER B
+0061 1E8D3 059A 0316 1DFA 0062;0061 1DFA 1E8D3 0316 059A 0062;0061 1DFA 1E8D3 0316 059A 0062;0061 1DFA 1E8D3 0316 059A 0062;0061 1DFA 1E8D3 0316 059A 0062; # (a◌𞣓◌֚◌̖◌᷺b; a◌᷺◌𞣓◌̖◌֚b; a◌᷺◌𞣓◌̖◌֚b; a◌᷺◌𞣓◌̖◌֚b; a◌᷺◌𞣓◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E8D4 0062;0061 1DFA 0316 1E8D4 059A 0062;0061 1DFA 0316 1E8D4 059A 0062;0061 1DFA 0316 1E8D4 059A 0062;0061 1DFA 0316 1E8D4 059A 0062; # (a◌֚◌̖◌᷺◌𞣔b; a◌᷺◌̖◌𞣔◌֚b; a◌᷺◌̖◌𞣔◌֚b; a◌᷺◌̖◌𞣔◌֚b; a◌᷺◌̖◌𞣔◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS, LATIN SMALL LETTER B
+0061 1E8D4 059A 0316 1DFA 0062;0061 1DFA 1E8D4 0316 059A 0062;0061 1DFA 1E8D4 0316 059A 0062;0061 1DFA 1E8D4 0316 059A 0062;0061 1DFA 1E8D4 0316 059A 0062; # (a◌𞣔◌֚◌̖◌᷺b; a◌᷺◌𞣔◌̖◌֚b; a◌᷺◌𞣔◌̖◌֚b; a◌᷺◌𞣔◌̖◌֚b; a◌᷺◌𞣔◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E8D5 0062;0061 1DFA 0316 1E8D5 059A 0062;0061 1DFA 0316 1E8D5 059A 0062;0061 1DFA 0316 1E8D5 059A 0062;0061 1DFA 0316 1E8D5 059A 0062; # (a◌֚◌̖◌᷺◌𞣕b; a◌᷺◌̖◌𞣕◌֚b; a◌᷺◌̖◌𞣕◌֚b; a◌᷺◌̖◌𞣕◌֚b; a◌᷺◌̖◌𞣕◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, LATIN SMALL LETTER B
+0061 1E8D5 059A 0316 1DFA 0062;0061 1DFA 1E8D5 0316 059A 0062;0061 1DFA 1E8D5 0316 059A 0062;0061 1DFA 1E8D5 0316 059A 0062;0061 1DFA 1E8D5 0316 059A 0062; # (a◌𞣕◌֚◌̖◌᷺b; a◌᷺◌𞣕◌̖◌֚b; a◌᷺◌𞣕◌̖◌֚b; a◌᷺◌𞣕◌̖◌֚b; a◌᷺◌𞣕◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
+0061 059A 0316 1DFA 1E8D6 0062;0061 1DFA 0316 1E8D6 059A 0062;0061 1DFA 0316 1E8D6 059A 0062;0061 1DFA 0316 1E8D6 059A 0062;0061 1DFA 0316 1E8D6 059A 0062; # (a◌֚◌̖◌᷺◌𞣖b; a◌᷺◌̖◌𞣖◌֚b; a◌᷺◌̖◌𞣖◌֚b; a◌᷺◌̖◌𞣖◌֚b; a◌᷺◌̖◌𞣖◌֚b; ) LATIN SMALL LETTER A, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, MENDE KIKAKUI COMBINING NUMBER MILLIONS, LATIN SMALL LETTER B
+0061 1E8D6 059A 0316 1DFA 0062;0061 1DFA 1E8D6 0316 059A 0062;0061 1DFA 1E8D6 0316 059A 0062;0061 1DFA 1E8D6 0316 059A 0062;0061 1DFA 1E8D6 0316 059A 0062; # (a◌𞣖◌֚◌̖◌᷺b; a◌᷺◌𞣖◌̖◌֚b; a◌᷺◌𞣖◌̖◌֚b; a◌᷺◌𞣖◌̖◌֚b; a◌᷺◌𞣖◌̖◌֚b; ) LATIN SMALL LETTER A, MENDE KIKAKUI COMBINING NUMBER MILLIONS, HEBREW ACCENT YETIV, COMBINING GRAVE ACCENT BELOW, COMBINING DOT BELOW LEFT, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E944 0062;00E0 05AE 1E944 0315 0062;0061 05AE 0300 1E944 0315 0062;00E0 05AE 1E944 0315 0062;0061 05AE 0300 1E944 0315 0062; # (a◌̕◌̀◌֮◌𞥄b; à◌֮◌𞥄◌̕b; a◌֮◌̀◌𞥄◌̕b; à◌֮◌𞥄◌̕b; a◌֮◌̀◌𞥄◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM ALIF LENGTHENER, LATIN SMALL LETTER B
0061 1E944 0315 0300 05AE 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062;0061 05AE 1E944 0300 0315 0062; # (a◌𞥄◌̕◌̀◌֮b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; a◌֮◌𞥄◌̀◌̕b; ) LATIN SMALL LETTER A, ADLAM ALIF LENGTHENER, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, LATIN SMALL LETTER B
0061 0315 0300 05AE 1E945 0062;00E0 05AE 1E945 0315 0062;0061 05AE 0300 1E945 0315 0062;00E0 05AE 1E945 0315 0062;0061 05AE 0300 1E945 0315 0062; # (a◌̕◌̀◌֮◌𞥅b; à◌֮◌𞥅◌̕b; a◌֮◌̀◌𞥅◌̕b; à◌֮◌𞥅◌̕b; a◌֮◌̀◌𞥅◌̕b; ) LATIN SMALL LETTER A, COMBINING COMMA ABOVE RIGHT, COMBINING GRAVE ACCENT, HEBREW ACCENT ZINOR, ADLAM VOWEL LENGTHENER, LATIN SMALL LETTER B
diff --git a/lib/stdlib/test/uri_string_SUITE.erl b/lib/stdlib/test/uri_string_SUITE.erl
index 96e4a9d41b..6a6bff2688 100644
--- a/lib/stdlib/test/uri_string_SUITE.erl
+++ b/lib/stdlib/test/uri_string_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,6 +20,8 @@
-module(uri_string_SUITE).
-include_lib("common_test/include/ct.hrl").
+-compile({nowarn_deprecated_function, [{http_uri, encode, 1}]}).
+-compile({nowarn_deprecated_function, [{http_uri, decode, 1}]}).
-export([all/0, suite/0,groups/0,
normalize/1, normalize_map/1, normalize_return_map/1, normalize_negative/1,
@@ -53,7 +55,8 @@
interop_query_latin1/1, interop_query_utf8/1,
regression_parse/1, regression_recompose/1, regression_normalize/1,
recompose_host_relative_path/1,
- recompose_host_absolute_path/1
+ recompose_host_absolute_path/1,
+ quote/1
]).
@@ -148,7 +151,8 @@ all() ->
regression_recompose,
regression_normalize,
recompose_host_relative_path,
- recompose_host_absolute_path
+ recompose_host_absolute_path,
+ quote
].
groups() ->
@@ -587,18 +591,22 @@ parse_host_ipv6(_Config) ->
{error,invalid_uri,"G"} = uri_string:parse("//[2001:0db8:0000:0000:0000:0000:1428:G7ab]").
parse_port(_Config) ->
- #{path:= "/:8042"} =
- uri_string:parse("/:8042"),
- #{host:= "", port := 8042} =
- uri_string:parse("//:8042"),
- #{host := "example.com", port:= 8042} =
- uri_string:parse("//example.com:8042"),
- #{scheme := "foo", path := "/:8042"} =
- uri_string:parse("foo:/:8042"),
- #{scheme := "foo", host := "", port := 8042} =
- uri_string:parse("foo://:8042"),
- #{scheme := "foo", host := "example.com", port := 8042} =
- uri_string:parse("foo://example.com:8042").
+ parse_port_with_param("8042", 8042),
+ parse_port_with_param("", undefined).
+
+parse_port_with_param(PortString, Expected) ->
+ #{path:= "/:" ++ PortString} =
+ uri_string:parse("/:" ++ PortString),
+ #{host:= "", port := Expected} =
+ uri_string:parse("//:" ++ PortString),
+ #{host := "example.com", port:= Expected} =
+ uri_string:parse("//example.com:" ++ PortString),
+ #{scheme := "foo", path := "/:" ++ PortString} =
+ uri_string:parse("foo:/:" ++ PortString),
+ #{scheme := "foo", host := "", port := Expected} =
+ uri_string:parse("foo://:" ++ PortString),
+ #{scheme := "foo", host := "example.com", port := Expected} =
+ uri_string:parse("foo://example.com:" ++ PortString).
parse_path(_Config) ->
#{path := "over/there"} = uri_string:parse("over/there"),
@@ -1016,7 +1024,19 @@ normalize(_Config) ->
<<"tftp://localhost">> =
uri_string:normalize(<<"tftp://localhost:69">>),
<<"/foo/%2F/bar">> =
- uri_string:normalize(<<"/foo/%2f/%62ar">>).
+ uri_string:normalize(<<"/foo/%2f/%62ar">>),
+ <<"https://localhost/">> =
+ uri_string:normalize(<<"https://localhost">>),
+ <<"https://localhost/">> =
+ uri_string:normalize(<<"https://localhost/">>),
+ <<"https://localhost/">> =
+ uri_string:normalize(<<"https://localhost:/">>),
+ <<"https://localhost/">> =
+ uri_string:normalize(<<"https://localhost:">>),
+ <<"yeti://localhost/">> =
+ uri_string:normalize(<<"yeti://localhost:/">>),
+ <<"yeti://localhost">> =
+ uri_string:normalize(<<"yeti://localhost:">>).
normalize_map(_Config) ->
"/a/g" = uri_string:normalize(#{path => "/a/b/c/./../../g"}),
@@ -1047,7 +1067,13 @@ normalize_map(_Config) ->
uri_string:normalize(#{scheme => <<"tftp">>,port => 69,path => <<>>,
host => <<"localhost">>}),
"/foo/%2F/bar" =
- uri_string:normalize(#{path => "/foo/%2f/%62ar"}).
+ uri_string:normalize(#{path => "/foo/%2f/%62ar"}),
+ <<"https://localhost/">> =
+ uri_string:normalize(#{scheme => <<"https">>,port => undefined,path => <<>>,
+ host => <<"localhost">>}),
+ <<"yeti://localhost">> =
+ uri_string:normalize(#{scheme => <<"yeti">>,port => undefined,path => <<>>,
+ host => <<"localhost">>}).
normalize_return_map(_Config) ->
#{scheme := "http",path := "/a/g",host := "localhost-örebro"} =
@@ -1332,3 +1358,132 @@ recompose_host_absolute_path(_Config) ->
path => [<<"/f">>,<<"oo">>]}),
ok.
+%%-------------------------------------------------------------------------
+%% Quote tests
+%%-------------------------------------------------------------------------
+quote(_Config) ->
+ TestQuote =
+ fun(Unquoted, Quoted) ->
+ Quoted = uri_string:quote(Unquoted)
+ end,
+
+ [TestQuote(U, Q) || #{unquoted := U, quoted := Q} <- get_quote_data()],
+ [TestQuote(U, Q) || #{unquoted_b := U, quoted_b := Q} <- get_quote_data()],
+
+ Head = fun([H | _]) -> H;
+ (<<H, _/binary>>) -> H
+ end,
+
+ TestQuoteUnquote =
+ fun(Unquoted) ->
+ %% case below should be removed when functions used are removed
+ case Head(Unquoted) =< 127 of
+ true ->
+ Unquoted = http_uri:decode(http_uri:encode(Unquoted));
+ _ ->
+ ok
+ end,
+ Unquoted = uri_string:unquote(uri_string:quote(Unquoted))
+ end,
+ [TestQuoteUnquote(U) || #{unquoted := U} <- get_quote_data()],
+ [TestQuoteUnquote(U) || #{unquoted_b := U} <- get_quote_data()],
+
+ TestQuoteWithSafeList =
+ fun(Unquoted, Quoted) ->
+ Safe = "!$()*", %% characters not encoded by old http_uri:encode
+ Result = uri_string:quote(Unquoted, Safe),
+ %% case below should be removed when function used are removed
+ case Head(Unquoted) =< 127 of
+ true ->
+ Result = http_uri:encode(Unquoted);
+ _ ->
+ ok
+ end,
+ case lists:member(Head(Unquoted), Safe) of
+ true ->
+ Unquoted = Result;
+ false ->
+ Quoted = Result
+ end
+ end,
+ [TestQuoteWithSafeList(U, Q) || #{unquoted := U, quoted := Q} <- get_quote_data()],
+ [TestQuoteWithSafeList(U, Q) || #{unquoted_b := U, quoted_b := Q} <- get_quote_data()],
+
+
+ ComposePath = fun (PathSegments, Safe) ->
+ lists:join("/", [uri_string:quote(S, Safe) ||
+ S <- PathSegments])
+ end,
+
+ %% / used as data see GH-5368
+ ExampleURI1 = "https://internal.api.com/devices/Ethernet0%2F4",
+ ExampleURI1 = uri_string:recompose(
+ #{scheme => "https",
+ host => "internal.api.com",
+ path => ComposePath(["devices", "Ethernet0/4"],
+ "")}),
+
+ %% sub-delims as data
+ %% in this example ComposePath must treat sub-delims and '%' as safe character
+ %% to avoid re-encoding encoded characters
+ ExampleURI2 = "yeti://localhost/folder/file.txt,version=1%2C1",
+ ExampleURI2 = uri_string:recompose(
+ #{scheme => "yeti",
+ host => "localhost",
+ path => ComposePath(["folder", "file.txt,version=" ++
+ uri_string:quote("1,1")],
+ ",=%")}),
+
+ %% percent character as data
+ ExampleURI3 = "yeti://localhost/folder/file_with_%25.txt",
+ ExampleURI3 = uri_string:recompose(
+ #{scheme => "yeti",
+ host => "localhost",
+ path => ComposePath(["folder", "file_with_" ++
+ uri_string:quote("%") ++ ".txt"],
+ "%")}),
+ ok.
+
+get_quote_data() ->
+ [%% reserved/gen-delims
+ #{unquoted => ":", quoted => "%3A", unquoted_b =><<":">>, quoted_b=> <<"%3A">>},
+ #{unquoted => "/", quoted => "%2F", unquoted_b =><<"/">>, quoted_b=> <<"%2F">>},
+ #{unquoted => "?", quoted => "%3F", unquoted_b =><<"?">>, quoted_b=> <<"%3F">>},
+ #{unquoted => "#", quoted => "%23", unquoted_b =><<"#">>, quoted_b=> <<"%23">>},
+ #{unquoted => "[", quoted => "%5B", unquoted_b =><<"[">>, quoted_b=> <<"%5B">>},
+ #{unquoted => "]", quoted => "%5D", unquoted_b =><<"]">>, quoted_b=> <<"%5D">>},
+ #{unquoted => "@", quoted => "%40", unquoted_b =><<"@">>, quoted_b=> <<"%40">>},
+ %% reserved/sub-delims
+ #{unquoted => "!", quoted => "%21", unquoted_b =><<"!">>, quoted_b=> <<"%21">>},
+ #{unquoted => "$", quoted => "%24", unquoted_b =><<"$">>, quoted_b=> <<"%24">>},
+ #{unquoted => "&", quoted => "%26", unquoted_b =><<"&">>, quoted_b=> <<"%26">>},
+ #{unquoted => "'", quoted => "%27", unquoted_b =><<"'">>, quoted_b=> <<"%27">>},
+ #{unquoted => "(", quoted => "%28", unquoted_b =><<"(">>, quoted_b=> <<"%28">>},
+ #{unquoted => ")", quoted => "%29", unquoted_b =><<")">>, quoted_b=> <<"%29">>},
+ #{unquoted => "*", quoted => "%2A", unquoted_b =><<"*">>, quoted_b=> <<"%2A">>},
+ #{unquoted => "+", quoted => "%2B", unquoted_b =><<"+">>, quoted_b=> <<"%2B">>},
+ #{unquoted => ",", quoted => "%2C", unquoted_b =><<",">>, quoted_b=> <<"%2C">>},
+ #{unquoted => ";", quoted => "%3B", unquoted_b =><<";">>, quoted_b=> <<"%3B">>},
+ #{unquoted => "=", quoted => "%3D", unquoted_b =><<"=">>, quoted_b=> <<"%3D">>},
+ %% other not unreserved
+ #{unquoted => "<", quoted => "%3C", unquoted_b =><<"<">>, quoted_b=> <<"%3C">>},
+ #{unquoted => ">", quoted => "%3E", unquoted_b =><<">">>, quoted_b=> <<"%3E">>},
+ #{unquoted => "\"", quoted => "%22", unquoted_b =><<"\"">>, quoted_b=> <<"%22">>},
+ #{unquoted => "{", quoted => "%7B", unquoted_b =><<"{">>, quoted_b=> <<"%7B">>},
+ #{unquoted => "}", quoted => "%7D", unquoted_b =><<"}">>, quoted_b=> <<"%7D">>},
+ #{unquoted => "|", quoted => "%7C", unquoted_b =><<"|">>, quoted_b=> <<"%7C">>},
+ #{unquoted => "\\", quoted => "%5C", unquoted_b =><<"\\">>, quoted_b=> <<"%5C">>},
+ #{unquoted => "^", quoted => "%5E", unquoted_b =><<"^">>, quoted_b=> <<"%5E">>},
+ #{unquoted => "%", quoted => "%25", unquoted_b =><<"%">>, quoted_b=> <<"%25">>},
+ #{unquoted => " ", quoted => "%20", unquoted_b =><<" ">>, quoted_b=> <<"%20">>},
+ %% non-ASCII
+ #{unquoted => "örebro", quoted => "%C3%B6rebro",
+ unquoted_b =><<"örebro"/utf8>>, quoted_b=> <<"%C3%B6rebro">>},
+ #{unquoted => "Åódź", quoted => "%C5%81%C3%B3d%C5%BA",
+ unquoted_b =><<"Åódź"/utf8>>, quoted_b=> <<"%C5%81%C3%B3d%C5%BA">>},
+ %% unreserved non alpha, non digit characters
+ #{unquoted => "-", quoted => "-", unquoted_b =><<"-">>, quoted_b=> <<"-">>},
+ #{unquoted => ".", quoted => ".", unquoted_b =><<".">>, quoted_b=> <<".">>},
+ #{unquoted => "_", quoted => "_", unquoted_b =><<"_">>, quoted_b=> <<"_">>},
+ #{unquoted => "~", quoted => "~", unquoted_b =><<"~">>, quoted_b=> <<"~">>}
+ ].
diff --git a/lib/stdlib/uc_spec/CaseFolding.txt b/lib/stdlib/uc_spec/CaseFolding.txt
index 033788b253..932ace29e6 100644
--- a/lib/stdlib/uc_spec/CaseFolding.txt
+++ b/lib/stdlib/uc_spec/CaseFolding.txt
@@ -1,6 +1,6 @@
-# CaseFolding-13.0.0.txt
-# Date: 2019-09-08, 23:30:59 GMT
-# © 2019 Unicode®, Inc.
+# CaseFolding-14.0.0.txt
+# Date: 2021-03-08, 19:35:41 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -1050,6 +1050,7 @@
2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC
2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A
2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C2F; C; 2C5F; # GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI
2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR
2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE
2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE
@@ -1230,12 +1231,16 @@ A7B8; C; A7B9; # LATIN CAPITAL LETTER U WITH STROKE
A7BA; C; A7BB; # LATIN CAPITAL LETTER GLOTTAL A
A7BC; C; A7BD; # LATIN CAPITAL LETTER GLOTTAL I
A7BE; C; A7BF; # LATIN CAPITAL LETTER GLOTTAL U
+A7C0; C; A7C1; # LATIN CAPITAL LETTER OLD POLISH O
A7C2; C; A7C3; # LATIN CAPITAL LETTER ANGLICANA W
A7C4; C; A794; # LATIN CAPITAL LETTER C WITH PALATAL HOOK
A7C5; C; 0282; # LATIN CAPITAL LETTER S WITH HOOK
A7C6; C; 1D8E; # LATIN CAPITAL LETTER Z WITH PALATAL HOOK
A7C7; C; A7C8; # LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY
A7C9; C; A7CA; # LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY
+A7D0; C; A7D1; # LATIN CAPITAL LETTER CLOSED INSULAR G
+A7D6; C; A7D7; # LATIN CAPITAL LETTER MIDDLE SCOTS S
+A7D8; C; A7D9; # LATIN CAPITAL LETTER SIGMOID S
A7F5; C; A7F6; # LATIN CAPITAL LETTER REVERSED HALF H
AB70; C; 13A0; # CHEROKEE SMALL LETTER A
AB71; C; 13A1; # CHEROKEE SMALL LETTER E
@@ -1431,6 +1436,41 @@ FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z
104D1; C; 104F9; # OSAGE CAPITAL LETTER GHA
104D2; C; 104FA; # OSAGE CAPITAL LETTER ZA
104D3; C; 104FB; # OSAGE CAPITAL LETTER ZHA
+10570; C; 10597; # VITHKUQI CAPITAL LETTER A
+10571; C; 10598; # VITHKUQI CAPITAL LETTER BBE
+10572; C; 10599; # VITHKUQI CAPITAL LETTER BE
+10573; C; 1059A; # VITHKUQI CAPITAL LETTER CE
+10574; C; 1059B; # VITHKUQI CAPITAL LETTER CHE
+10575; C; 1059C; # VITHKUQI CAPITAL LETTER DE
+10576; C; 1059D; # VITHKUQI CAPITAL LETTER DHE
+10577; C; 1059E; # VITHKUQI CAPITAL LETTER EI
+10578; C; 1059F; # VITHKUQI CAPITAL LETTER E
+10579; C; 105A0; # VITHKUQI CAPITAL LETTER FE
+1057A; C; 105A1; # VITHKUQI CAPITAL LETTER GA
+1057C; C; 105A3; # VITHKUQI CAPITAL LETTER HA
+1057D; C; 105A4; # VITHKUQI CAPITAL LETTER HHA
+1057E; C; 105A5; # VITHKUQI CAPITAL LETTER I
+1057F; C; 105A6; # VITHKUQI CAPITAL LETTER IJE
+10580; C; 105A7; # VITHKUQI CAPITAL LETTER JE
+10581; C; 105A8; # VITHKUQI CAPITAL LETTER KA
+10582; C; 105A9; # VITHKUQI CAPITAL LETTER LA
+10583; C; 105AA; # VITHKUQI CAPITAL LETTER LLA
+10584; C; 105AB; # VITHKUQI CAPITAL LETTER ME
+10585; C; 105AC; # VITHKUQI CAPITAL LETTER NE
+10586; C; 105AD; # VITHKUQI CAPITAL LETTER NJE
+10587; C; 105AE; # VITHKUQI CAPITAL LETTER O
+10588; C; 105AF; # VITHKUQI CAPITAL LETTER PE
+10589; C; 105B0; # VITHKUQI CAPITAL LETTER QA
+1058A; C; 105B1; # VITHKUQI CAPITAL LETTER RE
+1058C; C; 105B3; # VITHKUQI CAPITAL LETTER SE
+1058D; C; 105B4; # VITHKUQI CAPITAL LETTER SHE
+1058E; C; 105B5; # VITHKUQI CAPITAL LETTER TE
+1058F; C; 105B6; # VITHKUQI CAPITAL LETTER THE
+10590; C; 105B7; # VITHKUQI CAPITAL LETTER U
+10591; C; 105B8; # VITHKUQI CAPITAL LETTER VE
+10592; C; 105B9; # VITHKUQI CAPITAL LETTER XE
+10594; C; 105BB; # VITHKUQI CAPITAL LETTER Y
+10595; C; 105BC; # VITHKUQI CAPITAL LETTER ZE
10C80; C; 10CC0; # OLD HUNGARIAN CAPITAL LETTER A
10C81; C; 10CC1; # OLD HUNGARIAN CAPITAL LETTER AA
10C82; C; 10CC2; # OLD HUNGARIAN CAPITAL LETTER EB
diff --git a/lib/stdlib/uc_spec/CompositionExclusions.txt b/lib/stdlib/uc_spec/CompositionExclusions.txt
index 52bbb465bc..74e425e2a0 100644
--- a/lib/stdlib/uc_spec/CompositionExclusions.txt
+++ b/lib/stdlib/uc_spec/CompositionExclusions.txt
@@ -1,10 +1,10 @@
-# CompositionExclusions-13.0.0.txt
-# Date: 2019-10-15, 18:27:00 GMT [KW, LI]
-# © 2019 Unicode®, Inc.
-# For terms of use, see http://www.unicode.org/terms_of_use.html
+# CompositionExclusions-14.0.0.txt
+# Date: 2021-03-30, 23:59:00 GMT [KW, LI]
+# © 2021 Unicode®, Inc.
+# For terms of use, see https://www.unicode.org/terms_of_use.html
#
# Unicode Character Database
-# For documentation, see http://www.unicode.org/reports/tr44/
+# For documentation, see https://www.unicode.org/reports/tr44/
#
# This file lists the characters for the Composition Exclusion Table
# defined in UAX #15, Unicode Normalization Forms.
@@ -13,7 +13,7 @@
# Unicode Character Database.
#
# For more information, see
-# http://www.unicode.org/unicode/reports/tr15/#Primary_Exclusion_List_Table
+# https://www.unicode.org/reports/tr15/#Primary_Exclusion_List_Table
#
# For a full derivation of composition exclusions, see the derived property
# Full_Composition_Exclusion in DerivedNormalizationProps.txt
diff --git a/lib/stdlib/uc_spec/GraphemeBreakProperty.txt b/lib/stdlib/uc_spec/GraphemeBreakProperty.txt
index 6ee92f6eec..dd2569064a 100644
--- a/lib/stdlib/uc_spec/GraphemeBreakProperty.txt
+++ b/lib/stdlib/uc_spec/GraphemeBreakProperty.txt
@@ -1,6 +1,6 @@
-# GraphemeBreakProperty-13.0.0.txt
-# Date: 2019-10-21, 14:30:35 GMT
-# © 2019 Unicode®, Inc.
+# GraphemeBreakProperty-14.0.0.txt
+# Date: 2021-08-12, 23:13:02 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -21,6 +21,7 @@
0600..0605 ; Prepend # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE
06DD ; Prepend # Cf ARABIC END OF AYAH
070F ; Prepend # Cf SYRIAC ABBREVIATION MARK
+0890..0891 ; Prepend # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE
08E2 ; Prepend # Cf ARABIC DISPUTED END OF AYAH
0D4E ; Prepend # Lo MALAYALAM LETTER DOT REPH
110BD ; Prepend # Cf KAITHI NUMBER SIGN
@@ -32,7 +33,7 @@
11A84..11A89 ; Prepend # Lo [6] SOYOMBO SIGN JIHVAMULIYA..SOYOMBO CLUSTER-INITIAL LETTER SA
11D46 ; Prepend # Lo MASARAM GONDI REPHA
-# Total code points: 24
+# Total code points: 26
# ================================================
@@ -104,7 +105,8 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
0825..0827 ; Extend # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U
0829..082D ; Extend # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA
0859..085B ; Extend # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK
-08D3..08E1 ; Extend # Mn [15] ARABIC SMALL LOW WAW..ARABIC SMALL HIGH SIGN SAFHA
+0898..089F ; Extend # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA
+08CA..08E1 ; Extend # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA
08E3..0902 ; Extend # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA
093A ; Extend # Mn DEVANAGARI VOWEL SIGN OE
093C ; Extend # Mn DEVANAGARI SIGN NUKTA
@@ -151,6 +153,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
0BD7 ; Extend # Mc TAMIL AU LENGTH MARK
0C00 ; Extend # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE
0C04 ; Extend # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE
+0C3C ; Extend # Mn TELUGU SIGN NUKTA
0C3E..0C40 ; Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
0C46..0C48 ; Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
0C4A..0C4D ; Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
@@ -206,7 +209,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
109D ; Extend # Mn MYANMAR VOWEL SIGN AITON AI
135D..135F ; Extend # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK
1712..1714 ; Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
-1732..1734 ; Extend # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+1732..1733 ; Extend # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U
1752..1753 ; Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
1772..1773 ; Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
17B4..17B5 ; Extend # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
@@ -215,6 +218,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
17C9..17D3 ; Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
17DD ; Extend # Mn KHMER SIGN ATTHACAN
180B..180D ; Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180F ; Extend # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR
1885..1886 ; Extend # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA
18A9 ; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA
1920..1922 ; Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
@@ -232,7 +236,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
1A7F ; Extend # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
1AB0..1ABD ; Extend # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
1ABE ; Extend # Me COMBINING PARENTHESES OVERLAY
-1ABF..1AC0 ; Extend # Mn [2] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW
+1ABF..1ACE ; Extend # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T
1B00..1B03 ; Extend # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
1B34 ; Extend # Mn BALINESE SIGN REREKAN
1B35 ; Extend # Mc BALINESE VOWEL SIGN TEDUNG
@@ -256,8 +260,7 @@ E01F0..E0FFF ; Control # Cn [3600] <reserved-E01F0>..<reserved-E0FFF>
1CED ; Extend # Mn VEDIC SIGN TIRYAK
1CF4 ; Extend # Mn VEDIC TONE CANDRA ABOVE
1CF8..1CF9 ; Extend # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
-1DC0..1DF9 ; Extend # Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW
-1DFB..1DFF ; Extend # Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1DC0..1DFF ; Extend # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
200C ; Extend # Cf ZERO WIDTH NON-JOINER
20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
20DD..20E0 ; Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
@@ -322,11 +325,15 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
10D24..10D27 ; Extend # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
10EAB..10EAC ; Extend # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK
10F46..10F50 ; Extend # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
+10F82..10F85 ; Extend # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
11001 ; Extend # Mn BRAHMI SIGN ANUSVARA
11038..11046 ; Extend # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA
+11070 ; Extend # Mn BRAHMI SIGN OLD TAMIL VIRAMA
+11073..11074 ; Extend # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O
1107F..11081 ; Extend # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA
110B3..110B6 ; Extend # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
110B9..110BA ; Extend # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
+110C2 ; Extend # Mn KAITHI VOWEL SIGN VOCALIC R
11100..11102 ; Extend # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA
11127..1112B ; Extend # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
1112D..11134 ; Extend # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA
@@ -412,6 +419,8 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
16F8F..16F92 ; Extend # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
16FE4 ; Extend # Mn KHITAN SMALL SCRIPT FILLER
1BC9D..1BC9E ; Extend # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK
+1CF00..1CF2D ; Extend # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT
+1CF30..1CF46 ; Extend # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG
1D165 ; Extend # Mc MUSICAL SYMBOL COMBINING STEM
1D167..1D169 ; Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
1D16E..1D172 ; Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5
@@ -431,6 +440,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
1E023..1E024 ; Extend # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS
1E026..1E02A ; Extend # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA
1E130..1E136 ; Extend # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
+1E2AE ; Extend # Mn TOTO SIGN RISING TONE
1E2EC..1E2EF ; Extend # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI
1E8D0..1E8D6 ; Extend # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
1E944..1E94A ; Extend # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA
@@ -438,7 +448,7 @@ FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDT
E0020..E007F ; Extend # Cf [96] TAG SPACE..CANCEL TAG
E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
-# Total code points: 1984
+# Total code points: 2095
# ================================================
@@ -495,6 +505,8 @@ E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
103B..103C ; SpacingMark # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
1056..1057 ; SpacingMark # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
1084 ; SpacingMark # Mc MYANMAR VOWEL SIGN SHAN E
+1715 ; SpacingMark # Mc TAGALOG SIGN PAMUDPOD
+1734 ; SpacingMark # Mc HANUNOO SIGN PAMUDPOD
17B6 ; SpacingMark # Mc KHMER VOWEL SIGN AA
17BE..17C5 ; SpacingMark # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
17C7..17C8 ; SpacingMark # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
@@ -579,7 +591,6 @@ ABEC ; SpacingMark # Mc MEETEI MAYEK LUM IYEK
116AC ; SpacingMark # Mc TAKRI SIGN VISARGA
116AE..116AF ; SpacingMark # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II
116B6 ; SpacingMark # Mc TAKRI SIGN VIRAMA
-11720..11721 ; SpacingMark # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA
11726 ; SpacingMark # Mc AHOM VOWEL SIGN E
1182C..1182E ; SpacingMark # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II
11838 ; SpacingMark # Mc DOGRA SIGN VISARGA
diff --git a/lib/stdlib/uc_spec/PropList.txt b/lib/stdlib/uc_spec/PropList.txt
index 7d2f44c56f..0a5a934682 100644
--- a/lib/stdlib/uc_spec/PropList.txt
+++ b/lib/stdlib/uc_spec/PropList.txt
@@ -1,6 +1,6 @@
-# PropList-13.0.0.txt
-# Date: 2019-11-27, 03:13:28 GMT
-# © 2019 Unicode®, Inc.
+# PropList-14.0.0.txt
+# Date: 2021-08-12, 23:13:05 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
@@ -54,6 +54,7 @@
2E1A ; Dash # Pd HYPHEN WITH DIAERESIS
2E3A..2E3B ; Dash # Pd [2] TWO-EM DASH..THREE-EM DASH
2E40 ; Dash # Pd DOUBLE HYPHEN
+2E5D ; Dash # Pd OBLIQUE HYPHEN
301C ; Dash # Pd WAVE DASH
3030 ; Dash # Pd WAVY DASH
30A0 ; Dash # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN
@@ -63,7 +64,7 @@ FE63 ; Dash # Pd SMALL HYPHEN-MINUS
FF0D ; Dash # Pd FULLWIDTH HYPHEN-MINUS
10EAD ; Dash # Pd YEZIDI HYPHENATION MARK
-# Total code points: 29
+# Total code points: 30
# ================================================
@@ -126,7 +127,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
05C3 ; Terminal_Punctuation # Po HEBREW PUNCTUATION SOF PASUQ
060C ; Terminal_Punctuation # Po ARABIC COMMA
061B ; Terminal_Punctuation # Po ARABIC SEMICOLON
-061E..061F ; Terminal_Punctuation # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
+061D..061F ; Terminal_Punctuation # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK
06D4 ; Terminal_Punctuation # Po ARABIC FULL STOP
0700..070A ; Terminal_Punctuation # Po [11] SYRIAC END OF PARAGRAPH..SYRIAC CONTRACTION
070C ; Terminal_Punctuation # Po SYRIAC HARKLEAN METOBELUS
@@ -150,6 +151,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
1AA8..1AAB ; Terminal_Punctuation # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU
1B5A..1B5B ; Terminal_Punctuation # Po [2] BALINESE PANTI..BALINESE PAMADA
1B5D..1B5F ; Terminal_Punctuation # Po [3] BALINESE CARIK PAMUNGKAH..BALINESE CARIK PAREREN
+1B7D..1B7E ; Terminal_Punctuation # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG
1C3B..1C3F ; Terminal_Punctuation # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
1C7E..1C7F ; Terminal_Punctuation # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
203C..203D ; Terminal_Punctuation # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG
@@ -159,6 +161,7 @@ FF63 ; Quotation_Mark # Pe HALFWIDTH RIGHT CORNER BRACKET
2E41 ; Terminal_Punctuation # Po REVERSED COMMA
2E4C ; Terminal_Punctuation # Po MEDIEVAL COMMA
2E4E..2E4F ; Terminal_Punctuation # Po [2] PUNCTUS ELEVATUS MARK..CORNISH VERSE DIVIDER
+2E53..2E54 ; Terminal_Punctuation # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK
3001..3002 ; Terminal_Punctuation # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP
A4FE..A4FF ; Terminal_Punctuation # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP
A60D..A60F ; Terminal_Punctuation # Po [3] VAI COMMA..VAI QUESTION MARK
@@ -189,6 +192,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
10B3A..10B3F ; Terminal_Punctuation # Po [6] TINY TWO DOTS OVER ONE DOT PUNCTUATION..LARGE ONE RING OVER TWO RINGS PUNCTUATION
10B99..10B9C ; Terminal_Punctuation # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT
10F55..10F59 ; Terminal_Punctuation # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
+10F86..10F89 ; Terminal_Punctuation # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS
11047..1104D ; Terminal_Punctuation # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS
110BE..110C1 ; Terminal_Punctuation # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
11141..11143 ; Terminal_Punctuation # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
@@ -220,7 +224,7 @@ FF64 ; Terminal_Punctuation # Po HALFWIDTH IDEOGRAPHIC COMMA
1BC9F ; Terminal_Punctuation # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
1DA87..1DA8A ; Terminal_Punctuation # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON
-# Total code points: 267
+# Total code points: 276
# ================================================
@@ -600,6 +604,7 @@ FF41..FF46 ; Hex_Digit # L& [6] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH L
1A6D..1A72 ; Other_Alphabetic # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI
1A73..1A74 ; Other_Alphabetic # Mn [2] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN MAI KANG
1ABF..1AC0 ; Other_Alphabetic # Mn [2] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW
+1ACC..1ACE ; Other_Alphabetic # Mn [3] COMBINING LATIN SMALL LETTER INSULAR G..COMBINING LATIN SMALL LETTER INSULAR T
1B00..1B03 ; Other_Alphabetic # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
1B04 ; Other_Alphabetic # Mc BALINESE SIGN BISAH
1B35 ; Other_Alphabetic # Mc BALINESE VOWEL SIGN TEDUNG
@@ -686,10 +691,12 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
11001 ; Other_Alphabetic # Mn BRAHMI SIGN ANUSVARA
11002 ; Other_Alphabetic # Mc BRAHMI SIGN VISARGA
11038..11045 ; Other_Alphabetic # Mn [14] BRAHMI VOWEL SIGN AA..BRAHMI VOWEL SIGN AU
+11073..11074 ; Other_Alphabetic # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O
11082 ; Other_Alphabetic # Mc KAITHI SIGN VISARGA
110B0..110B2 ; Other_Alphabetic # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II
110B3..110B6 ; Other_Alphabetic # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI
110B7..110B8 ; Other_Alphabetic # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU
+110C2 ; Other_Alphabetic # Mn KAITHI VOWEL SIGN VOCALIC R
11100..11102 ; Other_Alphabetic # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA
11127..1112B ; Other_Alphabetic # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU
1112C ; Other_Alphabetic # Mc CHAKMA VOWEL SIGN E
@@ -815,7 +822,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
1F150..1F169 ; Other_Alphabetic # So [26] NEGATIVE CIRCLED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z
1F170..1F189 ; Other_Alphabetic # So [26] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED LATIN CAPITAL LETTER Z
-# Total code points: 1398
+# Total code points: 1404
# ================================================
@@ -824,7 +831,7 @@ FB1E ; Other_Alphabetic # Mn HEBREW POINT JUDEO-SPANISH VARIKA
3021..3029 ; Ideographic # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
3038..303A ; Ideographic # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
3400..4DBF ; Ideographic # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF
-4E00..9FFC ; Ideographic # Lo [20989] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFC
+4E00..9FFF ; Ideographic # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF
F900..FA6D ; Ideographic # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
16FE4 ; Ideographic # Mn KHITAN SMALL SCRIPT FILLER
@@ -832,15 +839,15 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
18800..18CD5 ; Ideographic # Lo [1238] TANGUT COMPONENT-001..KHITAN SMALL SCRIPT CHARACTER-18CD5
18D00..18D08 ; Ideographic # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08
1B170..1B2FB ; Ideographic # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB
-20000..2A6DD ; Ideographic # Lo [42718] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DD
-2A700..2B734 ; Ideographic # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+20000..2A6DF ; Ideographic # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
+2A700..2B738 ; Ideographic # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
2B740..2B81D ; Ideographic # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
2B820..2CEA1 ; Ideographic # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
2CEB0..2EBE0 ; Ideographic # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
2F800..2FA1D ; Ideographic # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
30000..3134A ; Ideographic # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
-# Total code points: 101652
+# Total code points: 101661
# ================================================
@@ -885,6 +892,9 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
07EB..07F3 ; Diacritic # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
07F4..07F5 ; Diacritic # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
0818..0819 ; Diacritic # Mn [2] SAMARITAN MARK OCCLUSION..SAMARITAN MARK DAGESH
+0898..089F ; Diacritic # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA
+08C9 ; Diacritic # Lm ARABIC SMALL FARSI YEH
+08CA..08D2 ; Diacritic # Mn [9] ARABIC SMALL HIGH FARSI YEH..ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW
08E3..08FE ; Diacritic # Mn [28] ARABIC TURNED DAMMA BELOW..ARABIC DAMMA WITH DOT
093C ; Diacritic # Mn DEVANAGARI SIGN NUKTA
094D ; Diacritic # Mn DEVANAGARI SIGN VIRAMA
@@ -901,6 +911,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
0B4D ; Diacritic # Mn ORIYA SIGN VIRAMA
0B55 ; Diacritic # Mn ORIYA SIGN OVERLINE
0BCD ; Diacritic # Mn TAMIL SIGN VIRAMA
+0C3C ; Diacritic # Mn TELUGU SIGN NUKTA
0C4D ; Diacritic # Mn TELUGU SIGN VIRAMA
0CBC ; Diacritic # Mn KANNADA SIGN NUKTA
0CCD ; Diacritic # Mn KANNADA SIGN VIRAMA
@@ -928,12 +939,16 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
108F ; Diacritic # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5
109A..109B ; Diacritic # Mc [2] MYANMAR SIGN KHAMTI TONE-1..MYANMAR SIGN KHAMTI TONE-3
135D..135F ; Diacritic # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK
+1714 ; Diacritic # Mn TAGALOG SIGN VIRAMA
+1715 ; Diacritic # Mc TAGALOG SIGN PAMUDPOD
17C9..17D3 ; Diacritic # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
17DD ; Diacritic # Mn KHMER SIGN ATTHACAN
1939..193B ; Diacritic # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
1A75..1A7C ; Diacritic # Mn [8] TAI THAM SIGN TONE-1..TAI THAM SIGN KHUEN-LUE KARAN
1A7F ; Diacritic # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT
1AB0..1ABD ; Diacritic # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW
+1ABE ; Diacritic # Me COMBINING PARENTHESES OVERLAY
+1AC1..1ACB ; Diacritic # Mn [11] COMBINING LEFT PARENTHESIS ABOVE LEFT..COMBINING TRIPLE ACUTE ACCENT
1B34 ; Diacritic # Mn BALINESE SIGN REREKAN
1B44 ; Diacritic # Mc BALINESE ADEG ADEG
1B6B..1B73 ; Diacritic # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
@@ -952,8 +967,7 @@ FA70..FAD9 ; Ideographic # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COM
1CF8..1CF9 ; Diacritic # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE
1D2C..1D6A ; Diacritic # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI
1DC4..1DCF ; Diacritic # Mn [12] COMBINING MACRON-ACUTE..COMBINING ZIGZAG BELOW
-1DF5..1DF9 ; Diacritic # Mn [5] COMBINING UP TACK ABOVE..COMBINING WIDE INVERTED BRIDGE BELOW
-1DFD..1DFF ; Diacritic # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+1DF5..1DFF ; Diacritic # Mn [11] COMBINING UP TACK ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
1FBD ; Diacritic # Sk GREEK KORONIS
1FBF..1FC1 ; Diacritic # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
1FCD..1FCF ; Diacritic # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
@@ -1008,10 +1022,16 @@ FF70 ; Diacritic # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND
FF9E..FF9F ; Diacritic # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
FFE3 ; Diacritic # Sk FULLWIDTH MACRON
102E0 ; Diacritic # Mn COPTIC EPACT THOUSANDS MARK
+10780..10785 ; Diacritic # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK
+10787..107B0 ; Diacritic # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK
+107B2..107BA ; Diacritic # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL
10AE5..10AE6 ; Diacritic # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW
10D22..10D23 ; Diacritic # Lo [2] HANIFI ROHINGYA MARK SAKIN..HANIFI ROHINGYA MARK NA KHONNA
10D24..10D27 ; Diacritic # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI
10F46..10F50 ; Diacritic # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW
+10F82..10F85 ; Diacritic # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW
+11046 ; Diacritic # Mn BRAHMI VIRAMA
+11070 ; Diacritic # Mn BRAHMI SIGN OLD TAMIL VIRAMA
110B9..110BA ; Diacritic # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA
11133..11134 ; Diacritic # Mn [2] CHAKMA VIRAMA..CHAKMA MAAYYAA
11173 ; Diacritic # Mn MAHAJANI SIGN NUKTA
@@ -1049,18 +1069,24 @@ FFE3 ; Diacritic # Sk FULLWIDTH MACRON
16F8F..16F92 ; Diacritic # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW
16F93..16F9F ; Diacritic # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8
16FF0..16FF1 ; Diacritic # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY
+1AFF0..1AFF3 ; Diacritic # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5
+1AFF5..1AFFB ; Diacritic # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5
+1AFFD..1AFFE ; Diacritic # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8
+1CF00..1CF2D ; Diacritic # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT
+1CF30..1CF46 ; Diacritic # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG
1D167..1D169 ; Diacritic # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
1D16D..1D172 ; Diacritic # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
1D17B..1D182 ; Diacritic # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
1D185..1D18B ; Diacritic # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
1D1AA..1D1AD ; Diacritic # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
1E130..1E136 ; Diacritic # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D
+1E2AE ; Diacritic # Mn TOTO SIGN RISING TONE
1E2EC..1E2EF ; Diacritic # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI
1E8D0..1E8D6 ; Diacritic # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS
1E944..1E946 ; Diacritic # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK
1E948..1E94A ; Diacritic # Mn [3] ADLAM CONSONANT MODIFIER..ADLAM NUKTA
-# Total code points: 882
+# Total code points: 1064
# ================================================
@@ -1088,6 +1114,7 @@ AA70 ; Extender # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION
AADD ; Extender # Lm TAI VIET SYMBOL SAM
AAF3..AAF4 ; Extender # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK
FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+10781..10782 ; Extender # Lm [2] MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON..MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON
1135D ; Extender # Lo GRANTHA SIGN PLUTA
115C6..115C8 ; Extender # Po [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3
11A98 ; Extender # Mn SOYOMBO GEMINATION MARK
@@ -1097,7 +1124,7 @@ FF70 ; Extender # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND
1E13C..1E13D ; Extender # Lm [2] NYIAKENG PUACHUE HMONG SIGN XW XW..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER
1E944..1E946 ; Extender # Mn [3] ADLAM ALIF LENGTHENER..ADLAM GEMINATION MARK
-# Total code points: 48
+# Total code points: 50
# ================================================
@@ -1121,8 +1148,12 @@ A69C..A69D ; Other_Lowercase # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..M
A770 ; Other_Lowercase # Lm MODIFIER LETTER US
A7F8..A7F9 ; Other_Lowercase # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE
AB5C..AB5F ; Other_Lowercase # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK
+10780 ; Other_Lowercase # Lm MODIFIER LETTER SMALL CAPITAL AA
+10783..10785 ; Other_Lowercase # Lm [3] MODIFIER LETTER SMALL AE..MODIFIER LETTER SMALL B WITH HOOK
+10787..107B0 ; Other_Lowercase # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK
+107B2..107BA ; Other_Lowercase # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL
-# Total code points: 189
+# Total code points: 244
# ================================================
@@ -1211,7 +1242,7 @@ E0020..E007F ; Other_Grapheme_Extend # Cf [96] TAG SPACE..CANCEL TAG
# ================================================
3400..4DBF ; Unified_Ideograph # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF
-4E00..9FFC ; Unified_Ideograph # Lo [20989] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFC
+4E00..9FFF ; Unified_Ideograph # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF
FA0E..FA0F ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA0E..CJK COMPATIBILITY IDEOGRAPH-FA0F
FA11 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA11
FA13..FA14 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA13..CJK COMPATIBILITY IDEOGRAPH-FA14
@@ -1219,14 +1250,14 @@ FA1F ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA1F
FA21 ; Unified_Ideograph # Lo CJK COMPATIBILITY IDEOGRAPH-FA21
FA23..FA24 ; Unified_Ideograph # Lo [2] CJK COMPATIBILITY IDEOGRAPH-FA23..CJK COMPATIBILITY IDEOGRAPH-FA24
FA27..FA29 ; Unified_Ideograph # Lo [3] CJK COMPATIBILITY IDEOGRAPH-FA27..CJK COMPATIBILITY IDEOGRAPH-FA29
-20000..2A6DD ; Unified_Ideograph # Lo [42718] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DD
-2A700..2B734 ; Unified_Ideograph # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
+20000..2A6DF ; Unified_Ideograph # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF
+2A700..2B738 ; Unified_Ideograph # Lo [4153] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B738
2B740..2B81D ; Unified_Ideograph # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
2B820..2CEA1 ; Unified_Ideograph # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1
2CEB0..2EBE0 ; Unified_Ideograph # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0
30000..3134A ; Unified_Ideograph # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A
-# Total code points: 92856
+# Total code points: 92865
# ================================================
@@ -1291,8 +1322,9 @@ E0001 ; Deprecated # Cf LANGUAGE TAG
1D62A..1D62B ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF ITALIC SMALL I..MATHEMATICAL SANS-SERIF ITALIC SMALL J
1D65E..1D65F ; Soft_Dotted # L& [2] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J
1D692..1D693 ; Soft_Dotted # L& [2] MATHEMATICAL MONOSPACE SMALL I..MATHEMATICAL MONOSPACE SMALL J
+1DF1A ; Soft_Dotted # L& LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK
-# Total code points: 46
+# Total code points: 47
# ================================================
@@ -1330,7 +1362,7 @@ AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET
002E ; Sentence_Terminal # Po FULL STOP
003F ; Sentence_Terminal # Po QUESTION MARK
0589 ; Sentence_Terminal # Po ARMENIAN FULL STOP
-061E..061F ; Sentence_Terminal # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK
+061D..061F ; Sentence_Terminal # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK
06D4 ; Sentence_Terminal # Po ARABIC FULL STOP
0700..0702 ; Sentence_Terminal # Po [3] SYRIAC END OF PARAGRAPH..SYRIAC SUBLINEAR FULL STOP
07F9 ; Sentence_Terminal # Po NKO EXCLAMATION MARK
@@ -1349,12 +1381,14 @@ AABB..AABC ; Logical_Order_Exception # Lo [2] TAI VIET VOWEL AUE..TAI VIET
1AA8..1AAB ; Sentence_Terminal # Po [4] TAI THAM SIGN KAAN..TAI THAM SIGN SATKAANKUU
1B5A..1B5B ; Sentence_Terminal # Po [2] BALINESE PANTI..BALINESE PAMADA
1B5E..1B5F ; Sentence_Terminal # Po [2] BALINESE CARIK SIKI..BALINESE CARIK PAREREN
+1B7D..1B7E ; Sentence_Terminal # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG
1C3B..1C3C ; Sentence_Terminal # Po [2] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION NYET THYOOM TA-ROL
1C7E..1C7F ; Sentence_Terminal # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
203C..203D ; Sentence_Terminal # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG
2047..2049 ; Sentence_Terminal # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK
2E2E ; Sentence_Terminal # Po REVERSED QUESTION MARK
2E3C ; Sentence_Terminal # Po STENOGRAPHIC FULL STOP
+2E53..2E54 ; Sentence_Terminal # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK
3002 ; Sentence_Terminal # Po IDEOGRAPHIC FULL STOP
A4FF ; Sentence_Terminal # Po LISU PUNCTUATION FULL STOP
A60E..A60F ; Sentence_Terminal # Po [2] VAI FULL STOP..VAI QUESTION MARK
@@ -1375,6 +1409,7 @@ FF1F ; Sentence_Terminal # Po FULLWIDTH QUESTION MARK
FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
10A56..10A57 ; Sentence_Terminal # Po [2] KHAROSHTHI PUNCTUATION DANDA..KHAROSHTHI PUNCTUATION DOUBLE DANDA
10F55..10F59 ; Sentence_Terminal # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
+10F86..10F89 ; Sentence_Terminal # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS
11047..11048 ; Sentence_Terminal # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA
110BE..110C1 ; Sentence_Terminal # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA
11141..11143 ; Sentence_Terminal # Po [3] CHAKMA DANDA..CHAKMA QUESTION MARK
@@ -1403,15 +1438,16 @@ FF61 ; Sentence_Terminal # Po HALFWIDTH IDEOGRAPHIC FULL STOP
1BC9F ; Sentence_Terminal # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP
1DA88 ; Sentence_Terminal # Po SIGNWRITING FULL STOP
-# Total code points: 143
+# Total code points: 152
# ================================================
180B..180D ; Variation_Selector # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180F ; Variation_Selector # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR
FE00..FE0F ; Variation_Selector # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
-# Total code points: 259
+# Total code points: 260
# ================================================
@@ -1644,8 +1680,17 @@ E0100..E01EF ; Variation_Selector # Mn [240] VARIATION SELECTOR-17..VARIATION S
2E42 ; Pattern_Syntax # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK
2E43..2E4F ; Pattern_Syntax # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER
2E50..2E51 ; Pattern_Syntax # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR
-2E52 ; Pattern_Syntax # Po TIRONIAN SIGN CAPITAL ET
-2E53..2E7F ; Pattern_Syntax # Cn [45] <reserved-2E53>..<reserved-2E7F>
+2E52..2E54 ; Pattern_Syntax # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK
+2E55 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH STROKE
+2E56 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH STROKE
+2E57 ; Pattern_Syntax # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE
+2E58 ; Pattern_Syntax # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE
+2E59 ; Pattern_Syntax # Ps TOP HALF LEFT PARENTHESIS
+2E5A ; Pattern_Syntax # Pe TOP HALF RIGHT PARENTHESIS
+2E5B ; Pattern_Syntax # Ps BOTTOM HALF LEFT PARENTHESIS
+2E5C ; Pattern_Syntax # Pe BOTTOM HALF RIGHT PARENTHESIS
+2E5D ; Pattern_Syntax # Pd OBLIQUE HYPHEN
+2E5E..2E7F ; Pattern_Syntax # Cn [34] <reserved-2E5E>..<reserved-2E7F>
3001..3003 ; Pattern_Syntax # Po [3] IDEOGRAPHIC COMMA..DITTO MARK
3008 ; Pattern_Syntax # Ps LEFT ANGLE BRACKET
3009 ; Pattern_Syntax # Pe RIGHT ANGLE BRACKET
@@ -1682,11 +1727,12 @@ FE45..FE46 ; Pattern_Syntax # Po [2] SESAME DOT..WHITE SESAME DOT
0600..0605 ; Prepended_Concatenation_Mark # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE
06DD ; Prepended_Concatenation_Mark # Cf ARABIC END OF AYAH
070F ; Prepended_Concatenation_Mark # Cf SYRIAC ABBREVIATION MARK
+0890..0891 ; Prepended_Concatenation_Mark # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE
08E2 ; Prepended_Concatenation_Mark # Cf ARABIC DISPUTED END OF AYAH
110BD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN
110CD ; Prepended_Concatenation_Mark # Cf KAITHI NUMBER SIGN ABOVE
-# Total code points: 11
+# Total code points: 13
# ================================================
diff --git a/lib/stdlib/uc_spec/README-UPDATE.txt b/lib/stdlib/uc_spec/README-UPDATE.txt
index 57fe885b5b..8af7b54a07 100644
--- a/lib/stdlib/uc_spec/README-UPDATE.txt
+++ b/lib/stdlib/uc_spec/README-UPDATE.txt
@@ -1,11 +1,45 @@
-When updating the unicode version copy the necessary files to this
-directory.
-And update the test files in stdlib/test/unicode_util_SUITE_data/*
+Unicode 14.0.0 was updated from:
+- https://www.unicode.org/Public/14.0.0/ucd/
+- https://www.unicode.org/Public/14.0.0/ucd/auxiliary/
+- https://www.unicode.org/Public/14.0.0/ucd/emoji/
-Unicode 13.0.0 was updated from:
-https://www.unicode.org/Public/13.0.0/ucd/
-https://www.unicode.org/Public/13.0.0/ucd/auxiliary/
-https://www.unicode.org/Public/13.0.0/ucd/emoji/
+When updating the Unicode version please follow these steps:
-Update the spec_version(..) function in the generator,
-gen_unicode_mod.escript
+The latest vesrion of the Unicode Character Database can be found at
+https://www.unicode.org/Public/UCD/latest/ucd/
+
+1. Copy the following files to lib/stdlib/uc_spec/ replacing existing ones.
+No subfolder should be created.
+ - CaseFolding.txt
+ - CompositionExclusions.txt
+ - PropList.txt
+ - SpecialCasing.txt
+ - UnicodeData.txt
+ - auxiliary/GraphemeBreakProperty.txt
+ - emoji/emoji-data.txt
+
+2. Copy the following test files to lib/stdlib/test/unicode_util_SUITE_data/
+replacing existing ones. No subfolder should be created.
+ - NormalizationTest.txt
+ - auxiliary/GraphemeBreakTest.txt
+ - auxiliary/LineBreakTest.txt
+
+3. Update the "spec_version()" function in the generator by replacing the Unicode
+version in lib/stdlib/uc_spec/gen_unicode_mod.escript
+
+4. Read the release notes by visiting https://www.unicode.org/versions/latest/
+and assess if additional changes are necessary in the Erlang code.
+
+5. Replace all ocurrences of previous version of Unicode with the new one in
+this very same file (lib/stdlib/uc_spec/README-UPDATE.txt).
+Remember to update these instructions if a new file is added or any other change
+is required for future version updates.
+
+6. Run the test for the Unicode suite from the OTP repository root dir.
+ $ export ERL_TOP=$PWD
+ $ export PATH=$ERL_TOP/bin:$PATH
+ $ ./otp_build all -a && ./otp_build tests
+ $ cd release/tests/test_server
+ $ erl
+ erl> ts:install().
+ erl> ts:run(stdlib, unicode_SUITE, [batch]).
diff --git a/lib/stdlib/uc_spec/SpecialCasing.txt b/lib/stdlib/uc_spec/SpecialCasing.txt
index 2a1a5a1d6b..1c2e968a8c 100644
--- a/lib/stdlib/uc_spec/SpecialCasing.txt
+++ b/lib/stdlib/uc_spec/SpecialCasing.txt
@@ -1,6 +1,6 @@
-# SpecialCasing-13.0.0.txt
-# Date: 2019-09-08, 23:31:24 GMT
-# © 2019 Unicode®, Inc.
+# SpecialCasing-14.0.0.txt
+# Date: 2021-03-08, 19:35:55 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
diff --git a/lib/stdlib/uc_spec/UnicodeData.txt b/lib/stdlib/uc_spec/UnicodeData.txt
index e22f967bba..b5abef7ed4 100644
--- a/lib/stdlib/uc_spec/UnicodeData.txt
+++ b/lib/stdlib/uc_spec/UnicodeData.txt
@@ -1525,6 +1525,7 @@
061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;;
061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;;
+061D;ARABIC END OF TEXT MARK;Po;0;AL;;;;;N;;;;;
061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;;
061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;;
0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;;
@@ -2089,6 +2090,47 @@
0868;SYRIAC LETTER MALAYALAM LLA;Lo;0;AL;;;;;N;;;;;
0869;SYRIAC LETTER MALAYALAM LLLA;Lo;0;AL;;;;;N;;;;;
086A;SYRIAC LETTER MALAYALAM SSA;Lo;0;AL;;;;;N;;;;;
+0870;ARABIC LETTER ALEF WITH ATTACHED FATHA;Lo;0;AL;;;;;N;;;;;
+0871;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA;Lo;0;AL;;;;;N;;;;;
+0872;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;;
+0873;ARABIC LETTER ALEF WITH LEFT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;;
+0874;ARABIC LETTER ALEF WITH ATTACHED KASRA;Lo;0;AL;;;;;N;;;;;
+0875;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA;Lo;0;AL;;;;;N;;;;;
+0876;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0877;ARABIC LETTER ALEF WITH ATTACHED RIGHT ROUND DOT;Lo;0;AL;;;;;N;;;;;
+0878;ARABIC LETTER ALEF WITH ATTACHED LEFT ROUND DOT;Lo;0;AL;;;;;N;;;;;
+0879;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT BELOW;Lo;0;AL;;;;;N;;;;;
+087A;ARABIC LETTER ALEF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+087B;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+087C;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+087D;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+087E;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND LEFT RING;Lo;0;AL;;;;;N;;;;;
+087F;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND LEFT RING;Lo;0;AL;;;;;N;;;;;
+0880;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND LEFT RING;Lo;0;AL;;;;;N;;;;;
+0881;ARABIC LETTER ALEF WITH ATTACHED RIGHT HAMZA;Lo;0;AL;;;;;N;;;;;
+0882;ARABIC LETTER ALEF WITH ATTACHED LEFT HAMZA;Lo;0;AL;;;;;N;;;;;
+0883;ARABIC TATWEEL WITH OVERSTRUCK HAMZA;Lo;0;AL;;;;;N;;;;;
+0884;ARABIC TATWEEL WITH OVERSTRUCK WAW;Lo;0;AL;;;;;N;;;;;
+0885;ARABIC TATWEEL WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0886;ARABIC LETTER THIN YEH;Lo;0;AL;;;;;N;;;;;
+0887;ARABIC BASELINE ROUND DOT;Lo;0;AL;;;;;N;;;;;
+0888;ARABIC RAISED ROUND DOT;Sk;0;AL;;;;;N;;;;;
+0889;ARABIC LETTER NOON WITH INVERTED SMALL V;Lo;0;AL;;;;;N;;;;;
+088A;ARABIC LETTER HAH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+088B;ARABIC LETTER TAH WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+088C;ARABIC LETTER TAH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+088D;ARABIC LETTER KEHEH WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;;
+088E;ARABIC VERTICAL TAIL;Lo;0;AL;;;;;N;;;;;
+0890;ARABIC POUND MARK ABOVE;Cf;0;AN;;;;;N;;;;;
+0891;ARABIC PIASTRE MARK ABOVE;Cf;0;AN;;;;;N;;;;;
+0898;ARABIC SMALL HIGH WORD AL-JUZ;Mn;230;NSM;;;;;N;;;;;
+0899;ARABIC SMALL LOW WORD ISHMAAM;Mn;220;NSM;;;;;N;;;;;
+089A;ARABIC SMALL LOW WORD IMAALA;Mn;220;NSM;;;;;N;;;;;
+089B;ARABIC SMALL LOW WORD TASHEEL;Mn;220;NSM;;;;;N;;;;;
+089C;ARABIC MADDA WAAJIB;Mn;230;NSM;;;;;N;;;;;
+089D;ARABIC SUPERSCRIPT ALEF MOKHASSAS;Mn;230;NSM;;;;;N;;;;;
+089E;ARABIC DOUBLED MADDA;Mn;230;NSM;;;;;N;;;;;
+089F;ARABIC HALF MADDA OVER MADDA;Mn;230;NSM;;;;;N;;;;;
08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
@@ -2110,6 +2152,7 @@
08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;;
08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+08B5;ARABIC LETTER QAF WITH DOT BELOW AND NO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
08B6;ARABIC LETTER BEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;;
08B7;ARABIC LETTER PEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;;
08B8;ARABIC LETTER TEH WITH SMALL TEH ABOVE;Lo;0;AL;;;;;N;;;;;
@@ -2128,6 +2171,17 @@
08C5;ARABIC LETTER JEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
08C6;ARABIC LETTER JEEM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;;
08C7;ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;;
+08C8;ARABIC LETTER GRAF;Lo;0;AL;;;;;N;;;;;
+08C9;ARABIC SMALL FARSI YEH;Lm;0;AL;;;;;N;;;;;
+08CA;ARABIC SMALL HIGH FARSI YEH;Mn;230;NSM;;;;;N;;;;;
+08CB;ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW;Mn;230;NSM;;;;;N;;;;;
+08CC;ARABIC SMALL HIGH WORD SAH;Mn;230;NSM;;;;;N;;;;;
+08CD;ARABIC SMALL HIGH ZAH;Mn;230;NSM;;;;;N;;;;;
+08CE;ARABIC LARGE ROUND DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+08CF;ARABIC LARGE ROUND DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+08D0;ARABIC SUKUN BELOW;Mn;220;NSM;;;;;N;;;;;
+08D1;ARABIC LARGE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;;
+08D2;ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;;
08D3;ARABIC SMALL LOW WAW;Mn;220;NSM;;;;;N;;;;;
08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;;
08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;;
@@ -2786,6 +2840,7 @@
0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;;
0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;;
0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;;
+0C3C;TELUGU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;;
0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
@@ -2806,6 +2861,7 @@
0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;;
0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;;
0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;;
+0C5D;TELUGU LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;;
0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
@@ -2901,6 +2957,7 @@
0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;;
0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;;
+0CDD;KANNADA LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;;
0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;;
0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;;
0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
@@ -5258,6 +5315,7 @@
170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;;
170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;;
170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;;
+170D;TAGALOG LETTER RA;Lo;0;L;;;;;N;;;;;
170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;;
170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;;
1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;;
@@ -5265,6 +5323,8 @@
1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1715;TAGALOG SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;;
+171F;TAGALOG LETTER ARCHAIC RA;Lo;0;L;;;;;N;;;;;
1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;;
1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;;
1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;;
@@ -5285,7 +5345,7 @@
1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;;
1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
-1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;;
+1734;HANUNOO SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;;
1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;;
1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;;
@@ -5455,6 +5515,7 @@
180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;;
+180F;MONGOLIAN FREE VARIATION SELECTOR FOUR;Mn;0;NSM;;;;;N;;;;;
1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -6059,6 +6120,20 @@
1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;;
1ABF;COMBINING LATIN SMALL LETTER W BELOW;Mn;220;NSM;;;;;N;;;;;
1AC0;COMBINING LATIN SMALL LETTER TURNED W BELOW;Mn;220;NSM;;;;;N;;;;;
+1AC1;COMBINING LEFT PARENTHESIS ABOVE LEFT;Mn;230;NSM;;;;;N;;;;;
+1AC2;COMBINING RIGHT PARENTHESIS ABOVE RIGHT;Mn;230;NSM;;;;;N;;;;;
+1AC3;COMBINING LEFT PARENTHESIS BELOW LEFT;Mn;220;NSM;;;;;N;;;;;
+1AC4;COMBINING RIGHT PARENTHESIS BELOW RIGHT;Mn;220;NSM;;;;;N;;;;;
+1AC5;COMBINING SQUARE BRACKETS ABOVE;Mn;230;NSM;;;;;N;;;;;
+1AC6;COMBINING NUMBER SIGN ABOVE;Mn;230;NSM;;;;;N;;;;;
+1AC7;COMBINING INVERTED DOUBLE ARCH ABOVE;Mn;230;NSM;;;;;N;;;;;
+1AC8;COMBINING PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;;
+1AC9;COMBINING DOUBLE PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;;
+1ACA;COMBINING DOUBLE PLUS SIGN BELOW;Mn;220;NSM;;;;;N;;;;;
+1ACB;COMBINING TRIPLE ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1ACC;COMBINING LATIN SMALL LETTER INSULAR G;Mn;230;NSM;;;;;N;;;;;
+1ACD;COMBINING LATIN SMALL LETTER INSULAR R;Mn;230;NSM;;;;;N;;;;;
+1ACE;COMBINING LATIN SMALL LETTER INSULAR T;Mn;230;NSM;;;;;N;;;;;
1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;;
1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;;
1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;;
@@ -6135,6 +6210,7 @@
1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B4C;BALINESE LETTER ARCHAIC JNYA;Lo;0;L;;;;;N;;;;;
1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -6180,6 +6256,8 @@
1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1B7D;BALINESE PANTI LANTANG;Po;0;L;;;;;N;;;;;
+1B7E;BALINESE PAMADA LANTANG;Po;0;L;;;;;N;;;;;
1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;;
1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;;
1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;;
@@ -6778,6 +6856,7 @@
1DF7;COMBINING KAVYKA ABOVE LEFT;Mn;228;NSM;;;;;N;;;;;
1DF8;COMBINING DOT ABOVE LEFT;Mn;228;NSM;;;;;N;;;;;
1DF9;COMBINING WIDE INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DFA;COMBINING DOT BELOW LEFT;Mn;218;NSM;;;;;N;;;;;
1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;;
1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;;
@@ -7457,6 +7536,7 @@
20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;;
20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;;
20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;;
+20C0;SOM SIGN;Sc;0;ET;;;;;N;;;;;
20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;;
20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;;
20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;;
@@ -10300,6 +10380,7 @@
2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C2F;GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI;Lu;0;L;;;;;N;;;;2C5F;
2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
@@ -10347,6 +10428,7 @@
2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C5F;GLAGOLITIC SMALL LETTER CAUDATE CHRIVI;Ll;0;L;;;;;N;;;2C2F;;2C2F
2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
@@ -10795,6 +10877,17 @@
2E50;CROSS PATTY WITH RIGHT CROSSBAR;So;0;ON;;;;;N;;;;;
2E51;CROSS PATTY WITH LEFT CROSSBAR;So;0;ON;;;;;N;;;;;
2E52;TIRONIAN SIGN CAPITAL ET;Po;0;ON;;;;;N;;;;;
+2E53;MEDIEVAL EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+2E54;MEDIEVAL QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2E55;LEFT SQUARE BRACKET WITH STROKE;Ps;0;ON;;;;;Y;;;;;
+2E56;RIGHT SQUARE BRACKET WITH STROKE;Pe;0;ON;;;;;Y;;;;;
+2E57;LEFT SQUARE BRACKET WITH DOUBLE STROKE;Ps;0;ON;;;;;Y;;;;;
+2E58;RIGHT SQUARE BRACKET WITH DOUBLE STROKE;Pe;0;ON;;;;;Y;;;;;
+2E59;TOP HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E5A;TOP HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E5B;BOTTOM HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2E5C;BOTTOM HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2E5D;OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;;
2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;;
2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;;
@@ -12204,7 +12297,7 @@
4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
-9FFC;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
+9FFF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;;
A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;;
A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;;
A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;;
@@ -14149,6 +14242,8 @@ A7BC;LATIN CAPITAL LETTER GLOTTAL I;Lu;0;L;;;;;N;;;;A7BD;
A7BD;LATIN SMALL LETTER GLOTTAL I;Ll;0;L;;;;;N;;;A7BC;;A7BC
A7BE;LATIN CAPITAL LETTER GLOTTAL U;Lu;0;L;;;;;N;;;;A7BF;
A7BF;LATIN SMALL LETTER GLOTTAL U;Ll;0;L;;;;;N;;;A7BE;;A7BE
+A7C0;LATIN CAPITAL LETTER OLD POLISH O;Lu;0;L;;;;;N;;;;A7C1;
+A7C1;LATIN SMALL LETTER OLD POLISH O;Ll;0;L;;;;;N;;;A7C0;;A7C0
A7C2;LATIN CAPITAL LETTER ANGLICANA W;Lu;0;L;;;;;N;;;;A7C3;
A7C3;LATIN SMALL LETTER ANGLICANA W;Ll;0;L;;;;;N;;;A7C2;;A7C2
A7C4;LATIN CAPITAL LETTER C WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;A794;
@@ -14158,6 +14253,17 @@ A7C7;LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7C8;
A7C8;LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C7;;A7C7
A7C9;LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7CA;
A7CA;LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C9;;A7C9
+A7D0;LATIN CAPITAL LETTER CLOSED INSULAR G;Lu;0;L;;;;;N;;;;A7D1;
+A7D1;LATIN SMALL LETTER CLOSED INSULAR G;Ll;0;L;;;;;N;;;A7D0;;A7D0
+A7D3;LATIN SMALL LETTER DOUBLE THORN;Ll;0;L;;;;;N;;;;;
+A7D5;LATIN SMALL LETTER DOUBLE WYNN;Ll;0;L;;;;;N;;;;;
+A7D6;LATIN CAPITAL LETTER MIDDLE SCOTS S;Lu;0;L;;;;;N;;;;A7D7;
+A7D7;LATIN SMALL LETTER MIDDLE SCOTS S;Ll;0;L;;;;;N;;;A7D6;;A7D6
+A7D8;LATIN CAPITAL LETTER SIGMOID S;Lu;0;L;;;;;N;;;;A7D9;
+A7D9;LATIN SMALL LETTER SIGMOID S;Ll;0;L;;;;;N;;;A7D8;;A7D8
+A7F2;MODIFIER LETTER CAPITAL C;Lm;0;L;<super> 0043;;;;N;;;;;
+A7F3;MODIFIER LETTER CAPITAL F;Lm;0;L;<super> 0046;;;;N;;;;;
+A7F4;MODIFIER LETTER CAPITAL Q;Lm;0;L;<super> 0051;;;;N;;;;;
A7F5;LATIN CAPITAL LETTER REVERSED HALF H;Lu;0;L;;;;;N;;;;A7F6;
A7F6;LATIN SMALL LETTER REVERSED HALF H;Ll;0;L;;;;;N;;;A7F5;;A7F5
A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;;
@@ -15794,6 +15900,7 @@ FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;;
FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;;
FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;;
FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;;
+FBC2;ARABIC SYMBOL WASLA ABOVE;Sk;0;AL;;;;;N;;;;;
FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;;
FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;;
FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;;
@@ -16159,6 +16266,22 @@ FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;
FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;;
FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;;
FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;;
+FD40;ARABIC LIGATURE RAHIMAHU ALLAAH;So;0;ON;;;;;N;;;;;
+FD41;ARABIC LIGATURE RADI ALLAAHU ANH;So;0;ON;;;;;N;;;;;
+FD42;ARABIC LIGATURE RADI ALLAAHU ANHAA;So;0;ON;;;;;N;;;;;
+FD43;ARABIC LIGATURE RADI ALLAAHU ANHUM;So;0;ON;;;;;N;;;;;
+FD44;ARABIC LIGATURE RADI ALLAAHU ANHUMAA;So;0;ON;;;;;N;;;;;
+FD45;ARABIC LIGATURE RADI ALLAAHU ANHUNNA;So;0;ON;;;;;N;;;;;
+FD46;ARABIC LIGATURE SALLALLAAHU ALAYHI WA-AALIH;So;0;ON;;;;;N;;;;;
+FD47;ARABIC LIGATURE ALAYHI AS-SALAAM;So;0;ON;;;;;N;;;;;
+FD48;ARABIC LIGATURE ALAYHIM AS-SALAAM;So;0;ON;;;;;N;;;;;
+FD49;ARABIC LIGATURE ALAYHIMAA AS-SALAAM;So;0;ON;;;;;N;;;;;
+FD4A;ARABIC LIGATURE ALAYHI AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;;
+FD4B;ARABIC LIGATURE QUDDISA SIRRAH;So;0;ON;;;;;N;;;;;
+FD4C;ARABIC LIGATURE SALLALLAHU ALAYHI WAAALIHEE WA-SALLAM;So;0;ON;;;;;N;;;;;
+FD4D;ARABIC LIGATURE ALAYHAA AS-SALAAM;So;0;ON;;;;;N;;;;;
+FD4E;ARABIC LIGATURE TABAARAKA WA-TAAALAA;So;0;ON;;;;;N;;;;;
+FD4F;ARABIC LIGATURE RAHIMAHUM ALLAAH;So;0;ON;;;;;N;;;;;
FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;;
FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;;
FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;;
@@ -16277,6 +16400,7 @@ FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639
FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;;
FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;;
FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;;
+FDCF;ARABIC LIGATURE SALAAMUHU ALAYNAA;So;0;ON;;;;;N;;;;;
FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;;
FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;;
FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;;
@@ -16291,6 +16415,8 @@ FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 06
FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;;
FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
+FDFE;ARABIC LIGATURE SUBHAANAHU WA TAAALAA;So;0;ON;;;;;N;;;;;
+FDFF;ARABIC LIGATURE AZZA WA JALL;So;0;ON;;;;;N;;;;;
FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
@@ -17798,6 +17924,76 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;;
10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;;
1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;;
+10570;VITHKUQI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;10597;
+10571;VITHKUQI CAPITAL LETTER BBE;Lu;0;L;;;;;N;;;;10598;
+10572;VITHKUQI CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;10599;
+10573;VITHKUQI CAPITAL LETTER CE;Lu;0;L;;;;;N;;;;1059A;
+10574;VITHKUQI CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;1059B;
+10575;VITHKUQI CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;1059C;
+10576;VITHKUQI CAPITAL LETTER DHE;Lu;0;L;;;;;N;;;;1059D;
+10577;VITHKUQI CAPITAL LETTER EI;Lu;0;L;;;;;N;;;;1059E;
+10578;VITHKUQI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;1059F;
+10579;VITHKUQI CAPITAL LETTER FE;Lu;0;L;;;;;N;;;;105A0;
+1057A;VITHKUQI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;105A1;
+1057C;VITHKUQI CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;105A3;
+1057D;VITHKUQI CAPITAL LETTER HHA;Lu;0;L;;;;;N;;;;105A4;
+1057E;VITHKUQI CAPITAL LETTER I;Lu;0;L;;;;;N;;;;105A5;
+1057F;VITHKUQI CAPITAL LETTER IJE;Lu;0;L;;;;;N;;;;105A6;
+10580;VITHKUQI CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;105A7;
+10581;VITHKUQI CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;105A8;
+10582;VITHKUQI CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;105A9;
+10583;VITHKUQI CAPITAL LETTER LLA;Lu;0;L;;;;;N;;;;105AA;
+10584;VITHKUQI CAPITAL LETTER ME;Lu;0;L;;;;;N;;;;105AB;
+10585;VITHKUQI CAPITAL LETTER NE;Lu;0;L;;;;;N;;;;105AC;
+10586;VITHKUQI CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;105AD;
+10587;VITHKUQI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;105AE;
+10588;VITHKUQI CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;105AF;
+10589;VITHKUQI CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;105B0;
+1058A;VITHKUQI CAPITAL LETTER RE;Lu;0;L;;;;;N;;;;105B1;
+1058C;VITHKUQI CAPITAL LETTER SE;Lu;0;L;;;;;N;;;;105B3;
+1058D;VITHKUQI CAPITAL LETTER SHE;Lu;0;L;;;;;N;;;;105B4;
+1058E;VITHKUQI CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;105B5;
+1058F;VITHKUQI CAPITAL LETTER THE;Lu;0;L;;;;;N;;;;105B6;
+10590;VITHKUQI CAPITAL LETTER U;Lu;0;L;;;;;N;;;;105B7;
+10591;VITHKUQI CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;105B8;
+10592;VITHKUQI CAPITAL LETTER XE;Lu;0;L;;;;;N;;;;105B9;
+10594;VITHKUQI CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;105BB;
+10595;VITHKUQI CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;105BC;
+10597;VITHKUQI SMALL LETTER A;Ll;0;L;;;;;N;;;10570;;10570
+10598;VITHKUQI SMALL LETTER BBE;Ll;0;L;;;;;N;;;10571;;10571
+10599;VITHKUQI SMALL LETTER BE;Ll;0;L;;;;;N;;;10572;;10572
+1059A;VITHKUQI SMALL LETTER CE;Ll;0;L;;;;;N;;;10573;;10573
+1059B;VITHKUQI SMALL LETTER CHE;Ll;0;L;;;;;N;;;10574;;10574
+1059C;VITHKUQI SMALL LETTER DE;Ll;0;L;;;;;N;;;10575;;10575
+1059D;VITHKUQI SMALL LETTER DHE;Ll;0;L;;;;;N;;;10576;;10576
+1059E;VITHKUQI SMALL LETTER EI;Ll;0;L;;;;;N;;;10577;;10577
+1059F;VITHKUQI SMALL LETTER E;Ll;0;L;;;;;N;;;10578;;10578
+105A0;VITHKUQI SMALL LETTER FE;Ll;0;L;;;;;N;;;10579;;10579
+105A1;VITHKUQI SMALL LETTER GA;Ll;0;L;;;;;N;;;1057A;;1057A
+105A3;VITHKUQI SMALL LETTER HA;Ll;0;L;;;;;N;;;1057C;;1057C
+105A4;VITHKUQI SMALL LETTER HHA;Ll;0;L;;;;;N;;;1057D;;1057D
+105A5;VITHKUQI SMALL LETTER I;Ll;0;L;;;;;N;;;1057E;;1057E
+105A6;VITHKUQI SMALL LETTER IJE;Ll;0;L;;;;;N;;;1057F;;1057F
+105A7;VITHKUQI SMALL LETTER JE;Ll;0;L;;;;;N;;;10580;;10580
+105A8;VITHKUQI SMALL LETTER KA;Ll;0;L;;;;;N;;;10581;;10581
+105A9;VITHKUQI SMALL LETTER LA;Ll;0;L;;;;;N;;;10582;;10582
+105AA;VITHKUQI SMALL LETTER LLA;Ll;0;L;;;;;N;;;10583;;10583
+105AB;VITHKUQI SMALL LETTER ME;Ll;0;L;;;;;N;;;10584;;10584
+105AC;VITHKUQI SMALL LETTER NE;Ll;0;L;;;;;N;;;10585;;10585
+105AD;VITHKUQI SMALL LETTER NJE;Ll;0;L;;;;;N;;;10586;;10586
+105AE;VITHKUQI SMALL LETTER O;Ll;0;L;;;;;N;;;10587;;10587
+105AF;VITHKUQI SMALL LETTER PE;Ll;0;L;;;;;N;;;10588;;10588
+105B0;VITHKUQI SMALL LETTER QA;Ll;0;L;;;;;N;;;10589;;10589
+105B1;VITHKUQI SMALL LETTER RE;Ll;0;L;;;;;N;;;1058A;;1058A
+105B3;VITHKUQI SMALL LETTER SE;Ll;0;L;;;;;N;;;1058C;;1058C
+105B4;VITHKUQI SMALL LETTER SHE;Ll;0;L;;;;;N;;;1058D;;1058D
+105B5;VITHKUQI SMALL LETTER TE;Ll;0;L;;;;;N;;;1058E;;1058E
+105B6;VITHKUQI SMALL LETTER THE;Ll;0;L;;;;;N;;;1058F;;1058F
+105B7;VITHKUQI SMALL LETTER U;Ll;0;L;;;;;N;;;10590;;10590
+105B8;VITHKUQI SMALL LETTER VE;Ll;0;L;;;;;N;;;10591;;10591
+105B9;VITHKUQI SMALL LETTER XE;Ll;0;L;;;;;N;;;10592;;10592
+105BB;VITHKUQI SMALL LETTER Y;Ll;0;L;;;;;N;;;10594;;10594
+105BC;VITHKUQI SMALL LETTER ZE;Ll;0;L;;;;;N;;;10595;;10595
10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;;
10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;;
10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;;
@@ -18139,6 +18335,63 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;;
10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;;
10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;;
+10780;MODIFIER LETTER SMALL CAPITAL AA;Lm;0;L;;;;;N;;;;;
+10781;MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON;Lm;0;L;<super> 02D0;;;;N;;;;;
+10782;MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON;Lm;0;L;<super> 02D1;;;;N;;;;;
+10783;MODIFIER LETTER SMALL AE;Lm;0;L;<super> 00E6;;;;N;;;;;
+10784;MODIFIER LETTER SMALL CAPITAL B;Lm;0;L;<super> 0299;;;;N;;;;;
+10785;MODIFIER LETTER SMALL B WITH HOOK;Lm;0;L;<super> 0253;;;;N;;;;;
+10787;MODIFIER LETTER SMALL DZ DIGRAPH;Lm;0;L;<super> 02A3;;;;N;;;;;
+10788;MODIFIER LETTER SMALL DZ DIGRAPH WITH RETROFLEX HOOK;Lm;0;L;<super> AB66;;;;N;;;;;
+10789;MODIFIER LETTER SMALL DZ DIGRAPH WITH CURL;Lm;0;L;<super> 02A5;;;;N;;;;;
+1078A;MODIFIER LETTER SMALL DEZH DIGRAPH;Lm;0;L;<super> 02A4;;;;N;;;;;
+1078B;MODIFIER LETTER SMALL D WITH TAIL;Lm;0;L;<super> 0256;;;;N;;;;;
+1078C;MODIFIER LETTER SMALL D WITH HOOK;Lm;0;L;<super> 0257;;;;N;;;;;
+1078D;MODIFIER LETTER SMALL D WITH HOOK AND TAIL;Lm;0;L;<super> 1D91;;;;N;;;;;
+1078E;MODIFIER LETTER SMALL REVERSED E;Lm;0;L;<super> 0258;;;;N;;;;;
+1078F;MODIFIER LETTER SMALL CLOSED REVERSED OPEN E;Lm;0;L;<super> 025E;;;;N;;;;;
+10790;MODIFIER LETTER SMALL FENG DIGRAPH;Lm;0;L;<super> 02A9;;;;N;;;;;
+10791;MODIFIER LETTER SMALL RAMS HORN;Lm;0;L;<super> 0264;;;;N;;;;;
+10792;MODIFIER LETTER SMALL CAPITAL G;Lm;0;L;<super> 0262;;;;N;;;;;
+10793;MODIFIER LETTER SMALL G WITH HOOK;Lm;0;L;<super> 0260;;;;N;;;;;
+10794;MODIFIER LETTER SMALL CAPITAL G WITH HOOK;Lm;0;L;<super> 029B;;;;N;;;;;
+10795;MODIFIER LETTER SMALL H WITH STROKE;Lm;0;L;<super> 0127;;;;N;;;;;
+10796;MODIFIER LETTER SMALL CAPITAL H;Lm;0;L;<super> 029C;;;;N;;;;;
+10797;MODIFIER LETTER SMALL HENG WITH HOOK;Lm;0;L;<super> 0267;;;;N;;;;;
+10798;MODIFIER LETTER SMALL DOTLESS J WITH STROKE AND HOOK;Lm;0;L;<super> 0284;;;;N;;;;;
+10799;MODIFIER LETTER SMALL LS DIGRAPH;Lm;0;L;<super> 02AA;;;;N;;;;;
+1079A;MODIFIER LETTER SMALL LZ DIGRAPH;Lm;0;L;<super> 02AB;;;;N;;;;;
+1079B;MODIFIER LETTER SMALL L WITH BELT;Lm;0;L;<super> 026C;;;;N;;;;;
+1079C;MODIFIER LETTER SMALL CAPITAL L WITH BELT;Lm;0;L;<super> 1DF04;;;;N;;;;;
+1079D;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK AND BELT;Lm;0;L;<super> A78E;;;;N;;;;;
+1079E;MODIFIER LETTER SMALL LEZH;Lm;0;L;<super> 026E;;;;N;;;;;
+1079F;MODIFIER LETTER SMALL LEZH WITH RETROFLEX HOOK;Lm;0;L;<super> 1DF05;;;;N;;;;;
+107A0;MODIFIER LETTER SMALL TURNED Y;Lm;0;L;<super> 028E;;;;N;;;;;
+107A1;MODIFIER LETTER SMALL TURNED Y WITH BELT;Lm;0;L;<super> 1DF06;;;;N;;;;;
+107A2;MODIFIER LETTER SMALL O WITH STROKE;Lm;0;L;<super> 00F8;;;;N;;;;;
+107A3;MODIFIER LETTER SMALL CAPITAL OE;Lm;0;L;<super> 0276;;;;N;;;;;
+107A4;MODIFIER LETTER SMALL CLOSED OMEGA;Lm;0;L;<super> 0277;;;;N;;;;;
+107A5;MODIFIER LETTER SMALL Q;Lm;0;L;<super> 0071;;;;N;;;;;
+107A6;MODIFIER LETTER SMALL TURNED R WITH LONG LEG;Lm;0;L;<super> 027A;;;;N;;;;;
+107A7;MODIFIER LETTER SMALL TURNED R WITH LONG LEG AND RETROFLEX HOOK;Lm;0;L;<super> 1DF08;;;;N;;;;;
+107A8;MODIFIER LETTER SMALL R WITH TAIL;Lm;0;L;<super> 027D;;;;N;;;;;
+107A9;MODIFIER LETTER SMALL R WITH FISHHOOK;Lm;0;L;<super> 027E;;;;N;;;;;
+107AA;MODIFIER LETTER SMALL CAPITAL R;Lm;0;L;<super> 0280;;;;N;;;;;
+107AB;MODIFIER LETTER SMALL TC DIGRAPH WITH CURL;Lm;0;L;<super> 02A8;;;;N;;;;;
+107AC;MODIFIER LETTER SMALL TS DIGRAPH;Lm;0;L;<super> 02A6;;;;N;;;;;
+107AD;MODIFIER LETTER SMALL TS DIGRAPH WITH RETROFLEX HOOK;Lm;0;L;<super> AB67;;;;N;;;;;
+107AE;MODIFIER LETTER SMALL TESH DIGRAPH;Lm;0;L;<super> 02A7;;;;N;;;;;
+107AF;MODIFIER LETTER SMALL T WITH RETROFLEX HOOK;Lm;0;L;<super> 0288;;;;N;;;;;
+107B0;MODIFIER LETTER SMALL V WITH RIGHT HOOK;Lm;0;L;<super> 2C71;;;;N;;;;;
+107B2;MODIFIER LETTER SMALL CAPITAL Y;Lm;0;L;<super> 028F;;;;N;;;;;
+107B3;MODIFIER LETTER GLOTTAL STOP WITH STROKE;Lm;0;L;<super> 02A1;;;;N;;;;;
+107B4;MODIFIER LETTER REVERSED GLOTTAL STOP WITH STROKE;Lm;0;L;<super> 02A2;;;;N;;;;;
+107B5;MODIFIER LETTER BILABIAL CLICK;Lm;0;L;<super> 0298;;;;N;;;;;
+107B6;MODIFIER LETTER DENTAL CLICK;Lm;0;L;<super> 01C0;;;;N;;;;;
+107B7;MODIFIER LETTER LATERAL CLICK;Lm;0;L;<super> 01C1;;;;N;;;;;
+107B8;MODIFIER LETTER ALVEOLAR CLICK;Lm;0;L;<super> 01C2;;;;N;;;;;
+107B9;MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lm;0;L;<super> 1DF0A;;;;N;;;;;
+107BA;MODIFIER LETTER SMALL S WITH CURL;Lm;0;L;<super> 1DF1E;;;;N;;;;;
10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
@@ -19222,6 +19475,32 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;;
10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;;
+10F70;OLD UYGHUR LETTER ALEPH;Lo;0;R;;;;;N;;;;;
+10F71;OLD UYGHUR LETTER BETH;Lo;0;R;;;;;N;;;;;
+10F72;OLD UYGHUR LETTER GIMEL-HETH;Lo;0;R;;;;;N;;;;;
+10F73;OLD UYGHUR LETTER WAW;Lo;0;R;;;;;N;;;;;
+10F74;OLD UYGHUR LETTER ZAYIN;Lo;0;R;;;;;N;;;;;
+10F75;OLD UYGHUR LETTER FINAL HETH;Lo;0;R;;;;;N;;;;;
+10F76;OLD UYGHUR LETTER YODH;Lo;0;R;;;;;N;;;;;
+10F77;OLD UYGHUR LETTER KAPH;Lo;0;R;;;;;N;;;;;
+10F78;OLD UYGHUR LETTER LAMEDH;Lo;0;R;;;;;N;;;;;
+10F79;OLD UYGHUR LETTER MEM;Lo;0;R;;;;;N;;;;;
+10F7A;OLD UYGHUR LETTER NUN;Lo;0;R;;;;;N;;;;;
+10F7B;OLD UYGHUR LETTER SAMEKH;Lo;0;R;;;;;N;;;;;
+10F7C;OLD UYGHUR LETTER PE;Lo;0;R;;;;;N;;;;;
+10F7D;OLD UYGHUR LETTER SADHE;Lo;0;R;;;;;N;;;;;
+10F7E;OLD UYGHUR LETTER RESH;Lo;0;R;;;;;N;;;;;
+10F7F;OLD UYGHUR LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10F80;OLD UYGHUR LETTER TAW;Lo;0;R;;;;;N;;;;;
+10F81;OLD UYGHUR LETTER LESH;Lo;0;R;;;;;N;;;;;
+10F82;OLD UYGHUR COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F83;OLD UYGHUR COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10F84;OLD UYGHUR COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;;
+10F85;OLD UYGHUR COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;;
+10F86;OLD UYGHUR PUNCTUATION BAR;Po;0;R;;;;;N;;;;;
+10F87;OLD UYGHUR PUNCTUATION TWO BARS;Po;0;R;;;;;N;;;;;
+10F88;OLD UYGHUR PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;;
+10F89;OLD UYGHUR PUNCTUATION FOUR DOTS;Po;0;R;;;;;N;;;;;
10FB0;CHORASMIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;;
10FB1;CHORASMIAN LETTER SMALL ALEPH;Lo;0;R;;;;;N;;;;;
10FB2;CHORASMIAN LETTER BETH;Lo;0;R;;;;;N;;;;;
@@ -19381,6 +19660,12 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+11070;BRAHMI SIGN OLD TAMIL VIRAMA;Mn;9;NSM;;;;;N;;;;;
+11071;BRAHMI LETTER OLD TAMIL SHORT E;Lo;0;L;;;;;N;;;;;
+11072;BRAHMI LETTER OLD TAMIL SHORT O;Lo;0;L;;;;;N;;;;;
+11073;BRAHMI VOWEL SIGN OLD TAMIL SHORT E;Mn;0;NSM;;;;;N;;;;;
+11074;BRAHMI VOWEL SIGN OLD TAMIL SHORT O;Mn;0;NSM;;;;;N;;;;;
+11075;BRAHMI LETTER OLD TAMIL LLA;Lo;0;L;;;;;N;;;;;
1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;;
11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;;
11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
@@ -19448,6 +19733,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;;
110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;;
110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+110C2;KAITHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
110CD;KAITHI NUMBER SIGN ABOVE;Cf;0;L;;;;;N;;;;;
110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;;
110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;;
@@ -20385,6 +20671,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;;
116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
116B8;TAKRI LETTER ARCHAIC KHA;Lo;0;L;;;;;N;;;;;
+116B9;TAKRI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;;
116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
@@ -20453,6 +20740,13 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;;
1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;;
1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;;
+11740;AHOM LETTER CA;Lo;0;L;;;;;N;;;;;
+11741;AHOM LETTER TTA;Lo;0;L;;;;;N;;;;;
+11742;AHOM LETTER TTHA;Lo;0;L;;;;;N;;;;;
+11743;AHOM LETTER DDA;Lo;0;L;;;;;N;;;;;
+11744;AHOM LETTER DDHA;Lo;0;L;;;;;N;;;;;
+11745;AHOM LETTER NNA;Lo;0;L;;;;;N;;;;;
+11746;AHOM LETTER LLA;Lo;0;L;;;;;N;;;;;
11800;DOGRA LETTER A;Lo;0;L;;;;;N;;;;;
11801;DOGRA LETTER AA;Lo;0;L;;;;;N;;;;;
11802;DOGRA LETTER I;Lo;0;L;;;;;N;;;;;
@@ -20889,6 +21183,22 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;;
11AA1;SOYOMBO TERMINAL MARK-1;Po;0;L;;;;;N;;;;;
11AA2;SOYOMBO TERMINAL MARK-2;Po;0;L;;;;;N;;;;;
+11AB0;CANADIAN SYLLABICS NATTILIK HI;Lo;0;L;;;;;N;;;;;
+11AB1;CANADIAN SYLLABICS NATTILIK HII;Lo;0;L;;;;;N;;;;;
+11AB2;CANADIAN SYLLABICS NATTILIK HO;Lo;0;L;;;;;N;;;;;
+11AB3;CANADIAN SYLLABICS NATTILIK HOO;Lo;0;L;;;;;N;;;;;
+11AB4;CANADIAN SYLLABICS NATTILIK HA;Lo;0;L;;;;;N;;;;;
+11AB5;CANADIAN SYLLABICS NATTILIK HAA;Lo;0;L;;;;;N;;;;;
+11AB6;CANADIAN SYLLABICS NATTILIK SHRI;Lo;0;L;;;;;N;;;;;
+11AB7;CANADIAN SYLLABICS NATTILIK SHRII;Lo;0;L;;;;;N;;;;;
+11AB8;CANADIAN SYLLABICS NATTILIK SHRO;Lo;0;L;;;;;N;;;;;
+11AB9;CANADIAN SYLLABICS NATTILIK SHROO;Lo;0;L;;;;;N;;;;;
+11ABA;CANADIAN SYLLABICS NATTILIK SHRA;Lo;0;L;;;;;N;;;;;
+11ABB;CANADIAN SYLLABICS NATTILIK SHRAA;Lo;0;L;;;;;N;;;;;
+11ABC;CANADIAN SYLLABICS SPE;Lo;0;L;;;;;N;;;;;
+11ABD;CANADIAN SYLLABICS SPI;Lo;0;L;;;;;N;;;;;
+11ABE;CANADIAN SYLLABICS SPO;Lo;0;L;;;;;N;;;;;
+11ABF;CANADIAN SYLLABICS SPA;Lo;0;L;;;;;N;;;;;
11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;;
11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;;
11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;;
@@ -22560,6 +22870,105 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;;
12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;;
12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;;
+12F90;CYPRO-MINOAN SIGN CM001;Lo;0;L;;;;;N;;;;;
+12F91;CYPRO-MINOAN SIGN CM002;Lo;0;L;;;;;N;;;;;
+12F92;CYPRO-MINOAN SIGN CM004;Lo;0;L;;;;;N;;;;;
+12F93;CYPRO-MINOAN SIGN CM005;Lo;0;L;;;;;N;;;;;
+12F94;CYPRO-MINOAN SIGN CM006;Lo;0;L;;;;;N;;;;;
+12F95;CYPRO-MINOAN SIGN CM007;Lo;0;L;;;;;N;;;;;
+12F96;CYPRO-MINOAN SIGN CM008;Lo;0;L;;;;;N;;;;;
+12F97;CYPRO-MINOAN SIGN CM009;Lo;0;L;;;;;N;;;;;
+12F98;CYPRO-MINOAN SIGN CM010;Lo;0;L;;;;;N;;;;;
+12F99;CYPRO-MINOAN SIGN CM011;Lo;0;L;;;;;N;;;;;
+12F9A;CYPRO-MINOAN SIGN CM012;Lo;0;L;;;;;N;;;;;
+12F9B;CYPRO-MINOAN SIGN CM012B;Lo;0;L;;;;;N;;;;;
+12F9C;CYPRO-MINOAN SIGN CM013;Lo;0;L;;;;;N;;;;;
+12F9D;CYPRO-MINOAN SIGN CM015;Lo;0;L;;;;;N;;;;;
+12F9E;CYPRO-MINOAN SIGN CM017;Lo;0;L;;;;;N;;;;;
+12F9F;CYPRO-MINOAN SIGN CM019;Lo;0;L;;;;;N;;;;;
+12FA0;CYPRO-MINOAN SIGN CM021;Lo;0;L;;;;;N;;;;;
+12FA1;CYPRO-MINOAN SIGN CM023;Lo;0;L;;;;;N;;;;;
+12FA2;CYPRO-MINOAN SIGN CM024;Lo;0;L;;;;;N;;;;;
+12FA3;CYPRO-MINOAN SIGN CM025;Lo;0;L;;;;;N;;;;;
+12FA4;CYPRO-MINOAN SIGN CM026;Lo;0;L;;;;;N;;;;;
+12FA5;CYPRO-MINOAN SIGN CM027;Lo;0;L;;;;;N;;;;;
+12FA6;CYPRO-MINOAN SIGN CM028;Lo;0;L;;;;;N;;;;;
+12FA7;CYPRO-MINOAN SIGN CM029;Lo;0;L;;;;;N;;;;;
+12FA8;CYPRO-MINOAN SIGN CM030;Lo;0;L;;;;;N;;;;;
+12FA9;CYPRO-MINOAN SIGN CM033;Lo;0;L;;;;;N;;;;;
+12FAA;CYPRO-MINOAN SIGN CM034;Lo;0;L;;;;;N;;;;;
+12FAB;CYPRO-MINOAN SIGN CM035;Lo;0;L;;;;;N;;;;;
+12FAC;CYPRO-MINOAN SIGN CM036;Lo;0;L;;;;;N;;;;;
+12FAD;CYPRO-MINOAN SIGN CM037;Lo;0;L;;;;;N;;;;;
+12FAE;CYPRO-MINOAN SIGN CM038;Lo;0;L;;;;;N;;;;;
+12FAF;CYPRO-MINOAN SIGN CM039;Lo;0;L;;;;;N;;;;;
+12FB0;CYPRO-MINOAN SIGN CM040;Lo;0;L;;;;;N;;;;;
+12FB1;CYPRO-MINOAN SIGN CM041;Lo;0;L;;;;;N;;;;;
+12FB2;CYPRO-MINOAN SIGN CM044;Lo;0;L;;;;;N;;;;;
+12FB3;CYPRO-MINOAN SIGN CM046;Lo;0;L;;;;;N;;;;;
+12FB4;CYPRO-MINOAN SIGN CM047;Lo;0;L;;;;;N;;;;;
+12FB5;CYPRO-MINOAN SIGN CM049;Lo;0;L;;;;;N;;;;;
+12FB6;CYPRO-MINOAN SIGN CM050;Lo;0;L;;;;;N;;;;;
+12FB7;CYPRO-MINOAN SIGN CM051;Lo;0;L;;;;;N;;;;;
+12FB8;CYPRO-MINOAN SIGN CM052;Lo;0;L;;;;;N;;;;;
+12FB9;CYPRO-MINOAN SIGN CM053;Lo;0;L;;;;;N;;;;;
+12FBA;CYPRO-MINOAN SIGN CM054;Lo;0;L;;;;;N;;;;;
+12FBB;CYPRO-MINOAN SIGN CM055;Lo;0;L;;;;;N;;;;;
+12FBC;CYPRO-MINOAN SIGN CM056;Lo;0;L;;;;;N;;;;;
+12FBD;CYPRO-MINOAN SIGN CM058;Lo;0;L;;;;;N;;;;;
+12FBE;CYPRO-MINOAN SIGN CM059;Lo;0;L;;;;;N;;;;;
+12FBF;CYPRO-MINOAN SIGN CM060;Lo;0;L;;;;;N;;;;;
+12FC0;CYPRO-MINOAN SIGN CM061;Lo;0;L;;;;;N;;;;;
+12FC1;CYPRO-MINOAN SIGN CM062;Lo;0;L;;;;;N;;;;;
+12FC2;CYPRO-MINOAN SIGN CM063;Lo;0;L;;;;;N;;;;;
+12FC3;CYPRO-MINOAN SIGN CM064;Lo;0;L;;;;;N;;;;;
+12FC4;CYPRO-MINOAN SIGN CM066;Lo;0;L;;;;;N;;;;;
+12FC5;CYPRO-MINOAN SIGN CM067;Lo;0;L;;;;;N;;;;;
+12FC6;CYPRO-MINOAN SIGN CM068;Lo;0;L;;;;;N;;;;;
+12FC7;CYPRO-MINOAN SIGN CM069;Lo;0;L;;;;;N;;;;;
+12FC8;CYPRO-MINOAN SIGN CM070;Lo;0;L;;;;;N;;;;;
+12FC9;CYPRO-MINOAN SIGN CM071;Lo;0;L;;;;;N;;;;;
+12FCA;CYPRO-MINOAN SIGN CM072;Lo;0;L;;;;;N;;;;;
+12FCB;CYPRO-MINOAN SIGN CM073;Lo;0;L;;;;;N;;;;;
+12FCC;CYPRO-MINOAN SIGN CM074;Lo;0;L;;;;;N;;;;;
+12FCD;CYPRO-MINOAN SIGN CM075;Lo;0;L;;;;;N;;;;;
+12FCE;CYPRO-MINOAN SIGN CM075B;Lo;0;L;;;;;N;;;;;
+12FCF;CYPRO-MINOAN SIGN CM076;Lo;0;L;;;;;N;;;;;
+12FD0;CYPRO-MINOAN SIGN CM078;Lo;0;L;;;;;N;;;;;
+12FD1;CYPRO-MINOAN SIGN CM079;Lo;0;L;;;;;N;;;;;
+12FD2;CYPRO-MINOAN SIGN CM080;Lo;0;L;;;;;N;;;;;
+12FD3;CYPRO-MINOAN SIGN CM081;Lo;0;L;;;;;N;;;;;
+12FD4;CYPRO-MINOAN SIGN CM082;Lo;0;L;;;;;N;;;;;
+12FD5;CYPRO-MINOAN SIGN CM083;Lo;0;L;;;;;N;;;;;
+12FD6;CYPRO-MINOAN SIGN CM084;Lo;0;L;;;;;N;;;;;
+12FD7;CYPRO-MINOAN SIGN CM085;Lo;0;L;;;;;N;;;;;
+12FD8;CYPRO-MINOAN SIGN CM086;Lo;0;L;;;;;N;;;;;
+12FD9;CYPRO-MINOAN SIGN CM087;Lo;0;L;;;;;N;;;;;
+12FDA;CYPRO-MINOAN SIGN CM088;Lo;0;L;;;;;N;;;;;
+12FDB;CYPRO-MINOAN SIGN CM089;Lo;0;L;;;;;N;;;;;
+12FDC;CYPRO-MINOAN SIGN CM090;Lo;0;L;;;;;N;;;;;
+12FDD;CYPRO-MINOAN SIGN CM091;Lo;0;L;;;;;N;;;;;
+12FDE;CYPRO-MINOAN SIGN CM092;Lo;0;L;;;;;N;;;;;
+12FDF;CYPRO-MINOAN SIGN CM094;Lo;0;L;;;;;N;;;;;
+12FE0;CYPRO-MINOAN SIGN CM095;Lo;0;L;;;;;N;;;;;
+12FE1;CYPRO-MINOAN SIGN CM096;Lo;0;L;;;;;N;;;;;
+12FE2;CYPRO-MINOAN SIGN CM097;Lo;0;L;;;;;N;;;;;
+12FE3;CYPRO-MINOAN SIGN CM098;Lo;0;L;;;;;N;;;;;
+12FE4;CYPRO-MINOAN SIGN CM099;Lo;0;L;;;;;N;;;;;
+12FE5;CYPRO-MINOAN SIGN CM100;Lo;0;L;;;;;N;;;;;
+12FE6;CYPRO-MINOAN SIGN CM101;Lo;0;L;;;;;N;;;;;
+12FE7;CYPRO-MINOAN SIGN CM102;Lo;0;L;;;;;N;;;;;
+12FE8;CYPRO-MINOAN SIGN CM103;Lo;0;L;;;;;N;;;;;
+12FE9;CYPRO-MINOAN SIGN CM104;Lo;0;L;;;;;N;;;;;
+12FEA;CYPRO-MINOAN SIGN CM105;Lo;0;L;;;;;N;;;;;
+12FEB;CYPRO-MINOAN SIGN CM107;Lo;0;L;;;;;N;;;;;
+12FEC;CYPRO-MINOAN SIGN CM108;Lo;0;L;;;;;N;;;;;
+12FED;CYPRO-MINOAN SIGN CM109;Lo;0;L;;;;;N;;;;;
+12FEE;CYPRO-MINOAN SIGN CM110;Lo;0;L;;;;;N;;;;;
+12FEF;CYPRO-MINOAN SIGN CM112;Lo;0;L;;;;;N;;;;;
+12FF0;CYPRO-MINOAN SIGN CM114;Lo;0;L;;;;;N;;;;;
+12FF1;CYPRO-MINOAN SIGN CM301;Po;0;L;;;;;N;;;;;
+12FF2;CYPRO-MINOAN SIGN CM302;Po;0;L;;;;;N;;;;;
13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;;
13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;;
13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;;
@@ -24835,6 +25244,95 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
16A6E;MRO DANDA;Po;0;L;;;;;N;;;;;
16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;;
+16A70;TANGSA LETTER OZ;Lo;0;L;;;;;N;;;;;
+16A71;TANGSA LETTER OC;Lo;0;L;;;;;N;;;;;
+16A72;TANGSA LETTER OQ;Lo;0;L;;;;;N;;;;;
+16A73;TANGSA LETTER OX;Lo;0;L;;;;;N;;;;;
+16A74;TANGSA LETTER AZ;Lo;0;L;;;;;N;;;;;
+16A75;TANGSA LETTER AC;Lo;0;L;;;;;N;;;;;
+16A76;TANGSA LETTER AQ;Lo;0;L;;;;;N;;;;;
+16A77;TANGSA LETTER AX;Lo;0;L;;;;;N;;;;;
+16A78;TANGSA LETTER VZ;Lo;0;L;;;;;N;;;;;
+16A79;TANGSA LETTER VC;Lo;0;L;;;;;N;;;;;
+16A7A;TANGSA LETTER VQ;Lo;0;L;;;;;N;;;;;
+16A7B;TANGSA LETTER VX;Lo;0;L;;;;;N;;;;;
+16A7C;TANGSA LETTER EZ;Lo;0;L;;;;;N;;;;;
+16A7D;TANGSA LETTER EC;Lo;0;L;;;;;N;;;;;
+16A7E;TANGSA LETTER EQ;Lo;0;L;;;;;N;;;;;
+16A7F;TANGSA LETTER EX;Lo;0;L;;;;;N;;;;;
+16A80;TANGSA LETTER IZ;Lo;0;L;;;;;N;;;;;
+16A81;TANGSA LETTER IC;Lo;0;L;;;;;N;;;;;
+16A82;TANGSA LETTER IQ;Lo;0;L;;;;;N;;;;;
+16A83;TANGSA LETTER IX;Lo;0;L;;;;;N;;;;;
+16A84;TANGSA LETTER UZ;Lo;0;L;;;;;N;;;;;
+16A85;TANGSA LETTER UC;Lo;0;L;;;;;N;;;;;
+16A86;TANGSA LETTER UQ;Lo;0;L;;;;;N;;;;;
+16A87;TANGSA LETTER UX;Lo;0;L;;;;;N;;;;;
+16A88;TANGSA LETTER AWZ;Lo;0;L;;;;;N;;;;;
+16A89;TANGSA LETTER AWC;Lo;0;L;;;;;N;;;;;
+16A8A;TANGSA LETTER AWQ;Lo;0;L;;;;;N;;;;;
+16A8B;TANGSA LETTER AWX;Lo;0;L;;;;;N;;;;;
+16A8C;TANGSA LETTER UIZ;Lo;0;L;;;;;N;;;;;
+16A8D;TANGSA LETTER UIC;Lo;0;L;;;;;N;;;;;
+16A8E;TANGSA LETTER UIQ;Lo;0;L;;;;;N;;;;;
+16A8F;TANGSA LETTER UIX;Lo;0;L;;;;;N;;;;;
+16A90;TANGSA LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+16A91;TANGSA LETTER LONG UEX;Lo;0;L;;;;;N;;;;;
+16A92;TANGSA LETTER SHORT UEZ;Lo;0;L;;;;;N;;;;;
+16A93;TANGSA LETTER SHORT AWX;Lo;0;L;;;;;N;;;;;
+16A94;TANGSA LETTER UEC;Lo;0;L;;;;;N;;;;;
+16A95;TANGSA LETTER UEZ;Lo;0;L;;;;;N;;;;;
+16A96;TANGSA LETTER UEQ;Lo;0;L;;;;;N;;;;;
+16A97;TANGSA LETTER UEX;Lo;0;L;;;;;N;;;;;
+16A98;TANGSA LETTER UIUZ;Lo;0;L;;;;;N;;;;;
+16A99;TANGSA LETTER UIUC;Lo;0;L;;;;;N;;;;;
+16A9A;TANGSA LETTER UIUQ;Lo;0;L;;;;;N;;;;;
+16A9B;TANGSA LETTER UIUX;Lo;0;L;;;;;N;;;;;
+16A9C;TANGSA LETTER MZ;Lo;0;L;;;;;N;;;;;
+16A9D;TANGSA LETTER MC;Lo;0;L;;;;;N;;;;;
+16A9E;TANGSA LETTER MQ;Lo;0;L;;;;;N;;;;;
+16A9F;TANGSA LETTER MX;Lo;0;L;;;;;N;;;;;
+16AA0;TANGSA LETTER KA;Lo;0;L;;;;;N;;;;;
+16AA1;TANGSA LETTER KHA;Lo;0;L;;;;;N;;;;;
+16AA2;TANGSA LETTER GA;Lo;0;L;;;;;N;;;;;
+16AA3;TANGSA LETTER NGA;Lo;0;L;;;;;N;;;;;
+16AA4;TANGSA LETTER SA;Lo;0;L;;;;;N;;;;;
+16AA5;TANGSA LETTER YA;Lo;0;L;;;;;N;;;;;
+16AA6;TANGSA LETTER WA;Lo;0;L;;;;;N;;;;;
+16AA7;TANGSA LETTER PA;Lo;0;L;;;;;N;;;;;
+16AA8;TANGSA LETTER NYA;Lo;0;L;;;;;N;;;;;
+16AA9;TANGSA LETTER PHA;Lo;0;L;;;;;N;;;;;
+16AAA;TANGSA LETTER BA;Lo;0;L;;;;;N;;;;;
+16AAB;TANGSA LETTER MA;Lo;0;L;;;;;N;;;;;
+16AAC;TANGSA LETTER NA;Lo;0;L;;;;;N;;;;;
+16AAD;TANGSA LETTER HA;Lo;0;L;;;;;N;;;;;
+16AAE;TANGSA LETTER LA;Lo;0;L;;;;;N;;;;;
+16AAF;TANGSA LETTER HTA;Lo;0;L;;;;;N;;;;;
+16AB0;TANGSA LETTER TA;Lo;0;L;;;;;N;;;;;
+16AB1;TANGSA LETTER DA;Lo;0;L;;;;;N;;;;;
+16AB2;TANGSA LETTER RA;Lo;0;L;;;;;N;;;;;
+16AB3;TANGSA LETTER NHA;Lo;0;L;;;;;N;;;;;
+16AB4;TANGSA LETTER SHA;Lo;0;L;;;;;N;;;;;
+16AB5;TANGSA LETTER CA;Lo;0;L;;;;;N;;;;;
+16AB6;TANGSA LETTER TSA;Lo;0;L;;;;;N;;;;;
+16AB7;TANGSA LETTER GHA;Lo;0;L;;;;;N;;;;;
+16AB8;TANGSA LETTER HTTA;Lo;0;L;;;;;N;;;;;
+16AB9;TANGSA LETTER THA;Lo;0;L;;;;;N;;;;;
+16ABA;TANGSA LETTER XA;Lo;0;L;;;;;N;;;;;
+16ABB;TANGSA LETTER FA;Lo;0;L;;;;;N;;;;;
+16ABC;TANGSA LETTER DHA;Lo;0;L;;;;;N;;;;;
+16ABD;TANGSA LETTER CHA;Lo;0;L;;;;;N;;;;;
+16ABE;TANGSA LETTER ZA;Lo;0;L;;;;;N;;;;;
+16AC0;TANGSA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+16AC1;TANGSA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+16AC2;TANGSA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+16AC3;TANGSA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+16AC4;TANGSA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+16AC5;TANGSA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+16AC6;TANGSA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+16AC7;TANGSA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+16AC8;TANGSA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+16AC9;TANGSA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;;
16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;;
16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;;
@@ -26487,6 +26985,19 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
18CD5;KHITAN SMALL SCRIPT CHARACTER-18CD5;Lo;0;L;;;;;N;;;;;
18D00;<Tangut Ideograph Supplement, First>;Lo;0;L;;;;;N;;;;;
18D08;<Tangut Ideograph Supplement, Last>;Lo;0;L;;;;;N;;;;;
+1AFF0;KATAKANA LETTER MINNAN TONE-2;Lm;0;L;;;;;N;;;;;
+1AFF1;KATAKANA LETTER MINNAN TONE-3;Lm;0;L;;;;;N;;;;;
+1AFF2;KATAKANA LETTER MINNAN TONE-4;Lm;0;L;;;;;N;;;;;
+1AFF3;KATAKANA LETTER MINNAN TONE-5;Lm;0;L;;;;;N;;;;;
+1AFF5;KATAKANA LETTER MINNAN TONE-7;Lm;0;L;;;;;N;;;;;
+1AFF6;KATAKANA LETTER MINNAN TONE-8;Lm;0;L;;;;;N;;;;;
+1AFF7;KATAKANA LETTER MINNAN NASALIZED TONE-1;Lm;0;L;;;;;N;;;;;
+1AFF8;KATAKANA LETTER MINNAN NASALIZED TONE-2;Lm;0;L;;;;;N;;;;;
+1AFF9;KATAKANA LETTER MINNAN NASALIZED TONE-3;Lm;0;L;;;;;N;;;;;
+1AFFA;KATAKANA LETTER MINNAN NASALIZED TONE-4;Lm;0;L;;;;;N;;;;;
+1AFFB;KATAKANA LETTER MINNAN NASALIZED TONE-5;Lm;0;L;;;;;N;;;;;
+1AFFD;KATAKANA LETTER MINNAN NASALIZED TONE-7;Lm;0;L;;;;;N;;;;;
+1AFFE;KATAKANA LETTER MINNAN NASALIZED TONE-8;Lm;0;L;;;;;N;;;;;
1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;;
1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;;
1B002;HENTAIGANA LETTER A-1;Lo;0;L;;;;;N;;;;;
@@ -26774,6 +27285,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;;
1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;;
1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;;
+1B11F;HIRAGANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;;
+1B120;KATAKANA LETTER ARCHAIC YI;Lo;0;L;;;;;N;;;;;
+1B121;KATAKANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;;
+1B122;KATAKANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;;
1B150;HIRAGANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;;
1B151;HIRAGANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;;
1B152;HIRAGANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;;
@@ -27324,6 +27839,191 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;;
1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;;
1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;;
+1CF00;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF01;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF02;ZNAMENNY COMBINING MARK TSATA ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF03;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF04;ZNAMENNY COMBINING MARK NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF05;ZNAMENNY COMBINING MARK SREDNE ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF06;ZNAMENNY COMBINING MARK MALO POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF07;ZNAMENNY COMBINING MARK POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF08;ZNAMENNY COMBINING MARK VYSOKO ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF09;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF0A;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF0B;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF0C;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF0D;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF0E;ZNAMENNY COMBINING MARK TSATA ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF0F;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF10;ZNAMENNY COMBINING MARK NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF11;ZNAMENNY COMBINING MARK SREDNE ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF12;ZNAMENNY COMBINING MARK MALO POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF13;ZNAMENNY COMBINING MARK POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF14;ZNAMENNY COMBINING MARK VYSOKO ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF15;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF16;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF17;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;;
+1CF18;ZNAMENNY COMBINING MARK TSATA S KRYZHEM;Mn;0;NSM;;;;;N;;;;;
+1CF19;ZNAMENNY COMBINING MARK MALO POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;;
+1CF1A;ZNAMENNY COMBINING MARK STRANNO MALO POVYSHE;Mn;0;NSM;;;;;N;;;;;
+1CF1B;ZNAMENNY COMBINING MARK POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;;
+1CF1C;ZNAMENNY COMBINING MARK POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;;
+1CF1D;ZNAMENNY COMBINING MARK VYSOKO S KRYZHEM;Mn;0;NSM;;;;;N;;;;;
+1CF1E;ZNAMENNY COMBINING MARK MALO POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;;
+1CF1F;ZNAMENNY COMBINING MARK GORAZDO VYSOKO;Mn;0;NSM;;;;;N;;;;;
+1CF20;ZNAMENNY COMBINING MARK ZELO;Mn;0;NSM;;;;;N;;;;;
+1CF21;ZNAMENNY COMBINING MARK ON;Mn;0;NSM;;;;;N;;;;;
+1CF22;ZNAMENNY COMBINING MARK RAVNO;Mn;0;NSM;;;;;N;;;;;
+1CF23;ZNAMENNY COMBINING MARK TIKHAYA;Mn;0;NSM;;;;;N;;;;;
+1CF24;ZNAMENNY COMBINING MARK BORZAYA;Mn;0;NSM;;;;;N;;;;;
+1CF25;ZNAMENNY COMBINING MARK UDARKA;Mn;0;NSM;;;;;N;;;;;
+1CF26;ZNAMENNY COMBINING MARK PODVERTKA;Mn;0;NSM;;;;;N;;;;;
+1CF27;ZNAMENNY COMBINING MARK LOMKA;Mn;0;NSM;;;;;N;;;;;
+1CF28;ZNAMENNY COMBINING MARK KUPNAYA;Mn;0;NSM;;;;;N;;;;;
+1CF29;ZNAMENNY COMBINING MARK KACHKA;Mn;0;NSM;;;;;N;;;;;
+1CF2A;ZNAMENNY COMBINING MARK ZEVOK;Mn;0;NSM;;;;;N;;;;;
+1CF2B;ZNAMENNY COMBINING MARK SKOBA;Mn;0;NSM;;;;;N;;;;;
+1CF2C;ZNAMENNY COMBINING MARK RAZSEKA;Mn;0;NSM;;;;;N;;;;;
+1CF2D;ZNAMENNY COMBINING MARK KRYZH ON LEFT;Mn;0;NSM;;;;;N;;;;;
+1CF30;ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO;Mn;0;NSM;;;;;N;;;;;
+1CF31;ZNAMENNY COMBINING TONAL RANGE MARK SVETLO;Mn;0;NSM;;;;;N;;;;;
+1CF32;ZNAMENNY COMBINING TONAL RANGE MARK TRESVETLO;Mn;0;NSM;;;;;N;;;;;
+1CF33;ZNAMENNY COMBINING MARK ZADERZHKA;Mn;0;NSM;;;;;N;;;;;
+1CF34;ZNAMENNY COMBINING MARK DEMESTVENNY ZADERZHKA;Mn;0;NSM;;;;;N;;;;;
+1CF35;ZNAMENNY COMBINING MARK OTSECHKA;Mn;0;NSM;;;;;N;;;;;
+1CF36;ZNAMENNY COMBINING MARK PODCHASHIE;Mn;0;NSM;;;;;N;;;;;
+1CF37;ZNAMENNY COMBINING MARK PODCHASHIE WITH VERTICAL STROKE;Mn;0;NSM;;;;;N;;;;;
+1CF38;ZNAMENNY COMBINING MARK CHASHKA;Mn;0;NSM;;;;;N;;;;;
+1CF39;ZNAMENNY COMBINING MARK CHASHKA POLNAYA;Mn;0;NSM;;;;;N;;;;;
+1CF3A;ZNAMENNY COMBINING MARK OBLACHKO;Mn;0;NSM;;;;;N;;;;;
+1CF3B;ZNAMENNY COMBINING MARK SOROCHYA NOZHKA;Mn;0;NSM;;;;;N;;;;;
+1CF3C;ZNAMENNY COMBINING MARK TOCHKA;Mn;0;NSM;;;;;N;;;;;
+1CF3D;ZNAMENNY COMBINING MARK DVOETOCHIE;Mn;0;NSM;;;;;N;;;;;
+1CF3E;ZNAMENNY COMBINING ATTACHING VERTICAL OMET;Mn;0;NSM;;;;;N;;;;;
+1CF3F;ZNAMENNY COMBINING MARK CURVED OMET;Mn;0;NSM;;;;;N;;;;;
+1CF40;ZNAMENNY COMBINING MARK KRYZH;Mn;0;NSM;;;;;N;;;;;
+1CF41;ZNAMENNY COMBINING LOWER TONAL RANGE INDICATOR;Mn;0;NSM;;;;;N;;;;;
+1CF42;ZNAMENNY PRIZNAK MODIFIER LEVEL-2;Mn;0;NSM;;;;;N;;;;;
+1CF43;ZNAMENNY PRIZNAK MODIFIER LEVEL-3;Mn;0;NSM;;;;;N;;;;;
+1CF44;ZNAMENNY PRIZNAK MODIFIER DIRECTION FLIP;Mn;0;NSM;;;;;N;;;;;
+1CF45;ZNAMENNY PRIZNAK MODIFIER KRYZH;Mn;0;NSM;;;;;N;;;;;
+1CF46;ZNAMENNY PRIZNAK MODIFIER ROG;Mn;0;NSM;;;;;N;;;;;
+1CF50;ZNAMENNY NEUME KRYUK;So;0;L;;;;;N;;;;;
+1CF51;ZNAMENNY NEUME KRYUK TIKHY;So;0;L;;;;;N;;;;;
+1CF52;ZNAMENNY NEUME PARAKLIT;So;0;L;;;;;N;;;;;
+1CF53;ZNAMENNY NEUME DVA V CHELNU;So;0;L;;;;;N;;;;;
+1CF54;ZNAMENNY NEUME KLYUCH;So;0;L;;;;;N;;;;;
+1CF55;ZNAMENNY NEUME ZANOZHEK;So;0;L;;;;;N;;;;;
+1CF56;ZNAMENNY NEUME STOPITSA;So;0;L;;;;;N;;;;;
+1CF57;ZNAMENNY NEUME STOPITSA S OCHKOM;So;0;L;;;;;N;;;;;
+1CF58;ZNAMENNY NEUME PEREVODKA;So;0;L;;;;;N;;;;;
+1CF59;ZNAMENNY NEUME PEREVODKA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;;
+1CF5A;ZNAMENNY NEUME STOPITSA WITH SOROCHYA NOZHKA;So;0;L;;;;;N;;;;;
+1CF5B;ZNAMENNY NEUME CHELYUSTKA;So;0;L;;;;;N;;;;;
+1CF5C;ZNAMENNY NEUME PALKA;So;0;L;;;;;N;;;;;
+1CF5D;ZNAMENNY NEUME ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CF5E;ZNAMENNY NEUME GOLUBCHIK BORZY;So;0;L;;;;;N;;;;;
+1CF5F;ZNAMENNY NEUME GOLUBCHIK TIKHY;So;0;L;;;;;N;;;;;
+1CF60;ZNAMENNY NEUME GOLUBCHIK MRACHNY;So;0;L;;;;;N;;;;;
+1CF61;ZNAMENNY NEUME GOLUBCHIK SVETLY;So;0;L;;;;;N;;;;;
+1CF62;ZNAMENNY NEUME GOLUBCHIK TRESVETLY;So;0;L;;;;;N;;;;;
+1CF63;ZNAMENNY NEUME VRAKHIYA PROSTAYA;So;0;L;;;;;N;;;;;
+1CF64;ZNAMENNY NEUME VRAKHIYA MRACHNAYA;So;0;L;;;;;N;;;;;
+1CF65;ZNAMENNY NEUME VRAKHIYA SVETLAYA;So;0;L;;;;;N;;;;;
+1CF66;ZNAMENNY NEUME VRAKHIYA TRESVETLAYA;So;0;L;;;;;N;;;;;
+1CF67;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA PROSTAYA;So;0;L;;;;;N;;;;;
+1CF68;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA MRACHNAYA;So;0;L;;;;;N;;;;;
+1CF69;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;;
+1CF6A;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA TRESVETLAYA;So;0;L;;;;;N;;;;;
+1CF6B;ZNAMENNY NEUME DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CF6C;ZNAMENNY NEUME REVERSED CHELYUSTKA;So;0;L;;;;;N;;;;;
+1CF6D;ZNAMENNY NEUME DERBITSA;So;0;L;;;;;N;;;;;
+1CF6E;ZNAMENNY NEUME KHAMILO;So;0;L;;;;;N;;;;;
+1CF6F;ZNAMENNY NEUME CHASHKA;So;0;L;;;;;N;;;;;
+1CF70;ZNAMENNY NEUME PODCHASHIE;So;0;L;;;;;N;;;;;
+1CF71;ZNAMENNY NEUME SKAMEYTSA MRACHNAYA;So;0;L;;;;;N;;;;;
+1CF72;ZNAMENNY NEUME SKAMEYTSA SVETLAYA;So;0;L;;;;;N;;;;;
+1CF73;ZNAMENNY NEUME SKAMEYTSA TRESVETLAYA;So;0;L;;;;;N;;;;;
+1CF74;ZNAMENNY NEUME SKAMEYTSA TIKHAYA;So;0;L;;;;;N;;;;;
+1CF75;ZNAMENNY NEUME DEMESTVENNY KLYUCH;So;0;L;;;;;N;;;;;
+1CF76;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;;
+1CF77;ZNAMENNY NEUME SKAMEYTSA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;;
+1CF78;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA TIKHAYA;So;0;L;;;;;N;;;;;
+1CF79;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA PROSTAYA;So;0;L;;;;;N;;;;;
+1CF7A;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA SVETLAYA;So;0;L;;;;;N;;;;;
+1CF7B;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;;
+1CF7C;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;;
+1CF7D;ZNAMENNY NEUME SLOZHITIE;So;0;L;;;;;N;;;;;
+1CF7E;ZNAMENNY NEUME SLOZHITIE S ZAPYATOY;So;0;L;;;;;N;;;;;
+1CF7F;ZNAMENNY NEUME SLOZHITIE ZAKRYTOE;So;0;L;;;;;N;;;;;
+1CF80;ZNAMENNY NEUME SLOZHITIE S KRYZHEM;So;0;L;;;;;N;;;;;
+1CF81;ZNAMENNY NEUME KRYZH;So;0;L;;;;;N;;;;;
+1CF82;ZNAMENNY NEUME ROG;So;0;L;;;;;N;;;;;
+1CF83;ZNAMENNY NEUME FITA;So;0;L;;;;;N;;;;;
+1CF84;ZNAMENNY NEUME KOBYLA;So;0;L;;;;;N;;;;;
+1CF85;ZNAMENNY NEUME ZMEYTSA;So;0;L;;;;;N;;;;;
+1CF86;ZNAMENNY NEUME STATYA;So;0;L;;;;;N;;;;;
+1CF87;ZNAMENNY NEUME STATYA S ZAPYATOY;So;0;L;;;;;N;;;;;
+1CF88;ZNAMENNY NEUME STATYA S KRYZHEM;So;0;L;;;;;N;;;;;
+1CF89;ZNAMENNY NEUME STATYA S ZAPYATOY I KRYZHEM;So;0;L;;;;;N;;;;;
+1CF8A;ZNAMENNY NEUME STATYA S KRYZHEM I ZAPYATOY;So;0;L;;;;;N;;;;;
+1CF8B;ZNAMENNY NEUME STATYA ZAKRYTAYA;So;0;L;;;;;N;;;;;
+1CF8C;ZNAMENNY NEUME STATYA ZAKRYTAYA S ZAPYATOY;So;0;L;;;;;N;;;;;
+1CF8D;ZNAMENNY NEUME STATYA S ROGOM;So;0;L;;;;;N;;;;;
+1CF8E;ZNAMENNY NEUME STATYA S DVUMYA ZAPYATYMI;So;0;L;;;;;N;;;;;
+1CF8F;ZNAMENNY NEUME STATYA S ZAPYATOY I PODCHASHIEM;So;0;L;;;;;N;;;;;
+1CF90;ZNAMENNY NEUME POLKULIZMY;So;0;L;;;;;N;;;;;
+1CF91;ZNAMENNY NEUME STATYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;;
+1CF92;ZNAMENNY NEUME STRELA PROSTAYA;So;0;L;;;;;N;;;;;
+1CF93;ZNAMENNY NEUME STRELA MRACHNOTIKHAYA;So;0;L;;;;;N;;;;;
+1CF94;ZNAMENNY NEUME STRELA KRYZHEVAYA;So;0;L;;;;;N;;;;;
+1CF95;ZNAMENNY NEUME STRELA POLUPOVODNAYA;So;0;L;;;;;N;;;;;
+1CF96;ZNAMENNY NEUME STRELA POVODNAYA;So;0;L;;;;;N;;;;;
+1CF97;ZNAMENNY NEUME STRELA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;;
+1CF98;ZNAMENNY NEUME STRELA KLYUCHEPOVODNAYA;So;0;L;;;;;N;;;;;
+1CF99;ZNAMENNY NEUME STRELA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;;
+1CF9A;ZNAMENNY NEUME STRELA TIKHAYA PUTNAYA;So;0;L;;;;;N;;;;;
+1CF9B;ZNAMENNY NEUME STRELA DVOECHELNAYA;So;0;L;;;;;N;;;;;
+1CF9C;ZNAMENNY NEUME STRELA DVOECHELNOKRYZHEVAYA;So;0;L;;;;;N;;;;;
+1CF9D;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA;So;0;L;;;;;N;;;;;
+1CF9E;ZNAMENNY NEUME STRELA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;;
+1CF9F;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;;
+1CFA0;ZNAMENNY NEUME STRELA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CFA1;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CFA2;ZNAMENNY NEUME STRELA GROMNAYA;So;0;L;;;;;N;;;;;
+1CFA3;ZNAMENNY NEUME STRELA GROMOPOVODNAYA;So;0;L;;;;;N;;;;;
+1CFA4;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CFA5;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;;
+1CFA6;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;;
+1CFA7;ZNAMENNY NEUME MECHIK;So;0;L;;;;;N;;;;;
+1CFA8;ZNAMENNY NEUME MECHIK POVODNY;So;0;L;;;;;N;;;;;
+1CFA9;ZNAMENNY NEUME MECHIK KLYUCHEVOY;So;0;L;;;;;N;;;;;
+1CFAA;ZNAMENNY NEUME MECHIK KLYUCHEPOVODNY;So;0;L;;;;;N;;;;;
+1CFAB;ZNAMENNY NEUME MECHIK KLYUCHENEPOSTOYANNY;So;0;L;;;;;N;;;;;
+1CFAC;ZNAMENNY NEUME STRELA TRYASOGLASNAYA;So;0;L;;;;;N;;;;;
+1CFAD;ZNAMENNY NEUME STRELA TRYASOPOVODNAYA;So;0;L;;;;;N;;;;;
+1CFAE;ZNAMENNY NEUME STRELA TRYASOSTRELNAYA;So;0;L;;;;;N;;;;;
+1CFAF;ZNAMENNY NEUME OSOKA;So;0;L;;;;;N;;;;;
+1CFB0;ZNAMENNY NEUME OSOKA SVETLAYA;So;0;L;;;;;N;;;;;
+1CFB1;ZNAMENNY NEUME OSOKA TRESVETLAYA;So;0;L;;;;;N;;;;;
+1CFB2;ZNAMENNY NEUME OSOKA KRYUKOVAYA SVETLAYA;So;0;L;;;;;N;;;;;
+1CFB3;ZNAMENNY NEUME OSOKA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;;
+1CFB4;ZNAMENNY NEUME OSOKA KLYUCHEVAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;;
+1CFB5;ZNAMENNY NEUME STRELA KRYUKOVAYA;So;0;L;;;;;N;;;;;
+1CFB6;ZNAMENNY NEUME STRELA KRYUKOVAYA POVODNAYA;So;0;L;;;;;N;;;;;
+1CFB7;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CFB8;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CFB9;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA;So;0;L;;;;;N;;;;;
+1CFBA;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA;So;0;L;;;;;N;;;;;
+1CFBB;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;;
+1CFBC;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;;
+1CFBD;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;;
+1CFBE;ZNAMENNY NEUME STRELA KRYUKOVAYA TRYASKA;So;0;L;;;;;N;;;;;
+1CFBF;ZNAMENNY NEUME KUFISMA;So;0;L;;;;;N;;;;;
+1CFC0;ZNAMENNY NEUME OBLAKO;So;0;L;;;;;N;;;;;
+1CFC1;ZNAMENNY NEUME DUDA;So;0;L;;;;;N;;;;;
+1CFC2;ZNAMENNY NEUME NEMKA;So;0;L;;;;;N;;;;;
+1CFC3;ZNAMENNY NEUME PAUK;So;0;L;;;;;N;;;;;
1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
@@ -27801,6 +28501,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;;
1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;;
1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;;
+1D1E9;MUSICAL SYMBOL SORI;So;0;ON;;;;;N;;;;;
+1D1EA;MUSICAL SYMBOL KORON;So;0;ON;;;;;N;;;;;
1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
@@ -29671,6 +30373,37 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;;
1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;;
1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;;
+1DF00;LATIN SMALL LETTER FENG DIGRAPH WITH TRILL;Ll;0;L;;;;;N;;;;;
+1DF01;LATIN SMALL LETTER REVERSED SCRIPT G;Ll;0;L;;;;;N;;;;;
+1DF02;LATIN LETTER SMALL CAPITAL TURNED G;Ll;0;L;;;;;N;;;;;
+1DF03;LATIN SMALL LETTER REVERSED K;Ll;0;L;;;;;N;;;;;
+1DF04;LATIN LETTER SMALL CAPITAL L WITH BELT;Ll;0;L;;;;;N;;;;;
+1DF05;LATIN SMALL LETTER LEZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF06;LATIN SMALL LETTER TURNED Y WITH BELT;Ll;0;L;;;;;N;;;;;
+1DF07;LATIN SMALL LETTER REVERSED ENG;Ll;0;L;;;;;N;;;;;
+1DF08;LATIN SMALL LETTER TURNED R WITH LONG LEG AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF09;LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF0A;LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lo;0;L;;;;;N;;;;;
+1DF0B;LATIN SMALL LETTER ESH WITH DOUBLE BAR;Ll;0;L;;;;;N;;;;;
+1DF0C;LATIN SMALL LETTER ESH WITH DOUBLE BAR AND CURL;Ll;0;L;;;;;N;;;;;
+1DF0D;LATIN SMALL LETTER TURNED T WITH CURL;Ll;0;L;;;;;N;;;;;
+1DF0E;LATIN LETTER INVERTED GLOTTAL STOP WITH CURL;Ll;0;L;;;;;N;;;;;
+1DF0F;LATIN LETTER STRETCHED C WITH CURL;Ll;0;L;;;;;N;;;;;
+1DF10;LATIN LETTER SMALL CAPITAL TURNED K;Ll;0;L;;;;;N;;;;;
+1DF11;LATIN SMALL LETTER L WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
+1DF12;LATIN SMALL LETTER DEZH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1DF13;LATIN SMALL LETTER L WITH BELT AND PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1DF14;LATIN SMALL LETTER ENG WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1DF15;LATIN SMALL LETTER TURNED R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1DF16;LATIN SMALL LETTER R WITH FISHHOOK AND PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1DF17;LATIN SMALL LETTER TESH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1DF18;LATIN SMALL LETTER EZH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1DF19;LATIN SMALL LETTER DEZH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF1A;LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF1B;LATIN SMALL LETTER O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF1C;LATIN SMALL LETTER TESH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF1D;LATIN SMALL LETTER C WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1DF1E;LATIN SMALL LETTER S WITH CURL;Ll;0;L;;;;;N;;;;;
1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;;
1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;;
1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;;
@@ -29780,6 +30513,37 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1E149;NYIAKENG PUACHUE HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
1E14E;NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ;Lo;0;L;;;;;N;;;;;
1E14F;NYIAKENG PUACHUE HMONG CIRCLED CA;So;0;L;;;;;N;;;;;
+1E290;TOTO LETTER PA;Lo;0;L;;;;;N;;;;;
+1E291;TOTO LETTER BA;Lo;0;L;;;;;N;;;;;
+1E292;TOTO LETTER TA;Lo;0;L;;;;;N;;;;;
+1E293;TOTO LETTER DA;Lo;0;L;;;;;N;;;;;
+1E294;TOTO LETTER KA;Lo;0;L;;;;;N;;;;;
+1E295;TOTO LETTER GA;Lo;0;L;;;;;N;;;;;
+1E296;TOTO LETTER MA;Lo;0;L;;;;;N;;;;;
+1E297;TOTO LETTER NA;Lo;0;L;;;;;N;;;;;
+1E298;TOTO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1E299;TOTO LETTER SA;Lo;0;L;;;;;N;;;;;
+1E29A;TOTO LETTER CHA;Lo;0;L;;;;;N;;;;;
+1E29B;TOTO LETTER YA;Lo;0;L;;;;;N;;;;;
+1E29C;TOTO LETTER WA;Lo;0;L;;;;;N;;;;;
+1E29D;TOTO LETTER JA;Lo;0;L;;;;;N;;;;;
+1E29E;TOTO LETTER HA;Lo;0;L;;;;;N;;;;;
+1E29F;TOTO LETTER RA;Lo;0;L;;;;;N;;;;;
+1E2A0;TOTO LETTER LA;Lo;0;L;;;;;N;;;;;
+1E2A1;TOTO LETTER I;Lo;0;L;;;;;N;;;;;
+1E2A2;TOTO LETTER BREATHY I;Lo;0;L;;;;;N;;;;;
+1E2A3;TOTO LETTER IU;Lo;0;L;;;;;N;;;;;
+1E2A4;TOTO LETTER BREATHY IU;Lo;0;L;;;;;N;;;;;
+1E2A5;TOTO LETTER U;Lo;0;L;;;;;N;;;;;
+1E2A6;TOTO LETTER E;Lo;0;L;;;;;N;;;;;
+1E2A7;TOTO LETTER BREATHY E;Lo;0;L;;;;;N;;;;;
+1E2A8;TOTO LETTER EO;Lo;0;L;;;;;N;;;;;
+1E2A9;TOTO LETTER BREATHY EO;Lo;0;L;;;;;N;;;;;
+1E2AA;TOTO LETTER O;Lo;0;L;;;;;N;;;;;
+1E2AB;TOTO LETTER AE;Lo;0;L;;;;;N;;;;;
+1E2AC;TOTO LETTER BREATHY AE;Lo;0;L;;;;;N;;;;;
+1E2AD;TOTO LETTER A;Lo;0;L;;;;;N;;;;;
+1E2AE;TOTO SIGN RISING TONE;Mn;230;NSM;;;;;N;;;;;
1E2C0;WANCHO LETTER AA;Lo;0;L;;;;;N;;;;;
1E2C1;WANCHO LETTER A;Lo;0;L;;;;;N;;;;;
1E2C2;WANCHO LETTER BA;Lo;0;L;;;;;N;;;;;
@@ -29839,6 +30603,34 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1E2F8;WANCHO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
1E2F9;WANCHO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
1E2FF;WANCHO NGUN SIGN;Sc;0;ET;;;;;N;;;;;
+1E7E0;ETHIOPIC SYLLABLE HHYA;Lo;0;L;;;;;N;;;;;
+1E7E1;ETHIOPIC SYLLABLE HHYU;Lo;0;L;;;;;N;;;;;
+1E7E2;ETHIOPIC SYLLABLE HHYI;Lo;0;L;;;;;N;;;;;
+1E7E3;ETHIOPIC SYLLABLE HHYAA;Lo;0;L;;;;;N;;;;;
+1E7E4;ETHIOPIC SYLLABLE HHYEE;Lo;0;L;;;;;N;;;;;
+1E7E5;ETHIOPIC SYLLABLE HHYE;Lo;0;L;;;;;N;;;;;
+1E7E6;ETHIOPIC SYLLABLE HHYO;Lo;0;L;;;;;N;;;;;
+1E7E8;ETHIOPIC SYLLABLE GURAGE HHWA;Lo;0;L;;;;;N;;;;;
+1E7E9;ETHIOPIC SYLLABLE HHWI;Lo;0;L;;;;;N;;;;;
+1E7EA;ETHIOPIC SYLLABLE HHWEE;Lo;0;L;;;;;N;;;;;
+1E7EB;ETHIOPIC SYLLABLE HHWE;Lo;0;L;;;;;N;;;;;
+1E7ED;ETHIOPIC SYLLABLE GURAGE MWI;Lo;0;L;;;;;N;;;;;
+1E7EE;ETHIOPIC SYLLABLE GURAGE MWEE;Lo;0;L;;;;;N;;;;;
+1E7F0;ETHIOPIC SYLLABLE GURAGE QWI;Lo;0;L;;;;;N;;;;;
+1E7F1;ETHIOPIC SYLLABLE GURAGE QWEE;Lo;0;L;;;;;N;;;;;
+1E7F2;ETHIOPIC SYLLABLE GURAGE QWE;Lo;0;L;;;;;N;;;;;
+1E7F3;ETHIOPIC SYLLABLE GURAGE BWI;Lo;0;L;;;;;N;;;;;
+1E7F4;ETHIOPIC SYLLABLE GURAGE BWEE;Lo;0;L;;;;;N;;;;;
+1E7F5;ETHIOPIC SYLLABLE GURAGE KWI;Lo;0;L;;;;;N;;;;;
+1E7F6;ETHIOPIC SYLLABLE GURAGE KWEE;Lo;0;L;;;;;N;;;;;
+1E7F7;ETHIOPIC SYLLABLE GURAGE KWE;Lo;0;L;;;;;N;;;;;
+1E7F8;ETHIOPIC SYLLABLE GURAGE GWI;Lo;0;L;;;;;N;;;;;
+1E7F9;ETHIOPIC SYLLABLE GURAGE GWEE;Lo;0;L;;;;;N;;;;;
+1E7FA;ETHIOPIC SYLLABLE GURAGE GWE;Lo;0;L;;;;;N;;;;;
+1E7FB;ETHIOPIC SYLLABLE GURAGE FWI;Lo;0;L;;;;;N;;;;;
+1E7FC;ETHIOPIC SYLLABLE GURAGE FWEE;Lo;0;L;;;;;N;;;;;
+1E7FD;ETHIOPIC SYLLABLE GURAGE PWI;Lo;0;L;;;;;N;;;;;
+1E7FE;ETHIOPIC SYLLABLE GURAGE PWEE;Lo;0;L;;;;;N;;;;;
1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;;
1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;;
1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;;
@@ -31886,6 +32678,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F6D5;HINDU TEMPLE;So;0;ON;;;;;N;;;;;
1F6D6;HUT;So;0;ON;;;;;N;;;;;
1F6D7;ELEVATOR;So;0;ON;;;;;N;;;;;
+1F6DD;PLAYGROUND SLIDE;So;0;ON;;;;;N;;;;;
+1F6DE;WHEEL;So;0;ON;;;;;N;;;;;
+1F6DF;RING BUOY;So;0;ON;;;;;N;;;;;
1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;;
1F6E1;SHIELD;So;0;ON;;;;;N;;;;;
1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;;
@@ -32129,6 +32924,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F7E9;LARGE GREEN SQUARE;So;0;ON;;;;;N;;;;;
1F7EA;LARGE PURPLE SQUARE;So;0;ON;;;;;N;;;;;
1F7EB;LARGE BROWN SQUARE;So;0;ON;;;;;N;;;;;
+1F7F0;HEAVY EQUALS SIGN;So;0;ON;;;;;N;;;;;
1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;;
@@ -32400,6 +33196,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F976;FREEZING FACE;So;0;ON;;;;;N;;;;;
1F977;NINJA;So;0;ON;;;;;N;;;;;
1F978;DISGUISED FACE;So;0;ON;;;;;N;;;;;
+1F979;FACE HOLDING BACK TEARS;So;0;ON;;;;;N;;;;;
1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;;
1F97B;SARI;So;0;ON;;;;;N;;;;;
1F97C;LAB COAT;So;0;ON;;;;;N;;;;;
@@ -32482,6 +33279,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1F9C9;MATE DRINK;So;0;ON;;;;;N;;;;;
1F9CA;ICE CUBE;So;0;ON;;;;;N;;;;;
1F9CB;BUBBLE TEA;So;0;ON;;;;;N;;;;;
+1F9CC;TROLL;So;0;ON;;;;;N;;;;;
1F9CD;STANDING PERSON;So;0;ON;;;;;N;;;;;
1F9CE;KNEELING PERSON;So;0;ON;;;;;N;;;;;
1F9CF;DEAF PERSON;So;0;ON;;;;;N;;;;;
@@ -32639,6 +33437,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1FA78;DROP OF BLOOD;So;0;ON;;;;;N;;;;;
1FA79;ADHESIVE BANDAGE;So;0;ON;;;;;N;;;;;
1FA7A;STETHOSCOPE;So;0;ON;;;;;N;;;;;
+1FA7B;X-RAY;So;0;ON;;;;;N;;;;;
+1FA7C;CRUTCH;So;0;ON;;;;;N;;;;;
1FA80;YO-YO;So;0;ON;;;;;N;;;;;
1FA81;KITE;So;0;ON;;;;;N;;;;;
1FA82;PARACHUTE;So;0;ON;;;;;N;;;;;
@@ -32671,6 +33471,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1FAA6;HEADSTONE;So;0;ON;;;;;N;;;;;
1FAA7;PLACARD;So;0;ON;;;;;N;;;;;
1FAA8;ROCK;So;0;ON;;;;;N;;;;;
+1FAA9;MIRROR BALL;So;0;ON;;;;;N;;;;;
+1FAAA;IDENTIFICATION CARD;So;0;ON;;;;;N;;;;;
+1FAAB;LOW BATTERY;So;0;ON;;;;;N;;;;;
+1FAAC;HAMSA;So;0;ON;;;;;N;;;;;
1FAB0;FLY;So;0;ON;;;;;N;;;;;
1FAB1;WORM;So;0;ON;;;;;N;;;;;
1FAB2;BEETLE;So;0;ON;;;;;N;;;;;
@@ -32678,9 +33482,16 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1FAB4;POTTED PLANT;So;0;ON;;;;;N;;;;;
1FAB5;WOOD;So;0;ON;;;;;N;;;;;
1FAB6;FEATHER;So;0;ON;;;;;N;;;;;
+1FAB7;LOTUS;So;0;ON;;;;;N;;;;;
+1FAB8;CORAL;So;0;ON;;;;;N;;;;;
+1FAB9;EMPTY NEST;So;0;ON;;;;;N;;;;;
+1FABA;NEST WITH EGGS;So;0;ON;;;;;N;;;;;
1FAC0;ANATOMICAL HEART;So;0;ON;;;;;N;;;;;
1FAC1;LUNGS;So;0;ON;;;;;N;;;;;
1FAC2;PEOPLE HUGGING;So;0;ON;;;;;N;;;;;
+1FAC3;PREGNANT MAN;So;0;ON;;;;;N;;;;;
+1FAC4;PREGNANT PERSON;So;0;ON;;;;;N;;;;;
+1FAC5;PERSON WITH CROWN;So;0;ON;;;;;N;;;;;
1FAD0;BLUEBERRIES;So;0;ON;;;;;N;;;;;
1FAD1;BELL PEPPER;So;0;ON;;;;;N;;;;;
1FAD2;OLIVE;So;0;ON;;;;;N;;;;;
@@ -32688,6 +33499,24 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1FAD4;TAMALE;So;0;ON;;;;;N;;;;;
1FAD5;FONDUE;So;0;ON;;;;;N;;;;;
1FAD6;TEAPOT;So;0;ON;;;;;N;;;;;
+1FAD7;POURING LIQUID;So;0;ON;;;;;N;;;;;
+1FAD8;BEANS;So;0;ON;;;;;N;;;;;
+1FAD9;JAR;So;0;ON;;;;;N;;;;;
+1FAE0;MELTING FACE;So;0;ON;;;;;N;;;;;
+1FAE1;SALUTING FACE;So;0;ON;;;;;N;;;;;
+1FAE2;FACE WITH OPEN EYES AND HAND OVER MOUTH;So;0;ON;;;;;N;;;;;
+1FAE3;FACE WITH PEEKING EYE;So;0;ON;;;;;N;;;;;
+1FAE4;FACE WITH DIAGONAL MOUTH;So;0;ON;;;;;N;;;;;
+1FAE5;DOTTED LINE FACE;So;0;ON;;;;;N;;;;;
+1FAE6;BITING LIP;So;0;ON;;;;;N;;;;;
+1FAE7;BUBBLES;So;0;ON;;;;;N;;;;;
+1FAF0;HAND WITH INDEX FINGER AND THUMB CROSSED;So;0;ON;;;;;N;;;;;
+1FAF1;RIGHTWARDS HAND;So;0;ON;;;;;N;;;;;
+1FAF2;LEFTWARDS HAND;So;0;ON;;;;;N;;;;;
+1FAF3;PALM DOWN HAND;So;0;ON;;;;;N;;;;;
+1FAF4;PALM UP HAND;So;0;ON;;;;;N;;;;;
+1FAF5;INDEX POINTING AT THE VIEWER;So;0;ON;;;;;N;;;;;
+1FAF6;HEART HANDS;So;0;ON;;;;;N;;;;;
1FB00;BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;;
1FB01;BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;;
1FB02;BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;;
@@ -32901,9 +33730,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
1FBF8;SEGMENTED DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
1FBF9;SEGMENTED DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
-2A6DD;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
+2A6DF;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;;
-2B734;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;;
+2B738;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;;
2B740;<CJK Ideograph Extension D, First>;Lo;0;L;;;;;N;;;;;
2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;;
2B820;<CJK Ideograph Extension E, First>;Lo;0;L;;;;;N;;;;;
diff --git a/lib/stdlib/uc_spec/emoji-data.txt b/lib/stdlib/uc_spec/emoji-data.txt
index 5d7dc1b156..7806c7ab53 100644
--- a/lib/stdlib/uc_spec/emoji-data.txt
+++ b/lib/stdlib/uc_spec/emoji-data.txt
@@ -1,11 +1,11 @@
-# emoji-data.txt
-# Date: 2020-01-28, 20:52:38 GMT
-# © 2020 Unicode®, Inc.
+# emoji-data-14.0.0.txt
+# Date: 2021-08-26, 17:22:22 GMT
+# © 2021 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Emoji Data for UTS #51
-# Version: 13.0
+# Used with Emoji Version 14.0 and subsequent minor revisions (if any)
#
# For documentation and usage, see http://www.unicode.org/reports/tr51
#
@@ -22,7 +22,7 @@
# All omitted code points have Emoji=No
# @missing: 0000..10FFFF ; Emoji ; No
-0023 ; Emoji # E0.0 [1] (#ï¸) number sign
+0023 ; Emoji # E0.0 [1] (#ï¸) hash sign
002A ; Emoji # E0.0 [1] (*ï¸) asterisk
0030..0039 ; Emoji # E0.0 [10] (0ï¸..9ï¸) digit zero..digit nine
00A9 ; Emoji # E0.6 [1] (©ï¸) copyright
@@ -119,8 +119,8 @@
2747 ; Emoji # E0.6 [1] (â‡ï¸) sparkle
274C ; Emoji # E0.6 [1] (âŒ) cross mark
274E ; Emoji # E0.6 [1] (âŽ) cross mark button
-2753..2755 ; Emoji # E0.6 [3] (â“..â•) question mark..white exclamation mark
-2757 ; Emoji # E0.6 [1] (â—) exclamation mark
+2753..2755 ; Emoji # E0.6 [3] (â“..â•) red question mark..white exclamation mark
+2757 ; Emoji # E0.6 [1] (â—) red exclamation mark
2763 ; Emoji # E1.0 [1] (â£ï¸) heart exclamation
2764 ; Emoji # E0.6 [1] (â¤ï¸) red heart
2795..2797 ; Emoji # E0.6 [3] (âž•..âž—) plus..divide
@@ -239,7 +239,7 @@
1F509 ; Emoji # E1.0 [1] (🔉) speaker medium volume
1F50A..1F514 ; Emoji # E0.6 [11] (🔊..🔔) speaker high volume..bell
1F515 ; Emoji # E1.0 [1] (🔕) bell with slash
-1F516..1F52B ; Emoji # E0.6 [22] (🔖..🔫) bookmark..pistol
+1F516..1F52B ; Emoji # E0.6 [22] (🔖..🔫) bookmark..water pistol
1F52C..1F52D ; Emoji # E1.0 [2] (🔬..🔭) microscope..telescope
1F52E..1F53D ; Emoji # E0.6 [16] (🔮..🔽) crystal ball..downwards button
1F549..1F54A ; Emoji # E0.7 [2] (🕉ï¸..🕊ï¸) om..dove
@@ -294,7 +294,7 @@
1F62E..1F62F ; Emoji # E1.0 [2] (😮..😯) face with open mouth..hushed face
1F630..1F633 ; Emoji # E0.6 [4] (😰..😳) anxious face with sweat..flushed face
1F634 ; Emoji # E1.0 [1] (😴) sleeping face
-1F635 ; Emoji # E0.6 [1] (😵) dizzy face
+1F635 ; Emoji # E0.6 [1] (😵) face with crossed-out eyes
1F636 ; Emoji # E1.0 [1] (😶) face without mouth
1F637..1F640 ; Emoji # E0.6 [10] (😷..🙀) face with medical mask..weary cat
1F641..1F644 ; Emoji # E1.0 [4] (ðŸ™..🙄) slightly frowning face..face with rolling eyes
@@ -341,6 +341,7 @@
1F6D1..1F6D2 ; Emoji # E3.0 [2] (🛑..🛒) stop sign..shopping cart
1F6D5 ; Emoji # E12.0 [1] (🛕) hindu temple
1F6D6..1F6D7 ; Emoji # E13.0 [2] (🛖..🛗) hut..elevator
+1F6DD..1F6DF ; Emoji # E14.0 [3] (ðŸ›..🛟) playground slide..ring buoy
1F6E0..1F6E5 ; Emoji # E0.7 [6] (🛠ï¸..🛥ï¸) hammer and wrench..motor boat
1F6E9 ; Emoji # E0.7 [1] (🛩ï¸) small airplane
1F6EB..1F6EC ; Emoji # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
@@ -352,6 +353,7 @@
1F6FA ; Emoji # E12.0 [1] (🛺) auto rickshaw
1F6FB..1F6FC ; Emoji # E13.0 [2] (🛻..🛼) pickup truck..roller skate
1F7E0..1F7EB ; Emoji # E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7F0 ; Emoji # E14.0 [1] (🟰) heavy equals sign
1F90C ; Emoji # E13.0 [1] (🤌) pinched fingers
1F90D..1F90F ; Emoji # E12.0 [3] (ðŸ¤..ðŸ¤) white heart..pinching hand
1F910..1F918 ; Emoji # E1.0 [9] (ðŸ¤..🤘) zipper-mouth face..sign of the horns
@@ -375,6 +377,7 @@
1F972 ; Emoji # E13.0 [1] (🥲) smiling face with tear
1F973..1F976 ; Emoji # E11.0 [4] (🥳..🥶) partying face..cold face
1F977..1F978 ; Emoji # E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Emoji # E14.0 [1] (🥹) face holding back tears
1F97A ; Emoji # E11.0 [1] (🥺) pleading face
1F97B ; Emoji # E12.0 [1] (🥻) sari
1F97C..1F97F ; Emoji # E11.0 [4] (🥼..🥿) lab coat..flat shoe
@@ -392,21 +395,29 @@
1F9C1..1F9C2 ; Emoji # E11.0 [2] (ðŸ§..🧂) cupcake..salt
1F9C3..1F9CA ; Emoji # E12.0 [8] (🧃..🧊) beverage box..ice
1F9CB ; Emoji # E13.0 [1] (🧋) bubble tea
+1F9CC ; Emoji # E14.0 [1] (🧌) troll
1F9CD..1F9CF ; Emoji # E12.0 [3] (ðŸ§..ðŸ§) person standing..deaf person
1F9D0..1F9E6 ; Emoji # E5.0 [23] (ðŸ§..🧦) face with monocle..socks
1F9E7..1F9FF ; Emoji # E11.0 [25] (🧧..🧿) red envelope..nazar amulet
1FA70..1FA73 ; Emoji # E12.0 [4] (🩰..🩳) ballet shoes..shorts
1FA74 ; Emoji # E13.0 [1] (🩴) thong sandal
1FA78..1FA7A ; Emoji # E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Emoji # E14.0 [2] (🩻..🩼) x-ray..crutch
1FA80..1FA82 ; Emoji # E12.0 [3] (🪀..🪂) yo-yo..parachute
1FA83..1FA86 ; Emoji # E13.0 [4] (🪃..🪆) boomerang..nesting dolls
1FA90..1FA95 ; Emoji # E12.0 [6] (ðŸª..🪕) ringed planet..banjo
1FA96..1FAA8 ; Emoji # E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Emoji # E14.0 [4] (🪩..🪬) mirror ball..hamsa
1FAB0..1FAB6 ; Emoji # E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Emoji # E14.0 [4] (🪷..🪺) lotus..nest with eggs
1FAC0..1FAC2 ; Emoji # E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Emoji # E14.0 [3] (🫃..🫅) pregnant man..person with crown
1FAD0..1FAD6 ; Emoji # E13.0 [7] (ðŸ«..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Emoji # E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FAE0..1FAE7 ; Emoji # E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAF0..1FAF6 ; Emoji # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
-# Total elements: 1367
+# Total elements: 1404
# ================================================
@@ -438,8 +449,8 @@
2728 ; Emoji_Presentation # E0.6 [1] (✨) sparkles
274C ; Emoji_Presentation # E0.6 [1] (âŒ) cross mark
274E ; Emoji_Presentation # E0.6 [1] (âŽ) cross mark button
-2753..2755 ; Emoji_Presentation # E0.6 [3] (â“..â•) question mark..white exclamation mark
-2757 ; Emoji_Presentation # E0.6 [1] (â—) exclamation mark
+2753..2755 ; Emoji_Presentation # E0.6 [3] (â“..â•) red question mark..white exclamation mark
+2757 ; Emoji_Presentation # E0.6 [1] (â—) red exclamation mark
2795..2797 ; Emoji_Presentation # E0.6 [3] (âž•..âž—) plus..divide
27B0 ; Emoji_Presentation # E0.6 [1] (âž°) curly loop
27BF ; Emoji_Presentation # E1.0 [1] (âž¿) double curly loop
@@ -533,7 +544,7 @@
1F509 ; Emoji_Presentation # E1.0 [1] (🔉) speaker medium volume
1F50A..1F514 ; Emoji_Presentation # E0.6 [11] (🔊..🔔) speaker high volume..bell
1F515 ; Emoji_Presentation # E1.0 [1] (🔕) bell with slash
-1F516..1F52B ; Emoji_Presentation # E0.6 [22] (🔖..🔫) bookmark..pistol
+1F516..1F52B ; Emoji_Presentation # E0.6 [22] (🔖..🔫) bookmark..water pistol
1F52C..1F52D ; Emoji_Presentation # E1.0 [2] (🔬..🔭) microscope..telescope
1F52E..1F53D ; Emoji_Presentation # E0.6 [16] (🔮..🔽) crystal ball..downwards button
1F54B..1F54E ; Emoji_Presentation # E1.0 [4] (🕋..🕎) kaaba..menorah
@@ -569,7 +580,7 @@
1F62E..1F62F ; Emoji_Presentation # E1.0 [2] (😮..😯) face with open mouth..hushed face
1F630..1F633 ; Emoji_Presentation # E0.6 [4] (😰..😳) anxious face with sweat..flushed face
1F634 ; Emoji_Presentation # E1.0 [1] (😴) sleeping face
-1F635 ; Emoji_Presentation # E0.6 [1] (😵) dizzy face
+1F635 ; Emoji_Presentation # E0.6 [1] (😵) face with crossed-out eyes
1F636 ; Emoji_Presentation # E1.0 [1] (😶) face without mouth
1F637..1F640 ; Emoji_Presentation # E0.6 [10] (😷..🙀) face with medical mask..weary cat
1F641..1F644 ; Emoji_Presentation # E1.0 [4] (ðŸ™..🙄) slightly frowning face..face with rolling eyes
@@ -614,6 +625,7 @@
1F6D1..1F6D2 ; Emoji_Presentation # E3.0 [2] (🛑..🛒) stop sign..shopping cart
1F6D5 ; Emoji_Presentation # E12.0 [1] (🛕) hindu temple
1F6D6..1F6D7 ; Emoji_Presentation # E13.0 [2] (🛖..🛗) hut..elevator
+1F6DD..1F6DF ; Emoji_Presentation # E14.0 [3] (ðŸ›..🛟) playground slide..ring buoy
1F6EB..1F6EC ; Emoji_Presentation # E1.0 [2] (🛫..🛬) airplane departure..airplane arrival
1F6F4..1F6F6 ; Emoji_Presentation # E3.0 [3] (🛴..🛶) kick scooter..canoe
1F6F7..1F6F8 ; Emoji_Presentation # E5.0 [2] (🛷..🛸) sled..flying saucer
@@ -621,6 +633,7 @@
1F6FA ; Emoji_Presentation # E12.0 [1] (🛺) auto rickshaw
1F6FB..1F6FC ; Emoji_Presentation # E13.0 [2] (🛻..🛼) pickup truck..roller skate
1F7E0..1F7EB ; Emoji_Presentation # E12.0 [12] (🟠..🟫) orange circle..brown square
+1F7F0 ; Emoji_Presentation # E14.0 [1] (🟰) heavy equals sign
1F90C ; Emoji_Presentation # E13.0 [1] (🤌) pinched fingers
1F90D..1F90F ; Emoji_Presentation # E12.0 [3] (ðŸ¤..ðŸ¤) white heart..pinching hand
1F910..1F918 ; Emoji_Presentation # E1.0 [9] (ðŸ¤..🤘) zipper-mouth face..sign of the horns
@@ -644,6 +657,7 @@
1F972 ; Emoji_Presentation # E13.0 [1] (🥲) smiling face with tear
1F973..1F976 ; Emoji_Presentation # E11.0 [4] (🥳..🥶) partying face..cold face
1F977..1F978 ; Emoji_Presentation # E13.0 [2] (🥷..🥸) ninja..disguised face
+1F979 ; Emoji_Presentation # E14.0 [1] (🥹) face holding back tears
1F97A ; Emoji_Presentation # E11.0 [1] (🥺) pleading face
1F97B ; Emoji_Presentation # E12.0 [1] (🥻) sari
1F97C..1F97F ; Emoji_Presentation # E11.0 [4] (🥼..🥿) lab coat..flat shoe
@@ -661,21 +675,29 @@
1F9C1..1F9C2 ; Emoji_Presentation # E11.0 [2] (ðŸ§..🧂) cupcake..salt
1F9C3..1F9CA ; Emoji_Presentation # E12.0 [8] (🧃..🧊) beverage box..ice
1F9CB ; Emoji_Presentation # E13.0 [1] (🧋) bubble tea
+1F9CC ; Emoji_Presentation # E14.0 [1] (🧌) troll
1F9CD..1F9CF ; Emoji_Presentation # E12.0 [3] (ðŸ§..ðŸ§) person standing..deaf person
1F9D0..1F9E6 ; Emoji_Presentation # E5.0 [23] (ðŸ§..🧦) face with monocle..socks
1F9E7..1F9FF ; Emoji_Presentation # E11.0 [25] (🧧..🧿) red envelope..nazar amulet
1FA70..1FA73 ; Emoji_Presentation # E12.0 [4] (🩰..🩳) ballet shoes..shorts
1FA74 ; Emoji_Presentation # E13.0 [1] (🩴) thong sandal
1FA78..1FA7A ; Emoji_Presentation # E12.0 [3] (🩸..🩺) drop of blood..stethoscope
+1FA7B..1FA7C ; Emoji_Presentation # E14.0 [2] (🩻..🩼) x-ray..crutch
1FA80..1FA82 ; Emoji_Presentation # E12.0 [3] (🪀..🪂) yo-yo..parachute
1FA83..1FA86 ; Emoji_Presentation # E13.0 [4] (🪃..🪆) boomerang..nesting dolls
1FA90..1FA95 ; Emoji_Presentation # E12.0 [6] (ðŸª..🪕) ringed planet..banjo
1FA96..1FAA8 ; Emoji_Presentation # E13.0 [19] (🪖..🪨) military helmet..rock
+1FAA9..1FAAC ; Emoji_Presentation # E14.0 [4] (🪩..🪬) mirror ball..hamsa
1FAB0..1FAB6 ; Emoji_Presentation # E13.0 [7] (🪰..🪶) fly..feather
+1FAB7..1FABA ; Emoji_Presentation # E14.0 [4] (🪷..🪺) lotus..nest with eggs
1FAC0..1FAC2 ; Emoji_Presentation # E13.0 [3] (🫀..🫂) anatomical heart..people hugging
+1FAC3..1FAC5 ; Emoji_Presentation # E14.0 [3] (🫃..🫅) pregnant man..person with crown
1FAD0..1FAD6 ; Emoji_Presentation # E13.0 [7] (ðŸ«..🫖) blueberries..teapot
+1FAD7..1FAD9 ; Emoji_Presentation # E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FAE0..1FAE7 ; Emoji_Presentation # E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAF0..1FAF6 ; Emoji_Presentation # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
-# Total elements: 1148
+# Total elements: 1185
# ================================================
@@ -738,15 +760,17 @@
1F9BB ; Emoji_Modifier_Base # E12.0 [1] (🦻) ear with hearing aid
1F9CD..1F9CF ; Emoji_Modifier_Base # E12.0 [3] (ðŸ§..ðŸ§) person standing..deaf person
1F9D1..1F9DD ; Emoji_Modifier_Base # E5.0 [13] (🧑..ðŸ§) person..elf
+1FAC3..1FAC5 ; Emoji_Modifier_Base # E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FAF0..1FAF6 ; Emoji_Modifier_Base # E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
-# Total elements: 122
+# Total elements: 132
# ================================================
# All omitted code points have Emoji_Component=No
# @missing: 0000..10FFFF ; Emoji_Component ; No
-0023 ; Emoji_Component # E0.0 [1] (#ï¸) number sign
+0023 ; Emoji_Component # E0.0 [1] (#ï¸) hash sign
002A ; Emoji_Component # E0.0 [1] (*ï¸) asterisk
0030..0039 ; Emoji_Component # E0.0 [10] (0ï¸..9ï¸) digit zero..digit nine
200D ; Emoji_Component # E0.0 [1] (â€) zero width joiner
@@ -902,8 +926,8 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
2747 ; Extended_Pictographic# E0.6 [1] (â‡ï¸) sparkle
274C ; Extended_Pictographic# E0.6 [1] (âŒ) cross mark
274E ; Extended_Pictographic# E0.6 [1] (âŽ) cross mark button
-2753..2755 ; Extended_Pictographic# E0.6 [3] (â“..â•) question mark..white exclamation mark
-2757 ; Extended_Pictographic# E0.6 [1] (â—) exclamation mark
+2753..2755 ; Extended_Pictographic# E0.6 [3] (â“..â•) red question mark..white exclamation mark
+2757 ; Extended_Pictographic# E0.6 [1] (â—) red exclamation mark
2763 ; Extended_Pictographic# E1.0 [1] (â£ï¸) heart exclamation
2764 ; Extended_Pictographic# E0.6 [1] (â¤ï¸) red heart
2765..2767 ; Extended_Pictographic# E0.0 [3] (â¥..â§) ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET
@@ -1041,7 +1065,7 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
1F509 ; Extended_Pictographic# E1.0 [1] (🔉) speaker medium volume
1F50A..1F514 ; Extended_Pictographic# E0.6 [11] (🔊..🔔) speaker high volume..bell
1F515 ; Extended_Pictographic# E1.0 [1] (🔕) bell with slash
-1F516..1F52B ; Extended_Pictographic# E0.6 [22] (🔖..🔫) bookmark..pistol
+1F516..1F52B ; Extended_Pictographic# E0.6 [22] (🔖..🔫) bookmark..water pistol
1F52C..1F52D ; Extended_Pictographic# E1.0 [2] (🔬..🔭) microscope..telescope
1F52E..1F53D ; Extended_Pictographic# E0.6 [16] (🔮..🔽) crystal ball..downwards button
1F546..1F548 ; Extended_Pictographic# E0.0 [3] (🕆..🕈) WHITE LATIN CROSS..CELTIC CROSS
@@ -1117,7 +1141,7 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
1F62E..1F62F ; Extended_Pictographic# E1.0 [2] (😮..😯) face with open mouth..hushed face
1F630..1F633 ; Extended_Pictographic# E0.6 [4] (😰..😳) anxious face with sweat..flushed face
1F634 ; Extended_Pictographic# E1.0 [1] (😴) sleeping face
-1F635 ; Extended_Pictographic# E0.6 [1] (😵) dizzy face
+1F635 ; Extended_Pictographic# E0.6 [1] (😵) face with crossed-out eyes
1F636 ; Extended_Pictographic# E1.0 [1] (😶) face without mouth
1F637..1F640 ; Extended_Pictographic# E0.6 [10] (😷..🙀) face with medical mask..weary cat
1F641..1F644 ; Extended_Pictographic# E1.0 [4] (ðŸ™..🙄) slightly frowning face..face with rolling eyes
@@ -1166,7 +1190,8 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
1F6D3..1F6D4 ; Extended_Pictographic# E0.0 [2] (🛓..🛔) STUPA..PAGODA
1F6D5 ; Extended_Pictographic# E12.0 [1] (🛕) hindu temple
1F6D6..1F6D7 ; Extended_Pictographic# E13.0 [2] (🛖..🛗) hut..elevator
-1F6D8..1F6DF ; Extended_Pictographic# E0.0 [8] (🛘..🛟) <reserved-1F6D8>..<reserved-1F6DF>
+1F6D8..1F6DC ; Extended_Pictographic# E0.0 [5] (🛘..🛜) <reserved-1F6D8>..<reserved-1F6DC>
+1F6DD..1F6DF ; Extended_Pictographic# E14.0 [3] (ðŸ›..🛟) playground slide..ring buoy
1F6E0..1F6E5 ; Extended_Pictographic# E0.7 [6] (🛠ï¸..🛥ï¸) hammer and wrench..motor boat
1F6E6..1F6E8 ; Extended_Pictographic# E0.0 [3] (🛦..🛨) UP-POINTING MILITARY AIRPLANE..UP-POINTING SMALL AIRPLANE
1F6E9 ; Extended_Pictographic# E0.7 [1] (🛩ï¸) small airplane
@@ -1185,7 +1210,9 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
1F774..1F77F ; Extended_Pictographic# E0.0 [12] (ðŸ´..ðŸ¿) <reserved-1F774>..<reserved-1F77F>
1F7D5..1F7DF ; Extended_Pictographic# E0.0 [11] (🟕..🟟) CIRCLED TRIANGLE..<reserved-1F7DF>
1F7E0..1F7EB ; Extended_Pictographic# E12.0 [12] (🟠..🟫) orange circle..brown square
-1F7EC..1F7FF ; Extended_Pictographic# E0.0 [20] (🟬..🟿) <reserved-1F7EC>..<reserved-1F7FF>
+1F7EC..1F7EF ; Extended_Pictographic# E0.0 [4] (🟬..🟯) <reserved-1F7EC>..<reserved-1F7EF>
+1F7F0 ; Extended_Pictographic# E14.0 [1] (🟰) heavy equals sign
+1F7F1..1F7FF ; Extended_Pictographic# E0.0 [15] (🟱..🟿) <reserved-1F7F1>..<reserved-1F7FF>
1F80C..1F80F ; Extended_Pictographic# E0.0 [4] (🠌..ðŸ ) <reserved-1F80C>..<reserved-1F80F>
1F848..1F84F ; Extended_Pictographic# E0.0 [8] (🡈..ðŸ¡) <reserved-1F848>..<reserved-1F84F>
1F85A..1F85F ; Extended_Pictographic# E0.0 [6] (🡚..🡟) <reserved-1F85A>..<reserved-1F85F>
@@ -1214,7 +1241,7 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
1F972 ; Extended_Pictographic# E13.0 [1] (🥲) smiling face with tear
1F973..1F976 ; Extended_Pictographic# E11.0 [4] (🥳..🥶) partying face..cold face
1F977..1F978 ; Extended_Pictographic# E13.0 [2] (🥷..🥸) ninja..disguised face
-1F979 ; Extended_Pictographic# E0.0 [1] (🥹) <reserved-1F979>
+1F979 ; Extended_Pictographic# E14.0 [1] (🥹) face holding back tears
1F97A ; Extended_Pictographic# E11.0 [1] (🥺) pleading face
1F97B ; Extended_Pictographic# E12.0 [1] (🥻) sari
1F97C..1F97F ; Extended_Pictographic# E11.0 [4] (🥼..🥿) lab coat..flat shoe
@@ -1232,7 +1259,7 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
1F9C1..1F9C2 ; Extended_Pictographic# E11.0 [2] (ðŸ§..🧂) cupcake..salt
1F9C3..1F9CA ; Extended_Pictographic# E12.0 [8] (🧃..🧊) beverage box..ice
1F9CB ; Extended_Pictographic# E13.0 [1] (🧋) bubble tea
-1F9CC ; Extended_Pictographic# E0.0 [1] (🧌) <reserved-1F9CC>
+1F9CC ; Extended_Pictographic# E14.0 [1] (🧌) troll
1F9CD..1F9CF ; Extended_Pictographic# E12.0 [3] (ðŸ§..ðŸ§) person standing..deaf person
1F9D0..1F9E6 ; Extended_Pictographic# E5.0 [23] (ðŸ§..🧦) face with monocle..socks
1F9E7..1F9FF ; Extended_Pictographic# E11.0 [25] (🧧..🧿) red envelope..nazar amulet
@@ -1241,19 +1268,28 @@ E0020..E007F ; Emoji_Component # E0.0 [96] (ó € ..ó ¿) tag space..c
1FA74 ; Extended_Pictographic# E13.0 [1] (🩴) thong sandal
1FA75..1FA77 ; Extended_Pictographic# E0.0 [3] (🩵..🩷) <reserved-1FA75>..<reserved-1FA77>
1FA78..1FA7A ; Extended_Pictographic# E12.0 [3] (🩸..🩺) drop of blood..stethoscope
-1FA7B..1FA7F ; Extended_Pictographic# E0.0 [5] (🩻..🩿) <reserved-1FA7B>..<reserved-1FA7F>
+1FA7B..1FA7C ; Extended_Pictographic# E14.0 [2] (🩻..🩼) x-ray..crutch
+1FA7D..1FA7F ; Extended_Pictographic# E0.0 [3] (🩽..🩿) <reserved-1FA7D>..<reserved-1FA7F>
1FA80..1FA82 ; Extended_Pictographic# E12.0 [3] (🪀..🪂) yo-yo..parachute
1FA83..1FA86 ; Extended_Pictographic# E13.0 [4] (🪃..🪆) boomerang..nesting dolls
1FA87..1FA8F ; Extended_Pictographic# E0.0 [9] (🪇..ðŸª) <reserved-1FA87>..<reserved-1FA8F>
1FA90..1FA95 ; Extended_Pictographic# E12.0 [6] (ðŸª..🪕) ringed planet..banjo
1FA96..1FAA8 ; Extended_Pictographic# E13.0 [19] (🪖..🪨) military helmet..rock
-1FAA9..1FAAF ; Extended_Pictographic# E0.0 [7] (🪩..🪯) <reserved-1FAA9>..<reserved-1FAAF>
+1FAA9..1FAAC ; Extended_Pictographic# E14.0 [4] (🪩..🪬) mirror ball..hamsa
+1FAAD..1FAAF ; Extended_Pictographic# E0.0 [3] (🪭..🪯) <reserved-1FAAD>..<reserved-1FAAF>
1FAB0..1FAB6 ; Extended_Pictographic# E13.0 [7] (🪰..🪶) fly..feather
-1FAB7..1FABF ; Extended_Pictographic# E0.0 [9] (🪷..🪿) <reserved-1FAB7>..<reserved-1FABF>
+1FAB7..1FABA ; Extended_Pictographic# E14.0 [4] (🪷..🪺) lotus..nest with eggs
+1FABB..1FABF ; Extended_Pictographic# E0.0 [5] (🪻..🪿) <reserved-1FABB>..<reserved-1FABF>
1FAC0..1FAC2 ; Extended_Pictographic# E13.0 [3] (🫀..🫂) anatomical heart..people hugging
-1FAC3..1FACF ; Extended_Pictographic# E0.0 [13] (🫃..ðŸ«) <reserved-1FAC3>..<reserved-1FACF>
+1FAC3..1FAC5 ; Extended_Pictographic# E14.0 [3] (🫃..🫅) pregnant man..person with crown
+1FAC6..1FACF ; Extended_Pictographic# E0.0 [10] (🫆..ðŸ«) <reserved-1FAC6>..<reserved-1FACF>
1FAD0..1FAD6 ; Extended_Pictographic# E13.0 [7] (ðŸ«..🫖) blueberries..teapot
-1FAD7..1FAFF ; Extended_Pictographic# E0.0 [41] (🫗..🫿) <reserved-1FAD7>..<reserved-1FAFF>
+1FAD7..1FAD9 ; Extended_Pictographic# E14.0 [3] (🫗..🫙) pouring liquid..jar
+1FADA..1FADF ; Extended_Pictographic# E0.0 [6] (🫚..🫟) <reserved-1FADA>..<reserved-1FADF>
+1FAE0..1FAE7 ; Extended_Pictographic# E14.0 [8] (🫠..🫧) melting face..bubbles
+1FAE8..1FAEF ; Extended_Pictographic# E0.0 [8] (🫨..🫯) <reserved-1FAE8>..<reserved-1FAEF>
+1FAF0..1FAF6 ; Extended_Pictographic# E14.0 [7] (🫰..🫶) hand with index finger and thumb crossed..heart hands
+1FAF7..1FAFF ; Extended_Pictographic# E0.0 [9] (🫷..🫿) <reserved-1FAF7>..<reserved-1FAFF>
1FC00..1FFFD ; Extended_Pictographic# E0.0[1022] (🰀..🿽) <reserved-1FC00>..<reserved-1FFFD>
# Total elements: 3537
diff --git a/lib/stdlib/uc_spec/gen_unicode_mod.escript b/lib/stdlib/uc_spec/gen_unicode_mod.escript
index 8239b0d5a1..9e2ed0922a 100644
--- a/lib/stdlib/uc_spec/gen_unicode_mod.escript
+++ b/lib/stdlib/uc_spec/gen_unicode_mod.escript
@@ -4,7 +4,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2017-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2017-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -191,7 +191,7 @@ gen_static(Fd) ->
" {U,L} -> #{upper=>U,lower=>L,title=>U,fold=>L};\n"
" {U,L,T,F} -> #{upper=>U,lower=>L,title=>T,fold=>F}\n"
" end.\n\n"),
- io:put_chars(Fd, "spec_version() -> {13,0}.\n\n\n"),
+ io:put_chars(Fd, "spec_version() -> {14,0}.\n\n\n"),
io:put_chars(Fd, "class(Codepoint) -> {CCC,_,_} = unicode_table(Codepoint),\n CCC.\n\n"),
io:put_chars(Fd, "-spec uppercase(unicode:chardata()) -> "
"maybe_improper_list(gc(),unicode:chardata()).\n"),
diff --git a/lib/syntax_tools/doc/Makefile b/lib/syntax_tools/doc/Makefile
index 87604c4e7f..87b7660c26 100644
--- a/lib/syntax_tools/doc/Makefile
+++ b/lib/syntax_tools/doc/Makefile
@@ -57,7 +57,7 @@ info:
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/syntax_tools/doc/src/notes.xml b/lib/syntax_tools/doc/src/notes.xml
index b3629d4477..2f046e0791 100644
--- a/lib/syntax_tools/doc/src/notes.xml
+++ b/lib/syntax_tools/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2007</year><year>2021</year>
+ <year>2007</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -860,7 +860,7 @@
<list>
<item>
<p>
- Miscellanous updates.</p>
+ Miscellaneous updates.</p>
<p>
Own Id: OTP-8038</p>
</item>
diff --git a/lib/syntax_tools/examples/Makefile b/lib/syntax_tools/examples/Makefile
index f5e96a8285..0712898f65 100644
--- a/lib/syntax_tools/examples/Makefile
+++ b/lib/syntax_tools/examples/Makefile
@@ -37,7 +37,7 @@ EXAMPLE_FILES = demo.erl
# ----------------------------------------------------
# Make Rules
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/syntax_tools/src/Makefile b/lib/syntax_tools/src/Makefile
index af6a472f3d..dc0ac61734 100644
--- a/lib/syntax_tools/src/Makefile
+++ b/lib/syntax_tools/src/Makefile
@@ -50,7 +50,7 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
# Targets
# ----------------------------------------------------
-debug opt: $(OBJECTS)
+$(TYPES): $(OBJECTS)
all: $(OBJECTS)
diff --git a/lib/syntax_tools/src/epp_dodger.erl b/lib/syntax_tools/src/epp_dodger.erl
index eacfbc5d6b..2e0694c2cf 100644
--- a/lib/syntax_tools/src/epp_dodger.erl
+++ b/lib/syntax_tools/src/epp_dodger.erl
@@ -430,7 +430,14 @@ quick_parse_form(Dev, L0, Options) ->
parse_form(Dev, L0, Parser, Options) ->
NoFail = proplists:get_bool(no_fail, Options),
Opt = #opt{clever = proplists:get_bool(clever, Options)},
- case io:scan_erl_form(Dev, "", L0) of
+
+ %% This as the *potential* to read options for enabling/disabling
+ %% features for the parsing of the file.
+ {ok, {_Ftrs, ResWordFun}} =
+ erl_features:keyword_fun(Options,
+ fun erl_scan:f_reserved_word/1),
+
+ case io:scan_erl_form(Dev, "", L0, [{reserved_word_fun,ResWordFun}]) of
{ok, Ts, L1} ->
case catch {ok, Parser(Ts, Opt)} of
{'EXIT', Term} ->
@@ -504,7 +511,9 @@ quickscan_form([{'-', _Anno}, {'if', AnnoA} | _Ts]) ->
kill_form(AnnoA);
quickscan_form([{'-', _Anno}, {atom, AnnoA, elif} | _Ts]) ->
kill_form(AnnoA);
-quickscan_form([{'-', _Anno}, {atom, AnnoA, else} | _Ts]) ->
+quickscan_form([{'-', _Anno}, {atom, AnnoA, 'else'} | _Ts]) ->
+ kill_form(AnnoA);
+quickscan_form([{'-', _Anno}, {'else', AnnoA} | _Ts]) ->
kill_form(AnnoA);
quickscan_form([{'-', _Anno}, {atom, AnnoA, endif} | _Ts]) ->
kill_form(AnnoA);
@@ -648,9 +657,12 @@ scan_form([{'-', _Anno}, {'if', AnnoA} | Ts], Opt) ->
scan_form([{'-', _Anno}, {atom, AnnoA, elif} | Ts], Opt) ->
[{atom, AnnoA, ?pp_form}, {'(', AnnoA}, {')', AnnoA}, {'->', AnnoA},
{atom, AnnoA, 'elif'} | scan_macros(Ts, Opt)];
-scan_form([{'-', _Anno}, {atom, AnnoA, else} | Ts], Opt) ->
+scan_form([{'-', _Anno}, {atom, AnnoA, 'else'} | Ts], Opt) ->
+ [{atom, AnnoA, ?pp_form}, {'(', AnnoA}, {')', AnnoA}, {'->', AnnoA},
+ {atom, AnnoA, 'else'} | scan_macros(Ts, Opt)];
+scan_form([{'-', _Anno}, {'else', AnnoA} | Ts], Opt) ->
[{atom, AnnoA, ?pp_form}, {'(', AnnoA}, {')', AnnoA}, {'->', AnnoA},
- {atom, AnnoA, else} | scan_macros(Ts, Opt)];
+ {atom, AnnoA, 'else'} | scan_macros(Ts, Opt)];
scan_form([{'-', _Anno}, {atom, AnnoA, endif} | Ts], Opt) ->
[{atom, AnnoA, ?pp_form}, {'(', AnnoA}, {')', AnnoA}, {'->', AnnoA},
{atom, AnnoA, endif} | scan_macros(Ts, Opt)];
diff --git a/lib/syntax_tools/src/erl_prettypr.erl b/lib/syntax_tools/src/erl_prettypr.erl
index af1f2b4d11..d6c1c1e005 100644
--- a/lib/syntax_tools/src/erl_prettypr.erl
+++ b/lib/syntax_tools/src/erl_prettypr.erl
@@ -54,7 +54,7 @@
-type hook() :: 'none'
| fun((erl_syntax:syntaxTree(), _, _) -> prettypr:document()).
-type clause_t() :: 'case_expr' | 'fun_expr'
- | 'if_expr' | 'receive_expr' | 'try_expr'
+ | 'if_expr' | 'maybe_expr' | 'receive_expr' | 'try_expr'
| {'function', prettypr:document()}
| 'spec'.
@@ -588,6 +588,8 @@ lay_2(Node, Ctxt) ->
make_if_clause(D1, D2, D3, Ctxt);
case_expr ->
make_case_clause(D1, D2, D3, Ctxt);
+ maybe_expr ->
+ make_case_clause(D1, D2, D3, Ctxt);
receive_expr ->
make_case_clause(D1, D2, D3, Ctxt);
try_expr ->
@@ -648,6 +650,34 @@ lay_2(Node, Ctxt) ->
set_prec(Ctxt, PrecR)),
beside(D1, beside(text(":"), D2));
+ maybe_expr ->
+ Ctxt1 = reset_prec(Ctxt),
+ D1 = vertical(seq(erl_syntax:maybe_expr_body(Node),
+ floating(text(",")), Ctxt1, fun lay/2)),
+ Es0 = [text("end")],
+ Es1 = case erl_syntax:maybe_expr_else(Node) of
+ none -> Es0;
+ ElseNode ->
+ ElseCs = erl_syntax:else_expr_clauses(ElseNode),
+ D3 = lay_clauses(ElseCs, maybe_expr, Ctxt1),
+ [text("else"),
+ nest(Ctxt1#ctxt.break_indent, D3)
+ | Es0]
+ end,
+ sep([par([text("maybe"), nest(Ctxt1#ctxt.break_indent, D1),
+ hd(Es1)]) | tl(Es1)]);
+
+ maybe_match_expr ->
+ {PrecL, Prec, PrecR} = inop_prec('='),
+ D1 = lay(erl_syntax:maybe_match_expr_pattern(Node),
+ set_prec(Ctxt, PrecL)),
+ D2 = lay(erl_syntax:maybe_match_expr_body(Node),
+ set_prec(Ctxt, PrecR)),
+ D3 = follow(beside(D1, floating(text(" ?="))), D2,
+ Ctxt#ctxt.break_indent),
+ maybe_parentheses(D3, Prec, Ctxt);
+
+
%%
%% The rest is in alphabetical order (except map and types)
%%
@@ -759,7 +789,7 @@ lay_2(Node, Ctxt) ->
nest(Ctxt1#ctxt.break_indent, sep(Es)),
text("end")]);
- catch_expr ->
+ 'catch_expr' -> %Quoted to help Emacs.
{Prec, PrecR} = preop_prec('catch'),
D = lay(erl_syntax:catch_expr_body(Node),
set_prec(Ctxt, PrecR)),
@@ -801,7 +831,7 @@ lay_2(Node, Ctxt) ->
sep(seq(erl_syntax:disjunction_body(Node),
floating(text(";")), reset_prec(Ctxt),
fun lay/2));
-
+
error_marker ->
E = erl_syntax:error_marker_info(Node),
beside(text("** "),
diff --git a/lib/syntax_tools/src/erl_syntax.erl b/lib/syntax_tools/src/erl_syntax.erl
index 354b65c9a3..4da1635aec 100644
--- a/lib/syntax_tools/src/erl_syntax.erl
+++ b/lib/syntax_tools/src/erl_syntax.erl
@@ -193,6 +193,8 @@
constraint_body/1,
disjunction/1,
disjunction_body/1,
+ else_expr/1,
+ else_expr_clauses/1,
eof_marker/0,
error_marker/1,
error_marker_info/1,
@@ -266,6 +268,13 @@
match_expr/2,
match_expr_body/1,
match_expr_pattern/1,
+ maybe_expr/1,
+ maybe_expr/2,
+ maybe_expr_body/1,
+ maybe_expr_else/1,
+ maybe_match_expr/2,
+ maybe_match_expr_pattern/1,
+ maybe_match_expr_body/1,
module_qualifier/2,
module_qualifier_argument/1,
module_qualifier_body/1,
@@ -505,13 +514,14 @@
%% <td>constrained_function_type</td>
%% <td>constraint</td>
%% <td>disjunction</td>
-%% <td>eof_marker</td>
%% </tr><tr>
+%% <td>else_expr</td>
+%% <td>eof_marker</td>
%% <td>error_marker</td>
+%% </tr><tr>
%% <td>float</td>
%% <td>form_list</td>
%% <td>fun_expr</td>
-%% </tr><tr>
%% <td>fun_type</td>
%% <td>function</td>
%% <td>function_type</td>
@@ -535,6 +545,9 @@
%% <td>map_type_assoc</td>
%% <td>map_type_exact</td>
%% <td>match_expr</td>
+%% </tr><tr>
+%% <td>maybe_expr</td>
+%% <td>maybe_match_expr</td>
%% <td>module_qualifier</td>
%% </tr><tr>
%% <td>named_fun_expr</td>
@@ -597,6 +610,7 @@
%% @see constrained_function_type/2
%% @see constraint/2
%% @see disjunction/1
+%% @see else_expr/1
%% @see eof_marker/0
%% @see error_marker/1
%% @see float/1
@@ -623,6 +637,9 @@
%% @see map_type_assoc/2
%% @see map_type_exact/2
%% @see match_expr/2
+%% @see maybe_expr/1
+%% @see maybe_expr/2
+%% @see maybe_match_expr/2
%% @see module_qualifier/2
%% @see named_fun_expr/2
%% @see nil/0
@@ -683,6 +700,9 @@ type(Node) ->
{'fun', _, {function, _, _}} -> implicit_fun;
{'fun', _, {function, _, _, _}} -> implicit_fun;
{'if', _, _} -> if_expr;
+ {'maybe', _, _} -> maybe_expr;
+ {'maybe', _, _, _} -> maybe_expr;
+ {'else', _, _} -> else_expr;
{'receive', _, _, _, _} -> receive_expr;
{'receive', _, _} -> receive_expr;
{attribute, _, _, _} -> attribute;
@@ -702,6 +722,7 @@ type(Node) ->
{map, _, _} -> map_expr;
{map_field_assoc, _, _, _} -> map_field_assoc;
{map_field_exact, _, _, _} -> map_field_exact;
+ {maybe_match, _, _, _} -> maybe_match_expr;
{op, _, _, _, _} -> infix_expr;
{op, _, _, _} -> prefix_expr;
{record, _, _, _, _} -> record_expr;
@@ -4135,6 +4156,71 @@ match_expr_body(Node) ->
%% =====================================================================
+%% @doc Creates an abstract maybe-expression, as used in <code>maybe</code>
+%% blocks. The result represents
+%% "<code><em>Pattern</em> ?= <em>Body</em></code>".
+%%
+%% @see maybe_match_expr_pattern/1
+%% @see maybe_match_expr_body/1
+%% @see maybe_expr/2
+
+-record(maybe_match_expr, {pattern :: syntaxTree(), body :: syntaxTree()}).
+
+%% type(Node) = maybe_expr
+%% data(Node) = #maybe_expr{pattern :: Pattern, body :: Body}
+%%
+%% Pattern = Body = syntaxTree()
+%%
+%% `erl_parse' representation:
+%%
+%% {maybe_match, Pos, Pattern, Body}
+%%
+%% Pattern = Body = erl_parse()
+%%
+
+-spec maybe_match_expr(syntaxTree(), syntaxTree()) -> syntaxTree().
+
+maybe_match_expr(Pattern, Body) ->
+ tree(maybe_match_expr, #maybe_match_expr{pattern = Pattern, body = Body}).
+
+revert_maybe_match_expr(Node) ->
+ Pos = get_pos(Node),
+ Pattern = maybe_match_expr_pattern(Node),
+ Body = maybe_match_expr_body(Node),
+ {maybe_match, Pos, Pattern, Body}.
+
+%% =====================================================================
+%% @doc Returns the pattern subtree of a `maybe_expr' node.
+%%
+%% @see maybe_match_expr/2
+
+-spec maybe_match_expr_pattern(syntaxTree()) -> syntaxTree().
+
+maybe_match_expr_pattern(Node) ->
+ case unwrap(Node) of
+ {maybe_match, _, Pattern, _} ->
+ Pattern;
+ Node1 ->
+ (data(Node1))#maybe_match_expr.pattern
+ end.
+
+
+%% =====================================================================
+%% @doc Returns the body subtree of a `maybe_expr' node.
+%%
+%% @see maybe_match_expr/2
+
+-spec maybe_match_expr_body(syntaxTree()) -> syntaxTree().
+
+maybe_match_expr_body(Node) ->
+ case unwrap(Node) of
+ {maybe_match, _, _, Body} ->
+ Body;
+ Node1 ->
+ (data(Node1))#maybe_match_expr.body
+ end.
+
+%% =====================================================================
%% @doc Creates an abstract operator. The name of the operator is the
%% character sequence represented by `Name'. This is
%% analogous to the print name of an atom, but an operator is never
@@ -6361,6 +6447,130 @@ case_expr_clauses(Node) ->
(data(Node1))#case_expr.clauses
end.
+%% =====================================================================
+%% @doc Creates an abstract else-expression. If `Clauses' is `[C1,
+%% ..., Cn]', the result represents "<code>else <em>C1</em>; ...; <em>Cn</em>
+%% end</code>". More exactly, if each `Ci' represents
+%% "<code>(<em>Pi</em>) <em>Gi</em> -> <em>Bi</em></code>", then the
+%% result represents "<code>else <em>G1</em> -> <em>B1</em>; ...;
+%% <em>Pn</em> <em>Gn</em> -> <em>Bn</em> end</code>".
+%%
+%% @see maybe_expr/2
+%% @see else_expr_clauses/1
+%% @see clause/3
+
+else_expr(Clauses) ->
+ tree(else_expr, Clauses).
+
+revert_else_expr(Node) ->
+ Pos = get_pos(Node),
+ Clauses = else_expr_clauses(Node),
+ {'else', Pos, Clauses}.
+
+%% =====================================================================
+%% @doc Returns the list of clause subtrees of an `else_expr' node.
+%%
+%% @see else_expr/1
+
+-spec else_expr_clauses(syntaxTree()) -> [syntaxTree()].
+
+else_expr_clauses(Node) ->
+ case unwrap(Node) of
+ {'else', _, Clauses} ->
+ Clauses;
+ Node1 ->
+ data(Node1)
+ end.
+
+%% =====================================================================
+%% @equiv maybe_expr(Body, none)
+
+-spec maybe_expr([syntaxTree()]) -> syntaxTree().
+
+maybe_expr(Body) ->
+ maybe_expr(Body, none).
+
+%% =====================================================================
+%% @doc Creates an abstract maybe-expression. If `Body' is `[B1, ...,
+%% Bn]', and `OptionalElse' is `none', the result represents
+%% "<code>maybe <em>B1</em>, ..., <em>Bn</em> end</code>". If `Body'
+%% is `[B1, ..., Bn]', and `OptionalElse' reprsents an `else_expr' node
+%% with clauses `[C1, ..., Cn]', the result represents "<code>maybe
+%% <em>B1</em>, ..., <em>Bn</em> else <em>C1</em>; ..., <em>Cn</em>
+%% end</code>".
+%%
+%% See `clause' for documentation on `erl_parse' clauses.
+%%
+%% @see maybe_expr_body/1
+%% @see maybe_expr_else/1
+
+-record(maybe_expr, {body :: [syntaxTree()],
+ 'else' = none :: 'none' | syntaxTree()}).
+
+%% type(Node) = maybe_expr
+%% data(Node) = #maybe_expr{body :: Body, 'else' :: 'none' | Else}
+%%
+%% Body = [syntaxTree()]
+%% Else = syntaxTree()
+%%
+%% `erl_parse' representation:
+%%
+%% {block, Pos, Body}
+%% {block, Pos, Body, Else}
+%%
+%% Body = [erl_parse()] \ []
+%% Else = {'else', Pos, Clauses}
+%% Clauses = [Clause] \ []
+%% Clause = {clause, ...}
+
+-spec maybe_expr([syntaxTree()], 'none' | syntaxTree()) -> syntaxTree().
+
+maybe_expr(Body, OptionalElse) ->
+ tree(maybe_expr, #maybe_expr{body = Body,
+ 'else' = OptionalElse}).
+revert_maybe_expr(Node) ->
+ Pos = get_pos(Node),
+ Body = maybe_expr_body(Node),
+ case maybe_expr_else(Node) of
+ none ->
+ {'maybe', Pos, Body};
+ Else ->
+ {'maybe', Pos, Body, Else}
+ end.
+
+%% =====================================================================
+%% @doc Returns the list of body subtrees of a `maybe_expr' node.
+%%
+%% @see maybe_expr/2
+
+-spec maybe_expr_body(syntaxTree()) -> [syntaxTree()].
+
+maybe_expr_body(Node) ->
+ case unwrap(Node) of
+ {'maybe', _, Body} ->
+ Body;
+ {'maybe', _, Body, _Else} ->
+ Body;
+ Node1 ->
+ (data(Node1))#maybe_expr.body
+ end.
+
+%% =====================================================================
+%% @doc Returns the else subtree of a `maybe_expr' node.
+%%
+%% @see maybe_expr/2
+
+-spec maybe_expr_else(syntaxTree()) -> 'none' | syntaxTree().
+
+maybe_expr_else(Node) ->
+ case unwrap(Node) of
+ {'maybe', _, _Body} ->
+ none;
+ {'maybe', _, _Body, Else} ->
+ Else;
+ Node1 ->
+ (data(Node1))#maybe_expr.'else'
+ end.
%% =====================================================================
%% @equiv receive_expr(Clauses, none, [])
@@ -7310,7 +7520,7 @@ concrete(Node) ->
eval_bits:expr_grp(Fs, [],
fun(F, _) ->
{value, concrete(F), []}
- end, [], true),
+ end),
B;
arity_qualifier ->
A = erl_syntax:arity_qualifier_argument(Node),
@@ -7470,9 +7680,9 @@ revert_root(Node) ->
revert_bitstring_type(Node);
block_expr ->
revert_block_expr(Node);
- case_expr ->
+ 'case_expr' -> %Quoted to help Emacs.
revert_case_expr(Node);
- catch_expr ->
+ 'catch_expr' -> %Quoted to help Emacs.
revert_catch_expr(Node);
char ->
revert_char(Node);
@@ -7482,6 +7692,8 @@ revert_root(Node) ->
revert_constrained_function_type(Node);
constraint ->
revert_constraint(Node);
+ else_expr ->
+ revert_else_expr(Node);
eof_marker ->
revert_eof_marker(Node);
error_marker ->
@@ -7526,6 +7738,10 @@ revert_root(Node) ->
revert_map_type_exact(Node);
match_expr ->
revert_match_expr(Node);
+ maybe_match_expr ->
+ revert_maybe_match_expr(Node);
+ maybe_expr ->
+ revert_maybe_expr(Node);
module_qualifier ->
revert_module_qualifier(Node);
named_fun_expr ->
@@ -7730,7 +7946,7 @@ subtrees(T) ->
case_expr ->
[[case_expr_argument(T)],
case_expr_clauses(T)];
- catch_expr ->
+ 'catch_expr' -> %Quoted to help Emacs.
[[catch_expr_body(T)]];
class_qualifier ->
[[class_qualifier_argument(T)],
@@ -7755,6 +7971,8 @@ subtrees(T) ->
constraint_body(T)];
disjunction ->
[disjunction_body(T)];
+ else_expr ->
+ [else_expr_clauses(T)];
form_list ->
[form_list_elements(T)];
fun_expr ->
@@ -7823,6 +8041,17 @@ subtrees(T) ->
match_expr ->
[[match_expr_pattern(T)],
[match_expr_body(T)]];
+ maybe_expr ->
+ case maybe_expr_else(T) of
+ none ->
+ [maybe_expr_body(T)];
+ E ->
+ [maybe_expr_body(T),
+ [E]]
+ end;
+ maybe_match_expr ->
+ [[maybe_match_expr_pattern(T)],
+ [maybe_match_expr_body(T)]];
module_qualifier ->
[[module_qualifier_argument(T)],
[module_qualifier_body(T)]];
@@ -7962,6 +8191,7 @@ make_tree(constrained_function_type, [[F],C]) ->
constrained_function_type(F, C);
make_tree(constraint, [[N], Ts]) -> constraint(N, Ts);
make_tree(disjunction, [E]) -> disjunction(E);
+make_tree(else_expr, [E]) -> else_expr(E);
make_tree(form_list, [E]) -> form_list(E);
make_tree(fun_expr, [C]) -> fun_expr(C);
make_tree(function, [[N], C]) -> function(N, C);
@@ -7985,6 +8215,9 @@ make_tree(map_type, [Fs]) -> map_type(Fs);
make_tree(map_type_assoc, [[N],[V]]) -> map_type_assoc(N, V);
make_tree(map_type_exact, [[N],[V]]) -> map_type_exact(N, V);
make_tree(match_expr, [[P], [E]]) -> match_expr(P, E);
+make_tree(maybe_expr, [Body]) -> maybe_expr(Body);
+make_tree(maybe_expr, [Body, [Else]]) -> maybe_expr(Body, Else);
+make_tree(maybe_match_expr, [[P], [E]]) -> maybe_match_expr(P, E);
make_tree(named_fun_expr, [[N], C]) -> named_fun_expr(N, C);
make_tree(module_qualifier, [[M], [N]]) -> module_qualifier(M, N);
make_tree(parentheses, [[E]]) -> parentheses(E);
diff --git a/lib/syntax_tools/src/erl_syntax_lib.erl b/lib/syntax_tools/src/erl_syntax_lib.erl
index 6185007235..78c7ab9e46 100644
--- a/lib/syntax_tools/src/erl_syntax_lib.erl
+++ b/lib/syntax_tools/src/erl_syntax_lib.erl
@@ -332,8 +332,8 @@ variables_2([], S) ->
-define(MINIMUM_RANGE, 100).
-define(START_RANGE_FACTOR, 100).
-define(MAX_RETRIES, 3). % retries before enlarging range
--define(ENLARGE_ENUM, 8). % range enlargment enumerator
--define(ENLARGE_DENOM, 1). % range enlargment denominator
+-define(ENLARGE_ENUM, 8). % range enlargement enumerator
+-define(ENLARGE_DENOM, 1). % range enlargement denominator
default_variable_name(N) ->
list_to_atom("V" ++ integer_to_list(N)).
@@ -1106,7 +1106,7 @@ collect_attribute(file, _, Info) ->
Info;
collect_attribute(record, {R, L}, Info) ->
finfo_add_record(R, L, Info);
-collect_attribute(_, {N, V}, Info) ->
+collect_attribute(N, V, Info) ->
finfo_add_attribute(N, V, Info).
%% Abstract datatype for collecting module information.
@@ -1314,7 +1314,7 @@ analyze_attribute(Node) ->
ifndef -> preprocessor;
'if' -> preprocessor;
elif -> preprocessor;
- else -> preprocessor;
+ 'else' -> preprocessor;
endif -> preprocessor;
A ->
{A, analyze_attribute(A, Node)}
@@ -1335,7 +1335,8 @@ analyze_attribute(record, Node) ->
analyze_record_attribute(Node);
analyze_attribute(_, Node) ->
%% A "wild" attribute (such as e.g. a `compile' directive).
- analyze_wild_attribute(Node).
+ {_, Info} = analyze_wild_attribute(Node),
+ Info.
%% =====================================================================
diff --git a/lib/syntax_tools/src/prettypr.erl b/lib/syntax_tools/src/prettypr.erl
index 1f2dfffbdb..caafa9b8b9 100644
--- a/lib/syntax_tools/src/prettypr.erl
+++ b/lib/syntax_tools/src/prettypr.erl
@@ -432,7 +432,7 @@ follow(D1, D2) ->
%% document()
%%
%% @doc Separates two documents by either a single space, or a line
-%% break and intentation. In other words, one of the layouts
+%% break and indentation. In other words, one of the layouts
%% ```abc def'''
%% or
%% ```abc
diff --git a/lib/syntax_tools/src/syntax_tools.app.src b/lib/syntax_tools/src/syntax_tools.app.src
index 9bbf20d5a5..e122c36fb4 100644
--- a/lib/syntax_tools/src/syntax_tools.app.src
+++ b/lib/syntax_tools/src/syntax_tools.app.src
@@ -16,4 +16,4 @@
{applications, [stdlib]},
{env, []},
{runtime_dependencies,
- ["compiler-7.0","erts-9.0","kernel-5.0","stdlib-3.4"]}]}.
+ ["compiler-7.0","erts-9.0","kernel-5.0","stdlib-@OTP-17988@"]}]}.
diff --git a/lib/syntax_tools/test/Makefile b/lib/syntax_tools/test/Makefile
index 4ace860223..51fe2417b1 100644
--- a/lib/syntax_tools/test/Makefile
+++ b/lib/syntax_tools/test/Makefile
@@ -40,7 +40,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) '*_SUITE_make' \
>> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl
index 3246ce7010..623e79b207 100644
--- a/lib/syntax_tools/test/syntax_tools_SUITE.erl
+++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl
@@ -106,7 +106,8 @@ revert(Config) when is_list(Config) ->
test_server:timetrap_cancel(Dog).
revert_file(File, Path) ->
- case epp:parse_file(File, Path, []) of
+ case epp:parse_file(File, [{includes,Path},
+ res_word_option()]) of
{ok,Fs0} ->
Fs1 = erl_syntax:form_list(Fs0),
Fs2 = erl_syntax_lib:map(fun (Node) -> Node end, Fs1),
@@ -350,8 +351,7 @@ t_comment_scan(Config) when is_list(Config) ->
t_prettypr(Config) when is_list(Config) ->
DataDir = ?config(data_dir, Config),
PrivDir = ?config(priv_dir, Config),
- Filenames = ["type_specs.erl",
- "specs_and_funs.erl"],
+ Filenames = test_files(),
ok = test_prettypr(Filenames,DataDir,PrivDir),
ok.
@@ -391,15 +391,16 @@ test_comment_scan([File|Files],DataDir) ->
test_prettypr([],_,_) -> ok;
test_prettypr([File|Files],DataDir,PrivDir) ->
Filename = filename:join(DataDir,File),
+ Options = [res_word_option()],
io:format("Parsing ~p~n", [Filename]),
- {ok, Fs0} = epp:parse_file(Filename, [], []),
+ {ok, Fs0} = epp:parse_file(Filename, Options),
Fs = erl_syntax:form_list(Fs0),
PP = erl_prettypr:format(Fs, [{paper, 120}, {ribbon, 110}]),
io:put_chars(PP),
OutFile = filename:join(PrivDir, File),
ok = file:write_file(OutFile,unicode:characters_to_binary(PP)),
io:format("Parsing OutFile: ~ts~n", [OutFile]),
- {ok, Fs2} = epp:parse_file(OutFile, [], []),
+ {ok, Fs2} = epp:parse_file(OutFile, Options),
case [Error || {error, _} = Error <- Fs2] of
[] ->
ok;
@@ -408,22 +409,23 @@ test_prettypr([File|Files],DataDir,PrivDir) ->
end,
test_prettypr(Files,DataDir,PrivDir).
-
test_epp_dodger([], _, _) -> ok;
test_epp_dodger([Filename|Files],DataDir,PrivDir) ->
io:format("Parsing ~p~n", [Filename]),
+ Options = [{enable_feature, maybe_expr}],
InFile = filename:join(DataDir, Filename),
- Parsers = [{fun epp_dodger:parse_file/1,parse_file},
- {fun epp_dodger:quick_parse_file/1,quick_parse_file},
+ Parsers = [{fun(File) -> epp_dodger:parse_file(File, Options) end,parse_file},
+ {fun(File) -> epp_dodger:quick_parse_file(File,
+ Options) end,quick_parse_file},
{fun (File) ->
{ok,Dev} = file:open(File,[read]),
- Res = epp_dodger:parse(Dev),
+ Res = epp_dodger:parse(Dev, Options),
file:close(File),
Res
end, parse},
{fun (File) ->
{ok,Dev} = file:open(File,[read]),
- Res = epp_dodger:quick_parse(Dev),
+ Res = epp_dodger:quick_parse(Dev, Options),
file:close(File),
Res
end, quick_parse}],
@@ -617,3 +619,9 @@ p_run_loop(Test, List, N, Refs0, Errors0) ->
Refs = Refs0 -- [Ref],
p_run_loop(Test, List, N, Refs, Errors)
end.
+
+res_word_option() ->
+ Options = [{enable_feature, maybe_expr}],
+ {ok, {_Ftrs, ResWordFun}} =
+ erl_features:keyword_fun(Options, fun erl_scan:f_reserved_word/1),
+ {reserved_word_fun, ResWordFun}.
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl b/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl
index 07c419b4b7..9035139fea 100644
--- a/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl
+++ b/lib/syntax_tools/test/syntax_tools_SUITE_data/syntax_tools_SUITE_test_module.erl
@@ -8,6 +8,7 @@
sub_word/2,sub_word/3,left/2,left/3,right/2,right/3,
sub_string/2,sub_string/3,centre/2,centre/3, join/2]).
-export([to_upper/1, to_lower/1]).
+-export([eep49/0]).
-import(lists,[reverse/1,member/2]).
@@ -235,8 +236,8 @@ substr1(String, _L) when is_list(String) -> []. %Be nice!
substr2(String, 1) when is_list(String) -> String;
substr2([_|String], S) -> substr2(String, S-1).
-%% tokens(String, Seperators).
-%% Return a list of tokens seperated by characters in Seperators.
+%% tokens(String, Separators).
+%% Return a list of tokens separated by characters in Separators.
-spec tokens(String, SeparatorList) -> Tokens when
String :: string(),
@@ -538,3 +539,45 @@ join([], Sep) when is_list(Sep) ->
[];
join([H|T], Sep) ->
H ++ lists:append([Sep ++ X || X <- T]).
+
+eep49() ->
+ maybe ok ?= ok end,
+
+ {a,b} =
+ maybe
+ {ok,A} ?= {ok,a},
+ {ok,B} ?= {ok,b},
+ {A,B}
+ end,
+
+ maybe
+ ok ?= {ok,x}
+ else
+ error -> error;
+ {error,_} -> error
+ end,
+
+ maybe
+ ok ?= {ok,x}
+ else
+ error -> error
+ end,
+
+ maybe
+ {ok,X} ?= {ok,x},
+ {ok,Y} ?= {ok,y},
+ {X,Y}
+ else
+ error -> error;
+ {error,_} -> error
+ end,
+
+ maybe
+ {ok,X2} ?= {ok,x},
+ {ok,Y2} ?= {ok,y},
+ {X2,Y2}
+ else
+ error -> error
+ end,
+
+ ok.
diff --git a/lib/tftp/src/Makefile b/lib/tftp/src/Makefile
index 4ece9ffe28..cfcb1ea134 100644
--- a/lib/tftp/src/Makefile
+++ b/lib/tftp/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2021. All Rights Reserved.
+# Copyright Ericsson AB 2005-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -80,7 +80,7 @@ ERL_COMPILE_FLAGS += \
$(TARGET_FILES): $(BEHAVIOUR_TARGET_FILES)
-debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
clean:
rm -f $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET) $(BEHAVIOUR_TARGET_FILES)
diff --git a/lib/tftp/src/tftp.erl b/lib/tftp/src/tftp.erl
index 31e4c651e8..a32d0dca9c 100644
--- a/lib/tftp/src/tftp.erl
+++ b/lib/tftp/src/tftp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -79,7 +79,7 @@
%%% setuid_socket_wrap. Then the command line argument
%%% "-tftpd_69 22" will trigger the prebound file
%%% descriptor 22 to be used instead of opening port 69.
-%%% The UDP option {udp, [{fd, 22}]} autmatically be added.
+%%% The UDP option {udp, [{fd, 22}]} automatically be added.
%%% See init:get_argument/ about command line arguments and
%%% gen_udp:open/2 about UDP options.
%%%
@@ -107,7 +107,7 @@
%%% usage is when used in conjunction with setuid_socket_wrap
%%% to be able to open privileged sockets. For example if the
%%% file descriptor 22 has been opened by setuid_socket_wrap
-%%% and you have choosen my_tftp_fd as init argument, the
+%%% and you have chosen my_tftp_fd as init argument, the
%%% command line should like this "erl -my_tftp_fd 22" and
%%% FileDesc should be set to my_tftpd_fd. This would
%%% automatically imply {fd, 22} to be set as UDP option.
diff --git a/lib/tftp/src/tftp_file.erl b/lib/tftp/src/tftp_file.erl
index 5922fc9418..152131b3d6 100644
--- a/lib/tftp/src/tftp_file.erl
+++ b/lib/tftp/src/tftp_file.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -67,7 +67,7 @@
%% PeerType = inet | inet6
%% PeerHost = ip_address()
%% PeerPort = integer()
-%% Acess = read | write
+%% Access = read | write
%% Filename = string()
%% Mode = string()
%% SuggestedOptions = [{Key, Value}]
@@ -118,7 +118,7 @@ prepare(_Peer, Access, Filename, Mode, SuggestedOptions, Initial) when is_list(I
%% PeerType = inet | inet6
%% PeerHost = ip_address()
%% PeerPort = integer()
-%% Acess = read | write
+%% Access = read | write
%% Filename = string()
%% Mode = string()
%% SuggestedOptions = [{Key, Value}]
@@ -135,10 +135,10 @@ prepare(_Peer, Access, Filename, Mode, SuggestedOptions, Initial) when is_list(I
%%
%% Opens a file for read or write access.
%%
-%% On the client side where the open/4 call has been preceeded by a
+%% On the client side where the open/4 call has been preceded by a
%% call to prepare/4, all options must be accepted or rejected.
-%% On the server side, where there are no preceeding prepare/4 call,
-%% noo new options may be added, but the ones that are present as
+%% On the server side, where there are no preceding prepare/4 call,
+%% no new options may be added, but the ones that are present as
%% SuggestedOptions may be omitted or replaced with new values
%% in the AcceptedOptions.
%%-------------------------------------------------------------------
diff --git a/lib/tftp/test/Makefile b/lib/tftp/test/Makefile
index 77ec425bac..3eb0886f66 100644
--- a/lib/tftp/test/Makefile
+++ b/lib/tftp/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2021. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -161,7 +161,7 @@ ERL_COMPILE_FLAGS += \
# 1) TFTP_PRIV_DIR must be created
# ----------------------------------------------------
-tests debug opt: $(BUILDTARGET)
+tests $(TYPES): $(BUILDTARGET)
targets: $(TARGET_FILES)
diff --git a/lib/tools/Makefile b/lib/tools/Makefile
index b8625d8074..ebdac6156d 100644
--- a/lib/tools/Makefile
+++ b/lib/tools/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2021. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -24,7 +24,7 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk
# Macros
# ----------------------------------------------------
-SUB_DIRECTORIES = c_src src doc/src examples emacs
+SUB_DIRECTORIES = src doc/src examples emacs
include vsn.mk
VSN = $(TOOLS_VSN)
@@ -37,5 +37,6 @@ SPECIAL_TARGETS =
include $(ERL_TOP)/make/otp_subdir.mk
DIA_PLT_APPS=compiler runtime_tools
+TEST_NEEDS_RELEASE=true
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/tools/bin/.gitignore b/lib/tools/bin/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/tools/bin/.gitignore
+++ /dev/null
diff --git a/lib/tools/c_src/Makefile b/lib/tools/c_src/Makefile
deleted file mode 100644
index 0cdc50e6f5..0000000000
--- a/lib/tools/c_src/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-#
-# Invoke with GNU make or clearmake -C gnu.
-#
-
-include $(ERL_TOP)/make/run_make.mk
-
diff --git a/lib/tools/c_src/Makefile.in b/lib/tools/c_src/Makefile.in
deleted file mode 100644
index 878aa2cde6..0000000000
--- a/lib/tools/c_src/Makefile.in
+++ /dev/null
@@ -1,221 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 2009-2020. All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# %CopyrightEnd%
-#
-
-include $(ERL_TOP)/make/output.mk
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/erts/include/internal/$(TARGET)/ethread.mk
-
-USING_VC=@MIXED_VC@
-
-CC=@CC@
-LD=@LD@
-AR=@AR@
-RANLIB=@RANLIB@
-MKDIR=@MKDIR@
-INSTALL=@INSTALL@
-INSTALL_DIR=@INSTALL_DIR@
-INSTALL_DATA=@INSTALL_DATA@
-INSTALL_PROGRAM=@INSTALL_PROGRAM@
-LDFLAGS=@LDFLAGS@
-
-ifeq ($(TYPE),debug)
-CFLAGS = @DEBUG_CFLAGS@ -DDEBUG
-TYPEMARKER=.debug
-PRE_LD =
-ifeq ($(TARGET),win32)
-LDFLAGS += -g
-endif
-else
-override TYPE=opt
-CFLAGS = @CFLAGS@
-PRE_LD =
-TYPEMARKER =
-endif
-
-ifeq ($(findstring -D_GNU_SOURCE,$(CFLAGS)),)
-THR_DEFS = $(ETHR_DEFS)
-else
-# Remove duplicate -D_GNU_SOURCE
-THR_DEFS = $(filter-out -D_GNU_SOURCE%, $(ETHR_DEFS))
-endif
-
-LIBS=@LIBS@
-CREATE_DIRS=
-
-TT_DIR=$(TARGET)/$(TYPE)
-
-BIN_DIR=../bin/$(TARGET)
-OBJ_DIR=../obj/$(TT_DIR)
-
-CREATE_DIRS += $(BIN_DIR) $(OBJ_DIR)
-
-PROGS=
-DRIVERS=
-
-
-#
-# emem sources, objects, includes, libs, etc...
-#
-
-
-ifneq ($(strip $(ETHR_LIB_NAME)),)
-# Need ethread package for emem
-PROGS += $(BIN_DIR)/emem$(TYPEMARKER)@EXEEXT@
-endif
-
-EMEM_OBJ_DIR=$(OBJ_DIR)/emem
-CREATE_DIRS += $(EMEM_OBJ_DIR)
-
-EMEM_INCLUDES = -I$(ERL_TOP)/erts/include \
- -I$(ERL_TOP)/erts/include/$(TARGET) \
- -I$(ERL_TOP)/erts/include/internal \
- -I$(ERL_TOP)/erts/include/internal/$(TARGET)
-
-EMEM_HEADERS = erl_memory_trace_block_table.h
-EMEM_SRCS = erl_memory.c erl_memory_trace_block_table.c
-
-EMEM_CFLAGS = $(THR_DEFS) $(subst O2,O3, $(CFLAGS)) $(EMEM_INCLUDES)
-EMEM_LDFLAGS = $(LDFLAGS)
-
-ifeq ($(USING_VC), yes)
-ifeq ($(TYPE),debug)
-MT_LIB=MDd
-else
-MT_LIB=MD
-endif
-
-EMEM_CFLAGS += -$(MT_LIB)
-EMEM_LDFLAGS += -$(MT_LIB)
-EMEM_ERTS_LIB=erts_$(MT_LIB)$(TYPEMARKER)
-
-else
-
-EMEM_ERTS_LIB=erts_r$(TYPEMARKER)
-
-endif
-
-EMEM_ETHR_LIBS=$(subst -l$(ETHR_LIB_NAME),-l$(ETHR_LIB_NAME)$(TYPEMARKER),$(subst -lerts_internal_r,-lerts_internal_r$(TYPEMARKER),$(ETHR_LIBS)))
-
-EMEM_LIBS = $(LIBS) \
- -L$(ERL_TOP)/erts/lib/$(TARGET) \
- -L$(ERL_TOP)/erts/lib/internal/$(TARGET) \
- -l$(EMEM_ERTS_LIB) \
- $(EMEM_ETHR_LIBS)
-
-EMEM_OBJS = $(addprefix $(EMEM_OBJ_DIR)/,$(notdir $(EMEM_SRCS:.c=.o)))
-
-ERTS_LIB = $(ERL_TOP/erts/lib_src/obj/$(TARGET)/$(TYPE)/MADE
-
-#
-# Misc targets
-#
-
-_create_dirs := $(shell mkdir -p $(CREATE_DIRS))
-
-all: $(PROGS) $(DRIVERS)
-
-$(ERTS_LIB):
- $(make_verbose)cd $(ERL_TOP)/erts/lib_src && $(MAKE) $(TYPE)
-
-
-docs:
-
-clean:
- $(RM) -r ../obj/*
- $(RM) -r ../bin/*
- $(RM) ./*~
-
-.PHONY: all erts_lib docs clean
-
-#
-# Object targets
-#
-
-$(EMEM_OBJ_DIR)/%.o: %.c
- $(V_CC) $(EMEM_CFLAGS) -o $@ -c $<
-
-#
-# Driver targets
-#
-
-#
-# Program targets
-#
-
-$(BIN_DIR)/emem$(TYPEMARKER)@EXEEXT@: $(EMEM_OBJS) $(ERTS_LIB)
- $(ld_verbose)$(PRE_LD) $(LD) $(EMEM_LDFLAGS) -o $@ $(EMEM_OBJS) $(EMEM_LIBS)
-
-#
-# Release targets
-#
-include $(ERL_TOP)/make/otp_release_targets.mk
-include ../vsn.mk
-RELSYSDIR = $(RELEASE_PATH)/lib/tools-$(TOOLS_VSN)
-
-release_spec: all
- $(INSTALL_DIR) "$(RELSYSDIR)/c_src"
- $(INSTALL_DATA) $(EMEM_SRCS) $(EMEM_HEADERS) "$(RELSYSDIR)/c_src"
-ifneq ($(PROGS),)
- $(INSTALL_DIR) "$(RELSYSDIR)/bin"
- $(INSTALL_PROGRAM) $(PROGS) "$(RELSYSDIR)/bin"
-endif
-
-release_docs_spec:
-
-.PHONY: release_spec release_docs_spec
-
-#
-# Make dependencies
-#
-
-ifeq ($(USING_VC), yes)
-DEP_CC=@EMU_CC@
-else
-DEP_CC=$(CC)
-endif
-
-SED_REPL_EMEM_OBJ_DIR=s|^\([^:]*\)\.o:|$$(EMEM_OBJ_DIR)/\1.o:|g
-SED_REPL_OBJ_DIR=s|^\([^:]*\)\.o:|$$(OBJ_DIR)/\1.o:|g
-SED_REPL_TT_DIR=s|$(TT_DIR)/|$$(TT_DIR)/|g
-SED_REPL_TARGET=s|$(TARGET)/|$$(TARGET)/|g
-SED_REPL_ERL_TOP=s|$(ERL_TOP)/|$$(ERL_TOP)/|g
-
-SED_EMEM_DEPEND=sed '$(SED_REPL_EMEM_OBJ_DIR);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET);$(SED_REPL_ERL_TOP)'
-SED_DEPEND=sed '$(SED_REPL_OBJ_DIR);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET);$(SED_REPL_ERL_TOP)'
-
-DEPEND_MK=depend.mk
-
-dep depend:
- [ $(v_p) == 0 ] && echo " GEN "$(DEPEND_MK)
- $(V_colon)@echo "Generating dependency file $(DEPEND_MK)..."
- @echo "# Generated dependency rules." > $(DEPEND_MK);
- @echo "# Do *not* edit this file; instead, run 'make depend'." \
- >> $(DEPEND_MK);
- @echo "# " >> $(DEPEND_MK);
- @echo "# emem objects..." >> $(DEPEND_MK);
- $(DEP_CC) -MM $(EMEM_CFLAGS) $(EMEM_SRCS) \
- | $(SED_EMEM_DEPEND) >> $(DEPEND_MK)
- @echo "# EOF" >> $(DEPEND_MK);
-
-.PHONY: dep depend
-
-include $(DEPEND_MK)
-
-# eof
diff --git a/lib/tools/c_src/depend.mk b/lib/tools/c_src/depend.mk
deleted file mode 100644
index 01da30e7c6..0000000000
--- a/lib/tools/c_src/depend.mk
+++ /dev/null
@@ -1,17 +0,0 @@
-# Generated dependency rules.
-# Do *not* edit this file; instead, run 'make depend'.
-#
-# emem objects...
-$(EMEM_OBJ_DIR)/erl_memory.o: erl_memory.c \
- $(ERL_TOP)/erts/include/erl_fixed_size_int_types.h \
- $(ERL_TOP)/erts/include/$(TARGET)/erl_int_sizes_config.h \
- $(ERL_TOP)/erts/include/erl_memory_trace_parser.h \
- erl_memory_trace_block_table.h \
- $(ERL_TOP)/erts/include/internal/ethread.h \
- $(ERL_TOP)/erts/include/internal/$(TARGET)/ethread_header_config.h
-$(EMEM_OBJ_DIR)/erl_memory_trace_block_table.o: erl_memory_trace_block_table.c \
- erl_memory_trace_block_table.h \
- $(ERL_TOP)/erts/include/erl_fixed_size_int_types.h \
- $(ERL_TOP)/erts/include/$(TARGET)/erl_int_sizes_config.h \
- $(ERL_TOP)/erts/include/erl_memory_trace_parser.h
-# EOF
diff --git a/lib/tools/c_src/erl_memory.c b/lib/tools/c_src/erl_memory.c
deleted file mode 100644
index bbd4b3f2ef..0000000000
--- a/lib/tools/c_src/erl_memory.c
+++ /dev/null
@@ -1,2947 +0,0 @@
-/*
- * %CopyrightBegin%
- *
- * Copyright Ericsson AB 2003-2021. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * %CopyrightEnd%
- */
-
-/*
- * Description:
- *
- * Author: Rickard Green
- */
-
-/* Headers to include ... */
-
-#ifdef __WIN32__
-# include <winsock2.h>
-# undef WIN32_LEAN_AND_MEAN
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-typedef int socklen_t;
-#else
-# if defined(__linux__) && defined(__GNUC__)
-# define _GNU_SOURCE 1
-# endif
-# include <unistd.h>
-# include <sys/types.h>
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <fcntl.h>
-# include <netdb.h>
-# include <arpa/inet.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <string.h>
-
-#include "erl_fixed_size_int_types.h"
-#include "erl_memory_trace_parser.h"
-#include "erl_memory_trace_block_table.h"
-#include "ethread.h"
-
-/* Increment when changes are made */
-#define EMEM_VSN_STR "0.9"
-
-/* Features not fully implemented yet */
-#define EMEM_A_SWITCH 0
-#define EMEM_C_SWITCH 0
-#define EMEM_c_SWITCH 0
-#define EMEM_d_SWITCH 0
-
-/* Some system specific defines ... */
-#ifdef __WIN32__
-# define ssize_t int
-# define GET_SOCK_ERRNO() (WSAGetLastError() - WSABASEERR)
-# define IS_INVALID_SOCKET(X) ((X) == INVALID_SOCKET)
-# ifdef __GNUC__
-# define INLINE __inline__
-# else
-# define INLINE __forceinline
-# endif
-# define DIR_SEP_CHAR '\\'
-#else
-# define SOCKET int
-# define closesocket close
-# define GET_SOCK_ERRNO() (errno ? errno : INT_MAX)
-# define INVALID_SOCKET (-1)
-# define IS_INVALID_SOCKET(X) ((X) < 0)
-# ifdef __GNUC__
-# define INLINE __inline__
-# else
-# define INLINE
-# endif
-# define DIR_SEP_CHAR '/'
-#endif
-
-#define EM_ERL_CMD_FILE_NAME "erl_cmd.txt"
-#define EM_OUTPUT_FILE_SUFFIX ".emem"
-
-#define PRINT_OPERATIONS 0
-
-/* In VC++, noreturn is a declspec that has to be before the types,
- * but in GNUC it is an attribute to be placed between return type
- * and function name, hence __decl_noreturn <types> __noreturn <function name>
- *
- * at some platforms (e.g. Android) __noreturn is defined at sys/cdef.h
- */
-#if __GNUC__
-# define __decl_noreturn
-# ifndef __noreturn
-# define __noreturn __attribute__((noreturn))
-# endif
-#else
-# if defined(__WIN32__) && defined(_MSC_VER)
-# define __noreturn
-# define __decl_noreturn __declspec(noreturn)
-# else
-# define __noreturn
-# define __decl_noreturn
-# endif
-#endif
-
-/* Our own assert() ... */
-#ifdef DEBUG
-#define ASSERT(A) ((A) ? (void)1 : assert_failed(__FILE__, __LINE__, #A))
-#include <stdio.h>
-__decl_noreturn static void __noreturn assert_failed(char *f, int l, char *a)
-{
- fprintf(stderr, "%s:%d: Assertion failed: %s\n", f, l, a);
- abort();
-}
-
-#else
-#define ASSERT(A) ((void) 1)
-#endif
-
-#define ERR_RET(X) return (X)
-#if 1
-# undef ERR_RET
-# define ERR_RET(X) abort()
-#endif
-
-/* #define HARD_DEBUG */
-
-
-#define EM_EXIT_RESULT (EMTBT_MIN_ERROR - 1)
-#define EM_TRUNCATED_TRACE_ERROR (EMTBT_MIN_ERROR - 2)
-#define EM_INTERNAL_ERROR (EMTBT_MIN_ERROR - 3)
-
-#define EM_DEFAULT_BUF_SZ 8192
-
-#define EM_LINES_UNTIL_HEADER 20
-#define EM_NO_OF_OPS 400
-#define EM_MAX_CONSECUTIVE_TRACE_READS 10
-#define EM_MAX_NO_OF_TRACE_BUFS 1280
-#define EM_MIN_TRACE_READ_SIZE (EM_DEFAULT_BUF_SZ/20)
-#define EM_TIME_FIELD_WIDTH 11
-
-__decl_noreturn static void __noreturn error(int res);
-__decl_noreturn static void __noreturn error_msg(int res, char *msg);
-
-typedef struct {
- usgnd_int_max size;
- usgnd_int_max min_size;
- usgnd_int_max max_size;
- usgnd_int_max max_ever_size;
- usgnd_int_max no;
- usgnd_int_max min_no;
- usgnd_int_max max_no;
- usgnd_int_max max_ever_no;
- usgnd_int_max allocs;
- usgnd_int_max reallocs;
- usgnd_int_max frees;
-} em_mem_info;
-
-typedef struct em_buffer_ {
- struct em_buffer_ *next;
- int write;
- char *data;
- char *data_end;
- char *end;
- size_t size;
- char start[EM_DEFAULT_BUF_SZ];
-} em_buffer;
-
-typedef struct {
- int no_writer;
- int no_reader;
- size_t tot_buf_size;
- size_t max_buf_size;
- char *name;
- em_buffer *first;
- em_buffer *last;
- ethr_mutex mutex;
- ethr_cond cond;
- int used_def_buf_a;
- em_buffer def_buf_a;
- int used_def_buf_b;
- em_buffer def_buf_b;
-} em_buf_queue;
-
-typedef struct {
- char *ptr;
- size_t size;
-} em_area;
-
-typedef struct {
- char *name;
- int ix;
-} em_output_types;
-
-typedef struct {
-
- /* Memory allocation functions */
- void * (*alloc)(size_t);
- void * (*realloc)(void *, size_t);
- void (*free)(void *);
-
- emtbt_table *block_table;
- emtbt_table **carrier_table;
-
- struct {
- em_mem_info total;
- em_mem_info *btype;
- em_mem_info *allctr;
- em_mem_info **allctr_prv_crr;
- em_mem_info **allctr_usd_crr;
-
- struct {
- usgnd_int_32 secs;
- usgnd_int_32 usecs;
- } stop_time;
- emtp_op_type stop_reason;
- usgnd_int_32 exit_status;
- } info;
-
- /* Input ... */
- struct {
- usgnd_int_16 listen_port;
- SOCKET socket;
- usgnd_int_max total_trace_size;
- int error;
- char *error_descr;
- em_buf_queue queue;
- } input;
-
- /* Output ... */
- struct {
- usgnd_int_32 next_print;
- usgnd_int_32 next_print_inc;
- char *header;
- size_t header_size;
- size_t values_per_object;
- size_t values_per_line;
- size_t field_width;
- int verbose;
- int total;
- int all_allctrs;
- int no_allctrs;
- em_output_types *allctrs;
- int all_btypes;
- int no_btypes;
- em_output_types *btypes;
- int max_min_values;
- int block_counts;
- int op_counts;
- int lines_until_header;
- FILE *stream;
- char *file_name;
-#if EMEM_d_SWITCH
- char *dir_name;
- FILE *erl_cmd_file;
- struct {
- ethr_mutex *mutex;
- ethr_cond *cond;
- } go;
-#endif
- em_buf_queue queue;
- } output;
-
- /* Trace info */
- emtp_state *trace_state;
- emtp_info trace_info;
-
-} em_state;
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * Threads... *
- * *
-\* */
-
-static INLINE void
-mutex_init(ethr_mutex *mtx)
-{
- int res = ethr_mutex_init(mtx);
- if (res)
- error_msg(res, "Mutex init");
-}
-
-static INLINE void
-mutex_destroy(ethr_mutex *mtx)
-{
- int res = ethr_mutex_destroy(mtx);
- if (res)
- error_msg(res, "Mutex destroy");
-}
-
-static INLINE void
-mutex_lock(ethr_mutex *mtx)
-{
- ethr_mutex_lock(mtx);
-}
-
-static INLINE void
-mutex_unlock(ethr_mutex *mtx)
-{
- ethr_mutex_unlock(mtx);
-}
-
-static INLINE void
-cond_init(ethr_cond *cnd)
-{
- int res = ethr_cond_init(cnd);
- if (res)
- error_msg(res, "Cond init");
-}
-
-static INLINE void
-cond_destroy(ethr_cond *cnd)
-{
- int res = ethr_cond_destroy(cnd);
- if (res)
- error_msg(res, "Cond destroy");
-}
-
-static INLINE void
-cond_wait(ethr_cond *cnd, ethr_mutex *mtx)
-{
- int res = ethr_cond_wait(cnd, mtx);
- if (res != 0 && res != EINTR)
- error_msg(res, "Cond wait");
-}
-
-static INLINE void
-cond_signal(ethr_cond *cnd)
-{
- ethr_cond_signal(cnd);
-}
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * Buffer queues *
- * *
-\* */
-
-static INLINE void
-reset_buffer(em_buffer *b, size_t size)
-{
- b->write = 1;
- b->next = NULL;
- if (size) {
- b->size = size;
- b->end = b->start + size;
- }
- b->data_end = b->data = b->start;
-}
-
-static void
-init_queue(em_state *state, em_buf_queue *queue)
-{
- reset_buffer(&queue->def_buf_a, EM_DEFAULT_BUF_SZ);
- reset_buffer(&queue->def_buf_b, EM_DEFAULT_BUF_SZ);
- queue->first = NULL;
- queue->last = NULL;
- queue->no_writer = 0;
- queue->no_reader = 0;
- queue->tot_buf_size = 0;
- queue->max_buf_size = ~0;
- queue->name = "";
- queue->used_def_buf_a = 0;
- queue->used_def_buf_b = 0;
- mutex_init(&queue->mutex);
- cond_init(&queue->cond);
-}
-
-static void
-destroy_queue(em_state *state, em_buf_queue *queue)
-{
- while (queue->first) {
- em_buffer *buf = queue->first;
- queue->first = queue->first->next;
- if (buf != &queue->def_buf_a && buf != &queue->def_buf_b)
- (*state->free)((void *) buf);
- }
- mutex_destroy(&queue->mutex);
- cond_destroy(&queue->cond);
-}
-
-static void
-disconnect_queue_writer(em_buf_queue *queue)
-{
- mutex_lock(&queue->mutex);
- queue->no_writer = 1;
- cond_signal(&queue->cond);
- mutex_unlock(&queue->mutex);
-}
-
-static void
-disconnect_queue_reader(em_buf_queue *queue)
-{
- mutex_lock(&queue->mutex);
- queue->no_reader = 1;
- cond_signal(&queue->cond);
- mutex_unlock(&queue->mutex);
-}
-
-static int
-is_queue_writer_disconnected(em_buf_queue *queue)
-{
- int res;
- mutex_lock(&queue->mutex);
- res = queue->no_writer;
- mutex_unlock(&queue->mutex);
- return res;
-}
-
-static int
-is_queue_reader_disconnected(em_buf_queue *queue)
-{
- int res;
- mutex_lock(&queue->mutex);
- res = queue->no_reader;
- mutex_unlock(&queue->mutex);
- return res;
-}
-
-static INLINE void
-dequeue(em_state *state, em_buf_queue *queue)
-{
- em_buffer *buf;
-
- ASSERT(queue->first);
- ASSERT(queue->tot_buf_size > 0);
-
- buf = queue->first;
- queue->first = buf->next;
- if (!queue->first)
- queue->last = NULL;
-
- ASSERT(queue->tot_buf_size >= buf->size);
- queue->tot_buf_size -= buf->size;
-
- if (buf == &queue->def_buf_a)
- queue->used_def_buf_a = 0;
- else if (buf == &queue->def_buf_b)
- queue->used_def_buf_b = 0;
- else
- (*state->free)((void *) buf);
-
-}
-
-
-static INLINE em_buffer *
-enqueue(em_state *state, em_buf_queue *queue, size_t min_size)
-{
- em_buffer *buf;
-
- if (min_size > EM_DEFAULT_BUF_SZ)
- goto alloc_buf;
-
- if (!queue->used_def_buf_a) {
- buf = &queue->def_buf_a;
- queue->used_def_buf_a = 1;
- reset_buffer(buf, 0);
- }
- else if (!queue->used_def_buf_b) {
- buf = &queue->def_buf_b;
- queue->used_def_buf_b = 1;
- reset_buffer(buf, 0);
- }
- else {
- size_t bsize;
- alloc_buf:
-
- bsize = EM_DEFAULT_BUF_SZ;
- if (bsize < min_size)
- bsize = min_size;
-
- buf = (em_buffer *) (*state->alloc)(sizeof(em_buffer)
- + (sizeof(char)
- * (bsize-EM_DEFAULT_BUF_SZ)));
- if (!buf)
- error(ENOMEM);
- buf->size = bsize;
- reset_buffer(buf, bsize);
- }
-
- if (queue->last) {
- ASSERT(queue->first);
- queue->last->write = 0;
- queue->last->next = buf;
- }
- else {
- ASSERT(!queue->first);
- queue->first = buf;
- }
-
- queue->tot_buf_size += buf->size;
- queue->last = buf;
-
- return buf;
-}
-
-static void
-get_next_read_area(em_area *area, em_state *state, em_buf_queue *queue)
-{
- mutex_lock(&queue->mutex);
-
- while (!queue->first || queue->first->data == queue->first->data_end) {
- if (queue->first && (!queue->first->write
- || queue->first->data == queue->first->end)) {
- dequeue(state, queue);
- continue;
- }
-
- if (queue->no_writer) {
- area->ptr = NULL;
- area->size = 0;
- mutex_unlock(&queue->mutex);
- return;
- }
- cond_wait(&queue->cond, &queue->mutex);
- }
-
- ASSERT(queue->first->data < queue->first->data_end);
-
- area->ptr = queue->first->data;
- area->size = queue->first->data_end - queue->first->data;
-
- queue->first->data = queue->first->data_end;
-
- mutex_unlock(&queue->mutex);
-}
-
-static INLINE void
-wrote_area_aux(em_area *area, em_state *state, em_buf_queue *queue, int do_lock)
-{
- em_buffer *buf;
-
- if (do_lock)
- mutex_lock(&queue->mutex);
-
- buf = queue->last;
-
- ASSERT(area->ptr);
- ASSERT(area->size);
-
- ASSERT(buf);
- ASSERT(buf->data_end == area->ptr);
- ASSERT(buf->end >= area->ptr + area->size);
-
- buf->data_end = area->ptr + area->size;
-
- area->ptr = NULL;
- area->size = 0;
-
- cond_signal(&queue->cond);
-
- if (do_lock)
- mutex_unlock(&queue->mutex);
-}
-
-static INLINE void
-wrote_area(em_area *area, em_state *state, em_buf_queue *queue)
-{
- wrote_area_aux(area, state, queue, 1);
-}
-
-static void
-get_next_write_area(em_area *area, em_state *state, em_buf_queue *queue,
- size_t size)
-{
- em_buffer *buf;
-
- mutex_lock(&queue->mutex);
-
- ASSERT(!area->size || area->ptr);
-
- if (area->size)
- wrote_area_aux(area, state, queue, 0);
-
- buf = ((queue->last && queue->last->end - queue->last->data_end >= size)
- ? queue->last
- : enqueue(state, queue, size));
-
- ASSERT(buf);
- ASSERT(buf->end - buf->data_end >= size);
- area->ptr = buf->data_end;
- area->size = buf->end - buf->data_end;
-
- if (queue->tot_buf_size > queue->max_buf_size) {
- fprintf(stderr,
- "emem: Maximum %s buffer size (%lu) exceeded. "
- "Terminating...\n",
- queue->name,
- (unsigned long) queue->max_buf_size);
- exit(1);
- }
-
- mutex_unlock(&queue->mutex);
-
-}
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * Output *
- * *
-\* */
-
-static INLINE size_t
-write_str(char **dstpp, char *srcp)
-{
- size_t i = 0;
- if (dstpp)
- while (srcp[i])
- *((*dstpp)++) = srcp[i++];
- else
- while (srcp[i]) i++;
- return i;
-}
-
-
-static size_t
-write_strings(char **ptr,
- char **strings,
- char *first_line_prefix,
- char *line_prefix,
- size_t max_line_size)
-{
- size_t size;
- size_t tot_size = 0;
- size_t line_size = 0;
- size_t line_prefix_size;
- sgnd_int_32 ix;
-
- tot_size = line_size = line_prefix_size = write_str(ptr, first_line_prefix);
-
- for (ix = 0; strings[ix]; ix++) {
- size = write_str(NULL, strings[ix]);
- if (line_size + 1 + size > max_line_size) {
- tot_size += write_str(ptr, "\n");
- tot_size += write_str(ptr, line_prefix);
- line_size = line_prefix_size;
- }
- tot_size += write_str(ptr, " ");
- tot_size += ptr ? write_str(ptr, strings[ix]) : size;
- line_size += 1 + size;
- }
-
- tot_size += write_str(ptr, "\n");
-
- return tot_size;
-}
-
-static size_t
-write_title(char **bufp, size_t *overflow, size_t width, char *str)
-{
- size_t i, sz, ws;
- char *p, *endp;
-
- /*
- * Writes at least one '|' character at the beginning.
- * Right aligns "str".
- * If "str" is larger than "width - 1" and overflow is NULL,
- * then "str" is trucated; otherwise, string is not truncated.
- */
-
- if (width <= 0)
- return 0;
-
- if (!bufp && !overflow)
- return width;
-
- sz = strlen(str) + 1;
- if (sz > width) {
- ws = 0;
- if (overflow)
- *overflow += sz - width;
- else
- sz = width;
- }
- else {
- ws = width - sz;
- if (overflow) {
- if (ws >= *overflow) {
- ws -= *overflow;
- *overflow = 0;
- }
- else {
- *overflow -= ws;
- ws = 0;
- }
- }
- sz += ws;
- }
- if (!bufp)
- return sz;
-
- p = *bufp;
- endp = p + width;
-
- *(p++) = '|';
- while (ws > 1) {
- ws--;
- *(p++) = ' ';
- }
-
- i = 0;
- while (str[i] && (overflow || p < endp))
- *(p++) = str[i++];
-
- while (ws) {
- ws--;
- *(p++) = ' ';
- }
-
- ASSERT(overflow || p == endp);
- ASSERT(sz == (size_t) (p - *bufp));
- *bufp = p;
- return sz;
-}
-
-static size_t
-write_obj_sub_titles(em_state *state, char **bufp, size_t *overflow)
-{
- size_t field_width = state->output.field_width;
- size_t size = write_title(bufp, overflow, field_width, "size");
- if (state->output.max_min_values) {
- size += write_title(bufp, overflow, field_width, "min size");
- size += write_title(bufp, overflow, field_width, "max size");
- }
- if (state->output.block_counts) {
- size += write_title(bufp, overflow, field_width, "no");
- if (state->output.max_min_values) {
- size += write_title(bufp, overflow, field_width, "min no");
- size += write_title(bufp, overflow, field_width, "max no");
- }
- }
- if (state->output.op_counts) {
- size += write_title(bufp, overflow, field_width, "alloc()");
- size += write_title(bufp, overflow, field_width, "realloc()");
- size += write_title(bufp, overflow, field_width, "free()");
- }
-
- return size;
-}
-
-static size_t
-write_header(em_state *state, char *ptr, int trunc)
-{
-#define MIN_LTEXT_SZ 18
-#define HEADER_EOL_STR "|\n"
- char *p;
- char **pp;
- int i;
- size_t overflow;
- size_t *ofp;
- size_t obj_size = state->output.values_per_object*state->output.field_width;
- size_t size = 0;
- int have_seg_crr = state->trace_info.have_segment_carrier_info;
-
- if (ptr) {
- p = ptr;
- pp = &p;
- }
- else {
- p = NULL;
- pp = NULL;
- }
-
- overflow = 0;
- ofp = trunc ? NULL : &overflow;
-
- size += write_title(pp, ofp, EM_TIME_FIELD_WIDTH, "time");
-
- if (state->output.total) {
- int no = 1;
- if (have_seg_crr) {
- if (state->info.allctr_prv_crr[state->trace_info.segment_ix])
- no++;
- if (state->info.allctr_usd_crr[state->trace_info.segment_ix])
- no++;
- }
- size += write_title(pp, ofp, (have_seg_crr ? 3 : 1)*obj_size, "total");
- }
-
- for (i = 0; i < state->output.no_allctrs; i++) {
- int no = 1;
- if (state->info.allctr_prv_crr[state->output.allctrs[i].ix])
- no++;
- if (state->info.allctr_usd_crr[state->output.allctrs[i].ix])
- no++;
- size += write_title(pp, ofp, no*obj_size, state->output.allctrs[i].name);
- }
-
- for (i = 0; i < state->output.no_btypes; i++)
- size += write_title(pp, ofp, obj_size, state->output.btypes[i].name);
-
- size += write_str(pp, HEADER_EOL_STR);
-
- overflow = 0;
- size += write_title(pp, ofp, EM_TIME_FIELD_WIDTH, "");
-
- if (state->output.total) {
- size += write_title(pp, ofp, obj_size, (obj_size <= MIN_LTEXT_SZ
- ? "alcd blks"
- : "allocated blocks"));
- if (have_seg_crr) {
- if (state->info.allctr_prv_crr[state->trace_info.segment_ix])
- size += write_title(pp, ofp, obj_size, (obj_size <= MIN_LTEXT_SZ
- ? "mpd segs"
- : "mapped segments"));
- if (state->info.allctr_usd_crr[state->trace_info.segment_ix])
- size += write_title(pp, ofp, obj_size, (obj_size <= MIN_LTEXT_SZ
- ? "chd segs"
- : "cached segments"));
- }
- }
-
- for (i = 0; i < state->output.no_allctrs; i++) {
- size += write_title(pp, ofp, obj_size, (obj_size <= MIN_LTEXT_SZ
- ? "alcd blks"
- : "allocated blocks"));
- if (state->info.allctr_prv_crr[state->output.allctrs[i].ix])
- size += write_title(pp, ofp, obj_size, (obj_size <= MIN_LTEXT_SZ
- ? "prvd crrs"
- : "provided carriers"));
- if (state->info.allctr_usd_crr[state->output.allctrs[i].ix])
- size += write_title(pp, ofp, obj_size, (obj_size <= MIN_LTEXT_SZ
- ? "usd crrs"
- : "used carriers"));
- }
- for (i = 0; i < state->output.no_btypes; i++)
- size += write_title(pp, ofp, obj_size, (obj_size <= MIN_LTEXT_SZ
- ? "alcd blks"
- : "allocated blocks"));
-
-
- size += write_str(pp, HEADER_EOL_STR);
- overflow = 0;
- size += write_title(pp, ofp, EM_TIME_FIELD_WIDTH, "");
-
- if (state->output.total) {
- size += write_obj_sub_titles(state, pp, ofp);
- if (have_seg_crr) {
- if (state->info.allctr_prv_crr[state->trace_info.segment_ix])
- size += write_obj_sub_titles(state, pp, ofp);
- if (state->info.allctr_usd_crr[state->trace_info.segment_ix])
- size += write_obj_sub_titles(state, pp, ofp);
- }
- }
-
- for (i = 0; i < state->output.no_allctrs; i++) {
- size += write_obj_sub_titles(state, pp, ofp);
- if (state->info.allctr_prv_crr[state->output.allctrs[i].ix])
- size += write_obj_sub_titles(state, pp, ofp);
- if (state->info.allctr_usd_crr[state->output.allctrs[i].ix])
- size += write_obj_sub_titles(state, pp, ofp);
- }
-
- for (i = 0; i < state->output.no_btypes; i++)
- size += write_obj_sub_titles(state, pp, ofp);
-
- size += write_str(pp, HEADER_EOL_STR);
-#undef MIN_LTEXT_SZ
-#undef HEADER_EOL_STR
- return size;
-}
-
-static INLINE void
-write_mem_info(em_state *state, char **p, em_mem_info *mi)
-{
- int fw = state->output.field_width - 1;
- *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->size);
- if (state->output.max_min_values)
- *p += sprintf(*p,
- "%*" USGND_INT_MAX_FSTR
- " %*" USGND_INT_MAX_FSTR " ",
- fw, mi->min_size,
- fw, mi->max_size);
- if (state->output.block_counts) {
- *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->no);
- if (state->output.max_min_values)
- *p += sprintf(*p,
- "%*" USGND_INT_MAX_FSTR
- " %*" USGND_INT_MAX_FSTR " ",
- fw, mi->min_no,
- fw, mi->max_no);
- }
- if (state->output.op_counts)
- *p += sprintf(*p,
- "%*" USGND_INT_MAX_FSTR
- " %*" USGND_INT_MAX_FSTR
- " %*" USGND_INT_MAX_FSTR " ",
- fw, mi->allocs,
- fw, mi->reallocs,
- fw, mi->frees);
-
- /* Update max ever values */
- if (mi->max_ever_size < mi->max_size)
- mi->max_ever_size = mi->max_size;
- if (mi->max_ever_no < mi->max_no)
- mi->max_ever_no = mi->max_no;
- /* Reset max/min values */
- mi->max_size = mi->min_size = mi->size;
- mi->max_no = mi->min_no = mi->no;
-}
-
-static INLINE void
-write_max_ever_mem_info(em_state *state, char **p, em_mem_info *mi)
-{
- int fw = state->output.field_width - 1;
- *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->max_ever_size);
- if (state->output.max_min_values)
- *p += sprintf(*p, "%*s %*s ", fw, "", fw, "");
- if (state->output.block_counts) {
- *p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->max_ever_no);
- if (state->output.max_min_values)
- *p += sprintf(*p, "%*s %*s ", fw, "", fw, "");
- }
- if (state->output.op_counts)
- *p += sprintf(*p, "%*s %*s %*s ", fw, "", fw, "", fw, "");
-}
-
-static void
-print_string(em_state *state, char *str)
-{
- em_area area = {NULL, 0};
- char *p;
-
- /* Get area */
-
- get_next_write_area(&area,state,&state->output.queue,write_str(NULL,str));
-
- p = area.ptr;
- area.size = write_str(&p, str);
-
- /* Leave area */
-
- wrote_area(&area, state, &state->output.queue);
-
-}
-
-static int
-print_emu_arg(em_state *state)
-{
- em_area area = {NULL, 0};
- char hostname[100];
- char carg[22];
- struct sockaddr_in saddr;
- struct hostent *hp;
- struct in_addr iaddr;
- usgnd_int_16 port;
- socklen_t saddr_size = sizeof(saddr);
- size_t size;
- char *format = "> Emulator command line argument: +Mit %s\n";
-
-#ifdef __clang_analyzer__
- /* CodeChecker does not seem to understand getsockname writes to saddr */
- memset(&saddr, 0, sizeof(saddr));
-#endif
- if (getsockname(state->input.socket,
- (struct sockaddr *) &saddr,
- &saddr_size) != 0)
- goto error;
-
- port = ntohs(saddr.sin_port);
-
- ASSERT(state->input.listen_port == 0 || state->input.listen_port == port);
-
- state->input.listen_port = port;
-
- if (gethostname(hostname, sizeof(hostname)) != 0)
- goto error;
-
- hp = gethostbyname(hostname);
- if (!hp)
- goto error;
-
- if (hp->h_addr_list) {
- (void) memcpy(&iaddr.s_addr, *hp->h_addr_list, sizeof(iaddr.s_addr));
- (void) sprintf(carg, "%s:%d", inet_ntoa(iaddr), (int) port);
- }
- else
- (void) sprintf(carg, "127.0.0.1:%d", (int) port);
-
-#if EMEM_d_SWITCH
-
- if (state->output.erl_cmd_file) {
- fprintf(state->output.erl_cmd_file, "+Mit %s\n", carg);
- fclose(state->output.erl_cmd_file);
- state->output.erl_cmd_file = NULL;
- }
-
-#endif
-
- size = strlen(format) + strlen(carg);
-
- /* Get area */
-
- get_next_write_area(&area, state, &state->output.queue, size);
-
- area.size = sprintf(area.ptr, format, carg);
-
- /* Leave area */
-
- wrote_area(&area, state, &state->output.queue);
-
- return 0;
-
- error:
- return GET_SOCK_ERRNO();
-}
-
-static size_t
-write_allocator_info(em_state *state, char *ptr)
-{
- usgnd_int_32 aix, i, j;
- char *header = "> Allocator information:\n";
- char *allctr_str = "> * Allocator:";
- char *crr_prv_str = "> * Carrier providers:";
- char *blk_tp_str = "> * Block types:";
- char *line_prefix = "> ";
- size_t size = 0;
- char **strings;
- size_t strings_size;
- size_t max_line_size = 80;
- char *p = ptr;
- char **pp = ptr ? &p : NULL;
-
- strings_size = state->trace_info.max_block_type_ix + 1;
- if (strings_size < state->trace_info.max_allocator_ix + 1)
- strings_size = state->trace_info.max_allocator_ix + 1;
-
- strings = (char **) (*state->alloc)((strings_size + 1)*sizeof(char *));
- if (!strings)
- error(ENOMEM);
-
- size += write_str(pp, header);
-
- for (aix = 0; aix <= state->trace_info.max_allocator_ix; aix++) {
- emtp_allocator *allctr = state->trace_info.allocator[aix];
- if (!allctr->valid)
- continue;
-
- strings[0] = allctr->name;
- strings[1] = NULL;
- size += write_strings(pp,strings,allctr_str,line_prefix,max_line_size);
-
- i = 0;
- if (allctr->carrier.provider)
- for (j = 0; j < allctr->carrier.no_providers; j++) {
- usgnd_int_32 cpix = allctr->carrier.provider[j];
- if (cpix == state->trace_info.segment_ix)
- strings[i++] = "segment";
- else
- strings[i++] = state->trace_info.allocator[cpix]->name;
- }
- strings[i] = NULL;
- size += write_strings(pp,strings,crr_prv_str,line_prefix,max_line_size);
-
- i = 0;
- for (j = 0; j <= state->trace_info.max_block_type_ix; j++)
- if (state->trace_info.block_type[j]->allocator == aix)
- strings[i++] = state->trace_info.block_type[j]->name;
- strings[i] = NULL;
- size += write_strings(pp,strings,blk_tp_str,line_prefix,max_line_size);
- }
-
- (*state->free)((void *) strings);
-
- return size;
-}
-
-static void
-print_main_header(em_state *state)
-{
-#if HAVE_INT_64
-#define MAX_WORD_SZ_STR "64"
-#else
-#define MAX_WORD_SZ_STR "32"
-#endif
- em_area area = {NULL, 0};
- char *format1 =
- "> emem version: " EMEM_VSN_STR "\n"
- "> Nodename: %s\n"
- "> Hostname: %s\n"
- "> Pid: %s\n"
- "> Start time (UTC): ";
- char *format2 = "%4.4" USGND_INT_32_FSTR
- "-%2.2" USGND_INT_32_FSTR "-%2.2" USGND_INT_32_FSTR
- " %2.2" USGND_INT_32_FSTR ":%2.2" USGND_INT_32_FSTR
- ":%2.2" USGND_INT_32_FSTR ".%6.6" USGND_INT_32_FSTR "\n";
- char *format3 =
- "> Trace parser version: %" USGND_INT_32_FSTR ".%" USGND_INT_32_FSTR
- "\n"
- "> Actual trace version: %" USGND_INT_32_FSTR ".%" USGND_INT_32_FSTR
- "\n"
- "> Maximum trace word size: " MAX_WORD_SZ_STR " bits\n"
- "> Actual trace word size: %d bits\n";
- size_t size = (strlen(format1) +
- (state->trace_info.start_time.month
- ? (strlen(format2) + 7*10)
- : 1)
- + strlen(format3)
- + strlen(state->trace_info.nodename)
- + strlen(state->trace_info.hostname)
- + strlen(state->trace_info.pid)
- + 5*10 + 1);
-
- if (state->output.verbose) {
- size += write_allocator_info(state, NULL);
- }
-
- size += write_header(state, NULL, 0);
-
- /* Get area */
- get_next_write_area(&area, state, &state->output.queue, size);
-
- area.size = sprintf(area.ptr,
- format1,
- state->trace_info.nodename,
- state->trace_info.hostname,
- state->trace_info.pid);
- if (state->trace_info.start_time.month)
- area.size += sprintf(area.ptr + area.size,
- format2,
- state->trace_info.start_time.year,
- state->trace_info.start_time.month,
- state->trace_info.start_time.day,
- state->trace_info.start_time.hour,
- state->trace_info.start_time.minute,
- state->trace_info.start_time.second,
- state->trace_info.start_time.micro_second);
- else
- *(area.ptr + area.size++) = '\n';
- area.size += sprintf(area.ptr + area.size,
- format3,
- state->trace_info.version.parser.major,
- state->trace_info.version.parser.minor,
- state->trace_info.version.trace.major,
- state->trace_info.version.trace.minor,
- state->trace_info.bits);
-
- if (state->output.verbose) {
- area.size += write_allocator_info(state, area.ptr + area.size);
- }
-
- area.size += write_header(state, area.ptr + area.size, 0);
-
- /* Leave area */
- wrote_area(&area, state, &state->output.queue);
-#undef MAX_WORD_SZ_STR
-}
-
-static void
-print_main_footer(em_state *state)
-{
- em_area area = {NULL, 0};
- char *p;
- int i;
- char *stop_str =
- "> Trace stopped\n";
- char *exit_str =
- "> Emulator exited with code: %" USGND_INT_32_FSTR "\n";
- char *format =
- "> Total trace size: %" USGND_INT_MAX_FSTR " bytes\n"
- "> Average band width used: %" USGND_INT_MAX_FSTR " Kbit/s\n";
- size_t size;
- usgnd_int_max tsz = state->input.total_trace_size;
- usgnd_int_32 secs = state->info.stop_time.secs;
- usgnd_int_32 usecs = state->info.stop_time.usecs;
- usgnd_int_max bw;
-
- /* Max size of the max value line. Each value can at most use 21
- characters: largest possible usgnd_int_64 (20 digits) and one
- white space. */
- size = state->output.values_per_line*21 + 1;
-
- switch (state->info.stop_reason) {
- case EMTP_STOP:
- size += strlen(stop_str) + 1;
- break;
- case EMTP_EXIT:
- size += strlen(exit_str);
- size += 10; /* Enough for one unsgn_int_32 */
- size++;
- break;
- default:
- break;
- }
- size += strlen(format);
- size += 2*20; /* Enough for two unsgn_int_64 */
- size += 2;
-
- bw = (tsz + 1023)/1024;
- bw *= 1000;
- bw /= secs*1000 + usecs/1000;
- bw *= 8;
-
- /* Get area */
-
- get_next_write_area(&area, state, &state->output.queue, size);
-
- p = area.ptr;
-
- p += sprintf(p, "> %-*s", EM_TIME_FIELD_WIDTH - 2, "Maximum:");
-
- if (state->output.total) {
- int six = state->trace_info.segment_ix;
- write_max_ever_mem_info(state, &p, &state->info.total);
- if (state->trace_info.have_segment_carrier_info) {
- if (state->info.allctr_prv_crr[six])
- write_max_ever_mem_info(state,
- &p,
- state->info.allctr_prv_crr[six]);
- if (state->info.allctr_usd_crr[six])
- write_max_ever_mem_info(state,
- &p,
- state->info.allctr_usd_crr[six]);
- }
- }
- for (i = 0; i < state->output.no_allctrs; i++) {
- int ix = state->output.allctrs[i].ix;
- write_max_ever_mem_info(state, &p, &state->info.allctr[ix]);
- if (state->info.allctr_prv_crr[ix])
- write_max_ever_mem_info(state,
- &p,
- state->info.allctr_prv_crr[ix]);
- if (state->info.allctr_usd_crr[ix])
- write_max_ever_mem_info(state,
- &p,
- state->info.allctr_usd_crr[ix]);
- }
- for (i = 0; i < state->output.no_btypes; i++)
- write_max_ever_mem_info(state,
- &p,
- &state->info.btype[state->output.btypes[i].ix]);
-
- p += sprintf(p, "\n");
-
- switch (state->info.stop_reason) {
- case EMTP_STOP:
- p += sprintf(p, "%s", stop_str);
- break;
- case EMTP_EXIT:
- p += sprintf(p, exit_str, state->info.exit_status);
- break;
- default:
- break;
- }
-
- p += sprintf(p, format, tsz, bw);
-
- area.size = p - area.ptr;
-
- ASSERT(area.size <= size);
-
- /* Leave area */
-
- wrote_area(&area, state, &state->output.queue);
-
-}
-
-static void
-print_info(em_state *state, usgnd_int_32 secs, char *extra)
-{
- char *p;
- int i;
- size_t size;
- em_area area = {NULL, 0};
-
- /* Get area */
-
- size = 0;
- if (!state->output.lines_until_header)
- size += state->output.header_size;
-
- /* Max size of one line of values. Each value can at most use 21
- characters: largest possible usgnd_int_64 (20 digits) and one white
- space. */
- size += state->output.values_per_line*21 + 1;
-
- if (extra)
- size += write_str(NULL, extra);
-
- get_next_write_area(&area, state, &state->output.queue, size);
-
- /* Write to area */
-
- p = area.ptr;
-
- if (!state->output.lines_until_header) {
- memcpy((void *) area.ptr,
- (void *) state->output.header,
- state->output.header_size);
- p += state->output.header_size;
- state->output.lines_until_header = EM_LINES_UNTIL_HEADER;
- }
- else
- state->output.lines_until_header--;
-
- p += sprintf(p, "%*" USGND_INT_32_FSTR " ", EM_TIME_FIELD_WIDTH - 1, secs);
-
- if (state->output.total) {
- int six = state->trace_info.segment_ix;
- write_mem_info(state, &p, &state->info.total);
- if (state->trace_info.have_segment_carrier_info) {
- if (state->info.allctr_prv_crr[six])
- write_mem_info(state, &p, state->info.allctr_prv_crr[six]);
- if (state->info.allctr_usd_crr[six])
- write_mem_info(state, &p, state->info.allctr_usd_crr[six]);
- }
- }
- for (i = 0; i < state->output.no_allctrs; i++) {
- int ix = state->output.allctrs[i].ix;
- write_mem_info(state, &p, &state->info.allctr[ix]);
- if (state->info.allctr_prv_crr[ix])
- write_mem_info(state, &p, state->info.allctr_prv_crr[ix]);
- if (state->info.allctr_usd_crr[ix])
- write_mem_info(state, &p, state->info.allctr_usd_crr[ix]);
- }
- for (i = 0; i < state->output.no_btypes; i++)
- write_mem_info(state,
- &p,
- &state->info.btype[state->output.btypes[i].ix]);
-
- p += sprintf(p, "\n");
-
- if (extra)
- p += write_str(&p, extra);
-
- ASSERT(area.size >= p - area.ptr);
- area.size = p - area.ptr;
-
- /* Leave area */
-
- wrote_area(&area, state, &state->output.queue);
-}
-
-static void
-reset_mem_info(em_mem_info *mi)
-{
- mi->size = 0;
- mi->min_size = 0;
- mi->max_size = 0;
- mi->max_ever_size = 0;
- mi->no = 0;
- mi->min_no = 0;
- mi->max_no = 0;
- mi->max_ever_no = 0;
- mi->allocs = 0;
- mi->reallocs = 0;
- mi->frees = 0;
-}
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * State creation and destruction *
- * *
-\* */
-
-static void
-destroy_state(em_state *state)
-{
- int i;
- void (*freep)(void *);
-
- freep = state->free;
-
- if (state->block_table)
- emtbt_destroy_table(state->block_table);
-
- if (state->carrier_table) {
- for (i = -1; i <= state->trace_info.max_allocator_ix; i++)
- if (state->carrier_table[i])
- emtbt_destroy_table(state->carrier_table[i]);
- state->carrier_table--;
- (*freep)((void *) state->carrier_table);
- }
-
- if (state->info.btype) {
- state->info.btype--;
- (*freep)((void *) state->info.btype);
- }
-
- if (state->info.allctr) {
- state->info.allctr--;
- (*freep)((void *) state->info.allctr);
- }
-
- if (state->info.allctr_prv_crr) {
- for (i = -1; i <= state->trace_info.max_allocator_ix; i++)
- if (state->info.allctr_prv_crr[i])
- (*freep)((void *) state->info.allctr_prv_crr[i]);
- state->info.allctr_prv_crr--;
- (*freep)((void *) state->info.allctr_prv_crr);
- }
-
-
- if (state->info.allctr_usd_crr) {
- for (i = -1; i <= state->trace_info.max_allocator_ix; i++)
- if (state->info.allctr_usd_crr[i])
- (*freep)((void *) state->info.allctr_usd_crr[i]);
- state->info.allctr_usd_crr--;
- (*freep)((void *) state->info.allctr_usd_crr);
- }
-
- emtp_state_destroy(state->trace_state);
- destroy_queue(state, &state->input.queue);
-
- if (state->output.btypes)
- (*freep)((void *) state->output.btypes);
- if (state->output.allctrs)
- (*freep)((void *) state->output.allctrs);
- destroy_queue(state, &state->output.queue);
-
-#if EMEM_d_SWITCH
-
- if (state->output.go.mutex) {
- mutex_destroy(state->output.go.mutex);
- (*state->free)((void *) state->output.go.mutex);
- state->output.go.mutex = NULL;
- }
- if (state->output.go.cond) {
- cond_destroy(state->output.go.cond);
- (*state->free)((void *) state->output.go.cond);
- state->output.go.cond = NULL;
- }
-
-#endif
-
- if (!IS_INVALID_SOCKET(state->input.socket)) {
- closesocket(state->input.socket);
- state->input.socket = INVALID_SOCKET;
- }
-
- (*freep)((void *) state);
-}
-
-static em_state *
-new_state(void * (*alloc)(size_t),
- void * (*realloc)(void *, size_t),
- void (*free)(void *))
-{
- em_state *state = NULL;
-
- state = (*alloc)(sizeof(em_state));
- if (!state)
- goto error;
-
- /* Stuff that might fail (used after the error label) */
-
- state->trace_state = NULL;
-
- /* Init state ... */
-
- state->alloc = alloc;
- state->realloc = realloc;
- state->free = free;
-
- state->block_table = NULL;
- state->carrier_table = NULL;
-
- reset_mem_info(&state->info.total);
- state->info.btype = NULL;
- state->info.allctr = NULL;
-
- state->info.allctr_prv_crr = NULL;
- state->info.allctr_usd_crr = NULL;
-
- state->info.stop_time.secs = 0;
- state->info.stop_time.usecs = 0;
- state->info.stop_reason = EMTP_UNDEF;
- state->info.exit_status = 0;
-
- state->output.next_print = 0;
- state->output.next_print_inc = 10;
- state->output.header = NULL;
- state->output.header_size = 0;
- state->output.values_per_object = 0;
- state->output.values_per_line = 0;
- state->output.field_width = 11;
- state->output.verbose = 0;
- state->output.total = 0;
- state->output.all_allctrs = 0;
- state->output.no_allctrs = 0;
- state->output.allctrs = NULL;
- state->output.all_btypes = 0;
- state->output.no_btypes = 0;
- state->output.btypes = NULL;
- state->output.max_min_values = 0;
- state->output.block_counts = 0;
- state->output.op_counts = 0;
- state->output.lines_until_header = EM_LINES_UNTIL_HEADER;
-
-#if PRINT_OPERATIONS
- state->output.stream = stderr;
-#else
- state->output.stream = stdout;
-#endif
- state->output.file_name = NULL;
-#if EMEM_d_SWITCH
- state->output.dir_name = NULL;
- state->output.erl_cmd_file = NULL;
- state->output.go.mutex = NULL;
- state->output.go.cond = NULL;
-#endif
-
- init_queue(state, &state->output.queue);
- state->output.queue.max_buf_size = 10*1024*1024;
- state->output.queue.name = "output";
-
- state->trace_state = emtp_state_new(alloc, realloc, free);
- if (!state->trace_state)
- goto error;
-
- state->trace_info.version.parser.major = 0;
- state->trace_info.version.parser.minor = 0;
- state->trace_info.version.trace.major = 0;
- state->trace_info.version.trace.minor = 0;
- state->trace_info.bits = 0;
- state->trace_info.max_allocator_ix = 0;
- state->trace_info.allocator = NULL;
- state->trace_info.max_block_type_ix = 0;
- state->trace_info.block_type = NULL;
-
- state->input.listen_port = 0;
- state->input.socket = INVALID_SOCKET;
- state->input.total_trace_size = 0;
- state->input.error = 0;
- state->input.error_descr = NULL;
-
- init_queue(state, &state->input.queue);
- state->input.queue.max_buf_size = 10*1024*1024;
- state->input.queue.name = "input";
-
- return state;
-
- error:
- if (state) {
- if (state->trace_state)
- emtp_state_destroy(state->trace_state);
- (*free)(state);
- }
- return NULL;
-}
-
-
-static emtbt_table *
-mk_block_table(em_state *state)
-{
- return emtbt_new_table(state->trace_info.bits == 64,
- state->alloc,
- state->realloc,
- state->free);
-}
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * *
- * *
-\* */
-#if PRINT_OPERATIONS
-void print_op(em_state *state, emtp_operation *op);
-#endif
-
-static INLINE void
-update_max_values(em_mem_info *mi)
-{
- if (mi->max_size < mi->size)
- mi->max_size = mi->size;
- if (mi->max_no < mi->no)
- mi->max_no = mi->no;
-}
-
-static INLINE void
-update_min_values(em_mem_info *mi)
-{
- if (mi->min_size > mi->size)
- mi->min_size = mi->size;
- if (mi->min_no > mi->no)
- mi->min_no = mi->no;
-}
-
-static INLINE void
-update_alloc_op(em_mem_info *mi, usgnd_int_max size)
-{
- mi->allocs++;
- mi->size += size;
- mi->no++;
- update_max_values(mi);
-}
-
-static INLINE void
-update_realloc_op(em_mem_info *mi,
- usgnd_int_max size,
- usgnd_int_max prev_size,
- int no_change)
-{
- mi->reallocs++;
- ASSERT(mi->size >= prev_size);
- mi->size -= prev_size;
- mi->size += size;
- if (no_change) {
- if (no_change > 0)
- mi->no++;
- else {
- ASSERT(mi->no > 0);
- mi->no--;
- }
- }
- update_max_values(mi);
- update_min_values(mi);
-}
-
-static INLINE void
-update_free_op(em_mem_info *mi, usgnd_int_max prev_size)
-{
- mi->frees++;
- ASSERT(mi->size >= prev_size);
- mi->size -= prev_size;
- ASSERT(mi->no > 0);
- mi->no--;
- update_min_values(mi);
-}
-
-static int
-insert_operations(em_state *state, emtp_operation ops[], size_t len)
-{
- emtbt_table *crr_table;
- emtbt_block old_blk;
- usgnd_int_32 prev_size;
- usgnd_int_max size;
- size_t i;
- int res;
- int aix, btix, crrix;
-
- for (i = 0; i < len; i++) {
-
- while (state->output.next_print <= ops[i].time.secs) {
- print_info(state, state->output.next_print, NULL);
- state->output.next_print += state->output.next_print_inc;
- }
-
- switch (ops[i].type) {
-
- case EMTP_ALLOC:
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
- btix = (int) ops[i].u.block.type;
- aix = state->trace_info.block_type[btix]->allocator;
-
- if (!ops[i].u.block.new_ptr)
- continue;
-
- res = emtbt_alloc_op(state->block_table, &ops[i]);
- if (res != 0)
- ERR_RET(res);
-
- size = ops[i].u.block.new_size;
-
- update_alloc_op(&state->info.btype[btix], size);
- update_alloc_op(&state->info.allctr[aix], size);
- update_alloc_op(&state->info.total, size);
- break;
-
- case EMTP_REALLOC: {
- int no;
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
-
- res = emtbt_realloc_op(state->block_table, &ops[i], &old_blk);
- if (res != 0)
- ERR_RET(res);
-
- size = ops[i].u.block.new_size;
- prev_size = old_blk.size;
-
- if (!ops[i].u.block.prev_ptr)
- btix = (int) ops[i].u.block.type;
- else
- btix = (int) old_blk.type;
- aix = state->trace_info.block_type[btix]->allocator;
-
- no = ((!old_blk.pointer && ops[i].u.block.new_ptr)
- ? 1
- : ((old_blk.pointer && !ops[i].u.block.new_size)
- ? -1
- : 0));
-
- update_realloc_op(&state->info.btype[btix], size, prev_size, no);
- update_realloc_op(&state->info.allctr[aix], size, prev_size, no);
- update_realloc_op(&state->info.total, size, prev_size, no);
-
- break;
- }
- case EMTP_FREE:
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
-
- if (!ops[i].u.block.prev_ptr)
- continue;
-
- res = emtbt_free_op(state->block_table, &ops[i], &old_blk);
- if (res != 0)
- ERR_RET(res);
-
- prev_size = old_blk.size;
- btix = (int) old_blk.type;
- aix = state->trace_info.block_type[btix]->allocator;
-
-
- update_free_op(&state->info.btype[btix], prev_size);
- update_free_op(&state->info.allctr[aix], prev_size);
- update_free_op(&state->info.total, prev_size);
-
- break;
-
- case EMTP_CARRIER_ALLOC:
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
-
- aix = (int) ops[i].u.block.type;
-
- crrix = (int) ops[i].u.block.carrier_type;
- if (!state->carrier_table[crrix]) {
- state->carrier_table[crrix] = mk_block_table(state);
- if (!state->carrier_table[crrix])
- ERR_RET(ENOMEM);
- }
- crr_table = state->carrier_table[crrix];
-
- if (!ops[i].u.block.new_ptr)
- continue;
-
- res = emtbt_alloc_op(crr_table, &ops[i]);
- if (res != 0)
- ERR_RET(res);
-
- size = ops[i].u.block.new_size;
-
- if (state->info.allctr_usd_crr[aix])
- update_alloc_op(state->info.allctr_usd_crr[aix], size);
- if (state->info.allctr_prv_crr[crrix])
- update_alloc_op(state->info.allctr_prv_crr[crrix], size);
- update_alloc_op(&state->info.allctr[crrix], size);
-
- break;
-
- case EMTP_CARRIER_REALLOC: {
- int no;
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
-
- crrix = (int) ops[i].u.block.carrier_type;
- if (!state->carrier_table[crrix]) {
- state->carrier_table[crrix] = mk_block_table(state);
- if (!state->carrier_table[crrix])
- ERR_RET(ENOMEM);
- }
- crr_table = state->carrier_table[crrix];
-
- res = emtbt_realloc_op(crr_table, &ops[i], &old_blk);
- if (res != 0)
- ERR_RET(res);
-
- size = ops[i].u.block.new_size;
- prev_size = old_blk.size;
-
- if (!ops[i].u.block.prev_ptr)
- aix = (int) ops[i].u.block.type;
- else
- aix = (int) old_blk.type;
-
-
- no = ((!old_blk.pointer && ops[i].u.block.new_ptr)
- ? 1
- : ((old_blk.pointer && !ops[i].u.block.new_size)
- ? -1
- : 0));
-
- if (state->info.allctr_usd_crr[aix])
- update_realloc_op(state->info.allctr_usd_crr[aix],
- size,
- prev_size,
- no);
- if (state->info.allctr_prv_crr[crrix])
- update_realloc_op(state->info.allctr_prv_crr[crrix],
- size,
- prev_size,
- no);
- update_realloc_op(&state->info.allctr[crrix],
- size,
- prev_size,
- no);
- break;
- }
- case EMTP_CARRIER_FREE:
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
-
- crrix = (int) ops[i].u.block.carrier_type;
- crr_table = state->carrier_table[crrix];
- if (!crr_table)
- ERR_RET(EMTBT_FREE_NOBLK_ERROR);
-
- if (!ops[i].u.block.prev_ptr)
- continue;
-
- res = emtbt_free_op(crr_table, &ops[i], &old_blk);
- if (res != 0)
- ERR_RET(res);
-
- prev_size = old_blk.size;
- aix = (int) old_blk.type;
-
- if (state->info.allctr_usd_crr[aix])
- update_free_op(state->info.allctr_usd_crr[aix], prev_size);
- if (state->info.allctr_prv_crr[crrix])
- update_free_op(state->info.allctr_prv_crr[crrix], prev_size);
- update_free_op(&state->info.allctr[crrix], prev_size);
-
- break;
-
- case EMTP_STOP:
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
- state->info.stop_reason = EMTP_STOP;
- state->info.stop_time.secs = ops[i].time.secs;
- state->info.stop_time.usecs = ops[i].time.usecs;
- print_info(state, ops[i].time.secs, NULL);
- return EM_EXIT_RESULT;
- case EMTP_EXIT:
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
- state->info.stop_reason = EMTP_EXIT;
- state->info.exit_status = ops[i].u.exit_status;
- state->info.stop_time.secs = ops[i].time.secs;
- state->info.stop_time.usecs = ops[i].time.usecs;
- print_info(state, ops[i].time.secs, NULL);
- return EM_EXIT_RESULT;
- default:
-#if PRINT_OPERATIONS
- print_op(state, &ops[i]);
-#endif
- /* Ignore not understood operation */
- break;
- }
- }
- return 0;
-}
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * *
- * *
-\* */
-
-static const char *
-error_string(int error)
-{
- const char *str;
- const char *error_str;
- static const char unknown_error[] = "Unknown error";
-
- error_str = unknown_error;
-
- if (error > 0) {
- const char *str = strerror(error);
- if (str)
- error_str = str;
- }
- else if (error < 0) {
- str = emtp_error_string(error);
- if (!str) {
- str = emtbt_error_string(error);
- if (!str) {
- switch (error) {
- case EM_TRUNCATED_TRACE_ERROR:
- error_str = "Truncated trace";
- break;
- case EM_INTERNAL_ERROR:
- error_str = "emem internal error";
- break;
- default:
- break;
- }
- }
- }
-
- if (str)
- error_str = str;
- }
-
- return error_str;
-}
-
-__decl_noreturn static void __noreturn
-error(int res)
-{
- error_msg(res, NULL);
-}
-
-__decl_noreturn static void __noreturn
-error_msg(int res, char *msg)
-{
- fprintf(stderr,
- "emem: %s%sFatal error: %s (%d)\n",
- msg ? msg : "",
- msg ? ": ": "",
- error_string(res),
- res);
- exit(1);
-}
-
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * *
- * *
-\* */
-
-#if EMEM_d_SWITCH
-
-static size_t
-write_output_filename(char *ptr,
- char *dirname,
- char *nodename,
- char *hostname,
- char *datetime,
- char *pid)
-{
- size_t sz = 0;
- char *p = ptr;
- char **pp = ptr ? &p : NULL;
- sz += write_str(pp, dirname);
- if (pp) *((*pp)++) = DIR_SEP_CHAR;
- sz++;
- sz += write_str(pp, nodename);
- sz += write_str(pp, "_");
- sz += write_str(pp, hostname);
- sz += write_str(pp, "_");
- sz += write_str(pp, datetime);
- sz += write_str(pp, "_");
- sz += write_str(pp, pid);
- sz += write_str(pp, EM_OUTPUT_FILE_SUFFIX);
- if (pp) *((*pp)++) = '\0';
- sz++;
- return sz;
-}
-
-static char *
-make_output_filename(em_state *state)
-{
- char *fname;
- size_t fname_size;
- char *nodename = state->trace_info.nodename;
- char *hostname = state->trace_info.hostname;
- char *pid = state->trace_info.pid;
- char dt_buf[20];
- char *date_time = NULL;
-
- if (*nodename == '\0')
- nodename = "nonode";
- if (*hostname == '\0')
- hostname = "nohost";
- if (!state->trace_info.start_time.day)
- date_time = "notime";
- else {
- sprintf(dt_buf,
- "%d-%2.2d-%2.2d_%2.2d.%2.2d.%2.2d",
- state->trace_info.start_time.year % 10000,
- state->trace_info.start_time.month % 100,
- state->trace_info.start_time.day % 100,
- state->trace_info.start_time.hour % 100,
- state->trace_info.start_time.minute % 100,
- state->trace_info.start_time.second % 100);
- date_time = &dt_buf[0];
- }
- if (*pid == '\0')
- pid = "nopid";
-
- fname = (*state->alloc)(write_output_filename(NULL,
- state->output.dir_name,
- nodename,
- hostname,
- date_time,
- pid));
- if (!fname)
- return NULL;
-
- (void) write_output_filename(fname,
- state->output.dir_name,
- nodename,
- hostname,
- date_time,
- pid);
- return fname;
-}
-
-#endif
-
-static int
-complete_state(em_state *state)
-{
- int i, j, vpo, vpl;
- void * (*allocp)(size_t);
- void * (*reallocp)(void *, size_t);
- size_t size = sizeof(emtp_info);
-
- if (!emtp_get_info(&state->trace_info, &size, state->trace_state)
- || size < sizeof(emtp_info))
- return EM_INTERNAL_ERROR;
-
-#if EMEM_d_SWITCH
-
- if (!state->output.stream) {
- char *fname = make_filename(state);
- mutex_lock(state->output.go.mutex);
- state->output.stream = fopen(fname, "w");
- if (!state->output.stream) {
- disconnect_queue_reader(&state->input.queue);
- disconnect_queue_writer(&state->output.queue);
- }
- cond_signal(state->output.go.cond);
- mutex_unlock(state->output.go.mutex);
- (*state->free)((void *) fname);
- if (!state->output.stream)
- return EIO;
- }
-
-#endif
-
- allocp = state->alloc;
- reallocp = state->realloc;
-
- state->carrier_table = (*allocp)((state->trace_info.max_allocator_ix+2)
- * sizeof(emtbt_table *));
- if (!state->carrier_table)
- return ENOMEM;
- state->carrier_table++;
- for (i = -1; i <= state->trace_info.max_allocator_ix; i++)
- state->carrier_table[i] = NULL;
-
-
- state->block_table = mk_block_table(state);
- state->info.btype = (*allocp)((state->trace_info.max_block_type_ix+2)
- * sizeof(em_mem_info));
- state->info.allctr = (*allocp)((state->trace_info.max_allocator_ix+2)
- * sizeof(em_mem_info));
- if (!state->block_table || !state->info.btype || !state->info.allctr)
- return ENOMEM;
-
- state->info.btype++;
- state->info.allctr++;
-
- state->info.allctr_prv_crr
- = (*allocp)((state->trace_info.max_allocator_ix+2)
- * sizeof(em_mem_info *));
- if (!state->info.allctr_prv_crr)
- return ENOMEM;
- state->info.allctr_prv_crr++;
- for (i = -1; i <= state->trace_info.max_allocator_ix; i++)
- state->info.allctr_prv_crr[i] = NULL;
-
- state->info.allctr_usd_crr
- = (*allocp)((state->trace_info.max_allocator_ix+2)
- * sizeof(em_mem_info *));
- if (!state->info.allctr_usd_crr)
- return ENOMEM;
- state->info.allctr_usd_crr++;
- for (i = -1; i <= state->trace_info.max_allocator_ix; i++)
- state->info.allctr_usd_crr[i] = NULL;
-
- if (state->output.all_btypes) {
- if (state->output.btypes)
- (*state->free)((void *) state->output.btypes);
- state->output.no_btypes = state->trace_info.max_block_type_ix + 2;
- state->output.btypes = (*allocp)(state->output.no_btypes
- * sizeof(em_output_types));
- if (!state->output.btypes)
- return ENOMEM;
- }
-
- if (state->output.all_allctrs) {
- if (state->output.allctrs)
- (*state->free)((void *) state->output.allctrs);
- state->output.no_allctrs = state->trace_info.max_allocator_ix + 2;
- state->output.allctrs = (*allocp)(state->output.no_allctrs
- * sizeof(em_output_types));
- if (!state->output.allctrs)
- return ENOMEM;
- }
-
- for (i = -1; i <= state->trace_info.max_block_type_ix; i++) {
- /* Save block type if we should print info about it */
- emtp_block_type *btp = state->trace_info.block_type[i];
- reset_mem_info(&state->info.btype[i]);
- if (state->output.no_btypes) {
- if (state->output.all_btypes) {
- state->output.btypes[i+1].name = btp->name;
- state->output.btypes[i+1].ix = btp->valid ? i : -1;
- }
- else {
- for (j = 0; j < state->output.no_btypes; j++)
- if (strcmp(btp->name, state->output.btypes[j].name) == 0) {
- state->output.btypes[j].ix = i;
- break;
- }
- }
- }
- }
-
- /* Remove invalid block types */
- if (state->output.no_btypes) {
- for (i = 0, j = 0; i < state->output.no_btypes; i++) {
- if (state->output.btypes[i].ix >= 0) {
- state->output.btypes[j].name = state->output.btypes[i].name;
- state->output.btypes[j].ix = state->output.btypes[i].ix;
- j++;
- }
- }
- state->output.no_btypes = j;
- }
-
- for (i = -1; i <= state->trace_info.max_allocator_ix; i++) {
- /* Save allocator if we should print info about it */
- emtp_allocator *ap = state->trace_info.allocator[i];
- reset_mem_info(&state->info.allctr[i]);
- if (state->output.no_allctrs) {
- if (state->output.all_allctrs) {
- state->output.allctrs[i+1].name = ap->name;
- state->output.allctrs[i+1].ix = ap->valid ? i : -1;
- }
- else {
- for (j = 0; j < state->output.no_allctrs; j++)
- if (strcmp(ap->name, state->output.allctrs[j].name) == 0) {
- state->output.allctrs[j].ix = i;
- break;
- }
- }
- }
-
- /* Allocate em_mem_info if used carrier info is available */
- if (ap->flags & EMTP_ALLOCATOR_FLAG_HAVE_USED_CARRIERS_INFO
- || (i == state->trace_info.segment_ix
- && state->trace_info.have_segment_carrier_info)) {
- state->info.allctr_usd_crr[i]
- = (em_mem_info *) (*allocp)(sizeof(em_mem_info));
- if (!state->info.allctr_usd_crr[i])
- return ENOMEM;
- reset_mem_info(state->info.allctr_usd_crr[i]);
- }
-
- /* Allocate em_mem_info for carrier providers */
- if (ap->carrier.provider) {
- sgnd_int_32 j;
- for (j = 0; j < ap->carrier.no_providers; j++) {
- sgnd_int_32 crr_prvdr = ap->carrier.provider[j];
- if (!state->info.allctr_prv_crr[crr_prvdr]) {
- state->info.allctr_prv_crr[crr_prvdr]
- = (em_mem_info *) (*allocp)(sizeof(em_mem_info));
- if (!state->info.allctr_prv_crr[crr_prvdr])
- return ENOMEM;
- reset_mem_info(state->info.allctr_prv_crr[crr_prvdr]);
- }
- }
- }
- }
-
- /* Remove invalid allocators */
- if (state->output.no_allctrs) {
- for (i = 0, j = 0; i < state->output.no_allctrs; i++) {
- if (state->output.allctrs[i].ix >= 0) {
- state->output.allctrs[j].name = state->output.allctrs[i].name;
- state->output.allctrs[j].ix = state->output.allctrs[i].ix;
- j++;
- }
- }
- state->output.no_allctrs = j;
- }
-
- if (state->output.no_btypes) {
- state->output.btypes = (*reallocp)(state->output.btypes,
- sizeof(em_output_types)
- * state->output.no_btypes);
- if (!state->output.btypes)
- return ENOMEM;
- }
-
- if (state->output.no_allctrs) {
- state->output.allctrs = (*reallocp)(state->output.allctrs,
- sizeof(em_output_types)
- * state->output.no_allctrs);
- if (!state->output.allctrs)
- return ENOMEM;
- }
-
-
- vpo = 1;
- if (state->output.max_min_values)
- vpo += 2;
- if (state->output.block_counts) {
- vpo++;
- if (state->output.max_min_values)
- vpo += 2;
- }
- if (state->output.op_counts)
- vpo += 3;
-
- state->output.values_per_object = vpo;
-
- vpl = 0;
- vpl++; /* time */
- if (state->output.total) {
- vpl += vpo; /* total allocated */
- if (state->trace_info.have_segment_carrier_info) {
- vpl += vpo; /* total carriers */
- vpl += vpo; /* cached carriers */
- }
- }
- for (i = 0; i < state->output.no_allctrs; i++) {
- vpl += vpo; /* allocated */
- if (state->trace_info.have_carrier_info) {
- if (state->info.allctr_prv_crr[state->output.allctrs[i].ix])
- vpl += vpo; /* provided carriers */
- vpl += vpo; /* used carriers */
- }
- }
- vpl += state->output.no_btypes*vpo; /* allocated */
-
- state->output.values_per_line = vpl;
-
- state->output.header_size = write_header(state, NULL, 1);
- state->output.header = (*state->alloc)(state->output.header_size + 1);
- if (!state->output.header)
- return ENOMEM;
- size = write_header(state, state->output.header, 1);
- ASSERT(state->output.header_size == size);
- return 0;
-}
-
-static int
-process_trace(em_state *state)
-{
- emtp_operation ops[EM_NO_OF_OPS];
- int res;
- size_t ops_len;
- em_area area;
-
- while (1) {
- get_next_read_area(&area, state, &state->input.queue);
- if (!area.size)
- return EM_TRUNCATED_TRACE_ERROR;
- res = emtp_parse(state->trace_state,
- (usgnd_int_8 **)&area.ptr, &area.size,
- NULL, 0, NULL);
- if (res == EMTP_HEADER_PARSED)
- break;
- if (res == EMTP_NEED_MORE_TRACE)
- continue;
-
- if (res < 0)
- return res;
- else
- return EM_TRUNCATED_TRACE_ERROR;
- }
-
- res = complete_state(state);
- if (res != 0)
- return res;
-
- print_main_header(state);
-
- while (1) {
- if (!area.size) {
- get_next_read_area(&area, state, &state->input.queue);
- if (!area.size)
- return EM_TRUNCATED_TRACE_ERROR;
-
- }
-
-
- while (area.size) {
- ops_len = EM_NO_OF_OPS;
- res = emtp_parse(state->trace_state,
- (usgnd_int_8 **)&area.ptr, &area.size,
- ops, sizeof(emtp_operation), &ops_len);
- if (res < 0)
- return res;
-
- res = insert_operations(state, ops, ops_len);
- if (res != 0)
- return res;
-
- }
-
- }
-
-}
-
-static void
-usage(char *sw, char *error)
-{
- FILE *filep = stdout;
-#ifdef __WIN32__
-#define SW_CHAR "/"
-#else
-#define SW_CHAR "-"
-#endif
-
- if (error) {
- ASSERT(sw);
- filep = stderr;
- fprintf(filep, "emem: %s: %s\n", sw, error);
- }
- fprintf(filep,
- "Usage: emem "
-#if EMEM_A_SWITCH
- "[" SW_CHAR "A <ALLOCATOR>] "
-#endif
- "[" SW_CHAR "a <ALLOCATOR>] "
- "[" SW_CHAR "b <BLOCK TYPE>] "
-#if EMEM_C_SWITCH
- "[" SW_CHAR "C <CLASS>] "
-#endif
-#if EMEM_c_SWITCH
- "[" SW_CHAR "c <CLASS>] "
-#endif
- "{"
-#if EMEM_d_SWITCH
- SW_CHAR "d <DIRNAME>|"
-#endif
- SW_CHAR "f <FILENAME>} "
- "[" SW_CHAR "h] "
- "[" SW_CHAR "i <SECONDS>] "
- "[" SW_CHAR "m] "
- "[" SW_CHAR "n] "
- "[" SW_CHAR "o] "
- "{" SW_CHAR "p <PORT>} "
- "[" SW_CHAR "t] "
- "[" SW_CHAR "v] "
- "\n");
- if (error)
- exit(1);
- else {
- fprintf(filep,
- "\n"
- " [] - switch is allowed any number of times\n"
- " {} - switch is allowed at most one time\n"
-#if EMEM_d_SWITCH
- " | - exclusive or\n"
-#endif
- "\n"
- " Switches:\n"
-#if EMEM_A_SWITCH
- " " SW_CHAR "a <A> - display info about Allocator <A> and all block types using <A>\n"
-#endif
- " " SW_CHAR "a <A> - display info about allocator <A>\n"
- " " SW_CHAR "b <B> - display info about block type <B>\n"
-#if EMEM_C_SWITCH
- " " SW_CHAR "C <C> - display info about class <C> and all block types in class <C>\n"
-#endif
-#if EMEM_c_SWITCH
- " " SW_CHAR "b <B> - display info about class <C>\n"
-#endif
-#if EMEM_d_SWITCH
- " " SW_CHAR "d <D> - run as daemon and set output directory to <D>\n"
-#endif
- " " SW_CHAR "f <F> - set output file to <F>\n"
- " " SW_CHAR "h - display help and exit\n"
- " " SW_CHAR "i <I> - set display interval to <I> seconds\n"
- " " SW_CHAR "m - display max/min values\n"
- " " SW_CHAR "n - display block/carrier/segment count values\n"
- " " SW_CHAR "o - display operation count values\n"
- " " SW_CHAR "p <P> - set listen port to <P>\n"
- " " SW_CHAR "t - display info about total values\n"
- " " SW_CHAR "v - verbose output\n");
- exit(0);
- }
-
-#undef SW_CHAR
-}
-
-
-static void
-parse_args(em_state *state, int argc, char *argv[])
-{
- int port;
- int i;
-
- i = 1;
- while (i < argc) {
- if ((argv[i][0] != '-' && argv[i][0] != '/') || argv[i][2] != '\0') {
- unknown_switch:
- usage(argv[i], "unknown switch");
- }
-
- switch (argv[i][1]) {
-#if EMEM_A_SWITCH
- case 'A': /* TODO: Allocator + blocktypes using allocator */
-#endif
- case 'a':
- if (i + 1 >= argc)
- usage(argv[i], "missing allocator");
- i++;
- if (state->output.all_allctrs || strcmp(argv[i],"all") == 0) {
- state->output.all_allctrs = 1;
- break;
- }
-
- if (!state->output.allctrs)
- state->output.allctrs
- = (*state->alloc)(sizeof(em_output_types)*argc/2);
- if (!state->output.allctrs)
- error(ENOMEM);
- state->output.allctrs[state->output.no_allctrs].name = argv[i];
- state->output.allctrs[state->output.no_allctrs].ix = -1;
- state->output.no_allctrs++;
- break;
- case 'b':
- if (i + 1 >= argc)
- usage(argv[i], "missing block type");
- i++;
- if (state->output.all_btypes || strcmp(argv[i],"all") == 0) {
- state->output.all_btypes = 1;
- break;
- }
-
- if (!state->output.btypes)
- state->output.btypes
- = (*state->alloc)(sizeof(em_output_types)*argc/2);
- if (!state->output.btypes)
- error(ENOMEM);
- state->output.btypes[state->output.no_btypes].name = argv[i];
- state->output.btypes[state->output.no_btypes].ix = -1;
- state->output.no_btypes++;
- break;
-#if EMEM_C_SWITCH
-#endif
-#if EMEM_c_SWITCH
- case 'c':
- break;
-#endif
-#if EMEM_d_SWITCH
- case 'd': {
- char *p;
- char *fname;
- if (state->output.dir_name)
- usage(argv[i], "directory already set");
- if (state->output.file_name)
- usage(argv[i], "file name already set");
- if (i + 1 >= argc)
- usage(argv[i], "missing directory name");
- state->output.dir_name = argv[i+1];
- fname = (*state->alloc)(strlen(state->output.dir_name)
- + 1
- + strlen(EM_ERL_CMD_FILE_NAME)
- + 1);
- state->output.go.mutex = (*state->alloc)(sizeof(ethr_mutex));
- state->output.go.cond = (*state->alloc)(sizeof(ethr_cond));
- if (!fname || !state->output.go.mutex || !state->output.go.cond)
- error(ENOMEM);
- p = fname;
- (void) write_str(&p, state->output.dir_name);
- *(p++) = DIR_SEP_CHAR;
- (void) write_str(&p, EM_ERL_CMD_FILE_NAME);
- *(p++) = '\0';
- state->output.erl_cmd_file = fopen(fname, "w");
- if (!state->output.erl_cmd_file)
- usage(argv[i], "cannot create files in directory");
- (*state->free)((void *) fname);
- state->output.stream = NULL;
- mutex_init(state->output.go.mutex);
- cond_init(state->output.go.cond);
- i++;
- break;
- }
-#endif
- case 'f':
-#if EMEM_d_SWITCH
- if (state->output.dir_name)
- usage(argv[i], "directory already set");
-#endif
- if (state->output.file_name)
- usage(argv[i], "file name already set");
- if (i + 1 >= argc)
- usage(argv[i], "missing file name");
- state->output.file_name = argv[i+1];
- state->output.stream = fopen(state->output.file_name, "w");
- if (!state->output.stream)
- usage(argv[i], "cannot create file");
- if (setvbuf(state->output.stream, NULL, _IONBF, 0) != 0) {
- fprintf(stderr,
- "emem: failed to set file %s in unbuffered mode\n",
- state->output.file_name);
- exit(1);
- }
- i++;
- break;
- case 'h':
- usage(NULL, NULL);
- break;
- case 'i': {
- int interval;
- if (argv[i][2])
- goto unknown_switch;
-
- if (i + 1 >= argc)
- usage(argv[i], "missing interval");
- interval = atoi(argv[i+1]);
- if (interval < 1)
- usage(argv[i], "bad interval");
- i++;
- state->output.next_print_inc = interval;
- break;
- }
- case 'm':
- state->output.max_min_values = 1;
- break;
- case 'n':
- state->output.block_counts = 1;
- break;
- case 'o':
- state->output.op_counts = 1;
- break;
- case 'p':
- if (state->input.listen_port)
- usage(argv[i], "port already set");
- if (i + 1 >= argc)
- usage(argv[i], "missing port number");
- port = atoi(argv[i+1]);
- if (port <= 1024 || port >= (1 << 16))
- usage(argv[i], "bad port number");
- i++;
- state->input.listen_port = (usgnd_int_16) port;
- break;
- case 't':
- state->output.total = 1;
- break;
- case 'v':
- state->output.verbose = 1;
- break;
- default:
- goto unknown_switch;
- }
- i++;
- }
-
- if (!state->output.allctrs && !state->output.btypes)
- state->output.total = 1;
-}
-
-static int
-init_connection(em_state *state)
-{
- int res;
- SOCKET lsock;
- SOCKET sock = INVALID_SOCKET;
- struct sockaddr_in my_addr;
- socklen_t oth_addr_len;
- struct sockaddr_in oth_addr;
-#ifdef __WIN32__
- WORD wVersionRequested = MAKEWORD(2,0);
- WSADATA wsaData;
-
- if (WSAStartup(wVersionRequested, &wsaData) != 0)
- return EIO;
-
- if ((LOBYTE(wsaData.wVersion) != 2) || (HIBYTE(wsaData.wVersion) != 0))
- return EIO;
-#endif
-
- do_socket:
- sock = socket(AF_INET, SOCK_STREAM, 0);
- if (IS_INVALID_SOCKET(sock)) {
- res = GET_SOCK_ERRNO();
- if (res == EINTR)
- goto do_socket;
- goto error;
- }
-
- memset((void *) &my_addr, 0, sizeof(struct sockaddr_in));
-
- my_addr.sin_family = AF_INET;
- my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
- my_addr.sin_port = htons(state->input.listen_port);
-
- do_bind:
- if (bind(sock, (struct sockaddr*) &my_addr, sizeof(my_addr)) < 0) {
- res = GET_SOCK_ERRNO();
- if (res == EINTR)
- goto do_bind;
- goto error;
- }
-
- do_listen:
- if (listen(sock, 1) < 0) {
- res = GET_SOCK_ERRNO();
- if (res == EINTR)
- goto do_listen;
- goto error;
- }
-
- lsock = sock;
- state->input.socket = sock;
-
- res = print_emu_arg(state);
- if (res != 0)
- goto error;
-
- print_string(state, "> Waiting for emulator to connect... ");
-
- do_accept:
- oth_addr_len = sizeof(oth_addr);
- sock = accept(lsock, (struct sockaddr *) &oth_addr, &oth_addr_len);
- if (IS_INVALID_SOCKET(sock)) {
- res = GET_SOCK_ERRNO();
- if (res == EINTR)
- goto do_accept;
- sock = lsock;
- goto error;
- }
-
- print_string(state, "connected\n");
-
- closesocket(lsock);
- state->input.socket = sock;
-
- return 0;
-
- error:
- if (!IS_INVALID_SOCKET(sock)) {
- closesocket(sock);
- state->input.socket = INVALID_SOCKET;
- }
- return res;
-}
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * IO threads *
- * *
-\* */
-
-/*
- * The input thread reads from a socket and puts the received data
- * in the input buffer queue.
- *
- * Note: There is intentionally no flow control. If the emem program
- * cannot process data as fast as it arrives, it is supposed
- * to crash when hitting the maximum buffersize; otherwise,
- * the traced emulator would be slowed down.
- */
-static void *
-input_thread_func(void *arg)
-{
- int res;
- char *edescr = NULL;
- ssize_t recv_sz;
- usgnd_int_max total_trace_size = 0;
- em_state *state = (em_state *) arg;
- em_area area = {NULL, 0};
- SOCKET sock = state->input.socket;
- em_buf_queue *queue = &state->input.queue;
-
- while(1) {
- get_next_write_area(&area,
- state,
- queue,
- EM_MIN_TRACE_READ_SIZE);
-
- if (!area.ptr) {
- res = ENOMEM;
- edescr = "Input alloc";
- goto stop;
- }
-
- do_recv:
- if (is_queue_reader_disconnected(queue)) {
- res = 0;
- edescr = "Input";
- goto stop;
- }
- recv_sz = recv(sock, (void *) area.ptr, area.size, 0);
- if (recv_sz <= 0) {
- res = GET_SOCK_ERRNO();
- if (res == EINTR)
- goto do_recv;
- edescr = "Input recv";
- goto stop;
- }
- area.size = (size_t) recv_sz;
- total_trace_size += (usgnd_int_max) recv_sz;
- }
-
- stop:
- state->input.error = res;
- state->input.error_descr = edescr;
- state->input.total_trace_size = total_trace_size;
- disconnect_queue_writer(queue);
- if (!IS_INVALID_SOCKET(state->input.socket)) {
- closesocket(sock);
- state->input.socket = INVALID_SOCKET;
- }
- return NULL;
-}
-
-
-static void *
-output_thread_func(void *arg)
-{
- em_state *state = (em_state *) arg;
- em_area area = {NULL, 0};
-
-#if EMEM_d_SWITCH
-
- if (state->output.go.mutex) {
- mutex_lock(state->output.go.mutex);
- while (!state->output.stream
- && !is_queue_writer_disconnected(&state->output.queue))
- cond_wait(state->output.go.cond, state->output.go.mutex);
- mutex_unlock(state->output.go.mutex);
-
- mutex_destroy(state->output.go.mutex);
- (*state->free)((void *) state->output.go.mutex);
- state->output.go.mutex = NULL;
- cond_destroy(state->output.go.cond);
- (*state->free)((void *) state->output.go.cond);
- state->output.go.cond = NULL;
- }
-
-#endif
-
- while (1) {
- get_next_read_area(&area, state, &state->output.queue);
- if (!area.size) {
- disconnect_queue_reader(&state->output.queue);
- if (is_queue_writer_disconnected(&state->output.queue))
- goto stop;
- else
- error_msg(EIO, "Output queue");
- }
- if (fwrite((void *) area.ptr,
- sizeof(char),
- area.size,
- state->output.stream) != area.size) {
- disconnect_queue_reader(&state->output.queue);
- error_msg(0, "Write");
- }
- }
-
- stop:
- if (state->output.stream != stdout && state->output.stream != stderr)
- fclose(state->output.stream);
- return NULL;
-}
-
-
-int
-main(int argc, char *argv[])
-{
- int res, ires, jres;
- ethr_tid input_tid;
- ethr_tid output_tid;
- em_state *state;
-
- /* set stdout in unbuffered mode */
- if (setvbuf(stdout, NULL, _IONBF, 0) != 0) {
- fprintf(stderr, "emem: failed to set stdout in unbuffered mode\n");
- exit(1);
- }
-
- if (ethr_init(NULL) != 0 || ethr_late_init(NULL) != 0) {
- fprintf(stderr, "emem: failed to initialize thread package\n");
- exit(1);
- }
-
- state = new_state(malloc, realloc, free);
- if (!state)
- error(ENOMEM);
-
- parse_args(state, argc, argv);
-
- res = ethr_thr_create(&output_tid,
- output_thread_func,
- (void *) state,
- NULL);
- if (res != 0)
- error_msg(res, "Output thread create");
-
-#ifdef DEBUG
- print_string(state, "> [debug]\n");
-#endif
-
- res = init_connection(state);
- if (res != 0)
- error_msg(res, "Initialize connection");
-
- res = ethr_thr_create(&input_tid,
- input_thread_func,
- (void *) state,
- NULL);
- if (res != 0)
- error_msg(res, "Input thread create");
-
- res = process_trace(state);
-
- disconnect_queue_reader(&state->input.queue);
-
- jres = ethr_thr_join(input_tid, NULL);
- if (jres != 0)
- error_msg(jres, "Input thread join");
-
- if (res == EM_EXIT_RESULT)
- print_main_footer(state);
- disconnect_queue_writer(&state->output.queue);
-
- jres = ethr_thr_join(output_tid, NULL);
- if (jres != 0)
- error_msg(jres, "Output thread join");
-
- ires = state->input.error;
-
- destroy_state(state);
-
-#ifdef __WIN32__
- WSACleanup();
-#endif
-
- switch (res) {
- case EM_EXIT_RESULT:
- break;
- case EM_TRUNCATED_TRACE_ERROR:
- error_msg(ires, state->input.error_descr);
- break;
- default:
- error(res);
- break;
- }
-
- return 0;
-}
-
-
-#if PRINT_OPERATIONS
-void
-print_op(em_state *state, emtp_operation *op)
-{
-
-#if 0
- printf("%5" USGND_INT_32_FSTR ":%6.6" USGND_INT_32_FSTR " ",
- op->time.secs, op->time.usecs);
-#endif
- if (state->trace_info.version.parser.major >= 2) {
-
- switch (op->type) {
- case EMTP_ALLOC:
- printf(" %" USGND_INT_MAX_FSTR " = alloc(%" USGND_INT_16_FSTR
- ", %" USGND_INT_MAX_FSTR ")\n",
- op->u.block.new_ptr,
- op->u.block.type,
- op->u.block.new_size);
- break;
- case EMTP_REALLOC:
- printf(" %" USGND_INT_MAX_FSTR " = realloc(%" USGND_INT_16_FSTR
- ", %" USGND_INT_MAX_FSTR ", %" USGND_INT_MAX_FSTR ")\n",
- op->u.block.new_ptr,
- op->u.block.type,
- op->u.block.prev_ptr,
- op->u.block.new_size);
- break;
- case EMTP_FREE:
- printf(" free(%" USGND_INT_16_FSTR ", %" USGND_INT_MAX_FSTR ")"
- "\n",
- op->u.block.type,
- op->u.block.prev_ptr);
- break;
- case EMTP_CARRIER_ALLOC:
- printf(" %" USGND_INT_MAX_FSTR " = carrier_alloc(%"
- USGND_INT_16_FSTR ", %" USGND_INT_16_FSTR ", %"
- USGND_INT_MAX_FSTR ")\n",
- op->u.block.new_ptr,
- op->u.block.carrier_type,
- op->u.block.type,
- op->u.block.new_size);
- break;
- case EMTP_CARRIER_REALLOC:
- printf(" %" USGND_INT_MAX_FSTR " = carrier_realloc(%"
- USGND_INT_16_FSTR ", %" USGND_INT_16_FSTR ", %"
- USGND_INT_MAX_FSTR ", %" USGND_INT_MAX_FSTR ")\n",
- op->u.block.new_ptr,
- op->u.block.carrier_type,
- op->u.block.type,
- op->u.block.prev_ptr,
- op->u.block.new_size);
- case EMTP_CARRIER_FREE:
- printf(" carrier_free(%" USGND_INT_16_FSTR ", %" USGND_INT_16_FSTR
- ", %" USGND_INT_MAX_FSTR ")\n",
- op->u.block.carrier_type,
- op->u.block.type,
- op->u.block.prev_ptr);
- break;
- default:
- printf(" op = %d\n", op->type);
- break;
- }
-
- }
- else {
-
- switch (op->type) {
- case EMTP_ALLOC:
- printf(" %" USGND_INT_MAX_FSTR " = alloc(%" USGND_INT_MAX_FSTR ")"
- "\n",
- op->u.block.new_ptr,
- op->u.block.new_size);
- break;
- case EMTP_REALLOC:
- printf(" %" USGND_INT_MAX_FSTR " = realloc(%" USGND_INT_MAX_FSTR
- ", %" USGND_INT_MAX_FSTR ")\n",
- op->u.block.new_ptr,
- op->u.block.prev_ptr,
- op->u.block.new_size);
- break;
- case EMTP_FREE:
- printf(" free(%" USGND_INT_MAX_FSTR ")\n",
- op->u.block.prev_ptr);
- break;
- default:
- printf(" op = %d\n", op->type);
- break;
- }
- }
- fflush(stdout);
-}
-#endif
diff --git a/lib/tools/c_src/erl_memory_trace_block_table.c b/lib/tools/c_src/erl_memory_trace_block_table.c
deleted file mode 100644
index ca7cb45a0e..0000000000
--- a/lib/tools/c_src/erl_memory_trace_block_table.c
+++ /dev/null
@@ -1,762 +0,0 @@
-/* ``Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * The Initial Developer of the Original Code is Ericsson Utvecklings AB.
- * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
- * AB. All Rights Reserved.''
- *
- * $Id$
- */
-
-
-/*
- * Description:
- *
- * Author: Rickard Green
- */
-
-/* Headers to include ... */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "erl_memory_trace_block_table.h"
-#include <errno.h>
-
-#undef HARD_DEBUG
-#undef REALLY_HARD_DEBUG
-#ifdef DEBUG
-# define HARD_DEBUG 0
-# define REALLY_HARD_DEBUG 0
-#else
-# define HARD_DEBUG 0
-# define REALLY_HARD_DEBUG 0
-#endif
-
-/* Some system specific defines ... */
-#if defined(__WIN32__) && !defined(__GNUC__)
-# define INLINE __forceinline
-#else
-# ifdef __GNUC__
-# define INLINE __inline__
-# else
-# define INLINE
-# endif
-#endif
-
-/* Our own assert() ... */
-#ifdef DEBUG
-#define ASSERT(A) ((void) ((A) ? 1 : assert_failed(__FILE__, __LINE__, #A)))
-#include <stdio.h>
-static int assert_failed(char *f, int l, char *a)
-{
- fprintf(stderr, "%s:%d: Assertion failed: %s\n", f, l, a);
- abort();
- return 0;
-}
-
-#else
-#define ASSERT(A) ((void) 1)
-#endif
-
-
-#define EMTBT_BLOCKS_PER_POOL 1000
-
-typedef struct emtbt_block_pool_ {
- struct emtbt_block_pool_ *next;
- emtbt_block blocks[1];
-} emtbt_block_pool;
-
-struct emtbt_table_ {
- void * (*alloc)(size_t);
- void * (*realloc)(void *, size_t);
- void (*free)(void *);
- int is_64_bit;
- int no_blocks;
- int no_of_buckets;
- int max_used_buckets;
- int min_used_buckets;
- int used_buckets;
- int current_size_index;
- emtbt_block *blocks;
- emtbt_block ** buckets;
-
-
- /* Fixed size allocation of blocks */
- emtbt_block_pool *block_pools;
- emtbt_block *free_blocks;
- int blocks_per_pool;
-
-};
-
-
-static emtbt_block null_blk = {0};
-
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\
- * Block table *
- * *
-\* */
-
-#if HARD_DEBUG
-static void check_table(emtbt_table *table);
-#endif
-
-static emtbt_block *
-block_alloc_new_pool(emtbt_table *tab)
-{
- size_t size;
- emtbt_block_pool *poolp;
-
- size = sizeof(emtbt_block_pool) - sizeof(emtbt_block);
- size += tab->blocks_per_pool*sizeof(emtbt_block);
-
- poolp = (*tab->alloc)(size);
-
- if (poolp) {
- int i;
- emtbt_block *blks;
-
- poolp->next = tab->block_pools;
- tab->block_pools = poolp;
-
- blks = (emtbt_block *) poolp->blocks;
-
- for (i = 1; i < tab->blocks_per_pool - 1; i++)
- blks[i].next = &blks[i + 1];
- blks[tab->blocks_per_pool - 1].next = NULL;
- tab->free_blocks = &blks[1];
-
- return &blks[0];
- }
- return NULL;
-}
-
-static INLINE emtbt_block *
-block_alloc(emtbt_table *tab)
-{
- emtbt_block *res;
-#if HARD_DEBUG
- check_table(tab);
-#endif
-
- if (tab->free_blocks) {
- res = tab->free_blocks;
- tab->free_blocks = tab->free_blocks->next;
- }
- else {
- res = block_alloc_new_pool(tab);
- }
-
-#ifdef DEBUG
- res->next = ((emtbt_block *) 0xfffffff0);
- res->prev = ((emtbt_block *) 0xfffffff0);
- res->bucket = ((emtbt_block **) 0xfffffff0);
-#endif
-
-#if HARD_DEBUG
- check_table(tab);
-#endif
-
- return res;
-}
-
-static INLINE void
-block_free(emtbt_table *tab, emtbt_block *bp)
-{
-
-#if HARD_DEBUG
- check_table(tab);
-#endif
-
- bp->next = tab->free_blocks;
- tab->free_blocks = bp;
-
-#if HARD_DEBUG
- check_table(tab);
-#endif
-
-
-}
-
-#define PRIME0 ((usgnd_int_32) 268438039)
-#define PRIME1 ((usgnd_int_32) 268440479)
-#define PRIME2 ((usgnd_int_32) 268439161)
-#define PRIME3 ((usgnd_int_32) 268437017)
-
-#define MK_HASH(H, P, IS64) \
-do { \
- (H) = (P) & 0xff; \
- (H) *= PRIME0; \
- (H) += ((P) >> 8) & 0xff; \
- (H) *= PRIME1; \
- (H) += ((P) >> 16) & 0xff; \
- (H) *= PRIME2; \
- (H) += ((P) >> 24) & 0xff; \
- (H) *= PRIME3; \
- if ((IS64)) { \
- (H) += ((P) >> 32) & 0xff; \
- (H) *= PRIME0; \
- (H) += ((P) >> 40) & 0xff; \
- (H) *= PRIME1; \
- (H) += ((P) >> 48) & 0xff; \
- (H) *= PRIME2; \
- (H) += ((P) >> 56) & 0xff; \
- (H) *= PRIME3; \
- } \
-} while (0)
-
-static const int table_sizes[] = {
- 3203,
- 4813,
- 6421,
- 9643,
- 12853,
- 19289,
- 25717,
- 51437,
- 102877,
- 205759,
- 411527,
- 823117,
- 1646237,
- 3292489,
- 6584983,
- 13169977,
- 26339969,
- 52679969
-};
-
-#if HARD_DEBUG
-
-static void
-check_table(emtbt_table *table)
-{
- int no_blocks;
- emtbt_block *block, *prev_block;
-
- no_blocks = 0;
- block = table->blocks;
- ASSERT(!block || !block->prev);
- prev_block = NULL;
- while (block) {
- usgnd_int_32 hash;
- MK_HASH(hash, block->pointer, table->is_64_bit);
- ASSERT(hash == block->hash);
- ASSERT(block->bucket - table->buckets
- == hash % table->no_of_buckets);
- ASSERT(!prev_block || prev_block == block->prev);
- prev_block = block;
- block = block->next;
- no_blocks++;
- ASSERT(table->no_blocks >= no_blocks);
- }
-
- ASSERT(table->no_blocks == no_blocks);
-
-#if REALLY_HARD_DEBUG
- {
- int i;
- for (i = 0; i < table->no_of_buckets; i++) {
- int bucket_end_found;
- emtbt_block **bucket;
- if (!table->buckets[i])
- continue;
- bucket_end_found = 0;
- bucket = &table->buckets[i];
- for (block = table->blocks; block; block = block->next) {
- if (block->bucket == bucket) {
- if (!block->prev || block->prev->bucket != bucket)
- ASSERT(*bucket == block);
- if (!block->next || block->next->bucket != bucket)
- bucket_end_found++;
- }
- }
- ASSERT(bucket_end_found);
- }
- }
-#endif
-
-}
-
-#endif
-
-static INLINE void
-link_block(emtbt_table *table, emtbt_block **bucket, emtbt_block *block)
-{
- ASSERT(bucket);
-
- block->bucket = bucket;
- if (*bucket) {
- block->next = *bucket;
- block->prev = (*bucket)->prev;
- if (block->prev)
- block->prev->next = block;
- else
- table->blocks = block;
- block->next->prev = block;
- }
- else {
- block->next = table->blocks;
- block->prev = NULL;
- if (table->blocks)
- table->blocks->prev = block;
- table->blocks = block;
- table->used_buckets++;
-
- }
- *bucket = block;
- table->no_blocks++;
-
-#if HARD_DEBUG
- check_table(table);
-#endif
-
-}
-
-static int
-resize_table(emtbt_table *table, int new_no_of_buckets)
-{
-#ifdef DEBUG
- int org_no_blocks;
-#endif
- int i;
- emtbt_block *block;
- emtbt_block **buckets;
-
- if (new_no_of_buckets < table->no_of_buckets) {
- /* shrink never fails */
- buckets = (emtbt_block **) (*table->realloc)(table->buckets,
- (sizeof(emtbt_block *)
- * new_no_of_buckets));
- if (!buckets)
- return 1;
- }
- else if (new_no_of_buckets > table->no_of_buckets) {
- (*table->free)((void *) table->buckets);
- buckets = (emtbt_block **) (*table->alloc)((sizeof(emtbt_block *)
- * new_no_of_buckets));
- if (!buckets)
- return 0;
- }
- else
- return 1;
-
- table->buckets = buckets;
- table->no_of_buckets = new_no_of_buckets;
- table->max_used_buckets = (4*new_no_of_buckets)/5;
- table->min_used_buckets = new_no_of_buckets/5;
- table->used_buckets = 0;
-
-#ifdef DEBUG
- org_no_blocks = table->no_blocks;
-#endif
-
- table->no_blocks = 0;
-
-
- for (i = 0; i < new_no_of_buckets; i++)
- buckets[i] = NULL;
-
- block = table->blocks;
- table->blocks = NULL;
-
- while (block) {
- emtbt_block *next_block = block->next;
- link_block(table,&table->buckets[block->hash%new_no_of_buckets],block);
- block = next_block;
- }
-
- ASSERT(org_no_blocks == table->no_blocks);
-
- return 1;
-}
-
-static INLINE int
-grow_table(emtbt_table *table)
-{
- if (table->current_size_index < sizeof(table_sizes)/sizeof(int)) {
- int new_size;
- table->current_size_index++;
- new_size = table_sizes[table->current_size_index];
- ASSERT(new_size > 0);
- return resize_table(table, new_size);
- }
- return 1;
-}
-
-static INLINE void
-shrink_table(emtbt_table *table)
-{
- if (table->current_size_index > 0) {
- int new_size;
- table->current_size_index--;
- new_size = table_sizes[table->current_size_index];
- ASSERT(new_size > 0);
- (void) resize_table(table, new_size);
- }
-}
-
-static INLINE emtbt_block *
-peek_block(emtbt_table *table, usgnd_int_max ptr)
-{
- emtbt_block **bucket;
- emtbt_block *block;
- usgnd_int_32 hash;
-
- MK_HASH(hash, ptr, table->is_64_bit);
-
- bucket = &table->buckets[hash % table->no_of_buckets];
- block = *bucket;
- if (!block)
- return NULL;
-
- while (block->bucket == bucket) {
- ASSERT(block);
- if (block->pointer == ptr)
- return block;
- if (!block->next)
- break;
- block = block->next;
- }
- return NULL;
-}
-
-static INLINE int
-insert_block(emtbt_table *table, emtbt_block *block)
-{
- emtbt_block **bucket;
- emtbt_block *tmp_block;
- usgnd_int_32 hash;
- usgnd_int_max p;
-
-#if HARD_DEBUG
- check_table(table);
-#endif
-
- if (table->used_buckets >= table->max_used_buckets) {
- if(!grow_table(table))
- return -1;
- }
-
- p = block->pointer;
-
- MK_HASH(hash, p, table->is_64_bit);
- block->hash = hash;
-
- bucket = &table->buckets[hash % table->no_of_buckets];
- tmp_block = *bucket;
- if (tmp_block) {
- while (tmp_block->bucket == bucket) {
- if (tmp_block->pointer == p)
- return 0;
- if (!tmp_block->next)
- break;
- tmp_block = tmp_block->next;
- }
- }
-
- link_block(table, bucket, block);
-
- ASSERT(block == peek_block(table, p));
-
-
- return 1;
-}
-
-static INLINE void
-delete_block(emtbt_table *table, emtbt_block *block)
-{
- emtbt_block **bucket;
-
- if (!block)
- return;
-
-#if HARD_DEBUG
- check_table(table);
-#endif
-
- bucket = block->bucket;
- ASSERT(bucket);
-
- if (block->prev)
- block->prev->next = block->next;
- else
- table->blocks = block->next;
-
- if (block->next)
- block->next->prev = block->prev;
-
- if (block == *bucket) {
- ASSERT(!block->prev || block->prev->bucket != bucket);
- if (block->next && block->next->bucket == bucket)
- *bucket = block->next;
- else {
- ASSERT(table->used_buckets > 0);
- *bucket = NULL;
- table->used_buckets--;
- }
- }
-#ifdef DEBUG
-
- block->next = ((emtbt_block *) 0xfffffff0);
- block->prev = ((emtbt_block *) 0xfffffff0);
- block->bucket = ((emtbt_block **) 0xfffffff0);
-#endif
-
- ASSERT(table->no_blocks > 0);
- table->no_blocks--;
-
- if (table->used_buckets < table->min_used_buckets)
- shrink_table(table);
-
-#if HARD_DEBUG
- check_table(table);
-#endif
-
-}
-
-static INLINE emtbt_block *
-fetch_block(emtbt_table *table, usgnd_int_max ptr)
-{
- emtbt_block *block;
-
- block = peek_block(table, ptr);
- delete_block(table, block);
- return block;
-}
-
-
-const char *emtbt_error_string(int error)
-{
- switch (error) {
- case EMTBT_ALLOC_XBLK_ERROR:
- return "Allocation to an already existing block";
- case EMTBT_REALLOC_NOBLK_ERROR:
- return "Reallocation of non-existing block";
- case EMTBT_REALLOC_XBLK_ERROR:
- return "Reallocation to an already existing block";
- case EMTBT_REALLOC_BLK_TYPE_MISMATCH:
- return "Block types mismatch when reallocating";
- case EMTBT_FREE_NOBLK_ERROR:
- return "Deallocation of non-existing block";
- case EMTBT_FREE_BLK_TYPE_MISMATCH:
- return "Block types mismatch when deallocating";
- case EMTBT_INTERNAL_ERROR:
- return "Block table internal error";
- default:
- return NULL;
- }
-
-
-}
-
-
-emtbt_table *
-emtbt_new_table(int is_64_bit,
- void * (*alloc)(size_t),
- void * (*realloc)(void *, size_t),
- void (*free)(void *))
-{
- emtbt_table *tab = (*alloc)(sizeof(emtbt_table));
- if (tab) {
- tab->alloc = alloc;
- tab->realloc = realloc;
- tab->free = free;
- tab->is_64_bit = is_64_bit;
- tab->no_blocks = 0;
- tab->no_of_buckets = 0;
- tab->max_used_buckets = 0;
- tab->min_used_buckets = 0;
- tab->used_buckets = 0;
- tab->current_size_index = 0;
- tab->blocks = NULL;
- tab->buckets = NULL;
-
- tab->block_pools = NULL;
- tab->free_blocks = NULL;
- tab->blocks_per_pool = EMTBT_BLOCKS_PER_POOL;
-
- }
- return tab;
-}
-
-void
-emtbt_destroy_table(emtbt_table *tab)
-{
- void (*freep)(void *);
- emtbt_block_pool *poolp1, *poolp2;
-
- freep = tab->free;
-
- /* Free block pools */
- poolp1 = tab->block_pools;
- while (poolp1) {
- poolp2 = poolp1;
- poolp1 = poolp1->next;
- (*freep)((void *) poolp2);
- }
-
- if (tab->buckets)
- (*freep)((void *) tab->buckets);
-
- (*freep)((void *) tab);
-}
-
-
-#define CP_BLK(TO, FROM) \
-do { \
- (TO)->time.secs = (FROM)->time.secs; \
- (TO)->time.usecs = (FROM)->time.usecs; \
- (TO)->type = (FROM)->type; \
- (TO)->pointer = (FROM)->pointer; \
- (TO)->size = (FROM)->size; \
-} while (0)
-
-int
-emtbt_alloc_op(emtbt_table *tab, emtp_operation *op)
-{
- int res;
- emtbt_block *blk;
-
- blk = block_alloc(tab);
- if (!blk)
- return ENOMEM;
-
- blk->time.secs = op->time.secs;
- blk->time.usecs = op->time.usecs;
- blk->type = op->u.block.type;
- blk->pointer = op->u.block.new_ptr;
- blk->size = op->u.block.new_size;
-
- res = insert_block(tab, blk);
- if (res < 0)
- return ENOMEM;
- else if (res == 0)
- return EMTBT_ALLOC_XBLK_ERROR;
- return 0;
-}
-
-int
-emtbt_realloc_op(emtbt_table *tab, emtp_operation *op, emtbt_block *old_blk)
-{
- int res;
- emtbt_block *blk;
-
- if (!op->u.block.new_size) {
- /* freed block */
-
- blk = fetch_block(tab, op->u.block.prev_ptr);
- if (!blk)
- return EMTBT_REALLOC_NOBLK_ERROR;
-
- CP_BLK(old_blk, blk);
- block_free(tab, blk);
- }
- else {
-
- if (!op->u.block.new_ptr) {
- /* failed operation */
- if (!op->u.block.prev_ptr)
- CP_BLK(old_blk, &null_blk);
- else {
- blk = peek_block(tab, op->u.block.prev_ptr);
- if (!blk)
- return EMTBT_REALLOC_NOBLK_ERROR;
- CP_BLK(old_blk, blk);
-#if 0
- if (blk->type != op->u.block.type)
- return EMTBT_REALLOC_BLK_TYPE_MISMATCH;
-#endif
- }
- }
- else if (!op->u.block.prev_ptr) {
- /* new block */
-
- CP_BLK(old_blk, &null_blk);
- blk = block_alloc(tab);
- if (!blk)
- return ENOMEM;
- blk->type = op->u.block.type;
- blk->pointer = op->u.block.new_ptr;
- blk->time.secs = op->time.secs;
- blk->time.usecs = op->time.usecs;
- blk->size = op->u.block.new_size;
-
- res = insert_block(tab, blk);
- if (res < 0)
- return ENOMEM;
- else if (res == 0)
- return EMTBT_REALLOC_XBLK_ERROR;
- }
- else if (op->u.block.new_ptr == op->u.block.prev_ptr) {
- /* resized block */
- blk = peek_block(tab, op->u.block.prev_ptr);
- if (!blk)
- return EMTBT_REALLOC_NOBLK_ERROR;
- CP_BLK(old_blk, blk);
- blk->time.secs = op->time.secs;
- blk->time.usecs = op->time.usecs;
- blk->size = op->u.block.new_size;
-#if 0
- if (blk->type != op->u.block.type)
- return EMTBT_REALLOC_BLK_TYPE_MISMATCH;
-#endif
- }
- else {
- /* moved block */
- blk = fetch_block(tab, op->u.block.prev_ptr);
- if (!blk)
- return EMTBT_REALLOC_NOBLK_ERROR;
- CP_BLK(old_blk, blk);
- blk->time.secs = op->time.secs;
- blk->time.usecs = op->time.usecs;
- blk->pointer = op->u.block.new_ptr;
- blk->size = op->u.block.new_size;
- res = insert_block(tab, blk);
- if (res < 0)
- return ENOMEM;
- else if (res == 0)
- return EMTBT_REALLOC_XBLK_ERROR;
-#if 0
- if (blk->type != op->u.block.type)
- return EMTBT_REALLOC_BLK_TYPE_MISMATCH;
-#endif
- }
- }
- return 0;
-
-}
-
-
-int
-emtbt_free_op(emtbt_table *tab, emtp_operation *op, emtbt_block *old_blk)
-{
- emtbt_block *blk;
-
- if (!op->u.block.prev_ptr)
- CP_BLK(old_blk, &null_blk);
- else {
-
- blk = fetch_block(tab, op->u.block.prev_ptr);
- if (!blk)
- return EMTBT_FREE_NOBLK_ERROR;
-
- CP_BLK(old_blk, blk);
- block_free(tab, blk);
-#if 0
- if (blk->type != op->u.block.type)
- return EMTBT_FREE_BLK_TYPE_MISMATCH;
-#endif
- }
- return 0;
-}
diff --git a/lib/tools/c_src/erl_memory_trace_block_table.h b/lib/tools/c_src/erl_memory_trace_block_table.h
deleted file mode 100644
index ead3afc8fb..0000000000
--- a/lib/tools/c_src/erl_memory_trace_block_table.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/* ``Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * The Initial Developer of the Original Code is Ericsson Utvecklings AB.
- * Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
- * AB. All Rights Reserved.''
- *
- * $Id$
- */
-
-
-/*
- * Description:
- *
- * Author: Rickard Green
- */
-
-#ifndef ERL_MEMORY_TRACE_BLOCK_TABLE_H__
-#define ERL_MEMORY_TRACE_BLOCK_TABLE_H__
-
-#include <stdlib.h>
-#include "erl_fixed_size_int_types.h"
-#include "erl_memory_trace_parser.h"
-
-
-#define EMTBT_ALLOC_XBLK_ERROR (EMTP_MIN_ERROR - 1)
-#define EMTBT_REALLOC_NOBLK_ERROR (EMTP_MIN_ERROR - 2)
-#define EMTBT_REALLOC_XBLK_ERROR (EMTP_MIN_ERROR - 3)
-#define EMTBT_REALLOC_BLK_TYPE_MISMATCH (EMTP_MIN_ERROR - 4)
-#define EMTBT_FREE_NOBLK_ERROR (EMTP_MIN_ERROR - 5)
-#define EMTBT_FREE_BLK_TYPE_MISMATCH (EMTP_MIN_ERROR - 6)
-#define EMTBT_INTERNAL_ERROR (EMTP_MIN_ERROR - 7)
-
-#define EMTBT_MIN_ERROR EMTBT_INTERNAL_ERROR
-
-
-typedef struct emtbt_block_ {
-
- struct emtbt_block_ * next;
- struct emtbt_block_ * prev;
- usgnd_int_32 hash;
- struct emtbt_block_ ** bucket;
-
- struct {
- usgnd_int_32 secs;
- usgnd_int_32 usecs;
- } time;
- usgnd_int_16 type;
- usgnd_int_max pointer;
- usgnd_int_max size;
-} emtbt_block;
-
-typedef struct emtbt_table_ emtbt_table;
-
-const char *emtbt_error_string(int);
-emtbt_table *emtbt_new_table(int,
- void * (*)(size_t),
- void * (*)(void *, size_t),
- void (*)(void *));
-void emtbt_destroy_table(emtbt_table *);
-int emtbt_alloc_op(emtbt_table *tab, emtp_operation *op);
-int emtbt_realloc_op(emtbt_table *, emtp_operation *, emtbt_block *);
-int emtbt_free_op(emtbt_table *, emtp_operation *, emtbt_block *);
-
-#endif
diff --git a/lib/tools/doc/src/cover.xml b/lib/tools/doc/src/cover.xml
index 9bcaa9227d..c9c7d2e6fc 100644
--- a/lib/tools/doc/src/cover.xml
+++ b/lib/tools/doc/src/cover.xml
@@ -5,7 +5,7 @@
<header>
<copyright>
<year>2001</year>
- <year>2020</year>
+ <year>2022</year>
<holder>Ericsson AB, All Rights Reserved</holder>
</copyright>
<legalnotice>
@@ -110,7 +110,7 @@
<p>If the connection to a remote node goes down, the main node
will mark it as lost. If the node comes back it will be added
again. If the remote node was alive during the disconnected
- periode, cover data from before and during this periode will be
+ period, cover data from before and during this period will be
included in the analysis.</p>
</description>
<funcs>
diff --git a/lib/tools/doc/src/cprof_chapter.xml b/lib/tools/doc/src/cprof_chapter.xml
index af13b8d8d7..986ad85bbf 100644
--- a/lib/tools/doc/src/cprof_chapter.xml
+++ b/lib/tools/doc/src/cprof_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2002</year><year>2021</year>
+ <year>2002</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -37,7 +37,7 @@
</p>
<p><c>cprof</c> uses breakpoints similar to local call trace,
but containing counters, to collect profiling
- data. Therfore there is no need for special compilation of any
+ data. Therefore there is no need for special compilation of any
module to be profiled.
</p>
<p><c>cprof</c> presents all profiled modules in decreasing total
diff --git a/lib/tools/doc/src/fprof.xml b/lib/tools/doc/src/fprof.xml
index e7e7ad69f3..4e4e466fc7 100644
--- a/lib/tools/doc/src/fprof.xml
+++ b/lib/tools/doc/src/fprof.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>2001</year><year>2021</year>
+ <year>2001</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -485,7 +485,7 @@
<item>Includes a section containing call statistics
for all calls regardless of process, in the analysis.</item>
<tag><c>{totals, false}</c></tag>
- <item>Supresses the totals section in the analysis, which is
+ <item>Suppresses the totals section in the analysis, which is
the default.</item>
<tag><c>details</c> | <c>{details, true}</c></tag>
<item>Prints call statistics for each process in the
@@ -686,7 +686,7 @@ create_file_slow(FD, M, N) ->
{{fprof,apply_start_stop,4}, 1, 0.000, 0.000}],
{ suspend, 299, 32.002, 0.000}, %
[ ]}.</pre>
- <p>We find no particulary long suspend times, so no function seems
+ <p>We find no particularly long suspend times, so no function seems
to have waited in a receive statement. Actually,
<c>prim_file:drv_command/4</c> contains a receive statement, but
in this test program, the message lies in the process receive
diff --git a/lib/tools/doc/src/fprof_chapter.xml b/lib/tools/doc/src/fprof_chapter.xml
index 65ffcede1a..b07eef2637 100644
--- a/lib/tools/doc/src/fprof_chapter.xml
+++ b/lib/tools/doc/src/fprof_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2001</year><year>2021</year>
+ <year>2001</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -37,7 +37,7 @@
processes.
</p>
<p><c>fprof</c> uses tracing with timestamps to collect profiling
- data. Therfore there is no need for special compilation of any
+ data. Therefore there is no need for special compilation of any
module to be profiled.
</p>
<p><c>fprof</c> presents wall clock times from the host machine OS,
diff --git a/lib/tools/doc/src/instrument.xml b/lib/tools/doc/src/instrument.xml
index 4305bad599..80a5e8c3ba 100644
--- a/lib/tools/doc/src/instrument.xml
+++ b/lib/tools/doc/src/instrument.xml
@@ -4,7 +4,7 @@
<erlref>
<header>
<copyright>
- <year>1998</year><year>2021</year>
+ <year>1998</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -36,11 +36,12 @@
<modulesummary>Analysis and Utility Functions for Instrumentation</modulesummary>
<description>
<p>The module <c>instrument</c> contains support for studying the resource
- usage in an Erlang runtime system. Currently, only the allocation of memory can
- be studied.</p>
+ usage in an Erlang runtime system. Currently, only the allocation of
+ memory can be studied.</p>
<note>
- <p>Note that this whole module is experimental, and the representations
- used as well as the functionality is likely to change in the future.</p>
+ <p>Since this module inspects internal details of the runtime system it
+ may differ greatly from one version to another. We make no compatibility
+ guarantees in this module.</p>
</note>
</description>
<datatypes>
@@ -52,6 +53,13 @@
<p>The upper bound of the first interval is provided by the function
that returned the histogram, and the last interval has no upper
bound.</p>
+ <p>For example, the histogram below has 40 (<c>message</c>) blocks
+ between 256-512 bytes in size, 78 blocks between 512-1024 bytes,2
+ blocks between 1-2KB, and 2 blocks between 2-4KB.</p>
+ <code type="none"><![CDATA[
+> instrument:allocations(#{ histogram_start => 128, histogram_width => 15 }).
+{ok, {128, 0, #{ message => {0,40,78,2,2,0,0,0,0,0,0,0,0,0,0}, ... } }}
+ ]]></code>
</desc>
</datatype>
<datatype>
@@ -62,7 +70,10 @@
<p><c><anno>Origin</anno></c> is generally which NIF or driver that
allocated the blocks, or 'system' if it could not be determined.</p>
<p><c><anno>Type</anno></c> is the allocation category that the blocks
- belong to, e.g. <c>db_term</c>, <c>message</c> or <c>binary</c>.</p>
+ belong to, e.g. <c>db_term</c>, <c>message</c> or <c>binary</c>. The
+ categories correspond to those in
+ <url href="https://github.com/erlang/otp/blob/master/erts/emulator/beam/erl_alloc.types">
+ erl_alloc.types</url>.</p>
<p>If one or more carriers could not be scanned in full without harming
the responsiveness of the system, <c><anno>UnscannedSize</anno></c>
is the number of bytes that had to be skipped.</p>
@@ -78,7 +89,10 @@
<p><c><anno>TotalSize</anno></c> is the total size of the carrier,
including its header.</p>
<p><c><anno>Allocations</anno></c> is a summary of the allocated blocks
- in the carrier.</p>
+ in the carrier. Note that carriers may contain multiple different
+ block types when carrier pools are shared between different allocator
+ types (see the <seecref marker="erts:erts_alloc#M_cp"><c>erts_alloc</c>
+ </seecref> documentation for more details).</p>
<p><c><anno>FreeBlocks</anno></c> is a histogram of the free block
sizes in the carrier.</p>
<p>If the carrier could not be scanned in full without harming the
@@ -115,11 +129,13 @@
<taglist>
<tag><c>allocator_types</c></tag>
<item>
- <p>The allocator types that will be searched. Note that blocks can
- move freely between allocator types, so restricting the search to
- certain allocators may return unexpected types (e.g. process
- heaps when searching binary_alloc), or hide blocks that were
- migrated out.</p>
+ <p>The allocator types that will be searched.</p>
+ <p>Specifying a specific allocator type may lead to strange results
+ when carrier migration between different allocator types has been
+ enabled: you may see unexpected types (e.g. process heaps when
+ searching binary_alloc), or fewer blocks than expected if the
+ carriers the blocks are on have been migrated out to an allocator
+ of a different type.</p>
<p>Defaults to all <c>alloc_util</c> allocators.</p>
</item>
<tag><c>scheduler_ids</c></tag>
@@ -217,10 +233,12 @@
<code type="none"><![CDATA[
> instrument:carriers(#{ histogram_start => 512, histogram_width => 8 }).
{ok,{512,
- [{ll_alloc,1048576,0,1048344,71,false,{0,0,0,0,0,0,0,0}},
- {binary_alloc,1048576,0,324640,13,false,{3,0,0,1,0,0,0,2}},
- {eheap_alloc,2097152,0,1037200,45,false,{2,1,1,3,4,3,2,2}},
- {fix_alloc,32768,0,29544,82,false,{22,0,0,0,0,0,0,0}},
+ [{driver_alloc,false,262144,0,
+ [{driver_alloc,1,32784}],
+ {0,0,0,0,0,0,0,1}},
+ {binary_alloc,false,32768,0,
+ [{binary_alloc,15,4304}],
+ {3,0,0,0,1,0,0,0}},
{...}|...]}}
]]></code>
</desc>
diff --git a/lib/tools/doc/src/lcnt_chapter.xml b/lib/tools/doc/src/lcnt_chapter.xml
index c8afd7063d..a9628525c9 100644
--- a/lib/tools/doc/src/lcnt_chapter.xml
+++ b/lib/tools/doc/src/lcnt_chapter.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2009</year><year>2021</year>
+ <year>2009</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -42,7 +42,7 @@
completed its access to the resource and unlocked it. The <c>lcnt</c> tool measures these lock conflicts.
</p>
<p>
- Locks have an inherent cost in execution time and memory space. It takes time initialize, destroy, aquiring or releasing locks. To decrease lock contention it
+ Locks have an inherent cost in execution time and memory space. It takes time initialize, destroy, acquiring or releasing locks. To decrease lock contention it
some times necessary to use finer grained locking strategies. This will usually also increase the locking overhead and hence there is a tradeoff
between lock contention and overhead. In general, lock contention increases with the number of threads running concurrently. The <c>lcnt</c> tool does not measure locking overhead.
</p>
diff --git a/lib/tools/doc/src/notes_history.xml b/lib/tools/doc/src/notes_history.xml
index d955cbde69..7ef93d6fbf 100644
--- a/lib/tools/doc/src/notes_history.xml
+++ b/lib/tools/doc/src/notes_history.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2006</year><year>2016</year>
+ <year>2006</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -91,7 +91,7 @@
<p>Own Id: OTP-4594</p>
</item>
<item>
- <p>Improvments for support of Emacs 21 contributed by Dave
+ <p>Improvements for support of Emacs 21 contributed by Dave
Love. The bulk of the changes are actually cosmetic
commentary/doc fixes. The significant ones make it play
better with Emacs 21 with up-to-date facilities. In
diff --git a/lib/tools/emacs/Makefile b/lib/tools/emacs/Makefile
index c19ad3668c..279ae5f805 100644
--- a/lib/tools/emacs/Makefile
+++ b/lib/tools/emacs/Makefile
@@ -59,7 +59,7 @@ ELC_FILES = $(EMACS_FILES:%=%.elc)
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES) $(EL_FILES)
+$(TYPES): $(TARGET_FILES) $(EL_FILES)
clean:
rm -f $(TARGET_FILES) $(ELC_FILES)
diff --git a/lib/tools/emacs/README b/lib/tools/emacs/README
index cc107dcd41..8916e65250 100644
--- a/lib/tools/emacs/README
+++ b/lib/tools/emacs/README
@@ -34,13 +34,13 @@ variable. If HOME is not set, Emacs will look for the .emacs file in
C:\.
Below is a complete example of what should be added to a user's .emacs
-provided that OTP is installed in the directory C:\Program
-Files\erl-<Ver>:
+provided that OTP is installed in the directory "C:\Program
+Files\Erlang OTP":
(setq load-path (cons "C:/Program Files/erl<Ver>/lib/tools-<ToolsVer>/emacs"
load-path))
- (setq erlang-root-dir "C:/Program Files/erl<Ver>")
- (setq exec-path (cons "C:/Program Files/erl<Ver>/bin" exec-path))
+ (setq erlang-root-dir "C:/Program Files/Erlang OTP")
+ (setq exec-path (cons "C:/Program Files/Erlang OTP/bin" exec-path))
(require 'erlang-start)
diff --git a/lib/tools/emacs/erlang-eunit.el b/lib/tools/emacs/erlang-eunit.el
index 1130bc0cde..f7c69daaa1 100644
--- a/lib/tools/emacs/erlang-eunit.el
+++ b/lib/tools/emacs/erlang-eunit.el
@@ -1,7 +1,7 @@
;;
;; %CopyrightBegin%
;;
-;; Copyright Ericsson AB 2009-2021. All Rights Reserved.
+;; Copyright Ericsson AB 2009-2022. All Rights Reserved.
;;
;; Licensed under the Apache License, Version 2.0 (the "License");
;; you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ a source file. The first directory in the list will be used,
if there is no match.")
(defvar erlang-eunit-autosave nil
- "*Set to non-nil to automtically save unsaved buffers before running tests.
+ "*Set to non-nil to automatically save unsaved buffers before running tests.
This is useful, reducing the save-compile-load-test cycle to one keychord.")
(defvar erlang-eunit-recent-info '((mode . nil) (module . nil) (test . nil) (cover . nil))
diff --git a/lib/tools/emacs/erlang-skels-old.el b/lib/tools/emacs/erlang-skels-old.el
index 4087bc3013..7d503c4bc1 100644
--- a/lib/tools/emacs/erlang-skels-old.el
+++ b/lib/tools/emacs/erlang-skels-old.el
@@ -1,7 +1,7 @@
;;
;; %CopyrightBegin%
;;
-;; Copyright Ericsson AB 2010-2016. All Rights Reserved.
+;; Copyright Ericsson AB 2010-2022. All Rights Reserved.
;;
;; Licensed under the Apache License, Version 2.0 (the "License");
;; you may not use this file except in compliance with the License.
@@ -368,7 +368,7 @@ Please see the function `tempo-define-template'.")
"%% supervisor_bridge callbacks" n
(erlang-skel-double-separator 2)
(erlang-skel-separator 2)
- "%% Funcion: init(Args) -> {ok, Pid, State} |" n
+ "%% Function: init(Args) -> {ok, Pid, State} |" n
"%% ignore |" n
"%% {error, Reason} " n
"%% Description:Creates a supervisor_bridge process, linked to the calling" n
diff --git a/lib/tools/emacs/erlang-start.el b/lib/tools/emacs/erlang-start.el
index c35f280bf4..a19f72e243 100644
--- a/lib/tools/emacs/erlang-start.el
+++ b/lib/tools/emacs/erlang-start.el
@@ -74,9 +74,9 @@
"Find manual page for NAME, where NAME is module:function." t)
(autoload 'erlang-find-tag "erlang"
- "Like `find-tag'. Capable of retreiving Erlang modules.")
+ "Like `find-tag'. Capable of retrieving Erlang modules.")
(autoload 'erlang-find-tag-other-window "erlang"
- "Like `find-tag-other-window'. Capable of retreiving Erlang modules.")
+ "Like `find-tag-other-window'. Capable of retrieving Erlang modules.")
;;
;; Declare functions in "erlang-edoc.el".
diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el
index 7216d6b6fd..065e180804 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -678,6 +678,8 @@ resulting regexp is surrounded by \\_< and \\_>."
"of"
"receive"
"try"
+ "maybe"
+ "else"
"when")
"Erlang reserved keywords"))
@@ -1466,8 +1468,8 @@ Other commands:
(modify-syntax-entry ?\n ">" table)
(modify-syntax-entry ?\" "\"" table)
(modify-syntax-entry ?# "." table)
- ;; (modify-syntax-entry ?$ "\\" table) ;; Creates problems with indention afterwards
- ;; (modify-syntax-entry ?$ "'" table) ;; Creates syntax highlighting and indention problems
+ ;; (modify-syntax-entry ?$ "\\" table) ;; Creates problems with indentation afterwards
+ ;; (modify-syntax-entry ?$ "'" table) ;; Creates syntax highlighting and indentation problems
(modify-syntax-entry ?$ "/" table) ;; Misses the corner case "string that ends with $"
;; we have to live with that for now..it is the best alternative
;; that can be worked around with "string that ends with \$"
@@ -2730,13 +2732,13 @@ Value is list (stack token-start token-type in-what)."
;; Word constituent: check and handle keywords.
((= cs ?w)
- (cond ((looking-at "\\(end\\|after\\)[^_a-zA-Z0-9]")
+ (cond ((looking-at "\\(end\\|after\\|else\\)[^_a-zA-Z0-9]")
;; Must pop top icr layer, `after' will push a new
;; layer next.
(progn
(while (and stack (eq (car (car stack)) '->))
(erlang-pop stack))
- (if (and stack (memq (car (car stack)) '(icr begin fun try)))
+ (if (and stack (memq (car (car stack)) '(icr begin fun try maybe)))
(erlang-pop stack))))
((looking-at "catch\\b.*of")
t)
@@ -2746,7 +2748,7 @@ Value is list (stack token-start token-type in-what)."
(progn
(while (and stack (eq (car (car stack)) '->))
(erlang-pop stack))
- (if (and stack (memq (car (car stack)) '(icr begin try)))
+ (if (and stack (memq (car (car stack)) '(icr begin try maybe)))
(erlang-pop stack))))
)
(cond ((looking-at "\\(if\\|case\\|receive\\)[^_a-zA-Z0-9]")
@@ -2768,7 +2770,7 @@ Value is list (stack token-start token-type in-what)."
((looking-at "\\(fun\\)[^_a-zA-Z0-9]")
;; Push a new layer if we are defining a `fun'
- ;; expression, not when we are refering an existing
+ ;; expression, not when we are referring an existing
;; function. 'fun's defines are only indented one level now.
(if (save-excursion
(goto-char (match-end 1))
@@ -2783,6 +2785,11 @@ Value is list (stack token-start token-type in-what)."
(erlang-push (list 'fun token (current-column)) stack)))
((looking-at "\\(begin\\)[^_a-zA-Z0-9]")
(erlang-push (list 'begin token (current-column)) stack))
+ ((looking-at "\\(maybe\\)[^_a-zA-Z0-9]")
+ (erlang-push (list 'begin token (current-column)) stack))
+ ((looking-at "\\(else\\)[^_a-zA-Z0-9]")
+ (erlang-push (list 'icr token (current-column)) stack))
+
;; Normal when case
;;((looking-at "when\\s ")
;;((looking-at "when\\s *\\($\\|%\\)")
@@ -2820,7 +2827,7 @@ Value is list (stack token-start token-type in-what)."
(forward-char 1))
(t
;; Maybe a character literal, quote the next char to avoid
- ;; situations as $" being seen as the begining of a string.
+ ;; situations as $" being seen as the beginning of a string.
;; Note the quoting something in the middle of a string is harmless.
(quote (following-char))
(forward-char 1))))
@@ -2875,7 +2882,7 @@ Value is list (stack token-start token-type in-what)."
(erlang-pop stack))
(cond ((eq (car (car stack)) '<<)
(erlang-pop stack))
- ((memq (car (car stack)) '(icr begin fun))
+ ((memq (car (car stack)) '(icr begin maybe fun))
(error "Missing `end'"))
(t
(error "Unbalanced parentheses")))
@@ -2947,6 +2954,8 @@ Value is list (stack token-start token-type in-what)."
))
((eq (car (car stack)) 'begin)
(error "Missing `end'"))
+ ((eq (car (car stack)) 'maybe)
+ (error "Missing `end'"))
(t
(error "Unbalanced parenthesis"))
)
@@ -3048,7 +3057,7 @@ Return nil if inside string, t if in a comment."
((and (eq (car stack-top) '||) (looking-at "\\(]\\|>>\\)[^_a-zA-Z0-9]"))
(nth 2 (car (cdr stack))))
;; Real indentation, where operators create extra indentation etc.
- ((memq (car stack-top) '(-> || try begin))
+ ((memq (car stack-top) '(-> || try begin maybe))
(if (looking-at "\\(of\\)[^_a-zA-Z0-9]")
(nth 2 stack-top)
(goto-char (nth 1 stack-top))
@@ -3060,6 +3069,8 @@ Return nil if inside string, t if in a comment."
(cond ((null (cdr stack))) ; Top level in function.
((eq (car stack-top) 'begin)
(setq skip 5))
+ ((eq (car stack-top) 'maybe)
+ (setq skip 5))
((eq (car stack-top) 'try)
(setq skip 5))
((eq (car stack-top) '->)
@@ -3073,7 +3084,7 @@ Return nil if inside string, t if in a comment."
(let ((base (erlang-indent-find-base stack indent-point off skip)))
;; Special cases
(goto-char indent-point)
- (cond ((looking-at "\\(;\\|end\\|after\\)\\($\\|[^_a-zA-Z0-9]\\)")
+ (cond ((looking-at "\\(;\\|end\\|after\\|else\\)\\($\\|[^_a-zA-Z0-9]\\)")
(if (eq (car stack-top) '->)
(erlang-pop stack))
(cond ((and stack (looking-at ";"))
@@ -3222,7 +3233,7 @@ Return nil if inside string, t if in a comment."
(progn
(if (memq (car stack-top) '(-> ||))
(erlang-pop stack))
- ;; Take parent identation + offset,
+ ;; Take parent indentation + offset,
;; else just erlang-indent-level if no parent
(if stack
(+ (caddr (car stack))
@@ -3324,8 +3335,8 @@ This assumes that the preceding expression is either simple
(defun erlang-at-keyword ()
"Are we looking at an Erlang keyword which will increase indentation?"
- (looking-at (concat "\\(when\\|if\\|fun\\|case\\|begin\\|"
- "of\\|receive\\|after\\|catch\\|try\\)\\b")))
+ (looking-at (concat "\\(when\\|if\\|fun\\|case\\|begin\\|maybe\\|"
+ "of\\|receive\\|after\\|catch\\|try\\|else\\)\\b")))
(defun erlang-at-operator ()
"Are we looking at an Erlang operator?"
@@ -6068,7 +6079,7 @@ unless the optional NO-DISPLAY is non-nil."
erlang-compile-erlang-function
module-name
(inferior-erlang-format-comma-opts opts))
- (let (;; Hopefully, noone else will ever use these...
+ (let (;; Hopefully, no one else will ever use these...
(tmpvar "Tmp7236")
(tmpvar2 "Tmp8742"))
(format
diff --git a/lib/tools/emacs/erlang_appwiz.el b/lib/tools/emacs/erlang_appwiz.el
index b71c180739..1928ea0279 100644
--- a/lib/tools/emacs/erlang_appwiz.el
+++ b/lib/tools/emacs/erlang_appwiz.el
@@ -23,7 +23,7 @@
;;(defvar erlang-skel-makefile-src
;; '((erlang-skel-include erlang-skel-nomodule-header)
;; "CC_ROOT := $(shell pwd | sed 's/erts.*$$//')" n
-;; "AUTOCONF := $(CC_ROOT)/erts/autoconf" n
+;; "AUTOCONF := $(CC_ROOT)/make/autoconf" n
;; "TARGET := $(shell $(AUTOCONF)/config.guess)"
;; "include $(CC_ROOT)/internal_tools/make/$(TARGET)/otp.mk" n
;; n
@@ -272,7 +272,7 @@ creating the root directory and for naming application files."
erlang-skel-normal-header erlang-skel-header)
("Large Header" "large-header"
erlang-skel-large-header erlang-skel-header)
- ("No Moudle Header" "nomodule-header"
+ ("No Module Header" "nomodule-header"
erlang-skel-nomodule-header erlang-skel-header)
()
("Small Server" "small-server"
@@ -302,7 +302,7 @@ The first element is the name which shows up in the menu. The second
is the `tempo' identfier (The string \"erlang-\" will be added in
front of it). The third is the skeleton descriptor, a variable
containing `tempo' attributes as described in the function
-`tempo-define-template'. The optinal fourth elements denotes a
+`tempo-define-template'. The optional fourth elements denotes a
function which should be called when the menu is selected.
Functions corresponding to every template will be created. The name
@@ -310,7 +310,7 @@ of the function will be `tempo-template-erlang-X' where `X' is the
tempo identifier as specified in the second argument of the elements
in this list.
-A list with zero elemets means that the a horisontal line should
+A list with zero elements means that the a horisontal line should
be placed in the menu.")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -451,7 +451,7 @@ Example:
((\"Yellow\" function-yellow)
(\"Blue\" function-blue)))
nil
- (\"Region Funtion\" spook-function midnight-variable))
+ (\"Region Function\" spook-function midnight-variable))
Call the function `erlang-menu-init' after modifying this variable.")
diff --git a/lib/tools/examples/Makefile b/lib/tools/examples/Makefile
index 0fcc66d874..a5e0473f64 100644
--- a/lib/tools/examples/Makefile
+++ b/lib/tools/examples/Makefile
@@ -39,7 +39,7 @@ EXAMPLE_FILES = xref_examples.erl
# Targets
# ----------------------------------------------------
-debug opt:
+$(TYPES):
clean:
diff --git a/lib/tools/obj/.gitignore b/lib/tools/obj/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/tools/obj/.gitignore
+++ /dev/null
diff --git a/lib/tools/src/Makefile b/lib/tools/src/Makefile
index cc5bee9a8f..b05ce883ec 100644
--- a/lib/tools/src/Makefile
+++ b/lib/tools/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1996-2018. All Rights Reserved.
+# Copyright Ericsson AB 1996-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -84,7 +84,7 @@ ERL_COMPILE_FLAGS += -Werror
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+$(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
clean:
rm -f $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
diff --git a/lib/tools/src/cover.erl b/lib/tools/src/cover.erl
index 83ccde524f..27006199d1 100644
--- a/lib/tools/src/cover.erl
+++ b/lib/tools/src/cover.erl
@@ -336,6 +336,7 @@ filter_options(Options) ->
{d, _Macro, _Value} -> true;
export_all -> true;
tuple_calls -> true;
+ {enable_feature,_} -> true; %FIXME: To be removed.
_ -> false
end
end,
@@ -430,7 +431,7 @@ get_mods_and_beams([{Module,File}|ModFiles],Acc) ->
%% Duplicate, but same file so ignore
get_mods_and_beams(ModFiles,Acc);
{ok,Module,_OtherFile} ->
- %% Duplicate and differnet file - error
+ %% Duplicate and different file - error
get_mods_and_beams(ModFiles,[{error,{duplicate,Module}}|Acc]);
_ ->
get_mods_and_beams(ModFiles,[{ok,Module,File}|Acc])
@@ -1958,7 +1959,7 @@ munge({function,Anno,Function,Arity,Clauses},Vars,_MainFile,on) ->
{MungedClauses, Vars3} = munge_clauses(Clauses, Vars2),
{{function,Anno,Function,Arity,MungedClauses},Vars3,on};
munge(Form={attribute,_,file,{MainFile,_}},Vars,MainFile,_Switch) ->
- {Form,Vars,on}; % Switch on tranformation!
+ {Form,Vars,on}; % Switch on transformation!
munge(Form={attribute,_,file,{_InclFile,_}},Vars,_MainFile,_Switch) ->
{Form,Vars,off}; % Switch off transformation!
munge({attribute,_,compile,{parse_transform,_}},_Vars,_MainFile,_Switch) ->
@@ -2169,6 +2170,10 @@ munge_expr({match,Anno,ExprL,ExprR}, Vars) ->
{MungedExprL, Vars2} = munge_expr(ExprL, Vars),
{MungedExprR, Vars3} = munge_expr(ExprR, Vars2),
{{match,Anno,MungedExprL,MungedExprR}, Vars3};
+munge_expr({maybe_match,Anno,ExprL,ExprR}, Vars) ->
+ {MungedExprL, Vars2} = munge_expr(ExprL, Vars),
+ {MungedExprR, Vars3} = munge_expr(ExprR, Vars2),
+ {{maybe_match,Anno,MungedExprL,MungedExprR}, Vars3};
munge_expr({tuple,Anno,Exprs}, Vars) ->
{MungedExprs, Vars2} = munge_exprs(Exprs, Vars, []),
{{tuple,Anno,MungedExprs}, Vars2};
@@ -2260,6 +2265,13 @@ munge_expr({'try',Anno,Body,Clauses,CatchClauses,After}, Vars) ->
{MungedAfter, Vars4} = munge_body(After, Vars3),
{{'try',Anno,MungedBody,MungedClauses,MungedCatchClauses,MungedAfter},
Vars4};
+munge_expr({'maybe',Anno,Exprs}, Vars) ->
+ {MungedExprs, Vars2} = munge_body(Exprs, Vars),
+ {{'maybe',Anno,MungedExprs}, Vars2};
+munge_expr({'maybe',MaybeAnno,Exprs,{'else',ElseAnno,Clauses}}, Vars) ->
+ {MungedExprs, Vars2} = munge_body(Exprs, Vars),
+ {MungedClauses, Vars3} = munge_clauses(Clauses, Vars2),
+ {{'maybe',MaybeAnno,MungedExprs,{'else',ElseAnno,MungedClauses}}, Vars3};
munge_expr({'fun',Anno,{clauses,Clauses}}, Vars) ->
{MungedClauses,Vars2}=munge_clauses(Clauses, Vars),
{{'fun',Anno,{clauses,MungedClauses}}, Vars2};
diff --git a/lib/tools/src/fprof.erl b/lib/tools/src/fprof.erl
index 0d24120b83..bc2a0a3ac4 100644
--- a/lib/tools/src/fprof.erl
+++ b/lib/tools/src/fprof.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -21,7 +21,7 @@
%%%----------------------------------------------------------------------
%%% File : fprof.erl
%%% Author : Raimo Niskanen <raimo@erix.ericsson.se>
-%%% Purpose : File tracing profiling tool wich accumulated times.
+%%% Purpose : File tracing profiling tool which accumulated times.
%%% Created : 18 Jun 2001 by Raimo Niskanen <raimo@erix.ericsson.se>
%%%----------------------------------------------------------------------
diff --git a/lib/tools/src/tags.erl b/lib/tools/src/tags.erl
index df110185a2..2287196484 100644
--- a/lib/tools/src/tags.erl
+++ b/lib/tools/src/tags.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2020. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -59,7 +59,7 @@
%% directories in `DirList'.
%%
%% subdir(Dir [, Options]) -- Descend recursively down `Dir' and create
-%% a TAGS file convering all files found.
+%% a TAGS file covering all files found.
%% subdirs(DirList [, Options])
%% -- Dito, for all directories in `DirList'.
%%
diff --git a/lib/tools/test/Makefile b/lib/tools/test/Makefile
index 350b936978..571fdd07e9 100644
--- a/lib/tools/test/Makefile
+++ b/lib/tools/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2020. All Rights Reserved.
+# Copyright Ericsson AB 1997-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -24,7 +24,6 @@ MODULES = \
cover_SUITE \
eprof_SUITE \
emacs_SUITE \
- emem_SUITE \
fprof_SUITE \
cprof_SUITE \
instrument_SUITE \
@@ -67,7 +66,7 @@ make_emakefile:
$(ERL_TOP)/make/make_emakefile $(ERL_COMPILE_FLAGS) -o$(EBIN) $(MODULES)\
> $(EMAKEFILE)
-tests debug opt: make_emakefile
+tests $(TYPES): make_emakefile
erl $(ERL_MAKE_FLAGS) -make
clean:
diff --git a/lib/tools/test/cover_SUITE.erl b/lib/tools/test/cover_SUITE.erl
index 1393c9d1e1..b02b3df0b6 100644
--- a/lib/tools/test/cover_SUITE.erl
+++ b/lib/tools/test/cover_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,14 +25,15 @@
suite() ->
[{ct_hooks,[ts_install_cth]},
- {timetrap,{minutes,5}}].
+ {timetrap,{minutes,2}}].
all() ->
NoStartStop = [eif,otp_5305,otp_5418,otp_7095,otp_8273,
otp_8340,otp_8188,compile_beam_opts,eep37,
analyse_no_beam, line_0, compile_beam_no_file,
compile_beam_missing_backend,
- otp_13277, otp_13289, guard_in_lc, gh_4796],
+ otp_13277, otp_13289, guard_in_lc, gh_4796,
+ eep49],
StartStop = [start, compile, analyse, misc, stop,
distribution, reconnect, die_and_reconnect,
dont_reconnect_after_stop, stop_node_after_disconnect,
@@ -440,14 +441,14 @@ distribution(Config) when is_list(Config) ->
DataDir = proplists:get_value(data_dir, Config),
ok = file:set_cwd(DataDir),
- {ok,N1} = test_server:start_node(cover_SUITE_distribution1,slave,[]),
- {ok,N2} = test_server:start_node(cover_SUITE_distribution2,slave,[]),
- {ok,N3} = test_server:start_node(cover_SUITE_distribution3,slave,[]),
- {ok,N4} = test_server:start_node(cover_SUITE_distribution4,slave,[]),
+ {ok,P1,N1} = ?CT_PEER(),
+ {ok,P2,N2} = ?CT_PEER(),
+ {ok,P3,N3} = ?CT_PEER(),
+ {ok,P4,N4} = ?CT_PEER(),
%% Check that an already compiled module is loaded on new nodes
{ok,f} = cover:compile(f),
- {ok,[_,_,_,_]} = cover:start(nodes()),
+ {ok,[_,_,_,_]} = cover:start([N1,N2,N3,N4]),
cover_compiled = code:which(f),
cover_compiled = rpc:call(N1,code,which,[f]),
cover_compiled = rpc:call(N2,code,which,[f]),
@@ -474,7 +475,7 @@ distribution(Config) when is_list(Config) ->
%% this is lost when the node is killed
rpc:call(N3,f,f2,[]),
- rpc:call(N3,erlang,halt,[]),
+ peer:stop(P3),
%% this should be visible in analyse
rpc:call(N1,f,f1,[]),
@@ -514,7 +515,7 @@ distribution(Config) when is_list(Config) ->
%% Check that flush collects data so calls are not lost if node is killed
rpc:call(N4,f,f2,[]),
ok = cover:flush(N4),
- rpc:call(N4,erlang,halt,[]),
+ peer:stop(P4),
check_f_calls(1,3),
%% Check that stop() unloads on all nodes
@@ -535,8 +536,8 @@ distribution(Config) when is_list(Config) ->
%% Cleanup
Files = lsfiles(),
remove(files(Files, ".beam")),
- test_server:stop_node(N1),
- test_server:stop_node(N2).
+ peer:stop(P1),
+ peer:stop(P2).
%% Test that a lost node is reconnected
reconnect(Config) ->
@@ -547,19 +548,17 @@ reconnect(Config) ->
{ok,b} = compile:file(b),
{ok,f} = compile:file(f),
- {ok,N1} = test_server:start_node(cover_SUITE_reconnect,peer,
- [{args," -pa " ++ DataDir},
- {start_cover,false}]),
+ {ok,P1,N1} = ?CT_PEER(#{connection => 0, args => ["-pa", DataDir]}),
{ok,a} = cover:compile(a),
{ok,f} = cover:compile(f),
- {ok,[N1]} = cover:start(nodes()),
+ {ok,[N1]} = cover:start([N1]),
%% Some calls to check later
rpc:call(N1,f,f1,[]),
cover:flush(N1),
rpc:call(N1,f,f1,[]),
- %% This will cause first casue the N1 node to initiate a
+ %% This will cause first cause the N1 node to initiate a
%% disconnect and then call f:f2() when nodes() =:= [] on N1.
rpc:cast(N1,f,call_f2_when_isolated,[]),
timer:sleep(500), % allow some to detect disconnect and for f:f2() call
@@ -590,7 +589,7 @@ reconnect(Config) ->
check_f_calls(2,1),
cover:stop(),
- test_server:stop_node(N1),
+ peer:stop(P1),
ok.
%% Test that a lost node is reconnected - also if it has been dead
@@ -600,13 +599,10 @@ die_and_reconnect(Config) ->
{ok,f} = compile:file(f),
- NodeName = cover_SUITE_die_and_reconnect,
- {ok,N1} = test_server:start_node(NodeName,peer,
- [{args," -pa " ++ DataDir},
- {start_cover,false}]),
+ {ok, P1, N1} = ?CT_PEER(#{name => ?CT_PEER_NAME(), args => ["-pa", DataDir]}),
%% {ok,a} = cover:compile(a),
{ok,f} = cover:compile(f),
- {ok,[N1]} = cover:start(nodes()),
+ {ok,[N1]} = cover:start([N1]),
%% Some calls to check later
rpc:call(N1,f,f1,[]),
@@ -614,15 +610,13 @@ die_and_reconnect(Config) ->
rpc:call(N1,f,f1,[]),
%% Kill the node
- rpc:call(N1,erlang,halt,[]),
+ peer:stop(P1),
cover_which_nodes([]),
check_f_calls(1,0), % only the first call - before the flush
%% Restart the node and check that cover reconnects
- {ok,N1} = test_server:start_node(NodeName,peer,
- [{args," -pa " ++ DataDir},
- {start_cover,false}]),
+ {ok,P2,N1} = ?CT_PEER(#{name => N1, args => ["-pa", DataDir]}),
timer:sleep(100),
[N1] = cover:which_nodes(), % we are reconnected
cover_compiled = rpc:call(N1,code,which,[f]),
@@ -634,7 +628,7 @@ die_and_reconnect(Config) ->
check_f_calls(2,0),
cover:stop(),
- test_server:stop_node(N1),
+ peer:stop(P2),
ok.
%% Test that a stopped node is not marked as lost, i.e. that it is not
@@ -645,27 +639,23 @@ dont_reconnect_after_stop(Config) ->
{ok,f} = compile:file(f),
- NodeName = cover_SUITE_dont_reconnect_after_stop,
- {ok,N1} = test_server:start_node(NodeName,peer,
- [{args," -pa " ++ DataDir},
- {start_cover,false}]),
+ {ok, P1, N1} = ?CT_PEER(#{name => ?CT_PEER_NAME(), args => ["-pa", DataDir],
+ start_cover => false}),
{ok,f} = cover:compile(f),
- {ok,[N1]} = cover:start(nodes()),
+ {ok,[N1]} = cover:start([N1]),
%% A call to check later
rpc:call(N1,f,f1,[]),
%% Stop cover on the node, then terminate the node
cover:stop(N1),
- rpc:call(N1,erlang,halt,[]),
+ peer:stop(P1),
cover_which_nodes([]),
check_f_calls(1,0),
%% Restart the node and check that cover does not reconnect
- {ok,N1} = test_server:start_node(NodeName,peer,
- [{args," -pa " ++ DataDir},
- {start_cover,false}]),
+ {ok, P2, N1} = ?CT_PEER(#{name => N1, args => ["-pa", DataDir], start_cover => false}),
timer:sleep(300),
cover_which_nodes([]),
Beam = rpc:call(N1,code,which,[f]),
@@ -679,7 +669,7 @@ dont_reconnect_after_stop(Config) ->
check_f_calls(1,0),
cover:stop(),
- test_server:stop_node(N1),
+ peer:stop(P2),
ok.
%% Test that a node which is stopped while it is marked as lost is not
@@ -690,19 +680,17 @@ stop_node_after_disconnect(Config) ->
{ok,f} = compile:file(f),
- NodeName = cover_SUITE_stop_node_after_disconnect,
- {ok,N1} = test_server:start_node(NodeName,peer,
- [{args," -pa " ++ DataDir},
- {start_cover,false}]),
+ {ok, P1, N1} = ?CT_PEER(#{name => ?CT_PEER_NAME(), args => ["-pa", DataDir],
+ start_cover => false}),
{ok,f} = cover:compile(f),
- {ok,[N1]} = cover:start(nodes()),
+ {ok,[N1]} = cover:start([N1]),
%% A call to check later
rpc:call(N1,f,f1,[]),
%% Flush the node, then terminate the node to make it marked as lost
cover:flush(N1),
- rpc:call(N1,erlang,halt,[]),
+ peer:stop(P1),
check_f_calls(1,0),
@@ -710,9 +698,7 @@ stop_node_after_disconnect(Config) ->
cover:stop(N1),
%% Restart the node and check that cover does not reconnect
- {ok,N1} = test_server:start_node(NodeName,peer,
- [{args," -pa " ++ DataDir},
- {start_cover,false}]),
+ {ok, P2, N1} = ?CT_PEER(#{name => N1, args => ["-pa", DataDir], start_cover => false}),
timer:sleep(300),
cover_which_nodes([]),
Beam = rpc:call(N1,code,which,[f]),
@@ -726,7 +712,7 @@ stop_node_after_disconnect(Config) ->
check_f_calls(1,0),
cover:stop(),
- test_server:stop_node(N1),
+ peer:stop(P2),
ok.
distribution_performance(Config) ->
@@ -742,18 +728,14 @@ distribution_performance(Config) ->
% test_server:break(""),
- NodeName = cover_SUITE_distribution_performance,
- {ok,N1} = test_server:start_node(NodeName,peer,[{start_cover,false}]),
+ {ok, P1, N1} = ?CT_PEER(),
%% CFun = fun() ->
%% [{ok,_} = cover:compile_beam(Mod) || Mod <- Mods]
%% end,
CFun = fun() -> cover:compile_beam(Mods) end,
- {CT,_CA} = timer:tc(CFun),
- % erlang:display(_CA),
- erlang:display({compile,CT}),
+ {_CT, _CA} = timer:tc(CFun),
- {SNT,_} = timer:tc(fun() -> {ok,[N1]} = cover:start(nodes()) end),
- erlang:display({start_node,SNT}),
+ {ok,[N1]} = cover:start([N1]),
[1 = rpc:call(N1,Mod,f1,[1]) || Mod <- Mods],
@@ -769,16 +751,14 @@ distribution_performance(Config) ->
% Fun = fun() -> cover:reset() end,
- {AT,_A} = timer:tc(Fun),
- erlang:display({analyse,AT}),
+ {_AT, _A} = timer:tc(Fun),
% erlang:display(lists:sort([X || X={_MFA,N} <- lists:append([L || {ok,L}<-A]), N=/=0])),
%% fprof:apply(Fun, [],[{procs,[whereis(cover_server)]}]),
%% fprof:profile(),
%% fprof:analyse(dest,[]),
- {SNT2,_} = timer:tc(fun() -> test_server:stop_node(N1) end),
- erlang:display({stop_node,SNT2}),
+ peer:stop(P1),
code:del_path(Dir),
Files = filelib:wildcard(AllFiles),
@@ -861,7 +841,7 @@ export_import(Config) when is_list(Config) ->
ok = cover:stop(),
%% Check that same data exists after import and that info is written about
- %% data comming from imported file
+ %% data coming from imported file
ok = cover:import("f_exported"),
test_server:capture_start(),
check_f_calls(1,0),
@@ -946,11 +926,11 @@ export_import(Config) when is_list(Config) ->
otp_5031(Config) when is_list(Config) ->
ct:timetrap({seconds, 10}),
- {ok,N1} = test_server:start_node(cover_SUITE_otp_5031,slave,[]),
+ {ok,Peer,N1} = ?CT_PEER(),
{ok,[N1]} = cover:start(N1),
{error,not_main_node} = rpc:call(N1,cover,modules,[]),
cover:stop(),
- test_server:stop_node(N1),
+ peer:stop(Peer),
ok.
%% Test the \'Exclude Included Functions\' functionality
@@ -1005,7 +985,7 @@ otp_6115(Config) when is_list(Config) ->
{ok, f1} = cover:compile(f1),
%% This test used to ensure that a process containing a
- %% fun refering to cover compiled code was killed.
+ %% fun referring to cover compiled code was killed.
%% check_process_code may however ignore funs as of ERTS
%% version 8.1. The test has therefore been rewritten to
%% check that a process with a direct reference (in this
@@ -1159,13 +1139,13 @@ otp_8270(Config) when is_list(Config) ->
PrivDir = proplists:get_value(priv_dir, Config),
- As = [{args," -pa " ++ PrivDir}],
- {ok,N1} = test_server:start_node(cover_n1,slave,As),
- {ok,N2} = test_server:start_node(cover_n2,slave,As),
- {ok,N3} = test_server:start_node(cover_n3,slave,As),
+ As = ["-pa", PrivDir],
+ {ok,P1,N1} = ?CT_PEER(As),
+ {ok,P2,N2} = ?CT_PEER(As),
+ {ok,P3,N3} = ?CT_PEER(As),
timer:sleep(500),
- {ok,[_,_,_]} = cover:start(nodes()),
+ {ok,[_,_,_]} = cover:start([N1,N2,N3]),
Test = <<"-module(m).\n"
"-compile(export_all).\n"
@@ -1203,9 +1183,9 @@ otp_8270(Config) when is_list(Config) ->
{N3,true} = {N3,is_list(N3_info)},
exit(Pid1,kill),
- test_server:stop_node(N1),
- test_server:stop_node(N2),
- test_server:stop_node(N3),
+ peer:stop(P1),
+ peer:stop(P2),
+ peer:stop(P3),
ok.
%% OTP-8273. Bug.
@@ -1607,7 +1587,7 @@ cover_clauses(Config) when is_list(Config) ->
-export([clauses/0]).
clauses() -> ok.
">>,
- File = cc_mod(cover_clauses, Test, Config),
+ _File = cc_mod(cover_clauses, Test, Config),
ok.
%% Take compiler options from beam in cover:compile_beam
@@ -1835,9 +1815,9 @@ local_only(Config) ->
%% Make sure that it is not possible to run cover on
%% slave nodes.
- {ok,Name} = test_server:start_node(?FUNCTION_NAME, slave, []),
+ {ok,Peer,Name} = ?CT_PEER(),
{error,local_only} = cover:start([Name]),
- test_server:stop_node(Name),
+ peer:stop(Peer),
ok.
%% ERL-943; We should not crash on startup when multiple servers race to
@@ -1895,6 +1875,63 @@ gh_4796(Config) ->
ok = file:delete(File),
ok = gh_4796:test().
+%% Test the maybe ... else ... end construct.
+eep49(Config) ->
+ ok = file:set_cwd(proplists:get_value(priv_dir, Config)),
+
+ File = "t.erl",
+ Test = <<"-module(t).
+ -feature(enable,maybe_expr).
+ -export([t/0]).
+
+ t() ->
+ t1(), %6
+
+ {a,b} = t2({ok,a}, {ok,b}), %8
+ error = t2({ok,a}, error), %9
+ whatever = t2(whatever, thing), %10
+
+ {a,b} = t3({ok,a}, {ok,b}), %12
+ error = t3({ok,a}, {error,wrong}), %13
+ {'EXIT',{{else_clause,whatever},_}} = catch t3(whatever, thing), %14
+
+ ok. %16
+
+ t1() ->
+ maybe %19
+ ok %20
+ end.
+
+ t2(X, Y) ->
+ maybe %24
+ {ok,A} ?= X, %25
+ {ok,B} ?= Y, %26
+ {A,B} %27
+ end.
+
+ t3(X, Y) ->
+ maybe %31
+ {ok,A} ?= X, %32
+ {ok,B} ?= Y, %33
+ {A,B} %34
+ else
+ {error,_} ->
+ error %37
+ end.
+ ">>,
+ ok = file:write_file(File, Test),
+ {ok, t} = cover:compile(File),
+ ok = t:t(),
+ {ok,[{{t,6},1}, {{t,8},1}, {{t,9},1}, {{t,10},1}, {{t,12},1},
+ {{t,13},1}, {{t,14},1}, {{t,16},1},
+ {{t,19},1}, {{t,20},1},
+ {{t,24},3}, {{t,25},3}, {{t,26},2}, {{t,27},1},
+ {{t,31},3}, {{t,32},3}, {{t,33},2}, {{t,34},1}, {{t,37},1}
+ ]} = cover:analyse(t, calls, line),
+ ok = file:delete(File),
+ ok.
+
+
%%--Auxiliary------------------------------------------------------------
analyse_expr(Expr, Config) ->
diff --git a/lib/tools/test/cprof_SUITE.erl b/lib/tools/test/cprof_SUITE.erl
index 8eb7476f57..d27371414a 100644
--- a/lib/tools/test/cprof_SUITE.erl
+++ b/lib/tools/test/cprof_SUITE.erl
@@ -203,9 +203,8 @@ on_load_test(Config) ->
N2 = cprof:pause(),
{Module,0,[]} = cprof:analyse(Module),
M4__4 = M*4 - 4,
- M10_7 = M*10 - 7,
- {?MODULE,M10_7,[{{?MODULE,succ,1},M4__4},
- {{?MODULE,'-fun.succ/1-',1},M4__4},
+ M6_3 = M*6 - 3,
+ {?MODULE,M6_3,[{{?MODULE,succ,1},M4__4},
{{?MODULE,seq_r,4},M},
{{?MODULE,seq,3},M},
{{?MODULE,seq_r,3},1}]}
@@ -234,11 +233,10 @@ modules_test(Config) ->
N = cprof:pause(),
Lr = lists:reverse(L),
M4_4 = M*4 - 4,
- M10_7 = M*10 - 7,
+ M6_3 = M*6 - 3,
M2__1 = M*2 + 1,
{Tot,ModList} = cprof:analyse(),
- {value,{?MODULE,M10_7,[{{?MODULE,succ,1},M4_4},
- {{?MODULE,'-fun.succ/1-',1},M4_4},
+ {value,{?MODULE,M6_3,[{{?MODULE,succ,1},M4_4},
{{?MODULE,seq_r,4},M},
{{?MODULE,seq,3},M},
{{?MODULE,seq_r,3},1}]}} =
diff --git a/lib/tools/test/emacs_SUITE_data/comments b/lib/tools/test/emacs_SUITE_data/comments
index ff974ca295..b16d398643 100644
--- a/lib/tools/test/emacs_SUITE_data/comments
+++ b/lib/tools/test/emacs_SUITE_data/comments
@@ -3,11 +3,11 @@
%%% 3 comment chars: always left indented
%%% 2 comment chars: Context indented
-%%% 1 comment char: Rigth indented
+%%% 1 comment char: Right indented
%%% left
%% context dependent
- % rigth
+ % right
func() ->
%%% left
@@ -15,7 +15,7 @@ func() ->
% right indented
case get(foo) of
undefined ->
- %% Testing indention
+ %% Testing indentation
ok;
%% Catch all
Other ->
diff --git a/lib/tools/test/emacs_SUITE_data/funcs b/lib/tools/test/emacs_SUITE_data/funcs
index 877f982005..820905687d 100644
--- a/lib/tools/test/emacs_SUITE_data/funcs
+++ b/lib/tools/test/emacs_SUITE_data/funcs
@@ -128,7 +128,7 @@ match6(M6A,
funs(1)
when
X ->
- %% Changed fun to one indention level
+ %% Changed fun to one indentation level
%% 'when' and several clause forces a depth of '4'
Var = spawn(fun(X, _)
when X == 2;
diff --git a/lib/tools/test/emacs_SUITE_data/highlight b/lib/tools/test/emacs_SUITE_data/highlight
index 0719f6516a..58d6bd9c0d 100644
--- a/lib/tools/test/emacs_SUITE_data/highlight
+++ b/lib/tools/test/emacs_SUITE_data/highlight
@@ -69,10 +69,10 @@ highlighting(X) % Function definitions should be highlighted
not_a_guard:is_list([]),
%% Other Types
- atom, % not (currently) hightlighted
+ atom, % not (currently) highlighted
234234,
234.43,
- [list, are, not, higlighted],
+ [list, are, not, highlighted],
{nor, is, tuple},
ok.
diff --git a/lib/tools/test/emacs_SUITE_data/icr b/lib/tools/test/emacs_SUITE_data/icr
index 8445c1a74d..ecfe23c5a1 100644
--- a/lib/tools/test/emacs_SUITE_data/icr
+++ b/lib/tools/test/emacs_SUITE_data/icr
@@ -155,3 +155,42 @@ indent_receive() ->
5*43
end,
ok.
+
+indent_maybe(1) ->
+ begin
+ maybe_should_be_indented_as_begin,
+ end,
+ maybe
+ 1 = foo(X),
+ 2 ?= asd(X),
+ line_with_break =
+ foo(X+1),
+ line_with_break ?=
+ foo(X+1)
+ end,
+ ok;
+indent_maybe(1) ->
+ maybe
+ 2 ?= foo(X),
+ 3 ?= bar(Y)
+ else
+ %% else indented as a standard icr (if-case-receive)
+ {error, Z} when Z == 1 ->
+ error1;
+ {error, Z}
+ when Z == 2 ->
+ error2
+ end;
+indent_maybe(3) ->
+ maybe
+ 2 ?= foo(x),
+ maybe
+ nested ?= foo(y)
+ else
+ error ->
+ ok
+ end
+ else
+ error -> ok
+ end.
+
diff --git a/lib/tools/test/emem_SUITE.erl b/lib/tools/test/emem_SUITE.erl
deleted file mode 100644
index 968b360883..0000000000
--- a/lib/tools/test/emem_SUITE.erl
+++ /dev/null
@@ -1,654 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2021. All Rights Reserved.
-%%
-%% Licensed under the Apache License, Version 2.0 (the "License");
-%% you may not use this file except in compliance with the License.
-%% You may obtain a copy of the License at
-%%
-%% http://www.apache.org/licenses/LICENSE-2.0
-%%
-%% Unless required by applicable law or agreed to in writing, software
-%% distributed under the License is distributed on an "AS IS" BASIS,
-%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-%% See the License for the specific language governing permissions and
-%% limitations under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(emem_SUITE).
-
--export([all/0, suite/0,
- init_per_testcase/2, end_per_testcase/2,
- init_per_suite/1, end_per_suite/1,
- receive_and_save_trace/2, send_trace/2]).
-
--export([live_node/1,
- 'sparc_sunos5.8_32b_emt2.0'/1,
- 'pc_win2000_32b_emt2.0'/1,
- 'pc.smp_linux2.2.19pre17_32b_emt2.0'/1,
- 'powerpc_darwin7.7.0_32b_emt2.0'/1,
- 'alpha_osf1v5.1_64b_emt2.0'/1,
- 'sparc_sunos5.8_64b_emt2.0'/1,
- 'sparc_sunos5.8_32b_emt1.0'/1,
- 'pc_win2000_32b_emt1.0'/1,
- 'powerpc_darwin7.7.0_32b_emt1.0'/1,
- 'alpha_osf1v5.1_64b_emt1.0'/1,
- 'sparc_sunos5.8_64b_emt1.0'/1]).
-
--include_lib("kernel/include/file.hrl").
--include_lib("common_test/include/ct.hrl").
-
--define(EMEM_64_32_COMMENT,
- "64 bit trace; this build of emem can only handle 32 bit traces").
-
--record(emem_res, {nodename,
- hostname,
- pid,
- start_time,
- trace_version,
- max_word_size,
- word_size,
- last_values,
- maximum,
- exit_code}).
-
-%%
-%% Exported suite functions
-%%
-
-suite() ->
- [{ct_hooks,[ts_install_cth]},
- {timetrap,{minutes,5}}].
-
-all() ->
- case test_server:is_debug() of
- true -> {skip, "Not run when debug compiled"};
- false -> test_cases()
- end.
-
-
-test_cases() ->
- [live_node, 'sparc_sunos5.8_32b_emt2.0',
- 'pc_win2000_32b_emt2.0',
- 'pc.smp_linux2.2.19pre17_32b_emt2.0',
- 'powerpc_darwin7.7.0_32b_emt2.0',
- 'alpha_osf1v5.1_64b_emt2.0',
- 'sparc_sunos5.8_64b_emt2.0',
- 'sparc_sunos5.8_32b_emt1.0', 'pc_win2000_32b_emt1.0',
- 'powerpc_darwin7.7.0_32b_emt1.0',
- 'alpha_osf1v5.1_64b_emt1.0',
- 'sparc_sunos5.8_64b_emt1.0'].
-
-init_per_testcase(Case, Config) when is_list(Config) ->
- case maybe_skip(Config) of
- {skip, _}=Skip ->
- Skip;
- ok ->
- %% Until emem is completely stable we run these tests in a working
- %% directory with an ignore_core_files file which will make the
- %% search for core files ignore cores generated by this suite.
- ignore_cores:setup(?MODULE, Case, [{testcase, Case}|Config])
- end.
-
-end_per_testcase(_Case, Config) when is_list(Config) ->
- ignore_cores:restore(Config),
- ok.
-
-maybe_skip(Config) ->
- DataDir = proplists:get_value(data_dir, Config),
- case filelib:is_dir(DataDir) of
- false ->
- {skip, "No data directory"};
- true ->
- case proplists:get_value(emem, Config) of
- undefined ->
- {skip, "emem not found"};
- _ ->
- ok
- end
- end.
-
-init_per_suite(Config) when is_list(Config) ->
- BinDir = filename:join([code:lib_dir(tools), "bin"]),
- Target = erlang:system_info(system_architecture),
- Res = (catch begin
- case check_dir(filename:join([BinDir, Target])) of
- not_found -> ok;
- TDir ->
- check_emem(TDir, debug),
- check_emem(TDir, opt)
- end,
- check_emem(BinDir, opt),
- ""
- end),
- Res ++ ignore_cores:init(Config).
-
-end_per_suite(Config) when is_list(Config) ->
- Config1 = lists:keydelete(emem, 1, Config),
- Config2 = lists:keydelete(emem_comment, 1, Config1),
- ignore_cores:fini(Config2).
-
-%%
-%%
-%% Test cases
-%%
-%%
-
-live_node(Config) when is_list(Config) ->
- {ok, EmuFlag, Port} = start_emem(Config),
- Nodename = mk_nodename(Config),
- {ok, Node} = start_node(Nodename, EmuFlag),
- NP = spawn(Node,
- fun () ->
- receive go -> ok end,
- I = spawn(fun () -> ignorer end),
- GC = fun () ->
- GCP = fun (P) ->
- garbage_collect(P)
- end,
- lists:foreach(GCP, processes())
- end,
- Seq = fun () -> I ! lists:seq(1, 1000000) end,
- spawn_link(Seq),
- B1 = <<0:10000000>>,
- spawn_link(Seq),
- B2 = <<0:10000000>>,
- spawn_link(Seq),
- B3 = <<0:10000000>>,
- I ! {B1, B2, B3},
- GC(),
- GC(),
- GC()
- end),
- MRef = erlang:monitor(process, NP),
- NP ! go,
- receive
- {'DOWN', MRef, process, NP, Reason} ->
- spawn(Node, fun () -> halt(17) end),
- normal = Reason
- end,
- Res = get_emem_result(Port),
- {ok, Hostname} = inet:gethostname(),
- ShortHostname = short_hostname(Hostname),
- {true, _} = has_prefix(Nodename, Res#emem_res.nodename),
- ShortHostname = short_hostname(Res#emem_res.hostname),
- Bits = case erlang:system_info(wordsize) of
- 4 -> "32 bits";
- 8 -> "64 bits"
- end,
- Bits = Res#emem_res.word_size,
- "17" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-'sparc_sunos5.8_32b_emt2.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "test_server" = Res#emem_res.nodename,
- "gorbag" = Res#emem_res.hostname,
- "17074" = Res#emem_res.pid,
- "2005-01-14 17:28:37.881980" = Res#emem_res.start_time,
- "2.0" = Res#emem_res.trace_version,
- "32 bits" = Res#emem_res.word_size,
- ["15", "2665739", "8992", "548986", "16131", "539994",
- "4334192", "1", "99", "15", "98",
- "0", "0", "49", "0", "49"] = Res#emem_res.last_values,
- ["5972061", "9662", "7987824", "5",
- "2375680", "3"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-'pc_win2000_32b_emt2.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "test_server" = Res#emem_res.nodename,
- "E-788FCF5191B54" = Res#emem_res.hostname,
- "504" = Res#emem_res.pid,
- "2005-01-24 17:27:28.224000" = Res#emem_res.start_time,
- "2.0" = Res#emem_res.trace_version,
- "32 bits" = Res#emem_res.word_size,
- ["11", "2932575", "8615", "641087", "68924", "632472"]
- = Res#emem_res.last_values,
- ["5434206", "9285"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-'pc.smp_linux2.2.19pre17_32b_emt2.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "test_server" = Res#emem_res.nodename,
- "four-roses" = Res#emem_res.hostname,
- "20689" = Res#emem_res.pid,
- "2005-01-20 13:11:26.143077" = Res#emem_res.start_time,
- "2.0" = Res#emem_res.trace_version,
- "32 bits" = Res#emem_res.word_size,
- ["49", "2901817", "9011", "521610", "10875", "512599",
- "5392096", "2", "120", "10", "118",
- "0", "0", "59", "0", "59"] = Res#emem_res.last_values,
- ["6182918", "9681",
- "9062112", "6",
- "2322432", "3"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-
-'powerpc_darwin7.7.0_32b_emt2.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "test_server" = Res#emem_res.nodename,
- "grima" = Res#emem_res.hostname,
- "13021" = Res#emem_res.pid,
- "2005-01-20 15:08:17.568668" = Res#emem_res.start_time,
- "2.0" = Res#emem_res.trace_version,
- "32 bits" = Res#emem_res.word_size,
- ["9", "2784323", "8641", "531105", "15893", "522464"]
- = Res#emem_res.last_values,
- ["6150376", "9311"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-'alpha_osf1v5.1_64b_emt2.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "test_server" = Res#emem_res.nodename,
- "thorin" = Res#emem_res.hostname,
- "224630" = Res#emem_res.pid,
- "2005-01-20 22:38:01.299632" = Res#emem_res.start_time,
- "2.0" = Res#emem_res.trace_version,
- "64 bits" = Res#emem_res.word_size,
- case Res#emem_res.max_word_size of
- "32 bits" ->
- emem_comment(Config, ?EMEM_64_32_COMMENT);
- "64 bits" ->
- ["22",
- "6591992", "8625", "516785", "14805", "508160",
- "11429184", "5", "127", "254", "122",
- "0", "0", "61", "0", "61"] = Res#emem_res.last_values,
- ["7041775", "9295",
- "11593024", "7",
- "2097152", "3"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config)
- end.
-
-'sparc_sunos5.8_64b_emt2.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "test_server" = Res#emem_res.nodename,
- "gorbag" = Res#emem_res.hostname,
- "10907" = Res#emem_res.pid,
- "2005-01-20 13:48:34.677068" = Res#emem_res.start_time,
- "2.0" = Res#emem_res.trace_version,
- "64 bits" = Res#emem_res.word_size,
- case Res#emem_res.max_word_size of
- "32 bits" ->
- emem_comment(Config, ?EMEM_64_32_COMMENT);
- "64 bits" ->
- ["16",
- "5032887", "8657", "530635", "14316", "521978",
- "8627140", "5", "139", "19", "134",
- "0", "0", "67", "0", "67"] = Res#emem_res.last_values,
- ["11695070", "9324",
- "16360388", "10",
- "4136960", "3"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config)
- end.
-
-'sparc_sunos5.8_32b_emt1.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "" = Res#emem_res.nodename,
- "" = Res#emem_res.hostname,
- "" = Res#emem_res.pid,
- "" = Res#emem_res.start_time,
- "1.0" = Res#emem_res.trace_version,
- "32 bits" = Res#emem_res.word_size,
- ["11", "2558261", "8643", "560610", "15325", "551967"]
- = Res#emem_res.last_values,
- ["2791121", "9317"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-'pc_win2000_32b_emt1.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "" = Res#emem_res.nodename,
- "" = Res#emem_res.hostname,
- "" = Res#emem_res.pid,
- "" = Res#emem_res.start_time,
- "1.0" = Res#emem_res.trace_version,
- "32 bits" = Res#emem_res.word_size,
- ["6", "2965248", "8614", "640897", "68903", "632283"]
- = Res#emem_res.last_values,
- ["3147090", "9283"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-
-'powerpc_darwin7.7.0_32b_emt1.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "" = Res#emem_res.nodename,
- "" = Res#emem_res.hostname,
- "" = Res#emem_res.pid,
- "" = Res#emem_res.start_time,
- "1.0" = Res#emem_res.trace_version,
- "32 bits" = Res#emem_res.word_size,
- ["8", "2852991", "8608", "529662", "15875", "521054"]
- = Res#emem_res.last_values,
- ["3173335", "9278"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config).
-
-'alpha_osf1v5.1_64b_emt1.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "" = Res#emem_res.nodename,
- "" = Res#emem_res.hostname,
- "" = Res#emem_res.pid,
- "" = Res#emem_res.start_time,
- "1.0" = Res#emem_res.trace_version,
- "64 bits" = Res#emem_res.word_size,
- case Res#emem_res.max_word_size of
- "32 bits" ->
- emem_comment(Config, ?EMEM_64_32_COMMENT);
- "64 bits" ->
- ["22",
- "6820094", "8612", "515518", "14812", "506906"]
- = Res#emem_res.last_values,
- ["7292413", "9282"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config)
- end.
-
-'sparc_sunos5.8_64b_emt1.0'(Config) when is_list(Config) ->
- Res = run_emem_on_casefile(Config),
- "" = Res#emem_res.nodename,
- "" = Res#emem_res.hostname,
- "" = Res#emem_res.pid,
- "" = Res#emem_res.start_time,
- "1.0" = Res#emem_res.trace_version,
- "64 bits" = Res#emem_res.word_size,
- case Res#emem_res.max_word_size of
- "32 bits" ->
- emem_comment(Config, ?EMEM_64_32_COMMENT);
- "64 bits" ->
- ["15",
- "4965746", "8234", "543940", "14443", "535706"]
- = Res#emem_res.last_values,
- ["11697645", "8908"] = Res#emem_res.maximum,
- "0" = Res#emem_res.exit_code,
- emem_comment(Config)
- end.
-
-%%
-%%
-%% Auxiliary functions
-%%
-%%
-
-receive_and_save_trace(PortNumber, FileName) when is_integer(PortNumber),
- is_list(FileName) ->
- {ok, F} = file:open(FileName, [write, compressed]),
- {ok, LS} = gen_tcp:listen(PortNumber, [inet, {reuseaddr,true}, binary]),
- {ok, S} = gen_tcp:accept(LS),
- gen_tcp:close(LS),
- receive_loop(S,F).
-
-receive_loop(Socket, File) ->
- receive
- {tcp, Socket, Data} ->
- ok = file:write(File, Data),
- receive_loop(Socket, File);
- {tcp_closed, Socket} ->
- file:close(File),
- ok;
- {tcp_error, Socket, Reason} ->
- file:close(File),
- {error, Reason}
- end.
-
-send_trace({Host, PortNumber}, FileName) when is_list(Host),
- is_integer(PortNumber),
- is_list(FileName) ->
- {ok, F} = file:open(FileName, [read, compressed]),
- {ok, S} = gen_tcp:connect(Host, PortNumber, [inet,{packet, 0}]),
- send_loop(S, F);
-send_trace(EmuFlag, FileName) when is_list(EmuFlag),
- is_list(FileName) ->
- ["+Mit", IpAddrStr, PortNoStr] = string:tokens(EmuFlag, " :"),
- send_trace({IpAddrStr, list_to_integer(PortNoStr)}, FileName).
-
-send_loop(Socket, File) ->
- case file:read(File, 128) of
- {ok, Data} ->
- case gen_tcp:send(Socket, Data) of
- ok -> send_loop(Socket, File);
- Error ->
- gen_tcp:close(Socket),
- file:close(File),
- Error
- end;
- eof ->
- gen_tcp:close(Socket),
- file:close(File),
- ok;
- Error ->
- gen_tcp:close(Socket),
- file:close(File),
- Error
- end.
-
-check_emem(Dir, Type) when is_atom(Type) ->
- ExeSuffix = case os:type() of
- {win32, _} -> ".exe";
- _ -> ""
- end,
- TypeSuffix = case Type of
- opt -> "";
- _ -> "." ++ atom_to_list(Type)
- end,
- Emem = "emem" ++ TypeSuffix ++ ExeSuffix,
- case check_file(filename:join([Dir, Emem])) of
- not_found -> ok;
- File ->
- Comment = case Type of
- opt -> "";
- _ -> "[emem " ++ atom_to_list(Type) ++ " compiled]"
- end,
- throw([{emem, File}, {emem_comment, Comment}])
- end.
-
-check_dir(DirName) ->
- case file:read_file_info(DirName) of
- {ok, #file_info {type = directory, access = A}} when A == read;
- A == read_write ->
- DirName;
- _ ->
- not_found
- end.
-
-check_file(FileName) ->
- case file:read_file_info(FileName) of
- {ok, #file_info {type = regular, access = A}} when A == read;
- A == read_write ->
- FileName;
- _ ->
- not_found
- end.
-
-emem_comment(Config) when is_list(Config) ->
- emem_comment(Config, "").
-
-emem_comment(Config, ExtraComment)
- when is_list(Config), is_list(ExtraComment) ->
- case {proplists:get_value(emem_comment, Config), ExtraComment} of
- {"", ""} -> ok;
- {"", XC} -> {comment, XC};
- {EmemC, ""} -> {comment, EmemC};
- {EmemC, XC} -> {comment, EmemC ++ " " ++ XC}
- end.
-
-run_emem_on_casefile(Config) ->
- CaseName = atom_to_list(proplists:get_value(testcase, Config)),
- File = filename:join([proplists:get_value(data_dir, Config), CaseName ++ ".gz"]),
- case check_file(File) of
- not_found ->
- ct:fail({error, {filenotfound, File}});
- _ ->
- ok
- end,
- {ok, EmuFlag, Port} = start_emem(Config),
- Parent = self(),
- Ref = make_ref(),
- spawn_link(fun () ->
- SRes = send_trace(EmuFlag, File),
- Parent ! {Ref, SRes}
- end),
- Res = get_emem_result(Port),
- receive
- {Ref, ok} ->
- ok;
- {Ref, SendError} ->
- io:format("Send result: ~p~n", [SendError])
- end,
- Res.
-
-get_emem_result(Port) ->
- {Res, LV} = get_emem_result(Port, {#emem_res{}, []}),
- Res#emem_res{last_values = string:tokens(LV, " ")}.
-
-get_emem_result(Port, {_EmemRes, _LastValues} = Res) ->
- case get_emem_line(Port) of
- eof ->
- Res;
- Line ->
- get_emem_result(Port, parse_emem_line(Line, Res))
- end.
-
-parse_emem_main_header_footer_line(Line, {ER, LV} = Res) ->
-
- %% Header
- case has_prefix("> Nodename:", Line) of
- {true, NN} ->
- throw({ER#emem_res{nodename = strip(NN)}, LV});
- false -> ok
- end,
- case has_prefix("> Hostname:", Line) of
- {true, HN} ->
- throw({ER#emem_res{hostname = strip(HN)}, LV});
- false -> ok
- end,
- case has_prefix("> Pid:", Line) of
- {true, P} ->
- throw({ER#emem_res{pid = strip(P)}, LV});
- false -> ok
- end,
- case has_prefix("> Start time (UTC):", Line) of
- {true, ST} ->
- throw({ER#emem_res{start_time = strip(ST)}, LV});
- false -> ok
- end,
- case has_prefix("> Actual trace version:", Line) of
- {true, TV} ->
- throw({ER#emem_res{trace_version = strip(TV)}, LV});
- false -> ok
- end,
- case has_prefix("> Maximum trace word size:", Line) of
- {true, MWS} ->
- throw({ER#emem_res{max_word_size = strip(MWS)}, LV});
- false -> ok
- end,
- case has_prefix("> Actual trace word size:", Line) of
- {true, WS} ->
- throw({ER#emem_res{word_size = strip(WS)}, LV});
- false -> ok
- end,
-
- %% Footer
- case has_prefix("> Maximum:", Line) of
- {true, M} ->
- throw({ER#emem_res{maximum = string:tokens(M," ")}, LV});
- false -> ok
- end,
- case has_prefix("> Emulator exited with code:", Line) of
- {true, EC} ->
- throw({ER#emem_res{exit_code = strip(EC)}, LV});
- false -> ok
- end,
- Res.
-
-parse_emem_header_line(_Line, {_ER, _LV} = Res) ->
- Res.
-
-parse_emem_value_line(Line, {EmemRes, _OldLastValues}) ->
- {EmemRes, Line}.
-
-parse_emem_line("", Res) ->
- Res;
-parse_emem_line(Line, Res) ->
- [Prefix | _] = Line,
- case Prefix of
- $> -> catch parse_emem_main_header_footer_line(Line, Res);
- $| -> catch parse_emem_header_line(Line, Res);
- _ -> catch parse_emem_value_line(Line, Res)
- end.
-
-start_emem(Config) when is_list(Config) ->
- Emem = proplists:get_value(emem, Config),
- Cd = case ignore_cores:dir(Config) of
- false -> [];
- Dir -> [{cd, Dir}]
- end,
- case open_port({spawn, Emem ++ " -t -n -o -i 1"},
- Cd ++ [{line, 1024}, eof]) of
- Port when is_port(Port) -> {ok, read_emu_flag(Port), Port};
- Error -> ct:fail(Error)
- end.
-
-read_emu_flag(Port) ->
- Line = case get_emem_line(Port) of
- eof -> ct:fail(unexpected_end_of_file);
- L -> L
- end,
- case has_prefix("> Emulator command line argument:", Line) of
- {true, EmuFlag} -> EmuFlag;
- false -> read_emu_flag(Port)
- end.
-
-get_emem_line(Port, Acc) ->
- receive
- {Port, {data, {eol, Data}}} ->
- Res = case Acc of
- [] -> Data;
- _ -> lists:flatten([Acc|Data])
- end,
- io:format("~s", [Res]),
- Res;
- {Port, {data, {noeol, Data}}} ->
- get_emem_line(Port, [Acc|Data]);
- {Port, eof} ->
- port_close(Port),
- eof
- end.
-
-get_emem_line(Port) ->
- get_emem_line(Port, []).
-
-short_hostname([]) ->
- [];
-short_hostname([$.|_]) ->
- [];
-short_hostname([C|Cs]) ->
- [C | short_hostname(Cs)].
-
-has_prefix([], List) when is_list(List) ->
- {true, List};
-has_prefix([P|Xs], [P|Ys]) ->
- has_prefix(Xs, Ys);
-has_prefix(_, _) ->
- false.
-
-strip(Str) -> string:strip(Str).
-
-mk_nodename(Config) ->
- Us = erlang:monotonic_time(),
- atom_to_list(?MODULE)
- ++ "-" ++ atom_to_list(proplists:get_value(testcase, Config))
- ++ integer_to_list(Us).
-
-start_node(Name, Args) ->
- Pa = filename:dirname(code:which(?MODULE)),
- test_server:start_node(Name, peer, [{args, Args ++ " -pa " ++ Pa}]).
diff --git a/lib/tools/test/eprof_SUITE_data/eprof_suite_test.erl b/lib/tools/test/eprof_SUITE_data/eprof_suite_test.erl
index 4e0c4d3118..89eb81f7cf 100644
--- a/lib/tools/test/eprof_SUITE_data/eprof_suite_test.erl
+++ b/lib/tools/test/eprof_SUITE_data/eprof_suite_test.erl
@@ -22,10 +22,10 @@
%%% This module implements a priority queue as defined in
%%% "Priority Queues and the STL" by Mark Nelson in Dr.Dobb's Journal, Jan 1996
%%% see http://web2.airmail.net/markn/articles/pq_stl/priority.htm for more
-%%% information. (A heap implementation is planned aswell)
+%%% information. (A heap implementation is planned as well)
%%%----------------------------------------------------------------------
%%% The items of the queue is kept priority sorted, and because of that,
-%%% a push() operation costs more than a pop() operation (wich only
+%%% a push() operation costs more than a pop() operation (which only
%%% needs to return the top item of the queue(read: list)).
%%%----------------------------------------------------------------------
%%% The priority queue can be deceptively nice to use when creating for
diff --git a/lib/tools/test/instrument_SUITE.erl b/lib/tools/test/instrument_SUITE.erl
index 755739c94e..616bc5a895 100644
--- a/lib/tools/test/instrument_SUITE.erl
+++ b/lib/tools/test/instrument_SUITE.erl
@@ -73,17 +73,17 @@ allocations_test(Args, Plain, PerAlloc) ->
end).
allocations_enabled(Config) when is_list(Config) ->
- allocations_test("+Meamax +Muatags true",
+ allocations_test(["+Meamax", "+Muatags", "true"],
fun verify_allocations_enabled/1,
fun verify_allocations_enabled/2).
allocations_disabled(Config) when is_list(Config) ->
- allocations_test("+Meamax +Muatags false",
+ allocations_test(["+Meamax", "+Muatags", "false"],
fun verify_allocations_disabled/1,
fun verify_allocations_disabled/2).
allocations_ramv(Config) when is_list(Config) ->
- allocations_test("+Meamax +Muatags true +Muramv true",
+ allocations_test(["+Meamax", "+Muatags","true", "+Muramv","true"],
fun verify_allocations_enabled/1,
fun verify_allocations_enabled/2).
@@ -165,12 +165,12 @@ carriers_test(Args, Plain, PerAlloc) ->
end).
carriers_enabled(Config) when is_list(Config) ->
- carriers_test("+Meamax",
+ carriers_test(["+Meamax"],
fun verify_carriers_enabled/1,
fun verify_carriers_enabled/2).
carriers_disabled(Config) when is_list(Config) ->
- carriers_test("+Meamin",
+ carriers_test(["+Meamin"],
fun verify_carriers_disabled/1,
fun verify_carriers_disabled/2).
@@ -300,8 +300,8 @@ run_test(Args0, Test) ->
%%
%% We also set the abandon carrier threshold to 70% to provoke more
%% activity in the carrier pool.
- Args = Args0 ++ " +MBsbct 1 +Muacul 70",
- Node = start_slave(Args),
+ Args = Args0 ++ ["+MBsbct", "1", "+Muacul", "70"],
+ {ok, Peer, Node} = ?CT_PEER(Args),
ok = rpc:call(Node, ?MODULE, generate_test_blocks, []),
ok = Test(Node),
@@ -309,26 +309,7 @@ run_test(Args0, Test) ->
ok = rpc:call(Node, ?MODULE, churn_memory, []),
ok = Test(Node),
- true = test_server:stop_node(Node).
-
-start_slave(Args) ->
- MicroSecs = erlang:monotonic_time(),
- Name = "instr" ++ integer_to_list(MicroSecs),
- Pa = filename:dirname(code:which(?MODULE)),
-
- %% We pass arguments through ZFLAGS as the nightly tests rotate
- %% +Meamax/+Meamin which breaks the _enabled and _disabled tests unless
- %% overridden.
- ZFlags = os:getenv("ERL_ZFLAGS", ""),
- {ok, Node} = try
- os:putenv("ERL_ZFLAGS", ZFlags ++ [" " | Args]),
- test_server:start_node(list_to_atom(Name),
- slave,
- [{args, "-pa " ++ Pa}])
- after
- os:putenv("ERL_ZFLAGS", ZFlags)
- end,
- Node.
+ peer:stop(Peer).
generate_test_blocks() ->
Runner = self(),
diff --git a/lib/tools/test/make_SUITE.erl b/lib/tools/test/make_SUITE.erl
index 02da4f4ace..8d8e5d7559 100644
--- a/lib/tools/test/make_SUITE.erl
+++ b/lib/tools/test/make_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2017. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -58,16 +58,6 @@ end_per_group(_GroupName, Config) ->
init_per_testcase(_,Config) ->
Config.
-end_per_testcase(netload,_Config) ->
- %% Stop slave - in case of failure
- Nodes = nodes(),
- case [N || N <- Nodes,
- "make_SUITE_netload" == hd(string:lexemes(atom_to_list(N),"@"))] of
- [Node] ->
- ct_slave:stop(Node);
- _ ->
- ok
- end;
end_per_testcase(_,_Config) ->
ok.
@@ -114,12 +104,12 @@ netload(Config) ->
code:purge(test1),
code:delete(test1),
false = code:is_loaded(test1),
- {ok,Node} = ct_slave:start(make_SUITE_netload),
+ {ok,Peer,Node} = ?CT_PEER(),
up_to_date = make:files([test1], [netload]),
timer:sleep(1000), % async, so give some time
{file,F} = code:is_loaded(test1),
{file,F} = rpc:call(Node,code,is_loaded,[test1]),
- ct_slave:stop(Node),
+ peer:stop(Peer),
file:set_cwd(Current),
ensure_no_messages(),
ok.
diff --git a/lib/tools/test/tools.spec.win b/lib/tools/test/tools.spec.win
index b43d542ff1..93d5930472 100644
--- a/lib/tools/test/tools.spec.win
+++ b/lib/tools/test/tools.spec.win
@@ -1,2 +1 @@
{topcase, {dir, "../tools_test"}}.
-{skip, {emem_SUITE, "Not on windows, yet. FIXME!!!"}}.
diff --git a/lib/tools/test/xref_SUITE.erl b/lib/tools/test/xref_SUITE.erl
index 75ad7a6ff1..3824b54b52 100644
--- a/lib/tools/test/xref_SUITE.erl
+++ b/lib/tools/test/xref_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1679,7 +1679,7 @@ fun_mfa(Conf) when is_list(Conf) ->
ok = file:delete(Beam),
ok.
-%% fun M:F/A with varibles.
+%% fun M:F/A with variables.
fun_mfa_vars(Conf) when is_list(Conf) ->
Dir = ?copydir,
File = fname(Dir, "fun_mfa_vars.erl"),
diff --git a/lib/wx/Makefile b/lib/wx/Makefile
index c73baa9f6e..f471824a14 100644
--- a/lib/wx/Makefile
+++ b/lib/wx/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2021. All Rights Reserved.
+# Copyright Ericsson AB 2008-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -19,12 +19,11 @@
#
include ./vsn.mk
+include ./config.mk
ifdef TERTIARY_BOOTSTRAP
- INSIDE_ERLSRC = true
SUBDIRS = src
else # Normal build
- include ./config.mk
SUBDIRS = src
ifeq ($(CAN_BUILD_DRIVER), true)
SUBDIRS += c_src
@@ -41,4 +40,6 @@ SUB_DIRECTORIES=$(SUBDIRS)
include $(ERL_TOP)/make/otp_subdir.mk
+TEST_NEEDS_RELEASE=true
+
include $(ERL_TOP)/make/app_targets.mk
diff --git a/lib/wx/api_gen/README b/lib/wx/api_gen/README
index 394469030c..364dbdd9f2 100644
--- a/lib/wx/api_gen/README
+++ b/lib/wx/api_gen/README
@@ -15,7 +15,7 @@ CONFIGURATION:
Adding/changing stuff/classes should be done by updating wxapi.conf
and running make. Sometimes the code generator will require changes,
- I havn't thought of everything yet.
+ I haven't thought of everything yet.
RUNNING:
I use the following alias wxgen='make GL_DIR=/home/dgud/opengl WX_DIR=/home/dgud/src/wxWidgets'
diff --git a/lib/wx/api_gen/apidiff.escript b/lib/wx/api_gen/apidiff.escript
index 952c5453de..61328e6e3e 100644
--- a/lib/wx/api_gen/apidiff.escript
+++ b/lib/wx/api_gen/apidiff.escript
@@ -207,7 +207,7 @@ write([{#f{c=wxShowEvent,f=getShow},_}|Rest], P, K) ->
write([{#f{c=wxSingleChoiceDialog,f=singleChoiceDialog, a=[]},_}|Rest], P, K) ->
write(Rest, P, K+1);
write([{#f{c=wxSizer,f=recalcSizes},_}|Rest], P, K) ->
- io:format("Removed wxSizer:recalcSizer() was an wxWidgets internal function now deprected~n", []),
+ io:format("Removed wxSizer:recalcSizer() was an wxWidgets internal function now deprecated~n", []),
write(Rest, P, K+1);
write([{#f{c=wxSizerItem,f=setWindow},_}|Rest], P, K) ->
io:format("Removed depr wxSizerItem:setWindow() use assignWindow~n", []),
diff --git a/lib/wx/api_gen/gl_gen_erl.erl b/lib/wx/api_gen/gl_gen_erl.erl
index fa5ce4a91f..61a0c98dec 100644
--- a/lib/wx/api_gen/gl_gen_erl.erl
+++ b/lib/wx/api_gen/gl_gen_erl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -149,7 +149,7 @@ glu_api(Fs) ->
w("%% @doc General purpose polygon triangulation.~n",[]),
w("%% The first argument is the normal and the second a list of~n"
- "%% vertex positions. Returned is a list of indecies of the vertices~n"
+ "%% vertex positions. Returned is a list of indices of the vertices~n"
"%% and a binary (64bit native float) containing an array of~n"
"%% vertex positions, it starts with the vertices in Vs and~n"
"%% may contain newly created vertices in the end.~n", []),
diff --git a/lib/wx/api_gen/wx_doxygen.conf b/lib/wx/api_gen/wx_doxygen.conf
index b50e1b8af3..74041c819a 100644
--- a/lib/wx/api_gen/wx_doxygen.conf
+++ b/lib/wx/api_gen/wx_doxygen.conf
@@ -80,7 +80,7 @@ ALIASES += beginFlagTable="<div>"
ALIASES += flag{1}="</div>\li <span class='flag'>\1</span>:<div class='flagDesc'>"
ALIASES += endFlagTable="</div>\n"
-# apperance
+# appearance
ALIASES += appearance{1}="\htmlonly \1 \endhtmlonly"
ALIASES += genericAppearance{1}="\htmlonly \1 \endhtmlonly"
diff --git a/lib/wx/api_gen/wx_extra/added_func.h b/lib/wx/api_gen/wx_extra/added_func.h
index 654cc8b430..d3d8527976 100644
--- a/lib/wx/api_gen/wx_extra/added_func.h
+++ b/lib/wx/api_gen/wx_extra/added_func.h
@@ -28,7 +28,7 @@ class WXDLLIMPEXP_ADV wxTreeCtrlBase : public wxControl
static bool IsTreeItemIdOk(wxTreeItemId id);
};
-// The generater needs constructors (is this still valid?)
+// The generator needs constructors (is this still valid?)
class WXDLLIMPEXP_ADV wxGridCellBoolRenderer : public wxGridCellRenderer
{
public:
@@ -49,7 +49,7 @@ class wxMenuBar {
static bool GetAutoWindowMenu() { return s_macAutoWindowMenu ; }
};
-// Deprectated functions in 3.1
+// Deprecated functions in 3.1
class wxWindow {
public:
diff --git a/lib/wx/api_gen/wx_extra/wxEvtHandler.erl b/lib/wx/api_gen/wx_extra/wxEvtHandler.erl
index 8d0d97e8f0..628e22aa9e 100644
--- a/lib/wx/api_gen/wx_extra/wxEvtHandler.erl
+++ b/lib/wx/api_gen/wx_extra/wxEvtHandler.erl
@@ -13,10 +13,10 @@
%% (in another process) to handle the event. The callback should be of
%% arity 2. fun(EventRecord::wx(), EventObject::wxObject()).
%%
-%% Beware that the callback will be in executed in new process each time.
+%% Beware that the callback will be executed in a new process each time.
%%
%% <a href="http://www.wxwidgets.org/manuals/stable/wx_wxevthandler.html">
-%% The orginal documentation</a>.
+%% The original documentation</a>.
%%
%%
-module(wxEvtHandler).
@@ -51,8 +51,9 @@ connect(This, EventType) ->
%% {skip, boolean()}, If skip is true further event_handlers will be called.
%% This is not used if the 'callback' option is used.
%% Default false.
+%% callback Use `wx_object' callback `handle_sync_event/3'.
%% {callback, function()} Use a callback fun(EventRecord::wx(), EventObject::wxObject())
-%% to process the event. Default not specfied i.e. a message will
+%% to process the event. Default not specified i.e. a message will
%% be delivered to the process calling this function.
%% {userData, term()} An erlang term that will be sent with the event. Default: [].
-spec connect(This::wxEvtHandler(), EventType::wxEventType(), [Option]) -> 'ok' when
diff --git a/lib/wx/api_gen/wx_extra/wxe_evth.h b/lib/wx/api_gen/wx_extra/wxe_evth.h
index 2d4d7276a8..7b9b189381 100644
--- a/lib/wx/api_gen/wx_extra/wxe_evth.h
+++ b/lib/wx/api_gen/wx_extra/wxe_evth.h
@@ -55,7 +55,7 @@ class wxeEvtHandler : public wxObject
callback: @verbatim {callback,function()} @endverbatim
Use a callback @verbatim fun(EventRecord::wx(),EventObject::wxObject()) @endverbatim
- to process the event. Default not specfied i.e. a message will
+ to process the event. Default not specified i.e. a message will
be delivered to the process calling this function.
userData: @verbatim {userData,term()} @endverbatim
diff --git a/lib/wx/api_gen/wx_gen.erl b/lib/wx/api_gen/wx_gen.erl
index 3fabcd9e2a..477e09d318 100644
--- a/lib/wx/api_gen/wx_gen.erl
+++ b/lib/wx/api_gen/wx_gen.erl
@@ -649,7 +649,7 @@ parse_param(#xmlElement{name=declname,content=[C]},_Opts,T) ->
parse_param(#xmlElement{name=defval,content=[#xmlText{value=Def}]},_Opts,T) ->
T#param{def=string:strip(Def)};
parse_param(#xmlElement{name=defval,content=Other},_Opts,T) ->
- %% For defaults = (modifer wxType *) NULL
+ %% For defaults = (modifier wxType *) NULL
Def0 = foldr(fun(#xmlText{value=V}, Acc) -> V ++ Acc;
(#xmlElement{content=[#xmlText{value=V}]},Acc) ->
V ++ Acc
@@ -1523,7 +1523,7 @@ enum_file(File) ->
parse_enums(Files) ->
DontSearch = ["wxchar","filefn", "platform", "strconv", "filename",
"buffer", "string", "debug", "platinfo"],
- %% Arg need to patch some specials, atleast for wx-2.6
+ %% Arg need to patch some specials, at least for wx-2.6
ExtraSearch = ["layout", "utils", "added__func"],
io:format("~nParse Enums~n~n", []),
parse_enums(Files ++ ExtraSearch,gb_sets:from_list(DontSearch)).
diff --git a/lib/wx/api_gen/wx_gen.hrl b/lib/wx/api_gen/wx_gen.hrl
index 252de3d0c9..c7d1ee8022 100644
--- a/lib/wx/api_gen/wx_gen.hrl
+++ b/lib/wx/api_gen/wx_gen.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@
file = undefined,
options = undefined,
abstract = false,
- id, % Unique integer identifer
+ id, % Unique integer identifier
doc
}).
diff --git a/lib/wx/api_gen/wx_gen_erl.erl b/lib/wx/api_gen/wx_gen_erl.erl
index 28b357f331..6b07689a1e 100644
--- a/lib/wx/api_gen/wx_gen_erl.erl
+++ b/lib/wx/api_gen/wx_gen_erl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1016,7 +1016,8 @@ gen_enums_ints() ->
w("-record(wxMouseState, {x :: integer(), y :: integer(),~n"
" leftDown :: boolean(), middleDown :: boolean(), rightDown :: boolean(), ~n"
" controlDown :: boolean(), shiftDown :: boolean(),~n"
- " altDown :: boolean(), metaDown :: boolean(), cmdDown :: boolean()~n"
+ " altDown :: boolean(), metaDown :: boolean(), cmdDown :: boolean(),~n"
+ " aux1Down :: boolean(), aux2Down :: boolean()~n"
" }).~n", []),
w("-record(wxHtmlLinkInfo, {~n"
" href :: unicode:chardata(), target :: unicode:chardata()~n"
diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf
index 544ea869b7..0badee200a 100644
--- a/lib/wx/api_gen/wxapi.conf
+++ b/lib/wx/api_gen/wxapi.conf
@@ -1473,7 +1473,7 @@
'RightDockable','Row','SafeSet','SetFlag','Show','ToolbarPane',
'Top','TopDockable','Window',
%% Extended func
- %% These are not initilized by default and thus cause crashes
+ %% These are not initialized by default and thus cause crashes
%% {'GetName',
%% [{pre_hook, [{c, "#if 0\n"}]},
%% {post_hook, [{c, "#endif\n if(!This) throw wxe_badarg(0);\n wxString Result = This->name"}]}]},
@@ -1655,17 +1655,19 @@
%%, wxEVT_MAGNIFY % 3.1
]}],
['AltDown','Button','ButtonDClick','ButtonDown','ButtonUp','CmdDown','ControlDown',
- 'Dragging', 'Entering', 'GetButton', 'GetPosition',
+ 'Dragging', 'Entering', 'GetButton', 'GetPosition',
'GetLogicalPosition',
'GetLinesPerAction', 'GetWheelRotation', 'GetWheelDelta', 'GetX', 'GetY',
'IsButton', 'IsPageScroll', 'Leaving',
- 'LeftDClick', 'LeftDown', 'LeftIsDown', 'LeftUp',
- 'MetaDown',
- 'MiddleDClick', 'MiddleDown', 'MiddleIsDown', 'MiddleUp',
- 'Moving',
- 'RightDClick', 'RightDown', 'RightIsDown', 'RightUp',
+ 'LeftDClick', 'LeftDown', 'LeftIsDown', 'LeftUp',
+ 'MetaDown',
+ 'MiddleDClick', 'MiddleDown', 'MiddleIsDown', 'MiddleUp',
+ 'Moving',
+ 'RightDClick', 'RightDown', 'RightIsDown', 'RightUp',
'ShiftDown',
- 'GetWheelAxis'
+ 'GetWheelAxis',
+ 'Aux1DClick', 'Aux1Down', 'Aux1Up',
+ 'Aux2DClick', 'Aux2Down', 'Aux2Up'
]}.
{class, wxSetCursorEvent, wxEvent,
@@ -2236,7 +2238,7 @@
{class, wxTaskBarIcon, wxEvtHandler, [],
[{wxTaskBarIcon, [{where, taylormade}]},'~wxTaskBarIcon',
- %%'CreatePopupMenu', virtual overrided is a callback
+ %%'CreatePopupMenu', virtual overridden is a callback
%% 'IsIconInstalled', 'IsOk', not available on mac
'PopupMenu','RemoveIcon','SetIcon']}.
diff --git a/lib/wx/autoconf/config.guess b/lib/wx/autoconf/config.guess
deleted file mode 100755
index 1972fda8eb..0000000000
--- a/lib/wx/autoconf/config.guess
+++ /dev/null
@@ -1,1700 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright 1992-2021 Free Software Foundation, Inc.
-
-timestamp='2021-01-25'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <https://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program. This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-#
-# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
-#
-# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
-#
-# Please send patches to <config-patches@gnu.org>.
-
-
-me=$(echo "$0" | sed -e 's,.*/,,')
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Options:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright 1992-2021 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-tmp=
-# shellcheck disable=SC2172
-trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
-
-set_cc_for_build() {
- # prevent multiple calls if $tmp is already set
- test "$tmp" && return 0
- : "${TMPDIR=/tmp}"
- # shellcheck disable=SC2039
- { tmp=$( (umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null) && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
- dummy=$tmp/dummy
- case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
- ,,) echo "int x;" > "$dummy.c"
- for driver in cc gcc c89 c99 ; do
- if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
- CC_FOR_BUILD="$driver"
- break
- fi
- done
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
- esac
-}
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if test -f /.attbin/uname ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=$( (uname -m) 2>/dev/null) || UNAME_MACHINE=unknown
-UNAME_RELEASE=$( (uname -r) 2>/dev/null) || UNAME_RELEASE=unknown
-UNAME_SYSTEM=$( (uname -s) 2>/dev/null) || UNAME_SYSTEM=unknown
-UNAME_VERSION=$( (uname -v) 2>/dev/null) || UNAME_VERSION=unknown
-
-case "$UNAME_SYSTEM" in
-Linux|GNU|GNU/*)
- LIBC=unknown
-
- set_cc_for_build
- cat <<-EOF > "$dummy.c"
- #include <features.h>
- #if defined(__UCLIBC__)
- LIBC=uclibc
- #elif defined(__dietlibc__)
- LIBC=dietlibc
- #elif defined(__GLIBC__)
- LIBC=gnu
- #else
- #include <stdarg.h>
- /* First heuristic to detect musl libc. */
- #ifdef __DEFINED_va_list
- LIBC=musl
- #endif
- #endif
- EOF
- eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g')"
-
- # Second heuristic to detect musl libc.
- if [ "$LIBC" = unknown ] &&
- command -v ldd >/dev/null &&
- ldd --version 2>&1 | grep -q ^musl; then
- LIBC=musl
- fi
-
- # If the system lacks a compiler, then just pick glibc.
- # We could probably try harder.
- if [ "$LIBC" = unknown ]; then
- LIBC=gnu
- fi
- ;;
-esac
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in
- *:NetBSD:*:*)
- # NetBSD (nbsd) targets should (where applicable) match one or
- # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- #
- # Note: NetBSD doesn't particularly care about the vendor
- # portion of the name. We always set it to "unknown".
- UNAME_MACHINE_ARCH=$( (uname -p 2>/dev/null || \
- /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
- /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
- echo unknown))
- case "$UNAME_MACHINE_ARCH" in
- aarch64eb) machine=aarch64_be-unknown ;;
- armeb) machine=armeb-unknown ;;
- arm*) machine=arm-unknown ;;
- sh3el) machine=shl-unknown ;;
- sh3eb) machine=sh-unknown ;;
- sh5el) machine=sh5le-unknown ;;
- earmv*)
- arch=$(echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,')
- endian=$(echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p')
- machine="${arch}${endian}"-unknown
- ;;
- *) machine="$UNAME_MACHINE_ARCH"-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently (or will in the future) and ABI.
- case "$UNAME_MACHINE_ARCH" in
- earm*)
- os=netbsdelf
- ;;
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
- set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ELF__
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # Determine ABI tags.
- case "$UNAME_MACHINE_ARCH" in
- earm*)
- expr='s/^earmv[0-9]/-eabi/;s/eb$//'
- abi=$(echo "$UNAME_MACHINE_ARCH" | sed -e "$expr")
- ;;
- esac
- # The OS release
- # Debian GNU/NetBSD machines have a different userland, and
- # thus, need a distinct triplet. However, they do not need
- # kernel version information, so it can be replaced with a
- # suitable tag, in the style of linux-gnu.
- case "$UNAME_VERSION" in
- Debian*)
- release='-gnu'
- ;;
- *)
- release=$(echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2)
- ;;
- esac
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "$machine-${os}${release}${abi-}"
- exit ;;
- *:Bitrig:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/Bitrig.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE"
- exit ;;
- *:OpenBSD:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/OpenBSD.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE"
- exit ;;
- *:LibertyBSD:*:*)
- UNAME_MACHINE_ARCH=$(arch | sed 's/^.*BSD\.//')
- echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE"
- exit ;;
- *:MidnightBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE"
- exit ;;
- *:ekkoBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE"
- exit ;;
- *:SolidBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE"
- exit ;;
- *:OS108:*:*)
- echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE"
- exit ;;
- macppc:MirBSD:*:*)
- echo powerpc-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
- *:MirBSD:*:*)
- echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE"
- exit ;;
- *:Sortix:*:*)
- echo "$UNAME_MACHINE"-unknown-sortix
- exit ;;
- *:Twizzler:*:*)
- echo "$UNAME_MACHINE"-unknown-twizzler
- exit ;;
- *:Redox:*:*)
- echo "$UNAME_MACHINE"-unknown-redox
- exit ;;
- mips:OSF1:*.*)
- echo mips-dec-osf1
- exit ;;
- alpha:OSF1:*:*)
- case $UNAME_RELEASE in
- *4.0)
- UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $3}')
- ;;
- *5.*)
- UNAME_RELEASE=$(/usr/sbin/sizer -v | awk '{print $4}')
- ;;
- esac
- # According to Compaq, /usr/sbin/psrinfo has been available on
- # OSF/1 and Tru64 systems produced since 1995. I hope that
- # covers most systems running today. This code pipes the CPU
- # types through head -n 1, so we only detect the type of CPU 0.
- ALPHA_CPU_TYPE=$(/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1)
- case "$ALPHA_CPU_TYPE" in
- "EV4 (21064)")
- UNAME_MACHINE=alpha ;;
- "EV4.5 (21064)")
- UNAME_MACHINE=alpha ;;
- "LCA4 (21066/21068)")
- UNAME_MACHINE=alpha ;;
- "EV5 (21164)")
- UNAME_MACHINE=alphaev5 ;;
- "EV5.6 (21164A)")
- UNAME_MACHINE=alphaev56 ;;
- "EV5.6 (21164PC)")
- UNAME_MACHINE=alphapca56 ;;
- "EV5.7 (21164PC)")
- UNAME_MACHINE=alphapca57 ;;
- "EV6 (21264)")
- UNAME_MACHINE=alphaev6 ;;
- "EV6.7 (21264A)")
- UNAME_MACHINE=alphaev67 ;;
- "EV6.8CB (21264C)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.8AL (21264B)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.8CX (21264D)")
- UNAME_MACHINE=alphaev68 ;;
- "EV6.9A (21264/EV69A)")
- UNAME_MACHINE=alphaev69 ;;
- "EV7 (21364)")
- UNAME_MACHINE=alphaev7 ;;
- "EV7.9 (21364A)")
- UNAME_MACHINE=alphaev79 ;;
- esac
- # A Pn.n version is a patched version.
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- echo "$UNAME_MACHINE"-dec-osf"$(echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)"
- # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
- exitcode=$?
- trap '' 0
- exit $exitcode ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-amigaos
- exit ;;
- *:[Mm]orph[Oo][Ss]:*:*)
- echo "$UNAME_MACHINE"-unknown-morphos
- exit ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit ;;
- *:z/VM:*:*)
- echo s390-ibm-zvmoe
- exit ;;
- *:OS400:*:*)
- echo powerpc-ibm-os400
- exit ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix"$UNAME_RELEASE"
- exit ;;
- arm*:riscos:*:*|arm*:RISCOS:*:*)
- echo arm-unknown-riscos
- exit ;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit ;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "$( (/bin/universe) 2>/dev/null)" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit ;;
- DRS?6000:unix:4.0:6*)
- echo sparc-icl-nx6
- exit ;;
- DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
- case $(/usr/bin/uname -p) in
- sparc) echo sparc-icl-nx7; exit ;;
- esac ;;
- s390x:SunOS:*:*)
- echo "$UNAME_MACHINE"-ibm-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
- exit ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2"$(echo "$UNAME_RELEASE" | sed -e 's/[^.]*//')"
- exit ;;
- i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
- echo i386-pc-auroraux"$UNAME_RELEASE"
- exit ;;
- i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
- set_cc_for_build
- SUN_ARCH=i386
- # If there is a compiler, see if it is configured for 64-bit objects.
- # Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
- # This test works for both compilers.
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- SUN_ARCH=x86_64
- fi
- fi
- echo "$SUN_ARCH"-pc-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- sun4*:SunOS:*:*)
- case "$(/usr/bin/arch -k)" in
- Series*|S4*)
- UNAME_RELEASE=$(uname -v)
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/')"
- exit ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos"$UNAME_RELEASE"
- exit ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=$( (sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null)
- test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
- case "$(/bin/arch)" in
- sun3)
- echo m68k-sun-sunos"$UNAME_RELEASE"
- ;;
- sun4)
- echo sparc-sun-sunos"$UNAME_RELEASE"
- ;;
- esac
- exit ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos"$UNAME_RELEASE"
- exit ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint"$UNAME_RELEASE"
- exit ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint"$UNAME_RELEASE"
- exit ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint"$UNAME_RELEASE"
- exit ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint"$UNAME_RELEASE"
- exit ;;
- m68k:machten:*:*)
- echo m68k-apple-machten"$UNAME_RELEASE"
- exit ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten"$UNAME_RELEASE"
- exit ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix"$UNAME_RELEASE"
- exit ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix"$UNAME_RELEASE"
- exit ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix"$UNAME_RELEASE"
- exit ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
- dummyarg=$(echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p') &&
- SYSTEM_NAME=$("$dummy" "$dummyarg") &&
- { echo "$SYSTEM_NAME"; exit; }
- echo mips-mips-riscos"$UNAME_RELEASE"
- exit ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit ;;
- Motorola:*:4.3:PL8-*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
- echo powerpc-harris-powermax
- exit ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=$(/usr/bin/uname -p)
- if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
- then
- if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
- test "$TARGET_BINARY_INTERFACE"x = x
- then
- echo m88k-dg-dgux"$UNAME_RELEASE"
- else
- echo m88k-dg-dguxbcs"$UNAME_RELEASE"
- fi
- else
- echo i586-dg-dgux"$UNAME_RELEASE"
- fi
- exit ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix"$(echo "$UNAME_RELEASE"|sed -e 's/-/_/g')"
- exit ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit ;; # Note that: echo "'$(uname -s)'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit ;;
- ia64:AIX:*:*)
- if test -x /usr/bin/oslevel ; then
- IBM_REV=$(/usr/bin/oslevel)
- else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
- fi
- echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV"
- exit ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy")
- then
- echo "$SYSTEM_NAME"
- else
- echo rs6000-ibm-aix3.2.5
- fi
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit ;;
- *:AIX:*:[4567])
- IBM_CPU_ID=$(/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }')
- if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if test -x /usr/bin/lslpp ; then
- IBM_REV=$(/usr/bin/lslpp -Lqc bos.rte.libc |
- awk -F: '{ print $3 }' | sed s/[0-9]*$/0/)
- else
- IBM_REV="$UNAME_VERSION.$UNAME_RELEASE"
- fi
- echo "$IBM_ARCH"-ibm-aix"$IBM_REV"
- exit ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit ;;
- ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
- echo romp-ibm-bsd4.4
- exit ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to
- exit ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
- case "$UNAME_MACHINE" in
- 9000/31?) HP_ARCH=m68000 ;;
- 9000/[34]??) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- if test -x /usr/bin/getconf; then
- sc_cpu_version=$(/usr/bin/getconf SC_CPU_VERSION 2>/dev/null)
- sc_kernel_bits=$(/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null)
- case "$sc_cpu_version" in
- 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
- 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "$sc_kernel_bits" in
- 32) HP_ARCH=hppa2.0n ;;
- 64) HP_ARCH=hppa2.0w ;;
- '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20
- esac ;;
- esac
- fi
- if test "$HP_ARCH" = ""; then
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=$("$dummy")
- test -z "$HP_ARCH" && HP_ARCH=hppa
- fi ;;
- esac
- if test "$HP_ARCH" = hppa2.0w
- then
- set_cc_for_build
-
- # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
- # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler
- # generating 64-bit code. GNU and HP use different nomenclature:
- #
- # $ CC_FOR_BUILD=cc ./config.guess
- # => hppa2.0w-hp-hpux11.23
- # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
- # => hppa64-hp-hpux11.23
-
- if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
- grep -q __LP64__
- then
- HP_ARCH=hppa2.0w
- else
- HP_ARCH=hppa64
- fi
- fi
- echo "$HP_ARCH"-hp-hpux"$HPUX_REV"
- exit ;;
- ia64:HP-UX:*:*)
- HPUX_REV=$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//')
- echo ia64-hp-hpux"$HPUX_REV"
- exit ;;
- 3050*:HI-UX:*:*)
- set_cc_for_build
- sed 's/^ //' << EOF > "$dummy.c"
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=$("$dummy") &&
- { echo "$SYSTEM_NAME"; exit; }
- echo unknown-hitachi-hiuxwe2
- exit ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
- echo hppa1.1-hp-bsd
- exit ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
- echo hppa1.1-hp-osf
- exit ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit ;;
- i*86:OSF1:*:*)
- if test -x /usr/sbin/sysversion ; then
- echo "$UNAME_MACHINE"-unknown-osf1mk
- else
- echo "$UNAME_MACHINE"-unknown-osf1
- fi
- exit ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*[A-Z]90:*:*:*)
- echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- *:UNICOS/mp:*:*)
- echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'
- exit ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=$(uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz)
- FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
- FUJITSU_REL=$(echo "$UNAME_RELEASE" | sed -e 's/ /_/')
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- 5000:UNIX_System_V:4.*:*)
- FUJITSU_SYS=$(uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///')
- FUJITSU_REL=$(echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/')
- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE"
- exit ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
- *:BSD/OS:*:*)
- echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE"
- exit ;;
- arm:FreeBSD:*:*)
- UNAME_PROCESSOR=$(uname -p)
- set_cc_for_build
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabi
- else
- echo "${UNAME_PROCESSOR}"-unknown-freebsd"$(echo ${UNAME_RELEASE}|sed -e 's/[-(].*//')"-gnueabihf
- fi
- exit ;;
- *:FreeBSD:*:*)
- UNAME_PROCESSOR=$(/usr/bin/uname -p)
- case "$UNAME_PROCESSOR" in
- amd64)
- UNAME_PROCESSOR=x86_64 ;;
- i386)
- UNAME_PROCESSOR=i586 ;;
- esac
- echo "$UNAME_PROCESSOR"-unknown-freebsd"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
- exit ;;
- i*:CYGWIN*:*)
- echo "$UNAME_MACHINE"-pc-cygwin
- exit ;;
- *:MINGW64*:*)
- echo "$UNAME_MACHINE"-pc-mingw64
- exit ;;
- *:MINGW*:*)
- echo "$UNAME_MACHINE"-pc-mingw32
- exit ;;
- *:MSYS*:*)
- echo "$UNAME_MACHINE"-pc-msys
- exit ;;
- i*:PW*:*)
- echo "$UNAME_MACHINE"-pc-pw32
- exit ;;
- *:Interix*:*)
- case "$UNAME_MACHINE" in
- x86)
- echo i586-pc-interix"$UNAME_RELEASE"
- exit ;;
- authenticamd | genuineintel | EM64T)
- echo x86_64-unknown-interix"$UNAME_RELEASE"
- exit ;;
- IA64)
- echo ia64-unknown-interix"$UNAME_RELEASE"
- exit ;;
- esac ;;
- i*:UWIN*:*)
- echo "$UNAME_MACHINE"-pc-uwin
- exit ;;
- amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
- echo x86_64-pc-cygwin
- exit ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2"$(echo "$UNAME_RELEASE"|sed -e 's/[^.]*//')"
- exit ;;
- *:GNU:*:*)
- # the GNU system
- echo "$(echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,')-unknown-$LIBC$(echo "$UNAME_RELEASE"|sed -e 's,/.*$,,')"
- exit ;;
- *:GNU/*:*:*)
- # other systems with GNU libc and userland
- echo "$UNAME_MACHINE-unknown-$(echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]")$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')-$LIBC"
- exit ;;
- *:Minix:*:*)
- echo "$UNAME_MACHINE"-unknown-minix
- exit ;;
- aarch64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- aarch64_be:Linux:*:*)
- UNAME_MACHINE=aarch64_be
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- alpha:Linux:*:*)
- case $(sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null) in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep -q ld.so.1
- if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- arc:Linux:*:* | arceb:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- arm*:Linux:*:*)
- set_cc_for_build
- if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_EABI__
- then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- else
- if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep -q __ARM_PCS_VFP
- then
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi
- else
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf
- fi
- fi
- exit ;;
- avr32*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- cris:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
- crisv32:Linux:*:*)
- echo "$UNAME_MACHINE"-axis-linux-"$LIBC"
- exit ;;
- e2k:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- frv:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- hexagon:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- i*86:Linux:*:*)
- echo "$UNAME_MACHINE"-pc-linux-"$LIBC"
- exit ;;
- ia64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- k1om:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- m32r*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- m68*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- mips:Linux:*:* | mips64:Linux:*:*)
- set_cc_for_build
- IS_GLIBC=0
- test x"${LIBC}" = xgnu && IS_GLIBC=1
- sed 's/^ //' << EOF > "$dummy.c"
- #undef CPU
- #undef mips
- #undef mipsel
- #undef mips64
- #undef mips64el
- #if ${IS_GLIBC} && defined(_ABI64)
- LIBCABI=gnuabi64
- #else
- #if ${IS_GLIBC} && defined(_ABIN32)
- LIBCABI=gnuabin32
- #else
- LIBCABI=${LIBC}
- #endif
- #endif
-
- #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
- CPU=mipsisa64r6
- #else
- #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
- CPU=mipsisa32r6
- #else
- #if defined(__mips64)
- CPU=mips64
- #else
- CPU=mips
- #endif
- #endif
- #endif
-
- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
- MIPS_ENDIAN=el
- #else
- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
- MIPS_ENDIAN=
- #else
- MIPS_ENDIAN=
- #endif
- #endif
-EOF
- eval "$($CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI')"
- test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
- ;;
- mips64el:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- openrisc*:Linux:*:*)
- echo or1k-unknown-linux-"$LIBC"
- exit ;;
- or32:Linux:*:* | or1k*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- padre:Linux:*:*)
- echo sparc-unknown-linux-"$LIBC"
- exit ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-"$LIBC"
- exit ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case $(grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2) in
- PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;;
- PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;;
- *) echo hppa-unknown-linux-"$LIBC" ;;
- esac
- exit ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-"$LIBC"
- exit ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-"$LIBC"
- exit ;;
- ppc64le:Linux:*:*)
- echo powerpc64le-unknown-linux-"$LIBC"
- exit ;;
- ppcle:Linux:*:*)
- echo powerpcle-unknown-linux-"$LIBC"
- exit ;;
- riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo "$UNAME_MACHINE"-ibm-linux-"$LIBC"
- exit ;;
- sh64*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- sh*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- tile*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- vax:Linux:*:*)
- echo "$UNAME_MACHINE"-dec-linux-"$LIBC"
- exit ;;
- x86_64:Linux:*:*)
- set_cc_for_build
- LIBCABI=$LIBC
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_X32 >/dev/null
- then
- LIBCABI="$LIBC"x32
- fi
- fi
- echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI"
- exit ;;
- xtensa*:Linux:*:*)
- echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"
- exit ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION"
- exit ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo "$UNAME_MACHINE"-pc-os2-emx
- exit ;;
- i*86:XTS-300:*:STOP)
- echo "$UNAME_MACHINE"-unknown-stop
- exit ;;
- i*86:atheos:*:*)
- echo "$UNAME_MACHINE"-unknown-atheos
- exit ;;
- i*86:syllable:*:*)
- echo "$UNAME_MACHINE"-pc-syllable
- exit ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
- echo i386-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- i*86:*DOS:*:*)
- echo "$UNAME_MACHINE"-pc-msdosdjgpp
- exit ;;
- i*86:*:4.*:*)
- UNAME_REL=$(echo "$UNAME_RELEASE" | sed 's/\/MP$//')
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL"
- else
- echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL"
- fi
- exit ;;
- i*86:*:5:[678]*)
- # UnixWare 7.x, OpenUNIX and OpenServer 6.
- case $(/bin/uname -X | grep "^Machine") in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}"
- exit ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=$(sed -n 's/.*Version //p' </usr/options/cb.name)
- echo "$UNAME_MACHINE"-pc-isc"$UNAME_REL"
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=$( (/bin/uname -X|grep Release|sed -e 's/.*= //'))
- (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL"
- else
- echo "$UNAME_MACHINE"-pc-sysv32
- fi
- exit ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i586.
- # Note: whatever this is, it MUST be the same as what config.sub
- # prints for the "djgpp" host, or else GDB configure will decide that
- # this is a cross-build.
- echo i586-pc-msdosdjgpp
- exit ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4
- fi
- exit ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit ;;
- mc68k:UNIX:SYSTEM5:3.51m)
- echo m68k-convergent-sysv
- exit ;;
- M680?0:D-NIX:5.3:*)
- echo m68k-diab-dnix
- exit ;;
- M68*:*:R3V[5678]*:*)
- test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
- 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4; exit; } ;;
- NCR*:*:4.2:* | MPRAS*:*:4.2:*)
- OS_REL='.3'
- test -r /etc/.relid \
- && OS_REL=.$(sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
- /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
- && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
- echo powerpc-unknown-lynxos"$UNAME_RELEASE"
- exit ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv"$UNAME_RELEASE"
- exit ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=$( (uname -p) 2>/dev/null)
- echo "$UNAME_MACHINE"-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes@openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit ;;
- *:*:*:FTX*)
- # From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit ;;
- i*86:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo "$UNAME_MACHINE"-stratus-vos
- exit ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux"$UNAME_RELEASE"
- exit ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if test -d /usr/nec; then
- echo mips-nec-sysv"$UNAME_RELEASE"
- else
- echo mips-unknown-sysv"$UNAME_RELEASE"
- fi
- exit ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit ;;
- BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
- echo i586-pc-haiku
- exit ;;
- x86_64:Haiku:*:*)
- echo x86_64-unknown-haiku
- exit ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-6:SUPER-UX:*:*)
- echo sx6-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-7:SUPER-UX:*:*)
- echo sx7-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-8:SUPER-UX:*:*)
- echo sx8-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-8R:SUPER-UX:*:*)
- echo sx8r-nec-superux"$UNAME_RELEASE"
- exit ;;
- SX-ACE:SUPER-UX:*:*)
- echo sxace-nec-superux"$UNAME_RELEASE"
- exit ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
- *:Rhapsody:*:*)
- echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE"
- exit ;;
- arm64:Darwin:*:*)
- echo aarch64-apple-darwin"$UNAME_RELEASE"
- exit ;;
- *:Darwin:*:*)
- UNAME_PROCESSOR=$(uname -p)
- case $UNAME_PROCESSOR in
- unknown) UNAME_PROCESSOR=powerpc ;;
- esac
- if command -v xcode-select > /dev/null 2> /dev/null && \
- ! xcode-select --print-path > /dev/null 2> /dev/null ; then
- # Avoid executing cc if there is no toolchain installed as
- # cc will be a stub that puts up a graphical alert
- # prompting the user to install developer tools.
- CC_FOR_BUILD=no_compiler_found
- else
- set_cc_for_build
- fi
- if test "$CC_FOR_BUILD" != no_compiler_found; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- case $UNAME_PROCESSOR in
- i386) UNAME_PROCESSOR=x86_64 ;;
- powerpc) UNAME_PROCESSOR=powerpc64 ;;
- esac
- fi
- # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
- if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
- (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_PPC >/dev/null
- then
- UNAME_PROCESSOR=powerpc
- fi
- elif test "$UNAME_PROCESSOR" = i386 ; then
- # uname -m returns i386 or x86_64
- UNAME_PROCESSOR=$UNAME_MACHINE
- fi
- echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE"
- exit ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- UNAME_PROCESSOR=$(uname -p)
- if test "$UNAME_PROCESSOR" = x86; then
- UNAME_PROCESSOR=i386
- UNAME_MACHINE=pc
- fi
- echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE"
- exit ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit ;;
- NEO-*:NONSTOP_KERNEL:*:*)
- echo neo-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSE-*:NONSTOP_KERNEL:*:*)
- echo nse-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSR-*:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSV-*:NONSTOP_KERNEL:*:*)
- echo nsv-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- NSX-*:NONSTOP_KERNEL:*:*)
- echo nsx-tandem-nsk"$UNAME_RELEASE"
- exit ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit ;;
- DS/*:UNIX_System_V:*:*)
- echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE"
- exit ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- # shellcheck disable=SC2154
- if test "$cputype" = 386; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo "$UNAME_MACHINE"-unknown-plan9
- exit ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit ;;
- SEI:*:*:SEIUX)
- echo mips-sei-seiux"$UNAME_RELEASE"
- exit ;;
- *:DragonFly:*:*)
- echo "$UNAME_MACHINE"-unknown-dragonfly"$(echo "$UNAME_RELEASE"|sed -e 's/[-(].*//')"
- exit ;;
- *:*VMS:*:*)
- UNAME_MACHINE=$( (uname -p) 2>/dev/null)
- case "$UNAME_MACHINE" in
- A*) echo alpha-dec-vms ; exit ;;
- I*) echo ia64-dec-vms ; exit ;;
- V*) echo vax-dec-vms ; exit ;;
- esac ;;
- *:XENIX:*:SysV)
- echo i386-pc-xenix
- exit ;;
- i*86:skyos:*:*)
- echo "$UNAME_MACHINE"-pc-skyos"$(echo "$UNAME_RELEASE" | sed -e 's/ .*$//')"
- exit ;;
- i*86:rdos:*:*)
- echo "$UNAME_MACHINE"-pc-rdos
- exit ;;
- *:AROS:*:*)
- echo "$UNAME_MACHINE"-unknown-aros
- exit ;;
- x86_64:VMkernel:*:*)
- echo "$UNAME_MACHINE"-unknown-esx
- exit ;;
- amd64:Isilon\ OneFS:*:*)
- echo x86_64-unknown-onefs
- exit ;;
- *:Unleashed:*:*)
- echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE"
- exit ;;
-esac
-
-# No uname command or uname output not recognized.
-set_cc_for_build
-cat > "$dummy.c" <<EOF
-#ifdef _SEQUENT_
-#include <sys/types.h>
-#include <sys/utsname.h>
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#include <signal.h>
-#if defined(_SIZE_T_) || defined(SIGLOST)
-#include <sys/utsname.h>
-#endif
-#endif
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=$( (hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null);
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-#endif
-
-#if defined (vax)
-#if !defined (ultrix)
-#include <sys/param.h>
-#if defined (BSD)
-#if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-#else
-#if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#else
- printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#endif
-#else
- printf ("vax-dec-bsd\n"); exit (0);
-#endif
-#else
-#if defined(_SIZE_T_) || defined(SIGLOST)
- struct utsname un;
- uname (&un);
- printf ("vax-dec-ultrix%s\n", un.release); exit (0);
-#else
- printf ("vax-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
-#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
-#if defined(_SIZE_T_) || defined(SIGLOST)
- struct utsname *un;
- uname (&un);
- printf ("mips-dec-ultrix%s\n", un.release); exit (0);
-#else
- printf ("mips-dec-ultrix\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=$($dummy) &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
-
-echo "$0: unable to guess system type" >&2
-
-case "$UNAME_MACHINE:$UNAME_SYSTEM" in
- mips:Linux | mips64:Linux)
- # If we got here on MIPS GNU/Linux, output extra information.
- cat >&2 <<EOF
-
-NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
-the system type. Please install a C compiler and try again.
-EOF
- ;;
-esac
-
-cat >&2 <<EOF
-
-This script (version $timestamp), has failed to recognize the
-operating system you are using. If your script is old, overwrite *all*
-copies of config.guess and config.sub with the latest versions from:
-
- https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
-and
- https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
-EOF
-
-year=$(echo $timestamp | sed 's,-.*,,')
-# shellcheck disable=SC2003
-if test "$(expr "$(date +%Y)" - "$year")" -lt 3 ; then
- cat >&2 <<EOF
-
-If $0 has already been updated, send the following data and any
-information you think might be pertinent to config-patches@gnu.org to
-provide the necessary information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = $( (uname -m) 2>/dev/null || echo unknown)
-uname -r = $( (uname -r) 2>/dev/null || echo unknown)
-uname -s = $( (uname -s) 2>/dev/null || echo unknown)
-uname -v = $( (uname -v) 2>/dev/null || echo unknown)
-
-/usr/bin/uname -p = $( (/usr/bin/uname -p) 2>/dev/null)
-/bin/uname -X = $( (/bin/uname -X) 2>/dev/null)
-
-hostinfo = $( (hostinfo) 2>/dev/null)
-/bin/universe = $( (/bin/universe) 2>/dev/null)
-/usr/bin/arch -k = $( (/usr/bin/arch -k) 2>/dev/null)
-/bin/arch = $( (/bin/arch) 2>/dev/null)
-/usr/bin/oslevel = $( (/usr/bin/oslevel) 2>/dev/null)
-/usr/convex/getsysinfo = $( (/usr/convex/getsysinfo) 2>/dev/null)
-
-UNAME_MACHINE = "$UNAME_MACHINE"
-UNAME_RELEASE = "$UNAME_RELEASE"
-UNAME_SYSTEM = "$UNAME_SYSTEM"
-UNAME_VERSION = "$UNAME_VERSION"
-EOF
-fi
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/lib/wx/autoconf/config.sub b/lib/wx/autoconf/config.sub
deleted file mode 100755
index 63c1f1c8b5..0000000000
--- a/lib/wx/autoconf/config.sub
+++ /dev/null
@@ -1,1860 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright 1992-2021 Free Software Foundation, Inc.
-
-timestamp='2021-01-08'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, see <https://www.gnu.org/licenses/>.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that
-# program. This Exception is an additional permission under section 7
-# of the GNU General Public License, version 3 ("GPLv3").
-
-
-# Please send patches to <config-patches@gnu.org>.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# You can get the latest version of this script from:
-# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=$(echo "$0" | sed -e 's,.*/,,')
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
-
-Canonicalize a configuration name.
-
-Options:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright 1992-2021 Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit ;;
- --version | -v )
- echo "$version" ; exit ;;
- --help | --h* | -h )
- echo "$usage"; exit ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo "$1"
- exit ;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Split fields of configuration type
-# shellcheck disable=SC2162
-IFS="-" read field1 field2 field3 field4 <<EOF
-$1
-EOF
-
-# Separate into logical components for further validation
-case $1 in
- *-*-*-*-*)
- echo Invalid configuration \`"$1"\': more than four components >&2
- exit 1
- ;;
- *-*-*-*)
- basic_machine=$field1-$field2
- basic_os=$field3-$field4
- ;;
- *-*-*)
- # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
- # parts
- maybe_os=$field2-$field3
- case $maybe_os in
- nto-qnx* | linux-* | uclinux-uclibc* \
- | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
- | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
- | storm-chaos* | os2-emx* | rtmk-nova*)
- basic_machine=$field1
- basic_os=$maybe_os
- ;;
- android-linux)
- basic_machine=$field1-unknown
- basic_os=linux-android
- ;;
- *)
- basic_machine=$field1-$field2
- basic_os=$field3
- ;;
- esac
- ;;
- *-*)
- # A lone config we happen to match not fitting any pattern
- case $field1-$field2 in
- decstation-3100)
- basic_machine=mips-dec
- basic_os=
- ;;
- *-*)
- # Second component is usually, but not always the OS
- case $field2 in
- # Prevent following clause from handling this valid os
- sun*os*)
- basic_machine=$field1
- basic_os=$field2
- ;;
- # Manufacturers
- dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
- | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
- | unicom* | ibm* | next | hp | isi* | apollo | altos* \
- | convergent* | ncr* | news | 32* | 3600* | 3100* \
- | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
- | ultra | tti* | harris | dolphin | highlevel | gould \
- | cbm | ns | masscomp | apple | axis | knuth | cray \
- | microblaze* | sim | cisco \
- | oki | wec | wrs | winbond)
- basic_machine=$field1-$field2
- basic_os=
- ;;
- *)
- basic_machine=$field1
- basic_os=$field2
- ;;
- esac
- ;;
- esac
- ;;
- *)
- # Convert single-component short-hands not valid as part of
- # multi-component configurations.
- case $field1 in
- 386bsd)
- basic_machine=i386-pc
- basic_os=bsd
- ;;
- a29khif)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- basic_os=scout
- ;;
- alliant)
- basic_machine=fx80-alliant
- basic_os=
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- basic_os=
- ;;
- am29k)
- basic_machine=a29k-none
- basic_os=bsd
- ;;
- amdahl)
- basic_machine=580-amdahl
- basic_os=sysv
- ;;
- amiga)
- basic_machine=m68k-unknown
- basic_os=
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- basic_os=amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- basic_os=sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- basic_os=sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- basic_os=bsd
- ;;
- aros)
- basic_machine=i386-pc
- basic_os=aros
- ;;
- aux)
- basic_machine=m68k-apple
- basic_os=aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- basic_os=dynix
- ;;
- blackfin)
- basic_machine=bfin-unknown
- basic_os=linux
- ;;
- cegcc)
- basic_machine=arm-unknown
- basic_os=cegcc
- ;;
- convex-c1)
- basic_machine=c1-convex
- basic_os=bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- basic_os=bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- basic_os=bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- basic_os=bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- basic_os=bsd
- ;;
- cray)
- basic_machine=j90-cray
- basic_os=unicos
- ;;
- crds | unos)
- basic_machine=m68k-crds
- basic_os=
- ;;
- da30)
- basic_machine=m68k-da30
- basic_os=
- ;;
- decstation | pmax | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- basic_os=
- ;;
- delta88)
- basic_machine=m88k-motorola
- basic_os=sysv3
- ;;
- dicos)
- basic_machine=i686-pc
- basic_os=dicos
- ;;
- djgpp)
- basic_machine=i586-pc
- basic_os=msdosdjgpp
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- basic_os=ebmon
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- basic_os=ose
- ;;
- gmicro)
- basic_machine=tron-gmicro
- basic_os=sysv
- ;;
- go32)
- basic_machine=i386-pc
- basic_os=go32
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- basic_os=hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- basic_os=xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- basic_os=hms
- ;;
- harris)
- basic_machine=m88k-harris
- basic_os=sysv3
- ;;
- hp300 | hp300hpux)
- basic_machine=m68k-hp
- basic_os=hpux
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- basic_os=bsd
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- basic_os=osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- basic_os=proelf
- ;;
- i386mach)
- basic_machine=i386-mach
- basic_os=mach
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- basic_os=sysv
- ;;
- m68knommu)
- basic_machine=m68k-unknown
- basic_os=linux
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- basic_os=sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- basic_os=sysv
- ;;
- mingw64)
- basic_machine=x86_64-pc
- basic_os=mingw64
- ;;
- mingw32)
- basic_machine=i686-pc
- basic_os=mingw32
- ;;
- mingw32ce)
- basic_machine=arm-unknown
- basic_os=mingw32ce
- ;;
- monitor)
- basic_machine=m68k-rom68k
- basic_os=coff
- ;;
- morphos)
- basic_machine=powerpc-unknown
- basic_os=morphos
- ;;
- moxiebox)
- basic_machine=moxie-unknown
- basic_os=moxiebox
- ;;
- msdos)
- basic_machine=i386-pc
- basic_os=msdos
- ;;
- msys)
- basic_machine=i686-pc
- basic_os=msys
- ;;
- mvs)
- basic_machine=i370-ibm
- basic_os=mvs
- ;;
- nacl)
- basic_machine=le32-unknown
- basic_os=nacl
- ;;
- ncr3000)
- basic_machine=i486-ncr
- basic_os=sysv4
- ;;
- netbsd386)
- basic_machine=i386-pc
- basic_os=netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- basic_os=linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- basic_os=newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- basic_os=newsos
- ;;
- necv70)
- basic_machine=v70-nec
- basic_os=sysv
- ;;
- nh3000)
- basic_machine=m68k-harris
- basic_os=cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- basic_os=cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- basic_os=nindy
- ;;
- mon960)
- basic_machine=i960-intel
- basic_os=mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- basic_os=nonstopux
- ;;
- os400)
- basic_machine=powerpc-ibm
- basic_os=os400
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- basic_os=ose
- ;;
- os68k)
- basic_machine=m68k-none
- basic_os=os68k
- ;;
- paragon)
- basic_machine=i860-intel
- basic_os=osf
- ;;
- parisc)
- basic_machine=hppa-unknown
- basic_os=linux
- ;;
- psp)
- basic_machine=mipsallegrexel-sony
- basic_os=psp
- ;;
- pw32)
- basic_machine=i586-unknown
- basic_os=pw32
- ;;
- rdos | rdos64)
- basic_machine=x86_64-pc
- basic_os=rdos
- ;;
- rdos32)
- basic_machine=i386-pc
- basic_os=rdos
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- basic_os=coff
- ;;
- sa29200)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- sei)
- basic_machine=mips-sei
- basic_os=seiux
- ;;
- sequent)
- basic_machine=i386-sequent
- basic_os=
- ;;
- sps7)
- basic_machine=m68k-bull
- basic_os=sysv2
- ;;
- st2000)
- basic_machine=m68k-tandem
- basic_os=
- ;;
- stratus)
- basic_machine=i860-stratus
- basic_os=sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- basic_os=
- ;;
- sun2os3)
- basic_machine=m68000-sun
- basic_os=sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- basic_os=sunos4
- ;;
- sun3)
- basic_machine=m68k-sun
- basic_os=
- ;;
- sun3os3)
- basic_machine=m68k-sun
- basic_os=sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- basic_os=sunos4
- ;;
- sun4)
- basic_machine=sparc-sun
- basic_os=
- ;;
- sun4os3)
- basic_machine=sparc-sun
- basic_os=sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- basic_os=sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- basic_os=solaris2
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- basic_os=
- ;;
- sv1)
- basic_machine=sv1-cray
- basic_os=unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- basic_os=dynix
- ;;
- t3e)
- basic_machine=alphaev5-cray
- basic_os=unicos
- ;;
- t90)
- basic_machine=t90-cray
- basic_os=unicos
- ;;
- toad1)
- basic_machine=pdp10-xkl
- basic_os=tops20
- ;;
- tpf)
- basic_machine=s390x-ibm
- basic_os=tpf
- ;;
- udi29k)
- basic_machine=a29k-amd
- basic_os=udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- basic_os=sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- basic_os=none
- ;;
- vaxv)
- basic_machine=vax-dec
- basic_os=sysv
- ;;
- vms)
- basic_machine=vax-dec
- basic_os=vms
- ;;
- vsta)
- basic_machine=i386-pc
- basic_os=vsta
- ;;
- vxworks960)
- basic_machine=i960-wrs
- basic_os=vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- basic_os=vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- basic_os=vxworks
- ;;
- xbox)
- basic_machine=i686-pc
- basic_os=mingw32
- ;;
- ymp)
- basic_machine=ymp-cray
- basic_os=unicos
- ;;
- *)
- basic_machine=$1
- basic_os=
- ;;
- esac
- ;;
-esac
-
-# Decode 1-component or ad-hoc basic machines
-case $basic_machine in
- # Here we handle the default manufacturer of certain CPU types. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- w89k)
- cpu=hppa1.1
- vendor=winbond
- ;;
- op50n)
- cpu=hppa1.1
- vendor=oki
- ;;
- op60c)
- cpu=hppa1.1
- vendor=oki
- ;;
- ibm*)
- cpu=i370
- vendor=ibm
- ;;
- orion105)
- cpu=clipper
- vendor=highlevel
- ;;
- mac | mpw | mac-mpw)
- cpu=m68k
- vendor=apple
- ;;
- pmac | pmac-mpw)
- cpu=powerpc
- vendor=apple
- ;;
-
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- cpu=m68000
- vendor=att
- ;;
- 3b*)
- cpu=we32k
- vendor=att
- ;;
- bluegene*)
- cpu=powerpc
- vendor=ibm
- basic_os=cnk
- ;;
- decsystem10* | dec10*)
- cpu=pdp10
- vendor=dec
- basic_os=tops10
- ;;
- decsystem20* | dec20*)
- cpu=pdp10
- vendor=dec
- basic_os=tops20
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- cpu=m68k
- vendor=motorola
- ;;
- dpx2*)
- cpu=m68k
- vendor=bull
- basic_os=sysv3
- ;;
- encore | umax | mmax)
- cpu=ns32k
- vendor=encore
- ;;
- elxsi)
- cpu=elxsi
- vendor=elxsi
- basic_os=${basic_os:-bsd}
- ;;
- fx2800)
- cpu=i860
- vendor=alliant
- ;;
- genix)
- cpu=ns32k
- vendor=ns
- ;;
- h3050r* | hiux*)
- cpu=hppa1.1
- vendor=hitachi
- basic_os=hiuxwe2
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- cpu=m68000
- vendor=hp
- ;;
- hp9k3[2-9][0-9])
- cpu=m68k
- vendor=hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- cpu=hppa1.1
- vendor=hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- cpu=hppa1.0
- vendor=hp
- ;;
- i*86v32)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv32
- ;;
- i*86v4*)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv4
- ;;
- i*86v)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=sysv
- ;;
- i*86sol2)
- cpu=$(echo "$1" | sed -e 's/86.*/86/')
- vendor=pc
- basic_os=solaris2
- ;;
- j90 | j90-cray)
- cpu=j90
- vendor=cray
- basic_os=${basic_os:-unicos}
- ;;
- iris | iris4d)
- cpu=mips
- vendor=sgi
- case $basic_os in
- irix*)
- ;;
- *)
- basic_os=irix4
- ;;
- esac
- ;;
- miniframe)
- cpu=m68000
- vendor=convergent
- ;;
- *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
- cpu=m68k
- vendor=atari
- basic_os=mint
- ;;
- news-3600 | risc-news)
- cpu=mips
- vendor=sony
- basic_os=newsos
- ;;
- next | m*-next)
- cpu=m68k
- vendor=next
- case $basic_os in
- openstep*)
- ;;
- nextstep*)
- ;;
- ns2*)
- basic_os=nextstep2
- ;;
- *)
- basic_os=nextstep3
- ;;
- esac
- ;;
- np1)
- cpu=np1
- vendor=gould
- ;;
- op50n-* | op60c-*)
- cpu=hppa1.1
- vendor=oki
- basic_os=proelf
- ;;
- pa-hitachi)
- cpu=hppa1.1
- vendor=hitachi
- basic_os=hiuxwe2
- ;;
- pbd)
- cpu=sparc
- vendor=tti
- ;;
- pbb)
- cpu=m68k
- vendor=tti
- ;;
- pc532)
- cpu=ns32k
- vendor=pc532
- ;;
- pn)
- cpu=pn
- vendor=gould
- ;;
- power)
- cpu=power
- vendor=ibm
- ;;
- ps2)
- cpu=i386
- vendor=ibm
- ;;
- rm[46]00)
- cpu=mips
- vendor=siemens
- ;;
- rtpc | rtpc-*)
- cpu=romp
- vendor=ibm
- ;;
- sde)
- cpu=mipsisa32
- vendor=sde
- basic_os=${basic_os:-elf}
- ;;
- simso-wrs)
- cpu=sparclite
- vendor=wrs
- basic_os=vxworks
- ;;
- tower | tower-32)
- cpu=m68k
- vendor=ncr
- ;;
- vpp*|vx|vx-*)
- cpu=f301
- vendor=fujitsu
- ;;
- w65)
- cpu=w65
- vendor=wdc
- ;;
- w89k-*)
- cpu=hppa1.1
- vendor=winbond
- basic_os=proelf
- ;;
- none)
- cpu=none
- vendor=none
- ;;
- leon|leon[3-9])
- cpu=sparc
- vendor=$basic_machine
- ;;
- leon-*|leon[3-9]-*)
- cpu=sparc
- vendor=$(echo "$basic_machine" | sed 's/-.*//')
- ;;
-
- *-*)
- # shellcheck disable=SC2162
- IFS="-" read cpu vendor <<EOF
-$basic_machine
-EOF
- ;;
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- cpu=$basic_machine
- vendor=pc
- ;;
- # These rules are duplicated from below for sake of the special case above;
- # i.e. things that normalized to x86 arches should also default to "pc"
- pc98)
- cpu=i386
- vendor=pc
- ;;
- x64 | amd64)
- cpu=x86_64
- vendor=pc
- ;;
- # Recognize the basic CPU types without company name.
- *)
- cpu=$basic_machine
- vendor=unknown
- ;;
-esac
-
-unset -v basic_machine
-
-# Decode basic machines in the full and proper CPU-Company form.
-case $cpu-$vendor in
- # Here we handle the default manufacturer of certain CPU types in canonical form. It is in
- # some cases the only manufacturer, in others, it is the most popular.
- craynv-unknown)
- vendor=cray
- basic_os=${basic_os:-unicosmp}
- ;;
- c90-unknown | c90-cray)
- vendor=cray
- basic_os=${Basic_os:-unicos}
- ;;
- fx80-unknown)
- vendor=alliant
- ;;
- romp-unknown)
- vendor=ibm
- ;;
- mmix-unknown)
- vendor=knuth
- ;;
- microblaze-unknown | microblazeel-unknown)
- vendor=xilinx
- ;;
- rs6000-unknown)
- vendor=ibm
- ;;
- vax-unknown)
- vendor=dec
- ;;
- pdp11-unknown)
- vendor=dec
- ;;
- we32k-unknown)
- vendor=att
- ;;
- cydra-unknown)
- vendor=cydrome
- ;;
- i370-ibm*)
- vendor=ibm
- ;;
- orion-unknown)
- vendor=highlevel
- ;;
- xps-unknown | xps100-unknown)
- cpu=xps100
- vendor=honeywell
- ;;
-
- # Here we normalize CPU types with a missing or matching vendor
- dpx20-unknown | dpx20-bull)
- cpu=rs6000
- vendor=bull
- basic_os=${basic_os:-bosx}
- ;;
-
- # Here we normalize CPU types irrespective of the vendor
- amd64-*)
- cpu=x86_64
- ;;
- blackfin-*)
- cpu=bfin
- basic_os=linux
- ;;
- c54x-*)
- cpu=tic54x
- ;;
- c55x-*)
- cpu=tic55x
- ;;
- c6x-*)
- cpu=tic6x
- ;;
- e500v[12]-*)
- cpu=powerpc
- basic_os=${basic_os}"spe"
- ;;
- mips3*-*)
- cpu=mips64
- ;;
- ms1-*)
- cpu=mt
- ;;
- m68knommu-*)
- cpu=m68k
- basic_os=linux
- ;;
- m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
- cpu=s12z
- ;;
- openrisc-*)
- cpu=or32
- ;;
- parisc-*)
- cpu=hppa
- basic_os=linux
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
- cpu=i586
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
- cpu=i686
- ;;
- pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
- cpu=i686
- ;;
- pentium4-*)
- cpu=i786
- ;;
- pc98-*)
- cpu=i386
- ;;
- ppc-* | ppcbe-*)
- cpu=powerpc
- ;;
- ppcle-* | powerpclittle-*)
- cpu=powerpcle
- ;;
- ppc64-*)
- cpu=powerpc64
- ;;
- ppc64le-* | powerpc64little-*)
- cpu=powerpc64le
- ;;
- sb1-*)
- cpu=mipsisa64sb1
- ;;
- sb1el-*)
- cpu=mipsisa64sb1el
- ;;
- sh5e[lb]-*)
- cpu=$(echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/')
- ;;
- spur-*)
- cpu=spur
- ;;
- strongarm-* | thumb-*)
- cpu=arm
- ;;
- tx39-*)
- cpu=mipstx39
- ;;
- tx39el-*)
- cpu=mipstx39el
- ;;
- x64-*)
- cpu=x86_64
- ;;
- xscale-* | xscalee[bl]-*)
- cpu=$(echo "$cpu" | sed 's/^xscale/arm/')
- ;;
- arm64-*)
- cpu=aarch64
- ;;
-
- # Recognize the canonical CPU Types that limit and/or modify the
- # company names they are paired with.
- cr16-*)
- basic_os=${basic_os:-elf}
- ;;
- crisv32-* | etraxfs*-*)
- cpu=crisv32
- vendor=axis
- ;;
- cris-* | etrax*-*)
- cpu=cris
- vendor=axis
- ;;
- crx-*)
- basic_os=${basic_os:-elf}
- ;;
- neo-tandem)
- cpu=neo
- vendor=tandem
- ;;
- nse-tandem)
- cpu=nse
- vendor=tandem
- ;;
- nsr-tandem)
- cpu=nsr
- vendor=tandem
- ;;
- nsv-tandem)
- cpu=nsv
- vendor=tandem
- ;;
- nsx-tandem)
- cpu=nsx
- vendor=tandem
- ;;
- mipsallegrexel-sony)
- cpu=mipsallegrexel
- vendor=sony
- ;;
- tile*-*)
- basic_os=${basic_os:-linux-gnu}
- ;;
-
- *)
- # Recognize the canonical CPU types that are allowed with any
- # company name.
- case $cpu in
- 1750a | 580 \
- | a29k \
- | aarch64 | aarch64_be \
- | abacus \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
- | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
- | alphapca5[67] | alpha64pca5[67] \
- | am33_2.0 \
- | amdgcn \
- | arc | arceb \
- | arm | arm[lb]e | arme[lb] | armv* \
- | avr | avr32 \
- | asmjs \
- | ba \
- | be32 | be64 \
- | bfin | bpf | bs2000 \
- | c[123]* | c30 | [cjt]90 | c4x \
- | c8051 | clipper | craynv | csky | cydra \
- | d10v | d30v | dlx | dsp16xx \
- | e2k | elxsi | epiphany \
- | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
- | h8300 | h8500 \
- | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | hexagon \
- | i370 | i*86 | i860 | i960 | ia16 | ia64 \
- | ip2k | iq2000 \
- | k1om \
- | le32 | le64 \
- | lm32 \
- | loongarch32 | loongarch64 | loongarchx32 \
- | m32c | m32r | m32rle \
- | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
- | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
- | m88110 | m88k | maxq | mb | mcore | mep | metag \
- | microblaze | microblazeel \
- | mips | mipsbe | mipseb | mipsel | mipsle \
- | mips16 \
- | mips64 | mips64eb | mips64el \
- | mips64octeon | mips64octeonel \
- | mips64orion | mips64orionel \
- | mips64r5900 | mips64r5900el \
- | mips64vr | mips64vrel \
- | mips64vr4100 | mips64vr4100el \
- | mips64vr4300 | mips64vr4300el \
- | mips64vr5000 | mips64vr5000el \
- | mips64vr5900 | mips64vr5900el \
- | mipsisa32 | mipsisa32el \
- | mipsisa32r2 | mipsisa32r2el \
- | mipsisa32r6 | mipsisa32r6el \
- | mipsisa64 | mipsisa64el \
- | mipsisa64r2 | mipsisa64r2el \
- | mipsisa64r6 | mipsisa64r6el \
- | mipsisa64sb1 | mipsisa64sb1el \
- | mipsisa64sr71k | mipsisa64sr71kel \
- | mipsr5900 | mipsr5900el \
- | mipstx39 | mipstx39el \
- | mmix \
- | mn10200 | mn10300 \
- | moxie \
- | mt \
- | msp430 \
- | nds32 | nds32le | nds32be \
- | nfp \
- | nios | nios2 | nios2eb | nios2el \
- | none | np1 | ns16k | ns32k | nvptx \
- | open8 \
- | or1k* \
- | or32 \
- | orion \
- | picochip \
- | pdp10 | pdp11 | pj | pjl | pn | power \
- | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
- | pru \
- | pyramid \
- | riscv | riscv32 | riscv32be | riscv64 | riscv64be \
- | rl78 | romp | rs6000 | rx \
- | s390 | s390x \
- | score \
- | sh | shl \
- | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
- | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
- | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
- | sparclite \
- | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
- | spu \
- | tahoe \
- | thumbv7* \
- | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
- | tron \
- | ubicom32 \
- | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
- | vax \
- | visium \
- | w65 \
- | wasm32 | wasm64 \
- | we32k \
- | x86 | x86_64 | xc16x | xgate | xps100 \
- | xstormy16 | xtensa* \
- | ymp \
- | z8k | z80)
- ;;
-
- *)
- echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
- exit 1
- ;;
- esac
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $vendor in
- digital*)
- vendor=dec
- ;;
- commodore*)
- vendor=cbm
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if test x$basic_os != x
-then
-
-# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
-# set os.
-case $basic_os in
- gnu/linux*)
- kernel=linux
- os=$(echo $basic_os | sed -e 's|gnu/linux|gnu|')
- ;;
- os2-emx)
- kernel=os2
- os=$(echo $basic_os | sed -e 's|os2-emx|emx|')
- ;;
- nto-qnx*)
- kernel=nto
- os=$(echo $basic_os | sed -e 's|nto-qnx|qnx|')
- ;;
- *-*)
- # shellcheck disable=SC2162
- IFS="-" read kernel os <<EOF
-$basic_os
-EOF
- ;;
- # Default OS when just kernel was specified
- nto*)
- kernel=nto
- os=$(echo $basic_os | sed -e 's|nto|qnx|')
- ;;
- linux*)
- kernel=linux
- os=$(echo $basic_os | sed -e 's|linux|gnu|')
- ;;
- *)
- kernel=
- os=$basic_os
- ;;
-esac
-
-# Now, normalize the OS (knowing we just have one component, it's not a kernel,
-# etc.)
-case $os in
- # First match some system type aliases that might get confused
- # with valid system types.
- # solaris* is a basic system type, with this one exception.
- auroraux)
- os=auroraux
- ;;
- bluegene*)
- os=cnk
- ;;
- solaris1 | solaris1.*)
- os=$(echo $os | sed -e 's|solaris1|sunos4|')
- ;;
- solaris)
- os=solaris2
- ;;
- unixware*)
- os=sysv4.2uw
- ;;
- # es1800 is here to avoid being matched by es* (a different OS)
- es1800*)
- os=ose
- ;;
- # Some version numbers need modification
- chorusos*)
- os=chorusos
- ;;
- isc)
- os=isc2.2
- ;;
- sco6)
- os=sco5v6
- ;;
- sco5)
- os=sco3.2v5
- ;;
- sco4)
- os=sco3.2v4
- ;;
- sco3.2.[4-9]*)
- os=$(echo $os | sed -e 's/sco3.2./sco3.2v/')
- ;;
- sco*v* | scout)
- # Don't match below
- ;;
- sco*)
- os=sco3.2v2
- ;;
- psos*)
- os=psos
- ;;
- qnx*)
- os=qnx
- ;;
- hiux*)
- os=hiuxwe2
- ;;
- lynx*178)
- os=lynxos178
- ;;
- lynx*5)
- os=lynxos5
- ;;
- lynxos*)
- # don't get caught up in next wildcard
- ;;
- lynx*)
- os=lynxos
- ;;
- mac[0-9]*)
- os=$(echo "$os" | sed -e 's|mac|macos|')
- ;;
- opened*)
- os=openedition
- ;;
- os400*)
- os=os400
- ;;
- sunos5*)
- os=$(echo "$os" | sed -e 's|sunos5|solaris2|')
- ;;
- sunos6*)
- os=$(echo "$os" | sed -e 's|sunos6|solaris3|')
- ;;
- wince*)
- os=wince
- ;;
- utek*)
- os=bsd
- ;;
- dynix*)
- os=bsd
- ;;
- acis*)
- os=aos
- ;;
- atheos*)
- os=atheos
- ;;
- syllable*)
- os=syllable
- ;;
- 386bsd)
- os=bsd
- ;;
- ctix* | uts*)
- os=sysv
- ;;
- nova*)
- os=rtmk-nova
- ;;
- ns2)
- os=nextstep2
- ;;
- # Preserve the version number of sinix5.
- sinix5.*)
- os=$(echo $os | sed -e 's|sinix|sysv|')
- ;;
- sinix*)
- os=sysv4
- ;;
- tpf*)
- os=tpf
- ;;
- triton*)
- os=sysv3
- ;;
- oss*)
- os=sysv3
- ;;
- svr4*)
- os=sysv4
- ;;
- svr3)
- os=sysv3
- ;;
- sysvr4)
- os=sysv4
- ;;
- ose*)
- os=ose
- ;;
- *mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
- os=mint
- ;;
- dicos*)
- os=dicos
- ;;
- pikeos*)
- # Until real need of OS specific support for
- # particular features comes up, bare metal
- # configurations are quite functional.
- case $cpu in
- arm*)
- os=eabi
- ;;
- *)
- os=elf
- ;;
- esac
- ;;
- *)
- # No normalization, but not necessarily accepted, that comes below.
- ;;
-esac
-
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-kernel=
-case $cpu-$vendor in
- score-*)
- os=elf
- ;;
- spu-*)
- os=elf
- ;;
- *-acorn)
- os=riscix1.2
- ;;
- arm*-rebel)
- kernel=linux
- os=gnu
- ;;
- arm*-semi)
- os=aout
- ;;
- c4x-* | tic4x-*)
- os=coff
- ;;
- c8051-*)
- os=elf
- ;;
- clipper-intergraph)
- os=clix
- ;;
- hexagon-*)
- os=elf
- ;;
- tic54x-*)
- os=coff
- ;;
- tic55x-*)
- os=coff
- ;;
- tic6x-*)
- os=coff
- ;;
- # This must come before the *-dec entry.
- pdp10-*)
- os=tops20
- ;;
- pdp11-*)
- os=none
- ;;
- *-dec | vax-*)
- os=ultrix4.2
- ;;
- m68*-apollo)
- os=domain
- ;;
- i386-sun)
- os=sunos4.0.2
- ;;
- m68000-sun)
- os=sunos3
- ;;
- m68*-cisco)
- os=aout
- ;;
- mep-*)
- os=elf
- ;;
- mips*-cisco)
- os=elf
- ;;
- mips*-*)
- os=elf
- ;;
- or32-*)
- os=coff
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=sysv3
- ;;
- sparc-* | *-sun)
- os=sunos4.1.1
- ;;
- pru-*)
- os=elf
- ;;
- *-be)
- os=beos
- ;;
- *-ibm)
- os=aix
- ;;
- *-knuth)
- os=mmixware
- ;;
- *-wec)
- os=proelf
- ;;
- *-winbond)
- os=proelf
- ;;
- *-oki)
- os=proelf
- ;;
- *-hp)
- os=hpux
- ;;
- *-hitachi)
- os=hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=sysv
- ;;
- *-cbm)
- os=amigaos
- ;;
- *-dg)
- os=dgux
- ;;
- *-dolphin)
- os=sysv3
- ;;
- m68k-ccur)
- os=rtu
- ;;
- m88k-omron*)
- os=luna
- ;;
- *-next)
- os=nextstep
- ;;
- *-sequent)
- os=ptx
- ;;
- *-crds)
- os=unos
- ;;
- *-ns)
- os=genix
- ;;
- i370-*)
- os=mvs
- ;;
- *-gould)
- os=sysv
- ;;
- *-highlevel)
- os=bsd
- ;;
- *-encore)
- os=bsd
- ;;
- *-sgi)
- os=irix
- ;;
- *-siemens)
- os=sysv4
- ;;
- *-masscomp)
- os=rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=uxpv
- ;;
- *-rom68k)
- os=coff
- ;;
- *-*bug)
- os=coff
- ;;
- *-apple)
- os=macos
- ;;
- *-atari*)
- os=mint
- ;;
- *-wrs)
- os=vxworks
- ;;
- *)
- os=none
- ;;
-esac
-
-fi
-
-# Now, validate our (potentially fixed-up) OS.
-case $os in
- # Sometimes we do "kernel-libc", so those need to count as OSes.
- musl* | newlib* | uclibc*)
- ;;
- # Likewise for "kernel-abi"
- eabi* | gnueabi*)
- ;;
- # VxWorks passes extra cpu info in the 4th filed.
- simlinux | simwindows | spe)
- ;;
- # Now accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST end in a * to match a version number.
- gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
- | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
- | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
- | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \
- | hiux* | abug | nacl* | netware* | windows* \
- | os9* | macos* | osx* | ios* \
- | mpw* | magic* | mmixware* | mon960* | lnews* \
- | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
- | aos* | aros* | cloudabi* | sortix* | twizzler* \
- | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
- | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
- | mirbsd* | netbsd* | dicos* | openedition* | ose* \
- | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \
- | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
- | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
- | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
- | udi* | lites* | ieee* | go32* | aux* | hcos* \
- | chorusrdb* | cegcc* | glidix* \
- | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
- | midipix* | mingw32* | mingw64* | mint* \
- | uxpv* | beos* | mpeix* | udk* | moxiebox* \
- | interix* | uwin* | mks* | rhapsody* | darwin* \
- | openstep* | oskit* | conix* | pw32* | nonstopux* \
- | storm-chaos* | tops10* | tenex* | tops20* | its* \
- | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
- | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
- | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
- | skyos* | haiku* | rdos* | toppers* | drops* | es* \
- | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
- | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
- | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx*)
- ;;
- # This one is extra strict with allowed versions
- sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
- # Don't forget version if it is 3.2v4 or newer.
- ;;
- none)
- ;;
- *)
- echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# As a final step for OS-related things, validate the OS-kernel combination
-# (given a valid OS), if there is a kernel.
-case $kernel-$os in
- linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* )
- ;;
- uclinux-uclibc* )
- ;;
- -dietlibc* | -newlib* | -musl* | -uclibc* )
- # These are just libc implementations, not actual OSes, and thus
- # require a kernel.
- echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
- exit 1
- ;;
- kfreebsd*-gnu* | kopensolaris*-gnu*)
- ;;
- vxworks-simlinux | vxworks-simwindows | vxworks-spe)
- ;;
- nto-qnx*)
- ;;
- os2-emx)
- ;;
- *-eabi* | *-gnueabi*)
- ;;
- -*)
- # Blank kernel with real OS is always fine.
- ;;
- *-*)
- echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
- exit 1
- ;;
-esac
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-case $vendor in
- unknown)
- case $cpu-$os in
- *-riscix*)
- vendor=acorn
- ;;
- *-sunos*)
- vendor=sun
- ;;
- *-cnk* | *-aix*)
- vendor=ibm
- ;;
- *-beos*)
- vendor=be
- ;;
- *-hpux*)
- vendor=hp
- ;;
- *-mpeix*)
- vendor=hp
- ;;
- *-hiux*)
- vendor=hitachi
- ;;
- *-unos*)
- vendor=crds
- ;;
- *-dgux*)
- vendor=dg
- ;;
- *-luna*)
- vendor=omron
- ;;
- *-genix*)
- vendor=ns
- ;;
- *-clix*)
- vendor=intergraph
- ;;
- *-mvs* | *-opened*)
- vendor=ibm
- ;;
- *-os400*)
- vendor=ibm
- ;;
- s390-* | s390x-*)
- vendor=ibm
- ;;
- *-ptx*)
- vendor=sequent
- ;;
- *-tpf*)
- vendor=ibm
- ;;
- *-vxsim* | *-vxworks* | *-windiss*)
- vendor=wrs
- ;;
- *-aux*)
- vendor=apple
- ;;
- *-hms*)
- vendor=hitachi
- ;;
- *-mpw* | *-macos*)
- vendor=apple
- ;;
- *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
- vendor=atari
- ;;
- *-vos*)
- vendor=stratus
- ;;
- esac
- ;;
-esac
-
-echo "$cpu-$vendor-${kernel:+$kernel-}$os"
-exit
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/lib/wx/autoconf/install-sh b/lib/wx/autoconf/install-sh
deleted file mode 100755
index ec298b5374..0000000000
--- a/lib/wx/autoconf/install-sh
+++ /dev/null
@@ -1,541 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2020-11-14.01; # UTC
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# 'make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-tab=' '
-nl='
-'
-IFS=" $tab$nl"
-
-# Set DOITPROG to "echo" to test this script.
-
-doit=${DOITPROG-}
-doit_exec=${doit:-exec}
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-chgrpprog=${CHGRPPROG-chgrp}
-chmodprog=${CHMODPROG-chmod}
-chownprog=${CHOWNPROG-chown}
-cmpprog=${CMPPROG-cmp}
-cpprog=${CPPROG-cp}
-mkdirprog=${MKDIRPROG-mkdir}
-mvprog=${MVPROG-mv}
-rmprog=${RMPROG-rm}
-stripprog=${STRIPPROG-strip}
-
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-# Create dirs (including intermediate dirs) using mode 755.
-# This is like GNU 'install' as of coreutils 8.32 (2020).
-mkdir_umask=22
-
-backupsuffix=
-chgrpcmd=
-chmodcmd=$chmodprog
-chowncmd=
-mvcmd=$mvprog
-rmcmd="$rmprog -f"
-stripcmd=
-
-src=
-dst=
-dir_arg=
-dst_arg=
-
-copy_on_change=false
-is_target_a_directory=possibly
-
-usage="\
-Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
- or: $0 [OPTION]... SRCFILES... DIRECTORY
- or: $0 [OPTION]... -t DIRECTORY SRCFILES...
- or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
- --help display this help and exit.
- --version display version info and exit.
-
- -c (ignored)
- -C install only if different (preserve data modification time)
- -d create directories instead of installing files.
- -g GROUP $chgrpprog installed files to GROUP.
- -m MODE $chmodprog installed files to MODE.
- -o USER $chownprog installed files to USER.
- -p pass -p to $cpprog.
- -s $stripprog installed files.
- -S SUFFIX attempt to back up existing files, with suffix SUFFIX.
- -t DIRECTORY install into DIRECTORY.
- -T report an error if DSTFILE is a directory.
-
-Environment variables override the default commands:
- CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
- RMPROG STRIPPROG
-
-By default, rm is invoked with -f; when overridden with RMPROG,
-it's up to you to specify -f if you want it.
-
-If -S is not specified, no backups are attempted.
-
-Email bug reports to bug-automake@gnu.org.
-Automake home page: https://www.gnu.org/software/automake/
-"
-
-while test $# -ne 0; do
- case $1 in
- -c) ;;
-
- -C) copy_on_change=true;;
-
- -d) dir_arg=true;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift;;
-
- --help) echo "$usage"; exit $?;;
-
- -m) mode=$2
- case $mode in
- *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
- echo "$0: invalid mode: $mode" >&2
- exit 1;;
- esac
- shift;;
-
- -o) chowncmd="$chownprog $2"
- shift;;
-
- -p) cpprog="$cpprog -p";;
-
- -s) stripcmd=$stripprog;;
-
- -S) backupsuffix="$2"
- shift;;
-
- -t)
- is_target_a_directory=always
- dst_arg=$2
- # Protect names problematic for 'test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- shift;;
-
- -T) is_target_a_directory=never;;
-
- --version) echo "$0 $scriptversion"; exit $?;;
-
- --) shift
- break;;
-
- -*) echo "$0: invalid option: $1" >&2
- exit 1;;
-
- *) break;;
- esac
- shift
-done
-
-# We allow the use of options -d and -T together, by making -d
-# take the precedence; this is for compatibility with GNU install.
-
-if test -n "$dir_arg"; then
- if test -n "$dst_arg"; then
- echo "$0: target directory not allowed when installing a directory." >&2
- exit 1
- fi
-fi
-
-if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
- # When -d is used, all remaining arguments are directories to create.
- # When -t is used, the destination is already specified.
- # Otherwise, the last argument is the destination. Remove it from $@.
- for arg
- do
- if test -n "$dst_arg"; then
- # $@ is not empty: it contains at least $arg.
- set fnord "$@" "$dst_arg"
- shift # fnord
- fi
- shift # arg
- dst_arg=$arg
- # Protect names problematic for 'test' and other utilities.
- case $dst_arg in
- -* | [=\(\)!]) dst_arg=./$dst_arg;;
- esac
- done
-fi
-
-if test $# -eq 0; then
- if test -z "$dir_arg"; then
- echo "$0: no input file specified." >&2
- exit 1
- fi
- # It's OK to call 'install-sh -d' without argument.
- # This can happen when creating conditional directories.
- exit 0
-fi
-
-if test -z "$dir_arg"; then
- if test $# -gt 1 || test "$is_target_a_directory" = always; then
- if test ! -d "$dst_arg"; then
- echo "$0: $dst_arg: Is not a directory." >&2
- exit 1
- fi
- fi
-fi
-
-if test -z "$dir_arg"; then
- do_exit='(exit $ret); exit $ret'
- trap "ret=129; $do_exit" 1
- trap "ret=130; $do_exit" 2
- trap "ret=141; $do_exit" 13
- trap "ret=143; $do_exit" 15
-
- # Set umask so as not to create temps with too-generous modes.
- # However, 'strip' requires both read and write access to temps.
- case $mode in
- # Optimize common cases.
- *644) cp_umask=133;;
- *755) cp_umask=22;;
-
- *[0-7])
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw='% 200'
- fi
- cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
- *)
- if test -z "$stripcmd"; then
- u_plus_rw=
- else
- u_plus_rw=,u+rw
- fi
- cp_umask=$mode$u_plus_rw;;
- esac
-fi
-
-for src
-do
- # Protect names problematic for 'test' and other utilities.
- case $src in
- -* | [=\(\)!]) src=./$src;;
- esac
-
- if test -n "$dir_arg"; then
- dst=$src
- dstdir=$dst
- test -d "$dstdir"
- dstdir_status=$?
- # Don't chown directories that already exist.
- if test $dstdir_status = 0; then
- chowncmd=""
- fi
- else
-
- # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
- # might cause directories to be created, which would be especially bad
- # if $src (and thus $dsttmp) contains '*'.
- if test ! -f "$src" && test ! -d "$src"; then
- echo "$0: $src does not exist." >&2
- exit 1
- fi
-
- if test -z "$dst_arg"; then
- echo "$0: no destination specified." >&2
- exit 1
- fi
- dst=$dst_arg
-
- # If destination is a directory, append the input filename.
- if test -d "$dst"; then
- if test "$is_target_a_directory" = never; then
- echo "$0: $dst_arg: Is a directory" >&2
- exit 1
- fi
- dstdir=$dst
- dstbase=`basename "$src"`
- case $dst in
- */) dst=$dst$dstbase;;
- *) dst=$dst/$dstbase;;
- esac
- dstdir_status=0
- else
- dstdir=`dirname "$dst"`
- test -d "$dstdir"
- dstdir_status=$?
- fi
- fi
-
- case $dstdir in
- */) dstdirslash=$dstdir;;
- *) dstdirslash=$dstdir/;;
- esac
-
- obsolete_mkdir_used=false
-
- if test $dstdir_status != 0; then
- case $posix_mkdir in
- '')
- # With -d, create the new directory with the user-specified mode.
- # Otherwise, rely on $mkdir_umask.
- if test -n "$dir_arg"; then
- mkdir_mode=-m$mode
- else
- mkdir_mode=
- fi
-
- posix_mkdir=false
- # The $RANDOM variable is not portable (e.g., dash). Use it
- # here however when possible just to lower collision chance.
- tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-
- trap '
- ret=$?
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null
- exit $ret
- ' 0
-
- # Because "mkdir -p" follows existing symlinks and we likely work
- # directly in world-writeable /tmp, make sure that the '$tmpdir'
- # directory is successfully created first before we actually test
- # 'mkdir -p'.
- if (umask $mkdir_umask &&
- $mkdirprog $mkdir_mode "$tmpdir" &&
- exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
- then
- if test -z "$dir_arg" || {
- # Check for POSIX incompatibilities with -m.
- # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
- # other-writable bit of parent directory when it shouldn't.
- # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
- test_tmpdir="$tmpdir/a"
- ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
- case $ls_ld_tmpdir in
- d????-?r-*) different_mode=700;;
- d????-?--*) different_mode=755;;
- *) false;;
- esac &&
- $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
- ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
- test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
- }
- }
- then posix_mkdir=:
- fi
- rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
- else
- # Remove any dirs left behind by ancient mkdir implementations.
- rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
- fi
- trap '' 0;;
- esac
-
- if
- $posix_mkdir && (
- umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
- )
- then :
- else
-
- # mkdir does not conform to POSIX,
- # or it failed possibly due to a race condition. Create the
- # directory the slow way, step by step, checking for races as we go.
-
- case $dstdir in
- /*) prefix='/';;
- [-=\(\)!]*) prefix='./';;
- *) prefix='';;
- esac
-
- oIFS=$IFS
- IFS=/
- set -f
- set fnord $dstdir
- shift
- set +f
- IFS=$oIFS
-
- prefixes=
-
- for d
- do
- test X"$d" = X && continue
-
- prefix=$prefix$d
- if test -d "$prefix"; then
- prefixes=
- else
- if $posix_mkdir; then
- (umask $mkdir_umask &&
- $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
- # Don't fail if two instances are running concurrently.
- test -d "$prefix" || exit 1
- else
- case $prefix in
- *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
- *) qprefix=$prefix;;
- esac
- prefixes="$prefixes '$qprefix'"
- fi
- fi
- prefix=$prefix/
- done
-
- if test -n "$prefixes"; then
- # Don't fail if two instances are running concurrently.
- (umask $mkdir_umask &&
- eval "\$doit_exec \$mkdirprog $prefixes") ||
- test -d "$dstdir" || exit 1
- obsolete_mkdir_used=true
- fi
- fi
- fi
-
- if test -n "$dir_arg"; then
- { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
- { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
- test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
- else
-
- # Make a couple of temp file names in the proper directory.
- dsttmp=${dstdirslash}_inst.$$_
- rmtmp=${dstdirslash}_rm.$$_
-
- # Trap to clean up those temp files at exit.
- trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
- # Copy the file name to the temp name.
- (umask $cp_umask &&
- { test -z "$stripcmd" || {
- # Create $dsttmp read-write so that cp doesn't create it read-only,
- # which would cause strip to fail.
- if test -z "$doit"; then
- : >"$dsttmp" # No need to fork-exec 'touch'.
- else
- $doit touch "$dsttmp"
- fi
- }
- } &&
- $doit_exec $cpprog "$src" "$dsttmp") &&
-
- # and set any options; do chmod last to preserve setuid bits.
- #
- # If any of these fail, we abort the whole thing. If we want to
- # ignore errors from any of these, just make sure not to ignore
- # errors from the above "$doit $cpprog $src $dsttmp" command.
- #
- { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
- { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
- { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
- { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
- # If -C, don't bother to copy if it wouldn't change the file.
- if $copy_on_change &&
- old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
- new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
- set -f &&
- set X $old && old=:$2:$4:$5:$6 &&
- set X $new && new=:$2:$4:$5:$6 &&
- set +f &&
- test "$old" = "$new" &&
- $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
- then
- rm -f "$dsttmp"
- else
- # If $backupsuffix is set, and the file being installed
- # already exists, attempt a backup. Don't worry if it fails,
- # e.g., if mv doesn't support -f.
- if test -n "$backupsuffix" && test -f "$dst"; then
- $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null
- fi
-
- # Rename the file to the real destination.
- $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
-
- # The rename failed, perhaps because mv can't rename something else
- # to itself, or perhaps because mv is so ancient that it does not
- # support -f.
- {
- # Now remove or move aside any old file at destination location.
- # We try this two ways since rm can't unlink itself on some
- # systems and the destination file might be busy for other
- # reasons. In this case, the final cleanup might fail but the new
- # file should still install successfully.
- {
- test ! -f "$dst" ||
- $doit $rmcmd "$dst" 2>/dev/null ||
- { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
- { $doit $rmcmd "$rmtmp" 2>/dev/null; :; }
- } ||
- { echo "$0: cannot unlink or rename $dst" >&2
- (exit 1); exit 1
- }
- } &&
-
- # Now rename the file to the real destination.
- $doit $mvcmd "$dsttmp" "$dst"
- }
- fi || exit 1
-
- trap '' 0
- fi
-done
-
-# Local variables:
-# eval: (add-hook 'before-save-hook 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-time-zone: "UTC0"
-# time-stamp-end: "; # UTC"
-# End:
diff --git a/lib/wx/c_src/Makefile.in b/lib/wx/c_src/Makefile.in
index 8a638b740a..87fc0354b6 100644
--- a/lib/wx/c_src/Makefile.in
+++ b/lib/wx/c_src/Makefile.in
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2021. All Rights Reserved.
+# Copyright Ericsson AB 2008-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -97,25 +97,25 @@ RESCOMP = @WX_RESCOMP@
ifeq (@WX_HAVE_STATIC_LIBS@,true)
OPT_WX_LIBS = @WX_LIBS_STATIC@
-DEBUG_WX_LIBS = @DEBUG_WX_LIBS_STATIC@
+DEBUG_WX_LIBS = @DEBUG_WX_LIBS_STATIC@ @GLIB_LIBS@
else
-OPT_WX_LIBS = @WX_LIBS@
-DEBUG_WX_LIBS = @DEBUG_WX_LIBS@
+OPT_WX_LIBS = @WX_LIBS@ @GLIB_LIBS@
+DEBUG_WX_LIBS = @DEBUG_WX_LIBS@ @GLIB_LIBS@
endif
ifeq ($(TYPE),debug)
WX_CFLAGS = @DEBUG_WX_CFLAGS@
CFLAGS = @DEBUG_CFLAGS@
WX_CXX_FLAGS = @DEBUG_WX_CXXFLAGS@
-CXX_FLAGS = @DEBUG_CXXFLAGS@
-CXX_NO_OPT_FLAGS = @DEBUG_CXXFLAGS@
+CXX_FLAGS = @DEBUG_CXXFLAGS@ @GLIB_CFLAGS@
+CXX_NO_OPT_FLAGS = @DEBUG_CXXFLAGS@ @GLIB_CFLAGS@
WX_LIBS = $(DEBUG_WX_LIBS)
else
WX_CFLAGS = @WX_CFLAGS@
CFLAGS = @CFLAGS@
WX_CXX_FLAGS = @WX_CXXFLAGS@
-CXX_FLAGS = @CXXFLAGS@
-CXX_NO_OPT_FLAGS = @CXXNOOPTFLAGS@
+CXX_FLAGS = @CXXFLAGS@ @GLIB_CFLAGS@
+CXX_NO_OPT_FLAGS = @CXXNOOPTFLAGS@ @GLIB_CFLAGS@
WX_LIBS = $(OPT_WX_LIBS)
endif
@@ -130,8 +130,8 @@ CXX_O_NO_OPT = $(V_CXX) -c $(CXX_NO_OPT_FLAGS) $(WX_CXX_FLAGS) $(COMMON_CFLA
opt: $(TARGET_DIR)/wxe_driver$(SO_EXT) $(TARGET_DIR)/erl_gl$(SO_EXT) $(WEBVIEW_LOADER_DLL_DEST)
-debug:
- @${MAKE} TYPE=debug
+$(filter-out opt, $(TYPES)):
+ @${MAKE} TYPE=$@ opt
clean:
rm -f $(OBJECTS)
diff --git a/lib/wx/c_src/egl_impl.c b/lib/wx/c_src/egl_impl.c
index 2703f55408..7fe58a040d 100644
--- a/lib/wx/c_src/egl_impl.c
+++ b/lib/wx/c_src/egl_impl.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2011-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2011-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -279,7 +279,7 @@ int egl_load_functions() {
}
/* *******************************************************************************
- * GLU Tesselation special
+ * GLU Tessellation special
* ******************************************************************************/
static GLUtesselator* tess;
@@ -355,7 +355,7 @@ egl_ogla_error(GLenum errorCode)
{
// const GLubyte *err;
// err = gluErrorString(errorCode);
- // fprintf(stderr, "Tesselation error: %d: %s\r\n", (int) errorCode, err);
+ // fprintf(stderr, "Tessellation error: %d: %s\r\n", (int) errorCode, err);
}
void init_tess()
diff --git a/lib/wx/c_src/gen/wxe_func_table.cpp b/lib/wx/c_src/gen/wxe_func_table.cpp
index 6538bf4f2a..941dcbc65a 100644
--- a/lib/wx/c_src/gen/wxe_func_table.cpp
+++ b/lib/wx/c_src/gen/wxe_func_table.cpp
@@ -2983,6 +2983,12 @@ extern void wxMouseEvent_RightIsDown(WxeApp *app, wxeMemEnv *memenv, wxeCommand&
extern void wxMouseEvent_RightUp(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxMouseEvent_ShiftDown(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxMouseEvent_GetWheelAxis(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxMouseEvent_Aux1DClick(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxMouseEvent_Aux1Down(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxMouseEvent_Aux1Up(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxMouseEvent_Aux2DClick(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxMouseEvent_Aux2Down(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
+extern void wxMouseEvent_Aux2Up(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxSetCursorEvent_GetCursor(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxSetCursorEvent_GetX(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
extern void wxSetCursorEvent_GetY(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd);
@@ -7846,1230 +7852,1236 @@ wxe_fns_t wxe_fns[] =
{wxMouseEvent_RightUp, "wxMouseEvent", "rightUp", 1}, // 2727
{wxMouseEvent_ShiftDown, "wxMouseEvent", "shiftDown", 1}, // 2728
{wxMouseEvent_GetWheelAxis, "wxMouseEvent", "getWheelAxis", 1}, // 2729
- {wxSetCursorEvent_GetCursor, "wxSetCursorEvent", "getCursor", 1}, // 2730
- {wxSetCursorEvent_GetX, "wxSetCursorEvent", "getX", 1}, // 2731
- {wxSetCursorEvent_GetY, "wxSetCursorEvent", "getY", 1}, // 2732
- {wxSetCursorEvent_HasCursor, "wxSetCursorEvent", "hasCursor", 1}, // 2733
- {wxSetCursorEvent_SetCursor, "wxSetCursorEvent", "setCursor", 2}, // 2734
- {wxKeyEvent_AltDown, "wxKeyEvent", "altDown", 1}, // 2735
- {wxKeyEvent_CmdDown, "wxKeyEvent", "cmdDown", 1}, // 2736
- {wxKeyEvent_ControlDown, "wxKeyEvent", "controlDown", 1}, // 2737
- {wxKeyEvent_GetKeyCode, "wxKeyEvent", "getKeyCode", 1}, // 2738
- {wxKeyEvent_GetModifiers, "wxKeyEvent", "getModifiers", 1}, // 2739
- {wxKeyEvent_GetPosition, "wxKeyEvent", "getPosition", 1}, // 2740
- {NULL, "", "", 0}, // 2741
- {wxKeyEvent_GetRawKeyCode, "wxKeyEvent", "getRawKeyCode", 1}, // 2742
- {wxKeyEvent_GetRawKeyFlags, "wxKeyEvent", "getRawKeyFlags", 1}, // 2743
- {wxKeyEvent_GetUnicodeKey, "wxKeyEvent", "getUnicodeKey", 1}, // 2744
- {wxKeyEvent_GetX, "wxKeyEvent", "getX", 1}, // 2745
- {wxKeyEvent_GetY, "wxKeyEvent", "getY", 1}, // 2746
- {wxKeyEvent_HasModifiers, "wxKeyEvent", "hasModifiers", 1}, // 2747
- {wxKeyEvent_MetaDown, "wxKeyEvent", "metaDown", 1}, // 2748
- {wxKeyEvent_ShiftDown, "wxKeyEvent", "shiftDown", 1}, // 2749
- {wxSizeEvent_GetSize, "wxSizeEvent", "getSize", 1}, // 2750
- {wxSizeEvent_GetRect, "wxSizeEvent", "getRect", 1}, // 2751
- {wxMoveEvent_GetPosition, "wxMoveEvent", "getPosition", 1}, // 2752
- {wxMoveEvent_GetRect, "wxMoveEvent", "getRect", 1}, // 2753
- {wxEraseEvent_GetDC, "wxEraseEvent", "getDC", 1}, // 2754
- {wxFocusEvent_GetWindow, "wxFocusEvent", "getWindow", 1}, // 2755
- {wxChildFocusEvent_GetWindow, "wxChildFocusEvent", "getWindow", 1}, // 2756
- {wxMenuEvent_GetMenu, "wxMenuEvent", "getMenu", 1}, // 2757
- {wxMenuEvent_GetMenuId, "wxMenuEvent", "getMenuId", 1}, // 2758
- {wxMenuEvent_IsPopup, "wxMenuEvent", "isPopup", 1}, // 2759
- {wxCloseEvent_CanVeto, "wxCloseEvent", "canVeto", 1}, // 2760
- {wxCloseEvent_GetLoggingOff, "wxCloseEvent", "getLoggingOff", 1}, // 2761
- {wxCloseEvent_SetCanVeto, "wxCloseEvent", "setCanVeto", 2}, // 2762
- {wxCloseEvent_SetLoggingOff, "wxCloseEvent", "setLoggingOff", 2}, // 2763
- {wxCloseEvent_Veto, "wxCloseEvent", "veto", 2}, // 2764
- {wxShowEvent_SetShow, "wxShowEvent", "setShow", 2}, // 2765
- {wxShowEvent_IsShown, "wxShowEvent", "isShown", 1}, // 2766
- {wxIconizeEvent_IsIconized, "wxIconizeEvent", "isIconized", 1}, // 2767
- {wxJoystickEvent_ButtonDown, "wxJoystickEvent", "buttonDown", 2}, // 2768
- {wxJoystickEvent_ButtonIsDown, "wxJoystickEvent", "buttonIsDown", 2}, // 2769
- {wxJoystickEvent_ButtonUp, "wxJoystickEvent", "buttonUp", 2}, // 2770
- {wxJoystickEvent_GetButtonChange, "wxJoystickEvent", "getButtonChange", 1}, // 2771
- {wxJoystickEvent_GetButtonState, "wxJoystickEvent", "getButtonState", 1}, // 2772
- {wxJoystickEvent_GetJoystick, "wxJoystickEvent", "getJoystick", 1}, // 2773
- {wxJoystickEvent_GetPosition, "wxJoystickEvent", "getPosition", 1}, // 2774
- {wxJoystickEvent_GetZPosition, "wxJoystickEvent", "getZPosition", 1}, // 2775
- {wxJoystickEvent_IsButton, "wxJoystickEvent", "isButton", 1}, // 2776
- {wxJoystickEvent_IsMove, "wxJoystickEvent", "isMove", 1}, // 2777
- {wxJoystickEvent_IsZMove, "wxJoystickEvent", "isZMove", 1}, // 2778
- {wxUpdateUIEvent_CanUpdate, "wxUpdateUIEvent", "canUpdate", 1}, // 2779
- {wxUpdateUIEvent_Check, "wxUpdateUIEvent", "check", 2}, // 2780
- {wxUpdateUIEvent_Enable, "wxUpdateUIEvent", "enable", 2}, // 2781
- {wxUpdateUIEvent_Show, "wxUpdateUIEvent", "show", 2}, // 2782
- {wxUpdateUIEvent_GetChecked, "wxUpdateUIEvent", "getChecked", 1}, // 2783
- {wxUpdateUIEvent_GetEnabled, "wxUpdateUIEvent", "getEnabled", 1}, // 2784
- {wxUpdateUIEvent_GetShown, "wxUpdateUIEvent", "getShown", 1}, // 2785
- {wxUpdateUIEvent_GetSetChecked, "wxUpdateUIEvent", "getSetChecked", 1}, // 2786
- {wxUpdateUIEvent_GetSetEnabled, "wxUpdateUIEvent", "getSetEnabled", 1}, // 2787
- {wxUpdateUIEvent_GetSetShown, "wxUpdateUIEvent", "getSetShown", 1}, // 2788
- {wxUpdateUIEvent_GetSetText, "wxUpdateUIEvent", "getSetText", 1}, // 2789
- {wxUpdateUIEvent_GetText, "wxUpdateUIEvent", "getText", 1}, // 2790
- {wxUpdateUIEvent_GetMode, "wxUpdateUIEvent", "getMode", 0}, // 2791
- {wxUpdateUIEvent_GetUpdateInterval, "wxUpdateUIEvent", "getUpdateInterval", 0}, // 2792
- {wxUpdateUIEvent_ResetUpdateTime, "wxUpdateUIEvent", "resetUpdateTime", 0}, // 2793
- {wxUpdateUIEvent_SetMode, "wxUpdateUIEvent", "setMode", 1}, // 2794
- {wxUpdateUIEvent_SetText, "wxUpdateUIEvent", "setText", 2}, // 2795
- {wxUpdateUIEvent_SetUpdateInterval, "wxUpdateUIEvent", "setUpdateInterval", 1}, // 2796
- {wxMouseCaptureChangedEvent_GetCapturedWindow, "wxMouseCaptureChangedEvent", "getCapturedWindow", 1}, // 2797
- {wxPaletteChangedEvent_SetChangedWindow, "wxPaletteChangedEvent", "setChangedWindow", 2}, // 2798
- {wxPaletteChangedEvent_GetChangedWindow, "wxPaletteChangedEvent", "getChangedWindow", 1}, // 2799
- {wxQueryNewPaletteEvent_SetPaletteRealized, "wxQueryNewPaletteEvent", "setPaletteRealized", 2}, // 2800
- {wxQueryNewPaletteEvent_GetPaletteRealized, "wxQueryNewPaletteEvent", "getPaletteRealized", 1}, // 2801
- {wxNavigationKeyEvent_GetDirection, "wxNavigationKeyEvent", "getDirection", 1}, // 2802
- {wxNavigationKeyEvent_SetDirection, "wxNavigationKeyEvent", "setDirection", 2}, // 2803
- {wxNavigationKeyEvent_IsWindowChange, "wxNavigationKeyEvent", "isWindowChange", 1}, // 2804
- {wxNavigationKeyEvent_SetWindowChange, "wxNavigationKeyEvent", "setWindowChange", 2}, // 2805
- {wxNavigationKeyEvent_IsFromTab, "wxNavigationKeyEvent", "isFromTab", 1}, // 2806
- {wxNavigationKeyEvent_SetFromTab, "wxNavigationKeyEvent", "setFromTab", 2}, // 2807
- {wxNavigationKeyEvent_GetCurrentFocus, "wxNavigationKeyEvent", "getCurrentFocus", 1}, // 2808
- {wxNavigationKeyEvent_SetCurrentFocus, "wxNavigationKeyEvent", "setCurrentFocus", 2}, // 2809
- {wxHelpEvent_GetOrigin, "wxHelpEvent", "getOrigin", 1}, // 2810
- {wxHelpEvent_GetPosition, "wxHelpEvent", "getPosition", 1}, // 2811
- {wxHelpEvent_SetOrigin, "wxHelpEvent", "setOrigin", 2}, // 2812
- {wxHelpEvent_SetPosition, "wxHelpEvent", "setPosition", 2}, // 2813
- {wxContextMenuEvent_GetPosition, "wxContextMenuEvent", "getPosition", 1}, // 2814
- {wxContextMenuEvent_SetPosition, "wxContextMenuEvent", "setPosition", 2}, // 2815
- {wxIdleEvent_GetMode, "wxIdleEvent", "getMode", 0}, // 2816
- {wxIdleEvent_RequestMore, "wxIdleEvent", "requestMore", 2}, // 2817
- {wxIdleEvent_MoreRequested, "wxIdleEvent", "moreRequested", 1}, // 2818
- {wxIdleEvent_SetMode, "wxIdleEvent", "setMode", 1}, // 2819
- {wxGridEvent_AltDown, "wxGridEvent", "altDown", 1}, // 2820
- {wxGridEvent_ControlDown, "wxGridEvent", "controlDown", 1}, // 2821
- {wxGridEvent_GetCol, "wxGridEvent", "getCol", 1}, // 2822
- {wxGridEvent_GetPosition, "wxGridEvent", "getPosition", 1}, // 2823
- {wxGridEvent_GetRow, "wxGridEvent", "getRow", 1}, // 2824
- {wxGridEvent_MetaDown, "wxGridEvent", "metaDown", 1}, // 2825
- {wxGridEvent_Selecting, "wxGridEvent", "selecting", 1}, // 2826
- {wxGridEvent_ShiftDown, "wxGridEvent", "shiftDown", 1}, // 2827
- {wxNotifyEvent_Allow, "wxNotifyEvent", "allow", 1}, // 2828
- {wxNotifyEvent_IsAllowed, "wxNotifyEvent", "isAllowed", 1}, // 2829
- {wxNotifyEvent_Veto, "wxNotifyEvent", "veto", 1}, // 2830
- {wxSashEvent_GetEdge, "wxSashEvent", "getEdge", 1}, // 2831
- {wxSashEvent_GetDragRect, "wxSashEvent", "getDragRect", 1}, // 2832
- {wxSashEvent_GetDragStatus, "wxSashEvent", "getDragStatus", 1}, // 2833
- {wxListEvent_GetCacheFrom, "wxListEvent", "getCacheFrom", 1}, // 2834
- {wxListEvent_GetCacheTo, "wxListEvent", "getCacheTo", 1}, // 2835
- {wxListEvent_GetKeyCode, "wxListEvent", "getKeyCode", 1}, // 2836
- {wxListEvent_GetIndex, "wxListEvent", "getIndex", 1}, // 2837
- {wxListEvent_GetColumn, "wxListEvent", "getColumn", 1}, // 2838
- {wxListEvent_GetPoint, "wxListEvent", "getPoint", 1}, // 2839
- {wxListEvent_GetLabel, "wxListEvent", "getLabel", 1}, // 2840
- {wxListEvent_GetText, "wxListEvent", "getText", 1}, // 2841
- {wxListEvent_GetImage, "wxListEvent", "getImage", 1}, // 2842
- {wxListEvent_GetData, "wxListEvent", "getData", 1}, // 2843
- {wxListEvent_GetMask, "wxListEvent", "getMask", 1}, // 2844
- {wxListEvent_GetItem, "wxListEvent", "getItem", 1}, // 2845
- {wxListEvent_IsEditCancelled, "wxListEvent", "isEditCancelled", 1}, // 2846
- {wxDateEvent_GetDate, "wxDateEvent", "getDate", 1}, // 2847
- {wxCalendarEvent_GetWeekDay, "wxCalendarEvent", "getWeekDay", 1}, // 2848
- {wxCalendarEvent_GetDate, "wxCalendarEvent", "getDate", 1}, // 2849
- {wxFileDirPickerEvent_GetPath, "wxFileDirPickerEvent", "getPath", 1}, // 2850
- {wxColourPickerEvent_GetColour, "wxColourPickerEvent", "getColour", 1}, // 2851
- {wxFontPickerEvent_GetFont, "wxFontPickerEvent", "getFont", 1}, // 2852
- {wxStyledTextEvent_GetPosition, "wxStyledTextEvent", "getPosition", 1}, // 2853
- {wxStyledTextEvent_GetKey, "wxStyledTextEvent", "getKey", 1}, // 2854
- {wxStyledTextEvent_GetModifiers, "wxStyledTextEvent", "getModifiers", 1}, // 2855
- {wxStyledTextEvent_GetModificationType, "wxStyledTextEvent", "getModificationType", 1}, // 2856
- {wxStyledTextEvent_GetText, "wxStyledTextEvent", "getText", 1}, // 2857
- {wxStyledTextEvent_GetLength, "wxStyledTextEvent", "getLength", 1}, // 2858
- {wxStyledTextEvent_GetLinesAdded, "wxStyledTextEvent", "getLinesAdded", 1}, // 2859
- {wxStyledTextEvent_GetLine, "wxStyledTextEvent", "getLine", 1}, // 2860
- {wxStyledTextEvent_GetFoldLevelNow, "wxStyledTextEvent", "getFoldLevelNow", 1}, // 2861
- {wxStyledTextEvent_GetFoldLevelPrev, "wxStyledTextEvent", "getFoldLevelPrev", 1}, // 2862
- {wxStyledTextEvent_GetMargin, "wxStyledTextEvent", "getMargin", 1}, // 2863
- {wxStyledTextEvent_GetMessage, "wxStyledTextEvent", "getMessage", 1}, // 2864
- {wxStyledTextEvent_GetWParam, "wxStyledTextEvent", "getWParam", 1}, // 2865
- {wxStyledTextEvent_GetLParam, "wxStyledTextEvent", "getLParam", 1}, // 2866
- {wxStyledTextEvent_GetListType, "wxStyledTextEvent", "getListType", 1}, // 2867
- {wxStyledTextEvent_GetX, "wxStyledTextEvent", "getX", 1}, // 2868
- {wxStyledTextEvent_GetY, "wxStyledTextEvent", "getY", 1}, // 2869
- {wxStyledTextEvent_GetDragText, "wxStyledTextEvent", "getDragText", 1}, // 2870
- {wxStyledTextEvent_GetDragAllowMove, "wxStyledTextEvent", "getDragAllowMove", 1}, // 2871
- {wxStyledTextEvent_GetDragResult, "wxStyledTextEvent", "getDragResult", 1}, // 2872
- {wxStyledTextEvent_GetShift, "wxStyledTextEvent", "getShift", 1}, // 2873
- {wxStyledTextEvent_GetControl, "wxStyledTextEvent", "getControl", 1}, // 2874
- {wxStyledTextEvent_GetAlt, "wxStyledTextEvent", "getAlt", 1}, // 2875
- {utils_wxGetKeyState, "utils", "getKeyState", 1}, // 2876
- {utils_wxGetMousePosition, "utils", "getMousePosition", 0}, // 2877
- {utils_wxGetMouseState, "utils", "getMouseState", 0}, // 2878
- {utils_wxSetDetectableAutoRepeat, "utils", "setDetectableAutoRepeat", 1}, // 2879
- {utils_wxBell, "utils", "bell", 0}, // 2880
- {utils_wxFindMenuItemId, "utils", "findMenuItemId", 3}, // 2881
- {utils_wxFindWindowAtPoint, "utils", "findWindowAtPoint", 1}, // 2882
- {utils_wxBeginBusyCursor, "utils", "beginBusyCursor", 1}, // 2883
- {utils_wxEndBusyCursor, "utils", "endBusyCursor", 0}, // 2884
- {utils_wxIsBusy, "utils", "isBusy", 0}, // 2885
- {utils_wxShutdown, "utils", "shutdown", 1}, // 2886
- {utils_wxShell, "utils", "shell", 1}, // 2887
- {utils_wxLaunchDefaultBrowser, "utils", "launchDefaultBrowser", 2}, // 2888
- {utils_wxGetEmailAddress, "utils", "getEmailAddress", 0}, // 2889
- {utils_wxGetUserId, "utils", "getUserId", 0}, // 2890
- {utils_wxGetHomeDir, "utils", "getHomeDir", 0}, // 2891
- {utils_wxNewId, "utils", "newId", 0}, // 2892
- {utils_wxRegisterId, "utils", "registerId", 1}, // 2893
- {utils_wxGetCurrentId, "utils", "getCurrentId", 0}, // 2894
- {utils_wxGetOsDescription, "utils", "getOsDescription", 0}, // 2895
- {utils_wxIsPlatformLittleEndian, "utils", "isPlatformLittleEndian", 0}, // 2896
- {utils_wxIsPlatform64Bit, "utils", "isPlatform64Bit", 0}, // 2897
- {gdicmn_wxDisplaySize, "gdicmn", "displaySize", 0}, // 2898
- {gdicmn_wxSetCursor, "gdicmn", "setCursor", 1}, // 2899
- {wxPrintout_new, "wxPrintout", "new", 3}, // 2900
- {NULL, "wxPrintout", "destroy", 1}, // 2901 obj destructor wxPrintout_destruct
- {wxPrintout_GetDC, "wxPrintout", "getDC", 1}, // 2902
- {wxPrintout_GetPageSizeMM, "wxPrintout", "getPageSizeMM", 1}, // 2903
- {wxPrintout_GetPageSizePixels, "wxPrintout", "getPageSizePixels", 1}, // 2904
- {wxPrintout_GetPaperRectPixels, "wxPrintout", "getPaperRectPixels", 1}, // 2905
- {wxPrintout_GetPPIPrinter, "wxPrintout", "getPPIPrinter", 1}, // 2906
- {wxPrintout_GetPPIScreen, "wxPrintout", "getPPIScreen", 1}, // 2907
- {wxPrintout_GetTitle, "wxPrintout", "getTitle", 1}, // 2908
- {wxPrintout_IsPreview, "wxPrintout", "isPreview", 1}, // 2909
- {wxPrintout_FitThisSizeToPaper, "wxPrintout", "fitThisSizeToPaper", 2}, // 2910
- {wxPrintout_FitThisSizeToPage, "wxPrintout", "fitThisSizeToPage", 2}, // 2911
- {wxPrintout_FitThisSizeToPageMargins, "wxPrintout", "fitThisSizeToPageMargins", 3}, // 2912
- {wxPrintout_MapScreenSizeToPaper, "wxPrintout", "mapScreenSizeToPaper", 1}, // 2913
- {wxPrintout_MapScreenSizeToPage, "wxPrintout", "mapScreenSizeToPage", 1}, // 2914
- {wxPrintout_MapScreenSizeToPageMargins, "wxPrintout", "mapScreenSizeToPageMargins", 2}, // 2915
- {wxPrintout_MapScreenSizeToDevice, "wxPrintout", "mapScreenSizeToDevice", 1}, // 2916
- {wxPrintout_GetLogicalPaperRect, "wxPrintout", "getLogicalPaperRect", 1}, // 2917
- {wxPrintout_GetLogicalPageRect, "wxPrintout", "getLogicalPageRect", 1}, // 2918
- {wxPrintout_GetLogicalPageMarginsRect, "wxPrintout", "getLogicalPageMarginsRect", 2}, // 2919
- {wxPrintout_SetLogicalOrigin, "wxPrintout", "setLogicalOrigin", 3}, // 2920
- {wxPrintout_OffsetLogicalOrigin, "wxPrintout", "offsetLogicalOrigin", 3}, // 2921
- {wxStyledTextCtrl_new_2, "wxStyledTextCtrl", "new", 2}, // 2922
- {wxStyledTextCtrl_new_0, "wxStyledTextCtrl", "new", 0}, // 2923
- {NULL, "wxStyledTextCtrl", "destroy", 1}, // 2924 obj destructor wxStyledTextCtrl_destruct
- {wxStyledTextCtrl_Create, "wxStyledTextCtrl", "create", 3}, // 2925
- {wxStyledTextCtrl_AddText, "wxStyledTextCtrl", "addText", 2}, // 2926
- {wxStyledTextCtrl_InsertText, "wxStyledTextCtrl", "insertText", 3}, // 2927
- {wxStyledTextCtrl_ClearAll, "wxStyledTextCtrl", "clearAll", 1}, // 2928
- {wxStyledTextCtrl_ClearDocumentStyle, "wxStyledTextCtrl", "clearDocumentStyle", 1}, // 2929
- {wxStyledTextCtrl_GetLength, "wxStyledTextCtrl", "getLength", 1}, // 2930
- {wxStyledTextCtrl_GetCharAt, "wxStyledTextCtrl", "getCharAt", 2}, // 2931
- {wxStyledTextCtrl_GetCurrentPos, "wxStyledTextCtrl", "getCurrentPos", 1}, // 2932
- {wxStyledTextCtrl_GetAnchor, "wxStyledTextCtrl", "getAnchor", 1}, // 2933
- {wxStyledTextCtrl_GetStyleAt, "wxStyledTextCtrl", "getStyleAt", 2}, // 2934
- {wxStyledTextCtrl_Redo, "wxStyledTextCtrl", "redo", 1}, // 2935
- {wxStyledTextCtrl_SetUndoCollection, "wxStyledTextCtrl", "setUndoCollection", 2}, // 2936
- {wxStyledTextCtrl_SelectAll, "wxStyledTextCtrl", "selectAll", 1}, // 2937
- {wxStyledTextCtrl_SetSavePoint, "wxStyledTextCtrl", "setSavePoint", 1}, // 2938
- {wxStyledTextCtrl_CanRedo, "wxStyledTextCtrl", "canRedo", 1}, // 2939
- {wxStyledTextCtrl_MarkerLineFromHandle, "wxStyledTextCtrl", "markerLineFromHandle", 2}, // 2940
- {wxStyledTextCtrl_MarkerDeleteHandle, "wxStyledTextCtrl", "markerDeleteHandle", 2}, // 2941
- {wxStyledTextCtrl_GetUndoCollection, "wxStyledTextCtrl", "getUndoCollection", 1}, // 2942
- {wxStyledTextCtrl_GetViewWhiteSpace, "wxStyledTextCtrl", "getViewWhiteSpace", 1}, // 2943
- {wxStyledTextCtrl_SetViewWhiteSpace, "wxStyledTextCtrl", "setViewWhiteSpace", 2}, // 2944
- {wxStyledTextCtrl_PositionFromPoint, "wxStyledTextCtrl", "positionFromPoint", 2}, // 2945
- {wxStyledTextCtrl_PositionFromPointClose, "wxStyledTextCtrl", "positionFromPointClose", 3}, // 2946
- {wxStyledTextCtrl_GotoLine, "wxStyledTextCtrl", "gotoLine", 2}, // 2947
- {wxStyledTextCtrl_GotoPos, "wxStyledTextCtrl", "gotoPos", 2}, // 2948
- {wxStyledTextCtrl_SetAnchor, "wxStyledTextCtrl", "setAnchor", 2}, // 2949
- {wxStyledTextCtrl_GetCurLine, "wxStyledTextCtrl", "getCurLine", 1}, // 2950
- {wxStyledTextCtrl_GetEndStyled, "wxStyledTextCtrl", "getEndStyled", 1}, // 2951
- {wxStyledTextCtrl_ConvertEOLs, "wxStyledTextCtrl", "convertEOLs", 2}, // 2952
- {wxStyledTextCtrl_GetEOLMode, "wxStyledTextCtrl", "getEOLMode", 1}, // 2953
- {wxStyledTextCtrl_SetEOLMode, "wxStyledTextCtrl", "setEOLMode", 2}, // 2954
- {wxStyledTextCtrl_StartStyling, "wxStyledTextCtrl", "startStyling", 2}, // 2955
- {wxStyledTextCtrl_SetStyling, "wxStyledTextCtrl", "setStyling", 3}, // 2956
- {wxStyledTextCtrl_GetBufferedDraw, "wxStyledTextCtrl", "getBufferedDraw", 1}, // 2957
- {wxStyledTextCtrl_SetBufferedDraw, "wxStyledTextCtrl", "setBufferedDraw", 2}, // 2958
- {wxStyledTextCtrl_SetTabWidth, "wxStyledTextCtrl", "setTabWidth", 2}, // 2959
- {wxStyledTextCtrl_GetTabWidth, "wxStyledTextCtrl", "getTabWidth", 1}, // 2960
- {wxStyledTextCtrl_SetCodePage, "wxStyledTextCtrl", "setCodePage", 2}, // 2961
- {wxStyledTextCtrl_MarkerDefine, "wxStyledTextCtrl", "markerDefine", 4}, // 2962
- {wxStyledTextCtrl_MarkerSetForeground, "wxStyledTextCtrl", "markerSetForeground", 3}, // 2963
- {wxStyledTextCtrl_MarkerSetBackground, "wxStyledTextCtrl", "markerSetBackground", 3}, // 2964
- {wxStyledTextCtrl_MarkerAdd, "wxStyledTextCtrl", "markerAdd", 3}, // 2965
- {wxStyledTextCtrl_MarkerDelete, "wxStyledTextCtrl", "markerDelete", 3}, // 2966
- {wxStyledTextCtrl_MarkerDeleteAll, "wxStyledTextCtrl", "markerDeleteAll", 2}, // 2967
- {wxStyledTextCtrl_MarkerGet, "wxStyledTextCtrl", "markerGet", 2}, // 2968
- {wxStyledTextCtrl_MarkerNext, "wxStyledTextCtrl", "markerNext", 3}, // 2969
- {wxStyledTextCtrl_MarkerPrevious, "wxStyledTextCtrl", "markerPrevious", 3}, // 2970
- {wxStyledTextCtrl_MarkerDefineBitmap, "wxStyledTextCtrl", "markerDefineBitmap", 3}, // 2971
- {wxStyledTextCtrl_MarkerAddSet, "wxStyledTextCtrl", "markerAddSet", 3}, // 2972
- {wxStyledTextCtrl_MarkerSetAlpha, "wxStyledTextCtrl", "markerSetAlpha", 3}, // 2973
- {wxStyledTextCtrl_SetMarginType, "wxStyledTextCtrl", "setMarginType", 3}, // 2974
- {wxStyledTextCtrl_GetMarginType, "wxStyledTextCtrl", "getMarginType", 2}, // 2975
- {wxStyledTextCtrl_SetMarginWidth, "wxStyledTextCtrl", "setMarginWidth", 3}, // 2976
- {wxStyledTextCtrl_GetMarginWidth, "wxStyledTextCtrl", "getMarginWidth", 2}, // 2977
- {wxStyledTextCtrl_SetMarginMask, "wxStyledTextCtrl", "setMarginMask", 3}, // 2978
- {wxStyledTextCtrl_GetMarginMask, "wxStyledTextCtrl", "getMarginMask", 2}, // 2979
- {wxStyledTextCtrl_SetMarginSensitive, "wxStyledTextCtrl", "setMarginSensitive", 3}, // 2980
- {wxStyledTextCtrl_GetMarginSensitive, "wxStyledTextCtrl", "getMarginSensitive", 2}, // 2981
- {wxStyledTextCtrl_StyleClearAll, "wxStyledTextCtrl", "styleClearAll", 1}, // 2982
- {wxStyledTextCtrl_StyleSetForeground, "wxStyledTextCtrl", "styleSetForeground", 3}, // 2983
- {wxStyledTextCtrl_StyleSetBackground, "wxStyledTextCtrl", "styleSetBackground", 3}, // 2984
- {wxStyledTextCtrl_StyleSetBold, "wxStyledTextCtrl", "styleSetBold", 3}, // 2985
- {wxStyledTextCtrl_StyleSetItalic, "wxStyledTextCtrl", "styleSetItalic", 3}, // 2986
- {wxStyledTextCtrl_StyleSetSize, "wxStyledTextCtrl", "styleSetSize", 3}, // 2987
- {wxStyledTextCtrl_StyleSetFaceName, "wxStyledTextCtrl", "styleSetFaceName", 3}, // 2988
- {wxStyledTextCtrl_StyleSetEOLFilled, "wxStyledTextCtrl", "styleSetEOLFilled", 3}, // 2989
- {wxStyledTextCtrl_StyleResetDefault, "wxStyledTextCtrl", "styleResetDefault", 1}, // 2990
- {wxStyledTextCtrl_StyleSetUnderline, "wxStyledTextCtrl", "styleSetUnderline", 3}, // 2991
- {wxStyledTextCtrl_StyleSetCase, "wxStyledTextCtrl", "styleSetCase", 3}, // 2992
- {wxStyledTextCtrl_StyleSetHotSpot, "wxStyledTextCtrl", "styleSetHotSpot", 3}, // 2993
- {wxStyledTextCtrl_SetSelForeground, "wxStyledTextCtrl", "setSelForeground", 3}, // 2994
- {wxStyledTextCtrl_SetSelBackground, "wxStyledTextCtrl", "setSelBackground", 3}, // 2995
- {wxStyledTextCtrl_GetSelAlpha, "wxStyledTextCtrl", "getSelAlpha", 1}, // 2996
- {wxStyledTextCtrl_SetSelAlpha, "wxStyledTextCtrl", "setSelAlpha", 2}, // 2997
- {wxStyledTextCtrl_SetCaretForeground, "wxStyledTextCtrl", "setCaretForeground", 2}, // 2998
- {wxStyledTextCtrl_CmdKeyAssign, "wxStyledTextCtrl", "cmdKeyAssign", 4}, // 2999
- {wxStyledTextCtrl_CmdKeyClear, "wxStyledTextCtrl", "cmdKeyClear", 3}, // 3000
- {wxStyledTextCtrl_CmdKeyClearAll, "wxStyledTextCtrl", "cmdKeyClearAll", 1}, // 3001
- {wxStyledTextCtrl_SetStyleBytes, "wxStyledTextCtrl", "setStyleBytes", 2}, // 3002
- {wxStyledTextCtrl_StyleSetVisible, "wxStyledTextCtrl", "styleSetVisible", 3}, // 3003
- {wxStyledTextCtrl_GetCaretPeriod, "wxStyledTextCtrl", "getCaretPeriod", 1}, // 3004
- {wxStyledTextCtrl_SetCaretPeriod, "wxStyledTextCtrl", "setCaretPeriod", 2}, // 3005
- {wxStyledTextCtrl_SetWordChars, "wxStyledTextCtrl", "setWordChars", 2}, // 3006
- {wxStyledTextCtrl_BeginUndoAction, "wxStyledTextCtrl", "beginUndoAction", 1}, // 3007
- {wxStyledTextCtrl_EndUndoAction, "wxStyledTextCtrl", "endUndoAction", 1}, // 3008
- {wxStyledTextCtrl_IndicatorSetStyle, "wxStyledTextCtrl", "indicatorSetStyle", 3}, // 3009
- {wxStyledTextCtrl_IndicatorGetStyle, "wxStyledTextCtrl", "indicatorGetStyle", 2}, // 3010
- {wxStyledTextCtrl_IndicatorSetForeground, "wxStyledTextCtrl", "indicatorSetForeground", 3}, // 3011
- {wxStyledTextCtrl_IndicatorGetForeground, "wxStyledTextCtrl", "indicatorGetForeground", 2}, // 3012
- {wxStyledTextCtrl_SetWhitespaceForeground, "wxStyledTextCtrl", "setWhitespaceForeground", 3}, // 3013
- {wxStyledTextCtrl_SetWhitespaceBackground, "wxStyledTextCtrl", "setWhitespaceBackground", 3}, // 3014
- {wxStyledTextCtrl_GetStyleBits, "wxStyledTextCtrl", "getStyleBits", 1}, // 3015
- {wxStyledTextCtrl_SetLineState, "wxStyledTextCtrl", "setLineState", 3}, // 3016
- {wxStyledTextCtrl_GetLineState, "wxStyledTextCtrl", "getLineState", 2}, // 3017
- {wxStyledTextCtrl_GetMaxLineState, "wxStyledTextCtrl", "getMaxLineState", 1}, // 3018
- {wxStyledTextCtrl_GetCaretLineVisible, "wxStyledTextCtrl", "getCaretLineVisible", 1}, // 3019
- {wxStyledTextCtrl_SetCaretLineVisible, "wxStyledTextCtrl", "setCaretLineVisible", 2}, // 3020
- {wxStyledTextCtrl_GetCaretLineBackground, "wxStyledTextCtrl", "getCaretLineBackground", 1}, // 3021
- {wxStyledTextCtrl_SetCaretLineBackground, "wxStyledTextCtrl", "setCaretLineBackground", 2}, // 3022
- {wxStyledTextCtrl_AutoCompShow, "wxStyledTextCtrl", "autoCompShow", 3}, // 3023
- {wxStyledTextCtrl_AutoCompCancel, "wxStyledTextCtrl", "autoCompCancel", 1}, // 3024
- {wxStyledTextCtrl_AutoCompActive, "wxStyledTextCtrl", "autoCompActive", 1}, // 3025
- {wxStyledTextCtrl_AutoCompPosStart, "wxStyledTextCtrl", "autoCompPosStart", 1}, // 3026
- {wxStyledTextCtrl_AutoCompComplete, "wxStyledTextCtrl", "autoCompComplete", 1}, // 3027
- {wxStyledTextCtrl_AutoCompStops, "wxStyledTextCtrl", "autoCompStops", 2}, // 3028
- {wxStyledTextCtrl_AutoCompSetSeparator, "wxStyledTextCtrl", "autoCompSetSeparator", 2}, // 3029
- {wxStyledTextCtrl_AutoCompGetSeparator, "wxStyledTextCtrl", "autoCompGetSeparator", 1}, // 3030
- {wxStyledTextCtrl_AutoCompSelect, "wxStyledTextCtrl", "autoCompSelect", 2}, // 3031
- {wxStyledTextCtrl_AutoCompSetCancelAtStart, "wxStyledTextCtrl", "autoCompSetCancelAtStart", 2}, // 3032
- {wxStyledTextCtrl_AutoCompGetCancelAtStart, "wxStyledTextCtrl", "autoCompGetCancelAtStart", 1}, // 3033
- {wxStyledTextCtrl_AutoCompSetFillUps, "wxStyledTextCtrl", "autoCompSetFillUps", 2}, // 3034
- {wxStyledTextCtrl_AutoCompSetChooseSingle, "wxStyledTextCtrl", "autoCompSetChooseSingle", 2}, // 3035
- {wxStyledTextCtrl_AutoCompGetChooseSingle, "wxStyledTextCtrl", "autoCompGetChooseSingle", 1}, // 3036
- {wxStyledTextCtrl_AutoCompSetIgnoreCase, "wxStyledTextCtrl", "autoCompSetIgnoreCase", 2}, // 3037
- {wxStyledTextCtrl_AutoCompGetIgnoreCase, "wxStyledTextCtrl", "autoCompGetIgnoreCase", 1}, // 3038
- {wxStyledTextCtrl_UserListShow, "wxStyledTextCtrl", "userListShow", 3}, // 3039
- {wxStyledTextCtrl_AutoCompSetAutoHide, "wxStyledTextCtrl", "autoCompSetAutoHide", 2}, // 3040
- {wxStyledTextCtrl_AutoCompGetAutoHide, "wxStyledTextCtrl", "autoCompGetAutoHide", 1}, // 3041
- {wxStyledTextCtrl_AutoCompSetDropRestOfWord, "wxStyledTextCtrl", "autoCompSetDropRestOfWord", 2}, // 3042
- {wxStyledTextCtrl_AutoCompGetDropRestOfWord, "wxStyledTextCtrl", "autoCompGetDropRestOfWord", 1}, // 3043
- {wxStyledTextCtrl_RegisterImage, "wxStyledTextCtrl", "registerImage", 3}, // 3044
- {wxStyledTextCtrl_ClearRegisteredImages, "wxStyledTextCtrl", "clearRegisteredImages", 1}, // 3045
- {wxStyledTextCtrl_AutoCompGetTypeSeparator, "wxStyledTextCtrl", "autoCompGetTypeSeparator", 1}, // 3046
- {wxStyledTextCtrl_AutoCompSetTypeSeparator, "wxStyledTextCtrl", "autoCompSetTypeSeparator", 2}, // 3047
- {wxStyledTextCtrl_AutoCompSetMaxWidth, "wxStyledTextCtrl", "autoCompSetMaxWidth", 2}, // 3048
- {wxStyledTextCtrl_AutoCompGetMaxWidth, "wxStyledTextCtrl", "autoCompGetMaxWidth", 1}, // 3049
- {wxStyledTextCtrl_AutoCompSetMaxHeight, "wxStyledTextCtrl", "autoCompSetMaxHeight", 2}, // 3050
- {wxStyledTextCtrl_AutoCompGetMaxHeight, "wxStyledTextCtrl", "autoCompGetMaxHeight", 1}, // 3051
- {wxStyledTextCtrl_SetIndent, "wxStyledTextCtrl", "setIndent", 2}, // 3052
- {wxStyledTextCtrl_GetIndent, "wxStyledTextCtrl", "getIndent", 1}, // 3053
- {wxStyledTextCtrl_SetUseTabs, "wxStyledTextCtrl", "setUseTabs", 2}, // 3054
- {wxStyledTextCtrl_GetUseTabs, "wxStyledTextCtrl", "getUseTabs", 1}, // 3055
- {wxStyledTextCtrl_SetLineIndentation, "wxStyledTextCtrl", "setLineIndentation", 3}, // 3056
- {wxStyledTextCtrl_GetLineIndentation, "wxStyledTextCtrl", "getLineIndentation", 2}, // 3057
- {wxStyledTextCtrl_GetLineIndentPosition, "wxStyledTextCtrl", "getLineIndentPosition", 2}, // 3058
- {wxStyledTextCtrl_GetColumn, "wxStyledTextCtrl", "getColumn", 2}, // 3059
- {wxStyledTextCtrl_SetUseHorizontalScrollBar, "wxStyledTextCtrl", "setUseHorizontalScrollBar", 2}, // 3060
- {wxStyledTextCtrl_GetUseHorizontalScrollBar, "wxStyledTextCtrl", "getUseHorizontalScrollBar", 1}, // 3061
- {wxStyledTextCtrl_SetIndentationGuides, "wxStyledTextCtrl", "setIndentationGuides", 2}, // 3062
- {wxStyledTextCtrl_GetIndentationGuides, "wxStyledTextCtrl", "getIndentationGuides", 1}, // 3063
- {wxStyledTextCtrl_SetHighlightGuide, "wxStyledTextCtrl", "setHighlightGuide", 2}, // 3064
- {wxStyledTextCtrl_GetHighlightGuide, "wxStyledTextCtrl", "getHighlightGuide", 1}, // 3065
- {wxStyledTextCtrl_GetLineEndPosition, "wxStyledTextCtrl", "getLineEndPosition", 2}, // 3066
- {wxStyledTextCtrl_GetCodePage, "wxStyledTextCtrl", "getCodePage", 1}, // 3067
- {wxStyledTextCtrl_GetCaretForeground, "wxStyledTextCtrl", "getCaretForeground", 1}, // 3068
- {wxStyledTextCtrl_GetReadOnly, "wxStyledTextCtrl", "getReadOnly", 1}, // 3069
- {wxStyledTextCtrl_SetCurrentPos, "wxStyledTextCtrl", "setCurrentPos", 2}, // 3070
- {wxStyledTextCtrl_SetSelectionStart, "wxStyledTextCtrl", "setSelectionStart", 2}, // 3071
- {wxStyledTextCtrl_GetSelectionStart, "wxStyledTextCtrl", "getSelectionStart", 1}, // 3072
- {wxStyledTextCtrl_SetSelectionEnd, "wxStyledTextCtrl", "setSelectionEnd", 2}, // 3073
- {wxStyledTextCtrl_GetSelectionEnd, "wxStyledTextCtrl", "getSelectionEnd", 1}, // 3074
- {wxStyledTextCtrl_SetPrintMagnification, "wxStyledTextCtrl", "setPrintMagnification", 2}, // 3075
- {wxStyledTextCtrl_GetPrintMagnification, "wxStyledTextCtrl", "getPrintMagnification", 1}, // 3076
- {wxStyledTextCtrl_SetPrintColourMode, "wxStyledTextCtrl", "setPrintColourMode", 2}, // 3077
- {wxStyledTextCtrl_GetPrintColourMode, "wxStyledTextCtrl", "getPrintColourMode", 1}, // 3078
- {wxStyledTextCtrl_FindText, "wxStyledTextCtrl", "findText", 5}, // 3079
- {wxStyledTextCtrl_FormatRange, "wxStyledTextCtrl", "formatRange", 8}, // 3080
- {wxStyledTextCtrl_GetFirstVisibleLine, "wxStyledTextCtrl", "getFirstVisibleLine", 1}, // 3081
- {wxStyledTextCtrl_GetLine, "wxStyledTextCtrl", "getLine", 2}, // 3082
- {wxStyledTextCtrl_GetLineCount, "wxStyledTextCtrl", "getLineCount", 1}, // 3083
- {wxStyledTextCtrl_SetMarginLeft, "wxStyledTextCtrl", "setMarginLeft", 2}, // 3084
- {wxStyledTextCtrl_GetMarginLeft, "wxStyledTextCtrl", "getMarginLeft", 1}, // 3085
- {wxStyledTextCtrl_SetMarginRight, "wxStyledTextCtrl", "setMarginRight", 2}, // 3086
- {wxStyledTextCtrl_GetMarginRight, "wxStyledTextCtrl", "getMarginRight", 1}, // 3087
- {wxStyledTextCtrl_GetModify, "wxStyledTextCtrl", "getModify", 1}, // 3088
- {wxStyledTextCtrl_SetSelection, "wxStyledTextCtrl", "setSelection", 3}, // 3089
- {wxStyledTextCtrl_GetSelectedText, "wxStyledTextCtrl", "getSelectedText", 1}, // 3090
- {wxStyledTextCtrl_GetTextRange, "wxStyledTextCtrl", "getTextRange", 3}, // 3091
- {wxStyledTextCtrl_HideSelection, "wxStyledTextCtrl", "hideSelection", 2}, // 3092
- {wxStyledTextCtrl_LineFromPosition, "wxStyledTextCtrl", "lineFromPosition", 2}, // 3093
- {wxStyledTextCtrl_PositionFromLine, "wxStyledTextCtrl", "positionFromLine", 2}, // 3094
- {wxStyledTextCtrl_LineScroll, "wxStyledTextCtrl", "lineScroll", 3}, // 3095
- {wxStyledTextCtrl_EnsureCaretVisible, "wxStyledTextCtrl", "ensureCaretVisible", 1}, // 3096
- {wxStyledTextCtrl_ReplaceSelection, "wxStyledTextCtrl", "replaceSelection", 2}, // 3097
- {wxStyledTextCtrl_SetReadOnly, "wxStyledTextCtrl", "setReadOnly", 2}, // 3098
- {wxStyledTextCtrl_CanPaste, "wxStyledTextCtrl", "canPaste", 1}, // 3099
- {wxStyledTextCtrl_CanUndo, "wxStyledTextCtrl", "canUndo", 1}, // 3100
- {wxStyledTextCtrl_EmptyUndoBuffer, "wxStyledTextCtrl", "emptyUndoBuffer", 1}, // 3101
- {wxStyledTextCtrl_Undo, "wxStyledTextCtrl", "undo", 1}, // 3102
- {wxStyledTextCtrl_Cut, "wxStyledTextCtrl", "cut", 1}, // 3103
- {wxStyledTextCtrl_Copy, "wxStyledTextCtrl", "copy", 1}, // 3104
- {wxStyledTextCtrl_Paste, "wxStyledTextCtrl", "paste", 1}, // 3105
- {wxStyledTextCtrl_Clear, "wxStyledTextCtrl", "clear", 1}, // 3106
- {wxStyledTextCtrl_SetText, "wxStyledTextCtrl", "setText", 2}, // 3107
- {wxStyledTextCtrl_GetText, "wxStyledTextCtrl", "getText", 1}, // 3108
- {wxStyledTextCtrl_GetTextLength, "wxStyledTextCtrl", "getTextLength", 1}, // 3109
- {wxStyledTextCtrl_GetOvertype, "wxStyledTextCtrl", "getOvertype", 1}, // 3110
- {wxStyledTextCtrl_SetCaretWidth, "wxStyledTextCtrl", "setCaretWidth", 2}, // 3111
- {wxStyledTextCtrl_GetCaretWidth, "wxStyledTextCtrl", "getCaretWidth", 1}, // 3112
- {wxStyledTextCtrl_SetTargetStart, "wxStyledTextCtrl", "setTargetStart", 2}, // 3113
- {wxStyledTextCtrl_GetTargetStart, "wxStyledTextCtrl", "getTargetStart", 1}, // 3114
- {wxStyledTextCtrl_SetTargetEnd, "wxStyledTextCtrl", "setTargetEnd", 2}, // 3115
- {wxStyledTextCtrl_GetTargetEnd, "wxStyledTextCtrl", "getTargetEnd", 1}, // 3116
- {wxStyledTextCtrl_ReplaceTarget, "wxStyledTextCtrl", "replaceTarget", 2}, // 3117
- {wxStyledTextCtrl_SearchInTarget, "wxStyledTextCtrl", "searchInTarget", 2}, // 3118
- {wxStyledTextCtrl_SetSearchFlags, "wxStyledTextCtrl", "setSearchFlags", 2}, // 3119
- {wxStyledTextCtrl_GetSearchFlags, "wxStyledTextCtrl", "getSearchFlags", 1}, // 3120
- {wxStyledTextCtrl_CallTipShow, "wxStyledTextCtrl", "callTipShow", 3}, // 3121
- {wxStyledTextCtrl_CallTipCancel, "wxStyledTextCtrl", "callTipCancel", 1}, // 3122
- {wxStyledTextCtrl_CallTipActive, "wxStyledTextCtrl", "callTipActive", 1}, // 3123
- {wxStyledTextCtrl_CallTipPosAtStart, "wxStyledTextCtrl", "callTipPosAtStart", 1}, // 3124
- {wxStyledTextCtrl_CallTipSetHighlight, "wxStyledTextCtrl", "callTipSetHighlight", 3}, // 3125
- {wxStyledTextCtrl_CallTipSetBackground, "wxStyledTextCtrl", "callTipSetBackground", 2}, // 3126
- {wxStyledTextCtrl_CallTipSetForeground, "wxStyledTextCtrl", "callTipSetForeground", 2}, // 3127
- {wxStyledTextCtrl_CallTipSetForegroundHighlight, "wxStyledTextCtrl", "callTipSetForegroundHighlight", 2}, // 3128
- {wxStyledTextCtrl_CallTipUseStyle, "wxStyledTextCtrl", "callTipUseStyle", 2}, // 3129
- {wxStyledTextCtrl_VisibleFromDocLine, "wxStyledTextCtrl", "visibleFromDocLine", 2}, // 3130
- {wxStyledTextCtrl_DocLineFromVisible, "wxStyledTextCtrl", "docLineFromVisible", 2}, // 3131
- {wxStyledTextCtrl_WrapCount, "wxStyledTextCtrl", "wrapCount", 2}, // 3132
- {wxStyledTextCtrl_SetFoldLevel, "wxStyledTextCtrl", "setFoldLevel", 3}, // 3133
- {wxStyledTextCtrl_GetFoldLevel, "wxStyledTextCtrl", "getFoldLevel", 2}, // 3134
- {wxStyledTextCtrl_GetLastChild, "wxStyledTextCtrl", "getLastChild", 3}, // 3135
- {wxStyledTextCtrl_GetFoldParent, "wxStyledTextCtrl", "getFoldParent", 2}, // 3136
- {wxStyledTextCtrl_ShowLines, "wxStyledTextCtrl", "showLines", 3}, // 3137
- {wxStyledTextCtrl_HideLines, "wxStyledTextCtrl", "hideLines", 3}, // 3138
- {wxStyledTextCtrl_GetLineVisible, "wxStyledTextCtrl", "getLineVisible", 2}, // 3139
- {wxStyledTextCtrl_SetFoldExpanded, "wxStyledTextCtrl", "setFoldExpanded", 3}, // 3140
- {wxStyledTextCtrl_GetFoldExpanded, "wxStyledTextCtrl", "getFoldExpanded", 2}, // 3141
- {wxStyledTextCtrl_ToggleFold, "wxStyledTextCtrl", "toggleFold", 2}, // 3142
- {wxStyledTextCtrl_EnsureVisible, "wxStyledTextCtrl", "ensureVisible", 2}, // 3143
- {wxStyledTextCtrl_SetFoldFlags, "wxStyledTextCtrl", "setFoldFlags", 2}, // 3144
- {wxStyledTextCtrl_EnsureVisibleEnforcePolicy, "wxStyledTextCtrl", "ensureVisibleEnforcePolicy", 2}, // 3145
- {wxStyledTextCtrl_SetTabIndents, "wxStyledTextCtrl", "setTabIndents", 2}, // 3146
- {wxStyledTextCtrl_GetTabIndents, "wxStyledTextCtrl", "getTabIndents", 1}, // 3147
- {wxStyledTextCtrl_SetBackSpaceUnIndents, "wxStyledTextCtrl", "setBackSpaceUnIndents", 2}, // 3148
- {wxStyledTextCtrl_GetBackSpaceUnIndents, "wxStyledTextCtrl", "getBackSpaceUnIndents", 1}, // 3149
- {wxStyledTextCtrl_SetMouseDwellTime, "wxStyledTextCtrl", "setMouseDwellTime", 2}, // 3150
- {wxStyledTextCtrl_GetMouseDwellTime, "wxStyledTextCtrl", "getMouseDwellTime", 1}, // 3151
- {wxStyledTextCtrl_WordStartPosition, "wxStyledTextCtrl", "wordStartPosition", 3}, // 3152
- {wxStyledTextCtrl_WordEndPosition, "wxStyledTextCtrl", "wordEndPosition", 3}, // 3153
- {wxStyledTextCtrl_SetWrapMode, "wxStyledTextCtrl", "setWrapMode", 2}, // 3154
- {wxStyledTextCtrl_GetWrapMode, "wxStyledTextCtrl", "getWrapMode", 1}, // 3155
- {wxStyledTextCtrl_SetWrapVisualFlags, "wxStyledTextCtrl", "setWrapVisualFlags", 2}, // 3156
- {wxStyledTextCtrl_GetWrapVisualFlags, "wxStyledTextCtrl", "getWrapVisualFlags", 1}, // 3157
- {wxStyledTextCtrl_SetWrapVisualFlagsLocation, "wxStyledTextCtrl", "setWrapVisualFlagsLocation", 2}, // 3158
- {wxStyledTextCtrl_GetWrapVisualFlagsLocation, "wxStyledTextCtrl", "getWrapVisualFlagsLocation", 1}, // 3159
- {wxStyledTextCtrl_SetWrapStartIndent, "wxStyledTextCtrl", "setWrapStartIndent", 2}, // 3160
- {wxStyledTextCtrl_GetWrapStartIndent, "wxStyledTextCtrl", "getWrapStartIndent", 1}, // 3161
- {wxStyledTextCtrl_SetLayoutCache, "wxStyledTextCtrl", "setLayoutCache", 2}, // 3162
- {wxStyledTextCtrl_GetLayoutCache, "wxStyledTextCtrl", "getLayoutCache", 1}, // 3163
- {wxStyledTextCtrl_SetScrollWidth, "wxStyledTextCtrl", "setScrollWidth", 2}, // 3164
- {wxStyledTextCtrl_GetScrollWidth, "wxStyledTextCtrl", "getScrollWidth", 1}, // 3165
- {wxStyledTextCtrl_TextWidth, "wxStyledTextCtrl", "textWidth", 3}, // 3166
- {wxStyledTextCtrl_GetEndAtLastLine, "wxStyledTextCtrl", "getEndAtLastLine", 1}, // 3167
- {wxStyledTextCtrl_TextHeight, "wxStyledTextCtrl", "textHeight", 2}, // 3168
- {wxStyledTextCtrl_SetUseVerticalScrollBar, "wxStyledTextCtrl", "setUseVerticalScrollBar", 2}, // 3169
- {wxStyledTextCtrl_GetUseVerticalScrollBar, "wxStyledTextCtrl", "getUseVerticalScrollBar", 1}, // 3170
- {wxStyledTextCtrl_AppendText, "wxStyledTextCtrl", "appendText", 2}, // 3171
- {wxStyledTextCtrl_GetTwoPhaseDraw, "wxStyledTextCtrl", "getTwoPhaseDraw", 1}, // 3172
- {wxStyledTextCtrl_SetTwoPhaseDraw, "wxStyledTextCtrl", "setTwoPhaseDraw", 2}, // 3173
- {wxStyledTextCtrl_TargetFromSelection, "wxStyledTextCtrl", "targetFromSelection", 1}, // 3174
- {wxStyledTextCtrl_LinesJoin, "wxStyledTextCtrl", "linesJoin", 1}, // 3175
- {wxStyledTextCtrl_LinesSplit, "wxStyledTextCtrl", "linesSplit", 2}, // 3176
- {wxStyledTextCtrl_SetFoldMarginColour, "wxStyledTextCtrl", "setFoldMarginColour", 3}, // 3177
- {wxStyledTextCtrl_SetFoldMarginHiColour, "wxStyledTextCtrl", "setFoldMarginHiColour", 3}, // 3178
- {wxStyledTextCtrl_LineDown, "wxStyledTextCtrl", "lineDown", 1}, // 3179
- {wxStyledTextCtrl_LineDownExtend, "wxStyledTextCtrl", "lineDownExtend", 1}, // 3180
- {wxStyledTextCtrl_LineUp, "wxStyledTextCtrl", "lineUp", 1}, // 3181
- {wxStyledTextCtrl_LineUpExtend, "wxStyledTextCtrl", "lineUpExtend", 1}, // 3182
- {wxStyledTextCtrl_CharLeft, "wxStyledTextCtrl", "charLeft", 1}, // 3183
- {wxStyledTextCtrl_CharLeftExtend, "wxStyledTextCtrl", "charLeftExtend", 1}, // 3184
- {wxStyledTextCtrl_CharRight, "wxStyledTextCtrl", "charRight", 1}, // 3185
- {wxStyledTextCtrl_CharRightExtend, "wxStyledTextCtrl", "charRightExtend", 1}, // 3186
- {wxStyledTextCtrl_WordLeft, "wxStyledTextCtrl", "wordLeft", 1}, // 3187
- {wxStyledTextCtrl_WordLeftExtend, "wxStyledTextCtrl", "wordLeftExtend", 1}, // 3188
- {wxStyledTextCtrl_WordRight, "wxStyledTextCtrl", "wordRight", 1}, // 3189
- {wxStyledTextCtrl_WordRightExtend, "wxStyledTextCtrl", "wordRightExtend", 1}, // 3190
- {wxStyledTextCtrl_Home, "wxStyledTextCtrl", "home", 1}, // 3191
- {wxStyledTextCtrl_HomeExtend, "wxStyledTextCtrl", "homeExtend", 1}, // 3192
- {wxStyledTextCtrl_LineEnd, "wxStyledTextCtrl", "lineEnd", 1}, // 3193
- {wxStyledTextCtrl_LineEndExtend, "wxStyledTextCtrl", "lineEndExtend", 1}, // 3194
- {wxStyledTextCtrl_DocumentStart, "wxStyledTextCtrl", "documentStart", 1}, // 3195
- {wxStyledTextCtrl_DocumentStartExtend, "wxStyledTextCtrl", "documentStartExtend", 1}, // 3196
- {wxStyledTextCtrl_DocumentEnd, "wxStyledTextCtrl", "documentEnd", 1}, // 3197
- {wxStyledTextCtrl_DocumentEndExtend, "wxStyledTextCtrl", "documentEndExtend", 1}, // 3198
- {wxStyledTextCtrl_PageUp, "wxStyledTextCtrl", "pageUp", 1}, // 3199
- {wxStyledTextCtrl_PageUpExtend, "wxStyledTextCtrl", "pageUpExtend", 1}, // 3200
- {wxStyledTextCtrl_PageDown, "wxStyledTextCtrl", "pageDown", 1}, // 3201
- {wxStyledTextCtrl_PageDownExtend, "wxStyledTextCtrl", "pageDownExtend", 1}, // 3202
- {wxStyledTextCtrl_EditToggleOvertype, "wxStyledTextCtrl", "editToggleOvertype", 1}, // 3203
- {wxStyledTextCtrl_Cancel, "wxStyledTextCtrl", "cancel", 1}, // 3204
- {wxStyledTextCtrl_DeleteBack, "wxStyledTextCtrl", "deleteBack", 1}, // 3205
- {wxStyledTextCtrl_Tab, "wxStyledTextCtrl", "tab", 1}, // 3206
- {wxStyledTextCtrl_BackTab, "wxStyledTextCtrl", "backTab", 1}, // 3207
- {wxStyledTextCtrl_NewLine, "wxStyledTextCtrl", "newLine", 1}, // 3208
- {wxStyledTextCtrl_FormFeed, "wxStyledTextCtrl", "formFeed", 1}, // 3209
- {wxStyledTextCtrl_VCHome, "wxStyledTextCtrl", "vCHome", 1}, // 3210
- {wxStyledTextCtrl_VCHomeExtend, "wxStyledTextCtrl", "vCHomeExtend", 1}, // 3211
- {wxStyledTextCtrl_ZoomIn, "wxStyledTextCtrl", "zoomIn", 1}, // 3212
- {wxStyledTextCtrl_ZoomOut, "wxStyledTextCtrl", "zoomOut", 1}, // 3213
- {wxStyledTextCtrl_DelWordLeft, "wxStyledTextCtrl", "delWordLeft", 1}, // 3214
- {wxStyledTextCtrl_DelWordRight, "wxStyledTextCtrl", "delWordRight", 1}, // 3215
- {wxStyledTextCtrl_LineCut, "wxStyledTextCtrl", "lineCut", 1}, // 3216
- {wxStyledTextCtrl_LineDelete, "wxStyledTextCtrl", "lineDelete", 1}, // 3217
- {wxStyledTextCtrl_LineTranspose, "wxStyledTextCtrl", "lineTranspose", 1}, // 3218
- {wxStyledTextCtrl_LineDuplicate, "wxStyledTextCtrl", "lineDuplicate", 1}, // 3219
- {wxStyledTextCtrl_LowerCase, "wxStyledTextCtrl", "lowerCase", 1}, // 3220
- {wxStyledTextCtrl_UpperCase, "wxStyledTextCtrl", "upperCase", 1}, // 3221
- {wxStyledTextCtrl_LineScrollDown, "wxStyledTextCtrl", "lineScrollDown", 1}, // 3222
- {wxStyledTextCtrl_LineScrollUp, "wxStyledTextCtrl", "lineScrollUp", 1}, // 3223
- {wxStyledTextCtrl_DeleteBackNotLine, "wxStyledTextCtrl", "deleteBackNotLine", 1}, // 3224
- {wxStyledTextCtrl_HomeDisplay, "wxStyledTextCtrl", "homeDisplay", 1}, // 3225
- {wxStyledTextCtrl_HomeDisplayExtend, "wxStyledTextCtrl", "homeDisplayExtend", 1}, // 3226
- {wxStyledTextCtrl_LineEndDisplay, "wxStyledTextCtrl", "lineEndDisplay", 1}, // 3227
- {wxStyledTextCtrl_LineEndDisplayExtend, "wxStyledTextCtrl", "lineEndDisplayExtend", 1}, // 3228
- {wxStyledTextCtrl_HomeWrapExtend, "wxStyledTextCtrl", "homeWrapExtend", 1}, // 3229
- {wxStyledTextCtrl_LineEndWrap, "wxStyledTextCtrl", "lineEndWrap", 1}, // 3230
- {wxStyledTextCtrl_LineEndWrapExtend, "wxStyledTextCtrl", "lineEndWrapExtend", 1}, // 3231
- {wxStyledTextCtrl_VCHomeWrap, "wxStyledTextCtrl", "vCHomeWrap", 1}, // 3232
- {wxStyledTextCtrl_VCHomeWrapExtend, "wxStyledTextCtrl", "vCHomeWrapExtend", 1}, // 3233
- {wxStyledTextCtrl_LineCopy, "wxStyledTextCtrl", "lineCopy", 1}, // 3234
- {wxStyledTextCtrl_MoveCaretInsideView, "wxStyledTextCtrl", "moveCaretInsideView", 1}, // 3235
- {wxStyledTextCtrl_LineLength, "wxStyledTextCtrl", "lineLength", 2}, // 3236
- {wxStyledTextCtrl_BraceHighlight, "wxStyledTextCtrl", "braceHighlight", 3}, // 3237
- {wxStyledTextCtrl_BraceBadLight, "wxStyledTextCtrl", "braceBadLight", 2}, // 3238
- {wxStyledTextCtrl_BraceMatch, "wxStyledTextCtrl", "braceMatch", 2}, // 3239
- {wxStyledTextCtrl_GetViewEOL, "wxStyledTextCtrl", "getViewEOL", 1}, // 3240
- {wxStyledTextCtrl_SetViewEOL, "wxStyledTextCtrl", "setViewEOL", 2}, // 3241
- {wxStyledTextCtrl_SetModEventMask, "wxStyledTextCtrl", "setModEventMask", 2}, // 3242
- {wxStyledTextCtrl_GetEdgeColumn, "wxStyledTextCtrl", "getEdgeColumn", 1}, // 3243
- {wxStyledTextCtrl_SetEdgeColumn, "wxStyledTextCtrl", "setEdgeColumn", 2}, // 3244
- {wxStyledTextCtrl_SetEdgeMode, "wxStyledTextCtrl", "setEdgeMode", 2}, // 3245
- {wxStyledTextCtrl_GetEdgeMode, "wxStyledTextCtrl", "getEdgeMode", 1}, // 3246
- {wxStyledTextCtrl_GetEdgeColour, "wxStyledTextCtrl", "getEdgeColour", 1}, // 3247
- {wxStyledTextCtrl_SetEdgeColour, "wxStyledTextCtrl", "setEdgeColour", 2}, // 3248
- {wxStyledTextCtrl_SearchAnchor, "wxStyledTextCtrl", "searchAnchor", 1}, // 3249
- {wxStyledTextCtrl_SearchNext, "wxStyledTextCtrl", "searchNext", 3}, // 3250
- {wxStyledTextCtrl_SearchPrev, "wxStyledTextCtrl", "searchPrev", 3}, // 3251
- {wxStyledTextCtrl_LinesOnScreen, "wxStyledTextCtrl", "linesOnScreen", 1}, // 3252
- {wxStyledTextCtrl_UsePopUp, "wxStyledTextCtrl", "usePopUp", 2}, // 3253
- {wxStyledTextCtrl_SelectionIsRectangle, "wxStyledTextCtrl", "selectionIsRectangle", 1}, // 3254
- {wxStyledTextCtrl_SetZoom, "wxStyledTextCtrl", "setZoom", 2}, // 3255
- {wxStyledTextCtrl_GetZoom, "wxStyledTextCtrl", "getZoom", 1}, // 3256
- {wxStyledTextCtrl_GetModEventMask, "wxStyledTextCtrl", "getModEventMask", 1}, // 3257
- {wxStyledTextCtrl_SetSTCFocus, "wxStyledTextCtrl", "setSTCFocus", 2}, // 3258
- {wxStyledTextCtrl_GetSTCFocus, "wxStyledTextCtrl", "getSTCFocus", 1}, // 3259
- {wxStyledTextCtrl_SetStatus, "wxStyledTextCtrl", "setStatus", 2}, // 3260
- {wxStyledTextCtrl_GetStatus, "wxStyledTextCtrl", "getStatus", 1}, // 3261
- {wxStyledTextCtrl_SetMouseDownCaptures, "wxStyledTextCtrl", "setMouseDownCaptures", 2}, // 3262
- {wxStyledTextCtrl_GetMouseDownCaptures, "wxStyledTextCtrl", "getMouseDownCaptures", 1}, // 3263
- {wxStyledTextCtrl_SetSTCCursor, "wxStyledTextCtrl", "setSTCCursor", 2}, // 3264
- {wxStyledTextCtrl_GetSTCCursor, "wxStyledTextCtrl", "getSTCCursor", 1}, // 3265
- {wxStyledTextCtrl_SetControlCharSymbol, "wxStyledTextCtrl", "setControlCharSymbol", 2}, // 3266
- {wxStyledTextCtrl_GetControlCharSymbol, "wxStyledTextCtrl", "getControlCharSymbol", 1}, // 3267
- {wxStyledTextCtrl_WordPartLeft, "wxStyledTextCtrl", "wordPartLeft", 1}, // 3268
- {wxStyledTextCtrl_WordPartLeftExtend, "wxStyledTextCtrl", "wordPartLeftExtend", 1}, // 3269
- {wxStyledTextCtrl_WordPartRight, "wxStyledTextCtrl", "wordPartRight", 1}, // 3270
- {wxStyledTextCtrl_WordPartRightExtend, "wxStyledTextCtrl", "wordPartRightExtend", 1}, // 3271
- {wxStyledTextCtrl_SetVisiblePolicy, "wxStyledTextCtrl", "setVisiblePolicy", 3}, // 3272
- {wxStyledTextCtrl_DelLineLeft, "wxStyledTextCtrl", "delLineLeft", 1}, // 3273
- {wxStyledTextCtrl_DelLineRight, "wxStyledTextCtrl", "delLineRight", 1}, // 3274
- {wxStyledTextCtrl_GetXOffset, "wxStyledTextCtrl", "getXOffset", 1}, // 3275
- {wxStyledTextCtrl_ChooseCaretX, "wxStyledTextCtrl", "chooseCaretX", 1}, // 3276
- {wxStyledTextCtrl_SetXCaretPolicy, "wxStyledTextCtrl", "setXCaretPolicy", 3}, // 3277
- {wxStyledTextCtrl_SetYCaretPolicy, "wxStyledTextCtrl", "setYCaretPolicy", 3}, // 3278
- {wxStyledTextCtrl_GetPrintWrapMode, "wxStyledTextCtrl", "getPrintWrapMode", 1}, // 3279
- {wxStyledTextCtrl_SetHotspotActiveForeground, "wxStyledTextCtrl", "setHotspotActiveForeground", 3}, // 3280
- {wxStyledTextCtrl_SetHotspotActiveBackground, "wxStyledTextCtrl", "setHotspotActiveBackground", 3}, // 3281
- {wxStyledTextCtrl_SetHotspotActiveUnderline, "wxStyledTextCtrl", "setHotspotActiveUnderline", 2}, // 3282
- {wxStyledTextCtrl_SetHotspotSingleLine, "wxStyledTextCtrl", "setHotspotSingleLine", 2}, // 3283
- {wxStyledTextCtrl_ParaDownExtend, "wxStyledTextCtrl", "paraDownExtend", 1}, // 3284
- {wxStyledTextCtrl_ParaUp, "wxStyledTextCtrl", "paraUp", 1}, // 3285
- {wxStyledTextCtrl_ParaUpExtend, "wxStyledTextCtrl", "paraUpExtend", 1}, // 3286
- {wxStyledTextCtrl_PositionBefore, "wxStyledTextCtrl", "positionBefore", 2}, // 3287
- {wxStyledTextCtrl_PositionAfter, "wxStyledTextCtrl", "positionAfter", 2}, // 3288
- {wxStyledTextCtrl_CopyRange, "wxStyledTextCtrl", "copyRange", 3}, // 3289
- {wxStyledTextCtrl_CopyText, "wxStyledTextCtrl", "copyText", 3}, // 3290
- {wxStyledTextCtrl_SetSelectionMode, "wxStyledTextCtrl", "setSelectionMode", 2}, // 3291
- {wxStyledTextCtrl_GetSelectionMode, "wxStyledTextCtrl", "getSelectionMode", 1}, // 3292
- {wxStyledTextCtrl_LineDownRectExtend, "wxStyledTextCtrl", "lineDownRectExtend", 1}, // 3293
- {wxStyledTextCtrl_LineUpRectExtend, "wxStyledTextCtrl", "lineUpRectExtend", 1}, // 3294
- {wxStyledTextCtrl_CharLeftRectExtend, "wxStyledTextCtrl", "charLeftRectExtend", 1}, // 3295
- {wxStyledTextCtrl_CharRightRectExtend, "wxStyledTextCtrl", "charRightRectExtend", 1}, // 3296
- {wxStyledTextCtrl_HomeRectExtend, "wxStyledTextCtrl", "homeRectExtend", 1}, // 3297
- {wxStyledTextCtrl_VCHomeRectExtend, "wxStyledTextCtrl", "vCHomeRectExtend", 1}, // 3298
- {wxStyledTextCtrl_LineEndRectExtend, "wxStyledTextCtrl", "lineEndRectExtend", 1}, // 3299
- {wxStyledTextCtrl_PageUpRectExtend, "wxStyledTextCtrl", "pageUpRectExtend", 1}, // 3300
- {wxStyledTextCtrl_PageDownRectExtend, "wxStyledTextCtrl", "pageDownRectExtend", 1}, // 3301
- {wxStyledTextCtrl_StutteredPageUp, "wxStyledTextCtrl", "stutteredPageUp", 1}, // 3302
- {wxStyledTextCtrl_StutteredPageUpExtend, "wxStyledTextCtrl", "stutteredPageUpExtend", 1}, // 3303
- {wxStyledTextCtrl_StutteredPageDown, "wxStyledTextCtrl", "stutteredPageDown", 1}, // 3304
- {wxStyledTextCtrl_StutteredPageDownExtend, "wxStyledTextCtrl", "stutteredPageDownExtend", 1}, // 3305
- {wxStyledTextCtrl_WordLeftEnd, "wxStyledTextCtrl", "wordLeftEnd", 1}, // 3306
- {wxStyledTextCtrl_WordLeftEndExtend, "wxStyledTextCtrl", "wordLeftEndExtend", 1}, // 3307
- {wxStyledTextCtrl_WordRightEnd, "wxStyledTextCtrl", "wordRightEnd", 1}, // 3308
- {wxStyledTextCtrl_WordRightEndExtend, "wxStyledTextCtrl", "wordRightEndExtend", 1}, // 3309
- {wxStyledTextCtrl_SetWhitespaceChars, "wxStyledTextCtrl", "setWhitespaceChars", 2}, // 3310
- {wxStyledTextCtrl_SetCharsDefault, "wxStyledTextCtrl", "setCharsDefault", 1}, // 3311
- {wxStyledTextCtrl_AutoCompGetCurrent, "wxStyledTextCtrl", "autoCompGetCurrent", 1}, // 3312
- {wxStyledTextCtrl_Allocate, "wxStyledTextCtrl", "allocate", 2}, // 3313
- {wxStyledTextCtrl_FindColumn, "wxStyledTextCtrl", "findColumn", 3}, // 3314
- {wxStyledTextCtrl_GetCaretSticky, "wxStyledTextCtrl", "getCaretSticky", 1}, // 3315
- {wxStyledTextCtrl_SetCaretSticky, "wxStyledTextCtrl", "setCaretSticky", 2}, // 3316
- {wxStyledTextCtrl_ToggleCaretSticky, "wxStyledTextCtrl", "toggleCaretSticky", 1}, // 3317
- {wxStyledTextCtrl_SetPasteConvertEndings, "wxStyledTextCtrl", "setPasteConvertEndings", 2}, // 3318
- {wxStyledTextCtrl_GetPasteConvertEndings, "wxStyledTextCtrl", "getPasteConvertEndings", 1}, // 3319
- {wxStyledTextCtrl_SelectionDuplicate, "wxStyledTextCtrl", "selectionDuplicate", 1}, // 3320
- {wxStyledTextCtrl_SetCaretLineBackAlpha, "wxStyledTextCtrl", "setCaretLineBackAlpha", 2}, // 3321
- {wxStyledTextCtrl_GetCaretLineBackAlpha, "wxStyledTextCtrl", "getCaretLineBackAlpha", 1}, // 3322
- {wxStyledTextCtrl_StartRecord, "wxStyledTextCtrl", "startRecord", 1}, // 3323
- {wxStyledTextCtrl_StopRecord, "wxStyledTextCtrl", "stopRecord", 1}, // 3324
- {wxStyledTextCtrl_SetLexer, "wxStyledTextCtrl", "setLexer", 2}, // 3325
- {wxStyledTextCtrl_GetLexer, "wxStyledTextCtrl", "getLexer", 1}, // 3326
- {wxStyledTextCtrl_Colourise, "wxStyledTextCtrl", "colourise", 3}, // 3327
- {wxStyledTextCtrl_SetProperty, "wxStyledTextCtrl", "setProperty", 3}, // 3328
- {wxStyledTextCtrl_SetKeyWords, "wxStyledTextCtrl", "setKeyWords", 3}, // 3329
- {wxStyledTextCtrl_SetLexerLanguage, "wxStyledTextCtrl", "setLexerLanguage", 2}, // 3330
- {wxStyledTextCtrl_GetProperty, "wxStyledTextCtrl", "getProperty", 2}, // 3331
- {wxStyledTextCtrl_GetStyleBitsNeeded, "wxStyledTextCtrl", "getStyleBitsNeeded", 1}, // 3332
- {wxStyledTextCtrl_GetCurrentLine, "wxStyledTextCtrl", "getCurrentLine", 1}, // 3333
- {wxStyledTextCtrl_StyleSetSpec, "wxStyledTextCtrl", "styleSetSpec", 3}, // 3334
- {wxStyledTextCtrl_StyleSetFont, "wxStyledTextCtrl", "styleSetFont", 3}, // 3335
- {wxStyledTextCtrl_StyleSetFontAttr, "wxStyledTextCtrl", "styleSetFontAttr", 8}, // 3336
- {wxStyledTextCtrl_StyleSetCharacterSet, "wxStyledTextCtrl", "styleSetCharacterSet", 3}, // 3337
- {wxStyledTextCtrl_StyleSetFontEncoding, "wxStyledTextCtrl", "styleSetFontEncoding", 3}, // 3338
- {wxStyledTextCtrl_CmdKeyExecute, "wxStyledTextCtrl", "cmdKeyExecute", 2}, // 3339
- {wxStyledTextCtrl_SetMargins, "wxStyledTextCtrl", "setMargins", 3}, // 3340
- {wxStyledTextCtrl_GetSelection, "wxStyledTextCtrl", "getSelection", 1}, // 3341
- {wxStyledTextCtrl_PointFromPosition, "wxStyledTextCtrl", "pointFromPosition", 2}, // 3342
- {wxStyledTextCtrl_ScrollToLine, "wxStyledTextCtrl", "scrollToLine", 2}, // 3343
- {wxStyledTextCtrl_ScrollToColumn, "wxStyledTextCtrl", "scrollToColumn", 2}, // 3344
- {wxStyledTextCtrl_SetVScrollBar, "wxStyledTextCtrl", "setVScrollBar", 2}, // 3345
- {wxStyledTextCtrl_SetHScrollBar, "wxStyledTextCtrl", "setHScrollBar", 2}, // 3346
- {wxStyledTextCtrl_GetLastKeydownProcessed, "wxStyledTextCtrl", "getLastKeydownProcessed", 1}, // 3347
- {wxStyledTextCtrl_SetLastKeydownProcessed, "wxStyledTextCtrl", "setLastKeydownProcessed", 2}, // 3348
- {wxStyledTextCtrl_SaveFile, "wxStyledTextCtrl", "saveFile", 2}, // 3349
- {wxStyledTextCtrl_LoadFile, "wxStyledTextCtrl", "loadFile", 2}, // 3350
- {wxStyledTextCtrl_DoDragOver, "wxStyledTextCtrl", "doDragOver", 4}, // 3351
- {wxStyledTextCtrl_DoDropText, "wxStyledTextCtrl", "doDropText", 4}, // 3352
- {wxStyledTextCtrl_GetUseAntiAliasing, "wxStyledTextCtrl", "getUseAntiAliasing", 1}, // 3353
- {wxStyledTextCtrl_AddTextRaw, "wxStyledTextCtrl", "addTextRaw", 3}, // 3354
- {wxStyledTextCtrl_InsertTextRaw, "wxStyledTextCtrl", "insertTextRaw", 3}, // 3355
- {wxStyledTextCtrl_GetCurLineRaw, "wxStyledTextCtrl", "getCurLineRaw", 1}, // 3356
- {wxStyledTextCtrl_GetLineRaw, "wxStyledTextCtrl", "getLineRaw", 2}, // 3357
- {wxStyledTextCtrl_GetSelectedTextRaw, "wxStyledTextCtrl", "getSelectedTextRaw", 1}, // 3358
- {wxStyledTextCtrl_GetTextRangeRaw, "wxStyledTextCtrl", "getTextRangeRaw", 3}, // 3359
- {wxStyledTextCtrl_SetTextRaw, "wxStyledTextCtrl", "setTextRaw", 2}, // 3360
- {wxStyledTextCtrl_GetTextRaw, "wxStyledTextCtrl", "getTextRaw", 1}, // 3361
- {wxStyledTextCtrl_AppendTextRaw, "wxStyledTextCtrl", "appendTextRaw", 3}, // 3362
- {wxArtProvider_GetBitmap, "wxArtProvider", "getBitmap", 2}, // 3363
- {wxArtProvider_GetIcon, "wxArtProvider", "getIcon", 2}, // 3364
- {wxTreeEvent_GetKeyCode, "wxTreeEvent", "getKeyCode", 1}, // 3365
- {wxTreeEvent_GetItem, "wxTreeEvent", "getItem", 1}, // 3366
- {wxTreeEvent_GetKeyEvent, "wxTreeEvent", "getKeyEvent", 1}, // 3367
- {wxTreeEvent_GetLabel, "wxTreeEvent", "getLabel", 1}, // 3368
- {wxTreeEvent_GetOldItem, "wxTreeEvent", "getOldItem", 1}, // 3369
- {wxTreeEvent_GetPoint, "wxTreeEvent", "getPoint", 1}, // 3370
- {wxTreeEvent_IsEditCancelled, "wxTreeEvent", "isEditCancelled", 1}, // 3371
- {wxTreeEvent_SetToolTip, "wxTreeEvent", "setToolTip", 2}, // 3372
- {wxBookCtrlEvent_GetOldSelection, "wxBookCtrlEvent", "getOldSelection", 1}, // 3373
- {wxBookCtrlEvent_GetSelection, "wxBookCtrlEvent", "getSelection", 1}, // 3374
- {wxBookCtrlEvent_SetOldSelection, "wxBookCtrlEvent", "setOldSelection", 2}, // 3375
- {wxBookCtrlEvent_SetSelection, "wxBookCtrlEvent", "setSelection", 2}, // 3376
- {wxFileDataObject_new, "wxFileDataObject", "new", 0}, // 3377
- {wxFileDataObject_AddFile, "wxFileDataObject", "addFile", 2}, // 3378
- {wxFileDataObject_GetFilenames, "wxFileDataObject", "getFilenames", 1}, // 3379
- {wxFileDataObject_destroy, "wxFileDataObject", "'Destroy'", 1}, // 3380
- {wxTextDataObject_new, "wxTextDataObject", "new", 1}, // 3381
- {wxTextDataObject_GetTextLength, "wxTextDataObject", "getTextLength", 1}, // 3382
- {wxTextDataObject_GetText, "wxTextDataObject", "getText", 1}, // 3383
- {wxTextDataObject_SetText, "wxTextDataObject", "setText", 2}, // 3384
- {wxTextDataObject_destroy, "wxTextDataObject", "'Destroy'", 1}, // 3385
- {wxBitmapDataObject_new_1_1, "wxBitmapDataObject", "new", 1}, // 3386
- {wxBitmapDataObject_new_1_0, "wxBitmapDataObject", "new", 1}, // 3387
- {wxBitmapDataObject_GetBitmap, "wxBitmapDataObject", "getBitmap", 1}, // 3388
- {wxBitmapDataObject_SetBitmap, "wxBitmapDataObject", "setBitmap", 2}, // 3389
- {wxBitmapDataObject_destroy, "wxBitmapDataObject", "'Destroy'", 1}, // 3390
- {wxClipboard_new, "wxClipboard", "new", 0}, // 3391
- {NULL, "wxClipboard", "destroy", 1}, // 3392 obj destructor wxClipboard_destruct
- {wxClipboard_AddData, "wxClipboard", "addData", 2}, // 3393
- {wxClipboard_Clear, "wxClipboard", "clear", 1}, // 3394
- {wxClipboard_Close, "wxClipboard", "close", 1}, // 3395
- {wxClipboard_Flush, "wxClipboard", "flush", 1}, // 3396
- {wxClipboard_GetData, "wxClipboard", "getData", 2}, // 3397
- {wxClipboard_IsOpened, "wxClipboard", "isOpened", 1}, // 3398
- {wxClipboard_Open, "wxClipboard", "open", 1}, // 3399
- {wxClipboard_SetData, "wxClipboard", "setData", 2}, // 3400
- {wxClipboard_UsePrimarySelection, "wxClipboard", "usePrimarySelection", 2}, // 3401
- {wxClipboard_IsSupported, "wxClipboard", "isSupported", 2}, // 3402
- {wxClipboard_Get, "wxClipboard", "get", 0}, // 3403
- {wxSpinEvent_GetPosition, "wxSpinEvent", "getPosition", 1}, // 3404
- {wxSpinEvent_SetPosition, "wxSpinEvent", "setPosition", 2}, // 3405
- {wxSplitterWindow_new_0, "wxSplitterWindow", "new", 0}, // 3406
- {wxSplitterWindow_new_2, "wxSplitterWindow", "new", 2}, // 3407
- {NULL, "wxSplitterWindow", "destroy", 1}, // 3408 obj destructor wxSplitterWindow_destruct
- {wxSplitterWindow_Create, "wxSplitterWindow", "create", 3}, // 3409
- {wxSplitterWindow_GetMinimumPaneSize, "wxSplitterWindow", "getMinimumPaneSize", 1}, // 3410
- {wxSplitterWindow_GetSashGravity, "wxSplitterWindow", "getSashGravity", 1}, // 3411
- {wxSplitterWindow_GetSashPosition, "wxSplitterWindow", "getSashPosition", 1}, // 3412
- {wxSplitterWindow_GetSplitMode, "wxSplitterWindow", "getSplitMode", 1}, // 3413
- {wxSplitterWindow_GetWindow1, "wxSplitterWindow", "getWindow1", 1}, // 3414
- {wxSplitterWindow_GetWindow2, "wxSplitterWindow", "getWindow2", 1}, // 3415
- {wxSplitterWindow_Initialize, "wxSplitterWindow", "initialize", 2}, // 3416
- {wxSplitterWindow_IsSplit, "wxSplitterWindow", "isSplit", 1}, // 3417
- {wxSplitterWindow_ReplaceWindow, "wxSplitterWindow", "replaceWindow", 3}, // 3418
- {wxSplitterWindow_SetSashGravity, "wxSplitterWindow", "setSashGravity", 2}, // 3419
- {wxSplitterWindow_SetSashPosition, "wxSplitterWindow", "setSashPosition", 3}, // 3420
- {wxSplitterWindow_SetMinimumPaneSize, "wxSplitterWindow", "setMinimumPaneSize", 2}, // 3421
- {wxSplitterWindow_SetSplitMode, "wxSplitterWindow", "setSplitMode", 2}, // 3422
- {wxSplitterWindow_SplitHorizontally, "wxSplitterWindow", "splitHorizontally", 4}, // 3423
- {wxSplitterWindow_SplitVertically, "wxSplitterWindow", "splitVertically", 4}, // 3424
- {wxSplitterWindow_Unsplit, "wxSplitterWindow", "unsplit", 2}, // 3425
- {wxSplitterWindow_UpdateSize, "wxSplitterWindow", "updateSize", 1}, // 3426
- {wxSplitterEvent_GetSashPosition, "wxSplitterEvent", "getSashPosition", 1}, // 3427
- {wxSplitterEvent_GetX, "wxSplitterEvent", "getX", 1}, // 3428
- {wxSplitterEvent_GetY, "wxSplitterEvent", "getY", 1}, // 3429
- {wxSplitterEvent_GetWindowBeingRemoved, "wxSplitterEvent", "getWindowBeingRemoved", 1}, // 3430
- {wxSplitterEvent_SetSashPosition, "wxSplitterEvent", "setSashPosition", 2}, // 3431
- {wxHtmlWindow_new_0, "wxHtmlWindow", "new", 0}, // 3432
- {wxHtmlWindow_new_2, "wxHtmlWindow", "new", 2}, // 3433
- {wxHtmlWindow_AppendToPage, "wxHtmlWindow", "appendToPage", 2}, // 3434
- {wxHtmlWindow_GetOpenedAnchor, "wxHtmlWindow", "getOpenedAnchor", 1}, // 3435
- {wxHtmlWindow_GetOpenedPage, "wxHtmlWindow", "getOpenedPage", 1}, // 3436
- {wxHtmlWindow_GetOpenedPageTitle, "wxHtmlWindow", "getOpenedPageTitle", 1}, // 3437
- {wxHtmlWindow_GetRelatedFrame, "wxHtmlWindow", "getRelatedFrame", 1}, // 3438
- {wxHtmlWindow_HistoryBack, "wxHtmlWindow", "historyBack", 1}, // 3439
- {wxHtmlWindow_HistoryCanBack, "wxHtmlWindow", "historyCanBack", 1}, // 3440
- {wxHtmlWindow_HistoryCanForward, "wxHtmlWindow", "historyCanForward", 1}, // 3441
- {wxHtmlWindow_HistoryClear, "wxHtmlWindow", "historyClear", 1}, // 3442
- {wxHtmlWindow_HistoryForward, "wxHtmlWindow", "historyForward", 1}, // 3443
- {wxHtmlWindow_LoadFile, "wxHtmlWindow", "loadFile", 2}, // 3444
- {wxHtmlWindow_LoadPage, "wxHtmlWindow", "loadPage", 2}, // 3445
- {wxHtmlWindow_SelectAll, "wxHtmlWindow", "selectAll", 1}, // 3446
- {wxHtmlWindow_SelectionToText, "wxHtmlWindow", "selectionToText", 1}, // 3447
- {wxHtmlWindow_SelectLine, "wxHtmlWindow", "selectLine", 2}, // 3448
- {wxHtmlWindow_SelectWord, "wxHtmlWindow", "selectWord", 2}, // 3449
- {wxHtmlWindow_SetBorders, "wxHtmlWindow", "setBorders", 2}, // 3450
- {wxHtmlWindow_SetFonts, "wxHtmlWindow", "setFonts", 4}, // 3451
- {wxHtmlWindow_SetPage, "wxHtmlWindow", "setPage", 2}, // 3452
- {wxHtmlWindow_SetRelatedFrame, "wxHtmlWindow", "setRelatedFrame", 3}, // 3453
- {wxHtmlWindow_SetRelatedStatusBar_1, "wxHtmlWindow", "setRelatedStatusBar", 2}, // 3454
- {wxHtmlWindow_SetRelatedStatusBar_2, "wxHtmlWindow", "setRelatedStatusBar", 3}, // 3455
- {wxHtmlWindow_ToText, "wxHtmlWindow", "toText", 1}, // 3456
- {NULL, "wxHtmlWindow", "'Destroy'", 1}, // 3457 obj destructor wxHtmlWindow_destroy
- {wxHtmlLinkEvent_GetLinkInfo, "wxHtmlLinkEvent", "getLinkInfo", 1}, // 3458
- {wxSystemSettings_GetColour, "wxSystemSettings", "getColour", 1}, // 3459
- {wxSystemSettings_GetFont, "wxSystemSettings", "getFont", 1}, // 3460
- {wxSystemSettings_GetMetric, "wxSystemSettings", "getMetric", 2}, // 3461
- {wxSystemSettings_GetScreenType, "wxSystemSettings", "getScreenType", 0}, // 3462
- {wxSystemOptions_GetOption, "wxSystemOptions", "getOption", 1}, // 3463
- {wxSystemOptions_GetOptionInt, "wxSystemOptions", "getOptionInt", 1}, // 3464
- {wxSystemOptions_HasOption, "wxSystemOptions", "hasOption", 1}, // 3465
- {wxSystemOptions_IsFalse, "wxSystemOptions", "isFalse", 1}, // 3466
- {wxSystemOptions_SetOption_2_1, "wxSystemOptions", "setOption", 2}, // 3467
- {wxSystemOptions_SetOption_2_0, "wxSystemOptions", "setOption", 2}, // 3468
- {wxAuiNotebookEvent_SetSelection, "wxAuiNotebookEvent", "setSelection", 2}, // 3469
- {wxAuiNotebookEvent_GetSelection, "wxAuiNotebookEvent", "getSelection", 1}, // 3470
- {wxAuiNotebookEvent_SetOldSelection, "wxAuiNotebookEvent", "setOldSelection", 2}, // 3471
- {wxAuiNotebookEvent_GetOldSelection, "wxAuiNotebookEvent", "getOldSelection", 1}, // 3472
- {wxAuiNotebookEvent_SetDragSource, "wxAuiNotebookEvent", "setDragSource", 2}, // 3473
- {wxAuiNotebookEvent_GetDragSource, "wxAuiNotebookEvent", "getDragSource", 1}, // 3474
- {wxAuiManagerEvent_SetManager, "wxAuiManagerEvent", "setManager", 2}, // 3475
- {wxAuiManagerEvent_GetManager, "wxAuiManagerEvent", "getManager", 1}, // 3476
- {wxAuiManagerEvent_SetPane, "wxAuiManagerEvent", "setPane", 2}, // 3477
- {wxAuiManagerEvent_GetPane, "wxAuiManagerEvent", "getPane", 1}, // 3478
- {wxAuiManagerEvent_SetButton, "wxAuiManagerEvent", "setButton", 2}, // 3479
- {wxAuiManagerEvent_GetButton, "wxAuiManagerEvent", "getButton", 1}, // 3480
- {wxAuiManagerEvent_SetDC, "wxAuiManagerEvent", "setDC", 2}, // 3481
- {wxAuiManagerEvent_GetDC, "wxAuiManagerEvent", "getDC", 1}, // 3482
- {wxAuiManagerEvent_Veto, "wxAuiManagerEvent", "veto", 2}, // 3483
- {wxAuiManagerEvent_GetVeto, "wxAuiManagerEvent", "getVeto", 1}, // 3484
- {wxAuiManagerEvent_SetCanVeto, "wxAuiManagerEvent", "setCanVeto", 2}, // 3485
- {wxAuiManagerEvent_CanVeto, "wxAuiManagerEvent", "canVeto", 1}, // 3486
- {wxLogNull_new, "wxLogNull", "new", 0}, // 3487
- {wxLogNull_destruct, "wxLogNull", "destroy", 1}, // 3488
- {wxTaskBarIcon_new, "wxTaskBarIcon", "new", 1}, // 3489
- {NULL, "wxTaskBarIcon", "destroy", 1}, // 3490 obj destructor wxTaskBarIcon_destruct
- {wxTaskBarIcon_PopupMenu, "wxTaskBarIcon", "popupMenu", 2}, // 3491
- {wxTaskBarIcon_RemoveIcon, "wxTaskBarIcon", "removeIcon", 1}, // 3492
- {wxTaskBarIcon_SetIcon, "wxTaskBarIcon", "setIcon", 3}, // 3493
- {wxLocale_new_0, "wxLocale", "new", 0}, // 3494
- {wxLocale_new_2_0, "wxLocale", "new", 2}, // 3495
- {wxLocale_new_2_1, "wxLocale", "new", 2}, // 3496
- {wxLocale_destruct, "wxLocale", "destroy", 1}, // 3497
- {wxLocale_Init_1, "wxLocale", "init", 2}, // 3498
- {wxLocale_Init_2, "wxLocale", "init", 3}, // 3499
- {wxLocale_AddCatalog_1, "wxLocale", "addCatalog", 2}, // 3500
- {wxLocale_AddCatalog_2, "wxLocale", "addCatalog", 3}, // 3501
- {wxLocale_AddCatalog_3, "wxLocale", "addCatalog", 4}, // 3502
- {wxLocale_AddCatalogLookupPathPrefix, "wxLocale", "addCatalogLookupPathPrefix", 1}, // 3503
- {wxLocale_GetCanonicalName, "wxLocale", "getCanonicalName", 1}, // 3504
- {wxLocale_GetLanguage, "wxLocale", "getLanguage", 1}, // 3505
- {wxLocale_GetLanguageName, "wxLocale", "getLanguageName", 1}, // 3506
- {wxLocale_GetLocale, "wxLocale", "getLocale", 1}, // 3507
- {wxLocale_GetName, "wxLocale", "getName", 1}, // 3508
- {wxLocale_GetString_2, "wxLocale", "getString", 3}, // 3509
- {wxLocale_GetString_4, "wxLocale", "getString", 5}, // 3510
- {wxLocale_GetHeaderValue, "wxLocale", "getHeaderValue", 3}, // 3511
- {wxLocale_GetSysName, "wxLocale", "getSysName", 1}, // 3512
- {wxLocale_GetSystemEncoding, "wxLocale", "getSystemEncoding", 0}, // 3513
- {wxLocale_GetSystemEncodingName, "wxLocale", "getSystemEncodingName", 0}, // 3514
- {wxLocale_GetSystemLanguage, "wxLocale", "getSystemLanguage", 0}, // 3515
- {wxLocale_IsLoaded, "wxLocale", "isLoaded", 2}, // 3516
- {wxLocale_IsOk, "wxLocale", "isOk", 1}, // 3517
- {wxActivateEvent_GetActive, "wxActivateEvent", "getActive", 1}, // 3518
+ {wxMouseEvent_Aux1DClick, "wxMouseEvent", "aux1DClick", 1}, // 2730
+ {wxMouseEvent_Aux1Down, "wxMouseEvent", "aux1Down", 1}, // 2731
+ {wxMouseEvent_Aux1Up, "wxMouseEvent", "aux1Up", 1}, // 2732
+ {wxMouseEvent_Aux2DClick, "wxMouseEvent", "aux2DClick", 1}, // 2733
+ {wxMouseEvent_Aux2Down, "wxMouseEvent", "aux2Down", 1}, // 2734
+ {wxMouseEvent_Aux2Up, "wxMouseEvent", "aux2Up", 1}, // 2735
+ {wxSetCursorEvent_GetCursor, "wxSetCursorEvent", "getCursor", 1}, // 2736
+ {wxSetCursorEvent_GetX, "wxSetCursorEvent", "getX", 1}, // 2737
+ {wxSetCursorEvent_GetY, "wxSetCursorEvent", "getY", 1}, // 2738
+ {wxSetCursorEvent_HasCursor, "wxSetCursorEvent", "hasCursor", 1}, // 2739
+ {wxSetCursorEvent_SetCursor, "wxSetCursorEvent", "setCursor", 2}, // 2740
+ {wxKeyEvent_AltDown, "wxKeyEvent", "altDown", 1}, // 2741
+ {wxKeyEvent_CmdDown, "wxKeyEvent", "cmdDown", 1}, // 2742
+ {wxKeyEvent_ControlDown, "wxKeyEvent", "controlDown", 1}, // 2743
+ {wxKeyEvent_GetKeyCode, "wxKeyEvent", "getKeyCode", 1}, // 2744
+ {wxKeyEvent_GetModifiers, "wxKeyEvent", "getModifiers", 1}, // 2745
+ {wxKeyEvent_GetPosition, "wxKeyEvent", "getPosition", 1}, // 2746
+ {NULL, "", "", 0}, // 2747
+ {wxKeyEvent_GetRawKeyCode, "wxKeyEvent", "getRawKeyCode", 1}, // 2748
+ {wxKeyEvent_GetRawKeyFlags, "wxKeyEvent", "getRawKeyFlags", 1}, // 2749
+ {wxKeyEvent_GetUnicodeKey, "wxKeyEvent", "getUnicodeKey", 1}, // 2750
+ {wxKeyEvent_GetX, "wxKeyEvent", "getX", 1}, // 2751
+ {wxKeyEvent_GetY, "wxKeyEvent", "getY", 1}, // 2752
+ {wxKeyEvent_HasModifiers, "wxKeyEvent", "hasModifiers", 1}, // 2753
+ {wxKeyEvent_MetaDown, "wxKeyEvent", "metaDown", 1}, // 2754
+ {wxKeyEvent_ShiftDown, "wxKeyEvent", "shiftDown", 1}, // 2755
+ {wxSizeEvent_GetSize, "wxSizeEvent", "getSize", 1}, // 2756
+ {wxSizeEvent_GetRect, "wxSizeEvent", "getRect", 1}, // 2757
+ {wxMoveEvent_GetPosition, "wxMoveEvent", "getPosition", 1}, // 2758
+ {wxMoveEvent_GetRect, "wxMoveEvent", "getRect", 1}, // 2759
+ {wxEraseEvent_GetDC, "wxEraseEvent", "getDC", 1}, // 2760
+ {wxFocusEvent_GetWindow, "wxFocusEvent", "getWindow", 1}, // 2761
+ {wxChildFocusEvent_GetWindow, "wxChildFocusEvent", "getWindow", 1}, // 2762
+ {wxMenuEvent_GetMenu, "wxMenuEvent", "getMenu", 1}, // 2763
+ {wxMenuEvent_GetMenuId, "wxMenuEvent", "getMenuId", 1}, // 2764
+ {wxMenuEvent_IsPopup, "wxMenuEvent", "isPopup", 1}, // 2765
+ {wxCloseEvent_CanVeto, "wxCloseEvent", "canVeto", 1}, // 2766
+ {wxCloseEvent_GetLoggingOff, "wxCloseEvent", "getLoggingOff", 1}, // 2767
+ {wxCloseEvent_SetCanVeto, "wxCloseEvent", "setCanVeto", 2}, // 2768
+ {wxCloseEvent_SetLoggingOff, "wxCloseEvent", "setLoggingOff", 2}, // 2769
+ {wxCloseEvent_Veto, "wxCloseEvent", "veto", 2}, // 2770
+ {wxShowEvent_SetShow, "wxShowEvent", "setShow", 2}, // 2771
+ {wxShowEvent_IsShown, "wxShowEvent", "isShown", 1}, // 2772
+ {wxIconizeEvent_IsIconized, "wxIconizeEvent", "isIconized", 1}, // 2773
+ {wxJoystickEvent_ButtonDown, "wxJoystickEvent", "buttonDown", 2}, // 2774
+ {wxJoystickEvent_ButtonIsDown, "wxJoystickEvent", "buttonIsDown", 2}, // 2775
+ {wxJoystickEvent_ButtonUp, "wxJoystickEvent", "buttonUp", 2}, // 2776
+ {wxJoystickEvent_GetButtonChange, "wxJoystickEvent", "getButtonChange", 1}, // 2777
+ {wxJoystickEvent_GetButtonState, "wxJoystickEvent", "getButtonState", 1}, // 2778
+ {wxJoystickEvent_GetJoystick, "wxJoystickEvent", "getJoystick", 1}, // 2779
+ {wxJoystickEvent_GetPosition, "wxJoystickEvent", "getPosition", 1}, // 2780
+ {wxJoystickEvent_GetZPosition, "wxJoystickEvent", "getZPosition", 1}, // 2781
+ {wxJoystickEvent_IsButton, "wxJoystickEvent", "isButton", 1}, // 2782
+ {wxJoystickEvent_IsMove, "wxJoystickEvent", "isMove", 1}, // 2783
+ {wxJoystickEvent_IsZMove, "wxJoystickEvent", "isZMove", 1}, // 2784
+ {wxUpdateUIEvent_CanUpdate, "wxUpdateUIEvent", "canUpdate", 1}, // 2785
+ {wxUpdateUIEvent_Check, "wxUpdateUIEvent", "check", 2}, // 2786
+ {wxUpdateUIEvent_Enable, "wxUpdateUIEvent", "enable", 2}, // 2787
+ {wxUpdateUIEvent_Show, "wxUpdateUIEvent", "show", 2}, // 2788
+ {wxUpdateUIEvent_GetChecked, "wxUpdateUIEvent", "getChecked", 1}, // 2789
+ {wxUpdateUIEvent_GetEnabled, "wxUpdateUIEvent", "getEnabled", 1}, // 2790
+ {wxUpdateUIEvent_GetShown, "wxUpdateUIEvent", "getShown", 1}, // 2791
+ {wxUpdateUIEvent_GetSetChecked, "wxUpdateUIEvent", "getSetChecked", 1}, // 2792
+ {wxUpdateUIEvent_GetSetEnabled, "wxUpdateUIEvent", "getSetEnabled", 1}, // 2793
+ {wxUpdateUIEvent_GetSetShown, "wxUpdateUIEvent", "getSetShown", 1}, // 2794
+ {wxUpdateUIEvent_GetSetText, "wxUpdateUIEvent", "getSetText", 1}, // 2795
+ {wxUpdateUIEvent_GetText, "wxUpdateUIEvent", "getText", 1}, // 2796
+ {wxUpdateUIEvent_GetMode, "wxUpdateUIEvent", "getMode", 0}, // 2797
+ {wxUpdateUIEvent_GetUpdateInterval, "wxUpdateUIEvent", "getUpdateInterval", 0}, // 2798
+ {wxUpdateUIEvent_ResetUpdateTime, "wxUpdateUIEvent", "resetUpdateTime", 0}, // 2799
+ {wxUpdateUIEvent_SetMode, "wxUpdateUIEvent", "setMode", 1}, // 2800
+ {wxUpdateUIEvent_SetText, "wxUpdateUIEvent", "setText", 2}, // 2801
+ {wxUpdateUIEvent_SetUpdateInterval, "wxUpdateUIEvent", "setUpdateInterval", 1}, // 2802
+ {wxMouseCaptureChangedEvent_GetCapturedWindow, "wxMouseCaptureChangedEvent", "getCapturedWindow", 1}, // 2803
+ {wxPaletteChangedEvent_SetChangedWindow, "wxPaletteChangedEvent", "setChangedWindow", 2}, // 2804
+ {wxPaletteChangedEvent_GetChangedWindow, "wxPaletteChangedEvent", "getChangedWindow", 1}, // 2805
+ {wxQueryNewPaletteEvent_SetPaletteRealized, "wxQueryNewPaletteEvent", "setPaletteRealized", 2}, // 2806
+ {wxQueryNewPaletteEvent_GetPaletteRealized, "wxQueryNewPaletteEvent", "getPaletteRealized", 1}, // 2807
+ {wxNavigationKeyEvent_GetDirection, "wxNavigationKeyEvent", "getDirection", 1}, // 2808
+ {wxNavigationKeyEvent_SetDirection, "wxNavigationKeyEvent", "setDirection", 2}, // 2809
+ {wxNavigationKeyEvent_IsWindowChange, "wxNavigationKeyEvent", "isWindowChange", 1}, // 2810
+ {wxNavigationKeyEvent_SetWindowChange, "wxNavigationKeyEvent", "setWindowChange", 2}, // 2811
+ {wxNavigationKeyEvent_IsFromTab, "wxNavigationKeyEvent", "isFromTab", 1}, // 2812
+ {wxNavigationKeyEvent_SetFromTab, "wxNavigationKeyEvent", "setFromTab", 2}, // 2813
+ {wxNavigationKeyEvent_GetCurrentFocus, "wxNavigationKeyEvent", "getCurrentFocus", 1}, // 2814
+ {wxNavigationKeyEvent_SetCurrentFocus, "wxNavigationKeyEvent", "setCurrentFocus", 2}, // 2815
+ {wxHelpEvent_GetOrigin, "wxHelpEvent", "getOrigin", 1}, // 2816
+ {wxHelpEvent_GetPosition, "wxHelpEvent", "getPosition", 1}, // 2817
+ {wxHelpEvent_SetOrigin, "wxHelpEvent", "setOrigin", 2}, // 2818
+ {wxHelpEvent_SetPosition, "wxHelpEvent", "setPosition", 2}, // 2819
+ {wxContextMenuEvent_GetPosition, "wxContextMenuEvent", "getPosition", 1}, // 2820
+ {wxContextMenuEvent_SetPosition, "wxContextMenuEvent", "setPosition", 2}, // 2821
+ {wxIdleEvent_GetMode, "wxIdleEvent", "getMode", 0}, // 2822
+ {wxIdleEvent_RequestMore, "wxIdleEvent", "requestMore", 2}, // 2823
+ {wxIdleEvent_MoreRequested, "wxIdleEvent", "moreRequested", 1}, // 2824
+ {wxIdleEvent_SetMode, "wxIdleEvent", "setMode", 1}, // 2825
+ {wxGridEvent_AltDown, "wxGridEvent", "altDown", 1}, // 2826
+ {wxGridEvent_ControlDown, "wxGridEvent", "controlDown", 1}, // 2827
+ {wxGridEvent_GetCol, "wxGridEvent", "getCol", 1}, // 2828
+ {wxGridEvent_GetPosition, "wxGridEvent", "getPosition", 1}, // 2829
+ {wxGridEvent_GetRow, "wxGridEvent", "getRow", 1}, // 2830
+ {wxGridEvent_MetaDown, "wxGridEvent", "metaDown", 1}, // 2831
+ {wxGridEvent_Selecting, "wxGridEvent", "selecting", 1}, // 2832
+ {wxGridEvent_ShiftDown, "wxGridEvent", "shiftDown", 1}, // 2833
+ {wxNotifyEvent_Allow, "wxNotifyEvent", "allow", 1}, // 2834
+ {wxNotifyEvent_IsAllowed, "wxNotifyEvent", "isAllowed", 1}, // 2835
+ {wxNotifyEvent_Veto, "wxNotifyEvent", "veto", 1}, // 2836
+ {wxSashEvent_GetEdge, "wxSashEvent", "getEdge", 1}, // 2837
+ {wxSashEvent_GetDragRect, "wxSashEvent", "getDragRect", 1}, // 2838
+ {wxSashEvent_GetDragStatus, "wxSashEvent", "getDragStatus", 1}, // 2839
+ {wxListEvent_GetCacheFrom, "wxListEvent", "getCacheFrom", 1}, // 2840
+ {wxListEvent_GetCacheTo, "wxListEvent", "getCacheTo", 1}, // 2841
+ {wxListEvent_GetKeyCode, "wxListEvent", "getKeyCode", 1}, // 2842
+ {wxListEvent_GetIndex, "wxListEvent", "getIndex", 1}, // 2843
+ {wxListEvent_GetColumn, "wxListEvent", "getColumn", 1}, // 2844
+ {wxListEvent_GetPoint, "wxListEvent", "getPoint", 1}, // 2845
+ {wxListEvent_GetLabel, "wxListEvent", "getLabel", 1}, // 2846
+ {wxListEvent_GetText, "wxListEvent", "getText", 1}, // 2847
+ {wxListEvent_GetImage, "wxListEvent", "getImage", 1}, // 2848
+ {wxListEvent_GetData, "wxListEvent", "getData", 1}, // 2849
+ {wxListEvent_GetMask, "wxListEvent", "getMask", 1}, // 2850
+ {wxListEvent_GetItem, "wxListEvent", "getItem", 1}, // 2851
+ {wxListEvent_IsEditCancelled, "wxListEvent", "isEditCancelled", 1}, // 2852
+ {wxDateEvent_GetDate, "wxDateEvent", "getDate", 1}, // 2853
+ {wxCalendarEvent_GetWeekDay, "wxCalendarEvent", "getWeekDay", 1}, // 2854
+ {wxCalendarEvent_GetDate, "wxCalendarEvent", "getDate", 1}, // 2855
+ {wxFileDirPickerEvent_GetPath, "wxFileDirPickerEvent", "getPath", 1}, // 2856
+ {wxColourPickerEvent_GetColour, "wxColourPickerEvent", "getColour", 1}, // 2857
+ {wxFontPickerEvent_GetFont, "wxFontPickerEvent", "getFont", 1}, // 2858
+ {wxStyledTextEvent_GetPosition, "wxStyledTextEvent", "getPosition", 1}, // 2859
+ {wxStyledTextEvent_GetKey, "wxStyledTextEvent", "getKey", 1}, // 2860
+ {wxStyledTextEvent_GetModifiers, "wxStyledTextEvent", "getModifiers", 1}, // 2861
+ {wxStyledTextEvent_GetModificationType, "wxStyledTextEvent", "getModificationType", 1}, // 2862
+ {wxStyledTextEvent_GetText, "wxStyledTextEvent", "getText", 1}, // 2863
+ {wxStyledTextEvent_GetLength, "wxStyledTextEvent", "getLength", 1}, // 2864
+ {wxStyledTextEvent_GetLinesAdded, "wxStyledTextEvent", "getLinesAdded", 1}, // 2865
+ {wxStyledTextEvent_GetLine, "wxStyledTextEvent", "getLine", 1}, // 2866
+ {wxStyledTextEvent_GetFoldLevelNow, "wxStyledTextEvent", "getFoldLevelNow", 1}, // 2867
+ {wxStyledTextEvent_GetFoldLevelPrev, "wxStyledTextEvent", "getFoldLevelPrev", 1}, // 2868
+ {wxStyledTextEvent_GetMargin, "wxStyledTextEvent", "getMargin", 1}, // 2869
+ {wxStyledTextEvent_GetMessage, "wxStyledTextEvent", "getMessage", 1}, // 2870
+ {wxStyledTextEvent_GetWParam, "wxStyledTextEvent", "getWParam", 1}, // 2871
+ {wxStyledTextEvent_GetLParam, "wxStyledTextEvent", "getLParam", 1}, // 2872
+ {wxStyledTextEvent_GetListType, "wxStyledTextEvent", "getListType", 1}, // 2873
+ {wxStyledTextEvent_GetX, "wxStyledTextEvent", "getX", 1}, // 2874
+ {wxStyledTextEvent_GetY, "wxStyledTextEvent", "getY", 1}, // 2875
+ {wxStyledTextEvent_GetDragText, "wxStyledTextEvent", "getDragText", 1}, // 2876
+ {wxStyledTextEvent_GetDragAllowMove, "wxStyledTextEvent", "getDragAllowMove", 1}, // 2877
+ {wxStyledTextEvent_GetDragResult, "wxStyledTextEvent", "getDragResult", 1}, // 2878
+ {wxStyledTextEvent_GetShift, "wxStyledTextEvent", "getShift", 1}, // 2879
+ {wxStyledTextEvent_GetControl, "wxStyledTextEvent", "getControl", 1}, // 2880
+ {wxStyledTextEvent_GetAlt, "wxStyledTextEvent", "getAlt", 1}, // 2881
+ {utils_wxGetKeyState, "utils", "getKeyState", 1}, // 2882
+ {utils_wxGetMousePosition, "utils", "getMousePosition", 0}, // 2883
+ {utils_wxGetMouseState, "utils", "getMouseState", 0}, // 2884
+ {utils_wxSetDetectableAutoRepeat, "utils", "setDetectableAutoRepeat", 1}, // 2885
+ {utils_wxBell, "utils", "bell", 0}, // 2886
+ {utils_wxFindMenuItemId, "utils", "findMenuItemId", 3}, // 2887
+ {utils_wxFindWindowAtPoint, "utils", "findWindowAtPoint", 1}, // 2888
+ {utils_wxBeginBusyCursor, "utils", "beginBusyCursor", 1}, // 2889
+ {utils_wxEndBusyCursor, "utils", "endBusyCursor", 0}, // 2890
+ {utils_wxIsBusy, "utils", "isBusy", 0}, // 2891
+ {utils_wxShutdown, "utils", "shutdown", 1}, // 2892
+ {utils_wxShell, "utils", "shell", 1}, // 2893
+ {utils_wxLaunchDefaultBrowser, "utils", "launchDefaultBrowser", 2}, // 2894
+ {utils_wxGetEmailAddress, "utils", "getEmailAddress", 0}, // 2895
+ {utils_wxGetUserId, "utils", "getUserId", 0}, // 2896
+ {utils_wxGetHomeDir, "utils", "getHomeDir", 0}, // 2897
+ {utils_wxNewId, "utils", "newId", 0}, // 2898
+ {utils_wxRegisterId, "utils", "registerId", 1}, // 2899
+ {utils_wxGetCurrentId, "utils", "getCurrentId", 0}, // 2900
+ {utils_wxGetOsDescription, "utils", "getOsDescription", 0}, // 2901
+ {utils_wxIsPlatformLittleEndian, "utils", "isPlatformLittleEndian", 0}, // 2902
+ {utils_wxIsPlatform64Bit, "utils", "isPlatform64Bit", 0}, // 2903
+ {gdicmn_wxDisplaySize, "gdicmn", "displaySize", 0}, // 2904
+ {gdicmn_wxSetCursor, "gdicmn", "setCursor", 1}, // 2905
+ {wxPrintout_new, "wxPrintout", "new", 3}, // 2906
+ {NULL, "wxPrintout", "destroy", 1}, // 2907 obj destructor wxPrintout_destruct
+ {wxPrintout_GetDC, "wxPrintout", "getDC", 1}, // 2908
+ {wxPrintout_GetPageSizeMM, "wxPrintout", "getPageSizeMM", 1}, // 2909
+ {wxPrintout_GetPageSizePixels, "wxPrintout", "getPageSizePixels", 1}, // 2910
+ {wxPrintout_GetPaperRectPixels, "wxPrintout", "getPaperRectPixels", 1}, // 2911
+ {wxPrintout_GetPPIPrinter, "wxPrintout", "getPPIPrinter", 1}, // 2912
+ {wxPrintout_GetPPIScreen, "wxPrintout", "getPPIScreen", 1}, // 2913
+ {wxPrintout_GetTitle, "wxPrintout", "getTitle", 1}, // 2914
+ {wxPrintout_IsPreview, "wxPrintout", "isPreview", 1}, // 2915
+ {wxPrintout_FitThisSizeToPaper, "wxPrintout", "fitThisSizeToPaper", 2}, // 2916
+ {wxPrintout_FitThisSizeToPage, "wxPrintout", "fitThisSizeToPage", 2}, // 2917
+ {wxPrintout_FitThisSizeToPageMargins, "wxPrintout", "fitThisSizeToPageMargins", 3}, // 2918
+ {wxPrintout_MapScreenSizeToPaper, "wxPrintout", "mapScreenSizeToPaper", 1}, // 2919
+ {wxPrintout_MapScreenSizeToPage, "wxPrintout", "mapScreenSizeToPage", 1}, // 2920
+ {wxPrintout_MapScreenSizeToPageMargins, "wxPrintout", "mapScreenSizeToPageMargins", 2}, // 2921
+ {wxPrintout_MapScreenSizeToDevice, "wxPrintout", "mapScreenSizeToDevice", 1}, // 2922
+ {wxPrintout_GetLogicalPaperRect, "wxPrintout", "getLogicalPaperRect", 1}, // 2923
+ {wxPrintout_GetLogicalPageRect, "wxPrintout", "getLogicalPageRect", 1}, // 2924
+ {wxPrintout_GetLogicalPageMarginsRect, "wxPrintout", "getLogicalPageMarginsRect", 2}, // 2925
+ {wxPrintout_SetLogicalOrigin, "wxPrintout", "setLogicalOrigin", 3}, // 2926
+ {wxPrintout_OffsetLogicalOrigin, "wxPrintout", "offsetLogicalOrigin", 3}, // 2927
+ {wxStyledTextCtrl_new_2, "wxStyledTextCtrl", "new", 2}, // 2928
+ {wxStyledTextCtrl_new_0, "wxStyledTextCtrl", "new", 0}, // 2929
+ {NULL, "wxStyledTextCtrl", "destroy", 1}, // 2930 obj destructor wxStyledTextCtrl_destruct
+ {wxStyledTextCtrl_Create, "wxStyledTextCtrl", "create", 3}, // 2931
+ {wxStyledTextCtrl_AddText, "wxStyledTextCtrl", "addText", 2}, // 2932
+ {wxStyledTextCtrl_InsertText, "wxStyledTextCtrl", "insertText", 3}, // 2933
+ {wxStyledTextCtrl_ClearAll, "wxStyledTextCtrl", "clearAll", 1}, // 2934
+ {wxStyledTextCtrl_ClearDocumentStyle, "wxStyledTextCtrl", "clearDocumentStyle", 1}, // 2935
+ {wxStyledTextCtrl_GetLength, "wxStyledTextCtrl", "getLength", 1}, // 2936
+ {wxStyledTextCtrl_GetCharAt, "wxStyledTextCtrl", "getCharAt", 2}, // 2937
+ {wxStyledTextCtrl_GetCurrentPos, "wxStyledTextCtrl", "getCurrentPos", 1}, // 2938
+ {wxStyledTextCtrl_GetAnchor, "wxStyledTextCtrl", "getAnchor", 1}, // 2939
+ {wxStyledTextCtrl_GetStyleAt, "wxStyledTextCtrl", "getStyleAt", 2}, // 2940
+ {wxStyledTextCtrl_Redo, "wxStyledTextCtrl", "redo", 1}, // 2941
+ {wxStyledTextCtrl_SetUndoCollection, "wxStyledTextCtrl", "setUndoCollection", 2}, // 2942
+ {wxStyledTextCtrl_SelectAll, "wxStyledTextCtrl", "selectAll", 1}, // 2943
+ {wxStyledTextCtrl_SetSavePoint, "wxStyledTextCtrl", "setSavePoint", 1}, // 2944
+ {wxStyledTextCtrl_CanRedo, "wxStyledTextCtrl", "canRedo", 1}, // 2945
+ {wxStyledTextCtrl_MarkerLineFromHandle, "wxStyledTextCtrl", "markerLineFromHandle", 2}, // 2946
+ {wxStyledTextCtrl_MarkerDeleteHandle, "wxStyledTextCtrl", "markerDeleteHandle", 2}, // 2947
+ {wxStyledTextCtrl_GetUndoCollection, "wxStyledTextCtrl", "getUndoCollection", 1}, // 2948
+ {wxStyledTextCtrl_GetViewWhiteSpace, "wxStyledTextCtrl", "getViewWhiteSpace", 1}, // 2949
+ {wxStyledTextCtrl_SetViewWhiteSpace, "wxStyledTextCtrl", "setViewWhiteSpace", 2}, // 2950
+ {wxStyledTextCtrl_PositionFromPoint, "wxStyledTextCtrl", "positionFromPoint", 2}, // 2951
+ {wxStyledTextCtrl_PositionFromPointClose, "wxStyledTextCtrl", "positionFromPointClose", 3}, // 2952
+ {wxStyledTextCtrl_GotoLine, "wxStyledTextCtrl", "gotoLine", 2}, // 2953
+ {wxStyledTextCtrl_GotoPos, "wxStyledTextCtrl", "gotoPos", 2}, // 2954
+ {wxStyledTextCtrl_SetAnchor, "wxStyledTextCtrl", "setAnchor", 2}, // 2955
+ {wxStyledTextCtrl_GetCurLine, "wxStyledTextCtrl", "getCurLine", 1}, // 2956
+ {wxStyledTextCtrl_GetEndStyled, "wxStyledTextCtrl", "getEndStyled", 1}, // 2957
+ {wxStyledTextCtrl_ConvertEOLs, "wxStyledTextCtrl", "convertEOLs", 2}, // 2958
+ {wxStyledTextCtrl_GetEOLMode, "wxStyledTextCtrl", "getEOLMode", 1}, // 2959
+ {wxStyledTextCtrl_SetEOLMode, "wxStyledTextCtrl", "setEOLMode", 2}, // 2960
+ {wxStyledTextCtrl_StartStyling, "wxStyledTextCtrl", "startStyling", 2}, // 2961
+ {wxStyledTextCtrl_SetStyling, "wxStyledTextCtrl", "setStyling", 3}, // 2962
+ {wxStyledTextCtrl_GetBufferedDraw, "wxStyledTextCtrl", "getBufferedDraw", 1}, // 2963
+ {wxStyledTextCtrl_SetBufferedDraw, "wxStyledTextCtrl", "setBufferedDraw", 2}, // 2964
+ {wxStyledTextCtrl_SetTabWidth, "wxStyledTextCtrl", "setTabWidth", 2}, // 2965
+ {wxStyledTextCtrl_GetTabWidth, "wxStyledTextCtrl", "getTabWidth", 1}, // 2966
+ {wxStyledTextCtrl_SetCodePage, "wxStyledTextCtrl", "setCodePage", 2}, // 2967
+ {wxStyledTextCtrl_MarkerDefine, "wxStyledTextCtrl", "markerDefine", 4}, // 2968
+ {wxStyledTextCtrl_MarkerSetForeground, "wxStyledTextCtrl", "markerSetForeground", 3}, // 2969
+ {wxStyledTextCtrl_MarkerSetBackground, "wxStyledTextCtrl", "markerSetBackground", 3}, // 2970
+ {wxStyledTextCtrl_MarkerAdd, "wxStyledTextCtrl", "markerAdd", 3}, // 2971
+ {wxStyledTextCtrl_MarkerDelete, "wxStyledTextCtrl", "markerDelete", 3}, // 2972
+ {wxStyledTextCtrl_MarkerDeleteAll, "wxStyledTextCtrl", "markerDeleteAll", 2}, // 2973
+ {wxStyledTextCtrl_MarkerGet, "wxStyledTextCtrl", "markerGet", 2}, // 2974
+ {wxStyledTextCtrl_MarkerNext, "wxStyledTextCtrl", "markerNext", 3}, // 2975
+ {wxStyledTextCtrl_MarkerPrevious, "wxStyledTextCtrl", "markerPrevious", 3}, // 2976
+ {wxStyledTextCtrl_MarkerDefineBitmap, "wxStyledTextCtrl", "markerDefineBitmap", 3}, // 2977
+ {wxStyledTextCtrl_MarkerAddSet, "wxStyledTextCtrl", "markerAddSet", 3}, // 2978
+ {wxStyledTextCtrl_MarkerSetAlpha, "wxStyledTextCtrl", "markerSetAlpha", 3}, // 2979
+ {wxStyledTextCtrl_SetMarginType, "wxStyledTextCtrl", "setMarginType", 3}, // 2980
+ {wxStyledTextCtrl_GetMarginType, "wxStyledTextCtrl", "getMarginType", 2}, // 2981
+ {wxStyledTextCtrl_SetMarginWidth, "wxStyledTextCtrl", "setMarginWidth", 3}, // 2982
+ {wxStyledTextCtrl_GetMarginWidth, "wxStyledTextCtrl", "getMarginWidth", 2}, // 2983
+ {wxStyledTextCtrl_SetMarginMask, "wxStyledTextCtrl", "setMarginMask", 3}, // 2984
+ {wxStyledTextCtrl_GetMarginMask, "wxStyledTextCtrl", "getMarginMask", 2}, // 2985
+ {wxStyledTextCtrl_SetMarginSensitive, "wxStyledTextCtrl", "setMarginSensitive", 3}, // 2986
+ {wxStyledTextCtrl_GetMarginSensitive, "wxStyledTextCtrl", "getMarginSensitive", 2}, // 2987
+ {wxStyledTextCtrl_StyleClearAll, "wxStyledTextCtrl", "styleClearAll", 1}, // 2988
+ {wxStyledTextCtrl_StyleSetForeground, "wxStyledTextCtrl", "styleSetForeground", 3}, // 2989
+ {wxStyledTextCtrl_StyleSetBackground, "wxStyledTextCtrl", "styleSetBackground", 3}, // 2990
+ {wxStyledTextCtrl_StyleSetBold, "wxStyledTextCtrl", "styleSetBold", 3}, // 2991
+ {wxStyledTextCtrl_StyleSetItalic, "wxStyledTextCtrl", "styleSetItalic", 3}, // 2992
+ {wxStyledTextCtrl_StyleSetSize, "wxStyledTextCtrl", "styleSetSize", 3}, // 2993
+ {wxStyledTextCtrl_StyleSetFaceName, "wxStyledTextCtrl", "styleSetFaceName", 3}, // 2994
+ {wxStyledTextCtrl_StyleSetEOLFilled, "wxStyledTextCtrl", "styleSetEOLFilled", 3}, // 2995
+ {wxStyledTextCtrl_StyleResetDefault, "wxStyledTextCtrl", "styleResetDefault", 1}, // 2996
+ {wxStyledTextCtrl_StyleSetUnderline, "wxStyledTextCtrl", "styleSetUnderline", 3}, // 2997
+ {wxStyledTextCtrl_StyleSetCase, "wxStyledTextCtrl", "styleSetCase", 3}, // 2998
+ {wxStyledTextCtrl_StyleSetHotSpot, "wxStyledTextCtrl", "styleSetHotSpot", 3}, // 2999
+ {wxStyledTextCtrl_SetSelForeground, "wxStyledTextCtrl", "setSelForeground", 3}, // 3000
+ {wxStyledTextCtrl_SetSelBackground, "wxStyledTextCtrl", "setSelBackground", 3}, // 3001
+ {wxStyledTextCtrl_GetSelAlpha, "wxStyledTextCtrl", "getSelAlpha", 1}, // 3002
+ {wxStyledTextCtrl_SetSelAlpha, "wxStyledTextCtrl", "setSelAlpha", 2}, // 3003
+ {wxStyledTextCtrl_SetCaretForeground, "wxStyledTextCtrl", "setCaretForeground", 2}, // 3004
+ {wxStyledTextCtrl_CmdKeyAssign, "wxStyledTextCtrl", "cmdKeyAssign", 4}, // 3005
+ {wxStyledTextCtrl_CmdKeyClear, "wxStyledTextCtrl", "cmdKeyClear", 3}, // 3006
+ {wxStyledTextCtrl_CmdKeyClearAll, "wxStyledTextCtrl", "cmdKeyClearAll", 1}, // 3007
+ {wxStyledTextCtrl_SetStyleBytes, "wxStyledTextCtrl", "setStyleBytes", 2}, // 3008
+ {wxStyledTextCtrl_StyleSetVisible, "wxStyledTextCtrl", "styleSetVisible", 3}, // 3009
+ {wxStyledTextCtrl_GetCaretPeriod, "wxStyledTextCtrl", "getCaretPeriod", 1}, // 3010
+ {wxStyledTextCtrl_SetCaretPeriod, "wxStyledTextCtrl", "setCaretPeriod", 2}, // 3011
+ {wxStyledTextCtrl_SetWordChars, "wxStyledTextCtrl", "setWordChars", 2}, // 3012
+ {wxStyledTextCtrl_BeginUndoAction, "wxStyledTextCtrl", "beginUndoAction", 1}, // 3013
+ {wxStyledTextCtrl_EndUndoAction, "wxStyledTextCtrl", "endUndoAction", 1}, // 3014
+ {wxStyledTextCtrl_IndicatorSetStyle, "wxStyledTextCtrl", "indicatorSetStyle", 3}, // 3015
+ {wxStyledTextCtrl_IndicatorGetStyle, "wxStyledTextCtrl", "indicatorGetStyle", 2}, // 3016
+ {wxStyledTextCtrl_IndicatorSetForeground, "wxStyledTextCtrl", "indicatorSetForeground", 3}, // 3017
+ {wxStyledTextCtrl_IndicatorGetForeground, "wxStyledTextCtrl", "indicatorGetForeground", 2}, // 3018
+ {wxStyledTextCtrl_SetWhitespaceForeground, "wxStyledTextCtrl", "setWhitespaceForeground", 3}, // 3019
+ {wxStyledTextCtrl_SetWhitespaceBackground, "wxStyledTextCtrl", "setWhitespaceBackground", 3}, // 3020
+ {wxStyledTextCtrl_GetStyleBits, "wxStyledTextCtrl", "getStyleBits", 1}, // 3021
+ {wxStyledTextCtrl_SetLineState, "wxStyledTextCtrl", "setLineState", 3}, // 3022
+ {wxStyledTextCtrl_GetLineState, "wxStyledTextCtrl", "getLineState", 2}, // 3023
+ {wxStyledTextCtrl_GetMaxLineState, "wxStyledTextCtrl", "getMaxLineState", 1}, // 3024
+ {wxStyledTextCtrl_GetCaretLineVisible, "wxStyledTextCtrl", "getCaretLineVisible", 1}, // 3025
+ {wxStyledTextCtrl_SetCaretLineVisible, "wxStyledTextCtrl", "setCaretLineVisible", 2}, // 3026
+ {wxStyledTextCtrl_GetCaretLineBackground, "wxStyledTextCtrl", "getCaretLineBackground", 1}, // 3027
+ {wxStyledTextCtrl_SetCaretLineBackground, "wxStyledTextCtrl", "setCaretLineBackground", 2}, // 3028
+ {wxStyledTextCtrl_AutoCompShow, "wxStyledTextCtrl", "autoCompShow", 3}, // 3029
+ {wxStyledTextCtrl_AutoCompCancel, "wxStyledTextCtrl", "autoCompCancel", 1}, // 3030
+ {wxStyledTextCtrl_AutoCompActive, "wxStyledTextCtrl", "autoCompActive", 1}, // 3031
+ {wxStyledTextCtrl_AutoCompPosStart, "wxStyledTextCtrl", "autoCompPosStart", 1}, // 3032
+ {wxStyledTextCtrl_AutoCompComplete, "wxStyledTextCtrl", "autoCompComplete", 1}, // 3033
+ {wxStyledTextCtrl_AutoCompStops, "wxStyledTextCtrl", "autoCompStops", 2}, // 3034
+ {wxStyledTextCtrl_AutoCompSetSeparator, "wxStyledTextCtrl", "autoCompSetSeparator", 2}, // 3035
+ {wxStyledTextCtrl_AutoCompGetSeparator, "wxStyledTextCtrl", "autoCompGetSeparator", 1}, // 3036
+ {wxStyledTextCtrl_AutoCompSelect, "wxStyledTextCtrl", "autoCompSelect", 2}, // 3037
+ {wxStyledTextCtrl_AutoCompSetCancelAtStart, "wxStyledTextCtrl", "autoCompSetCancelAtStart", 2}, // 3038
+ {wxStyledTextCtrl_AutoCompGetCancelAtStart, "wxStyledTextCtrl", "autoCompGetCancelAtStart", 1}, // 3039
+ {wxStyledTextCtrl_AutoCompSetFillUps, "wxStyledTextCtrl", "autoCompSetFillUps", 2}, // 3040
+ {wxStyledTextCtrl_AutoCompSetChooseSingle, "wxStyledTextCtrl", "autoCompSetChooseSingle", 2}, // 3041
+ {wxStyledTextCtrl_AutoCompGetChooseSingle, "wxStyledTextCtrl", "autoCompGetChooseSingle", 1}, // 3042
+ {wxStyledTextCtrl_AutoCompSetIgnoreCase, "wxStyledTextCtrl", "autoCompSetIgnoreCase", 2}, // 3043
+ {wxStyledTextCtrl_AutoCompGetIgnoreCase, "wxStyledTextCtrl", "autoCompGetIgnoreCase", 1}, // 3044
+ {wxStyledTextCtrl_UserListShow, "wxStyledTextCtrl", "userListShow", 3}, // 3045
+ {wxStyledTextCtrl_AutoCompSetAutoHide, "wxStyledTextCtrl", "autoCompSetAutoHide", 2}, // 3046
+ {wxStyledTextCtrl_AutoCompGetAutoHide, "wxStyledTextCtrl", "autoCompGetAutoHide", 1}, // 3047
+ {wxStyledTextCtrl_AutoCompSetDropRestOfWord, "wxStyledTextCtrl", "autoCompSetDropRestOfWord", 2}, // 3048
+ {wxStyledTextCtrl_AutoCompGetDropRestOfWord, "wxStyledTextCtrl", "autoCompGetDropRestOfWord", 1}, // 3049
+ {wxStyledTextCtrl_RegisterImage, "wxStyledTextCtrl", "registerImage", 3}, // 3050
+ {wxStyledTextCtrl_ClearRegisteredImages, "wxStyledTextCtrl", "clearRegisteredImages", 1}, // 3051
+ {wxStyledTextCtrl_AutoCompGetTypeSeparator, "wxStyledTextCtrl", "autoCompGetTypeSeparator", 1}, // 3052
+ {wxStyledTextCtrl_AutoCompSetTypeSeparator, "wxStyledTextCtrl", "autoCompSetTypeSeparator", 2}, // 3053
+ {wxStyledTextCtrl_AutoCompSetMaxWidth, "wxStyledTextCtrl", "autoCompSetMaxWidth", 2}, // 3054
+ {wxStyledTextCtrl_AutoCompGetMaxWidth, "wxStyledTextCtrl", "autoCompGetMaxWidth", 1}, // 3055
+ {wxStyledTextCtrl_AutoCompSetMaxHeight, "wxStyledTextCtrl", "autoCompSetMaxHeight", 2}, // 3056
+ {wxStyledTextCtrl_AutoCompGetMaxHeight, "wxStyledTextCtrl", "autoCompGetMaxHeight", 1}, // 3057
+ {wxStyledTextCtrl_SetIndent, "wxStyledTextCtrl", "setIndent", 2}, // 3058
+ {wxStyledTextCtrl_GetIndent, "wxStyledTextCtrl", "getIndent", 1}, // 3059
+ {wxStyledTextCtrl_SetUseTabs, "wxStyledTextCtrl", "setUseTabs", 2}, // 3060
+ {wxStyledTextCtrl_GetUseTabs, "wxStyledTextCtrl", "getUseTabs", 1}, // 3061
+ {wxStyledTextCtrl_SetLineIndentation, "wxStyledTextCtrl", "setLineIndentation", 3}, // 3062
+ {wxStyledTextCtrl_GetLineIndentation, "wxStyledTextCtrl", "getLineIndentation", 2}, // 3063
+ {wxStyledTextCtrl_GetLineIndentPosition, "wxStyledTextCtrl", "getLineIndentPosition", 2}, // 3064
+ {wxStyledTextCtrl_GetColumn, "wxStyledTextCtrl", "getColumn", 2}, // 3065
+ {wxStyledTextCtrl_SetUseHorizontalScrollBar, "wxStyledTextCtrl", "setUseHorizontalScrollBar", 2}, // 3066
+ {wxStyledTextCtrl_GetUseHorizontalScrollBar, "wxStyledTextCtrl", "getUseHorizontalScrollBar", 1}, // 3067
+ {wxStyledTextCtrl_SetIndentationGuides, "wxStyledTextCtrl", "setIndentationGuides", 2}, // 3068
+ {wxStyledTextCtrl_GetIndentationGuides, "wxStyledTextCtrl", "getIndentationGuides", 1}, // 3069
+ {wxStyledTextCtrl_SetHighlightGuide, "wxStyledTextCtrl", "setHighlightGuide", 2}, // 3070
+ {wxStyledTextCtrl_GetHighlightGuide, "wxStyledTextCtrl", "getHighlightGuide", 1}, // 3071
+ {wxStyledTextCtrl_GetLineEndPosition, "wxStyledTextCtrl", "getLineEndPosition", 2}, // 3072
+ {wxStyledTextCtrl_GetCodePage, "wxStyledTextCtrl", "getCodePage", 1}, // 3073
+ {wxStyledTextCtrl_GetCaretForeground, "wxStyledTextCtrl", "getCaretForeground", 1}, // 3074
+ {wxStyledTextCtrl_GetReadOnly, "wxStyledTextCtrl", "getReadOnly", 1}, // 3075
+ {wxStyledTextCtrl_SetCurrentPos, "wxStyledTextCtrl", "setCurrentPos", 2}, // 3076
+ {wxStyledTextCtrl_SetSelectionStart, "wxStyledTextCtrl", "setSelectionStart", 2}, // 3077
+ {wxStyledTextCtrl_GetSelectionStart, "wxStyledTextCtrl", "getSelectionStart", 1}, // 3078
+ {wxStyledTextCtrl_SetSelectionEnd, "wxStyledTextCtrl", "setSelectionEnd", 2}, // 3079
+ {wxStyledTextCtrl_GetSelectionEnd, "wxStyledTextCtrl", "getSelectionEnd", 1}, // 3080
+ {wxStyledTextCtrl_SetPrintMagnification, "wxStyledTextCtrl", "setPrintMagnification", 2}, // 3081
+ {wxStyledTextCtrl_GetPrintMagnification, "wxStyledTextCtrl", "getPrintMagnification", 1}, // 3082
+ {wxStyledTextCtrl_SetPrintColourMode, "wxStyledTextCtrl", "setPrintColourMode", 2}, // 3083
+ {wxStyledTextCtrl_GetPrintColourMode, "wxStyledTextCtrl", "getPrintColourMode", 1}, // 3084
+ {wxStyledTextCtrl_FindText, "wxStyledTextCtrl", "findText", 5}, // 3085
+ {wxStyledTextCtrl_FormatRange, "wxStyledTextCtrl", "formatRange", 8}, // 3086
+ {wxStyledTextCtrl_GetFirstVisibleLine, "wxStyledTextCtrl", "getFirstVisibleLine", 1}, // 3087
+ {wxStyledTextCtrl_GetLine, "wxStyledTextCtrl", "getLine", 2}, // 3088
+ {wxStyledTextCtrl_GetLineCount, "wxStyledTextCtrl", "getLineCount", 1}, // 3089
+ {wxStyledTextCtrl_SetMarginLeft, "wxStyledTextCtrl", "setMarginLeft", 2}, // 3090
+ {wxStyledTextCtrl_GetMarginLeft, "wxStyledTextCtrl", "getMarginLeft", 1}, // 3091
+ {wxStyledTextCtrl_SetMarginRight, "wxStyledTextCtrl", "setMarginRight", 2}, // 3092
+ {wxStyledTextCtrl_GetMarginRight, "wxStyledTextCtrl", "getMarginRight", 1}, // 3093
+ {wxStyledTextCtrl_GetModify, "wxStyledTextCtrl", "getModify", 1}, // 3094
+ {wxStyledTextCtrl_SetSelection, "wxStyledTextCtrl", "setSelection", 3}, // 3095
+ {wxStyledTextCtrl_GetSelectedText, "wxStyledTextCtrl", "getSelectedText", 1}, // 3096
+ {wxStyledTextCtrl_GetTextRange, "wxStyledTextCtrl", "getTextRange", 3}, // 3097
+ {wxStyledTextCtrl_HideSelection, "wxStyledTextCtrl", "hideSelection", 2}, // 3098
+ {wxStyledTextCtrl_LineFromPosition, "wxStyledTextCtrl", "lineFromPosition", 2}, // 3099
+ {wxStyledTextCtrl_PositionFromLine, "wxStyledTextCtrl", "positionFromLine", 2}, // 3100
+ {wxStyledTextCtrl_LineScroll, "wxStyledTextCtrl", "lineScroll", 3}, // 3101
+ {wxStyledTextCtrl_EnsureCaretVisible, "wxStyledTextCtrl", "ensureCaretVisible", 1}, // 3102
+ {wxStyledTextCtrl_ReplaceSelection, "wxStyledTextCtrl", "replaceSelection", 2}, // 3103
+ {wxStyledTextCtrl_SetReadOnly, "wxStyledTextCtrl", "setReadOnly", 2}, // 3104
+ {wxStyledTextCtrl_CanPaste, "wxStyledTextCtrl", "canPaste", 1}, // 3105
+ {wxStyledTextCtrl_CanUndo, "wxStyledTextCtrl", "canUndo", 1}, // 3106
+ {wxStyledTextCtrl_EmptyUndoBuffer, "wxStyledTextCtrl", "emptyUndoBuffer", 1}, // 3107
+ {wxStyledTextCtrl_Undo, "wxStyledTextCtrl", "undo", 1}, // 3108
+ {wxStyledTextCtrl_Cut, "wxStyledTextCtrl", "cut", 1}, // 3109
+ {wxStyledTextCtrl_Copy, "wxStyledTextCtrl", "copy", 1}, // 3110
+ {wxStyledTextCtrl_Paste, "wxStyledTextCtrl", "paste", 1}, // 3111
+ {wxStyledTextCtrl_Clear, "wxStyledTextCtrl", "clear", 1}, // 3112
+ {wxStyledTextCtrl_SetText, "wxStyledTextCtrl", "setText", 2}, // 3113
+ {wxStyledTextCtrl_GetText, "wxStyledTextCtrl", "getText", 1}, // 3114
+ {wxStyledTextCtrl_GetTextLength, "wxStyledTextCtrl", "getTextLength", 1}, // 3115
+ {wxStyledTextCtrl_GetOvertype, "wxStyledTextCtrl", "getOvertype", 1}, // 3116
+ {wxStyledTextCtrl_SetCaretWidth, "wxStyledTextCtrl", "setCaretWidth", 2}, // 3117
+ {wxStyledTextCtrl_GetCaretWidth, "wxStyledTextCtrl", "getCaretWidth", 1}, // 3118
+ {wxStyledTextCtrl_SetTargetStart, "wxStyledTextCtrl", "setTargetStart", 2}, // 3119
+ {wxStyledTextCtrl_GetTargetStart, "wxStyledTextCtrl", "getTargetStart", 1}, // 3120
+ {wxStyledTextCtrl_SetTargetEnd, "wxStyledTextCtrl", "setTargetEnd", 2}, // 3121
+ {wxStyledTextCtrl_GetTargetEnd, "wxStyledTextCtrl", "getTargetEnd", 1}, // 3122
+ {wxStyledTextCtrl_ReplaceTarget, "wxStyledTextCtrl", "replaceTarget", 2}, // 3123
+ {wxStyledTextCtrl_SearchInTarget, "wxStyledTextCtrl", "searchInTarget", 2}, // 3124
+ {wxStyledTextCtrl_SetSearchFlags, "wxStyledTextCtrl", "setSearchFlags", 2}, // 3125
+ {wxStyledTextCtrl_GetSearchFlags, "wxStyledTextCtrl", "getSearchFlags", 1}, // 3126
+ {wxStyledTextCtrl_CallTipShow, "wxStyledTextCtrl", "callTipShow", 3}, // 3127
+ {wxStyledTextCtrl_CallTipCancel, "wxStyledTextCtrl", "callTipCancel", 1}, // 3128
+ {wxStyledTextCtrl_CallTipActive, "wxStyledTextCtrl", "callTipActive", 1}, // 3129
+ {wxStyledTextCtrl_CallTipPosAtStart, "wxStyledTextCtrl", "callTipPosAtStart", 1}, // 3130
+ {wxStyledTextCtrl_CallTipSetHighlight, "wxStyledTextCtrl", "callTipSetHighlight", 3}, // 3131
+ {wxStyledTextCtrl_CallTipSetBackground, "wxStyledTextCtrl", "callTipSetBackground", 2}, // 3132
+ {wxStyledTextCtrl_CallTipSetForeground, "wxStyledTextCtrl", "callTipSetForeground", 2}, // 3133
+ {wxStyledTextCtrl_CallTipSetForegroundHighlight, "wxStyledTextCtrl", "callTipSetForegroundHighlight", 2}, // 3134
+ {wxStyledTextCtrl_CallTipUseStyle, "wxStyledTextCtrl", "callTipUseStyle", 2}, // 3135
+ {wxStyledTextCtrl_VisibleFromDocLine, "wxStyledTextCtrl", "visibleFromDocLine", 2}, // 3136
+ {wxStyledTextCtrl_DocLineFromVisible, "wxStyledTextCtrl", "docLineFromVisible", 2}, // 3137
+ {wxStyledTextCtrl_WrapCount, "wxStyledTextCtrl", "wrapCount", 2}, // 3138
+ {wxStyledTextCtrl_SetFoldLevel, "wxStyledTextCtrl", "setFoldLevel", 3}, // 3139
+ {wxStyledTextCtrl_GetFoldLevel, "wxStyledTextCtrl", "getFoldLevel", 2}, // 3140
+ {wxStyledTextCtrl_GetLastChild, "wxStyledTextCtrl", "getLastChild", 3}, // 3141
+ {wxStyledTextCtrl_GetFoldParent, "wxStyledTextCtrl", "getFoldParent", 2}, // 3142
+ {wxStyledTextCtrl_ShowLines, "wxStyledTextCtrl", "showLines", 3}, // 3143
+ {wxStyledTextCtrl_HideLines, "wxStyledTextCtrl", "hideLines", 3}, // 3144
+ {wxStyledTextCtrl_GetLineVisible, "wxStyledTextCtrl", "getLineVisible", 2}, // 3145
+ {wxStyledTextCtrl_SetFoldExpanded, "wxStyledTextCtrl", "setFoldExpanded", 3}, // 3146
+ {wxStyledTextCtrl_GetFoldExpanded, "wxStyledTextCtrl", "getFoldExpanded", 2}, // 3147
+ {wxStyledTextCtrl_ToggleFold, "wxStyledTextCtrl", "toggleFold", 2}, // 3148
+ {wxStyledTextCtrl_EnsureVisible, "wxStyledTextCtrl", "ensureVisible", 2}, // 3149
+ {wxStyledTextCtrl_SetFoldFlags, "wxStyledTextCtrl", "setFoldFlags", 2}, // 3150
+ {wxStyledTextCtrl_EnsureVisibleEnforcePolicy, "wxStyledTextCtrl", "ensureVisibleEnforcePolicy", 2}, // 3151
+ {wxStyledTextCtrl_SetTabIndents, "wxStyledTextCtrl", "setTabIndents", 2}, // 3152
+ {wxStyledTextCtrl_GetTabIndents, "wxStyledTextCtrl", "getTabIndents", 1}, // 3153
+ {wxStyledTextCtrl_SetBackSpaceUnIndents, "wxStyledTextCtrl", "setBackSpaceUnIndents", 2}, // 3154
+ {wxStyledTextCtrl_GetBackSpaceUnIndents, "wxStyledTextCtrl", "getBackSpaceUnIndents", 1}, // 3155
+ {wxStyledTextCtrl_SetMouseDwellTime, "wxStyledTextCtrl", "setMouseDwellTime", 2}, // 3156
+ {wxStyledTextCtrl_GetMouseDwellTime, "wxStyledTextCtrl", "getMouseDwellTime", 1}, // 3157
+ {wxStyledTextCtrl_WordStartPosition, "wxStyledTextCtrl", "wordStartPosition", 3}, // 3158
+ {wxStyledTextCtrl_WordEndPosition, "wxStyledTextCtrl", "wordEndPosition", 3}, // 3159
+ {wxStyledTextCtrl_SetWrapMode, "wxStyledTextCtrl", "setWrapMode", 2}, // 3160
+ {wxStyledTextCtrl_GetWrapMode, "wxStyledTextCtrl", "getWrapMode", 1}, // 3161
+ {wxStyledTextCtrl_SetWrapVisualFlags, "wxStyledTextCtrl", "setWrapVisualFlags", 2}, // 3162
+ {wxStyledTextCtrl_GetWrapVisualFlags, "wxStyledTextCtrl", "getWrapVisualFlags", 1}, // 3163
+ {wxStyledTextCtrl_SetWrapVisualFlagsLocation, "wxStyledTextCtrl", "setWrapVisualFlagsLocation", 2}, // 3164
+ {wxStyledTextCtrl_GetWrapVisualFlagsLocation, "wxStyledTextCtrl", "getWrapVisualFlagsLocation", 1}, // 3165
+ {wxStyledTextCtrl_SetWrapStartIndent, "wxStyledTextCtrl", "setWrapStartIndent", 2}, // 3166
+ {wxStyledTextCtrl_GetWrapStartIndent, "wxStyledTextCtrl", "getWrapStartIndent", 1}, // 3167
+ {wxStyledTextCtrl_SetLayoutCache, "wxStyledTextCtrl", "setLayoutCache", 2}, // 3168
+ {wxStyledTextCtrl_GetLayoutCache, "wxStyledTextCtrl", "getLayoutCache", 1}, // 3169
+ {wxStyledTextCtrl_SetScrollWidth, "wxStyledTextCtrl", "setScrollWidth", 2}, // 3170
+ {wxStyledTextCtrl_GetScrollWidth, "wxStyledTextCtrl", "getScrollWidth", 1}, // 3171
+ {wxStyledTextCtrl_TextWidth, "wxStyledTextCtrl", "textWidth", 3}, // 3172
+ {wxStyledTextCtrl_GetEndAtLastLine, "wxStyledTextCtrl", "getEndAtLastLine", 1}, // 3173
+ {wxStyledTextCtrl_TextHeight, "wxStyledTextCtrl", "textHeight", 2}, // 3174
+ {wxStyledTextCtrl_SetUseVerticalScrollBar, "wxStyledTextCtrl", "setUseVerticalScrollBar", 2}, // 3175
+ {wxStyledTextCtrl_GetUseVerticalScrollBar, "wxStyledTextCtrl", "getUseVerticalScrollBar", 1}, // 3176
+ {wxStyledTextCtrl_AppendText, "wxStyledTextCtrl", "appendText", 2}, // 3177
+ {wxStyledTextCtrl_GetTwoPhaseDraw, "wxStyledTextCtrl", "getTwoPhaseDraw", 1}, // 3178
+ {wxStyledTextCtrl_SetTwoPhaseDraw, "wxStyledTextCtrl", "setTwoPhaseDraw", 2}, // 3179
+ {wxStyledTextCtrl_TargetFromSelection, "wxStyledTextCtrl", "targetFromSelection", 1}, // 3180
+ {wxStyledTextCtrl_LinesJoin, "wxStyledTextCtrl", "linesJoin", 1}, // 3181
+ {wxStyledTextCtrl_LinesSplit, "wxStyledTextCtrl", "linesSplit", 2}, // 3182
+ {wxStyledTextCtrl_SetFoldMarginColour, "wxStyledTextCtrl", "setFoldMarginColour", 3}, // 3183
+ {wxStyledTextCtrl_SetFoldMarginHiColour, "wxStyledTextCtrl", "setFoldMarginHiColour", 3}, // 3184
+ {wxStyledTextCtrl_LineDown, "wxStyledTextCtrl", "lineDown", 1}, // 3185
+ {wxStyledTextCtrl_LineDownExtend, "wxStyledTextCtrl", "lineDownExtend", 1}, // 3186
+ {wxStyledTextCtrl_LineUp, "wxStyledTextCtrl", "lineUp", 1}, // 3187
+ {wxStyledTextCtrl_LineUpExtend, "wxStyledTextCtrl", "lineUpExtend", 1}, // 3188
+ {wxStyledTextCtrl_CharLeft, "wxStyledTextCtrl", "charLeft", 1}, // 3189
+ {wxStyledTextCtrl_CharLeftExtend, "wxStyledTextCtrl", "charLeftExtend", 1}, // 3190
+ {wxStyledTextCtrl_CharRight, "wxStyledTextCtrl", "charRight", 1}, // 3191
+ {wxStyledTextCtrl_CharRightExtend, "wxStyledTextCtrl", "charRightExtend", 1}, // 3192
+ {wxStyledTextCtrl_WordLeft, "wxStyledTextCtrl", "wordLeft", 1}, // 3193
+ {wxStyledTextCtrl_WordLeftExtend, "wxStyledTextCtrl", "wordLeftExtend", 1}, // 3194
+ {wxStyledTextCtrl_WordRight, "wxStyledTextCtrl", "wordRight", 1}, // 3195
+ {wxStyledTextCtrl_WordRightExtend, "wxStyledTextCtrl", "wordRightExtend", 1}, // 3196
+ {wxStyledTextCtrl_Home, "wxStyledTextCtrl", "home", 1}, // 3197
+ {wxStyledTextCtrl_HomeExtend, "wxStyledTextCtrl", "homeExtend", 1}, // 3198
+ {wxStyledTextCtrl_LineEnd, "wxStyledTextCtrl", "lineEnd", 1}, // 3199
+ {wxStyledTextCtrl_LineEndExtend, "wxStyledTextCtrl", "lineEndExtend", 1}, // 3200
+ {wxStyledTextCtrl_DocumentStart, "wxStyledTextCtrl", "documentStart", 1}, // 3201
+ {wxStyledTextCtrl_DocumentStartExtend, "wxStyledTextCtrl", "documentStartExtend", 1}, // 3202
+ {wxStyledTextCtrl_DocumentEnd, "wxStyledTextCtrl", "documentEnd", 1}, // 3203
+ {wxStyledTextCtrl_DocumentEndExtend, "wxStyledTextCtrl", "documentEndExtend", 1}, // 3204
+ {wxStyledTextCtrl_PageUp, "wxStyledTextCtrl", "pageUp", 1}, // 3205
+ {wxStyledTextCtrl_PageUpExtend, "wxStyledTextCtrl", "pageUpExtend", 1}, // 3206
+ {wxStyledTextCtrl_PageDown, "wxStyledTextCtrl", "pageDown", 1}, // 3207
+ {wxStyledTextCtrl_PageDownExtend, "wxStyledTextCtrl", "pageDownExtend", 1}, // 3208
+ {wxStyledTextCtrl_EditToggleOvertype, "wxStyledTextCtrl", "editToggleOvertype", 1}, // 3209
+ {wxStyledTextCtrl_Cancel, "wxStyledTextCtrl", "cancel", 1}, // 3210
+ {wxStyledTextCtrl_DeleteBack, "wxStyledTextCtrl", "deleteBack", 1}, // 3211
+ {wxStyledTextCtrl_Tab, "wxStyledTextCtrl", "tab", 1}, // 3212
+ {wxStyledTextCtrl_BackTab, "wxStyledTextCtrl", "backTab", 1}, // 3213
+ {wxStyledTextCtrl_NewLine, "wxStyledTextCtrl", "newLine", 1}, // 3214
+ {wxStyledTextCtrl_FormFeed, "wxStyledTextCtrl", "formFeed", 1}, // 3215
+ {wxStyledTextCtrl_VCHome, "wxStyledTextCtrl", "vCHome", 1}, // 3216
+ {wxStyledTextCtrl_VCHomeExtend, "wxStyledTextCtrl", "vCHomeExtend", 1}, // 3217
+ {wxStyledTextCtrl_ZoomIn, "wxStyledTextCtrl", "zoomIn", 1}, // 3218
+ {wxStyledTextCtrl_ZoomOut, "wxStyledTextCtrl", "zoomOut", 1}, // 3219
+ {wxStyledTextCtrl_DelWordLeft, "wxStyledTextCtrl", "delWordLeft", 1}, // 3220
+ {wxStyledTextCtrl_DelWordRight, "wxStyledTextCtrl", "delWordRight", 1}, // 3221
+ {wxStyledTextCtrl_LineCut, "wxStyledTextCtrl", "lineCut", 1}, // 3222
+ {wxStyledTextCtrl_LineDelete, "wxStyledTextCtrl", "lineDelete", 1}, // 3223
+ {wxStyledTextCtrl_LineTranspose, "wxStyledTextCtrl", "lineTranspose", 1}, // 3224
+ {wxStyledTextCtrl_LineDuplicate, "wxStyledTextCtrl", "lineDuplicate", 1}, // 3225
+ {wxStyledTextCtrl_LowerCase, "wxStyledTextCtrl", "lowerCase", 1}, // 3226
+ {wxStyledTextCtrl_UpperCase, "wxStyledTextCtrl", "upperCase", 1}, // 3227
+ {wxStyledTextCtrl_LineScrollDown, "wxStyledTextCtrl", "lineScrollDown", 1}, // 3228
+ {wxStyledTextCtrl_LineScrollUp, "wxStyledTextCtrl", "lineScrollUp", 1}, // 3229
+ {wxStyledTextCtrl_DeleteBackNotLine, "wxStyledTextCtrl", "deleteBackNotLine", 1}, // 3230
+ {wxStyledTextCtrl_HomeDisplay, "wxStyledTextCtrl", "homeDisplay", 1}, // 3231
+ {wxStyledTextCtrl_HomeDisplayExtend, "wxStyledTextCtrl", "homeDisplayExtend", 1}, // 3232
+ {wxStyledTextCtrl_LineEndDisplay, "wxStyledTextCtrl", "lineEndDisplay", 1}, // 3233
+ {wxStyledTextCtrl_LineEndDisplayExtend, "wxStyledTextCtrl", "lineEndDisplayExtend", 1}, // 3234
+ {wxStyledTextCtrl_HomeWrapExtend, "wxStyledTextCtrl", "homeWrapExtend", 1}, // 3235
+ {wxStyledTextCtrl_LineEndWrap, "wxStyledTextCtrl", "lineEndWrap", 1}, // 3236
+ {wxStyledTextCtrl_LineEndWrapExtend, "wxStyledTextCtrl", "lineEndWrapExtend", 1}, // 3237
+ {wxStyledTextCtrl_VCHomeWrap, "wxStyledTextCtrl", "vCHomeWrap", 1}, // 3238
+ {wxStyledTextCtrl_VCHomeWrapExtend, "wxStyledTextCtrl", "vCHomeWrapExtend", 1}, // 3239
+ {wxStyledTextCtrl_LineCopy, "wxStyledTextCtrl", "lineCopy", 1}, // 3240
+ {wxStyledTextCtrl_MoveCaretInsideView, "wxStyledTextCtrl", "moveCaretInsideView", 1}, // 3241
+ {wxStyledTextCtrl_LineLength, "wxStyledTextCtrl", "lineLength", 2}, // 3242
+ {wxStyledTextCtrl_BraceHighlight, "wxStyledTextCtrl", "braceHighlight", 3}, // 3243
+ {wxStyledTextCtrl_BraceBadLight, "wxStyledTextCtrl", "braceBadLight", 2}, // 3244
+ {wxStyledTextCtrl_BraceMatch, "wxStyledTextCtrl", "braceMatch", 2}, // 3245
+ {wxStyledTextCtrl_GetViewEOL, "wxStyledTextCtrl", "getViewEOL", 1}, // 3246
+ {wxStyledTextCtrl_SetViewEOL, "wxStyledTextCtrl", "setViewEOL", 2}, // 3247
+ {wxStyledTextCtrl_SetModEventMask, "wxStyledTextCtrl", "setModEventMask", 2}, // 3248
+ {wxStyledTextCtrl_GetEdgeColumn, "wxStyledTextCtrl", "getEdgeColumn", 1}, // 3249
+ {wxStyledTextCtrl_SetEdgeColumn, "wxStyledTextCtrl", "setEdgeColumn", 2}, // 3250
+ {wxStyledTextCtrl_SetEdgeMode, "wxStyledTextCtrl", "setEdgeMode", 2}, // 3251
+ {wxStyledTextCtrl_GetEdgeMode, "wxStyledTextCtrl", "getEdgeMode", 1}, // 3252
+ {wxStyledTextCtrl_GetEdgeColour, "wxStyledTextCtrl", "getEdgeColour", 1}, // 3253
+ {wxStyledTextCtrl_SetEdgeColour, "wxStyledTextCtrl", "setEdgeColour", 2}, // 3254
+ {wxStyledTextCtrl_SearchAnchor, "wxStyledTextCtrl", "searchAnchor", 1}, // 3255
+ {wxStyledTextCtrl_SearchNext, "wxStyledTextCtrl", "searchNext", 3}, // 3256
+ {wxStyledTextCtrl_SearchPrev, "wxStyledTextCtrl", "searchPrev", 3}, // 3257
+ {wxStyledTextCtrl_LinesOnScreen, "wxStyledTextCtrl", "linesOnScreen", 1}, // 3258
+ {wxStyledTextCtrl_UsePopUp, "wxStyledTextCtrl", "usePopUp", 2}, // 3259
+ {wxStyledTextCtrl_SelectionIsRectangle, "wxStyledTextCtrl", "selectionIsRectangle", 1}, // 3260
+ {wxStyledTextCtrl_SetZoom, "wxStyledTextCtrl", "setZoom", 2}, // 3261
+ {wxStyledTextCtrl_GetZoom, "wxStyledTextCtrl", "getZoom", 1}, // 3262
+ {wxStyledTextCtrl_GetModEventMask, "wxStyledTextCtrl", "getModEventMask", 1}, // 3263
+ {wxStyledTextCtrl_SetSTCFocus, "wxStyledTextCtrl", "setSTCFocus", 2}, // 3264
+ {wxStyledTextCtrl_GetSTCFocus, "wxStyledTextCtrl", "getSTCFocus", 1}, // 3265
+ {wxStyledTextCtrl_SetStatus, "wxStyledTextCtrl", "setStatus", 2}, // 3266
+ {wxStyledTextCtrl_GetStatus, "wxStyledTextCtrl", "getStatus", 1}, // 3267
+ {wxStyledTextCtrl_SetMouseDownCaptures, "wxStyledTextCtrl", "setMouseDownCaptures", 2}, // 3268
+ {wxStyledTextCtrl_GetMouseDownCaptures, "wxStyledTextCtrl", "getMouseDownCaptures", 1}, // 3269
+ {wxStyledTextCtrl_SetSTCCursor, "wxStyledTextCtrl", "setSTCCursor", 2}, // 3270
+ {wxStyledTextCtrl_GetSTCCursor, "wxStyledTextCtrl", "getSTCCursor", 1}, // 3271
+ {wxStyledTextCtrl_SetControlCharSymbol, "wxStyledTextCtrl", "setControlCharSymbol", 2}, // 3272
+ {wxStyledTextCtrl_GetControlCharSymbol, "wxStyledTextCtrl", "getControlCharSymbol", 1}, // 3273
+ {wxStyledTextCtrl_WordPartLeft, "wxStyledTextCtrl", "wordPartLeft", 1}, // 3274
+ {wxStyledTextCtrl_WordPartLeftExtend, "wxStyledTextCtrl", "wordPartLeftExtend", 1}, // 3275
+ {wxStyledTextCtrl_WordPartRight, "wxStyledTextCtrl", "wordPartRight", 1}, // 3276
+ {wxStyledTextCtrl_WordPartRightExtend, "wxStyledTextCtrl", "wordPartRightExtend", 1}, // 3277
+ {wxStyledTextCtrl_SetVisiblePolicy, "wxStyledTextCtrl", "setVisiblePolicy", 3}, // 3278
+ {wxStyledTextCtrl_DelLineLeft, "wxStyledTextCtrl", "delLineLeft", 1}, // 3279
+ {wxStyledTextCtrl_DelLineRight, "wxStyledTextCtrl", "delLineRight", 1}, // 3280
+ {wxStyledTextCtrl_GetXOffset, "wxStyledTextCtrl", "getXOffset", 1}, // 3281
+ {wxStyledTextCtrl_ChooseCaretX, "wxStyledTextCtrl", "chooseCaretX", 1}, // 3282
+ {wxStyledTextCtrl_SetXCaretPolicy, "wxStyledTextCtrl", "setXCaretPolicy", 3}, // 3283
+ {wxStyledTextCtrl_SetYCaretPolicy, "wxStyledTextCtrl", "setYCaretPolicy", 3}, // 3284
+ {wxStyledTextCtrl_GetPrintWrapMode, "wxStyledTextCtrl", "getPrintWrapMode", 1}, // 3285
+ {wxStyledTextCtrl_SetHotspotActiveForeground, "wxStyledTextCtrl", "setHotspotActiveForeground", 3}, // 3286
+ {wxStyledTextCtrl_SetHotspotActiveBackground, "wxStyledTextCtrl", "setHotspotActiveBackground", 3}, // 3287
+ {wxStyledTextCtrl_SetHotspotActiveUnderline, "wxStyledTextCtrl", "setHotspotActiveUnderline", 2}, // 3288
+ {wxStyledTextCtrl_SetHotspotSingleLine, "wxStyledTextCtrl", "setHotspotSingleLine", 2}, // 3289
+ {wxStyledTextCtrl_ParaDownExtend, "wxStyledTextCtrl", "paraDownExtend", 1}, // 3290
+ {wxStyledTextCtrl_ParaUp, "wxStyledTextCtrl", "paraUp", 1}, // 3291
+ {wxStyledTextCtrl_ParaUpExtend, "wxStyledTextCtrl", "paraUpExtend", 1}, // 3292
+ {wxStyledTextCtrl_PositionBefore, "wxStyledTextCtrl", "positionBefore", 2}, // 3293
+ {wxStyledTextCtrl_PositionAfter, "wxStyledTextCtrl", "positionAfter", 2}, // 3294
+ {wxStyledTextCtrl_CopyRange, "wxStyledTextCtrl", "copyRange", 3}, // 3295
+ {wxStyledTextCtrl_CopyText, "wxStyledTextCtrl", "copyText", 3}, // 3296
+ {wxStyledTextCtrl_SetSelectionMode, "wxStyledTextCtrl", "setSelectionMode", 2}, // 3297
+ {wxStyledTextCtrl_GetSelectionMode, "wxStyledTextCtrl", "getSelectionMode", 1}, // 3298
+ {wxStyledTextCtrl_LineDownRectExtend, "wxStyledTextCtrl", "lineDownRectExtend", 1}, // 3299
+ {wxStyledTextCtrl_LineUpRectExtend, "wxStyledTextCtrl", "lineUpRectExtend", 1}, // 3300
+ {wxStyledTextCtrl_CharLeftRectExtend, "wxStyledTextCtrl", "charLeftRectExtend", 1}, // 3301
+ {wxStyledTextCtrl_CharRightRectExtend, "wxStyledTextCtrl", "charRightRectExtend", 1}, // 3302
+ {wxStyledTextCtrl_HomeRectExtend, "wxStyledTextCtrl", "homeRectExtend", 1}, // 3303
+ {wxStyledTextCtrl_VCHomeRectExtend, "wxStyledTextCtrl", "vCHomeRectExtend", 1}, // 3304
+ {wxStyledTextCtrl_LineEndRectExtend, "wxStyledTextCtrl", "lineEndRectExtend", 1}, // 3305
+ {wxStyledTextCtrl_PageUpRectExtend, "wxStyledTextCtrl", "pageUpRectExtend", 1}, // 3306
+ {wxStyledTextCtrl_PageDownRectExtend, "wxStyledTextCtrl", "pageDownRectExtend", 1}, // 3307
+ {wxStyledTextCtrl_StutteredPageUp, "wxStyledTextCtrl", "stutteredPageUp", 1}, // 3308
+ {wxStyledTextCtrl_StutteredPageUpExtend, "wxStyledTextCtrl", "stutteredPageUpExtend", 1}, // 3309
+ {wxStyledTextCtrl_StutteredPageDown, "wxStyledTextCtrl", "stutteredPageDown", 1}, // 3310
+ {wxStyledTextCtrl_StutteredPageDownExtend, "wxStyledTextCtrl", "stutteredPageDownExtend", 1}, // 3311
+ {wxStyledTextCtrl_WordLeftEnd, "wxStyledTextCtrl", "wordLeftEnd", 1}, // 3312
+ {wxStyledTextCtrl_WordLeftEndExtend, "wxStyledTextCtrl", "wordLeftEndExtend", 1}, // 3313
+ {wxStyledTextCtrl_WordRightEnd, "wxStyledTextCtrl", "wordRightEnd", 1}, // 3314
+ {wxStyledTextCtrl_WordRightEndExtend, "wxStyledTextCtrl", "wordRightEndExtend", 1}, // 3315
+ {wxStyledTextCtrl_SetWhitespaceChars, "wxStyledTextCtrl", "setWhitespaceChars", 2}, // 3316
+ {wxStyledTextCtrl_SetCharsDefault, "wxStyledTextCtrl", "setCharsDefault", 1}, // 3317
+ {wxStyledTextCtrl_AutoCompGetCurrent, "wxStyledTextCtrl", "autoCompGetCurrent", 1}, // 3318
+ {wxStyledTextCtrl_Allocate, "wxStyledTextCtrl", "allocate", 2}, // 3319
+ {wxStyledTextCtrl_FindColumn, "wxStyledTextCtrl", "findColumn", 3}, // 3320
+ {wxStyledTextCtrl_GetCaretSticky, "wxStyledTextCtrl", "getCaretSticky", 1}, // 3321
+ {wxStyledTextCtrl_SetCaretSticky, "wxStyledTextCtrl", "setCaretSticky", 2}, // 3322
+ {wxStyledTextCtrl_ToggleCaretSticky, "wxStyledTextCtrl", "toggleCaretSticky", 1}, // 3323
+ {wxStyledTextCtrl_SetPasteConvertEndings, "wxStyledTextCtrl", "setPasteConvertEndings", 2}, // 3324
+ {wxStyledTextCtrl_GetPasteConvertEndings, "wxStyledTextCtrl", "getPasteConvertEndings", 1}, // 3325
+ {wxStyledTextCtrl_SelectionDuplicate, "wxStyledTextCtrl", "selectionDuplicate", 1}, // 3326
+ {wxStyledTextCtrl_SetCaretLineBackAlpha, "wxStyledTextCtrl", "setCaretLineBackAlpha", 2}, // 3327
+ {wxStyledTextCtrl_GetCaretLineBackAlpha, "wxStyledTextCtrl", "getCaretLineBackAlpha", 1}, // 3328
+ {wxStyledTextCtrl_StartRecord, "wxStyledTextCtrl", "startRecord", 1}, // 3329
+ {wxStyledTextCtrl_StopRecord, "wxStyledTextCtrl", "stopRecord", 1}, // 3330
+ {wxStyledTextCtrl_SetLexer, "wxStyledTextCtrl", "setLexer", 2}, // 3331
+ {wxStyledTextCtrl_GetLexer, "wxStyledTextCtrl", "getLexer", 1}, // 3332
+ {wxStyledTextCtrl_Colourise, "wxStyledTextCtrl", "colourise", 3}, // 3333
+ {wxStyledTextCtrl_SetProperty, "wxStyledTextCtrl", "setProperty", 3}, // 3334
+ {wxStyledTextCtrl_SetKeyWords, "wxStyledTextCtrl", "setKeyWords", 3}, // 3335
+ {wxStyledTextCtrl_SetLexerLanguage, "wxStyledTextCtrl", "setLexerLanguage", 2}, // 3336
+ {wxStyledTextCtrl_GetProperty, "wxStyledTextCtrl", "getProperty", 2}, // 3337
+ {wxStyledTextCtrl_GetStyleBitsNeeded, "wxStyledTextCtrl", "getStyleBitsNeeded", 1}, // 3338
+ {wxStyledTextCtrl_GetCurrentLine, "wxStyledTextCtrl", "getCurrentLine", 1}, // 3339
+ {wxStyledTextCtrl_StyleSetSpec, "wxStyledTextCtrl", "styleSetSpec", 3}, // 3340
+ {wxStyledTextCtrl_StyleSetFont, "wxStyledTextCtrl", "styleSetFont", 3}, // 3341
+ {wxStyledTextCtrl_StyleSetFontAttr, "wxStyledTextCtrl", "styleSetFontAttr", 8}, // 3342
+ {wxStyledTextCtrl_StyleSetCharacterSet, "wxStyledTextCtrl", "styleSetCharacterSet", 3}, // 3343
+ {wxStyledTextCtrl_StyleSetFontEncoding, "wxStyledTextCtrl", "styleSetFontEncoding", 3}, // 3344
+ {wxStyledTextCtrl_CmdKeyExecute, "wxStyledTextCtrl", "cmdKeyExecute", 2}, // 3345
+ {wxStyledTextCtrl_SetMargins, "wxStyledTextCtrl", "setMargins", 3}, // 3346
+ {wxStyledTextCtrl_GetSelection, "wxStyledTextCtrl", "getSelection", 1}, // 3347
+ {wxStyledTextCtrl_PointFromPosition, "wxStyledTextCtrl", "pointFromPosition", 2}, // 3348
+ {wxStyledTextCtrl_ScrollToLine, "wxStyledTextCtrl", "scrollToLine", 2}, // 3349
+ {wxStyledTextCtrl_ScrollToColumn, "wxStyledTextCtrl", "scrollToColumn", 2}, // 3350
+ {wxStyledTextCtrl_SetVScrollBar, "wxStyledTextCtrl", "setVScrollBar", 2}, // 3351
+ {wxStyledTextCtrl_SetHScrollBar, "wxStyledTextCtrl", "setHScrollBar", 2}, // 3352
+ {wxStyledTextCtrl_GetLastKeydownProcessed, "wxStyledTextCtrl", "getLastKeydownProcessed", 1}, // 3353
+ {wxStyledTextCtrl_SetLastKeydownProcessed, "wxStyledTextCtrl", "setLastKeydownProcessed", 2}, // 3354
+ {wxStyledTextCtrl_SaveFile, "wxStyledTextCtrl", "saveFile", 2}, // 3355
+ {wxStyledTextCtrl_LoadFile, "wxStyledTextCtrl", "loadFile", 2}, // 3356
+ {wxStyledTextCtrl_DoDragOver, "wxStyledTextCtrl", "doDragOver", 4}, // 3357
+ {wxStyledTextCtrl_DoDropText, "wxStyledTextCtrl", "doDropText", 4}, // 3358
+ {wxStyledTextCtrl_GetUseAntiAliasing, "wxStyledTextCtrl", "getUseAntiAliasing", 1}, // 3359
+ {wxStyledTextCtrl_AddTextRaw, "wxStyledTextCtrl", "addTextRaw", 3}, // 3360
+ {wxStyledTextCtrl_InsertTextRaw, "wxStyledTextCtrl", "insertTextRaw", 3}, // 3361
+ {wxStyledTextCtrl_GetCurLineRaw, "wxStyledTextCtrl", "getCurLineRaw", 1}, // 3362
+ {wxStyledTextCtrl_GetLineRaw, "wxStyledTextCtrl", "getLineRaw", 2}, // 3363
+ {wxStyledTextCtrl_GetSelectedTextRaw, "wxStyledTextCtrl", "getSelectedTextRaw", 1}, // 3364
+ {wxStyledTextCtrl_GetTextRangeRaw, "wxStyledTextCtrl", "getTextRangeRaw", 3}, // 3365
+ {wxStyledTextCtrl_SetTextRaw, "wxStyledTextCtrl", "setTextRaw", 2}, // 3366
+ {wxStyledTextCtrl_GetTextRaw, "wxStyledTextCtrl", "getTextRaw", 1}, // 3367
+ {wxStyledTextCtrl_AppendTextRaw, "wxStyledTextCtrl", "appendTextRaw", 3}, // 3368
+ {wxArtProvider_GetBitmap, "wxArtProvider", "getBitmap", 2}, // 3369
+ {wxArtProvider_GetIcon, "wxArtProvider", "getIcon", 2}, // 3370
+ {wxTreeEvent_GetKeyCode, "wxTreeEvent", "getKeyCode", 1}, // 3371
+ {wxTreeEvent_GetItem, "wxTreeEvent", "getItem", 1}, // 3372
+ {wxTreeEvent_GetKeyEvent, "wxTreeEvent", "getKeyEvent", 1}, // 3373
+ {wxTreeEvent_GetLabel, "wxTreeEvent", "getLabel", 1}, // 3374
+ {wxTreeEvent_GetOldItem, "wxTreeEvent", "getOldItem", 1}, // 3375
+ {wxTreeEvent_GetPoint, "wxTreeEvent", "getPoint", 1}, // 3376
+ {wxTreeEvent_IsEditCancelled, "wxTreeEvent", "isEditCancelled", 1}, // 3377
+ {wxTreeEvent_SetToolTip, "wxTreeEvent", "setToolTip", 2}, // 3378
+ {wxBookCtrlEvent_GetOldSelection, "wxBookCtrlEvent", "getOldSelection", 1}, // 3379
+ {wxBookCtrlEvent_GetSelection, "wxBookCtrlEvent", "getSelection", 1}, // 3380
+ {wxBookCtrlEvent_SetOldSelection, "wxBookCtrlEvent", "setOldSelection", 2}, // 3381
+ {wxBookCtrlEvent_SetSelection, "wxBookCtrlEvent", "setSelection", 2}, // 3382
+ {wxFileDataObject_new, "wxFileDataObject", "new", 0}, // 3383
+ {wxFileDataObject_AddFile, "wxFileDataObject", "addFile", 2}, // 3384
+ {wxFileDataObject_GetFilenames, "wxFileDataObject", "getFilenames", 1}, // 3385
+ {wxFileDataObject_destroy, "wxFileDataObject", "'Destroy'", 1}, // 3386
+ {wxTextDataObject_new, "wxTextDataObject", "new", 1}, // 3387
+ {wxTextDataObject_GetTextLength, "wxTextDataObject", "getTextLength", 1}, // 3388
+ {wxTextDataObject_GetText, "wxTextDataObject", "getText", 1}, // 3389
+ {wxTextDataObject_SetText, "wxTextDataObject", "setText", 2}, // 3390
+ {wxTextDataObject_destroy, "wxTextDataObject", "'Destroy'", 1}, // 3391
+ {wxBitmapDataObject_new_1_1, "wxBitmapDataObject", "new", 1}, // 3392
+ {wxBitmapDataObject_new_1_0, "wxBitmapDataObject", "new", 1}, // 3393
+ {wxBitmapDataObject_GetBitmap, "wxBitmapDataObject", "getBitmap", 1}, // 3394
+ {wxBitmapDataObject_SetBitmap, "wxBitmapDataObject", "setBitmap", 2}, // 3395
+ {wxBitmapDataObject_destroy, "wxBitmapDataObject", "'Destroy'", 1}, // 3396
+ {wxClipboard_new, "wxClipboard", "new", 0}, // 3397
+ {NULL, "wxClipboard", "destroy", 1}, // 3398 obj destructor wxClipboard_destruct
+ {wxClipboard_AddData, "wxClipboard", "addData", 2}, // 3399
+ {wxClipboard_Clear, "wxClipboard", "clear", 1}, // 3400
+ {wxClipboard_Close, "wxClipboard", "close", 1}, // 3401
+ {wxClipboard_Flush, "wxClipboard", "flush", 1}, // 3402
+ {wxClipboard_GetData, "wxClipboard", "getData", 2}, // 3403
+ {wxClipboard_IsOpened, "wxClipboard", "isOpened", 1}, // 3404
+ {wxClipboard_Open, "wxClipboard", "open", 1}, // 3405
+ {wxClipboard_SetData, "wxClipboard", "setData", 2}, // 3406
+ {wxClipboard_UsePrimarySelection, "wxClipboard", "usePrimarySelection", 2}, // 3407
+ {wxClipboard_IsSupported, "wxClipboard", "isSupported", 2}, // 3408
+ {wxClipboard_Get, "wxClipboard", "get", 0}, // 3409
+ {wxSpinEvent_GetPosition, "wxSpinEvent", "getPosition", 1}, // 3410
+ {wxSpinEvent_SetPosition, "wxSpinEvent", "setPosition", 2}, // 3411
+ {wxSplitterWindow_new_0, "wxSplitterWindow", "new", 0}, // 3412
+ {wxSplitterWindow_new_2, "wxSplitterWindow", "new", 2}, // 3413
+ {NULL, "wxSplitterWindow", "destroy", 1}, // 3414 obj destructor wxSplitterWindow_destruct
+ {wxSplitterWindow_Create, "wxSplitterWindow", "create", 3}, // 3415
+ {wxSplitterWindow_GetMinimumPaneSize, "wxSplitterWindow", "getMinimumPaneSize", 1}, // 3416
+ {wxSplitterWindow_GetSashGravity, "wxSplitterWindow", "getSashGravity", 1}, // 3417
+ {wxSplitterWindow_GetSashPosition, "wxSplitterWindow", "getSashPosition", 1}, // 3418
+ {wxSplitterWindow_GetSplitMode, "wxSplitterWindow", "getSplitMode", 1}, // 3419
+ {wxSplitterWindow_GetWindow1, "wxSplitterWindow", "getWindow1", 1}, // 3420
+ {wxSplitterWindow_GetWindow2, "wxSplitterWindow", "getWindow2", 1}, // 3421
+ {wxSplitterWindow_Initialize, "wxSplitterWindow", "initialize", 2}, // 3422
+ {wxSplitterWindow_IsSplit, "wxSplitterWindow", "isSplit", 1}, // 3423
+ {wxSplitterWindow_ReplaceWindow, "wxSplitterWindow", "replaceWindow", 3}, // 3424
+ {wxSplitterWindow_SetSashGravity, "wxSplitterWindow", "setSashGravity", 2}, // 3425
+ {wxSplitterWindow_SetSashPosition, "wxSplitterWindow", "setSashPosition", 3}, // 3426
+ {wxSplitterWindow_SetMinimumPaneSize, "wxSplitterWindow", "setMinimumPaneSize", 2}, // 3427
+ {wxSplitterWindow_SetSplitMode, "wxSplitterWindow", "setSplitMode", 2}, // 3428
+ {wxSplitterWindow_SplitHorizontally, "wxSplitterWindow", "splitHorizontally", 4}, // 3429
+ {wxSplitterWindow_SplitVertically, "wxSplitterWindow", "splitVertically", 4}, // 3430
+ {wxSplitterWindow_Unsplit, "wxSplitterWindow", "unsplit", 2}, // 3431
+ {wxSplitterWindow_UpdateSize, "wxSplitterWindow", "updateSize", 1}, // 3432
+ {wxSplitterEvent_GetSashPosition, "wxSplitterEvent", "getSashPosition", 1}, // 3433
+ {wxSplitterEvent_GetX, "wxSplitterEvent", "getX", 1}, // 3434
+ {wxSplitterEvent_GetY, "wxSplitterEvent", "getY", 1}, // 3435
+ {wxSplitterEvent_GetWindowBeingRemoved, "wxSplitterEvent", "getWindowBeingRemoved", 1}, // 3436
+ {wxSplitterEvent_SetSashPosition, "wxSplitterEvent", "setSashPosition", 2}, // 3437
+ {wxHtmlWindow_new_0, "wxHtmlWindow", "new", 0}, // 3438
+ {wxHtmlWindow_new_2, "wxHtmlWindow", "new", 2}, // 3439
+ {wxHtmlWindow_AppendToPage, "wxHtmlWindow", "appendToPage", 2}, // 3440
+ {wxHtmlWindow_GetOpenedAnchor, "wxHtmlWindow", "getOpenedAnchor", 1}, // 3441
+ {wxHtmlWindow_GetOpenedPage, "wxHtmlWindow", "getOpenedPage", 1}, // 3442
+ {wxHtmlWindow_GetOpenedPageTitle, "wxHtmlWindow", "getOpenedPageTitle", 1}, // 3443
+ {wxHtmlWindow_GetRelatedFrame, "wxHtmlWindow", "getRelatedFrame", 1}, // 3444
+ {wxHtmlWindow_HistoryBack, "wxHtmlWindow", "historyBack", 1}, // 3445
+ {wxHtmlWindow_HistoryCanBack, "wxHtmlWindow", "historyCanBack", 1}, // 3446
+ {wxHtmlWindow_HistoryCanForward, "wxHtmlWindow", "historyCanForward", 1}, // 3447
+ {wxHtmlWindow_HistoryClear, "wxHtmlWindow", "historyClear", 1}, // 3448
+ {wxHtmlWindow_HistoryForward, "wxHtmlWindow", "historyForward", 1}, // 3449
+ {wxHtmlWindow_LoadFile, "wxHtmlWindow", "loadFile", 2}, // 3450
+ {wxHtmlWindow_LoadPage, "wxHtmlWindow", "loadPage", 2}, // 3451
+ {wxHtmlWindow_SelectAll, "wxHtmlWindow", "selectAll", 1}, // 3452
+ {wxHtmlWindow_SelectionToText, "wxHtmlWindow", "selectionToText", 1}, // 3453
+ {wxHtmlWindow_SelectLine, "wxHtmlWindow", "selectLine", 2}, // 3454
+ {wxHtmlWindow_SelectWord, "wxHtmlWindow", "selectWord", 2}, // 3455
+ {wxHtmlWindow_SetBorders, "wxHtmlWindow", "setBorders", 2}, // 3456
+ {wxHtmlWindow_SetFonts, "wxHtmlWindow", "setFonts", 4}, // 3457
+ {wxHtmlWindow_SetPage, "wxHtmlWindow", "setPage", 2}, // 3458
+ {wxHtmlWindow_SetRelatedFrame, "wxHtmlWindow", "setRelatedFrame", 3}, // 3459
+ {wxHtmlWindow_SetRelatedStatusBar_1, "wxHtmlWindow", "setRelatedStatusBar", 2}, // 3460
+ {wxHtmlWindow_SetRelatedStatusBar_2, "wxHtmlWindow", "setRelatedStatusBar", 3}, // 3461
+ {wxHtmlWindow_ToText, "wxHtmlWindow", "toText", 1}, // 3462
+ {NULL, "wxHtmlWindow", "'Destroy'", 1}, // 3463 obj destructor wxHtmlWindow_destroy
+ {wxHtmlLinkEvent_GetLinkInfo, "wxHtmlLinkEvent", "getLinkInfo", 1}, // 3464
+ {wxSystemSettings_GetColour, "wxSystemSettings", "getColour", 1}, // 3465
+ {wxSystemSettings_GetFont, "wxSystemSettings", "getFont", 1}, // 3466
+ {wxSystemSettings_GetMetric, "wxSystemSettings", "getMetric", 2}, // 3467
+ {wxSystemSettings_GetScreenType, "wxSystemSettings", "getScreenType", 0}, // 3468
+ {wxSystemOptions_GetOption, "wxSystemOptions", "getOption", 1}, // 3469
+ {wxSystemOptions_GetOptionInt, "wxSystemOptions", "getOptionInt", 1}, // 3470
+ {wxSystemOptions_HasOption, "wxSystemOptions", "hasOption", 1}, // 3471
+ {wxSystemOptions_IsFalse, "wxSystemOptions", "isFalse", 1}, // 3472
+ {wxSystemOptions_SetOption_2_1, "wxSystemOptions", "setOption", 2}, // 3473
+ {wxSystemOptions_SetOption_2_0, "wxSystemOptions", "setOption", 2}, // 3474
+ {wxAuiNotebookEvent_SetSelection, "wxAuiNotebookEvent", "setSelection", 2}, // 3475
+ {wxAuiNotebookEvent_GetSelection, "wxAuiNotebookEvent", "getSelection", 1}, // 3476
+ {wxAuiNotebookEvent_SetOldSelection, "wxAuiNotebookEvent", "setOldSelection", 2}, // 3477
+ {wxAuiNotebookEvent_GetOldSelection, "wxAuiNotebookEvent", "getOldSelection", 1}, // 3478
+ {wxAuiNotebookEvent_SetDragSource, "wxAuiNotebookEvent", "setDragSource", 2}, // 3479
+ {wxAuiNotebookEvent_GetDragSource, "wxAuiNotebookEvent", "getDragSource", 1}, // 3480
+ {wxAuiManagerEvent_SetManager, "wxAuiManagerEvent", "setManager", 2}, // 3481
+ {wxAuiManagerEvent_GetManager, "wxAuiManagerEvent", "getManager", 1}, // 3482
+ {wxAuiManagerEvent_SetPane, "wxAuiManagerEvent", "setPane", 2}, // 3483
+ {wxAuiManagerEvent_GetPane, "wxAuiManagerEvent", "getPane", 1}, // 3484
+ {wxAuiManagerEvent_SetButton, "wxAuiManagerEvent", "setButton", 2}, // 3485
+ {wxAuiManagerEvent_GetButton, "wxAuiManagerEvent", "getButton", 1}, // 3486
+ {wxAuiManagerEvent_SetDC, "wxAuiManagerEvent", "setDC", 2}, // 3487
+ {wxAuiManagerEvent_GetDC, "wxAuiManagerEvent", "getDC", 1}, // 3488
+ {wxAuiManagerEvent_Veto, "wxAuiManagerEvent", "veto", 2}, // 3489
+ {wxAuiManagerEvent_GetVeto, "wxAuiManagerEvent", "getVeto", 1}, // 3490
+ {wxAuiManagerEvent_SetCanVeto, "wxAuiManagerEvent", "setCanVeto", 2}, // 3491
+ {wxAuiManagerEvent_CanVeto, "wxAuiManagerEvent", "canVeto", 1}, // 3492
+ {wxLogNull_new, "wxLogNull", "new", 0}, // 3493
+ {wxLogNull_destruct, "wxLogNull", "destroy", 1}, // 3494
+ {wxTaskBarIcon_new, "wxTaskBarIcon", "new", 1}, // 3495
+ {NULL, "wxTaskBarIcon", "destroy", 1}, // 3496 obj destructor wxTaskBarIcon_destruct
+ {wxTaskBarIcon_PopupMenu, "wxTaskBarIcon", "popupMenu", 2}, // 3497
+ {wxTaskBarIcon_RemoveIcon, "wxTaskBarIcon", "removeIcon", 1}, // 3498
+ {wxTaskBarIcon_SetIcon, "wxTaskBarIcon", "setIcon", 3}, // 3499
+ {wxLocale_new_0, "wxLocale", "new", 0}, // 3500
+ {wxLocale_new_2_0, "wxLocale", "new", 2}, // 3501
+ {wxLocale_new_2_1, "wxLocale", "new", 2}, // 3502
+ {wxLocale_destruct, "wxLocale", "destroy", 1}, // 3503
+ {wxLocale_Init_1, "wxLocale", "init", 2}, // 3504
+ {wxLocale_Init_2, "wxLocale", "init", 3}, // 3505
+ {wxLocale_AddCatalog_1, "wxLocale", "addCatalog", 2}, // 3506
+ {wxLocale_AddCatalog_2, "wxLocale", "addCatalog", 3}, // 3507
+ {wxLocale_AddCatalog_3, "wxLocale", "addCatalog", 4}, // 3508
+ {wxLocale_AddCatalogLookupPathPrefix, "wxLocale", "addCatalogLookupPathPrefix", 1}, // 3509
+ {wxLocale_GetCanonicalName, "wxLocale", "getCanonicalName", 1}, // 3510
+ {wxLocale_GetLanguage, "wxLocale", "getLanguage", 1}, // 3511
+ {wxLocale_GetLanguageName, "wxLocale", "getLanguageName", 1}, // 3512
+ {wxLocale_GetLocale, "wxLocale", "getLocale", 1}, // 3513
+ {wxLocale_GetName, "wxLocale", "getName", 1}, // 3514
+ {wxLocale_GetString_2, "wxLocale", "getString", 3}, // 3515
+ {wxLocale_GetString_4, "wxLocale", "getString", 5}, // 3516
+ {wxLocale_GetHeaderValue, "wxLocale", "getHeaderValue", 3}, // 3517
+ {wxLocale_GetSysName, "wxLocale", "getSysName", 1}, // 3518
+ {wxLocale_GetSystemEncoding, "wxLocale", "getSystemEncoding", 0}, // 3519
+ {wxLocale_GetSystemEncodingName, "wxLocale", "getSystemEncodingName", 0}, // 3520
+ {wxLocale_GetSystemLanguage, "wxLocale", "getSystemLanguage", 0}, // 3521
+ {wxLocale_IsLoaded, "wxLocale", "isLoaded", 2}, // 3522
+ {wxLocale_IsOk, "wxLocale", "isOk", 1}, // 3523
+ {wxActivateEvent_GetActive, "wxActivateEvent", "getActive", 1}, // 3524
#if wxUSE_POPUPWIN
- {wxPopupWindow_new_0, "wxPopupWindow", "new", 0}, // 3519
+ {wxPopupWindow_new_0, "wxPopupWindow", "new", 0}, // 3525
#else
- {NULL, "wxPopupWindow", "new", 0}, // 3519
+ {NULL, "wxPopupWindow", "new", 0}, // 3525
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupWindow_new_2, "wxPopupWindow", "new", 2}, // 3520
+ {wxPopupWindow_new_2, "wxPopupWindow", "new", 2}, // 3526
#else
- {NULL, "wxPopupWindow", "new", 0}, // 3520
+ {NULL, "wxPopupWindow", "new", 0}, // 3526
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupWindow_Create, "wxPopupWindow", "create", 3}, // 3521
+ {wxPopupWindow_Create, "wxPopupWindow", "create", 3}, // 3527
#else
- {NULL, "wxPopupWindow", "create", 0}, // 3521
+ {NULL, "wxPopupWindow", "create", 0}, // 3527
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupWindow_Position, "wxPopupWindow", "position", 3}, // 3522
+ {wxPopupWindow_Position, "wxPopupWindow", "position", 3}, // 3528
#else
- {NULL, "wxPopupWindow", "position", 0}, // 3522
+ {NULL, "wxPopupWindow", "position", 0}, // 3528
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {NULL, "wxPopupWindow", "'Destroy'", 1}, // 3523 obj destructor wxPopupWindow_destroy
+ {NULL, "wxPopupWindow", "'Destroy'", 1}, // 3529 obj destructor wxPopupWindow_destroy
#else
- {NULL, "wxPopupWindow", "'Destroy'", 0}, // 3523
+ {NULL, "wxPopupWindow", "'Destroy'", 0}, // 3529
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_new_0, "wxPopupTransientWindow", "new", 0}, // 3524
+ {wxPopupTransientWindow_new_0, "wxPopupTransientWindow", "new", 0}, // 3530
#else
- {NULL, "wxPopupTransientWindow", "new", 0}, // 3524
+ {NULL, "wxPopupTransientWindow", "new", 0}, // 3530
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_new_2, "wxPopupTransientWindow", "new", 2}, // 3525
+ {wxPopupTransientWindow_new_2, "wxPopupTransientWindow", "new", 2}, // 3531
#else
- {NULL, "wxPopupTransientWindow", "new", 0}, // 3525
+ {NULL, "wxPopupTransientWindow", "new", 0}, // 3531
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_Popup, "wxPopupTransientWindow", "popup", 2}, // 3526
+ {wxPopupTransientWindow_Popup, "wxPopupTransientWindow", "popup", 2}, // 3532
#else
- {NULL, "wxPopupTransientWindow", "popup", 0}, // 3526
+ {NULL, "wxPopupTransientWindow", "popup", 0}, // 3532
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {wxPopupTransientWindow_Dismiss, "wxPopupTransientWindow", "dismiss", 1}, // 3527
+ {wxPopupTransientWindow_Dismiss, "wxPopupTransientWindow", "dismiss", 1}, // 3533
#else
- {NULL, "wxPopupTransientWindow", "dismiss", 0}, // 3527
+ {NULL, "wxPopupTransientWindow", "dismiss", 0}, // 3533
#endif // wxUSE_POPUPWIN
#if wxUSE_POPUPWIN
- {NULL, "wxPopupTransientWindow", "'Destroy'", 1}, // 3528 obj destructor wxPopupTransientWindow_destroy
+ {NULL, "wxPopupTransientWindow", "'Destroy'", 1}, // 3534 obj destructor wxPopupTransientWindow_destroy
#else
- {NULL, "wxPopupTransientWindow", "'Destroy'", 0}, // 3528
+ {NULL, "wxPopupTransientWindow", "'Destroy'", 0}, // 3534
#endif // wxUSE_POPUPWIN
- {wxOverlay_new, "wxOverlay", "new", 0}, // 3529
- {wxOverlay_destruct, "wxOverlay", "destroy", 1}, // 3530
- {wxOverlay_Reset, "wxOverlay", "reset", 1}, // 3531
- {wxDCOverlay_new_6, "wxDCOverlay", "new", 6}, // 3532
- {wxDCOverlay_new_2, "wxDCOverlay", "new", 2}, // 3533
- {wxDCOverlay_destruct, "wxDCOverlay", "destroy", 1}, // 3534
- {wxDCOverlay_Clear, "wxDCOverlay", "clear", 1}, // 3535
- {wxDropFilesEvent_GetPosition, "wxDropFilesEvent", "getPosition", 1}, // 3536
- {wxDropFilesEvent_GetNumberOfFiles, "wxDropFilesEvent", "getNumberOfFiles", 1}, // 3537
- {wxDropFilesEvent_GetFiles, "wxDropFilesEvent", "getFiles", 1}, // 3538
+ {wxOverlay_new, "wxOverlay", "new", 0}, // 3535
+ {wxOverlay_destruct, "wxOverlay", "destroy", 1}, // 3536
+ {wxOverlay_Reset, "wxOverlay", "reset", 1}, // 3537
+ {wxDCOverlay_new_6, "wxDCOverlay", "new", 6}, // 3538
+ {wxDCOverlay_new_2, "wxDCOverlay", "new", 2}, // 3539
+ {wxDCOverlay_destruct, "wxDCOverlay", "destroy", 1}, // 3540
+ {wxDCOverlay_Clear, "wxDCOverlay", "clear", 1}, // 3541
+ {wxDropFilesEvent_GetPosition, "wxDropFilesEvent", "getPosition", 1}, // 3542
+ {wxDropFilesEvent_GetNumberOfFiles, "wxDropFilesEvent", "getNumberOfFiles", 1}, // 3543
+ {wxDropFilesEvent_GetFiles, "wxDropFilesEvent", "getFiles", 1}, // 3544
#if wxUSE_DISPLAY
- {wxDisplay_new_0, "wxDisplay", "new", 0}, // 3539
+ {wxDisplay_new_0, "wxDisplay", "new", 0}, // 3545
#else
- {NULL, "wxDisplay", "new", 0}, // 3539
+ {NULL, "wxDisplay", "new", 0}, // 3545
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_new_1_0, "wxDisplay", "new", 1}, // 3540
+ {wxDisplay_new_1_0, "wxDisplay", "new", 1}, // 3546
#else
- {NULL, "wxDisplay", "new", 0}, // 3540
+ {NULL, "wxDisplay", "new", 0}, // 3546
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY && wxCHECK_VERSION(3,1,3)
- {wxDisplay_new_1_1, "wxDisplay", "new", 1}, // 3541
+ {wxDisplay_new_1_1, "wxDisplay", "new", 1}, // 3547
#else
- {NULL, "wxDisplay", "new", 0}, // 3541
+ {NULL, "wxDisplay", "new", 0}, // 3547
#endif // wxUSE_DISPLAY && wxCHECK_VERSION(3,1,3)
#if wxUSE_DISPLAY
- {wxDisplay_destruct, "wxDisplay", "destroy", 1}, // 3542
+ {wxDisplay_destruct, "wxDisplay", "destroy", 1}, // 3548
#else
- {NULL, "wxDisplay", "destroy", 0}, // 3542
+ {NULL, "wxDisplay", "destroy", 0}, // 3548
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_IsOk, "wxDisplay", "isOk", 1}, // 3543
+ {wxDisplay_IsOk, "wxDisplay", "isOk", 1}, // 3549
#else
- {NULL, "wxDisplay", "isOk", 0}, // 3543
+ {NULL, "wxDisplay", "isOk", 0}, // 3549
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetClientArea, "wxDisplay", "getClientArea", 1}, // 3544
+ {wxDisplay_GetClientArea, "wxDisplay", "getClientArea", 1}, // 3550
#else
- {NULL, "wxDisplay", "getClientArea", 0}, // 3544
+ {NULL, "wxDisplay", "getClientArea", 0}, // 3550
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetGeometry, "wxDisplay", "getGeometry", 1}, // 3545
+ {wxDisplay_GetGeometry, "wxDisplay", "getGeometry", 1}, // 3551
#else
- {NULL, "wxDisplay", "getGeometry", 0}, // 3545
+ {NULL, "wxDisplay", "getGeometry", 0}, // 3551
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetName, "wxDisplay", "getName", 1}, // 3546
+ {wxDisplay_GetName, "wxDisplay", "getName", 1}, // 3552
#else
- {NULL, "wxDisplay", "getName", 0}, // 3546
+ {NULL, "wxDisplay", "getName", 0}, // 3552
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_IsPrimary, "wxDisplay", "isPrimary", 1}, // 3547
+ {wxDisplay_IsPrimary, "wxDisplay", "isPrimary", 1}, // 3553
#else
- {NULL, "wxDisplay", "isPrimary", 0}, // 3547
+ {NULL, "wxDisplay", "isPrimary", 0}, // 3553
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetCount, "wxDisplay", "getCount", 0}, // 3548
+ {wxDisplay_GetCount, "wxDisplay", "getCount", 0}, // 3554
#else
- {NULL, "wxDisplay", "getCount", 0}, // 3548
+ {NULL, "wxDisplay", "getCount", 0}, // 3554
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetFromPoint, "wxDisplay", "getFromPoint", 1}, // 3549
+ {wxDisplay_GetFromPoint, "wxDisplay", "getFromPoint", 1}, // 3555
#else
- {NULL, "wxDisplay", "getFromPoint", 0}, // 3549
+ {NULL, "wxDisplay", "getFromPoint", 0}, // 3555
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY
- {wxDisplay_GetFromWindow, "wxDisplay", "getFromWindow", 1}, // 3550
+ {wxDisplay_GetFromWindow, "wxDisplay", "getFromWindow", 1}, // 3556
#else
- {NULL, "wxDisplay", "getFromWindow", 0}, // 3550
+ {NULL, "wxDisplay", "getFromWindow", 0}, // 3556
#endif // wxUSE_DISPLAY
#if wxUSE_DISPLAY && wxCHECK_VERSION(3,1,2)
- {wxDisplay_GetPPI, "wxDisplay", "getPPI", 1}, // 3551
+ {wxDisplay_GetPPI, "wxDisplay", "getPPI", 1}, // 3557
#else
- {NULL, "wxDisplay", "getPPI", 0}, // 3551
+ {NULL, "wxDisplay", "getPPI", 0}, // 3557
#endif // wxUSE_DISPLAY && wxCHECK_VERSION(3,1,2)
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_new_1, "wxGCDC", "new", 1}, // 3552
+ {wxGCDC_new_1, "wxGCDC", "new", 1}, // 3558
#else
- {NULL, "wxGCDC", "new", 0}, // 3552
+ {NULL, "wxGCDC", "new", 0}, // 3558
#endif // wxUSE_GRAPHICS_CONTEXT
- {NULL, "", "", 0}, // 3553
- {NULL, "", "", 0}, // 3554
+ {NULL, "", "", 0}, // 3559
+ {NULL, "", "", 0}, // 3560
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_new_0, "wxGCDC", "new", 0}, // 3555
+ {wxGCDC_new_0, "wxGCDC", "new", 0}, // 3561
#else
- {NULL, "wxGCDC", "new", 0}, // 3555
+ {NULL, "wxGCDC", "new", 0}, // 3561
#endif // wxUSE_GRAPHICS_CONTEXT
#if wxUSE_GRAPHICS_CONTEXT
- {NULL, "wxGCDC", "destroy", 1}, // 3556 obj destructor wxGCDC_destruct
+ {NULL, "wxGCDC", "destroy", 1}, // 3562 obj destructor wxGCDC_destruct
#else
- {NULL, "wxGCDC", "destroy", 0}, // 3556
+ {NULL, "wxGCDC", "destroy", 0}, // 3562
#endif // wxUSE_GRAPHICS_CONTEXT
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_GetGraphicsContext, "wxGCDC", "getGraphicsContext", 1}, // 3557
+ {wxGCDC_GetGraphicsContext, "wxGCDC", "getGraphicsContext", 1}, // 3563
#else
- {NULL, "wxGCDC", "getGraphicsContext", 0}, // 3557
+ {NULL, "wxGCDC", "getGraphicsContext", 0}, // 3563
#endif // wxUSE_GRAPHICS_CONTEXT
#if wxUSE_GRAPHICS_CONTEXT
- {wxGCDC_SetGraphicsContext, "wxGCDC", "setGraphicsContext", 2}, // 3558
+ {wxGCDC_SetGraphicsContext, "wxGCDC", "setGraphicsContext", 2}, // 3564
#else
- {NULL, "wxGCDC", "setGraphicsContext", 0}, // 3558
+ {NULL, "wxGCDC", "setGraphicsContext", 0}, // 3564
#endif // wxUSE_GRAPHICS_CONTEXT
- {wxNotificationMessage_new_0, "wxNotificationMessage", "new", 0}, // 3559
- {wxNotificationMessage_new_2, "wxNotificationMessage", "new", 2}, // 3560
- {NULL, "wxNotificationMessage", "destroy", 1}, // 3561 obj destructor wxNotificationMessage_destruct
+ {wxNotificationMessage_new_0, "wxNotificationMessage", "new", 0}, // 3565
+ {wxNotificationMessage_new_2, "wxNotificationMessage", "new", 2}, // 3566
+ {NULL, "wxNotificationMessage", "destroy", 1}, // 3567 obj destructor wxNotificationMessage_destruct
#if wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_AddAction, "wxNotificationMessage", "addAction", 3}, // 3562
+ {wxNotificationMessage_AddAction, "wxNotificationMessage", "addAction", 3}, // 3568
#else
- {NULL, "wxNotificationMessage", "addAction", 0}, // 3562
+ {NULL, "wxNotificationMessage", "addAction", 0}, // 3568
#endif // wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_Close, "wxNotificationMessage", "close", 1}, // 3563
- {wxNotificationMessage_SetFlags, "wxNotificationMessage", "setFlags", 2}, // 3564
+ {wxNotificationMessage_Close, "wxNotificationMessage", "close", 1}, // 3569
+ {wxNotificationMessage_SetFlags, "wxNotificationMessage", "setFlags", 2}, // 3570
#if wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_SetIcon, "wxNotificationMessage", "setIcon", 2}, // 3565
+ {wxNotificationMessage_SetIcon, "wxNotificationMessage", "setIcon", 2}, // 3571
#else
- {NULL, "wxNotificationMessage", "setIcon", 0}, // 3565
+ {NULL, "wxNotificationMessage", "setIcon", 0}, // 3571
#endif // wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_SetMessage, "wxNotificationMessage", "setMessage", 2}, // 3566
- {wxNotificationMessage_SetParent, "wxNotificationMessage", "setParent", 2}, // 3567
- {wxNotificationMessage_SetTitle, "wxNotificationMessage", "setTitle", 2}, // 3568
- {wxNotificationMessage_Show, "wxNotificationMessage", "show", 2}, // 3569
+ {wxNotificationMessage_SetMessage, "wxNotificationMessage", "setMessage", 2}, // 3572
+ {wxNotificationMessage_SetParent, "wxNotificationMessage", "setParent", 2}, // 3573
+ {wxNotificationMessage_SetTitle, "wxNotificationMessage", "setTitle", 2}, // 3574
+ {wxNotificationMessage_Show, "wxNotificationMessage", "show", 2}, // 3575
#if __WXMSW__
- {wxNotificationMessage_UseTaskBarIcon, "wxNotificationMessage", "useTaskBarIcon", 1}, // 3570
+ {wxNotificationMessage_UseTaskBarIcon, "wxNotificationMessage", "useTaskBarIcon", 1}, // 3576
#else
- {NULL, "wxNotificationMessage", "useTaskBarIcon", 0}, // 3570
+ {NULL, "wxNotificationMessage", "useTaskBarIcon", 0}, // 3576
#endif // __WXMSW__
#if __WXMSW__ && wxCHECK_VERSION(3,1,0)
- {wxNotificationMessage_MSWUseToasts, "wxNotificationMessage", "mSWUseToasts", 1}, // 3571
+ {wxNotificationMessage_MSWUseToasts, "wxNotificationMessage", "mSWUseToasts", 1}, // 3577
#else
- {NULL, "wxNotificationMessage", "mSWUseToasts", 0}, // 3571
+ {NULL, "wxNotificationMessage", "mSWUseToasts", 0}, // 3577
#endif // __WXMSW__ && wxCHECK_VERSION(3,1,0)
- {NULL, "", "", 0}, // 3572
+ {NULL, "", "", 0}, // 3578
#if WXE_WEBVIEW
- {wxWebView_New, "wxWebView", "new", 3}, // 3573
+ {wxWebView_New, "wxWebView", "new", 3}, // 3579
#else
- {NULL, "wxWebView", "new", 0}, // 3573
+ {NULL, "wxWebView", "new", 0}, // 3579
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetCurrentTitle, "wxWebView", "getCurrentTitle", 1}, // 3574
+ {wxWebView_GetCurrentTitle, "wxWebView", "getCurrentTitle", 1}, // 3580
#else
- {NULL, "wxWebView", "getCurrentTitle", 0}, // 3574
+ {NULL, "wxWebView", "getCurrentTitle", 0}, // 3580
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetCurrentURL, "wxWebView", "getCurrentURL", 1}, // 3575
+ {wxWebView_GetCurrentURL, "wxWebView", "getCurrentURL", 1}, // 3581
#else
- {NULL, "wxWebView", "getCurrentURL", 0}, // 3575
+ {NULL, "wxWebView", "getCurrentURL", 0}, // 3581
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetPageSource, "wxWebView", "getPageSource", 1}, // 3576
+ {wxWebView_GetPageSource, "wxWebView", "getPageSource", 1}, // 3582
#else
- {NULL, "wxWebView", "getPageSource", 0}, // 3576
+ {NULL, "wxWebView", "getPageSource", 0}, // 3582
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetPageText, "wxWebView", "getPageText", 1}, // 3577
+ {wxWebView_GetPageText, "wxWebView", "getPageText", 1}, // 3583
#else
- {NULL, "wxWebView", "getPageText", 0}, // 3577
+ {NULL, "wxWebView", "getPageText", 0}, // 3583
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_IsBusy, "wxWebView", "isBusy", 1}, // 3578
+ {wxWebView_IsBusy, "wxWebView", "isBusy", 1}, // 3584
#else
- {NULL, "wxWebView", "isBusy", 0}, // 3578
+ {NULL, "wxWebView", "isBusy", 0}, // 3584
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_IsEditable, "wxWebView", "isEditable", 1}, // 3579
+ {wxWebView_IsEditable, "wxWebView", "isEditable", 1}, // 3585
#else
- {NULL, "wxWebView", "isEditable", 0}, // 3579
+ {NULL, "wxWebView", "isEditable", 0}, // 3585
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_LoadURL, "wxWebView", "loadURL", 2}, // 3580
+ {wxWebView_LoadURL, "wxWebView", "loadURL", 2}, // 3586
#else
- {NULL, "wxWebView", "loadURL", 0}, // 3580
+ {NULL, "wxWebView", "loadURL", 0}, // 3586
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Print, "wxWebView", "print", 1}, // 3581
+ {wxWebView_Print, "wxWebView", "print", 1}, // 3587
#else
- {NULL, "wxWebView", "print", 0}, // 3581
+ {NULL, "wxWebView", "print", 0}, // 3587
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Reload, "wxWebView", "reload", 2}, // 3582
+ {wxWebView_Reload, "wxWebView", "reload", 2}, // 3588
#else
- {NULL, "wxWebView", "reload", 0}, // 3582
+ {NULL, "wxWebView", "reload", 0}, // 3588
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,1)
- {wxWebView_RunScript, "wxWebView", "runScript", 2}, // 3583
+ {wxWebView_RunScript, "wxWebView", "runScript", 2}, // 3589
#else
- {NULL, "wxWebView", "runScript", 0}, // 3583
+ {NULL, "wxWebView", "runScript", 0}, // 3589
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,1)
#if WXE_WEBVIEW
- {wxWebView_SetEditable, "wxWebView", "setEditable", 2}, // 3584
+ {wxWebView_SetEditable, "wxWebView", "setEditable", 2}, // 3590
#else
- {NULL, "wxWebView", "setEditable", 0}, // 3584
+ {NULL, "wxWebView", "setEditable", 0}, // 3590
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SetPage, "wxWebView", "setPage", 3}, // 3585
+ {wxWebView_SetPage, "wxWebView", "setPage", 3}, // 3591
#else
- {NULL, "wxWebView", "setPage", 0}, // 3585
+ {NULL, "wxWebView", "setPage", 0}, // 3591
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Stop, "wxWebView", "stop", 1}, // 3586
+ {wxWebView_Stop, "wxWebView", "stop", 1}, // 3592
#else
- {NULL, "wxWebView", "stop", 0}, // 3586
+ {NULL, "wxWebView", "stop", 0}, // 3592
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanCopy, "wxWebView", "canCopy", 1}, // 3587
+ {wxWebView_CanCopy, "wxWebView", "canCopy", 1}, // 3593
#else
- {NULL, "wxWebView", "canCopy", 0}, // 3587
+ {NULL, "wxWebView", "canCopy", 0}, // 3593
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanCut, "wxWebView", "canCut", 1}, // 3588
+ {wxWebView_CanCut, "wxWebView", "canCut", 1}, // 3594
#else
- {NULL, "wxWebView", "canCut", 0}, // 3588
+ {NULL, "wxWebView", "canCut", 0}, // 3594
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanPaste, "wxWebView", "canPaste", 1}, // 3589
+ {wxWebView_CanPaste, "wxWebView", "canPaste", 1}, // 3595
#else
- {NULL, "wxWebView", "canPaste", 0}, // 3589
+ {NULL, "wxWebView", "canPaste", 0}, // 3595
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Copy, "wxWebView", "copy", 1}, // 3590
+ {wxWebView_Copy, "wxWebView", "copy", 1}, // 3596
#else
- {NULL, "wxWebView", "copy", 0}, // 3590
+ {NULL, "wxWebView", "copy", 0}, // 3596
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Cut, "wxWebView", "cut", 1}, // 3591
+ {wxWebView_Cut, "wxWebView", "cut", 1}, // 3597
#else
- {NULL, "wxWebView", "cut", 0}, // 3591
+ {NULL, "wxWebView", "cut", 0}, // 3597
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Paste, "wxWebView", "paste", 1}, // 3592
+ {wxWebView_Paste, "wxWebView", "paste", 1}, // 3598
#else
- {NULL, "wxWebView", "paste", 0}, // 3592
+ {NULL, "wxWebView", "paste", 0}, // 3598
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_EnableContextMenu, "wxWebView", "enableContextMenu", 2}, // 3593
+ {wxWebView_EnableContextMenu, "wxWebView", "enableContextMenu", 2}, // 3599
#else
- {NULL, "wxWebView", "enableContextMenu", 0}, // 3593
+ {NULL, "wxWebView", "enableContextMenu", 0}, // 3599
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_IsContextMenuEnabled, "wxWebView", "isContextMenuEnabled", 1}, // 3594
+ {wxWebView_IsContextMenuEnabled, "wxWebView", "isContextMenuEnabled", 1}, // 3600
#else
- {NULL, "wxWebView", "isContextMenuEnabled", 0}, // 3594
+ {NULL, "wxWebView", "isContextMenuEnabled", 0}, // 3600
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanGoBack, "wxWebView", "canGoBack", 1}, // 3595
+ {wxWebView_CanGoBack, "wxWebView", "canGoBack", 1}, // 3601
#else
- {NULL, "wxWebView", "canGoBack", 0}, // 3595
+ {NULL, "wxWebView", "canGoBack", 0}, // 3601
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanGoForward, "wxWebView", "canGoForward", 1}, // 3596
+ {wxWebView_CanGoForward, "wxWebView", "canGoForward", 1}, // 3602
#else
- {NULL, "wxWebView", "canGoForward", 0}, // 3596
+ {NULL, "wxWebView", "canGoForward", 0}, // 3602
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_ClearHistory, "wxWebView", "clearHistory", 1}, // 3597
+ {wxWebView_ClearHistory, "wxWebView", "clearHistory", 1}, // 3603
#else
- {NULL, "wxWebView", "clearHistory", 0}, // 3597
+ {NULL, "wxWebView", "clearHistory", 0}, // 3603
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_EnableHistory, "wxWebView", "enableHistory", 2}, // 3598
+ {wxWebView_EnableHistory, "wxWebView", "enableHistory", 2}, // 3604
#else
- {NULL, "wxWebView", "enableHistory", 0}, // 3598
+ {NULL, "wxWebView", "enableHistory", 0}, // 3604
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GoBack, "wxWebView", "goBack", 1}, // 3599
+ {wxWebView_GoBack, "wxWebView", "goBack", 1}, // 3605
#else
- {NULL, "wxWebView", "goBack", 0}, // 3599
+ {NULL, "wxWebView", "goBack", 0}, // 3605
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GoForward, "wxWebView", "goForward", 1}, // 3600
+ {wxWebView_GoForward, "wxWebView", "goForward", 1}, // 3606
#else
- {NULL, "wxWebView", "goForward", 0}, // 3600
+ {NULL, "wxWebView", "goForward", 0}, // 3606
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_ClearSelection, "wxWebView", "clearSelection", 1}, // 3601
+ {wxWebView_ClearSelection, "wxWebView", "clearSelection", 1}, // 3607
#else
- {NULL, "wxWebView", "clearSelection", 0}, // 3601
+ {NULL, "wxWebView", "clearSelection", 0}, // 3607
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_DeleteSelection, "wxWebView", "deleteSelection", 1}, // 3602
+ {wxWebView_DeleteSelection, "wxWebView", "deleteSelection", 1}, // 3608
#else
- {NULL, "wxWebView", "deleteSelection", 0}, // 3602
+ {NULL, "wxWebView", "deleteSelection", 0}, // 3608
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetSelectedSource, "wxWebView", "getSelectedSource", 1}, // 3603
+ {wxWebView_GetSelectedSource, "wxWebView", "getSelectedSource", 1}, // 3609
#else
- {NULL, "wxWebView", "getSelectedSource", 0}, // 3603
+ {NULL, "wxWebView", "getSelectedSource", 0}, // 3609
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetSelectedText, "wxWebView", "getSelectedText", 1}, // 3604
+ {wxWebView_GetSelectedText, "wxWebView", "getSelectedText", 1}, // 3610
#else
- {NULL, "wxWebView", "getSelectedText", 0}, // 3604
+ {NULL, "wxWebView", "getSelectedText", 0}, // 3610
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_HasSelection, "wxWebView", "hasSelection", 1}, // 3605
+ {wxWebView_HasSelection, "wxWebView", "hasSelection", 1}, // 3611
#else
- {NULL, "wxWebView", "hasSelection", 0}, // 3605
+ {NULL, "wxWebView", "hasSelection", 0}, // 3611
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SelectAll, "wxWebView", "selectAll", 1}, // 3606
+ {wxWebView_SelectAll, "wxWebView", "selectAll", 1}, // 3612
#else
- {NULL, "wxWebView", "selectAll", 0}, // 3606
+ {NULL, "wxWebView", "selectAll", 0}, // 3612
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanRedo, "wxWebView", "canRedo", 1}, // 3607
+ {wxWebView_CanRedo, "wxWebView", "canRedo", 1}, // 3613
#else
- {NULL, "wxWebView", "canRedo", 0}, // 3607
+ {NULL, "wxWebView", "canRedo", 0}, // 3613
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanUndo, "wxWebView", "canUndo", 1}, // 3608
+ {wxWebView_CanUndo, "wxWebView", "canUndo", 1}, // 3614
#else
- {NULL, "wxWebView", "canUndo", 0}, // 3608
+ {NULL, "wxWebView", "canUndo", 0}, // 3614
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Redo, "wxWebView", "redo", 1}, // 3609
+ {wxWebView_Redo, "wxWebView", "redo", 1}, // 3615
#else
- {NULL, "wxWebView", "redo", 0}, // 3609
+ {NULL, "wxWebView", "redo", 0}, // 3615
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Undo, "wxWebView", "undo", 1}, // 3610
+ {wxWebView_Undo, "wxWebView", "undo", 1}, // 3616
#else
- {NULL, "wxWebView", "undo", 0}, // 3610
+ {NULL, "wxWebView", "undo", 0}, // 3616
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_Find, "wxWebView", "find", 3}, // 3611
+ {wxWebView_Find, "wxWebView", "find", 3}, // 3617
#else
- {NULL, "wxWebView", "find", 0}, // 3611
+ {NULL, "wxWebView", "find", 0}, // 3617
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_CanSetZoomType, "wxWebView", "canSetZoomType", 2}, // 3612
+ {wxWebView_CanSetZoomType, "wxWebView", "canSetZoomType", 2}, // 3618
#else
- {NULL, "wxWebView", "canSetZoomType", 0}, // 3612
+ {NULL, "wxWebView", "canSetZoomType", 0}, // 3618
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetZoom, "wxWebView", "getZoom", 1}, // 3613
+ {wxWebView_GetZoom, "wxWebView", "getZoom", 1}, // 3619
#else
- {NULL, "wxWebView", "getZoom", 0}, // 3613
+ {NULL, "wxWebView", "getZoom", 0}, // 3619
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_GetZoomType, "wxWebView", "getZoomType", 1}, // 3614
+ {wxWebView_GetZoomType, "wxWebView", "getZoomType", 1}, // 3620
#else
- {NULL, "wxWebView", "getZoomType", 0}, // 3614
+ {NULL, "wxWebView", "getZoomType", 0}, // 3620
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SetZoom, "wxWebView", "setZoom", 2}, // 3615
+ {wxWebView_SetZoom, "wxWebView", "setZoom", 2}, // 3621
#else
- {NULL, "wxWebView", "setZoom", 0}, // 3615
+ {NULL, "wxWebView", "setZoom", 0}, // 3621
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebView_SetZoomType, "wxWebView", "setZoomType", 2}, // 3616
+ {wxWebView_SetZoomType, "wxWebView", "setZoomType", 2}, // 3622
#else
- {NULL, "wxWebView", "setZoomType", 0}, // 3616
+ {NULL, "wxWebView", "setZoomType", 0}, // 3622
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
- {wxWebView_GetZoomFactor, "wxWebView", "getZoomFactor", 1}, // 3617
+ {wxWebView_GetZoomFactor, "wxWebView", "getZoomFactor", 1}, // 3623
#else
- {NULL, "wxWebView", "getZoomFactor", 0}, // 3617
+ {NULL, "wxWebView", "getZoomFactor", 0}, // 3623
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
- {wxWebView_SetZoomFactor, "wxWebView", "setZoomFactor", 2}, // 3618
+ {wxWebView_SetZoomFactor, "wxWebView", "setZoomFactor", 2}, // 3624
#else
- {NULL, "wxWebView", "setZoomFactor", 0}, // 3618
+ {NULL, "wxWebView", "setZoomFactor", 0}, // 3624
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
#if WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
- {wxWebView_IsBackendAvailable, "wxWebView", "isBackendAvailable", 1}, // 3619
+ {wxWebView_IsBackendAvailable, "wxWebView", "isBackendAvailable", 1}, // 3625
#else
- {NULL, "wxWebView", "isBackendAvailable", 0}, // 3619
+ {NULL, "wxWebView", "isBackendAvailable", 0}, // 3625
#endif // WXE_WEBVIEW && wxCHECK_VERSION(3,1,4)
#if WXE_WEBVIEW
- {wxWebViewEvent_GetString, "wxWebViewEvent", "getString", 1}, // 3620
+ {wxWebViewEvent_GetString, "wxWebViewEvent", "getString", 1}, // 3626
#else
- {NULL, "wxWebViewEvent", "getString", 0}, // 3620
+ {NULL, "wxWebViewEvent", "getString", 0}, // 3626
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebViewEvent_GetInt, "wxWebViewEvent", "getInt", 1}, // 3621
+ {wxWebViewEvent_GetInt, "wxWebViewEvent", "getInt", 1}, // 3627
#else
- {NULL, "wxWebViewEvent", "getInt", 0}, // 3621
+ {NULL, "wxWebViewEvent", "getInt", 0}, // 3627
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebViewEvent_GetTarget, "wxWebViewEvent", "getTarget", 1}, // 3622
+ {wxWebViewEvent_GetTarget, "wxWebViewEvent", "getTarget", 1}, // 3628
#else
- {NULL, "wxWebViewEvent", "getTarget", 0}, // 3622
+ {NULL, "wxWebViewEvent", "getTarget", 0}, // 3628
#endif // WXE_WEBVIEW
#if WXE_WEBVIEW
- {wxWebViewEvent_GetURL, "wxWebViewEvent", "getURL", 1}, // 3623
+ {wxWebViewEvent_GetURL, "wxWebViewEvent", "getURL", 1}, // 3629
#else
- {NULL, "wxWebViewEvent", "getURL", 0}, // 3623
+ {NULL, "wxWebViewEvent", "getURL", 0}, // 3629
#endif // WXE_WEBVIEW
};
diff --git a/lib/wx/c_src/gen/wxe_init.cpp b/lib/wx/c_src/gen/wxe_init.cpp
index 12b0b418b0..4153f1e2b9 100644
--- a/lib/wx/c_src/gen/wxe_init.cpp
+++ b/lib/wx/c_src/gen/wxe_init.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -6664,6 +6664,12 @@ void WxeApp::init_consts(wxeMetaCommand& event) {
{ enif_make_atom(rt.env,"wxStandardID"), "wxID_MDI_WINDOW_PREV", rt.make_int(wxID_MDI_WINDOW_PREV) },
{ enif_make_atom(rt.env,"wxStandardID"), "wxID_MDI_WINDOW_NEXT", rt.make_int(wxID_MDI_WINDOW_NEXT) },
{ enif_make_atom(rt.env,"wxStandardID"), "wxID_MDI_WINDOW_LAST", rt.make_int(wxID_MDI_WINDOW_LAST) },
+ { enif_make_atom(rt.env,"wxStandardID"), "wxID_OSX_MENU_FIRST", rt.make_int(wxID_OSX_MENU_FIRST) },
+ { enif_make_atom(rt.env,"wxStandardID"), "wxID_OSX_HIDE", rt.make_int(wxID_OSX_HIDE) },
+ { enif_make_atom(rt.env,"wxStandardID"), "wxID_OSX_HIDEOTHERS", rt.make_int(wxID_OSX_HIDEOTHERS) },
+ { enif_make_atom(rt.env,"wxStandardID"), "wxID_OSX_SHOWALL", rt.make_int(wxID_OSX_SHOWALL) },
+ { enif_make_atom(rt.env,"wxStandardID"), "wxID_OSX_SERVICES", rt.make_int(wxID_OSX_SERVICES) },
+ { enif_make_atom(rt.env,"wxStandardID"), "wxID_OSX_MENU_LAST", rt.make_int(wxID_OSX_MENU_LAST) },
{ enif_make_atom(rt.env,"wxStandardID"), "wxID_FILEDLGG", rt.make_int(wxID_FILEDLGG) },
{ enif_make_atom(rt.env,"wxStandardID"), "wxID_FILECTRL", rt.make_int(wxID_FILECTRL) },
{ enif_make_atom(rt.env,"wxStandardID"), "wxID_HIGHEST", rt.make_int(wxID_HIGHEST) },
diff --git a/lib/wx/c_src/gen/wxe_wrapper_5.cpp b/lib/wx/c_src/gen/wxe_wrapper_5.cpp
index 43bda73ded..ade37162fd 100644
--- a/lib/wx/c_src/gen/wxe_wrapper_5.cpp
+++ b/lib/wx/c_src/gen/wxe_wrapper_5.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -3166,6 +3166,90 @@ void wxMouseEvent_GetWheelAxis(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
}
+// wxMouseEvent::Aux1DClick
+void wxMouseEvent_Aux1DClick(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxMouseEvent *This;
+ This = (wxMouseEvent *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ bool Result = This->Aux1DClick();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_bool(Result));
+
+}
+
+// wxMouseEvent::Aux1Down
+void wxMouseEvent_Aux1Down(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxMouseEvent *This;
+ This = (wxMouseEvent *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ bool Result = This->Aux1Down();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_bool(Result));
+
+}
+
+// wxMouseEvent::Aux1Up
+void wxMouseEvent_Aux1Up(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxMouseEvent *This;
+ This = (wxMouseEvent *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ bool Result = This->Aux1Up();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_bool(Result));
+
+}
+
+// wxMouseEvent::Aux2DClick
+void wxMouseEvent_Aux2DClick(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxMouseEvent *This;
+ This = (wxMouseEvent *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ bool Result = This->Aux2DClick();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_bool(Result));
+
+}
+
+// wxMouseEvent::Aux2Down
+void wxMouseEvent_Aux2Down(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxMouseEvent *This;
+ This = (wxMouseEvent *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ bool Result = This->Aux2Down();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_bool(Result));
+
+}
+
+// wxMouseEvent::Aux2Up
+void wxMouseEvent_Aux2Up(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
+{
+ ErlNifEnv *env = Ecmd.env;
+ ERL_NIF_TERM * argv = Ecmd.args;
+ wxMouseEvent *This;
+ This = (wxMouseEvent *) memenv->getPtr(env, argv[0], "This");
+ if(!This) throw wxe_badarg("This");
+ bool Result = This->Aux2Up();
+ wxeReturn rt = wxeReturn(memenv, Ecmd.caller, true);
+ rt.send( rt.make_bool(Result));
+
+}
+
// wxMoveEvent::GetPosition
void wxMoveEvent_GetPosition(WxeApp *app, wxeMemEnv *memenv, wxeCommand& Ecmd)
{
diff --git a/lib/wx/c_src/wxe_callback_impl.cpp b/lib/wx/c_src/wxe_callback_impl.cpp
index 50f6c0166c..16458f6fa6 100644
--- a/lib/wx/c_src/wxe_callback_impl.cpp
+++ b/lib/wx/c_src/wxe_callback_impl.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -46,7 +46,7 @@ wxeEvtListener::wxeEvtListener(ErlNifPid caller, int req, ERL_NIF_TERM req_type,
}
wxeEvtListener::~wxeEvtListener() {
- // enif_fprintf(stderr, "CBD Deleteing %p %T\r\n", this, class_name); fflush(stderr);
+ // enif_fprintf(stderr, "CBD Deleting %p %T\r\n", this, class_name); fflush(stderr);
if(user_data) {
delete user_data;
}
diff --git a/lib/wx/c_src/wxe_helpers.cpp b/lib/wx/c_src/wxe_helpers.cpp
index 69a9c65c27..d8cca31654 100644
--- a/lib/wx/c_src/wxe_helpers.cpp
+++ b/lib/wx/c_src/wxe_helpers.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2014-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2014-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -107,7 +107,7 @@ void wxeFifo::DelQueue(unsigned int i)
void wxeFifo::DeleteCmd(wxeCommand *orig)
{
- orig->op = -2; // Assert: will crash if op is negativ
+ orig->op = -2; // Assert: will crash if op is negative
enif_clear_env(orig->env);
free.push_back(orig);
}
@@ -136,6 +136,6 @@ void wxeFifo::Append(wxeCommand *orig)
curr->env = orig->env;
orig->env = temp;
curr->me_ref = orig->me_ref;
- orig->op = -1; // Assert: will crash if op is negativ
+ orig->op = -1; // Assert: will crash if op is negative
m_q.push_back(curr);
}
diff --git a/lib/wx/c_src/wxe_impl.cpp b/lib/wx/c_src/wxe_impl.cpp
index fd71fed4aa..67b319b036 100644
--- a/lib/wx/c_src/wxe_impl.cpp
+++ b/lib/wx/c_src/wxe_impl.cpp
@@ -33,6 +33,10 @@
#include <wx/dcbuffer.h>
#undef private
+#ifdef HAVE_GLIB
+ #include <glib.h>
+#endif
+
#include "wxe_impl.h"
#include "wxe_events.h"
#include "wxe_return.h"
@@ -135,6 +139,23 @@ void print_cmd(wxeCommand& event)
* Init WxeApp the application emulator
* ************************************************************/
+#ifdef HAVE_GLIB
+static GLogWriterOutput wxe_log_glib(GLogLevelFlags log_level,
+ const GLogField *fields,
+ gsize n_fields,
+ gpointer user_data)
+{
+ for (gsize i = 0; i < n_fields; i++) {
+ if(strcmp(fields[i].key, "MESSAGE") == 0) {
+ wxString msg;
+ msg.Printf(wxT("GTK: %s"), (char *) fields[i].value);
+ send_msg("debug", &msg);
+ }
+ }
+ return G_LOG_WRITER_HANDLED;
+}
+#endif
+
bool WxeApp::OnInit()
{
@@ -167,6 +188,10 @@ bool WxeApp::OnInit()
(wxObjectEventFunction) (wxEventFunction) &WxeApp::dummy_close);
#endif
+#ifdef HAVE_GLIB
+ g_log_set_writer_func(wxe_log_glib, NULL, NULL);
+#endif
+
SetExitOnFrameDelete(false);
enif_mutex_lock(wxe_status_m);
@@ -634,7 +659,7 @@ void WxeApp::destroyMemEnv(wxeMetaCommand &Ecmd)
delete refd;
ptr2ref.erase(it);
} // overridden allocs deletes meta-data in clearPtr
- } else { // Not alloced in erl just delete references
+ } else { // Not allocated in erl just delete references
if(refd->ref >= global_me->next) { // if it is not part of global ptrs
delete refd;
ptr2ref.erase(it);
diff --git a/lib/wx/c_src/wxe_nif.h b/lib/wx/c_src/wxe_nif.h
index 3e934bdd6b..a0e301b7a5 100644
--- a/lib/wx/c_src/wxe_nif.h
+++ b/lib/wx/c_src/wxe_nif.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2019-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2019-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -38,7 +38,7 @@ extern ERL_NIF_TERM WXE_ATOM__wx_invoke_cb_;
extern ERL_NIF_TERM WXE_ATOM_define;
extern ERL_NIF_TERM WXE_ATOM_global;
-/* Used for comparsions */
+/* Used for comparisons */
extern ERL_NIF_TERM WXE_ATOM_wxWindow;
extern ERL_NIF_TERM WXE_ATOM_wxSizer;
diff --git a/lib/wx/c_src/wxe_return.cpp b/lib/wx/c_src/wxe_return.cpp
index b86df17933..7d2e072561 100644
--- a/lib/wx/c_src/wxe_return.cpp
+++ b/lib/wx/c_src/wxe_return.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2021. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2022. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -409,7 +409,7 @@ ERL_NIF_TERM wxeReturn::make(wxGBSpan val) {
INLINE
ERL_NIF_TERM wxeReturn::make(wxMouseState val) {
- return enif_make_tuple(env, 11,
+ return enif_make_tuple(env, 13,
enif_make_atom(env, "wxMouseState"),
// TODO not int?
enif_make_uint(env, val.GetX()),
@@ -421,7 +421,9 @@ ERL_NIF_TERM wxeReturn::make(wxMouseState val) {
make_bool(val.ShiftDown()),
make_bool(val.AltDown()),
make_bool(val.MetaDown()),
- make_bool(val.CmdDown())
+ make_bool(val.CmdDown()),
+ make_bool(val.Aux1IsDown()),
+ make_bool(val.Aux2IsDown())
);
}
diff --git a/lib/wx/config.mk.in b/lib/wx/config.mk.in
index 2fa09209d2..51bab82ea4 100644
--- a/lib/wx/config.mk.in
+++ b/lib/wx/config.mk.in
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2021. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,20 +17,12 @@
#
# %CopyrightEnd%
#
-INSIDE_ERLSRC = @WX_BUILDING_INSIDE_ERLSRC@
SYS_TYPE = @WXERL_SYS_TYPE@
CAN_BUILD_DRIVER = @WXERL_CAN_BUILD_DRIVER@
VSN = $(WX_VSN)
-ifeq ($(INSIDE_ERLSRC), true)
-
include $(ERL_TOP)/make/target.mk
include $(ERL_TOP)/make/$(TARGET)/otp.mk
RELSYSDIR = $(RELEASE_PATH)/lib/wx-$(VSN)
-
-else
-INSTALLDIR=@ERLANG_ROOT_DIR@/lib
-endif
-
diff --git a/lib/wx/configure b/lib/wx/configure
index d9b49ea5fe..0f8e3e3d8e 100755
--- a/lib/wx/configure
+++ b/lib/wx/configure
@@ -1,9 +1,10 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69.
+# Generated by GNU Autoconf 2.71.
#
#
-# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
+# Inc.
#
#
# This configure script is free software; the Free Software Foundation
@@ -14,14 +15,16 @@
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -31,46 +34,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -79,13 +82,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -94,8 +90,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -107,30 +107,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# Use a proper internal environment variable to ensure we don't fall
# into an infinite loop, continuously re-executing ourselves.
@@ -152,20 +132,22 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
-as_fn_exit 255
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
+exit 255
fi
# We don't want this to propagate to other subprocesses.
{ _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
- as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+ as_bourne_compatible="as_nop=:
+if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
# is contrary to our usage. Disable this feature.
alias -g '\${1+\"\$@\"}'='\"\$@\"'
setopt NO_GLOB_SUBST
-else
+else \$as_nop
case \`(set -o) 2>/dev/null\` in #(
*posix*) :
set -o posix ;; #(
@@ -185,42 +167,53 @@ as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
-if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+if ( set x; as_fn_ret_success y && test x = \"\$1\" )
+then :
-else
+else \$as_nop
exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
+blah=\$(echo \$(echo blah))
+test x\"\$blah\" = xblah || exit 1
test -x / || exit 1"
as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
- if (eval "$as_required") 2>/dev/null; then :
+ if (eval "$as_required") 2>/dev/null
+then :
as_have_required=yes
-else
+else $as_nop
as_have_required=no
fi
- if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+ if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null
+then :
-else
+else $as_nop
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
as_found=:
case $as_dir in #(
/*)
for as_base in sh bash ksh sh5; do
# Try only shells that exist, to save several forks.
- as_shell=$as_dir/$as_base
+ as_shell=$as_dir$as_base
if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
CONFIG_SHELL=$as_shell as_have_required=yes
- if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+ if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null
+then :
break 2
fi
fi
@@ -228,14 +221,21 @@ fi
esac
as_found=false
done
-$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
- { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
- CONFIG_SHELL=$SHELL as_have_required=yes
-fi; }
IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+ as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null
+then :
+ CONFIG_SHELL=$SHELL as_have_required=yes
+fi
+fi
- if test "x$CONFIG_SHELL" != x; then :
+ if test "x$CONFIG_SHELL" != x
+then :
export CONFIG_SHELL
# We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
@@ -253,18 +253,19 @@ esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
-$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
+printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi
- if test x$as_have_required = xno; then :
- $as_echo "$0: This script requires a shell more modern than all"
- $as_echo "$0: the shells that I found on your system."
- if test x${ZSH_VERSION+set} = xset ; then
- $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
- $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+ if test x$as_have_required = xno
+then :
+ printf "%s\n" "$0: This script requires a shell more modern than all"
+ printf "%s\n" "$0: the shells that I found on your system."
+ if test ${ZSH_VERSION+y} ; then
+ printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+ printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later."
else
- $as_echo "$0: Please tell bug-autoconf@gnu.org about your system,
+ printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system,
$0: including any error possibly output before this
$0: message. Then install a modern shell, or manually run
$0: the script under such a shell if you do have one."
@@ -291,6 +292,7 @@ as_fn_unset ()
}
as_unset=as_fn_unset
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -308,6 +310,14 @@ as_fn_exit ()
as_fn_set_status $1
exit $1
} # as_fn_exit
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_mkdir_p
# -------------
@@ -322,7 +332,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -331,7 +341,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -370,12 +380,13 @@ as_fn_executable_p ()
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -387,18 +398,27 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
}
fi # as_fn_arith
+# as_fn_nop
+# ---------
+# Do nothing but, unlike ":", preserve the value of $?.
+as_fn_nop ()
+{
+ return $?
+}
+as_nop=as_fn_nop
# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
@@ -410,9 +430,9 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
@@ -439,7 +459,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -483,7 +503,7 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
s/-\n.*//
' >$as_me.lineno &&
chmod +x "$as_me.lineno" ||
- { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+ { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
# If we had to re-execute with $CONFIG_SHELL, we're ensured to have
# already done that, so ensure we don't try to do so again and fall
@@ -497,6 +517,10 @@ as_cr_alnum=$as_cr_Letters$as_cr_digits
exit
}
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -510,6 +534,13 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -575,49 +606,45 @@ MFLAGS=
MAKEFLAGS=
# Identity of this package.
-PACKAGE_NAME=
-PACKAGE_TARNAME=
-PACKAGE_VERSION=
-PACKAGE_STRING=
-PACKAGE_BUGREPORT=
-PACKAGE_URL=
+PACKAGE_NAME=''
+PACKAGE_TARNAME=''
+PACKAGE_VERSION=''
+PACKAGE_STRING=''
+PACKAGE_BUGREPORT=''
+PACKAGE_URL=''
# Factoring default headers for most tests.
ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
+#include <stddef.h>
+#ifdef HAVE_STDIO_H
+# include <stdio.h>
#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
+#ifdef HAVE_STDLIB_H
# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
#endif
#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-# include <memory.h>
-# endif
# include <string.h>
#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"
+ac_header_c_list=
ac_subst_vars='LTLIBOBJS
LIBOBJS
WXERL_SYS_TYPE
@@ -649,15 +676,14 @@ WX_CFLAGS
WX_CPPFLAGS
WX_CONFIG_PATH
ERLANG_ROOT_DIR
-WX_BUILDING_INSIDE_ERLSRC
ERLC
DEBUG_CXXFLAGS
DEBUG_CFLAGS
GL_LIBS
OBJC_CFLAGS
OBJC_CC
-EGREP
-GREP
+GLIB_LIBS
+GLIB_CFLAGS
MIXED_MINGW
MIXED_VC
CPP
@@ -673,6 +699,10 @@ LDFLAGS
CFLAGS
CC
TARGET
+target_os
+target_vendor
+target_cpu
+target
host_os
host_vendor
host_cpu
@@ -810,8 +840,6 @@ do
*) ac_optarg=yes ;;
esac
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
case $ac_dashdash$ac_option in
--)
ac_dashdash=yes ;;
@@ -852,9 +880,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -878,9 +906,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid feature name: $ac_useropt"
+ as_fn_error $? "invalid feature name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"enable_$ac_useropt"
@@ -1091,9 +1119,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1107,9 +1135,9 @@ do
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
# Reject names that are not valid shell variable names.
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
- as_fn_error $? "invalid package name: $ac_useropt"
+ as_fn_error $? "invalid package name: \`$ac_useropt'"
ac_useropt_orig=$ac_useropt
- ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+ ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'`
case $ac_user_opts in
*"
"with_$ac_useropt"
@@ -1153,9 +1181,9 @@ Try \`$0 --help' for more information"
*)
# FIXME: should be removed in autoconf 3.0.
- $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2
: "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
;;
@@ -1171,7 +1199,7 @@ if test -n "$ac_unrecognized_opts"; then
case $enable_option_checking in
no) ;;
fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
- *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+ *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
esac
fi
@@ -1235,7 +1263,7 @@ $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_myself" : 'X\(//\)[^/]' \| \
X"$as_myself" : 'X\(//\)$' \| \
X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_myself" |
+printf "%s\n" X"$as_myself" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -1353,6 +1381,7 @@ _ACEOF
System types:
--build=BUILD configure for building on BUILD [guessed]
--host=HOST cross-compile to build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
_ACEOF
fi
@@ -1410,9 +1439,9 @@ if test "$ac_init_help" = "recursive"; then
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1440,7 +1469,8 @@ esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
cd "$ac_dir" || { ac_status=$?; continue; }
- # Check for guested configure.
+ # Check for configure.gnu first; this name is used for a wrapper for
+ # Metaconfig's "Configure" on case-insensitive file systems.
if test -f "$ac_srcdir/configure.gnu"; then
echo &&
$SHELL "$ac_srcdir/configure.gnu" --help=recursive
@@ -1448,7 +1478,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
echo &&
$SHELL "$ac_srcdir/configure" --help=recursive
else
- $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2
fi || ac_status=$?
cd "$ac_pwd" || { ac_status=$?; break; }
done
@@ -1458,9 +1488,9 @@ test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
configure
-generated by GNU Autoconf 2.69
+generated by GNU Autoconf 2.71
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
@@ -1477,14 +1507,14 @@ fi
ac_fn_c_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1492,14 +1522,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1515,14 +1546,14 @@ fi
ac_fn_cxx_try_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext
+ rm -f conftest.$ac_objext conftest.beam
if { { ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1530,14 +1561,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_cxx_werror_flag" ||
test ! -s conftest.err
- } && test -s conftest.$ac_objext; then :
+ } && test -s conftest.$ac_objext
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1559,7 +1591,7 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1567,14 +1599,15 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } > conftest.i && {
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
test ! -s conftest.err
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1586,8 +1619,8 @@ fi
# ac_fn_c_try_run LINENO
# ----------------------
-# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
-# that executables *can* be run.
+# Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that
+# executables *can* be run.
ac_fn_c_try_run ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
@@ -1597,25 +1630,26 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
{ { case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; }
+then :
ac_retval=0
-else
- $as_echo "$as_me: program exited with status $ac_status" >&5
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: program exited with status $ac_status" >&5
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=$ac_status
@@ -1640,7 +1674,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
@@ -1650,14 +1684,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=0 ac_mid=0
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -1667,9 +1702,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid; break
-else
+else $as_nop
as_fn_arith $ac_mid + 1 && ac_lo=$as_val
if test $ac_lo -le $ac_mid; then
ac_lo= ac_hi=
@@ -1677,14 +1713,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
@@ -1694,14 +1730,15 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=-1 ac_mid=-1
while :; do
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
@@ -1711,9 +1748,10 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_lo=$ac_mid; break
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
if test $ac_mid -le $ac_hi; then
ac_lo= ac_hi=
@@ -1721,14 +1759,14 @@ else
fi
as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
-else
+else $as_nop
ac_lo= ac_hi=
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
@@ -1736,7 +1774,7 @@ while test "x$ac_lo" != "x$ac_hi"; do
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
@@ -1746,12 +1784,13 @@ return test_array [0];
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_hi=$ac_mid
-else
+else $as_nop
as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
@@ -1761,12 +1800,12 @@ esac
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
-static long int longval () { return $2; }
-static unsigned long int ulongval () { return $2; }
+static long int longval (void) { return $2; }
+static unsigned long int ulongval (void) { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.val", "w");
@@ -1794,9 +1833,10 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
+if ac_fn_c_try_run "$LINENO"
+then :
echo >>conftest.val; read $3 <conftest.val; ac_retval=0
-else
+else $as_nop
ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
@@ -1816,131 +1856,46 @@ rm -f conftest.val
ac_fn_c_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_header_compile
-# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
-# -------------------------------------------------------
-# Tests whether HEADER exists, giving a warning if it cannot be compiled using
-# the include files in INCLUDES and setting the cache variable VAR
-# accordingly.
-ac_fn_c_check_header_mongrel ()
-{
- as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- if eval \${$3+:} false; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-else
- # Is the header compilable?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
-$as_echo_n "checking $2 usability... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-$4
-#include <$2>
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_header_compiler=yes
-else
- ac_header_compiler=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
-$as_echo "$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
-$as_echo_n "checking $2 presence... " >&6; }
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <$2>
-_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
- ac_header_preproc=yes
-else
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.i conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
-$as_echo "$ac_header_preproc" >&6; }
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
- yes:no: )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
-$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
- no:yes:* )
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5
-$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
-$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5
-$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
-$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
- ;;
-esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- eval "$3=\$ac_header_compiler"
-fi
-eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-fi
- eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_c_check_header_mongrel
-
# ac_fn_cxx_try_link LINENO
# -------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_link ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- rm -f conftest.$ac_objext conftest$ac_exeext
+ rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -1948,17 +1903,18 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
mv -f conftest.er1 conftest.err
fi
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; } && {
test -z "$ac_cxx_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
test -x conftest$ac_exeext
- }; then :
+ }
+then :
ac_retval=0
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_retval=1
@@ -1980,17 +1936,18 @@ fi
ac_fn_c_check_type ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
eval "$3=no"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof ($2))
return 0;
@@ -1998,12 +1955,13 @@ if (sizeof ($2))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
int
-main ()
+main (void)
{
if (sizeof (($2)))
return 0;
@@ -2011,18 +1969,19 @@ if (sizeof (($2)))
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
eval "$3=yes"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_c_check_type
@@ -2034,37 +1993,59 @@ $as_echo "$ac_res" >&6; }
ac_fn_cxx_check_header_compile ()
{
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
-$as_echo_n "checking for $2... " >&6; }
-if eval \${$3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+printf %s "checking for $2... " >&6; }
+if eval test \${$3+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
$4
#include <$2>
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
eval "$3=yes"
-else
+else $as_nop
eval "$3=no"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
eval ac_res=\$$3
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+printf "%s\n" "$ac_res" >&6; }
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
} # ac_fn_cxx_check_header_compile
+ac_configure_args_raw=
+for ac_arg
+do
+ case $ac_arg in
+ *\'*)
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ as_fn_append ac_configure_args_raw " '$ac_arg'"
+done
+
+case $ac_configure_args_raw in
+ *$as_nl*)
+ ac_safe_unquote= ;;
+ *)
+ ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab.
+ ac_unsafe_a="$ac_unsafe_z#~"
+ ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g"
+ ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;;
+esac
+
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
It was created by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
- $ $0 $@
+ $ $0$ac_configure_args_raw
_ACEOF
exec 5>>config.log
@@ -2097,8 +2078,12 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- $as_echo "PATH: $as_dir"
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ printf "%s\n" "PATH: $as_dir"
done
IFS=$as_save_IFS
@@ -2133,7 +2118,7 @@ do
| -silent | --silent | --silen | --sile | --sil)
continue ;;
*\'*)
- ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
esac
case $ac_pass in
1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
@@ -2168,11 +2153,13 @@ done
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
+ # Sanitize IFS.
+ IFS=" "" $as_nl"
# Save into config.log some information that might help in debugging.
{
echo
- $as_echo "## ---------------- ##
+ printf "%s\n" "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
echo
@@ -2183,8 +2170,8 @@ trap 'exit_status=$?
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -2208,7 +2195,7 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
)
echo
- $as_echo "## ----------------- ##
+ printf "%s\n" "## ----------------- ##
## Output variables. ##
## ----------------- ##"
echo
@@ -2216,14 +2203,14 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
if test -n "$ac_subst_files"; then
- $as_echo "## ------------------- ##
+ printf "%s\n" "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
echo
@@ -2231,15 +2218,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
do
eval ac_val=\$$ac_var
case $ac_val in
- *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+ *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
esac
- $as_echo "$ac_var='\''$ac_val'\''"
+ printf "%s\n" "$ac_var='\''$ac_val'\''"
done | sort
echo
fi
if test -s confdefs.h; then
- $as_echo "## ----------- ##
+ printf "%s\n" "## ----------- ##
## confdefs.h. ##
## ----------- ##"
echo
@@ -2247,8 +2234,8 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
echo
fi
test "$ac_signal" != 0 &&
- $as_echo "$as_me: caught signal $ac_signal"
- $as_echo "$as_me: exit $exit_status"
+ printf "%s\n" "$as_me: caught signal $ac_signal"
+ printf "%s\n" "$as_me: exit $exit_status"
} >&5
rm -f core *.core core.conftest.* &&
rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -2262,63 +2249,48 @@ ac_signal=0
# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h
-$as_echo "/* confdefs.h */" > confdefs.h
+printf "%s\n" "/* confdefs.h */" > confdefs.h
# Predefined preprocessor variables.
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
+printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
+printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
+printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
+printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_URL "$PACKAGE_URL"
-_ACEOF
+printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h
# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
-ac_site_file1=NONE
-ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
- # We do not want a PATH search for config.site.
- case $CONFIG_SITE in #((
- -*) ac_site_file1=./$CONFIG_SITE;;
- */*) ac_site_file1=$CONFIG_SITE;;
- *) ac_site_file1=./$CONFIG_SITE;;
- esac
+ ac_site_files="$CONFIG_SITE"
elif test "x$prefix" != xNONE; then
- ac_site_file1=$prefix/share/config.site
- ac_site_file2=$prefix/etc/config.site
+ ac_site_files="$prefix/share/config.site $prefix/etc/config.site"
else
- ac_site_file1=$ac_default_prefix/share/config.site
- ac_site_file2=$ac_default_prefix/etc/config.site
+ ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
fi
-for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+
+for ac_site_file in $ac_site_files
do
- test "x$ac_site_file" = xNONE && continue
- if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
-$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+ case $ac_site_file in #(
+ */*) :
+ ;; #(
+ *) :
+ ac_site_file=./$ac_site_file ;;
+esac
+ if test -f "$ac_site_file" && test -r "$ac_site_file"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;}
sed 's/^/| /' "$ac_site_file" >&5
. "$ac_site_file" \
- || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -2328,19 +2300,650 @@ if test -r "$cache_file"; then
# Some versions of bash will fail to source /dev/null (special files
# actually), so we avoid doing that. DJGPP emulates it as a regular file.
if test /dev/null != "$cache_file" && test -f "$cache_file"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
-$as_echo "$as_me: loading cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+printf "%s\n" "$as_me: loading cache $cache_file" >&6;}
case $cache_file in
[\\/]* | ?:[\\/]* ) . "$cache_file";;
*) . "./$cache_file";;
esac
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
-$as_echo "$as_me: creating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+printf "%s\n" "$as_me: creating cache $cache_file" >&6;}
>$cache_file
fi
+# Test code for whether the C compiler supports C89 (global declarations)
+ac_c_conftest_c89_globals='
+/* Does the compiler advertise C89 conformance?
+ Do not test the value of __STDC__, because some compilers set it to 0
+ while being otherwise adequately conformant. */
+#if !defined __STDC__
+# error "Compiler does not advertise C89 conformance"
+#endif
+
+#include <stddef.h>
+#include <stdarg.h>
+struct stat;
+/* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */
+struct buf { int x; };
+struct buf * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not \xHH hex character constants.
+ These do not provoke an error unfortunately, instead are silently treated
+ as an "x". The following induces an error, until -std is added to get
+ proper ANSI mode. Curiously \x00 != x always comes out true, for an
+ array size at least. It is necessary to write \x00 == 0 to get something
+ that is true only with -std. */
+int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+ inside strings and character constants. */
+#define FOO(x) '\''x'\''
+int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int),
+ int, int);'
+
+# Test code for whether the C compiler supports C89 (body of main).
+ac_c_conftest_c89_main='
+ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]);
+'
+
+# Test code for whether the C compiler supports C99 (global declarations)
+ac_c_conftest_c99_globals='
+// Does the compiler advertise C99 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
+# error "Compiler does not advertise C99 conformance"
+#endif
+
+#include <stdbool.h>
+extern int puts (const char *);
+extern int printf (const char *, ...);
+extern int dprintf (int, const char *, ...);
+extern void *malloc (size_t);
+
+// Check varargs macros. These examples are taken from C99 6.10.3.5.
+// dprintf is used instead of fprintf to avoid needing to declare
+// FILE and stderr.
+#define debug(...) dprintf (2, __VA_ARGS__)
+#define showlist(...) puts (#__VA_ARGS__)
+#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
+static void
+test_varargs_macros (void)
+{
+ int x = 1234;
+ int y = 5678;
+ debug ("Flag");
+ debug ("X = %d\n", x);
+ showlist (The first, second, and third items.);
+ report (x>y, "x is %d but y is %d", x, y);
+}
+
+// Check long long types.
+#define BIG64 18446744073709551615ull
+#define BIG32 4294967295ul
+#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
+#if !BIG_OK
+ #error "your preprocessor is broken"
+#endif
+#if BIG_OK
+#else
+ #error "your preprocessor is broken"
+#endif
+static long long int bignum = -9223372036854775807LL;
+static unsigned long long int ubignum = BIG64;
+
+struct incomplete_array
+{
+ int datasize;
+ double data[];
+};
+
+struct named_init {
+ int number;
+ const wchar_t *name;
+ double average;
+};
+
+typedef const char *ccp;
+
+static inline int
+test_restrict (ccp restrict text)
+{
+ // See if C++-style comments work.
+ // Iterate through items via the restricted pointer.
+ // Also check for declarations in for loops.
+ for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i)
+ continue;
+ return 0;
+}
+
+// Check varargs and va_copy.
+static bool
+test_varargs (const char *format, ...)
+{
+ va_list args;
+ va_start (args, format);
+ va_list args_copy;
+ va_copy (args_copy, args);
+
+ const char *str = "";
+ int number = 0;
+ float fnumber = 0;
+
+ while (*format)
+ {
+ switch (*format++)
+ {
+ case '\''s'\'': // string
+ str = va_arg (args_copy, const char *);
+ break;
+ case '\''d'\'': // int
+ number = va_arg (args_copy, int);
+ break;
+ case '\''f'\'': // float
+ fnumber = va_arg (args_copy, double);
+ break;
+ default:
+ break;
+ }
+ }
+ va_end (args_copy);
+ va_end (args);
+
+ return *str && number && fnumber;
+}
+'
+
+# Test code for whether the C compiler supports C99 (body of main).
+ac_c_conftest_c99_main='
+ // Check bool.
+ _Bool success = false;
+ success |= (argc != 0);
+
+ // Check restrict.
+ if (test_restrict ("String literal") == 0)
+ success = true;
+ char *restrict newvar = "Another string";
+
+ // Check varargs.
+ success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234);
+ test_varargs_macros ();
+
+ // Check flexible array members.
+ struct incomplete_array *ia =
+ malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
+ ia->datasize = 10;
+ for (int i = 0; i < ia->datasize; ++i)
+ ia->data[i] = i * 1.234;
+
+ // Check named initializers.
+ struct named_init ni = {
+ .number = 34,
+ .name = L"Test wide string",
+ .average = 543.34343,
+ };
+
+ ni.number = 58;
+
+ int dynamic_array[ni.number];
+ dynamic_array[0] = argv[0][0];
+ dynamic_array[ni.number - 1] = 543;
+
+ // work around unused variable warnings
+ ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\''
+ || dynamic_array[ni.number - 1] != 543);
+'
+
+# Test code for whether the C compiler supports C11 (global declarations)
+ac_c_conftest_c11_globals='
+// Does the compiler advertise C11 conformance?
+#if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L
+# error "Compiler does not advertise C11 conformance"
+#endif
+
+// Check _Alignas.
+char _Alignas (double) aligned_as_double;
+char _Alignas (0) no_special_alignment;
+extern char aligned_as_int;
+char _Alignas (0) _Alignas (int) aligned_as_int;
+
+// Check _Alignof.
+enum
+{
+ int_alignment = _Alignof (int),
+ int_array_alignment = _Alignof (int[100]),
+ char_alignment = _Alignof (char)
+};
+_Static_assert (0 < -_Alignof (int), "_Alignof is signed");
+
+// Check _Noreturn.
+int _Noreturn does_not_return (void) { for (;;) continue; }
+
+// Check _Static_assert.
+struct test_static_assert
+{
+ int x;
+ _Static_assert (sizeof (int) <= sizeof (long int),
+ "_Static_assert does not work in struct");
+ long int y;
+};
+
+// Check UTF-8 literals.
+#define u8 syntax error!
+char const utf8_literal[] = u8"happens to be ASCII" "another string";
+
+// Check duplicate typedefs.
+typedef long *long_ptr;
+typedef long int *long_ptr;
+typedef long_ptr long_ptr;
+
+// Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1.
+struct anonymous
+{
+ union {
+ struct { int i; int j; };
+ struct { int k; long int l; } w;
+ };
+ int m;
+} v1;
+'
+
+# Test code for whether the C compiler supports C11 (body of main).
+ac_c_conftest_c11_main='
+ _Static_assert ((offsetof (struct anonymous, i)
+ == offsetof (struct anonymous, w.k)),
+ "Anonymous union alignment botch");
+ v1.i = 2;
+ v1.w.k = 5;
+ ok |= v1.i != 5;
+'
+
+# Test code for whether the C compiler supports C11 (complete).
+ac_c_conftest_c11_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+${ac_c_conftest_c11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ ${ac_c_conftest_c11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C99 (complete).
+ac_c_conftest_c99_program="${ac_c_conftest_c89_globals}
+${ac_c_conftest_c99_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ ${ac_c_conftest_c99_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C89 (complete).
+ac_c_conftest_c89_program="${ac_c_conftest_c89_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_c_conftest_c89_main}
+ return ok;
+}
+"
+
+# Test code for whether the C++ compiler supports C++98 (global declarations)
+ac_cxx_conftest_cxx98_globals='
+// Does the compiler advertise C++98 conformance?
+#if !defined __cplusplus || __cplusplus < 199711L
+# error "Compiler does not advertise C++98 conformance"
+#endif
+
+// These inclusions are to reject old compilers that
+// lack the unsuffixed header files.
+#include <cstdlib>
+#include <exception>
+
+// <cassert> and <cstring> are *not* freestanding headers in C++98.
+extern void assert (int);
+namespace std {
+ extern int strcmp (const char *, const char *);
+}
+
+// Namespaces, exceptions, and templates were all added after "C++ 2.0".
+using std::exception;
+using std::strcmp;
+
+namespace {
+
+void test_exception_syntax()
+{
+ try {
+ throw "test";
+ } catch (const char *s) {
+ // Extra parentheses suppress a warning when building autoconf itself,
+ // due to lint rules shared with more typical C programs.
+ assert (!(strcmp) (s, "test"));
+ }
+}
+
+template <typename T> struct test_template
+{
+ T const val;
+ explicit test_template(T t) : val(t) {}
+ template <typename U> T add(U u) { return static_cast<T>(u) + val; }
+};
+
+} // anonymous namespace
+'
+
+# Test code for whether the C++ compiler supports C++98 (body of main)
+ac_cxx_conftest_cxx98_main='
+ assert (argc);
+ assert (! argv[0]);
+{
+ test_exception_syntax ();
+ test_template<double> tt (2.0);
+ assert (tt.add (4) == 6.0);
+ assert (true && !false);
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (global declarations)
+ac_cxx_conftest_cxx11_globals='
+// Does the compiler advertise C++ 2011 conformance?
+#if !defined __cplusplus || __cplusplus < 201103L
+# error "Compiler does not advertise C++11 conformance"
+#endif
+
+namespace cxx11test
+{
+ constexpr int get_val() { return 20; }
+
+ struct testinit
+ {
+ int i;
+ double d;
+ };
+
+ class delegate
+ {
+ public:
+ delegate(int n) : n(n) {}
+ delegate(): delegate(2354) {}
+
+ virtual int getval() { return this->n; };
+ protected:
+ int n;
+ };
+
+ class overridden : public delegate
+ {
+ public:
+ overridden(int n): delegate(n) {}
+ virtual int getval() override final { return this->n * 2; }
+ };
+
+ class nocopy
+ {
+ public:
+ nocopy(int i): i(i) {}
+ nocopy() = default;
+ nocopy(const nocopy&) = delete;
+ nocopy & operator=(const nocopy&) = delete;
+ private:
+ int i;
+ };
+
+ // for testing lambda expressions
+ template <typename Ret, typename Fn> Ret eval(Fn f, Ret v)
+ {
+ return f(v);
+ }
+
+ // for testing variadic templates and trailing return types
+ template <typename V> auto sum(V first) -> V
+ {
+ return first;
+ }
+ template <typename V, typename... Args> auto sum(V first, Args... rest) -> V
+ {
+ return first + sum(rest...);
+ }
+}
+'
+
+# Test code for whether the C++ compiler supports C++11 (body of main)
+ac_cxx_conftest_cxx11_main='
+{
+ // Test auto and decltype
+ auto a1 = 6538;
+ auto a2 = 48573953.4;
+ auto a3 = "String literal";
+
+ int total = 0;
+ for (auto i = a3; *i; ++i) { total += *i; }
+
+ decltype(a2) a4 = 34895.034;
+}
+{
+ // Test constexpr
+ short sa[cxx11test::get_val()] = { 0 };
+}
+{
+ // Test initializer lists
+ cxx11test::testinit il = { 4323, 435234.23544 };
+}
+{
+ // Test range-based for
+ int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3,
+ 14, 19, 17, 8, 6, 20, 16, 2, 11, 1};
+ for (auto &x : array) { x += 23; }
+}
+{
+ // Test lambda expressions
+ using cxx11test::eval;
+ assert (eval ([](int x) { return x*2; }, 21) == 42);
+ double d = 2.0;
+ assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0);
+ assert (d == 5.0);
+ assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0);
+ assert (d == 5.0);
+}
+{
+ // Test use of variadic templates
+ using cxx11test::sum;
+ auto a = sum(1);
+ auto b = sum(1, 2);
+ auto c = sum(1.0, 2.0, 3.0);
+}
+{
+ // Test constructor delegation
+ cxx11test::delegate d1;
+ cxx11test::delegate d2();
+ cxx11test::delegate d3(45);
+}
+{
+ // Test override and final
+ cxx11test::overridden o1(55464);
+}
+{
+ // Test nullptr
+ char *c = nullptr;
+}
+{
+ // Test template brackets
+ test_template<::test_template<int>> v(test_template<int>(12));
+}
+{
+ // Unicode literals
+ char const *utf8 = u8"UTF-8 string \u2500";
+ char16_t const *utf16 = u"UTF-8 string \u2500";
+ char32_t const *utf32 = U"UTF-32 string \u2500";
+}
+'
+
+# Test code for whether the C compiler supports C++11 (complete).
+ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals}
+${ac_cxx_conftest_cxx11_globals}
+
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ ${ac_cxx_conftest_cxx11_main}
+ return ok;
+}
+"
+
+# Test code for whether the C compiler supports C++98 (complete).
+ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals}
+int
+main (int argc, char **argv)
+{
+ int ok = 0;
+ ${ac_cxx_conftest_cxx98_main}
+ return ok;
+}
+"
+
+as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H"
+as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H"
+as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H"
+as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H"
+as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H"
+as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H"
+as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H"
+as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H"
+as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H"
+
+# Auxiliary files required by this configure script.
+ac_aux_files="config.guess config.sub"
+
+# Locations in which to look for auxiliary files.
+ac_aux_dir_candidates="${ERL_TOP}/make/autoconf"
+
+# Search for a directory containing all of the required auxiliary files,
+# $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates.
+# If we don't find one directory that contains all the files we need,
+# we report the set of missing files from the *first* directory in
+# $ac_aux_dir_candidates and give up.
+ac_missing_aux_files=""
+ac_first_candidate=:
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in $ac_aux_dir_candidates
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ as_found=:
+
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5
+ ac_aux_dir_found=yes
+ ac_install_sh=
+ for ac_aux in $ac_aux_files
+ do
+ # As a special case, if "install-sh" is required, that requirement
+ # can be satisfied by any of "install-sh", "install.sh", or "shtool",
+ # and $ac_install_sh is set appropriately for whichever one is found.
+ if test x"$ac_aux" = x"install-sh"
+ then
+ if test -f "${as_dir}install-sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5
+ ac_install_sh="${as_dir}install-sh -c"
+ elif test -f "${as_dir}install.sh"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5
+ ac_install_sh="${as_dir}install.sh -c"
+ elif test -f "${as_dir}shtool"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5
+ ac_install_sh="${as_dir}shtool install -c"
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} install-sh"
+ else
+ break
+ fi
+ fi
+ else
+ if test -f "${as_dir}${ac_aux}"; then
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5
+ else
+ ac_aux_dir_found=no
+ if $ac_first_candidate; then
+ ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}"
+ else
+ break
+ fi
+ fi
+ fi
+ done
+ if test "$ac_aux_dir_found" = yes; then
+ ac_aux_dir="$as_dir"
+ break
+ fi
+ ac_first_candidate=false
+
+ as_found=false
+done
+IFS=$as_save_IFS
+if $as_found
+then :
+
+else $as_nop
+ as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5
+fi
+
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+if test -f "${ac_aux_dir}config.guess"; then
+ ac_config_guess="$SHELL ${ac_aux_dir}config.guess"
+fi
+if test -f "${ac_aux_dir}config.sub"; then
+ ac_config_sub="$SHELL ${ac_aux_dir}config.sub"
+fi
+if test -f "$ac_aux_dir/configure"; then
+ ac_configure="$SHELL ${ac_aux_dir}configure"
+fi
+
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
@@ -2351,12 +2954,12 @@ for ac_var in $ac_precious_vars; do
eval ac_new_val=\$ac_env_${ac_var}_value
case $ac_old_set,$ac_new_set in
set,)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
ac_cache_corrupted=: ;;
,set)
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
-$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_cache_corrupted=: ;;
,);;
*)
@@ -2365,24 +2968,24 @@ $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
ac_old_val_w=`echo x $ac_old_val`
ac_new_val_w=`echo x $ac_new_val`
if test "$ac_old_val_w" != "$ac_new_val_w"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
-$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
ac_cache_corrupted=:
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
-$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
eval $ac_var=\$ac_old_val
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
-$as_echo "$as_me: former value: \`$ac_old_val'" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
-$as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5
+printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5
+printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;}
fi;;
esac
# Pass precious variables to config.status.
if test "$ac_new_set" = set; then
case $ac_new_val in
- *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
*) ac_arg=$ac_var=$ac_new_val ;;
esac
case " $ac_configure_args " in
@@ -2392,11 +2995,12 @@ $as_echo "$as_me: current value: \`$ac_new_val'" >&2;}
fi
done
if $ac_cache_corrupted; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
-$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;}
+ as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file'
+ and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
@@ -2410,110 +3014,140 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
-ac_aux_dir=
-for ac_dir in $srcdir/autoconf; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in $srcdir/autoconf" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
-## Delete previous failed configure results
-if test -f ./CONF_INFO; then
- rm ./CONF_INFO
-fi
-if test -z "$ERL_TOP" || test ! -d $ERL_TOP ; then
- as_fn_error $? "ERL_TOP is not set" "$LINENO" 5
-else
- erl_top=${ERL_TOP}
- ac_aux_dir=
-for ac_dir in $erl_top/erts/autoconf; do
- if test -f "$ac_dir/install-sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f "$ac_dir/install.sh"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f "$ac_dir/shtool"; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- as_fn_error $? "cannot find install-sh, install.sh, or shtool in $erl_top/erts/autoconf" "$LINENO" 5
-fi
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
- WX_BUILDING_INSIDE_ERLSRC=true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Delete previous failed configure results
+if test -f ./CONF_INFO; then
+ rm ./CONF_INFO
fi
+
+
# Check whether --with-wx was given.
-if test "${with_wx+set}" = set; then :
+if test ${with_wx+y}
+then :
withval=$with_wx;
fi
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- # Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
- as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
-$as_echo_n "checking build system type... " >&6; }
-if ${ac_cv_build+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+
+
+ # Make sure we can run config.sub.
+$SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 ||
+ as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5
+
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+printf %s "checking build system type... " >&6; }
+if test ${ac_cv_build+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
- ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+ ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"`
test "x$ac_build_alias" = x &&
as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
-$as_echo "$ac_cv_build" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+printf "%s\n" "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
@@ -2532,21 +3166,22 @@ IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
-$as_echo_n "checking host system type... " >&6; }
-if ${ac_cv_host+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+printf %s "checking host system type... " >&6; }
+if test ${ac_cv_host+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test "x$host_alias" = x; then
ac_cv_host=$ac_cv_build
else
- ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
- as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+ ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
-$as_echo "$ac_cv_host" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+printf "%s\n" "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
@@ -2565,10 +3200,108 @@ IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
+printf %s "checking target system type... " >&6; }
+if test ${ac_cv_target+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test "x$target_alias" = x; then
+ ac_cv_target=$ac_cv_host
else
- host_os=win32
+ ac_cv_target=`$SHELL "${ac_aux_dir}config.sub" $target_alias` ||
+ as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $target_alias failed" "$LINENO" 5
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
+printf "%s\n" "$ac_cv_target" >&6; }
+case $ac_cv_target in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
+esac
+target=$ac_cv_target
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_target
+shift
+target_cpu=$1
+target_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+target_os=$*
+IFS=$ac_save_IFS
+case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac
+
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+ # Adjust for local legacy windows hack...
+ case $host in #(
+ local-*-windows) :
+
+ host=win32
+ host_os=win32
+ host_vendor=
+ host_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $build in #(
+ local-*-windows) :
+
+ build=win32
+ build_os=win32
+ build_vendor=
+ build_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+
+ # Adjust for local legacy windows hack...
+ case $target in #(
+ local-*-windows) :
+
+ target=win32
+ target_os=win32
+ target_vendor=
+ target_cpu=
+ ;; #(
+ *) :
+ ;;
+esac
+
+ if test "$cross_compiling" = "yes" -a "$build" = "$host"
+then :
+ as_fn_error $? "
+ Cross compiling with the same canonicalized 'host' value
+ as the canonicalized 'build' value.
+
+ We are cross compiling since the '--host=$host_alias'
+ and the '--build=$build_alias' arguments differ. When
+ cross compiling Erlang/OTP, also the canonicalized values of
+ the '--build' and the '--host' arguments *must* differ. The
+ canonicalized values of these arguments however both equals:
+ $host
+
+ You can check the canonical value by passing a value as
+ argument to the 'make/autoconf/config.sub' script.
+ " "$LINENO" 5
fi
+
case $host_os in
mingw32)
if test "X$host" = "X"; then
@@ -2582,6 +3315,15 @@ esac
TARGET=$host
+
+
+
+
+
+
+
+
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -2590,11 +3332,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2602,11 +3345,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2617,11 +3364,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2630,11 +3377,12 @@ if test -z "$ac_cv_prog_CC"; then
ac_ct_CC=$CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2642,11 +3390,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="gcc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2657,11 +3409,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_CC" = x; then
@@ -2669,8 +3421,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2683,11 +3435,12 @@ if test -z "$CC"; then
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2695,11 +3448,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="${ac_tool_prefix}cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2710,11 +3467,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2723,11 +3480,12 @@ fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2736,15 +3494,19 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2760,18 +3522,18 @@ if test $ac_prog_rejected = yes; then
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
- ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@"
fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2782,11 +3544,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
@@ -2794,11 +3557,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2809,11 +3576,11 @@ fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
-$as_echo "$CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2826,11 +3593,12 @@ if test -z "$CC"; then
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CC+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CC"; then
ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
@@ -2838,11 +3606,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CC="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -2853,11 +3625,11 @@ fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
-$as_echo "$ac_ct_CC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -2869,8 +3641,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CC=$ac_ct_CC
@@ -2878,25 +3650,129 @@ esac
fi
fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args.
+set dummy ${ac_tool_prefix}clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+printf "%s\n" "$CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
-test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "clang", so it can be a program name with args.
+set dummy clang; ac_word=$2
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CC+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="clang"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+ done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+printf "%s\n" "$ac_ct_CC" >&6; }
+else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+fi
+
+ if test "x$ac_ct_CC" = x; then
+ CC=""
+ else
+ case $cross_compiling:$ac_tool_warned in
+yes:)
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+ CC=$ac_ct_CC
+ fi
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+
+
+test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
-for ac_option in --version -v -V -qversion; do
+for ac_option in --version -v -V -qversion -version; do
{ { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -2906,7 +3782,7 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
@@ -2914,7 +3790,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -2926,9 +3802,9 @@ ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
-$as_echo_n "checking whether the C compiler works... " >&6; }
-ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+printf %s "checking whether the C compiler works... " >&6; }
+ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
@@ -2949,11 +3825,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link_default") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile. We should not override ac_cv_exeext if it was cached,
@@ -2970,7 +3847,7 @@ do
# certainly right.
break;;
*.* )
- if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+ if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no;
then :; else
ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
fi
@@ -2986,44 +3863,46 @@ do
done
test "$ac_cv_exeext" = no && ac_cv_exeext=
-else
+else $as_nop
ac_file=''
fi
-if test -z "$ac_file"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-$as_echo "$as_me: failed program was:" >&5
+if test -z "$ac_file"
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
-$as_echo_n "checking for C compiler default output file name... " >&6; }
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
-$as_echo "$ac_file" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+printf %s "checking for C compiler default output file name... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+printf "%s\n" "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext
rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
-$as_echo_n "checking for suffix of executables... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+printf %s "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
# If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
@@ -3037,15 +3916,15 @@ for ac_file in conftest.exe conftest conftest.*; do
* ) break;;
esac
done
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
-$as_echo "$ac_cv_exeext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+printf "%s\n" "$ac_cv_exeext" >&6; }
rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
@@ -3054,7 +3933,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <stdio.h>
int
-main ()
+main (void)
{
FILE *f = fopen ("conftest.out", "w");
return ferror (f) || fclose (f) != 0;
@@ -3066,8 +3945,8 @@ _ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run. If not, either
# the compiler is broken, or we cross compile.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
-$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+printf %s "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
{ { ac_try="$ac_link"
case "(($ac_try" in
@@ -3075,10 +3954,10 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_link") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
if { ac_try='./conftest$ac_cv_exeext'
{ { case "(($ac_try" in
@@ -3086,39 +3965,40 @@ $as_echo "$ac_try_echo"; } >&5
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_try") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }; then
cross_compiling=no
else
if test "$cross_compiling" = maybe; then
cross_compiling=yes
else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "cannot run C compiled programs.
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
fi
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
-$as_echo "$cross_compiling" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+printf "%s\n" "$cross_compiling" >&6; }
rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
-$as_echo_n "checking for suffix of object files... " >&6; }
-if ${ac_cv_objext+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+printf %s "checking for suffix of object files... " >&6; }
+if test ${ac_cv_objext+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
@@ -3132,11 +4012,12 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compile") 2>&5
ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; then :
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }
+then :
for ac_file in conftest.o conftest.obj conftest.*; do
test -f "$ac_file" || continue;
case $ac_file in
@@ -3145,31 +4026,32 @@ $as_echo "$ac_try_echo"; } >&5
break;;
esac
done
-else
- $as_echo "$as_me: failed program was:" >&5
+else $as_nop
+ printf "%s\n" "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
-{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
-$as_echo "$ac_cv_objext" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+printf "%s\n" "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
-$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
-if ${ac_cv_c_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5
+printf %s "checking whether the compiler supports GNU C... " >&6; }
+if test ${ac_cv_c_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3179,29 +4061,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
-$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GCC=yes
else
GCC=
fi
-ac_test_CFLAGS=${CFLAGS+set}
+ac_test_CFLAGS=${CFLAGS+y}
ac_save_CFLAGS=$CFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
-$as_echo_n "checking whether $CC accepts -g... " >&6; }
-if ${ac_cv_prog_cc_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+printf %s "checking whether $CC accepts -g... " >&6; }
+if test ${ac_cv_prog_cc_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_c_werror_flag=$ac_c_werror_flag
ac_c_werror_flag=yes
ac_cv_prog_cc_g=no
@@ -3210,57 +4096,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
-else
+else $as_nop
CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_c_werror_flag=$ac_save_c_werror_flag
CFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_c_werror_flag=$ac_save_c_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
-$as_echo "$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+printf "%s\n" "$ac_cv_prog_cc_g" >&6; }
+if test $ac_test_CFLAGS; then
CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
if test "$GCC" = yes; then
@@ -3275,94 +4164,144 @@ else
CFLAGS=
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
-$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
-if ${ac_cv_prog_cc_c89+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c89=no
+ac_prog_cc_stdc=no
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5
+printf %s "checking for $CC option to enable C11 features... " >&6; }
+if test ${ac_cv_prog_cc_c11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c11=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdio.h>
-struct stat;
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
- char **p;
- int i;
-{
- return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
- char *s;
- va_list v;
- va_start (v,p);
- s = g (p, va_arg (v,int));
- va_end (v);
- return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
- function prototypes and stuff, but not '\xHH' hex character constants.
- These don't provoke an error unfortunately, instead are silently treated
- as 'x'. The following induces an error, until -std is added to get
- proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
- array size at least. It's necessary to write '\x00'==0 to get something
- that's true only with -std. */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+$ac_c_conftest_c11_program
+_ACEOF
+for ac_arg in '' -std=gnu11
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
- inside strings and character constants. */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+if test "x$ac_cv_prog_cc_c11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5
+printf "%s\n" "$ac_cv_prog_cc_c11" >&6; }
+ CC="$CC $ac_cv_prog_cc_c11"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11
+ ac_prog_cc_stdc=c11
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5
+printf %s "checking for $CC option to enable C99 features... " >&6; }
+if test ${ac_cv_prog_cc_c99+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c99=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c99_program
+_ACEOF
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99=
+do
+ CC="$ac_save_CC $ac_arg"
+ if ac_fn_c_try_compile "$LINENO"
+then :
+ ac_cv_prog_cc_c99=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cc_c99" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+fi
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
- ;
- return 0;
-}
+if test "x$ac_cv_prog_cc_c99" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c99" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
+printf "%s\n" "$ac_cv_prog_cc_c99" >&6; }
+ CC="$CC $ac_cv_prog_cc_c99"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
+ ac_prog_cc_stdc=c99
+fi
+fi
+if test x$ac_prog_cc_stdc = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5
+printf %s "checking for $CC option to enable C89 features... " >&6; }
+if test ${ac_cv_prog_cc_c89+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_c_conftest_c89_program
_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
- -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
+ if ac_fn_c_try_compile "$LINENO"
+then :
ac_cv_prog_cc_c89=$ac_arg
fi
-rm -f core conftest.err conftest.$ac_objext
+rm -f core conftest.err conftest.$ac_objext conftest.beam
test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC
-
fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c89"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
-$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c89" != xno; then :
+if test "x$ac_cv_prog_cc_c89" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cc_c89" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+printf "%s\n" "$ac_cv_prog_cc_c89" >&6; }
+ CC="$CC $ac_cv_prog_cc_c89"
+fi
+ ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
+ ac_prog_cc_stdc=c89
+fi
fi
ac_ext=c
@@ -3371,6 +4310,12 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3381,15 +4326,16 @@ if test -z "$CXX"; then
CXX=$CCC
else
if test -n "$ac_tool_prefix"; then
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
do
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$CXX"; then
ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
@@ -3397,11 +4343,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3412,11 +4362,11 @@ fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
-$as_echo "$CXX" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+printf "%s\n" "$CXX" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3425,15 +4375,16 @@ fi
fi
if test -z "$CXX"; then
ac_ct_CXX=$CXX
- for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+ for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_CXX+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_CXX+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_CXX"; then
ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
@@ -3441,11 +4392,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_CXX="$ac_prog"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3456,11 +4411,11 @@ fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
-$as_echo "$ac_ct_CXX" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+printf "%s\n" "$ac_ct_CXX" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3472,8 +4427,8 @@ done
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
CXX=$ac_ct_CXX
@@ -3483,7 +4438,7 @@ fi
fi
fi
# Provide some information about the compiler.
-$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
@@ -3493,7 +4448,7 @@ case "(($ac_try" in
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
+printf "%s\n" "$ac_try_echo"; } >&5
(eval "$ac_compiler $ac_option >&5") 2>conftest.err
ac_status=$?
if test -s conftest.err; then
@@ -3503,20 +4458,21 @@ $as_echo "$ac_try_echo"; } >&5
cat conftest.er1 >&5
fi
rm -f conftest.er1 conftest.err
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }
done
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
-$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
-if ${ac_cv_cxx_compiler_gnu+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5
+printf %s "checking whether the compiler supports GNU C++... " >&6; }
+if test ${ac_cv_cxx_compiler_gnu+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
#ifndef __GNUC__
choke me
@@ -3526,29 +4482,33 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
ac_compiler_gnu=yes
-else
+else $as_nop
ac_compiler_gnu=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
-$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; }
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
if test $ac_compiler_gnu = yes; then
GXX=yes
else
GXX=
fi
-ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_test_CXXFLAGS=${CXXFLAGS+y}
ac_save_CXXFLAGS=$CXXFLAGS
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
-$as_echo_n "checking whether $CXX accepts -g... " >&6; }
-if ${ac_cv_prog_cxx_g+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+printf %s "checking whether $CXX accepts -g... " >&6; }
+if test ${ac_cv_prog_cxx_g+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
ac_save_cxx_werror_flag=$ac_cxx_werror_flag
ac_cxx_werror_flag=yes
ac_cv_prog_cxx_g=no
@@ -3557,57 +4517,60 @@ else
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
ac_cv_prog_cxx_g=yes
-else
+else $as_nop
CXXFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
-else
+else $as_nop
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
CXXFLAGS="-g"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
ac_cv_prog_cxx_g=yes
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_cxx_werror_flag=$ac_save_cxx_werror_flag
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+printf "%s\n" "$ac_cv_prog_cxx_g" >&6; }
+if test $ac_test_CXXFLAGS; then
CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
if test "$GXX" = yes; then
@@ -3622,6 +4585,100 @@ else
CXXFLAGS=
fi
fi
+ac_prog_cxx_stdcxx=no
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5
+printf %s "checking for $CXX option to enable C++11 features... " >&6; }
+if test ${ac_cv_prog_cxx_11+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_11=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx11_program
+_ACEOF
+for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx11=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx11" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx11" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx11" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx11"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11
+ ac_prog_cxx_stdcxx=cxx11
+fi
+fi
+if test x$ac_prog_cxx_stdcxx = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5
+printf %s "checking for $CXX option to enable C++98 features... " >&6; }
+if test ${ac_cv_prog_cxx_98+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ ac_cv_prog_cxx_98=no
+ac_save_CXX=$CXX
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$ac_cxx_conftest_cxx98_program
+_ACEOF
+for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA
+do
+ CXX="$ac_save_CXX $ac_arg"
+ if ac_fn_cxx_try_compile "$LINENO"
+then :
+ ac_cv_prog_cxx_cxx98=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam
+ test "x$ac_cv_prog_cxx_cxx98" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CXX=$ac_save_CXX
+fi
+
+if test "x$ac_cv_prog_cxx_cxx98" = xno
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+printf "%s\n" "unsupported" >&6; }
+else $as_nop
+ if test "x$ac_cv_prog_cxx_cxx98" = x
+then :
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+printf "%s\n" "none needed" >&6; }
+else $as_nop
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5
+printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; }
+ CXX="$CXX $ac_cv_prog_cxx_cxx98"
+fi
+ ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98
+ ac_prog_cxx_stdcxx=cxx98
+fi
+fi
+
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3631,11 +4688,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$RANLIB"; then
ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
@@ -3643,11 +4701,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3658,11 +4720,11 @@ fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
-$as_echo "$RANLIB" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+printf "%s\n" "$RANLIB" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -3671,11 +4733,12 @@ if test -z "$ac_cv_prog_RANLIB"; then
ac_ct_RANLIB=$RANLIB
# Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_prog_ac_ct_RANLIB+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
if test -n "$ac_ct_RANLIB"; then
ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
@@ -3683,11 +4746,15 @@ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
ac_cv_prog_ac_ct_RANLIB="ranlib"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -3698,11 +4765,11 @@ fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
-$as_echo "$ac_ct_RANLIB" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+printf "%s\n" "$ac_ct_RANLIB" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$ac_ct_RANLIB" = x; then
@@ -3710,8 +4777,8 @@ fi
else
case $cross_compiling:$ac_tool_warned in
yes:)
-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
RANLIB=$ac_ct_RANLIB
@@ -3725,40 +4792,36 @@ ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
-$as_echo_n "checking how to run the C preprocessor... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+printf %s "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
CPP=
fi
if test -z "$CPP"; then
- if ${ac_cv_prog_CPP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ if test ${ac_cv_prog_CPP+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ # Double quotes because $CC needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp
do
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
-else
+else $as_nop
# Broken: fails on valid input.
continue
fi
@@ -3770,10 +4833,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
+else $as_nop
# Passes both tests.
ac_preproc_ok=:
break
@@ -3783,7 +4847,8 @@ rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
break
fi
@@ -3795,29 +4860,24 @@ fi
else
ac_cv_prog_CPP=$CPP
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
-$as_echo "$CPP" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+printf "%s\n" "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
# Use a header file that comes with gcc, so configuring glibc
# with a fresh cross-compiler works.
- # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
- # <limits.h> exists even on freestanding compilers.
# On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. "Syntax error" is here to catch this case.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
+#include <limits.h>
Syntax error
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
-else
+else $as_nop
# Broken: fails on valid input.
continue
fi
@@ -3829,10 +4889,11 @@ rm -f conftest.err conftest.i conftest.$ac_ext
/* end confdefs.h. */
#include <ac_nonexistent.h>
_ACEOF
-if ac_fn_c_try_cpp "$LINENO"; then :
+if ac_fn_c_try_cpp "$LINENO"
+then :
# Broken: success on invalid input.
continue
-else
+else $as_nop
# Passes both tests.
ac_preproc_ok=:
break
@@ -3842,11 +4903,12 @@ rm -f conftest.err conftest.i conftest.$ac_ext
done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then :
+if $ac_preproc_ok
+then :
-else
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+else $as_nop
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi
@@ -3871,19 +4933,20 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#error "broken C++"
#endif
int
-main ()
+main (void)
{
;
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
-else
+else $as_nop
CXX=;
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -3896,15 +4959,15 @@ if test "X$CXX" = X ; then
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "Can not find C++ compiler" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can not find C++ compiler" >&5
-$as_echo "$as_me: WARNING: Can not find C++ compiler" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Can not find C++ compiler" >&5
+printf "%s\n" "$as_me: WARNING: Can not find C++ compiler" >&2;}
fi
fi
WXERL_CAN_BUILD_DRIVER=false
-{ $as_echo "$as_me:${as_lineno-$LINENO}: Building for $host_os" >&5
-$as_echo "$as_me: Building for $host_os" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: Building for $host_os" >&5
+printf "%s\n" "$as_me: Building for $host_os" >&6;}
WXERL_CAN_BUILD_DRIVER=true
@@ -3918,111 +4981,111 @@ MIXED_VSL=no
MIXED_VC=no
MIXED_MINGW=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
-$as_echo_n "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed mingw-gcc and native VC++ environment" >&5
+printf %s "checking for mixed mingw-gcc and native VC++ environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" != "xyes"; then
if test -x /usr/bin/msys-?.0.dll; then
CFLAGS="$CFLAGS -O2"
MIXED_MSYS=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
-$as_echo "MSYS and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: MSYS and VC" >&5
+printf "%s\n" "MSYS and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
MIXED_CYGWIN=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
-$as_echo "Cygwin and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Cygwin and VC" >&5
+printf "%s\n" "Cygwin and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
elif test -x /bin/wslpath; then
CFLAGS="$CFLAGS -O2"
MIXED_WSL=yes
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
-$as_echo "WSL and VC" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: WSL and VC" >&5
+printf "%s\n" "WSL and VC" >&6; }
MIXED_VC=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_VC"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not within any known env" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
if test "x$MIXED_MSYS" != "xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
-$as_echo_n "checking for mixed cygwin and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed cygwin and native MinGW environment" >&5
+printf %s "checking for mixed cygwin and native MinGW environment... " >&6; }
if test "X$host" = "Xwin32" -a "x$GCC" = x"yes"; then
if test -x /usr/bin/cygpath; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with cygwin" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
-$as_echo_n "checking for mixed MSYS and native MinGW environment... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for mixed MSYS and native MinGW environment" >&5
+printf %s "checking for mixed MSYS and native MinGW environment... " >&6; }
if test "x$GCC" = x"yes"; then
if test -x /usr/bin/msys-=.0.dll; then
CFLAGS="$CFLAGS -O2"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
MIXED_MINGW=yes
CPPFLAGS="$CPPFLAGS -DERTS_MIXED_MINGW"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
-$as_echo "undeterminable" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: undeterminable" >&5
+printf "%s\n" "undeterminable" >&6; }
as_fn_error cannot handle this! "Seems to be mixed windows but not with msys" "$LINENO" 5
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
-$as_echo_n "checking if we mix cygwin with any native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix cygwin with any native compiler" >&5
+printf %s "checking if we mix cygwin with any native compiler... " >&6; }
if test "X$MIXED_CYGWIN" = "Xyes"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
-$as_echo_n "checking if we mix msys with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix msys with another native compiler" >&5
+printf %s "checking if we mix msys with another native compiler... " >&6; }
if test "X$MIXED_MSYS" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
-$as_echo_n "checking if we mix WSL with another native compiler... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we mix WSL with another native compiler" >&5
+printf %s "checking if we mix WSL with another native compiler... " >&6; }
if test "X$MIXED_WSL" = "Xyes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
fi
@@ -4035,281 +5098,52 @@ if test X"$MIXED_VC" = X"yes" ; then
fi
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
-$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
-if ${ac_cv_path_GREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$GREP"; then
- ac_path_GREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in grep ggrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_GREP" || continue
-# Check for GNU ac_path_GREP and select it if it is found.
- # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'GREP' >> "conftest.nl"
- "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_GREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_GREP="$ac_path_GREP"
- ac_path_GREP_max=$ac_count
- fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_GREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_GREP"; then
- as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
- fi
-else
- ac_cv_path_GREP=$GREP
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
-$as_echo "$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
-$as_echo_n "checking for egrep... " >&6; }
-if ${ac_cv_path_EGREP+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
- then ac_cv_path_EGREP="$GREP -E"
- else
- if test -z "$EGREP"; then
- ac_path_EGREP_found=false
- # Loop through the user's path and test for each of PROGNAME-LIST
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+ac_header= ac_cache=
+for ac_item in $ac_header_c_list
do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_prog in egrep; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
- as_fn_executable_p "$ac_path_EGREP" || continue
-# Check for GNU ac_path_EGREP and select it if it is found.
- # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
- ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
- ac_count=0
- $as_echo_n 0123456789 >"conftest.in"
- while :
- do
- cat "conftest.in" "conftest.in" >"conftest.tmp"
- mv "conftest.tmp" "conftest.in"
- cp "conftest.in" "conftest.nl"
- $as_echo 'EGREP' >> "conftest.nl"
- "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
- diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
- as_fn_arith $ac_count + 1 && ac_count=$as_val
- if test $ac_count -gt ${ac_path_EGREP_max-0}; then
- # Best one so far, save it but keep looking for a better one
- ac_cv_path_EGREP="$ac_path_EGREP"
- ac_path_EGREP_max=$ac_count
+ if test $ac_cache; then
+ ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default"
+ if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then
+ printf "%s\n" "#define $ac_item 1" >> confdefs.h
fi
- # 10*(2^10) chars as input seems more than enough
- test $ac_count -gt 10 && break
- done
- rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
- $ac_path_EGREP_found && break 3
- done
- done
- done
-IFS=$as_save_IFS
- if test -z "$ac_cv_path_EGREP"; then
- as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+ ac_header= ac_cache=
+ elif test $ac_header; then
+ ac_cache=$ac_item
+ else
+ ac_header=$ac_item
fi
-else
- ac_cv_path_EGREP=$EGREP
-fi
-
- fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
-$as_echo "$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
-$as_echo_n "checking for ANSI C header files... " >&6; }
-if ${ac_cv_header_stdc+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_header_stdc=yes
-else
- ac_cv_header_stdc=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "memchr" >/dev/null 2>&1; then :
-
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
+done
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdlib.h>
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- $EGREP "free" >/dev/null 2>&1; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-fi
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then :
- :
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
- (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- return 2;
- return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-else
- ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
- conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-fi
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
-$as_echo "$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
+if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes
+then :
-$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h
fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do :
- as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
-ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
-"
-if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
- cat >>confdefs.h <<_ACEOF
-#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
# The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
-$as_echo_n "checking size of void *... " >&6; }
-if ${ac_cv_sizeof_void_p+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"; then :
-
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5
+printf %s "checking size of void *... " >&6; }
+if test ${ac_cv_sizeof_void_p+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" "$ac_includes_default"
+then :
+
+else $as_nop
if test "$ac_cv_type_void_p" = yes; then
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void *)
See \`config.log' for more details" "$LINENO" 5; }
else
@@ -4318,14 +5152,12 @@ See \`config.log' for more details" "$LINENO" 5; }
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
-$as_echo "$ac_cv_sizeof_void_p" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5
+printf "%s\n" "$ac_cv_sizeof_void_p" >&6; }
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_VOID_P $ac_cv_sizeof_void_p
-_ACEOF
+printf "%s\n" "#define SIZEOF_VOID_P $ac_cv_sizeof_void_p" >>confdefs.h
@@ -4334,44 +5166,46 @@ PTHR_CFLAGS="-D_THREAD_SAFE -D_REENTRANT"
OBJC_CC=$CC
OBJC_CFLAGS=""
CXXFLAGS=""
-case $host_os in
- darwin*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking wxWidgets for min version:" >&5
-$as_echo_n "checking Checking wxWidgets for min version:... " >&6; }
+case $host_os in #(
+ darwin*) :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking Checking wxWidgets for min version:" >&5
+printf %s "checking Checking wxWidgets for min version:... " >&6; }
WX_CC=`wx-config --cc`
MAC_MIN=`echo "$WX_CC" | sed 's/^[^ ]*\ *//'`
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAC_MIN" >&5
-$as_echo "$MAC_MIN" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAC_MIN" >&5
+printf "%s\n" "$MAC_MIN" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -ObjC" >&5
-$as_echo_n "checking if compiler accepts -ObjC... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -ObjC" >&5
+printf %s "checking if compiler accepts -ObjC... " >&6; }
CFLAGS="$CFLAGS -ObjC"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
accept_objc_flag=true
-else
+else $as_nop
accept_objc_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
if test "X$accept_objc_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
C_ONLY_FLAGS="-ObjC"
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a Cocoa compliant Objective C compiler" >&5
-$as_echo_n "checking for a Cocoa compliant Objective C compiler... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a Cocoa compliant Objective C compiler" >&5
+printf %s "checking for a Cocoa compliant Objective C compiler... " >&6; }
SEARCHFOR=""
SEARCHFORXX=""
save_IFS=$IFS
@@ -4400,20 +5234,20 @@ $as_echo_n "checking for a Cocoa compliant Objective C compiler... " >&6; }
done
IFS=$save_IFS
if test X$APPLE_CC = X -o X$APPLE_CXX = X; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
echo "Can not find compiler to compile Cocoa applications" >> ./CONF_INFO
WXERL_CAN_BUILD_DRIVER=false
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "Can not find compiler to compile Cocoa applications" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can not find compiler to compile Cocoa applications" >&5
-$as_echo "$as_me: WARNING: Can not find compiler to compile Cocoa applications" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Can not find compiler to compile Cocoa applications" >&5
+printf "%s\n" "$as_me: WARNING: Can not find compiler to compile Cocoa applications" >&2;}
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $APPLE_CC ($APPLE_CXX)" >&5
-$as_echo "$APPLE_CC ($APPLE_CXX)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $APPLE_CC ($APPLE_CXX)" >&5
+printf "%s\n" "$APPLE_CC ($APPLE_CXX)" >&6; }
CC=$APPLE_CC
CXX=$APPLE_CXX
#CXXFLAGS="-x c++ $CXXFLAGS"
@@ -4423,27 +5257,38 @@ $as_echo "$APPLE_CC ($APPLE_CXX)" >&6; }
fi
CFLAGS="$USER_CFLAGS $MAC_MIN -Wno-deprecated-declarations"
CPPFLAGS="$CPPFLAGS -D_MACOSX $PTHR_CFLAGS"
- ;;
- mingw32)
+ ;; #(
+ mingw32) :
+
CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0600 -D_WINDOWS -D_UNICODE -DUNICODE"
CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600"
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Reverting to 32-bit time_t" >&5
-$as_echo "$as_me: WARNING: Reverting to 32-bit time_t" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Reverting to 32-bit time_t" >&5
+printf "%s\n" "$as_me: WARNING: Reverting to 32-bit time_t" >&2;}
CPPFLAGS="$CPPFLAGS -D_USE_32BIT_TIME_T"
- ;;
- win32)
+ ;; #(
+ win32) :
+
CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0600 -D_WINDOWS -D_UNICODE -DUNICODE"
CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600"
- ;;
- *)
- CFLAGS="$CFLAGS -Wno-deprecated-declarations"
- CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE $PTHR_CFLAGS"
- ;;
+ ;; #(
+ *) :
+
+ GLIB_CFLAGS=`pkg-config --silence-errors --cflags glib-2.0`
+ GLIB_LIBS=`pkg-config --silence-errors --libs glib-2.0`
+ if test X"$GLIB_CFLAGS" != X ; then
+ HAVE_GLIB="-DHAVE_GLIB=1"
+ fi
+ CFLAGS="$CFLAGS -Wno-deprecated-declarations"
+ CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE $PTHR_CFLAGS $HAVE_GLIB"
+ ;;
esac
+
+
+
case $host_os in
darwin*)
LDFLAGS="$MAC_MIN -bundle -flat_namespace -undefined warning -fPIC $LDFLAGS"
@@ -4489,198 +5334,202 @@ case $host_os in
esac
-if test "x$GCC" = xyes -a X"$host_os" != X"win32" ; then
+if test "x$GCC" = xyes -a X"$host_os" != X"win32"
+then :
+
CXXNOOPT="-O1"
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-move-loop-invariants to CXXNOOPT (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -fno-move-loop-invariants to CXXNOOPT (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-move-loop-invariants to CXXNOOPT (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-move-loop-invariants to CXXNOOPT (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-fno-move-loop-invariants $CXXNOOPT";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CXXNOOPT="-fno-move-loop-invariants $CXXNOOPT"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-var-tracking-assignments to CXXNOOPT (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -fno-var-tracking-assignments to CXXNOOPT (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -fno-var-tracking-assignments to CXXNOOPT (via CFLAGS)" >&5
+printf %s "checking if we can add -fno-var-tracking-assignments to CXXNOOPT (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-fno-var-tracking-assignments $CXXNOOPT";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CXXNOOPT="-fno-var-tracking-assignments $CXXNOOPT"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
-if test X"$host_os" != X"win32" ; then
- for ac_header in GL/gl.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_gl_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GL_GL_H 1
-_ACEOF
+fi
-else
- for ac_header in OpenGL/gl.h
+
+if test X"$host_os" != X"win32"
+then :
+
+ for ac_header in GL/gl.h
do :
- ac_fn_c_check_header_mongrel "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default"
-if test "x$ac_cv_header_OpenGL_gl_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_OPENGL_GL_H 1
-_ACEOF
+ ac_fn_c_check_header_compile "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_gl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GL_GL_H 1" >>confdefs.h
-fi
+else $as_nop
+ ac_fn_c_check_header_compile "$LINENO" "OpenGL/gl.h" "ac_cv_header_OpenGL_gl_h" "$ac_includes_default"
+if test "x$ac_cv_header_OpenGL_gl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_OPENGL_GL_H 1" >>confdefs.h
-done
+fi
fi
done
+ if test X"$ac_cv_header_GL_gl_h" != Xyes && test X"$ac_cv_header_OpenGL_gl_h" != Xyes
+then :
- if test X"$ac_cv_header_GL_gl_h" != Xyes &&
- test X"$ac_cv_header_OpenGL_gl_h" != Xyes
- then
saved_CPPFLAGS="$CPPFLAGS"
- { $as_echo "$as_me:${as_lineno-$LINENO}: Checking for OpenGL headers in /usr/X11R6" >&5
-$as_echo "$as_me: Checking for OpenGL headers in /usr/X11R6" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking for OpenGL headers in /usr/X11R6" >&5
+printf "%s\n" "$as_me: Checking for OpenGL headers in /usr/X11R6" >&6;}
CPPFLAGS="-isystem /usr/X11R6/include $CPPFLAGS"
$as_unset ac_cv_header_GL_gl_h
- for ac_header in GL/gl.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_gl_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GL_GL_H 1
-_ACEOF
+ ac_fn_c_check_header_compile "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_gl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GL_GL_H 1" >>confdefs.h
fi
-done
+ if test X"$ac_cv_header_GL_gl_h" != Xyes
+then :
- if test X"$ac_cv_header_GL_gl_h" != Xyes ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: Checking for OpenGL headers in /usr/local" >&5
-$as_echo "$as_me: Checking for OpenGL headers in /usr/local" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking for OpenGL headers in /usr/local" >&5
+printf "%s\n" "$as_me: Checking for OpenGL headers in /usr/local" >&6;}
CPPFLAGS="-isystem /usr/local/include $saved_CPPFLAGS"
$as_unset ac_cv_header_GL_gl_h
- for ac_header in GL/gl.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_gl_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GL_GL_H 1
-_ACEOF
+ ac_fn_c_check_header_compile "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_gl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GL_GL_H 1" >>confdefs.h
fi
-done
+ if test X"$ac_cv_header_GL_gl_h" != Xyes
+then :
- if test X"$ac_cv_header_GL_gl_h" != Xyes ; then
echo "No OpenGL headers found, wx will NOT be usable" >> ./CONF_INFO
WXERL_CAN_BUILD_DRIVER=false
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "No OpenGL headers found, wx will NOT be usable" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No OpenGL headers found, wx will NOT be usable" >&5
-$as_echo "$as_me: WARNING: No OpenGL headers found, wx will NOT be usable" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: No OpenGL headers found, wx will NOT be usable" >&5
+printf "%s\n" "$as_me: WARNING: No OpenGL headers found, wx will NOT be usable" >&2;}
fi
CPPFLAGS="$saved_CPPFLAGS"
- else
+
+else $as_nop
+
GL_LIBS="-L/usr/local/lib $GL_LIBS"
- fi
- else
+
+fi
+
+else $as_nop
+
GL_LIBS="-L/usr/X11R6/lib $GL_LIBS"
- fi
- fi
-else
- for ac_header in gl/gl.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "gl/gl.h" "ac_cv_header_gl_gl_h" "#include <windows.h>
+
+fi
+
+fi
+
+else $as_nop
+
+ ac_fn_c_check_header_compile "$LINENO" "gl/gl.h" "ac_cv_header_gl_gl_h" "#include <windows.h>
"
-if test "x$ac_cv_header_gl_gl_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GL_GL_H 1
-_ACEOF
+if test "x$ac_cv_header_gl_gl_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GL_GL_H 1" >>confdefs.h
fi
-done
fi
-if test X"$host_os" != X"win32" ; then
- for ac_header in GL/glu.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default"
-if test "x$ac_cv_header_GL_glu_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GL_GLU_H 1
-_ACEOF
+if test X"$host_os" != X"win32"
+then :
-else
- for ac_header in OpenGL/glu.h
+ for ac_header in GL/glu.h
do :
- ac_fn_c_check_header_mongrel "$LINENO" "OpenGL/glu.h" "ac_cv_header_OpenGL_glu_h" "$ac_includes_default"
-if test "x$ac_cv_header_OpenGL_glu_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_OPENGL_GLU_H 1
-_ACEOF
+ ac_fn_c_check_header_compile "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default"
+if test "x$ac_cv_header_GL_glu_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GL_GLU_H 1" >>confdefs.h
-fi
+else $as_nop
+ ac_fn_c_check_header_compile "$LINENO" "OpenGL/glu.h" "ac_cv_header_OpenGL_glu_h" "$ac_includes_default"
+if test "x$ac_cv_header_OpenGL_glu_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_OPENGL_GLU_H 1" >>confdefs.h
-done
+fi
fi
done
-
if test X"$ac_cv_header_GL_glu_h" != Xyes &&
test X"$ac_cv_header_OpenGL_glu_h" != Xyes
then
@@ -4689,24 +5538,22 @@ done
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "No GLU headers found, wx will NOT be usable" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No GLU headers found, wx will NOT be usable" >&5
-$as_echo "$as_me: WARNING: No GLU headers found, wx will NOT be usable" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: No GLU headers found, wx will NOT be usable" >&5
+printf "%s\n" "$as_me: WARNING: No GLU headers found, wx will NOT be usable" >&2;}
fi
fi
-else
- for ac_header in gl/glu.h
-do :
- ac_fn_c_check_header_compile "$LINENO" "gl/glu.h" "ac_cv_header_gl_glu_h" "#include <windows.h>
+
+else $as_nop
+
+ ac_fn_c_check_header_compile "$LINENO" "gl/glu.h" "ac_cv_header_gl_glu_h" "#include <windows.h>
"
-if test "x$ac_cv_header_gl_glu_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_GL_GLU_H 1
-_ACEOF
+if test "x$ac_cv_header_gl_glu_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_GL_GLU_H 1" >>confdefs.h
fi
-done
fi
@@ -4729,18 +5576,22 @@ ERLANG_ROOT_DIR=$ERL_TOP
+if test "$cross_compiling" = "yes"
+then :
-if test "$cross_compiling" = "yes"; then
echo "Cross compilation of the wx driver is not supported yet, wx will NOT be usable" >> ./CONF_INFO
WXERL_CAN_BUILD_DRIVER=false
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "Cross compilation of the wx driver is not supported yet, wx will NOT be usable" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cross compilation of the wx driver is not supported yet, wx will NOT be usable" >&5
-$as_echo "$as_me: WARNING: Cross compilation of the wx driver is not supported yet, wx will NOT be usable" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cross compilation of the wx driver is not supported yet, wx will NOT be usable" >&5
+printf "%s\n" "$as_me: WARNING: Cross compilation of the wx driver is not supported yet, wx will NOT be usable" >&2;}
fi
-elif test X"$MIXED_VC" = X"no"; then
+
+elif test X"$MIXED_VC" = X"no"
+then :
+
@@ -4794,30 +5645,34 @@ elif test X"$MIXED_VC" = X"no"; then
# Check whether --with-wxdir was given.
-if test "${with_wxdir+set}" = set; then :
+if test ${with_wxdir+y}
+then :
withval=$with_wxdir; wx_config_name="$withval/wx-config"
wx_config_args="--inplace"
fi
# Check whether --with-wx-config was given.
-if test "${with_wx_config+set}" = set; then :
+if test ${with_wx_config+y}
+then :
withval=$with_wx_config; wx_config_name="$withval"
fi
# Check whether --with-wx-prefix was given.
-if test "${with_wx_prefix+set}" = set; then :
+if test ${with_wx_prefix+y}
+then :
withval=$with_wx_prefix; wx_config_prefix="$withval"
-else
+else $as_nop
wx_config_prefix=""
fi
# Check whether --with-wx-exec-prefix was given.
-if test "${with_wx_exec_prefix+set}" = set; then :
+if test ${with_wx_exec_prefix+y}
+then :
withval=$with_wx_exec_prefix; wx_config_exec_prefix="$withval"
-else
+else $as_nop
wx_config_exec_prefix=""
fi
@@ -4846,19 +5701,20 @@ fi
fi
if test -x "$WX_CONFIG_NAME" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
-$as_echo_n "checking for wx-config... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
+printf %s "checking for wx-config... " >&6; }
WX_CONFIG_PATH="$WX_CONFIG_NAME"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
-$as_echo "$WX_CONFIG_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+printf "%s\n" "$WX_CONFIG_PATH" >&6; }
else
# Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args.
set dummy $WX_CONFIG_NAME; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_WX_CONFIG_PATH+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_WX_CONFIG_PATH+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $WX_CONFIG_PATH in
[\\/]* | ?:[\\/]*)
ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path.
@@ -4869,11 +5725,15 @@ as_dummy=""$WX_LOOKUP_PATH:$PATH""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_WX_CONFIG_PATH="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -4886,11 +5746,11 @@ esac
fi
WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH
if test -n "$WX_CONFIG_PATH"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
-$as_echo "$WX_CONFIG_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+printf "%s\n" "$WX_CONFIG_PATH" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -4901,11 +5761,11 @@ fi
min_wx_version=$reqwx
if test -z "--unicode" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
-$as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
+printf %s "checking for wxWidgets version >= $min_wx_version... " >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version (--unicode)" >&5
-$as_echo_n "checking for wxWidgets version >= $min_wx_version (--unicode)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version (--unicode)" >&5
+printf %s "checking for wxWidgets version >= $min_wx_version (--unicode)... " >&6; }
fi
WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode"
@@ -4947,19 +5807,19 @@ $as_echo_n "checking for wxWidgets version >= $min_wx_version (--unicode)... " >
if test -n "$wx_ver_ok"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
-$as_echo "yes (version $WX_VERSION)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
+printf "%s\n" "yes (version $WX_VERSION)" >&6; }
WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs core,base,html,webview`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
-$as_echo_n "checking for wxWidgets static library... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
+printf %s "checking for wxWidgets static library... " >&6; }
WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs core,base,html,webview 2>/dev/null`
if test "x$WX_LIBS_STATIC" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
fi
wx_has_cppflags=""
@@ -5016,11 +5876,11 @@ $as_echo "yes" >&6; }
else
if test "x$WX_VERSION" = x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
-$as_echo "no (version $WX_VERSION is not new enough)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
+printf "%s\n" "no (version $WX_VERSION is not new enough)" >&6; }
fi
WX_CFLAGS=""
@@ -5053,8 +5913,8 @@ $as_echo "no (version $WX_VERSION is not new enough)" >&6; }
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "$wx_error_message" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $wx_error_message" >&5
-$as_echo "$as_me: WARNING: $wx_error_message" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $wx_error_message" >&5
+printf "%s\n" "$as_me: WARNING: $wx_error_message" >&2;}
fi
@@ -5090,8 +5950,8 @@ $as_echo "$as_me: WARNING: $wx_error_message" >&2;}
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxwidgets webview" >&5
-$as_echo_n "checking for wxwidgets webview... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxwidgets webview" >&5
+printf %s "checking for wxwidgets webview... " >&6; }
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5110,7 +5970,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
#include "wx/webview.h"
int
-main ()
+main (void)
{
wxWebView::New();
@@ -5119,12 +5979,13 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"
+then :
HAVE_WEBVIEW_SUPPORT=yes
-else
+else $as_nop
HAVE_WEBVIEW_SUPPORT=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CXXFLAGS=$saved_CXXFLAGS
@@ -5135,15 +5996,15 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_WEBVIEW_SUPPORT" >&5
-$as_echo "$HAVE_WEBVIEW_SUPPORT" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_WEBVIEW_SUPPORT" >&5
+printf "%s\n" "$HAVE_WEBVIEW_SUPPORT" >&6; }
if test X"$HAVE_WEBVIEW_SUPPORT" != X"yes" ; then
WXELIBS=stc,xrc,html,adv,xml,core,base,gl,aui
echo "wxWidgets was not compiled with --enable-webview or wxWebView developer package is not installed, wxWebView will NOT be available" >> ./CONF_INFO
else
WXELIBS=stc,xrc,html,adv,xml,core,base,gl,aui,webview
- $as_echo "#define WXE_WEBVIEW 1" >>confdefs.h
+ printf "%s\n" "#define WXE_WEBVIEW 1" >>confdefs.h
fi
@@ -5171,19 +6032,20 @@ $as_echo "$HAVE_WEBVIEW_SUPPORT" >&6; }
fi
if test -x "$WX_CONFIG_NAME" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
-$as_echo_n "checking for wx-config... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
+printf %s "checking for wx-config... " >&6; }
WX_CONFIG_PATH="$WX_CONFIG_NAME"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
-$as_echo "$WX_CONFIG_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+printf "%s\n" "$WX_CONFIG_PATH" >&6; }
else
# Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args.
set dummy $WX_CONFIG_NAME; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_WX_CONFIG_PATH+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_WX_CONFIG_PATH+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $WX_CONFIG_PATH in
[\\/]* | ?:[\\/]*)
ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path.
@@ -5194,11 +6056,15 @@ as_dummy=""$WX_LOOKUP_PATH:$PATH""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_WX_CONFIG_PATH="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5211,11 +6077,11 @@ esac
fi
WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH
if test -n "$WX_CONFIG_PATH"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
-$as_echo "$WX_CONFIG_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+printf "%s\n" "$WX_CONFIG_PATH" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5226,11 +6092,11 @@ fi
min_wx_version=$reqwx
if test -z "--unicode --debug=yes" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
-$as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
+printf %s "checking for wxWidgets version >= $min_wx_version... " >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)" >&5
-$as_echo_n "checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)" >&5
+printf %s "checking for wxWidgets version >= $min_wx_version (--unicode --debug=yes)... " >&6; }
fi
WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode --debug=yes"
@@ -5272,19 +6138,19 @@ $as_echo_n "checking for wxWidgets version >= $min_wx_version (--unicode --debug
if test -n "$wx_ver_ok"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
-$as_echo "yes (version $WX_VERSION)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
+printf "%s\n" "yes (version $WX_VERSION)" >&6; }
WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs $WXELIBS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
-$as_echo_n "checking for wxWidgets static library... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
+printf %s "checking for wxWidgets static library... " >&6; }
WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs $WXELIBS 2>/dev/null`
if test "x$WX_LIBS_STATIC" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
fi
wx_has_cppflags=""
@@ -5341,11 +6207,11 @@ $as_echo "yes" >&6; }
else
if test "x$WX_VERSION" = x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
-$as_echo "no (version $WX_VERSION is not new enough)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
+printf "%s\n" "no (version $WX_VERSION is not new enough)" >&6; }
fi
WX_CFLAGS=""
@@ -5408,14 +6274,14 @@ $as_echo "no (version $WX_VERSION is not new enough)" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for debug build of wxWidgets" >&5
-$as_echo_n "checking for debug build of wxWidgets... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for debug build of wxWidgets" >&5
+printf %s "checking for debug build of wxWidgets... " >&6; }
if test "$wxWinWithGLDBG" = 1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; };
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; };
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; };
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; };
fi
DEBUG_WX_CFLAGS=$WX_CFLAGS
@@ -5450,19 +6316,20 @@ $as_echo "no" >&6; };
fi
if test -x "$WX_CONFIG_NAME" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
-$as_echo_n "checking for wx-config... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5
+printf %s "checking for wx-config... " >&6; }
WX_CONFIG_PATH="$WX_CONFIG_NAME"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
-$as_echo "$WX_CONFIG_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+printf "%s\n" "$WX_CONFIG_PATH" >&6; }
else
# Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args.
set dummy $WX_CONFIG_NAME; ac_word=$2
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
-$as_echo_n "checking for $ac_word... " >&6; }
-if ${ac_cv_path_WX_CONFIG_PATH+:} false; then :
- $as_echo_n "(cached) " >&6
-else
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+printf %s "checking for $ac_word... " >&6; }
+if test ${ac_cv_path_WX_CONFIG_PATH+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
case $WX_CONFIG_PATH in
[\\/]* | ?:[\\/]*)
ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path.
@@ -5473,11 +6340,15 @@ as_dummy=""$WX_LOOKUP_PATH:$PATH""
for as_dir in $as_dummy
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
for ac_exec_ext in '' $ac_executable_extensions; do
- if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext"
- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+ if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then
+ ac_cv_path_WX_CONFIG_PATH="$as_dir$ac_word$ac_exec_ext"
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5
break 2
fi
done
@@ -5490,11 +6361,11 @@ esac
fi
WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH
if test -n "$WX_CONFIG_PATH"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
-$as_echo "$WX_CONFIG_PATH" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5
+printf "%s\n" "$WX_CONFIG_PATH" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
fi
@@ -5505,11 +6376,11 @@ fi
min_wx_version=$reqwx
if test -z "--unicode --debug=no" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
-$as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5
+printf %s "checking for wxWidgets version >= $min_wx_version... " >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)" >&5
-$as_echo_n "checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)" >&5
+printf %s "checking for wxWidgets version >= $min_wx_version (--unicode --debug=no)... " >&6; }
fi
WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args --unicode --debug=no"
@@ -5551,19 +6422,19 @@ $as_echo_n "checking for wxWidgets version >= $min_wx_version (--unicode --debug
if test -n "$wx_ver_ok"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
-$as_echo "yes (version $WX_VERSION)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5
+printf "%s\n" "yes (version $WX_VERSION)" >&6; }
WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs $WXELIBS`
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
-$as_echo_n "checking for wxWidgets static library... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5
+printf %s "checking for wxWidgets static library... " >&6; }
WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs $WXELIBS 2>/dev/null`
if test "x$WX_LIBS_STATIC" = "x"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
fi
wx_has_cppflags=""
@@ -5620,11 +6491,11 @@ $as_echo "yes" >&6; }
else
if test "x$WX_VERSION" = x; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
-$as_echo "no (version $WX_VERSION is not new enough)" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5
+printf "%s\n" "no (version $WX_VERSION is not new enough)" >&6; }
fi
WX_CFLAGS=""
@@ -5687,14 +6558,14 @@ $as_echo "no (version $WX_VERSION is not new enough)" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for standard build of wxWidgets" >&5
-$as_echo_n "checking for standard build of wxWidgets... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for standard build of wxWidgets" >&5
+printf %s "checking for standard build of wxWidgets... " >&6; }
if test "$wxWinWithGL" = 1; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; };
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; };
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; };
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; };
fi
if test "x$WX_LIBS_STATIC" = "x"; then
@@ -5744,7 +6615,7 @@ $as_echo "no" >&6; };
is in LD_LIBRARY_PATH or equivalent variable and
wxWidgets version is $reqwx or above." "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING:
wxWidgets must be installed on your system.
Please check that wx-config is in path, the directory
@@ -5752,7 +6623,7 @@ $as_echo "no" >&6; };
'wx-config --libs' or 'wx-config --static --libs' command)
is in LD_LIBRARY_PATH or equivalent variable and
wxWidgets version is $reqwx or above." >&5
-$as_echo "$as_me: WARNING:
+printf "%s\n" "$as_me: WARNING:
wxWidgets must be installed on your system.
Please check that wx-config is in path, the directory
@@ -5763,13 +6634,15 @@ $as_echo "$as_me: WARNING:
fi
fi
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets in standard locations" >&5
-$as_echo_n "checking for wxWidgets in standard locations... " >&6; }
+
+else $as_nop
+ #else
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxWidgets in standard locations" >&5
+printf %s "checking for wxWidgets in standard locations... " >&6; }
echo
# Check whether --with-wxdir was given.
- { $as_echo "$as_me:${as_lineno-$LINENO}: OptionCheck: $with_wxdir $with_wx_prefix" >&5
-$as_echo "$as_me: OptionCheck: $with_wxdir $with_wx_prefix" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: OptionCheck: $with_wxdir $with_wx_prefix" >&5
+printf "%s\n" "$as_me: OptionCheck: $with_wxdir $with_wx_prefix" >&6;}
if test "${with_wxdir+set}" = set; then :
withval=$with_wxdir; CWXWIN0=$withval
@@ -5822,8 +6695,8 @@ $as_echo "$as_me: OptionCheck: $with_wxdir $with_wx_prefix" >&6;}
CWXPATH="$CWXWIN0 $CWXWIN1 $CWXWIN2 $CWX_DOCUMENTED $CWXWIN3 $CWXWIN4"
for dir in $CWXPATH; do
- { $as_echo "$as_me:${as_lineno-$LINENO}: Checking: $dir" >&5
-$as_echo "$as_me: Checking: $dir" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Checking: $dir" >&5
+printf "%s\n" "$as_me: Checking: $dir" >&6;}
if test -f $dir/include/wx/wx.h; then
WXINCLUDE_MSVC=$dir/include/msvc
WXINCLUDE_PLAIN=$dir/include
@@ -5846,37 +6719,37 @@ $as_echo "$as_me: Checking: $dir" >&6;}
WX_LIBS_STATIC="$WX_LIBS_STATIC -l$lib"
done
WXDIR=$dir
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: Found: $dir" >&5
-$as_echo "Found: $dir" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Found: $dir" >&5
+printf "%s\n" "Found: $dir" >&6; }
break
fi
fi
done
if test -z "$WX_LIBS_STATIC"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
-$as_echo "failed" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+printf "%s\n" "failed" >&6; }
echo "Cannot find core lib version for wxWidgets" >> ./CONF_INFO
WXERL_CAN_BUILD_DRIVER=false
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "Cannot find core lib version for wxWidgets" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find core lib version for wxWidgets" >&5
-$as_echo "$as_me: WARNING: Cannot find core lib version for wxWidgets" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find core lib version for wxWidgets" >&5
+printf "%s\n" "$as_me: WARNING: Cannot find core lib version for wxWidgets" >&2;}
fi
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for edge webview loader" >&5
-$as_echo_n "checking for edge webview loader... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for edge webview loader" >&5
+printf %s "checking for edge webview loader... " >&6; }
WEBVIEW_DLL=$WXDIR/3rdparty/webview2/build/native/$WX_ARCH/WebView2Loader.dll
if test -f "$WEBVIEW_DLL"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WEBVIEW_DLL" >&5
-$as_echo "$WEBVIEW_DLL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $WEBVIEW_DLL" >&5
+printf "%s\n" "$WEBVIEW_DLL" >&6; }
WX_WEBVIEW_DLL=$WEBVIEW_DLL
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found in $WEBVIEW_DLL" >&5
-$as_echo "not found in $WEBVIEW_DLL" >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found in $WEBVIEW_DLL" >&5
+printf "%s\n" "not found in $WEBVIEW_DLL" >&6; }
WX_WEBVIEW_DLL=
fi
@@ -5887,17 +6760,20 @@ $as_echo "not found in $WEBVIEW_DLL" >&6; }
- $as_echo "#define WXE_WEBVIEW 1" >>confdefs.h
+ printf "%s\n" "#define WXE_WEBVIEW 1" >>confdefs.h
+
fi
-if test "$WXERL_CAN_BUILD_DRIVER" != "false"; then
+if test "$WXERL_CAN_BUILD_DRIVER" != "false"
+then :
+
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxwidgets 3.0 compatibility " >&5
-$as_echo_n "checking for wxwidgets 3.0 compatibility ... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxwidgets 3.0 compatibility " >&5
+printf %s "checking for wxwidgets 3.0 compatibility ... " >&6; }
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5916,7 +6792,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#include "wx/wx.h"
int
-main ()
+main (void)
{
#if wxMAJOR_VERSION > 2 && (wxMINOR_VERSION == 0 || WXWIN_COMPATIBILITY_3_0 == 1)
@@ -5929,12 +6805,13 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
HAVE_COMPAT30_SUPPORT=yes
-else
+else $as_nop
HAVE_COMPAT30_SUPPORT=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CXXFLAGS=$saved_CXXFLAGS
ac_ext=c
@@ -5943,8 +6820,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_COMPAT30_SUPPORT" >&5
-$as_echo "$HAVE_COMPAT30_SUPPORT" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_COMPAT30_SUPPORT" >&5
+printf "%s\n" "$HAVE_COMPAT30_SUPPORT" >&6; }
if test X"$HAVE_COMPAT30_SUPPORT" != X"yes" ; then
echo "wxWidgets was not compiled with --enable-compat30, wx will NOT be useable" >> ./CONF_INFO
@@ -5952,14 +6829,14 @@ if test X"$HAVE_COMPAT30_SUPPORT" != X"yes" ; then
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "wxWidgets was not compiled with --enable-compat30, wx will NOT be useable" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: wxWidgets was not compiled with --enable-compat30, wx will NOT be useable" >&5
-$as_echo "$as_me: WARNING: wxWidgets was not compiled with --enable-compat30, wx will NOT be useable" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: wxWidgets was not compiled with --enable-compat30, wx will NOT be useable" >&5
+printf "%s\n" "$as_me: WARNING: wxWidgets was not compiled with --enable-compat30, wx will NOT be useable" >&2;}
fi
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxwidgets opengl support" >&5
-$as_echo_n "checking for wxwidgets opengl support... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for wxwidgets opengl support" >&5
+printf %s "checking for wxwidgets opengl support... " >&6; }
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -5978,7 +6855,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
#include "wx/wx.h"
int
-main ()
+main (void)
{
#if wxUSE_GLCANVAS
@@ -5991,15 +6868,16 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
HAVE_GL_SUPPORT=yes
-$as_echo "#define HAVE_GL_SUPPORT 1" >>confdefs.h
+printf "%s\n" "#define HAVE_GL_SUPPORT 1" >>confdefs.h
-else
+else $as_nop
HAVE_GL_SUPPORT=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CXXFLAGS=$saved_CXXFLAGS
ac_ext=c
@@ -6008,8 +6886,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_GL_SUPPORT" >&5
-$as_echo "$HAVE_GL_SUPPORT" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $HAVE_GL_SUPPORT" >&5
+printf "%s\n" "$HAVE_GL_SUPPORT" >&6; }
if test X"$HAVE_GL_SUPPORT" != X"yes" ; then
@@ -6018,8 +6896,8 @@ if test X"$HAVE_GL_SUPPORT" != X"yes" ; then
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "wxWidgets don't have gl support, wx will NOT be useable" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: wxWidgets don't have gl support, wx will NOT be useable" >&5
-$as_echo "$as_me: WARNING: wxWidgets don't have gl support, wx will NOT be useable" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: wxWidgets don't have gl support, wx will NOT be useable" >&5
+printf "%s\n" "$as_me: WARNING: wxWidgets don't have gl support, wx will NOT be useable" >&2;}
fi
fi
@@ -6035,11 +6913,10 @@ ac_fn_c_check_type "$LINENO" "GLintptr" "ac_cv_type_GLintptr" "#ifdef WIN32
#endif
"
-if test "x$ac_cv_type_GLintptr" = xyes; then :
+if test "x$ac_cv_type_GLintptr" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GLINTPTR 1
-_ACEOF
+printf "%s\n" "#define HAVE_GLINTPTR 1" >>confdefs.h
fi
@@ -6053,11 +6930,10 @@ ac_fn_c_check_type "$LINENO" "GLintptrARB" "ac_cv_type_GLintptrARB" "#ifdef WIN3
#endif
"
-if test "x$ac_cv_type_GLintptrARB" = xyes; then :
+if test "x$ac_cv_type_GLintptrARB" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GLINTPTRARB 1
-_ACEOF
+printf "%s\n" "#define HAVE_GLINTPTRARB 1" >>confdefs.h
fi
@@ -6071,11 +6947,10 @@ ac_fn_c_check_type "$LINENO" "GLchar" "ac_cv_type_GLchar" "#ifdef WIN32
#endif
"
-if test "x$ac_cv_type_GLchar" = xyes; then :
+if test "x$ac_cv_type_GLchar" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GLCHAR 1
-_ACEOF
+printf "%s\n" "#define HAVE_GLCHAR 1" >>confdefs.h
fi
@@ -6089,11 +6964,10 @@ ac_fn_c_check_type "$LINENO" "GLcharARB" "ac_cv_type_GLcharARB" "#ifdef WIN32
#endif
"
-if test "x$ac_cv_type_GLcharARB" = xyes; then :
+if test "x$ac_cv_type_GLcharARB" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GLCHARARB 1
-_ACEOF
+printf "%s\n" "#define HAVE_GLCHARARB 1" >>confdefs.h
fi
@@ -6107,11 +6981,10 @@ ac_fn_c_check_type "$LINENO" "GLhalfARB" "ac_cv_type_GLhalfARB" "#ifdef WIN32
#endif
"
-if test "x$ac_cv_type_GLhalfARB" = xyes; then :
+if test "x$ac_cv_type_GLhalfARB" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GLHALFARB 1
-_ACEOF
+printf "%s\n" "#define HAVE_GLHALFARB 1" >>confdefs.h
fi
@@ -6125,18 +6998,17 @@ ac_fn_c_check_type "$LINENO" "GLint64EXT" "ac_cv_type_GLint64EXT" "#ifdef WIN32
#endif
"
-if test "x$ac_cv_type_GLint64EXT" = xyes; then :
+if test "x$ac_cv_type_GLint64EXT" = xyes
+then :
-cat >>confdefs.h <<_ACEOF
-#define HAVE_GLINT64EXT 1
-_ACEOF
+printf "%s\n" "#define HAVE_GLINT64EXT 1" >>confdefs.h
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking GLU Callbacks uses Tiger Style" >&5
-$as_echo_n "checking GLU Callbacks uses Tiger Style... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking GLU Callbacks uses Tiger Style" >&5
+printf %s "checking GLU Callbacks uses Tiger Style... " >&6; }
ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -6163,7 +7035,7 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
void CALLBACK foo() {};
int
-main ()
+main (void)
{
GLUtesselator* tess;
@@ -6173,40 +7045,40 @@ main ()
return 0;
}
_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
+if ac_fn_cxx_try_compile "$LINENO"
+then :
TESS_CB_TIGER_STYLE=yes
-$as_echo "#define TESS_CB_TIGER_STYLE 1" >>confdefs.h
+printf "%s\n" "#define TESS_CB_TIGER_STYLE 1" >>confdefs.h
-else
+else $as_nop
TESS_CB_TIGER_STYLE=no
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $TESS_CB_TIGER_STYLE" >&5
-$as_echo "$TESS_CB_TIGER_STYLE" >&6; }
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $TESS_CB_TIGER_STYLE" >&5
+printf "%s\n" "$TESS_CB_TIGER_STYLE" >&6; }
-for ac_header in wx/stc/stc.h
+ for ac_header in wx/stc/stc.h
do :
ac_fn_cxx_check_header_compile "$LINENO" "wx/stc/stc.h" "ac_cv_header_wx_stc_stc_h" "#ifdef WIN32
# include <windows.h>
#endif
#include \"wx/wx.h\"
"
-if test "x$ac_cv_header_wx_stc_stc_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE_WX_STC_STC_H 1
-_ACEOF
+if test "x$ac_cv_header_wx_stc_stc_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_WX_STC_STC_H 1" >>confdefs.h
-else
+else $as_nop
echo "Can not find wx/stc/stc.h $CXXFLAGS" >> ./CONF_INFO
WXERL_CAN_BUILD_DRIVER=false
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "Can not find wx/stc/stc.h $CXXFLAGS" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can not find wx/stc/stc.h $CXXFLAGS" >&5
-$as_echo "$as_me: WARNING: Can not find wx/stc/stc.h $CXXFLAGS" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Can not find wx/stc/stc.h $CXXFLAGS" >&5
+printf "%s\n" "$as_me: WARNING: Can not find wx/stc/stc.h $CXXFLAGS" >&2;}
fi
@@ -6215,9 +7087,8 @@ fi
done
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can link wxwidgets programs" >&5
-$as_echo_n "checking if we can link wxwidgets programs... " >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can link wxwidgets programs" >&5
+printf %s "checking if we can link wxwidgets programs... " >&6; }
saved_LIBS=$LIBS
if test X"$WX_HAVE_STATIC_LIBS" = X"true" ; then
@@ -6247,16 +7118,17 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
IMPLEMENT_APP(MyApp)
_ACEOF
-if ac_fn_cxx_try_link "$LINENO"; then :
+if ac_fn_cxx_try_link "$LINENO"
+then :
CAN_LINK_WX=yes
-else
+else $as_nop
CAN_LINK_WX=no
fi
-rm -f core conftest.err conftest.$ac_objext \
+rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CXXFLAGS=$saved_CXXFLAGS
@@ -6267,8 +7139,8 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAN_LINK_WX" >&5
-$as_echo "$CAN_LINK_WX" >&6; }
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CAN_LINK_WX" >&5
+printf "%s\n" "$CAN_LINK_WX" >&6; }
if test X"$CAN_LINK_WX" != X"yes" ; then
echo "Can not link wx program are all developer packages installed?" >> ./CONF_INFO
@@ -6276,87 +7148,104 @@ if test X"$CAN_LINK_WX" != X"yes" ; then
if test X"$with_wx" = X"yes" ; then
as_fn_error $? "Can not link wx program are all developer packages installed?" "$LINENO" 5
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Can not link wx program are all developer packages installed?" >&5
-$as_echo "$as_me: WARNING: Can not link wx program are all developer packages installed?" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Can not link wx program are all developer packages installed?" >&5
+printf "%s\n" "$as_me: WARNING: Can not link wx program are all developer packages installed?" >&2;}
fi
fi
+
fi
-if test "x$GCC" = xyes; then
+if test "x$GCC" = xyes
+then :
+
# Treat certain GCC warnings as errors
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to CFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $CFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CFLAGS="-Werror=return-type $CFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CXXFLAGS (via CFLAGS)" >&5
-$as_echo_n "checking if we can add -Werror=return-type to CXXFLAGS (via CFLAGS)... " >&6; }
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can add -Werror=return-type to CXXFLAGS (via CFLAGS)" >&5
+printf %s "checking if we can add -Werror=return-type to CXXFLAGS (via CFLAGS)... " >&6; }
saved_CFLAGS=$CFLAGS;
CFLAGS="-Werror=return-type $CXXFLAGS";
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int
-main ()
+main (void)
{
return 0;
;
return 0;
}
_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
+if ac_fn_c_try_compile "$LINENO"
+then :
can_enable_flag=true
-else
+else $as_nop
can_enable_flag=false
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
CFLAGS=$saved_CFLAGS;
- if test "X$can_enable_flag" = "Xtrue"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ if test "X$can_enable_flag" = "Xtrue"
+then :
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+printf "%s\n" "yes" >&6; }
CXXFLAGS="-Werror=return-type $CXXFLAGS"
- else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- fi
+
+else $as_nop
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5
+printf "%s\n" "no" >&6; }
+
+fi
+
fi
# Check whether --enable-sanitizers was given.
-if test "${enable_sanitizers+set}" = set; then :
+if test ${enable_sanitizers+y}
+then :
enableval=$enable_sanitizers;
case "$enableval" in
no) sanitizers= ;;
@@ -6386,12 +7275,7 @@ esac
-
-if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then
- WXERL_SYS_TYPE=`erl -noshell -eval 'io:format("~s~n",[erlang:system_info(system_architecture)])' -s erlang halt`
-else
- WXERL_SYS_TYPE=$TARGET
-fi
+WXERL_SYS_TYPE=$TARGET
@@ -6429,8 +7313,8 @@ _ACEOF
case $ac_val in #(
*${as_nl}*)
case $ac_var in #(
- *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
-$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+ *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
esac
case $ac_var in #(
_ | IFS | as_nl) ;; #(
@@ -6460,15 +7344,15 @@ $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
/^ac_cv_env_/b end
t clear
:clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/
t end
s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
:end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
if test -w "$cache_file"; then
if test "x$cache_file" != "x/dev/null"; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
-$as_echo "$as_me: updating cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+printf "%s\n" "$as_me: updating cache $cache_file" >&6;}
if test ! -f "$cache_file" || test -h "$cache_file"; then
cat confcache >"$cache_file"
else
@@ -6482,8 +7366,8 @@ $as_echo "$as_me: updating cache $cache_file" >&6;}
fi
fi
else
- { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
-$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;}
fi
fi
rm -f confcache
@@ -6536,7 +7420,7 @@ U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
# 1. Remove the extension, and $U if already installed.
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
- ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+ ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"`
# 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR
# will be set to the directory where LIBOBJS objects are built.
as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -6552,8 +7436,8 @@ LTLIBOBJS=$ac_ltlibobjs
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
-$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
@@ -6576,14 +7460,16 @@ cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+as_nop=:
+if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1
+then :
emulate sh
NULLCMD=:
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
# is contrary to our usage. Disable this feature.
alias -g '${1+"$@"}'='"$@"'
setopt NO_GLOB_SUBST
-else
+else $as_nop
case `(set -o) 2>/dev/null` in #(
*posix*) :
set -o posix ;; #(
@@ -6593,46 +7479,46 @@ esac
fi
+
+# Reset variables that may have inherited troublesome values from
+# the environment.
+
+# IFS needs to be set, to space, tab, and newline, in precisely that order.
+# (If _AS_PATH_WALK were called with IFS unset, it would have the
+# side effect of setting IFS to empty, thus disabling word splitting.)
+# Quoting is to prevent editors from complaining about space-tab.
as_nl='
'
export as_nl
-# Printing a long string crashes Solaris 7 /usr/bin/printf.
-as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
-as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
-# Prefer a ksh shell builtin over an external printf program on Solaris,
-# but without wasting forks for bash or zsh.
-if test -z "$BASH_VERSION$ZSH_VERSION" \
- && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='print -r --'
- as_echo_n='print -rn --'
-elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
- as_echo='printf %s\n'
- as_echo_n='printf %s'
-else
- if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
- as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
- as_echo_n='/usr/ucb/echo -n'
- else
- as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
- as_echo_n_body='eval
- arg=$1;
- case $arg in #(
- *"$as_nl"*)
- expr "X$arg" : "X\\(.*\\)$as_nl";
- arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
- esac;
- expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
- '
- export as_echo_n_body
- as_echo_n='sh -c $as_echo_n_body as_echo'
- fi
- export as_echo_body
- as_echo='sh -c $as_echo_body as_echo'
-fi
+IFS=" "" $as_nl"
+
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# Ensure predictable behavior from utilities with locale-dependent output.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# We cannot yet rely on "unset" to work, but we need these variables
+# to be unset--not just set to an empty or harmless value--now, to
+# avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct
+# also avoids known problems related to "unset" and subshell syntax
+# in other old shells (e.g. bash 2.01 and pdksh 5.2.14).
+for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH
+do eval test \${$as_var+y} \
+ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+
+# Ensure that fds 0, 1, and 2 are open.
+if (exec 3>&0) 2>/dev/null; then :; else exec 0</dev/null; fi
+if (exec 3>&1) 2>/dev/null; then :; else exec 1>/dev/null; fi
+if (exec 3>&2) ; then :; else exec 2>/dev/null; fi
# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
+if ${PATH_SEPARATOR+false} :; then
PATH_SEPARATOR=:
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
@@ -6641,13 +7527,6 @@ if test "${PATH_SEPARATOR+set}" != set; then
fi
-# IFS
-# We need space, tab and new line, in precisely that order. Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-IFS=" "" $as_nl"
-
# Find who we are. Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
@@ -6656,8 +7535,12 @@ case $0 in #((
for as_dir in $PATH
do
IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+ case $as_dir in #(((
+ '') as_dir=./ ;;
+ */) ;;
+ *) as_dir=$as_dir/ ;;
+ esac
+ test -r "$as_dir$0" && as_myself=$as_dir$0 && break
done
IFS=$as_save_IFS
@@ -6669,30 +7552,10 @@ if test "x$as_myself" = x; then
as_myself=$0
fi
if test ! -f "$as_myself"; then
- $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+ printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
exit 1
fi
-# Unset variables that we do not need and which cause bugs (e.g. in
-# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
-# suppresses any "Segmentation fault" message there. '((' could
-# trigger a bug in pdksh 5.2.14.
-for as_var in BASH_ENV ENV MAIL MAILPATH
-do eval test x\${$as_var+set} = xset \
- && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-LC_ALL=C
-export LC_ALL
-LANGUAGE=C
-export LANGUAGE
-
-# CDPATH.
-(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
# as_fn_error STATUS ERROR [LINENO LOG_FD]
@@ -6705,13 +7568,14 @@ as_fn_error ()
as_status=$1; test $as_status -eq 0 && as_status=1
if test "$4"; then
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+ printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
fi
- $as_echo "$as_me: error: $2" >&2
+ printf "%s\n" "$as_me: error: $2" >&2
as_fn_exit $as_status
} # as_fn_error
+
# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
@@ -6738,18 +7602,20 @@ as_fn_unset ()
{ eval $1=; unset $1;}
}
as_unset=as_fn_unset
+
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
-if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null
+then :
eval 'as_fn_append ()
{
eval $1+=\$2
}'
-else
+else $as_nop
as_fn_append ()
{
eval $1=\$$1\$2
@@ -6761,12 +7627,13 @@ fi # as_fn_append
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
-if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null
+then :
eval 'as_fn_arith ()
{
as_val=$(( $* ))
}'
-else
+else $as_nop
as_fn_arith ()
{
as_val=`expr "$@" || test $? -eq 1`
@@ -6797,7 +7664,7 @@ as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
X"$0" : 'X\(//\)$' \| \
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X/"$0" |
+printf "%s\n" X/"$0" |
sed '/^.*\/\([^/][^/]*\)\/*$/{
s//\1/
q
@@ -6819,6 +7686,10 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Determine whether it's possible to make 'echo' print without a newline.
+# These variables are no longer used directly by Autoconf, but are AC_SUBSTed
+# for compatibility with existing Makefiles.
ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
@@ -6832,6 +7703,12 @@ case `echo -n x` in #(((((
ECHO_N='-n';;
esac
+# For backward compatibility with old third-party macros, we provide
+# the shell variables $as_echo and $as_echo_n. New code should use
+# AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively.
+as_echo='printf %s\n'
+as_echo_n='printf %s'
+
rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
rm -f conf$$.dir/conf$$.file
@@ -6873,7 +7750,7 @@ as_fn_mkdir_p ()
as_dirs=
while :; do
case $as_dir in #(
- *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+ *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
*) as_qdir=$as_dir;;
esac
as_dirs="'$as_qdir' $as_dirs"
@@ -6882,7 +7759,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$as_dir" : 'X\(//\)[^/]' \| \
X"$as_dir" : 'X\(//\)$' \| \
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$as_dir" |
+printf "%s\n" X"$as_dir" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -6945,7 +7822,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# values after options handling.
ac_log="
This file was extended by $as_me, which was
-generated by GNU Autoconf 2.69. Invocation command line was
+generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
@@ -6994,14 +7871,16 @@ $config_files
Report bugs to the package provider."
_ACEOF
+ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"`
+ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"`
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
-ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
config.status
-configured by $0, generated by GNU Autoconf 2.69,
+configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
-Copyright (C) 2012 Free Software Foundation, Inc.
+Copyright (C) 2021 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."
@@ -7038,21 +7917,21 @@ do
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
ac_cs_recheck=: ;;
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
- $as_echo "$ac_cs_version"; exit ;;
+ printf "%s\n" "$ac_cs_version"; exit ;;
--config | --confi | --conf | --con | --co | --c )
- $as_echo "$ac_cs_config"; exit ;;
+ printf "%s\n" "$ac_cs_config"; exit ;;
--debug | --debu | --deb | --de | --d | -d )
debug=: ;;
--file | --fil | --fi | --f )
$ac_shift
case $ac_optarg in
- *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
'') as_fn_error $? "missing file argument" ;;
esac
as_fn_append CONFIG_FILES " '$ac_optarg'"
ac_need_defaults=false;;
--he | --h | --help | --hel | -h )
- $as_echo "$ac_cs_usage"; exit ;;
+ printf "%s\n" "$ac_cs_usage"; exit ;;
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
| -silent | --silent | --silen | --sile | --sil | --si | --s)
ac_cs_silent=: ;;
@@ -7080,7 +7959,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
shift
- \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+ \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6
CONFIG_SHELL='$SHELL'
export CONFIG_SHELL
exec "\$@"
@@ -7094,7 +7973,7 @@ exec 5>>config.log
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
- $as_echo "$ac_log"
+ printf "%s\n" "$ac_log"
} >&5
_ACEOF
@@ -7120,7 +7999,7 @@ done
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files
fi
# Have a temporary directory for convenience. Make it in the build tree
@@ -7348,7 +8227,7 @@ do
esac ||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
esac
- case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+ case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
as_fn_append ac_file_inputs " '$ac_f'"
done
@@ -7356,17 +8235,17 @@ do
# use $as_me), people would be surprised to read:
# /* config.h. Generated by config.status. */
configure_input='Generated from '`
- $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+ printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
`' by configure.'
if test x"$ac_file" != x-; then
configure_input="$ac_file. $configure_input"
- { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
-$as_echo "$as_me: creating $ac_file" >&6;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+printf "%s\n" "$as_me: creating $ac_file" >&6;}
fi
# Neutralize special characters interpreted by sed in replacement strings.
case $configure_input in #(
*\&* | *\|* | *\\* )
- ac_sed_conf_input=`$as_echo "$configure_input" |
+ ac_sed_conf_input=`printf "%s\n" "$configure_input" |
sed 's/[\\\\&|]/\\\\&/g'`;; #(
*) ac_sed_conf_input=$configure_input;;
esac
@@ -7383,7 +8262,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
X"$ac_file" : 'X\(//\)[^/]' \| \
X"$ac_file" : 'X\(//\)$' \| \
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-$as_echo X"$ac_file" |
+printf "%s\n" X"$ac_file" |
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
s//\1/
q
@@ -7407,9 +8286,9 @@ $as_echo X"$ac_file" |
case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
- ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+ ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'`
# A ".." for each directory in $ac_dir_suffix.
- ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+ ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
case $ac_top_builddir_sub in
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -7462,8 +8341,8 @@ ac_sed_dataroot='
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_datarootdir_hack='
@@ -7505,9 +8384,9 @@ test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
"$ac_tmp/out"`; test -z "$ac_out"; } &&
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&5
-$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined. Please make sure it is defined" >&2;}
rm -f "$ac_tmp/stdin"
@@ -7554,8 +8433,8 @@ if test "$no_create" != yes; then
$ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
-$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi
@@ -7566,3 +8445,4 @@ fi
+
diff --git a/lib/wx/configure.in b/lib/wx/configure.ac
index 91b08c29e3..e174fccfff 100644
--- a/lib/wx/configure.in
+++ b/lib/wx/configure.ac
@@ -2,7 +2,7 @@ dnl Process this file with autoconf to produce a configure script. -*-m4-*-
dnl %CopyrightBegin%
dnl
-dnl Copyright Ericsson AB 2008-2021. All Rights Reserved.
+dnl Copyright Ericsson AB 2008-2022. All Rights Reserved.
dnl
dnl Licensed under the Apache License, Version 2.0 (the "License");
dnl you may not use this file except in compliance with the License.
@@ -18,11 +18,13 @@ dnl limitations under the License.
dnl
dnl %CopyrightEnd%
-AC_INIT()
+AC_INIT
-AC_CONFIG_AUX_DIRS($srcdir/autoconf)
+m4_include([otp.m4])
-AC_PREREQ(2.59)
+AC_CONFIG_AUX_DIR([${ERL_TOP}/make/autoconf])
+
+AC_PREREQ([2.71])
## Delete previous failed configure results
if test -f ./CONF_INFO; then
@@ -39,25 +41,12 @@ AC_DEFUN([WX_MSG_ERROR],
fi
])
-
-if test -z "$ERL_TOP" || test ! -d $ERL_TOP ; then
- AC_MSG_ERROR([ERL_TOP is not set])
-else
- erl_top=${ERL_TOP}
- AC_CONFIG_AUX_DIRS($erl_top/erts/autoconf)
- WX_BUILDING_INSIDE_ERLSRC=true
-fi
-
AC_ARG_WITH(wx,
[ --with-wxdir=PATH specify location of wxWidgets include and lib
--with-wx use wxWidgets (default)
--without-wx don't use wxWidgets])
-if test "X$host" != "Xfree_source" -a "X$host" != "Xwin32"; then
- AC_CANONICAL_HOST
-else
- host_os=win32
-fi
+ERL_CANONICAL_SYSTEM_TYPE
case $host_os in
mingw32)
@@ -108,8 +97,10 @@ OBJC_CC=$CC
OBJC_CFLAGS=""
CXXFLAGS=""
dnl NOTE: CPPFLAGS will be included in CFLAGS at the end
-case $host_os in
- darwin*)
+AS_CASE([$host_os],
+
+ [darwin*],
+ [
AC_MSG_CHECKING([Checking wxWidgets for min version:])
WX_CC=`wx-config --cc`
MAC_MIN=`echo "$WX_CC" | sed 's/^[[^ ]]*\ *//'`
@@ -117,7 +108,7 @@ case $host_os in
AC_MSG_CHECKING([if compiler accepts -ObjC])
CFLAGS="$CFLAGS -ObjC"
- AC_TRY_COMPILE([],[;], accept_objc_flag=true, accept_objc_flag=false)
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[;]])],[accept_objc_flag=true],[accept_objc_flag=false])
if test "X$accept_objc_flag" = "Xtrue"; then
AC_MSG_RESULT([yes])
C_ONLY_FLAGS="-ObjC"
@@ -177,22 +168,34 @@ case $host_os in
fi
CFLAGS="$USER_CFLAGS $MAC_MIN -Wno-deprecated-declarations"
CPPFLAGS="$CPPFLAGS -D_MACOSX $PTHR_CFLAGS"
- ;;
- mingw32)
+ ],
+
+ [mingw32],
+ [
CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0600 -D_WINDOWS -D_UNICODE -DUNICODE"
CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600"
AC_MSG_WARN([Reverting to 32-bit time_t])
CPPFLAGS="$CPPFLAGS -D_USE_32BIT_TIME_T"
- ;;
- win32)
+ ],
+
+ [win32],
+ [
CFLAGS="$CFLAGS -DWIN32 -DWINVER=0x0600 -D_WINDOWS -D_UNICODE -DUNICODE"
CPPFLAGS="$CPPFLAGS -D_WIN32_WINNT=0x0600"
- ;;
- *)
- CFLAGS="$CFLAGS -Wno-deprecated-declarations"
- CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE $PTHR_CFLAGS"
- ;;
-esac
+ ],
+
+ [
+ GLIB_CFLAGS=`pkg-config --silence-errors --cflags glib-2.0`
+ GLIB_LIBS=`pkg-config --silence-errors --libs glib-2.0`
+ if test X"$GLIB_CFLAGS" != X ; then
+ HAVE_GLIB="-DHAVE_GLIB=1"
+ fi
+ CFLAGS="$CFLAGS -Wno-deprecated-declarations"
+ CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE $PTHR_CFLAGS $HAVE_GLIB"
+ ])
+
+AC_SUBST(GLIB_CFLAGS)
+AC_SUBST(GLIB_LIBS)
AC_SUBST(OBJC_CC)
AC_SUBST(OBJC_CFLAGS)
@@ -249,47 +252,54 @@ dnl Use -O1 -fno-move-loop-invariants for wxe_funcs.cpp to reduce
dnl compilation time
dnl
-if test "x$GCC" = xyes -a X"$host_os" != X"win32" ; then
+AS_IF([test "x$GCC" = xyes -a X"$host_os" != X"win32"],
+ [
CXXNOOPT="-O1"
LM_TRY_ENABLE_CFLAG([-fno-move-loop-invariants], [CXXNOOPT])
LM_TRY_ENABLE_CFLAG([-fno-var-tracking-assignments], [CXXNOOPT])
-fi
+ ])
dnl
dnl Opengl tests
dnl
-if test X"$host_os" != X"win32" ; then
+AS_IF([test X"$host_os" != X"win32"],
+ [
AC_CHECK_HEADERS([GL/gl.h], [],
[AC_CHECK_HEADERS([OpenGL/gl.h])])
- if test X"$ac_cv_header_GL_gl_h" != Xyes &&
- test X"$ac_cv_header_OpenGL_gl_h" != Xyes
- then
+ AS_IF([test X"$ac_cv_header_GL_gl_h" != Xyes && test X"$ac_cv_header_OpenGL_gl_h" != Xyes],
+ [
saved_CPPFLAGS="$CPPFLAGS"
AC_MSG_NOTICE(Checking for OpenGL headers in /usr/X11R6)
CPPFLAGS="-isystem /usr/X11R6/include $CPPFLAGS"
$as_unset ac_cv_header_GL_gl_h
AC_CHECK_HEADERS([GL/gl.h])
- if test X"$ac_cv_header_GL_gl_h" != Xyes ; then
+ AS_IF([test X"$ac_cv_header_GL_gl_h" != Xyes],
+ [
AC_MSG_NOTICE(Checking for OpenGL headers in /usr/local)
CPPFLAGS="-isystem /usr/local/include $saved_CPPFLAGS"
$as_unset ac_cv_header_GL_gl_h
AC_CHECK_HEADERS([GL/gl.h])
- if test X"$ac_cv_header_GL_gl_h" != Xyes ; then
+ AS_IF([test X"$ac_cv_header_GL_gl_h" != Xyes],
+ [
WX_MSG_ERROR([No OpenGL headers found, wx will NOT be usable])
CPPFLAGS="$saved_CPPFLAGS"
- else
+ ],
+ [
GL_LIBS="-L/usr/local/lib $GL_LIBS"
- fi
- else
+ ])
+ ],
+ [
GL_LIBS="-L/usr/X11R6/lib $GL_LIBS"
- fi
- fi
-else
+ ])
+ ])
+ ],
+ [
AC_CHECK_HEADERS([gl/gl.h],[],[],[#include <windows.h>])
-fi
+ ])
-if test X"$host_os" != X"win32" ; then
+AS_IF([test X"$host_os" != X"win32"],
+ [
AC_CHECK_HEADERS([GL/glu.h], [],
[AC_CHECK_HEADERS([OpenGL/glu.h])])
if test X"$ac_cv_header_GL_glu_h" != Xyes &&
@@ -297,9 +307,10 @@ if test X"$host_os" != X"win32" ; then
then
WX_MSG_ERROR([No GLU headers found, wx will NOT be usable])
fi
-else
+ ],
+ [
AC_CHECK_HEADERS([gl/glu.h],[],[],[#include <windows.h>])
-fi
+ ])
AC_SUBST(GL_LIBS)
@@ -318,15 +329,19 @@ ERL=erl
ERLANG_ROOT_DIR=$ERL_TOP
AC_SUBST(ERLC)
-AC_SUBST(WX_BUILDING_INSIDE_ERLSRC)
AC_SUBST(ERLANG_ROOT_DIR)
dnl
dnl Check for wxwidgets
dnl
-if test "$cross_compiling" = "yes"; then
+AS_IF(
+ [test "$cross_compiling" = "yes"],
+ [
WX_MSG_ERROR([Cross compilation of the wx driver is not supported yet, wx will NOT be usable])
-elif test X"$MIXED_VC" = X"no"; then
+ ],
+
+ [test X"$MIXED_VC" = X"no"],
+ [
m4_include(wxwin-nothrow.m4)
AM_OPTIONS_WXCONFIG
@@ -426,7 +441,9 @@ elif test X"$MIXED_VC" = X"no"; then
is in LD_LIBRARY_PATH or equivalent variable and
wxWidgets version is $reqwx or above.])
fi
-else
+ ],
+
+ [ #else
AC_MSG_CHECKING(for wxWidgets in standard locations)
echo
# Check whether --with-wxdir was given.
@@ -535,9 +552,10 @@ else
AC_SUBST(WX_RESCOMP)
AC_SUBST(WX_WEBVIEW_DLL)
AC_DEFINE([WXE_WEBVIEW])
-fi
+ ])
-if test "$WXERL_CAN_BUILD_DRIVER" != "false"; then
+AS_IF([test "$WXERL_CAN_BUILD_DRIVER" != "false"],
+[
AC_SUBST(WX_HAVE_STATIC_LIBS)
AC_SUBST(RC_FILE_TYPE)
@@ -624,7 +642,7 @@ AC_LANG_PUSH(C++)
saved_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS"
-AC_TRY_COMPILE([
+AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#ifdef WIN32
# include <windows.h>
# include <gl/glu.h>
@@ -637,14 +655,11 @@ AC_TRY_COMPILE([
# define CALLBACK
#endif
void CALLBACK foo() {};
- ],
- [
+ ]], [[
GLUtesselator* tess;
gluTessCallback(tess,GLU_TESS_VERTEX,(GLvoid (*)(...)) foo);
- ],
- [TESS_CB_TIGER_STYLE=yes
- AC_DEFINE(TESS_CB_TIGER_STYLE, [1], [GLU Callbacks are Tiger style])],
- TESS_CB_TIGER_STYLE=no)
+ ]])],[TESS_CB_TIGER_STYLE=yes
+ AC_DEFINE(TESS_CB_TIGER_STYLE, [1], [GLU Callbacks are Tiger style])],[TESS_CB_TIGER_STYLE=no])
AC_MSG_RESULT($TESS_CB_TIGER_STYLE)
AC_SUBST(TESS_CB_TIGER_STYLE)
@@ -672,13 +687,13 @@ if test X"$WX_HAVE_STATIC_LIBS" = X"true" ; then
LIBS=$WX_LIBS_STATIC
fi
-AC_LINK_IFELSE([AC_LANG_SOURCE([
+AC_LINK_IFELSE([AC_LANG_SOURCE([[
#ifdef WIN32
# include <windows.h>
#endif
#include "wx/wx.h"
#include "wx/stc/stc.h"
- ])
+
class MyApp : public wxApp
{
@@ -691,7 +706,7 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([
};
};
IMPLEMENT_APP(MyApp)
- ],
+ ]])],
[
CAN_LINK_WX=yes
],
@@ -708,15 +723,16 @@ if test X"$CAN_LINK_WX" != X"yes" ; then
WX_MSG_ERROR([Can not link wx program are all developer packages installed?])
fi
-fi dnl - if test "$WXERL_CAN_BUILD_DRIVER" != "false"
+]) dnl - if test "$WXERL_CAN_BUILD_DRIVER" != "false"
AC_SUBST(WXERL_CAN_BUILD_DRIVER)
-if test "x$GCC" = xyes; then
+AS_IF([test "x$GCC" = xyes],
+ [
# Treat certain GCC warnings as errors
LM_TRY_ENABLE_CFLAG([-Werror=return-type], [CFLAGS])
LM_TRY_ENABLE_CFLAG([-Werror=return-type], [CXXFLAGS])
-fi
+ ])
dnl ----------------------------------------------------------------------
dnl Enable -fsanitize= flags.
@@ -756,13 +772,7 @@ AC_SUBST(SO_EXT)
AC_SUBST(RUN_ERL)
AC_SUBST(CXXNOOPTFLAGS)
-
-if test X"$WX_BUILDING_INSIDE_ERLSRC" != X"true" ; then
- dnl Find driver directory name according to erlang
- WXERL_SYS_TYPE=`erl -noshell -eval 'io:format("~s~n",[[erlang:system_info(system_architecture)]])' -s erlang halt`
-else
- WXERL_SYS_TYPE=$TARGET
-fi
+WXERL_SYS_TYPE=$TARGET
AC_SUBST(WXERL_SYS_TYPE)
diff --git a/lib/wx/doc/src/notes.xml b/lib/wx/doc/src/notes.xml
index 786412a44f..5a9632cd01 100644
--- a/lib/wx/doc/src/notes.xml
+++ b/lib/wx/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2009</year><year>2021</year>
+ <year>2009</year><year>2022</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -253,7 +253,7 @@
<item>
<p>
Fixed wx initialization on mac, top level menus did not
- always work on newer MacOS versions. The menues will not
+ always work on newer MacOS versions. The menus will not
work until wxWidgets-3.1.5 is released and used on these
MacOS versions.</p>
<p>
@@ -1033,7 +1033,7 @@
<item>
<p>
Wx on MacOS X generated complains on stderr about certain
- cocoa functions not beeing called from the "Main thread".
+ cocoa functions not being called from the "Main thread".
This is now corrected.</p>
<p>
Own Id: OTP-9081</p>
@@ -1211,7 +1211,7 @@
<list>
<item>
<p>wxHtmlWindow class implemented.</p> <p>All exceptions
- from callbacks are now catched and written to the
+ from callbacks are now caught and written to the
log.</p> <p>Some defines where wrong in 'wx.hrl'.</p>
<p><c>wx:batch/1</c> and friends could hang forever if
for instance a breakpoint was set inside the fun. That
diff --git a/lib/wx/doc/src/wxEvtHandler.xml b/lib/wx/doc/src/wxEvtHandler.xml
index c38da3e127..fdc96971ca 100644
--- a/lib/wx/doc/src/wxEvtHandler.xml
+++ b/lib/wx/doc/src/wxEvtHandler.xml
@@ -7,7 +7,7 @@
<erlref>
<header>
<copyright>
- <year>2020</year><year>2021</year>
+ <year>2020</year><year>2022</year>
<holder>wxWidgets team.</holder></copyright>
<legalnotice>Licensed under the wxWindows Free Documentation Licence, Version 3
</legalnotice>
@@ -48,7 +48,7 @@
</p><p>id:<c>{id, integer()} </c> The identifier (or first of the identifier range) to be associated with this event handler. Default is ?wxID_ANY
</p><p>lastid:<c>{lastId,integer()} </c> The second part of the identifier range. If used 'id' must be set as the starting identifier range. Default is ?wxID_ANY
</p><p>skip:<c>{skip,boolean()} </c> If skip is true further event_handlers will be called. This is not used if the 'callback' option is used. Default is <c>false</c>.
- </p><p>callback:<c>{callback,function()} </c> Use a callback<c>fun(EventRecord::wx(),EventObject::wxObject()) </c> to process the event. Default not specfied i.e. a message will be delivered to the process calling this function.
+ </p><p>callback:<c>{callback,function()} </c> Use a callback<c>fun(EventRecord::wx(),EventObject::wxObject()) </c> to process the event. Default not specified i.e. a message will be delivered to the process calling this function.
</p><p>userData:<c>{userData,term()} </c> An erlang term that will be sent with the event. Default: [].
</p></desc>
</func>
diff --git a/lib/wx/doc/src/wxMouseEvent.xml b/lib/wx/doc/src/wxMouseEvent.xml
index 5c690102e4..2f9297be83 100644
--- a/lib/wx/doc/src/wxMouseEvent.xml
+++ b/lib/wx/doc/src/wxMouseEvent.xml
@@ -7,7 +7,7 @@
<erlref>
<header>
<copyright>
- <year>2020</year><year>2021</year>
+ <year>2020</year><year>2022</year>
<holder>wxWidgets team.</holder></copyright>
<legalnotice>Licensed under the wxWindows Free Documentation Licence, Version 3
</legalnotice>
@@ -322,5 +322,47 @@
</p><p>Notice that before wxWidgets 2.9.4 this method returned <c>int</c>.
</p></desc>
</func>
+
+ <func>
+ <name name="aux1DClick" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns true if the event was a first extra button double click. </fsummary>
+ <desc><p>Returns true if the event was a first extra button double click.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="aux1Down" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns true if the first extra button mouse button changed to down. </fsummary>
+ <desc><p>Returns true if the first extra button mouse button changed to down.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="aux1Up" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns true if the first extra button mouse button changed to up. </fsummary>
+ <desc><p>Returns true if the first extra button mouse button changed to up.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="aux2DClick" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns true if the event was a second extra button double click. </fsummary>
+ <desc><p>Returns true if the event was a second extra button double click.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="aux2Down" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns true if the second extra button mouse button changed to down. </fsummary>
+ <desc><p>Returns true if the second extra button mouse button changed to down.
+ </p></desc>
+ </func>
+
+ <func>
+ <name name="aux2Up" arity="1" clause_i="1" since=""/>
+ <fsummary>Returns true if the second extra button mouse button changed to up. </fsummary>
+ <desc><p>Returns true if the second extra button mouse button changed to up.
+ </p></desc>
+ </func>
</funcs>
</erlref>
diff --git a/lib/wx/examples/demo/Makefile b/lib/wx/examples/demo/Makefile
index d1c2d23a71..123c54580f 100644
--- a/lib/wx/examples/demo/Makefile
+++ b/lib/wx/examples/demo/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -62,7 +62,7 @@ TESTTARGETS = $(TESTMODS:%=%.beam)
TESTSRC = $(TESTMODS:%=%.erl)
# Targets
-opt debug: $(TESTTARGETS)
+$(TYPES): $(TESTTARGETS)
clean:
rm -f $(TESTTARGETS)
rm -f *~ core erl_crash.dump
diff --git a/lib/wx/examples/demo/demo.erl b/lib/wx/examples/demo/demo.erl
index 6e1465973a..0d5a5abee3 100644
--- a/lib/wx/examples/demo/demo.erl
+++ b/lib/wx/examples/demo/demo.erl
@@ -82,7 +82,7 @@ init(Options) ->
wxMenuBar:append(MB, Help, "&Help"),
wxFrame:setMenuBar(Frame,MB),
- wxFrame:connect(Frame, command_menu_selected),
+ wxFrame:connect(Frame, command_menu_selected, [{skip, true}]),
wxFrame:connect(Frame, close_window),
_SB = wxFrame:createStatusBar(Frame,[]),
diff --git a/lib/wx/examples/demo/demo_html_tagger.erl b/lib/wx/examples/demo/demo_html_tagger.erl
index cc24cbaa67..08f42820a3 100644
--- a/lib/wx/examples/demo/demo_html_tagger.erl
+++ b/lib/wx/examples/demo/demo_html_tagger.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2015. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@
%% That's because this program uses some pretty dodgy techniques to
%% get at the data it requires.
-%% I use epp_dodger to parse the file and the new imporved erl_scan
+%% I use epp_dodger to parse the file and the new improved erl_scan
%% find the exact values of the tokens
%% epp_dodger returns an objects of type erl_syntax which are pretty
diff --git a/lib/wx/examples/demo/ex_sashWindow.erl b/lib/wx/examples/demo/ex_sashWindow.erl
index 63528f65d1..80d0364482 100644
--- a/lib/wx/examples/demo/ex_sashWindow.erl
+++ b/lib/wx/examples/demo/ex_sashWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -65,7 +65,7 @@ do_init(Config) ->
Win2 = wxPanel:new(BottomSash, []),
wxStaticText:new(Win2, ?wxID_ANY, "This is the bottom sash", []),
- %% Make the bottom edge of the top sash dragable
+ %% Make the bottom edge of the top sash draggable
wxSashWindow:setSashVisible(TopSash, ?wxSASH_BOTTOM, true),
wxPanel:connect(Panel, sash_dragged),
wxPanel:connect(Panel, size),
diff --git a/lib/wx/examples/demo/ex_sizers.erl b/lib/wx/examples/demo/ex_sizers.erl
index 800f17f014..8b0baf4b16 100644
--- a/lib/wx/examples/demo/ex_sizers.erl
+++ b/lib/wx/examples/demo/ex_sizers.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -59,7 +59,7 @@ do_init(Config) ->
"Weighting Factor",
"Edge Affinity",
"Spacer",
- "Centering In Avalible Space",
+ "Centering In Available Space",
"Simple Border",
"East And West Border",
"North And South Border",
@@ -149,7 +149,7 @@ create_example(Parent, Example) ->
north_and_south_border(Panel);
"Simple Border" ->
simple_border(Panel);
- "Centering In Avalible Space" ->
+ "Centering In Available Space" ->
centering_in_avalible_space(Panel);
"Spacer" ->
spacer(Panel);
diff --git a/lib/wx/examples/demo/ex_splitterWindow.erl b/lib/wx/examples/demo/ex_splitterWindow.erl
index 14f63600a3..153a0da61a 100644
--- a/lib/wx/examples/demo/ex_splitterWindow.erl
+++ b/lib/wx/examples/demo/ex_splitterWindow.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -54,14 +54,14 @@ do_init(Config) ->
Splitter = wxSplitterWindow:new(Panel, []),
- Win1 = wxTextCtrl:new(Splitter, 1, [{value, "Splitted Window 1"},
+ Win1 = wxTextCtrl:new(Splitter, 1, [{value, "Split Window 1"},
{style, ?wxDEFAULT bor ?wxTE_MULTILINE}]),
- Win2 = wxTextCtrl:new(Splitter, 1, [{value, "Splitted Window 1"},
+ Win2 = wxTextCtrl:new(Splitter, 1, [{value, "Split Window 1"},
{style, ?wxDEFAULT bor ?wxTE_MULTILINE}]),
wxSplitterWindow:splitVertically(Splitter, Win1, Win2),
wxSplitterWindow:setSashGravity(Splitter, 0.5),
- %% Set pane-size =/= 0 to not unsplit on doubleclick
+ %% Set pane-size =/= 0 to not unsplit on double-click
%% on the splitter
wxSplitterWindow:setMinimumPaneSize(Splitter,50),
diff --git a/lib/wx/examples/simple/Makefile b/lib/wx/examples/simple/Makefile
index 075528533a..16ac01d40d 100644
--- a/lib/wx/examples/simple/Makefile
+++ b/lib/wx/examples/simple/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2021. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@ TESTTARGETS = $(TESTMODS:%=%.beam)
TESTSRC = $(TESTMODS:%=%.erl)
# Targets
-opt debug: $(TESTTARGETS)
+$(TYPES): $(TESTTARGETS)
clean:
rm -f $(TESTTARGETS)
rm -f *~ core erl_crash.dump
diff --git a/lib/wx/examples/simple/menu.erl b/lib/wx/examples/simple/menu.erl
index 829c88a3d5..4a5e9b4729 100644
--- a/lib/wx/examples/simple/menu.erl
+++ b/lib/wx/examples/simple/menu.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -309,7 +309,7 @@ create_help_menu() ->
HelpMenu = wxMenu:new(),
% unlike wxwidgets the stock menu items still need text to be given,
% although help text does appear
- % Note the keybord accelerator
+ % Note the keyboard accelerator
wxMenu:append(HelpMenu, wxMenuItem:new([
{id, ?menuID_HELP_ABOUT},
%{text, "&About\tF1"},
diff --git a/lib/wx/examples/simple/minimal.erl b/lib/wx/examples/simple/minimal.erl
index 45efc06462..5741243530 100644
--- a/lib/wx/examples/simple/minimal.erl
+++ b/lib/wx/examples/simple/minimal.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,7 +55,7 @@ create_window(Wx) ->
% unlike wxwidgets the stock menu items still need text to be given,
% although help text does appear
_QuitMenuItem = wxMenu:append(FileM, ?wxID_EXIT, "&Quit"),
- % Note the keybord accelerator
+ % Note the keyboard accelerator
_AboutMenuItem = wxMenu:append(HelpM, ?wxID_ABOUT, "&About...\tF1"),
wxMenu:appendSeparator(HelpM),
diff --git a/lib/wx/examples/sudoku/Makefile b/lib/wx/examples/sudoku/Makefile
index e6f35c689a..ccdcb7cd9f 100644
--- a/lib/wx/examples/sudoku/Makefile
+++ b/lib/wx/examples/sudoku/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2009-2016. All Rights Reserved.
+# Copyright Ericsson AB 2009-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -31,7 +31,7 @@ TESTTARGETS = $(TESTMODS:%=%.beam)
TESTSRC = $(TESTMODS:%=%.erl)
# Targets
-opt debug: $(TESTTARGETS)
+$(TYPES): $(TESTTARGETS)
clean:
rm -f $(TESTTARGETS)
rm -f *~ core erl_crash.dump
diff --git a/lib/wx/include/wx.hrl b/lib/wx/include/wx.hrl
index c2e918bb2d..38ba71c5f7 100644
--- a/lib/wx/include/wx.hrl
+++ b/lib/wx/include/wx.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -315,7 +315,8 @@
-record(wxMouseState, {x :: integer(), y :: integer(),
leftDown :: boolean(), middleDown :: boolean(), rightDown :: boolean(),
controlDown :: boolean(), shiftDown :: boolean(),
- altDown :: boolean(), metaDown :: boolean(), cmdDown :: boolean()
+ altDown :: boolean(), metaDown :: boolean(), cmdDown :: boolean(),
+ aux1Down :: boolean(), aux2Down :: boolean()
}).
-record(wxHtmlLinkInfo, {
href :: unicode:chardata(), target :: unicode:chardata()
@@ -1432,6 +1433,12 @@
-define(wxID_MDI_WINDOW_PREV, (?wxID_MDI_WINDOW_FIRST+4)).
-define(wxID_MDI_WINDOW_NEXT, (?wxID_MDI_WINDOW_FIRST+5)).
-define(wxID_MDI_WINDOW_LAST, ?wxID_MDI_WINDOW_NEXT).
+-define(wxID_OSX_MENU_FIRST, 5250).
+-define(wxID_OSX_HIDE, ?wxID_OSX_MENU_FIRST).
+-define(wxID_OSX_HIDEOTHERS, (?wxID_OSX_MENU_FIRST+1)).
+-define(wxID_OSX_SHOWALL, (?wxID_OSX_MENU_FIRST+2)).
+-define(wxID_OSX_SERVICES, (?wxID_OSX_MENU_FIRST+3)).
+-define(wxID_OSX_MENU_LAST, ?wxID_OSX_SERVICES).
-define(wxID_FILEDLGG, 5900).
-define(wxID_FILECTRL, 5950).
-define(wxID_HIGHEST, 5999).
diff --git a/lib/wx/src/Makefile b/lib/wx/src/Makefile
index 7e2eb38f2f..ce14c0b6df 100644
--- a/lib/wx/src/Makefile
+++ b/lib/wx/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2021. All Rights Reserved.
+# Copyright Ericsson AB 2008-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -75,7 +75,7 @@ APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
ifdef TERTIARY_BOOTSTRAP
opt: $(EBIN)/wx_object.beam
else
- debug opt: $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
+ $(TYPES): $(TARGET_FILES) $(APP_TARGET) $(APPUP_TARGET)
endif
clean:
diff --git a/lib/wx/src/gen/glu.erl b/lib/wx/src/gen/glu.erl
index 6d4d390205..15a80237fa 100644
--- a/lib/wx/src/gen/glu.erl
+++ b/lib/wx/src/gen/glu.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -55,7 +55,7 @@
%% @doc General purpose polygon triangulation.
%% The first argument is the normal and the second a list of
-%% vertex positions. Returned is a list of indecies of the vertices
+%% vertex positions. Returned is a list of indices of the vertices
%% and a binary (64bit native float) containing an array of
%% vertex positions, it starts with the vertices in Vs and
%% may contain newly created vertices in the end.
diff --git a/lib/wx/src/gen/wxEvtHandler.erl b/lib/wx/src/gen/wxEvtHandler.erl
index 824ff62133..bafd91ee51 100644
--- a/lib/wx/src/gen/wxEvtHandler.erl
+++ b/lib/wx/src/gen/wxEvtHandler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -33,10 +33,10 @@
%% (in another process) to handle the event. The callback should be of
%% arity 2. fun(EventRecord::wx(), EventObject::wxObject()).
%%
-%% Beware that the callback will be in executed in new process each time.
+%% Beware that the callback will be executed in a new process each time.
%%
%% <a href="http://www.wxwidgets.org/manuals/stable/wx_wxevthandler.html">
-%% The orginal documentation</a>.
+%% The original documentation</a>.
%%
%%
-module(wxEvtHandler).
@@ -71,8 +71,9 @@ connect(This, EventType) ->
%% {skip, boolean()}, If skip is true further event_handlers will be called.
%% This is not used if the 'callback' option is used.
%% Default false.
+%% callback Use `wx_object' callback `handle_sync_event/3'.
%% {callback, function()} Use a callback fun(EventRecord::wx(), EventObject::wxObject())
-%% to process the event. Default not specfied i.e. a message will
+%% to process the event. Default not specified i.e. a message will
%% be delivered to the process calling this function.
%% {userData, term()} An erlang term that will be sent with the event. Default: [].
-spec connect(This::wxEvtHandler(), EventType::wxEventType(), [Option]) -> 'ok' when
diff --git a/lib/wx/src/gen/wxMouseEvent.erl b/lib/wx/src/gen/wxMouseEvent.erl
index 897db7f29d..85f1852117 100644
--- a/lib/wx/src/gen/wxMouseEvent.erl
+++ b/lib/wx/src/gen/wxMouseEvent.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -20,7 +20,8 @@
-module(wxMouseEvent).
-include("wxe.hrl").
--export([altDown/1,button/2,buttonDClick/1,buttonDClick/2,buttonDown/1,buttonDown/2,
+-export([altDown/1,aux1DClick/1,aux1Down/1,aux1Up/1,aux2DClick/1,aux2Down/1,
+ aux2Up/1,button/2,buttonDClick/1,buttonDClick/2,buttonDown/1,buttonDown/2,
buttonUp/1,buttonUp/2,cmdDown/1,controlDown/1,dragging/1,entering/1,
getButton/1,getLinesPerAction/1,getLogicalPosition/2,getPosition/1,
getWheelAxis/1,getWheelDelta/1,getWheelRotation/1,getX/1,getY/1,isButton/1,
@@ -374,6 +375,54 @@ getWheelAxis(#wx_ref{type=ThisT}=This) ->
wxe_util:queue_cmd(This,?get_env(),?wxMouseEvent_GetWheelAxis),
wxe_util:rec(?wxMouseEvent_GetWheelAxis).
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmouseevent.html#wxmouseeventaux1dclick">external documentation</a>.
+-spec aux1DClick(This) -> boolean() when
+ This::wxMouseEvent().
+aux1DClick(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxMouseEvent),
+ wxe_util:queue_cmd(This,?get_env(),?wxMouseEvent_Aux1DClick),
+ wxe_util:rec(?wxMouseEvent_Aux1DClick).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmouseevent.html#wxmouseeventaux1down">external documentation</a>.
+-spec aux1Down(This) -> boolean() when
+ This::wxMouseEvent().
+aux1Down(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxMouseEvent),
+ wxe_util:queue_cmd(This,?get_env(),?wxMouseEvent_Aux1Down),
+ wxe_util:rec(?wxMouseEvent_Aux1Down).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmouseevent.html#wxmouseeventaux1up">external documentation</a>.
+-spec aux1Up(This) -> boolean() when
+ This::wxMouseEvent().
+aux1Up(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxMouseEvent),
+ wxe_util:queue_cmd(This,?get_env(),?wxMouseEvent_Aux1Up),
+ wxe_util:rec(?wxMouseEvent_Aux1Up).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmouseevent.html#wxmouseeventaux2dclick">external documentation</a>.
+-spec aux2DClick(This) -> boolean() when
+ This::wxMouseEvent().
+aux2DClick(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxMouseEvent),
+ wxe_util:queue_cmd(This,?get_env(),?wxMouseEvent_Aux2DClick),
+ wxe_util:rec(?wxMouseEvent_Aux2DClick).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmouseevent.html#wxmouseeventaux2down">external documentation</a>.
+-spec aux2Down(This) -> boolean() when
+ This::wxMouseEvent().
+aux2Down(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxMouseEvent),
+ wxe_util:queue_cmd(This,?get_env(),?wxMouseEvent_Aux2Down),
+ wxe_util:rec(?wxMouseEvent_Aux2Down).
+
+%% @doc See <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxmouseevent.html#wxmouseeventaux2up">external documentation</a>.
+-spec aux2Up(This) -> boolean() when
+ This::wxMouseEvent().
+aux2Up(#wx_ref{type=ThisT}=This) ->
+ ?CLASS(ThisT,wxMouseEvent),
+ wxe_util:queue_cmd(This,?get_env(),?wxMouseEvent_Aux2Up),
+ wxe_util:rec(?wxMouseEvent_Aux2Up).
+
%% From wxEvent
%% @hidden
stopPropagation(This) -> wxEvent:stopPropagation(This).
diff --git a/lib/wx/src/gen/wxe_funcs.hrl b/lib/wx/src/gen/wxe_funcs.hrl
index bf21c05605..b07addd99e 100644
--- a/lib/wx/src/gen/wxe_funcs.hrl
+++ b/lib/wx/src/gen/wxe_funcs.hrl
@@ -2556,893 +2556,899 @@
-define(wxMouseEvent_RightUp, 2727).
-define(wxMouseEvent_ShiftDown, 2728).
-define(wxMouseEvent_GetWheelAxis, 2729).
--define(wxSetCursorEvent_GetCursor, 2730).
--define(wxSetCursorEvent_GetX, 2731).
--define(wxSetCursorEvent_GetY, 2732).
--define(wxSetCursorEvent_HasCursor, 2733).
--define(wxSetCursorEvent_SetCursor, 2734).
--define(wxKeyEvent_AltDown, 2735).
--define(wxKeyEvent_CmdDown, 2736).
--define(wxKeyEvent_ControlDown, 2737).
--define(wxKeyEvent_GetKeyCode, 2738).
--define(wxKeyEvent_GetModifiers, 2739).
--define(wxKeyEvent_GetPosition, 2740).
--define(wxKeyEvent_GetRawKeyCode, 2742).
--define(wxKeyEvent_GetRawKeyFlags, 2743).
--define(wxKeyEvent_GetUnicodeKey, 2744).
--define(wxKeyEvent_GetX, 2745).
--define(wxKeyEvent_GetY, 2746).
--define(wxKeyEvent_HasModifiers, 2747).
--define(wxKeyEvent_MetaDown, 2748).
--define(wxKeyEvent_ShiftDown, 2749).
--define(wxSizeEvent_GetSize, 2750).
--define(wxSizeEvent_GetRect, 2751).
--define(wxMoveEvent_GetPosition, 2752).
--define(wxMoveEvent_GetRect, 2753).
--define(wxEraseEvent_GetDC, 2754).
--define(wxFocusEvent_GetWindow, 2755).
--define(wxChildFocusEvent_GetWindow, 2756).
--define(wxMenuEvent_GetMenu, 2757).
--define(wxMenuEvent_GetMenuId, 2758).
--define(wxMenuEvent_IsPopup, 2759).
--define(wxCloseEvent_CanVeto, 2760).
--define(wxCloseEvent_GetLoggingOff, 2761).
--define(wxCloseEvent_SetCanVeto, 2762).
--define(wxCloseEvent_SetLoggingOff, 2763).
--define(wxCloseEvent_Veto, 2764).
--define(wxShowEvent_SetShow, 2765).
--define(wxShowEvent_IsShown, 2766).
--define(wxIconizeEvent_IsIconized, 2767).
--define(wxJoystickEvent_ButtonDown, 2768).
--define(wxJoystickEvent_ButtonIsDown, 2769).
--define(wxJoystickEvent_ButtonUp, 2770).
--define(wxJoystickEvent_GetButtonChange, 2771).
--define(wxJoystickEvent_GetButtonState, 2772).
--define(wxJoystickEvent_GetJoystick, 2773).
--define(wxJoystickEvent_GetPosition, 2774).
--define(wxJoystickEvent_GetZPosition, 2775).
--define(wxJoystickEvent_IsButton, 2776).
--define(wxJoystickEvent_IsMove, 2777).
--define(wxJoystickEvent_IsZMove, 2778).
--define(wxUpdateUIEvent_CanUpdate, 2779).
--define(wxUpdateUIEvent_Check, 2780).
--define(wxUpdateUIEvent_Enable, 2781).
--define(wxUpdateUIEvent_Show, 2782).
--define(wxUpdateUIEvent_GetChecked, 2783).
--define(wxUpdateUIEvent_GetEnabled, 2784).
--define(wxUpdateUIEvent_GetShown, 2785).
--define(wxUpdateUIEvent_GetSetChecked, 2786).
--define(wxUpdateUIEvent_GetSetEnabled, 2787).
--define(wxUpdateUIEvent_GetSetShown, 2788).
--define(wxUpdateUIEvent_GetSetText, 2789).
--define(wxUpdateUIEvent_GetText, 2790).
--define(wxUpdateUIEvent_GetMode, 2791).
--define(wxUpdateUIEvent_GetUpdateInterval, 2792).
--define(wxUpdateUIEvent_ResetUpdateTime, 2793).
--define(wxUpdateUIEvent_SetMode, 2794).
--define(wxUpdateUIEvent_SetText, 2795).
--define(wxUpdateUIEvent_SetUpdateInterval, 2796).
--define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2797).
--define(wxPaletteChangedEvent_SetChangedWindow, 2798).
--define(wxPaletteChangedEvent_GetChangedWindow, 2799).
--define(wxQueryNewPaletteEvent_SetPaletteRealized, 2800).
--define(wxQueryNewPaletteEvent_GetPaletteRealized, 2801).
--define(wxNavigationKeyEvent_GetDirection, 2802).
--define(wxNavigationKeyEvent_SetDirection, 2803).
--define(wxNavigationKeyEvent_IsWindowChange, 2804).
--define(wxNavigationKeyEvent_SetWindowChange, 2805).
--define(wxNavigationKeyEvent_IsFromTab, 2806).
--define(wxNavigationKeyEvent_SetFromTab, 2807).
--define(wxNavigationKeyEvent_GetCurrentFocus, 2808).
--define(wxNavigationKeyEvent_SetCurrentFocus, 2809).
--define(wxHelpEvent_GetOrigin, 2810).
--define(wxHelpEvent_GetPosition, 2811).
--define(wxHelpEvent_SetOrigin, 2812).
--define(wxHelpEvent_SetPosition, 2813).
--define(wxContextMenuEvent_GetPosition, 2814).
--define(wxContextMenuEvent_SetPosition, 2815).
--define(wxIdleEvent_GetMode, 2816).
--define(wxIdleEvent_RequestMore, 2817).
--define(wxIdleEvent_MoreRequested, 2818).
--define(wxIdleEvent_SetMode, 2819).
--define(wxGridEvent_AltDown, 2820).
--define(wxGridEvent_ControlDown, 2821).
--define(wxGridEvent_GetCol, 2822).
--define(wxGridEvent_GetPosition, 2823).
--define(wxGridEvent_GetRow, 2824).
--define(wxGridEvent_MetaDown, 2825).
--define(wxGridEvent_Selecting, 2826).
--define(wxGridEvent_ShiftDown, 2827).
--define(wxNotifyEvent_Allow, 2828).
--define(wxNotifyEvent_IsAllowed, 2829).
--define(wxNotifyEvent_Veto, 2830).
--define(wxSashEvent_GetEdge, 2831).
--define(wxSashEvent_GetDragRect, 2832).
--define(wxSashEvent_GetDragStatus, 2833).
--define(wxListEvent_GetCacheFrom, 2834).
--define(wxListEvent_GetCacheTo, 2835).
--define(wxListEvent_GetKeyCode, 2836).
--define(wxListEvent_GetIndex, 2837).
--define(wxListEvent_GetColumn, 2838).
--define(wxListEvent_GetPoint, 2839).
--define(wxListEvent_GetLabel, 2840).
--define(wxListEvent_GetText, 2841).
--define(wxListEvent_GetImage, 2842).
--define(wxListEvent_GetData, 2843).
--define(wxListEvent_GetMask, 2844).
--define(wxListEvent_GetItem, 2845).
--define(wxListEvent_IsEditCancelled, 2846).
--define(wxDateEvent_GetDate, 2847).
--define(wxCalendarEvent_GetWeekDay, 2848).
--define(wxCalendarEvent_GetDate, 2849).
--define(wxFileDirPickerEvent_GetPath, 2850).
--define(wxColourPickerEvent_GetColour, 2851).
--define(wxFontPickerEvent_GetFont, 2852).
--define(wxStyledTextEvent_GetPosition, 2853).
--define(wxStyledTextEvent_GetKey, 2854).
--define(wxStyledTextEvent_GetModifiers, 2855).
--define(wxStyledTextEvent_GetModificationType, 2856).
--define(wxStyledTextEvent_GetText, 2857).
--define(wxStyledTextEvent_GetLength, 2858).
--define(wxStyledTextEvent_GetLinesAdded, 2859).
--define(wxStyledTextEvent_GetLine, 2860).
--define(wxStyledTextEvent_GetFoldLevelNow, 2861).
--define(wxStyledTextEvent_GetFoldLevelPrev, 2862).
--define(wxStyledTextEvent_GetMargin, 2863).
--define(wxStyledTextEvent_GetMessage, 2864).
--define(wxStyledTextEvent_GetWParam, 2865).
--define(wxStyledTextEvent_GetLParam, 2866).
--define(wxStyledTextEvent_GetListType, 2867).
--define(wxStyledTextEvent_GetX, 2868).
--define(wxStyledTextEvent_GetY, 2869).
--define(wxStyledTextEvent_GetDragText, 2870).
--define(wxStyledTextEvent_GetDragAllowMove, 2871).
--define(wxStyledTextEvent_GetDragResult, 2872).
--define(wxStyledTextEvent_GetShift, 2873).
--define(wxStyledTextEvent_GetControl, 2874).
--define(wxStyledTextEvent_GetAlt, 2875).
--define(utils_wxGetKeyState, 2876).
--define(utils_wxGetMousePosition, 2877).
--define(utils_wxGetMouseState, 2878).
--define(utils_wxSetDetectableAutoRepeat, 2879).
--define(utils_wxBell, 2880).
--define(utils_wxFindMenuItemId, 2881).
--define(utils_wxFindWindowAtPoint, 2882).
--define(utils_wxBeginBusyCursor, 2883).
--define(utils_wxEndBusyCursor, 2884).
--define(utils_wxIsBusy, 2885).
--define(utils_wxShutdown, 2886).
--define(utils_wxShell, 2887).
--define(utils_wxLaunchDefaultBrowser, 2888).
--define(utils_wxGetEmailAddress, 2889).
--define(utils_wxGetUserId, 2890).
--define(utils_wxGetHomeDir, 2891).
--define(utils_wxNewId, 2892).
--define(utils_wxRegisterId, 2893).
--define(utils_wxGetCurrentId, 2894).
--define(utils_wxGetOsDescription, 2895).
--define(utils_wxIsPlatformLittleEndian, 2896).
--define(utils_wxIsPlatform64Bit, 2897).
--define(gdicmn_wxDisplaySize, 2898).
--define(gdicmn_wxSetCursor, 2899).
--define(wxPrintout_new, 2900).
--define(wxPrintout_destruct, 2901).
--define(wxPrintout_GetDC, 2902).
--define(wxPrintout_GetPageSizeMM, 2903).
--define(wxPrintout_GetPageSizePixels, 2904).
--define(wxPrintout_GetPaperRectPixels, 2905).
--define(wxPrintout_GetPPIPrinter, 2906).
--define(wxPrintout_GetPPIScreen, 2907).
--define(wxPrintout_GetTitle, 2908).
--define(wxPrintout_IsPreview, 2909).
--define(wxPrintout_FitThisSizeToPaper, 2910).
--define(wxPrintout_FitThisSizeToPage, 2911).
--define(wxPrintout_FitThisSizeToPageMargins, 2912).
--define(wxPrintout_MapScreenSizeToPaper, 2913).
--define(wxPrintout_MapScreenSizeToPage, 2914).
--define(wxPrintout_MapScreenSizeToPageMargins, 2915).
--define(wxPrintout_MapScreenSizeToDevice, 2916).
--define(wxPrintout_GetLogicalPaperRect, 2917).
--define(wxPrintout_GetLogicalPageRect, 2918).
--define(wxPrintout_GetLogicalPageMarginsRect, 2919).
--define(wxPrintout_SetLogicalOrigin, 2920).
--define(wxPrintout_OffsetLogicalOrigin, 2921).
--define(wxStyledTextCtrl_new_2, 2922).
--define(wxStyledTextCtrl_new_0, 2923).
--define(wxStyledTextCtrl_destruct, 2924).
--define(wxStyledTextCtrl_Create, 2925).
--define(wxStyledTextCtrl_AddText, 2926).
--define(wxStyledTextCtrl_InsertText, 2927).
--define(wxStyledTextCtrl_ClearAll, 2928).
--define(wxStyledTextCtrl_ClearDocumentStyle, 2929).
--define(wxStyledTextCtrl_GetLength, 2930).
--define(wxStyledTextCtrl_GetCharAt, 2931).
--define(wxStyledTextCtrl_GetCurrentPos, 2932).
--define(wxStyledTextCtrl_GetAnchor, 2933).
--define(wxStyledTextCtrl_GetStyleAt, 2934).
--define(wxStyledTextCtrl_Redo, 2935).
--define(wxStyledTextCtrl_SetUndoCollection, 2936).
--define(wxStyledTextCtrl_SelectAll, 2937).
--define(wxStyledTextCtrl_SetSavePoint, 2938).
--define(wxStyledTextCtrl_CanRedo, 2939).
--define(wxStyledTextCtrl_MarkerLineFromHandle, 2940).
--define(wxStyledTextCtrl_MarkerDeleteHandle, 2941).
--define(wxStyledTextCtrl_GetUndoCollection, 2942).
--define(wxStyledTextCtrl_GetViewWhiteSpace, 2943).
--define(wxStyledTextCtrl_SetViewWhiteSpace, 2944).
--define(wxStyledTextCtrl_PositionFromPoint, 2945).
--define(wxStyledTextCtrl_PositionFromPointClose, 2946).
--define(wxStyledTextCtrl_GotoLine, 2947).
--define(wxStyledTextCtrl_GotoPos, 2948).
--define(wxStyledTextCtrl_SetAnchor, 2949).
--define(wxStyledTextCtrl_GetCurLine, 2950).
--define(wxStyledTextCtrl_GetEndStyled, 2951).
--define(wxStyledTextCtrl_ConvertEOLs, 2952).
--define(wxStyledTextCtrl_GetEOLMode, 2953).
--define(wxStyledTextCtrl_SetEOLMode, 2954).
--define(wxStyledTextCtrl_StartStyling, 2955).
--define(wxStyledTextCtrl_SetStyling, 2956).
--define(wxStyledTextCtrl_GetBufferedDraw, 2957).
--define(wxStyledTextCtrl_SetBufferedDraw, 2958).
--define(wxStyledTextCtrl_SetTabWidth, 2959).
--define(wxStyledTextCtrl_GetTabWidth, 2960).
--define(wxStyledTextCtrl_SetCodePage, 2961).
--define(wxStyledTextCtrl_MarkerDefine, 2962).
--define(wxStyledTextCtrl_MarkerSetForeground, 2963).
--define(wxStyledTextCtrl_MarkerSetBackground, 2964).
--define(wxStyledTextCtrl_MarkerAdd, 2965).
--define(wxStyledTextCtrl_MarkerDelete, 2966).
--define(wxStyledTextCtrl_MarkerDeleteAll, 2967).
--define(wxStyledTextCtrl_MarkerGet, 2968).
--define(wxStyledTextCtrl_MarkerNext, 2969).
--define(wxStyledTextCtrl_MarkerPrevious, 2970).
--define(wxStyledTextCtrl_MarkerDefineBitmap, 2971).
--define(wxStyledTextCtrl_MarkerAddSet, 2972).
--define(wxStyledTextCtrl_MarkerSetAlpha, 2973).
--define(wxStyledTextCtrl_SetMarginType, 2974).
--define(wxStyledTextCtrl_GetMarginType, 2975).
--define(wxStyledTextCtrl_SetMarginWidth, 2976).
--define(wxStyledTextCtrl_GetMarginWidth, 2977).
--define(wxStyledTextCtrl_SetMarginMask, 2978).
--define(wxStyledTextCtrl_GetMarginMask, 2979).
--define(wxStyledTextCtrl_SetMarginSensitive, 2980).
--define(wxStyledTextCtrl_GetMarginSensitive, 2981).
--define(wxStyledTextCtrl_StyleClearAll, 2982).
--define(wxStyledTextCtrl_StyleSetForeground, 2983).
--define(wxStyledTextCtrl_StyleSetBackground, 2984).
--define(wxStyledTextCtrl_StyleSetBold, 2985).
--define(wxStyledTextCtrl_StyleSetItalic, 2986).
--define(wxStyledTextCtrl_StyleSetSize, 2987).
--define(wxStyledTextCtrl_StyleSetFaceName, 2988).
--define(wxStyledTextCtrl_StyleSetEOLFilled, 2989).
--define(wxStyledTextCtrl_StyleResetDefault, 2990).
--define(wxStyledTextCtrl_StyleSetUnderline, 2991).
--define(wxStyledTextCtrl_StyleSetCase, 2992).
--define(wxStyledTextCtrl_StyleSetHotSpot, 2993).
--define(wxStyledTextCtrl_SetSelForeground, 2994).
--define(wxStyledTextCtrl_SetSelBackground, 2995).
--define(wxStyledTextCtrl_GetSelAlpha, 2996).
--define(wxStyledTextCtrl_SetSelAlpha, 2997).
--define(wxStyledTextCtrl_SetCaretForeground, 2998).
--define(wxStyledTextCtrl_CmdKeyAssign, 2999).
--define(wxStyledTextCtrl_CmdKeyClear, 3000).
--define(wxStyledTextCtrl_CmdKeyClearAll, 3001).
--define(wxStyledTextCtrl_SetStyleBytes, 3002).
--define(wxStyledTextCtrl_StyleSetVisible, 3003).
--define(wxStyledTextCtrl_GetCaretPeriod, 3004).
--define(wxStyledTextCtrl_SetCaretPeriod, 3005).
--define(wxStyledTextCtrl_SetWordChars, 3006).
--define(wxStyledTextCtrl_BeginUndoAction, 3007).
--define(wxStyledTextCtrl_EndUndoAction, 3008).
--define(wxStyledTextCtrl_IndicatorSetStyle, 3009).
--define(wxStyledTextCtrl_IndicatorGetStyle, 3010).
--define(wxStyledTextCtrl_IndicatorSetForeground, 3011).
--define(wxStyledTextCtrl_IndicatorGetForeground, 3012).
--define(wxStyledTextCtrl_SetWhitespaceForeground, 3013).
--define(wxStyledTextCtrl_SetWhitespaceBackground, 3014).
--define(wxStyledTextCtrl_GetStyleBits, 3015).
--define(wxStyledTextCtrl_SetLineState, 3016).
--define(wxStyledTextCtrl_GetLineState, 3017).
--define(wxStyledTextCtrl_GetMaxLineState, 3018).
--define(wxStyledTextCtrl_GetCaretLineVisible, 3019).
--define(wxStyledTextCtrl_SetCaretLineVisible, 3020).
--define(wxStyledTextCtrl_GetCaretLineBackground, 3021).
--define(wxStyledTextCtrl_SetCaretLineBackground, 3022).
--define(wxStyledTextCtrl_AutoCompShow, 3023).
--define(wxStyledTextCtrl_AutoCompCancel, 3024).
--define(wxStyledTextCtrl_AutoCompActive, 3025).
--define(wxStyledTextCtrl_AutoCompPosStart, 3026).
--define(wxStyledTextCtrl_AutoCompComplete, 3027).
--define(wxStyledTextCtrl_AutoCompStops, 3028).
--define(wxStyledTextCtrl_AutoCompSetSeparator, 3029).
--define(wxStyledTextCtrl_AutoCompGetSeparator, 3030).
--define(wxStyledTextCtrl_AutoCompSelect, 3031).
--define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3032).
--define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3033).
--define(wxStyledTextCtrl_AutoCompSetFillUps, 3034).
--define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3035).
--define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3036).
--define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3037).
--define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3038).
--define(wxStyledTextCtrl_UserListShow, 3039).
--define(wxStyledTextCtrl_AutoCompSetAutoHide, 3040).
--define(wxStyledTextCtrl_AutoCompGetAutoHide, 3041).
--define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3042).
--define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3043).
--define(wxStyledTextCtrl_RegisterImage, 3044).
--define(wxStyledTextCtrl_ClearRegisteredImages, 3045).
--define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3046).
--define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3047).
--define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3048).
--define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3049).
--define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3050).
--define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3051).
--define(wxStyledTextCtrl_SetIndent, 3052).
--define(wxStyledTextCtrl_GetIndent, 3053).
--define(wxStyledTextCtrl_SetUseTabs, 3054).
--define(wxStyledTextCtrl_GetUseTabs, 3055).
--define(wxStyledTextCtrl_SetLineIndentation, 3056).
--define(wxStyledTextCtrl_GetLineIndentation, 3057).
--define(wxStyledTextCtrl_GetLineIndentPosition, 3058).
--define(wxStyledTextCtrl_GetColumn, 3059).
--define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3060).
--define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3061).
--define(wxStyledTextCtrl_SetIndentationGuides, 3062).
--define(wxStyledTextCtrl_GetIndentationGuides, 3063).
--define(wxStyledTextCtrl_SetHighlightGuide, 3064).
--define(wxStyledTextCtrl_GetHighlightGuide, 3065).
--define(wxStyledTextCtrl_GetLineEndPosition, 3066).
--define(wxStyledTextCtrl_GetCodePage, 3067).
--define(wxStyledTextCtrl_GetCaretForeground, 3068).
--define(wxStyledTextCtrl_GetReadOnly, 3069).
--define(wxStyledTextCtrl_SetCurrentPos, 3070).
--define(wxStyledTextCtrl_SetSelectionStart, 3071).
--define(wxStyledTextCtrl_GetSelectionStart, 3072).
--define(wxStyledTextCtrl_SetSelectionEnd, 3073).
--define(wxStyledTextCtrl_GetSelectionEnd, 3074).
--define(wxStyledTextCtrl_SetPrintMagnification, 3075).
--define(wxStyledTextCtrl_GetPrintMagnification, 3076).
--define(wxStyledTextCtrl_SetPrintColourMode, 3077).
--define(wxStyledTextCtrl_GetPrintColourMode, 3078).
--define(wxStyledTextCtrl_FindText, 3079).
--define(wxStyledTextCtrl_FormatRange, 3080).
--define(wxStyledTextCtrl_GetFirstVisibleLine, 3081).
--define(wxStyledTextCtrl_GetLine, 3082).
--define(wxStyledTextCtrl_GetLineCount, 3083).
--define(wxStyledTextCtrl_SetMarginLeft, 3084).
--define(wxStyledTextCtrl_GetMarginLeft, 3085).
--define(wxStyledTextCtrl_SetMarginRight, 3086).
--define(wxStyledTextCtrl_GetMarginRight, 3087).
--define(wxStyledTextCtrl_GetModify, 3088).
--define(wxStyledTextCtrl_SetSelection, 3089).
--define(wxStyledTextCtrl_GetSelectedText, 3090).
--define(wxStyledTextCtrl_GetTextRange, 3091).
--define(wxStyledTextCtrl_HideSelection, 3092).
--define(wxStyledTextCtrl_LineFromPosition, 3093).
--define(wxStyledTextCtrl_PositionFromLine, 3094).
--define(wxStyledTextCtrl_LineScroll, 3095).
--define(wxStyledTextCtrl_EnsureCaretVisible, 3096).
--define(wxStyledTextCtrl_ReplaceSelection, 3097).
--define(wxStyledTextCtrl_SetReadOnly, 3098).
--define(wxStyledTextCtrl_CanPaste, 3099).
--define(wxStyledTextCtrl_CanUndo, 3100).
--define(wxStyledTextCtrl_EmptyUndoBuffer, 3101).
--define(wxStyledTextCtrl_Undo, 3102).
--define(wxStyledTextCtrl_Cut, 3103).
--define(wxStyledTextCtrl_Copy, 3104).
--define(wxStyledTextCtrl_Paste, 3105).
--define(wxStyledTextCtrl_Clear, 3106).
--define(wxStyledTextCtrl_SetText, 3107).
--define(wxStyledTextCtrl_GetText, 3108).
--define(wxStyledTextCtrl_GetTextLength, 3109).
--define(wxStyledTextCtrl_GetOvertype, 3110).
--define(wxStyledTextCtrl_SetCaretWidth, 3111).
--define(wxStyledTextCtrl_GetCaretWidth, 3112).
--define(wxStyledTextCtrl_SetTargetStart, 3113).
--define(wxStyledTextCtrl_GetTargetStart, 3114).
--define(wxStyledTextCtrl_SetTargetEnd, 3115).
--define(wxStyledTextCtrl_GetTargetEnd, 3116).
--define(wxStyledTextCtrl_ReplaceTarget, 3117).
--define(wxStyledTextCtrl_SearchInTarget, 3118).
--define(wxStyledTextCtrl_SetSearchFlags, 3119).
--define(wxStyledTextCtrl_GetSearchFlags, 3120).
--define(wxStyledTextCtrl_CallTipShow, 3121).
--define(wxStyledTextCtrl_CallTipCancel, 3122).
--define(wxStyledTextCtrl_CallTipActive, 3123).
--define(wxStyledTextCtrl_CallTipPosAtStart, 3124).
--define(wxStyledTextCtrl_CallTipSetHighlight, 3125).
--define(wxStyledTextCtrl_CallTipSetBackground, 3126).
--define(wxStyledTextCtrl_CallTipSetForeground, 3127).
--define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3128).
--define(wxStyledTextCtrl_CallTipUseStyle, 3129).
--define(wxStyledTextCtrl_VisibleFromDocLine, 3130).
--define(wxStyledTextCtrl_DocLineFromVisible, 3131).
--define(wxStyledTextCtrl_WrapCount, 3132).
--define(wxStyledTextCtrl_SetFoldLevel, 3133).
--define(wxStyledTextCtrl_GetFoldLevel, 3134).
--define(wxStyledTextCtrl_GetLastChild, 3135).
--define(wxStyledTextCtrl_GetFoldParent, 3136).
--define(wxStyledTextCtrl_ShowLines, 3137).
--define(wxStyledTextCtrl_HideLines, 3138).
--define(wxStyledTextCtrl_GetLineVisible, 3139).
--define(wxStyledTextCtrl_SetFoldExpanded, 3140).
--define(wxStyledTextCtrl_GetFoldExpanded, 3141).
--define(wxStyledTextCtrl_ToggleFold, 3142).
--define(wxStyledTextCtrl_EnsureVisible, 3143).
--define(wxStyledTextCtrl_SetFoldFlags, 3144).
--define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3145).
--define(wxStyledTextCtrl_SetTabIndents, 3146).
--define(wxStyledTextCtrl_GetTabIndents, 3147).
--define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3148).
--define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3149).
--define(wxStyledTextCtrl_SetMouseDwellTime, 3150).
--define(wxStyledTextCtrl_GetMouseDwellTime, 3151).
--define(wxStyledTextCtrl_WordStartPosition, 3152).
--define(wxStyledTextCtrl_WordEndPosition, 3153).
--define(wxStyledTextCtrl_SetWrapMode, 3154).
--define(wxStyledTextCtrl_GetWrapMode, 3155).
--define(wxStyledTextCtrl_SetWrapVisualFlags, 3156).
--define(wxStyledTextCtrl_GetWrapVisualFlags, 3157).
--define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3158).
--define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3159).
--define(wxStyledTextCtrl_SetWrapStartIndent, 3160).
--define(wxStyledTextCtrl_GetWrapStartIndent, 3161).
--define(wxStyledTextCtrl_SetLayoutCache, 3162).
--define(wxStyledTextCtrl_GetLayoutCache, 3163).
--define(wxStyledTextCtrl_SetScrollWidth, 3164).
--define(wxStyledTextCtrl_GetScrollWidth, 3165).
--define(wxStyledTextCtrl_TextWidth, 3166).
--define(wxStyledTextCtrl_GetEndAtLastLine, 3167).
--define(wxStyledTextCtrl_TextHeight, 3168).
--define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3169).
--define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3170).
--define(wxStyledTextCtrl_AppendText, 3171).
--define(wxStyledTextCtrl_GetTwoPhaseDraw, 3172).
--define(wxStyledTextCtrl_SetTwoPhaseDraw, 3173).
--define(wxStyledTextCtrl_TargetFromSelection, 3174).
--define(wxStyledTextCtrl_LinesJoin, 3175).
--define(wxStyledTextCtrl_LinesSplit, 3176).
--define(wxStyledTextCtrl_SetFoldMarginColour, 3177).
--define(wxStyledTextCtrl_SetFoldMarginHiColour, 3178).
--define(wxStyledTextCtrl_LineDown, 3179).
--define(wxStyledTextCtrl_LineDownExtend, 3180).
--define(wxStyledTextCtrl_LineUp, 3181).
--define(wxStyledTextCtrl_LineUpExtend, 3182).
--define(wxStyledTextCtrl_CharLeft, 3183).
--define(wxStyledTextCtrl_CharLeftExtend, 3184).
--define(wxStyledTextCtrl_CharRight, 3185).
--define(wxStyledTextCtrl_CharRightExtend, 3186).
--define(wxStyledTextCtrl_WordLeft, 3187).
--define(wxStyledTextCtrl_WordLeftExtend, 3188).
--define(wxStyledTextCtrl_WordRight, 3189).
--define(wxStyledTextCtrl_WordRightExtend, 3190).
--define(wxStyledTextCtrl_Home, 3191).
--define(wxStyledTextCtrl_HomeExtend, 3192).
--define(wxStyledTextCtrl_LineEnd, 3193).
--define(wxStyledTextCtrl_LineEndExtend, 3194).
--define(wxStyledTextCtrl_DocumentStart, 3195).
--define(wxStyledTextCtrl_DocumentStartExtend, 3196).
--define(wxStyledTextCtrl_DocumentEnd, 3197).
--define(wxStyledTextCtrl_DocumentEndExtend, 3198).
--define(wxStyledTextCtrl_PageUp, 3199).
--define(wxStyledTextCtrl_PageUpExtend, 3200).
--define(wxStyledTextCtrl_PageDown, 3201).
--define(wxStyledTextCtrl_PageDownExtend, 3202).
--define(wxStyledTextCtrl_EditToggleOvertype, 3203).
--define(wxStyledTextCtrl_Cancel, 3204).
--define(wxStyledTextCtrl_DeleteBack, 3205).
--define(wxStyledTextCtrl_Tab, 3206).
--define(wxStyledTextCtrl_BackTab, 3207).
--define(wxStyledTextCtrl_NewLine, 3208).
--define(wxStyledTextCtrl_FormFeed, 3209).
--define(wxStyledTextCtrl_VCHome, 3210).
--define(wxStyledTextCtrl_VCHomeExtend, 3211).
--define(wxStyledTextCtrl_ZoomIn, 3212).
--define(wxStyledTextCtrl_ZoomOut, 3213).
--define(wxStyledTextCtrl_DelWordLeft, 3214).
--define(wxStyledTextCtrl_DelWordRight, 3215).
--define(wxStyledTextCtrl_LineCut, 3216).
--define(wxStyledTextCtrl_LineDelete, 3217).
--define(wxStyledTextCtrl_LineTranspose, 3218).
--define(wxStyledTextCtrl_LineDuplicate, 3219).
--define(wxStyledTextCtrl_LowerCase, 3220).
--define(wxStyledTextCtrl_UpperCase, 3221).
--define(wxStyledTextCtrl_LineScrollDown, 3222).
--define(wxStyledTextCtrl_LineScrollUp, 3223).
--define(wxStyledTextCtrl_DeleteBackNotLine, 3224).
--define(wxStyledTextCtrl_HomeDisplay, 3225).
--define(wxStyledTextCtrl_HomeDisplayExtend, 3226).
--define(wxStyledTextCtrl_LineEndDisplay, 3227).
--define(wxStyledTextCtrl_LineEndDisplayExtend, 3228).
--define(wxStyledTextCtrl_HomeWrapExtend, 3229).
--define(wxStyledTextCtrl_LineEndWrap, 3230).
--define(wxStyledTextCtrl_LineEndWrapExtend, 3231).
--define(wxStyledTextCtrl_VCHomeWrap, 3232).
--define(wxStyledTextCtrl_VCHomeWrapExtend, 3233).
--define(wxStyledTextCtrl_LineCopy, 3234).
--define(wxStyledTextCtrl_MoveCaretInsideView, 3235).
--define(wxStyledTextCtrl_LineLength, 3236).
--define(wxStyledTextCtrl_BraceHighlight, 3237).
--define(wxStyledTextCtrl_BraceBadLight, 3238).
--define(wxStyledTextCtrl_BraceMatch, 3239).
--define(wxStyledTextCtrl_GetViewEOL, 3240).
--define(wxStyledTextCtrl_SetViewEOL, 3241).
--define(wxStyledTextCtrl_SetModEventMask, 3242).
--define(wxStyledTextCtrl_GetEdgeColumn, 3243).
--define(wxStyledTextCtrl_SetEdgeColumn, 3244).
--define(wxStyledTextCtrl_SetEdgeMode, 3245).
--define(wxStyledTextCtrl_GetEdgeMode, 3246).
--define(wxStyledTextCtrl_GetEdgeColour, 3247).
--define(wxStyledTextCtrl_SetEdgeColour, 3248).
--define(wxStyledTextCtrl_SearchAnchor, 3249).
--define(wxStyledTextCtrl_SearchNext, 3250).
--define(wxStyledTextCtrl_SearchPrev, 3251).
--define(wxStyledTextCtrl_LinesOnScreen, 3252).
--define(wxStyledTextCtrl_UsePopUp, 3253).
--define(wxStyledTextCtrl_SelectionIsRectangle, 3254).
--define(wxStyledTextCtrl_SetZoom, 3255).
--define(wxStyledTextCtrl_GetZoom, 3256).
--define(wxStyledTextCtrl_GetModEventMask, 3257).
--define(wxStyledTextCtrl_SetSTCFocus, 3258).
--define(wxStyledTextCtrl_GetSTCFocus, 3259).
--define(wxStyledTextCtrl_SetStatus, 3260).
--define(wxStyledTextCtrl_GetStatus, 3261).
--define(wxStyledTextCtrl_SetMouseDownCaptures, 3262).
--define(wxStyledTextCtrl_GetMouseDownCaptures, 3263).
--define(wxStyledTextCtrl_SetSTCCursor, 3264).
--define(wxStyledTextCtrl_GetSTCCursor, 3265).
--define(wxStyledTextCtrl_SetControlCharSymbol, 3266).
--define(wxStyledTextCtrl_GetControlCharSymbol, 3267).
--define(wxStyledTextCtrl_WordPartLeft, 3268).
--define(wxStyledTextCtrl_WordPartLeftExtend, 3269).
--define(wxStyledTextCtrl_WordPartRight, 3270).
--define(wxStyledTextCtrl_WordPartRightExtend, 3271).
--define(wxStyledTextCtrl_SetVisiblePolicy, 3272).
--define(wxStyledTextCtrl_DelLineLeft, 3273).
--define(wxStyledTextCtrl_DelLineRight, 3274).
--define(wxStyledTextCtrl_GetXOffset, 3275).
--define(wxStyledTextCtrl_ChooseCaretX, 3276).
--define(wxStyledTextCtrl_SetXCaretPolicy, 3277).
--define(wxStyledTextCtrl_SetYCaretPolicy, 3278).
--define(wxStyledTextCtrl_GetPrintWrapMode, 3279).
--define(wxStyledTextCtrl_SetHotspotActiveForeground, 3280).
--define(wxStyledTextCtrl_SetHotspotActiveBackground, 3281).
--define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3282).
--define(wxStyledTextCtrl_SetHotspotSingleLine, 3283).
--define(wxStyledTextCtrl_ParaDownExtend, 3284).
--define(wxStyledTextCtrl_ParaUp, 3285).
--define(wxStyledTextCtrl_ParaUpExtend, 3286).
--define(wxStyledTextCtrl_PositionBefore, 3287).
--define(wxStyledTextCtrl_PositionAfter, 3288).
--define(wxStyledTextCtrl_CopyRange, 3289).
--define(wxStyledTextCtrl_CopyText, 3290).
--define(wxStyledTextCtrl_SetSelectionMode, 3291).
--define(wxStyledTextCtrl_GetSelectionMode, 3292).
--define(wxStyledTextCtrl_LineDownRectExtend, 3293).
--define(wxStyledTextCtrl_LineUpRectExtend, 3294).
--define(wxStyledTextCtrl_CharLeftRectExtend, 3295).
--define(wxStyledTextCtrl_CharRightRectExtend, 3296).
--define(wxStyledTextCtrl_HomeRectExtend, 3297).
--define(wxStyledTextCtrl_VCHomeRectExtend, 3298).
--define(wxStyledTextCtrl_LineEndRectExtend, 3299).
--define(wxStyledTextCtrl_PageUpRectExtend, 3300).
--define(wxStyledTextCtrl_PageDownRectExtend, 3301).
--define(wxStyledTextCtrl_StutteredPageUp, 3302).
--define(wxStyledTextCtrl_StutteredPageUpExtend, 3303).
--define(wxStyledTextCtrl_StutteredPageDown, 3304).
--define(wxStyledTextCtrl_StutteredPageDownExtend, 3305).
--define(wxStyledTextCtrl_WordLeftEnd, 3306).
--define(wxStyledTextCtrl_WordLeftEndExtend, 3307).
--define(wxStyledTextCtrl_WordRightEnd, 3308).
--define(wxStyledTextCtrl_WordRightEndExtend, 3309).
--define(wxStyledTextCtrl_SetWhitespaceChars, 3310).
--define(wxStyledTextCtrl_SetCharsDefault, 3311).
--define(wxStyledTextCtrl_AutoCompGetCurrent, 3312).
--define(wxStyledTextCtrl_Allocate, 3313).
--define(wxStyledTextCtrl_FindColumn, 3314).
--define(wxStyledTextCtrl_GetCaretSticky, 3315).
--define(wxStyledTextCtrl_SetCaretSticky, 3316).
--define(wxStyledTextCtrl_ToggleCaretSticky, 3317).
--define(wxStyledTextCtrl_SetPasteConvertEndings, 3318).
--define(wxStyledTextCtrl_GetPasteConvertEndings, 3319).
--define(wxStyledTextCtrl_SelectionDuplicate, 3320).
--define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3321).
--define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3322).
--define(wxStyledTextCtrl_StartRecord, 3323).
--define(wxStyledTextCtrl_StopRecord, 3324).
--define(wxStyledTextCtrl_SetLexer, 3325).
--define(wxStyledTextCtrl_GetLexer, 3326).
--define(wxStyledTextCtrl_Colourise, 3327).
--define(wxStyledTextCtrl_SetProperty, 3328).
--define(wxStyledTextCtrl_SetKeyWords, 3329).
--define(wxStyledTextCtrl_SetLexerLanguage, 3330).
--define(wxStyledTextCtrl_GetProperty, 3331).
--define(wxStyledTextCtrl_GetStyleBitsNeeded, 3332).
--define(wxStyledTextCtrl_GetCurrentLine, 3333).
--define(wxStyledTextCtrl_StyleSetSpec, 3334).
--define(wxStyledTextCtrl_StyleSetFont, 3335).
--define(wxStyledTextCtrl_StyleSetFontAttr, 3336).
--define(wxStyledTextCtrl_StyleSetCharacterSet, 3337).
--define(wxStyledTextCtrl_StyleSetFontEncoding, 3338).
--define(wxStyledTextCtrl_CmdKeyExecute, 3339).
--define(wxStyledTextCtrl_SetMargins, 3340).
--define(wxStyledTextCtrl_GetSelection, 3341).
--define(wxStyledTextCtrl_PointFromPosition, 3342).
--define(wxStyledTextCtrl_ScrollToLine, 3343).
--define(wxStyledTextCtrl_ScrollToColumn, 3344).
--define(wxStyledTextCtrl_SetVScrollBar, 3345).
--define(wxStyledTextCtrl_SetHScrollBar, 3346).
--define(wxStyledTextCtrl_GetLastKeydownProcessed, 3347).
--define(wxStyledTextCtrl_SetLastKeydownProcessed, 3348).
--define(wxStyledTextCtrl_SaveFile, 3349).
--define(wxStyledTextCtrl_LoadFile, 3350).
--define(wxStyledTextCtrl_DoDragOver, 3351).
--define(wxStyledTextCtrl_DoDropText, 3352).
--define(wxStyledTextCtrl_GetUseAntiAliasing, 3353).
--define(wxStyledTextCtrl_AddTextRaw, 3354).
--define(wxStyledTextCtrl_InsertTextRaw, 3355).
--define(wxStyledTextCtrl_GetCurLineRaw, 3356).
--define(wxStyledTextCtrl_GetLineRaw, 3357).
--define(wxStyledTextCtrl_GetSelectedTextRaw, 3358).
--define(wxStyledTextCtrl_GetTextRangeRaw, 3359).
--define(wxStyledTextCtrl_SetTextRaw, 3360).
--define(wxStyledTextCtrl_GetTextRaw, 3361).
--define(wxStyledTextCtrl_AppendTextRaw, 3362).
--define(wxArtProvider_GetBitmap, 3363).
--define(wxArtProvider_GetIcon, 3364).
--define(wxTreeEvent_GetKeyCode, 3365).
--define(wxTreeEvent_GetItem, 3366).
--define(wxTreeEvent_GetKeyEvent, 3367).
--define(wxTreeEvent_GetLabel, 3368).
--define(wxTreeEvent_GetOldItem, 3369).
--define(wxTreeEvent_GetPoint, 3370).
--define(wxTreeEvent_IsEditCancelled, 3371).
--define(wxTreeEvent_SetToolTip, 3372).
--define(wxBookCtrlEvent_GetOldSelection, 3373).
--define(wxBookCtrlEvent_GetSelection, 3374).
--define(wxBookCtrlEvent_SetOldSelection, 3375).
--define(wxBookCtrlEvent_SetSelection, 3376).
--define(wxFileDataObject_new, 3377).
--define(wxFileDataObject_AddFile, 3378).
--define(wxFileDataObject_GetFilenames, 3379).
--define(wxFileDataObject_destroy, 3380).
--define(wxTextDataObject_new, 3381).
--define(wxTextDataObject_GetTextLength, 3382).
--define(wxTextDataObject_GetText, 3383).
--define(wxTextDataObject_SetText, 3384).
--define(wxTextDataObject_destroy, 3385).
--define(wxBitmapDataObject_new_1_1, 3386).
--define(wxBitmapDataObject_new_1_0, 3387).
--define(wxBitmapDataObject_GetBitmap, 3388).
--define(wxBitmapDataObject_SetBitmap, 3389).
--define(wxBitmapDataObject_destroy, 3390).
--define(wxClipboard_new, 3391).
--define(wxClipboard_destruct, 3392).
--define(wxClipboard_AddData, 3393).
--define(wxClipboard_Clear, 3394).
--define(wxClipboard_Close, 3395).
--define(wxClipboard_Flush, 3396).
--define(wxClipboard_GetData, 3397).
--define(wxClipboard_IsOpened, 3398).
--define(wxClipboard_Open, 3399).
--define(wxClipboard_SetData, 3400).
--define(wxClipboard_UsePrimarySelection, 3401).
--define(wxClipboard_IsSupported, 3402).
--define(wxClipboard_Get, 3403).
--define(wxSpinEvent_GetPosition, 3404).
--define(wxSpinEvent_SetPosition, 3405).
--define(wxSplitterWindow_new_0, 3406).
--define(wxSplitterWindow_new_2, 3407).
--define(wxSplitterWindow_destruct, 3408).
--define(wxSplitterWindow_Create, 3409).
--define(wxSplitterWindow_GetMinimumPaneSize, 3410).
--define(wxSplitterWindow_GetSashGravity, 3411).
--define(wxSplitterWindow_GetSashPosition, 3412).
--define(wxSplitterWindow_GetSplitMode, 3413).
--define(wxSplitterWindow_GetWindow1, 3414).
--define(wxSplitterWindow_GetWindow2, 3415).
--define(wxSplitterWindow_Initialize, 3416).
--define(wxSplitterWindow_IsSplit, 3417).
--define(wxSplitterWindow_ReplaceWindow, 3418).
--define(wxSplitterWindow_SetSashGravity, 3419).
--define(wxSplitterWindow_SetSashPosition, 3420).
--define(wxSplitterWindow_SetMinimumPaneSize, 3421).
--define(wxSplitterWindow_SetSplitMode, 3422).
--define(wxSplitterWindow_SplitHorizontally, 3423).
--define(wxSplitterWindow_SplitVertically, 3424).
--define(wxSplitterWindow_Unsplit, 3425).
--define(wxSplitterWindow_UpdateSize, 3426).
--define(wxSplitterEvent_GetSashPosition, 3427).
--define(wxSplitterEvent_GetX, 3428).
--define(wxSplitterEvent_GetY, 3429).
--define(wxSplitterEvent_GetWindowBeingRemoved, 3430).
--define(wxSplitterEvent_SetSashPosition, 3431).
--define(wxHtmlWindow_new_0, 3432).
--define(wxHtmlWindow_new_2, 3433).
--define(wxHtmlWindow_AppendToPage, 3434).
--define(wxHtmlWindow_GetOpenedAnchor, 3435).
--define(wxHtmlWindow_GetOpenedPage, 3436).
--define(wxHtmlWindow_GetOpenedPageTitle, 3437).
--define(wxHtmlWindow_GetRelatedFrame, 3438).
--define(wxHtmlWindow_HistoryBack, 3439).
--define(wxHtmlWindow_HistoryCanBack, 3440).
--define(wxHtmlWindow_HistoryCanForward, 3441).
--define(wxHtmlWindow_HistoryClear, 3442).
--define(wxHtmlWindow_HistoryForward, 3443).
--define(wxHtmlWindow_LoadFile, 3444).
--define(wxHtmlWindow_LoadPage, 3445).
--define(wxHtmlWindow_SelectAll, 3446).
--define(wxHtmlWindow_SelectionToText, 3447).
--define(wxHtmlWindow_SelectLine, 3448).
--define(wxHtmlWindow_SelectWord, 3449).
--define(wxHtmlWindow_SetBorders, 3450).
--define(wxHtmlWindow_SetFonts, 3451).
--define(wxHtmlWindow_SetPage, 3452).
--define(wxHtmlWindow_SetRelatedFrame, 3453).
--define(wxHtmlWindow_SetRelatedStatusBar_1, 3454).
--define(wxHtmlWindow_SetRelatedStatusBar_2, 3455).
--define(wxHtmlWindow_ToText, 3456).
--define(wxHtmlWindow_destroy, 3457).
--define(wxHtmlLinkEvent_GetLinkInfo, 3458).
--define(wxSystemSettings_GetColour, 3459).
--define(wxSystemSettings_GetFont, 3460).
--define(wxSystemSettings_GetMetric, 3461).
--define(wxSystemSettings_GetScreenType, 3462).
--define(wxSystemOptions_GetOption, 3463).
--define(wxSystemOptions_GetOptionInt, 3464).
--define(wxSystemOptions_HasOption, 3465).
--define(wxSystemOptions_IsFalse, 3466).
--define(wxSystemOptions_SetOption_2_1, 3467).
--define(wxSystemOptions_SetOption_2_0, 3468).
--define(wxAuiNotebookEvent_SetSelection, 3469).
--define(wxAuiNotebookEvent_GetSelection, 3470).
--define(wxAuiNotebookEvent_SetOldSelection, 3471).
--define(wxAuiNotebookEvent_GetOldSelection, 3472).
--define(wxAuiNotebookEvent_SetDragSource, 3473).
--define(wxAuiNotebookEvent_GetDragSource, 3474).
--define(wxAuiManagerEvent_SetManager, 3475).
--define(wxAuiManagerEvent_GetManager, 3476).
--define(wxAuiManagerEvent_SetPane, 3477).
--define(wxAuiManagerEvent_GetPane, 3478).
--define(wxAuiManagerEvent_SetButton, 3479).
--define(wxAuiManagerEvent_GetButton, 3480).
--define(wxAuiManagerEvent_SetDC, 3481).
--define(wxAuiManagerEvent_GetDC, 3482).
--define(wxAuiManagerEvent_Veto, 3483).
--define(wxAuiManagerEvent_GetVeto, 3484).
--define(wxAuiManagerEvent_SetCanVeto, 3485).
--define(wxAuiManagerEvent_CanVeto, 3486).
--define(wxLogNull_new, 3487).
--define(wxLogNull_destruct, 3488).
--define(wxTaskBarIcon_new, 3489).
--define(wxTaskBarIcon_destruct, 3490).
--define(wxTaskBarIcon_PopupMenu, 3491).
--define(wxTaskBarIcon_RemoveIcon, 3492).
--define(wxTaskBarIcon_SetIcon, 3493).
--define(wxLocale_new_0, 3494).
--define(wxLocale_new_2_0, 3495).
--define(wxLocale_new_2_1, 3496).
--define(wxLocale_destruct, 3497).
--define(wxLocale_Init_1, 3498).
--define(wxLocale_Init_2, 3499).
--define(wxLocale_AddCatalog_1, 3500).
--define(wxLocale_AddCatalog_2, 3501).
--define(wxLocale_AddCatalog_3, 3502).
--define(wxLocale_AddCatalogLookupPathPrefix, 3503).
--define(wxLocale_GetCanonicalName, 3504).
--define(wxLocale_GetLanguage, 3505).
--define(wxLocale_GetLanguageName, 3506).
--define(wxLocale_GetLocale, 3507).
--define(wxLocale_GetName, 3508).
--define(wxLocale_GetString_2, 3509).
--define(wxLocale_GetString_4, 3510).
--define(wxLocale_GetHeaderValue, 3511).
--define(wxLocale_GetSysName, 3512).
--define(wxLocale_GetSystemEncoding, 3513).
--define(wxLocale_GetSystemEncodingName, 3514).
--define(wxLocale_GetSystemLanguage, 3515).
--define(wxLocale_IsLoaded, 3516).
--define(wxLocale_IsOk, 3517).
--define(wxActivateEvent_GetActive, 3518).
--define(wxPopupWindow_new_0, 3519).
--define(wxPopupWindow_new_2, 3520).
--define(wxPopupWindow_Create, 3521).
--define(wxPopupWindow_Position, 3522).
--define(wxPopupWindow_destroy, 3523).
--define(wxPopupTransientWindow_new_0, 3524).
--define(wxPopupTransientWindow_new_2, 3525).
--define(wxPopupTransientWindow_Popup, 3526).
--define(wxPopupTransientWindow_Dismiss, 3527).
--define(wxPopupTransientWindow_destroy, 3528).
--define(wxOverlay_new, 3529).
--define(wxOverlay_destruct, 3530).
--define(wxOverlay_Reset, 3531).
--define(wxDCOverlay_new_6, 3532).
--define(wxDCOverlay_new_2, 3533).
--define(wxDCOverlay_destruct, 3534).
--define(wxDCOverlay_Clear, 3535).
--define(wxDropFilesEvent_GetPosition, 3536).
--define(wxDropFilesEvent_GetNumberOfFiles, 3537).
--define(wxDropFilesEvent_GetFiles, 3538).
--define(wxDisplay_new_0, 3539).
--define(wxDisplay_new_1_0, 3540).
--define(wxDisplay_new_1_1, 3541).
--define(wxDisplay_destruct, 3542).
--define(wxDisplay_IsOk, 3543).
--define(wxDisplay_GetClientArea, 3544).
--define(wxDisplay_GetGeometry, 3545).
--define(wxDisplay_GetName, 3546).
--define(wxDisplay_IsPrimary, 3547).
--define(wxDisplay_GetCount, 3548).
--define(wxDisplay_GetFromPoint, 3549).
--define(wxDisplay_GetFromWindow, 3550).
--define(wxDisplay_GetPPI, 3551).
--define(wxGCDC_new_1, 3552).
--define(wxGCDC_new_0, 3555).
--define(wxGCDC_destruct, 3556).
--define(wxGCDC_GetGraphicsContext, 3557).
--define(wxGCDC_SetGraphicsContext, 3558).
--define(wxNotificationMessage_new_0, 3559).
--define(wxNotificationMessage_new_2, 3560).
--define(wxNotificationMessage_destruct, 3561).
--define(wxNotificationMessage_AddAction, 3562).
--define(wxNotificationMessage_Close, 3563).
--define(wxNotificationMessage_SetFlags, 3564).
--define(wxNotificationMessage_SetIcon, 3565).
--define(wxNotificationMessage_SetMessage, 3566).
--define(wxNotificationMessage_SetParent, 3567).
--define(wxNotificationMessage_SetTitle, 3568).
--define(wxNotificationMessage_Show, 3569).
--define(wxNotificationMessage_UseTaskBarIcon, 3570).
--define(wxNotificationMessage_MSWUseToasts, 3571).
--define(wxWebView_New, 3573).
--define(wxWebView_GetCurrentTitle, 3574).
--define(wxWebView_GetCurrentURL, 3575).
--define(wxWebView_GetPageSource, 3576).
--define(wxWebView_GetPageText, 3577).
--define(wxWebView_IsBusy, 3578).
--define(wxWebView_IsEditable, 3579).
--define(wxWebView_LoadURL, 3580).
--define(wxWebView_Print, 3581).
--define(wxWebView_Reload, 3582).
--define(wxWebView_RunScript, 3583).
--define(wxWebView_SetEditable, 3584).
--define(wxWebView_SetPage, 3585).
--define(wxWebView_Stop, 3586).
--define(wxWebView_CanCopy, 3587).
--define(wxWebView_CanCut, 3588).
--define(wxWebView_CanPaste, 3589).
--define(wxWebView_Copy, 3590).
--define(wxWebView_Cut, 3591).
--define(wxWebView_Paste, 3592).
--define(wxWebView_EnableContextMenu, 3593).
--define(wxWebView_IsContextMenuEnabled, 3594).
--define(wxWebView_CanGoBack, 3595).
--define(wxWebView_CanGoForward, 3596).
--define(wxWebView_ClearHistory, 3597).
--define(wxWebView_EnableHistory, 3598).
--define(wxWebView_GoBack, 3599).
--define(wxWebView_GoForward, 3600).
--define(wxWebView_ClearSelection, 3601).
--define(wxWebView_DeleteSelection, 3602).
--define(wxWebView_GetSelectedSource, 3603).
--define(wxWebView_GetSelectedText, 3604).
--define(wxWebView_HasSelection, 3605).
--define(wxWebView_SelectAll, 3606).
--define(wxWebView_CanRedo, 3607).
--define(wxWebView_CanUndo, 3608).
--define(wxWebView_Redo, 3609).
--define(wxWebView_Undo, 3610).
--define(wxWebView_Find, 3611).
--define(wxWebView_CanSetZoomType, 3612).
--define(wxWebView_GetZoom, 3613).
--define(wxWebView_GetZoomType, 3614).
--define(wxWebView_SetZoom, 3615).
--define(wxWebView_SetZoomType, 3616).
--define(wxWebView_GetZoomFactor, 3617).
--define(wxWebView_SetZoomFactor, 3618).
--define(wxWebView_IsBackendAvailable, 3619).
--define(wxWebViewEvent_GetString, 3620).
--define(wxWebViewEvent_GetInt, 3621).
--define(wxWebViewEvent_GetTarget, 3622).
--define(wxWebViewEvent_GetURL, 3623).
+-define(wxMouseEvent_Aux1DClick, 2730).
+-define(wxMouseEvent_Aux1Down, 2731).
+-define(wxMouseEvent_Aux1Up, 2732).
+-define(wxMouseEvent_Aux2DClick, 2733).
+-define(wxMouseEvent_Aux2Down, 2734).
+-define(wxMouseEvent_Aux2Up, 2735).
+-define(wxSetCursorEvent_GetCursor, 2736).
+-define(wxSetCursorEvent_GetX, 2737).
+-define(wxSetCursorEvent_GetY, 2738).
+-define(wxSetCursorEvent_HasCursor, 2739).
+-define(wxSetCursorEvent_SetCursor, 2740).
+-define(wxKeyEvent_AltDown, 2741).
+-define(wxKeyEvent_CmdDown, 2742).
+-define(wxKeyEvent_ControlDown, 2743).
+-define(wxKeyEvent_GetKeyCode, 2744).
+-define(wxKeyEvent_GetModifiers, 2745).
+-define(wxKeyEvent_GetPosition, 2746).
+-define(wxKeyEvent_GetRawKeyCode, 2748).
+-define(wxKeyEvent_GetRawKeyFlags, 2749).
+-define(wxKeyEvent_GetUnicodeKey, 2750).
+-define(wxKeyEvent_GetX, 2751).
+-define(wxKeyEvent_GetY, 2752).
+-define(wxKeyEvent_HasModifiers, 2753).
+-define(wxKeyEvent_MetaDown, 2754).
+-define(wxKeyEvent_ShiftDown, 2755).
+-define(wxSizeEvent_GetSize, 2756).
+-define(wxSizeEvent_GetRect, 2757).
+-define(wxMoveEvent_GetPosition, 2758).
+-define(wxMoveEvent_GetRect, 2759).
+-define(wxEraseEvent_GetDC, 2760).
+-define(wxFocusEvent_GetWindow, 2761).
+-define(wxChildFocusEvent_GetWindow, 2762).
+-define(wxMenuEvent_GetMenu, 2763).
+-define(wxMenuEvent_GetMenuId, 2764).
+-define(wxMenuEvent_IsPopup, 2765).
+-define(wxCloseEvent_CanVeto, 2766).
+-define(wxCloseEvent_GetLoggingOff, 2767).
+-define(wxCloseEvent_SetCanVeto, 2768).
+-define(wxCloseEvent_SetLoggingOff, 2769).
+-define(wxCloseEvent_Veto, 2770).
+-define(wxShowEvent_SetShow, 2771).
+-define(wxShowEvent_IsShown, 2772).
+-define(wxIconizeEvent_IsIconized, 2773).
+-define(wxJoystickEvent_ButtonDown, 2774).
+-define(wxJoystickEvent_ButtonIsDown, 2775).
+-define(wxJoystickEvent_ButtonUp, 2776).
+-define(wxJoystickEvent_GetButtonChange, 2777).
+-define(wxJoystickEvent_GetButtonState, 2778).
+-define(wxJoystickEvent_GetJoystick, 2779).
+-define(wxJoystickEvent_GetPosition, 2780).
+-define(wxJoystickEvent_GetZPosition, 2781).
+-define(wxJoystickEvent_IsButton, 2782).
+-define(wxJoystickEvent_IsMove, 2783).
+-define(wxJoystickEvent_IsZMove, 2784).
+-define(wxUpdateUIEvent_CanUpdate, 2785).
+-define(wxUpdateUIEvent_Check, 2786).
+-define(wxUpdateUIEvent_Enable, 2787).
+-define(wxUpdateUIEvent_Show, 2788).
+-define(wxUpdateUIEvent_GetChecked, 2789).
+-define(wxUpdateUIEvent_GetEnabled, 2790).
+-define(wxUpdateUIEvent_GetShown, 2791).
+-define(wxUpdateUIEvent_GetSetChecked, 2792).
+-define(wxUpdateUIEvent_GetSetEnabled, 2793).
+-define(wxUpdateUIEvent_GetSetShown, 2794).
+-define(wxUpdateUIEvent_GetSetText, 2795).
+-define(wxUpdateUIEvent_GetText, 2796).
+-define(wxUpdateUIEvent_GetMode, 2797).
+-define(wxUpdateUIEvent_GetUpdateInterval, 2798).
+-define(wxUpdateUIEvent_ResetUpdateTime, 2799).
+-define(wxUpdateUIEvent_SetMode, 2800).
+-define(wxUpdateUIEvent_SetText, 2801).
+-define(wxUpdateUIEvent_SetUpdateInterval, 2802).
+-define(wxMouseCaptureChangedEvent_GetCapturedWindow, 2803).
+-define(wxPaletteChangedEvent_SetChangedWindow, 2804).
+-define(wxPaletteChangedEvent_GetChangedWindow, 2805).
+-define(wxQueryNewPaletteEvent_SetPaletteRealized, 2806).
+-define(wxQueryNewPaletteEvent_GetPaletteRealized, 2807).
+-define(wxNavigationKeyEvent_GetDirection, 2808).
+-define(wxNavigationKeyEvent_SetDirection, 2809).
+-define(wxNavigationKeyEvent_IsWindowChange, 2810).
+-define(wxNavigationKeyEvent_SetWindowChange, 2811).
+-define(wxNavigationKeyEvent_IsFromTab, 2812).
+-define(wxNavigationKeyEvent_SetFromTab, 2813).
+-define(wxNavigationKeyEvent_GetCurrentFocus, 2814).
+-define(wxNavigationKeyEvent_SetCurrentFocus, 2815).
+-define(wxHelpEvent_GetOrigin, 2816).
+-define(wxHelpEvent_GetPosition, 2817).
+-define(wxHelpEvent_SetOrigin, 2818).
+-define(wxHelpEvent_SetPosition, 2819).
+-define(wxContextMenuEvent_GetPosition, 2820).
+-define(wxContextMenuEvent_SetPosition, 2821).
+-define(wxIdleEvent_GetMode, 2822).
+-define(wxIdleEvent_RequestMore, 2823).
+-define(wxIdleEvent_MoreRequested, 2824).
+-define(wxIdleEvent_SetMode, 2825).
+-define(wxGridEvent_AltDown, 2826).
+-define(wxGridEvent_ControlDown, 2827).
+-define(wxGridEvent_GetCol, 2828).
+-define(wxGridEvent_GetPosition, 2829).
+-define(wxGridEvent_GetRow, 2830).
+-define(wxGridEvent_MetaDown, 2831).
+-define(wxGridEvent_Selecting, 2832).
+-define(wxGridEvent_ShiftDown, 2833).
+-define(wxNotifyEvent_Allow, 2834).
+-define(wxNotifyEvent_IsAllowed, 2835).
+-define(wxNotifyEvent_Veto, 2836).
+-define(wxSashEvent_GetEdge, 2837).
+-define(wxSashEvent_GetDragRect, 2838).
+-define(wxSashEvent_GetDragStatus, 2839).
+-define(wxListEvent_GetCacheFrom, 2840).
+-define(wxListEvent_GetCacheTo, 2841).
+-define(wxListEvent_GetKeyCode, 2842).
+-define(wxListEvent_GetIndex, 2843).
+-define(wxListEvent_GetColumn, 2844).
+-define(wxListEvent_GetPoint, 2845).
+-define(wxListEvent_GetLabel, 2846).
+-define(wxListEvent_GetText, 2847).
+-define(wxListEvent_GetImage, 2848).
+-define(wxListEvent_GetData, 2849).
+-define(wxListEvent_GetMask, 2850).
+-define(wxListEvent_GetItem, 2851).
+-define(wxListEvent_IsEditCancelled, 2852).
+-define(wxDateEvent_GetDate, 2853).
+-define(wxCalendarEvent_GetWeekDay, 2854).
+-define(wxCalendarEvent_GetDate, 2855).
+-define(wxFileDirPickerEvent_GetPath, 2856).
+-define(wxColourPickerEvent_GetColour, 2857).
+-define(wxFontPickerEvent_GetFont, 2858).
+-define(wxStyledTextEvent_GetPosition, 2859).
+-define(wxStyledTextEvent_GetKey, 2860).
+-define(wxStyledTextEvent_GetModifiers, 2861).
+-define(wxStyledTextEvent_GetModificationType, 2862).
+-define(wxStyledTextEvent_GetText, 2863).
+-define(wxStyledTextEvent_GetLength, 2864).
+-define(wxStyledTextEvent_GetLinesAdded, 2865).
+-define(wxStyledTextEvent_GetLine, 2866).
+-define(wxStyledTextEvent_GetFoldLevelNow, 2867).
+-define(wxStyledTextEvent_GetFoldLevelPrev, 2868).
+-define(wxStyledTextEvent_GetMargin, 2869).
+-define(wxStyledTextEvent_GetMessage, 2870).
+-define(wxStyledTextEvent_GetWParam, 2871).
+-define(wxStyledTextEvent_GetLParam, 2872).
+-define(wxStyledTextEvent_GetListType, 2873).
+-define(wxStyledTextEvent_GetX, 2874).
+-define(wxStyledTextEvent_GetY, 2875).
+-define(wxStyledTextEvent_GetDragText, 2876).
+-define(wxStyledTextEvent_GetDragAllowMove, 2877).
+-define(wxStyledTextEvent_GetDragResult, 2878).
+-define(wxStyledTextEvent_GetShift, 2879).
+-define(wxStyledTextEvent_GetControl, 2880).
+-define(wxStyledTextEvent_GetAlt, 2881).
+-define(utils_wxGetKeyState, 2882).
+-define(utils_wxGetMousePosition, 2883).
+-define(utils_wxGetMouseState, 2884).
+-define(utils_wxSetDetectableAutoRepeat, 2885).
+-define(utils_wxBell, 2886).
+-define(utils_wxFindMenuItemId, 2887).
+-define(utils_wxFindWindowAtPoint, 2888).
+-define(utils_wxBeginBusyCursor, 2889).
+-define(utils_wxEndBusyCursor, 2890).
+-define(utils_wxIsBusy, 2891).
+-define(utils_wxShutdown, 2892).
+-define(utils_wxShell, 2893).
+-define(utils_wxLaunchDefaultBrowser, 2894).
+-define(utils_wxGetEmailAddress, 2895).
+-define(utils_wxGetUserId, 2896).
+-define(utils_wxGetHomeDir, 2897).
+-define(utils_wxNewId, 2898).
+-define(utils_wxRegisterId, 2899).
+-define(utils_wxGetCurrentId, 2900).
+-define(utils_wxGetOsDescription, 2901).
+-define(utils_wxIsPlatformLittleEndian, 2902).
+-define(utils_wxIsPlatform64Bit, 2903).
+-define(gdicmn_wxDisplaySize, 2904).
+-define(gdicmn_wxSetCursor, 2905).
+-define(wxPrintout_new, 2906).
+-define(wxPrintout_destruct, 2907).
+-define(wxPrintout_GetDC, 2908).
+-define(wxPrintout_GetPageSizeMM, 2909).
+-define(wxPrintout_GetPageSizePixels, 2910).
+-define(wxPrintout_GetPaperRectPixels, 2911).
+-define(wxPrintout_GetPPIPrinter, 2912).
+-define(wxPrintout_GetPPIScreen, 2913).
+-define(wxPrintout_GetTitle, 2914).
+-define(wxPrintout_IsPreview, 2915).
+-define(wxPrintout_FitThisSizeToPaper, 2916).
+-define(wxPrintout_FitThisSizeToPage, 2917).
+-define(wxPrintout_FitThisSizeToPageMargins, 2918).
+-define(wxPrintout_MapScreenSizeToPaper, 2919).
+-define(wxPrintout_MapScreenSizeToPage, 2920).
+-define(wxPrintout_MapScreenSizeToPageMargins, 2921).
+-define(wxPrintout_MapScreenSizeToDevice, 2922).
+-define(wxPrintout_GetLogicalPaperRect, 2923).
+-define(wxPrintout_GetLogicalPageRect, 2924).
+-define(wxPrintout_GetLogicalPageMarginsRect, 2925).
+-define(wxPrintout_SetLogicalOrigin, 2926).
+-define(wxPrintout_OffsetLogicalOrigin, 2927).
+-define(wxStyledTextCtrl_new_2, 2928).
+-define(wxStyledTextCtrl_new_0, 2929).
+-define(wxStyledTextCtrl_destruct, 2930).
+-define(wxStyledTextCtrl_Create, 2931).
+-define(wxStyledTextCtrl_AddText, 2932).
+-define(wxStyledTextCtrl_InsertText, 2933).
+-define(wxStyledTextCtrl_ClearAll, 2934).
+-define(wxStyledTextCtrl_ClearDocumentStyle, 2935).
+-define(wxStyledTextCtrl_GetLength, 2936).
+-define(wxStyledTextCtrl_GetCharAt, 2937).
+-define(wxStyledTextCtrl_GetCurrentPos, 2938).
+-define(wxStyledTextCtrl_GetAnchor, 2939).
+-define(wxStyledTextCtrl_GetStyleAt, 2940).
+-define(wxStyledTextCtrl_Redo, 2941).
+-define(wxStyledTextCtrl_SetUndoCollection, 2942).
+-define(wxStyledTextCtrl_SelectAll, 2943).
+-define(wxStyledTextCtrl_SetSavePoint, 2944).
+-define(wxStyledTextCtrl_CanRedo, 2945).
+-define(wxStyledTextCtrl_MarkerLineFromHandle, 2946).
+-define(wxStyledTextCtrl_MarkerDeleteHandle, 2947).
+-define(wxStyledTextCtrl_GetUndoCollection, 2948).
+-define(wxStyledTextCtrl_GetViewWhiteSpace, 2949).
+-define(wxStyledTextCtrl_SetViewWhiteSpace, 2950).
+-define(wxStyledTextCtrl_PositionFromPoint, 2951).
+-define(wxStyledTextCtrl_PositionFromPointClose, 2952).
+-define(wxStyledTextCtrl_GotoLine, 2953).
+-define(wxStyledTextCtrl_GotoPos, 2954).
+-define(wxStyledTextCtrl_SetAnchor, 2955).
+-define(wxStyledTextCtrl_GetCurLine, 2956).
+-define(wxStyledTextCtrl_GetEndStyled, 2957).
+-define(wxStyledTextCtrl_ConvertEOLs, 2958).
+-define(wxStyledTextCtrl_GetEOLMode, 2959).
+-define(wxStyledTextCtrl_SetEOLMode, 2960).
+-define(wxStyledTextCtrl_StartStyling, 2961).
+-define(wxStyledTextCtrl_SetStyling, 2962).
+-define(wxStyledTextCtrl_GetBufferedDraw, 2963).
+-define(wxStyledTextCtrl_SetBufferedDraw, 2964).
+-define(wxStyledTextCtrl_SetTabWidth, 2965).
+-define(wxStyledTextCtrl_GetTabWidth, 2966).
+-define(wxStyledTextCtrl_SetCodePage, 2967).
+-define(wxStyledTextCtrl_MarkerDefine, 2968).
+-define(wxStyledTextCtrl_MarkerSetForeground, 2969).
+-define(wxStyledTextCtrl_MarkerSetBackground, 2970).
+-define(wxStyledTextCtrl_MarkerAdd, 2971).
+-define(wxStyledTextCtrl_MarkerDelete, 2972).
+-define(wxStyledTextCtrl_MarkerDeleteAll, 2973).
+-define(wxStyledTextCtrl_MarkerGet, 2974).
+-define(wxStyledTextCtrl_MarkerNext, 2975).
+-define(wxStyledTextCtrl_MarkerPrevious, 2976).
+-define(wxStyledTextCtrl_MarkerDefineBitmap, 2977).
+-define(wxStyledTextCtrl_MarkerAddSet, 2978).
+-define(wxStyledTextCtrl_MarkerSetAlpha, 2979).
+-define(wxStyledTextCtrl_SetMarginType, 2980).
+-define(wxStyledTextCtrl_GetMarginType, 2981).
+-define(wxStyledTextCtrl_SetMarginWidth, 2982).
+-define(wxStyledTextCtrl_GetMarginWidth, 2983).
+-define(wxStyledTextCtrl_SetMarginMask, 2984).
+-define(wxStyledTextCtrl_GetMarginMask, 2985).
+-define(wxStyledTextCtrl_SetMarginSensitive, 2986).
+-define(wxStyledTextCtrl_GetMarginSensitive, 2987).
+-define(wxStyledTextCtrl_StyleClearAll, 2988).
+-define(wxStyledTextCtrl_StyleSetForeground, 2989).
+-define(wxStyledTextCtrl_StyleSetBackground, 2990).
+-define(wxStyledTextCtrl_StyleSetBold, 2991).
+-define(wxStyledTextCtrl_StyleSetItalic, 2992).
+-define(wxStyledTextCtrl_StyleSetSize, 2993).
+-define(wxStyledTextCtrl_StyleSetFaceName, 2994).
+-define(wxStyledTextCtrl_StyleSetEOLFilled, 2995).
+-define(wxStyledTextCtrl_StyleResetDefault, 2996).
+-define(wxStyledTextCtrl_StyleSetUnderline, 2997).
+-define(wxStyledTextCtrl_StyleSetCase, 2998).
+-define(wxStyledTextCtrl_StyleSetHotSpot, 2999).
+-define(wxStyledTextCtrl_SetSelForeground, 3000).
+-define(wxStyledTextCtrl_SetSelBackground, 3001).
+-define(wxStyledTextCtrl_GetSelAlpha, 3002).
+-define(wxStyledTextCtrl_SetSelAlpha, 3003).
+-define(wxStyledTextCtrl_SetCaretForeground, 3004).
+-define(wxStyledTextCtrl_CmdKeyAssign, 3005).
+-define(wxStyledTextCtrl_CmdKeyClear, 3006).
+-define(wxStyledTextCtrl_CmdKeyClearAll, 3007).
+-define(wxStyledTextCtrl_SetStyleBytes, 3008).
+-define(wxStyledTextCtrl_StyleSetVisible, 3009).
+-define(wxStyledTextCtrl_GetCaretPeriod, 3010).
+-define(wxStyledTextCtrl_SetCaretPeriod, 3011).
+-define(wxStyledTextCtrl_SetWordChars, 3012).
+-define(wxStyledTextCtrl_BeginUndoAction, 3013).
+-define(wxStyledTextCtrl_EndUndoAction, 3014).
+-define(wxStyledTextCtrl_IndicatorSetStyle, 3015).
+-define(wxStyledTextCtrl_IndicatorGetStyle, 3016).
+-define(wxStyledTextCtrl_IndicatorSetForeground, 3017).
+-define(wxStyledTextCtrl_IndicatorGetForeground, 3018).
+-define(wxStyledTextCtrl_SetWhitespaceForeground, 3019).
+-define(wxStyledTextCtrl_SetWhitespaceBackground, 3020).
+-define(wxStyledTextCtrl_GetStyleBits, 3021).
+-define(wxStyledTextCtrl_SetLineState, 3022).
+-define(wxStyledTextCtrl_GetLineState, 3023).
+-define(wxStyledTextCtrl_GetMaxLineState, 3024).
+-define(wxStyledTextCtrl_GetCaretLineVisible, 3025).
+-define(wxStyledTextCtrl_SetCaretLineVisible, 3026).
+-define(wxStyledTextCtrl_GetCaretLineBackground, 3027).
+-define(wxStyledTextCtrl_SetCaretLineBackground, 3028).
+-define(wxStyledTextCtrl_AutoCompShow, 3029).
+-define(wxStyledTextCtrl_AutoCompCancel, 3030).
+-define(wxStyledTextCtrl_AutoCompActive, 3031).
+-define(wxStyledTextCtrl_AutoCompPosStart, 3032).
+-define(wxStyledTextCtrl_AutoCompComplete, 3033).
+-define(wxStyledTextCtrl_AutoCompStops, 3034).
+-define(wxStyledTextCtrl_AutoCompSetSeparator, 3035).
+-define(wxStyledTextCtrl_AutoCompGetSeparator, 3036).
+-define(wxStyledTextCtrl_AutoCompSelect, 3037).
+-define(wxStyledTextCtrl_AutoCompSetCancelAtStart, 3038).
+-define(wxStyledTextCtrl_AutoCompGetCancelAtStart, 3039).
+-define(wxStyledTextCtrl_AutoCompSetFillUps, 3040).
+-define(wxStyledTextCtrl_AutoCompSetChooseSingle, 3041).
+-define(wxStyledTextCtrl_AutoCompGetChooseSingle, 3042).
+-define(wxStyledTextCtrl_AutoCompSetIgnoreCase, 3043).
+-define(wxStyledTextCtrl_AutoCompGetIgnoreCase, 3044).
+-define(wxStyledTextCtrl_UserListShow, 3045).
+-define(wxStyledTextCtrl_AutoCompSetAutoHide, 3046).
+-define(wxStyledTextCtrl_AutoCompGetAutoHide, 3047).
+-define(wxStyledTextCtrl_AutoCompSetDropRestOfWord, 3048).
+-define(wxStyledTextCtrl_AutoCompGetDropRestOfWord, 3049).
+-define(wxStyledTextCtrl_RegisterImage, 3050).
+-define(wxStyledTextCtrl_ClearRegisteredImages, 3051).
+-define(wxStyledTextCtrl_AutoCompGetTypeSeparator, 3052).
+-define(wxStyledTextCtrl_AutoCompSetTypeSeparator, 3053).
+-define(wxStyledTextCtrl_AutoCompSetMaxWidth, 3054).
+-define(wxStyledTextCtrl_AutoCompGetMaxWidth, 3055).
+-define(wxStyledTextCtrl_AutoCompSetMaxHeight, 3056).
+-define(wxStyledTextCtrl_AutoCompGetMaxHeight, 3057).
+-define(wxStyledTextCtrl_SetIndent, 3058).
+-define(wxStyledTextCtrl_GetIndent, 3059).
+-define(wxStyledTextCtrl_SetUseTabs, 3060).
+-define(wxStyledTextCtrl_GetUseTabs, 3061).
+-define(wxStyledTextCtrl_SetLineIndentation, 3062).
+-define(wxStyledTextCtrl_GetLineIndentation, 3063).
+-define(wxStyledTextCtrl_GetLineIndentPosition, 3064).
+-define(wxStyledTextCtrl_GetColumn, 3065).
+-define(wxStyledTextCtrl_SetUseHorizontalScrollBar, 3066).
+-define(wxStyledTextCtrl_GetUseHorizontalScrollBar, 3067).
+-define(wxStyledTextCtrl_SetIndentationGuides, 3068).
+-define(wxStyledTextCtrl_GetIndentationGuides, 3069).
+-define(wxStyledTextCtrl_SetHighlightGuide, 3070).
+-define(wxStyledTextCtrl_GetHighlightGuide, 3071).
+-define(wxStyledTextCtrl_GetLineEndPosition, 3072).
+-define(wxStyledTextCtrl_GetCodePage, 3073).
+-define(wxStyledTextCtrl_GetCaretForeground, 3074).
+-define(wxStyledTextCtrl_GetReadOnly, 3075).
+-define(wxStyledTextCtrl_SetCurrentPos, 3076).
+-define(wxStyledTextCtrl_SetSelectionStart, 3077).
+-define(wxStyledTextCtrl_GetSelectionStart, 3078).
+-define(wxStyledTextCtrl_SetSelectionEnd, 3079).
+-define(wxStyledTextCtrl_GetSelectionEnd, 3080).
+-define(wxStyledTextCtrl_SetPrintMagnification, 3081).
+-define(wxStyledTextCtrl_GetPrintMagnification, 3082).
+-define(wxStyledTextCtrl_SetPrintColourMode, 3083).
+-define(wxStyledTextCtrl_GetPrintColourMode, 3084).
+-define(wxStyledTextCtrl_FindText, 3085).
+-define(wxStyledTextCtrl_FormatRange, 3086).
+-define(wxStyledTextCtrl_GetFirstVisibleLine, 3087).
+-define(wxStyledTextCtrl_GetLine, 3088).
+-define(wxStyledTextCtrl_GetLineCount, 3089).
+-define(wxStyledTextCtrl_SetMarginLeft, 3090).
+-define(wxStyledTextCtrl_GetMarginLeft, 3091).
+-define(wxStyledTextCtrl_SetMarginRight, 3092).
+-define(wxStyledTextCtrl_GetMarginRight, 3093).
+-define(wxStyledTextCtrl_GetModify, 3094).
+-define(wxStyledTextCtrl_SetSelection, 3095).
+-define(wxStyledTextCtrl_GetSelectedText, 3096).
+-define(wxStyledTextCtrl_GetTextRange, 3097).
+-define(wxStyledTextCtrl_HideSelection, 3098).
+-define(wxStyledTextCtrl_LineFromPosition, 3099).
+-define(wxStyledTextCtrl_PositionFromLine, 3100).
+-define(wxStyledTextCtrl_LineScroll, 3101).
+-define(wxStyledTextCtrl_EnsureCaretVisible, 3102).
+-define(wxStyledTextCtrl_ReplaceSelection, 3103).
+-define(wxStyledTextCtrl_SetReadOnly, 3104).
+-define(wxStyledTextCtrl_CanPaste, 3105).
+-define(wxStyledTextCtrl_CanUndo, 3106).
+-define(wxStyledTextCtrl_EmptyUndoBuffer, 3107).
+-define(wxStyledTextCtrl_Undo, 3108).
+-define(wxStyledTextCtrl_Cut, 3109).
+-define(wxStyledTextCtrl_Copy, 3110).
+-define(wxStyledTextCtrl_Paste, 3111).
+-define(wxStyledTextCtrl_Clear, 3112).
+-define(wxStyledTextCtrl_SetText, 3113).
+-define(wxStyledTextCtrl_GetText, 3114).
+-define(wxStyledTextCtrl_GetTextLength, 3115).
+-define(wxStyledTextCtrl_GetOvertype, 3116).
+-define(wxStyledTextCtrl_SetCaretWidth, 3117).
+-define(wxStyledTextCtrl_GetCaretWidth, 3118).
+-define(wxStyledTextCtrl_SetTargetStart, 3119).
+-define(wxStyledTextCtrl_GetTargetStart, 3120).
+-define(wxStyledTextCtrl_SetTargetEnd, 3121).
+-define(wxStyledTextCtrl_GetTargetEnd, 3122).
+-define(wxStyledTextCtrl_ReplaceTarget, 3123).
+-define(wxStyledTextCtrl_SearchInTarget, 3124).
+-define(wxStyledTextCtrl_SetSearchFlags, 3125).
+-define(wxStyledTextCtrl_GetSearchFlags, 3126).
+-define(wxStyledTextCtrl_CallTipShow, 3127).
+-define(wxStyledTextCtrl_CallTipCancel, 3128).
+-define(wxStyledTextCtrl_CallTipActive, 3129).
+-define(wxStyledTextCtrl_CallTipPosAtStart, 3130).
+-define(wxStyledTextCtrl_CallTipSetHighlight, 3131).
+-define(wxStyledTextCtrl_CallTipSetBackground, 3132).
+-define(wxStyledTextCtrl_CallTipSetForeground, 3133).
+-define(wxStyledTextCtrl_CallTipSetForegroundHighlight, 3134).
+-define(wxStyledTextCtrl_CallTipUseStyle, 3135).
+-define(wxStyledTextCtrl_VisibleFromDocLine, 3136).
+-define(wxStyledTextCtrl_DocLineFromVisible, 3137).
+-define(wxStyledTextCtrl_WrapCount, 3138).
+-define(wxStyledTextCtrl_SetFoldLevel, 3139).
+-define(wxStyledTextCtrl_GetFoldLevel, 3140).
+-define(wxStyledTextCtrl_GetLastChild, 3141).
+-define(wxStyledTextCtrl_GetFoldParent, 3142).
+-define(wxStyledTextCtrl_ShowLines, 3143).
+-define(wxStyledTextCtrl_HideLines, 3144).
+-define(wxStyledTextCtrl_GetLineVisible, 3145).
+-define(wxStyledTextCtrl_SetFoldExpanded, 3146).
+-define(wxStyledTextCtrl_GetFoldExpanded, 3147).
+-define(wxStyledTextCtrl_ToggleFold, 3148).
+-define(wxStyledTextCtrl_EnsureVisible, 3149).
+-define(wxStyledTextCtrl_SetFoldFlags, 3150).
+-define(wxStyledTextCtrl_EnsureVisibleEnforcePolicy, 3151).
+-define(wxStyledTextCtrl_SetTabIndents, 3152).
+-define(wxStyledTextCtrl_GetTabIndents, 3153).
+-define(wxStyledTextCtrl_SetBackSpaceUnIndents, 3154).
+-define(wxStyledTextCtrl_GetBackSpaceUnIndents, 3155).
+-define(wxStyledTextCtrl_SetMouseDwellTime, 3156).
+-define(wxStyledTextCtrl_GetMouseDwellTime, 3157).
+-define(wxStyledTextCtrl_WordStartPosition, 3158).
+-define(wxStyledTextCtrl_WordEndPosition, 3159).
+-define(wxStyledTextCtrl_SetWrapMode, 3160).
+-define(wxStyledTextCtrl_GetWrapMode, 3161).
+-define(wxStyledTextCtrl_SetWrapVisualFlags, 3162).
+-define(wxStyledTextCtrl_GetWrapVisualFlags, 3163).
+-define(wxStyledTextCtrl_SetWrapVisualFlagsLocation, 3164).
+-define(wxStyledTextCtrl_GetWrapVisualFlagsLocation, 3165).
+-define(wxStyledTextCtrl_SetWrapStartIndent, 3166).
+-define(wxStyledTextCtrl_GetWrapStartIndent, 3167).
+-define(wxStyledTextCtrl_SetLayoutCache, 3168).
+-define(wxStyledTextCtrl_GetLayoutCache, 3169).
+-define(wxStyledTextCtrl_SetScrollWidth, 3170).
+-define(wxStyledTextCtrl_GetScrollWidth, 3171).
+-define(wxStyledTextCtrl_TextWidth, 3172).
+-define(wxStyledTextCtrl_GetEndAtLastLine, 3173).
+-define(wxStyledTextCtrl_TextHeight, 3174).
+-define(wxStyledTextCtrl_SetUseVerticalScrollBar, 3175).
+-define(wxStyledTextCtrl_GetUseVerticalScrollBar, 3176).
+-define(wxStyledTextCtrl_AppendText, 3177).
+-define(wxStyledTextCtrl_GetTwoPhaseDraw, 3178).
+-define(wxStyledTextCtrl_SetTwoPhaseDraw, 3179).
+-define(wxStyledTextCtrl_TargetFromSelection, 3180).
+-define(wxStyledTextCtrl_LinesJoin, 3181).
+-define(wxStyledTextCtrl_LinesSplit, 3182).
+-define(wxStyledTextCtrl_SetFoldMarginColour, 3183).
+-define(wxStyledTextCtrl_SetFoldMarginHiColour, 3184).
+-define(wxStyledTextCtrl_LineDown, 3185).
+-define(wxStyledTextCtrl_LineDownExtend, 3186).
+-define(wxStyledTextCtrl_LineUp, 3187).
+-define(wxStyledTextCtrl_LineUpExtend, 3188).
+-define(wxStyledTextCtrl_CharLeft, 3189).
+-define(wxStyledTextCtrl_CharLeftExtend, 3190).
+-define(wxStyledTextCtrl_CharRight, 3191).
+-define(wxStyledTextCtrl_CharRightExtend, 3192).
+-define(wxStyledTextCtrl_WordLeft, 3193).
+-define(wxStyledTextCtrl_WordLeftExtend, 3194).
+-define(wxStyledTextCtrl_WordRight, 3195).
+-define(wxStyledTextCtrl_WordRightExtend, 3196).
+-define(wxStyledTextCtrl_Home, 3197).
+-define(wxStyledTextCtrl_HomeExtend, 3198).
+-define(wxStyledTextCtrl_LineEnd, 3199).
+-define(wxStyledTextCtrl_LineEndExtend, 3200).
+-define(wxStyledTextCtrl_DocumentStart, 3201).
+-define(wxStyledTextCtrl_DocumentStartExtend, 3202).
+-define(wxStyledTextCtrl_DocumentEnd, 3203).
+-define(wxStyledTextCtrl_DocumentEndExtend, 3204).
+-define(wxStyledTextCtrl_PageUp, 3205).
+-define(wxStyledTextCtrl_PageUpExtend, 3206).
+-define(wxStyledTextCtrl_PageDown, 3207).
+-define(wxStyledTextCtrl_PageDownExtend, 3208).
+-define(wxStyledTextCtrl_EditToggleOvertype, 3209).
+-define(wxStyledTextCtrl_Cancel, 3210).
+-define(wxStyledTextCtrl_DeleteBack, 3211).
+-define(wxStyledTextCtrl_Tab, 3212).
+-define(wxStyledTextCtrl_BackTab, 3213).
+-define(wxStyledTextCtrl_NewLine, 3214).
+-define(wxStyledTextCtrl_FormFeed, 3215).
+-define(wxStyledTextCtrl_VCHome, 3216).
+-define(wxStyledTextCtrl_VCHomeExtend, 3217).
+-define(wxStyledTextCtrl_ZoomIn, 3218).
+-define(wxStyledTextCtrl_ZoomOut, 3219).
+-define(wxStyledTextCtrl_DelWordLeft, 3220).
+-define(wxStyledTextCtrl_DelWordRight, 3221).
+-define(wxStyledTextCtrl_LineCut, 3222).
+-define(wxStyledTextCtrl_LineDelete, 3223).
+-define(wxStyledTextCtrl_LineTranspose, 3224).
+-define(wxStyledTextCtrl_LineDuplicate, 3225).
+-define(wxStyledTextCtrl_LowerCase, 3226).
+-define(wxStyledTextCtrl_UpperCase, 3227).
+-define(wxStyledTextCtrl_LineScrollDown, 3228).
+-define(wxStyledTextCtrl_LineScrollUp, 3229).
+-define(wxStyledTextCtrl_DeleteBackNotLine, 3230).
+-define(wxStyledTextCtrl_HomeDisplay, 3231).
+-define(wxStyledTextCtrl_HomeDisplayExtend, 3232).
+-define(wxStyledTextCtrl_LineEndDisplay, 3233).
+-define(wxStyledTextCtrl_LineEndDisplayExtend, 3234).
+-define(wxStyledTextCtrl_HomeWrapExtend, 3235).
+-define(wxStyledTextCtrl_LineEndWrap, 3236).
+-define(wxStyledTextCtrl_LineEndWrapExtend, 3237).
+-define(wxStyledTextCtrl_VCHomeWrap, 3238).
+-define(wxStyledTextCtrl_VCHomeWrapExtend, 3239).
+-define(wxStyledTextCtrl_LineCopy, 3240).
+-define(wxStyledTextCtrl_MoveCaretInsideView, 3241).
+-define(wxStyledTextCtrl_LineLength, 3242).
+-define(wxStyledTextCtrl_BraceHighlight, 3243).
+-define(wxStyledTextCtrl_BraceBadLight, 3244).
+-define(wxStyledTextCtrl_BraceMatch, 3245).
+-define(wxStyledTextCtrl_GetViewEOL, 3246).
+-define(wxStyledTextCtrl_SetViewEOL, 3247).
+-define(wxStyledTextCtrl_SetModEventMask, 3248).
+-define(wxStyledTextCtrl_GetEdgeColumn, 3249).
+-define(wxStyledTextCtrl_SetEdgeColumn, 3250).
+-define(wxStyledTextCtrl_SetEdgeMode, 3251).
+-define(wxStyledTextCtrl_GetEdgeMode, 3252).
+-define(wxStyledTextCtrl_GetEdgeColour, 3253).
+-define(wxStyledTextCtrl_SetEdgeColour, 3254).
+-define(wxStyledTextCtrl_SearchAnchor, 3255).
+-define(wxStyledTextCtrl_SearchNext, 3256).
+-define(wxStyledTextCtrl_SearchPrev, 3257).
+-define(wxStyledTextCtrl_LinesOnScreen, 3258).
+-define(wxStyledTextCtrl_UsePopUp, 3259).
+-define(wxStyledTextCtrl_SelectionIsRectangle, 3260).
+-define(wxStyledTextCtrl_SetZoom, 3261).
+-define(wxStyledTextCtrl_GetZoom, 3262).
+-define(wxStyledTextCtrl_GetModEventMask, 3263).
+-define(wxStyledTextCtrl_SetSTCFocus, 3264).
+-define(wxStyledTextCtrl_GetSTCFocus, 3265).
+-define(wxStyledTextCtrl_SetStatus, 3266).
+-define(wxStyledTextCtrl_GetStatus, 3267).
+-define(wxStyledTextCtrl_SetMouseDownCaptures, 3268).
+-define(wxStyledTextCtrl_GetMouseDownCaptures, 3269).
+-define(wxStyledTextCtrl_SetSTCCursor, 3270).
+-define(wxStyledTextCtrl_GetSTCCursor, 3271).
+-define(wxStyledTextCtrl_SetControlCharSymbol, 3272).
+-define(wxStyledTextCtrl_GetControlCharSymbol, 3273).
+-define(wxStyledTextCtrl_WordPartLeft, 3274).
+-define(wxStyledTextCtrl_WordPartLeftExtend, 3275).
+-define(wxStyledTextCtrl_WordPartRight, 3276).
+-define(wxStyledTextCtrl_WordPartRightExtend, 3277).
+-define(wxStyledTextCtrl_SetVisiblePolicy, 3278).
+-define(wxStyledTextCtrl_DelLineLeft, 3279).
+-define(wxStyledTextCtrl_DelLineRight, 3280).
+-define(wxStyledTextCtrl_GetXOffset, 3281).
+-define(wxStyledTextCtrl_ChooseCaretX, 3282).
+-define(wxStyledTextCtrl_SetXCaretPolicy, 3283).
+-define(wxStyledTextCtrl_SetYCaretPolicy, 3284).
+-define(wxStyledTextCtrl_GetPrintWrapMode, 3285).
+-define(wxStyledTextCtrl_SetHotspotActiveForeground, 3286).
+-define(wxStyledTextCtrl_SetHotspotActiveBackground, 3287).
+-define(wxStyledTextCtrl_SetHotspotActiveUnderline, 3288).
+-define(wxStyledTextCtrl_SetHotspotSingleLine, 3289).
+-define(wxStyledTextCtrl_ParaDownExtend, 3290).
+-define(wxStyledTextCtrl_ParaUp, 3291).
+-define(wxStyledTextCtrl_ParaUpExtend, 3292).
+-define(wxStyledTextCtrl_PositionBefore, 3293).
+-define(wxStyledTextCtrl_PositionAfter, 3294).
+-define(wxStyledTextCtrl_CopyRange, 3295).
+-define(wxStyledTextCtrl_CopyText, 3296).
+-define(wxStyledTextCtrl_SetSelectionMode, 3297).
+-define(wxStyledTextCtrl_GetSelectionMode, 3298).
+-define(wxStyledTextCtrl_LineDownRectExtend, 3299).
+-define(wxStyledTextCtrl_LineUpRectExtend, 3300).
+-define(wxStyledTextCtrl_CharLeftRectExtend, 3301).
+-define(wxStyledTextCtrl_CharRightRectExtend, 3302).
+-define(wxStyledTextCtrl_HomeRectExtend, 3303).
+-define(wxStyledTextCtrl_VCHomeRectExtend, 3304).
+-define(wxStyledTextCtrl_LineEndRectExtend, 3305).
+-define(wxStyledTextCtrl_PageUpRectExtend, 3306).
+-define(wxStyledTextCtrl_PageDownRectExtend, 3307).
+-define(wxStyledTextCtrl_StutteredPageUp, 3308).
+-define(wxStyledTextCtrl_StutteredPageUpExtend, 3309).
+-define(wxStyledTextCtrl_StutteredPageDown, 3310).
+-define(wxStyledTextCtrl_StutteredPageDownExtend, 3311).
+-define(wxStyledTextCtrl_WordLeftEnd, 3312).
+-define(wxStyledTextCtrl_WordLeftEndExtend, 3313).
+-define(wxStyledTextCtrl_WordRightEnd, 3314).
+-define(wxStyledTextCtrl_WordRightEndExtend, 3315).
+-define(wxStyledTextCtrl_SetWhitespaceChars, 3316).
+-define(wxStyledTextCtrl_SetCharsDefault, 3317).
+-define(wxStyledTextCtrl_AutoCompGetCurrent, 3318).
+-define(wxStyledTextCtrl_Allocate, 3319).
+-define(wxStyledTextCtrl_FindColumn, 3320).
+-define(wxStyledTextCtrl_GetCaretSticky, 3321).
+-define(wxStyledTextCtrl_SetCaretSticky, 3322).
+-define(wxStyledTextCtrl_ToggleCaretSticky, 3323).
+-define(wxStyledTextCtrl_SetPasteConvertEndings, 3324).
+-define(wxStyledTextCtrl_GetPasteConvertEndings, 3325).
+-define(wxStyledTextCtrl_SelectionDuplicate, 3326).
+-define(wxStyledTextCtrl_SetCaretLineBackAlpha, 3327).
+-define(wxStyledTextCtrl_GetCaretLineBackAlpha, 3328).
+-define(wxStyledTextCtrl_StartRecord, 3329).
+-define(wxStyledTextCtrl_StopRecord, 3330).
+-define(wxStyledTextCtrl_SetLexer, 3331).
+-define(wxStyledTextCtrl_GetLexer, 3332).
+-define(wxStyledTextCtrl_Colourise, 3333).
+-define(wxStyledTextCtrl_SetProperty, 3334).
+-define(wxStyledTextCtrl_SetKeyWords, 3335).
+-define(wxStyledTextCtrl_SetLexerLanguage, 3336).
+-define(wxStyledTextCtrl_GetProperty, 3337).
+-define(wxStyledTextCtrl_GetStyleBitsNeeded, 3338).
+-define(wxStyledTextCtrl_GetCurrentLine, 3339).
+-define(wxStyledTextCtrl_StyleSetSpec, 3340).
+-define(wxStyledTextCtrl_StyleSetFont, 3341).
+-define(wxStyledTextCtrl_StyleSetFontAttr, 3342).
+-define(wxStyledTextCtrl_StyleSetCharacterSet, 3343).
+-define(wxStyledTextCtrl_StyleSetFontEncoding, 3344).
+-define(wxStyledTextCtrl_CmdKeyExecute, 3345).
+-define(wxStyledTextCtrl_SetMargins, 3346).
+-define(wxStyledTextCtrl_GetSelection, 3347).
+-define(wxStyledTextCtrl_PointFromPosition, 3348).
+-define(wxStyledTextCtrl_ScrollToLine, 3349).
+-define(wxStyledTextCtrl_ScrollToColumn, 3350).
+-define(wxStyledTextCtrl_SetVScrollBar, 3351).
+-define(wxStyledTextCtrl_SetHScrollBar, 3352).
+-define(wxStyledTextCtrl_GetLastKeydownProcessed, 3353).
+-define(wxStyledTextCtrl_SetLastKeydownProcessed, 3354).
+-define(wxStyledTextCtrl_SaveFile, 3355).
+-define(wxStyledTextCtrl_LoadFile, 3356).
+-define(wxStyledTextCtrl_DoDragOver, 3357).
+-define(wxStyledTextCtrl_DoDropText, 3358).
+-define(wxStyledTextCtrl_GetUseAntiAliasing, 3359).
+-define(wxStyledTextCtrl_AddTextRaw, 3360).
+-define(wxStyledTextCtrl_InsertTextRaw, 3361).
+-define(wxStyledTextCtrl_GetCurLineRaw, 3362).
+-define(wxStyledTextCtrl_GetLineRaw, 3363).
+-define(wxStyledTextCtrl_GetSelectedTextRaw, 3364).
+-define(wxStyledTextCtrl_GetTextRangeRaw, 3365).
+-define(wxStyledTextCtrl_SetTextRaw, 3366).
+-define(wxStyledTextCtrl_GetTextRaw, 3367).
+-define(wxStyledTextCtrl_AppendTextRaw, 3368).
+-define(wxArtProvider_GetBitmap, 3369).
+-define(wxArtProvider_GetIcon, 3370).
+-define(wxTreeEvent_GetKeyCode, 3371).
+-define(wxTreeEvent_GetItem, 3372).
+-define(wxTreeEvent_GetKeyEvent, 3373).
+-define(wxTreeEvent_GetLabel, 3374).
+-define(wxTreeEvent_GetOldItem, 3375).
+-define(wxTreeEvent_GetPoint, 3376).
+-define(wxTreeEvent_IsEditCancelled, 3377).
+-define(wxTreeEvent_SetToolTip, 3378).
+-define(wxBookCtrlEvent_GetOldSelection, 3379).
+-define(wxBookCtrlEvent_GetSelection, 3380).
+-define(wxBookCtrlEvent_SetOldSelection, 3381).
+-define(wxBookCtrlEvent_SetSelection, 3382).
+-define(wxFileDataObject_new, 3383).
+-define(wxFileDataObject_AddFile, 3384).
+-define(wxFileDataObject_GetFilenames, 3385).
+-define(wxFileDataObject_destroy, 3386).
+-define(wxTextDataObject_new, 3387).
+-define(wxTextDataObject_GetTextLength, 3388).
+-define(wxTextDataObject_GetText, 3389).
+-define(wxTextDataObject_SetText, 3390).
+-define(wxTextDataObject_destroy, 3391).
+-define(wxBitmapDataObject_new_1_1, 3392).
+-define(wxBitmapDataObject_new_1_0, 3393).
+-define(wxBitmapDataObject_GetBitmap, 3394).
+-define(wxBitmapDataObject_SetBitmap, 3395).
+-define(wxBitmapDataObject_destroy, 3396).
+-define(wxClipboard_new, 3397).
+-define(wxClipboard_destruct, 3398).
+-define(wxClipboard_AddData, 3399).
+-define(wxClipboard_Clear, 3400).
+-define(wxClipboard_Close, 3401).
+-define(wxClipboard_Flush, 3402).
+-define(wxClipboard_GetData, 3403).
+-define(wxClipboard_IsOpened, 3404).
+-define(wxClipboard_Open, 3405).
+-define(wxClipboard_SetData, 3406).
+-define(wxClipboard_UsePrimarySelection, 3407).
+-define(wxClipboard_IsSupported, 3408).
+-define(wxClipboard_Get, 3409).
+-define(wxSpinEvent_GetPosition, 3410).
+-define(wxSpinEvent_SetPosition, 3411).
+-define(wxSplitterWindow_new_0, 3412).
+-define(wxSplitterWindow_new_2, 3413).
+-define(wxSplitterWindow_destruct, 3414).
+-define(wxSplitterWindow_Create, 3415).
+-define(wxSplitterWindow_GetMinimumPaneSize, 3416).
+-define(wxSplitterWindow_GetSashGravity, 3417).
+-define(wxSplitterWindow_GetSashPosition, 3418).
+-define(wxSplitterWindow_GetSplitMode, 3419).
+-define(wxSplitterWindow_GetWindow1, 3420).
+-define(wxSplitterWindow_GetWindow2, 3421).
+-define(wxSplitterWindow_Initialize, 3422).
+-define(wxSplitterWindow_IsSplit, 3423).
+-define(wxSplitterWindow_ReplaceWindow, 3424).
+-define(wxSplitterWindow_SetSashGravity, 3425).
+-define(wxSplitterWindow_SetSashPosition, 3426).
+-define(wxSplitterWindow_SetMinimumPaneSize, 3427).
+-define(wxSplitterWindow_SetSplitMode, 3428).
+-define(wxSplitterWindow_SplitHorizontally, 3429).
+-define(wxSplitterWindow_SplitVertically, 3430).
+-define(wxSplitterWindow_Unsplit, 3431).
+-define(wxSplitterWindow_UpdateSize, 3432).
+-define(wxSplitterEvent_GetSashPosition, 3433).
+-define(wxSplitterEvent_GetX, 3434).
+-define(wxSplitterEvent_GetY, 3435).
+-define(wxSplitterEvent_GetWindowBeingRemoved, 3436).
+-define(wxSplitterEvent_SetSashPosition, 3437).
+-define(wxHtmlWindow_new_0, 3438).
+-define(wxHtmlWindow_new_2, 3439).
+-define(wxHtmlWindow_AppendToPage, 3440).
+-define(wxHtmlWindow_GetOpenedAnchor, 3441).
+-define(wxHtmlWindow_GetOpenedPage, 3442).
+-define(wxHtmlWindow_GetOpenedPageTitle, 3443).
+-define(wxHtmlWindow_GetRelatedFrame, 3444).
+-define(wxHtmlWindow_HistoryBack, 3445).
+-define(wxHtmlWindow_HistoryCanBack, 3446).
+-define(wxHtmlWindow_HistoryCanForward, 3447).
+-define(wxHtmlWindow_HistoryClear, 3448).
+-define(wxHtmlWindow_HistoryForward, 3449).
+-define(wxHtmlWindow_LoadFile, 3450).
+-define(wxHtmlWindow_LoadPage, 3451).
+-define(wxHtmlWindow_SelectAll, 3452).
+-define(wxHtmlWindow_SelectionToText, 3453).
+-define(wxHtmlWindow_SelectLine, 3454).
+-define(wxHtmlWindow_SelectWord, 3455).
+-define(wxHtmlWindow_SetBorders, 3456).
+-define(wxHtmlWindow_SetFonts, 3457).
+-define(wxHtmlWindow_SetPage, 3458).
+-define(wxHtmlWindow_SetRelatedFrame, 3459).
+-define(wxHtmlWindow_SetRelatedStatusBar_1, 3460).
+-define(wxHtmlWindow_SetRelatedStatusBar_2, 3461).
+-define(wxHtmlWindow_ToText, 3462).
+-define(wxHtmlWindow_destroy, 3463).
+-define(wxHtmlLinkEvent_GetLinkInfo, 3464).
+-define(wxSystemSettings_GetColour, 3465).
+-define(wxSystemSettings_GetFont, 3466).
+-define(wxSystemSettings_GetMetric, 3467).
+-define(wxSystemSettings_GetScreenType, 3468).
+-define(wxSystemOptions_GetOption, 3469).
+-define(wxSystemOptions_GetOptionInt, 3470).
+-define(wxSystemOptions_HasOption, 3471).
+-define(wxSystemOptions_IsFalse, 3472).
+-define(wxSystemOptions_SetOption_2_1, 3473).
+-define(wxSystemOptions_SetOption_2_0, 3474).
+-define(wxAuiNotebookEvent_SetSelection, 3475).
+-define(wxAuiNotebookEvent_GetSelection, 3476).
+-define(wxAuiNotebookEvent_SetOldSelection, 3477).
+-define(wxAuiNotebookEvent_GetOldSelection, 3478).
+-define(wxAuiNotebookEvent_SetDragSource, 3479).
+-define(wxAuiNotebookEvent_GetDragSource, 3480).
+-define(wxAuiManagerEvent_SetManager, 3481).
+-define(wxAuiManagerEvent_GetManager, 3482).
+-define(wxAuiManagerEvent_SetPane, 3483).
+-define(wxAuiManagerEvent_GetPane, 3484).
+-define(wxAuiManagerEvent_SetButton, 3485).
+-define(wxAuiManagerEvent_GetButton, 3486).
+-define(wxAuiManagerEvent_SetDC, 3487).
+-define(wxAuiManagerEvent_GetDC, 3488).
+-define(wxAuiManagerEvent_Veto, 3489).
+-define(wxAuiManagerEvent_GetVeto, 3490).
+-define(wxAuiManagerEvent_SetCanVeto, 3491).
+-define(wxAuiManagerEvent_CanVeto, 3492).
+-define(wxLogNull_new, 3493).
+-define(wxLogNull_destruct, 3494).
+-define(wxTaskBarIcon_new, 3495).
+-define(wxTaskBarIcon_destruct, 3496).
+-define(wxTaskBarIcon_PopupMenu, 3497).
+-define(wxTaskBarIcon_RemoveIcon, 3498).
+-define(wxTaskBarIcon_SetIcon, 3499).
+-define(wxLocale_new_0, 3500).
+-define(wxLocale_new_2_0, 3501).
+-define(wxLocale_new_2_1, 3502).
+-define(wxLocale_destruct, 3503).
+-define(wxLocale_Init_1, 3504).
+-define(wxLocale_Init_2, 3505).
+-define(wxLocale_AddCatalog_1, 3506).
+-define(wxLocale_AddCatalog_2, 3507).
+-define(wxLocale_AddCatalog_3, 3508).
+-define(wxLocale_AddCatalogLookupPathPrefix, 3509).
+-define(wxLocale_GetCanonicalName, 3510).
+-define(wxLocale_GetLanguage, 3511).
+-define(wxLocale_GetLanguageName, 3512).
+-define(wxLocale_GetLocale, 3513).
+-define(wxLocale_GetName, 3514).
+-define(wxLocale_GetString_2, 3515).
+-define(wxLocale_GetString_4, 3516).
+-define(wxLocale_GetHeaderValue, 3517).
+-define(wxLocale_GetSysName, 3518).
+-define(wxLocale_GetSystemEncoding, 3519).
+-define(wxLocale_GetSystemEncodingName, 3520).
+-define(wxLocale_GetSystemLanguage, 3521).
+-define(wxLocale_IsLoaded, 3522).
+-define(wxLocale_IsOk, 3523).
+-define(wxActivateEvent_GetActive, 3524).
+-define(wxPopupWindow_new_0, 3525).
+-define(wxPopupWindow_new_2, 3526).
+-define(wxPopupWindow_Create, 3527).
+-define(wxPopupWindow_Position, 3528).
+-define(wxPopupWindow_destroy, 3529).
+-define(wxPopupTransientWindow_new_0, 3530).
+-define(wxPopupTransientWindow_new_2, 3531).
+-define(wxPopupTransientWindow_Popup, 3532).
+-define(wxPopupTransientWindow_Dismiss, 3533).
+-define(wxPopupTransientWindow_destroy, 3534).
+-define(wxOverlay_new, 3535).
+-define(wxOverlay_destruct, 3536).
+-define(wxOverlay_Reset, 3537).
+-define(wxDCOverlay_new_6, 3538).
+-define(wxDCOverlay_new_2, 3539).
+-define(wxDCOverlay_destruct, 3540).
+-define(wxDCOverlay_Clear, 3541).
+-define(wxDropFilesEvent_GetPosition, 3542).
+-define(wxDropFilesEvent_GetNumberOfFiles, 3543).
+-define(wxDropFilesEvent_GetFiles, 3544).
+-define(wxDisplay_new_0, 3545).
+-define(wxDisplay_new_1_0, 3546).
+-define(wxDisplay_new_1_1, 3547).
+-define(wxDisplay_destruct, 3548).
+-define(wxDisplay_IsOk, 3549).
+-define(wxDisplay_GetClientArea, 3550).
+-define(wxDisplay_GetGeometry, 3551).
+-define(wxDisplay_GetName, 3552).
+-define(wxDisplay_IsPrimary, 3553).
+-define(wxDisplay_GetCount, 3554).
+-define(wxDisplay_GetFromPoint, 3555).
+-define(wxDisplay_GetFromWindow, 3556).
+-define(wxDisplay_GetPPI, 3557).
+-define(wxGCDC_new_1, 3558).
+-define(wxGCDC_new_0, 3561).
+-define(wxGCDC_destruct, 3562).
+-define(wxGCDC_GetGraphicsContext, 3563).
+-define(wxGCDC_SetGraphicsContext, 3564).
+-define(wxNotificationMessage_new_0, 3565).
+-define(wxNotificationMessage_new_2, 3566).
+-define(wxNotificationMessage_destruct, 3567).
+-define(wxNotificationMessage_AddAction, 3568).
+-define(wxNotificationMessage_Close, 3569).
+-define(wxNotificationMessage_SetFlags, 3570).
+-define(wxNotificationMessage_SetIcon, 3571).
+-define(wxNotificationMessage_SetMessage, 3572).
+-define(wxNotificationMessage_SetParent, 3573).
+-define(wxNotificationMessage_SetTitle, 3574).
+-define(wxNotificationMessage_Show, 3575).
+-define(wxNotificationMessage_UseTaskBarIcon, 3576).
+-define(wxNotificationMessage_MSWUseToasts, 3577).
+-define(wxWebView_New, 3579).
+-define(wxWebView_GetCurrentTitle, 3580).
+-define(wxWebView_GetCurrentURL, 3581).
+-define(wxWebView_GetPageSource, 3582).
+-define(wxWebView_GetPageText, 3583).
+-define(wxWebView_IsBusy, 3584).
+-define(wxWebView_IsEditable, 3585).
+-define(wxWebView_LoadURL, 3586).
+-define(wxWebView_Print, 3587).
+-define(wxWebView_Reload, 3588).
+-define(wxWebView_RunScript, 3589).
+-define(wxWebView_SetEditable, 3590).
+-define(wxWebView_SetPage, 3591).
+-define(wxWebView_Stop, 3592).
+-define(wxWebView_CanCopy, 3593).
+-define(wxWebView_CanCut, 3594).
+-define(wxWebView_CanPaste, 3595).
+-define(wxWebView_Copy, 3596).
+-define(wxWebView_Cut, 3597).
+-define(wxWebView_Paste, 3598).
+-define(wxWebView_EnableContextMenu, 3599).
+-define(wxWebView_IsContextMenuEnabled, 3600).
+-define(wxWebView_CanGoBack, 3601).
+-define(wxWebView_CanGoForward, 3602).
+-define(wxWebView_ClearHistory, 3603).
+-define(wxWebView_EnableHistory, 3604).
+-define(wxWebView_GoBack, 3605).
+-define(wxWebView_GoForward, 3606).
+-define(wxWebView_ClearSelection, 3607).
+-define(wxWebView_DeleteSelection, 3608).
+-define(wxWebView_GetSelectedSource, 3609).
+-define(wxWebView_GetSelectedText, 3610).
+-define(wxWebView_HasSelection, 3611).
+-define(wxWebView_SelectAll, 3612).
+-define(wxWebView_CanRedo, 3613).
+-define(wxWebView_CanUndo, 3614).
+-define(wxWebView_Redo, 3615).
+-define(wxWebView_Undo, 3616).
+-define(wxWebView_Find, 3617).
+-define(wxWebView_CanSetZoomType, 3618).
+-define(wxWebView_GetZoom, 3619).
+-define(wxWebView_GetZoomType, 3620).
+-define(wxWebView_SetZoom, 3621).
+-define(wxWebView_SetZoomType, 3622).
+-define(wxWebView_GetZoomFactor, 3623).
+-define(wxWebView_SetZoomFactor, 3624).
+-define(wxWebView_IsBackendAvailable, 3625).
+-define(wxWebViewEvent_GetString, 3626).
+-define(wxWebViewEvent_GetInt, 3627).
+-define(wxWebViewEvent_GetTarget, 3628).
+-define(wxWebViewEvent_GetURL, 3629).
diff --git a/lib/wx/src/wx.app.src b/lib/wx/src/wx.app.src
index 92984f13b5..91ee7a7589 100644
--- a/lib/wx/src/wx.app.src
+++ b/lib/wx/src/wx.app.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -35,5 +35,5 @@
{registered, []},
{applications, [stdlib, kernel]},
{env, []},
- {runtime_dependencies, ["stdlib-2.0","kernel-3.0","erts-6.0"]}
+ {runtime_dependencies, ["stdlib-3.15","kernel-8.0","erts-12.0"]}
]}.
diff --git a/lib/wx/src/wx.erl b/lib/wx/src/wx.erl
index b04d39de8a..22fcf1f57b 100644
--- a/lib/wx/src/wx.erl
+++ b/lib/wx/src/wx.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -149,14 +149,14 @@ set_env(#wx_env{sv=Pid} = Env) ->
%% all MacOSX specific events corresponding to MacNewFile() and friends
%% from wxWidgets wxApp https://docs.wxwidgets.org/trunk/classwx_app.html
%%
-%% * `{file_new, ""}`
-%% * `{file_open, Filename}`
-%% * `{file_print, Filename}`
-%% * `{url_open, Url}`
+%% * `{new_file, ""}`
+%% * `{open_file, Filename}`
+%% * `{print_file, Filename}`
+%% * `{open_url, Url}`
%% * `{reopen_app, ""}`
%%
%% The call always returns ok but will have sent any already received
-%% events to the calling process.
+%% events to the calling process.
-spec subscribe_events() -> 'ok'.
subscribe_events() ->
gen_server:call(wxe_master, subscribe_msgs, infinity).
diff --git a/lib/wx/src/wxe_master.erl b/lib/wx/src/wxe_master.erl
index c3496a0026..5724457ae7 100644
--- a/lib/wx/src/wxe_master.erl
+++ b/lib/wx/src/wxe_master.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -74,7 +74,7 @@ init_env(SilentStart) ->
%%--------------------------------------------------------------------
-%% Initalizes the opengl library
+%% Initializes the opengl library
%%--------------------------------------------------------------------
init_opengl() ->
case get(wx_init_opengl) of
@@ -123,7 +123,8 @@ init([SilentStart]) ->
wxe_util:setup_consts(),
{ok, #state{}}
catch _:Error:ST ->
- io:format("Error: ~p @ ~p~n",[Error, ST]),
+ Str = io_lib:format("Error: ~p @ ~p~n",[Error, ST]),
+ logger:log(error, Str, #{domain => [wx]}),
error({error, {Error, "Could not initiate graphics"}})
end.
@@ -167,13 +168,13 @@ handle_cast(_Msg, State) ->
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
handle_info({wxe_driver, error, Msg}, State) ->
- error_logger:error_report([{wx, error}, {message, lists:flatten(Msg)}]),
+ logger:log(error, "wx: ~s", [Msg], #{domain => [wx]}),
{noreply, State};
handle_info({wxe_driver, internal_error, Msg}, State) ->
- error_logger:error_report([{wx, internal_error}, {message, lists:flatten(Msg)}]),
+ logger:log(error, "wx: ~s", [Msg], #{domain => [wx]}),
{noreply, State};
handle_info({wxe_driver, debug, Msg}, State) ->
- io:format("WX DBG: ~s~n", [Msg]),
+ logger:log(notice, "wx: ~s", [Msg], #{domain => [wx]}),
{noreply, State};
handle_info({wxe_driver, Cmd, File}, State = #state{subscribers=Subs, msgs=Msgs})
when Cmd =:= open_file; Cmd =:= new_file; Cmd =:= print_file;
@@ -183,8 +184,8 @@ handle_info({wxe_driver, Cmd, File}, State = #state{subscribers=Subs, msgs=Msgs}
handle_info({'DOWN', _Ref, process, Pid, _Info}, State) ->
Subs = State#state.subscribers -- [Pid],
{noreply, State#state{subscribers=Subs}};
-handle_info(_Info, State) ->
- io:format("Unknown message ~p sent to ~p~n",[_Info, ?MODULE]),
+handle_info(Info, State) ->
+ logger:log(notice, "wx: Unexpected Msg: ~p", [Info], #{domain => [wx], line=>?LINE, file=>?MODULE_STRING}),
{noreply, State}.
%%--------------------------------------------------------------------
diff --git a/lib/wx/src/wxe_server.erl b/lib/wx/src/wxe_server.erl
index 4cef311bb3..4d3de165fd 100644
--- a/lib/wx/src/wxe_server.erl
+++ b/lib/wx/src/wxe_server.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -41,7 +41,7 @@
%%-record(event, {object, callback, cb_handler}).
-define(APPLICATION, wxe).
--define(log(S,A), log(?MODULE,?LINE,S,A)).
+-define(log(S,A), log(?MODULE_STRING,?LINE,S,A)).
-include("wxe.hrl").
-include("../include/wx.hrl").
@@ -210,7 +210,7 @@ code_change(_OldVsn, State, _Extra) ->
%%--------------------------------------------------------------------
log(Mod,Line,Str,Args) ->
- error_logger:format("~p:~p: " ++ Str, [Mod,Line|Args]).
+ logger:log(error, Str, Args, #{domain => [wx], file=>Mod, line=>Line}).
handle_connect(Object, #evh{handler=undefined, cb=Callback} = EvData0,
From, State0) ->
diff --git a/lib/wx/src/wxe_util.erl b/lib/wx/src/wxe_util.erl
index 1e72f39057..301c1fe241 100644
--- a/lib/wx/src/wxe_util.erl
+++ b/lib/wx/src/wxe_util.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -190,6 +190,6 @@ strip([H|R], Src) ->
[H| strip(R, Src)].
opt_error_log(false, Format, Args) ->
- error_logger:format(Format, Args);
+ logger:log(error, Format, Args, #{domain => [wx]});
opt_error_log(true, _Format, _Args) ->
ok.
diff --git a/lib/wx/test/wx_basic_SUITE.erl b/lib/wx/test/wx_basic_SUITE.erl
index fc88558a46..170738aa30 100644
--- a/lib/wx/test/wx_basic_SUITE.erl
+++ b/lib/wx/test/wx_basic_SUITE.erl
@@ -607,7 +607,7 @@ check_events([{sync_event, #wx{event=#wxPaint{}}, Obj}|Rest], Async, Sync) ->
?mt(wxPaintEvent, Obj),
check_events(Rest, Async, Sync+1);
check_events([], Async, Sync) ->
- case Async > 0 of %% Test sync explictly
+ case Async > 0 of %% Test sync explicitly
true -> ok;
false -> {Async, Sync}
end.
diff --git a/lib/wx/test/wx_class_SUITE.erl b/lib/wx/test/wx_class_SUITE.erl
index c21a916133..7cab2d85fa 100644
--- a/lib/wx/test/wx_class_SUITE.erl
+++ b/lib/wx/test/wx_class_SUITE.erl
@@ -87,7 +87,7 @@ calendarCtrl(Config) ->
true ->
?log("DateAttr is null~n",[]);
false ->
- ?log("DateAttr is useable~n",[]),
+ ?log("DateAttr is usable~n",[]),
DateAttr = ?mt(wxCalendarDateAttr, wxCalendarDateAttr:new()),
wxCalendarDateAttr:setBackgroundColour(DateAttr, {0,243,0}),
wxCalendarCtrl:setAttr(Cal, Day, DateAttr),
diff --git a/lib/wx/test/wx_opengl_SUITE.erl b/lib/wx/test/wx_opengl_SUITE.erl
index 28c5b70383..3ec75c662a 100644
--- a/lib/wx/test/wx_opengl_SUITE.erl
+++ b/lib/wx/test/wx_opengl_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -88,7 +88,7 @@ end_per_group(_GroupName, Config) ->
{{7,8,3,2},{0.0,-1.0,0.0}}]).
-%% Test we can create a glCanvas and that functions are loaded dynamicly
+%% Test we can create a glCanvas and that functions are loaded dynamically
canvas(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
canvas(Config) ->
WX = ?mr(wx_ref, wx:new()),
diff --git a/lib/wx/test/wx_xtra_SUITE.erl b/lib/wx/test/wx_xtra_SUITE.erl
index a87f4a83b1..b60b8b81f7 100644
--- a/lib/wx/test/wx_xtra_SUITE.erl
+++ b/lib/wx/test/wx_xtra_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -68,7 +68,7 @@ end_per_group(_GroupName, Config) ->
%% before wx:destroy is called.
destroy_app(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
destroy_app(_Config) ->
- %% This is timing releated but we test a couple of times
+ %% This is timing related but we test a couple of times
wx_test_lib:flush(),
?m(ok, destroy_app_test(15)).
@@ -102,7 +102,7 @@ destroy_app2(_Config) ->
ok.
-%% This should work, and does but not when run automaticly on windows
+%% This should work, and does but not when run automatically on windows
%% for some strange reason (it just hangs), run it last.
app_dies(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
app_dies(_Config) ->
@@ -160,7 +160,7 @@ oops(Die, Line) when (Die =:= last) orelse (Die =< Line) ->
oops(_,_) -> ok.
-%% This have happend often enough that I have special code to handle
+%% This have happened often enough that I have special code to handle
%% this user error (i.e. using the a window twice in an sizer).
multiple_add_in_sizer(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
multiple_add_in_sizer(Config) ->
diff --git a/lib/xmerl/doc/examples/xml/xmerl.xml b/lib/xmerl/doc/examples/xml/xmerl.xml
index f02282dbef..983a0bfde1 100644
--- a/lib/xmerl/doc/examples/xml/xmerl.xml
+++ b/lib/xmerl/doc/examples/xml/xmerl.xml
@@ -127,7 +127,7 @@ xmerl_scan:file(Filename [ , Options ]) -> #xmlElement{}. </programlisting>
e.g. <computeroutput>xmerl_eventp.erl</computeroutput>) is for
customization functions to share one of the local states (in
<computeroutput>xmerl_eventp.erl</computeroutput>, the
- continuation function and the fetch function both acces the
+ continuation function and the fetch function both access the
<computeroutput>cont_state</computeroutput>.)</para>
<para>Functions to access user state:</para>
@@ -357,7 +357,7 @@ Occurrence ::= '*' | '?' | '+'
<para>The accumulator function is called to accumulate the
contents of an entity.When parsing very large files, it may
- not be desireable to do so.In this case, an acc function can
+ not be desirable to do so.In this case, an acc function can
be provided that simply doesn't accumulate.</para>
<para>Note that it is possible to even modify the parsed
diff --git a/lib/xmerl/doc/src/xmerl_examples.html b/lib/xmerl/doc/src/xmerl_examples.html
index 1305f59d4a..7c8ef3d4bb 100644
--- a/lib/xmerl/doc/src/xmerl_examples.html
+++ b/lib/xmerl/doc/src/xmerl_examples.html
@@ -71,7 +71,7 @@
e.g. <tt>xmerl_eventp.erl</tt>) is for
customization functions to share one of the local states (in
<tt>xmerl_eventp.erl</tt>, the
- continuation function and the fetch function both acces the
+ continuation function and the fetch function both access the
<tt>cont_state</tt>.)</p>
<p>Functions to access user state:</p>
@@ -310,7 +310,7 @@
<p>The accumulator function is called to accumulate the
contents of an entity.When parsing very large files, it may
- not be desireable to do so.In this case, an acc function can
+ not be desirable to do so.In this case, an acc function can
be provided that simply doesn't accumulate.</p>
<p>Note that it is possible to even modify the parsed
diff --git a/lib/xmerl/include/xmerl_xsd.hrl b/lib/xmerl/include/xmerl_xsd.hrl
index e3ee8efd40..31633d01da 100644
--- a/lib/xmerl/include/xmerl_xsd.hrl
+++ b/lib/xmerl/include/xmerl_xsd.hrl
@@ -51,7 +51,7 @@
global_namespace_nodes=[],
checked_namespace_nodes=[{"xml",[],'http://www.w3.org/XML/1998/namespace'}],
table,
- tab2file=false, %% for debuging of abstract syntax
+ tab2file=false, %% for debugging of abstract syntax
redefine=false,
finalDefault, %% undefined | '#all' | [atom()]
%% atom() -> extension |
@@ -89,7 +89,7 @@
scope,
form, %% unqualified | qualified
id,
- occurance={1,1}, %% {minOccurs,maxOccurs}
+ occurrence={1,1}, %% {minOccurs,maxOccurs}
value_constraint, %% undefined | {default,Value} | {fixed,Value}
nillable=false, %% true | false
abstract=false, %% true | false
@@ -153,7 +153,7 @@
id,
ref, %% in this case no name or content
content=[],
- occurance={1,1}
+ occurrence={1,1}
}).
-record(schema_extension,{
base,
@@ -189,9 +189,9 @@
%% alterantive, a collection of objects of which only one is chosen.
-record(chain,{
content,
- occurance={1,1}
+ occurrence={1,1}
}).
-record(alternative,{
content,
- occurance={0,1}
+ occurrence={0,1}
}).
diff --git a/lib/xmerl/src/Makefile b/lib/xmerl/src/Makefile
index 51d9190797..0a9f8391c7 100644
--- a/lib/xmerl/src/Makefile
+++ b/lib/xmerl/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2016. All Rights Reserved.
+# Copyright Ericsson AB 2003-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -131,7 +131,7 @@ ERL_COMPILE_FLAGS += \
# ----------------------------------------------------
# Targets
# ----------------------------------------------------
-debug opt: $(TARGET_FILES)
+$(TYPES): $(TARGET_FILES)
docs:
#docs: $(DOC_TARGET_FILES)
diff --git a/lib/xmerl/src/xmerl_regexp.erl b/lib/xmerl/src/xmerl_regexp.erl
index 1bf8496673..46d01ca9fb 100644
--- a/lib/xmerl/src/xmerl_regexp.erl
+++ b/lib/xmerl/src/xmerl_regexp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -510,7 +510,7 @@ gsub_comp([], _P, _RE, _Bef, _Rep) -> no.
%% split(String, RegExp) -> {ok,[SubString]} | {error,E}.
%% Split a string into substrings where the RegExp describes the
-%% field seperator. The RegExp " " is specially treated.
+%% field separator. The RegExp " " is specially treated.
split(String, " ") -> %This is really special
{ok,{regexp,RE}} = parse("[ \t]+"),
@@ -1289,7 +1289,7 @@ accept([], _NFA) -> no.
%% minimise_dfa(DFA, StartState, FirstState) -> {DFA,StartState}.
%% Minimise the DFA by removing equivalent states. We consider a
%% state if both the transitions and the their accept state is the
-%% same. First repeatedly run throught the DFA state list removing
+%% same. First repeatedly run through the DFA state list removing
%% equivalent states and updating remaining transitions with
%% remaining equivalent state numbers. When no more reductions are
%% possible then pack the remaining state numbers to get consecutive
diff --git a/lib/xmerl/src/xmerl_sax_parser.erl b/lib/xmerl/src/xmerl_sax_parser.erl
index 1b17b1d5cb..c119223470 100644
--- a/lib/xmerl/src/xmerl_sax_parser.erl
+++ b/lib/xmerl/src/xmerl_sax_parser.erl
@@ -1,7 +1,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -158,7 +158,7 @@ parse_binary(Xml, #xmerl_sax_parser_state{encoding={utf16,big}}=State, F) ->
parse_binary(Xml, #xmerl_sax_parser_state{encoding=latin1}=State, F) ->
xmerl_sax_parser_latin1:F(Xml, State);
parse_binary(_, #xmerl_sax_parser_state{encoding=Enc}, State) ->
- ?fatal_error(State, lists:flatten(io_lib:format("Charcter set ~p not supported", [Enc]))).
+ ?fatal_error(State, lists:flatten(io_lib:format("Character set ~p not supported", [Enc]))).
%%----------------------------------------------------------------------
%% Function: initial_state/0
diff --git a/lib/xmerl/src/xmerl_sax_parser.hrl b/lib/xmerl/src/xmerl_sax_parser.hrl
index aac155ac63..a34bc7a6ab 100644
--- a/lib/xmerl/src/xmerl_sax_parser.hrl
+++ b/lib/xmerl/src/xmerl_sax_parser.hrl
@@ -1,7 +1,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -47,7 +47,7 @@
-define(is_hex_digit(C), $0 =< C, C =< $9; $a =< C, C =< $f; $A =< C, C =< $F).
%%----------------------------------------------------------------------
-%% Definition of XML charcters
+%% Definition of XML characters
%%
%% [2] Char #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
%%----------------------------------------------------------------------
@@ -82,7 +82,7 @@
current_tag = [], % Current tag
end_tags = [], % Stack of tags used for end tag matching
match_end_tags = true, % Flag which defines if the parser should match on end tags
- ref_table, % Table containing entitity definitions
+ ref_table, % Table containing entity definitions
standalone = no, % yes if the document is standalone and don't need an external DTD.
file_type = normal, % Can be normal, dtd and entity
current_location, % Location of the currently parsed XML entity
diff --git a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
index 49a9a6ada6..67fdec560e 100644
--- a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
+++ b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
@@ -1,7 +1,7 @@
%%-*-erlang-*-
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1727,7 +1727,7 @@ parse_reference(?STRING_UNBOUND_REST(C, Rest), State, HaveToExist) ->
end;
parse_reference(Bytes, State, HaveToExist) ->
unicode_incomplete_check([Bytes, State, HaveToExist, fun parse_reference/3],
- underfined).
+ undefined).
parse_reference_1(?STRING_EMPTY, State, HaveToExist, Name) ->
@@ -1799,7 +1799,7 @@ parse_pe_reference(?STRING_UNBOUND_REST(C, Rest), State) ->
end;
parse_pe_reference(Bytes, State) ->
unicode_incomplete_check([Bytes, State, fun parse_pe_reference/2],
- underfined).
+ undefined).
parse_pe_reference_1(?STRING_EMPTY, State, Name) ->
@@ -2028,7 +2028,7 @@ normalize_whitespace([], Acc) ->
%% State = #xmerl_sax_parser_state{}
%% Result : {Rest, State}
%% Description: This function starts an parsing of the DTD
-%% that sends apropriate events.
+%% that sends appropriate events.
%% [28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S?
%% ('[' (markupdecl | PEReference | S)* ']' S?)? '>'
%%----------------------------------------------------------------------
@@ -2057,7 +2057,7 @@ parse_doctype(Bytes, State) ->
%% Name = string()
%% Definition = true |false
%% Result : {Rest, State}
-%% Description: Gets the DTD name as a parameter and contine parse the DOCTYPE
+%% Description: Gets the DTD name as a parameter and continue parse the DOCTYPE
%% directive
%%----------------------------------------------------------------------
parse_doctype_1(?STRING_EMPTY, State, Name, Definition) ->
@@ -3829,7 +3829,7 @@ parse_notation_decl_1(Bytes, State) ->
%% PubId = string()
%% SysId = string()
%% Description: Parse a NOTATION identity. The public id case is a special
-%% variant of extenal id where just the public part is allowed.
+%% variant of external id where just the public part is allowed.
%% This is allowed if the third parameter in parse_external_id/3
%% is true.
%% [83] PublicID ::= 'PUBLIC' S PubidLiteral
diff --git a/lib/xmerl/src/xmerl_sax_parser_list.erlsrc b/lib/xmerl/src/xmerl_sax_parser_list.erlsrc
index ac89896215..bb9213bff1 100644
--- a/lib/xmerl/src/xmerl_sax_parser_list.erlsrc
+++ b/lib/xmerl/src/xmerl_sax_parser_list.erlsrc
@@ -2,7 +2,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2017. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -34,7 +34,7 @@
-define(APPEND_STRING(Rest, New), Rest ++ New).
-define(TO_INPUT_FORMAT(Val), Val).
-%% In the list case we can't use a '++' when matchin against an unbound variable
+%% In the list case we can't use a '++' when matching against an unbound variable
-define(STRING_UNBOUND_REST(MatchChar, Rest), [MatchChar | Rest]).
-define(PARSE_BYTE_ORDER_MARK(Bytes, State),
diff --git a/lib/xmerl/src/xmerl_scan.erl b/lib/xmerl/src/xmerl_scan.erl
index 270d5b4962..2285ce0d06 100644
--- a/lib/xmerl/src/xmerl_scan.erl
+++ b/lib/xmerl/src/xmerl_scan.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -3637,7 +3637,7 @@ scan_entity_value("%" ++ T, S0, Delim, Acc, PEName,Namespace,PENesting) ->
ExpRef ->
{string_to_char_set(S1#xmerl_scanner.encoding, ExpRef) ,S1}
end,
- %% single or duoble qoutes are not treated as delimeters
+ %% single or duoble quotes are not treated as delimiters
%% in passages "included in literal"
S3 = S2#xmerl_scanner{col=S2#xmerl_scanner.col+1},
{Acc2,_,S4} = scan_entity_value(ExpandedRef,S3,no_delim,Acc,
@@ -3678,32 +3678,32 @@ scan_entity_value("&" ++ T, S0, Delim, Acc, PEName,Namespace,PENesting) ->
scan_entity_value(T2,S2,Delim,[";",atom_to_list(Name),"&"|Acc],PEName,Namespace,PENesting)
end;
%% The following clauses is for PE Nesting VC constraint
-%% Start delimeter for ConditionalSection
+%% Start delimiter for ConditionalSection
scan_entity_value("<!["++T,S0,Delim,Acc,PEName,parameter=NS,PENesting)->
?bump_col(3),
scan_entity_value(T,S,Delim,["<!["|Acc],PEName,NS,
pe_push("<![",PENesting,S));
-%% Start delimeter for ConditionalSection (2)
+%% Start delimiter for ConditionalSection (2)
scan_entity_value("["++T,S0,Delim,Acc,PEName,parameter=NS,PENesting)->
?bump_col(1),
scan_entity_value(T,S,Delim,["["|Acc],PEName,NS,
pe_push("[",PENesting,S));
-%% Start delimeter for comment
+%% Start delimiter for comment
scan_entity_value("<!--"++T,S0,Delim,Acc,PEName,parameter=NS,PENesting)->
?bump_col(4),
scan_entity_value(T,S,Delim,["<!--"|Acc],PEName,NS,
pe_push("<!--",PENesting,S));
-%% Start delimeter for ElementDecl, AttListDecl,EntityDecl,NotationDecl
+%% Start delimiter for ElementDecl, AttListDecl,EntityDecl,NotationDecl
scan_entity_value("<!"++ T,S0,Delim,Acc,PEName, parameter=NS,PENesting) ->
?bump_col(2),
scan_entity_value(T,S,Delim,["<!"|Acc],PEName,NS,
pe_push("<!",PENesting,S));
-%% Start delimeter for PI
+%% Start delimiter for PI
scan_entity_value("<?"++T,S0,Delim,Acc,PEName, parameter=NS,PENesting) ->
?bump_col(2),
scan_entity_value(T,S,Delim,["<?"|Acc],PEName,NS,
pe_push("<?",PENesting,S));
-%% Start delimeter for elements that matches the proper stop delimeter
+%% Start delimiter for elements that matches the proper stop delimiter
%% for a markupdecl
scan_entity_value("</"++T,S0,Delim,Acc,PEName,parameter=NS,PENesting)->
?bump_col(2),
@@ -3713,32 +3713,32 @@ scan_entity_value("<"++T,S0,Delim,Acc,PEName,parameter=NS,PENesting)->
?bump_col(1),
scan_entity_value(T,S,Delim,["<"|Acc],PEName,NS,
pe_push("<",PENesting,S));
-%% Delimeter for contentspecs
+%% Delimiter for contentspecs
scan_entity_value("("++T,S0,Delim,Acc,PEName,parameter=NS,PENesting)->
?bump_col(1),
scan_entity_value(T,S,Delim,["("|Acc],PEName,NS,
pe_push("(",PENesting,S));
-%% Stop delimeter for ElementDecl, AttListDecl,EntityDecl,NotationDecl
+%% Stop delimiter for ElementDecl, AttListDecl,EntityDecl,NotationDecl
scan_entity_value(">"++ T,S0,Delim,Acc,PEName, parameter=NS,PENesting) ->
?bump_col(1),
scan_entity_value(T,S,Delim,[">"|Acc],PEName,NS,
pe_pop(">",PENesting,S));
-%% Stop delimeter for PI
+%% Stop delimiter for PI
scan_entity_value("?>"++ T,S0,Delim,Acc,PEName, parameter=NS,PENesting) ->
?bump_col(2),
scan_entity_value(T,S,Delim,["?>"|Acc],PEName,NS,
pe_pop("?>",PENesting,S));
-%% Stop delimeter for comment
+%% Stop delimiter for comment
scan_entity_value("-->"++ T,S0,Delim,Acc,PEName, parameter=NS,PENesting) ->
?bump_col(3),
scan_entity_value(T,S,Delim,["-->"|Acc],PEName,NS,
pe_pop("-->",PENesting,S));
-%% Stop delimeter for ConditionalSection
+%% Stop delimiter for ConditionalSection
scan_entity_value("]]>"++ T,S0,Delim,Acc,PEName, parameter=NS,PENesting) ->
?bump_col(3),
scan_entity_value(T,S,Delim,["]]>"|Acc],PEName,NS,
pe_pop("]]>",PENesting,S));
-%% Stop delimeter added to match a content start delimeter included
+%% Stop delimiter added to match a content start delimiter included
scan_entity_value("/>"++ T,S0,Delim,Acc,PEName, parameter=NS,PENesting) ->
?bump_col(2),
scan_entity_value(T,S,Delim,["/>"|Acc],PEName,NS,
diff --git a/lib/xmerl/src/xmerl_ucs.erl b/lib/xmerl/src/xmerl_ucs.erl
index 4b1fc30089..cbe9736999 100644
--- a/lib/xmerl/src/xmerl_ucs.erl
+++ b/lib/xmerl/src/xmerl_ucs.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -423,7 +423,7 @@ char_to_utf8(Ch) when is_integer(Ch), Ch >= 0 ->
%% expand_utf8([Byte]) -> {[UnicodeChar],NumberOfBadBytes}
%% Expand UTF8 byte sequences to ISO 10646/Unicode
-%% charactes. Any illegal bytes are removed and the number of
+%% characters. Any illegal bytes are removed and the number of
%% bad bytes are returned.
%%
%% Reference:
diff --git a/lib/xmerl/src/xmerl_validate.erl b/lib/xmerl/src/xmerl_validate.erl
index 8b4f5b91a2..c6b03a0d91 100644
--- a/lib/xmerl/src/xmerl_validate.erl
+++ b/lib/xmerl/src/xmerl_validate.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -509,7 +509,7 @@ choice([CH|CHS],[_XML|_T]=XMLS,Rules,WSaction,S)->
{[],XMLS1} -> %% Maybe a sequence with * or ? elements that
%% didn't match
case CHS of
- [] -> % choice has succeded but without matching XMLS1
+ [] -> % choice has succeeded but without matching XMLS1
{[],XMLS1};
_ -> % there are more choice alternatives to try with
choice(CHS,XMLS1,Rules,WSaction,S)
diff --git a/lib/xmerl/src/xmerl_xpath.erl b/lib/xmerl/src/xmerl_xpath.erl
index 6146feba49..2354f9d6cd 100644
--- a/lib/xmerl/src/xmerl_xpath.erl
+++ b/lib/xmerl/src/xmerl_xpath.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2016. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -601,7 +601,7 @@ match_preceding_sibling(Tok, N, Acc, Context) ->
%% "The 'preceding' axis contains all nodes in the same document as the context
-%% node that are before the context node in document order, exluding any
+%% node that are before the context node in document order, excluding any
%% ancestors and excluding attribute nodes and namespace nodes."
match_preceding(Tok, N, Acc, Context) ->
#xmlNode{parents = Ps, node = Node} = N,
diff --git a/lib/xmerl/src/xmerl_xsd.erl b/lib/xmerl/src/xmerl_xsd.erl
index 2836bb0e5b..10ea8df66e 100644
--- a/lib/xmerl/src/xmerl_xsd.erl
+++ b/lib/xmerl/src/xmerl_xsd.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2018. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@
%% XML Schema study <a href="http://www.w3.org/TR/xmlschema-0/">part 0.</a>
%% An XML structure is validated by xmerl_xsd:validate/[2,3].
%% @type global_state(). <p>The global state of the validator. It is
-%% representated by the <code>#xsd_state{}</code> record.
+%% represented by the <code>#xsd_state{}</code> record.
%% </p>
%% @type option_list(). <p>Options allow to customize the behaviour of the
%% validation.
@@ -400,7 +400,7 @@ new_state(Opts) ->
%% information as defined elements and types.
validate_schema(E=#xmlElement{},
S) ->
- %% namespace is always a xmlNamespace record, attributs a list of
+ %% namespace is always a xmlNamespace record, attributes a list of
%% #xmlAttributes and content a list of #xmlElements|#xmlText|...
%% Have to save namespace nodes. Use of namespace in paths for
@@ -563,7 +563,7 @@ element_content({element,S},El,Env) ->
case qualify_NCName(El,S) of
no_name ->
Ref = particle_ref(El),
- {Occ,S2} = occurance(El,{1,1},S),
+ {Occ,S2} = occurrence(El,{1,1},S),
%% 3.3.3 bullet 2.2
S3 = element_forbidden_properties(El,S2),
S4 = element_forbidden_content(El#xmlElement.content,S3),
@@ -578,7 +578,7 @@ element_content({element,S},El,Env) ->
Type2 = remove_annotation(Type),
Unique = [X||X={unique,_} <- Type2],
Key = [X||X={K,_} <- Type2,K == key orelse K==keyref],
- {Occur,S4} = occurance(El,{1,1},S3),
+ {Occur,S4} = occurrence(El,{1,1},S3),
{SE,S5} = element_properties(El#xmlElement.attributes,
#schema_element{},El,S4),
CM = remove_attributes([X||X={Y,_}<-Type2,
@@ -586,14 +586,14 @@ element_content({element,S},El,Env) ->
keyref=/=Y,annotation=/=Y]),
%% take care of key/keyref later
SE2 = SE#schema_element{name=Name,type=CM,uniqueness=Unique,
- key=Key, occurance=Occur,
+ key=Key, occurrence=Occur,
scope=S5#xsd_state.scope},
S6 = insert_substitutionGroup(SE2,S5),
S7 = save_object({element,SE2},S6),
{{element,{Name,Occur}},S7}
end;
element_content({complexType,S},CT,Env) ->
- %% complex type definition without a name is returnd and added to
+ %% complex type definition without a name is returned and added to
%% the content model at this level. A complex type may also contain
%% attributes or attribute group references in the end of its content.
%%?debug("complexType content: ~p~nenv: ~p~n",[CT,Env]),
@@ -677,7 +677,7 @@ element_content({group,S},G,Env) ->
%% "Schema Representation Constraint: Individual Component
%% Redefinition"
Ref = particle_ref(G),
- {Occur,S2} = occurance(G,{1,1},S),
+ {Occur,S2} = occurrence(G,{1,1},S),
GRef =
{group,
{get_QName(Ref,G#xmlElement.namespace,reset_scope(S2)),%%QQQ
@@ -694,16 +694,16 @@ element_content({group,S},G,Env) ->
end;
element_content({all,S},All,Env) ->
%% each element occurs 0 or 1 times in any order
- %% {all,[{element_name,occurance}]}
+ %% {all,[{element_name,occurrence}]}
%% CM = content_model(Seq#xmlElement.content,S,[all|Env]),
- {Occur,S1} = occurance(All,{1,1},S),
+ {Occur,S1} = occurrence(All,{1,1},S),
{CM,S2} = type(All#xmlElement.content,S1,[all|Env]),
S3 = check_cm(all,allowed_content(all,Env),CM,S2),
{{all,{[X||X = {element,_} <- CM],Occur}},S3};
element_content({sequence,S},Seq,Env) ->
- %% {sequence,[{element_name,occurance}]}
+ %% {sequence,[{element_name,occurrence}]}
%% CM = content_model(Seq#xmlElement.content,S,[sequence|Env]),
- {Occur,S1} = occurance(Seq,{1,1},S),
+ {Occur,S1} = occurrence(Seq,{1,1},S),
{CM,S2} = type(Seq#xmlElement.content,S1,[sequence|Env]),
S3 = check_cm(sequence,allowed_content(sequence,Env),CM,S2),
{{sequence,{remove_annotation(CM),Occur}},S3};
@@ -712,12 +712,12 @@ element_content({choice,S},Choice,Env) ->
%% (element | group | choice | sequence | any)*)
%% returns: {choice,[element_name]}
%% CM = content_model(Choice#xmlElement.content,S,[choice|Env]),
- {Occur,S1} = occurance(Choice,{1,1},S),
+ {Occur,S1} = occurrence(Choice,{1,1},S),
{CM,S2} = type(Choice#xmlElement.content,S1,[choice|Env]),
S3 = check_cm(choice,allowed_content(choice,Env),CM,S2),
{{choice,{remove_annotation(CM),Occur}},S3};
element_content({any,S},Any,_Env) ->
- {Occur,S1} = occurance(Any,{1,1},S),
+ {Occur,S1} = occurrence(Any,{1,1},S),
NameSpace = wildcard_namespace(Any,S1),
PC = processor_contents(Any),
?debug("element_content, any: Any content:~p~n",[Any#xmlElement.content]),
@@ -1426,7 +1426,7 @@ check_cm(Kind,S4SCM,ContentModel,S) ->
exit({error,{[],?MODULE,{internal_error,Err}}})
end.
-check_cm2(Kind,#chain{content=S4SCM,occurance=Occ},
+check_cm2(Kind,#chain{content=S4SCM,occurrence=Occ},
ContentModel,S) ->
case occurance_loop(Occ,fun check_chain/1,
[S4SCM,ContentModel,Kind,S],0) of
@@ -1445,7 +1445,7 @@ check_cm2(Kind,#chain{content=S4SCM,occurance=Occ},
Err = {[],?MODULE,{illegal_content,Reason,Kind}},
{ContentModel,acc_errs(S,Err)}
end;
-check_cm2(Kind,#alternative{content=S4SCM,occurance=Occ},
+check_cm2(Kind,#alternative{content=S4SCM,occurrence=Occ},
ContentModel,S) ->
case occurance_loop(Occ,fun check_alternative/1,
[S4SCM,ContentModel,Kind,S],0) of
@@ -1621,9 +1621,9 @@ optional({_,{_,{0,_}}}) ->
true; %% sequence, all or choice
optional({any,{_,{0,_},_}}) ->
true;
-optional(#chain{occurance={0,_}}) ->
+optional(#chain{occurrence={0,_}}) ->
true;
-optional(#alternative{occurance={0,_}}) ->
+optional(#alternative{occurrence={0,_}}) ->
true;
optional(#chain{content=Content}) ->
catch is_optional_content(Content);
@@ -1671,10 +1671,10 @@ allowed_content(element,_Parents) ->
#chain{content=
[#alternative{content=
[{simpleType,{1,1}},{complexType,{1,1}}],
- occurance={0,1}},
+ occurrence={0,1}},
#alternative{content=
[{unique,{1,1}},{key,{1,1}},{keyref,{1,1}}],
- occurance={0,unbounded}}]
+ occurrence={0,unbounded}}]
}]
};
allowed_content(attribute,_Parents) ->
@@ -1689,12 +1689,12 @@ allowed_content(complexType,Parents) ->
[#alternative{content=
[{group,{1,1}},{all,{1,1}},
{choice,{1,1}},{sequence,{1,1}}],
- occurance={0,1}},
+ occurrence={0,1}},
#chain{content=
[#alternative{content=
[{attribute,{1,1}},
{attributeGroup,{1,1}}],
- occurance={0,unbounded}},
+ occurrence={0,unbounded}},
{anyAttribute,{0,1}}]
}
]
@@ -1714,7 +1714,7 @@ allowed_content(attributeGroup,Parents) ->
[#alternative{content=
[{attribute,{1,1}},
{attributeGroup,{1,1}}],
- occurance={0,unbounded}},
+ occurrence={0,unbounded}},
{anyAttribute,{0,1}}]}]}
end;
allowed_content(group,_Parents) ->
@@ -1722,7 +1722,7 @@ allowed_content(group,_Parents) ->
[{annotation,{0,1}},
#alternative{content=
[{all,{1,1}},{choice,{1,1}},{sequence,{1,1}}],
- occurance={0,1}}]};
+ occurrence={0,1}}]};
allowed_content(all,_Parents) ->
#chain{content=[{annotation,{0,1}},{element,{0,unbounded}}]};
allowed_content(SorC,_Parents) when SorC==sequence;SorC==choice ->
@@ -1732,7 +1732,7 @@ allowed_content(SorC,_Parents) when SorC==sequence;SorC==choice ->
[{element,{1,1}},{group,{1,1}},
{choice,{1,1}},{sequence,{1,1}},
{any,{1,1}}],
- occurance={0,unbounded}}]};
+ occurrence={0,unbounded}}]};
%% allowed_content(E,_Parents)
%% when E==any;E==selector;E==field;E==notation;E==include;E==import;
%% E==anyAttribute ->
@@ -1744,7 +1744,7 @@ allowed_content(SorC,_Parents) when SorC==sequence;SorC==choice ->
%% [{selector,{1,1}},{selector,{1,unbounded}}]}]};
%% allowed_content(annotation,_Parents) ->
%% #alternative{content=[{appinfo,{1,1}},{documentation,{1,1}}],
-%% occurance={0,unbounded}};
+%% occurrence={0,unbounded}};
%% allowed_content(E,_Parents) when E==appinfo;E==documentation ->
%% {any,{0,unbounded}};
allowed_content(simpleType,_Parents) ->
@@ -1771,7 +1771,7 @@ allowed_content(LU,_Parent) when LU==list;LU==union ->
%% [#alternative{content=
%% [{include,{1,1}},{import,{1,1}},
%% {redefine,{1,1}},{annotation,{1,1}}],
-%% occurance={0,1}},
+%% occurrence={0,1}},
%% #chain{content=
%% [#alternative{content=
%% [#alternative{content=
@@ -1781,14 +1781,14 @@ allowed_content(LU,_Parent) when LU==list;LU==union ->
%% {attribute,{1,1}},
%% {notation,{1,1}}]},
%% {annotation,{0,unbounded}}],
-%% occurance={0,unbounded}}]};
+%% occurrence={0,unbounded}}]};
allowed_content(redefine,_Parents) ->
#alternative{content=
[{annotation,{1,1}},
#alternative{content=
[{simpleType,{1,1}},{complexType,{1,1}},
{group,{1,1}},{attributeGroup,{1,1}}]}],
- occurance={0,unbounded}};
+ occurrence={0,unbounded}};
allowed_content(E,_Parents) when E==simpleContent;
E==complexContent ->
#chain{content=
@@ -1842,7 +1842,7 @@ allowed_content2(restriction,simpleType) ->
{length,{1,1}},{minLength,{1,1}},
{maxLength,{1,1}},{enumeration,{1,1}},
{whiteSpace,{1,1}},{pattern,{1,1}}],
- occurance={0,unbounded}}]}]};
+ occurrence={0,unbounded}}]}]};
allowed_content2(restriction,simpleContent) ->
#chain{content=
[{annotation,{0,1}},
@@ -1855,12 +1855,12 @@ allowed_content2(restriction,simpleContent) ->
{length,{1,1}},{minLength,{1,1}},
{maxLength,{1,1}},{enumeration,{1,1}},
{whiteSpace,{1,1}},{pattern,{1,1}}],
- occurance={0,unbounded}}],
- occurance={0,1}},
+ occurrence={0,unbounded}}],
+ occurrence={0,1}},
#chain{content=
[#alternative{content=
[{attribute,{1,1}},{attributeGroup,{1,1}}],
- occurance={0,unbounded}},
+ occurrence={0,unbounded}},
{anyAttribute,{0,1}}]}]};
allowed_content2(restriction,complexContent) ->
#chain{content=
@@ -1868,11 +1868,11 @@ allowed_content2(restriction,complexContent) ->
#alternative{content=
[{group,{1,1}},{all,{1,1}},{choice,{1,1}},
{sequence,{1,1}}],
- occurance={0,1}},
+ occurrence={0,1}},
#chain{content=
[#alternative{content=
[{attribute,{1,1}},{attributeGroup,{1,1}}],
- occurance={0,unbounded}},
+ occurrence={0,unbounded}},
{anyAttribute,{0,1}}]}]};
allowed_content2(extension,simpleContent) ->
#chain{content=
@@ -1880,7 +1880,7 @@ allowed_content2(extension,simpleContent) ->
#chain{content=
[#alternative{content=
[{attribute,{1,1}},{attributeGroup,{1,1}}],
- occurance={0,unbounded}},
+ occurrence={0,unbounded}},
{anyAttribute,{0,1}}]}]};
allowed_content2(extension,complexContent) ->
#chain{content=
@@ -1889,19 +1889,19 @@ allowed_content2(extension,complexContent) ->
[#alternative{content=
[{group,{1,1}},{all,{1,1}},{choice,{1,1}},
{sequence,{1,1}}],
- occurance={0,1}},
+ occurrence={0,1}},
#chain{content=
[#alternative{content=
[{attribute,{1,1}},
{attributeGroup,{1,1}}],
- occurance={0,1}},
+ occurrence={0,1}},
{anyAttribute,{0,1}}]}]}]}.
set_occurance(Ch = #chain{},Occ) ->
- Ch#chain{occurance=Occ};
+ Ch#chain{occurrence=Occ};
set_occurance(Alt = #alternative{},Occ) ->
- Alt#alternative{occurance=Occ};
+ Alt#alternative{occurrence=Occ};
set_occurance({Name,_},Occ) when is_atom(Name) ->
{Name,Occ}.
%% set_occurance(CM,_) ->
@@ -1992,7 +1992,7 @@ save_namespace_definition(NameSpace,
checked_namespace_nodes=CNS}) ->
%% 1) Have to find a matching namespace in the global list for
%% this schema, and get the associated prefix. 2) Then check
- %% whether a schema with this prefix - namespace combinaton
+ %% whether a schema with this prefix - namespace combination
%% already is checked, if so do nothing. 3a) If this namespace is
%% checked but with another prefix only add the prefix - namespace
%% pair to the checked namespace list. 3b) Otherwise add the
@@ -2275,7 +2275,7 @@ set_num_el(S=#xsd_state{},#xsd_state{num_el=I}) ->
S#xsd_state{num_el=I}.
-occurance(El=#xmlElement{attributes=Atts},{Min,Max},S) ->
+occurrence(El=#xmlElement{attributes=Atts},{Min,Max},S) ->
AttVal=fun(#xmlAttribute{value=V},Sin) ->
case catch mk_int_or_atom(V) of
{'EXIT',_} ->
@@ -2470,7 +2470,7 @@ check_element_type(XML=[#xmlElement{}|_],[{all,{CM,Occ}}|_CMRest],
%% 3 often. CMEL may be ((simpleType | complexType)?, (unique | key | keyref)*))
check_element_type(XML=[XMLEl=#xmlElement{}|_],[CMEl|CMRest],Env,
Block,S,Checked) ->
- %% Three possible releations between XMLEl - CMEl:
+ %% Three possible relations between XMLEl - CMEl:
%% (1) XMLEl matches CMEl.
%% (2) XMLEl don't matches CMEl and CMEl is optional.
%% (3) XMLEl don't matches CMEl, CMEl mandatory, - error.
@@ -2563,12 +2563,12 @@ check_element_type(XML=[XMLEl=#xmlElement{name=Name}|RestXML],
CMEl=#schema_element{name=CMName,type=Type},
Env,Block,S,Checked) ->
ElName = mk_EII_QName(Name,XMLEl,S#xsd_state{scope=element(2,CMName)}),
- {Min,Max} = CMEl#schema_element.occurance,
+ {Min,Max} = CMEl#schema_element.occurrence,
case cmp_name(ElName,CMName,S) of %% substitutionGroup
true when S#xsd_state.num_el =< Max ->
S1 = id_constraints(CMEl,XMLEl,S),
%% If CMEl element has a substitutionGroup we have to
- %% switch to the rigth element and type here.
+ %% switch to the right element and type here.
{CMEl2,Type2,S2} =
if
ElName =:= CMName ->
@@ -2705,7 +2705,7 @@ check_element_type(XML=[E=#xmlElement{name=Name}|Rest],
end;
check_element_type([],CM,_Env,_Block,S,Checked) ->
%% #schema_complex_type, any, #schema_group, anyType and lists are
- %% catched above.
+ %% caught above.
case CM of
#schema_simple_type{} ->
{NewVal,S2} = check_type(CM,[],unapplied,S),
@@ -2777,7 +2777,7 @@ check_sequence(Seq=[_InstEl=#xmlElement{}|_],[El|Els],Occ={_Min,_Max},Env,S,Chec
%% Err;
{Ret,UnValRest,S3} ->
%% must also take care of more elements of same name
- %% decrease occurance in El for the optional measurements
+ %% decrease occurrence in El for the optional measurements
%% when Seq is empty.
check_sequence(UnValRest,[decrease_occurance(El)|Els],Occ,Env,
count_num_el(set_num_el(S3,S2)),
@@ -2835,7 +2835,7 @@ check_choice(XML,[],{0,_},_,S,Checked) ->
%% Choice is optional
{Checked,XML,set_num_el(S,0)};
check_choice(XML,[],_,_,S,Checked) ->
- %% Choice has already matched something, the rest is for somthing
+ %% Choice has already matched something, the rest is for something
%% else to match.
case S#xsd_state.num_el > 0 of
true ->
@@ -3965,7 +3965,7 @@ resolve(E,S) ->
load_object(E,S).
%% explicit_type checks whether the instance element is of an explicit
-%% type pointed out by xsi:type. A type refernced by xsi:type must be
+%% type pointed out by xsi:type. A type referenced by xsi:type must be
%% the same as, or derived from the instance element's type. Concluded
%% from 3.4.6 section "Schema Component Constraint: Type Derivation OK
%% (Complex)".
@@ -5080,7 +5080,7 @@ load_redefine_object({Kind,Name},S) ->
load_object({element,{QN,Occ={Min,_}}},S) when is_integer(Min) ->
case load_object({element,QN},S) of
- {SE=#schema_element{},S1} -> {SE#schema_element{occurance=Occ},S1};
+ {SE=#schema_element{},S1} -> {SE#schema_element{occurrence=Occ},S1};
Other -> Other
end;
load_object({group,{QN,_Occ={Min,_}}},S) when is_integer(Min) ->
@@ -5439,11 +5439,11 @@ format_error({unvalidated_rest,UR}) ->
format_error({no_schemas_provided}) ->
"Schema: Validator found no schema. A schema must be provided for validation.";
format_error({internal_error,Reason}) ->
- io_lib:format("An error occured that was unforeseen, due to ~p.",[Reason]);
+ io_lib:format("An error occurred that was unforeseen, due to ~p.",[Reason]);
format_error({internal_error,Reason,Info}) ->
- io_lib:format("An error occured that was unforeseen, due to ~p: ~p.",[Reason,Info]);
+ io_lib:format("An error occurred that was unforeseen, due to ~p: ~p.",[Reason,Info]);
format_error({internal_error,Function,Info1,Info2}) ->
- io_lib:format("An internal error occured in function ~p with args: ~p,~p.",[Function,Info1,Info2]);
+ io_lib:format("An internal error occurred in function ~p with args: ~p,~p.",[Function,Info1,Info2]);
format_error({illegal_content,Reason,Kind}) ->
io_lib:format("Schema: The schema violates the content model allowed for schemas.~nReason: ~p,~nkind of schema element: ~p.",[Reason,Kind]);
format_error({no_match,Kind}) ->
@@ -5473,7 +5473,7 @@ format_error({no_element_expected_in_group,XML}) ->
format_error({element_bad_match,E,Any,_Env}) ->
io_lib:format("XML: XML element ~p didn't match into the namespace of schema type any ~p.",[E,Any]);
format_error({match_failure,_XML,_CM,_S}) ->
- "XML: A combination of XML element(s) and schema definitions that is not known has occured. The implementation doesn't support this structure.";
+ "XML: A combination of XML element(s) and schema definitions that is not known has occurred. The implementation doesn't support this structure.";
format_error({cannot_contain_text,_XMLTxt,CMEl}) ->
io_lib:format("XML: The schema structure: ~p doesn't allow text",[CMEl]);
format_error({missing_mandatory_elements,MandatoryEls}) ->
@@ -5489,7 +5489,7 @@ format_error({element_not_in_all,ElName,E,_CM}) ->
format_error({missing_mandatory_elements_in_all,MandatoryEls}) ->
io_lib:format("XML: The schema elements ~p were missed in the XML file.",[MandatoryEls]);
format_error({failed_validating,E,Any}) ->
- io_lib:format("XML: The element ~p at location ~p failed validation. It should hav been matched by an any schema element ~p",[E#xmlElement.name,error_path(E,undefined),Any]);
+ io_lib:format("XML: The element ~p at location ~p failed validation. It should have been matched by an any schema element ~p",[E#xmlElement.name,error_path(E,undefined),Any]);
format_error({schemaLocation_list_failure,Paths}) ->
io_lib:format("XML: schemaLocation values consists of one or more pairs of URI references, separated by white space. The first is a namespace name the second a reference to a schema: ~p.",[Paths]);
format_error({element_content_not_nil,XMLEl}) ->
@@ -5502,7 +5502,7 @@ format_error({default_and_fixed_attributes_mutual_exclusive,
Name,Default,Fix}) ->
io_lib:format("Schema: It is an error in the schema to assign values for both default and fix for an attribute. Attribute: ~p, default: ~p, fix: ~p.",[Name,Default,Fix]);
format_error({schema_error,unexpected_object,_SA,_Err}) ->
- "Schema: An unforeseen error case occured, maybee due to an unimplemented feature.";
+ "Schema: An unforeseen error case occurred, maybe due to an unimplemented feature.";
format_error({attribute_not_defined_in_schema,Name}) ->
io_lib:format("XML: The attribute ~p is not defined in the provided schema.",[Name]);
format_error({disallowed_namespace,Namespace,NS,Name}) ->
@@ -5530,9 +5530,9 @@ format_error({key_value_not_unique,KS}) ->
format_error({keyref_missed_matching_key,Refer}) ->
io_lib:format("Schema: This keyref had no matching key ~p.",[Refer]);
format_error({keyref_unexpected_object,_Other}) ->
- "Schema: An unforeseen error case occured, unknown failure cause.";
+ "Schema: An unforeseen error case occurred, unknown failure cause.";
format_error({cardinality_of_fields_not_equal,KR,K}) ->
- io_lib:format("Schema: keyref and the corresponding key must have same cardinality of their fields. Missmatch in this case keyref: ~p, key: ~p.",[KR,K]);
+ io_lib:format("Schema: keyref and the corresponding key must have same cardinality of their fields. Mismatch in this case keyref: ~p, key: ~p.",[KR,K]);
format_error({could_not_load_keyref,Name}) ->
io_lib:format("Schema: The schema didn't define a keyref with the name ~p.",[Name]);
format_error({reference_undeclared,Kind,Ref}) ->
@@ -5542,7 +5542,7 @@ format_error({cyclic_substitutionGroup,SGs}) ->
format_error({substitutionGroup_error,Head,SG}) ->
io_lib:format("Schema: Either of substitutionGroup members ~p or ~p is not defined in the provided schema.",[Head,SG]);
format_error({cyclic_definition,CA}) ->
- io_lib:format("Schema: A forbidden cicular definition was detected ~p.",[CA]);
+ io_lib:format("Schema: A forbidden circular definition was detected ~p.",[CA]);
format_error({type_of_element_not_derived,MemT,HeadT}) ->
io_lib:format("Schema: Type in substitutionGroup members should be simpleType or complexType. In this case ~p and ~p were found.",[MemT, HeadT]);
format_error({derivation_blocked,BlockTag,Derivation}) ->
diff --git a/lib/xmerl/src/xmerl_xsd_type.erl b/lib/xmerl/src/xmerl_xsd_type.erl
index 8b73c3af3b..af4ede8ba4 100644
--- a/lib/xmerl/src/xmerl_xsd_type.erl
+++ b/lib/xmerl/src/xmerl_xsd_type.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -1499,7 +1499,7 @@ get_digit([],_,[],_Str) ->
get_digit([],_,_,Str) ->
{"0",Str};
get_digit(_,_,_,Str) ->
- %% this matches both the case when reaching another delimeter and
+ %% this matches both the case when reaching another delimiter and
%% when the string already are emptied.
{"0",Str}.
diff --git a/lib/xmerl/test/Makefile b/lib/xmerl/test/Makefile
index b90ca772af..49091a9a54 100644
--- a/lib/xmerl/test/Makefile
+++ b/lib/xmerl/test/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2004-2021. All Rights Reserved.
+# Copyright Ericsson AB 2004-2022. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -92,7 +92,7 @@ ERL_COMPILE_FLAGS +=
# Targets
# ----------------------------------------------------
-tests debug opt: xmerl_test.erl
+tests $(TYPES): xmerl_test.erl
info:
@echo "HRL_FILES: $(HRL_FILES)"
diff --git a/lib/xmerl/test/xmerl_SUITE.erl b/lib/xmerl/test/xmerl_SUITE.erl
index bc133558d6..360c675d26 100644
--- a/lib/xmerl/test/xmerl_SUITE.erl
+++ b/lib/xmerl/test/xmerl_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2020. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -445,7 +445,7 @@ generate_heading_col(N) ->
%% ticket_5998
%%
%% A Kleene Closure child in a sequence consumed all following
-%% childs. This problem has been fixed.
+%% child's. This problem has been fixed.
%%
ticket_5998(Config) ->
DataDir = datadir(Config),
@@ -477,7 +477,7 @@ ticket_5998(Config) ->
%% ticket_7211
%%
%% A Kleene Closure child in a sequence consumed all following
-%% childs. This problem has been fixed.
+%% child's. This problem has been fixed.
%%
ticket_7211(Config) ->
DataDir = datadir(Config),
@@ -507,7 +507,7 @@ ticket_7211(Config) ->
%% ticket_7214
%%
%% Now validating xhtml1-transitional.dtd.
-%% A certain contentspec with a succeding choice, that didn't match
+%% A certain contentspec with a succeeding choice, that didn't match
%% all content, followed by other child elements caused a
%% failure. This is now corrected.
%%
@@ -607,7 +607,7 @@ ticket_9457_cont(Continue, Exception, GlobalState) ->
end.
-%% Test that comments are handled correct whith
+%% Test that comments are handled correct with
ticket_9664_schema(Config) ->
{E, _} = xmerl_scan:file(datadir_join(Config,[misc,"ticket_9664_schema.xml"]),[]),
{ok, S} = xmerl_xsd:process_schema(datadir_join(Config,[misc,"motorcycles.xsd"])),
@@ -620,7 +620,7 @@ ticket_9664_schema(Config) ->
{validation, schema}]),
ok.
-%% Test that comments are handled correct whith
+%% Test that comments are handled correct with
ticket_9664_dtd(Config) ->
{E, _} = xmerl_scan:file(datadir_join(Config,[misc,"ticket_9664_dtd.xml"]),[]),
{E, _} = xmerl_scan:file(datadir_join(Config,[misc,"ticket_9664_dtd.xml"]),[{validation, true}]),
diff --git a/lib/xmerl/test/xmerl_sax_std_SUITE.erl b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
index c1e78887c6..54fee16317 100644
--- a/lib/xmerl/test/xmerl_sax_std_SUITE.erl
+++ b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
@@ -1,7 +1,7 @@
%%----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2021. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -3183,7 +3183,7 @@ end_per_testcase(_Func,_Config) ->
%% Sections: 3.1 [40]
%% Output: valid/sa/out/011.xml
%% Description:
-%% Test demonstrates mutliple Attibutes within the Start-tag.
+%% Test demonstrates multiple Attributes within the Start-tag.
'valid-sa-011'(Config) ->
file:set_cwd(datadir(Config)),
Path = filename:join([datadir(Config),"xmltest","valid/sa/011.xml"]),
@@ -3343,7 +3343,7 @@ end_per_testcase(_Func,_Config) ->
%% Output: valid/sa/out/020.xml
%% Description:
%% Test demonstractes that CDATA sections are valid element content and that
-%% everyting between the CDStart and CDEnd is recognized as character data not
+%% everything between the CDStart and CDEnd is recognized as character data not
%% markup.
'valid-sa-020'(Config) ->
file:set_cwd(datadir(Config)),
@@ -3486,7 +3486,7 @@ end_per_testcase(_Func,_Config) ->
%% Sections: 2.8 [24]
%% Output: valid/sa/out/028.xml
%% Description:
-%% Test demonstrates a valid prolog that uses double quotes as delimeters
+%% Test demonstrates a valid prolog that uses double quotes as delimiters
%% around the VersionNum.
'valid-sa-028'(Config) ->
file:set_cwd(datadir(Config)),
@@ -3504,7 +3504,7 @@ end_per_testcase(_Func,_Config) ->
%% Sections: 2.8 [24]
%% Output: valid/sa/out/029.xml
%% Description:
-%% Test demonstrates a valid prolog that uses single quotes as delimters
+%% Test demonstrates a valid prolog that uses single quotes as delimiter
%% around the VersionNum.
'valid-sa-029'(Config) ->
file:set_cwd(datadir(Config)),
@@ -4675,7 +4675,7 @@ end_per_testcase(_Func,_Config) ->
%% Sections: 2.3 2.10
%% Output: valid/sa/out/092.xml
%% Description:
-%% Test demostrates that extra whitespace is normalized into a single space
+%% Test demonstrates that extra whitespace is normalized into a single space
%% character.
'valid-sa-092'(Config) ->
file:set_cwd(datadir(Config)),
@@ -5450,7 +5450,7 @@ end_per_testcase(_Func,_Config) ->
%% Entities: both
%% Output: valid/not-sa/out/015.xml
%% Description:
-%% Test demonstrates the use of the conditonal section IGNORE the will ignore
+%% Test demonstrates the use of the conditional section IGNORE the will ignore
%% its content from being part of the DTD. The keyword is a parameter-entity
%% reference.
'valid-not-sa-015'(Config) ->
@@ -5697,7 +5697,7 @@ end_per_testcase(_Func,_Config) ->
%% Entities: both
%% Output: valid/not-sa/out/029.xml
%% Description:
-%% Test demonstrates the use of the conditonal section IGNORE the will ignore
+%% Test demonstrates the use of the conditional section IGNORE the will ignore
%% its content from being used.
'valid-not-sa-029'(Config) ->
file:set_cwd(datadir(Config)),
@@ -5716,7 +5716,7 @@ end_per_testcase(_Func,_Config) ->
%% Entities: both
%% Output: valid/not-sa/out/030.xml
%% Description:
-%% Test demonstrates the use of the conditonal section IGNORE the will ignore
+%% Test demonstrates the use of the conditional section IGNORE the will ignore
%% its content from being used.
'valid-not-sa-030'(Config) ->
file:set_cwd(datadir(Config)),
@@ -7446,7 +7446,7 @@ optional21(Config) ->
%% Description:
%% Tests the Element Valid VC (clause 2) for one instance of "children"
%% content model, providing no children where one or more are required (an
-%% eigth construction of that model).
+%% eighth construction of that model).
optional22(Config) ->
file:set_cwd(datadir(Config)),
Path = filename:join([datadir(Config),"sun","invalid/optional22.xml"]),
@@ -8910,7 +8910,7 @@ uri01(Config) ->
%% Entities: parameter
%% Description:
%% Valid doctypedecl with EXternalID as Enternal Entity. The external entity
-%% contains a parameter entity reference and condtional sections.
+%% contains a parameter entity reference and conditional sections.
'o-p31pass2'(Config) ->
file:set_cwd(datadir(Config)),
Path = filename:join([datadir(Config),"oasis","p31pass2.xml"]),
@@ -9812,7 +9812,7 @@ uri01(Config) ->
%% Type: invalid
%% Sections: 2.9 [32]
%% Description:
-%% Double quotes can be used as delimeters for the value of a Standalone
+%% Double quotes can be used as delimiters for the value of a Standalone
%% Document Declaration.
'o-p32pass1'(Config) ->
file:set_cwd(datadir(Config)),
@@ -9827,7 +9827,7 @@ uri01(Config) ->
%% Type: invalid
%% Sections: 2.9 [32]
%% Description:
-%% Single quotes can be used as delimeters for the value of a Standalone
+%% Single quotes can be used as delimiters for the value of a Standalone
%% Document Declaration.
'o-p32pass2'(Config) ->
file:set_cwd(datadir(Config)),
@@ -12578,7 +12578,7 @@ uri01(Config) ->
%% Type: not-wf
%% Sections: 3.3 [53]
%% Description:
-%% name is requried
+%% name is required
'o-p53fail5'(Config) ->
file:set_cwd(datadir(Config)),
Path = filename:join([datadir(Config),"oasis","p53fail5.xml"]),
@@ -12662,7 +12662,7 @@ uri01(Config) ->
%% Type: not-wf
%% Sections: 3.3.1 [56]
%% Description:
-%% no ENTITYS type - types must be upper case
+%% no ENTITIES type - types must be upper case
'o-p56fail4'(Config) ->
file:set_cwd(datadir(Config)),
Path = filename:join([datadir(Config),"oasis","p56fail4.xml"]),
@@ -27736,7 +27736,7 @@ uri01(Config) ->
%% Sections: 3.3.1
%% Output: valid/P58/out/ibm58v01.xml
%% Description:
-%% Tests NotationType for P58. It shows different patterns fro the NOTATION
+%% Tests NotationType for P58. It shows different patterns from the NOTATION
%% attribute "attr".
'ibm-valid-P58-ibm58v01'(Config) ->
file:set_cwd(datadir(Config)),